Resultados
3 Modelos fueron ocupados: xgboost, regresión logista y k-nearest neighbors (knn).
El modelo xgboost tuvo la mejor performance con un roc auc de 0.8918.
La variable de más importancia para predecir si un hogar se encuentra en situación de pobreza es el precio del arriendo en el barrio en que viven las familias.
Las variables relacionadas al trabajo son cruciales. En específico el número de personas ocupadas e inactivas del hogar.
Ciertas características del jefe del hogar como: la edad, años de escolaridad, si trabajan en el sector formal o informal y el estado de salud en los últimos 12 meses son trascendentales.
La condición de tenencia de la vivienda es importante, en específico, si las personas, son propietarios, arriendan o si ocupan la casa de manera irregular.
La composición del hogar es fundamental: El número de personas que viven en la vivienda y la presencia de mayores de 60 años o menores de edad.
Introducción

Muchas veces es difícil saber el ingreso real que las personas tienen cuando se realizan encuestas, más aún cuando existen circunstancias complejas como la crisis sanitaria vivida en 2020. Sin buenos datos sobre ingreso es muy difícil intentar saber cuál es el nivel de pobreza real que existe en una unidad territorial. Por esto recurrí a la encuesta CASEN 2020. La Encuesta de Caracterización Socioeconómica Nacional, CASEN, es realizada por el Ministerio de Desarrollo Social de Chile. Uno de sus objetivos es tener información que permita conocer periódicamente la situación de los hogares y de la población, especialmente de aquella en situación de pobreza y de aquellos grupos definidos como prioritarios por la política social. Es importante mencionar que la línea de pobreza varia dependiendo del número de personas que componen un hogar. Si los ingresos de una familia están por debajo de este valor se considera que una familia es pobre. Aquí una tabla con los valores de la línea de pobreza de acuerdo con el número de miembros del hogar.
| Number Of People by Household |
Poverty Line (US Dollars) |
| 1 |
218 |
| 2 |
355 |
| 3 |
475 |
| 4 |
578 |
| 5 |
675 |
| 6 |
767 |
| 7 |
855 |
| 8 |
939 |
| 9 |
1020 |
| 10 |
1097 |
Mi objetivo es intentar predecir, a través de modelos de clasificación, cuando una familia está en situación de pobreza sin mirar a datos de ingreso. Con tal meta elimine de la base de datos todas las preguntas relacionadas a ingreso e intente, con el resto de las variables (salud, vivienda, trabajo, educación, etc.), predecir a través de varios métodos (xgboost, regresión logista, knn) cuando una familia es pobre y cuando no lo es. El objetivo es intentar, en circunstancias en las que tener datos de ingreso sea complejo, establecer que variables son importantes para predecir la situación de pobreza de un hogar.
Descripción de los datos
La encuesta CASEN tiene 7 temáticas. La primera se llama “registro de residentes” este módulo registra información para la identificación de las personas, como, por ejemplo: sexo, edad, estado civil, etc. La segunda es sobre educación, aquí se incluye un conjunto de preguntas que permite estimar indicadores como los niveles de escolaridad de la población y la incidencia de la población no incorporada al sistema educativo. Un tercer tópico tiene que ver con el trabajo, este consta de preguntas que permiten: estimar indicadores sobre la situación ocupacional de la población (tasa de participación, tasa de desocupación, tasa de ocupación) y caracterizar la situación laboral de la fuerza de trabajo ocupada: sector económico en el que trabajan, que tipo de contrato laboral tienen, tipo de ocupación, etc.
El cuarto trata sobre ingresos, incluye preguntas que permiten recoger información sobre las diferentes corrientes de ingreso que reciben las personas y los hogares. El quinto trata sobre salud, consta de un conjunto de preguntas que permite estimar indicadores tales como la cobertura de los sistemas previsionales de salud; el acceso efectivo a servicios y atenciones de salud y el estado de salud de los encuestados. El sexto es sobre identidades, incluye preguntas que permiten estimar indicadores como pertenencia a pueblos originarios o indígenas y migración internacional. Además, incorpora un conjunto de preguntas para medir inseguridad alimentaria, de acuerdo con la escala internacional recomendada por la FAO.
El último tópico tiene que ver con vivienda, se compone de preguntas que permiten estimar indicadores sobre algunas de las características básicas de las viviendas en el país, como su tipo, tenencia y el precio de arriendo de viviendas similares en el entorno, así como las condiciones de habitabilidad de sus hogares, tales como: saneamiento de la vivienda, allegamiento y hacinamiento. La lista completa de las variables puede ser revisada aquí
Tratamiento de las variables
En primer lugar, fueron eliminadas todas las variables de ingreso y aquellas variables categóricas que poseían más de 30 niveles. Luego se filtraron solo las observaciones que pertenecían a jefes del hogar (para poder tener una variable por hogar y porque la base de datos, al ser tan grande, provocaba que entrenar los datos tomara mucho tiempo). Para las variables categóricas con NA’s se creó una categoría unknown. Además, se transformaron todas las variables categóricas en variables dummies. Se imputo las observaciones NA’s de las variables numéricas ocupando la mediana. Además, estas variables fueron transformadas a logaritmo y luego normalizadas.
Análisis Exploratorio

Lo primero que hice fue revisar variables demográficas de los jefes de hogar con el fin de detectar alguna relación con la pobreza. Si uno observa el grafico es claro que existen ciertos grupos en los que pareciera que la pobreza fuera algo más recurrente. Hogares donde el jefe de hogar es joven, inmigrante, indígena o mujer suelen ser más pobres que sus contrapartes. Además, los hogares en sectores rurales tienen una mayor proporción de pobreza que aquellos hogares de sectores urbanos. Algo que llama la atención es que más del 20% de los hogares en donde el jefe de hogar es inmigrante están en situación de pobreza. Los datos fueron recolectados durante la pandemia y hay que tener presente que mucha de la ayuda que el Estadio entrego a las familias para aliviar el peso de la pandemia no fue recibida por los inmigrantes, por lo tanto, no es posible saber si bajo condiciones normales este grupo también es en el que hay una mayor proporción de hogares pobres.
Pareciera que mientras más joven sea el jefe del hogar existe una mayor proporción de personas pobres. Es un poco difícil encontrar una razón clara, puede ser la pandemia afectó de mayor manera el empleo joven. En nuestra base hay muy pocas variables numéricas, vamos a explorar algunas ellas a continuación.

Es posible constatar claras diferencias en 3 de las 4 variables de graficamos. Pareciera que la edad (como vimos anteriormente) y los años de escolaridad del jefe hogar; junto con el número de personas que trabajan en un hogar tienen un efecto sobre la pobreza. No se puede afirmar lo mismo del número de personas que viven en un hogar.
Miremos ahora otras variables que pueden ser interesantes.
Cuando miramos a la pobreza según el tipo de tenencia del hogar es evidente que las personas que están arrendando y las que ocupan ilegalmente un hogar suelen tener una mayor proporción de pobres. En el caso de los que arrienda una porción de sus ingresos se tiene que ir a pagar el arriendo y, por lo tanto, no puede ser gastada en bienes de primera necesidad. En el caso de las personas que ocupan ilegalmente una propiedad la situación es la misma, incluso probablemente están en una situación económica más apremiante que las personas que arriendan.
Otra variable importante es el tratamiento médico, en particular cuando el jefe de hogar responde que no saben o no recuerdan si es que recibió tratamiento médico durante los últimos 12 meses. Es probable que las personas que sufran algún tipo de enfermedad con un alto estigma social prefieran dar este tipo de respuesta. La otra alternativa es que el responder que no saben o no recuerdan sea, en sí mismo, una señal de alguna condición de salud que afecta de alguna manera la capacidad de recibir ingresos de una persona.
Otra variable interesante es el precio del arriendo que se paga en el barrio en el que viven las familias. Este valor se consigue preguntándole a las personas directamente: ¿Cuánto se paga de arriendo en este sector? A continuación, un gráfico con las distribuciones para las personas pobres y no pobres. Es evidente que las personas no pobres viven en barrios en donde el arriendo es más caro que los barrios en donde viven las familias pobres.
Resultados
Probamos distintos modelos ocupando xgboost, regresión logista y k-nearest neighbors (knn). El que tuvo la mejor performance fue el xgboost con un roc auc de 0.8918. Este modelo fue validado con esquema k-fold cross validation, con k=5. Ocupamos 1000 árboles como default. Los hiperparámetros que nos entregaron los mejores resultados fueron los siguientes:
| mtry |
min_n |
tree_depth |
learn_rate |
loss_reduction |
sample_size |
| 67 |
14 |
6 |
0.0140818 |
1.906337e-10 |
0.6928669 |
Estas son las variables más importantes de este modelo

En rasgos generales, hay un grupo de variables que tienen que ver con la tenencia del hogar, es decir si es que la casa que se habita es propia, se arrienda u otros. En este grupo están las variables V13 y ten_viv. Un segundo grupo tiene relación con el aspecto laboral del hogar, ejemplo de esto son las variables n_ocupados y n_inactivos. Es importante mencionar que los inactivos no son las personas desempleadas. Los inactivos son las personas de 15 o más años, que no estaban ocupadas durante la semana que se hizo la encuesta pero que tampoco habían buscado un puesto de trabajo durante las últimas cuatro semanas a la encuesta. En este grupo pueden caer estudiantes o personas que tengan algún problema de salud. Otra variable relacionada al ámbito laboral es ocup_inf, que especifica si es que el jefe del hogar está trabajando de manera informal o formal.
Un tercer grupo está vinculado a características del jefe del hogar, aquí tenemos los años de escolaridad, representados por esc2 y esc, la edad, edad y si recibió tratamiento médico en los últimos 12 meses s28. Un cuarto grupo de variables tienen relación con la composición del hogar: la presencia de menores de edad men18c, de personas mayores de 60 años may60c y el número de personas que habita el hogar: numviv, tot_per, numper y p6. Por último, sin estar claramente relacionada a los grupos anteriores, pareciera ser que la variable más importante es la v19, este corresponde al valor que las personas reportan cuando se les pregunta: ¿Cuánto se paga de arriendo en este sector?
Conclusiones
Primero que todo, es importante entender que estos datos fueron recolectados durante la pandemia, por lo cual las conclusiones que alcanzamos aquí quizás no son válidas en condiciones “normales”. Habiendo despejado esto, creo que hay que señalar que nos parece sorprendente que contrario a lo que creíamos en un principio muchas de las variables demográficas, como raza o género, no eran tan importantes como pensábamos.
Es posible pensar que la política pública puede jugar un rol importante en la reducción de la pobreza. Elementos como salud, educación y vivienda tienen un fuerte poder predictivo sobre la pobreza. Si es que se fortalecen políticas públicas que ayuden a facilitar el acceso a estos 3 elementos creo que existe la posibilidad de reducir aún más la pobreza.
Este proyecto fue sumamente complejo de realizar, en gran parte debido a lo grande que era la base de datos, lo cual provoco que afinar los datos fuera un proceso muy costoso computacionalmente, es decir, tomaba mucho tiempo afinar los hiperparámetros de los modelos, lo que hizo el flujo de trabajo muy complejo. Por lo tanto, pienso que hay muchísimo espacio para mejorar los modelos si es que se tiene acceso a servidores que nos permitan agilizar el proceso. Por último, me gustaría volver a señalar que hay que ser muy cuidadosos con hacer generalizaciones con los resultados de este proyecto, dado que los datos fueron recolectados en medio de una situación tan inusual como fue la crisis sanitaria de 2020.
LS0tDQp0aXRsZTogIlByZWRpY2llbmRvIFBvYnJlemEiDQpvdXRwdXQ6IA0KICBodG1sX25vdGVib29rOg0KICAgIHRoZW1lOiB1bml0ZWQNCiAgICB0b2M6IHllcw0KLS0tDQo8c3R5bGU+DQoNCmJvZHl7DQogdGV4dC1hbGlnbjoganVzdGlmeTsNCn0NCg0KPC9zdHlsZT4NCg0KDQoNCg0KIyMjIFJlc3VsdGFkb3MNCg0KMSkgMyBNb2RlbG9zIGZ1ZXJvbiBvY3VwYWRvczogeGdib29zdCwgcmVncmVzacOzbiBsb2dpc3RhIHkgay1uZWFyZXN0IG5laWdoYm9ycyAoKmtubiopLiANCg0KMikgRWwgbW9kZWxvIHhnYm9vc3QgdHV2byBsYSBtZWpvciBwZXJmb3JtYW5jZSBjb24gdW4gKipyb2MgYXVjKiogZGUgMC44OTE4Lg0KDQoyKSBMYSB2YXJpYWJsZSBkZSBtw6FzIGltcG9ydGFuY2lhIHBhcmEgcHJlZGVjaXIgc2kgdW4gaG9nYXIgc2UgZW5jdWVudHJhIGVuIHNpdHVhY2nDs24gZGUgcG9icmV6YSBlcyBlbCBwcmVjaW8gZGVsIGFycmllbmRvIGVuIGVsIGJhcnJpbyBlbiBxdWUgdml2ZW4gbGFzIGZhbWlsaWFzLg0KDQozKSBMYXMgdmFyaWFibGVzIHJlbGFjaW9uYWRhcyBhbCB0cmFiYWpvIHNvbiBjcnVjaWFsZXMuIEVuIGVzcGVjw61maWNvIGVsIG7Dum1lcm8gZGUgcGVyc29uYXMgb2N1cGFkYXMgZSBpbmFjdGl2YXMgZGVsIGhvZ2FyLg0KDQo0KSBDaWVydGFzIGNhcmFjdGVyw61zdGljYXMgZGVsIGplZmUgZGVsIGhvZ2FyIGNvbW86IGxhIGVkYWQsIGHDsW9zIGRlIGVzY29sYXJpZGFkLCBzaSB0cmFiYWphbiBlbiBlbCBzZWN0b3IgZm9ybWFsIG8gaW5mb3JtYWwgeSBlbCBlc3RhZG8gZGUgc2FsdWQgZW4gbG9zIMO6bHRpbW9zIDEyIG1lc2VzIHNvbiB0cmFzY2VuZGVudGFsZXMuIA0KDQo1KSBMYSBjb25kaWNpw7NuIGRlIHRlbmVuY2lhIGRlIGxhIHZpdmllbmRhIGVzIGltcG9ydGFudGUsIGVuIGVzcGVjw61maWNvLCBzaSBsYXMgcGVyc29uYXMsIHNvbiBwcm9waWV0YXJpb3MsIGFycmllbmRhbiBvIHNpIG9jdXBhbiBsYSBjYXNhIGRlIG1hbmVyYSBpcnJlZ3VsYXIuDQoNCjYpIExhIGNvbXBvc2ljacOzbiBkZWwgaG9nYXIgZXMgZnVuZGFtZW50YWw6IEVsIG7Dum1lcm8gZGUgcGVyc29uYXMgcXVlIHZpdmVuIGVuIGxhIHZpdmllbmRhIHkgbGEgcHJlc2VuY2lhIGRlIG1heW9yZXMgZGUgNjAgYcOxb3MgbyBtZW5vcmVzIGRlIGVkYWQuDQoNCg0KIyMjIEludHJvZHVjY2nDs24NCg0KIVtdKGh0dHA6Ly9vYnNlcnZhdG9yaW8ubWluaXN0ZXJpb2Rlc2Fycm9sbG9zb2NpYWwuZ29iLmNsL2ltYWdlcy9jYXNlbl8yMDIwLnN2ZykNCg0KTXVjaGFzIHZlY2VzIGVzIGRpZsOtY2lsIHNhYmVyIGVsIGluZ3Jlc28gcmVhbCBxdWUgbGFzIHBlcnNvbmFzIHRpZW5lbiBjdWFuZG8gc2UgcmVhbGl6YW4gZW5jdWVzdGFzLCBtw6FzIGHDum4gY3VhbmRvIGV4aXN0ZW4gY2lyY3Vuc3RhbmNpYXMgY29tcGxlamFzIGNvbW8gbGEgY3Jpc2lzIHNhbml0YXJpYSB2aXZpZGEgZW4gMjAyMC4gU2luIGJ1ZW5vcyBkYXRvcyBzb2JyZSBpbmdyZXNvIGVzIG11eSBkaWbDrWNpbCBpbnRlbnRhciBzYWJlciBjdcOhbCBlcyBlbCBuaXZlbCBkZSBwb2JyZXphIHJlYWwgcXVlIGV4aXN0ZSBlbiB1bmEgdW5pZGFkIHRlcnJpdG9yaWFsLiBQb3IgZXN0byByZWN1cnLDrSBhIGxhIGVuY3Vlc3RhIENBU0VOIDIwMjAuIExhIEVuY3Vlc3RhIGRlIENhcmFjdGVyaXphY2nDs24gU29jaW9lY29uw7NtaWNhIE5hY2lvbmFsLCBDQVNFTiwgZXMgcmVhbGl6YWRhIHBvciBlbCBNaW5pc3RlcmlvIGRlIERlc2Fycm9sbG8gU29jaWFsIGRlIENoaWxlLiBVbm8gZGUgc3VzIG9iamV0aXZvcyBlcyB0ZW5lciBpbmZvcm1hY2nDs24gcXVlIHBlcm1pdGEgY29ub2NlciBwZXJpw7NkaWNhbWVudGUgbGEgc2l0dWFjacOzbiBkZSBsb3MgaG9nYXJlcyB5IGRlIGxhIHBvYmxhY2nDs24sIGVzcGVjaWFsbWVudGUgZGUgYXF1ZWxsYSBlbiBzaXR1YWNpw7NuIGRlIHBvYnJlemEgeSBkZSBhcXVlbGxvcyBncnVwb3MgZGVmaW5pZG9zIGNvbW8gcHJpb3JpdGFyaW9zIHBvciBsYSBwb2zDrXRpY2Egc29jaWFsLiBFcyBpbXBvcnRhbnRlIG1lbmNpb25hciBxdWUgbGEgbMOtbmVhIGRlIHBvYnJlemEgdmFyaWEgZGVwZW5kaWVuZG8gZGVsIG7Dum1lcm8gZGUgcGVyc29uYXMgcXVlIGNvbXBvbmVuIHVuIGhvZ2FyLiBTaSBsb3MgaW5ncmVzb3MgZGUgdW5hIGZhbWlsaWEgZXN0w6FuIHBvciBkZWJham8gZGUgZXN0ZSB2YWxvciBzZSBjb25zaWRlcmEgcXVlIHVuYSBmYW1pbGlhIGVzIHBvYnJlLiBBcXXDrSB1bmEgdGFibGEgY29uIGxvcyB2YWxvcmVzIGRlIGxhIGzDrW5lYSBkZSBwb2JyZXphIGRlIGFjdWVyZG8gY29uIGVsIG7Dum1lcm8gZGUgbWllbWJyb3MgZGVsIGhvZ2FyLg0KDQoNCmBgYHtyLGVjaG89RkFMU0Usd2FybmluZz1GQUxTRX0NCmxpYnJhcnkoa2FibGVFeHRyYSkNCg0KbGlicmFyeShrbml0cikNCg0KeDwtdGliYmxlKA0KICAiTnVtYmVyIE9mIFBlb3BsZSBieSBIb3VzZWhvbGQiID0gMToxMCwgDQogICJQb3ZlcnR5IExpbmUgKFVTIERvbGxhcnMpIiA9IGMoMjE4LDM1NSw0NzUsNTc4LDY3NSw3NjcsODU1LDkzOSwxMDIwLDEwOTcpDQopDQoNCnggJT4lIGtibChhbGlnbj0iY2MiKSAlPiUNCiAga2FibGVfcGFwZXIoImhvdmVyIiwgZnVsbF93aWR0aCA9IEYpDQoNCmBgYA0KDQpNaSBvYmpldGl2byBlcyBpbnRlbnRhciBwcmVkZWNpciwgYSB0cmF2w6lzIGRlIG1vZGVsb3MgZGUgY2xhc2lmaWNhY2nDs24sIGN1YW5kbyB1bmEgZmFtaWxpYSBlc3TDoSBlbiBzaXR1YWNpw7NuIGRlIHBvYnJlemEgc2luIG1pcmFyIGEgZGF0b3MgZGUgaW5ncmVzby4gIENvbiB0YWwgbWV0YSBlbGltaW5lIGRlIGxhIGJhc2UgZGUgZGF0b3MgdG9kYXMgbGFzIHByZWd1bnRhcyByZWxhY2lvbmFkYXMgYSBpbmdyZXNvIGUgaW50ZW50ZSwgY29uIGVsIHJlc3RvIGRlIGxhcyB2YXJpYWJsZXMgKHNhbHVkLCB2aXZpZW5kYSwgdHJhYmFqbywgZWR1Y2FjacOzbiwgZXRjLiksIHByZWRlY2lyIGEgdHJhdsOpcyBkZSB2YXJpb3MgbcOpdG9kb3MgKHhnYm9vc3QsIHJlZ3Jlc2nDs24gbG9naXN0YSwga25uKSBjdWFuZG8gdW5hIGZhbWlsaWEgZXMgcG9icmUgeSBjdWFuZG8gbm8gbG8gZXMuIEVsIG9iamV0aXZvIGVzIGludGVudGFyLCBlbiBjaXJjdW5zdGFuY2lhcyBlbiBsYXMgcXVlIHRlbmVyIGRhdG9zIGRlIGluZ3Jlc28gc2VhIGNvbXBsZWpvLCBlc3RhYmxlY2VyIHF1ZSB2YXJpYWJsZXMgc29uIGltcG9ydGFudGVzIHBhcmEgcHJlZGVjaXIgbGEgc2l0dWFjacOzbiBkZSBwb2JyZXphIGRlIHVuIGhvZ2FyLg0KDQoNCiMjIyBEZXNjcmlwY2nDs24gZGUgbG9zIGRhdG9zDQoNCkxhIGVuY3Vlc3RhIENBU0VOIHRpZW5lIDcgdGVtw6F0aWNhcy4gTGEgcHJpbWVyYSBzZSBsbGFtYSAicmVnaXN0cm8gZGUgcmVzaWRlbnRlcyIgZXN0ZSBtw7NkdWxvIHJlZ2lzdHJhIGluZm9ybWFjacOzbiBwYXJhIGxhIGlkZW50aWZpY2FjacOzbiBkZSBsYXMgcGVyc29uYXMsIGNvbW8sIHBvciBlamVtcGxvOiBzZXhvLCBlZGFkLCBlc3RhZG8gY2l2aWwsIGV0Yy4gTGEgc2VndW5kYSBlcyBzb2JyZSBlZHVjYWNpw7NuLCBhcXXDrSBzZSBpbmNsdXllIHVuIGNvbmp1bnRvIGRlIHByZWd1bnRhcyBxdWUgcGVybWl0ZSBlc3RpbWFyIGluZGljYWRvcmVzIGNvbW8gbG9zIG5pdmVsZXMgZGUgZXNjb2xhcmlkYWQgZGUgbGEgcG9ibGFjacOzbiB5IGxhIGluY2lkZW5jaWEgZGUgbGEgcG9ibGFjacOzbiBubyBpbmNvcnBvcmFkYSBhbCBzaXN0ZW1hIGVkdWNhdGl2by4gVW4gdGVyY2VyIHTDs3BpY28gdGllbmUgcXVlIHZlciBjb24gZWwgdHJhYmFqbywgZXN0ZSBjb25zdGEgZGUgcHJlZ3VudGFzIHF1ZSBwZXJtaXRlbjogZXN0aW1hciBpbmRpY2Fkb3JlcyBzb2JyZSBsYSBzaXR1YWNpw7NuIG9jdXBhY2lvbmFsIGRlIGxhIHBvYmxhY2nDs24gKHRhc2EgZGUgcGFydGljaXBhY2nDs24sIHRhc2EgZGUgZGVzb2N1cGFjacOzbiwgdGFzYSBkZSBvY3VwYWNpw7NuKSB5IGNhcmFjdGVyaXphciBsYSBzaXR1YWNpw7NuIGxhYm9yYWwgZGUgbGEgZnVlcnphIGRlIHRyYWJham8gb2N1cGFkYTogc2VjdG9yIGVjb27Ds21pY28gZW4gZWwgcXVlIHRyYWJhamFuLCBxdWUgdGlwbyBkZSBjb250cmF0byBsYWJvcmFsIHRpZW5lbiwgdGlwbyBkZSBvY3VwYWNpw7NuLCBldGMuDQoNCg0KRWwgY3VhcnRvIHRyYXRhIHNvYnJlIGluZ3Jlc29zLCBpbmNsdXllIHByZWd1bnRhcyBxdWUgcGVybWl0ZW4gcmVjb2dlciBpbmZvcm1hY2nDs24gc29icmUgbGFzIGRpZmVyZW50ZXMgY29ycmllbnRlcyBkZSBpbmdyZXNvIHF1ZSByZWNpYmVuIGxhcyBwZXJzb25hcyB5IGxvcyBob2dhcmVzLiBFbCBxdWludG8gdHJhdGEgc29icmUgc2FsdWQsIGNvbnN0YSBkZSB1biBjb25qdW50byBkZSBwcmVndW50YXMgcXVlIHBlcm1pdGUgZXN0aW1hciBpbmRpY2Fkb3JlcyB0YWxlcyBjb21vIGxhIGNvYmVydHVyYSBkZSBsb3Mgc2lzdGVtYXMgcHJldmlzaW9uYWxlcyBkZSBzYWx1ZDsgZWwgYWNjZXNvIGVmZWN0aXZvIGEgc2VydmljaW9zIHkgYXRlbmNpb25lcyBkZSBzYWx1ZCB5IGVsIGVzdGFkbyBkZSBzYWx1ZCBkZSBsb3MgZW5jdWVzdGFkb3MuIEVsIHNleHRvIGVzIHNvYnJlICppZGVudGlkYWRlcyosIGluY2x1eWUgcHJlZ3VudGFzIHF1ZSBwZXJtaXRlbiBlc3RpbWFyIGluZGljYWRvcmVzIGNvbW8gcGVydGVuZW5jaWEgYSBwdWVibG9zIG9yaWdpbmFyaW9zIG8gaW5kw61nZW5hcyB5IG1pZ3JhY2nDs24gaW50ZXJuYWNpb25hbC4gQWRlbcOhcywgaW5jb3Jwb3JhIHVuIGNvbmp1bnRvIGRlIHByZWd1bnRhcyBwYXJhIG1lZGlyIGluc2VndXJpZGFkIGFsaW1lbnRhcmlhLCBkZSBhY3VlcmRvIGNvbiBsYSBlc2NhbGEgaW50ZXJuYWNpb25hbCByZWNvbWVuZGFkYSBwb3IgbGEgRkFPLg0KDQpFbCDDumx0aW1vIHTDs3BpY28gdGllbmUgcXVlIHZlciBjb24gdml2aWVuZGEsIHNlIGNvbXBvbmUgZGUgcHJlZ3VudGFzIHF1ZSBwZXJtaXRlbiBlc3RpbWFyIGluZGljYWRvcmVzIHNvYnJlIGFsZ3VuYXMgZGUgbGFzIGNhcmFjdGVyw61zdGljYXMgYsOhc2ljYXMgZGUgbGFzIHZpdmllbmRhcyBlbiBlbCBwYcOtcywgY29tbyBzdSB0aXBvLCB0ZW5lbmNpYSB5IGVsIHByZWNpbyBkZSBhcnJpZW5kbyBkZSB2aXZpZW5kYXMgc2ltaWxhcmVzIGVuIGVsIGVudG9ybm8sIGFzw60gY29tbyBsYXMgY29uZGljaW9uZXMgZGUgaGFiaXRhYmlsaWRhZCBkZSBzdXMgaG9nYXJlcywgdGFsZXMgY29tbzogc2FuZWFtaWVudG8gZGUgbGEgdml2aWVuZGEsIGFsbGVnYW1pZW50byB5IGhhY2luYW1pZW50by4gTGEgbGlzdGEgY29tcGxldGEgZGUgbGFzIHZhcmlhYmxlcyBwdWVkZSBzZXIgcmV2aXNhZGEgW2FxdcOtXShodHRwOi8vb2JzZXJ2YXRvcmlvLm1pbmlzdGVyaW9kZXNhcnJvbGxvc29jaWFsLmdvYi5jbC9zdG9yYWdlL2RvY3MvY2FzZW4vMjAyMC9MaWJyb19kZV9jb2RpZ29zX0Jhc2VfZGVfRGF0b3NfQ2FzZW5fZW5fUGFuZGVtaWFfMjAyMC5wZGYpDQoNCg0KDQojIyMgVHJhdGFtaWVudG8gZGUgbGFzIHZhcmlhYmxlcw0KDQpFbiBwcmltZXIgbHVnYXIsIGZ1ZXJvbiBlbGltaW5hZGFzIHRvZGFzIGxhcyB2YXJpYWJsZXMgZGUgaW5ncmVzbyB5IGFxdWVsbGFzIHZhcmlhYmxlcyBjYXRlZ8OzcmljYXMgcXVlIHBvc2XDrWFuIG3DoXMgZGUgMzAgbml2ZWxlcy4gTHVlZ28gc2UgZmlsdHJhcm9uIHNvbG8gbGFzIG9ic2VydmFjaW9uZXMgcXVlIHBlcnRlbmVjw61hbiBhIGplZmVzIGRlbCBob2dhciAocGFyYSBwb2RlciB0ZW5lciB1bmEgdmFyaWFibGUgcG9yIGhvZ2FyIHkgcG9ycXVlIGxhIGJhc2UgZGUgZGF0b3MsIGFsIHNlciB0YW4gZ3JhbmRlLCBwcm92b2NhYmEgcXVlIGVudHJlbmFyIGxvcyBkYXRvcyB0b21hcmEgbXVjaG8gdGllbXBvKS4gUGFyYSBsYXMgdmFyaWFibGVzIGNhdGVnw7NyaWNhcyBjb24gTkEncyBzZSBjcmXDsyB1bmEgY2F0ZWdvcsOtYSAqdW5rbm93biouIEFkZW3DoXMsIHNlIHRyYW5zZm9ybWFyb24gdG9kYXMgbGFzIHZhcmlhYmxlcyBjYXRlZ8OzcmljYXMgZW4gdmFyaWFibGVzICpkdW1taWVzKi4gU2UgaW1wdXRvIGxhcyBvYnNlcnZhY2lvbmVzIE5BJ3MgZGUgbGFzIHZhcmlhYmxlcyBudW3DqXJpY2FzIG9jdXBhbmRvIGxhIG1lZGlhbmEuIEFkZW3DoXMsIGVzdGFzIHZhcmlhYmxlcyBmdWVyb24gdHJhbnNmb3JtYWRhcyBhIGxvZ2FyaXRtbyB5IGx1ZWdvIG5vcm1hbGl6YWRhcy4NCg0KIyMjIEFuw6FsaXNpcyBFeHBsb3JhdG9yaW8NCg0KDQpgYGB7cixlY2hvID0gRkFMU0UsIHdhcm5pbmc9RkFMU0UsIG1lc3NhZ2U9RkFMU0V9DQoNCnNleG88LXRyYWluICU+JQ0KICBtdXRhdGUocG9icmV6YSA9IHBvYnJlemEgPT0gIjEiKSAlPiUNCiAgZ3JvdXBfYnkoc2V4bykgJT4lIA0KICAgIHN1bW1hcmlzZShwb2JyZXphID0gbWVhbihwb2JyZXphKSkgJT4lIA0KICByZW5hbWUoVmFyaWFibGUgPSBzZXhvKSAlPiUgDQogIG11dGF0ZShWYXJpYWJsZT0gY2FzZV93aGVuKCBWYXJpYWJsZSA9PSAiSG9tYnJlIiB+ICJNYW4iLA0KICBWYXJpYWJsZSA9PSAiTXVqZXIiIH4gIldvbWFuIikpDQoNCmVkYWQ8LXRyYWluJT4lIG11dGF0ZShlZGFkPWN1dChlZGFkLCBicmVha3M9YygxOCwgMzAsIDQ1LDYwLCBJbmYpLCBsYWJlbHM9YygiQWdlIDE4LTI5IiwgIkFnZSAzMC00NCIsIkFnZSA0NS01OSIsIkFnZSArNjAiKSkpJT4lDQogIG11dGF0ZShwb2JyZXphID0gcG9icmV6YSA9PSAiMSIpICU+JQ0KICBncm91cF9ieShlZGFkKSAlPiUgDQogICAgc3VtbWFyaXNlKHBvYnJlemEgPSBtZWFuKHBvYnJlemEpKSAlPiUgDQogIHJlbmFtZShWYXJpYWJsZSA9IGVkYWQpDQoNCmV0bmlhPC10cmFpbiAlPiUNCiAgbXV0YXRlKHBvYnJlemEgPSBwb2JyZXphID09ICIxIikgJT4lDQogIGdyb3VwX2J5KGV0bmlhKSAlPiUgDQogICAgc3VtbWFyaXNlKHBvYnJlemEgPSBtZWFuKHBvYnJlemEpKSAlPiUgDQogIHJlbmFtZShWYXJpYWJsZSA9IGV0bmlhKSU+JSANCiAgbXV0YXRlKFZhcmlhYmxlPSBjYXNlX3doZW4oIFZhcmlhYmxlID09ICJObyBwZXJ0ZW5lY2UgYSBuaW5ndW5vIHB1ZWJsbyBpbmTDrWdlbmEiIH4gIk5vbi1OYXRpdmUgQW1lcmljYW4iLA0KICBWYXJpYWJsZSA9PSAiUGVydGVuZWNlIGEgcHVlYmxvcyBpbmTDrWdlbmFzIiB+ICJOYXRpdmUgQW1lcmljYW4iKSkNCg0KDQp6b25hPC10cmFpbiAlPiUNCiAgbXV0YXRlKHBvYnJlemEgPSBwb2JyZXphID09ICIxIikgJT4lDQogIGdyb3VwX2J5KHpvbmEpICU+JSANCiAgICBzdW1tYXJpc2UocG9icmV6YSA9IG1lYW4ocG9icmV6YSkpICU+JSANCiAgcmVuYW1lKFZhcmlhYmxlID0gem9uYSklPiUgDQogIG11dGF0ZShWYXJpYWJsZT0gY2FzZV93aGVuKCBWYXJpYWJsZSA9PSAiUnVyYWwiIH4gIlJ1cmFsIiwNCiAgVmFyaWFibGUgPT0gIlVyYmFubyIgfiAiVXJiYW4iKSkNCg0KaW5taWdyYW50ZTwtdHJhaW4gJT4lDQogIG11dGF0ZShwb2JyZXphID0gcG9icmV6YSA9PSAiMSIpICU+JQ0KICBncm91cF9ieShpbm1pZ3JhbnRlKSAlPiUgDQogICAgc3VtbWFyaXNlKHBvYnJlemEgPSBtZWFuKHBvYnJlemEpKSAlPiUgDQogIHJlbmFtZShWYXJpYWJsZSA9IGlubWlncmFudGUpJT4lIA0KICBtdXRhdGUoVmFyaWFibGU9IGNhc2Vfd2hlbiggVmFyaWFibGUgPT0gIk5vIGlubWlncmFudGUiIH4gIk5vbi1Jbm1pZ3JhbnQiLA0KICBWYXJpYWJsZSA9PSAiSW5taWdyYW50ZSIgfiAiSW5taWdyYW50IikpDQoNCg0KanVudGFzPC1yYmluZChzZXhvLGVkYWQsZXRuaWEsem9uYSxpbm1pZ3JhbnRlKQ0KDQoNCg0KDQoNCiNzdSByYmluZA0KDQpgYGANCg0KYGBge3IsZWNobyA9IEZBTFNFLCB3YXJuaW5nPUZBTFNFLCBtZXNzYWdlPUZBTFNFfQ0KDQpqdW50YXNbLWMoNywgMTQpLCBdICU+JQ0KICBtdXRhdGUoVmFyaWFibGUgPSBmY3RfcmVvcmRlcihWYXJpYWJsZSwgcG9icmV6YSkpICU+JSANCmdncGxvdCggYWVzKHBvYnJlemEsIGZjdF9yZW9yZGVyKFZhcmlhYmxlLHBvYnJlemEpKSkgKw0KICAgICAgICBnZW9tX3NlZ21lbnQoYWVzKHggPSAwLCB5ID0gVmFyaWFibGUsIHhlbmQgPSBwb2JyZXphLCB5ZW5kID0gVmFyaWFibGUpLCBjb2xvciA9ICJncmV5NTAiKSArDQogICAgICAgIGdlb21fcG9pbnQoKSArZ2d0aXRsZSgiUG92ZXJ0eSBSYXRlIGJ5IEhlYWQgb2YgSG91c2Vob2xkIERlbW9ncmFwaGljIENoYXJhY3RlcmlzdGljcyIpKw0KICBsYWJzKHggPSAiUHJvcG9ydGlvbiBvZiBQb29yIEhvdXNlaG9sZHMiLHk9TlVMTCkrIHRoZW1lX2xpZ2h0KCkNCg0KYGBgDQoNCkxvIHByaW1lcm8gcXVlIGhpY2UgZnVlIHJldmlzYXIgdmFyaWFibGVzIGRlbW9ncsOhZmljYXMgZGUgbG9zIGplZmVzIGRlIGhvZ2FyIGNvbiBlbCBmaW4gZGUgZGV0ZWN0YXIgYWxndW5hIHJlbGFjacOzbiBjb24gbGEgcG9icmV6YS4gU2kgdW5vIG9ic2VydmEgZWwgZ3JhZmljbyBlcyBjbGFybyBxdWUgZXhpc3RlbiBjaWVydG9zIGdydXBvcyBlbiBsb3MgcXVlIHBhcmVjaWVyYSBxdWUgbGEgcG9icmV6YSBmdWVyYSBhbGdvIG3DoXMgcmVjdXJyZW50ZS4gSG9nYXJlcyBkb25kZSBlbCBqZWZlIGRlIGhvZ2FyIGVzIGpvdmVuLCBpbm1pZ3JhbnRlLCBpbmTDrWdlbmEgbyBtdWplciBzdWVsZW4gc2VyIG3DoXMgcG9icmVzIHF1ZSBzdXMgY29udHJhcGFydGVzLiBBZGVtw6FzLCBsb3MgaG9nYXJlcyBlbiBzZWN0b3JlcyBydXJhbGVzIHRpZW5lbiB1bmEgbWF5b3IgcHJvcG9yY2nDs24gZGUgcG9icmV6YSBxdWUgYXF1ZWxsb3MgaG9nYXJlcyBkZSBzZWN0b3JlcyB1cmJhbm9zLiBBbGdvIHF1ZSBsbGFtYSBsYSBhdGVuY2nDs24gZXMgcXVlIG3DoXMgZGVsIDIwJSBkZSBsb3MgaG9nYXJlcyBlbiBkb25kZSBlbCBqZWZlIGRlIGhvZ2FyIGVzIGlubWlncmFudGUgZXN0w6FuIGVuIHNpdHVhY2nDs24gZGUgcG9icmV6YS4gTG9zIGRhdG9zIGZ1ZXJvbiByZWNvbGVjdGFkb3MgZHVyYW50ZSBsYSBwYW5kZW1pYSB5IGhheSBxdWUgdGVuZXIgcHJlc2VudGUgcXVlIG11Y2hhIGRlIGxhIGF5dWRhIHF1ZSBlbCBFc3RhZGlvIGVudHJlZ28gYSBsYXMgZmFtaWxpYXMgcGFyYSBhbGl2aWFyIGVsIHBlc28gZGUgbGEgcGFuZGVtaWEgbm8gZnVlIHJlY2liaWRhIHBvciBsb3MgaW5taWdyYW50ZXMsIHBvciBsbyB0YW50bywgbm8gZXMgcG9zaWJsZSBzYWJlciBzaSBiYWpvIGNvbmRpY2lvbmVzIG5vcm1hbGVzIGVzdGUgZ3J1cG8gdGFtYmnDqW4gZXMgZW4gZWwgcXVlIGhheSB1bmEgbWF5b3IgcHJvcG9yY2nDs24gZGUgaG9nYXJlcyBwb2JyZXMuIA0KDQpQYXJlY2llcmEgcXVlIG1pZW50cmFzIG3DoXMgam92ZW4gc2VhIGVsIGplZmUgZGVsIGhvZ2FyIGV4aXN0ZSB1bmEgbWF5b3IgcHJvcG9yY2nDs24gZGUgcGVyc29uYXMgcG9icmVzLiBFcyB1biBwb2NvIGRpZsOtY2lsIGVuY29udHJhciB1bmEgcmF6w7NuIGNsYXJhLCBwdWVkZSBzZXIgbGEgcGFuZGVtaWEgYWZlY3TDsyBkZSBtYXlvciBtYW5lcmEgZWwgZW1wbGVvIGpvdmVuLiBFbiBudWVzdHJhIGJhc2UgaGF5IG11eSBwb2NhcyB2YXJpYWJsZXMgbnVtw6lyaWNhcywgdmFtb3MgYSBleHBsb3JhciBhbGd1bmFzIGVsbGFzIGEgY29udGludWFjacOzbi4NCg0KDQoNCmBgYHtyLGVjaG8gPSBGQUxTRSwgd2FybmluZz1GQUxTRSwgbWVzc2FnZT1GQUxTRX0NCnRyYWluICU+JQ0KICBwaXZvdF9sb25nZXIoYyhlZGFkLGVzYyxuX29jdXBhZG9zLG51bXBlciksIG5hbWVzX3RvID0gInN0YXQiLCB2YWx1ZXNfdG8gPSAidmFsdWUiKSU+JSANCiAgbXV0YXRlKHN0YXQ9IGNhc2Vfd2hlbihzdGF0ID09ICJlZGFkIiB+ICJIZWFkIG9mIEhvdXNlIEFnZSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXQgPT0gImVzYyIgfiAiSGVhZCBvZiBIb3VzZSBTY2hvb2xpbmcgWWVhcnMiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ID09ICJuX29jdXBhZG9zIiB+ICJOdW1iZXIgb2YgRW1wbG95ZWQgUGVvcGxlIGJ5IEhvdXNlaG9sZCIsDQogICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXQgPT0gIm51bXBlciIgfiAiTnVtYmVyIG9mIFBlb3BsZSBieSBIb3VzZWhvbGQiKSwNCiAgICAgICAgIHBvYnJlemE9aWZlbHNlKHBvYnJlemE9PSIxIiwiUG9vciIsIk5vdCBQb29yIikpICU+JQ0KICBnZ3Bsb3QoYWVzKHBvYnJlemEsIHZhbHVlLCBmaWxsID0gcG9icmV6YSwgY29sb3IgPSBwb2JyZXphKSkgKw0KICBnZW9tX2JveHBsb3QoYWxwaGEgPSAwLjQpICsNCiAgZmFjZXRfd3JhcCh+c3RhdCwgc2NhbGVzID0gImZyZWVfeSIsIG5yb3cgPSAyKSArDQogIGxhYnMoeSA9IE5VTEwseD0iUG92ZXJ0eSIsIGNvbG9yID0gTlVMTCwgZmlsbCA9IE5VTEwpK3RoZW1lX2xpZ2h0KCkNCg0KDQogICAgICAgICAgICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgICAgICAgICAgICANCmBgYA0KDQpFcyBwb3NpYmxlIGNvbnN0YXRhciBjbGFyYXMgZGlmZXJlbmNpYXMgZW4gMyBkZSBsYXMgNCB2YXJpYWJsZXMgZGUgZ3JhZmljYW1vcy4gUGFyZWNpZXJhIHF1ZSBsYSBlZGFkIChjb21vIHZpbW9zIGFudGVyaW9ybWVudGUpIHkgbG9zIGHDsW9zIGRlIGVzY29sYXJpZGFkIGRlbCBqZWZlIGhvZ2FyOyBqdW50byBjb24gZWwgbsO6bWVybyBkZSBwZXJzb25hcyBxdWUgdHJhYmFqYW4gZW4gdW4gaG9nYXIgdGllbmVuIHVuIGVmZWN0byBzb2JyZSBsYSBwb2JyZXphLiBObyBzZSBwdWVkZSBhZmlybWFyIGxvIG1pc21vIGRlbCBuw7ptZXJvIGRlIHBlcnNvbmFzIHF1ZSB2aXZlbiBlbiB1biBob2dhci4NCg0KTWlyZW1vcyBhaG9yYSBvdHJhcyB2YXJpYWJsZXMgcXVlIHB1ZWRlbiBzZXIgaW50ZXJlc2FudGVzLg0KDQoNCmBgYHtyLGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsZmlnLndpZHRoPTcuNSwgZmlnLmhlaWdodD00LjIsIHdhcm5pbmc9RkFMU0V9DQoNCnRyYWluICU+JSAgDQogIG11dGF0ZSh2MTM9IGNhc2Vfd2hlbih2MTMgPT0gIlByb3BpYSIgfiAiT3duZXIiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICB2MTMgPT0gIkFycmVuZGFkYSIgfiAiUmVudGluZyIsDQogICAgICAgICAgICAgICAgICAgICAgICAgIHYxMyA9PSAiQ2VkaWRhIiB+ICIgR3JhbnRlZCBGcmVlIG9mIENoYXJnZSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgIHYxMyA9PSAiVXN1ZnJ1Y3RvIChzw7NsbyB1c28geSBnb2NlKSIgfiAiT3RoZXIiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICB2MTMgPT0gIk9jdXBhY2nDs24gaXJyZWd1bGFyIChkZSBoZWNobykifCB2MTMgPT0gIlBvc2VlZG9yIGlycmVndWxhciIgIH4gIklsbGVnYWwgT2NjdXBhdGlvbiIpLA0KICAgICAgICAgICAgICAgICAgICAgICBwb2JyZXphPWlmZWxzZShwb2JyZXphPT0iMSIsIlBvb3IiLCJOb3QgUG9vciIpKSAlPiUgY291bnQocG9icmV6YSwgdjEzKSAlPiUgDQogIGdyb3VwX2J5KHYxMykgJT4lICBtdXRhdGUocHJvcCA9IG4gLyBzdW0obikpICU+JSANCiAgcGxvdF9seSh4ID1+cHJvcCwgeSA9IH52MTMsIGNvbG9yID0gfnBvYnJlemEpICU+JSANCiAgYWRkX2JhcnMoKSAlPiUgDQogIGxheW91dChiYXJtb2RlID0gInN0YWNrIix0aXRsZSA9ICJQb3ZlcnR5IGJ5IFRlbnVyZSBTdGF0dXMgb2YgSG91c2Vob2xkcyIsDQogICAgICAgICB5YXhpcz1saXN0KHRpdGxlID0iIikpDQoNCmBgYA0KDQoNCkN1YW5kbyBtaXJhbW9zIGEgbGEgcG9icmV6YSBzZWfDum4gZWwgdGlwbyBkZSB0ZW5lbmNpYSBkZWwgaG9nYXIgZXMgZXZpZGVudGUgcXVlIGxhcyBwZXJzb25hcyBxdWUgZXN0w6FuIGFycmVuZGFuZG8geSBsYXMgcXVlIG9jdXBhbiBpbGVnYWxtZW50ZSB1biBob2dhciBzdWVsZW4gdGVuZXIgdW5hIG1heW9yIHByb3BvcmNpw7NuIGRlIHBvYnJlcy4gRW4gZWwgY2FzbyBkZSBsb3MgcXVlIGFycmllbmRhIHVuYSBwb3JjacOzbiBkZSBzdXMgaW5ncmVzb3Mgc2UgdGllbmUgcXVlIGlyIGEgcGFnYXIgZWwgYXJyaWVuZG8geSwgcG9yIGxvIHRhbnRvLCBubyBwdWVkZSBzZXIgZ2FzdGFkYSBlbiBiaWVuZXMgZGUgcHJpbWVyYSBuZWNlc2lkYWQuIEVuIGVsIGNhc28gZGUgbGFzIHBlcnNvbmFzIHF1ZSBvY3VwYW4gaWxlZ2FsbWVudGUgdW5hIHByb3BpZWRhZCBsYSBzaXR1YWNpw7NuIGVzIGxhIG1pc21hLCBpbmNsdXNvIHByb2JhYmxlbWVudGUgZXN0w6FuIGVuIHVuYSBzaXR1YWNpw7NuIGVjb27Ds21pY2EgbcOhcyBhcHJlbWlhbnRlIHF1ZSBsYXMgcGVyc29uYXMgcXVlIGFycmllbmRhbi4NCg0KYGBge3IsZWNobz1GQUxTRSxtZXNzYWdlPUZBTFNFLHdhcm5pbmc9RkFMU0UsZmlnLndpZHRoPTcuNSwgZmlnLmhlaWdodD00LjJ9DQp0cmFpbiAlPiUgIA0KICBtdXRhdGUoczI4PSBjYXNlX3doZW4oczI4ID09ICJObyBoYSBlc3RhZG8gZW4gdHJhdGFtaWVudG8gcG9yIG5pbmd1bmEgY29uZGljacOzbiBkZSBzYWx1ZCBhbnRlcmlvciIgfiAiTm8iLA0KICAgICAgICAgICAgICAgICAgICAgICAgICBzMjggPT0gIk5vIHNhYmUvTm8gcmVjdWVyZGEiIH4gIkRvbid0IEtub3cvRG9uJ3QgUmVtZW1iZXIiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICBzMjggIT0gIk5vIGhhIGVzdGFkbyBlbiB0cmF0YW1pZW50byBwb3IgbmluZ3VuYSBjb25kaWNpw7NuIGRlIHNhbHVkIGFudGVyaW9yIiB8IA0KICAgICAgICAgICAgICAgICAgICAgICAgICBzMjggIT0gIk5vIHNhYmUvTm8gcmVjdWVyZGEiIH4gIlllcyIpLA0KICAgICAgICAgICAgICAgICAgICAgICBwb2JyZXphPWlmZWxzZShwb2JyZXphPT0iMSIsIlBvb3IiLCJOb3QgUG9vciIpKSU+JSBjb3VudChwb2JyZXphLCBzMjgpICU+JSANCiAgZ3JvdXBfYnkoczI4KSAlPiUgIG11dGF0ZShwcm9wID0gbiAvIHN1bShuKSkgJT4lIA0KICBwbG90X2x5KHggPX5wcm9wLCB5ID0gfnMyOCwgY29sb3IgPSB+cG9icmV6YSkgJT4lIA0KICBhZGRfYmFycygpICU+JSANCiAgbGF5b3V0KGJhcm1vZGUgPSAic3RhY2siLHRpdGxlID0gIkR1cmluZyB0aGUgcGFzdCAxMiBtb250aHMsIGhhdmUgeW91IGJlZW4gaW4gbWVkaWNhbCB0cmVhdG1lbnQ/IiwNCiAgICAgICAgIHlheGlzPWxpc3QodGl0bGUgPSIiKSkNCmBgYA0KDQpPdHJhIHZhcmlhYmxlIGltcG9ydGFudGUgZXMgZWwgdHJhdGFtaWVudG8gbcOpZGljbywgZW4gcGFydGljdWxhciBjdWFuZG8gZWwgamVmZSBkZSBob2dhciByZXNwb25kZSBxdWUgbm8gc2FiZW4gbyBubyByZWN1ZXJkYW4gc2kgZXMgcXVlIHJlY2liacOzIHRyYXRhbWllbnRvIG3DqWRpY28gZHVyYW50ZSBsb3Mgw7psdGltb3MgMTIgbWVzZXMuIEVzIHByb2JhYmxlIHF1ZSBsYXMgcGVyc29uYXMgcXVlIHN1ZnJhbiBhbGfDum4gdGlwbyBkZSBlbmZlcm1lZGFkIGNvbiB1biBhbHRvIGVzdGlnbWEgc29jaWFsIHByZWZpZXJhbiBkYXIgZXN0ZSB0aXBvIGRlIHJlc3B1ZXN0YS4gTGEgb3RyYSBhbHRlcm5hdGl2YSBlcyBxdWUgZWwgcmVzcG9uZGVyIHF1ZSBubyBzYWJlbiBvIG5vIHJlY3VlcmRhbiBzZWEsIGVuIHPDrSBtaXNtbywgdW5hIHNlw7FhbCBkZSBhbGd1bmEgY29uZGljacOzbiBkZSBzYWx1ZCBxdWUgYWZlY3RhIGRlIGFsZ3VuYSBtYW5lcmEgbGEgY2FwYWNpZGFkIGRlIHJlY2liaXIgaW5ncmVzb3MgZGUgdW5hIHBlcnNvbmEuIA0KDQpPdHJhIHZhcmlhYmxlIGludGVyZXNhbnRlIGVzIGVsIHByZWNpbyBkZWwgYXJyaWVuZG8gcXVlIHNlIHBhZ2EgZW4gZWwgYmFycmlvIGVuIGVsIHF1ZSB2aXZlbiBsYXMgZmFtaWxpYXMuIEVzdGUgdmFsb3Igc2UgY29uc2lndWUgcHJlZ3VudMOhbmRvbGUgYSBsYXMgcGVyc29uYXMgZGlyZWN0YW1lbnRlOiDCv0N1w6FudG8gc2UgcGFnYSBkZSBhcnJpZW5kbyBlbiBlc3RlIHNlY3Rvcj8gQSBjb250aW51YWNpw7NuLCB1biBncsOhZmljbyBjb24gbGFzIGRpc3RyaWJ1Y2lvbmVzIHBhcmEgbGFzIHBlcnNvbmFzIHBvYnJlcyB5IG5vIHBvYnJlcy4gRXMgZXZpZGVudGUgcXVlIGxhcyBwZXJzb25hcyBubyBwb2JyZXMgdml2ZW4gZW4gYmFycmlvcyBlbiBkb25kZSBlbCBhcnJpZW5kbyBlcyBtw6FzIGNhcm8gcXVlIGxvcyBiYXJyaW9zIGVuIGRvbmRlIHZpdmVuIGxhcyBmYW1pbGlhcyBwb2JyZXMuDQoNCg0KYGBge3IsZWNobz1GQUxTRSwgd2FybmluZz1GQUxTRSwgbWVzc2FnZT1GQUxTRSxmaWcud2lkdGg9Ny41LCBmaWcuaGVpZ2h0PTQuMn0NCmQxIDwtIGZpbHRlcih0cmFpbiwgcG9icmV6YSA9PSAiMSImaXMubmEodjE5KT09RkFMU0UpDQpkMiA8LSBmaWx0ZXIodHJhaW4sIHBvYnJlemEgPT0gIjAiJmlzLm5hKHYxOSk9PUZBTFNFKQ0KDQpkZW5zaXR5MSA8LSBkZW5zaXR5KGQxJHYxOSkNCmRlbnNpdHkyIDwtIGRlbnNpdHkoZDIkdjE5KQ0KDQpwbG90X2x5KG9wYWNpdHkgPSAwLjgpICU+JSAgYWRkX2xpbmVzKHggPSB+bG9nKGRlbnNpdHkxJHgrMSksIHkgPSB+bG9nKGRlbnNpdHkxJHkrMSksIG5hbWUgPSAicG9vciIpICU+JSANCiAgYWRkX2xpbmVzKHggPSB+bG9nKGRlbnNpdHkyJHgrMSksIHkgPSB+bG9nKGRlbnNpdHkyJHkrMSksIG5hbWUgPSAibm90IHBvb3IiKSAlPiUgDQogIGxheW91dCh4YXhpcyA9IGxpc3QodGl0bGUgPSAnTG9nKFJlbnQgUHJpY2UpJyksDQogICAgICAgICB5YXhpcyA9IGxpc3QodGl0bGUgPSAnRGVuc2l0eScpLA0KICAgICAgICAgdGl0bGUgPSAiTmVpZ2hib3Job29kIFJlbnQgUHJpY2UgRGlzdHJpYnV0aW9uIikNCg0KYGBgDQoNCg0KDQojIyBSZXN1bHRhZG9zDQoNCg0KDQoNCmBgYHtyLGVjaG89RkFMU0V9DQpjb2xsZWN0X21ldHJpY3MoZmluYWxfcmVzKSANCg0KYGBgDQoNCg0KDQpgYGB7cixlY2hvPUZBTFNFLHdhcm5pbmc9RkFMU0UsbWVzc2FnZT1GQUxTRX0NCmZpbmFsX3hnYiAlPiUNCiAgICBmaXQoZGF0YSA9IHRyYWluKSAlPiUNCiAgICBwdWxsX3dvcmtmbG93X2ZpdCgpICU+JQ0KICAgIHZpcChnZW9tID0gInBvaW50IiwgbnVtX2ZlYXR1cmVzID0gMjApKw0KICB0aGVtZV9saWdodCgpDQpgYGANCg0KUHJvYmFtb3MgZGlzdGludG9zIG1vZGVsb3Mgb2N1cGFuZG8geGdib29zdCwgcmVncmVzacOzbiBsb2dpc3RhIHkgay1uZWFyZXN0IG5laWdoYm9ycyAoKmtubiopLiBFbCBxdWUgdHV2byBsYSBtZWpvciBwZXJmb3JtYW5jZSBmdWUgZWwgeGdib29zdCBjb24gdW4gKipyb2MgYXVjKiogZGUgMC44OTE4LiBFc3RlIG1vZGVsbyBmdWUgdmFsaWRhZG8gY29uIGVzcXVlbWEgKmstZm9sZCBjcm9zcyB2YWxpZGF0aW9uKiwgY29uIGs9NS4gT2N1cGFtb3MgMTAwMCDDoXJib2xlcyBjb21vIGRlZmF1bHQuIExvcyBoaXBlcnBhcsOhbWV0cm9zIHF1ZSBub3MgZW50cmVnYXJvbiBsb3MgbWVqb3JlcyByZXN1bHRhZG9zIGZ1ZXJvbiBsb3Mgc2lndWllbnRlczoNCg0KDQpgYGB7cixlY2hvPUZBTFNFLHdhcm5pbmc9RkFMU0V9DQpsaWJyYXJ5KGthYmxlRXh0cmEpDQoNCmxpYnJhcnkoa25pdHIpDQoNCng8LXRpYmJsZSgNCiAgIm10cnkiID0gNjcsIA0KICAibWluX24iID0gMTQsDQogICJ0cmVlX2RlcHRoIiA9IDYsDQogICJsZWFybl9yYXRlIiA9IDAuMDE0MDgxNzksDQogICJsb3NzX3JlZHVjdGlvbiIgPSAiMS45MDYzMzdlLTEwIiwNCiAgInNhbXBsZV9zaXplIiA9IDAuNjkyODY2OQ0KKQ0KDQp4ICU+JSBrYmwoYWxpZ249ImNjIikgJT4lDQogIGthYmxlX3BhcGVyKCJob3ZlciIsIGZ1bGxfd2lkdGggPSBGKQ0KDQpgYGANCg0KRXN0YXMgc29uIGxhcyB2YXJpYWJsZXMgbcOhcyBpbXBvcnRhbnRlcyBkZSBlc3RlIG1vZGVsbw0KDQoNCg0KIVtdKEM6L1VzZXJzL0NheW95by9EZXNrdG9wL1IveGcuYm9vc3QuUE5HKQ0KDQpFbiByYXNnb3MgZ2VuZXJhbGVzLCBoYXkgdW4gZ3J1cG8gZGUgdmFyaWFibGVzIHF1ZSB0aWVuZW4gcXVlIHZlciBjb24gbGEgdGVuZW5jaWEgZGVsIGhvZ2FyLCBlcyBkZWNpciBzaSBlcyBxdWUgbGEgY2FzYSBxdWUgc2UgaGFiaXRhIGVzIHByb3BpYSwgc2UgYXJyaWVuZGEgdSBvdHJvcy4gRW4gZXN0ZSBncnVwbyBlc3TDoW4gbGFzIHZhcmlhYmxlcyAqKlYxMyoqIHkgKip0ZW5fdml2KiouIFVuIHNlZ3VuZG8gZ3J1cG8gdGllbmUgcmVsYWNpw7NuIGNvbiBlbCBhc3BlY3RvIGxhYm9yYWwgZGVsIGhvZ2FyLCBlamVtcGxvIGRlIGVzdG8gc29uIGxhcyB2YXJpYWJsZXMgKipuX29jdXBhZG9zKiogeSAqKm5faW5hY3Rpdm9zKiouIEVzIGltcG9ydGFudGUgbWVuY2lvbmFyIHF1ZSBsb3MgaW5hY3Rpdm9zIG5vIHNvbiBsYXMgcGVyc29uYXMgZGVzZW1wbGVhZGFzLiBMb3MgaW5hY3Rpdm9zIHNvbiBsYXMgcGVyc29uYXMgZGUgMTUgbyBtw6FzIGHDsW9zLCBxdWUgbm8gZXN0YWJhbiBvY3VwYWRhcyBkdXJhbnRlIGxhIHNlbWFuYSBxdWUgc2UgaGl6byBsYSBlbmN1ZXN0YSBwZXJvIHF1ZSB0YW1wb2NvIGhhYsOtYW4gYnVzY2FkbyB1biBwdWVzdG8gZGUgdHJhYmFqbyBkdXJhbnRlIGxhcyDDumx0aW1hcyBjdWF0cm8gc2VtYW5hcyBhIGxhIGVuY3Vlc3RhLiBFbiBlc3RlIGdydXBvIHB1ZWRlbiBjYWVyIGVzdHVkaWFudGVzIG8gcGVyc29uYXMgcXVlIHRlbmdhbiBhbGfDum4gcHJvYmxlbWEgZGUgc2FsdWQuIE90cmEgdmFyaWFibGUgcmVsYWNpb25hZGEgYWwgw6FtYml0byBsYWJvcmFsIGVzICoqb2N1cF9pbmYqKiwgcXVlIGVzcGVjaWZpY2Egc2kgZXMgcXVlIGVsIGplZmUgZGVsIGhvZ2FyIGVzdMOhIHRyYWJhamFuZG8gZGUgbWFuZXJhIGluZm9ybWFsIG8gZm9ybWFsLiANCg0KVW4gdGVyY2VyIGdydXBvIGVzdMOhIHZpbmN1bGFkbyBhIGNhcmFjdGVyw61zdGljYXMgZGVsIGplZmUgZGVsIGhvZ2FyLCBhcXXDrSB0ZW5lbW9zIGxvcyBhw7FvcyBkZSBlc2NvbGFyaWRhZCwgcmVwcmVzZW50YWRvcyBwb3IgKiplc2MyKiogeSAqKmVzYyoqLCBsYSBlZGFkLCAqKmVkYWQqKiB5IHNpIHJlY2liacOzIHRyYXRhbWllbnRvIG3DqWRpY28gZW4gbG9zIMO6bHRpbW9zIDEyIG1lc2VzICoqczI4KiouIFVuIGN1YXJ0byBncnVwbyBkZSB2YXJpYWJsZXMgdGllbmVuIHJlbGFjacOzbiBjb24gbGEgY29tcG9zaWNpw7NuIGRlbCBob2dhcjogbGEgcHJlc2VuY2lhIGRlIG1lbm9yZXMgZGUgZWRhZCAqKm1lbjE4YyoqLCBkZSBwZXJzb25hcyBtYXlvcmVzIGRlIDYwIGHDsW9zICoqbWF5NjBjKiogeSBlbCBuw7ptZXJvIGRlIHBlcnNvbmFzIHF1ZSBoYWJpdGEgZWwgaG9nYXI6ICoqbnVtdml2KiosICoqdG90X3BlcioqLCAqKm51bXBlcioqIHkgKipwNioqLiBQb3Igw7psdGltbywgc2luIGVzdGFyIGNsYXJhbWVudGUgcmVsYWNpb25hZGEgYSBsb3MgZ3J1cG9zIGFudGVyaW9yZXMsIHBhcmVjaWVyYSBzZXIgcXVlIGxhIHZhcmlhYmxlIG3DoXMgaW1wb3J0YW50ZSBlcyBsYSAqKnYxOSoqLCBlc3RlIGNvcnJlc3BvbmRlIGFsIHZhbG9yIHF1ZSBsYXMgcGVyc29uYXMgcmVwb3J0YW4gY3VhbmRvIHNlIGxlcyBwcmVndW50YTogwr9DdcOhbnRvIHNlIHBhZ2EgZGUgYXJyaWVuZG8gZW4gZXN0ZSBzZWN0b3I/DQoNCg0KDQpgYGB7cixlY2hvPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KeGdfY29uZiA8LSBmaW5hbF9yZXMgJT4lDQogIHVubmVzdCgucHJlZGljdGlvbnMpICU+JQ0KICBjb25mX21hdChwb2JyZXphLCAucHJlZF9jbGFzcykNCg0KeGdfY29uZg0KDQoNCmBgYA0KDQoNCg0KYGBge3IsZWNobz1GQUxTRSx3YXJuaW5nPUZBTFNFfQ0KZmluYWxfbHIgJT4lDQogIGZpdChkYXRhID0gdHJhaW4pICU+JQ0KICBwdWxsX3dvcmtmbG93X2ZpdCgpICU+JQ0KICB2aXAoZ2VvbSA9ICJwb2ludCIsIG51bV9mZWF0dXJlcyA9IDIwKSsNCiAgdGhlbWVfbGlnaHQoKQ0KYGBgDQoNCg0KDQoNCmBgYHtyLGVjaG89RkFMU0V9DQpmaW5hbF9yZXMubG4gPC0gbGFzdF9maXQoZmluYWxfbHIsIHNwbCkNCg0KY29sbGVjdF9tZXRyaWNzKGZpbmFsX3Jlcy5sbikNCmBgYA0KDQoNCiMjIENvbmNsdXNpb25lcw0KDQpQcmltZXJvIHF1ZSB0b2RvLCBlcyBpbXBvcnRhbnRlIGVudGVuZGVyIHF1ZSBlc3RvcyBkYXRvcyBmdWVyb24gcmVjb2xlY3RhZG9zIGR1cmFudGUgbGEgcGFuZGVtaWEsIHBvciBsbyBjdWFsIGxhcyBjb25jbHVzaW9uZXMgcXVlIGFsY2FuemFtb3MgYXF1w60gcXVpesOhcyBubyBzb24gdsOhbGlkYXMgZW4gY29uZGljaW9uZXMgIm5vcm1hbGVzIi4gSGFiaWVuZG8gZGVzcGVqYWRvIGVzdG8sIGNyZW8gcXVlIGhheSBxdWUgc2XDsWFsYXIgcXVlIG5vcyBwYXJlY2Ugc29ycHJlbmRlbnRlIHF1ZSBjb250cmFyaW8gYSBsbyBxdWUgY3Jlw61hbW9zIGVuIHVuIHByaW5jaXBpbyBtdWNoYXMgZGUgbGFzIHZhcmlhYmxlcyBkZW1vZ3LDoWZpY2FzLCBjb21vIHJhemEgbyBnw6luZXJvLCBubyBlcmFuIHRhbiBpbXBvcnRhbnRlcyBjb21vIHBlbnPDoWJhbW9zLiANCg0KRXMgcG9zaWJsZSBwZW5zYXIgcXVlIGxhIHBvbMOtdGljYSBww7pibGljYSBwdWVkZSBqdWdhciB1biByb2wgaW1wb3J0YW50ZSBlbiBsYSByZWR1Y2Npw7NuIGRlIGxhIHBvYnJlemEuIEVsZW1lbnRvcyBjb21vIHNhbHVkLCBlZHVjYWNpw7NuIHkgdml2aWVuZGEgdGllbmVuIHVuIGZ1ZXJ0ZSBwb2RlciBwcmVkaWN0aXZvIHNvYnJlIGxhIHBvYnJlemEuIFNpIGVzIHF1ZSBzZSBmb3J0YWxlY2VuIHBvbMOtdGljYXMgcMO6YmxpY2FzIHF1ZSBheXVkZW4gYSBmYWNpbGl0YXIgZWwgYWNjZXNvIGEgZXN0b3MgMyBlbGVtZW50b3MgY3JlbyBxdWUgZXhpc3RlIGxhIHBvc2liaWxpZGFkIGRlIHJlZHVjaXIgYcO6biBtw6FzIGxhIHBvYnJlemEuDQoNCkVzdGUgcHJveWVjdG8gZnVlIHN1bWFtZW50ZSBjb21wbGVqbyBkZSByZWFsaXphciwgZW4gZ3JhbiBwYXJ0ZSBkZWJpZG8gYSBsbyBncmFuZGUgcXVlIGVyYSBsYSBiYXNlIGRlIGRhdG9zLCBsbyBjdWFsIHByb3ZvY28gcXVlIGFmaW5hciBsb3MgZGF0b3MgZnVlcmEgdW4gcHJvY2VzbyBtdXkgY29zdG9zbyBjb21wdXRhY2lvbmFsbWVudGUsIGVzIGRlY2lyLCB0b21hYmEgbXVjaG8gdGllbXBvIGFmaW5hciBsb3MgaGlwZXJwYXLDoW1ldHJvcyBkZSBsb3MgbW9kZWxvcywgbG8gcXVlIGhpem8gZWwgZmx1am8gZGUgdHJhYmFqbyBtdXkgY29tcGxlam8uIFBvciBsbyB0YW50bywgcGllbnNvIHF1ZSBoYXkgbXVjaMOtc2ltbyBlc3BhY2lvIHBhcmEgbWVqb3JhciBsb3MgbW9kZWxvcyBzaSBlcyBxdWUgc2UgdGllbmUgYWNjZXNvIGEgc2Vydmlkb3JlcyBxdWUgbm9zIHBlcm1pdGFuIGFnaWxpemFyIGVsIHByb2Nlc28uIFBvciDDumx0aW1vLCBtZSBndXN0YXLDrWEgdm9sdmVyIGEgc2XDsWFsYXIgcXVlIGhheSBxdWUgc2VyIG11eSBjdWlkYWRvc29zIGNvbiBoYWNlciBnZW5lcmFsaXphY2lvbmVzIGNvbiBsb3MgcmVzdWx0YWRvcyBkZSBlc3RlIHByb3llY3RvLCBkYWRvIHF1ZSBsb3MgZGF0b3MgZnVlcm9uIHJlY29sZWN0YWRvcyBlbiBtZWRpbyBkZSB1bmEgc2l0dWFjacOzbiB0YW4gaW51c3VhbCBjb21vIGZ1ZSBsYSBjcmlzaXMgc2FuaXRhcmlhIGRlIDIwMjAuDQoNCg0K