Presentación
En el marco del cálculo del costo de menstruar en Argentina, llevado a cabo desde la campaña #MenstruAcción y EcoFeminita, en el presente documento de trabajo se encuentra la exploración, organización y limpieza de los datos obtenidos mediante el #MenstruScrapper, desarrollado por Nayla Portas de [LAS] de sistemas. El #MenstruScrapper fue ejecutado el día 13 de Marzo de 2022 sobre la página Precios Claros, sumándose esta información a la obtenida anteriormente en Septiembre y Marzo de 2019, Marzo y Septiembre de 2020, y Marzo y Septiembre de 2021. En esta instancia, se obtuvieron 32.510 observaciones en total.
- Respecto de los tampones: Se obtuvieron 8.368 precios.
- Respecto de las toallitas: Se obtuvieron 24.142 precios.
En nuestro repositorio se encuentran aclaradas todas las fuentes adicionales a las que se recurrió para realizar el cálculo y los archivos correspondientes. En otro paso se encuentra el cálculo propiamente dicho del costo anual de menstruar.
Preparando el entorno de trabajo
Comenzamos levantando las librerías necesarias, y cargando los datos que se encuentran en formato .RDS. Aprovechamos para tener una vista previa de los datos.
library(tidyverse)
library(readxl)
library(DT)
datos <- readRDS("Fuentes/precios-gestion-menstrual-2022-03-13-limpio.RDS")
head(datos)
A su vez, se carga la estimación, por cada provincia, de personas que menstrúan. Como está aclarado en la carpeta de fuentes, esto sale de las proyecciones poblacionales del INDEC para 2021, teniendo en cuenta que la menarca se estima en los 13 años y la menopausia en 49 años. Estos datos se van a utilizar para ponderar el precio promedio de cada provincia a la hora de agregar en un indicador nacional. Como se encuentran en un archivo .xls
, usamos la función read_excel()
. Obtenemos también una vista previa de la estructura de estos datos.
menstruan <- read_excel("Fuentes/poblaciones.xls") %>%
select(Provincia, Menstruan) # Para sacar las columnas con comentarios
head(menstruan)
A continuación, calculamos el total a nivel nacional de personas que menstrúan, sumando los datos de todas las provincias. Y, dividiendo los datos de cada provincia por dicho total, obtenemos las proporciones que nos van a servir para ponderar los promedios de precio según el peso de cada una de las provincias. Como guardo estas modificaciones bajo el mismo nombre, la información será pisada en la misma tabla menstruan
, de la que se vuelve a presentar una vista previa.
menstruan <- menstruan %>%
mutate(total = sum(Menstruan),
pond = Menstruan/total) %>%
select(Provincia, pond)
head(menstruan)
Además, considerando que hay outliers (valores atípicos) en los precios unitarios, a la hora de calcular los promedios de precios provinciales se remueven “las colas” de la distribución, utilizando una media alfa podada:
Cálculo y Resultados
A continuación ya procedemos a calcular los precios promedio de toallitas y tampones. Para el caso del total nacional, primero habrá que calcular los precios promedio (por unidad) de cada provincia, para luego agregarlos en un promedio general. Una vez que tenemos precios representativos de toallitas y tampones, podremos estimar un costo anual por persona de acuerdo a las estimaciones de cuántos ciclos por año presentan las personas que menstrúan, y cuántos productos utilizan por ciclo.
Total Nacional
Toallitas
Promedio del precio por unidad
Para calcular el precio promedio de cada provincia tomamos los datos, los filtramos para quedarnos únicamente con las toallitas, agrupando las observaciones según la variable Provincia
. Con summarise()
podemos definir indicadores que agregan la información para cada grupo, así que definimos el promedio provincial como una media podada. Es en el parámetro trim
que se aclara la proporción de los datos que se podan. Finalmente, anexamos en una nueva columna los ponderadores de cada provincia, así toda la información necesaria para el cálculo del promedio nacional se encuentra en la misma tabla.
toallitas <- datos %>%
filter(Categoría == "toallitas") %>%
group_by(Provincia) %>%
summarise(prom = mean(precio_unidad, trim = 0.025)) %>%
left_join(., menstruan, by = "Provincia")
head(toallitas)
Luego, el valor promedio para el total nacional se calcula como una media ponderada. La función weighted.mean()
nos permite aclarar la variable a promediar, y la variable que funciona como ponderador.
valor_toallitas <- weighted.mean(toallitas$prom, toallitas$pond)
Toallitas: El precio promedio por unidad es de $17.1
Gasto por año por persona
El gasto anual por persona se calcula teniendo en cuenta:
- ciclos por año: 13
- productos utilizados por ciclo: 22
(Ambos datos se encuentran aclarados en las Fuentes
)
ciclos_por_anio <- 13
productos_por_ciclo <- 22
productos_por_anio <- ciclos_por_anio * productos_por_ciclo
gasto_por_anio_toallitas <- valor_toallitas * productos_por_anio
Toallitas: El gasto promedio por año por persona es de $4890.27
Tampones
Se realiza un procedimiento semejante para el caso de los tampones.
Promedio del precio por unidad
tampones <- datos %>%
filter(Categoría == "tampones") %>%
group_by(Provincia) %>%
summarise(prom = mean(precio_unidad, trim = 0.025)) %>%
left_join(., menstruan, by = "Provincia")
valor_tampones <- weighted.mean(tampones$prom, tampones$pond)
Tampones: El precio promedio por unidad es de $18.57
Gasto por año por persona
El gasto anual por persona se calcula teniendo en cuenta:
- ciclos por año: 13
- productos utilizados por ciclo: 22
gasto_por_anio_tampones <- valor_tampones * productos_por_anio
Tampones: El gasto promedio por año por persona es de $5311.27
Por provincia
Para obtener los datos de cada provincia el procedimiento es aún más sencillo. En la variable gasto_por_anio
, cada precio promedio se multiplica por la cantidad de productos que se utilizan anualmente. Por una cuestión de exposición, se quitan de la tabla las columnas con aquellos precios promedios por unidad, y los ponderadores provinciales.
Toallitas
Gasto por año por persona
toallitas <- toallitas %>%
mutate(gasto_por_anio = round(prom * productos_por_anio, 2)) %>%
select(-prom, -pond) %>%
arrange(gasto_por_anio)
toallitas %>%
datatable(
extensions = 'Buttons',
options = list(dom = 'Bfrtip',
buttons = c('copy', 'csv', 'excel', 'pdf', 'print')))
Tampones
Gasto por año por persona
tampones <- tampones %>%
mutate(gasto_por_anio = round(prom * productos_por_anio, 2)) %>%
select(-prom, -pond) %>%
arrange(gasto_por_anio)
tampones %>%
datatable(
extensions = 'Buttons',
options = list(dom = 'Bfrtip',
buttons = c('copy', 'csv', 'excel', 'pdf', 'print')))
Aumentos
Como esta es la séptima vez que realizamos este ejercicio de estimación semestral, podemos ver cómo evolucionaron los precios de toallitas y tampones en el último año. También, con los datos del Índice de Precios al Consumidor (IPC - INDEC), se puede realizar una comparación entre la evolución de estos productos de gestión menstrual y el nivel general de precios, el rubro alimentos y bebidas no alcohólicas, y el de Salud. Ambas series se levantan desde archivos de extensión .xlsx en las tablas serie_inflacion
y precios_pgm
.
serie_inflacion <- read_excel("Fuentes/serie_inflacion.xlsx")
precios_pgm <- read_excel("Fuentes/serie_precios_pgm.xlsx")
head(serie_inflacion)
head(precios_pgm)
Asegurándonos de que los datos se encuentran ordenados por fecha, podemos transformar ambas series para que se encuentren expresadas con el mes de marzo 2019 = 100. De esta forma podremos comparar la evolución de ambas. Esto lo hacemos modificando las series con las que contamos dividiendo todos los valores por el primero de ellos (y multiplicando por 100). La selección del primer elemento de la serie se realizó con la función first()
.
base100 <- serie_inflacion %>%
mutate(`Nivel General` = `Nivel General`/first(`Nivel General`) * 100,
`Alimentos y bebidas no alcohólicas` = `Alimentos y bebidas no alcohólicas`/
first(`Alimentos y bebidas no alcohólicas`) * 100,
Salud = Salud/first(Salud) * 100)
head(base100)
pgm_100 <- precios_pgm %>%
mutate(Toallitas = Toallitas/first(Toallitas) * 100,
Tampones = Tampones/first(Tampones) * 100)
head(pgm_100)
Podemos anexar la evolución de los precios de los productos de gestión menstrual a la serie de inflación, por más que esta última tenga valores mensuales y nuestros datos se hayan recolectado cada seis meses, utilizando Mes
como variable de link. Luego reordenamos la información para que todas las variables, excepto Mes
, se presenten en una variable Categoría
(con valores “Nivel General”, “Salud”, “Toallitas”, etc.), y los valores de cada serie se agrupen en la variable Indice
. No habrá datos en diversos meses para toallitas y tampones, así que filtramos esas filas vacías, y finalmente creamos la variable Grupo
para identificar como “IPC” a las categorías del índice de precios al consumidor, y como “PGM” a los productos de gestión menstrual.
# Esto se puede correr "de a poco" para ver cómo cambian las cosas en cada paso
base100 <- base100 %>%
left_join(., pgm_100, by = "Mes") %>%
pivot_longer(-Mes, names_to = "Categoria", values_to = "Indice") %>%
filter(!is.na(Indice)) %>%
mutate(Grupo = case_when(Categoria %in% c("Nivel General", "Alimentos y bebidas no alcohólicas", "Salud") ~ "IPC",
Categoria %in% c("Toallitas", "Tampones") ~ "PGM"))
head(base100)
A fines de graficar esta información, por esta vez se prescinde de la serie de “Alimentos y bedidas no alcohólicas” porque no agrega tanta información en la comparabilidad, y sí ocupa espacio visual que puede obstruir la comparación de las demás series.
base100bis <- base100 %>%
filter(Categoria != "Alimentos y bebidas no alcohólicas")
Para el gráfico puedo definir un vector de colores que sirva para distinguir las series de IPC (en la gama de azules) y las de productos de gestión menstrual (en la gama del rojo).
colorcitos <- c('royalblue4', 'royalblue',
'violetred', 'red')
Finalmente, definimos nuestro gráfico. Tomando la tabla base100bis
,
library(ggrepel)
ggplot(base100bis, aes(x = Mes, y = Indice, group = Categoria, color = Categoria)) +
geom_line(data = base100bis %>% filter(Grupo == "PGM"), size = 1, alpha = 1) +
geom_line(data = base100bis %>% filter(Grupo == "IPC"), alpha = 1, size = 1) +
geom_point(data = base100bis %>% filter(Grupo == "PGM"), size = 2) +
theme_minimal() +
theme(legend.position = "top",
text = element_text(size = 12)) +
scale_color_manual(values = colorcitos) +
expand_limits(x = as.POSIXct(c("2019-03-01", "2020-11-01"))) +
labs(title = "Inflación de Toallitas y Tampones vs. Salud y Nivel General del IPC-INDEC",
subtitle = "Marzo 2019 - Marzo 2022", #<------------------------------------------------- CAMBIAR
x = "",
y = "Indice de precios",
caption = "Fuente: #MenstruAcción y #EcoFemiData (EcoFeminita)") +
scale_x_datetime(breaks = seq(as.POSIXct('2019-03-01'), by='6 months', length = 7), #<------------------------ CAMBIAR
labels = c("03-2019", "09-2019", "03-2020", "09-2020", "03-2021", "09-2021", "03-2022")) #<------------- CAMBIAR
LS0tDQp0aXRsZTogIkPDoWxjdWxvOiDCv0N1w6FudG8gY3Vlc3RhIG1lbnN0cnVhcj8iDQpzdWJ0aXRsZTogIkRhdG9zIGRlIE1hcnpvIDIwMjIiDQphdXRob3I6ICJFY29mZW1pbml0YSAvICNNZW5zdHJ1QWNjacOzbiAvIEVjb2ZlbWlkYXRhIg0Kb3V0cHV0Og0KICBodG1sX25vdGVib29rOg0KICAgIHRvYzogZmFsc2UNCiAgICB0b2NfZmxvYXQ6IHRydWUNCiAgICB0b2NfZGVwdGg6IDUNCi0tLQ0KDQo8c3R5bGUgdHlwZT0idGV4dC9jc3MiPg0KICBib2R5ew0KICBmb250LXNpemU6IDE0cHQ7DQp9DQo8L3N0eWxlPg0KDQohW10oaW1nL0xvZ29zIEVjb0ZlbWluaXRhLTAzLnBuZyl7d2lkdGg9MTMwcHh9ICFbXShpbWcvTUVOU1RSVUFDQ0lPTi5wbmcpe3dpZHRoPTExMHB4fSAhW10oaW1nL0Vjb2ZlbWlkYXRhLnBuZyl7d2lkdGg9MTAwcHh9DQoNCg0KIyMgUHJlc2VudGFjacOzbg0KDQpFbiBlbCBtYXJjbyBkZWwgY8OhbGN1bG8gZGVsIGNvc3RvIGRlIG1lbnN0cnVhciBlbiBBcmdlbnRpbmEsIGxsZXZhZG8gYSBjYWJvIGRlc2RlIGxhIGNhbXBhw7FhICNNZW5zdHJ1QWNjacOzbiB5IEVjb0ZlbWluaXRhLCBlbiBlbCBwcmVzZW50ZSBkb2N1bWVudG8gZGUgdHJhYmFqbyBzZSBlbmN1ZW50cmEgbGEgZXhwbG9yYWNpw7NuLCBvcmdhbml6YWNpw7NuIHkgbGltcGllemEgZGUgbG9zIGRhdG9zIG9idGVuaWRvcyBtZWRpYW50ZSBlbCBbI01lbnN0cnVTY3JhcHBlcl0oaHR0cHM6Ly9naXRodWIuY29tL25wb3J0YXMvbWVuc3RydXNjcmFwcGVyKSwgZGVzYXJyb2xsYWRvIHBvciBOYXlsYSBQb3J0YXMgZGUgW0xBU10gZGUgc2lzdGVtYXMuIEVsICNNZW5zdHJ1U2NyYXBwZXIgZnVlIGVqZWN1dGFkbyBlbCBkw61hIDEzIGRlIE1hcnpvIGRlIDIwMjIgc29icmUgbGEgcMOhZ2luYSBQcmVjaW9zIENsYXJvcywgc3Vtw6FuZG9zZSBlc3RhIGluZm9ybWFjacOzbiBhIGxhIG9idGVuaWRhIGFudGVyaW9ybWVudGUgZW4gU2VwdGllbWJyZSB5IE1hcnpvIGRlIDIwMTksIE1hcnpvIHkgU2VwdGllbWJyZSBkZSAyMDIwLCB5IE1hcnpvIHkgU2VwdGllbWJyZSBkZSAyMDIxLiBFbiBlc3RhIGluc3RhbmNpYSwgc2Ugb2J0dXZpZXJvbiAzMi41MTAgb2JzZXJ2YWNpb25lcyBlbiB0b3RhbC4NCg0KKyBSZXNwZWN0byBkZSBsb3MgdGFtcG9uZXM6IFNlIG9idHV2aWVyb24gOC4zNjggcHJlY2lvcy4NCisgUmVzcGVjdG8gZGUgbGFzIHRvYWxsaXRhczogU2Ugb2J0dXZpZXJvbiAyNC4xNDIgcHJlY2lvcy4NCg0KRW4gW251ZXN0cm8gcmVwb3NpdG9yaW9dKGh0dHBzOi8vZ2l0aHViLmNvbS9FY29mZW1pbml0YS9FY29GZW1pRGF0YS90cmVlL21hc3Rlci9NZW5zdHJ1QWNjaW9uL2N1YW50b19jdWVzdGFfbWVuc3RydWFyKSBzZSBlbmN1ZW50cmFuIGFjbGFyYWRhcyB0b2RhcyBsYXMgZnVlbnRlcyBhZGljaW9uYWxlcyBhIGxhcyBxdWUgc2UgcmVjdXJyacOzIHBhcmEgcmVhbGl6YXIgZWwgY8OhbGN1bG8geSBsb3MgYXJjaGl2b3MgY29ycmVzcG9uZGllbnRlcy4gRW4gb3RybyBwYXNvIHNlIGVuY3VlbnRyYSBlbCBjw6FsY3VsbyBwcm9waWFtZW50ZSBkaWNobyBkZWwgY29zdG8gYW51YWwgZGUgbWVuc3RydWFyLiANCg0KIyMgUHJlcGFyYW5kbyBlbCBlbnRvcm5vIGRlIHRyYWJham8NCg0KQ29tZW56YW1vcyBsZXZhbnRhbmRvIGxhcyBsaWJyZXLDrWFzIG5lY2VzYXJpYXMsIHkgY2FyZ2FuZG8gbG9zIGRhdG9zIHF1ZSBzZSBlbmN1ZW50cmFuIGVuIGZvcm1hdG8gLlJEUy4gQXByb3ZlY2hhbW9zIHBhcmEgdGVuZXIgdW5hIHZpc3RhIHByZXZpYSBkZSBsb3MgZGF0b3MuDQoNCmBgYHtyIGVjaG89VFJVRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCmxpYnJhcnkodGlkeXZlcnNlKQ0KbGlicmFyeShyZWFkeGwpDQpsaWJyYXJ5KERUKQ0KYGBgDQoNCmBgYHtyIGVjaG89VFJVRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCmRhdG9zIDwtIHJlYWRSRFMoIkZ1ZW50ZXMvcHJlY2lvcy1nZXN0aW9uLW1lbnN0cnVhbC0yMDIyLTAzLTEzLWxpbXBpby5SRFMiKQ0KDQpoZWFkKGRhdG9zKQ0KYGBgDQoNCkEgc3UgdmV6LCBzZSBjYXJnYSBsYSBlc3RpbWFjacOzbiwgcG9yIGNhZGEgcHJvdmluY2lhLCBkZSBwZXJzb25hcyBxdWUgbWVuc3Ryw7phbi4gQ29tbyBlc3TDoSBhY2xhcmFkbyBlbiBsYSBjYXJwZXRhIGRlIGZ1ZW50ZXMsIGVzdG8gc2FsZSBkZSBsYXMgcHJveWVjY2lvbmVzIHBvYmxhY2lvbmFsZXMgZGVsIElOREVDIHBhcmEgMjAyMSwgdGVuaWVuZG8gZW4gY3VlbnRhIHF1ZSBsYSBtZW5hcmNhIHNlIGVzdGltYSBlbiBsb3MgMTMgYcOxb3MgeSBsYSBtZW5vcGF1c2lhIGVuIDQ5IGHDsW9zLiBFc3RvcyBkYXRvcyBzZSB2YW4gYSB1dGlsaXphciBwYXJhIHBvbmRlcmFyIGVsIHByZWNpbyBwcm9tZWRpbyBkZSBjYWRhIHByb3ZpbmNpYSBhIGxhIGhvcmEgZGUgYWdyZWdhciBlbiB1biBpbmRpY2Fkb3IgbmFjaW9uYWwuIENvbW8gc2UgZW5jdWVudHJhbiBlbiB1biBhcmNoaXZvIGAueGxzYCwgdXNhbW9zIGxhIGZ1bmNpw7NuIGByZWFkX2V4Y2VsKClgLiBPYnRlbmVtb3MgdGFtYmnDqW4gdW5hIHZpc3RhIHByZXZpYSBkZSBsYSBlc3RydWN0dXJhIGRlIGVzdG9zIGRhdG9zLg0KDQpgYGB7ciBlY2hvPVRSVUUsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQptZW5zdHJ1YW4gPC0gcmVhZF9leGNlbCgiRnVlbnRlcy9wb2JsYWNpb25lcy54bHMiKSAlPiUgDQogIHNlbGVjdChQcm92aW5jaWEsIE1lbnN0cnVhbikgIyBQYXJhIHNhY2FyIGxhcyBjb2x1bW5hcyBjb24gY29tZW50YXJpb3MNCg0KaGVhZChtZW5zdHJ1YW4pDQpgYGANCg0KQSBjb250aW51YWNpw7NuLCBjYWxjdWxhbW9zIGVsIHRvdGFsIGEgbml2ZWwgbmFjaW9uYWwgZGUgcGVyc29uYXMgcXVlIG1lbnN0csO6YW4sIHN1bWFuZG8gbG9zIGRhdG9zIGRlIHRvZGFzIGxhcyBwcm92aW5jaWFzLiBZLCBkaXZpZGllbmRvIGxvcyBkYXRvcyBkZSBjYWRhIHByb3ZpbmNpYSBwb3IgZGljaG8gdG90YWwsIG9idGVuZW1vcyBsYXMgcHJvcG9yY2lvbmVzIHF1ZSBub3MgdmFuIGEgc2VydmlyIHBhcmEgcG9uZGVyYXIgbG9zIHByb21lZGlvcyBkZSBwcmVjaW8gc2Vnw7puIGVsIHBlc28gZGUgY2FkYSB1bmEgZGUgbGFzIHByb3ZpbmNpYXMuIENvbW8gZ3VhcmRvIGVzdGFzIG1vZGlmaWNhY2lvbmVzIGJham8gZWwgbWlzbW8gbm9tYnJlLCBsYSBpbmZvcm1hY2nDs24gc2Vyw6EgcGlzYWRhIGVuIGxhIG1pc21hIHRhYmxhIGBtZW5zdHJ1YW5gLCBkZSBsYSBxdWUgc2UgdnVlbHZlIGEgcHJlc2VudGFyIHVuYSB2aXN0YSBwcmV2aWEuDQoNCmBgYHtyIGVjaG89VFJVRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCm1lbnN0cnVhbiA8LSBtZW5zdHJ1YW4gJT4lIA0KICBtdXRhdGUodG90YWwgPSBzdW0oTWVuc3RydWFuKSwNCiAgICAgICAgIHBvbmQgPSBNZW5zdHJ1YW4vdG90YWwpICU+JSANCiAgc2VsZWN0KFByb3ZpbmNpYSwgcG9uZCkNCg0KaGVhZChtZW5zdHJ1YW4pDQpgYGANCg0KQWRlbcOhcywgY29uc2lkZXJhbmRvIHF1ZSBoYXkgb3V0bGllcnMgKHZhbG9yZXMgYXTDrXBpY29zKSBlbiBsb3MgcHJlY2lvcyB1bml0YXJpb3MsIGEgbGEgaG9yYSBkZSBjYWxjdWxhciBsb3MgcHJvbWVkaW9zIGRlIHByZWNpb3MgcHJvdmluY2lhbGVzIHNlIHJlbXVldmVuICJsYXMgY29sYXMiIGRlIGxhIGRpc3RyaWJ1Y2nDs24sIHV0aWxpemFuZG8gdW5hIG1lZGlhIGFsZmEgcG9kYWRhOiAgICAgDQoNCi0gYWxmYSA9IDIuNSUNCg0KIyMgQ8OhbGN1bG8geSBSZXN1bHRhZG9zDQoNCkEgY29udGludWFjacOzbiB5YSBwcm9jZWRlbW9zIGEgY2FsY3VsYXIgbG9zIHByZWNpb3MgcHJvbWVkaW8gZGUgdG9hbGxpdGFzIHkgdGFtcG9uZXMuIFBhcmEgZWwgY2FzbyBkZWwgdG90YWwgbmFjaW9uYWwsIHByaW1lcm8gaGFicsOhIHF1ZSBjYWxjdWxhciBsb3MgcHJlY2lvcyBwcm9tZWRpbyAocG9yIHVuaWRhZCkgZGUgY2FkYSBwcm92aW5jaWEsIHBhcmEgbHVlZ28gYWdyZWdhcmxvcyBlbiB1biBwcm9tZWRpbyBnZW5lcmFsLiBVbmEgdmV6IHF1ZSB0ZW5lbW9zIHByZWNpb3MgcmVwcmVzZW50YXRpdm9zIGRlIHRvYWxsaXRhcyB5IHRhbXBvbmVzLCBwb2RyZW1vcyBlc3RpbWFyIHVuIGNvc3RvIGFudWFsIHBvciBwZXJzb25hIGRlIGFjdWVyZG8gYSBsYXMgZXN0aW1hY2lvbmVzIGRlIGN1w6FudG9zIGNpY2xvcyBwb3IgYcOxbyBwcmVzZW50YW4gbGFzIHBlcnNvbmFzIHF1ZSBtZW5zdHLDumFuLCB5IGN1w6FudG9zIHByb2R1Y3RvcyB1dGlsaXphbiBwb3IgY2ljbG8uDQoNCiMjIFRvdGFsIE5hY2lvbmFsDQoNCiMjIyBUb2FsbGl0YXMNCg0KIyMjIFByb21lZGlvIGRlbCBwcmVjaW8gcG9yIHVuaWRhZA0KDQpQYXJhIGNhbGN1bGFyIGVsIHByZWNpbyBwcm9tZWRpbyBkZSBjYWRhIHByb3ZpbmNpYSB0b21hbW9zIGxvcyBkYXRvcywgbG9zIGZpbHRyYW1vcyBwYXJhIHF1ZWRhcm5vcyDDum5pY2FtZW50ZSBjb24gbGFzIHRvYWxsaXRhcywgYWdydXBhbmRvIGxhcyBvYnNlcnZhY2lvbmVzIHNlZ8O6biBsYSB2YXJpYWJsZSBgUHJvdmluY2lhYC4gQ29uIGBzdW1tYXJpc2UoKWAgcG9kZW1vcyBkZWZpbmlyIGluZGljYWRvcmVzIHF1ZSBhZ3JlZ2FuIGxhIGluZm9ybWFjacOzbiBwYXJhIGNhZGEgZ3J1cG8sIGFzw60gcXVlIGRlZmluaW1vcyBlbCBwcm9tZWRpbyBwcm92aW5jaWFsIGNvbW8gdW5hIG1lZGlhIHBvZGFkYS4gRXMgZW4gZWwgcGFyw6FtZXRybyBgdHJpbWAgcXVlIHNlIGFjbGFyYSBsYSBwcm9wb3JjacOzbiBkZSBsb3MgZGF0b3MgcXVlIHNlIHBvZGFuLiBGaW5hbG1lbnRlLCBhbmV4YW1vcyBlbiB1bmEgbnVldmEgY29sdW1uYSBsb3MgcG9uZGVyYWRvcmVzIGRlIGNhZGEgcHJvdmluY2lhLCBhc8OtIHRvZGEgbGEgaW5mb3JtYWNpw7NuIG5lY2VzYXJpYSBwYXJhIGVsIGPDoWxjdWxvIGRlbCBwcm9tZWRpbyBuYWNpb25hbCBzZSBlbmN1ZW50cmEgZW4gbGEgbWlzbWEgdGFibGEuDQoNCmBgYHtyIGVjaG89VFJVRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCnRvYWxsaXRhcyA8LSBkYXRvcyAlPiUgDQogIGZpbHRlcihDYXRlZ29yw61hID09ICJ0b2FsbGl0YXMiKSAlPiUNCiAgZ3JvdXBfYnkoUHJvdmluY2lhKSAlPiUgDQogIHN1bW1hcmlzZShwcm9tID0gbWVhbihwcmVjaW9fdW5pZGFkLCB0cmltID0gMC4wMjUpKSAlPiUgDQogIGxlZnRfam9pbiguLCBtZW5zdHJ1YW4sIGJ5ID0gIlByb3ZpbmNpYSIpDQoNCmhlYWQodG9hbGxpdGFzKQ0KYGBgDQoNCkx1ZWdvLCBlbCB2YWxvciBwcm9tZWRpbyBwYXJhIGVsIHRvdGFsIG5hY2lvbmFsIHNlIGNhbGN1bGEgY29tbyB1bmEgbWVkaWEgcG9uZGVyYWRhLiBMYSBmdW5jacOzbiBgd2VpZ2h0ZWQubWVhbigpYCBub3MgcGVybWl0ZSBhY2xhcmFyIGxhIHZhcmlhYmxlIGEgcHJvbWVkaWFyLCB5IGxhIHZhcmlhYmxlIHF1ZSBmdW5jaW9uYSBjb21vIHBvbmRlcmFkb3IuDQoNCmBgYHtyIGVjaG89VFJVRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCnZhbG9yX3RvYWxsaXRhcyA8LSB3ZWlnaHRlZC5tZWFuKHRvYWxsaXRhcyRwcm9tLCB0b2FsbGl0YXMkcG9uZCkNCmBgYA0KDQo8Zm9udCBzaXplPSI2Ij4gVG9hbGxpdGFzOiBFbCBwcmVjaW8gcHJvbWVkaW8gcG9yIHVuaWRhZCBlcyBkZSAkYHIgcm91bmQodmFsb3JfdG9hbGxpdGFzLCAyKWAgPC9mb250PiANCg0KIyMjIEdhc3RvIHBvciBhw7FvIHBvciBwZXJzb25hDQoNCkVsIGdhc3RvIGFudWFsIHBvciBwZXJzb25hIHNlIGNhbGN1bGEgdGVuaWVuZG8gZW4gY3VlbnRhOg0KDQotIGNpY2xvcyBwb3IgYcOxbzogMTMNCi0gcHJvZHVjdG9zIHV0aWxpemFkb3MgcG9yIGNpY2xvOiAyMg0KDQooQW1ib3MgZGF0b3Mgc2UgZW5jdWVudHJhbiBhY2xhcmFkb3MgZW4gbGFzIGBGdWVudGVzYCkNCg0KYGBge3IgZWNobz1UUlVFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KY2ljbG9zX3Bvcl9hbmlvIDwtIDEzDQpwcm9kdWN0b3NfcG9yX2NpY2xvIDwtIDIyDQpwcm9kdWN0b3NfcG9yX2FuaW8gPC0gY2ljbG9zX3Bvcl9hbmlvICogcHJvZHVjdG9zX3Bvcl9jaWNsbw0KDQpnYXN0b19wb3JfYW5pb190b2FsbGl0YXMgPC0gdmFsb3JfdG9hbGxpdGFzICogcHJvZHVjdG9zX3Bvcl9hbmlvDQpgYGANCg0KPGZvbnQgc2l6ZT0iNiI+IFRvYWxsaXRhczogRWwgZ2FzdG8gcHJvbWVkaW8gcG9yIGHDsW8gcG9yIHBlcnNvbmEgZXMgZGUgJGByIHJvdW5kKGdhc3RvX3Bvcl9hbmlvX3RvYWxsaXRhcywgMilgIDwvZm9udD4gDQoNCiMjIyBUYW1wb25lcw0KDQpTZSByZWFsaXphIHVuIHByb2NlZGltaWVudG8gc2VtZWphbnRlIHBhcmEgZWwgY2FzbyBkZSBsb3MgdGFtcG9uZXMuDQoNCiMjIyBQcm9tZWRpbyBkZWwgcHJlY2lvIHBvciB1bmlkYWQNCg0KYGBge3IgZWNobz1UUlVFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KdGFtcG9uZXMgPC0gZGF0b3MgJT4lIA0KICBmaWx0ZXIoQ2F0ZWdvcsOtYSA9PSAidGFtcG9uZXMiKSAlPiUNCiAgZ3JvdXBfYnkoUHJvdmluY2lhKSAlPiUgDQogIHN1bW1hcmlzZShwcm9tID0gbWVhbihwcmVjaW9fdW5pZGFkLCB0cmltID0gMC4wMjUpKSAlPiUgDQogIGxlZnRfam9pbiguLCBtZW5zdHJ1YW4sIGJ5ID0gIlByb3ZpbmNpYSIpDQoNCnZhbG9yX3RhbXBvbmVzIDwtIHdlaWdodGVkLm1lYW4odGFtcG9uZXMkcHJvbSwgdGFtcG9uZXMkcG9uZCkNCmBgYA0KDQo8Zm9udCBzaXplPSI2Ij4gVGFtcG9uZXM6IEVsIHByZWNpbyBwcm9tZWRpbyBwb3IgdW5pZGFkIGVzIGRlICRgciByb3VuZCh2YWxvcl90YW1wb25lcywgMilgIDwvZm9udD4gDQoNCiMjIyBHYXN0byBwb3IgYcOxbyBwb3IgcGVyc29uYQ0KDQpFbCBnYXN0byBhbnVhbCBwb3IgcGVyc29uYSBzZSBjYWxjdWxhIHRlbmllbmRvIGVuIGN1ZW50YToNCg0KLSBjaWNsb3MgcG9yIGHDsW86IDEzDQotIHByb2R1Y3RvcyB1dGlsaXphZG9zIHBvciBjaWNsbzogMjINCg0KYGBge3IgZWNobz1UUlVFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KZ2FzdG9fcG9yX2FuaW9fdGFtcG9uZXMgPC0gdmFsb3JfdGFtcG9uZXMgKiBwcm9kdWN0b3NfcG9yX2FuaW8NCmBgYA0KDQo8Zm9udCBzaXplPSI2Ij4gVGFtcG9uZXM6IEVsIGdhc3RvIHByb21lZGlvIHBvciBhw7FvIHBvciBwZXJzb25hIGVzIGRlICRgciByb3VuZChnYXN0b19wb3JfYW5pb190YW1wb25lcywgMilgIDwvZm9udD4gDQoNCiMjIFBvciBwcm92aW5jaWENCg0KUGFyYSBvYnRlbmVyIGxvcyBkYXRvcyBkZSBjYWRhIHByb3ZpbmNpYSBlbCBwcm9jZWRpbWllbnRvIGVzIGHDum4gbcOhcyBzZW5jaWxsby4gRW4gbGEgdmFyaWFibGUgYGdhc3RvX3Bvcl9hbmlvYCwgY2FkYSBwcmVjaW8gcHJvbWVkaW8gc2UgbXVsdGlwbGljYSBwb3IgbGEgY2FudGlkYWQgZGUgcHJvZHVjdG9zIHF1ZSBzZSB1dGlsaXphbiBhbnVhbG1lbnRlLiBQb3IgdW5hIGN1ZXN0acOzbiBkZSBleHBvc2ljacOzbiwgc2UgcXVpdGFuIGRlIGxhIHRhYmxhIGxhcyBjb2x1bW5hcyBjb24gYXF1ZWxsb3MgcHJlY2lvcyBwcm9tZWRpb3MgcG9yIHVuaWRhZCwgeSBsb3MgcG9uZGVyYWRvcmVzIHByb3ZpbmNpYWxlcy4NCg0KIyMjIFRvYWxsaXRhcw0KDQojIyMgR2FzdG8gcG9yIGHDsW8gcG9yIHBlcnNvbmENCg0KYGBge3IgZWNobz1UUlVFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KdG9hbGxpdGFzIDwtIHRvYWxsaXRhcyAlPiUgDQogIG11dGF0ZShnYXN0b19wb3JfYW5pbyA9IHJvdW5kKHByb20gKiBwcm9kdWN0b3NfcG9yX2FuaW8sIDIpKSAlPiUgDQogIHNlbGVjdCgtcHJvbSwgLXBvbmQpICU+JSANCiAgYXJyYW5nZShnYXN0b19wb3JfYW5pbykNCg0KdG9hbGxpdGFzICU+JQ0KICAgIGRhdGF0YWJsZSgNCiAgICBleHRlbnNpb25zID0gJ0J1dHRvbnMnLCANCiAgICBvcHRpb25zID0gbGlzdChkb20gPSAnQmZydGlwJywgDQogICAgICAgICAgICAgICAgICAgYnV0dG9ucyA9IGMoJ2NvcHknLCAnY3N2JywgJ2V4Y2VsJywgJ3BkZicsICdwcmludCcpKSkNCmBgYA0KDQojIyMgVGFtcG9uZXMNCg0KIyMjIEdhc3RvIHBvciBhw7FvIHBvciBwZXJzb25hDQoNCmBgYHtyIGVjaG89VFJVRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCnRhbXBvbmVzIDwtIHRhbXBvbmVzICU+JSANCiAgbXV0YXRlKGdhc3RvX3Bvcl9hbmlvID0gcm91bmQocHJvbSAqIHByb2R1Y3Rvc19wb3JfYW5pbywgMikpICU+JSANCiAgc2VsZWN0KC1wcm9tLCAtcG9uZCkgJT4lIA0KICBhcnJhbmdlKGdhc3RvX3Bvcl9hbmlvKQ0KDQp0YW1wb25lcyAlPiUgDQogICAgZGF0YXRhYmxlKA0KICAgIGV4dGVuc2lvbnMgPSAnQnV0dG9ucycsIA0KICAgIG9wdGlvbnMgPSBsaXN0KGRvbSA9ICdCZnJ0aXAnLCANCiAgICAgICAgICAgICAgICAgICBidXR0b25zID0gYygnY29weScsICdjc3YnLCAnZXhjZWwnLCAncGRmJywgJ3ByaW50JykpKQ0KYGBgDQoNCiMjIEF1bWVudG9zDQoNCkNvbW8gZXN0YSBlcyBsYSBzw6lwdGltYSB2ZXogcXVlIHJlYWxpemFtb3MgZXN0ZSBlamVyY2ljaW8gZGUgZXN0aW1hY2nDs24gc2VtZXN0cmFsLCBwb2RlbW9zIHZlciBjw7NtbyBldm9sdWNpb25hcm9uIGxvcyBwcmVjaW9zIGRlIHRvYWxsaXRhcyB5IHRhbXBvbmVzIGVuIGVsIMO6bHRpbW8gYcOxby4gVGFtYmnDqW4sIGNvbiBsb3MgZGF0b3MgZGVsIMONbmRpY2UgZGUgUHJlY2lvcyBhbCBDb25zdW1pZG9yIChJUEMgLSBJTkRFQyksIHNlIHB1ZWRlIHJlYWxpemFyIHVuYSBjb21wYXJhY2nDs24gZW50cmUgbGEgZXZvbHVjacOzbiBkZSBlc3RvcyBwcm9kdWN0b3MgZGUgZ2VzdGnDs24gbWVuc3RydWFsIHkgZWwgbml2ZWwgZ2VuZXJhbCBkZSBwcmVjaW9zLCBlbCBydWJybyBhbGltZW50b3MgeSBiZWJpZGFzIG5vIGFsY29ow7NsaWNhcywgeSBlbCBkZSBTYWx1ZC4gQW1iYXMgc2VyaWVzIHNlIGxldmFudGFuIGRlc2RlIGFyY2hpdm9zIGRlIGV4dGVuc2nDs24gLnhsc3ggZW4gbGFzIHRhYmxhcyBgc2VyaWVfaW5mbGFjaW9uYCB5IGBwcmVjaW9zX3BnbWAuDQoNCmBgYHtyIGVjaG89VFJVRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCnNlcmllX2luZmxhY2lvbiA8LSByZWFkX2V4Y2VsKCJGdWVudGVzL3NlcmllX2luZmxhY2lvbi54bHN4IikNCnByZWNpb3NfcGdtIDwtIHJlYWRfZXhjZWwoIkZ1ZW50ZXMvc2VyaWVfcHJlY2lvc19wZ20ueGxzeCIpDQpgYGANCg0KYGBge3IgZWNobz1UUlVFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KaGVhZChzZXJpZV9pbmZsYWNpb24pDQpgYGANCg0KYGBge3IgZWNobz1UUlVFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KaGVhZChwcmVjaW9zX3BnbSkNCmBgYA0KDQpBc2VndXLDoW5kb25vcyBkZSBxdWUgbG9zIGRhdG9zIHNlIGVuY3VlbnRyYW4gb3JkZW5hZG9zIHBvciBmZWNoYSwgcG9kZW1vcyB0cmFuc2Zvcm1hciBhbWJhcyBzZXJpZXMgcGFyYSBxdWUgc2UgZW5jdWVudHJlbiBleHByZXNhZGFzIGNvbiBlbCBtZXMgZGUgbWFyem8gMjAxOSA9IDEwMC4gRGUgZXN0YSBmb3JtYSBwb2RyZW1vcyBjb21wYXJhciBsYSBldm9sdWNpw7NuIGRlIGFtYmFzLiBFc3RvIGxvIGhhY2Vtb3MgbW9kaWZpY2FuZG8gbGFzIHNlcmllcyBjb24gbGFzIHF1ZSBjb250YW1vcyBkaXZpZGllbmRvIHRvZG9zIGxvcyB2YWxvcmVzIHBvciBlbCBwcmltZXJvIGRlIGVsbG9zICh5IG11bHRpcGxpY2FuZG8gcG9yIDEwMCkuIExhIHNlbGVjY2nDs24gZGVsIHByaW1lciBlbGVtZW50byBkZSBsYSBzZXJpZSBzZSByZWFsaXrDsyBjb24gbGEgZnVuY2nDs24gYGZpcnN0KClgLg0KDQpgYGB7ciBlY2hvPVRSVUUsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQpiYXNlMTAwIDwtIHNlcmllX2luZmxhY2lvbiAlPiUgDQogIG11dGF0ZShgTml2ZWwgR2VuZXJhbGAgPSBgTml2ZWwgR2VuZXJhbGAvZmlyc3QoYE5pdmVsIEdlbmVyYWxgKSAqIDEwMCwNCiAgICAgICAgIGBBbGltZW50b3MgeSBiZWJpZGFzIG5vIGFsY29ow7NsaWNhc2AgPSBgQWxpbWVudG9zIHkgYmViaWRhcyBubyBhbGNvaMOzbGljYXNgLw0KICAgICAgICAgICBmaXJzdChgQWxpbWVudG9zIHkgYmViaWRhcyBubyBhbGNvaMOzbGljYXNgKSAqIDEwMCwNCiAgICAgICAgIFNhbHVkID0gU2FsdWQvZmlyc3QoU2FsdWQpICogMTAwKQ0KDQpoZWFkKGJhc2UxMDApDQpgYGANCg0KYGBge3IgZWNobz1UUlVFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KcGdtXzEwMCA8LSBwcmVjaW9zX3BnbSAlPiUgDQogIG11dGF0ZShUb2FsbGl0YXMgPSBUb2FsbGl0YXMvZmlyc3QoVG9hbGxpdGFzKSAqIDEwMCwNCiAgICAgICAgIFRhbXBvbmVzID0gVGFtcG9uZXMvZmlyc3QoVGFtcG9uZXMpICogMTAwKQ0KDQpoZWFkKHBnbV8xMDApDQpgYGANCg0KUG9kZW1vcyBhbmV4YXIgbGEgZXZvbHVjacOzbiBkZSBsb3MgcHJlY2lvcyBkZSBsb3MgcHJvZHVjdG9zIGRlIGdlc3Rpw7NuIG1lbnN0cnVhbCBhIGxhIHNlcmllIGRlIGluZmxhY2nDs24sIHBvciBtw6FzIHF1ZSBlc3RhIMO6bHRpbWEgdGVuZ2EgdmFsb3JlcyBtZW5zdWFsZXMgeSBudWVzdHJvcyBkYXRvcyBzZSBoYXlhbiByZWNvbGVjdGFkbyBjYWRhIHNlaXMgbWVzZXMsIHV0aWxpemFuZG8gYE1lc2AgY29tbyB2YXJpYWJsZSBkZSBsaW5rLiBMdWVnbyByZW9yZGVuYW1vcyBsYSBpbmZvcm1hY2nDs24gcGFyYSBxdWUgdG9kYXMgbGFzIHZhcmlhYmxlcywgZXhjZXB0byBgTWVzYCwgc2UgcHJlc2VudGVuIGVuIHVuYSB2YXJpYWJsZSBgQ2F0ZWdvcsOtYWAgKGNvbiB2YWxvcmVzICJOaXZlbCBHZW5lcmFsIiwgIlNhbHVkIiwgIlRvYWxsaXRhcyIsIGV0Yy4pLCB5IGxvcyB2YWxvcmVzIGRlIGNhZGEgc2VyaWUgc2UgYWdydXBlbiBlbiBsYSB2YXJpYWJsZSBgSW5kaWNlYC4gTm8gaGFicsOhIGRhdG9zIGVuIGRpdmVyc29zIG1lc2VzIHBhcmEgdG9hbGxpdGFzIHkgdGFtcG9uZXMsIGFzw60gcXVlIGZpbHRyYW1vcyBlc2FzIGZpbGFzIHZhY8OtYXMsIHkgZmluYWxtZW50ZSBjcmVhbW9zIGxhIHZhcmlhYmxlIGBHcnVwb2AgcGFyYSBpZGVudGlmaWNhciBjb21vICJJUEMiIGEgbGFzIGNhdGVnb3LDrWFzIGRlbCDDrW5kaWNlIGRlIHByZWNpb3MgYWwgY29uc3VtaWRvciwgeSBjb21vICJQR00iIGEgbG9zIHByb2R1Y3RvcyBkZSBnZXN0acOzbiBtZW5zdHJ1YWwuDQoNCmBgYHtyIGVjaG89VFJVRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCiMgRXN0byBzZSBwdWVkZSBjb3JyZXIgImRlIGEgcG9jbyIgcGFyYSB2ZXIgY8OzbW8gY2FtYmlhbiBsYXMgY29zYXMgZW4gY2FkYSBwYXNvDQpiYXNlMTAwIDwtIGJhc2UxMDAgJT4lIA0KICBsZWZ0X2pvaW4oLiwgcGdtXzEwMCwgYnkgPSAiTWVzIikgJT4lIA0KICBwaXZvdF9sb25nZXIoLU1lcywgbmFtZXNfdG8gPSAiQ2F0ZWdvcmlhIiwgdmFsdWVzX3RvID0gIkluZGljZSIpICU+JSANCiAgZmlsdGVyKCFpcy5uYShJbmRpY2UpKSAlPiUgDQogIG11dGF0ZShHcnVwbyA9IGNhc2Vfd2hlbihDYXRlZ29yaWEgJWluJSBjKCJOaXZlbCBHZW5lcmFsIiwgIkFsaW1lbnRvcyB5IGJlYmlkYXMgbm8gYWxjb2jDs2xpY2FzIiwgIlNhbHVkIikgfiAiSVBDIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIENhdGVnb3JpYSAlaW4lIGMoIlRvYWxsaXRhcyIsICJUYW1wb25lcyIpIH4gIlBHTSIpKQ0KDQpoZWFkKGJhc2UxMDApDQpgYGANCg0KQSBmaW5lcyBkZSBncmFmaWNhciBlc3RhIGluZm9ybWFjacOzbiwgcG9yIGVzdGEgdmV6IHNlIHByZXNjaW5kZSBkZSBsYSBzZXJpZSBkZSAiQWxpbWVudG9zIHkgYmVkaWRhcyBubyBhbGNvaMOzbGljYXMiIHBvcnF1ZSBubyBhZ3JlZ2EgdGFudGEgaW5mb3JtYWNpw7NuIGVuIGxhIGNvbXBhcmFiaWxpZGFkLCB5IHPDrSBvY3VwYSBlc3BhY2lvIHZpc3VhbCBxdWUgcHVlZGUgb2JzdHJ1aXIgbGEgY29tcGFyYWNpw7NuIGRlIGxhcyBkZW3DoXMgc2VyaWVzLg0KDQpgYGB7ciBlY2hvPVRSVUUsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQpiYXNlMTAwYmlzIDwtIGJhc2UxMDAgJT4lIA0KICBmaWx0ZXIoQ2F0ZWdvcmlhICE9ICJBbGltZW50b3MgeSBiZWJpZGFzIG5vIGFsY29ow7NsaWNhcyIpDQpgYGANCg0KUGFyYSBlbCBncsOhZmljbyBwdWVkbyBkZWZpbmlyIHVuIHZlY3RvciBkZSBjb2xvcmVzIHF1ZSBzaXJ2YSBwYXJhIGRpc3Rpbmd1aXIgbGFzIHNlcmllcyBkZSBJUEMgKGVuIGxhIGdhbWEgZGUgYXp1bGVzKSB5IGxhcyBkZSBwcm9kdWN0b3MgZGUgZ2VzdGnDs24gbWVuc3RydWFsIChlbiBsYSBnYW1hIGRlbCByb2pvKS4NCg0KYGBge3IgZWNobz1UUlVFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KY29sb3JjaXRvcyA8LSBjKCdyb3lhbGJsdWU0JywgJ3JveWFsYmx1ZScsIA0KICAgICAgICAgICAgICAgICd2aW9sZXRyZWQnLCAncmVkJykNCmBgYA0KDQpGaW5hbG1lbnRlLCBkZWZpbmltb3MgbnVlc3RybyBncsOhZmljby4gVG9tYW5kbyBsYSB0YWJsYSBgYmFzZTEwMGJpc2AsIA0KDQpgYGB7ciBlY2hvPVRSVUUsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQpsaWJyYXJ5KGdncmVwZWwpDQoNCmdncGxvdChiYXNlMTAwYmlzLCBhZXMoeCA9IE1lcywgeSA9IEluZGljZSwgZ3JvdXAgPSBDYXRlZ29yaWEsIGNvbG9yID0gQ2F0ZWdvcmlhKSkgKw0KICBnZW9tX2xpbmUoZGF0YSA9IGJhc2UxMDBiaXMgJT4lIGZpbHRlcihHcnVwbyA9PSAiUEdNIiksIHNpemUgPSAxLCBhbHBoYSA9IDEpICsNCiAgZ2VvbV9saW5lKGRhdGEgPSBiYXNlMTAwYmlzICU+JSBmaWx0ZXIoR3J1cG8gPT0gIklQQyIpLCBhbHBoYSA9IDEsIHNpemUgPSAxKSArDQogIGdlb21fcG9pbnQoZGF0YSA9IGJhc2UxMDBiaXMgJT4lIGZpbHRlcihHcnVwbyA9PSAiUEdNIiksIHNpemUgPSAyKSArDQogIHRoZW1lX21pbmltYWwoKSArDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJ0b3AiLA0KICAgICAgICB0ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMikpICsNCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IGNvbG9yY2l0b3MpICsNCiAgZXhwYW5kX2xpbWl0cyh4ID0gYXMuUE9TSVhjdChjKCIyMDE5LTAzLTAxIiwgIjIwMjAtMTEtMDEiKSkpICsgDQogIGxhYnModGl0bGUgPSAiSW5mbGFjacOzbiBkZSBUb2FsbGl0YXMgeSBUYW1wb25lcyB2cy4gU2FsdWQgeSBOaXZlbCBHZW5lcmFsIGRlbCBJUEMtSU5ERUMiLA0KICAgICAgIHN1YnRpdGxlID0gIk1hcnpvIDIwMTkgLSBNYXJ6byAyMDIyIiwgIzwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIENBTUJJQVINCiAgICAgICB4ID0gIiIsDQogICAgICAgeSA9ICJJbmRpY2UgZGUgcHJlY2lvcyIsDQogICAgICAgY2FwdGlvbiA9ICJGdWVudGU6ICNNZW5zdHJ1QWNjacOzbiB5ICNFY29GZW1pRGF0YSAoRWNvRmVtaW5pdGEpIikgKw0KICBzY2FsZV94X2RhdGV0aW1lKGJyZWFrcyA9IHNlcShhcy5QT1NJWGN0KCcyMDE5LTAzLTAxJyksIGJ5PSc2IG1vbnRocycsIGxlbmd0aCA9IDcpLCAjPC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBDQU1CSUFSDQogICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYygiMDMtMjAxOSIsICIwOS0yMDE5IiwgIjAzLTIwMjAiLCAiMDktMjAyMCIsICIwMy0yMDIxIiwgIjA5LTIwMjEiLCAiMDMtMjAyMiIpKSAjPC0tLS0tLS0tLS0tLS0gQ0FNQklBUg0KYGBgDQoNCg==