Trabajo elaborado para la asignatura “Programación y manejo de datos en la era del Big Data” de la Universitat de València durante el curso 2020-2021. El repo del trabajo está aquí. La página web de la asignatura y los trabajos de mis compañeros pueden verse aquí.


1. INTRODUCCIÓN

En el lugar he realizado las prácticas curriculares, Unió Gremial – Federació de Gremis i Associacions del Comerç Valencià, hemos analizando el impacto del COVID19 en el pequeño comercio valenciano. Para ello hemos elaborado una encuesta dirigida a los pequeños comercios1 adheridos a las asociaciones de Unió Gremial.

Foto de la última camapaña de UG

En este trabajo veremos como se ha visto reducida la facturación en los diferentes trimestres de este último año, el problema de la digitalización en el pequeño comercio (lo cual supone un gran reto para el futuro del sector), las previsiones futuras dadas las expectativas de futuras medidas restrictivas a causa de la segunda ola de la pandemia y la importancia de la campaña de Navidad para estos negocios.

2. DATOS

En este caso, los datos de este trabajo se han obtenido en exclusiva del excel generado automáticamente por la herramienta de Google que permite hacer encuestas (encuesta anteriormente mencionada, con su respectivo link). Cabe destacar que he tenido que modificar la primera fila del excel donde aparecía la pregunta entera, lo cual a la hora de trabajar con R podría haber sido complicado. A continuación, muestro una tabla en la que se ven todos los resultados de dicha encuesta, y con los cuales voy a trabajar el resto del trabajo.

excel <- read_excel("./Datos/RESPUESTAS_ENCUESTA_COVID.xlsx") 
encuesta <- excel %>% select(-MARCA, -HABITANTES, -DISTANCIA, -CONSECUENCIAS_PANDEMIA, -SERVICIOS_VENTA_ONLINE, -FINANCIACION_EXTERNA, -INCREMENTO_VENTAS_ONLINE, -24, -25)
DT::datatable(encuesta, class = 'cell-border stripe', filter = "top", rownames = FALSE)

3. ANÁLISIS DE LA ENCUESTA

A continuación, paso a explicar con detalle los datos más importantes extraidos de la encuesta realizada.

3.1 SECTORES MÁS REPRESENTATIVOS.

Entre los sectores más representativos encontramos en primera posición a las Agencias de Viaje. Esto se debe a que desde la Asociación Empresarial Valenciana de Agencias de Viaje (AEVAV), fueron muchos de sus asociados los que se perdieron un poco de su tiempo para responder las diferentes cuestiones. En segundo lugar hosteleria y tiendas de ropa. Como se puede intuir son sectores que se han visto bastante castigados dadas las restricciones impuestas por los diferentes gobiernos. Esto hace que los resultados de la encuesta, como veremos más adelante sean poco alentadores para la economía valenciana.

sectores <- encuesta %>% group_by(SECTOR) %>% summarise(N=n()) %>% slice_max(N, n=5) %>%
    mutate(SECTOR = forcats::as_factor(SECTOR))
graficosectores <- ggplot (sectores, aes (x=N, y=SECTOR), aes(fct_rev(SECTOR))) + geom_bar(stat = "identity", fill = "skyblue") + labs(title = "Cinco sectores más representativos de la encuesta", x="Número de comercios", y="Sector") + theme_minimal()
graficosectores

3.2 MUNICIPIOS MÁS REPRESENTATIVOS

Para representar los municipios que más han contestado al cuestionario, he realizado un mapa. De todas formas, los cinco municipios más presentes en la encuesta son:

  1. Valencia con 65 observaciones
  2. Buñol con 37 observaciones
  3. Benifaio con 28 observaciones
  4. Alzira con 27 observaciones
  5. Ontinyent con 22 observaciones

Por lo que podemos afirmar que la muestra obtenida refleja bien el tejido comercial valenciano, ya que hemos obtenido datos de muchos municipios diferentes.

municipios <- encuesta %>% group_by(MUNICIPIO) %>% summarise(N=n()) %>% slice_max(N, n=5)

mapaCiudadyPueblomayorinciAcu <- leaflet() %>% 
  addPopups(lng = -0.37480, lat = 39.47973 , popup = "Valencia") %>%
  addPopups(lng = -0.79031, lat = 39.41447 , popup = "Buñol") %>%
  addPopups(lng = -0.42500, lat = 39.28439 , popup = "Benifaio") %>%
  addPopups(lng = -0.42666, lat = 39.15447 , popup = "Alzira") %>%
  addPopups(lng = -0.30950, lat = 39.19868 , popup = "Sueca") %>%
  setView(lng = -0.5, lat = 39.500, zoom = 8.5) %>%  addTiles()
mapaCiudadyPueblomayorinciAcu

3.3 AFECTACIÓN DEL COVID-19

En primer lugar, me he centrado en la pregunta más básica: ¿El COVID19 ha afectado de forma negativa en su negocio?

afectacion <- encuesta %>% group_by(AFECTACION) %>% summarise(N=n()) %>% na.omit() %>% mutate (porcentaje=prop.table(N)*100, round(porcentaje, 2)) 
graficoafectacion <- ggplot(afectacion, aes(x="", y = round(porcentaje, 2), fill=AFECTACION)) +     geom_bar(stat ="identity", color = "white") + 
    geom_text(aes(label = round(porcentaje, 2)), position = position_stack(vjust=0.5), color="white", size = 5, ) + 
  coord_polar(theta = "y") + 
  scale_fill_manual(values = c("steelblue", "red")) + 
  theme_void() + 
  labs(title = "¿Ha afectado de forma negativa el COVID-19 en su negocio?")
graficoafectacion

Como podemos observar, el 92.55% de los encuestados ha contestado que sí que ha tenido una afectación negativa. Mientras que los que han respondido que no, representan la minoría de comercios, cabe destacar que se trata de comercios los cuales se consideran esenciales (buscar en la tabla en la columna AFECTACIÓN: “No”).

3.4 AFECTACIÓN POR TRIMESTRES

En este apartado voy a analizar mediante un gráfico conocido como de quesitos, la pérdida de facturación de los comercios en los tres trimestres en los que ha estado presente la pandemia. Es decir, en el segundo trimestre, tercer trimestre y cuarto trimestre de 2020. Como podemos observar los resultados son bastante similares con una leve mejora en el tercer trimestre respecto al segundo.

3.4.1 SEGUNDO TRIMESTRE DE 2020

En este primer trimestre analizado (segundo trimestre del 2020), los resultados mostrados son tremendamente malos. Ya que como podemos observar el 54,96% de los comercios han pérdido más del 50% de la facturación respecto al mismo trimestre del año pasado. Por contra, el 8,59% han perdido solo entre el 0 y el 10% de dicha facturación.

trimestres <- encuesta %>% group_by(SEGUNDOTRIMESTRE) %>% summarise(N=n()) %>% na.omit() %>% arrange(desc(N)) %>% mutate(porcentaje=prop.table(N)*100, round(porcentaje, 2))

graficotrimestre2 <- ggplot(trimestres, aes(x="", y = round(porcentaje, 2), fill=SEGUNDOTRIMESTRE)) +     geom_bar(stat ="identity", color = "white") + 
    geom_text(aes(label = round(porcentaje, 2)), position = position_stack(vjust=0.5), color="white", size = 5, ) + 
  coord_polar(theta = "y")  + 
  theme_void() + 
  scale_fill_manual(values = c("STEELBLUE", "BLUE", "ORANGE", "RED","BROWN","GREEN", "DARKGREY"))+
  labs(title = "¿Cuánto ha visto reducida su facturación en el 2T2020?")
graficotrimestre2 + theme(panel.grid.major = element_line(linetype = "blank")) +labs(fill = "FACTURACIÓN PERDIDA") 

3.4.2 TERCER TRIMESTRE DE 2020

En el tercer trimestre, y con la llegada del verano y la llamada “Nueva Normalidad”, establecida en el territorio español a partir del mes de mayo, parecía que el la economía iba a resurgir. Pero nada más lejos de la realidad, las restricciones y la incertidumbre de los consumidores hicieron que durante todo el verano no se diera la recuperación esperada. Aunque cabe mencionar que si que se observa un ligero atisbo de mejora. Ya que en este caso se ha reducido más de 10 puntos porcentuales los encuestados que indicaron que perdieron más del 50% de la facturación. Si nos fijamos en los encuestados menos afectados (0-10%), vemos como en este caso son un 13,38%, cifra ligeramente superior a la del trimestre anterior.

trimestres <- encuesta %>% group_by(TERCERTRIMESTRE) %>% summarise(N=n()) %>% na.omit() %>% arrange(desc(N)) %>% mutate(porcentaje=prop.table(N)*100, round(porcentaje, 2)) 

graficotrimestre3 <- ggplot(trimestres, aes(x="", y = round(porcentaje, 2), fill=TERCERTRIMESTRE)) +     geom_bar(stat ="identity", color = "white") + 
    geom_text(aes(label = round(porcentaje, 2)), position = position_stack(vjust=0.5), color="white", size = 5, ) + 
  coord_polar(theta = "y")  + 
  theme_void() + 
  scale_fill_manual(values = c("STEELBLUE", "BLUE", "ORANGE", "RED","BROWN","GREEN", "DARKGREY"))+
  labs(title = "¿Cuánto ha visto reducida su facturación en el 3T2020?")
graficotrimestre3 + theme(panel.grid.major = element_line(linetype = "blank")) +labs(fill = "FACTURACIÓN PERDIDA") 

3.4.3 CUARTO TRIMESTRE DE 2020

Por último, analizamos el último trimestre del año, el cual muestra resultados muy parecidos a los del trimestre anterior. Esto quiere decir que durante el transcurso del año el pequeño comercio valenciano no pudo remontar la situación provocada por la crisis de la pandemia, que impidió durante la gran parte del año 2020, que los comercios desarrollarán su actividad con total normalidad y sin restricciones.

trimestres <- encuesta %>% group_by(CUARTOTRIMESTRE) %>% summarise(N=n()) %>% na.omit() %>% arrange(desc(N)) %>% mutate(porcentaje=prop.table(N)*100, round(porcentaje, 2))

graficotrimestre4 <- ggplot(trimestres, aes(x="", y = round(porcentaje, 2), fill=CUARTOTRIMESTRE)) +     geom_bar(stat ="identity", color = "white") + 
    geom_text(aes(label = round(porcentaje, 2)), position = position_stack(vjust=0.5), color="white", size = 5, ) + 
  coord_polar(theta = "y")  + 
  theme_void() + 
  scale_fill_manual(values = c("STEELBLUE", "BLUE", "ORANGE", "RED","BROWN","GREEN", "DARKGREY"))+
  labs(title = "¿Cuánto ha visto reducida su facturación en el 4T2020?")
graficotrimestre4 + theme(panel.grid.major = element_line(linetype = "blank")) +labs(fill = "FACTURACIÓN PERDIDA")

3.5 DIGITALIZACIÓN DEL PEQUEÑO COMERCIO

En este punto, voy a hablar de unos de los mayores problemas del pequeño comercio y del comercio tradicional en general, la digitalización. Y es que en muchos casos, el comercio tradicional ha sido sobrepasado por las nuevas tecnologías, ya que actualmente, es dificil ver por ejemplo, una carnicería o verdulería de un mercado municipal vendiendo sus productos en internet.Culpa de ello lo tienen también las grandes tecnológicas como Amazon, las cuales han hecho que nos acostumbremos a ir de compras a golpe de “click” desde el sofá de nuestra casa, abandonando en cierto modo el comercio del barrio de toda la vida.

digitalizacion <- encuesta %>% group_by(VENTA_ONLINE) %>% summarise (N=n()) %>% na.omit()
graficodigitalizacion <- ggplot(digitalizacion, aes(x= VENTA_ONLINE, y=N)) + geom_bar(stat = "identity", fill ="steelblue") + theme_minimal()
graficodigitalizacion + theme(panel.grid.major = element_line(linetype = "blank"), 
    panel.background = element_rect(fill = NA), 
    plot.background = element_rect(colour = NA)) +labs(title = "¿Su negocio dispone de un servicio de venta online?", 
    x = "¿Venta Online?", y = "Número de comercios")

Como he dicho anteriormente, y como muestran los resultados, actualmente la falta de digitalización en el sector comercial valenciano es un reto que hay que abordar. Y es que más de 300 comercios son los que han contestado que no disponen de servicio de venta online, mientras que solo un poco más de 150 han sido los que han contestado que sí.

3.6 AYUDAS AL PEQUEÑO COMERCIO

Durante la pandemía, los gobiernos han tenido que recurrir a ciertas ayudas de apoyo a los empresarios y autónomos, ya que ante la obligación de tener que cerrar obligatoriamente, el gobierno tuvo que apoyar a los trabajadores de dichos comercios. Dichas ayudas podemos consultarlas en la página web de la Conselleria d’Economia de la Generalitat Valenciana.

ayudas <- encuesta %>% group_by(AYUDAS) %>% summarise(respuestas = n()) %>% na.omit()
graficoayudas <- ggplot(ayudas, aes(x= AYUDAS, y= respuestas)) + geom_bar(stat = "identity", fill = "steelblue") + labs(title = "¿Ha solicitado ayudas a las AAPP ante la crisis del COVID19?") + theme_minimal() + geom_text(aes(label=respuestas), positicion = position_stack(vjust = 0.5), color = "black", size = 4)
graficoayudas

Como vemos, 386 han solicitado ayudas, mientras que 44 de los que si que han solicitado, no las habian recibido en el momento de la contestación de la encuesta. Por su parte 147 comerciantes no pidieron ningún tipo de ayuda.

En el siguiente gráfico, hemos preguntado: ¿Le parecen suficientes las ayudas recibidas por las AAPP?. Pregunta, a la que como es de esperar cuando alguien tiene que valorar la cuantía de una ayuda económica, han respondido de forma mayoritaria que no han sido suficientes.

ayudas1 <- encuesta %>% group_by(AYUDA_SUFICIENTE) %>% summarise(respuestas = n()) %>% na.omit() %>% mutate(porcentaje=prop.table(respuestas)*100, round(porcentaje, 2))
graficoayudas1 <- ggplot(ayudas1, aes(x="", y = round(porcentaje, 2), fill=AYUDA_SUFICIENTE)) +
    geom_bar(stat ="identity", color = "white") +
    geom_text(aes(label = round(porcentaje, 2)), position = position_stack(vjust=0.5), color="white", size = 5, ) +
  coord_polar(theta = "y") + theme_void()  
graficoayudas1+labs(title = "¿Considera suficientes las ayudas recibidas?")

3.7 CIERRE DE LOS COMERCIOS DEBIDO A LA PANDEMIA

Como he mencionado anteriormente, los negocios se vieron obligados a cerrar en la primera ola de la pandemia debido a las restricciones de movilidad impuestas por el gobierno central. Este cierre fue en cierta medida asimétrico y dependió principalmente del tipo de negocio.

cierre <- encuesta %>% group_by(TIEMPO_CERRADO) %>% summarise(observaciones = n()) %>% na.omit() %>% arrange(-observaciones)
graficocierre <- ggplot(cierre, aes(x = TIEMPO_CERRADO, y = observaciones)) + 
        geom_bar(stat = "identity", fill = "brown") +
        labs(title = "¿Cuánto tiempo ha estado su negocio cerrado dada la crisis del COVID19?", x = "Tiempo cerrado", y = "Observaciones") + theme_minimal()
graficocierre

Como observamos, la gran mayoría de comercios estuvieron cerrados dos meses o más. siendo un total de más de 400 encuestados los que estuvieron cerrados dicho tiempo. Por contra menos de 75 comercios han estado cerrados un mes o menos. Estos resultados arrojan una situación más que preocupante, ya que el comercio valenciano está sufriendo serias dificutlades para remontar dicha situación negativa.

Con los resultados obtenidos, está claro que muchos de los encuestados han tenido serias dificultades económicas dadas las restricciones que obligaban a cerrar cualquier negocio considerado no esencial. Ante estos resultados donde hemos visto que gran cantidad de negocios han permanecido cerrados un tiempo más que significativo. Es inevitable analizar la cuestión de cuántos de ellos se han planteado el cierre de sus negocios dada la situación.

cese <- encuesta %>% group_by(CIERRE) %>% summarise(observaciones = n()) %>% na.omit() %>% mutate(porcentaje=prop.table(observaciones)*100, round(porcentaje, 2))

graficocese <-  ggplot(cese, aes(x="", y = round(porcentaje, 2), fill=CIERRE)) +
    geom_bar(stat ="identity", color = "white") +
    geom_text(aes(label = round(porcentaje, 2)), position = position_stack(vjust=0.5), color="white", size = 5, ) +
  coord_polar(theta = "y") + theme_void() 
graficocese + labs (title = "¿Se ha planteado cerrar de forma permanente su negocio dada la situación?")

En este gráfico se muestra una realidad más que precupante, ya que el 45% de los encuestados han contestado que se han planteado cerrar de forma permanente su negocio. Esto refleja que la situación del pequeño comercio valenciano es generalmente poco solvente y con poco margen de maniobra.

3.8 CAMPAÑA DE NAVIDAD

Ante las dificultades sufridas en la primera mitad del año 2020, la campaña de Navidad tenía una importancia en algunos casos vital para el comercio valenciano, ya que podía ser la clave para remontar los resultados económicos tan malos de los meses anteriores.

navidad <- encuesta %>% group_by(IMPORTANCIA_NAVIDAD) %>% summarise(importancia = n()) %>% na.omit()
graficonavidad <- ggplot(navidad, aes(x = IMPORTANCIA_NAVIDAD, y = importancia)) + 
        geom_bar(stat = "identity", fill = "red") +
        labs(title = "¿Qué importante va a ser la campaña de Navidad en su Negocio?", x = "Importancia campaña Navidad", y = "observaciones") + theme_minimal()
graficonavidad

Como podemos comprobar en el gráfico, la mayoría de las contestaciones es que la campaña de Navidad era muy importante o importante para su comercio. Ahora bien, sabiendo a posteriori como ha ido dicha campaña, es de esperar que el pequeño comercio valenciano esté pasando un comienzo de año 2021 económicamente complicado.

4. CONCLUSIONES

A modo de conclusión, como hemos visto a lo largo de este trabajo, el pequeño comercio valenciano ha sido un sector el cual ha sido muy castigado por la crisis económica provocada por la pandemia del COVID19. El tiempo que tuvieron que cerrar como su situación previa de falta de liquidez excesiva y de solvencia, hicieron que ante dicha crisis los comercios no estuvieran todo lo bien de preparados que la situación requería. De todas formas las ayudas de los diferentes gobiernos, aunque en muchos casos, se han considerado insuficientes, han ayudado a mitigar el impacto negativo de la crisis.


  1. más de 100 asociaciones distribuidas por toda la Comunidad Valenciana↩︎

LS0tDQp0aXRsZTogIkFmZWN0YWNpw7NuIGRlbCBDT1ZJRC0xOSBlbiBlbCBwZXF1ZcOxbyBjb21lcmNpbyB2YWxlbmNpYW5vIg0Kc3VidGl0bGU6ICJDYXJsb3MgUm9kcmlndWV6IEdvbnphbHZvKGNhcm9nb240QGFsdW1uaS51di5lcykiICMtIHBvbmdvIHTDuiBub21icmUgYWjDrSBwYXJhIHEgYXBhcmV6Y2EgbcOhcyBncmFuZGUgcSBlbCBkZSBsYSBVVg0KYXV0aG9yOiAiVW5pdmVyc2l0YXQgZGUgVmFsw6huY2lhIg0KZGF0ZTogIkRpY2llbWJyZSBkZSAyMDIwIChhY3R1YWxpemFkbyBlbCBgciBmb3JtYXQoU3lzLnRpbWUoKSwgJyVkLSVtLSVZJylgKSINCm91dHB1dDoNCiAgaHRtbF9kb2N1bWVudDoNCiAgICAjY3NzOiAiLi9hc3NldHMvbXlfY3NzX2ZpbGUuY3NzIg0KICAgIHRoZW1lOiBwYXBlcg0KICAgIGhpZ2hsaWdodDogdGV4dG1hdGUgDQogICAgdG9jOiB0cnVlDQogICAgdG9jX2RlcHRoOiAzIA0KICAgIHRvY19mbG9hdDogDQogICAgICBjb2xsYXBzZWQ6IHRydWUNCiAgICAgIHNtb290aF9zY3JvbGw6IHRydWUNCiAgICBzZWxmX2NvbnRhaW5lZDogdHJ1ZQ0KICAgIG51bWJlcl9zZWN0aW9uczogZmFsc2UNCiAgICBkZl9wcmludDoga2FibGUNCiAgICBjb2RlX2Rvd25sb2FkOiB0cnVlDQplZGl0b3Jfb3B0aW9uczogDQogIGNodW5rX291dHB1dF90eXBlOiBjb25zb2xlDQotLS0NCg0KYGBge3IgcGFja2FnZXMtc2V0dXAsIGluY2x1ZGUgPSBGQUxTRX0NCmxpYnJhcnkodGlkeXZlcnNlKQ0KbGlicmFyeShrbGlwcHkpICAjLSByZW1vdGVzOjppbnN0YWxsX2dpdGh1Yigicmxlc3VyL2tsaXBweSIpDQpsaWJyYXJ5KGtuaXRyKQ0KbGlicmFyeShyZWFkeGwpDQpsaWJyYXJ5KGRwbHlyKQ0KbGlicmFyeShnZ3Bsb3QyKQ0KbGlicmFyeShsZWFmbGV0KQ0KbGlicmFyeShwbG90bHkpDQoNCmBgYA0KDQpgYGB7ciBjaHVuay1zZXR1cCwgaW5jbHVkZSA9IEZBTFNFfQ0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KGVjaG8gPSBUUlVFLCBldmFsID0gVFJVRSwgbWVzc2FnZSA9IEZBTFNFLCB3YXJuaW5nID0gRkFMU0UsIA0KICAgICAgICAgICAgICAgICAgICAgICNyZXN1bHRzID0gImhvbGQiLA0KICAgICAgICAgICAgICAgICAgICAgIGNhY2hlID0gRkFMU0UsIGNhY2hlLnBhdGggPSAiL2NhY2hlcy8iLCBjb21tZW50ID0gIiM+IiwNCiAgICAgICAgICAgICAgICAgICAgICAjZmlnLndpZHRoID0gNywgI2ZpZy5oZWlnaHQ9IDcsICAgDQogICAgICAgICAgICAgICAgICAgICAgI291dC53aWR0aCA9IDcsIG91dC5oZWlnaHQgPSA3LA0KICAgICAgICAgICAgICAgICAgICAgIGNvbGxhcHNlID0gVFJVRSwgIGZpZy5zaG93ID0gImhvbGQiLA0KICAgICAgICAgICAgICAgICAgICAgIGZpZy5hc3AgPSA3LzksIG91dC53aWR0aCA9ICI2MCUiLCBmaWcuYWxpZ24gPSAiY2VudGVyIikNCmtuaXRyOjpvcHRzX2NodW5rJHNldChkZXYgPSAicG5nIiwgZGV2LmFyZ3MgPSBsaXN0KHR5cGUgPSAiY2Fpcm8tcG5nIikpDQpgYGANCg0KYGBge3Igb3B0aW9ucy1zZXR1cCwgaW5jbHVkZSA9IEZBTFNFfQ0Kb3B0aW9ucyhzY2lwZW4gPSA5OTkpICMtIHBhcmEgcXVpdGFyIGxhIG5vdGFjacOzbiBjaWVudMOtZmljYQ0Kb3B0aW9ucygieWFtbC5ldmFsLmV4cHIiID0gVFJVRSkgDQpgYGANCg0KDQpgYGB7ciBrbGlwcHksIGVjaG8gPSBGQUxTRX0NCmtsaXBweTo6a2xpcHB5KHBvc2l0aW9uID0gYygidG9wIiwgInJpZ2h0IikpICMtIHJlbW90ZXM6Omluc3RhbGxfZ2l0aHViKCJybGVzdXIva2xpcHB5IikNCmBgYA0KDQo8aHIgY2xhc3M9ImxpbmVhLWJsYWNrIj4NCg0KVHJhYmFqbyBlbGFib3JhZG8gcGFyYSBsYSBhc2lnbmF0dXJhICJQcm9ncmFtYWNpw7NuIHkgbWFuZWpvIGRlIGRhdG9zIGVuIGxhIGVyYSBkZWwgQmlnIERhdGEiIGRlIGxhIFVuaXZlcnNpdGF0IGRlIFZhbMOobmNpYSBkdXJhbnRlIGVsIGN1cnNvIDIwMjAtMjAyMS4gRWwgcmVwbyBkZWwgdHJhYmFqbyBlc3TDoSBbYXF1w61dKGh0dHBzOi8vZ2l0aHViLmNvbS9jYXJsb3Nyb2RyaWd1ZXpnb256YWx2by90cmFiYWpvX0JpZ0RhdGEpe3RhcmdldD0iX2JsYW5rIn0uIExhIHDDoWdpbmEgd2ViIGRlIGxhIGFzaWduYXR1cmEgeSBsb3MgdHJhYmFqb3MgZGUgbWlzIGNvbXBhw7Flcm9zIHB1ZWRlbiB2ZXJzZSBbYXF1w61dKGh0dHBzOi8vcGVyZXpwNDQuZ2l0aHViLmlvL2ludHJvLWRzLTIwLTIxLXdlYi8wNy10cmFiYWpvcy5odG1sKXt0YXJnZXQ9Il9ibGFuayJ9Lg0KDQo8IS0tIEVsIHDDoXJyYWZvIGRlIGFycmliYSBoYXMgZGUgZGVqYXJsbyBjYXNpIGlndWFsLCANCiAgICAgICAgc29sbyBIQVMgZGUgU1VTVElUVUlSIGxhcyAyIHZlY2VzIHF1ZSBhcGFyZWNlICJwZXJlenA0NCIgcG9yIHR1IHVzdWFyaW8gZGUgR2l0aHViLS0+DQoNCjxociBjbGFzcz0ibGluZWEtcmVkIj4NCg0KIyAxLiBJTlRST0RVQ0NJw5NODQoNCkVuIGVsIGx1Z2FyIGhlIHJlYWxpemFkbyBsYXMgcHLDoWN0aWNhcyBjdXJyaWN1bGFyZXMsICoqVW5pw7MgR3JlbWlhbCDigJMgRmVkZXJhY2nDsyBkZSBHcmVtaXMgaSBBc3NvY2lhY2lvbnMgZGVsIENvbWVyw6cgVmFsZW5jacOgKiosIGhlbW9zIGFuYWxpemFuZG8gZWwgaW1wYWN0byBkZWwgQ09WSUQxOSBlbiBlbCBwZXF1ZcOxbyBjb21lcmNpbyB2YWxlbmNpYW5vLiBQYXJhIGVsbG8gaGVtb3MgZWxhYm9yYWRvIHVuYSBbZW5jdWVzdGFdKGh0dHBzOi8vZm9ybXMuZ2xlLzRZZVhZU3U0SG1lWXhCTVlBKSBkaXJpZ2lkYSBhIGxvcyBwZXF1ZcOxb3MgY29tZXJjaW9zXlttw6FzIGRlIDEwMCBhc29jaWFjaW9uZXMgZGlzdHJpYnVpZGFzIHBvciB0b2RhIGxhIENvbXVuaWRhZCBWYWxlbmNpYW5hXSBhZGhlcmlkb3MgYSBsYXMgYXNvY2lhY2lvbmVzIGRlIFVuacOzIEdyZW1pYWwuDQoNCiFbRm90byBkZSBsYSDDumx0aW1hIGNhbWFwYcOxYSBkZSBVR10oLi9pbWFnZW5lcy9Db21lcsOnQnJ1dGFsLmpwZyl7d2lkdGg9MzAlfQ0KDQoNCg0KDQoNCg0KDQoNCiBFbiBlc3RlIHRyYWJham8gdmVyZW1vcyBjb21vIHNlIGhhIHZpc3RvIHJlZHVjaWRhIGxhIGZhY3R1cmFjacOzbiBlbiBsb3MgZGlmZXJlbnRlcyB0cmltZXN0cmVzIGRlIGVzdGUgw7psdGltbyBhw7FvLCBlbCBwcm9ibGVtYSBkZSBsYSBkaWdpdGFsaXphY2nDs24gZW4gZWwgcGVxdWXDsW8gY29tZXJjaW8gKGxvIGN1YWwgc3Vwb25lIHVuIGdyYW4gcmV0byBwYXJhIGVsIGZ1dHVybyBkZWwgc2VjdG9yKSwgbGFzIHByZXZpc2lvbmVzIGZ1dHVyYXMgZGFkYXMgbGFzIGV4cGVjdGF0aXZhcyBkZSBmdXR1cmFzIG1lZGlkYXMgcmVzdHJpY3RpdmFzIGEgY2F1c2EgZGUgbGEgc2VndW5kYSBvbGEgZGUgbGEgcGFuZGVtaWEgeSBsYSBpbXBvcnRhbmNpYSBkZSBsYSBjYW1wYcOxYSBkZSBOYXZpZGFkIHBhcmEgZXN0b3MgbmVnb2Npb3MuIA0KDQojIDIuIERBVE9TDQoNCkVuIGVzdGUgY2FzbywgbG9zIGRhdG9zIGRlIGVzdGUgdHJhYmFqbyBzZSBoYW4gb2J0ZW5pZG8gZW4gZXhjbHVzaXZhIGRlbCBleGNlbCBnZW5lcmFkbyBhdXRvbcOhdGljYW1lbnRlIHBvciBsYSBoZXJyYW1pZW50YSBkZSBHb29nbGUgcXVlIHBlcm1pdGUgaGFjZXIgZW5jdWVzdGFzIChlbmN1ZXN0YSBhbnRlcmlvcm1lbnRlIG1lbmNpb25hZGEsIGNvbiBzdSByZXNwZWN0aXZvIGxpbmspLiBDYWJlIGRlc3RhY2FyIHF1ZSBoZSB0ZW5pZG8gcXVlIG1vZGlmaWNhciBsYSBwcmltZXJhIGZpbGEgZGVsIGV4Y2VsIGRvbmRlIGFwYXJlY8OtYSBsYSBwcmVndW50YSBlbnRlcmEsIGxvIGN1YWwgYSBsYSBob3JhIGRlIHRyYWJhamFyIGNvbiBSIHBvZHLDrWEgaGFiZXIgc2lkbyBjb21wbGljYWRvLiANCkEgY29udGludWFjacOzbiwgbXVlc3RybyB1bmEgdGFibGEgZW4gbGEgcXVlIHNlIHZlbiB0b2RvcyBsb3MgcmVzdWx0YWRvcyBkZSBkaWNoYSBlbmN1ZXN0YSwgeSBjb24gbG9zIGN1YWxlcyB2b3kgYSB0cmFiYWphciBlbCByZXN0byBkZWwgdHJhYmFqby4gDQoNCmBgYHtyLCBldmFsID0gVFJVRSwgZWNobyA9IFRSVUV9DQpleGNlbCA8LSByZWFkX2V4Y2VsKCIuL0RhdG9zL1JFU1BVRVNUQVNfRU5DVUVTVEFfQ09WSUQueGxzeCIpIA0KZW5jdWVzdGEgPC0gZXhjZWwgJT4lIHNlbGVjdCgtTUFSQ0EsIC1IQUJJVEFOVEVTLCAtRElTVEFOQ0lBLCAtQ09OU0VDVUVOQ0lBU19QQU5ERU1JQSwgLVNFUlZJQ0lPU19WRU5UQV9PTkxJTkUsIC1GSU5BTkNJQUNJT05fRVhURVJOQSwgLUlOQ1JFTUVOVE9fVkVOVEFTX09OTElORSwgLTI0LCAtMjUpDQpEVDo6ZGF0YXRhYmxlKGVuY3Vlc3RhLCBjbGFzcyA9ICdjZWxsLWJvcmRlciBzdHJpcGUnLCBmaWx0ZXIgPSAidG9wIiwgcm93bmFtZXMgPSBGQUxTRSkNCmBgYA0KDQojIDMuIEFOw4FMSVNJUyBERSBMQSBFTkNVRVNUQQ0KQSBjb250aW51YWNpw7NuLCBwYXNvIGEgZXhwbGljYXIgY29uIGRldGFsbGUgbG9zIGRhdG9zIG3DoXMgaW1wb3J0YW50ZXMgZXh0cmFpZG9zIGRlIGxhIGVuY3Vlc3RhIHJlYWxpemFkYS4gDQoNCiMjIDMuMSBTRUNUT1JFUyBNw4FTIFJFUFJFU0VOVEFUSVZPUy4NCg0KRW50cmUgbG9zIHNlY3RvcmVzIG3DoXMgcmVwcmVzZW50YXRpdm9zIGVuY29udHJhbW9zIGVuIHByaW1lcmEgcG9zaWNpw7NuIGEgbGFzIEFnZW5jaWFzIGRlIFZpYWplLiBFc3RvIHNlIGRlYmUgYSBxdWUgZGVzZGUgbGEgQXNvY2lhY2nDs24gRW1wcmVzYXJpYWwgVmFsZW5jaWFuYSBkZSBBZ2VuY2lhcyBkZSBWaWFqZSAoQUVWQVYpLCBmdWVyb24gbXVjaG9zIGRlIHN1cyBhc29jaWFkb3MgbG9zIHF1ZSBzZSBwZXJkaWVyb24gdW4gcG9jbyBkZSBzdSB0aWVtcG8gcGFyYSByZXNwb25kZXIgbGFzIGRpZmVyZW50ZXMgY3Vlc3Rpb25lcy4gDQpFbiBzZWd1bmRvIGx1Z2FyIGhvc3RlbGVyaWEgeSB0aWVuZGFzIGRlIHJvcGEuIA0KQ29tbyBzZSBwdWVkZSBpbnR1aXIgc29uIHNlY3RvcmVzIHF1ZSBzZSBoYW4gdmlzdG8gYmFzdGFudGUgY2FzdGlnYWRvcyBkYWRhcyBsYXMgcmVzdHJpY2Npb25lcyBpbXB1ZXN0YXMgcG9yIGxvcyBkaWZlcmVudGVzIGdvYmllcm5vcy4gRXN0byBoYWNlIHF1ZSBsb3MgcmVzdWx0YWRvcyBkZSBsYSBlbmN1ZXN0YSwgY29tbyB2ZXJlbW9zIG3DoXMgYWRlbGFudGUgc2VhbiBwb2NvIGFsZW50YWRvcmVzIHBhcmEgbGEgZWNvbm9tw61hIHZhbGVuY2lhbmEuIA0KDQpgYGB7ciwgZXZhbCA9IFRSVUUsIGVjaG8gPSBUUlVFfQ0Kc2VjdG9yZXMgPC0gZW5jdWVzdGEgJT4lIGdyb3VwX2J5KFNFQ1RPUikgJT4lIHN1bW1hcmlzZShOPW4oKSkgJT4lIHNsaWNlX21heChOLCBuPTUpICU+JQ0KICAgIG11dGF0ZShTRUNUT1IgPSBmb3JjYXRzOjphc19mYWN0b3IoU0VDVE9SKSkNCmdyYWZpY29zZWN0b3JlcyA8LSBnZ3Bsb3QgKHNlY3RvcmVzLCBhZXMgKHg9TiwgeT1TRUNUT1IpLCBhZXMoZmN0X3JldihTRUNUT1IpKSkgKyBnZW9tX2JhcihzdGF0ID0gImlkZW50aXR5IiwgZmlsbCA9ICJza3libHVlIikgKyBsYWJzKHRpdGxlID0gIkNpbmNvIHNlY3RvcmVzIG3DoXMgcmVwcmVzZW50YXRpdm9zIGRlIGxhIGVuY3Vlc3RhIiwgeD0iTsO6bWVybyBkZSBjb21lcmNpb3MiLCB5PSJTZWN0b3IiKSArIHRoZW1lX21pbmltYWwoKQ0KZ3JhZmljb3NlY3RvcmVzDQpgYGANCg0KIyMgMy4yIE1VTklDSVBJT1MgTcOBUyBSRVBSRVNFTlRBVElWT1MNClBhcmEgcmVwcmVzZW50YXIgbG9zIG11bmljaXBpb3MgcXVlIG3DoXMgaGFuIGNvbnRlc3RhZG8gYWwgY3Vlc3Rpb25hcmlvLCBoZSByZWFsaXphZG8gdW4gbWFwYS4gDQpEZSB0b2RhcyBmb3JtYXMsIGxvcyBjaW5jbyBtdW5pY2lwaW9zIG3DoXMgcHJlc2VudGVzIGVuIGxhIGVuY3Vlc3RhIHNvbjoNCg0KICAxLiBWYWxlbmNpYSBjb24gNjUgb2JzZXJ2YWNpb25lcw0KICAyLiBCdcOxb2wgY29uIDM3IG9ic2VydmFjaW9uZXMNCiAgMy4gQmVuaWZhaW8gY29uIDI4IG9ic2VydmFjaW9uZXMgDQogIDQuIEFsemlyYSBjb24gMjcgb2JzZXJ2YWNpb25lcw0KICA1LiBPbnRpbnllbnQgY29uIDIyIG9ic2VydmFjaW9uZXMNCg0KUG9yIGxvIHF1ZSBwb2RlbW9zIGFmaXJtYXIgcXVlIGxhIG11ZXN0cmEgb2J0ZW5pZGEgcmVmbGVqYSBiaWVuIGVsIHRlamlkbyBjb21lcmNpYWwgdmFsZW5jaWFubywgeWEgcXVlIGhlbW9zIG9idGVuaWRvIGRhdG9zIGRlIG11Y2hvcyBtdW5pY2lwaW9zIGRpZmVyZW50ZXMuIA0KDQpgYGB7ciwgZXZhbCA9IFRSVUUsIGVjaG8gPSBUUlVFfQ0KbXVuaWNpcGlvcyA8LSBlbmN1ZXN0YSAlPiUgZ3JvdXBfYnkoTVVOSUNJUElPKSAlPiUgc3VtbWFyaXNlKE49bigpKSAlPiUgc2xpY2VfbWF4KE4sIG49NSkNCg0KbWFwYUNpdWRhZHlQdWVibG9tYXlvcmluY2lBY3UgPC0gbGVhZmxldCgpICU+JSANCiAgYWRkUG9wdXBzKGxuZyA9IC0wLjM3NDgwLCBsYXQgPSAzOS40Nzk3MyAsIHBvcHVwID0gIlZhbGVuY2lhIikgJT4lDQogIGFkZFBvcHVwcyhsbmcgPSAtMC43OTAzMSwgbGF0ID0gMzkuNDE0NDcgLCBwb3B1cCA9ICJCdcOxb2wiKSAlPiUNCiAgYWRkUG9wdXBzKGxuZyA9IC0wLjQyNTAwLCBsYXQgPSAzOS4yODQzOSAsIHBvcHVwID0gIkJlbmlmYWlvIikgJT4lDQogIGFkZFBvcHVwcyhsbmcgPSAtMC40MjY2NiwgbGF0ID0gMzkuMTU0NDcgLCBwb3B1cCA9ICJBbHppcmEiKSAlPiUNCiAgYWRkUG9wdXBzKGxuZyA9IC0wLjMwOTUwLCBsYXQgPSAzOS4xOTg2OCAsIHBvcHVwID0gIlN1ZWNhIikgJT4lDQogIHNldFZpZXcobG5nID0gLTAuNSwgbGF0ID0gMzkuNTAwLCB6b29tID0gOC41KSAlPiUgIGFkZFRpbGVzKCkNCm1hcGFDaXVkYWR5UHVlYmxvbWF5b3JpbmNpQWN1DQpgYGAgDQoNCiMjIDMuMyBBRkVDVEFDScOTTiBERUwgQ09WSUQtMTkNCg0KRW4gcHJpbWVyIGx1Z2FyLCBtZSBoZSBjZW50cmFkbyBlbiBsYSBwcmVndW50YSBtw6FzIGLDoXNpY2E6DQoqKsK/RWwgQ09WSUQxOSBoYSBhZmVjdGFkbyBkZSBmb3JtYSBuZWdhdGl2YSBlbiBzdSBuZWdvY2lvPyoqIA0KDQpgYGB7ciwgZXZhbCA9IFRSVUUsIGVjaG8gPSBUUlVFfQ0KYWZlY3RhY2lvbiA8LSBlbmN1ZXN0YSAlPiUgZ3JvdXBfYnkoQUZFQ1RBQ0lPTikgJT4lIHN1bW1hcmlzZShOPW4oKSkgJT4lIG5hLm9taXQoKSAlPiUgbXV0YXRlIChwb3JjZW50YWplPXByb3AudGFibGUoTikqMTAwLCByb3VuZChwb3JjZW50YWplLCAyKSkgDQpncmFmaWNvYWZlY3RhY2lvbiA8LSBnZ3Bsb3QoYWZlY3RhY2lvbiwgYWVzKHg9IiIsIHkgPSByb3VuZChwb3JjZW50YWplLCAyKSwgZmlsbD1BRkVDVEFDSU9OKSkgKyAgICAgZ2VvbV9iYXIoc3RhdCA9ImlkZW50aXR5IiwgY29sb3IgPSAid2hpdGUiKSArIA0KICAgIGdlb21fdGV4dChhZXMobGFiZWwgPSByb3VuZChwb3JjZW50YWplLCAyKSksIHBvc2l0aW9uID0gcG9zaXRpb25fc3RhY2sodmp1c3Q9MC41KSwgY29sb3I9IndoaXRlIiwgc2l6ZSA9IDUsICkgKyANCiAgY29vcmRfcG9sYXIodGhldGEgPSAieSIpICsgDQogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IGMoInN0ZWVsYmx1ZSIsICJyZWQiKSkgKyANCiAgdGhlbWVfdm9pZCgpICsgDQogIGxhYnModGl0bGUgPSAiwr9IYSBhZmVjdGFkbyBkZSBmb3JtYSBuZWdhdGl2YSBlbCBDT1ZJRC0xOSBlbiBzdSBuZWdvY2lvPyIpDQpncmFmaWNvYWZlY3RhY2lvbg0KYGBgDQpDb21vIHBvZGVtb3Mgb2JzZXJ2YXIsIGVsIDkyLjU1JSBkZSBsb3MgZW5jdWVzdGFkb3MgaGEgY29udGVzdGFkbyBxdWUgc8OtIHF1ZSBoYSB0ZW5pZG8gdW5hIGFmZWN0YWNpw7NuIG5lZ2F0aXZhLiBNaWVudHJhcyBxdWUgbG9zIHF1ZSBoYW4gcmVzcG9uZGlkbyBxdWUgbm8sIHJlcHJlc2VudGFuIGxhIG1pbm9yw61hIGRlIGNvbWVyY2lvcywgY2FiZSBkZXN0YWNhciBxdWUgc2UgdHJhdGEgZGUgY29tZXJjaW9zIGxvcyBjdWFsZXMgc2UgY29uc2lkZXJhbiBlc2VuY2lhbGVzIChidXNjYXIgZW4gbGEgdGFibGEgZW4gbGEgY29sdW1uYSBBRkVDVEFDScOTTjogIk5vIikuIA0KDQojIyAzLjQgQUZFQ1RBQ0nDk04gUE9SIFRSSU1FU1RSRVMgDQoNCkVuIGVzdGUgYXBhcnRhZG8gdm95IGEgYW5hbGl6YXIgbWVkaWFudGUgdW4gZ3LDoWZpY28gY29ub2NpZG8gY29tbyBkZSBxdWVzaXRvcywgbGEgcMOpcmRpZGEgZGUgZmFjdHVyYWNpw7NuIGRlIGxvcyBjb21lcmNpb3MgZW4gbG9zIHRyZXMgdHJpbWVzdHJlcyBlbiBsb3MgcXVlIGhhIGVzdGFkbyBwcmVzZW50ZSBsYSBwYW5kZW1pYS4gRXMgZGVjaXIsIGVuIGVsIHNlZ3VuZG8gdHJpbWVzdHJlLCB0ZXJjZXIgdHJpbWVzdHJlIHkgY3VhcnRvIHRyaW1lc3RyZSBkZSAyMDIwLiANCkNvbW8gcG9kZW1vcyBvYnNlcnZhciBsb3MgcmVzdWx0YWRvcyBzb24gYmFzdGFudGUgc2ltaWxhcmVzIGNvbiB1bmEgbGV2ZSBtZWpvcmEgZW4gZWwgdGVyY2VyIHRyaW1lc3RyZSByZXNwZWN0byBhbCBzZWd1bmRvLg0KDQojIyMgMy40LjEgU0VHVU5ETyBUUklNRVNUUkUgREUgMjAyMA0KRW4gZXN0ZSBwcmltZXIgdHJpbWVzdHJlIGFuYWxpemFkbyAoc2VndW5kbyB0cmltZXN0cmUgZGVsIDIwMjApLCBsb3MgcmVzdWx0YWRvcyBtb3N0cmFkb3Mgc29uIHRyZW1lbmRhbWVudGUgbWFsb3MuIFlhIHF1ZSBjb21vIHBvZGVtb3Mgb2JzZXJ2YXIgZWwgNTQsOTYlIGRlIGxvcyBjb21lcmNpb3MgaGFuIHDDqXJkaWRvIG3DoXMgZGVsIDUwJSBkZSBsYSBmYWN0dXJhY2nDs24gcmVzcGVjdG8gYWwgbWlzbW8gdHJpbWVzdHJlIGRlbCBhw7FvIHBhc2Fkby4gDQpQb3IgY29udHJhLCBlbCA4LDU5JSBoYW4gcGVyZGlkbyBzb2xvIGVudHJlIGVsIDAgeSBlbCAxMCUgZGUgZGljaGEgZmFjdHVyYWNpw7NuLiANCg0KYGBge3IsIGV2YWwgPSBUUlVFLCBlY2hvID0gVFJVRX0NCnRyaW1lc3RyZXMgPC0gZW5jdWVzdGEgJT4lIGdyb3VwX2J5KFNFR1VORE9UUklNRVNUUkUpICU+JSBzdW1tYXJpc2UoTj1uKCkpICU+JSBuYS5vbWl0KCkgJT4lIGFycmFuZ2UoZGVzYyhOKSkgJT4lIG11dGF0ZShwb3JjZW50YWplPXByb3AudGFibGUoTikqMTAwLCByb3VuZChwb3JjZW50YWplLCAyKSkNCg0KZ3JhZmljb3RyaW1lc3RyZTIgPC0gZ2dwbG90KHRyaW1lc3RyZXMsIGFlcyh4PSIiLCB5ID0gcm91bmQocG9yY2VudGFqZSwgMiksIGZpbGw9U0VHVU5ET1RSSU1FU1RSRSkpICsgICAgIGdlb21fYmFyKHN0YXQgPSJpZGVudGl0eSIsIGNvbG9yID0gIndoaXRlIikgKyANCiAgICBnZW9tX3RleHQoYWVzKGxhYmVsID0gcm91bmQocG9yY2VudGFqZSwgMikpLCBwb3NpdGlvbiA9IHBvc2l0aW9uX3N0YWNrKHZqdXN0PTAuNSksIGNvbG9yPSJ3aGl0ZSIsIHNpemUgPSA1LCApICsgDQogIGNvb3JkX3BvbGFyKHRoZXRhID0gInkiKSAgKyANCiAgdGhlbWVfdm9pZCgpICsgDQogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IGMoIlNURUVMQkxVRSIsICJCTFVFIiwgIk9SQU5HRSIsICJSRUQiLCJCUk9XTiIsIkdSRUVOIiwgIkRBUktHUkVZIikpKw0KICBsYWJzKHRpdGxlID0gIsK/Q3XDoW50byBoYSB2aXN0byByZWR1Y2lkYSBzdSBmYWN0dXJhY2nDs24gZW4gZWwgMlQyMDIwPyIpDQpncmFmaWNvdHJpbWVzdHJlMiArIHRoZW1lKHBhbmVsLmdyaWQubWFqb3IgPSBlbGVtZW50X2xpbmUobGluZXR5cGUgPSAiYmxhbmsiKSkgK2xhYnMoZmlsbCA9ICJGQUNUVVJBQ0nDk04gUEVSRElEQSIpIA0KYGBgDQoNCiMjIyAzLjQuMiBURVJDRVIgVFJJTUVTVFJFIERFIDIwMjANCkVuIGVsIHRlcmNlciB0cmltZXN0cmUsIHkgY29uIGxhIGxsZWdhZGEgZGVsIHZlcmFubyB5IGxhIGxsYW1hZGEgIk51ZXZhIE5vcm1hbGlkYWQiLCBlc3RhYmxlY2lkYSBlbiBlbCB0ZXJyaXRvcmlvIGVzcGHDsW9sIGEgcGFydGlyIGRlbCBtZXMgZGUgbWF5bywgcGFyZWPDrWEgcXVlIGVsIGxhIGVjb25vbcOtYSBpYmEgYSByZXN1cmdpci4gUGVybyBuYWRhIG3DoXMgbGVqb3MgZGUgbGEgcmVhbGlkYWQsIGxhcyByZXN0cmljY2lvbmVzIHkgbGEgaW5jZXJ0aWR1bWJyZSBkZSBsb3MgY29uc3VtaWRvcmVzIGhpY2llcm9uIHF1ZSBkdXJhbnRlIHRvZG8gZWwgdmVyYW5vIG5vIHNlIGRpZXJhIGxhIHJlY3VwZXJhY2nDs24gZXNwZXJhZGEuIA0KQXVucXVlIGNhYmUgbWVuY2lvbmFyIHF1ZSBzaSBxdWUgc2Ugb2JzZXJ2YSB1biBsaWdlcm8gYXRpc2JvIGRlIG1lam9yYS4gWWEgcXVlIGVuIGVzdGUgY2FzbyBzZSBoYSByZWR1Y2lkbyBtw6FzIGRlIDEwIHB1bnRvcyBwb3JjZW50dWFsZXMgbG9zIGVuY3Vlc3RhZG9zIHF1ZSBpbmRpY2Fyb24gcXVlIHBlcmRpZXJvbiBtw6FzIGRlbCA1MCUgZGUgbGEgZmFjdHVyYWNpw7NuLiANClNpIG5vcyBmaWphbW9zIGVuIGxvcyBlbmN1ZXN0YWRvcyBtZW5vcyBhZmVjdGFkb3MgKDAtMTAlKSwgdmVtb3MgY29tbyBlbiBlc3RlIGNhc28gc29uIHVuIDEzLDM4JSwgY2lmcmEgbGlnZXJhbWVudGUgc3VwZXJpb3IgYSBsYSBkZWwgdHJpbWVzdHJlIGFudGVyaW9yLiANCg0KYGBge3IsIGV2YWwgPSBUUlVFLCBlY2hvID0gVFJVRX0NCnRyaW1lc3RyZXMgPC0gZW5jdWVzdGEgJT4lIGdyb3VwX2J5KFRFUkNFUlRSSU1FU1RSRSkgJT4lIHN1bW1hcmlzZShOPW4oKSkgJT4lIG5hLm9taXQoKSAlPiUgYXJyYW5nZShkZXNjKE4pKSAlPiUgbXV0YXRlKHBvcmNlbnRhamU9cHJvcC50YWJsZShOKSoxMDAsIHJvdW5kKHBvcmNlbnRhamUsIDIpKSANCg0KZ3JhZmljb3RyaW1lc3RyZTMgPC0gZ2dwbG90KHRyaW1lc3RyZXMsIGFlcyh4PSIiLCB5ID0gcm91bmQocG9yY2VudGFqZSwgMiksIGZpbGw9VEVSQ0VSVFJJTUVTVFJFKSkgKyAgICAgZ2VvbV9iYXIoc3RhdCA9ImlkZW50aXR5IiwgY29sb3IgPSAid2hpdGUiKSArIA0KICAgIGdlb21fdGV4dChhZXMobGFiZWwgPSByb3VuZChwb3JjZW50YWplLCAyKSksIHBvc2l0aW9uID0gcG9zaXRpb25fc3RhY2sodmp1c3Q9MC41KSwgY29sb3I9IndoaXRlIiwgc2l6ZSA9IDUsICkgKyANCiAgY29vcmRfcG9sYXIodGhldGEgPSAieSIpICArIA0KICB0aGVtZV92b2lkKCkgKyANCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gYygiU1RFRUxCTFVFIiwgIkJMVUUiLCAiT1JBTkdFIiwgIlJFRCIsIkJST1dOIiwiR1JFRU4iLCAiREFSS0dSRVkiKSkrDQogIGxhYnModGl0bGUgPSAiwr9DdcOhbnRvIGhhIHZpc3RvIHJlZHVjaWRhIHN1IGZhY3R1cmFjacOzbiBlbiBlbCAzVDIwMjA/IikNCmdyYWZpY290cmltZXN0cmUzICsgdGhlbWUocGFuZWwuZ3JpZC5tYWpvciA9IGVsZW1lbnRfbGluZShsaW5ldHlwZSA9ICJibGFuayIpKSArbGFicyhmaWxsID0gIkZBQ1RVUkFDScOTTiBQRVJESURBIikgDQpgYGANCg0KIyMjIDMuNC4zIENVQVJUTyBUUklNRVNUUkUgREUgMjAyMA0KUG9yIMO6bHRpbW8sIGFuYWxpemFtb3MgZWwgw7psdGltbyB0cmltZXN0cmUgZGVsIGHDsW8sIGVsIGN1YWwgbXVlc3RyYSByZXN1bHRhZG9zIG11eSBwYXJlY2lkb3MgYSBsb3MgZGVsIHRyaW1lc3RyZSBhbnRlcmlvci4gDQpFc3RvIHF1aWVyZSBkZWNpciBxdWUgZHVyYW50ZSBlbCB0cmFuc2N1cnNvIGRlbCBhw7FvIGVsIHBlcXVlw7FvIGNvbWVyY2lvIHZhbGVuY2lhbm8gbm8gcHVkbyByZW1vbnRhciBsYSBzaXR1YWNpw7NuIHByb3ZvY2FkYSBwb3IgbGEgY3Jpc2lzIGRlIGxhIHBhbmRlbWlhLCBxdWUgaW1waWRpw7MgZHVyYW50ZSBsYSBncmFuIHBhcnRlIGRlbCBhw7FvIDIwMjAsIHF1ZSBsb3MgY29tZXJjaW9zIGRlc2Fycm9sbGFyw6FuIHN1IGFjdGl2aWRhZCBjb24gdG90YWwgbm9ybWFsaWRhZCB5IHNpbiByZXN0cmljY2lvbmVzLiANCg0KYGBge3IsIGV2YWwgPSBUUlVFLCBlY2hvID0gVFJVRX0NCnRyaW1lc3RyZXMgPC0gZW5jdWVzdGEgJT4lIGdyb3VwX2J5KENVQVJUT1RSSU1FU1RSRSkgJT4lIHN1bW1hcmlzZShOPW4oKSkgJT4lIG5hLm9taXQoKSAlPiUgYXJyYW5nZShkZXNjKE4pKSAlPiUgbXV0YXRlKHBvcmNlbnRhamU9cHJvcC50YWJsZShOKSoxMDAsIHJvdW5kKHBvcmNlbnRhamUsIDIpKQ0KDQpncmFmaWNvdHJpbWVzdHJlNCA8LSBnZ3Bsb3QodHJpbWVzdHJlcywgYWVzKHg9IiIsIHkgPSByb3VuZChwb3JjZW50YWplLCAyKSwgZmlsbD1DVUFSVE9UUklNRVNUUkUpKSArICAgICBnZW9tX2JhcihzdGF0ID0iaWRlbnRpdHkiLCBjb2xvciA9ICJ3aGl0ZSIpICsgDQogICAgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IHJvdW5kKHBvcmNlbnRhamUsIDIpKSwgcG9zaXRpb24gPSBwb3NpdGlvbl9zdGFjayh2anVzdD0wLjUpLCBjb2xvcj0id2hpdGUiLCBzaXplID0gNSwgKSArIA0KICBjb29yZF9wb2xhcih0aGV0YSA9ICJ5IikgICsgDQogIHRoZW1lX3ZvaWQoKSArIA0KICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBjKCJTVEVFTEJMVUUiLCAiQkxVRSIsICJPUkFOR0UiLCAiUkVEIiwiQlJPV04iLCJHUkVFTiIsICJEQVJLR1JFWSIpKSsNCiAgbGFicyh0aXRsZSA9ICLCv0N1w6FudG8gaGEgdmlzdG8gcmVkdWNpZGEgc3UgZmFjdHVyYWNpw7NuIGVuIGVsIDRUMjAyMD8iKQ0KZ3JhZmljb3RyaW1lc3RyZTQgKyB0aGVtZShwYW5lbC5ncmlkLm1ham9yID0gZWxlbWVudF9saW5lKGxpbmV0eXBlID0gImJsYW5rIikpICtsYWJzKGZpbGwgPSAiRkFDVFVSQUNJw5NOIFBFUkRJREEiKQ0KYGBgDQoNCg0KIyMgMy41IERJR0lUQUxJWkFDScOTTiBERUwgUEVRVUXDkU8gQ09NRVJDSU8NCg0KRW4gZXN0ZSBwdW50bywgdm95IGEgaGFibGFyIGRlIHVub3MgZGUgbG9zIG1heW9yZXMgcHJvYmxlbWFzIGRlbCBwZXF1ZcOxbyBjb21lcmNpbyB5IGRlbCBjb21lcmNpbyB0cmFkaWNpb25hbCBlbiBnZW5lcmFsLCAqKmxhIGRpZ2l0YWxpemFjacOzbioqLiBZIGVzIHF1ZSBlbiBtdWNob3MgY2Fzb3MsIGVsIGNvbWVyY2lvIHRyYWRpY2lvbmFsIGhhIHNpZG8gc29icmVwYXNhZG8gcG9yIGxhcyBudWV2YXMgdGVjbm9sb2fDrWFzLCB5YSBxdWUgYWN0dWFsbWVudGUsIGVzIGRpZmljaWwgdmVyIHBvciBlamVtcGxvLCB1bmEgY2FybmljZXLDrWEgbyB2ZXJkdWxlcsOtYSBkZSB1biBtZXJjYWRvIG11bmljaXBhbCB2ZW5kaWVuZG8gc3VzIHByb2R1Y3RvcyBlbiBpbnRlcm5ldC5DdWxwYSBkZSBlbGxvIGxvIHRpZW5lbiB0YW1iacOpbiBsYXMgZ3JhbmRlcyB0ZWNub2zDs2dpY2FzIGNvbW8gQW1hem9uLCBsYXMgY3VhbGVzIGhhbiBoZWNobyBxdWUgbm9zIGFjb3N0dW1icmVtb3MgYSBpciBkZSBjb21wcmFzIGEgZ29scGUgZGUgImNsaWNrIiBkZXNkZSBlbCBzb2bDoSBkZSBudWVzdHJhIGNhc2EsIGFiYW5kb25hbmRvIGVuIGNpZXJ0byBtb2RvIGVsIGNvbWVyY2lvIGRlbCBiYXJyaW8gZGUgdG9kYSBsYSB2aWRhLiANCg0KYGBge3IsIGV2YWwgPSBUUlVFLCBlY2hvID0gVFJVRX0NCmRpZ2l0YWxpemFjaW9uIDwtIGVuY3Vlc3RhICU+JSBncm91cF9ieShWRU5UQV9PTkxJTkUpICU+JSBzdW1tYXJpc2UgKE49bigpKSAlPiUgbmEub21pdCgpDQpncmFmaWNvZGlnaXRhbGl6YWNpb24gPC0gZ2dwbG90KGRpZ2l0YWxpemFjaW9uLCBhZXMoeD0gVkVOVEFfT05MSU5FLCB5PU4pKSArIGdlb21fYmFyKHN0YXQgPSAiaWRlbnRpdHkiLCBmaWxsID0ic3RlZWxibHVlIikgKyB0aGVtZV9taW5pbWFsKCkNCmdyYWZpY29kaWdpdGFsaXphY2lvbiArIHRoZW1lKHBhbmVsLmdyaWQubWFqb3IgPSBlbGVtZW50X2xpbmUobGluZXR5cGUgPSAiYmxhbmsiKSwgDQogICAgcGFuZWwuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gTkEpLCANCiAgICBwbG90LmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoY29sb3VyID0gTkEpKSArbGFicyh0aXRsZSA9ICLCv1N1IG5lZ29jaW8gZGlzcG9uZSBkZSB1biBzZXJ2aWNpbyBkZSB2ZW50YSBvbmxpbmU/IiwgDQogICAgeCA9ICLCv1ZlbnRhIE9ubGluZT8iLCB5ID0gIk7Dum1lcm8gZGUgY29tZXJjaW9zIikNCmBgYA0KQ29tbyBoZSBkaWNobyBhbnRlcmlvcm1lbnRlLCB5IGNvbW8gbXVlc3RyYW4gbG9zIHJlc3VsdGFkb3MsIGFjdHVhbG1lbnRlIGxhIGZhbHRhIGRlIGRpZ2l0YWxpemFjacOzbiBlbiBlbCBzZWN0b3IgY29tZXJjaWFsIHZhbGVuY2lhbm8gZXMgdW4gcmV0byBxdWUgaGF5IHF1ZSBhYm9yZGFyLiBZIGVzIHF1ZSBtw6FzIGRlIDMwMCBjb21lcmNpb3Mgc29uIGxvcyBxdWUgaGFuIGNvbnRlc3RhZG8gcXVlIG5vIGRpc3BvbmVuIGRlIHNlcnZpY2lvIGRlIHZlbnRhIG9ubGluZSwgbWllbnRyYXMgcXVlIHNvbG8gdW4gcG9jbyBtw6FzIGRlIDE1MCBoYW4gc2lkbyBsb3MgcXVlIGhhbiBjb250ZXN0YWRvIHF1ZSBzw60uIA0KDQojIyAzLjYgQVlVREFTIEFMIFBFUVVFw5FPIENPTUVSQ0lPDQoNCkR1cmFudGUgbGEgcGFuZGVtw61hLCBsb3MgZ29iaWVybm9zIGhhbiB0ZW5pZG8gcXVlIHJlY3VycmlyIGEgY2llcnRhcyBheXVkYXMgZGUgYXBveW8gYSBsb3MgZW1wcmVzYXJpb3MgeSBhdXTDs25vbW9zLCB5YSBxdWUgYW50ZSBsYSBvYmxpZ2FjacOzbiBkZSB0ZW5lciBxdWUgY2VycmFyIG9ibGlnYXRvcmlhbWVudGUsIGVsIGdvYmllcm5vIHR1dm8gcXVlIGFwb3lhciBhIGxvcyB0cmFiYWphZG9yZXMgZGUgZGljaG9zIGNvbWVyY2lvcy4NCkRpY2hhcyBheXVkYXMgcG9kZW1vcyBjb25zdWx0YXJsYXMgZW4gbGEgcMOhZ2luYSB3ZWIgZGUgbGEgW0NvbnNlbGxlcmlhIGQnRWNvbm9taWEgZGUgbGEgR2VuZXJhbGl0YXQgVmFsZW5jaWFuYV0oaHR0cDovL3d3dy5pbmRpLmd2YS5lcy9lcy93ZWIvY29tZXJjaW8vaW5jZW50aXZvcykuDQoNCmBgYHtyLCBldmFsID0gVFJVRSwgZWNobyA9IFRSVUV9DQpheXVkYXMgPC0gZW5jdWVzdGEgJT4lIGdyb3VwX2J5KEFZVURBUykgJT4lIHN1bW1hcmlzZShyZXNwdWVzdGFzID0gbigpKSAlPiUgbmEub21pdCgpDQpncmFmaWNvYXl1ZGFzIDwtIGdncGxvdChheXVkYXMsIGFlcyh4PSBBWVVEQVMsIHk9IHJlc3B1ZXN0YXMpKSArIGdlb21fYmFyKHN0YXQgPSAiaWRlbnRpdHkiLCBmaWxsID0gInN0ZWVsYmx1ZSIpICsgbGFicyh0aXRsZSA9ICLCv0hhIHNvbGljaXRhZG8gYXl1ZGFzIGEgbGFzIEFBUFAgYW50ZSBsYSBjcmlzaXMgZGVsIENPVklEMTk/IikgKyB0aGVtZV9taW5pbWFsKCkgKyBnZW9tX3RleHQoYWVzKGxhYmVsPXJlc3B1ZXN0YXMpLCBwb3NpdGljaW9uID0gcG9zaXRpb25fc3RhY2sodmp1c3QgPSAwLjUpLCBjb2xvciA9ICJibGFjayIsIHNpemUgPSA0KQ0KZ3JhZmljb2F5dWRhcw0KYGBgDQpDb21vIHZlbW9zLCAzODYgaGFuIHNvbGljaXRhZG8gYXl1ZGFzLCBtaWVudHJhcyBxdWUgNDQgZGUgbG9zIHF1ZSBzaSBxdWUgaGFuIHNvbGljaXRhZG8sIG5vIGxhcyBoYWJpYW4gcmVjaWJpZG8gZW4gZWwgbW9tZW50byBkZSBsYSBjb250ZXN0YWNpw7NuIGRlIGxhIGVuY3Vlc3RhLiBQb3Igc3UgcGFydGUgMTQ3IGNvbWVyY2lhbnRlcyBubyBwaWRpZXJvbiBuaW5nw7puIHRpcG8gZGUgYXl1ZGEuIA0KDQpFbiBlbCBzaWd1aWVudGUgZ3LDoWZpY28sIGhlbW9zIHByZWd1bnRhZG86ICoqwr9MZSBwYXJlY2VuIHN1ZmljaWVudGVzIGxhcyBheXVkYXMgcmVjaWJpZGFzIHBvciBsYXMgQUFQUD8qKi4gUHJlZ3VudGEsIGEgbGEgcXVlIGNvbW8gZXMgZGUgZXNwZXJhciBjdWFuZG8gYWxndWllbiB0aWVuZSBxdWUgdmFsb3JhciBsYSBjdWFudMOtYSBkZSB1bmEgYXl1ZGEgZWNvbsOzbWljYSwgaGFuIHJlc3BvbmRpZG8gZGUgZm9ybWEgbWF5b3JpdGFyaWEgcXVlIG5vIGhhbiBzaWRvIHN1ZmljaWVudGVzLiANCg0KYGBge3IsIGV2YWwgPSBUUlVFLCBlY2hvID0gVFJVRX0NCmF5dWRhczEgPC0gZW5jdWVzdGEgJT4lIGdyb3VwX2J5KEFZVURBX1NVRklDSUVOVEUpICU+JSBzdW1tYXJpc2UocmVzcHVlc3RhcyA9IG4oKSkgJT4lIG5hLm9taXQoKSAlPiUgbXV0YXRlKHBvcmNlbnRhamU9cHJvcC50YWJsZShyZXNwdWVzdGFzKSoxMDAsIHJvdW5kKHBvcmNlbnRhamUsIDIpKQ0KZ3JhZmljb2F5dWRhczEgPC0gZ2dwbG90KGF5dWRhczEsIGFlcyh4PSIiLCB5ID0gcm91bmQocG9yY2VudGFqZSwgMiksIGZpbGw9QVlVREFfU1VGSUNJRU5URSkpICsNCiAgICBnZW9tX2JhcihzdGF0ID0iaWRlbnRpdHkiLCBjb2xvciA9ICJ3aGl0ZSIpICsNCiAgICBnZW9tX3RleHQoYWVzKGxhYmVsID0gcm91bmQocG9yY2VudGFqZSwgMikpLCBwb3NpdGlvbiA9IHBvc2l0aW9uX3N0YWNrKHZqdXN0PTAuNSksIGNvbG9yPSJ3aGl0ZSIsIHNpemUgPSA1LCApICsNCiAgY29vcmRfcG9sYXIodGhldGEgPSAieSIpICsgdGhlbWVfdm9pZCgpICANCmdyYWZpY29heXVkYXMxK2xhYnModGl0bGUgPSAiwr9Db25zaWRlcmEgc3VmaWNpZW50ZXMgbGFzIGF5dWRhcyByZWNpYmlkYXM/IikNCmBgYA0KDQojIyAzLjcgQ0lFUlJFIERFIExPUyBDT01FUkNJT1MgREVCSURPIEEgTEEgUEFOREVNSUENCg0KQ29tbyBoZSBtZW5jaW9uYWRvIGFudGVyaW9ybWVudGUsIGxvcyBuZWdvY2lvcyBzZSB2aWVyb24gb2JsaWdhZG9zIGEgY2VycmFyIGVuIGxhIHByaW1lcmEgb2xhIGRlIGxhIHBhbmRlbWlhIGRlYmlkbyBhIGxhcyByZXN0cmljY2lvbmVzIGRlIG1vdmlsaWRhZCBpbXB1ZXN0YXMgcG9yIGVsIGdvYmllcm5vIGNlbnRyYWwuIA0KRXN0ZSBjaWVycmUgZnVlIGVuIGNpZXJ0YSBtZWRpZGEgYXNpbcOpdHJpY28geSBkZXBlbmRpw7MgcHJpbmNpcGFsbWVudGUgZGVsIHRpcG8gZGUgbmVnb2Npby4gDQoNCmBgYHtyLCBldmFsID0gVFJVRSwgZWNobyA9IFRSVUV9DQpjaWVycmUgPC0gZW5jdWVzdGEgJT4lIGdyb3VwX2J5KFRJRU1QT19DRVJSQURPKSAlPiUgc3VtbWFyaXNlKG9ic2VydmFjaW9uZXMgPSBuKCkpICU+JSBuYS5vbWl0KCkgJT4lIGFycmFuZ2UoLW9ic2VydmFjaW9uZXMpDQpncmFmaWNvY2llcnJlIDwtIGdncGxvdChjaWVycmUsIGFlcyh4ID0gVElFTVBPX0NFUlJBRE8sIHkgPSBvYnNlcnZhY2lvbmVzKSkgKyANCiAgICAgICAgZ2VvbV9iYXIoc3RhdCA9ICJpZGVudGl0eSIsIGZpbGwgPSAiYnJvd24iKSArDQogICAgICAgIGxhYnModGl0bGUgPSAiwr9DdcOhbnRvIHRpZW1wbyBoYSBlc3RhZG8gc3UgbmVnb2NpbyBjZXJyYWRvIGRhZGEgbGEgY3Jpc2lzIGRlbCBDT1ZJRDE5PyIsIHggPSAiVGllbXBvIGNlcnJhZG8iLCB5ID0gIk9ic2VydmFjaW9uZXMiKSArIHRoZW1lX21pbmltYWwoKQ0KZ3JhZmljb2NpZXJyZQ0KYGBgDQoNCkNvbW8gb2JzZXJ2YW1vcywgbGEgZ3JhbiBtYXlvcsOtYSBkZSBjb21lcmNpb3MgZXN0dXZpZXJvbiBjZXJyYWRvcyBkb3MgbWVzZXMgbyBtw6FzLiBzaWVuZG8gdW4gdG90YWwgZGUgbcOhcyBkZSA0MDAgZW5jdWVzdGFkb3MgbG9zIHF1ZSBlc3R1dmllcm9uIGNlcnJhZG9zIGRpY2hvIHRpZW1wby4NClBvciBjb250cmEgbWVub3MgZGUgNzUgY29tZXJjaW9zIGhhbiBlc3RhZG8gY2VycmFkb3MgdW4gbWVzIG8gbWVub3MuIEVzdG9zIHJlc3VsdGFkb3MgYXJyb2phbiB1bmEgc2l0dWFjacOzbiBtw6FzIHF1ZSBwcmVvY3VwYW50ZSwgeWEgcXVlIGVsIGNvbWVyY2lvIHZhbGVuY2lhbm8gZXN0w6Egc3VmcmllbmRvIHNlcmlhcyBkaWZpY3V0bGFkZXMgcGFyYSByZW1vbnRhciBkaWNoYSBzaXR1YWNpw7NuIG5lZ2F0aXZhLiANCg0KDQpDb24gbG9zIHJlc3VsdGFkb3Mgb2J0ZW5pZG9zLCBlc3TDoSBjbGFybyBxdWUgbXVjaG9zIGRlIGxvcyBlbmN1ZXN0YWRvcyBoYW4gdGVuaWRvIHNlcmlhcyBkaWZpY3VsdGFkZXMgZWNvbsOzbWljYXMgZGFkYXMgbGFzIHJlc3RyaWNjaW9uZXMgcXVlIG9ibGlnYWJhbiBhIGNlcnJhciBjdWFscXVpZXIgbmVnb2NpbyBjb25zaWRlcmFkbyBubyBlc2VuY2lhbC4gDQpBbnRlIGVzdG9zIHJlc3VsdGFkb3MgZG9uZGUgaGVtb3MgdmlzdG8gcXVlIGdyYW4gY2FudGlkYWQgZGUgbmVnb2Npb3MgaGFuIHBlcm1hbmVjaWRvIGNlcnJhZG9zIHVuIHRpZW1wbyBtw6FzIHF1ZSBzaWduaWZpY2F0aXZvLiBFcyBpbmV2aXRhYmxlIGFuYWxpemFyIGxhIGN1ZXN0acOzbiBkZSBjdcOhbnRvcyBkZSBlbGxvcyBzZSBoYW4gcGxhbnRlYWRvIGVsIGNpZXJyZSBkZSBzdXMgbmVnb2Npb3MgZGFkYSBsYSBzaXR1YWNpw7NuLiANCg0KYGBge3IsIGVjaG8gPSBUUlVFLCBldmFsID0gVFJVRX0NCmNlc2UgPC0gZW5jdWVzdGEgJT4lIGdyb3VwX2J5KENJRVJSRSkgJT4lIHN1bW1hcmlzZShvYnNlcnZhY2lvbmVzID0gbigpKSAlPiUgbmEub21pdCgpICU+JSBtdXRhdGUocG9yY2VudGFqZT1wcm9wLnRhYmxlKG9ic2VydmFjaW9uZXMpKjEwMCwgcm91bmQocG9yY2VudGFqZSwgMikpDQoNCmdyYWZpY29jZXNlIDwtICBnZ3Bsb3QoY2VzZSwgYWVzKHg9IiIsIHkgPSByb3VuZChwb3JjZW50YWplLCAyKSwgZmlsbD1DSUVSUkUpKSArDQogICAgZ2VvbV9iYXIoc3RhdCA9ImlkZW50aXR5IiwgY29sb3IgPSAid2hpdGUiKSArDQogICAgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IHJvdW5kKHBvcmNlbnRhamUsIDIpKSwgcG9zaXRpb24gPSBwb3NpdGlvbl9zdGFjayh2anVzdD0wLjUpLCBjb2xvcj0id2hpdGUiLCBzaXplID0gNSwgKSArDQogIGNvb3JkX3BvbGFyKHRoZXRhID0gInkiKSArIHRoZW1lX3ZvaWQoKSANCmdyYWZpY29jZXNlICsgbGFicyAodGl0bGUgPSAiwr9TZSBoYSBwbGFudGVhZG8gY2VycmFyIGRlIGZvcm1hIHBlcm1hbmVudGUgc3UgbmVnb2NpbyBkYWRhIGxhIHNpdHVhY2nDs24/IikNCmBgYA0KRW4gZXN0ZSBncsOhZmljbyBzZSBtdWVzdHJhIHVuYSByZWFsaWRhZCBtw6FzIHF1ZSBwcmVjdXBhbnRlLCB5YSBxdWUgZWwgNDUlIGRlIGxvcyBlbmN1ZXN0YWRvcyBoYW4gY29udGVzdGFkbyBxdWUgc2UgaGFuIHBsYW50ZWFkbyBjZXJyYXIgZGUgZm9ybWEgcGVybWFuZW50ZSBzdSBuZWdvY2lvLiANCkVzdG8gcmVmbGVqYSBxdWUgbGEgc2l0dWFjacOzbiBkZWwgcGVxdWXDsW8gY29tZXJjaW8gdmFsZW5jaWFubyBlcyBnZW5lcmFsbWVudGUgcG9jbyBzb2x2ZW50ZSB5IGNvbiBwb2NvIG1hcmdlbiBkZSBtYW5pb2JyYS4gDQoNCiMjIDMuOCBDQU1QQcORQSBERSBOQVZJREFEDQoNCkFudGUgbGFzIGRpZmljdWx0YWRlcyBzdWZyaWRhcyBlbiBsYSBwcmltZXJhIG1pdGFkIGRlbCBhw7FvIDIwMjAsIGxhIGNhbXBhw7FhIGRlIE5hdmlkYWQgdGVuw61hIHVuYSBpbXBvcnRhbmNpYSBlbiBhbGd1bm9zIGNhc29zIHZpdGFsIHBhcmEgZWwgY29tZXJjaW8gdmFsZW5jaWFubywgeWEgcXVlIHBvZMOtYSBzZXIgbGEgY2xhdmUgcGFyYSByZW1vbnRhciBsb3MgcmVzdWx0YWRvcyBlY29uw7NtaWNvcyB0YW4gbWFsb3MgZGUgbG9zIG1lc2VzIGFudGVyaW9yZXMuDQoNCmBgYHtyLCBlY2hvID0gVFJVRSwgZXZhbCA9IFRSVUV9DQpuYXZpZGFkIDwtIGVuY3Vlc3RhICU+JSBncm91cF9ieShJTVBPUlRBTkNJQV9OQVZJREFEKSAlPiUgc3VtbWFyaXNlKGltcG9ydGFuY2lhID0gbigpKSAlPiUgbmEub21pdCgpDQpncmFmaWNvbmF2aWRhZCA8LSBnZ3Bsb3QobmF2aWRhZCwgYWVzKHggPSBJTVBPUlRBTkNJQV9OQVZJREFELCB5ID0gaW1wb3J0YW5jaWEpKSArIA0KICAgICAgICBnZW9tX2JhcihzdGF0ID0gImlkZW50aXR5IiwgZmlsbCA9ICJyZWQiKSArDQogICAgICAgIGxhYnModGl0bGUgPSAiwr9RdcOpIGltcG9ydGFudGUgdmEgYSBzZXIgbGEgY2FtcGHDsWEgZGUgTmF2aWRhZCBlbiBzdSBOZWdvY2lvPyIsIHggPSAiSW1wb3J0YW5jaWEgY2FtcGHDsWEgTmF2aWRhZCIsIHkgPSAib2JzZXJ2YWNpb25lcyIpICsgdGhlbWVfbWluaW1hbCgpDQpncmFmaWNvbmF2aWRhZA0KYGBgDQpDb21vIHBvZGVtb3MgY29tcHJvYmFyIGVuIGVsIGdyw6FmaWNvLCBsYSBtYXlvcsOtYSBkZSBsYXMgY29udGVzdGFjaW9uZXMgZXMgcXVlIGxhIGNhbXBhw7FhIGRlIE5hdmlkYWQgZXJhIG11eSBpbXBvcnRhbnRlIG8gaW1wb3J0YW50ZSBwYXJhIHN1IGNvbWVyY2lvLiANCkFob3JhIGJpZW4sIHNhYmllbmRvICphIHBvc3RlcmlvcmkqIGNvbW8gaGEgaWRvIGRpY2hhIGNhbXBhw7FhLCBlcyBkZSBlc3BlcmFyIHF1ZSBlbCBwZXF1ZcOxbyBjb21lcmNpbyB2YWxlbmNpYW5vIGVzdMOpIHBhc2FuZG8gdW4gY29taWVuem8gZGUgYcOxbyAyMDIxIGVjb27Ds21pY2FtZW50ZSBjb21wbGljYWRvLiANCg0KIyA0LiBDT05DTFVTSU9ORVMNCg0KQSBtb2RvIGRlIGNvbmNsdXNpw7NuLCBjb21vIGhlbW9zIHZpc3RvIGEgbG8gbGFyZ28gZGUgZXN0ZSB0cmFiYWpvLCBlbCBwZXF1ZcOxbyBjb21lcmNpbyB2YWxlbmNpYW5vIGhhIHNpZG8gdW4gc2VjdG9yIGVsIGN1YWwgaGEgc2lkbyBtdXkgY2FzdGlnYWRvIHBvciBsYSBjcmlzaXMgZWNvbsOzbWljYSBwcm92b2NhZGEgcG9yIGxhIHBhbmRlbWlhIGRlbCBDT1ZJRDE5LiANCkVsIHRpZW1wbyBxdWUgdHV2aWVyb24gcXVlIGNlcnJhciBjb21vIHN1IHNpdHVhY2nDs24gcHJldmlhIGRlIGZhbHRhIGRlIGxpcXVpZGV6IGV4Y2VzaXZhIHkgZGUgc29sdmVuY2lhLCBoaWNpZXJvbiBxdWUgYW50ZSBkaWNoYSBjcmlzaXMgbG9zIGNvbWVyY2lvcyBubyBlc3R1dmllcmFuIHRvZG8gbG8gYmllbiBkZSBwcmVwYXJhZG9zIHF1ZSBsYSBzaXR1YWNpw7NuIHJlcXVlcsOtYS4gDQpEZSB0b2RhcyBmb3JtYXMgbGFzIGF5dWRhcyBkZSBsb3MgZGlmZXJlbnRlcyBnb2JpZXJub3MsIGF1bnF1ZSBlbiBtdWNob3MgY2Fzb3MsIHNlIGhhbiBjb25zaWRlcmFkbyBpbnN1ZmljaWVudGVzLCBoYW4gYXl1ZGFkbyBhIG1pdGlnYXIgZWwgaW1wYWN0byBuZWdhdGl2byBkZSBsYSBjcmlzaXMuIA0KDQoNCiMgNS4gQklCTElPR1JBRsONQQ0KDQoqW3dlYiBkZWwgcHJvZmVzb3JdKGh0dHBzOi8vcGVyZXpwNDQuZ2l0aHViLmlvL2ludHJvLWRzLTIwLTIxLXdlYi8wNS1zbGlkZXMuaHRtbCkuDQoNCipbcMOhZ2luYSBkw7NuZGUgYXByZW5kZXIgYSBoYWNlciBncsOhZmljb3MgZGUgcXVlc2l0b3NdKGh0dHBzOi8vcnB1YnMuY29tL2x1aXNfYm9sYW5vcy81Mzc4OTkpLg0K