Este material tem como objetivo contribuir para o entendimento sobre o processo de estimação de modelos AR(p), MA(q) e ARMA(p,q). Para tanto, vamos mostrar como escrever uma função de verossimilhança geral para uma série temporal (aqui, os retornos) e alterá-la para cada tipo de modelo (AR, MA e ARMA).
INTRODUÇÃO
Assim como proposto por Box, Jenkins, and Reinsel (1994), o processo de modelagem de séries temporais univariadas por meio de modelos AR(p), MA(q) e ARMA(p,q) compreende os seguintes passos:
- Identificar as ordens \(p\) e \(q\) do modelo
- Estimar parâmetros
- Verificar se os resíduos estimados se comportam como um ruído branco. Se sim, passa-se ao próximo passo. Caso contrário, retorna-se ao primeiro passo.
- Fazer previsões
Como vimos no estudo dos modelos autorregressivos de médias móveis (ARMA), nem sempre é fácil identificar as ordens do modelo apenas usando as funções de autocorrelação (FAC) e autocorrelação parcial (FACP). Em função disso, precisamos também fazer uso de algum critério de informação (por exemplo, AIC ou BIC) que nos ajude com a correta decisão das ordens \(p\) e \(q\) (como mostramos para o o modelo ARMA neste link).
A escolha incorreta das defasagens pode ocasionar em resíduos indesejados (que não se comportam como um ruído branco). Lembre-se que no momento de derivação das propriedades dos modelos AR(p), MA(q) e ARMA(p,q) nós sempre tratamos \(a_t\) como um ruído branco com média \(0\), variância \(\sigma_{a}^{2}\), \(E\left[a_t-E(a)\right]\left[a_{t-l}-E(a)\right]=E[a_{t}a_{t-l}]=0\) e independente e identicamente distribuído (iid).
Neste documento, vamos mostrar como escrever a função de verossimilhança bem como seu logaritmo para cada modelo e entender quais testes devem ser aplicados para verificar os resultados obtidos.
IDENTIFICAR AS ORDENS \(p\) e \(q\) DO MODELO
Já abordamos anteriormente como fazer uso das funções de autocorrelação e autocorrelação parcial bem como dos critérios de informação. Você pode verificar nestes links (AR, MA e ARMA).
ESTIMAÇÃO
Nesta seção vamos mostrar como estimar os modelos AR, MA e ARMA usando-se o método de máxima verossimilhança. Optamos pelo método de máxima verossimilhança condicional que é assintoticamente equivalente ao da máxima verossimilhança exata. A vantagem do méotodo de máxima verossimilhança condicional é a facilidade de especificar e, consequentemente, estimar a função de verossimilhança. Porém, em caso de pequenas amostras o método não é tão eficiente quanto o método exato.
Vamos adotar a estratégia de derivar uma função de verossimilhança geral para modelos univariados estacionários. Após isso, podemos alterar tal função para considerar cada modelo com suas características.
Em séries temporais as observações são dependentes. Logo, teremos uma função de probabilidade conjunta que dependerá da função de probabilidade condicional e da função de probabilidade marginal.
Assim, para um ativo financeiro, assuma que você tem dois retornos consecutivos \(r_{1}\) e \(r_{2}\). Neste caso temos que:
\[
f(r_{2},r_{1}) = f(r_{2}|r_{1})f(r_{1})
\] Para três retornos, \(r_{1}\), \(r_{2}\) e \(r_{3}\), a expressão se torna:
\[
f(r_{3},r_{2},r_{1}) = f(r_{3}|r_{2},r_{1})f(r_{2},r_{1})
\]
\[
f(r_{3},r_{2},r_{1}) = f(r_{3}|r_{2},r_{1})f(r_{2}|r_{1})f(r_{1})
\] Generalizando para uma série temporal de \(T\) retornos, teremos;
\[
f(r_{t},r_{t-1},...,r_{2},r_{1}) = f(r_{t}|r_{t-1},...r_{1}) f(r_{t-1},...,r_{1})
\] \[
f(r_{t},r_{t-1},...,r_{2},r_{1}) = f(r_{t}|r_{t-1},...r_{1})f(r_{t-1}|r_{t-2},...,r_{1})f(r_{t-2},...,r_{1})
\] \[
f(r_{t},r_{t-1},...,r_{2},r_{1}) = f(r_{t}|r_{t-1},...r_{1})f(r_{t-1}|r_{t-2},...,r_{1})f(r_{t-2}|r_{t-3},...,r_{1}) f(r_{t-3},...,r_{1})
\] \[
f(r_{t},r_{t-1},...,r_{2},r_{1}) = \left[\prod_{t=2}^{T}{f(r_{t}|r_{t-1},...r_{1})}\right]f(r_{1})
\]
Se \(r_{t}|r_{t-1},...r_{1}\) segue uma distribuição normal com média \(\mu\) e variância \(\sigma^{2}\) a função de verossimilhança condicional se torna, para \(R = \left\{r_{t}\right\}_{t=1}^{T}\):
\[
L(R|\boldsymbol{\theta}) = f(r_{t},r_{t-1},...,r_{1} | \boldsymbol{\theta}) = f(r_{1}|\boldsymbol{\theta}) \prod_{t=2}^{T}{ \frac{1}{\sqrt{2\pi\sigma^{2}}}exp\left\{\frac{-(r_{t}-\mu)^2}{2\sigma^{2}} \right\}}
\]
Se ignoramos \(f(r_{1})\), a função de verossimilhança condicional dos retornos sob hipótese de normalidade será:
\[
L(R|\boldsymbol{\theta}) = f(r_{t},r_{t-1},...,r_{1}|\boldsymbol{\theta}) = \prod_{t=2}^{T}{ \frac{1}{\sqrt{2\pi\sigma^{2}}}exp\left\{\frac{-(r_{t}-\mu)^2}{2\sigma^{2}} \right\}}
\]
Outras funções de distribuição de probabilidades (t-Student, log-Normal, Cauchy) podem ser usadas para lidar com os fatos estilizados discutidos neste material. A função de verossimilhança mudará para cada função de distribuição de probabilidades.
Suponha que temos um modelo AR(p) da seguinte forma:
\[
r_{t} = {\phi}_{0} + {\phi}_{1}r_{t-1} + {\phi}_{2}r_{t-2} + ... + {\phi}_{p}r_{t-p} + a_{t}
\] Logo, \(E[r_{t}|r_{t-1},...,r_{t-p}] = \phi_{0}+\phi_{1}r_{t-1}+...+\phi_{p}r_{t-p}\) e \(Var(r_{t}|r_{t-1},...,r_{t-p}) = \sigma_{a}^{2}\) que significa que dado os retornos passados de \(r_{t}\) o retorno corrente é centralizado em torno de \(\phi_{0}+\phi_{1}r_{t-1}+...+\phi_{p}r_{t-p}\) com desvio padrão igual a \(\sigma_{a}\).
Assim, para um modelo AR(p) temos que a função de verossimilhança condicional será:
\[
L(R|\boldsymbol{\theta}) = f(r_{t},r_{t-1},...,r_{1};\boldsymbol{\theta}) = \prod_{t=p+1}^{T}{ \frac{1}{\sqrt{2\pi\sigma_{a}^{2}}}exp\left\{\frac{-(r_{t}-\phi_{0}-\phi_{1}r_{t-1}-...-\phi_{p}r_{t-p})^2}{2\sigma_{a}^{2}} \right\}}
\] que no momento que observamos os valores de \(R = \left\{r_{t}\right\}_{t=1}^{T}\) temos como objetivo encontrar quais os parâmetros de \(\theta\) (neste caso, \(\phi_{0}\), \(\phi_{1}\), …, \(\phi_{p}\) e \(\sigma_{a}^{2}\)) que maximizam a função de verossimilhança ou seu logarítmo.
\[
\ln{L(\hat{\boldsymbol{\theta}}|R)} = \sum_{t=p+1}^{T}{\ln{f(r_{t},r_{t-1},...,r_{1};\boldsymbol{\theta})}}
\] \[
\ln{L(\hat{\boldsymbol{\theta}}|R)} = \sum_{t=p+1}^{T}{\left[ \ln{1} - \ln{(2\pi\sigma_{a}^{2})^{\frac{1}{2}}} - \frac{1}{2\sigma_{a}^{2}}(r_{t}-\phi_{0}-\phi_{1}r_{t-1}-...-\phi_{p}r_{t-p})^{2} \right]}
\] \[
\ln{L(\hat{\boldsymbol{\theta}}|R)} = \sum_{t=p+1}^{T}{\left[-\frac{1}{2}\ln{(2\pi\sigma_{a}^{2})} - \frac{1}{2\sigma_{a}^{2}}(r_{t}-\phi_{0}-\phi_{1}r_{t-1}-...-\phi_{p}r_{t-p})^{2} \right]}
\] \[
\ln{L(\hat{\boldsymbol{\theta}}|R)} = -\frac{(T-p)}{2}\ln{2\pi} -\frac{(T-p)}{2}\ln{\sigma_{a}^{2}} -\frac{1}{2\sigma_{a}^{2}}\sum_{t=p+1}^{T}{(r_{t}-\phi_{0}-\phi_{1}r_{t-1}-...-\phi_{p}r_{t-p})^{2}}
\] onde \(\hat{\boldsymbol{\theta}} = [\phi_{0},\phi_{1},...,\phi_{p},\sigma_{a}^{2}]\) contem os parâmetros do modelo AR(p).
Suponha que temos o seguinte modelo de médias móveis de primeira ordem:
\[
r_{t} = \mu + a_{t} + {\theta}_{1}a_{t-1}
\] onde \(a_{t}\) é um ruído branco com média \(0\), variância \(\sigma_{2}^{a}\), \(E[a_{t}a_{t-l}] = 0\) e independente e identicamente distribuído (iid). Supondo \(a_{0}=0\), para \(t=1\), temos:
\[
r_{1}=\mu + a_{1} + \theta_{1}a_{0} = \mu + a_{1}
\] Isso implica que:
\[
(R_{1}=r_1|a_0=0) \sim N\left(\mu,{\sigma}_{a}^{2}\right)
\]
em função das propriedades estatísticas de \(a_t\). Uma vez que \(r_1\) é observado, temos que \(a_{1} = r_{1} - \mu\) o que implica que:
\[
(R_{2}=r_{2}|R_{1}=r_{1},a_{0}=0) \sim N\left(\mu + \theta_{1}a_{1},{\sigma}_{a}^{2}\right)
\] e a partir que \(a_{1}\) é conhecido, podemos obter \(a_{2}\) por meio de \(a_{2}=r_{2}-\mu-\theta_{1}a_{1}\). Assim, podemos observar que dado que conhecemos \(a_{0}=0\), a sequência \(\left\{a_{t}\right\}_{t=1}^{T}\) pode ser calculada a partir de \(\left\{r_{t}\right\}_{t=1}^{T}\) iterando sobre:
\[
a_{t} = r_{t} - \mu -\theta_{1}a_{t-1}
\] para \(t = 1, 2, ..., T\), iniciando a partir de \(a_{0}=0\). A verossimilhança condicional da amostra completa pode ser calculada pelo produto das densidades individuais:
\[
L(R|\boldsymbol{\theta}) = f(r_{t},r_{t-1},...,r_{1},a_{0}=0|\boldsymbol{\theta}) = \prod_{t=2}^{T}{ \frac{1}{\sqrt{2\pi\sigma_{a}^{2}}}exp\left\{\frac{-a_{t}^2}{2\sigma_{a}^{2}} \right\}}
\] que no momento que observamos os valores de \(R = \left\{r_{t}\right\}_{t=1}^{T}\) temos como objetivo encontrar quais os parâmetros de \(\theta\) (neste caso, \(\mu\), \(\theta_{1}\) e \(\sigma_{a}^{2}\)) que maximizam a função de verossimilhança ou seu logarítmo.
\[
\ln{L(\hat{\boldsymbol{\theta}}|R)} = \sum_{t=1}^{T}{\ln{f(r_{t},r_{t-1},...,r_{1},a_{0}=0;\boldsymbol{\theta})}}
\] \[
\ln{L(\hat{\boldsymbol{\theta}}|R)} = \sum_{t=1}^{T}{\left[ \ln{1} - \ln{(2\pi\sigma_{a}^{2})^{\frac{1}{2}}} - \frac{a_{t}^{2}}{2\sigma_{a}^{2}} \right]}
\] \[
\ln{L(\hat{\boldsymbol{\theta}}|R)} = \sum_{t=1}^{T}{\left[-\frac{1}{2}\ln{(2\pi\sigma_{a}^{2})} - \frac{a_{t}^{2}}{2\sigma_{a}^{2}} \right]}
\] \[
\ln{L(\hat{\boldsymbol{\theta}}|R)} = -\frac{T}{2}\ln{2\pi} -\frac{T}{2}\ln{\sigma_{a}^{2}} - \sum_{t=1}^{T}{-\frac{a_{t}^{2}}{2\sigma_{a}^{2}}}
\] Esta é a verossimilhança condicional usada para estimar tanto modelos MA(1) e MA(q). Sendo que a única diferença entre eles é que enquanto assumimos no MA(1) que \(a_{0}=0\), no MA(q) é preciso assumir que os valores iniciais para todos os termos de erro são nulos, ou seja, \(a_{0}=a_{-1}=...=a_{q-1}=0\)
- VEROSSIMILHANÇA ARMA(p,q)
Assuma que observamos os valores iniciais para \(R = \left\{r_{t}\right\}_{t=1}^{T}\). Neste caso, inicia-se a estimação em \(t=p+1\) e fixa-se:
\[
a_{p} = a_{p-1} = ... = a_{p-1+1} = 0
\]
e a função de verossimilhança se torna:
\[
L(R|\boldsymbol{\theta}) = f(r_{t},r_{t-1},...,r_{1}|r_p,r_{p-1},...,r_1,a_{p} = a_{p-1} = ... = a_{p-1+1} = 0|\boldsymbol{\theta}) = \prod_{t=2}^{T}{ \frac{1}{\sqrt{2\pi\sigma_{a}^{2}}}exp\left\{\frac{-a_{t}^2}{2\sigma_{a}^{2}} \right\}}
\]
que no momento que observamos os valores de \(R = \left\{r_{t}\right\}_{t=1}^{T}\) temos como objetivo encontrar quais os parâmetros de \(\theta\) (neste caso, \(\mu\), \(\phi_1\), …, \(\phi_p\), \(\theta_{1}\), …., \(\theta_{p}\) e \(\sigma_{a}^{2}\)) que maximizam a função de verossimilhança ou seu logarítmo.
\[
\ln{L(\hat{\boldsymbol{\theta}}|R)} = \sum_{t=1}^{T}{\left[-\frac{1}{2}\ln{(2\pi\sigma_{a}^{2})} - \frac{a_{t}^{2}}{2\sigma_{a}^{2}} \right]}
\]
\[
\ln{L(\hat{\boldsymbol{\theta}}|R)} = -\frac{T-p}{2}\ln{2\pi} -\frac{T-p}{2}\ln{\sigma_{a}^{2}} - \sum_{t=p+1}^{T}{-\frac{a_{t}^{2}}{2\sigma_{a}^{2}}}
\]
É importante salientar que todas as funções de verossimilhanças mostradas assumem a hipótese de que a série temporal dos retornos segue uma distribuição Normal. Caso contrário, por exemplo uma t-Student, as funções devem ser escritas assumindo uma nova hipótese de distribuição.
DIAGNÓSTICO DOS RESÍDUOS
Uma hipótese nos modelos ARMA estacionários é que o termo de erro \(a_{t}\) é um ruído branco. Isso implica que \(a_{t}\) tem média \(0\), variância \(\sigma_{a}^{2}\), \(E[a_{t}a_{t-l}] = 0\) e indepente e identicamente distribuído (iid).
Desta forma, espera-se que os resíduos estimados pelo modelo se comportem como um ruído branco se o modelo está corretamente especificado.
Outra hipótese assumida na derivação da função de verossimilhança dos modelos AR(p), MA(q) e ARMA(p,q) é que a série temporal dos retornos segue uma distribuição Normal o que, por conseguinte, define que os resíduos também têm a mesma distribuição de probabilidade. Assim, devemos fazer um teste estatístico que confirme se os resíduos são normalmente distribuídos.
Resumidamente, temos o seguinte conjunto de testes sobre os resíduos:
- \(E[a] = 0\): o próprio processo de estimação dos parâmetros garante esta hipótese
- \(\sigma_{a}^{2}\): podemos usar a FAC dos resíduos ao quadrado para verificar se os resíduos são homocedásticos ou se apresentem heterocedasticidade condicional. O ideal é que nenhuma defasagem seja estatisticamente significante. Caso contrário, talvez seja preciso estimar a variância condicional para a série tem análise (aprenderemos isso com os modelos ARCH e GARCH)
- \(E[a_{t}a_{t-l}] = 0\): a FAC dos resíduos permite avaliar se os mesmos são autocorrelacionados. O ideal é que nenhuma defasagem seja estatisticamente significante.
- Resíduos seguem uma distribuição Normal: podemos fazer uso do teste Jarque-Bera que verifica se os momentos da série estimada são iguais aos da Normal. Esperamos não rejeitar a hipótese nula de normalidade dos resíduos.
EXEMPLO:
Vamos simular um modelo ARMA e fazer uso da abordagem proposta por Box, Jenkins, and Reinsel (1994) da seguinte forma:
- Identificar diversas ordens \(p\) e \(q\) por meio funções de autocorrelação (FAC) e autocorrelação parcial (FACP) para uma série temporal de interesse
- Estimar os modelos por meio do princípio da máxima verossimilhança usando pacotes do R;
- Escolher dentre os modelos estimados o que apresenta menor AIC ou BIC;
- Verificar se os resíduos do modelo se comportam como um ruído branco.
ARMA(1,1)
Suponha que temos o modelo ARMA(1,1) no seguinte formato:
\[
r_{t} = 10 + 0.4r_{t-1} + a_{t} + 0.3a_{t-1}
\] onde \(a_{t}\) é um ruído branco com média \(0\), variância \(\sigma_{a}^{2}\), \(E\left[ \left(a_t-\bar{a}\right)\left(a_{t-l}-\bar{a}\right)\right]=E[a_{t}a_{t-l}]=0\) e independente e identicamente distribuído (iid).
O gráfico abaixo apresenta a série temporal que representa tal modelo.

É possível observar que realmente há estacionariedade fraca dado que a série oscila em torno de uma média (\(10\)) e com uma variância constante.
Agora, imagine que temos a série temporal acima e que não sabemos que ela foi originada por um processo ARMA(1,1), mas gostaríamos de usar a abordagem proposta por Box, Jenkins, and Reinsel (1994) para estimar um modelo para a série. Para tanto, vamos seguir os passos propostos anteriormente.
- IDENTIFICAÇÃO DAS ORDENS \(p\) e \(q\):
É preciso avaliar as funções de autocorrelação e autocorrelação parcial para verificar as ordens que devemos especificar para o modelo. Lembre-se que vimos anteriormente que a FACP é ideal para definir a ordem \(p\) do AR enquanto a FAC deve ser usada para encontrar a ordem \(q\) do MA. Abaixo, os gráficos das duas funções.


Aparentemente parece que se trata de um modelo ARMA(2,2), pois para a FAC e FACP há significância até a defasagem 2 [^1]. Observe que, como esperado, o uso da FAC e FACP nos direcionaria a uma especificação que não é verdadeira, pois sabemos que a série temporal foi gerada por um modelo ARMA(1,1). Assim, como proposto no processo de estimação, vamos fazer uso de algum critério de informação que nos ajude na seleção da melhor especificação para a série que queremos estimar.
Uma abordagem útil é fazer todas as combinações possíveis de modelos ARMA para \(p=0\) até \(p=2\) e \(q=0\) até \(q=2\), como segue:
- ARMA(0,0)
- ARMA(1,0)
- ARMA(2,0)
- ARMA(0,1)
- ARMA(1,1)
- ARMA(2,1)
- ARMA(0,2)
- ARMA(1,2)
- ARMA(2,2)
e a partir disso estimar todos os modelos e escolher aquele com menor AIC e/ou BIC.
Uma vez que temos os modelos de interesse para avaliação do AIC ou BIC, vamos fazer a estimação usando o princípio da máxima verossimilhança. Desta forma, uma alternativa é escrever a função de verossimilhança no R e por processo de otimização buscar os parâmetros que maximizam o seu logaritmo. Como optamos na simulação dos dados que \(a_{t}\) seguisse uma distribuição Normal, em caso de criar uma função de verossimilhança no R, tal distribuição deveria ser usada.
Porém, aqui usamos a função arima
do pacote stats para estimar os modelos selecionados que usa como default a distribuição Normal para o termo de erro. Caso você tenha interesse em entender outras opções da função, faça help(arima)
no console do R para visualizar a documentação da função.
Como era de se esperar, o modelo ARMA(1,1) apresenta menor AIC e BIC. Apesar deste modelo não ter o maior valor do logaritmo da verossimilhança, ele é o melhor modelo dentre os demais. Lembre-se que no cálculo do AIC ou BIC há penalização para modelos com maior quantidade de parâmetros.
Uma vez selecionado o modelo, vamos verificar quais os parâmetros estimados e a significância estatística de cada. Observe que os parâmetros estimados estão bem próximos dos verdadeiros parâmetros populacionais que usamos para simular a série temporal.
Resultado Estimação modelo ARMA(1,1)
=============================================
Dependent variable:
---------------------------
arma11
---------------------------------------------
ar1 0.349***
(0.048)
ma1 0.318***
(0.047)
intercept 10.029***
(0.064)
---------------------------------------------
Observations 1,000
Log Likelihood -1,414.004
sigma2 0.990
Akaike Inf. Crit. 2,836.007
=============================================
Note: *p<0.1; **p<0.05; ***p<0.01
- DIAGNÓSTICO DO MODELO SELECIONADO:
Uma hipótese nos modelos ARMA estacionários é que o termo de erro \(a_{t}\) é um ruído branco. Isso implica que \(a_{t}\) tem média \(0\), variância \(\sigma_{a}^{2}\), \(E[a_{t}a_{t-l}] = 0\) e indepente e identicamente distribuído (iid) (aqui, supomos que era Normalmente distribuído). Desta forma, espera-se que os resíduos estimados pelo modelo se comportem como um ruído branco se o modelo está corretamente especificado.
Para a hipótese de não autocorrelação dos resíduos (\(E[a_{t}a_{t-l}] = 0\)), podemos usar a função de autocorrelação (FAC) dos resíduos, onde esperamos que nenhuma defasagem tenha significância estatística. Como mostra o gráfico abaixo, não existe autocorrelação nos resíduos do modelo escolhido, pois as defasagens \(l>0\) não são estatisticamente significantes.

Já a hipótese de homocedasticidade dos resíduos (\(\sigma_{a}^{2}\)), podemos usar o gráfico da função de autocorrelação serial (FAC) dos resíduos ao quadrado. Como mostra o gráfico abaixo, não há heterocedasticidade condicional, ou seja, os resíduos se comportam conforme a hipótese de homocedasticidade.

Outra hipótese assumida na derivação da função de verossimilhança dos modelos AR(p), MA(q) e ARMA(p,q) é que a série temporal dos retornos segue uma distribuição Normal o que, por conseguinte, define que os resíduos também têm a mesma distribuição de probabilidade. Uma alternativa para isso é o teste Jarque Bera.
Jarque Bera Test
data: modelo[[5]]$residuals
X-squared = 0.88234, df = 2, p-value = 0.6433
A hipótese nula do teste é que os dados são normalmente distribuídos contra a hipótese alternativa que os dados não são normalmente distribuídos. Sabemos que o p-valor é o nível de significância mínimo para se rejeitar a hipótese nula. Assim, queremos um p-valor alto (\(>0,05\)) o que não nos permite rejeitá-la. Observe que é exatamente isso que o resultado do nosso teste mostra e, assim, não podemos rejeitar a hipótese nula de normalidade nos dados.
REFERÊNCIAS
Box, George EP, Gwilym M Jenkins, and Gregory C Reinsel. 1994. Time Series Analysis Forecasting and Control. Englewood Cliffs Prentice Hall.
Campbell, John Y, Andrew Wen-Chuan Lo, and Archie Craig MacKinlay. 1997. The Econometrics of Financial Markets. Princeton (NJ) Princeton University Press.
Morettin, Pedro Alberto. 2008. Econometria Financeira Um Curso Em Séries Temporais Financeiras. Edgard Blucher.
Tsay, Ruey S. 2010. Analysis of Financial Time Series. John Wiley & Sons.
———. 2014. An Introduction to Analysis of Financial Data with R. John Wiley & Sons.
LS0tCnRpdGxlOiA8Y2VudGVyPiA8aDI+IDxiPiBFc3RpbWHDp8OjbyBkZSBNb2RlbG9zIEFSTUEgPC9iPiA8L2gyPiA8L2NlbnRlcj4gCmF1dGhvcjogPGNlbnRlcj4gSHVkc29uIENoYXZlcyBDb3N0YSA8L2NlbnRlcj4KZ3JhcGhpY3M6IHllcwpsaW5rY29sb3I6IGJsdWUKb3V0cHV0OiAKICBodG1sX25vdGVib29rOgogICAgdGhlbWU6IGNlcnVsZWFuCiAgICBmaWdfY2FwdGlvbjogeWVzCnJlZmVyZW5jZXM6Ci0gaWQ6IHRzYXkyMDE0aW50cm9kdWN0aW9uCiAgdGl0bGU6IEFuIGludHJvZHVjdGlvbiB0byBhbmFseXNpcyBvZiBmaW5hbmNpYWwgZGF0YSB3aXRoIFIKICBhdXRob3I6CiAgLSBmYW1pbHk6IFRzYXkKICAgIGdpdmVuOiBSdWV5IFMKICBwdWJsaXNoZXI6IEpvaG4gV2lsZXkgXCYgU29ucwogIHR5cGU6IGJvb2sKICBpc3N1ZWQ6CiAgICB5ZWFyOiAyMDE0Ci0gaWQ6IGNhbXBiZWxsMTk5N2Vjb25vbWV0cmljcwogIHRpdGxlOiBUaGUgZWNvbm9tZXRyaWNzIG9mIGZpbmFuY2lhbCBtYXJrZXRzCiAgYXV0aG9yOgogIC0gZmFtaWx5OiBDYW1wYmVsbAogICAgZ2l2ZW46IEpvaG4gWQogIC0gZmFtaWx5OiBMbwogICAgZ2l2ZW46IEFuZHJldyBXZW4tQ2h1YW4KICAtIGZhbWlseTogTWFjS2lubGF5CiAgICBnaXZlbjogQXJjaGllIENyYWlnCiAgcHVibGlzaGVyOiBQcmluY2V0b24gKE5KKSBQcmluY2V0b24gVW5pdmVyc2l0eSBQcmVzcwogIHR5cGU6IGJvb2sKICBpc3N1ZWQ6CiAgICB5ZWFyOiAxOTk3Ci0gaWQ6IG1vcmV0dGluMjAwOGVjb25vbWV0cmlhCiAgdGl0bGU6IEVjb25vbWV0cmlhIGZpbmFuY2VpcmEgdW0gY3Vyc28gZW0gc8OpcmllcyB0ZW1wb3JhaXMgZmluYW5jZWlyYXMKICBhdXRob3I6CiAgLSBmYW1pbHk6IE1vcmV0dGluCiAgICBnaXZlbjogUGVkcm8gQWxiZXJ0bwogIHB1Ymxpc2hlcjogRWRnYXJkIEJsdWNoZXIKICB0eXBlOiBib29rCiAgaXNzdWVkOgogICAgeWVhcjogMjAwOAotIGlkOiB0c2F5MjAxMGFuYWx5c2lzCiAgdGl0bGU6IEFuYWx5c2lzIG9mIGZpbmFuY2lhbCB0aW1lIHNlcmllcwogIGF1dGhvcjoKICAtIGZhbWlseTogVHNheQogICAgZ2l2ZW46IFJ1ZXkgUwogIHB1Ymxpc2hlcjogSm9obiBXaWxleSBcJiBTb25zCiAgdHlwZTogYm9vawogIGlzc3VlZDoKICAgIHllYXI6IDIwMTAKLSBpZDogYm94MTk5NHRpbWUKICB0aXRsZTogVGltZSBzZXJpZXMgYW5hbHlzaXMgZm9yZWNhc3RpbmcgYW5kIGNvbnRyb2wKICBhdXRob3I6CiAgLSBmYW1pbHk6IEJveAogICAgZ2l2ZW46IEdlb3JnZSBFUAogIC0gZmFtaWx5OiBKZW5raW5zCiAgICBnaXZlbjogR3dpbHltIE0KICAtIGZhbWlseTogUmVpbnNlbAogICAgZ2l2ZW46IEdyZWdvcnkgQwogIHB1Ymxpc2hlcjogRW5nbGV3b29kIENsaWZmcyBQcmVudGljZSBIYWxsCiAgdHlwZTogYm9vawogIGlzc3VlZDoKICAgIHllYXI6IDE5OTQKbm9jaXRlOiB8IAogIEB0c2F5MjAxNGludHJvZHVjdGlvbiwgQGNhbXBiZWxsMTk5N2Vjb25vbWV0cmljcywgQG1vcmV0dGluMjAwOGVjb25vbWV0cmlhLCBAdHNheTIwMTBhbmFseXNpcywgQGJveDE5OTR0aW1lCi0tLQoKRXN0ZSBtYXRlcmlhbCB0ZW0gY29tbyBvYmpldGl2byBjb250cmlidWlyIHBhcmEgbyBlbnRlbmRpbWVudG8gc29icmUgbyBwcm9jZXNzbyBkZSAqKmVzdGltYcOnw6NvIGRlIG1vZGVsb3MgQVIocCksIE1BKHEpIGUgQVJNQShwLHEpKiouIFBhcmEgdGFudG8sIHZhbW9zIG1vc3RyYXIgY29tbyBlc2NyZXZlciB1bWEgZnVuw6fDo28gZGUgdmVyb3NzaW1pbGhhbsOnYSBnZXJhbCBwYXJhIHVtYSBzw6lyaWUgdGVtcG9yYWwgKGFxdWksIG9zIHJldG9ybm9zKSBlIGFsdGVyw6EtbGEgcGFyYSBjYWRhIHRpcG8gZGUgbW9kZWxvIChBUiwgTUEgZSBBUk1BKS4KCmBgYHtyLCBlY2hvPUZBTFNFfQojIFBhY290ZXMgbmVjZXNzYXJpb3MKc3VwcHJlc3NNZXNzYWdlcyhyZXF1aXJlKHpvbykpCnN1cHByZXNzTWVzc2FnZXMocmVxdWlyZShxdWFudG1vZCkpCnN1cHByZXNzTWVzc2FnZXMocmVxdWlyZShEVCkpCnN1cHByZXNzTWVzc2FnZXMocmVxdWlyZShkcGx5cikpCnN1cHByZXNzTWVzc2FnZXMocmVxdWlyZShtYWdyaXR0cikpCnN1cHByZXNzTWVzc2FnZXMocmVxdWlyZShoaWdoY2hhcnRlcikpCnN1cHByZXNzTWVzc2FnZXMocmVxdWlyZShQZXJmb3JtYW5jZUFuYWx5dGljcykpIApzdXBwcmVzc01lc3NhZ2VzKHJlcXVpcmUoaHRtbHRvb2xzKSkKYGBgCgojIyMjIyAqKklOVFJPRFXDh8ODTyoqCgpBc3NpbSBjb21vIHByb3Bvc3RvIHBvciBAYm94MTk5NHRpbWUsIG8gcHJvY2Vzc28gZGUgbW9kZWxhZ2VtIGRlIHPDqXJpZXMgdGVtcG9yYWlzIHVuaXZhcmlhZGFzIHBvciBtZWlvIGRlIG1vZGVsb3MgQVIocCksIE1BKHEpIGUgQVJNQShwLHEpIGNvbXByZWVuZGUgb3Mgc2VndWludGVzIHBhc3NvczoKCjEuIElkZW50aWZpY2FyIGFzIG9yZGVucyAkcCQgZSAkcSQgZG8gbW9kZWxvCjIuIEVzdGltYXIgcGFyw6JtZXRyb3MKMy4gVmVyaWZpY2FyIHNlIG9zIHJlc8OtZHVvcyBlc3RpbWFkb3Mgc2UgY29tcG9ydGFtIGNvbW8gdW0gcnXDrWRvIGJyYW5jby4gU2Ugc2ltLCBwYXNzYS1zZSBhbyBwcsOzeGltbyBwYXNzby4gQ2FzbyBjb250csOhcmlvLCByZXRvcm5hLXNlIGFvIHByaW1laXJvIHBhc3NvLgo0LiBGYXplciBwcmV2aXPDtWVzCgpDb21vIHZpbW9zIG5vIGVzdHVkbyBkb3MgbW9kZWxvcyBhdXRvcnJlZ3Jlc3Npdm9zIGRlIG3DqWRpYXMgbcOzdmVpcyAoQVJNQSksIG5lbSBzZW1wcmUgw6kgZsOhY2lsIGlkZW50aWZpY2FyIGFzIG9yZGVucyBkbyBtb2RlbG8gYXBlbmFzIHVzYW5kbyBhcyBmdW7Dp8O1ZXMgZGUgYXV0b2NvcnJlbGHDp8OjbyAoRkFDKSBlIGF1dG9jb3JyZWxhw6fDo28gcGFyY2lhbCAoRkFDUCkuIEVtIGZ1bsOnw6NvIGRpc3NvLCBwcmVjaXNhbW9zIHRhbWLDqW0gZmF6ZXIgdXNvIGRlIGFsZ3VtICoqY3JpdMOpcmlvIGRlIGluZm9ybWHDp8OjbyAocG9yIGV4ZW1wbG8sIEFJQyBvdSBCSUMpKiogcXVlIG5vcyBhanVkZSBjb20gYSBjb3JyZXRhIGRlY2lzw6NvIGRhcyBvcmRlbnMgJHAkIGUgJHEkIChjb21vIG1vc3RyYW1vcyBwYXJhIG8gbyBtb2RlbG8gQVJNQSBuZXN0ZSBbbGlua10oaHR0cHM6Ly9ycHVicy5jb20vaHVkc29uY2hhdnMvbW9kZWxvYXJtYSkpLiAKCkEgZXNjb2xoYSBpbmNvcnJldGEgZGFzIGRlZmFzYWdlbnMgcG9kZSBvY2FzaW9uYXIgZW0gcmVzw61kdW9zIGluZGVzZWphZG9zIChxdWUgbsOjbyBzZSBjb21wb3J0YW0gY29tbyB1bSBydcOtZG8gYnJhbmNvKS4gTGVtYnJlLXNlIHF1ZSBubyBtb21lbnRvIGRlIGRlcml2YcOnw6NvIGRhcyBwcm9wcmllZGFkZXMgZG9zIG1vZGVsb3MgQVIocCksIE1BKHEpIGUgQVJNQShwLHEpIG7Ds3Mgc2VtcHJlIHRyYXRhbW9zICRhX3QkIGNvbW8gdW0gcnXDrWRvIGJyYW5jbyBjb20gbcOpZGlhICQwJCwgdmFyacOibmNpYSAkXHNpZ21hX3thfV57Mn0kLCAkRVxsZWZ0W2FfdC1FKGEpXHJpZ2h0XVxsZWZ0W2Ffe3QtbH0tRShhKVxyaWdodF09RVthX3t0fWFfe3QtbH1dPTAkIGUgaW5kZXBlbmRlbnRlIGUgaWRlbnRpY2FtZW50ZSBkaXN0cmlidcOtZG8gKGlpZCkuIAoKTmVzdGUgZG9jdW1lbnRvLCB2YW1vcyBtb3N0cmFyIGNvbW8gZXNjcmV2ZXIgYSBmdW7Dp8OjbyBkZSB2ZXJvc3NpbWlsaGFuw6dhIGJlbSBjb21vIHNldSBsb2dhcml0bW8gcGFyYSBjYWRhIG1vZGVsbyBlIGVudGVuZGVyIHF1YWlzIHRlc3RlcyBkZXZlbSBzZXIgYXBsaWNhZG9zIHBhcmEgdmVyaWZpY2FyIG9zIHJlc3VsdGFkb3Mgb2J0aWRvcy4gCgojIyMjIyAqKklERU5USUZJQ0FSIEFTIE9SREVOUyAkcCQgZSAkcSQgRE8gTU9ERUxPKioKCkrDoSBhYm9yZGFtb3MgYW50ZXJpb3JtZW50ZSBjb21vIGZhemVyIHVzbyBkYXMgZnVuw6fDtWVzIGRlIGF1dG9jb3JyZWxhw6fDo28gZSBhdXRvY29ycmVsYcOnw6NvIHBhcmNpYWwgYmVtIGNvbW8gZG9zIGNyaXTDqXJpb3MgZGUgaW5mb3JtYcOnw6NvLiBWb2PDqiBwb2RlIHZlcmlmaWNhciBuZXN0ZXMgbGlua3MgKFtBUl0oaHR0cHM6Ly9ycHVicy5jb20vaHVkc29uY2hhdnMvbW9kZWxvYXIpLCBbTUFdKGh0dHBzOi8vcnB1YnMuY29tL2h1ZHNvbmNoYXZzL21vZGVsb21hKSBlIFtBUk1BXShodHRwczovL3JwdWJzLmNvbS9odWRzb25jaGF2cy9tb2RlbG9hcm1hKSkuCgojIyMjIyAqKkVTVElNQcOHw4NPKioKCk5lc3RhIHNlw6fDo28gdmFtb3MgbW9zdHJhciBjb21vIGVzdGltYXIgb3MgbW9kZWxvcyBBUiwgTUEgZSBBUk1BIHVzYW5kby1zZSBvIG3DqXRvZG8gZGUgbcOheGltYSB2ZXJvc3NpbWlsaGFuw6dhLiBPcHRhbW9zIHBlbG8gbcOpdG9kbyBkZSAqKm3DoXhpbWEgdmVyb3NzaW1pbGhhbsOnYSBjb25kaWNpb25hbCoqIHF1ZSDDqSBhc3NpbnRvdGljYW1lbnRlIGVxdWl2YWxlbnRlIGFvIGRhIG3DoXhpbWEgdmVyb3NzaW1pbGhhbsOnYSBleGF0YS4gQSB2YW50YWdlbSBkbyBtw6lvdG9kbyBkZSBtw6F4aW1hIHZlcm9zc2ltaWxoYW7Dp2EgY29uZGljaW9uYWwgw6kgYSBmYWNpbGlkYWRlIGRlIGVzcGVjaWZpY2FyIGUsIGNvbnNlcXVlbnRlbWVudGUsIGVzdGltYXIgYSBmdW7Dp8OjbyBkZSB2ZXJvc3NpbWlsaGFuw6dhLiBQb3LDqW0sIGVtIGNhc28gZGUgcGVxdWVuYXMgYW1vc3RyYXMgbyBtw6l0b2RvIG7Do28gw6kgdMOjbyBlZmljaWVudGUgcXVhbnRvIG8gbcOpdG9kbyBleGF0by4gCgpWYW1vcyBhZG90YXIgYSBlc3RyYXTDqWdpYSBkZSBkZXJpdmFyIHVtYSBmdW7Dp8OjbyBkZSB2ZXJvc3NpbWlsaGFuw6dhIGdlcmFsIHBhcmEgbW9kZWxvcyB1bml2YXJpYWRvcyBlc3RhY2lvbsOhcmlvcy4gQXDDs3MgaXNzbywgcG9kZW1vcyBhbHRlcmFyIHRhbCBmdW7Dp8OjbyBwYXJhIGNvbnNpZGVyYXIgY2FkYSBtb2RlbG8gY29tIHN1YXMgY2FyYWN0ZXLDrXN0aWNhcy4gCgoqICoqVkVST1NTSU1JTEhBTsOHQSBHRVJBTCoqCgpFbSBzw6lyaWVzIHRlbXBvcmFpcyBhcyBvYnNlcnZhw6fDtWVzIHPDo28gZGVwZW5kZW50ZXMuIExvZ28sIHRlcmVtb3MgdW1hIGZ1bsOnw6NvIGRlIHByb2JhYmlsaWRhZGUgY29uanVudGEgcXVlIGRlcGVuZGVyw6EgZGEgZnVuw6fDo28gZGUgcHJvYmFiaWxpZGFkZSBjb25kaWNpb25hbCBlIGRhIGZ1bsOnw6NvIGRlIHByb2JhYmlsaWRhZGUgbWFyZ2luYWwuIAoKQXNzaW0sIHBhcmEgdW0gYXRpdm8gZmluYW5jZWlybywgYXNzdW1hIHF1ZSB2b2PDqiB0ZW0gZG9pcyByZXRvcm5vcyBjb25zZWN1dGl2b3MgJHJfezF9JCBlICRyX3syfSQuIE5lc3RlIGNhc28gdGVtb3MgcXVlOgoKJCQKZihyX3syfSxyX3sxfSkgPSBmKHJfezJ9fHJfezF9KWYocl97MX0pCiQkClBhcmEgdHLDqnMgcmV0b3Jub3MsICRyX3sxfSQsICRyX3syfSQgZSAkcl97M30kLCBhIGV4cHJlc3PDo28gc2UgdG9ybmE6CgokJApmKHJfezN9LHJfezJ9LHJfezF9KSA9IGYocl97M318cl97Mn0scl97MX0pZihyX3syfSxyX3sxfSkKJCQKCiQkCmYocl97M30scl97Mn0scl97MX0pID0gZihyX3szfXxyX3syfSxyX3sxfSlmKHJfezJ9fHJfezF9KWYocl97MX0pCiQkCkdlbmVyYWxpemFuZG8gcGFyYSB1bWEgc8OpcmllIHRlbXBvcmFsIGRlICRUJCByZXRvcm5vcywgdGVyZW1vczsKCiQkCmYocl97dH0scl97dC0xfSwuLi4scl97Mn0scl97MX0pID0gZihyX3t0fXxyX3t0LTF9LC4uLnJfezF9KSBmKHJfe3QtMX0sLi4uLHJfezF9KQokJAokJApmKHJfe3R9LHJfe3QtMX0sLi4uLHJfezJ9LHJfezF9KSA9IGYocl97dH18cl97dC0xfSwuLi5yX3sxfSlmKHJfe3QtMX18cl97dC0yfSwuLi4scl97MX0pZihyX3t0LTJ9LC4uLixyX3sxfSkKJCQKJCQKZihyX3t0fSxyX3t0LTF9LC4uLixyX3syfSxyX3sxfSkgPSBmKHJfe3R9fHJfe3QtMX0sLi4ucl97MX0pZihyX3t0LTF9fHJfe3QtMn0sLi4uLHJfezF9KWYocl97dC0yfXxyX3t0LTN9LC4uLixyX3sxfSkgZihyX3t0LTN9LC4uLixyX3sxfSkKJCQKJCQKZihyX3t0fSxyX3t0LTF9LC4uLixyX3syfSxyX3sxfSkgPSBcbGVmdFtccHJvZF97dD0yfV57VH17ZihyX3t0fXxyX3t0LTF9LC4uLnJfezF9KX1ccmlnaHRdZihyX3sxfSkKJCQKClNlICRyX3t0fXxyX3t0LTF9LC4uLnJfezF9JCBzZWd1ZSB1bWEgZGlzdHJpYnVpw6fDo28gbm9ybWFsIGNvbSBtw6lkaWEgJFxtdSQgZSB2YXJpw6JuY2lhICRcc2lnbWFeezJ9JCBhIGZ1bsOnw6NvIGRlIHZlcm9zc2ltaWxoYW7Dp2EgY29uZGljaW9uYWwgc2UgdG9ybmEsIHBhcmEgJFIgPSBcbGVmdFx7cl97dH1ccmlnaHRcfV97dD0xfV57VH0kOgoKJCQKTChSfFxib2xkc3ltYm9se1x0aGV0YX0pID0gZihyX3t0fSxyX3t0LTF9LC4uLixyX3sxfSB8IFxib2xkc3ltYm9se1x0aGV0YX0pID0gZihyX3sxfXxcYm9sZHN5bWJvbHtcdGhldGF9KSBccHJvZF97dD0yfV57VH17IFxmcmFjezF9e1xzcXJ0ezJccGlcc2lnbWFeezJ9fX1leHBcbGVmdFx7XGZyYWN7LShyX3t0fS1cbXUpXjJ9ezJcc2lnbWFeezJ9fSAgXHJpZ2h0XH19IAokJAoKU2UgaWdub3JhbW9zICRmKHJfezF9KSQsIGEgZnVuw6fDo28gZGUgdmVyb3NzaW1pbGhhbsOnYSBjb25kaWNpb25hbCBkb3MgcmV0b3Jub3Mgc29iIGhpcMOzdGVzZSBkZSBub3JtYWxpZGFkZSBzZXLDoToKCiQkCkwoUnxcYm9sZHN5bWJvbHtcdGhldGF9KSA9IGYocl97dH0scl97dC0xfSwuLi4scl97MX18XGJvbGRzeW1ib2x7XHRoZXRhfSkgPSBccHJvZF97dD0yfV57VH17IFxmcmFjezF9e1xzcXJ0ezJccGlcc2lnbWFeezJ9fX1leHBcbGVmdFx7XGZyYWN7LShyX3t0fS1cbXUpXjJ9ezJcc2lnbWFeezJ9fSAgXHJpZ2h0XH19IAokJAoKT3V0cmFzIGZ1bsOnw7VlcyBkZSBkaXN0cmlidWnDp8OjbyBkZSBwcm9iYWJpbGlkYWRlcyAodC1TdHVkZW50LCBsb2ctTm9ybWFsLCBDYXVjaHkpIHBvZGVtIHNlciB1c2FkYXMgcGFyYSBsaWRhciBjb20gb3MgZmF0b3MgZXN0aWxpemFkb3MgZGlzY3V0aWRvcyBuZXN0ZSBbbWF0ZXJpYWxdKGh0dHBzOi8vcnB1YnMuY29tL2h1ZHNvbmNoYXZzL3Nlcmllc3RlbXBvcmFpc3VuaXZhcmlhZGFzKS4gQSBmdW7Dp8OjbyBkZSB2ZXJvc3NpbWlsaGFuw6dhIG11ZGFyw6EgcGFyYSBjYWRhIGZ1bsOnw6NvIGRlIGRpc3RyaWJ1acOnw6NvIGRlIHByb2JhYmlsaWRhZGVzLgoKKiAqKlZFUk9TU0lNSUxIQU7Dh0EgQVIocCkqKgoKU3Vwb25oYSBxdWUgdGVtb3MgdW0gbW9kZWxvIEFSKHApIGRhIHNlZ3VpbnRlIGZvcm1hOgoKJCQKcl97dH0gPSB7XHBoaX1fezB9ICsge1xwaGl9X3sxfXJfe3QtMX0gKyB7XHBoaX1fezJ9cl97dC0yfSArIC4uLiArIHtccGhpfV97cH1yX3t0LXB9ICsgYV97dH0KJCQKTG9nbywgJEVbcl97dH18cl97dC0xfSwuLi4scl97dC1wfV0gPSBccGhpX3swfStccGhpX3sxfXJfe3QtMX0rLi4uK1xwaGlfe3B9cl97dC1wfSQgZSAkVmFyKHJfe3R9fHJfe3QtMX0sLi4uLHJfe3QtcH0pID0gXHNpZ21hX3thfV57Mn0kIHF1ZSBzaWduaWZpY2EgcXVlIGRhZG8gb3MgcmV0b3Jub3MgcGFzc2Fkb3MgZGUgJHJfe3R9JCBvIHJldG9ybm8gY29ycmVudGUgw6kgY2VudHJhbGl6YWRvIGVtIHRvcm5vIGRlICRccGhpX3swfStccGhpX3sxfXJfe3QtMX0rLi4uK1xwaGlfe3B9cl97dC1wfSQgY29tIGRlc3ZpbyBwYWRyw6NvIGlndWFsIGEgJFxzaWdtYV97YX0kLgoKQXNzaW0sIHBhcmEgdW0gbW9kZWxvICoqQVIocCkqKiB0ZW1vcyBxdWUgYSBmdW7Dp8OjbyBkZSB2ZXJvc3NpbWlsaGFuw6dhIGNvbmRpY2lvbmFsIHNlcsOhOgoKJCQKTChSfFxib2xkc3ltYm9se1x0aGV0YX0pID0gZihyX3t0fSxyX3t0LTF9LC4uLixyX3sxfTtcYm9sZHN5bWJvbHtcdGhldGF9KSA9IFxwcm9kX3t0PXArMX1ee1R9eyBcZnJhY3sxfXtcc3FydHsyXHBpXHNpZ21hX3thfV57Mn19fWV4cFxsZWZ0XHtcZnJhY3stKHJfe3R9LVxwaGlfezB9LVxwaGlfezF9cl97dC0xfS0uLi4tXHBoaV97cH1yX3t0LXB9KV4yfXsyXHNpZ21hX3thfV57Mn19ICBccmlnaHRcfX0gCiQkCnF1ZSBubyBtb21lbnRvIHF1ZSBvYnNlcnZhbW9zIG9zIHZhbG9yZXMgZGUgJFIgPSBcbGVmdFx7cl97dH1ccmlnaHRcfV97dD0xfV57VH0kIHRlbW9zIGNvbW8gb2JqZXRpdm8gZW5jb250cmFyIHF1YWlzIG9zIHBhcsOibWV0cm9zIGRlICRcdGhldGEkIChuZXN0ZSBjYXNvLCAkXHBoaV97MH0kLCAkXHBoaV97MX0kLCAuLi4sICRccGhpX3twfSQgZSAkXHNpZ21hX3thfV57Mn0kKSBxdWUgbWF4aW1pemFtIGEgZnVuw6fDo28gZGUgdmVyb3NzaW1pbGhhbsOnYSBvdSBzZXUgbG9nYXLDrXRtby4KCiQkClxsbntMKFxoYXR7XGJvbGRzeW1ib2x7XHRoZXRhfX18Uil9ID0gXHN1bV97dD1wKzF9XntUfXtcbG57ZihyX3t0fSxyX3t0LTF9LC4uLixyX3sxfTtcYm9sZHN5bWJvbHtcdGhldGF9KX19IAokJAokJApcbG57TChcaGF0e1xib2xkc3ltYm9se1x0aGV0YX19fFIpfSA9IFxzdW1fe3Q9cCsxfV57VH17XGxlZnRbIFxsbnsxfSAtIFxsbnsoMlxwaVxzaWdtYV97YX1eezJ9KV57XGZyYWN7MX17Mn19fSAtIFxmcmFjezF9ezJcc2lnbWFfe2F9XnsyfX0ocl97dH0tXHBoaV97MH0tXHBoaV97MX1yX3t0LTF9LS4uLi1ccGhpX3twfXJfe3QtcH0pXnsyfSBccmlnaHRdfQokJAokJApcbG57TChcaGF0e1xib2xkc3ltYm9se1x0aGV0YX19fFIpfSA9IFxzdW1fe3Q9cCsxfV57VH17XGxlZnRbLVxmcmFjezF9ezJ9XGxueygyXHBpXHNpZ21hX3thfV57Mn0pfSAtIFxmcmFjezF9ezJcc2lnbWFfe2F9XnsyfX0ocl97dH0tXHBoaV97MH0tXHBoaV97MX1yX3t0LTF9LS4uLi1ccGhpX3twfXJfe3QtcH0pXnsyfSBccmlnaHRdfSAKJCQKJCQKXGxue0woXGhhdHtcYm9sZHN5bWJvbHtcdGhldGF9fXxSKX0gPSAtXGZyYWN7KFQtcCl9ezJ9XGxuezJccGl9IC1cZnJhY3soVC1wKX17Mn1cbG57XHNpZ21hX3thfV57Mn19IC1cZnJhY3sxfXsyXHNpZ21hX3thfV57Mn19XHN1bV97dD1wKzF9XntUfXsocl97dH0tXHBoaV97MH0tXHBoaV97MX1yX3t0LTF9LS4uLi1ccGhpX3twfXJfe3QtcH0pXnsyfX0KJCQKb25kZSAkXGhhdHtcYm9sZHN5bWJvbHtcdGhldGF9fSA9IFtccGhpX3swfSxccGhpX3sxfSwuLi4sXHBoaV97cH0sXHNpZ21hX3thfV57Mn1dJCBjb250ZW0gb3MgcGFyw6JtZXRyb3MgZG8gbW9kZWxvICoqQVIocCkqKi4KCiogKipWRVJPU1NJTUlMSEFOw4dBIE1BKDEpKioKClN1cG9uaGEgcXVlIHRlbW9zIG8gc2VndWludGUgbW9kZWxvIGRlIG3DqWRpYXMgbcOzdmVpcyBkZSBwcmltZWlyYSBvcmRlbToKCiQkCnJfe3R9ID0gXG11ICsgYV97dH0gKyB7XHRoZXRhfV97MX1hX3t0LTF9CiQkCm9uZGUgJGFfe3R9JCDDqSB1bSBydcOtZG8gYnJhbmNvIGNvbSBtw6lkaWEgJDAkLCB2YXJpw6JuY2lhICRcc2lnbWFfezJ9XnthfSQsICRFW2Ffe3R9YV97dC1sfV0gPSAwJCBlIGluZGVwZW5kZW50ZSBlIGlkZW50aWNhbWVudGUgZGlzdHJpYnXDrWRvIChpaWQpLiBTdXBvbmRvICRhX3swfT0wJCwgcGFyYSAkdD0xJCwgdGVtb3M6CgokJApyX3sxfT1cbXUgKyBhX3sxfSArIFx0aGV0YV97MX1hX3swfSA9IFxtdSArIGFfezF9CiQkCklzc28gaW1wbGljYSBxdWU6CgokJAooUl97MX09cl8xfGFfMD0wKSBcc2ltIE5cbGVmdChcbXUse1xzaWdtYX1fe2F9XnsyfVxyaWdodCkKJCQKCmVtIGZ1bsOnw6NvIGRhcyBwcm9wcmllZGFkZXMgZXN0YXTDrXN0aWNhcyBkZSAkYV90JC4gVW1hIHZleiBxdWUgJHJfMSQgw6kgb2JzZXJ2YWRvLCB0ZW1vcyBxdWUgJGFfezF9ID0gcl97MX0gLSBcbXUkIG8gcXVlIGltcGxpY2EgcXVlOgoKJCQKKFJfezJ9PXJfezJ9fFJfezF9PXJfezF9LGFfezB9PTApIFxzaW0gTlxsZWZ0KFxtdSArIFx0aGV0YV97MX1hX3sxfSx7XHNpZ21hfV97YX1eezJ9XHJpZ2h0KQokJAplIGEgcGFydGlyIHF1ZSAkYV97MX0kIMOpIGNvbmhlY2lkbywgcG9kZW1vcyBvYnRlciAkYV97Mn0kIHBvciBtZWlvIGRlICRhX3syfT1yX3syfS1cbXUtXHRoZXRhX3sxfWFfezF9JC4gQXNzaW0sIHBvZGVtb3Mgb2JzZXJ2YXIgcXVlIGRhZG8gcXVlIGNvbmhlY2Vtb3MgJGFfezB9PTAkLCBhIHNlcXXDqm5jaWEgJFxsZWZ0XHthX3t0fVxyaWdodFx9X3t0PTF9XntUfSQgcG9kZSBzZXIgY2FsY3VsYWRhIGEgcGFydGlyIGRlICRcbGVmdFx7cl97dH1ccmlnaHRcfV97dD0xfV57VH0kIGl0ZXJhbmRvIHNvYnJlOgoKJCQKYV97dH0gPSByX3t0fSAtIFxtdSAtXHRoZXRhX3sxfWFfe3QtMX0KJCQKcGFyYSAkdCA9IDEsIDIsIC4uLiwgVCQsIGluaWNpYW5kbyBhIHBhcnRpciBkZSAkYV97MH09MCQuIEEgdmVyb3NzaW1pbGhhbsOnYSBjb25kaWNpb25hbCBkYSBhbW9zdHJhIGNvbXBsZXRhIHBvZGUgc2VyIGNhbGN1bGFkYSBwZWxvIHByb2R1dG8gZGFzIGRlbnNpZGFkZXMgaW5kaXZpZHVhaXM6IAoKJCQKTChSfFxib2xkc3ltYm9se1x0aGV0YX0pID0gZihyX3t0fSxyX3t0LTF9LC4uLixyX3sxfSxhX3swfT0wfFxib2xkc3ltYm9se1x0aGV0YX0pID0gXHByb2Rfe3Q9Mn1ee1R9eyBcZnJhY3sxfXtcc3FydHsyXHBpXHNpZ21hX3thfV57Mn19fWV4cFxsZWZ0XHtcZnJhY3stYV97dH1eMn17MlxzaWdtYV97YX1eezJ9fSAgXHJpZ2h0XH19IAokJApxdWUgbm8gbW9tZW50byBxdWUgb2JzZXJ2YW1vcyBvcyB2YWxvcmVzIGRlICRSID0gXGxlZnRce3Jfe3R9XHJpZ2h0XH1fe3Q9MX1ee1R9JCB0ZW1vcyBjb21vIG9iamV0aXZvIGVuY29udHJhciBxdWFpcyBvcyBwYXLDom1ldHJvcyBkZSAkXHRoZXRhJCAobmVzdGUgY2FzbywgJFxtdSQsICRcdGhldGFfezF9JCBlICRcc2lnbWFfe2F9XnsyfSQpIHF1ZSBtYXhpbWl6YW0gYSBmdW7Dp8OjbyBkZSB2ZXJvc3NpbWlsaGFuw6dhIG91IHNldSBsb2dhcsOtdG1vLgoKJCQKXGxue0woXGhhdHtcYm9sZHN5bWJvbHtcdGhldGF9fXxSKX0gPSBcc3VtX3t0PTF9XntUfXtcbG57ZihyX3t0fSxyX3t0LTF9LC4uLixyX3sxfSxhX3swfT0wO1xib2xkc3ltYm9se1x0aGV0YX0pfX0gCiQkCiQkClxsbntMKFxoYXR7XGJvbGRzeW1ib2x7XHRoZXRhfX18Uil9ID0gXHN1bV97dD0xfV57VH17XGxlZnRbIFxsbnsxfSAtIFxsbnsoMlxwaVxzaWdtYV97YX1eezJ9KV57XGZyYWN7MX17Mn19fSAtIFxmcmFje2Ffe3R9XnsyfX17MlxzaWdtYV97YX1eezJ9fSBccmlnaHRdfQokJAokJApcbG57TChcaGF0e1xib2xkc3ltYm9se1x0aGV0YX19fFIpfSA9IFxzdW1fe3Q9MX1ee1R9e1xsZWZ0Wy1cZnJhY3sxfXsyfVxsbnsoMlxwaVxzaWdtYV97YX1eezJ9KX0gLSBcZnJhY3thX3t0fV57Mn19ezJcc2lnbWFfe2F9XnsyfX0gXHJpZ2h0XX0KJCQKJCQKXGxue0woXGhhdHtcYm9sZHN5bWJvbHtcdGhldGF9fXxSKX0gPSAtXGZyYWN7VH17Mn1cbG57MlxwaX0gLVxmcmFje1R9ezJ9XGxue1xzaWdtYV97YX1eezJ9fSAtIFxzdW1fe3Q9MX1ee1R9ey1cZnJhY3thX3t0fV57Mn19ezJcc2lnbWFfe2F9XnsyfX19CiQkCkVzdGEgw6kgYSB2ZXJvc3NpbWlsaGFuw6dhIGNvbmRpY2lvbmFsIHVzYWRhIHBhcmEgZXN0aW1hciB0YW50byBtb2RlbG9zICoqTUEoMSkqKiBlICoqTUEocSkqKi4gU2VuZG8gcXVlIGEgw7puaWNhIGRpZmVyZW7Dp2EgZW50cmUgZWxlcyDDqSBxdWUgZW5xdWFudG8gYXNzdW1pbW9zIG5vIE1BKDEpIHF1ZSAkYV97MH09MCQsIG5vIE1BKHEpIMOpIHByZWNpc28gYXNzdW1pciBxdWUgb3MgdmFsb3JlcyBpbmljaWFpcyBwYXJhIHRvZG9zIG9zIHRlcm1vcyBkZSBlcnJvIHPDo28gbnVsb3MsIG91IHNlamEsICRhX3swfT1hX3stMX09Li4uPWFfe3EtMX09MCQKCiogKipWRVJPU1NJTUlMSEFOw4dBIEFSTUEocCxxKSoqCgpBc3N1bWEgcXVlIG9ic2VydmFtb3Mgb3MgdmFsb3JlcyBpbmljaWFpcyBwYXJhICRSID0gXGxlZnRce3Jfe3R9XHJpZ2h0XH1fe3Q9MX1ee1R9JC4gTmVzdGUgY2FzbywgaW5pY2lhLXNlIGEgZXN0aW1hw6fDo28gZW0gJHQ9cCsxJCBlIGZpeGEtc2U6CgokJAphX3twfSA9IGFfe3AtMX0gPSAuLi4gPSBhX3twLTErMX0gPSAwIAokJAoKZSBhIGZ1bsOnw6NvIGRlIHZlcm9zc2ltaWxoYW7Dp2Egc2UgdG9ybmE6CgokJApMKFJ8XGJvbGRzeW1ib2x7XHRoZXRhfSkgPSBmKHJfe3R9LHJfe3QtMX0sLi4uLHJfezF9fHJfcCxyX3twLTF9LC4uLixyXzEsYV97cH0gPSBhX3twLTF9ID0gLi4uID0gYV97cC0xKzF9ID0gMHxcYm9sZHN5bWJvbHtcdGhldGF9KSA9IFxwcm9kX3t0PTJ9XntUfXsgXGZyYWN7MX17XHNxcnR7MlxwaVxzaWdtYV97YX1eezJ9fX1leHBcbGVmdFx7XGZyYWN7LWFfe3R9XjJ9ezJcc2lnbWFfe2F9XnsyfX0gIFxyaWdodFx9fSAKJCQKCnF1ZSBubyBtb21lbnRvIHF1ZSBvYnNlcnZhbW9zIG9zIHZhbG9yZXMgZGUgJFIgPSBcbGVmdFx7cl97dH1ccmlnaHRcfV97dD0xfV57VH0kIHRlbW9zIGNvbW8gb2JqZXRpdm8gZW5jb250cmFyIHF1YWlzIG9zIHBhcsOibWV0cm9zIGRlICRcdGhldGEkIChuZXN0ZSBjYXNvLCAkXG11JCwgJFxwaGlfMSQsIC4uLiwgJFxwaGlfcCQsICRcdGhldGFfezF9JCwgLi4uLiwgJFx0aGV0YV97cH0kIGUgJFxzaWdtYV97YX1eezJ9JCkgcXVlIG1heGltaXphbSBhIGZ1bsOnw6NvIGRlIHZlcm9zc2ltaWxoYW7Dp2Egb3Ugc2V1IGxvZ2Fyw610bW8uCgokJApcbG57TChcaGF0e1xib2xkc3ltYm9se1x0aGV0YX19fFIpfSA9IFxzdW1fe3Q9MX1ee1R9e1xsZWZ0Wy1cZnJhY3sxfXsyfVxsbnsoMlxwaVxzaWdtYV97YX1eezJ9KX0gLSBcZnJhY3thX3t0fV57Mn19ezJcc2lnbWFfe2F9XnsyfX0gXHJpZ2h0XX0KJCQKCiQkClxsbntMKFxoYXR7XGJvbGRzeW1ib2x7XHRoZXRhfX18Uil9ID0gLVxmcmFje1QtcH17Mn1cbG57MlxwaX0gLVxmcmFje1QtcH17Mn1cbG57XHNpZ21hX3thfV57Mn19IC0gXHN1bV97dD1wKzF9XntUfXstXGZyYWN7YV97dH1eezJ9fXsyXHNpZ21hX3thfV57Mn19fQokJAoKw4kgaW1wb3J0YW50ZSBzYWxpZW50YXIgcXVlIHRvZGFzIGFzIGZ1bsOnw7VlcyBkZSB2ZXJvc3NpbWlsaGFuw6dhcyBtb3N0cmFkYXMgYXNzdW1lbSBhIGhpcMOzdGVzZSBkZSBxdWUgYSBzw6lyaWUgdGVtcG9yYWwgZG9zIHJldG9ybm9zIHNlZ3VlIHVtYSBkaXN0cmlidWnDp8OjbyBOb3JtYWwuIENhc28gY29udHLDoXJpbywgcG9yIGV4ZW1wbG8gdW1hIHQtU3R1ZGVudCwgYXMgZnVuw6fDtWVzIGRldmVtIHNlciBlc2NyaXRhcyBhc3N1bWluZG8gdW1hIG5vdmEgaGlww7N0ZXNlIGRlIGRpc3RyaWJ1acOnw6NvLgoKIyMjIyMgKipESUFHTsOTU1RJQ08gRE9TIFJFU8ONRFVPUyoqCgpVbWEgaGlww7N0ZXNlIG5vcyBtb2RlbG9zIEFSTUEgZXN0YWNpb27DoXJpb3Mgw6kgcXVlIG8gdGVybW8gZGUgZXJybyAkYV97dH0kIMOpIHVtIHJ1w61kbyBicmFuY28uIElzc28gaW1wbGljYSBxdWUgJGFfe3R9JCB0ZW0gbcOpZGlhICQwJCwgdmFyacOibmNpYSAkXHNpZ21hX3thfV57Mn0kLCAkRVthX3t0fWFfe3QtbH1dID0gMCQgZSBpbmRlcGVudGUgZSBpZGVudGljYW1lbnRlIGRpc3RyaWJ1w61kbyAoaWlkKS4KCkRlc3RhIGZvcm1hLCBlc3BlcmEtc2UgcXVlIG9zIHJlc8OtZHVvcyBlc3RpbWFkb3MgcGVsbyBtb2RlbG8gc2UgY29tcG9ydGVtIGNvbW8gdW0gcnXDrWRvIGJyYW5jbyBzZSBvIG1vZGVsbyBlc3TDoSBjb3JyZXRhbWVudGUgZXNwZWNpZmljYWRvLiAKCk91dHJhIGhpcMOzdGVzZSBhc3N1bWlkYSBuYSBkZXJpdmHDp8OjbyBkYSBmdW7Dp8OjbyBkZSB2ZXJvc3NpbWlsaGFuw6dhIGRvcyBtb2RlbG9zIEFSKHApLCBNQShxKSBlIEFSTUEocCxxKSDDqSBxdWUgYSBzw6lyaWUgdGVtcG9yYWwgZG9zIHJldG9ybm9zIHNlZ3VlIHVtYSBkaXN0cmlidWnDp8OjbyBOb3JtYWwgbyBxdWUsIHBvciBjb25zZWd1aW50ZSwgZGVmaW5lIHF1ZSBvcyByZXPDrWR1b3MgdGFtYsOpbSB0w6ptIGEgbWVzbWEgZGlzdHJpYnVpw6fDo28gZGUgcHJvYmFiaWxpZGFkZS4gQXNzaW0sIGRldmVtb3MgZmF6ZXIgdW0gdGVzdGUgZXN0YXTDrXN0aWNvIHF1ZSBjb25maXJtZSBzZSBvcyByZXPDrWR1b3Mgc8OjbyBub3JtYWxtZW50ZSBkaXN0cmlidcOtZG9zLiAKClJlc3VtaWRhbWVudGUsIHRlbW9zIG8gc2VndWludGUgY29uanVudG8gZGUgdGVzdGVzIHNvYnJlIG9zIHJlc8OtZHVvczoKCiogJEVbYV0gPSAwJDogbyBwcsOzcHJpbyBwcm9jZXNzbyBkZSBlc3RpbWHDp8OjbyBkb3MgcGFyw6JtZXRyb3MgZ2FyYW50ZSBlc3RhIGhpcMOzdGVzZQoqICRcc2lnbWFfe2F9XnsyfSQ6IHBvZGVtb3MgdXNhciBhIEZBQyBkb3MgcmVzw61kdW9zIGFvIHF1YWRyYWRvIHBhcmEgdmVyaWZpY2FyIHNlIG9zIHJlc8OtZHVvcyBzw6NvIGhvbW9jZWTDoXN0aWNvcyBvdSBzZSBhcHJlc2VudGVtIGhldGVyb2NlZGFzdGljaWRhZGUgY29uZGljaW9uYWwuIE8gaWRlYWwgw6kgcXVlIG5lbmh1bWEgZGVmYXNhZ2VtIHNlamEgZXN0YXRpc3RpY2FtZW50ZSBzaWduaWZpY2FudGUuIENhc28gY29udHLDoXJpbywgdGFsdmV6IHNlamEgcHJlY2lzbyBlc3RpbWFyIGEgdmFyacOibmNpYSBjb25kaWNpb25hbCBwYXJhIGEgc8OpcmllIHRlbSBhbsOhbGlzZSAoYXByZW5kZXJlbW9zIGlzc28gY29tIG9zIG1vZGVsb3MgQVJDSCBlIEdBUkNIKQoqICRFW2Ffe3R9YV97dC1sfV0gPSAwJDogYSBGQUMgZG9zIHJlc8OtZHVvcyBwZXJtaXRlIGF2YWxpYXIgc2Ugb3MgbWVzbW9zIHPDo28gYXV0b2NvcnJlbGFjaW9uYWRvcy4gTyBpZGVhbCDDqSBxdWUgbmVuaHVtYSBkZWZhc2FnZW0gc2VqYSBlc3RhdGlzdGljYW1lbnRlIHNpZ25pZmljYW50ZS4KKiBSZXPDrWR1b3Mgc2VndWVtIHVtYSBkaXN0cmlidWnDp8OjbyBOb3JtYWw6IHBvZGVtb3MgZmF6ZXIgdXNvIGRvIHRlc3RlIEphcnF1ZS1CZXJhIHF1ZSB2ZXJpZmljYSBzZSBvcyBtb21lbnRvcyBkYSBzw6lyaWUgZXN0aW1hZGEgc8OjbyBpZ3VhaXMgYW9zIGRhIE5vcm1hbC4gRXNwZXJhbW9zIG7Do28gcmVqZWl0YXIgYSBoaXDDs3Rlc2UgbnVsYSBkZSBub3JtYWxpZGFkZSBkb3MgcmVzw61kdW9zLiAKCiMjIyMjICoqRVhFTVBMTzoqKgoKVmFtb3Mgc2ltdWxhciB1bSBtb2RlbG8gQVJNQSBlIGZhemVyIHVzbyBkYSBhYm9yZGFnZW0gcHJvcG9zdGEgcG9yIEBib3gxOTk0dGltZSBkYSBzZWd1aW50ZSBmb3JtYToKCjEuIElkZW50aWZpY2FyIGRpdmVyc2FzIG9yZGVucyAkcCQgZSAkcSQgcG9yIG1laW8gKipmdW7Dp8O1ZXMgZGUgYXV0b2NvcnJlbGHDp8OjbyAoRkFDKSBlIGF1dG9jb3JyZWxhw6fDo28gcGFyY2lhbCAoRkFDUCkqKiBwYXJhIHVtYSBzw6lyaWUgdGVtcG9yYWwgZGUgaW50ZXJlc3NlCjIuIEVzdGltYXIgb3MgbW9kZWxvcyBwb3IgbWVpbyBkbyAqKnByaW5jw61waW8gZGEgbcOheGltYSB2ZXJvc3NpbWlsaGFuw6dhKiogdXNhbmRvIHBhY290ZXMgZG8gUjsKMy4gRXNjb2xoZXIgZGVudHJlIG9zIG1vZGVsb3MgZXN0aW1hZG9zIG8gcXVlIGFwcmVzZW50YSBtZW5vciAqKkFJQyoqIG91ICoqQklDKio7CjQuIFZlcmlmaWNhciBzZSBvcyByZXPDrWR1b3MgZG8gbW9kZWxvIHNlIGNvbXBvcnRhbSBjb21vIHVtIHJ1w61kbyBicmFuY28uIAoKIyMjIyMgKipBUk1BKDEsMSkqKgoKU3Vwb25oYSBxdWUgdGVtb3MgbyBtb2RlbG8gQVJNQSgxLDEpIG5vIHNlZ3VpbnRlIGZvcm1hdG86IAoKJCQKcl97dH0gPSAxMCArIDAuNHJfe3QtMX0gKyBhX3t0fSArIDAuM2Ffe3QtMX0KJCQKb25kZSAkYV97dH0kIMOpIHVtIHJ1w61kbyBicmFuY28gY29tIG3DqWRpYSAkMCQsIHZhcmnDom5jaWEgJFxzaWdtYV97YX1eezJ9JCwgJEVcbGVmdFsgXGxlZnQoYV90LVxiYXJ7YX1ccmlnaHQpXGxlZnQoYV97dC1sfS1cYmFye2F9XHJpZ2h0KVxyaWdodF09RVthX3t0fWFfe3QtbH1dPTAkIGUgaW5kZXBlbmRlbnRlIGUgaWRlbnRpY2FtZW50ZSBkaXN0cmlidcOtZG8gKGlpZCkuIAoKTyBncsOhZmljbyBhYmFpeG8gYXByZXNlbnRhIGEgc8OpcmllIHRlbXBvcmFsIHF1ZSByZXByZXNlbnRhIHRhbCBtb2RlbG8uCgpgYGB7ciwgZWNobz1GQUxTRSwgd2FybmluZyA9IEZBTFNFLCBmaWcuaGVpZ2h0PTUsIGZpZy53aWR0aD05fQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwojIyMjICAgICAgIFBBQ09URVMgICAgICAgICAjIyMjIwojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwoKIyBwYXJhIG1hbnVzZWFyIGRhZG9zCnN1cHByZXNzTWVzc2FnZXMocmVxdWlyZSh0aWR5dmVyc2UpKQoKIyBwYXJhIGdlcmFyIGdyw6FmaWNvcyBlIHRhYmVsYXMKc3VwcHJlc3NNZXNzYWdlcyhyZXF1aXJlKGdncGxvdDIpKQpzdXBwcmVzc01lc3NhZ2VzKHJlcXVpcmUoeHRhYmxlKSkKc3VwcHJlc3NNZXNzYWdlcyhyZXF1aXJlKHN0YXJnYXplcikpCgoKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyMjIyMjICAgICAgIERBRE9TICAgICAgICAgIyMjIyMKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKCiMgRGVmaW5pciBwb250byBpbmljaWFsIHBhcmEgcGVybWl0aXIgcmVwbGljYXIgbyBleGVtcGxvLiBHZXJhciBtZXNtb3MgdmFsb3JlcyBhbGVhdMOzcmlvcwpzZXQuc2VlZCgxMjMpCgojIERhZG9zIFNpbXVsYWRvczoKIyAtIGFyaW1hLnNpbTogZnVuw6fDo28gZG8gcGFjb3RlIHN0YXRzIHF1ZSBub3MgcGVybWl0ZSBzaW11bGFyIHVtIG1vZGVsbyBhcmltYSwgdXNhbmRvOgojICAgIC0gbW9kZWw6IHVtYSBsaXN0YSBjb20gYXMgZXNwZWNpZmljYcOnw7VlcyBhciwgZGlmZiBlIG1hIGRvIG1vZGVsbyBjb20gYXMgc2VndWludGVzIG9ww6fDtWVzOgojICAgICAgLSBvcmRlcjogYSBvcmRlbSBkbyBtb2RlbG8gKG5vIGV4ZW1wbG8gYWJhaXhvLCBhcmltYSgxLDAsMSksIG91IHNlamEgdW0gYXJtYSgxLDEpKQojICAgICAgLSBhcjogdmFsb3JlcyBwYXJhIG9zIHBhcsOibWV0cm9zIGFyIGRvIG1vZGVsbyAobm8gZXhlbXBsbyBhYmFpeG8gYXBlbmFzIHVtIHZhbG9yIHBhcmEgbyBhcjEpCiMgICAgICAtIG1hOiB2YWxvcmVzIHBhcmEgb3MgcGFyw6JtZXRyb3MgbWEgZG8gbW9kZWxvIChubyBleGVtcGxvIGFiYWl4bywgYXBlbmFzIHVtIHZhbG9yIHBhcmEgbyBtYTEpCiMgICAgLSBuOiBvIHRhbWFuaG8gZGEgc8OpcmllIHRlbXBvcmFsIGEgc2VyIHNpbXVsYWRhCiMgICAgLSByYW5kLmdlbjogYSBmdW7Dp8OjbyBhIHNlciB1c2FkYSBwYXJhIGdlcmFyIG9zIHJlc8OtZHVvcyBkbyBtb2RlbG8uIEFiYWl4bywgdXNhbW9zIGEgZnVuw6fDo28KIyBybm9ybSBvIHF1ZSB0b3JuYSBvcyByZXPDrWR1b3Mgbm9ybWFsbWVudGUgZGlzdHJpYnXDrWRvcy4gT3V0cmEgYWx0ZXJuYXRpdmEsIHNlcmlhIHVzYXIgYSBmdW7Dp8OjbwojIHJ0IHBhcmEgcmVzw61kdW9zIGRpc3RyaWJ1w61kb3MgY29uZm9ybWUgdW1hIHQgZGUgU3R1ZGVudC4gCmFybWExMSA8LSBzdGF0czo6YXJpbWEuc2ltKG1vZGVsID0gbGlzdChvcmRlciA9IGMoMSwwLDEpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXIgPSBjKDAuNCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYSA9IGMoMC4zKSksIAogICAgICAgICAgICAgICAgICAgICAgICBuID0gMTAwMCwgCiAgICAgICAgICAgICAgICAgICAgICAgIHJhbmQuZ2VuID0gcm5vcm0pKzEwICMgKzEwIGZheiBvIHBhcGVsIGRvIGludGVyY2VwdG8gPSAyLCBwb2lzIGVzdG91IHNvbWFuZG8gMiBuYSBwYXJ0ZSBmdW7Dp8OjbyBkb3MgcGFyw6JtZXRyb2EgYXIgZSBtYQoKCiMgR3LDoWZpY28gZGEgc8OpcmllIHRlbXBvcmFsLgpwbG90LnRzKGFybWExMSwgdHlwZSA9ICJsIiwgbWFpbiA9ICJBUk1BKDEsMSkgU2ltdWxhZG8iLCB4bGFiID0gIlRlbXBvIiwgeWxhYiA9ICIiKSAKYGBgCgrDiSBwb3Nzw612ZWwgb2JzZXJ2YXIgcXVlIHJlYWxtZW50ZSBow6EgZXN0YWNpb25hcmllZGFkZSBmcmFjYSBkYWRvIHF1ZSBhIHPDqXJpZSBvc2NpbGEgZW0gdG9ybm8gZGUgdW1hIG3DqWRpYSAoJDEwJCkgZSBjb20gdW1hIHZhcmnDom5jaWEgY29uc3RhbnRlLgoKQWdvcmEsIGltYWdpbmUgcXVlIHRlbW9zIGEgc8OpcmllIHRlbXBvcmFsIGFjaW1hIGUgcXVlIG7Do28gc2FiZW1vcyBxdWUgZWxhIGZvaSBvcmlnaW5hZGEgcG9yIHVtIHByb2Nlc3NvICoqQVJNQSgxLDEpKiosIG1hcyBnb3N0YXLDrWFtb3MgZGUgdXNhciBhIGFib3JkYWdlbSBwcm9wb3N0YSBwb3IgQGJveDE5OTR0aW1lIHBhcmEgZXN0aW1hciB1bSBtb2RlbG8gcGFyYSBhIHPDqXJpZS4gUGFyYSB0YW50bywgdmFtb3Mgc2VndWlyIG9zIHBhc3NvcyBwcm9wb3N0b3MgYW50ZXJpb3JtZW50ZS4KCiogKipJREVOVElGSUNBw4fDg08gREFTIE9SREVOUyAkcCQgZSAkcSQ6KioKCsOJIHByZWNpc28gYXZhbGlhciBhcyBmdW7Dp8O1ZXMgZGUgYXV0b2NvcnJlbGHDp8OjbyBlIGF1dG9jb3JyZWxhw6fDo28gcGFyY2lhbCBwYXJhIHZlcmlmaWNhciBhcyBvcmRlbnMgcXVlIGRldmVtb3MgZXNwZWNpZmljYXIgcGFyYSBvIG1vZGVsby4gTGVtYnJlLXNlIHF1ZSB2aW1vcyBhbnRlcmlvcm1lbnRlIHF1ZSBhIEZBQ1Agw6kgaWRlYWwgcGFyYSBkZWZpbmlyIGEgb3JkZW0gJHAkIGRvIEFSIGVucXVhbnRvIGEgRkFDIGRldmUgc2VyIHVzYWRhIHBhcmEgZW5jb250cmFyIGEgb3JkZW0gJHEkIGRvIE1BLiBBYmFpeG8sIG9zIGdyw6FmaWNvcyBkYXMgZHVhcyBmdW7Dp8O1ZXMuIAoKYGBge3IsIGVjaG89RkFMU0UsIHdhcm5pbmcgPSBGQUxTRSwgZmlnLmFsaWduPSdjZW50ZXInLCBmaWcuaGVpZ2h0PTUsIGZpZy53aWR0aD05fQojIEZ1bsOnw6NvIGRlIGF1dG9jb3JyZWxhw6fDo28KYWNmX2FybWExMSA8LSBzdGF0czo6YWNmKGFybWExMSwgbmEuYWN0aW9uID0gbmEucGFzcywgcGxvdCA9IEZBTFNFLCBsYWcubWF4ID0gMTUpCgojIEdyw6FmaWNvIGRhIGZ1bsOnw6NvIGRlIGF1dG9jb3JyZWxhw6fDo28uIApwbG90KGFjZl9hcm1hMTEsIG1haW4gPSAiIiwgeWxhYiA9ICIiLCB4bGFiID0gIkRlZmFzYWdlbSIpCnRpdGxlKCJGdW7Dp8OjbyBkZSBBdXRvY29ycmVsYcOnw6NvIChGQUMpIiwgYWRqID0gMC41LCBsaW5lID0gMSkKCiMgRnVuw6fDo28gZGUgYXV0b2NvcnJlbGHDp8OjbyBwYXJjaWFsCnBhY2ZfYXJtYTExIDwtIHN0YXRzOjpwYWNmKGFybWExMSwgbmEuYWN0aW9uID0gbmEucGFzcywgcGxvdCA9IEZBTFNFLCBsYWcubWF4ID0gMTUpCgojIEdyw6FmaWNvIGRhIGZ1bsOnw6NvIGRlIGF1dG9jb3JyZWxhw6fDo28gcGFyY2lhbC4gCnBsb3QocGFjZl9hcm1hMTEsIG1haW4gPSAiIiwgeWxhYiA9ICIiLCB4bGFiID0gIkRlZmFzYWdlbSIpCnRpdGxlKCJGdW7Dp8OjbyBkZSBBdXRvY29ycmVsYcOnw6NvIFBhcmNpYWwgKEZBQ1ApIiwgYWRqID0gMC41LCBsaW5lID0gMSkKYGBgCgpBcGFyZW50ZW1lbnRlIHBhcmVjZSBxdWUgc2UgdHJhdGEgZGUgdW0gbW9kZWxvIEFSTUEoMiwyKSwgcG9pcyBwYXJhIGEgRkFDIGUgRkFDUCBow6Egc2lnbmlmaWPDom5jaWEgYXTDqSBhIGRlZmFzYWdlbSAyIFteMV0uIE9ic2VydmUgcXVlLCBjb21vIGVzcGVyYWRvLCBvIHVzbyBkYSBGQUMgZSBGQUNQIG5vcyBkaXJlY2lvbmFyaWEgYSB1bWEgZXNwZWNpZmljYcOnw6NvIHF1ZSBuw6NvIMOpIHZlcmRhZGVpcmEsIHBvaXMgc2FiZW1vcyBxdWUgYSBzw6lyaWUgdGVtcG9yYWwgZm9pIGdlcmFkYSBwb3IgdW0gbW9kZWxvIEFSTUEoMSwxKS4gQXNzaW0sIGNvbW8gcHJvcG9zdG8gbm8gcHJvY2Vzc28gZGUgZXN0aW1hw6fDo28sIHZhbW9zIGZhemVyIHVzbyBkZSBhbGd1bSBjcml0w6lyaW8gZGUgaW5mb3JtYcOnw6NvIHF1ZSBub3MgYWp1ZGUgbmEgc2VsZcOnw6NvIGRhIG1lbGhvciBlc3BlY2lmaWNhw6fDo28gcGFyYSBhIHPDqXJpZSBxdWUgcXVlcmVtb3MgZXN0aW1hci4KClVtYSBhYm9yZGFnZW0gw7p0aWwgw6kgZmF6ZXIgdG9kYXMgYXMgY29tYmluYcOnw7VlcyBwb3Nzw612ZWlzIGRlIG1vZGVsb3MgQVJNQSBwYXJhICRwPTAkIGF0w6kgJHA9MiQgZSAkcT0wJCBhdMOpICRxPTIkLCBjb21vIHNlZ3VlOgoKKiBBUk1BKDAsMCkKKiBBUk1BKDEsMCkKKiBBUk1BKDIsMCkKKiBBUk1BKDAsMSkKKiBBUk1BKDEsMSkKKiBBUk1BKDIsMSkKKiBBUk1BKDAsMikKKiBBUk1BKDEsMikKKiBBUk1BKDIsMikKCmUgYSBwYXJ0aXIgZGlzc28gZXN0aW1hciB0b2RvcyBvcyBtb2RlbG9zIGUgZXNjb2xoZXIgYXF1ZWxlIGNvbSBtZW5vciAqKkFJQyoqIGUvb3UgKipCSUMqKi4KCiogKipFU1RJTUHDh8ODTzoqKgoKVW1hIHZleiBxdWUgdGVtb3Mgb3MgbW9kZWxvcyBkZSBpbnRlcmVzc2UgcGFyYSBhdmFsaWHDp8OjbyBkbyBBSUMgb3UgQklDLCB2YW1vcyBmYXplciBhIGVzdGltYcOnw6NvIHVzYW5kbyBvICoqcHJpbmPDrXBpbyBkYSBtw6F4aW1hIHZlcm9zc2ltaWxoYW7Dp2EqKi4gRGVzdGEgZm9ybWEsIHVtYSBhbHRlcm5hdGl2YSDDqSBlc2NyZXZlciBhIGZ1bsOnw6NvIGRlIHZlcm9zc2ltaWxoYW7Dp2Egbm8gUiBlIHBvciBwcm9jZXNzbyBkZSBvdGltaXphw6fDo28gYnVzY2FyIG9zIHBhcsOibWV0cm9zIHF1ZSBtYXhpbWl6YW0gbyBzZXUgbG9nYXJpdG1vLiBDb21vIG9wdGFtb3MgbmEgc2ltdWxhw6fDo28gZG9zIGRhZG9zIHF1ZSAkYV97dH0kIHNlZ3Vpc3NlIHVtYSBkaXN0cmlidWnDp8OjbyBOb3JtYWwsIGVtIGNhc28gZGUgY3JpYXIgdW1hIGZ1bsOnw6NvIGRlIHZlcm9zc2ltaWxoYW7Dp2Egbm8gUiwgdGFsIGRpc3RyaWJ1acOnw6NvIGRldmVyaWEgc2VyIHVzYWRhLiAKClBvcsOpbSwgYXF1aSB1c2Ftb3MgYSBmdW7Dp8OjbyBgYXJpbWFgIGRvIHBhY290ZSAqKnN0YXRzKiogcGFyYSBlc3RpbWFyIG9zIG1vZGVsb3Mgc2VsZWNpb25hZG9zIHF1ZSB1c2EgY29tbyBkZWZhdWx0IGEgZGlzdHJpYnVpw6fDo28gTm9ybWFsIHBhcmEgbyB0ZXJtbyBkZSBlcnJvLiBDYXNvIHZvY8OqIHRlbmhhIGludGVyZXNzZSBlbSBlbnRlbmRlciBvdXRyYXMgb3DDp8O1ZXMgZGEgZnVuw6fDo28sIGZhw6dhIGBoZWxwKGFyaW1hKWAgbm8gY29uc29sZSBkbyBSIHBhcmEgdmlzdWFsaXphciBhIGRvY3VtZW50YcOnw6NvIGRhIGZ1bsOnw6NvLgoKYGBge3IsIGVjaG89RkFMU0UsIHdhcm5pbmcgPSBGQUxTRX0KIyBUb2RhcyBhcyBjb21iaW5hw6fDtWVzIHBvc3PDrXZlaXMgZGUgcD0wIGF0w6kgcD1tYXggZSBxPTAgYXTDqSBxPW1heApwYXJzIDwtIGV4cGFuZC5ncmlkKGFyID0gMDoyLCBkaWZmID0gMCwgbWEgPSAwOjIpCgojIExvY2FsIG9uZGUgb3MgcmVzdWx0YWRvcyBkZSBjYWRhIG1vZGVsbyBzZXLDoSBhcm1hemVuYWRvCm1vZGVsbyA8LSBsaXN0KCkKCiMgRXN0aW1hciBvcyBwYXLDom1ldHJvcyBkb3MgbW9kZWxvcyB1c2FuZG8gTcOheGltYSBWZXJvc3NpbWlsaGFuw6dhIChNTCkKZm9yIChpIGluIDE6bnJvdyhwYXJzKSkgewogIG1vZGVsb1tbaV1dIDwtIHN0YXRzOjphcmltYShhcm1hMTEsIG9yZGVyID0gdW5saXN0KHBhcnNbaSwgMTozXSksIG1ldGhvZCA9ICJNTCIpCn0KCiMgT2J0ZXIgbyBsb2dhcml0bW8gZGEgdmVyb3NzaW1pbGhhbsOnYSAodmFsb3IgbcOheGltbyBkYSBmdW7Dp8OjbykKbG9nX3Zlcm9zc2ltaWxoYW5jYSA8LSBsaXN0KCkKCmZvciAoaSBpbiAxOmxlbmd0aChtb2RlbG8pKSB7CiAgbG9nX3Zlcm9zc2ltaWxoYW5jYVtbaV1dIDwtIG1vZGVsb1tbaV1dJGxvZ2xpawp9CgojIENhbGN1bGFyIG8gQUlDCmFpY2FybWEgPC0gbGlzdCgpCmZvciAoaSBpbiAxOmxlbmd0aChtb2RlbG8pKSB7CiAgYWljYXJtYVtbaV1dIDwtIHN0YXRzOjpBSUMobW9kZWxvW1tpXV0pCn0KCiMgQ2FsY3VsYXIgbyBCSUMKYmljYXJtYSA8LSBsaXN0KCkKZm9yIChpIGluIDE6bGVuZ3RoKG1vZGVsbykpIHsKICBiaWNhcm1hW1tpXV0gPC0gc3RhdHM6OkJJQyhtb2RlbG9bW2ldXSkKfQoKIyBRdWFudGlkYWRlIGRlIHBhcsOibWV0cm9zIGVzdGltYWRvcyBwb3IgbW9kZWxvCnF1YW50X3BhcmFtZW50cm9zIDwtIGxpc3QoKQpmb3IgKGkgaW4gMTpsZW5ndGgobW9kZWxvKSkgewogIHF1YW50X3BhcmFtZW50cm9zW1tpXV0gPC0gbGVuZ3RoKG1vZGVsb1tbaV1dJGNvZWYpKzEgIyArMSBwb3JxdWUgdGVtb3MgYSB2YXJpw6JuY2lhIGRvIHRlcm1vIGRlIGVycm8gCn0KCiMgTW9udGFyIGEgdGFiZWxhIGNvbSBvcyByZXN1bHRhZG9zCmVzcGVjaWZpY2FjYW8gPC0gcGFzdGUwKCJBUk1BIixwYXJzJGFyLHBhcnMkZGlmZixwYXJzJG1hKQp0YW1hbmhvX2Ftb3N0cmEgPC0gcmVwKGxlbmd0aChhcm1hMTEpLCBsZW5ndGgobW9kZWxvKSkKcmVzdWx0YWRvIDwtIGRhdGEuZnJhbWUoZXNwZWNpZmljYWNhbywgbG5fdmVyb3NzaW1pbGhhbmNhID0gdW5saXN0KGxvZ192ZXJvc3NpbWlsaGFuY2EpLAogICAgICAgICAgICAgICAgICAgICAgICBxdWFudF9wYXJhbWVudHJvcyA9IHVubGlzdChxdWFudF9wYXJhbWVudHJvcyksCiAgICAgICAgICAgICAgICAgICAgICAgIHRhbWFuaG9fYW1vc3RyYSwgYWljID0gdW5saXN0KGFpY2FybWEpLCAKICAgICAgICAgICAgICAgICAgICAgICAgYmljID0gdW5saXN0KGJpY2FybWEpKQoKIyBNb3N0cmFyIGEgdGFiZWxhIGRlIHJlc3VsdGFkbwpwcmludChyZXN1bHRhZG8pCmBgYAoKQ29tbyBlcmEgZGUgc2UgZXNwZXJhciwgbyBtb2RlbG8gQVJNQSgxLDEpIGFwcmVzZW50YSBtZW5vciBBSUMgZSBCSUMuIEFwZXNhciBkZXN0ZSBtb2RlbG8gbsOjbyB0ZXIgbyBtYWlvciB2YWxvciBkbyBsb2dhcml0bW8gZGEgdmVyb3NzaW1pbGhhbsOnYSwgZWxlIMOpIG8gbWVsaG9yIG1vZGVsbyBkZW50cmUgb3MgZGVtYWlzLiBMZW1icmUtc2UgcXVlIG5vIGPDoWxjdWxvIGRvIEFJQyBvdSBCSUMgaMOhIHBlbmFsaXphw6fDo28gcGFyYSBtb2RlbG9zIGNvbSBtYWlvciBxdWFudGlkYWRlIGRlIHBhcsOibWV0cm9zLgoKVW1hIHZleiBzZWxlY2lvbmFkbyBvIG1vZGVsbywgdmFtb3MgdmVyaWZpY2FyIHF1YWlzIG9zIHBhcsOibWV0cm9zIGVzdGltYWRvcyBlIGEgc2lnbmlmaWPDom5jaWEgZXN0YXTDrXN0aWNhIGRlIGNhZGEuIE9ic2VydmUgcXVlIG9zIHBhcsOibWV0cm9zIGVzdGltYWRvcyBlc3TDo28gYmVtIHByw7N4aW1vcyBkb3MgdmVyZGFkZWlyb3MgcGFyw6JtZXRyb3MgcG9wdWxhY2lvbmFpcyBxdWUgdXNhbW9zIHBhcmEgc2ltdWxhciBhIHPDqXJpZSB0ZW1wb3JhbC4KCmBgYHtyLCBlY2hvPUZBTFNFLCB3YXJuaW5nID0gRkFMU0UsIH0KIyBBcXVpLCB1c2Ftb3MgbyBuw7ptZXJvIDUgcGFyYSBzZWxlY2lvbmFyIG8gbW9kZWxvIGVzY29saGlkbyBhbnRlcmlvcm1lbnRlLiAKIyBPYnNlcnZlIHF1ZSBvIG1vZGVsbyBBUk1BKDEsMSkgZXN0YXZhIG5hIGxpbmhhIDUgZGEgdGFiZWxhIGNvbSB0b2RvcyBvcyAKIyBkZW1haXMgbW9kZWxvcy4gUGFyYSBnZXJhciBhIHRhYmVsYSB1c2Ftb3MgYSBmdW7Dp8OjbyBzdGFyZ2F6ZXIgZG8gcGFjb3RlIHN0YXJnYXplcgpzdGFyZ2F6ZXI6OnN0YXJnYXplcihtb2RlbG9bWzVdXSwgdHlwZSA9ICJ0ZXh0IiwgdGl0bGUgPSAiUmVzdWx0YWRvIEVzdGltYcOnw6NvIG1vZGVsbyBBUk1BKDEsMSkiKQpgYGAKCiogKipESUFHTsOTU1RJQ08gRE8gTU9ERUxPIFNFTEVDSU9OQURPOioqCgpVbWEgaGlww7N0ZXNlIG5vcyBtb2RlbG9zIEFSTUEgZXN0YWNpb27DoXJpb3Mgw6kgcXVlIG8gdGVybW8gZGUgZXJybyAkYV97dH0kIMOpIHVtIHJ1w61kbyBicmFuY28uIElzc28gaW1wbGljYSBxdWUgJGFfe3R9JCB0ZW0gbcOpZGlhICQwJCwgdmFyacOibmNpYSAkXHNpZ21hX3thfV57Mn0kLCAkRVthX3t0fWFfe3QtbH1dID0gMCQgZSBpbmRlcGVudGUgZSBpZGVudGljYW1lbnRlIGRpc3RyaWJ1w61kbyAoaWlkKSAoYXF1aSwgc3Vwb21vcyBxdWUgZXJhIE5vcm1hbG1lbnRlIGRpc3RyaWJ1w61kbykuIERlc3RhIGZvcm1hLCBlc3BlcmEtc2UgcXVlIG9zIHJlc8OtZHVvcyBlc3RpbWFkb3MgcGVsbyBtb2RlbG8gc2UgY29tcG9ydGVtIGNvbW8gdW0gcnXDrWRvIGJyYW5jbyBzZSBvIG1vZGVsbyBlc3TDoSBjb3JyZXRhbWVudGUgZXNwZWNpZmljYWRvLiAKClBhcmEgYSBoaXDDs3Rlc2UgZGUgbsOjbyBhdXRvY29ycmVsYcOnw6NvIGRvcyByZXPDrWR1b3MgKCRFW2Ffe3R9YV97dC1sfV0gPSAwJCksIHBvZGVtb3MgdXNhciBhIGZ1bsOnw6NvIGRlIGF1dG9jb3JyZWxhw6fDo28gKEZBQykgZG9zIHJlc8OtZHVvcywgb25kZSBlc3BlcmFtb3MgcXVlIG5lbmh1bWEgZGVmYXNhZ2VtIHRlbmhhIHNpZ25pZmljw6JuY2lhIGVzdGF0w61zdGljYS4gQ29tbyBtb3N0cmEgbyBncsOhZmljbyBhYmFpeG8sIG7Do28gZXhpc3RlIGF1dG9jb3JyZWxhw6fDo28gbm9zIHJlc8OtZHVvcyBkbyBtb2RlbG8gZXNjb2xoaWRvLCBwb2lzIGFzIGRlZmFzYWdlbnMgJGw+MCQgbsOjbyBzw6NvIGVzdGF0aXN0aWNhbWVudGUgc2lnbmlmaWNhbnRlcy4gCgpgYGB7ciwgZWNobz1GQUxTRSwgcmVzdWx0cz0nYXNpcycsIHdhcm5pbmcgPSBGQUxTRSwgZmlnLmhlaWdodD01LCBmaWcud2lkdGg9OX0KIyBGdW7Dp8OjbyBkZSBhdXRvY29ycmVsYcOnw6NvIGRvcyByZXPDrWR1b3MKYWNmX2FybWExMV9lc3QgPC0gc3RhdHM6OmFjZihtb2RlbG9bWzVdXSRyZXNpZHVhbHMsIHBsb3QgPSBGQUxTRSwgbGFnLm1heCA9IDE1KQoKIyBHcsOhZmljbyBkYSBmdW7Dp8OjbyBkZSBhdXRvY29ycmVsYcOnw6NvLiAKcGxvdChhY2ZfYXJtYTExX2VzdCwgbWFpbiA9ICIiLCB5bGFiID0gIiIsIHhsYWIgPSAiRGVmYXNhZ2VtIikKdGl0bGUoIkZ1bsOnw6NvIGRlIEF1dG9jb3JyZWxhw6fDo28gKEZBQykgZG9zIFJlc8OtZHVvcyIsIGFkaiA9IDAuNSwgbGluZSA9IDEpCmBgYAoKCkrDoSBhIGhpcMOzdGVzZSBkZSBob21vY2VkYXN0aWNpZGFkZSBkb3MgcmVzw61kdW9zICgkXHNpZ21hX3thfV57Mn0kKSwgcG9kZW1vcyB1c2FyIG8gZ3LDoWZpY28gZGEgZnVuw6fDo28gZGUgYXV0b2NvcnJlbGHDp8OjbyBzZXJpYWwgKEZBQykgZG9zIHJlc8OtZHVvcyBhbyBxdWFkcmFkby4gQ29tbyBtb3N0cmEgbyBncsOhZmljbyBhYmFpeG8sIG7Do28gaMOhIGhldGVyb2NlZGFzdGljaWRhZGUgY29uZGljaW9uYWwsIG91IHNlamEsIG9zIHJlc8OtZHVvcyBzZSBjb21wb3J0YW0gY29uZm9ybWUgYSBoaXDDs3Rlc2UgZGUgaG9tb2NlZGFzdGljaWRhZGUuIAoKYGBge3IsIGVjaG89RkFMU0UsIHJlc3VsdHM9J2FzaXMnLCB3YXJuaW5nID0gRkFMU0UsIGZpZy5oZWlnaHQ9NSwgZmlnLndpZHRoPTl9CiMgVGVzdGUgZGUgaGV0ZXJvY2VkYXN0aWNpZGFkZSBjb25kaWNpb25hbAphY2ZfcmVzaWR1YWxzIDwtIGFjZihtb2RlbG9bWzVdXSRyZXNpZHVhbHNeMiwgbmEuYWN0aW9uID0gbmEucGFzcywgcGxvdCA9IEZBTFNFLCBsYWcubWF4ID0gMjApCnBsb3QoYWNmX3Jlc2lkdWFscywgbWFpbiA9ICIiLCB5bGFiID0gIiIsIHhsYWIgPSAiRGVmYXNhZ2VtIikKdGl0bGUoIkZBQyBkbyBxdWFkcmFkbyBkb3MgcmVzw61kdW9zIiwgYWRqID0gMC41LCBsaW5lID0gMSkKYGBgCgpPdXRyYSBoaXDDs3Rlc2UgYXNzdW1pZGEgbmEgZGVyaXZhw6fDo28gZGEgZnVuw6fDo28gZGUgdmVyb3NzaW1pbGhhbsOnYSBkb3MgbW9kZWxvcyBBUihwKSwgTUEocSkgZSBBUk1BKHAscSkgw6kgcXVlIGEgc8OpcmllIHRlbXBvcmFsIGRvcyByZXRvcm5vcyBzZWd1ZSB1bWEgZGlzdHJpYnVpw6fDo28gTm9ybWFsIG8gcXVlLCBwb3IgY29uc2VndWludGUsIGRlZmluZSBxdWUgb3MgcmVzw61kdW9zIHRhbWLDqW0gdMOqbSBhIG1lc21hIGRpc3RyaWJ1acOnw6NvIGRlIHByb2JhYmlsaWRhZGUuIFVtYSBhbHRlcm5hdGl2YSBwYXJhIGlzc28gw6kgbyB0ZXN0ZSBKYXJxdWUgQmVyYS4gCgpgYGB7ciwgZWNobz1GQUxTRSwgd2FybmluZyA9IEZBTFNFLCBmaWcuaGVpZ2h0PTUsIGZpZy53aWR0aD05fQojIFRlc3RlIEphcnF1ZSBCZXJhIHBhcmEgbm9ybWFsaWRhZGUuIFVzYW1vcyBhIGZ1bsOnw6NvIGphcnF1ZS5iZXJhLnRlc3QKIyBkbyBwYWNvdGUgdHNlcmllcwp0c2VyaWVzOjpqYXJxdWUuYmVyYS50ZXN0KG1vZGVsb1tbNV1dJHJlc2lkdWFscykKYGBgCgpBIGhpcMOzdGVzZSBudWxhIGRvIHRlc3RlIMOpIHF1ZSBvcyBkYWRvcyAqKnPDo28gbm9ybWFsbWVudGUgZGlzdHJpYnXDrWRvcyoqIGNvbnRyYSBhIGhpcMOzdGVzZSBhbHRlcm5hdGl2YSBxdWUgb3MgZGFkb3MgKipuw6NvIHPDo28gbm9ybWFsbWVudGUgZGlzdHJpYnXDrWRvcyoqLiBTYWJlbW9zIHF1ZSBvIHAtdmFsb3Igw6kgbyBuw612ZWwgZGUgc2lnbmlmaWPDom5jaWEgbcOtbmltbyBwYXJhIHNlIHJlamVpdGFyIGEgaGlww7N0ZXNlIG51bGEuIEFzc2ltLCBxdWVyZW1vcyB1bSBwLXZhbG9yIGFsdG8gKCQ+MCwwNSQpIG8gcXVlIG7Do28gbm9zIHBlcm1pdGUgcmVqZWl0w6EtbGEuIE9ic2VydmUgcXVlIMOpIGV4YXRhbWVudGUgaXNzbyBxdWUgbyByZXN1bHRhZG8gZG8gbm9zc28gdGVzdGUgbW9zdHJhIGUsIGFzc2ltLCBuw6NvIHBvZGVtb3MgcmVqZWl0YXIgYSBoaXDDs3Rlc2UgbnVsYSBkZSBub3JtYWxpZGFkZSBub3MgZGFkb3MuICAKCgojIyMjIyAqKlJFRkVSw4pOQ0lBUyoq