Situación problema. Tipo de cambio e inflación.

Alicia es una inversionista mexicana que desea invertir en acciones de empresas de México y los Estados Unidos, buscando ampliar su panorama de alternativas de inversión durante la pandemia del COVID. Le preocupa que en el plazo de 1 a 2 años el peso se devalúe con respecto al dólar americano. También le preocupa que el nivel de inflación actualmente está en una tasa más alta que la tasa anual de libre de riesgo de México que son los CETES. También le preocupa que la inflación siga siendo alta en el lapso próximo de 1 a 2 años.

Alicia quiere tener una perspectiva tanto del tipo de cambio como de la inflación para todo el resto del presente año 2021 y el próximo año 2022. Tiene pensado invertir tanto en el índice mercado de Estados Unidos, el S&P500; como en el índice de mercado mexicano, el IPC. Alicia también tiene una alternativa de inversión que actualmente le ofrece una tasa atractiva anual de 6% para 2021 y 2022.

Alicia requiere una proyección tanto del tipo de cambio como de la inflación en México para tomar la decisión si invierte en un portafolio aquí en México o envía su dinero a Estados Unidos a una tasa anual del 6% de aquí a diciembre de 2022. (Caso extraído de la materia Series de tiempo, por el ITESM)

Metodología

Modelo ARIMA-SARIMA

El modelo ARIMA-SARIMA es una metodología que forma parte de los modelos de Box-Jenkins para series de tiempo, que proporcionan una serie de herramientas para comprender comportamientos pasados y predecir valores futuros de variables de series temporales.

En un modelo ARIMA / SARIMA se tiene como objetivo comprender los valores actuales de una variable de serie de tiempo utilizando sus propios valores pasados y choques aleatorios pasados; el modelo no incluye otras variables explicativas (variables de X) como en un modelo de regresión lineal tradicional.

De acuerdo con el profesor Alberto Dorantes, la variable de serie temporal en un modelo ARIMA / SARIMA se explica por:

·Sus propios valores pasados; estos valores se denominan LAGvalues. ·Choques aleatorios pasados; estos valores se denominan errores LAG o choques LAG. ·Sus propios valores estacionales; Una temporada se refiere a 1 año. Estos valores se denominan valores de LAG estacionales. ·Choques aleatorios estacionales pasados; estos valores se denominan errores de LAG estacionales.

Para desorrallar un modelo ARIMA / SARIMA, se deben estimar los siguientes parámetros:

·p: número de términos AR que se incluirán como variables explicativas ·d: número de primeras diferencias aplicadas a la variable original ·q: número de términos de MA que se incluirán como variables explicativas ·P: número de términos AR estacionales que se incluirán como variables explicativas ·D: número de diferencia estacional aplicada a la variable ·P: número de términos de MA estacionales que se incluirán como variables explicativas

El profesor Dorantes, afirma que es importante resaltar, que el parámetro d se refiere a cuántas primeras diferencias aplicamos a las variables originales de la serie de tiempo para hacer que la serie sea estacionaria. Mientras que el parámetro D se refiere a cuántas diferencias estacionales decidimos aplicar a la variable. (Dorantes, 2021)

El modelo AR (p) - ARIMA (p, d, 0)

En general, los modelos autorregresivos AR (p) asumen que existe algún tipo de fenómeno de autocorrelación en la serie temporal. El concepto de autocorrelación se refiere a la correlación de la variable de hoy en el tiempo t con sus valores pasados (t-n). La autocorrelación es el principio clave de estos modelos.

En Econometría de series de tiempo se puede hablar de una autocorrelación en la variable dependiente. Esto significa que los valores actuales o futuros de una variable económica o financiera pueden explicarse de alguna manera por sus valores anteriores. Esta es la base de lo que los econometristas han llamado un modelo autorregresivo, también denominado modelo AR (p) o modelo ARIMA (p, d, 0).

El modelo AR (p) para Yt puede ser expresado de la siguiente forma: \[Y_{t}=\phi _{0}+\sum_{k=1}^{P}\phi _{k}Y_{t-k}+\varepsilon _{t}\] Donde ϕ1, … ϕp son los parámetros del modelo, ϵt se refiere al término de error o choque aleatorio.

Para aplicar este modelo tenemos que demostrar que la serie Yt es estacionaria. Podemos usar la prueba de Dicky-Fuller para decidir si la serie es estacionaria. Si la serie original no es estacionaria, podemos calcular la primera diferencia de la serie, y la mayoría de las veces la serie resultante se volverá estacionaria.

The MA(q) model - ARIMA(0,d,q)

Por otra parte, el modelo AR (p) es un proceso con memoria a largo plazo. De acuerdo con el profesor Dorantes, esto se debe a que una conmoción hoy impactará en el futuro para siempre. Si se lee la ecuación matemática, esto se puede interpretar de la siguiente manera: \[Y_{t}=\phi _{0}+\epsilon_{t}+\sum_{k=1}^{q}\theta _{k}\epsilon _{t-k}\] El valor de la serie mañana dependerá del valor de hoy, después de aplicar el filtro ϕ1. Entonces, el valor de mañana ya tiene información sobre el valor de hoy. Y el valor de mañana afectará el valor de 2 días a partir de ahora. Entonces, el valor de hoy tendrá un impacto en todo el futuro de la serie. (Dorantes, 2021)

Podemos interpretar un modelo MA puro como un proceso aleatorio donde el valor actual de la serie está influenciado por algunos porcentajes de choques / errores aleatorios (q) previos y el choque aleatorio actual. Los porcentajes son en realidad los valores de los coeficientes θ.

En Finanzas, cuando se desea modelar el comportamiento de los retornos del mercado, sabemos que hay miles de eventos que afectan cómo se mueven los retornos del mercado hoy. Estos miles de eventos se resumen básicamente en un “shock aleatorio” que nadie sabe cuál será su magnitud y dirección (efecto positivo o negativo).

ARIMA(p,d,q) model

Ahora podemos combinar términos AR (p) y términos MA (q) en un solo modelo, que se llama ARMA (p, q):

\[Y_{t}=\phi _{0}+\sum_{k=1}^{P}\phi _{k}Y_{t-k}+\sum_{k=1}^{q}\theta _{k}\epsilon _{t-k}+\epsilon_{t}\]

Inflación

¿Qué es la inflación?

La inflación, se define como el aumento generalizado en los precios de los bienes y servicios de una economía durante un periodo de tiempo. Es decir, cuando vemos un aumento de forma sostenida en la media de los precios de cierto conjunto de bienes y servicios de una economía, estamos hablando de inflación.

¿Cómo se calcula la inflación?

De acuerdo con Economipedia, calcular la inflación implica una amplia y compleja lista de calculos. Dada esta dificultad para calcular la variación de todos los precios de una economía, existen dos principales indicadores para conocer cuánto están subiendo los precios:

·Un indicador aproximado es el índice de precios del consumo (IPC), que está compuesto por grupos de bienes y servicios, desde alimentos, ropa, medicinas; hasta comunicaciones, transporte, vivienda y ocio.

·Otra manera de calcular la inflación es mediante el deflactor del PIB, que tiene en cuenta la variación de precios de todos los bienes y servicios producidos en un país. (Economipedia, 2015)

Calculando la inflación mediante el IPC

El IPC es un indicador que mide la variación media de los precios de los bienes y servicios durante un período de tiempo determinado en una economía. Su objetivo es medir el coste de la vida y mostrar los efectos de la inflación en los consumidores individuales. De acuerdo con un artículo publicado por el Economista, el cálculo de la inflación mediante el IPC sigue un proceso de siete pasos:

  1. Selección de Fuentes de Información. Para garantizar la representatividad de los precios que se utilizan en el cálculo de los índices, en primera instancia se lleva a cabo una selección de las fuentes de información por parte de los Supervisores en coordinación con los Investigadores de Precios. Estás fuentes son seleccionadas de directorios especializados.

  2. Cotización de Productos Específicos. Elegidos los establecimientos, los Investigadores de Precios distribuidos en todo el país dan seguimiento recurrente a los productos específicos más representativos. La selección de los productos específicos se realiza con la ayuda de la fuente de información.

  3. Captura y envío. Una vez que se dispone de todas las cotizaciones a nivel nacional, éstas son concentradas en la oficina central para realizar el proceso de cálculo.

  4. Análisis y crítica de la información. Concentrada la información en la Ciudad de México, los precios que se recaban pasan por un proceso de revisión por los Supervisores y, si es necesario, de verificación de parte de los Investigadores de Precios. Mediante este procedimiento se garantiza que las cotizaciones que se utilizan en el cálculo sean las correctas.

  5. Cálculo de los Índices. Concluidos y aprobados los procesos anteriores se procede al cálculo, para lo cual se utiliza el método de ponderaciones fijas de Laspeyres.

  6. Revisión y validación de los resultados. Antes de ser liberados los resultados se realizan reuniones de trabajo para verificar la consistencia de los mismos. Las verificaciones incluyen comparaciones con otros indicadores de precios.

  7. Publicación. Se presenta un comunicado de prensa en el que se resume el comportamiento de los índices de precios, se divulga en la página Web y para el caso del INPC se publican en el Diario Oficial de la Federación. (El Economista, 2018)

Metodología: Diseño de modelos

Tipo de cambio

Proceso de manejo de datos

El primer paso siempre que vamos a trabajar una base de datos, es administrarla. Para ello, en la resolución del modelo del tipo de cambio, descargaremos el par USD/MXN desde la base de datos de FRED. El FRED es una base de datos económica gratuita del Banco de la Reserva Federal de Estados Unidos de St. Louis. Tiene miles de datos económicos y financieros de todos los países del mundo.

Una vez extraída la base de datos, necesitamos marcar las unidades y la frecuencia. Las unidades DEXMXUS son: pesos mexicanos a un dólar estadounidense, sin ajuste estacional. Si planeamos diseñar un modelo ARIMA / SARIMA es recomendable utilizar series no ajustadas estacionalmente, ya que modelaremos la estacionalidad de los datos.

La base es proporcionada en una periodicidad diara, por lo tanto, transformaremos la serie de frecuencia diaria a mensual para que podamos diseñar un modelo ARIMA / SARIMA. En este caso, la mejor forma de transformar el tipo de cambio diario es obtener el último tipo de cambio de cada mes.

library(quantmod)
library(tseries)
library(forecast)

#Una vez descargadas las librerías, usamos la función "getSymbols" para traer el par USD/MXN desde la base de datos FRED.

getSymbols(Symbols="DEXMXUS", src="FRED")
[1] "DEXMXUS"
#Dado que la base de datos mantiene una periodicidad diaria, es importante convertirla a mensual. Para ello utilizamos la función "to.monthly"

exrate.xts = to.monthly(DEXMXUS)
missing values removed from data
plot(exrate.xts)


#Una vez convertida la base de datos a valores mensuales, indicamos que tome por defecto el precio de cierre del par USD/MXN. Usamos la función Cl.

closeexrate.xts = Cl(exrate.xts)

## Transformamos el DataFrame a un objeto TimeSeries, indicamos fecha de inicio (noviembre, 1993) y la frecuencia solicitada, en este caso anual (12).

exrate<-ts(coredata(closeexrate.xts),start=c(1993,11),frequency=12) 
exrate
         Jan     Feb     Mar     Apr     May     Jun     Jul     Aug     Sep     Oct     Nov     Dec
1993                                                                                  3.1055  3.1080
1994  3.1060  3.1950  3.3650  3.2800  3.3320  3.4000  3.4050  3.3890  3.3990  3.4380  3.4400  5.0000
1995  5.8200  5.9700  6.8200  6.0500  6.1600  6.2550  6.1150  6.3000  6.3850  7.1500  7.5500  7.7400
1996  7.4400  7.6350  7.5375  7.4400  7.4275  7.5850  7.5900  7.5900  7.5500  8.0450  7.8950  7.8810
1997  7.8200  7.9650  7.9300  7.9450  7.9170  7.9520  7.8250  7.7850  7.7750  8.4100  8.2150  8.0700
1998  8.4550  8.5275  8.5200  8.4920  8.8250  8.9850  8.9200  9.9850 10.1960 10.1020 10.0050  9.9010
1999 10.1520  9.9365  9.5210  9.2425  9.7925  9.4430  9.4000  9.3930  9.3520  9.6180  9.4240  9.4800
2000  9.6400  9.3645  9.2895  9.4110  9.5110  9.8430  9.3680  9.2000  9.4400  9.5640  9.4100  9.6180
2001  9.6790  9.6925  9.4850  9.2610  9.1650  9.0600  9.1510  9.2075  9.5200  9.2700  9.2585  9.1560
2002  9.1520  9.1300  9.0005  9.3750  9.6525  9.9800  9.8000  9.9185 10.2120 10.1500 10.1540 10.4250
2003 10.9020 11.0285 10.7820 10.3080 10.3400 10.4550 10.5850 11.0600 11.0025 11.0550 11.3950 11.2420
2004 11.0120 11.0620 11.1830 11.4020 11.4140 11.5380 11.4100 11.3760 11.3850 11.5365 11.2411 11.1540
2005 11.2065 11.0885 11.1770 11.0820 10.9125 10.7720 10.5995 10.7940 10.7910 10.7890 10.5765 10.6275
2006 10.4400 10.4542 10.8980 11.0890 11.2880 11.2865 10.9160 10.9120 10.9775 10.7670 11.0000 10.7995
2007 11.0381 11.1575 11.0427 10.9295 10.7380 10.7901 10.9311 11.0320 10.9315 10.6996 10.8960 10.9169
2008 10.8190 10.7263 10.6300 10.5101 10.3290 10.3035 10.0345 10.2970 10.9726 12.7050 13.3900 13.8320
2009 14.3330 15.0880 14.2100 13.8010 13.1820 13.1700 13.2025 13.3361 13.4805 13.1555 12.9160 13.0576
2010 13.0285 12.7575 12.3005 12.2281 12.8633 12.8306 12.6421 13.1671 12.6270 12.3415 12.4540 12.3825
2011 12.1541 12.1130 11.9170 11.5237 11.5790 11.7191 11.7235 12.3262 13.7701 13.1690 13.6201 13.9510
2012 13.0356 12.7941 12.8115 12.9900 14.3045 13.4110 13.2669 13.2401 12.8630 13.0877 12.9171 12.9635
2013 12.7344 12.7788 12.3155 12.1323 12.7791 12.9925 12.8570 13.3355 13.1550 12.9995 13.1110 13.0980
2014 13.3585 13.2255 13.0560 13.0835 12.8605 12.9695 13.2370 13.0690 13.4270 13.4825 13.9210 14.7500
2015 15.0050 14.9390 15.2450 15.3855 15.3688 15.6902 16.0610 16.7315 16.8980 16.5300 16.6005 17.1950
2016 18.2110 18.0675 17.2140 17.1900 18.4130 18.4935 18.7610 18.8490 19.3355 18.7900 20.4565 20.6170
2017 20.8355 19.9975 18.8290 18.9340 18.6550 18.0760 17.8590 17.7875 18.1480 19.1290 18.6335 19.6395
2018 18.6215 18.8405 18.1676 18.7715 20.0005 19.6495 18.5980 19.2135 18.7050 20.2550 20.2975 19.6350
2019 19.0525 19.2650 19.3980 18.9945 19.6520 19.2089 18.9930 20.0674 19.7420 19.1740 19.5430 18.8600
2020 18.8900 19.7300 23.4480 23.9790 22.1700 23.0821 22.2260 21.8800 22.0910 21.2760 20.1500 19.8920
2021 20.2550 20.9350 20.4410 20.1690 19.9300 19.9270                                                

Proceso de calibración (incluyendo las pruebas estadísticas necesarias)

Los modelos ARIMA - SARIMA, necesitan ser calibrados. Los pasos generales para calibrar un modelo, de acuerdo con el profesor Dorantes, son los siguientes:

  1. Definir la transformación de la variable para que esta transformación termine en una variable estacionaria.

Por lo general, los datos mensuales y trimestrales de muchas series económicas y financieras tienen un patrón estacional.De acuerdo con el profesor Dorantes, es recomendable que si se tienen datos mensuales o trimestrales de cualquier variable financiera o económica, se comience a probar si la diferencia estacional del logaritmo de la serie es estacionaria. También, se recomienda aplicar la prueba de Dicky-Fuller a esta diferencia estacional. Si esta variable es estacionaria, seguiremos usando esta transformación, entonces D = 1 y d = 0. De lo contrario, podemos aplicar la primera diferencia del logaritmo de la serie, que es el % de cambio para cada período. Si la primera diferencia del logaritmo de la serie es estacionaria, entonces d = 1 y D = 0.

  1. Definir los valores para p, q, P, Q. Utilizando la variable estacionaria, hay que ejecutar las gráficas ACF (autocorrelación) y PACF (autocorrelación parcial) para identificar los parámetros p, q, P y Q de ARIMA-SARIMA. Dependiendo de los patrones de las gráficas ACF y PAC, podemos decidir los valores para p, q, P y Q.Los patrones más comunes son los siguientes:
Firma AR: cuando el gráfico ACF muestra autocorrelaciones positivas que decaen lentamente, y el gráfico PACF muestra autocorrelaciones positivas, pero decaen repentinamente después del retardo 1, 2 o 3. Para este patrón, el valor de p será el número de retrasos positivos significativos en el PACF, y el valor de q se establece en cero (q = 0).
Firma MA: cuando el gráfico de ACF y PACF muestra una autocorrelación negativa y significativa en el mismo rezago #. En este caso, el valor de q será el rezago negativo # que es significativo.

Para la definición de P y Q tenemos que comprobar si existe una autocorrelación significativa en los rezagos estacionales en las parcelas ACF y PACF. La mayoría de las veces, P y Q serán 0 o 1. Si se están manejando datos mensuales, se tiene que ver si hay una autocorrelación significativa en el rezago 12. Si es una autocorrelación significativa positiva, entonces definimos P = 1 y Q = 0; si la autocorrelación en el retardo 12 es significativa y negativa, definimos P = 0 y Q = 1. Si no hay una autocorrelación significativa en el retardo 12, entonces P = 0 y Q = 0.

  1. Estimar / Ejecutar el modelo ARIMA-SARIMA con los valores que definimos previamente.

  2. Ejecutar el ACF y PACF de los residuales / errores del modelo para verificar si no existen autocorrelaciones significativas de los errores.

Si encontramos autocorrelaciones importantes, puede incluir otros términos en el modelo ARIMA-SARIMA y volver al paso 3 para comprobar los patrones de los gráficos ACF y PACF de los errores. Si los errores parecen sin autocorrelaciones significativas, podemos continuar y finalizar el proceso de calibración. (Dorantes, 2021)

# Para el proceso de calibración, obtenemos la diferencia estacional del logaritmo del tipo de cambio.

seasonaldiflog_er<- diff(log(exrate), lag = 12)
plot(seasonaldiflog_er)


# Empleamos el Dickey Fuller Test, para corroborar la estacionalidad de la serie.

adf.test(seasonaldiflog_er, k = 1)
p-value smaller than printed p-value

    Augmented Dickey-Fuller Test

data:  seasonaldiflog_er
Dickey-Fuller = -4.2125, Lag order = 1, p-value = 0.01
alternative hypothesis: stationary

Como podemos observar, tenemos suficiente evidencia estadística (P value menor a .05) al 95% de confianza de que podemos tratar la diferencia estacional del logaritmo como estacionaria.

Es importante mencionar que d es la cantidad de primeras diferencias que aplicamos a la variable, mientras que D se refiere al número de diferencias estacionales aplicadas a la variable.

Resultado del modelo (coeficientes, pvalues)

# Ejecutamos los gráficos de autocorrelación (ACF) y de autocorrelación parcial (PACF): 

library(astsa)
acf2(seasonaldiflog_er,max.lag = 24)
     [,1]  [,2]  [,3]  [,4] [,5]  [,6]  [,7]  [,8]  [,9] [,10] [,11] [,12] [,13] [,14] [,15] [,16] [,17] [,18] [,19] [,20] [,21] [,22] [,23]
ACF  0.93  0.84  0.75  0.65 0.58  0.52  0.45  0.38  0.30  0.23  0.14  0.05  0.03  0.03  0.03  0.04  0.03  0.01  0.00 -0.02 -0.03 -0.04 -0.04
PACF 0.93 -0.16 -0.04 -0.09 0.15 -0.09 -0.04 -0.05 -0.13 -0.02 -0.18  0.02  0.40 -0.04  0.02 -0.09  0.04 -0.11 -0.01 -0.04 -0.01  0.02 -0.12
     [,24]
ACF  -0.04
PACF -0.05

Ésta es una firma AR clásica ya que las autocorrelaciones en el ACF son positivas y decaen lentamente, mientras que las autocorrelaciones en el PACF disminuyen después del retardo 1. Para la firma AR, la definición de p está determinada por el gráfico PACF. El valor p será el # de rezago con autocorrelación positiva y significativa en el PACF. En este caso, p = 1 ya que la autocorrelación del rezago 1 es significativa y positiva, y la autocorrelación del rezago 2 desciende a un valor negativo.


# Usaremos el algoritmo automático auto.arima del paquete de pronóstico para ayudarnos con la calibración de p, q, P y Q. 

library(lmtest)
model1 <- auto.arima(exrate,
              lambda = 0, # Con lambda = 0, indicamos que el logaritmo será aplicado.
              d=0,D=1, # con dichos parámetros indicamos que estamos modelando el cambio porcentual anual, mes por mes. 
              max.p=2, max.q=1, # Establecemos los valores máximos para p y q.
              max.P = 1,max.Q = 1, # Establecemos los valores máximos para P y Q.
              stepwise = FALSE)
coeftest(model1)

z test of coefficients:

        Estimate Std. Error  z value Pr(>|z|)    
ar1    0.9605354  0.0179658  53.4646  < 2e-16 ***
ma1    0.1284311  0.0608263   2.1114  0.03473 *  
sar1  -0.5929641  0.0523041 -11.3369  < 2e-16 ***
drift  0.0062774  0.0035999   1.7438  0.08120 .  
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

# Verificamos si los errores / residuales son una serie estacionaria. Si el error es una serie estacionaria, esto significa que tenemos todos los términos que proporcionan el poder de explicación de la serie.

# Ejecutamos el ACF y el PACF para la serie de errores:

errors <- model1$residuals
acf2(errors,max.lag = 24)
     [,1] [,2] [,3]  [,4] [,5] [,6]  [,7] [,8]  [,9] [,10] [,11] [,12] [,13] [,14] [,15] [,16] [,17] [,18] [,19] [,20] [,21] [,22] [,23]
ACF     0 0.02 0.09 -0.12 0.04 0.04 -0.05 0.07 -0.03  0.13  0.08 -0.08 -0.03 -0.12 -0.02  0.00  0.05 -0.02 -0.01 -0.02  0.00  0.02  0.07
PACF    0 0.02 0.09 -0.12 0.04 0.03 -0.03 0.05 -0.03  0.14  0.06 -0.07 -0.07 -0.10  0.01 -0.03  0.08 -0.04 -0.01 -0.04 -0.01  0.04  0.09
     [,24]
ACF  -0.33
PACF -0.33

Vemos que la autocorrelación del rezago 4 es negativa y apenas significativa en ambas gráficas.

Interpretación de los coeficientes


# El modelo automatizado nos dio los siguientes términos: un término AR (1) y MA (1) y un AR estacional (1). Ahora, podemos volver a ejecutarlo directamente indicando estos valores: 

model2 <- Arima(exrate, 
                lambda = 0, # Aplicamos el logaritmo natural a la variable
                order = c(1,0,1), #p=1; d=0; q=1
                seasonal = list(order=c(1,1,0),period=12), #P=1,D=1,Q=0
                include.constant = TRUE,
                ) 
coeftest(model2)

z test of coefficients:

        Estimate Std. Error  z value Pr(>|z|)    
ar1    0.9605354  0.0179658  53.4646  < 2e-16 ***
ma1    0.1284311  0.0608263   2.1114  0.03473 *  
sar1  -0.5929641  0.0523041 -11.3369  < 2e-16 ***
drift  0.0062774  0.0035999   1.7438  0.08120 .  
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

De acuerdo con el profesor Dorantes, para una buena interpretación, primero debemos identificar cuál es la transformación de la variable que estamos modelando. En este caso, dado que aplicamos el logaritmo al tipo de cambio y d = 0, y D = 1, estamos modelando la variación porcentual anual del tipo de cambio. Ahora podemos continuar con la interpretación:

El coeficiente phi1 (el coeficiente del término AR (1)) es 0.960298 y es significativamente positivo. Esto significa que:

El% de crecimiento anual del tipo de cambio se relaciona positiva y significativamente con su propio crecimiento anual del mes anterior.Por cada 1% de crecimiento anual del tipo de cambio en el mes anterior, el crecimiento anual actual se modificará en aproximadamente 96%.

El coeficiente theta1 (el coeficiente del término MA (1)) es 0.1286291 y es significativamente positivo. Esto significa que:

El crecimiento en % anual del tipo de cambio se relaciona positiva y significativamente con el shock (error) del mes anterior.Por cada cambio del 1% en el impacto del mes anterior, el crecimiento anual actual se modificará en aproximadamente un 12%.

El coeficiente del término AR (1) estacional es -0,5919663 y es significativamente negativo Esto significa que:

El % de crecimiento anual del tipo de cambio está relacionado negativa y significativamente con su propio crecimiento anual de hace 12 meses. Si el tipo de cambio creció hace 12 meses, es probable que este mes baje. Por cada + 1% de crecimiento anual del tipo de cambio de hace un año, el crecimiento anual actual se modificará en aproximadamente -59%.

Inflación

Proceso de manejo de datos

Como bien vimos en el modelo del tipo de cambio, el primer paso siempre que vamos a trabajar una base de datos, es administrarla. Para ello, en la resolución del modelo de inflación, descargaremos el IPC de México desde la base de datos de FRED.

Una vez extraída la base de datos, necesitamos marcar las unidades y la frecuencia.

library(quantmod)
library(tseries)
library(forecast)

#Una vez descargadas las librerías, usamos la función "getSymbols" para traer el los datos del índice mexicano IPC desde la base de datos FRED.

getSymbols(Symbols="MEXCPIALLMINMEI", src="FRED")
[1] "MEXCPIALLMINMEI"
#Dado que la base de datos nos brinda la data mensual por defecto, ya no es necesario convertirla a mensual. Sin embargo, sí ajustamos la base de datos y contamos los datos a partir de noviembre de 1993.

INFLACION.MX = MEXCPIALLMINMEI["1993-11-01/"]
plot(INFLACION.MX)


## Transformamos el DataFrame a un objeto TimeSeries, indicamos fecha de inicio (noviembre, 1993) y la frecuencia solicitada, en este caso anual (12).

INF.MX = ts(coredata(INFLACION.MX),start=c(1993,11),frequency=12)

En el gráfico elaborado, podemos apreciar el comportamiento del Índice de Precios al Consumidor (IPC) desde el año 1993; como podemos ver, claramente es una serie de tiempo no estacionaria y desde el 93 ha venido creciendo continuamente. Esta es la razón por la cual, año tras año, vamos perdiendo nuestro poder adquisitivo.

Proceso de calibración (incluyendo las pruebas estadísticas necesarias)

# Para el proceso de calibración, obtenemos la diferencia estacional del logaritmo del IPC.

seasonaldiflog_er2<- diff(log(INF.MX), lag = 12)
plot(seasonaldiflog_er2)


# Empleamos el Dickey Fuller Test, para corroborar la estacionalidad de la serie.

adf.test(seasonaldiflog_er2, k = 1)

    Augmented Dickey-Fuller Test

data:  seasonaldiflog_er2
Dickey-Fuller = -3.8228, Lag order = 1, p-value = 0.01823
alternative hypothesis: stationary

Una vez que obtenemos la diferencia estacional del logaritmo del IPC, vemos cómo claramente el gráfico; si bien, empieza con diferencias porcentuales elevadas, a medida que transcurren los años se regula y a simple vista pareciera arrojarnos una serie estacionaria. No obstante, para darle soporte estadístico a nuestro análisis, empleamos la prueba de Dickey Fuller y efecetivamente el valor P (.0182), siendo menor a .05, nos confirma que estamos hablando de una seria estacionaria.

Resultado del modelo (coeficientes, pvalues)


# Ejecutamos los gráficos de autocorrelación (ACF) y de autocorrelación parcial (PACF):

library(astsa)
acf2(seasonaldiflog_er2,max.lag = 24)
     [,1]  [,2] [,3] [,4] [,5]  [,6]  [,7]  [,8] [,9] [,10] [,11] [,12] [,13] [,14] [,15] [,16] [,17] [,18] [,19] [,20] [,21] [,22] [,23]
ACF  0.99  0.98 0.96 0.93 0.90  0.87  0.84  0.80 0.77  0.73  0.69  0.66  0.63  0.61  0.58  0.56  0.54  0.52  0.50  0.48  0.47  0.45  0.43
PACF 0.99 -0.78 0.13 0.04 0.05 -0.15 -0.09 -0.06 0.05  0.13  0.11  0.10  0.12 -0.26  0.01  0.04  0.05 -0.11 -0.05 -0.05  0.01  0.15  0.03
     [,24]
ACF   0.42
PACF  0.07

Al igual que en el modelo del tipo de cambio, esta es una firma AR clásica ya que las autocorrelaciones en el ACF son positivas y decaen lentamente. Para la firma AR, la definición de p está determinada por el gráfico PACF. El valor p será el número de rezago con autocorrelación positiva y significativa en el PACF. En este caso, p = 1 ya que la autocorrelación del rezago 1 es significativa y positiva, y la autocorrelación del rezago 2 desciende a un valor negativo. Una observación interesante, es la manera tan sútil en la que van decayendo los valores del ACF. Así mismo, hay una relación interesante entre los distintos correlogramas del tipo de cambio y el IPC, quizás en otro momento pudieramos evaluar la relación entre estas variables y sacar su correlograma.

library(lmtest)
model3 <- auto.arima(INF.MX,
              lambda = 0, # Con lambda = 0, indicamos la aplicación del logaritmo.
              d=0,D=1, # Con esto indicamos que estamos modelando el crecimiento anual porcentual, mes tras mes.
              max.p=2, max.q=1, # Establecemos valores máximos para p y q
              max.P = 1,max.Q = 1, # Establecemos valores máximos para P y Q
              stepwise = FALSE)
coeftest(model3)

z test of coefficients:

        Estimate Std. Error z value Pr(>|z|)    
ar1    1.7938735  0.0340874  52.626  < 2e-16 ***
ar2   -0.7982868  0.0342269 -23.323  < 2e-16 ***
sar1  -0.5810423  0.0577964 -10.053  < 2e-16 ***
drift  0.0067257  0.0027542   2.442  0.01461 *  
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

La función auto.arima, en pocas palabras, funge como un solver de Excel que entremezcla miles de opciones y dicta la mejor para generar nuestro modelo ARIMA. En este caso, ejecutamos el modelo auto.arima indicando los valores de d y D, y también indicando que necesitamos aplicar el logaritmo (lambda = 0). De acuerdo con el profesor Dorantes, se recomienda verificar el significado de cada término. Si hay términos no significativos, se recomienda eliminar el término con el valor p más alto (el menos significativo).

errors <- model3$residuals
acf2(errors,max.lag = 24)
     [,1] [,2] [,3]  [,4] [,5]  [,6] [,7] [,8] [,9] [,10] [,11] [,12] [,13] [,14] [,15] [,16] [,17] [,18] [,19] [,20] [,21] [,22] [,23]
ACF  0.06    0 0.03 -0.17 0.02  0.00 0.09 0.18  0.1  0.05  0.06  0.01  0.04  0.04  0.03 -0.07  0.01  0.02 -0.01  0.13  0.01  0.05  0.06
PACF 0.06    0 0.03 -0.17 0.04 -0.01 0.11 0.14  0.1  0.03  0.08  0.04  0.07  0.03  0.02 -0.13 -0.01 -0.02 -0.03  0.07 -0.03  0.03  0.05
     [,24]
ACF  -0.38
PACF -0.37

Una vez corrido el auto arima, es importante verificar si los errores / residuales son una serie estacionaria. Si el error es una serie estacionaria, esto significa que tenemos todos los términos que proporcionan el poder de explicación de la serie. Cómo podmemos ver, efectivamente presenta una serie estacionaria.

Interpretación de los coeficientes

model4 <- Arima(INF.MX, 
                lambda = 0, # Aplicamos el logaritmo natural a la variable
                order = c(1,0,1), #p=1; d=0; q=1
                seasonal = list(order=c(1,1,0),period=12), #P=1,D=1,Q=0
                include.constant = TRUE,
                ) 
coeftest(model4)

z test of coefficients:

        Estimate Std. Error  z value Pr(>|z|)    
ar1    0.9969634  0.0030949 322.1279   <2e-16 ***
ma1    0.7058856  0.0351359  20.0901   <2e-16 ***
sar1  -0.6109598  0.0624246  -9.7872   <2e-16 ***
drift  0.0079953  0.0050914   1.5703   0.1163    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

El coeficiente phi1 es 0.99 y es significativamente positivo. Esto significa que, el porcentaje de crecimiento anual del IPC se relaciona positiva y significativamente con su propio crecimiento anual del mes anterior. Es decir, por cada 1% de crecimiento anual del tipo de cambio en el mes anterior, el crecimiento anual actual se modificará en aproximadamente 99%.

El coeficiente theta1 es 0.70 y es significativamente positivo. Esto significa que, el porcentaje de crecimiento anual del IPC se relaciona positiva y significativamente con el shock (error) del mes anterior. Es decir, por cada cambio del 1% en el impacto del mes anterior, el crecimiento anual actual se modificará en aproximadamente un 70%.

El coeficiente del término AR (1) estacional es -0.61 y es significativamente negativo. Esto significa que, el porcentaje de crecimiento anual del IPC, está relacionado negativa y significativamente con su propio crecimiento anual de hace 12 meses. Si el tipo de cambio creció hace 12 meses, es probable que este mes baje. Por cada +1% de crecimiento anual del tipo de cambio de hace un año, el crecimiento anual actual se modificará en aproximadamente -61%.

Metodología: Pronóstico de variables

Tipo de cambio

Gráfico del pronóstico (Intervalo del 95% de confianza)

Ahora podemos hacer fácilmente un pronóstico para el tipo de cambio usando nuestro modelo calibrado usando la función de pronóstico del paquete de pronóstico. Haremos un pronóstico para los próximos 18 meses:

exrate_forecast <- forecast(model1, h=18)
autoplot(exrate_forecast)

Como podemos ver, en el gráfico se arroja el pronóstico en violeta para el tipo de cambio medio, el intervalo de confianza del 80% y el intervalo de confianza del 95% del tipo de cambio USD/MXN. El intervalo de confianza del 95% está en violeta claro. Podemos ver que el error de pronóstico puede ser grande ya que el intervalo de confianza del 95% del pronóstico para fines de 2022 está entre 15,00 y 30,00 USD.

Valores del pronóstico


# Desplegamos los valores del pronóstico para los próximos 18 meses.

tail(exrate_forecast$mean,18)
          Jan      Feb      Mar      Apr      May      Jun      Jul      Aug      Sep      Oct      Nov      Dec
2021                                                       19.59254 20.23523 20.23540 19.69549 19.58782 19.17687
2022 19.43241 20.30608 22.37904 22.65369 21.61007 22.22103 21.66317 21.82748 22.03075 21.38256 20.72623 20.45642
max_exchange_rate = max(exrate_forecast$mean)

Tras haber modelado nuestro modelo econométrico, estos son los datos pronosticados del tipo de cambio para los próximos 18 meses.

Interpretación del pronóstico

max_exchange_rate
[1] 22.65369

Según nuestra previsión, el tipo de cambio máximo se acercará a los 22.65 dólares, y esto podría suceder en abril del 2022.

Inflación

Gráfico del pronóstico (Intervalo del 95% de confianza)

inflacion.mx_forecast <- forecast(model4, h=19)
# I stored the information of the forecast in forecast_air

# I plot the forecast
autoplot(inflacion.mx_forecast)

Como podemos ver, en gráfico se arroja el pronóstico en violeta para el IPC en los próximos 18 meses, el intervalo de confianza del 80% y el intervalo de confianza del 95% del tipo del mismo índice. El intervalo de confianza del 95% está en violeta claro. Podemos ver que el error de pronóstico puede ser grande ya que el intervalo de confianza del 95% del pronóstico para fines de 2022 está entre 130 y 150.

Valores del pronóstico

tail(inflacion.mx_forecast$mean,19)
          Jan      Feb      Mar      Apr      May      Jun      Jul      Aug      Sep      Oct      Nov      Dec
2021                                     128.3003 128.6544 129.3094 129.5255 129.8797 130.6477 131.3604 132.0346
2022 132.8980 133.5936 134.0148 133.3840 133.8543 134.4769 135.3143 135.7592 136.1251 136.9775 137.3626         
max_inflacion.mx = max(inflacion.mx_forecast$mean)

En este apartado podemos ver la fluctuación mes tras mes pronosticada del IPC.

Interpretación del pronóstico

max_inflacion.mx
[1] 137.3626

De acuerdo con nuestro modelo, el IPC en un lapso futuro de 18 meses puede alcanzar un máximo de 137.36 puntos. Sin embargo, es importante resaltar, que este modelo no tiene contemplado las diversas variables macroeconomicas que esta pandemia ha originado. Es decir, todo nuestro análisis ha sido desarrollado con series de tiempo históricas; pero nunca en la historia EE.UU había impreso tantos dólares en tan poco tiempo, y apenas seremos testigos de las consecuencias que esto traerá en términos de inflación y política monetaria.

Análisis de resultado, conclusión y recomendación final

Análisis de resultados

Tras haber empleado el modelo econométrico ARIMA-SARIMA para la proyección tanto del tipo de cambio del par USD/MXN, como del Índice de Precios al Consumidor (IPC); podemos resaltar los siguientes resultados:

tail(exrate_forecast$mean,18)
          Jan      Feb      Mar      Apr      May      Jun      Jul      Aug      Sep      Oct      Nov      Dec
2021                                                       19.59254 20.23523 20.23540 19.69549 19.58782 19.17687
2022 19.43241 20.30608 22.37904 22.65369 21.61007 22.22103 21.66317 21.82748 22.03075 21.38256 20.72623 20.45642
max_exchange_rate = max(exrate_forecast$mean)
tail(inflacion.mx_forecast$mean,19)
          Jan      Feb      Mar      Apr      May      Jun      Jul      Aug      Sep      Oct      Nov      Dec
2021                                     128.3003 128.6544 129.3094 129.5255 129.8797 130.6477 131.3604 132.0346
2022 132.8980 133.5936 134.0148 133.3840 133.8543 134.4769 135.3143 135.7592 136.1251 136.9775 137.3626         
max_inflacion.mx = max(inflacion.mx_forecast$mean)

En la parte superior, observamos el pronóstico para los próximos 18 meses del tipo de cambio USD/MXN, y en la parte superior observamos la proyección del IPC de igual forma para los próximos 18 meses.

Conclusión y recomendación final

Sin duda alguna, como bien mencionaba anteriormente, el modelo no contempla muchas variables extraordinarias que de momento está presentando la economía a nivel global. Las secuelas económicas que ha originado la pandemia, aún están por verse. Sin embargo, por fines académicos y con base en la resolución de este ejercicio, Alicia debería tomar la alternativa de inversión número 2. O sea, cambiar su dinero a dólares y enviarlo a una cuenta en dólares en Estados Unidos a una tasa anual del 6% de aquí a diciembre de 2022.

La razón es por diversos factores,

  1. El USD es la divisa con mayor fuerza en la economía global, y aunque de momento la FED esté imprimiendo tantos dólares, EE.UU es el banco mundial y mantener nuestra inversión en USD siempre será mejor que en MXN.

  2. Si bien, el IPyC está en constante desarrollo, no podemos olvidar que el mercado mexicano aún es muy pequeño y aunque hay grandes empresas enlistadas, invertir en un fondo indexado al S&P500 siempre nos arrojará mejores rendimientos.

  3. La inflación a parte de seguir creciendo, se vio que existe la posibilidad que para el próximo año aumenté en un 7.3%. Es decir, que si Alicia no empleara ninguna inversión su dinero perdería valor de manera significativa.

En resumen, recomiendo a Alicia cambiar su dinero a dólares y enviarlo a una cuenta en dólares en Estados Unidos a una tasa anual del 6% de aquí a diciembre de 2022. Como pudimos determinar, se espera que el dólar se aprecie en un 14.92% más o menos para el próximo año y si le añadímos el 6% del fondo de inversión, mantendrá y arrojará mejores rendimientos para Alicia. Por otra parte, invertir en el mercado mexicano, a parte de implicar mayor riesgo, se espera que la inflación aumente en un 7.3%, es decir, debería de emplear un portafolio de inverisión que pagué más del 7% para que mínimo no pierda valor su dinero.

#Bibliografía · Andrés Sevilla Arias(01 de noviembre, 2015).Inflación. Economipedia.com · José Luis Caballero. (2018). ¿Qué es y cómo se mide la inflación en México?. 08/06/2021, de El Economista Sitio web: https://www.eleconomista.com.mx/economia/Que-es-y-como-se-mide-la-inflacion-en-Mexico-20180114-0002.html · Alberto Dorantes. (2021). Workshop 2, Time Series. 08/06/2021, de ITESM Sitio web: https://rpubs.com/cdorante/fz2020_w2 · Alberto Dorantes. (2021). Workshop 3, Time Series. 08/06/2021, de ITESM Sitio web: https://rpubs.com/cdorante/fz2020_w3 · Alberto Dorantes. (2021). Workshop 4, Time Series. 08/06/2021, de ITESM Sitio web: https://rpubs.com/cdorante/fz2020_w4

LS0tCnRpdGxlOiAiRXZpZGVuY2lhIEZpbmFsIC0gU2VyaWVzIGRlIHRpZW1wbyAtIFJhZmFlbCBSb21vIgphdXRob3I6ICJSYWZhZWwgUm9tbyAtIEEwMTcwMTQ5MyIKb3V0cHV0OiBodG1sX25vdGVib29rCi0tLQoKIyBTaXR1YWNpw7NuIHByb2JsZW1hLiBUaXBvIGRlIGNhbWJpbyBlIGluZmxhY2nDs24uCgpBbGljaWEgZXMgdW5hIGludmVyc2lvbmlzdGEgbWV4aWNhbmEgcXVlIGRlc2VhIGludmVydGlyIGVuIGFjY2lvbmVzIGRlIGVtcHJlc2FzIGRlIE3DqXhpY28geSBsb3MgRXN0YWRvcyBVbmlkb3MsIGJ1c2NhbmRvIGFtcGxpYXIgc3UgcGFub3JhbWEgZGUgYWx0ZXJuYXRpdmFzIGRlIGludmVyc2nDs24gZHVyYW50ZSBsYSBwYW5kZW1pYSBkZWwgQ09WSUQuIExlIHByZW9jdXBhIHF1ZSBlbiBlbCBwbGF6byBkZSAxIGEgMiBhw7FvcyBlbCBwZXNvIHNlIGRldmFsw7plIGNvbiByZXNwZWN0byBhbCBkw7NsYXIgYW1lcmljYW5vLiBUYW1iacOpbiBsZSBwcmVvY3VwYSBxdWUgZWwgbml2ZWwgZGUgaW5mbGFjacOzbiBhY3R1YWxtZW50ZSBlc3TDoSBlbiB1bmEgdGFzYSBtw6FzIGFsdGEgcXVlIGxhIHRhc2EgYW51YWwgZGUgbGlicmUgZGUgcmllc2dvIGRlIE3DqXhpY28gcXVlIHNvbiBsb3MgQ0VURVMuIFRhbWJpw6luIGxlIHByZW9jdXBhIHF1ZSBsYSBpbmZsYWNpw7NuIHNpZ2Egc2llbmRvIGFsdGEgZW4gZWwgbGFwc28gcHLDs3hpbW8gZGUgMSBhIDIgYcOxb3MuCgpBbGljaWEgcXVpZXJlIHRlbmVyIHVuYSBwZXJzcGVjdGl2YSB0YW50byBkZWwgdGlwbyBkZSBjYW1iaW8gY29tbyBkZSBsYSBpbmZsYWNpw7NuIHBhcmEgdG9kbyBlbCByZXN0byBkZWwgcHJlc2VudGUgYcOxbyAyMDIxIHkgZWwgcHLDs3hpbW8gYcOxbyAyMDIyLiBUaWVuZSBwZW5zYWRvIGludmVydGlyIHRhbnRvIGVuIGVsIMOtbmRpY2UgbWVyY2FkbyBkZSBFc3RhZG9zIFVuaWRvcywgZWwgUyZQNTAwOyBjb21vIGVuIGVsIMOtbmRpY2UgZGUgbWVyY2FkbyBtZXhpY2FubywgZWwgSVBDLiBBbGljaWEgdGFtYmnDqW4gdGllbmUgdW5hIGFsdGVybmF0aXZhIGRlIGludmVyc2nDs24gcXVlIGFjdHVhbG1lbnRlIGxlIG9mcmVjZSB1bmEgdGFzYSBhdHJhY3RpdmEgYW51YWwgZGUgNiUgcGFyYSAyMDIxIHkgMjAyMi4KCkFsaWNpYSByZXF1aWVyZSB1bmEgcHJveWVjY2nDs24gdGFudG8gZGVsIHRpcG8gZGUgY2FtYmlvIGNvbW8gZGUgbGEgaW5mbGFjacOzbiBlbiBNw6l4aWNvIHBhcmEgdG9tYXIgbGEgZGVjaXNpw7NuIHNpIGludmllcnRlIGVuIHVuIHBvcnRhZm9saW8gYXF1w60gZW4gTcOpeGljbyBvIGVudsOtYSBzdSBkaW5lcm8gYSBFc3RhZG9zIFVuaWRvcyBhIHVuYSB0YXNhIGFudWFsIGRlbCA2JSBkZSBhcXXDrSBhIGRpY2llbWJyZSBkZSAyMDIyLiAoQ2FzbyBleHRyYcOtZG8gZGUgbGEgbWF0ZXJpYSBTZXJpZXMgZGUgdGllbXBvLCBwb3IgZWwgSVRFU00pCgojIE1ldG9kb2xvZ8OtYQoKIyMgTW9kZWxvIEFSSU1BLVNBUklNQQoKRWwgbW9kZWxvIEFSSU1BLVNBUklNQSBlcyB1bmEgbWV0b2RvbG9nw61hIHF1ZSBmb3JtYSBwYXJ0ZSBkZSBsb3MgbW9kZWxvcyBkZSBCb3gtSmVua2lucyBwYXJhIHNlcmllcyBkZSB0aWVtcG8sIHF1ZSBwcm9wb3JjaW9uYW4gdW5hIHNlcmllIGRlIGhlcnJhbWllbnRhcyBwYXJhIGNvbXByZW5kZXIgY29tcG9ydGFtaWVudG9zIHBhc2Fkb3MgeSBwcmVkZWNpciB2YWxvcmVzIGZ1dHVyb3MgZGUgdmFyaWFibGVzIGRlIHNlcmllcyB0ZW1wb3JhbGVzLgoKRW4gdW4gbW9kZWxvIEFSSU1BIC8gU0FSSU1BIHNlIHRpZW5lIGNvbW8gb2JqZXRpdm8gY29tcHJlbmRlciBsb3MgdmFsb3JlcyBhY3R1YWxlcyBkZSB1bmEgdmFyaWFibGUgZGUgc2VyaWUgZGUgdGllbXBvIHV0aWxpemFuZG8gc3VzIHByb3Bpb3MgdmFsb3JlcyBwYXNhZG9zIHkgY2hvcXVlcyBhbGVhdG9yaW9zIHBhc2Fkb3M7IGVsIG1vZGVsbyBubyBpbmNsdXllIG90cmFzIHZhcmlhYmxlcyBleHBsaWNhdGl2YXMgKHZhcmlhYmxlcyBkZSBYKSBjb21vIGVuIHVuIG1vZGVsbyBkZSByZWdyZXNpw7NuIGxpbmVhbCB0cmFkaWNpb25hbC4KCkRlIGFjdWVyZG8gY29uIGVsIHByb2Zlc29yIEFsYmVydG8gRG9yYW50ZXMsIGxhIHZhcmlhYmxlIGRlIHNlcmllIHRlbXBvcmFsIGVuIHVuIG1vZGVsbyBBUklNQSAvIFNBUklNQSBzZSBleHBsaWNhIHBvcjoKCsK3U3VzIHByb3Bpb3MgdmFsb3JlcyBwYXNhZG9zOyBlc3RvcyB2YWxvcmVzIHNlIGRlbm9taW5hbiBMQUd2YWx1ZXMuCsK3Q2hvcXVlcyBhbGVhdG9yaW9zIHBhc2Fkb3M7IGVzdG9zIHZhbG9yZXMgc2UgZGVub21pbmFuIGVycm9yZXMgTEFHIG8gY2hvcXVlcyBMQUcuIArCt1N1cyBwcm9waW9zIHZhbG9yZXMgZXN0YWNpb25hbGVzOyBVbmEgdGVtcG9yYWRhIHNlIHJlZmllcmUgYSAxIGHDsW8uIEVzdG9zIHZhbG9yZXMgc2UgZGVub21pbmFuIHZhbG9yZXMgZGUgTEFHIGVzdGFjaW9uYWxlcy4gCsK3Q2hvcXVlcyBhbGVhdG9yaW9zIGVzdGFjaW9uYWxlcyBwYXNhZG9zOyBlc3RvcyB2YWxvcmVzIHNlIGRlbm9taW5hbiBlcnJvcmVzIGRlIExBRyBlc3RhY2lvbmFsZXMuCgpQYXJhIGRlc29ycmFsbGFyIHVuIG1vZGVsbyBBUklNQSAvIFNBUklNQSwgc2UgZGViZW4gZXN0aW1hciBsb3Mgc2lndWllbnRlcyBwYXLDoW1ldHJvczoKCsK3cDogbsO6bWVybyBkZSB0w6lybWlub3MgQVIgcXVlIHNlIGluY2x1aXLDoW4gY29tbyB2YXJpYWJsZXMgZXhwbGljYXRpdmFzCsK3ZDogbsO6bWVybyBkZSBwcmltZXJhcyBkaWZlcmVuY2lhcyBhcGxpY2FkYXMgYSBsYSB2YXJpYWJsZSBvcmlnaW5hbArCt3E6IG7Dum1lcm8gZGUgdMOpcm1pbm9zIGRlIE1BIHF1ZSBzZSBpbmNsdWlyw6FuIGNvbW8gdmFyaWFibGVzIGV4cGxpY2F0aXZhcwrCt1A6IG7Dum1lcm8gZGUgdMOpcm1pbm9zIEFSIGVzdGFjaW9uYWxlcyBxdWUgc2UgaW5jbHVpcsOhbiBjb21vIHZhcmlhYmxlcyBleHBsaWNhdGl2YXMKwrdEOiBuw7ptZXJvIGRlIGRpZmVyZW5jaWEgZXN0YWNpb25hbCBhcGxpY2FkYSBhIGxhIHZhcmlhYmxlCsK3UDogbsO6bWVybyBkZSB0w6lybWlub3MgZGUgTUEgZXN0YWNpb25hbGVzIHF1ZSBzZSBpbmNsdWlyw6FuIGNvbW8gdmFyaWFibGVzIGV4cGxpY2F0aXZhcwoKRWwgcHJvZmVzb3IgRG9yYW50ZXMsIGFmaXJtYSBxdWUgZXMgaW1wb3J0YW50ZSByZXNhbHRhciwgcXVlIGVsIHBhcsOhbWV0cm8gZCBzZSByZWZpZXJlIGEgY3XDoW50YXMgcHJpbWVyYXMgZGlmZXJlbmNpYXMgYXBsaWNhbW9zIGEgbGFzIHZhcmlhYmxlcyBvcmlnaW5hbGVzIGRlIGxhIHNlcmllIGRlIHRpZW1wbyBwYXJhIGhhY2VyIHF1ZSBsYSBzZXJpZSBzZWEgZXN0YWNpb25hcmlhLiBNaWVudHJhcyBxdWUgZWwgcGFyw6FtZXRybyBEIHNlIHJlZmllcmUgYSBjdcOhbnRhcyBkaWZlcmVuY2lhcyBlc3RhY2lvbmFsZXMgZGVjaWRpbW9zIGFwbGljYXIgYSBsYSB2YXJpYWJsZS4gKERvcmFudGVzLCAyMDIxKQoKIyMgRWwgbW9kZWxvIEFSIChwKSAtIEFSSU1BIChwLCBkLCAwKSAKCkVuIGdlbmVyYWwsIGxvcyBtb2RlbG9zIGF1dG9ycmVncmVzaXZvcyBBUiAocCkgYXN1bWVuIHF1ZSBleGlzdGUgYWxnw7puIHRpcG8gZGUgZmVuw7NtZW5vIGRlIGF1dG9jb3JyZWxhY2nDs24gZW4gbGEgc2VyaWUgdGVtcG9yYWwuIEVsIGNvbmNlcHRvIGRlIGF1dG9jb3JyZWxhY2nDs24gc2UgcmVmaWVyZSBhIGxhIGNvcnJlbGFjacOzbiBkZSBsYSB2YXJpYWJsZSBkZSBob3kgZW4gZWwgdGllbXBvIHQgY29uIHN1cyB2YWxvcmVzIHBhc2Fkb3MgKHQtbikuIExhIGF1dG9jb3JyZWxhY2nDs24gZXMgZWwgcHJpbmNpcGlvIGNsYXZlIGRlIGVzdG9zIG1vZGVsb3MuCgpFbiBFY29ub21ldHLDrWEgZGUgc2VyaWVzIGRlIHRpZW1wbyBzZSBwdWVkZSBoYWJsYXIgZGUgdW5hIGF1dG9jb3JyZWxhY2nDs24gZW4gbGEgdmFyaWFibGUgZGVwZW5kaWVudGUuIEVzdG8gc2lnbmlmaWNhIHF1ZSBsb3MgdmFsb3JlcyBhY3R1YWxlcyBvIGZ1dHVyb3MgZGUgdW5hIHZhcmlhYmxlIGVjb27Ds21pY2EgbyBmaW5hbmNpZXJhIHB1ZWRlbiBleHBsaWNhcnNlIGRlIGFsZ3VuYSBtYW5lcmEgcG9yIHN1cyB2YWxvcmVzIGFudGVyaW9yZXMuIEVzdGEgZXMgbGEgYmFzZSBkZSBsbyBxdWUgbG9zIGVjb25vbWV0cmlzdGFzIGhhbiBsbGFtYWRvIHVuIG1vZGVsbyBhdXRvcnJlZ3Jlc2l2bywgdGFtYmnDqW4gZGVub21pbmFkbyBtb2RlbG8gQVIgKHApIG8gbW9kZWxvIEFSSU1BIChwLCBkLCAwKS4KCkVsIG1vZGVsbyBBUiAocCkgcGFyYSBZdCBwdWVkZSBzZXIgZXhwcmVzYWRvIGRlIGxhIHNpZ3VpZW50ZSBmb3JtYToKJCRZX3t0fT1ccGhpIF97MH0rXHN1bV97az0xfV57UH1ccGhpIF97a31ZX3t0LWt9K1x2YXJlcHNpbG9uIF97dH0kJApEb25kZSDPlTEsIC4uLiDPlXAgc29uIGxvcyBwYXLDoW1ldHJvcyBkZWwgbW9kZWxvLCDPtXQgc2UgcmVmaWVyZSBhbCB0w6lybWlubyBkZSBlcnJvciBvIGNob3F1ZSBhbGVhdG9yaW8uCgpQYXJhIGFwbGljYXIgZXN0ZSBtb2RlbG8gdGVuZW1vcyBxdWUgZGVtb3N0cmFyIHF1ZSBsYSBzZXJpZSBZdCBlcyBlc3RhY2lvbmFyaWEuIFBvZGVtb3MgdXNhciBsYSBwcnVlYmEgZGUgRGlja3ktRnVsbGVyIHBhcmEgZGVjaWRpciBzaSBsYSBzZXJpZSBlcyBlc3RhY2lvbmFyaWEuIFNpIGxhIHNlcmllIG9yaWdpbmFsIG5vIGVzIGVzdGFjaW9uYXJpYSwgcG9kZW1vcyBjYWxjdWxhciBsYSBwcmltZXJhIGRpZmVyZW5jaWEgZGUgbGEgc2VyaWUsIHkgbGEgbWF5b3LDrWEgZGUgbGFzIHZlY2VzIGxhIHNlcmllIHJlc3VsdGFudGUgc2Ugdm9sdmVyw6EgZXN0YWNpb25hcmlhLiAKCiMjIFRoZSBNQShxKSBtb2RlbCAtIEFSSU1BKDAsZCxxKQoKUG9yIG90cmEgcGFydGUsIGVsIG1vZGVsbyBBUiAocCkgZXMgdW4gcHJvY2VzbyBjb24gbWVtb3JpYSBhIGxhcmdvIHBsYXpvLiBEZSBhY3VlcmRvIGNvbiBlbCBwcm9mZXNvciBEb3JhbnRlcywgZXN0byBzZSBkZWJlIGEgcXVlIHVuYSBjb25tb2Npw7NuIGhveSBpbXBhY3RhcsOhIGVuIGVsIGZ1dHVybyBwYXJhIHNpZW1wcmUuIFNpIHNlIGxlZSBsYSBlY3VhY2nDs24gbWF0ZW3DoXRpY2EsIGVzdG8gc2UgcHVlZGUgaW50ZXJwcmV0YXIgZGUgbGEgc2lndWllbnRlIG1hbmVyYTogCiQkWV97dH09XHBoaSBfezB9K1xlcHNpbG9uX3t0fStcc3VtX3trPTF9XntxfVx0aGV0YSBfe2t9XGVwc2lsb24gX3t0LWt9JCQKRWwgdmFsb3IgZGUgbGEgc2VyaWUgbWHDsWFuYSBkZXBlbmRlcsOhIGRlbCB2YWxvciBkZSBob3ksIGRlc3B1w6lzIGRlIGFwbGljYXIgZWwgZmlsdHJvIM+VMS4gRW50b25jZXMsIGVsIHZhbG9yIGRlIG1hw7FhbmEgeWEgdGllbmUgaW5mb3JtYWNpw7NuIHNvYnJlIGVsIHZhbG9yIGRlIGhveS4gWSBlbCB2YWxvciBkZSBtYcOxYW5hIGFmZWN0YXLDoSBlbCB2YWxvciBkZSAyIGTDrWFzIGEgcGFydGlyIGRlIGFob3JhLiBFbnRvbmNlcywgZWwgdmFsb3IgZGUgaG95IHRlbmRyw6EgdW4gaW1wYWN0byBlbiB0b2RvIGVsIGZ1dHVybyBkZSBsYSBzZXJpZS4gKERvcmFudGVzLCAyMDIxKQoKUG9kZW1vcyBpbnRlcnByZXRhciB1biBtb2RlbG8gTUEgcHVybyBjb21vIHVuIHByb2Nlc28gYWxlYXRvcmlvIGRvbmRlIGVsIHZhbG9yIGFjdHVhbCBkZSBsYSBzZXJpZSBlc3TDoSBpbmZsdWVuY2lhZG8gcG9yIGFsZ3Vub3MgcG9yY2VudGFqZXMgZGUgY2hvcXVlcyAvIGVycm9yZXMgYWxlYXRvcmlvcyAocSkgcHJldmlvcyB5IGVsIGNob3F1ZSBhbGVhdG9yaW8gYWN0dWFsLiBMb3MgcG9yY2VudGFqZXMgc29uIGVuIHJlYWxpZGFkIGxvcyB2YWxvcmVzIGRlIGxvcyBjb2VmaWNpZW50ZXMgzrguCgpFbiBGaW5hbnphcywgY3VhbmRvIHNlIGRlc2VhIG1vZGVsYXIgZWwgY29tcG9ydGFtaWVudG8gZGUgbG9zIHJldG9ybm9zIGRlbCBtZXJjYWRvLCBzYWJlbW9zIHF1ZSBoYXkgbWlsZXMgZGUgZXZlbnRvcyBxdWUgYWZlY3RhbiBjw7NtbyBzZSBtdWV2ZW4gbG9zIHJldG9ybm9zIGRlbCBtZXJjYWRvIGhveS4gRXN0b3MgbWlsZXMgZGUgZXZlbnRvcyBzZSByZXN1bWVuIGLDoXNpY2FtZW50ZSBlbiB1biDigJxzaG9jayBhbGVhdG9yaW/igJ0gcXVlIG5hZGllIHNhYmUgY3XDoWwgc2Vyw6Egc3UgbWFnbml0dWQgeSBkaXJlY2Npw7NuIChlZmVjdG8gcG9zaXRpdm8gbyBuZWdhdGl2bykuIAoKIyMgQVJJTUEocCxkLHEpIG1vZGVsCgpBaG9yYSBwb2RlbW9zIGNvbWJpbmFyIHTDqXJtaW5vcyBBUiAocCkgeSB0w6lybWlub3MgTUEgKHEpIGVuIHVuIHNvbG8gbW9kZWxvLCBxdWUgc2UgbGxhbWEgQVJNQSAocCwgcSk6IAoKJCRZX3t0fT1ccGhpIF97MH0rXHN1bV97az0xfV57UH1ccGhpIF97a31ZX3t0LWt9K1xzdW1fe2s9MX1ee3F9XHRoZXRhIF97a31cZXBzaWxvbiBfe3Qta30rXGVwc2lsb25fe3R9JCQKCiMjIEluZmxhY2nDs24KCiMjIMK/UXXDqSBlcyBsYSBpbmZsYWNpw7NuPwoKTGEgaW5mbGFjacOzbiwgc2UgZGVmaW5lIGNvbW8gZWwgYXVtZW50byBnZW5lcmFsaXphZG8gZW4gbG9zIHByZWNpb3MgZGUgbG9zIGJpZW5lcyB5IHNlcnZpY2lvcyBkZSB1bmEgZWNvbm9tw61hIGR1cmFudGUgdW4gcGVyaW9kbyBkZSB0aWVtcG8uIEVzIGRlY2lyLCBjdWFuZG8gdmVtb3MgdW4gYXVtZW50byBkZSBmb3JtYSBzb3N0ZW5pZGEgZW4gbGEgbWVkaWEgZGUgbG9zIHByZWNpb3MgZGUgY2llcnRvIGNvbmp1bnRvIGRlIGJpZW5lcyB5IHNlcnZpY2lvcyBkZSB1bmEgZWNvbm9tw61hLCBlc3RhbW9zIGhhYmxhbmRvIGRlIGluZmxhY2nDs24uIAoKIyMgwr9Dw7NtbyBzZSBjYWxjdWxhIGxhIGluZmxhY2nDs24/CgpEZSBhY3VlcmRvIGNvbiBFY29ub21pcGVkaWEsIGNhbGN1bGFyIGxhIGluZmxhY2nDs24gaW1wbGljYSB1bmEgYW1wbGlhIHkgY29tcGxlamEgbGlzdGEgZGUgY2FsY3Vsb3MuIERhZGEgZXN0YSBkaWZpY3VsdGFkIHBhcmEgY2FsY3VsYXIgbGEgdmFyaWFjacOzbiBkZSB0b2RvcyBsb3MgcHJlY2lvcyBkZSB1bmEgZWNvbm9tw61hLCBleGlzdGVuIGRvcyBwcmluY2lwYWxlcyBpbmRpY2Fkb3JlcyBwYXJhIGNvbm9jZXIgY3XDoW50byBlc3TDoW4gc3ViaWVuZG8gbG9zIHByZWNpb3M6CgogIMK3VW4gaW5kaWNhZG9yIGFwcm94aW1hZG8gZXMgZWwgw61uZGljZSBkZSBwcmVjaW9zIGRlbCBjb25zdW1vIChJUEMpLCBxdWUgZXN0w6EgY29tcHVlc3RvIHBvciBncnVwb3MgZGUgYmllbmVzIHkgc2VydmljaW9zLCBkZXNkZSBhbGltZW50b3MsIHJvcGEsIG1lZGljaW5hczsgaGFzdGEgY29tdW5pY2FjaW9uZXMsIHRyYW5zcG9ydGUsIHZpdmllbmRhIHkgb2Npby4KCiAgwrdPdHJhIG1hbmVyYSBkZSBjYWxjdWxhciBsYSBpbmZsYWNpw7NuIGVzIG1lZGlhbnRlIGVsIGRlZmxhY3RvciBkZWwgUElCLCBxdWUgdGllbmUgZW4gY3VlbnRhIGxhIHZhcmlhY2nDs24gZGUgcHJlY2lvcyBkZSB0b2RvcyBsb3MgYmllbmVzIHkgc2VydmljaW9zIHByb2R1Y2lkb3MgZW4gdW4gcGHDrXMuIChFY29ub21pcGVkaWEsIDIwMTUpCiAgCiMjIENhbGN1bGFuZG8gbGEgaW5mbGFjacOzbiBtZWRpYW50ZSBlbCBJUEMKCkVsIElQQyBlcyB1biBpbmRpY2Fkb3IgcXVlIG1pZGUgbGEgdmFyaWFjacOzbiBtZWRpYSBkZSBsb3MgcHJlY2lvcyBkZSBsb3MgYmllbmVzIHkgc2VydmljaW9zIGR1cmFudGUgdW4gcGVyw61vZG8gZGUgdGllbXBvIGRldGVybWluYWRvIGVuIHVuYSBlY29ub23DrWEuIFN1IG9iamV0aXZvIGVzIG1lZGlyIGVsIGNvc3RlIGRlIGxhIHZpZGEgeSBtb3N0cmFyIGxvcyBlZmVjdG9zIGRlIGxhIGluZmxhY2nDs24gZW4gbG9zIGNvbnN1bWlkb3JlcyBpbmRpdmlkdWFsZXMuIERlIGFjdWVyZG8gY29uIHVuIGFydMOtY3VsbyBwdWJsaWNhZG8gcG9yIGVsIEVjb25vbWlzdGEsIGVsIGPDoWxjdWxvIGRlIGxhIGluZmxhY2nDs24gbWVkaWFudGUgZWwgSVBDIHNpZ3VlIHVuIHByb2Nlc28gZGUgc2lldGUgcGFzb3M6CgoxLiBTZWxlY2Npw7NuIGRlIEZ1ZW50ZXMgZGUgSW5mb3JtYWNpw7NuLiAKUGFyYSBnYXJhbnRpemFyIGxhIHJlcHJlc2VudGF0aXZpZGFkIGRlIGxvcyBwcmVjaW9zIHF1ZSBzZSB1dGlsaXphbiBlbiBlbCBjw6FsY3VsbyBkZSBsb3Mgw61uZGljZXMsIGVuIHByaW1lcmEgaW5zdGFuY2lhIHNlIGxsZXZhIGEgY2FibyB1bmEgc2VsZWNjacOzbiBkZSBsYXMgZnVlbnRlcyBkZSBpbmZvcm1hY2nDs24gcG9yIHBhcnRlIGRlIGxvcyBTdXBlcnZpc29yZXMgZW4gY29vcmRpbmFjacOzbiBjb24gbG9zIEludmVzdGlnYWRvcmVzIGRlIFByZWNpb3MuIEVzdMOhcyBmdWVudGVzIHNvbiBzZWxlY2Npb25hZGFzIGRlIGRpcmVjdG9yaW9zIGVzcGVjaWFsaXphZG9zLgoKMi4gQ290aXphY2nDs24gZGUgUHJvZHVjdG9zIEVzcGVjw61maWNvcy4KRWxlZ2lkb3MgbG9zIGVzdGFibGVjaW1pZW50b3MsIGxvcyBJbnZlc3RpZ2Fkb3JlcyBkZSBQcmVjaW9zIGRpc3RyaWJ1aWRvcyBlbiB0b2RvIGVsIHBhw61zIGRhbiBzZWd1aW1pZW50byByZWN1cnJlbnRlIGEgbG9zIHByb2R1Y3RvcyBlc3BlY8OtZmljb3MgbcOhcyByZXByZXNlbnRhdGl2b3MuIExhIHNlbGVjY2nDs24gZGUgbG9zIHByb2R1Y3RvcyBlc3BlY8OtZmljb3Mgc2UgcmVhbGl6YSBjb24gbGEgYXl1ZGEgZGUgbGEgZnVlbnRlIGRlIGluZm9ybWFjacOzbi4KCjMuIENhcHR1cmEgeSBlbnbDrW8uIApVbmEgdmV6IHF1ZSBzZSBkaXNwb25lIGRlIHRvZGFzIGxhcyBjb3RpemFjaW9uZXMgYSBuaXZlbCBuYWNpb25hbCwgw6lzdGFzIHNvbiBjb25jZW50cmFkYXMgZW4gbGEgb2ZpY2luYSBjZW50cmFsIHBhcmEgcmVhbGl6YXIgZWwgcHJvY2VzbyBkZSBjw6FsY3Vsby4KCjQuIEFuw6FsaXNpcyB5IGNyw610aWNhIGRlIGxhIGluZm9ybWFjacOzbi4gCkNvbmNlbnRyYWRhIGxhIGluZm9ybWFjacOzbiBlbiBsYSBDaXVkYWQgZGUgTcOpeGljbywgbG9zIHByZWNpb3MgcXVlIHNlIHJlY2FiYW4gcGFzYW4gcG9yIHVuIHByb2Nlc28gZGUgcmV2aXNpw7NuIHBvciBsb3MgU3VwZXJ2aXNvcmVzIHksIHNpIGVzIG5lY2VzYXJpbywgZGUgdmVyaWZpY2FjacOzbiBkZSBwYXJ0ZSBkZSBsb3MgSW52ZXN0aWdhZG9yZXMgZGUgUHJlY2lvcy4gTWVkaWFudGUgZXN0ZSBwcm9jZWRpbWllbnRvIHNlIGdhcmFudGl6YSBxdWUgbGFzIGNvdGl6YWNpb25lcyBxdWUgc2UgdXRpbGl6YW4gZW4gZWwgY8OhbGN1bG8gc2VhbiBsYXMgY29ycmVjdGFzLgoKNS4gQ8OhbGN1bG8gZGUgbG9zIMONbmRpY2VzLiAKQ29uY2x1aWRvcyB5IGFwcm9iYWRvcyBsb3MgcHJvY2Vzb3MgYW50ZXJpb3JlcyBzZSBwcm9jZWRlIGFsIGPDoWxjdWxvLCBwYXJhIGxvIGN1YWwgc2UgdXRpbGl6YSBlbCBtw6l0b2RvIGRlIHBvbmRlcmFjaW9uZXMgZmlqYXMgZGUgTGFzcGV5cmVzLgoKNi4gUmV2aXNpw7NuIHkgdmFsaWRhY2nDs24gZGUgbG9zIHJlc3VsdGFkb3MuIApBbnRlcyBkZSBzZXIgbGliZXJhZG9zIGxvcyByZXN1bHRhZG9zIHNlIHJlYWxpemFuIHJldW5pb25lcyBkZSB0cmFiYWpvIHBhcmEgdmVyaWZpY2FyIGxhIGNvbnNpc3RlbmNpYSBkZSBsb3MgbWlzbW9zLiBMYXMgdmVyaWZpY2FjaW9uZXMgaW5jbHV5ZW4gY29tcGFyYWNpb25lcyBjb24gb3Ryb3MgaW5kaWNhZG9yZXMgZGUgcHJlY2lvcy4KCjcuIFB1YmxpY2FjacOzbi4KU2UgcHJlc2VudGEgdW4gY29tdW5pY2FkbyBkZSBwcmVuc2EgZW4gZWwgcXVlIHNlIHJlc3VtZSBlbCBjb21wb3J0YW1pZW50byBkZSBsb3Mgw61uZGljZXMgZGUgcHJlY2lvcywgc2UgZGl2dWxnYSBlbiBsYSBww6FnaW5hIFdlYiB5IHBhcmEgZWwgY2FzbyBkZWwgSU5QQyBzZSBwdWJsaWNhbiBlbiBlbCBEaWFyaW8gT2ZpY2lhbCBkZSBsYSBGZWRlcmFjacOzbi4gKEVsIEVjb25vbWlzdGEsIDIwMTgpCgojIE1ldG9kb2xvZ8OtYTogRGlzZcOxbyBkZSBtb2RlbG9zCgojIyBUaXBvIGRlIGNhbWJpbwoKIyMjIFByb2Nlc28gZGUgbWFuZWpvIGRlIGRhdG9zCgpFbCBwcmltZXIgcGFzbyBzaWVtcHJlIHF1ZSB2YW1vcyBhIHRyYWJhamFyIHVuYSBiYXNlIGRlIGRhdG9zLCBlcyBhZG1pbmlzdHJhcmxhLiBQYXJhIGVsbG8sIGVuIGxhIHJlc29sdWNpw7NuIGRlbCBtb2RlbG8gZGVsIHRpcG8gZGUgY2FtYmlvLCBkZXNjYXJnYXJlbW9zIGVsIHBhciBVU0QvTVhOIGRlc2RlIGxhIGJhc2UgZGUgZGF0b3MgZGUgRlJFRC4gRWwgRlJFRCBlcyB1bmEgYmFzZSBkZSBkYXRvcyBlY29uw7NtaWNhIGdyYXR1aXRhIGRlbCBCYW5jbyBkZSBsYSBSZXNlcnZhIEZlZGVyYWwgZGUgRXN0YWRvcyBVbmlkb3MgZGUgU3QuIExvdWlzLiBUaWVuZSBtaWxlcyBkZSBkYXRvcyBlY29uw7NtaWNvcyB5IGZpbmFuY2llcm9zIGRlIHRvZG9zIGxvcyBwYcOtc2VzIGRlbCBtdW5kby4KClVuYSB2ZXogZXh0cmHDrWRhIGxhIGJhc2UgZGUgZGF0b3MsIG5lY2VzaXRhbW9zIG1hcmNhciBsYXMgdW5pZGFkZXMgeSBsYSBmcmVjdWVuY2lhLiBMYXMgdW5pZGFkZXMgREVYTVhVUyBzb246IHBlc29zIG1leGljYW5vcyBhIHVuIGTDs2xhciBlc3RhZG91bmlkZW5zZSwgc2luIGFqdXN0ZSBlc3RhY2lvbmFsLiBTaSBwbGFuZWFtb3MgZGlzZcOxYXIgdW4gbW9kZWxvIEFSSU1BIC8gU0FSSU1BIGVzIHJlY29tZW5kYWJsZSB1dGlsaXphciBzZXJpZXMgbm8gYWp1c3RhZGFzIGVzdGFjaW9uYWxtZW50ZSwgeWEgcXVlIG1vZGVsYXJlbW9zIGxhIGVzdGFjaW9uYWxpZGFkIGRlIGxvcyBkYXRvcy4KCkxhIGJhc2UgZXMgcHJvcG9yY2lvbmFkYSBlbiB1bmEgcGVyaW9kaWNpZGFkIGRpYXJhLCBwb3IgbG8gdGFudG8sIHRyYW5zZm9ybWFyZW1vcyBsYSBzZXJpZSBkZSBmcmVjdWVuY2lhIGRpYXJpYSBhIG1lbnN1YWwgcGFyYSBxdWUgcG9kYW1vcyBkaXNlw7FhciB1biBtb2RlbG8gQVJJTUEgLyBTQVJJTUEuIEVuIGVzdGUgY2FzbywgbGEgbWVqb3IgZm9ybWEgZGUgdHJhbnNmb3JtYXIgZWwgdGlwbyBkZSBjYW1iaW8gZGlhcmlvIGVzIG9idGVuZXIgZWwgw7psdGltbyB0aXBvIGRlIGNhbWJpbyBkZSBjYWRhIG1lcy4gCgpgYGB7cn0KbGlicmFyeShxdWFudG1vZCkKbGlicmFyeSh0c2VyaWVzKQpsaWJyYXJ5KGZvcmVjYXN0KQoKI1VuYSB2ZXogZGVzY2FyZ2FkYXMgbGFzIGxpYnJlcsOtYXMsIHVzYW1vcyBsYSBmdW5jacOzbiAiZ2V0U3ltYm9scyIgcGFyYSB0cmFlciBlbCBwYXIgVVNEL01YTiBkZXNkZSBsYSBiYXNlIGRlIGRhdG9zIEZSRUQuCgpnZXRTeW1ib2xzKFN5bWJvbHM9IkRFWE1YVVMiLCBzcmM9IkZSRUQiKQoKI0RhZG8gcXVlIGxhIGJhc2UgZGUgZGF0b3MgbWFudGllbmUgdW5hIHBlcmlvZGljaWRhZCBkaWFyaWEsIGVzIGltcG9ydGFudGUgY29udmVydGlybGEgYSBtZW5zdWFsLiBQYXJhIGVsbG8gdXRpbGl6YW1vcyBsYSBmdW5jacOzbiAidG8ubW9udGhseSIKCmV4cmF0ZS54dHMgPSB0by5tb250aGx5KERFWE1YVVMpCnBsb3QoZXhyYXRlLnh0cykKCiNVbmEgdmV6IGNvbnZlcnRpZGEgbGEgYmFzZSBkZSBkYXRvcyBhIHZhbG9yZXMgbWVuc3VhbGVzLCBpbmRpY2Ftb3MgcXVlIHRvbWUgcG9yIGRlZmVjdG8gZWwgcHJlY2lvIGRlIGNpZXJyZSBkZWwgcGFyIFVTRC9NWE4uIFVzYW1vcyBsYSBmdW5jacOzbiBDbC4KCmNsb3NlZXhyYXRlLnh0cyA9IENsKGV4cmF0ZS54dHMpCgojIyBUcmFuc2Zvcm1hbW9zIGVsIERhdGFGcmFtZSBhIHVuIG9iamV0byBUaW1lU2VyaWVzLCBpbmRpY2Ftb3MgZmVjaGEgZGUgaW5pY2lvIChub3ZpZW1icmUsIDE5OTMpIHkgbGEgZnJlY3VlbmNpYSBzb2xpY2l0YWRhLCBlbiBlc3RlIGNhc28gYW51YWwgKDEyKS4KCmV4cmF0ZTwtdHMoY29yZWRhdGEoY2xvc2VleHJhdGUueHRzKSxzdGFydD1jKDE5OTMsMTEpLGZyZXF1ZW5jeT0xMikgCmV4cmF0ZQpgYGAKCiMjIyBQcm9jZXNvIGRlIGNhbGlicmFjacOzbiAoaW5jbHV5ZW5kbyBsYXMgcHJ1ZWJhcyBlc3RhZMOtc3RpY2FzIG5lY2VzYXJpYXMpCgpMb3MgbW9kZWxvcyBBUklNQSAtIFNBUklNQSwgbmVjZXNpdGFuIHNlciBjYWxpYnJhZG9zLiBMb3MgcGFzb3MgZ2VuZXJhbGVzIHBhcmEgY2FsaWJyYXIgdW4gbW9kZWxvLCBkZSBhY3VlcmRvIGNvbiBlbCBwcm9mZXNvciBEb3JhbnRlcywgc29uIGxvcyBzaWd1aWVudGVzOgoKICAxLiBEZWZpbmlyIGxhIHRyYW5zZm9ybWFjacOzbiBkZSBsYSB2YXJpYWJsZSBwYXJhIHF1ZSBlc3RhIHRyYW5zZm9ybWFjacOzbiB0ZXJtaW5lIGVuIHVuYSB2YXJpYWJsZSBlc3RhY2lvbmFyaWEuCgpQb3IgbG8gZ2VuZXJhbCwgbG9zIGRhdG9zIG1lbnN1YWxlcyB5IHRyaW1lc3RyYWxlcyBkZSBtdWNoYXMgc2VyaWVzIGVjb27Ds21pY2FzIHkgZmluYW5jaWVyYXMgdGllbmVuIHVuIHBhdHLDs24gZXN0YWNpb25hbC5EZSBhY3VlcmRvIGNvbiBlbCBwcm9mZXNvciBEb3JhbnRlcywgZXMgcmVjb21lbmRhYmxlIHF1ZSBzaSBzZSB0aWVuZW4gZGF0b3MgbWVuc3VhbGVzIG8gdHJpbWVzdHJhbGVzIGRlIGN1YWxxdWllciB2YXJpYWJsZSBmaW5hbmNpZXJhIG8gZWNvbsOzbWljYSwgc2UgY29taWVuY2UgYSBwcm9iYXIgc2kgbGEgZGlmZXJlbmNpYSBlc3RhY2lvbmFsIGRlbCBsb2dhcml0bW8gZGUgbGEgc2VyaWUgZXMgZXN0YWNpb25hcmlhLiBUYW1iacOpbiwgc2UgcmVjb21pZW5kYSBhcGxpY2FyIGxhIHBydWViYSBkZSBEaWNreS1GdWxsZXIgYSBlc3RhIGRpZmVyZW5jaWEgZXN0YWNpb25hbC4gU2kgZXN0YSB2YXJpYWJsZSBlcyBlc3RhY2lvbmFyaWEsIHNlZ3VpcmVtb3MgdXNhbmRvIGVzdGEgdHJhbnNmb3JtYWNpw7NuLCBlbnRvbmNlcyBEID0gMSB5IGQgPSAwLiBEZSBsbyBjb250cmFyaW8sIHBvZGVtb3MgYXBsaWNhciBsYSBwcmltZXJhIGRpZmVyZW5jaWEgZGVsIGxvZ2FyaXRtbyBkZSBsYSBzZXJpZSwgcXVlIGVzIGVsICUgZGUgY2FtYmlvIHBhcmEgY2FkYSBwZXLDrW9kby4gU2kgbGEgcHJpbWVyYSBkaWZlcmVuY2lhIGRlbCBsb2dhcml0bW8gZGUgbGEgc2VyaWUgZXMgZXN0YWNpb25hcmlhLCBlbnRvbmNlcyBkID0gMSB5IEQgPSAwLgoKICAyLiBEZWZpbmlyIGxvcyB2YWxvcmVzIHBhcmEgcCwgcSwgUCwgUS4gVXRpbGl6YW5kbyBsYSB2YXJpYWJsZSBlc3RhY2lvbmFyaWEsIGhheSBxdWUgZWplY3V0YXIgbGFzIGdyw6FmaWNhcyBBQ0YgKGF1dG9jb3JyZWxhY2nDs24pIHkgUEFDRiAoYXV0b2NvcnJlbGFjacOzbiBwYXJjaWFsKSBwYXJhIGlkZW50aWZpY2FyIGxvcyBwYXLDoW1ldHJvcyBwLCBxLCBQIHkgUSBkZSBBUklNQS1TQVJJTUEuIERlcGVuZGllbmRvIGRlIGxvcyBwYXRyb25lcyBkZSBsYXMgZ3LDoWZpY2FzIEFDRiB5IFBBQywgcG9kZW1vcyBkZWNpZGlyIGxvcyB2YWxvcmVzIHBhcmEgcCwgcSwgUCB5IFEuTG9zIHBhdHJvbmVzIG3DoXMgY29tdW5lcyBzb24gbG9zIHNpZ3VpZW50ZXM6CgogICAgRmlybWEgQVI6IGN1YW5kbyBlbCBncsOhZmljbyBBQ0YgbXVlc3RyYSBhdXRvY29ycmVsYWNpb25lcyBwb3NpdGl2YXMgcXVlIGRlY2FlbiBsZW50YW1lbnRlLCB5IGVsIGdyw6FmaWNvIFBBQ0YgbXVlc3RyYSBhdXRvY29ycmVsYWNpb25lcyBwb3NpdGl2YXMsIHBlcm8gZGVjYWVuIHJlcGVudGluYW1lbnRlIGRlc3B1w6lzIGRlbCByZXRhcmRvIDEsIDIgbyAzLiBQYXJhIGVzdGUgcGF0csOzbiwgZWwgdmFsb3IgZGUgcCBzZXLDoSBlbCBuw7ptZXJvIGRlIHJldHJhc29zIHBvc2l0aXZvcyBzaWduaWZpY2F0aXZvcyBlbiBlbCBQQUNGLCB5IGVsIHZhbG9yIGRlIHEgc2UgZXN0YWJsZWNlIGVuIGNlcm8gKHEgPSAwKS4KICAgIEZpcm1hIE1BOiBjdWFuZG8gZWwgZ3LDoWZpY28gZGUgQUNGIHkgUEFDRiBtdWVzdHJhIHVuYSBhdXRvY29ycmVsYWNpw7NuIG5lZ2F0aXZhIHkgc2lnbmlmaWNhdGl2YSBlbiBlbCBtaXNtbyByZXphZ28gIy4gRW4gZXN0ZSBjYXNvLCBlbCB2YWxvciBkZSBxIHNlcsOhIGVsIHJlemFnbyBuZWdhdGl2byAjIHF1ZSBlcyBzaWduaWZpY2F0aXZvLgoKUGFyYSBsYSBkZWZpbmljacOzbiBkZSBQIHkgUSB0ZW5lbW9zIHF1ZSBjb21wcm9iYXIgc2kgZXhpc3RlIHVuYSBhdXRvY29ycmVsYWNpw7NuIHNpZ25pZmljYXRpdmEgZW4gbG9zIHJlemFnb3MgZXN0YWNpb25hbGVzIGVuIGxhcyBwYXJjZWxhcyBBQ0YgeSBQQUNGLiBMYSBtYXlvcsOtYSBkZSBsYXMgdmVjZXMsIFAgeSBRIHNlcsOhbiAwIG8gMS4gU2kgc2UgZXN0w6FuIG1hbmVqYW5kbyBkYXRvcyBtZW5zdWFsZXMsIHNlIHRpZW5lIHF1ZSB2ZXIgc2kgaGF5IHVuYSBhdXRvY29ycmVsYWNpw7NuIHNpZ25pZmljYXRpdmEgZW4gZWwgcmV6YWdvIDEyLiBTaSBlcyB1bmEgYXV0b2NvcnJlbGFjacOzbiBzaWduaWZpY2F0aXZhIHBvc2l0aXZhLCBlbnRvbmNlcyBkZWZpbmltb3MgUCA9IDEgeSBRID0gMDsgc2kgbGEgYXV0b2NvcnJlbGFjacOzbiBlbiBlbCByZXRhcmRvIDEyIGVzIHNpZ25pZmljYXRpdmEgeSBuZWdhdGl2YSwgZGVmaW5pbW9zIFAgPSAwIHkgUSA9IDEuIFNpIG5vIGhheSB1bmEgYXV0b2NvcnJlbGFjacOzbiBzaWduaWZpY2F0aXZhIGVuIGVsIHJldGFyZG8gMTIsIGVudG9uY2VzIFAgPSAwIHkgUSA9IDAuCgogIDMuIEVzdGltYXIgLyBFamVjdXRhciBlbCBtb2RlbG8gQVJJTUEtU0FSSU1BIGNvbiBsb3MgdmFsb3JlcyBxdWUgZGVmaW5pbW9zIHByZXZpYW1lbnRlLgogIAogIDQuIEVqZWN1dGFyIGVsIEFDRiB5IFBBQ0YgZGUgbG9zIHJlc2lkdWFsZXMgLyBlcnJvcmVzIGRlbCBtb2RlbG8gcGFyYSB2ZXJpZmljYXIgc2kgbm8gZXhpc3RlbiBhdXRvY29ycmVsYWNpb25lcyBzaWduaWZpY2F0aXZhcyBkZSBsb3MgZXJyb3Jlcy4KClNpIGVuY29udHJhbW9zIGF1dG9jb3JyZWxhY2lvbmVzIGltcG9ydGFudGVzLCBwdWVkZSBpbmNsdWlyIG90cm9zIHTDqXJtaW5vcyBlbiBlbCBtb2RlbG8gQVJJTUEtU0FSSU1BIHkgdm9sdmVyIGFsIHBhc28gMyBwYXJhIGNvbXByb2JhciBsb3MgcGF0cm9uZXMgZGUgbG9zIGdyw6FmaWNvcyBBQ0YgeSBQQUNGIGRlIGxvcyBlcnJvcmVzLiBTaSBsb3MgZXJyb3JlcyBwYXJlY2VuIHNpbiBhdXRvY29ycmVsYWNpb25lcyBzaWduaWZpY2F0aXZhcywgcG9kZW1vcyBjb250aW51YXIgeSBmaW5hbGl6YXIgZWwgcHJvY2VzbyBkZSBjYWxpYnJhY2nDs24uIChEb3JhbnRlcywgMjAyMSkKCmBgYHtyfQojIFBhcmEgZWwgcHJvY2VzbyBkZSBjYWxpYnJhY2nDs24sIG9idGVuZW1vcyBsYSBkaWZlcmVuY2lhIGVzdGFjaW9uYWwgZGVsIGxvZ2FyaXRtbyBkZWwgdGlwbyBkZSBjYW1iaW8uCgpzZWFzb25hbGRpZmxvZ19lcjwtIGRpZmYobG9nKGV4cmF0ZSksIGxhZyA9IDEyKQpwbG90KHNlYXNvbmFsZGlmbG9nX2VyKQoKIyBFbXBsZWFtb3MgZWwgRGlja2V5IEZ1bGxlciBUZXN0LCBwYXJhIGNvcnJvYm9yYXIgbGEgZXN0YWNpb25hbGlkYWQgZGUgbGEgc2VyaWUuCgphZGYudGVzdChzZWFzb25hbGRpZmxvZ19lciwgayA9IDEpCmBgYApDb21vIHBvZGVtb3Mgb2JzZXJ2YXIsIHRlbmVtb3Mgc3VmaWNpZW50ZSBldmlkZW5jaWEgZXN0YWTDrXN0aWNhIChQIHZhbHVlIG1lbm9yIGEgLjA1KSBhbCA5NSUgZGUgY29uZmlhbnphIGRlIHF1ZSBwb2RlbW9zIHRyYXRhciBsYSBkaWZlcmVuY2lhIGVzdGFjaW9uYWwgZGVsIGxvZ2FyaXRtbyBjb21vIGVzdGFjaW9uYXJpYS4KCkVzIGltcG9ydGFudGUgbWVuY2lvbmFyICBxdWUgZCBlcyBsYSBjYW50aWRhZCBkZSBwcmltZXJhcyBkaWZlcmVuY2lhcyBxdWUgYXBsaWNhbW9zIGEgbGEgdmFyaWFibGUsIG1pZW50cmFzIHF1ZSBEIHNlIHJlZmllcmUgYWwgbsO6bWVybyBkZSBkaWZlcmVuY2lhcyBlc3RhY2lvbmFsZXMgYXBsaWNhZGFzIGEgbGEgdmFyaWFibGUuCgojIyMgUmVzdWx0YWRvIGRlbCBtb2RlbG8gKGNvZWZpY2llbnRlcywgcHZhbHVlcykKCmBgYHtyfQojIEVqZWN1dGFtb3MgbG9zIGdyw6FmaWNvcyBkZSBhdXRvY29ycmVsYWNpw7NuIChBQ0YpIHkgZGUgYXV0b2NvcnJlbGFjacOzbiBwYXJjaWFsIChQQUNGKTogCgpsaWJyYXJ5KGFzdHNhKQphY2YyKHNlYXNvbmFsZGlmbG9nX2VyLG1heC5sYWcgPSAyNCkKYGBgCsOJc3RhIGVzIHVuYSBmaXJtYSBBUiBjbMOhc2ljYSB5YSBxdWUgbGFzIGF1dG9jb3JyZWxhY2lvbmVzIGVuIGVsIEFDRiBzb24gcG9zaXRpdmFzIHkgZGVjYWVuIGxlbnRhbWVudGUsIG1pZW50cmFzIHF1ZSBsYXMgYXV0b2NvcnJlbGFjaW9uZXMgZW4gZWwgUEFDRiBkaXNtaW51eWVuIGRlc3B1w6lzIGRlbCByZXRhcmRvIDEuIFBhcmEgbGEgZmlybWEgQVIsIGxhIGRlZmluaWNpw7NuIGRlIHAgZXN0w6EgZGV0ZXJtaW5hZGEgcG9yIGVsIGdyw6FmaWNvIFBBQ0YuIEVsIHZhbG9yIHAgc2Vyw6EgZWwgIyBkZSByZXphZ28gY29uIGF1dG9jb3JyZWxhY2nDs24gcG9zaXRpdmEgeSBzaWduaWZpY2F0aXZhIGVuIGVsIFBBQ0YuIEVuIGVzdGUgY2FzbywgcCA9IDEgeWEgcXVlIGxhIGF1dG9jb3JyZWxhY2nDs24gZGVsIHJlemFnbyAxIGVzIHNpZ25pZmljYXRpdmEgeSBwb3NpdGl2YSwgeSBsYSBhdXRvY29ycmVsYWNpw7NuIGRlbCByZXphZ28gMiBkZXNjaWVuZGUgYSB1biB2YWxvciBuZWdhdGl2by4gCgpgYGB7cn0KCiMgVXNhcmVtb3MgZWwgYWxnb3JpdG1vIGF1dG9tw6F0aWNvIGF1dG8uYXJpbWEgZGVsIHBhcXVldGUgZGUgcHJvbsOzc3RpY28gcGFyYSBheXVkYXJub3MgY29uIGxhIGNhbGlicmFjacOzbiBkZSBwLCBxLCBQIHkgUS4gCgpsaWJyYXJ5KGxtdGVzdCkKbW9kZWwxIDwtIGF1dG8uYXJpbWEoZXhyYXRlLAogICAgICAgICAgICAgIGxhbWJkYSA9IDAsICMgQ29uIGxhbWJkYSA9IDAsIGluZGljYW1vcyBxdWUgZWwgbG9nYXJpdG1vIHNlcsOhIGFwbGljYWRvLgogICAgICAgICAgICAgIGQ9MCxEPTEsICMgY29uIGRpY2hvcyBwYXLDoW1ldHJvcyBpbmRpY2Ftb3MgcXVlIGVzdGFtb3MgbW9kZWxhbmRvIGVsIGNhbWJpbyBwb3JjZW50dWFsIGFudWFsLCBtZXMgcG9yIG1lcy4gCiAgICAgICAgICAgICAgbWF4LnA9MiwgbWF4LnE9MSwgIyBFc3RhYmxlY2Vtb3MgbG9zIHZhbG9yZXMgbcOheGltb3MgcGFyYSBwIHkgcS4KICAgICAgICAgICAgICBtYXguUCA9IDEsbWF4LlEgPSAxLCAjIEVzdGFibGVjZW1vcyBsb3MgdmFsb3JlcyBtw6F4aW1vcyBwYXJhIFAgeSBRLgogICAgICAgICAgICAgIHN0ZXB3aXNlID0gRkFMU0UpCmNvZWZ0ZXN0KG1vZGVsMSkKYGBgCmBgYHtyfQoKIyBWZXJpZmljYW1vcyBzaSBsb3MgZXJyb3JlcyAvIHJlc2lkdWFsZXMgc29uIHVuYSBzZXJpZSBlc3RhY2lvbmFyaWEuIFNpIGVsIGVycm9yIGVzIHVuYSBzZXJpZSBlc3RhY2lvbmFyaWEsIGVzdG8gc2lnbmlmaWNhIHF1ZSB0ZW5lbW9zIHRvZG9zIGxvcyB0w6lybWlub3MgcXVlIHByb3BvcmNpb25hbiBlbCBwb2RlciBkZSBleHBsaWNhY2nDs24gZGUgbGEgc2VyaWUuCgojIEVqZWN1dGFtb3MgZWwgQUNGIHkgZWwgUEFDRiBwYXJhIGxhIHNlcmllIGRlIGVycm9yZXM6CgplcnJvcnMgPC0gbW9kZWwxJHJlc2lkdWFscwphY2YyKGVycm9ycyxtYXgubGFnID0gMjQpCmBgYApWZW1vcyBxdWUgbGEgYXV0b2NvcnJlbGFjacOzbiBkZWwgcmV6YWdvIDQgZXMgbmVnYXRpdmEgeSBhcGVuYXMgc2lnbmlmaWNhdGl2YSBlbiBhbWJhcyBncsOhZmljYXMuCgojIyMgSW50ZXJwcmV0YWNpw7NuIGRlIGxvcyBjb2VmaWNpZW50ZXMgCgpgYGB7cn0KCiMgRWwgbW9kZWxvIGF1dG9tYXRpemFkbyBub3MgZGlvIGxvcyBzaWd1aWVudGVzIHTDqXJtaW5vczogdW4gdMOpcm1pbm8gQVIgKDEpIHkgTUEgKDEpIHkgdW4gQVIgZXN0YWNpb25hbCAoMSkuIEFob3JhLCBwb2RlbW9zIHZvbHZlciBhIGVqZWN1dGFybG8gZGlyZWN0YW1lbnRlIGluZGljYW5kbyBlc3RvcyB2YWxvcmVzOiAKCm1vZGVsMiA8LSBBcmltYShleHJhdGUsIAogICAgICAgICAgICAgICAgbGFtYmRhID0gMCwgIyBBcGxpY2Ftb3MgZWwgbG9nYXJpdG1vIG5hdHVyYWwgYSBsYSB2YXJpYWJsZQogICAgICAgICAgICAgICAgb3JkZXIgPSBjKDEsMCwxKSwgI3A9MTsgZD0wOyBxPTEKICAgICAgICAgICAgICAgIHNlYXNvbmFsID0gbGlzdChvcmRlcj1jKDEsMSwwKSxwZXJpb2Q9MTIpLCAjUD0xLEQ9MSxRPTAKICAgICAgICAgICAgICAgIGluY2x1ZGUuY29uc3RhbnQgPSBUUlVFLAogICAgICAgICAgICAgICAgKSAKY29lZnRlc3QobW9kZWwyKQpgYGAKCkRlIGFjdWVyZG8gY29uIGVsIHByb2Zlc29yIERvcmFudGVzLCBwYXJhIHVuYSBidWVuYSBpbnRlcnByZXRhY2nDs24sIHByaW1lcm8gZGViZW1vcyBpZGVudGlmaWNhciBjdcOhbCBlcyBsYSB0cmFuc2Zvcm1hY2nDs24gZGUgbGEgdmFyaWFibGUgcXVlIGVzdGFtb3MgbW9kZWxhbmRvLiBFbiBlc3RlIGNhc28sIGRhZG8gcXVlIGFwbGljYW1vcyBlbCBsb2dhcml0bW8gYWwgdGlwbyBkZSBjYW1iaW8geSBkID0gMCwgeSBEID0gMSwgZXN0YW1vcyBtb2RlbGFuZG8gbGEgdmFyaWFjacOzbiBwb3JjZW50dWFsIGFudWFsIGRlbCB0aXBvIGRlIGNhbWJpby4gQWhvcmEgcG9kZW1vcyBjb250aW51YXIgY29uIGxhIGludGVycHJldGFjacOzbjoKCkVsIGNvZWZpY2llbnRlIHBoaTEgKGVsIGNvZWZpY2llbnRlIGRlbCB0w6lybWlubyBBUiAoMSkpIGVzIDAuOTYwMjk4IHkgZXMgc2lnbmlmaWNhdGl2YW1lbnRlIHBvc2l0aXZvLiBFc3RvIHNpZ25pZmljYSBxdWU6CgpFbCUgZGUgY3JlY2ltaWVudG8gYW51YWwgZGVsIHRpcG8gZGUgY2FtYmlvIHNlIHJlbGFjaW9uYSBwb3NpdGl2YSB5IHNpZ25pZmljYXRpdmFtZW50ZSBjb24gc3UgcHJvcGlvIGNyZWNpbWllbnRvIGFudWFsIGRlbCBtZXMgYW50ZXJpb3IuUG9yIGNhZGEgMSUgZGUgY3JlY2ltaWVudG8gYW51YWwgZGVsIHRpcG8gZGUgY2FtYmlvIGVuIGVsIG1lcyBhbnRlcmlvciwgZWwgY3JlY2ltaWVudG8gYW51YWwgYWN0dWFsIHNlIG1vZGlmaWNhcsOhIGVuIGFwcm94aW1hZGFtZW50ZSA5NiUuCgpFbCBjb2VmaWNpZW50ZSB0aGV0YTEgKGVsIGNvZWZpY2llbnRlIGRlbCB0w6lybWlubyBNQSAoMSkpIGVzIDAuMTI4NjI5MSB5IGVzIHNpZ25pZmljYXRpdmFtZW50ZSBwb3NpdGl2by4gRXN0byBzaWduaWZpY2EgcXVlOgoKRWwgY3JlY2ltaWVudG8gZW4gJSBhbnVhbCBkZWwgdGlwbyBkZSBjYW1iaW8gc2UgcmVsYWNpb25hIHBvc2l0aXZhIHkgc2lnbmlmaWNhdGl2YW1lbnRlIGNvbiBlbCBzaG9jayAoZXJyb3IpIGRlbCBtZXMgYW50ZXJpb3IuUG9yIGNhZGEgY2FtYmlvIGRlbCAxJSBlbiBlbCBpbXBhY3RvIGRlbCBtZXMgYW50ZXJpb3IsIGVsIGNyZWNpbWllbnRvIGFudWFsIGFjdHVhbCBzZSBtb2RpZmljYXLDoSBlbiBhcHJveGltYWRhbWVudGUgdW4gMTIlLgoKRWwgY29lZmljaWVudGUgZGVsIHTDqXJtaW5vIEFSICgxKSBlc3RhY2lvbmFsIGVzIC0wLDU5MTk2NjMgeSBlcyBzaWduaWZpY2F0aXZhbWVudGUgbmVnYXRpdm8gRXN0byBzaWduaWZpY2EgcXVlOgoKRWwgJSBkZSBjcmVjaW1pZW50byBhbnVhbCBkZWwgdGlwbyBkZSBjYW1iaW8gZXN0w6EgcmVsYWNpb25hZG8gbmVnYXRpdmEgeSBzaWduaWZpY2F0aXZhbWVudGUgY29uIHN1IHByb3BpbyBjcmVjaW1pZW50byBhbnVhbCBkZSBoYWNlIDEyIG1lc2VzLiBTaSBlbCB0aXBvIGRlIGNhbWJpbyBjcmVjacOzIGhhY2UgMTIgbWVzZXMsIGVzIHByb2JhYmxlIHF1ZSBlc3RlIG1lcyBiYWplLiBQb3IgY2FkYSArIDElIGRlIGNyZWNpbWllbnRvIGFudWFsIGRlbCB0aXBvIGRlIGNhbWJpbyBkZSBoYWNlIHVuIGHDsW8sIGVsIGNyZWNpbWllbnRvIGFudWFsIGFjdHVhbCBzZSBtb2RpZmljYXLDoSBlbiBhcHJveGltYWRhbWVudGUgLTU5JS4gCgojIyBJbmZsYWNpw7NuIAoKIyMjIFByb2Nlc28gZGUgbWFuZWpvIGRlIGRhdG9zCgpDb21vIGJpZW4gdmltb3MgZW4gZWwgbW9kZWxvIGRlbCB0aXBvIGRlIGNhbWJpbywgZWwgcHJpbWVyIHBhc28gc2llbXByZSBxdWUgdmFtb3MgYSB0cmFiYWphciB1bmEgYmFzZSBkZSBkYXRvcywgZXMgYWRtaW5pc3RyYXJsYS4gUGFyYSBlbGxvLCBlbiBsYSByZXNvbHVjacOzbiBkZWwgbW9kZWxvIGRlIGluZmxhY2nDs24sIGRlc2NhcmdhcmVtb3MgZWwgSVBDIGRlIE3DqXhpY28gZGVzZGUgbGEgYmFzZSBkZSBkYXRvcyBkZSBGUkVELgoKVW5hIHZleiBleHRyYcOtZGEgbGEgYmFzZSBkZSBkYXRvcywgbmVjZXNpdGFtb3MgbWFyY2FyIGxhcyB1bmlkYWRlcyB5IGxhIGZyZWN1ZW5jaWEuCgpgYGB7cn0KbGlicmFyeShxdWFudG1vZCkKbGlicmFyeSh0c2VyaWVzKQpsaWJyYXJ5KGZvcmVjYXN0KQoKI1VuYSB2ZXogZGVzY2FyZ2FkYXMgbGFzIGxpYnJlcsOtYXMsIHVzYW1vcyBsYSBmdW5jacOzbiAiZ2V0U3ltYm9scyIgcGFyYSB0cmFlciBlbCBsb3MgZGF0b3MgZGVsIMOtbmRpY2UgbWV4aWNhbm8gSVBDIGRlc2RlIGxhIGJhc2UgZGUgZGF0b3MgRlJFRC4KCmdldFN5bWJvbHMoU3ltYm9scz0iTUVYQ1BJQUxMTUlOTUVJIiwgc3JjPSJGUkVEIikKCiNEYWRvIHF1ZSBsYSBiYXNlIGRlIGRhdG9zIG5vcyBicmluZGEgbGEgZGF0YSBtZW5zdWFsIHBvciBkZWZlY3RvLCB5YSBubyBlcyBuZWNlc2FyaW8gY29udmVydGlybGEgYSBtZW5zdWFsLiBTaW4gZW1iYXJnbywgc8OtIGFqdXN0YW1vcyBsYSBiYXNlIGRlIGRhdG9zIHkgY29udGFtb3MgbG9zIGRhdG9zIGEgcGFydGlyIGRlIG5vdmllbWJyZSBkZSAxOTkzLgoKSU5GTEFDSU9OLk1YID0gTUVYQ1BJQUxMTUlOTUVJWyIxOTkzLTExLTAxLyJdCnBsb3QoSU5GTEFDSU9OLk1YKQoKIyMgVHJhbnNmb3JtYW1vcyBlbCBEYXRhRnJhbWUgYSB1biBvYmpldG8gVGltZVNlcmllcywgaW5kaWNhbW9zIGZlY2hhIGRlIGluaWNpbyAobm92aWVtYnJlLCAxOTkzKSB5IGxhIGZyZWN1ZW5jaWEgc29saWNpdGFkYSwgZW4gZXN0ZSBjYXNvIGFudWFsICgxMikuCgpJTkYuTVggPSB0cyhjb3JlZGF0YShJTkZMQUNJT04uTVgpLHN0YXJ0PWMoMTk5MywxMSksZnJlcXVlbmN5PTEyKQpgYGAKCkVuIGVsIGdyw6FmaWNvIGVsYWJvcmFkbywgcG9kZW1vcyBhcHJlY2lhciBlbCBjb21wb3J0YW1pZW50byBkZWwgw41uZGljZSBkZSBQcmVjaW9zIGFsIENvbnN1bWlkb3IgKElQQykgZGVzZGUgZWwgYcOxbyAxOTkzOyBjb21vIHBvZGVtb3MgdmVyLCBjbGFyYW1lbnRlIGVzIHVuYSBzZXJpZSBkZSB0aWVtcG8gbm8gZXN0YWNpb25hcmlhIHkgZGVzZGUgZWwgOTMgaGEgdmVuaWRvIGNyZWNpZW5kbyBjb250aW51YW1lbnRlLiBFc3RhIGVzIGxhIHJhesOzbiBwb3IgbGEgY3VhbCwgYcOxbyB0cmFzIGHDsW8sIHZhbW9zIHBlcmRpZW5kbyBudWVzdHJvIHBvZGVyIGFkcXVpc2l0aXZvLiAKCiMjIyBQcm9jZXNvIGRlIGNhbGlicmFjacOzbiAoaW5jbHV5ZW5kbyBsYXMgcHJ1ZWJhcyBlc3RhZMOtc3RpY2FzIG5lY2VzYXJpYXMpCgpgYGB7cn0KIyBQYXJhIGVsIHByb2Nlc28gZGUgY2FsaWJyYWNpw7NuLCBvYnRlbmVtb3MgbGEgZGlmZXJlbmNpYSBlc3RhY2lvbmFsIGRlbCBsb2dhcml0bW8gZGVsIElQQy4KCnNlYXNvbmFsZGlmbG9nX2VyMjwtIGRpZmYobG9nKElORi5NWCksIGxhZyA9IDEyKQpwbG90KHNlYXNvbmFsZGlmbG9nX2VyMikKCiMgRW1wbGVhbW9zIGVsIERpY2tleSBGdWxsZXIgVGVzdCwgcGFyYSBjb3Jyb2JvcmFyIGxhIGVzdGFjaW9uYWxpZGFkIGRlIGxhIHNlcmllLgoKYWRmLnRlc3Qoc2Vhc29uYWxkaWZsb2dfZXIyLCBrID0gMSkKYGBgClVuYSB2ZXogcXVlIG9idGVuZW1vcyBsYSBkaWZlcmVuY2lhIGVzdGFjaW9uYWwgZGVsIGxvZ2FyaXRtbyBkZWwgSVBDLCB2ZW1vcyBjw7NtbyBjbGFyYW1lbnRlIGVsIGdyw6FmaWNvOyBzaSBiaWVuLCBlbXBpZXphIGNvbiBkaWZlcmVuY2lhcyBwb3JjZW50dWFsZXMgZWxldmFkYXMsIGEgbWVkaWRhIHF1ZSB0cmFuc2N1cnJlbiBsb3MgYcOxb3Mgc2UgcmVndWxhIHkgYSBzaW1wbGUgdmlzdGEgcGFyZWNpZXJhIGFycm9qYXJub3MgdW5hIHNlcmllIGVzdGFjaW9uYXJpYS4gTm8gb2JzdGFudGUsIHBhcmEgZGFybGUgc29wb3J0ZSBlc3RhZMOtc3RpY28gYSBudWVzdHJvIGFuw6FsaXNpcywgZW1wbGVhbW9zIGxhIHBydWViYSBkZSBEaWNrZXkgRnVsbGVyIHkgZWZlY2V0aXZhbWVudGUgZWwgdmFsb3IgUCAoLjAxODIpLCBzaWVuZG8gbWVub3IgYSAuMDUsIG5vcyBjb25maXJtYSBxdWUgZXN0YW1vcyBoYWJsYW5kbyBkZSB1bmEgc2VyaWEgZXN0YWNpb25hcmlhLgoKIyMjIFJlc3VsdGFkbyBkZWwgbW9kZWxvIChjb2VmaWNpZW50ZXMsIHB2YWx1ZXMpCgpgYGB7cn0KCiMgRWplY3V0YW1vcyBsb3MgZ3LDoWZpY29zIGRlIGF1dG9jb3JyZWxhY2nDs24gKEFDRikgeSBkZSBhdXRvY29ycmVsYWNpw7NuIHBhcmNpYWwgKFBBQ0YpOgoKbGlicmFyeShhc3RzYSkKYWNmMihzZWFzb25hbGRpZmxvZ19lcjIsbWF4LmxhZyA9IDI0KQpgYGAKQWwgaWd1YWwgcXVlIGVuIGVsIG1vZGVsbyBkZWwgdGlwbyBkZSBjYW1iaW8sIGVzdGEgZXMgdW5hIGZpcm1hIEFSIGNsw6FzaWNhIHlhIHF1ZSBsYXMgYXV0b2NvcnJlbGFjaW9uZXMgZW4gZWwgQUNGIHNvbiBwb3NpdGl2YXMgeSBkZWNhZW4gbGVudGFtZW50ZS4gUGFyYSBsYSBmaXJtYSBBUiwgbGEgZGVmaW5pY2nDs24gZGUgcCBlc3TDoSBkZXRlcm1pbmFkYSBwb3IgZWwgZ3LDoWZpY28gUEFDRi4gRWwgdmFsb3IgcCBzZXLDoSBlbCBuw7ptZXJvIGRlIHJlemFnbyBjb24gYXV0b2NvcnJlbGFjacOzbiBwb3NpdGl2YSB5IHNpZ25pZmljYXRpdmEgZW4gZWwgUEFDRi4gRW4gZXN0ZSBjYXNvLCBwID0gMSB5YSBxdWUgbGEgYXV0b2NvcnJlbGFjacOzbiBkZWwgcmV6YWdvIDEgZXMgc2lnbmlmaWNhdGl2YSB5IHBvc2l0aXZhLCB5IGxhIGF1dG9jb3JyZWxhY2nDs24gZGVsIHJlemFnbyAyIGRlc2NpZW5kZSBhIHVuIHZhbG9yIG5lZ2F0aXZvLiBVbmEgb2JzZXJ2YWNpw7NuIGludGVyZXNhbnRlLCBlcyBsYSBtYW5lcmEgdGFuIHPDunRpbCBlbiBsYSBxdWUgdmFuIGRlY2F5ZW5kbyBsb3MgdmFsb3JlcyBkZWwgQUNGLiBBc8OtIG1pc21vLCBoYXkgdW5hIHJlbGFjacOzbiBpbnRlcmVzYW50ZSBlbnRyZSBsb3MgZGlzdGludG9zIGNvcnJlbG9ncmFtYXMgZGVsIHRpcG8gZGUgY2FtYmlvIHkgZWwgSVBDLCBxdWl6w6FzIGVuIG90cm8gbW9tZW50byBwdWRpZXJhbW9zIGV2YWx1YXIgbGEgcmVsYWNpw7NuIGVudHJlIGVzdGFzIHZhcmlhYmxlcyB5IHNhY2FyIHN1IGNvcnJlbG9ncmFtYS4gCgpgYGB7cn0KbGlicmFyeShsbXRlc3QpCm1vZGVsMyA8LSBhdXRvLmFyaW1hKElORi5NWCwKICAgICAgICAgICAgICBsYW1iZGEgPSAwLCAjIENvbiBsYW1iZGEgPSAwLCBpbmRpY2Ftb3MgbGEgYXBsaWNhY2nDs24gZGVsIGxvZ2FyaXRtby4KICAgICAgICAgICAgICBkPTAsRD0xLCAjIENvbiBlc3RvIGluZGljYW1vcyBxdWUgZXN0YW1vcyBtb2RlbGFuZG8gZWwgY3JlY2ltaWVudG8gYW51YWwgcG9yY2VudHVhbCwgbWVzIHRyYXMgbWVzLgogICAgICAgICAgICAgIG1heC5wPTIsIG1heC5xPTEsICMgRXN0YWJsZWNlbW9zIHZhbG9yZXMgbcOheGltb3MgcGFyYSBwIHkgcQogICAgICAgICAgICAgIG1heC5QID0gMSxtYXguUSA9IDEsICMgRXN0YWJsZWNlbW9zIHZhbG9yZXMgbcOheGltb3MgcGFyYSBQIHkgUQogICAgICAgICAgICAgIHN0ZXB3aXNlID0gRkFMU0UpCmNvZWZ0ZXN0KG1vZGVsMykKYGBgCgpMYSBmdW5jacOzbiBhdXRvLmFyaW1hLCBlbiBwb2NhcyBwYWxhYnJhcywgZnVuZ2UgY29tbyB1biBzb2x2ZXIgZGUgRXhjZWwgcXVlIGVudHJlbWV6Y2xhIG1pbGVzIGRlIG9wY2lvbmVzIHkgZGljdGEgbGEgbWVqb3IgcGFyYSBnZW5lcmFyIG51ZXN0cm8gbW9kZWxvIEFSSU1BLiBFbiBlc3RlIGNhc28sIGVqZWN1dGFtb3MgZWwgbW9kZWxvIGF1dG8uYXJpbWEgaW5kaWNhbmRvIGxvcyB2YWxvcmVzIGRlIGQgeSBELCB5IHRhbWJpw6luIGluZGljYW5kbyBxdWUgbmVjZXNpdGFtb3MgYXBsaWNhciBlbCBsb2dhcml0bW8gKGxhbWJkYSA9IDApLiBEZSBhY3VlcmRvIGNvbiBlbCBwcm9mZXNvciBEb3JhbnRlcywgc2UgcmVjb21pZW5kYSB2ZXJpZmljYXIgZWwgc2lnbmlmaWNhZG8gZGUgY2FkYSB0w6lybWluby4gU2kgaGF5IHTDqXJtaW5vcyBubyBzaWduaWZpY2F0aXZvcywgc2UgcmVjb21pZW5kYSBlbGltaW5hciBlbCB0w6lybWlubyBjb24gZWwgdmFsb3IgcCBtw6FzIGFsdG8gKGVsIG1lbm9zIHNpZ25pZmljYXRpdm8pLgoKYGBge3J9CmVycm9ycyA8LSBtb2RlbDMkcmVzaWR1YWxzCmFjZjIoZXJyb3JzLG1heC5sYWcgPSAyNCkKYGBgCgpVbmEgdmV6IGNvcnJpZG8gZWwgYXV0byBhcmltYSwgZXMgaW1wb3J0YW50ZSB2ZXJpZmljYXIgc2kgbG9zIGVycm9yZXMgLyByZXNpZHVhbGVzIHNvbiB1bmEgc2VyaWUgZXN0YWNpb25hcmlhLiBTaSBlbCBlcnJvciBlcyB1bmEgc2VyaWUgZXN0YWNpb25hcmlhLCBlc3RvIHNpZ25pZmljYSBxdWUgdGVuZW1vcyB0b2RvcyBsb3MgdMOpcm1pbm9zIHF1ZSBwcm9wb3JjaW9uYW4gZWwgcG9kZXIgZGUgZXhwbGljYWNpw7NuIGRlIGxhIHNlcmllLiBDw7NtbyBwb2RtZW1vcyB2ZXIsIGVmZWN0aXZhbWVudGUgcHJlc2VudGEgdW5hIHNlcmllIGVzdGFjaW9uYXJpYS4KCiMjIyBJbnRlcnByZXRhY2nDs24gZGUgbG9zIGNvZWZpY2llbnRlcyAKCmBgYHtyfQptb2RlbDQgPC0gQXJpbWEoSU5GLk1YLCAKICAgICAgICAgICAgICAgIGxhbWJkYSA9IDAsICMgQXBsaWNhbW9zIGVsIGxvZ2FyaXRtbyBuYXR1cmFsIGEgbGEgdmFyaWFibGUKICAgICAgICAgICAgICAgIG9yZGVyID0gYygxLDAsMSksICNwPTE7IGQ9MDsgcT0xCiAgICAgICAgICAgICAgICBzZWFzb25hbCA9IGxpc3Qob3JkZXI9YygxLDEsMCkscGVyaW9kPTEyKSwgI1A9MSxEPTEsUT0wCiAgICAgICAgICAgICAgICBpbmNsdWRlLmNvbnN0YW50ID0gVFJVRSwKICAgICAgICAgICAgICAgICkgCmNvZWZ0ZXN0KG1vZGVsNCkKYGBgCgpFbCBjb2VmaWNpZW50ZSBwaGkxIGVzIDAuOTkgeSBlcyBzaWduaWZpY2F0aXZhbWVudGUgcG9zaXRpdm8uIEVzdG8gc2lnbmlmaWNhIHF1ZSwgZWwgcG9yY2VudGFqZSBkZSBjcmVjaW1pZW50byBhbnVhbCBkZWwgSVBDIHNlIHJlbGFjaW9uYSBwb3NpdGl2YSB5IHNpZ25pZmljYXRpdmFtZW50ZSBjb24gc3UgcHJvcGlvIGNyZWNpbWllbnRvIGFudWFsIGRlbCBtZXMgYW50ZXJpb3IuIEVzIGRlY2lyLCBwb3IgY2FkYSAxJSBkZSBjcmVjaW1pZW50byBhbnVhbCBkZWwgdGlwbyBkZSBjYW1iaW8gZW4gZWwgbWVzIGFudGVyaW9yLCBlbCBjcmVjaW1pZW50byBhbnVhbCBhY3R1YWwgc2UgbW9kaWZpY2Fyw6EgZW4gYXByb3hpbWFkYW1lbnRlIDk5JS4KCkVsIGNvZWZpY2llbnRlIHRoZXRhMSBlcyAwLjcwIHkgZXMgc2lnbmlmaWNhdGl2YW1lbnRlIHBvc2l0aXZvLiBFc3RvIHNpZ25pZmljYSBxdWUsIGVsIHBvcmNlbnRhamUgZGUgY3JlY2ltaWVudG8gYW51YWwgZGVsIElQQyBzZSByZWxhY2lvbmEgcG9zaXRpdmEgeSBzaWduaWZpY2F0aXZhbWVudGUgY29uIGVsIHNob2NrIChlcnJvcikgZGVsIG1lcyBhbnRlcmlvci4gRXMgZGVjaXIsIHBvciBjYWRhIGNhbWJpbyBkZWwgMSUgZW4gZWwgaW1wYWN0byBkZWwgbWVzIGFudGVyaW9yLCBlbCBjcmVjaW1pZW50byBhbnVhbCBhY3R1YWwgc2UgbW9kaWZpY2Fyw6EgZW4gYXByb3hpbWFkYW1lbnRlIHVuIDcwJS4KCkVsIGNvZWZpY2llbnRlIGRlbCB0w6lybWlubyBBUiAoMSkgZXN0YWNpb25hbCBlcyAtMC42MSB5IGVzIHNpZ25pZmljYXRpdmFtZW50ZSBuZWdhdGl2by4gRXN0byBzaWduaWZpY2EgcXVlLCBlbCBwb3JjZW50YWplIGRlIGNyZWNpbWllbnRvIGFudWFsIGRlbCBJUEMsIGVzdMOhIHJlbGFjaW9uYWRvIG5lZ2F0aXZhIHkgc2lnbmlmaWNhdGl2YW1lbnRlIGNvbiBzdSBwcm9waW8gY3JlY2ltaWVudG8gYW51YWwgZGUgaGFjZSAxMiBtZXNlcy4gU2kgZWwgdGlwbyBkZSBjYW1iaW8gY3JlY2nDsyBoYWNlIDEyIG1lc2VzLCBlcyBwcm9iYWJsZSBxdWUgZXN0ZSBtZXMgYmFqZS4gUG9yIGNhZGEgKzElIGRlIGNyZWNpbWllbnRvIGFudWFsIGRlbCB0aXBvIGRlIGNhbWJpbyBkZSBoYWNlIHVuIGHDsW8sIGVsIGNyZWNpbWllbnRvIGFudWFsIGFjdHVhbCBzZSBtb2RpZmljYXLDoSBlbiBhcHJveGltYWRhbWVudGUgLTYxJS4gCgoKIyBNZXRvZG9sb2fDrWE6IFByb27Ds3N0aWNvIGRlIHZhcmlhYmxlcwoKIyMgVGlwbyBkZSBjYW1iaW8KCiMjIyBHcsOhZmljbyBkZWwgcHJvbsOzc3RpY28gKEludGVydmFsbyBkZWwgOTUlIGRlIGNvbmZpYW56YSkKCkFob3JhIHBvZGVtb3MgaGFjZXIgZsOhY2lsbWVudGUgdW4gcHJvbsOzc3RpY28gcGFyYSBlbCB0aXBvIGRlIGNhbWJpbyB1c2FuZG8gbnVlc3RybyBtb2RlbG8gY2FsaWJyYWRvIHVzYW5kbyBsYSBmdW5jacOzbiBkZSBwcm9uw7NzdGljbyBkZWwgcGFxdWV0ZSBkZSBwcm9uw7NzdGljby4gSGFyZW1vcyB1biBwcm9uw7NzdGljbyBwYXJhIGxvcyBwcsOzeGltb3MgMTggbWVzZXM6IAoKYGBge3J9CmV4cmF0ZV9mb3JlY2FzdCA8LSBmb3JlY2FzdChtb2RlbDEsIGg9MTgpCmF1dG9wbG90KGV4cmF0ZV9mb3JlY2FzdCkKYGBgCgpDb21vIHBvZGVtb3MgdmVyLCBlbiBlbCBncsOhZmljbyBzZSBhcnJvamEgZWwgcHJvbsOzc3RpY28gZW4gdmlvbGV0YSBwYXJhIGVsIHRpcG8gZGUgY2FtYmlvIG1lZGlvLCBlbCBpbnRlcnZhbG8gZGUgY29uZmlhbnphIGRlbCA4MCUgeSBlbCBpbnRlcnZhbG8gZGUgY29uZmlhbnphIGRlbCA5NSUgZGVsIHRpcG8gZGUgY2FtYmlvIFVTRC9NWE4uIEVsIGludGVydmFsbyBkZSBjb25maWFuemEgZGVsIDk1JSBlc3TDoSBlbiB2aW9sZXRhIGNsYXJvLiBQb2RlbW9zIHZlciBxdWUgZWwgZXJyb3IgZGUgcHJvbsOzc3RpY28gcHVlZGUgc2VyIGdyYW5kZSB5YSBxdWUgZWwgaW50ZXJ2YWxvIGRlIGNvbmZpYW56YSBkZWwgOTUlIGRlbCBwcm9uw7NzdGljbyBwYXJhIGZpbmVzIGRlIDIwMjIgZXN0w6EgZW50cmUgMTUsMDAgeSAzMCwwMCBVU0QuCgojIyMgVmFsb3JlcyBkZWwgcHJvbsOzc3RpY28KCmBgYHtyfQoKIyBEZXNwbGVnYW1vcyBsb3MgdmFsb3JlcyBkZWwgcHJvbsOzc3RpY28gcGFyYSBsb3MgcHLDs3hpbW9zIDE4IG1lc2VzLgoKdGFpbChleHJhdGVfZm9yZWNhc3QkbWVhbiwxOCkKbWF4X2V4Y2hhbmdlX3JhdGUgPSBtYXgoZXhyYXRlX2ZvcmVjYXN0JG1lYW4pCmBgYAoKVHJhcyBoYWJlciBtb2RlbGFkbyBudWVzdHJvIG1vZGVsbyBlY29ub23DqXRyaWNvLCBlc3RvcyBzb24gbG9zIGRhdG9zIHByb25vc3RpY2Fkb3MgZGVsIHRpcG8gZGUgY2FtYmlvIHBhcmEgbG9zIHByw7N4aW1vcyAxOCBtZXNlcy4KCiMjIyBJbnRlcnByZXRhY2nDs24gZGVsIHByb27Ds3N0aWNvCgpgYGB7cn0KbWF4X2V4Y2hhbmdlX3JhdGUKYGBgCgpTZWfDum4gbnVlc3RyYSBwcmV2aXNpw7NuLCBlbCB0aXBvIGRlIGNhbWJpbyBtw6F4aW1vIHNlIGFjZXJjYXLDoSBhIGxvcyAyMi42NSBkw7NsYXJlcywgeSBlc3RvIHBvZHLDrWEgc3VjZWRlciBlbiBhYnJpbCBkZWwgMjAyMi4gCgojIyBJbmZsYWNpw7NuIAoKIyMjIEdyw6FmaWNvIGRlbCBwcm9uw7NzdGljbyAoSW50ZXJ2YWxvIGRlbCA5NSUgZGUgY29uZmlhbnphKQoKYGBge3J9CmluZmxhY2lvbi5teF9mb3JlY2FzdCA8LSBmb3JlY2FzdChtb2RlbDQsIGg9MTkpCiMgSSBzdG9yZWQgdGhlIGluZm9ybWF0aW9uIG9mIHRoZSBmb3JlY2FzdCBpbiBmb3JlY2FzdF9haXIKCiMgSSBwbG90IHRoZSBmb3JlY2FzdAphdXRvcGxvdChpbmZsYWNpb24ubXhfZm9yZWNhc3QpCmBgYAoKQ29tbyBwb2RlbW9zIHZlciwgZW4gZ3LDoWZpY28gc2UgYXJyb2phIGVsIHByb27Ds3N0aWNvIGVuIHZpb2xldGEgcGFyYSBlbCBJUEMgZW4gbG9zIHByw7N4aW1vcyAxOCBtZXNlcywgZWwgaW50ZXJ2YWxvIGRlIGNvbmZpYW56YSBkZWwgODAlIHkgZWwgaW50ZXJ2YWxvIGRlIGNvbmZpYW56YSBkZWwgOTUlIGRlbCB0aXBvIGRlbCBtaXNtbyDDrW5kaWNlLiBFbCBpbnRlcnZhbG8gZGUgY29uZmlhbnphIGRlbCA5NSUgZXN0w6EgZW4gdmlvbGV0YSBjbGFyby4gUG9kZW1vcyB2ZXIgcXVlIGVsIGVycm9yIGRlIHByb27Ds3N0aWNvIHB1ZWRlIHNlciBncmFuZGUgeWEgcXVlIGVsIGludGVydmFsbyBkZSBjb25maWFuemEgZGVsIDk1JSBkZWwgcHJvbsOzc3RpY28gcGFyYSBmaW5lcyBkZSAyMDIyIGVzdMOhIGVudHJlIDEzMCB5IDE1MC4KCiMjIyBWYWxvcmVzIGRlbCBwcm9uw7NzdGljbwoKYGBge3J9CnRhaWwoaW5mbGFjaW9uLm14X2ZvcmVjYXN0JG1lYW4sMTkpCm1heF9pbmZsYWNpb24ubXggPSBtYXgoaW5mbGFjaW9uLm14X2ZvcmVjYXN0JG1lYW4pCmBgYAoKRW4gZXN0ZSBhcGFydGFkbyBwb2RlbW9zIHZlciBsYSBmbHVjdHVhY2nDs24gbWVzIHRyYXMgbWVzIHByb25vc3RpY2FkYSBkZWwgSVBDLiAKCiMjIyBJbnRlcnByZXRhY2nDs24gZGVsIHByb27Ds3N0aWNvCgpgYGB7cn0KbWF4X2luZmxhY2lvbi5teApgYGAKCkRlIGFjdWVyZG8gY29uIG51ZXN0cm8gbW9kZWxvLCBlbCBJUEMgZW4gdW4gbGFwc28gZnV0dXJvIGRlIDE4IG1lc2VzIHB1ZWRlIGFsY2FuemFyIHVuIG3DoXhpbW8gZGUgMTM3LjM2IHB1bnRvcy4gU2luIGVtYmFyZ28sIGVzIGltcG9ydGFudGUgcmVzYWx0YXIsIHF1ZSBlc3RlIG1vZGVsbyBubyB0aWVuZSBjb250ZW1wbGFkbyBsYXMgZGl2ZXJzYXMgdmFyaWFibGVzIG1hY3JvZWNvbm9taWNhcyBxdWUgZXN0YSBwYW5kZW1pYSBoYSBvcmlnaW5hZG8uIEVzIGRlY2lyLCB0b2RvIG51ZXN0cm8gYW7DoWxpc2lzIGhhIHNpZG8gZGVzYXJyb2xsYWRvIGNvbiBzZXJpZXMgZGUgdGllbXBvIGhpc3TDs3JpY2FzOyBwZXJvIG51bmNhIGVuIGxhIGhpc3RvcmlhIEVFLlVVIGhhYsOtYSBpbXByZXNvIHRhbnRvcyBkw7NsYXJlcyBlbiB0YW4gcG9jbyB0aWVtcG8sIHkgYXBlbmFzIHNlcmVtb3MgdGVzdGlnb3MgZGUgbGFzIGNvbnNlY3VlbmNpYXMgcXVlIGVzdG8gdHJhZXLDoSBlbiB0w6lybWlub3MgZGUgaW5mbGFjacOzbiB5IHBvbMOtdGljYSBtb25ldGFyaWEuCgoKIyBBbsOhbGlzaXMgZGUgcmVzdWx0YWRvLCBjb25jbHVzacOzbiB5IHJlY29tZW5kYWNpw7NuIGZpbmFsCgojIyBBbsOhbGlzaXMgZGUgcmVzdWx0YWRvcwoKVHJhcyBoYWJlciBlbXBsZWFkbyBlbCBtb2RlbG8gZWNvbm9tw6l0cmljbyBBUklNQS1TQVJJTUEgcGFyYSBsYSBwcm95ZWNjacOzbiB0YW50byBkZWwgdGlwbyBkZSBjYW1iaW8gZGVsIHBhciBVU0QvTVhOLCBjb21vIGRlbCDDjW5kaWNlIGRlIFByZWNpb3MgYWwgQ29uc3VtaWRvciAoSVBDKTsgcG9kZW1vcyByZXNhbHRhciBsb3Mgc2lndWllbnRlcyByZXN1bHRhZG9zOgoKYGBge3J9CnRhaWwoZXhyYXRlX2ZvcmVjYXN0JG1lYW4sMTgpCm1heF9leGNoYW5nZV9yYXRlID0gbWF4KGV4cmF0ZV9mb3JlY2FzdCRtZWFuKQp0YWlsKGluZmxhY2lvbi5teF9mb3JlY2FzdCRtZWFuLDE5KQptYXhfaW5mbGFjaW9uLm14ID0gbWF4KGluZmxhY2lvbi5teF9mb3JlY2FzdCRtZWFuKQpgYGAKCkVuIGxhIHBhcnRlIHN1cGVyaW9yLCBvYnNlcnZhbW9zIGVsIHByb27Ds3N0aWNvIHBhcmEgbG9zIHByw7N4aW1vcyAxOCBtZXNlcyBkZWwgdGlwbyBkZSBjYW1iaW8gVVNEL01YTiwgeSBlbiBsYSBwYXJ0ZSBzdXBlcmlvciBvYnNlcnZhbW9zIGxhIHByb3llY2Npw7NuIGRlbCBJUEMgZGUgaWd1YWwgZm9ybWEgcGFyYSBsb3MgcHLDs3hpbW9zIDE4IG1lc2VzLgoKCiMjIENvbmNsdXNpw7NuIHkgcmVjb21lbmRhY2nDs24gZmluYWwKClNpbiBkdWRhIGFsZ3VuYSwgY29tbyBiaWVuIG1lbmNpb25hYmEgYW50ZXJpb3JtZW50ZSwgZWwgbW9kZWxvIG5vIGNvbnRlbXBsYSBtdWNoYXMgdmFyaWFibGVzIGV4dHJhb3JkaW5hcmlhcyBxdWUgZGUgbW9tZW50byBlc3TDoSBwcmVzZW50YW5kbyBsYSBlY29ub23DrWEgYSBuaXZlbCBnbG9iYWwuIExhcyBzZWN1ZWxhcyBlY29uw7NtaWNhcyBxdWUgaGEgb3JpZ2luYWRvIGxhIHBhbmRlbWlhLCBhw7puIGVzdMOhbiBwb3IgdmVyc2UuIFNpbiBlbWJhcmdvLCBwb3IgZmluZXMgYWNhZMOpbWljb3MgeSBjb24gYmFzZSBlbiBsYSByZXNvbHVjacOzbiBkZSBlc3RlIGVqZXJjaWNpbywgQWxpY2lhIGRlYmVyw61hIHRvbWFyIGxhIGFsdGVybmF0aXZhIGRlIGludmVyc2nDs24gbsO6bWVybyAyLiBPIHNlYSwgY2FtYmlhciBzdSBkaW5lcm8gYSBkw7NsYXJlcyB5IGVudmlhcmxvIGEgdW5hIGN1ZW50YSBlbiBkw7NsYXJlcyBlbiBFc3RhZG9zIFVuaWRvcyBhIHVuYSB0YXNhIGFudWFsIGRlbCA2JSBkZSBhcXXDrSBhIGRpY2llbWJyZSBkZSAyMDIyLgoKTGEgcmF6w7NuIGVzIHBvciBkaXZlcnNvcyBmYWN0b3JlcywgCgoxLiBFbCBVU0QgZXMgbGEgZGl2aXNhIGNvbiBtYXlvciBmdWVyemEgZW4gbGEgZWNvbm9tw61hIGdsb2JhbCwgeSBhdW5xdWUgZGUgbW9tZW50byBsYSBGRUQgZXN0w6kgaW1wcmltaWVuZG8gdGFudG9zIGTDs2xhcmVzLCBFRS5VVSBlcyBlbCBiYW5jbyBtdW5kaWFsIHkgbWFudGVuZXIgbnVlc3RyYSBpbnZlcnNpw7NuIGVuIFVTRCBzaWVtcHJlIHNlcsOhIG1lam9yIHF1ZSBlbiBNWE4uCgoyLiBTaSBiaWVuLCBlbCBJUHlDIGVzdMOhIGVuIGNvbnN0YW50ZSBkZXNhcnJvbGxvLCBubyBwb2RlbW9zIG9sdmlkYXIgcXVlIGVsIG1lcmNhZG8gbWV4aWNhbm8gYcO6biBlcyBtdXkgcGVxdWXDsW8geSBhdW5xdWUgaGF5IGdyYW5kZXMgZW1wcmVzYXMgZW5saXN0YWRhcywgaW52ZXJ0aXIgZW4gdW4gZm9uZG8gaW5kZXhhZG8gYWwgUyZQNTAwIHNpZW1wcmUgbm9zIGFycm9qYXLDoSBtZWpvcmVzIHJlbmRpbWllbnRvcy4KCjMuIExhIGluZmxhY2nDs24gYSBwYXJ0ZSBkZSBzZWd1aXIgY3JlY2llbmRvLCBzZSB2aW8gcXVlIGV4aXN0ZSBsYSBwb3NpYmlsaWRhZCBxdWUgcGFyYSBlbCBwcsOzeGltbyBhw7FvIGF1bWVudMOpIGVuIHVuIDcuMyUuIEVzIGRlY2lyLCBxdWUgc2kgQWxpY2lhIG5vIGVtcGxlYXJhIG5pbmd1bmEgaW52ZXJzacOzbiBzdSBkaW5lcm8gcGVyZGVyw61hIHZhbG9yIGRlIG1hbmVyYSBzaWduaWZpY2F0aXZhLiAKCkVuIHJlc3VtZW4sIHJlY29taWVuZG8gYSBBbGljaWEgY2FtYmlhciBzdSBkaW5lcm8gYSBkw7NsYXJlcyB5IGVudmlhcmxvIGEgdW5hIGN1ZW50YSBlbiBkw7NsYXJlcyBlbiBFc3RhZG9zIFVuaWRvcyBhIHVuYSB0YXNhIGFudWFsIGRlbCA2JSBkZSBhcXXDrSBhIGRpY2llbWJyZSBkZSAyMDIyLiBDb21vIHB1ZGltb3MgZGV0ZXJtaW5hciwgc2UgZXNwZXJhIHF1ZSBlbCBkw7NsYXIgc2UgYXByZWNpZSBlbiB1biAxNC45MiUgbcOhcyBvIG1lbm9zIHBhcmEgZWwgcHLDs3hpbW8gYcOxbyB5IHNpIGxlIGHDsWFkw61tb3MgZWwgNiUgZGVsIGZvbmRvIGRlIGludmVyc2nDs24sIG1hbnRlbmRyw6EgeSBhcnJvamFyw6EgbWVqb3JlcyByZW5kaW1pZW50b3MgcGFyYSBBbGljaWEuIFBvciBvdHJhIHBhcnRlLCBpbnZlcnRpciBlbiBlbCBtZXJjYWRvIG1leGljYW5vLCBhIHBhcnRlIGRlIGltcGxpY2FyIG1heW9yIHJpZXNnbywgc2UgZXNwZXJhIHF1ZSBsYSBpbmZsYWNpw7NuIGF1bWVudGUgZW4gdW4gNy4zJSwgZXMgZGVjaXIsIGRlYmVyw61hIGRlIGVtcGxlYXIgdW4gcG9ydGFmb2xpbyBkZSBpbnZlcmlzacOzbiBxdWUgcGFndcOpIG3DoXMgZGVsIDclIHBhcmEgcXVlIG3DrW5pbW8gbm8gcGllcmRhIHZhbG9yIHN1IGRpbmVyby4KCgoKCiNCaWJsaW9ncmFmw61hCsK3IEFuZHLDqXMgU2V2aWxsYSBBcmlhcygwMSBkZSBub3ZpZW1icmUsIDIwMTUpLkluZmxhY2nDs24uIEVjb25vbWlwZWRpYS5jb20KwrcgSm9zw6kgTHVpcyBDYWJhbGxlcm8uICgyMDE4KS4gwr9RdcOpIGVzIHkgY8OzbW8gc2UgbWlkZSBsYSBpbmZsYWNpw7NuIGVuIE3DqXhpY28/LiAwOC8wNi8yMDIxLCBkZSBFbCBFY29ub21pc3RhIFNpdGlvIHdlYjogaHR0cHM6Ly93d3cuZWxlY29ub21pc3RhLmNvbS5teC9lY29ub21pYS9RdWUtZXMteS1jb21vLXNlLW1pZGUtbGEtaW5mbGFjaW9uLWVuLU1leGljby0yMDE4MDExNC0wMDAyLmh0bWwgCsK3IEFsYmVydG8gRG9yYW50ZXMuICgyMDIxKS4gV29ya3Nob3AgMiwgVGltZSBTZXJpZXMuIDA4LzA2LzIwMjEsIGRlIElURVNNIFNpdGlvIHdlYjogaHR0cHM6Ly9ycHVicy5jb20vY2RvcmFudGUvZnoyMDIwX3cyIArCtyBBbGJlcnRvIERvcmFudGVzLiAoMjAyMSkuIFdvcmtzaG9wIDMsIFRpbWUgU2VyaWVzLiAwOC8wNi8yMDIxLCBkZSBJVEVTTSBTaXRpbyB3ZWI6IGh0dHBzOi8vcnB1YnMuY29tL2Nkb3JhbnRlL2Z6MjAyMF93MyAKwrcgQWxiZXJ0byBEb3JhbnRlcy4gKDIwMjEpLiBXb3Jrc2hvcCA0LCBUaW1lIFNlcmllcy4gMDgvMDYvMjAyMSwgZGUgSVRFU00gU2l0aW8gd2ViOiBodHRwczovL3JwdWJzLmNvbS9jZG9yYW50ZS9mejIwMjBfdzQgCgoKCg==