Proposito del cuaderno

Este es un R Markdown Notebook que ilustra las estadísticas agrícolas del departamento de Arauca en Colombia. Ha sido creado, compilado y publicado desde RStudio. Este cuaderno tiene como objetivo ayudar a los estudiantes de Geomática Básica de la Universidad Nacional a comprender conceptos básicos de geomática útiles para la agronomía. Todos los alumnos deben replicar este cuaderno, pero adaptando su contenido a su departamento. La fecha límite para publicar este cuaderno es el 7 de octubre de 2020 a las 11:59 a.m. Su publicación en RPubs cuenta como el primer informe técnico del curso. Tu calificación representa el 15% de la calificación final.

Funciones de SIG

La exploración de estadísticas no espaciales es fundamental para comprender lo que está sucediendo en los territorios. Varias bibliotecas de R, en particular dplyr y tidyverse, son muy útiles para explorar y resumir estadísticas. Por otro lado, las operaciones geoespaciales pueden mejorar nuestra comprensión de varios problemas que afectan las regiones geográficas. Por ejemplo, desea averiguar cuál es la ubicación de los municipios cuyos rendimientos de cultivos son sobresalientes (o alternativamente más bajos que el promedio). Para realizar dicha exploración, necesitamos unir datos no espaciales con datos espaciales. Ya hicimos esta tarea usando QGIS. Ahora, lo haremos con R. Además, también podríamos explorar combinaciones espaciales. Estas operaciones se basan en la intersección entre dos entidades, a menudo puntos y polígonos. Hay muchas formas en que podemos unir objetos, que pueden incluir opciones específicas como cruces, valla, interior, toques, etc

Comencemos eliminando el contenido de la memoria:

rm(list=ls())

Ahora, instalemos las bibliotecas que necesitamos. Tenga en cuenta que, en el siguiente fragmento, cualquier paquete se instala solo si no se ha instalado previamente.

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, carguemos 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 las estadísticas agrícolas en Arauca

Previamente, he descargado datos estadísticos, en formato csv, sobre Estadisticas Municipales Agropecuarias a mi computadora. Luego, he usado Excel para eliminar filas para municipios en departamentos diferentes a Arauca. Guardé el archivo con las filas restantes como un archivo local con el nombre EVA_Arauca.csv en mi computadora. Luego, cargué el archivo en la carpeta agro en RStudio.

list.files()
 [1] "81_ARAUCA"             "Arauca.nb.html"        "Arauca.rmd"           
 [4] "ARAUCA_2017.pdf"       "BEVA_Arauca.txt"       "debug.log"            
 [7] "EVA_Arauca.csv"        "EVA_Arauca9.csv"       "EVA_Araucar.csv"      
[10] "EVA_Araucasas.csv"     "EVAB_Arauca.csv"       "MGN2017_81_ARAUCA.rar"
datos <- read_csv("./EVA_Araucar.csv")
head(datos)
tail(datos)

Tenga en cuenta que cada municipio tiene estadísticas sobre superficie sembrada, superficie cosechada y rendimiento para diferentes cultivos en diferentes años. El atributo SUBGRUPO y CULTIVO parecen referirse a lo mismo (es decir, un cultivo). Los cultivos se clasifican además en un GRUPO determinado.

En esta tabla, no tenemos unidades. Sin embargo, si revisamos el archivo csv original, encontramos que las unidades de área son hectáreas y que las unidades de rendimiento son Ton / ha.

Usaremos la biblioteca dplyr para explorar el contenido del objeto de datos.

Primero, obtengamos un resumen del rendimiento (es decir, el rendimiento promedio durante varios años) por grupo y municipio:

datos %>%
  group_by(MUNICIPIO, GRUPO) %>%
  summarise(rend_prom = mean(Rendimiento, na.rm = TRUE)) -> rend_resumen
`summarise()` regrouping output by 'MUNICIPIO' (override with `.groups` argument)
### Let's visualize only the first six records
head(rend_resumen)

También podemos calcular el rendimiento promedio por GRUPO en los municipios de Arauca:

datos %>%
  group_by(GRUPO) %>%
  summarise(rend_dep = mean(Rendimiento, na.rm = TRUE)) -> rend_arauca
`summarise()` ungrouping output (override with `.groups` argument)
rend_arauca

Nótese que los mayores rendimientos corresponden a CEREALES, PLANTAS AROMATICAS CONDIMENTARIAS Y MEDICINALES, TUBERCULOS Y PLATANOS.

Luego, busquemos cuáles 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
`summarise()` regrouping output by 'GRUPO' (override with `.groups` argument)
rend_max_18

Ahora, busquemos cuáles son los municipios con mayor área cosechada 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
`summarise()` regrouping output by 'GRUPO' (override with `.groups` argument)
area_cosecha_max

Cabe destacar que la mayor superficie cosechada en 2018 correspondió a TUBERCULOS Y PLATANOS en TAME.

La actividad económica en Arauca en cuanto a agricultura se trata, encontramos cultivos como el Cacao, arroz mecanizado, maíz tradicional y yuca; Mientras que en otros aspectos económicos se destaca por ser una zona ganadera, de caza, silvicultura y pesca, además de tener zonas de extracción de hidrocarburos.

Primero, seleccionemos la producción de plátanos (toneladas) en TAME para cada año:

datos %>% 
  filter(MUNICIPIO=="TAME" & SUBGRUPO=="PLATANO") %>% 
  group_by(YEAR, CULTIVO) ->  tame_platano

tame_platano

Hagamos una exploración gráfica básica:

# we use the ggplot 2 library
g <- ggplot(aes(x=YEAR, y=Produccion/1000), data = tame_platano) + geom_bar(stat='identity') + labs(y='Platano Production [Ton x 1000]')
g + ggtitle("Evolution of Platano Production in Tame from 2007 to 2018") + labs(caption= "Based on EMA data (DANE, 2018)")

Ahora, investiguemos qué cultivos tuvieron la mayor área 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
`summarise()` ungrouping output (override with `.groups` argument)
total_area_cosecha

Podemos ver que tuberculos y platanos tuvieron la mayor parte del área cosechada en 2018 para Arauca. ¿Qué cultivos pertenecen a este GRUPO? Puede buscar más información en DANE, la agencia gubernamental a cargo de las estadísticas nacionales en Colombia.

También podemos buscar esta información en los propios datos:

datos %>%
  filter(GRUPO=="TUBERCULOS Y PLATANOS" & YEAR==2018) %>%
  group_by(CULTIVO) %>%
  summarize(sum_cosecha = sum(Area_Cosecha, na.rm = TRUE)) %>%
     arrange(desc(sum_cosecha)) -> total_cosecha
`summarise()` ungrouping output (override with `.groups` argument)
total_cosecha

Tenga en cuenta que los cultivos de platano son la clave en la agricultura de Arauca.

Ahora veamos cuales son los municipios con mayor área cosechada para el cultivo de plátano y yuca en 2018.

datos %>% 
  filter(YEAR==2018 & GRUPO=="TUBERCULOS Y PLATANOS") %>% 
  group_by(CULTIVO, MUNICIPIO) %>%
  summarize(max_area2 = max(Area_Cosecha, na.rm = TRUE)) %>%
    slice(which.max(max_area2)) -> area_cosecha2
`summarise()` regrouping output by 'CULTIVO' (override with `.groups` argument)
area_cosecha2

Regresemos a los datos de tuberculos y plátanos. Antes de graficar, necesitaremos agregar, al objeto total_area_cosecha, un nuevo campo con abreviaturas para cada GRUPO de cultivos. De lo contrario, la trama se verá desordenada.

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

Ahora es el momento de trazar:

# we use the ggplot 2 library
g <- ggplot(aes(x=CROP, y=sum_area_cosecha), data = total_area_cosecha) + geom_bar(stat='identity') + labs(y='Total Harvested Area [Ha]')
g+ ggtitle("Total harvested area by crop groups in 2018 for Arauca") + theme(plot.title = element_text(hjust = 0.5)) +
   labs(caption= "Based on EMA data (DANE, 2018)")

Puede explorar más las estadísticas correspondientes a su departamento. Intente obtener información sobre el rendimiento de diferentes cultivos, principalmente aquellos que son esenciales para la economía de su departamento.

Uniendo las estadísticas agrícolas a los municipios

Ya he subido a RStudio los datos administrativos de Arauca. Como se comentó anteriormente en una clase virtual, es una buena idea utilizar el shapefile correspondiente a Marco Geoestadistico Departamental que se encuentra disponible en DANE Geoportal.

Comencemos a leer los datos usando la biblioteca sf:

ant_munic <- sf::st_read("./81_ARAUCA/ADMINISTRATIVO/MGN_MPIO_POLITICO.shp")
Reading layer `MGN_MPIO_POLITICO' from data source `C:\Users\danye\OneDrive\Documents\ara\81_ARAUCA\ADMINISTRATIVO\MGN_MPIO_POLITICO.shp' using driver `ESRI Shapefile'
Simple feature collection with 7 features and 9 fields
geometry type:  POLYGON
dimension:      XY
bbox:           xmin: -72.36662 ymin: 6.036228 xmax: -69.42756 ymax: 7.104381
geographic CRS: WGS 84

¿Qué es ant_munic?

ant_munic
Simple feature collection with 7 features and 9 fields
geometry type:  POLYGON
dimension:      XY
bbox:           xmin: -72.36662 ymin: 6.036228 xmax: -69.42756 ymax: 7.104381
geographic CRS: WGS 84
  DPTO_CCDGO MPIO_CCDGO    MPIO_CNMBR                           MPIO_CRSLC MPIO_NAREA
1         81      81001        ARAUCA                                 1959  5787.9421
2         81      81591 PUERTO RONDÓN Decreto Nal 677 de Abril 13 de  1987  2281.4291
3         81      81220   CRAVO NORTE Decreto Nal 677 de Abril 13 de  1987  5212.6908
4         81      81065     ARAUQUITA Decreto 1447 del 28 de Julio de 1971  3046.8789
5         81      81300        FORTUL                 Decreto 2926 de 1989  1158.6276
6         81      81736      SARAVENA     Decreto Nal 204 de Feb 3 de 1976   945.1354
7         81      81794          TAME                                 1959  5418.7040
  MPIO_NANO DPTO_CNMBR Shape_Leng Shape_Area                       geometry
1      2017     ARAUCA   4.668016 0.47162612 POLYGON ((-70.68038 7.09393...
2      2017     ARAUCA   2.932376 0.18593602 POLYGON ((-70.87879 6.62133...
3      2017     ARAUCA   3.963937 0.42393331 POLYGON ((-70.40276 6.64639...
4      2017     ARAUCA   3.258765 0.24864660 POLYGON ((-71.58441 7.04298...
5      2017     ARAUCA   2.056433 0.09461063 POLYGON ((-71.54473 6.75924...
6      2017     ARAUCA   1.294126 0.07721413 POLYGON ((-71.76224 7.06602...
7      2017     ARAUCA   3.938087 0.44219010 POLYGON ((-71.73216 6.70303...

Tenga en cuenta que ant_munic es una colección de funciones simple. Asegúrese de revisar este enlace para comprender qué es una característica simple.

Tenga en cuenta también que los datos utilizan el sistema de referencia de coordenadas geográficas WGS1984 (es decir, el código 4326 epsg).

Podemos usar la función left_join para unir los municipios y las estadísticas agrícolas seleccionadas.

Necesitamos un atributo común (o variable compartida) en el que basar la unión. El mejor atributo es una identificación. En ant_munic, el atributo MPIO_CCDGO parece estar bien (lee 81 para Arauca). En datos, el atributo correspondiente es COD_MUN (lee 81 para Arauca).

Verifiquemos la última declaración:

datos %>% filter (MUNICIPIO =="TAME") ->  ara_datos
ara_datos
class(ara_datos$COD_MUN)
[1] "numeric"

Para poder hacer la unión, necesitamos cambiar tanto el tipo de datos como el contenido del código que identifica a cada municipio. Para esta tarea, es una buena idea crear una copia de los datos estadísticos originales. Con este enfoque, cualquier movimiento falso no estropeará los datos originales.

Procedamos paso a paso:

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

Asegúrese de verificar, en el objeto datos 2, las características del nuevo atributo MPIO_CCDGO.

Ahora, filtremos un solo año y seleccionemos solo dos atributos relevantes:

datos2 %>% filter(CULTIVO == "PLATANO")  -> 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)

Ésta es una tarea clave. Implica varios pasos para poder convertir la tabla de atributos de formato largo a formato ancho. Más información sobre estos pasos aquí

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 (nuevamente, solo en caso de un movimiento en falso):

ant_munic2 <- ant_munic

Ahora es el momento de unirse:

ant_munic_stat = left_join(ant_munic2, datos5, by="MPIO_CCDGO")
summary(ant_munic_stat)
  DPTO_CCDGO         MPIO_CCDGO         MPIO_CNMBR         MPIO_CRSLC          MPIO_NAREA    
 Length:7           Length:7           Length:7           Length:7           Min.   : 945.1  
 Class :character   Class :character   Class :character   Class :character   1st Qu.:1720.0  
 Mode  :character   Mode  :character   Mode  :character   Mode  :character   Median :3046.9  
                                                                             Mean   :3407.3  
                                                                             3rd Qu.:5315.7  
                                                                             Max.   :5787.9  
   MPIO_NANO     DPTO_CNMBR          Shape_Leng      Shape_Area       MUNICIPIO        
 Min.   :2017   Length:7           Min.   :1.294   Min.   :0.07721   Length:7          
 1st Qu.:2017   Class :character   1st Qu.:2.494   1st Qu.:0.14027   Class :character  
 Median :2017   Mode  :character   Median :3.259   Median :0.24865   Mode  :character  
 Mean   :2017                      Mean   :3.159   Mean   :0.27774                     
 3rd Qu.:2017                      3rd Qu.:3.951   3rd Qu.:0.43306                     
 Max.   :2017                      Max.   :4.668   Max.   :0.47163                     
  Produccion_1   Produccion_10    Produccion_11     Produccion_2     Produccion_3   
 Min.   :  442   Min.   :  1512   Min.   :  2052   Min.   :   507   Min.   :   520  
 1st Qu.: 2949   1st Qu.:  3998   1st Qu.:  5545   1st Qu.:  3780   1st Qu.:  4036  
 Median :16402   Median : 36894   Median : 58540   Median : 21970   Median : 22400  
 Mean   :19660   Mean   : 95359   Mean   :103462   Mean   : 31034   Mean   : 42710  
 3rd Qu.:17190   3rd Qu.: 75361   3rd Qu.: 78315   3rd Qu.: 26750   3rd Qu.: 28988  
 Max.   :80500   Max.   :470391   Max.   :495925   Max.   :133704   Max.   :210000  
  Produccion_4     Produccion_5     Produccion_6     Produccion_7     Produccion_8   
 Min.   :   225   Min.   :   300   Min.   :   338   Min.   :   540   Min.   :   560  
 1st Qu.:  6120   1st Qu.:  8230   1st Qu.:  8985   1st Qu.:  7600   1st Qu.:  7030  
 Median : 21250   Median : 32500   Median : 30940   Median : 33600   Median : 48080  
 Mean   : 47745   Mean   : 54923   Mean   : 55028   Mean   : 58386   Mean   : 61150  
 3rd Qu.: 31250   3rd Qu.: 40200   3rd Qu.: 36530   3rd Qu.: 53680   3rd Qu.: 58032  
 Max.   :238000   Max.   :254800   Max.   :262885   Max.   :252000   Max.   :249284  
  Produccion_9    Rendimiento_1    Rendimiento_10  Rendimiento_11  Rendimiento_2  
 Min.   :   780   Min.   : 6.000   Min.   :13.00   Min.   :13.00   Min.   : 6.50  
 1st Qu.:  6750   1st Qu.: 6.900   1st Qu.:19.00   1st Qu.:19.00   1st Qu.: 9.50  
 Median : 36486   Median : 9.130   Median :22.00   Median :20.00   Median :12.00  
 Mean   : 77439   Mean   : 8.384   Mean   :20.59   Mean   :20.29   Mean   :10.86  
 3rd Qu.: 67654   3rd Qu.: 9.550   3rd Qu.:22.00   3rd Qu.:22.00   3rd Qu.:12.75  
 Max.   :356000   Max.   :10.660   Max.   :27.10   Max.   :27.00   Max.   :13.00  
 Rendimiento_3   Rendimiento_4   Rendimiento_5   Rendimiento_6   Rendimiento_7  
 Min.   : 6.50   Min.   : 7.50   Min.   : 7.50   Min.   : 7.50   Min.   :10.00  
 1st Qu.: 9.50   1st Qu.:10.00   1st Qu.:10.25   1st Qu.:11.00   1st Qu.:12.00  
 Median :12.50   Median :12.50   Median :12.50   Median :13.00   Median :15.00  
 Mean   :11.29   Mean   :11.36   Mean   :11.79   Mean   :12.14   Mean   :13.86  
 3rd Qu.:13.50   3rd Qu.:12.75   3rd Qu.:13.50   3rd Qu.:13.75   3rd Qu.:16.00  
 Max.   :14.00   Max.   :14.00   Max.   :15.00   Max.   :15.00   Max.   :16.00  
 Rendimiento_8   Rendimiento_9       YEAR_1        YEAR_10        YEAR_11         YEAR_2    
 Min.   :10.00   Min.   :10.00   Min.   :2008   Min.   :2017   Min.   :2018   Min.   :2009  
 1st Qu.:12.00   1st Qu.:14.00   1st Qu.:2008   1st Qu.:2017   1st Qu.:2018   1st Qu.:2009  
 Median :15.00   Median :18.00   Median :2008   Median :2017   Median :2018   Median :2009  
 Mean   :13.86   Mean   :16.29   Mean   :2008   Mean   :2017   Mean   :2018   Mean   :2009  
 3rd Qu.:16.00   3rd Qu.:19.00   3rd Qu.:2008   3rd Qu.:2017   3rd Qu.:2018   3rd Qu.:2009  
 Max.   :16.00   Max.   :20.00   Max.   :2008   Max.   :2017   Max.   :2018   Max.   :2009  
     YEAR_3         YEAR_4         YEAR_5         YEAR_6         YEAR_7         YEAR_8    
 Min.   :2010   Min.   :2011   Min.   :2012   Min.   :2013   Min.   :2014   Min.   :2015  
 1st Qu.:2010   1st Qu.:2011   1st Qu.:2012   1st Qu.:2013   1st Qu.:2014   1st Qu.:2015  
 Median :2010   Median :2011   Median :2012   Median :2013   Median :2014   Median :2015  
 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.   :2014   Max.   :2015  
     YEAR_9              geometry
 Min.   :2016   POLYGON      :7  
 1st Qu.:2016   epsg:4326    :0  
 Median :2016   +proj=long...:0  
 Mean   :2016                    
 3rd Qu.:2016                    
 Max.   :2016                    

Graficar:

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

Grafiquemos los municipios con su correspondiente producción de Plátano para un solo año:

bins <- c(0, 2500, 5000, 10000, 20000, 50000, 100000, 1500000)
pal <- colorBin("Spectral", domain = ant_munic_stat$Produccion_11, bins = bins)

  mapa <- leaflet(data = ant_munic_stat) %>%
  addTiles() %>%
  addPolygons(label = ~Produccion_11,
              popup = ~MPIO_CNMBR,
              fillColor = ~pal(Produccion_11),
              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_11,
    title = "Producción de platano en Arauca [Ton] (2018)",
    opacity = 1
  )
mapa

Tenga en cuenta que utilicé tanto etiquetas como ventanas emergentes en este mapa. En caso de que desee obtener más información sobre cómo dibujar mapas interactivos con folleto, siga este enlace.

Ahora trazaremos el rendimiento por municipio.

bins <- c(0, 5, 10, 15, 20, 25, 30, 35)
pal <- colorBin("YlOrRd", domain = ant_munic_stat$Rendimiento_11, bins = bins)

  mapa <- leaflet(data = ant_munic_stat) %>%
  addTiles() %>%
  addPolygons(label = ~Rendimiento_11,
              popup = ~MPIO_CNMBR,
              fillColor = ~pal(Rendimiento_11),
              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 = ~Rendimiento_11,
    title = "Rendimiento de platano en Arauca [Ton] (2018)",
    opacity = 1
  )
mapa

Al contrastar la producción por municipio respecto al rendimiento, podemos evidencial que en los municipios de Puerto Rondon, Cravo Norte y en menor medida Arauca, el rendimiento es congruente con la producción, denotando que en estos departamentos no es prioridad total el cultivo de platano,lo cual entre otras, indica el grado de concentración productiva que existe en los departamentos de Tame, Fortul, Saravena, y Arauquita.

Ahora es el momento de replicar, adaptar y mejorar este cuaderno para explorar las estadísticas agrícolas de su departamento.

¡¡¡Buena suerte!!!

sessionInfo()
R version 4.0.2 (2020-06-22)
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   
[3] LC_MONETARY=Spanish_Colombia.1252 LC_NUMERIC=C                     
[5] 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  cowplot_1.1.0       ggrepel_0.8.2      
 [5] GSODR_2.1.2         rnaturalearth_0.1.0 viridis_0.5.1       viridisLite_0.3.0  
 [9] sf_0.9-5            raster_3.3-13       maptools_1.0-2      rgeos_0.5-5        
[13] sp_1.4-2            forcats_0.5.0       stringr_1.4.0       dplyr_1.0.2        
[17] purrr_0.3.4         readr_1.3.1         tidyr_1.1.2         tibble_3.0.3       
[21] ggplot2_3.3.2       tidyverse_1.3.0     here_0.1           

loaded via a namespace (and not attached):
 [1] httr_1.4.2              jsonlite_1.7.0          modelr_0.1.8           
 [4] assertthat_0.2.1        blob_1.2.1              cellranger_1.1.0       
 [7] yaml_2.2.1              pillar_1.4.6            backports_1.1.7        
[10] lattice_0.20-41         glue_1.4.2              digest_0.6.25          
[13] rvest_0.3.6             leaflet.providers_1.9.0 colorspace_1.4-1       
[16] htmltools_0.5.0         pkgconfig_2.0.3         broom_0.7.0            
[19] haven_2.3.1             scales_1.1.1            farver_2.0.3           
[22] generics_0.0.2          ellipsis_0.3.1          withr_2.2.0            
[25] cli_2.0.2               magrittr_1.5            crayon_1.3.4           
[28] readxl_1.3.1            evaluate_0.14           fs_1.5.0               
[31] fansi_0.4.1             xml2_1.3.2              foreign_0.8-80         
[34] class_7.3-17            data.table_1.13.0       tools_4.0.2            
[37] hms_0.5.3               lifecycle_0.2.0         munsell_0.5.0          
[40] reprex_0.3.0            compiler_4.0.2          e1071_1.7-3            
[43] tinytex_0.25            rlang_0.4.7             classInt_0.4-3         
[46] units_0.6-7             grid_4.0.2              rstudioapi_0.11        
[49] htmlwidgets_1.5.1       crosstalk_1.1.0.1       base64enc_0.1-3        
[52] labeling_0.3            rmarkdown_2.3           gtable_0.3.0           
[55] codetools_0.2-16        DBI_1.1.0               R6_2.4.1               
[58] gridExtra_2.3           lubridate_1.7.9         knitr_1.29             
[61] rprojroot_1.3-2         KernSmooth_2.23-17      stringi_1.4.6          
[64] Rcpp_1.0.5              vctrs_0.3.3             dbplyr_1.4.4           
[67] tidyselect_1.1.0        xfun_0.16              
LS0tDQp0aXRsZTogIkVzdGFkaXN0aWNhcyBtdW5pY2lwYWxlcyBkZSBsYSBhZ3JpY3VsdHVyYSBlbiBBcmF1Y2EiDQphdXRob3I6ICJEYW5pZWwgRXN0ZWJhbiBDb3J0w6lzIEVjaGV2ZXJyeSINCmRhdGU6ICIwNy8xMC8yMDIwIg0Kb3V0cHV0OiBodG1sX25vdGVib29rDQotLS0NCiMgUHJvcG9zaXRvIGRlbCBjdWFkZXJubw0KDQpFc3RlIGVzIHVuIFIgTWFya2Rvd24gTm90ZWJvb2sgcXVlIGlsdXN0cmEgbGFzIGVzdGFkw61zdGljYXMgYWdyw61jb2xhcyBkZWwgZGVwYXJ0YW1lbnRvIGRlIEFyYXVjYSBlbiBDb2xvbWJpYS4gSGEgc2lkbyBjcmVhZG8sIGNvbXBpbGFkbyB5IHB1YmxpY2FkbyBkZXNkZSBSU3R1ZGlvLiBFc3RlIGN1YWRlcm5vIHRpZW5lIGNvbW8gb2JqZXRpdm8gYXl1ZGFyIGEgbG9zIGVzdHVkaWFudGVzIGRlIEdlb23DoXRpY2EgQsOhc2ljYSBkZSBsYSBVbml2ZXJzaWRhZCBOYWNpb25hbCBhIGNvbXByZW5kZXIgY29uY2VwdG9zIGLDoXNpY29zIGRlIGdlb23DoXRpY2Egw7p0aWxlcyBwYXJhIGxhIGFncm9ub23DrWEuIFRvZG9zIGxvcyBhbHVtbm9zIGRlYmVuIHJlcGxpY2FyIGVzdGUgY3VhZGVybm8sIHBlcm8gYWRhcHRhbmRvIHN1IGNvbnRlbmlkbyBhIHN1IGRlcGFydGFtZW50by4gTGEgZmVjaGEgbMOtbWl0ZSBwYXJhIHB1YmxpY2FyIGVzdGUgY3VhZGVybm8gZXMgZWwgNyBkZSBvY3R1YnJlIGRlIDIwMjAgYSBsYXMgMTE6NTkgYS5tLiBTdSBwdWJsaWNhY2nDs24gZW4gUlB1YnMgY3VlbnRhIGNvbW8gZWwgcHJpbWVyIGluZm9ybWUgdMOpY25pY28gZGVsIGN1cnNvLiBUdSBjYWxpZmljYWNpw7NuIHJlcHJlc2VudGEgZWwgMTUlIGRlIGxhIGNhbGlmaWNhY2nDs24gZmluYWwuDQoNCiMgRnVuY2lvbmVzIGRlIFNJRw0KDQpMYSBleHBsb3JhY2nDs24gZGUgZXN0YWTDrXN0aWNhcyBubyBlc3BhY2lhbGVzIGVzIGZ1bmRhbWVudGFsIHBhcmEgY29tcHJlbmRlciBsbyBxdWUgZXN0w6Egc3VjZWRpZW5kbyBlbiBsb3MgdGVycml0b3Jpb3MuIFZhcmlhcyBiaWJsaW90ZWNhcyBkZSBSLCBlbiBwYXJ0aWN1bGFyIGRwbHlyIHkgdGlkeXZlcnNlLCBzb24gbXV5IMO6dGlsZXMgcGFyYSBleHBsb3JhciB5IHJlc3VtaXIgZXN0YWTDrXN0aWNhcy4gUG9yIG90cm8gbGFkbywgbGFzIG9wZXJhY2lvbmVzIGdlb2VzcGFjaWFsZXMgcHVlZGVuIG1lam9yYXIgbnVlc3RyYSBjb21wcmVuc2nDs24gZGUgdmFyaW9zIHByb2JsZW1hcyBxdWUgYWZlY3RhbiBsYXMgcmVnaW9uZXMgZ2VvZ3LDoWZpY2FzLiBQb3IgZWplbXBsbywgZGVzZWEgYXZlcmlndWFyIGN1w6FsIGVzIGxhIHViaWNhY2nDs24gZGUgbG9zIG11bmljaXBpb3MgY3V5b3MgcmVuZGltaWVudG9zIGRlIGN1bHRpdm9zIHNvbiBzb2JyZXNhbGllbnRlcyAobyBhbHRlcm5hdGl2YW1lbnRlIG3DoXMgYmFqb3MgcXVlIGVsIHByb21lZGlvKS4gUGFyYSByZWFsaXphciBkaWNoYSBleHBsb3JhY2nDs24sIG5lY2VzaXRhbW9zIHVuaXIgZGF0b3Mgbm8gZXNwYWNpYWxlcyBjb24gZGF0b3MgZXNwYWNpYWxlcy4gWWEgaGljaW1vcyBlc3RhIHRhcmVhIHVzYW5kbyBRR0lTLiBBaG9yYSwgbG8gaGFyZW1vcyBjb24gUi4gQWRlbcOhcywgdGFtYmnDqW4gcG9kcsOtYW1vcyBleHBsb3JhciBjb21iaW5hY2lvbmVzIGVzcGFjaWFsZXMuIEVzdGFzIG9wZXJhY2lvbmVzIHNlIGJhc2FuIGVuIGxhIGludGVyc2VjY2nDs24gZW50cmUgZG9zIGVudGlkYWRlcywgYSBtZW51ZG8gcHVudG9zIHkgcG9sw61nb25vcy4gSGF5IG11Y2hhcyBmb3JtYXMgZW4gcXVlIHBvZGVtb3MgdW5pciBvYmpldG9zLCBxdWUgcHVlZGVuIGluY2x1aXIgb3BjaW9uZXMgZXNwZWPDrWZpY2FzIGNvbW8gY3J1Y2VzLCB2YWxsYSwgaW50ZXJpb3IsIHRvcXVlcywgZXRjDQoNCioqQ29tZW5jZW1vcyBlbGltaW5hbmRvIGVsIGNvbnRlbmlkbyBkZSBsYSBtZW1vcmlhOiAqKiANCi0tLQ0KYGBge3J9DQpybShsaXN0PWxzKCkpDQpgYGANCg0KKipBaG9yYSwgaW5zdGFsZW1vcyBsYXMgYmlibGlvdGVjYXMgcXVlIG5lY2VzaXRhbW9zLiBUZW5nYSBlbiBjdWVudGEgcXVlLCBlbiBlbCBzaWd1aWVudGUgZnJhZ21lbnRvLCBjdWFscXVpZXIgcGFxdWV0ZSBzZSBpbnN0YWxhIHNvbG8gc2kgbm8gc2UgaGEgaW5zdGFsYWRvIHByZXZpYW1lbnRlLioqDQoNCmBgYHtyfQ0KbGlzdC5vZi5wYWNrYWdlcyA8LSBjKCJoZXJlIiwgInRpZHl2ZXJzZSIsICJyZ2VvcyIsICJtYXB0b29scyIsICJyYXN0ZXIiLCAic2YiLCAgInZpcmlkaXMiLCAicm5hdHVyYWxlYXJ0aCIsICJHU09EUiIsICJnZ3JlcGVsIiwgImNvd3Bsb3QiKQ0KbmV3LnBhY2thZ2VzIDwtIGxpc3Qub2YucGFja2FnZXNbIShsaXN0Lm9mLnBhY2thZ2VzICVpbiUgaW5zdGFsbGVkLnBhY2thZ2VzKClbLCJQYWNrYWdlIl0pXQ0KaWYobGVuZ3RoKG5ldy5wYWNrYWdlcykpIGluc3RhbGwucGFja2FnZXMobmV3LnBhY2thZ2VzKQ0KYGBgDQoNCioqQWhvcmEsIGNhcmd1ZW1vcyBsYXMgYmlibGlvdGVjYXMqKg0KDQpgYGB7cn0NCmxpYnJhcnkoaGVyZSkNCmBgYA0KDQpgYGB7cn0NCmxpYnJhcnkodGlkeXZlcnNlKQ0KYGBgDQoNCmBgYHtyfQ0KbGlicmFyeShyZ2VvcykNCmBgYA0KDQpgYGB7cn0NCmxpYnJhcnkobWFwdG9vbHMpDQpgYGANCg0KYGBge3J9DQpsaWJyYXJ5KHJhc3RlcikNCmBgYA0KDQpgYGB7cn0NCmxpYnJhcnkoc2YpDQpgYGANCg0KYGBge3J9DQpsaWJyYXJ5KHZpcmlkaXMpDQpgYGANCg0KYGBge3J9DQpsaWJyYXJ5KHJuYXR1cmFsZWFydGgpDQpsaWJyYXJ5KEdTT0RSKQ0KbGlicmFyeShnZ3JlcGVsKQ0KbGlicmFyeShjb3dwbG90KQ0KYGBgDQoNCiMgRXhwbG9yYW5kbyBsYXMgZXN0YWTDrXN0aWNhcyBhZ3LDrWNvbGFzIGVuIEFyYXVjYQ0KDQpQcmV2aWFtZW50ZSwgaGUgZGVzY2FyZ2FkbyBkYXRvcyBlc3RhZMOtc3RpY29zLCBlbiBmb3JtYXRvIGNzdiwgc29icmUgW0VzdGFkaXN0aWNhcyBNdW5pY2lwYWxlcyBBZ3JvcGVjdWFyaWFzXShodHRwczovL3d3dy5kYXRvcy5nb3YuY28vQWdyaWN1bHR1cmEteS1EZXNhcnJvbGxvLVJ1cmFsL0V2YWx1YWNpb25lcy1BZ3JvcGVjdWFyaWFzLU11bmljaXBhbGVzLUVWQS8ycG53LW1tZ2UpIGEgbWkgY29tcHV0YWRvcmEuIEx1ZWdvLCBoZSB1c2FkbyBFeGNlbCBwYXJhIGVsaW1pbmFyIGZpbGFzIHBhcmEgbXVuaWNpcGlvcyBlbiBkZXBhcnRhbWVudG9zIGRpZmVyZW50ZXMgYSBBcmF1Y2EuIEd1YXJkw6kgZWwgYXJjaGl2byBjb24gbGFzIGZpbGFzIHJlc3RhbnRlcyBjb21vIHVuIGFyY2hpdm8gbG9jYWwgY29uIGVsIG5vbWJyZSBFVkFfQXJhdWNhLmNzdiBlbiBtaSBjb21wdXRhZG9yYS4gTHVlZ28sIGNhcmd1w6kgZWwgYXJjaGl2byBlbiBsYSBjYXJwZXRhIGFncm8gZW4gUlN0dWRpby4NCg0KYGBge3J9DQpsaXN0LmZpbGVzKCkNCmBgYA0KDQpgYGB7cn0NCmRhdG9zIDwtIHJlYWRfY3N2KCIuL0VWQV9BcmF1Y2FyLmNzdiIpDQpgYGANCg0KYGBge3J9DQpoZWFkKGRhdG9zKQ0KYGBgDQoNCmBgYHtyfQ0KdGFpbChkYXRvcykNCmBgYA0KDQpUZW5nYSBlbiBjdWVudGEgcXVlIGNhZGEgbXVuaWNpcGlvIHRpZW5lIGVzdGFkw61zdGljYXMgc29icmUgc3VwZXJmaWNpZSBzZW1icmFkYSwgc3VwZXJmaWNpZSBjb3NlY2hhZGEgeSByZW5kaW1pZW50byBwYXJhIGRpZmVyZW50ZXMgY3VsdGl2b3MgZW4gZGlmZXJlbnRlcyBhw7Fvcy4gRWwgYXRyaWJ1dG8gU1VCR1JVUE8geSBDVUxUSVZPIHBhcmVjZW4gcmVmZXJpcnNlIGEgbG8gbWlzbW8gKGVzIGRlY2lyLCB1biBjdWx0aXZvKS4gTG9zIGN1bHRpdm9zIHNlIGNsYXNpZmljYW4gYWRlbcOhcyBlbiB1biBHUlVQTyBkZXRlcm1pbmFkby4NCg0KRW4gZXN0YSB0YWJsYSwgbm8gdGVuZW1vcyB1bmlkYWRlcy4gU2luIGVtYmFyZ28sIHNpIHJldmlzYW1vcyBlbCBhcmNoaXZvIGNzdiBvcmlnaW5hbCwgZW5jb250cmFtb3MgcXVlIGxhcyB1bmlkYWRlcyBkZSDDoXJlYSBzb24gaGVjdMOhcmVhcyB5IHF1ZSBsYXMgdW5pZGFkZXMgZGUgcmVuZGltaWVudG8gc29uIFRvbiAvIGhhLg0KDQpVc2FyZW1vcyBsYSBiaWJsaW90ZWNhIGRwbHlyIHBhcmEgZXhwbG9yYXIgZWwgY29udGVuaWRvIGRlbCBvYmpldG8gZGUgZGF0b3MuDQoNClByaW1lcm8sIG9idGVuZ2Ftb3MgdW4gcmVzdW1lbiBkZWwgcmVuZGltaWVudG8gKGVzIGRlY2lyLCBlbCByZW5kaW1pZW50byBwcm9tZWRpbyBkdXJhbnRlIHZhcmlvcyBhw7FvcykgcG9yIGdydXBvIHkgbXVuaWNpcGlvOg0KDQpgYGB7cn0NCmRhdG9zICU+JQ0KICBncm91cF9ieShNVU5JQ0lQSU8sIEdSVVBPKSAlPiUNCiAgc3VtbWFyaXNlKHJlbmRfcHJvbSA9IG1lYW4oUmVuZGltaWVudG8sIG5hLnJtID0gVFJVRSkpIC0+IHJlbmRfcmVzdW1lbg0KIyMjIExldCdzIHZpc3VhbGl6ZSBvbmx5IHRoZSBmaXJzdCBzaXggcmVjb3Jkcw0KaGVhZChyZW5kX3Jlc3VtZW4pDQpgYGANCg0KVGFtYmnDqW4gcG9kZW1vcyBjYWxjdWxhciBlbCByZW5kaW1pZW50byBwcm9tZWRpbyBwb3IgR1JVUE8gZW4gbG9zIG11bmljaXBpb3MgZGUgQXJhdWNhOg0KDQpgYGB7cn0NCmRhdG9zICU+JQ0KICBncm91cF9ieShHUlVQTykgJT4lDQogIHN1bW1hcmlzZShyZW5kX2RlcCA9IG1lYW4oUmVuZGltaWVudG8sIG5hLnJtID0gVFJVRSkpIC0+IHJlbmRfYXJhdWNhDQoNCnJlbmRfYXJhdWNhDQpgYGANCg0KTsOzdGVzZSBxdWUgbG9zIG1heW9yZXMgcmVuZGltaWVudG9zIGNvcnJlc3BvbmRlbiBhIENFUkVBTEVTLCBQTEFOVEFTIEFST01BVElDQVMgQ09ORElNRU5UQVJJQVMgWSBNRURJQ0lOQUxFUywgVFVCRVJDVUxPUyBZIFBMQVRBTk9TLg0KDQpMdWVnbywgYnVzcXVlbW9zIGN1w6FsZXMgc29uIGxvcyBtdW5pY2lwaW9zIGNvbiBtYXlvciByZW5kaW1pZW50byBwYXJhIGNhZGEgZ3J1cG8gZGUgY3VsdGl2b3MgZW4gMjAxODoNCg0KYGBge3J9DQpkYXRvcyAlPiUgDQogIGZpbHRlcihZRUFSPT0yMDE4KSAlPiUgDQogIGdyb3VwX2J5KEdSVVBPLCBNVU5JQ0lQSU8pICU+JQ0KICBzdW1tYXJpemUobWF4X3JlbmQgPSBtYXgoUmVuZGltaWVudG8sIG5hLnJtID0gVFJVRSkpICU+JQ0KICAgIHNsaWNlKHdoaWNoLm1heChtYXhfcmVuZCkpIC0+IHJlbmRfbWF4XzE4DQoNCnJlbmRfbWF4XzE4DQpgYGANCg0KQWhvcmEsIGJ1c3F1ZW1vcyBjdcOhbGVzIHNvbiBsb3MgbXVuaWNpcGlvcyBjb24gbWF5b3Igw6FyZWEgY29zZWNoYWRhIHBhcmEgY2FkYSBncnVwbyBkZSBjdWx0aXZvcyBlbiAyMDE4Og0KDQpgYGB7cn0NCmRhdG9zICU+JSANCiAgZmlsdGVyKFlFQVI9PTIwMTgpICU+JSANCiAgZ3JvdXBfYnkoR1JVUE8sIE1VTklDSVBJTykgJT4lDQogIHN1bW1hcml6ZShtYXhfYXJlYV9jb3NlY2hhID0gbWF4KEFyZWFfQ29zZWNoYSwgbmEucm0gPSBUUlVFKSkgJT4lDQogICAgc2xpY2Uod2hpY2gubWF4KG1heF9hcmVhX2Nvc2VjaGEpKSAtPiBhcmVhX2Nvc2VjaGFfbWF4DQoNCmFyZWFfY29zZWNoYV9tYXgNCmBgYA0KDQpDYWJlIGRlc3RhY2FyIHF1ZSBsYSBtYXlvciBzdXBlcmZpY2llIGNvc2VjaGFkYSBlbiAyMDE4IGNvcnJlc3BvbmRpw7MgYSBUVUJFUkNVTE9TIFkgUExBVEFOT1MgZW4gVEFNRS4NCg0KTGEgYWN0aXZpZGFkIGVjb27Ds21pY2EgZW4gQXJhdWNhIGVuIGN1YW50byBhIGFncmljdWx0dXJhIHNlIHRyYXRhLCBlbmNvbnRyYW1vcyBjdWx0aXZvcyBjb21vIGVsIENhY2FvLCBhcnJveiBtZWNhbml6YWRvLCBtYcOteiB0cmFkaWNpb25hbCB5IHl1Y2E7IE1pZW50cmFzIHF1ZSBlbiBvdHJvcyBhc3BlY3RvcyBlY29uw7NtaWNvcyBzZSBkZXN0YWNhIHBvciBzZXIgdW5hIHpvbmEgZ2FuYWRlcmEsIGRlIGNhemEsIHNpbHZpY3VsdHVyYSB5IHBlc2NhLCBhZGVtw6FzIGRlIHRlbmVyIHpvbmFzIGRlIGV4dHJhY2Npw7NuIGRlIGhpZHJvY2FyYnVyb3MuDQoNClByaW1lcm8sIHNlbGVjY2lvbmVtb3MgbGEgcHJvZHVjY2nDs24gZGUgcGzDoXRhbm9zICh0b25lbGFkYXMpIGVuIFRBTUUgcGFyYSBjYWRhIGHDsW86DQoNCmBgYHtyfQ0KZGF0b3MgJT4lIA0KICBmaWx0ZXIoTVVOSUNJUElPPT0iVEFNRSIgJiBTVUJHUlVQTz09IlBMQVRBTk8iKSAlPiUgDQogIGdyb3VwX2J5KFlFQVIsIENVTFRJVk8pIC0+ICB0YW1lX3BsYXRhbm8NCg0KdGFtZV9wbGF0YW5vDQpgYGANCg0KSGFnYW1vcyB1bmEgZXhwbG9yYWNpw7NuIGdyw6FmaWNhIGLDoXNpY2E6DQoNCmBgYHtyfQ0KIyB3ZSB1c2UgdGhlIGdncGxvdCAyIGxpYnJhcnkNCmcgPC0gZ2dwbG90KGFlcyh4PVlFQVIsIHk9UHJvZHVjY2lvbi8xMDAwKSwgZGF0YSA9IHRhbWVfcGxhdGFubykgKyBnZW9tX2JhcihzdGF0PSdpZGVudGl0eScpICsgbGFicyh5PSdQbGF0YW5vIFByb2R1Y3Rpb24gW1RvbiB4IDEwMDBdJykNCmBgYA0KDQpgYGB7cn0NCmcgKyBnZ3RpdGxlKCJFdm9sdXRpb24gb2YgUGxhdGFubyBQcm9kdWN0aW9uIGluIFRhbWUgZnJvbSAyMDA3IHRvIDIwMTgiKSArIGxhYnMoY2FwdGlvbj0gIkJhc2VkIG9uIEVNQSBkYXRhIChEQU5FLCAyMDE4KSIpDQpgYGANCg0KQWhvcmEsIGludmVzdGlndWVtb3MgcXXDqSBjdWx0aXZvcyB0dXZpZXJvbiBsYSBtYXlvciDDoXJlYSBjb3NlY2hhZGEgZW4gMjAxODoNCg0KYGBge3J9DQpkYXRvcyAlPiUgDQogIGZpbHRlcihZRUFSPT0yMDE4KSAlPiUgDQogIGdyb3VwX2J5KEdSVVBPKSAlPiUNCiAgc3VtbWFyaXplKHN1bV9hcmVhX2Nvc2VjaGEgPSBzdW0oQXJlYV9Db3NlY2hhLCBuYS5ybSA9IFRSVUUpKSAlPiUNCiAgICAgYXJyYW5nZShkZXNjKHN1bV9hcmVhX2Nvc2VjaGEpKSAtPiB0b3RhbF9hcmVhX2Nvc2VjaGENCg0KdG90YWxfYXJlYV9jb3NlY2hhDQpgYGANCg0KUG9kZW1vcyB2ZXIgcXVlIHR1YmVyY3Vsb3MgeSBwbGF0YW5vcyB0dXZpZXJvbiBsYSBtYXlvciBwYXJ0ZSBkZWwgw6FyZWEgY29zZWNoYWRhIGVuIDIwMTggcGFyYSBBcmF1Y2EuIMK/UXXDqSBjdWx0aXZvcyBwZXJ0ZW5lY2VuIGEgZXN0ZSBHUlVQTz8gUHVlZGUgYnVzY2FyIG3DoXMgaW5mb3JtYWNpw7NuIGVuIERBTkUsIGxhIGFnZW5jaWEgZ3ViZXJuYW1lbnRhbCBhIGNhcmdvIGRlIGxhcyBlc3RhZMOtc3RpY2FzIG5hY2lvbmFsZXMgZW4gQ29sb21iaWEuDQoNClRhbWJpw6luIHBvZGVtb3MgYnVzY2FyIGVzdGEgaW5mb3JtYWNpw7NuIGVuIGxvcyBwcm9waW9zIGRhdG9zOg0KDQpgYGB7cn0NCmRhdG9zICU+JQ0KICBmaWx0ZXIoR1JVUE89PSJUVUJFUkNVTE9TIFkgUExBVEFOT1MiICYgWUVBUj09MjAxOCkgJT4lDQogIGdyb3VwX2J5KENVTFRJVk8pICU+JQ0KICBzdW1tYXJpemUoc3VtX2Nvc2VjaGEgPSBzdW0oQXJlYV9Db3NlY2hhLCBuYS5ybSA9IFRSVUUpKSAlPiUNCiAgICAgYXJyYW5nZShkZXNjKHN1bV9jb3NlY2hhKSkgLT4gdG90YWxfY29zZWNoYQ0KDQoNCnRvdGFsX2Nvc2VjaGENCmBgYA0KDQpUZW5nYSBlbiBjdWVudGEgcXVlIGxvcyBjdWx0aXZvcyBkZSBwbGF0YW5vIHNvbiBsYSBjbGF2ZSBlbiBsYSBhZ3JpY3VsdHVyYSBkZSBBcmF1Y2EuDQoNCkFob3JhIHZlYW1vcyBjdWFsZXMgc29uIGxvcyBtdW5pY2lwaW9zIGNvbiBtYXlvciDDoXJlYSBjb3NlY2hhZGEgcGFyYSBlbCBjdWx0aXZvIGRlIHBsw6F0YW5vIHkgeXVjYSBlbiAyMDE4Lg0KDQpgYGB7cn0NCmRhdG9zICU+JSANCiAgZmlsdGVyKFlFQVI9PTIwMTggJiBHUlVQTz09IlRVQkVSQ1VMT1MgWSBQTEFUQU5PUyIpICU+JSANCiAgZ3JvdXBfYnkoQ1VMVElWTywgTVVOSUNJUElPKSAlPiUNCiAgc3VtbWFyaXplKG1heF9hcmVhMiA9IG1heChBcmVhX0Nvc2VjaGEsIG5hLnJtID0gVFJVRSkpICU+JQ0KICAgIHNsaWNlKHdoaWNoLm1heChtYXhfYXJlYTIpKSAtPiBhcmVhX2Nvc2VjaGEyDQoNCmFyZWFfY29zZWNoYTINCmBgYA0KDQpSZWdyZXNlbW9zIGEgbG9zIGRhdG9zIGRlIHR1YmVyY3Vsb3MgeSBwbMOhdGFub3MuIEFudGVzIGRlIGdyYWZpY2FyLCBuZWNlc2l0YXJlbW9zIGFncmVnYXIsIGFsIG9iamV0byB0b3RhbF9hcmVhX2Nvc2VjaGEsIHVuIG51ZXZvIGNhbXBvIGNvbiBhYnJldmlhdHVyYXMgcGFyYSBjYWRhIEdSVVBPIGRlIGN1bHRpdm9zLiBEZSBsbyBjb250cmFyaW8sIGxhIHRyYW1hIHNlIHZlcsOhIGRlc29yZGVuYWRhLg0KDQpgYGB7cn0NCnRvdGFsX2FyZWFfY29zZWNoYSRDUk9QIDwtIGFiYnJldmlhdGUodG90YWxfYXJlYV9jb3NlY2hhJEdSVVBPLCAzKQ0KYGBgDQoNCkFob3JhIGVzIGVsIG1vbWVudG8gZGUgdHJhemFyOg0KDQpgYGB7cn0NCiMgd2UgdXNlIHRoZSBnZ3Bsb3QgMiBsaWJyYXJ5DQpnIDwtIGdncGxvdChhZXMoeD1DUk9QLCB5PXN1bV9hcmVhX2Nvc2VjaGEpLCBkYXRhID0gdG90YWxfYXJlYV9jb3NlY2hhKSArIGdlb21fYmFyKHN0YXQ9J2lkZW50aXR5JykgKyBsYWJzKHk9J1RvdGFsIEhhcnZlc3RlZCBBcmVhIFtIYV0nKQ0KYGBgDQoNCmBgYHtyfQ0KZysgZ2d0aXRsZSgiVG90YWwgaGFydmVzdGVkIGFyZWEgYnkgY3JvcCBncm91cHMgaW4gMjAxOCBmb3IgQXJhdWNhIikgKyB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41KSkgKw0KICAgbGFicyhjYXB0aW9uPSAiQmFzZWQgb24gRU1BIGRhdGEgKERBTkUsIDIwMTgpIikNCg0KYGBgDQoNClB1ZWRlIGV4cGxvcmFyIG3DoXMgbGFzIGVzdGFkw61zdGljYXMgY29ycmVzcG9uZGllbnRlcyBhIHN1IGRlcGFydGFtZW50by4gSW50ZW50ZSBvYnRlbmVyIGluZm9ybWFjacOzbiBzb2JyZSBlbCByZW5kaW1pZW50byBkZSBkaWZlcmVudGVzIGN1bHRpdm9zLCBwcmluY2lwYWxtZW50ZSBhcXVlbGxvcyBxdWUgc29uIGVzZW5jaWFsZXMgcGFyYSBsYSBlY29ub23DrWEgZGUgc3UgZGVwYXJ0YW1lbnRvLg0KDQojIFVuaWVuZG8gbGFzIGVzdGFkw61zdGljYXMgYWdyw61jb2xhcyBhIGxvcyBtdW5pY2lwaW9zDQoNCllhIGhlIHN1YmlkbyBhIFJTdHVkaW8gbG9zIGRhdG9zIGFkbWluaXN0cmF0aXZvcyBkZSBBcmF1Y2EuIENvbW8gc2UgY29tZW50w7MgYW50ZXJpb3JtZW50ZSBlbiB1bmEgY2xhc2UgdmlydHVhbCwgZXMgdW5hIGJ1ZW5hIGlkZWEgdXRpbGl6YXIgZWwgc2hhcGVmaWxlIGNvcnJlc3BvbmRpZW50ZSBhIE1hcmNvIEdlb2VzdGFkaXN0aWNvIERlcGFydGFtZW50YWwgcXVlIHNlIGVuY3VlbnRyYSBkaXNwb25pYmxlIGVuIERBTkUgR2VvcG9ydGFsLg0KDQpDb21lbmNlbW9zIGEgbGVlciBsb3MgZGF0b3MgdXNhbmRvIGxhIGJpYmxpb3RlY2Egc2Y6DQoNCmBgYHtyfQ0KYW50X211bmljIDwtIHNmOjpzdF9yZWFkKCIuLzgxX0FSQVVDQS9BRE1JTklTVFJBVElWTy9NR05fTVBJT19QT0xJVElDTy5zaHAiKQ0KYGBgDQoNCsK/UXXDqSBlcyBhbnRfbXVuaWM/DQoNCmBgYHtyfQ0KYW50X211bmljDQpgYGANCg0KVGVuZ2EgZW4gY3VlbnRhIHF1ZSBhbnRfbXVuaWMgZXMgdW5hIGNvbGVjY2nDs24gZGUgZnVuY2lvbmVzIHNpbXBsZS4gQXNlZ8O6cmVzZSBkZSByZXZpc2FyIGVzdGUgZW5sYWNlIHBhcmEgY29tcHJlbmRlciBxdcOpIGVzIHVuYSBjYXJhY3RlcsOtc3RpY2Egc2ltcGxlLg0KDQpUZW5nYSBlbiBjdWVudGEgdGFtYmnDqW4gcXVlIGxvcyBkYXRvcyB1dGlsaXphbiBlbCBzaXN0ZW1hIGRlIHJlZmVyZW5jaWEgZGUgY29vcmRlbmFkYXMgZ2VvZ3LDoWZpY2FzIFdHUzE5ODQgKGVzIGRlY2lyLCBlbCBjw7NkaWdvIDQzMjYgZXBzZykuDQoNClBvZGVtb3MgdXNhciBsYSBmdW5jacOzbiBsZWZ0X2pvaW4gcGFyYSB1bmlyIGxvcyBtdW5pY2lwaW9zIHkgbGFzIGVzdGFkw61zdGljYXMgYWdyw61jb2xhcyBzZWxlY2Npb25hZGFzLiANCg0KTmVjZXNpdGFtb3MgdW4gYXRyaWJ1dG8gY29tw7puIChvIHZhcmlhYmxlIGNvbXBhcnRpZGEpIGVuIGVsIHF1ZSBiYXNhciBsYSB1bmnDs24uIEVsIG1lam9yIGF0cmlidXRvIGVzIHVuYSBpZGVudGlmaWNhY2nDs24uIEVuIGFudF9tdW5pYywgZWwgYXRyaWJ1dG8gTVBJT19DQ0RHTyBwYXJlY2UgZXN0YXIgYmllbiAobGVlIDgxIHBhcmEgQXJhdWNhKS4gRW4gZGF0b3MsIGVsIGF0cmlidXRvIGNvcnJlc3BvbmRpZW50ZSBlcyBDT0RfTVVOIChsZWUgODEgcGFyYSBBcmF1Y2EpLg0KDQpWZXJpZmlxdWVtb3MgbGEgw7psdGltYSBkZWNsYXJhY2nDs246DQoNCmBgYHtyfQ0KZGF0b3MgJT4lIGZpbHRlciAoTVVOSUNJUElPID09IlRBTUUiKSAtPiAgYXJhX2RhdG9zDQpgYGANCg0KYGBge3J9DQphcmFfZGF0b3MNCmBgYA0KDQpgYGB7cn0NCmNsYXNzKGFyYV9kYXRvcyRDT0RfTVVOKQ0KYGBgDQoNClBhcmEgcG9kZXIgaGFjZXIgbGEgdW5pw7NuLCBuZWNlc2l0YW1vcyBjYW1iaWFyIHRhbnRvIGVsIHRpcG8gZGUgZGF0b3MgY29tbyBlbCBjb250ZW5pZG8gZGVsIGPDs2RpZ28gcXVlIGlkZW50aWZpY2EgYSBjYWRhIG11bmljaXBpby4gUGFyYSBlc3RhIHRhcmVhLCBlcyB1bmEgYnVlbmEgaWRlYSBjcmVhciB1bmEgY29waWEgZGUgbG9zIGRhdG9zIGVzdGFkw61zdGljb3Mgb3JpZ2luYWxlcy4gQ29uIGVzdGUgZW5mb3F1ZSwgY3VhbHF1aWVyIG1vdmltaWVudG8gZmFsc28gbm8gZXN0cm9wZWFyw6EgbG9zIGRhdG9zIG9yaWdpbmFsZXMuDQoNClByb2NlZGFtb3MgcGFzbyBhIHBhc286DQoNCmBgYHtyfQ0KZGF0b3MyIDwtIGRhdG9zDQpgYGANCg0KYGBge3J9DQpkYXRvczIkVEVNUCA8LSAgYXMuY2hhcmFjdGVyKGRhdG9zMiRDT0RfTVVOKQ0KYGBgDQoNCmBgYHtyfQ0KZGF0b3MyJE1QSU9fQ0NER08gPC0gYXMuZmFjdG9yKGRhdG9zMiRURU1QKQ0KYGBgDQoNCmBgYHtyfQ0KaGVhZChkYXRvczIpDQpgYGANCg0KQXNlZ8O6cmVzZSBkZSB2ZXJpZmljYXIsIGVuIGVsIG9iamV0byBkYXRvcyAyLCBsYXMgY2FyYWN0ZXLDrXN0aWNhcyBkZWwgbnVldm8gYXRyaWJ1dG8gTVBJT19DQ0RHTy4NCg0KQWhvcmEsIGZpbHRyZW1vcyB1biBzb2xvIGHDsW8geSBzZWxlY2Npb25lbW9zIHNvbG8gZG9zIGF0cmlidXRvcyByZWxldmFudGVzOg0KDQpgYGB7cn0NCmRhdG9zMiAlPiUgZmlsdGVyKENVTFRJVk8gPT0gIlBMQVRBTk8iKSAgLT4gZGF0b3MzDQpgYGANCg0KYGBge3J9DQpoZWFkKGRhdG9zMykNCmBgYA0KDQpgYGB7cn0NCmNsYXNzKGRhdG9zMykNCmBgYA0KDQpgYGB7cn0NCmRhdG9zNCA8LSBkYXRvczMgJT4lIGRwbHlyOjpzZWxlY3QoTVVOSUNJUElPLCBNUElPX0NDREdPLCBZRUFSLCBQcm9kdWNjaW9uLCBSZW5kaW1pZW50bykNCmBgYA0KDQpgYGB7cn0NCmRhdG9zNA0KYGBgDQoNCmBgYHtyfQ0KZGF0b3M0ICU+JSANCiAgZ2F0aGVyKCJZRUFSIiwgIlByb2R1Y2Npb24iLCAiUmVuZGltaWVudG8iICwga2V5ID0gdmFyaWFibGUsIHZhbHVlID0gbnVtYmVyKQ0KYGBgDQoNCmBgYHtyfQ0KaGVhZChkYXRvczQpDQpgYGANCg0Kw4lzdGEgZXMgdW5hIHRhcmVhIGNsYXZlLiBJbXBsaWNhIHZhcmlvcyBwYXNvcyBwYXJhIHBvZGVyIGNvbnZlcnRpciBsYSB0YWJsYSBkZSBhdHJpYnV0b3MgZGUgZm9ybWF0byBsYXJnbyBhIGZvcm1hdG8gYW5jaG8uIE3DoXMgaW5mb3JtYWNpw7NuIHNvYnJlIGVzdG9zIHBhc29zIFthcXXDrV0oaHR0cHM6Ly9kYXRhc2NpZW5jZXBsdXMuY29tL2NvbnZlcnRpbmctZGF0YS1mcm9tLWxvbmctdG8td2lkZS1hbmQtZnJvbS13aWRlLXRvLWxvbmctc2ltcGxpZmllZC10aWR5dmVyc2UtcGFja2FnZS8pDQoNCmBgYHtyfQ0KZGF0b3M0ICU+JSANCiAgZ3JvdXBfYnkoTVBJT19DQ0RHTykgJT4lIA0KICBtdXRhdGUoVmlzaXQgPSAxOm4oKSkgJT4lIA0KICBnYXRoZXIoIllFQVIiLCAiUHJvZHVjY2lvbiIsICJSZW5kaW1pZW50byIsIGtleSA9IHZhcmlhYmxlLCB2YWx1ZSA9IG51bWJlcikgJT4lIA0KICB1bml0ZShjb21iaSwgdmFyaWFibGUsIFZpc2l0KSAlPiUNCiAgc3ByZWFkKGNvbWJpLCBudW1iZXIpIC0+IGRhdG9zNQ0KYGBgDQoNCmBgYHtyfQ0KaGVhZChkYXRvczUpDQpgYGANCg0KYGBge3J9DQp0YWlsKGRhdG9zNSkNCmBgYA0KDQpUYW1iacOpbiBoYXJlbW9zIHVuYSBjb3BpYSBkZSBsYSBjb2xlY2Npw7NuIGRlIGNhcmFjdGVyw61zdGljYXMgc2ltcGxlcyAobnVldmFtZW50ZSwgc29sbyBlbiBjYXNvIGRlIHVuIG1vdmltaWVudG8gZW4gZmFsc28pOg0KDQpgYGB7cn0NCmFudF9tdW5pYzIgPC0gYW50X211bmljDQpgYGANCg0KQWhvcmEgZXMgZWwgbW9tZW50byBkZSB1bmlyc2U6DQoNCmBgYHtyfQ0KYW50X211bmljX3N0YXQgPSBsZWZ0X2pvaW4oYW50X211bmljMiwgZGF0b3M1LCBieT0iTVBJT19DQ0RHTyIpDQoNCmBgYA0KDQpgYGB7cn0NCnN1bW1hcnkoYW50X211bmljX3N0YXQpDQpgYGANCg0KIyBHcmFmaWNhcjoNCg0KYGBge3J9DQojaW5zdGFsbC5wYWNrYWdlcygiUkNvbG9yQnJld2VyIikNCmxpYnJhcnkoUkNvbG9yQnJld2VyKQ0KbGlicmFyeShsZWFmbGV0KQ0KYGBgDQoNCkdyYWZpcXVlbW9zIGxvcyBtdW5pY2lwaW9zIGNvbiBzdSBjb3JyZXNwb25kaWVudGUgcHJvZHVjY2nDs24gZGUgUGzDoXRhbm8gcGFyYSB1biBzb2xvIGHDsW86DQoNCmBgYHtyfQ0KYmlucyA8LSBjKDAsIDI1MDAsIDUwMDAsIDEwMDAwLCAyMDAwMCwgNTAwMDAsIDEwMDAwMCwgMTUwMDAwMCkNCnBhbCA8LSBjb2xvckJpbigiU3BlY3RyYWwiLCBkb21haW4gPSBhbnRfbXVuaWNfc3RhdCRQcm9kdWNjaW9uXzExLCBiaW5zID0gYmlucykNCg0KICBtYXBhIDwtIGxlYWZsZXQoZGF0YSA9IGFudF9tdW5pY19zdGF0KSAlPiUNCiAgYWRkVGlsZXMoKSAlPiUNCiAgYWRkUG9seWdvbnMobGFiZWwgPSB+UHJvZHVjY2lvbl8xMSwNCiAgICAgICAgICAgICAgcG9wdXAgPSB+TVBJT19DTk1CUiwNCiAgICAgICAgICAgICAgZmlsbENvbG9yID0gfnBhbChQcm9kdWNjaW9uXzExKSwNCiAgICAgICAgICAgICAgY29sb3IgPSAiIzQ0NDQ0NCIsDQogICAgICAgICAgICAgIHdlaWdodCA9IDEsDQogICAgICAgICAgICAgIHNtb290aEZhY3RvciA9IDAuNSwNCiAgICAgICAgICAgICAgb3BhY2l0eSA9IDEuMCwNCiAgICAgICAgICAgICAgZmlsbE9wYWNpdHkgPSAwLjUsDQogICAgICAgICAgICAgIGhpZ2hsaWdodE9wdGlvbnMgPSBoaWdobGlnaHRPcHRpb25zKGNvbG9yID0gIndoaXRlIiwgd2VpZ2h0ID0gMiwgYnJpbmdUb0Zyb250ID0gVFJVRSkNCiAgICAgICAgICAgICAgKSAlPiUNCiAgYWRkUHJvdmlkZXJUaWxlcyhwcm92aWRlcnMkT3BlblN0cmVldE1hcCkgJT4lDQogIGFkZExlZ2VuZCgiYm90dG9tcmlnaHQiLCBwYWwgPSBwYWwsIHZhbHVlcyA9IH5Qcm9kdWNjaW9uXzExLA0KICAgIHRpdGxlID0gIlByb2R1Y2Npw7NuIGRlIHBsYXRhbm8gZW4gQXJhdWNhIFtUb25dICgyMDE4KSIsDQogICAgb3BhY2l0eSA9IDENCiAgKQ0KYGBgDQoNCmBgYHtyfQ0KbWFwYQ0KYGBgDQoNClRlbmdhIGVuIGN1ZW50YSBxdWUgdXRpbGljw6kgdGFudG8gZXRpcXVldGFzIGNvbW8gdmVudGFuYXMgZW1lcmdlbnRlcyBlbiBlc3RlIG1hcGEuIEVuIGNhc28gZGUgcXVlIGRlc2VlIG9idGVuZXIgbcOhcyBpbmZvcm1hY2nDs24gc29icmUgY8OzbW8gZGlidWphciBtYXBhcyBpbnRlcmFjdGl2b3MgY29uIGZvbGxldG8sIHNpZ2EgZXN0ZSBbZW5sYWNlXShodHRwczovL2Nmc3MudWNoaWNhZ28uZWR1L25vdGVzL2xlYWZsZXQvI2Nob3JvcGxldGgtb2YtaG9taWNpZGVzLWJ5LW5laWdoYm9yaG9vZCkuDQoNCkFob3JhIHRyYXphcmVtb3MgZWwgcmVuZGltaWVudG8gcG9yIG11bmljaXBpby4NCg0KYGBge3J9DQpiaW5zIDwtIGMoMCwgNSwgMTAsIDE1LCAyMCwgMjUsIDMwLCAzNSkNCnBhbCA8LSBjb2xvckJpbigiWWxPclJkIiwgZG9tYWluID0gYW50X211bmljX3N0YXQkUmVuZGltaWVudG9fMTEsIGJpbnMgPSBiaW5zKQ0KDQogIG1hcGEgPC0gbGVhZmxldChkYXRhID0gYW50X211bmljX3N0YXQpICU+JQ0KICBhZGRUaWxlcygpICU+JQ0KICBhZGRQb2x5Z29ucyhsYWJlbCA9IH5SZW5kaW1pZW50b18xMSwNCiAgICAgICAgICAgICAgcG9wdXAgPSB+TVBJT19DTk1CUiwNCiAgICAgICAgICAgICAgZmlsbENvbG9yID0gfnBhbChSZW5kaW1pZW50b18xMSksDQogICAgICAgICAgICAgIGNvbG9yID0gIiM0NDQ0NDQiLA0KICAgICAgICAgICAgICB3ZWlnaHQgPSAxLA0KICAgICAgICAgICAgICBzbW9vdGhGYWN0b3IgPSAwLjUsDQogICAgICAgICAgICAgIG9wYWNpdHkgPSAxLjAsDQogICAgICAgICAgICAgIGZpbGxPcGFjaXR5ID0gMC41LA0KICAgICAgICAgICAgICBoaWdobGlnaHRPcHRpb25zID0gaGlnaGxpZ2h0T3B0aW9ucyhjb2xvciA9ICJ3aGl0ZSIsIHdlaWdodCA9IDIsIGJyaW5nVG9Gcm9udCA9IFRSVUUpDQogICAgICAgICAgICAgICkgJT4lDQogIGFkZFByb3ZpZGVyVGlsZXMocHJvdmlkZXJzJE9wZW5TdHJlZXRNYXApICU+JQ0KICBhZGRMZWdlbmQoImJvdHRvbXJpZ2h0IiwgcGFsID0gcGFsLCB2YWx1ZXMgPSB+UmVuZGltaWVudG9fMTEsDQogICAgdGl0bGUgPSAiUmVuZGltaWVudG8gZGUgcGxhdGFubyBlbiBBcmF1Y2EgW1Rvbl0gKDIwMTgpIiwNCiAgICBvcGFjaXR5ID0gMQ0KICApDQpgYGANCg0KYGBge3J9DQptYXBhDQpgYGANCg0KQWwgY29udHJhc3RhciBsYSBwcm9kdWNjacOzbiBwb3IgbXVuaWNpcGlvIHJlc3BlY3RvIGFsIHJlbmRpbWllbnRvLCBwb2RlbW9zIGV2aWRlbmNpYWwgcXVlIGVuIGxvcyBtdW5pY2lwaW9zIGRlIFB1ZXJ0byBSb25kb24sIENyYXZvIE5vcnRlIHkgZW4gbWVub3IgbWVkaWRhIEFyYXVjYSwgZWwgcmVuZGltaWVudG8gZXMgY29uZ3J1ZW50ZSBjb24gbGEgcHJvZHVjY2nDs24sIGRlbm90YW5kbyBxdWUgZW4gZXN0b3MgZGVwYXJ0YW1lbnRvcyBubyBlcyBwcmlvcmlkYWQgdG90YWwgZWwgY3VsdGl2byBkZSBwbGF0YW5vLGxvIGN1YWwgZW50cmUgb3RyYXMsIGluZGljYSBlbCBncmFkbyBkZSBjb25jZW50cmFjacOzbiBwcm9kdWN0aXZhIHF1ZSBleGlzdGUgZW4gbG9zIGRlcGFydGFtZW50b3MgZGUgVGFtZSwgRm9ydHVsLCBTYXJhdmVuYSwgeSBBcmF1cXVpdGEuDQoNCkFob3JhIGVzIGVsIG1vbWVudG8gZGUgcmVwbGljYXIsIGFkYXB0YXIgeSBtZWpvcmFyIGVzdGUgY3VhZGVybm8gcGFyYSBleHBsb3JhciBsYXMgZXN0YWTDrXN0aWNhcyBhZ3LDrWNvbGFzIGRlIHN1IGRlcGFydGFtZW50by4NCg0KwqHCocKhQnVlbmEgc3VlcnRlISEhDQoNCmBgYHtyfQ0Kc2Vzc2lvbkluZm8oKQ0KYGBgDQoNCg0K