Caso 1: Apoyo a la democracia en América Latina

Pregunta: ¿existe una erosión del apoyo a la democracia entre los ciudadanos en América Latina?

Leer una base de datos

Usamos la librería rio. Activamos la librería con el comando library y usamos el comando import para leer la base de datos (un archivo Excel). Ojo: el nombre del archivo tiene que estar entre comillas. En este caso, el archivo está dentro de mi directorio de trabajo, por lo que se le llama con el nombre. Si no estuviera en el directorio de trabajo se tendría que especificar la ruta del archivo.

Guardamos esta base de datos en un nuevo objeto (dataframe) llamado apoyoAL. Se sugiere siempre trabajar con nombres cortos de bases de datos y de variables.

library(rio)
apoyoAL = import("apoyoAL.xlsx")

Descripción para variables numéricas

Usamos las medidas de tendencia central para describir una variable numérica. Podemos usar el comando mean para calcular el promedio de apoyo a la democracia en 2023. Este comando asume que se tienen datos completos. Como existe un dato perdido, el comando no corre, y se tiene que añadir la especificación , na.rm = T.

library(tidyverse)
apoyoAL %>%
  summarise(Apoyo2023=mean(apoyo2023, na.rm=T))
##   Apoyo2023
## 1  58.56522

También se puede calcular la mediana, con el comando median y presentar ambas medidas juntas.

apoyoAL %>%
  summarise(Promedio_Apoyo2023=mean(apoyo2023, na.rm=T), 
            Mediana_Apoyo2023=median(apoyo2023, na.rm=T))
##   Promedio_Apoyo2023 Mediana_Apoyo2023
## 1           58.56522                57

Ahora lo que queremos averiguar es si el apoyo a la democracia ha disminuido, aumentado o permanecido igual entre 2021 y 2023. Para esto, podemos comparar la media del apoyo a la democracia en 2021 con la media en 2023.

apoyoAL |>
  summarise(Promedio_Apoyo2021=mean(apoyo2021, na.rm=T), 
            Promedio_Apoyo2023=mean(apoyo2023, na.rm=T))
##   Promedio_Apoyo2021 Promedio_Apoyo2023
## 1               61.2           58.56522

Según estos resultados, el apoyo a la democracia ha disminuido de 61.2% a 58.6%; es decir, una disminución de 2.6 puntos porcentuales.

Los datos de 2023 incluyen países caribeños (Bahamas, Granada, TyT y Surinám) que no estaban en el gráfico de 2021. Es posible que el menor promedio de apoyo a la democracia en 2023 sea por la incorporación de estos países. Se podría argumentar que si se tuviera los datos de estos países para 2021, quizá no existiría una erosión del apoyo a la democracia.

Una forma de lidiar con esta observación es comparar los resultados 2023 y 2021 solo de los países que tienen datos en ambos años.

Dataframes

Antes de ver cómo eliminar los países, una nota sobre la estructura de una base de datos. El dataframe apoyoAL tiene 24 observaciones (24 filas, en cada una, un país) y 4 variables (4 columnas, en cada una, una variable). Por lo tanto, este dataframe tiene una dimensión [24, 4]. En general, un dataframe tiene dimensión [#filas, #columnas].

Por lo tanto, se puede llamar a los elementos de un dataframe indicando la fila y la columna. Por ejemplo, para llamar al elemento de la primera fila y segunda columna.

apoyoAL[4,2]
## [1] "Argentina"

También se puede llamar toda una fila. En este caso, la primera fila.

apoyoAL[1,]
##   pais country apoyo2021 apoyo2023
## 1   UY Uruguay        80        75

O la segunda columna

apoyoAL[,2]
##  [1] "Uruguay"              "El Salvador"          "Costa Rica"          
##  [4] "Argentina"            "Chile"                "Brasil"              
##  [7] "Guyana"               "México"               "Ecuador"             
## [10] "Nicaragua"            "República Dominicana" "Panamá"              
## [13] "Bolivia"              "Jamaica"              "Colombia"            
## [16] "Guatemala"            "Paraguay"             "Perú"                
## [19] "Honduras"             "Haití"                "Bahamas"             
## [22] "Granada"              "Trinidad y Tobago"    "Surinám"

Esto nos permite seleccionar filas (países) o columnas (variables) bajo ciertas condiciones. En general, nos interesa más seleccionar filas.

Por ejemplo, si queremos seleccionar los países por encima de la media de apoyo 2023, podemos decir

apoyoAL[apoyoAL$apoyo2023>mean(apoyoAL$apoyo2023, na.rm = T), c(2,3,4)]
##                 country apoyo2021 apoyo2023
## 1               Uruguay        80        75
## 2           El Salvador        73        67
## 3            Costa Rica        71        72
## 4             Argentina        69        68
## 5                 Chile        68        70
## 6                Brasil        67        64
## NA                 <NA>        NA        NA
## 8                México        63        62
## 11 República Dominicana        62        64
## 12               Panamá        61        62
## 21              Bahamas        NA        65
## 22              Granada        NA        59

En R existe un comando para seleccionar observaciones. Se puede usar subset para hacer este filtro. Este filtro se puede almacenar en otro dataframe.

apoyo_mayor_media = subset(apoyoAL, apoyo2023 > mean(apoyo2023, na.rm=T))

En R tenemos los siguientes operadores lógicos:

Operador Descripción
== es igual a
!= es diferente de
> es mayor de
< es menor de
>= es mayor o igual a
<= es menor o igual a
& intersección (Y)
| unión (O)

Caso 2: Resultados electorales 2016

Pregunta: Algunos politólogos consideran que un partido más institucionalizado es el que es capaz de tener un mayor enraizamiento territorial y, por lo tanto, tener un apoyo electoral relativamente constante a lo largo del territorio. Por el contrario, un partido menos institucionalizado, solo lograría apoyos electorales diferenciados, mayores en algunos territorios y menores en otros.

Siguiendo esta idea, ¿cuál fue el partido mas o menos institucionalizado de acuerdo a los resultados electorales de 2016?

Leer una base de datos

library(rio)
res2016 = import("resultados2016.xlsx")

Si se hace doble click en el objeto, se abre la base de datos como una pestaña en la zona de scripts / RMarkdowns. Este objeto dataframe tiene vectores de datos de tipo “caracter” y otros vectores de datos de tipo “numérico”.

Descripción de la heterogeneidad

Usamos las medidas de dispersión para describir una variable numérica. Podemos usar el comando sd para calcular la desviación estándar del voto provincial a Fuerza Popular, a Peruanos por el Kambio y al Frente Amplio en 2016. Este comando asume que se tienen datos completos. Si existiera un dato perdido, el comando no correría, y se tendría que añadir la especificación , na.rm = T.

library(dplyr)
library(tidyverse)
res2016 %>%
  summarise(sd(fp), sd(ppk), sd(fa))
##     sd(fp)  sd(ppk)   sd(fa)
## 1 15.71665 28.89695 17.34935

También se puede calcular la media para grupos de observaciones, es decir para filas específicas de una base de datos. Una opción sería agregar un nuevo dataframe con el filtrado de las observaciones. Si no queremos llenarnos de bases de datos parciales, tenemos otras opciones.

Por ejemplo, si quisiéramos saber si la heterogeneidad del voto fue mayor o menor que aquella del voto provincial general de Fuerza Popular, podríamos calcular la desviación estándar del voto provincial solo en las provincias de Lima.

Esto se puede hacer de múltiples maneras. En este curso comenzaremos a usar las funciones del mundo del Tidyverse.

En cualquier caso, se tiene que seleccionar algunas filas de un dataframe usando operadores lógicos. En nuestro caso vamos a seleccionar las observaciones, con el comando filter y con la condición que en el vector o variable “dpto” sean igual a “LIMA”. Ojo, en mayúsculas, dado que así está en la base de datos y entre comillas porque es una cadena de caracteres.

res2016 %>%
  filter(dpto =="LIMA") %>%
  summarise(sd(fp), sd(ppk), sd(fa))
##     sd(fp)  sd(ppk)   sd(fa)
## 1 6.853293 6.539157 4.175478

Encontramos que en Lima la desviación estándar del voto provincial a Fuerza Popular es mayor que la de otros partidos. También se puede calcular los mismo para el caso de Cusco.

res2016 %>% 
  filter(dpto =="CUSCO") %>%
  summarize(mean(fp, na.rm=T), mean(ppk, na.rm=T), mean(fa, na.rm=T), 
    sd(fp), sd(ppk), sd(fa))
##   mean(fp, na.rm = T) mean(ppk, na.rm = T) mean(fa, na.rm = T)   sd(fp)
## 1            19.39154             5.583846            55.17385 7.083839
##    sd(ppk)   sd(fa)
## 1 3.913559 11.03639
#Cómo calcularían esta media usando la variable "id"?

Tarea

La base de datos también incluye el voto provincial a Fuerza Popular en la elección de 2021.

¿Calcule si el voto promedio de Fuerza Popular ha aumentado o disminuido entre 2011 y 2016?

¿Calcule lo mismo para el departamento de Tumbes?

¿Calcule si Fuerza Popular ha aumento o disminuido su nivel de institucionalización?

Medidas de tendencia central

Moda

  • Valor mas frecuente de un conjunto de datos

  • Es apropiada para todo tipo de datos

  • Se puede observar directamente en una tabla de distribución de frecuencias.

Mediana

  • El valor de la observación central de un conjunto de datos ordenados de menor a mayor.

Media

  • Medida más conocida y “útil”.

  • Suma del valor de las observaciones dividida entre el número de observaciones

\[ \sum \frac{x_i} {n} = \frac{(x_1 + x_2 +x_3 +...+ x_n)} {n} \]

En una base de datos, se puede calcular la media sumando los valores de una variable (columna de una base de datos) y dividiendo entre el número de casos (# total de filas).


Resumen

TC Nominales Ordinales Numéricas
Moda
Mediana No
Media No No
  • Moda aplica para cualquier tipo de variable, pero menos útil.

  • Media aplica solo para variables numéricas, pero más útil.


Medidas de dispersión

  • Describir la centralidad no es suficiente. Dos distribuciones pueden tener la misma medida de tendencia central, pero diferentes realidades.

  • Ejemplo: distribución de puntaje en área matemática de prueba PISA aplicada en 2 países pueden tener la misma media, pero diferente variación.

  • ¿Cómo describiría las diferencias entre en los puntajes de la prueba el País A y el País B?


Rango

  • Diferencia entre el valor máximo y el mínimo. En ejemplo de policías: 259-3 = 256. Es la diferencia entre la comisaría con más efectivos y la comisaría con menor número de efectivos.

  • No un una medida muy útil.


Rango intercuartil

  • Se verá cuando se vean percentiles.

Desviación estándar

  • Cada observación está a una “distancia” de la media. Esta distancia se llama desviación \((x_i-\bar{x})\)

  • Observaciones por encima de la media tendrán desviaciones positivas. Observaciones por debajo de la media tendrán desviaciones negativas.

  • No se puede calcular un promedio de desviaciones porque valores positivos se cancelan con negativos.

  • Se eleva al cuadrado las observaciones para que todas sean positivas. Se promedian esas desviaciones al cuadrado.

  • La desviación estándar es la raíz cuadrada de ese promedio de desviaciones al cuadrado.

  • Se divide entre n-1 por un tema técnico.

\[ \sum \frac{(x_i-\bar{x})^2} {n-1} \]

Para ver un cálculo básico de la desviación estándar en Excel, puede entrar aquí.

  • Como se observa en el gráfico anterior, la desviación estándar es más útil cuando se comparar dos distribuciones. Se compara la centralidad y la dispersión de una variable entre dos grupos (o dos distribuciones).

Bibliografía

LS0tCnRpdGxlOiAnQ2xhc2UgMjogZGVzY3JpcGNpw7NuIHkgdmlzdWFsaXphY2nDs24nCmF1dGhvcjogIkFydHVybyBNYWxkb25hZG8iCmRhdGU6ICIyNy8wOC8yMDI0IgpvdXRwdXQ6CiAgaHRtbF9kb2N1bWVudDoKICAgIHRvYzogdHJ1ZQogICAgdG9jX2Zsb2F0OiB0cnVlCiAgICBjb2xsYXBzZWQ6IGZhbHNlCiAgICBudW1iZXJfc2VjdGlvbnM6IGZhbHNlCiAgICB0b2NfZGVwdGg6IDEKICAgIGNvZGVfZG93bmxvYWQ6IHRydWUKICAgIHRoZW1lOiBjb3NtbwogICAgaGlnaGxpZ2h0OiB0ZXh0bWF0ZQplZGl0b3Jfb3B0aW9uczoKICBtYXJrZG93bjoKICAgIHdyYXA6IHNlbnRlbmNlCmJpYmxpb2dyYXBoeTogcmVmZXJlbmNlcy5iaWIKLS0tCgpgYGB7ciBzZXR1cCwgaW5jbHVkZT1GQUxTRX0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KGVjaG8gPSBUUlVFKQpgYGAKCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKIyBDYXNvIDE6IEFwb3lvIGEgbGEgZGVtb2NyYWNpYSBlbiBBbcOpcmljYSBMYXRpbmEKCipQcmVndW50YTogwr9leGlzdGUgdW5hIGVyb3Npw7NuIGRlbCBhcG95byBhIGxhIGRlbW9jcmFjaWEgZW50cmUgbG9zIGNpdWRhZGFub3MgZW4gQW3DqXJpY2EgTGF0aW5hPyoKCiMjIExlZXIgdW5hIGJhc2UgZGUgZGF0b3MKClVzYW1vcyBsYSBsaWJyZXLDrWEgYHJpb2AuCkFjdGl2YW1vcyBsYSBsaWJyZXLDrWEgY29uIGVsIGNvbWFuZG8gYGxpYnJhcnlgIHkgdXNhbW9zIGVsIGNvbWFuZG8gYGltcG9ydGAgcGFyYSBsZWVyIGxhIGJhc2UgZGUgZGF0b3MgKHVuIGFyY2hpdm8gRXhjZWwpLgpPam86IGVsIG5vbWJyZSBkZWwgYXJjaGl2byB0aWVuZSBxdWUgZXN0YXIgZW50cmUgY29taWxsYXMuCkVuIGVzdGUgY2FzbywgZWwgYXJjaGl2byBlc3TDoSBkZW50cm8gZGUgbWkgZGlyZWN0b3JpbyBkZSB0cmFiYWpvLCBwb3IgbG8gcXVlIHNlIGxlIGxsYW1hIGNvbiBlbCBub21icmUuClNpIG5vIGVzdHV2aWVyYSBlbiBlbCBkaXJlY3RvcmlvIGRlIHRyYWJham8gc2UgdGVuZHLDrWEgcXVlIGVzcGVjaWZpY2FyIGxhIHJ1dGEgZGVsIGFyY2hpdm8uCgpHdWFyZGFtb3MgZXN0YSBiYXNlIGRlIGRhdG9zIGVuIHVuIG51ZXZvIG9iamV0byAoZGF0YWZyYW1lKSBsbGFtYWRvIGFwb3lvQUwuClNlIHN1Z2llcmUgc2llbXByZSB0cmFiYWphciBjb24gbm9tYnJlcyBjb3J0b3MgZGUgYmFzZXMgZGUgZGF0b3MgeSBkZSB2YXJpYWJsZXMuCgpgYGB7cn0KbGlicmFyeShyaW8pCmFwb3lvQUwgPSBpbXBvcnQoImFwb3lvQUwueGxzeCIpCmBgYAoKIyMgRGVzY3JpcGNpw7NuIHBhcmEgdmFyaWFibGVzIG51bcOpcmljYXMKClVzYW1vcyBsYXMgbWVkaWRhcyBkZSB0ZW5kZW5jaWEgY2VudHJhbCBwYXJhIGRlc2NyaWJpciB1bmEgdmFyaWFibGUgbnVtw6lyaWNhLgpQb2RlbW9zIHVzYXIgZWwgY29tYW5kbyBgbWVhbmAgcGFyYSBjYWxjdWxhciBlbCBwcm9tZWRpbyBkZSBhcG95byBhIGxhIGRlbW9jcmFjaWEgZW4gMjAyMy4KRXN0ZSBjb21hbmRvIGFzdW1lIHF1ZSBzZSB0aWVuZW4gZGF0b3MgY29tcGxldG9zLgpDb21vIGV4aXN0ZSB1biBkYXRvIHBlcmRpZG8sIGVsIGNvbWFuZG8gbm8gY29ycmUsIHkgc2UgdGllbmUgcXVlIGHDsWFkaXIgbGEgZXNwZWNpZmljYWNpw7NuIGAsIG5hLnJtID0gVGAuCgpgYGB7cn0KbGlicmFyeSh0aWR5dmVyc2UpCmFwb3lvQUwgJT4lCiAgc3VtbWFyaXNlKEFwb3lvMjAyMz1tZWFuKGFwb3lvMjAyMywgbmEucm09VCkpCmBgYAoKVGFtYmnDqW4gc2UgcHVlZGUgY2FsY3VsYXIgbGEgbWVkaWFuYSwgY29uIGVsIGNvbWFuZG8gYG1lZGlhbmAgeSBwcmVzZW50YXIgYW1iYXMgbWVkaWRhcyBqdW50YXMuCgpgYGB7cn0KYXBveW9BTCAlPiUKICBzdW1tYXJpc2UoUHJvbWVkaW9fQXBveW8yMDIzPW1lYW4oYXBveW8yMDIzLCBuYS5ybT1UKSwgCiAgICAgICAgICAgIE1lZGlhbmFfQXBveW8yMDIzPW1lZGlhbihhcG95bzIwMjMsIG5hLnJtPVQpKQpgYGAKCkFob3JhIGxvIHF1ZSBxdWVyZW1vcyBhdmVyaWd1YXIgZXMgc2kgZWwgYXBveW8gYSBsYSBkZW1vY3JhY2lhIGhhIGRpc21pbnVpZG8sIGF1bWVudGFkbyBvIHBlcm1hbmVjaWRvIGlndWFsIGVudHJlIDIwMjEgeSAyMDIzLgpQYXJhIGVzdG8sIHBvZGVtb3MgY29tcGFyYXIgbGEgbWVkaWEgZGVsIGFwb3lvIGEgbGEgZGVtb2NyYWNpYSBlbiAyMDIxIGNvbiBsYSBtZWRpYSBlbiAyMDIzLgoKYGBge3J9CmFwb3lvQUwgfD4KICBzdW1tYXJpc2UoUHJvbWVkaW9fQXBveW8yMDIxPW1lYW4oYXBveW8yMDIxLCBuYS5ybT1UKSwgCiAgICAgICAgICAgIFByb21lZGlvX0Fwb3lvMjAyMz1tZWFuKGFwb3lvMjAyMywgbmEucm09VCkpCmBgYAoKU2Vnw7puIGVzdG9zIHJlc3VsdGFkb3MsIGVsIGFwb3lvIGEgbGEgZGVtb2NyYWNpYSBoYSBkaXNtaW51aWRvIGRlIDYxLjIlIGEgNTguNiU7IGVzIGRlY2lyLCB1bmEgZGlzbWludWNpw7NuIGRlIDIuNiBwdW50b3MgcG9yY2VudHVhbGVzLgoKTG9zIGRhdG9zIGRlIDIwMjMgaW5jbHV5ZW4gcGHDrXNlcyBjYXJpYmXDsW9zIChCYWhhbWFzLCBHcmFuYWRhLCBUeVQgeSBTdXJpbsOhbSkgcXVlIG5vIGVzdGFiYW4gZW4gZWwgZ3LDoWZpY28gZGUgMjAyMS4KRXMgcG9zaWJsZSBxdWUgZWwgbWVub3IgcHJvbWVkaW8gZGUgYXBveW8gYSBsYSBkZW1vY3JhY2lhIGVuIDIwMjMgc2VhIHBvciBsYSBpbmNvcnBvcmFjacOzbiBkZSBlc3RvcyBwYcOtc2VzLgpTZSBwb2Ryw61hIGFyZ3VtZW50YXIgcXVlIHNpIHNlIHR1dmllcmEgbG9zIGRhdG9zIGRlIGVzdG9zIHBhw61zZXMgcGFyYSAyMDIxLCBxdWl6w6Egbm8gZXhpc3RpcsOtYSB1bmEgZXJvc2nDs24gZGVsIGFwb3lvIGEgbGEgZGVtb2NyYWNpYS4KClVuYSBmb3JtYSBkZSBsaWRpYXIgY29uIGVzdGEgb2JzZXJ2YWNpw7NuIGVzIGNvbXBhcmFyIGxvcyByZXN1bHRhZG9zIDIwMjMgeSAyMDIxIHNvbG8gZGUgbG9zIHBhw61zZXMgcXVlIHRpZW5lbiBkYXRvcyBlbiBhbWJvcyBhw7Fvcy4KCiMjIERhdGFmcmFtZXMKCkFudGVzIGRlIHZlciBjw7NtbyBlbGltaW5hciBsb3MgcGHDrXNlcywgdW5hIG5vdGEgc29icmUgbGEgZXN0cnVjdHVyYSBkZSB1bmEgYmFzZSBkZSBkYXRvcy4KRWwgZGF0YWZyYW1lIGFwb3lvQUwgdGllbmUgMjQgb2JzZXJ2YWNpb25lcyAoMjQgZmlsYXMsIGVuIGNhZGEgdW5hLCB1biBwYcOtcykgeSA0IHZhcmlhYmxlcyAoNCBjb2x1bW5hcywgZW4gY2FkYSB1bmEsIHVuYSB2YXJpYWJsZSkuClBvciBsbyB0YW50bywgZXN0ZSBkYXRhZnJhbWUgdGllbmUgdW5hIGRpbWVuc2nDs24gWzI0LCA0XS4KRW4gZ2VuZXJhbCwgdW4gZGF0YWZyYW1lIHRpZW5lIGRpbWVuc2nDs24gWyNmaWxhcywgI2NvbHVtbmFzXS4KClBvciBsbyB0YW50bywgc2UgcHVlZGUgbGxhbWFyIGEgbG9zIGVsZW1lbnRvcyBkZSB1biBkYXRhZnJhbWUgaW5kaWNhbmRvIGxhIGZpbGEgeSBsYSBjb2x1bW5hLgpQb3IgZWplbXBsbywgcGFyYSBsbGFtYXIgYWwgZWxlbWVudG8gZGUgbGEgcHJpbWVyYSBmaWxhIHkgc2VndW5kYSBjb2x1bW5hLgoKYGBge3J9CmFwb3lvQUxbNCwyXQpgYGAKClRhbWJpw6luIHNlIHB1ZWRlIGxsYW1hciB0b2RhIHVuYSBmaWxhLgpFbiBlc3RlIGNhc28sIGxhIHByaW1lcmEgZmlsYS4KCmBgYHtyfQphcG95b0FMWzEsXQpgYGAKCk8gbGEgc2VndW5kYSBjb2x1bW5hCgpgYGB7cn0KYXBveW9BTFssMl0KYGBgCgpFc3RvIG5vcyBwZXJtaXRlIHNlbGVjY2lvbmFyIGZpbGFzIChwYcOtc2VzKSBvIGNvbHVtbmFzICh2YXJpYWJsZXMpIGJham8gY2llcnRhcyBjb25kaWNpb25lcy4KRW4gZ2VuZXJhbCwgbm9zIGludGVyZXNhIG3DoXMgc2VsZWNjaW9uYXIgZmlsYXMuCgpQb3IgZWplbXBsbywgc2kgcXVlcmVtb3Mgc2VsZWNjaW9uYXIgbG9zIHBhw61zZXMgcG9yIGVuY2ltYSBkZSBsYSBtZWRpYSBkZSBhcG95byAyMDIzLCBwb2RlbW9zIGRlY2lyCgpgYGB7cn0KYXBveW9BTFthcG95b0FMJGFwb3lvMjAyMz5tZWFuKGFwb3lvQUwkYXBveW8yMDIzLCBuYS5ybSA9IFQpLCBjKDIsMyw0KV0KYGBgCgpFbiBSIGV4aXN0ZSB1biBjb21hbmRvIHBhcmEgc2VsZWNjaW9uYXIgb2JzZXJ2YWNpb25lcy4KU2UgcHVlZGUgdXNhciBgc3Vic2V0YCBwYXJhIGhhY2VyIGVzdGUgZmlsdHJvLgpFc3RlIGZpbHRybyBzZSBwdWVkZSBhbG1hY2VuYXIgZW4gb3RybyBkYXRhZnJhbWUuCgpgYGB7cn0KYXBveW9fbWF5b3JfbWVkaWEgPSBzdWJzZXQoYXBveW9BTCwgYXBveW8yMDIzID4gbWVhbihhcG95bzIwMjMsIG5hLnJtPVQpKQpgYGAKCkVuIFIgdGVuZW1vcyBsb3Mgc2lndWllbnRlcyBvcGVyYWRvcmVzIGzDs2dpY29zOgoKfCBPcGVyYWRvciB8ICAgIERlc2NyaXBjacOzbiAgICAgfAp8Oi0tLS0tLS0tOnw6LS0tLS0tLS0tLS0tLS0tLS0tOnwKfCAgICA9PSAgICB8ICAgICBlcyBpZ3VhbCBhICAgICB8CnwgICAgIT0gICAgfCAgZXMgZGlmZXJlbnRlIGRlICAgfAp8ICAgIFw+ICAgIHwgICAgZXMgbWF5b3IgZGUgICAgIHwKfCAgICBcPCAgICB8ICAgIGVzIG1lbm9yIGRlICAgICB8CnwgICBcPj0gICAgfCBlcyBtYXlvciBvIGlndWFsIGEgfAp8ICAgXDw9ICAgIHwgZXMgbWVub3IgbyBpZ3VhbCBhIHwKfCAgICAmICAgICB8ICBpbnRlcnNlY2Npw7NuIChZKSAgfAp8ICAgIFx8ICAgIHwgICAgIHVuacOzbiAoTykgICAgICB8CgojIENhc28gMjogUmVzdWx0YWRvcyBlbGVjdG9yYWxlcyAyMDE2CgoqUHJlZ3VudGE6IEFsZ3Vub3MgcG9saXTDs2xvZ29zIGNvbnNpZGVyYW4gcXVlIHVuIHBhcnRpZG8gbcOhcyBpbnN0aXR1Y2lvbmFsaXphZG8gZXMgZWwgcXVlIGVzIGNhcGF6IGRlIHRlbmVyIHVuIG1heW9yIGVucmFpemFtaWVudG8gdGVycml0b3JpYWwgeSwgcG9yIGxvIHRhbnRvLCB0ZW5lciB1biBhcG95byBlbGVjdG9yYWwgcmVsYXRpdmFtZW50ZSBjb25zdGFudGUgYSBsbyBsYXJnbyBkZWwgdGVycml0b3Jpby4gUG9yIGVsIGNvbnRyYXJpbywgdW4gcGFydGlkbyBtZW5vcyBpbnN0aXR1Y2lvbmFsaXphZG8sIHNvbG8gbG9ncmFyw61hIGFwb3lvcyBlbGVjdG9yYWxlcyBkaWZlcmVuY2lhZG9zLCBtYXlvcmVzIGVuIGFsZ3Vub3MgdGVycml0b3Jpb3MgeSBtZW5vcmVzIGVuIG90cm9zLioKCipTaWd1aWVuZG8gZXN0YSBpZGVhLCDCv2N1w6FsIGZ1ZSBlbCBwYXJ0aWRvIG1hcyBvIG1lbm9zIGluc3RpdHVjaW9uYWxpemFkbyBkZSBhY3VlcmRvIGEgbG9zIHJlc3VsdGFkb3MgZWxlY3RvcmFsZXMgZGUgMjAxNj8qCgojIyBMZWVyIHVuYSBiYXNlIGRlIGRhdG9zCgpgYGB7ciBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQpsaWJyYXJ5KHJpbykKcmVzMjAxNiA9IGltcG9ydCgicmVzdWx0YWRvczIwMTYueGxzeCIpCmBgYAoKU2kgc2UgaGFjZSBkb2JsZSBjbGljayBlbiBlbCBvYmpldG8sIHNlIGFicmUgbGEgYmFzZSBkZSBkYXRvcyBjb21vIHVuYSBwZXN0YcOxYSBlbiBsYSB6b25hIGRlIHNjcmlwdHMgLyBSTWFya2Rvd25zLgpFc3RlIG9iamV0byBkYXRhZnJhbWUgdGllbmUgdmVjdG9yZXMgZGUgZGF0b3MgZGUgdGlwbyAiY2FyYWN0ZXIiIHkgb3Ryb3MgdmVjdG9yZXMgZGUgZGF0b3MgZGUgdGlwbyAibnVtw6lyaWNvIi4KCiMjIERlc2NyaXBjacOzbiBkZSBsYSBoZXRlcm9nZW5laWRhZAoKVXNhbW9zIGxhcyBtZWRpZGFzIGRlIGRpc3BlcnNpw7NuIHBhcmEgZGVzY3JpYmlyIHVuYSB2YXJpYWJsZSBudW3DqXJpY2EuClBvZGVtb3MgdXNhciBlbCBjb21hbmRvIGBzZGAgcGFyYSBjYWxjdWxhciBsYSBkZXN2aWFjacOzbiBlc3TDoW5kYXIgZGVsIHZvdG8gcHJvdmluY2lhbCBhIEZ1ZXJ6YSBQb3B1bGFyLCBhIFBlcnVhbm9zIHBvciBlbCBLYW1iaW8geSBhbCBGcmVudGUgQW1wbGlvIGVuIDIwMTYuCkVzdGUgY29tYW5kbyBhc3VtZSBxdWUgc2UgdGllbmVuIGRhdG9zIGNvbXBsZXRvcy4KU2kgZXhpc3RpZXJhIHVuIGRhdG8gcGVyZGlkbywgZWwgY29tYW5kbyBubyBjb3JyZXLDrWEsIHkgc2UgdGVuZHLDrWEgcXVlIGHDsWFkaXIgbGEgZXNwZWNpZmljYWNpw7NuIGAsIG5hLnJtID0gVGAuCgpgYGB7cn0KbGlicmFyeShkcGx5cikKbGlicmFyeSh0aWR5dmVyc2UpCnJlczIwMTYgJT4lCiAgc3VtbWFyaXNlKHNkKGZwKSwgc2QocHBrKSwgc2QoZmEpKQpgYGAKClRhbWJpw6luIHNlIHB1ZWRlIGNhbGN1bGFyIGxhIG1lZGlhIHBhcmEgZ3J1cG9zIGRlIG9ic2VydmFjaW9uZXMsIGVzIGRlY2lyIHBhcmEgZmlsYXMgZXNwZWPDrWZpY2FzIGRlIHVuYSBiYXNlIGRlIGRhdG9zLgpVbmEgb3BjacOzbiBzZXLDrWEgYWdyZWdhciB1biBudWV2byBkYXRhZnJhbWUgY29uIGVsIGZpbHRyYWRvIGRlIGxhcyBvYnNlcnZhY2lvbmVzLgpTaSBubyBxdWVyZW1vcyBsbGVuYXJub3MgZGUgYmFzZXMgZGUgZGF0b3MgcGFyY2lhbGVzLCB0ZW5lbW9zIG90cmFzIG9wY2lvbmVzLgoKUG9yIGVqZW1wbG8sIHNpIHF1aXNpw6lyYW1vcyBzYWJlciBzaSBsYSBoZXRlcm9nZW5laWRhZCBkZWwgdm90byBmdWUgbWF5b3IgbyBtZW5vciBxdWUgYXF1ZWxsYSBkZWwgdm90byBwcm92aW5jaWFsIGdlbmVyYWwgZGUgRnVlcnphIFBvcHVsYXIsIHBvZHLDrWFtb3MgY2FsY3VsYXIgbGEgZGVzdmlhY2nDs24gZXN0w6FuZGFyIGRlbCB2b3RvIHByb3ZpbmNpYWwgc29sbyBlbiBsYXMgcHJvdmluY2lhcyBkZSBMaW1hLgoKRXN0byBzZSBwdWVkZSBoYWNlciBkZSBtw7psdGlwbGVzIG1hbmVyYXMuCkVuIGVzdGUgY3Vyc28gY29tZW56YXJlbW9zIGEgdXNhciBsYXMgZnVuY2lvbmVzIGRlbCBtdW5kbyBkZWwgVGlkeXZlcnNlLgoKRW4gY3VhbHF1aWVyIGNhc28sIHNlIHRpZW5lIHF1ZSBzZWxlY2Npb25hciBhbGd1bmFzIGZpbGFzIGRlIHVuIGRhdGFmcmFtZSB1c2FuZG8gb3BlcmFkb3JlcyBsw7NnaWNvcy4KRW4gbnVlc3RybyBjYXNvIHZhbW9zIGEgc2VsZWNjaW9uYXIgbGFzIG9ic2VydmFjaW9uZXMsIGNvbiBlbCBjb21hbmRvIGBmaWx0ZXJgIHkgY29uIGxhIGNvbmRpY2nDs24gcXVlIGVuIGVsIHZlY3RvciBvIHZhcmlhYmxlICJkcHRvIiBzZWFuIGlndWFsIGEgIkxJTUEiLgpPam8sIGVuIG1hecO6c2N1bGFzLCBkYWRvIHF1ZSBhc8OtIGVzdMOhIGVuIGxhIGJhc2UgZGUgZGF0b3MgeSBlbnRyZSBjb21pbGxhcyBwb3JxdWUgZXMgdW5hIGNhZGVuYSBkZSBjYXJhY3RlcmVzLgoKYGBge3J9CnJlczIwMTYgJT4lCiAgZmlsdGVyKGRwdG8gPT0iTElNQSIpICU+JQogIHN1bW1hcmlzZShzZChmcCksIHNkKHBwayksIHNkKGZhKSkKYGBgCgpFbmNvbnRyYW1vcyBxdWUgZW4gTGltYSBsYSBkZXN2aWFjacOzbiBlc3TDoW5kYXIgZGVsIHZvdG8gcHJvdmluY2lhbCBhIEZ1ZXJ6YSBQb3B1bGFyIGVzIG1heW9yIHF1ZSBsYSBkZSBvdHJvcyBwYXJ0aWRvcy4KVGFtYmnDqW4gc2UgcHVlZGUgY2FsY3VsYXIgbG9zIG1pc21vIHBhcmEgZWwgY2FzbyBkZSBDdXNjby4KCmBgYHtyIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CnJlczIwMTYgJT4lIAogIGZpbHRlcihkcHRvID09IkNVU0NPIikgJT4lCiAgc3VtbWFyaXplKG1lYW4oZnAsIG5hLnJtPVQpLCBtZWFuKHBwaywgbmEucm09VCksIG1lYW4oZmEsIG5hLnJtPVQpLCAKICAgIHNkKGZwKSwgc2QocHBrKSwgc2QoZmEpKQojQ8OzbW8gY2FsY3VsYXLDrWFuIGVzdGEgbWVkaWEgdXNhbmRvIGxhIHZhcmlhYmxlICJpZCI/CmBgYAoKIyMgVGFyZWEKCkxhIGJhc2UgZGUgZGF0b3MgdGFtYmnDqW4gaW5jbHV5ZSBlbCB2b3RvIHByb3ZpbmNpYWwgYSBGdWVyemEgUG9wdWxhciBlbiBsYSBlbGVjY2nDs24gZGUgMjAyMS4KCsK/Q2FsY3VsZSBzaSBlbCB2b3RvIHByb21lZGlvIGRlIEZ1ZXJ6YSBQb3B1bGFyIGhhIGF1bWVudGFkbyBvIGRpc21pbnVpZG8gZW50cmUgMjAxMSB5IDIwMTY/CgrCv0NhbGN1bGUgbG8gbWlzbW8gcGFyYSBlbCBkZXBhcnRhbWVudG8gZGUgVHVtYmVzPwoKwr9DYWxjdWxlIHNpIEZ1ZXJ6YSBQb3B1bGFyIGhhIGF1bWVudG8gbyBkaXNtaW51aWRvIHN1IG5pdmVsIGRlIGluc3RpdHVjaW9uYWxpemFjacOzbj8KCiMgTWVkaWRhcyBkZSB0ZW5kZW5jaWEgY2VudHJhbAoKIyMgTW9kYQoKLSAgIFZhbG9yIG1hcyBmcmVjdWVudGUgZGUgdW4gY29uanVudG8gZGUgZGF0b3MKCi0gICBFcyBhcHJvcGlhZGEgcGFyYSB0b2RvIHRpcG8gZGUgZGF0b3MKCi0gICBTZSBwdWVkZSBvYnNlcnZhciBkaXJlY3RhbWVudGUgZW4gdW5hIHRhYmxhIGRlIGRpc3RyaWJ1Y2nDs24gZGUgZnJlY3VlbmNpYXMuCgojIyBNZWRpYW5hCgotICAgRWwgdmFsb3IgZGUgbGEgb2JzZXJ2YWNpw7NuIGNlbnRyYWwgZGUgdW4gY29uanVudG8gZGUgZGF0b3Mgb3JkZW5hZG9zIGRlIG1lbm9yIGEgbWF5b3IuCgohW10obWVkaWFuYTEucG5nKXt3aWR0aD0iNDk3In0KCiFbXShtZWRpYW5hMi5wbmcpe3dpZHRoPSI0OTgifQoKIyMgTWVkaWEKCi0gICBNZWRpZGEgbcOhcyBjb25vY2lkYSB5ICLDunRpbCIuCgotICAgU3VtYSBkZWwgdmFsb3IgZGUgbGFzIG9ic2VydmFjaW9uZXMgZGl2aWRpZGEgZW50cmUgZWwgbsO6bWVybyBkZSBvYnNlcnZhY2lvbmVzCgokJApcc3VtIFxmcmFje3hfaX0ge259ID0gXGZyYWN7KHhfMSArIHhfMiAreF8zICsuLi4rIHhfbil9IHtufQokJAoKRW4gdW5hIGJhc2UgZGUgZGF0b3MsIHNlIHB1ZWRlIGNhbGN1bGFyIGxhIG1lZGlhIHN1bWFuZG8gbG9zIHZhbG9yZXMgZGUgdW5hIHZhcmlhYmxlIChjb2x1bW5hIGRlIHVuYSBiYXNlIGRlIGRhdG9zKSB5IGRpdmlkaWVuZG8gZW50cmUgZWwgbsO6bWVybyBkZSBjYXNvcyAoXCMgdG90YWwgZGUgZmlsYXMpLgoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgojIyBSZXN1bWVuCgp8IFRDICAgICAgfCBOb21pbmFsZXMgfCBPcmRpbmFsZXMgfCBOdW3DqXJpY2FzIHwKfC0tLS0tLS0tLXw6LS0tLS0tLS0tOnw6LS0tLS0tLS0tOnw6LS0tLS0tLS0tOnwKfCBNb2RhICAgIHwgICAgU8OtICAgICB8ICAgIFPDrSAgICAgfCAgICBTw60gICAgIHwKfCBNZWRpYW5hIHwgICAgTm8gICAgIHwgICAgU8OtICAgICB8ICAgIFPDrSAgICAgfAp8IE1lZGlhICAgfCAgICBObyAgICAgfCAgICBObyAgICAgfCAgICBTw60gICAgIHwKCi0gICBNb2RhIGFwbGljYSBwYXJhIGN1YWxxdWllciB0aXBvIGRlIHZhcmlhYmxlLCBwZXJvIG1lbm9zIMO6dGlsLgoKLSAgIE1lZGlhIGFwbGljYSBzb2xvIHBhcmEgdmFyaWFibGVzIG51bcOpcmljYXMsIHBlcm8gbcOhcyDDunRpbC4KCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKIyBNZWRpZGFzIGRlIGRpc3BlcnNpw7NuCgotICAgRGVzY3JpYmlyIGxhIGNlbnRyYWxpZGFkIG5vIGVzIHN1ZmljaWVudGUuCiAgICBEb3MgZGlzdHJpYnVjaW9uZXMgcHVlZGVuIHRlbmVyIGxhIG1pc21hIG1lZGlkYSBkZSB0ZW5kZW5jaWEgY2VudHJhbCwgcGVybyBkaWZlcmVudGVzIHJlYWxpZGFkZXMuCgotICAgRWplbXBsbzogZGlzdHJpYnVjacOzbiBkZSBwdW50YWplIGVuIMOhcmVhIG1hdGVtw6F0aWNhIGRlIHBydWViYSBQSVNBIGFwbGljYWRhIGVuIDIgcGHDrXNlcyBwdWVkZW4gdGVuZXIgbGEgbWlzbWEgbWVkaWEsIHBlcm8gZGlmZXJlbnRlIHZhcmlhY2nDs24uCgotICAgwr9Dw7NtbyBkZXNjcmliaXLDrWEgbGFzIGRpZmVyZW5jaWFzIGVudHJlIGVuIGxvcyBwdW50YWplcyBkZSBsYSBwcnVlYmEgZWwgUGHDrXMgQSB5IGVsIFBhw61zIEI/CgohW10oZGlzdHIucG5nKXt3aWR0aD0iNjMxIn0KCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKIyMgUmFuZ28KCi0gICBEaWZlcmVuY2lhIGVudHJlIGVsIHZhbG9yIG3DoXhpbW8geSBlbCBtw61uaW1vLgogICAgRW4gZWplbXBsbyBkZSBwb2xpY8OtYXM6IDI1OS0zID0gMjU2LgogICAgRXMgbGEgZGlmZXJlbmNpYSBlbnRyZSBsYSBjb21pc2Fyw61hIGNvbiBtw6FzIGVmZWN0aXZvcyB5IGxhIGNvbWlzYXLDrWEgY29uIG1lbm9yIG7Dum1lcm8gZGUgZWZlY3Rpdm9zLgoKLSAgIE5vIHVuIHVuYSBtZWRpZGEgbXV5IMO6dGlsLgoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgojIyBSYW5nbyBpbnRlcmN1YXJ0aWwKCi0gICBTZSB2ZXLDoSBjdWFuZG8gc2UgdmVhbiBwZXJjZW50aWxlcy4KCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKIyMgRGVzdmlhY2nDs24gZXN0w6FuZGFyCgotICAgQ2FkYSBvYnNlcnZhY2nDs24gZXN0w6EgYSB1bmEgImRpc3RhbmNpYSIgZGUgbGEgbWVkaWEuCiAgICBFc3RhIGRpc3RhbmNpYSBzZSBsbGFtYSBkZXN2aWFjacOzbiAkKHhfaS1cYmFye3h9KSQKCi0gICBPYnNlcnZhY2lvbmVzIHBvciBlbmNpbWEgZGUgbGEgbWVkaWEgdGVuZHLDoW4gZGVzdmlhY2lvbmVzIHBvc2l0aXZhcy4KICAgIE9ic2VydmFjaW9uZXMgcG9yIGRlYmFqbyBkZSBsYSBtZWRpYSB0ZW5kcsOhbiBkZXN2aWFjaW9uZXMgbmVnYXRpdmFzLgoKLSAgIE5vIHNlIHB1ZWRlIGNhbGN1bGFyIHVuIHByb21lZGlvIGRlIGRlc3ZpYWNpb25lcyBwb3JxdWUgdmFsb3JlcyBwb3NpdGl2b3Mgc2UgY2FuY2VsYW4gY29uIG5lZ2F0aXZvcy4KCi0gICBTZSBlbGV2YSBhbCBjdWFkcmFkbyBsYXMgb2JzZXJ2YWNpb25lcyBwYXJhIHF1ZSB0b2RhcyBzZWFuIHBvc2l0aXZhcy4KICAgIFNlIHByb21lZGlhbiBlc2FzIGRlc3ZpYWNpb25lcyBhbCBjdWFkcmFkby4KCi0gICBMYSBkZXN2aWFjacOzbiBlc3TDoW5kYXIgZXMgbGEgcmHDrXogY3VhZHJhZGEgZGUgZXNlIHByb21lZGlvIGRlIGRlc3ZpYWNpb25lcyBhbCBjdWFkcmFkby4KCi0gICBTZSBkaXZpZGUgZW50cmUgbi0xIHBvciB1biB0ZW1hIHTDqWNuaWNvLgoKJCQKXHN1bSBcZnJhY3soeF9pLVxiYXJ7eH0pXjJ9IHtuLTF9IAokJAoKUGFyYSB2ZXIgdW4gY8OhbGN1bG8gYsOhc2ljbyBkZSBsYSBkZXN2aWFjacOzbiBlc3TDoW5kYXIgZW4gRXhjZWwsIHB1ZWRlIGVudHJhciBbYXF1w61dKGh0dHBzOi8vZG9jcy5nb29nbGUuY29tL3NwcmVhZHNoZWV0cy9kLzFDQ3pPdGZYZjdJZ3pfS2NiY3BJdHpVNzFmV2VNdFRsaT9ydHBvZj10cnVlJmF1dGh1c2VyPWFydHVyby5tYWxkb25hZG8lNDBwdWNwLnBlJnVzcD1kcml2ZV9mcykuCgotICAgQ29tbyBzZSBvYnNlcnZhIGVuIGVsIGdyw6FmaWNvIGFudGVyaW9yLCBsYSBkZXN2aWFjacOzbiBlc3TDoW5kYXIgZXMgbcOhcyDDunRpbCBjdWFuZG8gc2UgY29tcGFyYXIgZG9zIGRpc3RyaWJ1Y2lvbmVzLiBTZSBjb21wYXJhIGxhIGNlbnRyYWxpZGFkIHkgbGEgZGlzcGVyc2nDs24gZGUgdW5hIHZhcmlhYmxlIGVudHJlIGRvcyBncnVwb3MgKG8gZG9zIGRpc3RyaWJ1Y2lvbmVzKS4KCiMgQmlibGlvZ3JhZsOtYQo=