library(tidyverse)
-- Attaching packages --------------------------------------- tidyverse 1.3.0 --
v ggplot2 3.3.0     v purrr   0.3.3
v tibble  2.1.3     v dplyr   0.8.4
v tidyr   1.0.2     v stringr 1.4.0
v readr   1.3.1     v forcats 0.5.0
-- Conflicts ------------------------------------------ tidyverse_conflicts() --
x dplyr::filter() masks stats::filter()
x dplyr::lag()    masks stats::lag()
library(sf)
Linking to GEOS 3.6.1, GDAL 2.2.3, PROJ 4.9.3

lo primero a realizar es abrir el archivo shape file que nos servira como base de datos geograficos, para ello usamos la funcion read_sf y almacenar estos datos en una variable

deptos<-read_sf("./santander/COL_adm/COL_adm1.shp")
head(deptos)
Simple feature collection with 6 features and 9 fields
geometry type:  MULTIPOLYGON
dimension:      XY
bbox:           xmin: -77.149 ymin: -4.228429 xmax: -69.36835 ymax: 11.10792
epsg (SRID):    4326
proj4string:    +proj=longlat +datum=WGS84 +no_defs

##luego usamos la funcion ggplot para graficar los datos almacenados en la variable deptos

ggplot()+geom_sf(data=deptos)

esta linea muestra el resultado del ploteo con el nuevo sistema de coordenadas, el cual es usado en Canada


ggplot() + geom_sf(data = deptos) + coord_sf(crs=st_crs(3978))

esta linea muestra un cambio de sistema de coordenadas de la variable deptos, ya que ahora se trabajara con el sistema UTM 18N

deptos.UTM<-st_transform(deptos,crs=st_crs(32618))
deptos.UTM
Simple feature collection with 32 features and 9 fields
geometry type:  MULTIPOLYGON
dimension:      XY
bbox:           xmin: -245935.3 ymin: -469204.3 xmax: 1407491 ymax: 1763314
epsg (SRID):    32618
proj4string:    +proj=utm +zone=18 +datum=WGS84 +units=m +no_defs

esta linea muestra un grafico de Colombia bajo estas nuevas coordenadas

ggplot() + geom_sf(data = deptos.UTM)

aqui se realiza un ploteo del departamento a estudiar, en este caso Santander

Santander <-  deptos %>%   filter(NAME_1 == "Santander")
ggplot()+geom_sf(data=Santander)

estas lineas muestran como obtener no solo el grafico dela region del departamento, sino que nos muestra la division administativa del mismo

municipios <-  read_sf("./santander/COL_adm/COL_adm2.shp")
mun_santander <- municipios %>% filter(NAME_1 == "Santander")
ggplot() + geom_sf(data = mun_santander) 

##aqui vemos los datos almacenados en esta variable

mun_santander
Simple feature collection with 87 features and 11 fields
geometry type:  MULTIPOLYGON
dimension:      XY
bbox:           xmin: -74.55179 ymin: 5.705701 xmax: -72.5161 ymax: 8.120555
epsg (SRID):    4326
proj4string:    +proj=longlat +datum=WGS84 +no_defs

Esta instruccion es previa para un nuevo ploteo, en la cual se le dira donde debe colocar los textos aqui asignados

puntos_santander <- cbind(mun_santander, st_coordinates(st_centroid(mun_santander$geometry)))

Etsta instruccion nos muestra un ploteo del departamento y sus municipios, solo que esta vez los municipios llevan el numero identificador de la base de datos ubicado segun la linea anterior

ggplot(Santander) +
    geom_sf() +
    geom_sf(data = puntos_santander, fill = "antiquewhite") + 
    geom_text(data = puntos_santander, aes(x=X, y=Y,label = ID_2), size = 2) +
    coord_sf(xlim = c(-74.7, -72.4), ylim = c(5.6, 8.15), expand = FALSE)+labs(title="Santander")

##esta nueva libreria, servira para darle color al mapa en base a una escala especifica

library(scales)

##este ploteo nos muestra una variante donde los diferentes municipios estan identificados con su codigo y pintados de colores en base a una escala determinada

ggplot(Santander) + 
  geom_sf(data=puntos_santander, aes(x=X, y=Y, fill =                           ID_2), color = "black", size = 0.3) +
  geom_text(data = puntos_santander, aes(x=X, y=Y,label = ID_2), size = 2) +
  theme(aspect.ratio=1)+
  scale_fill_distiller(name="ID_2", palette = "YlGn", breaks = pretty_breaks(n = 10))+
  labs(title="otro estilo de mapa para Santander")
Ignoring unknown aesthetics: x, y

con esto se guarda el mapa antes realizado en formato pdf y png

ggsave("Santander_municipios.pdf")
ggsave("map_santander.png", width = 6, height = 6, dpi = "screen")

esta libreria sera util para realizar un nuevo mapa

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

para usar esta libreria es necesario que los datos sean de tipo espacial, para ello usamos esta linea

ant_points <- as(puntos_santander, 'Spatial')

con esto veremos que hay almacenado en esta variable

head(ant_points)

esta libreria sera util para conocer algunos valores de cada dato

install.packages("lwgeom")
library(lwgeom)

con esto podemos hallar el area de cada uno de los datos

mun_santander$area <- st_area(mun_santander)
mun_santander$km2 <- mun_santander$area/(1000000)
mun_santander$km2

para realizar el mapa, es necesario que la variable mun_santander sea de tipo espacial, para ello, usamos esta instruccion

sant_municipios <- as(mun_santander, 'Spatial')
head(sant_municipios)

esta instruccion es util para el proximo ploteo, servira para establecer la escala de colores

bins <- c(0, 50, 100, 200, 300, 500, 1000, 2000, Inf)
pal <- colorBin("YlOrRd", domain = ant_municipios$km2, bins = bins)


labels <- mun_santander$NAME_2

labels
 [1] "Aguada"                 "Albania"               
 [3] "Aratoca"                "Barbosa"               
 [5] "Barichara"              "Barrancabermeja"       
 [7] "Betulia"                "Bolívar"               
 [9] "Bucaramanga"            "Cabrera"               
[11] "California"             "Capitanejo"            
[13] "Carcasí"                "Cepitá"                
[15] "Cerrito"                "Charalá"               
[17] "Charta"                 "Chimá"                 
[19] "Chipatá"                "Cimitarra"             
[21] "Concepción"             "Confines"              
[23] "Contratación"           "Coromoro"              
[25] "Curití"                 "El Carmen de Chucurí"  
[27] "El Guacamayo"           "El Peñon"              
[29] "El Playón"              "Encino"                
[31] "Enciso"                 "Florián"               
[33] "Floridablanca"          "Gámbita"               
[35] "Güepsa"                 "Galán"                 
[37] "Girón"                  "Guaca"                 
[39] "Guadalupe"              "Guapotá"               
[41] "Guavatá"                "Hato"                  
[43] "Jesús María"            "Jordán"                
[45] "La Belleza"             "La Paz"                
[47] "Landázuri"              "Lebrija"               
[49] "Los Santos"             "Málaga"                
[51] "Macaravita"             "Matanza"               
[53] "Mogotes"                "Molagavita"            
[55] "Ocamonte"               "Oiba"                  
[57] "Onzaga"                 "Páramo"                
[59] "Palmar"                 "Palmas del Socorro"    
[61] "Piedecuesta"            "Pinchote"              
[63] "Puente Nacional"        "Puerto Parra"          
[65] "Puerto Wilches"         "Rionegro"              
[67] "Sabana de Torres"       "San Andrés de Cuerquia"
[69] "San Benito"             "San Gil"               
[71] "San Joaquín"            "San José de Miranda"   
[73] "San Miguel"             "San Vicente de Chucurí"
[75] "Santa Bárbara"          "Santa Helena del Opón" 
[77] "Simacota"               "Socorro"               
[79] "Suaita"                 "Sucre"                 
[81] "Suratá"                 "Tona"                  
[83] "Vélez"                  "Valle de San José"     
[85] "Vetas"                  "Villanueva"            
[87] "Zapatoca"              

este ploteo muestra otra forma de ver el departamento

m <- leaflet(sant_municipios) %>%
  setView(-73.5, 6.5, 7.45)  %>% addPolygons(
  fillColor = ~pal(km2),
  weight = 2,
  opacity = 1,
  color = "white",
  dashArray = "3",
  fillOpacity = 0.7,
  highlight = highlightOptions(
    weight = 5,
    color = "#555",
    dashArray = "",
    fillOpacity = 0.7,
    bringToFront = TRUE),
  label = labels) %>%
  addLegend(pal = pal, values = ~km2, opacity = 0.7, title = NULL,
    position = "bottomright")
m

estas ultimas lineas de codigo muestran las lineas administrativas del mapa sobre una proyeccion del continente, esto para ubicar la zona de trabajo

a<-leaflet() %>%
  addProviderTiles(providers$Esri.WorldImagery, options= providerTileOptions(opacity = 0.99)) %>%
  addPolygons(data = sant_municipios, popup= sant_municipios$NAME_2,
    stroke = TRUE, fillOpacity = 0.1, smoothFactor = 0.25)
    a
LS0tDQp0aXRsZTogIlNhbnRhbmRlciINCm91dHB1dDogaHRtbF9ub3RlYm9vaw0KLS0tDQpgYGB7cn0NCmxpYnJhcnkodGlkeXZlcnNlKQ0KbGlicmFyeShzZikNCmBgYA0KIyMgbG8gcHJpbWVybyBhIHJlYWxpemFyIGVzIGFicmlyIGVsIGFyY2hpdm8gc2hhcGUgZmlsZSBxdWUgbm9zIHNlcnZpcmEgY29tbyBiYXNlIGRlIGRhdG9zIGdlb2dyYWZpY29zLCBwYXJhIGVsbG8gdXNhbW9zIGxhIGZ1bmNpb24gcmVhZF9zZiB5IGFsbWFjZW5hciBlc3RvcyBkYXRvcyBlbiB1bmEgdmFyaWFibGUNCmBgYHtyfQ0KZGVwdG9zPC1yZWFkX3NmKCIuL3NhbnRhbmRlci9DT0xfYWRtL0NPTF9hZG0xLnNocCIpDQpoZWFkKGRlcHRvcykNCmBgYA0KIyNsdWVnbyB1c2Ftb3MgbGEgZnVuY2lvbiBnZ3Bsb3QgcGFyYSBncmFmaWNhciBsb3MgZGF0b3MgYWxtYWNlbmFkb3MgZW4gbGEgdmFyaWFibGUgZGVwdG9zIA0KYGBge3J9DQpnZ3Bsb3QoKStnZW9tX3NmKGRhdGE9ZGVwdG9zKQ0KYGBgDQojIyBlc3RhIGxpbmVhIG11ZXN0cmEgZWwgcmVzdWx0YWRvIGRlbCBwbG90ZW8gY29uIGVsIG51ZXZvIHNpc3RlbWEgZGUgY29vcmRlbmFkYXMsIGVsIGN1YWwgZXMgdXNhZG8gZW4gQ2FuYWRhDQpgYGB7cn0NCg0KZ2dwbG90KCkgKyBnZW9tX3NmKGRhdGEgPSBkZXB0b3MpICsgY29vcmRfc2YoY3JzPXN0X2NycygzOTc4KSkNCmBgYA0KIyMgZXN0YSBsaW5lYSBtdWVzdHJhIHVuIGNhbWJpbyBkZSBzaXN0ZW1hIGRlIGNvb3JkZW5hZGFzIGRlIGxhIHZhcmlhYmxlIGRlcHRvcywgeWEgcXVlIGFob3JhIHNlIHRyYWJhamFyYSBjb24gZWwgc2lzdGVtYSBVVE0gMThODQpgYGB7cn0NCmRlcHRvcy5VVE08LXN0X3RyYW5zZm9ybShkZXB0b3MsY3JzPXN0X2NycygzMjYxOCkpDQpkZXB0b3MuVVRNDQpgYGANCiMjIGVzdGEgbGluZWEgbXVlc3RyYSB1biBncmFmaWNvIGRlIENvbG9tYmlhIGJham8gZXN0YXMgbnVldmFzIGNvb3JkZW5hZGFzDQpgYGB7cn0NCmdncGxvdCgpICsgZ2VvbV9zZihkYXRhID0gZGVwdG9zLlVUTSkNCmBgYA0KIyMgYXF1aSBzZSByZWFsaXphIHVuIHBsb3RlbyBkZWwgZGVwYXJ0YW1lbnRvIGEgZXN0dWRpYXIsIGVuIGVzdGUgY2FzbyBTYW50YW5kZXINCmBgYHtyfQ0KU2FudGFuZGVyIDwtICBkZXB0b3MgJT4lICAgZmlsdGVyKE5BTUVfMSA9PSAiU2FudGFuZGVyIikNCmdncGxvdCgpK2dlb21fc2YoZGF0YT1TYW50YW5kZXIpDQpgYGANCiMjIGVzdGFzIGxpbmVhcyBtdWVzdHJhbiBjb21vIG9idGVuZXIgbm8gc29sbyBlbCBncmFmaWNvIGRlbGEgcmVnaW9uIGRlbCBkZXBhcnRhbWVudG8sIHNpbm8gcXVlIG5vcyBtdWVzdHJhIGxhIGRpdmlzaW9uIGFkbWluaXN0YXRpdmEgZGVsIG1pc21vDQpgYGB7cn0NCm11bmljaXBpb3MgPC0gIHJlYWRfc2YoIi4vc2FudGFuZGVyL0NPTF9hZG0vQ09MX2FkbTIuc2hwIikNCm11bl9zYW50YW5kZXIgPC0gbXVuaWNpcGlvcyAlPiUgZmlsdGVyKE5BTUVfMSA9PSAiU2FudGFuZGVyIikNCmdncGxvdCgpICsgZ2VvbV9zZihkYXRhID0gbXVuX3NhbnRhbmRlcikgDQpgYGANCiMjYXF1aSB2ZW1vcyBsb3MgZGF0b3MgYWxtYWNlbmFkb3MgZW4gZXN0YSB2YXJpYWJsZQ0KYGBge3J9DQptdW5fc2FudGFuZGVyDQpgYGANCiMjIEVzdGEgaW5zdHJ1Y2Npb24gZXMgcHJldmlhIHBhcmEgdW4gbnVldm8gcGxvdGVvLCBlbiBsYSBjdWFsIHNlIGxlIGRpcmEgZG9uZGUgZGViZSBjb2xvY2FyIGxvcyB0ZXh0b3MgYXF1aSBhc2lnbmFkb3MNCmBgYHtyfQ0KcHVudG9zX3NhbnRhbmRlciA8LSBjYmluZChtdW5fc2FudGFuZGVyLCBzdF9jb29yZGluYXRlcyhzdF9jZW50cm9pZChtdW5fc2FudGFuZGVyJGdlb21ldHJ5KSkpDQpgYGANCiMjIEV0c3RhIGluc3RydWNjaW9uIG5vcyBtdWVzdHJhIHVuIHBsb3RlbyBkZWwgZGVwYXJ0YW1lbnRvIHkgc3VzIG11bmljaXBpb3MsIHNvbG8gcXVlIGVzdGEgdmV6IGxvcyBtdW5pY2lwaW9zIGxsZXZhbiBlbCBudW1lcm8gaWRlbnRpZmljYWRvciBkZSBsYSBiYXNlIGRlIGRhdG9zIHViaWNhZG8gc2VndW4gbGEgbGluZWEgYW50ZXJpb3INCmBgYHtyfQ0KZ2dwbG90KFNhbnRhbmRlcikgKw0KICAgIGdlb21fc2YoKSArDQogICAgZ2VvbV9zZihkYXRhID0gcHVudG9zX3NhbnRhbmRlciwgZmlsbCA9ICJhbnRpcXVld2hpdGUiKSArIA0KICAgIGdlb21fdGV4dChkYXRhID0gcHVudG9zX3NhbnRhbmRlciwgYWVzKHg9WCwgeT1ZLGxhYmVsID0gSURfMiksIHNpemUgPSAyKSArDQogICAgY29vcmRfc2YoeGxpbSA9IGMoLTc0LjcsIC03Mi40KSwgeWxpbSA9IGMoNS42LCA4LjE1KSwgZXhwYW5kID0gRkFMU0UpK2xhYnModGl0bGU9IlNhbnRhbmRlciIpDQpgYGANCiMjZXN0YSBudWV2YSBsaWJyZXJpYSwgc2VydmlyYSBwYXJhIGRhcmxlIGNvbG9yIGFsIG1hcGEgZW4gYmFzZSBhIHVuYSBlc2NhbGEgZXNwZWNpZmljYQ0KYGBge3J9DQpsaWJyYXJ5KHNjYWxlcykNCmBgYA0KIyNlc3RlIHBsb3RlbyBub3MgbXVlc3RyYSB1bmEgdmFyaWFudGUgZG9uZGUgbG9zIGRpZmVyZW50ZXMgbXVuaWNpcGlvcyBlc3RhbiBpZGVudGlmaWNhZG9zIGNvbiBzdSBjb2RpZ28geSBwaW50YWRvcyBkZSBjb2xvcmVzIGVuIGJhc2UgYSB1bmEgZXNjYWxhIGRldGVybWluYWRhDQpgYGB7cn0NCmdncGxvdChTYW50YW5kZXIpICsgDQogIGdlb21fc2YoZGF0YT1wdW50b3Nfc2FudGFuZGVyLCBhZXMoeD1YLCB5PVksIGZpbGwgPSAgICAgICAgICAgICAgICAgICAgICAgICAgIElEXzIpLCBjb2xvciA9ICJibGFjayIsIHNpemUgPSAwLjMpICsNCiAgZ2VvbV90ZXh0KGRhdGEgPSBwdW50b3Nfc2FudGFuZGVyLCBhZXMoeD1YLCB5PVksbGFiZWwgPSBJRF8yKSwgc2l6ZSA9IDIpICsNCiAgdGhlbWUoYXNwZWN0LnJhdGlvPTEpKw0KICBzY2FsZV9maWxsX2Rpc3RpbGxlcihuYW1lPSJJRF8yIiwgcGFsZXR0ZSA9ICJZbEduIiwgYnJlYWtzID0gcHJldHR5X2JyZWFrcyhuID0gMTApKSsNCiAgbGFicyh0aXRsZT0ib3RybyBlc3RpbG8gZGUgbWFwYSBwYXJhIFNhbnRhbmRlciIpDQpgYGANCiMjIGNvbiBlc3RvIHNlIGd1YXJkYSBlbCBtYXBhIGFudGVzIHJlYWxpemFkbyBlbiBmb3JtYXRvIHBkZiB5IHBuZw0KYGBge3J9DQpnZ3NhdmUoIlNhbnRhbmRlcl9tdW5pY2lwaW9zLnBkZiIpDQpnZ3NhdmUoIm1hcF9zYW50YW5kZXIucG5nIiwgd2lkdGggPSA2LCBoZWlnaHQgPSA2LCBkcGkgPSAic2NyZWVuIikNCmBgYA0KIyMgZXN0YSBsaWJyZXJpYSBzZXJhIHV0aWwgcGFyYSByZWFsaXphciB1biBudWV2byBtYXBhIA0KYGBge3J9DQppbnN0YWxsLnBhY2thZ2VzKCJsZWFmbGV0IikNCmxpYnJhcnkobGVhZmxldCkNCmBgYA0KIyMgcGFyYSB1c2FyIGVzdGEgbGlicmVyaWEgZXMgbmVjZXNhcmlvIHF1ZSBsb3MgZGF0b3Mgc2VhbiBkZSB0aXBvIGVzcGFjaWFsLCBwYXJhIGVsbG8gdXNhbW9zIGVzdGEgbGluZWENCmBgYHtyfQ0KYW50X3BvaW50cyA8LSBhcyhwdW50b3Nfc2FudGFuZGVyLCAnU3BhdGlhbCcpDQpgYGANCiMjIGNvbiBlc3RvIHZlcmVtb3MgcXVlIGhheSBhbG1hY2VuYWRvIGVuIGVzdGEgdmFyaWFibGUNCmBgYHtyfQ0KaGVhZChhbnRfcG9pbnRzKQ0KYGBgDQojIyBlc3RhIGxpYnJlcmlhIHNlcmEgdXRpbCBwYXJhIGNvbm9jZXIgYWxndW5vcyB2YWxvcmVzIGRlIGNhZGEgZGF0bw0KYGBge3J9DQppbnN0YWxsLnBhY2thZ2VzKCJsd2dlb20iKQ0KYGBgDQoNCmBgYHtyfQ0KbGlicmFyeShsd2dlb20pDQpgYGANCiMjIGNvbiBlc3RvIHBvZGVtb3MgaGFsbGFyIGVsIGFyZWEgZGUgY2FkYSB1bm8gZGUgbG9zIGRhdG9zDQpgYGB7cn0NCm11bl9zYW50YW5kZXIkYXJlYSA8LSBzdF9hcmVhKG11bl9zYW50YW5kZXIpDQptdW5fc2FudGFuZGVyJGttMiA8LSBtdW5fc2FudGFuZGVyJGFyZWEvKDEwMDAwMDApDQptdW5fc2FudGFuZGVyJGttMg0KYGBgDQojIyBwYXJhIHJlYWxpemFyIGVsIG1hcGEsIGVzIG5lY2VzYXJpbyBxdWUgbGEgdmFyaWFibGUgbXVuX3NhbnRhbmRlciBzZWEgZGUgdGlwbyBlc3BhY2lhbCwgcGFyYSBlbGxvLCB1c2Ftb3MgZXN0YSBpbnN0cnVjY2lvbg0KYGBge3J9DQpzYW50X211bmljaXBpb3MgPC0gYXMobXVuX3NhbnRhbmRlciwgJ1NwYXRpYWwnKQ0KaGVhZChzYW50X211bmljaXBpb3MpDQpgYGANCiMjIGVzdGEgaW5zdHJ1Y2Npb24gZXMgdXRpbCBwYXJhIGVsIHByb3hpbW8gcGxvdGVvLCBzZXJ2aXJhIHBhcmEgZXN0YWJsZWNlciBsYSBlc2NhbGEgZGUgY29sb3Jlcw0KYGBge3J9DQpiaW5zIDwtIGMoMCwgNTAsIDEwMCwgMjAwLCAzMDAsIDUwMCwgMTAwMCwgMjAwMCwgSW5mKQ0KcGFsIDwtIGNvbG9yQmluKCJZbE9yUmQiLCBkb21haW4gPSBhbnRfbXVuaWNpcGlvcyRrbTIsIGJpbnMgPSBiaW5zKQ0KDQoNCmxhYmVscyA8LSBtdW5fc2FudGFuZGVyJE5BTUVfMg0KDQpsYWJlbHMNCmBgYA0KIyMgZXN0ZSBwbG90ZW8gbXVlc3RyYSBvdHJhIGZvcm1hIGRlIHZlciBlbCBkZXBhcnRhbWVudG8NCmBgYHtyfQ0KbSA8LSBsZWFmbGV0KHNhbnRfbXVuaWNpcGlvcykgJT4lDQogIHNldFZpZXcoLTczLjUsIDYuNSwgNy40NSkgICU+JSBhZGRQb2x5Z29ucygNCiAgZmlsbENvbG9yID0gfnBhbChrbTIpLA0KICB3ZWlnaHQgPSAyLA0KICBvcGFjaXR5ID0gMSwNCiAgY29sb3IgPSAid2hpdGUiLA0KICBkYXNoQXJyYXkgPSAiMyIsDQogIGZpbGxPcGFjaXR5ID0gMC43LA0KICBoaWdobGlnaHQgPSBoaWdobGlnaHRPcHRpb25zKA0KICAgIHdlaWdodCA9IDUsDQogICAgY29sb3IgPSAiIzU1NSIsDQogICAgZGFzaEFycmF5ID0gIiIsDQogICAgZmlsbE9wYWNpdHkgPSAwLjcsDQogICAgYnJpbmdUb0Zyb250ID0gVFJVRSksDQogIGxhYmVsID0gbGFiZWxzKSAlPiUNCiAgYWRkTGVnZW5kKHBhbCA9IHBhbCwgdmFsdWVzID0gfmttMiwgb3BhY2l0eSA9IDAuNywgdGl0bGUgPSBOVUxMLA0KICAgIHBvc2l0aW9uID0gImJvdHRvbXJpZ2h0IikNCm0NCmBgYA0KIyMgZXN0YXMgdWx0aW1hcyBsaW5lYXMgZGUgY29kaWdvIG11ZXN0cmFuIGxhcyBsaW5lYXMgYWRtaW5pc3RyYXRpdmFzIGRlbCBtYXBhIHNvYnJlIHVuYSBwcm95ZWNjaW9uIGRlbCBjb250aW5lbnRlLCBlc3RvIHBhcmEgdWJpY2FyIGxhIHpvbmEgZGUgdHJhYmFqbw0KYGBge3J9DQphPC1sZWFmbGV0KCkgJT4lDQogIGFkZFByb3ZpZGVyVGlsZXMocHJvdmlkZXJzJEVzcmkuV29ybGRJbWFnZXJ5LCBvcHRpb25zPSBwcm92aWRlclRpbGVPcHRpb25zKG9wYWNpdHkgPSAwLjk5KSkgJT4lDQogIGFkZFBvbHlnb25zKGRhdGEgPSBzYW50X211bmljaXBpb3MsIHBvcHVwPSBzYW50X211bmljaXBpb3MkTkFNRV8yLA0KICAgIHN0cm9rZSA9IFRSVUUsIGZpbGxPcGFjaXR5ID0gMC4xLCBzbW9vdGhGYWN0b3IgPSAwLjI1KQ0KICAgIGENCmBgYA0KDQoNCg0KDQo=