1. This notebook display a information some index La Guajira

This is an R Markdown Notebook. This is a infor for display thematic cartography a the Departament La Guajirain Colombia. It has been make, compiled and published in RPubs from RStudio.

Este cuaderno muestra información de algunos indices de la La Guajira Esta es una información para mostrar la cartografía temática en el Departamento de La Guajira en Colombia. Ha sido realizado, compilado y publicado en RPubs desde RStudio

Este cuaderno tiene como objetivo mostrar la elaboración de algunos mapas temáticos de La Guajira, aplicando los conocimientos aprendidos en la asignatura de Geomática Básica de la Universidad Nacional de Colombia en lenguaje R.

2. Cartografia temática

Según el IGAC, la cartografía temática es un conjunto de mapas elaborados que al incorporar la información objeto de estudio específico, representa las relaciones espaciales de una o varias variables geográficas, mediante la aplicación de técnicas visuales o semiología gráfica.

Estos mapas temáticos se elaboran a partir de la unión de bases de datos recopilados por entes gubernamentales con la cartográfica básica oficial, conformado por las capas temáticas y escala adecuada para el análisis de variables de estudio específico, todo esto mediante un programa especializado , para este caso R estudio.

Es de fácil visualización y entendimiento ya que se puede utilizar simbología en la cartografía temática, además se referencia variables de interés para los usuarios de la información geográfica, además sirve como un intercambio de esta información visual.

2.1 Mapa de coropleta

Son los que retrata los datos cuantitativos en diferentes colores sobre el mapa y puede mostrar la densidad, el porcentaje, el valor promedio o la cantidad de un evento dentro de un área geográfica. Los colores secuenciales representan valores de datos positivos o negativos crecientes o decrecientes. Normalmente, cada color también representa un rango de valores.

2.2 Mapa de símbolos proporcionales o graduados

Se usan en otro tipo de mapa para representar datos asociados con ubicaciones, como ciudades. Los datos se muestran en estos mapas con símbolos de tamaño proporcional para mostrar las diferencias en las ocurrencias. Los círculos se usan con mayor frecuencia, pero los cuadrados y otras formas geométricas también son adecuados. La forma más común de cambiar el tamaño de estos símbolos es hacer que sus áreas sean proporcionales a los valores que se representarán mediante el software de mapeo o dibujo.

2.3 Mapa isarítmico o de contorno

Este usa isolinas para representar valores continuos como los niveles de precipitación. Estos mapas también pueden mostrar valores tridimensionales, como la elevación, en mapas topográficos. En general, los datos para mapas isarítmicos se recopilan a través de puntos medibles (por ejemplo, estaciones meteorológicas) o se recopilan por área (por ejemplo, toneladas de Banano por hectárea por municipio). Los mapas isarítmicos también siguen la regla básica de que hay lados altos y bajos en relación con la isolina. Por ejemplo, en elevación, si la isolina es de 500 metros, entonces un lado debe ser más alto que 500 metros y un lado debe ser más bajo.

2.4 Mapa de puntos

Se utiliza puntos para mostrar la presencia de un tema y mostrar un patrón espacial. Un punto puede representar una unidad o varias, dependiendo de lo que se esté representando.

3. Datos

Para este caso se utilizaran datos sobre Necesidades Básicas Insatisfechas (NBI) del Censo Nacional de Población y Vivienda 2018 que están disponibles en el Geoportal DANE.

Los mapas temáticos son útiles para transmitir información demográfica. Puede explorar varios mapas temáticos como los del DANE.

Anteriormente, se descargó el archivo NBI, en formato .xlsx, a mi computadora. Luego, utilicé Excel para eliminar datos de municipios no ubicados dentro del Departamento de Antioquia. También “limpié” los datos, es decir, eliminé varias filas con imágenes institucionales o sin información. Estas filas se ubicaron tanto al principio como al final del archivo original. Mantengo las columnas que se refieren a todo el municipio (es decir, eliminé las columnas correspondientes a “cabecera” y “zona rural”). Guarde los datos resultantes, correspondientes solo a municipios del departamento de La Guajira como NBI-La_Guajira.xlsx. Luego, cargué el archivo en el directorio “nbi” en la carpeta de mi proyecto en RStudio.

4. Preparación

Se comienza limpiamdo la memoria

rm(list = ls())

Luego se instalan los diferentes paquetes necesarios para la elaboración de mapas temáticos como:

list.of.packages <- c("tidyverse", "rgeos", "sf", "raster", "cartography", "SpatialPosition")
new.packages <- list.of.packages[!(list.of.packages %in% installed.packages()[,"Package"])]
if(length(new.packages)) install.packages(new.packages)

Despues de instalar los paquetes necesarios se sigue con llamar las diferentes librerias a utilizar en la elaboración de mapas temáticos

library(tidyverse)
Registered S3 method overwritten by 'dplyr':
  method           from
  print.rowwise_df     
Registered S3 methods overwritten by 'dbplyr':
  method         from
  print.tbl_lazy     
  print.tbl_sql      
-- Attaching packages --------------------------------------- tidyverse 1.3.0 --
v ggplot2 3.3.0     v purrr   0.3.3
v tibble  2.1.3     v dplyr   0.8.5
v tidyr   1.0.2     v stringr 1.4.0
v readr   1.3.1     v forcats 0.5.0
-- Conflicts ------------------------------------------ tidyverse_conflicts() --
x dplyr::filter() masks stats::filter()
x dplyr::lag()    masks stats::lag()
library(readxl)
library(rgeos)
Loading required package: sp
rgeos version: 0.5-2, (SVN revision 621)
 GEOS runtime version: 3.6.1-CAPI-1.10.1 
 Linking to sp version: 1.4-1 
 Polygon checking: TRUE 
library(raster)

Attaching package: 㤼㸱raster㤼㸲

The following object is masked from 㤼㸱package:dplyr㤼㸲:

    select

The following object is masked from 㤼㸱package:tidyr㤼㸲:

    extract
library(ggplot2)
library(sf)
Linking to GEOS 3.6.1, GDAL 2.2.3, PROJ 4.9.3
library(fs)
library(cartography)
library(SpatialPosition)

5. Leyendo datos NBI

nbi <- read_excel("C:/Users/familiar/Downloads/gb2/trabajos en R/informe 2/CNPV-2018-NBI-La_Guajira.xlsx")
nbi
nbi %>%
  slice(which.max(NBI)) -> max_nbi
max_nbi
nbi %>%
  slice(which.min(NBI)) -> min_nbi
min_nbi
nbi %>%
  arrange(desc(NBI)) -> desc_nbi
desc_nbi

6. Joininig con datos de NBI de los municipios en este caso obtenidos del DANE

muni <- st_read("C:/Users/familiar/Downloads/gb2/La guajira/44_LA_GUAJIRA/ADMINISTRATIVO/MGN_MPIO_POLITICO.shp")
Reading layer `MGN_MPIO_POLITICO' from data source `C:\Users\familiar\Downloads\gb2\La guajira\44_LA_GUAJIRA\ADMINISTRATIVO\MGN_MPIO_POLITICO.shp' using driver `ESRI Shapefile'
Simple feature collection with 15 features and 9 fields
geometry type:  MULTIPOLYGON
dimension:      XY
bbox:           xmin: -73.66494 ymin: 10.39676 xmax: -71.11296 ymax: 12.45944
CRS:            4326
muni
Simple feature collection with 15 features and 9 fields
geometry type:  MULTIPOLYGON
dimension:      XY
bbox:           xmin: -73.66494 ymin: 10.39676 xmax: -71.11296 ymax: 12.45944
CRS:            4326
First 10 features:
   DPTO_CCDGO MPIO_CCDGO         MPIO_CNMBR                                                   MPIO_CRSLC MPIO_NAREA MPIO_NANO DPTO_CNMBR
1          44      44078          BARRANCAS                                                         1935   800.9418      2017 LA GUAJIRA
2          44      44098        DISTRACCIÓN                         Ordenanza 41 de Noviembre 30 de 1995   231.6880      2017 LA GUAJIRA
3          44      44110          EL MOLINO                     Ordenanza015 del 29 de Noviembre de 1989   242.1848      2017 LA GUAJIRA
4          44      44279            FONSECA                                                         1954   473.7073      2017 LA GUAJIRA
5          44      44378          HATONUEVO                          Ordenanza 57 de Noviembre 9 de 1994   214.6399      2017 LA GUAJIRA
6          44      44420 LA JAGUA DEL PILAR Decreto presidencial 609 del 26 de Marzo de 1996 y ratificad   179.5909      2017 LA GUAJIRA
7          44      44855            URUMITA                         Ordenanza 36 de Diciembre 20 de 1983   246.2746      2017 LA GUAJIRA
8          44      44874         VILLANUEVA                                                         1888   260.0959      2017 LA GUAJIRA
9          44      44001           RIOHACHA                                                         1954  3088.7157      2017 LA GUAJIRA
10         44      44035            ALBANIA                       Ordenanza 001 del 27 de Marzo del 2000   546.0266      2017 LA GUAJIRA
   Shape_Leng Shape_Area                       geometry
1   1.4953574 0.06621447 MULTIPOLYGON (((-72.59885 1...
2   0.9018563 0.01916877 MULTIPOLYGON (((-72.89246 1...
3   0.7100496 0.02000174 MULTIPOLYGON (((-72.96901 1...
4   1.3186028 0.03912942 MULTIPOLYGON (((-72.91056 1...
5   1.1453524 0.01775162 MULTIPOLYGON (((-72.6568 11...
6   0.9805011 0.01482556 MULTIPOLYGON (((-73.08581 1...
7   1.0506924 0.02033173 MULTIPOLYGON (((-73.00927 1...
8   0.8830655 0.02147866 MULTIPOLYGON (((-72.9918 10...
9   3.0307344 0.25561378 MULTIPOLYGON (((-72.89025 1...
10  1.4854163 0.04517060 MULTIPOLYGON (((-72.52248 1...
head(muni$MPIO_CNMBR)
[1] BARRANCAS          DISTRACCIÓN        EL MOLINO          FONSECA            HATONUEVO          LA JAGUA DEL PILAR
15 Levels: ALBANIA BARRANCAS DIBULLA DISTRACCIÓN EL MOLINO FONSECA HATONUEVO LA JAGUA DEL PILAR MAICAO MANAURE ... VILLANUEVA
nbi_muni = left_join(muni, nbi, by=c("MPIO_CCDGO"= "CODIGO"))
Column `MPIO_CCDGO`/`CODIGO` joining factor and character vector, coercing into character vector
nbi_muni %>%
  dplyr::select(Nom_Mun, MPIO_CCDGO, NBI)  ->  check_nbi_muni
head(check_nbi_muni)
Simple feature collection with 6 features and 3 fields
geometry type:  MULTIPOLYGON
dimension:      XY
bbox:           xmin: -73.18167 ymin: 10.39676 xmax: -72.48151 ymax: 11.16862
CRS:            4326
             Nom_Mun MPIO_CCDGO      NBI                       geometry
1          BARRANCAS      44078 39.89561 MULTIPOLYGON (((-72.59885 1...
2        DISTRACCIÓN      44098 24.93339 MULTIPOLYGON (((-72.89246 1...
3          EL MOLINO      44110 26.66954 MULTIPOLYGON (((-72.96901 1...
4            FONSECA      44279 19.30847 MULTIPOLYGON (((-72.91056 1...
5          HATONUEVO      44378 29.56089 MULTIPOLYGON (((-72.6568 11...
6 LA JAGUA DEL PILAR      44420 27.57453 MULTIPOLYGON (((-73.08581 1...
nbi_muni_new <- st_transform(nbi_muni, crs = 3116)
nbi_muni_new
Simple feature collection with 15 features and 20 fields
geometry type:  MULTIPOLYGON
dimension:      XY
bbox:           xmin: 1045090 ymin: 1641659 xmax: 1322921 ymax: 1870870
CRS:            EPSG:3116
First 10 features:
   DPTO_CCDGO MPIO_CCDGO         MPIO_CNMBR                                                   MPIO_CRSLC MPIO_NAREA MPIO_NANO DPTO_CNMBR
1          44      44078          BARRANCAS                                                         1935   800.9418      2017 LA GUAJIRA
2          44      44098        DISTRACCIÓN                         Ordenanza 41 de Noviembre 30 de 1995   231.6880      2017 LA GUAJIRA
3          44      44110          EL MOLINO                     Ordenanza015 del 29 de Noviembre de 1989   242.1848      2017 LA GUAJIRA
4          44      44279            FONSECA                                                         1954   473.7073      2017 LA GUAJIRA
5          44      44378          HATONUEVO                          Ordenanza 57 de Noviembre 9 de 1994   214.6399      2017 LA GUAJIRA
6          44      44420 LA JAGUA DEL PILAR Decreto presidencial 609 del 26 de Marzo de 1996 y ratificad   179.5909      2017 LA GUAJIRA
7          44      44855            URUMITA                         Ordenanza 36 de Diciembre 20 de 1983   246.2746      2017 LA GUAJIRA
8          44      44874         VILLANUEVA                                                         1888   260.0959      2017 LA GUAJIRA
9          44      44001           RIOHACHA                                                         1954  3088.7157      2017 LA GUAJIRA
10         44      44035            ALBANIA                       Ordenanza 001 del 27 de Marzo del 2000   546.0266      2017 LA GUAJIRA
   Shape_Leng Shape_Area Cod_Dep    Nom_Dep Cod_Mun            Nom_Mun      NBI   miseria  Vivienda Servicios Hacinamiento Inasistencia
1   1.4953574 0.06621447      44 LA GUAJIRA     078          BARRANCAS 39.89561 18.113987 21.280695 18.092969    15.805514     2.290959
2   0.9018563 0.01916877      44 LA GUAJIRA     098        DISTRACCIÓN 24.93339  7.279759  7.975935  3.798883    12.230339     2.681564
3   0.7100496 0.02000174      44 LA GUAJIRA     110          EL MOLINO 26.66954  6.434008 10.957920  4.523912     9.277610     2.441476
4   1.3186028 0.03912942      44 LA GUAJIRA     279            FONSECA 19.30847  5.350540  8.389451  3.063398     6.819796     3.139310
5   1.1453524 0.01775162      44 LA GUAJIRA     378          HATONUEVO 29.56089  8.663422 10.757130  6.790403    11.639882     4.566546
6   0.9805011 0.01482556      44 LA GUAJIRA     420 LA JAGUA DEL PILAR 27.57453  7.723577 11.212737  8.604336     8.333333     1.016260
7   1.0506924 0.02033173      44 LA GUAJIRA     855            URUMITA 24.37420  6.851870  8.088741  5.634632    10.748994     3.072543
8   0.8830655 0.02147866      44 LA GUAJIRA     874         VILLANUEVA 18.03653  4.450052  8.928142  2.891933     6.092286     1.353841
9   3.0307344 0.25561378      44 LA GUAJIRA     001           RIOHACHA 36.01086 18.026919 18.435786  9.830346    20.018096     4.252672
10  1.4854163 0.04517060      44 LA GUAJIRA     035            ALBANIA 37.89462 19.122052 13.415009  7.158768    26.180966     3.176127
   Economica                       geometry
1   7.590990 MULTIPOLYGON (((1161545 172...
2   7.185217 MULTIPOLYGON (((1129593 168...
3   6.994112 MULTIPOLYGON (((1121267 167...
4   4.662438 MULTIPOLYGON (((1127527 171...
5   6.399955 MULTIPOLYGON (((1155192 172...
6   7.859079 MULTIPOLYGON (((1108552 165...
7   5.281241 MULTIPOLYGON (((1116917 166...
8   4.273812 MULTIPOLYGON (((1118791 167...
9  10.302550 MULTIPOLYGON (((1129510 177...
10 14.521085 MULTIPOLYGON (((1169727 175...
summary(nbi_muni_new)
 DPTO_CCDGO  MPIO_CCDGO              MPIO_CNMBR                                                        MPIO_CRSLC   MPIO_NAREA    
 44:15      Length:15          ALBANIA    :1    1954                                                        :4    Min.   : 179.6  
            Class :character   BARRANCAS  :1    1888                                                        :1    1st Qu.: 244.2  
            Mode  :character   DIBULLA    :1    1935                                                        :1    Median : 546.0  
                               DISTRACCIÓN:1    1956                                                        :1    Mean   :1374.8  
                               EL MOLINO  :1    Decreto presidencial 609 del 26 de Marzo de 1996 y ratificad:1    3rd Qu.:1684.8  
                               FONSECA    :1    Ordenanza 001 del 27 de Marzo del 2000                      :1    Max.   :7886.1  
                               (Other)    :9    (Other)                                                     :6                    
   MPIO_NANO         DPTO_CNMBR   Shape_Leng      Shape_Area        Cod_Dep            Nom_Dep            Cod_Mun         
 Min.   :2017   LA GUAJIRA:15   Min.   :0.710   Min.   :0.01483   Length:15          Length:15          Length:15         
 1st Qu.:2017                   1st Qu.:1.016   1st Qu.:0.02017   Class :character   Class :character   Class :character  
 Median :2017                   Median :1.485   Median :0.04517   Mode  :character   Mode  :character   Mode  :character  
 Mean   :2017                   Mean   :1.897   Mean   :0.11381                                                           
 3rd Qu.:2017                   3rd Qu.:2.288   3rd Qu.:0.13948                                                           
 Max.   :2017                   Max.   :6.113   Max.   :0.65355                                                           
                                                                                                                          
   Nom_Mun               NBI           miseria          Vivienda        Servicios       Hacinamiento     Inasistencia      Economica     
 Length:15          Min.   :18.04   Min.   : 4.450   Min.   : 5.462   Min.   : 2.892   Min.   : 6.092   Min.   : 1.016   Min.   : 4.274  
 Class :character   1st Qu.:24.65   1st Qu.: 7.066   1st Qu.: 8.659   1st Qu.: 5.079   1st Qu.:10.013   1st Qu.: 2.562   1st Qu.: 6.684  
 Mode  :character   Median :29.56   Median : 8.663   Median :11.213   Median : 7.542   Median :13.666   Median : 3.139   Median : 7.591  
                    Mean   :39.45   Mean   :19.248   Mean   :18.712   Mean   :11.393   Mean   :21.831   Mean   : 4.883   Mean   :12.477  
                    3rd Qu.:47.62   3rd Qu.:25.062   3rd Qu.:19.858   3rd Qu.:14.797   3rd Qu.:29.114   3rd Qu.: 5.093   3rd Qu.:14.431  
                    Max.   :88.26   Max.   :60.349   Max.   :63.123   Max.   :35.656   Max.   :59.941   Max.   :16.346   Max.   :36.913  
                                                                                                                                         
          geometry 
 MULTIPOLYGON :15  
 epsg:3116    : 0  
 +proj=tmer...: 0  
                   
                   
                   
                   

7. Un mapa tematico de La Guajira

se utilizan las diferentes librerias de los paquetes de cartografía para que R pueda trabajar y elaborar los diferentes mapas tematicos

#instalar paquete ("RColorBrewer")
library(RColorBrewer)
library(leaflet)

7.1 Elaboración y despliegue de Mapa base y símbolos proporcionales

para este clase de mapas se utilizan simbolos que nos permiten visualizar con facilidad los datos de los diferentes municipios en La Guajira

# download osm tiles
mun.osm <- getTiles(
x = nbi_muni_new, 
type = "OpenStreetMap", 
zoom = 8,
cachedir = TRUE,
crop = FALSE
)
ning昼㹡n argumento finito para min; retornando Infningun argumento finito para max; retornando -Infning昼㹡n argumento finito para min; retornando Infningun argumento finito para max; retornando -Infning昼㹡n argumento finito para min; retornando Infningun argumento finito para max; retornando -Inf
# set margins
opar <- par(mar = c(0,0,1.2,0))
# plot osm tiles
tilesLayer(x = mun.osm)
# plot municipalities (only borders are plotted)
plot(st_geometry(nbi_muni_new), col = NA, border = "grey", add=TRUE)
# plot NBI
propSymbolsLayer(
  x = nbi_muni_new, 
  var = "NBI", 
  inches = 0.25, 
  col = "brown4",
  legend.pos = "topright",  
  legend.title.txt = "Total NBI"
)
# layout
layoutLayer(title="    -NBI-      Distribución datos de NBI  en La Guajira", 
            author = "Eduardo Lezama M.", 
            sources = "Fuente: DANE, 2018", 
            frame = TRUE, north = FALSE, tabtitle = TRUE)
# north arrow
north(pos = "topleft")

7.2 Mapa de coropletas

Es un tipo de mapa temático en el que las áreas se sombrean de distintos colores, frecuentemente de la misma gama cromática, que representan distintos valores de una variable estadística característica de la región geográfica de La Guajira, como puede ser la densidad de población o para este caso la distribución del NBI

# set margins
opar <- par(mar = c(0,0,1.2,0))
# set figure background color
par(bg="grey90")
# plot municipalities (only the backgroung color is plotted)
plot(st_geometry(nbi_muni_new), col = NA, border = NA, bg = "#aadaff")
# plot NBI
choroLayer(
  x = nbi_muni_new, 
  var = "NBI",
  method = "geom",
  nclass=5,
  col = carto.pal(pal1 = "sand.pal", n1 = 5),
  border = "white", 
  lwd = 0.15,
  legend.pos = "topright", 
  legend.title.txt = "NBI",
  add = TRUE
) 
# layout
layoutLayer(title=" Otra forma de ver La  Distribición NBI en La Guajira", 
            author = "Eduardo Lezama M.", 
            sources = "Fuente: DANE, 2018",  
            frame = TRUE, north = TRUE, tabtitle = TRUE, col="black") 
# north arrow
north(pos = "topleft")

7.3 Simbolos proporcionales a la tipología del mapa

La función propSymbolsTypoLayer () crea un mapa de símbolos que son proporcionales a los valores de una primera variable y coloreados para reflejar las modalidades de una segunda variable cualitativa. Se utiliza una combinación de argumentos propSymbolsLayer () y typoLayer ().

Primero, necesitamos crear una variable cualitativa. Usemos la función mutate para esta tarea.

nbi_munic_2 <- dplyr::mutate(nbi_muni_new, poverty = ifelse(miseria > 20, "Extreme", 
                                                         ifelse(Hacinamiento > 10, "High", "Intermediate")))
###
#
head(nbi_munic_2)
Simple feature collection with 6 features and 21 fields
geometry type:  MULTIPOLYGON
dimension:      XY
bbox:           xmin: 1098079 ymin: 1641659 xmax: 1174408 ymax: 1727256
CRS:            EPSG:3116
  DPTO_CCDGO MPIO_CCDGO         MPIO_CNMBR                                                   MPIO_CRSLC MPIO_NAREA MPIO_NANO DPTO_CNMBR
1         44      44078          BARRANCAS                                                         1935   800.9418      2017 LA GUAJIRA
2         44      44098        DISTRACCIÓN                         Ordenanza 41 de Noviembre 30 de 1995   231.6880      2017 LA GUAJIRA
3         44      44110          EL MOLINO                     Ordenanza015 del 29 de Noviembre de 1989   242.1848      2017 LA GUAJIRA
4         44      44279            FONSECA                                                         1954   473.7073      2017 LA GUAJIRA
5         44      44378          HATONUEVO                          Ordenanza 57 de Noviembre 9 de 1994   214.6399      2017 LA GUAJIRA
6         44      44420 LA JAGUA DEL PILAR Decreto presidencial 609 del 26 de Marzo de 1996 y ratificad   179.5909      2017 LA GUAJIRA
  Shape_Leng Shape_Area Cod_Dep    Nom_Dep Cod_Mun            Nom_Mun      NBI   miseria  Vivienda Servicios Hacinamiento Inasistencia
1  1.4953574 0.06621447      44 LA GUAJIRA     078          BARRANCAS 39.89561 18.113987 21.280695 18.092969    15.805514     2.290959
2  0.9018563 0.01916877      44 LA GUAJIRA     098        DISTRACCIÓN 24.93339  7.279759  7.975935  3.798883    12.230339     2.681564
3  0.7100496 0.02000174      44 LA GUAJIRA     110          EL MOLINO 26.66954  6.434008 10.957920  4.523912     9.277610     2.441476
4  1.3186028 0.03912942      44 LA GUAJIRA     279            FONSECA 19.30847  5.350540  8.389451  3.063398     6.819796     3.139310
5  1.1453524 0.01775162      44 LA GUAJIRA     378          HATONUEVO 29.56089  8.663422 10.757130  6.790403    11.639882     4.566546
6  0.9805011 0.01482556      44 LA GUAJIRA     420 LA JAGUA DEL PILAR 27.57453  7.723577 11.212737  8.604336     8.333333     1.016260
  Economica                       geometry      poverty
1  7.590990 MULTIPOLYGON (((1161545 172...         High
2  7.185217 MULTIPOLYGON (((1129593 168...         High
3  6.994112 MULTIPOLYGON (((1121267 167... Intermediate
4  4.662438 MULTIPOLYGON (((1127527 171... Intermediate
5  6.399955 MULTIPOLYGON (((1155192 172...         High
6  7.859079 MULTIPOLYGON (((1108552 165... Intermediate
library(sf)
library(cartography)
# set margins
opar <- par(mar = c(0,0,1.2,0))
# Plot the municipalities
plot(st_geometry(nbi_munic_2), col="#f2efe9", border="#b38e43", bg = "#aad3df", 
     lwd = 0.5)
# Plot symbols with choropleth coloration
propSymbolsTypoLayer(
  x = nbi_munic_2, 
  var = "NBI", 
  inches = 0.3,
  symbols = "square",
  border = "white",
  lwd = .5,
  legend.var.pos = c(1250000, 1658000), 
  legend.var.title.txt = "NBI",
  var2 = "poverty",
  legend.var2.values.order = c("Extreme", "High", 
                               "Intermediate"),
  col = carto.pal(pal1 = "multi.pal", n1 = 3),
  legend.var2.pos = c(1180000,1640000), 
  legend.var2.title.txt = "Nivel de pobresa"
) 
# layout
layoutLayer(title="       Distribución  NBI  en La Guajira", 
            author = "Eduardo Lezama M.", 
            sources = "Fuente: DANE, 2018", 
            scale = 1, tabtitle = TRUE, frame = TRUE)
# north arrow
north(pos = "topleft")

7.4 Etiqueta en mapas

se combinan funciones como choroLayer y labelLayer

library(sf)
library(cartography)
# set margins
opar <- par(mar = c(0,0,1.2,0))
# set figure background color
par(bg="grey25")
# plot municipalities
plot(st_geometry(nbi_munic_2), col = "#e4e9de", border = "darkseagreen4", 
     bg = "grey75", lwd = 0.5)
# plot NBI
choroLayer(
  x = nbi_muni_new, 
  var = "NBI",
  method = "geom",
  nclass=5,
  col = carto.pal(pal1 = "sand.pal", n1 = 5),
  border = "white", 
  lwd = 0.5,
  legend.pos = "topright", 
  legend.title.txt = "NBI",
  add = TRUE
) 
# plot labels
labelLayer(
  x = nbi_munic_2, 
  txt = "Nom_Mun", 
  col= "white", 
  cex = 0.4, 
  font = 8,
  halo = TRUE, 
  bg = "grey25", 
  r = 0.1, 
  overlap = FALSE, 
  show.lines = FALSE
)
# map layout
layoutLayer(
  title = "Municipios de La Guajira", 
  sources = "Fuente: DANE, 2018",  
  author = "Eduardo Lezama M.", 
  frame = TRUE,
  north = TRUE, 
  tabtitle = TRUE, 
  theme = "taupe.pal"
) 

7.5 Mapa de Isopletas

Son en sí isolíneas que se representan en un mapa , es decir lineas, rectas o curvas, que describen la intersección de una superficie real o hipotética con uno o más planos horizontales. La configuración de estas curvas permite a los lectores del mapa inferir el gradiente relativo de la variable o parámetro y estimar un valor en un lugar determinado.

crops2018 <- read_excel("C:/Users/familiar/Downloads/gb2/La guajira/Eva_Agro_Muni_LaGuajira_EVA.xlsx")
head(crops2018) 
crops2018 %>%
  filter(CULTIVO == "CAFE") -> cafe2018
#Create a new attribute which matches municipalities codes:

cafe2018$TEMP <-  as.character(cafe2018$C0D_MUN)
cafe2018$MPIO_CCDGO <- as.factor(paste( cafe2018$TEMP, sep=""))
#Now, make the join:

cafe_munic = left_join(muni, cafe2018, by="MPIO_CCDGO")
Column `MPIO_CCDGO` joining factors with different levels, coercing to character vector
## Warning: Column `MPIO_CCDGO` joining factors with different levels, coercing to
## character vector
#Check the output:

head(cafe_munic)
Simple feature collection with 6 features and 27 fields
geometry type:  MULTIPOLYGON
dimension:      XY
bbox:           xmin: -72.91242 ymin: 10.81934 xmax: -72.48151 ymax: 11.13662
CRS:            4326
  DPTO_CCDGO MPIO_CCDGO MPIO_CNMBR MPIO_CRSLC MPIO_NAREA MPIO_NANO DPTO_CNMBR Shape_Leng Shape_Area COD_DEP_ DEPARTAMENTO C0D_MUN MUNICIPIO
1         44      44078  BARRANCAS       1935   800.9418      2017 LA GUAJIRA   1.495357 0.06621447       44   LA GUAJIRA   44078 BARRANCAS
2         44      44078  BARRANCAS       1935   800.9418      2017 LA GUAJIRA   1.495357 0.06621447       44   LA GUAJIRA   44078 BARRANCAS
3         44      44078  BARRANCAS       1935   800.9418      2017 LA GUAJIRA   1.495357 0.06621447       44   LA GUAJIRA   44078 BARRANCAS
4         44      44078  BARRANCAS       1935   800.9418      2017 LA GUAJIRA   1.495357 0.06621447       44   LA GUAJIRA   44078 BARRANCAS
5         44      44078  BARRANCAS       1935   800.9418      2017 LA GUAJIRA   1.495357 0.06621447       44   LA GUAJIRA   44078 BARRANCAS
6         44      44078  BARRANCAS       1935   800.9418      2017 LA GUAJIRA   1.495357 0.06621447       44   LA GUAJIRA   44078 BARRANCAS
   GRUPO_DE_CULTIVO SUBGRUPO_DE_CULTIVO CULTIVO DESAGREGACION REGIONAL_Y/O_SISTEMA PRODUCTIVO  AÑO PERIODO A\u0081rea_Sembrada_ha
1 OTROS PERMANENTES                CAFE    CAFE                                          CAFE 2007    2007               719
2 OTROS PERMANENTES                CAFE    CAFE                                          CAFE 2008    2008               763
3 OTROS PERMANENTES                CAFE    CAFE                                          CAFE 2009    2009               692
4 OTROS PERMANENTES                CAFE    CAFE                                          CAFE 2010    2010               660
5 OTROS PERMANENTES                CAFE    CAFE                                          CAFE 2011    2011               744
6 OTROS PERMANENTES                CAFE    CAFE                                          CAFE 2012    2012               744
  A\u0081rea_Cosechada_ha Produccion_ton Rendimiento_t/ha ESTADO_FISICO_PRODUCCION NOMBRE_CIENTIFICO CICLO_DE_CULTIVO  TEMP
1                702            421                1   CAFE VERDE EQUIVALENTE    COFFEA ARABICA       PERMANENTE 44078
2                719            431                1   CAFE VERDE EQUIVALENTE    COFFEA ARABICA       PERMANENTE 44078
3                567            340                1   CAFE VERDE EQUIVALENTE    COFFEA ARABICA       PERMANENTE 44078
4                430            258                1   CAFE VERDE EQUIVALENTE    COFFEA ARABICA       PERMANENTE 44078
5                430            215                1   CAFE VERDE EQUIVALENTE    COFFEA ARABICA       PERMANENTE 44078
6                638            351                1   CAFE VERDE EQUIVALENTE    COFFEA ARABICA       PERMANENTE 44078
                        geometry
1 MULTIPOLYGON (((-72.59885 1...
2 MULTIPOLYGON (((-72.59885 1...
3 MULTIPOLYGON (((-72.59885 1...
4 MULTIPOLYGON (((-72.59885 1...
5 MULTIPOLYGON (((-72.59885 1...
6 MULTIPOLYGON (((-72.59885 1...
rep_cafe <- st_transform(cafe_munic, crs = 3116)
# set margins
opar <- par(mar = c(0,0,1.2,0))
# plot municipalities (only the backgroung color is plotted)
plot(st_geometry(rep_cafe), col = NA, border = "black", bg = "grey75")

library(sf)
# plot isopleth map
smoothLayer(
  x = rep_cafe, 
  var = 'Produccion_ton',
  typefct = "exponential",
  span = 50,
  beta = 2,
  nclass = 10,
  col = carto.pal(pal1 = 'green.pal', n1 = 10),
  border = "grey",
  lwd = 0.1, 
  mask = rep_cafe, 
  legend.values.rnd = -3,
  legend.title.txt = "Production",
  legend.pos = "topright", 
  add=TRUE
)
Error in polypath(p_bind(x[[i]]), border = border[i], lty = lty[i], lwd = lwd[i],  : 
  plot.new has not been called yet

8. Guardar Mapas

Un codigo para poder guardar los maps elaborados en R

### open the plot
png("C:/Users/familiar/Downloads/gb2/trabajos en R/LA Guajira/Cafe_2018.png", width = 2048, height = 1526)
# set margins
opar <- par(mar = c(0,0,5,5))
# Plot the municipalities
plot(st_geometry(rep_cafe), col="darkseagreen3", border="darkseagreen4",  
     bg = "white", lwd = 0.6)
# Plot symbols with choropleth coloration
propSymbolsChoroLayer(x = rep_cafe, var = "Produccion_ton", var2 = "Rendimiento_t/ha",
                      col = carto.pal(pal1 = "green.pal", n1 = 3,
                                      pal2 = "red.pal", n2 = 3),
                      inches = 0.8, method = "q6",
                      border = "grey50", lwd = 1,
                      legend.title.cex = 1.5,
                      legend.values.cex = 1.0,
                      legend.var.pos = "right", 
                      legend.var2.pos = "left",
                      legend.var2.values.rnd = 2,
                      legend.var2.title.txt = "Rendimiento/n(in Ton/Ha)",
                      legend.var.title.txt = "Producción Cafe 2018",
                      legend.var.style = "e")
Error in findInterval(var, distr, all.inside = TRUE) : 
  'vec' must be sorted non-decreasingly and not contain NAs

9. Información de la sesión

sessionInfo()
R version 3.6.3 (2020-02-29)
Platform: x86_64-w64-mingw32/x64 (64-bit)
Running under: Windows 10 x64 (build 17134)

Matrix products: default

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

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

other attached packages:
 [1] leaflet_2.0.3         RColorBrewer_1.1-2    SpatialPosition_2.0.1 cartography_2.4.1     fs_1.4.1              sf_0.9-2             
 [7] raster_3.0-12         rgeos_0.5-2           sp_1.4-1              readxl_1.3.1          forcats_0.5.0         stringr_1.4.0        
[13] dplyr_0.8.5           purrr_0.3.3           readr_1.3.1           tidyr_1.0.2           tibble_2.1.3          ggplot2_3.3.0        
[19] tidyverse_1.3.0      

loaded via a namespace (and not attached):
 [1] Rcpp_1.0.4         lubridate_1.7.8    lattice_0.20-40    png_0.1-7          class_7.3-15       assertthat_0.2.1   digest_0.6.25     
 [8] R6_2.4.1           cellranger_1.1.0   backports_1.1.5    reprex_0.3.0       e1071_1.7-3        httr_1.4.1         pillar_1.4.3      
[15] rlang_0.4.5        curl_4.3           rstudioapi_0.11    rgdal_1.4-8        htmlwidgets_1.5.1  munsell_0.5.0      broom_0.5.5       
[22] compiler_3.6.3     modelr_0.1.6       xfun_0.12          pkgconfig_2.0.3    htmltools_0.4.0    tidyselect_1.0.0   codetools_0.2-16  
[29] fansi_0.4.1        crayon_1.3.4       dbplyr_1.4.2       withr_2.1.2        grid_3.6.3         lwgeom_0.2-3       nlme_3.1-145      
[36] jsonlite_1.6.1     gtable_0.3.0       lifecycle_0.2.0    DBI_1.1.0          magrittr_1.5       units_0.6-6        scales_1.1.0      
[43] KernSmooth_2.23-16 cli_2.0.2          stringi_1.4.6      xml2_1.3.1         generics_0.0.2     vctrs_0.2.4        tools_3.6.3       
[50] glue_1.3.2         hms_0.5.3          crosstalk_1.1.0.1  slippymath_0.3.1   colorspace_1.4-1   classInt_0.4-2     rvest_0.3.5       
[57] isoband_0.2.0      knitr_1.28         haven_2.2.0       

Add a new chunk by clicking the Insert Chunk button on the toolbar or by pressing Ctrl+Alt+I.

When you save the notebook, an HTML file containing the code and output will be saved alongside it (click the Preview button or press Ctrl+Shift+K to preview the HTML file).

The preview shows you a rendered HTML copy of the contents of the editor. Consequently, unlike Knit, Preview does not run any R code chunks. Instead, the output of the chunk when it was last run in the editor is displayed.

LS0tDQp0aXRsZTogIkNhcnRvZ3JhZsOtYSBUZW3DoXRpY2EgZGUgTGEgR3VhamlyYSINCmF1dGhvcjogIkVkdWFyZG8gTGV6YW1hIE1lbmVzZXMiDQpkYXRlOiAgIjIwIE1heW8gZGUgMjAyMCINCm91dHB1dDogaHRtbF9ub3RlYm9vaw0KLS0tDQojIyAxLiBUaGlzIG5vdGVib29rIGRpc3BsYXkgYSBpbmZvcm1hdGlvbiAgc29tZSBpbmRleCBMYSBHdWFqaXJhDQoNClRoaXMgaXMgYW4gW1IgTWFya2Rvd25dKGh0dHA6Ly9ybWFya2Rvd24ucnN0dWRpby5jb20pIE5vdGVib29rLiBUaGlzIGlzIGEgaW5mb3IgZm9yIGRpc3BsYXkgdGhlbWF0aWMgY2FydG9ncmFwaHkgYSAgdGhlIERlcGFydGFtZW50IExhIEd1YWppcmFpbiBDb2xvbWJpYS4gSXQgaGFzIGJlZW4gbWFrZSwgY29tcGlsZWQgYW5kIHB1Ymxpc2hlZCBpbiBSUHVicyBmcm9tIFJTdHVkaW8uIA0KDQpFc3RlIGN1YWRlcm5vIG11ZXN0cmEgaW5mb3JtYWNpw7NuIGRlIGFsZ3Vub3MgaW5kaWNlcyBkZSBsYSBMYSBHdWFqaXJhIEVzdGEgZXMgdW5hIGluZm9ybWFjacOzbiBwYXJhIG1vc3RyYXIgbGEgY2FydG9ncmFmw61hIHRlbcOhdGljYSBlbiBlbCBEZXBhcnRhbWVudG8gZGUgTGEgR3VhamlyYSBlbiBDb2xvbWJpYS4gSGEgc2lkbyByZWFsaXphZG8sIGNvbXBpbGFkbyB5IHB1YmxpY2FkbyBlbiBSUHVicyBkZXNkZSBSU3R1ZGlvDQoNCkVzdGUgY3VhZGVybm8gdGllbmUgY29tbyBvYmpldGl2byBtb3N0cmFyIGxhIGVsYWJvcmFjacOzbiBkZSBhbGd1bm9zIG1hcGFzIHRlbcOhdGljb3MgZGUgTGEgR3VhamlyYSwgYXBsaWNhbmRvIGxvcyBjb25vY2ltaWVudG9zIGFwcmVuZGlkb3MgZW4gbGEgYXNpZ25hdHVyYSBkZSBHZW9tw6F0aWNhIELDoXNpY2EgZGUgbGEgVW5pdmVyc2lkYWQgTmFjaW9uYWwgZGUgQ29sb21iaWEgZW4gbGVuZ3VhamUgUi4gDQoNCiMjIDIuIENhcnRvZ3JhZmlhIHRlbcOhdGljYQ0KDQpTZWfDum4gZWwgSUdBQywgbGEgY2FydG9ncmFmw61hIHRlbcOhdGljYSBlcyB1biBjb25qdW50byBkZSBtYXBhcyBlbGFib3JhZG9zIHF1ZSBhbCBpbmNvcnBvcmFyIGxhIGluZm9ybWFjacOzbiBvYmpldG8gZGUgZXN0dWRpbyBlc3BlY8OtZmljbywgcmVwcmVzZW50YSBsYXMgcmVsYWNpb25lcyBlc3BhY2lhbGVzIGRlIHVuYSBvIHZhcmlhcyB2YXJpYWJsZXMgZ2VvZ3LDoWZpY2FzLCBtZWRpYW50ZSBsYSBhcGxpY2FjacOzbiBkZSB0w6ljbmljYXMgdmlzdWFsZXMgbyBzZW1pb2xvZ8OtYSBncsOhZmljYS4NCg0KRXN0b3MgbWFwYXMgdGVtw6F0aWNvcyBzZSBlbGFib3JhbiBhIHBhcnRpciBkZSBsYSB1bmnDs24gZGUgYmFzZXMgZGUgZGF0b3MgcmVjb3BpbGFkb3MgcG9yIGVudGVzIGd1YmVybmFtZW50YWxlcyBjb24gbGEgY2FydG9ncsOhZmljYSBiw6FzaWNhIG9maWNpYWwsIGNvbmZvcm1hZG8gcG9yIGxhcyBjYXBhcyB0ZW3DoXRpY2FzIHkgZXNjYWxhIGFkZWN1YWRhIHBhcmEgZWwgYW7DoWxpc2lzIGRlIHZhcmlhYmxlcyBkZSBlc3R1ZGlvIGVzcGVjw61maWNvLCB0b2RvIGVzdG8gbWVkaWFudGUgdW4gcHJvZ3JhbWEgZXNwZWNpYWxpemFkbyAsIHBhcmEgZXN0ZSBjYXNvIFIgZXN0dWRpby4NCg0KRXMgZGUgZsOhY2lsIHZpc3VhbGl6YWNpw7NuIHkgZW50ZW5kaW1pZW50byB5YSBxdWUgc2UgcHVlZGUgdXRpbGl6YXIgc2ltYm9sb2fDrWEgZW4gbGEgY2FydG9ncmFmw61hIHRlbcOhdGljYSwgYWRlbcOhcyBzZSByZWZlcmVuY2lhIHZhcmlhYmxlcyBkZSBpbnRlcsOpcyBwYXJhIGxvcyB1c3VhcmlvcyBkZSBsYSBpbmZvcm1hY2nDs24gZ2VvZ3LDoWZpY2EsIGFkZW3DoXMgc2lydmUgY29tbyB1biBpbnRlcmNhbWJpbyBkZSBlc3RhIGluZm9ybWFjacOzbiB2aXN1YWwuDQoNCiMjIyAyLjEgTWFwYSBkZSBjb3JvcGxldGENCg0KU29uIGxvcyBxdWUgIHJldHJhdGEgbG9zIGRhdG9zIGN1YW50aXRhdGl2b3MgZW4gZGlmZXJlbnRlcyBjb2xvcmVzIHNvYnJlIGVsIG1hcGEgIHkgcHVlZGUgbW9zdHJhciBsYSBkZW5zaWRhZCwgZWwgcG9yY2VudGFqZSwgZWwgdmFsb3IgcHJvbWVkaW8gbyBsYSBjYW50aWRhZCBkZSB1biBldmVudG8gZGVudHJvIGRlIHVuIMOhcmVhIGdlb2dyw6FmaWNhLiBMb3MgY29sb3JlcyBzZWN1ZW5jaWFsZXMgcmVwcmVzZW50YW4gdmFsb3JlcyBkZSBkYXRvcyBwb3NpdGl2b3MgbyBuZWdhdGl2b3MgY3JlY2llbnRlcyBvIGRlY3JlY2llbnRlcy4gTm9ybWFsbWVudGUsIGNhZGEgY29sb3IgdGFtYmnDqW4gcmVwcmVzZW50YSB1biByYW5nbyBkZSB2YWxvcmVzLg0KDQojIyMgMi4yIE1hcGEgZGUgc8OtbWJvbG9zIHByb3BvcmNpb25hbGVzIG8gZ3JhZHVhZG9zDQoNClNlIHVzYW4gZW4gb3RybyB0aXBvIGRlIG1hcGEgcGFyYSByZXByZXNlbnRhciBkYXRvcyBhc29jaWFkb3MgY29uIHViaWNhY2lvbmVzLCBjb21vIGNpdWRhZGVzLiBMb3MgZGF0b3Mgc2UgbXVlc3RyYW4gZW4gZXN0b3MgbWFwYXMgY29uIHPDrW1ib2xvcyBkZSB0YW1hw7FvIHByb3BvcmNpb25hbCBwYXJhIG1vc3RyYXIgbGFzIGRpZmVyZW5jaWFzIGVuIGxhcyBvY3VycmVuY2lhcy4gTG9zIGPDrXJjdWxvcyBzZSB1c2FuIGNvbiBtYXlvciBmcmVjdWVuY2lhLCBwZXJvIGxvcyBjdWFkcmFkb3MgeSBvdHJhcyBmb3JtYXMgZ2VvbcOpdHJpY2FzIHRhbWJpw6luIHNvbiBhZGVjdWFkb3MuIExhIGZvcm1hIG3DoXMgY29tw7puIGRlIGNhbWJpYXIgZWwgdGFtYcOxbyBkZSBlc3RvcyBzw61tYm9sb3MgZXMgaGFjZXIgcXVlIHN1cyDDoXJlYXMgc2VhbiBwcm9wb3JjaW9uYWxlcyBhIGxvcyB2YWxvcmVzIHF1ZSBzZSByZXByZXNlbnRhcsOhbiBtZWRpYW50ZSBlbCBzb2Z0d2FyZSBkZSBtYXBlbyBvIGRpYnVqby4NCg0KIyMjIDIuMyBNYXBhIGlzYXLDrXRtaWNvIG8gZGUgY29udG9ybm8NCg0KRXN0ZSB1c2EgaXNvbGluYXMgcGFyYSByZXByZXNlbnRhciB2YWxvcmVzIGNvbnRpbnVvcyBjb21vIGxvcyBuaXZlbGVzIGRlIHByZWNpcGl0YWNpw7NuLiBFc3RvcyBtYXBhcyB0YW1iacOpbiBwdWVkZW4gbW9zdHJhciB2YWxvcmVzIHRyaWRpbWVuc2lvbmFsZXMsIGNvbW8gbGEgZWxldmFjacOzbiwgZW4gbWFwYXMgdG9wb2dyw6FmaWNvcy4gRW4gZ2VuZXJhbCwgbG9zIGRhdG9zIHBhcmEgbWFwYXMgaXNhcsOtdG1pY29zIHNlIHJlY29waWxhbiBhIHRyYXbDqXMgZGUgcHVudG9zIG1lZGlibGVzIChwb3IgZWplbXBsbywgZXN0YWNpb25lcyBtZXRlb3JvbMOzZ2ljYXMpIG8gc2UgcmVjb3BpbGFuIHBvciDDoXJlYSAocG9yIGVqZW1wbG8sIHRvbmVsYWRhcyBkZSBCYW5hbm8gcG9yIGhlY3TDoXJlYSBwb3IgbXVuaWNpcGlvKS4gTG9zIG1hcGFzIGlzYXLDrXRtaWNvcyB0YW1iacOpbiBzaWd1ZW4gbGEgcmVnbGEgYsOhc2ljYSBkZSBxdWUgaGF5IGxhZG9zIGFsdG9zIHkgYmFqb3MgZW4gcmVsYWNpw7NuIGNvbiBsYSBpc29saW5hLiBQb3IgZWplbXBsbywgZW4gZWxldmFjacOzbiwgc2kgbGEgaXNvbGluYSBlcyBkZSA1MDAgbWV0cm9zLCBlbnRvbmNlcyB1biBsYWRvIGRlYmUgc2VyIG3DoXMgYWx0byBxdWUgNTAwIG1ldHJvcyB5IHVuIGxhZG8gZGViZSBzZXIgbcOhcyBiYWpvLg0KDQojIyMgMi40IE1hcGEgZGUgcHVudG9zDQoNClNlICB1dGlsaXphIHB1bnRvcyBwYXJhIG1vc3RyYXIgbGEgcHJlc2VuY2lhIGRlIHVuIHRlbWEgeSBtb3N0cmFyIHVuIHBhdHLDs24gZXNwYWNpYWwuIFVuIHB1bnRvIHB1ZWRlIHJlcHJlc2VudGFyIHVuYSB1bmlkYWQgbyB2YXJpYXMsIGRlcGVuZGllbmRvIGRlIGxvIHF1ZSBzZSBlc3TDqSByZXByZXNlbnRhbmRvLg0KDQojIyAzLiBEYXRvcw0KDQpQYXJhIGVzdGUgY2FzbyBzZSB1dGlsaXphcmFuIGRhdG9zIHNvYnJlIE5lY2VzaWRhZGVzIELDoXNpY2FzIEluc2F0aXNmZWNoYXMgKE5CSSkgZGVsIENlbnNvIE5hY2lvbmFsIGRlIFBvYmxhY2nDs24geSBWaXZpZW5kYSAyMDE4IHF1ZSBlc3TDoW4gZGlzcG9uaWJsZXMgZW4gZWwgR2VvcG9ydGFsIERBTkUuDQoNCkxvcyBtYXBhcyB0ZW3DoXRpY29zIHNvbiDDunRpbGVzIHBhcmEgdHJhbnNtaXRpciBpbmZvcm1hY2nDs24gZGVtb2dyw6FmaWNhLiBQdWVkZSBleHBsb3JhciB2YXJpb3MgbWFwYXMgdGVtw6F0aWNvcyBjb21vIGxvcyBkZWwgIERBTkUuDQoNCkFudGVyaW9ybWVudGUsIHNlIGRlc2NhcmfDsyAgZWwgYXJjaGl2byBOQkksIGVuIGZvcm1hdG8gLnhsc3gsIGEgbWkgY29tcHV0YWRvcmEuIEx1ZWdvLCB1dGlsaWPDqSBFeGNlbCBwYXJhIGVsaW1pbmFyIGRhdG9zIGRlIG11bmljaXBpb3Mgbm8gdWJpY2Fkb3MgZGVudHJvIGRlbCBEZXBhcnRhbWVudG8gZGUgQW50aW9xdWlhLiBUYW1iacOpbiAibGltcGnDqSIgbG9zIGRhdG9zLCBlcyBkZWNpciwgZWxpbWluw6kgdmFyaWFzIGZpbGFzIGNvbiBpbcOhZ2VuZXMgaW5zdGl0dWNpb25hbGVzIG8gc2luIGluZm9ybWFjacOzbi4gRXN0YXMgZmlsYXMgc2UgdWJpY2Fyb24gdGFudG8gYWwgcHJpbmNpcGlvIGNvbW8gYWwgZmluYWwgZGVsIGFyY2hpdm8gb3JpZ2luYWwuIE1hbnRlbmdvIGxhcyBjb2x1bW5hcyBxdWUgc2UgcmVmaWVyZW4gYSB0b2RvIGVsIG11bmljaXBpbyAoZXMgZGVjaXIsIGVsaW1pbsOpIGxhcyBjb2x1bW5hcyBjb3JyZXNwb25kaWVudGVzIGEgImNhYmVjZXJhIiB5ICJ6b25hIHJ1cmFsIikuIEd1YXJkZSBsb3MgZGF0b3MgcmVzdWx0YW50ZXMsIGNvcnJlc3BvbmRpZW50ZXMgc29sbyBhIG11bmljaXBpb3MgZGVsIGRlcGFydGFtZW50byBkZSBMYSBHdWFqaXJhIGNvbW8gTkJJLUxhX0d1YWppcmEueGxzeC4gTHVlZ28sIGNhcmd1w6kgZWwgYXJjaGl2byBlbiBlbCBkaXJlY3RvcmlvICJuYmkiIGVuIGxhIGNhcnBldGEgZGUgbWkgcHJveWVjdG8gZW4gUlN0dWRpby4NCg0KDQojIyA0LiBQcmVwYXJhY2nDs24NCg0KU2UgY29taWVuemEgbGltcGlhbWRvIGxhIG1lbW9yaWEgDQpgYGB7cn0NCnJtKGxpc3QgPSBscygpKQ0KYGBgDQoNCkx1ZWdvIHNlIGluc3RhbGFuIGxvcyBkaWZlcmVudGVzIHBhcXVldGVzIG5lY2VzYXJpb3MgcGFyYSBsYSBlbGFib3JhY2nDs24gZGUgbWFwYXMgdGVtw6F0aWNvcyBjb21vOg0KYGBge3J9DQpsaXN0Lm9mLnBhY2thZ2VzIDwtIGMoInRpZHl2ZXJzZSIsICJyZ2VvcyIsICJzZiIsICJyYXN0ZXIiLCAiY2FydG9ncmFwaHkiLCAiU3BhdGlhbFBvc2l0aW9uIikNCm5ldy5wYWNrYWdlcyA8LSBsaXN0Lm9mLnBhY2thZ2VzWyEobGlzdC5vZi5wYWNrYWdlcyAlaW4lIGluc3RhbGxlZC5wYWNrYWdlcygpWywiUGFja2FnZSJdKV0NCmlmKGxlbmd0aChuZXcucGFja2FnZXMpKSBpbnN0YWxsLnBhY2thZ2VzKG5ldy5wYWNrYWdlcykNCmBgYA0KDQpEZXNwdWVzIGRlIGluc3RhbGFyIGxvcyBwYXF1ZXRlcyBuZWNlc2FyaW9zIHNlIHNpZ3VlIGNvbiBsbGFtYXIgbGFzIGRpZmVyZW50ZXMgbGlicmVyaWFzIGEgdXRpbGl6YXIgZW4gIGxhIGVsYWJvcmFjacOzbiBkZSBtYXBhcyB0ZW3DoXRpY29zDQpgYGB7cn0NCmxpYnJhcnkodGlkeXZlcnNlKQ0KbGlicmFyeShyZWFkeGwpDQpsaWJyYXJ5KHJnZW9zKQ0KbGlicmFyeShyYXN0ZXIpDQpsaWJyYXJ5KGdncGxvdDIpDQpsaWJyYXJ5KHNmKQ0KbGlicmFyeShmcykNCmxpYnJhcnkoY2FydG9ncmFwaHkpDQpsaWJyYXJ5KFNwYXRpYWxQb3NpdGlvbikNCmBgYA0KDQojIyA1LiBMZXllbmRvIGRhdG9zIE5CSSANCg0KYGBge3J9DQpuYmkgPC0gcmVhZF9leGNlbCgiQzovVXNlcnMvZmFtaWxpYXIvRG93bmxvYWRzL2diMi90cmFiYWpvcyBlbiBSL2luZm9ybWUgMi9DTlBWLTIwMTgtTkJJLUxhX0d1YWppcmEueGxzeCIpDQpgYGANCg0KYGBge3J9DQpuYmkNCmBgYA0KDQpgYGB7cn0NCm5iaSAlPiUNCiAgc2xpY2Uod2hpY2gubWF4KE5CSSkpIC0+IG1heF9uYmkNCm1heF9uYmkNCmBgYA0KDQpgYGB7cn0NCm5iaSAlPiUNCiAgc2xpY2Uod2hpY2gubWluKE5CSSkpIC0+IG1pbl9uYmkNCm1pbl9uYmkNCmBgYA0KDQoNCmBgYHtyfQ0KbmJpICU+JQ0KICBhcnJhbmdlKGRlc2MoTkJJKSkgLT4gZGVzY19uYmkNCmRlc2NfbmJpDQpgYGANCg0KDQojIyA2LiBKb2luaW5pZyBjb24gZGF0b3MgZGUgTkJJIGRlIGxvcyBtdW5pY2lwaW9zIGVuIGVzdGUgY2FzbyBvYnRlbmlkb3MgZGVsIERBTkUNCg0KYGBge3J9DQptdW5pIDwtIHN0X3JlYWQoIkM6L1VzZXJzL2ZhbWlsaWFyL0Rvd25sb2Fkcy9nYjIvTGEgZ3VhamlyYS80NF9MQV9HVUFKSVJBL0FETUlOSVNUUkFUSVZPL01HTl9NUElPX1BPTElUSUNPLnNocCIpDQpgYGANCg0KYGBge3J9DQptdW5pDQpgYGANCg0KDQpgYGB7cn0NCmhlYWQobXVuaSRNUElPX0NOTUJSKQ0KYGBgDQoNCmBgYHtyfQ0KbmJpX211bmkgPSBsZWZ0X2pvaW4obXVuaSwgbmJpLCBieT1jKCJNUElPX0NDREdPIj0gIkNPRElHTyIpKQ0KYGBgDQoNCmBgYHtyfQ0KbmJpX211bmkgJT4lDQogIGRwbHlyOjpzZWxlY3QoTm9tX011biwgTVBJT19DQ0RHTywgTkJJKSAgLT4gIGNoZWNrX25iaV9tdW5pDQpoZWFkKGNoZWNrX25iaV9tdW5pKQ0KYGBgDQoNCmBgYHtyfQ0KbmJpX211bmlfbmV3IDwtIHN0X3RyYW5zZm9ybShuYmlfbXVuaSwgY3JzID0gMzExNikNCmBgYA0KDQpgYGB7cn0NCm5iaV9tdW5pX25ldw0KYGBgDQoNCg0KDQpgYGB7cn0NCnN1bW1hcnkobmJpX211bmlfbmV3KQ0KYGBgDQoNCg0KDQojIyA3LiBVbiBtYXBhIHRlbWF0aWNvIGRlIExhIEd1YWppcmEgDQpzZSB1dGlsaXphbiBsYXMgZGlmZXJlbnRlcyBsaWJyZXJpYXMgZGUgbG9zIHBhcXVldGVzIGRlIGNhcnRvZ3JhZsOtYSBwYXJhIHF1ZSBSIHB1ZWRhIHRyYWJhamFyIHkgZWxhYm9yYXIgbG9zIGRpZmVyZW50ZXMgbWFwYXMgdGVtYXRpY29zIA0KDQpgYGB7cn0NCiNpbnN0YWxhciBwYXF1ZXRlICgiUkNvbG9yQnJld2VyIikNCmxpYnJhcnkoUkNvbG9yQnJld2VyKQ0KbGlicmFyeShsZWFmbGV0KQ0KYGBgDQoNCiMjIyA3LjEgRWxhYm9yYWNpw7NuIHkgZGVzcGxpZWd1ZSBkZSAgTWFwYSBiYXNlIHkgc8OtbWJvbG9zIHByb3BvcmNpb25hbGVzDQoNCiBwYXJhIGVzdGUgY2xhc2UgZGUgbWFwYXMgc2UgdXRpbGl6YW4gc2ltYm9sb3MgcXVlIG5vcyBwZXJtaXRlbiB2aXN1YWxpemFyIGNvbiBmYWNpbGlkYWQgbG9zIGRhdG9zIGRlIGxvcyBkaWZlcmVudGVzIG11bmljaXBpb3MgZW4gTGEgR3VhamlyYQ0KDQpgYGB7cn0NCiMgZG93bmxvYWQgb3NtIHRpbGVzDQptdW4ub3NtIDwtIGdldFRpbGVzKA0KeCA9IG5iaV9tdW5pX25ldywgDQp0eXBlID0gIk9wZW5TdHJlZXRNYXAiLCANCnpvb20gPSA4LA0KY2FjaGVkaXIgPSBUUlVFLA0KY3JvcCA9IEZBTFNFDQopDQojIHNldCBtYXJnaW5zDQpvcGFyIDwtIHBhcihtYXIgPSBjKDAsMCwxLjIsMCkpDQojIHBsb3Qgb3NtIHRpbGVzDQp0aWxlc0xheWVyKHggPSBtdW4ub3NtKQ0KIyBwbG90IG11bmljaXBhbGl0aWVzIChvbmx5IGJvcmRlcnMgYXJlIHBsb3R0ZWQpDQpwbG90KHN0X2dlb21ldHJ5KG5iaV9tdW5pX25ldyksIGNvbCA9IE5BLCBib3JkZXIgPSAiZ3JleSIsIGFkZD1UUlVFKQ0KIyBwbG90IE5CSQ0KcHJvcFN5bWJvbHNMYXllcigNCiAgeCA9IG5iaV9tdW5pX25ldywgDQogIHZhciA9ICJOQkkiLCANCiAgaW5jaGVzID0gMC4yNSwgDQogIGNvbCA9ICJicm93bjQiLA0KICBsZWdlbmQucG9zID0gInRvcHJpZ2h0IiwgIA0KICBsZWdlbmQudGl0bGUudHh0ID0gIlRvdGFsIE5CSSINCikNCiMgbGF5b3V0DQpsYXlvdXRMYXllcih0aXRsZT0iICAgIC1OQkktICAgICAgRGlzdHJpYnVjacOzbiBkYXRvcyBkZSBOQkkgIGVuIExhIEd1YWppcmEiLCANCiAgICAgICAgICAgIGF1dGhvciA9ICJFZHVhcmRvIExlemFtYSBNLiIsIA0KICAgICAgICAgICAgc291cmNlcyA9ICJGdWVudGU6IERBTkUsIDIwMTgiLCANCiAgICAgICAgICAgIGZyYW1lID0gVFJVRSwgbm9ydGggPSBGQUxTRSwgdGFidGl0bGUgPSBUUlVFKQ0KIyBub3J0aCBhcnJvdw0Kbm9ydGgocG9zID0gInRvcGxlZnQiKQ0KDQpgYGANCg0KIyMjIDcuMiBNYXBhIGRlIGNvcm9wbGV0YXMNCkVzIHVuIHRpcG8gZGUgbWFwYSB0ZW3DoXRpY28gZW4gZWwgcXVlIGxhcyDDoXJlYXMgc2Ugc29tYnJlYW4gZGUgZGlzdGludG9zIGNvbG9yZXMsIGZyZWN1ZW50ZW1lbnRlIGRlIGxhIG1pc21hIGdhbWEgY3JvbcOhdGljYSwgcXVlIHJlcHJlc2VudGFuIGRpc3RpbnRvcyB2YWxvcmVzIGRlIHVuYSB2YXJpYWJsZSBlc3RhZMOtc3RpY2EgY2FyYWN0ZXLDrXN0aWNhIGRlIGxhIHJlZ2nDs24gZ2VvZ3LDoWZpY2EgZGUgTGEgR3VhamlyYSwgY29tbyBwdWVkZSBzZXIgbGEgZGVuc2lkYWQgZGUgcG9ibGFjacOzbiBvIHBhcmEgZXN0ZSBjYXNvIGxhIGRpc3RyaWJ1Y2nDs24gZGVsIE5CSQ0KDQpgYGB7cn0NCiMgc2V0IG1hcmdpbnMNCm9wYXIgPC0gcGFyKG1hciA9IGMoMCwwLDEuMiwwKSkNCiMgc2V0IGZpZ3VyZSBiYWNrZ3JvdW5kIGNvbG9yDQpwYXIoYmc9ImdyZXk5MCIpDQojIHBsb3QgbXVuaWNpcGFsaXRpZXMgKG9ubHkgdGhlIGJhY2tncm91bmcgY29sb3IgaXMgcGxvdHRlZCkNCnBsb3Qoc3RfZ2VvbWV0cnkobmJpX211bmlfbmV3KSwgY29sID0gTkEsIGJvcmRlciA9IE5BLCBiZyA9ICIjYWFkYWZmIikNCiMgcGxvdCBOQkkNCmNob3JvTGF5ZXIoDQogIHggPSBuYmlfbXVuaV9uZXcsIA0KICB2YXIgPSAiTkJJIiwNCiAgbWV0aG9kID0gImdlb20iLA0KICBuY2xhc3M9NSwNCiAgY29sID0gY2FydG8ucGFsKHBhbDEgPSAic2FuZC5wYWwiLCBuMSA9IDUpLA0KICBib3JkZXIgPSAid2hpdGUiLCANCiAgbHdkID0gMC4xNSwNCiAgbGVnZW5kLnBvcyA9ICJ0b3ByaWdodCIsIA0KICBsZWdlbmQudGl0bGUudHh0ID0gIk5CSSIsDQogIGFkZCA9IFRSVUUNCikgDQojIGxheW91dA0KbGF5b3V0TGF5ZXIodGl0bGU9IiBPdHJhIGZvcm1hIGRlIHZlciBMYSAgRGlzdHJpYmljacOzbiBOQkkgZW4gTGEgR3VhamlyYSIsIA0KICAgICAgICAgICAgYXV0aG9yID0gIkVkdWFyZG8gTGV6YW1hIE0uIiwgDQogICAgICAgICAgICBzb3VyY2VzID0gIkZ1ZW50ZTogREFORSwgMjAxOCIsICANCiAgICAgICAgICAgIGZyYW1lID0gVFJVRSwgbm9ydGggPSBUUlVFLCB0YWJ0aXRsZSA9IFRSVUUsIGNvbD0iYmxhY2siKSANCiMgbm9ydGggYXJyb3cNCm5vcnRoKHBvcyA9ICJ0b3BsZWZ0IikNCg0KYGBgDQoNCiMjIyA3LjMgU2ltYm9sb3MgcHJvcG9yY2lvbmFsZXMgYSBsYSB0aXBvbG9nw61hIGRlbCBtYXBhDQogTGEgZnVuY2nDs24gcHJvcFN5bWJvbHNUeXBvTGF5ZXIgKCkgY3JlYSB1biBtYXBhIGRlIHPDrW1ib2xvcyBxdWUgc29uIHByb3BvcmNpb25hbGVzIGEgbG9zIHZhbG9yZXMgZGUgdW5hIHByaW1lcmEgdmFyaWFibGUgeSBjb2xvcmVhZG9zIHBhcmEgcmVmbGVqYXIgbGFzIG1vZGFsaWRhZGVzIGRlIHVuYSBzZWd1bmRhIHZhcmlhYmxlIGN1YWxpdGF0aXZhLiBTZSB1dGlsaXphIHVuYSBjb21iaW5hY2nDs24gZGUgYXJndW1lbnRvcyBwcm9wU3ltYm9sc0xheWVyICgpIHkgdHlwb0xheWVyICgpLg0KDQpQcmltZXJvLCBuZWNlc2l0YW1vcyBjcmVhciB1bmEgdmFyaWFibGUgY3VhbGl0YXRpdmEuIFVzZW1vcyBsYSBmdW5jacOzbiBtdXRhdGUgcGFyYSBlc3RhIHRhcmVhLg0KDQpgYGB7cn0NCm5iaV9tdW5pY18yIDwtIGRwbHlyOjptdXRhdGUobmJpX211bmlfbmV3LCBwb3ZlcnR5ID0gaWZlbHNlKG1pc2VyaWEgPiAyMCwgIkV4dHJlbWUiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShIYWNpbmFtaWVudG8gPiAxMCwgIkhpZ2giLCAiSW50ZXJtZWRpYXRlIikpKQ0KIyMjDQojDQpoZWFkKG5iaV9tdW5pY18yKQ0KDQpgYGANCg0KDQpgYGB7cn0NCmxpYnJhcnkoc2YpDQpsaWJyYXJ5KGNhcnRvZ3JhcGh5KQ0KIyBzZXQgbWFyZ2lucw0Kb3BhciA8LSBwYXIobWFyID0gYygwLDAsMS4yLDApKQ0KIyBQbG90IHRoZSBtdW5pY2lwYWxpdGllcw0KcGxvdChzdF9nZW9tZXRyeShuYmlfbXVuaWNfMiksIGNvbD0iI2YyZWZlOSIsIGJvcmRlcj0iI2IzOGU0MyIsIGJnID0gIiNhYWQzZGYiLCANCiAgICAgbHdkID0gMC41KQ0KIyBQbG90IHN5bWJvbHMgd2l0aCBjaG9yb3BsZXRoIGNvbG9yYXRpb24NCnByb3BTeW1ib2xzVHlwb0xheWVyKA0KICB4ID0gbmJpX211bmljXzIsIA0KICB2YXIgPSAiTkJJIiwgDQogIGluY2hlcyA9IDAuMywNCiAgc3ltYm9scyA9ICJzcXVhcmUiLA0KICBib3JkZXIgPSAid2hpdGUiLA0KICBsd2QgPSAuNSwNCiAgbGVnZW5kLnZhci5wb3MgPSBjKDEyNTAwMDAsIDE2NTgwMDApLCANCiAgbGVnZW5kLnZhci50aXRsZS50eHQgPSAiTkJJIiwNCiAgdmFyMiA9ICJwb3ZlcnR5IiwNCiAgbGVnZW5kLnZhcjIudmFsdWVzLm9yZGVyID0gYygiRXh0cmVtZSIsICJIaWdoIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkludGVybWVkaWF0ZSIpLA0KICBjb2wgPSBjYXJ0by5wYWwocGFsMSA9ICJtdWx0aS5wYWwiLCBuMSA9IDMpLA0KICBsZWdlbmQudmFyMi5wb3MgPSBjKDExODAwMDAsMTY0MDAwMCksIA0KICBsZWdlbmQudmFyMi50aXRsZS50eHQgPSAiTml2ZWwgZGUgcG9icmVzYSINCikgDQojIGxheW91dA0KbGF5b3V0TGF5ZXIodGl0bGU9IiAgICAgICBEaXN0cmlidWNpw7NuICBOQkkgIGVuIExhIEd1YWppcmEiLCANCiAgICAgICAgICAgIGF1dGhvciA9ICJFZHVhcmRvIExlemFtYSBNLiIsIA0KICAgICAgICAgICAgc291cmNlcyA9ICJGdWVudGU6IERBTkUsIDIwMTgiLCANCiAgICAgICAgICAgIHNjYWxlID0gMSwgdGFidGl0bGUgPSBUUlVFLCBmcmFtZSA9IFRSVUUpDQojIG5vcnRoIGFycm93DQpub3J0aChwb3MgPSAidG9wbGVmdCIpDQpgYGANCg0KIyMjIDcuNCBFdGlxdWV0YSBlbiBtYXBhcw0KIHNlIGNvbWJpbmFuIGZ1bmNpb25lcyBjb21vIGNob3JvTGF5ZXIgeSBsYWJlbExheWVyDQoNCmBgYHtyfQ0KbGlicmFyeShzZikNCmxpYnJhcnkoY2FydG9ncmFwaHkpDQojIHNldCBtYXJnaW5zDQpvcGFyIDwtIHBhcihtYXIgPSBjKDAsMCwxLjIsMCkpDQojIHNldCBmaWd1cmUgYmFja2dyb3VuZCBjb2xvcg0KcGFyKGJnPSJncmV5MjUiKQ0KIyBwbG90IG11bmljaXBhbGl0aWVzDQpwbG90KHN0X2dlb21ldHJ5KG5iaV9tdW5pY18yKSwgY29sID0gIiNlNGU5ZGUiLCBib3JkZXIgPSAiZGFya3NlYWdyZWVuNCIsIA0KICAgICBiZyA9ICJncmV5NzUiLCBsd2QgPSAwLjUpDQojIHBsb3QgTkJJDQpjaG9yb0xheWVyKA0KICB4ID0gbmJpX211bmlfbmV3LCANCiAgdmFyID0gIk5CSSIsDQogIG1ldGhvZCA9ICJnZW9tIiwNCiAgbmNsYXNzPTUsDQogIGNvbCA9IGNhcnRvLnBhbChwYWwxID0gInNhbmQucGFsIiwgbjEgPSA1KSwNCiAgYm9yZGVyID0gIndoaXRlIiwgDQogIGx3ZCA9IDAuNSwNCiAgbGVnZW5kLnBvcyA9ICJ0b3ByaWdodCIsIA0KICBsZWdlbmQudGl0bGUudHh0ID0gIk5CSSIsDQogIGFkZCA9IFRSVUUNCikgDQojIHBsb3QgbGFiZWxzDQpsYWJlbExheWVyKA0KICB4ID0gbmJpX211bmljXzIsIA0KICB0eHQgPSAiTm9tX011biIsIA0KICBjb2w9ICJ3aGl0ZSIsIA0KICBjZXggPSAwLjQsIA0KICBmb250ID0gOCwNCiAgaGFsbyA9IFRSVUUsIA0KICBiZyA9ICJncmV5MjUiLCANCiAgciA9IDAuMSwgDQogIG92ZXJsYXAgPSBGQUxTRSwgDQogIHNob3cubGluZXMgPSBGQUxTRQ0KKQ0KIyBtYXAgbGF5b3V0DQpsYXlvdXRMYXllcigNCiAgdGl0bGUgPSAiTXVuaWNpcGlvcyBkZSBMYSBHdWFqaXJhIiwgDQogIHNvdXJjZXMgPSAiRnVlbnRlOiBEQU5FLCAyMDE4IiwgIA0KICBhdXRob3IgPSAiRWR1YXJkbyBMZXphbWEgTS4iLCANCiAgZnJhbWUgPSBUUlVFLA0KICBub3J0aCA9IFRSVUUsIA0KICB0YWJ0aXRsZSA9IFRSVUUsIA0KICB0aGVtZSA9ICJ0YXVwZS5wYWwiDQopIA0KYGBgDQoNCg0KIyMjIDcuNSBNYXBhIGRlIElzb3BsZXRhcw0KDQpTb24gZW4gc8OtICBpc29sw61uZWFzIHF1ZSBzZSByZXByZXNlbnRhbiBlbiB1biBtYXBhICwgZXMgZGVjaXIgbGluZWFzLCByZWN0YXMgbyBjdXJ2YXMsIHF1ZSBkZXNjcmliZW4gbGEgaW50ZXJzZWNjacOzbiBkZSB1bmEgc3VwZXJmaWNpZSByZWFsIG8gaGlwb3TDqXRpY2EgY29uIHVubyBvIG3DoXMgcGxhbm9zIGhvcml6b250YWxlcy4gTGEgY29uZmlndXJhY2nDs24gZGUgZXN0YXMgY3VydmFzIHBlcm1pdGUgYSBsb3MgbGVjdG9yZXMgZGVsIG1hcGEgaW5mZXJpciBlbCBncmFkaWVudGUgcmVsYXRpdm8gZGUgbGEgdmFyaWFibGUgbyBwYXLDoW1ldHJvIHkgZXN0aW1hciB1biB2YWxvciBlbiB1biBsdWdhciBkZXRlcm1pbmFkby4NCg0KYGBge3J9DQpjcm9wczIwMTggPC0gcmVhZF9leGNlbCgiQzovVXNlcnMvZmFtaWxpYXIvRG93bmxvYWRzL2diMi9MYSBndWFqaXJhL0V2YV9BZ3JvX011bmlfTGFHdWFqaXJhX0VWQS54bHN4IikNCmhlYWQoY3JvcHMyMDE4KSANCmBgYA0KDQpgYGB7cn0NCmNyb3BzMjAxOCAlPiUNCiAgZmlsdGVyKENVTFRJVk8gPT0gIkNBRkUiKSAtPiBjYWZlMjAxOA0KI0NyZWF0ZSBhIG5ldyBhdHRyaWJ1dGUgd2hpY2ggbWF0Y2hlcyBtdW5pY2lwYWxpdGllcyBjb2RlczoNCg0KY2FmZTIwMTgkVEVNUCA8LSAgYXMuY2hhcmFjdGVyKGNhZmUyMDE4JEMwRF9NVU4pDQpjYWZlMjAxOCRNUElPX0NDREdPIDwtIGFzLmZhY3RvcihwYXN0ZSggY2FmZTIwMTgkVEVNUCwgc2VwPSIiKSkNCiNOb3csIG1ha2UgdGhlIGpvaW46DQoNCmNhZmVfbXVuaWMgPSBsZWZ0X2pvaW4obXVuaSwgY2FmZTIwMTgsIGJ5PSJNUElPX0NDREdPIikNCiMjIFdhcm5pbmc6IENvbHVtbiBgTVBJT19DQ0RHT2Agam9pbmluZyBmYWN0b3JzIHdpdGggZGlmZmVyZW50IGxldmVscywgY29lcmNpbmcgdG8NCiMjIGNoYXJhY3RlciB2ZWN0b3INCiNDaGVjayB0aGUgb3V0cHV0Og0KDQpoZWFkKGNhZmVfbXVuaWMpDQoNCg0KYGBgDQoNCg0KYGBge3J9DQpyZXBfY2FmZSA8LSBzdF90cmFuc2Zvcm0oY2FmZV9tdW5pYywgY3JzID0gMzExNikNCmBgYA0KDQoNCmBgYHtyfQ0KIyBzZXQgbWFyZ2lucw0Kb3BhciA8LSBwYXIobWFyID0gYygwLDAsMS4yLDApKQ0KIyBwbG90IG11bmljaXBhbGl0aWVzIChvbmx5IHRoZSBiYWNrZ3JvdW5nIGNvbG9yIGlzIHBsb3R0ZWQpDQpwbG90KHN0X2dlb21ldHJ5KHJlcF9jYWZlKSwgY29sID0gTkEsIGJvcmRlciA9ICJibGFjayIsIGJnID0gImdyZXk3NSIpDQpgYGANCg0KYGBge3Igd2FybmluZz0gRkFMU0V9DQpsaWJyYXJ5KHNmKQ0KIyBwbG90IGlzb3BsZXRoIG1hcA0Kc21vb3RoTGF5ZXIoDQogIHggPSByZXBfY2FmZSwgDQogIHZhciA9ICdQcm9kdWNjaW9uX3RvbicsDQogIHR5cGVmY3QgPSAiZXhwb25lbnRpYWwiLA0KICBzcGFuID0gNTAsDQogIGJldGEgPSAyLA0KICBuY2xhc3MgPSAxMCwNCiAgY29sID0gY2FydG8ucGFsKHBhbDEgPSAnZ3JlZW4ucGFsJywgbjEgPSAxMCksDQogIGJvcmRlciA9ICJncmV5IiwNCiAgbHdkID0gMC4xLCANCiAgbWFzayA9IHJlcF9jYWZlLCANCiAgbGVnZW5kLnZhbHVlcy5ybmQgPSAtMywNCiAgbGVnZW5kLnRpdGxlLnR4dCA9ICJQcm9kdWN0aW9uIiwNCiAgbGVnZW5kLnBvcyA9ICJ0b3ByaWdodCIsIA0KICBhZGQ9VFJVRQ0KKQ0KIyBhbm5vdGF0aW9uIG9uIHRoZSBtYXANCnRleHQoeCA9IDY1MDAwMCwgeSA9IDE2NjAwMDAsIGNleCA9IDAuNiwgYWRqID0gMCwgZm9udCA9IDMsICBsYWJlbHMgPSANCiAgICAgICAiRGlzdGFuY2UgZnVuY3Rpb246L24tIHR5cGUgPSBleHBvbmVudGlhbC9uLSBiZXRhID0gMi9uLSBzcGFuID0gMjAga20iKQ0KIyBsYXlvdXQNCmxheW91dExheWVyKHRpdGxlID0gIkRpc3N0cmlidWNpw7NuIGVuIExhIEd1YWppcmEgUHJvZHVjY2nDs24gZGUgQ0FGRSIsDQogICAgICAgICAgICBzb3VyY2VzID0gIkZVRU5URTogREFORSBhbmQgTUFEUiwgMjAxOCIsDQogICAgICAgICAgICBhdXRob3IgPSAiRWR1YXJkbyBMZXphbWEgTWVuZXNlcyIsDQogICAgICAgICAgICBmcmFtZSA9IEZBTFNFLCBub3J0aCA9IEZBTFNFLCB0YWJ0aXRsZSA9IFRSVUUsIHRoZW1lID0gImdyZWVuLnBhbCIpDQojIG5vcnRoIGFycm93DQpub3J0aChwb3MgPSAidG9wbGVmdCIpDQoNCmBgYA0KIyMgOC4gR3VhcmRhciBNYXBhcw0KIFVuIGNvZGlnbyBwYXJhIHBvZGVyIGd1YXJkYXIgbG9zIG1hcHMgZWxhYm9yYWRvcyBlbiBSDQoNCmBgYHtyfQ0KIyMjIG9wZW4gdGhlIHBsb3QNCnBuZygiQzovVXNlcnMvZmFtaWxpYXIvRG93bmxvYWRzL2diMi90cmFiYWpvcyBlbiBSL0xBIEd1YWppcmEvQ2FmZV8yMDE4LnBuZyIsIHdpZHRoID0gMjA0OCwgaGVpZ2h0ID0gMTUyNikNCiMgc2V0IG1hcmdpbnMNCm9wYXIgPC0gcGFyKG1hciA9IGMoMCwwLDUsNSkpDQojIFBsb3QgdGhlIG11bmljaXBhbGl0aWVzDQpwbG90KHN0X2dlb21ldHJ5KHJlcF9jYWZlKSwgY29sPSJkYXJrc2VhZ3JlZW4zIiwgYm9yZGVyPSJkYXJrc2VhZ3JlZW40IiwgIA0KICAgICBiZyA9ICJ3aGl0ZSIsIGx3ZCA9IDAuNikNCiMgUGxvdCBzeW1ib2xzIHdpdGggY2hvcm9wbGV0aCBjb2xvcmF0aW9uDQpwcm9wU3ltYm9sc0Nob3JvTGF5ZXIoeCA9IHJlcF9jYWZlLCB2YXIgPSAiUHJvZHVjY2lvbl90b24iLCB2YXIyID0gIlJlbmRpbWllbnRvX3QvaGEiLA0KICAgICAgICAgICAgICAgICAgICAgIGNvbCA9IGNhcnRvLnBhbChwYWwxID0gImdyZWVuLnBhbCIsIG4xID0gMywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFsMiA9ICJyZWQucGFsIiwgbjIgPSAzKSwNCiAgICAgICAgICAgICAgICAgICAgICBpbmNoZXMgPSAwLjgsIG1ldGhvZCA9ICJxNiIsDQogICAgICAgICAgICAgICAgICAgICAgYm9yZGVyID0gImdyZXk1MCIsIGx3ZCA9IDEsDQogICAgICAgICAgICAgICAgICAgICAgbGVnZW5kLnRpdGxlLmNleCA9IDEuNSwNCiAgICAgICAgICAgICAgICAgICAgICBsZWdlbmQudmFsdWVzLmNleCA9IDEuMCwNCiAgICAgICAgICAgICAgICAgICAgICBsZWdlbmQudmFyLnBvcyA9ICJyaWdodCIsIA0KICAgICAgICAgICAgICAgICAgICAgIGxlZ2VuZC52YXIyLnBvcyA9ICJsZWZ0IiwNCiAgICAgICAgICAgICAgICAgICAgICBsZWdlbmQudmFyMi52YWx1ZXMucm5kID0gMiwNCiAgICAgICAgICAgICAgICAgICAgICBsZWdlbmQudmFyMi50aXRsZS50eHQgPSAiUmVuZGltaWVudG8vbihpbiBUb24vSGEpIiwNCiAgICAgICAgICAgICAgICAgICAgICBsZWdlbmQudmFyLnRpdGxlLnR4dCA9ICJQcm9kdWNjacOzbiBDYWZlIDIwMTgiLA0KICAgICAgICAgICAgICAgICAgICAgIGxlZ2VuZC52YXIuc3R5bGUgPSAiZSIpDQojIHBsb3QgbGFiZWxzDQpsYWJlbExheWVyKA0KICB4ID0gcmVwX2NhZmUsIA0KICB0eHQgPSAiTVBJT19DTk1CUiIsIA0KICBjb2w9ICJ3aGl0ZSIsIA0KICBjZXggPSAxLjAsIA0KICBmb250ID0gNCwNCiAgaGFsbyA9IEZBTFNFLCANCiAgYmcgPSAid2hpdGUiLCANCiAgciA9IDAuMSwgDQogIG92ZXJsYXAgPSBGQUxTRSwgDQogIHNob3cubGluZXMgPSBGQUxTRQ0KKQ0KIyBsYXlvdXQNCmxheW91dExheWVyKHRpdGxlPSJQcm9kdWNjacOzbiB5IHJlbmRpbWllbnRvIGRlIENBRkUgZW4gTGEgR3VhamlyYSwgMjAxOCIsDQogICAgICAgICAgICBhdXRob3IgPSAiRWR1YXJkbyBMZXphbWEgTS4iLCANCiAgICAgICAgICAgIHNvdXJjZXMgPSAiRnVlbnRlOiBNQURSICYgREFORSwgMjAxOCIsIA0KICAgICAgICAgICAgc2NhbGUgPSA1MCwgdGFidGl0bGUgPSBGQUxTRSwgZnJhbWUgPSBUUlVFKQ0KIyBub3J0aCBhcnJvdw0Kbm9ydGgocG9zID0gInRvcGxlZnQiKQ0KIw0KdGl0bGUobWFpbj0iUHJvZHVjY2nDs24geSByZW5kaW1pZW50byBkZSBDQUZFIGVuIExhIEd1YWppcmEgLCAyMDE4IiwgY2V4Lm1haW49MywNCiAgICAgIHN1Yj0gIkZ1ZW50ZTogTUFEUiAmIERBTkUsIDIwMTgiLCBjZXguc3ViPTIpDQojDQpncmF0aWN1bGUgPSBUUlVFDQojDQpwYXIob3BhcikNCiMjIyBjbG9zZSB0aGUgcGxvdA0KZGV2Lm9mZigpDQpgYGANCg0KIyMgOS4gSW5mb3JtYWNpw7NuIGRlIGxhIHNlc2nDs24gDQoNCmBgYHtyfQ0Kc2Vzc2lvbkluZm8oKQ0KYGBgDQoNCg0KDQoNCg0KDQoNCg0KQWRkIGEgbmV3IGNodW5rIGJ5IGNsaWNraW5nIHRoZSAqSW5zZXJ0IENodW5rKiBidXR0b24gb24gdGhlIHRvb2xiYXIgb3IgYnkgcHJlc3NpbmcgKkN0cmwrQWx0K0kqLg0KDQpXaGVuIHlvdSBzYXZlIHRoZSBub3RlYm9vaywgYW4gSFRNTCBmaWxlIGNvbnRhaW5pbmcgdGhlIGNvZGUgYW5kIG91dHB1dCB3aWxsIGJlIHNhdmVkIGFsb25nc2lkZSBpdCAoY2xpY2sgdGhlICpQcmV2aWV3KiBidXR0b24gb3IgcHJlc3MgKkN0cmwrU2hpZnQrSyogdG8gcHJldmlldyB0aGUgSFRNTCBmaWxlKS4NCg0KVGhlIHByZXZpZXcgc2hvd3MgeW91IGEgcmVuZGVyZWQgSFRNTCBjb3B5IG9mIHRoZSBjb250ZW50cyBvZiB0aGUgZWRpdG9yLiBDb25zZXF1ZW50bHksIHVubGlrZSAqS25pdCosICpQcmV2aWV3KiBkb2VzIG5vdCBydW4gYW55IFIgY29kZSBjaHVua3MuIEluc3RlYWQsIHRoZSBvdXRwdXQgb2YgdGhlIGNodW5rIHdoZW4gaXQgd2FzIGxhc3QgcnVuIGluIHRoZSBlZGl0b3IgaXMgZGlzcGxheWVkLg0K