By Valentina Valle Velasco

20 de Abril, 2020

Este es un cuaderno de R Markdown que permitirá explorar estadíticas agricolas en el departamento del Magdalena, Colombia.

• Funcionalidades de GIS

Es necesario explorar estadísticas no espaciales para entender qué está pasando en los territorios. Hay varias bibliotecas en R, principalmente dplyr and tidyverse, que sirve para explorar y resumir estadísticas.
Para hacer ciertas investigaciones debemos crear uniones de información no espacial con información espacial, proceso que hicimos en QGIS anteriormente, pero en esta ocasión lo haremos en R.
Empezemos removiendo el contenido de la memoria con:

rm(list=ls())

Ahora, instalaremos las bibliotecas que necesitamos, usando el siguiente código, pero este nos permitirá instalar solo las bibliotecas que no estén instaladas.

list.of.packages <- c("here", "tidyverse", "rgeos", "maptools", "raster", "sf", "viridis", "rnaturalearth", "GSODR", "ggrepel", "cowplot")   
new.packages <- list.of.packages[!(list.of.packages %in% installed.packages()[,"Package"])]                
if(length(new.packages)) install.packages(new.packages)

Ahora, a cargar las bibliotecas:

library(here)
library(tidyverse)
library(rgeos)
library(maptools)
library(raster)
library(sf)
library(viridis)
library(rnaturalearth)                            
library(GSODR)                                    
library(ggrepel)                                  
library(cowplot)                 

• Explorando estadísticas agrícolas en Magdalena

Teniendo el documento de Estadísticas Municipales Agropecuarias listo, procedemos a leer el archivo csv con “Estadísticas Municipales Agropecuarias” para Magdalena.

datos <- read_csv2("C:/Users/vale_/Desktop/UNAL/6to semestre/GB/EVA_Magdalena.csv")
Using ',' as decimal and '.' as grouping mark. Use read_delim() for more control.
Parsed with column specification:
cols(
  COD_DEP = col_double(),
  DEPARTAMENTO = col_character(),
  COD_MUN = col_double(),
  MUNICIPIO = col_character(),
  GRUPO = col_character(),
  SUBGRUPO = col_character(),
  CULTIVO = col_character(),
  YEAR = col_double(),
  Area_Siembra = col_double(),
  Area_Cosecha = col_double(),
  Produccion = col_double(),
  Rendimiento = col_double(),
  ESTADO = col_character(),
  CICLO = col_character()
)

Vamos a revisar cuales son los atributos de datos

head(datos)
tail(datos)

Ahora, usaremosla biblioteca dplyr para explorar los contenidos de los objetos de datos.
Pero primero, vamos a hacer un resumen del rendimiento por grupo y municipio:

datos %>%                             
   group_by(MUNICIPIO, GRUPO) %>%     
   summarise(rend_prom = mean(Rendimiento, na.rm = TRUE)) -> rend_resumen

Ahora veremos solo los seis primeros registros:

head(rend_resumen)

También podemos calcular el rendimiento promedio por grupo en los municipios de Magdalena:

datos %>%                             
  group_by(GRUPO) %>%                 
  summarise(rend_dep = mean(Rendimiento, na.rm = TRUE)) -> rend_magdalena
rend_magdalena

Los más altos rendimientos corresponden a FRUTALES, FIBRAS Y OLEAGINOSAS.
Entonces, vamos a encontrar cuales son los municipios con mayor rendimiento para cada grupo de cultivos en 2018:

datos %>%                             
  filter(YEAR==2018) %>%
  group_by(GRUPO, MUNICIPIO) %>%      
  summarize(max_rend = max(Rendimiento, na.rm = TRUE)) %>%                    
  slice(which.max(max_rend)) -> rend_max_18
rend_max_18

Ahora, vamos a encontrar cuales son los municipios con el área cosechada más grande para cada grupo de cultivos en 2018:

datos %>%                             
  filter(YEAR==2018) %>%              
  group_by(GRUPO, MUNICIPIO) %>%
  summarize(max_area_cosecha = max(Area_Cosecha, na.rm = TRUE)) %>%   
  slice(which.max(max_area_cosecha)) -> area_cosecha_max
area_cosecha_max

Notamos que el área cosechada más grande en 2018 corresponde a OLEAGINOSAS en la ZONA BANANERA.

Vamos a seleccionar la producción de palma de aceite (Tons) en la Zona Bananera por cada año:

datos %>%                             
  filter(MUNICIPIO=="ZONA BANANERA" & SUBGRUPO=="PALMA DE ACEITE") %>%      
  group_by(YEAR, CULTIVO) -> zona_bananera_palma_de_aceite
zona_bananera_palma_de_aceite

Ahora, haremos un gráfico básico:

g <- ggplot(aes(x=YEAR, y=Produccion/1000), data = zona_bananera_palma_de_aceite) + geom_bar(stat='identity') + labs(y='Produccion de Palma de Aceite [Ton x 1000]', x='Year')
g + ggtitle("Evolución de la Produccion de la Palma de Aceite en la Zona Bananera desde 2007 hasta 2018") + labs(caption= "Basado en EMA data (DANE, 2018)")

Ahora haremos otro gráfico que corresponda al segundo municipio con área sembrada más grande en 2018, que es Ciénaga con el grupo de Otros Permanentes. Y seleccionaremos el cultivo de Cacao, observando la evolución de la producción en cada año.

datos %>%                             
  filter(MUNICIPIO=="CIENAGA" & SUBGRUPO=="CACAO") %>%      
  group_by(YEAR, CULTIVO) -> cienaga_cacao
cienaga_cacao
gcc <- ggplot(aes(x=YEAR, y=Produccion/1000), data = cienaga_cacao) + geom_bar(stat='identity') + labs(y='Produccion de Cacao [Ton x 1000]', x='Year')                                                           
gcc + ggtitle("Evolución de la Produccion del Cacao en Cienaga desde 2007 hasta 2018") + labs(caption= "Basado en EMA data (DANE, 2018)")

Ahora investigaremos cuales cultivos tuvieron la mayor superficie cosechada en 2018:

datos %>%                                filter(YEAR==2018) %>%             
  group_by(GRUPO) %>%                 
  summarize(sum_area_cosecha = sum(Area_Cosecha, na.rm = TRUE)) %>%   
  arrange(desc(sum_area_cosecha)) -> total_area_cosecha

datos %>%
group_by(MUNICIPIO, GRUPO) %>%
summarise(rend_prom = mean(Produccion, na.rm = TRUE))
arrange(desc(rend_prom)) -> rend_res

total_area_cosecha

Podemos observar que OLEAGINOSAS tuvo la mayor parte del área cosechada en 2018 en Magdalena. Podemos encontrar en la información del DANE con un código cuál cultivo pertenece a este grupo

datos %>%                             
  filter(GRUPO=="OLEAGINOSAS" & YEAR==2018) %>%  
  group_by(CULTIVO) %>%               
  summarize(sum_cosecha = sum(Area_Cosecha, na.rm = TRUE)) %>%  
  arrange(desc(sum_cosecha)) -> total_cosecha
total_cosecha

¡Así es como nos damos cuenta que la Palma de Aceite es la llave en la agricultura magdalenense!

Y como podremos observar en las páginas 16 y 34 del boletín 9 del Censo Nacional Agropecuario(2014), la palma aceitera y el banano de exportación son los cultivos que tienen la mayor parte del área agrícola sembrada en el departamento del Magdalena.

Ahora podemos encontrar cuales son los municipios con la mayor área sembrada for cada cultivo permanente en 2018:

datos %>%                                        
  filter(YEAR==2018 & GRUPO=="OLEAGINOSAS") %>% 
  group_by(CULTIVO, MUNICIPIO) %>%    
  summarize(max_area2 = max(Area_Cosecha, na.rm = TRUE)) %>%  
  slice(which.max(max_area2)) -> area_cosecha2
area_cosecha2

Ahora regresemos a la información de cultivos permanentes. Antes de graficar, necesitaremos añadir, para el objeto total_area_cosecha, un nuevo archivo con abreviaturas para cada grupo de cultivos. De otra manera, la gráfica se echará a perder.

total_area_cosecha$CROP <- abbreviate(total_area_cosecha$GRUPO, 3)

Ahora sí, a graficar:

gg <- ggplot(aes(x=CROP, y=sum_area_cosecha), data = total_area_cosecha) + geom_bar(stat='identity') + labs(y='Total de Area Sembrada [Ha]', x='Cultivo') 
gg+ ggtitle("Total de area sembrada por grupo de cultivos en 2018 para Magdalena") + theme(plot.title = element_text(hjust = 0.5)) + labs(caption= "Basado en EMA data (DANE, 2018)")

• Unión de estadísticas agrícolas para los municipios

Comencemos leyendo la información usando la biblioteca sf:

mag_munic <- sf::st_read("C:/Users/vale_/Desktop/UNAL/6to semestre/GB/ADMINISTRATIVO/MGN_MPIO_POLITICO.shp")
Reading layer `MGN_MPIO_POLITICO' from data source `C:\Users\vale_\Desktop\UNAL\6to semestre\GB\ADMINISTRATIVO\MGN_MPIO_POLITICO.shp' using driver `ESRI Shapefile'
Simple feature collection with 30 features and 9 fields
geometry type:  POLYGON
dimension:      XY
bbox:           xmin: -74.9466 ymin: 8.936489 xmax: -73.54184 ymax: 11.34891
CRS:            4326

¿Qué es mag_munic?

mag_munic
Simple feature collection with 30 features and 9 fields
geometry type:  POLYGON
dimension:      XY
bbox:           xmin: -74.9466 ymin: 8.936489 xmax: -73.54184 ymax: 11.34891
CRS:            4326
First 10 features:
   DPTO_CCDGO MPIO_CCDGO           MPIO_CNMBR                                    MPIO_CRSLC MPIO_NAREA MPIO_NANO
1          47      47541              PEDRAZA Decreto dptal 1322 del 19 dediciembre de 1908   325.4799      2017
2          47      47030            ALGARROBO             Ordenanza 008 de Junio 24 de 1999   406.3884      2017
3          47      47058             ARIGUANÍ      Ordenanza 14 Bis de Noviembre 30 de 1966  1131.7442      2017
4          47      47161 CERRO DE SAN ANTONIO                        Ordenanza 3038 de 1912   177.1961      2017
5          47      47170              CHIVOLO                Decreto 107 de Marzo 8 de 1974   536.5437      2017
6          47      47205            CONCORDIA         Ordenanza 007 del 24 de Junio de 1999   109.4837      2017
7          47      47245             EL BANCO                              Ley 0182 de 1871   814.8540      2017
8          47      47258             EL PIÑÓN         Ordenanza 032 del 20 de Abril de 1815   557.1424      2017
9          47      47268             EL RETÉN                        ORD 04 DE MAYO DE 1996   262.1768      2017
10         47      47318               GUAMAL           Ordenanza 15 del 2 de Julio de 1904   564.5155      2017
   DPTO_CNMBR Shape_Leng  Shape_Area                       geometry
1   MAGDALENA  0.9740441 0.026847311 POLYGON ((-74.8832 10.21502...
2   MAGDALENA  1.2656800 0.033536941 POLYGON ((-74.10861 10.3915...
3   MAGDALENA  1.9928810 0.093278409 POLYGON ((-74.03381 9.99541...
4   MAGDALENA  0.7003465 0.014622408 POLYGON ((-74.85084 10.367,...
5   MAGDALENA  1.3263733 0.044254449 POLYGON ((-74.49589 10.2315...
6   MAGDALENA  0.5443263 0.009033178 POLYGON ((-74.81188 10.2748...
7   MAGDALENA  1.6768118 0.067024891 POLYGON ((-73.98838 9.33807...
8   MAGDALENA  1.1771096 0.045985558 POLYGON ((-74.67476 10.4604...
9   MAGDALENA  0.9640310 0.021663152 POLYGON ((-74.36417 10.7661...
10  MAGDALENA  1.1812342 0.046447658 POLYGON ((-74.05467 9.40305...

Como el código que aparece en MPIO_CCDGO no es el mismo que el que aparece en COD_MUN, debemos cambiar alguno de los dos para que se pueda realizar la unión.
Vamos a verificar el estado del último:

datos %>% filter (MUNICIPIO =="SANTA MARTA") -> smr_datos
smr_datos
class(smr_datos$COD_MUN)
[1] "numeric"

Para hacer la unión, necesitamos cambiar ambos, data type y contents para el código que identifica cada municipio. Para esto, sera necesario crear una copia de la información estadística original. Con esto, no se podrá dañar la información original, en caso de cometer una equivocación.
Vamos a hacerlo cuidadosamente:

datos2 <- datos
datos2$TEMP <- as.character(datos2$COD_MUN)
datos2$MPIO_CCDGO <- as.factor(datos2$TEMP)
head(datos2)

Hay que asegurarse de verificar, en el objeto datos2, las características del nuevo atributo MPIO_CCDGO.
Ahora, vamos a filtrar un solo año y seleccionar solo dos atributos relevantes:

datos2 %>% filter(CULTIVO == "PALMA DE ACEITE") -> datos3
head(datos3)
class(datos3)
[1] "spec_tbl_df" "tbl_df"      "tbl"         "data.frame" 
datos4 <- datos3 %>% dplyr::select(MUNICIPIO, MPIO_CCDGO, YEAR, Produccion, Rendimiento)
datos4
datos4 %>%                            
  gather("YEAR", "Produccion", "Rendimiento" , key = variable, value = number)
head(datos4)

Esta es una tarea clave. Se compone de varios pasos para poder convertir la tabla de atributos desde un formato largo a un formato ancho.

datos4 %>%                            
  group_by(MPIO_CCDGO) %>%            
  mutate(Visit = 1:n()) %>%           
  gather("YEAR", "Produccion", "Rendimiento", key = variable, value = number) %>%                 
  unite(combi, variable, Visit) %>%   
  spread(combi, number) -> datos5
head(datos5)
tail(datos5)

También haremos una copia de la colección de características simples, para asegurarnos de que no se dañen los datos:

mag_munic2 <- mag_munic

Ahora, es hora de unir:

mag_munic_stat = left_join(mag_munic2, datos5, by="MPIO_CCDGO")
summary(mag_munic_stat)
 DPTO_CCDGO   MPIO_CCDGO                MPIO_CNMBR                          MPIO_CRSLC   MPIO_NAREA    
 47:30      47001  : 1   ALGARROBO           : 1   1525                          : 1   Min.   : 109.5  
            47030  : 1   ARACATACA           : 1   1814                          : 1   1st Qu.: 414.2  
            47053  : 1   ARIGUANÍ            : 1   1848                          : 1   Median : 579.7  
            47058  : 1   CERRO DE SAN ANTONIO: 1   1865                          : 1   Mean   : 771.2  
            47161  : 1   CHIVOLO             : 1   1909                          : 1   3rd Qu.:1083.3  
            47170  : 1   CIÉNAGA             : 1   Decreto 107 de Marzo 8 de 1974: 1   Max.   :2347.1  
            (Other):24   (Other)             :24   (Other)                       :24                   
   MPIO_NANO        DPTO_CNMBR   Shape_Leng       Shape_Area        MUNICIPIO          Produccion_1   Produccion_10  
 Min.   :2017   MAGDALENA:30   Min.   :0.5443   Min.   :0.009033   Length:30          Min.   :    0   Min.   :  590  
 1st Qu.:2017                  1st Qu.:1.1781   1st Qu.:0.034158   Class :character   1st Qu.:  266   1st Qu.: 2308  
 Median :2017                  Median :1.3443   Median :0.047801   Mode  :character   Median : 2135   Median : 7790  
 Mean   :2017                  Mean   :1.6537   Mean   :0.063642                      Mean   : 7432   Mean   :10339  
 3rd Qu.:2017                  3rd Qu.:2.3534   3rd Qu.:0.089264                      3rd Qu.:11646   3rd Qu.:14094  
 Max.   :2017                  Max.   :3.1974   Max.   :0.194233                      Max.   :34755   Max.   :34906  
                                                                                      NA's   :16      NA's   :18     
 Produccion_11   Produccion_12    Produccion_2      Produccion_3    Produccion_4    Produccion_5    Produccion_6  
 Min.   :  648   Min.   : 1120   Min.   :    0.0   Min.   :    0   Min.   :  210   Min.   :  245   Min.   :  255  
 1st Qu.: 2347   1st Qu.: 3025   1st Qu.:  292.5   1st Qu.: 1050   1st Qu.: 2398   1st Qu.: 2468   1st Qu.: 2496  
 Median : 8363   Median :10317   Median : 2397.5   Median : 2800   Median : 6650   Median : 6850   Median : 6970  
 Mean   :11105   Mean   :12436   Mean   : 7704.7   Mean   : 8664   Mean   :10225   Mean   :10168   Mean   :10486  
 3rd Qu.:16935   3rd Qu.:19276   3rd Qu.:11847.5   3rd Qu.:12600   3rd Qu.:14553   3rd Qu.:14250   3rd Qu.:14714  
 Max.   :36672   Max.   :36672   Max.   :34860.0   Max.   :34860   Max.   :34860   Max.   :35000   Max.   :35560  
 NA's   :18      NA's   :19      NA's   :16        NA's   :17      NA's   :18      NA's   :18      NA's   :18     
  Produccion_7    Produccion_8    Produccion_9   Rendimiento_1   Rendimiento_10   Rendimiento_11   Rendimiento_12  
 Min.   :  316   Min.   :  333   Min.   :  499   Min.   : 32.0   Min.   : 31.00   Min.   : 31.00   Min.   : 31.00  
 1st Qu.: 2526   1st Qu.: 2555   1st Qu.: 2304   1st Qu.: 35.0   1st Qu.: 31.75   1st Qu.: 32.00   1st Qu.: 32.00  
 Median : 7310   Median : 7820   Median : 8736   Median : 35.0   Median :312.00   Median : 32.00   Median : 32.00  
 Mean   :10860   Mean   :11252   Mean   :10996   Mean   :172.1   Mean   :216.33   Mean   : 84.92   Mean   : 95.82  
 3rd Qu.:15309   3rd Qu.:17550   3rd Qu.:18049   3rd Qu.:337.5   3rd Qu.:312.00   3rd Qu.: 32.50   3rd Qu.: 32.00  
 Max.   :36960   Max.   :37604   Max.   :34596   Max.   :352.0   Max.   :347.00   Max.   :381.00   Max.   :384.00  
 NA's   :18      NA's   :18      NA's   :18      NA's   :19      NA's   :18       NA's   :18       NA's   :19      
 Rendimiento_2    Rendimiento_3 Rendimiento_4 Rendimiento_5    Rendimiento_6   Rendimiento_7   Rendimiento_8
 Min.   :  3.00   Min.   : 34   Min.   :35    Min.   : 34.00   Min.   :34.00   Min.   :34.00   Min.   :32   
 1st Qu.: 34.75   1st Qu.: 35   1st Qu.:35    1st Qu.: 34.75   1st Qu.:34.00   1st Qu.:34.00   1st Qu.:34   
 Median : 35.00   Median : 35   Median :35    Median : 35.00   Median :34.00   Median :34.00   Median :34   
 Mean   :113.58   Mean   : 88   Mean   :35    Mean   :112.50   Mean   :34.42   Mean   :34.42   Mean   :34   
 3rd Qu.:109.50   3rd Qu.: 35   3rd Qu.:35    3rd Qu.:109.50   3rd Qu.:35.00   3rd Qu.:35.00   3rd Qu.:35   
 Max.   :381.00   Max.   :355   Max.   :35    Max.   :354.00   Max.   :35.00   Max.   :35.00   Max.   :35   
 NA's   :18       NA's   :18    NA's   :18    NA's   :18       NA's   :18      NA's   :18      NA's   :18   
 Rendimiento_9        YEAR_1        YEAR_10        YEAR_11        YEAR_12         YEAR_2         YEAR_3    
 Min.   : 31.00   Min.   :2007   Min.   :2016   Min.   :2017   Min.   :2018   Min.   :2008   Min.   :2009  
 1st Qu.: 31.75   1st Qu.:2007   1st Qu.:2016   1st Qu.:2017   1st Qu.:2018   1st Qu.:2008   1st Qu.:2009  
 Median : 32.50   Median :2007   Median :2016   Median :2017   Median :2018   Median :2008   Median :2009  
 Mean   : 82.08   Mean   :2008   Mean   :2016   Mean   :2017   Mean   :2018   Mean   :2009   Mean   :2009  
 3rd Qu.: 34.25   3rd Qu.:2007   3rd Qu.:2016   3rd Qu.:2017   3rd Qu.:2018   3rd Qu.:2008   3rd Qu.:2009  
 Max.   :349.00   Max.   :2017   Max.   :2017   Max.   :2018   Max.   :2018   Max.   :2018   Max.   :2011  
 NA's   :18       NA's   :16     NA's   :18     NA's   :18     NA's   :19     NA's   :16     NA's   :17    
     YEAR_4         YEAR_5         YEAR_6         YEAR_7         YEAR_8         YEAR_9              geometry 
 Min.   :2010   Min.   :2011   Min.   :2012   Min.   :2013   Min.   :2014   Min.   :2015   POLYGON      :30  
 1st Qu.:2010   1st Qu.:2011   1st Qu.:2012   1st Qu.:2013   1st Qu.:2014   1st Qu.:2015   epsg:4326    : 0  
 Median :2010   Median :2011   Median :2012   Median :2013   Median :2014   Median :2015   +proj=long...: 0  
 Mean   :2010   Mean   :2011   Mean   :2012   Mean   :2013   Mean   :2014   Mean   :2015                     
 3rd Qu.:2010   3rd Qu.:2011   3rd Qu.:2012   3rd Qu.:2013   3rd Qu.:2014   3rd Qu.:2015                     
 Max.   :2010   Max.   :2011   Max.   :2012   Max.   :2013   Max.   :2015   Max.   :2016                     
 NA's   :18     NA's   :18     NA's   :18     NA's   :18     NA's   :18     NA's   :18                       

• ¡A Graficar!

#install.packages("RColorBrewer")                 
library(RColorBrewer)                             
library(leaflet)

Vamos a graficar los municipios con su correspondiente produccion de Palma de aceite por un solo año:

bins <- c(0, 1100, 6200, 11400, 16500, 21600, 26700, 31900, 37000)                                            
pal <- colorBin("YlOrRd", domain = mag_munic_stat$Produccion_12, bins = bins)       


mapa <- leaflet(data = mag_munic_stat) %>%                             
addTiles() %>%                         
  addPolygons(label = ~Produccion_12,                popup = ~MPIO_CNMBR,                   fillColor = ~pal(Produccion_12),                                 color = "#444444",                     weight = 1,                            smoothFactor = 0.5,                    opacity = 1.0,                         fillOpacity = 0.5,                     highlightOptions = highlightOptions(color = "white", weight = 2, bringToFront = TRUE)                     ) %>%                    
addProviderTiles(providers$OpenStreetMap) %>%                                 
addLegend("bottomright", pal = pal, values = ~Produccion_12,                  title = "Produccion de Palma de Aceite en Magdalena [Ton] (2018)",        opacity = 1                         )
mapa
sessionInfo()
R version 3.6.3 (2020-02-29)
Platform: x86_64-w64-mingw32/x64 (64-bit)
Running under: Windows 10 x64 (build 18362)

Matrix products: default

locale:
[1] LC_COLLATE=Spanish_Colombia.1252  LC_CTYPE=Spanish_Colombia.1252    LC_MONETARY=Spanish_Colombia.1252
[4] LC_NUMERIC=C                      LC_TIME=Spanish_Colombia.1252    

attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods   base     

other attached packages:
 [1] leaflet_2.0.3       RColorBrewer_1.1-2  data.table_1.12.8   cowplot_1.0.0       ggrepel_0.8.2      
 [6] GSODR_2.0.1         rnaturalearth_0.1.0 viridis_0.5.1       viridisLite_0.3.0   sf_0.9-0           
[11] raster_3.0-12       maptools_0.9-9      rgeos_0.5-2         sp_1.4-1            forcats_0.5.0      
[16] stringr_1.4.0       dplyr_0.8.5         purrr_0.3.3         readr_1.3.1         tidyr_1.0.2        
[21] tibble_2.1.3        ggplot2_3.3.0       tidyverse_1.3.0     here_0.1           

loaded via a namespace (and not attached):
 [1] nlme_3.1-144            fs_1.3.2                lubridate_1.7.4         httr_1.4.1             
 [5] rprojroot_1.3-2         tools_3.6.3             backports_1.1.5         utf8_1.1.4             
 [9] R6_2.4.1                KernSmooth_2.23-16      DBI_1.1.0               colorspace_1.4-1       
[13] withr_2.1.2             tidyselect_1.0.0        gridExtra_2.3           compiler_3.6.3         
[17] cli_2.0.2               rvest_0.3.5             xml2_1.2.5              labeling_0.3           
[21] scales_1.1.0            classInt_0.4-2          digest_0.6.25           foreign_0.8-75         
[25] rmarkdown_2.1           base64enc_0.1-3         pkgconfig_2.0.3         htmltools_0.4.0        
[29] fastmap_1.0.1           dbplyr_1.4.2            htmlwidgets_1.5.1       rlang_0.4.5            
[33] readxl_1.3.1            rstudioapi_0.11         shiny_1.4.0             generics_0.0.2         
[37] farver_2.0.3            jsonlite_1.6.1          crosstalk_1.0.0         magrittr_1.5           
[41] Rcpp_1.0.3              munsell_0.5.0           fansi_0.4.1             lifecycle_0.2.0        
[45] stringi_1.4.6           yaml_2.2.1              grid_3.6.3              parallel_3.6.3         
[49] promises_1.1.0          crayon_1.3.4            lattice_0.20-38         haven_2.2.0            
[53] hms_0.5.3               knitr_1.28              pillar_1.4.3            codetools_0.2-16       
[57] reprex_0.3.0            glue_1.3.1              evaluate_0.14           leaflet.providers_1.9.0
[61] modelr_0.1.6            vctrs_0.2.4             httpuv_1.5.2            cellranger_1.1.0       
[65] gtable_0.3.0            assertthat_0.2.1        xfun_0.12               mime_0.9               
[69] xtable_1.8-4            broom_0.5.5             e1071_1.7-3             later_1.0.0            
[73] rsconnect_0.8.16        class_7.3-15            units_0.6-6             ellipsis_0.3.0         
LS0tDQp0aXRsZTogIkVzdGFkaXN0aWNhcyBtdW5pY2lwYWxlcyBkZSBsYSBhZ3JpY3VsdHVyYSBlbiBNYWdkYWxlbmEiDQpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sNCi0tLQ0KDQojIyMjIEJ5IFZhbGVudGluYSBWYWxsZSBWZWxhc2NvICAgICAgICANCjIwIGRlIEFicmlsLCAyMDIwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCg0KRXN0ZSBlcyB1biBjdWFkZXJubyBkZSBbUiBNYXJrZG93bl0oaHR0cDovL3JtYXJrZG93bi5yc3R1ZGlvLmNvbSkgcXVlIHBlcm1pdGlyw6EgZXhwbG9yYXIgZXN0YWTDrXRpY2FzIGFncmljb2xhcyBlbiBlbCBkZXBhcnRhbWVudG8gZGVsIE1hZ2RhbGVuYSwgQ29sb21iaWEuICANCg0KIyMg4oCiIEZ1bmNpb25hbGlkYWRlcyBkZSBHSVMNCg0KRXMgbmVjZXNhcmlvIGV4cGxvcmFyIGVzdGFkw61zdGljYXMgbm8gZXNwYWNpYWxlcyBwYXJhIGVudGVuZGVyIHF1w6kgZXN0w6EgcGFzYW5kbyBlbiBsb3MgdGVycml0b3Jpb3MuIA0KSGF5IHZhcmlhcyBiaWJsaW90ZWNhcyBlbiBSLCBwcmluY2lwYWxtZW50ZSBfZHBseXJfIGFuZCBfdGlkeXZlcnNlXywgcXVlIHNpcnZlIHBhcmEgZXhwbG9yYXIgeSByZXN1bWlyIGVzdGFkw61zdGljYXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQpQYXJhIGhhY2VyIGNpZXJ0YXMgaW52ZXN0aWdhY2lvbmVzIGRlYmVtb3MgY3JlYXIgdW5pb25lcyBkZSBpbmZvcm1hY2nDs24gbm8gZXNwYWNpYWwgY29uIGluZm9ybWFjacOzbiBlc3BhY2lhbCwgcHJvY2VzbyBxdWUgaGljaW1vcyBlbiBRR0lTIGFudGVyaW9ybWVudGUsIHBlcm8gZW4gZXN0YSBvY2FzacOzbiBsbyBoYXJlbW9zIGVuIFIuICAgICAgICAgICAgICAgDQpFbXBlemVtb3MgcmVtb3ZpZW5kbyBlbCBjb250ZW5pZG8gZGUgbGEgbWVtb3JpYSBjb246DQpgYGB7cn0NCnJtKGxpc3Q9bHMoKSkNCmBgYA0KQWhvcmEsIGluc3RhbGFyZW1vcyBsYXMgYmlibGlvdGVjYXMgcXVlIG5lY2VzaXRhbW9zLCB1c2FuZG8gZWwgc2lndWllbnRlIGPDs2RpZ28sIHBlcm8gZXN0ZSBub3MgcGVybWl0aXLDoSBpbnN0YWxhciBzb2xvIGxhcyBiaWJsaW90ZWNhcyBxdWUgbm8gZXN0w6luIGluc3RhbGFkYXMuICAgICAgICAgICAgICANCmBgYHtyfQ0KbGlzdC5vZi5wYWNrYWdlcyA8LSBjKCJoZXJlIiwgInRpZHl2ZXJzZSIsICJyZ2VvcyIsICJtYXB0b29scyIsICJyYXN0ZXIiLCAic2YiLCAidmlyaWRpcyIsICJybmF0dXJhbGVhcnRoIiwgIkdTT0RSIiwgImdncmVwZWwiLCAiY293cGxvdCIpICAgDQpuZXcucGFja2FnZXMgPC0gbGlzdC5vZi5wYWNrYWdlc1shKGxpc3Qub2YucGFja2FnZXMgJWluJSBpbnN0YWxsZWQucGFja2FnZXMoKVssIlBhY2thZ2UiXSldICAgICAgICAgICAgICAgIA0KaWYobGVuZ3RoKG5ldy5wYWNrYWdlcykpIGluc3RhbGwucGFja2FnZXMobmV3LnBhY2thZ2VzKQ0KYGBgDQpBaG9yYSwgYSBjYXJnYXIgbGFzIGJpYmxpb3RlY2FzOg0KYGBge3J9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCmxpYnJhcnkoaGVyZSkNCmBgYA0KYGBge3J9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCmxpYnJhcnkodGlkeXZlcnNlKQ0KYGBgDQpgYGB7cn0NCmxpYnJhcnkocmdlb3MpDQpgYGANCmBgYHtyfQ0KbGlicmFyeShtYXB0b29scykNCmBgYA0KYGBge3J9DQpsaWJyYXJ5KHJhc3RlcikNCmBgYA0KYGBge3J9DQpsaWJyYXJ5KHNmKQ0KYGBgDQpgYGB7cn0NCmxpYnJhcnkodmlyaWRpcykNCmBgYA0KYGBge3J9DQpsaWJyYXJ5KHJuYXR1cmFsZWFydGgpICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KbGlicmFyeShHU09EUikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCmxpYnJhcnkoZ2dyZXBlbCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQpsaWJyYXJ5KGNvd3Bsb3QpICAgICAgICAgICAgICAgICANCmBgYA0KIyMg4oCiIEV4cGxvcmFuZG8gZXN0YWTDrXN0aWNhcyBhZ3LDrWNvbGFzIGVuIE1hZ2RhbGVuYQ0KDQpUZW5pZW5kbyBlbCBkb2N1bWVudG8gZGUgRXN0YWTDrXN0aWNhcyBNdW5pY2lwYWxlcyBBZ3JvcGVjdWFyaWFzIGxpc3RvLCBwcm9jZWRlbW9zIGEgbGVlciBlbCBhcmNoaXZvIF9jc3ZfIGNvbiAiRXN0YWTDrXN0aWNhcyBNdW5pY2lwYWxlcyBBZ3JvcGVjdWFyaWFzIiBwYXJhIE1hZ2RhbGVuYS4NCmBgYHtyfQ0KZGF0b3MgPC0gcmVhZF9jc3YyKCJDOi9Vc2Vycy92YWxlXy9EZXNrdG9wL1VOQUwvNnRvIHNlbWVzdHJlL0dCL0VWQV9NYWdkYWxlbmEuY3N2IikNCmBgYA0KVmFtb3MgYSByZXZpc2FyIGN1YWxlcyBzb24gbG9zIGF0cmlidXRvcyBkZSBfZGF0b3NfDQpgYGB7cn0NCmhlYWQoZGF0b3MpDQpgYGANCmBgYHtyfQ0KdGFpbChkYXRvcykNCmBgYA0KQWhvcmEsIHVzYXJlbW9zbGEgYmlibGlvdGVjYSBfZHBseXJfIHBhcmEgZXhwbG9yYXIgbG9zIGNvbnRlbmlkb3MgZGUgbG9zIG9iamV0b3MgZGUgX2RhdG9zXy4gICAgICAgICAgICAgICAgICAgIA0KUGVybyBwcmltZXJvLCB2YW1vcyBhIGhhY2VyIHVuIHJlc3VtZW4gZGVsIF9yZW5kaW1pZW50b18gcG9yIGdydXBvIHkgbXVuaWNpcGlvOg0KYGBge3J9DQpkYXRvcyAlPiUgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KICAgZ3JvdXBfYnkoTVVOSUNJUElPLCBHUlVQTykgJT4lICAgICANCiAgIHN1bW1hcmlzZShyZW5kX3Byb20gPSBtZWFuKFJlbmRpbWllbnRvLCBuYS5ybSA9IFRSVUUpKSAtPiByZW5kX3Jlc3VtZW4NCmBgYA0KQWhvcmEgdmVyZW1vcyBzb2xvIGxvcyBzZWlzIHByaW1lcm9zIHJlZ2lzdHJvczoNCmBgYHtyfQ0KaGVhZChyZW5kX3Jlc3VtZW4pDQpgYGANClRhbWJpw6luIHBvZGVtb3MgY2FsY3VsYXIgZWwgcmVuZGltaWVudG8gcHJvbWVkaW8gcG9yIF9ncnVwb18gZW4gbG9zIG11bmljaXBpb3MgZGUgTWFnZGFsZW5hOg0KYGBge3J9DQpkYXRvcyAlPiUgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KICBncm91cF9ieShHUlVQTykgJT4lICAgICAgICAgICAgICAgICANCiAgc3VtbWFyaXNlKHJlbmRfZGVwID0gbWVhbihSZW5kaW1pZW50bywgbmEucm0gPSBUUlVFKSkgLT4gcmVuZF9tYWdkYWxlbmENCmBgYA0KYGBge3J9DQpyZW5kX21hZ2RhbGVuYQ0KYGBgDQpMb3MgbcOhcyBhbHRvcyByZW5kaW1pZW50b3MgY29ycmVzcG9uZGVuIGEgRlJVVEFMRVMsIEZJQlJBUyBZIE9MRUFHSU5PU0FTLiAgICAgICANCkVudG9uY2VzLCB2YW1vcyBhIGVuY29udHJhciBjdWFsZXMgc29uIGxvcyBtdW5pY2lwaW9zIGNvbiBtYXlvciByZW5kaW1pZW50byBwYXJhIGNhZGEgZ3J1cG8gZGUgY3VsdGl2b3MgZW4gMjAxODoNCmBgYHtyfQ0KZGF0b3MgJT4lICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCiAgZmlsdGVyKFlFQVI9PTIwMTgpICU+JQ0KICBncm91cF9ieShHUlVQTywgTVVOSUNJUElPKSAlPiUgICAgICANCiAgc3VtbWFyaXplKG1heF9yZW5kID0gbWF4KFJlbmRpbWllbnRvLCBuYS5ybSA9IFRSVUUpKSAlPiUgICAgICAgICAgICAgICAgICAgIA0KICBzbGljZSh3aGljaC5tYXgobWF4X3JlbmQpKSAtPiByZW5kX21heF8xOA0KYGBgDQpgYGB7cn0NCnJlbmRfbWF4XzE4DQpgYGANCkFob3JhLCB2YW1vcyBhIGVuY29udHJhciBjdWFsZXMgc29uIGxvcyBtdW5pY2lwaW9zIGNvbiBlbCDDoXJlYSBjb3NlY2hhZGEgbcOhcyBncmFuZGUgcGFyYSBjYWRhIGdydXBvIGRlIGN1bHRpdm9zIGVuIDIwMTg6DQpgYGB7cn0NCmRhdG9zICU+JSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQogIGZpbHRlcihZRUFSPT0yMDE4KSAlPiUgICAgICAgICAgICAgIA0KICBncm91cF9ieShHUlVQTywgTVVOSUNJUElPKSAlPiUNCiAgc3VtbWFyaXplKG1heF9hcmVhX2Nvc2VjaGEgPSBtYXgoQXJlYV9Db3NlY2hhLCBuYS5ybSA9IFRSVUUpKSAlPiUgICANCiAgc2xpY2Uod2hpY2gubWF4KG1heF9hcmVhX2Nvc2VjaGEpKSAtPiBhcmVhX2Nvc2VjaGFfbWF4DQpgYGANCmBgYHtyfQ0KYXJlYV9jb3NlY2hhX21heA0KYGBgDQpOb3RhbW9zIHF1ZSBlbCDDoXJlYSBjb3NlY2hhZGEgbcOhcyBncmFuZGUgZW4gMjAxOCBjb3JyZXNwb25kZSBhIE9MRUFHSU5PU0FTIGVuIGxhIFpPTkEgQkFOQU5FUkEuICAgDQoNClZhbW9zIGEgc2VsZWNjaW9uYXIgbGEgcHJvZHVjY2nDs24gZGUgcGFsbWEgZGUgYWNlaXRlIChUb25zKSBlbiBsYSBab25hIEJhbmFuZXJhIHBvciBjYWRhIGHDsW86DQpgYGB7cn0NCmRhdG9zICU+JSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQogIGZpbHRlcihNVU5JQ0lQSU89PSJaT05BIEJBTkFORVJBIiAmIFNVQkdSVVBPPT0iUEFMTUEgREUgQUNFSVRFIikgJT4lICAgICAgDQogIGdyb3VwX2J5KFlFQVIsIENVTFRJVk8pIC0+IHpvbmFfYmFuYW5lcmFfcGFsbWFfZGVfYWNlaXRlDQpgYGANCmBgYHtyfQ0Kem9uYV9iYW5hbmVyYV9wYWxtYV9kZV9hY2VpdGUNCmBgYA0KQWhvcmEsIGhhcmVtb3MgdW4gZ3LDoWZpY28gYsOhc2ljbzoNCmBgYHtyfQ0KZyA8LSBnZ3Bsb3QoYWVzKHg9WUVBUiwgeT1Qcm9kdWNjaW9uLzEwMDApLCBkYXRhID0gem9uYV9iYW5hbmVyYV9wYWxtYV9kZV9hY2VpdGUpICsgZ2VvbV9iYXIoc3RhdD0naWRlbnRpdHknKSArIGxhYnMoeT0nUHJvZHVjY2lvbiBkZSBQYWxtYSBkZSBBY2VpdGUgW1RvbiB4IDEwMDBdJywgeD0nWWVhcicpDQpgYGANCmBgYHtyfQ0KZyArIGdndGl0bGUoIkV2b2x1Y2nDs24gZGUgbGEgUHJvZHVjY2lvbiBkZSBsYSBQYWxtYSBkZSBBY2VpdGUgZW4gbGEgWm9uYSBCYW5hbmVyYSBkZXNkZSAyMDA3IGhhc3RhIDIwMTgiKSArIGxhYnMoY2FwdGlvbj0gIkJhc2FkbyBlbiBFTUEgZGF0YSAoREFORSwgMjAxOCkiKQ0KYGBgDQpBaG9yYSBoYXJlbW9zIG90cm8gZ3LDoWZpY28gcXVlIGNvcnJlc3BvbmRhIGFsIHNlZ3VuZG8gbXVuaWNpcGlvIGNvbiDDoXJlYSBzZW1icmFkYSBtw6FzIGdyYW5kZSBlbiAyMDE4LCBxdWUgZXMgQ2nDqW5hZ2EgY29uIGVsIGdydXBvIGRlIE90cm9zIFBlcm1hbmVudGVzLiBZIHNlbGVjY2lvbmFyZW1vcyBlbCBjdWx0aXZvIGRlIENhY2FvLCBvYnNlcnZhbmRvIGxhIGV2b2x1Y2nDs24gZGUgbGEgcHJvZHVjY2nDs24gZW4gY2FkYSBhw7FvLg0KYGBge3J9DQpkYXRvcyAlPiUgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KICBmaWx0ZXIoTVVOSUNJUElPPT0iQ0lFTkFHQSIgJiBTVUJHUlVQTz09IkNBQ0FPIikgJT4lICAgICAgDQogIGdyb3VwX2J5KFlFQVIsIENVTFRJVk8pIC0+IGNpZW5hZ2FfY2FjYW8NCmBgYA0KYGBge3J9DQpjaWVuYWdhX2NhY2FvDQpgYGANCmBgYHtyfQ0KZ2NjIDwtIGdncGxvdChhZXMoeD1ZRUFSLCB5PVByb2R1Y2Npb24vMTAwMCksIGRhdGEgPSBjaWVuYWdhX2NhY2FvKSArIGdlb21fYmFyKHN0YXQ9J2lkZW50aXR5JykgKyBsYWJzKHk9J1Byb2R1Y2Npb24gZGUgQ2FjYW8gW1RvbiB4IDEwMDBdJywgeD0nWWVhcicpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCmBgYA0KYGBge3J9DQpnY2MgKyBnZ3RpdGxlKCJFdm9sdWNpw7NuIGRlIGxhIFByb2R1Y2Npb24gZGVsIENhY2FvIGVuIENpZW5hZ2EgZGVzZGUgMjAwNyBoYXN0YSAyMDE4IikgKyBsYWJzKGNhcHRpb249ICJCYXNhZG8gZW4gRU1BIGRhdGEgKERBTkUsIDIwMTgpIikNCmBgYA0KDQoNCkFob3JhIGludmVzdGlnYXJlbW9zIGN1YWxlcyBjdWx0aXZvcyB0dXZpZXJvbiBsYSBtYXlvciBzdXBlcmZpY2llIGNvc2VjaGFkYSBlbiAyMDE4Og0KYGBge3J9DQpkYXRvcyAlPiUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlcihZRUFSPT0yMDE4KSAlPiUgICAgICAgICAgICAgDQogIGdyb3VwX2J5KEdSVVBPKSAlPiUgICAgICAgICAgICAgICAgIA0KICBzdW1tYXJpemUoc3VtX2FyZWFfY29zZWNoYSA9IHN1bShBcmVhX0Nvc2VjaGEsIG5hLnJtID0gVFJVRSkpICU+JSAgIA0KICBhcnJhbmdlKGRlc2Moc3VtX2FyZWFfY29zZWNoYSkpIC0+IHRvdGFsX2FyZWFfY29zZWNoYQ0KYGBgDQpkYXRvcyAlPiUgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KICAgZ3JvdXBfYnkoTVVOSUNJUElPLCBHUlVQTykgJT4lICAgICANCiAgIHN1bW1hcmlzZShyZW5kX3Byb20gPSBtZWFuKFByb2R1Y2Npb24sIG5hLnJtID0gVFJVRSkpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQogICBhcnJhbmdlKGRlc2MocmVuZF9wcm9tKSkgLT4gcmVuZF9yZXMgICAgICAgICAgICAgIA0KYGBge3J9DQp0b3RhbF9hcmVhX2Nvc2VjaGENCmBgYA0KUG9kZW1vcyBvYnNlcnZhciBxdWUgX09MRUFHSU5PU0FTXyB0dXZvIGxhIG1heW9yIHBhcnRlIGRlbCDDoXJlYSBjb3NlY2hhZGEgZW4gMjAxOCBlbiBNYWdkYWxlbmEuIFBvZGVtb3MgZW5jb250cmFyIGVuIGxhIGluZm9ybWFjacOzbiBkZWwgREFORSBjb24gdW4gY8OzZGlnbyBjdcOhbCBjdWx0aXZvIHBlcnRlbmVjZSBhIGVzdGUgZ3J1cG8NCmBgYHtyfQ0KZGF0b3MgJT4lICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCiAgZmlsdGVyKEdSVVBPPT0iT0xFQUdJTk9TQVMiICYgWUVBUj09MjAxOCkgJT4lICANCiAgZ3JvdXBfYnkoQ1VMVElWTykgJT4lICAgICAgICAgICAgICAgDQogIHN1bW1hcml6ZShzdW1fY29zZWNoYSA9IHN1bShBcmVhX0Nvc2VjaGEsIG5hLnJtID0gVFJVRSkpICU+JSAgDQogIGFycmFuZ2UoZGVzYyhzdW1fY29zZWNoYSkpIC0+IHRvdGFsX2Nvc2VjaGENCmBgYA0KYGBge3J9DQp0b3RhbF9jb3NlY2hhDQpgYGANCsKhQXPDrSBlcyBjb21vIG5vcyBkYW1vcyBjdWVudGEgcXVlIGxhIFBhbG1hIGRlIEFjZWl0ZSBlcyBsYSBsbGF2ZSBlbiBsYSBhZ3JpY3VsdHVyYSBtYWdkYWxlbmVuc2UhDQoNClkgY29tbyBwb2RyZW1vcyBvYnNlcnZhciBlbiBsYXMgcMOhZ2luYXMgMTYgeSAzNCBkZWwgYm9sZXTDrW4gOSBkZWwgW0NlbnNvIE5hY2lvbmFsIEFncm9wZWN1YXJpb10oaHR0cHM6Ly93d3cuZGFuZS5nb3YuY28vZmlsZXMvQ2Vuc29BZ3JvcGVjdWFyaW8vZW50cmVnYS1kZWZpbml0aXZhL0JvbGV0aW4tOS1jdWx0aXZvcy85LUJvbGV0aW4ucGRmKSgyMDE0KSwgbGEgcGFsbWEgYWNlaXRlcmEgeSBlbCBiYW5hbm8gZGUgZXhwb3J0YWNpw7NuIHNvbiBsb3MgY3VsdGl2b3MgcXVlIHRpZW5lbiBsYSBtYXlvciBwYXJ0ZSBkZWwgw6FyZWEgYWdyw61jb2xhIHNlbWJyYWRhIGVuIGVsIGRlcGFydGFtZW50byBkZWwgTWFnZGFsZW5hLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KDQpBaG9yYSBwb2RlbW9zIGVuY29udHJhciBjdWFsZXMgc29uIGxvcyBtdW5pY2lwaW9zIGNvbiBsYSBtYXlvciDDoXJlYSBzZW1icmFkYSBmb3IgY2FkYSBjdWx0aXZvIHBlcm1hbmVudGUgZW4gMjAxODoNCmBgYHtyfQ0KZGF0b3MgJT4lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KICBmaWx0ZXIoWUVBUj09MjAxOCAmIEdSVVBPPT0iT0xFQUdJTk9TQVMiKSAlPiUgDQogIGdyb3VwX2J5KENVTFRJVk8sIE1VTklDSVBJTykgJT4lICAgIA0KICBzdW1tYXJpemUobWF4X2FyZWEyID0gbWF4KEFyZWFfQ29zZWNoYSwgbmEucm0gPSBUUlVFKSkgJT4lICANCiAgc2xpY2Uod2hpY2gubWF4KG1heF9hcmVhMikpIC0+IGFyZWFfY29zZWNoYTINCmBgYA0KYGBge3J9DQphcmVhX2Nvc2VjaGEyDQpgYGANCkFob3JhIHJlZ3Jlc2Vtb3MgYSBsYSBpbmZvcm1hY2nDs24gZGUgY3VsdGl2b3MgcGVybWFuZW50ZXMuIEFudGVzIGRlIGdyYWZpY2FyLCBuZWNlc2l0YXJlbW9zIGHDsWFkaXIsIHBhcmEgZWwgb2JqZXRvIF90b3RhbF9hcmVhX2Nvc2VjaGFfLCB1biBudWV2byBhcmNoaXZvIGNvbiBhYnJldmlhdHVyYXMgcGFyYSBjYWRhIGdydXBvIGRlIGN1bHRpdm9zLiBEZSBvdHJhIG1hbmVyYSwgbGEgZ3LDoWZpY2Egc2UgZWNoYXLDoSBhIHBlcmRlci4NCmBgYHtyfQ0KdG90YWxfYXJlYV9jb3NlY2hhJENST1AgPC0gYWJicmV2aWF0ZSh0b3RhbF9hcmVhX2Nvc2VjaGEkR1JVUE8sIDMpDQpgYGANCkFob3JhIHPDrSwgYSBncmFmaWNhcjoNCmBgYHtyfQ0KZ2cgPC0gZ2dwbG90KGFlcyh4PUNST1AsIHk9c3VtX2FyZWFfY29zZWNoYSksIGRhdGEgPSB0b3RhbF9hcmVhX2Nvc2VjaGEpICsgZ2VvbV9iYXIoc3RhdD0naWRlbnRpdHknKSArIGxhYnMoeT0nVG90YWwgZGUgQXJlYSBTZW1icmFkYSBbSGFdJywgeD0nQ3VsdGl2bycpIA0KYGBgDQpgYGB7cn0NCmdnKyBnZ3RpdGxlKCJUb3RhbCBkZSBhcmVhIHNlbWJyYWRhIHBvciBncnVwbyBkZSBjdWx0aXZvcyBlbiAyMDE4IHBhcmEgTWFnZGFsZW5hIikgKyB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41KSkgKyBsYWJzKGNhcHRpb249ICJCYXNhZG8gZW4gRU1BIGRhdGEgKERBTkUsIDIwMTgpIikNCmBgYA0KIyMg4oCiIFVuacOzbiBkZSBlc3RhZMOtc3RpY2FzIGFncsOtY29sYXMgcGFyYSBsb3MgbXVuaWNpcGlvcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQpDb21lbmNlbW9zIGxleWVuZG8gbGEgaW5mb3JtYWNpw7NuIHVzYW5kbyBsYSBiaWJsaW90ZWNhIF9zZl86DQpgYGB7cn0NCm1hZ19tdW5pYyA8LSBzZjo6c3RfcmVhZCgiQzovVXNlcnMvdmFsZV8vRGVza3RvcC9VTkFMLzZ0byBzZW1lc3RyZS9HQi9BRE1JTklTVFJBVElWTy9NR05fTVBJT19QT0xJVElDTy5zaHAiKQ0KYGBgDQrCv1F1w6kgZXMgX21hZ19tdW5pY18/DQpgYGB7cn0NCm1hZ19tdW5pYw0KYGBgDQpDb21vIGVsIGPDs2RpZ28gcXVlIGFwYXJlY2UgZW4gTVBJT19DQ0RHTyBubyBlcyBlbCBtaXNtbyBxdWUgZWwgcXVlIGFwYXJlY2UgZW4gQ09EX01VTiwgZGViZW1vcyBjYW1iaWFyIGFsZ3VubyBkZSBsb3MgZG9zIHBhcmEgcXVlIHNlIHB1ZWRhIHJlYWxpemFyIGxhIHVuacOzbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KVmFtb3MgYSB2ZXJpZmljYXIgZWwgZXN0YWRvIGRlbCDDumx0aW1vOiANCmBgYHtyfQ0KZGF0b3MgJT4lIGZpbHRlciAoTVVOSUNJUElPID09IlNBTlRBIE1BUlRBIikgLT4gc21yX2RhdG9zDQpgYGANCmBgYHtyfQ0Kc21yX2RhdG9zDQpgYGANCmBgYHtyfQ0KY2xhc3Moc21yX2RhdG9zJENPRF9NVU4pDQpgYGANClBhcmEgaGFjZXIgbGEgdW5pw7NuLCBuZWNlc2l0YW1vcyBjYW1iaWFyIGFtYm9zLCBfZGF0YSB0eXBlXyB5IF9jb250ZW50c18gcGFyYSBlbCBjw7NkaWdvIHF1ZSBpZGVudGlmaWNhIGNhZGEgbXVuaWNpcGlvLiBQYXJhIGVzdG8sIHNlcmEgbmVjZXNhcmlvIGNyZWFyIHVuYSBjb3BpYSBkZSBsYSBpbmZvcm1hY2nDs24gZXN0YWTDrXN0aWNhIG9yaWdpbmFsLiBDb24gZXN0bywgbm8gc2UgcG9kcsOhIGRhw7FhciBsYSBpbmZvcm1hY2nDs24gb3JpZ2luYWwsIGVuIGNhc28gZGUgY29tZXRlciB1bmEgZXF1aXZvY2FjacOzbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANClZhbW9zIGEgaGFjZXJsbyBjdWlkYWRvc2FtZW50ZToNCmBgYHtyfQ0KZGF0b3MyIDwtIGRhdG9zDQpgYGANCmBgYHtyfQ0KZGF0b3MyJFRFTVAgPC0gYXMuY2hhcmFjdGVyKGRhdG9zMiRDT0RfTVVOKQ0KYGBgDQpgYGB7cn0NCmRhdG9zMiRNUElPX0NDREdPIDwtIGFzLmZhY3RvcihkYXRvczIkVEVNUCkNCmBgYA0KYGBge3J9DQpoZWFkKGRhdG9zMikNCmBgYA0KSGF5IHF1ZSBhc2VndXJhcnNlIGRlIHZlcmlmaWNhciwgZW4gZWwgb2JqZXRvIGRhdG9zMiwgbGFzIGNhcmFjdGVyw61zdGljYXMgZGVsIG51ZXZvIGF0cmlidXRvIE1QSU9fQ0NER08uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCkFob3JhLCB2YW1vcyBhIGZpbHRyYXIgdW4gc29sbyBhw7FvIHkgc2VsZWNjaW9uYXIgc29sbyBkb3MgYXRyaWJ1dG9zIHJlbGV2YW50ZXM6DQpgYGB7cn0NCmRhdG9zMiAlPiUgZmlsdGVyKENVTFRJVk8gPT0gIlBBTE1BIERFIEFDRUlURSIpIC0+IGRhdG9zMw0KYGBgDQpgYGB7cn0NCmhlYWQoZGF0b3MzKQ0KYGBgDQpgYGB7cn0NCmNsYXNzKGRhdG9zMykNCmBgYA0KYGBge3J9DQpkYXRvczQgPC0gZGF0b3MzICU+JSBkcGx5cjo6c2VsZWN0KE1VTklDSVBJTywgTVBJT19DQ0RHTywgWUVBUiwgUHJvZHVjY2lvbiwgUmVuZGltaWVudG8pDQpgYGANCmBgYHtyfQ0KZGF0b3M0DQpgYGANCmBgYHtyfQ0KZGF0b3M0ICU+JSAgICAgICAgICAgICAgICAgICAgICAgICAgICANCiAgZ2F0aGVyKCJZRUFSIiwgIlByb2R1Y2Npb24iLCAiUmVuZGltaWVudG8iICwga2V5ID0gdmFyaWFibGUsIHZhbHVlID0gbnVtYmVyKQ0KYGBgDQpgYGB7cn0NCmhlYWQoZGF0b3M0KQ0KYGBgDQpFc3RhIGVzIHVuYSB0YXJlYSBjbGF2ZS4gU2UgY29tcG9uZSBkZSB2YXJpb3MgcGFzb3MgcGFyYSBwb2RlciBjb252ZXJ0aXIgbGEgdGFibGEgZGUgYXRyaWJ1dG9zIGRlc2RlIHVuIGZvcm1hdG8gbGFyZ28gYSB1biBmb3JtYXRvIGFuY2hvLg0KYGBge3J9DQpkYXRvczQgJT4lICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KICBncm91cF9ieShNUElPX0NDREdPKSAlPiUgICAgICAgICAgICANCiAgbXV0YXRlKFZpc2l0ID0gMTpuKCkpICU+JSAgICAgICAgICAgDQogIGdhdGhlcigiWUVBUiIsICJQcm9kdWNjaW9uIiwgIlJlbmRpbWllbnRvIiwga2V5ID0gdmFyaWFibGUsIHZhbHVlID0gbnVtYmVyKSAlPiUgICAgICAgICAgICAgICAgIA0KICB1bml0ZShjb21iaSwgdmFyaWFibGUsIFZpc2l0KSAlPiUgICANCiAgc3ByZWFkKGNvbWJpLCBudW1iZXIpIC0+IGRhdG9zNQ0KYGBgDQpgYGB7cn0NCmhlYWQoZGF0b3M1KQ0KYGBgDQpgYGB7cn0NCnRhaWwoZGF0b3M1KQ0KYGBgDQpUYW1iacOpbiBoYXJlbW9zIHVuYSBjb3BpYSBkZSBsYSBfY29sZWNjacOzbiBkZSBjYXJhY3RlcsOtc3RpY2FzIHNpbXBsZXNfLCBwYXJhIGFzZWd1cmFybm9zIGRlIHF1ZSBubyBzZSBkYcOxZW4gbG9zIGRhdG9zOg0KYGBge3J9DQptYWdfbXVuaWMyIDwtIG1hZ19tdW5pYw0KYGBgDQpBaG9yYSwgZXMgaG9yYSBkZSB1bmlyOg0KYGBge3J9DQptYWdfbXVuaWNfc3RhdCA9IGxlZnRfam9pbihtYWdfbXVuaWMyLCBkYXRvczUsIGJ5PSJNUElPX0NDREdPIikNCmBgYA0KYGBge3J9DQpzdW1tYXJ5KG1hZ19tdW5pY19zdGF0KQ0KYGBgDQojIyDigKIgwqFBIEdyYWZpY2FyIQ0KYGBge3J9DQojaW5zdGFsbC5wYWNrYWdlcygiUkNvbG9yQnJld2VyIikgICAgICAgICAgICAgICAgIA0KbGlicmFyeShSQ29sb3JCcmV3ZXIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCmxpYnJhcnkobGVhZmxldCkNCmBgYA0KVmFtb3MgYSBncmFmaWNhciBsb3MgbXVuaWNpcGlvcyBjb24gc3UgY29ycmVzcG9uZGllbnRlIHByb2R1Y2Npb24gZGUgUGFsbWEgZGUgYWNlaXRlIHBvciB1biBzb2xvIGHDsW86DQpgYGB7cn0NCmJpbnMgPC0gYygwLCAxMTAwLCA2MjAwLCAxMTQwMCwgMTY1MDAsIDIxNjAwLCAyNjcwMCwgMzE5MDAsIDM3MDAwKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQpwYWwgPC0gY29sb3JCaW4oIllsT3JSZCIsIGRvbWFpbiA9IG1hZ19tdW5pY19zdGF0JFByb2R1Y2Npb25fMTIsIGJpbnMgPSBiaW5zKSAgICAgICANCg0KDQptYXBhIDwtIGxlYWZsZXQoZGF0YSA9IG1hZ19tdW5pY19zdGF0KSAlPiUgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KYWRkVGlsZXMoKSAlPiUgICAgICAgICAgICAgICAgICAgICAgICAgDQogIGFkZFBvbHlnb25zKGxhYmVsID0gflByb2R1Y2Npb25fMTIsICAgICAgICAgICAgICAgIHBvcHVwID0gfk1QSU9fQ05NQlIsICAgICAgICAgICAgICAgICAgIGZpbGxDb2xvciA9IH5wYWwoUHJvZHVjY2lvbl8xMiksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3IgPSAiIzQ0NDQ0NCIsICAgICAgICAgICAgICAgICAgICAgd2VpZ2h0ID0gMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgc21vb3RoRmFjdG9yID0gMC41LCAgICAgICAgICAgICAgICAgICAgb3BhY2l0eSA9IDEuMCwgICAgICAgICAgICAgICAgICAgICAgICAgZmlsbE9wYWNpdHkgPSAwLjUsICAgICAgICAgICAgICAgICAgICAgaGlnaGxpZ2h0T3B0aW9ucyA9IGhpZ2hsaWdodE9wdGlvbnMoY29sb3IgPSAid2hpdGUiLCB3ZWlnaHQgPSAyLCBicmluZ1RvRnJvbnQgPSBUUlVFKSAgICAgICAgICAgICAgICAgICAgICkgJT4lICAgICAgICAgICAgICAgICAgICANCmFkZFByb3ZpZGVyVGlsZXMocHJvdmlkZXJzJE9wZW5TdHJlZXRNYXApICU+JSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KYWRkTGVnZW5kKCJib3R0b21yaWdodCIsIHBhbCA9IHBhbCwgdmFsdWVzID0gflByb2R1Y2Npb25fMTIsICAgICAgICAgICAgICAgICAgdGl0bGUgPSAiUHJvZHVjY2lvbiBkZSBQYWxtYSBkZSBBY2VpdGUgZW4gTWFnZGFsZW5hIFtUb25dICgyMDE4KSIsICAgICAgICBvcGFjaXR5ID0gMSAgICAgICAgICAgICAgICAgICAgICAgICApDQpgYGANCmBgYHtyfQ0KbWFwYQ0KYGBgDQpgYGB7cn0NCnNlc3Npb25JbmZvKCkNCmBgYA==