A série temporal dos retornos de um ativo denotada por \(\left\{r_{t}\right\}_{t=1}^{T}\) é uma coleção de variáveis aleatórias coletadas ao longo do tempo (definição de processo estocástico). A modelagem econométrica de séries temporais univariadas tem como objetivo capturar a relação linear entre \(r_{t}\) e informações disponíveis antes de \(t\).
Desta forma, os valores históricos de \(r_{t}\) podem ser úteis para modelar o seu comportamento ao longo do tempo. Neste caso, a correlação entre os retornos tem um papel importante. Chamamos tais correlações de autocorrelação e esta é uma ferramenta básica para estudar uma série temporal estacionária.
Neste sentido, este material tem como objetivo contribuir para o entendimento sobre correlação, autocorrelação e autocorrelação parcial.
CORRELAÇÃO
O coeficiente de correlação de Pearson que mede a dependência linear entre duas variáveis é definido como:
\[
{\rho}_{x,y}=\frac{COV\left(x,y \right)}{\sqrt{Var\left(x \right),Var\left(y \right)}} =\frac{E\left[\left(x-{\mu}_{x} \right) \left(y-{\mu}_{y} \right) \right]}{\sqrt{E{\left(x-{\mu}_{x} \right)}^{2}E{\left(y-{\mu}_{y} \right)}^{2}}}
\]
onde \({\mu}_{x}\) e \({\mu}_{y}\) são a média de \(x\) e \(y\), respectivamente. Algumas propriedades:
- \(-1\leq {\rho}_{x,y} \leq 1\)
- \({\rho}_{x,y}={\rho}_{y,x}\)
- \({\rho}_{x,y}=0\) quando as duas variáveis não são correlacionada
Existem outras alternativas para o cálculo de correlação proposto por Pearson. Dentre eles temos o \(\rho\) de Spearman e o \(\tau\) de Kendall. Maiores detalhes neste link.
Quando uma amostra \(\left\{(x_{t},y_{t})|t=1,...,T\right\}\) é coletada, a correlação pode ser obtida por seu estimador amostral:
\[
{\hat{\rho}}_{x,y}=\frac{\sum_{t=1}^{T}{ \left({x}_{t}-\overline{x} \right) \left({y}_{t}-\overline{y} \right)}}{ \sqrt{\sum_{t=1}^{T}{{\left({x}_{t}-\overline{x} \right)}^{2}\sum _{t=1}^{T}{{\left({y}_{t}-\overline{y} \right) }^{2}}}}}
\]
onde \(\overline{x}={\sum_{t=1}^{T}{{x}_{t}}}/{T}\) e \(\overline{y}={\sum_{t=1}^{T}{{y}_{t}}}/{T}\) correspondem à média amostral de \(x\) e \(y\), respectivamente. No gráfico abaixo, mostramos exemplos de variáveis correlacionadas (positiva e negativa).
FUNÇÃO DE AUTOCORRELAÇÃO
A função de autocorrelação é o gráfico da autocorrelação contra a defasagem. Considere uma série temporal de retornos de uma ação \(\left\{r_{t}\right\}_{t=1}^{T}\). O coeficiente de correlação entre \(r_{t}\) e \(r_{t-k}\) é chamado de autocorrelação de k-ésima ordem e é denotadado por:
\[
{\rho}_{k}=\frac {Cov\left({r}_{t},{r}_{t-k} \right)}{\sqrt{Var\left({r}_{t},{r}_{t-k} \right)}} =\frac{Cov\left({r}_{t},{r}_{t-k} \right)}{Var\left({r}_{t} \right)} =\frac{{\gamma}_{k}}{{\gamma}_{0}}
\]
onde \(Var\left({r}_{t-k}\right)=Var\left({r}_{t}\right)\) porque \(r_{t}\) é fracamente estacionário. Além disso, temos:
- \({\rho}_{0}=1\);
- \({\rho}_{l}={\rho}_{-l}\);
- \(-1\leq {\rho}_{l} \leq 1\)
Um conjunto de autocorrelações, \(\left\{\rho_{k}\right\}\), é chamado de função de autocorrelação de \(r_{t}\). Para uma dada amostra de retornos de uma ação, \(\left\{r_{t}\right\}_{t=1}^{T}\), suponha que \(\overline{r}\) é a média amostral. Então, a autocorrelação amostral de primeira ordem de \(r_{t}\) é:
\[
{\hat{\rho}}_{1}=\frac{\sum _{t=2}^{T}{\left({r}_{t}-\overline{r}\right) \left({r}_{t-1}-\overline{r}\right)}}{\sum_{t=1}^{T}{{\left({r}_{t}-\overline{r}\right)}^{2}}}
\]
que é um estimador consistente de \({\rho}_{1}\). Em geral, a autocorrelação amostral de k-ésima ordem de \(r_{t}\) pode ser definida como:
\[
{\hat{\rho}}_{k}=\frac{\sum_{t=k+1}^{T}{\left({r}_{t}-\overline{r}\right) \left({r}_{t-k}-\overline{r} \right)}}{\sum_{t=1}^{T}{{\left({r}_{t}-\overline{r}\right)}^{2}}}
\] para \(0\leq k \leq T-1\).
Por exemplo, suponha que você está avaliando uma série temporal qualquer e quer visualizar como as defasagens da série podem impactar seu valor atual (ou seja, se \(r_{t}\) é relacionado com \(r_{t-k}\) para \(k\ge1\)). A função de autocorrelação pode ser usada para obter tal informação.
Num primeiro momento, visualize os dados da série para 10 defasagens. Observe que as defasagens se tornam novas colunas e na medida que elas aumentam, incrementa-se as linhas sem observações.
Agora, observe a matriz de correlações entre a série temporal e suas defasagens (aqui, apenas 10). O comportamento da correlação é evidenciado pela mudança de cor de azul para vermelho, sendo que a cor azul representa correlação positiva e vermelha negativa. Observamos que há correlação positiva para as primeiras defasagens da série temporal.
Apesar da simples correlação entre os dados nos ajudar a identificar defasagens que poderíam contribuir para o comportamento da série em \(t\), precisamos fazer uso de testes estatísticos que verifiquem a significância da relação entre o valor atual e suas defasagens. Neste sentido, a função de autocorrelação tem grande importância.
Abaixo, um exemplo de função de autocorrelação. Observe que há duas linhas horizontais que representam os limites do teste de significância sendo que valores acima ou abaixo da linha são estatisticamente significantes. Neste documento, apresentaremos o teste que é realizado.

AUTOCORRELAÇÃO PARCIAL
Em um modelo AR(1), existe uma correlação implícita entre \(y_{t}\) e \(y_{t-2}\). Isso está presente na FAC, por meio do decaimento exponencial.
Suponha que você quer modelar o retorno no instante \(t\), \(r_{t}\), como função do retorno imediatamente anterior, \(R_{t-1}\). Porém, pode existir também uma correlação implícita entre os retornos em \(t\) e \(t-2\), mas seu interesse continua sendo verificar se apenas o retorno em \(t-1\) é importante para o comportamento do retorno em \(t\).
Uma alternativa para filtrar correlações e manter-se apenas a correlação pura entre duas observações é fazer uso da correlação parcial. Formalmente, fazemos uso das seguintes regressões para cada defasagem \(j\) de interesse:
\[
{r}_{t}={\phi}_{j,1}{r}_{t-1}+{\phi}_{j,2}{r}_{t-2}+\cdot \cdot \cdot +{\phi}_{j,j}{r}_{t-j}+{\epsilon}_{t}
\]
onde \({\epsilon}_{t}\) é um erro e \(j=1,2,...\). Em outras palavras, o procedimento faz:
- Para \(j=1\): regredir \(r_{t}\) contra \(r_{t-1}\) e obter \(\hat{{\phi}}_{1,1}\)
- Para \(j=2\): regredir \(r_{t}\) contra \(r_{t-1}\) e \(r_{t-2}\) e obter \(\hat{{\phi}}_{2,1}\) e \(\hat{{\phi}}_{2,2}\), mas só interessa \(\hat{{\phi}}_{2,2}\)
- Assim por diante
No caso de uma série temporal, geramos uma função de autocorrelação parcial que será o gráfico da autocorrelação parcial contra possíveis defasagens da própria série temporal, ou seja, o gráfico de \(\hat{{\phi}}_{j,j}\) para cada \(j\) possível.
Abaixo, gráfico da FACP para a mesma série temporal que usamos para exemplificar a matriz de correlações e a FAC. Observe a diferença entre a função de autocorrelação e função de autocorrelação parcial. Enquanto a primeira mostra que há autocorrelação significante até a defasagem 12, o gráfico da função de autocorrelação parcial define que apenas 3 defasagens da série temporal realmente são importantes para modelar seu valor esperado em \(t\).

Essa avaliação das duas funções é de suma importância para a modelagem de séries temporais lineares dado que contribui para identificar a especificação correta de qual formulação econométrica usar. Neste caso específico, um modelo AR(3), \({r}_{t}={\phi}_{0}+{\phi}_{1}{r}_{t-1}+{\phi}_{2}{r}_{t-2}+{\phi}_{3}{r}_{t-3}+{a}_{t}\), deve ser uma boa especifição. Veremos maiores detalhes sobre esses modelos em próximas aulas.
TESTE SIGNIFICÂNCIA ESTATÍSTICA AUTOCORRELAÇÃO
Para um dado \(k\), os resultados da Função de Autocorrelação podem ser testados usando um teste que verifique se:
\[
\begin{aligned}
&& H_{0}: \rho_{k}=0 \\
&& H_{1}: \rho_{k}\neq 0
\end{aligned}
\] A estatística do teste será:
\[
t-ratio=\hat{\rho}_{k}\sqrt{T}
\]
A decisão do teste será rejeitar \(H_{0}\) se \(\left| t-ratio \right|>{{Z}_{\alpha}}/{{2}}\), onde \({Z}_{{\alpha}/{2}}\) é o \(100(1-{\alpha}/{2})\) percentil de uma distribuição normal.
Exemplo: tenho uma série temporal com \(516\) observações e quero testar a signifiância de \(\hat{\rho}_{12}=0.13\). Para tanto, basta fazer: \(t-ratio=\sqrt{516}*0.13=2.96\) que é maior em módulo do que o valor crítico de \(5\%\) que é \(1.96\). Conclusão: rejeitamos \(H_{0}\).
TESTAR CONJUNTAMENTE VÁRIAS AUTOCORRELAÇÕES
As estatísticas \(\hat{\rho}_{1}\), \(\hat{\rho}_{2}\), … são chamadas de FAC amostral de uma série temporal. Elas têm um papel importante na análise de séries temporais lineares. Em muitas aplicações estamos interessados em testar se várias defasagens da função de autocorrelação são iguais a 0. Box and Pierce (1970) propuseram um teste, conhecido como Ljung-Box, que foi modificado por Ljung and Box (1978) para melhorar o poder do teste em amostras finitas e é definido como:
\[
Q=T(T+2)\sum_{j=1}^{n}{\frac{{\hat{\rho}}_{j}^{2}}{T-j}}
\] que segue uma distribuição \({\chi}_{n}^{2}\) que indica \(n\) graus de liberdade. Sejam as hipóteses nulda, dada por \(H_{0}:\sum_{j=1}^{n}{\rho_{j}=0}\), e alternativa, dada por \(H_{0}:\sum_{j=1}^{n}{\rho_{j}\neq0}\), então podemos testar conjuntamente se \(j\) defasagens da função de autocorrelação são iguais a \(0\).
REFERÊNCIAS
Box, George EP, and David Pierce. 1970. “Distribution of Residual Autocorrelations in Autoregressive-Integrated Moving Average Time Series Models” 65 (332). Journal of the American statistical Association: 1509–26.
Campbell, John Y, Andrew Wen-Chuan Lo, and Archie Craig MacKinlay. 1997. The Econometrics of Financial Markets. Princeton (NJ) Princeton University Press.
Ljung, Greta M, and George EP Box. 1978. “On a Measure of Lack of Fit in Time Series Models” 65 (2). Biometrika - Oxford University Press: 297–303.
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+IDxiPkNvcnJlbGHDp8OjbywgQXV0b2NvcnJlbGHDp8OjbyBlIEF1dG9jb3JyZWxhw6fDo28gUGFyY2lhbCA8L2I+IDwvaDI+IDwvY2VudGVyPgphdXRob3I6ICI8Y2VudGVyPiBGcmFuayBNYWdhbGjDo2VzIGRlIFBpbmhvIC0gSUJNRUMvTUcgPC9jZW50ZXI+IgpsaW5rY29sb3I6IGJsdWUKb3V0cHV0OgogIGh0bWxfbm90ZWJvb2s6CiAgICBmaWdfY2FwdGlvbjogeWVzCiAgICB0aGVtZTogY2VydWxlYW4Kbm9jaXRlOiB8CiAgQHRzYXkyMDE0aW50cm9kdWN0aW9uLCBAY2FtcGJlbGwxOTk3ZWNvbm9tZXRyaWNzLCBAbW9yZXR0aW4yMDA4ZWNvbm9tZXRyaWEsIEB0c2F5MjAxMGFuYWx5c2lzLCBAYm94MTk3MGRpc3RyaWJ1dGlvbiwgQGxqdW5nMTk3OG1lYXN1cmUKcmVmZXJlbmNlczoKLSBhdXRob3I6CiAgLSBmYW1pbHk6IFRzYXkKICAgIGdpdmVuOiBSdWV5IFMKICBpZDogdHNheTIwMTRpbnRyb2R1Y3Rpb24KICBpc3N1ZWQ6CiAgICB5ZWFyOiAyMDE0CiAgcHVibGlzaGVyOiBKb2huIFdpbGV5IFwmIFNvbnMKICB0aXRsZTogQW4gaW50cm9kdWN0aW9uIHRvIGFuYWx5c2lzIG9mIGZpbmFuY2lhbCBkYXRhIHdpdGggUgogIHR5cGU6IGJvb2sKLSBhdXRob3I6CiAgLSBmYW1pbHk6IENhbXBiZWxsCiAgICBnaXZlbjogSm9obiBZCiAgLSBmYW1pbHk6IExvCiAgICBnaXZlbjogQW5kcmV3IFdlbi1DaHVhbgogIC0gZmFtaWx5OiBNYWNLaW5sYXkKICAgIGdpdmVuOiBBcmNoaWUgQ3JhaWcKICBpZDogY2FtcGJlbGwxOTk3ZWNvbm9tZXRyaWNzCiAgaXNzdWVkOgogICAgeWVhcjogMTk5NwogIHB1Ymxpc2hlcjogUHJpbmNldG9uIChOSikgUHJpbmNldG9uIFVuaXZlcnNpdHkgUHJlc3MKICB0aXRsZTogVGhlIGVjb25vbWV0cmljcyBvZiBmaW5hbmNpYWwgbWFya2V0cwogIHR5cGU6IGJvb2sKLSBhdXRob3I6CiAgLSBmYW1pbHk6IE1vcmV0dGluCiAgICBnaXZlbjogUGVkcm8gQWxiZXJ0bwogIGlkOiBtb3JldHRpbjIwMDhlY29ub21ldHJpYQogIGlzc3VlZDoKICAgIHllYXI6IDIwMDgKICBwdWJsaXNoZXI6IEVkZ2FyZCBCbHVjaGVyCiAgdGl0bGU6IEVjb25vbWV0cmlhIGZpbmFuY2VpcmEgdW0gY3Vyc28gZW0gc8OpcmllcyB0ZW1wb3JhaXMgZmluYW5jZWlyYXMKICB0eXBlOiBib29rCi0gYXV0aG9yOgogIC0gZmFtaWx5OiBUc2F5CiAgICBnaXZlbjogUnVleSBTCiAgaWQ6IHRzYXkyMDEwYW5hbHlzaXMKICBpc3N1ZWQ6CiAgICB5ZWFyOiAyMDEwCiAgcHVibGlzaGVyOiBKb2huIFdpbGV5IFwmIFNvbnMKICB0aXRsZTogQW5hbHlzaXMgb2YgZmluYW5jaWFsIHRpbWUgc2VyaWVzCiAgdHlwZTogYm9vawotIGF1dGhvcjoKICAtIGZhbWlseTogQm94CiAgICBnaXZlbjogR2VvcmdlIEVQCiAgLSBmYW1pbHk6IFBpZXJjZQogICAgZ2l2ZW46IERhdmlkCiAgaWQ6IGJveDE5NzBkaXN0cmlidXRpb24KICBpc3N1ZTogMzMyCiAgaXNzdWVkOgogICAgeWVhcjogMTk3MAogIHBhZ2U6IDE1MDktMTUyNgogIHB1Ymxpc2hlcjogSm91cm5hbCBvZiB0aGUgQW1lcmljYW4gc3RhdGlzdGljYWwgQXNzb2NpYXRpb24KICB0aXRsZTogRGlzdHJpYnV0aW9uIG9mIHJlc2lkdWFsIGF1dG9jb3JyZWxhdGlvbnMgaW4gYXV0b3JlZ3Jlc3NpdmUtaW50ZWdyYXRlZCBtb3ZpbmcKICAgIGF2ZXJhZ2UgdGltZSBzZXJpZXMgbW9kZWxzCiAgdHlwZTogYXJ0aWNsZS1qb3VybmFsCiAgdm9sdW1lOiA2NQotIGF1dGhvcjoKICAtIGZhbWlseTogTGp1bmcKICAgIGdpdmVuOiBHcmV0YSBNCiAgLSBmYW1pbHk6IEJveAogICAgZ2l2ZW46IEdlb3JnZSBFUAogIGlkOiBsanVuZzE5NzhtZWFzdXJlCiAgaXNzdWU6IDIKICBpc3N1ZWQ6CiAgICB5ZWFyOiAxOTc4CiAgcGFnZTogMjk3LTMwMwogIHB1Ymxpc2hlcjogQmlvbWV0cmlrYSAtIE94Zm9yZCBVbml2ZXJzaXR5IFByZXNzCiAgdGl0bGU6IE9uIGEgbWVhc3VyZSBvZiBsYWNrIG9mIGZpdCBpbiB0aW1lIHNlcmllcyBtb2RlbHMKICB0eXBlOiBhcnRpY2xlLWpvdXJuYWwKICB2b2x1bWU6IDY1CmdyYXBoaWNzOiB5ZXMKLS0tCgoKYGBge3IsIGVjaG89RkFMU0V9CiMgUGFjb3RlcyBuZWNlc3NhcmlvcwpzdXBwcmVzc01lc3NhZ2VzKHJlcXVpcmUoem9vKSkKc3VwcHJlc3NNZXNzYWdlcyhyZXF1aXJlKHF1YW50bW9kKSkKc3VwcHJlc3NNZXNzYWdlcyhyZXF1aXJlKERUKSkKc3VwcHJlc3NNZXNzYWdlcyhyZXF1aXJlKGRwbHlyKSkKc3VwcHJlc3NNZXNzYWdlcyhyZXF1aXJlKG1hZ3JpdHRyKSkKc3VwcHJlc3NNZXNzYWdlcyhyZXF1aXJlKGhpZ2hjaGFydGVyKSkKc3VwcHJlc3NNZXNzYWdlcyhyZXF1aXJlKFBlcmZvcm1hbmNlQW5hbHl0aWNzKSkgCnN1cHByZXNzTWVzc2FnZXMocmVxdWlyZShodG1sdG9vbHMpKQpgYGAKCkEgc8OpcmllIHRlbXBvcmFsIGRvcyByZXRvcm5vcyBkZSB1bSBhdGl2byBkZW5vdGFkYSBwb3IgJFxsZWZ0XHtyX3t0fVxyaWdodFx9X3t0PTF9XntUfSQgw6kgdW1hIGNvbGXDp8OjbyBkZSB2YXJpw6F2ZWlzIGFsZWF0w7NyaWFzIGNvbGV0YWRhcyBhbyBsb25nbyBkbyB0ZW1wbyAoZGVmaW5pw6fDo28gZGUgcHJvY2Vzc28gZXN0b2PDoXN0aWNvKS4gQSBtb2RlbGFnZW0gZWNvbm9tw6l0cmljYSBkZSBzw6lyaWVzIHRlbXBvcmFpcyB1bml2YXJpYWRhcyB0ZW0gY29tbyBvYmpldGl2byAqKmNhcHR1cmFyIGEgcmVsYcOnw6NvIGxpbmVhciBlbnRyZSoqICRyX3t0fSQgKiplIGluZm9ybWHDp8O1ZXMgZGlzcG9uw612ZWlzIGFudGVzIGRlKiogJHQkLiAKCkRlc3RhIGZvcm1hLCBvcyB2YWxvcmVzIGhpc3TDs3JpY29zIGRlICRyX3t0fSQgcG9kZW0gc2VyIMO6dGVpcyBwYXJhIG1vZGVsYXIgbyBzZXUgY29tcG9ydGFtZW50byBhbyBsb25nbyBkbyB0ZW1wby4gTmVzdGUgY2FzbywgYSAqKmNvcnJlbGHDp8OjbyBlbnRyZSBvcyByZXRvcm5vcyoqIHRlbSB1bSBwYXBlbCBpbXBvcnRhbnRlLiBDaGFtYW1vcyB0YWlzIGNvcnJlbGHDp8O1ZXMgZGUgKiphdXRvY29ycmVsYcOnw6NvKiogZSBlc3RhIMOpIHVtYSBmZXJyYW1lbnRhIGLDoXNpY2EgcGFyYSBlc3R1ZGFyIHVtYSBzw6lyaWUgdGVtcG9yYWwgZXN0YWNpb27DoXJpYS4gIAoKTmVzdGUgc2VudGlkbywgZXN0ZSBtYXRlcmlhbCB0ZW0gY29tbyBvYmpldGl2byBjb250cmlidWlyIHBhcmEgbyBlbnRlbmRpbWVudG8gc29icmUgKipjb3JyZWxhw6fDo28sIGF1dG9jb3JyZWxhw6fDo28gZSBhdXRvY29ycmVsYcOnw6NvIHBhcmNpYWwqKi4KCiMjIyMjICoqQ09SUkVMQcOHw4NPKioKCk8gY29lZmljaWVudGUgZGUgY29ycmVsYcOnw6NvIGRlIFBlYXJzb24gcXVlIG1lZGUgYSAqKmRlcGVuZMOqbmNpYSBsaW5lYXIqKiBlbnRyZSBkdWFzIHZhcmnDoXZlaXMgw6kgZGVmaW5pZG8gY29tbzoKCiQkCntccmhvfV97eCx5fT1cZnJhY3tDT1ZcbGVmdCh4LHkgXHJpZ2h0KX17XHNxcnR7VmFyXGxlZnQoeCBccmlnaHQpLFZhclxsZWZ0KHkgXHJpZ2h0KX19ID1cZnJhY3tFXGxlZnRbXGxlZnQoeC17XG11fV97eH0gXHJpZ2h0KSBcbGVmdCh5LXtcbXV9X3t5fSBccmlnaHQpICBccmlnaHRdfXtcc3FydHtFe1xsZWZ0KHgte1xtdX1fe3h9IFxyaWdodCl9XnsyfUV7XGxlZnQoeS17XG11fV97eX0gXHJpZ2h0KX1eezJ9fX0gCiQkCgpvbmRlICR7XG11fV97eH0kIGUgJHtcbXV9X3t5fSQgc8OjbyBhIG3DqWRpYSBkZSAkeCQgZSAkeSQsIHJlc3BlY3RpdmFtZW50ZS4gQWxndW1hcyBwcm9wcmllZGFkZXM6CgoqICQtMVxsZXEge1xyaG99X3t4LHl9IFxsZXEgMSQKKiAke1xyaG99X3t4LHl9PXtccmhvfV97eSx4fSQKKiAke1xyaG99X3t4LHl9PTAkIHF1YW5kbyBhcyBkdWFzIHZhcmnDoXZlaXMgbsOjbyBzw6NvIGNvcnJlbGFjaW9uYWRhCgpFeGlzdGVtIG91dHJhcyBhbHRlcm5hdGl2YXMgcGFyYSBvIGPDoWxjdWxvIGRlIGNvcnJlbGHDp8OjbyBwcm9wb3N0byBwb3IgUGVhcnNvbi4gRGVudHJlIGVsZXMgdGVtb3MgbyAkXHJobyQgZGUgU3BlYXJtYW4gZSBvICRcdGF1JCBkZSBLZW5kYWxsLiBNYWlvcmVzIGRldGFsaGVzIG5lc3RlIFtsaW5rXShodHRwOi8vd3d3LnN0YXRpc3RpY3Nzb2x1dGlvbnMuY29tL2NvcnJlbGF0aW9uLXBlYXJzb24ta2VuZGFsbC1zcGVhcm1hbi8pLgoKUXVhbmRvIHVtYSBhbW9zdHJhICRcbGVmdFx7KHhfe3R9LHlfe3R9KXx0PTEsLi4uLFRccmlnaHRcfSQgw6kgY29sZXRhZGEsIGEgY29ycmVsYcOnw6NvIHBvZGUgc2VyIG9idGlkYSBwb3Igc2V1IGVzdGltYWRvciBhbW9zdHJhbDoKCiQkCntcaGF0e1xyaG99fV97eCx5fT1cZnJhY3tcc3VtX3t0PTF9XntUfXsgXGxlZnQoe3h9X3t0fS1cb3ZlcmxpbmV7eH0gXHJpZ2h0KSBcbGVmdCh7eX1fe3R9LVxvdmVybGluZXt5fSAgXHJpZ2h0KX19eyBcc3FydHtcc3VtX3t0PTF9XntUfXt7XGxlZnQoe3h9X3t0fS1cb3ZlcmxpbmV7eH0gIFxyaWdodCl9XnsyfVxzdW0gX3t0PTF9XntUfXt7XGxlZnQoe3l9X3t0fS1cb3ZlcmxpbmV7eX0gIFxyaWdodCkgfV57Mn19fX19CiQkCgpvbmRlICRcb3ZlcmxpbmV7eH09e1xzdW1fe3Q9MX1ee1R9e3t4fV97dH19fS97VH0kIGUgJFxvdmVybGluZXt5fT17XHN1bV97dD0xfV57VH17e3l9X3t0fX19L3tUfSQgY29ycmVzcG9uZGVtIMOgIG3DqWRpYSBhbW9zdHJhbCBkZSAkeCQgZSAkeSQsIHJlc3BlY3RpdmFtZW50ZS4gTm8gZ3LDoWZpY28gYWJhaXhvLCBtb3N0cmFtb3MgZXhlbXBsb3MgZGUgdmFyacOhdmVpcyBjb3JyZWxhY2lvbmFkYXMgKHBvc2l0aXZhIGUgbmVnYXRpdmEpLgoKYGBge3IsIGVjaG89RkFMU0UsIHRpZHk9VFJVRSwgcmVzdWx0cz0nYXNpcycsIHdhcm5pbmcgPSBGQUxTRX0KZGF0YShtdGNhcnMpCgp4ID0gc2FtcGxlKDE6MjAsMjApK3Jub3JtKDEwLHNkPTIpCnkgPSB4K3Jub3JtKDEwLHNkPTMpCnogPSAoc2FtcGxlKDE6MjAsMjApLzIpK3Jub3JtKDIwLHNkPTUpCmRmID0gZGF0YS5mcmFtZSh4LHkseikKCmMxID0gaGNoYXJ0KGRmLCAic2NhdHRlciIsIGhjYWVzKHggPSB4LCB5ID0geSksIGNvbG9yID0gImJsYWNrIikgJT4lICAKICAgICAgaGNfZXhwb3J0aW5nKGVuYWJsZWQgPSBUUlVFKSAKCmMyID0gaGNoYXJ0KG10Y2FycywgInNjYXR0ZXIiLCBoY2Flcyh4ID0gd3QsIHkgPSBtcGcpLCBjb2xvciA9ICJyZWQiKSAlPiUKICAgICAgaGNfZXhwb3J0aW5nKGVuYWJsZWQgPSBUUlVFKSAKbHN0ID0gbGlzdChjMSxjMikKCmh3X2dyaWQobHN0LCByb3doZWlnaHQgPSAzMDApICAlPiUgYnJvd3NhYmxlKCkKYGBgCgoKIyMjIyMgKipGVU7Dh8ODTyBERSBBVVRPQ09SUkVMQcOHw4NPKioKCkEgZnVuw6fDo28gZGUgYXV0b2NvcnJlbGHDp8OjbyDDqSBvIGdyw6FmaWNvIGRhIGF1dG9jb3JyZWxhw6fDo28gY29udHJhIGEgZGVmYXNhZ2VtLiBDb25zaWRlcmUgdW1hIHPDqXJpZSB0ZW1wb3JhbCBkZSByZXRvcm5vcyBkZSB1bWEgYcOnw6NvICRcbGVmdFx7cl97dH1ccmlnaHRcfV97dD0xfV57VH0kLiBPIGNvZWZpY2llbnRlIGRlIGNvcnJlbGHDp8OjbyBlbnRyZSAkcl97dH0kIGUgJHJfe3Qta30kIMOpIGNoYW1hZG8gZGUgYXV0b2NvcnJlbGHDp8OjbyBkZSBrLcOpc2ltYSBvcmRlbSBlIMOpIGRlbm90YWRhZG8gcG9yOgoKJCQKe1xyaG99X3trfT1cZnJhYyB7Q292XGxlZnQoe3J9X3t0fSx7cn1fe3Qta30gXHJpZ2h0KX17XHNxcnR7VmFyXGxlZnQoe3J9X3t0fSx7cn1fe3Qta30gXHJpZ2h0KX19ID1cZnJhY3tDb3ZcbGVmdCh7cn1fe3R9LHtyfV97dC1rfSBccmlnaHQpfXtWYXJcbGVmdCh7cn1fe3R9IFxyaWdodCl9ID1cZnJhY3t7XGdhbW1hfV97a319e3tcZ2FtbWF9X3swfX0KJCQKCm9uZGUgJFZhclxsZWZ0KHtyfV97dC1rfVxyaWdodCk9VmFyXGxlZnQoe3J9X3t0fVxyaWdodCkkIHBvcnF1ZSAkcl97dH0kIMOpIGZyYWNhbWVudGUgZXN0YWNpb27DoXJpby4gQWzDqW0gZGlzc28sIHRlbW9zOgoKKiAke1xyaG99X3swfT0xJDsKKiAke1xyaG99X3tsfT17XHJob31fey1sfSQ7CiogJC0xXGxlcSB7XHJob31fe2x9IFxsZXEgMSQKClVtIGNvbmp1bnRvIGRlIGF1dG9jb3JyZWxhw6fDtWVzLCAkXGxlZnRce1xyaG9fe2t9XHJpZ2h0XH0kLCDDqSBjaGFtYWRvIGRlICoqZnVuw6fDo28gZGUgYXV0b2NvcnJlbGHDp8OjbyBkZSAkcl97dH0kKiouIFBhcmEgdW1hIGRhZGEgYW1vc3RyYSBkZSByZXRvcm5vcyBkZSB1bWEgYcOnw6NvLCAkXGxlZnRce3Jfe3R9XHJpZ2h0XH1fe3Q9MX1ee1R9JCwgc3Vwb25oYSBxdWUgJFxvdmVybGluZXtyfSQgw6kgYSBtw6lkaWEgYW1vc3RyYWwuIEVudMOjbywgYSBhdXRvY29ycmVsYcOnw6NvIGFtb3N0cmFsIGRlIHByaW1laXJhIG9yZGVtIGRlICRyX3t0fSQgw6k6CgokJAp7XGhhdHtccmhvfX1fezF9PVxmcmFje1xzdW0gX3t0PTJ9XntUfXtcbGVmdCh7cn1fe3R9LVxvdmVybGluZXtyfVxyaWdodCkgXGxlZnQoe3J9X3t0LTF9LVxvdmVybGluZXtyfVxyaWdodCl9fXtcc3VtX3t0PTF9XntUfXt7XGxlZnQoe3J9X3t0fS1cb3ZlcmxpbmV7cn1ccmlnaHQpfV57Mn19fQokJAoKcXVlIMOpIHVtIGVzdGltYWRvciBjb25zaXN0ZW50ZSBkZSAke1xyaG99X3sxfSQuIEVtIGdlcmFsLCBhIGF1dG9jb3JyZWxhw6fDo28gYW1vc3RyYWwgZGUgay3DqXNpbWEgb3JkZW0gZGUgJHJfe3R9JCBwb2RlIHNlciBkZWZpbmlkYSBjb21vOgoKJCQKe1xoYXR7XHJob319X3trfT1cZnJhY3tcc3VtX3t0PWsrMX1ee1R9e1xsZWZ0KHtyfV97dH0tXG92ZXJsaW5le3J9XHJpZ2h0KSBcbGVmdCh7cn1fe3Qta30tXG92ZXJsaW5le3J9IFxyaWdodCl9fXtcc3VtX3t0PTF9XntUfXt7XGxlZnQoe3J9X3t0fS1cb3ZlcmxpbmV7cn1ccmlnaHQpfV57Mn19fSAKJCQKcGFyYSAkMFxsZXEgayBcbGVxIFQtMSQuIAoKUG9yIGV4ZW1wbG8sIHN1cG9uaGEgcXVlIHZvY8OqIGVzdMOhIGF2YWxpYW5kbyB1bWEgc8OpcmllIHRlbXBvcmFsIHF1YWxxdWVyIGUgcXVlciB2aXN1YWxpemFyIGNvbW8gYXMgZGVmYXNhZ2VucyBkYSBzw6lyaWUgcG9kZW0gaW1wYWN0YXIgc2V1IHZhbG9yIGF0dWFsIChvdSBzZWphLCBzZSAkcl97dH0kIMOpIHJlbGFjaW9uYWRvIGNvbSAkcl97dC1rfSQgcGFyYSAka1xnZTEkKS4gQSBmdW7Dp8OjbyBkZSBhdXRvY29ycmVsYcOnw6NvIHBvZGUgc2VyIHVzYWRhIHBhcmEgb2J0ZXIgdGFsIGluZm9ybWHDp8Ojby4KCk51bSBwcmltZWlybyBtb21lbnRvLCB2aXN1YWxpemUgb3MgZGFkb3MgZGEgc8OpcmllIHBhcmEgMTAgZGVmYXNhZ2Vucy4gT2JzZXJ2ZSBxdWUgYXMgZGVmYXNhZ2VucyBzZSB0b3JuYW0gbm92YXMgY29sdW5hcyBlIG5hIG1lZGlkYSBxdWUgZWxhcyBhdW1lbnRhbSwgaW5jcmVtZW50YS1zZSBhcyBsaW5oYXMgc2VtIG9ic2VydmHDp8O1ZXMuCgpgYGB7ciwgZWNobz1GQUxTRSwgdGlkeT1UUlVFLCByZXN1bHRzPSdhc2lzJywgd2FybmluZyA9IEZBTFNFfQpmcm9tIDwtIGFzLkRhdGUoIjE5NzQtMDEtMDEiKQp0byA8LSBhcy5EYXRlKCIxOTg5LTEyLTMxIikKZGF5cyA8LSBzZXEuRGF0ZShmcm9tPWZyb20sdG89dG8sYnk9ImRheXMiKQp0aW1lc2VyaWVzIDwtIGFzLnpvbygoYXJpbWEuc2ltKGxpc3Qob3JkZXIgPSBjKDMsMCwwKSwgYXIgPSBjKDAuNSwwLjE1LDAuMDUpKSwgbiA9IDEwMDAwKSkpCmxhZ3MgPC0gTGFnKHRpbWVzZXJpZXMsIGs9MToxMCkKZmluYWwgPC0gcm91bmQoem9vOjpjYmluZC56b28odGltZXNlcmllcyxsYWdzKSwgNCkKY29sbmFtZXMoZmluYWwpIDwtIGMoImF0dWFsIiwgImxhZzEiLCAibGFnMiIsICJsYWczIiwgImxhZzQiLCAibGFnNSIsCiAgICAgICAgICAgICAgICAgICAgImxhZzYiLCAibGFnNyIsICJsYWc4IiwgImxhZzkiLCAibGFnMTAiKQpEVDo6ZGF0YXRhYmxlKGZpbmFsWzE6MTAsXSwgcm93bmFtZXMgPSBGQUxTRSwgb3B0aW9ucyA9IGxpc3QoY29sdW1uRGVmcyA9IGxpc3QobGlzdChjbGFzc05hbWUgPSAnZHQtY2VudGVyJywgdGFyZ2V0cz0iX2FsbCIpKSwgZG9tID0gJ3QnKSkKICAgICAgIApgYGAKCkFnb3JhLCBvYnNlcnZlIGEgbWF0cml6IGRlIGNvcnJlbGHDp8O1ZXMgZW50cmUgYSBzw6lyaWUgdGVtcG9yYWwgZSBzdWFzIGRlZmFzYWdlbnMgKGFxdWksIGFwZW5hcyAxMCkuIE8gY29tcG9ydGFtZW50byBkYSBjb3JyZWxhw6fDo28gw6kgZXZpZGVuY2lhZG8gcGVsYSBtdWRhbsOnYSBkZSBjb3IgZGUgYXp1bCBwYXJhIHZlcm1lbGhvLCBzZW5kbyBxdWUgYSBjb3IgYXp1bCByZXByZXNlbnRhIGNvcnJlbGHDp8OjbyBwb3NpdGl2YSBlIHZlcm1lbGhhIG5lZ2F0aXZhLiBPYnNlcnZhbW9zIHF1ZSBow6EgY29ycmVsYcOnw6NvIHBvc2l0aXZhIHBhcmEgYXMgcHJpbWVpcmFzIGRlZmFzYWdlbnMgZGEgc8OpcmllIHRlbXBvcmFsLgoKYGBge3IsIGVjaG89RkFMU0UsIHRpZHk9VFJVRSwgcmVzdWx0cz0nYXNpcycsIHdhcm5pbmcgPSBGQUxTRX0KaGNoYXJ0KGNvcihhcy5kYXRhLmZyYW1lKGZpbmFsKSwgdXNlID0gInBhaXJ3aXNlLmNvbXBsZXRlLm9icyIpKSAlPiUgaGNfZXhwb3J0aW5nKGVuYWJsZWQgPSBUUlVFKSAKYGBgCgpBcGVzYXIgZGEgc2ltcGxlcyBjb3JyZWxhw6fDo28gZW50cmUgb3MgZGFkb3Mgbm9zIGFqdWRhciBhIGlkZW50aWZpY2FyIGRlZmFzYWdlbnMgcXVlIHBvZGVyw61hbSBjb250cmlidWlyIHBhcmEgbyBjb21wb3J0YW1lbnRvIGRhIHPDqXJpZSBlbSAkdCQsIHByZWNpc2Ftb3MgZmF6ZXIgdXNvIGRlIHRlc3RlcyBlc3RhdMOtc3RpY29zIHF1ZSB2ZXJpZmlxdWVtIGEgc2lnbmlmaWPDom5jaWEgZGEgcmVsYcOnw6NvIGVudHJlIG8gdmFsb3IgYXR1YWwgZSBzdWFzIGRlZmFzYWdlbnMuIE5lc3RlIHNlbnRpZG8sIGEgZnVuw6fDo28gZGUgYXV0b2NvcnJlbGHDp8OjbyB0ZW0gZ3JhbmRlIGltcG9ydMOibmNpYS4gCgpBYmFpeG8sIHVtIGV4ZW1wbG8gZGUgKipmdW7Dp8OjbyBkZSBhdXRvY29ycmVsYcOnw6NvKiouIE9ic2VydmUgcXVlIGjDoSBkdWFzIGxpbmhhcyBob3Jpem9udGFpcyBxdWUgcmVwcmVzZW50YW0gb3MgbGltaXRlcyBkbyB0ZXN0ZSBkZSBzaWduaWZpY8OibmNpYSBzZW5kbyBxdWUgdmFsb3JlcyBhY2ltYSBvdSBhYmFpeG8gZGEgbGluaGEgc8OjbyBlc3RhdGlzdGljYW1lbnRlIHNpZ25pZmljYW50ZXMuIE5lc3RlIGRvY3VtZW50bywgYXByZXNlbnRhcmVtb3MgbyB0ZXN0ZSBxdWUgw6kgcmVhbGl6YWRvLgoKCmBgYHtyLCBlY2hvPUZBTFNFLCB0aWR5PVRSVUUsIHJlc3VsdHM9J2FzaXMnLCB3YXJuaW5nID0gRkFMU0UsIGZpZy5hbGlnbj0nY2VudGVyJywgZmlnLmhlaWdodD03fQojIENhbGN1bGFyIGEgYXV0b2NvcnJlbGHDp8OjbyAKYWNmIDwtIHN0YXRzOjphY2YodGltZXNlcmllcywgbmEuYWN0aW9uID0gbmEucGFzcywgcGxvdCA9IEZBTFNFLCBsYWcubWF4ID0gMTUpCgojIEdyw6FmaWNvIGRhIGZ1bsOnw6NvIGRlIGF1dG9jb3JyZWxhw6fDo28uIApwbG90KGFjZiwgbWFpbiA9ICIiLCB5bGFiID0gIiIsIHhsYWIgPSAiRGVmYXNhZ2VtIikKdGl0bGUoIkZ1bsOnw6NvIGRlIEF1dG9jb3JyZWxhw6fDo28gKEZBQykiLCBhZGogPSAwLjUsIGxpbmUgPSAxKQpgYGAKCiMjIyMjICoqQVVUT0NPUlJFTEHDh8ODTyBQQVJDSUFMKioKCkVtIHVtIG1vZGVsbyBBUigxKSwgZXhpc3RlIHVtYSBjb3JyZWxhw6fDo28gaW1wbMOtY2l0YSBlbnRyZSAkeV97dH0kIGUgJHlfe3QtMn0kLiBJc3NvIGVzdMOhIHByZXNlbnRlIG5hIEZBQywgcG9yIG1laW8gZG8gZGVjYWltZW50byBleHBvbmVuY2lhbC4gCgpTdXBvbmhhIHF1ZSB2b2PDqiBxdWVyIG1vZGVsYXIgbyByZXRvcm5vIG5vIGluc3RhbnRlICR0JCwgJHJfe3R9JCwgY29tbyBmdW7Dp8OjbyBkbyByZXRvcm5vIGltZWRpYXRhbWVudGUgYW50ZXJpb3IsICRSX3t0LTF9JC4gUG9yw6ltLCBwb2RlIGV4aXN0aXIgdGFtYsOpbSB1bWEgY29ycmVsYcOnw6NvIGltcGzDrWNpdGEgZW50cmUgb3MgcmV0b3Jub3MgZW0gJHQkIGUgJHQtMiQsIG1hcyBzZXUgaW50ZXJlc3NlIGNvbnRpbnVhIHNlbmRvIHZlcmlmaWNhciBzZSBhcGVuYXMgbyByZXRvcm5vIGVtICR0LTEkIMOpIGltcG9ydGFudGUgcGFyYSBvIGNvbXBvcnRhbWVudG8gZG8gcmV0b3JubyBlbSAkdCQuIAoKVW1hIGFsdGVybmF0aXZhIHBhcmEgZmlsdHJhciBjb3JyZWxhw6fDtWVzIGUgbWFudGVyLXNlIGFwZW5hcyBhICoqY29ycmVsYcOnw6NvIHB1cmEqKiBlbnRyZSBkdWFzIG9ic2VydmHDp8O1ZXMgw6kgZmF6ZXIgdXNvIGRhICoqY29ycmVsYcOnw6NvIHBhcmNpYWwqKi4gRm9ybWFsbWVudGUsIGZhemVtb3MgdXNvIGRhcyBzZWd1aW50ZXMgcmVncmVzc8O1ZXMgKipwYXJhIGNhZGEqKiBkZWZhc2FnZW0gJGokIGRlIGludGVyZXNzZToKCiQkCntyfV97dH09e1xwaGl9X3tqLDF9e3J9X3t0LTF9K3tccGhpfV97aiwyfXtyfV97dC0yfStcY2RvdCBcY2RvdCBcY2RvdCAre1xwaGl9X3tqLGp9e3J9X3t0LWp9K3tcZXBzaWxvbn1fe3R9CiQkCgpvbmRlICR7XGVwc2lsb259X3t0fSQgw6kgdW0gZXJybyBlICRqPTEsMiwuLi4kLiBFbSBvdXRyYXMgcGFsYXZyYXMsIG8gcHJvY2VkaW1lbnRvIGZhejoKCiogUGFyYSAkaj0xJDogcmVncmVkaXIgJHJfe3R9JCBjb250cmEgJHJfe3QtMX0kIGUgb2J0ZXIgJFxoYXR7e1xwaGl9fV97MSwxfSQKKiBQYXJhICRqPTIkOiByZWdyZWRpciAkcl97dH0kIGNvbnRyYSAkcl97dC0xfSQgZSAkcl97dC0yfSQgZSBvYnRlciAkXGhhdHt7XHBoaX19X3syLDF9JCBlICRcaGF0e3tccGhpfX1fezIsMn0kLCBtYXMgc8OzIGludGVyZXNzYSAkXGhhdHt7XHBoaX19X3syLDJ9JAoqIEFzc2ltIHBvciBkaWFudGUKCk5vIGNhc28gZGUgdW1hIHPDqXJpZSB0ZW1wb3JhbCwgZ2VyYW1vcyB1bWEgKipmdW7Dp8OjbyBkZSBhdXRvY29ycmVsYcOnw6NvIHBhcmNpYWwqKiBxdWUgc2Vyw6EgbyBncsOhZmljbyBkYSBhdXRvY29ycmVsYcOnw6NvIHBhcmNpYWwgY29udHJhIHBvc3PDrXZlaXMgZGVmYXNhZ2VucyBkYSBwcsOzcHJpYSBzw6lyaWUgdGVtcG9yYWwsIG91IHNlamEsIG8gZ3LDoWZpY28gZGUgJFxoYXR7e1xwaGl9fV97aixqfSQgcGFyYSBjYWRhICRqJCBwb3Nzw612ZWwuIAoKQWJhaXhvLCBncsOhZmljbyBkYSBGQUNQIHBhcmEgYSBtZXNtYSBzw6lyaWUgdGVtcG9yYWwgcXVlIHVzYW1vcyBwYXJhIGV4ZW1wbGlmaWNhciBhIG1hdHJpeiBkZSBjb3JyZWxhw6fDtWVzIGUgYSBGQUMuIE9ic2VydmUgYSBkaWZlcmVuw6dhIGVudHJlIGEgZnVuw6fDo28gZGUgYXV0b2NvcnJlbGHDp8OjbyBlIGZ1bsOnw6NvIGRlIGF1dG9jb3JyZWxhw6fDo28gcGFyY2lhbC4gRW5xdWFudG8gYSBwcmltZWlyYSBtb3N0cmEgcXVlIGjDoSBhdXRvY29ycmVsYcOnw6NvIHNpZ25pZmljYW50ZSBhdMOpIGEgZGVmYXNhZ2VtIDEyLCBvIGdyw6FmaWNvIGRhIGZ1bsOnw6NvIGRlIGF1dG9jb3JyZWxhw6fDo28gcGFyY2lhbCBkZWZpbmUgcXVlIGFwZW5hcyAzIGRlZmFzYWdlbnMgZGEgc8OpcmllIHRlbXBvcmFsIHJlYWxtZW50ZSBzw6NvIGltcG9ydGFudGVzIHBhcmEgbW9kZWxhciBzZXUgdmFsb3IgZXNwZXJhZG8gZW0gJHQkLiAKCmBgYHtyLCBlY2hvPUZBTFNFLCB0aWR5PVRSVUUsIHJlc3VsdHM9J2FzaXMnLCB3YXJuaW5nID0gRkFMU0UsIGZpZy5hbGlnbj0nY2VudGVyJywgZmlnLmhlaWdodD03fQojIENhbGN1bGFyIGEgYXV0b2NvcnJlbGHDp8OjbyBwYXJjaWFsCnBhY2YgPC0gcGFjZih0aW1lc2VyaWVzLCBuYS5hY3Rpb24gPSBuYS5wYXNzLCBwbG90ID0gRkFMU0UsIGxhZy5tYXggPSAxNSkKCiMgR3LDoWZpY28gZGEgZnVuw6fDo28gZGUgYXV0b2NvcnJlbGHDp8OjbyBwYXJjaWFsLiAKcGxvdChwYWNmLCBtYWluID0gIiIsIHlsYWIgPSAiIiwgeGxhYiA9ICJEZWZhc2FnZW0iKQp0aXRsZSgiRnVuw6fDo28gZGUgQXV0b2NvcnJlbGHDp8OjbyBQYXJjaWFsIChGQUNQKSIsIGFkaiA9IDAuNSwgbGluZSA9IDEpCmBgYAoKRXNzYSBhdmFsaWHDp8OjbyBkYXMgZHVhcyBmdW7Dp8O1ZXMgw6kgZGUgc3VtYSBpbXBvcnTDom5jaWEgcGFyYSBhIG1vZGVsYWdlbSBkZSBzw6lyaWVzIHRlbXBvcmFpcyBsaW5lYXJlcyBkYWRvIHF1ZSBjb250cmlidWkgcGFyYSBpZGVudGlmaWNhciBhIGVzcGVjaWZpY2HDp8OjbyBjb3JyZXRhIGRlIHF1YWwgZm9ybXVsYcOnw6NvIGVjb25vbcOpdHJpY2EgdXNhci4gTmVzdGUgY2FzbyBlc3BlY8OtZmljbywgdW0gbW9kZWxvIEFSKDMpLCAke3J9X3t0fT17XHBoaX1fezB9K3tccGhpfV97MX17cn1fe3QtMX0re1xwaGl9X3syfXtyfV97dC0yfSt7XHBoaX1fezN9e3J9X3t0LTN9K3thfV97dH0kLCBkZXZlIHNlciB1bWEgYm9hIGVzcGVjaWZpw6fDo28uIFZlcmVtb3MgbWFpb3JlcyBkZXRhbGhlcyBzb2JyZSBlc3NlcyBtb2RlbG9zIGVtIHByw7N4aW1hcyBhdWxhcy4KCiMjIyMgKipURVNURSBTSUdOSUZJQ8OCTkNJQSBFU1RBVMONU1RJQ0EgQVVUT0NPUlJFTEHDh8ODTyoqCgpQYXJhIHVtIGRhZG8gJGskLCBvcyByZXN1bHRhZG9zIGRhICoqRnVuw6fDo28gZGUgQXV0b2NvcnJlbGHDp8OjbyoqIHBvZGVtIHNlciB0ZXN0YWRvcyB1c2FuZG8gdW0gdGVzdGUgcXVlIHZlcmlmaXF1ZSBzZToKCiQkClxiZWdpbnthbGlnbmVkfQomJiBIX3swfTogXHJob197a309MCBcXAomJiBIX3sxfTogXHJob197a31cbmVxIDAKXGVuZHthbGlnbmVkfQokJApBIGVzdGF0w61zdGljYSBkbyB0ZXN0ZSBzZXLDoToKCiQkCnQtcmF0aW89XGhhdHtccmhvfV97a31cc3FydHtUfQokJAoKQSBkZWNpc8OjbyBkbyB0ZXN0ZSBzZXLDoSByZWplaXRhciAkSF97MH0kIHNlICRcbGVmdHwgdC1yYXRpbyBccmlnaHR8Pnt7Wn1fe1xhbHBoYX19L3t7Mn19JCwgb25kZSAke1p9X3t7XGFscGhhfS97Mn19JCDDqSBvICQxMDAoMS17XGFscGhhfS97Mn0pJCBwZXJjZW50aWwgZGUgdW1hIGRpc3RyaWJ1acOnw6NvIG5vcm1hbC4gCgoqKkV4ZW1wbG86KiogdGVuaG8gdW1hIHPDqXJpZSB0ZW1wb3JhbCBjb20gJDUxNiQgb2JzZXJ2YcOnw7VlcyBlIHF1ZXJvIHRlc3RhciBhIHNpZ25pZmnDom5jaWEgZGUgJFxoYXR7XHJob31fezEyfT0wLjEzJC4gUGFyYSB0YW50bywgYmFzdGEgZmF6ZXI6ICR0LXJhdGlvPVxzcXJ0ezUxNn0qMC4xMz0yLjk2JCBxdWUgw6kgbWFpb3IgZW0gbcOzZHVsbyBkbyBxdWUgbyB2YWxvciBjcsOtdGljbyBkZSAkNVwlJCBxdWUgw6kgJDEuOTYkLiAqKkNvbmNsdXPDo286KiogcmVqZWl0YW1vcyAkSF97MH0kLgoKIyMjIyAqKlRFU1RBUiBDT05KVU5UQU1FTlRFIFbDgVJJQVMgQVVUT0NPUlJFTEHDh8OVRVMqKgoKQXMgZXN0YXTDrXN0aWNhcyAkXGhhdHtccmhvfV97MX0kLCAkXGhhdHtccmhvfV97Mn0kLCAuLi4gc8OjbyBjaGFtYWRhcyBkZSAqKkZBQyoqIGFtb3N0cmFsIGRlIHVtYSBzw6lyaWUgdGVtcG9yYWwuIEVsYXMgdMOqbSB1bSBwYXBlbCBpbXBvcnRhbnRlIG5hIGFuw6FsaXNlIGRlIHPDqXJpZXMgdGVtcG9yYWlzIGxpbmVhcmVzLiBFbSBtdWl0YXMgYXBsaWNhw6fDtWVzIGVzdGFtb3MgaW50ZXJlc3NhZG9zIGVtIHRlc3RhciBzZSB2w6FyaWFzIGRlZmFzYWdlbnMgZGEgZnVuw6fDo28gZGUgYXV0b2NvcnJlbGHDp8OjbyBzw6NvIGlndWFpcyBhIDAuIEBib3gxOTcwZGlzdHJpYnV0aW9uIHByb3B1c2VyYW0gdW0gdGVzdGUsIGNvbmhlY2lkbyBjb21vICoqTGp1bmctQm94KiosIHF1ZSBmb2kgbW9kaWZpY2FkbyBwb3IgQGxqdW5nMTk3OG1lYXN1cmUgcGFyYSBtZWxob3JhciBvIHBvZGVyIGRvIHRlc3RlIGVtIGFtb3N0cmFzIGZpbml0YXMgZSDDqSBkZWZpbmlkbyBjb21vOgoKJCQKUT1UKFQrMilcc3VtX3tqPTF9XntufXtcZnJhY3t7XGhhdHtccmhvfX1fe2p9XnsyfX17VC1qfX0gCiQkCnF1ZSBzZWd1ZSB1bWEgZGlzdHJpYnVpw6fDo28gJHtcY2hpfV97bn1eezJ9JCBxdWUgaW5kaWNhICRuJCBncmF1cyBkZSBsaWJlcmRhZGUuIFNlamFtIGFzIGhpcMOzdGVzZXMgbnVsZGEsIGRhZGEgcG9yICRIX3swfTpcc3VtX3tqPTF9XntufXtccmhvX3tqfT0wfSQsIGUgYWx0ZXJuYXRpdmEsIGRhZGEgcG9yICRIX3swfTpcc3VtX3tqPTF9XntufXtccmhvX3tqfVxuZXEwfSQsIGVudMOjbyBwb2RlbW9zIHRlc3RhciBjb25qdW50YW1lbnRlIHNlICRqJCBkZWZhc2FnZW5zIGRhIGZ1bsOnw6NvIGRlIGF1dG9jb3JyZWxhw6fDo28gc8OjbyBpZ3VhaXMgYSAkMCQuCgojIyMjICoqUkVGRVLDik5DSUFTKio=