Introducción
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).
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).
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.
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.
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).
Características
PCA supone que las direcciones con las mayores varianzas son las más “importantes” (es decir, las más principales).
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.
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)
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.
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.
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.
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.
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\).
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.
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:
Cuando las variables originales se encuentran en unidades diferentes.
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:
- 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.
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\]
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\]
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\]
Paso 7: Visualización
Finalmente, visualizamos los datos en las nuevas dimensiones para describir mejor su estructura.
Propiedades según la matriz de varianzas y covarianzas
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\]
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.
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}\]
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.
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