###1. Introduction This Notebook is made as a form of presentation of
the first partial of the Basic Geomatics course of the semester 2024 - 2
where an analysis of the agricultural dynamics of the department of
Caquetá from 2019 to 2023 will be presented. The data that will be
visualized below come from the Municipal Agricultural Evaluations (EVA)
from 2019 to 2023 provided by the Ministry of Agriculture and Rural
Development. This notebook will show all the steps for the process, from
downloading programs for the R library to downloading and organizing the
database
###2. Set up. In this step, we will install and load the required R
libraries. Previously, most of the programs had already been downloaded,
so only those that are needed were downloaded
install.packages("readr")
WARNING: Rtools is required to build R packages but is not currently installed. Please download and install the appropriate version of Rtools before proceeding:
https://cran.rstudio.com/bin/windows/Rtools/
Installing package into ‘C:/Users/Karol Ruiz/AppData/Local/R/win-library/4.4’
(as ‘lib’ is unspecified)
probando la URL 'https://cran.rstudio.com/bin/windows/contrib/4.4/readr_2.1.5.zip'
Content type 'application/zip' length 1211560 bytes (1.2 MB)
downloaded 1.2 MB
package ‘readr’ successfully unpacked and MD5 sums checked
The downloaded binary packages are in
C:\Users\Karol Ruiz\AppData\Local\Temp\RtmpoHbLF0\downloaded_packages
install.packages("dplyr")
Error in install.packages : Updating loaded packages
install.packages("tidyverse")
Error in install.packages : Updating loaded packages
install.packages("ggplot2")
Error in install.packages : Updating loaded packages
library(readr)
library(ggplot2)
library(dplyr)
###3. Download the multi-year EVA dataset for your department Go to
https://www.datos.gov.co/Agricultura-y-Desarrollo-Rural/Evaluaciones-Agropecuarias-Municipales-EVA-2019-20/uejq-wxrr/explore
to find the dataset.In the linked website (i.e datos.gov.co), we are
going to visualize the data and apply a filter to obtain only the data
from Caquetá. Then export the data in csv format.
Now, go to the downloads directory to find out the
Evaluaciones_Agropecuarias_Municipales_EVA.csv file. Move it to your
working directory
###4. Read the EVA dataset
Now, change names for several columns which contains empty or “noisy”
characters:
datos %>% dplyr::rename('Cod_Mun' = 'Código.Dane.municipio',
'Cod_dpto'= 'Código.Dane.departamento',
'Grupo_cultivo' = 'Grupo.cultivo',
'Desagregacion_cultivo' = 'Desagregación.cultivo',
'Year' = 'Año',
'Area_Sembrada' = 'Área.sembrada',
'Area_Cosechada' = 'Área.cosechada',
'Produccion' = 'Producción',
'Estado' = 'Estado.físico.del.cultivo',
'Ciclo_del_cultivo' = 'Ciclo.del.cultivo',
'Cod_cultivo' = 'Código.del.cultivo',)-> new_eva
new_eva
###5. Data analysis Many data analysis tasks can be approached using
the split-apply-combine paradigm: split the data into groups, apply some
analysis to each group, and then combine the results.
The dplyr library makes this very easy through the use of the
group_by() function, which splits the data into groups. When the data is
grouped in this way, summarize() can be used to collapse each group into
a single-row summary. summarize() does this by applying an aggregating
or summary function to each group.
##5.1 The most importance crops between 2019 and 2023
new_eva %>%
##filter(Produccion > 0) %>%
group_by(Grupo_cultivo) %>%
summarize(total_produccion = sum(Produccion)) %>%
arrange(desc(total_produccion))
This table shows the total crop production in the department of
Caquetá from 2019 to 2023. The most productive crops in that period of
time in Caquetá were “cultivos tropicales tradiconales” and
“frutales”
Then we must save this table as follows
new_eva %>%
group_by(Grupo_cultivo) %>%
summarize(total_produccion = sum(Produccion)) -> PT
The next step is filter the most important crops. In the department
of Caquetá, the two crops with the highest production range from 90,000.
So we’ll filter from that number
PT %>%
filter(total_produccion > 90000) -> main.groups
(value = sum(main.groups$total_produccion))
[1] 2140835
Now we’ll create a pie chart from the main crops
main.groups$percent = main.groups$total_produccion/value
library(ggplot2)
# Barplot
bp<- ggplot(main.groups, aes(x="", y=percent, fill=Grupo_cultivo))+
geom_bar(width = 1, stat = "identity")
# Piechart
pie <- bp + coord_polar("y", start=0)
pie

##5.2 Municipalities with higher production for every group of
crops
new_eva %>%
group_by(Grupo_cultivo, Municipio) %>%
summarize(total_prod = sum(Produccion, na.rm = TRUE)) %>%
slice(which.max(total_prod)) %>%
arrange(desc(total_prod))
`summarise()` has grouped output by 'Grupo_cultivo'. You can override using the `.groups` argument.
Now, we are going to save the object
leaders
Now, we are going to filter the most important municipalities from
the agricultural point of view and let’s plot the filtered leaders
leaders %>%
filter(total_prod > 50000) -> main.leaders
# Basic barplot
Top<-ggplot(data=main.leaders, aes(x=Municipio, y=total_prod)) +
geom_bar(stat="identity")
Top

##5.3 Dynamics of the municipality with the highest group
production
San Vicente del Caguán was the municipality where the highest crop
production was reported, so we will make a visualization to know how the
crops behave in this municipality
new <- select(new_eva, Municipio, Cultivo, Year, Produccion, Rendimiento)
new
new_SVC <- filter(new, Municipio == "San Vicente del Caguán")
new_SVC
This table shows the production of all crops year after year in the
municipality, but now we will see what has been the highest crop
production per year
new_SVC %>%
group_by(Year, Cultivo) %>%
summarize(Produccion = max(Produccion, na.rm = TRUE)) %>%
slice(which.max(Produccion)) -> HC
`summarise()` has grouped output by 'Year'. You can override using the `.groups` argument.
HC
# we use the ggplot 2 library
g <- ggplot(aes(x=Year, y=Produccion/1000), data = HC) + geom_bar(stat='identity') + labs(y='Produccion de Caña [Ton x 1000]')
g + ggtitle("Evolution of Cane Crop Production in San Vicente del Caguán from 2019 to 2023") + labs(caption= "Based on EVA data (Minagricultura, 2024)")

The crop that has been more produced in the period of years from 2019
to 2023 has been the crop of cane, with a similar production in all
years.
##5.4 Dynamics of one important crop between 2019 and 2023
Let’s analyze the highest crop production by municipality in any
year
new_eva %>%
group_by(Grupo_cultivo, Municipio, Year) %>%
summarize(Produccion = max(Produccion, na.rm = TRUE)) %>%
slice(which.max(Produccion)) %>%
arrange(desc(Produccion)) -> Max_crop
`summarise()` has grouped output by 'Grupo_cultivo', 'Municipio'. You can override using the `.groups` argument.
Max_crop
In the municipality of San Jose del Fragua, the highest production of
traditional tropical crops was reported, at least in 2023. We will
continue to explore the production of this municipality in the crop
group with the highest demand among traditional tropical crops
new_eva %>%
filter(Municipio=="San José del Fragua" & Cultivo=="Caña") %>%
group_by(Year, Cultivo) %>%
select(Municipio, Cultivo, Produccion, Year) -> SJF_C
SJF_C
# we use the ggplot 2 library
g <- ggplot(aes(x=Year, y=Produccion/1000), data = SJF_C) + geom_bar(stat='identity') + labs(y='Produccion de Caña [Ton x 1000]')
g + ggtitle("Evolution of Cane Crop Production in San José del Fragua from 2019 to 2023") + labs(caption= "Based on EVA data (Minagricultura, 2024)")

Just like in San Vicente, in San José del Fragua the crop with the
highest production was the cane or sugarcane, but in this municipality
there was a low production in 2022 and 2021.
###6. Analysis of agricultural dynamics
The department of Caquetá has an agricultural frontier area of
1,735,461 ha, which corresponds to 19% of its territory, and its natural
forests and agricultural areas occupy 23.5% of its territory (2,115,159
ha), with San Vicente del Caguán being the municipality with the largest
agricultural frontier area (FA area: 324,585 ha – 19%). therefore, as we
saw in the previous data visualization, the municipality of San Vicente
del Caguán represents the largest agricultural production at a general
level in the department. However, a fact that is worth highlighting is
that this municipality, despite being the largest agricultural producer
in the department, has livestock as its main economic activity.
This department has a high aptitude for traditional tropical crops
and fruit trees, with sugarcane, cassava, corn, banana and pineapple
being the main crops of this region and the principal agricultural
economy of the department.
In the pandemic season (2020-2022) there was a decrease in
agricultural production, visualized in the data specifically for
sugarcane cultivation in the department of San José del Fragua, however,
in 2023 all production was efficiently recovered, which indicates that
this department has very good resistance and adaptability.
The department of Caquetá has a high agricultural potential, which
helps to draw a hopeful panorama in the face of soil recovery, food
sovereignty and even the economic recovery of the country, however, the
current situation in which this department finds itself in terms of land
use and internal conflict leaves us with the unknown of what we are
really taking advantage of or not using the country’s soils. generating
an invitation to redirect attention to this type of departments that
have been forgotten politically, but that have sufficient agricultural
potential to promote and strengthen this sector and contribute to the
development of the country.
###6. Analysis of agricultural dynamics (Spanish)
El departamento del Caquetá cuenta con un área de frontera agrícola
de 1.735.461 ha lo que corresponde al 19% de su territorio, y en sus
bosques naturales y áreas agropecuarias ocupan el 23.5% de su territorio
(2.115.159 ha), siendo San Vicente del Caguán el municipio con mayor
área de frontera agrícola (Área de FA: 324.585 ha – 19%), por lo cual,
como ya vimos en la visualización de datos previa, el municipio de San
Vicente del Caguán representa la mayor producción agrícola a nivel
general en el departamento. Sin embargo, un dato que vale la pena
resaltar es que este municipio a pesar de ser el mayor productor
agrícola del departamento tiene como principal actividad económica la
ganadería.
Este departamento presenta una aptitud alta frente a los cultivos
tropicales tradicionales y frutales, siendo la caña, la yuca, el maíz,
el plátano y la piña los cultivos principales de esta región y bajo los
cuales se mueve la economía agrícola del departamento.
En la temporada de pandemia (2020-2022) se presentó una disminución
de producción agrícola, visualizada en los datos específicamente del
cultivo de caña en el departamento de San José del Fragua, sin embargo,
en el 2023 se recuperó eficientemente toda la producción, lo cual indica
que en este departamento se presenta muy buena resistencia y
adaptabilidad.
El departamento del Caquetá tiene un alto potencial agrícola, el cual
ayuda a dibujar un panorama esperanzador frente a la recuperación de
suelos, la soberanía alimentaria e incluso la recuperación económica del
país, sin embargo, la situación actual en la que se encuentra este
departamento en cuestión de uso de suelos y conflicto interno nos deja
la incógnita de en qué estamos aprovechando o desaprovechando los suelos
del país realmente, generando una invitación para redireccionar la
atención a este tipo de departamentos que han sido olvidados
políticamente, pero que cuentan con el potencial agrícola suficiente
para impulsar y fortalecer este sector contribuyendo así al desarrollo
del país.
###7. Bibliography - Evaluaciones agropecuarias municipales – EVA.
Calendario Departamental de Siembras y Cosechas | Datos Abiertos
Colombia. (2023, 7 noviembre). https://www.datos.gov.co/Agricultura-y-Desarrollo-Rural/Evaluaciones-Agropecuarias-Municipales-EVA-Calenda/m6bb-k2h4/about_data
- Lizarazo, I., 2022. Understanding dynamic productivity of crops.
Available at https://rpubs.com/ials2un/production_dyn_v1. -
UPRA.(2023).Caquetá, microánalisis evaluaciones agropecuarias-EVA [PDF
file]https://upra.gov.co/Kit_Territorial/2-%20Informaci%C3%B3n%20por%20Departamentos/CAQUET%C3%81/3-%20Microan%C3%A1lisis%20Evaluaciones%20agropecuarias%202023-Caqueta.pdf
- UPRA.(2023).Resultados evaluaciones agropecuarias 2023.[PDF
file].https://upra.gov.co/es-co/Evas_Documentos/Resultados%20Evaluaciones%20Agropecuarias%202023.pdf
LS0tDQp0aXRsZTogIkFuw6FsaXNpcyBkZSBsYSBkaW7DoW1pY2EgYWdyw61jb2xhIGRlbCBkZXBhcnRhbWVudG8gZGVsIENhcXVldMOhIg0KQXV0aG9yOiBMYXVyYSBNYW5yaXF1ZQ0KRGF0ZTogMjAuMTIuMjAyNA0Kb3V0cHV0Og0KICBodG1sX2RvY3VtZW50Og0KICAgIGRmX3ByaW50OiBwYWdlZA0KICB3b3JkX2RvY3VtZW50OiBkZWZhdWx0DQogIHBkZl9kb2N1bWVudDogZGVmYXVsdA0KLS0tDQojIyMxLiBJbnRyb2R1Y3Rpb24gDQpUaGlzIE5vdGVib29rIGlzIG1hZGUgYXMgYSBmb3JtIG9mIHByZXNlbnRhdGlvbiBvZiB0aGUgZmlyc3QgcGFydGlhbCBvZiB0aGUgQmFzaWMgR2VvbWF0aWNzIGNvdXJzZSBvZiB0aGUgc2VtZXN0ZXIgMjAyNCAtIDIgd2hlcmUgYW4gYW5hbHlzaXMgb2YgdGhlIGFncmljdWx0dXJhbCBkeW5hbWljcyBvZiB0aGUgZGVwYXJ0bWVudCBvZiBDYXF1ZXTDoSBmcm9tIDIwMTkgdG8gMjAyMyB3aWxsIGJlIHByZXNlbnRlZC4gVGhlIGRhdGEgdGhhdCB3aWxsIGJlIHZpc3VhbGl6ZWQgYmVsb3cgY29tZSBmcm9tIHRoZSBNdW5pY2lwYWwgQWdyaWN1bHR1cmFsIEV2YWx1YXRpb25zIChFVkEpIGZyb20gMjAxOSB0byAyMDIzIHByb3ZpZGVkIGJ5IHRoZSBNaW5pc3RyeSBvZiBBZ3JpY3VsdHVyZSBhbmQgUnVyYWwgRGV2ZWxvcG1lbnQuIFRoaXMgbm90ZWJvb2sgd2lsbCBzaG93IGFsbCB0aGUgc3RlcHMgZm9yIHRoZSBwcm9jZXNzLCBmcm9tIGRvd25sb2FkaW5nIHByb2dyYW1zIGZvciB0aGUgUiBsaWJyYXJ5IHRvIGRvd25sb2FkaW5nIGFuZCBvcmdhbml6aW5nIHRoZSBkYXRhYmFzZQ0KDQojIyMyLiBTZXQgdXAuDQpJbiB0aGlzIHN0ZXAsIHdlIHdpbGwgaW5zdGFsbCBhbmQgbG9hZCB0aGUgcmVxdWlyZWQgUiBsaWJyYXJpZXMuIFByZXZpb3VzbHksIG1vc3Qgb2YgdGhlIHByb2dyYW1zIGhhZCBhbHJlYWR5IGJlZW4gZG93bmxvYWRlZCwgc28gb25seSB0aG9zZSB0aGF0IGFyZSBuZWVkZWQgd2VyZSBkb3dubG9hZGVkDQoNCmBgYHtyfQ0KaW5zdGFsbC5wYWNrYWdlcygicmVhZHIiKQ0KaW5zdGFsbC5wYWNrYWdlcygiZHBseXIiKQ0KYGBgDQpgYGB7cn0NCmluc3RhbGwucGFja2FnZXMoInRpZHl2ZXJzZSIpDQpgYGANCmBgYHtyfQ0KaW5zdGFsbC5wYWNrYWdlcygiZ2dwbG90MiIpDQpgYGANCg0KDQpgYGB7cn0NCmxpYnJhcnkocmVhZHIpDQpsaWJyYXJ5KGdncGxvdDIpDQpsaWJyYXJ5KGRwbHlyKQ0KYGBgDQoNCiMjIzMuIERvd25sb2FkIHRoZSBtdWx0aS15ZWFyIEVWQSBkYXRhc2V0IGZvciB5b3VyIGRlcGFydG1lbnQNCkdvIHRvIGh0dHBzOi8vd3d3LmRhdG9zLmdvdi5jby9BZ3JpY3VsdHVyYS15LURlc2Fycm9sbG8tUnVyYWwvRXZhbHVhY2lvbmVzLUFncm9wZWN1YXJpYXMtTXVuaWNpcGFsZXMtRVZBLTIwMTktMjAvdWVqcS13eHJyL2V4cGxvcmUgdG8gZmluZCB0aGUgZGF0YXNldC5JbiB0aGUgbGlua2VkIHdlYnNpdGUgKGkuZSBkYXRvcy5nb3YuY28pLCB3ZSBhcmUgZ29pbmcgdG8gdmlzdWFsaXplIHRoZSBkYXRhIGFuZCBhcHBseSBhIGZpbHRlciB0byBvYnRhaW4gb25seSB0aGUgZGF0YSBmcm9tIENhcXVldMOhLiBUaGVuIGV4cG9ydCB0aGUgZGF0YSBpbiBjc3YgZm9ybWF0Lg0KDQpOb3csIGdvIHRvIHRoZSBkb3dubG9hZHMgZGlyZWN0b3J5IHRvIGZpbmQgb3V0IHRoZSBFdmFsdWFjaW9uZXNfQWdyb3BlY3Vhcmlhc19NdW5pY2lwYWxlc19FVkEuY3N2IGZpbGUuIE1vdmUgaXQgdG8geW91ciB3b3JraW5nIGRpcmVjdG9yeQ0KDQojIyM0LiBSZWFkIHRoZSBFVkEgZGF0YXNldA0KYGBge3J9DQpkYXRvcyA8LSByZWFkLmNzdigiQzovVXNlcnMvS2Fyb2wgUnVpei9Eb2N1bWVudHMvR0VPTUFUSUNBIDIwMjQtMi9SL0VWQTE5MjMuY3N2IikNCmRhdG9zDQpgYGANCk5vdywgY2hhbmdlIG5hbWVzIGZvciBzZXZlcmFsIGNvbHVtbnMgd2hpY2ggY29udGFpbnMgZW1wdHkgb3Ig4oCcbm9pc3nigJ0gY2hhcmFjdGVyczoNCg0KYGBge3J9DQpkYXRvcyAlPiUgIGRwbHlyOjpyZW5hbWUoJ0NvZF9NdW4nID0gJ0PDs2RpZ28uRGFuZS5tdW5pY2lwaW8nLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAnQ29kX2RwdG8nPSAnQ8OzZGlnby5EYW5lLmRlcGFydGFtZW50bycsDQogICAgICAgICAgICAgICAgICAgICAgICAgJ0dydXBvX2N1bHRpdm8nID0gJ0dydXBvLmN1bHRpdm8nLA0KICAgICAgICAgICAgICAgICAgICAgICAgICdEZXNhZ3JlZ2FjaW9uX2N1bHRpdm8nID0gJ0Rlc2FncmVnYWNpw7NuLmN1bHRpdm8nLA0KICAgICAgICAgICAgICAgICAgICAgICAgICdZZWFyJyA9ICdBw7FvJywNCiAgICAgICAgICAgICAgICAgICAgICAgICAnQXJlYV9TZW1icmFkYScgPSAnw4FyZWEuc2VtYnJhZGEnLA0KICAgICAgICAgICAgICAgICAgICAgICAgICdBcmVhX0Nvc2VjaGFkYScgPSAnw4FyZWEuY29zZWNoYWRhJywNCiAgICAgICAgICAgICAgICAgICAgICAgICAnUHJvZHVjY2lvbicgPSAnUHJvZHVjY2nDs24nLA0KICAgICAgICAgICAgICAgICAgICAgICAgICdFc3RhZG8nID0gJ0VzdGFkby5mw61zaWNvLmRlbC5jdWx0aXZvJywNCiAgICAgICAgICAgICAgICAgICAgICAgICAnQ2ljbG9fZGVsX2N1bHRpdm8nID0gJ0NpY2xvLmRlbC5jdWx0aXZvJywNCiAgICAgICAgICAgICAgICAgICAgICAgICAnQ29kX2N1bHRpdm8nID0gJ0PDs2RpZ28uZGVsLmN1bHRpdm8nLCktPiBuZXdfZXZhDQpuZXdfZXZhDQpgYGANCiMjIzUuIERhdGEgYW5hbHlzaXMgDQpNYW55IGRhdGEgYW5hbHlzaXMgdGFza3MgY2FuIGJlIGFwcHJvYWNoZWQgdXNpbmcgdGhlIHNwbGl0LWFwcGx5LWNvbWJpbmUgcGFyYWRpZ206IHNwbGl0IHRoZSBkYXRhIGludG8gZ3JvdXBzLCBhcHBseSBzb21lIGFuYWx5c2lzIHRvIGVhY2ggZ3JvdXAsIGFuZCB0aGVuIGNvbWJpbmUgdGhlIHJlc3VsdHMuDQoNClRoZSBkcGx5ciBsaWJyYXJ5IG1ha2VzIHRoaXMgdmVyeSBlYXN5IHRocm91Z2ggdGhlIHVzZSBvZiB0aGUgZ3JvdXBfYnkoKSBmdW5jdGlvbiwgd2hpY2ggc3BsaXRzIHRoZSBkYXRhIGludG8gZ3JvdXBzLiBXaGVuIHRoZSBkYXRhIGlzIGdyb3VwZWQgaW4gdGhpcyB3YXksIHN1bW1hcml6ZSgpIGNhbiBiZSB1c2VkIHRvIGNvbGxhcHNlIGVhY2ggZ3JvdXAgaW50byBhIHNpbmdsZS1yb3cgc3VtbWFyeS4gc3VtbWFyaXplKCkgZG9lcyB0aGlzIGJ5IGFwcGx5aW5nIGFuIGFnZ3JlZ2F0aW5nIG9yIHN1bW1hcnkgZnVuY3Rpb24gdG8gZWFjaCBncm91cC4NCg0KIyM1LjEgVGhlIG1vc3QgaW1wb3J0YW5jZSBjcm9wcyBiZXR3ZWVuIDIwMTkgYW5kIDIwMjMNCg0KYGBge3J9DQpuZXdfZXZhICU+JQ0KICAjI2ZpbHRlcihQcm9kdWNjaW9uID4gMCkgJT4lDQogIGdyb3VwX2J5KEdydXBvX2N1bHRpdm8pICU+JQ0KICBzdW1tYXJpemUodG90YWxfcHJvZHVjY2lvbiA9IHN1bShQcm9kdWNjaW9uKSkgJT4lIA0KICBhcnJhbmdlKGRlc2ModG90YWxfcHJvZHVjY2lvbikpDQpgYGANClRoaXMgdGFibGUgc2hvd3MgdGhlIHRvdGFsIGNyb3AgcHJvZHVjdGlvbiBpbiB0aGUgZGVwYXJ0bWVudCBvZiBDYXF1ZXTDoSBmcm9tIDIwMTkgdG8gMjAyMy4gVGhlIG1vc3QgcHJvZHVjdGl2ZSBjcm9wcyBpbiB0aGF0IHBlcmlvZCBvZiB0aW1lIGluIENhcXVldMOhIHdlcmUgImN1bHRpdm9zIHRyb3BpY2FsZXMgdHJhZGljb25hbGVzIiBhbmQgImZydXRhbGVzIg0KDQpUaGVuIHdlIG11c3Qgc2F2ZSB0aGlzIHRhYmxlIGFzIGZvbGxvd3MNCg0KYGBge3J9DQpuZXdfZXZhICU+JQ0KICBncm91cF9ieShHcnVwb19jdWx0aXZvKSAlPiUNCiAgc3VtbWFyaXplKHRvdGFsX3Byb2R1Y2Npb24gPSBzdW0oUHJvZHVjY2lvbikpIC0+IFBUDQpgYGANCg0KVGhlIG5leHQgc3RlcCBpcyAgZmlsdGVyIHRoZSBtb3N0IGltcG9ydGFudCBjcm9wcy4gSW4gdGhlIGRlcGFydG1lbnQgb2YgQ2FxdWV0w6EsIHRoZSB0d28gY3JvcHMgd2l0aCB0aGUgaGlnaGVzdCBwcm9kdWN0aW9uIHJhbmdlIGZyb20gOTAsMDAwLiBTbyB3ZSdsbCBmaWx0ZXIgZnJvbSB0aGF0IG51bWJlcg0KDQpgYGB7cn0NClBUICU+JSANCiAgZmlsdGVyKHRvdGFsX3Byb2R1Y2Npb24gPiA5MDAwMCkgLT4gbWFpbi5ncm91cHMNCmBgYA0KDQpgYGB7cn0NCih2YWx1ZSA9IHN1bShtYWluLmdyb3VwcyR0b3RhbF9wcm9kdWNjaW9uKSkNCmBgYA0KTm93IHdlJ2xsIGNyZWF0ZSBhIHBpZSBjaGFydCBmcm9tIHRoZSBtYWluIGNyb3BzDQoNCmBgYHtyfQ0KbWFpbi5ncm91cHMkcGVyY2VudCA9IG1haW4uZ3JvdXBzJHRvdGFsX3Byb2R1Y2Npb24vdmFsdWUNCmBgYA0KYGBge3J9DQpsaWJyYXJ5KGdncGxvdDIpDQojIEJhcnBsb3QNCmJwPC0gZ2dwbG90KG1haW4uZ3JvdXBzLCBhZXMoeD0iIiwgeT1wZXJjZW50LCBmaWxsPUdydXBvX2N1bHRpdm8pKSsNCmdlb21fYmFyKHdpZHRoID0gMSwgc3RhdCA9ICJpZGVudGl0eSIpDQojIFBpZWNoYXJ0DQpwaWUgPC0gYnAgKyBjb29yZF9wb2xhcigieSIsIHN0YXJ0PTApDQpgYGANCmBgYHtyfQ0KcGllDQpgYGANCiMjNS4yIE11bmljaXBhbGl0aWVzIHdpdGggaGlnaGVyIHByb2R1Y3Rpb24gZm9yIGV2ZXJ5IGdyb3VwIG9mIGNyb3BzDQoNCmBgYHtyfQ0KbmV3X2V2YSAlPiUNCiAgZ3JvdXBfYnkoR3J1cG9fY3VsdGl2bywgTXVuaWNpcGlvKSAlPiUNCiAgc3VtbWFyaXplKHRvdGFsX3Byb2QgPSBzdW0oUHJvZHVjY2lvbiwgbmEucm0gPSBUUlVFKSkgJT4lDQogIHNsaWNlKHdoaWNoLm1heCh0b3RhbF9wcm9kKSkgICU+JQ0KICBhcnJhbmdlKGRlc2ModG90YWxfcHJvZCkpDQpgYGANCg0KTm93LCB3ZSBhcmUgZ29pbmcgdG8gc2F2ZSB0aGUgb2JqZWN0IA0KDQpgYGB7cn0NCm5ld19ldmEgJT4lDQogIGdyb3VwX2J5KEdydXBvX2N1bHRpdm8sIE11bmljaXBpbykgJT4lDQogIHN1bW1hcml6ZSh0b3RhbF9wcm9kID0gc3VtKFByb2R1Y2Npb24sIG5hLnJtID0gVFJVRSkpICU+JQ0KICBzbGljZSh3aGljaC5tYXgodG90YWxfcHJvZCkpICAtPiBsZWFkZXJzDQpgYGANCmBgYHtyfQ0KbGVhZGVycw0KYGBgDQoNCk5vdywgd2UgYXJlIGdvaW5nIHRvIGZpbHRlciB0aGUgbW9zdCBpbXBvcnRhbnQgbXVuaWNpcGFsaXRpZXMgZnJvbSB0aGUgYWdyaWN1bHR1cmFsIHBvaW50IG9mIHZpZXcgYW5kIGxldOKAmXMgcGxvdCB0aGUgZmlsdGVyZWQgbGVhZGVycw0KDQpgYGB7cn0NCmxlYWRlcnMgJT4lIA0KICBmaWx0ZXIodG90YWxfcHJvZCA+IDUwMDAwKSAtPiBtYWluLmxlYWRlcnMNCmBgYA0KYGBge3J9DQojIEJhc2ljIGJhcnBsb3QNClRvcDwtZ2dwbG90KGRhdGE9bWFpbi5sZWFkZXJzLCBhZXMoeD1NdW5pY2lwaW8sIHk9dG90YWxfcHJvZCkpICsNCiAgZ2VvbV9iYXIoc3RhdD0iaWRlbnRpdHkiKQ0KVG9wDQpgYGANCiMjNS4zIER5bmFtaWNzIG9mIHRoZSBtdW5pY2lwYWxpdHkgd2l0aCB0aGUgaGlnaGVzdCBncm91cCBwcm9kdWN0aW9uIA0KDQpTYW4gVmljZW50ZSBkZWwgQ2FndcOhbiB3YXMgdGhlIG11bmljaXBhbGl0eSB3aGVyZSB0aGUgaGlnaGVzdCBjcm9wIHByb2R1Y3Rpb24gd2FzIHJlcG9ydGVkLCBzbyB3ZSB3aWxsIG1ha2UgYSB2aXN1YWxpemF0aW9uIHRvIGtub3cgaG93IHRoZSBjcm9wcyBiZWhhdmUgaW4gdGhpcyBtdW5pY2lwYWxpdHkNCg0KYGBge3J9DQpuZXcgPC0gc2VsZWN0KG5ld19ldmEsIE11bmljaXBpbywgQ3VsdGl2bywgWWVhciwgUHJvZHVjY2lvbiwgUmVuZGltaWVudG8pDQpuZXcNCmBgYA0KYGBge3J9DQpuZXdfU1ZDIDwtIGZpbHRlcihuZXcsIE11bmljaXBpbyA9PSAiU2FuIFZpY2VudGUgZGVsIENhZ3XDoW4iKQ0KbmV3X1NWQw0KYGBgDQpUaGlzIHRhYmxlIHNob3dzIHRoZSBwcm9kdWN0aW9uIG9mIGFsbCBjcm9wcyB5ZWFyIGFmdGVyIHllYXIgaW4gdGhlIG11bmljaXBhbGl0eSwgYnV0IG5vdyB3ZSB3aWxsIHNlZSB3aGF0IGhhcyBiZWVuIHRoZSBoaWdoZXN0IGNyb3AgcHJvZHVjdGlvbiBwZXIgeWVhcg0KDQpgYGB7cn0NCm5ld19TVkMgJT4lDQogIGdyb3VwX2J5KFllYXIsIEN1bHRpdm8pICU+JQ0KICBzdW1tYXJpemUoUHJvZHVjY2lvbiA9IG1heChQcm9kdWNjaW9uLCBuYS5ybSA9IFRSVUUpKSAlPiUNCiAgc2xpY2Uod2hpY2gubWF4KFByb2R1Y2Npb24pKSAtPiBIQw0KSEMNCmBgYA0KYGBge3J9DQojIHdlIHVzZSB0aGUgZ2dwbG90IDIgbGlicmFyeQ0KZyA8LSBnZ3Bsb3QoYWVzKHg9WWVhciwgeT1Qcm9kdWNjaW9uLzEwMDApLCBkYXRhID0gSEMpICsgZ2VvbV9iYXIoc3RhdD0naWRlbnRpdHknKSArIGxhYnMoeT0nUHJvZHVjY2lvbiBkZSBDYcOxYSBbVG9uIHggMTAwMF0nKQ0KZyArIGdndGl0bGUoIkV2b2x1dGlvbiBvZiBDYW5lIENyb3AgUHJvZHVjdGlvbiBpbiBTYW4gVmljZW50ZSBkZWwgQ2FndcOhbiBmcm9tIDIwMTkgdG8gMjAyMyIpICsgbGFicyhjYXB0aW9uPSAiQmFzZWQgb24gRVZBIGRhdGEgKE1pbmFncmljdWx0dXJhLCAyMDI0KSIpDQpgYGANCg0KVGhlIGNyb3AgdGhhdCBoYXMgYmVlbiBtb3JlIHByb2R1Y2VkIGluIHRoZSBwZXJpb2Qgb2YgeWVhcnMgZnJvbSAyMDE5IHRvIDIwMjMgaGFzIGJlZW4gdGhlIGNyb3Agb2YgY2FuZSwgd2l0aCBhIHNpbWlsYXIgcHJvZHVjdGlvbiBpbiBhbGwgeWVhcnMuDQoNCiMjNS40IER5bmFtaWNzIG9mIG9uZSBpbXBvcnRhbnQgY3JvcCBiZXR3ZWVuIDIwMTkgYW5kIDIwMjMNCg0KTGV0J3MgYW5hbHl6ZSB0aGUgaGlnaGVzdCBjcm9wIHByb2R1Y3Rpb24gYnkgbXVuaWNpcGFsaXR5IGluIGFueSB5ZWFyDQoNCmBgYHtyfQ0KbmV3X2V2YSAlPiUgDQogIGdyb3VwX2J5KEdydXBvX2N1bHRpdm8sIE11bmljaXBpbywgWWVhcikgJT4lDQogIHN1bW1hcml6ZShQcm9kdWNjaW9uID0gbWF4KFByb2R1Y2Npb24sIG5hLnJtID0gVFJVRSkpICU+JQ0KICAgIHNsaWNlKHdoaWNoLm1heChQcm9kdWNjaW9uKSkgJT4lDQogICAgYXJyYW5nZShkZXNjKFByb2R1Y2Npb24pKSAtPiBNYXhfY3JvcA0KDQpNYXhfY3JvcA0KYGBgDQoNCkluIHRoZSBtdW5pY2lwYWxpdHkgb2YgU2FuIEpvc2UgZGVsIEZyYWd1YSwgdGhlIGhpZ2hlc3QgcHJvZHVjdGlvbiBvZiB0cmFkaXRpb25hbCB0cm9waWNhbCBjcm9wcyB3YXMgcmVwb3J0ZWQsIGF0IGxlYXN0IGluIDIwMjMuIFdlIHdpbGwgY29udGludWUgdG8gZXhwbG9yZSB0aGUgcHJvZHVjdGlvbiBvZiB0aGlzIG11bmljaXBhbGl0eSBpbiB0aGUgY3JvcCBncm91cCB3aXRoIHRoZSBoaWdoZXN0IGRlbWFuZCBhbW9uZyB0cmFkaXRpb25hbCB0cm9waWNhbCBjcm9wcw0KDQpgYGB7cn0NCm5ld19ldmEgJT4lIA0KICBmaWx0ZXIoTXVuaWNpcGlvPT0iU2FuIEpvc8OpIGRlbCBGcmFndWEiICYgQ3VsdGl2bz09IkNhw7FhIikgJT4lIA0KICBncm91cF9ieShZZWFyLCBDdWx0aXZvKSAlPiUNCiAgc2VsZWN0KE11bmljaXBpbywgQ3VsdGl2bywgUHJvZHVjY2lvbiwgWWVhcikgLT4gU0pGX0MNCg0KU0pGX0MNCmBgYA0KYGBge3J9DQojIHdlIHVzZSB0aGUgZ2dwbG90IDIgbGlicmFyeQ0KZyA8LSBnZ3Bsb3QoYWVzKHg9WWVhciwgeT1Qcm9kdWNjaW9uLzEwMDApLCBkYXRhID0gU0pGX0MpICsgZ2VvbV9iYXIoc3RhdD0naWRlbnRpdHknKSArIGxhYnMoeT0nUHJvZHVjY2lvbiBkZSBDYcOxYSBbVG9uIHggMTAwMF0nKQ0KZyArIGdndGl0bGUoIkV2b2x1dGlvbiBvZiBDYW5lIENyb3AgUHJvZHVjdGlvbiBpbiBTYW4gSm9zw6kgZGVsIEZyYWd1YSBmcm9tIDIwMTkgdG8gMjAyMyIpICsgbGFicyhjYXB0aW9uPSAiQmFzZWQgb24gRVZBIGRhdGEgKE1pbmFncmljdWx0dXJhLCAyMDI0KSIpDQpgYGANCg0KSnVzdCBsaWtlIGluIFNhbiBWaWNlbnRlLCBpbiBTYW4gSm9zw6kgZGVsIEZyYWd1YSB0aGUgY3JvcCB3aXRoIHRoZSBoaWdoZXN0IHByb2R1Y3Rpb24gd2FzIHRoZSBjYW5lIG9yIHN1Z2FyY2FuZSwgYnV0IGluIHRoaXMgbXVuaWNpcGFsaXR5IHRoZXJlIHdhcyBhIGxvdyBwcm9kdWN0aW9uIGluIDIwMjIgYW5kIDIwMjEuDQoNCiMjIzYuIEFuYWx5c2lzIG9mIGFncmljdWx0dXJhbCBkeW5hbWljcw0KDQpUaGUgZGVwYXJ0bWVudCBvZiBDYXF1ZXTDoSBoYXMgYW4gYWdyaWN1bHR1cmFsIGZyb250aWVyIGFyZWEgb2YgMSw3MzUsNDYxIGhhLCB3aGljaCBjb3JyZXNwb25kcyB0byAxOSUgb2YgaXRzIHRlcnJpdG9yeSwgYW5kIGl0cyBuYXR1cmFsIGZvcmVzdHMgYW5kIGFncmljdWx0dXJhbCBhcmVhcyBvY2N1cHkgMjMuNSUgb2YgaXRzIHRlcnJpdG9yeSAoMiwxMTUsMTU5IGhhKSwgd2l0aCBTYW4gVmljZW50ZSBkZWwgQ2FndcOhbiBiZWluZyB0aGUgbXVuaWNpcGFsaXR5IHdpdGggdGhlIGxhcmdlc3QgYWdyaWN1bHR1cmFsIGZyb250aWVyIGFyZWEgKEZBIGFyZWE6IDMyNCw1ODUgaGEg4oCTIDE5JSkuICB0aGVyZWZvcmUsIGFzIHdlIHNhdyBpbiB0aGUgcHJldmlvdXMgZGF0YSB2aXN1YWxpemF0aW9uLCB0aGUgbXVuaWNpcGFsaXR5IG9mIFNhbiBWaWNlbnRlIGRlbCBDYWd1w6FuIHJlcHJlc2VudHMgdGhlIGxhcmdlc3QgYWdyaWN1bHR1cmFsIHByb2R1Y3Rpb24gYXQgYSBnZW5lcmFsIGxldmVsIGluIHRoZSBkZXBhcnRtZW50LiBIb3dldmVyLCBhIGZhY3QgdGhhdCBpcyB3b3J0aCBoaWdobGlnaHRpbmcgaXMgdGhhdCB0aGlzIG11bmljaXBhbGl0eSwgZGVzcGl0ZSBiZWluZyB0aGUgbGFyZ2VzdCBhZ3JpY3VsdHVyYWwgcHJvZHVjZXIgaW4gdGhlIGRlcGFydG1lbnQsIGhhcyBsaXZlc3RvY2sgYXMgaXRzIG1haW4gZWNvbm9taWMgYWN0aXZpdHkuIA0KDQpUaGlzIGRlcGFydG1lbnQgaGFzIGEgaGlnaCBhcHRpdHVkZSBmb3IgdHJhZGl0aW9uYWwgdHJvcGljYWwgY3JvcHMgYW5kIGZydWl0IHRyZWVzLCB3aXRoIHN1Z2FyY2FuZSwgY2Fzc2F2YSwgY29ybiwgYmFuYW5hIGFuZCBwaW5lYXBwbGUgYmVpbmcgdGhlIG1haW4gY3JvcHMgb2YgdGhpcyByZWdpb24gYW5kICB0aGUgcHJpbmNpcGFsIGFncmljdWx0dXJhbCBlY29ub215IG9mIHRoZSBkZXBhcnRtZW50Lg0KDQpJbiB0aGUgcGFuZGVtaWMgc2Vhc29uICgyMDIwLTIwMjIpIHRoZXJlIHdhcyBhIGRlY3JlYXNlIGluIGFncmljdWx0dXJhbCBwcm9kdWN0aW9uLCB2aXN1YWxpemVkIGluIHRoZSBkYXRhIHNwZWNpZmljYWxseSBmb3Igc3VnYXJjYW5lIGN1bHRpdmF0aW9uIGluIHRoZSBkZXBhcnRtZW50IG9mIFNhbiBKb3PDqSBkZWwgRnJhZ3VhLCBob3dldmVyLCBpbiAyMDIzIGFsbCBwcm9kdWN0aW9uIHdhcyBlZmZpY2llbnRseSByZWNvdmVyZWQsIHdoaWNoIGluZGljYXRlcyB0aGF0IHRoaXMgZGVwYXJ0bWVudCBoYXMgdmVyeSBnb29kIHJlc2lzdGFuY2UgYW5kIGFkYXB0YWJpbGl0eS4NCg0KVGhlIGRlcGFydG1lbnQgb2YgQ2FxdWV0w6EgaGFzIGEgaGlnaCBhZ3JpY3VsdHVyYWwgcG90ZW50aWFsLCB3aGljaCBoZWxwcyB0byBkcmF3IGEgaG9wZWZ1bCBwYW5vcmFtYSBpbiB0aGUgZmFjZSBvZiBzb2lsIHJlY292ZXJ5LCBmb29kIHNvdmVyZWlnbnR5IGFuZCBldmVuIHRoZSBlY29ub21pYyByZWNvdmVyeSBvZiB0aGUgY291bnRyeSwgaG93ZXZlciwgdGhlIGN1cnJlbnQgc2l0dWF0aW9uIGluIHdoaWNoIHRoaXMgZGVwYXJ0bWVudCBmaW5kcyBpdHNlbGYgaW4gdGVybXMgb2YgbGFuZCB1c2UgYW5kIGludGVybmFsIGNvbmZsaWN0IGxlYXZlcyB1cyB3aXRoIHRoZSB1bmtub3duIG9mIHdoYXQgd2UgYXJlIHJlYWxseSB0YWtpbmcgYWR2YW50YWdlIG9mIG9yIG5vdCB1c2luZyB0aGUgY291bnRyeSdzIHNvaWxzLiAgZ2VuZXJhdGluZyBhbiBpbnZpdGF0aW9uIHRvIHJlZGlyZWN0IGF0dGVudGlvbiB0byB0aGlzIHR5cGUgb2YgZGVwYXJ0bWVudHMgdGhhdCBoYXZlIGJlZW4gZm9yZ290dGVuIHBvbGl0aWNhbGx5LCBidXQgdGhhdCBoYXZlIHN1ZmZpY2llbnQgYWdyaWN1bHR1cmFsIHBvdGVudGlhbCB0byBwcm9tb3RlIGFuZCBzdHJlbmd0aGVuIHRoaXMgc2VjdG9yIGFuZCBjb250cmlidXRlIHRvIHRoZSBkZXZlbG9wbWVudCBvZiB0aGUgY291bnRyeS4gDQoNCiMjIzYuIEFuYWx5c2lzIG9mIGFncmljdWx0dXJhbCBkeW5hbWljcyAoU3BhbmlzaCkNCg0KRWwgZGVwYXJ0YW1lbnRvIGRlbCBDYXF1ZXTDoSBjdWVudGEgY29uIHVuIMOhcmVhIGRlIGZyb250ZXJhIGFncsOtY29sYSBkZSAxLjczNS40NjEgaGEgbG8gcXVlIGNvcnJlc3BvbmRlIGFsIDE5JSBkZSBzdSB0ZXJyaXRvcmlvLCB5IGVuIHN1cyBib3NxdWVzIG5hdHVyYWxlcyB5IMOhcmVhcyBhZ3JvcGVjdWFyaWFzIG9jdXBhbiBlbCAyMy41JSBkZSBzdSB0ZXJyaXRvcmlvICgyLjExNS4xNTkgaGEpLCBzaWVuZG8gU2FuIFZpY2VudGUgZGVsIENhZ3XDoW4gZWwgbXVuaWNpcGlvIGNvbiBtYXlvciDDoXJlYSBkZSBmcm9udGVyYSBhZ3LDrWNvbGEgKMOBcmVhIGRlIEZBOiAzMjQuNTg1IGhhIOKAkyAxOSUpLCBwb3IgbG8gY3VhbCwgY29tbyB5YSB2aW1vcyBlbiBsYSB2aXN1YWxpemFjacOzbiBkZSBkYXRvcyBwcmV2aWEsIGVsIG11bmljaXBpbyBkZSBTYW4gVmljZW50ZSBkZWwgQ2FndcOhbiByZXByZXNlbnRhIGxhIG1heW9yIHByb2R1Y2Npw7NuIGFncsOtY29sYSBhIG5pdmVsIGdlbmVyYWwgZW4gZWwgZGVwYXJ0YW1lbnRvLiBTaW4gZW1iYXJnbywgdW4gZGF0byBxdWUgdmFsZSBsYSBwZW5hIHJlc2FsdGFyIGVzIHF1ZSBlc3RlIG11bmljaXBpbyBhIHBlc2FyIGRlIHNlciBlbCBtYXlvciBwcm9kdWN0b3IgYWdyw61jb2xhIGRlbCBkZXBhcnRhbWVudG8gdGllbmUgY29tbyBwcmluY2lwYWwgYWN0aXZpZGFkIGVjb27Ds21pY2EgbGEgZ2FuYWRlcsOtYS4gDQoNCkVzdGUgZGVwYXJ0YW1lbnRvIHByZXNlbnRhIHVuYSBhcHRpdHVkIGFsdGEgZnJlbnRlIGEgbG9zIGN1bHRpdm9zIHRyb3BpY2FsZXMgdHJhZGljaW9uYWxlcyB5IGZydXRhbGVzLCBzaWVuZG8gbGEgY2HDsWEsIGxhIHl1Y2EsIGVsIG1hw616LCBlbCBwbMOhdGFubyB5IGxhIHBpw7FhIGxvcyBjdWx0aXZvcyBwcmluY2lwYWxlcyBkZSBlc3RhIHJlZ2nDs24geSBiYWpvIGxvcyBjdWFsZXMgc2UgbXVldmUgbGEgZWNvbm9tw61hIGFncsOtY29sYSBkZWwgZGVwYXJ0YW1lbnRvLiANCg0KRW4gbGEgdGVtcG9yYWRhIGRlIHBhbmRlbWlhICgyMDIwLTIwMjIpIHNlIHByZXNlbnTDsyB1bmEgZGlzbWludWNpw7NuIGRlIHByb2R1Y2Npw7NuIGFncsOtY29sYSwgdmlzdWFsaXphZGEgZW4gbG9zIGRhdG9zIGVzcGVjw61maWNhbWVudGUgZGVsIGN1bHRpdm8gZGUgY2HDsWEgZW4gZWwgZGVwYXJ0YW1lbnRvIGRlIFNhbiBKb3PDqSBkZWwgRnJhZ3VhLCBzaW4gZW1iYXJnbywgZW4gZWwgMjAyMyBzZSByZWN1cGVyw7MgZWZpY2llbnRlbWVudGUgdG9kYSBsYSBwcm9kdWNjacOzbiwgbG8gY3VhbCBpbmRpY2EgcXVlIGVuIGVzdGUgZGVwYXJ0YW1lbnRvIHNlIHByZXNlbnRhIG11eSBidWVuYSByZXNpc3RlbmNpYSB5IGFkYXB0YWJpbGlkYWQuIA0KDQpFbCBkZXBhcnRhbWVudG8gZGVsIENhcXVldMOhIHRpZW5lIHVuIGFsdG8gcG90ZW5jaWFsIGFncsOtY29sYSwgZWwgY3VhbCBheXVkYSBhIGRpYnVqYXIgdW4gcGFub3JhbWEgZXNwZXJhbnphZG9yIGZyZW50ZSBhIGxhIHJlY3VwZXJhY2nDs24gZGUgc3VlbG9zLCBsYSBzb2JlcmFuw61hIGFsaW1lbnRhcmlhIGUgaW5jbHVzbyBsYSByZWN1cGVyYWNpw7NuIGVjb27Ds21pY2EgZGVsIHBhw61zLCBzaW4gZW1iYXJnbywgbGEgc2l0dWFjacOzbiBhY3R1YWwgZW4gbGEgcXVlIHNlIGVuY3VlbnRyYSBlc3RlIGRlcGFydGFtZW50byBlbiBjdWVzdGnDs24gZGUgdXNvIGRlIHN1ZWxvcyB5IGNvbmZsaWN0byBpbnRlcm5vIG5vcyBkZWphIGxhIGluY8OzZ25pdGEgZGUgZW4gcXXDqSBlc3RhbW9zIGFwcm92ZWNoYW5kbyBvIGRlc2Fwcm92ZWNoYW5kbyBsb3Mgc3VlbG9zIGRlbCBwYcOtcyByZWFsbWVudGUsIGdlbmVyYW5kbyB1bmEgaW52aXRhY2nDs24gcGFyYSByZWRpcmVjY2lvbmFyIGxhIGF0ZW5jacOzbiBhIGVzdGUgdGlwbyBkZSBkZXBhcnRhbWVudG9zIHF1ZSBoYW4gc2lkbyBvbHZpZGFkb3MgcG9sw610aWNhbWVudGUsIHBlcm8gcXVlIGN1ZW50YW4gY29uIGVsIHBvdGVuY2lhbCBhZ3LDrWNvbGEgc3VmaWNpZW50ZSBwYXJhIGltcHVsc2FyIHkgZm9ydGFsZWNlciBlc3RlIHNlY3RvciBjb250cmlidXllbmRvIGFzw60gYWwgZGVzYXJyb2xsbyBkZWwgcGHDrXMuIA0KDQojIyM3LiBCaWJsaW9ncmFwaHkNCi0gRXZhbHVhY2lvbmVzIGFncm9wZWN1YXJpYXMgbXVuaWNpcGFsZXMg4oCTIEVWQS4gQ2FsZW5kYXJpbyBEZXBhcnRhbWVudGFsIGRlIFNpZW1icmFzIHkgQ29zZWNoYXMgfCBEYXRvcyBBYmllcnRvcyBDb2xvbWJpYS4gKDIwMjMsIDcgbm92aWVtYnJlKS4gaHR0cHM6Ly93d3cuZGF0b3MuZ292LmNvL0FncmljdWx0dXJhLXktRGVzYXJyb2xsby1SdXJhbC9FdmFsdWFjaW9uZXMtQWdyb3BlY3Vhcmlhcy1NdW5pY2lwYWxlcy1FVkEtQ2FsZW5kYS9tNmJiLWsyaDQvYWJvdXRfZGF0YQ0KLSBMaXphcmF6bywgSS4sIDIwMjIuIFVuZGVyc3RhbmRpbmcgZHluYW1pYyBwcm9kdWN0aXZpdHkgb2YgY3JvcHMuIEF2YWlsYWJsZSBhdCBodHRwczovL3JwdWJzLmNvbS9pYWxzMnVuL3Byb2R1Y3Rpb25fZHluX3YxLg0KLSBVUFJBLigyMDIzKS5DYXF1ZXTDoSwgbWljcm/DoW5hbGlzaXMgZXZhbHVhY2lvbmVzIGFncm9wZWN1YXJpYXMtRVZBIFtQREYgZmlsZV1odHRwczovL3VwcmEuZ292LmNvL0tpdF9UZXJyaXRvcmlhbC8yLSUyMEluZm9ybWFjaSVDMyVCM24lMjBwb3IlMjBEZXBhcnRhbWVudG9zL0NBUVVFVCVDMyU4MS8zLSUyME1pY3JvYW4lQzMlQTFsaXNpcyUyMEV2YWx1YWNpb25lcyUyMGFncm9wZWN1YXJpYXMlMjAyMDIzLUNhcXVldGEucGRmDQotIFVQUkEuKDIwMjMpLlJlc3VsdGFkb3MgZXZhbHVhY2lvbmVzIGFncm9wZWN1YXJpYXMgMjAyMy5bUERGIGZpbGVdLmh0dHBzOi8vdXByYS5nb3YuY28vZXMtY28vRXZhc19Eb2N1bWVudG9zL1Jlc3VsdGFkb3MlMjBFdmFsdWFjaW9uZXMlMjBBZ3JvcGVjdWFyaWFzJTIwMjAyMy5wZGYNCg==