hllinas2023

1 Librerías

1.0.1 Para PCA

El software R dispone de varias funciones de diferentes paquetes para calcular PCA:

  • prcomp y princomp, del paquete stats.

  • PCA del paquete FactoMineR.

  • dudi.pca del paquete ade4.

  • epPCA del paquete ExPosition.

Sin importar la función que elija emplear, es posible extraer y representar de manera sencilla los resultados del PCA mediante las funciones del paquete factoextra. En este documento, se hará uso de los paquetes FactoMineR y ade4 para los análisis y factoextra para la visualización basada en ggplot2.

library(FactoMineR)
library(factoextra)
library(ade4)

1.0.2 Para otros análisis

library(aplore3)       #Base de datos para los ejemplos
library(lsm)           #Base de datos para ejemplos y estimaciones del Log-verosimilitud
library(tidyverse)     #Incluye a dplyr y ggplot2
library(stringr)       #Reemplazar caracteres en un data frame
library(outliers)      #outliers::grubbs.test
library(EnvStats)      #EnvStats::rosnerTest
library(DMwR2)         #LOF (Local Outlier Factor)
library(rgl)           #rgl::plot3d
library(corrplot)      #Matriz de correlaciones
library(textshape)     #column_to_rownames

2 Introducción

2.0.1 Preliminares

Es un método de interdependencia para resumir la información contenida en las variables y facilitar su análisis. El ACP transforma el conjunto de variables originales en un subconjunto más pequeño de variables (véase la figura 2.1).

**Reducción de la dimensión**

Figure 2.1: Reducción de la dimensión

Estas variables son combinaciones lineales de las primeras, que contienen mayor parte de la variabilidad presente en el conjunto inicial. Para aplicar esta técnica se requiere que las variables sean cuantitativas (véase la figura 2.2).

**Resumen y visualización de datos multivariados**

Figure 2.2: Resumen y visualización de datos multivariados

2.0.2 Propósito

Su objetivo general es lograr una reducción de datos que facilite la interpretación . En este sentido, el método se aplica para representar óptimamente en un espacio de dimensión pequeña, observaciones de un espacio general K-dimensional. Por esta razón, la técnica se considera como el primer paso para identificar posibles variables latentes o no observadas, que están generando la variabilidad de los datos. Siempre está basada en describir la estructura de la matriz de covarianza de un conjunto de variables mediante la utilización de combinaciones lineales de estas variables .

Con esta técnica se busca transformar las variables originales (en general, correladas), en nuevas variables incorreladas, facilitando la interpretación de los datos.

Aunque se requieren las \(N\) componentes principales para reproducir toda la variabilidad del sistema, en la práctica, la mayor parte de esta variabilidad suele explicarse mediante un número reducido \(J\) de componentes principales. En tales casos, las \(J\) primeras componentes principales sustituyen a las \(N\) variables originales, generando así una simplificación del sistema original.

2.0.3 Ejemplo: Pingüino

Este ejemplo (véase la figura 2.3) ilustra la reducción de la dimensionalidad de un conjunto de datos tridimensionales a dos dimensiones.

**Pingüino**

Figure 2.3: Pingüino

Inicialmente, aparte del estiramiento de los puntos, no se percibe una estructura clara en la distribución de los puntos. Sin embargo, al elegir una rotación adecuada, podemos revelar la estructura subyacente. Esta rotación puede ser concebida como una exploración del conjunto tridimensional, buscando el ángulo óptimo para visualizar los datos. El Análisis de Componentes Principales (ACP) puede ser útil para descubrir esta estructura subyacente. Selecciona una rotación de tal manera que la mayor parte de la variabilidad del conjunto de datos esté capturada en las primeras dimensiones de los datos rotados. Aunque pueda parecer poco útil en nuestro caso tridimensional, este enfoque se vuelve muy poderoso cuando los datos tienen muchas dimensiones (decenas de dimensiones).

2.0.4 Características

  1. PCA supone que las direcciones con las mayores varianzas son las más “importantes” (es decir, las más principales).

  2. En la figura 2.1, el eje PC1 es la primera dirección principal a lo largo de la cual las muestras muestran la mayor variación. El eje PC2 es la segunda dirección más importante y es ortogonal al eje PC1.

**Dispersión y PCA**

Figure 2.4: Dispersión y PCA

  1. La dimensionalidad de nuestros datos bidimensionales puede reducirse a una sola dimensión proyectando cada muestra sobre el primer componente principal (véase la figura 2.1b)

  2. Desde el punto de vista técnico, la medida de la cantidad de varianza retenida por cada componente principal se determina a través del valor propio correspondiente.

  3. Es importante resaltar que PCA resulta, especialmente, beneficioso cuando las variables en el conjunto de datos exhiben una alta correlación. Esta correlación indica la presencia de redundancias en los datos (véase la figura 2.5). Aprovechando esta redundancia, el PCA se emplea para reducir el número de variables originales a un conjunto menor de nuevas variables, es decir, los componentes principales. Estos componentes principales explican la mayor parte de la varianza de las variables originales.

**Tipos de redundancia**

Figure 2.5: Tipos de redundancia

2.0.5 Conclusión

En resumen, el objetivo principal del análisis de componentes principales es:

  • Identificar patrones ocultos en un conjunto de datos.

  • Reducir la dimensionalidad de los datos eliminando el ruido y la redundancia en los datos.

  • Identificar variables correlacionadas.

3 Pasos para realizar un PCA

Vamos a explicar el PCA paso a paso sin utilizar demasiada terminología matemática avanzada. En general, se puede visualizar en la figura 3.1.

**Pasos generales para aplicar un PCA**

Figure 3.1: Pasos generales para aplicar un PCA

3.0.1 Paso 1: Describir los Datos y objetivo

Suponga que, en un estudio realizado sobre \(n\) individuos, se tiene un vector \(X=(X_1, X_2, \ldots, X_K)^T\) de tamaño \(K\). El objetivo es encontrar nuevas variables notadas como \(Y_j\), \(j=1, \ldots, J\), que sean combinaciones lineales de las variables originales \(X_k\).

3.0.2 Paso 2: Definir las componentes Principales

Se procede de la siguiente manera:

Observación 2.1:

Se determina la primera componente principal \(Y_1\), la cual sintetiza la mayor cantidad de variabilidad total contenida en los datos:

\[Y_1 \;= \; \alpha_{11} X_1 \, +\, \alpha_{12} X_2 \,+\, \cdots \,+\, \alpha_{1K} X_K \; = \; \alpha_1^T X\]

donde \(\alpha_1 =(\alpha_{11}, \alpha_{12}, \ldots, \alpha_{1K})^T\) es escogido de tal forma que maximize la razón entre la varianza \(V(Y_1)\) de \(Y_1\) y la variación total y sujeta a la restricción que sea un vector ortonomal. Es decir, debe cumplir la condición:

\[\alpha_1^T\, \alpha_1 \; =\; \sum\limits_{k=1}^K \alpha_{1k}^2 \; = \; 1\]

Observación 2.2:

La segunda componente principal \(Y_2\) es una combinación lineal ponderada de las variables observadas: \[Y_2 \;= \; \alpha_{21} X_1 \, +\, \alpha_{22} X_2 \,+\, \cdots \,+\, \alpha_{2K} X_K \; = \; \alpha_2^T X\]

\(Y_2\) no está correlacionada con la primera componente principal \(Y_1\). Es decir, \(Cov(Y_1, Y_2)=0\). Además, reúne la máxima variabilidad restante de la variación contenida en la primera componente principal \(Y_1\).

Observación 2.3:

Del mismo modo se eligen \(Y_1\), \(Y_2\), \(\ldots\) , \(Y_j\), incorrelados entre sí, de manera que las variables aleatorias obtenidas vayan teniendo cada vez menor varianza.

Observación 2.4:

La \(j\)-ésima componente principal es:

\[Y_j \;= \; \alpha_{j1} X_1 \, +\, \alpha_{j2} X_2 \,+\, \cdots \,+\, \alpha_{jK} X_K \; = \; \alpha_j^T X\] la cual tiene la varianza más grande entre todas las siguientes. Aquí, \(\alpha_j =(\alpha_{j1}, \alpha_{j12}, \ldots, \alpha_{j1K})^T\) y es un vector con módulo 1 (o sea, ortonomal). Es decir, debe cumplir la condición:

\[\alpha_j^T\, \alpha_j \; =\; \sum\limits_{k=1}^K \alpha_{jk}^2 \; = \; 1\]

Observación 2.5:

Se cumple que \[V(Y_j) \;=\; V(\alpha_j^T \,X) \;=\; \alpha_j^T\, \Sigma \, \alpha_j, \quad \mbox{para cada}\quad j=1,2, \ldots, J\]

Observación 2.6:

En general, queremos elegir \(a_j\) de modo que se maximice la varianza de \(Y_j\) sujeta a la restricción de que \(\alpha_j^T\, \alpha_j \; = \; 1\)

Observación 2.7:

Las \(Y_j\) sintetizan en forma decreciente la varianza de un conjunto original de datos.

Observación 2.8:

El enfoque comúnmente utilizado para optimizar una función de múltiples variables bajo restricciones es conocido como el método de los multiplicadores de Lagrange.

3.0.3 Paso 3: Matriz de varianzas y covarianza o de correlaciones

Hay dos formas habituales de generar componentes principales.

Primera forma 3.1:

Calcular la matriz de correlación. Se recomienda utilizarla cuando:

  1. Cuando las variables originales se encuentran en unidades diferentes.

  2. En caso de que exista disparidad en las varianzas de las variables originales.

Segunda forma 3.2:

Calcular la matriz de varianza y covarianza \(\Sigma\) de las variables originales. Se recomienda utilizarla cuando:

  1. Deseamos considerar la información proporcionada por las diferencias entre las varianzas de las variables.

Observación 3.3:

Si las variables comparten las mismas unidades, ambas forma son factibles. Ante la incertidumbre, es recomendable llevar a cabo ambas evaluaciones y optar por aquella que arroje conclusiones más claras.

Observación 3.4:

En los pasos siguientes, consideraremos solo la segunda forma.

3.0.4 Paso 4: Vectores y valores propios

Calculamos los vectores y valores propios de \(\Sigma\). Es decir, si \(a_k\) es un vector propio de \(\Sigma\) y \(\lambda\) es su valor propio asociado, entonces, debe cumplirse que: \[ \Sigma \cdot a_k \; = \; \lambda \, \,I_k \, a_k \] Entonces,

\[V(Y_k) \;=\; V(\alpha_k^T \,X) \;=\; \alpha_k^T\, \Sigma \, \alpha_k \;=\; \alpha_k^T\, \lambda \,I_k \, \alpha_k \;=\; \, \lambda \,\alpha_k^T \, \alpha_k \;=\; \lambda \cdot 1 \;=\; \lambda\] Luego, para maximizar la varianza de \(Y_k\) se tiene que tomar el mayor autovalor, digamos \(\lambda_k\), y el correspondiente autovector \(a_k\).

Por consiguiente, las componentes aleatorias vienen dadas por

\[Y_k \;= \; v_k^T\, X, \quad \mbox{para cada}\quad k=1, \ldots, K\]

3.0.5 Paso 5: Interpretación de los vectores y valores propios

Observación 5.1:

Los valores propios \(\lambda_1\), \(\lambda_2\), \(\ldots\), \(\lambda_k\) representan la variabilidad en cada dirección.

Observación 5.2:

Los valores propios correspondientes a los vectores propios \(a_1\), \(a_2\), \(\ldots\), \(a_k\) son las varianzas de las componentes principales \(Y_1\), \(Y_2\), \(\ldots\), \(Y_k\), respectivamente. Es decir, se cumple que

\[V(Y_k) = \lambda_k, \quad \mbox{para cada}\quad k=1,2, \ldots, K\] Observación 5.3:

Ordenamos de mayor a menor los vectores propios según sus valores propios. Las primeras componentes principales capturan la mayor parte de la variabilidad de los datos. En este sentido, se cumple que

\[\lambda_1 \; \geq \; \lambda_2\; \geq \; \cdots \; \geq\; \lambda_k\]

3.0.6 Paso 6: Proyección de datos

Proyectamos los datos originales en las nuevas direcciones definidas por las componentes principales:

\[ \text{Nuevo dato}_{ik} = a_i^T \cdot \mathbf{X}_k\]

3.0.7 Paso 7: Visualización

Finalmente, visualizamos los datos en las nuevas dimensiones para describir mejor su estructura.

4 Propiedades según la matriz de varianzas y covarianzas

4.0.1 Propiedades básicas

Propiedad 1:

La influencia de la variable \(X_k\) en la \(k\)-ésima componente principal se determina mediante la magnitud del coeficiente \(a_{jk}\).

Propiedad 2:

La covarianza entre la variable \(X_k\) y la componente principal \(Y_j\) es:

\[Cov(X_k, Y_j)\; =\; a_{jk} \, \lambda_j \]

Propiedad 3:

La varianza muestral de las observaciones con respecto a la \(k\)-ésima componente principal es

\[V(Y_k)\; =\; \alpha_k^T\, \Sigma \, \alpha_k \;=\; \lambda\]

Propiedad 4:

Para todo \(k\ne {\tilde k}\), las componentes \(Y_k\) y \(Y_{\tilde k}\) deben estar incorreladas. Es decir, \[Cov(Y_k, Y_{\tilde k}) = 0\]

Propiedad 5:

Para todo \(k\ne {\tilde k}\), los vectores propios \(a_k\) y \(a_{\tilde k}\) son ortogonales. Es decir, \[a_k^T \, a_{\tilde k} = 0\]

Esta propiedad es consecuencia de la propiedad 4 porque:

\[0 \; = \; Cov(Y_k, Y_{\tilde k}) \; = \; Cov\left(a_k^T\,x \; ,\; a_{\tilde k}^T\,x \right) \; = \;a_k^T\cdot E[(x-\mu)(x-\mu)^T] \cdot a_{\tilde k} \; = \; a_k^T\cdot \Sigma \cdot a_{\tilde k} \; = \;\alpha_k^T\, \lambda \, \alpha_{\tilde k} \;=\; \, \lambda \,\alpha_k^T \, \alpha_{\tilde k} \]

Propiedad 6:

Todos los componentes \(Y\) (en total \(K\)) se pueden expresar como el producto de una matriz formada por los autovectores, multiplicada por el vector \(x\) que contiene las variables originales \(X_1\), \(\ldots\) , \(X_K\):

\[Y \;=\; AX \] donde

\[y\;=\; \begin{pmatrix} y_1\\ \vdots\\ y_K\\ \end{pmatrix}, \qquad A\;=\;\begin{pmatrix} a_{11} & a_{12}& \cdots &a_{1K} \\ a_{21} & a_{22}& \cdots &a_{2K} \\ \vdots & \vdots & \ddots &\vdots \\ a_{K1} & a_{K2}& \cdots &a_{KK} \end{pmatrix}, \qquad x\;=\;\begin{pmatrix} x_1\\ \vdots\\ x_K\\ \end{pmatrix} \]

Teniendo en cuenta la propiedad 3, la matriz de covarianzas de \(Y\) será:

\[\Lambda\;=\;\begin{pmatrix} \lambda_1 & 0& \cdots &0 \\ 0 & \lambda_2& \cdots &0 \\ \vdots & \vdots & \ddots &\vdots \\ 0 & 0& \cdots &\lambda_3 \end{pmatrix}\]

porque las \(Y_k\) se han comnstruido de tal manera que sean incorreladas.

Propiedad 6:

Se cumple que: \[\Lambda \;=\; V(Y) \;=\; A^T\, V(X) \,A\;=\; A^T \,\Sigma \,A \]

Propiedad 7:

\(A\) es una matriz ortogonal (porque \(a_k^T \, a_k = 1\) para todas sus columnas). Por esta razón, \[A A^T \;= \; I_K\] Aquí, \(I_K\) es la matriz idéntica de tamaño \(K\) (tiene 1s en la diagonal principal y 0s en las otras celdas):

\[I_K \;=\; \begin{pmatrix} 1 & 0& \cdots &0 \\ 0 & 1& \cdots &0 \\ \vdots & \vdots & \ddots &\vdots \\ 0 & 0& \cdots &1 \end{pmatrix}\]

Propiedad 8:

Teniendo en cuenta las propiedades 6 y 7:

\[\Sigma \;=\; A^T \,\Lambda \,A\]

4.0.2 Porcentajes de variabilidad

Propiedad 9:

La varianza total de los componentes es la suma de todos los autovalores, es decir, la traza de la matriz \(\Lambda\) (ya que es diagonal):

\[\mbox{Varianza total}\;=\; \sum\limits_{k=1}^K V(Y_k) \; = \; \sum\limits_{k=1}^K \lambda_k \; = \; \mbox{traza}\,(\Lambda)\]

Propiedad 10:

Teniendo en cuenta las propiedades 6 (\(\Lambda = A^T \,\Sigma \,A\)) y 7 (\(A A^T \;= \; I_K\)) y por propiedades del operador traza:

\[\mbox{traza}\,(\Lambda) \;=\; \mbox{traza}\,\left(A^T \,\Sigma \,A\right) \; =\; \mbox{traza}\,\left(\Sigma \,A^T \,A\right) \; =\; \mbox{traza}\,(\Sigma)\]

Propiedad 11:

La suma de las varianzas de las variables originales y la suma de las varianzas de las componentes son iguales (ver propiedades 9 y 10):

\[\mbox{Varianza total}\;=\; \mbox{traza}\,(\Lambda) \; =\; \mbox{traza}\,(\Sigma)\; =\; \sum\limits_{k=1}^K Var(X_k)\]

Propiedad 12:

La proporción de varianza total que recoge el componente principal \(Y_k\) es:

\[ \mbox{Prop.}\; V(Y_k) \;=\; \frac{\lambda_k}{\mbox{Varianza total}}\]

Si multiplicamos por 100 tendremos el porcentaje correspondiente.

Propiedad 13:

El porcentaje de variabilidad recogido por los primeros \(J\) componentes:

\[ \mbox{Prop.}\; V(Y_{1\to J}) \;=\; \frac{\sum\limits_{j=1}^J \lambda_k}{\mbox{Varianza total}} \] donde \(J<K\). Si multiplicamos por 100 tendremos el porcentaje correspondiente.

En la aplicación práctica, cuando inicialmente tenemos \(K\) variables, generalmente seleccionamos un número considerablemente menor de componentes principales que capturan una gran proporción de la variabilidad total. Por lo general, se prefiere no elegir más de tres componentes principales, si es posible, para poder representarlos de manera efectiva en gráficos subsiguientes.

5 Propiedades según la matriz de correlaciones

Normalmente, se computan los componentes utilizando variables que han sido estandarizadas, lo que significa que tienen una media de 0 y una varianza de 1. Esta práctica implica calcular los componentes principales no a partir de la matriz de covarianzas \(\Sigma\), sino de la matriz de correlaciones \(R\). En el caso de las variables estandarizadas, las covarianzas y las correlaciones coinciden.

Por lo tanto, los componentes resultantes son autovectores de la matriz de correlaciones, los cuales difieren de los obtenidos a partir de la matriz de covarianzas. Al seguir este enfoque, todas las variables originales son tratadas con igual importancia.

En la matriz de correlaciones, todos los elementos diagonales tienen un valor de 1. El procedimiento es igual al que se hace a partir de la matriz de varianzas y covarianzas , sólo que se sustituye \(\Sigma\) por \(R\). Existen algunas diferencias en la interpretación. Las más importantes se enumeran enlas propiedades siguientes.

Propiedad 14:

Si las variables originales han sido tipificadas, esto implica que su matriz de covarianzas es igual a la matriz de correlaciones. En consecuencia, la variabilidad total (la traza) es igual al número total de variables en la muestra:

\[\mbox{Varianza total}\;=\; \sum\limits_{k=1}^K Var(X_k)\; =\; \sum\limits_{k=1}^K 1 \;= \; K\]

Propiedad 15:

La suma de todos los autovalores es \(K\):

\[ \sum\limits_{k=1}^K \lambda_k \; = \; K\]

Propiedad 16:

La proporción de varianza explicada por el \(k\)-ésimo autovector (componente) es:

\[ \mbox{Prop.}\; V(Y_k) \;=\; \frac{\lambda_k}{\mbox{Varianza total}} = \frac{\lambda_k}{K}\]

Propiedad 17:

El porcentaje de variabilidad recogido por los primeros \(J\) componentes:

\[ \mbox{Prop.}\; V(Y_{1\to J}) \;=\; \frac{\sum\limits_{j=1}^J \lambda_k}{\mbox{Varianza total}} \;= \; \frac{\sum\limits_{j=1}^J \lambda_k}{K}\]

Propiedad 18:

La correlación entre \(X_k\) y la componente principal \(Y_j\) es:

\[Corr(X_k, Y_j) \;= \; \frac{a_{jk}\, \sqrt{\lambda_j}}{\sqrt{s_{kk}}}\] la cual suministra la ponderación (o grado de importancia) de la \(k\)-ésima variable sobre la \(j\)-ésima componente principal. O, dicho de otra forma, indica el grado de asociación entre la variable y la respectiva componente.

Propiedad 19:

Cuando se presentan los autovectores, se les suele multiplicar previamente por \(\sqrt{\lambda_j}\) (del autovalor correspondiente), para reescalar todos los componentes del mismo modo. De esta manera, se calcula la ponderación de la variable \(k\), en la \(j\)-ésima componente como:

\[a_{jk}^*\;= \; a_{jk}\, \sqrt{\lambda_j}\]

6 Selección del número de componentes principales

La elección del número de componentes principales se basa en criterios empíricos que consideran la variabilidad que se desea mantener en una situación particular. Desafortunadamente, no existe una forma objetiva y bien aceptada de decidir cuántos componentes principales son suficientes. A continuación, describiremos algunos métodos generales.

6.0.1 Primera forma: Con el porcentaje de varianza explicada

Se escogen \(J<K\) cuando el porcentaje de variabilidad recogido por los primeros \(J\) componentes \(\mbox{Prop.}\; V(Y_{1\to J})\) es “grande”, de tal forma que la proporción de varianza explicada \(\mbox{Prop.}\; V(Y_j)\) todos los \(j<J\)-ésimos autovectores (componente) también lo sean (es decir, seleccionar el número de componentes mínimo a partir del cual el incremento deja de ser sustancial). De esta forma, se pueden reemplazar \(X_1\), \(X_2\), \(\ldots\), \(X_K\) por \(Y_1\), \(\ldots\), \(Y_J\) sin pérdida de información.

6.0.2 Segunda forma: Valores propios

Cuando utilizamos la matriz de correlaciones,los valores propios pueden utilizarse para determinar el número de componentes principales que deben conservarse después del PCA:

  • Un valor propio > 1 indica que las PC explican más varianza que la explicada por una de las variables originales en los datos estandarizados. Se suele utilizar como punto de corte para retener los CP. Esto sólo es cierto cuando los datos están estandarizados.

  • También puede limitar el número de componentes al número que represente una determinada fracción de la varianza total. Por ejemplo, si está satisfecho con el 70% de la varianza total explicada, entonces utilice el número de componentes para conseguirlo.

6.0.3 Tercera forma: Métodos gráficos

Un método alternativo para determinar el número de componentes principales es observar un Scree Plot. Es un gráfico que se representa en un sistema de coordenadas cartesianas. Las coordenadas de los puntos corresponden a las componentes principales (eje X) y los valores propios (eje Y), ordenados de mayor a menor (como se muestra en la figura 6.1). El número de componentes se determina en el punto a partir del cual los valores propios restantes son todos relativamente pequeños y de tamaño comparable.

**Scree**

Figure 6.1: Scree

7 Interpretación de las componentes principales

  1. Cuando todas las variables presentan una fuerte correlación positiva, el primer componente principal presenta todas sus coordenadas con mismo signo. Este hecho representa un promedio ponderado de todas las variables. Esta componente se interpreta como un factor global de tamaño.

  2. Por otro lado, las componentes restantes se consideran factores de forma y generalmente muestran coordenadas positivas y negativas, indicando que contrastan unos grupos de variables con otros. Estos factores de forma a menudo pueden expresarse como medias ponderadas de dos conjuntos de variables con signos opuestos, lo que contrapone las variables de un grupo con las del otro.

8 Ejemplo 1: Normal tridimensional

En este ejemplo tenermos una distribución normal con los siguientes parámetros:

\[\mu = \begin{bmatrix} 0 \\5 \\ 2 \end{bmatrix}, \qquad \Sigma = \begin{bmatrix} 25 & -1 & 7 \\-1 & 4 & -4 \\ 7 & -4 & 10\end{bmatrix}\]

Bajo estas condiciones, el digrama de dispersión correspondiente es como se muestra en la figura 8.1, se muestra la transformación correspondiente.

**Distribución normal tridimensional**

Figure 8.1: Distribución normal tridimensional

En la figura 8.2, se muestran los tres pares de proyecciones de componentes principales.

**Proyecciones de una distribución normal tridimensional**

Figure 8.2: Proyecciones de una distribución normal tridimensional

Obsérvese que:

  1. La primera proyección tiene la mayor varianza, seguida de la segunda proyección.

  2. Las proyecciones PCA hacen que los ejes no estén correlacionados.

9 Ejemplo 2: Datos survey

9.0.1 Enunciado

Los datos se recogieron aplicando una encuesta a una muestra de estudiantes universitarios. Es un data frame con 800 observaciones y 66 variables. Con estos datos llevaremos a cabo un PCA.

datosCompleto <- lsm::survey
#datosCompleto <- textshape::column_to_rownames(dat, loc=1)
#datosCompleto %>% remove_rownames %>% column_to_rownames(var="names")   #library(tidyverse)
attach(datosCompleto)
names(datosCompleto)
##  [1] "Observation"  "ID"           "Gender"       "Like"         "Age"         
##  [6] "Smoke"        "Height"       "Weight"       "BMI"          "School"      
## [11] "SES"          "Enrollment"   "Score"        "MotherHeight" "MotherAge"   
## [16] "MotherCHD"    "FatherHeight" "FatherAge"    "FatherCHD"    "Status"      
## [21] "SemAcum"      "Exam1"        "Exam2"        "Exam3"        "Exam4"       
## [26] "ExamAcum"     "Definitive"   "Expense"      "Income"       "Gas"         
## [31] "Course"       "Law"          "Economic"     "Race"         "Region"      
## [36] "EMO1"         "EMO2"         "EMO3"         "EMO4"         "EMO5"        
## [41] "GOAL1"        "GOAL2"        "GOAL3"        "Pre_STAT1"    "Pre_STAT2"   
## [46] "Pre_STAT3"    "Pre_STAT4"    "Post_STAT1"   "Post_STAT2"   "Post_STAT3"  
## [51] "Post_STAT4"   "Pre_IDARE1"   "Pre_IDARE2"   "Pre_IDARE3"   "Pre_IDARE4"  
## [56] "Pre_IDARE5"   "Post_IDARE1"  "Post_IDARE2"  "Post_IDARE3"  "Post_IDARE4" 
## [61] "Post_IDARE5"  "PSICO1"       "PSICO2"       "PSICO3"       "PSICO4"      
## [66] "PSICO5"

Se resalta que sólo algunos de estos individuos y variables se utilizarán para realizar el análisis de componentes principales.

dat <- datosCompleto[1:23, 21:30]
attach(dat)
head(dat,4) 
SemAcum Exam1 Exam2 Exam3 Exam4 ExamAcum Definitive Expense Income Gas
4.25 1.5 5.0 5.0 4.5 16.0 4.000 48.9 1.61 27.45
2.80 2.3 4.9 3.7 3.3 14.2 3.550 72.1 2.07 24.17
4.15 3.4 3.6 2.0 1.9 10.9 2.725 85.2 2.84 22.27
3.20 2.5 4.2 5.0 2.5 14.2 3.550 56.6 1.55 23.08

9.0.2 Solución.

La solución se puede revisar haciendo click aquí.

10 Tópicos sumplementarios

No hacer click aquí: Pendiente

11 Ejercicios

Pendiente

Bibliografía

Consultar el documento RPubs :: Análisis multivariado (bibliografía).

 

 
If you found any ERRORS or have SUGGESTIONS, please report them to my email. Thanks.  
LS0tDQp0aXRsZTogIkFOw4FMSVNJUyBERSBDT01QT05FTlRFUyBQUklOQ0lQQUxFUyINCnN1YnRpdGxlOiA8aDE+KipUZW9yw61hKio8L2gxPg0KDQphdXRob3I6IA0KICAtIG5hbWUgICAgICAgICAgOiAiRHIuIHJlci4gbmF0LiBIdW1iZXJ0byBMTGluw6FzIFNvbGFubyINCiAgICBhZmZpbGlhdGlvbiAgIDogIkRlcGFydGFtZW50byBkZSBNYXRlbcOhdGljYXMgeSBFc3RhZMOtc3RpY2EsIFVuaXZlcnNpZGFkIGRlbCBOb3J0ZSAoQmFycmFucXVpbGxhLCBDb2xvbWJpYSkiDQogICAgICNjb3JyZXNwb25kaW5nIDogeWVzICAgICMgRGVmaW5lIG9ubHkgb25lIGNvcnJlc3BvbmRpbmcgYXV0aG9yDQogICAgICNhZGRyZXNzICAgICAgIDogIkRlcGFydGFtZW50byBkZSBNYXRlbcOhdGljYXMgeSBFc3RhZMOtc3RpY2EiDQogICAgZW1haWwgICAgICAgICA6IHwNCiAgICAgIGhsbGluYXNAdW5pbm9ydGUuZWR1LmNvDQogICAgICANCiAgICAgIFtCaW9ncmFwaGljYWwgc2tldGNoXShodHRwczovL3JwdWJzLmNvbS9obGxpbmFzL0Jpb19Ta2V0Y2gpDQogICAgICANCiAgICAgIGByIGZvcm1hdChTeXMudGltZSgpLCAiJWQvJW0vJXkiKWAgDQogICAgICANCiAgICAgI3JvbGU6ICAgICAgICAgIyBDb250cmlidXRvcnNoaXAgcm9sZXMgKGUuZy4sIENSZWRpVCwgaHR0cHM6Ly9jYXNyYWkub3JnL2NyZWRpdC8pDQogICMgICAgLSBDb25jZXB0dWFsaXphdGlvbg0KICAjICAgIC0gV3JpdGluZyAtIE9yaWdpbmFsIERyYWZ0IFByZXBhcmF0aW9uDQogICMgICAgLSBXcml0aW5nIC0gUmV2aWV3ICYgRWRpdGluZw0KICMgLSBuYW1lICAgICAgICAgIDogIkF1dG9yIG51bWVybyAyIg0KICMgICBhZmZpbGlhdGlvbiAgIDogIjEsMiINCiAjICAgcm9sZToNCiAjICAgICAtIFdyaXRpbmcgLSBSZXZpZXcgJiBFZGl0aW5nDQogICAgICNhZmZpbGlhdGlvbjoNCiAgIy0gaWQgICAgICAgICAgICA6ICIxIg0KICAjICBpbnN0aXR1dGlvbiAgIDogIlVuaXZlcnNpZGFkIGRlbCBOb3J0ZSAoQmFycmFucXVpbGxhLCBDb2xvbWJpYSkiDQogICMhW10oaGxsaW5hcy5qcGcpe3dpZHRoPTFpbn0gDQogIA0KI2RhdGU6ICdgciBmb3JtYXQoU3lzLnRpbWUoKSwgIiVkLyVtLyV5IilgJyAgIyB2ZXIgaHR0cHM6Ly9ib29rZG93bi5vcmcveWlodWkvcm1hcmtkb3duLWNvb2tib29rL3VwZGF0ZS1kYXRlLmh0bWwNCm91dHB1dDogDQogICAgYm9va2Rvd246Omh0bWxfZG9jdW1lbnQyOiANCiAgICAgICAgICAjT0pPIFNhbGVuIGNhcGl0dWxvcywgc2VjY2lvbmVzIHkgVGVvcmVtYXMNCiAgICAjYm9va2Rvd246Omh0bWxfYm9vazoNCiAgICAgICAgICAjT0pPIEVSUk9SIFNhbGVuIHRlb3JlbWFzLCBwZXJvIG5vIHNhbGVuIGxvcyBjYXBpdHVsb3MgDQogICAgI2h0bWxfZG9jdW1lbnQ6DQogICAgICAgICAgdG9jOiB0cnVlICAgICAgIyB0YWJsZSBvZiBjb250ZW50IHRydWUNCiAgICAgICAgICB0b2NfZGVwdGg6IDQgICAjIHVwdG8gdGhyZWUgZGVwdGhzIG9mIGhlYWRpbmdzIChzcGVjaWZpZWQgYnkgIywgIyMgYW5kICMjIykNCiAgICAgICAgICB0b2NfZmxvYXQ6IHRydWUgI0NvbiB0cnVlLCB0b2Mgc2FsZSBhbCBtYXJnZW4gaXpxdWllcmRvIGRlIGxhIHDDoWdpbmE7IGRlIGxvIGNvbnRyYXJpbywgYXJyaWJhDQogICAgICAgICAgY29sbGFwc2VkOiBmYWxzZQ0KICAgICAgICAgIHNtb290aF9zY3JvbGw6IGZhbHNlDQogICAgICAgICAgbnVtYmVyX3NlY3Rpb25zOiB0cnVlICAgIyBpZiB5b3Ugd2FudCBudW1iZXIgc2VjdGlvbnMgYXQgZWFjaCB0YWJsZSBoZWFkZXINCiAgICAgICAgICAjdGhlbWU6IHNhbmRzdG9uZQ0KICAgICAgICAgICN0aGVtZTogdW5pdGVkICAjIG1hbnkgb3B0aW9ucyBmb3IgdGhlbWUsIHRoaXMgb25lIGlzIG15IGZhdm9yaXRlLg0KICAgICAgICAgICN0aGVtZTogZmxhdGx5ICAjIA0KICAgICAgICAgICN0aGVtZTogY2VydWxlYW4gICMgDQogICAgICAgICAgI2hpZ2hsaWdodDogdGFuZ28gICMgc3BlY2lmaWVzIHRoZSBzeW50YXggaGlnaGxpZ2h0aW5nIHN0eWxlDQogICAgICAgICAgI2NzczogU2NyaXB0cyBhY2Nlc29yaW9zL2VzdGlsb2JvdG9uLmNzcw0KICAgICAgICAgICNjc3M6IG15LmNzcyAgICMgeW91IGNhbiBhZGQgeW91ciBjdXN0b20gY3NzLCBzaG91bGQgYmUgaW4gc2FtZSBmb2xkZXINCiAgICAgICAgICBjb2RlX2Rvd25sb2FkOiB0cnVlDQogICAgICAgICAgI2hpZ2hsaWdodDogdGFuZ28gICMgY2FtYmlhciBjb2xvciBkZSBsaWJyYXJ5IGVuIGF6dWwNCiAgICAjIGJvb2tkb3duOjpnaXRib29rOg0KICAgICMgICAgICBpbmNsdWRlczoNCiAgICAjICAgICAgICBpbl9oZWFkZXI6IGhlYWRlci5odG1sDQogICAgIyBib29rZG93bjo6cGRmX2Jvb2s6DQogICAgIyAgICAgICBrZWVwX3RleDogeWVzDQogICAgIyBib29rZG93bjo6aHRtbF9ib29rOg0KICAgICMgICAgICAgY3NzOiB0b2MuY3NzDQogICAgIyBib29rZG93bjo6aHRtbF9ib29rOg0KICAgICMgICAgICAgICBpbmNsdWRlczoNCiAgICAjICAgICAgICAgICBpbl9oZWFkZXI6IHN0eWxlLmNzcw0KICAgICNib29rZG93bjo6aHRtbF9kb2N1bWVudDI6IGRlZmF1bHQNCiAgICAjIGJvb2tkb3duOjpwZGZfZG9jdW1lbnQyOg0KICAgICMgICAgICBrZWVwX3RleDogdHJ1ZQ0KICAgICNiaWJsaW9ncmFwaHk6IHJlZmVyZW5jZXMuYmliDQogICAgbWF0aGpheDogImh0dHA6Ly9leGFtcGxlLmNvbS9tYXRoamF4L01hdGhKYXguanM/Y29uZmlnPVRlWC1BTVMtTU1MX0hUTUxvck1NTCINCmhlYWRlci1pbmNsdWRlczoNCiAgICBcdXNlcGFja2FnZVt4MTFuYW1lc117eGNvbG9yfSANCiAgICANCmNzbDogc2NpZW5jZS5jc2wNCiNPam86IFNlIHV0aWxpemEgbGVuZ3VhamUgWUFNTA0KDQphYnN0cmFjdDogfA0KICoqRW4gW1JwdWJzOjogdG9jXShodHRwczovL3JwdWJzLmNvbS9obGxpbmFzL3RvYykgc2UgcHVlZGVuIHZlciBvdHJvcyBkb2N1bWVudG9zIGRlIHBvc2libGUgaW50ZXLDqXMuKioNCiAgDQotLS0NCg0KYGBge3Igc2V0dXAsIGluY2x1ZGU9RkFMU0V9DQprbml0cjo6b3B0c19jaHVuayRzZXQoZWNobyA9IFRSVUUsIGZpZy5hbGlnbj0iY2VudGVyIiwgIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UjLA0KICAgICAgICAgICAgICAgICAgICAgICNzdHlsZSA9ICJjb2xvcjpkYXJrYmx1ZSINCiAgICAgICAgICAgICAgICAgICAgIyBjbGFzcy5zb3VyY2U9ImJnLWRhbmdlciIsIGNsYXNzLm91dHB1dD0iYmctd2FybmluZyIgICAjQ29sb3JlcyBkZW50cm8gZGVsIGNodW5rDQogICAgICAgICAgICAgICAgICAgICApDQpsaWJyYXJ5KHJnbCkNCmtuaXRyOjprbml0X2hvb2tzJHNldCh3ZWJnbCA9IGhvb2tfd2ViZ2wpDQpgYGANCg0KDQoNCg0KYGBge3IsIGVjaG89RkFMU0UsIGV2YWw9RkFMU0V9DQpodHRwczovL2Jvb2tkb3duLm9yZy95aWh1aS9ybWFya2Rvd24vbGFuZ3VhZ2UtZW5naW5lcy5odG1sDQoNCmh0dHBzOi8vYm9va2Rvd24ub3JnL3lpaHVpL2Jvb2tkb3duL21hcmtkb3duLXN5bnRheC5odG1sDQoNCmh0dHBzOi8vYm9va2Rvd24ub3JnL3lpaHVpL2Jvb2tkb3duL2Etc2luZ2xlLWRvY3VtZW50Lmh0bWwNCg0KaHR0cHM6Ly9ib29rZG93bi5vcmcveWlodWkvYm9va2Rvd24vbWFya2Rvd24tZXh0ZW5zaW9ucy1ieS1ib29rZG93bi5odG1sDQoNCmh0dHBzOi8vYm9va2Rvd24ub3JnL3lpaHVpL3JtYXJrZG93bi9ib29rZG93bi1tYXJrZG93bi5odG1sICAjIFRlb3JlbXMgYW5kIHByb29mcw0KDQpodHRwczovL2Jvb2tkb3duLm9yZy95aWh1aS9ib29rZG93bi9tYXJrZG93bi1leHRlbnNpb25zLWJ5LWJvb2tkb3duLmh0bWwjdGhlb3JlbXMNCg0KaHR0cHM6Ly9ib29rZG93bi5vcmcveWlodWkvYm9va2Rvd24vaHRtbC5odG1sDQoNCmh0dHBzOi8vd3d3LmRhdGEtdG8tdml6LmNvbS8NCiAgDQpbUnB1YnNdKGxpbmspDQogIA0KKFwjZXE6ZWMtKSwgIEVjdWFjaW9uIFxAcmVmKGVxOmVjLSksIEZpZ3VyYSBcQHJlZihmaWc6RmlnLSksIFRhYmxlIFxAcmVmKHRhYjptdGNhcnMpLCBUaGVvcmVtIFxAcmVmKHRobTpib3JpbmcpDQoNCg0KIyBUaXR1bG8geyNUaXR1bG9TZWNjaW9ufSAgIFxAcmVmKFRpdHVsb1NlY2Npb24pDQogIA0KIyBGb3IgSFRNTCwgd2UgY2FuIHNldCBjb2xvciB3aXRoIENTUywgZS5nLiwgPHNwYW4gc3R5bGU9ImNvbG9yOiByZWQ7Ij50ZXh0PC9zcGFuPg0KICANCiMgaHR0cHM6Ly9yYWRpYW50LXJzdGF0cy5naXRodWIuaW8vZG9jcy9tb2RlbC9sb2dpc3RpYy5odG1sIFNoaW5ueSBMb2dpdCAgDQogIA0KYGBgDQoNCg0KYGBge3IsIGV2YWw9RkFMU0UsIGVjaG89RkFMU0V9DQojTGEgZm90byB0YW1hw7FvIGPDqWR1bGENCg0KaHRtbHRvb2xzOjppbWcoc3JjID0ga25pdHI6OmltYWdlX3VyaShmaWxlLnBhdGgoUi5ob21lKCJkb2MiKSwgImh0bWwiLCAibG9nby5qcGciKSksIA0KICAgICAgICAgICAgICAgYWx0ID0gJ2hsbGluYXMnLCANCiAgICAgICAgICAgICAgIHN0eWxlID0gJ3Bvc2l0aW9uOmFic29sdXRlOyB0b3A6MDsgcmlnaHQ6MDsgcGFkZGluZzoxMHB4OycgIywNCiAgICAgICAgICAgICAgIHdpZHRoID0gIjIwMHB4IikgICMgQXF1w60gZXNwZWNpZmljYXMgZWwgYW5jaG8gZGVzZWFkbyBlbiBww614ZWxlcyBvIHBvcmNlbnRhamUNCmBgYA0KDQoNCg0KDQpgYGB7ciwgZWNobz1GQUxTRSwgfQ0KIyBMYSBmb3RvIGdyYW5kZQ0KDQpodG1sdG9vbHM6OmltZyhzcmMgPSBrbml0cjo6aW1hZ2VfdXJpKCJobGxpbmFzMjAyMy5qcGciKSwgDQogICAgICAgICAgICAgICBhbHQgPSAnaGxsaW5hczIwMjMnLCANCiAgICAgICAgICAgICAgIHN0eWxlID0gJ3Bvc2l0aW9uOmFic29sdXRlOyB0b3A6MDsgcmlnaHQ6MDsgcGFkZGluZzoxcHg7JywNCiAgICAgICAgICAgICAgIHdpZHRoPSIxNSUiKQ0KYGBgDQoNCg0KDQo8IS0tICUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlIC0tPg0KPCEtLSBTZXBhcmFkb3IgIC0tPg0KDQpgYGB7Y3NzLCBlY2hvPUZBTFNFfQ0KLmNvbHVtbnMge2Rpc3BsYXk6IGZsZXg7fQ0KaDEge2NvbG9yOiBkYXJrYmx1ZTt9DQpoMyB7Y29sb3I6IGRhcmtncmVlbjt9DQpoNCB7Y29sb3I6IGdyZWVuO30NCmBgYA0KDQoNCg0KPCEtLSAlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSAtLT4NCjwhLS0gQ2Fww610dWxvICAtLT4NCg0KDQpgYGB7Y3NzLCBlY2hvPUZBTFNFLCBldmFsPUZBTFNFfQ0KI2h0dHBzOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzQxMDMwNDc3L2NoYW5naW5nLWNodW5rLWJhY2tncm91bmQtY29sb3ItaW4tcm1hcmtkb3duDQoNCi5iYWRDb2RlIHsNCmJhY2tncm91bmQtY29sb3I6IHJlZDsNCn0NCmBgYA0KDQoNCg0KDQo8IS0tICUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlIC0tPg0KPCEtLSBTZXBhcmFkb3IgIC0tPg0KDQojIExpYnJlcsOtYXMNCg0KIyMjIFBhcmEgUENBDQoNCg0KYGBge3IsIGV2YWw9RkFMU0UsIGVjaG89RkFMU0V9DQojICBodHRwczovL3JwdWJzLmNvbS9BbGVtYS8xMDAwNTgyDQoNCiMgaHR0cHM6Ly93d3cuZ2Vla3Nmb3JnZWVrcy5vcmcvY29udGV4dHVhbC1vdXRsaWVycy8NCmBgYA0KDQpFbCBzb2Z0d2FyZSBSIGRpc3BvbmUgZGUgdmFyaWFzIGZ1bmNpb25lcyBkZSBkaWZlcmVudGVzIHBhcXVldGVzIHBhcmEgY2FsY3VsYXIgUENBOg0KDQogICAtIGBwcmNvbXBgIHkgYHByaW5jb21wYCwgZGVsIHBhcXVldGUgYHN0YXRzYC4NCiAgICAgICAgDQogICAtIGBQQ0FgIGRlbCBwYXF1ZXRlIGBGYWN0b01pbmVSYC4NCiAgICANCiAgIC0gYGR1ZGkucGNhYCBkZWwgcGFxdWV0ZSBgYWRlNGAuDQogICAgDQogICAtIGBlcFBDQWAgZGVsIHBhcXVldGUgYEV4UG9zaXRpb25gLg0KICAgICAgICANCg0KU2luIGltcG9ydGFyIGxhIGZ1bmNpw7NuIHF1ZSBlbGlqYSBlbXBsZWFyLCBlcyBwb3NpYmxlIGV4dHJhZXIgeSByZXByZXNlbnRhciBkZSBtYW5lcmEgc2VuY2lsbGEgbG9zIHJlc3VsdGFkb3MgZGVsIFBDQSBtZWRpYW50ZSBsYXMgZnVuY2lvbmVzIGRlbCBwYXF1ZXRlIGBmYWN0b2V4dHJhYC4gRW4gZXN0ZSBkb2N1bWVudG8sIHNlIGhhcsOhIHVzbyBkZSBsb3MgcGFxdWV0ZXMgYEZhY3RvTWluZVJgIHkgYGFkZTRgICBwYXJhIGxvcyBhbsOhbGlzaXMgeSBgZmFjdG9leHRyYWAgcGFyYSBsYSB2aXN1YWxpemFjacOzbiBiYXNhZGEgZW4gYGdncGxvdDJgLg0KDQoNCmBgYHtyIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQpsaWJyYXJ5KEZhY3RvTWluZVIpDQpsaWJyYXJ5KGZhY3RvZXh0cmEpDQpsaWJyYXJ5KGFkZTQpDQpgYGANCg0KPCEtLSAlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSAtLT4NCjwhLS0gU2VwYXJhZG9yICAtLT4NCg0KIyMjIFBhcmEgb3Ryb3MgYW7DoWxpc2lzDQoNCmBgYHtyLCAgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSwgZWNobz1GQUxTRX0NCmxpYnJhcnkoYXBsb3JlMykgICAgICAgI0Jhc2UgZGUgZGF0b3MgcGFyYSBsb3MgZWplbXBsb3MNCmxpYnJhcnkobHNtKSAgICAgICAgICAgI0Jhc2UgZGUgZGF0b3MgcGFyYSBlamVtcGxvcyB5IGVzdGltYWNpb25lcyBkZWwgTG9nLXZlcm9zaW1pbGl0dWQNCmxpYnJhcnkoa25pdHIpICAgICAgICAgI0VkaXRhciB0YWJsYXMgY29uIGthYmxlKCkNCmxpYnJhcnkoa2FibGVFeHRyYSkgICAgI0VkaXRhciB0YWJsYXMgbcOhcyBlc3RpbGl6YWRhcw0KbGlicmFyeSh0aWR5dmVyc2UpICAgICAjSW5jbHV5ZSBhIGRwbHlyIHkgZ2dwbG90Mg0KbGlicmFyeShzdHJpbmdyKSAgICAgICAjUmVlbXBsYXphciBjYXJhY3RlcmVzIGVuIHVuIGRhdGEgZnJhbWUNCmxpYnJhcnkob3V0bGllcnMpICAgICAgI291dGxpZXJzOjpncnViYnMudGVzdA0KbGlicmFyeShFbnZTdGF0cykgICAgICAjRW52U3RhdHM6OnJvc25lclRlc3QNCmxpYnJhcnkoRE13UjIpICAgICAgICAgI0xPRiAoTG9jYWwgT3V0bGllciBGYWN0b3IpDQpsaWJyYXJ5KHJnbCkgICAgICAgICAgICNyZ2w6OnBsb3QzZGANCmxpYnJhcnkoY29ycnBsb3QpICAgICAgI01hdHJpeiBkZSBjb3JyZWxhY2lvbmVzDQpsaWJyYXJ5KHRleHRzaGFwZSkgICAgICNjb2x1bW5fdG9fcm93bmFtZXMNCiNvcHRzX2tuaXQkc2V0KGV2YWwuYWZ0ZXIgPSAnZmlnLmNhcCcpDQpgYGANCg0KYGBge2NzcywgZWNobz1GQUxTRSwgZXZhbD1GQUxTRX0NCiNodHRwczovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy80MTAzMDQ3Ny9jaGFuZ2luZy1jaHVuay1iYWNrZ3JvdW5kLWNvbG9yLWluLXJtYXJrZG93bg0KDQouYmFkQ29kZSB7DQpiYWNrZ3JvdW5kLWNvbG9yOiByZWQ7DQp9DQpgYGANCg0KYGBge3IsICBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBldmFsPUZBTFNFfQ0KbGlicmFyeShhcGxvcmUzKSAgICAgICAjQmFzZSBkZSBkYXRvcyBwYXJhIGxvcyBlamVtcGxvcw0KbGlicmFyeShsc20pICAgICAgICAgICAjQmFzZSBkZSBkYXRvcyBwYXJhIGVqZW1wbG9zIHkgZXN0aW1hY2lvbmVzIGRlbCBMb2ctdmVyb3NpbWlsaXR1ZA0KbGlicmFyeSh0aWR5dmVyc2UpICAgICAjSW5jbHV5ZSBhIGRwbHlyIHkgZ2dwbG90Mg0KbGlicmFyeShzdHJpbmdyKSAgICAgICAjUmVlbXBsYXphciBjYXJhY3RlcmVzIGVuIHVuIGRhdGEgZnJhbWUNCmxpYnJhcnkob3V0bGllcnMpICAgICAgI291dGxpZXJzOjpncnViYnMudGVzdA0KbGlicmFyeShFbnZTdGF0cykgICAgICAjRW52U3RhdHM6OnJvc25lclRlc3QNCmxpYnJhcnkoRE13UjIpICAgICAgICAgI0xPRiAoTG9jYWwgT3V0bGllciBGYWN0b3IpDQpsaWJyYXJ5KHJnbCkgICAgICAgICAgICNyZ2w6OnBsb3QzZA0KbGlicmFyeShjb3JycGxvdCkgICAgICAjTWF0cml6IGRlIGNvcnJlbGFjaW9uZXMNCmxpYnJhcnkodGV4dHNoYXBlKSAgICAgI2NvbHVtbl90b19yb3duYW1lcw0KYGBgDQoNCg0KDQoNCg0KDQo8IS0tICUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUgLS0+DQo8IS0tIFNlcGFyYWRvciAtLT4NCg0KIyBJbnRyb2R1Y2Npw7NuDQoNCiMjIyBQcmVsaW1pbmFyZXMNCg0KRXMgdW4gbcOpdG9kbyBkZSBpbnRlcmRlcGVuZGVuY2lhIHBhcmEgcmVzdW1pciBsYSBpbmZvcm1hY2nDs24gY29udGVuaWRhIGVuIGxhcyB2YXJpYWJsZXMgeSBmYWNpbGl0YXIgc3UgYW7DoWxpc2lzLiBFbCBBQ1AgdHJhbnNmb3JtYSBlbCBjb25qdW50byBkZSB2YXJpYWJsZXMgb3JpZ2luYWxlcyBlbiB1biBzdWJjb25qdW50byBtw6FzIHBlcXVlw7FvIGRlIHZhcmlhYmxlcyAodsOpYXNlIGxhIGZpZ3VyYSBcQHJlZihmaWc6UENBMSkpLiAgDQoNCjxjZW50ZXI+DQpgYGB7ciBQQ0ExLCBlY2hvPUZBTFNFLCBmaWcuY2FwID0gIioqUmVkdWNjacOzbiBkZSBsYSBkaW1lbnNpw7NuKioiLCBvdXQud2lkdGggPSAiMTAwJSJ9DQojIGZpZy53aWR0aCA9IDIwICMgTm8gZnVuY2lvbmEgZXN0YSBvcGNpb24gZW4gZWwgY2h1bmsNCg0KI2h0dHA6Ly96ZXZyb3NzLmNvbS9ibG9nLzIwMTcvMDYvMTkvdGlwcy1hbmQtdHJpY2tzLWZvci13b3JraW5nLXdpdGgtaW1hZ2VzLWFuZC1maWd1cmVzLWluLXItbWFya2Rvd24tZG9jdW1lbnRzLw0KIyBQYWdpbmEgMzU5IGRlIFIyMDE1LUZyaWVuZGx5DQoNCmtuaXRyOjppbmNsdWRlX2dyYXBoaWNzKCJQQ0ExLnBuZyIpDQoNCiNPdHJhIG1hbmVyYSwgcGVybyAgc2FsZSBlbCBjYXB0aW9uOg0KIzxjZW50ZXI+DQojIVsoI2ZpZzpGaWctY2FwdGlvbikgTWkgZmlndXJhXShOb21icmUucG5nKXt3aWR0aD00MDBweH0NCiM8L2NlbnRlcj4NCmBgYA0KPC9jZW50ZXI+DQoNCg0KDQpFc3RhcyB2YXJpYWJsZXMgc29uIGNvbWJpbmFjaW9uZXMgbGluZWFsZXMgZGUgbGFzIHByaW1lcmFzLCBxdWUgY29udGllbmVuIG1heW9yIHBhcnRlIGRlIGxhIHZhcmlhYmlsaWRhZCBwcmVzZW50ZSBlbiBlbCBjb25qdW50byBpbmljaWFsLiBQYXJhIGFwbGljYXIgZXN0YSB0w6ljbmljYSBzZSByZXF1aWVyZSBxdWUgbGFzIHZhcmlhYmxlcyBzZWFuIGN1YW50aXRhdGl2YXMgKHbDqWFzZSBsYSBmaWd1cmEgXEByZWYoZmlnOlBDQTIpKS4gIA0KDQo8Y2VudGVyPg0KYGBge3IgUENBMiwgZWNobz1GQUxTRSwgZmlnLmNhcCA9ICIqKlJlc3VtZW4geSB2aXN1YWxpemFjacOzbiBkZSBkYXRvcyBtdWx0aXZhcmlhZG9zKioiLCBvdXQud2lkdGggPSAiMTAwJSJ9DQojIGZpZy53aWR0aCA9IDIwICMgTm8gZnVuY2lvbmEgZXN0YSBvcGNpb24gZW4gZWwgY2h1bmsNCg0KI2h0dHA6Ly96ZXZyb3NzLmNvbS9ibG9nLzIwMTcvMDYvMTkvdGlwcy1hbmQtdHJpY2tzLWZvci13b3JraW5nLXdpdGgtaW1hZ2VzLWFuZC1maWd1cmVzLWluLXItbWFya2Rvd24tZG9jdW1lbnRzLw0KIyBQYWdpbmEgMzU5IGRlIFIyMDE1LUZyaWVuZGx5DQoNCmtuaXRyOjppbmNsdWRlX2dyYXBoaWNzKCJQQ0EyLnBuZyIpDQoNCiNPdHJhIG1hbmVyYSwgcGVybyAgc2FsZSBlbCBjYXB0aW9uOg0KIzxjZW50ZXI+DQojIVsoI2ZpZzpGaWctY2FwdGlvbikgTWkgZmlndXJhXShOb21icmUucG5nKXt3aWR0aD00MDBweH0NCiM8L2NlbnRlcj4NCmBgYA0KPC9jZW50ZXI+DQoNCg0KPCEtLSAlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlIC0tPg0KPCEtLSBTZXBhcmFkb3IgLS0+DQoNCg0KIyMjIFByb3DDs3NpdG8NCg0KU3Ugb2JqZXRpdm8gZ2VuZXJhbCBlcyBsb2dyYXIgdW5hIHJlZHVjY2nDs24gZGUgZGF0b3MgcXVlIGZhY2lsaXRlIGxhIGludGVycHJldGFjacOzbiAuIEVuIGVzdGUgc2VudGlkbywgZWwgbcOpdG9kbyBzZSBhcGxpY2EgcGFyYSByZXByZXNlbnRhciDDs3B0aW1hbWVudGUgZW4gdW4gZXNwYWNpbyBkZSBkaW1lbnNpw7NuIHBlcXVlw7FhLCBvYnNlcnZhY2lvbmVzIGRlIHVuIGVzcGFjaW8gZ2VuZXJhbCBLLWRpbWVuc2lvbmFsLiBQb3IgZXN0YSByYXrDs24sIGxhIHTDqWNuaWNhIHNlIGNvbnNpZGVyYSBjb21vIGVsIHByaW1lciBwYXNvIHBhcmEgaWRlbnRpZmljYXIgcG9zaWJsZXMgdmFyaWFibGVzIGxhdGVudGVzIG8gbm8gb2JzZXJ2YWRhcywgcXVlIGVzdMOhbiBnZW5lcmFuZG8gbGEgdmFyaWFiaWxpZGFkIGRlIGxvcyBkYXRvcy4gU2llbXByZSBlc3TDoSBiYXNhZGEgZW4gZGVzY3JpYmlyIGxhIGVzdHJ1Y3R1cmEgZGUgbGEgbWF0cml6IGRlIGNvdmFyaWFuemEgZGUgdW4gY29uanVudG8gZGUgdmFyaWFibGVzIG1lZGlhbnRlIGxhIHV0aWxpemFjacOzbiBkZSBjb21iaW5hY2lvbmVzIGxpbmVhbGVzIGRlIGVzdGFzIHZhcmlhYmxlcyAuDQoNCg0KQ29uIGVzdGEgdMOpY25pY2Egc2UgYnVzY2EgdHJhbnNmb3JtYXIgbGFzIHZhcmlhYmxlcyBvcmlnaW5hbGVzIChlbiBnZW5lcmFsLCBjb3JyZWxhZGFzKSwgZW4gbnVldmFzIHZhcmlhYmxlcyBpbmNvcnJlbGFkYXMsIGZhY2lsaXRhbmRvIGxhIGludGVycHJldGFjacOzbiBkZSBsb3MgZGF0b3MuDQoNCg0KQXVucXVlIHNlIHJlcXVpZXJlbiBsYXMgJE4kIGNvbXBvbmVudGVzIHByaW5jaXBhbGVzIHBhcmEgcmVwcm9kdWNpciB0b2RhIGxhIHZhcmlhYmlsaWRhZCBkZWwgc2lzdGVtYSwgZW4gbGEgcHLDoWN0aWNhLCBsYSBtYXlvciBwYXJ0ZSBkZSBlc3RhIHZhcmlhYmlsaWRhZCBzdWVsZSBleHBsaWNhcnNlIG1lZGlhbnRlIHVuIG7Dum1lcm8gcmVkdWNpZG8gJEokIGRlIGNvbXBvbmVudGVzIHByaW5jaXBhbGVzLiBFbiB0YWxlcyBjYXNvcywgbGFzICRKJCBwcmltZXJhcyBjb21wb25lbnRlcyBwcmluY2lwYWxlcyBzdXN0aXR1eWVuIGEgbGFzICROJCB2YXJpYWJsZXMgb3JpZ2luYWxlcywgZ2VuZXJhbmRvIGFzw60gdW5hIHNpbXBsaWZpY2FjacOzbiBkZWwgc2lzdGVtYSBvcmlnaW5hbC4NCg0KDQoNCjwhLS0gJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSAtLT4NCjwhLS0gU2VwYXJhZG9yIC0tPg0KDQoNCiMjIyBFamVtcGxvOiBQaW5nw7xpbm8NCg0KRXN0ZSBlamVtcGxvICh2w6lhc2UgbGEgZmlndXJhIFxAcmVmKGZpZzpQaW5ndWlubzEpKSBpbHVzdHJhIGxhIHJlZHVjY2nDs24gZGUgbGEgZGltZW5zaW9uYWxpZGFkIGRlIHVuIGNvbmp1bnRvIGRlIGRhdG9zIHRyaWRpbWVuc2lvbmFsZXMgYSBkb3MgZGltZW5zaW9uZXMuIA0KDQo8Y2VudGVyPg0KYGBge3IgUGluZ3Vpbm8xLCBlY2hvPUZBTFNFLCBmaWcuY2FwID0gIioqUGluZ8O8aW5vKioiLCBvdXQud2lkdGggPSAiMTAwJSJ9DQojIGZpZy53aWR0aCA9IDIwICMgTm8gZnVuY2lvbmEgZXN0YSBvcGNpb24gZW4gZWwgY2h1bmsNCg0KI2h0dHA6Ly96ZXZyb3NzLmNvbS9ibG9nLzIwMTcvMDYvMTkvdGlwcy1hbmQtdHJpY2tzLWZvci13b3JraW5nLXdpdGgtaW1hZ2VzLWFuZC1maWd1cmVzLWluLXItbWFya2Rvd24tZG9jdW1lbnRzLw0KIyBQYWdpbmEgMzU5IGRlIFIyMDE1LUZyaWVuZGx5DQoNCmtuaXRyOjppbmNsdWRlX2dyYXBoaWNzKCJQaWd1aW5vMS5wbmciKQ0KDQojT3RyYSBtYW5lcmEsIHBlcm8gIHNhbGUgZWwgY2FwdGlvbjoNCiM8Y2VudGVyPg0KIyFbKCNmaWc6RmlnLWNhcHRpb24pIE1pIGZpZ3VyYV0oTm9tYnJlLnBuZyl7d2lkdGg9NDAwcHh9DQojPC9jZW50ZXI+DQpgYGANCjwvY2VudGVyPg0KDQpJbmljaWFsbWVudGUsIGFwYXJ0ZSBkZWwgZXN0aXJhbWllbnRvIGRlIGxvcyBwdW50b3MsIG5vIHNlIHBlcmNpYmUgdW5hIGVzdHJ1Y3R1cmEgY2xhcmEgZW4gbGEgZGlzdHJpYnVjacOzbiBkZSBsb3MgcHVudG9zLiBTaW4gZW1iYXJnbywgYWwgZWxlZ2lyIHVuYSByb3RhY2nDs24gYWRlY3VhZGEsIHBvZGVtb3MgcmV2ZWxhciBsYSBlc3RydWN0dXJhIHN1YnlhY2VudGUuIEVzdGEgcm90YWNpw7NuIHB1ZWRlIHNlciBjb25jZWJpZGEgY29tbyB1bmEgZXhwbG9yYWNpw7NuIGRlbCBjb25qdW50byB0cmlkaW1lbnNpb25hbCwgYnVzY2FuZG8gZWwgw6FuZ3VsbyDDs3B0aW1vIHBhcmEgdmlzdWFsaXphciBsb3MgZGF0b3MuIEVsIEFuw6FsaXNpcyBkZSBDb21wb25lbnRlcyBQcmluY2lwYWxlcyAoQUNQKSBwdWVkZSBzZXIgw7p0aWwgcGFyYSBkZXNjdWJyaXIgZXN0YSBlc3RydWN0dXJhIHN1YnlhY2VudGUuIFNlbGVjY2lvbmEgdW5hIHJvdGFjacOzbiBkZSB0YWwgbWFuZXJhIHF1ZSBsYSBtYXlvciBwYXJ0ZSBkZSBsYSB2YXJpYWJpbGlkYWQgZGVsIGNvbmp1bnRvIGRlIGRhdG9zIGVzdMOpIGNhcHR1cmFkYSBlbiBsYXMgcHJpbWVyYXMgZGltZW5zaW9uZXMgZGUgbG9zIGRhdG9zIHJvdGFkb3MuIEF1bnF1ZSBwdWVkYSBwYXJlY2VyIHBvY28gw7p0aWwgZW4gbnVlc3RybyBjYXNvIHRyaWRpbWVuc2lvbmFsLCBlc3RlIGVuZm9xdWUgc2UgdnVlbHZlIG11eSBwb2Rlcm9zbyBjdWFuZG8gbG9zIGRhdG9zIHRpZW5lbiBtdWNoYXMgZGltZW5zaW9uZXMgKGRlY2VuYXMgZGUgZGltZW5zaW9uZXMpLg0KDQoNCjwhLS0gJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSAtLT4NCjwhLS0gU2VwYXJhZG9yIC0tPg0KDQojIyMgQ2FyYWN0ZXLDrXN0aWNhcw0KDQoxLiBQQ0Egc3Vwb25lIHF1ZSBsYXMgZGlyZWNjaW9uZXMgY29uIGxhcyBtYXlvcmVzIHZhcmlhbnphcyBzb24gbGFzIG3DoXMgImltcG9ydGFudGVzIiAoZXMgZGVjaXIsIGxhcyBtw6FzIHByaW5jaXBhbGVzKS4NCg0KMi4gRW4gbGEgZmlndXJhIFxAcmVmKGZpZzpQQ0ExKSwgZWwgZWplIFBDMSBlcyBsYSBwcmltZXJhIGRpcmVjY2nDs24gcHJpbmNpcGFsIGEgbG8gbGFyZ28gZGUgbGEgY3VhbCBsYXMgbXVlc3RyYXMgbXVlc3RyYW4gbGEgbWF5b3IgdmFyaWFjacOzbi4gRWwgZWplIFBDMiBlcyBsYSBzZWd1bmRhIGRpcmVjY2nDs24gbcOhcyBpbXBvcnRhbnRlIHkgZXMgb3J0b2dvbmFsIGFsIGVqZSBQQzEuDQoNCg0KPGNlbnRlcj4NCmBgYHtyIFBDQTMsIGVjaG89RkFMU0UsIGZpZy5jYXAgPSAiKipEaXNwZXJzacOzbiB5IFBDQSoqIiwgb3V0LndpZHRoID0gIjcwJSJ9DQojIGZpZy53aWR0aCA9IDIwICMgTm8gZnVuY2lvbmEgZXN0YSBvcGNpb24gZW4gZWwgY2h1bmsNCg0KI2h0dHA6Ly96ZXZyb3NzLmNvbS9ibG9nLzIwMTcvMDYvMTkvdGlwcy1hbmQtdHJpY2tzLWZvci13b3JraW5nLXdpdGgtaW1hZ2VzLWFuZC1maWd1cmVzLWluLXItbWFya2Rvd24tZG9jdW1lbnRzLw0KIyBQYWdpbmEgMzU5IGRlIFIyMDE1LUZyaWVuZGx5DQoNCmtuaXRyOjppbmNsdWRlX2dyYXBoaWNzKCJQQ0EzLnBuZyIpDQoNCiNPdHJhIG1hbmVyYSwgcGVybyAgc2FsZSBlbCBjYXB0aW9uOg0KIzxjZW50ZXI+DQojIVsoI2ZpZzpGaWctY2FwdGlvbikgTWkgZmlndXJhXShOb21icmUucG5nKXt3aWR0aD00MDBweH0NCiM8L2NlbnRlcj4NCmBgYA0KPC9jZW50ZXI+DQoNCg0KDQoNCjMuIExhIGRpbWVuc2lvbmFsaWRhZCBkZSBudWVzdHJvcyBkYXRvcyBiaWRpbWVuc2lvbmFsZXMgcHVlZGUgcmVkdWNpcnNlIGEgdW5hIHNvbGEgZGltZW5zacOzbiBwcm95ZWN0YW5kbyBjYWRhIG11ZXN0cmEgc29icmUgZWwgcHJpbWVyIGNvbXBvbmVudGUgcHJpbmNpcGFsICh2w6lhc2UgbGEgZmlndXJhIFxAcmVmKGZpZzpQQ0ExKWIpDQoNCg0KNC4gRGVzZGUgZWwgcHVudG8gZGUgdmlzdGEgdMOpY25pY28sIGxhIG1lZGlkYSBkZSBsYSBjYW50aWRhZCBkZSB2YXJpYW56YSByZXRlbmlkYSBwb3IgY2FkYSBjb21wb25lbnRlIHByaW5jaXBhbCBzZSBkZXRlcm1pbmEgYSB0cmF2w6lzIGRlbCAqKnZhbG9yIHByb3BpbyoqIGNvcnJlc3BvbmRpZW50ZS4gDQoNCjUuIEVzIGltcG9ydGFudGUgcmVzYWx0YXIgcXVlIFBDQSByZXN1bHRhLCBlc3BlY2lhbG1lbnRlLCBiZW5lZmljaW9zbyBjdWFuZG8gbGFzIHZhcmlhYmxlcyBlbiBlbCBjb25qdW50byBkZSBkYXRvcyBleGhpYmVuIHVuYSBhbHRhIGNvcnJlbGFjacOzbi4gRXN0YSBjb3JyZWxhY2nDs24gaW5kaWNhIGxhIHByZXNlbmNpYSBkZSByZWR1bmRhbmNpYXMgZW4gbG9zIGRhdG9zICh2w6lhc2UgbGEgZmlndXJhIFxAcmVmKGZpZzpSZWR1bmRhbmNpYTEpKS4gQXByb3ZlY2hhbmRvIGVzdGEgcmVkdW5kYW5jaWEsIGVsIFBDQSBzZSBlbXBsZWEgcGFyYSByZWR1Y2lyIGVsIG7Dum1lcm8gZGUgdmFyaWFibGVzIG9yaWdpbmFsZXMgYSB1biBjb25qdW50byBtZW5vciBkZSBudWV2YXMgdmFyaWFibGVzLCBlcyBkZWNpciwgbG9zIGNvbXBvbmVudGVzIHByaW5jaXBhbGVzLiBFc3RvcyBjb21wb25lbnRlcyBwcmluY2lwYWxlcyBleHBsaWNhbiBsYSBtYXlvciBwYXJ0ZSBkZSBsYSB2YXJpYW56YSBkZSBsYXMgdmFyaWFibGVzIG9yaWdpbmFsZXMuDQoNCg0KPGNlbnRlcj4NCmBgYHtyIFJlZHVuZGFuY2lhMSwgZWNobz1GQUxTRSwgZmlnLmNhcCA9ICIqKlRpcG9zIGRlIHJlZHVuZGFuY2lhKioiLCBvdXQud2lkdGggPSAiODAlIn0NCiMgZmlnLndpZHRoID0gMjAgIyBObyBmdW5jaW9uYSBlc3RhIG9wY2lvbiBlbiBlbCBjaHVuaw0KDQojaHR0cDovL3pldnJvc3MuY29tL2Jsb2cvMjAxNy8wNi8xOS90aXBzLWFuZC10cmlja3MtZm9yLXdvcmtpbmctd2l0aC1pbWFnZXMtYW5kLWZpZ3VyZXMtaW4tci1tYXJrZG93bi1kb2N1bWVudHMvDQojIFBhZ2luYSAzNTkgZGUgUjIwMTUtRnJpZW5kbHkNCg0Ka25pdHI6OmluY2x1ZGVfZ3JhcGhpY3MoIlJlZHVuZGFuY2lhMS5wbmciKQ0KDQojT3RyYSBtYW5lcmEsIHBlcm8gIHNhbGUgZWwgY2FwdGlvbjoNCiM8Y2VudGVyPg0KIyFbKCNmaWc6RmlnLWNhcHRpb24pIE1pIGZpZ3VyYV0oTm9tYnJlLnBuZyl7d2lkdGg9NDAwcHh9DQojPC9jZW50ZXI+DQpgYGANCjwvY2VudGVyPg0KDQoNCjwhLS0gJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSAtLT4NCjwhLS0gU2VwYXJhZG9yIC0tPg0KDQojIyMgQ29uY2x1c2nDs24NCg0KRW4gcmVzdW1lbiwgZWwgb2JqZXRpdm8gcHJpbmNpcGFsIGRlbCBhbsOhbGlzaXMgZGUgY29tcG9uZW50ZXMgcHJpbmNpcGFsZXMgZXM6DQogICAgDQogICAtIElkZW50aWZpY2FyIHBhdHJvbmVzIG9jdWx0b3MgZW4gdW4gY29uanVudG8gZGUgZGF0b3MuDQogICAgDQogICAtIFJlZHVjaXIgbGEgZGltZW5zaW9uYWxpZGFkIGRlIGxvcyBkYXRvcyBlbGltaW5hbmRvIGVsIHJ1aWRvIHkgbGEgcmVkdW5kYW5jaWEgZW4gbG9zIGRhdG9zLg0KICAgIA0KICAgLSBJZGVudGlmaWNhciB2YXJpYWJsZXMgY29ycmVsYWNpb25hZGFzLg0KICAgIA0KDQoNCg0KPCEtLSAlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlIC0tPg0KPCEtLSBTZXBhcmFkb3IgLS0+DQoNCiMgUGFzb3MgcGFyYSAgcmVhbGl6YXIgdW4gUENBDQoNClZhbW9zIGEgZXhwbGljYXIgZWwgUENBIHBhc28gYSBwYXNvIHNpbiB1dGlsaXphciBkZW1hc2lhZGEgdGVybWlub2xvZ8OtYSBtYXRlbcOhdGljYSBhdmFuemFkYS4gRW4gZ2VuZXJhbCwgc2UgcHVlZGUgdmlzdWFsaXphciBlbiAgbGEgZmlndXJhIFxAcmVmKGZpZzpQQ0E0KS4NCg0KDQo8Y2VudGVyPg0KYGBge3IgUENBNCwgZWNobz1GQUxTRSwgZmlnLmNhcCA9ICIqKlBhc29zIGdlbmVyYWxlcyBwYXJhIGFwbGljYXIgdW4gUENBKioiLCBvdXQud2lkdGggPSAiMTAwJSJ9DQojIGZpZy53aWR0aCA9IDIwICMgTm8gZnVuY2lvbmEgZXN0YSBvcGNpb24gZW4gZWwgY2h1bmsNCg0KI2h0dHA6Ly96ZXZyb3NzLmNvbS9ibG9nLzIwMTcvMDYvMTkvdGlwcy1hbmQtdHJpY2tzLWZvci13b3JraW5nLXdpdGgtaW1hZ2VzLWFuZC1maWd1cmVzLWluLXItbWFya2Rvd24tZG9jdW1lbnRzLw0KIyBQYWdpbmEgMzU5IGRlIFIyMDE1LUZyaWVuZGx5DQoNCmtuaXRyOjppbmNsdWRlX2dyYXBoaWNzKCJQQ0E0LnBuZyIpDQoNCiNPdHJhIG1hbmVyYSwgcGVybyAgc2FsZSBlbCBjYXB0aW9uOg0KIzxjZW50ZXI+DQojIVsoI2ZpZzpGaWctY2FwdGlvbikgTWkgZmlndXJhXShOb21icmUucG5nKXt3aWR0aD00MDBweH0NCiM8L2NlbnRlcj4NCmBgYA0KPC9jZW50ZXI+DQoNCjwhLS0gJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSAtLT4NCjwhLS0gU2VwYXJhZG9yIC0tPg0KDQojIyMgUGFzbyAxOiBEZXNjcmliaXIgbG9zIERhdG9zIHkgb2JqZXRpdm8NCg0KU3Vwb25nYSBxdWUsIGVuIHVuIGVzdHVkaW8gcmVhbGl6YWRvIHNvYnJlICRuJCBpbmRpdmlkdW9zLCAgc2UgdGllbmUgdW4gdmVjdG9yICRYPShYXzEsIFhfMiwgXGxkb3RzLCBYX0spXlQkIGRlIHRhbWHDsW8gJEskLiBFbCBvYmpldGl2byBlcyBlbmNvbnRyYXIgbnVldmFzIHZhcmlhYmxlcyBub3RhZGFzIGNvbW8gJFlfaiQsICRqPTEsIFxsZG90cywgSiQsICBxdWUgc2VhbiBjb21iaW5hY2lvbmVzIGxpbmVhbGVzIGRlIGxhcyB2YXJpYWJsZXMgb3JpZ2luYWxlcyAkWF9rJC4NCg0KPCEtLSAlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlIC0tPg0KPCEtLSBTZXBhcmFkb3IgLS0+DQoNCmBgYHtyLCBlY2hvPUZBTFNFLCBldmFsPVRSVUUsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQojIyMgUGFzbyAyOiBFc3RhbmRhcml6YWNpw7NuIGRlIGRhdG9zDQoNCiNBbnRlcyBkZSBjb21lbnphciBlbCBQQ0EsIGVzIMO6dGlsIGVzdGFuZGFyaXphciBsb3MgZGF0b3MuIEVzdG8gc2lnbmlmaWNhIHJlc3RhciBsYSBtZWRpYSB5IGRpdmlkaXIgcG9yIGxhIGRlc3ZpYWNpw7NuIGVzdMOhbmRhciBwYXJhIHF1ZSB0b2RhcyBsYXMgdmFyaWFibGVzIHRlbmdhbiBsYSBtaXNtYSBlc2NhbGEuIEVzdG8gZmFjaWxpdGEgbGEgY29tcGFyYWNpw7NuLg0KDQojJCRaX3tpa30gPSBcZnJhY3tYX3tpa30gLSBcYmFye1hfa319e3Nfa30kJA0KDQojRG9uZGUgJFpfe2lrfSQgIGVzIGxhIHZhcmlhYmxlIGVzdGFuZGFyaXphZGEsICRYX3tpa30kIGVzICRLJC3DqXNpbWEgdmFyaWFibGUgZW4gbGEgb2JzZXJ2YWNpw7NuICRpJCwgJFhfayQgeSAkc19rJCBzb24gbGEgbWVkaWEgZGUgbGEgdmFyaWFibGUgeSBsYSBkZXN2aWFjacOzbiBlc3TDoW5kYXIgZGUgbGEgJGskLcOpc2ltYSAgdmFyaWFibGUuDQoNCmBgYA0KDQoNCg0KPCEtLSAlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlIC0tPg0KPCEtLSBTZXBhcmFkb3IgLS0+DQoNCiMjIyBQYXNvIDI6IERlZmluaXIgbGFzIGNvbXBvbmVudGVzIFByaW5jaXBhbGVzDQoNClNlIHByb2NlZGUgZGUgbGEgc2lndWllbnRlIG1hbmVyYTogDQoNCioqT2JzZXJ2YWNpw7NuIDIuMToqKg0KDQpTZSBkZXRlcm1pbmEgbGEgcHJpbWVyYSBjb21wb25lbnRlIHByaW5jaXBhbCAkWV8xJCwgbGEgY3VhbCBzaW50ZXRpemEgbGEgbWF5b3IgY2FudGlkYWQgZGUgdmFyaWFiaWxpZGFkIHRvdGFsIGNvbnRlbmlkYSBlbiBsb3MgZGF0b3M6IA0KDQokJFlfMSBcOz0gXDsgXGFscGhhX3sxMX0gWF8xIFwsICtcLCAgXGFscGhhX3sxMn0gWF8yIFwsK1wsIFxjZG90cyBcLCtcLCBcYWxwaGFfezFLfSBYX0sgXDsgPSBcOyBcYWxwaGFfMV5UIFgkJA0KDQpkb25kZSAkXGFscGhhXzEgPShcYWxwaGFfezExfSwgXGFscGhhX3sxMn0sIFxsZG90cywgXGFscGhhX3sxS30pXlQkIGVzIGVzY29naWRvIGRlIHRhbCBmb3JtYSBxdWUgbWF4aW1pemUgbGEgcmF6w7NuIGVudHJlIGxhIHZhcmlhbnphICRWKFlfMSkkIGRlICRZXzEkIHkgbGEgdmFyaWFjacOzbiB0b3RhbCB5IHN1amV0YSAgYSBsYSByZXN0cmljY2nDs24gcXVlIHNlYSB1biB2ZWN0b3Igb3J0b25vbWFsLiBFcyBkZWNpciwgZGViZSBjdW1wbGlyIGxhIGNvbmRpY2nDs246IA0KDQokJFxhbHBoYV8xXlRcLCBcYWxwaGFfMSBcOyA9XDsgXHN1bVxsaW1pdHNfe2s9MX1eSyBcYWxwaGFfezFrfV4yIFw7ID0gXDsgMSQkDQoNCioqT2JzZXJ2YWNpw7NuIDIuMjoqKiANCg0KTGEgc2VndW5kYSBjb21wb25lbnRlIHByaW5jaXBhbCAkWV8yJCBlcyB1bmEgY29tYmluYWNpw7NuIGxpbmVhbCBwb25kZXJhZGEgZGUgbGFzIHZhcmlhYmxlcyBvYnNlcnZhZGFzOg0KJCRZXzIgXDs9IFw7IFxhbHBoYV97MjF9IFhfMSBcLCArXCwgIFxhbHBoYV97MjJ9IFhfMiBcLCtcLCBcY2RvdHMgXCwrXCwgXGFscGhhX3syS30gWF9LIFw7ID0gXDsgXGFscGhhXzJeVCBYJCQNCg0KJFlfMiQgbm8gZXN0w6EgY29ycmVsYWNpb25hZGEgY29uIGxhIHByaW1lcmEgY29tcG9uZW50ZSBwcmluY2lwYWwgJFlfMSQuIEVzIGRlY2lyLCAkQ292KFlfMSwgWV8yKT0wJC4gQWRlbcOhcywgIHJlw7puZSBsYSBtw6F4aW1hIHZhcmlhYmlsaWRhZCByZXN0YW50ZSBkZSBsYSB2YXJpYWNpw7NuIGNvbnRlbmlkYSBlbiBsYSBwcmltZXJhIGNvbXBvbmVudGUgcHJpbmNpcGFsICRZXzEkLg0KDQoNCioqT2JzZXJ2YWNpw7NuIDIuMzoqKiANCg0KRGVsIG1pc21vIG1vZG8gc2UgZWxpZ2VuICRZXzEkLCAkWV8yJCwgJFxsZG90cyQgLCAkWV9qJCwgaW5jb3JyZWxhZG9zIGVudHJlIHPDrSwgZGUgbWFuZXJhIHF1ZSBsYXMgdmFyaWFibGVzIGFsZWF0b3JpYXMgb2J0ZW5pZGFzIHZheWFuIHRlbmllbmRvIGNhZGEgdmV6IG1lbm9yIHZhcmlhbnphLg0KDQoqKk9ic2VydmFjacOzbiAyLjQ6KiogDQoNCkxhICRqJC3DqXNpbWEgY29tcG9uZW50ZSBwcmluY2lwYWwgZXM6IA0KDQokJFlfaiBcOz0gXDsgXGFscGhhX3tqMX0gWF8xIFwsICtcLCAgXGFscGhhX3tqMn0gWF8yIFwsK1wsIFxjZG90cyBcLCtcLCBcYWxwaGFfe2pLfSBYX0sgXDsgPSBcOyBcYWxwaGFfal5UIFgkJA0KbGEgY3VhbCB0aWVuZSBsYSB2YXJpYW56YSBtw6FzIGdyYW5kZSBlbnRyZSB0b2RhcyBsYXMgc2lndWllbnRlcy4gQXF1w60sICRcYWxwaGFfaiA9KFxhbHBoYV97ajF9LCBcYWxwaGFfe2oxMn0sIFxsZG90cywgXGFscGhhX3tqMUt9KV5UJCB5IGVzIHVuIHZlY3RvciBjb24gbcOzZHVsbyAxIChvIHNlYSwgb3J0b25vbWFsKS4gRXMgZGVjaXIsIGRlYmUgY3VtcGxpciBsYSBjb25kaWNpw7NuOiANCg0KJCRcYWxwaGFfal5UXCwgXGFscGhhX2ogXDsgPVw7IFxzdW1cbGltaXRzX3trPTF9XksgXGFscGhhX3tqa31eMiBcOyA9IFw7IDEkJA0KDQoqKk9ic2VydmFjacOzbiAyLjU6KiogDQoNClNlIGN1bXBsZSBxdWUgDQokJFYoWV9qKSBcOz1cOyBWKFxhbHBoYV9qXlQgXCxYKSBcOz1cOyBcYWxwaGFfal5UXCwgXFNpZ21hIFwsIFxhbHBoYV9qLCBccXVhZCBcbWJveHtwYXJhIGNhZGF9XHF1YWQgaj0xLDIsIFxsZG90cywgSiQkDQoNCioqT2JzZXJ2YWNpw7NuIDIuNjoqKiANCg0KRW4gZ2VuZXJhbCwgcXVlcmVtb3MgZWxlZ2lyICRhX2okIGRlIG1vZG8gcXVlIHNlIG1heGltaWNlIGxhIHZhcmlhbnphIGRlICRZX2okIHN1amV0YSBhIGxhIHJlc3RyaWNjacOzbg0KZGUgcXVlICRcYWxwaGFfal5UXCwgXGFscGhhX2ogIFw7ID0gXDsgMSQNCg0KKipPYnNlcnZhY2nDs24gMi43OioqIA0KDQpMYXMgJFlfaiQgc2ludGV0aXphbiBlbiBmb3JtYSBkZWNyZWNpZW50ZSBsYSB2YXJpYW56YSBkZSB1biBjb25qdW50byBvcmlnaW5hbCBkZSBkYXRvcy4NCg0KKipPYnNlcnZhY2nDs24gMi44OioqIA0KDQpFbCBlbmZvcXVlIGNvbcO6bm1lbnRlIHV0aWxpemFkbyBwYXJhIG9wdGltaXphciB1bmEgZnVuY2nDs24gZGUgbcO6bHRpcGxlcyB2YXJpYWJsZXMgYmFqbyByZXN0cmljY2lvbmVzIGVzIGNvbm9jaWRvIGNvbW8gZWwgKm3DqXRvZG8gZGUgbG9zIG11bHRpcGxpY2Fkb3JlcyBkZSBMYWdyYW5nZSouDQoNCg0KPCEtLSAlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlIC0tPg0KPCEtLSBTZXBhcmFkb3IgLS0+DQoNCiMjIyBQYXNvIDM6IE1hdHJpeiBkZSB2YXJpYW56YXMgeSBjb3ZhcmlhbnphIG8gZGUgY29ycmVsYWNpb25lcw0KDQpIYXkgZG9zIGZvcm1hcyBoYWJpdHVhbGVzIGRlIGdlbmVyYXIgY29tcG9uZW50ZXMgcHJpbmNpcGFsZXMuDQoNCioqUHJpbWVyYSBmb3JtYSAzLjE6KiogDQoNCkNhbGN1bGFyIGxhIG1hdHJpeiBkZSBjb3JyZWxhY2nDs24uIFNlIHJlY29taWVuZGEgdXRpbGl6YXJsYSBjdWFuZG86IA0KICANCiAgYSkgQ3VhbmRvIGxhcyB2YXJpYWJsZXMgb3JpZ2luYWxlcyBzZSBlbmN1ZW50cmFuIGVuIHVuaWRhZGVzIGRpZmVyZW50ZXMuDQoNCiAgYikgRW4gY2FzbyBkZSBxdWUgZXhpc3RhIGRpc3BhcmlkYWQgZW4gbGFzIHZhcmlhbnphcyBkZSBsYXMgdmFyaWFibGVzIG9yaWdpbmFsZXMuDQoNCioqU2VndW5kYSBmb3JtYSAzLjI6KiogDQoNCkNhbGN1bGFyIGxhIG1hdHJpeiBkZSB2YXJpYW56YSB5IGNvdmFyaWFuemEgJFxTaWdtYSQgZGUgbGFzIHZhcmlhYmxlcyBvcmlnaW5hbGVzLiBTZSByZWNvbWllbmRhIHV0aWxpemFybGEgY3VhbmRvOiANCg0KICBhKSBEZXNlYW1vcyBjb25zaWRlcmFyIGxhIGluZm9ybWFjacOzbiBwcm9wb3JjaW9uYWRhIHBvciBsYXMgZGlmZXJlbmNpYXMgZW50cmUgbGFzIHZhcmlhbnphcyBkZSBsYXMgdmFyaWFibGVzLg0KDQoqKk9ic2VydmFjacOzbiAzLjM6KiogDQoNClNpIGxhcyB2YXJpYWJsZXMgY29tcGFydGVuIGxhcyBtaXNtYXMgdW5pZGFkZXMsIGFtYmFzIGZvcm1hIHNvbiBmYWN0aWJsZXMuIEFudGUgbGEgaW5jZXJ0aWR1bWJyZSwgZXMgcmVjb21lbmRhYmxlIGxsZXZhciBhIGNhYm8gYW1iYXMgZXZhbHVhY2lvbmVzIHkgb3B0YXIgcG9yIGFxdWVsbGEgcXVlIGFycm9qZSBjb25jbHVzaW9uZXMgbcOhcyBjbGFyYXMuIA0KDQoqKk9ic2VydmFjacOzbiAzLjQ6KiogDQoNCkVuIGxvcyBwYXNvcyBzaWd1aWVudGVzLCBjb25zaWRlcmFyZW1vcyBzb2xvIGxhIHNlZ3VuZGEgZm9ybWEuDQoNCg0KDQoNCjwhLS0gJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSAtLT4NCjwhLS0gU2VwYXJhZG9yIC0tPg0KDQojIyMgUGFzbyA0OiBWZWN0b3JlcyB5IHZhbG9yZXMgcHJvcGlvcw0KDQpDYWxjdWxhbW9zIGxvcyB2ZWN0b3JlcyB5IHZhbG9yZXMgcHJvcGlvcyBkZSAkXFNpZ21hJC4gRXMgZGVjaXIsIHNpICRhX2skIGVzIHVuIHZlY3RvciBwcm9waW8gZGUgJFxTaWdtYSQgIHkgJFxsYW1iZGEkIGVzIHN1IHZhbG9yIHByb3BpbyBhc29jaWFkbywgZW50b25jZXMsIGRlYmUgY3VtcGxpcnNlIHF1ZTogDQokJCBcU2lnbWEgIFxjZG90IGFfayBcOyA9IFw7IFxsYW1iZGEgXCwgXCxJX2sgXCwgYV9rICQkDQpFbnRvbmNlcywgDQoNCiQkVihZX2spIFw7PVw7IFYoXGFscGhhX2teVCBcLFgpIFw7PVw7IFxhbHBoYV9rXlRcLCBcU2lnbWEgXCwgXGFscGhhX2sgXDs9XDsgXGFscGhhX2teVFwsIFxsYW1iZGEgXCxJX2sgIFwsIFxhbHBoYV9rIFw7PVw7IFwsIFxsYW1iZGEgXCxcYWxwaGFfa15UICBcLCBcYWxwaGFfayBcOz1cOyBcbGFtYmRhIFxjZG90IDEgXDs9XDsgXGxhbWJkYSQkDQpMdWVnbywgcGFyYSBtYXhpbWl6YXIgbGEgdmFyaWFuemEgZGUgJFlfayQgc2UgdGllbmUgcXVlIHRvbWFyIGVsIG1heW9yIGF1dG92YWxvciwgZGlnYW1vcyAkXGxhbWJkYV9rJCwgeSBlbCBjb3JyZXNwb25kaWVudGUgYXV0b3ZlY3RvciAkYV9rJC4NCg0KUG9yIGNvbnNpZ3VpZW50ZSwgbGFzIGNvbXBvbmVudGVzIGFsZWF0b3JpYXMgdmllbmVuIGRhZGFzIHBvciANCiANCiQkWV9rIFw7PSBcOyB2X2teVFwsIFgsIFxxdWFkIFxtYm94e3BhcmEgY2FkYX1ccXVhZCAgaz0xLCBcbGRvdHMsIEskJA0KPCEtLSAlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlIC0tPg0KPCEtLSBTZXBhcmFkb3IgLS0+DQoNCiMjIyBQYXNvIDU6IEludGVycHJldGFjacOzbiBkZSBsb3MgdmVjdG9yZXMgeSB2YWxvcmVzIHByb3Bpb3MNCg0KKipPYnNlcnZhY2nDs24gNS4xOioqIA0KDQpMb3MgdmFsb3JlcyBwcm9waW9zICRcbGFtYmRhXzEkLCAkXGxhbWJkYV8yJCwgJFxsZG90cyQsICRcbGFtYmRhX2skIHJlcHJlc2VudGFuIGxhIHZhcmlhYmlsaWRhZCBlbiBjYWRhIGRpcmVjY2nDs24uDQoNCg0KKipPYnNlcnZhY2nDs24gNS4yOioqIA0KDQpMb3MgdmFsb3JlcyBwcm9waW9zICBjb3JyZXNwb25kaWVudGVzIGEgbG9zIHZlY3RvcmVzIHByb3Bpb3MgJGFfMSQsICRhXzIkLCAkXGxkb3RzJCwgJGFfayQgc29uIGxhcyB2YXJpYW56YXMgZGUgbGFzIGNvbXBvbmVudGVzIHByaW5jaXBhbGVzICRZXzEkLCAkWV8yJCwgJFxsZG90cyQsICRZX2skLCByZXNwZWN0aXZhbWVudGUuICBFcyBkZWNpciwgc2UgY3VtcGxlIHF1ZSANCg0KJCRWKFlfaykgPSBcbGFtYmRhX2ssIFxxdWFkIFxtYm94e3BhcmEgY2FkYX1ccXVhZCBrPTEsMiwgXGxkb3RzLCBLJCQNCioqT2JzZXJ2YWNpw7NuIDUuMzoqKiANCg0KT3JkZW5hbW9zIGRlIG1heW9yIGEgbWVub3IgbG9zIHZlY3RvcmVzIHByb3Bpb3Mgc2Vnw7puIHN1cyB2YWxvcmVzIHByb3Bpb3MuIExhcyBwcmltZXJhcyBjb21wb25lbnRlcyBwcmluY2lwYWxlcyBjYXB0dXJhbiBsYSBtYXlvciBwYXJ0ZSBkZSBsYSB2YXJpYWJpbGlkYWQgZGUgbG9zIGRhdG9zLiBFbiBlc3RlIHNlbnRpZG8sIHNlIGN1bXBsZSBxdWUgDQoNCiQkXGxhbWJkYV8xIFw7IFxnZXEgXDsgXGxhbWJkYV8yXDsgXGdlcSBcOyBcY2RvdHMgXDsgXGdlcVw7IFxsYW1iZGFfayQkDQo8IS0tICUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUgLS0+DQo8IS0tIFNlcGFyYWRvciAtLT4NCg0KIyMjIFBhc28gNjogUHJveWVjY2nDs24gZGUgZGF0b3MNCg0KUHJveWVjdGFtb3MgbG9zIGRhdG9zIG9yaWdpbmFsZXMgZW4gbGFzIG51ZXZhcyBkaXJlY2Npb25lcyBkZWZpbmlkYXMgcG9yIGxhcyBjb21wb25lbnRlcyBwcmluY2lwYWxlczoNCg0KJCQgXHRleHR7TnVldm8gZGF0b31fe2lrfSA9IGFfaV5UIFxjZG90IFxtYXRoYmZ7WH1fayQkDQoNCjwhLS0gJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSAtLT4NCjwhLS0gU2VwYXJhZG9yIC0tPg0KDQojIyMgUGFzbyA3OiBWaXN1YWxpemFjacOzbg0KDQpGaW5hbG1lbnRlLCB2aXN1YWxpemFtb3MgbG9zIGRhdG9zIGVuIGxhcyBudWV2YXMgZGltZW5zaW9uZXMgcGFyYSBkZXNjcmliaXIgbWVqb3Igc3UgZXN0cnVjdHVyYS4NCg0KDQoNCjwhLS0gJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSAtLT4NCjwhLS0gU2VwYXJhZG9yIC0tPg0KDQojIFByb3BpZWRhZGVzIHNlZ8O6biBsYSBtYXRyaXogZGUgdmFyaWFuemFzIHkgY292YXJpYW56YXMNCg0KIyMjIFByb3BpZWRhZGVzIGLDoXNpY2FzDQoNCjwhLS0gJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSAtLT4NCjwhLS0gU2VwYXJhZG9yIC0tPg0KDQoqKlByb3BpZWRhZCAxOioqDQoNCkxhIGluZmx1ZW5jaWEgZGUgbGEgdmFyaWFibGUgJFhfayQgZW4gbGEgJGskLcOpc2ltYSBjb21wb25lbnRlIHByaW5jaXBhbCBzZSBkZXRlcm1pbmEgbWVkaWFudGUgbGEgbWFnbml0dWQgZGVsIGNvZWZpY2llbnRlIA0KJGFfe2prfSQuDQoNCg0KPCEtLSAlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlIC0tPg0KPCEtLSBTZXBhcmFkb3IgLS0+DQoNCioqUHJvcGllZGFkIDI6KioNCg0KTGEgY292YXJpYW56YSBlbnRyZSBsYSB2YXJpYWJsZSAkWF9rJCB5IGxhIGNvbXBvbmVudGUgcHJpbmNpcGFsICRZX2okIGVzOiANCg0KJCRDb3YoWF9rLCBZX2opXDsgPVw7IGFfe2prfSBcLCBcbGFtYmRhX2ogJCQNCg0KYGBge3IgZXZhbD1GQUxTRSwgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCiNBcXXDrSwgJElfaiQgZXMgbGEgbWF0cml6IGlkw6ludGljYSBkZSB0YW1hw7FvICRqJCAodGllbmUgMXMgZW4gbGEgZGlhZ29uYWwgcHJpbmNpcGFsIHkgMHMgZW4gbGFzIG90cmFzIGNlbGRhcyk6IA0KIyQkSV9qIFw7PVw7IFxiZWdpbntwbWF0cml4fQ0KIyAxJiAgJiAgJjAgXFwgDQojICYgIDEmICAmIFxcIA0KIyYgICYgXGRkb3RzICYgXFwgDQojIDAmICAmICAmMSANCiNcZW5ke3BtYXRyaXh9JCQNCmBgYA0KDQoNCjwhLS0gJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSAtLT4NCjwhLS0gU2VwYXJhZG9yIC0tPg0KDQoqKlByb3BpZWRhZCAzOioqDQoNCkxhIHZhcmlhbnphIG11ZXN0cmFsIGRlIGxhcyBvYnNlcnZhY2lvbmVzIGNvbiByZXNwZWN0byBhIGxhICRrJC3DqXNpbWEgY29tcG9uZW50ZSBwcmluY2lwYWwgZXMgDQoNCiQkVihZX2spXDsgPVw7IFxhbHBoYV9rXlRcLCBcU2lnbWEgXCwgXGFscGhhX2sgXDs9XDsgXGxhbWJkYSQkDQoNCjwhLS0gJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSAtLT4NCjwhLS0gU2VwYXJhZG9yIC0tPg0KDQoqKlByb3BpZWRhZCA0OioqDQoNClBhcmEgdG9kbyAka1xuZSB7XHRpbGRlIGt9JCwgbGFzIGNvbXBvbmVudGVzICRZX2skIHkgJFlfe1x0aWxkZSBrfSQgZGViZW4gZXN0YXIgaW5jb3JyZWxhZGFzLiBFcyBkZWNpciwgDQokJENvdihZX2ssIFlfe1x0aWxkZSBrfSkgPSAwJCQNCjwhLS0gJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSAtLT4NCjwhLS0gU2VwYXJhZG9yIC0tPg0KDQoqKlByb3BpZWRhZCA1OioqDQoNClBhcmEgdG9kbyAka1xuZSB7XHRpbGRlIGt9JCwgbG9zIHZlY3RvcmVzIHByb3Bpb3MgJGFfayQgeSAkYV97XHRpbGRlIGt9JCBzb24gb3J0b2dvbmFsZXMuIEVzIGRlY2lyLCANCiQkYV9rXlQgXCwgYV97XHRpbGRlIGt9ID0gMCQkDQoNCkVzdGEgcHJvcGllZGFkIGVzIGNvbnNlY3VlbmNpYSBkZSBsYSBwcm9waWVkYWQgNCBwb3JxdWU6IA0KDQokJDAgXDsgPSBcOyBDb3YoWV9rLCBZX3tcdGlsZGUga30pIFw7ID0gXDsgQ292XGxlZnQoYV9rXlRcLHggXDsgLFw7ICBhX3tcdGlsZGUga31eVFwseCBccmlnaHQpIFw7ID0gXDthX2teVFxjZG90IEVbKHgtXG11KSh4LVxtdSleVF0gXGNkb3QgYV97XHRpbGRlIGt9IFw7ID0gXDsgYV9rXlRcY2RvdCBcU2lnbWEgXGNkb3QgYV97XHRpbGRlIGt9IFw7ID0gXDtcYWxwaGFfa15UXCwgXGxhbWJkYSAgXCwgXGFscGhhX3tcdGlsZGUga30gXDs9XDsgXCwgXGxhbWJkYSBcLFxhbHBoYV9rXlQgIFwsIFxhbHBoYV97XHRpbGRlIGt9ICQkDQoNCjwhLS0gJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSAtLT4NCjwhLS0gU2VwYXJhZG9yIC0tPg0KDQoqKlByb3BpZWRhZCA2OioqDQoNClRvZG9zIGxvcyBjb21wb25lbnRlcyAkWSQgKGVuIHRvdGFsICRLJCkgc2UgcHVlZGVuIGV4cHJlc2FyIGNvbW8gZWwgcHJvZHVjdG8gZGUgdW5hIG1hdHJpeiBmb3JtYWRhIHBvciBsb3MgYXV0b3ZlY3RvcmVzLCBtdWx0aXBsaWNhZGEgcG9yIGVsIHZlY3RvciAkeCQgcXVlIGNvbnRpZW5lIGxhcyB2YXJpYWJsZXMgb3JpZ2luYWxlcyAkWF8xJCwgJFxsZG90cyQgLCAkWF9LJDoNCg0KJCRZIFw7PVw7IEFYICQkDQpkb25kZQ0KDQokJHlcOz1cOyBcYmVnaW57cG1hdHJpeH0NCnlfMVxcIA0KXHZkb3RzXFwgDQp5X0tcXCANClxlbmR7cG1hdHJpeH0sIFxxcXVhZCANCkFcOz1cO1xiZWdpbntwbWF0cml4fQ0KYV97MTF9ICYgIGFfezEyfSYgXGNkb3RzICZhX3sxS30gXFwgDQphX3syMX0gJiAgYV97MjJ9JiBcY2RvdHMgJmFfezJLfSBcXCANClx2ZG90cyAmIFx2ZG90cyAmIFxkZG90cyAmXHZkb3RzIFxcIA0KYV97SzF9ICYgIGFfe0syfSYgXGNkb3RzICZhX3tLS30gDQpcZW5ke3BtYXRyaXh9LCBccXF1YWQgDQp4XDs9XDtcYmVnaW57cG1hdHJpeH0NCnhfMVxcIA0KXHZkb3RzXFwgDQp4X0tcXCANClxlbmR7cG1hdHJpeH0NCiQkDQoNClRlbmllbmRvIGVuIGN1ZW50YSBsYSBwcm9waWVkYWQgMywgbGEgbWF0cml6IGRlIGNvdmFyaWFuemFzIGRlICRZJCBzZXLDoTogDQoNCiQkXExhbWJkYVw7PVw7XGJlZ2lue3BtYXRyaXh9DQpcbGFtYmRhXzEgJiAgMCYgXGNkb3RzICYwIFxcIA0KMCAmICBcbGFtYmRhXzImIFxjZG90cyAmMCBcXCANClx2ZG90cyAmIFx2ZG90cyAmIFxkZG90cyAmXHZkb3RzIFxcIA0KMCAmICAwJiBcY2RvdHMgJlxsYW1iZGFfMw0KXGVuZHtwbWF0cml4fSQkDQoNCnBvcnF1ZSBsYXMgJFlfayQgc2UgaGFuIGNvbW5zdHJ1aWRvIGRlIHRhbCBtYW5lcmEgcXVlIHNlYW4gaW5jb3JyZWxhZGFzLiANCg0KPCEtLSAlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlIC0tPg0KPCEtLSBTZXBhcmFkb3IgLS0+DQoNCioqUHJvcGllZGFkIDY6KioNCg0KU2UgY3VtcGxlIHF1ZTogDQokJFxMYW1iZGEgXDs9XDsgVihZKSBcOz1cOyBBXlRcLCBWKFgpIFwsQVw7PVw7IEFeVCBcLFxTaWdtYSBcLEEgJCQNCg0KPCEtLSAlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlIC0tPg0KPCEtLSBTZXBhcmFkb3IgLS0+DQoNCioqUHJvcGllZGFkIDc6KioNCg0KDQokQSQgZXMgdW5hIG1hdHJpeiBvcnRvZ29uYWwgKHBvcnF1ZSAkYV9rXlQgXCwgYV9rID0gMSQgcGFyYSB0b2RhcyBzdXMgY29sdW1uYXMpLiBQb3IgZXN0YSByYXrDs24sIA0KJCRBIEFeVCBcOz0gXDsgSV9LJCQNCkFxdcOtLCAkSV9LJCBlcyBsYSBtYXRyaXogaWTDqW50aWNhIGRlIHRhbWHDsW8gJEskICh0aWVuZSAxcyBlbiBsYSBkaWFnb25hbCBwcmluY2lwYWwgeSAwcyBlbiBsYXMgb3RyYXMgY2VsZGFzKTogDQoNCiQkSV9LIFw7PVw7IFxiZWdpbntwbWF0cml4fQ0KMSAmICAwJiBcY2RvdHMgJjAgXFwgDQowICYgMSYgXGNkb3RzICYwIFxcIA0KXHZkb3RzICYgXHZkb3RzICYgXGRkb3RzICZcdmRvdHMgXFwgDQowICYgIDAmIFxjZG90cyAmMQ0KXGVuZHtwbWF0cml4fSQkDQoNCjwhLS0gJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSAtLT4NCjwhLS0gU2VwYXJhZG9yIC0tPg0KDQoqKlByb3BpZWRhZCA4OioqDQoNClRlbmllbmRvIGVuIGN1ZW50YSBsYXMgcHJvcGllZGFkZXMgNiB5IDc6IA0KDQokJFxTaWdtYSBcOz1cOyBBXlQgXCxcTGFtYmRhIFwsQSQkDQoNCjwhLS0gJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSAtLT4NCjwhLS0gU2VwYXJhZG9yIC0tPg0KDQojIyMgUG9yY2VudGFqZXMgZGUgdmFyaWFiaWxpZGFkDQoNCioqUHJvcGllZGFkIDk6KioNCg0KTGEgdmFyaWFuemEgdG90YWwgZGUgbG9zIGNvbXBvbmVudGVzIGVzIGxhIHN1bWEgZGUgdG9kb3MgbG9zIGF1dG92YWxvcmVzLCBlcyBkZWNpciwgbGEgdHJhemEgZGUgbGEgbWF0cml6ICRcTGFtYmRhJCAoeWEgcXVlIGVzIGRpYWdvbmFsKTogDQoNCiQkXG1ib3h7VmFyaWFuemEgdG90YWx9XDs9XDsgXHN1bVxsaW1pdHNfe2s9MX1eSyBWKFlfaykgXDsgPSBcOyBcc3VtXGxpbWl0c197az0xfV5LIFxsYW1iZGFfayBcOyA9IFw7IFxtYm94e3RyYXphfVwsKFxMYW1iZGEpJCQNCg0KPCEtLSAlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlIC0tPg0KPCEtLSBTZXBhcmFkb3IgLS0+DQoNCioqUHJvcGllZGFkIDEwOioqDQoNClRlbmllbmRvIGVuIGN1ZW50YSBsYXMgcHJvcGllZGFkZXMgNiAoJFxMYW1iZGEgPSBBXlQgXCxcU2lnbWEgXCxBJCkgeSA3ICgkQSBBXlQgXDs9IFw7IElfSyQpIHkgcG9yIHByb3BpZWRhZGVzIGRlbCBvcGVyYWRvciB0cmF6YTogDQoNCiQkXG1ib3h7dHJhemF9XCwoXExhbWJkYSkgXDs9XDsgXG1ib3h7dHJhemF9XCxcbGVmdChBXlQgXCxcU2lnbWEgXCxBXHJpZ2h0KSBcOyA9XDsgXG1ib3h7dHJhemF9XCxcbGVmdChcU2lnbWEgXCxBXlQgXCxBXHJpZ2h0KSBcOyA9XDsgXG1ib3h7dHJhemF9XCwoXFNpZ21hKSQkDQoNCjwhLS0gJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSAtLT4NCjwhLS0gU2VwYXJhZG9yIC0tPg0KDQoqKlByb3BpZWRhZCAxMToqKg0KDQpMYSBzdW1hIGRlIGxhcyB2YXJpYW56YXMgZGUgbGFzIHZhcmlhYmxlcyBvcmlnaW5hbGVzIHkgbGEgc3VtYSBkZSBsYXMgdmFyaWFuemFzIGRlIGxhcyBjb21wb25lbnRlcyBzb24gaWd1YWxlcyAodmVyIHByb3BpZWRhZGVzIDkgeSAxMCk6DQoNCiQkXG1ib3h7VmFyaWFuemEgdG90YWx9XDs9XDsgXG1ib3h7dHJhemF9XCwoXExhbWJkYSkgXDsgPVw7IFxtYm94e3RyYXphfVwsKFxTaWdtYSlcOyA9XDsgXHN1bVxsaW1pdHNfe2s9MX1eSyBWYXIoWF9rKSQkDQoNCjwhLS0gJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSAtLT4NCjwhLS0gU2VwYXJhZG9yIC0tPg0KDQoqKlByb3BpZWRhZCAxMjoqKg0KDQpMYSBwcm9wb3JjacOzbiBkZSB2YXJpYW56YSB0b3RhbCBxdWUgcmVjb2dlIGVsIGNvbXBvbmVudGUgcHJpbmNpcGFsICRZX2skIGVzOiANCg0KJCQgXG1ib3h7UHJvcC59XDsgVihZX2spIFw7PVw7IFxmcmFje1xsYW1iZGFfa317XG1ib3h7VmFyaWFuemEgdG90YWx9fSQkDQoNClNpIG11bHRpcGxpY2Ftb3MgcG9yIDEwMCB0ZW5kcmVtb3MgZWwgcG9yY2VudGFqZSBjb3JyZXNwb25kaWVudGUuDQoNCjwhLS0gJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSAtLT4NCjwhLS0gU2VwYXJhZG9yIC0tPg0KDQoqKlByb3BpZWRhZCAxMzoqKg0KDQpFbCBwb3JjZW50YWplIGRlIHZhcmlhYmlsaWRhZCByZWNvZ2lkbyBwb3IgbG9zIHByaW1lcm9zICRKJCBjb21wb25lbnRlczoNCg0KJCQgXG1ib3h7UHJvcC59XDsgVihZX3sxXHRvIEp9KSBcOz1cOyBcZnJhY3tcc3VtXGxpbWl0c197aj0xfV5KIFxsYW1iZGFfa317XG1ib3h7VmFyaWFuemEgdG90YWx9fSAgJCQNCmRvbmRlICRKPEskLiBTaSBtdWx0aXBsaWNhbW9zIHBvciAxMDAgdGVuZHJlbW9zIGVsIHBvcmNlbnRhamUgY29ycmVzcG9uZGllbnRlLg0KDQoNCg0KRW4gbGEgYXBsaWNhY2nDs24gcHLDoWN0aWNhLCBjdWFuZG8gaW5pY2lhbG1lbnRlIHRlbmVtb3MgJEskIHZhcmlhYmxlcywgZ2VuZXJhbG1lbnRlIHNlbGVjY2lvbmFtb3MgdW4gbsO6bWVybyBjb25zaWRlcmFibGVtZW50ZSBtZW5vciBkZSBjb21wb25lbnRlcyBwcmluY2lwYWxlcyBxdWUgY2FwdHVyYW4gdW5hIGdyYW4gcHJvcG9yY2nDs24gZGUgbGEgdmFyaWFiaWxpZGFkIHRvdGFsLiBQb3IgbG8gZ2VuZXJhbCwgc2UgcHJlZmllcmUgbm8gZWxlZ2lyIG3DoXMgZGUgdHJlcyBjb21wb25lbnRlcyBwcmluY2lwYWxlcywgc2kgZXMgcG9zaWJsZSwgcGFyYSBwb2RlciByZXByZXNlbnRhcmxvcyBkZSBtYW5lcmEgZWZlY3RpdmEgZW4gZ3LDoWZpY29zIHN1YnNpZ3VpZW50ZXMuDQoNCjwhLS0gJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSAtLT4NCjwhLS0gU2VwYXJhZG9yIC0tPg0KDQojIFByb3BpZWRhZGVzIHNlZ8O6biBsYSBtYXRyaXogZGUgY29ycmVsYWNpb25lcw0KDQpOb3JtYWxtZW50ZSwgc2UgY29tcHV0YW4gbG9zIGNvbXBvbmVudGVzIHV0aWxpemFuZG8gdmFyaWFibGVzIHF1ZSBoYW4gc2lkbyBlc3RhbmRhcml6YWRhcywgbG8gcXVlIHNpZ25pZmljYSBxdWUgdGllbmVuIHVuYSBtZWRpYSBkZSAwIHkgdW5hIHZhcmlhbnphIGRlIDEuIEVzdGEgcHLDoWN0aWNhIGltcGxpY2EgY2FsY3VsYXIgbG9zIGNvbXBvbmVudGVzIHByaW5jaXBhbGVzIG5vIGEgcGFydGlyIGRlIGxhIG1hdHJpeiBkZSBjb3ZhcmlhbnphcyAkXFNpZ21hJCwgc2lubyBkZSBsYSBtYXRyaXogZGUgY29ycmVsYWNpb25lcyAkUiQuIEVuIGVsIGNhc28gZGUgbGFzIHZhcmlhYmxlcyBlc3RhbmRhcml6YWRhcywgbGFzIGNvdmFyaWFuemFzIHkgbGFzIGNvcnJlbGFjaW9uZXMgY29pbmNpZGVuLg0KDQpQb3IgbG8gdGFudG8sIGxvcyBjb21wb25lbnRlcyByZXN1bHRhbnRlcyBzb24gYXV0b3ZlY3RvcmVzIGRlIGxhIG1hdHJpeiBkZSBjb3JyZWxhY2lvbmVzLCBsb3MgY3VhbGVzIGRpZmllcmVuIGRlIGxvcyBvYnRlbmlkb3MgYSBwYXJ0aXIgZGUgbGEgbWF0cml6IGRlIGNvdmFyaWFuemFzLiBBbCBzZWd1aXIgZXN0ZSBlbmZvcXVlLCB0b2RhcyBsYXMgdmFyaWFibGVzIG9yaWdpbmFsZXMgc29uIHRyYXRhZGFzIGNvbiBpZ3VhbCBpbXBvcnRhbmNpYS4NCg0KRW4gbGEgbWF0cml6IGRlIGNvcnJlbGFjaW9uZXMsIHRvZG9zIGxvcyBlbGVtZW50b3MgZGlhZ29uYWxlcyB0aWVuZW4gdW4gdmFsb3IgZGUgMS4gRWwgcHJvY2VkaW1pZW50byBlcyBpZ3VhbCBhbCBxdWUgc2UgaGFjZSBhIHBhcnRpciBkZSBsYSBtYXRyaXogZGUgdmFyaWFuemFzIHkgY292YXJpYW56YXMgLCBzw7NsbyBxdWUgc2Ugc3VzdGl0dXllICRcU2lnbWEkIHBvciAkUiQuIEV4aXN0ZW4gYWxndW5hcyBkaWZlcmVuY2lhcyBlbiBsYSBpbnRlcnByZXRhY2nDs24uIExhcyBtw6FzIGltcG9ydGFudGVzDQpzZSBlbnVtZXJhbiBlbmxhcyBwcm9waWVkYWRlcyBzaWd1aWVudGVzLiANCg0KPCEtLSAlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlIC0tPg0KPCEtLSBTZXBhcmFkb3IgLS0+DQoNCioqUHJvcGllZGFkIDE0OioqDQoNClNpIGxhcyB2YXJpYWJsZXMgb3JpZ2luYWxlcyBoYW4gc2lkbyB0aXBpZmljYWRhcywgZXN0byBpbXBsaWNhIHF1ZSBzdSBtYXRyaXogZGUgY292YXJpYW56YXMgZXMgaWd1YWwgYSBsYSBtYXRyaXogZGUgY29ycmVsYWNpb25lcy4gRW4gY29uc2VjdWVuY2lhLCBsYSB2YXJpYWJpbGlkYWQgdG90YWwgKGxhIHRyYXphKSBlcyBpZ3VhbCBhbCBuw7ptZXJvIHRvdGFsIGRlIHZhcmlhYmxlcyBlbiBsYSBtdWVzdHJhOg0KDQokJFxtYm94e1ZhcmlhbnphIHRvdGFsfVw7PVw7IFxzdW1cbGltaXRzX3trPTF9XksgVmFyKFhfaylcOyA9XDsgXHN1bVxsaW1pdHNfe2s9MX1eSyAxIFw7PSBcOyBLJCQNCg0KPCEtLSAlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlIC0tPg0KPCEtLSBTZXBhcmFkb3IgLS0+DQoNCioqUHJvcGllZGFkIDE1OioqDQoNCkxhIHN1bWEgZGUgdG9kb3MgbG9zIGF1dG92YWxvcmVzIGVzICRLJDoNCg0KJCQgXHN1bVxsaW1pdHNfe2s9MX1eSyBcbGFtYmRhX2sgXDsgPSBcOyAgSyQkDQoNCjwhLS0gJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSAtLT4NCjwhLS0gU2VwYXJhZG9yIC0tPg0KDQoqKlByb3BpZWRhZCAxNjoqKg0KDQpMYSBwcm9wb3JjacOzbiBkZSB2YXJpYW56YSBleHBsaWNhZGEgcG9yIGVsICRrJC3DqXNpbW8gYXV0b3ZlY3RvciAoY29tcG9uZW50ZSkgZXM6DQoNCiQkIFxtYm94e1Byb3AufVw7IFYoWV9rKSBcOz1cOyBcZnJhY3tcbGFtYmRhX2t9e1xtYm94e1ZhcmlhbnphIHRvdGFsfX0gPSBcZnJhY3tcbGFtYmRhX2t9e0t9JCQNCg0KPCEtLSAlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlIC0tPg0KPCEtLSBTZXBhcmFkb3IgLS0+DQoNCioqUHJvcGllZGFkIDE3OioqDQoNCkVsIHBvcmNlbnRhamUgZGUgdmFyaWFiaWxpZGFkIHJlY29naWRvIHBvciBsb3MgcHJpbWVyb3MgJEokIGNvbXBvbmVudGVzOg0KDQokJCBcbWJveHtQcm9wLn1cOyBWKFlfezFcdG8gSn0pIFw7PVw7IFxmcmFje1xzdW1cbGltaXRzX3tqPTF9XkogXGxhbWJkYV9rfXtcbWJveHtWYXJpYW56YSB0b3RhbH19ICBcOz0gXDsgXGZyYWN7XHN1bVxsaW1pdHNfe2o9MX1eSiBcbGFtYmRhX2t9e0t9JCQNCg0KPCEtLSAlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlIC0tPg0KPCEtLSBTZXBhcmFkb3IgLS0+DQoNCioqUHJvcGllZGFkIDE4OioqDQoNCkxhIGNvcnJlbGFjacOzbiBlbnRyZSAgJFhfayQgeSBsYSBjb21wb25lbnRlIHByaW5jaXBhbCAkWV9qJCBlczogDQoNCiQkQ29ycihYX2ssIFlfaikgXDs9IFw7IFxmcmFje2Ffe2prfVwsIFxzcXJ0e1xsYW1iZGFfan19e1xzcXJ0e3Nfe2trfX19JCQNCmxhIGN1YWwgc3VtaW5pc3RyYSBsYSBwb25kZXJhY2nDs24gKG8gZ3JhZG8gZGUgaW1wb3J0YW5jaWEpIGRlIGxhICRrJC3DqXNpbWEgdmFyaWFibGUgc29icmUgbGEgJGokLcOpc2ltYSBjb21wb25lbnRlIHByaW5jaXBhbC4gTywgZGljaG8gZGUgb3RyYSBmb3JtYSwgaW5kaWNhIGVsIGdyYWRvIGRlIGFzb2NpYWNpw7NuIGVudHJlIGxhIHZhcmlhYmxlIHkgbGEgcmVzcGVjdGl2YSBjb21wb25lbnRlLiANCg0KDQo8IS0tICUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUgLS0+DQo8IS0tIFNlcGFyYWRvciAtLT4NCg0KDQoqKlByb3BpZWRhZCAxOToqKg0KDQpDdWFuZG8gc2UgcHJlc2VudGFuIGxvcyBhdXRvdmVjdG9yZXMsIHNlIGxlcyBzdWVsZSBtdWx0aXBsaWNhciBwcmV2aWFtZW50ZSBwb3IgJFxzcXJ0e1xsYW1iZGFfan0kIChkZWwgYXV0b3ZhbG9yIGNvcnJlc3BvbmRpZW50ZSksIHBhcmEgcmVlc2NhbGFyIHRvZG9zIGxvcyBjb21wb25lbnRlcyBkZWwgbWlzbW8gbW9kby4gRGUgZXN0YSBtYW5lcmEsIHNlIGNhbGN1bGEgbGEgcG9uZGVyYWNpw7NuIGRlIGxhIHZhcmlhYmxlICRrJCwgZW4gbGEgJGokLcOpc2ltYSBjb21wb25lbnRlIGNvbW86DQoNCiQkYV97amt9XipcOz0gXDsgYV97amt9XCwgXHNxcnR7XGxhbWJkYV9qfSQkDQo8IS0tICUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUgLS0+DQo8IS0tIFNlcGFyYWRvciAtLT4NCg0KIyBTZWxlY2Npw7NuIGRlbCBuw7ptZXJvIGRlIGNvbXBvbmVudGVzIHByaW5jaXBhbGVzDQoNCkxhIGVsZWNjacOzbiBkZWwgbsO6bWVybyBkZSBjb21wb25lbnRlcyBwcmluY2lwYWxlcyBzZSBiYXNhIGVuIGNyaXRlcmlvcyBlbXDDrXJpY29zIHF1ZSBjb25zaWRlcmFuIGxhIHZhcmlhYmlsaWRhZCBxdWUgc2UgZGVzZWEgbWFudGVuZXIgZW4gdW5hIHNpdHVhY2nDs24gcGFydGljdWxhci4gRGVzYWZvcnR1bmFkYW1lbnRlLCBubyBleGlzdGUgdW5hIGZvcm1hIG9iamV0aXZhIHkgYmllbiBhY2VwdGFkYSBkZSBkZWNpZGlyIGN1w6FudG9zIGNvbXBvbmVudGVzIHByaW5jaXBhbGVzIHNvbiBzdWZpY2llbnRlcy4gQSBjb250aW51YWNpw7NuLCBkZXNjcmliaXJlbW9zIGFsZ3Vub3MgbcOpdG9kb3MgZ2VuZXJhbGVzLiAgDQoNCg0KPCEtLSAlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlIC0tPg0KPCEtLSBTZXBhcmFkb3IgLS0+DQoNCiMjIyBQcmltZXJhIGZvcm1hOiBDb24gZWwgcG9yY2VudGFqZSBkZSB2YXJpYW56YSBleHBsaWNhZGENCg0KU2UgZXNjb2dlbiAkSjxLJCBjdWFuZG8gZWwgcG9yY2VudGFqZSBkZSB2YXJpYWJpbGlkYWQgcmVjb2dpZG8gcG9yIGxvcyBwcmltZXJvcyAkSiQgY29tcG9uZW50ZXMgJFxtYm94e1Byb3AufVw7IFYoWV97MVx0byBKfSkkIGVzICJncmFuZGUiLCBkZSB0YWwgZm9ybWEgcXVlIGxhIHByb3BvcmNpw7NuIGRlIHZhcmlhbnphIGV4cGxpY2FkYSAkXG1ib3h7UHJvcC59XDsgVihZX2opJCB0b2RvcyBsb3MgJGo8SiQtw6lzaW1vcyBhdXRvdmVjdG9yZXMgKGNvbXBvbmVudGUpIHRhbWJpw6luIGxvIHNlYW4gKGVzIGRlY2lyLCAgc2VsZWNjaW9uYXIgZWwgbsO6bWVybyBkZSBjb21wb25lbnRlcyBtw61uaW1vIGEgcGFydGlyIGRlbCBjdWFsIGVsIGluY3JlbWVudG8gZGVqYSBkZSBzZXIgc3VzdGFuY2lhbCkuICBEZSBlc3RhIGZvcm1hLCBzZSBwdWVkZW4gcmVlbXBsYXphciAkWF8xJCwgJFhfMiQsICRcbGRvdHMkLCAkWF9LJCBwb3IgJFlfMSQsICRcbGRvdHMkLCAkWV9KJCBzaW4gcMOpcmRpZGEgZGUgaW5mb3JtYWNpw7NuLiANCg0KDQo8IS0tICUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUgLS0+DQo8IS0tIFNlcGFyYWRvciAtLT4NCg0KIyMjIFNlZ3VuZGEgZm9ybWE6IFZhbG9yZXMgcHJvcGlvcw0KDQpDdWFuZG8gdXRpbGl6YW1vcyBsYSBtYXRyaXogZGUgY29ycmVsYWNpb25lcyxsb3MgdmFsb3JlcyBwcm9waW9zIHB1ZWRlbiB1dGlsaXphcnNlIHBhcmEgZGV0ZXJtaW5hciBlbCBuw7ptZXJvIGRlIGNvbXBvbmVudGVzIHByaW5jaXBhbGVzIHF1ZSBkZWJlbiBjb25zZXJ2YXJzZSBkZXNwdcOpcyBkZWwgUENBOg0KDQorIFVuIHZhbG9yIHByb3BpbyA+IDEgaW5kaWNhIHF1ZSBsYXMgUEMgZXhwbGljYW4gbcOhcyB2YXJpYW56YSBxdWUgbGEgZXhwbGljYWRhIHBvciB1bmEgZGUgbGFzIHZhcmlhYmxlcyBvcmlnaW5hbGVzIGVuIGxvcyBkYXRvcyBlc3RhbmRhcml6YWRvcy4gU2Ugc3VlbGUgdXRpbGl6YXIgY29tbyBwdW50byBkZSBjb3J0ZSBwYXJhIHJldGVuZXIgbG9zIENQLiBFc3RvIHPDs2xvIGVzIGNpZXJ0byBjdWFuZG8gbG9zIGRhdG9zIGVzdMOhbiBlc3RhbmRhcml6YWRvcy4NCg0KKyBUYW1iacOpbiBwdWVkZSBsaW1pdGFyIGVsIG7Dum1lcm8gZGUgY29tcG9uZW50ZXMgYWwgbsO6bWVybyBxdWUgcmVwcmVzZW50ZSB1bmEgZGV0ZXJtaW5hZGEgZnJhY2Npw7NuIGRlIGxhIHZhcmlhbnphIHRvdGFsLiAgUG9yIGVqZW1wbG8sIHNpIGVzdMOhIHNhdGlzZmVjaG8gY29uIGVsIDcwJSBkZSBsYSB2YXJpYW56YSB0b3RhbCBleHBsaWNhZGEsIGVudG9uY2VzIHV0aWxpY2UgZWwgbsO6bWVybyBkZSBjb21wb25lbnRlcyBwYXJhIGNvbnNlZ3VpcmxvLg0KDQoNCjwhLS0gJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSAtLT4NCjwhLS0gU2VwYXJhZG9yIC0tPg0KDQojIyMgVGVyY2VyYSBmb3JtYTogTcOpdG9kb3MgZ3LDoWZpY29zDQoNClVuIG3DqXRvZG8gYWx0ZXJuYXRpdm8gcGFyYSBkZXRlcm1pbmFyIGVsIG7Dum1lcm8gZGUgY29tcG9uZW50ZXMgcHJpbmNpcGFsZXMgZXMgb2JzZXJ2YXIgdW4gKipTY3JlZSBQbG90KiouIEVzIHVuIGdyw6FmaWNvIHF1ZSBzZSByZXByZXNlbnRhIGVuIHVuIHNpc3RlbWEgZGUgY29vcmRlbmFkYXMgY2FydGVzaWFuYXMuIExhcyBjb29yZGVuYWRhcyBkZSBsb3MgcHVudG9zICBjb3JyZXNwb25kZW4gYSBsYXMgY29tcG9uZW50ZXMgcHJpbmNpcGFsZXMgKGVqZSBYKSB5IGxvcyB2YWxvcmVzIHByb3Bpb3MgKGVqZSBZKSwgb3JkZW5hZG9zIGRlIG1heW9yIGEgbWVub3IgKGNvbW8gc2UgbXVlc3RyYSBlbiBsYSBmaWd1cmEgIFxAcmVmKGZpZzpTY3JlZTEpKS4gRWwgbsO6bWVybyBkZSBjb21wb25lbnRlcyBzZSBkZXRlcm1pbmEgZW4gZWwgcHVudG8gYSBwYXJ0aXIgZGVsIGN1YWwgbG9zIHZhbG9yZXMgcHJvcGlvcyByZXN0YW50ZXMgc29uIHRvZG9zIHJlbGF0aXZhbWVudGUgcGVxdWXDsW9zIHkgZGUgdGFtYcOxbyBjb21wYXJhYmxlLg0KDQoNCg0KPGNlbnRlcj4NCg0KYGBge3IgU2NyZWUxLCBlY2hvPUZBTFNFLCBmaWcuY2FwID0gIioqU2NyZWUqKiIsIG91dC53aWR0aCA9ICI2MCUifQ0KIyBmaWcud2lkdGggPSAyMCAjIE5vIGZ1bmNpb25hIGVzdGEgb3BjaW9uIGVuIGVsIGNodW5rDQoNCiNodHRwOi8vemV2cm9zcy5jb20vYmxvZy8yMDE3LzA2LzE5L3RpcHMtYW5kLXRyaWNrcy1mb3Itd29ya2luZy13aXRoLWltYWdlcy1hbmQtZmlndXJlcy1pbi1yLW1hcmtkb3duLWRvY3VtZW50cy8NCiMgUGFnaW5hIDM1OSBkZSBSMjAxNS1GcmllbmRseQ0KDQprbml0cjo6aW5jbHVkZV9ncmFwaGljcygiU2NyZWUxLnBuZyIpDQoNCiNPdHJhIG1hbmVyYSwgcGVybyAgc2FsZSBlbCBjYXB0aW9uOg0KIzxjZW50ZXI+DQojIVsoI2ZpZzpGaWctY2FwdGlvbikgTWkgZmlndXJhXShOb21icmUucG5nKXt3aWR0aD00MDBweH0NCiM8L2NlbnRlcj4NCmBgYA0KPC9jZW50ZXI+DQoNCg0KDQoNCjwhLS0gJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSAtLT4NCjwhLS0gU2VwYXJhZG9yIC0tPg0KDQojIEludGVycHJldGFjacOzbiBkZSBsYXMgY29tcG9uZW50ZXMgcHJpbmNpcGFsZXMNCg0KMS4gQ3VhbmRvIHRvZGFzIGxhcyB2YXJpYWJsZXMgcHJlc2VudGFuIHVuYSBmdWVydGUgY29ycmVsYWNpw7NuIHBvc2l0aXZhLCBlbCBwcmltZXIgY29tcG9uZW50ZSBwcmluY2lwYWwgcHJlc2VudGEgdG9kYXMgc3VzIGNvb3JkZW5hZGFzIGNvbiBtaXNtbyBzaWduby4gRXN0ZSBoZWNobyByZXByZXNlbnRhIHVuIHByb21lZGlvIHBvbmRlcmFkbyBkZSB0b2RhcyBsYXMgdmFyaWFibGVzLiBFc3RhIGNvbXBvbmVudGUgc2UgaW50ZXJwcmV0YSBjb21vIHVuIGZhY3RvciBnbG9iYWwgZGUgKip0YW1hw7FvKiouIA0KDQoyLiBQb3Igb3RybyBsYWRvLCBsYXMgY29tcG9uZW50ZXMgcmVzdGFudGVzIHNlIGNvbnNpZGVyYW4gZmFjdG9yZXMgZGUgKipmb3JtYSoqIHkgZ2VuZXJhbG1lbnRlIG11ZXN0cmFuIGNvb3JkZW5hZGFzIHBvc2l0aXZhcyB5IG5lZ2F0aXZhcywgaW5kaWNhbmRvIHF1ZSBjb250cmFzdGFuIHVub3MgZ3J1cG9zIGRlIHZhcmlhYmxlcyBjb24gb3Ryb3MuIEVzdG9zIGZhY3RvcmVzIGRlIGZvcm1hIGEgbWVudWRvIHB1ZWRlbiBleHByZXNhcnNlIGNvbW8gbWVkaWFzIHBvbmRlcmFkYXMgZGUgZG9zIGNvbmp1bnRvcyBkZSB2YXJpYWJsZXMgY29uIHNpZ25vcyBvcHVlc3RvcywgbG8gcXVlIGNvbnRyYXBvbmUgbGFzIHZhcmlhYmxlcyBkZSB1biBncnVwbyBjb24gbGFzIGRlbCBvdHJvLg0KDQoNCjwhLS0gJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSAtLT4NCjwhLS0gU2VwYXJhZG9yIC0tPg0KDQojIEVqZW1wbG8gMTogTm9ybWFsIHRyaWRpbWVuc2lvbmFsDQoNCkVuIGVzdGUgZWplbXBsbyB0ZW5lcm1vcyB1bmEgZGlzdHJpYnVjacOzbiBub3JtYWwgY29uIGxvcyBzaWd1aWVudGVzIHBhcsOhbWV0cm9zOiANCg0KJCRcbXUgPSBcYmVnaW57Ym1hdHJpeH0gMCAgXFw1IFxcIDIgXGVuZHtibWF0cml4fSwgXHFxdWFkIFxTaWdtYSA9ICBcYmVnaW57Ym1hdHJpeH0gMjUgJiAtMSAmIDcgIFxcLTEgJiA0ICYgLTQgXFwNCjcgJiAgLTQgJiAxMFxlbmR7Ym1hdHJpeH0kJA0KDQpCYWpvIGVzdGFzIGNvbmRpY2lvbmVzLCBlbCBkaWdyYW1hIGRlIGRpc3BlcnNpw7NuIGNvcnJlc3BvbmRpZW50ZSBlcyBjb21vIHNlIG11ZXN0cmEgZW4gbGEgZmlndXJhIFxAcmVmKGZpZzpOb3JtYWwxKSwgc2UgbXVlc3RyYSBsYSB0cmFuc2Zvcm1hY2nDs24gY29ycmVzcG9uZGllbnRlLg0KDQoNCg0KPGNlbnRlcj4NCmBgYHtyIE5vcm1hbDEsIGVjaG89RkFMU0UsIGZpZy5jYXAgPSAiKipEaXN0cmlidWNpw7NuIG5vcm1hbCB0cmlkaW1lbnNpb25hbCoqIiwgb3V0LndpZHRoID0gIjUwJSJ9DQojIGZpZy53aWR0aCA9IDIwICMgTm8gZnVuY2lvbmEgZXN0YSBvcGNpb24gZW4gZWwgY2h1bmsNCg0KI2h0dHA6Ly96ZXZyb3NzLmNvbS9ibG9nLzIwMTcvMDYvMTkvdGlwcy1hbmQtdHJpY2tzLWZvci13b3JraW5nLXdpdGgtaW1hZ2VzLWFuZC1maWd1cmVzLWluLXItbWFya2Rvd24tZG9jdW1lbnRzLw0KIyBQYWdpbmEgMzU5IGRlIFIyMDE1LUZyaWVuZGx5DQoNCmtuaXRyOjppbmNsdWRlX2dyYXBoaWNzKCJOb3JtYWwxLnBuZyIpDQoNCiNPdHJhIG1hbmVyYSwgcGVybyAgc2FsZSBlbCBjYXB0aW9uOg0KIzxjZW50ZXI+DQojIVsoI2ZpZzpGaWctY2FwdGlvbikgTWkgZmlndXJhXShOb21icmUucG5nKXt3aWR0aD00MDBweH0NCiM8L2NlbnRlcj4NCmBgYA0KPC9jZW50ZXI+DQoNCg0KRW4gbGEgZmlndXJhIFxAcmVmKGZpZzpOb3JtYWwyKSwgc2UgbXVlc3RyYW4gbG9zIHRyZXMgcGFyZXMgZGUgcHJveWVjY2lvbmVzIGRlIGNvbXBvbmVudGVzIHByaW5jaXBhbGVzLiANCg0KDQo8Y2VudGVyPg0KYGBge3IgTm9ybWFsMiwgZWNobz1GQUxTRSwgZmlnLmNhcCA9ICIqKlByb3llY2Npb25lcyBkZSB1bmEgZGlzdHJpYnVjacOzbiBub3JtYWwgdHJpZGltZW5zaW9uYWwqKiIsIG91dC53aWR0aCA9ICIxMDAlIn0NCiMgZmlnLndpZHRoID0gMjAgIyBObyBmdW5jaW9uYSBlc3RhIG9wY2lvbiBlbiBlbCBjaHVuaw0KDQojaHR0cDovL3pldnJvc3MuY29tL2Jsb2cvMjAxNy8wNi8xOS90aXBzLWFuZC10cmlja3MtZm9yLXdvcmtpbmctd2l0aC1pbWFnZXMtYW5kLWZpZ3VyZXMtaW4tci1tYXJrZG93bi1kb2N1bWVudHMvDQojIFBhZ2luYSAzNTkgZGUgUjIwMTUtRnJpZW5kbHkNCg0Ka25pdHI6OmluY2x1ZGVfZ3JhcGhpY3MoIk5vcm1hbDIucG5nIikNCg0KI090cmEgbWFuZXJhLCBwZXJvICBzYWxlIGVsIGNhcHRpb246DQojPGNlbnRlcj4NCiMhWygjZmlnOkZpZy1jYXB0aW9uKSBNaSBmaWd1cmFdKE5vbWJyZS5wbmcpe3dpZHRoPTQwMHB4fQ0KIzwvY2VudGVyPg0KYGBgDQo8L2NlbnRlcj4NCg0KKipPYnPDqXJ2ZXNlIHF1ZToqKg0KDQoxLiBMYSBwcmltZXJhIHByb3llY2Npw7NuIHRpZW5lIGxhIG1heW9yIHZhcmlhbnphLCBzZWd1aWRhIGRlIGxhIHNlZ3VuZGEgcHJveWVjY2nDs24uIA0KDQoyLiBMYXMgcHJveWVjY2lvbmVzIFBDQSBoYWNlbiBxdWUgbG9zIGVqZXMgbm8gZXN0w6luIGNvcnJlbGFjaW9uYWRvcy4NCg0KDQo8IS0tICUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUgLS0+DQo8IS0tIFNlcGFyYWRvciAtLT4NCg0KIyBFamVtcGxvIDI6IERhdG9zIGBzdXJ2ZXlgDQoNCiMjIyBFbnVuY2lhZG8NCg0KYGBge3IsIGV2YWw9RkFMU0UsIGVjaG89RkFMU0V9DQpMb3MgZGF0b3MgdXRpbGl6YWRvcyBlbiBlc3RlIGVqZW1wbG8gZGVzY3JpYmVuIGVsIHJlbmRpbWllbnRvIGRlIGxvcyBhdGxldGFzIGR1cmFudGUgZG9zIGV2ZW50b3MgZGVwb3J0aXZvcyAoRGVzY3RhciB5IE9seW1waWNHKS4gQ29udGllbmUgMjcgaW5kaXZpZHVvcyAoYXRsZXRhcykgZGVzY3JpdG9zIG1lZGlhbnRlIDEzIHZhcmlhYmxlcy4gQ29uIGVzdG9zIGRhdG9zIGxsZXZhcmVtb3MgYSBjYWJvIHVuIFBDQS4gDQoNCg0KI2BgYHtyLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KZGF0b3NDb21wbGV0byA8LSBmYWN0b2V4dHJhOjpkZWNhdGhsb24yDQphdHRhY2goZGF0b3NDb21wbGV0bykNCiNgYGANCg0KDQojYGBge3IsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQpuYW1lcyhkYXRvc0NvbXBsZXRvKQ0KI2BgYA0KDQpTZSByZXNhbHRhIHF1ZSBzw7NsbyBhbGd1bm9zIGRlIGVzdG9zIGluZGl2aWR1b3MgeSB2YXJpYWJsZXMgc2UgdXRpbGl6YXLDoW4gcGFyYSByZWFsaXphciBlbCBhbsOhbGlzaXMgZGUgY29tcG9uZW50ZXMgcHJpbmNpcGFsZXMuIA0KDQojYGBge3IgZXZhbD1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCmRhdCA8LSBkYXRvc0NvbXBsZXRvWzE6MjMsIDE6MTBdDQphdHRhY2goZGF0KQ0KaGVhZChkYXQsNCkpIA0KI2BgYA0KDQojYGBge3IgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCmRhdCA8LSBkYXRvc0NvbXBsZXRvWzE6MjMsIDE6MTBdDQphdHRhY2goZGF0KQ0Ka2FibGUoaGVhZChkYXQsNCksYWxpZ24gPSAiY2NjIikgJT4lIyBTZSBuZWNlc2l0YSBsaWJyYXJ5KGtuaXRyKSANCmthYmxlX3N0eWxpbmcoKSAlPiUgICAgICAgICAgICAgICAgI2xpYnJhcnkoa2FibGVFeHRyYSkuLi4uIFNvbG8gcGFyYSBrbml0IHRvIGh0bWwNCmthYmxlX2NsYXNzaWNfMihmdWxsX3dpZHRoID0gRikgICAjbGlicmFyeShrYWJsZUV4dHJhKS4uLi5Tb2xvIHBhcmEga25pdCB0byBodG1sDQojYGBgDQpgYGANCg0KDQoNCg0KDQpMb3MgZGF0b3Mgc2UgcmVjb2dpZXJvbiBhcGxpY2FuZG8gdW5hIGVuY3Vlc3RhIGEgdW5hIG11ZXN0cmEgZGUgZXN0dWRpYW50ZXMgdW5pdmVyc2l0YXJpb3MuIEVzIHVuIGRhdGEgZnJhbWUgY29uIDgwMCBvYnNlcnZhY2lvbmVzIHkgNjYgdmFyaWFibGVzLiBDb24gZXN0b3MgZGF0b3MgbGxldmFyZW1vcyBhIGNhYm8gdW4gUENBLiANCg0KDQpgYGB7ciwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCmRhdG9zQ29tcGxldG8gPC0gbHNtOjpzdXJ2ZXkNCiNkYXRvc0NvbXBsZXRvIDwtIHRleHRzaGFwZTo6Y29sdW1uX3RvX3Jvd25hbWVzKGRhdCwgbG9jPTEpDQojZGF0b3NDb21wbGV0byAlPiUgcmVtb3ZlX3Jvd25hbWVzICU+JSBjb2x1bW5fdG9fcm93bmFtZXModmFyPSJuYW1lcyIpICAgI2xpYnJhcnkodGlkeXZlcnNlKQ0KYXR0YWNoKGRhdG9zQ29tcGxldG8pDQpgYGANCg0KDQpgYGB7ciwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCm5hbWVzKGRhdG9zQ29tcGxldG8pDQpgYGANCg0KU2UgcmVzYWx0YSBxdWUgc8OzbG8gYWxndW5vcyBkZSBlc3RvcyBpbmRpdmlkdW9zIHkgdmFyaWFibGVzIHNlIHV0aWxpemFyw6FuIHBhcmEgcmVhbGl6YXIgZWwgYW7DoWxpc2lzIGRlIGNvbXBvbmVudGVzIHByaW5jaXBhbGVzLiANCg0KDQpgYGB7ciBldmFsPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KZGF0IDwtIGRhdG9zQ29tcGxldG9bMToyMywgMjE6MzBdDQphdHRhY2goZGF0KQ0KaGVhZChkYXQsNCkgDQpgYGANCg0KDQoNCmBgYHtyIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQojZGF0IDwtIGRhdG9zQ29tcGxldG9bMToyMywgYyg1LDcsOCw5LDEzLDE1LDIxLDI3LDI5LDMwKV0gIyBwcmltZXIgaW50ZW50bw0KZGF0IDwtIGRhdG9zQ29tcGxldG9bMToyMywgMjE6MzBdDQphdHRhY2goZGF0KQ0Ka2FibGUoaGVhZChkYXQsNCksYWxpZ24gPSAiY2NjIikgJT4lIyBTZSBuZWNlc2l0YSBsaWJyYXJ5KGtuaXRyKSANCmthYmxlX3N0eWxpbmcoKSAlPiUgICAgICAgICAgICAgICAgI2xpYnJhcnkoa2FibGVFeHRyYSkuLi4uIFNvbG8gcGFyYSBrbml0IHRvIGh0bWwNCmthYmxlX2NsYXNzaWNfMihmdWxsX3dpZHRoID0gRikgICAjbGlicmFyeShrYWJsZUV4dHJhKS4uLi5Tb2xvIHBhcmEga25pdCB0byBodG1sDQpgYGANCg0KDQo8IS0tICUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUgLS0+DQo8IS0tIFNlcGFyYWRvciAtLT4NCg0KDQojIyMgU29sdWNpw7NuLg0KDQoNCkxhIHNvbHVjacOzbiBzZSBwdWVkZSByZXZpc2FyIFtoYWNpZW5kbyBjbGljayBhcXXDrV0oaHR0cHM6Ly9ycHVicy5jb20vaGxsaW5hcy9SX1BDQV9hcGxpY2FjaW9uKS4NCg0KPCEtLSAlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlIC0tPg0KPCEtLSBTZXBhcmFkb3IgLS0+DQoNCiMgVMOzcGljb3Mgc3VtcGxlbWVudGFyaW9zIA0KDQpbTm8gaGFjZXIgY2xpY2sgYXF1w61dKE9KT0pPSk8pOiBQZW5kaWVudGUNCg0KDQoNCjwhLS0gJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSAtLT4NCjwhLS0gQ2Fww610dWxvIEVqZXJjaWNpb3MgLS0+DQoNCiMgRWplcmNpY2lvcw0KDQpQZW5kaWVudGUNCg0KPCEtLSAlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSAtLT4NCg0KPCEtLSBDYXDDrXR1bG8gQmlibGlvZ3JhZsOtYS0tPg0KDQoNCiMgQmlibGlvZ3JhZsOtYSB7LnVubGlzdGVkIC51bm51bWJlcmVkfQ0KICANCkNvbnN1bHRhciBlbCBkb2N1bWVudG8gW1JQdWJzIDo6IEFuw6FsaXNpcyBtdWx0aXZhcmlhZG8gKGJpYmxpb2dyYWbDrWEpXShodHRwczovL3JwdWJzLmNvbS9obGxpbmFzL1JfTXVsdGl2YXJpYWRvX0JpYmxpb2dyYWZpYSkuDQoNCjwhLS0gJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUgLS0+DQoNCiZuYnNwOw0KDQoNCiZuYnNwOw0KPGNlbnRlcj4NCn5+fg0KSWYgeW91IGZvdW5kIGFueSBFUlJPUlMgb3IgaGF2ZSBTVUdHRVNUSU9OUywgcGxlYXNlIHJlcG9ydCB0aGVtIHRvIG15IGVtYWlsLiBUaGFua3MuICANCn5+fg0KPC9jZW50ZXI+DQoNCg0K