1 Associação entre variáveis quantitativas

Existe correlação entre:

  • Intensidade luminosa de uma planta e seu desenvolvimento;
  • Qualidade da alimentação e o nível de colesterol no sangue;
  • Quantidade de água parada e o desenvolvimento das larvas do mosquito da dengue;
  • Reclamação de clientes e a qualidade do produto;
  • Popularidade de um governo e indicadores econômicos.

1.1 Tipos de correlação

Tipos de correlação

1.2 Gráfico de dispersão

Usado para ter visualizar uma possível relação entre X e Y, em que os pares ordenados são representados como um ponto no plano cartesiano.

Exemplo: Dados Íris de Fisher, do Estatístico britânico Ronald Fisher, com dados referentes ao comprimento e largura das pétalas de três espécies da flor íris. Este bando de dados (BD) já vem no R. Para carregá-lo basta usar a função data.

data("iris")
head(iris) # mostra as 6 primeiras linhas de um BD
##   Sepal.Length Sepal.Width Petal.Length Petal.Width Species
## 1          5.1         3.5          1.4         0.2  setosa
## 2          4.9         3.0          1.4         0.2  setosa
## 3          4.7         3.2          1.3         0.2  setosa
## 4          4.6         3.1          1.5         0.2  setosa
## 5          5.0         3.6          1.4         0.2  setosa
## 6          5.4         3.9          1.7         0.4  setosa
tail(iris) # mostra as 6 última linhas de um BD
##     Sepal.Length Sepal.Width Petal.Length Petal.Width   Species
## 145          6.7         3.3          5.7         2.5 virginica
## 146          6.7         3.0          5.2         2.3 virginica
## 147          6.3         2.5          5.0         1.9 virginica
## 148          6.5         3.0          5.2         2.0 virginica
## 149          6.2         3.4          5.4         2.3 virginica
## 150          5.9         3.0          5.1         1.8 virginica

Tudo no R pode ser feito de diversas maneiras. Apresentamos aqui duas formas de fazer um gráfico de dispersão. A primeira e mais simples e a partir da função plot.

plot(iris$Petal.Length,iris$Petal.Width)

# note que o símbolo $ seleciona a variável Petal.Length do BD iris.

Com a função plot podemos acrescentar o nosmes dos eixos X e Y, além de outras particularidades desta função. Contudo, o pacote ggplot e ggplot2 são muito mais completos e com uma infinidade de possibilidades para melhorar a visualização de um gráfico.

# Caso não tenha ainda instalado a função, use: install.packages("ggplot2").
# depois basta carregar pacote e usar suas funções:

library(ggplot2)
ggplot(iris, aes(y = Petal.Length, x = Petal.Width)) +
geom_point()+
xlab("Largura das Pétalas (mm)") +
ylab("Comprimento das Pétalas (cm)")

Pode-se verificar a partir destes gráficos um certo padrão: Quanto maior a largura, maior também o comprimento das pétalas. Visualmente podemos dizer que há uma relação diretamente proporcional entres estas variáveis

1.3 Coeficiente de correlação de Pearson (1896)

Na prática os gráficos de dispersão servem para visualizar uma possível correlação entre duas variáveis quantitativas. Contudo, uma estatística que mensure tal correlação se faz necessária para realmente afirmar se as variáveis são correlacionadas ou não.

\[\begin{equation} r = \frac{n\sum xy - (\sum x)(\sum y)}{\sqrt{n\sum x^{2}-(\sum x)^{2}}\sqrt{n\sum y^{2}-(\sum y)^{2}}} \end{equation}\]

O coeficiente de correlação amostral de Pearson varia entre -1 e 1. A correlação pode ser positiva, negativa ou nula. Ela é perfeita se r = -1 ou r = 1.

Exemplo: Exemplo: As famosas cocadeiras baianas costumam produzir suas próprias quitandas. Para isso, elas cumprem a difícil tarefa de quebrar dezenas de cocos por dia. Querendo evitar trabalho desnecessário, elas desejam quebrar apenas aqueles frutos que contêm uma grande quantidade de polpa. Portanto, procedem da seguinte maneira: furam o coco, medem sua quantidade de água e, com base em sua experiência, decidem se vale a pena quebrá-lo. Como esse procedimento é impreciso, as trabalhadoras desejam a nossa ajuda. Considerando os dados apresentados na tabela abaixo, vamos ajustar um modelo adequado para predizer o volume de polpa de frutos de coco (Y) a partir de sua quantidade de água (X).

Ferreira, Eric Batista, 2020.

# inserindo os dados
polpa<-c(9.02,13.10,14.76,21.54,15.62,18.34,20.23,8.88,14.06,23.59,16.62,21.93,10.56,12.28,20.68,9.53,13.73,5.73,15.08,21.57)

agua<-c(17.87,13.75,12.72,6.98,11.01,10.48,10.19,19.11,12.72,0.45,10.67,1.59,14.91,14.14,9.40,16.23,12.74,20.64,12.34,6.44)
# colocando os dados no formato dataframe
coco = data.frame(polpa,agua)
polpa agua
9.02 17.87
13.10 13.75
14.76 12.72
21.54 6.98
15.62 11.01
18.34 10.48
20.23 10.19
8.88 19.11
14.06 12.72
23.59 0.45
16.62 10.67
21.93 1.59
10.56 14.91
12.28 14.14
20.68 9.40
9.53 16.23
13.73 12.74
5.73 20.64
15.08 12.34
21.57 6.44

Pode-se verificar a partir do gráfico que a medida que aumenta o volume de água, diminui o volume da polpa do coco. O coefiente de correlação de Pearson é forte e negativo (\(r\approx\)-0,95) - obtido a partir da função cor() -, corroborando com as conclusões feitas visualmente.

# gráfico de dispersão
ggplot(coco, aes(y = polpa, x = agua)) +
  geom_point()+
  xlab("Volume de água") + 
  ylab("Volume de polpa")

# correlação de Pearson
cor(agua,polpa)
## [1] -0.9452613

Vimos a partir do gráfico de dispersão e do coeficiente de correlação que há uma forte correlação negativa entre o volume da polpa e volume de água do coco, ou seja, quanto maior a quantidade de água, menor será o volume da polpa. Contudo, pode-se dizer que esta correlação é significativa?

Figura reproduzida de Bussab e Morettin, 2017.

1.3.1 Teste para o coeficiente de correlação

  • Hipóteses:

\(H_{0}: \rho = 0 \;\Leftrightarrow \text{(Não há correlação entre as variáveis)};\)

\(H_{1}: \rho \neq 0 \;\Leftrightarrow (\; \text{Há correlação entre as variáveis}).\)

  • Estatística de teste
\[\begin{equation} T = r\sqrt{\dfrac{n-2}{1-r^{2}}} \sim t_{n-2} \end{equation}\]

Lembre-se: o teste para o coeficiente de correlação é um teste paramétrico, portanto, precisa-se verificar esta premissa.

Para verificar a normalidade dos dados utiliza-se a função shapiro.test(). Note para ambas variáveis o valor-p foi maior que o nível de significância (usualmente \(\alpha = 0,05\)), logo, os dados são normais.

shapiro.test(polpa)
## 
##  Shapiro-Wilk normality test
## 
## data:  polpa
## W = 0.9598, p-value = 0.5399
shapiro.test(agua)
## 
##  Shapiro-Wilk normality test
## 
## data:  agua
## W = 0.96005, p-value = 0.5449

O teste para o coeficiente de correlação é feito a partir da função cor.test(). Agora sim, pode-se concluir com 95% de confiabilidade que há forte correlação negativa entre o volume de polpa e volume de água (valor-p < 0,05).

cor.test(polpa,agua)
## 
##  Pearson's product-moment correlation
## 
## data:  polpa and agua
## t = -12.29, df = 18, p-value = 3.433e-10
## alternative hypothesis: true correlation is not equal to 0
## 95 percent confidence interval:
##  -0.9784843 -0.8642575
## sample estimates:
##        cor 
## -0.9452613

2 Análise de variância - ANOVA (resumo)

Para comparação de mais de duas amostras, a ANOVA, apesar de calcular variâncias, faz comparação de médias, decompondo a variação total das unidades experimentais em duas partes: variação devida aos tratamentos; e variação devida ao acaso (ou resíduos).

Considere o modelo estatístico decomposto em duas componentes: sistemática e aleatória:

\[\begin{eqnarray} \begin{array}{c} Y = \mu + e. \end{array} \end{eqnarray}\]

Em que \(Y\) é a observação associada a uma unidade experimental; \(\mu\) é a média populacional e \(e\) é a parte aleatória. Suponha que queiramos comparar as médias de \(K\) populações, isto é:

\[\begin{eqnarray*} \begin{array}{ll} & H_{0} : \mu_{1} = \mu_{2},...,\mu_{K};\\ & H_{1} : \text{pelo menos uma das médias }\mu_{i} \text{ é diferente das demais}.\\ \end{array} \end{eqnarray*}\]

Para \(K\) amostras independentes, com \(m\) indivíduos em cada uma delas, temos

\[\begin{eqnarray} \begin{array}{c} \label{mod1} Y_{ij} = \mu_{i} + e_{ij}, \; i=1,2,...,K; \; j=1,2,...,m. \end{array} \end{eqnarray}\]

Caso \(H_{0}\) seja verdadeira, o modelo acima pode ser escrito como

\[\begin{eqnarray} \begin{array}{c} \label{mod0} Y_{ij} = \mu + e_{ij}^{*}, \; i=1,2,...,K; \; j=1,2,...,m. \end{array} \end{eqnarray}\]

Uma maneira de quantificar a parte aleatória é a partir das somas de quadrado

\[\begin{eqnarray*} \begin{array}{cc} \displaystyle \sum_{i=1}^{K}\sum_{j=1}^{m} e_{ij}^{2} = \displaystyle \sum_{i=1}^{K}\sum_{j=1}^{m} \left( Y_{ij} - \mu_{i} \right)^{2} & \text{e} \;\; \displaystyle \sum_{i=1}^{K}\sum_{j=1}^{m} (e_{ij}^{*})^{2} = \displaystyle \sum_{i=1}^{K}\sum_{j=1}^{m} \left( Y_{ij} - \mu \right)^{2}, \end{array} \end{eqnarray*}\]

em que

\[\begin{eqnarray*} \begin{array}{c} \widehat{\mu}_{i} = \dfrac{1}{m} \displaystyle \sum_{j=1}^{m} Y_{ij} = \bar{Y}_{i}, \; i = 1,...,K, \end{array} \end{eqnarray*}\]

e \[\begin{eqnarray*} \begin{array}{c} \widehat{\mu} = \dfrac{1}{mK} \displaystyle \sum_{i=1}^{K}\sum_{j=1}^{m} Y_{ij} = \bar{Y}. \end{array} \end{eqnarray*}\]

Substituindo estas estimativas nas somas de quadrados, temos a soma de quadrados dentro (SQD) e soma de quadrados total (SQT) dadas respectivamente por

\[\begin{eqnarray} \begin{array}{llll} \text{SQD} = &\displaystyle \sum_{i=1}^{K}\sum_{j=1}^{m} \left( Y_{ij} - \widehat{\mu}_{i} \right)^{2} = & \displaystyle \sum_{i=1}^{K}\sum_{j=1}^{m} \left( Y_{ij} - \bar{Y}_{i} \right)^{2} = & \displaystyle \sum_{i=1}^{K}\sum_{j=1}^{m} Y_{ij}^{2} - m\sum_{i=1}^{K}\bar{Y}^{2}_{i}; \\ \text{SQT} = &\displaystyle \sum_{i=1}^{K}\sum_{j=1}^{m} \left( Y_{ij} - \widehat{\mu} \right)^{2} = & \displaystyle \sum_{i=1}^{K}\sum_{j=1}^{m} \left( Y_{ij} - \bar{Y} \right)^{2} = & \displaystyle \sum_{i=1}^{K}\sum_{j=1}^{m} Y_{ij}^{2} - mK\bar{Y}^{2}. \end{array} \end{eqnarray}\]

Temos ainda a soma dos quadrados entre (SQE) dada por

\[\begin{eqnarray} \text{SQE} = \text{SQT} - \text{SQD} = \displaystyle m\sum_{i=1}^{K}\left( Y_{i} - \bar{Y} \right)^{2} = m\left( \displaystyle \sum_{i=1}^{K} \bar{Y}_{i}^{2} - K\bar{Y}^{2} \right). \end{eqnarray}\]

Define-se também os quadrados médios total (QMT), dentro (QMD) e entre (QME) da seguinte maneira:

\[\begin{eqnarray} \begin{array}{ll} & \text{QMT} = \dfrac{\text{SQT}}{Km-1} \\ & \text{QMD} = \dfrac{\text{SQD}}{K(m-1)} \\ & \text{QME} = \dfrac{\text{SQE}}{m-1}. \end{array} \end{eqnarray}\]

Definimos então a quantidade

\[\begin{eqnarray} F = \dfrac{\text{QME}}{\text{QMD}}, \end{eqnarray}\]

quanto maior for o valor de \(F\), maior será \(QME\) comparado a \(QMD\) e, assim, maiores as evidências contra \(H_{0}\).

2.1 Pressupostos

Dadas as seguintes suposições

  • \(Y_{ij}\) são variáveis aleatórias independentes;

  • \(Y_{ij}\) é Normal com média \(\mu_{i}\), \(i=1,2,...,K\) e \(j=1,2,...,m\);

  • todas as \(K\) populações têm variâncias iguais a \(\sigma^{2}\),

pode ser mostrado que

\[\begin{eqnarray*} F \sim F(K-1,K(m-1)), \end{eqnarray*}\]

isto é, \(F\) tem distribuição Fisher-Snedecor (ou apenas F-Snedecor) com \(K-1\) e \(K(m-1)\) graus de liberdade.

2.2 Tabela ANOVA

Fonte de variação Graus de liberdade Soma de quadrados Quadrado médio F
Entre K-1 SQE QME QME/QMD
Dentro K(m-1) SQD QMD
Total Km-1 SQT - -

2.2.1 Exemplo

A gerência de um depósito que armazena cargas aéreas de pequeno porte está estudando o peso das cargas que chegam ao seu terminal no interior de São Paulo. Usualmente, o terminal recebe 4 tipos de cargas: doméstica (D), administrativa (A), equipamentos industriais (E) e outros tipos (O). Deseja-se verificar se, em média, existem diferenças entre os pesos dos 4 tipos de cargas. Ao longo de um mês, cargas foram colhidas aleatoriamente e seus pesos foram anotados, fornecendo os dados (em kg):

D A E O
24,9 27,9 38,4 23,8
20,4 28,1 38,6 25,3
24,2 28,4 41,2 23,5
22,3 25,3 43,9 27,6
20,3 29,3 40,2 25,5
24,0 28,5 40,2 23,9
23,5 27,9 37,3 22,6

Solução

\[\begin{eqnarray*} \begin{array}{ll} &\bar{Y}_{i} = (22,8; 27,9; 40,0; 24,6) \;\;\longrightarrow\text{média de cada tratamento.}\\ & \bar{Y} = 28,2 \;\;\longrightarrow \text{média geral.} \end{array} \end{eqnarray*}\] \[\begin{eqnarray*} \begin{array}{ll} & \text{SQD} = (24,9-22,8)^{2} + (27,9-27,9)^{2} +...+(22,6 - 24,6)^{2} = 75,1 \\ & \text{SQT} = (24,9-28,2)^{2} + (27,9-28,2)^{2} +...+(22,6 - 28,2)^{2} = 1329,7 \\ & \text{SQE} = 1254,6 \end{array} \end{eqnarray*}\]
Fonte de variação Graus de liberdade Soma de quadrados Quadrado médio F Valor-p
Entre 3 1254,6 418,2 133,6 0,000
Dentro 24 75,1 3,1
Total 27 1329,7 - - -

2.3 Solução no R

Primeiramente deve-se verificar se os dados são normais a partir da função shapiro.test(). Hipóteses testadas:

\(H_{0}: \text{os dados são normais};\)

\(H_{1}: \text{caso contrário (c.c.).}\)

    # inserindo os dados
    
    D = c(24.9,20.4,24.2,22.3,20.3,24.0,23.5)
    A = c(27.9,28.1,28.4,25.3,29.3,28.5,27.9)
    E = c(38.4,38.6,41.2,43.9,40.2,40.2,37.3)
    O = c(23.8,25.3,23.5,27.6,25.5,23.9,22.6)
    
    ###
    y = c(D,A,E,O) # Variável resposta
    x = rep(c("D","A","E","O"),each=7) # Variável explicativa (categórica)
    dados1 = data.frame(y,x) # formato de banco de dados
    dados1
##       y x
## 1  24.9 D
## 2  20.4 D
## 3  24.2 D
## 4  22.3 D
## 5  20.3 D
## 6  24.0 D
## 7  23.5 D
## 8  27.9 A
## 9  28.1 A
## 10 28.4 A
## 11 25.3 A
## 12 29.3 A
## 13 28.5 A
## 14 27.9 A
## 15 38.4 E
## 16 38.6 E
## 17 41.2 E
## 18 43.9 E
## 19 40.2 E
## 20 40.2 E
## 21 37.3 E
## 22 23.8 O
## 23 25.3 O
## 24 23.5 O
## 25 27.6 O
## 26 25.5 O
## 27 23.9 O
## 28 22.6 O
  • Verificando os pressupostos:
  1. Normalidade
    # verificando a normalidade dos dados
    
    shapiro.test(D)
## 
##  Shapiro-Wilk normality test
## 
## data:  D
## W = 0.88171, p-value = 0.2341
    shapiro.test(A)
## 
##  Shapiro-Wilk normality test
## 
## data:  A
## W = 0.80417, p-value = 0.04503
    shapiro.test(E)
## 
##  Shapiro-Wilk normality test
## 
## data:  E
## W = 0.94281, p-value = 0.6642
    shapiro.test(O)
## 
##  Shapiro-Wilk normality test
## 
## data:  O
## W = 0.92972, p-value = 0.5485

Como o valor-p para todas as varáveis é maior que o nível de significância (0,05), não rejeitamos a hipótese nula e concluímos que os dados são normais.

  1. Homogenidade das variâncias

Agora a homogeneidade das variâncias com função barllet.test(), em que as hipóteses testadas são:

\(H_{0}: \sigma_{1}^{2} = \sigma_{2}^{2} = ... = \sigma_{k}^{2}; \text{(variâncias homogêneas)}\)

\(H_{1}: \text{caso contrário (c.c.).}\)

bartlett.test(y ~ x, dados1)
## 
##  Bartlett test of homogeneity of variances
## 
## data:  y by x
## Bartlett's K-squared = 1.7203, df = 3, p-value = 0.6324

Como o valor-p é maior que o nível de significância (0,05), não rejeitamos a hipótese nula e concluímos que as variâncias são homogêneas.

Observados os pressupostos podemos fazer a ANOVA a partir das funções aov(), lm() e anova(). Utilizaremos a função lm (linear models) para observarmos a ANOVA no formato mostrado anteriormente

    m1 = lm(y ~ x, dados1)
    m1.anova = anova(m1)
    m1.anova
## Analysis of Variance Table
## 
## Response: y
##           Df Sum Sq Mean Sq F value    Pr(>F)    
## x          3 1254.6  418.19  133.64 4.136e-15 ***
## Residuals 24   75.1    3.13                      
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Como o valor-p foi menor que o nível de significância, pode-se concluir que há diferenças significativas entre os tipos de cargas.

Como há diferenças significativas entre os tratamentos, podemos seguir com a análise verificando quais tratamentos diferem entre si. Para tanto usa-se o teste de Tukey a partir da função TukeyHSD().

Observe que apenas a diferença entre os tratamentos O e D não foram significativas.

    # verificando diferenças entre os 
    # tratamentos
    m2.anova = aov(m1)
    tukey = TukeyHSD(m2.anova)
    tukey
##   Tukey multiple comparisons of means
##     95% family-wise confidence level
## 
## Fit: aov(formula = m1)
## 
## $x
##           diff         lwr         upr     p adj
## D-A  -5.114286  -7.7227128  -2.5058586 0.0000827
## E-A  12.057143   9.4487158  14.6655699 0.0000000
## O-A  -3.314286  -5.9227128  -0.7058586 0.0091926
## E-D  17.171429  14.5630015  19.7798557 0.0000000
## O-D   1.800000  -0.8084271   4.4084271 0.2531057
## O-E -15.371429 -17.9798557 -12.7630015 0.0000000
    plot(tukey)

3 Regressão Linear Simples (resumo)

Imagine agora a seguinte situação: um médico deseja verificar se a idade de 20 pacientes do sexo masculino tem alguma influência na pressão arterial diastólica (P.A.D) dos mesmos.

Y (P.A.D) X (idade)
80 35
70 37
76 45
80 53
80 67
87 72
82 40
80 50
82 60
84 65
75 54
70 43
68 39
75 66
85 67
90 72
75 40
70 50
82 60
85 65

Existe relação (correlação) entre as variáveis Y e X? Se afirmativo, essa relação é fraca ou forte? Positiva ou negativa? Existindo correlação entre as variáveis, pode-se estabelecer um modelo do tipo:

\[\begin{eqnarray} \begin{array}{c}\label{reg1} Y = \beta_{0} + \beta_{1}X + e_{i}, \end{array} \end{eqnarray}\]

em que, Y é a variável dependente (ou variável resposta); X a variável independente (também chamada de explicativa ou covariável); \(\beta_{0}\) e \(\beta_{1}\) são parâmetros que devem ser estimados; e \(e_{i}\) é o erro aleatório.

A partir de métodos de estimação, pode-se chegar ao seguinte modelo

\[\begin{eqnarray} \begin{array}{c} \hat{y}_{i} = \hat{\beta}_{0} + \hat{\beta}_{1}x, \end{array} \end{eqnarray}\]

em que \(\hat{\beta}_{0}\) e \(\hat{\beta}_{1}\) são os estimadores dos parâmetros do modelo de regressão e são dados por

\[\begin{eqnarray} \begin{array}{c} \hat{\beta}_{0} = \bar{y} -\hat{\beta}_{1}\bar{x} \end{array} \end{eqnarray}\] \[\begin{eqnarray} \begin{array}{c} \hat{\beta}_{1} = \dfrac{ \sum_{i = 1}^{n}x_{i}y_{i}-n\bar{x}\bar{y}}{ \sum_{i = 1}^{n}x_{i}^{2}-n\bar{x}^{2}} \end{array} \end{eqnarray}\]

Pressupostos: os erros tem distribuição normal, ou seja, \(e_{i} \sim N(0,\sigma^{2})\) o que implica que \(Y_{i} \sim N(\beta_{0} + \beta_{1}X_{i}, \sigma^{2})\).

Para verificar se existe correlação entre as variáveis Y (P.A.D) e X (idade) do exemplo anterior a partir da análise de regressão linear simples, estaríamos testando as seguintes hipóteses:

\[\begin{eqnarray} \begin{array}{ll} H_{0}: & \text{a P.A.D dos homens não sofre alterações com a idade.} \\ H_{1}: & \text{a P.A.D dos homens é alterada com a idade.} \end{array} \end{eqnarray}\]

Ou de forma equivalente:

\[\begin{eqnarray} \begin{array}{ll} H_{0}: & \beta_{1} = 0;\\ H_{1}: & \beta_{1} \neq 0. \end{array} \end{eqnarray}\]

3.1 Solução no R

Inicialmente vamos inserir os dados e colocá-los no formato data.frame().

### inserindo os dados
    
y1 = c(80,70,76,80,80,87,82,80,82,84,75,70,68,75,85,90,75,70,82,85)

x1 = c(35,37,45,53,67,72,40,50,60,65,54,43,39,66,67,72,40,50,60,65)

dados_reg = data.frame(y1,x1) ### formato de banco de dados
dados_reg
##    y1 x1
## 1  80 35
## 2  70 37
## 3  76 45
## 4  80 53
## 5  80 67
## 6  87 72
## 7  82 40
## 8  80 50
## 9  82 60
## 10 84 65
## 11 75 54
## 12 70 43
## 13 68 39
## 14 75 66
## 15 85 67
## 16 90 72
## 17 75 40
## 18 70 50
## 19 82 60
## 20 85 65

Agora o ajuste do modelo a partir da função lm(). Note que tanto \(\beta_{0}\) quanto \(\beta_{1}\) são significativos (valor-p <0,05). Além disso, o valor da estatística F também foi significativo, desta forma rejeitamos a hipótese de nulidade e aceitamos a hopótese alternativa que indica que há regressão (\(\beta_{1} \neq 0\)).

### estimativas dos parâmetros
ajuste1 = lm(y1~x1, dados_reg) 
print(ajuste1)
## 
## Call:
## lm(formula = y1 ~ x1, data = dados_reg)
## 
## Coefficients:
## (Intercept)           x1  
##     60.2501       0.3435
summary(ajuste1) ### resumo dos ajustes do modelo
## 
## Call:
## lm(formula = y1 ~ x1, data = dados_reg)
## 
## Residuals:
##    Min     1Q Median     3Q    Max 
## -7.922 -3.399  1.139  2.118  8.009 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)    
## (Intercept) 60.25010    4.71942  12.766 1.85e-10 ***
## x1           0.34352    0.08527   4.029 0.000788 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 4.628 on 18 degrees of freedom
## Multiple R-squared:  0.4741, Adjusted R-squared:  0.4449 
## F-statistic: 16.23 on 1 and 18 DF,  p-value: 0.000788

Feito o ajuste do modelo, observado a significância dos parâmetros e da hipótese de regressão, verifica-se se os resíduos tem distribuição Normal, \(e_{i} \sim N(0,\sigma^{2}_{a})\) a partir da função shapiro.teste. Note que o nível descritivo (valor-p = 0,2675) do teste foi maior que o nível de significância (\(\alpha = 0,05\)), indicando que os resíduos são distribuídos Normalmente.

shapiro.test(residuals(ajuste1))
## 
##  Shapiro-Wilk normality test
## 
## data:  residuals(ajuste1)
## W = 0.94252, p-value = 0.2675

Podemos plotar o gráfico com os dados e a reta do modelo ajustado a partir dos seguintes comandos:

### gráfico com a reta ajustada
plot(x1,y1)
abline(ajuste1,col = "blue")

Neste caso a estatística de regressão F=16,23 foi significativa (valor-p = 0,000788). Portanto, pode-se concluir com 95% de confiabilidade que a P.A.D. aumenta a medida que avança a idade dos pacientes deste estudo.

O ``\(r^{2}\)’’ (R-square = 0,4741) é denominado de coeficiente de correlação de Pearson que varia entre -1 e 1. Este resultado mostra o grau de associação entre as variáveis X (P.A.D) e Y (idade) que neste caso é moderada e positiva.

Observa-se a partir do coeficiente de determinação ajustado (Ajusted R-square = 0,4449), que aproximadamente 44,49% da variável dependente (P.A.D.) é explicada pela variável preditiva (idade).

Em linhas gerais, pode concluir com 95% de confiabilidade que a variável idade é uma variável importante e significativa para predizer os valores da P.A.D de um paciente do sexo masculino

Como exemplo, pode-se agora estimar a pressão de um paciente com 33 anos a partir do modelo ajustado.

\[\begin{eqnarray}\nonumber \hat{y} = 60,25 + 0,34\times 33 = 71,47. \end{eqnarray}\]

Referências

LS0tDQp0aXRsZTogIkVzdGF0w61zdGljYSBCw6FzaWNhIDIgLSBCaWNhIg0KYXV0aG9yOg0KLSBuYW1lOiBVTklWRVJTSURBREUgRkVERVJBTCBETyBPRVNURSBETyBQQVLDgQ0KLSBuYW1lOiBDRU5UUk8gREUgRk9STUHDh8ODTyBJTlRFUkRJU0NJUExJTkFSDQotIG5hbWU6IEJBQ0hBUkVMQURPIElOVEVSRElTQ0lQTElOQVIgRU0gQ0nDik5DSUFTIEFNQklFTlRBSVMgDQotIG5hbWU6IFBST0YuIERSLiBERU5OSVNPTiBDQVJWQUxITw0KZGF0ZTogJzIwMjItMDctMDMnDQpvdXRwdXQ6DQogIGh0bWxfZG9jdW1lbnQ6IA0KICAgIGNvZGVfZG93bmxvYWQ6IHllcw0KICAgIGhpZ2hsaWdodDogdGV4dG1hdGUNCiAgICBudW1iZXJfc2VjdGlvbnM6IHllcw0KICAgIHRoZW1lOiBjZXJ1bGVhbg0KICAgIHRvYzogeWVzDQogICAgdG9jX2RlcHRoOiA2DQogICAgdG9jX2Zsb2F0Og0KICAgICAgY29sbGFwc2VkOiB5ZXMNCiAgICAgIHNtb290aF9zY3JvbGw6IHllcw0KICAgIGtlZXBfbWQ6IHllcw0KICBwZGZfZG9jdW1lbnQ6DQogICAgdG9jOiB5ZXMNCiAgICB0b2NfZGVwdGg6ICc2Jw0KLS0tDQoNCmBgYHtyIHNldHVwLCBpbmNsdWRlPUZBTFNFfQ0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KGVjaG8gPSBUUlVFKQ0KYGBgDQoNCmBgYHs9aHRtbH0NCjxzdHlsZT4NCmJvZHl7dGV4dC1hbGlnbjoganVzdGlmeX0NCjwvc3R5bGU+DQpgYGANCjo6OiBwcm9ncmVzcw0KOjo6IHsucHJvZ3Jlc3MtYmFyIHN0eWxlPSJ3aWR0aDogMTAwJTsifQ0KOjo6DQo6OjoNCg0KIyBBc3NvY2lhw6fDo28gZW50cmUgdmFyacOhdmVpcyBxdWFudGl0YXRpdmFzDQoNCkV4aXN0ZSBjb3JyZWxhw6fDo28gZW50cmU6DQoNCi0gICBJbnRlbnNpZGFkZSBsdW1pbm9zYSBkZSB1bWEgcGxhbnRhIGUgc2V1IGRlc2Vudm9sdmltZW50bzsNCi0gICBRdWFsaWRhZGUgZGEgYWxpbWVudGHDp8OjbyBlIG8gbsOtdmVsIGRlIGNvbGVzdGVyb2wgbm8gc2FuZ3VlOw0KLSAgIFF1YW50aWRhZGUgZGUgw6FndWEgcGFyYWRhIGUgbyBkZXNlbnZvbHZpbWVudG8gZGFzIGxhcnZhcyBkbyBtb3NxdWl0byBkYSBkZW5ndWU7DQotICAgUmVjbGFtYcOnw6NvIGRlIGNsaWVudGVzIGUgYSBxdWFsaWRhZGUgZG8gcHJvZHV0bzsNCi0gICBQb3B1bGFyaWRhZGUgZGUgdW0gZ292ZXJubyBlIGluZGljYWRvcmVzIGVjb27DtG1pY29zLg0KDQojIyBUaXBvcyBkZSBjb3JyZWxhw6fDo28NCg0KWyFbVGlwb3MgZGUgY29ycmVsYcOnw6NvXShpbWFnZXMvdGlwb3MlMjBkZSUyMGNvcnJlbGElQzMlQTclQzMlQTNvLnBuZyl7d2lkdGg9Ijc5MCJ9XShSb24lMjBlJTIwTGFyc29uLCUyMDIwMTUpDQoNCiMjIEdyw6FmaWNvIGRlIGRpc3BlcnPDo28NCg0KVXNhZG8gcGFyYSB0ZXIgdmlzdWFsaXphciB1bWEgcG9zc8OtdmVsIHJlbGHDp8OjbyBlbnRyZSBYIGUgWSwgZW0gcXVlIG9zIHBhcmVzIG9yZGVuYWRvcyBzw6NvIHJlcHJlc2VudGFkb3MgY29tbyB1bSBwb250byBubyBwbGFubyBjYXJ0ZXNpYW5vLg0KDQoqKkV4ZW1wbG86KiogRGFkb3Mgw41yaXMgZGUgRmlzaGVyLCBkbyBFc3RhdMOtc3RpY28gYnJpdMOibmljbyBSb25hbGQgRmlzaGVyLCBjb20gZGFkb3MgcmVmZXJlbnRlcyBhbyBjb21wcmltZW50byBlIGxhcmd1cmEgZGFzIHDDqXRhbGFzIGRlIHRyw6pzIGVzcMOpY2llcyBkYSBmbG9yIMOtcmlzLiBFc3RlIGJhbmRvIGRlIGRhZG9zIChCRCkgasOhIHZlbSBubyBgUmAuIFBhcmEgY2FycmVnw6EtbG8gYmFzdGEgdXNhciBhIGZ1bsOnw6NvIGBkYXRhYC4NCg0KYGBge3J9DQpkYXRhKCJpcmlzIikNCmhlYWQoaXJpcykgIyBtb3N0cmEgYXMgNiBwcmltZWlyYXMgbGluaGFzIGRlIHVtIEJEDQp0YWlsKGlyaXMpICMgbW9zdHJhIGFzIDYgw7psdGltYSBsaW5oYXMgZGUgdW0gQkQNCmBgYA0KDQpUdWRvIG5vIGBSYCBwb2RlIHNlciBmZWl0byBkZSBkaXZlcnNhcyBtYW5laXJhcy4gQXByZXNlbnRhbW9zIGFxdWkgZHVhcyBmb3JtYXMgZGUgZmF6ZXIgdW0gZ3LDoWZpY28gZGUgZGlzcGVyc8Ojby4gQSBwcmltZWlyYSBlIG1haXMgc2ltcGxlcyBlIGEgcGFydGlyIGRhIGZ1bsOnw6NvIGBwbG90YC4NCg0KYGBge3J9DQpwbG90KGlyaXMkUGV0YWwuTGVuZ3RoLGlyaXMkUGV0YWwuV2lkdGgpDQojIG5vdGUgcXVlIG8gc8OtbWJvbG8gJCBzZWxlY2lvbmEgYSB2YXJpw6F2ZWwgUGV0YWwuTGVuZ3RoIGRvIEJEIGlyaXMuDQpgYGANCg0KQ29tIGEgZnVuw6fDo28gYHBsb3RgIHBvZGVtb3MgYWNyZXNjZW50YXIgbyBub3NtZXMgZG9zIGVpeG9zIFggZSBZLCBhbMOpbSBkZSBvdXRyYXMgcGFydGljdWxhcmlkYWRlcyBkZXN0YSBmdW7Dp8Ojby4gQ29udHVkbywgbyBwYWNvdGUgYGdncGxvdGAgZSBgZ2dwbG90MmAgc8OjbyBtdWl0byBtYWlzIGNvbXBsZXRvcyBlIGNvbSB1bWEgaW5maW5pZGFkZSBkZSBwb3NzaWJpbGlkYWRlcyBwYXJhIG1lbGhvcmFyIGEgdmlzdWFsaXphw6fDo28gZGUgdW0gZ3LDoWZpY28uDQoNCmBgYHtyfQ0KIyBDYXNvIG7Do28gdGVuaGEgYWluZGEgaW5zdGFsYWRvIGEgZnVuw6fDo28sIHVzZTogaW5zdGFsbC5wYWNrYWdlcygiZ2dwbG90MiIpLg0KIyBkZXBvaXMgYmFzdGEgY2FycmVnYXIgcGFjb3RlIGUgdXNhciBzdWFzIGZ1bsOnw7VlczoNCg0KbGlicmFyeShnZ3Bsb3QyKQ0KZ2dwbG90KGlyaXMsIGFlcyh5ID0gUGV0YWwuTGVuZ3RoLCB4ID0gUGV0YWwuV2lkdGgpKSArDQpnZW9tX3BvaW50KCkrDQp4bGFiKCJMYXJndXJhIGRhcyBQw6l0YWxhcyAobW0pIikgKw0KeWxhYigiQ29tcHJpbWVudG8gZGFzIFDDqXRhbGFzIChjbSkiKQ0KYGBgDQoNClBvZGUtc2UgdmVyaWZpY2FyIGEgcGFydGlyIGRlc3RlcyBncsOhZmljb3MgdW0gY2VydG8gcGFkcsOjbzogUXVhbnRvIG1haW9yIGEgbGFyZ3VyYSwgbWFpb3IgdGFtYsOpbSBvIGNvbXByaW1lbnRvIGRhcyBww6l0YWxhcy4gVmlzdWFsbWVudGUgcG9kZW1vcyBkaXplciBxdWUgaMOhIHVtYSByZWxhw6fDo28gZGlyZXRhbWVudGUgcHJvcG9yY2lvbmFsIGVudHJlcyBlc3RhcyB2YXJpw6F2ZWlzDQoNCiMjIENvZWZpY2llbnRlIGRlIGNvcnJlbGHDp8OjbyBkZSBQZWFyc29uICgxODk2KQ0KDQpOYSBwcsOhdGljYSBvcyBncsOhZmljb3MgZGUgZGlzcGVyc8OjbyBzZXJ2ZW0gcGFyYSB2aXN1YWxpemFyIHVtYSBwb3Nzw612ZWwgY29ycmVsYcOnw6NvIGVudHJlIGR1YXMgdmFyacOhdmVpcyBxdWFudGl0YXRpdmFzLiBDb250dWRvLCB1bWEgZXN0YXTDrXN0aWNhIHF1ZSBtZW5zdXJlIHRhbCBjb3JyZWxhw6fDo28gc2UgZmF6IG5lY2Vzc8OhcmlhIHBhcmEgcmVhbG1lbnRlIGFmaXJtYXIgc2UgYXMgdmFyacOhdmVpcyBzw6NvIGNvcnJlbGFjaW9uYWRhcyBvdSBuw6NvLg0KDQpgYGB7PXRleH0NClxiZWdpbntlcXVhdGlvbn0NCnIgPSBcZnJhY3tuXHN1bSB4eSAtIChcc3VtIHgpKFxzdW0geSl9e1xzcXJ0e25cc3VtIHheezJ9LShcc3VtIHgpXnsyfX1cc3FydHtuXHN1bSB5XnsyfS0oXHN1bSB5KV57Mn19fQ0KXGVuZHtlcXVhdGlvbn0NCmBgYA0KTyBjb2VmaWNpZW50ZSBkZSBjb3JyZWxhw6fDo28gYW1vc3RyYWwgZGUgUGVhcnNvbiB2YXJpYSBlbnRyZSAtMSBlIDEuIEEgY29ycmVsYcOnw6NvIHBvZGUgc2VyIHBvc2l0aXZhLCBuZWdhdGl2YSBvdSBudWxhLiBFbGEgw6kgcGVyZmVpdGEgc2UgciA9IC0xIG91IHIgPSAxLg0KDQoqKkV4ZW1wbG86KiogRXhlbXBsbzogQXMgZmFtb3NhcyBjb2NhZGVpcmFzIGJhaWFuYXMgY29zdHVtYW0gcHJvZHV6aXIgc3VhcyBwcsOzcHJpYXMgcXVpdGFuZGFzLiBQYXJhIGlzc28sIGVsYXMgY3VtcHJlbSBhIGRpZsOtY2lsIHRhcmVmYSBkZSBxdWVicmFyIGRlemVuYXMgZGUgY29jb3MgcG9yIGRpYS4gUXVlcmVuZG8gZXZpdGFyIHRyYWJhbGhvIGRlc25lY2Vzc8OhcmlvLCBlbGFzIGRlc2VqYW0gcXVlYnJhciBhcGVuYXMgYXF1ZWxlcyBmcnV0b3MgcXVlIGNvbnTDqm0gdW1hIGdyYW5kZSBxdWFudGlkYWRlIGRlIHBvbHBhLiBQb3J0YW50bywgcHJvY2VkZW0gZGEgc2VndWludGUgbWFuZWlyYTogZnVyYW0gbyBjb2NvLCBtZWRlbSBzdWEgcXVhbnRpZGFkZSBkZSDDoWd1YSBlLCBjb20gYmFzZSBlbSBzdWEgZXhwZXJpw6puY2lhLCBkZWNpZGVtIHNlIHZhbGUgYSBwZW5hIHF1ZWJyw6EtbG8uIENvbW8gZXNzZSBwcm9jZWRpbWVudG8gw6kgaW1wcmVjaXNvLCBhcyB0cmFiYWxoYWRvcmFzIGRlc2VqYW0gYSBub3NzYSBhanVkYS4gQ29uc2lkZXJhbmRvIG9zIGRhZG9zIGFwcmVzZW50YWRvcyBuYSB0YWJlbGEgYWJhaXhvLCB2YW1vcyBhanVzdGFyIHVtIG1vZGVsbyBhZGVxdWFkbyBwYXJhIHByZWRpemVyIG8gdm9sdW1lIGRlIHBvbHBhIGRlIGZydXRvcyBkZSBjb2NvIChZKSBhIHBhcnRpciBkZSBzdWEgcXVhbnRpZGFkZSBkZSDDoWd1YSAoWCkuDQoNCipGZXJyZWlyYSwgRXJpYyBCYXRpc3RhLCAyMDIwLioNCg0KYGBge3J9DQojIGluc2VyaW5kbyBvcyBkYWRvcw0KcG9scGE8LWMoOS4wMiwxMy4xMCwxNC43NiwyMS41NCwxNS42MiwxOC4zNCwyMC4yMyw4Ljg4LDE0LjA2LDIzLjU5LDE2LjYyLDIxLjkzLDEwLjU2LDEyLjI4LDIwLjY4LDkuNTMsMTMuNzMsNS43MywxNS4wOCwyMS41NykNCg0KYWd1YTwtYygxNy44NywxMy43NSwxMi43Miw2Ljk4LDExLjAxLDEwLjQ4LDEwLjE5LDE5LjExLDEyLjcyLDAuNDUsMTAuNjcsMS41OSwxNC45MSwxNC4xNCw5LjQwLDE2LjIzLDEyLjc0LDIwLjY0LDEyLjM0LDYuNDQpDQojIGNvbG9jYW5kbyBvcyBkYWRvcyBubyBmb3JtYXRvIGRhdGFmcmFtZQ0KY29jbyA9IGRhdGEuZnJhbWUocG9scGEsYWd1YSkNCmBgYA0KDQpgYGB7ciwgZWNobz1GQUxTRX0NCmtuaXRyOjprYWJsZShjb2NvLCBhbGlnbiA9ICJjYyIpDQpgYGANCg0KUG9kZS1zZSB2ZXJpZmljYXIgYSBwYXJ0aXIgZG8gZ3LDoWZpY28gcXVlIGEgbWVkaWRhIHF1ZSBhdW1lbnRhIG8gdm9sdW1lIGRlIMOhZ3VhLCBkaW1pbnVpIG8gdm9sdW1lIGRhIHBvbHBhIGRvIGNvY28uIE8gY29lZmllbnRlIGRlIGNvcnJlbGHDp8OjbyBkZSBQZWFyc29uIMOpIGZvcnRlIGUgbmVnYXRpdm8gKCRyXGFwcHJveCQtMCw5NSkgLSBvYnRpZG8gYSBwYXJ0aXIgZGEgZnVuw6fDo28gYGNvcigpYCAtLCBjb3Jyb2JvcmFuZG8gY29tIGFzIGNvbmNsdXPDtWVzIGZlaXRhcyB2aXN1YWxtZW50ZS4NCg0KYGBge3J9DQojIGdyw6FmaWNvIGRlIGRpc3BlcnPDo28NCmdncGxvdChjb2NvLCBhZXMoeSA9IHBvbHBhLCB4ID0gYWd1YSkpICsNCiAgZ2VvbV9wb2ludCgpKw0KICB4bGFiKCJWb2x1bWUgZGUgw6FndWEiKSArIA0KICB5bGFiKCJWb2x1bWUgZGUgcG9scGEiKQ0KDQojIGNvcnJlbGHDp8OjbyBkZSBQZWFyc29uDQpjb3IoYWd1YSxwb2xwYSkNCmBgYA0KDQpWaW1vcyBhIHBhcnRpciBkbyBncsOhZmljbyBkZSBkaXNwZXJzw6NvIGUgZG8gY29lZmljaWVudGUgZGUgY29ycmVsYcOnw6NvIHF1ZSBow6EgdW1hIGZvcnRlIGNvcnJlbGHDp8OjbyBuZWdhdGl2YSBlbnRyZSBvIHZvbHVtZSBkYSBwb2xwYSBlIHZvbHVtZSBkZSDDoWd1YSBkbyBjb2NvLCBvdSBzZWphLCBxdWFudG8gbWFpb3IgYSBxdWFudGlkYWRlIGRlIMOhZ3VhLCBtZW5vciBzZXLDoSBvIHZvbHVtZSBkYSBwb2xwYS4gQ29udHVkbywgcG9kZS1zZSBkaXplciBxdWUgZXN0YSBjb3JyZWxhw6fDo28gw6kgc2lnbmlmaWNhdGl2YT8NCg0KIVtGaWd1cmEgcmVwcm9kdXppZGEgZGUgQnVzc2FiIGUgTW9yZXR0aW4sIDIwMTcuXShpbWFnZXMvcmhvJTIwZSUyMHIucG5nKQ0KDQojIyMgVGVzdGUgcGFyYSBvIGNvZWZpY2llbnRlIGRlIGNvcnJlbGHDp8Ojbw0KDQotICAgKipIaXDDs3Rlc2VzOioqDQoNCiRIX3swfTogXHJobyA9IDAgXDtcTGVmdHJpZ2h0YXJyb3cgXHRleHR7KE7Do28gaMOhIGNvcnJlbGHDp8OjbyBlbnRyZSBhcyB2YXJpw6F2ZWlzKX07JA0KDQokSF97MX06IFxyaG8gXG5lcSAwIFw7XExlZnRyaWdodGFycm93IChcOyBcdGV4dHtIw6EgY29ycmVsYcOnw6NvIGVudHJlIGFzIHZhcmnDoXZlaXN9KS4kDQoNCi0gICAqKkVzdGF0w61zdGljYSBkZSB0ZXN0ZSoqDQoNCmBgYHs9dGV4fQ0KXGJlZ2lue2VxdWF0aW9ufQ0KVCA9IHJcc3FydHtcZGZyYWN7bi0yfXsxLXJeezJ9fX0gXHNpbSB0X3tuLTJ9DQpcZW5ke2VxdWF0aW9ufQ0KYGBgDQoqTGVtYnJlLXNlKjogbyB0ZXN0ZSBwYXJhIG8gY29lZmljaWVudGUgZGUgY29ycmVsYcOnw6NvIMOpIHVtIHRlc3RlIHBhcmFtw6l0cmljbywgcG9ydGFudG8sIHByZWNpc2Etc2UgdmVyaWZpY2FyIGVzdGEgcHJlbWlzc2EuDQoNClBhcmEgdmVyaWZpY2FyIGEgbm9ybWFsaWRhZGUgZG9zIGRhZG9zIHV0aWxpemEtc2UgYSBmdW7Dp8OjbyBgc2hhcGlyby50ZXN0KClgLiBOb3RlIHBhcmEgYW1iYXMgdmFyacOhdmVpcyBvIHZhbG9yLXAgZm9pIG1haW9yIHF1ZSBvIG7DrXZlbCBkZSBzaWduaWZpY8OibmNpYSAodXN1YWxtZW50ZSAkXGFscGhhID0gMCwwNSQpLCBsb2dvLCBvcyBkYWRvcyBzw6NvIG5vcm1haXMuDQoNCmBgYHtyfQ0Kc2hhcGlyby50ZXN0KHBvbHBhKQ0Kc2hhcGlyby50ZXN0KGFndWEpDQpgYGANCg0KTyB0ZXN0ZSBwYXJhIG8gY29lZmljaWVudGUgZGUgY29ycmVsYcOnw6NvIMOpIGZlaXRvIGEgcGFydGlyIGRhIGZ1bsOnw6NvIGBjb3IudGVzdCgpYC4gQWdvcmEgc2ltLCBwb2RlLXNlIGNvbmNsdWlyIGNvbSA5NSUgZGUgY29uZmlhYmlsaWRhZGUgcXVlIGjDoSBmb3J0ZSBjb3JyZWxhw6fDo28gbmVnYXRpdmEgZW50cmUgbyB2b2x1bWUgZGUgcG9scGEgZSB2b2x1bWUgZGUgw6FndWEgKHZhbG9yLXAgXDwgMCwwNSkuDQoNCmBgYHtyfQ0KY29yLnRlc3QocG9scGEsYWd1YSkNCmBgYA0KDQojIEFuw6FsaXNlIGRlIHZhcmnDom5jaWEgLSBBTk9WQSAocmVzdW1vKQ0KDQpQYXJhIGNvbXBhcmHDp8OjbyBkZSBtYWlzIGRlIGR1YXMgYW1vc3RyYXMsIGEgQU5PVkEsIGFwZXNhciBkZSBjYWxjdWxhciB2YXJpw6JuY2lhcywgZmF6IGNvbXBhcmHDp8OjbyBkZSBtw6lkaWFzLCBkZWNvbXBvbmRvIGEgdmFyaWHDp8OjbyB0b3RhbCBkYXMgdW5pZGFkZXMgZXhwZXJpbWVudGFpcyBlbSBkdWFzIHBhcnRlczogdmFyaWHDp8OjbyBkZXZpZGEgYW9zIHRyYXRhbWVudG9zOyBlIHZhcmlhw6fDo28gZGV2aWRhIGFvIGFjYXNvIChvdSByZXPDrWR1b3MpLg0KDQpDb25zaWRlcmUgbyBtb2RlbG8gZXN0YXTDrXN0aWNvIGRlY29tcG9zdG8gZW0gZHVhcyBjb21wb25lbnRlczogc2lzdGVtw6F0aWNhIGUgYWxlYXTDs3JpYToNCg0KYGBgez10ZXh9DQpcYmVnaW57ZXFuYXJyYXl9IA0KXGJlZ2lue2FycmF5fXtjfQ0KWSA9IFxtdSArIGUuDQpcZW5ke2FycmF5fSANClxlbmR7ZXFuYXJyYXl9DQpgYGANCkVtIHF1ZSAkWSQgw6kgYSBvYnNlcnZhw6fDo28gYXNzb2NpYWRhIGEgdW1hIHVuaWRhZGUgZXhwZXJpbWVudGFsOyAkXG11JCDDqSBhIG3DqWRpYSBwb3B1bGFjaW9uYWwgZSAkZSQgw6kgYSBwYXJ0ZSBhbGVhdMOzcmlhLiBTdXBvbmhhIHF1ZSBxdWVpcmFtb3MgY29tcGFyYXIgYXMgbcOpZGlhcyBkZSAkSyQgcG9wdWxhw6fDtWVzLCBpc3RvIMOpOg0KDQpgYGB7PXRleH0NClxiZWdpbntlcW5hcnJheSp9IA0KICAgIFxiZWdpbnthcnJheX17bGx9DQogICAgICAgICYgSF97MH0gOiBcbXVfezF9ID0gXG11X3syfSwuLi4sXG11X3tLfTtcXA0KICAgICAgICAmIEhfezF9IDogXHRleHR7cGVsbyBtZW5vcyB1bWEgZGFzIG3DqWRpYXMgfVxtdV97aX0gXHRleHR7IMOpIGRpZmVyZW50ZSBkYXMgZGVtYWlzfS5cXA0KICAgIFxlbmR7YXJyYXl9IA0KXGVuZHtlcW5hcnJheSp9DQpgYGANClBhcmEgJEskIGFtb3N0cmFzIGluZGVwZW5kZW50ZXMsIGNvbSAkbSQgaW5kaXbDrWR1b3MgZW0gY2FkYSB1bWEgZGVsYXMsIHRlbW9zDQoNCmBgYHs9dGV4fQ0KXGJlZ2lue2VxbmFycmF5fSANClxiZWdpbnthcnJheX17Y30gXGxhYmVse21vZDF9DQpZX3tpan0gPSBcbXVfe2l9ICsgZV97aWp9LCBcOyBpPTEsMiwuLi4sSzsgXDsgaj0xLDIsLi4uLG0uDQpcZW5ke2FycmF5fSANClxlbmR7ZXFuYXJyYXl9DQpgYGANCkNhc28gJEhfezB9JCBzZWphIHZlcmRhZGVpcmEsIG8gbW9kZWxvIGFjaW1hIHBvZGUgc2VyIGVzY3JpdG8gY29tbw0KDQpgYGB7PXRleH0NClxiZWdpbntlcW5hcnJheX0gDQpcYmVnaW57YXJyYXl9e2N9IFxsYWJlbHttb2QwfQ0KWV97aWp9ID0gXG11ICsgZV97aWp9XnsqfSwgXDsgaT0xLDIsLi4uLEs7IFw7IGo9MSwyLC4uLixtLg0KXGVuZHthcnJheX0gDQpcZW5ke2VxbmFycmF5fQ0KYGBgDQpVbWEgbWFuZWlyYSBkZSBxdWFudGlmaWNhciBhIHBhcnRlIGFsZWF0w7NyaWEgw6kgYSBwYXJ0aXIgZGFzIHNvbWFzIGRlIHF1YWRyYWRvDQoNCmBgYHs9dGV4fQ0KXGJlZ2lue2VxbmFycmF5Kn0gDQogICAgXGJlZ2lue2FycmF5fXtjY30gDQogICAgICAgIFxkaXNwbGF5c3R5bGUgXHN1bV97aT0xfV57S31cc3VtX3tqPTF9XnttfSBlX3tpan1eezJ9ID0gXGRpc3BsYXlzdHlsZSBcc3VtX3tpPTF9XntLfVxzdW1fe2o9MX1ee219IFxsZWZ0KCBZX3tpan0gLSBcbXVfe2l9IFxyaWdodCleezJ9ICYgXHRleHR7ZX0gXDtcOyBcZGlzcGxheXN0eWxlIFxzdW1fe2k9MX1ee0t9XHN1bV97aj0xfV57bX0gKGVfe2lqfV57Kn0pXnsyfSA9IFxkaXNwbGF5c3R5bGUgXHN1bV97aT0xfV57S31cc3VtX3tqPTF9XnttfSBcbGVmdCggWV97aWp9IC0gXG11IFxyaWdodCleezJ9LA0KICAgIFxlbmR7YXJyYXl9IA0KXGVuZHtlcW5hcnJheSp9DQpgYGANClxub2luZGVudCBlbSBxdWUNCg0KYGBgez10ZXh9DQpcYmVnaW57ZXFuYXJyYXkqfSANCiAgICBcYmVnaW57YXJyYXl9e2N9IA0KICAgICAgICBcd2lkZWhhdHtcbXV9X3tpfSA9IFxkZnJhY3sxfXttfSBcZGlzcGxheXN0eWxlIFxzdW1fe2o9MX1ee219IFlfe2lqfSA9IFxiYXJ7WX1fe2l9LCBcOyBpID0gMSwuLi4sSywNCiAgICBcZW5ke2FycmF5fSANClxlbmR7ZXFuYXJyYXkqfQ0KYGBgDQpcbm9pbmRlbnQgZSBcYmVnaW57ZXFuYXJyYXkqfSANCiAgICBcYmVnaW57YXJyYXl9e2N9IA0KICAgICAgICBcd2lkZWhhdHtcbXV9ID0gXGRmcmFjezF9e21LfSBcZGlzcGxheXN0eWxlIFxzdW1fe2k9MX1ee0t9XHN1bV97aj0xfV57bX0gWV97aWp9ID0gXGJhcntZfS4NCiAgICBcZW5ke2FycmF5fSANClxlbmR7ZXFuYXJyYXkqfQ0KDQpTdWJzdGl0dWluZG8gZXN0YXMgZXN0aW1hdGl2YXMgbmFzIHNvbWFzIGRlIHF1YWRyYWRvcywgdGVtb3MgYSBzb21hIGRlIHF1YWRyYWRvcyBkZW50cm8gKFNRRCkgZSBzb21hIGRlIHF1YWRyYWRvcyB0b3RhbCAoU1FUKSBkYWRhcyByZXNwZWN0aXZhbWVudGUgcG9yDQoNCmBgYHs9dGV4fQ0KXGJlZ2lue2VxbmFycmF5fSANClxiZWdpbnthcnJheX17bGxsbH0gDQpcdGV4dHtTUUR9ID0gJlxkaXNwbGF5c3R5bGUgIFxzdW1fe2k9MX1ee0t9XHN1bV97aj0xfV57bX0gXGxlZnQoIFlfe2lqfSAtIFx3aWRlaGF0e1xtdX1fe2l9IFxyaWdodCleezJ9ID0gJiBcZGlzcGxheXN0eWxlIFxzdW1fe2k9MX1ee0t9XHN1bV97aj0xfV57bX0gXGxlZnQoIFlfe2lqfSAtIFxiYXJ7WX1fe2l9IFxyaWdodCleezJ9ID0gJiBcZGlzcGxheXN0eWxlIFxzdW1fe2k9MX1ee0t9XHN1bV97aj0xfV57bX0gWV97aWp9XnsyfSAtIG1cc3VtX3tpPTF9XntLfVxiYXJ7WX1eezJ9X3tpfTsgXFwgDQpcdGV4dHtTUVR9ID0gJlxkaXNwbGF5c3R5bGUgIFxzdW1fe2k9MX1ee0t9XHN1bV97aj0xfV57bX0gXGxlZnQoIFlfe2lqfSAtIFx3aWRlaGF0e1xtdX0gXHJpZ2h0KV57Mn0gPSAmIFxkaXNwbGF5c3R5bGUgXHN1bV97aT0xfV57S31cc3VtX3tqPTF9XnttfSBcbGVmdCggWV97aWp9IC0gXGJhcntZfSBccmlnaHQpXnsyfSA9ICYgXGRpc3BsYXlzdHlsZSBcc3VtX3tpPTF9XntLfVxzdW1fe2o9MX1ee219IFlfe2lqfV57Mn0gLSBtS1xiYXJ7WX1eezJ9Lg0KXGVuZHthcnJheX0gDQpcZW5ke2VxbmFycmF5fQ0KYGBgDQpUZW1vcyBhaW5kYSBhIHNvbWEgZG9zIHF1YWRyYWRvcyBlbnRyZSAoU1FFKSBkYWRhIHBvcg0KDQpgYGB7PXRleH0NClxiZWdpbntlcW5hcnJheX0gDQpcdGV4dHtTUUV9ID0gXHRleHR7U1FUfSAtIFx0ZXh0e1NRRH0gPSBcZGlzcGxheXN0eWxlIG1cc3VtX3tpPTF9XntLfVxsZWZ0KCBZX3tpfSAtIFxiYXJ7WX0gXHJpZ2h0KV57Mn0gPSBtXGxlZnQoIFxkaXNwbGF5c3R5bGUgXHN1bV97aT0xfV57S30gXGJhcntZfV97aX1eezJ9IC0gS1xiYXJ7WX1eezJ9IFxyaWdodCkuIA0KXGVuZHtlcW5hcnJheX0NCmBgYA0KRGVmaW5lLXNlIHRhbWLDqW0gb3MgcXVhZHJhZG9zIG3DqWRpb3MgdG90YWwgKFFNVCksIGRlbnRybyAoUU1EKSBlIGVudHJlIChRTUUpIGRhIHNlZ3VpbnRlIG1hbmVpcmE6DQoNCmBgYHs9dGV4fQ0KXGJlZ2lue2VxbmFycmF5fSANClxiZWdpbnthcnJheX17bGx9IA0KJiBcdGV4dHtRTVR9ID0gXGRmcmFje1x0ZXh0e1NRVH19e0ttLTF9IFxcDQomIFx0ZXh0e1FNRH0gPSBcZGZyYWN7XHRleHR7U1FEfX17SyhtLTEpfSBcXA0KJiBcdGV4dHtRTUV9ID0gXGRmcmFje1x0ZXh0e1NRRX19e20tMX0uDQpcZW5ke2FycmF5fSANClxlbmR7ZXFuYXJyYXl9DQpgYGANCkRlZmluaW1vcyBlbnTDo28gYSBxdWFudGlkYWRlDQoNCmBgYHs9dGV4fQ0KXGJlZ2lue2VxbmFycmF5fSANCkYgPSBcZGZyYWN7XHRleHR7UU1FfX17XHRleHR7UU1EfX0sDQpcZW5ke2VxbmFycmF5fQ0KYGBgDQpxdWFudG8gbWFpb3IgZm9yIG8gdmFsb3IgZGUgJEYkLCBtYWlvciBzZXLDoSAkUU1FJCBjb21wYXJhZG8gYSAkUU1EJCBlLCBhc3NpbSwgbWFpb3JlcyBhcyBldmlkw6puY2lhcyBjb250cmEgJEhfezB9JC4NCg0KIyMgUHJlc3N1cG9zdG9zDQoNCkRhZGFzIGFzIHNlZ3VpbnRlcyBzdXBvc2nDp8O1ZXMNCg0KLSAgICRZX3tpan0kIHPDo28gdmFyacOhdmVpcyBhbGVhdMOzcmlhcyBpbmRlcGVuZGVudGVzOw0KDQotICAgJFlfe2lqfSQgw6kgTm9ybWFsIGNvbSBtw6lkaWEgJFxtdV97aX0kLCAkaT0xLDIsLi4uLEskIGUgJGo9MSwyLC4uLixtJDsNCg0KLSAgIHRvZGFzIGFzICRLJCBwb3B1bGHDp8O1ZXMgdMOqbSB2YXJpw6JuY2lhcyBpZ3VhaXMgYSAkXHNpZ21hXnsyfSQsDQoNClxub2luZGVudCBwb2RlIHNlciBtb3N0cmFkbyBxdWUNCg0KYGBgez10ZXh9DQpcYmVnaW57ZXFuYXJyYXkqfSANCiAgICBGIFxzaW0gRihLLTEsSyhtLTEpKSwNClxlbmR7ZXFuYXJyYXkqfQ0KYGBgDQpcbm9pbmRlbnQgaXN0byDDqSwgJEYkIHRlbSBkaXN0cmlidWnDp8OjbyBGaXNoZXItU25lZGVjb3IgKG91IGFwZW5hcyBGLVNuZWRlY29yKSBjb20gJEstMSQgZSAkSyhtLTEpJCBncmF1cyBkZSBsaWJlcmRhZGUuDQoNCiMjIFRhYmVsYSBBTk9WQQ0KDQp8IEZvbnRlIGRlIHZhcmlhw6fDo28gfCBHcmF1cyBkZSBsaWJlcmRhZGUgfCBTb21hIGRlIHF1YWRyYWRvcyB8IFF1YWRyYWRvIG3DqWRpbyB8ICAgIEYgICAgfA0KfDotLS0tLS0tLS0tLS0tOnw6LS0tLS0tLS0tLS0tLTp8Oi0tLS0tLS0tLS0tLS06fDotLS0tLS0tLS0tLS0tOnw6LS0tLS0tLS0tLS0tLTp8DQp8ICAgICAgIEVudHJlICAgICAgIHwgICAgICAgIEstMSAgICAgICAgIHwgICAgICAgIFNRRSAgICAgICAgfCAgICAgIFFNRSAgICAgICB8IFFNRS9RTUQgfA0KfCAgICAgIERlbnRybyAgICAgICB8ICAgICAgIEsobS0xKSAgICAgICB8ICAgICAgICBTUUQgICAgICAgIHwgICAgICBRTUQgICAgICAgfCAgICAgICAgIHwNCnwgICAgICAgVG90YWwgICAgICAgfCAgICAgICAgS20tMSAgICAgICAgfCAgICAgICAgU1FUICAgICAgICB8ICAgICAgIFwtICAgICAgIHwgICBcLSAgICB8DQoNCiMjIyBFeGVtcGxvDQoNCkEgZ2Vyw6puY2lhIGRlIHVtIGRlcMOzc2l0byBxdWUgYXJtYXplbmEgY2FyZ2FzIGHDqXJlYXMgZGUgcGVxdWVubyBwb3J0ZSBlc3TDoSBlc3R1ZGFuZG8gbyBwZXNvIGRhcyBjYXJnYXMgcXVlIGNoZWdhbSBhbyBzZXUgdGVybWluYWwgbm8gaW50ZXJpb3IgZGUgU8OjbyBQYXVsby4gVXN1YWxtZW50ZSwgbyB0ZXJtaW5hbCByZWNlYmUgNCB0aXBvcyBkZSBjYXJnYXM6IGRvbcOpc3RpY2EgKEQpLCBhZG1pbmlzdHJhdGl2YSAoQSksIGVxdWlwYW1lbnRvcyBpbmR1c3RyaWFpcyAoRSkgZSBvdXRyb3MgdGlwb3MgKE8pLiBEZXNlamEtc2UgdmVyaWZpY2FyIHNlLCBlbSBtw6lkaWEsIGV4aXN0ZW0gZGlmZXJlbsOnYXMgZW50cmUgb3MgcGVzb3MgZG9zIDQgdGlwb3MgZGUgY2FyZ2FzLiBBbyBsb25nbyBkZSB1bSBtw6pzLCBjYXJnYXMgZm9yYW0gY29saGlkYXMgYWxlYXRvcmlhbWVudGUgZSBzZXVzIHBlc29zIGZvcmFtIGFub3RhZG9zLCBmb3JuZWNlbmRvIG9zIGRhZG9zIChlbSBrZyk6DQoNCnwgIEQgICB8ICBBICAgfCAgRSAgIHwgIE8gICB8DQp8Oi0tLS06fDotLS0tOnw6LS0tLTp8Oi0tLS06fA0KfCAyNCw5IHwgMjcsOSB8IDM4LDQgfCAyMyw4IHwNCnwgMjAsNCB8IDI4LDEgfCAzOCw2IHwgMjUsMyB8DQp8IDI0LDIgfCAyOCw0IHwgNDEsMiB8IDIzLDUgfA0KfCAyMiwzIHwgMjUsMyB8IDQzLDkgfCAyNyw2IHwNCnwgMjAsMyB8IDI5LDMgfCA0MCwyIHwgMjUsNSB8DQp8IDI0LDAgfCAyOCw1IHwgNDAsMiB8IDIzLDkgfA0KfCAyMyw1IHwgMjcsOSB8IDM3LDMgfCAyMiw2IHwNCg0KKipTb2x1w6fDo28qKg0KDQpgYGB7PXRleH0NClxiZWdpbntlcW5hcnJheSp9IA0KICAgIFxiZWdpbnthcnJheX17bGx9IA0KICAgICAgICAmXGJhcntZfV97aX0gPSAoMjIsODsgMjcsOTsgNDAsMDsgMjQsNikgXDtcO1xsb25ncmlnaHRhcnJvd1x0ZXh0e23DqWRpYSBkZSBjYWRhIHRyYXRhbWVudG8ufVxcDQogICAgICAgICYgXGJhcntZfSA9IDI4LDIgXDtcO1xsb25ncmlnaHRhcnJvdyBcdGV4dHttw6lkaWEgZ2VyYWwufQ0KICAgIFxlbmR7YXJyYXl9DQpcZW5ke2VxbmFycmF5Kn0NCmBgYA0KYGBgez10ZXh9DQpcYmVnaW57ZXFuYXJyYXkqfQ0KICAgIFxiZWdpbnthcnJheX17bGx9IA0KICAgICAgICAmIFx0ZXh0e1NRRH0gPSAoMjQsOS0yMiw4KV57Mn0gKyAoMjcsOS0yNyw5KV57Mn0gKy4uLisoMjIsNiAtIDI0LDYpXnsyfSA9IDc1LDEgXFwNCiAgICAgICAgJiBcdGV4dHtTUVR9ID0gKDI0LDktMjgsMileezJ9ICsgKDI3LDktMjgsMileezJ9ICsuLi4rKDIyLDYgLSAyOCwyKV57Mn0gPSAxMzI5LDcgXFwgDQogICAgICAgICYgXHRleHR7U1FFfSA9IDEyNTQsNg0KICAgIFxlbmR7YXJyYXl9DQpcZW5ke2VxbmFycmF5Kn0NCmBgYA0KfCBGb250ZSBkZSB2YXJpYcOnw6NvIHwgR3JhdXMgZGUgbGliZXJkYWRlIHwgU29tYSBkZSBxdWFkcmFkb3MgfCBRdWFkcmFkbyBtw6lkaW8gfCAgIEYgICB8IFZhbG9yLXAgfA0KfDotLS0tLS0tLS0tOnw6LS0tLS0tLS0tLTp8Oi0tLS0tLS0tLS06fDotLS0tLS0tLS0tOnw6LS0tLS0tLS0tLTp8Oi0tLS0tLS0tLS06fA0KfCAgICAgICBFbnRyZSAgICAgICB8ICAgICAgICAgMyAgICAgICAgICB8ICAgICAgMTI1NCw2ICAgICAgIHwgICAgIDQxOCwyICAgICAgfCAxMzMsNiB8ICAwLDAwMCAgfA0KfCAgICAgIERlbnRybyAgICAgICB8ICAgICAgICAgMjQgICAgICAgICB8ICAgICAgIDc1LDEgICAgICAgIHwgICAgICAzLDEgICAgICAgfCAgICAgICB8ICAgICAgICAgfA0KfCAgICAgICBUb3RhbCAgICAgICB8ICAgICAgICAgMjcgICAgICAgICB8ICAgICAgMTMyOSw3ICAgICAgIHwgICAgICAgXC0gICAgICAgfCAgXC0gICB8ICAgXC0gICAgfA0KDQojIyBTb2x1w6fDo28gbm8gUg0KDQpQcmltZWlyYW1lbnRlIGRldmUtc2UgdmVyaWZpY2FyIHNlIG9zIGRhZG9zIHPDo28gbm9ybWFpcyBhIHBhcnRpciBkYSBmdW7Dp8OjbyBgc2hhcGlyby50ZXN0KClgLiBIaXDDs3Rlc2VzIHRlc3RhZGFzOg0KDQokSF97MH06IFx0ZXh0e29zIGRhZG9zIHPDo28gbm9ybWFpc307JA0KDQokSF97MX06IFx0ZXh0e2Nhc28gY29udHLDoXJpbyAoYy5jLikufSQNCg0KYGBge3J9DQoJIyBpbnNlcmluZG8gb3MgZGFkb3MNCgkNCglEID0gYygyNC45LDIwLjQsMjQuMiwyMi4zLDIwLjMsMjQuMCwyMy41KQ0KCUEgPSBjKDI3LjksMjguMSwyOC40LDI1LjMsMjkuMywyOC41LDI3LjkpDQoJRSA9IGMoMzguNCwzOC42LDQxLjIsNDMuOSw0MC4yLDQwLjIsMzcuMykNCglPID0gYygyMy44LDI1LjMsMjMuNSwyNy42LDI1LjUsMjMuOSwyMi42KQ0KCQ0KCSMjIw0KCXkgPSBjKEQsQSxFLE8pICMgVmFyacOhdmVsIHJlc3Bvc3RhDQoJeCA9IHJlcChjKCJEIiwiQSIsIkUiLCJPIiksZWFjaD03KSAjIFZhcmnDoXZlbCBleHBsaWNhdGl2YSAoY2F0ZWfDs3JpY2EpDQpgYGANCg0KYGBge3J9DQoJZGFkb3MxID0gZGF0YS5mcmFtZSh5LHgpICMgZm9ybWF0byBkZSBiYW5jbyBkZSBkYWRvcw0KCWRhZG9zMQ0KYGBgDQoNCi0gICBWZXJpZmljYW5kbyBvcyBwcmVzc3Vwb3N0b3M6DQoNCjEuICBOb3JtYWxpZGFkZQ0KDQpgYGB7cn0NCgkjIHZlcmlmaWNhbmRvIGEgbm9ybWFsaWRhZGUgZG9zIGRhZG9zDQoJDQoJc2hhcGlyby50ZXN0KEQpDQoJDQoJc2hhcGlyby50ZXN0KEEpDQoJDQoJc2hhcGlyby50ZXN0KEUpDQoJDQoJc2hhcGlyby50ZXN0KE8pDQpgYGANCg0KQ29tbyBvIHZhbG9yLXAgcGFyYSB0b2RhcyBhcyB2YXLDoXZlaXMgw6kgbWFpb3IgcXVlIG8gbsOtdmVsIGRlIHNpZ25pZmljw6JuY2lhICgwLDA1KSwgbsOjbyByZWplaXRhbW9zIGEgaGlww7N0ZXNlIG51bGEgZSBjb25jbHXDrW1vcyBxdWUgb3MgZGFkb3Mgc8OjbyBub3JtYWlzLg0KDQoyLiAgSG9tb2dlbmlkYWRlIGRhcyB2YXJpw6JuY2lhcw0KDQpBZ29yYSBhIGhvbW9nZW5laWRhZGUgZGFzIHZhcmnDom5jaWFzIGNvbSBmdW7Dp8OjbyBgYmFybGxldC50ZXN0KClgLCBlbSBxdWUgYXMgaGlww7N0ZXNlcyB0ZXN0YWRhcyBzw6NvOg0KDQokSF97MH06IFxzaWdtYV97MX1eezJ9ID0gXHNpZ21hX3syfV57Mn0gPSAuLi4gPSBcc2lnbWFfe2t9XnsyfTsgXHRleHR7KHZhcmnDom5jaWFzIGhvbW9nw6puZWFzKX0kDQoNCiRIX3sxfTogXHRleHR7Y2FzbyBjb250csOhcmlvIChjLmMuKS59JA0KDQpgYGB7cn0NCmJhcnRsZXR0LnRlc3QoeSB+IHgsIGRhZG9zMSkNCmBgYA0KDQpDb21vIG8gdmFsb3ItcCDDqSBtYWlvciBxdWUgbyBuw612ZWwgZGUgc2lnbmlmaWPDom5jaWEgKDAsMDUpLCBuw6NvIHJlamVpdGFtb3MgYSBoaXDDs3Rlc2UgbnVsYSBlIGNvbmNsdcOtbW9zIHF1ZSBhcyB2YXJpw6JuY2lhcyBzw6NvIGhvbW9nw6puZWFzLg0KDQpPYnNlcnZhZG9zIG9zIHByZXNzdXBvc3RvcyBwb2RlbW9zIGZhemVyIGEgQU5PVkEgYSBwYXJ0aXIgZGFzIGZ1bsOnw7VlcyBgYW92KClgLCBgbG0oKWAgZSBgYW5vdmEoKWAuIFV0aWxpemFyZW1vcyBhIGZ1bsOnw6NvIGBsbWAgKCpsaW5lYXIgbW9kZWxzKikgcGFyYSBvYnNlcnZhcm1vcyBhIEFOT1ZBIG5vIGZvcm1hdG8gbW9zdHJhZG8gYW50ZXJpb3JtZW50ZQ0KDQpgYGB7cn0NCgltMSA9IGxtKHkgfiB4LCBkYWRvczEpDQoJbTEuYW5vdmEgPSBhbm92YShtMSkNCgltMS5hbm92YQ0KYGBgDQoNCkNvbW8gbyB2YWxvci1wIGZvaSBtZW5vciBxdWUgbyBuw612ZWwgZGUgc2lnbmlmaWPDom5jaWEsIHBvZGUtc2UgY29uY2x1aXIgcXVlIGjDoSBkaWZlcmVuw6dhcyBzaWduaWZpY2F0aXZhcyBlbnRyZSBvcyB0aXBvcyBkZSBjYXJnYXMuDQoNCkNvbW8gaMOhIGRpZmVyZW7Dp2FzIHNpZ25pZmljYXRpdmFzIGVudHJlIG9zIHRyYXRhbWVudG9zLCBwb2RlbW9zIHNlZ3VpciBjb20gYSBhbsOhbGlzZSB2ZXJpZmljYW5kbyBxdWFpcyB0cmF0YW1lbnRvcyBkaWZlcmVtIGVudHJlIHNpLiBQYXJhIHRhbnRvIHVzYS1zZSBvIHRlc3RlIGRlIFR1a2V5IGEgcGFydGlyIGRhIGZ1bsOnw6NvIGBUdWtleUhTRCgpYC4NCg0KT2JzZXJ2ZSBxdWUgYXBlbmFzIGEgZGlmZXJlbsOnYSBlbnRyZSBvcyB0cmF0YW1lbnRvcyBPIGUgRCBuw6NvIGZvcmFtIHNpZ25pZmljYXRpdmFzLg0KDQpgYGB7cn0NCgkjIHZlcmlmaWNhbmRvIGRpZmVyZW7Dp2FzIGVudHJlIG9zIA0KCSMgdHJhdGFtZW50b3MNCgltMi5hbm92YSA9IGFvdihtMSkNCgl0dWtleSA9IFR1a2V5SFNEKG0yLmFub3ZhKQ0KCXR1a2V5DQoJcGxvdCh0dWtleSkNCmBgYA0KDQojIFJlZ3Jlc3PDo28gTGluZWFyIFNpbXBsZXMgKHJlc3VtbykNCg0KSW1hZ2luZSBhZ29yYSBhIHNlZ3VpbnRlIHNpdHVhw6fDo286IHVtIG3DqWRpY28gZGVzZWphIHZlcmlmaWNhciBzZSBhIGlkYWRlIGRlIDIwIHBhY2llbnRlcyBkbyBzZXhvIG1hc2N1bGlubyB0ZW0gYWxndW1hIGluZmx1w6puY2lhIG5hIHByZXNzw6NvIGFydGVyaWFsIGRpYXN0w7NsaWNhIChQLkEuRCkgZG9zIG1lc21vcy4NCg0KfCBZIChQLkEuRCkgfCBYIChpZGFkZSkgfA0KfDotLS0tLS0tLS06fDotLS0tLS0tLS06fA0KfCAgICA4MCAgICAgfCAgICAzNSAgICAgfA0KfCAgICA3MCAgICAgfCAgICAzNyAgICAgfA0KfCAgICA3NiAgICAgfCAgICA0NSAgICAgfA0KfCAgICA4MCAgICAgfCAgICA1MyAgICAgfA0KfCAgICA4MCAgICAgfCAgICA2NyAgICAgfA0KfCAgICA4NyAgICAgfCAgICA3MiAgICAgfA0KfCAgICA4MiAgICAgfCAgICA0MCAgICAgfA0KfCAgICA4MCAgICAgfCAgICA1MCAgICAgfA0KfCAgICA4MiAgICAgfCAgICA2MCAgICAgfA0KfCAgICA4NCAgICAgfCAgICA2NSAgICAgfA0KfCAgICA3NSAgICAgfCAgICA1NCAgICAgfA0KfCAgICA3MCAgICAgfCAgICA0MyAgICAgfA0KfCAgICA2OCAgICAgfCAgICAzOSAgICAgfA0KfCAgICA3NSAgICAgfCAgICA2NiAgICAgfA0KfCAgICA4NSAgICAgfCAgICA2NyAgICAgfA0KfCAgICA5MCAgICAgfCAgICA3MiAgICAgfA0KfCAgICA3NSAgICAgfCAgICA0MCAgICAgfA0KfCAgICA3MCAgICAgfCAgICA1MCAgICAgfA0KfCAgICA4MiAgICAgfCAgICA2MCAgICAgfA0KfCAgICA4NSAgICAgfCAgICA2NSAgICAgfA0KDQpFeGlzdGUgcmVsYcOnw6NvIChjb3JyZWxhw6fDo28pIGVudHJlIGFzIHZhcmnDoXZlaXMgWSBlIFg/IFNlIGFmaXJtYXRpdm8sIGVzc2EgcmVsYcOnw6NvIMOpIGZyYWNhIG91IGZvcnRlPyBQb3NpdGl2YSBvdSBuZWdhdGl2YT8gRXhpc3RpbmRvIGNvcnJlbGHDp8OjbyBlbnRyZSBhcyB2YXJpw6F2ZWlzLCBwb2RlLXNlIGVzdGFiZWxlY2VyIHVtIG1vZGVsbyBkbyB0aXBvOg0KDQpgYGB7PXRleH0NClxiZWdpbntlcW5hcnJheX0gDQpcYmVnaW57YXJyYXl9e2N9XGxhYmVse3JlZzF9DQpZID0gXGJldGFfezB9ICsgXGJldGFfezF9WCArIGVfe2l9LA0KXGVuZHthcnJheX0gDQpcZW5ke2VxbmFycmF5fQ0KYGBgDQplbSBxdWUsIFkgw6kgYSB2YXJpw6F2ZWwgZGVwZW5kZW50ZSAob3UgdmFyacOhdmVsIHJlc3Bvc3RhKTsgWCBhIHZhcmnDoXZlbCBpbmRlcGVuZGVudGUgKHRhbWLDqW0gY2hhbWFkYSBkZSBleHBsaWNhdGl2YSBvdSBjb3ZhcmnDoXZlbCk7ICRcYmV0YV97MH0kIGUgJFxiZXRhX3sxfSQgc8OjbyBwYXLDom1ldHJvcyBxdWUgZGV2ZW0gc2VyIGVzdGltYWRvczsgZSAkZV97aX0kIMOpIG8gZXJybyBhbGVhdMOzcmlvLg0KDQpBIHBhcnRpciBkZSBtw6l0b2RvcyBkZSBlc3RpbWHDp8OjbywgcG9kZS1zZSBjaGVnYXIgYW8gc2VndWludGUgbW9kZWxvDQoNCmBgYHs9dGV4fQ0KXGJlZ2lue2VxbmFycmF5fSANClxiZWdpbnthcnJheX17Y30NClxoYXR7eX1fe2l9ID0gXGhhdHtcYmV0YX1fezB9ICsgXGhhdHtcYmV0YX1fezF9eCwNClxlbmR7YXJyYXl9IA0KXGVuZHtlcW5hcnJheX0NCmBgYA0KZW0gcXVlICRcaGF0e1xiZXRhfV97MH0kIGUgJFxoYXR7XGJldGF9X3sxfSQgc8OjbyBvcyBlc3RpbWFkb3JlcyBkb3MgcGFyw6JtZXRyb3MgZG8gbW9kZWxvIGRlIHJlZ3Jlc3PDo28gZSBzw6NvIGRhZG9zIHBvcg0KDQpgYGB7PXRleH0NClxiZWdpbntlcW5hcnJheX0gDQogICAgXGJlZ2lue2FycmF5fXtjfQ0KXGhhdHtcYmV0YX1fezB9ID0gXGJhcnt5fSAtXGhhdHtcYmV0YX1fezF9XGJhcnt4fQ0KICAgIFxlbmR7YXJyYXl9IA0KXGVuZHtlcW5hcnJheX0NCmBgYA0KYGBgez10ZXh9DQpcYmVnaW57ZXFuYXJyYXl9IA0KXGJlZ2lue2FycmF5fXtjfQ0KXGhhdHtcYmV0YX1fezF9ICA9ICBcZGZyYWN7IFxzdW1fe2kgPSAxfV57bn14X3tpfXlfe2l9LW5cYmFye3h9XGJhcnt5fX17IFxzdW1fe2kgPSAxfV57bn14X3tpfV57Mn0tblxiYXJ7eH1eezJ9fSANClxlbmR7YXJyYXl9IA0KXGVuZHtlcW5hcnJheX0NCmBgYA0KKipQcmVzc3Vwb3N0b3MqKjogb3MgZXJyb3MgdGVtIGRpc3RyaWJ1acOnw6NvIG5vcm1hbCwgb3Ugc2VqYSwgJGVfe2l9IFxzaW0gTigwLFxzaWdtYV57Mn0pJCBvIHF1ZSBpbXBsaWNhIHF1ZSAkWV97aX0gXHNpbSBOKFxiZXRhX3swfSArIFxiZXRhX3sxfVhfe2l9LCBcc2lnbWFeezJ9KSQuDQoNClBhcmEgdmVyaWZpY2FyIHNlIGV4aXN0ZSBjb3JyZWxhw6fDo28gZW50cmUgYXMgdmFyacOhdmVpcyBZIChQLkEuRCkgZSBYIChpZGFkZSkgZG8gZXhlbXBsbyBhbnRlcmlvciBhIHBhcnRpciBkYSBhbsOhbGlzZSBkZSByZWdyZXNzw6NvIGxpbmVhciBzaW1wbGVzLCBlc3RhcsOtYW1vcyB0ZXN0YW5kbyBhcyBzZWd1aW50ZXMgaGlww7N0ZXNlczoNCg0KYGBgez10ZXh9DQpcYmVnaW57ZXFuYXJyYXl9IA0KXGJlZ2lue2FycmF5fXtsbH0NCkhfezB9OiAmIFx0ZXh0e2EgUC5BLkQgZG9zIGhvbWVucyBuw6NvIHNvZnJlIGFsdGVyYcOnw7VlcyBjb20gYSBpZGFkZS59IFxcDQpIX3sxfTogJiBcdGV4dHthIFAuQS5EIGRvcyBob21lbnMgw6kgYWx0ZXJhZGEgY29tIGEgaWRhZGUufSANClxlbmR7YXJyYXl9IA0KXGVuZHtlcW5hcnJheX0NCmBgYA0KT3UgZGUgZm9ybWEgZXF1aXZhbGVudGU6DQoNCmBgYHs9dGV4fQ0KXGJlZ2lue2VxbmFycmF5fSANClxiZWdpbnthcnJheX17bGx9DQpIX3swfTogJiBcYmV0YV97MX0gPSAwO1xcDQpIX3sxfTogJiBcYmV0YV97MX0gXG5lcSAwLiANClxlbmR7YXJyYXl9IA0KXGVuZHtlcW5hcnJheX0NCmBgYA0KIyMgU29sdcOnw6NvIG5vIFINCg0KSW5pY2lhbG1lbnRlIHZhbW9zIGluc2VyaXIgb3MgZGFkb3MgZSBjb2xvY8OhLWxvcyBubyBmb3JtYXRvIGBkYXRhLmZyYW1lKClgLg0KDQpgYGB7cn0NCiMjIyBpbnNlcmluZG8gb3MgZGFkb3MNCgkNCnkxID0gYyg4MCw3MCw3Niw4MCw4MCw4Nyw4Miw4MCw4Miw4NCw3NSw3MCw2OCw3NSw4NSw5MCw3NSw3MCw4Miw4NSkNCg0KeDEgPSBjKDM1LDM3LDQ1LDUzLDY3LDcyLDQwLDUwLDYwLDY1LDU0LDQzLDM5LDY2LDY3LDcyLDQwLDUwLDYwLDY1KQ0KDQpkYWRvc19yZWcgPSBkYXRhLmZyYW1lKHkxLHgxKSAjIyMgZm9ybWF0byBkZSBiYW5jbyBkZSBkYWRvcw0KZGFkb3NfcmVnDQpgYGANCg0KQWdvcmEgbyBhanVzdGUgZG8gbW9kZWxvIGEgcGFydGlyIGRhIGZ1bsOnw6NvIGBsbSgpYC4gTm90ZSBxdWUgdGFudG8gJFxiZXRhX3swfSQgcXVhbnRvICRcYmV0YV97MX0kIHPDo28gc2lnbmlmaWNhdGl2b3MgKHZhbG9yLXAgXDwwLDA1KS4gQWzDqW0gZGlzc28sIG8gdmFsb3IgZGEgZXN0YXTDrXN0aWNhIEYgdGFtYsOpbSBmb2kgc2lnbmlmaWNhdGl2bywgZGVzdGEgZm9ybWEgcmVqZWl0YW1vcyBhIGhpcMOzdGVzZSBkZSBudWxpZGFkZSBlIGFjZWl0YW1vcyBhIGhvcMOzdGVzZSBhbHRlcm5hdGl2YSBxdWUgaW5kaWNhIHF1ZSBow6EgcmVncmVzc8OjbyAoJFxiZXRhX3sxfSBcbmVxIDAkKS4NCg0KYGBge3J9DQojIyMgZXN0aW1hdGl2YXMgZG9zIHBhcsOibWV0cm9zDQphanVzdGUxID0gbG0oeTF+eDEsIGRhZG9zX3JlZykgDQpwcmludChhanVzdGUxKQ0Kc3VtbWFyeShhanVzdGUxKSAjIyMgcmVzdW1vIGRvcyBhanVzdGVzIGRvIG1vZGVsbw0KYGBgDQoNCkZlaXRvIG8gYWp1c3RlIGRvIG1vZGVsbywgb2JzZXJ2YWRvIGEgc2lnbmlmaWPDom5jaWEgZG9zIHBhcsOibWV0cm9zIGUgZGEgaGlww7N0ZXNlIGRlIHJlZ3Jlc3PDo28sIHZlcmlmaWNhLXNlIHNlIG9zIHJlc8OtZHVvcyB0ZW0gZGlzdHJpYnVpw6fDo28gTm9ybWFsLCAkZV97aX0gXHNpbSBOKDAsXHNpZ21hXnsyfV97YX0pJCBhIHBhcnRpciBkYSBmdW7Dp8OjbyBgc2hhcGlyby50ZXN0ZWAuIE5vdGUgcXVlIG8gbsOtdmVsIGRlc2NyaXRpdm8gKHZhbG9yLXAgPSAwLDI2NzUpIGRvIHRlc3RlIGZvaSBtYWlvciBxdWUgbyBuw612ZWwgZGUgc2lnbmlmaWPDom5jaWEgKCRcYWxwaGEgPSAwLDA1JCksIGluZGljYW5kbyBxdWUgb3MgcmVzw61kdW9zIHPDo28gZGlzdHJpYnXDrWRvcyBOb3JtYWxtZW50ZS4NCg0KYGBge3J9DQpzaGFwaXJvLnRlc3QocmVzaWR1YWxzKGFqdXN0ZTEpKQ0KYGBgDQoNClBvZGVtb3MgcGxvdGFyIG8gZ3LDoWZpY28gY29tIG9zIGRhZG9zIGUgYSByZXRhIGRvIG1vZGVsbyBhanVzdGFkbyBhIHBhcnRpciBkb3Mgc2VndWludGVzIGNvbWFuZG9zOg0KDQpgYGB7cn0NCiMjIyBncsOhZmljbyBjb20gYSByZXRhIGFqdXN0YWRhDQpwbG90KHgxLHkxKQ0KYWJsaW5lKGFqdXN0ZTEsY29sID0gImJsdWUiKQ0KCQ0KYGBgDQoNCk5lc3RlIGNhc28gYSBlc3RhdMOtc3RpY2EgZGUgcmVncmVzc8OjbyBGPTE2LDIzIGZvaSBzaWduaWZpY2F0aXZhICh2YWxvci1wID0gMCwwMDA3ODgpLiBQb3J0YW50bywgcG9kZS1zZSBjb25jbHVpciBjb20gOTUlIGRlIGNvbmZpYWJpbGlkYWRlIHF1ZSBhIFAuQS5ELiBhdW1lbnRhIGEgbWVkaWRhIHF1ZSBhdmFuw6dhIGEgaWRhZGUgZG9zIHBhY2llbnRlcyBkZXN0ZSBlc3R1ZG8uDQoNCk8gXGBcYCRyXnsyfSQnJyAoUi1zcXVhcmUgPSAwLDQ3NDEpIMOpIGRlbm9taW5hZG8gZGUgY29lZmljaWVudGUgZGUgY29ycmVsYcOnw6NvIGRlIFBlYXJzb24gcXVlIHZhcmlhIGVudHJlIC0xIGUgMS4gRXN0ZSByZXN1bHRhZG8gbW9zdHJhIG8gZ3JhdSBkZSBhc3NvY2lhw6fDo28gZW50cmUgYXMgdmFyacOhdmVpcyBYIChQLkEuRCkgZSBZIChpZGFkZSkgcXVlIG5lc3RlIGNhc28gw6kgbW9kZXJhZGEgZSBwb3NpdGl2YS4NCg0KT2JzZXJ2YS1zZSBhIHBhcnRpciBkbyBjb2VmaWNpZW50ZSBkZSBkZXRlcm1pbmHDp8OjbyBhanVzdGFkbyAoQWp1c3RlZCBSLXNxdWFyZSA9IDAsNDQ0OSksIHF1ZSBhcHJveGltYWRhbWVudGUgNDQsNDklIGRhIHZhcmnDoXZlbCBkZXBlbmRlbnRlIChQLkEuRC4pIMOpIGV4cGxpY2FkYSBwZWxhIHZhcmnDoXZlbCBwcmVkaXRpdmEgKGlkYWRlKS4NCg0KRW0gbGluaGFzIGdlcmFpcywgcG9kZSBjb25jbHVpciBjb20gOTUlIGRlIGNvbmZpYWJpbGlkYWRlIHF1ZSBhIHZhcmnDoXZlbCBpZGFkZSDDqSB1bWEgdmFyacOhdmVsIGltcG9ydGFudGUgZSBzaWduaWZpY2F0aXZhIHBhcmEgcHJlZGl6ZXIgb3MgdmFsb3JlcyBkYSBQLkEuRCBkZSB1bSBwYWNpZW50ZSBkbyBzZXhvIG1hc2N1bGlubw0KDQpDb21vIGV4ZW1wbG8sIHBvZGUtc2UgYWdvcmEgZXN0aW1hciBhIHByZXNzw6NvIGRlIHVtIHBhY2llbnRlIGNvbSAzMyBhbm9zIGEgcGFydGlyIGRvIG1vZGVsbyBhanVzdGFkby4NCg0KYGBgez10ZXh9DQpcYmVnaW57ZXFuYXJyYXl9XG5vbnVtYmVyDQpcaGF0e3l9ID0gNjAsMjUgKyAwLDM0XHRpbWVzIDMzID0gNzEsNDcuDQpcZW5ke2VxbmFycmF5fQ0KYGBgDQoNCj4gKipgUmVmZXLDqm5jaWFzYCoqDQoNCiogTU9SRVRUSU4sIFBlZHJvIEEuOyBCVVNTQUIsIFdpbHRvbiBEZSBPLiBFU1RBVMONU1RJQ0EgQsOBU0lDQSA5YSBlZGnDp8Ojby4gW3MubDogcy5uLl0uIERpc3BvbsOtdmVsIGVtOiB3d3cuZWRpdG9yYXNhcmFpdmEuY29tLmJyL2NvbnRhdG8uDQoNCiogTEFSU09OLCBSb247IEZBUkJFUiwgQmV0c3kuIEVTVEFUw41TVElDQSBBUExJQ0FEQSA2ZS4gW3MubDogcy5uLl0uIERpc3BvbsOtdmVsIGVtOiBodHRwczovL2xpdnJvcy1wZGYtY2llbmNpYXMtZXhhdGFzLmJsb2dzcG90LmNvbS5ici8uDQoNCiogWkFST1MsIExpbGlhbiBHaW90dG87IE1FREVJUk9TLCBIZW5yaXF1ZSBSb2NoYSBEZS4gQmlvZXN0YXRpc3RpY2FfTElWUk9fV0VCLiBbcy5sOiBzLm4uXS4gDQoNCiogRkVSUkVJUkEsIEVyaWMgQmF0aXN0YTsgT0xJVkVJUkEsIE1hcmNlbG8gU2lsdmEgRGUuIEludHJvZHXDp8OjbyDDoCBFc3RhdMOtc3RpY2EgY29tIFIuIFtzLmw6IHMubi5dLiBEaXNwb27DrXZlbCBlbTogaHR0cHM6Ly9tZWdhLm56L2ZpbGUvMHd0MEFKUUIjNnViV2EzU1VBVGVydGp5VjBFQVF2WFVFNEVzUVJvVWF1aFZrN3gzd3ItZy4NCg==