Prof: Manoel Pires
Orientações: Na prova deverá constar nome e matrícula do estudante. A prova é individual e deve ser feita à mão ou de forma digital, mas deverá estar bem legível. As provas deverão ser entregues até o dia 24/11. No caso de questões analíticas, o aluno deverá desenvolver o raciocínio e álgebra da questão. No caso de exercícios econométricos, é necessário que os resultados sejam reportados de forma completa e interpretados. Os exercícios do livro do Enders se referem à numeração utilizada na 4ª edição. Os dados para realização dos exercícios estão disponíveis no e-class da turma. Outras edições podem ter numeração distinta. Boa prova.

library(readxl)
library(tseries)
library(forecast)
library(dplyr)
library(tidyverse)
library(dynlm)
library(stargazer)
library(strucchange)

1) (1,0 ponto). Questão 3, capítulo 1 do Enders, página 44.

  1. Suppose that the money supply process has the form mt = m + ρmt−1 + εt , where m is a constant and 0 <ρ< 1.
  1. Show that it is possible to express mt+n in terms of the known value mt and the sequence {εt+1, εt+2, … , εt+n}.
  2. Suppose that all values of εt+i for i > 0 have a mean value of zero. Explain how you could use your result in part a to forecast the money supply n periods into the future.

Resolução Questão 1

a. Show that it is possible to express mt+n in terms of the known value mt and the sequence {εt+1, εt+2, … , εt+n}.

Queremos demonstrar que é possível expressar \(m_{t+n}\) em termos do valor conhecido \(m_t\) e da sequência \(\{\varepsilon_{t+1}, \varepsilon_{t+2}, \dots, \varepsilon_{t+n}\}\).

Aplicando um raciocionio de recursividade podemos observar que para \(n = 1\), temos que:

\[ m_{t+1} = m + \rho m_t + \varepsilon_{t+1} \]

Substituindo \(m_t\) por \(m + \rho m_{t-1} + \varepsilon_t\), obtemos:

\[ m_{t+1} = m + \rho (m + \rho m_{t-1} + \varepsilon_t) + \varepsilon_{t+1} \]

Que expandindo será:

\[ m_{t+1} = m + \rho m + \rho^2 m_{t-1} + \rho \varepsilon_t + \varepsilon_{t+1} \]

Substituímos iterativamente \(m_{t+n-1}\), \(m_{t+n-2}\), e assim por diante. Após \(n\) iterações, obtemos:

\[ m_{t+n} = m \sum_{k=0}^n \rho^k + \rho^n m_t + \sum_{i=1}^n \rho^{n-i} \varepsilon_{t+i} \]

Finalmente, temos que a soma \(\sum_{k=0}^n \rho^k\) é uma soma finita de uma série geométrica, dado que \(0 < \rho < 1\), podemos escrevê-la como:

\[ \sum_{k=0}^n \rho^k = \frac{1 - \rho^{n+1}}{1 - \rho} \]

Substituindo essa soma na equação para \(m_{t+n}\), temos:

\[ m_{t+n} = m \frac{1 - \rho^{n+1}}{1 - \rho} + \rho^n m_t + \sum_{i=1}^n \rho^{n-i} \varepsilon_{t+i} \]

Dessa forma, podesse expressar \(m_{t+n}\) em termos do valor conhecido \(m_t\) e da sequência \(\{\varepsilon_{t+1}, \varepsilon_{t+2}, \dots, \varepsilon_{t+n}\}\). A equação final é:

\[ m_{t+n} = m \frac{1 - \rho^{n+1}}{1 - \rho} + \rho^n m_t + \sum_{i=1}^n \rho^{n-i} \varepsilon_{t+i} \]

b. Suppose that all values of εt+i for i > 0 have a mean value of zero. Explain how you could use your result in part a to forecast the money supply n periods into the future.

Dada a premissa, de qye o valor esperado de \(ε_{t+i} = 0\) ,a previsão de \(m_{t+n}\) poderia se orientar para a parte determinística da equação na qual é baseada nos valores de t e e em m, assim: \[ E[m_{t+n}] = m \frac{1 - \rho^{n+1}}{1 - \rho} + \rho^n m_t \]

Restando assim apenas dois termos deterministicos, o primeiro que reflete a média de lomgo prazo ajustada pela convergência e o segundo tempor que reflete a persistencia do valor inicial com decaimento(que tende a 0 no limite). Assim o valor esperado de \(m_{t+n}\) seria simplesmente a soma dos componentes determinísticos, como os choques teriam média 0 e não contribuiriam para a previsão.

2) (2,0 pontos). Questão 13, do capítulo 2 do Enders, página 116, todos os subitens dos itens a) e apenas os subitens i. ii. e iv de b). Obs: No item utilize a variável intitulada “unemp” no arquivo disponibilizado.

  1. The file QUARTERLY.XLS contains a number of series including the U.S. index of industrial production (indprod), unemployment rate (urate), and producer price index for finished goods (finished). All of the series run from 1960Q1 to 2012Q4.
  1. Exercises with indprod.

    i . Construct the growth rate of the series as yt = log(indprodt) − log(indprodt−1). Since the first few autocorrelations suggest an AR(1), estimate yt = 0.0028 + 0.600yt−1 + εt (the t-statistics are 2.96 and 10.95, respectively).

    ii . Show that adding an AR term at lag 8 improves the fit and removes some of the serial correlation. What concerns do you have about simply adding an AR(‖8‖) term to the industrial production series?

Resolução Questão 2

i. Construct the growth rate of the series as yt = log(indprodt) − log(indprodt−1).

Since the first few autocorrelations suggest an AR(1), estimate yt = 0.0028 + 0.600yt−1 + εt (the t-statistics are 2.96 and 10.95, respectively).

1º Passo: Construção da serie da taxa de crescimento da serie


qt <- read_excel("Quarterly1.xls")

unemp<-log(qt$Unemp)-log(lag(qt$Unemp))  %>%  ts(start =1960,frequency = 4) #%>% drop_na()
unemp[2:212] %>% summary()
     Min.   1st Qu.    Median      Mean   3rd Qu.      Max. 
-0.096440 -0.029110 -0.008451  0.002004  0.023345  0.225565 
unemp %>% autoplot +  ggtitle("Serie Temporal da taxa de Crescimento")

2º Passo Averiguar Autocorrelação temporal

unemp[2:212] %>% Acf(plot =FALSE) %>% autoplot()+  labs(title = "Função de Autocorrelação da  Temporal da taxa de Crescimento")

unemp[2:212] %>% Pacf(plot =FALSE)%>% autoplot()+  labs(title = "Função de Autocorrelação parcial da  Temporal da taxa de Crescimento")

A ACF sugere que a série pode ser modelada adequadamente com um modelo \(AR(1)\), já que o decaimento das autocorrelações ocorre rapidamente, podem há uma correlação no 2º e 8º lag. A PACF reforça a conclusão de que um modelo AR(1) é apropriado para capturar a dependência da série.

3º Passo: Estimar \(AR(1)\)

unemp %>% Arima(order = c(1, 0,0))->ar1
ar1%>% summary
Series: . 
ARIMA(1,0,0) with non-zero mean 

Coefficients:
         ar1    mean
      0.6487  0.0020
s.e.  0.0520  0.0076

sigma^2 = 0.001558:  log likelihood = 383.36
AIC=-760.72   AICc=-760.6   BIC=-750.66

Training set error measures:
                       ME       RMSE        MAE MPE MAPE      MASE         ACF1
Training set -8.88872e-05 0.03927782 0.03023091 NaN  Inf 0.5740239 -0.002834366
#Verificando a distribuição dos resíduos
residuos <- ar1$residuals
shapiro.test(residuos)

    Shapiro-Wilk normality test

data:  residuos
W = 0.9646, p-value = 3.962e-05
forecast::checkresiduals(ar1)

    Ljung-Box test

data:  Residuals from ARIMA(1,0,0) with non-zero mean
Q* = 21.517, df = 7, p-value = 0.003076

Model df: 1.   Total lags used: 8

O modelo Indica um coeficiente AR1 significativo de de 0.6486, indicando estacionariodade da serie sendo \(AR(1)<1\). Os residuos mostram normalidade nos residuos, porém tem uma função de correlação significativa para um lag 4 e 8.

ii) Show that adding an AR term at lag 8 improves the fit and removes some of the serial correlation.

What concerns do you have about simply adding an AR(‖8‖) term to the industrial production series?

Estimando o modelo \(AR(8)\),\(AR(4)\) e o \(AR(2)\):

unemp %>% Arima(order = c(2, 0,0))->ar2
ar2%>% summary
Series: . 
ARIMA(2,0,0) with non-zero mean 

Coefficients:
         ar1     ar2    mean
      0.6427  0.0091  0.0020
s.e.  0.0686  0.0688  0.0077

sigma^2 = 0.001565:  log likelihood = 383.37
AIC=-758.73   AICc=-758.54   BIC=-745.33

Training set error measures:
                        ME       RMSE        MAE MPE MAPE      MASE        ACF1
Training set -9.323455e-05 0.03927619 0.03020452 NaN  Inf 0.5735228 0.003425516
unemp %>% Arima(order = c(4, 0,0))->ar4
ar4%>% summary
Series: . 
ARIMA(4,0,0) with non-zero mean 

Coefficients:
         ar1     ar2     ar3      ar4    mean
      0.6364  0.0365  0.0912  -0.1948  0.0017
s.e.  0.0673  0.0802  0.0806   0.0681  0.0061

sigma^2 = 0.001518:  log likelihood = 387.49
AIC=-762.98   AICc=-762.56   BIC=-742.86

Training set error measures:
                     ME       RMSE        MAE MPE MAPE      MASE        ACF1
Training set 7.8184e-05 0.03850216 0.02957847 NaN  Inf 0.5616354 0.007660828
unemp %>% Arima(order = c(8, 0,0))->ar8
ar8%>% summary
Series: . 
ARIMA(8,0,0) with non-zero mean 

Coefficients:
         ar1     ar2     ar3      ar4      ar5     ar6     ar7      ar8    mean
      0.6255  0.0829  0.0616  -0.2605  -0.0028  0.1463  0.0915  -0.2603  0.0021
s.e.  0.0662  0.0790  0.0787   0.0794   0.0789  0.0787  0.0792   0.0677  0.0050

sigma^2 = 0.001425:  log likelihood = 395.9
AIC=-771.8   AICc=-770.7   BIC=-738.28

Training set error measures:
                       ME     RMSE        MAE MPE MAPE      MASE       ACF1
Training set 8.006676e-06 0.036941 0.02766273 NaN  Inf 0.5252594 0.02599808
forecast::checkresiduals(ar2)

    Ljung-Box test

data:  Residuals from ARIMA(2,0,0) with non-zero mean
Q* = 21.518, df = 6, p-value = 0.00148

Model df: 2.   Total lags used: 8

forecast::checkresiduals(ar4)

    Ljung-Box test

data:  Residuals from ARIMA(4,0,0) with non-zero mean
Q* = 16.715, df = 4, p-value = 0.002195

Model df: 4.   Total lags used: 8

forecast::checkresiduals(ar8)

    Ljung-Box test

data:  Residuals from ARIMA(8,0,0) with non-zero mean
Q* = 8.3177, df = 3, p-value = 0.03988

Model df: 8.   Total lags used: 11

O resíduos dos modelos \(AR(2)\) e \(AR(4)\) apresentaram autocorrelação significativa no 8º lag,justificando a inclusão do termo \(AR(8)\), para testar sua relevância.O \(AR(2)\) não apresentou coeficientes AR2 significativos, já o \(AR(4)\) mostrou AR4 ligeiramente significativo. Mas, o modelo \(AR(8)\) apresentou alguns coeficientes significativos (AR1,AR4,AR8).

data.frame(
  Model = c("ARMA(1)", "ARMA(2)","ARIMA(4)", "ARMA(8)"),
  AIC = c(AIC(ar1), AIC(ar2), AIC(ar4),AIC(ar8)),
  BIC = c(BIC(ar1), BIC(ar2), BIC(ar4),BIC(ar8)),
  RMSE = c(accuracy(ar1)[2], accuracy(ar2)[2],accuracy(ar4)[2], accuracy(ar8)[2]),
  MAE =  c(accuracy(ar1)[3], accuracy(ar2)[3],accuracy(ar4)[3], accuracy(ar8)[3])
)
NA

Observando os Indicadores de qualidade o modelo, O \(AR(8)\) tem o menor Critério de Akaike (AIC) (−771.8), e erro residual (\(𝜎^2=0.001425\)), indicando o melhor ajuste entre os modelos, porém o modelo tem o maior Critério Bayesiano (BIC) (-738.2829 ), que penaliza mais a complexidade do modelo. Embora o \(AR(8)\) tenha apresentado o melhor ajuste em termos de AIC e \(𝜎^2\), sua maior complexidade e a baixa significância de vários coeficientes podem limitar sua utilidade prática. Assim dependendo a finalidade, um modelo mais simples, como AR(1), pode ser preferível dependendo do objetivo da análise.

3) (2,0 pontos). Utilize a série do arquivo Y_break. A série em questão foi simulada da seguinte forma: Até a observação 100, y(t)= 1+0.5y(t-1)+e(t). A partir da observação 101, y(t)=2+0.6y(t-1)+e(t). Faça o que se pede:

  1. Verifique o resultado dos testes de raiz unitária ADF e com quebra estrutural, da respectiva série dessa questão. O que vc pode concluir?

Resolução Questão 3)a)Verifique o resultado dos testes de raiz unitária ADF e com quebra estrutural, da respectiva série dessa questão. O que vc pode concluir?

1º Passo: Construir Serie:

y_break <- read_excel("y_break.xlsx")
New names:
y_break$Y_break %>% ts %>% autoplot()

2º Passo: Realizar Teste de Raiz Unitária

adf_test <-y_break$Y_break %>% ts %>% adf.test(alternative = "stationary")
kpss_test <- kpss.test(y_break_ts, null = "Level", lshort = TRUE)
Warning: p-value smaller than printed p-value
adf_test

    Augmented Dickey-Fuller Test

data:  .
Dickey-Fuller = -2.3747, Lag order = 5, p-value = 0.4203
alternative hypothesis: stationary
kpss_test

    KPSS Test for Level Stationarity

data:  y_break_ts
KPSS Level = 2.2868, Truncation lag parameter = 4, p-value = 0.01

Para o Teste KPSS temos um p-valor de 0.01, logo rejeitamos a hipótese de estacionáriadade. O mesmo é reforçado, no Teste Dickey-Fuller com um p-valor de 0.4203, não rejeitamos a hipótese nula (\(H_0\)) de que a série possui uma raiz unitária. Isso implica que a série como esta não é estacionária.

3º Passo: Realizar Teste de Quebra Estrutural de Chow e Perron para identificar ponto de quebra

# Teste supF
sctest(y_break_ts ~ 1, type = "Chow")

    Chow test

data:  y_break_ts ~ 1
F = 137.94, p-value < 2.2e-16

No teste de Chow o p-valor encontrado é muito baixo, indicando que devemos rejeitamos a hipótese nula de que não há quebras estruturais, Portanto, há evidência de uma quebra estrutural significativa na série. Assim, seguimos ao teste de Perron para identificar o melhor candidato ao ponto de quebra.

y_break_ts <-y_break$Y_break %>% ts 
breaks <- breakpoints(y_break_ts ~ 1)

summary(breaks)

     Optimal (m+1)-segment partition: 

Call:
breakpoints.formula(formula = y_break_ts ~ 1)

Breakpoints at observation number:
                        
m = 1            100    
m = 2         73 102    
m = 3         73 102 124
m = 4   22    73 102 124
m = 5   22 44 73 102 124

Corresponding to breakdates:
                        
m = 1            100    
m = 2         73 102    
m = 3         73 102 124
m = 4   22    73 102 124
m = 5   22 44 73 102 124

Fit:
                                             
m   0      1      2      3      4      5     
RSS 1410.7  230.9  218.5  211.1  209.0  206.0
BIC  771.9  510.4  512.2  517.0  525.6  533.4

pelo resultado do teste, foi identificada o ponto de quebra na observação 100.

y_break_ts <- ts(y_break$Y_break)

autoplot(y_break_ts) + 
  geom_vline(xintercept = 100, linetype = "dashed", color = "red") +
  ggtitle("Série Y_break com Ponto de Quebra")

Dessa forma, podemos fazer um teste de estacionáridade a partir ponto de quebra para corroborar a hipotese. Assim,a série foi dividida em dois segmentos


segment1 <- window(y_break_ts, end = 100)
segment2 <- window(y_break_ts, start = 101)

adf_test_seg1 <- adf.test(segment1,alternative = "stationary")
adf_test_seg2 <- adf.test(segment2,alternative = "stationary")
kpss_test_seg1 <- kpss.test(segment1, null = "Level", lshort = TRUE)
Warning: p-value greater than printed p-value
kpss_test_seg2 <- kpss.test(segment2, null = "Level", lshort = TRUE)
Warning: p-value greater than printed p-value
adf_test_seg1

    Augmented Dickey-Fuller Test

data:  segment1
Dickey-Fuller = -4.0134, Lag order = 4, p-value = 0.01139
alternative hypothesis: stationary
adf_test_seg2

    Augmented Dickey-Fuller Test

data:  segment2
Dickey-Fuller = -3.5132, Lag order = 3, p-value = 0.04924
alternative hypothesis: stationary
kpss_test_seg1

    KPSS Test for Level Stationarity

data:  segment1
KPSS Level = 0.28801, Truncation lag parameter = 4, p-value = 0.1
kpss_test_seg2

    KPSS Test for Level Stationarity

data:  segment2
KPSS Level = 0.11502, Truncation lag parameter = 3, p-value = 0.1

a partir dos resultados podemos ver que separadamente, podemos confirmar a estacionáriadade para cada segmento dadi que o teste Dickey-Fuller teve um p-valor<0.05 , e, inversamente, o KPSS teve um p-valor alto.

4º Passo: Interpretar os Resultados

Os resultados indicam que a série, como um todo, não é estacionária, como apontado pelo teste ADF, sugerindo dinâmicas não estacionárias relacionadas à presença de uma quebra estrutural. O teste de Chow confirma essa quebra no ponto 100, evidenciando uma mudança significativa no comportamento da série, em linha com a simulação proposta. A análise segmentada revela que os coeficientes do modelo mudam entre os regimes, refletindo dinâmicas distintas nos dois segmentos da série. Ambos os segmentos, no entanto, apresentam estacionariedade individual, permitindo que sejam modelados separadamente como processos estacionários distintos, cada um com sua própria estrutura.

4) (2,5 pontos) Efeitos da dedução de impostos nas taxas de fertilidade. O arquivo fértil3 possui informações sobre o número de crianças nascidas para cada 1.000 mulheres em idade fértil (gfr). Para os anos de 1913 a 1984, a equação

\(gfr=β_0+ β_1 pe_t + β2 ww2_t + β3 pill_t\)

pet é a dedução de impostos de renda por filhos, ww 2t recebe o valor 1 para os anos da 2ª Guerra Mundial e pillt tem valor 1 a partir de 1963 quando o anticoncepcional foi disponibilizado.

Resolução Questão 4)

i) Estime essa equação.

Fertil3 <- read_excel("Fertil3.xlsx")
New names:
dynlm(GFR ~PE+ww2+pill,Fertil3)  ->mod
stargazer(mod,type = "text")
Warning: length of NULL cannot be changedWarning: length of NULL cannot be changedWarning: length of NULL cannot be changedWarning: length of NULL cannot be changedWarning: length of NULL cannot be changed

===============================================
                        Dependent variable:    
                    ---------------------------
                                GFR            
-----------------------------------------------
PE                           0.083***          
                              (0.030)          
                                               
ww2                         -24.238***         
                              (7.458)          
                                               
pill                        -31.594***         
                              (4.081)          
                                               
Constant                     98.682***         
                              (3.208)          
                                               
-----------------------------------------------
Observations                    72             
R2                             0.473           
Adjusted R2                    0.450           
Residual Std. Error      14.685 (df = 68)      
F Statistic           20.378*** (df = 3; 68)   
===============================================
Note:               *p<0.1; **p<0.05; ***p<0.01

observando o coeficiente PE desse modelo, implicaria que a Dedução de Impostos tem um efeito positivo e significativo sobre a taxa de fertilidade.

ii) A taxa de fertilidade deveria reagir às renúncias do imposto de renda, mas com lags. Inclua um e dois lags de pet e avalie os resultados.


mod_l1<-dynlm(GFR ~L(PE,1)+ww2+pill,Fertil3 %>% zoo())
mod_l2<-dynlm(GFR ~L(PE,2)+ww2+pill,Fertil3 %>% zoo())
mod_l12<-dynlm(GFR ~L(PE,1)+L(PE,2)+ww2+pill,Fertil3%>% zoo()) 
mod_l012<-dynlm(GFR ~PE+L(PE,1)+L(PE,2)+ww2+pill,Fertil3%>% zoo())
                
stargazer::stargazer(mod_l1,mod_l2,mod_l12,mod_l012,type = "text")
Warning: length of NULL cannot be changedWarning: length of NULL cannot be changedWarning: length of NULL cannot be changedWarning: length of NULL cannot be changedWarning: length of NULL cannot be changedWarning: number of rows of result is not a multiple of vector length (arg 2)Warning: number of rows of result is not a multiple of vector length (arg 2)

===============================================================================================================
                                                        Dependent variable:                                    
                    -------------------------------------------------------------------------------------------
                                                                GFR                                            
                             (1)                    (2)                    (3)                    (4)          
---------------------------------------------------------------------------------------------------------------
PE                                                                                               0.073         
                                                                                                (0.126)        
                                                                                                               
L(PE, 1)                   0.086***                                       0.046                  -0.006        
                           (0.028)                                       (0.126)                (0.156)        
                                                                                                               
L(PE, 2)                                          0.093***                0.048                  0.034         
                                                  (0.027)                (0.123)                (0.126)        
                                                                                                               
ww2                       -20.716***             -16.472**              -18.471**              -22.127**       
                           (6.991)                (6.669)                (8.634)                (10.732)       
                                                                                                               
pill                      -31.403***             -31.256***             -31.275***             -31.305***      
                           (4.024)                (3.934)                (3.961)                (3.982)        
                                                                                                               
Constant                  97.795***              96.438***              96.297***              95.870***       
                           (3.159)                (3.138)                (3.182)                (3.282)        
                                                                                                               
---------------------------------------------------------------------------------------------------------------
Observations                  71                     70                     70                     70          
R2                          0.481                  0.495                  0.496                  0.499         
Adjusted R2                 0.458                  0.472                  0.465                  0.459         
Residual Std. Error    14.457 (df = 67)       14.104 (df = 66)       14.197 (df = 65)       14.270 (df = 64)   
F Statistic         20.713*** (df = 3; 67) 21.558*** (df = 3; 66) 15.990*** (df = 4; 65) 12.728*** (df = 5; 64)
===============================================================================================================
Note:                                                                               *p<0.1; **p<0.05; ***p<0.01

Ambos os lags \(L(PE,1), L(PE,2))\) são significativos nos modelos com um ou dois lags. Porém, nos modelos conjuntos o PE com lag não presenta um coeficiente significativo, indicando que pode haver uma autocorreção entre os lags.

iii) Teste o modelo incluindo uma tendência determinística.

# Adicionar uma variável de tendência ao modelo
mod_l0t<-dynlm(GFR~ trend(GFR)+PE+ww2+pill,Fertil3 %>% zoo())
mod_l1t<-dynlm(GFR~ trend(GFR)+L(PE,1)+ww2+pill,Fertil3 %>% zoo())
mod_l2t<-dynlm(GFR ~trend(GFR)+L(PE,2)+ww2+pill,Fertil3 %>% zoo())
mod_l12t<-dynlm(GFR ~trend(GFR)+L(PE,1)+L(PE,2)+ww2+pill,Fertil3%>% zoo()) 
mod_l012t<-dynlm(GFR ~trend(GFR)+PE+L(PE,1)+L(PE,2)+ww2+pill,Fertil3%>% zoo())
                
stargazer::stargazer(mod_l0t,mod_l1t,mod_l2t,mod_l12t,mod_l012t,type = "text")
Warning: length of NULL cannot be changedWarning: length of NULL cannot be changedWarning: length of NULL cannot be changedWarning: length of NULL cannot be changedWarning: length of NULL cannot be changedWarning: number of rows of result is not a multiple of vector length (arg 2)Warning: number of rows of result is not a multiple of vector length (arg 2)

======================================================================================================================================
                                                                   Dependent variable:                                                
                    ------------------------------------------------------------------------------------------------------------------
                                                                           GFR                                                        
                             (1)                    (2)                    (3)                    (4)                    (5)          
--------------------------------------------------------------------------------------------------------------------------------------
trend(GFR)                -1.150***              -1.028***              -1.020***              -1.034***              -1.106***       
                           (0.188)                (0.190)                (0.192)                (0.193)                (0.193)        
                                                                                                                                      
PE                         0.279***                                                                                     0.193*        
                           (0.040)                                                                                     (0.105)        
                                                                                                                                      
L(PE, 1)                                          0.246***                                       0.094                  -0.041        
                                                  (0.038)                                       (0.106)                (0.127)        
                                                                                                                                      
L(PE, 2)                                                                 0.246***                0.159                  0.128         
                                                                         (0.037)                (0.105)                (0.105)        
                                                                                                                                      
ww2                       -35.592***             -23.710***             -12.858**              -16.856**              -26.445***      
                           (6.297)                (5.889)                (5.650)                (7.232)                (8.805)        
                                                                                                                                      
pill                        0.997                  -2.298                 -2.659                 -2.296                 -0.377        
                           (6.262)                (6.350)                (6.312)                (6.336)                (6.307)        
                                                                                                                                      
Constant                  111.769***             110.855***             109.970***             109.874***             109.678***      
                           (3.358)                (3.584)                (3.665)                (3.673)                (3.608)        
                                                                                                                                      
--------------------------------------------------------------------------------------------------------------------------------------
Observations                  72                     71                     70                     70                     70          
R2                          0.662                  0.641                  0.648                  0.652                  0.670         
Adjusted R2                 0.642                  0.619                  0.626                  0.625                  0.639         
Residual Std. Error    11.849 (df = 67)       12.124 (df = 66)       11.862 (df = 65)       11.881 (df = 64)       11.665 (df = 63)   
F Statistic         32.837*** (df = 4; 67) 29.410*** (df = 4; 66) 29.933*** (df = 4; 65) 24.026*** (df = 5; 64) 21.335*** (df = 6; 63)
======================================================================================================================================
Note:                                                                                                      *p<0.1; **p<0.05; ***p<0.01

Ao adicionar uma tendencia linear no modelo, observa-se que ela é significativa para todos os modelos.

iv) Analise as autocorrelações de gfr e pet . Com base nessas autocorrelações o que é possível concluir?


# Análise de autocorrelação de gfr
acf(Fertil3$GFR, main = "Autocorrelação de gfr",plot = T)

pacf(Fertil3$GFR, main = "Autocorrelação de gfr",plot = T)


# Análise de autocorrelação de pet
acf(Fertil3$PE, main = "Autocorrelação de pe",plot = T)

pacf(Fertil3$PE, main = "Autocorrelação de pe",plot = T)



Ccf(Fertil3$PE,Fertil3$GFR, main = "Autocorrelação Cruzada de pet e gfr",plot = T)

Ao fazer uma analise grafica para as autocorrelações, observamos que que há uma alta autocorrelação persistente nas variaveis, com mais lags PE que na fertilidade, o que sugerem um padrão autoregressivo que pode ser capturado com termos AR. porém, uma autocorrelação baixa nas função de autocorrelação parcial, indicando que elas tem um efeito temporal longo. Ao observar a autocorrelação cruzada ve-se que mudanças passadas em PE têm impacto na fertilidade, mostrando que decisões de política fiscal levam algum tempo para se traduzirem em mudanças no comportamento reprodutivo.A ausência de um pico significativo no lag zero e negativos sugere que PE não tem um impacto imediato em GFR nem uma relação de influencia inversa.

v) Estime o modelo com as duas variáveis em primeiras diferenças. Teste a inclusão de pet de forma contemporânea e uma e duas defasagens conjuntamente. Qual a conclusão desse exercício?

# Adicionar uma variável de tendência ao modelo
mod_l012td<-dynlm(d(GFR) ~trend(GFR)+d(PE)+d(PE,2)+d(PE,3)+ww2+pill,Fertil3%>% zoo())
mod_l01td<-dynlm(d(GFR) ~trend(GFR)+d(PE)+d(PE,2)+ww2+pill,Fertil3%>% zoo())
mod_l0td<-dynlm(d(GFR) ~trend(GFR)+d(PE)+ww2+pill,Fertil3%>% zoo())

mod_l012d<-dynlm(d(GFR) ~d(PE)+d(PE,2)+d(PE,3)+ww2+pill,Fertil3%>% zoo())
mod_l01d<-dynlm(d(GFR) ~d(PE)+d(PE,2)+ww2+pill,Fertil3%>% zoo())
mod_l0d<-dynlm(d(GFR) ~d(PE)+ww2+pill,Fertil3%>% zoo())
                
stargazer::stargazer(
  mod_l012td,mod_l012d,
mod_l01td,mod_l01d,
mod_l0td,mod_l0d,
  type = "text")
Warning: length of NULL cannot be changedWarning: length of NULL cannot be changedWarning: length of NULL cannot be changedWarning: length of NULL cannot be changedWarning: length of NULL cannot be changedWarning: number of rows of result is not a multiple of vector length (arg 2)Warning: number of rows of result is not a multiple of vector length (arg 2)Warning: number of rows of result is not a multiple of vector length (arg 2)Warning: number of rows of result is not a multiple of vector length (arg 2)Warning: number of rows of result is not a multiple of vector length (arg 2)

=======================================================================================================================================================
                                                                            Dependent variable:                                                        
                    -----------------------------------------------------------------------------------------------------------------------------------
                                                                                  d(GFR)                                                               
                             (1)                   (2)                   (3)                   (4)                   (5)                   (6)         
-------------------------------------------------------------------------------------------------------------------------------------------------------
trend(GFR)                 0.094**                                     0.079*                                      0.076*                              
                           (0.038)                                     (0.040)                                     (0.038)                             
                                                                                                                                                       
d(PE)                      -0.023                -0.024                -0.050                -0.050               -0.086***             -0.094***      
                           (0.040)               (0.042)               (0.042)               (0.043)               (0.032)               (0.033)       
                                                                                                                                                       
d(PE, 2)                  -0.134***             -0.140***              -0.043                -0.054                                                    
                           (0.041)               (0.043)               (0.035)               (0.035)                                                   
                                                                                                                                                       
d(PE, 3)                  0.095***              0.088***                                                                                               
                           (0.027)               (0.028)                                                                                               
                                                                                                                                                       
ww2                         3.251                4.839*                6.643**              7.826***               4.432*                5.132**       
                           (2.797)               (2.832)               (2.832)               (2.830)               (2.230)               (2.249)       
                                                                                                                                                       
pill                      -4.888***              -1.676               -4.812***              -2.069*              -4.702***              -1.987*       
                           (1.616)               (1.005)               (1.726)               (1.052)               (1.715)               (1.049)       
                                                                                                                                                       
Constant                  -3.141***              -0.650               -2.614**               -0.589               -2.396**               -0.470        
                           (1.150)               (0.582)               (1.184)               (0.609)               (1.140)               (0.603)       
                                                                                                                                                       
-------------------------------------------------------------------------------------------------------------------------------------------------------
Observations                 69                    69                    70                    70                    71                    71          
R2                          0.359                 0.296                 0.231                 0.184                 0.202                 0.155        
Adjusted R2                 0.297                 0.240                 0.171                 0.134                 0.154                 0.117        
Residual Std. Error    3.611 (df = 62)       3.756 (df = 63)       3.894 (df = 64)       3.981 (df = 65)       3.917 (df = 66)       4.001 (df = 67)   
F Statistic         5.792*** (df = 6; 62) 5.288*** (df = 5; 63) 3.845*** (df = 5; 64) 3.661*** (df = 4; 65) 4.187*** (df = 4; 66) 4.103*** (df = 3; 67)
=======================================================================================================================================================
Note:                                                                                                                       *p<0.1; **p<0.05; ***p<0.01

O impacto contemporâneonão é significativo quando junto as defasagens, mas as defasagens apresentam efeitos significativos. Os efeitos de deduções fiscais são mais evidentes com defasagens, reforçando que mudanças em políticas fiscais influenciam a fertilidade ao longo de vários períodos.

vi) Qual a conclusão que é possível obter sobre a relação entre dedução de impostos e fertilidade?

A dedução de impostos tem um impacto positivo na taxa de fertilidade, mas esse efeito ocorre principalmente com atraso (defasagens de 1 a 2 períodos). O efeito imediato (contemporâneo) é menos evidente. WW2 e Pill têm efeitos significativos e negativos, capturando choques estruturais relacionados à fertilidade. A inclusão de uma tendência mostra uma queda estrutural na fertilidade ao longo do tempo, sugerindo que fatores culturais e socioeconômicos de longo prazo também desempenham um papel importante. A dependência temporal das variáveis reforça a necessidade de considerar modelos com defasagens para capturar adequadamente o impacto das deduções fiscais.

5) (2,5 pontos) O arquivo IPCA possui uma série da taxa de inflação ao consumidor do Brasil no período entre janeiro de 1995 e outubro de 2017.

Resolução Questão 5)

i) Aplique a metodologia Box Jenkins para encontrar o melhor modelo para esta série.

A metodologia Box Jenkins consistem em identifitica a ordem de diferenciação para a estatacionalidade da serie, estimar os diferentes modelos de ARMA e escolher os melhores modelos pelo bom comportamento dos resíduos e pelos critérios de AIC e BIC. vejamos a serie:

ipca_data <- read_excel("IPCA.xlsx")
New names:
ipca_ts<-ts(ipca_data$IPCA, start = c(1995, 1), frequency = 12) 
ipca_ts %>% autoplot()

Para estimar a estacionariadade primeiro vamos avaliar se a serie apresenta autocorreção significativa e se é estacionária:

Acf(ipca_ts, main = "ACF da Série ")

adf.test(ipca_ts, alternative = "stationary")
Warning: p-value smaller than printed p-value

    Augmented Dickey-Fuller Test

data:  ipca_ts
Dickey-Fuller = -6.0631, Lag order = 6, p-value = 0.01
alternative hypothesis: stationary

Pela função de autocorreção, que ela apresenta autocorreção em varias de suas defasagens. Vemos também que a serie não é estacionária. vamos realizar agora os mesmos testes para sua versão com 1º diferença

ipca_diff <- diff(ipca_ts)
ipca_diff %>% autoplot()

Acf(ipca_diff, main = "ACF da Série Diferenciada")

Pacf(ipca_diff, main = "PACF da Série Diferenciada")


adf.test(ipca_diff, alternative = "stationary")
Warning: p-value smaller than printed p-value

    Augmented Dickey-Fuller Test

data:  ipca_diff
Dickey-Fuller = -9.4568, Lag order = 6, p-value = 0.01
alternative hypothesis: stationary

Podemos ver que ela é uma serie estacionária com autocorreção para algumas de suas defasagens (2º,9º e 12º), sugerindo um MA, e autocorrelação parcial(para as defasagens 2º,5º, 7º, 8º, e da 10º à 12º), sugerindo um AR.


# Testar estaci# Testar diferentes modelos ARIMA
modelos<-list()
Arima(ipca_ts, order = c(1, 1, 1))  %>% checkresiduals #Residuo Mau comportado 

    Ljung-Box test

data:  Residuals from ARIMA(1,1,1)
Q* = 52.97, df = 22, p-value = 0.0002293

Model df: 2.   Total lags used: 24

Arima(ipca_ts, order = c(2,1,3))  %>% checkresiduals #Residuo Mau comportado 

    Ljung-Box test

data:  Residuals from ARIMA(2,1,3)
Q* = 45.651, df = 19, p-value = 0.0005552

Model df: 5.   Total lags used: 24

Arima(ipca_ts, order = c(1, 1, 3))  %>% checkresiduals #Residuo Mau comportado 

    Ljung-Box test

data:  Residuals from ARIMA(1,1,3)
Q* = 46.705, df = 20, p-value = 0.0006445

Model df: 4.   Total lags used: 24

Arima(ipca_ts, order = c(3, 1, 3))  %>% checkresiduals #Residuo Mau comportado na defasagem 12

    Ljung-Box test

data:  Residuals from ARIMA(3,1,3)
Q* = 25.963, df = 18, p-value = 0.1006

Model df: 6.   Total lags used: 24

Arima(ipca_ts, order = c(6, 1, 3))  %>% checkresiduals#Residuo Mau comportado na defasagem 12

    Ljung-Box test

data:  Residuals from ARIMA(6,1,3)
Q* = 33.739, df = 15, p-value = 0.003705

Model df: 9.   Total lags used: 24

Arima(ipca_ts, order = c(3, 1, 6))  %>% checkresiduals#Residuo Mau comportado na defasagem 12

    Ljung-Box test

data:  Residuals from ARIMA(3,1,6)
Q* = 34.332, df = 15, p-value = 0.003058

Model df: 9.   Total lags used: 24

Arima(ipca_ts, order = c(3, 2, 3))  %>% checkresiduals#Residuo Mau comportado na defasagem 12 e 7

    Ljung-Box test

data:  Residuals from ARIMA(3,2,3)
Q* = 43.914, df = 18, p-value = 0.0005935

Model df: 6.   Total lags used: 24

Arima(ipca_ts, order = c(6, 3, 3))  %>% checkresiduals#Residuo Mau comportado na defasagem 12

    Ljung-Box test

data:  Residuals from ARIMA(6,3,3)
Q* = 45.606, df = 15, p-value = 6.14e-05

Model df: 9.   Total lags used: 24

Arima(ipca_ts, order = c(3, 4, 6))  %>% checkresiduals#Residuo Mau comportado na defasagem 12

    Ljung-Box test

data:  Residuals from ARIMA(3,4,6)
Q* = 28.51, df = 15, p-value = 0.01858

Model df: 9.   Total lags used: 24

Arima(ipca_ts, order = c(6, 1, 6))  %>% checkresiduals #Residuo Mau comportado na defasagem 12

    Ljung-Box test

data:  Residuals from ARIMA(6,1,6)
Q* = 27.924, df = 12, p-value = 0.005676

Model df: 12.   Total lags used: 24

Arima(ipca_ts, order = c(9, 1, 6))  %>% checkresiduals#Residuo Bem comportado

    Ljung-Box test

data:  Residuals from ARIMA(9,1,6)
Q* = 14.252, df = 9, p-value = 0.1136

Model df: 15.   Total lags used: 24

Arima(ipca_ts, order = c(9, 1, 3))  %>% checkresiduals #Residuo voltaram a ser mau comportados

    Ljung-Box test

data:  Residuals from ARIMA(9,1,3)
Q* = 18.582, df = 12, p-value = 0.09913

Model df: 12.   Total lags used: 24

Arima(ipca_ts, order = c(9, 1, 5))  %>% checkresiduals #Residuo Bem comportado

    Ljung-Box test

data:  Residuals from ARIMA(9,1,5)
Q* = 14.039, df = 10, p-value = 0.1712

Model df: 14.   Total lags used: 24

Arima(ipca_ts, order = c(7, 1, 5))  %>% checkresiduals #Residuo Bem comportado

    Ljung-Box test

data:  Residuals from ARIMA(7,1,5)
Q* = 14.246, df = 12, p-value = 0.2853

Model df: 12.   Total lags used: 24

Arima(ipca_ts, order = c(6, 1, 5))  %>% checkresiduals # residuos voltaram a ser mau comportados

    Ljung-Box test

data:  Residuals from ARIMA(6,1,5)
Q* = 20.764, df = 13, p-value = 0.07773

Model df: 11.   Total lags used: 24

Tentando esses modelos vemos que o \(ARMA()\), \(ARMA()\) e o \(ARMA()\), foram os melhores candidados por eliminarem a autocorreção significativa dos resíduos. vamos agora comparalos pelo critério de AIC e BIC:

arma916<-Arima(ipca_ts, order = c(9, 1, 6)) 
arma915<-Arima(ipca_ts, order = c(9, 1, 5)) 
arma715<-Arima(ipca_ts, order = c(7, 1, 5)) 

mBIC<-BIC(arma715,arma915,arma916)
maic<-AIC(arma715,arma915,arma916)
data.frame(model=rownames(mBIC),
           BIC=mBIC$BIC,
           AIC=maic$AIC)

Observamos que o melhor modelo seria o Arma(7,1,5) com o meno BIC Menor AIC.

ii) Avalie a existência de quebras estruturais nos modelos escolhidos. Há evidência de quebra estrutural?

# Teste de quebra estrutural com strucchange
breaks <- breakpoints(ipca_ts ~ 1) # Modelo com intercepto
summary(breaks)
# Avaliar estabilidade do modelo (Teste F)
sctest(ipca_ts ~ 1, type = "Chow")

Pelo Teste de Chow temos evidenia para uma quebra estrutural, que pelo metodo de Perron, estaria em 2003.(4)

iii) Faça um modelo alternativo usando apenas a amostra do período a partir de 2003. Esse novo modelo apresenta desempenho melhor? Que avaliação é possível fazer?

# Filtrar a série a partir de 2003
ipca_2003 <- window(ipca_ts, start = c(2003, 4))

# Visualizar a nova série
plot(ipca_2003, main = "IPCA a partir de 2003", ylab = "Inflação (%)", xlab = "Ano")

ipca_2003 %>% adf.test()
Warning: p-value smaller than printed p-value

    Augmented Dickey-Fuller Test

data:  .
Dickey-Fuller = -4.816, Lag order = 5, p-value = 0.01
alternative hypothesis: stationary
ipca_2003 %>% kpss.test()
Warning: p-value greater than printed p-value

    KPSS Test for Level Stationarity

data:  .
KPSS Level = 0.20278, Truncation lag parameter = 4, p-value = 0.1

Tanto o Teste ADF quanto o KPSS indicam estacionaridade na série.A combinação dos dois testes reforça a conclusão de que a série filtrada não exige diferenciação adicional para modelagem. seguida, analisamos as funções de autocorrelação (ACF) e autocorrelação parcial (PACF) para avaliar candidatos AR e MA mais adequados ao modelo.

ipca_2003 %>% acf()

ipca_2003 %>% pacf

O ACF indica LAG significativo até o 4 com uma retorno entre o 9º ao 11º mês. Já o PACF indico um efeito sifnificativo no 8º e 9º Mês

arima(ipca_2003,c(9,0,5))  %>% checkresiduals()

    Ljung-Box test

data:  Residuals from ARIMA(9,0,5) with non-zero mean
Q* = 19.977, df = 10, p-value = 0.02947

Model df: 14.   Total lags used: 24

A partir da analise de residuos e buscando ser parcimonioso o modelo ARMA(9,5) mostrou-se com os resíduos mais comportados.

BIC(arma916,arma_2004)
Warning: models are not all fitted to the same number of observations
AIC(arma916,arma_2004)
Warning: models are not all fitted to the same number of observations

O modelo ajustado com dados pós-2003 apresentou um BIC e AIC e significativamente menor, indicando melhor ajuste e explicando a inflação nesse período de forma mais precisa e com um modelo mais parcimonioso.

LS0tDQp0aXRsZTogIjHCqiBhdmFsaWHDp8OjbyBkZSBNYWNyb2Vjb25vbWV0cmlhIg0KYXV0aG9yOiB8DQogIFRoaWFnbyBOb3JvbmhhIEdhcmRpbiwgQzM1ODQyMw0Kb3V0cHV0Og0KICBodG1sX25vdGVib29rOiANCiAgICAgICAgdG9jOiB0cnVlDQogICAgICAgIHRvY19kZXB0aDogMg0KICBwZGZfZG9jdW1lbnQ6IGRlZmF1bHQNCi0tLQ0KDQpQcm9mOiBNYW5vZWwgUGlyZXNcDQpPcmllbnRhw6fDtWVzOiBOYSBwcm92YSBkZXZlcsOhIGNvbnN0YXIgbm9tZSBlIG1hdHLDrWN1bGEgZG8gZXN0dWRhbnRlLg0KQSBwcm92YSDDqSBpbmRpdmlkdWFsIGUgZGV2ZSBzZXIgZmVpdGEgw6AgbcOjbyBvdSBkZSBmb3JtYSBkaWdpdGFsLCBtYXMgZGV2ZXLDoSBlc3RhciBiZW0gbGVnw612ZWwuDQpBcyBwcm92YXMgZGV2ZXLDo28gc2VyIGVudHJlZ3VlcyBhdMOpIG8gZGlhIDI0LzExLg0KTm8gY2FzbyBkZSBxdWVzdMO1ZXMgYW5hbMOtdGljYXMsIG8gYWx1bm8gZGV2ZXLDoSBkZXNlbnZvbHZlciBvIHJhY2lvY8OtbmlvIGUgw6FsZ2VicmEgZGEgcXVlc3TDo28uDQpObyBjYXNvIGRlIGV4ZXJjw61jaW9zIGVjb25vbcOpdHJpY29zLCDDqSBuZWNlc3PDoXJpbyBxdWUgb3MgcmVzdWx0YWRvcyBzZWphbSByZXBvcnRhZG9zIGRlIGZvcm1hIGNvbXBsZXRhIGUgaW50ZXJwcmV0YWRvcy4NCk9zIGV4ZXJjw61jaW9zIGRvIGxpdnJvIGRvIEVuZGVycyBzZSByZWZlcmVtIMOgIG51bWVyYcOnw6NvIHV0aWxpemFkYSBuYSA0wqogZWRpw6fDo28uDQpPcyBkYWRvcyBwYXJhIHJlYWxpemHDp8OjbyBkb3MgZXhlcmPDrWNpb3MgZXN0w6NvIGRpc3BvbsOtdmVpcyBubyBlLWNsYXNzIGRhIHR1cm1hLg0KT3V0cmFzIGVkacOnw7VlcyBwb2RlbSB0ZXIgbnVtZXJhw6fDo28gZGlzdGludGEuDQpCb2EgcHJvdmEuDQoNCmBgYHtyfQ0KbGlicmFyeShyZWFkeGwpDQpsaWJyYXJ5KHRzZXJpZXMpDQpsaWJyYXJ5KGZvcmVjYXN0KQ0KbGlicmFyeShkcGx5cikNCmxpYnJhcnkodGlkeXZlcnNlKQ0KbGlicmFyeShkeW5sbSkNCmxpYnJhcnkoc3RhcmdhemVyKQ0KbGlicmFyeShzdHJ1Y2NoYW5nZSkNCg0KYGBgDQoNCiMjIyMgMSkgKDEsMCBwb250bykuIFF1ZXN0w6NvIDMsIGNhcMOtdHVsbyAxIGRvIEVuZGVycywgcMOhZ2luYSA0NC4NCg0KMy4gIFN1cHBvc2UgdGhhdCB0aGUgbW9uZXkgc3VwcGx5IHByb2Nlc3MgaGFzIHRoZSBmb3JtIG1+dH4gPSBtICsgz4FtfnTiiJIxfiArIM61dCAsIHdoZXJlIG0gaXMgYSBjb25zdGFudCBhbmQgMCBcPM+BXDwgMS4NCg0KPCEtLSAtLT4NCg0KYS4gIFNob3cgdGhhdCBpdCBpcyBwb3NzaWJsZSB0byBleHByZXNzIG10K24gaW4gdGVybXMgb2YgdGhlIGtub3duIHZhbHVlIG10IGFuZCB0aGUgc2VxdWVuY2Uge861dCsxLCDOtXQrMiwgLi4uICwgzrV0K259Lg0KYi4gIFN1cHBvc2UgdGhhdCBhbGwgdmFsdWVzIG9mIM61dCtpIGZvciBpIFw+IDAgaGF2ZSBhIG1lYW4gdmFsdWUgb2YgemVyby4gRXhwbGFpbiBob3cgeW91IGNvdWxkIHVzZSB5b3VyIHJlc3VsdCBpbiBwYXJ0IGEgdG8gZm9yZWNhc3QgdGhlIG1vbmV5IHN1cHBseSBuIHBlcmlvZHMgaW50byB0aGUgZnV0dXJlLg0KDQojIFJlc29sdcOnw6NvIFF1ZXN0w6NvIDENCiMjIGEuIFNob3cgdGhhdCBpdCBpcyBwb3NzaWJsZSB0byBleHByZXNzIG10K24gaW4gdGVybXMgb2YgdGhlIGtub3duIHZhbHVlIG10IGFuZCB0aGUgc2VxdWVuY2Uge861dCsxLCDOtXQrMiwgLi4uICwgzrV0K259Lg0KDQpRdWVyZW1vcyBkZW1vbnN0cmFyIHF1ZSDDqSBwb3Nzw612ZWwgZXhwcmVzc2FyICRtX3t0K259JCBlbSB0ZXJtb3MgZG8gdmFsb3IgY29uaGVjaWRvICRtX3QkIGUgZGEgc2VxdcOqbmNpYSAkXHtcdmFyZXBzaWxvbl97dCsxfSwgXHZhcmVwc2lsb25fe3QrMn0sIFxkb3RzLCBcdmFyZXBzaWxvbl97dCtufVx9JC4NCg0KQXBsaWNhbmRvIHVtIHJhY2lvY2lvbmlvIGRlIHJlY3Vyc2l2aWRhZGUgcG9kZW1vcyBvYnNlcnZhciBxdWUgcGFyYSAkbiA9IDEkLCB0ZW1vcyBxdWU6DQoNCiQkDQptX3t0KzF9ID0gbSArIFxyaG8gbV90ICsgXHZhcmVwc2lsb25fe3QrMX0NCiQkDQoNClN1YnN0aXR1aW5kbyAkbV90JCBwb3IgJG0gKyBccmhvIG1fe3QtMX0gKyBcdmFyZXBzaWxvbl90JCwgb2J0ZW1vczoNCg0KJCQNCm1fe3QrMX0gPSBtICsgXHJobyAobSArIFxyaG8gbV97dC0xfSArIFx2YXJlcHNpbG9uX3QpICsgXHZhcmVwc2lsb25fe3QrMX0NCiQkDQoNClF1ZSBleHBhbmRpbmRvIHNlcsOhOg0KDQokJA0KbV97dCsxfSA9IG0gKyBccmhvIG0gKyBccmhvXjIgbV97dC0xfSArIFxyaG8gXHZhcmVwc2lsb25fdCArIFx2YXJlcHNpbG9uX3t0KzF9DQokJA0KDQpTdWJzdGl0dcOtbW9zIGl0ZXJhdGl2YW1lbnRlICRtX3t0K24tMX0kLCAkbV97dCtuLTJ9JCwgZSBhc3NpbSBwb3IgZGlhbnRlLg0KQXDDs3MgJG4kIGl0ZXJhw6fDtWVzLCBvYnRlbW9zOg0KDQokJA0KbV97dCtufSA9IG0gXHN1bV97az0wfV5uIFxyaG9eayArIFxyaG9ebiBtX3QgKyBcc3VtX3tpPTF9Xm4gXHJob157bi1pfSBcdmFyZXBzaWxvbl97dCtpfQ0KJCQNCg0KRmluYWxtZW50ZSwgdGVtb3MgcXVlIGEgc29tYSAkXHN1bV97az0wfV5uIFxyaG9eayQgw6kgdW1hIHNvbWEgZmluaXRhIGRlIHVtYSBzw6lyaWUgZ2VvbcOpdHJpY2EsIGRhZG8gcXVlICQwIDwgXHJobyA8IDEkLCBwb2RlbW9zIGVzY3JldsOqLWxhIGNvbW86DQoNCiQkDQpcc3VtX3trPTB9Xm4gXHJob15rID0gXGZyYWN7MSAtIFxyaG9ee24rMX19ezEgLSBccmhvfQ0KJCQNCg0KU3Vic3RpdHVpbmRvIGVzc2Egc29tYSBuYSBlcXVhw6fDo28gcGFyYSAkbV97dCtufSQsIHRlbW9zOg0KDQokJA0KbV97dCtufSA9IG0gXGZyYWN7MSAtIFxyaG9ee24rMX19ezEgLSBccmhvfSArIFxyaG9ebiBtX3QgKyBcc3VtX3tpPTF9Xm4gXHJob157bi1pfSBcdmFyZXBzaWxvbl97dCtpfQ0KJCQNCg0KRGVzc2EgZm9ybWEsIHBvZGVzc2UgZXhwcmVzc2FyICRtX3t0K259JCBlbSB0ZXJtb3MgZG8gdmFsb3IgY29uaGVjaWRvICRtX3QkIGUgZGEgc2VxdcOqbmNpYSAkXHtcdmFyZXBzaWxvbl97dCsxfSwgXHZhcmVwc2lsb25fe3QrMn0sIFxkb3RzLCBcdmFyZXBzaWxvbl97dCtufVx9JC4NCkEgZXF1YcOnw6NvIGZpbmFsIMOpOg0KDQokJA0KbV97dCtufSA9IG0gXGZyYWN7MSAtIFxyaG9ee24rMX19ezEgLSBccmhvfSArIFxyaG9ebiBtX3QgKyBcc3VtX3tpPTF9Xm4gXHJob157bi1pfSBcdmFyZXBzaWxvbl97dCtpfQ0KJCQgXA0KDQojIyAgYi4gU3VwcG9zZSB0aGF0IGFsbCB2YWx1ZXMgb2YgzrV0K2kgZm9yIGkgXD4gMCBoYXZlIGEgbWVhbiB2YWx1ZSBvZiB6ZXJvLiBFeHBsYWluIGhvdyB5b3UgY291bGQgdXNlIHlvdXIgcmVzdWx0IGluIHBhcnQgYSB0byBmb3JlY2FzdCB0aGUgbW9uZXkgc3VwcGx5IG4gcGVyaW9kcyBpbnRvIHRoZSBmdXR1cmUuDQoNCkRhZGEgYSBwcmVtaXNzYSwgZGUgcXllIG8gdmFsb3IgZXNwZXJhZG8gZGUgJM61X3t0K2l9ID0gMCQgLGEgcHJldmlzw6NvIGRlICRtX3t0K259JCBwb2RlcmlhIHNlIG9yaWVudGFyIHBhcmEgYSBwYXJ0ZSBkZXRlcm1pbsOtc3RpY2EgZGEgZXF1YcOnw6NvIG5hIHF1YWwgw6kgYmFzZWFkYSBub3MgdmFsb3JlcyBkZSB0IGUgZSBlbSBtLCBhc3NpbTogDQokJA0KRVttX3t0K259XSA9IG0gXGZyYWN7MSAtIFxyaG9ee24rMX19ezEgLSBccmhvfSArIFxyaG9ebiBtX3QgDQokJA0KDQpSZXN0YW5kbyBhc3NpbSBhcGVuYXMgZG9pcyB0ZXJtb3MgZGV0ZXJtaW5pc3RpY29zLCBvIHByaW1laXJvIHF1ZSByZWZsZXRlIGEgbcOpZGlhIGRlIGxvbWdvIHByYXpvIGFqdXN0YWRhIHBlbGEgY29udmVyZ8OqbmNpYSBlIG8gc2VndW5kbyB0ZW1wb3IgcXVlIHJlZmxldGUgICBhIHBlcnNpc3RlbmNpYSBkbyB2YWxvciBpbmljaWFsIGNvbSBkZWNhaW1lbnRvKHF1ZSB0ZW5kZSBhIDAgbm8gbGltaXRlKS4gQXNzaW0gbyB2YWxvciBlc3BlcmFkbyBkZSAkbV97dCtufSQgc2VyaWEgc2ltcGxlc21lbnRlIGEgc29tYSBkb3MgY29tcG9uZW50ZXMgZGV0ZXJtaW7DrXN0aWNvcywgY29tbyBvcyBjaG9xdWVzIHRlcmlhbSBtw6lkaWEgMCBlIG7Do28gY29udHJpYnVpcmlhbSBwYXJhIGEgcHJldmlzw6NvLg0KDQojIyMjIDIpICgyLDAgcG9udG9zKS4gUXVlc3TDo28gMTMsIGRvIGNhcMOtdHVsbyAyIGRvIEVuZGVycywgcMOhZ2luYSAxMTYsIHRvZG9zIG9zIHN1Yml0ZW5zIGRvcyBpdGVucyBhKSBlIGFwZW5hcyBvcyBzdWJpdGVucyBpLiBpaS4gZSBpdiBkZSBiKS4gT2JzOiBObyBpdGVtIHV0aWxpemUgYSB2YXJpw6F2ZWwgaW50aXR1bGFkYSAidW5lbXAiIG5vIGFycXVpdm8gZGlzcG9uaWJpbGl6YWRvLg0KDQoxMy4gVGhlIGZpbGUgUVVBUlRFUkxZLlhMUyBjb250YWlucyBhIG51bWJlciBvZiBzZXJpZXMgaW5jbHVkaW5nIHRoZSBVLlMuIGluZGV4IG9mIGluZHVzdHJpYWwgcHJvZHVjdGlvbiAoaW5kcHJvZCksIHVuZW1wbG95bWVudCByYXRlICh1cmF0ZSksIGFuZCBwcm9kdWNlciBwcmljZSBpbmRleCBmb3IgZmluaXNoZWQgZ29vZHMgKGZpbmlzaGVkKS4gQWxsIG9mIHRoZSBzZXJpZXMgcnVuIGZyb20gMTk2MFExIHRvIDIwMTJRNC4NCg0KPCEtLSAtLT4NCg0KYS4gIEV4ZXJjaXNlcyB3aXRoIGluZHByb2QuDQoNCiAgICBpIC4NCiAgICBDb25zdHJ1Y3QgdGhlIGdyb3d0aCByYXRlIG9mIHRoZSBzZXJpZXMgYXMgeXQgPSBsb2coaW5kcHJvZHQpIOKIkiBsb2coaW5kcHJvZHTiiJIxKS4NCiAgICBTaW5jZSB0aGUgZmlyc3QgZmV3IGF1dG9jb3JyZWxhdGlvbnMgc3VnZ2VzdCBhbiBBUigxKSwgZXN0aW1hdGUgeXQgPSAwLjAwMjggKyAwLjYwMHl04oiSMSArIM61dCAodGhlIHQtc3RhdGlzdGljcyBhcmUgMi45NiBhbmQgMTAuOTUsIHJlc3BlY3RpdmVseSkuDQoNCiAgICBpaSAuDQogICAgU2hvdyB0aGF0IGFkZGluZyBhbiBBUiB0ZXJtIGF0IGxhZyA4IGltcHJvdmVzIHRoZSBmaXQgYW5kIHJlbW92ZXMgc29tZSBvZiB0aGUgc2VyaWFsIGNvcnJlbGF0aW9uLg0KICAgIFdoYXQgY29uY2VybnMgZG8geW91IGhhdmUgYWJvdXQgc2ltcGx5IGFkZGluZyBhbiBBUijigJY44oCWKSB0ZXJtIHRvIHRoZSBpbmR1c3RyaWFsIHByb2R1Y3Rpb24gc2VyaWVzPw0KDQojIFJlc29sdcOnw6NvIFF1ZXN0w6NvIDINCg0KIyMgaS4gQ29uc3RydWN0IHRoZSBncm93dGggcmF0ZSBvZiB0aGUgc2VyaWVzIGFzIHl0ID0gbG9nKGluZHByb2R0KSDiiJIgbG9nKGluZHByb2R04oiSMSkuDQogICAgU2luY2UgdGhlIGZpcnN0IGZldyBhdXRvY29ycmVsYXRpb25zIHN1Z2dlc3QgYW4gQVIoMSksIGVzdGltYXRlIHl0ID0gMC4wMDI4ICsgMC42MDB5dOKIkjEgKyDOtXQgKHRoZSB0LXN0YXRpc3RpY3MgYXJlIDIuOTYgYW5kIDEwLjk1LCByZXNwZWN0aXZlbHkpLg0KDQoxwrogUGFzc286IENvbnN0cnXDp8OjbyBkYSBzZXJpZSBkYSB0YXhhIGRlIGNyZXNjaW1lbnRvIGRhIHNlcmllDQoNCmBgYHtyIGVjaG89VFJVRX0NCg0KcXQgPC0gcmVhZF9leGNlbCgiUXVhcnRlcmx5MS54bHMiKQ0KDQp1bmVtcDwtbG9nKHF0JFVuZW1wKS1sb2cobGFnKHF0JFVuZW1wKSkgICU+JSAgdHMoc3RhcnQgPTE5NjAsZnJlcXVlbmN5ID0gNCkgIyU+JSBkcm9wX25hKCkNCnVuZW1wWzI6MjEyXSAlPiUgc3VtbWFyeSgpDQp1bmVtcCAlPiUgYXV0b3Bsb3QgKyAgZ2d0aXRsZSgiU2VyaWUgVGVtcG9yYWwgZGEgdGF4YSBkZSBDcmVzY2ltZW50byIpDQoNCmBgYA0KDQoywrogUGFzc28gQXZlcmlndWFyIEF1dG9jb3JyZWxhw6fDo28gdGVtcG9yYWwNCg0KYGBge3J9DQp1bmVtcFsyOjIxMl0gJT4lIEFjZihwbG90ID1GQUxTRSkgJT4lIGF1dG9wbG90KCkrICBsYWJzKHRpdGxlID0gIkZ1bsOnw6NvIGRlIEF1dG9jb3JyZWxhw6fDo28gZGEgIFRlbXBvcmFsIGRhIHRheGEgZGUgQ3Jlc2NpbWVudG8iKQ0KdW5lbXBbMjoyMTJdICU+JSBQYWNmKHBsb3QgPUZBTFNFKSU+JSBhdXRvcGxvdCgpKyAgbGFicyh0aXRsZSA9ICJGdW7Dp8OjbyBkZSBBdXRvY29ycmVsYcOnw6NvIHBhcmNpYWwgZGEgIFRlbXBvcmFsIGRhIHRheGEgZGUgQ3Jlc2NpbWVudG8iKQ0KYGBgDQoNCkEgQUNGIHN1Z2VyZSBxdWUgYSBzw6lyaWUgcG9kZSBzZXIgbW9kZWxhZGEgYWRlcXVhZGFtZW50ZSBjb20gdW0gbW9kZWxvICRBUigxKSQsIGrDoSBxdWUgbyBkZWNhaW1lbnRvIGRhcyBhdXRvY29ycmVsYcOnw7VlcyBvY29ycmUgcmFwaWRhbWVudGUsIHBvZGVtIGjDoSB1bWEgY29ycmVsYcOnw6NvIG5vIDLCuiBlIDjCuiBsYWcuDQpBIFBBQ0YgcmVmb3LDp2EgYSBjb25jbHVzw6NvIGRlIHF1ZSB1bSBtb2RlbG8gQVIoMSkgw6kgYXByb3ByaWFkbyBwYXJhIGNhcHR1cmFyIGEgZGVwZW5kw6puY2lhIGRhIHPDqXJpZS4NCg0KM8K6IFBhc3NvOiBFc3RpbWFyICRBUigxKSQNCg0KYGBge3J9DQp1bmVtcCAlPiUgQXJpbWEob3JkZXIgPSBjKDEsIDAsMCkpLT5hcjENCmFyMSU+JSBzdW1tYXJ5DQoNCmBgYA0KDQpgYGB7cn0NCiNWZXJpZmljYW5kbyBhIGRpc3RyaWJ1acOnw6NvIGRvcyByZXPDrWR1b3MNCnJlc2lkdW9zIDwtIGFyMSRyZXNpZHVhbHMNCnNoYXBpcm8udGVzdChyZXNpZHVvcykNCmZvcmVjYXN0OjpjaGVja3Jlc2lkdWFscyhhcjEpDQpgYGANCg0KTyBtb2RlbG8gSW5kaWNhIHVtIGNvZWZpY2llbnRlIEFSMSBzaWduaWZpY2F0aXZvIGRlIGRlIDAuNjQ4NiwgaW5kaWNhbmRvIGVzdGFjaW9uYXJpb2RhZGUgZGEgc2VyaWUgc2VuZG8gJEFSKDEpPDEkLg0KT3MgcmVzaWR1b3MgbW9zdHJhbSBub3JtYWxpZGFkZSBub3MgcmVzaWR1b3MsIHBvcsOpbSB0ZW0gdW1hIGZ1bsOnw6NvIGRlIGNvcnJlbGHDp8OjbyBzaWduaWZpY2F0aXZhIHBhcmEgdW0gbGFnIDQgZSA4Lg0KDQojIyBpaSkgU2hvdyB0aGF0IGFkZGluZyBhbiBBUiB0ZXJtIGF0IGxhZyA4IGltcHJvdmVzIHRoZSBmaXQgYW5kIHJlbW92ZXMgc29tZSBvZiB0aGUgc2VyaWFsIGNvcnJlbGF0aW9uLg0KICAgIFdoYXQgY29uY2VybnMgZG8geW91IGhhdmUgYWJvdXQgc2ltcGx5IGFkZGluZyBhbiBBUijigJY44oCWKSB0ZXJtIHRvIHRoZSBpbmR1c3RyaWFsIHByb2R1Y3Rpb24gc2VyaWVzPw0KRXN0aW1hbmRvIG8gbW9kZWxvICRBUig4KSQsJEFSKDQpJCBlIG8gJEFSKDIpJDoNCg0KYGBge3J9DQp1bmVtcCAlPiUgQXJpbWEob3JkZXIgPSBjKDIsIDAsMCkpLT5hcjINCmFyMiU+JSBzdW1tYXJ5DQp1bmVtcCAlPiUgQXJpbWEob3JkZXIgPSBjKDQsIDAsMCkpLT5hcjQNCmFyNCU+JSBzdW1tYXJ5DQp1bmVtcCAlPiUgQXJpbWEob3JkZXIgPSBjKDgsIDAsMCkpLT5hcjgNCmFyOCU+JSBzdW1tYXJ5DQpgYGANCg0KYGBge3J9DQpmb3JlY2FzdDo6Y2hlY2tyZXNpZHVhbHMoYXIyKQ0KZm9yZWNhc3Q6OmNoZWNrcmVzaWR1YWxzKGFyNCkNCmZvcmVjYXN0OjpjaGVja3Jlc2lkdWFscyhhcjgpDQpgYGANCg0KTyByZXPDrWR1b3MgZG9zIG1vZGVsb3MgJEFSKDIpJCBlICRBUig0KSQgYXByZXNlbnRhcmFtIGF1dG9jb3JyZWxhw6fDo28gc2lnbmlmaWNhdGl2YSBubyA4wrogbGFnLGp1c3RpZmljYW5kbyBhIGluY2x1c8OjbyBkbyB0ZXJtbyAkQVIoOCkkLCBwYXJhIHRlc3RhciBzdWEgcmVsZXbDom5jaWEuTyAkQVIoMikkIG7Do28gYXByZXNlbnRvdSBjb2VmaWNpZW50ZXMgQVIyIHNpZ25pZmljYXRpdm9zLCBqw6EgbyAkQVIoNCkkIG1vc3Ryb3UgQVI0IGxpZ2VpcmFtZW50ZSBzaWduaWZpY2F0aXZvLg0KTWFzLCBvIG1vZGVsbyAkQVIoOCkkIGFwcmVzZW50b3UgYWxndW5zIGNvZWZpY2llbnRlcyBzaWduaWZpY2F0aXZvcyAoQVIxLEFSNCxBUjgpLg0KDQpgYGB7cn0NCmRhdGEuZnJhbWUoDQogIE1vZGVsID0gYygiQVJNQSgxKSIsICJBUk1BKDIpIiwiQVJJTUEoNCkiLCAiQVJNQSg4KSIpLA0KICBBSUMgPSBjKEFJQyhhcjEpLCBBSUMoYXIyKSwgQUlDKGFyNCksQUlDKGFyOCkpLA0KICBCSUMgPSBjKEJJQyhhcjEpLCBCSUMoYXIyKSwgQklDKGFyNCksQklDKGFyOCkpLA0KICBSTVNFID0gYyhhY2N1cmFjeShhcjEpWzJdLCBhY2N1cmFjeShhcjIpWzJdLGFjY3VyYWN5KGFyNClbMl0sIGFjY3VyYWN5KGFyOClbMl0pLA0KICBNQUUgPSAgYyhhY2N1cmFjeShhcjEpWzNdLCBhY2N1cmFjeShhcjIpWzNdLGFjY3VyYWN5KGFyNClbM10sIGFjY3VyYWN5KGFyOClbM10pDQopDQoNCmBgYA0KDQpPYnNlcnZhbmRvIG9zIEluZGljYWRvcmVzIGRlIHF1YWxpZGFkZSBvIG1vZGVsbywgTyAkQVIoOCkkIHRlbSBvIG1lbm9yIENyaXTDqXJpbyBkZSBBa2Fpa2UgKEFJQykgKOKIkjc3MS44KSwgZSBlcnJvIHJlc2lkdWFsICgk8J2cjl4yPTAuMDAxNDI1JCksIGluZGljYW5kbyBvIG1lbGhvciBhanVzdGUgZW50cmUgb3MgbW9kZWxvcywgcG9yw6ltIG8gbW9kZWxvIHRlbSBvIG1haW9yIENyaXTDqXJpbyBCYXllc2lhbm8gKEJJQykgKC03MzguMjgyOSApLCBxdWUgcGVuYWxpemEgbWFpcyBhIGNvbXBsZXhpZGFkZSBkbyBtb2RlbG8uDQpFbWJvcmEgbyAkQVIoOCkkIHRlbmhhIGFwcmVzZW50YWRvIG8gbWVsaG9yIGFqdXN0ZSBlbSB0ZXJtb3MgZGUgQUlDIGUgJPCdnI5eMiQsIHN1YSBtYWlvciBjb21wbGV4aWRhZGUgZSBhIGJhaXhhIHNpZ25pZmljw6JuY2lhIGRlIHbDoXJpb3MgY29lZmljaWVudGVzIHBvZGVtIGxpbWl0YXIgc3VhIHV0aWxpZGFkZSBwcsOhdGljYS4NCkFzc2ltIGRlcGVuZGVuZG8gYSBmaW5hbGlkYWRlLCB1bSBtb2RlbG8gbWFpcyBzaW1wbGVzLCBjb21vIEFSKDEpLCBwb2RlIHNlciBwcmVmZXLDrXZlbCBkZXBlbmRlbmRvIGRvIG9iamV0aXZvIGRhIGFuw6FsaXNlLg0KDQojIyMjIDMpICgyLDAgcG9udG9zKS4gVXRpbGl6ZSBhIHPDqXJpZSBkbyBhcnF1aXZvIFlfYnJlYWsuIEEgc8OpcmllIGVtIHF1ZXN0w6NvIGZvaSBzaW11bGFkYSBkYSBzZWd1aW50ZSBmb3JtYTogQXTDqSBhIG9ic2VydmHDp8OjbyAxMDAsIHkodCk9IDErMC41eSh0LTEpK2UodCkuIEEgcGFydGlyIGRhIG9ic2VydmHDp8OjbyAxMDEsIHkodCk9MiswLjZ5KHQtMSkrZSh0KS4gRmHDp2EgbyBxdWUgc2UgcGVkZToNCg0KYSkgIFZlcmlmaXF1ZSBvIHJlc3VsdGFkbyBkb3MgdGVzdGVzIGRlIHJhaXogdW5pdMOhcmlhIEFERiBlIGNvbSBxdWVicmEgZXN0cnV0dXJhbCwgZGEgcmVzcGVjdGl2YSBzw6lyaWUgZGVzc2EgcXVlc3TDo28uIE8gcXVlIHZjIHBvZGUgY29uY2x1aXI/DQoNCiMgUmVzb2x1w6fDo28gUXVlc3TDo28gMylhKVZlcmlmaXF1ZSBvIHJlc3VsdGFkbyBkb3MgdGVzdGVzIGRlIHJhaXogdW5pdMOhcmlhIEFERiBlIGNvbSBxdWVicmEgZXN0cnV0dXJhbCwgZGEgcmVzcGVjdGl2YSBzw6lyaWUgZGVzc2EgcXVlc3TDo28uIE8gcXVlIHZjIHBvZGUgY29uY2x1aXI/DQoNCg0KMcK6IFBhc3NvOiBDb25zdHJ1aXIgU2VyaWU6DQoNCmBgYHtyfQ0KeV9icmVhayA8LSByZWFkX2V4Y2VsKCJ5X2JyZWFrLnhsc3giKQ0KeV9icmVhayRZX2JyZWFrICU+JSB0cyAlPiUgYXV0b3Bsb3QoKQ0KYGBgDQoNCjLCuiBQYXNzbzogUmVhbGl6YXIgVGVzdGUgZGUgUmFpeiBVbml0w6FyaWENCg0KYGBge3J9DQphZGZfdGVzdCA8LXlfYnJlYWskWV9icmVhayAlPiUgdHMgJT4lIGFkZi50ZXN0KGFsdGVybmF0aXZlID0gInN0YXRpb25hcnkiKQ0Ka3Bzc190ZXN0IDwtIGtwc3MudGVzdCh5X2JyZWFrX3RzLCBudWxsID0gIkxldmVsIiwgbHNob3J0ID0gVFJVRSkNCmFkZl90ZXN0DQprcHNzX3Rlc3QNCmBgYA0KDQpQYXJhIG8gVGVzdGUgS1BTUyB0ZW1vcyB1bSBwLXZhbG9yIGRlIDAuMDEsIGxvZ28gcmVqZWl0YW1vcyBhIGhpcMOzdGVzZSBkZSBlc3RhY2lvbsOhcmlhZGFkZS4NCk8gbWVzbW8gw6kgcmVmb3LDp2Fkbywgbm8gVGVzdGUgRGlja2V5LUZ1bGxlciBjb20gdW0gcC12YWxvciBkZSAwLjQyMDMsIG7Do28gcmVqZWl0YW1vcyBhIGhpcMOzdGVzZSBudWxhICgkSF8wJCkgZGUgcXVlIGEgc8OpcmllIHBvc3N1aSB1bWEgcmFpeiB1bml0w6FyaWEuDQpJc3NvIGltcGxpY2EgcXVlIGEgc8OpcmllIGNvbW8gZXN0YSBuw6NvIMOpIGVzdGFjaW9uw6FyaWEuDQoNCjPCuiBQYXNzbzogUmVhbGl6YXIgVGVzdGUgZGUgUXVlYnJhIEVzdHJ1dHVyYWwgZGUgQ2hvdyBlIFBlcnJvbiBwYXJhIGlkZW50aWZpY2FyIHBvbnRvIGRlIHF1ZWJyYQ0KDQpgYGB7cn0NCiMgVGVzdGUgc3VwRg0Kc2N0ZXN0KHlfYnJlYWtfdHMgfiAxLCB0eXBlID0gIkNob3ciKQ0KDQpgYGANCg0KTm8gdGVzdGUgZGUgQ2hvdyBvIHAtdmFsb3IgZW5jb250cmFkbyDDqSBtdWl0byBiYWl4bywgaW5kaWNhbmRvIHF1ZSBkZXZlbW9zIHJlamVpdGFtb3MgYSBoaXDDs3Rlc2UgbnVsYSBkZSBxdWUgbsOjbyBow6EgcXVlYnJhcyBlc3RydXR1cmFpcywgUG9ydGFudG8sIGjDoSBldmlkw6puY2lhIGRlIHVtYSBxdWVicmEgZXN0cnV0dXJhbCBzaWduaWZpY2F0aXZhIG5hIHPDqXJpZS4NCkFzc2ltLCBzZWd1aW1vcyBhbyB0ZXN0ZSBkZSBQZXJyb24gcGFyYSBpZGVudGlmaWNhciBvIG1lbGhvciBjYW5kaWRhdG8gYW8gcG9udG8gZGUgcXVlYnJhLg0KDQpgYGB7cn0NCnlfYnJlYWtfdHMgPC15X2JyZWFrJFlfYnJlYWsgJT4lIHRzIA0KYnJlYWtzIDwtIGJyZWFrcG9pbnRzKHlfYnJlYWtfdHMgfiAxKQ0KDQpzdW1tYXJ5KGJyZWFrcykNCmBgYA0KDQpwZWxvIHJlc3VsdGFkbyBkbyB0ZXN0ZSwgZm9pIGlkZW50aWZpY2FkYSBvIHBvbnRvIGRlIHF1ZWJyYSBuYSBvYnNlcnZhw6fDo28gMTAwLg0KDQpgYGB7cn0NCnlfYnJlYWtfdHMgPC0gdHMoeV9icmVhayRZX2JyZWFrKQ0KDQphdXRvcGxvdCh5X2JyZWFrX3RzKSArIA0KICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAxMDAsIGxpbmV0eXBlID0gImRhc2hlZCIsIGNvbG9yID0gInJlZCIpICsNCiAgZ2d0aXRsZSgiU8OpcmllIFlfYnJlYWsgY29tIFBvbnRvIGRlIFF1ZWJyYSIpDQoNCmBgYA0KDQpEZXNzYSBmb3JtYSwgcG9kZW1vcyBmYXplciB1bSB0ZXN0ZSBkZSBlc3RhY2lvbsOhcmlkYWRlIGEgcGFydGlyIHBvbnRvIGRlIHF1ZWJyYSBwYXJhIGNvcnJvYm9yYXIgYSBoaXBvdGVzZS4NCkFzc2ltLGEgc8OpcmllIGZvaSBkaXZpZGlkYSBlbSBkb2lzIHNlZ21lbnRvcw0KDQpgYGB7cn0NCg0Kc2VnbWVudDEgPC0gd2luZG93KHlfYnJlYWtfdHMsIGVuZCA9IDEwMCkNCnNlZ21lbnQyIDwtIHdpbmRvdyh5X2JyZWFrX3RzLCBzdGFydCA9IDEwMSkNCg0KYWRmX3Rlc3Rfc2VnMSA8LSBhZGYudGVzdChzZWdtZW50MSxhbHRlcm5hdGl2ZSA9ICJzdGF0aW9uYXJ5IikNCmFkZl90ZXN0X3NlZzIgPC0gYWRmLnRlc3Qoc2VnbWVudDIsYWx0ZXJuYXRpdmUgPSAic3RhdGlvbmFyeSIpDQprcHNzX3Rlc3Rfc2VnMSA8LSBrcHNzLnRlc3Qoc2VnbWVudDEsIG51bGwgPSAiTGV2ZWwiLCBsc2hvcnQgPSBUUlVFKQ0Ka3Bzc190ZXN0X3NlZzIgPC0ga3Bzcy50ZXN0KHNlZ21lbnQyLCBudWxsID0gIkxldmVsIiwgbHNob3J0ID0gVFJVRSkNCg0KDQoNCmFkZl90ZXN0X3NlZzENCmFkZl90ZXN0X3NlZzINCg0Ka3Bzc190ZXN0X3NlZzENCmtwc3NfdGVzdF9zZWcyDQpgYGANCg0KYSBwYXJ0aXIgZG9zIHJlc3VsdGFkb3MgcG9kZW1vcyB2ZXIgcXVlIHNlcGFyYWRhbWVudGUsIHBvZGVtb3MgY29uZmlybWFyIGEgZXN0YWNpb27DoXJpYWRhZGUgcGFyYSBjYWRhIHNlZ21lbnRvIGRhZGkgcXVlIG8gdGVzdGUgRGlja2V5LUZ1bGxlciB0ZXZlIHVtIHAtdmFsb3JcPDAuMDUgLCBlLCBpbnZlcnNhbWVudGUsIG8gS1BTUyB0ZXZlIHVtIHAtdmFsb3IgYWx0by4NCg0KNMK6IFBhc3NvOiBJbnRlcnByZXRhciBvcyBSZXN1bHRhZG9zDQoNCk9zIHJlc3VsdGFkb3MgaW5kaWNhbSBxdWUgYSBzw6lyaWUsIGNvbW8gdW0gdG9kbywgbsOjbyDDqSBlc3RhY2lvbsOhcmlhLCBjb21vIGFwb250YWRvIHBlbG8gdGVzdGUgQURGLCBzdWdlcmluZG8gZGluw6JtaWNhcyBuw6NvIGVzdGFjaW9uw6FyaWFzIHJlbGFjaW9uYWRhcyDDoCBwcmVzZW7Dp2EgZGUgdW1hIHF1ZWJyYSBlc3RydXR1cmFsLg0KTyB0ZXN0ZSBkZSBDaG93IGNvbmZpcm1hIGVzc2EgcXVlYnJhIG5vIHBvbnRvIDEwMCwgZXZpZGVuY2lhbmRvIHVtYSBtdWRhbsOnYSBzaWduaWZpY2F0aXZhIG5vIGNvbXBvcnRhbWVudG8gZGEgc8OpcmllLCBlbSBsaW5oYSBjb20gYSBzaW11bGHDp8OjbyBwcm9wb3N0YS4NCkEgYW7DoWxpc2Ugc2VnbWVudGFkYSByZXZlbGEgcXVlIG9zIGNvZWZpY2llbnRlcyBkbyBtb2RlbG8gbXVkYW0gZW50cmUgb3MgcmVnaW1lcywgcmVmbGV0aW5kbyBkaW7Dom1pY2FzIGRpc3RpbnRhcyBub3MgZG9pcyBzZWdtZW50b3MgZGEgc8OpcmllLg0KQW1ib3Mgb3Mgc2VnbWVudG9zLCBubyBlbnRhbnRvLCBhcHJlc2VudGFtIGVzdGFjaW9uYXJpZWRhZGUgaW5kaXZpZHVhbCwgcGVybWl0aW5kbyBxdWUgc2VqYW0gbW9kZWxhZG9zIHNlcGFyYWRhbWVudGUgY29tbyBwcm9jZXNzb3MgZXN0YWNpb27DoXJpb3MgZGlzdGludG9zLCBjYWRhIHVtIGNvbSBzdWEgcHLDs3ByaWEgZXN0cnV0dXJhLg0KDQojIyMjIDQpICgyLDUgcG9udG9zKSBFZmVpdG9zIGRhIGRlZHXDp8OjbyBkZSBpbXBvc3RvcyBuYXMgdGF4YXMgZGUgZmVydGlsaWRhZGUuIE8gYXJxdWl2byBmw6lydGlsMyBwb3NzdWkgaW5mb3JtYcOnw7VlcyBzb2JyZSBvIG7Dum1lcm8gZGUgY3JpYW7Dp2FzIG5hc2NpZGFzIHBhcmEgY2FkYSAxLjAwMCBtdWxoZXJlcyBlbSBpZGFkZSBmw6lydGlsIChnZnIpLiBQYXJhIG9zIGFub3MgZGUgMTkxMyBhIDE5ODQsIGEgZXF1YcOnw6NvDQoNCiRnZnI9zrJfMCsgzrJfMSBwZV90ICsgzrIyIHd3Ml90ICsgzrIzIHBpbGxfdCQNCg0KIyMjIyBwZXQgw6kgYSBkZWR1w6fDo28gZGUgaW1wb3N0b3MgZGUgcmVuZGEgcG9yIGZpbGhvcywgd3cgMnQgcmVjZWJlIG8gdmFsb3IgMSBwYXJhIG9zIGFub3MgZGEgMsKqIEd1ZXJyYSBNdW5kaWFsIGUgcGlsbHQgdGVtIHZhbG9yIDEgYSBwYXJ0aXIgZGUgMTk2MyBxdWFuZG8gbyBhbnRpY29uY2VwY2lvbmFsIGZvaSBkaXNwb25pYmlsaXphZG8uDQoNCiMgUmVzb2x1w6fDo28gUXVlc3TDo28gNCkNCg0KIyMgaSkgRXN0aW1lIGVzc2EgZXF1YcOnw6NvLg0KDQpgYGB7cn0NCkZlcnRpbDMgPC0gcmVhZF9leGNlbCgiRmVydGlsMy54bHN4IikNCmR5bmxtKEdGUiB+UEUrd3cyK3BpbGwsRmVydGlsMykgIC0+bW9kDQpzdGFyZ2F6ZXIobW9kLHR5cGUgPSAidGV4dCIpDQpgYGANCm9ic2VydmFuZG8gbyBjb2VmaWNpZW50ZSBQRSBkZXNzZSBtb2RlbG8sIGltcGxpY2FyaWEgcXVlIGEgRGVkdcOnw6NvIGRlIEltcG9zdG9zIHRlbSB1bSBlZmVpdG8gcG9zaXRpdm8gZSBzaWduaWZpY2F0aXZvIHNvYnJlIGEgdGF4YSBkZSBmZXJ0aWxpZGFkZS4NCg0KIyMgaWkpIEEgdGF4YSBkZSBmZXJ0aWxpZGFkZSBkZXZlcmlhIHJlYWdpciDDoHMgcmVuw7puY2lhcyBkbyBpbXBvc3RvIGRlIHJlbmRhLCBtYXMgY29tIGxhZ3MuIEluY2x1YSB1bSBlIGRvaXMgbGFncyBkZSBwZXQgZSBhdmFsaWUgb3MgcmVzdWx0YWRvcy4NCg0KYGBge3J9DQoNCm1vZF9sMTwtZHlubG0oR0ZSIH5MKFBFLDEpK3d3MitwaWxsLEZlcnRpbDMgJT4lIHpvbygpKQ0KbW9kX2wyPC1keW5sbShHRlIgfkwoUEUsMikrd3cyK3BpbGwsRmVydGlsMyAlPiUgem9vKCkpDQptb2RfbDEyPC1keW5sbShHRlIgfkwoUEUsMSkrTChQRSwyKSt3dzIrcGlsbCxGZXJ0aWwzJT4lIHpvbygpKSANCm1vZF9sMDEyPC1keW5sbShHRlIgflBFK0woUEUsMSkrTChQRSwyKSt3dzIrcGlsbCxGZXJ0aWwzJT4lIHpvbygpKQ0KICAgICAgICAgICAgICAgIA0Kc3RhcmdhemVyOjpzdGFyZ2F6ZXIobW9kX2wxLG1vZF9sMixtb2RfbDEyLG1vZF9sMDEyLHR5cGUgPSAidGV4dCIpDQpgYGANCkFtYm9zIG9zIGxhZ3MgJEwoUEUsMSksIEwoUEUsMikpJCBzw6NvIHNpZ25pZmljYXRpdm9zIG5vcyBtb2RlbG9zIGNvbSB1bSBvdSBkb2lzIGxhZ3MuIFBvcsOpbSwgbm9zIG1vZGVsb3MgY29uanVudG9zIG8gUEUgY29tIGxhZyBuw6NvIHByZXNlbnRhIHVtIGNvZWZpY2llbnRlIHNpZ25pZmljYXRpdm8sIGluZGljYW5kbyBxdWUgcG9kZSBoYXZlciB1bWEgYXV0b2NvcnJlw6fDo28gZW50cmUgb3MgbGFncy4NCg0KIyMgaWlpKSBUZXN0ZSBvIG1vZGVsbyBpbmNsdWluZG8gdW1hIHRlbmTDqm5jaWEgZGV0ZXJtaW7DrXN0aWNhLg0KDQpgYGB7cn0NCiMgQWRpY2lvbmFyIHVtYSB2YXJpw6F2ZWwgZGUgdGVuZMOqbmNpYSBhbyBtb2RlbG8NCm1vZF9sMHQ8LWR5bmxtKEdGUn4gdHJlbmQoR0ZSKStQRSt3dzIrcGlsbCxGZXJ0aWwzICU+JSB6b28oKSkNCm1vZF9sMXQ8LWR5bmxtKEdGUn4gdHJlbmQoR0ZSKStMKFBFLDEpK3d3MitwaWxsLEZlcnRpbDMgJT4lIHpvbygpKQ0KbW9kX2wydDwtZHlubG0oR0ZSIH50cmVuZChHRlIpK0woUEUsMikrd3cyK3BpbGwsRmVydGlsMyAlPiUgem9vKCkpDQptb2RfbDEydDwtZHlubG0oR0ZSIH50cmVuZChHRlIpK0woUEUsMSkrTChQRSwyKSt3dzIrcGlsbCxGZXJ0aWwzJT4lIHpvbygpKSANCm1vZF9sMDEydDwtZHlubG0oR0ZSIH50cmVuZChHRlIpK1BFK0woUEUsMSkrTChQRSwyKSt3dzIrcGlsbCxGZXJ0aWwzJT4lIHpvbygpKQ0KICAgICAgICAgICAgICAgIA0Kc3RhcmdhemVyOjpzdGFyZ2F6ZXIobW9kX2wwdCxtb2RfbDF0LG1vZF9sMnQsbW9kX2wxMnQsbW9kX2wwMTJ0LHR5cGUgPSAidGV4dCIpDQoNCmBgYA0KQW8gYWRpY2lvbmFyIHVtYSB0ZW5kZW5jaWEgbGluZWFyIG5vIG1vZGVsbywgb2JzZXJ2YS1zZSBxdWUgZWxhIMOpIHNpZ25pZmljYXRpdmEgcGFyYSB0b2RvcyBvcyBtb2RlbG9zLg0KDQojIyBpdikgQW5hbGlzZSBhcyBhdXRvY29ycmVsYcOnw7VlcyBkZSBnZnIgZSBwZXQgLiBDb20gYmFzZSBuZXNzYXMgYXV0b2NvcnJlbGHDp8O1ZXMgbyBxdWUgw6kgcG9zc8OtdmVsIGNvbmNsdWlyPw0KDQpgYGB7cn0NCg0KIyBBbsOhbGlzZSBkZSBhdXRvY29ycmVsYcOnw6NvIGRlIGdmcg0KYWNmKEZlcnRpbDMkR0ZSLCBtYWluID0gIkF1dG9jb3JyZWxhw6fDo28gZGUgZ2ZyIixwbG90ID0gVCkNCnBhY2YoRmVydGlsMyRHRlIsIG1haW4gPSAiQXV0b2NvcnJlbGHDp8OjbyBkZSBnZnIiLHBsb3QgPSBUKQ0KDQojIEFuw6FsaXNlIGRlIGF1dG9jb3JyZWxhw6fDo28gZGUgcGV0DQphY2YoRmVydGlsMyRQRSwgbWFpbiA9ICJBdXRvY29ycmVsYcOnw6NvIGRlIHBlIixwbG90ID0gVCkNCnBhY2YoRmVydGlsMyRQRSwgbWFpbiA9ICJBdXRvY29ycmVsYcOnw6NvIGRlIHBlIixwbG90ID0gVCkNCg0KDQpDY2YoRmVydGlsMyRQRSxGZXJ0aWwzJEdGUiwgbWFpbiA9ICJBdXRvY29ycmVsYcOnw6NvIENydXphZGEgZGUgcGV0IGUgZ2ZyIixwbG90ID0gVCkNCg0KYGBgDQpBbyBmYXplciB1bWEgYW5hbGlzZSBncmFmaWNhIHBhcmEgYXMgYXV0b2NvcnJlbGHDp8O1ZXMsIG9ic2VydmFtb3MgcXVlIHF1ZSBow6EgdW1hIGFsdGEgYXV0b2NvcnJlbGHDp8OjbyBwZXJzaXN0ZW50ZSBuYXMgdmFyaWF2ZWlzLCBjb20gbWFpcyBsYWdzIFBFIHF1ZSBuYSBmZXJ0aWxpZGFkZSwgbyBxdWUgc3VnZXJlbSB1bSBwYWRyw6NvIGF1dG9yZWdyZXNzaXZvIHF1ZSBwb2RlIHNlciBjYXB0dXJhZG8gY29tIHRlcm1vcyBBUi4gcG9yw6ltLCB1bWEgYXV0b2NvcnJlbGHDp8OjbyBiYWl4YSBuYXMgZnVuw6fDo28gZGUgYXV0b2NvcnJlbGHDp8OjbyBwYXJjaWFsLCBpbmRpY2FuZG8gcXVlIGVsYXMgdGVtIHVtIGVmZWl0byB0ZW1wb3JhbCBsb25nby4NCkFvIG9ic2VydmFyIGEgYXV0b2NvcnJlbGHDp8OjbyBjcnV6YWRhIHZlLXNlIHF1ZSBtdWRhbsOnYXMgcGFzc2FkYXMgZW0gUEUgICB0w6ptIGltcGFjdG8gbmEgZmVydGlsaWRhZGUsIG1vc3RyYW5kbyBxdWUgZGVjaXPDtWVzIGRlIHBvbMOtdGljYSBmaXNjYWwgbGV2YW0gYWxndW0gdGVtcG8gcGFyYSBzZSB0cmFkdXppcmVtIGVtIG11ZGFuw6dhcyBubyBjb21wb3J0YW1lbnRvIHJlcHJvZHV0aXZvLkEgYXVzw6puY2lhIGRlIHVtIHBpY28gc2lnbmlmaWNhdGl2byBubyBsYWcgemVybyBlIG5lZ2F0aXZvcyBzdWdlcmUgcXVlIFBFIG7Do28gdGVtIHVtIGltcGFjdG8gaW1lZGlhdG8gZW0gR0ZSIG5lbSB1bWEgcmVsYcOnw6NvIGRlIGluZmx1ZW5jaWEgaW52ZXJzYS4NCg0KIyMgdikgRXN0aW1lIG8gbW9kZWxvIGNvbSBhcyBkdWFzIHZhcmnDoXZlaXMgZW0gcHJpbWVpcmFzIGRpZmVyZW7Dp2FzLiBUZXN0ZSBhIGluY2x1c8OjbyBkZSBwZXQgZGUgZm9ybWEgY29udGVtcG9yw6JuZWEgZSB1bWEgZSBkdWFzIGRlZmFzYWdlbnMgY29uanVudGFtZW50ZS4gUXVhbCBhIGNvbmNsdXPDo28gZGVzc2UgZXhlcmPDrWNpbz8NCg0KYGBge3J9DQojIEFkaWNpb25hciB1bWEgdmFyacOhdmVsIGRlIHRlbmTDqm5jaWEgYW8gbW9kZWxvDQptb2RfbDAxMnRkPC1keW5sbShkKEdGUikgfnRyZW5kKEdGUikrZChQRSkrZChQRSwyKStkKFBFLDMpK3d3MitwaWxsLEZlcnRpbDMlPiUgem9vKCkpDQptb2RfbDAxdGQ8LWR5bmxtKGQoR0ZSKSB+dHJlbmQoR0ZSKStkKFBFKStkKFBFLDIpK3d3MitwaWxsLEZlcnRpbDMlPiUgem9vKCkpDQptb2RfbDB0ZDwtZHlubG0oZChHRlIpIH50cmVuZChHRlIpK2QoUEUpK3d3MitwaWxsLEZlcnRpbDMlPiUgem9vKCkpDQoNCm1vZF9sMDEyZDwtZHlubG0oZChHRlIpIH5kKFBFKStkKFBFLDIpK2QoUEUsMykrd3cyK3BpbGwsRmVydGlsMyU+JSB6b28oKSkNCm1vZF9sMDFkPC1keW5sbShkKEdGUikgfmQoUEUpK2QoUEUsMikrd3cyK3BpbGwsRmVydGlsMyU+JSB6b28oKSkNCm1vZF9sMGQ8LWR5bmxtKGQoR0ZSKSB+ZChQRSkrd3cyK3BpbGwsRmVydGlsMyU+JSB6b28oKSkNCiAgICAgICAgICAgICAgICANCnN0YXJnYXplcjo6c3RhcmdhemVyKA0KICBtb2RfbDAxMnRkLG1vZF9sMDEyZCwNCm1vZF9sMDF0ZCxtb2RfbDAxZCwNCm1vZF9sMHRkLG1vZF9sMGQsDQogIHR5cGUgPSAidGV4dCIpDQoNCmBgYA0KIE8gaW1wYWN0byBjb250ZW1wb3LDom5lb27Do28gw6kgc2lnbmlmaWNhdGl2byBxdWFuZG8ganVudG8gYXMgZGVmYXNhZ2VucywgbWFzIGFzIGRlZmFzYWdlbnMgYXByZXNlbnRhbSBlZmVpdG9zIHNpZ25pZmljYXRpdm9zLiBPcyBlZmVpdG9zIGRlIGRlZHXDp8O1ZXMgZmlzY2FpcyBzw6NvIG1haXMgZXZpZGVudGVzIGNvbSBkZWZhc2FnZW5zLCByZWZvcsOnYW5kbyBxdWUgbXVkYW7Dp2FzIGVtIHBvbMOtdGljYXMgZmlzY2FpcyBpbmZsdWVuY2lhbSBhIGZlcnRpbGlkYWRlIGFvIGxvbmdvIGRlIHbDoXJpb3MgcGVyw61vZG9zLg0KDQojIyB2aSkgUXVhbCBhIGNvbmNsdXPDo28gcXVlIMOpIHBvc3PDrXZlbCBvYnRlciBzb2JyZSBhIHJlbGHDp8OjbyBlbnRyZSBkZWR1w6fDo28gZGUgaW1wb3N0b3MgZSBmZXJ0aWxpZGFkZT8NCg0KQSBkZWR1w6fDo28gZGUgaW1wb3N0b3MgdGVtIHVtIGltcGFjdG8gcG9zaXRpdm8gbmEgdGF4YSBkZSBmZXJ0aWxpZGFkZSwgbWFzIGVzc2UgZWZlaXRvIG9jb3JyZSBwcmluY2lwYWxtZW50ZSBjb20gYXRyYXNvIChkZWZhc2FnZW5zIGRlIDEgYSAyIHBlcsOtb2RvcykuDQpPIGVmZWl0byBpbWVkaWF0byAoY29udGVtcG9yw6JuZW8pIMOpIG1lbm9zIGV2aWRlbnRlLg0KV1cyIGUgUGlsbCB0w6ptIGVmZWl0b3Mgc2lnbmlmaWNhdGl2b3MgZSBuZWdhdGl2b3MsIGNhcHR1cmFuZG8gY2hvcXVlcyBlc3RydXR1cmFpcyByZWxhY2lvbmFkb3Mgw6AgZmVydGlsaWRhZGUuDQpBIGluY2x1c8OjbyBkZSB1bWEgdGVuZMOqbmNpYSBtb3N0cmEgdW1hIHF1ZWRhIGVzdHJ1dHVyYWwgbmEgZmVydGlsaWRhZGUgYW8gbG9uZ28gZG8gdGVtcG8sIHN1Z2VyaW5kbyBxdWUgZmF0b3JlcyBjdWx0dXJhaXMgZSBzb2Npb2Vjb27DtG1pY29zIGRlIGxvbmdvIHByYXpvIHRhbWLDqW0gZGVzZW1wZW5oYW0gdW0gcGFwZWwgaW1wb3J0YW50ZS4NCkEgZGVwZW5kw6puY2lhIHRlbXBvcmFsIGRhcyB2YXJpw6F2ZWlzIHJlZm9yw6dhIGEgbmVjZXNzaWRhZGUgZGUgY29uc2lkZXJhciBtb2RlbG9zIGNvbSBkZWZhc2FnZW5zIHBhcmEgY2FwdHVyYXIgYWRlcXVhZGFtZW50ZSBvIGltcGFjdG8gZGFzIGRlZHXDp8O1ZXMgZmlzY2Fpcy4NCg0KIyMjIyA1KSAoMiw1IHBvbnRvcykgTyBhcnF1aXZvIElQQ0EgcG9zc3VpIHVtYSBzw6lyaWUgZGEgdGF4YSBkZSBpbmZsYcOnw6NvIGFvIGNvbnN1bWlkb3IgZG8gQnJhc2lsIG5vIHBlcsOtb2RvIGVudHJlIGphbmVpcm8gZGUgMTk5NSBlIG91dHVicm8gZGUgMjAxNy4NCiMgUmVzb2x1w6fDo28gUXVlc3TDo28gNSkNCiMjIGkpIEFwbGlxdWUgYSBtZXRvZG9sb2dpYSBCb3ggSmVua2lucyBwYXJhIGVuY29udHJhciBvIG1lbGhvciBtb2RlbG8gcGFyYSBlc3RhIHPDqXJpZS4NCkEgbWV0b2RvbG9naWEgQm94IEplbmtpbnMgY29uc2lzdGVtIGVtIGlkZW50aWZpdGljYSBhIG9yZGVtIGRlIGRpZmVyZW5jaWHDp8OjbyBwYXJhIGEgZXN0YXRhY2lvbmFsaWRhZGUgZGEgc2VyaWUsIGVzdGltYXIgb3MgZGlmZXJlbnRlcyBtb2RlbG9zIGRlIEFSTUEgZSBlc2NvbGhlciBvcyBtZWxob3JlcyBtb2RlbG9zIHBlbG8gYm9tIGNvbXBvcnRhbWVudG8gZG9zIHJlc8OtZHVvcyBlIHBlbG9zIGNyaXTDqXJpb3MgZGUgQUlDIGUgQklDLg0KdmVqYW1vcyBhIHNlcmllOg0KYGBge3J9DQppcGNhX2RhdGEgPC0gcmVhZF9leGNlbCgiSVBDQS54bHN4IikNCg0KaXBjYV90czwtdHMoaXBjYV9kYXRhJElQQ0EsIHN0YXJ0ID0gYygxOTk1LCAxKSwgZnJlcXVlbmN5ID0gMTIpIA0KaXBjYV90cyAlPiUgYXV0b3Bsb3QoKQ0KYGBgDQpQYXJhIGVzdGltYXIgYSBlc3RhY2lvbmFyaWFkYWRlIHByaW1laXJvIHZhbW9zIGF2YWxpYXIgc2UgYSBzZXJpZSBhcHJlc2VudGEgYXV0b2NvcnJlw6fDo28gc2lnbmlmaWNhdGl2YSBlIHNlIMOpIGVzdGFjaW9uw6FyaWE6DQpgYGB7cn0NCkFjZihpcGNhX3RzLCBtYWluID0gIkFDRiBkYSBTw6lyaWUgIikNCmFkZi50ZXN0KGlwY2FfdHMsIGFsdGVybmF0aXZlID0gInN0YXRpb25hcnkiKQ0KYGBgDQpQZWxhIGZ1bsOnw6NvIGRlIGF1dG9jb3JyZcOnw6NvLCBxdWUgZWxhIGFwcmVzZW50YSBhdXRvY29ycmXDp8OjbyBlbSB2YXJpYXMgZGUgc3VhcyBkZWZhc2FnZW5zLiBWZW1vcyB0YW1iw6ltIHF1ZSBhIHNlcmllIG7Do28gw6kgZXN0YWNpb27DoXJpYS4NCnZhbW9zIHJlYWxpemFyIGFnb3JhIG9zIG1lc21vcyB0ZXN0ZXMgcGFyYSBzdWEgdmVyc8OjbyBjb20gMcK6IGRpZmVyZW7Dp2ENCmBgYHtyfQ0KaXBjYV9kaWZmIDwtIGRpZmYoaXBjYV90cykNCmlwY2FfZGlmZiAlPiUgYXV0b3Bsb3QoKQ0KQWNmKGlwY2FfZGlmZiwgbWFpbiA9ICJBQ0YgZGEgU8OpcmllIERpZmVyZW5jaWFkYSIpDQpQYWNmKGlwY2FfZGlmZiwgbWFpbiA9ICJQQUNGIGRhIFPDqXJpZSBEaWZlcmVuY2lhZGEiKQ0KDQphZGYudGVzdChpcGNhX2RpZmYsIGFsdGVybmF0aXZlID0gInN0YXRpb25hcnkiKQ0KYGBgDQpQb2RlbW9zIHZlciBxdWUgZWxhIMOpIHVtYSBzZXJpZSBlc3RhY2lvbsOhcmlhIGNvbSBhdXRvY29ycmXDp8OjbyBwYXJhIGFsZ3VtYXMgZGUgc3VhcyBkZWZhc2FnZW5zICgywrosOcK6IGUgMTLCuiksIHN1Z2VyaW5kbyB1bSBNQSwgZSBhdXRvY29ycmVsYcOnw6NvIHBhcmNpYWwocGFyYSBhcyBkZWZhc2FnZW5zIDLCuiw1wrosIDfCuiwgOMK6LCAgZSAgZGEgMTDCuiDDoCAxMsK6KSwgc3VnZXJpbmRvIHVtIEFSLg0KDQpgYGB7ciBmaWcuaGVpZ2h0PTMsIGZpZy53aWR0aD00fQ0KDQojIFRlc3RhciBlc3RhY2kjIFRlc3RhciBkaWZlcmVudGVzIG1vZGVsb3MgQVJJTUENCm1vZGVsb3M8LWxpc3QoKQ0KQXJpbWEoaXBjYV90cywgb3JkZXIgPSBjKDEsIDEsIDEpKSAgJT4lIGNoZWNrcmVzaWR1YWxzICNSZXNpZHVvIE1hdSBjb21wb3J0YWRvIA0KQXJpbWEoaXBjYV90cywgb3JkZXIgPSBjKDIsMSwzKSkgICU+JSBjaGVja3Jlc2lkdWFscyAjUmVzaWR1byBNYXUgY29tcG9ydGFkbyANCkFyaW1hKGlwY2FfdHMsIG9yZGVyID0gYygxLCAxLCAzKSkgICU+JSBjaGVja3Jlc2lkdWFscyAjUmVzaWR1byBNYXUgY29tcG9ydGFkbyANCkFyaW1hKGlwY2FfdHMsIG9yZGVyID0gYygzLCAxLCAzKSkgICU+JSBjaGVja3Jlc2lkdWFscyAjUmVzaWR1byBNYXUgY29tcG9ydGFkbyBuYSBkZWZhc2FnZW0gMTINCkFyaW1hKGlwY2FfdHMsIG9yZGVyID0gYyg2LCAxLCAzKSkgICU+JSBjaGVja3Jlc2lkdWFscyNSZXNpZHVvIE1hdSBjb21wb3J0YWRvIG5hIGRlZmFzYWdlbSAxMg0KQXJpbWEoaXBjYV90cywgb3JkZXIgPSBjKDMsIDEsIDYpKSAgJT4lIGNoZWNrcmVzaWR1YWxzI1Jlc2lkdW8gTWF1IGNvbXBvcnRhZG8gbmEgZGVmYXNhZ2VtIDEyDQpBcmltYShpcGNhX3RzLCBvcmRlciA9IGMoMywgMiwgMykpICAlPiUgY2hlY2tyZXNpZHVhbHMjUmVzaWR1byBNYXUgY29tcG9ydGFkbyBuYSBkZWZhc2FnZW0gMTIgZSA3DQpBcmltYShpcGNhX3RzLCBvcmRlciA9IGMoNiwgMywgMykpICAlPiUgY2hlY2tyZXNpZHVhbHMjUmVzaWR1byBNYXUgY29tcG9ydGFkbyBuYSBkZWZhc2FnZW0gMTINCkFyaW1hKGlwY2FfdHMsIG9yZGVyID0gYygzLCA0LCA2KSkgICU+JSBjaGVja3Jlc2lkdWFscyNSZXNpZHVvIE1hdSBjb21wb3J0YWRvIG5hIGRlZmFzYWdlbSAxMg0KQXJpbWEoaXBjYV90cywgb3JkZXIgPSBjKDYsIDEsIDYpKSAgJT4lIGNoZWNrcmVzaWR1YWxzICNSZXNpZHVvIE1hdSBjb21wb3J0YWRvIG5hIGRlZmFzYWdlbSAxMg0KQXJpbWEoaXBjYV90cywgb3JkZXIgPSBjKDksIDEsIDYpKSAgJT4lIGNoZWNrcmVzaWR1YWxzI1Jlc2lkdW8gQmVtIGNvbXBvcnRhZG8NCkFyaW1hKGlwY2FfdHMsIG9yZGVyID0gYyg5LCAxLCAzKSkgICU+JSBjaGVja3Jlc2lkdWFscyAjUmVzaWR1byB2b2x0YXJhbSBhIHNlciBtYXUgY29tcG9ydGFkb3MNCkFyaW1hKGlwY2FfdHMsIG9yZGVyID0gYyg5LCAxLCA1KSkgICU+JSBjaGVja3Jlc2lkdWFscyAjUmVzaWR1byBCZW0gY29tcG9ydGFkbw0KQXJpbWEoaXBjYV90cywgb3JkZXIgPSBjKDcsIDEsIDUpKSAgJT4lIGNoZWNrcmVzaWR1YWxzICNSZXNpZHVvIEJlbSBjb21wb3J0YWRvDQpBcmltYShpcGNhX3RzLCBvcmRlciA9IGMoNiwgMSwgNSkpICAlPiUgY2hlY2tyZXNpZHVhbHMgIyByZXNpZHVvcyB2b2x0YXJhbSBhIHNlciBtYXUgY29tcG9ydGFkb3MNCg0KDQpgYGANClRlbnRhbmRvIGVzc2VzIG1vZGVsb3MgdmVtb3MgcXVlIG8gJEFSTUEoKSQsICRBUk1BKCkkIGUgbyAkQVJNQSgpJCwgZm9yYW0gb3MgbWVsaG9yZXMgY2FuZGlkYWRvcyBwb3IgZWxpbWluYXJlbSBhIGF1dG9jb3JyZcOnw6NvIHNpZ25pZmljYXRpdmEgZG9zIHJlc8OtZHVvcy4gdmFtb3MgYWdvcmEgY29tcGFyYWxvcyBwZWxvIGNyaXTDqXJpbyBkZSBBSUMgZSBCSUM6DQoNCmBgYHtyfQ0KYXJtYTkxNjwtQXJpbWEoaXBjYV90cywgb3JkZXIgPSBjKDksIDEsIDYpKSANCmFybWE5MTU8LUFyaW1hKGlwY2FfdHMsIG9yZGVyID0gYyg5LCAxLCA1KSkgDQphcm1hNzE1PC1BcmltYShpcGNhX3RzLCBvcmRlciA9IGMoNywgMSwgNSkpIA0KDQptQklDPC1CSUMoYXJtYTcxNSxhcm1hOTE1LGFybWE5MTYpDQptYWljPC1BSUMoYXJtYTcxNSxhcm1hOTE1LGFybWE5MTYpDQpkYXRhLmZyYW1lKG1vZGVsPXJvd25hbWVzKG1CSUMpLA0KICAgICAgICAgICBCSUM9bUJJQyRCSUMsDQogICAgICAgICAgIEFJQz1tYWljJEFJQykNCmBgYA0KDQpPYnNlcnZhbW9zIHF1ZSBvIG1lbGhvciBtb2RlbG8gc2VyaWEgbyBBcm1hKDcsMSw1KSBjb20gbyBtZW5vIEJJQyAgTWVub3IgQUlDLg0KDQojIyBpaSkgQXZhbGllIGEgZXhpc3TDqm5jaWEgZGUgcXVlYnJhcyBlc3RydXR1cmFpcyBub3MgbW9kZWxvcyBlc2NvbGhpZG9zLiBIw6EgZXZpZMOqbmNpYSBkZSBxdWVicmEgZXN0cnV0dXJhbD8NCg0KYGBge3J9DQojIFRlc3RlIGRlIHF1ZWJyYSBlc3RydXR1cmFsIGNvbSBzdHJ1Y2NoYW5nZQ0KYnJlYWtzIDwtIGJyZWFrcG9pbnRzKGlwY2FfdHMgfiAxKSAjIE1vZGVsbyBjb20gaW50ZXJjZXB0bw0Kc3VtbWFyeShicmVha3MpDQojIEF2YWxpYXIgZXN0YWJpbGlkYWRlIGRvIG1vZGVsbyAoVGVzdGUgRikNCnNjdGVzdChpcGNhX3RzIH4gMSwgdHlwZSA9ICJDaG93IikNCg0KYGBgDQpQZWxvIFRlc3RlIGRlIENob3cgdGVtb3MgZXZpZGVuaWEgcGFyYSB1bWEgcXVlYnJhIGVzdHJ1dHVyYWwsIHF1ZSBwZWxvIG1ldG9kbyBkZSBQZXJyb24sIGVzdGFyaWEgZW0gMjAwMy4oNCkgDQoNCiMjIGlpaSkgRmHDp2EgdW0gbW9kZWxvIGFsdGVybmF0aXZvIHVzYW5kbyBhcGVuYXMgYSBhbW9zdHJhIGRvIHBlcsOtb2RvIGEgcGFydGlyIGRlIDIwMDMuIEVzc2Ugbm92byBtb2RlbG8gYXByZXNlbnRhIGRlc2VtcGVuaG8gbWVsaG9yPyBRdWUgYXZhbGlhw6fDo28gw6kgcG9zc8OtdmVsIGZhemVyPw0KDQpgYGB7cn0NCiMgRmlsdHJhciBhIHPDqXJpZSBhIHBhcnRpciBkZSAyMDAzDQppcGNhXzIwMDMgPC0gd2luZG93KGlwY2FfdHMsIHN0YXJ0ID0gYygyMDAzLCA0KSkNCg0KIyBWaXN1YWxpemFyIGEgbm92YSBzw6lyaWUNCnBsb3QoaXBjYV8yMDAzLCBtYWluID0gIklQQ0EgYSBwYXJ0aXIgZGUgMjAwMyIsIHlsYWIgPSAiSW5mbGHDp8OjbyAoJSkiLCB4bGFiID0gIkFubyIpDQppcGNhXzIwMDMgJT4lIGFkZi50ZXN0KCkNCmlwY2FfMjAwMyAlPiUga3Bzcy50ZXN0KCkNCmBgYA0KIFRhbnRvIG8gVGVzdGUgQURGICBxdWFudG8gbyBLUFNTIGluZGljYW0gZXN0YWNpb25hcmlkYWRlIG5hIHPDqXJpZS5BIGNvbWJpbmHDp8OjbyBkb3MgZG9pcyB0ZXN0ZXMgcmVmb3LDp2EgYSBjb25jbHVzw6NvIGRlIHF1ZSBhIHPDqXJpZSBmaWx0cmFkYSBuw6NvIGV4aWdlIGRpZmVyZW5jaWHDp8OjbyBhZGljaW9uYWwgcGFyYSBtb2RlbGFnZW0uIA0Kc2VndWlkYSwgYW5hbGlzYW1vcyBhcyBmdW7Dp8O1ZXMgZGUgYXV0b2NvcnJlbGHDp8OjbyAoQUNGKSBlIGF1dG9jb3JyZWxhw6fDo28gcGFyY2lhbCAoUEFDRikgcGFyYSBhdmFsaWFyIGNhbmRpZGF0b3MgQVIgZSBNQSBtYWlzIGFkZXF1YWRvcyBhbyBtb2RlbG8uDQoNCmBgYHtyfQ0KaXBjYV8yMDAzICU+JSBhY2YoKQ0KaXBjYV8yMDAzICU+JSBwYWNmDQpgYGANCk8gQUNGIGluZGljYSBMQUcgc2lnbmlmaWNhdGl2byBhdMOpIG8gNCBjb20gdW1hIHJldG9ybm8gZW50cmUgbyA5wrogYW8gMTHCuiBtw6pzLiBKw6EgbyBQQUNGIGluZGljbyB1bSBlZmVpdG8gc2lmbmlmaWNhdGl2byBubyA4wrogZSA5wrogTcOqcw0KYGBge3J9DQojIEFwbGljYXIgbWV0b2RvbG9naWEgQm94LUplbmtpbnMNCmFyaW1hKGlwY2FfMjAwMyxjKDQsMCwwKSkgICU+JSBjaGVja3Jlc2lkdWFscygpDQphcmltYShpcGNhXzIwMDMsYyg0LDAsOSkpICAlPiUgY2hlY2tyZXNpZHVhbHMoKQ0KYXJpbWEoaXBjYV8yMDAzLGMoMTEsMCw5KSkgICU+JSBjaGVja3Jlc2lkdWFscygpDQphcmltYShpcGNhXzIwMDMsYyg5LDAsNSkpICAlPiUgY2hlY2tyZXNpZHVhbHMoKQ0KYGBgDQpBIHBhcnRpciBkYSBhbmFsaXNlIGRlIHJlc2lkdW9zIGUgYnVzY2FuZG8gc2VyIHBhcmNpbW9uaW9zbyBvIG1vZGVsbyBBUk1BKDksNSkgbW9zdHJvdS1zZSBjb20gb3MgcmVzw61kdW9zIG1haXMgY29tcG9ydGFkb3MuDQpgYGB7cn0NCmFybWFfMjAwNCA8LSBhcmltYShpcGNhXzIwMDMsYyg5LDAsNSkpDQojIENvbXBhcmFyIGRlc2VtcGVuaG8gZG9zIG1vZGVsb3MNCkJJQyhhcm1hOTE2LGFybWFfMjAwNCkNCkFJQyhhcm1hOTE2LGFybWFfMjAwNCkNCmBgYA0KTyBtb2RlbG8gYWp1c3RhZG8gY29tIGRhZG9zIHDDs3MtMjAwMyBhcHJlc2VudG91IHVtIEJJQyBlIEFJQyBlIHNpZ25pZmljYXRpdmFtZW50ZSBtZW5vciwgaW5kaWNhbmRvIG1lbGhvciBhanVzdGUgZSBleHBsaWNhbmRvIGEgaW5mbGHDp8OjbyBuZXNzZSBwZXLDrW9kbyBkZSBmb3JtYSBtYWlzIHByZWNpc2EgZSBjb20gdW0gbW9kZWxvIG1haXMgcGFyY2ltb25pb3NvLg==