Introducción

Las secciones anteriores correspondientes a la prueba t y a la prueba de ANOVA tratan sobre la relación de una variable numérica con una variable categórica, de tal manera que el objetivo es comparar y extrapolar las medias de la variable numérica por grupos de la variable categórica. En la sección sobre tablas cruzadas se analizó las relaciones bivariadas entre dos variables categóricas (o de factor en la terminología de R). Esta evaluación se hace mediante tablas cruzadas (o de contingencia) y se evalúa mediante la prueba de chi-cuadrado.

En esta sección veremos la relación bivariada entre dos variables numéricas, usando el gráfico de dispersión para la inspección visual y el coeficiente de correlación de Pearson para la evaluación. En primer lugar, se cargarán los datos del Barómetro de las Américas 2018/19.

Sobre la base de datos

Los datos que vamos a usar deben citarse de la siguiente manera: Fuente: Barómetro de las Américas por el Proyecto de Opinión Pública de América Latina (LAPOP), wwww.LapopSurveys.org. Pueden descargar los datos de manera libre aquí.

En este documento se carga nuevamente una base de datos recortada, originalmente en formato SPSS (.sav). Se recomienda limpiar el Environment antes de iniciar esta sección.

library(rio) 
lapop18 <- import("https://raw.github.com/lapop-central/materials_edu/main/LAPOP_AB_Merge_2018_v1.0.sav")
lapop18 <- subset(lapop18, pais<=35)

También cargamos la base de datos de la ronda 2021.

lapop21 = import("lapop21.RData") 
lapop21 <- subset(lapop21, pais<=35)

Confianza en las elecciones y evaluaciones de expertos

El reporte El Pulso de la Democracia de la ronda 2021 presenta el gráfico 2.4 que relaciona el porcentaje de confianza en las elecciones por país con

Apoyo a la democracia y nivel de democracia

En esta sección seguiremos usando el reporte “El pulso de la democracia”, disponible aquí. donde se presentan los principales hallazgos de la ronda 2018/19 del Barómetro de las Américas. En este informe, se presenta el Gráfico 1.3. Este es un gráfico de dispersión que relaciona la variable apoyo a la democracia (del Barómetro de las Américas) con el índice de democracia electoral del proyecto V-Dem. Este gráfico muestra “la relación entre el nivel de apoyo a la democracia y la calificación de la democracia en cada país” (p. 12).

Para reproducir este gráfico se tiene que agregar los resultados por país de la variable ING4. “Cambiando de tema, la democracia puede tener problemas, pero es mejor que cualquier otra forma de gobierno. ¿En qué medida está de acuerdo o en desacuerdo con esta afirmación?”. Las personas podían responder en una escala del 1 al 7, donde 1 significa “muy en desacuerdo” y 7 “muy de acuerdo”. El reporte indica que se ha recodificado la pregunta original en una variable dummy, donde las respuestas entre 5 al 7 se les considera como que apoyan a la democracia. En el eje X del gráfico 1.3 se presenta el porcentaje de personas que apoyan a la democracia por país (es decir, aquellos que responden entre 5 y 7 en cada país).

Luego, en la página web del proyecto V-Dem, se puede calcular los puntajes del índice de democracia electoral para cada país (ver aquí). Por lo tanto, se puede recoger los datos para los 18 países que son parte del reporte “El pulso de la democracia”. Estos datos, luego, se pueden descargar en formato .csv. El eje Y del gráfico 1.3 muestra los puntajes del índice de democracia electoral de V-Dem en una escala del 0 al 1. Para este documento se ha recogido los datos del índice de democracia electoral 2018 y 2019 para los 18 países analizados en el reporte, incluyendo el código de país, para poder fusionar los datos luego. Esta base de datos también se encuentra alojada en el repositorio “materials_edu” de la cuenta de LAPOP en GitHub.

vdem <- import("https://raw.github.com/lapop-central/materials_edu/main/vdem.xlsx")
vdem

Para reproducir el Gráfico 1.3 tenemos que recodificar la variable la variable ING4 de acuerdo a la regla indicada en el reporte:

  • Valores de ING4 del 1-4 -> 0 en la nueva variable “apoyo”

  • Valores de ING4 del 5-7 -> 100 en la nueva variable “apoyo”

library(car)
lapop18$apoyo <- car::recode(lapop18$ing4, "1:4=0; 5:7=100")
table(lapop18$apoyo)
## 
##     0   100 
## 11463 15623

Con esta nueva variable “apoyo”, ahora tenemos que agregar los datos de esta variable por país y guardar esta información en un nuevo dataframe “df”. Para esto usaremos el comando summarySE que reporta los estadísticos descriptivos de la variable “apoyo” por país. Se incluye el N de cada país, el promedio (que sería el porcentaje), la desviación estándar, el error estándar y el tamaño del intervalo de confianza. En este caso solo requerimos el dato del promedio. Mirando la tabla, vemos que Uruguay es el país que reporta una mayor proporción de ciudadanos que apoyan a la democracia y además cuenta con la menor desviación estándar, indicando que existe una mayor homogeneidad de las opiniones en comparación con los otros 17 países.

library(Rmisc) #para poder utilizar el comando summarySE
df <- summarySE(data=lapop18, measurevar="apoyo", groupvar="pais", na.rm=T)
df

Luego, usamos los datos de la columna “vdem2019” del dataframe “vdem” para agregarlos en “df”. Esto lo hacemos con el comando cbind, donde se indica el dataframe de destino y los datos a agregar vdem$vdem2019. Se renombra la columna añadida pues por defecto se nombra como la variable.

df <- cbind(df, vdem$vdem2019)
colnames(df)[7] <- "vdem2019"
df

Diagrama de dispersión

En el dataframe “df” ahora tenemos las dos variables que se grafican en el diagrama de dispersión presentado en el Gráfico 1.3. Este gráfico lo podemos replicar con el comando plot, donde se indica la variable que irá en el eje X y luego la que irá en el eje Y. Se etiquetan los ejes con xlab y ylab. Se fijan los límites de los ejes con xlim y ylim. Se agrega las etiquetas de cada punto con el comando text, donde se indica que se agregue la etiqueta de la variable df$pais.

plot(df$apoyo, df$vdem2019, 
     xlab="Apoyo a la democracia (%)", 
     ylab="Índice de Democracia Electoral V_Dem", 
     pch=19, xlim=c(40, 80), ylim=c(0.2, 1))
text(df$apoyo, df$vdem2019, labels=df$pais, cex=0.5, pos=3)

Sin embargo, estas etiquetas muestran los códigos de los países, Para que muestre los nombres de los países, se tiene que transformar la variable “pais” en una variable de factor “paises” y etiquetar con los nombres.

df$paises <- as.factor(df$pais)
levels(df$paises) <- c("México", "Guatemala", "El Salvador", "Honduras",
                            "Nicaragua","Costa Rica", "Panamá", "Colombia", 
                            "Ecuador", "Bolivia", "Perú", "Paraguay", 
                            "Chile", "Uruguay", "Brasil",
                            "Argentina", "Rep. Dom.", "Jamaica")
table(df$paises)
## 
##      México   Guatemala El Salvador    Honduras   Nicaragua  Costa Rica 
##           1           1           1           1           1           1 
##      Panamá    Colombia     Ecuador     Bolivia        Perú    Paraguay 
##           1           1           1           1           1           1 
##       Chile     Uruguay      Brasil   Argentina   Rep. Dom.     Jamaica 
##           1           1           1           1           1           1

Con esta nueva variable se puede rehacer el gráfico de dispersión con las etiquetas de los países.

plot(df$apoyo, df$vdem2019, 
     xlab="Apoyo a la democracia (%)", 
     ylab="Índice de Democracia Electoral V_Dem", 
     pch=19, xlim=c(40, 80), ylim=c(0.2, 1))
text(df$apoyo, df$vdem2019, labels=df$paises, cex=0.5, pos=3)

Este mismo gráfico se puede reproducir también usando la librería ggplot. En primer lugar se define la estética del gráfico, es decir el dataframe, que será “df”, y con la especificación aes, las variables en cada eje del gráfico. Con el comando geom_point se indica que se quiere producir un gráfico de puntos. Un elemento que podemos agregar es la línea de predicción o de ajuste, con el comando geom_smooth. Dentro de este comando se especifica que se use el método lineal con method=lm y que no se muestre el intervalo de confianza alrededor de la línea de tendencia, con se=F. Luego, con el comando geom_text se incluye las etiquetas a cada punto, desde la variable “paises”. Se usa la especificación nudge_y para ajustar verticalmente las etiquetas y check_overlap=T para prevenir que las etiquetas se superpongan. Finalmente, se etiquetan los ejes con labs(…), se define un tema general del gráfico, con theme_light() y se definen los límites de los ejes.

library(ggplot2)
ggplot(df, aes(x=apoyo, y=vdem2019))+
  geom_point()+
  geom_smooth(method=lm, se=F)+ #agregar línea de tendencia
  geom_text(data=df, aes(label=paises), cex=2.5, nudge_y = 0.02, check_overlap = T)+ #Pata etiquetar los puntos, darles un tamalo, ubicación y prevenir que se sobrepongan
  labs(x="Apoyo a la democracia", y="ïndice de Democracia Electoral V-Dem ")+ #para etiquetar los ejes
  theme_light()+
  xlim(40, 80)+
  ylim(0.2, 1)

Como se presenta en el gráfico, la distribución de los países se puede resumir con una aproximación lineal mediante una recta. Esta recta tiene una pendiente positiva, que indica que hay una relación directa entre ambas variables: a medida que un país exhibe un mayor porcentaje de ciudadanos que apoyan a la democracia, se observa un mayor puntaje en el índice de democracia electoral.

Coeficiente de Correlación de Pearson

Para evaluar la magnitud de la dependencia entre ambas variables, se puede agregar una medida estadística, el coeficiente de correlación R de Pearsons. Este coeficiente varía entre -1 a +1. El signo indica la dirección de la relación, mientras el valor indica el grado de la relación. Si el coeficiente es 0, esto indica una ausencia de relación lineal y mientras más cercano a 1 que existe una mayor relación lineal entre las variables.

El reporte indica que “en general, existe una relación positiva entre las dos medidas (correlación de Pearson =.64). Si bien este análisis es descriptivo y no pone a prueba una relación causal, el patrón es consistente con investigaciones previas donde se identifica que el apoyo de los ciudadanos a la democracia es un ingrediente central para la vitalidad de la democracia”.

Se puede usar el comando cor.test para calcular el valor del coeficiente de Pearson. Dentro de este comando se indica qué variable se ubica en cada eje. Por defecto se calcula es coeficiente de Pearson, pero con la especificación method="..." se puede calcular también el coeficiente de Kendall o el de Spearman.

cor.test(x = df$apoyo, y = df$vdem2019)
## 
##  Pearson's product-moment correlation
## 
## data:  df$apoyo and df$vdem2019
## t = 3.2105, df = 16, p-value = 0.005456
## alternative hypothesis: true correlation is not equal to 0
## 95 percent confidence interval:
##  0.2247472 0.8456754
## sample estimates:
##       cor 
## 0.6259389

Se obtiene un coeficiente de 0.62, que indica una relación positiva, aunque el valor exacto no es igual al que se reporta en el documento, pues los cálculos realizados en este documento no toman en cuenta el efecto del factor de expansión.

Resumen

En este documento se ha trabajado la relación bivariada entre dos variables numéricas. La visualización de esa relación se ha hecho mediante el diagrama de dispersión y la evaluación de la relación se ha hecho mediante el coeficiente de correlación de Pearson.

Este es un primer paso en el modelamiento. En las siguientes secciones se introducirá el modelamiento mediante la técnica de la regresión lineal simple, que es una expresión matemática de lo visto en esta sección.

LS0tCnRpdGxlOiAiQ29ycmVsYWNpw7NuIGNvbiBsb3MgZGF0b3MgZGVsIEJhcsOzbWV0cm8gZGUgbGFzIEFtw6lyaWNhcyIKb3V0cHV0OgogIGh0bWxfZG9jdW1lbnQ6CiAgICB0b2M6IHRydWUKICAgIHRvY19mbG9hdDogdHJ1ZQogICAgY29sbGFwc2VkOiBmYWxzZQogICAgbnVtYmVyX3NlY3Rpb25zOiBmYWxzZQogICAgdG9jX2RlcHRoOiAxCiAgICBjb2RlX2Rvd25sb2FkOiB0cnVlCiAgICB0aGVtZTogZmxhdGx5CiAgICBkZl9wcmludDogcGFnZWQKICAgIHNlbGZfY29udGFpbmVkOiBubwogICAga2VlcF9tZDogeWVzCmVkaXRvcl9vcHRpb25zOiAKICBtYXJrZG93bjogCiAgICB3cmFwOiBzZW50ZW5jZQotLS0KCmBgYHtyIHNldHVwLCBpbmNsdWRlPUZBTFNFfQprbml0cjo6b3B0c19jaHVuayRzZXQobWVzc2FnZT1GQUxTRSx3YXJuaW5nPUZBTFNFLCBjYWNoZT1UUlVFKQpgYGAKCmBgYHtjc3MgY29sb3IsIGVjaG89RkFMU0V9Ci5jb2x1bW5zIHtkaXNwbGF5OiBmbGV4O30KaDEge2NvbG9yOiAjMzM2NkNDO30KYGBgCgojIEludHJvZHVjY2nDs24KCkxhcyBzZWNjaW9uZXMgYW50ZXJpb3JlcyBjb3JyZXNwb25kaWVudGVzIGEgbGEgW3BydWViYSB0XShodHRwczovL2FydHVyb21hbGRvbmFkby5naXRodWIuaW8vQmFyb21ldHJvRWR1X1dlYi9wcnVlYmF0Lmh0bWwpIHkgYSBsYSBwcnVlYmEgZGUgW0FOT1ZBXShodHRwczovL2FydHVyb21hbGRvbmFkby5naXRodWIuaW8vQmFyb21ldHJvRWR1X1dlYi9hbm92YS5odG1sKSB0cmF0YW4gc29icmUgbGEgcmVsYWNpw7NuIGRlIHVuYSB2YXJpYWJsZSBudW3DqXJpY2EgY29uIHVuYSB2YXJpYWJsZSBjYXRlZ8OzcmljYSwgZGUgdGFsIG1hbmVyYSBxdWUgZWwgb2JqZXRpdm8gZXMgY29tcGFyYXIgeSBleHRyYXBvbGFyIGxhcyBtZWRpYXMgZGUgbGEgdmFyaWFibGUgbnVtw6lyaWNhIHBvciBncnVwb3MgZGUgbGEgdmFyaWFibGUgY2F0ZWfDs3JpY2EuCkVuIGxhIHNlY2Npw7NuIHNvYnJlIFt0YWJsYXMgY3J1emFkYXNdKGh0dHBzOi8vYXJ0dXJvbWFsZG9uYWRvLmdpdGh1Yi5pby9CYXJvbWV0cm9FZHVfV2ViL2NoaS5odG1sKSBzZSBhbmFsaXrDsyBsYXMgcmVsYWNpb25lcyBiaXZhcmlhZGFzIGVudHJlIGRvcyB2YXJpYWJsZXMgY2F0ZWfDs3JpY2FzIChvIGRlIGZhY3RvciBlbiBsYSB0ZXJtaW5vbG9nw61hIGRlIFIpLgpFc3RhIGV2YWx1YWNpw7NuIHNlIGhhY2UgbWVkaWFudGUgdGFibGFzIGNydXphZGFzIChvIGRlIGNvbnRpbmdlbmNpYSkgeSBzZSBldmFsw7phIG1lZGlhbnRlIGxhIHBydWViYSBkZSBjaGktY3VhZHJhZG8uCgpFbiBlc3RhIHNlY2Npw7NuIHZlcmVtb3MgbGEgcmVsYWNpw7NuIGJpdmFyaWFkYSBlbnRyZSBkb3MgdmFyaWFibGVzIG51bcOpcmljYXMsIHVzYW5kbyBlbCBncsOhZmljbyBkZSBkaXNwZXJzacOzbiBwYXJhIGxhIGluc3BlY2Npw7NuIHZpc3VhbCB5IGVsIGNvZWZpY2llbnRlIGRlIGNvcnJlbGFjacOzbiBkZSBQZWFyc29uIHBhcmEgbGEgZXZhbHVhY2nDs24uCkVuIHByaW1lciBsdWdhciwgc2UgY2FyZ2Fyw6FuIGxvcyBkYXRvcyBkZWwgQmFyw7NtZXRybyBkZSBsYXMgQW3DqXJpY2FzIDIwMTgvMTkuCgojIFNvYnJlIGxhIGJhc2UgZGUgZGF0b3MKCkxvcyBkYXRvcyBxdWUgdmFtb3MgYSB1c2FyIGRlYmVuIGNpdGFyc2UgZGUgbGEgc2lndWllbnRlIG1hbmVyYTogRnVlbnRlOiBCYXLDs21ldHJvIGRlIGxhcyBBbcOpcmljYXMgcG9yIGVsIFByb3llY3RvIGRlIE9waW5pw7NuIFDDumJsaWNhIGRlIEFtw6lyaWNhIExhdGluYSAoTEFQT1ApLCB3d3d3LkxhcG9wU3VydmV5cy5vcmcuClB1ZWRlbiBkZXNjYXJnYXIgbG9zIGRhdG9zIGRlIG1hbmVyYSBsaWJyZSBbYXF1w61dKGh0dHA6Ly9kYXRhc2V0cy5hbWVyaWNhc2Jhcm9tZXRlci5vcmcvZGF0YWJhc2UvbG9naW4ucGhwKS4KCkVuIGVzdGUgZG9jdW1lbnRvIHNlIGNhcmdhIG51ZXZhbWVudGUgdW5hIGJhc2UgZGUgZGF0b3MgcmVjb3J0YWRhLCBvcmlnaW5hbG1lbnRlIGVuIGZvcm1hdG8gU1BTUyAoLnNhdikuClNlIHJlY29taWVuZGEgbGltcGlhciBlbCBFbnZpcm9ubWVudCBhbnRlcyBkZSBpbmljaWFyIGVzdGEgc2VjY2nDs24uCgpgYGB7ciBiYXNlfQpsaWJyYXJ5KHJpbykgCmxhcG9wMTggPC0gaW1wb3J0KCJodHRwczovL3Jhdy5naXRodWIuY29tL2xhcG9wLWNlbnRyYWwvbWF0ZXJpYWxzX2VkdS9tYWluL0xBUE9QX0FCX01lcmdlXzIwMThfdjEuMC5zYXYiKQpsYXBvcDE4IDwtIHN1YnNldChsYXBvcDE4LCBwYWlzPD0zNSkKYGBgCgpUYW1iacOpbiBjYXJnYW1vcyBsYSBiYXNlIGRlIGRhdG9zIGRlIGxhIHJvbmRhIDIwMjEuCgpgYGB7ciBiYXNlMjF9CmxhcG9wMjEgPSBpbXBvcnQoImxhcG9wMjEuUkRhdGEiKSAKbGFwb3AyMSA8LSBzdWJzZXQobGFwb3AyMSwgcGFpczw9MzUpCmBgYAoKIyBDb25maWFuemEgZW4gbGFzIGVsZWNjaW9uZXMgeSBldmFsdWFjaW9uZXMgZGUgZXhwZXJ0b3MKCkVsIHJlcG9ydGUgKkVsIFB1bHNvIGRlIGxhIERlbW9jcmFjaWEqIGRlIGxhIHJvbmRhIDIwMjEgcHJlc2VudGEgZWwgZ3LDoWZpY28gMi40IHF1ZSByZWxhY2lvbmEgZWwgcG9yY2VudGFqZSBkZSBjb25maWFuemEgZW4gbGFzIGVsZWNjaW9uZXMgcG9yIHBhw61zIGNvbgoKIVtdKEZpZ3VyZTIuNC5wbmcpe3dpZHRoPSI1MTkifQoKIyBBcG95byBhIGxhIGRlbW9jcmFjaWEgeSBuaXZlbCBkZSBkZW1vY3JhY2lhCgpFbiBlc3RhIHNlY2Npw7NuIHNlZ3VpcmVtb3MgdXNhbmRvIGVsIHJlcG9ydGUgIkVsIHB1bHNvIGRlIGxhIGRlbW9jcmFjaWEiLCBkaXNwb25pYmxlIFthcXXDrV0oaHR0cHM6Ly93d3cudmFuZGVyYmlsdC5lZHUvbGFwb3AvYWIyMDE4LzIwMTgtMTlfQW1lcmljYXNCYXJvbWV0ZXJfUmVnaW9uYWxfUmVwb3J0X1NwYW5pc2hfV18wMy4yNy4yMC5wZGYpLgpkb25kZSBzZSBwcmVzZW50YW4gbG9zIHByaW5jaXBhbGVzIGhhbGxhemdvcyBkZSBsYSByb25kYSAyMDE4LzE5IGRlbCBCYXLDs21ldHJvIGRlIGxhcyBBbcOpcmljYXMuCkVuIGVzdGUgaW5mb3JtZSwgc2UgcHJlc2VudGEgZWwgR3LDoWZpY28gMS4zLgpFc3RlIGVzIHVuIGdyw6FmaWNvIGRlIGRpc3BlcnNpw7NuIHF1ZSByZWxhY2lvbmEgbGEgdmFyaWFibGUgYXBveW8gYSBsYSBkZW1vY3JhY2lhIChkZWwgQmFyw7NtZXRybyBkZSBsYXMgQW3DqXJpY2FzKSBjb24gZWwgw61uZGljZSBkZSBkZW1vY3JhY2lhIGVsZWN0b3JhbCBkZWwgcHJveWVjdG8gW1YtRGVtXShodHRwczovL3d3dy52LWRlbS5uZXQvZW4vKS4KRXN0ZSBncsOhZmljbyBtdWVzdHJhICJsYSByZWxhY2nDs24gZW50cmUgZWwgbml2ZWwgZGUgYXBveW8gYSBsYSBkZW1vY3JhY2lhIHkgbGEgY2FsaWZpY2FjacOzbiBkZSBsYSBkZW1vY3JhY2lhIGVuIGNhZGEgcGHDrXMiIChwLiAxMikuCgohW10oR3JhZjEuMy5wbmcpe3dpZHRoPSI1MjMifQoKUGFyYSByZXByb2R1Y2lyIGVzdGUgZ3LDoWZpY28gc2UgdGllbmUgcXVlIGFncmVnYXIgbG9zIHJlc3VsdGFkb3MgcG9yIHBhw61zIGRlIGxhIHZhcmlhYmxlIElORzQuCiJDYW1iaWFuZG8gZGUgdGVtYSwgbGEgZGVtb2NyYWNpYSBwdWVkZSB0ZW5lciBwcm9ibGVtYXMsIHBlcm8gZXMgbWVqb3IgcXVlIGN1YWxxdWllciBvdHJhIGZvcm1hIGRlIGdvYmllcm5vLiDCv0VuIHF1w6kgbWVkaWRhIGVzdMOhIGRlIGFjdWVyZG8gbyBlbiBkZXNhY3VlcmRvIGNvbiBlc3RhIGFmaXJtYWNpw7NuPyIuCkxhcyBwZXJzb25hcyBwb2TDrWFuIHJlc3BvbmRlciBlbiB1bmEgZXNjYWxhIGRlbCAxIGFsIDcsIGRvbmRlIDEgc2lnbmlmaWNhICJtdXkgZW4gZGVzYWN1ZXJkbyIgeSA3ICJtdXkgZGUgYWN1ZXJkbyIuCkVsIHJlcG9ydGUgaW5kaWNhIHF1ZSBzZSBoYSByZWNvZGlmaWNhZG8gbGEgcHJlZ3VudGEgb3JpZ2luYWwgZW4gdW5hIHZhcmlhYmxlIGR1bW15LCBkb25kZSBsYXMgcmVzcHVlc3RhcyBlbnRyZSA1IGFsIDcgc2UgbGVzIGNvbnNpZGVyYSBjb21vIHF1ZSBhcG95YW4gYSBsYSBkZW1vY3JhY2lhLgpFbiBlbCBlamUgWCBkZWwgZ3LDoWZpY28gMS4zIHNlIHByZXNlbnRhIGVsIHBvcmNlbnRhamUgZGUgcGVyc29uYXMgcXVlIGFwb3lhbiBhIGxhIGRlbW9jcmFjaWEgcG9yIHBhw61zIChlcyBkZWNpciwgYXF1ZWxsb3MgcXVlIHJlc3BvbmRlbiBlbnRyZSA1IHkgNyBlbiBjYWRhIHBhw61zKS4KCkx1ZWdvLCBlbiBsYSBww6FnaW5hIHdlYiBkZWwgcHJveWVjdG8gVi1EZW0sIHNlIHB1ZWRlIGNhbGN1bGFyIGxvcyBwdW50YWplcyBkZWwgw61uZGljZSBkZSBkZW1vY3JhY2lhIGVsZWN0b3JhbCBwYXJhIGNhZGEgcGHDrXMgKHZlciBbYXF1w61dKGh0dHBzOi8vd3d3LnYtZGVtLm5ldC9lbi9hbmFseXNpcy9WYXJpYWJsZUdyYXBoLykpLgpQb3IgbG8gdGFudG8sIHNlIHB1ZWRlIHJlY29nZXIgbG9zIGRhdG9zIHBhcmEgbG9zIDE4IHBhw61zZXMgcXVlIHNvbiBwYXJ0ZSBkZWwgcmVwb3J0ZSAiRWwgcHVsc28gZGUgbGEgZGVtb2NyYWNpYSIuCkVzdG9zIGRhdG9zLCBsdWVnbywgc2UgcHVlZGVuIGRlc2NhcmdhciBlbiBmb3JtYXRvIC5jc3YuCkVsIGVqZSBZIGRlbCBncsOhZmljbyAxLjMgbXVlc3RyYSBsb3MgcHVudGFqZXMgZGVsIMOtbmRpY2UgZGUgZGVtb2NyYWNpYSBlbGVjdG9yYWwgZGUgVi1EZW0gZW4gdW5hIGVzY2FsYSBkZWwgMCBhbCAxLgpQYXJhIGVzdGUgZG9jdW1lbnRvIHNlIGhhIHJlY29naWRvIGxvcyBkYXRvcyBkZWwgw61uZGljZSBkZSBkZW1vY3JhY2lhIGVsZWN0b3JhbCAyMDE4IHkgMjAxOSBwYXJhIGxvcyAxOCBwYcOtc2VzIGFuYWxpemFkb3MgZW4gZWwgcmVwb3J0ZSwgaW5jbHV5ZW5kbyBlbCBjw7NkaWdvIGRlIHBhw61zLCBwYXJhIHBvZGVyIGZ1c2lvbmFyIGxvcyBkYXRvcyBsdWVnby4KRXN0YSBiYXNlIGRlIGRhdG9zIHRhbWJpw6luIHNlIGVuY3VlbnRyYSBhbG9qYWRhIGVuIGVsIHJlcG9zaXRvcmlvICJtYXRlcmlhbHNfZWR1IiBkZSBsYSBjdWVudGEgZGUgTEFQT1AgZW4gR2l0SHViLgoKYGBge3IgdmRlbX0KdmRlbSA8LSBpbXBvcnQoImh0dHBzOi8vcmF3LmdpdGh1Yi5jb20vbGFwb3AtY2VudHJhbC9tYXRlcmlhbHNfZWR1L21haW4vdmRlbS54bHN4IikKdmRlbQpgYGAKClBhcmEgcmVwcm9kdWNpciBlbCBHcsOhZmljbyAxLjMgdGVuZW1vcyBxdWUgcmVjb2RpZmljYXIgbGEgdmFyaWFibGUgbGEgdmFyaWFibGUgSU5HNCBkZSBhY3VlcmRvIGEgbGEgcmVnbGEgaW5kaWNhZGEgZW4gZWwgcmVwb3J0ZToKCi0gICBWYWxvcmVzIGRlIElORzQgZGVsIDEtNCAtXD4gMCBlbiBsYSBudWV2YSB2YXJpYWJsZSAiYXBveW8iCgotICAgVmFsb3JlcyBkZSBJTkc0IGRlbCA1LTcgLVw+IDEwMCBlbiBsYSBudWV2YSB2YXJpYWJsZSAiYXBveW8iCgpgYGB7ciByZWNvfQpsaWJyYXJ5KGNhcikKbGFwb3AxOCRhcG95byA8LSBjYXI6OnJlY29kZShsYXBvcDE4JGluZzQsICIxOjQ9MDsgNTo3PTEwMCIpCnRhYmxlKGxhcG9wMTgkYXBveW8pCmBgYAoKQ29uIGVzdGEgbnVldmEgdmFyaWFibGUgImFwb3lvIiwgYWhvcmEgdGVuZW1vcyBxdWUgYWdyZWdhciBsb3MgZGF0b3MgZGUgZXN0YSB2YXJpYWJsZSBwb3IgcGHDrXMgeSBndWFyZGFyIGVzdGEgaW5mb3JtYWNpw7NuIGVuIHVuIG51ZXZvIGRhdGFmcmFtZSAiZGYiLgpQYXJhIGVzdG8gdXNhcmVtb3MgZWwgY29tYW5kbyBgc3VtbWFyeVNFYCBxdWUgcmVwb3J0YSBsb3MgZXN0YWTDrXN0aWNvcyBkZXNjcmlwdGl2b3MgZGUgbGEgdmFyaWFibGUgImFwb3lvIiBwb3IgcGHDrXMuClNlIGluY2x1eWUgZWwgTiBkZSBjYWRhIHBhw61zLCBlbCBwcm9tZWRpbyAocXVlIHNlcsOtYSBlbCBwb3JjZW50YWplKSwgbGEgZGVzdmlhY2nDs24gZXN0w6FuZGFyLCBlbCBlcnJvciBlc3TDoW5kYXIgeSBlbCB0YW1hw7FvIGRlbCBpbnRlcnZhbG8gZGUgY29uZmlhbnphLgpFbiBlc3RlIGNhc28gc29sbyByZXF1ZXJpbW9zIGVsIGRhdG8gZGVsIHByb21lZGlvLgpNaXJhbmRvIGxhIHRhYmxhLCB2ZW1vcyBxdWUgVXJ1Z3VheSBlcyBlbCBwYcOtcyBxdWUgcmVwb3J0YSB1bmEgbWF5b3IgcHJvcG9yY2nDs24gZGUgY2l1ZGFkYW5vcyBxdWUgYXBveWFuIGEgbGEgZGVtb2NyYWNpYSB5IGFkZW3DoXMgY3VlbnRhIGNvbiBsYSBtZW5vciBkZXN2aWFjacOzbiBlc3TDoW5kYXIsIGluZGljYW5kbyBxdWUgZXhpc3RlIHVuYSBtYXlvciBob21vZ2VuZWlkYWQgZGUgbGFzIG9waW5pb25lcyBlbiBjb21wYXJhY2nDs24gY29uIGxvcyBvdHJvcyAxNyBwYcOtc2VzLgoKYGBge3IgZGZ9CmxpYnJhcnkoUm1pc2MpICNwYXJhIHBvZGVyIHV0aWxpemFyIGVsIGNvbWFuZG8gc3VtbWFyeVNFCmRmIDwtIHN1bW1hcnlTRShkYXRhPWxhcG9wMTgsIG1lYXN1cmV2YXI9ImFwb3lvIiwgZ3JvdXB2YXI9InBhaXMiLCBuYS5ybT1UKQpkZgpgYGAKCkx1ZWdvLCB1c2Ftb3MgbG9zIGRhdG9zIGRlIGxhIGNvbHVtbmEgInZkZW0yMDE5IiBkZWwgZGF0YWZyYW1lICJ2ZGVtIiBwYXJhIGFncmVnYXJsb3MgZW4gImRmIi4KRXN0byBsbyBoYWNlbW9zIGNvbiBlbCBjb21hbmRvIGBjYmluZGAsIGRvbmRlIHNlIGluZGljYSBlbCBkYXRhZnJhbWUgZGUgZGVzdGlubyB5IGxvcyBkYXRvcyBhIGFncmVnYXIgYHZkZW0kdmRlbTIwMTlgLgpTZSByZW5vbWJyYSBsYSBjb2x1bW5hIGHDsWFkaWRhIHB1ZXMgcG9yIGRlZmVjdG8gc2Ugbm9tYnJhIGNvbW8gbGEgdmFyaWFibGUuCgpgYGB7ciBtZXJnZX0KZGYgPC0gY2JpbmQoZGYsIHZkZW0kdmRlbTIwMTkpCmNvbG5hbWVzKGRmKVs3XSA8LSAidmRlbTIwMTkiCmRmCmBgYAoKIyBEaWFncmFtYSBkZSBkaXNwZXJzacOzbgoKRW4gZWwgZGF0YWZyYW1lICJkZiIgYWhvcmEgdGVuZW1vcyBsYXMgZG9zIHZhcmlhYmxlcyBxdWUgc2UgZ3JhZmljYW4gZW4gZWwgZGlhZ3JhbWEgZGUgZGlzcGVyc2nDs24gcHJlc2VudGFkbyBlbiBlbCBHcsOhZmljbyAxLjMuCkVzdGUgZ3LDoWZpY28gbG8gcG9kZW1vcyByZXBsaWNhciBjb24gZWwgY29tYW5kbyBgcGxvdGAsIGRvbmRlIHNlIGluZGljYSBsYSB2YXJpYWJsZSBxdWUgaXLDoSBlbiBlbCBlamUgWCB5IGx1ZWdvIGxhIHF1ZSBpcsOhIGVuIGVsIGVqZSBZLgpTZSBldGlxdWV0YW4gbG9zIGVqZXMgY29uIGB4bGFiYCB5IGB5bGFiYC4KU2UgZmlqYW4gbG9zIGzDrW1pdGVzIGRlIGxvcyBlamVzIGNvbiBgeGxpbWAgeSBgeWxpbWAuClNlIGFncmVnYSBsYXMgZXRpcXVldGFzIGRlIGNhZGEgcHVudG8gY29uIGVsIGNvbWFuZG8gYHRleHRgLCBkb25kZSBzZSBpbmRpY2EgcXVlIHNlIGFncmVndWUgbGEgZXRpcXVldGEgZGUgbGEgdmFyaWFibGUgYGRmJHBhaXNgLgoKYGBge3IgcGxvdH0KcGxvdChkZiRhcG95bywgZGYkdmRlbTIwMTksIAogICAgIHhsYWI9IkFwb3lvIGEgbGEgZGVtb2NyYWNpYSAoJSkiLCAKICAgICB5bGFiPSLDjW5kaWNlIGRlIERlbW9jcmFjaWEgRWxlY3RvcmFsIFZfRGVtIiwgCiAgICAgcGNoPTE5LCB4bGltPWMoNDAsIDgwKSwgeWxpbT1jKDAuMiwgMSkpCnRleHQoZGYkYXBveW8sIGRmJHZkZW0yMDE5LCBsYWJlbHM9ZGYkcGFpcywgY2V4PTAuNSwgcG9zPTMpCmBgYAoKU2luIGVtYmFyZ28sIGVzdGFzIGV0aXF1ZXRhcyBtdWVzdHJhbiBsb3MgY8OzZGlnb3MgZGUgbG9zIHBhw61zZXMsIFBhcmEgcXVlIG11ZXN0cmUgbG9zIG5vbWJyZXMgZGUgbG9zIHBhw61zZXMsIHNlIHRpZW5lIHF1ZSB0cmFuc2Zvcm1hciBsYSB2YXJpYWJsZSAicGFpcyIgZW4gdW5hIHZhcmlhYmxlIGRlIGZhY3RvciAicGFpc2VzIiB5IGV0aXF1ZXRhciBjb24gbG9zIG5vbWJyZXMuCgpgYGB7ciBwYWlzfQpkZiRwYWlzZXMgPC0gYXMuZmFjdG9yKGRmJHBhaXMpCmxldmVscyhkZiRwYWlzZXMpIDwtIGMoIk3DqXhpY28iLCAiR3VhdGVtYWxhIiwgIkVsIFNhbHZhZG9yIiwgIkhvbmR1cmFzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJOaWNhcmFndWEiLCJDb3N0YSBSaWNhIiwgIlBhbmFtw6EiLCAiQ29sb21iaWEiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFY3VhZG9yIiwgIkJvbGl2aWEiLCAiUGVyw7oiLCAiUGFyYWd1YXkiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDaGlsZSIsICJVcnVndWF5IiwgIkJyYXNpbCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQXJnZW50aW5hIiwgIlJlcC4gRG9tLiIsICJKYW1haWNhIikKdGFibGUoZGYkcGFpc2VzKQpgYGAKCkNvbiBlc3RhIG51ZXZhIHZhcmlhYmxlIHNlIHB1ZWRlIHJlaGFjZXIgZWwgZ3LDoWZpY28gZGUgZGlzcGVyc2nDs24gY29uIGxhcyBldGlxdWV0YXMgZGUgbG9zIHBhw61zZXMuCgpgYGB7ciBwbG90Mn0KcGxvdChkZiRhcG95bywgZGYkdmRlbTIwMTksIAogICAgIHhsYWI9IkFwb3lvIGEgbGEgZGVtb2NyYWNpYSAoJSkiLCAKICAgICB5bGFiPSLDjW5kaWNlIGRlIERlbW9jcmFjaWEgRWxlY3RvcmFsIFZfRGVtIiwgCiAgICAgcGNoPTE5LCB4bGltPWMoNDAsIDgwKSwgeWxpbT1jKDAuMiwgMSkpCnRleHQoZGYkYXBveW8sIGRmJHZkZW0yMDE5LCBsYWJlbHM9ZGYkcGFpc2VzLCBjZXg9MC41LCBwb3M9MykKYGBgCgpFc3RlIG1pc21vIGdyw6FmaWNvIHNlIHB1ZWRlIHJlcHJvZHVjaXIgdGFtYmnDqW4gdXNhbmRvIGxhIGxpYnJlcsOtYSBgZ2dwbG90YC4KRW4gcHJpbWVyIGx1Z2FyIHNlIGRlZmluZSBsYSBlc3TDqXRpY2EgZGVsIGdyw6FmaWNvLCBlcyBkZWNpciBlbCBkYXRhZnJhbWUsIHF1ZSBzZXLDoSAiZGYiLCB5IGNvbiBsYSBlc3BlY2lmaWNhY2nDs24gYGFlc2AsIGxhcyB2YXJpYWJsZXMgZW4gY2FkYSBlamUgZGVsIGdyw6FmaWNvLgpDb24gZWwgY29tYW5kbyBgZ2VvbV9wb2ludGAgc2UgaW5kaWNhIHF1ZSBzZSBxdWllcmUgcHJvZHVjaXIgdW4gZ3LDoWZpY28gZGUgcHVudG9zLgpVbiBlbGVtZW50byBxdWUgcG9kZW1vcyBhZ3JlZ2FyIGVzIGxhIGzDrW5lYSBkZSBwcmVkaWNjacOzbiBvIGRlIGFqdXN0ZSwgY29uIGVsIGNvbWFuZG8gYGdlb21fc21vb3RoYC4KRGVudHJvIGRlIGVzdGUgY29tYW5kbyBzZSBlc3BlY2lmaWNhIHF1ZSBzZSB1c2UgZWwgbcOpdG9kbyBsaW5lYWwgY29uIGBtZXRob2Q9bG1gIHkgcXVlIG5vIHNlIG11ZXN0cmUgZWwgaW50ZXJ2YWxvIGRlIGNvbmZpYW56YSBhbHJlZGVkb3IgZGUgbGEgbMOtbmVhIGRlIHRlbmRlbmNpYSwgY29uIGBzZT1GYC4KTHVlZ28sIGNvbiBlbCBjb21hbmRvIGBnZW9tX3RleHRgIHNlIGluY2x1eWUgbGFzIGV0aXF1ZXRhcyBhIGNhZGEgcHVudG8sIGRlc2RlIGxhIHZhcmlhYmxlICJwYWlzZXMiLgpTZSB1c2EgbGEgZXNwZWNpZmljYWNpw7NuIGBudWRnZV95YCBwYXJhIGFqdXN0YXIgdmVydGljYWxtZW50ZSBsYXMgZXRpcXVldGFzIHkgYGNoZWNrX292ZXJsYXA9VGAgcGFyYSBwcmV2ZW5pciBxdWUgbGFzIGV0aXF1ZXRhcyBzZSBzdXBlcnBvbmdhbi4KRmluYWxtZW50ZSwgc2UgZXRpcXVldGFuIGxvcyBlamVzIGNvbiBgbGFicyjigKYpYCwgc2UgZGVmaW5lIHVuIHRlbWEgZ2VuZXJhbCBkZWwgZ3LDoWZpY28sIGNvbiBgdGhlbWVfbGlnaHQoKWAgeSBzZSBkZWZpbmVuIGxvcyBsw61taXRlcyBkZSBsb3MgZWplcy4KCmBgYHtyIGdncGxvdH0KbGlicmFyeShnZ3Bsb3QyKQpnZ3Bsb3QoZGYsIGFlcyh4PWFwb3lvLCB5PXZkZW0yMDE5KSkrCiAgZ2VvbV9wb2ludCgpKwogIGdlb21fc21vb3RoKG1ldGhvZD1sbSwgc2U9RikrICNhZ3JlZ2FyIGzDrW5lYSBkZSB0ZW5kZW5jaWEKICBnZW9tX3RleHQoZGF0YT1kZiwgYWVzKGxhYmVsPXBhaXNlcyksIGNleD0yLjUsIG51ZGdlX3kgPSAwLjAyLCBjaGVja19vdmVybGFwID0gVCkrICNQYXRhIGV0aXF1ZXRhciBsb3MgcHVudG9zLCBkYXJsZXMgdW4gdGFtYWxvLCB1YmljYWNpw7NuIHkgcHJldmVuaXIgcXVlIHNlIHNvYnJlcG9uZ2FuCiAgbGFicyh4PSJBcG95byBhIGxhIGRlbW9jcmFjaWEiLCB5PSLDr25kaWNlIGRlIERlbW9jcmFjaWEgRWxlY3RvcmFsIFYtRGVtICIpKyAjcGFyYSBldGlxdWV0YXIgbG9zIGVqZXMKICB0aGVtZV9saWdodCgpKwogIHhsaW0oNDAsIDgwKSsKICB5bGltKDAuMiwgMSkKYGBgCgpDb21vIHNlIHByZXNlbnRhIGVuIGVsIGdyw6FmaWNvLCBsYSBkaXN0cmlidWNpw7NuIGRlIGxvcyBwYcOtc2VzIHNlIHB1ZWRlIHJlc3VtaXIgY29uIHVuYSBhcHJveGltYWNpw7NuIGxpbmVhbCBtZWRpYW50ZSB1bmEgcmVjdGEuCkVzdGEgcmVjdGEgdGllbmUgdW5hIHBlbmRpZW50ZSBwb3NpdGl2YSwgcXVlIGluZGljYSBxdWUgaGF5IHVuYSByZWxhY2nDs24gZGlyZWN0YSBlbnRyZSBhbWJhcyB2YXJpYWJsZXM6IGEgbWVkaWRhIHF1ZSB1biBwYcOtcyBleGhpYmUgdW4gbWF5b3IgcG9yY2VudGFqZSBkZSBjaXVkYWRhbm9zIHF1ZSBhcG95YW4gYSBsYSBkZW1vY3JhY2lhLCBzZSBvYnNlcnZhIHVuIG1heW9yIHB1bnRhamUgZW4gZWwgw61uZGljZSBkZSBkZW1vY3JhY2lhIGVsZWN0b3JhbC4KCiMgQ29lZmljaWVudGUgZGUgQ29ycmVsYWNpw7NuIGRlIFBlYXJzb24KClBhcmEgZXZhbHVhciBsYSBtYWduaXR1ZCBkZSBsYSBkZXBlbmRlbmNpYSBlbnRyZSBhbWJhcyB2YXJpYWJsZXMsIHNlIHB1ZWRlIGFncmVnYXIgdW5hIG1lZGlkYSBlc3RhZMOtc3RpY2EsIGVsIGNvZWZpY2llbnRlIGRlIGNvcnJlbGFjacOzbiBSIGRlIFBlYXJzb25zLgpFc3RlIGNvZWZpY2llbnRlIHZhcsOtYSBlbnRyZSAtMSBhICsxLgpFbCBzaWdubyBpbmRpY2EgbGEgZGlyZWNjacOzbiBkZSBsYSByZWxhY2nDs24sIG1pZW50cmFzIGVsIHZhbG9yIGluZGljYSBlbCBncmFkbyBkZSBsYSByZWxhY2nDs24uClNpIGVsIGNvZWZpY2llbnRlIGVzIDAsIGVzdG8gaW5kaWNhIHVuYSBhdXNlbmNpYSBkZSByZWxhY2nDs24gbGluZWFsIHkgbWllbnRyYXMgbcOhcyBjZXJjYW5vIGEgMSBxdWUgZXhpc3RlIHVuYSBtYXlvciByZWxhY2nDs24gbGluZWFsIGVudHJlIGxhcyB2YXJpYWJsZXMuCgpFbCByZXBvcnRlIGluZGljYSBxdWUgImVuIGdlbmVyYWwsIGV4aXN0ZSB1bmEgcmVsYWNpw7NuIHBvc2l0aXZhIGVudHJlIGxhcyBkb3MgbWVkaWRhcyAoY29ycmVsYWNpw7NuIGRlIFBlYXJzb24gPS42NCkuIFNpIGJpZW4gZXN0ZSBhbsOhbGlzaXMgZXMgZGVzY3JpcHRpdm8geSBubyBwb25lIGEgcHJ1ZWJhIHVuYSByZWxhY2nDs24gY2F1c2FsLCBlbCBwYXRyw7NuIGVzIGNvbnNpc3RlbnRlIGNvbiBpbnZlc3RpZ2FjaW9uZXMgcHJldmlhcyBkb25kZSBzZSBpZGVudGlmaWNhIHF1ZSBlbCBhcG95byBkZSBsb3MgY2l1ZGFkYW5vcyBhIGxhIGRlbW9jcmFjaWEgZXMgdW4gaW5ncmVkaWVudGUgY2VudHJhbCBwYXJhIGxhIHZpdGFsaWRhZCBkZSBsYSBkZW1vY3JhY2lhIi4KClNlIHB1ZWRlIHVzYXIgZWwgY29tYW5kbyBgY29yLnRlc3RgIHBhcmEgY2FsY3VsYXIgZWwgdmFsb3IgZGVsIGNvZWZpY2llbnRlIGRlIFBlYXJzb24uCkRlbnRybyBkZSBlc3RlIGNvbWFuZG8gc2UgaW5kaWNhIHF1w6kgdmFyaWFibGUgc2UgdWJpY2EgZW4gY2FkYSBlamUuClBvciBkZWZlY3RvIHNlIGNhbGN1bGEgZXMgY29lZmljaWVudGUgZGUgUGVhcnNvbiwgcGVybyBjb24gbGEgZXNwZWNpZmljYWNpw7NuIGBtZXRob2Q9Ii4uLiJgIHNlIHB1ZWRlIGNhbGN1bGFyIHRhbWJpw6luIGVsIGNvZWZpY2llbnRlIGRlIEtlbmRhbGwgbyBlbCBkZSBTcGVhcm1hbi4KCmBgYHtyfQpjb3IudGVzdCh4ID0gZGYkYXBveW8sIHkgPSBkZiR2ZGVtMjAxOSkKYGBgCgpTZSBvYnRpZW5lIHVuIGNvZWZpY2llbnRlIGRlIDAuNjIsIHF1ZSBpbmRpY2EgdW5hIHJlbGFjacOzbiBwb3NpdGl2YSwgYXVucXVlIGVsIHZhbG9yIGV4YWN0byBubyBlcyBpZ3VhbCBhbCBxdWUgc2UgcmVwb3J0YSBlbiBlbCBkb2N1bWVudG8sIHB1ZXMgbG9zIGPDoWxjdWxvcyByZWFsaXphZG9zIGVuIGVzdGUgZG9jdW1lbnRvIG5vIHRvbWFuIGVuIGN1ZW50YSBlbCBlZmVjdG8gZGVsIGZhY3RvciBkZSBleHBhbnNpw7NuLgoKIyBSZXN1bWVuCgpFbiBlc3RlIGRvY3VtZW50byBzZSBoYSB0cmFiYWphZG8gbGEgcmVsYWNpw7NuIGJpdmFyaWFkYSBlbnRyZSBkb3MgdmFyaWFibGVzIG51bcOpcmljYXMuCkxhIHZpc3VhbGl6YWNpw7NuIGRlIGVzYSByZWxhY2nDs24gc2UgaGEgaGVjaG8gbWVkaWFudGUgZWwgZGlhZ3JhbWEgZGUgZGlzcGVyc2nDs24geSBsYSBldmFsdWFjacOzbiBkZSBsYSByZWxhY2nDs24gc2UgaGEgaGVjaG8gbWVkaWFudGUgZWwgY29lZmljaWVudGUgZGUgY29ycmVsYWNpw7NuIGRlIFBlYXJzb24uCgpFc3RlIGVzIHVuIHByaW1lciBwYXNvIGVuIGVsIG1vZGVsYW1pZW50by4KRW4gbGFzIHNpZ3VpZW50ZXMgc2VjY2lvbmVzIHNlIGludHJvZHVjaXLDoSBlbCBtb2RlbGFtaWVudG8gbWVkaWFudGUgbGEgdMOpY25pY2EgZGUgbGEgcmVncmVzacOzbiBsaW5lYWwgc2ltcGxlLCBxdWUgZXMgdW5hIGV4cHJlc2nDs24gbWF0ZW3DoXRpY2EgZGUgbG8gdmlzdG8gZW4gZXN0YSBzZWNjacOzbi4K