Propósito

Aplicar las técnicas de análisis estadísticos descriptivos y estimadores, empleando los gráficos necesarios destacar la información de interés sobre un conjunto de datos y sobre las relaciones que guardan entre sí, con la ayuda de software estadístico.


library(tidyverse)
## ── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
## ✔ dplyr     1.1.2     ✔ readr     2.1.4
## ✔ forcats   1.0.0     ✔ stringr   1.5.0
## ✔ ggplot2   3.4.2     ✔ tibble    3.2.1
## ✔ lubridate 1.9.2     ✔ tidyr     1.3.0
## ✔ purrr     1.0.2     
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## ✖ dplyr::filter() masks stats::filter()
## ✖ dplyr::lag()    masks stats::lag()
## ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
library(dplyr)
library(ggplot2)
turismo <- read.csv("/Users/araquezada/Documents/Tec/7mo Semestre/Analítica para Negocios/Modulo 3/Base de Datos Turismo Responsable 2.csv")

Limpieza de Datos

Debido a la gran cantidad de variables que existen, nosotros nos enfocaremos solo en aquellas que están enfocadas a aportar información directamente relacionada con la encuesta, desechando:

“StartDate, EndDate, Status, IPAddress, Progress, Duration, (in seconds), Finished, RecordedDate, ResponseId, RecipientLastName, RecipientFirstName, RecipientEmail, ExternalReference, LocationLatitude, LocationLongitude, DistributionChannel, y UserLanguage”. Las variables usadas serán fácilmente indentificadas debido a que todas empiezan con Q.

str(turismo)
## 'data.frame':    935 obs. of  59 variables:
##  $ StartDate            : chr  "05/03/20 8:54" "05/03/20 9:03" "05/03/20 9:02" "05/03/20 8:55" ...
##  $ EndDate              : chr  "05/03/20 9:01" "05/03/20 9:05" "05/03/20 9:06" "05/03/20 9:10" ...
##  $ Status               : int  0 0 0 0 0 0 0 0 0 0 ...
##  $ IPAddress            : chr  "131.178.54.55" "131.178.200.66" "200.95.170.77" "131.178.54.69" ...
##  $ Progress             : int  100 100 100 100 100 100 100 100 100 100 ...
##  $ Duration..in.seconds.: int  477 115 257 916 255 163 500 447 4236 488 ...
##  $ Finished             : int  1 1 1 1 1 1 1 1 1 1 ...
##  $ RecordedDate         : chr  "05/03/20 9:01" "05/03/20 9:05" "05/03/20 9:06" "05/03/20 9:10" ...
##  $ ResponseId           : chr  "R_1HNq2eWcYHIucIF" "R_3GlhbBuuVXrn7Wa" "R_27Nh8d4iF86rUuK" "R_uf5wi6KfNeBnmal" ...
##  $ RecipientLastName    : logi  NA NA NA NA NA NA ...
##  $ RecipientFirstName   : logi  NA NA NA NA NA NA ...
##  $ RecipientEmail       : logi  NA NA NA NA NA NA ...
##  $ ExternalReference    : logi  NA NA NA NA NA NA ...
##  $ LocationLatitude     : num  25.7 25.6 25.7 25.6 25.8 ...
##  $ LocationLongitude    : num  -100 -100 -100 -100 -100 ...
##  $ DistributionChannel  : chr  "anonymous" "anonymous" "anonymous" "anonymous" ...
##  $ UserLanguage         : chr  "EN" "EN" "EN" "EN" ...
##  $ Q2                   : int  1 1 1 1 1 1 2 1 1 2 ...
##  $ Q3_1                 : int  1 1 1 NA 1 1 2 2 2 1 ...
##  $ Q3_2                 : int  2 2 2 NA 3 2 1 3 3 2 ...
##  $ Q3_3                 : int  3 3 3 NA 2 3 3 1 1 3 ...
##  $ Q4_1                 : int  1 1 1 NA 1 1 1 1 NA 1 ...
##  $ Q4_2                 : int  NA 1 1 1 1 1 NA 1 1 1 ...
##  $ Q4_3                 : int  1 1 1 1 1 1 1 1 NA 1 ...
##  $ Q4_4                 : int  NA 1 NA 1 1 1 1 NA NA NA ...
##  $ Q4_5                 : int  NA 1 NA 1 NA NA 1 NA NA NA ...
##  $ Q4_6                 : int  1 1 NA NA 1 1 NA NA NA 1 ...
##  $ Q4_7                 : int  NA 1 1 NA 1 1 1 1 1 1 ...
##  $ Q4_8                 : int  1 1 1 1 NA 1 1 NA NA 1 ...
##  $ Q4_9                 : int  NA 1 NA 1 NA 1 1 NA NA 1 ...
##  $ Q4_10                : int  NA 1 1 NA 1 1 1 1 1 1 ...
##  $ Q4_11                : int  NA 1 1 1 NA NA NA NA NA NA ...
##  $ Q4_12                : int  1 1 1 NA NA 1 1 NA NA NA ...
##  $ Q6_1                 : int  4 7 7 5 7 7 5 5 5 5 ...
##  $ Q6_2                 : int  5 6 5 7 5 7 7 5 5 5 ...
##  $ Q6_3                 : int  7 6 5 6 7 7 7 5 5 6 ...
##  $ Q6_4                 : int  4 5 6 5 5 7 7 5 5 7 ...
##  $ Q6_5                 : int  6 5 7 6 6 7 7 4 4 6 ...
##  $ Q6_6                 : int  7 4 7 5 7 7 5 4 3 7 ...
##  $ Q6_7                 : int  7 6 6 7 7 4 4 2 4 5 ...
##  $ Q6_8                 : int  7 7 7 5 7 7 7 7 4 7 ...
##  $ Q6_9                 : int  5 6 7 6 6 7 3 5 4 4 ...
##  $ Q6_10                : int  6 6 7 5 7 7 3 6 4 2 ...
##  $ Q6_11                : int  4 6 1 5 3 7 1 1 4 1 ...
##  $ Q6_12                : int  4 6 3 5 7 7 7 2 4 6 ...
##  $ Q6_13                : int  5 6 7 6 5 7 3 3 4 2 ...
##  $ Q6_14                : int  4 5 4 6 5 4 1 3 4 3 ...
##  $ Q6_15                : int  5 6 5 3 3 2 1 2 4 1 ...
##  $ Q6_16                : int  7 5 7 7 7 7 4 5 4 4 ...
##  $ Q6_17                : int  3 6 7 4 5 7 4 6 4 4 ...
##  $ Q6_18                : int  4 6 4 6 4 2 1 1 4 3 ...
##  $ Q7                   : int  3 4 3 4 2 4 2 20 0 0 ...
##  $ Q10                  : int  1 4 4 4 1 3 1 3 2 1 ...
##  $ Q9                   : int  2 1 3 1 3 1 3 1 2 2 ...
##  $ Q12                  : int  19 22 21 22 21 56 36 23 21 22 ...
##  $ Q12_1                : int  1 1 1 1 1 4 2 1 1 1 ...
##  $ Q11                  : int  2 1 2 2 2 2 2 2 1 1 ...
##  $ Q13                  : int  1 1 1 1 1 1 1 1 1 1 ...
##  $ X                    : logi  NA NA NA NA NA NA ...

Estadística Descriptiva

Gráfica 1 - Cantidad de personas que han escuchado del turismo responsable

En este contexto, la variable “Q2” mide la cantidad de personas que han escuchado del turismo responsable vs. las que no.

turismo <- turismo %>%
  mutate(Q2 = ifelse(Q2 == 1, "Si", Q2))

turismo <- turismo %>%
  mutate(Q2 = ifelse(Q2 == 2, "No", Q2))

ggplot(turismo, aes(x = Q2, fill = Q2)) +
  geom_bar() +
  labs(title = "¿Ha oído hablar del turismo responsable y/o sostenible?",
       x = "Respuestas",
       y = "Frecuencia") +
  scale_fill_manual(values = c("No" = "lightsalmon2", "Si" = "indianred3"))

Como se puede observar en la gráfica, la mayor cantidad de las personas encuestadas sí ha escuchado hablar sobre el turismo responsable y/o sostenible.

Gráfica 2 - Sexo de los participantes

A continuación se muestra la variable “Q2”, la cual engloba los dos sexos de las personas que realizaron la encuesta, ilustrados en distintos colores.

turismo <- turismo %>%
  mutate(Q2 = ifelse(Q2 == 1, "Hombre", Q11))

turismo <- turismo %>%
  mutate(Q2 = ifelse(Q2 == 2, "Mujer", Q11))

ggplot(turismo, aes(x = Q2, fill = Q2)) +
  geom_bar() +
  labs(title = "Sexo de los participantes de la encuesta",
       x = "Respuestas",
       y = "Frecuencia") +
  scale_fill_manual(values = c ("Hombre" = "lightblue1", "Mujer" = "peachpuff2"))

También como se puede observar, la mayor parte de los encuestados son mujeres. También se percibe que en la base de datos algún componente impide que la asignación de “1” a “hombre” sea leída como “hombre”, pues solo se refleja como 1.

Gráfica 3 - Conocimientos de turismo responsable contrastado con sexo de las personas

Para esta gráfica se utiliza la variable “Q11”, que nuevamente hace referencia al sexo de las personas, y “Q2”, que ejemplica el conocimiento sobre el turismo responsable.

ggplot(data = turismo, aes(x = Q12, y = Q2)) +
  geom_boxplot(fill = "#76EEC6", color = "black") +
  labs(title = "Comparación de sexo por consciencia de turismo sustentable",
       x = "Si saben de turismo responsable",
       y = "Sexo")
## Warning: Removed 2 rows containing non-finite values (`stat_boxplot()`).

Parece haber una mayor correlación entre mujeres y el conocimiento sobre el turismo responsable, aunque también es posible que esto se encuentre biased por el hecho de la mayoría de encuestadas fueron mujeres.

Gráfica 4 - Cantidad de personas en el país donde se contestó la encuesta

Para esto se utiliza la variabale “Q3”, que engloba los dos países encuestados, México y España.

turismo <- turismo[!is.na(turismo$Q13), ]
turismo <- turismo %>%
  mutate(Q13 = ifelse(Q13 == 1, "México", Q13))

turismo <- turismo %>%
  mutate(Q13 = ifelse(Q13 == 2, "España", Q13))

ggplot(turismo, aes(x = Q13, fill = Q13)) +
  geom_bar() +
  labs(title = "País en el que realiza la encuesta",
       x = "Respuestas",
       y = "Frecuencia") +
  scale_fill_manual(values = c("México" = "pink", "España" = "cornsilk1"))

Podemos concluir que la mayoría de las personas encuestadas lo fueron en el país de México por una diferencia de poco más de 100 personas.

Gráfica 5 - Viajes en el último año

Para conocer esto se utiliza la variabale “Q7”, la cual contiene la cantidad de viajes al año que proporcionaron los encuestados.

ggplot(data = turismo, aes(x = Q7)) +
  geom_histogram(binwidth = 1, fill = "lightgoldenrod1", color = "black") +
  labs(title = "Distribución de la Cantidad de Viajes en el Último Año",
       x = "Cantidad de Viajes",
       y = "Frecuencia")
## Warning: Removed 12 rows containing non-finite values (`stat_bin()`).

Se puede observar que hay una concentración mucho mayor en la cantidad 3, con las otras dos opciones más prominentes siendo 2 y 4.

Gráfica 6 - Edad

En este histograma se aborda la edad de los encuestados por medio de la variable “Q12”, la cual contiene esta información.

ggplot(data = turismo, aes(x = Q12)) +
  geom_histogram(binwidth = 1, fill = "lavenderblush2", color = "black") +
  labs(title = "Distribución de Edad",
       x = "Edad",
       y = "Frecuencia")
## Warning: Removed 2 rows containing non-finite values (`stat_bin()`).

Podemos concluir que la mayoría de encuestados tiene menos de 25 años, con la mayoría siendo teniendo entre 20, 21, y 22 años.

Gráfica 7 - Edad por país

A continuación se explora la relación entre la edad y los encuestados por país, lo cual se realiza mediante la variaba “Q13”, centrada en la localidad, y “Q12”, centrada en la edad.

ggplot(data = turismo, aes(x = Q13, y = Q12)) +
  geom_boxplot(fill = "paleturquoise1", color = "black") +
  labs(title = "Comparación de Edad por País",
       x = "País",
       y = "Edad")
## Warning: Removed 2 rows containing non-finite values (`stat_boxplot()`).

Podemos concluir que en España los encuestados tienen un rango de 20-52 años de edad y quienes están en México un rango de 20-60 años, siendo probable que personas de mayor edad viajen más a México.

Gráfica 8 - Importancia de la sostenibilidad

A continuación se analiza en una escala del 1 al 7 cuánta importancia le dan a la sostenibilidad, llevado a cabo mediante la variable “Q6_1”, la cual mide esto.

ggplot(data = turismo, aes(x = Q6_1)) +
  geom_histogram(binwidth = 1, fill = "#FFC1C1", color = "violetred4") +
  labs(title = "Importancia de la sostenibilidad",
       x = " 
         En la escala de 1 al 7 soy una persona preocupada por la sostenibilidad económica, sociocultural y medioambiental.",
       y = "Frecuencia")

Podemos observar que la mayor parte de las personas le da importancia a un nivel medio, inclinado hacia el cuartil superior.

Gráfica 9 - Edad vs. esfuerzo en no causar impacto negativo

Esta gráfica de dispersión se centra en la relación entre la edad de las personas (Variable Q12) y la importancia que le dan a no causar un impacto negativo ambiental o social con su presencia (Q6_6).

ggplot(turismo, aes(x = Q12, y = Q6_6)) +
  geom_point(color = "#EED5D2", size = 3, alpha = 0.7) +
  labs(x = "Edad", y = "Mi impacto") +
  ggtitle("Comparación de Edad vs. Mi impacto") +
  theme_minimal() +
  theme(plot.title = element_text(hjust = 0.5, size = 16, face = "bold"),
        axis.title = element_text(size = 14),
        axis.text = element_text(size = 12))
## Warning: Removed 2 rows containing missing values (`geom_point()`).

Podemos observar que la mayoría de las personas, su edad indistinta, se encuentran en los tres niveles superiores de preocupación por evitar el daño. Otro dato interesante podría ser cómo los niveles inferiores de preoupación parecen estar centrados en personas menores de 25 años o entre 50 y 75 años.

Gráfica 10 - Planificación de los viajes

En esta gráfica se muestra por país (Q13), quiénes planifican los viajes que realizan los encuestados (Q9).

ggplot(turismo, aes(x = factor(Q13), fill = factor(Q9))) +
  geom_bar() +
  labs(x = "País", y = "Recuento", fill = "Quién organiza y planifica los viajes") +
  ggtitle("Comparación de País con Organización de Viajes") +
  scale_x_discrete(labels = c("1" = "México", "2" = "España")) +
  scale_fill_manual(values = c("1" = "violet", "2" = "pink", "3" = "beige"),
                    labels = c("1" = "Principalmente yo", "2" = "Principalmente otras personas", "3" = "Tanto yo como otras personas")) +
  theme_minimal() +
  theme(plot.title = element_text(hjust = 0.5, size = 16, face = "bold"),
        axis.title = element_text(size = 14),
        axis.text = element_text(size = 12))

Como se puede observar, en los dos países es más presente que las mismas personas lo organicen, en México siendo casi igual la proporción de “tanto yo como otras personas”.

Gráfica 11 - Promedio de viajes

En esta gráfica se observa el promedio de viajes anuales (variable Q7) en relación con los dos países disponibles (Q13).

ggplot(turismo, aes(x = factor(Q13), y = Q7)) +
  geom_bar(stat = "summary", fun = "mean", position = "dodge", fill = c("#EED5D2", "#FFA07A")) +
  labs(x = "País", y = "Promedio de Viaje") +
  ggtitle("Promedio de Viaje Comparado entre Españoles y Mexicanos") +
  scale_x_discrete(labels = c("1" = "México", "2" = "España")) +
  theme_minimal() +
  theme(plot.title = element_text(hjust = 0.5, size = 16, face = "bold"),
        axis.title = element_text(size = 14),
        axis.text = element_text(size = 12))
## Warning: Removed 12 rows containing non-finite values (`stat_summary()`).

Se puede observar que el promedio es bastante similar, con México siendo ligeramente superior.

Conclusión del Análisis Descriptivo

Como conclusión general, se puede llegar a lo siguiente: Existen factores que inevitable causarán cierto sesgo en los resultados, como la diferencia entre nacionalidades y sexos encuestados. Sin embargo, hay varios puntos rescatables. La preocupación por el medioambiente parece ser moderada, lo cual tiene sentido en relación a la cantidad de personas que conocen sobre el turismo responsable, que también parece ser moderado en relación con las personas que no, y parece estar inclinado hacia la población femenina. Las personas, sin distinción de edad, parecen preocupadas por su impacto socioambiental. También existe una marcada concentración de encuestados pertenecientes a una población joven y mexicana, los cuales realizan entre 2 y 3 viajes al año. Tomando en cuenta la comparación entre los diversos resultados y el hecho de que la preocupación por la sostenibilidad se encuentra en un término moderado-alto (debido a que la escala era de 7 y la respuesta mayor es 5), se podría especular sobre la posibilidad de que este número aumentase de manera importante si igualmente se incrementara la conciencia sobre el turismo consciente -quizá orientado a la población masculina-, ya que los resultados sobre el interés fueron favorables a pesar de la gran cantidad de personas que no conocían de este término en específico. Otro tema de relevancia es que la edad joven y madura parece ser donde se encuentra la concentración de personas que se preocupan menos por su impacto. Así mismo, en promedio en los dos países se viaja lo mismo, con México ligeramente a la delantera, y en ambos casos lo más común es que la persona planifique su viaje.

Hipótesis

Base_de_Datos_SP <- read.csv("/Users/araquezada/Documents/Tec/7mo Semestre/Analítica para Negocios/Modulo 3/Base de Datos Turismo Responsable 2.csv")
bd <- Base_de_Datos_SP %>% select(starts_with("Q"))
na_values <- colSums(is.na(bd))
print(na_values)
##    Q2  Q3_1  Q3_2  Q3_3  Q4_1  Q4_2  Q4_3  Q4_4  Q4_5  Q4_6  Q4_7  Q4_8  Q4_9 
##     0    79    79    79   115   233   398   561   562   433   328   454   501 
## Q4_10 Q4_11 Q4_12  Q6_1  Q6_2  Q6_3  Q6_4  Q6_5  Q6_6  Q6_7  Q6_8  Q6_9 Q6_10 
##   445   697   393     0     0     0     0     0     0     0     0     0     0 
## Q6_11 Q6_12 Q6_13 Q6_14 Q6_15 Q6_16 Q6_17 Q6_18    Q7   Q10    Q9   Q12 Q12_1 
##     0     0     0     0     0     0     0     0    12    13    11     2     0 
##   Q11   Q13 
##     0     2
bd_mex <- bd[bd$Q13 == 1 ,]
bd_esp <- bd[bd$Q13 == 2 ,]

Hipótesis 1

Q9 Hipótesis nula: La proporción de turistas Españoles que reservan su viaje ellos mismos es igual a 86.6%

Hipótesis alternativa: La proporción de tursitas Españoles que reservan su viaje ellos mismos es diferente a 86.6%

Prueba de Proporciones

Regla nPi >=5, n(1-PI)>=5 3190.866, 3910.134 Cumple la regla
bd_espfilt <- bd_esp %>%
  filter (Q9 !="")
prop_obs <- sum(bd_espfilt$Q9 == "1") /length(bd_espfilt$Q9)
prop_esp <- 0.866
resultado_prueba <- prop.test(x=sum(bd_espfilt$Q9 == "1"), n = length(bd_espfilt$Q9), p =prop_esp, alternative = "two.sided")
print(resultado_prueba)
## 
##  1-sample proportions test with continuity correction
## 
## data:  sum(bd_espfilt$Q9 == "1") out of length(bd_espfilt$Q9), null probability prop_esp
## X-squared = 579.16, df = 1, p-value < 2.2e-16
## alternative hypothesis: true p is not equal to 0.866
## 95 percent confidence interval:
##  0.4002848 0.5009664
## sample estimates:
##         p 
## 0.4501279

Como la probabilidad de equivocarse al rechazar Ho es pequeña (2.2e-16), Rechazo Ho. Con una confianza del 95%, los Españoles que reservan por ellos mismos es estadisticamente diferente al 86.6%

Hipótesis 2

Q6_4 Hipótesis nula: la proporción de turistas mexicanos que fomento el desarrollo local del destino consumiendo productos y servicios locales es mayor o igual al 50%.

Hipótesis alterna: la proporción de turistas mexicanos que fomento el desarrollo local del destino consumiendo productos y servicios locales es menor al 50%.

Prueba de Proporciones

summary(bd$Q6_4)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##   1.000   4.000   5.000   4.994   6.000   7.000
n <- length(bd$Q6_4)
prop_obs <- mean(bd$Q6_4)
prop_expected <- 0.5
prop_test_result <- prop.test(x = sum(bd$Q6_4 <= 3), n = n, p = prop_expected, alternative = "less")
print(prop_test_result)
## 
##  1-sample proportions test with continuity correction
## 
## data:  sum(bd$Q6_4 <= 3) out of n, null probability prop_expected
## X-squared = 395.36, df = 1, p-value < 2.2e-16
## alternative hypothesis: true p is less than 0.5
## 95 percent confidence interval:
##  0.0000000 0.1962297
## sample estimates:
##         p 
## 0.1743316

Dado el valor p de 0.1731602, no contamos con evidencia suficiente para rechazar la hipótesis nula. Esto significa que no hay suficiente evidencia estadística para afirmar que la proporción de turistas mexicanos que fomentan el desarrollo local del destino consumiendo productos y servicios locales es menor al 50%.

Hipótesis 3

Q6_11

Hipótesis nula: la proporción de turistas españoles que afirman que compensarían la huella de carbono en su alojamiento vacacional es igual al 55%.

Hipótesis alterna: la proporción de turistas españoles que afirman que compensarían la huella de carbono en su alojamiento vacacional es diferente al 55%

Prueba de Proporciones

summary(bd$Q6_11)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##   1.000   1.000   2.000   2.718   4.000   7.000
n <- length(bd$Q6_11)
prop_obs <- mean(bd$Q6_11)
prop_expected <- 0.55
prop_test_result <- prop.test(x = sum(bd$Q6_11 == 1), n = n, p = prop_expected, alternative = "two.sided")
print(prop_test_result)
## 
##  1-sample proportions test with continuity correction
## 
## data:  sum(bd$Q6_11 == 1) out of n, null probability prop_expected
## X-squared = 79.633, df = 1, p-value < 2.2e-16
## alternative hypothesis: true p is not equal to 0.55
## 95 percent confidence interval:
##  0.3727498 0.4366030
## sample estimates:
##         p 
## 0.4042781

Dado un valor p de 0.4069264, igual que las veces anteriores, no se cuenta con evidencia para rechazar la hipotesis nula. No se puede afirmar que la proporción de turistas españoles que afirman que compensarían la huella de carbono en su alojamiento vacacional es diferente del 55%, como se mencionaba en la hipótesis alterna.

Hipótesis 4

Q7

Hipótesis nula: la cantidad promedio de viajes que realizan los mexicanos es igual a la cantidad de viajes que realizan los españoles.

Hipótesis alterna: la cantidad promedio de viajes que realizan los mexicanos es diferente a la cantidad de viajes que realizan los españoles.

bd <- bd[!is.na(bd$Q7), ]
summary(bd$Q7)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##   0.000   2.000   3.000   3.723   4.000  70.000
LS0tCnRpdGxlOiAiQWN0aXZpZGFkIDMuMyBDYXNvIFR1cmlzbW8gUmVzcG9uc2FibGUiCmF1dGhvcjogIkVxdWlwbyA0IgpkYXRlOiAiMjAyMy0wOC0zMSIKb3V0cHV0OiAKICBodG1sX2RvY3VtZW50OgogICAgdG9jOiBUUlVFCiAgICB0b2NfZmxvYXQ6IFRSVUUKICAgIGNvZGVfZG93bmxvYWQ6IFRSVUUKLS0tCgojIyBQcm9ww7NzaXRvCkFwbGljYXIgbGFzIHTDqWNuaWNhcyBkZSBhbsOhbGlzaXMgZXN0YWTDrXN0aWNvcyBkZXNjcmlwdGl2b3MgeSBlc3RpbWFkb3JlcywgZW1wbGVhbmRvIGxvcyBncsOhZmljb3MgbmVjZXNhcmlvcyBkZXN0YWNhciBsYSBpbmZvcm1hY2nDs24gZGUgaW50ZXLDqXMgc29icmUgdW4gY29uanVudG8gZGUgZGF0b3MgeSBzb2JyZSBsYXMgcmVsYWNpb25lcyBxdWUgZ3VhcmRhbiBlbnRyZSBzw60sIGNvbiBsYSBheXVkYSBkZSBzb2Z0d2FyZSBlc3RhZMOtc3RpY28uCgotLS0KCmBgYHtyfQpsaWJyYXJ5KHRpZHl2ZXJzZSkKbGlicmFyeShkcGx5cikKbGlicmFyeShnZ3Bsb3QyKQp0dXJpc21vIDwtIHJlYWQuY3N2KCIvVXNlcnMvYXJhcXVlemFkYS9Eb2N1bWVudHMvVGVjLzdtbyBTZW1lc3RyZS9BbmFsacyBdGljYSBwYXJhIE5lZ29jaW9zL01vZHVsbyAzL0Jhc2UgZGUgRGF0b3MgVHVyaXNtbyBSZXNwb25zYWJsZSAyLmNzdiIpCmBgYAoKIyMgTGltcGllemEgZGUgRGF0b3MKRGViaWRvIGEgbGEgZ3JhbiBjYW50aWRhZCBkZSB2YXJpYWJsZXMgcXVlIGV4aXN0ZW4sIG5vc290cm9zIG5vcyBlbmZvY2FyZW1vcyBzb2xvIGVuIGFxdWVsbGFzIHF1ZSBlc3TDoW4gZW5mb2NhZGFzIGEgYXBvcnRhciBpbmZvcm1hY2nDs24gZGlyZWN0YW1lbnRlIHJlbGFjaW9uYWRhIGNvbiBsYSBlbmN1ZXN0YSwgZGVzZWNoYW5kbzoKCuKAnFN0YXJ0RGF0ZSwgRW5kRGF0ZSwgU3RhdHVzLCBJUEFkZHJlc3MsIFByb2dyZXNzLCBEdXJhdGlvbiwgKGluIHNlY29uZHMpLCBGaW5pc2hlZCwgUmVjb3JkZWREYXRlLCBSZXNwb25zZUlkLCBSZWNpcGllbnRMYXN0TmFtZSwgUmVjaXBpZW50Rmlyc3ROYW1lLCBSZWNpcGllbnRFbWFpbCwgRXh0ZXJuYWxSZWZlcmVuY2UsIExvY2F0aW9uTGF0aXR1ZGUsIExvY2F0aW9uTG9uZ2l0dWRlLCBEaXN0cmlidXRpb25DaGFubmVsLCB5IFVzZXJMYW5ndWFnZeKAnS4gTGFzIHZhcmlhYmxlcyB1c2FkYXMgc2Vyw6FuIGbDoWNpbG1lbnRlIGluZGVudGlmaWNhZGFzIGRlYmlkbyBhIHF1ZSB0b2RhcyBlbXBpZXphbiBjb24gUS4KYGBge3J9CnN0cih0dXJpc21vKQpgYGAKCiMjIEVzdGFkw61zdGljYSBEZXNjcmlwdGl2YQojIyMgR3LDoWZpY2EgMSAtIENhbnRpZGFkIGRlIHBlcnNvbmFzIHF1ZSBoYW4gZXNjdWNoYWRvIGRlbCB0dXJpc21vIHJlc3BvbnNhYmxlCkVuIGVzdGUgY29udGV4dG8sIGxhIHZhcmlhYmxlIOKAnFEy4oCdIG1pZGUgbGEgY2FudGlkYWQgZGUgcGVyc29uYXMgcXVlIGhhbiBlc2N1Y2hhZG8gZGVsIHR1cmlzbW8gcmVzcG9uc2FibGUgdnMuIGxhcyBxdWUgbm8uCgpgYGB7cn0KdHVyaXNtbyA8LSB0dXJpc21vICU+JQogIG11dGF0ZShRMiA9IGlmZWxzZShRMiA9PSAxLCAiU2kiLCBRMikpCgp0dXJpc21vIDwtIHR1cmlzbW8gJT4lCiAgbXV0YXRlKFEyID0gaWZlbHNlKFEyID09IDIsICJObyIsIFEyKSkKCmdncGxvdCh0dXJpc21vLCBhZXMoeCA9IFEyLCBmaWxsID0gUTIpKSArCiAgZ2VvbV9iYXIoKSArCiAgbGFicyh0aXRsZSA9ICLCv0hhIG/DrWRvIGhhYmxhciBkZWwgdHVyaXNtbyByZXNwb25zYWJsZSB5L28gc29zdGVuaWJsZT8iLAogICAgICAgeCA9ICJSZXNwdWVzdGFzIiwKICAgICAgIHkgPSAiRnJlY3VlbmNpYSIpICsKICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBjKCJObyIgPSAibGlnaHRzYWxtb24yIiwgIlNpIiA9ICJpbmRpYW5yZWQzIikpCmBgYAoKQ29tbyBzZSBwdWVkZSBvYnNlcnZhciBlbiBsYSBncsOhZmljYSwgbGEgbWF5b3IgY2FudGlkYWQgZGUgbGFzIHBlcnNvbmFzIGVuY3Vlc3RhZGFzIHPDrSBoYSBlc2N1Y2hhZG8gaGFibGFyIHNvYnJlIGVsIHR1cmlzbW8gcmVzcG9uc2FibGUgeS9vIHNvc3RlbmlibGUuCgojIyMgR3LDoWZpY2EgMiAtIFNleG8gZGUgbG9zIHBhcnRpY2lwYW50ZXMKQSBjb250aW51YWNpw7NuIHNlIG11ZXN0cmEgbGEgdmFyaWFibGUg4oCcUTLigJ0sIGxhIGN1YWwgZW5nbG9iYSBsb3MgZG9zIHNleG9zIGRlIGxhcyBwZXJzb25hcyBxdWUgcmVhbGl6YXJvbiBsYSBlbmN1ZXN0YSwgaWx1c3RyYWRvcyBlbiBkaXN0aW50b3MgY29sb3Jlcy4KCmBgYHtyfQp0dXJpc21vIDwtIHR1cmlzbW8gJT4lCiAgbXV0YXRlKFEyID0gaWZlbHNlKFEyID09IDEsICJIb21icmUiLCBRMTEpKQoKdHVyaXNtbyA8LSB0dXJpc21vICU+JQogIG11dGF0ZShRMiA9IGlmZWxzZShRMiA9PSAyLCAiTXVqZXIiLCBRMTEpKQoKZ2dwbG90KHR1cmlzbW8sIGFlcyh4ID0gUTIsIGZpbGwgPSBRMikpICsKICBnZW9tX2JhcigpICsKICBsYWJzKHRpdGxlID0gIlNleG8gZGUgbG9zIHBhcnRpY2lwYW50ZXMgZGUgbGEgZW5jdWVzdGEiLAogICAgICAgeCA9ICJSZXNwdWVzdGFzIiwKICAgICAgIHkgPSAiRnJlY3VlbmNpYSIpICsKICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBjICgiSG9tYnJlIiA9ICJsaWdodGJsdWUxIiwgIk11amVyIiA9ICJwZWFjaHB1ZmYyIikpCmBgYAoKVGFtYmnDqW4gY29tbyBzZSBwdWVkZSBvYnNlcnZhciwgbGEgbWF5b3IgcGFydGUgZGUgbG9zIGVuY3Vlc3RhZG9zIHNvbiBtdWplcmVzLiBUYW1iacOpbiBzZSBwZXJjaWJlIHF1ZSBlbiBsYSBiYXNlIGRlIGRhdG9zIGFsZ8O6biBjb21wb25lbnRlIGltcGlkZSBxdWUgbGEgYXNpZ25hY2nDs24gZGUg4oCcMeKAnSBhIOKAnGhvbWJyZeKAnSBzZWEgbGXDrWRhIGNvbW8g4oCcaG9tYnJl4oCdLCBwdWVzIHNvbG8gc2UgcmVmbGVqYSBjb21vIDEuCgojIyMgR3LDoWZpY2EgMyAtIENvbm9jaW1pZW50b3MgZGUgdHVyaXNtbyByZXNwb25zYWJsZSBjb250cmFzdGFkbyBjb24gc2V4byBkZSBsYXMgcGVyc29uYXMKUGFyYSBlc3RhIGdyw6FmaWNhIHNlIHV0aWxpemEgbGEgdmFyaWFibGUg4oCcUTEx4oCdLCBxdWUgbnVldmFtZW50ZSBoYWNlIHJlZmVyZW5jaWEgYWwgc2V4byBkZSBsYXMgcGVyc29uYXMsIHkg4oCcUTLigJ0sIHF1ZSBlamVtcGxpY2EgZWwgY29ub2NpbWllbnRvIHNvYnJlIGVsIHR1cmlzbW8gcmVzcG9uc2FibGUuCgpgYGB7cn0KZ2dwbG90KGRhdGEgPSB0dXJpc21vLCBhZXMoeCA9IFExMiwgeSA9IFEyKSkgKwogIGdlb21fYm94cGxvdChmaWxsID0gIiM3NkVFQzYiLCBjb2xvciA9ICJibGFjayIpICsKICBsYWJzKHRpdGxlID0gIkNvbXBhcmFjacOzbiBkZSBzZXhvIHBvciBjb25zY2llbmNpYSBkZSB0dXJpc21vIHN1c3RlbnRhYmxlIiwKICAgICAgIHggPSAiU2kgc2FiZW4gZGUgdHVyaXNtbyByZXNwb25zYWJsZSIsCiAgICAgICB5ID0gIlNleG8iKQpgYGAKClBhcmVjZSBoYWJlciB1bmEgbWF5b3IgY29ycmVsYWNpw7NuIGVudHJlIG11amVyZXMgeSBlbCBjb25vY2ltaWVudG8gc29icmUgZWwgdHVyaXNtbyByZXNwb25zYWJsZSwgYXVucXVlIHRhbWJpw6luIGVzIHBvc2libGUgcXVlIGVzdG8gc2UgZW5jdWVudHJlIGJpYXNlZCBwb3IgZWwgaGVjaG8gZGUgbGEgbWF5b3LDrWEgZGUgZW5jdWVzdGFkYXMgZnVlcm9uIG11amVyZXMuCgojIyMgR3LDoWZpY2EgNCAtIENhbnRpZGFkIGRlIHBlcnNvbmFzIGVuIGVsIHBhw61zIGRvbmRlIHNlIGNvbnRlc3TDsyBsYSBlbmN1ZXN0YQpQYXJhIGVzdG8gc2UgdXRpbGl6YSBsYSB2YXJpYWJhbGUg4oCcUTPigJ0sIHF1ZSBlbmdsb2JhIGxvcyBkb3MgcGHDrXNlcyBlbmN1ZXN0YWRvcywgTcOpeGljbyB5IEVzcGHDsWEuCgpgYGB7cn0KdHVyaXNtbyA8LSB0dXJpc21vWyFpcy5uYSh0dXJpc21vJFExMyksIF0KdHVyaXNtbyA8LSB0dXJpc21vICU+JQogIG11dGF0ZShRMTMgPSBpZmVsc2UoUTEzID09IDEsICJNw6l4aWNvIiwgUTEzKSkKCnR1cmlzbW8gPC0gdHVyaXNtbyAlPiUKICBtdXRhdGUoUTEzID0gaWZlbHNlKFExMyA9PSAyLCAiRXNwYcOxYSIsIFExMykpCgpnZ3Bsb3QodHVyaXNtbywgYWVzKHggPSBRMTMsIGZpbGwgPSBRMTMpKSArCiAgZ2VvbV9iYXIoKSArCiAgbGFicyh0aXRsZSA9ICJQYcOtcyBlbiBlbCBxdWUgcmVhbGl6YSBsYSBlbmN1ZXN0YSIsCiAgICAgICB4ID0gIlJlc3B1ZXN0YXMiLAogICAgICAgeSA9ICJGcmVjdWVuY2lhIikgKwogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IGMoIk3DqXhpY28iID0gInBpbmsiLCAiRXNwYcOxYSIgPSAiY29ybnNpbGsxIikpCmBgYAoKUG9kZW1vcyBjb25jbHVpciBxdWUgbGEgbWF5b3LDrWEgZGUgbGFzIHBlcnNvbmFzIGVuY3Vlc3RhZGFzIGxvIGZ1ZXJvbiBlbiBlbCBwYcOtcyBkZSBNw6l4aWNvIHBvciB1bmEgZGlmZXJlbmNpYSBkZSBwb2NvIG3DoXMgZGUgMTAwIHBlcnNvbmFzLgoKIyMjIEdyw6FmaWNhIDUgLSBWaWFqZXMgZW4gZWwgw7psdGltbyBhw7FvClBhcmEgY29ub2NlciBlc3RvIHNlIHV0aWxpemEgbGEgdmFyaWFiYWxlIOKAnFE34oCdLCBsYSBjdWFsIGNvbnRpZW5lIGxhIGNhbnRpZGFkIGRlIHZpYWplcyBhbCBhw7FvIHF1ZSBwcm9wb3JjaW9uYXJvbiBsb3MgZW5jdWVzdGFkb3MuCgpgYGB7cn0KZ2dwbG90KGRhdGEgPSB0dXJpc21vLCBhZXMoeCA9IFE3KSkgKwogIGdlb21faGlzdG9ncmFtKGJpbndpZHRoID0gMSwgZmlsbCA9ICJsaWdodGdvbGRlbnJvZDEiLCBjb2xvciA9ICJibGFjayIpICsKICBsYWJzKHRpdGxlID0gIkRpc3RyaWJ1Y2nDs24gZGUgbGEgQ2FudGlkYWQgZGUgVmlhamVzIGVuIGVsIMOabHRpbW8gQcOxbyIsCiAgICAgICB4ID0gIkNhbnRpZGFkIGRlIFZpYWplcyIsCiAgICAgICB5ID0gIkZyZWN1ZW5jaWEiKQpgYGAKClNlIHB1ZWRlIG9ic2VydmFyIHF1ZSBoYXkgdW5hIGNvbmNlbnRyYWNpw7NuIG11Y2hvIG1heW9yIGVuIGxhIGNhbnRpZGFkIDMsIGNvbiBsYXMgb3RyYXMgZG9zIG9wY2lvbmVzIG3DoXMgcHJvbWluZW50ZXMgc2llbmRvIDIgeSA0LgoKIyMjIEdyw6FmaWNhIDYgLSBFZGFkCkVuIGVzdGUgaGlzdG9ncmFtYSBzZSBhYm9yZGEgbGEgZWRhZCBkZSBsb3MgZW5jdWVzdGFkb3MgcG9yIG1lZGlvIGRlIGxhIHZhcmlhYmxlIOKAnFExMuKAnSwgbGEgY3VhbCBjb250aWVuZSBlc3RhIGluZm9ybWFjacOzbi4KCmBgYHtyfQpnZ3Bsb3QoZGF0YSA9IHR1cmlzbW8sIGFlcyh4ID0gUTEyKSkgKwogIGdlb21faGlzdG9ncmFtKGJpbndpZHRoID0gMSwgZmlsbCA9ICJsYXZlbmRlcmJsdXNoMiIsIGNvbG9yID0gImJsYWNrIikgKwogIGxhYnModGl0bGUgPSAiRGlzdHJpYnVjacOzbiBkZSBFZGFkIiwKICAgICAgIHggPSAiRWRhZCIsCiAgICAgICB5ID0gIkZyZWN1ZW5jaWEiKQpgYGAKClBvZGVtb3MgY29uY2x1aXIgcXVlIGxhIG1heW9yw61hIGRlIGVuY3Vlc3RhZG9zIHRpZW5lIG1lbm9zIGRlIDI1IGHDsW9zLCBjb24gbGEgbWF5b3LDrWEgc2llbmRvIHRlbmllbmRvIGVudHJlIDIwLCAyMSwgeSAyMiBhw7Fvcy4KCiMjIyBHcsOhZmljYSA3IC0gRWRhZCBwb3IgcGHDrXMKQSBjb250aW51YWNpw7NuIHNlIGV4cGxvcmEgbGEgcmVsYWNpw7NuIGVudHJlIGxhIGVkYWQgeSBsb3MgZW5jdWVzdGFkb3MgcG9yIHBhw61zLCBsbyBjdWFsIHNlIHJlYWxpemEgbWVkaWFudGUgbGEgdmFyaWFiYSDigJxRMTPigJ0sIGNlbnRyYWRhIGVuIGxhIGxvY2FsaWRhZCwgeSDigJxRMTLigJ0sIGNlbnRyYWRhIGVuIGxhIGVkYWQuCgpgYGB7cn0KZ2dwbG90KGRhdGEgPSB0dXJpc21vLCBhZXMoeCA9IFExMywgeSA9IFExMikpICsKICBnZW9tX2JveHBsb3QoZmlsbCA9ICJwYWxldHVycXVvaXNlMSIsIGNvbG9yID0gImJsYWNrIikgKwogIGxhYnModGl0bGUgPSAiQ29tcGFyYWNpw7NuIGRlIEVkYWQgcG9yIFBhw61zIiwKICAgICAgIHggPSAiUGHDrXMiLAogICAgICAgeSA9ICJFZGFkIikKYGBgCgpQb2RlbW9zIGNvbmNsdWlyIHF1ZSBlbiBFc3Bhw7FhIGxvcyBlbmN1ZXN0YWRvcyB0aWVuZW4gdW4gcmFuZ28gZGUgMjAtNTIgYcOxb3MgZGUgZWRhZCB5IHF1aWVuZXMgZXN0w6FuIGVuIE3DqXhpY28gdW4gcmFuZ28gZGUgMjAtNjAgYcOxb3MsIHNpZW5kbyBwcm9iYWJsZSBxdWUgcGVyc29uYXMgZGUgbWF5b3IgZWRhZCB2aWFqZW4gbcOhcyBhIE3DqXhpY28uCgojIyMgR3LDoWZpY2EgOCAtIEltcG9ydGFuY2lhIGRlIGxhIHNvc3RlbmliaWxpZGFkCkEgY29udGludWFjacOzbiBzZSBhbmFsaXphIGVuIHVuYSBlc2NhbGEgZGVsIDEgYWwgNyBjdcOhbnRhIGltcG9ydGFuY2lhIGxlIGRhbiBhIGxhIHNvc3RlbmliaWxpZGFkLCBsbGV2YWRvIGEgY2FibyBtZWRpYW50ZSBsYSB2YXJpYWJsZSDigJxRNl8x4oCdLCBsYSBjdWFsIG1pZGUgZXN0by4KCmBgYHtyfQpnZ3Bsb3QoZGF0YSA9IHR1cmlzbW8sIGFlcyh4ID0gUTZfMSkpICsKICBnZW9tX2hpc3RvZ3JhbShiaW53aWR0aCA9IDEsIGZpbGwgPSAiI0ZGQzFDMSIsIGNvbG9yID0gInZpb2xldHJlZDQiKSArCiAgbGFicyh0aXRsZSA9ICJJbXBvcnRhbmNpYSBkZSBsYSBzb3N0ZW5pYmlsaWRhZCIsCiAgICAgICB4ID0gIiAKICAgICAgICAgRW4gbGEgZXNjYWxhIGRlIDEgYWwgNyBzb3kgdW5hIHBlcnNvbmEgcHJlb2N1cGFkYSBwb3IgbGEgc29zdGVuaWJpbGlkYWQgZWNvbsOzbWljYSwgc29jaW9jdWx0dXJhbCB5IG1lZGlvYW1iaWVudGFsLiIsCiAgICAgICB5ID0gIkZyZWN1ZW5jaWEiKQpgYGAKClBvZGVtb3Mgb2JzZXJ2YXIgcXVlIGxhIG1heW9yIHBhcnRlIGRlIGxhcyBwZXJzb25hcyBsZSBkYSBpbXBvcnRhbmNpYSBhIHVuIG5pdmVsIG1lZGlvLCBpbmNsaW5hZG8gaGFjaWEgZWwgY3VhcnRpbCBzdXBlcmlvci4KCiMjIyBHcsOhZmljYSA5IC0gRWRhZCB2cy4gZXNmdWVyem8gZW4gbm8gY2F1c2FyIGltcGFjdG8gbmVnYXRpdm8KRXN0YSBncsOhZmljYSBkZSBkaXNwZXJzacOzbiBzZSBjZW50cmEgZW4gbGEgcmVsYWNpw7NuIGVudHJlIGxhIGVkYWQgZGUgbGFzIHBlcnNvbmFzIChWYXJpYWJsZSBRMTIpIHkgbGEgaW1wb3J0YW5jaWEgcXVlIGxlIGRhbiBhIG5vIGNhdXNhciB1biBpbXBhY3RvIG5lZ2F0aXZvIGFtYmllbnRhbCBvIHNvY2lhbCBjb24gc3UgcHJlc2VuY2lhIChRNl82KS4KCmBgYHtyfQpnZ3Bsb3QodHVyaXNtbywgYWVzKHggPSBRMTIsIHkgPSBRNl82KSkgKwogIGdlb21fcG9pbnQoY29sb3IgPSAiI0VFRDVEMiIsIHNpemUgPSAzLCBhbHBoYSA9IDAuNykgKwogIGxhYnMoeCA9ICJFZGFkIiwgeSA9ICJNaSBpbXBhY3RvIikgKwogIGdndGl0bGUoIkNvbXBhcmFjacOzbiBkZSBFZGFkIHZzLiBNaSBpbXBhY3RvIikgKwogIHRoZW1lX21pbmltYWwoKSArCiAgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSwgc2l6ZSA9IDE2LCBmYWNlID0gImJvbGQiKSwKICAgICAgICBheGlzLnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNCksCiAgICAgICAgYXhpcy50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMikpCmBgYAoKUG9kZW1vcyBvYnNlcnZhciBxdWUgbGEgbWF5b3LDrWEgZGUgbGFzIHBlcnNvbmFzLCBzdSBlZGFkIGluZGlzdGludGEsIHNlIGVuY3VlbnRyYW4gZW4gbG9zIHRyZXMgbml2ZWxlcyBzdXBlcmlvcmVzIGRlIHByZW9jdXBhY2nDs24gcG9yIGV2aXRhciBlbCBkYcOxby4gT3RybyBkYXRvIGludGVyZXNhbnRlIHBvZHLDrWEgc2VyIGPDs21vIGxvcyBuaXZlbGVzIGluZmVyaW9yZXMgZGUgcHJlb3VwYWNpw7NuIHBhcmVjZW4gZXN0YXIgY2VudHJhZG9zIGVuIHBlcnNvbmFzIG1lbm9yZXMgZGUgMjUgYcOxb3MgbyBlbnRyZSA1MCB5IDc1IGHDsW9zLgoKIyMjIEdyw6FmaWNhIDEwIC0gUGxhbmlmaWNhY2nDs24gZGUgbG9zIHZpYWplcwpFbiBlc3RhIGdyw6FmaWNhIHNlIG11ZXN0cmEgcG9yIHBhw61zIChRMTMpLCBxdWnDqW5lcyBwbGFuaWZpY2FuIGxvcyB2aWFqZXMgcXVlIHJlYWxpemFuIGxvcyBlbmN1ZXN0YWRvcyAoUTkpLgpgYGB7cn0KZ2dwbG90KHR1cmlzbW8sIGFlcyh4ID0gZmFjdG9yKFExMyksIGZpbGwgPSBmYWN0b3IoUTkpKSkgKwogIGdlb21fYmFyKCkgKwogIGxhYnMoeCA9ICJQYcOtcyIsIHkgPSAiUmVjdWVudG8iLCBmaWxsID0gIlF1acOpbiBvcmdhbml6YSB5IHBsYW5pZmljYSBsb3MgdmlhamVzIikgKwogIGdndGl0bGUoIkNvbXBhcmFjacOzbiBkZSBQYcOtcyBjb24gT3JnYW5pemFjacOzbiBkZSBWaWFqZXMiKSArCiAgc2NhbGVfeF9kaXNjcmV0ZShsYWJlbHMgPSBjKCIxIiA9ICJNw6l4aWNvIiwgIjIiID0gIkVzcGHDsWEiKSkgKwogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IGMoIjEiID0gInZpb2xldCIsICIyIiA9ICJwaW5rIiwgIjMiID0gImJlaWdlIiksCiAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYygiMSIgPSAiUHJpbmNpcGFsbWVudGUgeW8iLCAiMiIgPSAiUHJpbmNpcGFsbWVudGUgb3RyYXMgcGVyc29uYXMiLCAiMyIgPSAiVGFudG8geW8gY29tbyBvdHJhcyBwZXJzb25hcyIpKSArCiAgdGhlbWVfbWluaW1hbCgpICsKICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41LCBzaXplID0gMTYsIGZhY2UgPSAiYm9sZCIpLAogICAgICAgIGF4aXMudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE0KSwKICAgICAgICBheGlzLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEyKSkKYGBgCgpDb21vIHNlIHB1ZWRlIG9ic2VydmFyLCBlbiBsb3MgZG9zIHBhw61zZXMgZXMgbcOhcyBwcmVzZW50ZSBxdWUgbGFzIG1pc21hcyBwZXJzb25hcyBsbyBvcmdhbmljZW4sIGVuIE3DqXhpY28gc2llbmRvIGNhc2kgaWd1YWwgbGEgcHJvcG9yY2nDs24gZGUg4oCcdGFudG8geW8gY29tbyBvdHJhcyBwZXJzb25hc+KAnS4KCiMjIyBHcsOhZmljYSAxMSAtIFByb21lZGlvIGRlIHZpYWplcwpFbiBlc3RhIGdyw6FmaWNhIHNlIG9ic2VydmEgZWwgcHJvbWVkaW8gZGUgdmlhamVzIGFudWFsZXMgKHZhcmlhYmxlIFE3KSBlbiByZWxhY2nDs24gY29uIGxvcyBkb3MgcGHDrXNlcyBkaXNwb25pYmxlcyAoUTEzKS4KCmBgYHtyfQpnZ3Bsb3QodHVyaXNtbywgYWVzKHggPSBmYWN0b3IoUTEzKSwgeSA9IFE3KSkgKwogIGdlb21fYmFyKHN0YXQgPSAic3VtbWFyeSIsIGZ1biA9ICJtZWFuIiwgcG9zaXRpb24gPSAiZG9kZ2UiLCBmaWxsID0gYygiI0VFRDVEMiIsICIjRkZBMDdBIikpICsKICBsYWJzKHggPSAiUGHDrXMiLCB5ID0gIlByb21lZGlvIGRlIFZpYWplIikgKwogIGdndGl0bGUoIlByb21lZGlvIGRlIFZpYWplIENvbXBhcmFkbyBlbnRyZSBFc3Bhw7FvbGVzIHkgTWV4aWNhbm9zIikgKwogIHNjYWxlX3hfZGlzY3JldGUobGFiZWxzID0gYygiMSIgPSAiTcOpeGljbyIsICIyIiA9ICJFc3Bhw7FhIikpICsKICB0aGVtZV9taW5pbWFsKCkgKwogIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUsIHNpemUgPSAxNiwgZmFjZSA9ICJib2xkIiksCiAgICAgICAgYXhpcy50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTQpLAogICAgICAgIGF4aXMudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTIpKQpgYGAKClNlIHB1ZWRlIG9ic2VydmFyIHF1ZSBlbCBwcm9tZWRpbyBlcyBiYXN0YW50ZSBzaW1pbGFyLCBjb24gTcOpeGljbyBzaWVuZG8gbGlnZXJhbWVudGUgc3VwZXJpb3IuCgojIyBDb25jbHVzacOzbiBkZWwgQW7DoWxpc2lzIERlc2NyaXB0aXZvCkNvbW8gY29uY2x1c2nDs24gZ2VuZXJhbCwgc2UgcHVlZGUgbGxlZ2FyIGEgbG8gc2lndWllbnRlOiBFeGlzdGVuIGZhY3RvcmVzIHF1ZSBpbmV2aXRhYmxlIGNhdXNhcsOhbiBjaWVydG8gc2VzZ28gZW4gbG9zIHJlc3VsdGFkb3MsIGNvbW8gbGEgZGlmZXJlbmNpYSBlbnRyZSBuYWNpb25hbGlkYWRlcyB5IHNleG9zIGVuY3Vlc3RhZG9zLiBTaW4gZW1iYXJnbywgaGF5IHZhcmlvcyBwdW50b3MgcmVzY2F0YWJsZXMuIExhIHByZW9jdXBhY2nDs24gcG9yIGVsIG1lZGlvYW1iaWVudGUgcGFyZWNlIHNlciBtb2RlcmFkYSwgbG8gY3VhbCB0aWVuZSBzZW50aWRvIGVuIHJlbGFjacOzbiBhIGxhIGNhbnRpZGFkIGRlIHBlcnNvbmFzIHF1ZSBjb25vY2VuIHNvYnJlIGVsIHR1cmlzbW8gcmVzcG9uc2FibGUsIHF1ZSB0YW1iacOpbiBwYXJlY2Ugc2VyIG1vZGVyYWRvIGVuIHJlbGFjacOzbiBjb24gbGFzIHBlcnNvbmFzIHF1ZSBubywgeSBwYXJlY2UgZXN0YXIgaW5jbGluYWRvIGhhY2lhIGxhIHBvYmxhY2nDs24gZmVtZW5pbmEuIExhcyBwZXJzb25hcywgc2luIGRpc3RpbmNpw7NuIGRlIGVkYWQsIHBhcmVjZW4gcHJlb2N1cGFkYXMgcG9yIHN1IGltcGFjdG8gc29jaW9hbWJpZW50YWwuIFRhbWJpw6luIGV4aXN0ZSB1bmEgbWFyY2FkYSBjb25jZW50cmFjacOzbiBkZSBlbmN1ZXN0YWRvcyBwZXJ0ZW5lY2llbnRlcyBhIHVuYSBwb2JsYWNpw7NuIGpvdmVuIHkgbWV4aWNhbmEsIGxvcyBjdWFsZXMgcmVhbGl6YW4gZW50cmUgMiB5IDMgdmlhamVzIGFsIGHDsW8uIFRvbWFuZG8gZW4gY3VlbnRhIGxhIGNvbXBhcmFjacOzbiBlbnRyZSBsb3MgZGl2ZXJzb3MgcmVzdWx0YWRvcyB5IGVsIGhlY2hvIGRlIHF1ZSBsYSBwcmVvY3VwYWNpw7NuIHBvciBsYSBzb3N0ZW5pYmlsaWRhZCBzZSBlbmN1ZW50cmEgZW4gdW4gdMOpcm1pbm8gbW9kZXJhZG8tYWx0byAoZGViaWRvIGEgcXVlIGxhIGVzY2FsYSBlcmEgZGUgNyB5IGxhIHJlc3B1ZXN0YSBtYXlvciBlcyA1KSwgc2UgcG9kcsOtYSBlc3BlY3VsYXIgc29icmUgbGEgcG9zaWJpbGlkYWQgZGUgcXVlIGVzdGUgbsO6bWVybyBhdW1lbnRhc2UgZGUgbWFuZXJhIGltcG9ydGFudGUgc2kgaWd1YWxtZW50ZSBzZSBpbmNyZW1lbnRhcmEgbGEgY29uY2llbmNpYSBzb2JyZSBlbCB0dXJpc21vIGNvbnNjaWVudGUgLXF1aXrDoSBvcmllbnRhZG8gYSBsYSBwb2JsYWNpw7NuIG1hc2N1bGluYS0sIHlhIHF1ZSBsb3MgcmVzdWx0YWRvcyBzb2JyZSBlbCBpbnRlcsOpcyBmdWVyb24gZmF2b3JhYmxlcyBhIHBlc2FyIGRlIGxhIGdyYW4gY2FudGlkYWQgZGUgcGVyc29uYXMgcXVlIG5vIGNvbm9jw61hbiBkZSBlc3RlIHTDqXJtaW5vIGVuIGVzcGVjw61maWNvLiBPdHJvIHRlbWEgZGUgcmVsZXZhbmNpYSBlcyBxdWUgbGEgZWRhZCBqb3ZlbiB5IG1hZHVyYSBwYXJlY2Ugc2VyIGRvbmRlIHNlIGVuY3VlbnRyYSBsYSBjb25jZW50cmFjacOzbiBkZSBwZXJzb25hcyBxdWUgc2UgcHJlb2N1cGFuIG1lbm9zIHBvciBzdSBpbXBhY3RvLiBBc8OtIG1pc21vLCBlbiBwcm9tZWRpbyBlbiBsb3MgZG9zIHBhw61zZXMgc2UgdmlhamEgbG8gbWlzbW8sIGNvbiBNw6l4aWNvIGxpZ2VyYW1lbnRlIGEgbGEgZGVsYW50ZXJhLCB5IGVuIGFtYm9zIGNhc29zIGxvIG3DoXMgY29tw7puIGVzIHF1ZSBsYSBwZXJzb25hIHBsYW5pZmlxdWUgc3UgdmlhamUuCgojIyBIaXDDs3Rlc2lzIApgYGB7cn0KQmFzZV9kZV9EYXRvc19TUCA8LSByZWFkLmNzdigiL1VzZXJzL2FyYXF1ZXphZGEvRG9jdW1lbnRzL1RlYy83bW8gU2VtZXN0cmUvQW5hbGnMgXRpY2EgcGFyYSBOZWdvY2lvcy9Nb2R1bG8gMy9CYXNlIGRlIERhdG9zIFR1cmlzbW8gUmVzcG9uc2FibGUgMi5jc3YiKQpgYGAKCmBgYHtyfQpiZCA8LSBCYXNlX2RlX0RhdG9zX1NQICU+JSBzZWxlY3Qoc3RhcnRzX3dpdGgoIlEiKSkKYGBgCgpgYGB7cn0KbmFfdmFsdWVzIDwtIGNvbFN1bXMoaXMubmEoYmQpKQpwcmludChuYV92YWx1ZXMpCmBgYApgYGB7cn0KYmRfbWV4IDwtIGJkW2JkJFExMyA9PSAxICxdCmJkX2VzcCA8LSBiZFtiZCRRMTMgPT0gMiAsXQpgYGAKCiMjIyBIaXDDs3Rlc2lzIDEgClE5IApIaXDDs3Rlc2lzIG51bGE6IExhIHByb3BvcmNpw7NuIGRlIHR1cmlzdGFzIEVzcGHDsW9sZXMgcXVlIHJlc2VydmFuIHN1IHZpYWplIGVsbG9zIG1pc21vcyBlcwppZ3VhbCBhIDg2LjYlCgpIaXDDs3Rlc2lzIGFsdGVybmF0aXZhOiBMYSBwcm9wb3JjacOzbiBkZSB0dXJzaXRhcyBFc3Bhw7FvbGVzIHF1ZSByZXNlcnZhbiBzdSB2aWFqZSBlbGxvcyBtaXNtb3MKZXMgZGlmZXJlbnRlIGEgODYuNiUKCiMjIyMgUHJ1ZWJhIGRlIFByb3BvcmNpb25lcwojIyMjIyBSZWdsYSBuUGkgPj01LCBuKDEtUEkpPj01ICAgIDMxOSowLjg2NiwgMzkxKjAuMTM0IEN1bXBsZSBsYSByZWdsYQoKYGBge3J9CmJkX2VzcGZpbHQgPC0gYmRfZXNwICU+JQogIGZpbHRlciAoUTkgIT0iIikKYGBgCmBgYHtyfQpwcm9wX29icyA8LSBzdW0oYmRfZXNwZmlsdCRROSA9PSAiMSIpIC9sZW5ndGgoYmRfZXNwZmlsdCRROSkKcHJvcF9lc3AgPC0gMC44NjYKcmVzdWx0YWRvX3BydWViYSA8LSBwcm9wLnRlc3QoeD1zdW0oYmRfZXNwZmlsdCRROSA9PSAiMSIpLCBuID0gbGVuZ3RoKGJkX2VzcGZpbHQkUTkpLCBwID1wcm9wX2VzcCwgYWx0ZXJuYXRpdmUgPSAidHdvLnNpZGVkIikKcHJpbnQocmVzdWx0YWRvX3BydWViYSkKYGBgCkNvbW8gbGEgcHJvYmFiaWxpZGFkIGRlIGVxdWl2b2NhcnNlIGFsIHJlY2hhemFyIEhvIGVzIHBlcXVlw7FhICgyLjJlLTE2KSwgUmVjaGF6byBIby4gQ29uIHVuYSBjb25maWFuemEgZGVsIDk1JSwgbG9zIEVzcGHDsW9sZXMgcXVlIHJlc2VydmFuIHBvciBlbGxvcyBtaXNtb3MgZXMgZXN0YWRpc3RpY2FtZW50ZSBkaWZlcmVudGUgYWwgODYuNiUKCiMjIyBIaXDDs3Rlc2lzIDIKUTZfNApIaXDDs3Rlc2lzIG51bGE6IGxhIHByb3BvcmNpw7NuIGRlIHR1cmlzdGFzIG1leGljYW5vcyBxdWUgZm9tZW50byBlbCBkZXNhcnJvbGxvIGxvY2FsIGRlbApkZXN0aW5vIGNvbnN1bWllbmRvIHByb2R1Y3RvcyB5IHNlcnZpY2lvcyBsb2NhbGVzIGVzIG1heW9yIG8gaWd1YWwgYWwgNTAlLgoKSGlww7N0ZXNpcyBhbHRlcm5hOiBsYSBwcm9wb3JjacOzbiBkZSB0dXJpc3RhcyBtZXhpY2Fub3MgcXVlIGZvbWVudG8gZWwgZGVzYXJyb2xsbyBsb2NhbCBkZWwKZGVzdGlubyBjb25zdW1pZW5kbyBwcm9kdWN0b3MgeSBzZXJ2aWNpb3MgbG9jYWxlcyBlcyBtZW5vciBhbCA1MCUuCgojIyMjIFBydWViYSBkZSBQcm9wb3JjaW9uZXMKYGBge3J9CnN1bW1hcnkoYmQkUTZfNCkKYGBgCgpgYGB7cn0KbiA8LSBsZW5ndGgoYmQkUTZfNCkKcHJvcF9vYnMgPC0gbWVhbihiZCRRNl80KQpwcm9wX2V4cGVjdGVkIDwtIDAuNQpwcm9wX3Rlc3RfcmVzdWx0IDwtIHByb3AudGVzdCh4ID0gc3VtKGJkJFE2XzQgPD0gMyksIG4gPSBuLCBwID0gcHJvcF9leHBlY3RlZCwgYWx0ZXJuYXRpdmUgPSAibGVzcyIpCnByaW50KHByb3BfdGVzdF9yZXN1bHQpCmBgYApEYWRvIGVsIHZhbG9yIHAgZGUgMC4xNzMxNjAyLCBubyBjb250YW1vcyBjb24gZXZpZGVuY2lhIHN1ZmljaWVudGUgcGFyYSByZWNoYXphciBsYSBoaXDDs3Rlc2lzIG51bGEuIEVzdG8gc2lnbmlmaWNhIHF1ZSBubyBoYXkgc3VmaWNpZW50ZSBldmlkZW5jaWEgZXN0YWTDrXN0aWNhIHBhcmEgYWZpcm1hciBxdWUgbGEgcHJvcG9yY2nDs24gZGUgdHVyaXN0YXMgbWV4aWNhbm9zIHF1ZSBmb21lbnRhbiBlbCBkZXNhcnJvbGxvIGxvY2FsIGRlbCBkZXN0aW5vIGNvbnN1bWllbmRvIHByb2R1Y3RvcyB5IHNlcnZpY2lvcyBsb2NhbGVzIGVzIG1lbm9yIGFsIDUwJS4KCiMjIyBIaXDDs3Rlc2lzIDMKUTZfMTEKCkhpcMOzdGVzaXMgbnVsYTogbGEgcHJvcG9yY2nDs24gZGUgdHVyaXN0YXMgZXNwYcOxb2xlcyBxdWUgYWZpcm1hbiBxdWUgY29tcGVuc2Fyw61hbiBsYQpodWVsbGEgZGUgY2FyYm9ubyBlbiBzdSBhbG9qYW1pZW50byB2YWNhY2lvbmFsIGVzIGlndWFsIGFsIDU1JS4KCkhpcMOzdGVzaXMgYWx0ZXJuYTogbGEgcHJvcG9yY2nDs24gZGUgdHVyaXN0YXMgZXNwYcOxb2xlcyBxdWUgYWZpcm1hbiBxdWUgY29tcGVuc2Fyw61hbiBsYQpodWVsbGEgZGUgY2FyYm9ubyBlbiBzdSBhbG9qYW1pZW50byB2YWNhY2lvbmFsIGVzIGRpZmVyZW50ZSBhbCA1NSUKCiMjIyMgUHJ1ZWJhIGRlIFByb3BvcmNpb25lcwpgYGB7cn0Kc3VtbWFyeShiZCRRNl8xMSkKYGBgCgpgYGB7cn0KbiA8LSBsZW5ndGgoYmQkUTZfMTEpCnByb3Bfb2JzIDwtIG1lYW4oYmQkUTZfMTEpCnByb3BfZXhwZWN0ZWQgPC0gMC41NQpwcm9wX3Rlc3RfcmVzdWx0IDwtIHByb3AudGVzdCh4ID0gc3VtKGJkJFE2XzExID09IDEpLCBuID0gbiwgcCA9IHByb3BfZXhwZWN0ZWQsIGFsdGVybmF0aXZlID0gInR3by5zaWRlZCIpCnByaW50KHByb3BfdGVzdF9yZXN1bHQpCmBgYAoKRGFkbyB1biB2YWxvciBwIGRlIDAuNDA2OTI2NCwgaWd1YWwgcXVlIGxhcyB2ZWNlcyBhbnRlcmlvcmVzLCBubyBzZSBjdWVudGEgY29uIGV2aWRlbmNpYSBwYXJhIHJlY2hhemFyIGxhIGhpcG90ZXNpcyBudWxhLiBObyBzZSBwdWVkZSBhZmlybWFyIHF1ZSBsYSBwcm9wb3JjacOzbiBkZSB0dXJpc3RhcyBlc3Bhw7FvbGVzIHF1ZSBhZmlybWFuIHF1ZSBjb21wZW5zYXLDrWFuIGxhIGh1ZWxsYSBkZSBjYXJib25vIGVuIHN1IGFsb2phbWllbnRvIHZhY2FjaW9uYWwgZXMgZGlmZXJlbnRlIGRlbCA1NSUsIGNvbW8gc2UgbWVuY2lvbmFiYSBlbiBsYSBoaXDDs3Rlc2lzIGFsdGVybmEuCgojIyMgSGlww7N0ZXNpcyA0ClE3CgpIaXDDs3Rlc2lzIG51bGE6IGxhIGNhbnRpZGFkIHByb21lZGlvIGRlIHZpYWplcyBxdWUgcmVhbGl6YW4gbG9zIG1leGljYW5vcyBlcyBpZ3VhbCBhIGxhIGNhbnRpZGFkIGRlIHZpYWplcyBxdWUgcmVhbGl6YW4gbG9zIGVzcGHDsW9sZXMuCgpIaXDDs3Rlc2lzIGFsdGVybmE6IGxhIGNhbnRpZGFkIHByb21lZGlvIGRlIHZpYWplcyBxdWUgcmVhbGl6YW4gbG9zIG1leGljYW5vcyBlcyBkaWZlcmVudGUgYSBsYSBjYW50aWRhZCBkZSB2aWFqZXMgcXVlIHJlYWxpemFuIGxvcyBlc3Bhw7FvbGVzLgoKYGBge3J9CmJkIDwtIGJkWyFpcy5uYShiZCRRNyksIF0Kc3VtbWFyeShiZCRRNykKYGBgCgo=