Luisa Fernanda Carrión Ramírez

21/04/2020

1. Introducción

El departamento de Casanare está ubicado en la parte oriental del país, en la parte noroccidental de la Orinoquía (región natural de la cual hace parte este departamento). Su relieve en su mayoría corresponde a tierras bajas y onduladas y planicies que se denominan llanos abajo (Gobernación de Casanare). Centrándonos en la economía del departamento, se sabe que está basada principalmente en actividades agrícolas, la ganadería vacuna y la piscicultura. La ganadería vacuna es considerada la principal fuente de empleo y de ingresos para la población del departamento. La piscicultura por su parte está proyectado como un sistema potencial caracterizado por unidades productivas pequeñas pero numerosas y rentables. El sector agrícola está sustentado en cultivos como la palma africana, sorgo, algodón y arroz. Este último, es el principal cultivo del departamento y representa un 78% de la producción agrícola. Se trabajan principalmente dos variedades: el secano que requiere mano de obra intensiva y el del riego caracterizado por la necesidad de usar una gran cantidad de agua, fertilizantes, insumos especiales y equipos modernos de siembra y cosecha (Gobernación de Casanare). En este cuaderno de R Markdown busca ilustrar las estadísticas agrícolas para el departamento de Casanare en Colombia.

2. Funcionalidades SIG

Mediante la exploración de estadísticas no espaciales se puede conocer y realizar un análisis de lo que ocurre en un territorio en específico. En el programa R existen librerías como dplyr y tidyerse que pueden aplicarse para este fin. Además, las operaciones geoespaciales aportan información útil comprender los problemas que afectan las regiones geográficas. Un ejemplo puede ser averiguar la ubicación de los municipios con promedios altos o bajos en su rendimiento de cosecha. Para realizar la exploración, es necesario unir los datos no espaciales con los datos espaciales. Por otro lado, se pueden realizar uniones espaciales que corresponden a la intersección entre dos objetos espaciales que generalmente son puntos y polígonos. Teniendo esto en cuenta, se procederá a desarrollar el cuaderno en R. Primero, se debe eliminar el contenido de la memoria mediante el siguiente código:

rm(list=ls())

Luego, se deben descargar las librerías “here”, “tidyverse”, “rgeos”, “maptools”, “raster”, “sf”, “viridis”, “rnaturalearth”, “GSORD”, “ggrepel” y “cowplot”. Sin embargo, en este ordenador ya se han instalado algunos de estos paquetes. Es por ello que, al escribir el siguiente código se descargaran únicamente las librerías faltantes:

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, se deben cargar las librerías:
library(here)
library(rgeos)
library(maptools)
library(raster)
library(sf)
library(viridis)
library(rnaturalearth)
library(ggrepel)
library(tidyverse)
library(GSODR)
library(cowplot)

3.Explorando estadísticas agrícolas en Casanare

Para realizar este análisis es necesario descargar el archivo “Estadísticas Municipales Agropecuarias” en formato csv. Este archivo corresponde a una base de datos que almacena la producción agrícola Nacional entre los años 2007 a 2018 haciendo especial énfasis en la información agrícola a nivel regional y nacional. Luego, se usó el programa Excel para eliminar las filas asignadas a otros departamentos diferentes de Boyacá. Este nuevo archivo se guardó con el nombre de EVA_Casanare.csv. Para añadir el archivo se emplea el siguiente código:

datos <- read_csv2("C:/Users/LUISA CARRION/Documents/EVA_Casanare.csv")
Using ',' as decimal and '.' as grouping mark. Use read_delim() for more control.
Parsed with column specification:
cols(
  COD_DEP = col_double(),
  DEPARTAMENTO = col_character(),
  COD_MUN = col_double(),
  MUNICIPIO = col_character(),
  GRUPO = col_character(),
  SUBGRUPO = col_character(),
  CULTIVO = col_character(),
  YEAR = col_double(),
  PERIODO = col_character(),
  Area_siembra = col_double(),
  Area_cosecha = col_double(),
  Produccion = col_double(),
  Rendimiento = col_double(),
  ESTADO = col_character(),
  CICLO = col_character()
)

Usando el comando head() se pueden observar los seis primeros atributos de los datos:

head(datos)

Si se quiere conocer los últimos atributos de los datos se usa:

tail(datos)

Cada municipio tiene distintas estadísticas en atributos como área sembrada, área cosechada y rendimiento que varían además a lo largo de los años y dependiendo del cultivo. Por otro lado, los atributos SUBGRUPO y CULTIVO dan especificaciones sobre el cultivo y, en la mayoría de los casos, contienen la misma información. Cabe destacar que los cultivos se clasifican en un GRUPO. Otro factor a tener en cuenta son las unidades de medición que no se pueden observar en la tabla anteriormente obtenida. Sin embargo, al revisar el csv original, se observa que el área esta expresada en hectáreas y el rendimiento se denota en Ton/ha. Para entender de mejor manera el municipio se necesita obtener 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
head(rend_resumen)

Es necesario calcular el rendimiento promedio por GRUPO en los municipios de Casanare empleando el siguiente código:

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

rend_casanare

En la tabla anterior se pudo observar que los rendimientos más altos corresponden a FRUTALES, HORTALIZAS y TUBÉRCULOS Y PLÁTANOS. Ahora, se requiere conocer cuáles son los municipios con mayor rendimiento en cada cultivo en el año 2018:

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

rend_max_18

Para conocer los municipios con mayor área cosechada en cada grupo de cultivos en el año 2018, se escribe:

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

area_cosecha_max

Según la tabla anterior, el área más extensa cosechada en el año 2018 corresponde a OLEAGINOSAS en el municipio de MANÍ. Al buscar información acerca de las actividades económicas llevadas a cabo en el municipio, se encontró que la producción ganadera y agrícola y la explotación petrolera son las mayormente practicadas. Pese a que la economía se sustenta principalmente en la ganadería vacuna, la agricultura es practicada de forma comercial en áreas de piedemonte haciendo usos de los sistemas tradicionales. Se destacan cultivos como el arroz, la palma africana, el plátano, el maíz, el café y la yuca (Ministerio de Agricultura y Desarrollo Rural, 2013). A partir de esta información, se procede a observar la producción de palma de aceite (en toneladas) en Maní para cada año:

datos %>% 
  filter(MUNICIPIO=="MANI" & SUBGRUPO=="PALMA DE ACEITE") %>% 
  group_by(YEAR, CULTIVO) ->  mani_palma

mani_palma

Los datos obtenidos en la anterior tabla pueden ser usados para una exploración básica al emplear la biblioteca ggplot2:

g <- ggplot(aes(x=YEAR, y=Produccion/1000), data = mani_palma) + geom_bar(stat='identity') + labs(y='Producción de Palma de Aceite [Ton x 1000]') 
g + ggtitle("Evolución de la producción de palma de aceite en Maní del 2007 al 2018") + labs(caption= "Based on EMA data (DANE, 2018)") 

En el anterior gráfico se pudo observar que la producción de palma de aceite ha incrementado de forma sorprendente desde el 2016. Investigando cual puede ser su causa, se encontró que el relieve plano y la textura del suelo son óptimas para el desarrollo de este cultivo (Mujica, 2010). Además, FINAGRO destino un total de 16,399.6 millones de pesos para el sostenimiento de cultivos dedicados a la palma de aceite en el departamento de Casanare entre el 2011 y 2015 (Morales, 2016). Cabe destacar que Colombia está posicionado como el cuarto productor de aceite de palma en el mundo y el primero en América (Fedepalma).

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

total_area_cosecha

Si se quiere conocer qué cultivos tuvieron la mayor área cosechada en 2018, se procede a escribir:

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

total_area_cosecha

Como se observa en la tabla anterior, los CEREALES tuvieron mayor área cosechada en el departamento de Casanare en el año 2018. Sin embargo, no se especifica que cultivos están contenidos en este grupo. Para conocer los datos faltantes se puede investigar en la página del DANE (Departamento Administrativo Nacional de Estadística) que es la agencia gubernamental encargada de llevar las estadísticas nacionales o, puede realizarse una búsqueda en los mismos datos:

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


total_cosecha

En la tabla se puede observar que la mayor área cosechada del grupo de CEREALES se concentra mayormente en el cultivo de arroz. Después de una búsqueda se encontró que los Llanos Orientales han tenido un crecimiento considerable en las áreas sembradas y producción de arroz llegando a sobrepasar en 2019 las estadísticas de producción de departamentos como Tolima y Huila (El Tiempo, 2019).
Teniendo la información anterior en cuenta, se procedió a buscar los municipios con mayor área cosechada de CEREALES en el año 2018 mediante el siguiente código:

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

area_cosecha2

En la anterior tabla se pudo observar que la mayoría de arroz perteneciente al departamento de Casanare es cultivado en el municipio de Paz de Ariporo. Al realizar una consulta sobre las actividades económicas que se realizan en este municipio, se encontró que la agricultura, la ganadería, la explotación de petróleo, el comercio y los servicios son los principales sustentos. Además, los cultivos mayormente encontrados corresponden a café, yuca, maíz, frutales, cacao, arroz y plátano (Gobernación de Casanare). Por otro lado, en el municipio de Aguazul se cultiva mayormente maíz, aunque, la economía de esta zona geográfica también depende de la ganadería extensiva y agricultura concentrada en cultivos como el plátano, la yuca, la palma de aceite, el café y el cacao (Municipio de Aguazul Colombia).
El municipio de Trinidad cultiva en su mayoría maíz, sin embargo, su economía se basa en la ganadería vacuna y se considera el cuarto municipio ganadero en el departamento de Casanare. La agricultura también es importante con cultivos como el arroz y el plátano (Alcaldía Municipal de Trinidad en Casanare). Después de esta información, nos volveremos a centrar en los cereales. Antes de trazar una gráfica se debe agregar un objeto denominado total_área_cosecha y un nuevo campo con las abreviaturas de cada GRUPO de cultivos. Esto se hace con el fin de conservar el orden en el cuaderno y en el plot:

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

Ahora, se escribe el plot:

g <- ggplot(aes(x=CROP, y=sum_area_cosecha), data = total_area_cosecha) + geom_bar(stat='identity') + labs(y='Área total cosechada [Ha]')
g+ ggtitle("Superficie total cosechada por grupos de cultivos en 2018 para Casanare") + theme(plot.title = element_text(hjust = 0.5)) +
   labs(caption= "Based on EMA data (DANE, 2018)")

La grafica anterior nos permite apreciar que los cereales fueron los más cosechados en el año 2018 y, le siguen las oleaginosas. Debido a que estos dos son la fuente principal de la economía en el departamento, a continuación se investigará cómo se ha desarrollado la producción de esos cultivos en el municipio de San Luís de Palenque. San Luis de Palenque es un municipio que concentra su economía principalmente en la ganadería vacuna, la piscicultura, el sector agrario y el turismo (Alcaldía de San Luis de Palenque,2018): Primeramente, se evaluará la producción del arroz:

datos %>% 
  filter(MUNICIPIO=="SAN LUIS DE PALENQUE" & SUBGRUPO=="ARROZ") %>% 
  group_by(YEAR, CULTIVO) ->  sluis_arroz

sluis_arroz

Con la información obtenida en la tabla, procedemos a realizar un gráfico que permita realizar un mejor análisis estadístico:

g <- ggplot(aes(x=YEAR, y=Produccion/1000), data = sluis_arroz) + geom_bar(stat='identity') + labs(y='Producción de arroz  [Ton x 1000]')
g + ggtitle("Evolución de la producción de arroz en San Luís de Palenque del 2007 al 2018") + labs(caption= "Based on EMA data (DANE, 2018)")

Según las estadísticas, en el2018 la producción de arroz en San Luís de Palenque se redujo considerablemente. Tras buscar alguna explicación para esto, se encontró que la reducción en las áreas cosechadas es una estrategia liderada por Fedearroz (Federación Nacional de Arroceros) para normalizar la producción de arroz, evitar un exceso de producto y proteger el precio del arroz (Cardona, 2018). Sin embargo, en el año 2019 se realizó un Plan de Ordenamiento de la Producción de Arroz mediante el cual se busca ayudar al rector arrocero con el proceso de comercialización (Suversion, 2019). Ahora, nos centraremos en las estadísticas de la producción de maíz:

datos %>% 
  filter(MUNICIPIO=="SAN LUIS DE PALENQUE" & SUBGRUPO=="MAIZ") %>% 
  group_by(YEAR, CULTIVO) ->  sluis_maiz

sluis_maiz

Usando la siguiente tabla, podemos realizar un gráfico de la información:

g <- ggplot(aes(x=YEAR, y=Produccion/1000), data = sluis_maiz) + geom_bar(stat='identity') + labs(y='Producción de maíz  [Ton x 1000]')
g + ggtitle("Evolución de la producción de maíz en San Luis de Palenque del 2007 al 2018") + labs(caption= "Based on EMA data (DANE, 2018)")

La producción de maíz bajo considerablemente en al año 2018. La estadística más baja encontrada corresponde al 2012, sin embargo, los años posteriores nos dejan observar un aumento en la producción de este cereal. Este cambio se produjo luego de que la Alcaldía Municipal decidiera apoyar a 80 fincas de pequeños y medianos productores en la implementación de cultivos tradicionales como lo son el maíz, le yuca y el plátano (Alcaldía de San Luis de Palenque, 2013). Al día de hoy, el cultivo de maíz se concentra en todo el municipio y es utilizado principalmente para la alimentación de animales domésticos pese a que se realiza a que se concentra en todo el municipio (Alcaldía de San Luis de Palenque, 2018). Ahora, se evaluarán las estadísticas de producción del sorgo:

datos %>% 
  filter(MUNICIPIO=="SAN LUIS DE PALENQUE" & SUBGRUPO=="SORGO") %>% 
  group_by(YEAR, CULTIVO) ->  sluis_sorgo

sluis_sorgo

Según la tabla anterior, la producción de sorgo no se realiza en el municipio desde el año 2009. Esta información puede ser corroborada al investigar en la página oficial de la Alcaldía de San Luis de Palenque, en donde no se menciona que este cultivo sea considerado un sustento económico para la zona geográfica (Alcaldía de San Luis de Palenque,2018). A continuación se realizará una búsqueda de la producción de palma de aceite en San Luís de Palenque:

datos %>% 
  filter(MUNICIPIO=="SAN LUIS DE PALENQUE" & SUBGRUPO=="PALMA DE ACEITE") %>% 
  group_by(YEAR, CULTIVO) -> sluis_palma

sluis_palma

Teniendo en cuenta la información de la tabla, se realiza un gráfico:

g <- ggplot(aes(x=YEAR, y=Produccion/1000), data = sluis_palma) + geom_bar(stat='identity') + labs(y='Producción de palma de aceite  [Ton x 1000]')
g + ggtitle("Producción de palma de aceite en San Luís de Palenque del 2007 al 2018") + labs(caption= "Based on EMA data (DANE, 2018)")

La producción de palma de aceite en el municipio fue alta en 2011, sin embargo, se redujo considerablemente el en 2012 para incrementarse nuevamente en el 2014. Buscando una causa para este incremento, se encontró que está relacionado con una iniciativa liderada por la Gobernación de Casanare y la Secretaria de Agricultura Ganadería y Medio Ambiente la cual buscaba instruir a los agricultores que deseasen establecer este cultivo por medio de una visita técnica y algunas recomendaciones para la óptima producción de este cultivo (Prensa Libre Casanare, 2012). En el año 2015, la producción se redujo y no ha tenido un crecimiento considerable. De hecho, la economía del municipio no está sustentada principalmente en el cultivo de este producto (Alcaldía de San Luis de Palenque, 2018). Como se pudo observar, la producción de cereales y oleaginosas se redujo considerablemente en el municipio de San Luis de Palenque por diversas causas.

##4. Unir las estadísticas agrícolas a los municipios. Para realizar el join se usará el archivo de Marco Geoestadístico Departamental que se encuentra disponible en el Geoportal del DANE. Estos datos serán leídos por la biblioteca sf:

cas_munic <- sf::st_read("C:/Users/LUISA CARRION/Documents/Geomática/85_CASANARE/ADMINISTRATIVO/MGN_MPIO_POLITICO.shp")
Reading layer `MGN_MPIO_POLITICO' from data source `C:\Users\LUISA CARRION\Documents\Geomática\85_CASANARE\ADMINISTRATIVO\MGN_MPIO_POLITICO.shp' using driver `ESRI Shapefile'
Simple feature collection with 19 features and 9 fields
geometry type:  POLYGON
dimension:      XY
bbox:           xmin: -73.07777 ymin: 4.287476 xmax: -69.83591 ymax: 6.346111
epsg (SRID):    4326
proj4string:    +proj=longlat +datum=WGS84 +no_defs

Ahora, se lee cas_munic:

cas_munic
Simple feature collection with 19 features and 9 fields
geometry type:  POLYGON
dimension:      XY
bbox:           xmin: -73.07777 ymin: 4.287476 xmax: -69.83591 ymax: 6.346111
epsg (SRID):    4326
proj4string:    +proj=longlat +datum=WGS84 +no_defs
First 10 features:
   DPTO_CCDGO MPIO_CCDGO MPIO_CNMBR                                MPIO_CRSLC MPIO_NAREA MPIO_NANO DPTO_CNMBR
1          85      85001      YOPAL     Ordenanza 0038 del 8 de Julio de 1942  2482.9043      2017   CASANARE
2          85      85010    AGUAZUL                                      1950  1442.5073      2017   CASANARE
3          85      85015    CHAMEZA Ordenanza 0021 del 3 de Diciembre de 1959   313.5325      2017   CASANARE
4          85      85136  LA SALINA                                      1780   199.8943      2017   CASANARE
5          85      85139       MANÍ                                      1953  3754.5485      2017   CASANARE
6          85      85162  MONTERREY                                      1960   779.1725      2017   CASANARE
7          85      85225    NUNCHIA                                      1748  1101.8132      2017   CASANARE
8          85      85230     OROCUÉ                                      1845  4753.5185      2017   CASANARE
9          85      85263       PORE                                      1799   780.4712      2017   CASANARE
10         85      85279    RECETOR                                      1798   181.2268      2017   CASANARE
   Shape_Leng Shape_Area                       geometry
1   3.1592326 0.20233677 POLYGON ((-72.39513 5.56853...
2   2.2242959 0.11756477 POLYGON ((-72.56545 5.36972...
3   1.0678483 0.02556381 POLYGON ((-72.81017 5.36659...
4   0.8413073 0.01631711 POLYGON ((-72.33885 6.34470...
5   4.1536144 0.30568793 POLYGON ((-72.34155 5.06495...
6   1.5420451 0.06349198 POLYGON ((-72.89989 5.03465...
7   2.0246932 0.08981176 POLYGON ((-72.19558 5.71924...
8   4.1890475 0.38683367 POLYGON ((-71.50965 5.21730...
9   1.7216899 0.06361918 POLYGON ((-72.04587 5.83819...
10  0.6745774 0.01477602 POLYGON ((-72.80501 5.38092...

Nuestro atributo casa_munic es una colección de características simples. Esto quiere decir que está definido como un estándar formal (ISO 19125-1:2004) que dictamina como se puede representar un objeto del mundo real en la computadora haciendo uso de la geometría espacial. Las características simpes describen como se pueden almacenar los objetos, el procedimiento para recuperar las bases de datos y las operaciones geométricas que están definidas para el objeto. Para hacer el join, se debe conocer el sistema de referencia de coordenadas geográficas. En este caso, se trabaja con coordenadas WGS1984 o código 4326 ESPG. Se puede usar la función left_join para unir los municipios con las estadísticas agrícolas del departamento. Otro factor a tener en cuenta para crear el join, es tener un atributo común o una variable compartida, aunque se recomienda usar un atributo de identificación. Es por eso que en casa_munic se usara el atributo MPIO_CCDGO que parece ser idéntico a COD_MUN:

datos %>% filter (MUNICIPIO =="YOPAL") ->  yopal_datos
yopal_datos

Para conocer el tipo de variable se usa el código:

class(yopal_datos$COD_MUN)
[1] "numeric"

Debido a que es necesario hacer cambios para realizar un buen join, es buena idea crear una copia de los datos originales. De esta manera, si se llenan a dañar los datos, se tendrá un repuesto. Teniendo esto en cuenta, se prosigue en la creación del join:

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

Para mirar los primeros seis atributos se escribe:

head(datos2)

Ahora, se seleccionará un cultivo y se filtraran dos características que sean relevantes como se puede ver en el siguiente código:

datos2 %>% filter(YEAR==2018, CULTIVO == "MAIZ")  -> datos3

Con el código head() se pueden ver algunos atributos de los datos:

head(datos3)

Para mirar el tipo de variable:

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)

Si se quiere observar algunos atributos se escribe:

head(datos4)

Como se pudo observar, convertir la tabla de atributos de formato largo a ancho es un trabajo extenso.

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)

Debido a que se puede cometer algun tipo de error, se crea una copia de la colección de características simples:

cas_munic2 <- cas_munic

Ahora, se creará el join:

ant_munic2$MPIO_CCDGO <- as.character(cas_munic2$MPIO_CCDGO)
ant_munic_stat = left_join(cas_munic2, datos5, by="MPIO_CCDGO")
summary(ant_munic_stat)
 DPTO_CCDGO  MPIO_CCDGO               MPIO_CNMBR   MPIO_CRSLC   MPIO_NAREA        MPIO_NANO       DPTO_CNMBR
 85:19      Length:19          AGUAZUL     : 1   1953   :4    Min.   :  181.2   Min.   :2017   CASANARE:19  
            Class :character   CHAMEZA     : 1   1799   :2    1st Qu.:  590.1   1st Qu.:2017                
            Mode  :character   HATO COROZAL: 1   1748   :1    Median : 1101.8   Median :2017                
                               LA SALINA   : 1   1780   :1    Mean   : 2336.5   Mean   :2017                
                               MANÍ        : 1   1798   :1    3rd Qu.: 2980.0   3rd Qu.:2017                
                               MONTERREY   : 1   1845   :1    Max.   :12115.0   Max.   :2017                
                               (Other)     :13   (Other):9                                                  
   Shape_Leng       Shape_Area       MUNICIPIO          Produccion_1    Produccion_2   Rendimiento_1  
 Min.   :0.6746   Min.   :0.01478   Length:19          Min.   : 13.0   Min.   :200.0   Min.   :1.000  
 1st Qu.:1.3227   1st Qu.:0.04808   Class :character   1st Qu.: 94.0   1st Qu.:235.0   1st Qu.:1.185  
 Median :2.0349   Median :0.08981   Mode  :character   Median :129.0   Median :270.0   Median :2.070  
 Mean   :3.0545   Mean   :0.19027                      Mean   :212.5   Mean   :322.3   Mean   :2.072  
 3rd Qu.:4.2199   3rd Qu.:0.24256                      3rd Qu.:249.5   3rd Qu.:383.5   3rd Qu.:2.505  
 Max.   :8.5701   Max.   :0.98597                      Max.   :611.0   Max.   :497.0   Max.   :4.000  
                                                       NA's   :8       NA's   :16      NA's   :8      
 Rendimiento_2       YEAR_1         YEAR_2              geometry 
 Min.   :1.500   Min.   :2018   Min.   :2018   POLYGON      :19  
 1st Qu.:1.675   1st Qu.:2018   1st Qu.:2018   epsg:4326    : 0  
 Median :1.850   Median :2018   Median :2018   +proj=long...: 0  
 Mean   :1.783   Mean   :2018   Mean   :2018                     
 3rd Qu.:1.925   3rd Qu.:2018   3rd Qu.:2018                     
 Max.   :2.000   Max.   :2018   Max.   :2018                     
 NA's   :16      NA's   :8      NA's   :16                       

5. Trazado

Para realizar el mapa se necesita instar el paquete “RColorBrewer”:

#install.packages("RColorBrewer")

Luego, se cargan las librerías “RColorBrewer” y “leaflet”:

library(RColorBrewer)
library(leaflet)

Por último, se crea un mapa de la producción municipal correspondiente al cultivo de maíz en el año 2018:

bins <- c(0, 250, 500, 1000, 2000, 5000, 10000, 15000)
pal <- colorBin("Spectral", domain = ant_munic_stat$Produccion_1, bins = bins)

  mapa <- leaflet(data = ant_munic_stat) %>%
  addTiles() %>%
  addPolygons(label = ~Produccion_1,
              popup = ~MPIO_CNMBR,
              fillColor = ~pal(Produccion_1),
              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_1,
    title = "Producción de maíz en Casanare [Ton] (2018)",
    opacity = 1
  )
mapa

A partir del mapa se puede decir que el municipio con mayor producción de maíz es San Luís de Palenque seguido por Poré. La producción de San Luís de Palenque fue evaluada anteriormente, sin embargo, cabe destacar que el municipio de Poré basa su economía en el sector agrícola haciendo uso de cultivos como la yuca, el plátano y el maíz (Alcaldía Municipal de Poré en Casanare).

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

Matrix products: default

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

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

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

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

Bibliografia:

Alcaldía de San Luis de Palenque. (2013). Portal Alcaldía San Luis de Palenque. Retrieved 20 April 2020, from https://www.sanluisdepalenque-casanare.gov.co/publicaciones/37488/apoyar-80-fincas-de-pequenos-y-medianos-productores-en-la-implementacion-de-cultivos-tradicionales-yuca-maiz-yzplatano/

Alcaldía de San Luis de Palenque. (2018). Economía. Retrieved 20 April 2020, from https://www.sanluisdepalenque-casanare.gov.co/publicaciones/148/economia/

Alcaldía Municipal de Pore en Casanare. Alcaldía Municipal de Pore en Casanare. Retrieved 20 April 2020, from http://www.pore-casanare.gov.co/municipio/nuestro-municipio

Alcaldía Municipal de Trinidad en Casanare. Alcaldía Municipal de Trinidad en Casanare. Retrieved 19 April 2020, from http://www.trinidad-casanare.gov.co/municipio/nuestro-municipio

Cardona, A. (2018). En los Llanos Orientales se ha reducido el área de arroz para proteger a los agricultores. Agronegocios. Retrieved from https://www.agronegocios.co/agricultura/cual-es-el-area-sembrada-de-arroz-en-colombia-2746876

El Tiempo. (2019). El Llano, líder en la producción de arroz. Retrieved 19 April 2020, from https://www.eltiempo.com/economia/sectores/el-llano-lider-en-la-produccion-de-arroz-351132

Fedepalma. La palma de aceite en Colombia | Fedepalma. Retrieved 20 April 2020, from http://web.fedepalma.org/la-palma-de-aceite-en-colombia-departamentos

Gobernación de Casanare. Economía - Gobernación de Casanare. Retrieved 19 April 2020, from https://www.casanare.gov.co/index.php?idcategoria=1202

Gobernación de Casanare. Economía - Gobernaci&oacuten de Casanare. Retrieved 20 April 2020, from https://www.casanare.gov.co/index.php?idcategoria=1202

Gobernación de Casanare. Localización - Gobernaci&oacuten de Casanare. Retrieved 20 April 2020, from https://www.casanare.gov.co/?idcategoria=1196

Gobernación de Casanare. Paz de Ariporo Casanare - CASANARE. Retrieved 19 April 2020, from https://pazdeariporocasanare.es.tl/CASANARE.htm

Ministerio de Agricultura y Desarrollo Rural. (2013). Proyecto Sistema de Información geográfica municipal 2013. Retrieved 19 April 2020, from http://bibliotecadigital.agronet.gov.co/bitstream/11438/8010/1/SIG-MUNICIPALES%20MAN%C3%8D_CASANARE.pdf

Morales Caballero, J. (2016). Análisis e implicaciones de las nuevas actividades productivas sobre la cultura de la comunidad llanera del municipio de Maní departamento de Casanare (Maestría). Universidad de los Llanos.

Mujica Granados, C., Torres, E., & Vargas Esparza, M. (2010). Evolución del sector palmicultor. Bucaramanga.

Municipio de Aguazul Colombia. ECONOMÍA. Retrieved 19 April 2020, from https://municipioaguazul.wordpress.com/economia/

Prensa Libre Casanare. (2020). GOBERNACIÓN DE CASANARE APOYA CULTIVO EXTENSIVO DE PALMA DE ACEITE Y ADECUACIÓN DE TIERRAS. Retrieved 20 April 2020, from https://prensalibrecasanare.com/casanare/3689-gobernaciun-de-casanare-apoya-cultivo-extensivo-de-palma-de-aceite-y-adecuaciun-de-tierras.html

Suversion. (2019). En Yopal MinAgricultura socializó el Plan de Ordenamiento de la Producción de Arroz. Retrieved from https://suversion.com.co/home/en-yopal-minagricultura-socializo-el-plan-de-ordenamiento-de-la-produccion-de-arroz/

LS0tDQp0aXRsZTogIkVzdGFkw61zdGljYXMgbXVuaWNpcGFsZXMgYWdyb3BlY3VhcmlhcyBkZSBDYXNhbmFyZSINCm91dHB1dDogaHRtbF9ub3RlYm9vaw0KLS0tDQpMdWlzYSBGZXJuYW5kYSBDYXJyacOzbiBSYW3DrXJleg0KDQoyMS8wNC8yMDIwDQoNCg0KIyMgMS4gSW50cm9kdWNjacOzbiANCg0KRWwgZGVwYXJ0YW1lbnRvIGRlIENhc2FuYXJlIGVzdMOhIHViaWNhZG8gZW4gbGEgcGFydGUgb3JpZW50YWwgZGVsIHBhw61zLCBlbiBsYSBwYXJ0ZSBub3JvY2NpZGVudGFsIGRlIGxhIE9yaW5vcXXDrWEgKHJlZ2nDs24gbmF0dXJhbCBkZSBsYSBjdWFsIGhhY2UgcGFydGUgZXN0ZSBkZXBhcnRhbWVudG8pLiAgU3UgcmVsaWV2ZSBlbiBzdSBtYXlvcsOtYSBjb3JyZXNwb25kZSBhIHRpZXJyYXMgYmFqYXMgeSBvbmR1bGFkYXMgeSBwbGFuaWNpZXMgcXVlIHNlIGRlbm9taW5hbiBsbGFub3MgYWJham8gKEdvYmVybmFjacOzbiBkZSBDYXNhbmFyZSkuDQpDZW50csOhbmRvbm9zIGVuIGxhIGVjb25vbcOtYSBkZWwgZGVwYXJ0YW1lbnRvLCBzZSBzYWJlIHF1ZSBlc3TDoSBiYXNhZGEgcHJpbmNpcGFsbWVudGUgZW4gYWN0aXZpZGFkZXMgYWdyw61jb2xhcywgbGEgZ2FuYWRlcsOtYSB2YWN1bmEgeSBsYSBwaXNjaWN1bHR1cmEuDQpMYSBnYW5hZGVyw61hIHZhY3VuYSBlcyBjb25zaWRlcmFkYSBsYSBwcmluY2lwYWwgZnVlbnRlIGRlIGVtcGxlbyB5IGRlIGluZ3Jlc29zIHBhcmEgbGEgcG9ibGFjacOzbiBkZWwgZGVwYXJ0YW1lbnRvLiBMYSBwaXNjaWN1bHR1cmEgcG9yIHN1IHBhcnRlIGVzdMOhIHByb3llY3RhZG8gY29tbyB1biBzaXN0ZW1hIHBvdGVuY2lhbCBjYXJhY3Rlcml6YWRvIHBvciB1bmlkYWRlcyBwcm9kdWN0aXZhcyBwZXF1ZcOxYXMgcGVybyBudW1lcm9zYXMgeSByZW50YWJsZXMuIEVsIHNlY3RvciBhZ3LDrWNvbGEgZXN0w6Egc3VzdGVudGFkbyBlbiBjdWx0aXZvcyBjb21vIGxhIHBhbG1hIGFmcmljYW5hLCBzb3JnbywgYWxnb2TDs24geSBhcnJvei4gRXN0ZSDDumx0aW1vLCBlcyBlbCBwcmluY2lwYWwgY3VsdGl2byBkZWwgZGVwYXJ0YW1lbnRvIHkgcmVwcmVzZW50YSB1biA3OCUgZGUgbGEgcHJvZHVjY2nDs24gYWdyw61jb2xhLiBTZSB0cmFiYWphbiBwcmluY2lwYWxtZW50ZSBkb3MgdmFyaWVkYWRlczogZWwgc2VjYW5vIHF1ZSByZXF1aWVyZSBtYW5vIGRlIG9icmEgaW50ZW5zaXZhIHkgZWwgZGVsIHJpZWdvIGNhcmFjdGVyaXphZG8gcG9yIGxhIG5lY2VzaWRhZCBkZSB1c2FyIHVuYSBncmFuIGNhbnRpZGFkICBkZSBhZ3VhLCBmZXJ0aWxpemFudGVzLCBpbnN1bW9zIGVzcGVjaWFsZXMgeSBlcXVpcG9zIG1vZGVybm9zIGRlIHNpZW1icmEgeSBjb3NlY2hhIChHb2Jlcm5hY2nDs24gZGUgQ2FzYW5hcmUpLg0KRW4gZXN0ZSBjdWFkZXJubyBkZSBSIE1hcmtkb3duIGJ1c2NhIGlsdXN0cmFyIGxhcyBlc3RhZMOtc3RpY2FzIGFncsOtY29sYXMgcGFyYSBlbCBkZXBhcnRhbWVudG8gZGUgQ2FzYW5hcmUgZW4gQ29sb21iaWEuDQoNCiMjIDIuIEZ1bmNpb25hbGlkYWRlcyBTSUcNCk1lZGlhbnRlIGxhIGV4cGxvcmFjacOzbiBkZSBlc3RhZMOtc3RpY2FzIG5vIGVzcGFjaWFsZXMgc2UgcHVlZGUgY29ub2NlciB5IHJlYWxpemFyIHVuIGFuw6FsaXNpcyBkZSBsbyBxdWUgb2N1cnJlIGVuIHVuIHRlcnJpdG9yaW8gZW4gZXNwZWPDrWZpY28uIEVuIGVsIHByb2dyYW1hIFIgZXhpc3RlbiBsaWJyZXLDrWFzIGNvbW8gZHBseXIgeSB0aWR5ZXJzZSBxdWUgcHVlZGVuIGFwbGljYXJzZSBwYXJhIGVzdGUgZmluLg0KQWRlbcOhcywgbGFzIG9wZXJhY2lvbmVzIGdlb2VzcGFjaWFsZXMgYXBvcnRhbiBpbmZvcm1hY2nDs24gw7p0aWwgY29tcHJlbmRlciBsb3MgIHByb2JsZW1hcyBxdWUgYWZlY3RhbiBsYXMgcmVnaW9uZXMgZ2VvZ3LDoWZpY2FzLiBVbiBlamVtcGxvIHB1ZWRlIHNlciBhdmVyaWd1YXIgbGEgdWJpY2FjacOzbiBkZSBsb3MgbXVuaWNpcGlvcyBjb24gcHJvbWVkaW9zIGFsdG9zIG8gYmFqb3MgZW4gc3UgcmVuZGltaWVudG8gZGUgY29zZWNoYS4gIFBhcmEgcmVhbGl6YXIgbGEgZXhwbG9yYWNpw7NuLCBlcyBuZWNlc2FyaW8gdW5pciBsb3MgZGF0b3Mgbm8gZXNwYWNpYWxlcyBjb24gbG9zIGRhdG9zIGVzcGFjaWFsZXMuDQpQb3Igb3RybyBsYWRvLCBzZSBwdWVkZW4gcmVhbGl6YXIgIHVuaW9uZXMgZXNwYWNpYWxlcyBxdWUgY29ycmVzcG9uZGVuIGEgbGEgaW50ZXJzZWNjacOzbiBlbnRyZSBkb3Mgb2JqZXRvcyBlc3BhY2lhbGVzIHF1ZSBnZW5lcmFsbWVudGUgc29uIHB1bnRvcyB5IHBvbMOtZ29ub3MuIFRlbmllbmRvIGVzdG8gZW4gY3VlbnRhLCBzZSBwcm9jZWRlcsOhIGEgZGVzYXJyb2xsYXIgZWwgY3VhZGVybm8gZW4gUi4NClByaW1lcm8sIHNlIGRlYmUgZWxpbWluYXIgZWwgY29udGVuaWRvIGRlIGxhIG1lbW9yaWEgbWVkaWFudGUgZWwgc2lndWllbnRlIGPDs2RpZ286DQpgYGB7cn0NCnJtKGxpc3Q9bHMoKSkNCmBgYA0KTHVlZ28sIHNlIGRlYmVuIGRlc2NhcmdhciBsYXMgbGlicmVyw61hcyDigJxoZXJl4oCdLCDigJx0aWR5dmVyc2XigJ0sIOKAnHJnZW9z4oCdLCDigJxtYXB0b29sc+KAnSwg4oCccmFzdGVy4oCdLCDigJxzZuKAnSwg4oCcdmlyaWRpc+KAnSwg4oCccm5hdHVyYWxlYXJ0aOKAnSwg4oCcR1NPUkTigJ0sIOKAnGdncmVwZWzigJ0gIHkg4oCcY293cGxvdOKAnS4gU2luIGVtYmFyZ28sIGVuIGVzdGUgb3JkZW5hZG9yIHlhIHNlIGhhbiBpbnN0YWxhZG8gYWxndW5vcyBkZSBlc3RvcyBwYXF1ZXRlcy4gRXMgcG9yIGVsbG8gcXVlLCBhbCBlc2NyaWJpciBlbCBzaWd1aWVudGUgY8OzZGlnbyBzZSBkZXNjYXJnYXJhbiDDum5pY2FtZW50ZSBsYXMgbGlicmVyw61hcyBmYWx0YW50ZXM6DQpgYGB7cn0NCmxpc3Qub2YucGFja2FnZXMgPC0gYygiaGVyZSIsICJ0aWR5dmVyc2UiLCAicmdlb3MiLCAibWFwdG9vbHMiLCAicmFzdGVyIiwgInNmIiwgICJ2aXJpZGlzIiwgInJuYXR1cmFsZWFydGgiLCAiR1NPRFIiLCAiZ2dyZXBlbCIsICJjb3dwbG90IikNCm5ldy5wYWNrYWdlcyA8LSBsaXN0Lm9mLnBhY2thZ2VzWyEobGlzdC5vZi5wYWNrYWdlcyAlaW4lIGluc3RhbGxlZC5wYWNrYWdlcygpWywiUGFja2FnZSJdKV0NCmlmKGxlbmd0aChuZXcucGFja2FnZXMpKSBpbnN0YWxsLnBhY2thZ2VzKG5ldy5wYWNrYWdlcykNCmBgYA0KIyMjIyMjIEFob3JhLCBzZSBkZWJlbiBjYXJnYXIgbGFzIGxpYnJlcsOtYXM6DQpgYGB7cn0NCmxpYnJhcnkoaGVyZSkNCmxpYnJhcnkocmdlb3MpDQpsaWJyYXJ5KG1hcHRvb2xzKQ0KbGlicmFyeShyYXN0ZXIpDQpsaWJyYXJ5KHNmKQ0KbGlicmFyeSh2aXJpZGlzKQ0KbGlicmFyeShybmF0dXJhbGVhcnRoKQ0KbGlicmFyeShnZ3JlcGVsKQ0KbGlicmFyeSh0aWR5dmVyc2UpDQpsaWJyYXJ5KEdTT0RSKQ0KbGlicmFyeShjb3dwbG90KQ0KYGBgDQoNCiMjIDMuRXhwbG9yYW5kbyBlc3RhZMOtc3RpY2FzIGFncsOtY29sYXMgZW4gQ2FzYW5hcmUgDQpQYXJhIHJlYWxpemFyIGVzdGUgYW7DoWxpc2lzIGVzIG5lY2VzYXJpbyBkZXNjYXJnYXIgZWwgYXJjaGl2byDigJxFc3RhZMOtc3RpY2FzIE11bmljaXBhbGVzIEFncm9wZWN1YXJpYXPigJ0gZW4gZm9ybWF0byBjc3YuIEVzdGUgYXJjaGl2byBjb3JyZXNwb25kZSBhIHVuYSBiYXNlIGRlIGRhdG9zIHF1ZSBhbG1hY2VuYSBsYSBwcm9kdWNjacOzbiBhZ3LDrWNvbGEgTmFjaW9uYWwgZW50cmUgbG9zIGHDsW9zIDIwMDcgYSAyMDE4IGhhY2llbmRvIGVzcGVjaWFsIMOpbmZhc2lzIGVuIGxhIGluZm9ybWFjacOzbiBhZ3LDrWNvbGEgYSBuaXZlbCByZWdpb25hbCB5IG5hY2lvbmFsLg0KTHVlZ28sIHNlIHVzw7MgZWwgcHJvZ3JhbWEgRXhjZWwgIHBhcmEgZWxpbWluYXIgbGFzIGZpbGFzIGFzaWduYWRhcyBhIG90cm9zIGRlcGFydGFtZW50b3MgZGlmZXJlbnRlcyBkZSBCb3lhY8OhLiBFc3RlIG51ZXZvIGFyY2hpdm8gc2UgZ3VhcmTDsyBjb24gZWwgbm9tYnJlIGRlIEVWQV9DYXNhbmFyZS5jc3YuDQpQYXJhIGHDsWFkaXIgZWwgYXJjaGl2byBzZSBlbXBsZWEgZWwgc2lndWllbnRlIGPDs2RpZ286DQpgYGB7cn0NCmRhdG9zIDwtIHJlYWRfY3N2MigiQzovVXNlcnMvTFVJU0EgQ0FSUklPTi9Eb2N1bWVudHMvRVZBX0Nhc2FuYXJlLmNzdiIpDQpgYGANClVzYW5kbyBlbCBjb21hbmRvIGhlYWQoKSBzZSBwdWVkZW4gb2JzZXJ2YXIgbG9zIHNlaXMgcHJpbWVyb3MgYXRyaWJ1dG9zIGRlIGxvcyBkYXRvczoNCmBgYHtyfQ0KaGVhZChkYXRvcykNCmBgYA0KU2kgc2UgcXVpZXJlIGNvbm9jZXIgbG9zIMO6bHRpbW9zIGF0cmlidXRvcyBkZSBsb3MgZGF0b3Mgc2UgdXNhOg0KYGBge3J9DQp0YWlsKGRhdG9zKQ0KYGBgDQpDYWRhIG11bmljaXBpbyB0aWVuZSBkaXN0aW50YXMgZXN0YWTDrXN0aWNhcyBlbiBhdHJpYnV0b3MgY29tbyDDoXJlYSBzZW1icmFkYSwgw6FyZWEgY29zZWNoYWRhIHkgcmVuZGltaWVudG8gcXVlIHZhcsOtYW4gYWRlbcOhcyBhIGxvIGxhcmdvIGRlIGxvcyBhw7FvcyB5IGRlcGVuZGllbmRvIGRlbCBjdWx0aXZvLiBQb3Igb3RybyBsYWRvLCBsb3MgYXRyaWJ1dG9zIFNVQkdSVVBPIHkgQ1VMVElWTyBkYW4gZXNwZWNpZmljYWNpb25lcyBzb2JyZSBlbCBjdWx0aXZvIHksIGVuIGxhIG1heW9yw61hIGRlIGxvcyBjYXNvcywgY29udGllbmVuIGxhIG1pc21hIGluZm9ybWFjacOzbi4gQ2FiZSBkZXN0YWNhciBxdWUgbG9zIGN1bHRpdm9zIHNlIGNsYXNpZmljYW4gZW4gdW4gR1JVUE8uDQpPdHJvIGZhY3RvciBhIHRlbmVyIGVuIGN1ZW50YSBzb24gbGFzIHVuaWRhZGVzIGRlIG1lZGljacOzbiBxdWUgbm8gc2UgcHVlZGVuIG9ic2VydmFyIGVuIGxhIHRhYmxhIGFudGVyaW9ybWVudGUgb2J0ZW5pZGEuIFNpbiBlbWJhcmdvLCBhbCByZXZpc2FyIGVsIGNzdiBvcmlnaW5hbCwgc2Ugb2JzZXJ2YSBxdWUgZWwgw6FyZWEgZXN0YSBleHByZXNhZGEgZW4gIGhlY3TDoXJlYXMgeSBlbCByZW5kaW1pZW50byBzZSBkZW5vdGEgZW4gVG9uL2hhLg0KUGFyYSBlbnRlbmRlciBkZSBtZWpvciBtYW5lcmEgZWwgbXVuaWNpcGlvIHNlIG5lY2VzaXRhIG9idGVuZXIgdW4gcmVzdW1lbiBkZWwgcmVuZGltaWVudG8gKGVzIGRlY2lyLCBlbCByZW5kaW1pZW50byBwcm9tZWRpbyBkdXJhbnRlIHZhcmlvcyBhw7FvcykgcG9yIGdydXBvIHkgbXVuaWNpcGlvOg0KYGBge3J9DQpkYXRvcyAlPiUNCiAgZ3JvdXBfYnkoTVVOSUNJUElPLCBHUlVQTykgJT4lDQogIHN1bW1hcmlzZShyZW5kX3Byb20gPSBtZWFuKFJlbmRpbWllbnRvLCBuYS5ybSA9IFRSVUUpKSAtPiByZW5kX3Jlc3VtZW4NCmhlYWQocmVuZF9yZXN1bWVuKQ0KYGBgDQpFcyBuZWNlc2FyaW8gY2FsY3VsYXIgZWwgcmVuZGltaWVudG8gcHJvbWVkaW8gcG9yIEdSVVBPIGVuIGxvcyBtdW5pY2lwaW9zIGRlIENhc2FuYXJlIGVtcGxlYW5kbyBlbCBzaWd1aWVudGUgY8OzZGlnbzoNCmBgYHtyfQ0KZGF0b3MgJT4lDQogIGdyb3VwX2J5KEdSVVBPKSAlPiUNCiAgc3VtbWFyaXNlKHJlbmRfZGVwID0gbWVhbihSZW5kaW1pZW50bywgbmEucm0gPSBUUlVFKSkgLT4gcmVuZF9jYXNhbmFyZQ0KDQpyZW5kX2Nhc2FuYXJlDQpgYGANCkVuIGxhIHRhYmxhIGFudGVyaW9yIHNlIHB1ZG8gb2JzZXJ2YXIgcXVlIGxvcyByZW5kaW1pZW50b3MgbcOhcyBhbHRvcyBjb3JyZXNwb25kZW4gYSBGUlVUQUxFUywgSE9SVEFMSVpBUyB5IFRVQsOJUkNVTE9TIFkgUEzDgVRBTk9TLiBBaG9yYSwgc2UgcmVxdWllcmUgY29ub2NlciBjdcOhbGVzIHNvbiBsb3MgbXVuaWNpcGlvcyBjb24gbWF5b3IgcmVuZGltaWVudG8gZW4gY2FkYSBjdWx0aXZvIGVuIGVsIGHDsW8gMjAxODoNCmBgYHtyfQ0KZGF0b3MgJT4lIA0KICBmaWx0ZXIoWUVBUj09MjAxOCkgJT4lIA0KICBncm91cF9ieShHUlVQTywgTVVOSUNJUElPKSAlPiUNCiAgc3VtbWFyaXplKG1heF9yZW5kID0gbWF4KFJlbmRpbWllbnRvLCBuYS5ybSA9IFRSVUUpKSAlPiUNCiAgICBzbGljZSh3aGljaC5tYXgobWF4X3JlbmQpKSAtPiByZW5kX21heF8xOA0KDQpyZW5kX21heF8xOA0KYGBgDQpQYXJhIGNvbm9jZXIgbG9zIG11bmljaXBpb3MgY29uIG1heW9yIMOhcmVhIGNvc2VjaGFkYSBlbiBjYWRhIGdydXBvIGRlIGN1bHRpdm9zIGVuIGVsIGHDsW8gMjAxOCwgc2UgZXNjcmliZTogDQpgYGB7cn0NCmRhdG9zICU+JSANCiAgZmlsdGVyKFlFQVI9PTIwMTgpICU+JSANCiAgZ3JvdXBfYnkoR1JVUE8sIE1VTklDSVBJTykgJT4lDQogIHN1bW1hcml6ZShtYXhfYXJlYV9jb3NlY2hhID0gbWF4KEFyZWFfY29zZWNoYSwgbmEucm0gPSBUUlVFKSkgJT4lDQogICAgc2xpY2Uod2hpY2gubWF4KG1heF9hcmVhX2Nvc2VjaGEpKSAtPiBhcmVhX2Nvc2VjaGFfbWF4DQoNCmFyZWFfY29zZWNoYV9tYXgNCmBgYA0KU2Vnw7puIGxhIHRhYmxhIGFudGVyaW9yLCBlbCDDoXJlYSBtw6FzIGV4dGVuc2EgY29zZWNoYWRhIGVuIGVsIGHDsW8gMjAxOCBjb3JyZXNwb25kZSBhIE9MRUFHSU5PU0FTIGVuIGVsIG11bmljaXBpbyBkZSBNQU7DjS4gQWwgYnVzY2FyIGluZm9ybWFjacOzbiBhY2VyY2EgZGUgbGFzIGFjdGl2aWRhZGVzIGVjb27Ds21pY2FzIGxsZXZhZGFzIGEgY2FibyBlbiBlbCBtdW5pY2lwaW8sIHNlIGVuY29udHLDsyBxdWUgbGEgcHJvZHVjY2nDs24gZ2FuYWRlcmEgeSBhZ3LDrWNvbGEgeSBsYSBleHBsb3RhY2nDs24gcGV0cm9sZXJhIHNvbiBsYXMgbWF5b3JtZW50ZSBwcmFjdGljYWRhcy4gUGVzZSBhIHF1ZSBsYSBlY29ub23DrWEgc2Ugc3VzdGVudGEgcHJpbmNpcGFsbWVudGUgZW4gbGEgZ2FuYWRlcsOtYSB2YWN1bmEsIGxhIGFncmljdWx0dXJhIGVzIHByYWN0aWNhZGEgZGUgZm9ybWEgY29tZXJjaWFsIGVuIMOhcmVhcyBkZSBwaWVkZW1vbnRlIGhhY2llbmRvIHVzb3MgZGUgbG9zIHNpc3RlbWFzIHRyYWRpY2lvbmFsZXMuIFNlIGRlc3RhY2FuIGN1bHRpdm9zIGNvbW8gZWwgYXJyb3osIGxhIHBhbG1hIGFmcmljYW5hLCBlbCBwbMOhdGFubywgZWwgbWHDrXosIGVsIGNhZsOpIHkgbGEgeXVjYSAoTWluaXN0ZXJpbyBkZSBBZ3JpY3VsdHVyYSB5IERlc2Fycm9sbG8gUnVyYWwsIDIwMTMpLg0KQSBwYXJ0aXIgZGUgZXN0YSBpbmZvcm1hY2nDs24sIHNlIHByb2NlZGUgYSBvYnNlcnZhciBsYSBwcm9kdWNjacOzbiBkZSBwYWxtYSBkZSBhY2VpdGUgKGVuIHRvbmVsYWRhcykgZW4gTWFuw60gcGFyYSBjYWRhIGHDsW86DQpgYGB7cn0NCmRhdG9zICU+JSANCiAgZmlsdGVyKE1VTklDSVBJTz09Ik1BTkkiICYgU1VCR1JVUE89PSJQQUxNQSBERSBBQ0VJVEUiKSAlPiUgDQogIGdyb3VwX2J5KFlFQVIsIENVTFRJVk8pIC0+ICBtYW5pX3BhbG1hDQoNCm1hbmlfcGFsbWENCmBgYA0KTG9zIGRhdG9zIG9idGVuaWRvcyBlbiBsYSBhbnRlcmlvciB0YWJsYSBwdWVkZW4gc2VyIHVzYWRvcyBwYXJhIHVuYSBleHBsb3JhY2nDs24gYsOhc2ljYSBhbCBlbXBsZWFyIGxhIGJpYmxpb3RlY2EgZ2dwbG90MjoNCmBgYHtyfQ0KZyA8LSBnZ3Bsb3QoYWVzKHg9WUVBUiwgeT1Qcm9kdWNjaW9uLzEwMDApLCBkYXRhID0gbWFuaV9wYWxtYSkgKyBnZW9tX2JhcihzdGF0PSdpZGVudGl0eScpICsgbGFicyh5PSdQcm9kdWNjacOzbiBkZSBQYWxtYSBkZSBBY2VpdGUgW1RvbiB4IDEwMDBdJykgDQpgYGANCg0KYGBge3J9DQpnICsgZ2d0aXRsZSgiRXZvbHVjacOzbiBkZSBsYSBwcm9kdWNjacOzbiBkZSBwYWxtYSBkZSBhY2VpdGUgZW4gTWFuw60gZGVsIDIwMDcgYWwgMjAxOCIpICsgbGFicyhjYXB0aW9uPSAiQmFzZWQgb24gRU1BIGRhdGEgKERBTkUsIDIwMTgpIikgDQpgYGANCkVuIGVsIGFudGVyaW9yIGdyw6FmaWNvIHNlIHB1ZG8gb2JzZXJ2YXIgcXVlIGxhIHByb2R1Y2Npw7NuIGRlIHBhbG1hIGRlIGFjZWl0ZSBoYSBpbmNyZW1lbnRhZG8gZGUgZm9ybWEgc29ycHJlbmRlbnRlIGRlc2RlIGVsIDIwMTYuIEludmVzdGlnYW5kbyBjdWFsIHB1ZWRlIHNlciBzdSBjYXVzYSwgc2UgZW5jb250csOzIHF1ZSBlbCByZWxpZXZlIHBsYW5vIHkgbGEgdGV4dHVyYSBkZWwgc3VlbG8gc29uIMOzcHRpbWFzIHBhcmEgZWwgZGVzYXJyb2xsbyBkZSBlc3RlIGN1bHRpdm8gKE11amljYSwgMjAxMCkuIEFkZW3DoXMsIEZJTkFHUk8gZGVzdGlubyB1biB0b3RhbCBkZSAxNiwzOTkuNiBtaWxsb25lcyBkZSBwZXNvcyBwYXJhIGVsIHNvc3RlbmltaWVudG8gZGUgY3VsdGl2b3MgZGVkaWNhZG9zIGEgbGEgcGFsbWEgZGUgYWNlaXRlIGVuIGVsIGRlcGFydGFtZW50byBkZSBDYXNhbmFyZSBlbnRyZSBlbCAyMDExIHkgMjAxNSAoTW9yYWxlcywgMjAxNikuDQpDYWJlIGRlc3RhY2FyIHF1ZSBDb2xvbWJpYSBlc3TDoSBwb3NpY2lvbmFkbyBjb21vIGVsIGN1YXJ0byBwcm9kdWN0b3IgZGUgYWNlaXRlIGRlIHBhbG1hIGVuIGVsIG11bmRvIHkgZWwgcHJpbWVybyBlbiBBbcOpcmljYSAoRmVkZXBhbG1hKS4NCmBgYHtyfQ0KZGF0b3MgJT4lIA0KICBmaWx0ZXIoWUVBUj09MjAxOCkgJT4lIA0KICBncm91cF9ieShHUlVQTykgJT4lDQogIHN1bW1hcml6ZShzdW1fYXJlYV9jb3NlY2hhID0gc3VtKEFyZWFfY29zZWNoYSwgbmEucm0gPSBUUlVFKSkgJT4lDQogICAgIGFycmFuZ2UoZGVzYyhzdW1fYXJlYV9jb3NlY2hhKSkgLT4gdG90YWxfYXJlYV9jb3NlY2hhDQoNCnRvdGFsX2FyZWFfY29zZWNoYQ0KYGBgDQpTaSBzZSBxdWllcmUgY29ub2NlciBxdcOpIGN1bHRpdm9zIHR1dmllcm9uIGxhIG1heW9yIMOhcmVhIGNvc2VjaGFkYSBlbiAyMDE4LCBzZSBwcm9jZWRlIGEgZXNjcmliaXI6DQpgYGB7cn0NCmRhdG9zICU+JSANCiAgZmlsdGVyKFlFQVI9PTIwMTgpICU+JSANCiAgZ3JvdXBfYnkoR1JVUE8pICU+JQ0KICBzdW1tYXJpemUoc3VtX2FyZWFfY29zZWNoYSA9IHN1bShBcmVhX2Nvc2VjaGEsIG5hLnJtID0gVFJVRSkpICU+JQ0KICAgICBhcnJhbmdlKGRlc2Moc3VtX2FyZWFfY29zZWNoYSkpIC0+IHRvdGFsX2FyZWFfY29zZWNoYQ0KDQp0b3RhbF9hcmVhX2Nvc2VjaGENCmBgYA0KQ29tbyBzZSBvYnNlcnZhIGVuIGxhIHRhYmxhIGFudGVyaW9yLCBsb3MgQ0VSRUFMRVMgdHV2aWVyb24gbWF5b3Igw6FyZWEgY29zZWNoYWRhIGVuIGVsIGRlcGFydGFtZW50byBkZSBDYXNhbmFyZSBlbiBlbCBhw7FvIDIwMTguIFNpbiBlbWJhcmdvLCBubyBzZSBlc3BlY2lmaWNhIHF1ZSBjdWx0aXZvcyBlc3TDoW4gY29udGVuaWRvcyBlbiBlc3RlIGdydXBvLiAgUGFyYSBjb25vY2VyIGxvcyBkYXRvcyBmYWx0YW50ZXMgc2UgcHVlZGUgaW52ZXN0aWdhciBlbiBsYSBww6FnaW5hIGRlbCBEQU5FIChEZXBhcnRhbWVudG8gQWRtaW5pc3RyYXRpdm8gTmFjaW9uYWwgZGUgRXN0YWTDrXN0aWNhKSBxdWUgZXMgbGEgYWdlbmNpYSBndWJlcm5hbWVudGFsIGVuY2FyZ2FkYSBkZSBsbGV2YXIgbGFzIGVzdGFkw61zdGljYXMgbmFjaW9uYWxlcyBvLCBwdWVkZSByZWFsaXphcnNlIHVuYSBiw7pzcXVlZGEgZW4gbG9zIG1pc21vcyBkYXRvczoNCmBgYHtyfQ0KZGF0b3MgJT4lDQogIGZpbHRlcihHUlVQTz09IkNFUkVBTEVTIiAmIFlFQVI9PTIwMTgpICU+JQ0KICBncm91cF9ieShDVUxUSVZPKSAlPiUNCiAgc3VtbWFyaXplKHN1bV9jb3NlY2hhID0gc3VtKGBBcmVhX2Nvc2VjaGFgLCBuYS5ybSA9IFRSVUUpKSAlPiUNCiAgICAgYXJyYW5nZShkZXNjKHN1bV9jb3NlY2hhKSkgLT4gdG90YWxfY29zZWNoYQ0KDQoNCnRvdGFsX2Nvc2VjaGENCmBgYA0KRW4gbGEgdGFibGEgc2UgcHVlZGUgb2JzZXJ2YXIgcXVlIGxhIG1heW9yIMOhcmVhIGNvc2VjaGFkYSBkZWwgZ3J1cG8gZGUgQ0VSRUFMRVMgc2UgY29uY2VudHJhIG1heW9ybWVudGUgZW4gZWwgY3VsdGl2byBkZSBhcnJvei4gRGVzcHXDqXMgZGUgdW5hIGLDunNxdWVkYSBzZSBlbmNvbnRyw7MgcXVlIGxvcyBMbGFub3MgT3JpZW50YWxlcyBoYW4gdGVuaWRvIHVuIGNyZWNpbWllbnRvIGNvbnNpZGVyYWJsZSBlbiBsYXMgw6FyZWFzIHNlbWJyYWRhcyB5IHByb2R1Y2Npw7NuIGRlIGFycm96IGxsZWdhbmRvIGEgc29icmVwYXNhciBlbiAyMDE5IGxhcyBlc3RhZMOtc3RpY2FzIGRlIHByb2R1Y2Npw7NuIGRlIGRlcGFydGFtZW50b3MgY29tbyBUb2xpbWEgeSBIdWlsYSAoRWwgVGllbXBvLCAyMDE5KS4gICANClRlbmllbmRvIGxhIGluZm9ybWFjacOzbiBhbnRlcmlvciBlbiBjdWVudGEsIHNlIHByb2NlZGnDsyBhIGJ1c2NhciBsb3MgbXVuaWNpcGlvcyBjb24gbWF5b3Igw6FyZWEgY29zZWNoYWRhIGRlIENFUkVBTEVTIGVuIGVsIGHDsW8gMjAxOCBtZWRpYW50ZSBlbCBzaWd1aWVudGUgY8OzZGlnbzoNCmBgYHtyfQ0KZGF0b3MgJT4lIA0KICBmaWx0ZXIoWUVBUj09MjAxOCAmIEdSVVBPPT0iQ0VSRUFMRVMiKSAlPiUgDQogIGdyb3VwX2J5KENVTFRJVk8sIE1VTklDSVBJTykgJT4lDQogIHN1bW1hcml6ZShtYXhfYXJlYTIgPSBtYXgoQXJlYV9jb3NlY2hhLCBuYS5ybSA9IFRSVUUpKSAlPiUNCiAgICBzbGljZSh3aGljaC5tYXgobWF4X2FyZWEyKSkgLT4gYXJlYV9jb3NlY2hhMg0KDQphcmVhX2Nvc2VjaGEyDQpgYGANCkVuIGxhIGFudGVyaW9yIHRhYmxhIHNlIHB1ZG8gb2JzZXJ2YXIgcXVlIGxhIG1heW9yw61hIGRlIGFycm96IHBlcnRlbmVjaWVudGUgYWwgZGVwYXJ0YW1lbnRvIGRlIENhc2FuYXJlIGVzIGN1bHRpdmFkbyBlbiBlbCBtdW5pY2lwaW8gZGUgUGF6IGRlIEFyaXBvcm8uIEFsIHJlYWxpemFyIHVuYSBjb25zdWx0YSBzb2JyZSBsYXMgYWN0aXZpZGFkZXMgZWNvbsOzbWljYXMgcXVlIHNlIHJlYWxpemFuIGVuIGVzdGUgbXVuaWNpcGlvLCBzZSBlbmNvbnRyw7MgcXVlIGxhIGFncmljdWx0dXJhLCBsYSBnYW5hZGVyw61hLCBsYSBleHBsb3RhY2nDs24gZGUgcGV0csOzbGVvLCBlbCBjb21lcmNpbyB5IGxvcyBzZXJ2aWNpb3Mgc29uIGxvcyBwcmluY2lwYWxlcyBzdXN0ZW50b3MuIEFkZW3DoXMsIGxvcyBjdWx0aXZvcyBtYXlvcm1lbnRlIGVuY29udHJhZG9zIGNvcnJlc3BvbmRlbiBhIGNhZsOpLCB5dWNhLCBtYcOteiwgZnJ1dGFsZXMsIGNhY2FvLCBhcnJveiB5IHBsw6F0YW5vIChHb2Jlcm5hY2nDs24gZGUgQ2FzYW5hcmUpLiANClBvciBvdHJvIGxhZG8sIGVuIGVsIG11bmljaXBpbyBkZSBBZ3VhenVsIHNlIGN1bHRpdmEgbWF5b3JtZW50ZSBtYcOteiwgYXVucXVlLCBsYSBlY29ub23DrWEgZGUgZXN0YSB6b25hIGdlb2dyw6FmaWNhIHRhbWJpw6luIGRlcGVuZGUgZGUgbGEgZ2FuYWRlcsOtYSBleHRlbnNpdmEgeSBhZ3JpY3VsdHVyYSBjb25jZW50cmFkYSBlbiBjdWx0aXZvcyBjb21vIGVsIHBsw6F0YW5vLCBsYSB5dWNhLCBsYSBwYWxtYSBkZSBhY2VpdGUsIGVsIGNhZsOpIHkgZWwgY2FjYW8gKE11bmljaXBpbyBkZSBBZ3VhenVsIENvbG9tYmlhKS4gIA0KRWwgbXVuaWNpcGlvIGRlIFRyaW5pZGFkIGN1bHRpdmEgZW4gc3UgbWF5b3LDrWEgbWHDrXosIHNpbiBlbWJhcmdvLCBzdSBlY29ub23DrWEgc2UgYmFzYSBlbiBsYSBnYW5hZGVyw61hIHZhY3VuYSB5IHNlIGNvbnNpZGVyYSBlbCBjdWFydG8gbXVuaWNpcGlvIGdhbmFkZXJvIGVuIGVsIGRlcGFydGFtZW50byBkZSBDYXNhbmFyZS4gTGEgYWdyaWN1bHR1cmEgdGFtYmnDqW4gZXMgaW1wb3J0YW50ZSBjb24gY3VsdGl2b3MgY29tbyBlbCBhcnJveiB5IGVsIHBsw6F0YW5vIChBbGNhbGTDrWEgTXVuaWNpcGFsIGRlIFRyaW5pZGFkIGVuIENhc2FuYXJlKS4NCkRlc3B1w6lzIGRlIGVzdGEgaW5mb3JtYWNpw7NuLCBub3Mgdm9sdmVyZW1vcyBhIGNlbnRyYXIgZW4gbG9zIGNlcmVhbGVzLiBBbnRlcyBkZSB0cmF6YXIgdW5hIGdyw6FmaWNhIHNlIGRlYmUgYWdyZWdhciB1biBvYmpldG8gZGVub21pbmFkbyB0b3RhbF/DoXJlYV9jb3NlY2hhIHkgdW4gbnVldm8gY2FtcG8gY29uIGxhcyBhYnJldmlhdHVyYXMgZGUgY2FkYSBHUlVQTyBkZSBjdWx0aXZvcy4gRXN0byBzZSBoYWNlIGNvbiBlbCBmaW4gZGUgY29uc2VydmFyIGVsIG9yZGVuIGVuIGVsIGN1YWRlcm5vIHkgZW4gZWwgcGxvdDoNCg0KYGBge3J9DQp0b3RhbF9hcmVhX2Nvc2VjaGEkQ1JPUCA8LSBhYmJyZXZpYXRlKHRvdGFsX2FyZWFfY29zZWNoYSRHUlVQTywgMykNCmBgYA0KQWhvcmEsIHNlIGVzY3JpYmUgZWwgcGxvdDoNCmBgYHtyfQ0KZyA8LSBnZ3Bsb3QoYWVzKHg9Q1JPUCwgeT1zdW1fYXJlYV9jb3NlY2hhKSwgZGF0YSA9IHRvdGFsX2FyZWFfY29zZWNoYSkgKyBnZW9tX2JhcihzdGF0PSdpZGVudGl0eScpICsgbGFicyh5PSfDgXJlYSB0b3RhbCBjb3NlY2hhZGEgW0hhXScpDQpgYGANCg0KYGBge3J9DQpnKyBnZ3RpdGxlKCJTdXBlcmZpY2llIHRvdGFsIGNvc2VjaGFkYSBwb3IgZ3J1cG9zIGRlIGN1bHRpdm9zIGVuIDIwMTggcGFyYSBDYXNhbmFyZSIpICsgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSkpICsNCiAgIGxhYnMoY2FwdGlvbj0gIkJhc2VkIG9uIEVNQSBkYXRhIChEQU5FLCAyMDE4KSIpDQpgYGANCkxhIGdyYWZpY2EgYW50ZXJpb3Igbm9zIHBlcm1pdGUgYXByZWNpYXIgcXVlIGxvcyBjZXJlYWxlcyBmdWVyb24gbG9zIG3DoXMgY29zZWNoYWRvcyBlbiBlbCBhw7FvIDIwMTggeSwgbGUgc2lndWVuIGxhcyBvbGVhZ2lub3Nhcy4gRGViaWRvIGEgcXVlIGVzdG9zIGRvcyBzb24gbGEgZnVlbnRlIHByaW5jaXBhbCBkZSBsYSBlY29ub23DrWEgZW4gZWwgZGVwYXJ0YW1lbnRvLCBhIGNvbnRpbnVhY2nDs24gc2UgaW52ZXN0aWdhcsOhIGPDs21vIHNlIGhhIGRlc2Fycm9sbGFkbyBsYSBwcm9kdWNjacOzbiBkZSBlc29zIGN1bHRpdm9zIGVuIGVsIG11bmljaXBpbyBkZSBTYW4gTHXDrXMgZGUgUGFsZW5xdWUuDQpTYW4gTHVpcyBkZSBQYWxlbnF1ZSBlcyB1biBtdW5pY2lwaW8gcXVlIGNvbmNlbnRyYSBzdSBlY29ub23DrWEgcHJpbmNpcGFsbWVudGUgZW4gbGEgZ2FuYWRlcsOtYSB2YWN1bmEsIGxhIHBpc2NpY3VsdHVyYSwgZWwgc2VjdG9yIGFncmFyaW8geSBlbCB0dXJpc21vIChBbGNhbGTDrWEgZGUgU2FuIEx1aXMgZGUgUGFsZW5xdWUsMjAxOCk6DQpQcmltZXJhbWVudGUsIHNlIGV2YWx1YXLDoSBsYSBwcm9kdWNjacOzbiBkZWwgYXJyb3o6DQpgYGB7cn0NCmRhdG9zICU+JSANCiAgZmlsdGVyKE1VTklDSVBJTz09IlNBTiBMVUlTIERFIFBBTEVOUVVFIiAmIFNVQkdSVVBPPT0iQVJST1oiKSAlPiUgDQogIGdyb3VwX2J5KFlFQVIsIENVTFRJVk8pIC0+ICBzbHVpc19hcnJveg0KDQpzbHVpc19hcnJveg0KYGBgDQpDb24gbGEgaW5mb3JtYWNpw7NuIG9idGVuaWRhIGVuIGxhIHRhYmxhLCBwcm9jZWRlbW9zIGEgcmVhbGl6YXIgdW4gZ3LDoWZpY28gcXVlIHBlcm1pdGEgcmVhbGl6YXIgdW4gbWVqb3IgYW7DoWxpc2lzIGVzdGFkw61zdGljbzoNCmBgYHtyfQ0KZyA8LSBnZ3Bsb3QoYWVzKHg9WUVBUiwgeT1Qcm9kdWNjaW9uLzEwMDApLCBkYXRhID0gc2x1aXNfYXJyb3opICsgZ2VvbV9iYXIoc3RhdD0naWRlbnRpdHknKSArIGxhYnMoeT0nUHJvZHVjY2nDs24gZGUgYXJyb3ogIFtUb24geCAxMDAwXScpDQpgYGANCg0KYGBge3J9DQpnICsgZ2d0aXRsZSgiRXZvbHVjacOzbiBkZSBsYSBwcm9kdWNjacOzbiBkZSBhcnJveiBlbiBTYW4gTHXDrXMgZGUgUGFsZW5xdWUgZGVsIDIwMDcgYWwgMjAxOCIpICsgbGFicyhjYXB0aW9uPSAiQmFzZWQgb24gRU1BIGRhdGEgKERBTkUsIDIwMTgpIikNCmBgYA0KU2Vnw7puIGxhcyBlc3RhZMOtc3RpY2FzLCBlbiBlbDIwMTggbGEgcHJvZHVjY2nDs24gZGUgYXJyb3ogZW4gU2FuIEx1w61zIGRlIFBhbGVucXVlIHNlIHJlZHVqbyBjb25zaWRlcmFibGVtZW50ZS4gVHJhcyBidXNjYXIgYWxndW5hIGV4cGxpY2FjacOzbiBwYXJhIGVzdG8sIHNlIGVuY29udHLDsyBxdWUgbGEgcmVkdWNjacOzbiBlbiBsYXMgw6FyZWFzIGNvc2VjaGFkYXMgZXMgdW5hIGVzdHJhdGVnaWEgbGlkZXJhZGEgcG9yIEZlZGVhcnJveiAoRmVkZXJhY2nDs24gTmFjaW9uYWwgZGUgQXJyb2Nlcm9zKSBwYXJhIG5vcm1hbGl6YXIgbGEgcHJvZHVjY2nDs24gZGUgYXJyb3osIGV2aXRhciB1biBleGNlc28gZGUgcHJvZHVjdG8geSBwcm90ZWdlciBlbCBwcmVjaW8gZGVsIGFycm96IChDYXJkb25hLCAyMDE4KS4gU2luIGVtYmFyZ28sIGVuIGVsIGHDsW8gMjAxOSBzZSByZWFsaXrDsyB1biBQbGFuIGRlIE9yZGVuYW1pZW50byBkZSBsYSBQcm9kdWNjacOzbiBkZSBBcnJveiBtZWRpYW50ZSBlbCBjdWFsIHNlIGJ1c2NhIGF5dWRhciBhbCByZWN0b3IgYXJyb2Nlcm8gY29uIGVsIHByb2Nlc28gZGUgY29tZXJjaWFsaXphY2nDs24gKFN1dmVyc2lvbiwgMjAxOSkuDQpBaG9yYSwgbm9zIGNlbnRyYXJlbW9zIGVuIGxhcyBlc3RhZMOtc3RpY2FzIGRlIGxhIHByb2R1Y2Npw7NuIGRlIG1hw616Og0KYGBge3J9DQpkYXRvcyAlPiUgDQogIGZpbHRlcihNVU5JQ0lQSU89PSJTQU4gTFVJUyBERSBQQUxFTlFVRSIgJiBTVUJHUlVQTz09Ik1BSVoiKSAlPiUgDQogIGdyb3VwX2J5KFlFQVIsIENVTFRJVk8pIC0+ICBzbHVpc19tYWl6DQoNCnNsdWlzX21haXoNCmBgYA0KVXNhbmRvIGxhIHNpZ3VpZW50ZSB0YWJsYSwgcG9kZW1vcyByZWFsaXphciB1biBncsOhZmljbyBkZSBsYSBpbmZvcm1hY2nDs246DQpgYGB7cn0NCmcgPC0gZ2dwbG90KGFlcyh4PVlFQVIsIHk9UHJvZHVjY2lvbi8xMDAwKSwgZGF0YSA9IHNsdWlzX21haXopICsgZ2VvbV9iYXIoc3RhdD0naWRlbnRpdHknKSArIGxhYnMoeT0nUHJvZHVjY2nDs24gZGUgbWHDrXogIFtUb24geCAxMDAwXScpDQpgYGANCg0KYGBge3J9DQpnICsgZ2d0aXRsZSgiRXZvbHVjacOzbiBkZSBsYSBwcm9kdWNjacOzbiBkZSBtYcOteiBlbiBTYW4gTHVpcyBkZSBQYWxlbnF1ZSBkZWwgMjAwNyBhbCAyMDE4IikgKyBsYWJzKGNhcHRpb249ICJCYXNlZCBvbiBFTUEgZGF0YSAoREFORSwgMjAxOCkiKQ0KYGBgDQpMYSBwcm9kdWNjacOzbiBkZSBtYcOteiBiYWpvIGNvbnNpZGVyYWJsZW1lbnRlIGVuIGFsIGHDsW8gMjAxOC4gTGEgZXN0YWTDrXN0aWNhIG3DoXMgYmFqYSBlbmNvbnRyYWRhIGNvcnJlc3BvbmRlIGFsIDIwMTIsIHNpbiBlbWJhcmdvLCBsb3MgYcOxb3MgcG9zdGVyaW9yZXMgbm9zIGRlamFuIG9ic2VydmFyIHVuIGF1bWVudG8gZW4gbGEgcHJvZHVjY2nDs24gZGUgZXN0ZSBjZXJlYWwuIEVzdGUgY2FtYmlvIHNlIHByb2R1am8gbHVlZ28gZGUgcXVlIGxhIEFsY2FsZMOtYSBNdW5pY2lwYWwgZGVjaWRpZXJhIGFwb3lhciBhIDgwIGZpbmNhcyBkZSBwZXF1ZcOxb3MgeSBtZWRpYW5vcyBwcm9kdWN0b3JlcyBlbiBsYSBpbXBsZW1lbnRhY2nDs24gZGUgY3VsdGl2b3MgdHJhZGljaW9uYWxlcyBjb21vIGxvIHNvbiBlbCBtYcOteiwgbGUgeXVjYSB5IGVsIHBsw6F0YW5vIChBbGNhbGTDrWEgZGUgU2FuIEx1aXMgZGUgUGFsZW5xdWUsIDIwMTMpLiBBbCBkw61hIGRlIGhveSwgZWwgY3VsdGl2byBkZSBtYcOteiBzZSBjb25jZW50cmEgZW4gdG9kbyBlbCBtdW5pY2lwaW8geSBlcyB1dGlsaXphZG8gcHJpbmNpcGFsbWVudGUgcGFyYSBsYSBhbGltZW50YWNpw7NuIGRlIGFuaW1hbGVzIGRvbcOpc3RpY29zIHBlc2UgYSBxdWUgc2UgcmVhbGl6YSBhIHF1ZSBzZSBjb25jZW50cmEgZW4gdG9kbyBlbCBtdW5pY2lwaW8gKEFsY2FsZMOtYSBkZSBTYW4gTHVpcyBkZSBQYWxlbnF1ZSwgMjAxOCkuDQpBaG9yYSwgc2UgZXZhbHVhcsOhbiBsYXMgZXN0YWTDrXN0aWNhcyBkZSBwcm9kdWNjacOzbiBkZWwgc29yZ286DQpgYGB7cn0NCmRhdG9zICU+JSANCiAgZmlsdGVyKE1VTklDSVBJTz09IlNBTiBMVUlTIERFIFBBTEVOUVVFIiAmIFNVQkdSVVBPPT0iU09SR08iKSAlPiUgDQogIGdyb3VwX2J5KFlFQVIsIENVTFRJVk8pIC0+ICBzbHVpc19zb3Jnbw0KDQpzbHVpc19zb3Jnbw0KYGBgDQpTZWfDum4gbGEgdGFibGEgYW50ZXJpb3IsIGxhIHByb2R1Y2Npw7NuIGRlIHNvcmdvIG5vIHNlIHJlYWxpemEgZW4gZWwgbXVuaWNpcGlvIGRlc2RlIGVsIGHDsW8gMjAwOS4gRXN0YSBpbmZvcm1hY2nDs24gcHVlZGUgc2VyIGNvcnJvYm9yYWRhIGFsIGludmVzdGlnYXIgZW4gbGEgcMOhZ2luYSBvZmljaWFsIGRlIGxhIEFsY2FsZMOtYSBkZSBTYW4gTHVpcyBkZSBQYWxlbnF1ZSwgZW4gZG9uZGUgbm8gc2UgbWVuY2lvbmEgcXVlIGVzdGUgY3VsdGl2byBzZWEgY29uc2lkZXJhZG8gdW4gc3VzdGVudG8gZWNvbsOzbWljbyBwYXJhIGxhIHpvbmEgZ2VvZ3LDoWZpY2EgKEFsY2FsZMOtYSBkZSBTYW4gTHVpcyBkZSBQYWxlbnF1ZSwyMDE4KS4gDQpBIGNvbnRpbnVhY2nDs24gc2UgcmVhbGl6YXLDoSB1bmEgYsO6c3F1ZWRhIGRlIGxhIHByb2R1Y2Npw7NuIGRlIHBhbG1hIGRlIGFjZWl0ZSBlbiBTYW4gTHXDrXMgZGUgUGFsZW5xdWU6IA0KYGBge3J9DQpkYXRvcyAlPiUgDQogIGZpbHRlcihNVU5JQ0lQSU89PSJTQU4gTFVJUyBERSBQQUxFTlFVRSIgJiBTVUJHUlVQTz09IlBBTE1BIERFIEFDRUlURSIpICU+JSANCiAgZ3JvdXBfYnkoWUVBUiwgQ1VMVElWTykgLT4gc2x1aXNfcGFsbWENCg0Kc2x1aXNfcGFsbWENCmBgYA0KVGVuaWVuZG8gZW4gY3VlbnRhIGxhIGluZm9ybWFjacOzbiBkZSBsYSB0YWJsYSwgc2UgcmVhbGl6YSB1biBncsOhZmljbzoNCmBgYHtyfQ0KZyA8LSBnZ3Bsb3QoYWVzKHg9WUVBUiwgeT1Qcm9kdWNjaW9uLzEwMDApLCBkYXRhID0gc2x1aXNfcGFsbWEpICsgZ2VvbV9iYXIoc3RhdD0naWRlbnRpdHknKSArIGxhYnMoeT0nUHJvZHVjY2nDs24gZGUgcGFsbWEgZGUgYWNlaXRlICBbVG9uIHggMTAwMF0nKQ0KYGBgDQoNCmBgYHtyfQ0KZyArIGdndGl0bGUoIlByb2R1Y2Npw7NuIGRlIHBhbG1hIGRlIGFjZWl0ZSBlbiBTYW4gTHXDrXMgZGUgUGFsZW5xdWUgZGVsIDIwMDcgYWwgMjAxOCIpICsgbGFicyhjYXB0aW9uPSAiQmFzZWQgb24gRU1BIGRhdGEgKERBTkUsIDIwMTgpIikNCmBgYA0KTGEgcHJvZHVjY2nDs24gZGUgcGFsbWEgZGUgYWNlaXRlIGVuIGVsIG11bmljaXBpbyBmdWUgYWx0YSBlbiAyMDExLCBzaW4gZW1iYXJnbywgc2UgcmVkdWpvIGNvbnNpZGVyYWJsZW1lbnRlIGVsIGVuIDIwMTIgcGFyYSBpbmNyZW1lbnRhcnNlIG51ZXZhbWVudGUgZW4gZWwgMjAxNC4gQnVzY2FuZG8gdW5hIGNhdXNhIHBhcmEgZXN0ZSBpbmNyZW1lbnRvLCBzZSBlbmNvbnRyw7MgcXVlIGVzdMOhIHJlbGFjaW9uYWRvIGNvbiB1bmEgaW5pY2lhdGl2YSBsaWRlcmFkYSBwb3IgbGEgR29iZXJuYWNpw7NuIGRlIENhc2FuYXJlIHkgbGEgU2VjcmV0YXJpYSBkZSBBZ3JpY3VsdHVyYSBHYW5hZGVyw61hIHkgTWVkaW8gQW1iaWVudGUgbGEgY3VhbCBidXNjYWJhIGluc3RydWlyIGEgbG9zIGFncmljdWx0b3JlcyBxdWUgZGVzZWFzZW4gZXN0YWJsZWNlciBlc3RlIGN1bHRpdm8gcG9yIG1lZGlvIGRlIHVuYSB2aXNpdGEgdMOpY25pY2EgeSBhbGd1bmFzIHJlY29tZW5kYWNpb25lcyBwYXJhIGxhIMOzcHRpbWEgcHJvZHVjY2nDs24gZGUgZXN0ZSBjdWx0aXZvIChQcmVuc2EgTGlicmUgQ2FzYW5hcmUsIDIwMTIpLg0KRW4gZWwgYcOxbyAyMDE1LCBsYSBwcm9kdWNjacOzbiBzZSByZWR1am8geSBubyBoYSB0ZW5pZG8gdW4gY3JlY2ltaWVudG8gY29uc2lkZXJhYmxlLiBEZSBoZWNobywgbGEgZWNvbm9tw61hIGRlbCBtdW5pY2lwaW8gbm8gZXN0w6Egc3VzdGVudGFkYSAgcHJpbmNpcGFsbWVudGUgZW4gZWwgY3VsdGl2byBkZSBlc3RlIHByb2R1Y3RvIChBbGNhbGTDrWEgZGUgU2FuIEx1aXMgZGUgUGFsZW5xdWUsIDIwMTgpLiAgQ29tbyBzZSBwdWRvIG9ic2VydmFyLCBsYSBwcm9kdWNjacOzbiBkZSBjZXJlYWxlcyB5IG9sZWFnaW5vc2FzIHNlIHJlZHVqbyBjb25zaWRlcmFibGVtZW50ZSBlbiBlbCBtdW5pY2lwaW8gZGUgU2FuIEx1aXMgZGUgUGFsZW5xdWUgcG9yIGRpdmVyc2FzIGNhdXNhcy4gDQoNCiMjNC4gVW5pciBsYXMgZXN0YWTDrXN0aWNhcyBhZ3LDrWNvbGFzIGEgbG9zIG11bmljaXBpb3MuDQpQYXJhIHJlYWxpemFyIGVsIGpvaW4gc2UgdXNhcsOhIGVsIGFyY2hpdm8gZGUgTWFyY28gR2VvZXN0YWTDrXN0aWNvIERlcGFydGFtZW50YWwgcXVlIHNlIGVuY3VlbnRyYSBkaXNwb25pYmxlIGVuIGVsIEdlb3BvcnRhbCBkZWwgREFORS4gRXN0b3MgZGF0b3Mgc2Vyw6FuIGxlw61kb3MgcG9yIGxhIGJpYmxpb3RlY2Egc2Y6DQpgYGB7cn0NCmNhc19tdW5pYyA8LSBzZjo6c3RfcmVhZCgiQzovVXNlcnMvTFVJU0EgQ0FSUklPTi9Eb2N1bWVudHMvR2VvbcOhdGljYS84NV9DQVNBTkFSRS9BRE1JTklTVFJBVElWTy9NR05fTVBJT19QT0xJVElDTy5zaHAiKQ0KYGBgDQpBaG9yYSwgc2UgbGVlIGNhc19tdW5pYzoNCmBgYHtyfQ0KY2FzX211bmljDQpgYGANCk51ZXN0cm8gYXRyaWJ1dG8gY2FzYV9tdW5pYyBlcyB1bmEgY29sZWNjacOzbiBkZSBjYXJhY3RlcsOtc3RpY2FzIHNpbXBsZXMuIEVzdG8gcXVpZXJlIGRlY2lyIHF1ZSBlc3TDoSBkZWZpbmlkbyBjb21vIHVuIGVzdMOhbmRhciBmb3JtYWwgKElTTyAxOTEyNS0xOjIwMDQpIHF1ZSBkaWN0YW1pbmEgY29tbyBzZSBwdWVkZSByZXByZXNlbnRhciB1biBvYmpldG8gZGVsIG11bmRvIHJlYWwgZW4gbGEgY29tcHV0YWRvcmEgaGFjaWVuZG8gdXNvIGRlIGxhIGdlb21ldHLDrWEgZXNwYWNpYWwuIExhcyBjYXJhY3RlcsOtc3RpY2FzIHNpbXBlcyBkZXNjcmliZW4gY29tbyBzZSBwdWVkZW4gYWxtYWNlbmFyIGxvcyBvYmpldG9zLCBlbCBwcm9jZWRpbWllbnRvIHBhcmEgcmVjdXBlcmFyIGxhcyBiYXNlcyBkZSBkYXRvcyB5IGxhcyBvcGVyYWNpb25lcyBnZW9tw6l0cmljYXMgcXVlIGVzdMOhbiBkZWZpbmlkYXMgcGFyYSBlbCBvYmpldG8uDQpQYXJhIGhhY2VyIGVsIGpvaW4sIHNlIGRlYmUgY29ub2NlciBlbCBzaXN0ZW1hIGRlIHJlZmVyZW5jaWEgZGUgY29vcmRlbmFkYXMgZ2VvZ3LDoWZpY2FzLiBFbiBlc3RlIGNhc28sIHNlIHRyYWJhamEgY29uIGNvb3JkZW5hZGFzICBXR1MxOTg0IG8gY8OzZGlnbyA0MzI2IEVTUEcuIA0KU2UgcHVlZGUgdXNhciBsYSBmdW5jacOzbiBsZWZ0X2pvaW4gcGFyYSB1bmlyIGxvcyBtdW5pY2lwaW9zIGNvbiBsYXMgZXN0YWTDrXN0aWNhcyBhZ3LDrWNvbGFzIGRlbCBkZXBhcnRhbWVudG8uDQpPdHJvIGZhY3RvciBhIHRlbmVyIGVuIGN1ZW50YSBwYXJhIGNyZWFyIGVsIGpvaW4sIGVzIHRlbmVyIHVuIGF0cmlidXRvIGNvbcO6biBvIHVuYSB2YXJpYWJsZSBjb21wYXJ0aWRhLCBhdW5xdWUgc2UgcmVjb21pZW5kYSB1c2FyIHVuIGF0cmlidXRvIGRlIGlkZW50aWZpY2FjacOzbi4gRXMgcG9yIGVzbyBxdWUgZW4gY2FzYV9tdW5pYyBzZSB1c2FyYSBlbCBhdHJpYnV0byBNUElPX0NDREdPIHF1ZSBwYXJlY2Ugc2VyIGlkw6ludGljbyBhIENPRF9NVU46DQpgYGB7cn0NCmRhdG9zICU+JSBmaWx0ZXIgKE1VTklDSVBJTyA9PSJZT1BBTCIpIC0+ICB5b3BhbF9kYXRvcw0KYGBgDQoNCmBgYHtyfQ0KeW9wYWxfZGF0b3MNCmBgYA0KUGFyYSBjb25vY2VyIGVsIHRpcG8gZGUgdmFyaWFibGUgc2UgdXNhIGVsIGPDs2RpZ286DQpgYGB7cn0NCmNsYXNzKHlvcGFsX2RhdG9zJENPRF9NVU4pDQpgYGANCkRlYmlkbyBhIHF1ZSBlcyBuZWNlc2FyaW8gaGFjZXIgY2FtYmlvcyBwYXJhIHJlYWxpemFyIHVuIGJ1ZW4gam9pbiwgZXMgYnVlbmEgaWRlYSBjcmVhciB1bmEgY29waWEgZGUgbG9zIGRhdG9zIG9yaWdpbmFsZXMuIERlIGVzdGEgbWFuZXJhLCBzaSBzZSBsbGVuYW4gYSBkYcOxYXIgbG9zIGRhdG9zLCBzZSB0ZW5kcsOhIHVuIHJlcHVlc3RvLiBUZW5pZW5kbyBlc3RvIGVuIGN1ZW50YSwgc2UgcHJvc2lndWUgZW4gbGEgY3JlYWNpw7NuIGRlbCBqb2luOg0KYGBge3J9DQpkYXRvczIgPC0gZGF0b3MNCmBgYA0KDQpgYGB7cn0NCmRhdG9zMiRURU1QIDwtIGFzLmNoYXJhY3RlcihkYXRvczIkQ09EX01VTikNCmBgYA0KDQpgYGB7cn0NCmRhdG9zMiRNUElPX0NDREdPIDwtIGFzLmZhY3RvcihkYXRvczIkVEVNUCkNCmBgYA0KUGFyYSBtaXJhciBsb3MgcHJpbWVyb3Mgc2VpcyBhdHJpYnV0b3Mgc2UgZXNjcmliZToNCmBgYHtyfQ0KaGVhZChkYXRvczIpDQpgYGANCkFob3JhLCBzZSBzZWxlY2Npb25hcsOhIHVuIGN1bHRpdm8geSBzZSBmaWx0cmFyYW4gZG9zIGNhcmFjdGVyw61zdGljYXMgcXVlIHNlYW4gcmVsZXZhbnRlcyBjb21vIHNlIHB1ZWRlIHZlciBlbiBlbCBzaWd1aWVudGUgY8OzZGlnbzoNCmBgYHtyfQ0KZGF0b3MyICU+JSBmaWx0ZXIoWUVBUj09MjAxOCwgQ1VMVElWTyA9PSAiTUFJWiIpICAtPiBkYXRvczMNCmBgYA0KQ29uIGVsIGPDs2RpZ28gaGVhZCgpIHNlIHB1ZWRlbiB2ZXIgYWxndW5vcyBhdHJpYnV0b3MgZGUgbG9zIGRhdG9zOg0KYGBge3J9DQpoZWFkKGRhdG9zMykNCmBgYA0KUGFyYSBtaXJhciBlbCB0aXBvIGRlIHZhcmlhYmxlOg0KYGBge3J9DQpjbGFzcyhkYXRvczMpDQpgYGANCg0KYGBge3J9DQpkYXRvczQgPC0gZGF0b3MzICU+JSBkcGx5cjo6c2VsZWN0KE1VTklDSVBJTywgTVBJT19DQ0RHTywgWUVBUiwgUHJvZHVjY2lvbiwgUmVuZGltaWVudG8pIA0KYGBgDQoNCmBgYHtyfQ0KZGF0b3M0DQpgYGANCg0KYGBge3J9DQpkYXRvczQgJT4lIA0KICBnYXRoZXIoIllFQVIiLCAiUHJvZHVjY2lvbiIsICJSZW5kaW1pZW50byIgLCBrZXkgPSB2YXJpYWJsZSwgdmFsdWUgPSBudW1iZXIpDQpgYGANClNpIHNlIHF1aWVyZSBvYnNlcnZhciBhbGd1bm9zIGF0cmlidXRvcyBzZSBlc2NyaWJlOg0KYGBge3J9DQpoZWFkKGRhdG9zNCkNCmBgYA0KQ29tbyBzZSBwdWRvIG9ic2VydmFyLCBjb252ZXJ0aXIgbGEgdGFibGEgZGUgYXRyaWJ1dG9zIGRlIGZvcm1hdG8gbGFyZ28gYSBhbmNobyBlcyB1biB0cmFiYWpvIGV4dGVuc28uDQpgYGB7cn0NCmRhdG9zNCAlPiUgDQogIGdyb3VwX2J5KE1QSU9fQ0NER08pICU+JSANCiAgbXV0YXRlKFZpc2l0ID0gMTpuKCkpICU+JSANCiAgZ2F0aGVyKCJZRUFSIiwgIlByb2R1Y2Npb24iLCAiUmVuZGltaWVudG8iLCBrZXkgPSB2YXJpYWJsZSwgdmFsdWUgPSBudW1iZXIpICU+JSANCiAgdW5pdGUoY29tYmksIHZhcmlhYmxlLCBWaXNpdCkgJT4lDQogIHNwcmVhZChjb21iaSwgbnVtYmVyKSAtPiBkYXRvczUNCmBgYA0KDQpgYGB7cn0NCmhlYWQoZGF0b3M1KQ0KYGBgDQoNCmBgYHtyfQ0KdGFpbChkYXRvczUpDQpgYGANCkRlYmlkbyBhIHF1ZSBzZSBwdWVkZSBjb21ldGVyIGFsZ3VuIHRpcG8gZGUgZXJyb3IsIHNlIGNyZWEgdW5hIGNvcGlhIGRlIGxhIGNvbGVjY2nDs24gZGUgY2FyYWN0ZXLDrXN0aWNhcyBzaW1wbGVzOg0KYGBge3J9DQpjYXNfbXVuaWMyIDwtIGNhc19tdW5pYw0KYGBgDQpBaG9yYSwgc2UgY3JlYXLDoSBlbCBqb2luOg0KYGBge3J9DQphbnRfbXVuaWMyJE1QSU9fQ0NER08gPC0gYXMuY2hhcmFjdGVyKGNhc19tdW5pYzIkTVBJT19DQ0RHTykNCmBgYA0KDQpgYGB7cn0NCmFudF9tdW5pY19zdGF0ID0gbGVmdF9qb2luKGNhc19tdW5pYzIsIGRhdG9zNSwgYnk9Ik1QSU9fQ0NER08iKQ0KYGBgDQoNCmBgYHtyfQ0Kc3VtbWFyeShhbnRfbXVuaWNfc3RhdCkNCmBgYA0KIyMgNS4gVHJhemFkbw0KUGFyYSByZWFsaXphciBlbCBtYXBhIHNlIG5lY2VzaXRhIGluc3RhciBlbCBwYXF1ZXRlIOKAnFJDb2xvckJyZXdlcuKAnToNCmBgYHtyfQ0KI2luc3RhbGwucGFja2FnZXMoIlJDb2xvckJyZXdlciIpDQpgYGANCkx1ZWdvLCBzZSBjYXJnYW4gbGFzIGxpYnJlcsOtYXMg4oCcUkNvbG9yQnJld2Vy4oCdIHkg4oCcbGVhZmxldOKAnToNCmBgYHtyfQ0KbGlicmFyeShSQ29sb3JCcmV3ZXIpDQpsaWJyYXJ5KGxlYWZsZXQpDQpgYGANClBvciDDumx0aW1vLCBzZSBjcmVhIHVuIG1hcGEgZGUgbGEgcHJvZHVjY2nDs24gbXVuaWNpcGFsIGNvcnJlc3BvbmRpZW50ZSBhbCBjdWx0aXZvIGRlIG1hw616IGVuIGVsIGHDsW8gMjAxODoNCg0KYGBge3J9DQpiaW5zIDwtIGMoMCwgMjUwLCA1MDAsIDEwMDAsIDIwMDAsIDUwMDAsIDEwMDAwLCAxNTAwMCkNCnBhbCA8LSBjb2xvckJpbigiU3BlY3RyYWwiLCBkb21haW4gPSBhbnRfbXVuaWNfc3RhdCRQcm9kdWNjaW9uXzEsIGJpbnMgPSBiaW5zKQ0KDQogIG1hcGEgPC0gbGVhZmxldChkYXRhID0gYW50X211bmljX3N0YXQpICU+JQ0KICBhZGRUaWxlcygpICU+JQ0KICBhZGRQb2x5Z29ucyhsYWJlbCA9IH5Qcm9kdWNjaW9uXzEsDQogICAgICAgICAgICAgIHBvcHVwID0gfk1QSU9fQ05NQlIsDQogICAgICAgICAgICAgIGZpbGxDb2xvciA9IH5wYWwoUHJvZHVjY2lvbl8xKSwNCiAgICAgICAgICAgICAgY29sb3IgPSAiIzQ0NDQ0NCIsDQogICAgICAgICAgICAgIHdlaWdodCA9IDEsDQogICAgICAgICAgICAgIHNtb290aEZhY3RvciA9IDAuNSwNCiAgICAgICAgICAgICAgb3BhY2l0eSA9IDEuMCwNCiAgICAgICAgICAgICAgZmlsbE9wYWNpdHkgPSAwLjUsDQogICAgICAgICAgICAgIGhpZ2hsaWdodE9wdGlvbnMgPSBoaWdobGlnaHRPcHRpb25zKGNvbG9yID0gIndoaXRlIiwgd2VpZ2h0ID0gMiwgYnJpbmdUb0Zyb250ID0gVFJVRSkNCiAgICAgICAgICAgICAgKSAlPiUNCiAgYWRkUHJvdmlkZXJUaWxlcyhwcm92aWRlcnMkT3BlblN0cmVldE1hcCkgJT4lDQogIGFkZExlZ2VuZCgiYm90dG9tcmlnaHQiLCBwYWwgPSBwYWwsIHZhbHVlcyA9IH5Qcm9kdWNjaW9uXzEsDQogICAgdGl0bGUgPSAiUHJvZHVjY2nDs24gZGUgbWHDrXogZW4gQ2FzYW5hcmUgW1Rvbl0gKDIwMTgpIiwNCiAgICBvcGFjaXR5ID0gMQ0KICApDQpgYGANCg0KDQpgYGB7cn0NCm1hcGENCmBgYA0KQSBwYXJ0aXIgZGVsIG1hcGEgc2UgcHVlZGUgZGVjaXIgcXVlIGVsIG11bmljaXBpbyBjb24gbWF5b3IgcHJvZHVjY2nDs24gZGUgbWHDrXogZXMgU2FuIEx1w61zIGRlIFBhbGVucXVlIHNlZ3VpZG8gcG9yIFBvcsOpLiBMYSBwcm9kdWNjacOzbiBkZSBTYW4gTHXDrXMgZGUgUGFsZW5xdWUgZnVlIGV2YWx1YWRhIGFudGVyaW9ybWVudGUsIHNpbiBlbWJhcmdvLCBjYWJlIGRlc3RhY2FyIHF1ZSBlbCBtdW5pY2lwaW8gZGUgUG9yw6kgYmFzYSBzdSBlY29ub23DrWEgZW4gZWwgc2VjdG9yIGFncsOtY29sYSBoYWNpZW5kbyB1c28gZGUgY3VsdGl2b3MgY29tbyBsYSB5dWNhLCBlbCBwbMOhdGFubyB5IGVsIG1hw616IChBbGNhbGTDrWEgTXVuaWNpcGFsIGRlIFBvcsOpIGVuIENhc2FuYXJlKS4NCmBgYHtyfQ0Kc2Vzc2lvbkluZm8oKQ0KYGBgDQoNCiMjIEJpYmxpb2dyYWZpYToNCkFsY2FsZMOtYSBkZSBTYW4gTHVpcyBkZSBQYWxlbnF1ZS4gKDIwMTMpLiBQb3J0YWwgQWxjYWxkw61hIFNhbiBMdWlzIGRlIFBhbGVucXVlLiBSZXRyaWV2ZWQgMjAgQXByaWwgMjAyMCwgZnJvbSBodHRwczovL3d3dy5zYW5sdWlzZGVwYWxlbnF1ZS1jYXNhbmFyZS5nb3YuY28vcHVibGljYWNpb25lcy8zNzQ4OC9hcG95YXItODAtZmluY2FzLWRlLXBlcXVlbm9zLXktbWVkaWFub3MtcHJvZHVjdG9yZXMtZW4tbGEtaW1wbGVtZW50YWNpb24tZGUtY3VsdGl2b3MtdHJhZGljaW9uYWxlcy15dWNhLW1haXoteXpwbGF0YW5vLw0KDQpBbGNhbGTDrWEgZGUgU2FuIEx1aXMgZGUgUGFsZW5xdWUuICgyMDE4KS4gRWNvbm9tw61hLiBSZXRyaWV2ZWQgMjAgQXByaWwgMjAyMCwgZnJvbSBodHRwczovL3d3dy5zYW5sdWlzZGVwYWxlbnF1ZS1jYXNhbmFyZS5nb3YuY28vcHVibGljYWNpb25lcy8xNDgvZWNvbm9taWEvDQoNCkFsY2FsZMOtYSBNdW5pY2lwYWwgZGUgUG9yZSBlbiBDYXNhbmFyZS4gQWxjYWxkw61hIE11bmljaXBhbCBkZSBQb3JlIGVuIENhc2FuYXJlLiBSZXRyaWV2ZWQgMjAgQXByaWwgMjAyMCwgZnJvbSBodHRwOi8vd3d3LnBvcmUtY2FzYW5hcmUuZ292LmNvL211bmljaXBpby9udWVzdHJvLW11bmljaXBpbw0KDQpBbGNhbGTDrWEgTXVuaWNpcGFsIGRlIFRyaW5pZGFkIGVuIENhc2FuYXJlLiBBbGNhbGTDrWEgTXVuaWNpcGFsIGRlIFRyaW5pZGFkIGVuIENhc2FuYXJlLiBSZXRyaWV2ZWQgMTkgQXByaWwgMjAyMCwgZnJvbSBodHRwOi8vd3d3LnRyaW5pZGFkLWNhc2FuYXJlLmdvdi5jby9tdW5pY2lwaW8vbnVlc3Ryby1tdW5pY2lwaW8NCg0KQ2FyZG9uYSwgQS4gKDIwMTgpLiBFbiBsb3MgTGxhbm9zIE9yaWVudGFsZXMgc2UgaGEgcmVkdWNpZG8gZWwgw6FyZWEgZGUgYXJyb3ogcGFyYSBwcm90ZWdlciBhIGxvcyBhZ3JpY3VsdG9yZXMuIEFncm9uZWdvY2lvcy4gUmV0cmlldmVkIGZyb20gaHR0cHM6Ly93d3cuYWdyb25lZ29jaW9zLmNvL2FncmljdWx0dXJhL2N1YWwtZXMtZWwtYXJlYS1zZW1icmFkYS1kZS1hcnJvei1lbi1jb2xvbWJpYS0yNzQ2ODc2DQoNCkVsIFRpZW1wby4gKDIwMTkpLiBFbCBMbGFubywgbMOtZGVyIGVuIGxhIHByb2R1Y2Npw7NuIGRlIGFycm96LiBSZXRyaWV2ZWQgMTkgQXByaWwgMjAyMCwgZnJvbSBodHRwczovL3d3dy5lbHRpZW1wby5jb20vZWNvbm9taWEvc2VjdG9yZXMvZWwtbGxhbm8tbGlkZXItZW4tbGEtcHJvZHVjY2lvbi1kZS1hcnJvei0zNTExMzINCg0KRmVkZXBhbG1hLiBMYSBwYWxtYSBkZSBhY2VpdGUgZW4gQ29sb21iaWEgfCBGZWRlcGFsbWEuIFJldHJpZXZlZCAyMCBBcHJpbCAyMDIwLCBmcm9tIGh0dHA6Ly93ZWIuZmVkZXBhbG1hLm9yZy9sYS1wYWxtYS1kZS1hY2VpdGUtZW4tY29sb21iaWEtZGVwYXJ0YW1lbnRvcw0KDQpHb2Jlcm5hY2nDs24gZGUgQ2FzYW5hcmUuIEVjb25vbcOtYSAtIEdvYmVybmFjacOzbiBkZSBDYXNhbmFyZS4gUmV0cmlldmVkIDE5IEFwcmlsIDIwMjAsIGZyb20gaHR0cHM6Ly93d3cuY2FzYW5hcmUuZ292LmNvL2luZGV4LnBocD9pZGNhdGVnb3JpYT0xMjAyDQoNCkdvYmVybmFjacOzbiBkZSBDYXNhbmFyZS4gRWNvbm9tw61hIC0gR29iZXJuYWNpJm9hY3V0ZW4gZGUgQ2FzYW5hcmUuIFJldHJpZXZlZCAyMCBBcHJpbCAyMDIwLCBmcm9tIGh0dHBzOi8vd3d3LmNhc2FuYXJlLmdvdi5jby9pbmRleC5waHA/aWRjYXRlZ29yaWE9MTIwMg0KDQpHb2Jlcm5hY2nDs24gZGUgQ2FzYW5hcmUuIExvY2FsaXphY2nDs24gLSBHb2Jlcm5hY2kmb2FjdXRlbiBkZSBDYXNhbmFyZS4gUmV0cmlldmVkIDIwIEFwcmlsIDIwMjAsIGZyb20gaHR0cHM6Ly93d3cuY2FzYW5hcmUuZ292LmNvLz9pZGNhdGVnb3JpYT0xMTk2DQoNCkdvYmVybmFjacOzbiBkZSBDYXNhbmFyZS4gUGF6IGRlIEFyaXBvcm8gQ2FzYW5hcmUgLSBDQVNBTkFSRS4gUmV0cmlldmVkIDE5IEFwcmlsIDIwMjAsIGZyb20gaHR0cHM6Ly9wYXpkZWFyaXBvcm9jYXNhbmFyZS5lcy50bC9DQVNBTkFSRS5odG0NCg0KTWluaXN0ZXJpbyBkZSBBZ3JpY3VsdHVyYSB5IERlc2Fycm9sbG8gUnVyYWwuICgyMDEzKS4gUHJveWVjdG8gU2lzdGVtYSBkZSBJbmZvcm1hY2nDs24gZ2VvZ3LDoWZpY2EgbXVuaWNpcGFsIDIwMTMuIFJldHJpZXZlZCAxOSBBcHJpbCAyMDIwLCBmcm9tIGh0dHA6Ly9iaWJsaW90ZWNhZGlnaXRhbC5hZ3JvbmV0Lmdvdi5jby9iaXRzdHJlYW0vMTE0MzgvODAxMC8xL1NJRy1NVU5JQ0lQQUxFUyUyME1BTiVDMyU4RF9DQVNBTkFSRS5wZGYNCg0KTW9yYWxlcyBDYWJhbGxlcm8sIEouICgyMDE2KS4gQW7DoWxpc2lzIGUgaW1wbGljYWNpb25lcyBkZSBsYXMgbnVldmFzIGFjdGl2aWRhZGVzIHByb2R1Y3RpdmFzIHNvYnJlIGxhIGN1bHR1cmEgZGUgbGEgY29tdW5pZGFkIGxsYW5lcmEgZGVsIG11bmljaXBpbyBkZSBNYW7DrSBkZXBhcnRhbWVudG8gZGUgQ2FzYW5hcmUgKE1hZXN0csOtYSkuIFVuaXZlcnNpZGFkIGRlIGxvcyBMbGFub3MuDQoNCk11amljYSBHcmFuYWRvcywgQy4sIFRvcnJlcywgRS4sICYgVmFyZ2FzIEVzcGFyemEsIE0uICgyMDEwKS4gRXZvbHVjacOzbiBkZWwgc2VjdG9yIHBhbG1pY3VsdG9yLiBCdWNhcmFtYW5nYS4NCg0KTXVuaWNpcGlvIGRlIEFndWF6dWwgQ29sb21iaWEuIEVDT05PTcONQS4gUmV0cmlldmVkIDE5IEFwcmlsIDIwMjAsIGZyb20gaHR0cHM6Ly9tdW5pY2lwaW9hZ3VhenVsLndvcmRwcmVzcy5jb20vZWNvbm9taWEvDQoNClByZW5zYSBMaWJyZSBDYXNhbmFyZS4gKDIwMjApLiBHT0JFUk5BQ0nDk04gREUgQ0FTQU5BUkUgQVBPWUEgQ1VMVElWTyBFWFRFTlNJVk8gREUgUEFMTUEgREUgQUNFSVRFIFkgQURFQ1VBQ0nDk04gREUgVElFUlJBUy4gUmV0cmlldmVkIDIwIEFwcmlsIDIwMjAsIGZyb20gaHR0cHM6Ly9wcmVuc2FsaWJyZWNhc2FuYXJlLmNvbS9jYXNhbmFyZS8zNjg5LWdvYmVybmFjaXVuLWRlLWNhc2FuYXJlLWFwb3lhLWN1bHRpdm8tZXh0ZW5zaXZvLWRlLXBhbG1hLWRlLWFjZWl0ZS15LWFkZWN1YWNpdW4tZGUtdGllcnJhcy5odG1sDQoNClN1dmVyc2lvbi4gKDIwMTkpLiBFbiBZb3BhbCBNaW5BZ3JpY3VsdHVyYSBzb2NpYWxpesOzIGVsIFBsYW4gZGUgT3JkZW5hbWllbnRvIGRlIGxhIFByb2R1Y2Npw7NuIGRlIEFycm96LiBSZXRyaWV2ZWQgZnJvbSBodHRwczovL3N1dmVyc2lvbi5jb20uY28vaG9tZS9lbi15b3BhbC1taW5hZ3JpY3VsdHVyYS1zb2NpYWxpem8tZWwtcGxhbi1kZS1vcmRlbmFtaWVudG8tZGUtbGEtcHJvZHVjY2lvbi1kZS1hcnJvei8NCg0KDQo=