1 Preparación del ambiente de trabajo

Antes de iniciar con la revisión del tema y los comandos para realizar el análisis de los datos, es importante preparar el ambiente de trabajo. Para ello recomiendo la configuración de 3 apartados básicos: idioma, librerías y la carga de los datos.

1.1 Idioma

R y R Studio son plataformas que trabajan con el idioma inglés de manera nativa, sin embargo en caso de desear que el software pueda revisar y leer algunos signos de puntuación correspondientes a otros idiomas, se debe realizar un ajuste a la configuración del lenguaje. Aquí se propone modificarlo para que se puedan distinguir los signos del idioma español, para ello se presentan dos opciones para lograrlo.

Primer opción:

Sys.setlocale("LC_ALL", "en_US.UTF-8")
## [1] "en_US.UTF-8/en_US.UTF-8/en_US.UTF-8/C/en_US.UTF-8/en_US.UTF-8"

Otra alternativa consiste en:

Sys.setenv(LANG = "esp")

1.2 Librerías

También es importante cargar las librerías que se utilizarán posteriormente. Al hacerlo al inicio del proceso de trabajo se impedirá que ocurran “bloqueos” posteriores durante el flujo de la escritura de los comandos en R. Por ello, aquí se recomienda activarlas al momento de la preparación del ambiente de trabajo.

En este documento, el análisis de los datos se apoyará en dos librerías: tidyverse y PerformanceAnalytics, así como de varios comandos del sistema base de R.

El primer paso para utilizar dichas librerías consiste en descargarlas e instalarlas en el sistema operativo en que se esté trabajando, para ello se utiliza el comando install.packages() de la siguiente manera:

```
install.packages("tidyverse)
install.packages("PerformanceAnalytics")
install.packages("EFAtools")
```

Una vez que las librerías se instalaron correctamente, el segundo paso consiste en su “activación”. Para ello se utiliza el comando library() de la siguiente manera:

library(tidyverse)
## ── Attaching packages ─────────────────────────────────────── tidyverse 1.3.1 ──
## ✓ ggplot2 3.3.5     ✓ purrr   0.3.4
## ✓ tibble  3.1.6     ✓ dplyr   1.0.8
## ✓ tidyr   1.2.0     ✓ stringr 1.4.0
## ✓ readr   2.1.2     ✓ forcats 0.5.1
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## x dplyr::filter() masks stats::filter()
## x dplyr::lag()    masks stats::lag()
library(PerformanceAnalytics)
## Loading required package: xts
## Loading required package: zoo
## 
## Attaching package: 'zoo'
## The following objects are masked from 'package:base':
## 
##     as.Date, as.Date.numeric
## 
## Attaching package: 'xts'
## The following objects are masked from 'package:dplyr':
## 
##     first, last
## 
## Attaching package: 'PerformanceAnalytics'
## The following object is masked from 'package:graphics':
## 
##     legend
library(EFAtools)
library(factoextra)
## Welcome! Want to learn more? See two factoextra-related books at https://goo.gl/ve3WBa

1.3 Carga de los datos

El tercer paso recomendable al momento de preparar el ambiente de trabajo consiste en la carga de los datos en la sección del “ambiente” (environment).

Para ello, el primer paso consiste en contar con una copia de los datos y que esté disponible en el disco duro del dispositivo en que se esté realizando el trabajo analítico en R.

En el presente documento se trabajará con la base de datos (data.frame) generado por el proyecto Varieties of Democracy (V-DEM), y del que se extrae la matriz correspondiente a los indicadores centrales para construir el índice de democracia propuesto en dicho proyecto, para su versión 12 y disponible aquí.

Tras la descarga del paquete de datos, se debe tener presente la extensión con la que fue guardado el archivo que contiene a la matriz de datos (data.frame), y que se encuentra en formato .csv(comma separated values).

Una vez que se cuenta con el archivo de datos guardado en el disco duro y que se conoce la extensión con que ha sido guardado dicho archivo, se puede proceder a “abrirlo” y “cargarlo” en el ambiente de R Studio. Para ello se utiliza el comando read.csv(), y este proceso se debe guardar como un objeto nuevo.

datos <- read.csv("~/Dropbox/R/V-Dem-CY-Core-v12.csv", header = TRUE)

Hasta aquí se considera que se ha preparado el ambiente de trabajo de manera básica.

2 Introducción al Análisis de Componentes Principales (PCA)

El Análisis de Componentes Principales (o Principal Component Analysis [PCA] por sus siglas en inglés) es una técnica dentro del conjunto de métodos agrupados en la categoría de Análisis Factorial1.

Las técnicas agrupadas dentro de la categoría de análisis factoriales son referidas como “técnicas sin variables dependiendientes” (Tacq, 1998, p. p267) , ya que no se basan en modelos causales sino que trabajan con todas las variables contenidas en un data.frame de manera simultánea.

En estos modelos “se deja que sea el análisis estadístico el que decida si existe una estructura”oculta” que se pueda reconocer en el material (datos). A este formato básico, o tal vez se debería decir que ante la ausencia de un formato básico (en los datos), se le denomina estructura latente. El análisis factorial se puede considerar como una técnica de análisis de la estructura latente.” (Tacq, 1998, p. 266)

Este tipo de análisis es muy útil si se desea examinar si un concepto puede ser “partido” (split) en un número diverso de características latentes (dimensiones), y de esa manera se puede simplificar el trabajo del análisis de las variables.

En los análisis factoriales se requiere contar con el registro de distintos casos, a la vez que se cuenta con sus valores u observaciones para más de dos variables. Dichas observaciones (variables o indicadores) deben ser medidos en escala intervalar. Y se asume que cada caso en sí mismo es diferente del resto, a partir de las variables que son de interés para el análisis.

3 Reducción de dimensiones en PCA

La manera de simplificar el proceso de análisis de las variables ocurre a través de la “reducción de dimensiones” (latentes), esto se refiere a la creación de variables nuevas que servirán de resúmenes de las variables originales incluidas en el análisis. Al final se espera que estas últimas consistan en un número menor de “columnas” en la matriz de datos respecto de las variables originales y, así, trabajar posteriormente con las nuevas dimensiones o “factores”.

Un factor se puede entender como “un concepto-madre (mother-concept) que ofrece un resumen de un subgrupo de indicadores, que miden lo mismo de manera más amplia. En otras palabras, consideramos a los diagramas basados en el análisis factorial como modelos de medición y no como modelos causales.” (Tacq, 1998, p 267)

Sin embargo, al integrar varias variables o ítems en otras dimensiones (latentes), se pueden caer en alguna de las situaciones extremas: la primera consiste en que todos los ítems estén muy correlacionados entre sí en donde “en este caso el material de investigación (datos) tendrá una estructura basada en una dimensión, y para todos los indicadores (ítems o variables) mostrarán pesos (loadings) elevados en una variable latente (factor).” (Tacq, 1998, pp. 266–267).

El otro extremo consiste en que para cada uno de los indicadores utilizados (ítems o variables), cada uno de ellos miden cosas muy diferentes entre sí, y por ello se crean una nueva dimensión para cada uno de los indicadores. “Para esta solución con un factor para cada indicador no se aprenderá nada pues la estructura latente para los datos será tan compleja como lo fue la estructura manifiesta original de los datos.” (Tacq, 1998, p. 267)

En el análisis PCA no se refiere a las variables latentes como “factores” sino como “componentes”, y en esta técnica se generarán tantos componentes como indicadores sean incluidos en el análisis. (Tacq, 1998, p. 267)

4 Combinación de las variables en los Componentes

Si bien el método del PCA es una técnica que permite reducir las dimensiones de una matriz de datos a partir de la construcción de componentes \(C_i\), y así simplificar el análisis de los datos a la par de identificar la estructura latente de las variables incluidas en el análisis, también se reconoce que los objetivos de investigación para los que se ha utilizado el PCA se centran, de acuerdo con Tacq (1998, p. 270) en:

  1. Reducción de la multiplicidad a pocas unidades: desbrozar patrones complejos de asociaciones entre variables para, así, encontrar su esencia.
  2. Análisis de estructura latente: identificación de características latentes las que ocultan una estructura oculta en los datos.
  3. Desarrollo de tipologías empíricas a partir de las variables utilizadas.
  4. Reducción de dimensiones: reducción el espacio de \(n\) variables a otro espacio de \(p\) dimensiones, donde \(p\) menor a \(n\).
  5. Construcción de índices o escalamiento: examinación sobre la posibilidad de reducir \(n\) variables a una dimensión y, de ser posible, construir un índice de una sola dimensión o escala (caso especial de reducción de dimensiones con \(p = 1\)).
  6. Ortogonalización de los predictores: transformación de la matriz de variables independientes en un análisis de regresión múltiple con multicolinealidad sustancial.

En el PCA, inicialmente, cada componente se presenta como una combinación lineal de los indicadores incluidos, de tal manera que esta mezcla maximice la variabilidad que se extrae de dichos indicadores o variables. Por lo que cada componente es una combinación lineal de los indicadores que, además, han sido estandarizados de la manera siguiente para una situación con 3 componentes, de acuerdo con Tacq (1998, p. 268).

\[C_i = u_{i1}z_1 + u_{i2}z_2 + u_{i3}z_3\]

Donde:

  • \(C_i\) = componente \(-i\),
  • \(x_i\) = la variable \(-i\) utilizado en el análisis, y se incluye en unidades estandarizadas, por lo que \(z_i\),
  • \(u_i\) = consiste en valor para cada coeficiente del factor o componente.

Pero para identificar estos componentes, que son mezclas de los indicadores o variables incluidas en el análisis, primero se deben cumplir 2 condiciones básicas, que restringen la búsqueda de combinaciones lineales de las variables:

  1. Los componentes deben de ser perpendiculares entre sí (requisito de ortogonalidad).
  2. El primer componente debe de extraer la mayor variabilidad posible de las variables originales, el segundo componente debe extraer la mayor variabilidad posible de la variabilidad restante, etc., así hasta que toda la variabilidad sea extraída (método del eje principal [principal axis method]). (Tacq, 1998, p. 269)

En el proceso de construcción de los componentes, una característica importante del PCA consiste en que se calcularán tantos componentes como variables se hubieran incluido en el análisis, y entre todos se abarca la totalidad de la variación contenida en todas las variables de manera simultánea. (Tacq, 1998, p. 267)

El modelo PCA también puede ser visto de otra manera, donde cada variable original se puede concebir como una combinación lineal de los componentes generados en el análisis, de la siguiente manera para una situación con 3 componentes: (269)

\[z_i = a_{i1}C_1 + a_{i2}C_2 + a_{i3}C_3\]

Donde:

  • \(a_i\) = peso de cada componente (component loading).

Los pesos de cada componente (component loadings) “son los pesos beta’s (beta weights) de una regresión múltiple de la variable (estandarizada), que se presenta como una función de los componentes calculados. Estos pesos beta’s son iguales a las correlaciones calculadas entre cada variable y cada componente.” (Tacq, 1998, p. 269)

5 Representación geométrica de los datos en PCA

El PCA se apoya en la representación geométrica de los datos, donde se trata de la rotación de un cubo que, originalmente, se ha construido con las variables de la matriz de datos. (Tacq, 1998, p. 269)

De acuerdo con Tacq (1998, p. 270) cada variable se representa en un espacio dimensional (una recta), y entre sí todas éstas son perpendiculares, formando un cubo. Si las variables están estandarizadas, entonces el origen del cubo se ubica en un centroide; este es el punto dentro del cubo en donde se concentran las medias de cada dimensión. Y sobre cada recta se representa la posición de cada uno de los casos de los que se extrajo la información.

En el PCA se busca delinear una recta a través del origen (centroide), de manera que la proyección de los casos sobre la línea permita contener a la mayor cantidad de dispersión (maximal variance). Cada una de dichas líneas es una combinación lineal (o componente).

Si llegase a ocurrir que todos los casos (representados por puntos sobre la gráfica) se posicionan sobre una recta (situación de multicolinealidad perfecta), entonces dicho componente representaría exhaustivamente a toda la información de la matriz de datos.

En caso de calcular más de un componente, los subsiguientes serán siempre perpendiculares al anterior y partirán del origen o centroide, y buscarán siempre maximizar la variación al cruzar a los casos.

A partir de dichas combinaciones lineales o componentes se forma un nuevo cubo, distinto al que se formó a partir de las variables originales, pero este se rota alrededor el origen del cubo hacia el nuevo cubo (formado por los componentes), mientras que los puntos o casos permanecen en su lugar. (Tacq, 1998, p. 270)

A partir de dicha representación geométrica, la técnica del PCA se centra en los siguientes objetivos particulares o procedimentales (Tacq, 1998, p. 271):

  1. Encontrar tantos componentes así como variables originales de tal manera que los componentes sean mutuamente ortogonales y secuencialmente extraigan la variación máxima de las variables. Para esto se debe examinar la eigenestructura de la matriz de datos \(X\) o la correlación de la matriz \(R\). Los eigenvalores son las variantes de las proyecciones de puntos sobre cada uno de los componentes. Los eigenvectores son los cosenos de dirección, los que indican qué tanto debe rotarse el espacio de la variable original.
  2. Reducción del número de dimensiones mediante la examinación sobre cuáles de las variables cuentan con un peso elevado (high loading) sobre cada componente, buscando la “estructura simple”. Esto se logra mediante la examinación de la matriz \(A\) de pesos de los componentes (component loadings), así como mediante el cálculo de las medidas de redundancia de cada componente.
  3. Rotación del espacio resultante de cada componente a un nuevo espacio, el que puede ofrecer una estructura más simple así como una mejor interpretación en términos del contenido.

Tomando estos supuestos y requisitos en consideración, es que se puede avanzar en la realización del procedimiento del PCA en R y, posteriormente, analizar los resultados arrojados por el software, como se verá en la sección siguiente.

6 Realización y análisis de los resultados del PCA

A continuación se muestran los comando que se utilizarán para la realización del análisis de PCA, para ello se trabajará con la versión 12 de la matriz de datos generada en el proyecto V-DEM (como se refirió arriba).

Las variables seleccionadas para el análisis fueron:

  1. Índice de democracia deliberativa (v2x_delibdem).
  2. Índice de democracia igualitaria (v2x_egaldem).
  3. Índice de democracia electoral (v2x_polyarchy).
  4. Índice de democracia participativa(v2x_partipdem).
  5. Índice de democracia liberal (v2x_libdem).

Y se revisarán los valores registrados a partir de 19742 y hasta el último año de registro, para lo que se filtraron los datos para, así, crear una submuestra denominada datos_pca de la siguiente manera:

datos_pca <- datos %>%
  filter (year > 1973) %>%
  select(v2x_polyarchy, v2x_libdem, v2x_partipdem, v2x_delibdem, v2x_egaldem)

Estas variables son utilizadas por el proyecto V-DEM para medir cinco aspectos relevantes, las que -consideran- permiten estructurar al régimen democrático. De manera que la democracia es entendida como la combinación de estos cinco elementos.

Al retomarlos en el presente análisis, se puede considerar que el PCA ayudará a identificar la estructura latente que existe entre estas variables y, así, tener un acercamiento más “simple” sobre el régimen democrático.

6.1 Exploración inicial de la asociación entre las variables

Una primer manera para observar la asociación o variación existente entre las variables es mediante una comparación de variables en pares, para lo que se usa el comando chart.Correlation() de la librería PerformanceAnalytics:

chart.Correlation(datos_pca)
Gráfica de correlaciones en pares de variables.

Gráfica de correlaciones en pares de variables.

Si bien se pueden identificar los niveles de asociación entre las variables -que son muy altas-, ahora surge la interrogante por dilucidar si esto ocurre porque, en el fondo, está midiendo el mismo fenómeno aunque con indicadores diferentes.

Y, en caso de medir aspectos diferentes de un fenómeno, y que eso valide los indicadores utilizados en el análisis, el método de las correlaciones entre variables no permite identificar si alguna de ellas permite “simplificar” la estructura de la matriz de datos y, así, identificar una variable “resumen”, a la par de permita observar las diferencias en el comportamiento de cada caso entre todas las variables simultáneamente.

Ante esta situación, es recomendable avanzar en la realización del análisis PCA, que permitirá construir un gráfico en el que se podrá “reducir las dimensiones” para, así, facilitar el análisis estadístico posterior. De esta manera, también, se podrá identificar una “estructura más simple” para la matriz de datos.

7 Realización del PCA

A continuación se revisará el comando básico para la realización del análisis PCA en R, con lo que se avanzará en el proceso de reducción de dimensiones, y del que se generarán varios componentes o dimensiones nuevas a partir de la matriz de datos originales.

Sin embargo, previo a la realización de dicho análisis es importante evaluar su la matriz de datos original (tanto los casos como sus variables), son pertinentes para la realización del PCA, para ello se utilizará la prueba estadística de Bartlett, como se verá a continuación.

7.1 Prueba estadística de las correlaciones en la matriz de datos

Un elemento a tener en consideración previo a la realización el análisis PCA consiste en la evaluación de las correlaciones existentes entre las variables originales, con el fin de descartar que éstas son idénticas entre sí. Lo que implicaría la imposibilidad de realizar un proceso de reducción de dimensiones.

Para ello es importante la realización de una prueba estadística que ayuda a evaluar, inicialmente, si es pertinente avanzar en la realización de un análisis factorial. Dicha prueba, propuesta por Bartlett (1950) se realiza sobre la matriz de correlaciones de las unidades de la población, que asume que se distribuye como una \(\chi^2\), donde la hipótesis nula plantea que las variables no están correlacionadas entre sí. 

Si dicha hipótesis nula no es rechazada, entonces no hace sentido realizar un análisis factorial debido a que el espacio original no puede ser reducido. Si la \(H0\) sí es rechazada, entonces significa que sí tiene sentido realizar una reducción del espacio definido por las variables incluidas. (Tacq, 1998, p. 280)

A continuación se realiza dicho test mediante el comando BARTLETT(), que es parte de la librería EFAtools(), de la siguiente manera:

EFAtools::BARTLETT(datos_pca, #objeto data frame con las variables de interés
  N = NA, # si se requiere, se establece el tamaño de casos a retomar en el análisis
  use = c("pairwise.complete.obs",  #argumento para definir los tipos de casos a considerar en el análisis
          "all.obs", 
          "complete.obs", 
          "everything",
          "na.or.complete"),
  cor_method = "pearson") # definición del método de evaluación de las correlaciones
## ℹ 'x' was not a correlation matrix. Correlations are found from entered raw data.
## 
## ✓ The Bartlett's test of sphericity was significant at an alpha level of .05.
##   These data are probably suitable for factor analysis.
## 
##   𝜒²(10) = 102634.7, p < .001

A partir de los datos presentados por la prueba estadística de Bartlett, se puede rechazar la \(H_0\) y se acepta que los datos son pertinentes para avanzar en la realización de un análisis factorial.

7.2 Implementación del PCA en R Studio

La realización del análisis PCA se realiza a través del comando pcomp(), que es parte del sistema base de R. Los argumentos centrales a utilizar serán:

  • x = consiste en la matriz numérica o data.frame() que contiene los datos o variables que se incluirán en el análisis.
  • center = valor lógico (TRUE / FALSE), que indica si las variables deben centrarse en un valor “cero.”
  • scale = valor lógico (TRUE / FALSE), que indica si los valores originales de las variables de interés deberán estandarizarse para, así, contar con una varianza igual a 1, y que esto se aplique antes de la realización del análisis PCA.
  • na.action = función que indica la manera en que se deben procesar los casos en los que ocurren valores perdidos (NA).

Asimismo es importante que los resultados del análisis PCA sean guardados como un objeto nuevo, en el ambiente de R Studio.

pca1 <- prcomp(~v2x_polyarchy + v2x_libdem + v2x_partipdem + v2x_delibdem + v2x_egaldem, # selección de las variables a incluir en el análisis.
       data = datos_pca, #objeto fuente de los datos.
       center = TRUE, # se acepta que el centro de las dimensiones tenga el valor de cero.
       scale = TRUE,  # se acepta que las variables originales sean estandarizadas.
       na.action = na.omit) #se establece que los valores perdidos no sean incluidos en el análisis.
pca1
## Standard deviations (1, .., p=5):
## [1] 2.2058415 0.2468860 0.1849283 0.1582510 0.1186125
## 
## Rotation (n x k) = (5 x 5):
##                     PC1         PC2        PC3         PC4          PC5
## v2x_polyarchy 0.4471347  0.45444321 -0.2654256  0.66404776 -0.286603765
## v2x_libdem    0.4505066 -0.09605931 -0.1978628  0.05596678  0.863443363
## v2x_partipdem 0.4463073  0.38787115  0.7634150 -0.25992100  0.002076133
## v2x_delibdem  0.4484520  0.04376036 -0.5105859 -0.66672971 -0.302901466
## v2x_egaldem   0.4436383 -0.79491822  0.2165618  0.20933433 -0.283848961
summary(pca1)
## Importance of components:
##                           PC1     PC2     PC3     PC4     PC5
## Standard deviation     2.2058 0.24689 0.18493 0.15825 0.11861
## Proportion of Variance 0.9731 0.01219 0.00684 0.00501 0.00281
## Cumulative Proportion  0.9731 0.98534 0.99218 0.99719 1.00000

Este comando da como resultado un objeto tipo “lista” que está integrado por 7 elementos (sdev, rotation, center, scale, x, call y na.action), entre los más relevantes para el análisis del PCA consisten en:

  1. $ X: contiene a los componentes principales que se utilizan para definir la gráfica PCA. Contiene tantas columnas como variables. Usualmente se usan las dos columnas primeras.
  2. $ sdev: se refiere a las distancias estandarizadas de cada caso dentro de cada uno de los componentes principales.
  3. $ rotation: se refiere al peso de cada variable sobre cada componente principal.

Por su parte, en la consola se muestra una matriz de correlaciones entre cada una de las variables incluidas en el análisis con respecto a cada uno de los componentes calculados. Aquí se debe recordar que se crean tantos componentes (columnas) como variables (filas) se incluyeron en el análisis.

Esta matriz de correlaciones es mejor denominada como la “matriz de pesos” por componente (component loadings matrix).

De manera complementaria, con el comando summary() que integra al objeto en que se guardaron los resultados del análisis PCA, se manda a llamar una tabla complementaria en la que se presentan tres filas con información relevante para cada componente, estas consisten en:

  1. Standard deviation: desviación estándar o eigenvalor con que se mide la varianza al interior de cada componente.
  2. Proportion of Variance: proporción de la varianza, con la cantidad de varianza del universo de los casos que es captada por cada componente \(C_i\).
  3. Cumulative Proportion: proporción acumulada de la varianza, que consiste en la suma de las proporciones de varianza explicada por cada compontente \(C_i\) y los componentes antecedentes \(C_{i-1}\). La suma todal de las proporciones dará como resultado el valor de 1.

7.3 Lectura de la matriz de pesos de componentes

Esta matriz permite identificar las proporciones de varianza explicada por cada componente, pues contiene las correlaciones entre componentes y variables. Estos se encuentran en las celdas en que converge cada variable con cada uno de los componentes. (Tacq, 1998, p. 279)

Los valores de dichos coeficientes de correlación permiten identificar el peso (loading) de cada una de las variables sobre cada uno de los componentes (\(C_i\)). De manera que, la variable que tiene una mayor correlación también tiene un mayor peso (loading) sobre el componente, y esto sirve para caracterizar al eje nuevo creado a partir de este último.

Además, el cuadrado del coeficiente de correlación se puede interpretar como la proporción de la varianza explicada. Por ej. el peso (loading) de \(x_1\) en \(C_1\) es de 0.4471347. Su cuadrado \((0.4471347) ^ 2 = 0.1999294\) significa que el 19.99% de la varianza de la variable \(x_1\) es explicada por el primer componente \(C_1\); mientras que la proporción de \(C_2\) que explica de la varianza de \(x_1\) es de \((0.45444321) ^ 2 = 0.2065186\), o el 20.65%, y así sucecivamente. La suma horizontal o por fila será del 100% para todas las variables en cada uno de los componentes, pues cada componente explica un porcentaje de la variabilidad de cada una de las variables \(x_i\).

La suma de los pesos cuadráticos en cada fila de la matriz es denominada “comunalidad”. La comunalidad de una variable en todos los componentes será igual a 1 en PCA. (Tacq, 1998, p. 279)

Al revisar las columnas de la matriz, la suma de los pesos cuadráticos de una columna, por ej. \(C_i\), es la suma de las proporciones de varianza de cada una de las variables incluidas que son explicadas por el componente \(C_i\). Esta suma es igual al eigenvalor (\(\lambda\)) del componente respectivo, por ej. \((C_1 r x_1)^2 + (C_1 r x_2)^2 + (C_1 r x_3)^2 = (\lambda)\). (Tacq, 1998, p. 279)

Donde:

  1. \((C_i r x_i)^2\) = cuadrado de la correlación del componente \(-i\) con la variable \(x_i\).
  2. \(\lambda\) = eigenvalor.

Los eigenvalores se pueden interpretar geométricamente como la extensión o distancia de las proyecciones de cada caso sobre cada uno de los componentes en los que están dispersos. En PCA, la suma de los eigenvalores es igual a la suma de varianzas de las variables estandarizadas (que es un número entero correspondiente a la cantidad de variables incluidas). 

A partir de esta propiedad, cada eigenvalor se puede expresar como una proporción de esta suma. Para el primer eigenvalor, esta proporción es \(\lambda_1 / \sigma_{\lambda_i}= *eigenvalor* / n_x = prc_{x1}\) explicado del total de la varianza de las variables incluidas, y así sucesivamente. (Tacq, 1998, p. 279)

8 Selección de los componentes principales

El método de PCA -como se refirió arriba- es una técnica que permite trabajar con una matriz en la que no se cuenta con una variable dependiente, pues la meta analítica está puesta en identificar la “estructura latente” que existe detrás de las variables analizadas. Esto da paso a que los resultados arrojados por el análisis PCA no necesariamente sean concluyentes en términos de “causas-efectos”.

En este sentido, se considera que el análisis PCA es una técnica que se apoya, en gran medida, en la subjetividad del analisista, especialmente, al momento de seleccionar la cantidad de componentes necesarios para simplificar la estructura de la matriz de datos analizada.

Esto se traduce en que no existen criterios estadísticos concluyentes para definir la cantidad componentes a seleccionar. Pero se pueden identificar algunas pautas existentes -y recurrentes en los análisis- para avanzar en la selección de la cantidad de componentes a recuperar tras la reducción de dimensiones. Estos consiste en:

8.1 Criterio basado en el eigenvalor

El primer criterio fue propuesto por Kaiser (Kaiser, 1960) y consiste en “mantener solo los componentes cuyo eigenvalor es mayor a 1.” (Tacq, 1998, p. 280)

Este criterio suele se el default en los programas de computación, pero se debe observar con detenimiento la matriz de pesos (loadings) para evaluar si las correlaciones entre variables y el resto de los componentes que no alcanzan a cubrir dicho criterio, también es alto. 

Esto supone que vale la pena re considerar incluir los componentes que tiene correlaciones altas con variables, aún cuando su eigenvalor esté por debajo del valor de 1, pues pueden aportar elementos teóricos explicativos. (Tacq, 1998, p. 280)

8.2 Criterio gráfico

Otro criterio se apoya en la gráfica de los eigenvalores en un scree plot y su prueba en un scree test, desarrollado por Cattel (Cattell, 1966). Esta consiste en graficar la distribución de los componentes, ordenados por sus eigenvalores y, allí, identificar el “codo” de la distribución. Será en esa posición donde se defina la cantidad de componentes a incluir. (Tacq, 1998, p. 280)

La manera de generar dicha gráfica es a partir de:

var_explicada = pca1 $ sdev ^ 2 / sum(pca1 $ sdev ^ 2) #vector con la varianza explicada por cada componente
qplot(c(1:5), var_explicada) + 
  geom_line() + 
  xlab("Componente Principal") + 
  ylab("Varianza Explicada") +
  ggtitle("Scree Plot")
Scree plot

Scree plot

En esta gráfica se observa que en el eje X (horizontal) se encuentra distribuidos cada uno de los componentes generados, mientras que en el eje Y (vertizal) se mide la proporción de varianza explicada (del total del universo de casos contenidos en la matriz de datos) que explica o abarca cada uno de los componentes \(C_i\).

El objetivo en dicho gráfico consiste en identificar la ubicación del “codo” en la curva que une a las proporciones de varianza explicada por cada componente. Pues el lugar o componente en que se encuentre dicho doblez en la curva, servirá para indicar la cantidad de nuevas dimensiones a mantener para el análisis estadístico posterior.

Como se observa en la gráfica del “scree plot”, el codo se ubica en la posición del segundo componente, por lo que la decisión del analista tendría que partir de, primero, aceptar la inclusión del primer componente, mientras que deberá examinar la matriz de “pesos” (loadings) y los valores de las correlaciones existentes entre las variables con el componente 2 \(C_2\) para, así, decidir si su inclusión es pertinente teóricamente.

9 Graficación de los Componentes Principales

Como se mencionó arriba, el método PCA se apoya -en gran medida- en la representación geométrica de los componentes, en los que se grafican la proyección de cada caso (fila) de la matriz de datos sobre cada una de las nuevas dimensiones generadas y seleccionadas en el análisis de reducción de dimensiones.

En este gráfico nuevo se toman en consideración las correlaciones existentes entre todos los casos para todas sus variables y se mapean en un plano de \(p\) dimensiones. En su interior, los casos que registren correlaciones altas entre sí se tienden a ubicar o agrupan juntos.

La manera de elaborar dicho gráfico, una vez que se definió que se consideraría 2 componentes para la reducción de las dimensiones de la matriz de datos, se puede realizar con el comando biplot() del sistema base de R, pero a continuación se realiza con el comando fviz_pca_biplot() de la libería factoextra() de la siguiente manera:

fviz_pca_biplot(pca1, #matriz de datos que contiene los resultados del análisis PCA
                geom = "point", #representación gráfica o proyección de cada uno de los casos 
                col.var = "red", #definición del color para la representación de las variables
                col.ind = "grey") #definición del color para la proyección de los casos
Gráfico de 2 componentes principales.

Gráfico de 2 componentes principales.

A partir de dicho gráfico se observa lo siguiente:

  1. Ambos ejes se encuentran es escalas estandarizadas.
  2. El eje X se corresponde con el \(C_1\) y el porcentaje de variabilidad que explica de los casos.
  3. El eje Y se corresponde con el \(C_2\) y el porcentaje de variabilidad que explica de los casos.
  4. Cada uno de los puntos representados dentro del plano cartesiano se corresponde con la proyección de cada uno de los casos (filas) contenidos en la matriz de datos original sobre cada uno de los componentes.
  5. Se representan las variables originales incluidas en el análisis (en color rojo).

A partir de esta representación se puede observar la proyección de cada uno de los casos sobre cada una de las dimensiones o componentes seleccionados. Y, gráficamente, se puede observar la posición de cada una de las variables sobre los ejes que representa cada uno de los componentes. A partir de ubicar la variable que se alinea sobre la línea punteada (la representación de cada dimensión), esto ayuda a identificar cuál de éstas es la que tiene más “peso” (loading) sobre dicho componente.

Identificar el peso de la variable sobre cada dimensión ayuda a interpretar el sentido teórico de cada componente.

En la gráfica anterior se puede observar que las variables de “democracia liberal” (v2x_libdem) y de “democracia deliberativa” (v2x_delibdem”) son las que ejercen mayor influencia sobre el primer componente \(C_1\). En cambio, sobre la segunda dimensión \(C_2\) no necesariamente alguna de las variables ejerce un peso (loading) decisivo sobre su comportamiento.

Referencias

Bartlett, M. S. (1950). Test of significance of factor analysis. British Journal of Psychology, 3, 203–220.
Cattell, R. B. (1966). Handbook of multivariate experimental psychology. Rand McNally.
Huntington, S. P. (1994). La tercera ola. La democratizacióna finales del siglo XX. Paidós.
Kaiser, H. F. (1960). The application of electronic computers to factor analysis. Educational and Psychological Measurement, 20(1), 141–151.
Tacq, J. (1998). Multivariate analysis techniques in social science research. From problem to analysis. Sage.

  1. Otra de las técnicas más utilizadas dentro de este conjunto corresponde al Análisis de Factores Principales (o Principal Factor Analysis [PFA]), pero ambas parten de supuestos teóricos distintos al momento de procesar los datos y en su interpretación.↩︎

  2. El año de 1974 es considerado como el inicio de la “tercera ola de la democracia” a partir del proceso de cambio político en Portugal, que fue denominado “la revolución de los claveles.” (Huntington, 1994)↩︎

LS0tCnRpdGxlOiAiSW50cm9kdWNjaW9uIGFsIGFuw6FsaXNpcyBkZSBjb21wb25lbnRlcyBwcmluY2lwYWxlcyAoUENBKSIKYXV0aG9yOiAiR3VzdGF2byBNYXJ0w61uZXogVmFsZGVzIgpkYXRlOiAnYHIgZm9ybWF0KFN5cy5EYXRlKCkpYCcKb3V0cHV0OgogIGh0bWxfZG9jdW1lbnQ6CiAgICB0b2NfZmxvYXQ6IHRydWUKICAgIGNvZGVfZm9sZGluZzogc2hvdwogICAgdGhlbWU6IGpvdXJuYWwKICAgIHRvYzogdHJ1ZQogICAgdG9jX2RlcHRoOiA1LjAKICAgIGNvZGVfZG93bmxvYWQ6IHRydWUKICAgIG51bWJlcl9zZWN0aW9uczogdHJ1ZQpiaWJsaW9ncmFwaHk6IG1ldG9kb2xvZ2lhLmJpYgpjc2w6IGFwYS5jc2wKLS0tCgpgYGB7ciBzZXR1cCwgaW5jbHVkZT1GQUxTRX0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KGVjaG8gPSBUUlVFKQpgYGAKCiMgUHJlcGFyYWNpw7NuIGRlbCBhbWJpZW50ZSBkZSB0cmFiYWpvCgpBbnRlcyBkZSBpbmljaWFyIGNvbiBsYSByZXZpc2nDs24gZGVsIHRlbWEgeSBsb3MgY29tYW5kb3MgcGFyYSByZWFsaXphciBlbCBhbsOhbGlzaXMgZGUgbG9zIGRhdG9zLCBlcyBpbXBvcnRhbnRlIHByZXBhcmFyIGVsIGFtYmllbnRlIGRlIHRyYWJham8uIFBhcmEgZWxsbyByZWNvbWllbmRvIGxhIGNvbmZpZ3VyYWNpw7NuIGRlIDMgYXBhcnRhZG9zIGLDoXNpY29zOiBpZGlvbWEsIGxpYnJlcsOtYXMgeSBsYSBjYXJnYSBkZSBsb3MgZGF0b3MuCgojIyBJZGlvbWEKClIgeSBSIFN0dWRpbyBzb24gcGxhdGFmb3JtYXMgcXVlIHRyYWJhamFuIGNvbiBlbCBpZGlvbWEgaW5nbMOpcyBkZSBtYW5lcmEgbmF0aXZhLCBzaW4gZW1iYXJnbyBlbiBjYXNvIGRlIGRlc2VhciBxdWUgZWwgc29mdHdhcmUgcHVlZGEgcmV2aXNhciB5IGxlZXIgYWxndW5vcyBzaWdub3MgZGUgcHVudHVhY2nDs24gY29ycmVzcG9uZGllbnRlcyBhIG90cm9zIGlkaW9tYXMsIHNlIGRlYmUgcmVhbGl6YXIgdW4gYWp1c3RlIGEgbGEgY29uZmlndXJhY2nDs24gZGVsIGxlbmd1YWplLiBBcXXDrSBzZSBwcm9wb25lIG1vZGlmaWNhcmxvIHBhcmEgcXVlIHNlIHB1ZWRhbiBkaXN0aW5ndWlyIGxvcyBzaWdub3MgZGVsIGlkaW9tYSBlc3Bhw7FvbCwgcGFyYSBlbGxvIHNlIHByZXNlbnRhbiBkb3Mgb3BjaW9uZXMgcGFyYSBsb2dyYXJsby4KClByaW1lciBvcGNpw7NuOgoKYGBge3IgaWRpb21hMX0KU3lzLnNldGxvY2FsZSgiTENfQUxMIiwgImVuX1VTLlVURi04IikKYGBgCgpPdHJhIGFsdGVybmF0aXZhIGNvbnNpc3RlIGVuOgoKYGBge3IgaWRpb21hMn0KU3lzLnNldGVudihMQU5HID0gImVzcCIpCmBgYAoKIyMgTGlicmVyw61hcwoKVGFtYmnDqW4gZXMgaW1wb3J0YW50ZSBjYXJnYXIgbGFzIGxpYnJlcsOtYXMgcXVlIHNlIHV0aWxpemFyw6FuIHBvc3Rlcmlvcm1lbnRlLiBBbCBoYWNlcmxvIGFsIGluaWNpbyBkZWwgcHJvY2VzbyBkZSB0cmFiYWpvIHNlIGltcGVkaXLDoSBxdWUgb2N1cnJhbiAiYmxvcXVlb3MiIHBvc3RlcmlvcmVzIGR1cmFudGUgZWwgZmx1am8gZGUgbGEgZXNjcml0dXJhIGRlIGxvcyBjb21hbmRvcyBlbiBgUmAuIFBvciBlbGxvLCBhcXXDrSBzZSByZWNvbWllbmRhIGFjdGl2YXJsYXMgYWwgbW9tZW50byBkZSBsYSBwcmVwYXJhY2nDs24gZGVsIGFtYmllbnRlIGRlIHRyYWJham8uXAoKRW4gZXN0ZSBkb2N1bWVudG8sIGVsIGFuw6FsaXNpcyBkZSBsb3MgZGF0b3Mgc2UgYXBveWFyw6EgZW4gZG9zIGxpYnJlcsOtYXM6IGB0aWR5dmVyc2VgIHkgYFBlcmZvcm1hbmNlQW5hbHl0aWNzYCwgYXPDrSBjb21vIGRlIHZhcmlvcyBjb21hbmRvcyBkZWwgc2lzdGVtYSBiYXNlIGRlIGBSYC5cCgpFbCBwcmltZXIgcGFzbyBwYXJhIHV0aWxpemFyIGRpY2hhcyBsaWJyZXLDrWFzIGNvbnNpc3RlIGVuIGRlc2NhcmdhcmxhcyBlIGluc3RhbGFybGFzIGVuIGVsIHNpc3RlbWEgb3BlcmF0aXZvIGVuIHF1ZSBzZSBlc3TDqSB0cmFiYWphbmRvLCBwYXJhIGVsbG8gc2UgdXRpbGl6YSBlbCBjb21hbmRvIGBpbnN0YWxsLnBhY2thZ2VzKClgIGRlIGxhIHNpZ3VpZW50ZSBtYW5lcmE6XAoKICAgIGBgYAogICAgaW5zdGFsbC5wYWNrYWdlcygidGlkeXZlcnNlKQogICAgaW5zdGFsbC5wYWNrYWdlcygiUGVyZm9ybWFuY2VBbmFseXRpY3MiKQogICAgaW5zdGFsbC5wYWNrYWdlcygiRUZBdG9vbHMiKQogICAgYGBgCgpVbmEgdmV6IHF1ZSBsYXMgbGlicmVyw61hcyBzZSBpbnN0YWxhcm9uIGNvcnJlY3RhbWVudGUsIGVsIHNlZ3VuZG8gcGFzbyBjb25zaXN0ZSBlbiBzdSAiYWN0aXZhY2nDs24iLiBQYXJhIGVsbG8gc2UgdXRpbGl6YSBlbCBjb21hbmRvIGBsaWJyYXJ5KClgIGRlIGxhIHNpZ3VpZW50ZSBtYW5lcmE6CgpgYGB7ciBsaWJyZXJpYXMsIGNvbGxhcHNlID0gVFJVRX0KbGlicmFyeSh0aWR5dmVyc2UpCmxpYnJhcnkoUGVyZm9ybWFuY2VBbmFseXRpY3MpCmxpYnJhcnkoRUZBdG9vbHMpCmxpYnJhcnkoZmFjdG9leHRyYSkKYGBgCgojIyBDYXJnYSBkZSBsb3MgZGF0b3MKCkVsIHRlcmNlciBwYXNvIHJlY29tZW5kYWJsZSBhbCBtb21lbnRvIGRlIHByZXBhcmFyIGVsIGFtYmllbnRlIGRlIHRyYWJham8gY29uc2lzdGUgZW4gbGEgY2FyZ2EgZGUgbG9zIGRhdG9zIGVuIGxhIHNlY2Npw7NuIGRlbCAiYW1iaWVudGUiIChlbnZpcm9ubWVudCkuXAoKUGFyYSBlbGxvLCBlbCBwcmltZXIgcGFzbyBjb25zaXN0ZSBlbiBjb250YXIgY29uIHVuYSBjb3BpYSBkZSBsb3MgZGF0b3MgeSBxdWUgZXN0w6kgZGlzcG9uaWJsZSBlbiBlbCBkaXNjbyBkdXJvIGRlbCBkaXNwb3NpdGl2byBlbiBxdWUgc2UgZXN0w6kgcmVhbGl6YW5kbyBlbCB0cmFiYWpvIGFuYWzDrXRpY28gZW4gYFJgLlwKCkVuIGVsIHByZXNlbnRlIGRvY3VtZW50byBzZSB0cmFiYWphcsOhIGNvbiBsYSBiYXNlIGRlIGRhdG9zIChgZGF0YS5mcmFtZWApIGdlbmVyYWRvIHBvciBlbCBwcm95ZWN0byBbKioqVmFyaWV0aWVzIG9mIERlbW9jcmFjeSAoVi1ERU0pKioqXShodHRwczovL3d3dy52LWRlbS5uZXQvKSwgeSBkZWwgcXVlIHNlIGV4dHJhZSBsYSBtYXRyaXogY29ycmVzcG9uZGllbnRlIGEgbG9zIGluZGljYWRvcmVzIGNlbnRyYWxlcyBwYXJhIGNvbnN0cnVpciBlbCDDrW5kaWNlIGRlIGRlbW9jcmFjaWEgcHJvcHVlc3RvIGVuIGRpY2hvIHByb3llY3RvLCBwYXJhIHN1IHZlcnNpw7NuIDEyIHkgZGlzcG9uaWJsZSBbYXF1w61dKGh0dHBzOi8vd3d3LnYtZGVtLm5ldC9kYXRhL3RoZS12LWRlbS1kYXRhc2V0L2NvdW50cnkteWVhci12LWRlbS1jb3JlLykuXAoKVHJhcyBsYSBkZXNjYXJnYSBkZWwgcGFxdWV0ZSBkZSBkYXRvcywgc2UgZGViZSB0ZW5lciBwcmVzZW50ZSBsYSBleHRlbnNpw7NuIGNvbiBsYSBxdWUgZnVlIGd1YXJkYWRvIGVsIGFyY2hpdm8gcXVlIGNvbnRpZW5lIGEgbGEgbWF0cml6IGRlIGRhdG9zIChgZGF0YS5mcmFtZWApLCB5IHF1ZSBzZSBlbmN1ZW50cmEgZW4gZm9ybWF0byBgLmNzdmAoY29tbWEgc2VwYXJhdGVkIHZhbHVlcykuXAoKVW5hIHZleiBxdWUgc2UgY3VlbnRhIGNvbiBlbCBhcmNoaXZvIGRlIGRhdG9zIGd1YXJkYWRvIGVuIGVsIGRpc2NvIGR1cm8geSBxdWUgc2UgY29ub2NlIGxhIGV4dGVuc2nDs24gY29uIHF1ZSBoYSBzaWRvIGd1YXJkYWRvIGRpY2hvIGFyY2hpdm8sIHNlIHB1ZWRlIHByb2NlZGVyIGEgImFicmlybG8iIHkgImNhcmdhcmxvIiBlbiBlbCBhbWJpZW50ZSBkZSBgUiBTdHVkaW9gLiBQYXJhIGVsbG8gc2UgdXRpbGl6YSBlbCBjb21hbmRvIGByZWFkLmNzdigpYCwgeSBlc3RlIHByb2Nlc28gc2UgZGViZSBndWFyZGFyIGNvbW8gdW4gKm9iamV0byogbnVldm8uCgpgYGB7ciBkYXRvc30KZGF0b3MgPC0gcmVhZC5jc3YoIn4vRHJvcGJveC9SL1YtRGVtLUNZLUNvcmUtdjEyLmNzdiIsIGhlYWRlciA9IFRSVUUpCmBgYAoKSGFzdGEgYXF1w60gc2UgY29uc2lkZXJhIHF1ZSBzZSBoYSBwcmVwYXJhZG8gZWwgYW1iaWVudGUgZGUgdHJhYmFqbyBkZSBtYW5lcmEgYsOhc2ljYS4KCiMgSW50cm9kdWNjacOzbiBhbCBBbsOhbGlzaXMgZGUgQ29tcG9uZW50ZXMgUHJpbmNpcGFsZXMgKFBDQSkKCkVsICoqKkFuw6FsaXNpcyBkZSBDb21wb25lbnRlcyBQcmluY2lwYWxlcyoqKiAobyAqUHJpbmNpcGFsIENvbXBvbmVudCBBbmFseXNpcyogWyoqKlBDQSoqKl0gcG9yIHN1cyBzaWdsYXMgZW4gaW5nbMOpcykgZXMgdW5hIHTDqWNuaWNhIGRlbnRybyBkZWwgY29uanVudG8gZGUgbcOpdG9kb3MgYWdydXBhZG9zIGVuIGxhIGNhdGVnb3LDrWEgZGUgKipBbsOhbGlzaXMgRmFjdG9yaWFsKipbXjFdLlwKClteMV06IE90cmEgZGUgbGFzIHTDqWNuaWNhcyBtw6FzIHV0aWxpemFkYXMgZGVudHJvIGRlIGVzdGUgY29uanVudG8gY29ycmVzcG9uZGUgYWwgQW7DoWxpc2lzIGRlIEZhY3RvcmVzIFByaW5jaXBhbGVzIChvICpQcmluY2lwYWwgRmFjdG9yIEFuYWx5c2lzKiBbUEZBXSksIHBlcm8gYW1iYXMgcGFydGVuIGRlIHN1cHVlc3RvcyB0ZcOzcmljb3MgZGlzdGludG9zIGFsIG1vbWVudG8gZGUgcHJvY2VzYXIgbG9zIGRhdG9zIHkgZW4gc3UgaW50ZXJwcmV0YWNpw7NuLgoKTGFzIHTDqWNuaWNhcyBhZ3J1cGFkYXMgZGVudHJvIGRlIGxhIGNhdGVnb3LDrWEgZGUgYW7DoWxpc2lzIGZhY3RvcmlhbGVzIHNvbiByZWZlcmlkYXMgY29tbyAidMOpY25pY2FzIHNpbiB2YXJpYWJsZXMgZGVwZW5kaWVuZGllbnRlcyIgW0B0YWNxX211bHRpdmFyaWF0ZV8xOTk4LCBwMjY3XSAsIHlhIHF1ZSBubyBzZSBiYXNhbiBlbiBtb2RlbG9zIGNhdXNhbGVzIHNpbm8gcXVlIHRyYWJhamFuIGNvbiB0b2RhcyBsYXMgdmFyaWFibGVzIGNvbnRlbmlkYXMgZW4gdW4gYGRhdGEuZnJhbWVgIGRlIG1hbmVyYSBzaW11bHTDoW5lYS5cCgpFbiBlc3RvcyBtb2RlbG9zICJzZSBkZWphIHF1ZSBzZWEgZWwgYW7DoWxpc2lzIGVzdGFkw61zdGljbyBlbCBxdWUgZGVjaWRhIHNpIGV4aXN0ZSB1bmEgZXN0cnVjdHVyYSAib2N1bHRhIiBxdWUgc2UgcHVlZGEgcmVjb25vY2VyIGVuIGVsIG1hdGVyaWFsIChkYXRvcykuIEEgZXN0ZSBmb3JtYXRvIGLDoXNpY28sIG8gdGFsIHZleiBzZSBkZWJlcsOtYSBkZWNpciBxdWUgYW50ZSBsYSBhdXNlbmNpYSBkZSB1biBmb3JtYXRvIGLDoXNpY28gKGVuIGxvcyBkYXRvcyksIHNlIGxlIGRlbm9taW5hIGVzdHJ1Y3R1cmEgbGF0ZW50ZS4gRWwgYW7DoWxpc2lzIGZhY3RvcmlhbCBzZSBwdWVkZSBjb25zaWRlcmFyIGNvbW8gdW5hIHTDqWNuaWNhIGRlIGFuw6FsaXNpcyBkZSBsYSBlc3RydWN0dXJhIGxhdGVudGUuIiBbQHRhY3FfbXVsdGl2YXJpYXRlXzE5OTgsIHAuIDI2Nl1cCgpFc3RlIHRpcG8gZGUgYW7DoWxpc2lzIGVzIG11eSDDunRpbCBzaSBzZSBkZXNlYSBleGFtaW5hciBzaSB1biBjb25jZXB0byBwdWVkZSBzZXIgInBhcnRpZG8iICgqc3BsaXQqKSBlbiB1biBuw7ptZXJvIGRpdmVyc28gZGUgY2FyYWN0ZXLDrXN0aWNhcyBsYXRlbnRlcyAoZGltZW5zaW9uZXMpLCB5IGRlIGVzYSBtYW5lcmEgc2UgcHVlZGUgc2ltcGxpZmljYXIgZWwgdHJhYmFqbyBkZWwgYW7DoWxpc2lzIGRlIGxhcyB2YXJpYWJsZXMuXAoKRW4gbG9zIGFuw6FsaXNpcyBmYWN0b3JpYWxlcyBzZSByZXF1aWVyZSBjb250YXIgY29uIGVsIHJlZ2lzdHJvIGRlIGRpc3RpbnRvcyBjYXNvcywgYSBsYSB2ZXogcXVlIHNlIGN1ZW50YSBjb24gc3VzIHZhbG9yZXMgdSBvYnNlcnZhY2lvbmVzIHBhcmEgbcOhcyBkZSBkb3MgdmFyaWFibGVzLiBEaWNoYXMgb2JzZXJ2YWNpb25lcyAodmFyaWFibGVzIG8gaW5kaWNhZG9yZXMpIGRlYmVuIHNlciBtZWRpZG9zIGVuIGVzY2FsYSAqaW50ZXJ2YWxhciouIFkgc2UgYXN1bWUgcXVlIGNhZGEgY2FzbyBlbiBzw60gbWlzbW8gZXMgZGlmZXJlbnRlIGRlbCByZXN0bywgYSBwYXJ0aXIgZGUgbGFzIHZhcmlhYmxlcyBxdWUgc29uIGRlIGludGVyw6lzIHBhcmEgZWwgYW7DoWxpc2lzLlwKCiMgUmVkdWNjacOzbiBkZSBkaW1lbnNpb25lcyBlbiAqKlBDQSoqCgpMYSBtYW5lcmEgZGUgc2ltcGxpZmljYXIgZWwgcHJvY2VzbyBkZSBhbsOhbGlzaXMgZGUgbGFzIHZhcmlhYmxlcyBvY3VycmUgYSB0cmF2w6lzIGRlIGxhICIqcmVkdWNjacOzbiBkZSBkaW1lbnNpb25lcyoiIChsYXRlbnRlcyksIGVzdG8gc2UgcmVmaWVyZSBhIGxhIGNyZWFjacOzbiBkZSB2YXJpYWJsZXMgbnVldmFzIHF1ZSBzZXJ2aXLDoW4gZGUgcmVzw7ptZW5lcyBkZSBsYXMgdmFyaWFibGVzIG9yaWdpbmFsZXMgaW5jbHVpZGFzIGVuIGVsIGFuw6FsaXNpcy4gQWwgZmluYWwgc2UgZXNwZXJhIHF1ZSBlc3RhcyDDumx0aW1hcyBjb25zaXN0YW4gZW4gdW4gbsO6bWVybyBtZW5vciBkZSAiY29sdW1uYXMiIGVuIGxhIG1hdHJpeiBkZSBkYXRvcyByZXNwZWN0byBkZSBsYXMgdmFyaWFibGVzIG9yaWdpbmFsZXMgeSwgYXPDrSwgdHJhYmFqYXIgcG9zdGVyaW9ybWVudGUgY29uIGxhcyBudWV2YXMgZGltZW5zaW9uZXMgbyAiKmZhY3RvcmVzKiIuXAoKVW4gKmZhY3Rvciogc2UgcHVlZGUgZW50ZW5kZXIgY29tbyAidW4gY29uY2VwdG8tbWFkcmUgKCptb3RoZXItY29uY2VwdCopIHF1ZSBvZnJlY2UgdW4gcmVzdW1lbiBkZSB1biBzdWJncnVwbyBkZSBpbmRpY2Fkb3JlcywgcXVlIG1pZGVuIGxvIG1pc21vIGRlIG1hbmVyYSBtw6FzIGFtcGxpYS4gRW4gb3RyYXMgcGFsYWJyYXMsIGNvbnNpZGVyYW1vcyBhIGxvcyBkaWFncmFtYXMgYmFzYWRvcyBlbiBlbCBhbsOhbGlzaXMgZmFjdG9yaWFsIGNvbW8gbW9kZWxvcyBkZSBtZWRpY2nDs24geSBubyBjb21vIG1vZGVsb3MgY2F1c2FsZXMuIiBbQHRhY3FfbXVsdGl2YXJpYXRlXzE5OTgsIHAgMjY3XQoKU2luIGVtYmFyZ28sIGFsIGludGVncmFyIHZhcmlhcyB2YXJpYWJsZXMgbyAqw610ZW1zKiBlbiBvdHJhcyBkaW1lbnNpb25lcyAobGF0ZW50ZXMpLCBzZSBwdWVkZW4gY2FlciBlbiBhbGd1bmEgZGUgbGFzIHNpdHVhY2lvbmVzIGV4dHJlbWFzOiBsYSBwcmltZXJhIGNvbnNpc3RlIGVuIHF1ZSB0b2RvcyBsb3MgKsOtdGVtcyogZXN0w6luIG11eSBjb3JyZWxhY2lvbmFkb3MgZW50cmUgc8OtIGVuIGRvbmRlICJlbiBlc3RlIGNhc28gZWwgbWF0ZXJpYWwgZGUgaW52ZXN0aWdhY2nDs24gKGRhdG9zKSB0ZW5kcsOhIHVuYSBlc3RydWN0dXJhIGJhc2FkYSBlbiB1bmEgZGltZW5zacOzbiwgeSBwYXJhIHRvZG9zIGxvcyBpbmRpY2Fkb3JlcyAoKsOtdGVtcyogbyB2YXJpYWJsZXMpIG1vc3RyYXLDoW4gcGVzb3MgKCpsb2FkaW5ncyopIGVsZXZhZG9zIGVuIHVuYSB2YXJpYWJsZSBsYXRlbnRlICgqZmFjdG9yKikuIiBbQHRhY3FfbXVsdGl2YXJpYXRlXzE5OTgsIHAuIDI2Ni0yNjddLlwKCkVsIG90cm8gZXh0cmVtbyBjb25zaXN0ZSBlbiBxdWUgcGFyYSBjYWRhIHVubyBkZSBsb3MgaW5kaWNhZG9yZXMgdXRpbGl6YWRvcyAoKsOtdGVtcyogbyB2YXJpYWJsZXMpLCBjYWRhIHVubyBkZSBlbGxvcyBtaWRlbiBjb3NhcyBtdXkgZGlmZXJlbnRlcyBlbnRyZSBzw60sIHkgcG9yIGVsbG8gc2UgY3JlYW4gdW5hIG51ZXZhIGRpbWVuc2nDs24gcGFyYSBjYWRhIHVubyBkZSBsb3MgaW5kaWNhZG9yZXMuICJQYXJhIGVzdGEgc29sdWNpw7NuIGNvbiB1biBmYWN0b3IgcGFyYSBjYWRhIGluZGljYWRvciBubyBzZSBhcHJlbmRlcsOhIG5hZGEgcHVlcyBsYSBlc3RydWN0dXJhIGxhdGVudGUgcGFyYSBsb3MgZGF0b3Mgc2Vyw6EgdGFuIGNvbXBsZWphIGNvbW8gbG8gZnVlIGxhIGVzdHJ1Y3R1cmEgbWFuaWZpZXN0YSBvcmlnaW5hbCBkZSBsb3MgZGF0b3MuIiBbQHRhY3FfbXVsdGl2YXJpYXRlXzE5OTgsIHAuIDI2N11cCgpFbiBlbCBhbsOhbGlzaXMgKipQQ0EqKiBubyBzZSByZWZpZXJlIGEgbGFzIHZhcmlhYmxlcyBsYXRlbnRlcyBjb21vICJmYWN0b3JlcyIgc2lubyBjb21vICIqKmNvbXBvbmVudGVzKioiLCB5IGVuIGVzdGEgdMOpY25pY2Egc2UgZ2VuZXJhcsOhbiB0YW50b3MgKipjb21wb25lbnRlcyoqIGNvbW8gaW5kaWNhZG9yZXMgc2VhbiBpbmNsdWlkb3MgZW4gZWwgYW7DoWxpc2lzLiBbQHRhY3FfbXVsdGl2YXJpYXRlXzE5OTgsIHAuIDI2N11cCgojIENvbWJpbmFjacOzbiBkZSBsYXMgdmFyaWFibGVzIGVuIGxvcyBDb21wb25lbnRlcwoKU2kgYmllbiBlbCBtw6l0b2RvIGRlbCAqKlBDQSoqIGVzIHVuYSB0w6ljbmljYSBxdWUgcGVybWl0ZSByZWR1Y2lyIGxhcyBkaW1lbnNpb25lcyBkZSB1bmEgbWF0cml6IGRlIGRhdG9zIGEgcGFydGlyIGRlIGxhIGNvbnN0cnVjY2nDs24gZGUgY29tcG9uZW50ZXMgJENfaSQsIHkgYXPDrSBzaW1wbGlmaWNhciBlbCBhbsOhbGlzaXMgZGUgbG9zIGRhdG9zIGEgbGEgcGFyIGRlIGlkZW50aWZpY2FyIGxhIGVzdHJ1Y3R1cmEgbGF0ZW50ZSBkZSBsYXMgdmFyaWFibGVzIGluY2x1aWRhcyBlbiBlbCBhbsOhbGlzaXMsIHRhbWJpw6luIHNlIHJlY29ub2NlIHF1ZSBsb3Mgb2JqZXRpdm9zIGRlIGludmVzdGlnYWNpw7NuIHBhcmEgbG9zIHF1ZSBzZSBoYSB1dGlsaXphZG8gZWwgUENBIHNlIGNlbnRyYW4sIGRlIGFjdWVyZG8gY29uIFRhY3EgWy1AdGFjcV9tdWx0aXZhcmlhdGVfMTk5OCwgcC4gMjcwXSBlbjoKCjEuICBSZWR1Y2Npw7NuIGRlIGxhIG11bHRpcGxpY2lkYWQgYSBwb2NhcyB1bmlkYWRlczogZGVzYnJvemFyIHBhdHJvbmVzIGNvbXBsZWpvcyBkZSBhc29jaWFjaW9uZXMgZW50cmUgdmFyaWFibGVzIHBhcmEsIGFzw60sIGVuY29udHJhciBzdSBlc2VuY2lhLgoyLiAgQW7DoWxpc2lzIGRlIGVzdHJ1Y3R1cmEgbGF0ZW50ZTogaWRlbnRpZmljYWNpw7NuIGRlIGNhcmFjdGVyw61zdGljYXMgbGF0ZW50ZXMgbGFzIHF1ZSBvY3VsdGFuIHVuYSBlc3RydWN0dXJhIG9jdWx0YSBlbiBsb3MgZGF0b3MuCjMuICBEZXNhcnJvbGxvIGRlIHRpcG9sb2fDrWFzIGVtcMOtcmljYXMgYSBwYXJ0aXIgZGUgbGFzIHZhcmlhYmxlcyB1dGlsaXphZGFzLgo0LiAgUmVkdWNjacOzbiBkZSBkaW1lbnNpb25lczogcmVkdWNjacOzbiBlbCBlc3BhY2lvIGRlICRuJCB2YXJpYWJsZXMgYSBvdHJvIGVzcGFjaW8gZGUgJHAkIGRpbWVuc2lvbmVzLCBkb25kZSAkcCQgbWVub3IgYSAkbiQuCjUuICBDb25zdHJ1Y2Npw7NuIGRlIMOtbmRpY2VzIG8gZXNjYWxhbWllbnRvOiBleGFtaW5hY2nDs24gc29icmUgbGEgcG9zaWJpbGlkYWQgZGUgcmVkdWNpciAkbiQgdmFyaWFibGVzIGEgdW5hIGRpbWVuc2nDs24geSwgZGUgc2VyIHBvc2libGUsIGNvbnN0cnVpciB1biDDrW5kaWNlIGRlIHVuYSBzb2xhIGRpbWVuc2nDs24gbyBlc2NhbGEgKGNhc28gZXNwZWNpYWwgZGUgcmVkdWNjacOzbiBkZSBkaW1lbnNpb25lcyBjb24gJHAgPSAxJCkuCjYuICBPcnRvZ29uYWxpemFjacOzbiBkZSBsb3MgcHJlZGljdG9yZXM6IHRyYW5zZm9ybWFjacOzbiBkZSBsYSBtYXRyaXogZGUgdmFyaWFibGVzIGluZGVwZW5kaWVudGVzIGVuIHVuIGFuw6FsaXNpcyBkZSByZWdyZXNpw7NuIG3Dumx0aXBsZSBjb24gbXVsdGljb2xpbmVhbGlkYWQgc3VzdGFuY2lhbC4KCkVuIGVsICoqUENBKiosIGluaWNpYWxtZW50ZSwgY2FkYSBjb21wb25lbnRlIHNlIHByZXNlbnRhIGNvbW8gdW5hIGNvbWJpbmFjacOzbiBsaW5lYWwgZGUgbG9zIGluZGljYWRvcmVzIGluY2x1aWRvcywgZGUgdGFsIG1hbmVyYSBxdWUgZXN0YSBtZXpjbGEgbWF4aW1pY2UgbGEgdmFyaWFiaWxpZGFkIHF1ZSBzZSBleHRyYWUgZGUgZGljaG9zIGluZGljYWRvcmVzIG8gdmFyaWFibGVzLiBQb3IgbG8gcXVlIGNhZGEgY29tcG9uZW50ZSBlcyB1bmEgY29tYmluYWNpw7NuIGxpbmVhbCBkZSBsb3MgaW5kaWNhZG9yZXMgcXVlLCBhZGVtw6FzLCBoYW4gc2lkbyBlc3RhbmRhcml6YWRvcyBkZSBsYSBtYW5lcmEgc2lndWllbnRlIHBhcmEgdW5hIHNpdHVhY2nDs24gY29uIDMgY29tcG9uZW50ZXMsIGRlIGFjdWVyZG8gY29uIFRhY3EgWy1AdGFjcV9tdWx0aXZhcmlhdGVfMTk5OCwgcC4gMjY4XS4KCiQkQ19pID0gdV97aTF9el8xICsgdV97aTJ9el8yICsgdV97aTN9el8zJCQKCkRvbmRlOgoKLSAgICRDX2kkID0gY29tcG9uZW50ZSAkLWkkLAotICAgJHhfaSQgPSBsYSB2YXJpYWJsZSAkLWkkIHV0aWxpemFkbyBlbiBlbCBhbsOhbGlzaXMsIHkgc2UgaW5jbHV5ZSBlbiB1bmlkYWRlcyBlc3RhbmRhcml6YWRhcywgcG9yIGxvIHF1ZSAkel9pJCwKLSAgICR1X2kkID0gY29uc2lzdGUgZW4gdmFsb3IgcGFyYSBjYWRhIGNvZWZpY2llbnRlIGRlbCBmYWN0b3IgbyBjb21wb25lbnRlLgoKUGVybyBwYXJhIGlkZW50aWZpY2FyIGVzdG9zIGNvbXBvbmVudGVzLCBxdWUgc29uIG1lemNsYXMgZGUgbG9zIGluZGljYWRvcmVzIG8gdmFyaWFibGVzIGluY2x1aWRhcyBlbiBlbCBhbsOhbGlzaXMsIHByaW1lcm8gc2UgZGViZW4gY3VtcGxpciAyIGNvbmRpY2lvbmVzIGLDoXNpY2FzLCBxdWUgcmVzdHJpbmdlbiBsYSBiw7pzcXVlZGEgZGUgY29tYmluYWNpb25lcyBsaW5lYWxlcyBkZSBsYXMgdmFyaWFibGVzOgoKMS4gIExvcyBjb21wb25lbnRlcyBkZWJlbiBkZSBzZXIgcGVycGVuZGljdWxhcmVzIGVudHJlIHPDrSAocmVxdWlzaXRvIGRlICpvcnRvZ29uYWxpZGFkKikuCjIuICBFbCBwcmltZXIgY29tcG9uZW50ZSBkZWJlIGRlIGV4dHJhZXIgbGEgbWF5b3IgdmFyaWFiaWxpZGFkIHBvc2libGUgZGUgbGFzIHZhcmlhYmxlcyBvcmlnaW5hbGVzLCBlbCBzZWd1bmRvIGNvbXBvbmVudGUgZGViZSBleHRyYWVyIGxhIG1heW9yIHZhcmlhYmlsaWRhZCBwb3NpYmxlIGRlIGxhIHZhcmlhYmlsaWRhZCByZXN0YW50ZSwgZXRjLiwgYXPDrSBoYXN0YSBxdWUgdG9kYSBsYSB2YXJpYWJpbGlkYWQgc2VhIGV4dHJhw61kYSAobcOpdG9kbyBkZWwgZWplIHByaW5jaXBhbCBbKnByaW5jaXBhbCBheGlzIG1ldGhvZCpdKS4gW0B0YWNxX211bHRpdmFyaWF0ZV8xOTk4LCBwLiAyNjldCgpFbiBlbCBwcm9jZXNvIGRlIGNvbnN0cnVjY2nDs24gZGUgbG9zIGNvbXBvbmVudGVzLCB1bmEgY2FyYWN0ZXLDrXN0aWNhIGltcG9ydGFudGUgZGVsICoqUENBKiogY29uc2lzdGUgZW4gcXVlIHNlIGNhbGN1bGFyw6FuIHRhbnRvcyBjb21wb25lbnRlcyBjb21vIHZhcmlhYmxlcyBzZSBodWJpZXJhbiBpbmNsdWlkbyBlbiBlbCBhbsOhbGlzaXMsIHkgZW50cmUgdG9kb3Mgc2UgYWJhcmNhIGxhIHRvdGFsaWRhZCBkZSBsYSB2YXJpYWNpw7NuIGNvbnRlbmlkYSBlbiB0b2RhcyBsYXMgdmFyaWFibGVzIGRlIG1hbmVyYSBzaW11bHTDoW5lYS4gW0B0YWNxX211bHRpdmFyaWF0ZV8xOTk4LCBwLiAyNjddCgpFbCBtb2RlbG8gKipQQ0EqKiB0YW1iacOpbiBwdWVkZSBzZXIgdmlzdG8gZGUgb3RyYSBtYW5lcmEsIGRvbmRlIGNhZGEgdmFyaWFibGUgb3JpZ2luYWwgc2UgcHVlZGUgY29uY2ViaXIgY29tbyB1bmEgY29tYmluYWNpw7NuIGxpbmVhbCBkZSBsb3MgY29tcG9uZW50ZXMgZ2VuZXJhZG9zIGVuIGVsIGFuw6FsaXNpcywgZGUgbGEgc2lndWllbnRlIG1hbmVyYSBwYXJhIHVuYSBzaXR1YWNpw7NuIGNvbiAzIGNvbXBvbmVudGVzOiAoMjY5KQoKJCR6X2kgPSBhX3tpMX1DXzEgKyBhX3tpMn1DXzIgKyBhX3tpM31DXzMkJAoKRG9uZGU6CgotICAgJGFfaSQgPSBwZXNvIGRlIGNhZGEgY29tcG9uZW50ZSAoKmNvbXBvbmVudCBsb2FkaW5nKikuCgpMb3MgKnBlc29zIGRlIGNhZGEgY29tcG9uZW50ZSogKCpjb21wb25lbnQgbG9hZGluZ3MqKSAic29uIGxvcyBwZXNvcyAqYmV0YSoncyAoKmJldGEgd2VpZ2h0cyopIGRlIHVuYSByZWdyZXNpw7NuIG3Dumx0aXBsZSBkZSBsYSB2YXJpYWJsZSAoZXN0YW5kYXJpemFkYSksIHF1ZSBzZSBwcmVzZW50YSBjb21vIHVuYSBmdW5jacOzbiBkZSBsb3MgY29tcG9uZW50ZXMgY2FsY3VsYWRvcy4gRXN0b3MgcGVzb3MgKmJldGEqJ3Mgc29uIGlndWFsZXMgYSBsYXMgY29ycmVsYWNpb25lcyBjYWxjdWxhZGFzIGVudHJlIGNhZGEgdmFyaWFibGUgeSBjYWRhIGNvbXBvbmVudGUuIiBbQHRhY3FfbXVsdGl2YXJpYXRlXzE5OTgsIHAuIDI2OV0KCiMgUmVwcmVzZW50YWNpw7NuIGdlb23DqXRyaWNhIGRlIGxvcyBkYXRvcyBlbiAqKlBDQSoqCgpFbCBQQ0Egc2UgYXBveWEgZW4gbGEgcmVwcmVzZW50YWNpw7NuIGdlb23DqXRyaWNhIGRlIGxvcyBkYXRvcywgZG9uZGUgc2UgdHJhdGEgZGUgbGEgKnJvdGFjacOzbiogZGUgdW4gY3VibyBxdWUsIG9yaWdpbmFsbWVudGUsIHNlIGhhIGNvbnN0cnVpZG8gY29uIGxhcyB2YXJpYWJsZXMgZGUgbGEgbWF0cml6IGRlIGRhdG9zLiBbQHRhY3FfbXVsdGl2YXJpYXRlXzE5OTgsIHAuIDI2OV1cCgpEZSBhY3VlcmRvIGNvbiBUYWNxIFstQHRhY3FfbXVsdGl2YXJpYXRlXzE5OTgsIHAuIDI3MF0gY2FkYSB2YXJpYWJsZSBzZSByZXByZXNlbnRhIGVuIHVuIGVzcGFjaW8gZGltZW5zaW9uYWwgKHVuYSByZWN0YSksIHkgZW50cmUgc8OtIHRvZGFzIMOpc3RhcyBzb24gcGVycGVuZGljdWxhcmVzLCBmb3JtYW5kbyB1biBjdWJvLiBTaSBsYXMgdmFyaWFibGVzIGVzdMOhbiBlc3RhbmRhcml6YWRhcywgZW50b25jZXMgZWwgb3JpZ2VuIGRlbCBjdWJvIHNlIHViaWNhIGVuIHVuICpjZW50cm9pZGUqOyBlc3RlIGVzIGVsIHB1bnRvIGRlbnRybyBkZWwgY3VibyBlbiBkb25kZSBzZSBjb25jZW50cmFuIGxhcyBtZWRpYXMgZGUgY2FkYSBkaW1lbnNpw7NuLiBZIHNvYnJlIGNhZGEgcmVjdGEgc2UgcmVwcmVzZW50YSBsYSBwb3NpY2nDs24gZGUgY2FkYSB1bm8gZGUgbG9zIGNhc29zIGRlIGxvcyBxdWUgc2UgZXh0cmFqbyBsYSBpbmZvcm1hY2nDs24uXAoKRW4gZWwgUENBIHNlIGJ1c2NhIGRlbGluZWFyIHVuYSByZWN0YSBhIHRyYXbDqXMgZGVsIG9yaWdlbiAoY2VudHJvaWRlKSwgZGUgbWFuZXJhIHF1ZSBsYSBwcm95ZWNjacOzbiBkZSBsb3MgY2Fzb3Mgc29icmUgbGEgbMOtbmVhIHBlcm1pdGEgY29udGVuZXIgYSBsYSBtYXlvciBjYW50aWRhZCBkZSBkaXNwZXJzacOzbiAoKm1heGltYWwgdmFyaWFuY2UqKS4gQ2FkYSB1bmEgZGUgZGljaGFzIGzDrW5lYXMgZXMgdW5hIGNvbWJpbmFjacOzbiBsaW5lYWwgKG8gY29tcG9uZW50ZSkuXAoKU2kgbGxlZ2FzZSBhIG9jdXJyaXIgcXVlIHRvZG9zIGxvcyBjYXNvcyAocmVwcmVzZW50YWRvcyBwb3IgcHVudG9zIHNvYnJlIGxhIGdyw6FmaWNhKSBzZSBwb3NpY2lvbmFuIHNvYnJlIHVuYSByZWN0YSAoc2l0dWFjacOzbiBkZSAqbXVsdGljb2xpbmVhbGlkYWQgcGVyZmVjdGEqKSwgZW50b25jZXMgZGljaG8gY29tcG9uZW50ZSByZXByZXNlbnRhcsOtYSBleGhhdXN0aXZhbWVudGUgYSB0b2RhIGxhIGluZm9ybWFjacOzbiBkZSBsYSBtYXRyaXogZGUgZGF0b3MuXAoKRW4gY2FzbyBkZSBjYWxjdWxhciBtw6FzIGRlIHVuIGNvbXBvbmVudGUsIGxvcyBzdWJzaWd1aWVudGVzIHNlcsOhbiBzaWVtcHJlIHBlcnBlbmRpY3VsYXJlcyBhbCBhbnRlcmlvciB5IHBhcnRpcsOhbiBkZWwgb3JpZ2VuIG8gY2VudHJvaWRlLCB5IGJ1c2NhcsOhbiBzaWVtcHJlIG1heGltaXphciBsYSB2YXJpYWNpw7NuIGFsIGNydXphciBhIGxvcyBjYXNvcy5cCgpBIHBhcnRpciBkZSBkaWNoYXMgY29tYmluYWNpb25lcyBsaW5lYWxlcyBvIGNvbXBvbmVudGVzIHNlIGZvcm1hIHVuIG51ZXZvIGN1Ym8sIGRpc3RpbnRvIGFsIHF1ZSBzZSBmb3Jtw7MgYSBwYXJ0aXIgZGUgbGFzIHZhcmlhYmxlcyBvcmlnaW5hbGVzLCBwZXJvIGVzdGUgc2Ugcm90YSBhbHJlZGVkb3IgZWwgb3JpZ2VuIGRlbCBjdWJvIGhhY2lhIGVsIG51ZXZvIGN1Ym8gKGZvcm1hZG8gcG9yIGxvcyBjb21wb25lbnRlcyksIG1pZW50cmFzIHF1ZSBsb3MgcHVudG9zIG8gY2Fzb3MgcGVybWFuZWNlbiBlbiBzdSBsdWdhci4gW0B0YWNxX211bHRpdmFyaWF0ZV8xOTk4LCBwLiAyNzBdCgpBIHBhcnRpciBkZSBkaWNoYSByZXByZXNlbnRhY2nDs24gZ2VvbcOpdHJpY2EsIGxhIHTDqWNuaWNhIGRlbCAqKlBDQSoqIHNlIGNlbnRyYSBlbiBsb3Mgc2lndWllbnRlcyBvYmpldGl2b3MgcGFydGljdWxhcmVzIG8gcHJvY2VkaW1lbnRhbGVzIFtAdGFjcV9tdWx0aXZhcmlhdGVfMTk5OCwgcC4gMjcxXToKCjEuICBFbmNvbnRyYXIgdGFudG9zIGNvbXBvbmVudGVzIGFzw60gY29tbyB2YXJpYWJsZXMgb3JpZ2luYWxlcyBkZSB0YWwgbWFuZXJhIHF1ZSBsb3MgY29tcG9uZW50ZXMgc2VhbiBtdXR1YW1lbnRlIG9ydG9nb25hbGVzIHkgc2VjdWVuY2lhbG1lbnRlIGV4dHJhaWdhbiBsYSB2YXJpYWNpw7NuIG3DoXhpbWEgZGUgbGFzIHZhcmlhYmxlcy4gUGFyYSBlc3RvIHNlIGRlYmUgZXhhbWluYXIgbGEgKiplaWdlbmVzdHJ1Y3R1cmEqKiBkZSBsYSBtYXRyaXogZGUgZGF0b3MgJFgkIG8gbGEgY29ycmVsYWNpw7NuIGRlIGxhIG1hdHJpeiAkUiQuIExvcyAqKmVpZ2VudmFsb3JlcyoqIHNvbiBsYXMgdmFyaWFudGVzIGRlIGxhcyBwcm95ZWNjaW9uZXMgZGUgcHVudG9zIHNvYnJlIGNhZGEgdW5vIGRlIGxvcyBjb21wb25lbnRlcy4gTG9zICoqZWlnZW52ZWN0b3JlcyoqIHNvbiBsb3MgY29zZW5vcyBkZSBkaXJlY2Npw7NuLCBsb3MgcXVlIGluZGljYW4gcXXDqSB0YW50byBkZWJlIHJvdGFyc2UgZWwgZXNwYWNpbyBkZSBsYSB2YXJpYWJsZSBvcmlnaW5hbC4KMi4gIFJlZHVjY2nDs24gZGVsIG7Dum1lcm8gZGUgZGltZW5zaW9uZXMgbWVkaWFudGUgbGEgZXhhbWluYWNpw7NuIHNvYnJlIGN1w6FsZXMgZGUgbGFzIHZhcmlhYmxlcyBjdWVudGFuIGNvbiB1biBwZXNvIGVsZXZhZG8gKCpoaWdoIGxvYWRpbmcqKSBzb2JyZSBjYWRhIGNvbXBvbmVudGUsIGJ1c2NhbmRvIGxhICIqZXN0cnVjdHVyYSBzaW1wbGUqIi4gRXN0byBzZSBsb2dyYSBtZWRpYW50ZSBsYSBleGFtaW5hY2nDs24gZGUgbGEgbWF0cml6ICRBJCBkZSBwZXNvcyBkZSBsb3MgY29tcG9uZW50ZXMgKCpjb21wb25lbnQgbG9hZGluZ3MqKSwgYXPDrSBjb21vIG1lZGlhbnRlIGVsIGPDoWxjdWxvIGRlIGxhcyBtZWRpZGFzIGRlIHJlZHVuZGFuY2lhIGRlIGNhZGEgY29tcG9uZW50ZS4KMy4gIFJvdGFjacOzbiBkZWwgZXNwYWNpbyByZXN1bHRhbnRlIGRlIGNhZGEgY29tcG9uZW50ZSBhIHVuIG51ZXZvIGVzcGFjaW8sIGVsIHF1ZSBwdWVkZSBvZnJlY2VyIHVuYSAqZXN0cnVjdHVyYSBtw6FzIHNpbXBsZSogYXPDrSBjb21vIHVuYSBtZWpvciBpbnRlcnByZXRhY2nDs24gZW4gdMOpcm1pbm9zIGRlbCBjb250ZW5pZG8uCgpUb21hbmRvIGVzdG9zIHN1cHVlc3RvcyB5IHJlcXVpc2l0b3MgZW4gY29uc2lkZXJhY2nDs24sIGVzIHF1ZSBzZSBwdWVkZSBhdmFuemFyIGVuIGxhIHJlYWxpemFjacOzbiBkZWwgcHJvY2VkaW1pZW50byBkZWwgKipQQ0EqKiBlbiBgUmAgeSwgcG9zdGVyaW9ybWVudGUsIGFuYWxpemFyIGxvcyByZXN1bHRhZG9zIGFycm9qYWRvcyBwb3IgZWwgc29mdHdhcmUsIGNvbW8gc2UgdmVyw6EgZW4gbGEgc2VjY2nDs24gc2lndWllbnRlLgoKIyBSZWFsaXphY2nDs24geSBhbsOhbGlzaXMgZGUgbG9zIHJlc3VsdGFkb3MgZGVsICoqUENBKioKCkEgY29udGludWFjacOzbiBzZSBtdWVzdHJhbiBsb3MgY29tYW5kbyBxdWUgc2UgdXRpbGl6YXLDoW4gcGFyYSBsYSByZWFsaXphY2nDs24gZGVsIGFuw6FsaXNpcyBkZSAqKlBDQSoqLCBwYXJhIGVsbG8gc2UgdHJhYmFqYXLDoSBjb24gbGEgdmVyc2nDs24gMTIgZGUgbGEgbWF0cml6IGRlIGRhdG9zIGdlbmVyYWRhIGVuIGVsIHByb3llY3RvIFtWLURFTV0oaHR0cHM6Ly93d3cudi1kZW0ubmV0L2RhdGEvdGhlLXYtZGVtLWRhdGFzZXQvY291bnRyeS15ZWFyLXYtZGVtLWNvcmUvKSAoY29tbyBzZSByZWZpcmnDsyBhcnJpYmEpLlwKCkxhcyB2YXJpYWJsZXMgc2VsZWNjaW9uYWRhcyBwYXJhIGVsIGFuw6FsaXNpcyBmdWVyb246CgoxLiAgw41uZGljZSBkZSBkZW1vY3JhY2lhIGRlbGliZXJhdGl2YSAodjJ4X2RlbGliZGVtKS4KMi4gIMONbmRpY2UgZGUgZGVtb2NyYWNpYSBpZ3VhbGl0YXJpYSAodjJ4X2VnYWxkZW0pLgozLiAgw41uZGljZSBkZSBkZW1vY3JhY2lhIGVsZWN0b3JhbCAodjJ4X3BvbHlhcmNoeSkuCjQuICDDjW5kaWNlIGRlIGRlbW9jcmFjaWEgcGFydGljaXBhdGl2YSh2MnhfcGFydGlwZGVtKS4KNS4gIMONbmRpY2UgZGUgZGVtb2NyYWNpYSBsaWJlcmFsICh2MnhfbGliZGVtKS4KClkgc2UgcmV2aXNhcsOhbiBsb3MgdmFsb3JlcyByZWdpc3RyYWRvcyBhIHBhcnRpciBkZSAxOTc0W14yXSB5IGhhc3RhIGVsIMO6bHRpbW8gYcOxbyBkZSByZWdpc3RybywgcGFyYSBsbyBxdWUgc2UgZmlsdHJhcm9uIGxvcyBkYXRvcyBwYXJhLCBhc8OtLCBjcmVhciB1bmEgc3VibXVlc3RyYSBkZW5vbWluYWRhIGBkYXRvc19wY2FgIGRlIGxhIHNpZ3VpZW50ZSBtYW5lcmE6CgpbXjJdOiBFbCBhw7FvIGRlIDE5NzQgZXMgY29uc2lkZXJhZG8gY29tbyBlbCBpbmljaW8gZGUgbGEgInRlcmNlcmEgb2xhIGRlIGxhIGRlbW9jcmFjaWEiIGEgcGFydGlyIGRlbCBwcm9jZXNvIGRlIGNhbWJpbyBwb2zDrXRpY28gZW4gUG9ydHVnYWwsIHF1ZSBmdWUgZGVub21pbmFkbyAibGEgcmV2b2x1Y2nDs24gZGUgbG9zIGNsYXZlbGVzLiIgW0BodW50aW5ndG9uMTk5NF0KCmBgYHtyIGZpbHRyYWRvXzE5NzR9CmRhdG9zX3BjYSA8LSBkYXRvcyAlPiUKICBmaWx0ZXIgKHllYXIgPiAxOTczKSAlPiUKICBzZWxlY3QodjJ4X3BvbHlhcmNoeSwgdjJ4X2xpYmRlbSwgdjJ4X3BhcnRpcGRlbSwgdjJ4X2RlbGliZGVtLCB2MnhfZWdhbGRlbSkKYGBgCgpFc3RhcyB2YXJpYWJsZXMgc29uIHV0aWxpemFkYXMgcG9yIGVsIHByb3llY3RvIFYtREVNIHBhcmEgbWVkaXIgY2luY28gYXNwZWN0b3MgcmVsZXZhbnRlcywgbGFzIHF1ZSAtY29uc2lkZXJhbi0gcGVybWl0ZW4gZXN0cnVjdHVyYXIgYWwgcsOpZ2ltZW4gZGVtb2Nyw6F0aWNvLiBEZSBtYW5lcmEgcXVlIGxhIGRlbW9jcmFjaWEgZXMgZW50ZW5kaWRhIGNvbW8gbGEgY29tYmluYWNpw7NuIGRlIGVzdG9zIGNpbmNvIGVsZW1lbnRvcy5cCgpBbCByZXRvbWFybG9zIGVuIGVsIHByZXNlbnRlIGFuw6FsaXNpcywgc2UgcHVlZGUgY29uc2lkZXJhciBxdWUgZWwgKipQQ0EqKiBheXVkYXLDoSBhIGlkZW50aWZpY2FyIGxhIGVzdHJ1Y3R1cmEgbGF0ZW50ZSBxdWUgZXhpc3RlIGVudHJlIGVzdGFzIHZhcmlhYmxlcyB5LCBhc8OtLCB0ZW5lciB1biBhY2VyY2FtaWVudG8gbcOhcyAic2ltcGxlIiBzb2JyZSBlbCByw6lnaW1lbiBkZW1vY3LDoXRpY28uCgojIyBFeHBsb3JhY2nDs24gaW5pY2lhbCBkZSBsYSBhc29jaWFjacOzbiBlbnRyZSBsYXMgdmFyaWFibGVzCgpVbmEgcHJpbWVyIG1hbmVyYSBwYXJhIG9ic2VydmFyIGxhIGFzb2NpYWNpw7NuIG8gdmFyaWFjacOzbiBleGlzdGVudGUgZW50cmUgbGFzIHZhcmlhYmxlcyBlcyBtZWRpYW50ZSB1bmEgY29tcGFyYWNpw7NuIGRlIHZhcmlhYmxlcyBlbiBwYXJlcywgcGFyYSBsbyBxdWUgc2UgdXNhIGVsIGNvbWFuZG8gYGNoYXJ0LkNvcnJlbGF0aW9uKClgIGRlIGxhIGxpYnJlcsOtYSBgUGVyZm9ybWFuY2VBbmFseXRpY3NgOlwKCmBgYHtyIGNvcnJlbGFjaW9uZXMsIGZpZy5jYXAgPSAiR3LDoWZpY2EgZGUgY29ycmVsYWNpb25lcyBlbiBwYXJlcyBkZSB2YXJpYWJsZXMuIn0KY2hhcnQuQ29ycmVsYXRpb24oZGF0b3NfcGNhKQpgYGAKClNpIGJpZW4gc2UgcHVlZGVuIGlkZW50aWZpY2FyIGxvcyBuaXZlbGVzIGRlIGFzb2NpYWNpw7NuIGVudHJlIGxhcyB2YXJpYWJsZXMgLXF1ZSBzb24gbXV5IGFsdGFzLSwgYWhvcmEgc3VyZ2UgbGEgaW50ZXJyb2dhbnRlIHBvciBkaWx1Y2lkYXIgc2kgZXN0byBvY3VycmUgcG9ycXVlLCBlbiBlbCBmb25kbywgZXN0w6EgbWlkaWVuZG8gZWwgbWlzbW8gZmVuw7NtZW5vIGF1bnF1ZSBjb24gaW5kaWNhZG9yZXMgZGlmZXJlbnRlcy5cCgpZLCBlbiBjYXNvIGRlIG1lZGlyIGFzcGVjdG9zIGRpZmVyZW50ZXMgZGUgdW4gZmVuw7NtZW5vLCB5IHF1ZSBlc28gdmFsaWRlIGxvcyBpbmRpY2Fkb3JlcyB1dGlsaXphZG9zIGVuIGVsIGFuw6FsaXNpcywgZWwgbcOpdG9kbyBkZSBsYXMgY29ycmVsYWNpb25lcyBlbnRyZSB2YXJpYWJsZXMgbm8gcGVybWl0ZSBpZGVudGlmaWNhciBzaSBhbGd1bmEgZGUgZWxsYXMgcGVybWl0ZSAic2ltcGxpZmljYXIiIGxhIGVzdHJ1Y3R1cmEgZGUgbGEgbWF0cml6IGRlIGRhdG9zIHksIGFzw60sIGlkZW50aWZpY2FyIHVuYSB2YXJpYWJsZSAicmVzdW1lbiIsIGEgbGEgcGFyIGRlIHBlcm1pdGEgb2JzZXJ2YXIgbGFzIGRpZmVyZW5jaWFzIGVuIGVsIGNvbXBvcnRhbWllbnRvIGRlIGNhZGEgY2FzbyBlbnRyZSB0b2RhcyBsYXMgdmFyaWFibGVzIHNpbXVsdMOhbmVhbWVudGUuXAoKQW50ZSBlc3RhIHNpdHVhY2nDs24sIGVzIHJlY29tZW5kYWJsZSBhdmFuemFyIGVuIGxhIHJlYWxpemFjacOzbiBkZWwgYW7DoWxpc2lzICoqUENBKiosIHF1ZSBwZXJtaXRpcsOhIGNvbnN0cnVpciB1biBncsOhZmljbyBlbiBlbCBxdWUgc2UgcG9kcsOhICJyZWR1Y2lyIGxhcyBkaW1lbnNpb25lcyIgcGFyYSwgYXPDrSwgZmFjaWxpdGFyIGVsIGFuw6FsaXNpcyBlc3RhZMOtc3RpY28gcG9zdGVyaW9yLiBEZSBlc3RhIG1hbmVyYSwgdGFtYmnDqW4sIHNlIHBvZHLDoSBpZGVudGlmaWNhciB1bmEgImVzdHJ1Y3R1cmEgbcOhcyBzaW1wbGUiIHBhcmEgbGEgbWF0cml6IGRlIGRhdG9zLlwKCiMgUmVhbGl6YWNpw7NuIGRlbCAqKlBDQSoqCgpBIGNvbnRpbnVhY2nDs24gc2UgcmV2aXNhcsOhIGVsIGNvbWFuZG8gYsOhc2ljbyBwYXJhIGxhIHJlYWxpemFjacOzbiBkZWwgYW7DoWxpc2lzICoqUENBKiogZW4gYFJgLCBjb24gbG8gcXVlIHNlIGF2YW56YXLDoSBlbiBlbCBwcm9jZXNvIGRlIHJlZHVjY2nDs24gZGUgZGltZW5zaW9uZXMsIHkgZGVsIHF1ZSBzZSBnZW5lcmFyw6FuIHZhcmlvcyBjb21wb25lbnRlcyBvIGRpbWVuc2lvbmVzIG51ZXZhcyBhIHBhcnRpciBkZSBsYSBtYXRyaXogZGUgZGF0b3Mgb3JpZ2luYWxlcy5cCgpTaW4gZW1iYXJnbywgcHJldmlvIGEgbGEgcmVhbGl6YWNpw7NuIGRlIGRpY2hvIGFuw6FsaXNpcyBlcyBpbXBvcnRhbnRlIGV2YWx1YXIgc3UgbGEgbWF0cml6IGRlIGRhdG9zIG9yaWdpbmFsICh0YW50byBsb3MgY2Fzb3MgY29tbyBzdXMgdmFyaWFibGVzKSwgc29uIHBlcnRpbmVudGVzIHBhcmEgbGEgcmVhbGl6YWNpw7NuIGRlbCAqKlBDQSoqLCBwYXJhIGVsbG8gc2UgdXRpbGl6YXLDoSBsYSBwcnVlYmEgZXN0YWTDrXN0aWNhIGRlIEJhcnRsZXR0LCBjb21vIHNlIHZlcsOhIGEgY29udGludWFjacOzbi5cCgojIyBQcnVlYmEgZXN0YWTDrXN0aWNhIGRlIGxhcyBjb3JyZWxhY2lvbmVzIGVuIGxhIG1hdHJpeiBkZSBkYXRvcwoKVW4gZWxlbWVudG8gYSB0ZW5lciBlbiBjb25zaWRlcmFjacOzbiBwcmV2aW8gYSBsYSByZWFsaXphY2nDs24gZWwgYW7DoWxpc2lzICoqUENBKiogY29uc2lzdGUgZW4gbGEgZXZhbHVhY2nDs24gZGUgbGFzIGNvcnJlbGFjaW9uZXMgZXhpc3RlbnRlcyBlbnRyZSBsYXMgdmFyaWFibGVzIG9yaWdpbmFsZXMsIGNvbiBlbCBmaW4gZGUgZGVzY2FydGFyIHF1ZSDDqXN0YXMgc29uIGlkw6ludGljYXMgZW50cmUgc8OtLiBMbyBxdWUgaW1wbGljYXLDrWEgbGEgaW1wb3NpYmlsaWRhZCBkZSByZWFsaXphciB1biBwcm9jZXNvIGRlIHJlZHVjY2nDs24gZGUgZGltZW5zaW9uZXMuXAoKUGFyYSBlbGxvIGVzIGltcG9ydGFudGUgbGEgcmVhbGl6YWNpw7NuIGRlIHVuYSBwcnVlYmEgZXN0YWTDrXN0aWNhIHF1ZSBheXVkYSBhIGV2YWx1YXIsIGluaWNpYWxtZW50ZSwgc2kgZXMgcGVydGluZW50ZSBhdmFuemFyIGVuIGxhIHJlYWxpemFjacOzbiBkZSB1biBhbsOhbGlzaXMgZmFjdG9yaWFsLiBEaWNoYSBwcnVlYmEsIHByb3B1ZXN0YSBwb3IgQmFydGxldHQgWy1AYmFydGxldHRfdGVzdF8xOTUwXSBzZSByZWFsaXphIHNvYnJlIGxhIG1hdHJpeiBkZSBjb3JyZWxhY2lvbmVzIGRlIGxhcyB1bmlkYWRlcyBkZSBsYSBwb2JsYWNpw7NuLCBxdWUgYXN1bWUgcXVlIHNlIGRpc3RyaWJ1eWUgY29tbyB1bmEgJFxjaGleMiQsIGRvbmRlIGxhICpoaXDDs3Rlc2lzIG51bGEqIHBsYW50ZWEgcXVlIGxhcyB2YXJpYWJsZXMgbm8gZXN0w6FuIGNvcnJlbGFjaW9uYWRhcyBlbnRyZSBzw60uwqAKClNpIGRpY2hhIGhpcMOzdGVzaXMgbnVsYSBubyBlcyByZWNoYXphZGEsIGVudG9uY2VzIG5vIGhhY2Ugc2VudGlkbyByZWFsaXphciB1biBhbsOhbGlzaXMgZmFjdG9yaWFsIGRlYmlkbyBhIHF1ZSBlbCBlc3BhY2lvIG9yaWdpbmFsIG5vIHB1ZWRlIHNlciByZWR1Y2lkby4gU2kgbGEgJEgwJCBzw60gZXMgcmVjaGF6YWRhLCBlbnRvbmNlcyBzaWduaWZpY2EgcXVlIHPDrSB0aWVuZSBzZW50aWRvIHJlYWxpemFyIHVuYSByZWR1Y2Npw7NuIGRlbCBlc3BhY2lvIGRlZmluaWRvIHBvciBsYXMgdmFyaWFibGVzIGluY2x1aWRhcy4gW0B0YWNxX211bHRpdmFyaWF0ZV8xOTk4LCBwLiAyODBdXAoKQSBjb250aW51YWNpw7NuIHNlIHJlYWxpemEgZGljaG8gdGVzdCBtZWRpYW50ZSBlbCBjb21hbmRvIGBCQVJUTEVUVCgpYCwgcXVlIGVzIHBhcnRlIGRlIGxhIGxpYnJlcsOtYSBgRUZBdG9vbHMoKWAsIGRlIGxhIHNpZ3VpZW50ZSBtYW5lcmE6CgpgYGB7ciBiYXJ0bGV0dF90ZXN0LCBmaWcuY2FwPSJQcnVlYmEgZXN0YWTDrXN0aWNhIGRlIEJhcnRsZXR0In0KRUZBdG9vbHM6OkJBUlRMRVRUKGRhdG9zX3BjYSwgI29iamV0byBkYXRhIGZyYW1lIGNvbiBsYXMgdmFyaWFibGVzIGRlIGludGVyw6lzCiAgTiA9IE5BLCAjIHNpIHNlIHJlcXVpZXJlLCBzZSBlc3RhYmxlY2UgZWwgdGFtYcOxbyBkZSBjYXNvcyBhIHJldG9tYXIgZW4gZWwgYW7DoWxpc2lzCiAgdXNlID0gYygicGFpcndpc2UuY29tcGxldGUub2JzIiwgICNhcmd1bWVudG8gcGFyYSBkZWZpbmlyIGxvcyB0aXBvcyBkZSBjYXNvcyBhIGNvbnNpZGVyYXIgZW4gZWwgYW7DoWxpc2lzCiAgICAgICAgICAiYWxsLm9icyIsIAogICAgICAgICAgImNvbXBsZXRlLm9icyIsIAogICAgICAgICAgImV2ZXJ5dGhpbmciLAogICAgICAgICAgIm5hLm9yLmNvbXBsZXRlIiksCiAgY29yX21ldGhvZCA9ICJwZWFyc29uIikgIyBkZWZpbmljacOzbiBkZWwgbcOpdG9kbyBkZSBldmFsdWFjacOzbiBkZSBsYXMgY29ycmVsYWNpb25lcwpgYGAKCkEgcGFydGlyIGRlIGxvcyBkYXRvcyBwcmVzZW50YWRvcyBwb3IgbGEgcHJ1ZWJhIGVzdGFkw61zdGljYSBkZSBCYXJ0bGV0dCwgc2UgcHVlZGUgcmVjaGF6YXIgbGEgJEhfMCQgeSBzZSBhY2VwdGEgcXVlIGxvcyBkYXRvcyBzb24gcGVydGluZW50ZXMgcGFyYSBhdmFuemFyIGVuIGxhIHJlYWxpemFjacOzbiBkZSB1biBhbsOhbGlzaXMgZmFjdG9yaWFsLlwKCiMjIEltcGxlbWVudGFjacOzbiBkZWwgKipQQ0EqKiBlbiBSIFN0dWRpbwoKTGEgcmVhbGl6YWNpw7NuIGRlbCBhbsOhbGlzaXMgKipQQ0EqKiBzZSByZWFsaXphIGEgdHJhdsOpcyBkZWwgY29tYW5kbyBgcGNvbXAoKWAsIHF1ZSBlcyBwYXJ0ZSBkZWwgc2lzdGVtYSBiYXNlIGRlIGBSYC4gTG9zIGFyZ3VtZW50b3MgY2VudHJhbGVzIGEgdXRpbGl6YXIgc2Vyw6FuOgoKLSAgIGB4YCA9IGNvbnNpc3RlIGVuIGxhIG1hdHJpeiBudW3DqXJpY2EgbyBgZGF0YS5mcmFtZSgpYCBxdWUgY29udGllbmUgbG9zIGRhdG9zIG8gdmFyaWFibGVzIHF1ZSBzZSBpbmNsdWlyw6FuIGVuIGVsIGFuw6FsaXNpcy4KLSAgIGBjZW50ZXJgID0gdmFsb3IgbMOzZ2ljbyAoVFJVRSAvIEZBTFNFKSwgcXVlIGluZGljYSBzaSBsYXMgdmFyaWFibGVzIGRlYmVuIGNlbnRyYXJzZSBlbiB1biB2YWxvciAiY2Vyby4iCi0gICBgc2NhbGVgID0gdmFsb3IgbMOzZ2ljbyAoVFJVRSAvIEZBTFNFKSwgcXVlIGluZGljYSBzaSBsb3MgdmFsb3JlcyBvcmlnaW5hbGVzIGRlIGxhcyB2YXJpYWJsZXMgZGUgaW50ZXLDqXMgZGViZXLDoW4gZXN0YW5kYXJpemFyc2UgcGFyYSwgYXPDrSwgY29udGFyIGNvbiB1bmEgdmFyaWFuemEgaWd1YWwgYSAxLCB5IHF1ZSBlc3RvIHNlIGFwbGlxdWUgYW50ZXMgZGUgbGEgcmVhbGl6YWNpw7NuIGRlbCBhbsOhbGlzaXMgKipQQ0EqKi4KLSAgIGBuYS5hY3Rpb25gID0gZnVuY2nDs24gcXVlIGluZGljYSBsYSBtYW5lcmEgZW4gcXVlIHNlIGRlYmVuIHByb2Nlc2FyIGxvcyBjYXNvcyBlbiBsb3MgcXVlIG9jdXJyZW4gdmFsb3JlcyBwZXJkaWRvcyAoYE5BYCkuCgpBc2ltaXNtbyBlcyBpbXBvcnRhbnRlIHF1ZSBsb3MgcmVzdWx0YWRvcyBkZWwgYW7DoWxpc2lzICoqUENBKiogc2VhbiBndWFyZGFkb3MgY29tbyB1biBvYmpldG8gbnVldm8sIGVuIGVsIGFtYmllbnRlIGRlIGBSIFN0dWRpb2AuCgpgYGB7ciBQQ0EsIGNvbGxhcHNlID0gVFJVRX0KcGNhMSA8LSBwcmNvbXAofnYyeF9wb2x5YXJjaHkgKyB2MnhfbGliZGVtICsgdjJ4X3BhcnRpcGRlbSArIHYyeF9kZWxpYmRlbSArIHYyeF9lZ2FsZGVtLCAjIHNlbGVjY2nDs24gZGUgbGFzIHZhcmlhYmxlcyBhIGluY2x1aXIgZW4gZWwgYW7DoWxpc2lzLgogICAgICAgZGF0YSA9IGRhdG9zX3BjYSwgI29iamV0byBmdWVudGUgZGUgbG9zIGRhdG9zLgogICAgICAgY2VudGVyID0gVFJVRSwgIyBzZSBhY2VwdGEgcXVlIGVsIGNlbnRybyBkZSBsYXMgZGltZW5zaW9uZXMgdGVuZ2EgZWwgdmFsb3IgZGUgY2Vyby4KICAgICAgIHNjYWxlID0gVFJVRSwgICMgc2UgYWNlcHRhIHF1ZSBsYXMgdmFyaWFibGVzIG9yaWdpbmFsZXMgc2VhbiBlc3RhbmRhcml6YWRhcy4KICAgICAgIG5hLmFjdGlvbiA9IG5hLm9taXQpICNzZSBlc3RhYmxlY2UgcXVlIGxvcyB2YWxvcmVzIHBlcmRpZG9zIG5vIHNlYW4gaW5jbHVpZG9zIGVuIGVsIGFuw6FsaXNpcy4KcGNhMQpzdW1tYXJ5KHBjYTEpCmBgYAoKRXN0ZSBjb21hbmRvIGRhIGNvbW8gcmVzdWx0YWRvIHVuIG9iamV0byB0aXBvICJsaXN0YSIgcXVlIGVzdMOhIGludGVncmFkbyBwb3IgNyBlbGVtZW50b3MgKGBzZGV2YCwgYHJvdGF0aW9uYCwgYGNlbnRlcmAsIGBzY2FsZWAsIGB4YCwgYGNhbGxgIHkgYG5hLmFjdGlvbmApLCBlbnRyZSBsb3MgbcOhcyByZWxldmFudGVzIHBhcmEgZWwgYW7DoWxpc2lzIGRlbCAqKlBDQSoqIGNvbnNpc3RlbiBlbjoKCjEuICBcJCBgWGA6IGNvbnRpZW5lIGEgbG9zIGNvbXBvbmVudGVzIHByaW5jaXBhbGVzIHF1ZSBzZSB1dGlsaXphbiBwYXJhIGRlZmluaXIgbGEgZ3LDoWZpY2EgUENBLiBDb250aWVuZSB0YW50YXMgY29sdW1uYXMgY29tbyB2YXJpYWJsZXMuIFVzdWFsbWVudGUgc2UgdXNhbiBsYXMgZG9zIGNvbHVtbmFzIHByaW1lcmFzLgoyLiAgXCQgYHNkZXZgOiBzZSByZWZpZXJlIGEgbGFzIGRpc3RhbmNpYXMgZXN0YW5kYXJpemFkYXMgZGUgY2FkYSBjYXNvIGRlbnRybyBkZSBjYWRhIHVubyBkZSBsb3MgY29tcG9uZW50ZXMgcHJpbmNpcGFsZXMuCjMuICBcJCBgcm90YXRpb25gOiBzZSByZWZpZXJlIGFsIHBlc28gZGUgY2FkYSB2YXJpYWJsZSBzb2JyZSBjYWRhIGNvbXBvbmVudGUgcHJpbmNpcGFsLgoKUG9yIHN1IHBhcnRlLCBlbiBsYSBjb25zb2xhIHNlIG11ZXN0cmEgdW5hIG1hdHJpeiBkZSBjb3JyZWxhY2lvbmVzIGVudHJlIGNhZGEgdW5hIGRlIGxhcyB2YXJpYWJsZXMgaW5jbHVpZGFzIGVuIGVsIGFuw6FsaXNpcyBjb24gcmVzcGVjdG8gYSBjYWRhIHVubyBkZSBsb3MgKmNvbXBvbmVudGVzKiBjYWxjdWxhZG9zLiBBcXXDrSBzZSBkZWJlIHJlY29yZGFyIHF1ZSBzZSBjcmVhbiB0YW50b3MgKmNvbXBvbmVudGVzKiAoY29sdW1uYXMpIGNvbW8gdmFyaWFibGVzIChmaWxhcykgc2UgaW5jbHV5ZXJvbiBlbiBlbCBhbsOhbGlzaXMuXAoKRXN0YSBtYXRyaXogZGUgY29ycmVsYWNpb25lcyBlcyBtZWpvciBkZW5vbWluYWRhIGNvbW8gbGEgIiptYXRyaXogZGUgcGVzb3MqIiBwb3IgKmNvbXBvbmVudGUqICgqY29tcG9uZW50IGxvYWRpbmdzKiBtYXRyaXgpLlwKCkRlIG1hbmVyYSBjb21wbGVtZW50YXJpYSwgY29uIGVsIGNvbWFuZG8gYHN1bW1hcnkoKWAgcXVlIGludGVncmEgYWwgb2JqZXRvIGVuIHF1ZSBzZSBndWFyZGFyb24gbG9zIHJlc3VsdGFkb3MgZGVsIGFuw6FsaXNpcyAqKlBDQSoqLCBzZSBtYW5kYSBhIGxsYW1hciB1bmEgdGFibGEgY29tcGxlbWVudGFyaWEgZW4gbGEgcXVlIHNlIHByZXNlbnRhbiB0cmVzIGZpbGFzIGNvbiBpbmZvcm1hY2nDs24gcmVsZXZhbnRlIHBhcmEgY2FkYSBjb21wb25lbnRlLCBlc3RhcyBjb25zaXN0ZW4gZW46CgoxLiAgYFN0YW5kYXJkIGRldmlhdGlvbmA6IGRlc3ZpYWNpw7NuIGVzdMOhbmRhciBvICoqZWlnZW52YWxvcioqIGNvbiBxdWUgc2UgbWlkZSBsYSB2YXJpYW56YSBhbCBpbnRlcmlvciBkZSBjYWRhIGNvbXBvbmVudGUuCjIuICBgUHJvcG9ydGlvbiBvZiBWYXJpYW5jZWA6IHByb3BvcmNpw7NuIGRlIGxhIHZhcmlhbnphLCBjb24gbGEgY2FudGlkYWQgZGUgdmFyaWFuemEgZGVsIHVuaXZlcnNvIGRlIGxvcyBjYXNvcyBxdWUgZXMgY2FwdGFkYSBwb3IgY2FkYSBjb21wb25lbnRlICRDX2kkLgozLiAgYEN1bXVsYXRpdmUgUHJvcG9ydGlvbmA6IHByb3BvcmNpw7NuIGFjdW11bGFkYSBkZSBsYSB2YXJpYW56YSwgcXVlIGNvbnNpc3RlIGVuIGxhIHN1bWEgZGUgbGFzIHByb3BvcmNpb25lcyBkZSB2YXJpYW56YSBleHBsaWNhZGEgcG9yIGNhZGEgY29tcG9udGVudGUgJENfaSQgeSBsb3MgY29tcG9uZW50ZXMgYW50ZWNlZGVudGVzICRDX3tpLTF9JC4gTGEgc3VtYSB0b2RhbCBkZSBsYXMgcHJvcG9yY2lvbmVzIGRhcsOhIGNvbW8gcmVzdWx0YWRvIGVsIHZhbG9yIGRlIDEuCgojIyBMZWN0dXJhIGRlIGxhIG1hdHJpeiBkZSBwZXNvcyBkZSBjb21wb25lbnRlcwoKRXN0YSBtYXRyaXogcGVybWl0ZSBpZGVudGlmaWNhciBsYXMgcHJvcG9yY2lvbmVzIGRlIHZhcmlhbnphIGV4cGxpY2FkYSBwb3IgY2FkYSBjb21wb25lbnRlLCBwdWVzIGNvbnRpZW5lIGxhcyBjb3JyZWxhY2lvbmVzIGVudHJlIGNvbXBvbmVudGVzIHkgdmFyaWFibGVzLiBFc3RvcyBzZSBlbmN1ZW50cmFuIGVuIGxhcyBjZWxkYXMgZW4gcXVlIGNvbnZlcmdlIGNhZGEgdmFyaWFibGUgY29uIGNhZGEgdW5vIGRlIGxvcyBjb21wb25lbnRlcy4gW0B0YWNxX211bHRpdmFyaWF0ZV8xOTk4LCBwLiAyNzldXAoKTG9zIHZhbG9yZXMgZGUgZGljaG9zIGNvZWZpY2llbnRlcyBkZSBjb3JyZWxhY2nDs24gcGVybWl0ZW4gaWRlbnRpZmljYXIgZWwgcGVzbyAoKmxvYWRpbmcqKSBkZSBjYWRhIHVuYSBkZSBsYXMgdmFyaWFibGVzIHNvYnJlIGNhZGEgdW5vIGRlIGxvcyBjb21wb25lbnRlcyAoJENfaSQpLiBEZSBtYW5lcmEgcXVlLCBsYSB2YXJpYWJsZSBxdWUgdGllbmUgdW5hIG1heW9yIGNvcnJlbGFjacOzbiB0YW1iacOpbiB0aWVuZSB1biBtYXlvciBwZXNvICgqbG9hZGluZyopIHNvYnJlIGVsIGNvbXBvbmVudGUsIHkgZXN0byBzaXJ2ZSBwYXJhIGNhcmFjdGVyaXphciBhbCBlamUgbnVldm8gY3JlYWRvIGEgcGFydGlyIGRlIGVzdGUgw7psdGltby5cCgpBZGVtw6FzLCBlbCBjdWFkcmFkbyBkZWwgY29lZmljaWVudGUgZGUgY29ycmVsYWNpw7NuIHNlIHB1ZWRlIGludGVycHJldGFyIGNvbW8gbGEgcHJvcG9yY2nDs24gZGUgbGEgdmFyaWFuemEgZXhwbGljYWRhLiBQb3IgZWouIGVsIHBlc28gKCpsb2FkaW5nKikgZGUgJHhfMSQgZW4gJENfMSQgZXMgZGUgMC40NDcxMzQ3LiBTdSBjdWFkcmFkbyAkKDAuNDQ3MTM0NykgXiAyID0gMC4xOTk5Mjk0JCBzaWduaWZpY2EgcXVlIGVsIDE5Ljk5JSBkZSBsYSB2YXJpYW56YSBkZSBsYSB2YXJpYWJsZSAkeF8xJCBlcyBleHBsaWNhZGEgcG9yIGVsIHByaW1lciBjb21wb25lbnRlICRDXzEkOyBtaWVudHJhcyBxdWUgbGEgcHJvcG9yY2nDs24gZGUgJENfMiQgcXVlIGV4cGxpY2EgZGUgbGEgdmFyaWFuemEgZGUgJHhfMSQgZXMgZGUgJCgwLjQ1NDQ0MzIxKSBeIDIgPSAwLjIwNjUxODYkLCBvIGVsIDIwLjY1JSwgeSBhc8OtIHN1Y2VjaXZhbWVudGUuIExhIHN1bWEgaG9yaXpvbnRhbCBvIHBvciBmaWxhIHNlcsOhIGRlbCAxMDAlIHBhcmEgdG9kYXMgbGFzIHZhcmlhYmxlcyBlbiBjYWRhIHVubyBkZSBsb3MgY29tcG9uZW50ZXMsIHB1ZXMgY2FkYSBjb21wb25lbnRlIGV4cGxpY2EgdW4gcG9yY2VudGFqZSBkZSBsYSB2YXJpYWJpbGlkYWQgZGUgY2FkYSB1bmEgZGUgbGFzIHZhcmlhYmxlcyAkeF9pJC5cCgpMYSBzdW1hIGRlIGxvcyBwZXNvcyBjdWFkcsOhdGljb3MgZW4gY2FkYSBmaWxhIGRlIGxhIG1hdHJpeiBlcyBkZW5vbWluYWRhICIqY29tdW5hbGlkYWQqIi4gTGEgY29tdW5hbGlkYWQgZGUgdW5hIHZhcmlhYmxlIGVuIHRvZG9zIGxvcyBjb21wb25lbnRlcyBzZXLDoSBpZ3VhbCBhIDEgZW4gUENBLiBbQHRhY3FfbXVsdGl2YXJpYXRlXzE5OTgsIHAuIDI3OV1cCgpBbCByZXZpc2FyIGxhcyBjb2x1bW5hcyBkZSBsYSBtYXRyaXosIGxhIHN1bWEgZGUgbG9zIHBlc29zIGN1YWRyw6F0aWNvcyBkZSB1bmEgY29sdW1uYSwgcG9yIGVqLiAkQ19pJCwgZXMgbGEgc3VtYSBkZSBsYXMgcHJvcG9yY2lvbmVzIGRlIHZhcmlhbnphIGRlIGNhZGEgdW5hIGRlIGxhcyB2YXJpYWJsZXMgaW5jbHVpZGFzIHF1ZSBzb24gZXhwbGljYWRhcyBwb3IgZWwgY29tcG9uZW50ZSAkQ19pJC4gRXN0YSBzdW1hIGVzIGlndWFsIGFsICoqZWlnZW52YWxvcioqICgkXGxhbWJkYSQpIGRlbCBjb21wb25lbnRlIHJlc3BlY3Rpdm8sIHBvciBlai4gJChDXzEgciB4XzEpXjIgKyAoQ18xIHIgeF8yKV4yICsgKENfMSByIHhfMyleMiA9IChcbGFtYmRhKSQuIFtAdGFjcV9tdWx0aXZhcmlhdGVfMTk5OCwgcC4gMjc5XVwKCkRvbmRlOgoKMS4gICQoQ19pIHIgeF9pKV4yJCA9IGN1YWRyYWRvIGRlIGxhIGNvcnJlbGFjacOzbiBkZWwgY29tcG9uZW50ZSAkLWkkIGNvbiBsYSB2YXJpYWJsZSAkeF9pJC4KMi4gICRcbGFtYmRhJCA9IGVpZ2VudmFsb3IuCgpMb3MgKmVpZ2VudmFsb3Jlcyogc2UgcHVlZGVuIGludGVycHJldGFyIGdlb23DqXRyaWNhbWVudGUgY29tbyBsYSBleHRlbnNpw7NuIG8gZGlzdGFuY2lhIGRlIGxhcyBwcm95ZWNjaW9uZXMgZGUgY2FkYSBjYXNvIHNvYnJlIGNhZGEgdW5vIGRlIGxvcyBjb21wb25lbnRlcyBlbiBsb3MgcXVlIGVzdMOhbiBkaXNwZXJzb3MuIEVuICoqUENBKiosIGxhIHN1bWEgZGUgbG9zICplaWdlbnZhbG9yZXMqIGVzIGlndWFsIGEgbGEgc3VtYSBkZSB2YXJpYW56YXMgZGUgbGFzIHZhcmlhYmxlcyBlc3RhbmRhcml6YWRhcyAocXVlIGVzIHVuIG7Dum1lcm8gZW50ZXJvIGNvcnJlc3BvbmRpZW50ZSBhIGxhIGNhbnRpZGFkIGRlIHZhcmlhYmxlcyBpbmNsdWlkYXMpLsKgCgpBIHBhcnRpciBkZSBlc3RhIHByb3BpZWRhZCwgY2FkYSAqZWlnZW52YWxvciogc2UgcHVlZGUgZXhwcmVzYXIgY29tbyB1bmEgcHJvcG9yY2nDs24gZGUgZXN0YSBzdW1hLiBQYXJhIGVsIHByaW1lciAqZWlnZW52YWxvciosIGVzdGEgcHJvcG9yY2nDs24gZXMgJFxsYW1iZGFfMSAvIFxzaWdtYV97XGxhbWJkYV9pfT0gKmVpZ2VudmFsb3IqIC8gbl94ID0gcHJjX3t4MX0kIGV4cGxpY2FkbyBkZWwgdG90YWwgZGUgbGEgdmFyaWFuemEgZGUgbGFzIHZhcmlhYmxlcyBpbmNsdWlkYXMsIHkgYXPDrSBzdWNlc2l2YW1lbnRlLiBbQHRhY3FfbXVsdGl2YXJpYXRlXzE5OTgsIHAuIDI3OV1cCgojIFNlbGVjY2nDs24gZGUgbG9zIGNvbXBvbmVudGVzIHByaW5jaXBhbGVzCgpFbCBtw6l0b2RvIGRlICoqUENBKiogLWNvbW8gc2UgcmVmaXJpw7MgYXJyaWJhLSBlcyB1bmEgdMOpY25pY2EgcXVlIHBlcm1pdGUgdHJhYmFqYXIgY29uIHVuYSBtYXRyaXogZW4gbGEgcXVlIG5vIHNlIGN1ZW50YSBjb24gdW5hIHZhcmlhYmxlIGRlcGVuZGllbnRlLCBwdWVzIGxhIG1ldGEgYW5hbMOtdGljYSBlc3TDoSBwdWVzdGEgZW4gaWRlbnRpZmljYXIgbGEgImVzdHJ1Y3R1cmEgbGF0ZW50ZSIgcXVlIGV4aXN0ZSBkZXRyw6FzIGRlIGxhcyB2YXJpYWJsZXMgYW5hbGl6YWRhcy4gRXN0byBkYSBwYXNvIGEgcXVlIGxvcyByZXN1bHRhZG9zIGFycm9qYWRvcyBwb3IgZWwgYW7DoWxpc2lzICoqUENBKiogbm8gbmVjZXNhcmlhbWVudGUgc2VhbiBjb25jbHV5ZW50ZXMgZW4gdMOpcm1pbm9zIGRlICIqY2F1c2FzLWVmZWN0b3MqIi5cCgpFbiBlc3RlIHNlbnRpZG8sIHNlIGNvbnNpZGVyYSBxdWUgZWwgYW7DoWxpc2lzICoqUENBKiogZXMgdW5hIHTDqWNuaWNhIHF1ZSBzZSBhcG95YSwgZW4gZ3JhbiBtZWRpZGEsIGVuIGxhIHN1YmpldGl2aWRhZCBkZWwgYW5hbGlzaXN0YSwgZXNwZWNpYWxtZW50ZSwgYWwgbW9tZW50byBkZSBzZWxlY2Npb25hciBsYSBjYW50aWRhZCBkZSBjb21wb25lbnRlcyBuZWNlc2FyaW9zIHBhcmEgc2ltcGxpZmljYXIgbGEgZXN0cnVjdHVyYSBkZSBsYSBtYXRyaXogZGUgZGF0b3MgYW5hbGl6YWRhLlwKCkVzdG8gc2UgdHJhZHVjZSBlbiBxdWUgbm8gZXhpc3RlbiBjcml0ZXJpb3MgZXN0YWTDrXN0aWNvcyBjb25jbHV5ZW50ZXMgcGFyYSBkZWZpbmlyIGxhIGNhbnRpZGFkIGNvbXBvbmVudGVzIGEgc2VsZWNjaW9uYXIuIFBlcm8gc2UgcHVlZGVuIGlkZW50aWZpY2FyIGFsZ3VuYXMgcGF1dGFzIGV4aXN0ZW50ZXMgLXkgcmVjdXJyZW50ZXMgZW4gbG9zIGFuw6FsaXNpcy0gcGFyYSBhdmFuemFyIGVuIGxhIHNlbGVjY2nDs24gZGUgbGEgY2FudGlkYWQgZGUgY29tcG9uZW50ZXMgYSByZWN1cGVyYXIgdHJhcyBsYSByZWR1Y2Npw7NuIGRlIGRpbWVuc2lvbmVzLiBFc3RvcyBjb25zaXN0ZSBlbjoKCiMjIENyaXRlcmlvIGJhc2FkbyBlbiBlbCAqZWlnZW52YWxvcioKCkVsIHByaW1lciBjcml0ZXJpbyBmdWUgcHJvcHVlc3RvIHBvciBLYWlzZXIgW0BrYWlzZXJfYXBwbGljYXRpb25fMTk2MF0geSBjb25zaXN0ZSBlbiAibWFudGVuZXIgc29sbyBsb3MgY29tcG9uZW50ZXMgY3V5byAqZWlnZW52YWxvciogZXMgbWF5b3IgYSAxLiIgW0B0YWNxX211bHRpdmFyaWF0ZV8xOTk4LCBwLjI4MF1cCgpFc3RlIGNyaXRlcmlvIHN1ZWxlIHNlIGVsICpkZWZhdWx0KiBlbiBsb3MgcHJvZ3JhbWFzIGRlIGNvbXB1dGFjacOzbiwgcGVybyBzZSBkZWJlIG9ic2VydmFyIGNvbiBkZXRlbmltaWVudG8gbGEgbWF0cml6IGRlIHBlc29zICgqbG9hZGluZ3MqKSBwYXJhIGV2YWx1YXIgc2kgbGFzIGNvcnJlbGFjaW9uZXMgZW50cmUgdmFyaWFibGVzIHkgZWwgcmVzdG8gZGUgbG9zIGNvbXBvbmVudGVzIHF1ZSBubyBhbGNhbnphbiBhIGN1YnJpciBkaWNobyBjcml0ZXJpbywgdGFtYmnDqW4gZXMgYWx0by7CoAoKRXN0byBzdXBvbmUgcXVlIHZhbGUgbGEgcGVuYSByZSBjb25zaWRlcmFyIGluY2x1aXIgbG9zIGNvbXBvbmVudGVzIHF1ZSB0aWVuZSBjb3JyZWxhY2lvbmVzIGFsdGFzIGNvbiB2YXJpYWJsZXMsIGHDum4gY3VhbmRvIHN1ICplaWdlbnZhbG9yKiBlc3TDqSBwb3IgZGViYWpvIGRlbCB2YWxvciBkZSAxLCBwdWVzIHB1ZWRlbiBhcG9ydGFyIGVsZW1lbnRvcyB0ZcOzcmljb3MgZXhwbGljYXRpdm9zLiBbQHRhY3FfbXVsdGl2YXJpYXRlXzE5OTgsIHAuIDI4MF1cCgojIyBDcml0ZXJpbyBncsOhZmljbwoKT3RybyBjcml0ZXJpbyBzZSBhcG95YSBlbiBsYSBncsOhZmljYSBkZSBsb3MgKmVpZ2VudmFsb3JlcyogZW4gdW4gKipzY3JlZSBwbG90KiogeSBzdSBwcnVlYmEgZW4gdW4gKipzY3JlZSB0ZXN0KiosIGRlc2Fycm9sbGFkbyBwb3IgQ2F0dGVsIFtAY2F0dGVsbF9oYW5kYm9va18xOTY2XS4gRXN0YSBjb25zaXN0ZSBlbiBncmFmaWNhciBsYSBkaXN0cmlidWNpw7NuIGRlIGxvcyBjb21wb25lbnRlcywgb3JkZW5hZG9zIHBvciBzdXMgKmVpZ2VudmFsb3JlcyogeSwgYWxsw60sIGlkZW50aWZpY2FyIGVsICJjb2RvIiBkZSBsYSBkaXN0cmlidWNpw7NuLiBTZXLDoSBlbiBlc2EgcG9zaWNpw7NuIGRvbmRlIHNlIGRlZmluYSBsYSBjYW50aWRhZCBkZSBjb21wb25lbnRlcyBhIGluY2x1aXIuIFtAdGFjcV9tdWx0aXZhcmlhdGVfMTk5OCwgcC4gMjgwXQoKTGEgbWFuZXJhIGRlIGdlbmVyYXIgZGljaGEgZ3LDoWZpY2EgZXMgYSBwYXJ0aXIgZGU6CgpgYGB7ciBzY3JlZV9wbG90LCBmaWcuY2FwPSAiU2NyZWUgcGxvdCJ9CnZhcl9leHBsaWNhZGEgPSBwY2ExICQgc2RldiBeIDIgLyBzdW0ocGNhMSAkIHNkZXYgXiAyKSAjdmVjdG9yIGNvbiBsYSB2YXJpYW56YSBleHBsaWNhZGEgcG9yIGNhZGEgY29tcG9uZW50ZQpxcGxvdChjKDE6NSksIHZhcl9leHBsaWNhZGEpICsgCiAgZ2VvbV9saW5lKCkgKyAKICB4bGFiKCJDb21wb25lbnRlIFByaW5jaXBhbCIpICsgCiAgeWxhYigiVmFyaWFuemEgRXhwbGljYWRhIikgKwogIGdndGl0bGUoIlNjcmVlIFBsb3QiKQpgYGAKCkVuIGVzdGEgZ3LDoWZpY2Egc2Ugb2JzZXJ2YSBxdWUgZW4gZWwgZWplIFggKGhvcml6b250YWwpIHNlIGVuY3VlbnRyYSBkaXN0cmlidWlkb3MgY2FkYSB1bm8gZGUgbG9zIGNvbXBvbmVudGVzIGdlbmVyYWRvcywgbWllbnRyYXMgcXVlIGVuIGVsIGVqZSBZICh2ZXJ0aXphbCkgc2UgbWlkZSBsYSBwcm9wb3JjacOzbiBkZSB2YXJpYW56YSBleHBsaWNhZGEgKGRlbCB0b3RhbCBkZWwgdW5pdmVyc28gZGUgY2Fzb3MgY29udGVuaWRvcyBlbiBsYSBtYXRyaXogZGUgZGF0b3MpIHF1ZSBleHBsaWNhIG8gYWJhcmNhIGNhZGEgdW5vIGRlIGxvcyBjb21wb25lbnRlcyAkQ19pJC5cCgpFbCBvYmpldGl2byBlbiBkaWNobyBncsOhZmljbyBjb25zaXN0ZSBlbiBpZGVudGlmaWNhciBsYSB1YmljYWNpw7NuIGRlbCAiY29kbyIgZW4gbGEgY3VydmEgcXVlIHVuZSBhIGxhcyBwcm9wb3JjaW9uZXMgZGUgdmFyaWFuemEgZXhwbGljYWRhIHBvciBjYWRhIGNvbXBvbmVudGUuIFB1ZXMgZWwgbHVnYXIgbyBjb21wb25lbnRlIGVuIHF1ZSBzZSBlbmN1ZW50cmUgZGljaG8gZG9ibGV6IGVuIGxhIGN1cnZhLCBzZXJ2aXLDoSBwYXJhIGluZGljYXIgbGEgY2FudGlkYWQgZGUgbnVldmFzIGRpbWVuc2lvbmVzIGEgbWFudGVuZXIgcGFyYSBlbCBhbsOhbGlzaXMgZXN0YWTDrXN0aWNvIHBvc3Rlcmlvci5cCgpDb21vIHNlIG9ic2VydmEgZW4gbGEgZ3LDoWZpY2EgZGVsICIqc2NyZWUgcGxvdCoiLCBlbCBjb2RvIHNlIHViaWNhIGVuIGxhIHBvc2ljacOzbiBkZWwgc2VndW5kbyBjb21wb25lbnRlLCBwb3IgbG8gcXVlIGxhIGRlY2lzacOzbiBkZWwgYW5hbGlzdGEgdGVuZHLDrWEgcXVlIHBhcnRpciBkZSwgcHJpbWVybywgYWNlcHRhciBsYSBpbmNsdXNpw7NuIGRlbCBwcmltZXIgY29tcG9uZW50ZSwgbWllbnRyYXMgcXVlIGRlYmVyw6EgZXhhbWluYXIgbGEgbWF0cml6IGRlICJwZXNvcyIgKCpsb2FkaW5ncyopIHkgbG9zIHZhbG9yZXMgZGUgbGFzIGNvcnJlbGFjaW9uZXMgZXhpc3RlbnRlcyBlbnRyZSBsYXMgdmFyaWFibGVzIGNvbiBlbCBjb21wb25lbnRlIDIgJENfMiQgcGFyYSwgYXPDrSwgZGVjaWRpciBzaSBzdSBpbmNsdXNpw7NuIGVzIHBlcnRpbmVudGUgdGXDs3JpY2FtZW50ZS5cCgojIEdyYWZpY2FjacOzbiBkZSBsb3MgQ29tcG9uZW50ZXMgUHJpbmNpcGFsZXMKCkNvbW8gc2UgbWVuY2lvbsOzIGFycmliYSwgZWwgbcOpdG9kbyAqKlBDQSoqIHNlIGFwb3lhIC1lbiBncmFuIG1lZGlkYS0gZW4gbGEgcmVwcmVzZW50YWNpw7NuIGdlb23DqXRyaWNhIGRlIGxvcyBjb21wb25lbnRlcywgZW4gbG9zIHF1ZSBzZSBncmFmaWNhbiBsYSBwcm95ZWNjacOzbiBkZSBjYWRhIGNhc28gKGZpbGEpIGRlIGxhIG1hdHJpeiBkZSBkYXRvcyBzb2JyZSBjYWRhIHVuYSBkZSBsYXMgbnVldmFzIGRpbWVuc2lvbmVzIGdlbmVyYWRhcyB5IHNlbGVjY2lvbmFkYXMgZW4gZWwgYW7DoWxpc2lzIGRlIHJlZHVjY2nDs24gZGUgZGltZW5zaW9uZXMuXAoKRW4gZXN0ZSBncsOhZmljbyBudWV2byBzZSB0b21hbiBlbiBjb25zaWRlcmFjacOzbiBsYXMgY29ycmVsYWNpb25lcyBleGlzdGVudGVzIGVudHJlIHRvZG9zIGxvcyBjYXNvcyBwYXJhIHRvZGFzIHN1cyB2YXJpYWJsZXMgeSBzZSBtYXBlYW4gZW4gdW4gcGxhbm8gZGUgJHAkIGRpbWVuc2lvbmVzLiBFbiBzdSBpbnRlcmlvciwgbG9zIGNhc29zIHF1ZSByZWdpc3RyZW4gY29ycmVsYWNpb25lcyBhbHRhcyBlbnRyZSBzw60gc2UgdGllbmRlbiBhIHViaWNhciBvIGFncnVwYW4ganVudG9zLlwKCkxhIG1hbmVyYSBkZSBlbGFib3JhciBkaWNobyBncsOhZmljbywgdW5hIHZleiBxdWUgc2UgZGVmaW5pw7MgcXVlIHNlIGNvbnNpZGVyYXLDrWEgMiBjb21wb25lbnRlcyBwYXJhIGxhIHJlZHVjY2nDs24gZGUgbGFzIGRpbWVuc2lvbmVzIGRlIGxhIG1hdHJpeiBkZSBkYXRvcywgc2UgcHVlZGUgcmVhbGl6YXIgY29uIGVsIGNvbWFuZG8gYGJpcGxvdCgpYCBkZWwgc2lzdGVtYSBiYXNlIGRlIGBSYCwgcGVybyBhIGNvbnRpbnVhY2nDs24gc2UgcmVhbGl6YSBjb24gZWwgY29tYW5kbyBgZnZpel9wY2FfYmlwbG90KClgIGRlIGxhIGxpYmVyw61hIGBmYWN0b2V4dHJhKClgIGRlIGxhIHNpZ3VpZW50ZSBtYW5lcmE6CgpgYGB7ciBiaXBsb3QsIGZpZy5jYXA9ICJHcsOhZmljbyBkZSAyIGNvbXBvbmVudGVzIHByaW5jaXBhbGVzLiJ9CmZ2aXpfcGNhX2JpcGxvdChwY2ExLCAjbWF0cml6IGRlIGRhdG9zIHF1ZSBjb250aWVuZSBsb3MgcmVzdWx0YWRvcyBkZWwgYW7DoWxpc2lzIFBDQQogICAgICAgICAgICAgICAgZ2VvbSA9ICJwb2ludCIsICNyZXByZXNlbnRhY2nDs24gZ3LDoWZpY2EgbyBwcm95ZWNjacOzbiBkZSBjYWRhIHVubyBkZSBsb3MgY2Fzb3MgCiAgICAgICAgICAgICAgICBjb2wudmFyID0gInJlZCIsICNkZWZpbmljacOzbiBkZWwgY29sb3IgcGFyYSBsYSByZXByZXNlbnRhY2nDs24gZGUgbGFzIHZhcmlhYmxlcwogICAgICAgICAgICAgICAgY29sLmluZCA9ICJncmV5IikgI2RlZmluaWNpw7NuIGRlbCBjb2xvciBwYXJhIGxhIHByb3llY2Npw7NuIGRlIGxvcyBjYXNvcwpgYGAKCkEgcGFydGlyIGRlIGRpY2hvIGdyw6FmaWNvIHNlIG9ic2VydmEgbG8gc2lndWllbnRlOgoKMS4gIEFtYm9zIGVqZXMgc2UgZW5jdWVudHJhbiBlcyBlc2NhbGFzIGVzdGFuZGFyaXphZGFzLgoyLiAgRWwgZWplIFggc2UgY29ycmVzcG9uZGUgY29uIGVsICRDXzEkIHkgZWwgcG9yY2VudGFqZSBkZSB2YXJpYWJpbGlkYWQgcXVlIGV4cGxpY2EgZGUgbG9zIGNhc29zLgozLiAgRWwgZWplIFkgc2UgY29ycmVzcG9uZGUgY29uIGVsICRDXzIkIHkgZWwgcG9yY2VudGFqZSBkZSB2YXJpYWJpbGlkYWQgcXVlIGV4cGxpY2EgZGUgbG9zIGNhc29zLgo0LiAgQ2FkYSB1bm8gZGUgbG9zIHB1bnRvcyByZXByZXNlbnRhZG9zIGRlbnRybyBkZWwgcGxhbm8gY2FydGVzaWFubyBzZSBjb3JyZXNwb25kZSBjb24gbGEgcHJveWVjY2nDs24gZGUgY2FkYSB1bm8gZGUgbG9zIGNhc29zIChmaWxhcykgY29udGVuaWRvcyBlbiBsYSBtYXRyaXogZGUgZGF0b3Mgb3JpZ2luYWwgc29icmUgY2FkYSB1bm8gZGUgbG9zIGNvbXBvbmVudGVzLgo1LiAgU2UgcmVwcmVzZW50YW4gbGFzIHZhcmlhYmxlcyBvcmlnaW5hbGVzIGluY2x1aWRhcyBlbiBlbCBhbsOhbGlzaXMgKGVuIGNvbG9yIHJvam8pLgoKQSBwYXJ0aXIgZGUgZXN0YSByZXByZXNlbnRhY2nDs24gc2UgcHVlZGUgb2JzZXJ2YXIgbGEgcHJveWVjY2nDs24gZGUgY2FkYSB1bm8gZGUgbG9zIGNhc29zIHNvYnJlIGNhZGEgdW5hIGRlIGxhcyBkaW1lbnNpb25lcyBvIGNvbXBvbmVudGVzIHNlbGVjY2lvbmFkb3MuIFksIGdyw6FmaWNhbWVudGUsIHNlIHB1ZWRlIG9ic2VydmFyIGxhIHBvc2ljacOzbiBkZSBjYWRhIHVuYSBkZSBsYXMgdmFyaWFibGVzIHNvYnJlIGxvcyBlamVzIHF1ZSByZXByZXNlbnRhIGNhZGEgdW5vIGRlIGxvcyBjb21wb25lbnRlcy4gQSBwYXJ0aXIgZGUgdWJpY2FyIGxhIHZhcmlhYmxlIHF1ZSBzZSBhbGluZWEgc29icmUgbGEgbMOtbmVhIHB1bnRlYWRhIChsYSByZXByZXNlbnRhY2nDs24gZGUgY2FkYSBkaW1lbnNpw7NuKSwgZXN0byBheXVkYSBhIGlkZW50aWZpY2FyIGN1w6FsIGRlIMOpc3RhcyBlcyBsYSBxdWUgdGllbmUgbcOhcyAicGVzbyIgKCpsb2FkaW5nKikgc29icmUgZGljaG8gY29tcG9uZW50ZS5cCgpJZGVudGlmaWNhciBlbCBwZXNvIGRlIGxhIHZhcmlhYmxlIHNvYnJlIGNhZGEgZGltZW5zacOzbiBheXVkYSBhIGludGVycHJldGFyIGVsIHNlbnRpZG8gdGXDs3JpY28gZGUgY2FkYSBjb21wb25lbnRlLlwKCkVuIGxhIGdyw6FmaWNhIGFudGVyaW9yIHNlIHB1ZWRlIG9ic2VydmFyIHF1ZSBsYXMgdmFyaWFibGVzIGRlICJkZW1vY3JhY2lhIGxpYmVyYWwiICh2MnhfbGliZGVtKSB5IGRlICJkZW1vY3JhY2lhIGRlbGliZXJhdGl2YSIgKHYyeF9kZWxpYmRlbSIpIHNvbiBsYXMgcXVlIGVqZXJjZW4gbWF5b3IgaW5mbHVlbmNpYSBzb2JyZSBlbCBwcmltZXIgY29tcG9uZW50ZSAkQ18xJC4gRW4gY2FtYmlvLCBzb2JyZSBsYSBzZWd1bmRhIGRpbWVuc2nDs24gJENfMiQgbm8gbmVjZXNhcmlhbWVudGUgYWxndW5hIGRlIGxhcyB2YXJpYWJsZXMgZWplcmNlIHVuIHBlc28gKCpsb2FkaW5nKikgZGVjaXNpdm8gc29icmUgc3UgY29tcG9ydGFtaWVudG8uXAoKIyBSZWZlcmVuY2lhcwo=