Presentación.

En este documento se seguirá trabajando con los datos y las variables utilizadas respecto del documento sobre regresión lineal simple, que se vio anteriormente.
Sin embargo, en este documento se hace una explicación de corte práctica y operativa sobre la implementación de un modelo de regresión múltiple, y se dejará de lado la referencia a los supuestos teórico estadísticos que sustentan a los resultados.

Los elementos a abordar en este documento son:

  • Examinar los datos antes de ajustar el modelo.
  • Encajando el modelo.
  • Comprobando los supuestos del modelo.
  • Interpretar la salida del modelo.
  • Evaluación de la bondad de ajuste del modelo.
  • Usar el modelo para hacer predicciones.

0. Ambiente de trabajo.

A continuación se recomienda realizar algunos de los ajustes para configurar a R previo al proceso del tratamiento de los datos.

Al comenzar siempre es importante establecer el idioma adecuado para que el programa reconozca caractreres especiales. En el caso de definir al idioma español, la instrucción a utilizar es:

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"
Sys.setenv(LANG = "spa")

También es importante instalar las librerías que se utilizarán posteriormente:

library(tidyverse)
## ── Attaching packages ─────────────────────────────────────── tidyverse 1.3.1 ──
## ✓ ggplot2 3.3.5     ✓ purrr   0.3.4
## ✓ tibble  3.1.6     ✓ dplyr   1.0.7
## ✓ tidyr   1.1.4     ✓ 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(equatiomatic)

Finalmente se debe cargar la base de datos o data frame en el ambiente del programa, con el que se analizará la información. Para ello habrá que “cargar” la información sobre el Índice de Desarrollo Humano generado por el PNUD-ONU para cada uno de los municipios en México en el año 2000 y 2005.

datos_idh <- read.csv("~/Dropbox/R/idh_mpio_2000_2005.csv", header = TRUE) #ruta de acceso a los datos, 'header = TRUE' en caso de que el archivo cuente con nombres de las variables.

Y ahora se debe explorar la estructura de la matriz de datos para identificar las dimensiones de la base así como el tipo de variables registradas en el data frame.

str(datos_idh)
## 'data.frame':    2454 obs. of  22 variables:
##  $ id_mpio                      : int  9014 19019 20350 9016 9003 19046 8019 28009 15054 15020 ...
##  $ entidad                      : chr  "Distrito Federal" "Nuevo León" "Oaxaca" "Distrito Federal" ...
##  $ mpio                         : chr  "Benito Juárez" "San Pedro Garza García" "San Sebastián Tutla" "Miguel Hidalgo" ...
##  $ clasificacion_2000           : int  1 2 16 4 3 6 13 21 9 20 ...
##  $ grado_idh_2005               : chr  "alto" "alto" "alto" "alto" ...
##  $ idh_2000                     : num  0.916 0.892 0.854 0.882 0.884 ...
##  $ clasificacion_2005           : int  1 2 3 4 5 6 7 8 9 10 ...
##  $ idh_2005                     : num  0.951 0.95 0.92 0.919 0.917 ...
##  $ tasa_moralidad_infantil_2000 : num  17.6 18.4 18 19.1 18.8 ...
##  $ tasa_mortalidad_infantil_2005: num  3.02 3.19 5.28 7.3 6.96 ...
##  $ tasa_alfabetizacion_2000     : num  98.9 97.9 97.3 97.9 97.5 ...
##  $ tasa_alfabetizacion_2005     : num  97.7 98.3 98.5 97.9 97.9 ...
##  $ tasa_asistencia_escolar_2000 : num  77.4 65.3 80.5 70.6 73.6 ...
##  $ tasa_asistencia_escolar_2005 : num  78.7 67.4 81.8 73.1 75.1 ...
##  $ usd_ppc_2000                 : num  31182 27914 10349 21290 20911 ...
##  $ usd_ppc_2005                 : num  27824 33813 16441 21549 19724 ...
##  $ indice_salud_2000            : num  0.874 0.868 0.871 0.862 0.864 ...
##  $ indice_salud_2005            : num  1 0.998 0.98 0.963 0.966 ...
##  $ indice_educacion_2000        : num  0.917 0.87 0.917 0.888 0.895 ...
##  $ indice_educacion_2005        : num  0.914 0.88 0.929 0.897 0.903 ...
##  $ indice_ingreso_2000          : num  0.958 0.94 0.774 0.895 0.892 ...
##  $ indice_ingreso_2005          : num  0.939 0.972 0.852 0.897 0.882 ...

1. Exploración descriptiva de los datos.

En este documento seguiremos trabajando con los datos sobre el Índice de Desarrollo Humano elaborado por el PNUD para los años del 2000 y 2005. Y se buscará explicar a la variable de la Tasa de Mortadilidad Infantil (\(Y\)) del año 2005, a partir de otra serie variables independientes: Ingreso per Cápita (\(X_1\)), Tasa de Alfabetización (\(X_2\)) y Tasa de Asistencia Escolar (\(X_3\)), todas para el año 2005. Con esto podemos crear un objeto que integre solo a las variables de interés.

idh_reg <- datos_idh %>%
  select(tasa_mortalidad_infantil_2005,
         tasa_alfabetizacion_2005,
         tasa_asistencia_escolar_2005,
         usd_ppc_2005)

A partir de estas variables, en el fondo se sigue evaluando el efecto que tiene el Ingreso per Cápita (\(X_1\)) sobre la Tasa de Mortalidad Infantil (\(Y\)), que se asume que es la variable causal más importante a entender. Sin embargo ahora surge la importancia de implementar un control sobre el efecto de \(X_1\) sobre \(Y\) para, así, identificar si la importancia de \(X_1\) depende, también, de otras variables o factores del contexto en que funciona en la realidad.

En un primer momento debemos examinar los datos de manera descriptiva para, así, evaluar si la regresión lineal múltiple será un buen modelo para ajustarse a la información existente. En particular, debemos verificar si las variables explicativas o independientes tienen una asociación lineal con la variable dependiente, lo que indicaría que un modelo de regresión lineal múltiple puede ser adecuado.

Para hacerlo, podemos usar la función pairs() para crear un diagrama de dispersión de cada posible par de variables:

chart.Correlation(idh_reg, #aquí se carga el objeto tipo matriz
                  histogram = TRUE, #se acepta la elaboración de histograma
                  method = "pearson") #se define el método estadístico para calcular la correlación

De este diagrama de pares podemos ver lo siguiente:

  • La tasa de mortalidad infantil tiene una asociación negativa y moderada con la Tasa de Alfabetización.
  • La tasa de mortalidad infantil tiene una asociación negativa y baja con la Tasa de Asistencia Escolar.
  • La tasa de mortalidad infantil tiene una asociación negativa y moderada con el Ingreso per Cápita, pero tiene una forma curva.

En gran medida se puede asumir que las variables tienen una asociación lineal con la variable dependiente, por lo que valdría la pena continuar con la construcción del modelo de regresión lineal múltiple.

2. Ajuste del modelo.

La realización de un modelo de regresión lineal múltiple supone que existirán más de una variable en la ecuación del lado de posición en que se ubican a las independientes o explicativas. Inicialmente se puede asumir que el efecto de estas variables es aditivo entre sí, o que sus efectos se suman, al momento de explicar de manera conjunta al comportamiento de la variable dependiente.

Este tipo de modelos se contruyen con el comando lm() de la siguiente forma:

lm (variable_respuesta ~ variable_predictor1 + variable_predictor2 + ..., datos = datos)

El modelo de regresión lineal múltiple para nuestros datos es el siguiente:

m1 <- lm(tasa_mortalidad_infantil_2005 ~  #Variable Dependiente
         usd_ppc_2005 +                   #Variable Independiente
         tasa_asistencia_escolar_2005 +   #Variable de control 1
         tasa_alfabetizacion_2005,        #Variable de control 2
         data = datos_idh)

Con esto se crea un objeto del tipo “lista” que contiene 13 elementos, y que serán utilizados en diversos momentos del análisis de la regresión lineal, a semejanza de la manera en que se revisa para el modelo simple.

3. Comprobación de supuestos del modelo.

Antes de proceder a verificar los resultados del modelo (significancia estadística del modelo y valores de los coeficientes de regresión), primero debemos verificar que se cumplan los supuestos del modelo. Es decir, necesitamos verificar lo siguiente:

  1. La distribución de los residuos del modelo debe ser aproximadamente normal.
    Podemos comprobar si se cumple esta suposición creando un histograma simple de residuos:
hist (resid(m1))

En el caso de la gráfica de histograma sobre la distribución de los valores de los residuos (\(e_i = \hat{Y} - Y_i\)) se observa que cuenta con una curva parecida a una distribución normal, la que también ubica al centro de su distirbución sobre el valor de 0 (cero). Esto hace pensar que sí cuenta con una distribución del tipo normal. Sin embargo se debe tomar en consideración que tiene un sesgo muy grande hacia la derecha. Por ello es necesario evaluar la forma de su distribución mediante una prueba estadística.

Otra forma de verificar su distribución normal de forma más precisa es mediante una prueba estadística sobre la normalidad de su distribución. Para ello se utiliza la prueba de Shapiro Wilkinson, que se manda a llamar con el comando shapiro.test().

shapiro.test(m1 $ residuals)
## 
##  Shapiro-Wilk normality test
## 
## data:  m1$residuals
## W = 0.92391, p-value < 2.2e-16

La H0 que se está evaluando consiste en que “la distribución de los residuos es igual a una distribución normal.” En este caso se debe rechazar H0. Y con este resultado se está infiriendo que los valores de los residuos no se distribuyen normalmente; esto es un problema inicial para este modelo y para la interpretación de sus resultados. Sin embargo, por cuestión de practicidad, se continuará en el desarrollo de este ejercicio.

  1. La varianza de los residuales debe ser consistente para todas las observaciones.  Esta condición se conoce como homocedasticidad. La violación de este supuesto se conoce como heterocedasticidad . Para comprobar gráficamente si se cumple esta suposición, podemos crear un valor ajustado (fitted values) frente a una gráfica residual:
plot(fitted.values(m1), #extraer los valores ajustados para Y
      resid(m1)) #extraer el valor de los residuos para cada caso X
abline(h = 0, lty = 2) #add línea horizontal en 0

Idealmente, lo que se busca encontrar es que los valores residuales estuvieran igualmente dispersos en cada valor ajustado (fitted value). Sin embargo esto no es lo que se observa en la gráfica, sino que ocurre que existe una tendencia creciente al aumento de los valores de los residuos en la parte superior de la gráfica, entre el rango de 0 a 30 fitted values. Esto es, conforme aumentan los valores ajustados (fitted values), tamién se tiende a incrementar el valor de los residuos, lo que da pie a la heteroscedasticidad de la varianza. Esto es indicativo de la falta de normalidad en la distribución de los residuos, confirmando lo visto en la prueba de normalidad en la distribución.

4. Interpretación de los valores del modelo de regresión aditiva.

Una vez que hayamos verificado que los supuestos del modelo se cumplen suficientemente, se pueden ver los valores calculados para el modelo usando la función summary():

options(scipen = 999)
summary(m1)
## 
## Call:
## lm(formula = tasa_mortalidad_infantil_2005 ~ usd_ppc_2005 + tasa_asistencia_escolar_2005 + 
##     tasa_alfabetizacion_2005, data = datos_idh)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -15.451  -3.542  -0.725   2.711  42.928 
## 
## Coefficients:
##                                 Estimate  Std. Error t value
## (Intercept)                  73.97817371  1.44802893   51.09
## usd_ppc_2005                 -0.00087216  0.00004614  -18.90
## tasa_asistencia_escolar_2005 -0.29936215  0.01923568  -15.56
## tasa_alfabetizacion_2005     -0.31801928  0.01268678  -25.07
##                                         Pr(>|t|)    
## (Intercept)                  <0.0000000000000002 ***
## usd_ppc_2005                 <0.0000000000000002 ***
## tasa_asistencia_escolar_2005 <0.0000000000000002 ***
## tasa_alfabetizacion_2005     <0.0000000000000002 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 5.345 on 2450 degrees of freedom
## Multiple R-squared:  0.5682, Adjusted R-squared:  0.5677 
## F-statistic:  1075 on 3 and 2450 DF,  p-value: < 0.00000000000000022

A partir de los resultados de salida se pueden evaluar 2 dimensiones del modelo:

  1. La significancia estadística y la bondad de ajuste del modelo en general.
  2. El valor del coeficiente de correlación para cada variable, controlando por el efecto del resto de variables.

4.1. Significancia y bondad de ajuste del modelo.

Al evaluar la pertinencia del modelo de regresión múltiple que se diseñó, se puede evaluar tanto su bondad de ajuste así como, también, su significancia estadística.

La bondad de ajuste del modelo se calcula a partir del valor del coeficiente de determinación, o R cuadrado. Debido a que se trata de un modelo de regresión múltiple, se debe observar el valor del coeficiente R cuadrado ajustado, pues este realiza ajustes en su cálculo a medida que se añade una variable nueva en el modelo.

En el caso del modelo diseñado hasta el momento, el valor calculado de R cuadrado ajustado es de una proporción de 0.5677. Si este valor se transforma en valores porcentuales (0.5677 * 100 = 56.77%), se puede establecer que el modelo permite explicar al 56.77% de los casos de \(Y\). O, dicho de otra manera, a partir de las variables incluidas en el modelo de regresión se puede entender el comportamiento de más de la mitad de los casos de la variable dependiente (\(Y\)) incluidos en la muestra.

Por su parte, la significancia estadística del modelo se calcula a partir de una prueba de distribución de varianzas, que se apoya en el cálculo del estadístico de distribución F de Fisher, y mediante el que se puede calcular el p-value asociado a la hipótesis nula del modelo mismo. En este caso, la \(H_a\) plantea que el modelo explica al 56.77% de los casos, mientras que la H0 plantea que el modelo estadístico no explica lo indicado por el R cuadrado ajustado.

El p-value asociado al modelo está por debajo de un nivel de significancia (\(\alpha\)) de 0.05, por lo que se puede rechazar a la H0 como la mejor explicación posible. Y, por descarte, podemos asumir la pertinencia de nuestra \(H_a\) para explicar a la variable dependiente (\(Y\)) en la población que atañe al estudio.

4.2. Coeficientes de regresión y control estadístico.

Una vez que se ha aceptado la utilidad explicativa del modelo en la población de estudio, tras la prueba de significancia del modelo mismo, se puede avanzar a la revisión de cada uno de los coeficientes de regresión asociados a cada variable incluida.

De manera inicial se identifica que todas las variables son estadísticamente significativas. Esto se observa a partir de los valores del p-value asociado a cada una de las variables y a sus coeficientes de regresión. Asimismo se confirma mediante la cantidad de asteriscos ubicados a un costado de cada p-value. Estos nos refieren el nivel de significancia estadística en que se evaluó cada p-value.

Posteriormente se puede identificar el valor de cada coeficiente de regresión:

  1. Para el caso de la variable independiente \(X_1\), Ingreso per Cápita, es de -0.00087216, con un error estándar de 0.00004614 unidades de desviación estándar.
  2. Para el caso de la variable independiente \(X_2\), Tasa de asistencia escolar, es de -0.29936215, con un error estándar de 0.01923568 unidades de desviación estándar.
  3. Para el caso de la variable independiente \(X_3\), Tasa de alfabetización, es de -0.31801928, con un error estándar de 0.01268678 unidades de desviación estándar.

Un elemento que se puede resaltar en este momento es el signo negativo en los 3 coeficientes de regresión. Con esto se confirma la correlación negativa que se observó al inicio del análisis.

A la vez, otro elemento que se observa consiste en el tamaño del error estándar de cada coeficiente de regresión. Todos se encuentran por debajo de una unidad de desviación estándar, lo que es indicativo de errores pequeños. Esto permite inferir que los valores de los coeficientes de regresión son buenos predictores del comportamiento de \(Y\).

A partir de estos valores calculados se puede construir el modelo de regresión, definiendo las magnitudes para cada elemento en la ecuación del modelo mismo.

equatiomatic::extract_eq(m1, use_coefs = TRUE)

\[ \operatorname{\widehat{tasa\_mortalidad\_infantil\_2005}} = 73.98 + 0(\operatorname{usd\_ppc\_2005}) - 0.3(\operatorname{tasa\_asistencia\_escolar\_2005}) - 0.32(\operatorname{tasa\_alfabetizacion\_2005}) \]

4.3. Interpretación de los coeficientes de regresión.

Una vez que se evaluó la significancia estadística de las variables del modelo, es importante realizar la interpretación de cada uno de los coeficientes de regresión asociado a cada variable incluida.

Es importante tener en consideración que uno de los principales aportes analíticos de los modelos de regresión consiste en la capacidad de ejercer control estadístico del efecto de cada una de las variables simultáneamente, ante la inclusión de otras variables intervinientes. De esta manera cada vez que se incluye una nueva variable interviniente (\(X_{n-1}\)), se está descontando o controlando su efecto sobre el efecto que, a su vez, ejerce la variable independiente de interés (\(X_1\)).

A partir de esta consideración sobre la importancia del control de las variables intervinientes, la interpretación de los coeficientes de regresión adoptan una estructura específica, de la siguiente manera:

  1. En el caso de la variable \(X_1\) se puede interpretar de manera que, con un nivel de confianza del 95%, por cada aumento en una unidad del Ingreso per Cápita (medido en dólares al año), la tasa de mortalidad infantil (\(Y\)) decrecerá en 0.00087216 unidades (medido en el número de fallecimientos de niños menores a 1 año de edad por cada 1000 nacimientos), descontando (o controlando) el efecto del resto de las condiciones incluidas en el modelo.
  2. En el caso de la variable \(X_2\) se puede interpretar de manera que, con un nivel de confianza del 95%, por cada aumento en una unidad en la tasa de asistencia escolar (medido como la población que asiste a la escuela entre 6 y 24 años de entre la población de 6 a 24 años de 2005.), la tasa de mortalidad infantil (\(Y\)) decrecerá en 0.29936215 unidades, descontando, controlando o manteniendo constante el resto de las condiciones.
  3. En el caso de la variable \(X_3\) se puede interpretar como: con un nivel de confianza del 95%, por cada aumento de una unidad en la tasa de alfabetización (medido como la población alfabeta de 15 y más años de entre la población de 15 y más años de edad), la tasa de mortalidad infantil (\(Y\)) decrecerá en 0.31801928 unidades, manteniendo constante el resto de las condiciones.

De esta manera se ha construido un modelo de regresión lineal múltiple en donde los efectos de cada variable independiente (\(X_n\)) son aditivos, esto se refiere a que sus efectos se “suman” o añaden entre sí para, así, explicar el comportamiento de la variable dependiente (\(Y\)). Y de la que se deriva la ecuación:

equatiomatic::extract_eq(m1)

\[ \operatorname{tasa\_mortalidad\_infantil\_2005} = \alpha + \beta_{1}(\operatorname{usd\_ppc\_2005}) + \beta_{2}(\operatorname{tasa\_asistencia\_escolar\_2005}) + \beta_{3}(\operatorname{tasa\_alfabetizacion\_2005}) + \epsilon \]

Y sobre la que se ha evaluado la significancia estadística tanto del modelo en general así como de cada uno de los coeficientes de regresión asociados a cada variable explicativa o independiente.

5. Modelo de regresión lineal con interacciones.

Hasta el momento se ha revisado un modelo de regresión lineal múltiple con efectos aditivos, en donde se evalúa el efecto causal de cada una de las variables independientes por separado. Sin embargo esto, en cierta forma, es una explicación limitada de la realidad, pues supone pensar que en la realidad (o población) las variables explicativas se encuentran completamente aisladas entre sí y, de esa manera, influyen sobre la variable explicada.

Con el fin de complejizar los modelos de regresión, y de esa manera intentar acercarlos un poco más al funcionamiento de la realidad social, es posible incluir interacciones entre las variables. Esto plantea que, en ocasiones, algunas variables no operan de manera aislada sino que, en cambio, antes de impactar sobre \(Y\), dichas variables intervinientes interactúan o combinan sus influencias previamente y, una vez ocurrido, después ejercen su efecto casual sobre la variable explicada.

La manera en que se representa dicha interacción en un modelo de regresión lineal múltiple es mediante la creación de una nueva variable interviniente \(X_{n*(n+1)}\), que es producto de la interacción multiplicativa de las variables originales que, el analista considera que combinan sus efectos.

Las interacciones se pueden realizar entre variables con distintas escalas de medición, pero lo más recomendable es utilizar variables solamente continuas entre sí o, también, evaluar interacciones entre variables continuas junto con variables dummy. El incluir una interacción que incluya a una variable categórica multinomial corre el riesgo de que la interpretación sea demasiado compleja.

5.1. Regresión con interacción de variables continuas.

Por ejemplo, al modelo de regresión que se construyó anteriormente, se le puede añadir una nueva variable interviniente (\(X_4\)) en la que se concentre el efecto del factor educación, y que represente a la interacción de las variables \(X_2\) (tasa de asistencia escolar) y \(X_3\) (tasa de alfabetización) para el año 2005, de la siguiente forma en R: tasa_asistencia_escolar_2005 * tasa_alfabetizacion_2005

m2 <- lm(tasa_mortalidad_infantil_2005 ~      #variable dependiente
           usd_ppc_2005 +                     #variable X_1
           tasa_asistencia_escolar_2005 *     #variable X_2, se incluye un signo de multiplicación para interacción
           tasa_alfabetizacion_2005,          #variable X_3, que se evalúa en interacción con X_2
         data = datos_idh)                    #objeto o data frame
equatiomatic::extract_eq(m2)

\[ \operatorname{tasa\_mortalidad\_infantil\_2005} = \alpha + \beta_{1}(\operatorname{usd\_ppc\_2005}) + \beta_{2}(\operatorname{tasa\_asistencia\_escolar\_2005}) + \beta_{3}(\operatorname{tasa\_alfabetizacion\_2005}) + \beta_{4}(\operatorname{tasa\_asistencia\_escolar\_2005} \times \operatorname{tasa\_alfabetizacion\_2005}) + \epsilon \]

Así se ha construido una nueva ecuación del modelo de regresión lineal múltiple con interacción.
Al mandar a llamar a los coeficientes de regresión para evaluarlos individualmente, así como para evaluar la significancia estadística del modelo se observa un valor calculado para el coeficiente de regresión de cada variable, a la vez que se añade una variable nueva (la interacción) con un valor particular.

summary(m2)
## 
## Call:
## lm(formula = tasa_mortalidad_infantil_2005 ~ usd_ppc_2005 + tasa_asistencia_escolar_2005 * 
##     tasa_alfabetizacion_2005, data = datos_idh)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -15.601  -3.557  -0.711   2.709  42.832 
## 
## Coefficients:
##                                                          Estimate  Std. Error
## (Intercept)                                           78.82816171  7.60524403
## usd_ppc_2005                                          -0.00088013  0.00004775
## tasa_asistencia_escolar_2005                          -0.37729203  0.12149823
## tasa_alfabetizacion_2005                              -0.37780297  0.09290175
## tasa_asistencia_escolar_2005:tasa_alfabetizacion_2005  0.00096684  0.00148835
##                                                       t value
## (Intercept)                                            10.365
## usd_ppc_2005                                          -18.433
## tasa_asistencia_escolar_2005                           -3.105
## tasa_alfabetizacion_2005                               -4.067
## tasa_asistencia_escolar_2005:tasa_alfabetizacion_2005   0.650
##                                                                   Pr(>|t|)    
## (Intercept)                                           < 0.0000000000000002 ***
## usd_ppc_2005                                          < 0.0000000000000002 ***
## tasa_asistencia_escolar_2005                                       0.00192 ** 
## tasa_alfabetizacion_2005                                         0.0000492 ***
## tasa_asistencia_escolar_2005:tasa_alfabetizacion_2005              0.51601    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 5.345 on 2449 degrees of freedom
## Multiple R-squared:  0.5683, Adjusted R-squared:  0.5676 
## F-statistic:   806 on 4 and 2449 DF,  p-value: < 0.00000000000000022

A partir de estos valores calculados se pueden identificar algunas características del modelo de regresión con interacciones entre variables continuas:

  1. El modelo en general es estadísticamente significativo, y su valor del coeficiente de determinación ajustado (R cuadrado ajustado) es de 0.5676. En comparación con el modelo anterior (aditivo), no mejoró la capacidad explicativa del útlimo modelo.
  2. Hubo un cambio en el valor específico de cada uno de los coeficientes de regresión, y se mantuvieron los signos negativos de los coeficientes individuales. Asimismo estos coeificientes mantuvieron su significancia estadística.
  3. La interacción entre \(X_2\) y \(X_3\) mostró un coeficiente de regresión con signo positivo (algo que parece contraintuitivo), sin embargo no resultó estadísticamente significativo (pues su p-value) pues su probabilidad se ubicó por encima de un nivel de significancia de 0.05. Por ello, analíticamente, se debe excluir del modelo para explicar a \(Y\).

Para efectos de este ejercicio de explicación de un modelo de regresión lineal múltiple con interacciones, si se asume que la interacción hubiese resultado ser estadísticamente significativa (esto es, que su p-value se ubicara por debajo del nivel de significancia), la manera de interpretar el valor de su coeficiente debería ser:

  • Con un nivel de confianza del 95%, se puede inferir que por cada aumento en una unidad en la interacción entre la tasa de asistencia escolar (\(X_2\)) y la tasa de alfabetización (\(X_3\)) para el año 2005, la tasa de mortalidad infantil (\(Y\)) aumentaría en 0.00096684 unidades, manteniendo (o descontando) constante el efecto del resto de las variables.

Y la manera en que se representa dicho modelo mediante su ecuación y valores de coeficientes es:

equatiomatic::extract_eq(m2, use_coefs = TRUE)

\[ \operatorname{\widehat{tasa\_mortalidad\_infantil\_2005}} = 78.83 + 0(\operatorname{usd\_ppc\_2005}) - 0.38(\operatorname{tasa\_asistencia\_escolar\_2005}) - 0.38(\operatorname{tasa\_alfabetizacion\_2005}) + 0(\operatorname{tasa\_asistencia\_escolar\_2005} \times \operatorname{tasa\_alfabetizacion\_2005}) \]

5.2. Regresión con variables categóricas.

Hasta el momento se ha revisado la construcción de modelos de regresión lineal múltiple en donde se utilizan solo variables independientes de tipo continuas. Pero también es posible la incorporación de variables categóricas del lado de las independientes, ya sea que se evalúe su efecto de manera aislada o en interacción con otras variables.

En este caso se debe tomar en cuenta la manera en que dichas variables categóricas son tratadas por R al momento de incorporarlas a un modelo de regresión lineal. Esto es importante, pues las variables categóricas pueden ser de corte binomial (dos valores de respuesta o atributos) o multinomiales (más de dos valores de respuesta o atributos), pero al momento de ser incluidas en un modelo de regresión lineas, serán tratadas como variables tipo “dummy”. Estas variables se caracterizan por adoptar solo 2 valores o atributos posibles, asignándoles valores de codificación de 0 (para los casos considerados como “fracasos”) y 1 (para los casos considerados como “éxito”). De manera que una variable categórica multinomial, al momento de transformarse en variable dummy, será “partida” en tantas variables dummy según la cantidad de valores o atributos que contengan a la variable original, y al final una de esas categorías será ubicada como una categoría de referencia.

Otra característica del análisis de regresión múltiple que incorpora a una variable categórica consiste en que, al momento de evaluar los efectos causales de dicha variable transformada en dummy, los coeficientes de regresión calculados se interpretan como las diferencias de efecto que ejerce cada una de las categorías dummy respecto de la categoría de referencia. Esto es, en el modelo de regresión se compara el efecto de cada uno de los valores de respuesta o atributos aisladamente con respecto a la categoría de referencia.

Usualmente algunos software de análisis estadístico (como por ej. SPSS), requieren que antes de incorporar a una variable categórica en el análisis, esta debe ser transformada en una variable dummy. Sin embargo, R cuenta con la capacidad para trabajar directamente con las variables categóricas (ya sean binomiales o multinomiales), y puede incorporarlas a un modelo de regresión lineal en el que las transforma en dummy automáticamente.

A continuación se continua con el ejercicio del modelo de regresión lineal múltiple y, además, se incorporará a la variable categórica (\(X_5\)) del “Grado del Índice de Desarrollo Humano” calculado para cada municipio mexicano en el año 2005 (grado_idh_2005), que cuenta con 3 categorías: alto, medio y bajo.

table(datos_idh $grado_idh_2005)
## 
##  alto  bajo medio 
##   606     4  1844

La manera de incorporar a dicha variable categórica multinomial en el modelo de regresión lineal múltiple es mediante llamarla directamente en el modelo, así como su inclusión en la ecuación correspondiente.

m3 <- lm(tasa_mortalidad_infantil_2005 ~     #variable dependiente
           usd_ppc_2005 +                     #variable X_1
           tasa_asistencia_escolar_2005 +     #variable X_2
           tasa_alfabetizacion_2005 +         #variable X_3
           grado_idh_2005,                    #variable X_5, categórica con 3 atributos
         data = datos_idh)                    #data frame
equatiomatic::extract_eq(m3)

\[ \operatorname{tasa\_mortalidad\_infantil\_2005} = \alpha + \beta_{1}(\operatorname{usd\_ppc\_2005}) + \beta_{2}(\operatorname{tasa\_asistencia\_escolar\_2005}) + \beta_{3}(\operatorname{tasa\_alfabetizacion\_2005}) + \beta_{4}(\operatorname{grado\_idh\_2005}_{\operatorname{bajo}}) + \beta_{5}(\operatorname{grado\_idh\_2005}_{\operatorname{medio}}) + \epsilon \]

5.3.1. Interpretación de los coeficientes de regresión para una variable categórica.

Y a partir de mandar a llamar los resultados del modelo de regresión m3 se puede observar lo siguiente:

summary(m3)
## 
## Call:
## lm(formula = tasa_mortalidad_infantil_2005 ~ usd_ppc_2005 + tasa_asistencia_escolar_2005 + 
##     tasa_alfabetizacion_2005 + grado_idh_2005, data = datos_idh)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -14.429  -3.423  -0.692   2.677  43.884 
## 
## Coefficients:
##                                 Estimate  Std. Error t value
## (Intercept)                  64.91199137  1.72416072  37.648
## usd_ppc_2005                 -0.00063954  0.00005596 -11.428
## tasa_asistencia_escolar_2005 -0.25203389  0.01951447 -12.915
## tasa_alfabetizacion_2005     -0.28918329  0.01279313 -22.605
## grado_idh_2005bajo           20.72894993  2.74385392   7.555
## grado_idh_2005medio           2.92880062  0.37247457   7.863
##                                          Pr(>|t|)    
## (Intercept)                  < 0.0000000000000002 ***
## usd_ppc_2005                 < 0.0000000000000002 ***
## tasa_asistencia_escolar_2005 < 0.0000000000000002 ***
## tasa_alfabetizacion_2005     < 0.0000000000000002 ***
## grado_idh_2005bajo            0.00000000000005893 ***
## grado_idh_2005medio           0.00000000000000557 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 5.242 on 2448 degrees of freedom
## Multiple R-squared:  0.5849, Adjusted R-squared:  0.5841 
## F-statistic:   690 on 5 and 2448 DF,  p-value: < 0.00000000000000022
  1. El modelo en general sigue siendo estadísticamente significativo, y su bondad de ajuste aumentó a 0.5841 respecto del modelo inicial m1, por lo que parece que la incorporación de la nueva variable categórica \(X_5\) ayudó a mejor la capacidad explicativa del modelo.
  2. Los coeficientes de manera individual sufrieron ligeros cambios en sus coeficientes de regresión respecto del modelo inicial m1.
  3. Todas las variables fueron estadísticamente significativas, por lo que vale la pena mantenerlas en el modelo así como en las explicaciones sobre el comportamiento de \(Y\).
  4. Los coeficientes de regresión para las distintas variables dummy creadas (grado_idh_2005bajo, grado_idh_2005medio) a partir de la variable \(X_5\) (grado_idh_2005) cuentan con signos o efectos “positivos” sobre el comportamiento de \(Y\).

Centrando solo la atención a los coeficientes de regresión de la variable categórica, su interpretación se puede realizar de la siguiente manera:

  1. Tomando en consideración todos los valores de respuesta o atributos de la variable \(X_5\), primero se debe identificar cuál es la categoría que sirvió de referencia o punto de comparación. En este caso, R tomó como categoría de referencia al atributo de grado de IDH “alto”. Y eso se identifica a partir de que es la variable que no fue incorporada en los resultados del modelo; esto es, no se arrojó un valor calculado para el coeficiente de regresión para dicha categoría. Está ausente.
  2. La interpretación de la primer variable dummy que se presenta en el reporte de resultados, que se refiere al grado bajo de IDH (grado_idh_2005bajo), procede de la siguiente manera: Con un nivel de confianza del 95%, se puede inferir que en aquellos municipios que cuentan con un nivel bajo de IDH tienden a registrar un aumento de 20.72 en la tasa de mortalidad para el año 2005 en comparación con los municipios que cuentan con un nivel alto de IDH para el año 2005, manteniendo el resto de las condiciones constantes (o controlando por el resto de las variables en el modelo).
  3. La interpretación de la segunda variables dummy que se presenta en el reporte de resultados, que se refiere al grado medio de IDH (grado_idh_2005medio), procede de la siguiente manera: Con un nivel de confianza del 95%, se puede inferir que en aquellos municipios que cuentan con un nivel medio de IDH tienden a registrar un aumento de 2.93 en la tasa de mortalidad en comparación con los municipios que cuentan con un nivel alto de IDH para el año 2005, manteniendo el resto de las condiciones constantes (o controlando por el resto de las variables en el modelo).

Comentarios finales.

La utilidad central de un modelo de regresión lineal múltiple consiste en que, además de permitir la incorporación de una mayor cantidad de variables independientes e intervinientes, y así complejizar los modelos de efectos causales, es una estrategia importante para ejercer control estadístico sobre las variables independientes al momento de evaluar su influencia sobre la variables explicada (\(Y\)).
Esto es importante en términos explicativos de la realidad social pues, si bien se sabe que los fenómenos tienden a ser multifactoriales, analíticamente suele ser muy relevante reconocer de manera aislada la influencia de una variable explicativa de interés pero, simultáneamente, también es crucial controlar o descontar la influencia de variables intervinientes que operan en la realidad y que, al final, pueden confundirnos al intentar explicar al fenómeno de interés.

LS0tCnRpdGxlOiAiUmVncmVzacOzbiBsaW5lYWwgbcO6bHRpcGxlIgphdXRob3I6ICJHdXN0YXZvIE1hcnTDrW5lei1WYWxkZXMiCmRhdGU6ICI1LzE2LzIwMjIiCm91dHB1dDoKICBodG1sX2RvY3VtZW50OgogICAgdG9jX2Zsb2F0OiB0cnVlCiAgICBjb2RlX2ZvbGRpbmc6IHNob3cKICAgIHRoZW1lOiBjb3NtbwogICAgdG9jOiB0cnVlCiAgICB0b2NfZGVwdGg6IDUuMAogICAgY29kZV9kb3dubG9hZDogdHJ1ZQotLS0KCmBgYHtyIHNldHVwLCBpbmNsdWRlPUZBTFNFfQprbml0cjo6b3B0c19jaHVuayRzZXQoZWNobyA9IFRSVUUpCmBgYAoKIyMgUHJlc2VudGFjacOzbi4KCkVuIGVzdGUgZG9jdW1lbnRvIHNlIHNlZ3VpcsOhIHRyYWJhamFuZG8gY29uIGxvcyBkYXRvcyB5IGxhcyB2YXJpYWJsZXMgdXRpbGl6YWRhcyByZXNwZWN0byBkZWwgZG9jdW1lbnRvIHNvYnJlIFtyZWdyZXNpw7NuIGxpbmVhbCBzaW1wbGVdKGh0dHBzOi8vcnB1YnMuY29tL2d1c3Rhdm9tdHp2LzgwOTg2NSksIHF1ZSBzZSB2aW8gYW50ZXJpb3JtZW50ZS5cClNpbiBlbWJhcmdvLCBlbiBlc3RlIGRvY3VtZW50byBzZSBoYWNlIHVuYSBleHBsaWNhY2nDs24gZGUgY29ydGUgcHLDoWN0aWNhIHkgb3BlcmF0aXZhIHNvYnJlIGxhIGltcGxlbWVudGFjacOzbiBkZSB1biBtb2RlbG8gZGUgcmVncmVzacOzbiBtw7psdGlwbGUsIHkgc2UgZGVqYXLDoSBkZSBsYWRvIGxhIHJlZmVyZW5jaWEgYSBsb3Mgc3VwdWVzdG9zIHRlw7NyaWNvIGVzdGFkw61zdGljb3MgcXVlIHN1c3RlbnRhbiBhIGxvcyByZXN1bHRhZG9zLgoKTG9zIGVsZW1lbnRvcyBhIGFib3JkYXIgZW4gZXN0ZSBkb2N1bWVudG8gc29uOgoKKiBFeGFtaW5hciBsb3MgZGF0b3MgYW50ZXMgZGUgYWp1c3RhciBlbCBtb2RlbG8uCiogRW5jYWphbmRvIGVsIG1vZGVsby4KKiBDb21wcm9iYW5kbyBsb3Mgc3VwdWVzdG9zIGRlbCBtb2RlbG8uCiogSW50ZXJwcmV0YXIgbGEgc2FsaWRhIGRlbCBtb2RlbG8uCiogRXZhbHVhY2nDs24gZGUgbGEgYm9uZGFkIGRlIGFqdXN0ZSBkZWwgbW9kZWxvLgoqIFVzYXIgZWwgbW9kZWxvIHBhcmEgaGFjZXIgcHJlZGljY2lvbmVzLgoKIyMgMC4gQW1iaWVudGUgZGUgdHJhYmFqby4KCkEgY29udGludWFjacOzbiBzZSByZWNvbWllbmRhIHJlYWxpemFyIGFsZ3Vub3MgZGUgbG9zIGFqdXN0ZXMgcGFyYSBjb25maWd1cmFyIGEgUiBwcmV2aW8gYWwgcHJvY2VzbyBkZWwgdHJhdGFtaWVudG8gZGUgbG9zIGRhdG9zLgoKQWwgY29tZW56YXIgc2llbXByZSBlcyBpbXBvcnRhbnRlIGVzdGFibGVjZXIgZWwgaWRpb21hIGFkZWN1YWRvIHBhcmEgcXVlIGVsIHByb2dyYW1hIHJlY29ub3pjYSBjYXJhY3RyZXJlcyBlc3BlY2lhbGVzLiBFbiBlbCBjYXNvIGRlIGRlZmluaXIgYWwgaWRpb21hIGVzcGHDsW9sLCBsYSBpbnN0cnVjY2nDs24gYSB1dGlsaXphciBlczoKCmBgYHtyIGlkaW9tYX0KU3lzLnNldGxvY2FsZSgiTENfQUxMIiwgImVuX1VTLlVURi04IikKU3lzLnNldGVudihMQU5HID0gInNwYSIpCmBgYAoKVGFtYmnDqW4gZXMgaW1wb3J0YW50ZSBpbnN0YWxhciBsYXMgbGlicmVyw61hcyBxdWUgc2UgdXRpbGl6YXLDoW4gcG9zdGVyaW9ybWVudGU6CgpgYGB7ciBsaWJyZXJpYX0KbGlicmFyeSh0aWR5dmVyc2UpCmxpYnJhcnkoUGVyZm9ybWFuY2VBbmFseXRpY3MpCmxpYnJhcnkoZXF1YXRpb21hdGljKQpgYGAKCkZpbmFsbWVudGUgc2UgZGViZSBjYXJnYXIgbGEgYmFzZSBkZSBkYXRvcyBvIGRhdGEgZnJhbWUgZW4gZWwgYW1iaWVudGUgZGVsIHByb2dyYW1hLCBjb24gZWwgcXVlIHNlIGFuYWxpemFyw6EgbGEgaW5mb3JtYWNpw7NuLiBQYXJhIGVsbG8gaGFicsOhIHF1ZSAiY2FyZ2FyIiBsYSBpbmZvcm1hY2nDs24gc29icmUgZWwgw41uZGljZSBkZSBEZXNhcnJvbGxvIEh1bWFubyBnZW5lcmFkbyBwb3IgZWwgUE5VRC1PTlUgcGFyYSBjYWRhIHVubyBkZSBsb3MgbXVuaWNpcGlvcyBlbiBNw6l4aWNvIGVuIGVsIGHDsW8gMjAwMCB5IDIwMDUuCgpgYGB7ciBjYXJnYV9kYXRvc30KZGF0b3NfaWRoIDwtIHJlYWQuY3N2KCJ+L0Ryb3Bib3gvUi9pZGhfbXBpb18yMDAwXzIwMDUuY3N2IiwgaGVhZGVyID0gVFJVRSkgI3J1dGEgZGUgYWNjZXNvIGEgbG9zIGRhdG9zLCAnaGVhZGVyID0gVFJVRScgZW4gY2FzbyBkZSBxdWUgZWwgYXJjaGl2byBjdWVudGUgY29uIG5vbWJyZXMgZGUgbGFzIHZhcmlhYmxlcy4KYGBgCgpZIGFob3JhIHNlIGRlYmUgZXhwbG9yYXIgbGEgZXN0cnVjdHVyYSBkZSBsYSBtYXRyaXogZGUgZGF0b3MgcGFyYSBpZGVudGlmaWNhciBsYXMgZGltZW5zaW9uZXMgZGUgbGEgYmFzZSBhc8OtIGNvbW8gZWwgdGlwbyBkZSB2YXJpYWJsZXMgcmVnaXN0cmFkYXMgZW4gZWwgZGF0YSBmcmFtZS4KCmBgYHtyIGVzdHJ1Y3R1cmFfZGF0YV9mcmFtZX0Kc3RyKGRhdG9zX2lkaCkKYGBgCgoKIyMgMS4gRXhwbG9yYWNpw7NuIGRlc2NyaXB0aXZhIGRlIGxvcyBkYXRvcy4KCkVuIGVzdGUgZG9jdW1lbnRvIHNlZ3VpcmVtb3MgdHJhYmFqYW5kbyBjb24gbG9zIGRhdG9zIHNvYnJlIGVsIMONbmRpY2UgZGUgRGVzYXJyb2xsbyBIdW1hbm8gZWxhYm9yYWRvIHBvciBlbCBQTlVEIHBhcmEgbG9zIGHDsW9zIGRlbCAyMDAwIHkgMjAwNS4gWSBzZSBidXNjYXLDoSBleHBsaWNhciBhIGxhIHZhcmlhYmxlIGRlIGxhIFRhc2EgZGUgTW9ydGFkaWxpZGFkIEluZmFudGlsICgkWSQpIGRlbCBhw7FvIDIwMDUsIGEgcGFydGlyIGRlIG90cmEgc2VyaWUgdmFyaWFibGVzIGluZGVwZW5kaWVudGVzOiBJbmdyZXNvIHBlciBDw6FwaXRhICgkWF8xJCksIFRhc2EgZGUgQWxmYWJldGl6YWNpw7NuICgkWF8yJCkgeSBUYXNhIGRlIEFzaXN0ZW5jaWEgRXNjb2xhciAoJFhfMyQpLCB0b2RhcyBwYXJhIGVsIGHDsW8gMjAwNS4gQ29uIGVzdG8gcG9kZW1vcyBjcmVhciB1biBvYmpldG8gcXVlIGludGVncmUgc29sbyBhIGxhcyB2YXJpYWJsZXMgZGUgaW50ZXLDqXMuXAoKYGBge3J9CmlkaF9yZWcgPC0gZGF0b3NfaWRoICU+JQogIHNlbGVjdCh0YXNhX21vcnRhbGlkYWRfaW5mYW50aWxfMjAwNSwKICAgICAgICAgdGFzYV9hbGZhYmV0aXphY2lvbl8yMDA1LAogICAgICAgICB0YXNhX2FzaXN0ZW5jaWFfZXNjb2xhcl8yMDA1LAogICAgICAgICB1c2RfcHBjXzIwMDUpCmBgYAoKCkEgcGFydGlyIGRlIGVzdGFzIHZhcmlhYmxlcywgZW4gZWwgZm9uZG8gc2Ugc2lndWUgZXZhbHVhbmRvIGVsIGVmZWN0byBxdWUgdGllbmUgZWwgSW5ncmVzbyBwZXIgQ8OhcGl0YSAoJFhfMSQpIHNvYnJlIGxhIFRhc2EgZGUgTW9ydGFsaWRhZCBJbmZhbnRpbCAoJFkkKSwgcXVlIHNlIGFzdW1lIHF1ZSBlcyBsYSB2YXJpYWJsZSBjYXVzYWwgbcOhcyBpbXBvcnRhbnRlIGEgZW50ZW5kZXIuIFNpbiBlbWJhcmdvIGFob3JhIHN1cmdlIGxhIGltcG9ydGFuY2lhIGRlIGltcGxlbWVudGFyIHVuICoqY29udHJvbCoqIHNvYnJlIGVsIGVmZWN0byBkZSAkWF8xJCBzb2JyZSAkWSQgcGFyYSwgYXPDrSwgaWRlbnRpZmljYXIgc2kgbGEgaW1wb3J0YW5jaWEgZGUgJFhfMSQgZGVwZW5kZSwgdGFtYmnDqW4sIGRlIG90cmFzIHZhcmlhYmxlcyBvIGZhY3RvcmVzIGRlbCBjb250ZXh0byBlbiBxdWUgZnVuY2lvbmEgZW4gbGEgcmVhbGlkYWQuCgpFbiB1biBwcmltZXIgbW9tZW50byBkZWJlbW9zIGV4YW1pbmFyIGxvcyBkYXRvcyBkZSBtYW5lcmEgZGVzY3JpcHRpdmEgcGFyYSwgYXPDrSwgZXZhbHVhciBzaSBsYSByZWdyZXNpw7NuIGxpbmVhbCBtw7psdGlwbGUgc2Vyw6EgdW4gYnVlbiBtb2RlbG8gcGFyYSBhanVzdGFyc2UgYSBsYSBpbmZvcm1hY2nDs24gZXhpc3RlbnRlLiBFbiBwYXJ0aWN1bGFyLCBkZWJlbW9zIHZlcmlmaWNhciBzaSBsYXMgdmFyaWFibGVzIGV4cGxpY2F0aXZhcyBvIGluZGVwZW5kaWVudGVzIHRpZW5lbiB1bmEgYXNvY2lhY2nDs24gbGluZWFsIGNvbiBsYSB2YXJpYWJsZSBkZXBlbmRpZW50ZSwgbG8gcXVlIGluZGljYXLDrWEgcXVlIHVuIG1vZGVsbyBkZSByZWdyZXNpw7NuIGxpbmVhbCBtw7psdGlwbGUgcHVlZGUgc2VyIGFkZWN1YWRvLgoKUGFyYSBoYWNlcmxvLCBwb2RlbW9zIHVzYXIgbGEgZnVuY2nDs24gYHBhaXJzKClgIHBhcmEgY3JlYXIgdW4gZGlhZ3JhbWEgZGUgZGlzcGVyc2nDs24gZGUgY2FkYSBwb3NpYmxlIHBhciBkZSB2YXJpYWJsZXM6CgpgYGB7cn0KY2hhcnQuQ29ycmVsYXRpb24oaWRoX3JlZywgI2FxdcOtIHNlIGNhcmdhIGVsIG9iamV0byB0aXBvIG1hdHJpegogICAgICAgICAgICAgICAgICBoaXN0b2dyYW0gPSBUUlVFLCAjc2UgYWNlcHRhIGxhIGVsYWJvcmFjacOzbiBkZSBoaXN0b2dyYW1hCiAgICAgICAgICAgICAgICAgIG1ldGhvZCA9ICJwZWFyc29uIikgI3NlIGRlZmluZSBlbCBtw6l0b2RvIGVzdGFkw61zdGljbyBwYXJhIGNhbGN1bGFyIGxhIGNvcnJlbGFjacOzbgpgYGAKCkRlIGVzdGUgZGlhZ3JhbWEgZGUgcGFyZXMgcG9kZW1vcyB2ZXIgbG8gc2lndWllbnRlOgoKKiBMYSB0YXNhIGRlIG1vcnRhbGlkYWQgaW5mYW50aWwgdGllbmUgdW5hIGFzb2NpYWNpw7NuIG5lZ2F0aXZhIHkgbW9kZXJhZGEgY29uIGxhIFRhc2EgZGUgQWxmYWJldGl6YWNpw7NuLgoqIExhIHRhc2EgZGUgbW9ydGFsaWRhZCBpbmZhbnRpbCB0aWVuZSB1bmEgYXNvY2lhY2nDs24gbmVnYXRpdmEgeSBiYWphIGNvbiBsYSBUYXNhIGRlIEFzaXN0ZW5jaWEgRXNjb2xhci4KKiBMYSB0YXNhIGRlIG1vcnRhbGlkYWQgaW5mYW50aWwgdGllbmUgdW5hIGFzb2NpYWNpw7NuIG5lZ2F0aXZhIHkgbW9kZXJhZGEgY29uIGVsIEluZ3Jlc28gcGVyIEPDoXBpdGEsIHBlcm8gdGllbmUgdW5hIGZvcm1hIGN1cnZhLgoKRW4gZ3JhbiBtZWRpZGEgc2UgcHVlZGUgYXN1bWlyIHF1ZSBsYXMgdmFyaWFibGVzIHRpZW5lbiB1bmEgYXNvY2lhY2nDs24gbGluZWFsIGNvbiBsYSB2YXJpYWJsZSBkZXBlbmRpZW50ZSwgcG9yIGxvIHF1ZSB2YWxkcsOtYSBsYSBwZW5hIGNvbnRpbnVhciBjb24gbGEgY29uc3RydWNjacOzbiBkZWwgbW9kZWxvIGRlIHJlZ3Jlc2nDs24gbGluZWFsIG3Dumx0aXBsZS4KCiMjIDIuIEFqdXN0ZSBkZWwgbW9kZWxvLgpMYSByZWFsaXphY2nDs24gZGUgdW4gbW9kZWxvIGRlIHJlZ3Jlc2nDs24gbGluZWFsIG3Dumx0aXBsZSBzdXBvbmUgcXVlIGV4aXN0aXLDoW4gbcOhcyBkZSB1bmEgdmFyaWFibGUgZW4gbGEgZWN1YWNpw7NuIGRlbCBsYWRvIGRlIHBvc2ljacOzbiBlbiBxdWUgc2UgdWJpY2FuIGEgbGFzIGluZGVwZW5kaWVudGVzIG8gZXhwbGljYXRpdmFzLiBJbmljaWFsbWVudGUgc2UgcHVlZGUgYXN1bWlyIHF1ZSBlbCBlZmVjdG8gZGUgZXN0YXMgdmFyaWFibGVzIGVzICphZGl0aXZvKiBlbnRyZSBzw60sIG8gcXVlIHN1cyBlZmVjdG9zIHNlIHN1bWFuLCBhbCBtb21lbnRvIGRlIGV4cGxpY2FyIGRlIG1hbmVyYSBjb25qdW50YSBhbCBjb21wb3J0YW1pZW50byBkZSBsYSB2YXJpYWJsZSBkZXBlbmRpZW50ZS5cCgpFc3RlIHRpcG8gZGUgbW9kZWxvcyBzZSBjb250cnV5ZW4gY29uIGVsIGNvbWFuZG8gYGxtKClgIGRlIGxhIHNpZ3VpZW50ZSBmb3JtYToKYGBgCmxtICh2YXJpYWJsZV9yZXNwdWVzdGEgfiB2YXJpYWJsZV9wcmVkaWN0b3IxICsgdmFyaWFibGVfcHJlZGljdG9yMiArIC4uLiwgZGF0b3MgPSBkYXRvcykKYGBgCgpFbCBtb2RlbG8gZGUgcmVncmVzacOzbiBsaW5lYWwgbcO6bHRpcGxlIHBhcmEgbnVlc3Ryb3MgZGF0b3MgZXMgZWwgc2lndWllbnRlOgpgYGB7cn0KbTEgPC0gbG0odGFzYV9tb3J0YWxpZGFkX2luZmFudGlsXzIwMDUgfiAgI1ZhcmlhYmxlIERlcGVuZGllbnRlCiAgICAgICAgIHVzZF9wcGNfMjAwNSArICAgICAgICAgICAgICAgICAgICNWYXJpYWJsZSBJbmRlcGVuZGllbnRlCiAgICAgICAgIHRhc2FfYXNpc3RlbmNpYV9lc2NvbGFyXzIwMDUgKyAgICNWYXJpYWJsZSBkZSBjb250cm9sIDEKICAgICAgICAgdGFzYV9hbGZhYmV0aXphY2lvbl8yMDA1LCAgICAgICAgI1ZhcmlhYmxlIGRlIGNvbnRyb2wgMgogICAgICAgICBkYXRhID0gZGF0b3NfaWRoKQpgYGAKCkNvbiBlc3RvIHNlIGNyZWEgdW4gb2JqZXRvIGRlbCB0aXBvICJsaXN0YSIgcXVlIGNvbnRpZW5lIDEzIGVsZW1lbnRvcywgeSBxdWUgc2Vyw6FuIHV0aWxpemFkb3MgZW4gZGl2ZXJzb3MgbW9tZW50b3MgZGVsIGFuw6FsaXNpcyBkZSBsYSByZWdyZXNpw7NuIGxpbmVhbCwgYSBzZW1lamFuemEgZGUgbGEgbWFuZXJhIGVuIHF1ZSBzZSByZXZpc2EgcGFyYSBlbCBtb2RlbG8gc2ltcGxlLgoKCiMjIDMuIENvbXByb2JhY2nDs24gZGUgc3VwdWVzdG9zIGRlbCBtb2RlbG8uCgpBbnRlcyBkZSBwcm9jZWRlciBhIHZlcmlmaWNhciBsb3MgcmVzdWx0YWRvcyBkZWwgbW9kZWxvIChzaWduaWZpY2FuY2lhIGVzdGFkw61zdGljYSBkZWwgbW9kZWxvIHkgdmFsb3JlcyBkZSBsb3MgY29lZmljaWVudGVzIGRlIHJlZ3Jlc2nDs24pLCBwcmltZXJvIGRlYmVtb3MgdmVyaWZpY2FyIHF1ZSBzZSBjdW1wbGFuIGxvcyBzdXB1ZXN0b3MgZGVsIG1vZGVsby4gRXMgZGVjaXIsIG5lY2VzaXRhbW9zIHZlcmlmaWNhciBsbyBzaWd1aWVudGU6CgoxLiBMYSBkaXN0cmlidWNpw7NuIGRlIGxvcyByZXNpZHVvcyBkZWwgbW9kZWxvIGRlYmUgc2VyIGFwcm94aW1hZGFtZW50ZSBub3JtYWwuXApQb2RlbW9zIGNvbXByb2JhciBzaSBzZSBjdW1wbGUgZXN0YSBzdXBvc2ljacOzbiBjcmVhbmRvIHVuIGhpc3RvZ3JhbWEgc2ltcGxlIGRlIHJlc2lkdW9zOgpgYGB7cn0KaGlzdCAocmVzaWQobTEpKQpgYGAKCkVuIGVsIGNhc28gZGUgbGEgZ3LDoWZpY2EgZGUgaGlzdG9ncmFtYSBzb2JyZSBsYSBkaXN0cmlidWNpw7NuIGRlIGxvcyB2YWxvcmVzIGRlIGxvcyByZXNpZHVvcyAoJGVfaSA9IFxoYXR7WX0gLSBZX2kkKSBzZSBvYnNlcnZhIHF1ZSBjdWVudGEgY29uIHVuYSBjdXJ2YSBwYXJlY2lkYSBhIHVuYSBkaXN0cmlidWNpw7NuIG5vcm1hbCwgbGEgcXVlIHRhbWJpw6luIHViaWNhIGFsIGNlbnRybyBkZSBzdSBkaXN0aXJidWNpw7NuIHNvYnJlIGVsIHZhbG9yIGRlIDAgKGNlcm8pLiBFc3RvIGhhY2UgcGVuc2FyIHF1ZSBzw60gY3VlbnRhIGNvbiB1bmEgZGlzdHJpYnVjacOzbiBkZWwgdGlwbyBub3JtYWwuIFNpbiBlbWJhcmdvIHNlIGRlYmUgdG9tYXIgZW4gY29uc2lkZXJhY2nDs24gcXVlIHRpZW5lIHVuIHNlc2dvIG11eSBncmFuZGUgaGFjaWEgbGEgZGVyZWNoYS4gUG9yIGVsbG8gZXMgbmVjZXNhcmlvIGV2YWx1YXIgbGEgZm9ybWEgZGUgc3UgZGlzdHJpYnVjacOzbiBtZWRpYW50ZSB1bmEgcHJ1ZWJhIGVzdGFkw61zdGljYS4KCk90cmEgZm9ybWEgZGUgdmVyaWZpY2FyIHN1IGRpc3RyaWJ1Y2nDs24gbm9ybWFsIGRlIGZvcm1hIG3DoXMgcHJlY2lzYSBlcyBtZWRpYW50ZSB1bmEgcHJ1ZWJhIGVzdGFkw61zdGljYSBzb2JyZSBsYSBub3JtYWxpZGFkIGRlIHN1IGRpc3RyaWJ1Y2nDs24uIFBhcmEgZWxsbyBzZSB1dGlsaXphIGxhIHBydWViYSBkZSBTaGFwaXJvIFdpbGtpbnNvbiwgcXVlIHNlIG1hbmRhIGEgbGxhbWFyIGNvbiBlbCBjb21hbmRvIGBzaGFwaXJvLnRlc3QoKWAuCgpgYGB7cn0Kc2hhcGlyby50ZXN0KG0xICQgcmVzaWR1YWxzKQpgYGAKCkxhIEgwIHF1ZSBzZSBlc3TDoSBldmFsdWFuZG8gY29uc2lzdGUgZW4gcXVlICJsYSBkaXN0cmlidWNpw7NuIGRlIGxvcyByZXNpZHVvcyBlcyBpZ3VhbCBhIHVuYSBkaXN0cmlidWNpw7NuIG5vcm1hbC4iIEVuIGVzdGUgY2FzbyBzZSBkZWJlICpyZWNoYXphciogSDAuIFkgY29uIGVzdGUgcmVzdWx0YWRvIHNlIGVzdMOhIGluZmlyaWVuZG8gcXVlIGxvcyB2YWxvcmVzIGRlIGxvcyByZXNpZHVvcyBubyBzZSBkaXN0cmlidXllbiBub3JtYWxtZW50ZTsgZXN0byBlcyB1biBwcm9ibGVtYSBpbmljaWFsIHBhcmEgZXN0ZSBtb2RlbG8geSBwYXJhIGxhIGludGVycHJldGFjacOzbiBkZSBzdXMgcmVzdWx0YWRvcy4gU2luIGVtYmFyZ28sIHBvciBjdWVzdGnDs24gZGUgcHJhY3RpY2lkYWQsIHNlIGNvbnRpbnVhcsOhIGVuIGVsIGRlc2Fycm9sbG8gZGUgZXN0ZSBlamVyY2ljaW8uCgoKMi4gTGEgdmFyaWFuemEgZGUgbG9zIHJlc2lkdWFsZXMgZGViZSBzZXIgY29uc2lzdGVudGUgcGFyYSB0b2RhcyBsYXMgb2JzZXJ2YWNpb25lcy5cIApFc3RhIGNvbmRpY2nDs24gc2UgY29ub2NlIGNvbW8gaG9tb2NlZGFzdGljaWRhZC4gTGEgdmlvbGFjacOzbiBkZSBlc3RlIHN1cHVlc3RvIHNlIGNvbm9jZSBjb21vIGhldGVyb2NlZGFzdGljaWRhZCAuIFBhcmEgY29tcHJvYmFyIGdyw6FmaWNhbWVudGUgc2kgc2UgY3VtcGxlIGVzdGEgc3Vwb3NpY2nDs24sIHBvZGVtb3MgY3JlYXIgdW4gdmFsb3IgYWp1c3RhZG8gKCpmaXR0ZWQgdmFsdWVzKikgZnJlbnRlIGEgdW5hIGdyw6FmaWNhIHJlc2lkdWFsOgoKYGBge3J9CnBsb3QoZml0dGVkLnZhbHVlcyhtMSksICNleHRyYWVyIGxvcyB2YWxvcmVzIGFqdXN0YWRvcyBwYXJhIFkKICAgICAgcmVzaWQobTEpKSAjZXh0cmFlciBlbCB2YWxvciBkZSBsb3MgcmVzaWR1b3MgcGFyYSBjYWRhIGNhc28gWAphYmxpbmUoaCA9IDAsIGx0eSA9IDIpICNhZGQgbMOtbmVhIGhvcml6b250YWwgZW4gMApgYGAKCklkZWFsbWVudGUsIGxvIHF1ZSBzZSBidXNjYSBlbmNvbnRyYXIgZXMgcXVlIGxvcyB2YWxvcmVzIHJlc2lkdWFsZXMgZXN0dXZpZXJhbiBpZ3VhbG1lbnRlIGRpc3BlcnNvcyBlbiBjYWRhIHZhbG9yIGFqdXN0YWRvIChmaXR0ZWQgdmFsdWUpLiBTaW4gZW1iYXJnbyBlc3RvIG5vIGVzIGxvIHF1ZSBzZSBvYnNlcnZhIGVuIGxhIGdyw6FmaWNhLCBzaW5vIHF1ZSBvY3VycmUgcXVlIGV4aXN0ZSB1bmEgdGVuZGVuY2lhIGNyZWNpZW50ZSBhbCBhdW1lbnRvIGRlIGxvcyB2YWxvcmVzIGRlIGxvcyByZXNpZHVvcyBlbiBsYSBwYXJ0ZSBzdXBlcmlvciBkZSBsYSBncsOhZmljYSwgZW50cmUgZWwgcmFuZ28gZGUgMCBhIDMwIGZpdHRlZCB2YWx1ZXMuIEVzdG8gZXMsIGNvbmZvcm1lIGF1bWVudGFuIGxvcyB2YWxvcmVzIGFqdXN0YWRvcyAoZml0dGVkIHZhbHVlcyksIHRhbWnDqW4gc2UgdGllbmRlIGEgaW5jcmVtZW50YXIgZWwgdmFsb3IgZGUgbG9zIHJlc2lkdW9zLCBsbyBxdWUgZGEgcGllIGEgbGEgaGV0ZXJvc2NlZGFzdGljaWRhZCBkZSBsYSB2YXJpYW56YS4gRXN0byBlcyBpbmRpY2F0aXZvIGRlIGxhIGZhbHRhIGRlIG5vcm1hbGlkYWQgZW4gbGEgZGlzdHJpYnVjacOzbiBkZSBsb3MgcmVzaWR1b3MsIGNvbmZpcm1hbmRvIGxvIHZpc3RvIGVuIGxhIHBydWViYSBkZSBub3JtYWxpZGFkIGVuIGxhIGRpc3RyaWJ1Y2nDs24uCgojIyA0LiBJbnRlcnByZXRhY2nDs24gZGUgbG9zIHZhbG9yZXMgZGVsIG1vZGVsbyBkZSByZWdyZXNpw7NuIGFkaXRpdmEuCgpVbmEgdmV6IHF1ZSBoYXlhbW9zIHZlcmlmaWNhZG8gcXVlIGxvcyBzdXB1ZXN0b3MgZGVsIG1vZGVsbyBzZSBjdW1wbGVuIHN1ZmljaWVudGVtZW50ZSwgc2UgcHVlZGVuIHZlciBsb3MgdmFsb3JlcyBjYWxjdWxhZG9zIHBhcmEgZWwgbW9kZWxvIHVzYW5kbyBsYSBmdW5jacOzbiBgc3VtbWFyeSgpYDoKCmBgYHtyfQpvcHRpb25zKHNjaXBlbiA9IDk5OSkKc3VtbWFyeShtMSkKYGBgCgpBIHBhcnRpciBkZSBsb3MgcmVzdWx0YWRvcyBkZSBzYWxpZGEgc2UgcHVlZGVuIGV2YWx1YXIgMiBkaW1lbnNpb25lcyBkZWwgbW9kZWxvOgoKMS4gTGEgc2lnbmlmaWNhbmNpYSBlc3RhZMOtc3RpY2EgeSBsYSAqYm9uZGFkIGRlIGFqdXN0ZSogZGVsIG1vZGVsbyBlbiBnZW5lcmFsLgoyLiBFbCB2YWxvciBkZWwgKmNvZWZpY2llbnRlIGRlIGNvcnJlbGFjacOzbiogcGFyYSBjYWRhIHZhcmlhYmxlLCBjb250cm9sYW5kbyBwb3IgZWwgZWZlY3RvIGRlbCByZXN0byBkZSB2YXJpYWJsZXMuCgojIyMgNC4xLiBTaWduaWZpY2FuY2lhIHkgYm9uZGFkIGRlIGFqdXN0ZSBkZWwgbW9kZWxvLgoKQWwgZXZhbHVhciBsYSBwZXJ0aW5lbmNpYSBkZWwgbW9kZWxvIGRlIHJlZ3Jlc2nDs24gbcO6bHRpcGxlIHF1ZSBzZSBkaXNlw7HDsywgc2UgcHVlZGUgZXZhbHVhciB0YW50byBzdSBib25kYWQgZGUgYWp1c3RlIGFzw60gY29tbywgdGFtYmnDqW4sIHN1IHNpZ25pZmljYW5jaWEgZXN0YWTDrXN0aWNhLgoKTGEgYm9uZGFkIGRlIGFqdXN0ZSBkZWwgbW9kZWxvIHNlIGNhbGN1bGEgYSBwYXJ0aXIgZGVsIHZhbG9yIGRlbCBjb2VmaWNpZW50ZSBkZSBkZXRlcm1pbmFjacOzbiwgbyAqUiBjdWFkcmFkbyouIERlYmlkbyBhIHF1ZSBzZSB0cmF0YSBkZSB1biBtb2RlbG8gZGUgcmVncmVzacOzbiBtw7psdGlwbGUsIHNlIGRlYmUgb2JzZXJ2YXIgZWwgdmFsb3IgZGVsIGNvZWZpY2llbnRlICoqKlIgY3VhZHJhZG8gYWp1c3RhZG8qKiosIHB1ZXMgZXN0ZSByZWFsaXphIGFqdXN0ZXMgZW4gc3UgY8OhbGN1bG8gYSBtZWRpZGEgcXVlIHNlIGHDsWFkZSB1bmEgdmFyaWFibGUgbnVldmEgZW4gZWwgbW9kZWxvLgoKRW4gZWwgY2FzbyBkZWwgbW9kZWxvIGRpc2XDsWFkbyBoYXN0YSBlbCBtb21lbnRvLCBlbCB2YWxvciBjYWxjdWxhZG8gZGUgKlIgY3VhZHJhZG8gYWp1c3RhZG8qIGVzIGRlIHVuYSBwcm9wb3JjacOzbiBkZSAwLjU2NzcuIFNpIGVzdGUgdmFsb3Igc2UgdHJhbnNmb3JtYSBlbiB2YWxvcmVzIHBvcmNlbnR1YWxlcyAoMC41Njc3ICogMTAwID0gNTYuNzclKSwgc2UgcHVlZGUgZXN0YWJsZWNlciBxdWUgZWwgbW9kZWxvIHBlcm1pdGUgZXhwbGljYXIgYWwgNTYuNzclIGRlIGxvcyBjYXNvcyBkZSAkWSQuIE8sIGRpY2hvIGRlIG90cmEgbWFuZXJhLCBhIHBhcnRpciBkZSBsYXMgdmFyaWFibGVzIGluY2x1aWRhcyBlbiBlbCBtb2RlbG8gZGUgcmVncmVzacOzbiBzZSBwdWVkZSBlbnRlbmRlciBlbCBjb21wb3J0YW1pZW50byBkZSBtw6FzIGRlIGxhIG1pdGFkIGRlIGxvcyBjYXNvcyBkZSBsYSB2YXJpYWJsZSBkZXBlbmRpZW50ZSAoJFkkKSBpbmNsdWlkb3MgZW4gbGEgbXVlc3RyYS4KClBvciBzdSBwYXJ0ZSwgbGEgc2lnbmlmaWNhbmNpYSBlc3RhZMOtc3RpY2EgZGVsIG1vZGVsbyBzZSBjYWxjdWxhIGEgcGFydGlyIGRlIHVuYSBwcnVlYmEgZGUgZGlzdHJpYnVjacOzbiBkZSB2YXJpYW56YXMsIHF1ZSBzZSBhcG95YSBlbiBlbCBjw6FsY3VsbyBkZWwgZXN0YWTDrXN0aWNvIGRlIGRpc3RyaWJ1Y2nDs24gKkYqIGRlIEZpc2hlciwgeSBtZWRpYW50ZSBlbCBxdWUgc2UgcHVlZGUgY2FsY3VsYXIgZWwgKnAtdmFsdWUqIGFzb2NpYWRvIGEgbGEgaGlww7N0ZXNpcyBudWxhIGRlbCBtb2RlbG8gbWlzbW8uIEVuIGVzdGUgY2FzbywgbGEgJEhfYSQgcGxhbnRlYSBxdWUgZWwgbW9kZWxvIGV4cGxpY2EgYWwgNTYuNzclIGRlIGxvcyBjYXNvcywgbWllbnRyYXMgcXVlIGxhIEgwIHBsYW50ZWEgcXVlIGVsIG1vZGVsbyBlc3RhZMOtc3RpY28gbm8gZXhwbGljYSBsbyBpbmRpY2FkbyBwb3IgZWwgKlIgY3VhZHJhZG8gYWp1c3RhZG8qLgoKRWwgKnAtdmFsdWUqIGFzb2NpYWRvIGFsIG1vZGVsbyBlc3TDoSBwb3IgZGViYWpvIGRlIHVuIG5pdmVsIGRlIHNpZ25pZmljYW5jaWEgKCRcYWxwaGEkKSBkZSAwLjA1LCBwb3IgbG8gcXVlIHNlIHB1ZWRlIHJlY2hhemFyIGEgbGEgSDAgY29tbyBsYSBtZWpvciBleHBsaWNhY2nDs24gcG9zaWJsZS4gWSwgcG9yIGRlc2NhcnRlLCBwb2RlbW9zIGFzdW1pciBsYSBwZXJ0aW5lbmNpYSBkZSBudWVzdHJhICRIX2EkIHBhcmEgZXhwbGljYXIgYSBsYSB2YXJpYWJsZSBkZXBlbmRpZW50ZSAoJFkkKSBlbiBsYSBwb2JsYWNpw7NuIHF1ZSBhdGHDsWUgYWwgZXN0dWRpby4KCiMjIyA0LjIuIENvZWZpY2llbnRlcyBkZSByZWdyZXNpw7NuIHkgY29udHJvbCBlc3RhZMOtc3RpY28uCgpVbmEgdmV6IHF1ZSBzZSBoYSBhY2VwdGFkbyBsYSB1dGlsaWRhZCBleHBsaWNhdGl2YSBkZWwgbW9kZWxvIGVuIGxhIHBvYmxhY2nDs24gZGUgZXN0dWRpbywgdHJhcyBsYSBwcnVlYmEgZGUgc2lnbmlmaWNhbmNpYSBkZWwgbW9kZWxvIG1pc21vLCBzZSBwdWVkZSBhdmFuemFyIGEgbGEgcmV2aXNpw7NuIGRlIGNhZGEgdW5vIGRlIGxvcyAqY29lZmljaWVudGVzIGRlIHJlZ3Jlc2nDs24qIGFzb2NpYWRvcyBhIGNhZGEgdmFyaWFibGUgaW5jbHVpZGEuCgpEZSBtYW5lcmEgaW5pY2lhbCBzZSBpZGVudGlmaWNhIHF1ZSB0b2RhcyBsYXMgdmFyaWFibGVzIHNvbiBlc3RhZMOtc3RpY2FtZW50ZSBzaWduaWZpY2F0aXZhcy4gRXN0byBzZSBvYnNlcnZhIGEgcGFydGlyIGRlIGxvcyB2YWxvcmVzIGRlbCAqcC12YWx1ZSogYXNvY2lhZG8gYSBjYWRhIHVuYSBkZSBsYXMgdmFyaWFibGVzIHkgYSBzdXMgKmNvZWZpY2llbnRlcyBkZSByZWdyZXNpw7NuKi4gQXNpbWlzbW8gc2UgY29uZmlybWEgbWVkaWFudGUgbGEgY2FudGlkYWQgZGUgKmFzdGVyaXNjb3MqIHViaWNhZG9zIGEgdW4gY29zdGFkbyBkZSBjYWRhICpwLXZhbHVlKi4gRXN0b3Mgbm9zIHJlZmllcmVuIGVsIG5pdmVsIGRlIHNpZ25pZmljYW5jaWEgZXN0YWTDrXN0aWNhIGVuIHF1ZSBzZSBldmFsdcOzIGNhZGEgKnAtdmFsdWUqLgoKUG9zdGVyaW9ybWVudGUgc2UgcHVlZGUgaWRlbnRpZmljYXIgZWwgdmFsb3IgZGUgY2FkYSBjb2VmaWNpZW50ZSBkZSByZWdyZXNpw7NuOgoKMS4gUGFyYSBlbCBjYXNvIGRlIGxhIHZhcmlhYmxlIGluZGVwZW5kaWVudGUgJFhfMSQsIEluZ3Jlc28gcGVyIEPDoXBpdGEsIGVzIGRlIC0wLjAwMDg3MjE2LCBjb24gdW4gZXJyb3IgZXN0w6FuZGFyIGRlIDAuMDAwMDQ2MTQgdW5pZGFkZXMgZGUgZGVzdmlhY2nDs24gZXN0w6FuZGFyLgoyLiBQYXJhIGVsIGNhc28gZGUgbGEgdmFyaWFibGUgaW5kZXBlbmRpZW50ZSAkWF8yJCwgVGFzYSBkZSBhc2lzdGVuY2lhIGVzY29sYXIsIGVzIGRlIC0wLjI5OTM2MjE1LCBjb24gdW4gZXJyb3IgZXN0w6FuZGFyIGRlIDAuMDE5MjM1NjggdW5pZGFkZXMgZGUgZGVzdmlhY2nDs24gZXN0w6FuZGFyLgozLiBQYXJhIGVsIGNhc28gZGUgbGEgdmFyaWFibGUgaW5kZXBlbmRpZW50ZSAkWF8zJCwgVGFzYSBkZSBhbGZhYmV0aXphY2nDs24sIGVzIGRlIC0wLjMxODAxOTI4LCBjb24gdW4gZXJyb3IgZXN0w6FuZGFyIGRlIDAuMDEyNjg2NzggdW5pZGFkZXMgZGUgZGVzdmlhY2nDs24gZXN0w6FuZGFyLgoKVW4gZWxlbWVudG8gcXVlIHNlIHB1ZWRlIHJlc2FsdGFyIGVuIGVzdGUgbW9tZW50byBlcyBlbCBzaWdubyBuZWdhdGl2byBlbiBsb3MgMyBjb2VmaWNpZW50ZXMgZGUgcmVncmVzacOzbi4gQ29uIGVzdG8gc2UgY29uZmlybWEgbGEgY29ycmVsYWNpw7NuIG5lZ2F0aXZhIHF1ZSBzZSBvYnNlcnbDsyBhbCBpbmljaW8gZGVsIGFuw6FsaXNpcy4KCkEgbGEgdmV6LCBvdHJvIGVsZW1lbnRvIHF1ZSBzZSBvYnNlcnZhIGNvbnNpc3RlIGVuIGVsIHRhbWHDsW8gZGVsICplcnJvciBlc3TDoW5kYXIqIGRlIGNhZGEgY29lZmljaWVudGUgZGUgcmVncmVzacOzbi4gVG9kb3Mgc2UgZW5jdWVudHJhbiBwb3IgZGViYWpvIGRlIHVuYSB1bmlkYWQgZGUgZGVzdmlhY2nDs24gZXN0w6FuZGFyLCBsbyBxdWUgZXMgaW5kaWNhdGl2byBkZSBlcnJvcmVzIHBlcXVlw7Fvcy4gRXN0byBwZXJtaXRlIGluZmVyaXIgcXVlIGxvcyB2YWxvcmVzIGRlIGxvcyBjb2VmaWNpZW50ZXMgZGUgcmVncmVzacOzbiBzb24gYnVlbm9zIHByZWRpY3RvcmVzIGRlbCBjb21wb3J0YW1pZW50byBkZSAkWSQuCgpBIHBhcnRpciBkZSBlc3RvcyB2YWxvcmVzIGNhbGN1bGFkb3Mgc2UgcHVlZGUgY29uc3RydWlyIGVsIG1vZGVsbyBkZSByZWdyZXNpw7NuLCBkZWZpbmllbmRvIGxhcyBtYWduaXR1ZGVzIHBhcmEgY2FkYSBlbGVtZW50byBlbiBsYSBlY3VhY2nDs24gZGVsIG1vZGVsbyBtaXNtby4KCmBgYHtyfQplcXVhdGlvbWF0aWM6OmV4dHJhY3RfZXEobTEsIHVzZV9jb2VmcyA9IFRSVUUpCmBgYAoKCgojIyMgNC4zLiBJbnRlcnByZXRhY2nDs24gZGUgbG9zIGNvZWZpY2llbnRlcyBkZSByZWdyZXNpw7NuLgoKVW5hIHZleiBxdWUgc2UgZXZhbHXDsyBsYSBzaWduaWZpY2FuY2lhIGVzdGFkw61zdGljYSBkZSBsYXMgdmFyaWFibGVzIGRlbCBtb2RlbG8sIGVzIGltcG9ydGFudGUgcmVhbGl6YXIgbGEgaW50ZXJwcmV0YWNpw7NuIGRlIGNhZGEgdW5vIGRlIGxvcyAqY29lZmljaWVudGVzIGRlIHJlZ3Jlc2nDs24qIGFzb2NpYWRvIGEgY2FkYSB2YXJpYWJsZSBpbmNsdWlkYS4KCkVzIGltcG9ydGFudGUgdGVuZXIgZW4gY29uc2lkZXJhY2nDs24gcXVlIHVubyBkZSBsb3MgcHJpbmNpcGFsZXMgYXBvcnRlcyBhbmFsw610aWNvcyBkZSBsb3MgbW9kZWxvcyBkZSByZWdyZXNpw7NuIGNvbnNpc3RlIGVuIGxhIGNhcGFjaWRhZCBkZSBlamVyY2VyICoqY29udHJvbCoqIGVzdGFkw61zdGljbyBkZWwgZWZlY3RvIGRlIGNhZGEgdW5hIGRlIGxhcyB2YXJpYWJsZXMgc2ltdWx0w6FuZWFtZW50ZSwgYW50ZSBsYSBpbmNsdXNpw7NuIGRlIG90cmFzIHZhcmlhYmxlcyBpbnRlcnZpbmllbnRlcy4gRGUgZXN0YSBtYW5lcmEgY2FkYSB2ZXogcXVlIHNlIGluY2x1eWUgdW5hIG51ZXZhIHZhcmlhYmxlIGludGVydmluaWVudGUgKCRYX3tuLTF9JCksIHNlIGVzdMOhIGRlc2NvbnRhbmRvIG8gKmNvbnRyb2xhbmRvKiBzdSBlZmVjdG8gc29icmUgZWwgZWZlY3RvIHF1ZSwgYSBzdSB2ZXosIGVqZXJjZSBsYSB2YXJpYWJsZSBpbmRlcGVuZGllbnRlIGRlIGludGVyw6lzICgkWF8xJCkuCgpBIHBhcnRpciBkZSBlc3RhIGNvbnNpZGVyYWNpw7NuIHNvYnJlIGxhIGltcG9ydGFuY2lhIGRlbCAqY29udHJvbCogZGUgbGFzIHZhcmlhYmxlcyBpbnRlcnZpbmllbnRlcywgbGEgaW50ZXJwcmV0YWNpw7NuIGRlIGxvcyBjb2VmaWNpZW50ZXMgZGUgcmVncmVzacOzbiBhZG9wdGFuIHVuYSBlc3RydWN0dXJhIGVzcGVjw61maWNhLCBkZSBsYSBzaWd1aWVudGUgbWFuZXJhOgoKMS4gRW4gZWwgY2FzbyBkZSBsYSB2YXJpYWJsZSAkWF8xJCBzZSBwdWVkZSBpbnRlcnByZXRhciBkZSBtYW5lcmEgcXVlLCBjb24gdW4gbml2ZWwgZGUgY29uZmlhbnphIGRlbCA5NSUsIHBvciBjYWRhIGF1bWVudG8gZW4gdW5hIHVuaWRhZCBkZWwgSW5ncmVzbyBwZXIgQ8OhcGl0YSAobWVkaWRvIGVuIGTDs2xhcmVzIGFsIGHDsW8pLCBsYSB0YXNhIGRlIG1vcnRhbGlkYWQgaW5mYW50aWwgKCRZJCkgZGVjcmVjZXLDoSBlbiAwLjAwMDg3MjE2IHVuaWRhZGVzIChtZWRpZG8gZW4gZWwgbsO6bWVybyBkZSBmYWxsZWNpbWllbnRvcyBkZSBuacOxb3MgbWVub3JlcyBhIDEgYcOxbyBkZSBlZGFkIHBvciBjYWRhIDEwMDAgbmFjaW1pZW50b3MpLCBkZXNjb250YW5kbyAobyAqY29udHJvbGFuZG8qKSBlbCBlZmVjdG8gZGVsIHJlc3RvIGRlIGxhcyBjb25kaWNpb25lcyBpbmNsdWlkYXMgZW4gZWwgbW9kZWxvLgoyLiBFbiBlbCBjYXNvIGRlIGxhIHZhcmlhYmxlICRYXzIkIHNlIHB1ZWRlIGludGVycHJldGFyIGRlIG1hbmVyYSBxdWUsIGNvbiB1biBuaXZlbCBkZSBjb25maWFuemEgZGVsIDk1JSwgcG9yIGNhZGEgYXVtZW50byBlbiB1bmEgdW5pZGFkIGVuIGxhIHRhc2EgZGUgYXNpc3RlbmNpYSBlc2NvbGFyIChtZWRpZG8gY29tbyBsYSBwb2JsYWNpw7NuIHF1ZSBhc2lzdGUgYSBsYSBlc2N1ZWxhIGVudHJlIDYgeSAyNCBhw7FvcyBkZSBlbnRyZSBsYSBwb2JsYWNpw7NuIGRlIDYgYSAyNCBhw7FvcyBkZSAyMDA1LiksIGxhIHRhc2EgZGUgbW9ydGFsaWRhZCBpbmZhbnRpbCAoJFkkKSBkZWNyZWNlcsOhIGVuIDAuMjk5MzYyMTUgdW5pZGFkZXMsIGRlc2NvbnRhbmRvLCBjb250cm9sYW5kbyBvIG1hbnRlbmllbmRvIGNvbnN0YW50ZSBlbCByZXN0byBkZSBsYXMgY29uZGljaW9uZXMuCjMuIEVuIGVsIGNhc28gZGUgbGEgdmFyaWFibGUgJFhfMyQgc2UgcHVlZGUgaW50ZXJwcmV0YXIgY29tbzogY29uIHVuIG5pdmVsIGRlIGNvbmZpYW56YSBkZWwgOTUlLCBwb3IgY2FkYSBhdW1lbnRvIGRlIHVuYSB1bmlkYWQgZW4gbGEgdGFzYSBkZSBhbGZhYmV0aXphY2nDs24gKG1lZGlkbyBjb21vIGxhIHBvYmxhY2nDs24gYWxmYWJldGEgZGUgMTUgeSBtw6FzIGHDsW9zIGRlIGVudHJlIGxhIHBvYmxhY2nDs24gZGUgMTUgeSBtw6FzIGHDsW9zIGRlIGVkYWQpLCBsYSB0YXNhIGRlIG1vcnRhbGlkYWQgaW5mYW50aWwgKCRZJCkgZGVjcmVjZXLDoSBlbiAwLjMxODAxOTI4IHVuaWRhZGVzLCBtYW50ZW5pZW5kbyBjb25zdGFudGUgZWwgcmVzdG8gZGUgbGFzIGNvbmRpY2lvbmVzLgoKRGUgZXN0YSBtYW5lcmEgc2UgaGEgY29uc3RydWlkbyB1biBtb2RlbG8gZGUgcmVncmVzacOzbiBsaW5lYWwgbcO6bHRpcGxlIGVuIGRvbmRlIGxvcyBlZmVjdG9zIGRlIGNhZGEgdmFyaWFibGUgaW5kZXBlbmRpZW50ZSAoJFhfbiQpIHNvbiBhZGl0aXZvcywgZXN0byBzZSByZWZpZXJlIGEgcXVlIHN1cyBlZmVjdG9zIHNlICJzdW1hbiIgbyBhw7FhZGVuIGVudHJlIHPDrSBwYXJhLCBhc8OtLCBleHBsaWNhciBlbCBjb21wb3J0YW1pZW50byBkZSBsYSB2YXJpYWJsZSBkZXBlbmRpZW50ZSAoJFkkKS4gWSBkZSBsYSBxdWUgc2UgZGVyaXZhIGxhIGVjdWFjacOzbjoKCmBgYHtyfQplcXVhdGlvbWF0aWM6OmV4dHJhY3RfZXEobTEpCmBgYAoKWSBzb2JyZSBsYSBxdWUgc2UgaGEgZXZhbHVhZG8gbGEgc2lnbmlmaWNhbmNpYSBlc3RhZMOtc3RpY2EgdGFudG8gZGVsIG1vZGVsbyBlbiBnZW5lcmFsIGFzw60gY29tbyBkZSBjYWRhIHVubyBkZSBsb3MgY29lZmljaWVudGVzIGRlIHJlZ3Jlc2nDs24gYXNvY2lhZG9zIGEgY2FkYSB2YXJpYWJsZSBleHBsaWNhdGl2YSBvIGluZGVwZW5kaWVudGUuCgojIyA1LiBNb2RlbG8gZGUgcmVncmVzacOzbiBsaW5lYWwgY29uIGludGVyYWNjaW9uZXMuCgpIYXN0YSBlbCBtb21lbnRvIHNlIGhhIHJldmlzYWRvIHVuIG1vZGVsbyBkZSByZWdyZXNpw7NuIGxpbmVhbCBtw7psdGlwbGUgY29uIGVmZWN0b3MgYWRpdGl2b3MsIGVuIGRvbmRlIHNlIGV2YWzDumEgZWwgZWZlY3RvIGNhdXNhbCBkZSBjYWRhIHVuYSBkZSBsYXMgdmFyaWFibGVzIGluZGVwZW5kaWVudGVzIHBvciBzZXBhcmFkby4gU2luIGVtYmFyZ28gZXN0bywgZW4gY2llcnRhIGZvcm1hLCBlcyB1bmEgZXhwbGljYWNpw7NuIGxpbWl0YWRhIGRlIGxhIHJlYWxpZGFkLCBwdWVzIHN1cG9uZSBwZW5zYXIgcXVlIGVuIGxhIHJlYWxpZGFkIChvIHBvYmxhY2nDs24pIGxhcyB2YXJpYWJsZXMgZXhwbGljYXRpdmFzIHNlIGVuY3VlbnRyYW4gY29tcGxldGFtZW50ZSBhaXNsYWRhcyBlbnRyZSBzw60geSwgZGUgZXNhIG1hbmVyYSwgaW5mbHV5ZW4gc29icmUgbGEgdmFyaWFibGUgZXhwbGljYWRhLlwKCkNvbiBlbCBmaW4gZGUgY29tcGxlaml6YXIgbG9zIG1vZGVsb3MgZGUgcmVncmVzacOzbiwgeSBkZSBlc2EgbWFuZXJhIGludGVudGFyIGFjZXJjYXJsb3MgdW4gcG9jbyBtw6FzIGFsIGZ1bmNpb25hbWllbnRvIGRlIGxhIHJlYWxpZGFkIHNvY2lhbCwgZXMgcG9zaWJsZSBpbmNsdWlyICoqaW50ZXJhY2Npb25lcyoqIGVudHJlIGxhcyB2YXJpYWJsZXMuIEVzdG8gcGxhbnRlYSBxdWUsIGVuIG9jYXNpb25lcywgYWxndW5hcyB2YXJpYWJsZXMgbm8gb3BlcmFuIGRlIG1hbmVyYSBhaXNsYWRhIHNpbm8gcXVlLCBlbiBjYW1iaW8sIGFudGVzIGRlIGltcGFjdGFyIHNvYnJlICRZJCwgZGljaGFzIHZhcmlhYmxlcyBpbnRlcnZpbmllbnRlcyAqaW50ZXJhY3TDumFuKiBvIGNvbWJpbmFuIHN1cyBpbmZsdWVuY2lhcyBwcmV2aWFtZW50ZSB5LCB1bmEgdmV6IG9jdXJyaWRvLCBkZXNwdcOpcyBlamVyY2VuIHN1IGVmZWN0byBjYXN1YWwgc29icmUgbGEgdmFyaWFibGUgZXhwbGljYWRhLlwKCkxhIG1hbmVyYSBlbiBxdWUgc2UgcmVwcmVzZW50YSBkaWNoYSBpbnRlcmFjY2nDs24gZW4gdW4gbW9kZWxvIGRlIHJlZ3Jlc2nDs24gbGluZWFsIG3Dumx0aXBsZSBlcyBtZWRpYW50ZSBsYSBjcmVhY2nDs24gZGUgdW5hIG51ZXZhIHZhcmlhYmxlIGludGVydmluaWVudGUgJFhfe24qKG4rMSl9JCwgcXVlIGVzIHByb2R1Y3RvIGRlIGxhIGludGVyYWNjacOzbiBtdWx0aXBsaWNhdGl2YSBkZSBsYXMgdmFyaWFibGVzIG9yaWdpbmFsZXMgcXVlLCBlbCBhbmFsaXN0YSBjb25zaWRlcmEgcXVlIGNvbWJpbmFuIHN1cyBlZmVjdG9zLlwKCkxhcyBpbnRlcmFjY2lvbmVzIHNlIHB1ZWRlbiByZWFsaXphciBlbnRyZSB2YXJpYWJsZXMgY29uIGRpc3RpbnRhcyBlc2NhbGFzIGRlIG1lZGljacOzbiwgcGVybyBsbyBtw6FzIHJlY29tZW5kYWJsZSBlcyB1dGlsaXphciB2YXJpYWJsZXMgc29sYW1lbnRlIGNvbnRpbnVhcyBlbnRyZSBzw60gbywgdGFtYmnDqW4sIGV2YWx1YXIgaW50ZXJhY2Npb25lcyBlbnRyZSB2YXJpYWJsZXMgY29udGludWFzIGp1bnRvIGNvbiB2YXJpYWJsZXMgKmR1bW15Ki4gRWwgaW5jbHVpciB1bmEgaW50ZXJhY2Npw7NuIHF1ZSBpbmNsdXlhIGEgdW5hIHZhcmlhYmxlIGNhdGVnw7NyaWNhIG11bHRpbm9taWFsIGNvcnJlIGVsIHJpZXNnbyBkZSBxdWUgbGEgaW50ZXJwcmV0YWNpw7NuIHNlYSBkZW1hc2lhZG8gY29tcGxlamEuCgojIyMgNS4xLiBSZWdyZXNpw7NuIGNvbiBpbnRlcmFjY2nDs24gZGUgdmFyaWFibGVzIGNvbnRpbnVhcy4KClBvciBlamVtcGxvLCBhbCBtb2RlbG8gZGUgcmVncmVzacOzbiBxdWUgc2UgY29uc3RydXnDsyBhbnRlcmlvcm1lbnRlLCBzZSBsZSBwdWVkZSBhw7FhZGlyIHVuYSBudWV2YSB2YXJpYWJsZSBpbnRlcnZpbmllbnRlICgkWF80JCkgZW4gbGEgcXVlIHNlIGNvbmNlbnRyZSBlbCBlZmVjdG8gZGVsIGZhY3RvciAqZWR1Y2FjacOzbiosIHkgcXVlIHJlcHJlc2VudGUgYSBsYSBpbnRlcmFjY2nDs24gZGUgbGFzIHZhcmlhYmxlcyAkWF8yJCAodGFzYSBkZSBhc2lzdGVuY2lhIGVzY29sYXIpIHkgJFhfMyQgKHRhc2EgZGUgYWxmYWJldGl6YWNpw7NuKSBwYXJhIGVsIGHDsW8gMjAwNSwgZGUgbGEgc2lndWllbnRlIGZvcm1hIGVuIFI6IGB0YXNhX2FzaXN0ZW5jaWFfZXNjb2xhcl8yMDA1ICogdGFzYV9hbGZhYmV0aXphY2lvbl8yMDA1YAoKYGBge3J9Cm0yIDwtIGxtKHRhc2FfbW9ydGFsaWRhZF9pbmZhbnRpbF8yMDA1IH4gICAgICAjdmFyaWFibGUgZGVwZW5kaWVudGUKICAgICAgICAgICB1c2RfcHBjXzIwMDUgKyAgICAgICAgICAgICAgICAgICAgICN2YXJpYWJsZSBYXzEKICAgICAgICAgICB0YXNhX2FzaXN0ZW5jaWFfZXNjb2xhcl8yMDA1ICogICAgICN2YXJpYWJsZSBYXzIsIHNlIGluY2x1eWUgdW4gc2lnbm8gZGUgbXVsdGlwbGljYWNpw7NuIHBhcmEgaW50ZXJhY2Npw7NuCiAgICAgICAgICAgdGFzYV9hbGZhYmV0aXphY2lvbl8yMDA1LCAgICAgICAgICAjdmFyaWFibGUgWF8zLCBxdWUgc2UgZXZhbMO6YSBlbiBpbnRlcmFjY2nDs24gY29uIFhfMgogICAgICAgICBkYXRhID0gZGF0b3NfaWRoKSAgICAgICAgICAgICAgICAgICAgI29iamV0byBvIGRhdGEgZnJhbWUKZXF1YXRpb21hdGljOjpleHRyYWN0X2VxKG0yKQpgYGAKCkFzw60gc2UgaGEgY29uc3RydWlkbyB1bmEgbnVldmEgZWN1YWNpw7NuIGRlbCBtb2RlbG8gZGUgcmVncmVzacOzbiBsaW5lYWwgbcO6bHRpcGxlIGNvbiBpbnRlcmFjY2nDs24uXApBbCBtYW5kYXIgYSBsbGFtYXIgYSBsb3MgY29lZmljaWVudGVzIGRlIHJlZ3Jlc2nDs24gcGFyYSBldmFsdWFybG9zIGluZGl2aWR1YWxtZW50ZSwgYXPDrSBjb21vIHBhcmEgZXZhbHVhciBsYSBzaWduaWZpY2FuY2lhIGVzdGFkw61zdGljYSBkZWwgbW9kZWxvIHNlIG9ic2VydmEgdW4gdmFsb3IgY2FsY3VsYWRvIHBhcmEgZWwgY29lZmljaWVudGUgZGUgcmVncmVzacOzbiBkZSBjYWRhIHZhcmlhYmxlLCBhIGxhIHZleiBxdWUgc2UgYcOxYWRlIHVuYSB2YXJpYWJsZSBudWV2YSAobGEgKmludGVyYWNjacOzbiopIGNvbiB1biB2YWxvciBwYXJ0aWN1bGFyLgoKYGBge3J9CnN1bW1hcnkobTIpCmBgYAoKQSBwYXJ0aXIgZGUgZXN0b3MgdmFsb3JlcyBjYWxjdWxhZG9zIHNlIHB1ZWRlbiBpZGVudGlmaWNhciBhbGd1bmFzIGNhcmFjdGVyw61zdGljYXMgZGVsIG1vZGVsbyBkZSByZWdyZXNpw7NuIGNvbiBpbnRlcmFjY2lvbmVzIGVudHJlIHZhcmlhYmxlcyBjb250aW51YXM6IAoKMS4gRWwgbW9kZWxvIGVuIGdlbmVyYWwgZXMgZXN0YWTDrXN0aWNhbWVudGUgc2lnbmlmaWNhdGl2bywgeSBzdSB2YWxvciBkZWwgY29lZmljaWVudGUgZGUgZGV0ZXJtaW5hY2nDs24gYWp1c3RhZG8gKCpSIGN1YWRyYWRvIGFqdXN0YWRvKikgZXMgZGUgMC41Njc2LiBFbiBjb21wYXJhY2nDs24gY29uIGVsIG1vZGVsbyBhbnRlcmlvciAoYWRpdGl2byksIG5vIG1lam9yw7MgbGEgY2FwYWNpZGFkIGV4cGxpY2F0aXZhIGRlbCDDunRsaW1vIG1vZGVsby4KMi4gSHVibyB1biBjYW1iaW8gZW4gZWwgdmFsb3IgZXNwZWPDrWZpY28gZGUgY2FkYSB1bm8gZGUgbG9zIGNvZWZpY2llbnRlcyBkZSByZWdyZXNpw7NuLCB5IHNlIG1hbnR1dmllcm9uIGxvcyBzaWdub3MgbmVnYXRpdm9zIGRlIGxvcyBjb2VmaWNpZW50ZXMgaW5kaXZpZHVhbGVzLiBBc2ltaXNtbyBlc3RvcyBjb2VpZmljaWVudGVzIG1hbnR1dmllcm9uIHN1IHNpZ25pZmljYW5jaWEgZXN0YWTDrXN0aWNhLgozLiBMYSBpbnRlcmFjY2nDs24gZW50cmUgJFhfMiQgeSAkWF8zJCBtb3N0csOzIHVuIGNvZWZpY2llbnRlIGRlIHJlZ3Jlc2nDs24gY29uIHNpZ25vIHBvc2l0aXZvIChhbGdvIHF1ZSBwYXJlY2UgY29udHJhaW50dWl0aXZvKSwgc2luIGVtYmFyZ28gbm8gcmVzdWx0w7MgZXN0YWTDrXN0aWNhbWVudGUgc2lnbmlmaWNhdGl2byAocHVlcyBzdSAqcC12YWx1ZSopIHB1ZXMgc3UgcHJvYmFiaWxpZGFkIHNlIHViaWPDsyBwb3IgZW5jaW1hIGRlIHVuIG5pdmVsIGRlIHNpZ25pZmljYW5jaWEgZGUgMC4wNS4gUG9yIGVsbG8sIGFuYWzDrXRpY2FtZW50ZSwgc2UgZGViZSBleGNsdWlyIGRlbCBtb2RlbG8gcGFyYSBleHBsaWNhciBhICRZJC4KClBhcmEgZWZlY3RvcyBkZSBlc3RlIGVqZXJjaWNpbyBkZSBleHBsaWNhY2nDs24gZGUgdW4gbW9kZWxvIGRlIHJlZ3Jlc2nDs24gbGluZWFsIG3Dumx0aXBsZSBjb24gaW50ZXJhY2Npb25lcywgc2kgc2UgYXN1bWUgcXVlIGxhIGludGVyYWNjacOzbiBodWJpZXNlIHJlc3VsdGFkbyBzZXIgZXN0YWTDrXN0aWNhbWVudGUgc2lnbmlmaWNhdGl2YSAoZXN0byBlcywgcXVlIHN1ICpwLXZhbHVlKiBzZSB1YmljYXJhIHBvciBkZWJham8gZGVsIG5pdmVsIGRlIHNpZ25pZmljYW5jaWEpLCBsYSBtYW5lcmEgZGUgaW50ZXJwcmV0YXIgZWwgdmFsb3IgZGUgc3UgY29lZmljaWVudGUgZGViZXLDrWEgc2VyOgoKKiBDb24gdW4gbml2ZWwgZGUgY29uZmlhbnphIGRlbCA5NSUsIHNlIHB1ZWRlIGluZmVyaXIgcXVlIHBvciBjYWRhIGF1bWVudG8gZW4gdW5hIHVuaWRhZCBlbiBsYSBpbnRlcmFjY2nDs24gZW50cmUgbGEgdGFzYSBkZSBhc2lzdGVuY2lhIGVzY29sYXIgKCRYXzIkKSB5IGxhIHRhc2EgZGUgYWxmYWJldGl6YWNpw7NuICgkWF8zJCkgcGFyYSBlbCBhw7FvIDIwMDUsIGxhIHRhc2EgZGUgbW9ydGFsaWRhZCBpbmZhbnRpbCAoJFkkKSBhdW1lbnRhcsOtYSBlbiAwLjAwMDk2Njg0IHVuaWRhZGVzLCBtYW50ZW5pZW5kbyAobyBkZXNjb250YW5kbykgY29uc3RhbnRlIGVsIGVmZWN0byBkZWwgcmVzdG8gZGUgbGFzIHZhcmlhYmxlcy4KClkgbGEgbWFuZXJhIGVuIHF1ZSBzZSByZXByZXNlbnRhIGRpY2hvIG1vZGVsbyBtZWRpYW50ZSBzdSBlY3VhY2nDs24geSB2YWxvcmVzIGRlIGNvZWZpY2llbnRlcyBlczoKCmBgYHtyfQplcXVhdGlvbWF0aWM6OmV4dHJhY3RfZXEobTIsIHVzZV9jb2VmcyA9IFRSVUUpCmBgYAoKCiMjIyA1LjIuIFJlZ3Jlc2nDs24gY29uIHZhcmlhYmxlcyBjYXRlZ8OzcmljYXMuCgpIYXN0YSBlbCBtb21lbnRvIHNlIGhhIHJldmlzYWRvIGxhIGNvbnN0cnVjY2nDs24gZGUgbW9kZWxvcyBkZSByZWdyZXNpw7NuIGxpbmVhbCBtw7psdGlwbGUgZW4gZG9uZGUgc2UgdXRpbGl6YW4gc29sbyB2YXJpYWJsZXMgaW5kZXBlbmRpZW50ZXMgZGUgdGlwbyBjb250aW51YXMuIFBlcm8gdGFtYmnDqW4gZXMgcG9zaWJsZSBsYSBpbmNvcnBvcmFjacOzbiBkZSB2YXJpYWJsZXMgY2F0ZWfDs3JpY2FzIGRlbCBsYWRvIGRlIGxhcyBpbmRlcGVuZGllbnRlcywgeWEgc2VhIHF1ZSBzZSBldmFsw7plIHN1IGVmZWN0byBkZSBtYW5lcmEgYWlzbGFkYSBvIGVuIGludGVyYWNjacOzbiBjb24gb3RyYXMgdmFyaWFibGVzLlwKCkVuIGVzdGUgY2FzbyBzZSBkZWJlIHRvbWFyIGVuIGN1ZW50YSBsYSBtYW5lcmEgZW4gcXVlIGRpY2hhcyB2YXJpYWJsZXMgY2F0ZWfDs3JpY2FzIHNvbiB0cmF0YWRhcyBwb3IgKipSKiogYWwgbW9tZW50byBkZSBpbmNvcnBvcmFybGFzIGEgdW4gbW9kZWxvIGRlIHJlZ3Jlc2nDs24gbGluZWFsLiBFc3RvIGVzIGltcG9ydGFudGUsIHB1ZXMgbGFzIHZhcmlhYmxlcyBjYXRlZ8OzcmljYXMgcHVlZGVuIHNlciBkZSBjb3J0ZSBiaW5vbWlhbCAoZG9zIHZhbG9yZXMgZGUgcmVzcHVlc3RhIG8gYXRyaWJ1dG9zKSBvIG11bHRpbm9taWFsZXMgKG3DoXMgZGUgZG9zIHZhbG9yZXMgZGUgcmVzcHVlc3RhIG8gYXRyaWJ1dG9zKSwgcGVybyBhbCBtb21lbnRvIGRlIHNlciBpbmNsdWlkYXMgZW4gdW4gbW9kZWxvIGRlIHJlZ3Jlc2nDs24gbGluZWFzLCBzZXLDoW4gdHJhdGFkYXMgY29tbyB2YXJpYWJsZXMgdGlwbyAiKmR1bW15KiIuIEVzdGFzIHZhcmlhYmxlcyBzZSBjYXJhY3Rlcml6YW4gcG9yIGFkb3B0YXIgc29sbyAyIHZhbG9yZXMgbyBhdHJpYnV0b3MgcG9zaWJsZXMsIGFzaWduw6FuZG9sZXMgdmFsb3JlcyBkZSBjb2RpZmljYWNpw7NuIGRlIDAgKHBhcmEgbG9zIGNhc29zIGNvbnNpZGVyYWRvcyBjb21vICJmcmFjYXNvcyIpIHkgMSAocGFyYSBsb3MgY2Fzb3MgY29uc2lkZXJhZG9zIGNvbW8gIsOpeGl0byIpLiBEZSBtYW5lcmEgcXVlIHVuYSB2YXJpYWJsZSBjYXRlZ8OzcmljYSBtdWx0aW5vbWlhbCwgYWwgbW9tZW50byBkZSB0cmFuc2Zvcm1hcnNlIGVuIHZhcmlhYmxlICpkdW1teSosIHNlcsOhICJwYXJ0aWRhIiBlbiB0YW50YXMgdmFyaWFibGVzICpkdW1teSogc2Vnw7puIGxhIGNhbnRpZGFkIGRlIHZhbG9yZXMgbyBhdHJpYnV0b3MgcXVlIGNvbnRlbmdhbiBhIGxhIHZhcmlhYmxlIG9yaWdpbmFsLCB5IGFsIGZpbmFsIHVuYSBkZSBlc2FzIGNhdGVnb3LDrWFzIHNlcsOhIHViaWNhZGEgY29tbyB1bmEgKmNhdGVnb3LDrWEgZGUgcmVmZXJlbmNpYSouCgpPdHJhIGNhcmFjdGVyw61zdGljYSBkZWwgYW7DoWxpc2lzIGRlIHJlZ3Jlc2nDs24gbcO6bHRpcGxlIHF1ZSBpbmNvcnBvcmEgYSB1bmEgdmFyaWFibGUgY2F0ZWfDs3JpY2EgY29uc2lzdGUgZW4gcXVlLCBhbCBtb21lbnRvIGRlIGV2YWx1YXIgbG9zIGVmZWN0b3MgY2F1c2FsZXMgZGUgZGljaGEgdmFyaWFibGUgdHJhbnNmb3JtYWRhIGVuICpkdW1teSosIGxvcyBjb2VmaWNpZW50ZXMgZGUgcmVncmVzacOzbiBjYWxjdWxhZG9zIHNlIGludGVycHJldGFuIGNvbW8gbGFzIGRpZmVyZW5jaWFzIGRlIGVmZWN0byBxdWUgZWplcmNlIGNhZGEgdW5hIGRlIGxhcyBjYXRlZ29yw61hcyAqZHVtbXkqIHJlc3BlY3RvIGRlIGxhIGNhdGVnb3LDrWEgZGUgcmVmZXJlbmNpYS4gRXN0byBlcywgZW4gZWwgbW9kZWxvIGRlIHJlZ3Jlc2nDs24gc2UgY29tcGFyYSBlbCBlZmVjdG8gZGUgY2FkYSB1bm8gZGUgbG9zIHZhbG9yZXMgZGUgcmVzcHVlc3RhIG8gYXRyaWJ1dG9zIGFpc2xhZGFtZW50ZSBjb24gcmVzcGVjdG8gYSBsYSBjYXRlZ29yw61hIGRlIHJlZmVyZW5jaWEuXAoKVXN1YWxtZW50ZSBhbGd1bm9zIHNvZnR3YXJlIGRlIGFuw6FsaXNpcyBlc3RhZMOtc3RpY28gKGNvbW8gcG9yIGVqLiBTUFNTKSwgcmVxdWllcmVuIHF1ZSBhbnRlcyBkZSBpbmNvcnBvcmFyIGEgdW5hIHZhcmlhYmxlIGNhdGVnw7NyaWNhIGVuIGVsIGFuw6FsaXNpcywgZXN0YSBkZWJlIHNlciB0cmFuc2Zvcm1hZGEgZW4gdW5hIHZhcmlhYmxlICpkdW1teSouIFNpbiBlbWJhcmdvLCAqKlIqKiBjdWVudGEgY29uIGxhIGNhcGFjaWRhZCBwYXJhIHRyYWJhamFyIGRpcmVjdGFtZW50ZSBjb24gbGFzIHZhcmlhYmxlcyBjYXRlZ8OzcmljYXMgKHlhIHNlYW4gYmlub21pYWxlcyBvIG11bHRpbm9taWFsZXMpLCB5IHB1ZWRlIGluY29ycG9yYXJsYXMgYSB1biBtb2RlbG8gZGUgcmVncmVzacOzbiBsaW5lYWwgZW4gZWwgcXVlIGxhcyB0cmFuc2Zvcm1hIGVuICpkdW1teSogYXV0b23DoXRpY2FtZW50ZS4KCkEgY29udGludWFjacOzbiBzZSBjb250aW51YSBjb24gZWwgZWplcmNpY2lvIGRlbCBtb2RlbG8gZGUgcmVncmVzacOzbiBsaW5lYWwgbcO6bHRpcGxlIHksIGFkZW3DoXMsIHNlIGluY29ycG9yYXLDoSBhIGxhIHZhcmlhYmxlIGNhdGVnw7NyaWNhICgkWF81JCkgZGVsICJHcmFkbyBkZWwgw41uZGljZSBkZSBEZXNhcnJvbGxvIEh1bWFubyIgY2FsY3VsYWRvIHBhcmEgY2FkYSBtdW5pY2lwaW8gbWV4aWNhbm8gZW4gZWwgYcOxbyAyMDA1IChncmFkb19pZGhfMjAwNSksIHF1ZSBjdWVudGEgY29uIDMgY2F0ZWdvcsOtYXM6IGFsdG8sIG1lZGlvIHkgYmFqby4KCmBgYHtyfQp0YWJsZShkYXRvc19pZGggJGdyYWRvX2lkaF8yMDA1KQpgYGAKCkxhIG1hbmVyYSBkZSBpbmNvcnBvcmFyIGEgZGljaGEgdmFyaWFibGUgY2F0ZWfDs3JpY2EgbXVsdGlub21pYWwgZW4gZWwgbW9kZWxvIGRlIHJlZ3Jlc2nDs24gbGluZWFsIG3Dumx0aXBsZSBlcyBtZWRpYW50ZSBsbGFtYXJsYSBkaXJlY3RhbWVudGUgZW4gZWwgbW9kZWxvLCBhc8OtIGNvbW8gc3UgaW5jbHVzacOzbiBlbiBsYSBlY3VhY2nDs24gY29ycmVzcG9uZGllbnRlLgoKYGBge3J9Cm0zIDwtIGxtKHRhc2FfbW9ydGFsaWRhZF9pbmZhbnRpbF8yMDA1IH4gICAgICN2YXJpYWJsZSBkZXBlbmRpZW50ZQogICAgICAgICAgIHVzZF9wcGNfMjAwNSArICAgICAgICAgICAgICAgICAgICAgI3ZhcmlhYmxlIFhfMQogICAgICAgICAgIHRhc2FfYXNpc3RlbmNpYV9lc2NvbGFyXzIwMDUgKyAgICAgI3ZhcmlhYmxlIFhfMgogICAgICAgICAgIHRhc2FfYWxmYWJldGl6YWNpb25fMjAwNSArICAgICAgICAgI3ZhcmlhYmxlIFhfMwogICAgICAgICAgIGdyYWRvX2lkaF8yMDA1LCAgICAgICAgICAgICAgICAgICAgI3ZhcmlhYmxlIFhfNSwgY2F0ZWfDs3JpY2EgY29uIDMgYXRyaWJ1dG9zCiAgICAgICAgIGRhdGEgPSBkYXRvc19pZGgpICAgICAgICAgICAgICAgICAgICAjZGF0YSBmcmFtZQplcXVhdGlvbWF0aWM6OmV4dHJhY3RfZXEobTMpCmBgYAoKIyMjIyA1LjMuMS4gSW50ZXJwcmV0YWNpw7NuIGRlIGxvcyBjb2VmaWNpZW50ZXMgZGUgcmVncmVzacOzbiBwYXJhIHVuYSB2YXJpYWJsZSBjYXRlZ8OzcmljYS4KClkgYSBwYXJ0aXIgZGUgbWFuZGFyIGEgbGxhbWFyIGxvcyByZXN1bHRhZG9zIGRlbCBtb2RlbG8gZGUgcmVncmVzacOzbiBgbTNgIHNlIHB1ZWRlIG9ic2VydmFyIGxvIHNpZ3VpZW50ZToKCmBgYHtyfQpzdW1tYXJ5KG0zKQpgYGAKCgoxLiBFbCBtb2RlbG8gZW4gZ2VuZXJhbCBzaWd1ZSBzaWVuZG8gZXN0YWTDrXN0aWNhbWVudGUgc2lnbmlmaWNhdGl2bywgeSBzdSBib25kYWQgZGUgYWp1c3RlIGF1bWVudMOzIGEgMC41ODQxIHJlc3BlY3RvIGRlbCBtb2RlbG8gaW5pY2lhbCBgbTFgLCBwb3IgbG8gcXVlIHBhcmVjZSBxdWUgbGEgaW5jb3Jwb3JhY2nDs24gZGUgbGEgbnVldmEgdmFyaWFibGUgY2F0ZWfDs3JpY2EgJFhfNSQgYXl1ZMOzIGEgbWVqb3IgbGEgY2FwYWNpZGFkIGV4cGxpY2F0aXZhIGRlbCBtb2RlbG8uCjIuIExvcyBjb2VmaWNpZW50ZXMgZGUgbWFuZXJhIGluZGl2aWR1YWwgc3Vmcmllcm9uIGxpZ2Vyb3MgY2FtYmlvcyBlbiBzdXMgY29lZmljaWVudGVzIGRlIHJlZ3Jlc2nDs24gcmVzcGVjdG8gZGVsIG1vZGVsbyBpbmljaWFsIGBtMWAuCjMuIFRvZGFzIGxhcyB2YXJpYWJsZXMgZnVlcm9uIGVzdGFkw61zdGljYW1lbnRlIHNpZ25pZmljYXRpdmFzLCBwb3IgbG8gcXVlIHZhbGUgbGEgcGVuYSBtYW50ZW5lcmxhcyBlbiBlbCBtb2RlbG8gYXPDrSBjb21vIGVuIGxhcyBleHBsaWNhY2lvbmVzIHNvYnJlIGVsIGNvbXBvcnRhbWllbnRvIGRlICRZJC4KNC4gTG9zIGNvZWZpY2llbnRlcyBkZSByZWdyZXNpw7NuIHBhcmEgbGFzIGRpc3RpbnRhcyB2YXJpYWJsZXMgKmR1bW15KiBjcmVhZGFzIChncmFkb19pZGhfMjAwNWJham8sIGdyYWRvX2lkaF8yMDA1bWVkaW8pIGEgcGFydGlyIGRlIGxhIHZhcmlhYmxlICRYXzUkIChncmFkb19pZGhfMjAwNSkgY3VlbnRhbiBjb24gc2lnbm9zIG8gZWZlY3RvcyAicG9zaXRpdm9zIiBzb2JyZSBlbCBjb21wb3J0YW1pZW50byBkZSAkWSQuCgpDZW50cmFuZG8gc29sbyBsYSBhdGVuY2nDs24gYSBsb3MgY29lZmljaWVudGVzIGRlIHJlZ3Jlc2nDs24gZGUgbGEgdmFyaWFibGUgY2F0ZWfDs3JpY2EsIHN1IGludGVycHJldGFjacOzbiBzZSBwdWVkZSByZWFsaXphciBkZSBsYSBzaWd1aWVudGUgbWFuZXJhOgoKMS4gVG9tYW5kbyBlbiBjb25zaWRlcmFjacOzbiB0b2RvcyBsb3MgdmFsb3JlcyBkZSByZXNwdWVzdGEgbyBhdHJpYnV0b3MgZGUgbGEgdmFyaWFibGUgJFhfNSQsIHByaW1lcm8gc2UgZGViZSBpZGVudGlmaWNhciBjdcOhbCBlcyBsYSBjYXRlZ29yw61hIHF1ZSBzaXJ2acOzIGRlIHJlZmVyZW5jaWEgbyBwdW50byBkZSBjb21wYXJhY2nDs24uIEVuIGVzdGUgY2FzbywgKipSKiogdG9tw7MgY29tbyBjYXRlZ29yw61hIGRlIHJlZmVyZW5jaWEgYWwgYXRyaWJ1dG8gZGUgZ3JhZG8gZGUgSURIICIqYWx0byoiLiBZIGVzbyBzZSBpZGVudGlmaWNhIGEgcGFydGlyIGRlIHF1ZSBlcyBsYSB2YXJpYWJsZSBxdWUgbm8gZnVlIGluY29ycG9yYWRhIGVuIGxvcyByZXN1bHRhZG9zIGRlbCBtb2RlbG87IGVzdG8gZXMsIG5vIHNlIGFycm9qw7MgdW4gdmFsb3IgY2FsY3VsYWRvIHBhcmEgZWwgY29lZmljaWVudGUgZGUgcmVncmVzacOzbiBwYXJhIGRpY2hhIGNhdGVnb3LDrWEuIEVzdMOhIGF1c2VudGUuCjIuIExhIGludGVycHJldGFjacOzbiBkZSBsYSBwcmltZXIgdmFyaWFibGUgKmR1bW15KiBxdWUgc2UgcHJlc2VudGEgZW4gZWwgcmVwb3J0ZSBkZSByZXN1bHRhZG9zLCBxdWUgc2UgcmVmaWVyZSBhbCBncmFkbyAqYmFqbyogZGUgSURIIChncmFkb19pZGhfMjAwNWJham8pLCBwcm9jZWRlIGRlIGxhIHNpZ3VpZW50ZSBtYW5lcmE6IENvbiB1biBuaXZlbCBkZSBjb25maWFuemEgZGVsIDk1JSwgc2UgcHVlZGUgaW5mZXJpciBxdWUgZW4gYXF1ZWxsb3MgbXVuaWNpcGlvcyBxdWUgY3VlbnRhbiBjb24gdW4gbml2ZWwgKmJham8qIGRlIElESCB0aWVuZGVuIGEgcmVnaXN0cmFyIHVuIGF1bWVudG8gZGUgMjAuNzIgZW4gbGEgdGFzYSBkZSBtb3J0YWxpZGFkIHBhcmEgZWwgYcOxbyAyMDA1ICplbiBjb21wYXJhY2nDs24qIGNvbiBsb3MgbXVuaWNpcGlvcyBxdWUgY3VlbnRhbiBjb24gdW4gbml2ZWwgKmFsdG8qIGRlIElESCBwYXJhIGVsIGHDsW8gMjAwNSwgbWFudGVuaWVuZG8gZWwgcmVzdG8gZGUgbGFzIGNvbmRpY2lvbmVzIGNvbnN0YW50ZXMgKG8gY29udHJvbGFuZG8gcG9yIGVsIHJlc3RvIGRlIGxhcyB2YXJpYWJsZXMgZW4gZWwgbW9kZWxvKS4KMy4gTGEgaW50ZXJwcmV0YWNpw7NuIGRlIGxhIHNlZ3VuZGEgdmFyaWFibGVzICpkdW1teSogcXVlIHNlIHByZXNlbnRhIGVuIGVsIHJlcG9ydGUgZGUgcmVzdWx0YWRvcywgcXVlIHNlIHJlZmllcmUgYWwgZ3JhZG8gKm1lZGlvKiBkZSBJREggKGdyYWRvX2lkaF8yMDA1bWVkaW8pLCBwcm9jZWRlIGRlIGxhIHNpZ3VpZW50ZSBtYW5lcmE6IENvbiB1biBuaXZlbCBkZSBjb25maWFuemEgZGVsIDk1JSwgc2UgcHVlZGUgaW5mZXJpciBxdWUgZW4gYXF1ZWxsb3MgbXVuaWNpcGlvcyBxdWUgY3VlbnRhbiBjb24gdW4gbml2ZWwgKm1lZGlvKiBkZSBJREggdGllbmRlbiBhIHJlZ2lzdHJhciB1biBhdW1lbnRvIGRlIDIuOTMgZW4gbGEgdGFzYSBkZSBtb3J0YWxpZGFkICplbiBjb21wYXJhY2nDs24qIGNvbiBsb3MgbXVuaWNpcGlvcyBxdWUgY3VlbnRhbiBjb24gdW4gbml2ZWwgKmFsdG8qIGRlIElESCBwYXJhIGVsIGHDsW8gMjAwNSwgbWFudGVuaWVuZG8gZWwgcmVzdG8gZGUgbGFzIGNvbmRpY2lvbmVzIGNvbnN0YW50ZXMgKG8gY29udHJvbGFuZG8gcG9yIGVsIHJlc3RvIGRlIGxhcyB2YXJpYWJsZXMgZW4gZWwgbW9kZWxvKS4KCgojIyBDb21lbnRhcmlvcyBmaW5hbGVzLgoKTGEgdXRpbGlkYWQgY2VudHJhbCBkZSB1biBtb2RlbG8gZGUgcmVncmVzacOzbiBsaW5lYWwgbcO6bHRpcGxlIGNvbnNpc3RlIGVuIHF1ZSwgYWRlbcOhcyBkZSBwZXJtaXRpciBsYSBpbmNvcnBvcmFjacOzbiBkZSB1bmEgbWF5b3IgY2FudGlkYWQgZGUgdmFyaWFibGVzIGluZGVwZW5kaWVudGVzIGUgaW50ZXJ2aW5pZW50ZXMsIHkgYXPDrSBjb21wbGVqaXphciBsb3MgbW9kZWxvcyBkZSBlZmVjdG9zIGNhdXNhbGVzLCBlcyB1bmEgZXN0cmF0ZWdpYSBpbXBvcnRhbnRlIHBhcmEgZWplcmNlciAqY29udHJvbCBlc3RhZMOtc3RpY28qIHNvYnJlIGxhcyB2YXJpYWJsZXMgaW5kZXBlbmRpZW50ZXMgYWwgbW9tZW50byBkZSBldmFsdWFyIHN1IGluZmx1ZW5jaWEgc29icmUgbGEgdmFyaWFibGVzIGV4cGxpY2FkYSAoJFkkKS5cCkVzdG8gZXMgaW1wb3J0YW50ZSBlbiB0w6lybWlub3MgZXhwbGljYXRpdm9zIGRlIGxhIHJlYWxpZGFkIHNvY2lhbCBwdWVzLCBzaSBiaWVuIHNlIHNhYmUgcXVlIGxvcyBmZW7Ds21lbm9zIHRpZW5kZW4gYSBzZXIgbXVsdGlmYWN0b3JpYWxlcywgYW5hbMOtdGljYW1lbnRlIHN1ZWxlIHNlciBtdXkgcmVsZXZhbnRlIHJlY29ub2NlciBkZSBtYW5lcmEgYWlzbGFkYSBsYSBpbmZsdWVuY2lhIGRlIHVuYSB2YXJpYWJsZSBleHBsaWNhdGl2YSBkZSBpbnRlcsOpcyBwZXJvLCBzaW11bHTDoW5lYW1lbnRlLCB0YW1iacOpbiBlcyBjcnVjaWFsIGNvbnRyb2xhciBvIGRlc2NvbnRhciBsYSBpbmZsdWVuY2lhIGRlIHZhcmlhYmxlcyBpbnRlcnZpbmllbnRlcyBxdWUgb3BlcmFuIGVuIGxhIHJlYWxpZGFkIHkgcXVlLCBhbCBmaW5hbCwgcHVlZGVuIGNvbmZ1bmRpcm5vcyBhbCBpbnRlbnRhciBleHBsaWNhciBhbCBmZW7Ds21lbm8gZGUgaW50ZXLDqXMuCg==