Licença

This work is licensed under the Creative Commons Attribution-ShareAlike 4.0 International License. To view a copy of this license, visit http://creativecommons.org/licenses/by-sa/4.0/ or send a letter to Creative Commons, PO Box 1866, Mountain View, CA 94042, USA.

License: CC BY-SA 4.0

Citação

Sugestão de citação: FIGUEIREDO, Adriano Marcos Rodrigues. Econometria: exercício 11.15, automóveis, Gujarati e Porter (2011, p.408-409). Campo Grande-MS,Brasil: RStudio/Rpubs, 2018 (revisto em 2020). Disponível em https://rpubs.com/amrofi/exercicio_gujarati_11_15.

1 Introdução - Primeiros passos

Os primeiros passos são criar ou abrir um diretório de trabalho. Se optar por criar um novo projeto, haverá a possibilidade de criar em uma pasta vazia. No presente caso, geramos um dput()dos dados de modo a incorporar (embed) a informação no código.

11.15. A Tabela 11.7 apresenta dados de 81 carros sobre MPG (milhas por galão de combustível), HP (potência do motor), VOL (espaço interno em metros cúbicos), SP (velocidade máxima,milhas por hora), e WT (peso do veículo em 100 libras). (1) \[ {MPG_i} = \beta_1 + \beta_2 SP_{i} + \beta_3 HP_{i} + \beta_4 WT_{i} + u_i \]

Chamando os dados de table11-7.wf1.RDS a partir do arquivo ou com a partir do resultado do dput().

> `table11-7.wf1` <- readRDS("~/disciplinas/econometria/material de aula/laboratorio_R/Gujarati_auto_11_15/table11-7.wf1.RDS")
> dados <- structure(list(HP = c(49, 55, 55, 70, 53, 70, 55, 62, 62, 80, 
+ 73, 92, 92, 73, 66, 73, 78, 92, 78, 90, 92, 74, 95, 81, 95, 92, 
+ 92, 92, 52, 103, 84, 84, 102, 102, 81, 90, 90, 102, 102, 130, 
+ 95, 95, 102, 95, 93, 100, 100, 98, 130, 115, 115, 115, 115, 180, 
+ 160, 130, 96, 115, 100, 100, 145, 120, 140, 140, 150, 165, 165, 
+ 165, 165, 245, 280, 162, 162, 140, 140, 175, 322, 238, 263, 295, 
+ 236), MPG = c(65.4, 56, 55.9, 49, 46.5, 46.2, 45.4, 59.2, 53.3, 
+ 43.4, 41.1, 40.9, 40.9, 40.4, 39.6, 39.3, 38.9, 38.8, 38.2, 42.2, 
+ 40.9, 40.7, 40, 39.3, 38.8, 38.4, 38.4, 38.4, 46.9, 36.3, 36.1, 
+ 36.1, 35.4, 35.3, 35.1, 35.1, 35, 33.2, 32.9, 32.3, 32.2, 32.2, 
+ 32.2, 32.2, 31.5, 31.5, 31.4, 31.4, 31.2, 33.7, 32.6, 31.3, 31.3, 
+ 30.4, 28.9, 28, 28, 28, 28, 28, 27.7, 25.6, 25.3, 23.9, 23.6, 
+ 23.6, 23.6, 23.6, 23.6, 23.5, 23.4, 23.4, 23.1, 22.9, 22.9, 19.5, 
+ 18.1, 17.2, 17, 16.7, 13.2), SP = c(96, 97, 97, 105, 96, 105, 
+ 97, 98, 98, 107, 103, 113, 113, 103, 100, 103, 106, 113, 106, 
+ 109, 110, 101, 111, 105, 111, 110, 110, 110, 90, 112, 103, 103, 
+ 111, 111, 102, 106, 106, 109, 109, 120, 106, 106, 109, 106, 105, 
+ 108, 108, 107, 120, 109, 109, 109, 109, 133, 125, 115, 102, 109, 
+ 104, 105, 120, 107, 114, 114, 117, 122, 122, 122, 122, 148, 160, 
+ 121, 121, 110, 110, 121, 165, 140, 147, 157, 130), VOL = c(89, 
+ 92, 92, 92, 92, 89, 92, 50, 50, 94, 89, 50, 99, 89, 89, 89, 91, 
+ 50, 91, 103, 99, 107, 101, 96, 89, 50, 117, 99, 104, 107, 114, 
+ 101, 97, 113, 101, 98, 88, 86, 86, 92, 113, 106, 92, 88, 102, 
+ 99, 111, 103, 86, 101, 101, 101, 124, 113, 113, 124, 92, 101, 
+ 94, 115, 111, 116, 131, 123, 121, 50, 114, 127, 123, 112, 50, 
+ 135, 132, 160, 129, 129, 50, 115, 50, 119, 107), WT = c(17.5, 
+ 20, 20, 20, 20, 20, 20, 22.5, 22.5, 22.5, 22.5, 22.5, 22.5, 22.5, 
+ 22.5, 22.5, 22.5, 22.5, 22.5, 25, 25, 25, 25, 25, 25, 25, 25, 
+ 25, 27.5, 27.5, 27.5, 27.5, 27.5, 27.5, 27.5, 27.5, 27.5, 30, 
+ 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 35, 35, 35, 35, 35, 
+ 35, 35, 35, 35, 35, 35, 35, 40, 40, 40, 40, 40, 40, 40, 40, 40, 
+ 40, 40, 40, 45, 45, 45, 45, 45, 45, 45, 55), TABLE01 = c(8.34402699627665e-309, 
+ 0, 0, 3.20429648707324e-306, 3.20445946173795e-306, 0, 0, 0, 
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
+ 0, 0, 0, 3.23790861658519e-319, 2.4484543718768e-312, 0, 1.51327318667226e-312, 
+ 0, 6.65811783208703e-315, 0, 6.65455613260878e-315, 0, 1.61929299987769e-312, 
+ 0, 6.99097483787198e-315, 0, 5.92878775009496e-323, 0, 5.92878775009496e-323, 
+ 0, 5.92878775009496e-323, 0, 5.92878775009496e-323, 0, 5.92878775009496e-323, 
+ 0, 5.92878775009496e-323, 0, 1.587209602416e-317, 0, -2.35343793465486e-185, 
+ 5.33100607018305e-315, 7.99801570164402e-317, 5.33348307323913e-315, 
+ 7.99801570164402e-317, 5.32846431488342e-315, 7.99801570164402e-317, 
+ 5.33291643923123e-315, 7.99801570164402e-317, 5.32101712506528e-315, 
+ 1.61958868858186e-317, 0, 7.99801570164402e-317, 5.32959758289923e-315, 
+ 7.99801570164402e-317, 5.33356402095455e-315, 7.99801570164402e-317, 
+ 5.3294356874684e-315, 7.99801570164402e-317, 5.33315928237747e-315, 
+ 7.99801570164402e-317, 5.32182660221942e-315)), class = "data.frame", row.names = c(NA, 
+ -81L))
> attach(dados)

Vamos ver como está a tabela importada:

> library(knitr)
> kable(dados[,1:5],caption="Dados da tabela 11.7")
Dados da tabela 11.7
HP MPG SP VOL WT
49 65.4 96 89 17.5
55 56.0 97 92 20.0
55 55.9 97 92 20.0
70 49.0 105 92 20.0
53 46.5 96 92 20.0
70 46.2 105 89 20.0
55 45.4 97 92 20.0
62 59.2 98 50 22.5
62 53.3 98 50 22.5
80 43.4 107 94 22.5
73 41.1 103 89 22.5
92 40.9 113 50 22.5
92 40.9 113 99 22.5
73 40.4 103 89 22.5
66 39.6 100 89 22.5
73 39.3 103 89 22.5
78 38.9 106 91 22.5
92 38.8 113 50 22.5
78 38.2 106 91 22.5
90 42.2 109 103 25.0
92 40.9 110 99 25.0
74 40.7 101 107 25.0
95 40.0 111 101 25.0
81 39.3 105 96 25.0
95 38.8 111 89 25.0
92 38.4 110 50 25.0
92 38.4 110 117 25.0
92 38.4 110 99 25.0
52 46.9 90 104 27.5
103 36.3 112 107 27.5
84 36.1 103 114 27.5
84 36.1 103 101 27.5
102 35.4 111 97 27.5
102 35.3 111 113 27.5
81 35.1 102 101 27.5
90 35.1 106 98 27.5
90 35.0 106 88 27.5
102 33.2 109 86 30.0
102 32.9 109 86 30.0
130 32.3 120 92 30.0
95 32.2 106 113 30.0
95 32.2 106 106 30.0
102 32.2 109 92 30.0
95 32.2 106 88 30.0
93 31.5 105 102 30.0
100 31.5 108 99 30.0
100 31.4 108 111 30.0
98 31.4 107 103 30.0
130 31.2 120 86 30.0
115 33.7 109 101 35.0
115 32.6 109 101 35.0
115 31.3 109 101 35.0
115 31.3 109 124 35.0
180 30.4 133 113 35.0
160 28.9 125 113 35.0
130 28.0 115 124 35.0
96 28.0 102 92 35.0
115 28.0 109 101 35.0
100 28.0 104 94 35.0
100 28.0 105 115 35.0
145 27.7 120 111 35.0
120 25.6 107 116 40.0
140 25.3 114 131 40.0
140 23.9 114 123 40.0
150 23.6 117 121 40.0
165 23.6 122 50 40.0
165 23.6 122 114 40.0
165 23.6 122 127 40.0
165 23.6 122 123 40.0
245 23.5 148 112 40.0
280 23.4 160 50 40.0
162 23.4 121 135 40.0
162 23.1 121 132 40.0
140 22.9 110 160 45.0
140 22.9 110 129 45.0
175 19.5 121 129 45.0
322 18.1 165 50 45.0
238 17.2 140 115 45.0
263 17.0 147 50 45.0
295 16.7 157 119 45.0
236 13.2 130 107 55.0

Estimando o modelo linear de regressao multipla fazendo conforme a expressão do enunciado.

2 Resultados

2.1 Estimação

Fazendo as regressoes com uso de logaritmo e depois sem logaritmos.

> mod1 <- lm(MPG~SP+HP+WT)
> mod2<-lm(log(MPG)~log(SP)+log(HP)+log(WT))

Vamos utilizar o pacote stargazer para organizar as saídas de resultados. Se a saída fosse apenas pelo comando summary, sairia da forma:

> summary(mod1)

Call:
lm(formula = MPG ~ SP + HP + WT)

Residuals:
    Min      1Q  Median      3Q     Max 
-6.1349 -2.9527 -0.0052  1.6701 12.4834 

Coefficients:
             Estimate Std. Error t value Pr(>|t|)    
(Intercept) 189.95968   22.52879   8.432 1.50e-12 ***
SP           -1.27170    0.23312  -5.455 5.72e-07 ***
HP            0.39043    0.07625   5.121 2.19e-06 ***
WT           -1.90327    0.18552 -10.259 4.64e-16 ***
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Residual standard error: 3.508 on 77 degrees of freedom
Multiple R-squared:  0.8829,    Adjusted R-squared:  0.8783 
F-statistic: 193.5 on 3 and 77 DF,  p-value: < 2.2e-16
> summary(mod2)

Call:
lm(formula = log(MPG) ~ log(SP) + log(HP) + log(WT))

Residuals:
     Min       1Q   Median       3Q      Max 
-0.23855 -0.04908  0.00072  0.04239  0.24049 

Coefficients:
            Estimate Std. Error t value Pr(>|t|)  
(Intercept)   5.0681     2.5426   1.993   0.0498 *
log(SP)       0.5732     0.6750   0.849   0.3984  
log(HP)      -0.5052     0.2919  -1.731   0.0875 .
log(WT)      -0.5687     0.2204  -2.580   0.0118 *
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Residual standard error: 0.08305 on 77 degrees of freedom
Multiple R-squared:  0.9291,    Adjusted R-squared:  0.9264 
F-statistic: 336.6 on 3 and 77 DF,  p-value: < 2.2e-16

Agora, criando uma tabela com as várias saídas de modelos, com o pacote stargazer tem-se, com a geração de AIC e BIC:

> library(stargazer)
> mod1$AIC <- AIC(mod1)
> mod2$AIC <- AIC(mod2)
> mod1$BIC <- BIC(mod1)
> mod2$BIC <- BIC(mod2)
> library(stargazer)
> star.1 <- stargazer(mod1, mod2,
+                     title="Título: Resultados das Regressões",
+                     align=TRUE,
+                     type = "text", style = "all",
+                     keep.stat=c("aic","bic","rsq", "adj.rsq","n")
+ )

Título: Resultados das Regressões
================================================
                        Dependent variable:     
                    ----------------------------
                         MPG         log(MPG)   
                         (1)            (2)     
------------------------------------------------
SP                    -1.272***                 
                       (0.233)                  
                      t = -5.455                
                     p = 0.00000                
HP                     0.390***                 
                       (0.076)                  
                      t = 5.121                 
                     p = 0.00001                
WT                    -1.903***                 
                       (0.186)                  
                     t = -10.259                
                      p = 0.000                 
log(SP)                                0.573    
                                      (0.675)   
                                     t = 0.849  
                                     p = 0.399  
log(HP)                               -0.505*   
                                      (0.292)   
                                    t = -1.731  
                                     p = 0.088  
log(WT)                              -0.569**   
                                      (0.220)   
                                    t = -2.580  
                                     p = 0.012  
Constant              189.960***      5.068**   
                       (22.529)       (2.543)   
                      t = 8.432      t = 1.993  
                      p = 0.000      p = 0.050  
------------------------------------------------
Observations              81            81      
R2                      0.883          0.929    
Adjusted R2             0.878          0.926    
Akaike Inf. Crit.      439.078       -167.339   
Bayesian Inf. Crit.    451.050       -155.367   
================================================
Note:                *p<0.1; **p<0.05; ***p<0.01

2.2 Correlação

A análise de correlação permitirá ter uma ideia inicial de possível multicolinearidade:

> # install.packages('corrplot')
> library(corrplot)
corrplot 0.84 loaded
> corel <- cor(dados)
Warning in cor(dados): o desvio padrão é zero
> corrplot(corel, method = "number")

2.3 Testes de restrição do modelo

Esses testes fazem uma estatística para avaliar um modelo restrito contra o modelo irrestrito. No presente caso, faremos apenas para o modelo log-log (mod2).

> library(car)
Loading required package: carData
> # F test: APENAS ESPECIFICO AS QUE TERAO TESTE DE OMISSAO
> myH0 <- c("log(SP)")
> linearHypothesis(mod2, myH0)

2.4 Teste RESET

> library(lmtest)
Loading required package: zoo

Attaching package: 'zoo'
The following objects are masked from 'package:base':

    as.Date, as.Date.numeric
> lmtest::resettest(mod2,power = 2:4,type = "fitted")

    RESET test

data:  mod2
RESET = 11.087, df1 = 3, df2 = 74, p-value = 4.307e-06
> mod3<-lm(log(MPG)~log(HP)+log(WT))
> lmtest::resettest(mod3,power = 2:4,type = "fitted")

    RESET test

data:  mod3
RESET = 6.8878, df1 = 3, df2 = 75, p-value = 0.000369

2.5 Teste de média e normalidade dos resíduos

> # resíduos do modelo 2
> u.hat<-resid(mod2)
> # teste de média dos resíduos: H0: resíduos têm média zero
> t.test(u.hat)   

    One Sample t-test

data:  u.hat
t = 5.5732e-16, df = 80, p-value = 1
alternative hypothesis: true mean is not equal to 0
95 percent confidence interval:
 -0.01801646  0.01801646
sample estimates:
   mean of x 
5.045556e-18 

2.5.1 Normalidade

Histograma

> # histograma
> hist.mod2<- hist(u.hat, freq = FALSE)
> curve(dnorm, add = TRUE,col="red")

Q-QPlot

> car::qqPlot(mod2)

[1]  8 81

Teste de normalidade Jarque-Bera

> JB.mod2<-tseries::jarque.bera.test(u.hat)
Registered S3 method overwritten by 'quantmod':
  method            from
  as.zoo.data.frame zoo 
> JB.mod2

    Jarque Bera Test

data:  u.hat
X-squared = 2.5379, df = 2, p-value = 0.2811

Outros testes de normalidade

> library(nortest)
> # Testes
> t1.2 <- ks.test(u.hat, "pnorm") # KS
Warning in ks.test(u.hat, "pnorm"): ties should not be present for the
Kolmogorov-Smirnov test
> t2.2 <- lillie.test(u.hat) # Lilliefors
> t3.2 <- cvm.test(u.hat) # Cramér-von Mises
> t4.2 <- shapiro.test(u.hat) # Shapiro-Wilk
> t5.2 <- sf.test(u.hat) # Shapiro-Francia
> t6.2 <- ad.test(u.hat) # Anderson-Darling
> # Tabela de resultados
> testes <- c(t1.2$method, t2.2$method, t3.2$method, t4.2$method, t5.2$method,
+             t6.2$method)
> estt <- as.numeric(c(t1.2$statistic, t2.2$statistic, t3.2$statistic, 
+                      t4.2$statistic, t5.2$statistic, t6.2$statistic))
> valorp <- c(t1.2$p.value, t2.2$p.value, t3.2$p.value, t4.2$p.value, t5.2$p.value,
+             t6.2$p.value)
> resultados <- cbind(estt, valorp)
> rownames(resultados) <- testes
> colnames(resultados) <- c("Estatística", "valor-prob")
> print(resultados, digits = 4)
                                               Estatística valor-prob
One-sample Kolmogorov-Smirnov test                 0.42940  2.132e-13
Lilliefors (Kolmogorov-Smirnov) normality test     0.09677  5.835e-02
Cramer-von Mises normality test                    0.12013  5.839e-02
Shapiro-Wilk normality test                        0.98151  2.927e-01
Shapiro-Francia normality test                     0.97686  1.323e-01
Anderson-Darling normality test                    0.63615  9.392e-02
> knitr::kable(resultados, digits = 4,caption = "Outros testes de normalidade dos resíduos")
Outros testes de normalidade dos resíduos
Estatística valor-prob
One-sample Kolmogorov-Smirnov test 0.4294 0.0000
Lilliefors (Kolmogorov-Smirnov) normality test 0.0968 0.0583
Cramer-von Mises normality test 0.1201 0.0584
Shapiro-Wilk normality test 0.9815 0.2927
Shapiro-Francia normality test 0.9769 0.1323
Anderson-Darling normality test 0.6361 0.0939

2.6 Teste de Heterocedasticidade de White

> #teste de White 
> # mod2<-lm(log(MPG)~log(SP)+log(HP)+log(WT))
> m <- mod2
> data <- dados
> #rotina do teste com base em m e data
> u2 <- m$residuals^2
> reg.auxiliar <- lm(u2 ~ log(SP)+log(HP)+log(WT)+                  I(log(SP)^2)+I(log(HP)^2)+I(log(WT)^2))  #sem termos cruzados, no cross-terms
> summary(reg.auxiliar)

Call:
lm(formula = u2 ~ log(SP) + log(HP) + log(WT) + I(log(SP)^2) + 
    I(log(HP)^2) + I(log(WT)^2))

Residuals:
      Min        1Q    Median        3Q       Max 
-0.013737 -0.004442 -0.002139  0.000865  0.046592 

Coefficients:
             Estimate Std. Error t value Pr(>|t|)  
(Intercept)  -4.70786    5.64805  -0.834   0.4072  
log(SP)       2.51946    2.28752   1.101   0.2743  
log(HP)      -0.47058    0.22131  -2.126   0.0368 *
log(WT)       0.09334    0.24070   0.388   0.6993  
I(log(SP)^2) -0.28350    0.22285  -1.272   0.2073  
I(log(HP)^2)  0.05646    0.02693   2.096   0.0395 *
I(log(WT)^2) -0.01887    0.03839  -0.491   0.6246  
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Residual standard error: 0.01022 on 74 degrees of freedom
Multiple R-squared:  0.2082,    Adjusted R-squared:  0.144 
F-statistic: 3.243 on 6 and 74 DF,  p-value: 0.006953
> Ru2<- summary(reg.auxiliar)$r.squared
> LM <- nrow(data)*Ru2
> #obtendo o numero de regressores menos o intercepto
> k <- length(coefficients(reg.auxiliar))-1
> k
[1] 6
> p.value <- 1-pchisq(LM, k) # O TESTE TEM k TERMOS REGRESSORES EM reg.auxiliar
> #c("LM","p.value")
> c(LM, p.value)
[1] 16.862401860  0.009802465

2.7 Correção de White

> vcov.white0<-hccm(mod2,type=c("hc1"))
> coeftest(mod2,vcov.white0)

t test of coefficients:

            Estimate Std. Error t value Pr(>|t|)  
(Intercept)  5.06808    2.80526  1.8066  0.07473 .
log(SP)      0.57320    0.75101  0.7632  0.44766  
log(HP)     -0.50524    0.32114 -1.5733  0.11975  
log(WT)     -0.56866    0.23124 -2.4592  0.01617 *
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

3 Referências

GUJARATI, Damodar N.; PORTER, Dawn C. Econometria básica. 5.ed. Porto Alegre: AMGH/Bookman/McGraw-Hill do Brasil, 2011.

LS0tDQp0aXRsZTogIkVjb25vbWV0cmlhOiBleGVyY8OtY2lvIDExLjE1LCBhdXRvbcOzdmVpcywgR3VqYXJhdGkgZSBQb3J0ZXIgKDIwMTEsIHAuNDA4LTQwOSkiDQphdXRob3I6ICJBZHJpYW5vIE1hcmNvcyBSb2RyaWd1ZXMgRmlndWVpcmVkbywgKmUtbWFpbDogYWRyaWFuby5maWd1ZWlyZWRvQHVmbXMuYnIqIg0KYWJzdHJhY3Q6IA0KICBUaGlzIGlzIGFuIHVuZGVyZ3JhZCBzdHVkZW50IGxldmVsIGV4ZXJjaXNlIGZvciBjbGFzcyB1c2UuIFdlIGFuYWx5c2UgZGF0YSBvbiA4MSBjYXJzIGFib3V0IE1QRyAoYXZlcmFnZSBtaWxlcyBwZXIgZ2FsbG9ucykuIFRoZSBleGFtcGxlIGlzIGRyYXcgZm9sbG93aW5nIEd1amFyYXRpIGFuZCBQb3J0ZXIgKDIwMTEsIHAuNDA4LTQwOSksIHBvcnR1Z3Vlc2UgZWRpdGlvbi4gDQpkYXRlOiAiYHIgZm9ybWF0KFN5cy5EYXRlKCksICclZCAlQiAlWScpYCINCm91dHB1dDoNCiAgaHRtbF9kb2N1bWVudDoNCiAgICBjb2RlX2Rvd25sb2FkOiB5ZXMNCiAgICB0aGVtZTogZGVmYXVsdA0KICAgIG51bWJlcl9zZWN0aW9uczogeWVzDQogICAgdG9jOiB5ZXMNCiAgICB0b2NfZmxvYXQ6IHllcw0KICAgIGRmX3ByaW50OiBwYWdlZA0KICAgIGZpZ19jYXB0aW9uOiB5ZXMNCiAgcGRmX2RvY3VtZW50Og0KICAgIHRvYzogeWVzDQogIHdvcmRfZG9jdW1lbnQ6DQogICAgdG9jOiB5ZXMNCi0tLQ0KDQpMaWNlbsOnYSB7LSNMaWNlbsOnYX0NCj09PT09PT09PT09PT09PT09PT0NCg0KVGhpcyB3b3JrIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBDcmVhdGl2ZSBDb21tb25zIEF0dHJpYnV0aW9uLVNoYXJlQWxpa2UgNC4wIEludGVybmF0aW9uYWwgTGljZW5zZS4gVG8gdmlldyBhIGNvcHkgb2YgdGhpcyBsaWNlbnNlLCB2aXNpdCA8aHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvbGljZW5zZXMvYnktc2EvNC4wLz4gb3Igc2VuZCBhIGxldHRlciB0byBDcmVhdGl2ZSBDb21tb25zLCBQTyBCb3ggMTg2NiwgTW91bnRhaW4gVmlldywgQ0EgOTQwNDIsIFVTQS4NCg0KIVtMaWNlbnNlOiBDQyBCWS1TQSA0LjBdKGh0dHBzOi8vbWlycm9ycy5jcmVhdGl2ZWNvbW1vbnMub3JnL3ByZXNza2l0L2J1dHRvbnMvODh4MzEvcG5nL2J5LXNhLnBuZyl7IHdpZHRoPTI1JSB9DQoNCkNpdGHDp8OjbyB7LSNDaXRhw6fDo299DQo9PT09PT09PT09PT09PT09PT09DQoNClN1Z2VzdMOjbyBkZSBjaXRhw6fDo286DQpGSUdVRUlSRURPLCBBZHJpYW5vIE1hcmNvcyBSb2RyaWd1ZXMuIEVjb25vbWV0cmlhOiBleGVyY8OtY2lvIDExLjE1LCBhdXRvbcOzdmVpcywgR3VqYXJhdGkgZSBQb3J0ZXIgKDIwMTEsIHAuNDA4LTQwOSkuIENhbXBvIEdyYW5kZS1NUyxCcmFzaWw6IFJTdHVkaW8vUnB1YnMsIDIwMTggKHJldmlzdG8gZW0gMjAyMCkuIERpc3BvbsOtdmVsIGVtIDxodHRwczovL3JwdWJzLmNvbS9hbXJvZmkvZXhlcmNpY2lvX2d1amFyYXRpXzExXzE1Pi4gDQoNCkludHJvZHXDp8OjbyAtIFByaW1laXJvcyBwYXNzb3MNCj09PT09PT09PT09PT09PT09PT0NCg0KT3MgcHJpbWVpcm9zIHBhc3NvcyBzw6NvIGNyaWFyIG91IGFicmlyIHVtIGRpcmV0w7NyaW8gZGUgdHJhYmFsaG8uIFNlIG9wdGFyIHBvciBjcmlhciB1bSBub3ZvIHByb2pldG8sIGhhdmVyw6EgYSBwb3NzaWJpbGlkYWRlIGRlIGNyaWFyIGVtIHVtYSBwYXN0YSB2YXppYS4gTm8gcHJlc2VudGUgY2FzbywgZ2VyYW1vcyB1bSBgZHB1dCgpYGRvcyBkYWRvcyBkZSBtb2RvIGEgaW5jb3Jwb3JhciAoKmVtYmVkKikgYSBpbmZvcm1hw6fDo28gbm8gY8OzZGlnby4NCg0KPiAxMS4xNS4gIEEgVGFiZWxhIDExLjcgYXByZXNlbnRhIGRhZG9zIGRlIDgxIGNhcnJvcyBzb2JyZSBNUEcgKG1pbGhhcyBwb3IgZ2Fsw6NvIGRlIGNvbWJ1c3TDrXZlbCksIEhQIChwb3TDqm5jaWEgZG8gbW90b3IpLCBWT0wgKGVzcGHDp28gaW50ZXJubyBlbSBtZXRyb3MgY8O6Ymljb3MpLCBTUCAodmVsb2NpZGFkZSBtw6F4aW1hLG1pbGhhcyBwb3IgaG9yYSksIGUgV1QgKHBlc28gZG8gdmXDrWN1bG8gZW0gMTAwIGxpYnJhcykuDQooMSkgICBcWyB7TVBHX2l9ID0gXGJldGFfMSArIFxiZXRhXzIgU1Bfe2l9ICsgXGJldGFfMyBIUF97aX0gKyBcYmV0YV80IFdUX3tpfSArIHVfaSBcXQ0KDQoNCkNoYW1hbmRvIG9zIGRhZG9zIGRlIGB0YWJsZTExLTcud2YxLlJEU2AgYSBwYXJ0aXIgZG8gYXJxdWl2byBvdSBjb20gYSBwYXJ0aXIgZG8gcmVzdWx0YWRvIGRvIGBkcHV0KClgLg0KDQpgYGB7ciwgZWNobz1GQUxTRSwgZXZhbD1UUlVFfQ0KIyBpbmNsdWRlIHRoaXMgY29kZSBjaHVuayBhcy1pcyB0byBzZXQgb3B0aW9ucw0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KGNvbW1lbnQ9TkEsIHByb21wdD1UUlVFLCBvdXQud2lkdGg9NzUwLCBmaWcuaGVpZ2h0PTgsIGZpZy53aWR0aD04KQ0KYGBgDQoNCmBgYHtyLCBldmFsPUZBTFNFfQ0KYHRhYmxlMTEtNy53ZjFgIDwtIHJlYWRSRFMoIn4vZGlzY2lwbGluYXMvZWNvbm9tZXRyaWEvbWF0ZXJpYWwgZGUgYXVsYS9sYWJvcmF0b3Jpb19SL0d1amFyYXRpX2F1dG9fMTFfMTUvdGFibGUxMS03LndmMS5SRFMiKQ0KYGBgDQoNCmBgYHtyfQ0KZGFkb3MgPC0gc3RydWN0dXJlKGxpc3QoSFAgPSBjKDQ5LCA1NSwgNTUsIDcwLCA1MywgNzAsIDU1LCA2MiwgNjIsIDgwLCANCjczLCA5MiwgOTIsIDczLCA2NiwgNzMsIDc4LCA5MiwgNzgsIDkwLCA5MiwgNzQsIDk1LCA4MSwgOTUsIDkyLCANCjkyLCA5MiwgNTIsIDEwMywgODQsIDg0LCAxMDIsIDEwMiwgODEsIDkwLCA5MCwgMTAyLCAxMDIsIDEzMCwgDQo5NSwgOTUsIDEwMiwgOTUsIDkzLCAxMDAsIDEwMCwgOTgsIDEzMCwgMTE1LCAxMTUsIDExNSwgMTE1LCAxODAsIA0KMTYwLCAxMzAsIDk2LCAxMTUsIDEwMCwgMTAwLCAxNDUsIDEyMCwgMTQwLCAxNDAsIDE1MCwgMTY1LCAxNjUsIA0KMTY1LCAxNjUsIDI0NSwgMjgwLCAxNjIsIDE2MiwgMTQwLCAxNDAsIDE3NSwgMzIyLCAyMzgsIDI2MywgMjk1LCANCjIzNiksIE1QRyA9IGMoNjUuNCwgNTYsIDU1LjksIDQ5LCA0Ni41LCA0Ni4yLCA0NS40LCA1OS4yLCA1My4zLCANCjQzLjQsIDQxLjEsIDQwLjksIDQwLjksIDQwLjQsIDM5LjYsIDM5LjMsIDM4LjksIDM4LjgsIDM4LjIsIDQyLjIsIA0KNDAuOSwgNDAuNywgNDAsIDM5LjMsIDM4LjgsIDM4LjQsIDM4LjQsIDM4LjQsIDQ2LjksIDM2LjMsIDM2LjEsIA0KMzYuMSwgMzUuNCwgMzUuMywgMzUuMSwgMzUuMSwgMzUsIDMzLjIsIDMyLjksIDMyLjMsIDMyLjIsIDMyLjIsIA0KMzIuMiwgMzIuMiwgMzEuNSwgMzEuNSwgMzEuNCwgMzEuNCwgMzEuMiwgMzMuNywgMzIuNiwgMzEuMywgMzEuMywgDQozMC40LCAyOC45LCAyOCwgMjgsIDI4LCAyOCwgMjgsIDI3LjcsIDI1LjYsIDI1LjMsIDIzLjksIDIzLjYsIA0KMjMuNiwgMjMuNiwgMjMuNiwgMjMuNiwgMjMuNSwgMjMuNCwgMjMuNCwgMjMuMSwgMjIuOSwgMjIuOSwgMTkuNSwgDQoxOC4xLCAxNy4yLCAxNywgMTYuNywgMTMuMiksIFNQID0gYyg5NiwgOTcsIDk3LCAxMDUsIDk2LCAxMDUsIA0KOTcsIDk4LCA5OCwgMTA3LCAxMDMsIDExMywgMTEzLCAxMDMsIDEwMCwgMTAzLCAxMDYsIDExMywgMTA2LCANCjEwOSwgMTEwLCAxMDEsIDExMSwgMTA1LCAxMTEsIDExMCwgMTEwLCAxMTAsIDkwLCAxMTIsIDEwMywgMTAzLCANCjExMSwgMTExLCAxMDIsIDEwNiwgMTA2LCAxMDksIDEwOSwgMTIwLCAxMDYsIDEwNiwgMTA5LCAxMDYsIDEwNSwgDQoxMDgsIDEwOCwgMTA3LCAxMjAsIDEwOSwgMTA5LCAxMDksIDEwOSwgMTMzLCAxMjUsIDExNSwgMTAyLCAxMDksIA0KMTA0LCAxMDUsIDEyMCwgMTA3LCAxMTQsIDExNCwgMTE3LCAxMjIsIDEyMiwgMTIyLCAxMjIsIDE0OCwgMTYwLCANCjEyMSwgMTIxLCAxMTAsIDExMCwgMTIxLCAxNjUsIDE0MCwgMTQ3LCAxNTcsIDEzMCksIFZPTCA9IGMoODksIA0KOTIsIDkyLCA5MiwgOTIsIDg5LCA5MiwgNTAsIDUwLCA5NCwgODksIDUwLCA5OSwgODksIDg5LCA4OSwgOTEsIA0KNTAsIDkxLCAxMDMsIDk5LCAxMDcsIDEwMSwgOTYsIDg5LCA1MCwgMTE3LCA5OSwgMTA0LCAxMDcsIDExNCwgDQoxMDEsIDk3LCAxMTMsIDEwMSwgOTgsIDg4LCA4NiwgODYsIDkyLCAxMTMsIDEwNiwgOTIsIDg4LCAxMDIsIA0KOTksIDExMSwgMTAzLCA4NiwgMTAxLCAxMDEsIDEwMSwgMTI0LCAxMTMsIDExMywgMTI0LCA5MiwgMTAxLCANCjk0LCAxMTUsIDExMSwgMTE2LCAxMzEsIDEyMywgMTIxLCA1MCwgMTE0LCAxMjcsIDEyMywgMTEyLCA1MCwgDQoxMzUsIDEzMiwgMTYwLCAxMjksIDEyOSwgNTAsIDExNSwgNTAsIDExOSwgMTA3KSwgV1QgPSBjKDE3LjUsIA0KMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjIuNSwgMjIuNSwgMjIuNSwgMjIuNSwgMjIuNSwgMjIuNSwgMjIuNSwgDQoyMi41LCAyMi41LCAyMi41LCAyMi41LCAyMi41LCAyNSwgMjUsIDI1LCAyNSwgMjUsIDI1LCAyNSwgMjUsIA0KMjUsIDI3LjUsIDI3LjUsIDI3LjUsIDI3LjUsIDI3LjUsIDI3LjUsIDI3LjUsIDI3LjUsIDI3LjUsIDMwLCANCjMwLCAzMCwgMzAsIDMwLCAzMCwgMzAsIDMwLCAzMCwgMzAsIDMwLCAzMCwgMzUsIDM1LCAzNSwgMzUsIDM1LCANCjM1LCAzNSwgMzUsIDM1LCAzNSwgMzUsIDM1LCA0MCwgNDAsIDQwLCA0MCwgNDAsIDQwLCA0MCwgNDAsIDQwLCANCjQwLCA0MCwgNDAsIDQ1LCA0NSwgNDUsIDQ1LCA0NSwgNDUsIDQ1LCA1NSksIFRBQkxFMDEgPSBjKDguMzQ0MDI2OTk2Mjc2NjVlLTMwOSwgDQowLCAwLCAzLjIwNDI5NjQ4NzA3MzI0ZS0zMDYsIDMuMjA0NDU5NDYxNzM3OTVlLTMwNiwgMCwgMCwgMCwgDQowLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCANCjAsIDAsIDAsIDMuMjM3OTA4NjE2NTg1MTllLTMxOSwgMi40NDg0NTQzNzE4NzY4ZS0zMTIsIDAsIDEuNTEzMjczMTg2NjcyMjZlLTMxMiwgDQowLCA2LjY1ODExNzgzMjA4NzAzZS0zMTUsIDAsIDYuNjU0NTU2MTMyNjA4NzhlLTMxNSwgMCwgMS42MTkyOTI5OTk4Nzc2OWUtMzEyLCANCjAsIDYuOTkwOTc0ODM3ODcxOThlLTMxNSwgMCwgNS45Mjg3ODc3NTAwOTQ5NmUtMzIzLCAwLCA1LjkyODc4Nzc1MDA5NDk2ZS0zMjMsIA0KMCwgNS45Mjg3ODc3NTAwOTQ5NmUtMzIzLCAwLCA1LjkyODc4Nzc1MDA5NDk2ZS0zMjMsIDAsIDUuOTI4Nzg3NzUwMDk0OTZlLTMyMywgDQowLCA1LjkyODc4Nzc1MDA5NDk2ZS0zMjMsIDAsIDEuNTg3MjA5NjAyNDE2ZS0zMTcsIDAsIC0yLjM1MzQzNzkzNDY1NDg2ZS0xODUsIA0KNS4zMzEwMDYwNzAxODMwNWUtMzE1LCA3Ljk5ODAxNTcwMTY0NDAyZS0zMTcsIDUuMzMzNDgzMDczMjM5MTNlLTMxNSwgDQo3Ljk5ODAxNTcwMTY0NDAyZS0zMTcsIDUuMzI4NDY0MzE0ODgzNDJlLTMxNSwgNy45OTgwMTU3MDE2NDQwMmUtMzE3LCANCjUuMzMyOTE2NDM5MjMxMjNlLTMxNSwgNy45OTgwMTU3MDE2NDQwMmUtMzE3LCA1LjMyMTAxNzEyNTA2NTI4ZS0zMTUsIA0KMS42MTk1ODg2ODg1ODE4NmUtMzE3LCAwLCA3Ljk5ODAxNTcwMTY0NDAyZS0zMTcsIDUuMzI5NTk3NTgyODk5MjNlLTMxNSwgDQo3Ljk5ODAxNTcwMTY0NDAyZS0zMTcsIDUuMzMzNTY0MDIwOTU0NTVlLTMxNSwgNy45OTgwMTU3MDE2NDQwMmUtMzE3LCANCjUuMzI5NDM1Njg3NDY4NGUtMzE1LCA3Ljk5ODAxNTcwMTY0NDAyZS0zMTcsIDUuMzMzMTU5MjgyMzc3NDdlLTMxNSwgDQo3Ljk5ODAxNTcwMTY0NDAyZS0zMTcsIDUuMzIxODI2NjAyMjE5NDJlLTMxNSkpLCBjbGFzcyA9ICJkYXRhLmZyYW1lIiwgcm93Lm5hbWVzID0gYyhOQSwgDQotODFMKSkNCmF0dGFjaChkYWRvcykNCmBgYA0KDQoNClZhbW9zIHZlciBjb21vIGVzdMOhIGEgdGFiZWxhIGltcG9ydGFkYToNCg0KYGBge3J9DQpsaWJyYXJ5KGtuaXRyKQ0Ka2FibGUoZGFkb3NbLDE6NV0sY2FwdGlvbj0iRGFkb3MgZGEgdGFiZWxhIDExLjciKQ0KDQpgYGANCg0KRXN0aW1hbmRvIG8gbW9kZWxvIGxpbmVhciBkZSByZWdyZXNzYW8gbXVsdGlwbGEgZmF6ZW5kbyBjb25mb3JtZSBhIGV4cHJlc3PDo28gZG8gZW51bmNpYWRvLg0KDQoNClJlc3VsdGFkb3MgDQo9PT09PT09PT09PT09PT09PT09DQoNCiMjIEVzdGltYcOnw6NvDQoNCkZhemVuZG8gYXMgcmVncmVzc29lcyBjb20gdXNvIGRlIGxvZ2FyaXRtbyBlIGRlcG9pcyBzZW0gbG9nYXJpdG1vcy4NCg0KYGBge3IgZXN0aW1hY2FvfQ0KbW9kMSA8LSBsbShNUEd+U1ArSFArV1QpDQptb2QyPC1sbShsb2coTVBHKX5sb2coU1ApK2xvZyhIUCkrbG9nKFdUKSkNCmBgYA0KDQpWYW1vcyB1dGlsaXphciBvIHBhY290ZSAqc3RhcmdhemVyKiBwYXJhIG9yZ2FuaXphciBhcyBzYcOtZGFzIGRlIHJlc3VsdGFkb3MuIFNlIGEgc2HDrWRhIGZvc3NlIGFwZW5hcyBwZWxvIGNvbWFuZG8gKnN1bW1hcnkqLCBzYWlyaWEgZGEgZm9ybWE6DQogICANCmBgYHtyfQ0Kc3VtbWFyeShtb2QxKQ0Kc3VtbWFyeShtb2QyKQ0KYGBgDQoNCkFnb3JhLCBjcmlhbmRvIHVtYSB0YWJlbGEgY29tIGFzIHbDoXJpYXMgc2HDrWRhcyBkZSBtb2RlbG9zLCBjb20gbyBwYWNvdGUgKnN0YXJnYXplciogdGVtLXNlLCBjb20gYSBnZXJhw6fDo28gZGUgQUlDIGUgQklDOg0KDQpgYGB7ciAsIGVjaG89VFJVRSwgZXZhbD1UUlVFLCBtZXNzYWdlPUYsIHdhcm5pbmc9Rn0NCmxpYnJhcnkoc3RhcmdhemVyKQ0KbW9kMSRBSUMgPC0gQUlDKG1vZDEpDQptb2QyJEFJQyA8LSBBSUMobW9kMikNCm1vZDEkQklDIDwtIEJJQyhtb2QxKQ0KbW9kMiRCSUMgPC0gQklDKG1vZDIpDQpsaWJyYXJ5KHN0YXJnYXplcikNCnN0YXIuMSA8LSBzdGFyZ2F6ZXIobW9kMSwgbW9kMiwNCiAgICAgICAgICAgICAgICAgICAgdGl0bGU9IlTDrXR1bG86IFJlc3VsdGFkb3MgZGFzIFJlZ3Jlc3PDtWVzIiwNCiAgICAgICAgICAgICAgICAgICAgYWxpZ249VFJVRSwNCiAgICAgICAgICAgICAgICAgICAgdHlwZSA9ICJ0ZXh0Iiwgc3R5bGUgPSAiYWxsIiwNCiAgICAgICAgICAgICAgICAgICAga2VlcC5zdGF0PWMoImFpYyIsImJpYyIsInJzcSIsICJhZGoucnNxIiwibiIpDQopDQoNCmBgYA0KDQoNCiMjIENvcnJlbGHDp8Ojbw0KDQpBIGFuw6FsaXNlIGRlIGNvcnJlbGHDp8OjbyBwZXJtaXRpcsOhIHRlciB1bWEgaWRlaWEgaW5pY2lhbCBkZSBwb3Nzw612ZWwgbXVsdGljb2xpbmVhcmlkYWRlOg0KDQpgYGB7cn0NCiMgaW5zdGFsbC5wYWNrYWdlcygnY29ycnBsb3QnKQ0KbGlicmFyeShjb3JycGxvdCkNCmNvcmVsIDwtIGNvcihkYWRvcykNCmNvcnJwbG90KGNvcmVsLCBtZXRob2QgPSAibnVtYmVyIikNCg0KYGBgDQoNCiMjIFRlc3RlcyBkZSByZXN0cmnDp8OjbyBkbyBtb2RlbG8NCg0KRXNzZXMgdGVzdGVzIGZhemVtIHVtYSBlc3RhdMOtc3RpY2EgcGFyYSBhdmFsaWFyIHVtIG1vZGVsbyByZXN0cml0byBjb250cmEgbyBtb2RlbG8gaXJyZXN0cml0by4gTm8gcHJlc2VudGUgY2FzbywgZmFyZW1vcyBhcGVuYXMgcGFyYSBvIG1vZGVsbyBsb2ctbG9nIChgbW9kMmApLg0KDQpgYGB7cixldmFsPVRSVUV9DQpsaWJyYXJ5KGNhcikNCiMgRiB0ZXN0OiBBUEVOQVMgRVNQRUNJRklDTyBBUyBRVUUgVEVSQU8gVEVTVEUgREUgT01JU1NBTw0KbXlIMCA8LSBjKCJsb2coU1ApIikNCmxpbmVhckh5cG90aGVzaXMobW9kMiwgbXlIMCkNCmBgYA0KDQojIyBUZXN0ZSBSRVNFVA0KDQpgYGB7cn0NCmxpYnJhcnkobG10ZXN0KQ0KbG10ZXN0OjpyZXNldHRlc3QobW9kMixwb3dlciA9IDI6NCx0eXBlID0gImZpdHRlZCIpDQptb2QzPC1sbShsb2coTVBHKX5sb2coSFApK2xvZyhXVCkpDQpsbXRlc3Q6OnJlc2V0dGVzdChtb2QzLHBvd2VyID0gMjo0LHR5cGUgPSAiZml0dGVkIikNCmBgYA0KDQojIyBUZXN0ZSBkZSBtw6lkaWEgZSBub3JtYWxpZGFkZSBkb3MgcmVzw61kdW9zIA0KDQpgYGB7cn0NCiMgcmVzw61kdW9zIGRvIG1vZGVsbyAyDQp1LmhhdDwtcmVzaWQobW9kMikNCiMgdGVzdGUgZGUgbcOpZGlhIGRvcyByZXPDrWR1b3M6IEgwOiByZXPDrWR1b3MgdMOqbSBtw6lkaWEgemVybw0KdC50ZXN0KHUuaGF0KSAgIA0KYGBgDQoNCiMjIyBOb3JtYWxpZGFkZQ0KDQpIaXN0b2dyYW1hDQoNCmBgYHtyfQ0KIyBoaXN0b2dyYW1hDQpoaXN0Lm1vZDI8LSBoaXN0KHUuaGF0LCBmcmVxID0gRkFMU0UpDQpjdXJ2ZShkbm9ybSwgYWRkID0gVFJVRSxjb2w9InJlZCIpDQpgYGANCg0KUS1RUGxvdA0KDQpgYGB7cn0NCmNhcjo6cXFQbG90KG1vZDIpDQpgYGANCg0KVGVzdGUgZGUgbm9ybWFsaWRhZGUgSmFycXVlLUJlcmENCg0KYGBge3J9DQpKQi5tb2QyPC10c2VyaWVzOjpqYXJxdWUuYmVyYS50ZXN0KHUuaGF0KQ0KSkIubW9kMg0KYGBgDQoNCk91dHJvcyB0ZXN0ZXMgZGUgbm9ybWFsaWRhZGUNCg0KYGBge3J9DQoNCmxpYnJhcnkobm9ydGVzdCkNCiMgVGVzdGVzDQp0MS4yIDwtIGtzLnRlc3QodS5oYXQsICJwbm9ybSIpICMgS1MNCnQyLjIgPC0gbGlsbGllLnRlc3QodS5oYXQpICMgTGlsbGllZm9ycw0KdDMuMiA8LSBjdm0udGVzdCh1LmhhdCkgIyBDcmFtw6lyLXZvbiBNaXNlcw0KdDQuMiA8LSBzaGFwaXJvLnRlc3QodS5oYXQpICMgU2hhcGlyby1XaWxrDQp0NS4yIDwtIHNmLnRlc3QodS5oYXQpICMgU2hhcGlyby1GcmFuY2lhDQp0Ni4yIDwtIGFkLnRlc3QodS5oYXQpICMgQW5kZXJzb24tRGFybGluZw0KIyBUYWJlbGEgZGUgcmVzdWx0YWRvcw0KdGVzdGVzIDwtIGModDEuMiRtZXRob2QsIHQyLjIkbWV0aG9kLCB0My4yJG1ldGhvZCwgdDQuMiRtZXRob2QsIHQ1LjIkbWV0aG9kLA0KICAgICAgICAgICAgdDYuMiRtZXRob2QpDQplc3R0IDwtIGFzLm51bWVyaWMoYyh0MS4yJHN0YXRpc3RpYywgdDIuMiRzdGF0aXN0aWMsIHQzLjIkc3RhdGlzdGljLCANCiAgICAgICAgICAgICAgICAgICAgIHQ0LjIkc3RhdGlzdGljLCB0NS4yJHN0YXRpc3RpYywgdDYuMiRzdGF0aXN0aWMpKQ0KdmFsb3JwIDwtIGModDEuMiRwLnZhbHVlLCB0Mi4yJHAudmFsdWUsIHQzLjIkcC52YWx1ZSwgdDQuMiRwLnZhbHVlLCB0NS4yJHAudmFsdWUsDQogICAgICAgICAgICB0Ni4yJHAudmFsdWUpDQpyZXN1bHRhZG9zIDwtIGNiaW5kKGVzdHQsIHZhbG9ycCkNCnJvd25hbWVzKHJlc3VsdGFkb3MpIDwtIHRlc3Rlcw0KY29sbmFtZXMocmVzdWx0YWRvcykgPC0gYygiRXN0YXTDrXN0aWNhIiwgInZhbG9yLXByb2IiKQ0KcHJpbnQocmVzdWx0YWRvcywgZGlnaXRzID0gNCkNCmtuaXRyOjprYWJsZShyZXN1bHRhZG9zLCBkaWdpdHMgPSA0LGNhcHRpb24gPSAiT3V0cm9zIHRlc3RlcyBkZSBub3JtYWxpZGFkZSBkb3MgcmVzw61kdW9zIikNCmBgYA0KDQoNCiMjIFRlc3RlIGRlIEhldGVyb2NlZGFzdGljaWRhZGUgZGUgV2hpdGUNCg0KYGBge3J9DQojdGVzdGUgZGUgV2hpdGUgDQojIG1vZDI8LWxtKGxvZyhNUEcpfmxvZyhTUCkrbG9nKEhQKStsb2coV1QpKQ0KbSA8LSBtb2QyDQpkYXRhIDwtIGRhZG9zDQojcm90aW5hIGRvIHRlc3RlIGNvbSBiYXNlIGVtIG0gZSBkYXRhDQp1MiA8LSBtJHJlc2lkdWFsc14yDQpyZWcuYXV4aWxpYXIgPC0gbG0odTIgfiBsb2coU1ApK2xvZyhIUCkrbG9nKFdUKSsgICAgICAgICAgICAgICAgICBJKGxvZyhTUCleMikrSShsb2coSFApXjIpK0kobG9nKFdUKV4yKSkgICNzZW0gdGVybW9zIGNydXphZG9zLCBubyBjcm9zcy10ZXJtcw0Kc3VtbWFyeShyZWcuYXV4aWxpYXIpDQpSdTI8LSBzdW1tYXJ5KHJlZy5hdXhpbGlhcikkci5zcXVhcmVkDQpMTSA8LSBucm93KGRhdGEpKlJ1Mg0KI29idGVuZG8gbyBudW1lcm8gZGUgcmVncmVzc29yZXMgbWVub3MgbyBpbnRlcmNlcHRvDQprIDwtIGxlbmd0aChjb2VmZmljaWVudHMocmVnLmF1eGlsaWFyKSktMQ0Kaw0KcC52YWx1ZSA8LSAxLXBjaGlzcShMTSwgaykgIyBPIFRFU1RFIFRFTSBrIFRFUk1PUyBSRUdSRVNTT1JFUyBFTSByZWcuYXV4aWxpYXINCiNjKCJMTSIsInAudmFsdWUiKQ0KYyhMTSwgcC52YWx1ZSkNCmBgYA0KDQojIyBDb3JyZcOnw6NvIGRlIFdoaXRlDQpgYGB7cn0NCnZjb3Yud2hpdGUwPC1oY2NtKG1vZDIsdHlwZT1jKCJoYzEiKSkNCmNvZWZ0ZXN0KG1vZDIsdmNvdi53aGl0ZTApDQpgYGANCg0KUmVmZXLDqm5jaWFzDQo9PT09PT09PT09PT09PT09DQoNCkdVSkFSQVRJLCBEYW1vZGFyIE4uOyBQT1JURVIsIERhd24gQy4gRWNvbm9tZXRyaWEgYsOhc2ljYS4gNS5lZC4gUG9ydG8gQWxlZ3JlOiBBTUdIL0Jvb2ttYW4vTWNHcmF3LUhpbGwgZG8gQnJhc2lsLCAyMDExLiANCg==