El modelo
Generalidades
Se exponen los principios fundamentales del análisis de correspondencia simple, junto con un ejemplo que destaca la relevancia de esta técnica en contextos específicos, ilustrando la relación entre variables nominales en un mapa perceptual y la interacción entre sus categorías.
El análisis de correspondencia simple aborda la exploración de tablas cruzadas, donde las celdas reflejan algún tipo de relación entre las filas y columnas de una matriz. Este método condensa la información contenida en una tabla de contingencia, ofreciendo dos enfoques interpretativos. Por un lado, se visualiza como una herramienta para representar las variables en un espacio de menor dimensión, y por otro, como un método objetivo para asignar valores numéricos a variables cualitativas.
Un ejemplo paradigmático de aplicación del análisis de correspondencia simple se encuentra en los cursos introductorios de estadística, particularmente en los problemas que abordan la independencia entre dos variables categóricas.
Supongamos la presencia de dos variables categóricas, \(X\) e \(Y\), con \(I\) y \(J\) categorías respectivamente, definidas en una población. La pregunta clave es determinar si estas variables son independientes. Bajo la hipótesis nula:
\[ H0 : \;\mbox{Las variables X y Y son estadísticamente independientes}\]
versus la hipótesis alternativa:
\[H1 :\;\mbox{Las variables X y Y no son estadísticamente independientes}.\]
Matrices de frecuencias absolutas
Supongamos que disponemos de una tabla de contingencia que surge de \(n\) elementos seleccionados de una población, donde las variables categóricas \(X\) y \(Y\) están definidas. La intersección entre una fila \(i\) y una columna \(j\) representa la frecuencia de individuos que pertenecen a la categoría \(i\) de la variable \(X\) y a la categoría \(j\) de la variable \(Y\) simultáneamente, con \(i = 1, \ldots, K\) y \(j = 1, \ldots, J\). Esto se ilustra en la matriz de frecuencias absolutas siguiente, que será referida como \(F\):
\[F=\begin{pmatrix}
X \setminus Y & 1 & 2 & \ldots & J\\
\hline
1 & F_{11} & F_{12} & \ldots & F_{1J} \\
2 & F_{21} & F_{22} & \ldots & F_{2J} \\
\vdots & & & & \\
M & F_{K1} & F_{K2} & \ldots & F_{KJ}
\end{pmatrix}= (F_{ij})_{I \times J}\]
Ejemplo.
Véase la Figura 2.1.
Matrices de frecuencias relativas
Sea
\[n \; := \; \sum\limits_{i=1}^{J} \sum\limits_{j=1}^{K}F_{ij}\]
Multiplicar la matriz \(F\) por \(\frac{1}{n}\) nos proporciona la matriz de frecuencias relativas \(P=\frac{1}{n}F\), donde \(P\) es la matriz de frecuencias relativas conocida como matriz de correspondencia y \(n = 1_{K\times 1}^T\, F\, 1_{J \times 1}\) representa el número total de individuos en la tabla.
Es claro que las frecuencias absolutas no son adecuadas para comparar filas o columnas, por lo que se recurre a la matriz de frecuencias relativas (matriz de correspondencia) \(P\). Esta matriz se define explícitamente como la matriz de orden \(K \times J\) que centra la tabla siguiente:
\[P= \begin{pmatrix}
X\setminus Y & 1 & 2 & \ldots & J & \mbox{Marginal fila}\\
\hline
1 & p_{11} & p_{12} & \ldots & p_{1J} & f_1 \\
2 & p_{21} & p_{22} & \ldots & p_{2J} & f_2\\
\vdots & & & & & \vdots \\
K & p_{K1} & p_{K2} & \ldots & p_{KJ} & f_K\\
\hline
\mbox{Marginal columna} & c_1 & c_2 & \ldots & c_J & 1
\end{pmatrix},\]
donde
\[\begin{align*}
p_{ij} &= \; \frac{F_{ij}}{n},\\
f_i &= \sum\limits_{j=1}^{J}p_{ij},\qquad
c_j = \sum\limits_{i=1}^{K}p_{ij} \quad \mbox{y}\\
\sum\limits_{j=1}^{J}c_j &= \sum\limits_{i=1}^{K}f_i \;= \; \sum\limits_{i=1}^{J}\sum\limits_{j=1}^{K}p_{ij}=1.
\end{align*}\]
Ejemplo.
Véase la Figura 2.2.
Marginales
Denotaremos como \(f_i\) la frecuencia marginal de la i-ésima fila y como \(c_j\) la frecuencia marginal de la \(j\)-ésima columna, donde \(i=1,\ldots, K\) y \(j=1,\ldots, J\), o de manera vectorial:
\[ f = P\, 1_{J\times 1} \qquad\mbox{y}\qquad c = P^T\, 1_{K\times 1}, \]
vectores que representan las frecuencias marginales de filas y columnas, respectivamente.
Independencia
El estadístico
Es conocido que el estadístico más frecuentemente empleado para analizar la independencia estadística entre dos variables categóricas es:
\[\begin{align}
X_{(K-1)\times (J-1)}^2 &= \sum_{i=1}^{J}\sum_{j=1}^{K} \frac{(F_{ij}-E\left[F_{ij})\right]^2}{E(F_{ij})} = n^2 \sum_{i=1}^{J}\sum_{j=1}^{K} \frac{\left[\frac{F_{ij}}{n}-E( \frac{F_{ij}}{n})\right]^2}{E(F_{ij})} \notag\\
&= \sum_{i=1}^{J}\sum_{j=1}^{K} \frac{\left[\frac{F_{ij}}{n} - E(\frac{F_{ij}}{n})\right]^2}{E\left[\frac{F_{ij}}{n}\right]} = n^2 \sum_{i=1}^{J}\sum_{j=1}^{K} \frac{(p_{ij} - e_{ij})^2}{e_{ij}}, \tag{3.1}
\end{align}\]
donde:
\(E(F_{ij})\) representa la frecuencia absoluta esperada en la casilla \((i,j)\) de la matriz \(F\), y
\(e_{ij}\) es la frecuencia relativa esperada en la casilla \((i, j)\) de la matriz de correspondencia \(P\).
Observemos que, de (3.1), se tiene que
\[ \frac{1}{n} X_{(K-1)\times (J-1)}^2= \sum_{i=1}^{J}\sum_{j=1}^{K} \frac{(p_{ij} - e_{ij})^2}{e_{ij}}. \]
Para el ejemplo:
##
## Pearson's Chi-squared test
##
## data: tabla
## X-squared = 1240, df = 12, p-value < 2.2e-16
Matrices de residuos estandarizados
Si definimos \(D_f\) y \(D_c\) como las matrices diagonales \(D_f = \text{diag}(f)_{I\times I}\) y \(D_c = \text{diag}(c)_{J\times J}\), representando las frecuencias marginales de filas y columnas respectivamente, entonces la matriz
\[\begin{equation}
S = D_f^{-1/2} (P-f\; c^T) D_c^{-1/2} \tag{3.2}
\end{equation}\]
es la matriz de residuos estandarizados. Se puede demostrar que
\[S\, S^T\quad \text{y} \quad S^T\, S\]
son matrices simétricas, cuya traza es precisamente el estadístico de prueba en la prueba de independencia para dos variables categóricas, es decir,
\[\text{traza}(SS^T) = \text{traza}(S^TS) \sum_{i=1}^{J}\, \sum_{j=1}^{K} \frac{(p_{ij} \; - \; f_i \, c_j)^2}{e_{ij}}.\]
Descomposición en valores singulares
Si realizamos la descomposición en valores singulares de la matriz \(S\), obtenemos:
\[\begin{equation}
S \;=\; U\,D_{\lambda}\, V^T,\tag{3.3}
\end{equation}\]
donde
\[UU^T = I_K, \; VV^T = I_J \quad \text{y} \quad D_\lambda = \text{diag}(\lambda_1,\lambda_2, \ldots,)_{K\times J},\]
siendo \(D_\lambda\) una matriz diagonal y los \(\lambda_i\), \(i = 1, \ldots, \text{rang}(S) = t\), las raíces cuadradas positivas de los \(t\) valores propios de las matrices simétricas \(S\,S^T\) y \(S^T\,S\). Los \(t\) primeros vectores de las matrices ortogonales \(U\) y \(V\) son los vectores propios de las matrices \(S'S\) y \(SS'\), respectivamente.
Base
Los \(t\) primeros vectores de \(U\) constituyen una base para el subespacio generado por las filas de \(P\) y los \(t\) primeros vectores de la matriz \(V\) constituyen una base para el subespacio generado por las columnas de \(P\). Es decir, si construimos las matrices \(U_{t\times t}\), \(V_{t\times t}\) y \(D_\lambda,_{t\times t}\), la matriz
\[S_{t\times t} \;=\; U_{t\times t}\, D_\lambda,_{t\times t}\, V_{t\times t}\]
será la matriz de rango mínimo que mejor se aproxima a la matriz \(S\).
Problema CA
Así, el problema de análisis de correspondencia simple se puede expresar como un problema de mínimos cuadrados ponderados para determinar la matriz \(\widehat{e} = (\widehat{e}_{ij}) = f\,c\), de rango reducido que minimiza la
\[\text{traza}(S\, S^T) \;=\; \text{traza}(S^T\, S) \, \sum_{i=1}^{J}\sum_{j=1}^{K} \frac{(p_{ij} \;-\; f_i \,c_j)^2}{e_{ij}}.\]
Distancias chi-cuadradas
Distancia entre filas o columnas
Es la distancia entre filas y columnas de la matriz de datos. Para explicarla, nuevamente, consideremos la matriz \(P\). Supongamos que las filas \(i\) y \(j\) tienen la siguiente configuración:
\(i\)
|
0.015
|
0.02
|
0.01
|
0.02
|
\(f_i=0.075\)
|
\(j\)
|
0.0015
|
0.002
|
0.001
|
0.002
|
\(f_j=0.0075\)
|
Aparentemente, la fila \(i\) parece más densa que la fila \(j\). En la fila \(i\) se encuentra el \(7.5%\) de la población, mientras que en la fila \(j\) solo el \(0.75%\). Si no consideramos el tamaño, las frecuencias relativas intrafila son idénticas en cada fila. Por lo tanto, para analizar las diferencias relativas entre filas, debemos corregir el efecto tamaño. Esto se logra considerando la matriz cuyos elementos son de la forma \(p_{ij}/f_i\) para las filas y \(p_{ij}/c_j\) para las columnas, obteniendo así dos matrices.
Otro problema al que nos enfrentamos es si las filas \(i, j\) y \(k\) de la matriz ponderada por las marginales de las filas son:
\(i\)
|
0.15
|
0.02
|
0.10
|
0.43
|
0.30
|
\(j\)
|
0.15
|
0.02
|
0.10
|
0.44
|
0.29
|
\(k\)
|
0.15
|
0.01
|
0.10
|
0.44
|
0.30
|
Observe que la distancia euclidiana entre las filas \(i\) y \(j\), y entre las filas \(i\) y \(k\), se definen como:
\[\begin{align*}
d_e^2(i,j) &= \sum_{l=1}^{J}\left (\frac{p_{il}}{f_i} - \frac{p_{jl}}{f_j}\right)^2\\
&= (0.43-0.44)^2 \;+\; (0.30-0.29)^2 \;=\; 0.0002\\
&\\
d_e^2(i,k) &=\sum_{l=1}^{J}\left (\frac{p_{il}}{f_i} - \frac{p_{kl}}{f_k}\right)^2 \\
&= (0.43-0.44)^2 \;+\; (0.02-0.01)^2 \;=\; 0.0002,
\end{align*}\]
Esto es claramente problemático, ya que no es lo mismo una discrepancia de 0.01 entre 0.29 y 0.30, que entre 0.01 y 0.02.
Distancia entre filas
Una forma de corregir este problema es ponderando cada elemento de la suma por el marginal de la columna correspondiente:
\[d^2 (f_i, f_j) = \sum_{l=1}^{J}\frac{1}{c_l}\left(\frac{p_{il}}{f_i} - \frac{p_{jl}}{f_j}\right )^2 = (f_i - f_j)^T\, D_c^{-1} \, (f_i - f_j),\]
Donde:
\(f_i\) y \(f_j\) son los vectores cuyos elementos son las filas \(i\) y \(j\), respectivamente, de la matriz \(P\); y
\(D_c\) es una matriz diagonal con elementos \(c_l\). A esta distancia se le conoce con el nombre de distancia chi-cuadrado.
Distancia entre columnas
Utilizando un procedimiento análogo se obtienen las distancias chi-cuadrado entre dos columnas \(j\) y \(k\) de esa matriz de datos, así:
\[d^2 (c_j, c_k) \;=\; \sum_{l=1}^{K}\frac{1}{f_l}\left(\frac{p_{lj}}{c_j} - \frac{p_{lk}}{c_k}\right )^2 \;=\; (c_j - c_k)^T \,D_f^{-1}\, (c_j - c_k),\]
donde:
\(f_j\) y \(f_k\) son los vector cuyos elementos son las columnas \(i\) y \(j\), respectivamente, de la matriz \(P\); y
\(D_f\), es una matriz diagonal con elementos \(f_l\).
Distancia (observaciones)
Primero.
Note que los valores de las distancias anteriores miden la distancia entre dos distribuciones multinomiales. Es decir, permiten comparar los histogramas (distribuciones empíricas) por cada par de filas o columnas.
Segundo.
Observe también que esta distancia chi-cuadrado es equivalente a la distancia euclidiana, si se toma como puntos en el caso de las filas, para las filas \(i\) y \(K\), las de coordenadas:
\[W_i = \left(\frac{p_{i1}}{f_i \, \sqrt{c_1}}, \ldots, \frac{p_{iJ}}{f_i\,\sqrt{c_J}}\right) \quad \mbox{y}\quad W_j = \left(\frac{p_{k1}}{f_k \, \sqrt{c_1}}, \ldots, \frac{p_{kJ}}{f_k \, \sqrt{c_J}}\right),\]
respectivamente.
Centro de gravedad
Es importante resaltar que las distancias no se calculan entre las filas o las columnas, sino que se expresan en relación con su centro de masa, que podemos definir como el promedio ponderado de esa columna por su masa.
En el caso de las columnas, esto se convierte en el vector de columnas generado por las marginales de las filas, \(f\).
De manera similar, en el caso de las filas, el vector de filas generado por las marginales de las columnas, \(c\).
Esto es aplicable cuando se analiza la matriz de perfiles (distancia chi-cuadrado) para las filas.
Si el análisis se realiza con la matriz cuyos elementos son de la forma \(W_i\), \(i = 1,\ldots, K\) (utilizando la distancia euclidiana), el centro de masa para las filas sería \(\sqrt{\sqrt{c}}\), como se muestra a continuación:
Para calcular el centro de masa \(\sqrt{c}\) de la nube de puntos generada por las filas \(W_1,\ldots, W_K\), ponderando con los pesos de las columnas correspondientes, tendríamos para la i-ésima coordenada del vector \(\sqrt{c}\), \(i=1,\ldots, J\):
\[\begin{align*}
\sqrt{c_i} &= f_1 \left(\frac{p_{1i}}{f_1\sqrt{c_i}}\right) + f_2 \left(\frac{p_{2_i}}{f_2\sqrt{c_i}}\right) + \cdots + f_K\left(\frac{p_{Ki}}{f_K\sqrt{c_i}}\right) \\
&= \frac{1}{\sqrt{c_i}} (f_{1i}+f_{2i} + \cdots + f_{Ki})\\
&= \frac{1}{\sqrt{c_i}}c_i\\
&= \sqrt{c_i}
\end{align*}\]
Distancia perfil al centro de gravedad
La distancia del perfil de fila \(i\) a su centro de gravedad (chi-cuadrado) se define como:
\[d^2 \,(f_i, \;c) \; =\; \sum_{l=1}^{K} \frac{1}{c_l}\left(\frac{p_{il}}{f_i} - c_l\right)^2 \;=\; \sum_{l=1}^{K} \left(\frac{p_{il}}{f_i\, \sqrt{c_l}} - \sqrt{c_l}\right)^2 = d_e \,(f_i,\; c).\]
Al calcular la distancia entre una fila y su centro de gravedad, en realidad estamos calculando una parte de la varianza o una covarianza. En resumen, la dispersión total de las filas es la suma ponderada de las diferencias al cuadrado de cada elemento de la fila respecto al centro de gravedad.
Inercia
La cantidad \(\chi^2/N\) se denomina inercia total. Esta inercia se descompone en un total de \(k\) valores característicos (propios), cada uno de los cuales constituye la inercia principal de una dimensión.
Inercia total de las filas
Si denotamos la inercia total de las filas como \(I_f\), entonces puede calcularse de la siguiente manera:
\[\begin{align*}
I_f &= \sum_{i=1}^{K} f_i \,d^2\, (f_i, \;c)\\
&= \sum_{i=1}^{K} \sum_{j=1}^{J} f_i \frac{1}{f_j}\left(\frac{p_{ij}}{f_i} \;-\; c_j\right)^2\\
&= \sum_{i=1}^{K} \sum_{j=1}^{J} \frac{(p_{ij}-f_i \times c_j)^2}{f_i \times c_j}= tra(S^T\, S).
\end{align*}\]
Inercia total de las columnas
De manera análoga, la dispersión total de las columnas \(I_c\), se define como:
\[\begin{align*}
I_c &= \sum_{j=1}^{J} c_j \, d^2 (c_j, \;f)\\
&= \sum_{j=1}^{J} \sum_{i=1}^{K} c_j \frac{1}{c_i}\left(\frac{p_{ij}}{c_j}\;-\; f_i\right)^2\\
&= \sum_{j=1}^{J} \sum_{i=1}^{K} \frac{(p_{ij}-f_i \times c_j)^2}{f_i \times c_j}= tra(S\, S^T) \; =\; I_f.
\end{align*}\]
Se observa que la dispersión total de las filas es igual a la de las columnas.
Matrices de inercia
Las matrices \(\Sigma_f = S^T\, S\) y \(\Sigma_c = S\, S^T\) se denominan matrices de inercia de las filas y columnas, respectivamente.
Varianzas de filas y columnas
Los elementos de la diagonal de la matriz \(\Sigma\) representan las varianzas de las filas o columnas. además, su suma constituye la dispersión explicada por cada factor en el nuevo espacio. Los autovalores indican qué parte de esa dispersión está explicada por cada factor.
Coordenadas de los puntos
\(i\) en \(\mathbb{R}^J\)
Con el fin de obtener sus valores y vectores propios, que permitirán calcular las coordenadas de los puntos \(i\) en \(\mathbb{R}^J\), para el espacio de \(J\) dimensiones que definen los puntos fila, es necesario diagonalizar la matriz \(\Sigma_f\). Estas coordenadas tienen la siguiente forma:
\[F\alpha(i) = \sum_{j=1}^J \mu_{\alpha \, j}\left(\frac{f_{ij}}{f_i\, \sqrt{c_j}} - \sqrt{c_j}\right)\]
o en forma matricial como:
\[R\;=\;(F_\alpha(i))_{K\times t} \;=\; D_f^{-1}\, (F\; -\; f\, c )\, D_c^{-1/2}\, U,\]
donde:
\(\mu_\alpha\) es el vector propio (columnas de la matriz \(U\)) de \(\Sigma_f\), correspondiente al factor \(\alpha\), \(\alpha = 1, \ldots, t\).
\(F_\alpha(i)\) es la proyección del punto fila
\[\left(\frac{f_{i1}}{f_i \sqrt{c_1}} - \sqrt{c_1}, \frac{f_{i2}}{f_i \sqrt{c_2}} - \sqrt{c_2}, \ldots, \frac{f_{iQ}}{f_i \sqrt{c_Q}} - \sqrt{c_Q}\right)\]
sobre el vector \(u_\alpha\).
\(j\) en \(\mathbb{R}^K\)
De manera similar, se obtienen las coordenadas para los puntos \(j\) de \(\mathbb{R}^K\):
\[C_\alpha(j)=\sum_{i=1} \left(\frac{p_{ij}}{c_j\sqrt{f_i}}- \sqrt{f_i}\right)\nu_{\alpha i},\]
en forma matricial como:
\[C=(C_\alpha (j))_{P\times t} =D_c^{-1}(F-f\; c)'D_f^{-1/2}V,\]
donde \(\nu_\alpha\) es el vector propio (columnas de la matriz \(V\)) de \(\Sigma_c\), correspondiente al factor \(\alpha, \alpha = 1, \ldots, t\). También podemos expresar estas coordenadas como:
\[F_\alpha(i)= \frac{\sqrt{\lambda_\alpha}}{\sqrt{f_i}} \; \nu_{\alpha i}\]
y
\[C_\alpha(j)= \frac{\sqrt{\lambda_\alpha}}{\sqrt{c_j}} \; \upsilon_{\alpha j},\]
donde \(\lambda_\alpha\), es el valor propio asociado al factor \(\alpha\).
Reconstrucción de la matriz de correspondencia
Para reconstruir la matriz de correspondencia \(P\), podemos resolver las ecuaciones (3.2) y (3.3) para \(P\), obteniendo la siguiente ecuación:
\[\begin{equation}
P \;=\; f \, c \;+\; D_f^{1/2} U\, D\, V^T D_c^{1/2}, \tag{10.1}
\end{equation}\]
o en términos de sus elementos:
\[\begin{eqnarray*}
p_{ij} &=& f_i c_j \;+\; (0,0,\ldots,\underbrace{\sqrt{f_i}}_{\text{Posición} \,i}, \ldots,0) \; U\, D \, V^T \;(0,0, \ldots, \underbrace{\sqrt{c_j}}_{\text{Posición} \,j}, \ldots, 0)^T\\
&=& f_i \, c_j\, \left[1\;+\; \sum_{\alpha=1} \frac{1}{\sqrt{\lambda_\alpha}} \, F_\alpha (i) \, G_\alpha(j)\right]
\end{eqnarray*}\]
LS0tDQp0aXRsZTogIkFOw4FMSVNJUyBERSBDT1JSRVNQT05ERU5DSUEiDQpzdWJ0aXRsZTogPGgxPioqVGVvcsOtYSoqPC9oMT4NCg0KYXV0aG9yOiANCiAgLSBuYW1lICAgICAgICAgIDogIkRyLiByZXIuIG5hdC4gSHVtYmVydG8gTExpbsOhcyBTb2xhbm8iDQogICAgYWZmaWxpYXRpb24gICA6ICJEZXBhcnRhbWVudG8gZGUgTWF0ZW3DoXRpY2FzIHkgRXN0YWTDrXN0aWNhLCBVbml2ZXJzaWRhZCBkZWwgTm9ydGUgKEJhcnJhbnF1aWxsYSwgQ29sb21iaWEpIg0KICAgICAjY29ycmVzcG9uZGluZyA6IHllcyAgICAjIERlZmluZSBvbmx5IG9uZSBjb3JyZXNwb25kaW5nIGF1dGhvcg0KICAgICAjYWRkcmVzcyAgICAgICA6ICJEZXBhcnRhbWVudG8gZGUgTWF0ZW3DoXRpY2FzIHkgRXN0YWTDrXN0aWNhIg0KICAgIGVtYWlsICAgICAgICAgOiB8DQogICAgICBobGxpbmFzQHVuaW5vcnRlLmVkdS5jbw0KICAgICAgDQogICAgICBbQmlvZ3JhcGhpY2FsIHNrZXRjaF0oaHR0cHM6Ly9ycHVicy5jb20vaGxsaW5hcy9CaW9fU2tldGNoKQ0KICAgICAgDQogICAgICBgciBmb3JtYXQoU3lzLnRpbWUoKSwgIiVkLyVtLyV5IilgIA0KICAgICAgDQogICAgICNyb2xlOiAgICAgICAgICMgQ29udHJpYnV0b3JzaGlwIHJvbGVzIChlLmcuLCBDUmVkaVQsIGh0dHBzOi8vY2FzcmFpLm9yZy9jcmVkaXQvKQ0KICAjICAgIC0gQ29uY2VwdHVhbGl6YXRpb24NCiAgIyAgICAtIFdyaXRpbmcgLSBPcmlnaW5hbCBEcmFmdCBQcmVwYXJhdGlvbg0KICAjICAgIC0gV3JpdGluZyAtIFJldmlldyAmIEVkaXRpbmcNCiAjIC0gbmFtZSAgICAgICAgICA6ICJBdXRvciBudW1lcm8gMiINCiAjICAgYWZmaWxpYXRpb24gICA6ICIxLDIiDQogIyAgIHJvbGU6DQogIyAgICAgLSBXcml0aW5nIC0gUmV2aWV3ICYgRWRpdGluZw0KICAgICAjYWZmaWxpYXRpb246DQogICMtIGlkICAgICAgICAgICAgOiAiMSINCiAgIyAgaW5zdGl0dXRpb24gICA6ICJVbml2ZXJzaWRhZCBkZWwgTm9ydGUgKEJhcnJhbnF1aWxsYSwgQ29sb21iaWEpIg0KICAjIVtdKGhsbGluYXMuanBnKXt3aWR0aD0xaW59IA0KICANCiNkYXRlOiAnYHIgZm9ybWF0KFN5cy50aW1lKCksICIlZC8lbS8leSIpYCcgICMgdmVyIGh0dHBzOi8vYm9va2Rvd24ub3JnL3lpaHVpL3JtYXJrZG93bi1jb29rYm9vay91cGRhdGUtZGF0ZS5odG1sDQpvdXRwdXQ6IA0KICAgIGJvb2tkb3duOjpodG1sX2RvY3VtZW50MjogDQogICAgICAgICAgI09KTyBTYWxlbiBjYXBpdHVsb3MsIHNlY2Npb25lcyB5IFRlb3JlbWFzDQogICAgI2Jvb2tkb3duOjpodG1sX2Jvb2s6DQogICAgICAgICAgI09KTyBFUlJPUiBTYWxlbiB0ZW9yZW1hcywgcGVybyBubyBzYWxlbiBsb3MgY2FwaXR1bG9zIA0KICAgICNodG1sX2RvY3VtZW50Og0KICAgICAgICAgIHRvYzogdHJ1ZSAgICAgICMgdGFibGUgb2YgY29udGVudCB0cnVlDQogICAgICAgICAgdG9jX2RlcHRoOiA0ICAgIyB1cHRvIHRocmVlIGRlcHRocyBvZiBoZWFkaW5ncyAoc3BlY2lmaWVkIGJ5ICMsICMjIGFuZCAjIyMpDQogICAgICAgICAgdG9jX2Zsb2F0OiB0cnVlICNDb24gdHJ1ZSwgdG9jIHNhbGUgYWwgbWFyZ2VuIGl6cXVpZXJkbyBkZSBsYSBww6FnaW5hOyBkZSBsbyBjb250cmFyaW8sIGFycmliYQ0KICAgICAgICAgIGNvbGxhcHNlZDogZmFsc2UNCiAgICAgICAgICBzbW9vdGhfc2Nyb2xsOiBmYWxzZQ0KICAgICAgICAgIG51bWJlcl9zZWN0aW9uczogdHJ1ZSAgICMgaWYgeW91IHdhbnQgbnVtYmVyIHNlY3Rpb25zIGF0IGVhY2ggdGFibGUgaGVhZGVyDQogICAgICAgICAgI3RoZW1lOiBzYW5kc3RvbmUNCiAgICAgICAgICAjdGhlbWU6IHVuaXRlZCAgIyBtYW55IG9wdGlvbnMgZm9yIHRoZW1lLCB0aGlzIG9uZSBpcyBteSBmYXZvcml0ZS4NCiAgICAgICAgICAjdGhlbWU6IGZsYXRseSAgIyANCiAgICAgICAgICAjdGhlbWU6IGNlcnVsZWFuICAjIA0KICAgICAgICAgICNoaWdobGlnaHQ6IHRhbmdvICAjIHNwZWNpZmllcyB0aGUgc3ludGF4IGhpZ2hsaWdodGluZyBzdHlsZQ0KICAgICAgICAgICNjc3M6IFNjcmlwdHMgYWNjZXNvcmlvcy9lc3RpbG9ib3Rvbi5jc3MNCiAgICAgICAgICAjY3NzOiBteS5jc3MgICAjIHlvdSBjYW4gYWRkIHlvdXIgY3VzdG9tIGNzcywgc2hvdWxkIGJlIGluIHNhbWUgZm9sZGVyDQogICAgICAgICAgY29kZV9kb3dubG9hZDogdHJ1ZQ0KICAgICAgICAgICNoaWdobGlnaHQ6IHRhbmdvICAjIGNhbWJpYXIgY29sb3IgZGUgbGlicmFyeSBlbiBhenVsDQogICAgIyBib29rZG93bjo6Z2l0Ym9vazoNCiAgICAjICAgICAgaW5jbHVkZXM6DQogICAgIyAgICAgICAgaW5faGVhZGVyOiBoZWFkZXIuaHRtbA0KICAgICMgYm9va2Rvd246OnBkZl9ib29rOg0KICAgICMgICAgICAga2VlcF90ZXg6IHllcw0KICAgICMgYm9va2Rvd246Omh0bWxfYm9vazoNCiAgICAjICAgICAgIGNzczogdG9jLmNzcw0KICAgICMgYm9va2Rvd246Omh0bWxfYm9vazoNCiAgICAjICAgICAgICAgaW5jbHVkZXM6DQogICAgIyAgICAgICAgICAgaW5faGVhZGVyOiBzdHlsZS5jc3MNCiAgICAjYm9va2Rvd246Omh0bWxfZG9jdW1lbnQyOiBkZWZhdWx0DQogICAgIyBib29rZG93bjo6cGRmX2RvY3VtZW50MjoNCiAgICAjICAgICAga2VlcF90ZXg6IHRydWUNCiAgICAjYmlibGlvZ3JhcGh5OiByZWZlcmVuY2VzLmJpYg0KICAgIG1hdGhqYXg6ICJodHRwOi8vZXhhbXBsZS5jb20vbWF0aGpheC9NYXRoSmF4LmpzP2NvbmZpZz1UZVgtQU1TLU1NTF9IVE1Mb3JNTUwiDQpoZWFkZXItaW5jbHVkZXM6DQogICAgXHVzZXBhY2thZ2VbeDExbmFtZXNde3hjb2xvcn0gDQogICAgDQpjc2w6IHNjaWVuY2UuY3NsDQojT2pvOiBTZSB1dGlsaXphIGxlbmd1YWplIFlBTUwNCg0KYWJzdHJhY3Q6IHwNCiAqKkVuIFtScHViczo6IHRvY10oaHR0cHM6Ly9ycHVicy5jb20vaGxsaW5hcy90b2MpIHNlIHB1ZWRlbiB2ZXIgb3Ryb3MgZG9jdW1lbnRvcyBkZSBwb3NpYmxlIGludGVyw6lzLioqDQogIA0KLS0tDQoNCmBgYHtyIHNldHVwLCBpbmNsdWRlPUZBTFNFfQ0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KGVjaG8gPSBUUlVFLCBmaWcuYWxpZ249ImNlbnRlciIsICBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFIywNCiAgICAgICAgICAgICAgICAgICAgICAjc3R5bGUgPSAiY29sb3I6ZGFya2JsdWUiDQogICAgICAgICAgICAgICAgICAgICMgY2xhc3Muc291cmNlPSJiZy1kYW5nZXIiLCBjbGFzcy5vdXRwdXQ9ImJnLXdhcm5pbmciICAgI0NvbG9yZXMgZGVudHJvIGRlbCBjaHVuaw0KICAgICAgICAgICAgICAgICAgICAgKQ0KbGlicmFyeShyZ2wpDQprbml0cjo6a25pdF9ob29rcyRzZXQod2ViZ2wgPSBob29rX3dlYmdsKQ0KYGBgDQoNCg0KDQoNCmBgYHtyLCBlY2hvPUZBTFNFLCBldmFsPUZBTFNFfQ0KaHR0cHM6Ly9ib29rZG93bi5vcmcveWlodWkvcm1hcmtkb3duL2xhbmd1YWdlLWVuZ2luZXMuaHRtbA0KDQpodHRwczovL2Jvb2tkb3duLm9yZy95aWh1aS9ib29rZG93bi9tYXJrZG93bi1zeW50YXguaHRtbA0KDQpodHRwczovL2Jvb2tkb3duLm9yZy95aWh1aS9ib29rZG93bi9hLXNpbmdsZS1kb2N1bWVudC5odG1sDQoNCmh0dHBzOi8vYm9va2Rvd24ub3JnL3lpaHVpL2Jvb2tkb3duL21hcmtkb3duLWV4dGVuc2lvbnMtYnktYm9va2Rvd24uaHRtbA0KDQpodHRwczovL2Jvb2tkb3duLm9yZy95aWh1aS9ybWFya2Rvd24vYm9va2Rvd24tbWFya2Rvd24uaHRtbCAgIyBUZW9yZW1zIGFuZCBwcm9vZnMNCg0KaHR0cHM6Ly9ib29rZG93bi5vcmcveWlodWkvYm9va2Rvd24vbWFya2Rvd24tZXh0ZW5zaW9ucy1ieS1ib29rZG93bi5odG1sI3RoZW9yZW1zDQoNCmh0dHBzOi8vYm9va2Rvd24ub3JnL3lpaHVpL2Jvb2tkb3duL2h0bWwuaHRtbA0KDQpodHRwczovL3d3dy5kYXRhLXRvLXZpei5jb20vDQogIA0KW1JwdWJzXShsaW5rKQ0KICANCihcI2VxOmVjLSksICBFY3VhY2lvbiBcQHJlZihlcTplYy0pLCBGaWd1cmEgXEByZWYoZmlnOkZpZy0pLCBUYWJsZSBcQHJlZih0YWI6bXRjYXJzKSwgVGhlb3JlbSBcQHJlZih0aG06Ym9yaW5nKQ0KDQoNCiMgVGl0dWxvIHsjVGl0dWxvU2VjY2lvbn0gICBcQHJlZihUaXR1bG9TZWNjaW9uKQ0KICANCiMgRm9yIEhUTUwsIHdlIGNhbiBzZXQgY29sb3Igd2l0aCBDU1MsIGUuZy4sIDxzcGFuIHN0eWxlPSJjb2xvcjogcmVkOyI+dGV4dDwvc3Bhbj4NCiAgDQojIGh0dHBzOi8vcmFkaWFudC1yc3RhdHMuZ2l0aHViLmlvL2RvY3MvbW9kZWwvbG9naXN0aWMuaHRtbCBTaGlubnkgTG9naXQgIA0KICANCmBgYA0KDQoNCmBgYHtyLCBldmFsPUZBTFNFLCBlY2hvPUZBTFNFfQ0KI0xhIGZvdG8gdGFtYcOxbyBjw6lkdWxhDQoNCmh0bWx0b29sczo6aW1nKHNyYyA9IGtuaXRyOjppbWFnZV91cmkoZmlsZS5wYXRoKFIuaG9tZSgiZG9jIiksICJodG1sIiwgImxvZ28uanBnIikpLCANCiAgICAgICAgICAgICAgIGFsdCA9ICdobGxpbmFzJywgDQogICAgICAgICAgICAgICBzdHlsZSA9ICdwb3NpdGlvbjphYnNvbHV0ZTsgdG9wOjA7IHJpZ2h0OjA7IHBhZGRpbmc6MTBweDsnICMsDQogICAgICAgICAgICAgICB3aWR0aCA9ICIyMDBweCIpICAjIEFxdcOtIGVzcGVjaWZpY2FzIGVsIGFuY2hvIGRlc2VhZG8gZW4gcMOteGVsZXMgbyBwb3JjZW50YWplDQpgYGANCg0KDQoNCg0KYGBge3IsIGVjaG89RkFMU0UsIH0NCiMgTGEgZm90byBncmFuZGUNCg0KaHRtbHRvb2xzOjppbWcoc3JjID0ga25pdHI6OmltYWdlX3VyaSgiaGxsaW5hczIwMjMuanBnIiksIA0KICAgICAgICAgICAgICAgYWx0ID0gJ2hsbGluYXMyMDIzJywgDQogICAgICAgICAgICAgICBzdHlsZSA9ICdwb3NpdGlvbjphYnNvbHV0ZTsgdG9wOjA7IHJpZ2h0OjA7IHBhZGRpbmc6MXB4OycsDQogICAgICAgICAgICAgICB3aWR0aD0iMTUlIikNCmBgYA0KDQoNCg0KPCEtLSAlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSAtLT4NCjwhLS0gU2VwYXJhZG9yICAtLT4NCg0KYGBge2NzcywgZWNobz1GQUxTRX0NCi5jb2x1bW5zIHtkaXNwbGF5OiBmbGV4O30NCmgxIHtjb2xvcjogZGFya2JsdWU7fQ0KaDMge2NvbG9yOiBkYXJrZ3JlZW47fQ0KaDQge2NvbG9yOiBncmVlbjt9DQpgYGANCg0KDQoNCjwhLS0gJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUgLS0+DQo8IS0tIENhcMOtdHVsbyAgLS0+DQoNCg0KYGBge2NzcywgZWNobz1GQUxTRSwgZXZhbD1GQUxTRX0NCiNodHRwczovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy80MTAzMDQ3Ny9jaGFuZ2luZy1jaHVuay1iYWNrZ3JvdW5kLWNvbG9yLWluLXJtYXJrZG93bg0KDQouYmFkQ29kZSB7DQpiYWNrZ3JvdW5kLWNvbG9yOiByZWQ7DQp9DQpgYGANCg0KDQoNCg0KDQoNCjwhLS0gJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSAtLT4NCjwhLS0gU2VwYXJhZG9yIC0tPg0KDQojIEludHJvZHVjY2nDs24NCg0KDQoNCjwhLS0gJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSAtLT4NCjwhLS0gU2VwYXJhZG9yIC0tPg0KDQojIyMgUHJlbGltaW5hcmVzDQoNCkVsIGFuw6FsaXNpcyBkZSBjb3JyZXNwb25kZW5jaWEgKENBKSBlcyB1bmEgdMOpY25pY2EgcmVsYWNpb25hZGEgY29uIGVsIGFuw6FsaXNpcyBkZSBjb21wb25lbnRlcyBwcmluY2lwYWxlcyAoUENBKSBwZXJvIGFwbGljYWJsZSBhIHZhcmlhYmxlcyBjdWFsaXRhdGl2YXMuIFbDqWFzZSBsYSBGaWd1cmEgXEByZWYoZmlnOkNvcnJlc3AxKS4NCg0KDQo8Y2VudGVyPg0KYGBge3IgQ29ycmVzcDEsIGVjaG89RkFMU0UsIGZpZy5jYXAgPSAiKipSZXN1bWVuIHkgdmlzdWFsaXphY2nDs24gZGUgZGF0b3MgbXVsdGl2YXJpYWRvcyoqIiwgb3V0LndpZHRoID0gIjEwMCUifQ0KIyBmaWcud2lkdGggPSAyMCAjIE5vIGZ1bmNpb25hIGVzdGEgb3BjaW9uIGVuIGVsIGNodW5rDQoNCiNodHRwOi8vemV2cm9zcy5jb20vYmxvZy8yMDE3LzA2LzE5L3RpcHMtYW5kLXRyaWNrcy1mb3Itd29ya2luZy13aXRoLWltYWdlcy1hbmQtZmlndXJlcy1pbi1yLW1hcmtkb3duLWRvY3VtZW50cy8NCiMgUGFnaW5hIDM1OSBkZSBSMjAxNS1GcmllbmRseQ0KDQprbml0cjo6aW5jbHVkZV9ncmFwaGljcygiQ29ycmVzcDEucG5nIikNCg0KI090cmEgbWFuZXJhLCBwZXJvICBzYWxlIGVsIGNhcHRpb246DQojPGNlbnRlcj4NCiMhWygjZmlnOkZpZy1jYXB0aW9uKSBNaSBmaWd1cmFdKE5vbWJyZS5wbmcpe3dpZHRoPTQwMHB4fQ0KIzwvY2VudGVyPg0KYGBgDQo8L2NlbnRlcj4NCg0KDQoNCjwhLS0gJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSAtLT4NCjwhLS0gU2VwYXJhZG9yIC0tPg0KDQoNCiMjIyBQcm9ww7NzaXRvL29iamV0aXZvDQoNCjEuIEF5dWRhIGEgcmVzdW1pciB5IHZpc3VhbGl6YXIgZGF0b3MgZW4gZ3LDoWZpY29zIGJpZGltZW5zaW9uYWxlcywgZXNwZWNpYWxtZW50ZSBlbiB0YWJsYXMgZGUgY29udGluZ2VuY2lhLiANCg0KMi4gUHJvcG9yY2lvbmEgY29vcmRlbmFkYXMgcGFyYSBwdW50b3MgZGUgZmlsYSB5IGNvbHVtbmEsIGxvIHF1ZSBwZXJtaXRlIHZpc3VhbGl6YXIgYXNvY2lhY2lvbmVzIGVudHJlIGNhdGVnb3LDrWFzLiANCg0KMy4gRW4gZXN0ZSBkb2N1bWVudG8sIHNlIGV4cGxpY2EgbGEgdGVvcsOtYSBjb3JyZXNwb25kaWVudGUuIA0KDQo0LiBFbiBvdHJvIGRvY3VtZW50bywgc2UgZXhwbGljYSBjw7NtbyByZWFsaXphciBDQSB1dGlsaXphbmRvIHBhcXVldGVzIGRlIFIgY29tbyBgRmFjdG9NaW5lUmAgeSBgZmFjdG9leHRyYWAsIHkgY8OzbW8gaW50ZXJwcmV0YXIgbG9zIHJlc3VsdGFkb3MsIGluY2x1eWVuZG8gbGEgaWRlbnRpZmljYWNpw7NuIGRlIHZhcmlhYmxlcyBpbXBvcnRhbnRlcyB5IGxhIGdlc3Rpw7NuIGRlIHZhbG9yZXMgYXTDrXBpY29zLg0KDQoNCjwhLS0gJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSAtLT4NCjwhLS0gU2VwYXJhZG9yIC0tPg0KDQoNCiMgRWwgbW9kZWxvIA0KDQojIyMgR2VuZXJhbGlkYWRlcyANCg0KU2UgZXhwb25lbiBsb3MgcHJpbmNpcGlvcyBmdW5kYW1lbnRhbGVzIGRlbCBhbsOhbGlzaXMgZGUgY29ycmVzcG9uZGVuY2lhIHNpbXBsZSwganVudG8gY29uIHVuIGVqZW1wbG8gcXVlIGRlc3RhY2EgbGEgcmVsZXZhbmNpYSBkZSBlc3RhIHTDqWNuaWNhIGVuIGNvbnRleHRvcyBlc3BlY8OtZmljb3MsIGlsdXN0cmFuZG8gbGEgcmVsYWNpw7NuIGVudHJlIHZhcmlhYmxlcyBub21pbmFsZXMgZW4gdW4gbWFwYSBwZXJjZXB0dWFsIHkgbGEgaW50ZXJhY2Npw7NuIGVudHJlIHN1cyBjYXRlZ29yw61hcy4NCg0KRWwgYW7DoWxpc2lzIGRlIGNvcnJlc3BvbmRlbmNpYSBzaW1wbGUgYWJvcmRhIGxhIGV4cGxvcmFjacOzbiBkZSB0YWJsYXMgY3J1emFkYXMsIGRvbmRlIGxhcyBjZWxkYXMgcmVmbGVqYW4gYWxnw7puIHRpcG8gZGUgcmVsYWNpw7NuIGVudHJlIGxhcyBmaWxhcyB5IGNvbHVtbmFzIGRlIHVuYSBtYXRyaXouIEVzdGUgbcOpdG9kbyBjb25kZW5zYSBsYSBpbmZvcm1hY2nDs24gY29udGVuaWRhIGVuIHVuYSB0YWJsYSBkZSBjb250aW5nZW5jaWEsIG9mcmVjaWVuZG8gZG9zIGVuZm9xdWVzIGludGVycHJldGF0aXZvcy4gUG9yIHVuIGxhZG8sIHNlIHZpc3VhbGl6YSBjb21vIHVuYSBoZXJyYW1pZW50YSBwYXJhIHJlcHJlc2VudGFyIGxhcyB2YXJpYWJsZXMgZW4gdW4gZXNwYWNpbyBkZSBtZW5vciBkaW1lbnNpw7NuLCB5IHBvciBvdHJvLCBjb21vIHVuIG3DqXRvZG8gb2JqZXRpdm8gcGFyYSBhc2lnbmFyIHZhbG9yZXMgbnVtw6lyaWNvcyBhIHZhcmlhYmxlcyBjdWFsaXRhdGl2YXMuDQoNClVuIGVqZW1wbG8gcGFyYWRpZ23DoXRpY28gZGUgYXBsaWNhY2nDs24gZGVsIGFuw6FsaXNpcyBkZSBjb3JyZXNwb25kZW5jaWEgc2ltcGxlIHNlIGVuY3VlbnRyYSBlbiBsb3MgY3Vyc29zIGludHJvZHVjdG9yaW9zIGRlIGVzdGFkw61zdGljYSwgcGFydGljdWxhcm1lbnRlIGVuIGxvcyBwcm9ibGVtYXMgcXVlIGFib3JkYW4gbGEgaW5kZXBlbmRlbmNpYSBlbnRyZSBkb3MgdmFyaWFibGVzIGNhdGVnw7NyaWNhcy4NCg0KU3Vwb25nYW1vcyBsYSBwcmVzZW5jaWEgZGUgZG9zIHZhcmlhYmxlcyBjYXRlZ8OzcmljYXMsICRYJCBlICRZJCwgY29uICRJJCB5ICRKJCBjYXRlZ29yw61hcyByZXNwZWN0aXZhbWVudGUsIGRlZmluaWRhcyBlbiB1bmEgcG9ibGFjacOzbi4gTGEgcHJlZ3VudGEgY2xhdmUgZXMgZGV0ZXJtaW5hciBzaSBlc3RhcyB2YXJpYWJsZXMgc29uIGluZGVwZW5kaWVudGVzLiBCYWpvIGxhIGhpcMOzdGVzaXMgbnVsYToNCg0KJCQgSDAgOiBcO1xtYm94e0xhcyB2YXJpYWJsZXMgWCB5IFkgc29uIGVzdGFkw61zdGljYW1lbnRlIGluZGVwZW5kaWVudGVzfSQkDQoNCnZlcnN1cyBsYSBoaXDDs3Rlc2lzIGFsdGVybmF0aXZhOg0KDQokJEgxIDpcO1xtYm94e0xhcyB2YXJpYWJsZXMgWCB5IFkgbm8gc29uIGVzdGFkw61zdGljYW1lbnRlIGluZGVwZW5kaWVudGVzfS4kJA0KDQoNCjwhLS0gJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSAtLT4NCjwhLS0gU2VwYXJhZG9yIC0tPg0KDQojIyMgTWF0cmljZXMgZGUgZnJlY3VlbmNpYXMgYWJzb2x1dGFzDQoNClN1cG9uZ2Ftb3MgcXVlIGRpc3BvbmVtb3MgZGUgdW5hIHRhYmxhIGRlIGNvbnRpbmdlbmNpYSBxdWUgc3VyZ2UgZGUgJG4kIGVsZW1lbnRvcyBzZWxlY2Npb25hZG9zIGRlIHVuYSBwb2JsYWNpw7NuLCBkb25kZSBsYXMgdmFyaWFibGVzIGNhdGVnw7NyaWNhcyAkWCQgeSAkWSQgZXN0w6FuIGRlZmluaWRhcy4gTGEgaW50ZXJzZWNjacOzbiBlbnRyZSB1bmEgZmlsYSAkaSQgeSB1bmEgY29sdW1uYSAkaiQgcmVwcmVzZW50YSBsYSBmcmVjdWVuY2lhIGRlIGluZGl2aWR1b3MgcXVlIHBlcnRlbmVjZW4gYSBsYSBjYXRlZ29yw61hICRpJCBkZSBsYSB2YXJpYWJsZSAkWCQgeSBhIGxhIGNhdGVnb3LDrWEgJGokIGRlIGxhIHZhcmlhYmxlICRZJCBzaW11bHTDoW5lYW1lbnRlLCBjb24gJGkgPSAxLCBcbGRvdHMsIEskIHkgJGogPSAxLCBcbGRvdHMsIEokLiBFc3RvIHNlIGlsdXN0cmEgZW4gbGEgbWF0cml6IGRlIGZyZWN1ZW5jaWFzIGFic29sdXRhcyBzaWd1aWVudGUsIHF1ZSBzZXLDoSByZWZlcmlkYSBjb21vICRGJDoNCg0KJCRGPVxiZWdpbntwbWF0cml4fQ0KWCBcc2V0bWludXMgWSAmIDEgJiAyICYgXGxkb3RzICYgSlxcIA0KXGhsaW5lDQoxICYgRl97MTF9ICYgRl97MTJ9ICYgXGxkb3RzICAmIEZfezFKfSBcXCANCjIgJiBGX3syMX0gJiBGX3syMn0gJiBcbGRvdHMgICYgRl97Mkp9IFxcIA0KXHZkb3RzICYgICYgICYgICYgXFwgDQpNICYgRl97SzF9ICYgRl97SzJ9ICYgXGxkb3RzICYgRl97S0p9DQpcZW5ke3BtYXRyaXh9PSAoRl97aWp9KV97SSBcdGltZXMgSn0kJA0KDQoNCg0KDQpgYGB7ciwgZWNobz0gRkFMU0V9DQojIENyZWFyIGxvcyB2ZWN0b3JlcyBwYXJhIGNhZGEgZmlsYSB5IGNvbHVtbmENCkNvbG9yX2RlX29qb3MgPC0gYygiT19DbGFybyIsICJPX0F6dWwiLCAiT19NZWRpbyIsICJPX09zY3VybyIpDQpSdWJpbyA8LSBjKDY4OCwgMzI2LCAzNDMsIDk4KQ0KUm9qbyA8LSBjKDExNiwgMzgsIDg0LCA0OCkNCk1lZGlvIDwtIGMoNTg0LCAyNDEsIDkwOSwgNDAzKQ0KT3NjdXJvIDwtIGMoMTg4LCAxMTAsIDQxMiwgNjgxKQ0KTmVncm8gPC0gYyg0LCAzLCAyNiwgODUpDQojVG90YWxfbmkuIDwtIGMoMTU4MCwgNzE4LCAxNzc0LCAxMzE1KQ0KDQojIENhbGN1bGFyIGxvcyB0b3RhbGVzIHBvciBjb2x1bW5hDQojVG90YWxfbi5qIDwtIGMoIlRvdGFsIiwgc3VtKFJ1YmlvKSwgc3VtKFJvam8pLCBzdW0oTWVkaW8pLCBzdW0oT3NjdXJvKSwgc3VtKE5lZ3JvKSwgc3VtKFRvdGFsX25pLikpDQoNCiMgQ29uc3RydWlyIGVsIGRhdGEgZnJhbWUNCmRmIDwtIGRhdGEuZnJhbWUoQ29sb3JfZGVfb2pvcywgUnViaW8sIFJvam8sIE1lZGlvLCBPc2N1cm8sIE5lZ3JvDQogICAgICAgICAgICAgICAgICMsIFRvdGFsX25pLg0KICAgICAgICAgICAgICAgICApDQoNCiMgQcOxYWRpciBsYSBmaWxhIGRlIHRvdGFsZXMgYWwgZmluYWwgZGVsIGRhdGEgZnJhbWUNCiNkZiA8LSByYmluZChkZiwgVG90YWxfbi5qKQ0KDQojIENhbWJpYXIgbG9zIG5vbWJyZXMgZGUgbGFzIGNvbHVtbmFzDQpuYW1lcyhkZikgPC0gYygiQ29sb3IiLCAiQ19SdWJpbyIsICJDX1Jvam8iLCAiQ19NZWRpbyIsICJDX09zY3VybyIsICJDX05lZ3JvIg0KICAgICAgICAgICAgICAgIywgIlRvdGFsIg0KICAgICAgICAgICAgICAgKQ0KDQoNCmBgYA0KDQoNCioqRWplbXBsby4qKiANCg0KVsOpYXNlIGxhIEZpZ3VyYSBcQHJlZihmaWc6Q29sb3IxKS4NCg0KDQo8Y2VudGVyPg0KYGBge3IgQ29sb3IxLCBlY2hvPUZBTFNFLCBmaWcuY2FwID0gIioqTWF0cml6ICRGJCAoRnJlY3VlbmNpYXMgYWJzb2x1dGFzKSoqIiwgb3V0LndpZHRoID0gIjcwJSJ9DQojIGZpZy53aWR0aCA9IDIwICMgTm8gZnVuY2lvbmEgZXN0YSBvcGNpb24gZW4gZWwgY2h1bmsNCg0KI2h0dHA6Ly96ZXZyb3NzLmNvbS9ibG9nLzIwMTcvMDYvMTkvdGlwcy1hbmQtdHJpY2tzLWZvci13b3JraW5nLXdpdGgtaW1hZ2VzLWFuZC1maWd1cmVzLWluLXItbWFya2Rvd24tZG9jdW1lbnRzLw0KIyBQYWdpbmEgMzU5IGRlIFIyMDE1LUZyaWVuZGx5DQoNCmtuaXRyOjppbmNsdWRlX2dyYXBoaWNzKCJDb2xvcjEucG5nIikNCg0KI090cmEgbWFuZXJhLCBwZXJvICBzYWxlIGVsIGNhcHRpb246DQojPGNlbnRlcj4NCiMhWygjZmlnOkZpZy1jYXB0aW9uKSBNaSBmaWd1cmFdKE5vbWJyZS5wbmcpe3dpZHRoPTQwMHB4fQ0KIzwvY2VudGVyPg0KYGBgDQo8L2NlbnRlcj4NCg0KDQo8IS0tICUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUgLS0+DQo8IS0tIFNlcGFyYWRvciAtLT4NCg0KIyMjIE1hdHJpY2VzIGRlIGZyZWN1ZW5jaWFzIHJlbGF0aXZhcw0KDQoNClNlYSANCg0KJCRuIFw7IDo9IFw7IFxzdW1cbGltaXRzX3tpPTF9XntKfSBcc3VtXGxpbWl0c197aj0xfV57S31GX3tpan0kJA0KDQpNdWx0aXBsaWNhciBsYSBtYXRyaXogJEYkIHBvciAkXGZyYWN7MX17bn0kIG5vcyBwcm9wb3JjaW9uYSBsYSBtYXRyaXogZGUgZnJlY3VlbmNpYXMgcmVsYXRpdmFzICRQPVxmcmFjezF9e259RiQsIGRvbmRlICRQJCBlcyBsYSBtYXRyaXogZGUgZnJlY3VlbmNpYXMgcmVsYXRpdmFzIGNvbm9jaWRhIGNvbW8gbWF0cml6IGRlIGNvcnJlc3BvbmRlbmNpYSB5ICRuID0gMV97S1x0aW1lcyAxfV5UXCwgRlwsIDFfe0ogXHRpbWVzIDF9JCByZXByZXNlbnRhIGVsIG7Dum1lcm8gdG90YWwgZGUgaW5kaXZpZHVvcyBlbiBsYSB0YWJsYS4NCg0KRXMgY2xhcm8gcXVlIGxhcyBmcmVjdWVuY2lhcyBhYnNvbHV0YXMgbm8gc29uIGFkZWN1YWRhcyBwYXJhIGNvbXBhcmFyIGZpbGFzIG8gY29sdW1uYXMsIHBvciBsbyBxdWUgc2UgcmVjdXJyZSBhIGxhIG1hdHJpeiBkZSBmcmVjdWVuY2lhcyByZWxhdGl2YXMgKG1hdHJpeiBkZSBjb3JyZXNwb25kZW5jaWEpICRQJC4gRXN0YSBtYXRyaXogc2UgZGVmaW5lIGV4cGzDrWNpdGFtZW50ZSBjb21vIGxhIG1hdHJpeiBkZSBvcmRlbiAkSyBcdGltZXMgSiQgcXVlIGNlbnRyYSBsYSB0YWJsYSBzaWd1aWVudGU6DQoNCg0KJCRQPSBcYmVnaW57cG1hdHJpeH0NClhcc2V0bWludXMgWSAmIDEgJiAyICYgXGxkb3RzICYgSiAmIFxtYm94e01hcmdpbmFsIGZpbGF9XFwgDQpcaGxpbmUNCjEgJiBwX3sxMX0gJiBwX3sxMn0gJiBcbGRvdHMgICYgcF97MUp9ICYgZl8xIFxcIA0KMiAmIHBfezIxfSAmIHBfezIyfSAmIFxsZG90cyAgJiBwX3sySn0gJiBmXzJcXCANClx2ZG90cyAgJiAgJiAgJiAgJiAgJiBcdmRvdHMgXFwgDQpLICYgcF97SzF9ICYgcF97SzJ9ICYgXGxkb3RzICYgcF97S0p9ICYgZl9LXFwgDQpcaGxpbmUNClxtYm94e01hcmdpbmFsIGNvbHVtbmF9ICYgY18xICYgY18yICYgXGxkb3RzICYgY19KICYgMQ0KXGVuZHtwbWF0cml4fSwkJA0KDQpkb25kZQ0KDQpcYmVnaW57YWxpZ24qfQ0KIHBfe2lqfSAmPSBcOyBcZnJhY3tGX3tpan19e259LFxcIA0KZl9pICY9IFxzdW1cbGltaXRzX3tqPTF9XntKfXBfe2lqfSxccXF1YWQgDQpjX2ogPSBcc3VtXGxpbWl0c197aT0xfV57S31wX3tpan0gXHF1YWQgXG1ib3h7eX1cXCANClxzdW1cbGltaXRzX3tqPTF9XntKfWNfaiAmPSBcc3VtXGxpbWl0c197aT0xfV57S31mX2kgXDs9IFw7IFxzdW1cbGltaXRzX3tpPTF9XntKfVxzdW1cbGltaXRzX3tqPTF9XntLfXBfe2lqfT0xLg0KXGVuZHthbGlnbip9DQoNCg0KDQoqKkVqZW1wbG8uKiogDQoNClbDqWFzZSBsYSBGaWd1cmEgXEByZWYoZmlnOkNvbG9yMikuDQoNCg0KPGNlbnRlcj4NCmBgYHtyIENvbG9yMiwgZWNobz1GQUxTRSwgZmlnLmNhcCA9ICIqKk1hdHJpeiAkUCQgKEZyZWN1ZW5jaWFzIHJlbGF0aXZhcykqKiIsIG91dC53aWR0aCA9ICI3MCUifQ0KIyBmaWcud2lkdGggPSAyMCAjIE5vIGZ1bmNpb25hIGVzdGEgb3BjaW9uIGVuIGVsIGNodW5rDQoNCiNodHRwOi8vemV2cm9zcy5jb20vYmxvZy8yMDE3LzA2LzE5L3RpcHMtYW5kLXRyaWNrcy1mb3Itd29ya2luZy13aXRoLWltYWdlcy1hbmQtZmlndXJlcy1pbi1yLW1hcmtkb3duLWRvY3VtZW50cy8NCiMgUGFnaW5hIDM1OSBkZSBSMjAxNS1GcmllbmRseQ0KDQprbml0cjo6aW5jbHVkZV9ncmFwaGljcygiQ29sb3IyLnBuZyIpDQoNCiNPdHJhIG1hbmVyYSwgcGVybyAgc2FsZSBlbCBjYXB0aW9uOg0KIzxjZW50ZXI+DQojIVsoI2ZpZzpGaWctY2FwdGlvbikgTWkgZmlndXJhXShOb21icmUucG5nKXt3aWR0aD00MDBweH0NCiM8L2NlbnRlcj4NCmBgYA0KPC9jZW50ZXI+DQoNCg0KDQo8IS0tICUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUgLS0+DQo8IS0tIFNlcGFyYWRvciAtLT4NCg0KIyMjIE1hcmdpbmFsZXMNCg0KXG5vaW5kZW50IERlbm90YXJlbW9zIGNvbW8gJGZfaSQgbGEgZnJlY3VlbmNpYSBtYXJnaW5hbCBkZSBsYSBpLcOpc2ltYSBmaWxhIHkgY29tbyAkY19qJCBsYSBmcmVjdWVuY2lhIG1hcmdpbmFsIGRlIGxhICRqJC3DqXNpbWEgY29sdW1uYSwgZG9uZGUgJGk9MSxcbGRvdHMsIEskIHkgJGo9MSxcbGRvdHMsIEokLCBvIGRlIG1hbmVyYSB2ZWN0b3JpYWw6DQoNCiQkIGYgPSBQXCwgMV97Slx0aW1lcyAxfSBccXF1YWRcbWJveHt5fVxxcXVhZCBjID0gUF5UXCwgMV97S1x0aW1lcyAxfSwgJCQNCg0KdmVjdG9yZXMgcXVlIHJlcHJlc2VudGFuIGxhcyAqZnJlY3VlbmNpYXMgbWFyZ2luYWxlcyBkZSBmaWxhcyogeSAqY29sdW1uYXMqLCByZXNwZWN0aXZhbWVudGUuDQoNCg0KDQo8IS0tICUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUgLS0+DQo8IS0tIFNlcGFyYWRvciAtLT4NCg0KIyBJbmRlcGVuZGVuY2lhDQoNCiMjIyBFbCBlc3RhZMOtc3RpY28NCg0KRXMgY29ub2NpZG8gcXVlIGVsIGVzdGFkw61zdGljbyBtw6FzIGZyZWN1ZW50ZW1lbnRlIGVtcGxlYWRvIHBhcmEgYW5hbGl6YXIgbGEgaW5kZXBlbmRlbmNpYSBlc3RhZMOtc3RpY2EgZW50cmUgZG9zIHZhcmlhYmxlcyBjYXRlZ8OzcmljYXMgZXM6DQoNClxiZWdpbnthbGlnbn0NClhfeyhLLTEpXHRpbWVzIChKLTEpfV4yICY9IFxzdW1fe2k9MX1ee0p9XHN1bV97aj0xfV57S30gXGZyYWN7KEZfe2lqfS1FXGxlZnRbRl97aWp9KVxyaWdodF1eMn17RShGX3tpan0pfSA9IG5eMiBcc3VtX3tpPTF9XntKfVxzdW1fe2o9MX1ee0t9IFxmcmFje1xsZWZ0W1xmcmFje0Zfe2lqfX17bn0tRSggXGZyYWN7Rl97aWp9fXtufSlccmlnaHRdXjJ9e0UoRl97aWp9KX0gXG5vdGFnXFwgDQomPSBcc3VtX3tpPTF9XntKfVxzdW1fe2o9MX1ee0t9IFxmcmFje1xsZWZ0W1xmcmFje0Zfe2lqfX17bn0gLSBFKFxmcmFje0Zfe2lqfX17bn0pXHJpZ2h0XV4yfXtFXGxlZnRbXGZyYWN7Rl97aWp9fXtufVxyaWdodF19ID0gbl4yIFxzdW1fe2k9MX1ee0p9XHN1bV97aj0xfV57S30gXGZyYWN7KHBfe2lqfSAtIGVfe2lqfSleMn17ZV97aWp9fSwgKFwjZXE6ZWMtNC0xKQ0KXGVuZHthbGlnbn0NCg0KXG5vaW5kZW50IGRvbmRlOiANCiAgDQogICsgJEUoRl97aWp9KSQgcmVwcmVzZW50YSBsYSBmcmVjdWVuY2lhIGFic29sdXRhIGVzcGVyYWRhIGVuIGxhIGNhc2lsbGEgJChpLGopJCBkZSBsYSBtYXRyaXogJEYkLCB5IA0KICANCiAgKyAkZV97aWp9JCBlcyBsYSBmcmVjdWVuY2lhIHJlbGF0aXZhIGVzcGVyYWRhIGVuIGxhIGNhc2lsbGEgJChpLCBqKSQgZGUgbGEgbWF0cml6IGRlIGNvcnJlc3BvbmRlbmNpYSAkUCQuDQoNCk9ic2VydmVtb3MgcXVlLCBkZSBcQHJlZihlcTplYy00LTEpLCBzZSB0aWVuZSBxdWUNCg0KJCQgXGZyYWN7MX17bn0gWF97KEstMSlcdGltZXMgKEotMSl9XjI9IFxzdW1fe2k9MX1ee0p9XHN1bV97aj0xfV57S30gXGZyYWN7KHBfe2lqfSAtIGVfe2lqfSleMn17ZV97aWp9fS4gJCQNCg0KDQoqKlBhcmEgZWwgZWplbXBsbzoqKg0KDQpgYGB7ciwgZWNobz1GQUxTRX0NCnRhYmxhPC1kZlstMV0NCmNoaXNxX3Rlc3QgPC0gY2hpc3EudGVzdCh0YWJsYSkNCmNoaXNxX3Rlc3QNCmBgYA0KDQoNCg0KDQo8IS0tICUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUgLS0+DQo8IS0tIFNlcGFyYWRvciAtLT4NCg0KIyMjIE1hdHJpY2VzIGRlIHJlc2lkdW9zIGVzdGFuZGFyaXphZG9zDQoNClNpIGRlZmluaW1vcyAkRF9mJCB5ICREX2MkIGNvbW8gbGFzIG1hdHJpY2VzIGRpYWdvbmFsZXMgJERfZiA9IFx0ZXh0e2RpYWd9KGYpX3tJXHRpbWVzIEl9JCB5ICREX2MgPSBcdGV4dHtkaWFnfShjKV97Slx0aW1lcyBKfSQsIHJlcHJlc2VudGFuZG8gbGFzIGZyZWN1ZW5jaWFzIG1hcmdpbmFsZXMgZGUgZmlsYXMgeSBjb2x1bW5hcyByZXNwZWN0aXZhbWVudGUsIGVudG9uY2VzIGxhIG1hdHJpeg0KDQpcYmVnaW57ZXF1YXRpb259IA0KUyA9IERfZl57LTEvMn0gKFAtZlw7IGNeVCkgRF9jXnstMS8yfSAgICAgKFwjZXE6ZWMtNC0yKQ0KXGVuZHtlcXVhdGlvbn0NCg0KXG5vaW5kZW50IGVzIGxhICptYXRyaXogZGUgcmVzaWR1b3MgZXN0YW5kYXJpemFkb3MqLiBTZSBwdWVkZSBkZW1vc3RyYXIgcXVlIA0KDQokJFNcLCBTXlRccXVhZCBcdGV4dHt5fSBccXVhZCBTXlRcLCBTJCQNCg0Kc29uIG1hdHJpY2VzIHNpbcOpdHJpY2FzLCBjdXlhIHRyYXphIGVzIHByZWNpc2FtZW50ZSBlbCBlc3RhZMOtc3RpY28gZGUgcHJ1ZWJhIGVuIGxhIHBydWViYSBkZSBpbmRlcGVuZGVuY2lhIHBhcmEgZG9zIHZhcmlhYmxlcyBjYXRlZ8OzcmljYXMsIGVzIGRlY2lyLA0KDQokJFx0ZXh0e3RyYXphfShTU15UKSA9IFx0ZXh0e3RyYXphfShTXlRTKSBcc3VtX3tpPTF9XntKfVwsIFxzdW1fe2o9MX1ee0t9IFxmcmFjeyhwX3tpan0gXDsgLSBcOyBmX2kgXCwgY19qKV4yfXtlX3tpan19LiQkDQoNCjwhLS0gJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSAtLT4NCjwhLS0gU2VwYXJhZG9yIC0tPg0KDQojIyMgRGVzY29tcG9zaWNpw7NuIGVuIHZhbG9yZXMgc2luZ3VsYXJlcw0KDQpcbm9pbmRlbnQgU2kgcmVhbGl6YW1vcyBsYSBkZXNjb21wb3NpY2nDs24gZW4gdmFsb3JlcyBzaW5ndWxhcmVzIGRlIGxhIG1hdHJpeiAkUyQsIG9idGVuZW1vczoNCg0KXGJlZ2lue2VxdWF0aW9ufQ0KUyBcOz1cOyAgVVwsRF97XGxhbWJkYX1cLCBWXlQsKFwjZXE6ZWMtNC0zKQ0KXGVuZHtlcXVhdGlvbn0NCg0KXG5vaW5kZW50IGRvbmRlDQoNCiQkVVVeVCA9IElfSywgXDsgVlZeVCA9IElfSiBccXVhZCBcdGV4dHt5fSBccXVhZCBEX1xsYW1iZGEgPSBcdGV4dHtkaWFnfShcbGFtYmRhXzEsXGxhbWJkYV8yLCBcbGRvdHMsKV97S1x0aW1lcyBKfSwkJA0KDQpcbm9pbmRlbnQgc2llbmRvICREX1xsYW1iZGEkIHVuYSBtYXRyaXogZGlhZ29uYWwgeSBsb3MgJFxsYW1iZGFfaSQsICRpID0gMSwgXGxkb3RzLCBcdGV4dHtyYW5nfShTKSA9IHQkLCBsYXMgcmHDrWNlcyBjdWFkcmFkYXMgcG9zaXRpdmFzIGRlIGxvcyAkdCQgdmFsb3JlcyBwcm9waW9zIGRlIGxhcyBtYXRyaWNlcyBzaW3DqXRyaWNhcyAkU1wsU15UJCB5ICRTXlRcLFMkLiBMb3MgJHQkIHByaW1lcm9zIHZlY3RvcmVzIGRlIGxhcyBtYXRyaWNlcyBvcnRvZ29uYWxlcyAkVSQgeSAkViQgc29uIGxvcyB2ZWN0b3JlcyBwcm9waW9zIGRlIGxhcyBtYXRyaWNlcyAkUydTJCB5ICRTUyckLCByZXNwZWN0aXZhbWVudGUuIA0KDQo8IS0tICUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUgLS0+DQo8IS0tIFNlcGFyYWRvciAtLT4NCg0KIyMjIEJhc2UNCg0KTG9zICR0JCBwcmltZXJvcyB2ZWN0b3JlcyBkZSAkVSQgY29uc3RpdHV5ZW4gdW5hIGJhc2UgcGFyYSBlbCBzdWJlc3BhY2lvIGdlbmVyYWRvIHBvciBsYXMgZmlsYXMgZGUgJFAkIHkgbG9zICR0JCBwcmltZXJvcyB2ZWN0b3JlcyBkZSBsYSBtYXRyaXogJFYkIGNvbnN0aXR1eWVuIHVuYSBiYXNlIHBhcmEgZWwgc3ViZXNwYWNpbyBnZW5lcmFkbyBwb3IgbGFzIGNvbHVtbmFzIGRlICRQJC4gRXMgZGVjaXIsIHNpIGNvbnN0cnVpbW9zIGxhcyBtYXRyaWNlcyAkVV97dFx0aW1lcyB0fSQsICRWX3t0XHRpbWVzIHR9JCB5ICREX1xsYW1iZGEsX3t0XHRpbWVzIHR9JCwgbGEgbWF0cml6IA0KDQokJFNfe3RcdGltZXMgdH0gXDs9XDsgIFVfe3RcdGltZXMgdH1cLCBEX1xsYW1iZGEsX3t0XHRpbWVzIHR9XCwgVl97dFx0aW1lcyB0fSQkDQoNCnNlcsOhIGxhIG1hdHJpeiBkZSByYW5nbyBtw61uaW1vIHF1ZSBtZWpvciBzZSBhcHJveGltYSBhIGxhIG1hdHJpeiAkUyQuDQoNCjwhLS0gJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSAtLT4NCjwhLS0gU2VwYXJhZG9yIC0tPg0KDQojIyMgUHJvYmxlbWEgQ0ENCg0KQXPDrSwgZWwgcHJvYmxlbWEgZGUgYW7DoWxpc2lzIGRlIGNvcnJlc3BvbmRlbmNpYSBzaW1wbGUgc2UgcHVlZGUgZXhwcmVzYXIgY29tbyB1biBwcm9ibGVtYSBkZSBtw61uaW1vcyBjdWFkcmFkb3MgcG9uZGVyYWRvcyBwYXJhIGRldGVybWluYXIgbGEgbWF0cml6ICRcd2lkZWhhdHtlfSA9IChcd2lkZWhhdHtlfV97aWp9KSA9IGZcLGMkLCBkZSByYW5nbyByZWR1Y2lkbyBxdWUgbWluaW1pemEgbGENCg0KJCRcdGV4dHt0cmF6YX0oU1wsIFNeVCkgXDs9XDsgXHRleHR7dHJhemF9KFNeVFwsIFMpIFwsIFxzdW1fe2k9MX1ee0p9XHN1bV97aj0xfV57S30gXGZyYWN7KHBfe2lqfSBcOy1cOyBmX2kgXCxjX2opXjJ9e2Vfe2lqfX0uJCQNCg0KDQoNCjwhLS0gJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSAtLT4NCjwhLS0gU2VwYXJhZG9yIC0tPg0KDQoNCiMgUGVyZmlsZXMgZmlsYSB5IGNvbHVtbmFzDQoNClNlIGhhbGxhbiBkaXZpZGllbmRvIGxhIGZyZWN1ZW5jaWEgcmVsYXRpdmEgZW50cmUgZWwgdG90YWwgZGUgZmlsYSBvIGNvbHVtbmEgY29ycmVzcG9uZGllbnRlLiAgTG9zIHBlcmZpbGVzIGRlIGZpbGEgeSBjb2x1bW5hIHNlIHB1ZWRlbiBjb21wYXJhciBjb24gbGFzIGRpc3RyaWJ1Y2lvbmVzIGNvcnJlc3BvbmRpZW50ZXMgZGUgY29sdW1uYSB5IGZpbGEsIGNvbnNpZGVyYW5kbyBzdSByZXNwZWN0aXZhIGltcG9ydGFuY2lhLCBwYXJhIGV2YWx1YXIgc3UgZGVzdmlhY2nDs24gZGUgbGEgaW5kZXBlbmRlbmNpYS4NCg0KPCEtLSAlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlIC0tPg0KPCEtLSBTZXBhcmFkb3IgLS0+DQoNCiMgUGVyZmlsZXMgZmlsYSANCg0KIyMjIE1hdHJpeiBkZSBwZXJmaWxlcyBmaWxhcyANCg0KKipFamVtcGxvLioqIA0KDQpWw6lhc2UgbGEgRmlndXJhIFxAcmVmKGZpZzpDb2xvcjMpLg0KDQoNCjxjZW50ZXI+DQpgYGB7ciBDb2xvcjMsIGVjaG89RkFMU0UsIGZpZy5jYXAgPSAiKipNYXRyaXogZGUgcGVyZmlsZXMgZmlsYSoqIiwgb3V0LndpZHRoID0gIjcwJSJ9DQojIGZpZy53aWR0aCA9IDIwICMgTm8gZnVuY2lvbmEgZXN0YSBvcGNpb24gZW4gZWwgY2h1bmsNCg0KI2h0dHA6Ly96ZXZyb3NzLmNvbS9ibG9nLzIwMTcvMDYvMTkvdGlwcy1hbmQtdHJpY2tzLWZvci13b3JraW5nLXdpdGgtaW1hZ2VzLWFuZC1maWd1cmVzLWluLXItbWFya2Rvd24tZG9jdW1lbnRzLw0KIyBQYWdpbmEgMzU5IGRlIFIyMDE1LUZyaWVuZGx5DQoNCmtuaXRyOjppbmNsdWRlX2dyYXBoaWNzKCJDb2xvcjMucG5nIikNCg0KI090cmEgbWFuZXJhLCBwZXJvICBzYWxlIGVsIGNhcHRpb246DQojPGNlbnRlcj4NCiMhWygjZmlnOkZpZy1jYXB0aW9uKSBNaSBmaWd1cmFdKE5vbWJyZS5wbmcpe3dpZHRoPTQwMHB4fQ0KIzwvY2VudGVyPg0KYGBgDQo8L2NlbnRlcj4NCg0KDQo8IS0tICUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUgLS0+DQo8IS0tIFNlcGFyYWRvciAtLT4NCg0KDQojIyMgRGlhZ3JhbWEgZGUgcGVyZmlsZXMgZmlsYSANCg0KIEVuIGxhIHJlcHJlc2VudGFjacOzbiBkZWwgcGVyZmlsIGRlbCAqKmNvbG9yIGRlIG9qb3MgZW4gcmVsYWNpw7NuIGNvbiBlbCBjb2xvciBkZWwgY2FiZWxsbyoqLCBzZSBvYnNlcnZhIHVuYSBzaW1pbGl0dWQgY29uc2lkZXJhYmxlIGVudHJlIGxvcyBwZXJmaWxlcyBkZSAqb2pvcyBjbGFyb3MqIHkgKm9qb3MgYXp1bGVzKiwgcXVlIGVzIHNpbWlsYXIgKGF1bnF1ZSBsaWdlcmFtZW50ZSBtZW5vcikgYSBsYSBzaW1pbGl0dWQgbyBwcm94aW1pZGFkIGVudHJlIGxvcyBwZXJmaWxlcyBkZSAqb2pvcyBtZWRpb3MqIHkgKm9zY3Vyb3MqICh2ZXIgRmlndXJhIFxAcmVmKGZpZzpDb2xvcjQpKS4NCg0KPGNlbnRlcj4NCmBgYHtyIENvbG9yNCwgZWNobz1GQUxTRSwgZmlnLmNhcCA9ICIqKkhpc3RvZ3JhbWEgZGUgcGVyZmlsZXMgZmlsYSoqIiwgb3V0LndpZHRoID0gIjcwJSJ9DQojIGZpZy53aWR0aCA9IDIwICMgTm8gZnVuY2lvbmEgZXN0YSBvcGNpb24gZW4gZWwgY2h1bmsNCg0KI2h0dHA6Ly96ZXZyb3NzLmNvbS9ibG9nLzIwMTcvMDYvMTkvdGlwcy1hbmQtdHJpY2tzLWZvci13b3JraW5nLXdpdGgtaW1hZ2VzLWFuZC1maWd1cmVzLWluLXItbWFya2Rvd24tZG9jdW1lbnRzLw0KIyBQYWdpbmEgMzU5IGRlIFIyMDE1LUZyaWVuZGx5DQoNCmtuaXRyOjppbmNsdWRlX2dyYXBoaWNzKCJDb2xvcjQucG5nIikNCg0KI090cmEgbWFuZXJhLCBwZXJvICBzYWxlIGVsIGNhcHRpb246DQojPGNlbnRlcj4NCiMhWygjZmlnOkZpZy1jYXB0aW9uKSBNaSBmaWd1cmFdKE5vbWJyZS5wbmcpe3dpZHRoPTQwMHB4fQ0KIzwvY2VudGVyPg0KYGBgDQo8L2NlbnRlcj4NCg0KPCEtLSAlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlIC0tPg0KPCEtLSBTZXBhcmFkb3IgLS0+DQotPg0KDQojIFBlcmZpbGVzIGNvbHVtbmENCg0KIyMjIE1hdHJpeiBkZSBwZXJmaWxlcyBjb2x1bW5hDQoNCg0KKipFamVtcGxvLioqIA0KDQpWw6lhc2UgbGEgRmlndXJhIFxAcmVmKGZpZzpDb2xvcjUpLg0KDQoNCjxjZW50ZXI+DQpgYGB7ciBDb2xvcjUsIGVjaG89RkFMU0UsIGZpZy5jYXAgPSAiKipNYXRyaXogZGUgcGVyZmlsZXMgY29sdW1uYSoqIiwgb3V0LndpZHRoID0gIjcwJSJ9DQojIGZpZy53aWR0aCA9IDIwICMgTm8gZnVuY2lvbmEgZXN0YSBvcGNpb24gZW4gZWwgY2h1bmsNCg0KI2h0dHA6Ly96ZXZyb3NzLmNvbS9ibG9nLzIwMTcvMDYvMTkvdGlwcy1hbmQtdHJpY2tzLWZvci13b3JraW5nLXdpdGgtaW1hZ2VzLWFuZC1maWd1cmVzLWluLXItbWFya2Rvd24tZG9jdW1lbnRzLw0KIyBQYWdpbmEgMzU5IGRlIFIyMDE1LUZyaWVuZGx5DQoNCmtuaXRyOjppbmNsdWRlX2dyYXBoaWNzKCJDb2xvcjUucG5nIikNCg0KI090cmEgbWFuZXJhLCBwZXJvICBzYWxlIGVsIGNhcHRpb246DQojPGNlbnRlcj4NCiMhWygjZmlnOkZpZy1jYXB0aW9uKSBNaSBmaWd1cmFdKE5vbWJyZS5wbmcpe3dpZHRoPTQwMHB4fQ0KIzwvY2VudGVyPg0KYGBgDQo8L2NlbnRlcj4NCg0KPCEtLSAlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlIC0tPg0KPCEtLSBTZXBhcmFkb3IgLS0+DQoNCg0KIyMjIERpYWdyYW1hIGRlIHBlcmZpbGVzIGNvbHVtbmENCg0KRW4gZWwgYW7DoWxpc2lzIGRlbCAqKnBlcmZpbCBkZSBjb2xvciBkZWwgY2FiZWxsbyoqLCBzZSBvYnNlcnZhIHVuYSBzaW1pbGl0dWQgbm90YWJsZSBlbnRyZSBsb3MgcGVyZmlsZXMgZGUgKmNhYmVsbG8gcnViaW8qIHkgKnJvam8qLCBhc8OtIGNvbW8gZW50cmUgbG9zICpjYWJlbGxvcyBvc2N1cm8qIHkgKm5lZ3JvKi4gUG9yIG90cm8gbGFkbywgZWwgcGVyZmlsIGRlICpjYWJlbGxvIG1lZGlvKiBzZSBkaXN0aW5ndWUgbm90YWJsZW1lbnRlIGRlIGxvcyBkZW3DoXMgcGVyZmlsZXMuIEVzdG8gc2UgcHVlZGUgYXByZWNpYXIgZW4gbGEgRmlndXJhIFxAcmVmKGZpZzpDb2xvcjYpLg0KDQo8Y2VudGVyPg0KYGBge3IgQ29sb3I2LCBlY2hvPUZBTFNFLCBmaWcuY2FwID0gIioqSGlzdG9ncmFtYSBkZSBwZXJmaWxlcyBjb2x1bW5hKioiLCBvdXQud2lkdGggPSAiNzAlIn0NCiMgZmlnLndpZHRoID0gMjAgIyBObyBmdW5jaW9uYSBlc3RhIG9wY2lvbiBlbiBlbCBjaHVuaw0KDQojaHR0cDovL3pldnJvc3MuY29tL2Jsb2cvMjAxNy8wNi8xOS90aXBzLWFuZC10cmlja3MtZm9yLXdvcmtpbmctd2l0aC1pbWFnZXMtYW5kLWZpZ3VyZXMtaW4tci1tYXJrZG93bi1kb2N1bWVudHMvDQojIFBhZ2luYSAzNTkgZGUgUjIwMTUtRnJpZW5kbHkNCg0Ka25pdHI6OmluY2x1ZGVfZ3JhcGhpY3MoIkNvbG9yNi5wbmciKQ0KDQojT3RyYSBtYW5lcmEsIHBlcm8gIHNhbGUgZWwgY2FwdGlvbjoNCiM8Y2VudGVyPg0KIyFbKCNmaWc6RmlnLWNhcHRpb24pIE1pIGZpZ3VyYV0oTm9tYnJlLnBuZyl7d2lkdGg9NDAwcHh9DQojPC9jZW50ZXI+DQpgYGANCjwvY2VudGVyPg0KDQo8IS0tICUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUgLS0+DQo8IS0tIFNlcGFyYWRvciAtLT4NCg0KDQojIERpc3RhbmNpYXMgY2hpLWN1YWRyYWRhcw0KDQojIyMgRGlzdGFuY2lhIGVudHJlIGZpbGFzIG8gY29sdW1uYXMNCg0KRXMgbGEgZGlzdGFuY2lhIGVudHJlIGZpbGFzIHkgY29sdW1uYXMgZGUgbGEgbWF0cml6IGRlIGRhdG9zLiBQYXJhIGV4cGxpY2FybGEsIG51ZXZhbWVudGUsIGNvbnNpZGVyZW1vcyBsYSBtYXRyaXogJFAkLiBTdXBvbmdhbW9zIHF1ZSBsYXMgZmlsYXMgJGkkIHkgJGokIHRpZW5lbiBsYSBzaWd1aWVudGUgY29uZmlndXJhY2nDs246DQoNCg0KPHRhYmxlIHN0eWxlPSJib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlOyB3aWR0aDogNTAlOyBtYXJnaW4tbGVmdDogYXV0bzsgbWFyZ2luLXJpZ2h0OiBhdXRvOyI+DQogIDx0ciBzdHlsZT0idGV4dC1hbGlnbjogY2VudGVyOyI+DQogICAgPHRoIHN0eWxlPSJib3JkZXI6IDFweCBzb2xpZCBibGFjazsiPiRpJDwvdGg+DQogICAgPHRoIHN0eWxlPSJib3JkZXI6IDFweCBzb2xpZCBibGFjazsiPjAuMDE1PC90aD4NCiAgICA8dGggc3R5bGU9ImJvcmRlcjogMXB4IHNvbGlkIGJsYWNrOyI+MC4wMjwvdGg+DQogICAgPHRoIHN0eWxlPSJib3JkZXI6IDFweCBzb2xpZCBibGFjazsiPjAuMDE8L3RoPg0KICAgIDx0aCBzdHlsZT0iYm9yZGVyOiAxcHggc29saWQgYmxhY2s7Ij4wLjAyPC90aD4NCiAgICA8dGggc3R5bGU9ImJvcmRlcjogMXB4IHNvbGlkIGJsYWNrOyI+JGZfaT0wLjA3NSQ8L3RoPg0KICA8L3RyPg0KICA8dHIgc3R5bGU9InRleHQtYWxpZ246IGNlbnRlcjsiPg0KICAgIDx0aCBzdHlsZT0iYm9yZGVyOiAxcHggc29saWQgYmxhY2s7Ij4kaiQ8L3RoPg0KICAgIDx0ZCBzdHlsZT0iYm9yZGVyOiAxcHggc29saWQgYmxhY2s7Ij4wLjAwMTU8L3RkPg0KICAgIDx0ZCBzdHlsZT0iYm9yZGVyOiAxcHggc29saWQgYmxhY2s7Ij4wLjAwMjwvdGQ+DQogICAgPHRkIHN0eWxlPSJib3JkZXI6IDFweCBzb2xpZCBibGFjazsiPjAuMDAxPC90ZD4NCiAgICA8dGQgc3R5bGU9ImJvcmRlcjogMXB4IHNvbGlkIGJsYWNrOyI+MC4wMDI8L3RkPg0KICAgIDx0ZCBzdHlsZT0iYm9yZGVyOiAxcHggc29saWQgYmxhY2s7Ij4kZl9qPTAuMDA3NSQ8L3RkPg0KICA8L3RyPg0KPC90YWJsZT4NCg0KDQoNCkFwYXJlbnRlbWVudGUsIGxhIGZpbGEgJGkkIHBhcmVjZSBtw6FzIGRlbnNhIHF1ZSBsYSBmaWxhICRqJC4gRW4gbGEgZmlsYSAkaSQgc2UgZW5jdWVudHJhIGVsICQ3LjUlJCBkZSBsYSBwb2JsYWNpw7NuLCBtaWVudHJhcyBxdWUgZW4gbGEgZmlsYSAkaiQgc29sbyBlbCAkMC43NSUkLiBTaSBubyBjb25zaWRlcmFtb3MgZWwgdGFtYcOxbywgbGFzIGZyZWN1ZW5jaWFzIHJlbGF0aXZhcyBpbnRyYWZpbGEgc29uIGlkw6ludGljYXMgZW4gY2FkYSBmaWxhLiBQb3IgbG8gdGFudG8sIHBhcmEgYW5hbGl6YXIgbGFzIGRpZmVyZW5jaWFzIHJlbGF0aXZhcyBlbnRyZSBmaWxhcywgZGViZW1vcyBjb3JyZWdpciBlbCBlZmVjdG8gdGFtYcOxby4gRXN0byBzZSBsb2dyYSBjb25zaWRlcmFuZG8gbGEgbWF0cml6IGN1eW9zIGVsZW1lbnRvcyBzb24gZGUgbGEgZm9ybWEgJHBfe2lqfS9mX2kkIHBhcmEgbGFzIGZpbGFzIHkgJHBfe2lqfS9jX2okIHBhcmEgbGFzIGNvbHVtbmFzLCBvYnRlbmllbmRvIGFzw60gZG9zIG1hdHJpY2VzLg0KDQpPdHJvIHByb2JsZW1hIGFsIHF1ZSBub3MgZW5mcmVudGFtb3MgZXMgc2kgbGFzIGZpbGFzICRpLCBqJCB5ICRrJCBkZSBsYSBtYXRyaXogcG9uZGVyYWRhIHBvciBsYXMgbWFyZ2luYWxlcyBkZSBsYXMgZmlsYXMgc29uOg0KDQo8dGFibGUgc3R5bGU9ImJvcmRlci1jb2xsYXBzZTogY29sbGFwc2U7IHdpZHRoOiA1MCU7IG1hcmdpbi1sZWZ0OiBhdXRvOyBtYXJnaW4tcmlnaHQ6IGF1dG87Ij4NCiAgPHRyIHN0eWxlPSJ0ZXh0LWFsaWduOiBjZW50ZXI7Ij4NCiAgICA8dGggc3R5bGU9ImJvcmRlcjogMXB4IHNvbGlkIGJsYWNrOyI+JGkkPC90aD4NCiAgICA8dGggc3R5bGU9ImJvcmRlcjogMXB4IHNvbGlkIGJsYWNrOyI+MC4xNTwvdGg+DQogICAgPHRoIHN0eWxlPSJib3JkZXI6IDFweCBzb2xpZCBibGFjazsiPjAuMDI8L3RoPg0KICAgIDx0aCBzdHlsZT0iYm9yZGVyOiAxcHggc29saWQgYmxhY2s7Ij4wLjEwPC90aD4NCiAgICA8dGggc3R5bGU9ImJvcmRlcjogMXB4IHNvbGlkIGJsYWNrOyI+MC40MzwvdGg+DQogICAgPHRoIHN0eWxlPSJib3JkZXI6IDFweCBzb2xpZCBibGFjazsiPjAuMzA8L3RoPg0KICA8L3RyPg0KICA8dHIgc3R5bGU9InRleHQtYWxpZ246IGNlbnRlcjsiPg0KICAgIDx0aCBzdHlsZT0iYm9yZGVyOiAxcHggc29saWQgYmxhY2s7Ij4kaiQ8L3RoPg0KICAgIDx0ZCBzdHlsZT0iYm9yZGVyOiAxcHggc29saWQgYmxhY2s7Ij4wLjE1PC90ZD4NCiAgICA8dGQgc3R5bGU9ImJvcmRlcjogMXB4IHNvbGlkIGJsYWNrOyI+MC4wMjwvdGQ+DQogICAgPHRkIHN0eWxlPSJib3JkZXI6IDFweCBzb2xpZCBibGFjazsiPjAuMTA8L3RkPg0KICAgIDx0ZCBzdHlsZT0iYm9yZGVyOiAxcHggc29saWQgYmxhY2s7Ij4wLjQ0PC90ZD4NCiAgICA8dGQgc3R5bGU9ImJvcmRlcjogMXB4IHNvbGlkIGJsYWNrOyI+MC4yOTwvdGQ+DQogIDwvdHI+DQogIDx0ciBzdHlsZT0idGV4dC1hbGlnbjogY2VudGVyOyI+DQogICAgPHRoIHN0eWxlPSJib3JkZXI6IDFweCBzb2xpZCBibGFjazsiPiRrJDwvdGg+DQogICAgPHRkIHN0eWxlPSJib3JkZXI6IDFweCBzb2xpZCBibGFjazsiPjAuMTU8L3RkPg0KICAgIDx0ZCBzdHlsZT0iYm9yZGVyOiAxcHggc29saWQgYmxhY2s7Ij4wLjAxPC90ZD4NCiAgICA8dGQgc3R5bGU9ImJvcmRlcjogMXB4IHNvbGlkIGJsYWNrOyI+MC4xMDwvdGQ+DQogICAgPHRkIHN0eWxlPSJib3JkZXI6IDFweCBzb2xpZCBibGFjazsiPjAuNDQ8L3RkPg0KICAgIDx0ZCBzdHlsZT0iYm9yZGVyOiAxcHggc29saWQgYmxhY2s7Ij4wLjMwPC90ZD4NCiAgPC90cj4NCjwvdGFibGU+DQoNCk9ic2VydmUgcXVlIGxhIGRpc3RhbmNpYSBldWNsaWRpYW5hIGVudHJlIGxhcyBmaWxhcyAkaSQgeSAkaiQsIHkgZW50cmUgbGFzIGZpbGFzICRpJCB5ICRrJCwgc2UgZGVmaW5lbiBjb21vOg0KDQpcYmVnaW57YWxpZ24qfQ0KZF9lXjIoaSxqKSAmPSBcc3VtX3tsPTF9XntKfVxsZWZ0IChcZnJhY3twX3tpbH19e2ZfaX0gLSBcZnJhY3twX3tqbH19e2Zfan1ccmlnaHQpXjJcXA0KJj0gKDAuNDMtMC40NCleMiBcOytcOyAoMC4zMC0wLjI5KV4yIFw7PVw7IDAuMDAwMlxcDQomXFwNCmRfZV4yKGksaykgJj1cc3VtX3tsPTF9XntKfVxsZWZ0IChcZnJhY3twX3tpbH19e2ZfaX0gLSBcZnJhY3twX3trbH19e2Zfa31ccmlnaHQpXjIgXFwNCiY9ICgwLjQzLTAuNDQpXjIgXDsrXDsgKDAuMDItMC4wMSleMiBcOz1cOyAwLjAwMDIsDQpcZW5ke2FsaWduKn0NCg0KRXN0byBlcyBjbGFyYW1lbnRlIHByb2JsZW3DoXRpY28sIHlhIHF1ZSBubyBlcyBsbyBtaXNtbyB1bmEgZGlzY3JlcGFuY2lhIGRlIDAuMDEgZW50cmUgMC4yOSB5IDAuMzAsIHF1ZSBlbnRyZSAwLjAxIHkgMC4wMi4gDQoNCjwhLS0gJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSAtLT4NCjwhLS0gU2VwYXJhZG9yIC0tPg0KDQoNCiMjIyBEaXN0YW5jaWEgZW50cmUgZmlsYXMNCg0KVW5hIGZvcm1hIGRlIGNvcnJlZ2lyIGVzdGUgcHJvYmxlbWEgZXMgcG9uZGVyYW5kbyBjYWRhIGVsZW1lbnRvIGRlIGxhIHN1bWEgcG9yIGVsIG1hcmdpbmFsIGRlIGxhIGNvbHVtbmEgY29ycmVzcG9uZGllbnRlOg0KDQokJGReMiAoZl9pLCBmX2opID0gXHN1bV97bD0xfV57Sn1cZnJhY3sxfXtjX2x9XGxlZnQoXGZyYWN7cF97aWx9fXtmX2l9IC0gXGZyYWN7cF97amx9fXtmX2p9XHJpZ2h0ICleMiA9IChmX2kgLSBmX2opXlRcLCBEX2Neey0xfSBcLCAoZl9pIC0gZl9qKSwkJA0KDQpEb25kZToNCiAgDQogICsgJGZfaSQgeSAkZl9qJCBzb24gbG9zIHZlY3RvcmVzIGN1eW9zIGVsZW1lbnRvcyBzb24gbGFzIGZpbGFzICRpJCB5ICRqJCwgcmVzcGVjdGl2YW1lbnRlLCBkZSBsYSBtYXRyaXogJFAkOyB5IA0KICANCiAgKyAkRF9jJCBlcyB1bmEgbWF0cml6IGRpYWdvbmFsIGNvbiBlbGVtZW50b3MgJGNfbCQuIEEgZXN0YSBkaXN0YW5jaWEgc2UgbGUgY29ub2NlIGNvbiBlbCBub21icmUgZGUgKmRpc3RhbmNpYSBjaGktY3VhZHJhZG8qLg0KDQoNCg0KPCEtLSAlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlIC0tPg0KPCEtLSBTZXBhcmFkb3IgLS0+DQoNCiMjIyBEaXN0YW5jaWEgZW50cmUgY29sdW1uYXMNCg0KVXRpbGl6YW5kbyB1biBwcm9jZWRpbWllbnRvIGFuw6Fsb2dvIHNlIG9idGllbmVuIGxhcyBkaXN0YW5jaWFzIGNoaS1jdWFkcmFkbyBlbnRyZSBkb3MgY29sdW1uYXMgJGokIHkgJGskIGRlIGVzYSBtYXRyaXogZGUgZGF0b3MsIGFzw606DQoNCiQkZF4yIChjX2osIGNfaykgXDs9XDsgXHN1bV97bD0xfV57S31cZnJhY3sxfXtmX2x9XGxlZnQoXGZyYWN7cF97bGp9fXtjX2p9IC0gXGZyYWN7cF97bGt9fXtjX2t9XHJpZ2h0ICleMiBcOz1cOyAoY19qIC0gY19rKV5UIFwsRF9mXnstMX1cLCAoY19qIC0gY19rKSwkJA0KDQpkb25kZToNCiAgDQogICsgJGZfaiQgeSAkZl9rJCBzb24gbG9zIHZlY3RvciBjdXlvcyBlbGVtZW50b3Mgc29uIGxhcyBjb2x1bW5hcyAkaSQgeSAkaiQsIHJlc3BlY3RpdmFtZW50ZSwgZGUgbGEgbWF0cml6ICRQJDsgeSANCiAgDQogICsgJERfZiQsIGVzIHVuYSBtYXRyaXogZGlhZ29uYWwgY29uIGVsZW1lbnRvcyAkZl9sJC4NCiAgDQoNCjwhLS0gJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSAtLT4NCjwhLS0gU2VwYXJhZG9yIC0tPg0KDQojIyMgRGlzdGFuY2lhIChvYnNlcnZhY2lvbmVzKQ0KDQoqKlByaW1lcm8uKioNCg0KTm90ZSBxdWUgbG9zIHZhbG9yZXMgZGUgbGFzIGRpc3RhbmNpYXMgYW50ZXJpb3JlcyBtaWRlbiBsYSBkaXN0YW5jaWEgZW50cmUgZG9zIGRpc3RyaWJ1Y2lvbmVzIG11bHRpbm9taWFsZXMuIEVzIGRlY2lyLCBwZXJtaXRlbiBjb21wYXJhciBsb3MgaGlzdG9ncmFtYXMgKGRpc3RyaWJ1Y2lvbmVzIGVtcMOtcmljYXMpIHBvciBjYWRhIHBhciBkZSBmaWxhcyBvIGNvbHVtbmFzLg0KDQoNCioqU2VndW5kby4qKg0KDQpPYnNlcnZlIHRhbWJpw6luIHF1ZSBlc3RhIGRpc3RhbmNpYSBjaGktY3VhZHJhZG8gZXMgZXF1aXZhbGVudGUgYSBsYSBkaXN0YW5jaWEgZXVjbGlkaWFuYSwgc2kgc2UgdG9tYSBjb21vIHB1bnRvcyBlbiBlbCBjYXNvIGRlIGxhcyBmaWxhcywgcGFyYSBsYXMgZmlsYXMgJGkkIHkgJEskLCBsYXMgZGUgY29vcmRlbmFkYXM6IA0KDQokJFdfaSA9IFxsZWZ0KFxmcmFje3Bfe2kxfX17Zl9pIFwsIFxzcXJ0e2NfMX19LCBcbGRvdHMsIFxmcmFje3Bfe2lKfX17Zl9pXCxcc3FydHtjX0p9fVxyaWdodCkgXHF1YWQgXG1ib3h7eX1ccXVhZCBXX2ogPSBcbGVmdChcZnJhY3twX3trMX19e2ZfayBcLCBcc3FydHtjXzF9fSwgXGxkb3RzLCBcZnJhY3twX3trSn19e2ZfayBcLCBcc3FydHtjX0p9fVxyaWdodCksJCQgDQpyZXNwZWN0aXZhbWVudGUuDQoNCg0KPCEtLSAlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlIC0tPg0KPCEtLSBTZXBhcmFkb3IgLS0+DQoNCiMjIyBDZW50cm8gZGUgZ3JhdmVkYWQNCg0KRXMgaW1wb3J0YW50ZSByZXNhbHRhciBxdWUgbGFzIGRpc3RhbmNpYXMgbm8gc2UgY2FsY3VsYW4gZW50cmUgbGFzIGZpbGFzIG8gbGFzIGNvbHVtbmFzLCBzaW5vIHF1ZSBzZSBleHByZXNhbiBlbiByZWxhY2nDs24gY29uIHN1IGNlbnRybyBkZSBtYXNhLCBxdWUgcG9kZW1vcyBkZWZpbmlyIGNvbW8gZWwgcHJvbWVkaW8gcG9uZGVyYWRvIGRlIGVzYSBjb2x1bW5hIHBvciBzdSBtYXNhLiANCiAgDQogICsgRW4gZWwgY2FzbyBkZSBsYXMgY29sdW1uYXMsIGVzdG8gc2UgY29udmllcnRlIGVuIGVsIHZlY3RvciBkZSBjb2x1bW5hcyBnZW5lcmFkbyBwb3IgbGFzIG1hcmdpbmFsZXMgZGUgbGFzIGZpbGFzLCAkZiQuDQogIA0KICArIERlIG1hbmVyYSBzaW1pbGFyLCBlbiBlbCBjYXNvIGRlIGxhcyBmaWxhcywgZWwgdmVjdG9yIGRlIGZpbGFzIGdlbmVyYWRvIHBvciBsYXMgbWFyZ2luYWxlcyBkZSBsYXMgY29sdW1uYXMsICRjJC4gDQogIA0KDQpFc3RvIGVzIGFwbGljYWJsZSBjdWFuZG8gc2UgYW5hbGl6YSBsYSBtYXRyaXogZGUgcGVyZmlsZXMgKGRpc3RhbmNpYSBjaGktY3VhZHJhZG8pIHBhcmEgbGFzIGZpbGFzLg0KDQoNClNpIGVsIGFuw6FsaXNpcyBzZSByZWFsaXphIGNvbiBsYSBtYXRyaXogY3V5b3MgZWxlbWVudG9zIHNvbiBkZSBsYSBmb3JtYSAkV19pJCwgJGkgPSAxLFxsZG90cywgSyQgKHV0aWxpemFuZG8gbGEgZGlzdGFuY2lhIGV1Y2xpZGlhbmEpLCBlbCBjZW50cm8gZGUgbWFzYSBwYXJhIGxhcyBmaWxhcyBzZXLDrWEgJFxzcXJ0e1xzcXJ0e2N9fSQsIGNvbW8gc2UgbXVlc3RyYSBhIGNvbnRpbnVhY2nDs246DQoNClBhcmEgY2FsY3VsYXIgZWwgY2VudHJvIGRlIG1hc2EgJFxzcXJ0e2N9JCBkZSBsYSBudWJlIGRlIHB1bnRvcyBnZW5lcmFkYSBwb3IgbGFzIGZpbGFzICRXXzEsXGxkb3RzLCBXX0skLCBwb25kZXJhbmRvIGNvbiBsb3MgcGVzb3MgZGUgbGFzIGNvbHVtbmFzIGNvcnJlc3BvbmRpZW50ZXMsIHRlbmRyw61hbW9zIHBhcmEgbGEgaS3DqXNpbWEgY29vcmRlbmFkYSBkZWwgdmVjdG9yICRcc3FydHtjfSQsICRpPTEsXGxkb3RzLCBKJDoNCg0KXGJlZ2lue2FsaWduKn0NClxzcXJ0e2NfaX0gJj0gZl8xIFxsZWZ0KFxmcmFje3BfezFpfX17Zl8xXHNxcnR7Y19pfX1ccmlnaHQpICsgZl8yIFxsZWZ0KFxmcmFje3BfezJfaX19e2ZfMlxzcXJ0e2NfaX19XHJpZ2h0KSArIFxjZG90cyArIGZfS1xsZWZ0KFxmcmFje3Bfe0tpfX17Zl9LXHNxcnR7Y19pfX1ccmlnaHQpIFxcDQomPSBcZnJhY3sxfXtcc3FydHtjX2l9fSAoZl97MWl9K2ZfezJpfSArIFxjZG90cyArIGZfe0tpfSlcXA0KJj0gXGZyYWN7MX17XHNxcnR7Y19pfX1jX2lcXA0KJj0gIFxzcXJ0e2NfaX0NClxlbmR7YWxpZ24qfQ0KDQoNCjwhLS0gJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSAtLT4NCjwhLS0gU2VwYXJhZG9yIC0tPg0KDQojIyMgRGlzdGFuY2lhIHBlcmZpbCBhbCBjZW50cm8gZGUgZ3JhdmVkYWQNCg0KTGEgZGlzdGFuY2lhIGRlbCBwZXJmaWwgZGUgZmlsYSAkaSQgYSBzdSBjZW50cm8gZGUgZ3JhdmVkYWQgKGNoaS1jdWFkcmFkbykgc2UgZGVmaW5lIGNvbW86DQoNCiQkZF4yIFwsKGZfaSwgXDtjKSBcOyA9XDsgIFxzdW1fe2w9MX1ee0t9IFxmcmFjezF9e2NfbH1cbGVmdChcZnJhY3twX3tpbH19e2ZfaX0gLSBjX2xccmlnaHQpXjIgXDs9XDsgXHN1bV97bD0xfV57S30gXGxlZnQoXGZyYWN7cF97aWx9fXtmX2lcLCBcc3FydHtjX2x9fSAtIFxzcXJ0e2NfbH1ccmlnaHQpXjIgPSBkX2UgXCwoZl9pLFw7IGMpLiQkDQoNCkFsIGNhbGN1bGFyIGxhIGRpc3RhbmNpYSBlbnRyZSB1bmEgZmlsYSB5IHN1IGNlbnRybyBkZSBncmF2ZWRhZCwgZW4gcmVhbGlkYWQgZXN0YW1vcyBjYWxjdWxhbmRvIHVuYSBwYXJ0ZSBkZSBsYSB2YXJpYW56YSBvIHVuYSBjb3ZhcmlhbnphLiBFbiByZXN1bWVuLCBsYSBkaXNwZXJzacOzbiB0b3RhbCBkZSBsYXMgZmlsYXMgZXMgbGEgc3VtYSBwb25kZXJhZGEgZGUgbGFzIGRpZmVyZW5jaWFzIGFsIGN1YWRyYWRvIGRlIGNhZGEgZWxlbWVudG8gZGUgbGEgZmlsYSByZXNwZWN0byBhbCBjZW50cm8gZGUgZ3JhdmVkYWQuIA0KDQo8IS0tICUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUgLS0+DQo8IS0tIFNlcGFyYWRvciAtLT4NCg0KIyBJbmVyY2lhDQoNCkxhIGNhbnRpZGFkICRcY2hpXjIvTiQgc2UgZGVub21pbmEgaW5lcmNpYSB0b3RhbC4gRXN0YSBpbmVyY2lhIHNlIGRlc2NvbXBvbmUgZW4gdW4gdG90YWwgZGUgJGskIHZhbG9yZXMgY2FyYWN0ZXLDrXN0aWNvcyAocHJvcGlvcyksIGNhZGEgdW5vIGRlIGxvcyBjdWFsZXMgY29uc3RpdHV5ZSBsYSBpbmVyY2lhIHByaW5jaXBhbCBkZSB1bmEgZGltZW5zacOzbi4NCg0KDQo8IS0tICUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUgLS0+DQo8IS0tIFNlcGFyYWRvciAtLT4NCg0KIyMjIEluZXJjaWEgdG90YWwgZGUgbGFzIGZpbGFzDQoNClNpIGRlbm90YW1vcyBsYSBpbmVyY2lhIHRvdGFsIGRlIGxhcyBmaWxhcyBjb21vICRJX2YkLCBlbnRvbmNlcyBwdWVkZSBjYWxjdWxhcnNlIGRlIGxhIHNpZ3VpZW50ZSBtYW5lcmE6DQoNClxiZWdpbnthbGlnbip9DQpJX2YgJj0gXHN1bV97aT0xfV57S30gZl9pIFwsZF4yXCwgKGZfaSwgXDtjKVxcIA0KJj0gXHN1bV97aT0xfV57S30gXHN1bV97aj0xfV57Sn0gZl9pIFxmcmFjezF9e2Zfan1cbGVmdChcZnJhY3twX3tpan19e2ZfaX0gXDstXDsgY19qXHJpZ2h0KV4yXFwgDQogJj0gXHN1bV97aT0xfV57S30gXHN1bV97aj0xfV57Sn0gXGZyYWN7KHBfe2lqfS1mX2kgXHRpbWVzIGNfaileMn17Zl9pIFx0aW1lcyBjX2p9PSB0cmEoU15UXCwgUykuDQpcZW5ke2FsaWduKn0NCg0KPCEtLSAlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlIC0tPg0KPCEtLSBTZXBhcmFkb3IgLS0+DQoNCiMjIyBJbmVyY2lhIHRvdGFsIGRlIGxhcyBjb2x1bW5hcw0KDQpEZSBtYW5lcmEgYW7DoWxvZ2EsIGxhIGRpc3BlcnNpw7NuIHRvdGFsIGRlIGxhcyBjb2x1bW5hcyAkSV9jJCwgc2UgZGVmaW5lIGNvbW86DQoNClxiZWdpbnthbGlnbip9DQpJX2MgJj0gXHN1bV97aj0xfV57Sn0gY19qIFwsIGReMiAoY19qLCBcO2YpXFwgDQogJj0gXHN1bV97aj0xfV57Sn0gXHN1bV97aT0xfV57S30gY19qIFxmcmFjezF9e2NfaX1cbGVmdChcZnJhY3twX3tpan19e2Nfan1cOy1cOyBmX2lccmlnaHQpXjJcXCANCiAmPSBcc3VtX3tqPTF9XntKfSBcc3VtX3tpPTF9XntLfSBcZnJhY3socF97aWp9LWZfaSBcdGltZXMgY19qKV4yfXtmX2kgXHRpbWVzIGNfan09IHRyYShTXCwgU15UKSBcOyA9XDsgIElfZi4NClxlbmR7YWxpZ24qfQ0KDQpTZSBvYnNlcnZhIHF1ZSBsYSBkaXNwZXJzacOzbiB0b3RhbCBkZSBsYXMgZmlsYXMgZXMgaWd1YWwgYSBsYSBkZSBsYXMgY29sdW1uYXMuIA0KDQoNCjwhLS0gJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSAtLT4NCjwhLS0gU2VwYXJhZG9yIC0tPg0KDQojIyMgTWF0cmljZXMgZGUgaW5lcmNpYQ0KDQpMYXMgbWF0cmljZXMgJFxTaWdtYV9mID0gU15UXCwgUyQgeSAkXFNpZ21hX2MgPSBTXCwgU15UJCBzZSBkZW5vbWluYW4gKm1hdHJpY2VzIGRlIGluZXJjaWEgZGUgbGFzIGZpbGFzKiB5ICpjb2x1bW5hcyosIHJlc3BlY3RpdmFtZW50ZS4gDQogIA0KICArICRcU2lnbWFfZiQgZXMgcGFyYSBlbCBlc3BhY2lvIHF1ZSBkZWZpbmUgbG9zIHB1bnRvcyAkZl9pJCBkZSAkXG1hdGhiYntSfV5KJC4gDQogIA0KICArICRcU2lnbWFfYyQgZXMgcGFyYSBlbCBlc3BhY2lvIHF1ZSBkZWZpbmUgbG9zIHB1bnRvcyAkY19qJCBkZSAkXG1hdGhiYntSfV5LJC4NCiAgDQoNCjwhLS0gJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSAtLT4NCjwhLS0gU2VwYXJhZG9yIC0tPg0KDQojIyMgVmFyaWFuemFzIGRlIGZpbGFzIHkgY29sdW1uYXMNCg0KTG9zIGVsZW1lbnRvcyBkZSBsYSBkaWFnb25hbCBkZSBsYSBtYXRyaXogJFxTaWdtYSQgcmVwcmVzZW50YW4gbGFzIHZhcmlhbnphcyBkZSBsYXMgZmlsYXMgbyBjb2x1bW5hcy4gYWRlbcOhcywgc3Ugc3VtYSBjb25zdGl0dXllIGxhIGRpc3BlcnNpw7NuIGV4cGxpY2FkYSBwb3IgY2FkYSBmYWN0b3IgZW4gZWwgbnVldm8gZXNwYWNpby4gTG9zIGF1dG92YWxvcmVzIGluZGljYW4gcXXDqSBwYXJ0ZSBkZSBlc2EgZGlzcGVyc2nDs24gZXN0w6EgZXhwbGljYWRhIHBvciBjYWRhIGZhY3Rvci4gDQoNCg0KPCEtLSAlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlIC0tPg0KPCEtLSBTZXBhcmFkb3IgLS0+DQoNCiMgQ29vcmRlbmFkYXMgZGUgbG9zIHB1bnRvcw0KDQojIyMgICRpJCBlbiAkXG1hdGhiYntSfV5KJA0KDQpDb24gZWwgZmluIGRlIG9idGVuZXIgc3VzIHZhbG9yZXMgeSB2ZWN0b3JlcyBwcm9waW9zLCBxdWUgcGVybWl0aXLDoW4gY2FsY3VsYXIgbGFzIGNvb3JkZW5hZGFzIGRlIGxvcyBwdW50b3MgJGkkIGVuICRcbWF0aGJie1J9XkokLCBwYXJhIGVsIGVzcGFjaW8gZGUgJEokIGRpbWVuc2lvbmVzIHF1ZSBkZWZpbmVuIGxvcyBwdW50b3MgZmlsYSwgZXMgbmVjZXNhcmlvIGRpYWdvbmFsaXphciBsYSBtYXRyaXogJFxTaWdtYV9mJC4gRXN0YXMgY29vcmRlbmFkYXMgdGllbmVuIGxhIHNpZ3VpZW50ZSBmb3JtYToNCg0KJCRGXGFscGhhKGkpID0gXHN1bV97aj0xfV5KIFxtdV97XGFscGhhIFwsIGp9XGxlZnQoXGZyYWN7Zl97aWp9fXtmX2lcLCBcc3FydHtjX2p9fSAtIFxzcXJ0e2Nfan1ccmlnaHQpJCQNCg0KbyBlbiBmb3JtYSBtYXRyaWNpYWwgY29tbzoNCg0KJCRSXDs9XDsoRl9cYWxwaGEoaSkpX3tLXHRpbWVzIHR9IFw7PVw7IERfZl57LTF9XCwgKEZcOyAtXDsgZlwsIGMgKVwsIERfY157LTEvMn1cLCBVLCQkDQoNCmRvbmRlOiANCg0KKyAkXG11X1xhbHBoYSQgZXMgZWwgdmVjdG9yIHByb3BpbyAoY29sdW1uYXMgZGUgbGEgbWF0cml6ICRVJCkgZGUgJFxTaWdtYV9mJCwgY29ycmVzcG9uZGllbnRlIGFsIGZhY3RvciAkXGFscGhhJCwgJFxhbHBoYSA9IDEsIFxsZG90cywgdCQuIA0KDQorICRGX1xhbHBoYShpKSQgZXMgbGEgcHJveWVjY2nDs24gZGVsIHB1bnRvIGZpbGEgDQoNCiQkXGxlZnQoXGZyYWN7Zl97aTF9fXtmX2kgXHNxcnR7Y18xfX0gLSBcc3FydHtjXzF9LCBcZnJhY3tmX3tpMn19e2ZfaSBcc3FydHtjXzJ9fSAtIFxzcXJ0e2NfMn0sIFxsZG90cywgXGZyYWN7Zl97aVF9fXtmX2kgXHNxcnR7Y19RfX0gLSBcc3FydHtjX1F9XHJpZ2h0KSQkIA0KDQpzb2JyZSBlbCB2ZWN0b3IgJHVfXGFscGhhJC4gDQoNCg0KPCEtLSAlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlIC0tPg0KPCEtLSBTZXBhcmFkb3IgLS0+DQoNCiMjIyAkaiQgZW4gJFxtYXRoYmJ7Un1eSyQNCg0KDQpEZSBtYW5lcmEgc2ltaWxhciwgc2Ugb2J0aWVuZW4gbGFzIGNvb3JkZW5hZGFzIHBhcmEgbG9zIHB1bnRvcyAkaiQgZGUgJFxtYXRoYmJ7Un1eSyQ6DQoNCiQkQ19cYWxwaGEoaik9XHN1bV97aT0xfSBcbGVmdChcZnJhY3twX3tpan19e2NfalxzcXJ0e2ZfaX19LSBcc3FydHtmX2l9XHJpZ2h0KVxudV97XGFscGhhIGl9LCQkDQoNCiBlbiBmb3JtYSBtYXRyaWNpYWwgY29tbzoNCg0KJCRDPShDX1xhbHBoYSAoaikpX3tQXHRpbWVzIHR9ID1EX2Neey0xfShGLWZcOyBjKSdEX2Zeey0xLzJ9ViwkJA0KDQpkb25kZSAkXG51X1xhbHBoYSQgZXMgZWwgdmVjdG9yIHByb3BpbyAoY29sdW1uYXMgZGUgbGEgbWF0cml6ICRWJCkgZGUgJFxTaWdtYV9jJCwgY29ycmVzcG9uZGllbnRlIGFsIGZhY3RvciAkXGFscGhhLCBcYWxwaGEgPSAxLCBcbGRvdHMsIHQkLiBUYW1iacOpbiBwb2RlbW9zIGV4cHJlc2FyIGVzdGFzIGNvb3JkZW5hZGFzIGNvbW86DQoNCiQkRl9cYWxwaGEoaSk9IFxmcmFje1xzcXJ0e1xsYW1iZGFfXGFscGhhfX17XHNxcnR7Zl9pfX0gXDsgXG51X3tcYWxwaGEgaX0kJA0KeQ0KJCRDX1xhbHBoYShqKT0gXGZyYWN7XHNxcnR7XGxhbWJkYV9cYWxwaGF9fXtcc3FydHtjX2p9fSBcOyBcdXBzaWxvbl97XGFscGhhIGp9LCQkDQoNCmRvbmRlICRcbGFtYmRhX1xhbHBoYSQsIGVzIGVsIHZhbG9yIHByb3BpbyBhc29jaWFkbyBhbCBmYWN0b3IgJFxhbHBoYSQuDQoNCg0KPCEtLSAlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlIC0tPg0KPCEtLSBTZXBhcmFkb3IgLS0+DQoNCiMgUmVjb25zdHJ1Y2Npw7NuIGRlIGxhIG1hdHJpeiBkZSBjb3JyZXNwb25kZW5jaWENCg0KUGFyYSByZWNvbnN0cnVpciBsYSBtYXRyaXogZGUgY29ycmVzcG9uZGVuY2lhICRQJCwgcG9kZW1vcyByZXNvbHZlciBsYXMgZWN1YWNpb25lcyBcQHJlZihlcTplYy00LTIpIHkgXEByZWYoZXE6ZWMtNC0zKSBwYXJhICRQJCwgb2J0ZW5pZW5kbyBsYSBzaWd1aWVudGUgZWN1YWNpw7NuOg0KDQpcYmVnaW57ZXF1YXRpb259DQpQIFw7PVw7IGYgXCwgYyBcOytcOyBEX2ZeezEvMn0gVVwsIERcLCBWXlQgRF9jXnsxLzJ9LCAgICAoXCNlcTplYy00LTQpDQpcZW5ke2VxdWF0aW9ufQ0KDQpvIGVuIHTDqXJtaW5vcyBkZSBzdXMgZWxlbWVudG9zOg0KDQoNClxiZWdpbntlcW5hcnJheSp9DQpwX3tpan0gJj0mIGZfaSBjX2ogXDsrXDsgKDAsMCxcbGRvdHMsXHVuZGVyYnJhY2V7XHNxcnR7Zl9pfX1fe1x0ZXh0e1Bvc2ljacOzbn0gXCxpfSwgXGxkb3RzLDApIFw7IFVcLCAgRCBcLCBWXlQgXDsoMCwwLCBcbGRvdHMsIFx1bmRlcmJyYWNle1xzcXJ0e2Nfan19X3tcdGV4dHtQb3NpY2nDs259IFwsan0sIFxsZG90cywgMCleVFxcDQomPSYgZl9pIFwsIGNfalwsIFxsZWZ0WzFcOytcOyBcc3VtX3tcYWxwaGE9MX0gXGZyYWN7MX17XHNxcnR7XGxhbWJkYV9cYWxwaGF9fSBcLCBGX1xhbHBoYSAoaSkgXCwgR19cYWxwaGEoailccmlnaHRdDQpcZW5ke2VxbmFycmF5Kn0NCg0KDQpgYGB7ciwgZWNobz1GQUxTRSwgZXZhbD1GQUxTRX0NCmxpYnJhcnkoRmFjdG9NaW5lUikNCmxpYnJhcnkoZmFjdG9leHRyYSkNCnJlcy5jYSA8LSBDQSh0YWJsYSwgZ3JhcGggPSBGQUxTRSkNCnN1bW1hcnkocmVzLmNhKQ0KYGBgDQoNCg0KDQo8IS0tICUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUgLS0+DQo8IS0tIFNlcGFyYWRvciAtLT4NCg0KIyBDb250cmlidWNpb25lcyBhYnNvbHV0YXMgeSByZWxhdGl2YXMNCg0KIyMjIENvbnRyaWJ1Y2lvbmVzOiBnZW5lcmFsaWRhZGVzDQoNCkxhcyBjb250cmlidWNpb25lcyBheXVkYW4gYSBpbnRlcnByZXRhciBsb3MgZWplcy4gUG9yIGVqZW1wbG8sIA0KICANCiAgMS4gTGEgY29udHJpYnVjacOzbiBhYnNvbHV0YSBkZSBsYSBmaWxhICRpJCBhIHVuIGZhY3RvciAkXGFscGhhJCBpbmRpY2EgbGEgaW5lcmNpYSBleHBsaWNhZGEgcG9yIGVzZSBmYWN0b3IgZ2VuZXJhZG8gcG9yIGxhIGZpbGEgJGkkLg0KICANCiAgMi4gTGEgc3VtYSBkZSB0b2RhcyBsYXMgY29udHJpYnVjaW9uZXMgYWJzb2x1dGFzIGRlIGxhcyBmaWxhcyBwYXJhIHVuIGZhY3RvciBlcyBpZ3VhbCBhIGxhIGluZXJjaWEgZGVsIGZhY3Rvci4gDQogIA0KICAzLiBQb3IgbG8gdGFudG8sIGFsIGRpdmlkaXIgbGEgY29udHJpYnVjacOzbiBhYnNvbHV0YSBkZSBjYWRhIGZpbGEgZW50cmUgbGEgaW5lcmNpYSBjb3JyZXNwb25kaWVudGUgYWwgZmFjdG9yLCBvYnRlbmVtb3MgZWwgcG9yY2VudGFqZSBkZSB2YXJpYWJpbGlkYWQgZW4gZWwgZmFjdG9yIGRlYmlkbyBhIGVzYSBmaWxhLCBjb25vY2lkbyBjb21vICpjb250cmlidWNpw7NuIHJlbGF0aXZhIGRlIGxhIGZpbGEgYSBsYSBpbmVyY2lhIGRlbCBmYWN0b3IqOiANCiAgDQoNCjwhLS0gJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSAtLT4NCjwhLS0gU2VwYXJhZG9yIC0tPg0KDQojIyMgQ29udHJpYnVjaW9uZXM6IHJlc3VtZW46ICANCg0KDQogIA0KIExhIGNvbnRyaWJ1Y2nDs24gYWJzb2x1dGEgZGVsIHB1bnRvICRpJCBhIGxhIGluZXJjaWEgJFxsYW1iZGFfXGFscGhhJCBlcyAgDQogDQogJCRmX2kgXCwgRl9cYWxwaGFeMihpKSQkIA0KIExhIGNvbnRyaWJ1Y2nDs24gcmVsYXRpdmEgZGVsIHB1bnRvICRpJCBhIGxhIGluZXJjaWEgJFxsYW1iZGFfXGFscGhhJCBlcw0KIA0KJCRcZnJhY3tmX2kgXCwgRl9cYWxwaGFeMihpKX17XGxhbWJkYV9cYWxwaGF9JCQNCg0KTGEgY29udHJpYnVjacOzbiByZWxhdGl2YSBkZWwgZmFjdG9yICRcYWxwaGEkIGEgbGEgaW5lcmNpYSB0b3RhbCBlcw0KICAgICAgDQokJFxmcmFje1xsYW1iZGFfXGFscGhhfXtcc3VtXGxpbWl0c197aj0xfV50IFxsYW1iZGFfan0kJA0KICANCg0KPCEtLSAlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlIC0tPg0KPCEtLSBTZXBhcmFkb3IgLS0+DQoNCmBgYHtyLCBlY2hvPUZBTFNFLCBldmFsPSBGQUxTRX0NCiMgRkFMVEEgZWplbXBsb3MgZW4gTWFydGluIGNhcC4gNCANCg0KIyBGYWx0YSB0ZW9yw61hIHkgZWplbXBsb3MgZGUgdW5uYWwgY2FwLiAzDQpgYGANCg0KDQoNCjwhLS0gJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSAtLT4NCjwhLS0gU2VwYXJhZG9yIC0tPg0KDQoNCiMgRWplcmNpY2lvcw0KDQpQZW5kaWVudGUNCg0KDQoNCjwhLS0gJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSAtLT4NCjwhLS0gU2VwYXJhZG9yIC0tPg0KDQoNCg0KIyBCaWJsaW9ncmFmw61hIHsudW5saXN0ZWQgLnVubnVtYmVyZWR9DQogIA0KQ29uc3VsdGFyIGVsIGRvY3VtZW50byBbUlB1YnMgOjogQW7DoWxpc2lzIG11bHRpdmFyaWFkbyAoYmlibGlvZ3JhZsOtYSldKGh0dHBzOi8vcnB1YnMuY29tL2hsbGluYXMvUl9NdWx0aXZhcmlhZG9fQmlibGlvZ3JhZmlhKS4NCg0KDQoNCjwhLS0gJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSAtLT4NCjwhLS0gU2VwYXJhZG9yIC0tPg0KDQoNCiZuYnNwOw0KDQoNCiZuYnNwOw0KPGNlbnRlcj4NCn5+fg0KSWYgeW91IGZvdW5kIGFueSBFUlJPUlMgb3IgaGF2ZSBTVUdHRVNUSU9OUywgcGxlYXNlIHJlcG9ydCB0aGVtIHRvIG15IGVtYWlsLiBUaGFua3MuICANCn5+fg0KPC9jZW50ZXI+DQoNCg0K