1. Introducción

Este RNotebok corresponde al primer informe técnico de la asignatura Geomática Básica , su objetivo es mostrar las estadísticas agrícolas para los diferentes municipios que conforman el departamento de Vichada,con ayuda de las funcionalidades de R

El departamento del Vichada se encuentra ubicado en la parte oriental de Colombia.Dentro de las actividades económicas de este departamento se encuentran la agricultura y la ganadería, aunque en baja escala productiva, es decir, actividades como la agricultura se realizan para el consumo de sus habitantes

2. Funcionalidades SIG

En primer momento , se realizará una exploración de los datos con ayuda de las librerias dplyr y tidyverse y ggplot . Luego, se realizará una unión basada en atributos o join , para ver las estádisticas plasmadas en un mapa y obtener datos como la ubicación de un municipio donde se produzca algún cultivo de nuestro interés

Para iniciar , se borrará el contenido de la memoria
rm(list=ls())
Luego , se instalan las librerias que se necesitarán , mediante el siguiente código, que instala los paquetes que no se hayan instalado previamente
list.of.packages <- c("here", "tidyverse", "rgeos", "maptools", "raster", "sf",  "viridis", "rnaturalearth", "GSODR", "ggrepel", "cowplot","pacman")
new.packages <- list.of.packages[!(list.of.packages %in% installed.packages()[,"Package"])]
if(length(new.packages)) install.packages(new.packages)

Posteriormente se cargan las librerias en un sólo código con ayuda de la libreria pacman

library(pacman)
pacman::p_load(here, tidyverse, rgeos, maptools, raster, sf, viridis, rnaturalearth, GSODR, ggrepel, cowplot)

3.Exploración de las estadísticas agricolas para Vichada

Las estadísticas agricolas para los municipios a nivel nacional,fueron descargadas en formato csv de las Evaluaciones Agrícolas Municipales del Ministerio de Agricultura y Desarrollo Rural.El archivo fue editado para preservar los datos correspondientes al departamento y se guardó con el nombre “EVA_VICHADA” , luego , se cargó al espacio de trabajo en RStudio Cloud .

Mediante el siguiente código se leen los datos contenidos en el archivo y se almacenan en la variable “datos”
datos <- read_csv2("/cloud/project/Vichada/EVA_VICHADA.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(),
  Periodo = col_double(),
  Area_Sembrada = col_double(),
  Area_Cosechada = col_double(),
  Produccion = col_double(),
  Rendimiento = col_double(),
  Estado = col_character(),
  Ciclo = col_character()
)
Ahora, se pueden ver los atributos de las primeras y de las ultimas filas contenidos en la variable datos
head(datos)
tail(datos)

Se observa que los datos poseen información sobre los municipios que conforman el departamento y datos relacionados al Área sembrada, Área cosechada , la producción y el rendimiento para cada cultivo,se ve también que cada cultivo se clasifica en un grupo dado. En los datos hay una columna con el nombre “Subgrupo” que parece referirse también a un cultivo

Al revisar el archivo original se tiene que las unidades de Area Sembrada y Area cosechada vienen dadas por hectáreas (ha) mientras que la producción viene dada por toneladas t y el rendimiento viene dado en Toneladas por hectárea (t/ha)

Con la libreria dplyr para la exploración de datos , Se obtiene un resumen del promedio de rendimiento por munucipio para los grupos de cultivo
datos %>% group_by(Municipio,Grupo) %>% summarise(rend_prom = mean(Rendimiento, na.rm = TRUE)) -> rend_resumen
Los atributos de la variable creada (rend_resumen) pueden ser visualizados también con ayuda de las funciones head() y tail()
head(rend_resumen)
tail(rend_resumen)
Ahora , se calcula el rendimiento promedio por Grupo de cultivo en el departamento de Vichada
datos %>%
  group_by(Grupo) %>% summarise(rend_dep = mean(Rendimiento, na.rm = TRUE)) -> rend_Vichada

rend_Vichada
Se puede ver en los datos obtenidos que tanto el grupo de TUBERCULOS Y PLATANOS como FRUTALES presentan el mayor rendimiento en el Periodo de 2007 a 2018.Tambien, se puede cálcular el máximo rendimiento por grupo en t/ha y el municipio al que corresponde este valor para el año 2018 con ayuda de la función filter()
datos %>% filter(Periodo==2018) %>% group_by(Grupo, Municipio) %>% summarize(max_rend = max(Rendimiento, na.rm = TRUE)) %>%   slice(which.max(max_rend)) -> rend_max_18

rend_max_18
Ejecutando el siguiente código se ve cuales son los municipios con mayor área cosechada de cada grupo en el año 2018
datos %>%  filter(Periodo==2018) %>% group_by(Grupo, Municipio) %>% summarize(AREA_MAX_COSECHADA = max(Area_Cosechada, na.rm = TRUE)) %>% slice(which.max(AREA_MAX_COSECHADA)) -> area_cosecha_max

area_cosecha_max

Siendo La Primavera, el municipio con mayor área cosechada para el grupo OLEAGINOSAS , a este grupo pertenece el cultivo de la palma de aceite.

3.1 Evolución cultivo de Palma de Aceite en La Primavera,Vichada

El cultivo de palma de aceite es uno de los cultivos que ha venido impulsandose por el Proyecto Veracruz de la empresa Riopaila,en el municipio de La primavera y el municipio de Santa Rosalía,a partir del año 2010.Mediante los siguientes códigos se observará la evolución de este cultivo para el municipio de La Primavera.Primero,se filtran los datos correspondientes al municipio y al cultivo de interés (Palma de Aceite),posteriormente se agrupa por periodo y por cultivo
datos %>% filter(Municipio== "LA PRIMAVERA" , Subgrupo=="PALMA DE ACEITE") %>% group_by(Periodo, Cultivo) ->  PALMA_PRIMAVERA

PALMA_PRIMAVERA
NA
g <- ggplot(aes(x=Periodo, y= Produccion), data = PALMA_PRIMAVERA) + geom_bar(stat='identity', width = 1, fill = "#009975") + labs(y="Producción [ha]" , x="Año") + ggtitle("Cultivo de Palma de Aceite en la Primavera, Vichada") + labs(caption= "Basado en (DANE, 2018)") + theme_minimal()

g

Para los años de 2016 y 2017 no se encuentra producción, debido a que la Palma , es una planta con una vida productiva larga pero que tarda aproximadamente 26 meses en dar fruto una vez que se siembra y según los datos del proyecto Veracruz, se inició con estudios desde el año 2010 , pero sólo hasta el periodo 2015-2016 se empezó la siembra de esta planta en La Primavera, Vichada

3.2 Evolución cultivo de Marañon

Otro cultivo que se puede ver en el departamento de Vichada es el del Marañon, que en el año de 2016 ocupaba el segundo lugar por hectáreas establecidas a nivel nacional ,este cultivo ha sido impulsado desde el año 2013 por el proyecto MAS marañon , desarrollado por la Universidad de los Andes , Corpoica (Actualmente conocido como Agrosavia) y la gobernación de este departamento.Este proyecto busca innovar en el proceso productivo del marañon , para que este producto tenga un valor agregado,beneficiando así a los habitantes del Vichada y al desarrollo económico de la región. Las estadísticas de este cultivo en Puerto Carreño , la capital de Vichada para el periodo 2011 a 2018 son las siguientes:

datos %>% filter(Municipio== "PUERTO CARRENO" , Subgrupo=="NUECES", Periodo>=2011) %>% group_by(Periodo, Cultivo) ->  PTO_NUEZ

PTO_NUEZ

La producción para este periodo de tiempo se observará mediante el siguiente gráfico de barras

m <- ggplot(aes(x=Periodo, y=Produccion), data = PTO_NUEZ) + geom_bar(stat='identity', width = 0.5, fill = "#009975") + labs(y='Producción') + geom_text(aes(label = Produccion), vjust=-0.5 , size = 3.5) + theme_minimal() + labs(title = "Evolución en la producción de marañon en Puerto carreño", caption= "Basado en (DANE, 2018)")

m

Para seguir con la exploración de las estadísticas agricolas en Vichada, se averiguará que grupos de cultivo tuvieron la mayor área cosechada en el año 2018

#Usamos la función arrange() para ordenar los datos  en función del área cosachada en 2018
datos %>% filter(Periodo==2018) %>% group_by(Grupo) %>%summarize(sum_area_cosechada = sum(Area_Cosechada, na.rm = TRUE)) %>% arrange(desc(sum_area_cosechada)) -> total_area_cosechada

total_area_cosechada

El grupo con mayor área cosechada corresponde a “OLEAGINOSAS”,se puede buscar en los datos que cultivos pertenecen a este grupo y el área cosechada para cada cultivo en el año 2018, de la siguiente manera:

datos %>% filter(Grupo=="OLEAGINOSAS" & Periodo==2018) %>% group_by(Cultivo) %>% summarize(sum_cosecha = sum(Area_Cosechada, na.rm = TRUE)) %>% arrange(desc(sum_cosecha)) -> total_cosechado

total_cosechado

Ahora , se obtendrán los municipios con mayor área cosechada para cada cultivo del grupo OLEAGINOSAS en ese mismo año

datos %>% filter(Periodo==2018 & Grupo=="OLEAGINOSAS") %>% group_by(Cultivo, Municipio) %>% summarize(AREA_MAX = max(Area_Cosechada, na.rm = TRUE)) %>% slice(which.max(AREA_MAX)) -> olg_area

olg_area

3.3 Área cosechada por grupo de cultivo

Se observará mediante un gráfico de barras el Área cosechada para cada grupo de cultivo en el año 2018,antes de trazar el gráfico se agregará al objeto total_área_cosechada,una nueva columna para cada grupo de cultivo con su nombre abreviado.Así se evita que el plot se vea desordenado

total_area_cosechada$CULTIVO <- abbreviate(total_area_cosechada$Grupo, 3)

Posteriormente, se traza el gráfico de barras

k <- ggplot(aes(x=CULTIVO, y=sum_area_cosechada), data = total_area_cosechada) + geom_bar(stat='identity',fill="#009975") + labs(y='Area total Cosechada [Ha]', x= "Grupo de cultivo")+ geom_text(aes(label = sum_area_cosechada), vjust=-0.5 , size = 3.5)+theme_minimal()
k+ ggtitle("Area cosechada por grupo en 2018 para Vichada") + theme(plot.title = element_text(hjust = 0.5)) +
   labs(caption= "Basado en (DANE, 2018)")

Los grupos de cultivo con mayor área cosechada son las OLEAGINOSAS y los CEREALES .Los cereales presentan una extensión significativa de cultivo en el departamento , pues a este grupo pertenece el maíz que principalmente se cultiva para la alimentación del ganado vacuno de la región

3.4 Área sembrada por ciclo de cultivo

En el archivo descargado para estadísticas agricolas se reportan cultivos de ciclo transitorio,anual y permanente

El único cultivo anual registrado para el departamento es la yuca.Por su parte, el maiz, es el cultivo transitorio más representativo ,mientras que la palma de aceite lo es de los cultivos permanentes.Mediante los siguientes códigos se comparará el área sembrada de los cultivos de ciclo permanente y ciclo transitorio para demostrar esta afirmación

Los cultivos transitorios son aquellos que tienen un ciclo de crecimiento menor a un año.Para el departamento de Vichada se tiene información de 4 cultivos con este ciclo: El ají, el arroz, el cilantro y el maíz.El área máxima sembrada para cada uno de estos cultivos en el año 2018 es la siguiente:

datos %>% filter(Periodo==2018 & Ciclo=="TRANSITORIO" ) %>% group_by(Cultivo) %>% summarize(AREAS_MAX = max(Area_Sembrada, na.rm = TRUE))-> transi_area

transi_area

Se ve que el maíz , tiene un área mucho mayor que los otros cultivos de ciclo transitorio, esta infromación puede verse plasmada en un gráfico de barras de la siguiente manera:

J <- ggplot(aes(x=Cultivo, y=AREAS_MAX), data = transi_area) + geom_bar(stat='identity',fill="#009975") + labs(y='Area total Sembrada [Ha]', x= "Cultivo")+ theme_minimal() + ggtitle("Área sembrada para los cultivos de ciclo transitorio") + theme(plot.title = element_text(hjust = 0.5)) + labs(caption= "Basado en (DANE, 2018)")+ geom_text(aes(label = AREAS_MAX), vjust=-0.5 , size = 3.5)

J

Por otro lado, se tienen los siguientes datos y gráfico de barras para el área sembrada para los cultivos de ciclo permanente

datos %>% filter(Periodo==2018 & Ciclo=="PERMANENTE" ) %>% group_by(Cultivo) %>% summarize(AREA1_MAX = max(Area_Sembrada, na.rm = TRUE))-> Per_area

Per_area
#Primero se abrevian los nombres de cada cultivo para que el gráfico no se vea desordenado
Per_area$Cultivo<- abbreviate(Per_area$Cultivo, 3)

J <- ggplot(aes(x=Cultivo, y=AREA1_MAX), data = Per_area) + geom_bar(stat='identity',fill="#009975") + labs(y='Area total Sembrada [Ha]', x= "Cultivo")+ geom_text(aes(label = AREA1_MAX), vjust=-0.5 , size = 3.5)+theme_minimal()+ ggtitle("Área cosechada para los cultivos de ciclo permanente") + theme(plot.title = element_text(hjust = 0.5))

J

4.Unir las estadísticas agrícolas a los municipios

Los datos administrativos para el departamento de Vichada,fueron descargados del Marco geoestadistico Nacional del DANE en formato shapefile

Estos datos , pueden leerse con ayuda de la libreria sf de la siguiente manera almacenandose como Vichada_munic

Vichada_munic <- sf::st_read("/cloud/project/Vichada//ADMINISTRATIVO/MGN_MPIO_POLITICO.shp")
Reading layer `MGN_MPIO_POLITICO' from data source `/cloud/project/Vichada/ADMINISTRATIVO/MGN_MPIO_POLITICO.shp' using driver `ESRI Shapefile'
Simple feature collection with 4 features and 9 fields
geometry type:  POLYGON
dimension:      XY
bbox:           xmin: -71.07793 ymin: 2.737109 xmax: -67.4098 ymax: 6.324317
CRS:            4326

¿Qué es el objeto Vichada_munic?

Vichada_munic
Simple feature collection with 4 features and 9 fields
geometry type:  POLYGON
dimension:      XY
bbox:           xmin: -71.07793 ymin: 2.737109 xmax: -67.4098 ymax: 6.324317
CRS:            4326
  DPTO_CCDGO MPIO_CCDGO     MPIO_CNMBR                           MPIO_CRSLC MPIO_NAREA MPIO_NANO DPTO_CNMBR Shape_Leng Shape_Area
1         99      99624  SANTA ROSALÍA Ordenanza 19 de Noviembre 26 de 1993   3898.569      2017    VICHADA   3.296708  0.3167324
2         99      99001 PUERTO CARREÑO       Decreto 1594 de Ago 5  de 1974  12205.614      2017    VICHADA   5.474851  0.9859169
3         99      99524   LA PRIMAVERA       Decreto 676 de Abril13 de 1987  18361.979      2017    VICHADA   7.572214  1.4894508
4         99      99773       CUMARIBO Ordenanza 66 de Noviembre 22 de 1996  65599.702      2017    VICHADA  18.794383  5.3085803
                        geometry
1 POLYGON ((-70.65378 5.37297...
2 POLYGON ((-67.80972 6.32431...
3 POLYGON ((-69.03359 6.21869...
4 POLYGON ((-68.47074 5.55046...

El objeto Vichada_munic es una colección de características simple, con una geometría de polígono (Que tiene dimensiones XY, es decir ubicación coordenada de norte,sur,oriente u occidente),usando el sistema de referencia WGS84

Podemos usar la función left_join para unir el shapefile de los municipios y las estadisticas que se han venido explorando en este RNotebook mediante una variable en común, en este caso será el codigo del municipio , que se encuentra como “COD_MUN” en las estadísticas y “MPIO_CCDGO” en el archivo shapefile

Primero , se filtran los datos de Puerto Carreño del archivo correspondiente a las estadísticas

datos %>% filter (Municipio =="PUERTO CARRENO") ->  Carreno_datos
Carreno_datos

Luego, vemos que tipo de dato es la variable “COD_MUN”

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

Para hacer el join , se debe cambiar el tipo de dato que es la variable “COD_MUN” y el contenido de los datos correspondientes a las estadísticas .Como se va a hacer manipulación de los datos es mejor tener una copia de los mismos

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

De los datos obtenidos se ve una nueva columna con el título “MPIO_CCDGO”, que, como ya se habia mencionado ,será la variable “Clave” en la realización del Join

Posteriormente, se filtra el cultivo de interés, en este caso será la Yuca .La yuca es un cultivo que está presente en todos los municipios del departamento destinado a la alimentación de sus habitantes

datoscop %>% filter(Cultivo == "YUCA")  -> datos3
head(datos3)
class(datos3)
[1] "spec_tbl_df" "tbl_df"      "tbl"         "data.frame" 

También , se filtran las variables que consideremos relevantes para representar

datos4 <- datos3 %>% dplyr::select(Municipio, MPIO_CCDGO, Periodo, Produccion, Rendimiento) 

datos4
#Con la función gather, transformamos los datos de año, producción y rendimiento de formato ancho a formato largo
datos4 %>% gather("Periodo", "Produccion", "Rendimiento" , key = variable, value = number ) 
head(datos4)

En el siguiente código los datos se agrupan y se se realiza una tarea clave para convertir archivos largos a formato ancho

datos4 %>% 
  group_by(MPIO_CCDGO) %>% 
  #se crea una variable que identifique cada una de ellas 
  mutate(Visit = 1:n()) %>% 
  gather("Periodo", "Produccion", "Rendimiento", key = variable, value = number) %>% 
  #Se combinan las variables
  unite(combi, variable, Visit) %>%
  #Usamos spread() para pasar de formato largo a formato ancho
  spread(combi, number) -> datos5
head(datos5)
tail(datos5)

Ahora se realiza una copia de los datos contenidos en el archivo sf,por si se llegan a presentar incovenientes ejecutando los siguientes codigos

Vichada_munic2 <- Vichada_munic

Verificamos que la variable “MPIO_CCDGO” sea el msimo tipo de datos en las estadísticas y el archivo shapefile

str(Vichada_munic2)
Classes ‘sf’ and 'data.frame':  4 obs. of  10 variables:
 $ DPTO_CCDGO: Factor w/ 1 level "99": 1 1 1 1
 $ MPIO_CCDGO: Factor w/ 4 levels "99001","99524",..: 3 1 2 4
 $ MPIO_CNMBR: Factor w/ 4 levels "CUMARIBO","LA PRIMAVERA",..: 4 3 2 1
 $ MPIO_CRSLC: Factor w/ 4 levels "Decreto 1594 de Ago 5  de 1974",..: 3 1 2 4
 $ MPIO_NAREA: num  3899 12206 18362 65600
 $ MPIO_NANO : int  2017 2017 2017 2017
 $ DPTO_CNMBR: Factor w/ 1 level "VICHADA": 1 1 1 1
 $ Shape_Leng: num  3.3 5.47 7.57 18.79
 $ Shape_Area: num  0.317 0.986 1.489 5.309
 $ geometry  :sfc_POLYGON of length 4; first list element: List of 1
  ..$ : num [1:8500, 1:2] -70.7 -70.7 -70.7 -70.7 -70.7 ...
  ..- attr(*, "class")= chr  "XY" "POLYGON" "sfg"
 - attr(*, "sf_column")= chr "geometry"
 - attr(*, "agr")= Factor w/ 3 levels "constant","aggregate",..: NA NA NA NA NA NA NA NA NA
  ..- attr(*, "names")= chr  "DPTO_CCDGO" "MPIO_CCDGO" "MPIO_CNMBR" "MPIO_CRSLC" ...
str(datos5)
tibble [4 × 47] (S3: grouped_df/tbl_df/tbl/data.frame)
 $ Municipio     : chr [1:4] "CUMARIBO" "LA PRIMAVERA" "PUERTO CARRENO" "SANTA ROSALIA"
 $ MPIO_CCDGO    : Factor w/ 4 levels "99001","99524",..: 4 2 1 3
 $ Periodo_1     : num [1:4] 2007 2007 2007 2007
 $ Periodo_10    : num [1:4] 2016 2016 2016 2016
 $ Periodo_11    : num [1:4] 2017 2017 2017 2017
 $ Periodo_12    : num [1:4] 2018 2018 2018 2018
 $ Periodo_13    : num [1:4] 2014 2014 NA NA
 $ Periodo_14    : num [1:4] 2015 2015 NA NA
 $ Periodo_15    : num [1:4] 2016 2016 NA NA
 $ Periodo_2     : num [1:4] 2008 2008 2008 2008
 $ Periodo_3     : num [1:4] 2009 2009 2009 2009
 $ Periodo_4     : num [1:4] 2010 2010 2010 2010
 $ Periodo_5     : num [1:4] 2011 2011 2011 2011
 $ Periodo_6     : num [1:4] 2012 2012 2012 2012
 $ Periodo_7     : num [1:4] 2013 2013 2013 2013
 $ Periodo_8     : num [1:4] 2014 2014 2014 2014
 $ Periodo_9     : num [1:4] 2015 2015 2015 2015
 $ Produccion_1  : num [1:4] 210 120 144 805
 $ Produccion_10 : num [1:4] 1536 80 720 255
 $ Produccion_11 : num [1:4] 5060 1140 740 196
 $ Produccion_12 : num [1:4] 5680 1350 1220 280
 $ Produccion_13 : num [1:4] 6840 720 NA NA
 $ Produccion_14 : num [1:4] 6840 720 NA NA
 $ Produccion_15 : num [1:4] 6840 289 NA NA
 $ Produccion_2  : num [1:4] 2170 2000 242 500
 $ Produccion_3  : num [1:4] 3500 450 340 470
 $ Produccion_4  : num [1:4] 3520 530 300 526
 $ Produccion_5  : num [1:4] 3480 160 2260 350
 $ Produccion_6  : num [1:4] 11000 310 900 489
 $ Produccion_7  : num [1:4] 2091 1680 2268 348
 $ Produccion_8  : num [1:4] 4165 990 3060 120
 $ Produccion_9  : num [1:4] 1815 520 3400 50
 $ Rendimiento_1 : num [1:4] 6 12 12 11.5
 $ Rendimiento_10: num [1:4] 12 8 12 17
 $ Rendimiento_11: num [1:4] 10.5 15 11.4 7
 $ Rendimiento_12: num [1:4] 10.5 15 11.6 7
 $ Rendimiento_13: num [1:4] 18 18 NA NA
 $ Rendimiento_14: num [1:4] 18 18 NA NA
 $ Rendimiento_15: num [1:4] 15 17 NA NA
 $ Rendimiento_2 : num [1:4] 4.56 12.5 10.08 10
 $ Rendimiento_3 : num [1:4] 7.29 15 9.71 9.4
 $ Rendimiento_4 : num [1:4] 8.69 15.14 10 9.74
 $ Rendimiento_5 : num [1:4] 8.7 10 9.62 7
 $ Rendimiento_6 : num [1:4] 20 10 9 5.75
 $ Rendimiento_7 : num [1:4] 4.1 15 12 6
 $ Rendimiento_8 : num [1:4] 8.5 15 17 10
 $ Rendimiento_9 : num [1:4] 16.5 20 17 5
 - attr(*, "groups")= tibble [4 × 2] (S3: tbl_df/tbl/data.frame)
  ..$ MPIO_CCDGO: Factor w/ 4 levels "99001","99524",..: 1 2 3 4
  ..$ .rows     :List of 4
  .. ..$ : int 3
  .. ..$ : int 2
  .. ..$ : int 4
  .. ..$ : int 1
  ..- attr(*, ".drop")= logi FALSE

Por ultimo se realiza el Join

Vichada_munic_esta = left_join(Vichada_munic2, datos5, by="MPIO_CCDGO")
summary(Vichada_munic_esta)
 DPTO_CCDGO MPIO_CCDGO          MPIO_CNMBR                                MPIO_CRSLC   MPIO_NAREA      MPIO_NANO      DPTO_CNMBR
 99:4       99001:1    CUMARIBO      :1    Decreto 1594 de Ago 5  de 1974      :1    Min.   : 3899   Min.   :2017   VICHADA:4   
            99524:1    LA PRIMAVERA  :1    Decreto 676 de Abril13 de 1987      :1    1st Qu.:10129   1st Qu.:2017               
            99624:1    PUERTO CARREÑO:1    Ordenanza 19 de Noviembre 26 de 1993:1    Median :15284   Median :2017               
            99773:1    SANTA ROSALÍA :1    Ordenanza 66 de Noviembre 22 de 1996:1    Mean   :25016   Mean   :2017               
                                                                                     3rd Qu.:30171   3rd Qu.:2017               
                                                                                     Max.   :65600   Max.   :2017               
                                                                                                                                
   Shape_Leng       Shape_Area      Municipio           Periodo_1      Periodo_10     Periodo_11     Periodo_12     Periodo_13  
 Min.   : 3.297   Min.   :0.3167   Length:4           Min.   :2007   Min.   :2016   Min.   :2017   Min.   :2018   Min.   :2014  
 1st Qu.: 4.930   1st Qu.:0.8186   Class :character   1st Qu.:2007   1st Qu.:2016   1st Qu.:2017   1st Qu.:2018   1st Qu.:2014  
 Median : 6.524   Median :1.2377   Mode  :character   Median :2007   Median :2016   Median :2017   Median :2018   Median :2014  
 Mean   : 8.785   Mean   :2.0252                      Mean   :2007   Mean   :2016   Mean   :2017   Mean   :2018   Mean   :2014  
 3rd Qu.:10.378   3rd Qu.:2.4442                      3rd Qu.:2007   3rd Qu.:2016   3rd Qu.:2017   3rd Qu.:2018   3rd Qu.:2014  
 Max.   :18.794   Max.   :5.3086                      Max.   :2007   Max.   :2016   Max.   :2017   Max.   :2018   Max.   :2014  
                                                                                                                  NA's   :2     
   Periodo_14     Periodo_15     Periodo_2      Periodo_3      Periodo_4      Periodo_5      Periodo_6      Periodo_7      Periodo_8   
 Min.   :2015   Min.   :2016   Min.   :2008   Min.   :2009   Min.   :2010   Min.   :2011   Min.   :2012   Min.   :2013   Min.   :2014  
 1st Qu.:2015   1st Qu.:2016   1st Qu.:2008   1st Qu.:2009   1st Qu.:2010   1st Qu.:2011   1st Qu.:2012   1st Qu.:2013   1st Qu.:2014  
 Median :2015   Median :2016   Median :2008   Median :2009   Median :2010   Median :2011   Median :2012   Median :2013   Median :2014  
 Mean   :2015   Mean   :2016   Mean   :2008   Mean   :2009   Mean   :2010   Mean   :2011   Mean   :2012   Mean   :2013   Mean   :2014  
 3rd Qu.:2015   3rd Qu.:2016   3rd Qu.:2008   3rd Qu.:2009   3rd Qu.:2010   3rd Qu.:2011   3rd Qu.:2012   3rd Qu.:2013   3rd Qu.:2014  
 Max.   :2015   Max.   :2016   Max.   :2008   Max.   :2009   Max.   :2010   Max.   :2011   Max.   :2012   Max.   :2013   Max.   :2014  
 NA's   :2      NA's   :2                                                                                                              
   Periodo_9     Produccion_1   Produccion_10    Produccion_11  Produccion_12  Produccion_13  Produccion_14  Produccion_15 
 Min.   :2015   Min.   :120.0   Min.   :  80.0   Min.   : 196   Min.   : 280   Min.   : 720   Min.   : 720   Min.   : 289  
 1st Qu.:2015   1st Qu.:138.0   1st Qu.: 211.2   1st Qu.: 604   1st Qu.: 985   1st Qu.:2250   1st Qu.:2250   1st Qu.:1927  
 Median :2015   Median :177.0   Median : 487.5   Median : 940   Median :1285   Median :3780   Median :3780   Median :3564  
 Mean   :2015   Mean   :319.8   Mean   : 647.8   Mean   :1784   Mean   :2132   Mean   :3780   Mean   :3780   Mean   :3564  
 3rd Qu.:2015   3rd Qu.:358.8   3rd Qu.: 924.0   3rd Qu.:2120   3rd Qu.:2432   3rd Qu.:5310   3rd Qu.:5310   3rd Qu.:5202  
 Max.   :2015   Max.   :805.0   Max.   :1536.0   Max.   :5060   Max.   :5680   Max.   :6840   Max.   :6840   Max.   :6840  
                                                                               NA's   :2      NA's   :2      NA's   :2     
  Produccion_2     Produccion_3     Produccion_4     Produccion_5     Produccion_6      Produccion_7   Produccion_8     Produccion_9   
 Min.   : 242.0   Min.   : 340.0   Min.   : 300.0   Min.   : 160.0   Min.   :  310.0   Min.   : 348   Min.   : 120.0   Min.   :  50.0  
 1st Qu.: 435.5   1st Qu.: 422.5   1st Qu.: 469.5   1st Qu.: 302.5   1st Qu.:  444.2   1st Qu.:1347   1st Qu.: 772.5   1st Qu.: 402.5  
 Median :1250.0   Median : 460.0   Median : 528.0   Median :1305.0   Median :  694.5   Median :1886   Median :2025.0   Median :1167.5  
 Mean   :1228.0   Mean   :1190.0   Mean   :1219.0   Mean   :1562.5   Mean   : 3174.8   Mean   :1597   Mean   :2083.8   Mean   :1446.2  
 3rd Qu.:2042.5   3rd Qu.:1227.5   3rd Qu.:1277.5   3rd Qu.:2565.0   3rd Qu.: 3425.0   3rd Qu.:2135   3rd Qu.:3336.2   3rd Qu.:2211.2  
 Max.   :2170.0   Max.   :3500.0   Max.   :3520.0   Max.   :3480.0   Max.   :11000.0   Max.   :2268   Max.   :4165.0   Max.   :3400.0  
                                                                                                                                       
 Rendimiento_1   Rendimiento_10  Rendimiento_11   Rendimiento_12  Rendimiento_13 Rendimiento_14 Rendimiento_15 Rendimiento_2   
 Min.   : 6.00   Min.   : 8.00   Min.   : 7.000   Min.   : 7.00   Min.   :18     Min.   :18     Min.   :15.0   Min.   : 4.560  
 1st Qu.:10.12   1st Qu.:11.00   1st Qu.: 9.655   1st Qu.: 9.64   1st Qu.:18     1st Qu.:18     1st Qu.:15.5   1st Qu.: 8.640  
 Median :11.75   Median :12.00   Median :10.960   Median :11.07   Median :18     Median :18     Median :16.0   Median :10.040  
 Mean   :10.38   Mean   :12.25   Mean   :10.980   Mean   :11.04   Mean   :18     Mean   :18     Mean   :16.0   Mean   : 9.285  
 3rd Qu.:12.00   3rd Qu.:13.25   3rd Qu.:12.285   3rd Qu.:12.46   3rd Qu.:18     3rd Qu.:18     3rd Qu.:16.5   3rd Qu.:10.685  
 Max.   :12.00   Max.   :17.00   Max.   :15.000   Max.   :15.00   Max.   :18     Max.   :18     Max.   :17.0   Max.   :12.500  
                                                                  NA's   :2      NA's   :2      NA's   :2                      
 Rendimiento_3    Rendimiento_4    Rendimiento_5    Rendimiento_6    Rendimiento_7    Rendimiento_8    Rendimiento_9            geometry
 Min.   : 7.290   Min.   : 8.690   Min.   : 7.000   Min.   : 5.750   Min.   : 4.100   Min.   : 8.500   Min.   : 5.00   POLYGON      :4  
 1st Qu.: 8.873   1st Qu.: 9.477   1st Qu.: 8.275   1st Qu.: 8.188   1st Qu.: 5.525   1st Qu.: 9.625   1st Qu.:13.62   epsg:4326    :0  
 Median : 9.555   Median : 9.870   Median : 9.160   Median : 9.500   Median : 9.000   Median :12.500   Median :16.75   +proj=long...:0  
 Mean   :10.350   Mean   :10.893   Mean   : 8.830   Mean   :11.188   Mean   : 9.275   Mean   :12.625   Mean   :14.62                    
 3rd Qu.:11.033   3rd Qu.:11.285   3rd Qu.: 9.715   3rd Qu.:12.500   3rd Qu.:12.750   3rd Qu.:15.500   3rd Qu.:17.75                    
 Max.   :15.000   Max.   :15.140   Max.   :10.000   Max.   :20.000   Max.   :15.000   Max.   :17.000   Max.   :20.00                    
                                                                                                                                        

Mapa de la producción de Yuca en Vichada

#Se cargan las librerias necesarias para el trazado
library(RColorBrewer)
library(leaflet)

Con ayuda de la libreria leaflet se realiza un trazado del mapa que muestra la producción de Yuca por municipio para el año 2018

bins <- c(0, 100, 500, 1000, 3000, 4000, 6000)
pal <- colorBin("Spectral", domain = Vichada_munic_esta$Produccion_12, bins = bins)

  mapa <- leaflet(data = Vichada_munic_esta) %>%
  addTiles() %>%
  addPolygons( label = ~Produccion_12,
              popup = ~MPIO_CNMBR,
              fillColor = ~pal(Produccion_12),
              color = "#444444",
              weight = 1,
              smoothFactor = 0.5,
              opacity = 1.0,
              fillOpacity = 0.5,
              highlightOptions = highlightOptions(color = "white", weight = 2, bringToFront = TRUE)
              ) %>%
  addProviderTiles(providers$OpenStreetMap) %>%
  addLegend("topleft", pal = pal, values = ~Produccion_12,
    title = "Producción de Yuca en Vichada [Ton] (2018)",
    opacity = 2
  )
mapa
LS0tCnRpdGxlOiAiRXN0YWTDrXN0aWNhcyBBZ3LDrWNvbGFzIG11bmljaXBhbGVzIGVuIFZpY2hhZGEiCmF1dGhvcjogIkFuZ2llIEFsZWphbmRyYSBKdXlvIEJ1aXRyYWdvIgpkYXRlOiAiQWJyaWwgMjEgLTIwMjAiCm91dHB1dDogaHRtbF9ub3RlYm9vawotLS0KCjxkaXYgc3R5bGU9InRleHQtYWxpZ246IGp1c3RpZnkiPgojIyMgMS4gSW50cm9kdWNjacOzbgoKRXN0ZSBSTm90ZWJvayBjb3JyZXNwb25kZSBhbCBwcmltZXIgaW5mb3JtZSB0w6ljbmljbyBkZSBsYSBhc2lnbmF0dXJhIEdlb23DoXRpY2EgQsOhc2ljYSAsIHN1IG9iamV0aXZvIGVzIG1vc3RyYXIgbGFzIGVzdGFkw61zdGljYXMgYWdyw61jb2xhcyBwYXJhIGxvcyBkaWZlcmVudGVzIG11bmljaXBpb3MgcXVlIGNvbmZvcm1hbiBlbCBkZXBhcnRhbWVudG8gZGUgVmljaGFkYSxjb24gYXl1ZGEgZGUgbGFzIGZ1bmNpb25hbGlkYWRlcyBkZSBSCgpFbCBkZXBhcnRhbWVudG8gZGVsIFtWaWNoYWRhXShodHRwOi8vd3d3LnZpY2hhZGEuZ292LmNvL2RlcGFydGFtZW50by9udWVzdHJvLWRlcGFydGFtZW50bykgc2UgZW5jdWVudHJhIHViaWNhZG8gZW4gbGEgcGFydGUgb3JpZW50YWwgZGUgQ29sb21iaWEuRGVudHJvIGRlIGxhcyBhY3RpdmlkYWRlcyBlY29uw7NtaWNhcyBkZSBlc3RlIGRlcGFydGFtZW50byBzZSBlbmN1ZW50cmFuIGxhIGFncmljdWx0dXJhIHkgbGEgZ2FuYWRlcsOtYSwgYXVucXVlIGVuIGJhamEgZXNjYWxhIHByb2R1Y3RpdmEsIGVzIGRlY2lyLCBhY3RpdmlkYWRlcyBjb21vIGxhIGFncmljdWx0dXJhIHNlIHJlYWxpemFuIHBhcmEgZWwgY29uc3VtbyBkZSBzdXMgaGFiaXRhbnRlcwoKIyMjIDIuIEZ1bmNpb25hbGlkYWRlcyBTSUcKCkVuIHByaW1lciBtb21lbnRvICwgc2UgcmVhbGl6YXLDoSB1bmEgZXhwbG9yYWNpw7NuIGRlIGxvcyBkYXRvcyBjb24gYXl1ZGEgZGUgbGFzIGxpYnJlcmlhcyAqZHBseXIqIHkgKnRpZHl2ZXJzZSogeSAqZ2dwbG90KiAuIEx1ZWdvLCBzZSByZWFsaXphcsOhIHVuYSB1bmnDs24gYmFzYWRhIGVuIGF0cmlidXRvcyBvIGpvaW4gLCBwYXJhIHZlciBsYXMgZXN0w6FkaXN0aWNhcyBwbGFzbWFkYXMgZW4gdW4gbWFwYSB5IG9idGVuZXIgZGF0b3MgY29tbyBsYSB1YmljYWNpw7NuIGRlIHVuIG11bmljaXBpbyBkb25kZSBzZSBwcm9kdXpjYSBhbGfDum4gY3VsdGl2byBkZSBudWVzdHJvIGludGVyw6lzIAoKUGFyYSBpbmljaWFyICwgc2UgYm9ycmFyw6EgZWwgY29udGVuaWRvIGRlIGxhIG1lbW9yaWEKPGRpdi8+CmBgYHtyfQpybShsaXN0PWxzKCkpCmBgYAo8ZGl2IHN0eWxlPSJ0ZXh0LWFsaWduOiBqdXN0aWZ5Ij4KTHVlZ28gLCBzZSBpbnN0YWxhbiBsYXMgbGlicmVyaWFzIHF1ZSBzZSBuZWNlc2l0YXLDoW4gLCBtZWRpYW50ZSBlbCBzaWd1aWVudGUgY8OzZGlnbywgcXVlIGluc3RhbGEgbG9zIHBhcXVldGVzIHF1ZSBubyBzZSBoYXlhbiBpbnN0YWxhZG8gcHJldmlhbWVudGUKPGRpdi8+CmBgYHtyfQpsaXN0Lm9mLnBhY2thZ2VzIDwtIGMoImhlcmUiLCAidGlkeXZlcnNlIiwgInJnZW9zIiwgIm1hcHRvb2xzIiwgInJhc3RlciIsICJzZiIsICAidmlyaWRpcyIsICJybmF0dXJhbGVhcnRoIiwgIkdTT0RSIiwgImdncmVwZWwiLCAiY293cGxvdCIsInBhY21hbiIpCm5ldy5wYWNrYWdlcyA8LSBsaXN0Lm9mLnBhY2thZ2VzWyEobGlzdC5vZi5wYWNrYWdlcyAlaW4lIGluc3RhbGxlZC5wYWNrYWdlcygpWywiUGFja2FnZSJdKV0KaWYobGVuZ3RoKG5ldy5wYWNrYWdlcykpIGluc3RhbGwucGFja2FnZXMobmV3LnBhY2thZ2VzKQpgYGAKUG9zdGVyaW9ybWVudGUgc2UgY2FyZ2FuIGxhcyBsaWJyZXJpYXMgZW4gdW4gc8OzbG8gY8OzZGlnbyBjb24gYXl1ZGEgZGUgbGEgbGlicmVyaWEgcGFjbWFuCmBgYHtyfQpsaWJyYXJ5KHBhY21hbikKcGFjbWFuOjpwX2xvYWQoaGVyZSwgdGlkeXZlcnNlLCByZ2VvcywgbWFwdG9vbHMsIHJhc3Rlciwgc2YsIHZpcmlkaXMsIHJuYXR1cmFsZWFydGgsIEdTT0RSLCBnZ3JlcGVsLCBjb3dwbG90KQpgYGAKPGRpdiBzdHlsZT0idGV4dC1hbGlnbjoganVzdGlmeSI+CiMjIyAzLkV4cGxvcmFjacOzbiBkZSBsYXMgZXN0YWTDrXN0aWNhcyBhZ3JpY29sYXMgcGFyYSBWaWNoYWRhCkxhcyBlc3RhZMOtc3RpY2FzIGFncmljb2xhcyBwYXJhIGxvcyBtdW5pY2lwaW9zIGEgbml2ZWwgbmFjaW9uYWwsZnVlcm9uIGRlc2NhcmdhZGFzIGVuIGZvcm1hdG8gY3N2ICBkZSBsYXMgIFtFdmFsdWFjaW9uZXMgQWdyw61jb2xhcyBNdW5pY2lwYWxlc10oaHR0cHM6Ly93d3cuZGF0b3MuZ292LmNvL0FncmljdWx0dXJhLXktRGVzYXJyb2xsby1SdXJhbC9FdmFsdWFjaW9uZXMtQWdyb3BlY3Vhcmlhcy1NdW5pY2lwYWxlcy1FVkEvMnBudy1tbWdlKSBkZWwgTWluaXN0ZXJpbyBkZSBBZ3JpY3VsdHVyYSB5IERlc2Fycm9sbG8gUnVyYWwuRWwgYXJjaGl2byBmdWUgZWRpdGFkbyBwYXJhIHByZXNlcnZhciBsb3MgZGF0b3MgY29ycmVzcG9uZGllbnRlcyBhbCBkZXBhcnRhbWVudG8geSBzZSBndWFyZMOzIGNvbiBlbCBub21icmUgIkVWQV9WSUNIQURBIiAsIGx1ZWdvICwgc2UgY2FyZ8OzIGFsIGVzcGFjaW8gZGUgdHJhYmFqbyBlbiBSU3R1ZGlvIENsb3VkIC4KCk1lZGlhbnRlIGVsIHNpZ3VpZW50ZSBjw7NkaWdvIHNlIGxlZW4gbG9zIGRhdG9zIGNvbnRlbmlkb3MgZW4gZWwgYXJjaGl2byB5IHNlIGFsbWFjZW5hbiBlbiBsYSB2YXJpYWJsZSAiZGF0b3MiCjxkaXYvPgpgYGB7cn0KZGF0b3MgPC0gcmVhZF9jc3YyKCIvY2xvdWQvcHJvamVjdC9WaWNoYWRhL0VWQV9WSUNIQURBLmNzdiIpCmBgYAo8ZGl2IHN0eWxlPSJ0ZXh0LWFsaWduOiBqdXN0aWZ5Ij4KQWhvcmEsIHNlIHB1ZWRlbiB2ZXIgbG9zIGF0cmlidXRvcyBkZSBsYXMgcHJpbWVyYXMgeSBkZSBsYXMgdWx0aW1hcyBmaWxhcyBjb250ZW5pZG9zIGVuIGxhIHZhcmlhYmxlICpkYXRvcyogCjxkaXYvPgpgYGB7cn0KaGVhZChkYXRvcykKYGBgCmBgYHtyfQp0YWlsKGRhdG9zKQpgYGAKPGRpdiBzdHlsZT0idGV4dC1hbGlnbjoganVzdGlmeSI+ClNlIG9ic2VydmEgcXVlIGxvcyBkYXRvcyBwb3NlZW4gaW5mb3JtYWNpw7NuIHNvYnJlIGxvcyBtdW5pY2lwaW9zIHF1ZSBjb25mb3JtYW4gZWwgZGVwYXJ0YW1lbnRvIHkgZGF0b3MgcmVsYWNpb25hZG9zIGFsIMOBcmVhIHNlbWJyYWRhLCDDgXJlYSBjb3NlY2hhZGEgLCBsYSBwcm9kdWNjacOzbiB5IGVsIHJlbmRpbWllbnRvIHBhcmEgY2FkYSBjdWx0aXZvLHNlIHZlIHRhbWJpw6luIHF1ZSBjYWRhIGN1bHRpdm8gc2UgY2xhc2lmaWNhIGVuIHVuIGdydXBvIGRhZG8uIEVuIGxvcyBkYXRvcyBoYXkgdW5hIGNvbHVtbmEgY29uIGVsIG5vbWJyZSAqIlN1YmdydXBvIiogcXVlIHBhcmVjZSByZWZlcmlyc2UgdGFtYmnDqW4gYSB1biBjdWx0aXZvCgpBbCByZXZpc2FyIGVsIGFyY2hpdm8gb3JpZ2luYWwgc2UgdGllbmUgcXVlIGxhcyB1bmlkYWRlcyBkZSAqQXJlYSBTZW1icmFkYSogeSAqQXJlYSBjb3NlY2hhZGEqIHZpZW5lbiBkYWRhcyBwb3IgaGVjdMOhcmVhcyAgKiooaGEpKiogbWllbnRyYXMgcXVlIGxhICpwcm9kdWNjacOzbiogdmllbmUgZGFkYSBwb3IgdG9uZWxhZGFzICoqdCoqIHkgZWwgKnJlbmRpbWllbnRvKiB2aWVuZSBkYWRvIGVuIFRvbmVsYWRhcyBwb3IgaGVjdMOhcmVhICAqKih0L2hhKSoqCgpDb24gbGEgbGlicmVyaWEgKmRwbHlyKiBwYXJhIGxhIGV4cGxvcmFjacOzbiBkZSBkYXRvcyAsIFNlIG9idGllbmUgdW4gcmVzdW1lbiBkZWwgcHJvbWVkaW8gZGUgcmVuZGltaWVudG8gcG9yIG11bnVjaXBpbyBwYXJhIGxvcyBncnVwb3MgZGUgY3VsdGl2byAKPGRpdi8+CmBgYHtyfQpkYXRvcyAlPiUgZ3JvdXBfYnkoTXVuaWNpcGlvLEdydXBvKSAlPiUgc3VtbWFyaXNlKHJlbmRfcHJvbSA9IG1lYW4oUmVuZGltaWVudG8sIG5hLnJtID0gVFJVRSkpIC0+IHJlbmRfcmVzdW1lbgpgYGAKPGRpdiBzdHlsZT0idGV4dC1hbGlnbjoganVzdGlmeSI+CkxvcyBhdHJpYnV0b3MgZGUgbGEgdmFyaWFibGUgY3JlYWRhIChyZW5kX3Jlc3VtZW4pIHB1ZWRlbiBzZXIgdmlzdWFsaXphZG9zIHRhbWJpw6luIGNvbiBheXVkYSBkZSBsYXMgZnVuY2lvbmVzICpoZWFkKCkqIHkgKnRhaWwoKSoKPGRpdi8+CmBgYHtyfQpoZWFkKHJlbmRfcmVzdW1lbikKYGBgCmBgYHtyfQp0YWlsKHJlbmRfcmVzdW1lbikKYGBgCjxkaXYgc3R5bGU9InRleHQtYWxpZ246IGp1c3RpZnkiPgpBaG9yYSAsIHNlIGNhbGN1bGEgZWwgcmVuZGltaWVudG8gcHJvbWVkaW8gcG9yIEdydXBvIGRlIGN1bHRpdm8gZW4gZWwgZGVwYXJ0YW1lbnRvIGRlIFZpY2hhZGEKPGRpdi8+CmBgYHtyfQpkYXRvcyAlPiUKICBncm91cF9ieShHcnVwbykgJT4lIHN1bW1hcmlzZShyZW5kX2RlcCA9IG1lYW4oUmVuZGltaWVudG8sIG5hLnJtID0gVFJVRSkpIC0+IHJlbmRfVmljaGFkYQoKcmVuZF9WaWNoYWRhCmBgYAo8ZGl2IHN0eWxlPSJ0ZXh0LWFsaWduOiBqdXN0aWZ5Ij4KU2UgcHVlZGUgdmVyIGVuIGxvcyBkYXRvcyBvYnRlbmlkb3MgcXVlIHRhbnRvIGVsIGdydXBvIGRlICpUVUJFUkNVTE9TIFkgUExBVEFOT1MqIGNvbW8gKkZSVVRBTEVTKiBwcmVzZW50YW4gZWwgbWF5b3IgcmVuZGltaWVudG8gZW4gZWwgUGVyaW9kbyBkZSAyMDA3IGEgMjAxOC5UYW1iaWVuLCBzZSBwdWVkZSBjw6FsY3VsYXIgZWwgbcOheGltbyByZW5kaW1pZW50byBwb3IgZ3J1cG8gZW4gdC9oYSB5IGVsIG11bmljaXBpbyBhbCBxdWUgY29ycmVzcG9uZGUgZXN0ZSB2YWxvciBwYXJhIGVsIGHDsW8gMjAxOCBjb24gYXl1ZGEgZGUgbGEgZnVuY2nDs24gKmZpbHRlcigpKiAKPGRpdi8+CmBgYHtyfQpkYXRvcyAlPiUgZmlsdGVyKFBlcmlvZG89PTIwMTgpICU+JSBncm91cF9ieShHcnVwbywgTXVuaWNpcGlvKSAlPiUgc3VtbWFyaXplKG1heF9yZW5kID0gbWF4KFJlbmRpbWllbnRvLCBuYS5ybSA9IFRSVUUpKSAlPiUgICBzbGljZSh3aGljaC5tYXgobWF4X3JlbmQpKSAtPiByZW5kX21heF8xOAoKcmVuZF9tYXhfMTgKYGBgCjxkaXYgc3R5bGU9InRleHQtYWxpZ246IGp1c3RpZnkiPgpFamVjdXRhbmRvIGVsIHNpZ3VpZW50ZSBjw7NkaWdvIHNlIHZlIGN1YWxlcyBzb24gbG9zIG11bmljaXBpb3MgY29uIG1heW9yIMOhcmVhIGNvc2VjaGFkYSBkZSBjYWRhIGdydXBvIGVuIGVsIGHDsW8gMjAxOAo8ZGl2Lz4KYGBge3J9CmRhdG9zICU+JSAgZmlsdGVyKFBlcmlvZG89PTIwMTgpICU+JSBncm91cF9ieShHcnVwbywgTXVuaWNpcGlvKSAlPiUgc3VtbWFyaXplKEFSRUFfTUFYX0NPU0VDSEFEQSA9IG1heChBcmVhX0Nvc2VjaGFkYSwgbmEucm0gPSBUUlVFKSkgJT4lIHNsaWNlKHdoaWNoLm1heChBUkVBX01BWF9DT1NFQ0hBREEpKSAtPiBhcmVhX2Nvc2VjaGFfbWF4CgphcmVhX2Nvc2VjaGFfbWF4CmBgYAo8ZGl2IHN0eWxlPSJ0ZXh0LWFsaWduOiBqdXN0aWZ5Ij4KU2llbmRvICoqTGEgUHJpbWF2ZXJhKiosIGVsIG11bmljaXBpbyBjb24gbWF5b3Igw6FyZWEgY29zZWNoYWRhIHBhcmEgZWwgZ3J1cG8gKipPTEVBR0lOT1NBUyoqICwgYSBlc3RlIGdydXBvIHBlcnRlbmVjZSBlbCBjdWx0aXZvIGRlIGxhIHBhbG1hIGRlIGFjZWl0ZS4gCgojIyMjIDMuMSBFdm9sdWNpw7NuIGN1bHRpdm8gZGUgUGFsbWEgZGUgQWNlaXRlIGVuIExhIFByaW1hdmVyYSxWaWNoYWRhCkVsIGN1bHRpdm8gZGUgcGFsbWEgZGUgYWNlaXRlIGVzIHVubyBkZSBsb3MgY3VsdGl2b3MgcXVlIGhhIHZlbmlkbyBpbXB1bHNhbmRvc2UgcG9yIGVsIFtQcm95ZWN0byBWZXJhY3J1el0oaHR0cHM6Ly93d3cucmlvcGFpbGEtY2FzdGlsbGEuY29tL3BhbG1hLykgZGUgbGEgZW1wcmVzYSBSaW9wYWlsYSxlbiBlbCBtdW5pY2lwaW8gZGUgKipMYSBwcmltYXZlcmEqKiB5IGVsIG11bmljaXBpbyBkZSAqKlNhbnRhIFJvc2Fsw61hKiosYSBwYXJ0aXIgZGVsIGHDsW8gMjAxMC5NZWRpYW50ZSBsb3Mgc2lndWllbnRlcyBjw7NkaWdvcyBzZSBvYnNlcnZhcsOhIGxhIGV2b2x1Y2nDs24gZGUgZXN0ZSBjdWx0aXZvIHBhcmEgZWwgbXVuaWNpcGlvIGRlIExhIFByaW1hdmVyYS5QcmltZXJvLHNlIGZpbHRyYW4gbG9zIGRhdG9zIGNvcnJlc3BvbmRpZW50ZXMgYWwgbXVuaWNpcGlvIHkgYWwgY3VsdGl2byBkZSBpbnRlcsOpcyAoUGFsbWEgZGUgQWNlaXRlKSxwb3N0ZXJpb3JtZW50ZSBzZSBhZ3J1cGEgcG9yIHBlcmlvZG8geSBwb3IgY3VsdGl2bwo8ZGl2Lz4KYGBge3J9CmRhdG9zICU+JSBmaWx0ZXIoTXVuaWNpcGlvPT0gIkxBIFBSSU1BVkVSQSIgLCBTdWJncnVwbz09IlBBTE1BIERFIEFDRUlURSIpICU+JSBncm91cF9ieShQZXJpb2RvLCBDdWx0aXZvKSAtPiAgUEFMTUFfUFJJTUFWRVJBCgpQQUxNQV9QUklNQVZFUkEKCmBgYApgYGB7cn0KZyA8LSBnZ3Bsb3QoYWVzKHg9UGVyaW9kbywgeT0gUHJvZHVjY2lvbiksIGRhdGEgPSBQQUxNQV9QUklNQVZFUkEpICsgZ2VvbV9iYXIoc3RhdD0naWRlbnRpdHknLCB3aWR0aCA9IDEsIGZpbGwgPSAiIzAwOTk3NSIpICsgbGFicyh5PSJQcm9kdWNjacOzbiBbaGFdIiAsIHg9IkHDsW8iKSArIGdndGl0bGUoIkN1bHRpdm8gZGUgUGFsbWEgZGUgQWNlaXRlIGVuIGxhIFByaW1hdmVyYSwgVmljaGFkYSIpICsgbGFicyhjYXB0aW9uPSAiQmFzYWRvIGVuIChEQU5FLCAyMDE4KSIpICsgdGhlbWVfbWluaW1hbCgpCgpnCmBgYApQYXJhIGxvcyBhw7FvcyBkZSAyMDE2IHkgMjAxNyBubyBzZSBlbmN1ZW50cmEgcHJvZHVjY2nDs24sIGRlYmlkbyBhIHF1ZSBsYSBQYWxtYSAsIGVzIHVuYSBwbGFudGEgY29uIHVuYSB2aWRhIHByb2R1Y3RpdmEgbGFyZ2EgcGVybyBxdWUgdGFyZGEgYXByb3hpbWFkYW1lbnRlIDI2IG1lc2VzIGVuIGRhciBmcnV0byB1bmEgdmV6IHF1ZSBzZSBzaWVtYnJhIHkgc2Vnw7puIGxvcyBkYXRvcyBkZWwgcHJveWVjdG8gVmVyYWNydXosIHNlIGluaWNpw7MgY29uIGVzdHVkaW9zIGRlc2RlIGVsIGHDsW8gMjAxMCAsIHBlcm8gc8OzbG8gaGFzdGEgZWwgcGVyaW9kbyAyMDE1LTIwMTYgc2UgZW1wZXrDsyBsYSBzaWVtYnJhIGRlIGVzdGEgcGxhbnRhIGVuIExhIFByaW1hdmVyYSwgVmljaGFkYQoKIyMjIyAzLjIgRXZvbHVjacOzbiBjdWx0aXZvIGRlIE1hcmHDsW9uCk90cm8gY3VsdGl2byBxdWUgc2UgcHVlZGUgdmVyIGVuIGVsIGRlcGFydGFtZW50byBkZSBWaWNoYWRhIGVzIGVsIGRlbCBbTWFyYcOxb25dKGh0dHBzOi8vd3d3LmVsZXNwZWN0YWRvci5jb20vbm90aWNpYXMvZWNvbm9taWEvZWwtdmljaGFkYS1idXNjYS1zZXItZXBpY2VudHJvLWRlLWluZHVzdHJpYS1kZWwtbWFyYW5vbi1hcnRpY3Vsby02MjkyNjgpLCBxdWUgZW4gZWwgYcOxbyBkZSAyMDE2IG9jdXBhYmEgZWwgc2VndW5kbyBsdWdhciBwb3IgaGVjdMOhcmVhcyBlc3RhYmxlY2lkYXMgYSBuaXZlbCBuYWNpb25hbCAsZXN0ZSBjdWx0aXZvIGhhIHNpZG8gaW1wdWxzYWRvIGRlc2RlIGVsIGHDsW8gMjAxMyBwb3IgZWwgcHJveWVjdG8gW01BUyBtYXJhw7Fvbl0oaHR0cHM6Ly91bmlhbmRlcy5lZHUuY28vZXMvbm90aWNpYXMvZWNvbm9taWEteS1uZWdvY2lvcy9tYXJhbm9uLWRlLWV4cG9ydGFjaW9uKSAsIGRlc2Fycm9sbGFkbyBwb3IgbGEgVW5pdmVyc2lkYWQgZGUgbG9zIEFuZGVzICwgQ29ycG9pY2EgKEFjdHVhbG1lbnRlIGNvbm9jaWRvIGNvbW8gQWdyb3NhdmlhKSB5IGxhIGdvYmVybmFjacOzbiBkZSBlc3RlIGRlcGFydGFtZW50by5Fc3RlIHByb3llY3RvIGJ1c2NhIGlubm92YXIgZW4gZWwgcHJvY2VzbyBwcm9kdWN0aXZvIGRlbCBtYXJhw7FvbiAsIHBhcmEgcXVlIGVzdGUgcHJvZHVjdG8gdGVuZ2EgdW4gdmFsb3IgYWdyZWdhZG8sYmVuZWZpY2lhbmRvIGFzw60gYSBsb3MgaGFiaXRhbnRlcyBkZWwgVmljaGFkYSB5IGFsIGRlc2Fycm9sbG8gZWNvbsOzbWljbyBkZSBsYSByZWdpw7NuLiBMYXMgZXN0YWTDrXN0aWNhcyBkZSBlc3RlIGN1bHRpdm8gZW4gUHVlcnRvIENhcnJlw7FvICwgbGEgY2FwaXRhbCBkZSBWaWNoYWRhIHBhcmEgZWwgcGVyaW9kbyAyMDExIGEgMjAxOCBzb24gbGFzIHNpZ3VpZW50ZXM6CmBgYHtyfQpkYXRvcyAlPiUgZmlsdGVyKE11bmljaXBpbz09ICJQVUVSVE8gQ0FSUkVOTyIgLCBTdWJncnVwbz09Ik5VRUNFUyIsIFBlcmlvZG8+PTIwMTEpICU+JSBncm91cF9ieShQZXJpb2RvLCBDdWx0aXZvKSAtPiAgUFRPX05VRVoKClBUT19OVUVaCmBgYApMYSBwcm9kdWNjacOzbiBwYXJhIGVzdGUgcGVyaW9kbyBkZSB0aWVtcG8gc2Ugb2JzZXJ2YXLDoSBtZWRpYW50ZSBlbCBzaWd1aWVudGUgZ3LDoWZpY28gZGUgYmFycmFzCmBgYHtyfQptIDwtIGdncGxvdChhZXMoeD1QZXJpb2RvLCB5PVByb2R1Y2Npb24pLCBkYXRhID0gUFRPX05VRVopICsgZ2VvbV9iYXIoc3RhdD0naWRlbnRpdHknLCB3aWR0aCA9IDAuNSwgZmlsbCA9ICIjMDA5OTc1IikgKyBsYWJzKHk9J1Byb2R1Y2Npw7NuJykgKyBnZW9tX3RleHQoYWVzKGxhYmVsID0gUHJvZHVjY2lvbiksIHZqdXN0PS0wLjUgLCBzaXplID0gMy41KSArIHRoZW1lX21pbmltYWwoKSArIGxhYnModGl0bGUgPSAiRXZvbHVjacOzbiBlbiBsYSBwcm9kdWNjacOzbiBkZSBtYXJhw7FvbiBlbiBQdWVydG8gY2FycmXDsW8iLCBjYXB0aW9uPSAiQmFzYWRvIGVuIChEQU5FLCAyMDE4KSIpCgptCmBgYApQYXJhIHNlZ3VpciBjb24gbGEgZXhwbG9yYWNpw7NuIGRlIGxhcyBlc3RhZMOtc3RpY2FzIGFncmljb2xhcyBlbiBWaWNoYWRhLCBzZSBhdmVyaWd1YXLDoSBxdWUgZ3J1cG9zIGRlIGN1bHRpdm8gdHV2aWVyb24gbGEgbWF5b3Igw6FyZWEgY29zZWNoYWRhIGVuIGVsIGHDsW8gMjAxOApgYGB7cn0KI1VzYW1vcyBsYSBmdW5jacOzbiBhcnJhbmdlKCkgcGFyYSBvcmRlbmFyIGxvcyBkYXRvcyAgZW4gZnVuY2nDs24gZGVsIMOhcmVhIGNvc2FjaGFkYSBlbiAyMDE4CmRhdG9zICU+JSBmaWx0ZXIoUGVyaW9kbz09MjAxOCkgJT4lIGdyb3VwX2J5KEdydXBvKSAlPiVzdW1tYXJpemUoc3VtX2FyZWFfY29zZWNoYWRhID0gc3VtKEFyZWFfQ29zZWNoYWRhLCBuYS5ybSA9IFRSVUUpKSAlPiUgYXJyYW5nZShkZXNjKHN1bV9hcmVhX2Nvc2VjaGFkYSkpIC0+IHRvdGFsX2FyZWFfY29zZWNoYWRhCgp0b3RhbF9hcmVhX2Nvc2VjaGFkYQpgYGAKRWwgZ3J1cG8gY29uIG1heW9yIMOhcmVhIGNvc2VjaGFkYSBjb3JyZXNwb25kZSBhICoiT0xFQUdJTk9TQVMiKixzZSBwdWVkZSBidXNjYXIgZW4gbG9zIGRhdG9zIHF1ZSBjdWx0aXZvcyBwZXJ0ZW5lY2VuIGEgZXN0ZSBncnVwbyB5IGVsIMOhcmVhIGNvc2VjaGFkYSBwYXJhIGNhZGEgY3VsdGl2byBlbiBlbCBhw7FvIDIwMTgsIGRlIGxhIHNpZ3VpZW50ZSBtYW5lcmE6CmBgYHtyfQpkYXRvcyAlPiUgZmlsdGVyKEdydXBvPT0iT0xFQUdJTk9TQVMiICYgUGVyaW9kbz09MjAxOCkgJT4lIGdyb3VwX2J5KEN1bHRpdm8pICU+JSBzdW1tYXJpemUoc3VtX2Nvc2VjaGEgPSBzdW0oQXJlYV9Db3NlY2hhZGEsIG5hLnJtID0gVFJVRSkpICU+JSBhcnJhbmdlKGRlc2Moc3VtX2Nvc2VjaGEpKSAtPiB0b3RhbF9jb3NlY2hhZG8KCnRvdGFsX2Nvc2VjaGFkbwpgYGAKQWhvcmEgLCBzZSBvYnRlbmRyw6FuIGxvcyBtdW5pY2lwaW9zIGNvbiBtYXlvciDDoXJlYSBjb3NlY2hhZGEgcGFyYSBjYWRhIGN1bHRpdm8gZGVsIGdydXBvICpPTEVBR0lOT1NBUyogZW4gZXNlIG1pc21vIGHDsW8KYGBge3J9CmRhdG9zICU+JSBmaWx0ZXIoUGVyaW9kbz09MjAxOCAmIEdydXBvPT0iT0xFQUdJTk9TQVMiKSAlPiUgZ3JvdXBfYnkoQ3VsdGl2bywgTXVuaWNpcGlvKSAlPiUgc3VtbWFyaXplKEFSRUFfTUFYID0gbWF4KEFyZWFfQ29zZWNoYWRhLCBuYS5ybSA9IFRSVUUpKSAlPiUgc2xpY2Uod2hpY2gubWF4KEFSRUFfTUFYKSkgLT4gb2xnX2FyZWEKCm9sZ19hcmVhCmBgYAojIyMjIDMuMyDDgXJlYSBjb3NlY2hhZGEgcG9yIGdydXBvIGRlIGN1bHRpdm8KU2Ugb2JzZXJ2YXLDoSBtZWRpYW50ZSB1biBncsOhZmljbyBkZSBiYXJyYXMgZWwgw4FyZWEgY29zZWNoYWRhIHBhcmEgY2FkYSBncnVwbyBkZSBjdWx0aXZvIGVuIGVsIGHDsW8gMjAxOCxhbnRlcyBkZSB0cmF6YXIgZWwgZ3LDoWZpY28gc2UgYWdyZWdhcsOhIGFsIG9iamV0byAqdG90YWxfw6FyZWFfY29zZWNoYWRhKix1bmEgbnVldmEgY29sdW1uYSBwYXJhIGNhZGEgZ3J1cG8gZGUgY3VsdGl2byBjb24gc3Ugbm9tYnJlIGFicmV2aWFkby5Bc8OtIHNlIGV2aXRhIHF1ZSBlbCBwbG90IHNlIHZlYSBkZXNvcmRlbmFkbwpgYGB7cn0KdG90YWxfYXJlYV9jb3NlY2hhZGEkQ1VMVElWTyA8LSBhYmJyZXZpYXRlKHRvdGFsX2FyZWFfY29zZWNoYWRhJEdydXBvLCAzKQpgYGAKUG9zdGVyaW9ybWVudGUsIHNlIHRyYXphIGVsIGdyw6FmaWNvIGRlIGJhcnJhcwpgYGB7cn0KayA8LSBnZ3Bsb3QoYWVzKHg9Q1VMVElWTywgeT1zdW1fYXJlYV9jb3NlY2hhZGEpLCBkYXRhID0gdG90YWxfYXJlYV9jb3NlY2hhZGEpICsgZ2VvbV9iYXIoc3RhdD0naWRlbnRpdHknLGZpbGw9IiMwMDk5NzUiKSArIGxhYnMoeT0nQXJlYSB0b3RhbCBDb3NlY2hhZGEgW0hhXScsIHg9ICJHcnVwbyBkZSBjdWx0aXZvIikrIGdlb21fdGV4dChhZXMobGFiZWwgPSBzdW1fYXJlYV9jb3NlY2hhZGEpLCB2anVzdD0tMC41ICwgc2l6ZSA9IDMuNSkrdGhlbWVfbWluaW1hbCgpCmBgYApgYGB7cn0KaysgZ2d0aXRsZSgiQXJlYSBjb3NlY2hhZGEgcG9yIGdydXBvIGVuIDIwMTggcGFyYSBWaWNoYWRhIikgKyB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41KSkgKwogICBsYWJzKGNhcHRpb249ICJCYXNhZG8gZW4gKERBTkUsIDIwMTgpIikKYGBgCkxvcyBncnVwb3MgZGUgY3VsdGl2byBjb24gbWF5b3Igw6FyZWEgY29zZWNoYWRhIHNvbiBsYXMgKk9MRUFHSU5PU0FTKiB5IGxvcyAqQ0VSRUFMRVMqIC5Mb3MgY2VyZWFsZXMgcHJlc2VudGFuIHVuYSBleHRlbnNpw7NuIHNpZ25pZmljYXRpdmEgZGUgY3VsdGl2byBlbiBlbCBkZXBhcnRhbWVudG8gLCBwdWVzIGEgZXN0ZSBncnVwbyBwZXJ0ZW5lY2UgZWwgbWHDrXogcXVlIHByaW5jaXBhbG1lbnRlIHNlIGN1bHRpdmEgcGFyYSBsYSBhbGltZW50YWNpw7NuIGRlbCBnYW5hZG8gdmFjdW5vIGRlIGxhIHJlZ2nDs24KCiMjIyMgMy40IMOBcmVhIHNlbWJyYWRhIHBvciBjaWNsbyBkZSBjdWx0aXZvCgpFbiBlbCBhcmNoaXZvIGRlc2NhcmdhZG8gcGFyYSBlc3RhZMOtc3RpY2FzIGFncmljb2xhcyBzZSByZXBvcnRhbiBjdWx0aXZvcyBkZSBjaWNsbyB0cmFuc2l0b3JpbyxhbnVhbCB5IHBlcm1hbmVudGUKCkVsIMO6bmljbyBjdWx0aXZvIGFudWFsIHJlZ2lzdHJhZG8gcGFyYSBlbCBkZXBhcnRhbWVudG8gZXMgbGEgeXVjYS5Qb3Igc3UgcGFydGUsIGVsIG1haXosIGVzIGVsIGN1bHRpdm8gdHJhbnNpdG9yaW8gbcOhcyByZXByZXNlbnRhdGl2byAsbWllbnRyYXMgcXVlIGxhIHBhbG1hIGRlIGFjZWl0ZSBsbyBlcyBkZSBsb3MgY3VsdGl2b3MgcGVybWFuZW50ZXMuTWVkaWFudGUgbG9zIHNpZ3VpZW50ZXMgY8OzZGlnb3Mgc2UgY29tcGFyYXLDoSBlbCDDoXJlYSBzZW1icmFkYSBkZSBsb3MgY3VsdGl2b3MgZGUgY2ljbG8gcGVybWFuZW50ZSB5IGNpY2xvIHRyYW5zaXRvcmlvIHBhcmEgZGVtb3N0cmFyIGVzdGEgYWZpcm1hY2nDs24KCkxvcyAqKmN1bHRpdm9zIHRyYW5zaXRvcmlvcyoqIHNvbiBhcXVlbGxvcyBxdWUgdGllbmVuIHVuIGNpY2xvIGRlIGNyZWNpbWllbnRvIG1lbm9yIGEgdW4gYcOxby5QYXJhIGVsIGRlcGFydGFtZW50byBkZSBWaWNoYWRhIHNlIHRpZW5lIGluZm9ybWFjacOzbiBkZSA0IGN1bHRpdm9zIGNvbiBlc3RlIGNpY2xvOiBFbCBhasOtLCBlbCBhcnJveiwgZWwgY2lsYW50cm8geSBlbCBtYcOtei5FbCDDoXJlYSBtw6F4aW1hIHNlbWJyYWRhIHBhcmEgY2FkYSB1bm8gZGUgZXN0b3MgY3VsdGl2b3MgZW4gZWwgYcOxbyAyMDE4IGVzIGxhIHNpZ3VpZW50ZToKYGBge3J9CmRhdG9zICU+JSBmaWx0ZXIoUGVyaW9kbz09MjAxOCAmIENpY2xvPT0iVFJBTlNJVE9SSU8iICkgJT4lIGdyb3VwX2J5KEN1bHRpdm8pICU+JSBzdW1tYXJpemUoQVJFQVNfTUFYID0gbWF4KEFyZWFfU2VtYnJhZGEsIG5hLnJtID0gVFJVRSkpLT4gdHJhbnNpX2FyZWEKCnRyYW5zaV9hcmVhCmBgYApTZSB2ZSBxdWUgZWwgbWHDrXogLCB0aWVuZSB1biDDoXJlYSBtdWNobyBtYXlvciBxdWUgbG9zIG90cm9zIGN1bHRpdm9zIGRlIGNpY2xvIHRyYW5zaXRvcmlvLCBlc3RhIGluZnJvbWFjacOzbiBwdWVkZSB2ZXJzZSBwbGFzbWFkYSBlbiB1biBncsOhZmljbyBkZSBiYXJyYXMgZGUgbGEgc2lndWllbnRlIG1hbmVyYToKYGBge3J9CkogPC0gZ2dwbG90KGFlcyh4PUN1bHRpdm8sIHk9QVJFQVNfTUFYKSwgZGF0YSA9IHRyYW5zaV9hcmVhKSArIGdlb21fYmFyKHN0YXQ9J2lkZW50aXR5JyxmaWxsPSIjMDA5OTc1IikgKyBsYWJzKHk9J0FyZWEgdG90YWwgU2VtYnJhZGEgW0hhXScsIHg9ICJDdWx0aXZvIikrIHRoZW1lX21pbmltYWwoKSArIGdndGl0bGUoIsOBcmVhIHNlbWJyYWRhIHBhcmEgbG9zIGN1bHRpdm9zIGRlIGNpY2xvIHRyYW5zaXRvcmlvIikgKyB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41KSkgKyBsYWJzKGNhcHRpb249ICJCYXNhZG8gZW4gKERBTkUsIDIwMTgpIikrIGdlb21fdGV4dChhZXMobGFiZWwgPSBBUkVBU19NQVgpLCB2anVzdD0tMC41ICwgc2l6ZSA9IDMuNSkKCkoKYGBgClBvciBvdHJvIGxhZG8sIHNlIHRpZW5lbiBsb3Mgc2lndWllbnRlcyBkYXRvcyAgeSBncsOhZmljbyBkZSBiYXJyYXMgcGFyYSBlbCDDoXJlYSBzZW1icmFkYSBwYXJhIGxvcyBjdWx0aXZvcyBkZSBjaWNsbyBwZXJtYW5lbnRlCmBgYHtyfQpkYXRvcyAlPiUgZmlsdGVyKFBlcmlvZG89PTIwMTggJiBDaWNsbz09IlBFUk1BTkVOVEUiICkgJT4lIGdyb3VwX2J5KEN1bHRpdm8pICU+JSBzdW1tYXJpemUoQVJFQTFfTUFYID0gbWF4KEFyZWFfU2VtYnJhZGEsIG5hLnJtID0gVFJVRSkpLT4gUGVyX2FyZWEKClBlcl9hcmVhCmBgYApgYGB7cn0KI1ByaW1lcm8gc2UgYWJyZXZpYW4gbG9zIG5vbWJyZXMgZGUgY2FkYSBjdWx0aXZvIHBhcmEgcXVlIGVsIGdyw6FmaWNvIG5vIHNlIHZlYSBkZXNvcmRlbmFkbwpQZXJfYXJlYSRDdWx0aXZvPC0gYWJicmV2aWF0ZShQZXJfYXJlYSRDdWx0aXZvLCAzKQoKSiA8LSBnZ3Bsb3QoYWVzKHg9Q3VsdGl2bywgeT1BUkVBMV9NQVgpLCBkYXRhID0gUGVyX2FyZWEpICsgZ2VvbV9iYXIoc3RhdD0naWRlbnRpdHknLGZpbGw9IiMwMDk5NzUiKSArIGxhYnMoeT0nQXJlYSB0b3RhbCBTZW1icmFkYSBbSGFdJywgeD0gIkN1bHRpdm8iKSsgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IEFSRUExX01BWCksIHZqdXN0PS0wLjUgLCBzaXplID0gMy41KSt0aGVtZV9taW5pbWFsKCkrIGdndGl0bGUoIsOBcmVhIGNvc2VjaGFkYSBwYXJhIGxvcyBjdWx0aXZvcyBkZSBjaWNsbyBwZXJtYW5lbnRlIikgKyB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41KSkKCkoKYGBgCiMjIyA0LlVuaXIgbGFzIGVzdGFkw61zdGljYXMgYWdyw61jb2xhcyBhIGxvcyBtdW5pY2lwaW9zCgpMb3MgZGF0b3MgYWRtaW5pc3RyYXRpdm9zIHBhcmEgZWwgZGVwYXJ0YW1lbnRvIGRlIFZpY2hhZGEsZnVlcm9uIGRlc2NhcmdhZG9zIGRlbCBbTWFyY28gZ2VvZXN0YWRpc3RpY28gTmFjaW9uYWwgZGVsIERBTkVdKGh0dHBzOi8vZ2VvcG9ydGFsLmRhbmUuZ292LmNvL3NlcnZpY2lvcy9kZXNjYXJnYS15LW1ldGFkYXRvcy9kZXNjYXJnYS1tZ24tbWFyY28tZ2VvZXN0YWRpc3RpY28tbmFjaW9uYWwvKSBlbiBmb3JtYXRvIHNoYXBlZmlsZQoKRXN0b3MgZGF0b3MgLCBwdWVkZW4gbGVlcnNlIGNvbiBheXVkYSBkZSBsYSBsaWJyZXJpYSAqc2YqIGRlIGxhIHNpZ3VpZW50ZSBtYW5lcmEgYWxtYWNlbmFuZG9zZSBjb21vICpWaWNoYWRhX211bmljKgpgYGB7cn0KVmljaGFkYV9tdW5pYyA8LSBzZjo6c3RfcmVhZCgiL2Nsb3VkL3Byb2plY3QvVmljaGFkYS8vQURNSU5JU1RSQVRJVk8vTUdOX01QSU9fUE9MSVRJQ08uc2hwIikKYGBgCioqwr9RdcOpIGVzIGVsIG9iamV0byBWaWNoYWRhX211bmljPyoqCgpgYGB7cn0KVmljaGFkYV9tdW5pYwpgYGAKCkVsIG9iamV0byBWaWNoYWRhX211bmljIGVzIHVuYSBjb2xlY2Npw7NuIGRlIGNhcmFjdGVyw61zdGljYXMgc2ltcGxlLCBjb24gdW5hIGdlb21ldHLDrWEgZGUgcG9sw61nb25vIChRdWUgdGllbmUgZGltZW5zaW9uZXMgWFksIGVzIGRlY2lyIHViaWNhY2nDs24gY29vcmRlbmFkYSBkZSBub3J0ZSxzdXIsb3JpZW50ZSB1IG9jY2lkZW50ZSksdXNhbmRvIGVsIHNpc3RlbWEgZGUgcmVmZXJlbmNpYSBXR1M4NCAgCgpQb2RlbW9zIHVzYXIgbGEgZnVuY2nDs24gKmxlZnRfam9pbiogcGFyYSB1bmlyIGVsIHNoYXBlZmlsZSBkZSBsb3MgbXVuaWNpcGlvcyB5IGxhcyBlc3RhZGlzdGljYXMgcXVlIHNlIGhhbiB2ZW5pZG8gZXhwbG9yYW5kbyBlbiBlc3RlIFJOb3RlYm9vayAgbWVkaWFudGUgdW5hIHZhcmlhYmxlIGVuIGNvbcO6biwgZW4gZXN0ZSBjYXNvIHNlcsOhIGVsIGNvZGlnbyBkZWwgbXVuaWNpcGlvICwgcXVlIHNlIGVuY3VlbnRyYSBjb21vICJDT0RfTVVOIiBlbiBsYXMgZXN0YWTDrXN0aWNhcyB5ICJNUElPX0NDREdPIiBlbiBlbCBhcmNoaXZvIHNoYXBlZmlsZQoKUHJpbWVybyAsIHNlIGZpbHRyYW4gbG9zIGRhdG9zIGRlIFB1ZXJ0byBDYXJyZcOxbyBkZWwgYXJjaGl2byBjb3JyZXNwb25kaWVudGUgYSBsYXMgZXN0YWTDrXN0aWNhcwpgYGB7cn0KZGF0b3MgJT4lIGZpbHRlciAoTXVuaWNpcGlvID09IlBVRVJUTyBDQVJSRU5PIikgLT4gIENhcnJlbm9fZGF0b3MKYGBgCgpgYGB7cn0KQ2FycmVub19kYXRvcwpgYGAKCkx1ZWdvLCB2ZW1vcyBxdWUgdGlwbyBkZSBkYXRvIGVzIGxhIHZhcmlhYmxlICJDT0RfTVVOIgoKYGBge3J9CmNsYXNzKENhcnJlbm9fZGF0b3MkQ09EX01VTikKYGBgClBhcmEgaGFjZXIgZWwgam9pbiAsIHNlIGRlYmUgY2FtYmlhciBlbCB0aXBvIGRlIGRhdG8gcXVlIGVzIGxhIHZhcmlhYmxlICJDT0RfTVVOIiB5IGVsIGNvbnRlbmlkbyBkZSBsb3MgZGF0b3MgY29ycmVzcG9uZGllbnRlcyBhIGxhcyBlc3RhZMOtc3RpY2FzIC5Db21vIHNlIHZhIGEgaGFjZXIgbWFuaXB1bGFjacOzbiBkZSBsb3MgZGF0b3MgZXMgbWVqb3IgdGVuZXIgdW5hIGNvcGlhIGRlIGxvcyBtaXNtb3MgCgpgYGB7cn0KZGF0b3Njb3AgPC0gZGF0b3MKYGBgCgpgYGB7cn0KZGF0b3Njb3AkVEVNUCA8LSBhcy5jaGFyYWN0ZXIoZGF0b3Njb3AkQ09EX01VTikKZGF0b3Njb3AkTVBJT19DQ0RHTyA8LSBhcy5mYWN0b3IocGFzdGUoZGF0b3Njb3AkVEVNUCkpCmBgYApgYGB7cn0KaGVhZChkYXRvc2NvcCkKYGBgCkRlIGxvcyBkYXRvcyBvYnRlbmlkb3Mgc2UgdmUgdW5hIG51ZXZhIGNvbHVtbmEgY29uIGVsIHTDrXR1bG8gIk1QSU9fQ0NER08iLCBxdWUsIGNvbW8geWEgc2UgaGFiaWEgbWVuY2lvbmFkbyAsc2Vyw6EgbGEgdmFyaWFibGUgIkNsYXZlIiAgZW4gbGEgcmVhbGl6YWNpw7NuIGRlbCBKb2luCgpQb3N0ZXJpb3JtZW50ZSwgc2UgZmlsdHJhIGVsIGN1bHRpdm8gZGUgaW50ZXLDqXMsIGVuIGVzdGUgY2FzbyBzZXLDoSBsYSAqKll1Y2EqKiAuTGEgeXVjYSBlcyB1biBjdWx0aXZvIHF1ZSBlc3TDoSBwcmVzZW50ZSBlbiB0b2RvcyBsb3MgbXVuaWNpcGlvcyBkZWwgZGVwYXJ0YW1lbnRvIGRlc3RpbmFkbyBhIGxhIGFsaW1lbnRhY2nDs24gZGUgc3VzIGhhYml0YW50ZXMKYGBge3J9CmRhdG9zY29wICU+JSBmaWx0ZXIoQ3VsdGl2byA9PSAiWVVDQSIpICAtPiBkYXRvczMKaGVhZChkYXRvczMpCmBgYApgYGB7cn0KY2xhc3MoZGF0b3MzKQpgYGAKVGFtYmnDqW4gLCBzZSBmaWx0cmFuIGxhcyB2YXJpYWJsZXMgcXVlIGNvbnNpZGVyZW1vcyByZWxldmFudGVzIHBhcmEgcmVwcmVzZW50YXIKYGBge3J9CmRhdG9zNCA8LSBkYXRvczMgJT4lIGRwbHlyOjpzZWxlY3QoTXVuaWNpcGlvLCBNUElPX0NDREdPLCBQZXJpb2RvLCBQcm9kdWNjaW9uLCBSZW5kaW1pZW50bykgCgpkYXRvczQKYGBgCmBgYHtyfQojQ29uIGxhIGZ1bmNpw7NuIGdhdGhlciwgdHJhbnNmb3JtYW1vcyBsb3MgZGF0b3MgZGUgYcOxbywgcHJvZHVjY2nDs24geSByZW5kaW1pZW50byBkZSBmb3JtYXRvIGFuY2hvIGEgZm9ybWF0byBsYXJnbwpkYXRvczQgJT4lIGdhdGhlcigiUGVyaW9kbyIsICJQcm9kdWNjaW9uIiwgIlJlbmRpbWllbnRvIiAsIGtleSA9IHZhcmlhYmxlLCB2YWx1ZSA9IG51bWJlciApIApgYGAKYGBge3J9CmhlYWQoZGF0b3M0KQpgYGAKRW4gZWwgc2lndWllbnRlIGPDs2RpZ28gbG9zIGRhdG9zIHNlIGFncnVwYW4geSBzZSBzZSByZWFsaXphIHVuYSB0YXJlYSBjbGF2ZSBwYXJhIGNvbnZlcnRpciBhcmNoaXZvcyBsYXJnb3MgYSBmb3JtYXRvIGFuY2hvCmBgYHtyfQpkYXRvczQgJT4lIAogIGdyb3VwX2J5KE1QSU9fQ0NER08pICU+JSAKICAjc2UgY3JlYSB1bmEgdmFyaWFibGUgcXVlIGlkZW50aWZpcXVlIGNhZGEgdW5hIGRlIGVsbGFzIAogIG11dGF0ZShWaXNpdCA9IDE6bigpKSAlPiUgCiAgZ2F0aGVyKCJQZXJpb2RvIiwgIlByb2R1Y2Npb24iLCAiUmVuZGltaWVudG8iLCBrZXkgPSB2YXJpYWJsZSwgdmFsdWUgPSBudW1iZXIpICU+JSAKICAjU2UgY29tYmluYW4gbGFzIHZhcmlhYmxlcwogIHVuaXRlKGNvbWJpLCB2YXJpYWJsZSwgVmlzaXQpICU+JQogICNVc2Ftb3Mgc3ByZWFkKCkgcGFyYSBwYXNhciBkZSBmb3JtYXRvIGxhcmdvIGEgZm9ybWF0byBhbmNobwogIHNwcmVhZChjb21iaSwgbnVtYmVyKSAtPiBkYXRvczUKaGVhZChkYXRvczUpCmBgYApgYGB7cn0KdGFpbChkYXRvczUpCmBgYApBaG9yYSBzZSByZWFsaXphIHVuYSBjb3BpYSBkZSBsb3MgZGF0b3MgY29udGVuaWRvcyBlbiBlbCBhcmNoaXZvIHNmLHBvciBzaSBzZSBsbGVnYW4gYSBwcmVzZW50YXIgaW5jb3ZlbmllbnRlcyBlamVjdXRhbmRvIGxvcyBzaWd1aWVudGVzIGNvZGlnb3MKYGBge3J9ClZpY2hhZGFfbXVuaWMyIDwtIFZpY2hhZGFfbXVuaWMKYGBgClZlcmlmaWNhbW9zIHF1ZSBsYSB2YXJpYWJsZSAiTVBJT19DQ0RHTyIgc2VhIGVsIG1zaW1vIHRpcG8gZGUgZGF0b3MgZW4gbGFzIGVzdGFkw61zdGljYXMgeSBlbCBhcmNoaXZvIHNoYXBlZmlsZQpgYGB7cn0Kc3RyKFZpY2hhZGFfbXVuaWMyKQpgYGAKYGBge3J9CnN0cihkYXRvczUpCmBgYApQb3IgdWx0aW1vIHNlIHJlYWxpemEgZWwgSm9pbgpgYGB7cn0KVmljaGFkYV9tdW5pY19lc3RhID0gbGVmdF9qb2luKFZpY2hhZGFfbXVuaWMyLCBkYXRvczUsIGJ5PSJNUElPX0NDREdPIikKYGBgCgpgYGB7cn0Kc3VtbWFyeShWaWNoYWRhX211bmljX2VzdGEpCmBgYAojIyMgTWFwYSBkZSBsYSBwcm9kdWNjacOzbiBkZSBZdWNhIGVuIFZpY2hhZGEKCmBgYHtyfQojU2UgY2FyZ2FuIGxhcyBsaWJyZXJpYXMgbmVjZXNhcmlhcyBwYXJhIGVsIHRyYXphZG8KbGlicmFyeShSQ29sb3JCcmV3ZXIpCmxpYnJhcnkobGVhZmxldCkKYGBgCgoKQ29uIGF5dWRhIGRlIGxhIGxpYnJlcmlhICpsZWFmbGV0KiBzZSByZWFsaXphIHVuIHRyYXphZG8gZGVsIG1hcGEgcXVlIG11ZXN0cmEgbGEgcHJvZHVjY2nDs24gZGUgWXVjYSBwb3IgbXVuaWNpcGlvIHBhcmEgZWwgYcOxbyAyMDE4CgpgYGB7cn0KYmlucyA8LSBjKDAsIDEwMCwgNTAwLCAxMDAwLCAzMDAwLCA0MDAwLCA2MDAwKQpwYWwgPC0gY29sb3JCaW4oIlNwZWN0cmFsIiwgZG9tYWluID0gVmljaGFkYV9tdW5pY19lc3RhJFByb2R1Y2Npb25fMTIsIGJpbnMgPSBiaW5zKQoKICBtYXBhIDwtIGxlYWZsZXQoZGF0YSA9IFZpY2hhZGFfbXVuaWNfZXN0YSkgJT4lCiAgYWRkVGlsZXMoKSAlPiUKICBhZGRQb2x5Z29ucyggbGFiZWwgPSB+UHJvZHVjY2lvbl8xMiwKICAgICAgICAgICAgICBwb3B1cCA9IH5NUElPX0NOTUJSLAogICAgICAgICAgICAgIGZpbGxDb2xvciA9IH5wYWwoUHJvZHVjY2lvbl8xMiksCiAgICAgICAgICAgICAgY29sb3IgPSAiIzQ0NDQ0NCIsCiAgICAgICAgICAgICAgd2VpZ2h0ID0gMSwKICAgICAgICAgICAgICBzbW9vdGhGYWN0b3IgPSAwLjUsCiAgICAgICAgICAgICAgb3BhY2l0eSA9IDEuMCwKICAgICAgICAgICAgICBmaWxsT3BhY2l0eSA9IDAuNSwKICAgICAgICAgICAgICBoaWdobGlnaHRPcHRpb25zID0gaGlnaGxpZ2h0T3B0aW9ucyhjb2xvciA9ICJ3aGl0ZSIsIHdlaWdodCA9IDIsIGJyaW5nVG9Gcm9udCA9IFRSVUUpCiAgICAgICAgICAgICAgKSAlPiUKICBhZGRQcm92aWRlclRpbGVzKHByb3ZpZGVycyRPcGVuU3RyZWV0TWFwKSAlPiUKICBhZGRMZWdlbmQoInRvcGxlZnQiLCBwYWwgPSBwYWwsIHZhbHVlcyA9IH5Qcm9kdWNjaW9uXzEyLAogICAgdGl0bGUgPSAiUHJvZHVjY2nDs24gZGUgWXVjYSBlbiBWaWNoYWRhIFtUb25dICgyMDE4KSIsCiAgICBvcGFjaXR5ID0gMgogICkKYGBgCgoKYGBge3J9Cm1hcGEKYGBgCgoKCgoKCgoKCgoK