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 2021-2022. El repo del trabajo estĆ” aquĆ­.

La pƔgina web de la asignatura y los trabajos de mis compaƱeros pueden verse aquƭ.


Introducción

El principal anĆ”lisis de este trabajo va a ser el Sistema de pensiones espaƱol y las diversas variables que lo envuelven al mismo. Dentro de estas variables podemos encontrar variables demogrĆ”ficas como pueden ser la esperanza de vida, la tasa de natalidad… tambiĆ©n vamos a analizar diversas variables económicas relacionadas tanto con el mercado laboral como en el gasto en pensiones…

Las pensiones en EspaƱa se han convertido en un tema abordable para su estudio y anƔlisis. Podemos decir que el sistema de pensiones se ve afectado por 2 grandes grupos de variables: la demografƭa y el mercado laboral.

Para que lo entendamos, existen dos tipos de sistemas de pensiones:

Sistema de Reparto: los trabajadores del momento pagan unas cotizaciones a la seguridad social que estƔn destinadas al pago de las pensiones de dicho momento (Es decir, los trabajadores les pagan a los pensionistas y, cuando se jubilen, los antiguos trabajadores cobrarƔn gracias a los futuros trabajadores)

Sistema de Capitalización: cada trabajador hace sus aportaciones y, cuando se jubile, cobrarÔ dichas aportaciones (actualizadas)

En EspaƱa el sistema que tenemos es el de reparto. Por tanto, este sistema funciona correctamente si la corriente de ingresos (trabajadores) y pagos (pensionistas) estƔ equilibrada. En el momento en el que ese equilibrio se rompe de manera no transitoria, el problema se agrava y hay que abordarlo para que el sistema de pensiones sea sostenible.

¿Qué estÔ pasando con el sistema de pensiones español? ¿Funciona correctamente? ¿Es sostenible? Algunos expertos afirman que el sistema estÔ quebrado:

Y otros, no piensan igual:

¿Por qué hacemos este trabajo?

Vista la problemÔtica tanto del tema como de las posibles soluciones y la pasividad de los políticos, como la gran mayoría dependeremos de una pensión en el futuro, queremos ver si los conductores del sistema nacional de pensiones nos llevan hacia la deriva o si todo esto es otro discurso populista de los políticos para hacer oposición.

Datos

Extracción de datos

Nos ha llevado un tiempo extraer todos los datos necesarios, la mayoría son obtenidos del INE, aunque también tenemos datos de Eurostat y del Banco de España. Nos hemos descargado los datos en csv, algunos estaban bien, pero otros daban problemas debido a que no los reconocía como numéricos, los nombres de las variables eran demasiado largos, por lo que era incómodo a la hora de trabajar y había mucha información que sobraba.

Código

Una vez extraidos nuestros datos en formato .csv, nos ha tocado arreglarlos con Rstudio ya que muchas veces R no los detectava con formato numerico, no podiamos representar bien los grƔficos o simplemente queriamos explicar unos datos a partir de otros y nos ha tocado juntarlos en un mismo Dataframe


#- Cargamos el df del paro que anteriormente hemos descargado del INE

df_paro <- rio::import("./datos/tasa_paro.csv")


df_paro <- df_paro %>%
  select(Paro, Periodos)

#Ahora cargamos los datos del df de la tasa de actividad nacional para poder compararlos con la tasa de paro nacional.

df_actividad <- rio::import("./datos/tasa_actividad.csv")

df_actividad <- df_actividad %>%
  select(Periodos, Tasa_Actividad)


#- Vamos a juntar el df de la tasa de actividad y la tasa de paro para poder hacer un grƔfico donde se representen ambas tasas.

df_union <- inner_join(df_actividad, df_paro)

#Vamos a comparar la evolución de la tasa de natalidad y del indice de envejecimiento para tener conocimiento de la evolución que han tenido estas variables demogrÔficas.

df_natalidad <- rio::import("./datos/tasa_natalidad.csv")

df_indice <- rio::import("./datos/indice_envejecimiento.csv")

df_indice <- df_indice %>%
  filter(Periodo != 2021) %>%
  rename(Periodos = "Periodo")

df_indice$Total <- as.numeric(df_indice$Total)

df_union_2 <- inner_join(df_natalidad, df_indice)

df_union_2 <- df_union_2 %>%
  select(Periodos, Tasa_Natalidad, Total)

#Cargamos el df de los ocupados por grupo de edad.

df_edad <- rio::import("./datos/ocup_edad.csv")

df_edad$Total <- as.numeric(df_edad$Total)

df_edad <- df_edad %>%
  mutate(fecha = lubridate::yq(Periodo)) %>%
  filter(fecha == "2021-07-01")


#Vamos a cargar los datos referentes a la edad de emancipacion de los jovenes en EspaƱa

df_eman <- rio::import("./datos/edad_emancipacion.csv")

df_eman <- df_eman %>%
 filter(!(Tramo_Edad %in% "16-34 edad"))

df_var <- df_eman %>%
  pivot_wider(names_from = Periodo, values_from = Porcentaje)

df_var <- janitor::clean_names(df_var)
names(df_var)
#> [1] "tramo_edad" "x2008"      "x2018"

df_var <- df_var %>%
  mutate(variacion = (x2018 - x2008)/x2008)

#- Vamos a arreglar los datos de la pension media y del salario medio que encontramos en los siguientes df.

df_pens_med <- rio::import("./datos/pension_media.csv")

df_w_med <- rio::import("./datos/salario_medio.csv")

df_w_med$w_med_anual <- as.numeric(df_w_med$w_med_anual)

#- Vamos a unir los df de la pension media y del salario medio para observar la variacion entre ambas variables

df_union_3 <- inner_join(df_pens_med, df_w_med)

df_union_3 <- df_union_3 %>%
  select(periodo, pension_media_anual, w_med_anual) %>%
  mutate(porcentaje = (pension_media_anual/w_med_anual)*100)

#Vamos a arreglar los datos referentes a la evolución de la esperanza de vida en España

df_vida <- rio::import("./datos/esperanza_vida.csv")

df_vida <- df_vida %>%
  select("geo", "TIME_PERIOD", "OBS_VALUE") %>%
  rename(pais = "geo", periodo = "TIME_PERIOD", esperanza_vida = "OBS_VALUE")

#nos quedamos con los datos que queremos mostrar

df_vida <- df_vida %>%
  filter(pais  %in% c("FR", "ES", "IT", "PT", "AL") )

#Arreglamos los datos del Fondo de Reserva de las pensiones

df_fondo <- rio::import("./datos/fondo_reserva.csv")

df_fondo$millones_euros <- as.numeric(df_fondo$millones_euros)

#Cargamos y arreglamos los df de la piramide poblacional y de la proyeccion

df_piramide <- rio::import("./datos/piramide_pob.csv")

df_piramide$Total <- as.numeric(df_piramide$Total)

df_piramide_20 <- df_piramide %>%
  filter(`AƱo` == 2020) %>%
  arrange(`AƱo`)

df_proyeccion <- rio::import("./datos/proyeccion_2070.csv")

df_proyeccion$total_red <- as.numeric(df_proyeccion$total_red)

#Creamos los df para los aƱos que queremos mostrar.

df_proyeccion_36 <- df_proyeccion %>%
  filter(Periodo == 2036)

df_proyeccion_50 <- df_proyeccion %>%
  filter(Periodo == 2050)

df_proyeccion_70 <- df_proyeccion %>%
  filter(Periodo == 2070)

#A partir de aqui empieza lo bueno

df_alternativas <- rio::import("./datos/otras_alternativas.csv")
df_alternativas <- janitor::clean_names(df_alternativas) 


df_alternativas_4 <- df_alternativas %>%
  rename(Ef_y_De = efectivo_y_dep_a3sitos_2) %>%
  rename(capital = participaciones_en_el_capital_y_en_fi_2) %>%
  rename(year = fecha) %>%
  rename(cotizadas = acciones_cotizadas_2) %>%
  rename(no_cotizadas = acciones_no_cotizadas_2)%>%
  mutate(participaciones = participaciones_en_fi_y_acciones_de_soc_de_inversi_a3n_2 + otras_participaciones_2) %>%
  rename(cash = efectivo_2) %>%
  mutate( depositos = dep_a3sitos_transferibles_2 + otros_dep_a3sitos_2)


df_alternativas_4 <- df_alternativas_4 %>%
  select(year, capital, cotizadas, no_cotizadas, participaciones, cash, Ef_y_De, depositos) %>% 
  rename(efectivo = cash) %>%
  rename(acciones = capital) %>%
  rename(efectivo_y_depositos = Ef_y_De)


df_alternativas <- df_alternativas %>%
  rename(year = fecha) %>%
  rename(total = todos_los_instrumentos) %>%
  rename(oro = oro_monetario_y_deg_2) %>%
  rename(Ef_y_De = efectivo_y_dep_a3sitos_2) %>%
  rename(deuda = valores_representativos_de_deuda_2) %>%
  rename(loan = pr_a_c_stamos_2) %>%
  rename(capital = participaciones_en_el_capital_y_en_fi_2) %>%
  rename(pensiones_priv = sistemas_de_seguros_pensiones_y_garant_a_as_estandarizadas_2) %>%
  rename(otros = otros_activos_pasivos_2)


df_alternativas <- df_alternativas %>%
  select(year, total, oro, Ef_y_De, deuda, loan, capital, pensiones_priv, otros)

df_alternativas_2 <- df_alternativas %>%
  filter(year == 2020) 
df_alternativas_2$comprobacion = rowSums (df_alternativas_2[ , 3:9])
df_alternativas_2 <- df_alternativas_2 %>%
  select(-total) %>% rename(total = comprobacion)
df_alternativas_2 <- df_alternativas_2 %>% pivot_longer(cols = 2:8, names_to = "Activos", values_to = "Miles_de_euros")

df_alternativas_2$porcentaje <- prop.table(df_alternativas_2$Miles_de_euros)
df_alternativas_2$porcentaje <- round(prop.table(df_alternativas_2$Miles_de_euros), 7)*100

df_alternativas[, c(1:9)] <- sapply(df_alternativas[, c(1:9)], as.numeric)

df_alternativas_3 <- df_alternativas%>%
  select(-c(total)) %>%
  pivot_longer(cols = 2:8, names_to = "Activos", values_to = "Miles_de_euros")


#Vamos a arreglar los datos para poder hacer una tabla

df_piramide <- rio::import("./datos/piramide_pob.csv")
df_piramide$Total <- as.numeric(df_piramide$Total)
df_piramide2 <- df_piramide %>% 
  select(-`EspaƱoles/Extranjeros`) %>% 
  rename(Periodo = AƱo) %>% 
  rename(total_red = Total) %>% 
  rename(Edad = `Edad (grupos quinquenales)`)


df_proy <- rio::import("./datos/proyeccion_2070.csv")
df_proy$total_red <- as.numeric(df_proy$total_red)
df_proy2 <- df_proy %>% 
  select (-Total)



df_uni <- full_join(df_piramide2 , df_proy2)
df_uni2 <- df_uni %>% 
  filter(c(Edad == "0-4 aƱos" | Edad == "65-69 aƱos"))

#Vamos a arreglar los datos para poder hacer un mapa comparativo entre paises sobre el ahorro privado

df_ahorro <- rio::import("./datos/ahorro_privado.xls")
df_ahorro <- df_ahorro %>%
  select(-c(`Indicator Name`)) %>%
  pivot_longer(cols = 4:64, names_to = "Year", values_to = "ahorro_PIB")


data(World) 
df_ahorro_1 <- janitor::clean_names(df_ahorro)
df_ahorro_1 <- df_ahorro_1 %>%
  filter(year == 2020) %>%
  select(country_code, ahorro_pib)
world <- World ; rm(World)
world <- world %>% rename(country_code = iso_a3)
df_mapa <- inner_join(world, df_ahorro_1)

Variables DemogrƔficas

Natalidad Vs. Envejecimiento

AnƔlisis

En la parte superior y en color rojo podemos ver la tasa de envejecimiento, mientras que en la parte inferior y en color azul encontramos la tasa de natalidad.

Claramente se aprecia que la evolución de la natalidad ha sido decreciente, mientras que la tasa de envejecimiento ha aumentado.

ĀæY quĆ© significa esto? +Gasto - Ingresos = …






Código


p2 <- ggplot(df_union_2) +
  geom_line(aes(Periodos, Tasa_Natalidad, color = "Tasa_Natalidad")) + 
  geom_point(aes(Periodos, Tasa_Natalidad, color = "Tasa_Natalidad")) +
  geom_line(aes(Periodos, Total, color = "Indice_envejecimiento"))+
  geom_point(aes(Periodos, Total, color = "Indice_envejecimiento"))+
  scale_y_continuous(name = "Indice de envejecimiento", 
                     sec.axis = sec_axis(~./5, name = "Tasa Natalidad", 
                                         labels = function(b) { paste0(round(b * 4, 0), "%")})) +
  labs(title = "Comparación Tasa de Natalidad e ƍndice de Envejecimiento",
    subtitle = "Datos extraidos del INEBase") +
  theme_minimal()
  


ggplotly(p2)




Evolución de la esperanza de vida

AnƔlisis

En este caso se puede apreciar la clara tendencia alcista en la evolución de la esperanza de vida. Hace años, ejemplo en 1980, en España la gente moría de media a los 75 años. Los últimos datos, 2019, nos indican que de media la población española fallece a los 84 años.

Por tanto,el avance del sistema de bienestar hace que la gente viva mÔs años en edad de jubilación por lo que aumentan los gastos del sistema

Sin embargo esto no es un caso aislado del sistema espaƱol, pues afecta a todas las economƭas desarrolladas.

¿Y qué significa esto? +Gasto






Código


p11 <- ggplot(df_vida) +
 aes(x = periodo, y = esperanza_vida, colour = pais) +
 geom_line(size = 1) +
 theme_minimal() + 
  theme(plot.subtitle = element_text(size = 11)) +labs(title = "Evolución de la esperanza de vida por paises",
    x = "Periodo", y = "AƱos de vida", subtitle = "Datos extraidos de Eurostat")

ggplotly(p11)

Piramide Poblacional

AnƔlisis

En este caso podemos apreciar las imÔgenes que resumen, aunque de manera aproximada, la inestabilidad del sistema. El problema de disminución de ingresos junto al aumento de gastos se agravarÔ en el futuro según las proyecciones del INE. ¿Y si hacemos un nuevo baby boom? Algunos economistas hablan de que un nuevo baby boom ayudaría a solucionar el problema, puesto que aumentaría los ingresos potenciales. Sin embargo, este enfoque es miope, ya que no se estÔ teniendo en cuenta que en el futuro, cuando la generación del nuevo baby boom sea anciana, sería necesario otro incremento masivo de la natalidad, entrando así en un bucle de necesidad de incremento de la población.

Pan para hoy y hambre para maƱana

Código


p13 <- ggplot(df_piramide, aes(x = `Edad (grupos quinquenales)`,
                y = `Total`,
                fill = Sexo)) +
  geom_col(data = subset(df_piramide, Sexo == "Hombres") %>% 
             mutate(`Total` = - `Total`),
           width = 0.5, fill = "blue") +
  geom_col(data = subset(df_piramide, Sexo == "Mujeres"),
           width = 0.5, fill = "pink") + 
  coord_flip()+labs(title = "Piramide Poblacional aƱo 2020 ",
    y = "Miles de Personas", subtitle = "Datos extraidos del INEBase")

ggplotly(p13)

Proyecciones Poblacionales

2036

2050

2070

Tabla

Emancipación

AnƔlisis

En relación con la posible solución del baby boom, desde nuestro punto de vista, el principal problema reside en la edad de emancipación. Si les preguntamos a nuestros abuelos o padres a qué edad empezaron a trabajar probablemente escuchemos un intervalo de edad de 13-18 años. Sin embargo, a día de hoy esa edad es mucho mÔs tardía. Por lo tanto el principal problema lo podemos ver en que la gente entra mÔs tarde al mercado laboral junto a que ahora se vive mÔs años.Por ello que los politicos estÔn alargando la edad de jubilación.

ĀæY quĆ© significa esto? +Gasto - Ingresos = …







Código


p8 <- ggplot(df_eman) +
 aes(x = Tramo_Edad, fill = Tramo_Edad, weight = Porcentaje) +
 geom_bar() +
 scale_fill_viridis_d(option = "viridis", 
 direction = 1) +
 theme_minimal() +
 facet_wrap(vars(Periodo)) + theme(plot.subtitle = element_text(size = 11),
    axis.title = element_text(size = 13),
    plot.title = element_text(size = 16)) +labs(title = "Porcentaje de Emancipados por edad",
    x = "Tramo de Edad", y = "Porcentaje de emancipados",
    subtitle = "Datos extraidos del BBVA Research Foundation")

ggplotly(p8)


 p9 <- ggplot(df_var) +
 aes(x = tramo_edad, fill = tramo_edad, weight = variacion) +
 geom_bar() +
 scale_fill_viridis_d(option = "viridis", 
 direction = 1) +
 theme_minimal() + theme(plot.subtitle = element_text(size = 10)) +labs(title = "Variación porcentual de emancipados 2018 - 2008",
    x = "Tramo de Edad", y = "Variación de emancipados",
    fill = "Tramo de Edad", subtitle = "Datos extraidos del BBVA Research")

ggplotly(p9)




Mercado Laboral

Tasa de Paro Vs. Actividad

AnƔlisis

En este caso podemos apreciar que ambas variables se mueven al unƭsono pero de manera inversa. Asƭ, cuando el paro disminuye, aumenta la tasa de actividad y viceversa. Dƭa tras dƭa podemos escuchar y/o leer en las noticias el preocupante problema del paro espaƱol, por ejemplo aquƭ

Desde el punto de vista del sistema de pensiones espaƱol, que recordemos que es un sistema de reparto (los trabajadores de ahora pagan a los pensionistas de ahora), esto influye en la menor capacidad recaudatoria de dicho sistema y, por tanto, provoca una gran inestabilidad.

¿Y qué significa esto? - Ingresos






Código

p4 <- ggplot(df_union) +
  geom_bar(aes(Periodos, Tasa_Actividad), stat = "identity", fill = "grey") +
  geom_line(aes(Periodos, Paro), size = 1) +
  geom_point(aes(Periodos, Paro), size = 2) +
  labs(title = "Comparación Tasa de Paro y de Actividad",
       subtitle = "Datos para el periodo 2002 - 2020",
       caption = "Datos provenientes del INEBase",
       y = "Tasa de Paro y Actividad") +
  theme_minimal()


ggplotly(p4)




Ocupados por grupo de Edad

AnƔlisis

Este anÔlisis va en línea al anterior. En este caso cabe destacar que para que el sistema recibiera una bocanada de aire esperanzador, la fuerza motriz del mercado laboral debería ser principalmente las edades de 20 a 50 años. Así conseguiríamos que las pensiones estuvieran mÔs garantizadas que ahora mismo. Sin embargo, se puede apreciar claramente la baja tasa de ocupación a edades de entre 20 y 30 años, cosa que preocupa y mucho. Concrétamente, según fuentes documentales España tiene la tasa de paro juvenil mÔs alta de los países miembros de la Unión Europea

¿Y qué significa esto? Futuro Negro para España






Código


p10 <- ggplot(df_edad) +
 aes(x = Edad, fill = Edad, weight = Total) +
 geom_bar() +
 scale_fill_viridis_d(option = "viridis", 
 direction = 1) +
 theme_minimal()+labs(title = "Ocupados por grupo de Edad en 2021",
    x = NULL, y = "Miles de Personas", subtitle = "Datos extraidos del INEBase")

ggplotly(p10)




Pensiones

Evolución del Fondo de Reserva

AnƔlisis

Primero que nada debemos entender que el fondo de reserva es el ā€œlugarā€ donde, en Ć©pocas de superĆ”vit, se depositan las aportaciones que sobran (cosa que hace que el fondo aumente) y, en Ć©pocas deficitarias, se utiliza para tomar dinero para pagar a los pensionistas (disminuye el fondo de reserva).

Claramente se puede apreciar que en la Ć©poca precrisis (antes de 2008) el mercado laboral espaƱol estaba en auge, cosa que permitĆ­a que la cantidad ingresada en la seguridad social fuera superior a la cantidad gastada (cotizaciones > pensiones), provocando un superĆ”vit del fondo de reserva. Sin embargo, estĆ” claro que la crisis tuvo gran incidencia en el mercado laboral espaƱol. La gran tasa de paro junto al aumento del nĀŗ de pensionistas provocó el gran declive de lo que comĆŗnmente se conoce como la ā€œhucha de las pensionesā€. Muchos economistas califican este grĆ”fico como una imĆ”gen de la estructura deficitaria de dicho sistema. AdemĆ”s, el problema no es tanto que lo hayamos utilizado durante aƱos de malestar económico nacional, sinó que las proyecciones y el anĆ”lisis de variables no parecen prometer una recuperación del superĆ”vit

¿Y qué significa esto? Nos estamos fundiendo los ahorros de nuestros abuelos




Código


p12 <- ggplot(df_fondo) +
 aes(x = periodo, y = millones_euros) +
 geom_line(size = 1, colour = "#066DD1") +
  geom_point()+labs(title = "Evolución del Fondo de Reserva 2000 - 2019",
    x = "Periodo", y = "Millones de Euros",
    subtitle = "Datos extraidos del INEBase") +
  theme_minimal()

ggplotly(p12)




Tasa de cobertura o reemplazo

AnƔlisis

En palabras sencillas, la tasa de cobertura o de reemplazo de las pensiones nos indica el porcentaje del salario que cobramos como pensión. La calculamos dividiendo nuestra pensión entre nuestro Ćŗltimo salario. AsĆ­ medimos si el sistema es capaz de mantener nuestra capacidad adquisitiva. A modo de ejemplo, si un trabajador cobra 600€ de pensión y su Ćŗltimo salario era de 1.000€, la tasa de cobertura es de (600/1000 *100) 60% . Es decir, al pasar de ser trabajador a pensionista, estamos perdiendo un 40% de poder adquisitivo (respecto al Ćŗltimo dĆ­a que trabajamos).

Podemos apreciar que la tendencia evolutiva ha sido ascendiente, claro ejemplo del fomento del estado de bienestar. SIn embargo, mÔs que la evolución pasada, lo que tenemos que preguntarnos es si aumentar o mantener la tasa de cobertura serÔ viable según los nefastos pronósticos que los economistas diagnostican.




Código


p7 <- ggplot(df_union_3, aes(periodo, porcentaje)) + 
  geom_line(size = 0.8) + 
  geom_point() + 
  theme(axis.line = element_line(size = 0.5),
    panel.grid.major = element_line(size = 0),
    axis.text = element_text(size = 12),
    panel.background = element_rect(fill = "gray85"),
    plot.background = element_rect(fill = "white")) +labs(title = "Tasa de cobertura o reemplazo de la pensión media",
    x = "Periodo", y = "Porcentaje", subtitle = "Datos extraidos del INEBase ") +
  theme_minimal()

ggplotly(p7)




Alternativas a las pensiones pĆŗblicas

Para analizar la viabilidad del sistema de pensiones es importante analizar si existen alternativas reales a la pensión pública en estos momentos en España. Queremos averiguar si es factible pensar que el ahorro privado es suficiente para compensar unas pensiones futuras, en caso de que este sistema fracase. Para ello hemos investigado cómo se distribuye el ahorro privado en España y cómo ha ido evolucionando este en los últimos años.


Comparación del ahorro privado entre paises

AnƔlisis

Primero, hemos elaborado este mapa para observar en el año 2020, qué porcentaje del PIB ocupa el ahorro privado en casi todos los países del mundo. Vemos que en España se sitúa en el 21,3%. Como se aprecia en el mapa, los niveles mÔs altos de ahorro se encuentran en los países del norte de Europa y el sur de Asia, nos sorprende especialmente los casos de Marruecos, UzbequistÔn y Bangladesh. Países como Suiza, Noruega y Suecia cuentan con sistemas de pensiones mixtos, es decir, un porcentaje de las pensiones es pagado por el país y otro por el propio ahorro privado del beneficiario. Es por ello que cuentan con grandes porcentajes de ahorro privado con respecto al PIB, ya que el propio sistema favorece a ello.

¿Y qué significa esto? Ahorro insuficiente

Código


mypalette <- colorNumeric( palette="Greys", domain=df_mapa$ahorro_pib,na.color="transparent")

mytext <- paste(
  "PaĆ­s: ", df_mapa$name,"<br/>", 
  "Situación económica:",  df_mapa$economy, "<br/>", 
  "Porcentaje de ahorro: ", df_mapa$ahorro_pib, 
  sep="") %>%
  lapply(htmltools::HTML)
mapa <- leaflet(df_mapa) %>% 
  addTiles()  %>% 
  setView( lat=10, lng=0 , zoom=2) %>%
  addPolygons( 
    fillColor = ~mypalette(ahorro_pib), 
    stroke=TRUE, 
    fillOpacity = 0.9, 
    color="white", 
    weight=0.3,
    label = mytext,
    labelOptions = labelOptions( 
      style = list("font-weight" = "normal", padding = "3px 8px"), 
      textsize = "13px", 
      direction = "auto"
    )
  ) %>%
  addLegend( pal=mypalette, values=~ahorro_pib, opacity=0.9, title = "% de ahorro en el PIB", position = "bottomleft" )
mapa

Tabla comparativa

AnƔlisis

En la siguiente tabla observamos el porcentaje de ahorro en relación al PIB en todos los países que tenemos datos en 2020 y la diferencia con la media total. Observamos como España se sitúa 1 punto porcentual por debajo de la media total, que es del 22,37%. Si filtramos de mayor a menor podemos apreciar como Singapur es el país del mundo con mayor ahorro, con mÔs del 40%, otro país que cuenta con un sistema de capitalización (igual que Suecia y Noruega). De esta manera, es el propio trabajador el que, por ley, ahorra dinero durante toda su vida para gastarlo cuando se jubile, y el país ofrece una ayuda para aquellos que no alcancen el mínimo ahorrado. Eso explica porcentajes tan altos de ahorro.

Entre los países con menor tasa de ahorro encontramos a Grecia, Ucrania o Reino Unido. Mientras los 2 primeros cuentan con sistemas de reparto puramente público, como en España, sorprende el caso de Reino Unido, en el cual las pensiones públicas no superan el 30% del salario medio del país.

¿Y qué significa esto? + Pensiones puramente públicas - ahorro privado

Código

df_tabla <- df_ahorro  %>%
  filter(Year == 2020) %>%
  drop_na() %>%
  mutate(diferencia = ahorro_PIB - mean(ahorro_PIB , na.rm = TRUE)) %>%
  select('Country Name', ahorro_PIB, diferencia)
library(DT)  
DT::datatable(df_tabla)

Distribución del ahorro privado

Pero, dentro de España, ¿cómo se distribuye el ahorro? ¿Le estamos sacando toda la rentabilidad posible? Vemos como la mayor parte del ahorro se distribuye en capital (acciones y participaciones), efectivo y depósitos, valores representativos de deuda (bonos, obligaciones, pagarés, etc.) y préstamos. El activo mÔs rentable históricamente son las acciones, por lo que no estÔ mal en ese sentido, aunque habría que analizar en qué acciones se invierte principalmente y cuÔn rentables son estas para sacar una conclusión. Por otro lado, el efectivo y los depósitos son los activos menos rentables posibles (nula o negativa si contamos la inflación).

¿Y qué significa esto? Rentabilidad insuficiente

AnƔlisis

Código


g1 <- ggplot(df_alternativas_2, aes(x=1, y=porcentaje, fill= Activos)) +
  geom_bar(stat="identity") +
  geom_text(aes(label = paste0(round(porcentaje,1),"%")), 
            position = position_stack(vjust = 0.5)) +
  coord_polar(theta = "y") + 
  theme_void()+labs(title = "Ahorro privado en 2020", x = NULL,
    subtitle = "Datos extraidos del Banco de EspaƱa")

g1 




Evolución del ahorro privado

AnƔlisis

En este grÔfico observamos el crecimiento de las diferentes partidas durante los últimos 20 años, es interesante como el capital ha crecido mÔs que el resto de partidas, aunque con mayor volatilidad, ya que se puede apreciar la caída en los años de crisis (2008-2014).

¿Y qué significa esto? ¿camino correcto?

Código


plot_dinamico <- df_alternativas_3 %>%
  ggplot(aes(x = Activos, 
             y = Miles_de_euros, 
             fill= Activos )) +
  geom_bar(stat= "identity", 
           color = "grey", 
           show.legend = FALSE) +
  geom_text(aes(label = as.numeric(Miles_de_euros)), 
            position = position_stack(), 
            vjust= 1,
            hjust= -0.1,
            size = 4, 
            color = "black")+
  scale_fill_manual(values = c("orange", "darkgrey", "green", "red", "blue", "yellow", "purple")) +
  scale_y_continuous(labels = scales::comma) +
  theme_minimal()+
  enter_appear() +
  transition_states(year, 
                    transition_length = 5, 
                    state_length = 5) +
  labs(title = " Volumen de los activos financieros por aƱo \n Year : {closest_state}", 
       subtitle = "En miles de euros",
       y = "",
       x = "",
       caption = "Banco de EspaƱa") +
  theme(panel.grid.major.x = element_blank(),
        plot.title = element_text(size = 18, 
                                  face = "bold", 
                                  hjust = 0.5),
        plot.subtitle = element_text(size=14, 
                                     face = "plain", 
                                     hjust = 0.5)) + coord_flip()

plot_dinamico

Distribución acciones y depósitos

AnƔlisis

Pero, dentro de España, ¿cómo se distribuye el ahorro? ¿Le estamos sacando toda la rentabilidad posible? Vemos como la mayor parte del ahorro se distribuye en capital (acciones y participaciones), efectivo y depósitos, valores representativos de deuda (bonos, obligaciones, pagarés, etc.) y préstamos. El activo mÔs rentable históricamente son las acciones, por lo que no estÔ mal en ese sentido, aunque habría que analizar en qué acciones se invierte principalmente y cuÔn rentables son estas para sacar una conclusión. Por otro lado, el efectivo y los depósitos son los activos menos rentables posibles (nula o negativa si contamos la inflación).

¿Y qué significa esto? Rentabilidad insuficiente

Código


sketch = htmltools::withTags(table(
  class = 'display',
  thead(
    tr(th(rowspan = 2, 'AƱo'),
      th(colspan = 3, 'Acciones'),
      th(colspan = 2, 'Efectivo y depósitos')),
    tr(lapply(rep(c('cotizadas', 'no cotizadas', 'participaciones', 'efectivo', 'depósitos'), 1), th)
    )
  )
))
print(sketch)

df_alternativas_5 <- df_alternativas_4%>%
  select(-c("acciones", "efectivo_y_depositos"))
datatable(df_alternativas_5, container = sketch, rownames = FALSE)  

Conclusiones

Entonces ¿es viable el sistema de pensiones en España? ¿qué ocurrirÔ dentro de 20 años? Bueno, como hemos podido analizar, existen preocupantes datos en cuanto a lo que el sistema se refiere. Las alarmas suenan cuando analizamos las variables demogrÔficas, donde el baby boom de los años años 60 en relación con la reducción constante de la natalidad de los últimos 30-40 años hacen prever un número de jubilados futuros que puede llegar a ser insostenible.

El mercado laboral no deja mejores impresiones, con tasas de paro altísimas y empleo demasiado bajo entre las personas de 20 y 30 años. Este dato puede afectar a la tasa de natalidad del futuro, ya que si estos grupos de edad no tienen una estabilidad económica es probable que pospongan la decisión de tener hijos o, incluso, la desestimen. Pero, ademÔs de eso, ¿quién va a pagar las pensiones dentro de 20 años si los que hoy tienen 30 no tienen trabajo?

La financiación de las pensiones tampoco arroja señales positivas, ya que durante la crisis el fondo de reserva se redujo considerablemente y, ademÔs, la tasa de cobertura no deja de aumentar.

Y las alternativas no nos dejan datos del todo horribles, pero siguen sin estar a niveles de los mejores sistemas de pensiones del mundo, ademÔs de un excesivo peso en el ahorro de los depósitos y el efectivo. Por todo esto, nuestra conclusión es que hay suficientes alarmas para, al menos, preocuparse y hacerse ciertas preguntas. ¿Confiamos en que dentro de 15, 20 años, cuando nuestros padres se jubilen, tendrÔn una pensión pública digna como merecen? ¿la tendremos nosotros dentro de 40 años? ¿qué soluciones podemos encontrar como individuos particulares? ¿y qué decisiones puede tomar el Estado?



BibliografĆ­a

Para la realización de nuestro trabajo nos hemos basado en las siguientes pÔginas web y bases de datos:

INE

BBVAResearch

Web del Curso

gganimate

Banco de EspaƱa





Información de mi R-sesión:

- Session info  --------------------------------------------------------------
 hash: child: light skin tone, bottle with popping cork, family: man, boy

 setting  value
 version  R version 4.1.1 (2021-08-10)
 os       Windows 10 x64 (build 19042)
 system   x86_64, mingw32
 ui       RTerm
 language (EN)
 collate  Spanish_Spain.1252
 ctype    Spanish_Spain.1252
 tz       Europe/Paris
 date     2021-12-17
 pandoc   2.11.4 @ C:/Program Files/RStudio/bin/pandoc/ (via rmarkdown)

- Packages -------------------------------------------------------------------
 package           * version    date (UTC) lib source
 abind               1.4-5      2016-07-21 [1] CRAN (R 4.1.0)
 assertthat          0.2.1      2019-03-21 [1] CRAN (R 4.1.1)
 backports           1.3.0      2021-10-27 [1] CRAN (R 4.1.1)
 base64enc           0.1-3      2015-07-28 [1] CRAN (R 4.1.0)
 bit                 4.0.4      2020-08-04 [1] CRAN (R 4.1.1)
 bit64               4.0.5      2020-08-30 [1] CRAN (R 4.1.1)
 broom               0.7.10     2021-10-31 [1] CRAN (R 4.1.1)
 bslib               0.3.1      2021-10-06 [1] CRAN (R 4.1.1)
 cellranger          1.1.0      2016-07-27 [1] CRAN (R 4.1.1)
 class               7.3-19     2021-05-03 [2] CRAN (R 4.1.1)
 classInt            0.4-3      2020-04-07 [1] CRAN (R 4.1.1)
 cli                 3.1.0      2021-10-27 [1] CRAN (R 4.1.1)
 clipr               0.7.1      2020-10-08 [1] CRAN (R 4.1.1)
 codetools           0.2-18     2020-11-04 [2] CRAN (R 4.1.1)
 colorspace          2.0-2      2021-06-24 [1] CRAN (R 4.1.1)
 crayon              1.4.2      2021-10-29 [1] CRAN (R 4.1.1)
 crosstalk           1.2.0      2021-11-04 [1] CRAN (R 4.1.1)
 curl                4.3.2      2021-06-23 [1] CRAN (R 4.1.1)
 data.table          1.14.2     2021-09-27 [1] CRAN (R 4.1.2)
 DBI                 1.1.1      2021-01-15 [1] CRAN (R 4.1.1)
 dbplyr              2.1.1      2021-04-06 [1] CRAN (R 4.1.1)
 desc                1.4.0      2021-09-28 [1] CRAN (R 4.1.1)
 details             0.2.1      2020-01-12 [1] CRAN (R 4.1.1)
 dichromat           2.0-0      2013-01-24 [1] CRAN (R 4.1.0)
 digest              0.6.28     2021-09-23 [1] CRAN (R 4.1.1)
 dplyr             * 1.0.7      2021-06-18 [1] CRAN (R 4.1.1)
 DT                * 0.19       2021-09-02 [1] CRAN (R 4.1.1)
 e1071               1.7-9      2021-09-16 [1] CRAN (R 4.1.1)
 ellipsis            0.3.2      2021-04-29 [1] CRAN (R 4.1.1)
 evaluate            0.14       2019-05-28 [1] CRAN (R 4.1.1)
 fansi               0.5.0      2021-05-25 [1] CRAN (R 4.1.1)
 farver              2.1.0      2021-02-28 [1] CRAN (R 4.1.1)
 fastmap             1.1.0      2021-01-25 [1] CRAN (R 4.1.1)
 forcats           * 0.5.1      2021-01-27 [1] CRAN (R 4.1.1)
 foreign             0.8-81     2020-12-22 [2] CRAN (R 4.1.1)
 fs                  1.5.0      2020-07-31 [1] CRAN (R 4.1.1)
 generics            0.1.1      2021-10-25 [1] CRAN (R 4.1.1)
 gganimate         * 1.0.7      2020-10-15 [1] CRAN (R 4.1.1)
 ggplot2           * 3.3.5      2021-06-25 [1] CRAN (R 4.1.1)
 ggrepel           * 0.9.1      2021-01-15 [1] CRAN (R 4.1.1)
 ggspatial         * 1.1.5      2021-01-04 [1] CRAN (R 4.1.2)
 ggthemes          * 4.2.4      2021-01-20 [1] CRAN (R 4.1.1)
 gifski            * 1.4.3-1    2021-05-02 [1] CRAN (R 4.1.1)
 glue                1.5.0      2021-11-07 [1] CRAN (R 4.1.2)
 gt                * 0.3.1      2021-08-07 [1] CRAN (R 4.1.1)
 gtable              0.3.0      2019-03-25 [1] CRAN (R 4.1.1)
 haven               2.4.3      2021-08-04 [1] CRAN (R 4.1.1)
 here                1.0.1      2020-12-13 [1] CRAN (R 4.1.1)
 highr               0.9        2021-04-16 [1] CRAN (R 4.1.1)
 hms                 1.1.1      2021-09-26 [1] CRAN (R 4.1.1)
 htmltools           0.5.2      2021-08-25 [1] CRAN (R 4.1.1)
 htmlwidgets         1.5.4      2021-09-08 [1] CRAN (R 4.1.1)
 httr                1.4.2      2020-07-20 [1] CRAN (R 4.1.1)
 janitor             2.1.0      2021-01-05 [1] CRAN (R 4.1.1)
 jquerylib           0.1.4      2021-04-26 [1] CRAN (R 4.1.1)
 jsonlite            1.7.2      2020-12-09 [1] CRAN (R 4.1.1)
 kableExtra        * 1.3.4      2021-02-20 [1] CRAN (R 4.1.1)
 KernSmooth          2.23-20    2021-05-03 [2] CRAN (R 4.1.1)
 klippy            * 0.0.0.9500 2021-11-16 [1] Github (rlesur/klippy@378c247)
 knitr             * 1.36       2021-09-29 [1] CRAN (R 4.1.1)
 labeling            0.4.2      2020-10-20 [1] CRAN (R 4.1.0)
 lattice             0.20-44    2021-05-02 [2] CRAN (R 4.1.1)
 lazyeval            0.2.2      2019-03-15 [1] CRAN (R 4.1.1)
 leafem            * 0.1.6      2021-05-24 [1] CRAN (R 4.1.1)
 leaflet           * 2.0.4.1    2021-01-07 [1] CRAN (R 4.1.1)
 leaflet.providers   1.9.0      2019-11-09 [1] CRAN (R 4.1.1)
 leafsync            0.1.0      2019-03-05 [1] CRAN (R 4.1.1)
 lifecycle           1.0.1      2021-09-24 [1] CRAN (R 4.1.1)
 lubridate           1.8.0      2021-10-07 [1] CRAN (R 4.1.1)
 lwgeom              0.2-8      2021-10-06 [1] CRAN (R 4.1.1)
 magrittr            2.0.1      2020-11-17 [1] CRAN (R 4.1.1)
 modelr              0.1.8      2020-05-19 [1] CRAN (R 4.1.1)
 munsell             0.5.0      2018-06-12 [1] CRAN (R 4.1.1)
 openxlsx            4.2.4      2021-06-16 [1] CRAN (R 4.1.1)
 patchwork         * 1.1.1      2020-12-17 [1] CRAN (R 4.1.1)
 pillar              1.6.4      2021-10-18 [1] CRAN (R 4.1.1)
 pjpv2020.01       * 0.0.0.9000 2021-11-06 [1] Github (perezp44/pjpv2020.01@6c6065f)
 pkgconfig           2.0.3      2019-09-22 [1] CRAN (R 4.1.1)
 plotly            * 4.10.0     2021-10-09 [1] CRAN (R 4.1.1)
 plyr                1.8.6      2020-03-03 [1] CRAN (R 4.1.1)
 png                 0.1-7      2013-12-03 [1] CRAN (R 4.1.0)
 prettyunits         1.1.1      2020-01-24 [1] CRAN (R 4.1.1)
 progress            1.2.2      2019-05-16 [1] CRAN (R 4.1.1)
 proxy               0.4-26     2021-06-07 [1] CRAN (R 4.1.1)
 purrr             * 0.3.4      2020-04-17 [1] CRAN (R 4.1.1)
 R6                  2.5.1      2021-08-19 [1] CRAN (R 4.1.1)
 raster              3.5-2      2021-10-11 [1] CRAN (R 4.1.1)
 RColorBrewer        1.1-2      2014-12-07 [1] CRAN (R 4.1.0)
 Rcpp                1.0.7      2021-07-07 [1] CRAN (R 4.1.1)
 readr             * 2.0.2      2021-09-27 [1] CRAN (R 4.1.1)
 readxl              1.3.1      2019-03-13 [1] CRAN (R 4.1.1)
 reprex              2.0.1      2021-08-05 [1] CRAN (R 4.1.1)
 rio                 0.5.27     2021-06-21 [1] CRAN (R 4.1.1)
 rlang               0.4.12     2021-10-18 [1] CRAN (R 4.1.1)
 rmarkdown           2.11       2021-09-14 [1] CRAN (R 4.1.1)
 rnaturalearth     * 0.1.0      2017-03-21 [1] CRAN (R 4.1.1)
 rnaturalearthdata * 0.1.0      2017-02-21 [1] CRAN (R 4.1.1)
 rprojroot           2.0.2      2020-11-15 [1] CRAN (R 4.1.1)
 rstudioapi          0.13       2020-11-12 [1] CRAN (R 4.1.1)
 rvest               1.0.2      2021-10-16 [1] CRAN (R 4.1.1)
 sass                0.4.0      2021-05-12 [1] CRAN (R 4.1.1)
 scales              1.1.1      2020-05-11 [1] CRAN (R 4.1.1)
 sessioninfo         1.2.1      2021-11-02 [1] CRAN (R 4.1.1)
 sf                * 1.0-3      2021-10-07 [1] CRAN (R 4.1.1)
 snakecase           0.11.0     2019-05-25 [1] CRAN (R 4.1.1)
 sp                  1.4-5      2021-01-10 [1] CRAN (R 4.1.1)
 stars               0.5-3      2021-06-08 [1] CRAN (R 4.1.1)
 stringi             1.7.5      2021-10-04 [1] CRAN (R 4.1.1)
 stringr           * 1.4.0      2019-02-10 [1] CRAN (R 4.1.1)
 svglite             2.0.0      2021-02-20 [1] CRAN (R 4.1.1)
 systemfonts         1.0.3      2021-10-13 [1] CRAN (R 4.1.1)
 terra               1.4-11     2021-10-11 [1] CRAN (R 4.1.1)
 tibble            * 3.1.6      2021-11-07 [1] CRAN (R 4.1.2)
 tidyr             * 1.1.4      2021-09-27 [1] CRAN (R 4.1.1)
 tidyselect          1.1.1      2021-04-30 [1] CRAN (R 4.1.1)
 tidyverse         * 1.3.1      2021-04-15 [1] CRAN (R 4.1.1)
 tmap              * 3.3-2      2021-06-16 [1] CRAN (R 4.1.1)
 tmaptools           3.1-1      2021-01-19 [1] CRAN (R 4.1.1)
 tweenr              1.0.2      2021-03-23 [1] CRAN (R 4.1.1)
 tzdb                0.2.0      2021-10-27 [1] CRAN (R 4.1.1)
 units               0.7-2      2021-06-08 [1] CRAN (R 4.1.1)
 usethis             2.1.3      2021-10-27 [1] CRAN (R 4.1.1)
 utf8                1.2.2      2021-07-24 [1] CRAN (R 4.1.1)
 vctrs               0.3.8      2021-04-29 [1] CRAN (R 4.1.1)
 vembedr           * 0.1.5.9000 2021-12-15 [1] Github (ijlyttle/vembedr@f270a72)
 viridisLite         0.4.0      2021-04-13 [1] CRAN (R 4.1.1)
 webshot             0.5.2      2019-11-22 [1] CRAN (R 4.1.1)
 withr               2.4.3      2021-11-30 [1] CRAN (R 4.1.2)
 xfun                0.28       2021-11-04 [1] CRAN (R 4.1.2)
 XML                 3.99-0.8   2021-09-17 [1] CRAN (R 4.1.1)
 xml2                1.3.2      2020-04-23 [1] CRAN (R 4.1.1)
 yaml                2.2.1      2020-02-01 [1] CRAN (R 4.1.0)
 zip                 2.2.0      2021-05-31 [1] CRAN (R 4.1.1)

 [1] C:/Users/Pau/Documents/R/win-library/4.1
 [2] C:/Program Files/R/R-4.1.1/library

------------------------------------------------------------------------------




LS0tDQp0aXRsZTogIlNpc3RlbWEgZGUgUGVuc2lvbmVzIEVzcGHDsW9sIg0KYXV0aG9yOiAiUGF1IFBpZXJhIFBhbGFjaW9zKHBhdXBpZXBhQGFsdW1uaS51di5lcykgIFxuXG4gTWFyaW8gR2FyY8OtYSBaYW1vcmEobWFnYXJ6YTJAYWx1bW5pLnV2LmVzKSAgXG4gXG4gUnViw6luIENhbXBvcyBDYW1wb3MgKHJ1Y2FtY2FtQGFsdW1uaS51di5lcykuIFxuXG4gVW5pdmVyc2l0YXQgZGUgVmFsw6huY2lhIg0KZGF0ZTogIkRpY2llbWJyZSBkZSAyMDIxIChhY3R1YWxpemFkbyBlbCBgciBmb3JtYXQoU3lzLnRpbWUoKSwgJyVkLSVtLSVZJylgKSINCm91dHB1dDoNCiAgaHRtbF9kb2N1bWVudDoNCiAgICAjY3NzOiAiLi9hc3NldHMvbXlfY3NzX2ZpbGUuY3NzIg0KICAgIHRoZW1lOiBwYXBlcg0KICAgIGhpZ2hsaWdodDogdGV4dG1hdGUgDQogICAgdG9jOiB0cnVlDQogICAgdG9jX2RlcHRoOiAzIA0KICAgIHRvY19mbG9hdDogDQogICAgICBjb2xsYXBzZWQ6IHRydWUNCiAgICAgIHNtb290aF9zY3JvbGw6IHRydWUNCiAgICBzZWxmX2NvbnRhaW5lZDogdHJ1ZQ0KICAgIG51bWJlcl9zZWN0aW9uczogZmFsc2UNCiAgICBkZl9wcmludDoga2FibGUNCiAgICBjb2RlX2Rvd25sb2FkOiB0cnVlDQplZGl0b3Jfb3B0aW9uczogDQogIGNodW5rX291dHB1dF90eXBlOiBjb25zb2xlDQotLS0NCg0KYGBge3IgcGFja2FnZXMtc2V0dXAsIGluY2x1ZGUgPSBGQUxTRX0NCg0KbGlicmFyeSh0aWR5dmVyc2UpDQpsaWJyYXJ5KGtsaXBweSkgIA0KbGlicmFyeShrbml0cikNCmxpYnJhcnkodGliYmxlKQ0KbGlicmFyeShnZ3RoZW1lcykNCmxpYnJhcnkoZ2dwbG90MikNCmxpYnJhcnkoZHBseXIpDQpsaWJyYXJ5KHBhdGNod29yaykNCmxpYnJhcnkoZ2dyZXBlbCkNCmxpYnJhcnkoc2YpDQpsaWJyYXJ5KGdnc3BhdGlhbCkNCmxpYnJhcnkocm5hdHVyYWxlYXJ0aCkNCmxpYnJhcnkocm5hdHVyYWxlYXJ0aGRhdGEpDQpsaWJyYXJ5KHBqcHYyMDIwLjAxKQ0KbGlicmFyeShwbG90bHkpDQpsaWJyYXJ5KGdnYW5pbWF0ZSkNCmxpYnJhcnkgKGdpZnNraSkNCmxpYnJhcnkoZ3QpDQpsaWJyYXJ5KGthYmxlRXh0cmEpDQpsaWJyYXJ5KERUKQ0KbGlicmFyeShsZWFmbGV0KSANCmxpYnJhcnkobGVhZmVtKSANCmxpYnJhcnkoRFQpDQpsaWJyYXJ5KHRtYXApDQpsaWJyYXJ5KGxlYWZsZXQpDQpsaWJyYXJ5KHZlbWJlZHIpDQojZGV2dG9vbHM6Omluc3RhbGxfZ2l0aHViKCJpamx5dHRsZS92ZW1iZWRyIikNCg0KYGBgDQoNCmBgYHtyIGNodW5rLXNldHVwLCBpbmNsdWRlID0gRkFMU0V9DQprbml0cjo6b3B0c19jaHVuayRzZXQoZWNobyA9IFRSVUUsIGV2YWwgPSBUUlVFLCBtZXNzYWdlID0gRkFMU0UsIHdhcm5pbmcgPSBGQUxTRSwgDQogICAgICAgICAgICAgICAgICAgICAgI3Jlc3VsdHMgPSAiaG9sZCIsDQogICAgICAgICAgICAgICAgICAgICAgY2FjaGUgPSBGQUxTRSwgY2FjaGUucGF0aCA9ICIvY2FjaGVzLyIsIGNvbW1lbnQgPSAiIz4iLA0KICAgICAgICAgICAgICAgICAgICAgICNmaWcud2lkdGggPSA3LCAjZmlnLmhlaWdodD0gNywgICANCiAgICAgICAgICAgICAgICAgICAgICAjb3V0LndpZHRoID0gNywgb3V0LmhlaWdodCA9IDcsDQogICAgICAgICAgICAgICAgICAgICAgY29sbGFwc2UgPSBUUlVFLCAgZmlnLnNob3cgPSAiaG9sZCIsDQogICAgICAgICAgICAgICAgICAgICAgZmlnLmFzcCA9IDcvOSwgb3V0LndpZHRoID0gIjc1JSIsIGZpZy5hbGlnbiA9ICJjZW50ZXIiKQ0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KGRldiA9ICJwbmciLCBkZXYuYXJncyA9IGxpc3QodHlwZSA9ICJjYWlyby1wbmciKSkNCmBgYA0KDQoNCmBgYHtyIG9wdGlvbnMtc2V0dXAsIGluY2x1ZGUgPSBGQUxTRX0NCm9wdGlvbnMoc2NpcGVuID0gOTk5KSAjLSBwYXJhIHF1aXRhciBsYSBub3RhY2nDs24gY2llbnTDrWZpY2ENCm9wdGlvbnMoInlhbWwuZXZhbC5leHByIiA9IFRSVUUpIA0KYGBgDQoNCg0KYGBge3Iga2xpcHB5LCBlY2hvID0gRkFMU0V9DQprbGlwcHk6OmtsaXBweShwb3NpdGlvbiA9IGMoInRvcCIsICJyaWdodCIpKSAjLSByZW1vdGVzOjppbnN0YWxsX2dpdGh1Yigicmxlc3VyL2tsaXBweSIpDQpgYGANCg0KPGRpdiBzdHlsZT0idGV4dC1hbGlnbjoganVzdGlmeSI+PGRpdi8+DQoNCjxociBjbGFzcz0ibGluZWEtYmxhY2siPg0KDQo8IS0tIEVsIHDDoXJyYWZvIGRlIGFiYWpvIGhhcyBkZSBkZWphcmxvIGNhc2kgaWd1YWwsIHNvbG8gSEFTIGRlIFNVU1RJVFVJUiAicGVyZXpwNDQiIHBvciB0dSB1c3VhcmlvIGRlIEdpdGh1Yi0tPg0KVHJhYmFqbyBlbGFib3JhZG8gcGFyYSBsYSBhc2lnbmF0dXJhICJQcm9ncmFtYWNpw7NuIHkgbWFuZWpvIGRlIGRhdG9zIGVuIGxhIGVyYSBkZWwgQmlnIERhdGEiIGRlIGxhIFVuaXZlcnNpdGF0IGRlIFZhbMOobmNpYSBkdXJhbnRlIGVsIGN1cnNvIDIwMjEtMjAyMi4gRWwgcmVwbyBkZWwgdHJhYmFqbyBlc3TDoSBbYXF1w61dKGh0dHBzOi8vZ2l0aHViLmNvbS9wYXVwaWVyYTIzL3RyYWJham9fQmlnRGF0YV9lcXVpcG8pe3RhcmdldD0iX2JsYW5rIn0uIA0KDQo8IS0tIEVsIHDDoXJyYWZvIGRlIGFiYWpvIGhhcyBkZSBkZWphcmxvIGV4YWN0YW1lbnRlIGlndWFsLCBOTyBoYXMgZGUgY2FtYmlhciBuYWRhLS0+DQoNCkxhIHDDoWdpbmEgd2ViIGRlIGxhIGFzaWduYXR1cmEgeSBsb3MgdHJhYmFqb3MgZGUgbWlzIGNvbXBhw7Flcm9zIHB1ZWRlbiB2ZXJzZSBbYXF1w61dKGh0dHBzOi8vcGVyZXpwNDQuZ2l0aHViLmlvL2ludHJvLWRzLTIxLTIyLXdlYi8wNy10cmFiYWpvcy5odG1sKXt0YXJnZXQ9Il9ibGFuayJ9Lg0KDQo8aHIgY2xhc3M9ImxpbmVhLXJlZCI+DQoNCg0KDQojICA8Rk9OVCBDT0xPUj0iQmxhY2siPiAqKkludHJvZHVjY2nDs24qKiA8L0ZPTlQ+DQoNCg0KRWwgcHJpbmNpcGFsIGFuw6FsaXNpcyBkZSBlc3RlIHRyYWJham8gdmEgYSBzZXIgZWwgU2lzdGVtYSBkZSBwZW5zaW9uZXMgZXNwYcOxb2wgeSBsYXMgZGl2ZXJzYXMgdmFyaWFibGVzIHF1ZSBsbyBlbnZ1ZWx2ZW4gYWwgbWlzbW8uIERlbnRybyBkZSBlc3RhcyB2YXJpYWJsZXMgcG9kZW1vcyBlbmNvbnRyYXIgdmFyaWFibGVzIGRlbW9ncsOhZmljYXMgY29tbyBwdWVkZW4gc2VyIGxhIGVzcGVyYW56YSBkZSB2aWRhLCBsYSB0YXNhIGRlIG5hdGFsaWRhZC4uLiB0YW1iacOpbiB2YW1vcyBhIGFuYWxpemFyIGRpdmVyc2FzIHZhcmlhYmxlcyBlY29uw7NtaWNhcyByZWxhY2lvbmFkYXMgdGFudG8gY29uIGVsIG1lcmNhZG8gbGFib3JhbCBjb21vIGVuIGVsIGdhc3RvIGVuIHBlbnNpb25lcy4uLg0KDQoNCkxhcyBwZW5zaW9uZXMgZW4gRXNwYcOxYSBzZSBoYW4gY29udmVydGlkbyBlbiB1biB0ZW1hIGFib3JkYWJsZSBwYXJhIHN1IGVzdHVkaW8geSBhbsOhbGlzaXMuIFBvZGVtb3MgZGVjaXIgcXVlIGVsIHNpc3RlbWEgZGUgcGVuc2lvbmVzIHNlIHZlIGFmZWN0YWRvIHBvciAyIGdyYW5kZXMgZ3J1cG9zIGRlIHZhcmlhYmxlczogbGEgZGVtb2dyYWbDrWEgeSBlbCBtZXJjYWRvIGxhYm9yYWwuIA0KDQpQYXJhIHF1ZSBsbyBlbnRlbmRhbW9zLCBleGlzdGVuIGRvcyB0aXBvcyBkZSBzaXN0ZW1hcyBkZSBwZW5zaW9uZXM6DQoNClNpc3RlbWEgZGUgUmVwYXJ0bzogbG9zIHRyYWJhamFkb3JlcyBkZWwgbW9tZW50byBwYWdhbiB1bmFzIGNvdGl6YWNpb25lcyBhIGxhIHNlZ3VyaWRhZCBzb2NpYWwgcXVlIGVzdMOhbiBkZXN0aW5hZGFzIGFsIHBhZ28gZGUgbGFzIHBlbnNpb25lcyBkZSBkaWNobyBtb21lbnRvIChFcyBkZWNpciwgbG9zIHRyYWJhamFkb3JlcyBsZXMgcGFnYW4gYSBsb3MgcGVuc2lvbmlzdGFzIHksIGN1YW5kbyBzZSBqdWJpbGVuLCBsb3MgYW50aWd1b3MgdHJhYmFqYWRvcmVzIGNvYnJhcsOhbiBncmFjaWFzIGEgbG9zIGZ1dHVyb3MgdHJhYmFqYWRvcmVzKQ0KDQpTaXN0ZW1hIGRlIENhcGl0YWxpemFjacOzbjogY2FkYSB0cmFiYWphZG9yIGhhY2Ugc3VzIGFwb3J0YWNpb25lcyB5LCBjdWFuZG8gc2UganViaWxlLCBjb2JyYXLDoSBkaWNoYXMgYXBvcnRhY2lvbmVzIChhY3R1YWxpemFkYXMpDQoNCkVuIEVzcGHDsWEgZWwgc2lzdGVtYSBxdWUgdGVuZW1vcyBlcyBlbCBkZSByZXBhcnRvLiBQb3IgdGFudG8sIGVzdGUgc2lzdGVtYSBmdW5jaW9uYSBjb3JyZWN0YW1lbnRlIHNpIGxhIGNvcnJpZW50ZSBkZSBpbmdyZXNvcyAodHJhYmFqYWRvcmVzKSB5IHBhZ29zIChwZW5zaW9uaXN0YXMpIGVzdMOhIGVxdWlsaWJyYWRhLiBFbiBlbCBtb21lbnRvIGVuIGVsIHF1ZSBlc2UgZXF1aWxpYnJpbyBzZSByb21wZSBkZSBtYW5lcmEgbm8gdHJhbnNpdG9yaWEsIGVsIHByb2JsZW1hIHNlIGFncmF2YSB5IGhheSBxdWUgYWJvcmRhcmxvIHBhcmEgcXVlIGVsIHNpc3RlbWEgZGUgcGVuc2lvbmVzIHNlYSBzb3N0ZW5pYmxlLiANCg0Kwr9RdcOpIGVzdMOhIHBhc2FuZG8gY29uIGVsIHNpc3RlbWEgZGUgcGVuc2lvbmVzIGVzcGHDsW9sPyDCv0Z1bmNpb25hIGNvcnJlY3RhbWVudGU/IMK/RXMgc29zdGVuaWJsZT8NCkFsZ3Vub3MgZXhwZXJ0b3MgYWZpcm1hbiBxdWUgZWwgc2lzdGVtYSBlc3TDoSBxdWVicmFkbzoNCg0KPENFTlRFUj4NCmBgYHtyLCBlY2hvID0gRkFMU0UsIGV2YWwgPSBUUlVFfQ0KDQplbWJlZF91cmwoImh0dHBzOi8veW91dHUuYmUvNm1zNW9TdjNINW8iKQ0KYGBgDQo8L0NFTlRFUj4NCg0KWSBvdHJvcywgbm8gcGllbnNhbiBpZ3VhbDoNCg0KPENFTlRFUj4NCmBgYHtyLCBlY2hvID0gRkFMU0UsIGV2YWwgPSBUUlVFfQ0KDQplbWJlZF91cmwoImh0dHBzOi8veW91dHUuYmUvMFJCM3UzaWtFNTQiKQ0KYGBgDQo8L0NFTlRFUj4NCg0KDQojIyAgIDxGT05UIENPTE9SPSJibGFjayI+ICoqwr9Qb3IgcXXDqSBoYWNlbW9zIGVzdGUgdHJhYmFqbz8qKjwvRk9OVD4gDQoNClZpc3RhIGxhIHByb2JsZW3DoXRpY2EgdGFudG8gZGVsIHRlbWEgY29tbyBkZSBsYXMgcG9zaWJsZXMgc29sdWNpb25lcyB5IGxhIHBhc2l2aWRhZCBkZSBsb3MgcG9sw610aWNvcywgY29tbyBsYSBncmFuIG1heW9yw61hIGRlcGVuZGVyZW1vcyBkZSB1bmEgcGVuc2nDs24gZW4gZWwgZnV0dXJvLCBxdWVyZW1vcyB2ZXIgc2kgbG9zIGNvbmR1Y3RvcmVzIGRlbCBzaXN0ZW1hIG5hY2lvbmFsIGRlIHBlbnNpb25lcyBub3MgbGxldmFuIGhhY2lhIGxhIGRlcml2YSBvIHNpIHRvZG8gZXN0byBlcyBvdHJvIGRpc2N1cnNvIHBvcHVsaXN0YSBkZSBsb3MgcG9sw610aWNvcyBwYXJhIGhhY2VyIG9wb3NpY2nDs24uDQoNCg0KIyAgIDxGT05UIENPTE9SPSJibGFjayI+ICoqRGF0b3MqKjwvRk9OVD4gey50YWJzZXR9DQoNCiMjIDxGT05UIENPTE9SPSJibGFjayI+ICoqRXh0cmFjY2nDs24gZGUgZGF0b3MqKiA8L0ZPTlQ+DQoNCk5vcyBoYSBsbGV2YWRvIHVuIHRpZW1wbyBleHRyYWVyIHRvZG9zIGxvcyBkYXRvcyBuZWNlc2FyaW9zLCBsYSBtYXlvcsOtYSBzb24gb2J0ZW5pZG9zIGRlbCBJTkUsIGF1bnF1ZSB0YW1iacOpbiB0ZW5lbW9zIGRhdG9zIGRlIEV1cm9zdGF0IHkgZGVsIEJhbmNvIGRlIEVzcGHDsWEuIE5vcyBoZW1vcyBkZXNjYXJnYWRvIGxvcyBkYXRvcyBlbiBjc3YsIGFsZ3Vub3MgZXN0YWJhbiBiaWVuLCBwZXJvIG90cm9zIGRhYmFuIHByb2JsZW1hcyBkZWJpZG8gYSBxdWUgbm8gbG9zIHJlY29ub2PDrWEgY29tbyBudW3DqXJpY29zLCBsb3Mgbm9tYnJlcyBkZSBsYXMgdmFyaWFibGVzIGVyYW4gZGVtYXNpYWRvIGxhcmdvcywgcG9yIGxvIHF1ZSBlcmEgaW5jw7Ntb2RvIGEgbGEgaG9yYSBkZSB0cmFiYWphciB5IGhhYsOtYSBtdWNoYSBpbmZvcm1hY2nDs24gcXVlIHNvYnJhYmEuIA0KDQpgYGB7ciwgZXZhbCA9IFRSVUUsIGVjaG8gPSBGQUxTRX0NCg0Ka25pdHI6OmluY2x1ZGVfZ3JhcGhpY3MoaGVyZTo6aGVyZSgiaW1hZ2VuZXMiLCAiaW5lYmFzZS5qcGciKSkNCg0Ka25pdHI6OmluY2x1ZGVfZ3JhcGhpY3MoaGVyZTo6aGVyZSgiaW1hZ2VuZXMiLCAiYmFuY29fZXNwLmpwZyIpKQ0KDQprbml0cjo6aW5jbHVkZV9ncmFwaGljcyhoZXJlOjpoZXJlKCJpbWFnZW5lcyIsICJldXJvc3RhdC5wbmciKSkNCg0KYGBgDQoNCg0KIyMgPEZPTlQgQ09MT1I9ImJsYWNrIj4qKkPDs2RpZ28qKjwvRk9OVD4NCg0KVW5hIHZleiBleHRyYWlkb3MgbnVlc3Ryb3MgZGF0b3MgZW4gZm9ybWF0byAuY3N2LCBub3MgaGEgdG9jYWRvIGFycmVnbGFybG9zIGNvbiBSc3R1ZGlvIHlhIHF1ZSBtdWNoYXMgdmVjZXMgUiBubyBsb3MgZGV0ZWN0YXZhIGNvbiBmb3JtYXRvIG51bWVyaWNvLCBubyBwb2RpYW1vcyByZXByZXNlbnRhciBiaWVuIGxvcyBncsOhZmljb3MgbyBzaW1wbGVtZW50ZSBxdWVyaWFtb3MgZXhwbGljYXIgdW5vcyBkYXRvcyBhIHBhcnRpciBkZSBvdHJvcyB5IG5vcyBoYSB0b2NhZG8ganVudGFybG9zIGVuIHVuIG1pc21vIERhdGFmcmFtZQ0KDQpgYGB7ciwgZXZhbCA9IFRSVUV9DQoNCiMtIENhcmdhbW9zIGVsIGRmIGRlbCBwYXJvIHF1ZSBhbnRlcmlvcm1lbnRlIGhlbW9zIGRlc2NhcmdhZG8gZGVsIElORQ0KDQpkZl9wYXJvIDwtIHJpbzo6aW1wb3J0KCIuL2RhdG9zL3Rhc2FfcGFyby5jc3YiKQ0KDQoNCmRmX3Bhcm8gPC0gZGZfcGFybyAlPiUNCiAgc2VsZWN0KFBhcm8sIFBlcmlvZG9zKQ0KDQojQWhvcmEgY2FyZ2Ftb3MgbG9zIGRhdG9zIGRlbCBkZiBkZSBsYSB0YXNhIGRlIGFjdGl2aWRhZCBuYWNpb25hbCBwYXJhIHBvZGVyIGNvbXBhcmFybG9zIGNvbiBsYSB0YXNhIGRlIHBhcm8gbmFjaW9uYWwuDQoNCmRmX2FjdGl2aWRhZCA8LSByaW86OmltcG9ydCgiLi9kYXRvcy90YXNhX2FjdGl2aWRhZC5jc3YiKQ0KDQpkZl9hY3RpdmlkYWQgPC0gZGZfYWN0aXZpZGFkICU+JQ0KICBzZWxlY3QoUGVyaW9kb3MsIFRhc2FfQWN0aXZpZGFkKQ0KDQoNCiMtIFZhbW9zIGEganVudGFyIGVsIGRmIGRlIGxhIHRhc2EgZGUgYWN0aXZpZGFkIHkgbGEgdGFzYSBkZSBwYXJvIHBhcmEgcG9kZXIgaGFjZXIgdW4gZ3LDoWZpY28gZG9uZGUgc2UgcmVwcmVzZW50ZW4gYW1iYXMgdGFzYXMuDQoNCmRmX3VuaW9uIDwtIGlubmVyX2pvaW4oZGZfYWN0aXZpZGFkLCBkZl9wYXJvKQ0KDQojVmFtb3MgYSBjb21wYXJhciBsYSBldm9sdWNpw7NuIGRlIGxhIHRhc2EgZGUgbmF0YWxpZGFkIHkgZGVsIGluZGljZSBkZSBlbnZlamVjaW1pZW50byBwYXJhIHRlbmVyIGNvbm9jaW1pZW50byBkZSBsYSBldm9sdWNpw7NuIHF1ZSBoYW4gdGVuaWRvIGVzdGFzIHZhcmlhYmxlcyBkZW1vZ3LDoWZpY2FzLg0KDQpkZl9uYXRhbGlkYWQgPC0gcmlvOjppbXBvcnQoIi4vZGF0b3MvdGFzYV9uYXRhbGlkYWQuY3N2IikNCg0KZGZfaW5kaWNlIDwtIHJpbzo6aW1wb3J0KCIuL2RhdG9zL2luZGljZV9lbnZlamVjaW1pZW50by5jc3YiKQ0KDQpkZl9pbmRpY2UgPC0gZGZfaW5kaWNlICU+JQ0KICBmaWx0ZXIoUGVyaW9kbyAhPSAyMDIxKSAlPiUNCiAgcmVuYW1lKFBlcmlvZG9zID0gIlBlcmlvZG8iKQ0KDQpkZl9pbmRpY2UkVG90YWwgPC0gYXMubnVtZXJpYyhkZl9pbmRpY2UkVG90YWwpDQoNCmRmX3VuaW9uXzIgPC0gaW5uZXJfam9pbihkZl9uYXRhbGlkYWQsIGRmX2luZGljZSkNCg0KZGZfdW5pb25fMiA8LSBkZl91bmlvbl8yICU+JQ0KICBzZWxlY3QoUGVyaW9kb3MsIFRhc2FfTmF0YWxpZGFkLCBUb3RhbCkNCg0KI0NhcmdhbW9zIGVsIGRmIGRlIGxvcyBvY3VwYWRvcyBwb3IgZ3J1cG8gZGUgZWRhZC4NCg0KZGZfZWRhZCA8LSByaW86OmltcG9ydCgiLi9kYXRvcy9vY3VwX2VkYWQuY3N2IikNCg0KZGZfZWRhZCRUb3RhbCA8LSBhcy5udW1lcmljKGRmX2VkYWQkVG90YWwpDQoNCmRmX2VkYWQgPC0gZGZfZWRhZCAlPiUNCiAgbXV0YXRlKGZlY2hhID0gbHVicmlkYXRlOjp5cShQZXJpb2RvKSkgJT4lDQogIGZpbHRlcihmZWNoYSA9PSAiMjAyMS0wNy0wMSIpDQoNCg0KI1ZhbW9zIGEgY2FyZ2FyIGxvcyBkYXRvcyByZWZlcmVudGVzIGEgbGEgZWRhZCBkZSBlbWFuY2lwYWNpb24gZGUgbG9zIGpvdmVuZXMgZW4gRXNwYcOxYQ0KDQpkZl9lbWFuIDwtIHJpbzo6aW1wb3J0KCIuL2RhdG9zL2VkYWRfZW1hbmNpcGFjaW9uLmNzdiIpDQoNCmRmX2VtYW4gPC0gZGZfZW1hbiAlPiUNCiBmaWx0ZXIoIShUcmFtb19FZGFkICVpbiUgIjE2LTM0IGVkYWQiKSkNCg0KZGZfdmFyIDwtIGRmX2VtYW4gJT4lDQogIHBpdm90X3dpZGVyKG5hbWVzX2Zyb20gPSBQZXJpb2RvLCB2YWx1ZXNfZnJvbSA9IFBvcmNlbnRhamUpDQoNCmRmX3ZhciA8LSBqYW5pdG9yOjpjbGVhbl9uYW1lcyhkZl92YXIpDQpuYW1lcyhkZl92YXIpDQoNCmRmX3ZhciA8LSBkZl92YXIgJT4lDQogIG11dGF0ZSh2YXJpYWNpb24gPSAoeDIwMTggLSB4MjAwOCkveDIwMDgpDQoNCiMtIFZhbW9zIGEgYXJyZWdsYXIgbG9zIGRhdG9zIGRlIGxhIHBlbnNpb24gbWVkaWEgeSBkZWwgc2FsYXJpbyBtZWRpbyBxdWUgZW5jb250cmFtb3MgZW4gbG9zIHNpZ3VpZW50ZXMgZGYuDQoNCmRmX3BlbnNfbWVkIDwtIHJpbzo6aW1wb3J0KCIuL2RhdG9zL3BlbnNpb25fbWVkaWEuY3N2IikNCg0KZGZfd19tZWQgPC0gcmlvOjppbXBvcnQoIi4vZGF0b3Mvc2FsYXJpb19tZWRpby5jc3YiKQ0KDQpkZl93X21lZCR3X21lZF9hbnVhbCA8LSBhcy5udW1lcmljKGRmX3dfbWVkJHdfbWVkX2FudWFsKQ0KDQojLSBWYW1vcyBhIHVuaXIgbG9zIGRmIGRlIGxhIHBlbnNpb24gbWVkaWEgeSBkZWwgc2FsYXJpbyBtZWRpbyBwYXJhIG9ic2VydmFyIGxhIHZhcmlhY2lvbiBlbnRyZSBhbWJhcyB2YXJpYWJsZXMNCg0KZGZfdW5pb25fMyA8LSBpbm5lcl9qb2luKGRmX3BlbnNfbWVkLCBkZl93X21lZCkNCg0KZGZfdW5pb25fMyA8LSBkZl91bmlvbl8zICU+JQ0KICBzZWxlY3QocGVyaW9kbywgcGVuc2lvbl9tZWRpYV9hbnVhbCwgd19tZWRfYW51YWwpICU+JQ0KICBtdXRhdGUocG9yY2VudGFqZSA9IChwZW5zaW9uX21lZGlhX2FudWFsL3dfbWVkX2FudWFsKSoxMDApDQoNCiNWYW1vcyBhIGFycmVnbGFyIGxvcyBkYXRvcyByZWZlcmVudGVzIGEgbGEgZXZvbHVjacOzbiBkZSBsYSBlc3BlcmFuemEgZGUgdmlkYSBlbiBFc3Bhw7FhDQoNCmRmX3ZpZGEgPC0gcmlvOjppbXBvcnQoIi4vZGF0b3MvZXNwZXJhbnphX3ZpZGEuY3N2IikNCg0KZGZfdmlkYSA8LSBkZl92aWRhICU+JQ0KICBzZWxlY3QoImdlbyIsICJUSU1FX1BFUklPRCIsICJPQlNfVkFMVUUiKSAlPiUNCiAgcmVuYW1lKHBhaXMgPSAiZ2VvIiwgcGVyaW9kbyA9ICJUSU1FX1BFUklPRCIsIGVzcGVyYW56YV92aWRhID0gIk9CU19WQUxVRSIpDQoNCiNub3MgcXVlZGFtb3MgY29uIGxvcyBkYXRvcyBxdWUgcXVlcmVtb3MgbW9zdHJhcg0KDQpkZl92aWRhIDwtIGRmX3ZpZGEgJT4lDQogIGZpbHRlcihwYWlzICAlaW4lIGMoIkZSIiwgIkVTIiwgIklUIiwgIlBUIiwgIkFMIikgKQ0KDQojQXJyZWdsYW1vcyBsb3MgZGF0b3MgZGVsIEZvbmRvIGRlIFJlc2VydmEgZGUgbGFzIHBlbnNpb25lcw0KDQpkZl9mb25kbyA8LSByaW86OmltcG9ydCgiLi9kYXRvcy9mb25kb19yZXNlcnZhLmNzdiIpDQoNCmRmX2ZvbmRvJG1pbGxvbmVzX2V1cm9zIDwtIGFzLm51bWVyaWMoZGZfZm9uZG8kbWlsbG9uZXNfZXVyb3MpDQoNCiNDYXJnYW1vcyB5IGFycmVnbGFtb3MgbG9zIGRmIGRlIGxhIHBpcmFtaWRlIHBvYmxhY2lvbmFsIHkgZGUgbGEgcHJveWVjY2lvbg0KDQpkZl9waXJhbWlkZSA8LSByaW86OmltcG9ydCgiLi9kYXRvcy9waXJhbWlkZV9wb2IuY3N2IikNCg0KZGZfcGlyYW1pZGUkVG90YWwgPC0gYXMubnVtZXJpYyhkZl9waXJhbWlkZSRUb3RhbCkNCg0KZGZfcGlyYW1pZGVfMjAgPC0gZGZfcGlyYW1pZGUgJT4lDQogIGZpbHRlcihgQcOxb2AgPT0gMjAyMCkgJT4lDQogIGFycmFuZ2UoYEHDsW9gKQ0KDQpkZl9wcm95ZWNjaW9uIDwtIHJpbzo6aW1wb3J0KCIuL2RhdG9zL3Byb3llY2Npb25fMjA3MC5jc3YiKQ0KDQpkZl9wcm95ZWNjaW9uJHRvdGFsX3JlZCA8LSBhcy5udW1lcmljKGRmX3Byb3llY2Npb24kdG90YWxfcmVkKQ0KDQojQ3JlYW1vcyBsb3MgZGYgcGFyYSBsb3MgYcOxb3MgcXVlIHF1ZXJlbW9zIG1vc3RyYXIuDQoNCmRmX3Byb3llY2Npb25fMzYgPC0gZGZfcHJveWVjY2lvbiAlPiUNCiAgZmlsdGVyKFBlcmlvZG8gPT0gMjAzNikNCg0KZGZfcHJveWVjY2lvbl81MCA8LSBkZl9wcm95ZWNjaW9uICU+JQ0KICBmaWx0ZXIoUGVyaW9kbyA9PSAyMDUwKQ0KDQpkZl9wcm95ZWNjaW9uXzcwIDwtIGRmX3Byb3llY2Npb24gJT4lDQogIGZpbHRlcihQZXJpb2RvID09IDIwNzApDQoNCiNBIHBhcnRpciBkZSBhcXVpIGVtcGllemEgbG8gYnVlbm8NCg0KZGZfYWx0ZXJuYXRpdmFzIDwtIHJpbzo6aW1wb3J0KCIuL2RhdG9zL290cmFzX2FsdGVybmF0aXZhcy5jc3YiKQ0KZGZfYWx0ZXJuYXRpdmFzIDwtIGphbml0b3I6OmNsZWFuX25hbWVzKGRmX2FsdGVybmF0aXZhcykgDQoNCg0KZGZfYWx0ZXJuYXRpdmFzXzQgPC0gZGZfYWx0ZXJuYXRpdmFzICU+JQ0KICByZW5hbWUoRWZfeV9EZSA9IGVmZWN0aXZvX3lfZGVwX2Ezc2l0b3NfMikgJT4lDQogIHJlbmFtZShjYXBpdGFsID0gcGFydGljaXBhY2lvbmVzX2VuX2VsX2NhcGl0YWxfeV9lbl9maV8yKSAlPiUNCiAgcmVuYW1lKHllYXIgPSBmZWNoYSkgJT4lDQogIHJlbmFtZShjb3RpemFkYXMgPSBhY2Npb25lc19jb3RpemFkYXNfMikgJT4lDQogIHJlbmFtZShub19jb3RpemFkYXMgPSBhY2Npb25lc19ub19jb3RpemFkYXNfMiklPiUNCiAgbXV0YXRlKHBhcnRpY2lwYWNpb25lcyA9IHBhcnRpY2lwYWNpb25lc19lbl9maV95X2FjY2lvbmVzX2RlX3NvY19kZV9pbnZlcnNpX2Ezbl8yICsgb3RyYXNfcGFydGljaXBhY2lvbmVzXzIpICU+JQ0KICByZW5hbWUoY2FzaCA9IGVmZWN0aXZvXzIpICU+JQ0KICBtdXRhdGUoIGRlcG9zaXRvcyA9IGRlcF9hM3NpdG9zX3RyYW5zZmVyaWJsZXNfMiArIG90cm9zX2RlcF9hM3NpdG9zXzIpDQoNCg0KZGZfYWx0ZXJuYXRpdmFzXzQgPC0gZGZfYWx0ZXJuYXRpdmFzXzQgJT4lDQogIHNlbGVjdCh5ZWFyLCBjYXBpdGFsLCBjb3RpemFkYXMsIG5vX2NvdGl6YWRhcywgcGFydGljaXBhY2lvbmVzLCBjYXNoLCBFZl95X0RlLCBkZXBvc2l0b3MpICU+JSANCiAgcmVuYW1lKGVmZWN0aXZvID0gY2FzaCkgJT4lDQogIHJlbmFtZShhY2Npb25lcyA9IGNhcGl0YWwpICU+JQ0KICByZW5hbWUoZWZlY3Rpdm9feV9kZXBvc2l0b3MgPSBFZl95X0RlKQ0KDQoNCmRmX2FsdGVybmF0aXZhcyA8LSBkZl9hbHRlcm5hdGl2YXMgJT4lDQogIHJlbmFtZSh5ZWFyID0gZmVjaGEpICU+JQ0KICByZW5hbWUodG90YWwgPSB0b2Rvc19sb3NfaW5zdHJ1bWVudG9zKSAlPiUNCiAgcmVuYW1lKG9ybyA9IG9yb19tb25ldGFyaW9feV9kZWdfMikgJT4lDQogIHJlbmFtZShFZl95X0RlID0gZWZlY3Rpdm9feV9kZXBfYTNzaXRvc18yKSAlPiUNCiAgcmVuYW1lKGRldWRhID0gdmFsb3Jlc19yZXByZXNlbnRhdGl2b3NfZGVfZGV1ZGFfMikgJT4lDQogIHJlbmFtZShsb2FuID0gcHJfYV9jX3N0YW1vc18yKSAlPiUNCiAgcmVuYW1lKGNhcGl0YWwgPSBwYXJ0aWNpcGFjaW9uZXNfZW5fZWxfY2FwaXRhbF95X2VuX2ZpXzIpICU+JQ0KICByZW5hbWUocGVuc2lvbmVzX3ByaXYgPSBzaXN0ZW1hc19kZV9zZWd1cm9zX3BlbnNpb25lc195X2dhcmFudF9hX2FzX2VzdGFuZGFyaXphZGFzXzIpICU+JQ0KICByZW5hbWUob3Ryb3MgPSBvdHJvc19hY3Rpdm9zX3Bhc2l2b3NfMikNCg0KDQpkZl9hbHRlcm5hdGl2YXMgPC0gZGZfYWx0ZXJuYXRpdmFzICU+JQ0KICBzZWxlY3QoeWVhciwgdG90YWwsIG9ybywgRWZfeV9EZSwgZGV1ZGEsIGxvYW4sIGNhcGl0YWwsIHBlbnNpb25lc19wcml2LCBvdHJvcykNCg0KZGZfYWx0ZXJuYXRpdmFzXzIgPC0gZGZfYWx0ZXJuYXRpdmFzICU+JQ0KICBmaWx0ZXIoeWVhciA9PSAyMDIwKSANCmRmX2FsdGVybmF0aXZhc18yJGNvbXByb2JhY2lvbiA9IHJvd1N1bXMgKGRmX2FsdGVybmF0aXZhc18yWyAsIDM6OV0pDQpkZl9hbHRlcm5hdGl2YXNfMiA8LSBkZl9hbHRlcm5hdGl2YXNfMiAlPiUNCiAgc2VsZWN0KC10b3RhbCkgJT4lIHJlbmFtZSh0b3RhbCA9IGNvbXByb2JhY2lvbikNCmRmX2FsdGVybmF0aXZhc18yIDwtIGRmX2FsdGVybmF0aXZhc18yICU+JSBwaXZvdF9sb25nZXIoY29scyA9IDI6OCwgbmFtZXNfdG8gPSAiQWN0aXZvcyIsIHZhbHVlc190byA9ICJNaWxlc19kZV9ldXJvcyIpDQoNCmRmX2FsdGVybmF0aXZhc18yJHBvcmNlbnRhamUgPC0gcHJvcC50YWJsZShkZl9hbHRlcm5hdGl2YXNfMiRNaWxlc19kZV9ldXJvcykNCmRmX2FsdGVybmF0aXZhc18yJHBvcmNlbnRhamUgPC0gcm91bmQocHJvcC50YWJsZShkZl9hbHRlcm5hdGl2YXNfMiRNaWxlc19kZV9ldXJvcyksIDcpKjEwMA0KDQpkZl9hbHRlcm5hdGl2YXNbLCBjKDE6OSldIDwtIHNhcHBseShkZl9hbHRlcm5hdGl2YXNbLCBjKDE6OSldLCBhcy5udW1lcmljKQ0KDQpkZl9hbHRlcm5hdGl2YXNfMyA8LSBkZl9hbHRlcm5hdGl2YXMlPiUNCiAgc2VsZWN0KC1jKHRvdGFsKSkgJT4lDQogIHBpdm90X2xvbmdlcihjb2xzID0gMjo4LCBuYW1lc190byA9ICJBY3Rpdm9zIiwgdmFsdWVzX3RvID0gIk1pbGVzX2RlX2V1cm9zIikNCg0KDQojVmFtb3MgYSBhcnJlZ2xhciBsb3MgZGF0b3MgcGFyYSBwb2RlciBoYWNlciB1bmEgdGFibGENCg0KZGZfcGlyYW1pZGUgPC0gcmlvOjppbXBvcnQoIi4vZGF0b3MvcGlyYW1pZGVfcG9iLmNzdiIpDQpkZl9waXJhbWlkZSRUb3RhbCA8LSBhcy5udW1lcmljKGRmX3BpcmFtaWRlJFRvdGFsKQ0KZGZfcGlyYW1pZGUyIDwtIGRmX3BpcmFtaWRlICU+JSANCiAgc2VsZWN0KC1gRXNwYcOxb2xlcy9FeHRyYW5qZXJvc2ApICU+JSANCiAgcmVuYW1lKFBlcmlvZG8gPSBBw7FvKSAlPiUgDQogIHJlbmFtZSh0b3RhbF9yZWQgPSBUb3RhbCkgJT4lIA0KICByZW5hbWUoRWRhZCA9IGBFZGFkIChncnVwb3MgcXVpbnF1ZW5hbGVzKWApDQoNCg0KZGZfcHJveSA8LSByaW86OmltcG9ydCgiLi9kYXRvcy9wcm95ZWNjaW9uXzIwNzAuY3N2IikNCmRmX3Byb3kkdG90YWxfcmVkIDwtIGFzLm51bWVyaWMoZGZfcHJveSR0b3RhbF9yZWQpDQpkZl9wcm95MiA8LSBkZl9wcm95ICU+JSANCiAgc2VsZWN0ICgtVG90YWwpDQoNCg0KDQpkZl91bmkgPC0gZnVsbF9qb2luKGRmX3BpcmFtaWRlMiAsIGRmX3Byb3kyKQ0KZGZfdW5pMiA8LSBkZl91bmkgJT4lIA0KICBmaWx0ZXIoYyhFZGFkID09ICIwLTQgYcOxb3MiIHwgRWRhZCA9PSAiNjUtNjkgYcOxb3MiKSkNCg0KI1ZhbW9zIGEgYXJyZWdsYXIgbG9zIGRhdG9zIHBhcmEgcG9kZXIgaGFjZXIgdW4gbWFwYSBjb21wYXJhdGl2byBlbnRyZSBwYWlzZXMgc29icmUgZWwgYWhvcnJvIHByaXZhZG8NCg0KZGZfYWhvcnJvIDwtIHJpbzo6aW1wb3J0KCIuL2RhdG9zL2Fob3Jyb19wcml2YWRvLnhscyIpDQpkZl9haG9ycm8gPC0gZGZfYWhvcnJvICU+JQ0KICBzZWxlY3QoLWMoYEluZGljYXRvciBOYW1lYCkpICU+JQ0KICBwaXZvdF9sb25nZXIoY29scyA9IDQ6NjQsIG5hbWVzX3RvID0gIlllYXIiLCB2YWx1ZXNfdG8gPSAiYWhvcnJvX1BJQiIpDQoNCg0KZGF0YShXb3JsZCkgDQpkZl9haG9ycm9fMSA8LSBqYW5pdG9yOjpjbGVhbl9uYW1lcyhkZl9haG9ycm8pDQpkZl9haG9ycm9fMSA8LSBkZl9haG9ycm9fMSAlPiUNCiAgZmlsdGVyKHllYXIgPT0gMjAyMCkgJT4lDQogIHNlbGVjdChjb3VudHJ5X2NvZGUsIGFob3Jyb19waWIpDQp3b3JsZCA8LSBXb3JsZCA7IHJtKFdvcmxkKQ0Kd29ybGQgPC0gd29ybGQgJT4lIHJlbmFtZShjb3VudHJ5X2NvZGUgPSBpc29fYTMpDQpkZl9tYXBhIDwtIGlubmVyX2pvaW4od29ybGQsIGRmX2Fob3Jyb18xKQ0KDQpgYGANCg0KIyA8Rk9OVCBDT0xPUj0iQmxhY2siPiAgKipWYXJpYWJsZXMgRGVtb2dyw6FmaWNhcyoqICA8L0ZPTlQ+DQoNCg0KIyMgPEZPTlQgQ09MT1I9IkJsYWNrIj4gIE5hdGFsaWRhZCBWcy4gRW52ZWplY2ltaWVudG8gPC9GT05UPiB7LnRhYnNldH0NCg0KDQojIyMgPEZPTlQgQ09MT1I9IkJsYWNrIj4gKipBbsOhbGlzaXMqKiAgPC9GT05UPg0KDQpFbiBsYSBwYXJ0ZSBzdXBlcmlvciB5IGVuIGNvbG9yIHJvam8gcG9kZW1vcyB2ZXIgbGEgdGFzYSBkZSBlbnZlamVjaW1pZW50bywgbWllbnRyYXMgcXVlIGVuIGxhIHBhcnRlIGluZmVyaW9yIHkgZW4gY29sb3IgYXp1bCBlbmNvbnRyYW1vcyBsYSB0YXNhIGRlIG5hdGFsaWRhZC4gDQoNCkNsYXJhbWVudGUgc2UgYXByZWNpYSBxdWUgbGEgZXZvbHVjacOzbiBkZSBsYSBuYXRhbGlkYWQgaGEgc2lkbyBkZWNyZWNpZW50ZSwgbWllbnRyYXMgcXVlIGxhIHRhc2EgZGUgZW52ZWplY2ltaWVudG8gaGEgYXVtZW50YWRvLiANCg0KDQo8Q0VOVEVSPg0KKsK/WSBxdcOpIHNpZ25pZmljYSBlc3RvPyogKiorR2FzdG8gLSBJbmdyZXNvcyA9IC4uLioqDQo8L0NFTlRFUj4NCg0KPGJyPjxicj4NCg0KYGBge3IsIGV2YWwgPSBUUlVFLCBlY2hvID0gRkFMU0V9DQoNCnAyIDwtIGdncGxvdChkZl91bmlvbl8yKSArDQogIGdlb21fbGluZShhZXMoUGVyaW9kb3MsIFRhc2FfTmF0YWxpZGFkLCBjb2xvciA9ICJUYXNhX05hdGFsaWRhZCIpKSArIA0KICBnZW9tX3BvaW50KGFlcyhQZXJpb2RvcywgVGFzYV9OYXRhbGlkYWQsIGNvbG9yID0gIlRhc2FfTmF0YWxpZGFkIikpICsNCiAgZ2VvbV9saW5lKGFlcyhQZXJpb2RvcywgVG90YWwsIGNvbG9yID0gIkluZGljZV9lbnZlamVjaW1pZW50byIpKSsNCiAgZ2VvbV9wb2ludChhZXMoUGVyaW9kb3MsIFRvdGFsLCBjb2xvciA9ICJJbmRpY2VfZW52ZWplY2ltaWVudG8iKSkrDQogIHNjYWxlX3lfY29udGludW91cyhuYW1lID0gIkluZGljZSBkZSBlbnZlamVjaW1pZW50byIsIA0KICAgICAgICAgICAgICAgICAgICAgc2VjLmF4aXMgPSBzZWNfYXhpcyh+Li81LCBuYW1lID0gIlRhc2EgTmF0YWxpZGFkIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGZ1bmN0aW9uKGIpIHsgcGFzdGUwKHJvdW5kKGIgKiA0LCAwKSwgIiUiKX0pKSArDQogIGxhYnModGl0bGUgPSAiQ29tcGFyYWNpw7NuIFRhc2EgZGUgTmF0YWxpZGFkIGUgw41uZGljZSBkZSBFbnZlamVjaW1pZW50byIsDQogICAgc3VidGl0bGUgPSAiRGF0b3MgZXh0cmFpZG9zIGRlbCBJTkVCYXNlIikgKw0KICB0aGVtZV9taW5pbWFsKCkNCiAgDQoNCg0KZ2dwbG90bHkocDIpDQoNCmBgYA0KDQo8YnI+DQo8YnI+DQo8YnI+DQoNCiMjIyA8Rk9OVCBDT0xPUj0iQmxhY2siPiAqKkPDs2RpZ28qKiAgPC9GT05UPg0KDQoNCmBgYHtyLCBldmFsID0gRkFMU0UsIGVjaG8gPSBUUlVFfQ0KDQpwMiA8LSBnZ3Bsb3QoZGZfdW5pb25fMikgKw0KICBnZW9tX2xpbmUoYWVzKFBlcmlvZG9zLCBUYXNhX05hdGFsaWRhZCwgY29sb3IgPSAiVGFzYV9OYXRhbGlkYWQiKSkgKyANCiAgZ2VvbV9wb2ludChhZXMoUGVyaW9kb3MsIFRhc2FfTmF0YWxpZGFkLCBjb2xvciA9ICJUYXNhX05hdGFsaWRhZCIpKSArDQogIGdlb21fbGluZShhZXMoUGVyaW9kb3MsIFRvdGFsLCBjb2xvciA9ICJJbmRpY2VfZW52ZWplY2ltaWVudG8iKSkrDQogIGdlb21fcG9pbnQoYWVzKFBlcmlvZG9zLCBUb3RhbCwgY29sb3IgPSAiSW5kaWNlX2VudmVqZWNpbWllbnRvIikpKw0KICBzY2FsZV95X2NvbnRpbnVvdXMobmFtZSA9ICJJbmRpY2UgZGUgZW52ZWplY2ltaWVudG8iLCANCiAgICAgICAgICAgICAgICAgICAgIHNlYy5heGlzID0gc2VjX2F4aXMofi4vNSwgbmFtZSA9ICJUYXNhIE5hdGFsaWRhZCIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBmdW5jdGlvbihiKSB7IHBhc3RlMChyb3VuZChiICogNCwgMCksICIlIil9KSkgKw0KICBsYWJzKHRpdGxlID0gIkNvbXBhcmFjacOzbiBUYXNhIGRlIE5hdGFsaWRhZCBlIMONbmRpY2UgZGUgRW52ZWplY2ltaWVudG8iLA0KICAgIHN1YnRpdGxlID0gIkRhdG9zIGV4dHJhaWRvcyBkZWwgSU5FQmFzZSIpICsNCiAgdGhlbWVfbWluaW1hbCgpDQogIA0KDQoNCmdncGxvdGx5KHAyKQ0KDQpgYGANCg0KDQo8YnI+DQo8YnI+DQo8YnI+DQoNCiMjIDxGT05UIENPTE9SPSJCbGFjayI+ICBFdm9sdWNpw7NuIGRlIGxhIGVzcGVyYW56YSBkZSB2aWRhICA8L0ZPTlQ+IHsudGFic2V0fQ0KDQoNCg0KIyMjIDxGT05UIENPTE9SPSJCbGFjayI+ICoqQW7DoWxpc2lzKiogIDwvRk9OVD4NCg0KRW4gZXN0ZSBjYXNvIHNlIHB1ZWRlIGFwcmVjaWFyIGxhIGNsYXJhIHRlbmRlbmNpYSBhbGNpc3RhIGVuIGxhIGV2b2x1Y2nDs24gZGUgbGEgZXNwZXJhbnphIGRlIHZpZGEuIEhhY2UgYcOxb3MsIGVqZW1wbG8gZW4gMTk4MCwgZW4gRXNwYcOxYSBsYSBnZW50ZSBtb3LDrWEgZGUgbWVkaWEgYSBsb3MgNzUgYcOxb3MuIExvcyDDumx0aW1vcyBkYXRvcywgMjAxOSwgbm9zIGluZGljYW4gcXVlIGRlIG1lZGlhIGxhIHBvYmxhY2nDs24gZXNwYcOxb2xhIGZhbGxlY2UgYSBsb3MgODQgYcOxb3MuDQoNClBvciB0YW50byxlbCBhdmFuY2UgZGVsIHNpc3RlbWEgZGUgYmllbmVzdGFyIGhhY2UgcXVlICBsYSBnZW50ZSB2aXZhIG3DoXMgYcOxb3MgZW4gZWRhZCBkZSBqdWJpbGFjacOzbiBwb3IgbG8gcXVlIGF1bWVudGFuIGxvcyBnYXN0b3MgZGVsIHNpc3RlbWEgDQoNClNpbiBlbWJhcmdvIGVzdG8gbm8gZXMgdW4gY2FzbyBhaXNsYWRvIGRlbCBzaXN0ZW1hIGVzcGHDsW9sLCBwdWVzIGFmZWN0YSBhIHRvZGFzIGxhcyBlY29ub23DrWFzIGRlc2Fycm9sbGFkYXMuDQoNCjxDRU5URVI+DQoqwr9ZIHF1w6kgc2lnbmlmaWNhIGVzdG8/KiAqKitHYXN0byAqKg0KPC9DRU5URVI+DQo8YnI+PGJyPg0KDQpgYGB7ciwgZXZhbCA9IFRSVUUsIGVjaG8gPSBGQUxTRX0NCg0KcDExIDwtIGdncGxvdChkZl92aWRhKSArDQogYWVzKHggPSBwZXJpb2RvLCB5ID0gZXNwZXJhbnphX3ZpZGEsIGNvbG91ciA9IHBhaXMpICsNCiBnZW9tX2xpbmUoc2l6ZSA9IDEpICsNCiB0aGVtZV9taW5pbWFsKCkgKyANCiAgdGhlbWUocGxvdC5zdWJ0aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTEpKSArbGFicyh0aXRsZSA9ICJFdm9sdWNpw7NuIGRlIGxhIGVzcGVyYW56YSBkZSB2aWRhIHBvciBwYWlzZXMiLA0KICAgIHggPSAiUGVyaW9kbyIsIHkgPSAiQcOxb3MgZGUgdmlkYSIsIHN1YnRpdGxlID0gIkRhdG9zIGV4dHJhaWRvcyBkZSBFdXJvc3RhdCIpDQoNCmdncGxvdGx5KHAxMSkNCg0KYGBgDQoNCjxicj4NCjxicj4NCjxicj4NCg0KDQojIyMgPEZPTlQgQ09MT1I9IkJsYWNrIj4gKipDw7NkaWdvKiogIDwvRk9OVD4NCg0KDQpgYGB7ciwgZXZhbCA9IEZBTFNFLCBlY2hvID0gVFJVRX0NCg0KcDExIDwtIGdncGxvdChkZl92aWRhKSArDQogYWVzKHggPSBwZXJpb2RvLCB5ID0gZXNwZXJhbnphX3ZpZGEsIGNvbG91ciA9IHBhaXMpICsNCiBnZW9tX2xpbmUoc2l6ZSA9IDEpICsNCiB0aGVtZV9taW5pbWFsKCkgKyANCiAgdGhlbWUocGxvdC5zdWJ0aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTEpKSArbGFicyh0aXRsZSA9ICJFdm9sdWNpw7NuIGRlIGxhIGVzcGVyYW56YSBkZSB2aWRhIHBvciBwYWlzZXMiLA0KICAgIHggPSAiUGVyaW9kbyIsIHkgPSAiQcOxb3MgZGUgdmlkYSIsIHN1YnRpdGxlID0gIkRhdG9zIGV4dHJhaWRvcyBkZSBFdXJvc3RhdCIpDQoNCmdncGxvdGx5KHAxMSkNCg0KYGBgDQoNCiMjIDxGT05UIENPTE9SPSJCbGFjayI+ICBQaXJhbWlkZSBQb2JsYWNpb25hbCAgPC9GT05UPiB7LnRhYnNldH0NCg0KDQoNCg0KIyMjIDxGT05UIENPTE9SPSJCbGFjayI+ICoqQW7DoWxpc2lzKiogIDwvRk9OVD4NCg0KRW4gZXN0ZSBjYXNvIHBvZGVtb3MgYXByZWNpYXIgbGFzIGltw6FnZW5lcyBxdWUgcmVzdW1lbiwgYXVucXVlIGRlIG1hbmVyYSBhcHJveGltYWRhLCBsYSBpbmVzdGFiaWxpZGFkIGRlbCBzaXN0ZW1hLiBFbCBwcm9ibGVtYSBkZSBkaXNtaW51Y2nDs24gZGUgaW5ncmVzb3MganVudG8gYWwgYXVtZW50byBkZSBnYXN0b3Mgc2UgYWdyYXZhcsOhIGVuIGVsIGZ1dHVybyBzZWfDum4gbGFzIHByb3llY2Npb25lcyBkZWwgSU5FLiANCsK/WSBzaSBoYWNlbW9zIHVuIG51ZXZvIGJhYnkgYm9vbT8gQWxndW5vcyBlY29ub21pc3RhcyBoYWJsYW4gZGUgcXVlIHVuIG51ZXZvIGJhYnkgYm9vbSBheXVkYXLDrWEgYSBzb2x1Y2lvbmFyIGVsIHByb2JsZW1hLCBwdWVzdG8gcXVlIGF1bWVudGFyw61hIGxvcyBpbmdyZXNvcyBwb3RlbmNpYWxlcy4gU2luIGVtYmFyZ28sIGVzdGUgZW5mb3F1ZSBlcyBtaW9wZSwgeWEgcXVlIG5vIHNlIGVzdMOhIHRlbmllbmRvIGVuIGN1ZW50YSBxdWUgZW4gZWwgZnV0dXJvLCBjdWFuZG8gbGEgZ2VuZXJhY2nDs24gZGVsIG51ZXZvIGJhYnkgYm9vbSBzZWEgYW5jaWFuYSwgc2Vyw61hIG5lY2VzYXJpbyBvdHJvIGluY3JlbWVudG8gbWFzaXZvIGRlIGxhIG5hdGFsaWRhZCwgZW50cmFuZG8gYXPDrSBlbiB1biBidWNsZSBkZSBuZWNlc2lkYWQgZGUgaW5jcmVtZW50byBkZSBsYSBwb2JsYWNpw7NuLg0KDQpQYW4gcGFyYSBob3kgeSBoYW1icmUgcGFyYSBtYcOxYW5hDQoNCmBgYHtyLCBldmFsID0gVFJVRSwgZWNobyA9IEZBTFNFfQ0KDQpwMTMgPC0gZ2dwbG90KGRmX3BpcmFtaWRlLCBhZXMoeCA9IGBFZGFkIChncnVwb3MgcXVpbnF1ZW5hbGVzKWAsDQogICAgICAgICAgICAgICAgeSA9IGBUb3RhbGAsDQogICAgICAgICAgICAgICAgZmlsbCA9IFNleG8pKSArDQogIGdlb21fY29sKGRhdGEgPSBzdWJzZXQoZGZfcGlyYW1pZGUsIFNleG8gPT0gIkhvbWJyZXMiKSAlPiUgDQogICAgICAgICAgICAgbXV0YXRlKGBUb3RhbGAgPSAtIGBUb3RhbGApLA0KICAgICAgICAgICB3aWR0aCA9IDAuNSwgZmlsbCA9ICJibHVlIikgKw0KICBnZW9tX2NvbChkYXRhID0gc3Vic2V0KGRmX3BpcmFtaWRlLCBTZXhvID09ICJNdWplcmVzIiksDQogICAgICAgICAgIHdpZHRoID0gMC41LCBmaWxsID0gInBpbmsiKSArIA0KICBjb29yZF9mbGlwKCkrbGFicyh0aXRsZSA9ICJQaXJhbWlkZSBQb2JsYWNpb25hbCBhw7FvIDIwMjAgIiwNCiAgICB5ID0gIk1pbGVzIGRlIFBlcnNvbmFzIiwgc3VidGl0bGUgPSAiRGF0b3MgZXh0cmFpZG9zIGRlbCBJTkVCYXNlIikNCg0KZ2dwbG90bHkocDEzKQ0KDQpgYGANCg0KDQojIyMgPEZPTlQgQ09MT1I9IkJsYWNrIj4gKipDw7NkaWdvKiogIDwvRk9OVD4NCg0KYGBge3IsIGV2YWwgPSBGQUxTRSwgZWNobyA9IFRSVUV9DQoNCnAxMyA8LSBnZ3Bsb3QoZGZfcGlyYW1pZGUsIGFlcyh4ID0gYEVkYWQgKGdydXBvcyBxdWlucXVlbmFsZXMpYCwNCiAgICAgICAgICAgICAgICB5ID0gYFRvdGFsYCwNCiAgICAgICAgICAgICAgICBmaWxsID0gU2V4bykpICsNCiAgZ2VvbV9jb2woZGF0YSA9IHN1YnNldChkZl9waXJhbWlkZSwgU2V4byA9PSAiSG9tYnJlcyIpICU+JSANCiAgICAgICAgICAgICBtdXRhdGUoYFRvdGFsYCA9IC0gYFRvdGFsYCksDQogICAgICAgICAgIHdpZHRoID0gMC41LCBmaWxsID0gImJsdWUiKSArDQogIGdlb21fY29sKGRhdGEgPSBzdWJzZXQoZGZfcGlyYW1pZGUsIFNleG8gPT0gIk11amVyZXMiKSwNCiAgICAgICAgICAgd2lkdGggPSAwLjUsIGZpbGwgPSAicGluayIpICsgDQogIGNvb3JkX2ZsaXAoKStsYWJzKHRpdGxlID0gIlBpcmFtaWRlIFBvYmxhY2lvbmFsIGHDsW8gMjAyMCAiLA0KICAgIHkgPSAiTWlsZXMgZGUgUGVyc29uYXMiLCBzdWJ0aXRsZSA9ICJEYXRvcyBleHRyYWlkb3MgZGVsIElORUJhc2UiKQ0KDQpnZ3Bsb3RseShwMTMpDQoNCmBgYA0KDQoNCiMjIDxGT05UIENPTE9SPSJCbGFjayI+ICBQcm95ZWNjaW9uZXMgUG9ibGFjaW9uYWxlcyAgPC9GT05UPiB7LnRhYnNldH0NCg0KDQoNCiMjIyA8Rk9OVCBDT0xPUj0iQmxhY2siPiAqKjIwMzYqKiAgPC9GT05UPg0KDQpgYGB7ciwgZXZhbCA9IFRSVUUsIGVjaG8gPSBGQUxTRX0NCg0KcDE0IDwtIGdncGxvdChkZl9wcm95ZWNjaW9uXzM2LCBhZXMoeCA9IGBFZGFkYCwNCiAgICAgICAgICAgICAgICAgICAgICAgIHkgPSBgdG90YWxfcmVkYCwNCiAgICAgICAgICAgICAgICAgICAgICAgIGZpbGwgPSBTZXhvKSkgKw0KICBnZW9tX2NvbChkYXRhID0gc3Vic2V0KGRmX3Byb3llY2Npb25fMzYsIFNleG8gPT0gIkhvbWJyZXMiKSAlPiUgDQogICAgICAgICAgICAgbXV0YXRlKGB0b3RhbF9yZWRgID0gLSBgdG90YWxfcmVkYCksDQogICAgICAgICAgIHdpZHRoID0gMC41LCBmaWxsID0gImJsdWUiKSArDQogIGdlb21fY29sKGRhdGEgPSBzdWJzZXQoZGZfcHJveWVjY2lvbl8zNiwgU2V4byA9PSAiTXVqZXJlcyIpLA0KICAgICAgICAgICB3aWR0aCA9IDAuNSwgZmlsbCA9ICJwaW5rIikgKyANCiAgY29vcmRfZmxpcCgpK2xhYnModGl0bGUgPSAiUGlyYW1pZGUgUG9ibGFjaW9uYWwgYcOxbyAyMDM2IiwNCiAgICB5ID0gIk1pbGVzIGRlIHBlcnNvbmFzIiwgc3VidGl0bGUgPSAiRGF0b3MgZXh0cmFpZG9zIGRlbCBJTkVCYXNlIikNCg0KZ2dwbG90bHkocDE0KQ0KDQpgYGANCg0KIyMjIDxGT05UIENPTE9SPSJCbGFjayI+ICoqMjA1MCoqICA8L0ZPTlQ+DQoNCmBgYHtyLCBldmFsID0gVFJVRSwgZWNobyA9IEZBTFNFfQ0KDQpwMTUgPC0gZ2dwbG90KGRmX3Byb3llY2Npb25fNTAsIGFlcyh4ID0gYEVkYWRgLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5ID0gYHRvdGFsX3JlZGAsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGwgPSBTZXhvKSkgKw0KICBnZW9tX2NvbChkYXRhID0gc3Vic2V0KGRmX3Byb3llY2Npb25fNTAsIFNleG8gPT0gIkhvbWJyZXMiKSAlPiUgDQogICAgICAgICAgICAgbXV0YXRlKGB0b3RhbF9yZWRgID0gLSBgdG90YWxfcmVkYCksDQogICAgICAgICAgIHdpZHRoID0gMC41LCBmaWxsID0gImJsdWUiKSArDQogIGdlb21fY29sKGRhdGEgPSBzdWJzZXQoZGZfcHJveWVjY2lvbl81MCwgU2V4byA9PSAiTXVqZXJlcyIpLA0KICAgICAgICAgICB3aWR0aCA9IDAuNSwgZmlsbCA9ICJwaW5rIikgKyANCiAgY29vcmRfZmxpcCgpICsNCiAgbGFicyh0aXRsZSA9ICJQaXJhbWlkZSBQb2JsYWNpb25hbCBhw7FvIDIwNTAiLA0KICAgICAgIHkgPSAiTWlsZXMgZGUgcGVyc29uYXMiLCBzdWJ0aXRsZSA9ICJEYXRvcyBleHRyYWlkb3MgZGVsIElORUJhc2UiKQ0KDQpnZ3Bsb3RseShwMTUpDQoNCmBgYA0KDQojIyMgPEZPTlQgQ09MT1I9IkJsYWNrIj4gKioyMDcwKiogIDwvRk9OVD4NCg0KYGBge3IsIGV2YWwgPSBUUlVFLCBlY2hvID0gRkFMU0V9DQoNCnAxNiA8LSBnZ3Bsb3QoZGZfcHJveWVjY2lvbl83MCwgYWVzKHggPSBgRWRhZGAsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHkgPSBgdG90YWxfcmVkYCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsbCA9IFNleG8pKSArDQogIGdlb21fY29sKGRhdGEgPSBzdWJzZXQoZGZfcHJveWVjY2lvbl83MCwgU2V4byA9PSAiSG9tYnJlcyIpICU+JSANCiAgICAgICAgICAgICBtdXRhdGUoYHRvdGFsX3JlZGAgPSAtIGB0b3RhbF9yZWRgKSwNCiAgICAgICAgICAgd2lkdGggPSAwLjUsIGZpbGwgPSAiYmx1ZSIpICsNCiAgZ2VvbV9jb2woZGF0YSA9IHN1YnNldChkZl9wcm95ZWNjaW9uXzcwLCBTZXhvID09ICJNdWplcmVzIiksDQogICAgICAgICAgIHdpZHRoID0gMC41LCBmaWxsID0gInBpbmsiKSArIA0KICBjb29yZF9mbGlwKCkgKw0KICBsYWJzKHRpdGxlID0gIlBpcmFtaWRlIFBvYmxhY2lvbmFsIGHDsW8gMjA3MCIsDQogICAgICAgeSA9ICJNaWxlcyBkZSBwZXJzb25hcyIsIHN1YnRpdGxlID0gIkRhdG9zIGV4dHJhaWRvcyBkZWwgSU5FQmFzZSIpDQoNCmdncGxvdGx5KHAxNikNCg0KYGBgDQoNCiMjIyA8Rk9OVCBDT0xPUj0iQmxhY2siPiAqKlRhYmxhKiogIDwvRk9OVD4NCg0KYGBge3IsIGV2YWwgPSBUUlVFLCBlY2hvID0gRkFMU0V9DQoNCmRmX3VuaTIgJT4lICBEVDo6ZGF0YXRhYmxlKGV4dGVuc2lvbnMgPSAnQnV0dG9ucycsIA0KICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnMgPSBsaXN0KGRvbSA9ICdCbGZydGlwJywgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnV0dG9ucyA9IGMoJ2NvcHknLCAnY3N2JywgJ2V4Y2VsJywgJ3BkZicsICdwcmludCcpLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWdlTGVuZ3RoID0gNSwgYXV0b1dpZHRoID0gVFJVRSApKQ0KDQpgYGANCg0KIyMgPEZPTlQgQ09MT1I9IkJsYWNrIj4gIEVtYW5jaXBhY2nDs24gIDwvRk9OVD4gey50YWJzZXR9DQoNCg0KDQojIyMgPEZPTlQgQ09MT1I9IkJsYWNrIj4gKipBbsOhbGlzaXMqKiAgPC9GT05UPg0KDQpFbiByZWxhY2nDs24gY29uIGxhIHBvc2libGUgc29sdWNpw7NuIGRlbCBiYWJ5IGJvb20sIGRlc2RlIG51ZXN0cm8gcHVudG8gZGUgdmlzdGEsIGVsIHByaW5jaXBhbCBwcm9ibGVtYSByZXNpZGUgZW4gbGEgZWRhZCBkZSBlbWFuY2lwYWNpw7NuLiBTaSBsZXMgcHJlZ3VudGFtb3MgYSBudWVzdHJvcyBhYnVlbG9zIG8gcGFkcmVzIGEgcXXDqSBlZGFkIGVtcGV6YXJvbiBhIHRyYWJhamFyIHByb2JhYmxlbWVudGUgZXNjdWNoZW1vcyB1biBpbnRlcnZhbG8gZGUgZWRhZCBkZSAxMy0xOCBhw7Fvcy4gU2luIGVtYmFyZ28sIGEgZMOtYSBkZSBob3kgZXNhIGVkYWQgZXMgbXVjaG8gbcOhcyB0YXJkw61hLiBQb3IgbG8gdGFudG8gZWwgcHJpbmNpcGFsIHByb2JsZW1hIGxvIHBvZGVtb3MgdmVyIGVuIHF1ZSBsYSBnZW50ZSBlbnRyYSBtw6FzIHRhcmRlIGFsIG1lcmNhZG8gbGFib3JhbCBqdW50byBhIHF1ZSBhaG9yYSBzZSB2aXZlIG3DoXMgYcOxb3MuUG9yIGVsbG8gcXVlIGxvcyBwb2xpdGljb3MgZXN0w6FuIGFsYXJnYW5kbyBsYSBlZGFkIGRlIGp1YmlsYWNpw7NuLg0KDQo8Q0VOVEVSPg0KKsK/WSBxdcOpIHNpZ25pZmljYSBlc3RvPyogKiorR2FzdG8gLSBJbmdyZXNvcyA9IC4uLioqDQo8L0NFTlRFUj4NCg0KPGJyPjxicj4NCg0KYGBge3IsIGV2YWwgPSBUUlVFLCBlY2hvID0gRkFMU0V9DQoNCnA4IDwtIGdncGxvdChkZl9lbWFuKSArDQogYWVzKHggPSBUcmFtb19FZGFkLCBmaWxsID0gVHJhbW9fRWRhZCwgd2VpZ2h0ID0gUG9yY2VudGFqZSkgKw0KIGdlb21fYmFyKCkgKw0KIHNjYWxlX2ZpbGxfdmlyaWRpc19kKG9wdGlvbiA9ICJ2aXJpZGlzIiwgDQogZGlyZWN0aW9uID0gMSkgKw0KIHRoZW1lX21pbmltYWwoKSArDQogZmFjZXRfd3JhcCh2YXJzKFBlcmlvZG8pKSArIHRoZW1lKHBsb3Quc3VidGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDExKSwNCiAgICBheGlzLnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMyksDQogICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTYpKSArbGFicyh0aXRsZSA9ICJQb3JjZW50YWplIGRlIEVtYW5jaXBhZG9zIHBvciBlZGFkIiwNCiAgICB4ID0gIlRyYW1vIGRlIEVkYWQiLCB5ID0gIlBvcmNlbnRhamUgZGUgZW1hbmNpcGFkb3MiLA0KICAgIHN1YnRpdGxlID0gIkRhdG9zIGV4dHJhaWRvcyBkZWwgQkJWQSBSZXNlYXJjaCBGb3VuZGF0aW9uIikNCg0KZ2dwbG90bHkocDgpDQoNCmBgYA0KDQo8YnI+DQoNCmBgYHtyLCBldmFsID0gVFJVRSwgZWNobyA9IEZBTFNFfQ0KIHA5IDwtIGdncGxvdChkZl92YXIpICsNCiBhZXMoeCA9IHRyYW1vX2VkYWQsIGZpbGwgPSB0cmFtb19lZGFkLCB3ZWlnaHQgPSB2YXJpYWNpb24pICsNCiBnZW9tX2JhcigpICsNCiBzY2FsZV9maWxsX3ZpcmlkaXNfZChvcHRpb24gPSAidmlyaWRpcyIsIA0KIGRpcmVjdGlvbiA9IDEpICsNCiB0aGVtZV9taW5pbWFsKCkgKyB0aGVtZShwbG90LnN1YnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMCkpICtsYWJzKHRpdGxlID0gIlZhcmlhY2nDs24gcG9yY2VudHVhbCBkZSBlbWFuY2lwYWRvcyAyMDE4IC0gMjAwOCIsDQogICAgeCA9ICJUcmFtbyBkZSBFZGFkIiwgeSA9ICJWYXJpYWNpw7NuIGRlIGVtYW5jaXBhZG9zIiwNCiAgICBmaWxsID0gIlRyYW1vIGRlIEVkYWQiLCBzdWJ0aXRsZSA9ICJEYXRvcyBleHRyYWlkb3MgZGVsIEJCVkEgUmVzZWFyY2giKQ0KDQpnZ3Bsb3RseShwOSkNCg0KDQpgYGANCg0KDQo8YnI+DQo8YnI+DQo8YnI+DQoNCiMjIyA8Rk9OVCBDT0xPUj0iQmxhY2siPiAqKkPDs2RpZ28qKiAgPC9GT05UPg0KDQpgYGB7ciwgZXZhbCA9IEZBTFNFLCBlY2hvID0gVFJVRX0NCg0KcDggPC0gZ2dwbG90KGRmX2VtYW4pICsNCiBhZXMoeCA9IFRyYW1vX0VkYWQsIGZpbGwgPSBUcmFtb19FZGFkLCB3ZWlnaHQgPSBQb3JjZW50YWplKSArDQogZ2VvbV9iYXIoKSArDQogc2NhbGVfZmlsbF92aXJpZGlzX2Qob3B0aW9uID0gInZpcmlkaXMiLCANCiBkaXJlY3Rpb24gPSAxKSArDQogdGhlbWVfbWluaW1hbCgpICsNCiBmYWNldF93cmFwKHZhcnMoUGVyaW9kbykpICsgdGhlbWUocGxvdC5zdWJ0aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTEpLA0KICAgIGF4aXMudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEzKSwNCiAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNikpICtsYWJzKHRpdGxlID0gIlBvcmNlbnRhamUgZGUgRW1hbmNpcGFkb3MgcG9yIGVkYWQiLA0KICAgIHggPSAiVHJhbW8gZGUgRWRhZCIsIHkgPSAiUG9yY2VudGFqZSBkZSBlbWFuY2lwYWRvcyIsDQogICAgc3VidGl0bGUgPSAiRGF0b3MgZXh0cmFpZG9zIGRlbCBCQlZBIFJlc2VhcmNoIEZvdW5kYXRpb24iKQ0KDQpnZ3Bsb3RseShwOCkNCg0KDQogcDkgPC0gZ2dwbG90KGRmX3ZhcikgKw0KIGFlcyh4ID0gdHJhbW9fZWRhZCwgZmlsbCA9IHRyYW1vX2VkYWQsIHdlaWdodCA9IHZhcmlhY2lvbikgKw0KIGdlb21fYmFyKCkgKw0KIHNjYWxlX2ZpbGxfdmlyaWRpc19kKG9wdGlvbiA9ICJ2aXJpZGlzIiwgDQogZGlyZWN0aW9uID0gMSkgKw0KIHRoZW1lX21pbmltYWwoKSArIHRoZW1lKHBsb3Quc3VidGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEwKSkgK2xhYnModGl0bGUgPSAiVmFyaWFjacOzbiBwb3JjZW50dWFsIGRlIGVtYW5jaXBhZG9zIDIwMTggLSAyMDA4IiwNCiAgICB4ID0gIlRyYW1vIGRlIEVkYWQiLCB5ID0gIlZhcmlhY2nDs24gZGUgZW1hbmNpcGFkb3MiLA0KICAgIGZpbGwgPSAiVHJhbW8gZGUgRWRhZCIsIHN1YnRpdGxlID0gIkRhdG9zIGV4dHJhaWRvcyBkZWwgQkJWQSBSZXNlYXJjaCIpDQoNCmdncGxvdGx5KHA5KQ0KDQpgYGANCg0KDQo8YnI+DQo8YnI+DQo8YnI+DQoNCiMgPEZPTlQgQ09MT1I9IkJsYWNrIj4gICoqTWVyY2FkbyBMYWJvcmFsKiogIDwvRk9OVD4NCg0KIyMgPEZPTlQgQ09MT1I9IkJsYWNrIj4gIFRhc2EgZGUgUGFybyBWcy4gQWN0aXZpZGFkICA8L0ZPTlQ+IHsudGFic2V0fQ0KDQoNCiMjIyA8Rk9OVCBDT0xPUj0iQmxhY2siPiAqKkFuw6FsaXNpcyoqICA8L0ZPTlQ+DQoNCkVuIGVzdGUgY2FzbyBwb2RlbW9zIGFwcmVjaWFyIHF1ZSBhbWJhcyB2YXJpYWJsZXMgc2UgbXVldmVuIGFsIHVuw61zb25vIHBlcm8gZGUgbWFuZXJhIGludmVyc2EuIEFzw60sIGN1YW5kbyBlbCBwYXJvIGRpc21pbnV5ZSwgYXVtZW50YSBsYSB0YXNhIGRlIGFjdGl2aWRhZCB5IHZpY2V2ZXJzYS4gRMOtYSB0cmFzIGTDrWEgcG9kZW1vcyBlc2N1Y2hhciB5L28gbGVlciBlbiBsYXMgbm90aWNpYXMgZWwgcHJlb2N1cGFudGUgcHJvYmxlbWEgZGVsIHBhcm8gZXNwYcOxb2wsIHBvciBlamVtcGxvIFthcXXDrV0oaHR0cHM6Ly93d3cuZWxlY29ub21pc3RhLmVzL29waW5pb24tYmxvZ3Mvbm90aWNpYXMvMTExNDI2MDEvMDQvMjEvRWwtY3Jvbmljby1wcm9ibGVtYS1kZWwtcGFyby5odG1sKQ0KDQpEZXNkZSBlbCBwdW50byBkZSB2aXN0YSBkZWwgc2lzdGVtYSBkZSBwZW5zaW9uZXMgZXNwYcOxb2wsIHF1ZSByZWNvcmRlbW9zIHF1ZSBlcyB1biBzaXN0ZW1hIGRlIHJlcGFydG8gKGxvcyB0cmFiYWphZG9yZXMgZGUgYWhvcmEgcGFnYW4gYSBsb3MgcGVuc2lvbmlzdGFzIGRlIGFob3JhKSwgZXN0byBpbmZsdXllIGVuIGxhIG1lbm9yIGNhcGFjaWRhZCByZWNhdWRhdG9yaWEgZGUgZGljaG8gc2lzdGVtYSB5LCBwb3IgdGFudG8sIHByb3ZvY2EgdW5hIGdyYW4gaW5lc3RhYmlsaWRhZC4NCg0KPENFTlRFUj4NCirCv1kgcXXDqSBzaWduaWZpY2EgZXN0bz8qICoqLSBJbmdyZXNvcyoqDQo8L0NFTlRFUj4NCg0KPGJyPjxicj4NCg0KDQpgYGB7ciwgZXZhbCA9IFRSVUUsIGVjaG8gPSBGQUxTRX0NCg0KcDQgPC0gZ2dwbG90KGRmX3VuaW9uKSArDQogIGdlb21fYmFyKGFlcyhQZXJpb2RvcywgVGFzYV9BY3RpdmlkYWQpLCBzdGF0ID0gImlkZW50aXR5IiwgZmlsbCA9ICJncmV5IikgKw0KICBnZW9tX2xpbmUoYWVzKFBlcmlvZG9zLCBQYXJvKSwgc2l6ZSA9IDEpICsNCiAgZ2VvbV9wb2ludChhZXMoUGVyaW9kb3MsIFBhcm8pLCBzaXplID0gMikgKw0KICBsYWJzKHRpdGxlID0gIkNvbXBhcmFjacOzbiBUYXNhIGRlIFBhcm8geSBkZSBBY3RpdmlkYWQiLA0KICAgICAgIHN1YnRpdGxlID0gIkRhdG9zIHBhcmEgZWwgcGVyaW9kbyAyMDAyIC0gMjAyMCIsDQogICAgICAgY2FwdGlvbiA9ICJEYXRvcyBwcm92ZW5pZW50ZXMgZGVsIElORUJhc2UiLA0KICAgICAgIHkgPSAiVGFzYSBkZSBQYXJvIHkgQWN0aXZpZGFkIikgKw0KICB0aGVtZV9taW5pbWFsKCkNCg0KDQpnZ3Bsb3RseShwNCkNCg0KYGBgDQoNCjxicj4NCjxicj4NCjxicj4NCg0KIyMjIDxGT05UIENPTE9SPSJCbGFjayI+ICAqKkPDs2RpZ28qKiAgPC9GT05UPg0KDQpgYGB7ciwgZXZhbCA9IEZBTFNFLCBlY2hvID0gVFJVRX0NCnA0IDwtIGdncGxvdChkZl91bmlvbikgKw0KICBnZW9tX2JhcihhZXMoUGVyaW9kb3MsIFRhc2FfQWN0aXZpZGFkKSwgc3RhdCA9ICJpZGVudGl0eSIsIGZpbGwgPSAiZ3JleSIpICsNCiAgZ2VvbV9saW5lKGFlcyhQZXJpb2RvcywgUGFybyksIHNpemUgPSAxKSArDQogIGdlb21fcG9pbnQoYWVzKFBlcmlvZG9zLCBQYXJvKSwgc2l6ZSA9IDIpICsNCiAgbGFicyh0aXRsZSA9ICJDb21wYXJhY2nDs24gVGFzYSBkZSBQYXJvIHkgZGUgQWN0aXZpZGFkIiwNCiAgICAgICBzdWJ0aXRsZSA9ICJEYXRvcyBwYXJhIGVsIHBlcmlvZG8gMjAwMiAtIDIwMjAiLA0KICAgICAgIGNhcHRpb24gPSAiRGF0b3MgcHJvdmVuaWVudGVzIGRlbCBJTkVCYXNlIiwNCiAgICAgICB5ID0gIlRhc2EgZGUgUGFybyB5IEFjdGl2aWRhZCIpICsNCiAgdGhlbWVfbWluaW1hbCgpDQoNCg0KZ2dwbG90bHkocDQpDQoNCg0KYGBgDQoNCjxicj4NCjxicj4NCjxicj4NCg0KDQoNCiMjIDxGT05UIENPTE9SPSJCbGFjayI+ICBPY3VwYWRvcyBwb3IgZ3J1cG8gZGUgRWRhZCAgPC9GT05UPiB7LnRhYnNldH0NCg0KDQojIyMgPEZPTlQgQ09MT1I9IkJsYWNrIj4gKipBbsOhbGlzaXMqKiAgPC9GT05UPg0KDQpFc3RlIGFuw6FsaXNpcyB2YSBlbiBsw61uZWEgYWwgYW50ZXJpb3IuIEVuIGVzdGUgY2FzbyBjYWJlIGRlc3RhY2FyIHF1ZSBwYXJhIHF1ZSBlbCBzaXN0ZW1hIHJlY2liaWVyYSB1bmEgYm9jYW5hZGEgZGUgYWlyZSBlc3BlcmFuemFkb3IsIGxhIGZ1ZXJ6YSBtb3RyaXogZGVsIG1lcmNhZG8gbGFib3JhbCBkZWJlcsOtYSBzZXIgcHJpbmNpcGFsbWVudGUgbGFzIGVkYWRlcyBkZSAyMCBhIDUwIGHDsW9zLiBBc8OtIGNvbnNlZ3VpcsOtYW1vcyBxdWUgbGFzIHBlbnNpb25lcyBlc3R1dmllcmFuIG3DoXMgZ2FyYW50aXphZGFzIHF1ZSBhaG9yYSBtaXNtby4gU2luIGVtYmFyZ28sIHNlIHB1ZWRlIGFwcmVjaWFyIGNsYXJhbWVudGUgbGEgYmFqYSB0YXNhIGRlIG9jdXBhY2nDs24gYSBlZGFkZXMgZGUgZW50cmUgMjAgeSAzMCBhw7FvcywgY29zYSBxdWUgcHJlb2N1cGEgeSBtdWNoby4gQ29uY3LDqXRhbWVudGUsIHNlZ8O6biBbZnVlbnRlcyBkb2N1bWVudGFsZXNdKGh0dHBzOi8vd3d3Lm51ZXZhdHJpYnVuYS5lcy9hcnRpY3Vsby9zb2NpZWRhZC9wYXJvanV2ZW5pbC12aWVqby1wcm9ibGVtYWVzdHJ1Y3R1cmFsLWpvdmVuZXMtcHJlY2FyaWVkYWQvMjAyMTA4MTAxNTE3MTkxOTAxNjQuaHRtbCM6fjp0ZXh0PUVzcGElQzMlQjFhJTJDJTIwZW4lMjBsYSUyMGFjdHVhbGlkYWQlMkMlMjBlcyxlbiUyMGVsJTIwMTclMkMxJTI1LikgRXNwYcOxYSB0aWVuZSBsYSB0YXNhIGRlIHBhcm8ganV2ZW5pbCBtw6FzIGFsdGEgZGUgbG9zIHBhw61zZXMgbWllbWJyb3MgZGUgbGEgVW5pw7NuIEV1cm9wZWENCg0KPENFTlRFUj4NCirCv1kgcXXDqSBzaWduaWZpY2EgZXN0bz8qICoqRnV0dXJvIE5lZ3JvIHBhcmEgRXNwYcOxYSoqDQo8L0NFTlRFUj4NCg0KPGJyPjxicj4NCg0KDQpgYGB7ciwgZXZhbCA9IFRSVUUsIGVjaG8gPSBGQUxTRX0NCg0KcDEwIDwtIGdncGxvdChkZl9lZGFkKSArDQogYWVzKHggPSBFZGFkLCBmaWxsID0gRWRhZCwgd2VpZ2h0ID0gVG90YWwpICsNCiBnZW9tX2JhcigpICsNCiBzY2FsZV9maWxsX3ZpcmlkaXNfZChvcHRpb24gPSAidmlyaWRpcyIsIA0KIGRpcmVjdGlvbiA9IDEpICsNCiB0aGVtZV9taW5pbWFsKCkrbGFicyh0aXRsZSA9ICJPY3VwYWRvcyBwb3IgZ3J1cG8gZGUgRWRhZCBlbiAyMDIxIiwNCiAgICB4ID0gTlVMTCwgeSA9ICJNaWxlcyBkZSBQZXJzb25hcyIsIHN1YnRpdGxlID0gIkRhdG9zIGV4dHJhaWRvcyBkZWwgSU5FQmFzZSIpDQoNCmdncGxvdGx5KHAxMCkNCg0KYGBgDQoNCjxicj4NCjxicj4NCjxicj4NCg0KDQojIyMgPEZPTlQgQ09MT1I9IkJsYWNrIj4gICoqQ8OzZGlnbyoqICA8L0ZPTlQ+DQoNCmBgYHtyLCBldmFsID0gRkFMU0UsIGVjaG8gPSBUUlVFfQ0KDQpwMTAgPC0gZ2dwbG90KGRmX2VkYWQpICsNCiBhZXMoeCA9IEVkYWQsIGZpbGwgPSBFZGFkLCB3ZWlnaHQgPSBUb3RhbCkgKw0KIGdlb21fYmFyKCkgKw0KIHNjYWxlX2ZpbGxfdmlyaWRpc19kKG9wdGlvbiA9ICJ2aXJpZGlzIiwgDQogZGlyZWN0aW9uID0gMSkgKw0KIHRoZW1lX21pbmltYWwoKStsYWJzKHRpdGxlID0gIk9jdXBhZG9zIHBvciBncnVwbyBkZSBFZGFkIGVuIDIwMjEiLA0KICAgIHggPSBOVUxMLCB5ID0gIk1pbGVzIGRlIFBlcnNvbmFzIiwgc3VidGl0bGUgPSAiRGF0b3MgZXh0cmFpZG9zIGRlbCBJTkVCYXNlIikNCg0KZ2dwbG90bHkocDEwKQ0KDQpgYGANCg0KPGJyPg0KPGJyPg0KPGJyPg0KDQoNCiMgPEZPTlQgQ09MT1I9IkJsYWNrIj4gICoqUGVuc2lvbmVzKiogIDwvRk9OVD4gDQoNCg0KIyMgPEZPTlQgQ09MT1I9IkJsYWNrIj4gRXZvbHVjacOzbiBkZWwgRm9uZG8gZGUgUmVzZXJ2YSA8L0ZPTlQ+ey50YWJzZXR9DQoNCiMjIyA8Rk9OVCBDT0xPUj0iQmxhY2siPiAqKkFuw6FsaXNpcyoqICA8L0ZPTlQ+DQoNClByaW1lcm8gcXVlIG5hZGEgZGViZW1vcyBlbnRlbmRlciBxdWUgZWwgZm9uZG8gZGUgcmVzZXJ2YSBlcyBlbCDigJxsdWdhcuKAnSBkb25kZSwgZW4gw6lwb2NhcyBkZSBzdXBlcsOhdml0LCBzZSBkZXBvc2l0YW4gbGFzIGFwb3J0YWNpb25lcyBxdWUgc29icmFuIChjb3NhIHF1ZSBoYWNlIHF1ZSBlbCBmb25kbyBhdW1lbnRlKSB5LCBlbiDDqXBvY2FzIGRlZmljaXRhcmlhcywgc2UgdXRpbGl6YSBwYXJhIHRvbWFyIGRpbmVybyBwYXJhIHBhZ2FyIGEgbG9zIHBlbnNpb25pc3RhcyAoZGlzbWludXllIGVsIGZvbmRvIGRlIHJlc2VydmEpLiANCg0KQ2xhcmFtZW50ZSBzZSBwdWVkZSBhcHJlY2lhciBxdWUgZW4gbGEgw6lwb2NhIHByZWNyaXNpcyAoYW50ZXMgZGUgMjAwOCkgZWwgbWVyY2FkbyBsYWJvcmFsIGVzcGHDsW9sIGVzdGFiYSBlbiBhdWdlLCBjb3NhIHF1ZSBwZXJtaXTDrWEgcXVlIGxhIGNhbnRpZGFkIGluZ3Jlc2FkYSBlbiBsYSBzZWd1cmlkYWQgc29jaWFsIGZ1ZXJhIHN1cGVyaW9yIGEgbGEgY2FudGlkYWQgZ2FzdGFkYSAoY290aXphY2lvbmVzID4gcGVuc2lvbmVzKSwgcHJvdm9jYW5kbyB1biBzdXBlcsOhdml0IGRlbCBmb25kbyBkZSByZXNlcnZhLiBTaW4gZW1iYXJnbywgZXN0w6EgY2xhcm8gcXVlIGxhIGNyaXNpcyB0dXZvIGdyYW4gaW5jaWRlbmNpYSBlbiBlbCBtZXJjYWRvIGxhYm9yYWwgZXNwYcOxb2wuIExhIGdyYW4gdGFzYSBkZSBwYXJvIGp1bnRvIGFsIGF1bWVudG8gZGVsIG7CuiBkZSBwZW5zaW9uaXN0YXMgcHJvdm9jw7MgZWwgZ3JhbiBkZWNsaXZlIGRlIGxvIHF1ZSBjb23Dum5tZW50ZSBzZSBjb25vY2UgY29tbyBsYSDigJxodWNoYSBkZSBsYXMgcGVuc2lvbmVz4oCdLg0KTXVjaG9zIGVjb25vbWlzdGFzIGNhbGlmaWNhbiBlc3RlIGdyw6FmaWNvIGNvbW8gdW5hIGltw6FnZW4gZGUgbGEgZXN0cnVjdHVyYSBkZWZpY2l0YXJpYSBkZSBkaWNobyBzaXN0ZW1hLiBBZGVtw6FzLCBlbCBwcm9ibGVtYSBubyBlcyB0YW50byBxdWUgbG8gaGF5YW1vcyB1dGlsaXphZG8gZHVyYW50ZSBhw7FvcyBkZSBtYWxlc3RhciBlY29uw7NtaWNvIG5hY2lvbmFsLCBzaW7DsyBxdWUgbGFzIHByb3llY2Npb25lcyB5IGVsIGFuw6FsaXNpcyBkZSB2YXJpYWJsZXMgbm8gcGFyZWNlbiBwcm9tZXRlciB1bmEgcmVjdXBlcmFjacOzbiBkZWwgc3VwZXLDoXZpdA0KDQo8Q0VOVEVSPg0KKsK/WSBxdcOpIHNpZ25pZmljYSBlc3RvPyogKipOb3MgZXN0YW1vcyBmdW5kaWVuZG8gbG9zIGFob3Jyb3MgZGUgbnVlc3Ryb3MgYWJ1ZWxvcyoqDQo8L0NFTlRFUj4NCg0KDQpgYGB7ciwgZXZhbCA9IFRSVUUsIGVjaG8gPSBGQUxTRX0NCg0KDQpwMTIgPC0gZ2dwbG90KGRmX2ZvbmRvKSArDQogYWVzKHggPSBwZXJpb2RvLCB5ID0gbWlsbG9uZXNfZXVyb3MpICsNCiBnZW9tX2xpbmUoc2l6ZSA9IDEsIGNvbG91ciA9ICIjMDY2REQxIikgKw0KICBnZW9tX3BvaW50KCkrbGFicyh0aXRsZSA9ICJFdm9sdWNpw7NuIGRlbCBGb25kbyBkZSBSZXNlcnZhIDIwMDAgLSAyMDE5IiwNCiAgICB4ID0gIlBlcmlvZG8iLCB5ID0gIk1pbGxvbmVzIGRlIEV1cm9zIiwNCiAgICBzdWJ0aXRsZSA9ICJEYXRvcyBleHRyYWlkb3MgZGVsIElORUJhc2UiKSArDQogIHRoZW1lX21pbmltYWwoKQ0KDQpnZ3Bsb3RseShwMTIpDQoNCg0KYGBgDQoNCjxicj4NCjxicj4NCjxicj4NCg0KDQojIyMgPEZPTlQgQ09MT1I9IkJsYWNrIj4gICoqQ8OzZGlnbyoqICA8L0ZPTlQ+DQoNCmBgYHtyLCBldmFsID0gRkFMU0UsIGVjaG8gPSBUUlVFfQ0KDQpwMTIgPC0gZ2dwbG90KGRmX2ZvbmRvKSArDQogYWVzKHggPSBwZXJpb2RvLCB5ID0gbWlsbG9uZXNfZXVyb3MpICsNCiBnZW9tX2xpbmUoc2l6ZSA9IDEsIGNvbG91ciA9ICIjMDY2REQxIikgKw0KICBnZW9tX3BvaW50KCkrbGFicyh0aXRsZSA9ICJFdm9sdWNpw7NuIGRlbCBGb25kbyBkZSBSZXNlcnZhIDIwMDAgLSAyMDE5IiwNCiAgICB4ID0gIlBlcmlvZG8iLCB5ID0gIk1pbGxvbmVzIGRlIEV1cm9zIiwNCiAgICBzdWJ0aXRsZSA9ICJEYXRvcyBleHRyYWlkb3MgZGVsIElORUJhc2UiKSArDQogIHRoZW1lX21pbmltYWwoKQ0KDQpnZ3Bsb3RseShwMTIpDQoNCg0KYGBgDQoNCjxicj4NCjxicj4NCjxicj4NCg0KIyMgPEZPTlQgQ09MT1I9IkJsYWNrIj4gIFRhc2EgZGUgY29iZXJ0dXJhIG8gcmVlbXBsYXpvICA8L0ZPTlQ+IHsudGFic2V0fQ0KDQoNCiMjIyA8Rk9OVCBDT0xPUj0iQmxhY2siPiAqKkFuw6FsaXNpcyoqICA8L0ZPTlQ+DQoNCkVuIHBhbGFicmFzIHNlbmNpbGxhcywgbGEgdGFzYSBkZSBjb2JlcnR1cmEgbyBkZSByZWVtcGxhem8gZGUgbGFzIHBlbnNpb25lcyBub3MgaW5kaWNhIGVsIHBvcmNlbnRhamUgZGVsIHNhbGFyaW8gcXVlIGNvYnJhbW9zIGNvbW8gcGVuc2nDs24uIExhIGNhbGN1bGFtb3MgZGl2aWRpZW5kbyBudWVzdHJhIHBlbnNpw7NuIGVudHJlIG51ZXN0cm8gw7psdGltbyBzYWxhcmlvLiBBc8OtIG1lZGltb3Mgc2kgZWwgc2lzdGVtYSBlcyBjYXBheiBkZSBtYW50ZW5lciBudWVzdHJhIGNhcGFjaWRhZCBhZHF1aXNpdGl2YS4gQSBtb2RvIGRlIGVqZW1wbG8sIHNpIHVuIHRyYWJhamFkb3IgY29icmEgNjAw4oKsIGRlIHBlbnNpw7NuIHkgc3Ugw7psdGltbyBzYWxhcmlvIGVyYSBkZSAxLjAwMOKCrCwgbGEgdGFzYSBkZSBjb2JlcnR1cmEgZXMgZGUgKDYwMC8xMDAwICoxMDApIDYwJSAuIEVzIGRlY2lyLCBhbCBwYXNhciBkZSBzZXIgdHJhYmFqYWRvciBhIHBlbnNpb25pc3RhLCBlc3RhbW9zIHBlcmRpZW5kbyB1biA0MCUgZGUgcG9kZXIgYWRxdWlzaXRpdm8gKHJlc3BlY3RvIGFsIMO6bHRpbW8gZMOtYSBxdWUgdHJhYmFqYW1vcykuDQoNClBvZGVtb3MgYXByZWNpYXIgcXVlIGxhIHRlbmRlbmNpYSBldm9sdXRpdmEgaGEgc2lkbyBhc2NlbmRpZW50ZSwgY2xhcm8gZWplbXBsbyBkZWwgZm9tZW50byBkZWwgZXN0YWRvIGRlIGJpZW5lc3Rhci4gU0luIGVtYmFyZ28sIG3DoXMgcXVlIGxhIGV2b2x1Y2nDs24gcGFzYWRhLCBsbyBxdWUgdGVuZW1vcyBxdWUgcHJlZ3VudGFybm9zIGVzIHNpIGF1bWVudGFyIG8gbWFudGVuZXIgbGEgdGFzYSBkZSBjb2JlcnR1cmEgc2Vyw6EgdmlhYmxlIHNlZ8O6biBsb3MgbmVmYXN0b3MgcHJvbsOzc3RpY29zIHF1ZSBsb3MgZWNvbm9taXN0YXMgZGlhZ25vc3RpY2FuLg0KDQoNCmBgYHtyLCBldmFsID0gVFJVRSwgZWNobyA9IEZBTFNFfQ0KDQpwNyA8LSBnZ3Bsb3QoZGZfdW5pb25fMywgYWVzKHBlcmlvZG8sIHBvcmNlbnRhamUpKSArIA0KICBnZW9tX2xpbmUoc2l6ZSA9IDAuOCkgKyANCiAgZ2VvbV9wb2ludCgpICsgDQogIHRoZW1lKGF4aXMubGluZSA9IGVsZW1lbnRfbGluZShzaXplID0gMC41KSwNCiAgICBwYW5lbC5ncmlkLm1ham9yID0gZWxlbWVudF9saW5lKHNpemUgPSAwKSwNCiAgICBheGlzLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEyKSwNCiAgICBwYW5lbC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSAiZ3JheTg1IiksDQogICAgcGxvdC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSAid2hpdGUiKSkgK2xhYnModGl0bGUgPSAiVGFzYSBkZSBjb2JlcnR1cmEgbyByZWVtcGxhem8gZGUgbGEgcGVuc2nDs24gbWVkaWEiLA0KICAgIHggPSAiUGVyaW9kbyIsIHkgPSAiUG9yY2VudGFqZSIsIHN1YnRpdGxlID0gIkRhdG9zIGV4dHJhaWRvcyBkZWwgSU5FQmFzZSAiKSArDQogIHRoZW1lX21pbmltYWwoKQ0KDQpnZ3Bsb3RseShwNykNCg0KYGBgDQoNCjxicj4NCjxicj4NCjxicj4NCg0KDQojIyMgPEZPTlQgQ09MT1I9IkJsYWNrIj4gICoqQ8OzZGlnbyoqICA8L0ZPTlQ+DQoNCmBgYHtyLCBldmFsID0gRkFMU0UsIGVjaG8gPSBUUlVFfQ0KDQpwNyA8LSBnZ3Bsb3QoZGZfdW5pb25fMywgYWVzKHBlcmlvZG8sIHBvcmNlbnRhamUpKSArIA0KICBnZW9tX2xpbmUoc2l6ZSA9IDAuOCkgKyANCiAgZ2VvbV9wb2ludCgpICsgDQogIHRoZW1lKGF4aXMubGluZSA9IGVsZW1lbnRfbGluZShzaXplID0gMC41KSwNCiAgICBwYW5lbC5ncmlkLm1ham9yID0gZWxlbWVudF9saW5lKHNpemUgPSAwKSwNCiAgICBheGlzLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEyKSwNCiAgICBwYW5lbC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSAiZ3JheTg1IiksDQogICAgcGxvdC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSAid2hpdGUiKSkgK2xhYnModGl0bGUgPSAiVGFzYSBkZSBjb2JlcnR1cmEgbyByZWVtcGxhem8gZGUgbGEgcGVuc2nDs24gbWVkaWEiLA0KICAgIHggPSAiUGVyaW9kbyIsIHkgPSAiUG9yY2VudGFqZSIsIHN1YnRpdGxlID0gIkRhdG9zIGV4dHJhaWRvcyBkZWwgSU5FQmFzZSAiKSArDQogIHRoZW1lX21pbmltYWwoKQ0KDQpnZ3Bsb3RseShwNykNCg0KYGBgDQogDQo8YnI+DQo8YnI+DQo8YnI+DQoNCiMgPEZPTlQgQ09MT1I9IkJsYWNrIj4gICoqQWx0ZXJuYXRpdmFzIGEgbGFzIHBlbnNpb25lcyBww7pibGljYXMqKiAgPC9GT05UPiANCg0KUGFyYSBhbmFsaXphciBsYSB2aWFiaWxpZGFkIGRlbCBzaXN0ZW1hIGRlIHBlbnNpb25lcyBlcyBpbXBvcnRhbnRlIGFuYWxpemFyIHNpIGV4aXN0ZW4gYWx0ZXJuYXRpdmFzIHJlYWxlcyBhIGxhIHBlbnNpw7NuIHDDumJsaWNhIGVuIGVzdG9zIG1vbWVudG9zIGVuIEVzcGHDsWEuIFF1ZXJlbW9zIGF2ZXJpZ3VhciBzaSBlcyBmYWN0aWJsZSBwZW5zYXIgcXVlIGVsIGFob3JybyBwcml2YWRvIGVzIHN1ZmljaWVudGUgcGFyYSBjb21wZW5zYXIgdW5hcyBwZW5zaW9uZXMgZnV0dXJhcywgZW4gY2FzbyBkZSBxdWUgZXN0ZSBzaXN0ZW1hIGZyYWNhc2UuIFBhcmEgZWxsbyBoZW1vcyBpbnZlc3RpZ2FkbyBjw7NtbyBzZSBkaXN0cmlidXllIGVsIGFob3JybyBwcml2YWRvIGVuIEVzcGHDsWEgeSBjw7NtbyBoYSBpZG8gZXZvbHVjaW9uYW5kbyBlc3RlIGVuIGxvcyDDumx0aW1vcyBhw7Fvcy4gDQogDQo8YnI+DQoNCiMjIDxGT05UIENPTE9SPSJCbGFjayI+IENvbXBhcmFjacOzbiBkZWwgYWhvcnJvIHByaXZhZG8gZW50cmUgcGFpc2VzIDwvRk9OVD57LnRhYnNldH0NCg0KIyMjIDxGT05UIENPTE9SPSJCbGFjayI+ICoqQW7DoWxpc2lzKiogIDwvRk9OVD4NCg0KUHJpbWVybywgaGVtb3MgZWxhYm9yYWRvIGVzdGUgbWFwYSBwYXJhIG9ic2VydmFyIGVuIGVsIGHDsW8gMjAyMCwgcXXDqSBwb3JjZW50YWplIGRlbCBQSUIgb2N1cGEgZWwgYWhvcnJvIHByaXZhZG8gZW4gY2FzaSB0b2RvcyBsb3MgcGHDrXNlcyBkZWwgbXVuZG8uIFZlbW9zIHF1ZSBlbiBFc3Bhw7FhIHNlIHNpdMO6YSBlbiBlbCAyMSwzJS4gQ29tbyBzZSBhcHJlY2lhIGVuIGVsIG1hcGEsIGxvcyBuaXZlbGVzIG3DoXMgYWx0b3MgZGUgYWhvcnJvIHNlIGVuY3VlbnRyYW4gZW4gbG9zIHBhw61zZXMgZGVsIG5vcnRlIGRlIEV1cm9wYSB5IGVsIHN1ciBkZSBBc2lhLCBub3Mgc29ycHJlbmRlIGVzcGVjaWFsbWVudGUgbG9zIGNhc29zIGRlIE1hcnJ1ZWNvcywgVXpiZXF1aXN0w6FuICB5IEJhbmdsYWRlc2guIFBhw61zZXMgY29tbyBTdWl6YSwgTm9ydWVnYSB5IFN1ZWNpYSBjdWVudGFuIGNvbiBzaXN0ZW1hcyBkZSBwZW5zaW9uZXMgbWl4dG9zLCBlcyBkZWNpciwgdW4gcG9yY2VudGFqZSBkZSBsYXMgcGVuc2lvbmVzIGVzIHBhZ2FkbyBwb3IgZWwgcGHDrXMgeSBvdHJvIHBvciBlbCBwcm9waW8gYWhvcnJvIHByaXZhZG8gZGVsIGJlbmVmaWNpYXJpby4gRXMgcG9yIGVsbG8gcXVlIGN1ZW50YW4gY29uIGdyYW5kZXMgcG9yY2VudGFqZXMgZGUgYWhvcnJvIHByaXZhZG8gY29uIHJlc3BlY3RvIGFsIFBJQiwgeWEgcXVlIGVsIHByb3BpbyBzaXN0ZW1hIGZhdm9yZWNlIGEgZWxsby4gDQoNCjxDRU5URVI+DQoqwr9ZIHF1w6kgc2lnbmlmaWNhIGVzdG8/KiAqKkFob3JybyBpbnN1ZmljaWVudGUqKg0KPC9DRU5URVI+DQoNCmBgYHtyLCBldmFsID0gVFJVRSwgZWNobyA9IEZBTFNFfQ0KDQpteXBhbGV0dGUgPC0gY29sb3JOdW1lcmljKCBwYWxldHRlPSJHcmV5cyIsIGRvbWFpbj1kZl9tYXBhJGFob3Jyb19waWIsbmEuY29sb3I9InRyYW5zcGFyZW50IikNCg0KbXl0ZXh0IDwtIHBhc3RlKA0KICAiUGHDrXM6ICIsIGRmX21hcGEkbmFtZSwiPGJyLz4iLCANCiAgIlNpdHVhY2nDs24gZWNvbsOzbWljYToiLCAgZGZfbWFwYSRlY29ub215LCAiPGJyLz4iLCANCiAgIlBvcmNlbnRhamUgZGUgYWhvcnJvOiAiLCBkZl9tYXBhJGFob3Jyb19waWIsIA0KICBzZXA9IiIpICU+JQ0KICBsYXBwbHkoaHRtbHRvb2xzOjpIVE1MKQ0KbWFwYSA8LSBsZWFmbGV0KGRmX21hcGEpICU+JSANCiAgYWRkVGlsZXMoKSAgJT4lIA0KICBzZXRWaWV3KCBsYXQ9MTAsIGxuZz0wICwgem9vbT0yKSAlPiUNCiAgYWRkUG9seWdvbnMoIA0KICAgIGZpbGxDb2xvciA9IH5teXBhbGV0dGUoYWhvcnJvX3BpYiksIA0KICAgIHN0cm9rZT1UUlVFLCANCiAgICBmaWxsT3BhY2l0eSA9IDAuOSwgDQogICAgY29sb3I9IndoaXRlIiwgDQogICAgd2VpZ2h0PTAuMywNCiAgICBsYWJlbCA9IG15dGV4dCwNCiAgICBsYWJlbE9wdGlvbnMgPSBsYWJlbE9wdGlvbnMoIA0KICAgICAgc3R5bGUgPSBsaXN0KCJmb250LXdlaWdodCIgPSAibm9ybWFsIiwgcGFkZGluZyA9ICIzcHggOHB4IiksIA0KICAgICAgdGV4dHNpemUgPSAiMTNweCIsIA0KICAgICAgZGlyZWN0aW9uID0gImF1dG8iDQogICAgKQ0KICApICU+JQ0KICBhZGRMZWdlbmQoIHBhbD1teXBhbGV0dGUsIHZhbHVlcz1+YWhvcnJvX3BpYiwgb3BhY2l0eT0wLjksIHRpdGxlID0gIiUgZGUgYWhvcnJvIGVuIGVsIFBJQiIsIHBvc2l0aW9uID0gImJvdHRvbWxlZnQiICkNCm1hcGENCg0KYGBgDQoNCiMjIyA8Rk9OVCBDT0xPUj0iQmxhY2siPiAgKipDw7NkaWdvKiogIDwvRk9OVD4NCg0KYGBge3IsIGV2YWwgPSBGQUxTRSwgZWNobyA9IFRSVUV9DQoNCm15cGFsZXR0ZSA8LSBjb2xvck51bWVyaWMoIHBhbGV0dGU9IkdyZXlzIiwgZG9tYWluPWRmX21hcGEkYWhvcnJvX3BpYixuYS5jb2xvcj0idHJhbnNwYXJlbnQiKQ0KDQpteXRleHQgPC0gcGFzdGUoDQogICJQYcOtczogIiwgZGZfbWFwYSRuYW1lLCI8YnIvPiIsIA0KICAiU2l0dWFjacOzbiBlY29uw7NtaWNhOiIsICBkZl9tYXBhJGVjb25vbXksICI8YnIvPiIsIA0KICAiUG9yY2VudGFqZSBkZSBhaG9ycm86ICIsIGRmX21hcGEkYWhvcnJvX3BpYiwgDQogIHNlcD0iIikgJT4lDQogIGxhcHBseShodG1sdG9vbHM6OkhUTUwpDQptYXBhIDwtIGxlYWZsZXQoZGZfbWFwYSkgJT4lIA0KICBhZGRUaWxlcygpICAlPiUgDQogIHNldFZpZXcoIGxhdD0xMCwgbG5nPTAgLCB6b29tPTIpICU+JQ0KICBhZGRQb2x5Z29ucyggDQogICAgZmlsbENvbG9yID0gfm15cGFsZXR0ZShhaG9ycm9fcGliKSwgDQogICAgc3Ryb2tlPVRSVUUsIA0KICAgIGZpbGxPcGFjaXR5ID0gMC45LCANCiAgICBjb2xvcj0id2hpdGUiLCANCiAgICB3ZWlnaHQ9MC4zLA0KICAgIGxhYmVsID0gbXl0ZXh0LA0KICAgIGxhYmVsT3B0aW9ucyA9IGxhYmVsT3B0aW9ucyggDQogICAgICBzdHlsZSA9IGxpc3QoImZvbnQtd2VpZ2h0IiA9ICJub3JtYWwiLCBwYWRkaW5nID0gIjNweCA4cHgiKSwgDQogICAgICB0ZXh0c2l6ZSA9ICIxM3B4IiwgDQogICAgICBkaXJlY3Rpb24gPSAiYXV0byINCiAgICApDQogICkgJT4lDQogIGFkZExlZ2VuZCggcGFsPW15cGFsZXR0ZSwgdmFsdWVzPX5haG9ycm9fcGliLCBvcGFjaXR5PTAuOSwgdGl0bGUgPSAiJSBkZSBhaG9ycm8gZW4gZWwgUElCIiwgcG9zaXRpb24gPSAiYm90dG9tbGVmdCIgKQ0KbWFwYQ0KDQpgYGANCg0KDQojIyA8Rk9OVCBDT0xPUj0iQmxhY2siPiBUYWJsYSBjb21wYXJhdGl2YSA8L0ZPTlQ+ey50YWJzZXR9DQoNCiMjIyA8Rk9OVCBDT0xPUj0iQmxhY2siPiAqKkFuw6FsaXNpcyoqICA8L0ZPTlQ+DQoNCkVuIGxhIHNpZ3VpZW50ZSB0YWJsYSBvYnNlcnZhbW9zIGVsIHBvcmNlbnRhamUgZGUgYWhvcnJvIGVuIHJlbGFjacOzbiBhbCBQSUIgZW4gdG9kb3MgbG9zIHBhw61zZXMgcXVlIHRlbmVtb3MgZGF0b3MgZW4gMjAyMCB5IGxhIGRpZmVyZW5jaWEgY29uIGxhIG1lZGlhIHRvdGFsLiBPYnNlcnZhbW9zIGNvbW8gRXNwYcOxYSBzZSBzaXTDumEgMSBwdW50byBwb3JjZW50dWFsIHBvciBkZWJham8gZGUgbGEgbWVkaWEgdG90YWwsIHF1ZSBlcyBkZWwgMjIsMzclLiBTaSBmaWx0cmFtb3MgZGUgbWF5b3IgYSBtZW5vciBwb2RlbW9zIGFwcmVjaWFyIGNvbW8gU2luZ2FwdXIgZXMgZWwgcGHDrXMgZGVsIG11bmRvIGNvbiBtYXlvciBhaG9ycm8sIGNvbiBtw6FzIGRlbCA0MCUsIG90cm8gcGHDrXMgcXVlIGN1ZW50YSBjb24gdW4gc2lzdGVtYSBkZSBjYXBpdGFsaXphY2nDs24gKGlndWFsIHF1ZSBTdWVjaWEgeSBOb3J1ZWdhKS4gRGUgZXN0YSBtYW5lcmEsIGVzIGVsIHByb3BpbyB0cmFiYWphZG9yIGVsIHF1ZSwgcG9yIGxleSwgYWhvcnJhIGRpbmVybyBkdXJhbnRlIHRvZGEgc3UgdmlkYSBwYXJhIGdhc3RhcmxvIGN1YW5kbyBzZSBqdWJpbGUsIHkgZWwgcGHDrXMgb2ZyZWNlIHVuYSBheXVkYSBwYXJhIGFxdWVsbG9zIHF1ZSBubyBhbGNhbmNlbiBlbCBtw61uaW1vIGFob3JyYWRvLiBFc28gZXhwbGljYSBwb3JjZW50YWplcyB0YW4gYWx0b3MgZGUgYWhvcnJvLiANCg0KDQpFbnRyZSBsb3MgcGHDrXNlcyBjb24gbWVub3IgdGFzYSBkZSBhaG9ycm8gZW5jb250cmFtb3MgYSBHcmVjaWEsIFVjcmFuaWEgbyBSZWlubyBVbmlkby4gTWllbnRyYXMgbG9zIDIgcHJpbWVyb3MgY3VlbnRhbiBjb24gc2lzdGVtYXMgZGUgcmVwYXJ0byBwdXJhbWVudGUgcMO6YmxpY28sIGNvbW8gZW4gRXNwYcOxYSwgc29ycHJlbmRlIGVsIGNhc28gZGUgUmVpbm8gVW5pZG8sIGVuIGVsIGN1YWwgbGFzIHBlbnNpb25lcyBww7pibGljYXMgbm8gc3VwZXJhbiBlbCAzMCUgZGVsIHNhbGFyaW8gbWVkaW8gZGVsIHBhw61zLg0KDQo8Q0VOVEVSPg0KKsK/WSBxdcOpIHNpZ25pZmljYSBlc3RvPyogKiorIFBlbnNpb25lcyBwdXJhbWVudGUgcMO6YmxpY2FzIC0gYWhvcnJvIHByaXZhZG8qKg0KPC9DRU5URVI+DQoNCmBgYHtyLCBldmFsID0gVFJVRSwgZWNobyA9IEZBTFNFfQ0KZGZfdGFibGEgPC0gZGZfYWhvcnJvICAlPiUNCiAgZmlsdGVyKFllYXIgPT0gMjAyMCkgJT4lDQogIGRyb3BfbmEoKSAlPiUNCiAgbXV0YXRlKGRpZmVyZW5jaWEgPSBhaG9ycm9fUElCIC0gbWVhbihhaG9ycm9fUElCICwgbmEucm0gPSBUUlVFKSkgJT4lDQogIHNlbGVjdCgnQ291bnRyeSBOYW1lJywgYWhvcnJvX1BJQiwgZGlmZXJlbmNpYSkNCmxpYnJhcnkoRFQpICANCkRUOjpkYXRhdGFibGUoZGZfdGFibGEpDQpgYGANCg0KDQojIyMgPEZPTlQgQ09MT1I9IkJsYWNrIj4gKipDw7NkaWdvKiogIDwvRk9OVD4NCmBgYHtyLCBldmFsID0gRkFMU0UsIGVjaG8gPSBUUlVFfQ0KZGZfdGFibGEgPC0gZGZfYWhvcnJvICAlPiUNCiAgZmlsdGVyKFllYXIgPT0gMjAyMCkgJT4lDQogIGRyb3BfbmEoKSAlPiUNCiAgbXV0YXRlKGRpZmVyZW5jaWEgPSBhaG9ycm9fUElCIC0gbWVhbihhaG9ycm9fUElCICwgbmEucm0gPSBUUlVFKSkgJT4lDQogIHNlbGVjdCgnQ291bnRyeSBOYW1lJywgYWhvcnJvX1BJQiwgZGlmZXJlbmNpYSkNCmxpYnJhcnkoRFQpICANCkRUOjpkYXRhdGFibGUoZGZfdGFibGEpDQpgYGANCg0KDQojIyA8Rk9OVCBDT0xPUj0iQmxhY2siPiBEaXN0cmlidWNpw7NuIGRlbCBhaG9ycm8gcHJpdmFkbyA8L0ZPTlQ+ey50YWJzZXR9DQoNClBlcm8sIGRlbnRybyBkZSBFc3Bhw7FhLCDCv2PDs21vIHNlIGRpc3RyaWJ1eWUgZWwgYWhvcnJvPyDCv0xlIGVzdGFtb3Mgc2FjYW5kbyB0b2RhIGxhIHJlbnRhYmlsaWRhZCBwb3NpYmxlPyBWZW1vcyBjb21vIGxhIG1heW9yIHBhcnRlIGRlbCBhaG9ycm8gc2UgZGlzdHJpYnV5ZSBlbiBjYXBpdGFsIChhY2Npb25lcyB5IHBhcnRpY2lwYWNpb25lcyksIGVmZWN0aXZvIHkgZGVww7NzaXRvcywgdmFsb3JlcyByZXByZXNlbnRhdGl2b3MgZGUgZGV1ZGEgKGJvbm9zLCBvYmxpZ2FjaW9uZXMsIHBhZ2Fyw6lzLCBldGMuKSB5IHByw6lzdGFtb3MuIEVsIGFjdGl2byBtw6FzIHJlbnRhYmxlIGhpc3TDs3JpY2FtZW50ZSBzb24gbGFzIGFjY2lvbmVzLCBwb3IgbG8gcXVlIG5vIGVzdMOhIG1hbCBlbiBlc2Ugc2VudGlkbywgYXVucXVlIGhhYnLDrWEgcXVlIGFuYWxpemFyIGVuIHF1w6kgYWNjaW9uZXMgc2UgaW52aWVydGUgcHJpbmNpcGFsbWVudGUgeSBjdcOhbiByZW50YWJsZXMgc29uIGVzdGFzIHBhcmEgc2FjYXIgdW5hIGNvbmNsdXNpw7NuLiBQb3Igb3RybyBsYWRvLCBlbCBlZmVjdGl2byB5IGxvcyBkZXDDs3NpdG9zIHNvbiBsb3MgYWN0aXZvcyBtZW5vcyByZW50YWJsZXMgcG9zaWJsZXMgKG51bGEgbyBuZWdhdGl2YSBzaSBjb250YW1vcyBsYSBpbmZsYWNpw7NuKS4NCg0KPENFTlRFUj4NCirCv1kgcXXDqSBzaWduaWZpY2EgZXN0bz8qICoqUmVudGFiaWxpZGFkIGluc3VmaWNpZW50ZSoqDQo8L0NFTlRFUj4NCg0KIyMjIDxGT05UIENPTE9SPSJCbGFjayI+ICoqQW7DoWxpc2lzKiogIDwvRk9OVD4NCg0KYGBge3IsIGV2YWwgPSBUUlVFLCBlY2hvID0gRkFMU0V9DQoNCmcxIDwtIGdncGxvdChkZl9hbHRlcm5hdGl2YXNfMiwgYWVzKHg9MSwgeT1wb3JjZW50YWplLCBmaWxsPSBBY3Rpdm9zKSkgKw0KICBnZW9tX2JhcihzdGF0PSJpZGVudGl0eSIpICsNCiAgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IHBhc3RlMChyb3VuZChwb3JjZW50YWplLDEpLCIlIikpLCANCiAgICAgICAgICAgIHBvc2l0aW9uID0gcG9zaXRpb25fc3RhY2sodmp1c3QgPSAwLjUpKSArDQogIGNvb3JkX3BvbGFyKHRoZXRhID0gInkiKSArIA0KICB0aGVtZV92b2lkKCkrbGFicyh0aXRsZSA9ICJBaG9ycm8gcHJpdmFkbyBlbiAyMDIwIiwgeCA9IE5VTEwsDQogICAgc3VidGl0bGUgPSAiRGF0b3MgZXh0cmFpZG9zIGRlbCBCYW5jbyBkZSBFc3Bhw7FhIikNCg0KZzEgIA0KDQpgYGANCg0KIyMjIDxGT05UIENPTE9SPSJCbGFjayI+ICAqKkPDs2RpZ28qKiAgPC9GT05UPg0KDQpgYGB7ciwgZXZhbCA9IEZBTFNFLCBlY2hvID0gVFJVRX0NCg0KZzEgPC0gZ2dwbG90KGRmX2FsdGVybmF0aXZhc18yLCBhZXMoeD0xLCB5PXBvcmNlbnRhamUsIGZpbGw9IEFjdGl2b3MpKSArDQogIGdlb21fYmFyKHN0YXQ9ImlkZW50aXR5IikgKw0KICBnZW9tX3RleHQoYWVzKGxhYmVsID0gcGFzdGUwKHJvdW5kKHBvcmNlbnRhamUsMSksIiUiKSksIA0KICAgICAgICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbl9zdGFjayh2anVzdCA9IDAuNSkpICsNCiAgY29vcmRfcG9sYXIodGhldGEgPSAieSIpICsgDQogIHRoZW1lX3ZvaWQoKStsYWJzKHRpdGxlID0gIkFob3JybyBwcml2YWRvIGVuIDIwMjAiLCB4ID0gTlVMTCwNCiAgICBzdWJ0aXRsZSA9ICJEYXRvcyBleHRyYWlkb3MgZGVsIEJhbmNvIGRlIEVzcGHDsWEiKQ0KDQpnMSANCg0KYGBgDQogDQo8YnI+DQo8YnI+DQo8YnI+DQoNCiMjIDxGT05UIENPTE9SPSJCbGFjayI+IEV2b2x1Y2nDs24gZGVsIGFob3JybyBwcml2YWRvIDwvRk9OVD57LnRhYnNldH0NCg0KIyMjIDxGT05UIENPTE9SPSJCbGFjayI+ICoqQW7DoWxpc2lzKiogIDwvRk9OVD4NCg0KRW4gZXN0ZSBncsOhZmljbyBvYnNlcnZhbW9zIGVsIGNyZWNpbWllbnRvIGRlIGxhcyBkaWZlcmVudGVzIHBhcnRpZGFzIGR1cmFudGUgbG9zIMO6bHRpbW9zIDIwIGHDsW9zLCBlcyBpbnRlcmVzYW50ZSBjb21vIGVsIGNhcGl0YWwgaGEgY3JlY2lkbyBtw6FzIHF1ZSBlbCByZXN0byBkZSBwYXJ0aWRhcywgYXVucXVlIGNvbiBtYXlvciB2b2xhdGlsaWRhZCwgeWEgcXVlIHNlIHB1ZWRlIGFwcmVjaWFyIGxhIGNhw61kYSBlbiBsb3MgYcOxb3MgZGUgY3Jpc2lzICgyMDA4LTIwMTQpLg0KDQo8Q0VOVEVSPg0KKsK/WSBxdcOpIHNpZ25pZmljYSBlc3RvPyogKirCv2NhbWlubyBjb3JyZWN0bz8qKg0KPC9DRU5URVI+DQoNCmBgYHtyLCBldmFsID0gVFJVRSwgZWNobyA9IEZBTFNFfQ0KDQpwbG90X2RpbmFtaWNvIDwtIGRmX2FsdGVybmF0aXZhc18zICU+JQ0KICBnZ3Bsb3QoYWVzKHggPSBBY3Rpdm9zLCANCiAgICAgICAgICAgICB5ID0gTWlsZXNfZGVfZXVyb3MsIA0KICAgICAgICAgICAgIGZpbGw9IEFjdGl2b3MgKSkgKw0KICBnZW9tX2JhcihzdGF0PSAiaWRlbnRpdHkiLCANCiAgICAgICAgICAgY29sb3IgPSAiZ3JleSIsIA0KICAgICAgICAgICBzaG93LmxlZ2VuZCA9IEZBTFNFKSArDQogIGdlb21fdGV4dChhZXMobGFiZWwgPSBhcy5udW1lcmljKE1pbGVzX2RlX2V1cm9zKSksIA0KICAgICAgICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbl9zdGFjaygpLCANCiAgICAgICAgICAgIHZqdXN0PSAxLA0KICAgICAgICAgICAgaGp1c3Q9IC0wLjEsDQogICAgICAgICAgICBzaXplID0gNCwgDQogICAgICAgICAgICBjb2xvciA9ICJibGFjayIpKw0KICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBjKCJvcmFuZ2UiLCAiZGFya2dyZXkiLCAiZ3JlZW4iLCAicmVkIiwgImJsdWUiLCAieWVsbG93IiwgInB1cnBsZSIpKSArDQogIHNjYWxlX3lfY29udGludW91cyhsYWJlbHMgPSBzY2FsZXM6OmNvbW1hKSArDQogIHRoZW1lX21pbmltYWwoKSsNCiAgZW50ZXJfYXBwZWFyKCkgKw0KICB0cmFuc2l0aW9uX3N0YXRlcyh5ZWFyLCANCiAgICAgICAgICAgICAgICAgICAgdHJhbnNpdGlvbl9sZW5ndGggPSA1LCANCiAgICAgICAgICAgICAgICAgICAgc3RhdGVfbGVuZ3RoID0gNSkgKw0KICBsYWJzKHRpdGxlID0gIiBWb2x1bWVuIGRlIGxvcyBhY3Rpdm9zIGZpbmFuY2llcm9zIHBvciBhw7FvIFxuIFllYXIgOiB7Y2xvc2VzdF9zdGF0ZX0iLCANCiAgICAgICBzdWJ0aXRsZSA9ICJFbiBtaWxlcyBkZSBldXJvcyIsDQogICAgICAgeSA9ICIiLA0KICAgICAgIHggPSAiIiwNCiAgICAgICBjYXB0aW9uID0gIkJhbmNvIGRlIEVzcGHDsWEiKSArDQogIHRoZW1lKHBhbmVsLmdyaWQubWFqb3IueCA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTgsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhY2UgPSAiYm9sZCIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhqdXN0ID0gMC41KSwNCiAgICAgICAgcGxvdC5zdWJ0aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplPTE0LCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWNlID0gInBsYWluIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGp1c3QgPSAwLjUpKSArIGNvb3JkX2ZsaXAoKQ0KDQpwbG90X2RpbmFtaWNvDQoNCmBgYA0KDQoNCiMjIyA8Rk9OVCBDT0xPUj0iQmxhY2siPiAgKipDw7NkaWdvKiogIDwvRk9OVD4NCg0KYGBge3IsIGV2YWwgPSBGQUxTRSwgZWNobyA9IFRSVUV9DQoNCnBsb3RfZGluYW1pY28gPC0gZGZfYWx0ZXJuYXRpdmFzXzMgJT4lDQogIGdncGxvdChhZXMoeCA9IEFjdGl2b3MsIA0KICAgICAgICAgICAgIHkgPSBNaWxlc19kZV9ldXJvcywgDQogICAgICAgICAgICAgZmlsbD0gQWN0aXZvcyApKSArDQogIGdlb21fYmFyKHN0YXQ9ICJpZGVudGl0eSIsIA0KICAgICAgICAgICBjb2xvciA9ICJncmV5IiwgDQogICAgICAgICAgIHNob3cubGVnZW5kID0gRkFMU0UpICsNCiAgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IGFzLm51bWVyaWMoTWlsZXNfZGVfZXVyb3MpKSwgDQogICAgICAgICAgICBwb3NpdGlvbiA9IHBvc2l0aW9uX3N0YWNrKCksIA0KICAgICAgICAgICAgdmp1c3Q9IDEsDQogICAgICAgICAgICBoanVzdD0gLTAuMSwNCiAgICAgICAgICAgIHNpemUgPSA0LCANCiAgICAgICAgICAgIGNvbG9yID0gImJsYWNrIikrDQogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IGMoIm9yYW5nZSIsICJkYXJrZ3JleSIsICJncmVlbiIsICJyZWQiLCAiYmx1ZSIsICJ5ZWxsb3ciLCAicHVycGxlIikpICsNCiAgc2NhbGVfeV9jb250aW51b3VzKGxhYmVscyA9IHNjYWxlczo6Y29tbWEpICsNCiAgdGhlbWVfbWluaW1hbCgpKw0KICBlbnRlcl9hcHBlYXIoKSArDQogIHRyYW5zaXRpb25fc3RhdGVzKHllYXIsIA0KICAgICAgICAgICAgICAgICAgICB0cmFuc2l0aW9uX2xlbmd0aCA9IDUsIA0KICAgICAgICAgICAgICAgICAgICBzdGF0ZV9sZW5ndGggPSA1KSArDQogIGxhYnModGl0bGUgPSAiIFZvbHVtZW4gZGUgbG9zIGFjdGl2b3MgZmluYW5jaWVyb3MgcG9yIGHDsW8gXG4gWWVhciA6IHtjbG9zZXN0X3N0YXRlfSIsIA0KICAgICAgIHN1YnRpdGxlID0gIkVuIG1pbGVzIGRlIGV1cm9zIiwNCiAgICAgICB5ID0gIiIsDQogICAgICAgeCA9ICIiLA0KICAgICAgIGNhcHRpb24gPSAiQmFuY28gZGUgRXNwYcOxYSIpICsNCiAgdGhlbWUocGFuZWwuZ3JpZC5tYWpvci54ID0gZWxlbWVudF9ibGFuaygpLA0KICAgICAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxOCwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFjZSA9ICJib2xkIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGp1c3QgPSAwLjUpLA0KICAgICAgICBwbG90LnN1YnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemU9MTQsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhY2UgPSAicGxhaW4iLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoanVzdCA9IDAuNSkpICsgY29vcmRfZmxpcCgpDQoNCnBsb3RfZGluYW1pY28NCg0KYGBgDQoNCiMjIDxGT05UIENPTE9SPSJCbGFjayI+IERpc3RyaWJ1Y2nDs24gYWNjaW9uZXMgeSBkZXDDs3NpdG9zIDwvRk9OVD57LnRhYnNldH0NCg0KIyMjIDxGT05UIENPTE9SPSJCbGFjayI+ICoqQW7DoWxpc2lzKiogIDwvRk9OVD4NCg0KUGVybywgZGVudHJvIGRlIEVzcGHDsWEsIMK/Y8OzbW8gc2UgZGlzdHJpYnV5ZSBlbCBhaG9ycm8/IMK/TGUgZXN0YW1vcyBzYWNhbmRvIHRvZGEgbGEgcmVudGFiaWxpZGFkIHBvc2libGU/IFZlbW9zIGNvbW8gbGEgbWF5b3IgcGFydGUgZGVsIGFob3JybyBzZSBkaXN0cmlidXllIGVuIGNhcGl0YWwgKGFjY2lvbmVzIHkgcGFydGljaXBhY2lvbmVzKSwgZWZlY3Rpdm8geSBkZXDDs3NpdG9zLCB2YWxvcmVzIHJlcHJlc2VudGF0aXZvcyBkZSBkZXVkYSAoYm9ub3MsIG9ibGlnYWNpb25lcywgcGFnYXLDqXMsIGV0Yy4pIHkgcHLDqXN0YW1vcy4gRWwgYWN0aXZvIG3DoXMgcmVudGFibGUgaGlzdMOzcmljYW1lbnRlIHNvbiBsYXMgYWNjaW9uZXMsIHBvciBsbyBxdWUgbm8gZXN0w6EgbWFsIGVuIGVzZSBzZW50aWRvLCBhdW5xdWUgaGFicsOtYSBxdWUgYW5hbGl6YXIgZW4gcXXDqSBhY2Npb25lcyBzZSBpbnZpZXJ0ZSBwcmluY2lwYWxtZW50ZSB5IGN1w6FuIHJlbnRhYmxlcyBzb24gZXN0YXMgcGFyYSBzYWNhciB1bmEgY29uY2x1c2nDs24uIFBvciBvdHJvIGxhZG8sIGVsIGVmZWN0aXZvIHkgbG9zIGRlcMOzc2l0b3Mgc29uIGxvcyBhY3Rpdm9zIG1lbm9zIHJlbnRhYmxlcyBwb3NpYmxlcyAobnVsYSBvIG5lZ2F0aXZhIHNpIGNvbnRhbW9zIGxhIGluZmxhY2nDs24pLg0KDQo8Q0VOVEVSPg0KKsK/WSBxdcOpIHNpZ25pZmljYSBlc3RvPyogKipSZW50YWJpbGlkYWQgaW5zdWZpY2llbnRlKioNCjwvQ0VOVEVSPg0KYGBge3IsIGV2YWwgPSBUUlVFLCBlY2hvID0gRkFMU0V9DQoNCnNrZXRjaCA9IGh0bWx0b29sczo6d2l0aFRhZ3ModGFibGUoDQogIGNsYXNzID0gJ2Rpc3BsYXknLA0KICB0aGVhZCgNCiAgICB0cih0aChyb3dzcGFuID0gMiwgJ0HDsW8nKSwNCiAgICAgIHRoKGNvbHNwYW4gPSAzLCAnQWNjaW9uZXMnKSwNCiAgICAgIHRoKGNvbHNwYW4gPSAyLCAnRWZlY3Rpdm8geSBkZXDDs3NpdG9zJykpLA0KICAgIHRyKGxhcHBseShyZXAoYygnY290aXphZGFzJywgJ25vIGNvdGl6YWRhcycsICdwYXJ0aWNpcGFjaW9uZXMnLCAnZWZlY3Rpdm8nLCAnZGVww7NzaXRvcycpLCAxKSwgdGgpDQogICAgKQ0KICApDQopKQ0KDQoNCmRmX2FsdGVybmF0aXZhc181IDwtIGRmX2FsdGVybmF0aXZhc180JT4lDQogIHNlbGVjdCgtYygiYWNjaW9uZXMiLCAiZWZlY3Rpdm9feV9kZXBvc2l0b3MiKSkNCmRhdGF0YWJsZShkZl9hbHRlcm5hdGl2YXNfNSwgY29udGFpbmVyID0gc2tldGNoLCByb3duYW1lcyA9IEZBTFNFKSAgDQoNCmBgYA0KDQojIyMgPEZPTlQgQ09MT1I9IkJsYWNrIj4gICoqQ8OzZGlnbyoqICA8L0ZPTlQ+DQoNCmBgYHtyLCBldmFsID0gRkFMU0UsIGVjaG8gPSBUUlVFfQ0KDQpza2V0Y2ggPSBodG1sdG9vbHM6OndpdGhUYWdzKHRhYmxlKA0KICBjbGFzcyA9ICdkaXNwbGF5JywNCiAgdGhlYWQoDQogICAgdHIodGgocm93c3BhbiA9IDIsICdBw7FvJyksDQogICAgICB0aChjb2xzcGFuID0gMywgJ0FjY2lvbmVzJyksDQogICAgICB0aChjb2xzcGFuID0gMiwgJ0VmZWN0aXZvIHkgZGVww7NzaXRvcycpKSwNCiAgICB0cihsYXBwbHkocmVwKGMoJ2NvdGl6YWRhcycsICdubyBjb3RpemFkYXMnLCAncGFydGljaXBhY2lvbmVzJywgJ2VmZWN0aXZvJywgJ2RlcMOzc2l0b3MnKSwgMSksIHRoKQ0KICAgICkNCiAgKQ0KKSkNCnByaW50KHNrZXRjaCkNCg0KZGZfYWx0ZXJuYXRpdmFzXzUgPC0gZGZfYWx0ZXJuYXRpdmFzXzQlPiUNCiAgc2VsZWN0KC1jKCJhY2Npb25lcyIsICJlZmVjdGl2b195X2RlcG9zaXRvcyIpKQ0KZGF0YXRhYmxlKGRmX2FsdGVybmF0aXZhc181LCBjb250YWluZXIgPSBza2V0Y2gsIHJvd25hbWVzID0gRkFMU0UpICANCg0KYGBgDQoNCg0KDQojIDxGT05UIENPTE9SPSJCbGFjayI+ICoqQ29uY2x1c2lvbmVzKiogPC9GT05UPg0KDQpFbnRvbmNlcyDCv2VzIHZpYWJsZSBlbCBzaXN0ZW1hIGRlIHBlbnNpb25lcyBlbiBFc3Bhw7FhPyDCv3F1w6kgb2N1cnJpcsOhIGRlbnRybyBkZSAyMCBhw7Fvcz8gQnVlbm8sIGNvbW8gaGVtb3MgcG9kaWRvIGFuYWxpemFyLCBleGlzdGVuIHByZW9jdXBhbnRlcyBkYXRvcyBlbiBjdWFudG8gYSBsbyBxdWUgZWwgc2lzdGVtYSBzZSByZWZpZXJlLiBMYXMgYWxhcm1hcyBzdWVuYW4gY3VhbmRvIGFuYWxpemFtb3MgbGFzIHZhcmlhYmxlcyBkZW1vZ3LDoWZpY2FzLCBkb25kZSBlbCBiYWJ5IGJvb20gZGUgbG9zIGHDsW9zIGHDsW9zIDYwIGVuIHJlbGFjacOzbiBjb24gbGEgcmVkdWNjacOzbiBjb25zdGFudGUgZGUgbGEgbmF0YWxpZGFkIGRlIGxvcyDDumx0aW1vcyAzMC00MCBhw7FvcyBoYWNlbiBwcmV2ZXIgdW4gbsO6bWVybyBkZSBqdWJpbGFkb3MgZnV0dXJvcyBxdWUgcHVlZGUgbGxlZ2FyIGEgc2VyIGluc29zdGVuaWJsZS4gDQoNCg0KRWwgbWVyY2FkbyBsYWJvcmFsIG5vIGRlamEgbWVqb3JlcyBpbXByZXNpb25lcywgY29uIHRhc2FzIGRlIHBhcm8gYWx0w61zaW1hcyB5IGVtcGxlbyBkZW1hc2lhZG8gYmFqbyBlbnRyZSBsYXMgcGVyc29uYXMgZGUgMjAgeSAzMCBhw7Fvcy4gRXN0ZSBkYXRvIHB1ZWRlIGFmZWN0YXIgYSBsYSB0YXNhIGRlIG5hdGFsaWRhZCBkZWwgZnV0dXJvLCB5YSBxdWUgc2kgZXN0b3MgZ3J1cG9zIGRlIGVkYWQgbm8gdGllbmVuIHVuYSBlc3RhYmlsaWRhZCBlY29uw7NtaWNhIGVzIHByb2JhYmxlIHF1ZSBwb3Nwb25nYW4gbGEgZGVjaXNpw7NuIGRlIHRlbmVyIGhpam9zIG8sIGluY2x1c28sIGxhIGRlc2VzdGltZW4uIFBlcm8sIGFkZW3DoXMgZGUgZXNvLCDCv3F1acOpbiB2YSBhIHBhZ2FyIGxhcyBwZW5zaW9uZXMgZGVudHJvIGRlIDIwIGHDsW9zIHNpIGxvcyBxdWUgaG95IHRpZW5lbiAzMCBubyB0aWVuZW4gdHJhYmFqbz8NCg0KDQpMYSBmaW5hbmNpYWNpw7NuIGRlIGxhcyBwZW5zaW9uZXMgdGFtcG9jbyBhcnJvamEgc2XDsWFsZXMgcG9zaXRpdmFzLCB5YSBxdWUgZHVyYW50ZSBsYSBjcmlzaXMgZWwgZm9uZG8gZGUgcmVzZXJ2YSBzZSByZWR1am8gY29uc2lkZXJhYmxlbWVudGUgeSwgYWRlbcOhcywgbGEgdGFzYSBkZSBjb2JlcnR1cmEgbm8gZGVqYSBkZSBhdW1lbnRhci4gDQoNCg0KWSBsYXMgYWx0ZXJuYXRpdmFzIG5vIG5vcyBkZWphbiBkYXRvcyBkZWwgdG9kbyBob3JyaWJsZXMsIHBlcm8gc2lndWVuIHNpbiBlc3RhciBhIG5pdmVsZXMgZGUgbG9zIG1lam9yZXMgc2lzdGVtYXMgZGUgcGVuc2lvbmVzIGRlbCBtdW5kbywgYWRlbcOhcyBkZSB1biBleGNlc2l2byBwZXNvIGVuIGVsIGFob3JybyBkZSBsb3MgZGVww7NzaXRvcyB5IGVsIGVmZWN0aXZvLiANClBvciB0b2RvIGVzdG8sIG51ZXN0cmEgY29uY2x1c2nDs24gZXMgcXVlIGhheSBzdWZpY2llbnRlcyBhbGFybWFzIHBhcmEsIGFsIG1lbm9zLCBwcmVvY3VwYXJzZSB5IGhhY2Vyc2UgY2llcnRhcyBwcmVndW50YXMuIMK/Q29uZmlhbW9zIGVuIHF1ZSBkZW50cm8gZGUgMTUsIDIwIGHDsW9zLCBjdWFuZG8gbnVlc3Ryb3MgcGFkcmVzIHNlIGp1YmlsZW4sIHRlbmRyw6FuIHVuYSBwZW5zacOzbiBww7pibGljYSBkaWduYSBjb21vIG1lcmVjZW4/IMK/bGEgdGVuZHJlbW9zIG5vc290cm9zIGRlbnRybyBkZSA0MCBhw7Fvcz8gwr9xdcOpIHNvbHVjaW9uZXMgcG9kZW1vcyBlbmNvbnRyYXIgY29tbyBpbmRpdmlkdW9zIHBhcnRpY3VsYXJlcz8gwr95IHF1w6kgZGVjaXNpb25lcyBwdWVkZSB0b21hciBlbCBFc3RhZG8/DQoNCjxicj48YnI+DQoNCiMgPEZPTlQgQ09MT1I9IkJsYWNrIj4gKipCaWJsaW9ncmFmw61hKio8L0ZPTlQ+DQoNClBhcmEgbGEgcmVhbGl6YWNpw7NuIGRlIG51ZXN0cm8gdHJhYmFqbyBub3MgaGVtb3MgYmFzYWRvIGVuIGxhcyBzaWd1aWVudGVzIHDDoWdpbmFzIHdlYiB5IGJhc2VzIGRlIGRhdG9zOg0KDQpbSU5FXShodHRwczovL3d3dy5pbmUuZXMvaW5kZXguaHRtKQ0KDQpbQkJWQVJlc2VhcmNoXShodHRwczovL3d3dy5iYnZhcmVzZWFyY2guY29tLykNCg0KW1dlYiBkZWwgQ3Vyc29dKGh0dHBzOi8vcGVyZXpwNDQuZ2l0aHViLmlvL2ludHJvLWRzLTIxLTIyLXdlYi8wNC10dXRvcmlhbGVzLmh0bWwpDQoNCltnZ2FuaW1hdGVdKGh0dHBzOi8vZ2dhbmltYXRlLmNvbS8pDQoNCltCYW5jbyBkZSBFc3Bhw7FhXShodHRwczovL3d3dy5iZGUuZXMvYmRlL2VzLykNCg0KDQo8YnI+PGJyPg0KDQo8aHIgY2xhc3M9ImxpbmVhLXJlZCI+DQo8aHIgY2xhc3M9ImxpbmVhLXJlZCI+DQoNCg0KYGBge3IsIGVjaG8gPSBGQUxTRX0NCnNlc3Npb25pbmZvOjpzZXNzaW9uX2luZm8oKSAlPiUgZGV0YWlsczo6ZGV0YWlscyhzdW1tYXJ5ID0gJ0luZm9ybWFjacOzbiBkZSBtaSBSLXNlc2nDs246JykgDQpgYGANCg0KDQo8YnI+PGJyPg0KDQo8ZGl2IGNsYXNzPSJ0b2NpZnktZXh0ZW5kLXBhZ2UiIGRhdGEtdW5pcXVlPSJ0b2NpZnktZXh0ZW5kLXBhZ2UiIHN0eWxlPSJoZWlnaHQ6IDA7Ij48L2Rpdj4NCg==