Introdução
Uma vez que tivermos identificado os efeitos de tendência e sazonalidade em uma série temporal, podemos remover estes efeitos antes de prosseguir com a análise. Se usarmos a decomposição aditiva, inicialmente determinamos a série com sazonalidade removida e em seguida removemos a tendência por subtração. Isso nos deixa somente com a componente aleatória. No entanto, tal componente não é necessariamente bem modelada por variáveis aleatórias independentes. Em muitos casos variáveis consecutivas são correlacionadas. Ao indentificarmos tais correlções podemos melhorar nossas previsões tanto melhor quanto maiores forem as correlações. Tais correlações devem ser estimadas para obtermos séries sintéticas realísticas. A estrutura de correlação de um modelo de série temporal é definido pela função de correlação, que é estimada a partir da série observada.
Covariância e correlação
Consideremos distribuições discretas. Denotando o valor esperado de um ensemble com variável aleatória \(X\) por \(\mu = E(X)\), a sua variância é dada por \[\begin{equation}
\sigma^2=E[(X-\mu)^2]\,.
\end{equation}\] A quantidade \(\sigma\) é chamada desvio padrão. A convariância entre duas variáveis aleatórias \(X\) e \(y\) (da mesma distribuição ou distribuições diferentes) é definida por \[\begin{equation}
\sigma_{XY}=E[(X-\mu_X)(Y-\mu_Y)]\,.
\end{equation}\]
Se temos amostras \((x_i,y_i)\) com \(N\) elementos, associadas às variáveis aleatórias \(X\) e \(Y\), a covariância amostral é dada por \[\begin{align}
s_{xy}=\frac{1}{N-1}\sum_{i=1}^{N}(x_i-\bar{x})(y_i-\bar{y})\,.
\end{align}\] Se pares de dados são colocados no gráfico, as linhas \(x=\bar{x}\) e \(y=\bar{y}\) dividem o gráfico em dois quadrantes. Pontos no quadrante esquerdo inferior têm ambos \(x_i-\bar{x}\) e \(y_i-\bar{y}\) negativos, de modo que seu produto contribui positivamente no somatório. Pontos no quadrante superior direito também dão contribuição positiva. Por outro lado, pontos no quadrante superior esquerdo e quadrante inferior direito dão contribuição negativa para a convariância.
Portanto, se \(y\) tende a aumentar quando \(x\) aumenta, a maior parte dos pontos estarão no quadrante inferior esquerdo e no quandrante superior direito e a contribuição será positiva. Inversamente, se \(y\) decresce quando \(x\) aumenta, a covariância será negativa. Se não há tal relação, a covariância será pequena relativamente aos desvios padrão de \(x\) e \(y\).
A covariância é uma medida de associação linear entre duas variáveis aleatórias. Notemos que uma associação linear não implica causalidade. Notemos ainda que se a relação entre as variáveis aleatórias é não-linear, a covariância não será sensível a tal característica. Pode haver um padrão de relação entre as variáves, mesmo que a covariância seja próxima a zero.
A
correlação entre duas variáveis aleatórias
\(X\) e
\(Y\) é uma grandeza adimensional dada por
\[
\rho_{XY}=\frac{\sigma_{XY}}{\sigma_X \sigma_Y}
\] A correlação, além de normalizar a covariância, é adimensional, pondendo, portanto, ser usada para comparar relações lineares entre variáveis aleatórias em unidades físicas diferentes. Podemos mostrar que
\[
-1\leq\rho_{XY}\leq 1\,.
\] A
correlação amostral é dada por
\[
r_{xy}=\frac{s_{xy}}{s_x s_y}\,,
\] sendo
\[
s_x^2=\frac{1}{N-1}\sum_{i=1}^N(x_i-\bar{x})^2\,,\qquad s_y^2=\frac{1}{N-1}\sum_{i=1}^N(y_i-\bar{y})^2\,.
\] Padrões típicos de correlação entre variáveis são mostrados na Fig. 1.
Fig.1 - Variáveis linearmente correlacionadas. Fonte: Ashutosh Tripathi.
Se duas variáveis aleatórias são independentes, sua correlação é aproximadamente zero. Um caso típico é mostrado na Fig. 2.
Fig.2 - Variáveis independentes.
Notemos que, por outro lado, que se a correlação é zero, isso não necessariamente implica que as variáveis sejam independentes. Isso ocorre no caso de correlação não linear, como ilustrado na Fig. 3.
Fig.3 - Exemplos de correlação não linear com coeficiente de correlação zero. Fonte: Denis Boigelot, Wikimedia Commons.
Portanto, é fundamental que qualquer conclusão baseada no cálculo de um coeficiente de correlação seja sempre baseada no correspondente scatterplot. Veja seguinte artigo para outros exemplos de diferentes scatterplots correspondentes ao mesmo número de correlação.
Exemplo 1: Função de probabilidade conjunta dada
Consideremos a distribuição definida na Fig. 4.
Fig.4 - Exemplos de correlação não linear com coeficiente de correlação zero. Fonte: Montgomery, Runger, Applied Statistics and Probability for Engineers, 6th Ed., Wiley, 2014
Podemos representar a probabilidade conjunta em termos de uma matriz:
fXY <- matrix(
c(0.2,0,0,0,0,0.1,0.1,0,0,0.1,0.1,0,0,0,0,0.4), # the data elements
nrow = 4, # number of rows
ncol = 4, # number of columns
byrow = TRUE)
fXY
[,1] [,2] [,3] [,4]
[1,] 0.2 0.0 0.0 0.0
[2,] 0.0 0.1 0.1 0.0
[3,] 0.0 0.1 0.1 0.0
[4,] 0.0 0.0 0.0 0.4
Calculemos as distribuições marginais:
fX <- colSums(fXY)
fY <- rowSums(fXY)
fX
[1] 0.2 0.2 0.2 0.4
fY
[1] 0.2 0.2 0.2 0.4
Os valores esperados para X, \(X^2\) Y, \(Y^2\) e \(XY\) são dados por
X <- 0:3; Y <- 0:3;
EX <- X%*%fX; EY <- Y%*%fY;
EX2 <- X^2%*%fX; EY2<-Y^2%*%fY;
EXY <- X%*%fXY%*%Y
EX
[,1]
[1,] 1.8
EY
[,1]
[1,] 1.8
EXY
[,1]
[1,] 4.5
Os desvios padrão associados às variáveis são dadas por
sX<-sqrt(EX2-EX^2); sY<-sqrt(EY2-EY^2);
sX
[,1]
[1,] 1.16619
sY
[,1]
[1,] 1.16619
A covariância é dada por
sXY <- EXY-EX*EY
sXY
[,1]
[1,] 1.26
Calculemos a correlação:
rXY <- sXY/(sX*sY)
rXY
[,1]
[1,] 0.9264706
Exemplo 2: Função de probabilidade conjunta dada
Se temos somente duas listas de dados, e a função de probabilidade conjunta é desconhecida, pelo princípio da razão insuficiente supomos que a matriz de probabilidades é diagonal e as probabilidades distribuídas uniformemente. Por exemplo, suponhamos que temos os dados:
X <- c(1,4,3,5,7,3,9,5);
Y <- c(2,3,4,6,6,2,8,6);
n <- length(X);
Façamos inicialmente um scatterplot:
plot(y=Y,x=X,ylab='Y',xlab='X')

Aparentemente há uma correlação linear e próxima a 1.Calculemos a covariância amostral e os desvios padrão amostrais:
sXY <- 1/(n-1)*(X-mean(X)*c(1,1,1,1,1,1,1,1)) %*% (Y-mean(Y)*c(1,1,1,1,1,1,1,1))
sX <- sqrt(1/(n-1)*(X-mean(X)*c(1,1,1,1,1,1,1,1)) %*% (X-mean(X)*c(1,1,1,1,1,1,1,1)))
sY <- sqrt(1/(n-1)*(Y-mean(Y)*c(1,1,1,1,1,1,1,1)) %*% (Y-mean(X)*c(1,1,1,1,1,1,1,1)))
sXY
[,1]
[1,] 4.982143
sX
[,1]
[1,] 2.503569
sY
[,1]
[1,] 2.199838
A correlação é então dada por
rXY <- sXY/(sX*sY)
rXY
[,1]
[1,] 0.9046196
Os resultados anteriores podem ser obtidos através dos seguintes comandos:
SXY <- cov(X,Y); SX <- sd(X); SY <- sd(Y);
SXY
[1] 4.982143
SX
[1] 2.503569
SY
[1] 2.199838
A correlação pode ser dada diretamente por
RXY <-cor(X,Y)
RXY
[1] 0.9046196
Vejamos alguns exemplos que ilustram o conceito de correlação de séries temporais.
Exemplo 3: Precipitação
Consideremos o exemplo que descreve a pricipitação anual em Los Angeles. Usaremos a biblioteca TSA que contém as funções e datasets usadas no livro “Time Series Analysis with Applications in R, 2nd. Ed.” por Jonathan Cryer e Kung-Sik Chan.
library(TSA)
Attaching package: ‘TSA’
The following objects are masked from ‘package:stats’:
acf, arima
The following object is masked from ‘package:utils’:
tar
Carregamos os dados de precipitação e fazemos um gráfico da série temporal:
data(larain);
plot(larain,ylab='Inches',xlab='Ano',type='o')

Para fins de análise e modelagem normalmente estamos interessados de dados em anos consecutivos estão ou não relacionados. Se houver uma relação entre dados históricos, possivelmente poderemos dados do ano presente para fazer predições de precipitação no ano seguinte.
Um modo de investigar tal questão é plotar pares de valores anuais consecutivos. Este tipo de gráfico é chamado scatterplot:
plot(y=larain,x=zlag(larain),ylab='Inches',xlab='Anos anteriores (Inches)')

Aqui o comando zlag foi usado para plotar o lag (atraso) do vetor larain.
A primeira impressão que obtemos deste gráfico é que há pouca ou nenhuma relação entre a precipitação de um dado mês de um ano com o anterior. Ou seja, o gráfico não mostra tendências. Dizemos que há pouca correlação entre a precipitação de um dado ano e o anterior. Do ponto de vista de predições, esta não é uma série temporal muito interessante. Calculemos medida de correlação. Definimos as séries e calculemos o seu comprimento:
y<-larain
x<-zlag(larain)
length(x)
[1] 115
A correlação entre as séries é dada por:
cor(x[2:115],y[2:115])
[1] -0.03308892
que é um valor muito pequeno, como esperado. Vejamos agora um exemplo onde existe uma correlação entre dados:
Exemplo 2: Processo químico industrial
Consideremos variáveis que medem um propriedade de cor a partir de sequências (batches) consecutivas no processo.
data(color)
plot(color,ylab='Propriedade de cor', xlab='Batch',type='o')

Agora valores vizinhos parecem estar correlacionados. Isso pode ser visto mais claramente usando o gráfico scatterplot para valores vizinhos:
plot(y=color,x=zlag(color),ylab='Propriedade de cor',xlab='Propriedade de cor do batch anterior')

Vemos que há uma leve tendência neste gráfico:
- Baixos valores em um batch tendem a ser seguidos por baixos valores no batch seguinte.
- Médios valores em um batch tendem a ser seguidos por médios valores no batch seguinte.
- Altos valores em um batch tendem a ser seguidos por altos valores no batch seguinte.
Calculemos a correlação entre dados vizinhos. Examinemos as séries:
y=color
x=zlag(color)
y
Time Series:
Start = 1
End = 35
Frequency = 1
[1] 67 63 76 66 69 71 72 71 72 72 83 87 76 79 74 81 76 77 68 68 74 68 69 75 80 81 86 86 79 78
[31] 77 77 80 76 67
x
[1] NA 67 63 76 66 69 71 72 71 72 72 83 87 76 79 74 81 76 77 68 68 74 68 69 75 80 81 86 86 79
[31] 78 77 77 80 76
Calculemos o número de elementos das séries:
length(x)
[1] 35
Calculemos a correlação entre as séries:
cor(x[2:35],y[2:35])
[1] 0.554917
Ou seja, a correlação não é muito forte mas significativa.
Exemplo 3: Abundância de lebres canadenses
Consideremos a série temporal que fornece a abundância de lebres canadenses ao longo de 30 anos:
data(hare);
plot(hare,ylab='Abundancia',xlab='Ano',type='o')

Vemos agora que grandes mudanças não ocorrem de um ano para o outro. Esta correlação entre anos vizinhos é mais claramente vista em um scatterplot:
plot(y=hare,x=zlag(hare),ylab='Abundancia',xlab='Abundancia nos anos anteriores')

Tal como no exemplo anterior, vemos que há uma tendência positiva: valores baixos de abundância em um dado ano tendem a serem seguidos por valores baixos no ano seguinte e similarmente com valores médios e altos.
Calculemos a correlação entre as duas séries temporais:
y<-hare
x<-zlag(hare)
L <-length(x)
cor(y[2:L],x[2:L])
[1] 0.7025777
Como esperado, temos uma correlação um pouco maior do que a do exemplo anterior. Vejamos
LS0tCnRpdGxlOiAiQ29ycmVsYcOnw6NvIGVudHJlICBTw6lyaWVzIFRlbXBvcmFpcyIKb3V0cHV0OiBodG1sX25vdGVib29rCmF1dGhvcjogIkZlcm5hbmRvIERlZWtlIFNhc3NlIgpmaWdfY2FwdGlvbjogeWVzCi0tLQo8aDM+SW50cm9kdcOnw6NvPC9oMz4KVW1hIHZleiBxdWUgdGl2ZXJtb3MgICBpZGVudGlmaWNhZG8gb3MgZWZlaXRvcyBkZSB0ZW5kw6puY2lhIGUgc2F6b25hbGlkYWRlIGVtIHVtYSBzw6lyaWUgdGVtcG9yYWwsIHBvZGVtb3MgcmVtb3ZlciBlc3RlcyBlZmVpdG9zIGFudGVzIGRlIHByb3NzZWd1aXIgY29tIGEgYW7DoWxpc2UuIApTZSB1c2FybW9zIGEgZGVjb21wb3Npw6fDo28gYWRpdGl2YSwgaW5pY2lhbG1lbnRlIGRldGVybWluYW1vcyBhIHPDqXJpZSBjb20gc2F6b25hbGlkYWRlIHJlbW92aWRhIGUgZW0gc2VndWlkYSByZW1vdmVtb3MgYSB0ZW5kw6puY2lhIHBvciBzdWJ0cmHDp8Ojby4gSXNzbyBub3MgZGVpeGEgc29tZW50ZSBjb20gYSBjb21wb25lbnRlIGFsZWF0w7NyaWEuIE5vIGVudGFudG8sIHRhbCBjb21wb25lbnRlIG7Do28gw6kgbmVjZXNzYXJpYW1lbnRlIGJlbSBtb2RlbGFkYSBwb3IgdmFyacOhdmVpcyBhbGVhdMOzcmlhcyBpbmRlcGVuZGVudGVzLiBFbSBtdWl0b3MgY2Fzb3MgdmFyacOhdmVpcyBjb25zZWN1dGl2YXMgc8OjbyBjb3JyZWxhY2lvbmFkYXMuIEFvIGluZGVudGlmaWNhcm1vcyB0YWlzIGNvcnJlbMOnw7VlcyBwb2RlbW9zIG1lbGhvcmFyIG5vc3NhcyBwcmV2aXPDtWVzIHRhbnRvIG1lbGhvciBxdWFudG8gbWFpb3JlcyBmb3JlbSBhcyBjb3JyZWxhw6fDtWVzLiBUYWlzIGNvcnJlbGHDp8O1ZXMgZGV2ZW0gc2VyIGVzdGltYWRhcyBwYXJhIG9idGVybW9zIHPDqXJpZXMgc2ludMOpdGljYXMgcmVhbMOtc3RpY2FzLiBBIGVzdHJ1dHVyYSBkZSBjb3JyZWxhw6fDo28gZGUgdW0gbW9kZWxvIGRlIHPDqXJpZSB0ZW1wb3JhbCDDqSBkZWZpbmlkbyBwZWxhIGZ1bsOnw6NvIGRlIGNvcnJlbGHDp8OjbywgcXVlIMOpIGVzdGltYWRhIGEgcGFydGlyIGRhIHPDqXJpZSBvYnNlcnZhZGEuICAKCjxoMz5Db3ZhcmnDom5jaWEgZSBjb3JyZWxhw6fDo288L2gzPgoKQ29uc2lkZXJlbW9zIGRpc3RyaWJ1acOnw7VlcyBkaXNjcmV0YXMuIERlbm90YW5kbyBvIHZhbG9yIGVzcGVyYWRvIGRlIHVtIGVuc2VtYmxlIGNvbSB2YXJpw6F2ZWwgYWxlYXTDs3JpYSAkWCQgcG9yICRcbXUgPSBFKFgpJCwgYSBzdWEgKnZhcmnDom5jaWEqIMOpIGRhZGEgcG9yClxiZWdpbntlcXVhdGlvbn0KXHNpZ21hXjI9RVsoWC1cbXUpXjJdXCwuClxlbmR7ZXF1YXRpb259CkEgcXVhbnRpZGFkZSAkXHNpZ21hJCDDqSBjaGFtYWRhICpkZXN2aW8gcGFkcsOjbyouIEEgKmNvbnZhcmnDom5jaWEqIGVudHJlIGR1YXMgdmFyacOhdmVpcyBhbGVhdMOzcmlhcyAkWCQgZSAkeSQgKGRhIG1lc21hIGRpc3RyaWJ1acOnw6NvIG91IGRpc3RyaWJ1acOnw7VlcyBkaWZlcmVudGVzKSDDqSBkZWZpbmlkYSBwb3IgClxiZWdpbntlcXVhdGlvbn0KXHNpZ21hX3tYWX09RVsoWC1cbXVfWCkoWS1cbXVfWSldXCwuClxlbmR7ZXF1YXRpb259CgpTZSB0ZW1vcyAgYW1vc3RyYXMgJCh4X2kseV9pKSQgY29tICROJCBlbGVtZW50b3MsIGFzc29jaWFkYXMgw6BzIHZhcmnDoXZlaXMgYWxlYXTDs3JpYXMgJFgkIGUgJFkkLCBhICpjb3ZhcmnDom5jaWEgYW1vc3RyYWwqIMOpIGRhZGEgcG9yIApcYmVnaW57YWxpZ259CnNfe3h5fT1cZnJhY3sxfXtOLTF9XHN1bV97aT0xfV57Tn0oeF9pLVxiYXJ7eH0pKHlfaS1cYmFye3l9KVwsLgpcZW5ke2FsaWdufQpTZSBwYXJlcyBkZSBkYWRvcyBzw6NvIGNvbG9jYWRvcyBubyBncsOhZmljbywgYXMgbGluaGFzICR4PVxiYXJ7eH0kIGUgJHk9XGJhcnt5fSQgZGl2aWRlbSBvIGdyw6FmaWNvIGVtIGRvaXMgcXVhZHJhbnRlcy4gUG9udG9zIG5vIHF1YWRyYW50ZSBlc3F1ZXJkbyBpbmZlcmlvciB0w6ptIGFtYm9zICR4X2ktXGJhcnt4fSQgZSAkeV9pLVxiYXJ7eX0kIG5lZ2F0aXZvcywgZGUgbW9kbyBxdWUgc2V1IHByb2R1dG8gY29udHJpYnVpIHBvc2l0aXZhbWVudGUgbm8gc29tYXTDs3Jpby4gUG9udG9zIG5vIHF1YWRyYW50ZSBzdXBlcmlvciBkaXJlaXRvIHRhbWLDqW0gZMOjbyBjb250cmlidWnDp8OjbyBwb3NpdGl2YS4gUG9yIG91dHJvIGxhZG8sIHBvbnRvcyBubyBxdWFkcmFudGUgc3VwZXJpb3IgZXNxdWVyZG8gZSBxdWFkcmFudGUgaW5mZXJpb3IgZGlyZWl0byBkw6NvIGNvbnRyaWJ1acOnw6NvIG5lZ2F0aXZhIHBhcmEgYSBjb252YXJpw6JuY2lhLgoKUG9ydGFudG8sIHNlICR5JCB0ZW5kZSBhIGF1bWVudGFyIHF1YW5kbyAkeCQgYXVtZW50YSwgYSBtYWlvciBwYXJ0ZSBkb3MgcG9udG9zIGVzdGFyw6NvIG5vIHF1YWRyYW50ZSBpbmZlcmlvciBlc3F1ZXJkbyBlIG5vIHF1YW5kcmFudGUgc3VwZXJpb3IgZGlyZWl0byBlIGEgY29udHJpYnVpw6fDo28gc2Vyw6EgcG9zaXRpdmEuIEludmVyc2FtZW50ZSwgc2UgJHkkIGRlY3Jlc2NlIHF1YW5kbyAkeCQgYXVtZW50YSwgYSBjb3ZhcmnDom5jaWEgc2Vyw6EgbmVnYXRpdmEuIFNlIG7Do28gaMOhIHRhbCByZWxhw6fDo28sIGEgY292YXJpw6JuY2lhIHNlcsOhIHBlcXVlbmEgcmVsYXRpdmFtZW50ZSBhb3MgZGVzdmlvcyBwYWRyw6NvIGRlICR4JCBlICR5JC4KCkEgY292YXJpw6JuY2lhIMOpIHVtYSBtZWRpZGEgZGUgYXNzb2NpYcOnw6NvIGxpbmVhciBlbnRyZSBkdWFzIHZhcmnDoXZlaXMgYWxlYXTDs3JpYXMuIE5vdGVtb3MgcXVlIHVtYSBhc3NvY2lhw6fDo28gbGluZWFyIG7Do28gaW1wbGljYSBjYXVzYWxpZGFkZS4gTm90ZW1vcyBhaW5kYSBxdWUgc2UgYSByZWxhw6fDo28gZW50cmUgYXMgdmFyacOhdmVpcyBhbGVhdMOzcmlhcyDDqSBuw6NvLWxpbmVhciwgYSBjb3ZhcmnDom5jaWEgbsOjbyBzZXLDoSBzZW5zw612ZWwgYSB0YWwgY2FyYWN0ZXLDrXN0aWNhLiBQb2RlIGhhdmVyIHVtIHBhZHLDo28gZGUgcmVsYcOnw6NvIGVudHJlIGFzIHZhcmnDoXZlcywgbWVzbW8gcXVlIGEgY292YXJpw6JuY2lhIHNlamEgcHLDs3hpbWEgYSB6ZXJvLiAKCkEgKmNvcnJlbGHDp8OjbyogZW50cmUgZHVhcyB2YXJpw6F2ZWlzIGFsZWF0w7NyaWFzICRYJCBlICRZJCDDqSB1bWEgZ3JhbmRlemEgYWRpbWVuc2lvbmFsIGRhZGEgcG9yIAokJApccmhvX3tYWX09XGZyYWN7XHNpZ21hX3tYWX19e1xzaWdtYV9YIFxzaWdtYV9ZfQokJApBIGNvcnJlbGHDp8OjbywgYWzDqW0gZGUgbm9ybWFsaXphciBhIGNvdmFyacOibmNpYSwgw6kgYWRpbWVuc2lvbmFsLCBwb25kZW5kbywgcG9ydGFudG8sIHNlciB1c2FkYSBwYXJhIGNvbXBhcmFyIHJlbGHDp8O1ZXMgbGluZWFyZXMgZW50cmUgdmFyacOhdmVpcyBhbGVhdMOzcmlhcyBlbSB1bmlkYWRlcyBmw61zaWNhcyBkaWZlcmVudGVzLiBQb2RlbW9zIG1vc3RyYXIgcXVlCiQkCi0xXGxlcVxyaG9fe1hZfVxsZXEgMVwsLgokJApBICpjb3JyZWxhw6fDo28gYW1vc3RyYWwqIMOpIGRhZGEgcG9yIAokJApyX3t4eX09XGZyYWN7c197eHl9fXtzX3ggc195fVwsLAokJApzZW5kbwokJApzX3heMj1cZnJhY3sxfXtOLTF9XHN1bV97aT0xfV5OKHhfaS1cYmFye3h9KV4yXCwsXHFxdWFkIHNfeV4yPVxmcmFjezF9e04tMX1cc3VtX3tpPTF9Xk4oeV9pLVxiYXJ7eX0pXjJcLC4KJCQKUGFkcsO1ZXMgdMOtcGljb3MgZGUgY29ycmVsYcOnw6NvIGVudHJlIHZhcmnDoXZlaXMgc8OjbyBtb3N0cmFkb3MgbmEgRmlnLiAxLgo8cD4KPGNlbnRlcj4KIVtQYWRyw7VlcyBkZSBjb3JyZWxhw6fDo29dKC9Vc2Vycy9mZXJuYW5kb2RlZWtlL0Ryb3Bib3gvU2Fzc2Vfc2xpZGVzL2NvcnJlbGF0aW9ucy5wbmcpPGZpZ2NhcHRpb24+RmlnLjEgLSBWYXJpw6F2ZWlzIGxpbmVhcm1lbnRlIGNvcnJlbGFjaW9uYWRhcy4gRm9udGU6IFtBc2h1dG9zaCBUcmlwYXRoaS5dKGh0dHBzOi8vYXNodXRvc2h0cmlwYXRoaS5jb20vMjAxOS8wMS8xNS9jb3ZhcmlhbmNlLWFuZC1jb3JyZWxhdGlvbi8pPC9maWdjYXB0aW9uPjwvY2VudGVyPgo8cD4KPHA+ClNlIGR1YXMgdmFyacOhdmVpcyBhbGVhdMOzcmlhcyBzw6NvIGluZGVwZW5kZW50ZXMsIHN1YSBjb3JyZWxhw6fDo28gw6kgYXByb3hpbWFkYW1lbnRlIHplcm8uIFVtIGNhc28gdMOtcGljbyDDqSBtb3N0cmFkbyBuYSBGaWcuIDIuIAo8Y2VudGVyPgohW0NvcnJlbGHDp8OjbyBudWxhXSgvVXNlcnMvZmVybmFuZG9kZWVrZS9Ecm9wYm94L1Nhc3NlX3NsaWRlcy9jb3JyZWxhdGlvbjIucG5nKXt3aWR0aD0yMCV9PC9jZW50ZXI+PGZpZ2NhcHRpb24+RmlnLjIgLSBWYXJpw6F2ZWlzIGluZGVwZW5kZW50ZXMuPC9maWdjYXB0aW9uPgo8cD4KTm90ZW1vcyBxdWUsIHBvciBvdXRybyBsYWRvLCBxdWUgc2UgYSBjb3JyZWxhw6fDo28gw6kgemVybywgaXNzbyBuw6NvIG5lY2Vzc2FyaWFtZW50ZSBpbXBsaWNhIHF1ZSBhcyB2YXJpw6F2ZWlzIHNlamFtIGluZGVwZW5kZW50ZXMuIElzc28gb2NvcnJlIG5vIGNhc28gZGUgY29ycmVsYcOnw6NvIG7Do28gbGluZWFyLCBjb21vIGlsdXN0cmFkbyBuYSBGaWcuIDMuIAo8Y2VudGVyPgohW0NvcnJlbGHDp8OjbyBudWxhXSgvVXNlcnMvZmVybmFuZG9kZWVrZS9Ecm9wYm94L1Nhc3NlX3NsaWRlcy9jb3JyZWxhdGlvbnMzLnBuZyl7d2lkdGg9MTAwJX08L2NlbnRlcj48ZmlnY2FwdGlvbj5GaWcuMyAtIEV4ZW1wbG9zIGRlIGNvcnJlbGHDp8OjbyBuw6NvIGxpbmVhciBjb20gY29lZmljaWVudGUgZGUgY29ycmVsYcOnw6NvIHplcm8uIEZvbnRlOiBbRGVuaXMgQm9pZ2Vsb3QsIFdpa2ltZWRpYSBDb21tb25zLl0oaHR0cHM6Ly9jb21tb25zLndpa2ltZWRpYS5vcmcvd2lraS9GaWxlOkNvcnJlbGF0aW9uX2V4YW1wbGVzMi5zdmcpPC9maWdjYXB0aW9uPgo8cD4KPHA+ClBvcnRhbnRvLCDDqSBmdW5kYW1lbnRhbCBxdWUgcXVhbHF1ZXIgY29uY2x1c8OjbyBiYXNlYWRhIG5vIGPDoWxjdWxvIGRlIHVtIGNvZWZpY2llbnRlIGRlIGNvcnJlbGHDp8OjbyBzZWphIHNlbXByZSBiYXNlYWRhIG5vIGNvcnJlc3BvbmRlbnRlICpzY2F0dGVycGxvdCouIFZlamEgIFtzZWd1aW50ZSBhcnRpZ29dKGh0dHBzOi8vamFuaG92ZS5naXRodWIuaW8vdGVhY2hpbmcvMjAxNi8xMS8yMS93aGF0LWNvcnJlbGF0aW9ucy1sb29rLWxpa2UpIHBhcmEgb3V0cm9zIGV4ZW1wbG9zIGRlIGRpZmVyZW50ZXMgKnNjYXR0ZXJwbG90cyogY29ycmVzcG9uZGVudGVzIGFvIG1lc21vIG7Dum1lcm8gZGUgY29ycmVsYcOnw6NvLiAKPHA+CjxoMz5FeGVtcGxvIDE6IEZ1bsOnw6NvIGRlIHByb2JhYmlsaWRhZGUgY29uanVudGEgZGFkYTwvaDM+CkNvbnNpZGVyZW1vcyBhIGRpc3RyaWJ1acOnw6NvIGRlZmluaWRhIG5hIEZpZy4gNC4KPGNlbnRlcj4KIVtFeGVtcGxvIDFdKC9Vc2Vycy9mZXJuYW5kb2RlZWtlL0Ryb3Bib3gvU2Fzc2Vfc2xpZGVzL21vbnRnb21lcnlfZXgxLnBuZyl7d2lkdGg9MzAlfTwvY2VudGVyPjxmaWdjYXB0aW9uPkZpZy40IC0gRXhlbXBsb3MgZGUgY29ycmVsYcOnw6NvIG7Do28gbGluZWFyIGNvbSBjb2VmaWNpZW50ZSBkZSBjb3JyZWxhw6fDo28gemVyby4gRm9udGU6IE1vbnRnb21lcnksIFJ1bmdlciwgQXBwbGllZCBTdGF0aXN0aWNzIGFuZCBQcm9iYWJpbGl0eSBmb3IgRW5naW5lZXJzLCA2dGggRWQuLCBXaWxleSwgMjAxNDwvZmlnY2FwdGlvbj4KCjxwPgpQb2RlbW9zIHJlcHJlc2VudGFyIGEgcHJvYmFiaWxpZGFkZSBjb25qdW50YSBlbSB0ZXJtb3MgZGUgdW1hIG1hdHJpejogCmBgYHtyfQogZlhZIDwtIG1hdHJpeCgKYygwLjIsMCwwLDAsMCwwLjEsMC4xLDAsMCwwLjEsMC4xLDAsMCwwLDAsMC40KSwgIyB0aGUgZGF0YSBlbGVtZW50cyAKbnJvdyA9IDQsICAgICAgICAgICAgICAjIG51bWJlciBvZiByb3dzIApuY29sID0gNCwgICAgICAgICAgICAgICMgbnVtYmVyIG9mIGNvbHVtbnMgCmJ5cm93ID0gVFJVRSkgCmZYWQpgYGAKPHA+CkNhbGN1bGVtb3MgYXMgZGlzdHJpYnVpw6fDtWVzIG1hcmdpbmFpczoKYGBge3J9CmZYIDwtIGNvbFN1bXMoZlhZKQpmWSA8LSByb3dTdW1zKGZYWSkKZlgKZlkKYGBgCjxwPgpPcyB2YWxvcmVzIGVzcGVyYWRvcyBwYXJhIFgsICRYXjIkIFksICAkWV4yJCBlICRYWSQgc8OjbyBkYWRvcyBwb3IKYGBge3J9ClggPC0gMDozOyBZIDwtIDA6MzsKRVggPC0gWCUqJWZYOyBFWSA8LSBZJSolZlk7CkVYMiA8LSBYXjIlKiVmWDsgRVkyPC1ZXjIlKiVmWTsKRVhZIDwtIFglKiVmWFklKiVZCkVYCkVZCkVYWQpgYGAKPHA+Ck9zIGRlc3Zpb3MgcGFkcsOjbyBhc3NvY2lhZG9zIMOgcyB2YXJpw6F2ZWlzIHPDo28gZGFkYXMgcG9yCmBgYHtyfQpzWDwtc3FydChFWDItRVheMik7IHNZPC1zcXJ0KEVZMi1FWV4yKTsKc1gKc1kKYGBgCjxwPgpBIGNvdmFyacOibmNpYSDDqSBkYWRhIHBvciAKYGBge3J9CnNYWSA8LSBFWFktRVgqRVkKc1hZCmBgYApDYWxjdWxlbW9zIGEgY29ycmVsYcOnw6NvOiAKYGBge3J9CnJYWSA8LSBzWFkvKHNYKnNZKQpyWFkKYGBgCjxwPgoKCjxoMz5FeGVtcGxvIDI6IEZ1bsOnw6NvIGRlIHByb2JhYmlsaWRhZGUgY29uanVudGEgZGFkYTwvaDM+ClNlIHRlbW9zIHNvbWVudGUgZHVhcyBsaXN0YXMgZGUgZGFkb3MsIGUgYSBmdW7Dp8OjbyBkZSBwcm9iYWJpbGlkYWRlIGNvbmp1bnRhIMOpIGRlc2NvbmhlY2lkYSwgcGVsbyBwcmluY8OtcGlvIGRhIHJhesOjbyBpbnN1ZmljaWVudGUgc3Vwb21vcyBxdWUgYSBtYXRyaXogZGUgcHJvYmFiaWxpZGFkZXMgw6kgZGlhZ29uYWwgZSBhcyBwcm9iYWJpbGlkYWRlcyBkaXN0cmlidcOtZGFzIHVuaWZvcm1lbWVudGUuIFBvciBleGVtcGxvLCBzdXBvbmhhbW9zIHF1ZSB0ZW1vcyBvcyBkYWRvczoKYGBge3J9ClggPC0gYygxLDQsMyw1LDcsMyw5LDUpOwpZIDwtIGMoMiwzLDQsNiw2LDIsOCw2KTsKbiA8LSBsZW5ndGgoWCk7CmBgYAo8cD4KRmHDp2Ftb3MgaW5pY2lhbG1lbnRlIHVtICpzY2F0dGVycGxvdCo6CmBgYHtyfQpwbG90KHk9WSx4PVgseWxhYj0nWScseGxhYj0nWCcpCmBgYApBcGFyZW50ZW1lbnRlIGjDoSB1bWEgY29ycmVsYcOnw6NvIGxpbmVhciBlIHByw7N4aW1hIGEgMS5DYWxjdWxlbW9zIGEgY292YXJpw6JuY2lhIGFtb3N0cmFsIGUgb3MgZGVzdmlvcyBwYWRyw6NvIGFtb3N0cmFpczoKYGBge3J9CnNYWSA8LSAxLyhuLTEpKihYLW1lYW4oWCkqYygxLDEsMSwxLDEsMSwxLDEpKSAlKiUgKFktbWVhbihZKSpjKDEsMSwxLDEsMSwxLDEsMSkpCnNYIDwtIHNxcnQoMS8obi0xKSooWC1tZWFuKFgpKmMoMSwxLDEsMSwxLDEsMSwxKSkgJSolIChYLW1lYW4oWCkqYygxLDEsMSwxLDEsMSwxLDEpKSkKc1kgPC0gc3FydCgxLyhuLTEpKihZLW1lYW4oWSkqYygxLDEsMSwxLDEsMSwxLDEpKSAlKiUgKFktbWVhbihYKSpjKDEsMSwxLDEsMSwxLDEsMSkpKQpzWFkKc1gKc1kKYGBgCjxwPgpBIGNvcnJlbGHDp8OjbyDDqSBlbnTDo28gZGFkYSBwb3IgCmBgYHtyfQpyWFkgPC0gc1hZLyhzWCpzWSkKclhZCmBgYAo8cD4gCk9zIHJlc3VsdGFkb3MgYW50ZXJpb3JlcyBwb2RlbSBzZXIgb2J0aWRvcyBhdHJhdsOpcyBkb3Mgc2VndWludGVzIGNvbWFuZG9zOgpgYGB7cn0KU1hZIDwtIGNvdihYLFkpOyBTWCA8LSBzZChYKTsgU1kgPC0gc2QoWSk7IApTWFkKU1gKU1kKYGBgCjxwPgpBIGNvcnJlbGHDp8OjbyBwb2RlIHNlciBkYWRhIGRpcmV0YW1lbnRlIHBvciAKYGBge3J9ClJYWSA8LWNvcihYLFkpClJYWQpgYGAKCgpWZWphbW9zIGFsZ3VucyBleGVtcGxvcyBxdWUgaWx1c3RyYW0gbyBjb25jZWl0byBkZSBjb3JyZWxhw6fDo28gIGRlIHPDqXJpZXMgdGVtcG9yYWlzLiAKCjxoMz5FeGVtcGxvIDM6IFByZWNpcGl0YcOnw6NvPC9oMz4KCkNvbnNpZGVyZW1vcyBvIGV4ZW1wbG8gcXVlIGRlc2NyZXZlIGEgcHJpY2lwaXRhw6fDo28gYW51YWwgZW0gTG9zIEFuZ2VsZXMuICBVc2FyZW1vcyBhIGJpYmxpb3RlY2EgVFNBIHF1ZSBjb250w6ltIGFzIGZ1bsOnw7VlcyBlICpkYXRhc2V0cyogdXNhZGFzIG5vIGxpdnJvICIqVGltZSBTZXJpZXMgQW5hbHlzaXMgd2l0aCBBcHBsaWNhdGlvbnMgaW4gUiosIDJuZC4gRWQuIiBwb3IgSm9uYXRoYW4gQ3J5ZXIgZSBLdW5nLVNpayBDaGFuLgpgYGB7cn0KbGlicmFyeShUU0EpCmBgYApDYXJyZWdhbW9zIG9zIGRhZG9zIGRlIHByZWNpcGl0YcOnw6NvIGUgZmF6ZW1vcyB1bSBncsOhZmljbyBkYSBzw6lyaWUgdGVtcG9yYWw6CmBgYHtyfQpkYXRhKGxhcmFpbik7IApwbG90KGxhcmFpbix5bGFiPSdJbmNoZXMnLHhsYWI9J0FubycsdHlwZT0nbycpCmBgYApQYXJhIGZpbnMgZGUgYW7DoWxpc2UgZSBtb2RlbGFnZW0gbm9ybWFsbWVudGUgZXN0YW1vcyBpbnRlcmVzc2Fkb3MgZGUgZGFkb3MgZW0gYW5vcyBjb25zZWN1dGl2b3MgZXN0w6NvIG91IG7Do28gcmVsYWNpb25hZG9zLiBTZSBob3V2ZXIgdW1hIHJlbGHDp8OjbyBlbnRyZSBkYWRvcyBoaXN0w7NyaWNvcywgcG9zc2l2ZWxtZW50ZSBwb2RlcmVtb3MgZGFkb3MgZG8gYW5vIHByZXNlbnRlIHBhcmEgZmF6ZXIgcHJlZGnDp8O1ZXMgZGUgcHJlY2lwaXRhw6fDo28gbm8gYW5vIHNlZ3VpbnRlLiAKClVtIG1vZG8gZGUgaW52ZXN0aWdhciB0YWwgcXVlc3TDo28gw6kgcGxvdGFyIHBhcmVzIGRlIHZhbG9yZXMgYW51YWlzIGNvbnNlY3V0aXZvcy4gRXN0ZSB0aXBvIGRlIGdyw6FmaWNvIMOpICBjaGFtYWRvICpzY2F0dGVycGxvdCo6CmBgYHtyfQpwbG90KHk9bGFyYWluLHg9emxhZyhsYXJhaW4pLHlsYWI9J0luY2hlcycseGxhYj0nQW5vcyBhbnRlcmlvcmVzIChJbmNoZXMpJykKYGBgCkFxdWkgbyBjb21hbmRvIDxzcGFuIHN0eWxlPSJmb250LWZhbWlseTpDb3VyYW50OyBmb250LXNpemU6MWVtOyI+emxhZzwvc3Bhbj4gZm9pIHVzYWRvIHBhcmEgcGxvdGFyIG8gKmxhZyogKGF0cmFzbykgZG8gdmV0b3IgPHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OkNvdXJhbnQ7IGZvbnQtc2l6ZToxZW07Ij5sYXJhaW48L3NwYW4+LiAKCkEgcHJpbWVpcmEgaW1wcmVzc8OjbyBxdWUgb2J0ZW1vcyBkZXN0ZSBncsOhZmljbyDDqSBxdWUgaMOhIHBvdWNhIG91IG5lbmh1bWEgcmVsYcOnw6NvIGVudHJlIGEgcHJlY2lwaXRhw6fDo28gZGUgdW0gZGFkbyBtw6pzIGRlIHVtIGFubyBjb20gbyBhbnRlcmlvci4gT3Ugc2VqYSwgbyBncsOhZmljbyBuw6NvIG1vc3RyYSB0ZW5kw6puY2lhcy4gRGl6ZW1vcyBxdWUgaMOhIHBvdWNhICpjb3JyZWxhw6fDo28qIGVudHJlIGEgcHJlY2lwaXRhw6fDo28gZGUgdW0gZGFkbyBhbm8gZSBvIGFudGVyaW9yLiBEbyBwb250byBkZSB2aXN0YSBkZSBwcmVkacOnw7VlcywgZXN0YSBuw6NvIMOpIHVtYSBzw6lyaWUgdGVtcG9yYWwgbXVpdG8gaW50ZXJlc3NhbnRlLiBDYWxjdWxlbW9zIG1lZGlkYSBkZSBjb3JyZWxhw6fDo28uIERlZmluaW1vcyBhcyBzw6lyaWVzIGUgY2FsY3VsZW1vcyBvIHNldSBjb21wcmltZW50bzogCmBgYHtyfQp5PC1sYXJhaW4KeDwtemxhZyhsYXJhaW4pCmxlbmd0aCh4KQpgYGAKQSBjb3JyZWxhw6fDo28gZW50cmUgYXMgc8OpcmllcyDDqSBkYWRhIHBvcjogCmBgYHtyfQpjb3IoeFsyOjExNV0seVsyOjExNV0pCmBgYApxdWUgw6kgdW0gdmFsb3IgbXVpdG8gcGVxdWVubywgY29tbyBlc3BlcmFkby4gClZlamFtb3MgYWdvcmEgdW0gZXhlbXBsbyBvbmRlIGV4aXN0ZSB1bWEgY29ycmVsYcOnw6NvIGVudHJlIGRhZG9zOiAKCjxoMz5FeGVtcGxvIDI6IFByb2Nlc3NvIHF1w61taWNvIGluZHVzdHJpYWw8L2gzPgoKQ29uc2lkZXJlbW9zIHZhcmnDoXZlaXMgcXVlIG1lZGVtIHVtIHByb3ByaWVkYWRlIGRlIGNvciBhIHBhcnRpciBkZSBzZXF1w6puY2lhcyAoKmJhdGNoZXMqKSBjb25zZWN1dGl2YXMgbm8gcHJvY2Vzc28uIApgYGB7cn0KZGF0YShjb2xvcikKcGxvdChjb2xvcix5bGFiPSdQcm9wcmllZGFkZSBkZSBjb3InLCB4bGFiPSdCYXRjaCcsdHlwZT0nbycpCmBgYApBZ29yYSB2YWxvcmVzIHZpemluaG9zIHBhcmVjZW0gZXN0YXIgY29ycmVsYWNpb25hZG9zLiBJc3NvIHBvZGUgc2VyIHZpc3RvIG1haXMgY2xhcmFtZW50ZSB1c2FuZG8gbyBncsOhZmljbyAqc2NhdHRlcnBsb3QqIHBhcmEgdmFsb3JlcyB2aXppbmhvczoKYGBge3J9CnBsb3QoeT1jb2xvcix4PXpsYWcoY29sb3IpLHlsYWI9J1Byb3ByaWVkYWRlIGRlIGNvcicseGxhYj0nUHJvcHJpZWRhZGUgZGUgY29yIGRvIGJhdGNoIGFudGVyaW9yJykKYGBgClZlbW9zIHF1ZSBow6EgdW1hIGxldmUgdGVuZMOqbmNpYSBuZXN0ZSBncsOhZmljbzogCgoqIEJhaXhvcyB2YWxvcmVzIGVtIHVtIGJhdGNoIHRlbmRlbSBhIHNlciBzZWd1aWRvcyBwb3IgYmFpeG9zIHZhbG9yZXMgbm8gYmF0Y2ggc2VndWludGUuCiogTcOpZGlvcyB2YWxvcmVzIGVtIHVtIGJhdGNoIHRlbmRlbSBhIHNlciBzZWd1aWRvcyBwb3IgbcOpZGlvcyB2YWxvcmVzIG5vIGJhdGNoIHNlZ3VpbnRlLgoqIEFsdG9zIHZhbG9yZXMgZW0gdW0gYmF0Y2ggdGVuZGVtIGEgc2VyIHNlZ3VpZG9zIHBvciBhbHRvcyB2YWxvcmVzIG5vIGJhdGNoIHNlZ3VpbnRlLgoKQ2FsY3VsZW1vcyBhIGNvcnJlbGHDp8OjbyBlbnRyZSBkYWRvcyB2aXppbmhvcy4gRXhhbWluZW1vcyBhcyBzw6lyaWVzOiAKYGBge3J9Cnk9Y29sb3IKeD16bGFnKGNvbG9yKQp5CngKYGBgCkNhbGN1bGVtb3MgbyBuw7ptZXJvIGRlIGVsZW1lbnRvcyBkYXMgc8OpcmllczogCmBgYHtyfQpsZW5ndGgoeCkKYGBgCiBDYWxjdWxlbW9zIGEgY29ycmVsYcOnw6NvIGVudHJlIGFzIHPDqXJpZXM6IApgYGB7cn0KIGNvcih4WzI6MzVdLHlbMjozNV0pCmBgYAogT3Ugc2VqYSwgYSBjb3JyZWxhw6fDo28gbsOjbyDDqSBtdWl0byBmb3J0ZSBtYXMgc2lnbmlmaWNhdGl2YS4gCiAKIDxoMz5FeGVtcGxvIDM6IEFidW5kw6JuY2lhIGRlIGxlYnJlcyBjYW5hZGVuc2VzIDwvaDM+CiBDb25zaWRlcmVtb3MgYSBzw6lyaWUgdGVtcG9yYWwgcXVlIGZvcm5lY2UgYSBhYnVuZMOibmNpYSBkZSBsZWJyZXMgY2FuYWRlbnNlcyBhbyBsb25nbyBkZSAzMCBhbm9zOgpgYGB7cn0gCmRhdGEoaGFyZSk7IApwbG90KGhhcmUseWxhYj0nQWJ1bmRhbmNpYScseGxhYj0nQW5vJyx0eXBlPSdvJykKYGBgCiBWZW1vcyBhZ29yYSBxdWUgZ3JhbmRlcyBtdWRhbsOnYXMgbsOjbyBvY29ycmVtIGRlIHVtIGFubyBwYXJhIG8gb3V0cm8uIEVzdGEgY29ycmVsYcOnw6NvIGVudHJlIGFub3Mgdml6aW5ob3Mgw6kgbWFpcyBjbGFyYW1lbnRlIHZpc3RhIGVtIHVtICpzY2F0dGVycGxvdCo6IApgYGB7cn0gCnBsb3QoeT1oYXJlLHg9emxhZyhoYXJlKSx5bGFiPSdBYnVuZGFuY2lhJyx4bGFiPSdBYnVuZGFuY2lhIG5vcyBhbm9zIGFudGVyaW9yZXMnKQpgYGAKVGFsIGNvbW8gbm8gZXhlbXBsbyBhbnRlcmlvciwgdmVtb3MgcXVlIGjDoSB1bWEgdGVuZMOqbmNpYSBwb3NpdGl2YTogdmFsb3JlcyBiYWl4b3MgZGUgYWJ1bmTDom5jaWEgZW0gdW0gZGFkbyBhbm8gdGVuZGVtIGEgc2VyZW0gc2VndWlkb3MgcG9yIHZhbG9yZXMgYmFpeG9zIG5vIGFubyBzZWd1aW50ZSBlIHNpbWlsYXJtZW50ZSBjb20gdmFsb3JlcyBtw6lkaW9zIGUgYWx0b3MuICAKCkNhbGN1bGVtb3MgYSBjb3JyZWxhw6fDo28gZW50cmUgYXMgZHVhcyBzw6lyaWVzIHRlbXBvcmFpczogCmBgYHtyfSAKeTwtaGFyZQp4PC16bGFnKGhhcmUpCkwgPC1sZW5ndGgoeCkKY29yKHlbMjpMXSx4WzI6TF0pCmBgYApDb21vIGVzcGVyYWRvLCB0ZW1vcyB1bWEgY29ycmVsYcOnw6NvIHVtIHBvdWNvIG1haW9yIGRvIHF1ZSBhIGRvIGV4ZW1wbG8gYW50ZXJpb3IuIApWZWphbW9zCgo=