1 Testes de Aderência - Caso Normal

1.1 Aspectos Históricos

Os principais testes estatísticos empregados na análise de dados clínicos e experimentais são baseados em modelos teóricos que pressupõem a Distribuição Normal dos dados amostrais (MIOT, 2017).

Porém, tal suposição é, muitas vezes, deixada de lado por profissionais, por diversos motivos:

  • Esquecimento;
  • Falta de Conhecimento;
  • Desconhecimento de qual o Melhor Método;

Assim, O objetivo do trabalho foi analisar o desempenho dos principais teste de normalidade implementados no Software Estatístico \(R_{(4.3)}\) para decidir quais apresentam o melhor desempenho ao responder se os dados podem ser considerados normais.

1.2 Teste de Kolmogorov-Smirnov

È um teste não paramétrico de bondade do ajuste sobre a igualdade de distribuições de probabilidade contínuas e unidimensionais que pode ser usado para comparar uma amostra com uma distribuição de probabilidade de referência.

O nome é uma referência aso matemáticos russos Andrei Nikolaevich Kolmogorov e Nikolai Vasilyevich Smirnov. A estatística de Kolmogorov–Smirnov quantifica a distância entre a função distribuição empírica da amostra e a função distribuição acumulada da distribuição de referência.

O teste de Kolmogorov-Smirnov pode ser modificado para servir como um teste da qualidade do ajuste. No caso especial do teste da normalidade da distribuição, as amostras são padronizadas e comparadas com uma distribuição normal padrão.

1.2.1 Andrei Nikolaevich Kolmogorov

Kolmogorov nasceu em 25 ade abril de 1903 em Tambov, na cidade de Moscou. Foi um matemtático Russo, participou das maiores descobertas científicas do século XX, nas áreas de Probabilidade e Estatística, e em Teoria da Informação.

Em, 1933 Kolmogorov estabeleceu a definição de probabilidade por Axiomatização, na sua obra intitulada **Foundations of Theory of Probability*. Foi com base nas propriedades das frequências relativas e das operações sobre conjuntos que Kolmogorov concebeu a primeira construção Axiomática Geral para a Teoria das Probabilidades.

Considerado um dos grandes cientista em sua época, Kolmogorov foi agraciado por diversas honrarias ao longo de sua carreira:

  • Prêmio Lenin em 1941;
  • Prêmio Balzan em 1962;
  • Medalha Helmholtz em 195;
  • Prêmio Wolf de Matemática em 1980;
  • Medalha Lobachevsky em 1986;

1.2.2 Nikolai Vasilyevich Smirnov

Snirnov nasceu em em 17 de outubro de 1900, em Moscou, na família de um escrivão de igreja que também trabalhava como escriturário no escritório do Teatro Bolshoi . Ele completou seus estudos de ginásio durante a Primeira Guerra Mundial , durante a qual serviu em várias unidades médicas do exército. Foi um matemático russo soviético conhecido por seu trabalho em vários campos, incluindo teoria de probabilidade e estatística.

Smirnov formou-se na Faculdade de Física e Matemática da Universidade Estadual de Moscou e, a partir de 1926, ensinou matemática por muitos anos na Academia Agrícola Timiryazev.

Smirnov recebeu o Prêmio de Estado da URSS em 1951. Em 1953 foi agraciado com a Ordem da Bandeira Vermelha do Trabalho.

1.2.3 Estatística do Teste

A função distribuição empírica \(F_{n}\) para n observações \(X_{i}\) independentes e identicamente distribuídas é definida como:

\[ F_{n}(x) = \frac{1}{n} \sum_{i=1}^{n} I_{[- \infty,x]}(X_{i}) \]

Em que \(I_{(-\infty,x)}X_{i}\) é a função indicadora, igual a 1 se \(X_{i} \leq x\) e igual a 0 de outro modo.

A estatística de Kolmogorov–Smirnov para uma dada função distribuição acumulada \(F(X)\)

\[ D_{n} = \displaystyle \sup_{x} \ |F_{n}(x) - F(x)|\]

em que \(\displaystyle \sup_{x}\) é o supremo do conjunto de distâncias. Pelo Teorema de Glivenko–Cantelli, se a amostra vier da distribuição \(F(X)\) entao \(D_{n}\) converge a 0 quase certamente no limite quando n vai ao infinito.

1.2.3.1 Função de Distribuição Empírica

Na figura abaixo mostra-se à função de distribuição empírica correspondente à amostra obtida da distribuição Normal Padrão (0,1) enquantro a curva vermelha corresponde à distriuição teórica respectiva.

set.seed(18340)
x = rnorm(50)
par(mar=c(4,2,1,1))
plot(ecdf(x), 
     xlim = range(c(-3, 3)), 
     main = "", 
     ylab="")
text(0,0.8,expression(F[n](x)))
curve(pnorm(x), 
      add = TRUE, 
      col = "red", 
      lwd = 2)
rug(x)

1.2.4 Hipóteses do Teste

As Hipóteses do teste de kolmogorov-smirnov são:

\[ H_{0}: a \ diferença \ entre \ frequências \ observadas \ e \ esperadas \ é \ pequena \ ou \ F_{0}(X) - S_{n}(X) \approx 0. \\ H_{1}: Caso \ Contrário. \]

1.2.5 Nível de Significância do Teste

Escolha de um nível de a \(\alpha = 0.05\) ou \(\alpha = 0.01\), sendo teste de natureza bicaudal.

1.2.6 Regra de Decisão do Teste

Observando o \(p-valor\) maior que \(0.05\), concluí-se que \(\textbf{Não}\) há evidências para Rejeitar \(H_{0}\), caso contrário, se o \(p-valor\) seja menor que \(0.05\).

O teste de kolmogorov-smirnov pode ser aplicado utilizando a função ks.test() do pacote stats do software R_{4.3.2} versão windows.

1.3 Teste de Shapiro-Wilk

È um teste de normalidade publicado em 1965 por Samuel Sanford Shapiro e Martin Wilk e se baseia na regressão dos valores amostrais ordenados com as correspondentes estatísticas de seis ordens normais que, para uma amostra de uma população normalmente distribuída, é linear (ROYSTON, 1982).

1.3.1 Samuel Sanford Shapiro

Samuel nasceu na cidade de Nova York , Shapiro formou-se em estatística no City College of New York em 1952, e fez mestrado em engenharia industrial na Universidade de Columbia em 1954. Ele serviu brevemente como estatístico no Corpo Químico do Exército dos EUA, antes de obter um mestrado (1960) e um doutorado (1963) em estatística na Rutgers University. Em 1972 ingressou no corpo docente da Florida International University.

1.3.2 Martin Bradbury Wilk

Martin nasceu em Montreal, Quebec, ele recebeu o diploma de bacharel em engenharia química pela Universidade McGill em 1945. Durante o período de 1951 a 1955, obteve o título de mestrado e doutorado em estatística pela Iowa State University.

O teste de Shapiro-Wilk testa a hipótese nula de que uma amostra \(x_{1}, \ldots, x_{n}\) veio de uma população normalmente distribuída. A estatística de teste é:

\[ W = \frac{(\sum_{i=1}^{n} a_{i}x_{i})^{2}}{\sum_{i=1}^{n}(x_{i}-\bar{x})^{2}}\]

O teste de shapiro-wilk pode ser aplicado utilizando a função shapiro.test() do pacote stats do software R_{4.3.2} versão windows.

1.4 Teste de Jarque-Bera

È um teste de qualidade de ajuste para verificar se os dados da amostra têm assimetria e curtose correspondentes a uma distribuição normal . A prova leva o nome de Carlos M. Jarque Uribe e Anil K. Bera. A estatística de teste é sempre não negativa. Se estiver longe de zero, sinaliza que os dados não têm distribuição normal.

1.4.1 Carlos M. Jarque Uribe

Carlos Jarque (nascido em 18 de outubro de 1954 na Cidade do México) é um economista mexicano, atualmente Diretor Executivo da América Móvil e Membro do Conselho do Grupo Líder Global em Serviços ao Cidadão FCC (Fomento de Construcciones y Contratas). Teve uma carreira destacada no sector privado, na função pública (nacional e multilateral) e no mundo académico.

Jarque é formado em Ciências Atuariais pela Universidade Anahuac, na Cidade do México. Ele tem Pós-Graduação em Estatística e Mestrado em Econometria pela London School of Economics; Certificado de Pós-Graduação em Política Econômica e Planeamento Urbano e Regional pela Universidade de Oslo; Doutorado em Economia (Ph.D) pela Australian National University; e pós-doutorado em Economia pela Universidade de Harvard.

1.4.2 Anil K. Bera

Anil K. Bera (nascido em 1955) é um econometrista indiano-americano. Ele é professor de Economia na Universidade de Illinois no Departamento de Economia de Urbana – Champaign.

Bera nasceu em uma remota vila de Paschimchak, Bengala Ocidental , Índia. Seu pai era um médico que não cobrava honorários formais de seus pacientes e dependia de contribuições voluntárias.

Bera recebeu um Bacharelado da Universidade de Calcutá em 1975 em Estatística, mestrado pelo Indian Statistical Institute em 1977 em Econometria e Planejamento (Primeira Classe) e doutorado. em 1983 pela Australian National University (Phd Aspects of Econometric Modeling).

A estatística do teste de Jarque-Ber é definida como:

\[ JB = \frac{n}{6} (S^{2} + \frac{1}{4}+(K-3)^{2}) \]

onde n é o número de observações(ou graus de liberdade em geral); S é a assimetria da amostra; K é a curtose da amostra:

\[S=\frac{\hat{\mu_{3}}}{\hat{\sigma^{3}}} = \frac{\frac{1}{n} \sum_{i=1}^{n} (x_{i}-\bar{x})^{3}}{\frac{1}{n} \sum_{i=1}^{n} (x_{i}-\bar{x})^{2})^{\frac{3}{2}}}\] e

\[ K = \frac{\hat{\mu_{4}}}{\hat{\sigma^{4}}} = \frac{\frac{1}{n} \sum_{i=1}^{n} (x_{i}-\bar{x})^{4}}{\frac{1}{n} \sum_{i=1}^{n} (x_{i}-\bar{x})^{2}}\]

onde \(\hat{\mu_{3}}\) e \(\hat{\mu_{4}}\) são as estimativas do terceiro e quarto momentos centrais, respectivamente, \(\bar{x}\) é a média amostral e \(\hat{\sigma}^{2}\) é a estimativa do segundo momento central, a variância.

Se os dados vierem de uma distribuição normal, a estatística JB tem assintoticamente uma distribuição qui-quadrado \((\chi^{2})\) com dois graus de liberdade, portanto a estatística pode ser usada para testar a hipótese de que os dados são de uma distribuição normal.

Esta estatística é simples e seu poder se mostrou comparável a outros testes poderosos. O teste JB Esta programado na função JarqueBeraTest() no pacote DescTools do R_{4.3.2}.

2 Material e Métodos

A simulação Moonte Carlos foi utilizada para simular amostras normais sob a hipótese nula de normalidade, \(H_{0}\), para avaliar as taxas de erro tipo I dos testes e amostras sob a hipótese alternativa \(H_{1}\), ou seja, dados de distribuição não normais para avaliar o poder.

Em cada situação, os testes de normalidade foram aplicados ao nível nominal de significância pré-definido \(\alpha\) com o valor de 0.05.

Se o teste rejeita a hipótese nula e a amostra é da distribuição normal comete-se um erro tipo I e, se não for normal, uma decisão correta foi tomada.

2.1 Simulação e Poder dos Testes

Foram efetuadas \(N=1000\) simulações sob \(H_{0}\) e sob \(H_{1}\). Cada simulação de cada distribuição produziu amostras de tamanho \(n\) e esses valores foram: 10,20,50,100,500 e 1000.

Os teste de normalidade foram aplicados em cada uma da \(N = 1000\) amostras de cada distribuição simulada e a proporção de rejeições corretas da hipótese nula foi computada. Os valores obtidos representam o poder dos testes, que foram comparados entre si.

3 Resultados e Discussões

Os resultados serão apresentados de acordo com as taxas de erro tipo I, na situação de distribuição normal, e poder, na situação de outras distribuições.

3.1 Pacotes Utilizados

library(DistributionTest)
library(moments)
library(nortest)
library(DescTools)
library(fBasics)
library(dplyr)
library(tidyr)
library(ggplot2)
#library(kableExtra)
library(knitr)
library(tinytex)
library(Publish)

3.2 Simulação

# Tamanho de Amostra
Resultados <- NULL
NN <- 10

# Repetição
escopo <- expand.grid(
  tamanho_amostra = seq(25, 30, 5),
  repeticao = seq(1, NN)
)

Resultados <- purrr::map2_dfr(escopo$tamanho_amostra,escopo$repeticao, function(tamanho_amostra, ii){
  print(paste0(tamanho_amostra, "-", ii))
  #x <-rcauchy(tamanho_amostra, 0,1)
  x <-rnorm(tamanho_amostra, 0,1)
  #x <- rgamma(tamanho_amostra, shape = 10, rate = 1/10)
  tibble(
    Kolmogorov_Smirnov = ks.test(x, pnorm, mean(x), sd(x))$p.value,
    Jarque_Bera = JarqueBeraTest(x)$p.value,
    Anderson_Darling = AndersonDarlingTest(x, null = "pnorm", mean(x), sd(x))$p.value,
    Lilliefors = LillieTest(x)$p.value,
    Shapiro_Wilk = shapiro.test(x)$p.value,
    Cramer_Von_Mises = cvm.test(x)$p.value,
    D_Agostino = agostino.test(x)$p.value,
    ZK = zk.test(x, 'norm')$p.value,
    ZC = zc.test(x, 'norm')$p.value,
    ZA = za.test(x, 'norm')$p.value,
    amostra = tamanho_amostra,
    tentativa = ii
  )
}
)
## [1] "25-1"
## [1] "30-1"
## [1] "25-2"
## [1] "30-2"
## [1] "25-3"
## [1] "30-3"
## [1] "25-4"
## [1] "30-4"
## [1] "25-5"
## [1] "30-5"
## [1] "25-6"
## [1] "30-6"
## [1] "25-7"
## [1] "30-7"
## [1] "25-8"
## [1] "30-8"
## [1] "25-9"
## [1] "30-9"
## [1] "25-10"
## [1] "30-10"

3.3 Comparação do P-valor

Resultados |>
  tidyr::pivot_longer(
    names_to = "modelo",
    values_to = "estatistica",
    cols = c(Kolmogorov_Smirnov,
             Jarque_Bera,
             Anderson_Darling,
             Lilliefors,
             Shapiro_Wilk,
             Cramer_Von_Mises,
             D_Agostino,
             ZK,
             ZC,
             ZA))|>
  group_by(amostra, modelo)|>
  summarise(
    minimo = min(estatistica),
    mediana = mean(estatistica),
    maximo = median(estatistica)+sd(estatistica))|>
  ggplot(aes(x = amostra, y = mediana, ymin = minimo, ymax =  maximo, 
             color = modelo))+
  geom_line()+
  geom_jitter()+
  geom_point()+
  ggtitle("Comparação do P-valor Médio")+
  theme_bw()+
  scale_y_continuous(labels = scales::percent, limits = c(0,1))+
  labs(x = "Tamanho Amostral", 
       y = "Erro Tipo I", 
       color = "Tipos de Testes")

3.4 Poder do Teste

A figura 2 Estão apresentados os valores de poder para os oito testes em função do tamanho da amostra n para distribuição gamma.

Resultados |>
  tidyr::pivot_longer(
    names_to = "modelo",
    values_to = "estatistica",
    cols = c(Kolmogorov_Smirnov,
             Jarque_Bera,
             Anderson_Darling,
             Lilliefors,
             Shapiro_Wilk,
             Cramer_Von_Mises,
             D_Agostino,
             ZK,
             ZC,
             ZA))|>
  group_by(amostra, modelo)|>
  summarise(
    minimo = min(estatistica),
    mediana = mean(estatistica < .05),
    maximo = median(estatistica)+sd(estatistica))|>
  ggplot(aes(x = amostra, y = mediana, ymin = minimo, ymax =  maximo, color = modelo))+
  geom_line()+
  geom_jitter()+
  geom_point()+
  ggtitle("Comparação do Poder do Teste", subtitle = "Simulação")+
  theme_bw()+
  scale_y_continuous(labels = scales::percent, limits = c(0,1))+
  labs(x = "Tamanho Amostral", 
       y = "Poder do Teste", 
       color = "Tipos de Testes")

4 Referências Bibliográficas

ANDERSON, T. W.; DARLING, D. A. A test of goodness of t.Journal of AmericanStatistical Association, v.49, p. 765-769, 1954.

D`AGOSTINO, R. B. Transformation to Nomality of the Null Distribution of G1.Biome-trika, v.57, n.3, p.679-681, 1970

Jarque CM, Bera AK (1987). “A Test for Normality of Observations and Regression Residuals.” International Statistical Review. Revue International de Statistique, 55(2), 163–172. doi:10.2307/1403192.

Kolmogorov, A., Sulla determinazione empirica di una legge di distributione, Giornale dell’ Istituto Italiano degli Attuari 4 (1933), 83–91.

LILLIEFORS, H. W. On the Kolmogorov-Smirnov test for normality with mean and vari-ance unknown.Journal of American Statistical Association, v.62, p.534-544, 1967.

SHAPIRO, S. S.; WILK, M. B. An analysis of variance test for normality (complete sam-ples).Biometrika, v.52, p. 591-611, 1965.

Zhang J (2002). “Powerful Goodness-of-Fit Tests Based on the Likelihood Ratio.” Journal of the Royal Statistical Society B, 64(2), 281–294. doi:10.1111/1467-9868.00337.

LS0tDQp0aXRsZTogIioqVGVzdGVzIGRlIEFkZXLDqm5jaWEgbm8gUjogdW0gR3VpYSBQcsOhdGljbyoqIg0KYXV0aG9yOg0KLSBuYW1lOiBNw6FyaW8gRGllZ28gVmFsZW50ZQ0KLSBuYW1lOiBDYXJsb3MgUGFpeMOjbw0KZGF0ZTogImByIGZvcm1hdChTeXMudGltZSgpLCAnJWQgJUIsICVZJylgIg0Kb3V0cHV0Og0KICBodG1sX2RvY3VtZW50OiANCiAgICBjb2RlX2Rvd25sb2FkOiB5ZXMNCiAgICBoaWdobGlnaHQ6IHRleHRtYXRlDQogICAgbnVtYmVyX3NlY3Rpb25zOiB5ZXMNCiAgICB0aGVtZTogY2VydWxlYW4NCiAgICB0b2M6IHllcw0KICAgIHRvY19kZXB0aDogNg0KICAgIHRvY19mbG9hdDoNCiAgICAgIGNvbGxhcHNlZDogeWVzDQogICAgICBzbW9vdGhfc2Nyb2xsOiB5ZXMNCiAgICBrZWVwX21kOiB5ZXMNCiAgcGRmX2RvY3VtZW50Og0KICAgIHRvYzogeWVzDQogICAgdG9jX2RlcHRoOiAnNicNCmluc3RpdHV0ZToNCmFic3RyYWN0OiAiQXR1YWxtZW50ZSwgZXhpc3RlbSB2w6FyaW9zIHRlc3RlcyBkZSBub3JtYWxpZGFkZSBxdWUsIG11aXRhcyB2ZXplcywgcHJvZHV6ZW0gcmVzdWx0YWRvcyBkaWZlcmVudGVzIHBvZGVuZG8gcmVqZWl0YXIgb3UgbsOjbyBhIGhpcMOzdGVzZSBudWxhIGRlIG5vcm1hbGlkYWRlLiBPIG9iamV0aXZvIGRvIHRyYWJhbGhvIGZvaSBhdmFsaWFyIGFzIHRheGFzIGRlIGVycm8gdGlwbyBJIGUgcG9kZXIgZG9zIHRlc3Rlczoga29sbW9nb3Jvdi1TbWlybm92LCBBbmRlcnNvbi1EYXJsaW5nLCBDcmFtZXJfVm9uX01pc2VzLCBEX0Fnb3N0aW5vLCBKYXJxdWVfQmVyYSwgTGlsbGllZm9ycywgU2hhcGlyby1XaWxrLCBaQSwgWkIsIFpLLiINCi0tLQ0KDQoNCmBgYHtyIHNldHVwLCBpbmNsdWRlPUZBTFNFfQ0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KGVjaG8gPSBUUlVFKQ0KYGBgDQoNCg0KDQoNCmBgYHs9aHRtbH0NCjxzdHlsZT4NCmJvZHl7dGV4dC1hbGlnbjoganVzdGlmeX0NCjwvc3R5bGU+DQpgYGANCjo6OiBwcm9ncmVzcw0KOjo6IHsucHJvZ3Jlc3MtYmFyIHN0eWxlPSJ3aWR0aDogMTAwJTsifQ0KOjo6DQo6OjoNCg0KIyAqKlRlc3RlcyBkZSBBZGVyw6puY2lhIC0gQ2FzbyBOb3JtYWwqKg0KIyMgKipBc3BlY3RvcyBIaXN0w7NyaWNvcyoqDQoNCk9zIHByaW5jaXBhaXMgdGVzdGVzIGVzdGF0w61zdGljb3MgZW1wcmVnYWRvcyBuYSBhbsOhbGlzZSBkZSBkYWRvcyBjbMOtbmljb3MgZSBleHBlcmltZW50YWlzIHPDo28gYmFzZWFkb3MgZW0gbW9kZWxvcyB0ZcOzcmljb3MgcXVlIHByZXNzdXDDtWVtIGEgKipEaXN0cmlidWnDp8OjbyBOb3JtYWwqKiBkb3MgZGFkb3MgYW1vc3RyYWlzIChNSU9ULCAyMDE3KS4NCg0KUG9yw6ltLCB0YWwgc3Vwb3Npw6fDo28gw6ksIG11aXRhcyB2ZXplcywgZGVpeGFkYSBkZSBsYWRvIHBvciBwcm9maXNzaW9uYWlzLCBwb3IgZGl2ZXJzb3MgbW90aXZvczoNCg0KLSAgIEVzcXVlY2ltZW50bzsNCi0gICBGYWx0YSBkZSBDb25oZWNpbWVudG87DQotICAgRGVzY29uaGVjaW1lbnRvIGRlIHF1YWwgbyBNZWxob3IgTcOpdG9kbzsNCg0KQXNzaW0sIE8gb2JqZXRpdm8gZG8gdHJhYmFsaG8gZm9pIGFuYWxpc2FyIG8gZGVzZW1wZW5obyBkb3MgcHJpbmNpcGFpcyB0ZXN0ZSBkZSBub3JtYWxpZGFkZSBpbXBsZW1lbnRhZG9zIG5vIFNvZnR3YXJlIEVzdGF0w61zdGljbyAkUl97KDQuMyl9JCBwYXJhIGRlY2lkaXIgcXVhaXMgYXByZXNlbnRhbSBvIG1lbGhvciBkZXNlbXBlbmhvIGFvIHJlc3BvbmRlciBzZSBvcyBkYWRvcyBwb2RlbSBzZXIgY29uc2lkZXJhZG9zIG5vcm1haXMuDQoNCg0KDQo6OjogcHJvZ3Jlc3MNCjo6OiB7LnByb2dyZXNzLWJhciBzdHlsZT0id2lkdGg6IDEwMCU7In0NCjo6Og0KOjo6DQoNCg0KDQoNCiMjICoqVGVzdGUgZGUgS29sbW9nb3Jvdi1TbWlybm92KioNCg0Kw4ggdW0gdGVzdGUgbsOjbyBwYXJhbcOpdHJpY28gZGUgYm9uZGFkZSBkbyBhanVzdGUgc29icmUgYSBpZ3VhbGRhZGUgZGUgZGlzdHJpYnVpw6fDtWVzIGRlIHByb2JhYmlsaWRhZGUgY29udMOtbnVhcyBlIHVuaWRpbWVuc2lvbmFpcyBxdWUgcG9kZSBzZXIgdXNhZG8gcGFyYSBjb21wYXJhciB1bWEgYW1vc3RyYSBjb20gdW1hIGRpc3RyaWJ1acOnw6NvIGRlIHByb2JhYmlsaWRhZGUgZGUgcmVmZXLDqm5jaWEuDQoNCk8gbm9tZSDDqSB1bWEgcmVmZXLDqm5jaWEgYXNvIG1hdGVtw6F0aWNvcyBydXNzb3MgKipBbmRyZWkgTmlrb2xhZXZpY2ggS29sbW9nb3JvdioqIGUgKipOaWtvbGFpIFZhc2lseWV2aWNoIFNtaXJub3YqKi4gQSBlc3RhdMOtc3RpY2EgZGUgS29sbW9nb3Jvdi0tU21pcm5vdiBxdWFudGlmaWNhIGEgZGlzdMOibmNpYSBlbnRyZSBhIGZ1bsOnw6NvIGRpc3RyaWJ1acOnw6NvIGVtcMOtcmljYSBkYSBhbW9zdHJhIGUgYSBmdW7Dp8OjbyBkaXN0cmlidWnDp8OjbyBhY3VtdWxhZGEgZGEgZGlzdHJpYnVpw6fDo28gZGUgcmVmZXLDqm5jaWEuDQoNCk8gdGVzdGUgZGUgS29sbW9nb3Jvdi1TbWlybm92IHBvZGUgc2VyIG1vZGlmaWNhZG8gcGFyYSBzZXJ2aXIgY29tbyB1bSB0ZXN0ZSBkYSBxdWFsaWRhZGUgZG8gYWp1c3RlLiBObyBjYXNvIGVzcGVjaWFsIGRvIHRlc3RlIGRhIG5vcm1hbGlkYWRlIGRhIGRpc3RyaWJ1acOnw6NvLCBhcyBhbW9zdHJhcyBzw6NvIHBhZHJvbml6YWRhcyBlIGNvbXBhcmFkYXMgY29tIHVtYSBkaXN0cmlidWnDp8OjbyBub3JtYWwgcGFkcsOjby4NCg0KOjo6IHByb2dyZXNzDQo6Ojogey5wcm9ncmVzcy1iYXIgc3R5bGU9IndpZHRoOiAxMDAlOyJ9DQo6OjoNCjo6Og0KDQojIyMgKipBbmRyZWkgTmlrb2xhZXZpY2ggS29sbW9nb3JvdioqICFbXShpbWFnZXMvS29sbW9nb3Jvdi5qcGVnKXt3aWR0aD0iMzIiIGhlaWdodD0iNDcifQ0KDQpLb2xtb2dvcm92IG5hc2NldSBlbSAyNSBhZGUgYWJyaWwgZGUgMTkwMyBlbSBUYW1ib3YsIG5hIGNpZGFkZSBkZSBNb3Njb3UuIEZvaSB1bSBtYXRlbXTDoXRpY28gUnVzc28sIHBhcnRpY2lwb3UgZGFzIG1haW9yZXMgZGVzY29iZXJ0YXMgY2llbnTDrWZpY2FzIGRvIHPDqWN1bG8gWFgsIG5hcyDDoXJlYXMgZGUgUHJvYmFiaWxpZGFkZSBlIEVzdGF0w61zdGljYSwgZSBlbSBUZW9yaWEgZGEgSW5mb3JtYcOnw6NvLg0KDQpFbSwgMTkzMyBLb2xtb2dvcm92IGVzdGFiZWxlY2V1IGEgZGVmaW5pw6fDo28gZGUgcHJvYmFiaWxpZGFkZSBwb3IgQXhpb21hdGl6YcOnw6NvLCBuYSBzdWEgb2JyYSBpbnRpdHVsYWRhIFwqXCpGb3VuZGF0aW9ucyBvZiBUaGVvcnkgb2YgUHJvYmFiaWxpdHlcKi4gRm9pIGNvbSBiYXNlIG5hcyBwcm9wcmllZGFkZXMgZGFzIGZyZXF1w6puY2lhcyByZWxhdGl2YXMgZSBkYXMgb3BlcmHDp8O1ZXMgc29icmUgY29uanVudG9zIHF1ZSBLb2xtb2dvcm92IGNvbmNlYmV1IGEgcHJpbWVpcmEgY29uc3RydcOnw6NvIEF4aW9tw6F0aWNhIEdlcmFsIHBhcmEgYSBUZW9yaWEgZGFzIFByb2JhYmlsaWRhZGVzLg0KDQpDb25zaWRlcmFkbyB1bSBkb3MgZ3JhbmRlcyBjaWVudGlzdGEgZW0gc3VhIMOpcG9jYSwgS29sbW9nb3JvdiBmb2kgYWdyYWNpYWRvIHBvciBkaXZlcnNhcyBob25yYXJpYXMgYW8gbG9uZ28gZGUgc3VhIGNhcnJlaXJhOg0KDQotICAgUHLDqm1pbyBMZW5pbiBlbSAxOTQxOw0KLSAgIFByw6ptaW8gQmFsemFuIGVtIDE5NjI7DQotICAgTWVkYWxoYSBIZWxtaG9sdHogZW0gMTk1Ow0KLSAgIFByw6ptaW8gV29sZiBkZSBNYXRlbcOhdGljYSBlbSAxOTgwOw0KLSAgIE1lZGFsaGEgTG9iYWNoZXZza3kgZW0gMTk4NjsNCg0KIyMjICoqTmlrb2xhaSBWYXNpbHlldmljaCBTbWlybm92KiohW10oaW1hZ2VzL05pa29sYWlfU21pcm5vdi5qcGcpe3dpZHRoPSIzMiIgaGVpZ2h0PSI0MiJ9DQoNClNuaXJub3YgbmFzY2V1IGVtIGVtIDE3IGRlIG91dHVicm8gZGUgMTkwMCwgZW0gTW9zY291LCBuYSBmYW3DrWxpYSBkZSB1bSBlc2NyaXbDo28gZGUgaWdyZWphIHF1ZSB0YW1iw6ltIHRyYWJhbGhhdmEgY29tbyBlc2NyaXR1csOhcmlvIG5vIGVzY3JpdMOzcmlvIGRvIFRlYXRybyBCb2xzaG9pIC4gRWxlIGNvbXBsZXRvdSBzZXVzIGVzdHVkb3MgZGUgZ2luw6FzaW8gZHVyYW50ZSBhIFByaW1laXJhIEd1ZXJyYSBNdW5kaWFsICwgZHVyYW50ZSBhIHF1YWwgc2Vydml1IGVtIHbDoXJpYXMgdW5pZGFkZXMgbcOpZGljYXMgZG8gZXjDqXJjaXRvLiBGb2kgdW0gbWF0ZW3DoXRpY28gcnVzc28gc292acOpdGljbyBjb25oZWNpZG8gcG9yIHNldSB0cmFiYWxobyBlbSB2w6FyaW9zIGNhbXBvcywgaW5jbHVpbmRvIHRlb3JpYSBkZSBwcm9iYWJpbGlkYWRlIGUgZXN0YXTDrXN0aWNhLg0KDQpTbWlybm92IGZvcm1vdS1zZSBuYSBGYWN1bGRhZGUgZGUgRsOtc2ljYSBlIE1hdGVtw6F0aWNhIGRhIFVuaXZlcnNpZGFkZSBFc3RhZHVhbCBkZSBNb3Njb3UgZSwgYSBwYXJ0aXIgZGUgMTkyNiwgZW5zaW5vdSBtYXRlbcOhdGljYSBwb3IgbXVpdG9zIGFub3MgbmEgQWNhZGVtaWEgQWdyw61jb2xhIFRpbWlyeWF6ZXYuDQoNClNtaXJub3YgcmVjZWJldSBvIFByw6ptaW8gZGUgRXN0YWRvIGRhIFVSU1MgZW0gMTk1MS4gRW0gMTk1MyBmb2kgYWdyYWNpYWRvIGNvbSBhIE9yZGVtIGRhIEJhbmRlaXJhIFZlcm1lbGhhIGRvIFRyYWJhbGhvLg0KDQo6OjogcHJvZ3Jlc3MNCjo6OiB7LnByb2dyZXNzLWJhciBzdHlsZT0id2lkdGg6IDEwMCU7In0NCjo6Og0KOjo6DQoNCiMjIyAqKkVzdGF0w61zdGljYSBkbyBUZXN0ZSoqDQoNCkEgZnVuw6fDo28gZGlzdHJpYnVpw6fDo28gZW1ww61yaWNhICRGX3tufSQgcGFyYSBuIG9ic2VydmHDp8O1ZXMgJFhfe2l9JCBpbmRlcGVuZGVudGVzIGUgaWRlbnRpY2FtZW50ZSBkaXN0cmlidcOtZGFzIMOpIGRlZmluaWRhIGNvbW86DQoNCiQkIEZfe259KHgpID0gXGZyYWN7MX17bn0gXHN1bV97aT0xfV57bn0gSV97Wy0gXGluZnR5LHhdfShYX3tpfSkgJCQNCg0KRW0gcXVlICRJX3soLVxpbmZ0eSx4KX1YX3tpfSQgw6kgYSBmdW7Dp8OjbyBpbmRpY2Fkb3JhLCBpZ3VhbCBhIDEgc2UgJFhfe2l9IFxsZXEgeCQgZSBpZ3VhbCBhIDAgZGUgb3V0cm8gbW9kby4NCg0KQSBlc3RhdMOtc3RpY2EgZGUgS29sbW9nb3Jvdi0tU21pcm5vdiBwYXJhIHVtYSBkYWRhIGZ1bsOnw6NvIGRpc3RyaWJ1acOnw6NvIGFjdW11bGFkYSAkRihYKSQNCg0KJCQgRF97bn0gPSBcZGlzcGxheXN0eWxlIFxzdXBfe3h9IFwgfEZfe259KHgpIC0gRih4KXwkJA0KDQplbSBxdWUgJFxkaXNwbGF5c3R5bGUgXHN1cF97eH0kIMOpIG8gc3VwcmVtbyBkbyBjb25qdW50byBkZSBkaXN0w6JuY2lhcy4gUGVsbyAqKlRlb3JlbWEgZGUgR2xpdmVua28tLUNhbnRlbGxpKiosIHNlIGEgYW1vc3RyYSB2aWVyIGRhIGRpc3RyaWJ1acOnw6NvICRGKFgpJCBlbnRhbyAkRF97bn0kIGNvbnZlcmdlIGEgMCBxdWFzZSBjZXJ0YW1lbnRlIG5vIGxpbWl0ZSBxdWFuZG8gbiB2YWkgYW8gaW5maW5pdG8uDQoNCg0KIyMjIyAqKkZ1bsOnw6NvIGRlIERpc3RyaWJ1acOnw6NvIEVtcMOtcmljYSoqDQoNCk5hIGZpZ3VyYSBhYmFpeG8gbW9zdHJhLXNlIMOgIGZ1bsOnw6NvIGRlIGRpc3RyaWJ1acOnw6NvIGVtcMOtcmljYSBjb3JyZXNwb25kZW50ZSDDoCBhbW9zdHJhIG9idGlkYSBkYSBkaXN0cmlidWnDp8OjbyBOb3JtYWwgUGFkcsOjbyAoMCwxKSBlbnF1YW50cm8gYSBjdXJ2YSB2ZXJtZWxoYSBjb3JyZXNwb25kZSDDoCBkaXN0cml1acOnw6NvIHRlw7NyaWNhIHJlc3BlY3RpdmEuDQoNCg0KYGBge3J9DQpzZXQuc2VlZCgxODM0MCkNCnggPSBybm9ybSg1MCkNCnBhcihtYXI9Yyg0LDIsMSwxKSkNCnBsb3QoZWNkZih4KSwgDQogICAgIHhsaW0gPSByYW5nZShjKC0zLCAzKSksIA0KICAgICBtYWluID0gIiIsIA0KICAgICB5bGFiPSIiKQ0KdGV4dCgwLDAuOCxleHByZXNzaW9uKEZbbl0oeCkpKQ0KY3VydmUocG5vcm0oeCksIA0KICAgICAgYWRkID0gVFJVRSwgDQogICAgICBjb2wgPSAicmVkIiwgDQogICAgICBsd2QgPSAyKQ0KcnVnKHgpDQpgYGANCg0KDQoNCg0KDQojIyMgKipIaXDDs3Rlc2VzIGRvIFRlc3RlKioNCg0KQXMgSGlww7N0ZXNlcyBkbyB0ZXN0ZSBkZSBrb2xtb2dvcm92LXNtaXJub3Ygc8OjbzoNCg0KJCQNCkhfezB9OiBhIFwgZGlmZXJlbsOnYSBcIGVudHJlIFwgZnJlcXXDqm5jaWFzIFwgb2JzZXJ2YWRhcyBcIGUgXCBlc3BlcmFkYXMgXCDDqSBcIHBlcXVlbmEgXCBvdSBcICBGX3swfShYKSAtIFNfe259KFgpIFxhcHByb3ggMC4gICAgXFwgDQpIX3sxfTogQ2FzbyBcIENvbnRyw6FyaW8uDQokJA0KDQojIyMgKipOw612ZWwgZGUgU2lnbmlmaWPDom5jaWEgZG8gVGVzdGUqKg0KDQpFc2NvbGhhIGRlIHVtIG7DrXZlbCBkZSBhICRcYWxwaGEgPSAwLjA1JCBvdSAkXGFscGhhID0gMC4wMSQsIHNlbmRvIHRlc3RlIGRlIG5hdHVyZXphIGJpY2F1ZGFsLg0KDQojIyMgKipSZWdyYSBkZSBEZWNpc8OjbyBkbyBUZXN0ZSoqDQoNCk9ic2VydmFuZG8gbyAkcC12YWxvciQgbWFpb3IgcXVlICQwLjA1JCwgY29uY2x1w60tc2UgcXVlICRcdGV4dGJme07Do299JCBow6EgZXZpZMOqbmNpYXMgcGFyYSBSZWplaXRhciAkSF97MH0kLCBjYXNvIGNvbnRyw6FyaW8sIHNlIG8gJHAtdmFsb3IkIHNlamEgbWVub3IgcXVlICQwLjA1JC4NCg0KDQoNCk8gdGVzdGUgZGUga29sbW9nb3Jvdi1zbWlybm92IHBvZGUgc2VyIGFwbGljYWRvIHV0aWxpemFuZG8gYSBmdW7Dp8OjbyAqKmtzLnRlc3QoKSoqIGRvICoqcGFjb3RlIHN0YXRzKiogZG8gc29mdHdhcmUgKipSXF97NC4zLjJ9KiogdmVyc8OjbyB3aW5kb3dzLg0KDQoNCjo6OiBwcm9ncmVzcw0KOjo6IHsucHJvZ3Jlc3MtYmFyIHN0eWxlPSJ3aWR0aDogMTAwJTsifQ0KOjo6DQo6OjoNCg0KDQoNCiMjICoqVGVzdGUgZGUgU2hhcGlyby1XaWxrKioNCg0Kw4ggdW0gdGVzdGUgZGUgbm9ybWFsaWRhZGUgcHVibGljYWRvIGVtIDE5NjUgcG9yICoqU2FtdWVsIFNhbmZvcmQgU2hhcGlybyoqIGUgKipNYXJ0aW4gV2lsayoqIGUgc2UgYmFzZWlhIG5hIHJlZ3Jlc3PDo28gZG9zIHZhbG9yZXMgYW1vc3RyYWlzIG9yZGVuYWRvcyBjb20gYXMgY29ycmVzcG9uZGVudGVzIGVzdGF0w61zdGljYXMgZGUgc2VpcyBvcmRlbnMgbm9ybWFpcyBxdWUsIHBhcmEgdW1hIGFtb3N0cmEgZGUgdW1hIHBvcHVsYcOnw6NvIG5vcm1hbG1lbnRlIGRpc3RyaWJ1w61kYSwgw6kgbGluZWFyIChST1lTVE9OLCAxOTgyKS4NCg0KIyMjICoqU2FtdWVsIFNhbmZvcmQgU2hhcGlybyoqICFbXShpbWFnZXMvc2hhcGlyby5qcGcpe3dpZHRoPSIzMiJ9DQoNClNhbXVlbCBuYXNjZXUgbmEgY2lkYWRlIGRlIE5vdmEgWW9yayAsIFNoYXBpcm8gZm9ybW91LXNlIGVtIGVzdGF0w61zdGljYSBubyAqKkNpdHkgQ29sbGVnZSBvZiBOZXcgWW9yayoqIGVtIDE5NTIsIGUgZmV6IG1lc3RyYWRvIGVtIGVuZ2VuaGFyaWEgaW5kdXN0cmlhbCBuYSAqKlVuaXZlcnNpZGFkZSBkZSBDb2x1bWJpYSoqIGVtIDE5NTQuIEVsZSBzZXJ2aXUgYnJldmVtZW50ZSBjb21vIGVzdGF0w61zdGljbyBubyBDb3JwbyBRdcOtbWljbyBkbyBFeMOpcmNpdG8gZG9zIEVVQSwgYW50ZXMgZGUgb2J0ZXIgdW0gbWVzdHJhZG8gKDE5NjApIGUgdW0gZG91dG9yYWRvICgxOTYzKSBlbSBlc3RhdMOtc3RpY2EgbmEgKipSdXRnZXJzIFVuaXZlcnNpdHkqKi4gRW0gMTk3MiBpbmdyZXNzb3Ugbm8gY29ycG8gZG9jZW50ZSBkYSAqKkZsb3JpZGEgSW50ZXJuYXRpb25hbCBVbml2ZXJzaXR5KiouDQoNCiMjIyAqKk1hcnRpbiBCcmFkYnVyeSBXaWxrKiogIVtdKGltYWdlcy9NYXJ0aW5fV2lsay5qcGcpe3dpZHRoPSIzMiJ9DQoNCk1hcnRpbiBuYXNjZXUgZW0gTW9udHJlYWwsIFF1ZWJlYywgZWxlIHJlY2ViZXUgbyBkaXBsb21hIGRlIGJhY2hhcmVsIGVtIGVuZ2VuaGFyaWEgcXXDrW1pY2EgcGVsYSAqKlVuaXZlcnNpZGFkZSBNY0dpbGwqKiBlbSAxOTQ1LiBEdXJhbnRlIG8gcGVyw61vZG8gZGUgMTk1MSBhIDE5NTUsIG9idGV2ZSBvIHTDrXR1bG8gZGUgbWVzdHJhZG8gZSBkb3V0b3JhZG8gZW0gZXN0YXTDrXN0aWNhIHBlbGEgKipJb3dhIFN0YXRlIFVuaXZlcnNpdHkqKi4NCg0KTyB0ZXN0ZSBkZSBTaGFwaXJvLVdpbGsgdGVzdGEgYSBoaXDDs3Rlc2UgbnVsYSBkZSBxdWUgdW1hIGFtb3N0cmEgJHhfezF9LCBcbGRvdHMsIHhfe259JCB2ZWlvIGRlIHVtYSBwb3B1bGHDp8OjbyBub3JtYWxtZW50ZSBkaXN0cmlidcOtZGEuIEEgZXN0YXTDrXN0aWNhIGRlIHRlc3RlIMOpOg0KDQokJCBXID0gXGZyYWN7KFxzdW1fe2k9MX1ee259IGFfe2l9eF97aX0pXnsyfX17XHN1bV97aT0xfV57bn0oeF97aX0tXGJhcnt4fSleezJ9fSQkDQoNCk8gdGVzdGUgZGUgc2hhcGlyby13aWxrIHBvZGUgc2VyIGFwbGljYWRvIHV0aWxpemFuZG8gYSBmdW7Dp8OjbyAqKnNoYXBpcm8udGVzdCgpKiogZG8gKipwYWNvdGUgc3RhdHMqKiBkbyBzb2Z0d2FyZSAqKlJcX3s0LjMuMn0qKiB2ZXJzw6NvIHdpbmRvd3MuDQoNCjo6OiBwcm9ncmVzcw0KOjo6IHsucHJvZ3Jlc3MtYmFyIHN0eWxlPSJ3aWR0aDogMTAwJTsifQ0KOjo6DQo6OjoNCg0KIyMgKipUZXN0ZSBkZSBKYXJxdWUtQmVyYSoqIA0KDQrDiCB1bSB0ZXN0ZSBkZSBxdWFsaWRhZGUgZGUgYWp1c3RlIHBhcmEgdmVyaWZpY2FyIHNlIG9zIGRhZG9zIGRhIGFtb3N0cmEgdMOqbSBhc3NpbWV0cmlhIGUgY3VydG9zZSBjb3JyZXNwb25kZW50ZXMgYSB1bWEgZGlzdHJpYnVpw6fDo28gbm9ybWFsIC4gQSBwcm92YSBsZXZhIG8gbm9tZSBkZSAqKkNhcmxvcyBNLiBKYXJxdWUgVXJpYmUqKiBlICoqQW5pbCBLLiBCZXJhKiouIEEgZXN0YXTDrXN0aWNhIGRlIHRlc3RlIMOpIHNlbXByZSBuw6NvIG5lZ2F0aXZhLiBTZSBlc3RpdmVyIGxvbmdlIGRlIHplcm8sIHNpbmFsaXphIHF1ZSBvcyBkYWRvcyBuw6NvIHTDqm0gZGlzdHJpYnVpw6fDo28gbm9ybWFsLg0KDQoNCiMjIyAqKkNhcmxvcyBNLiBKYXJxdWUgVXJpYmUqKiAhW10oaW1hZ2VzL0phcnF1ZV9VcmliZS5qcGcpe3dpZHRoPSIzMiIgaGVpZ2h0PSI0MiJ9DQoNCkNhcmxvcyBKYXJxdWUgKG5hc2NpZG8gZW0gMTggZGUgb3V0dWJybyBkZSAxOTU0IG5hIENpZGFkZSBkbyBNw6l4aWNvKSDDqSB1bSBlY29ub21pc3RhIG1leGljYW5vLCBhdHVhbG1lbnRlIERpcmV0b3IgRXhlY3V0aXZvIGRhIEFtw6lyaWNhIE3Ds3ZpbCBlIE1lbWJybyBkbyBDb25zZWxobyBkbyBHcnVwbyBMw61kZXIgR2xvYmFsIGVtIFNlcnZpw6dvcyBhbyBDaWRhZMOjbyBGQ0MgKEZvbWVudG8gZGUgQ29uc3RydWNjaW9uZXMgeSBDb250cmF0YXMpLiBUZXZlIHVtYSBjYXJyZWlyYSBkZXN0YWNhZGEgbm8gc2VjdG9yIHByaXZhZG8sIG5hIGZ1bsOnw6NvIHDDumJsaWNhIChuYWNpb25hbCBlIG11bHRpbGF0ZXJhbCkgZSBubyBtdW5kbyBhY2Fkw6ltaWNvLg0KDQpKYXJxdWUgw6kgZm9ybWFkbyBlbSBDacOqbmNpYXMgQXR1YXJpYWlzIHBlbGEgKipVbml2ZXJzaWRhZGUgQW5haHVhYyoqLCBuYSBDaWRhZGUgZG8gTcOpeGljby4gRWxlIHRlbSBQw7NzLUdyYWR1YcOnw6NvIGVtIEVzdGF0w61zdGljYSBlIE1lc3RyYWRvIGVtIEVjb25vbWV0cmlhIHBlbGEgKipMb25kb24gU2Nob29sIG9mIEVjb25vbWljcyoqOyBDZXJ0aWZpY2FkbyBkZSBQw7NzLUdyYWR1YcOnw6NvIGVtIFBvbMOtdGljYSBFY29uw7RtaWNhIGUgUGxhbmVhbWVudG8gVXJiYW5vIGUgUmVnaW9uYWwgcGVsYSBVbml2ZXJzaWRhZGUgZGUgT3NsbzsgRG91dG9yYWRvIGVtIEVjb25vbWlhIChQaC5EKSBwZWxhICoqQXVzdHJhbGlhbiBOYXRpb25hbCBVbml2ZXJzaXR5Kio7IGUgcMOzcy1kb3V0b3JhZG8gZW0gRWNvbm9taWEgcGVsYSAqKlVuaXZlcnNpZGFkZSBkZSBIYXJ2YXJkKiouDQoNCg0KIyMjICoqQW5pbCBLLiBCZXJhKiogIVtdKGltYWdlcy9CZXJhLmpwZyl7d2lkdGg9IjMyIiBoZWlnaHQ9IjMyIn0NCg0KQW5pbCBLLiBCZXJhIChuYXNjaWRvIGVtIDE5NTUpIMOpIHVtIGVjb25vbWV0cmlzdGEgaW5kaWFuby1hbWVyaWNhbm8uIEVsZSDDqSBwcm9mZXNzb3IgZGUgRWNvbm9taWEgbmEgKipVbml2ZXJzaWRhZGUgZGUgSWxsaW5vaXMqKiBubyBEZXBhcnRhbWVudG8gZGUgRWNvbm9taWEgZGUgVXJiYW5hIC0tIENoYW1wYWlnbi4NCg0KQmVyYSBuYXNjZXUgZW0gdW1hIHJlbW90YSB2aWxhIGRlIFBhc2NoaW1jaGFrLCBCZW5nYWxhIE9jaWRlbnRhbCAsIMONbmRpYS4gU2V1IHBhaSBlcmEgdW0gbcOpZGljbyBxdWUgbsOjbyBjb2JyYXZhIGhvbm9yw6FyaW9zIGZvcm1haXMgZGUgc2V1cyBwYWNpZW50ZXMgZSBkZXBlbmRpYSBkZSBjb250cmlidWnDp8O1ZXMgdm9sdW50w6FyaWFzLg0KDQpCZXJhIHJlY2ViZXUgdW0gQmFjaGFyZWxhZG8gZGEgVW5pdmVyc2lkYWRlIGRlIENhbGN1dMOhIGVtIDE5NzUgZW0gRXN0YXTDrXN0aWNhLCBtZXN0cmFkbyBwZWxvIEluZGlhbiBTdGF0aXN0aWNhbCBJbnN0aXR1dGUgZW0gMTk3NyBlbSBFY29ub21ldHJpYSBlIFBsYW5lamFtZW50byAoUHJpbWVpcmEgQ2xhc3NlKSBlIGRvdXRvcmFkby4gZW0gMTk4MyBwZWxhIEF1c3RyYWxpYW4gTmF0aW9uYWwgVW5pdmVyc2l0eSAoUGhkIEFzcGVjdHMgb2YgRWNvbm9tZXRyaWMgTW9kZWxpbmcpLg0KDQpBIGVzdGF0w61zdGljYSBkbyB0ZXN0ZSBkZSBKYXJxdWUtQmVyIMOpIGRlZmluaWRhIGNvbW86DQoNCiQkIEpCID0gXGZyYWN7bn17Nn0gKFNeezJ9ICsgXGZyYWN7MX17NH0rKEstMyleezJ9KSAkJA0KDQpvbmRlIG4gw6kgbyBuw7ptZXJvIGRlIG9ic2VydmHDp8O1ZXMob3UgZ3JhdXMgZGUgbGliZXJkYWRlIGVtIGdlcmFsKTsgUyDDqSBhIGFzc2ltZXRyaWEgZGEgYW1vc3RyYTsgSyDDqSBhIGN1cnRvc2UgZGEgYW1vc3RyYToNCg0KJCRTPVxmcmFje1xoYXR7XG11X3szfX19e1xoYXR7XHNpZ21hXnszfX19ID0gXGZyYWN7XGZyYWN7MX17bn0gXHN1bV97aT0xfV57bn0gKHhfe2l9LVxiYXJ7eH0pXnszfX17XGZyYWN7MX17bn0gXHN1bV97aT0xfV57bn0gKHhfe2l9LVxiYXJ7eH0pXnsyfSlee1xmcmFjezN9ezJ9fX0kJCBlDQoNCiQkIEsgPSBcZnJhY3tcaGF0e1xtdV97NH19fXtcaGF0e1xzaWdtYV57NH19fSA9IFxmcmFje1xmcmFjezF9e259IFxzdW1fe2k9MX1ee259ICh4X3tpfS1cYmFye3h9KV57NH19e1xmcmFjezF9e259IFxzdW1fe2k9MX1ee259ICh4X3tpfS1cYmFye3h9KV57Mn19JCQNCg0Kb25kZSAkXGhhdHtcbXVfezN9fSQgZSAkXGhhdHtcbXVfezR9fSQgc8OjbyBhcyBlc3RpbWF0aXZhcyBkbyB0ZXJjZWlybyBlIHF1YXJ0byBtb21lbnRvcyBjZW50cmFpcywgcmVzcGVjdGl2YW1lbnRlLCAkXGJhcnt4fSQgw6kgYSBtw6lkaWEgYW1vc3RyYWwgZSAkXGhhdHtcc2lnbWF9XnsyfSQgw6kgYSBlc3RpbWF0aXZhIGRvIHNlZ3VuZG8gbW9tZW50byBjZW50cmFsLCBhIHZhcmnDom5jaWEuDQoNClNlIG9zIGRhZG9zIHZpZXJlbSBkZSB1bWEgZGlzdHJpYnVpw6fDo28gbm9ybWFsLCBhIGVzdGF0w61zdGljYSBKQiB0ZW0gYXNzaW50b3RpY2FtZW50ZSB1bWEgZGlzdHJpYnVpw6fDo28gcXVpLXF1YWRyYWRvICQoXGNoaV57Mn0pJCBjb20gZG9pcyBncmF1cyBkZSBsaWJlcmRhZGUsIHBvcnRhbnRvIGEgZXN0YXTDrXN0aWNhIHBvZGUgc2VyIHVzYWRhIHBhcmEgdGVzdGFyIGEgaGlww7N0ZXNlIGRlIHF1ZSBvcyBkYWRvcyBzw6NvIGRlIHVtYSBkaXN0cmlidWnDp8OjbyBub3JtYWwuDQoNCkVzdGEgZXN0YXTDrXN0aWNhIMOpIHNpbXBsZXMgZSBzZXUgcG9kZXIgc2UgbW9zdHJvdSBjb21wYXLDoXZlbCBhIG91dHJvcyB0ZXN0ZXMgcG9kZXJvc29zLiBPIHRlc3RlIEpCIEVzdGEgcHJvZ3JhbWFkbyBuYSBmdW7Dp8OjbyAqKkphcnF1ZUJlcmFUZXN0KCkqKiBubyAqKnBhY290ZSBEZXNjVG9vbHMqKiBkbyAqKlJcX3s0LjMuMn0qKi4NCg0KOjo6IHByb2dyZXNzDQo6Ojogey5wcm9ncmVzcy1iYXIgc3R5bGU9IndpZHRoOiAxMDAlOyJ9DQo6OjoNCjo6Og0KDQojICoqTWF0ZXJpYWwgZSBNw6l0b2RvcyoqDQoNCkEgc2ltdWxhw6fDo28gTW9vbnRlIENhcmxvcyBmb2kgdXRpbGl6YWRhIHBhcmEgc2ltdWxhciBhbW9zdHJhcyBub3JtYWlzIHNvYiBhIGhpcMOzdGVzZSBudWxhIGRlIG5vcm1hbGlkYWRlLCAkSF97MH0kLCBwYXJhIGF2YWxpYXIgYXMgdGF4YXMgZGUgZXJybyB0aXBvIEkgZG9zIHRlc3RlcyBlIGFtb3N0cmFzIHNvYiBhIGhpcMOzdGVzZSBhbHRlcm5hdGl2YSAkSF97MX0kLCBvdSBzZWphLCBkYWRvcyBkZSBkaXN0cmlidWnDp8OjbyBuw6NvIG5vcm1haXMgcGFyYSBhdmFsaWFyIG8gcG9kZXIuDQoNCkVtIGNhZGEgc2l0dWHDp8Ojbywgb3MgdGVzdGVzIGRlIG5vcm1hbGlkYWRlIGZvcmFtIGFwbGljYWRvcyBhbyBuw612ZWwgbm9taW5hbCBkZSBzaWduaWZpY8OibmNpYSBwcsOpLWRlZmluaWRvICRcYWxwaGEkIGNvbSBvIHZhbG9yIGRlIDAuMDUuDQoNClNlIG8gdGVzdGUgcmVqZWl0YSBhIGhpcMOzdGVzZSBudWxhIGUgYSBhbW9zdHJhIMOpIGRhIGRpc3RyaWJ1acOnw6NvIG5vcm1hbCBjb21ldGUtc2UgdW0gZXJybyB0aXBvIEkgZSwgc2UgbsOjbyBmb3Igbm9ybWFsLCB1bWEgZGVjaXPDo28gY29ycmV0YSBmb2kgdG9tYWRhLg0KDQojIyAqKlNpbXVsYcOnw6NvIGUgUG9kZXIgZG9zIFRlc3RlcyoqDQoNCkZvcmFtIGVmZXR1YWRhcyAkTj0xMDAwJCBzaW11bGHDp8O1ZXMgc29iICRIX3swfSQgZSBzb2IgJEhfezF9JC4gQ2FkYSBzaW11bGHDp8OjbyBkZSBjYWRhIGRpc3RyaWJ1acOnw6NvIHByb2R1eml1IGFtb3N0cmFzIGRlIHRhbWFuaG8gJG4kIGUgZXNzZXMgdmFsb3JlcyBmb3JhbTogMTAsMjAsNTAsMTAwLDUwMCBlIDEwMDAuDQoNCk9zIHRlc3RlIGRlIG5vcm1hbGlkYWRlIGZvcmFtIGFwbGljYWRvcyBlbSBjYWRhIHVtYSBkYSAkTiA9IDEwMDAkIGFtb3N0cmFzIGRlIGNhZGEgZGlzdHJpYnVpw6fDo28gc2ltdWxhZGEgZSBhIHByb3BvcsOnw6NvIGRlIHJlamVpw6fDtWVzIGNvcnJldGFzIGRhIGhpcMOzdGVzZSBudWxhIGZvaSBjb21wdXRhZGEuIE9zIHZhbG9yZXMgb2J0aWRvcyByZXByZXNlbnRhbSBvIHBvZGVyIGRvcyB0ZXN0ZXMsIHF1ZSBmb3JhbSBjb21wYXJhZG9zIGVudHJlIHNpLg0KDQo6OjogcHJvZ3Jlc3MNCjo6OiB7LnByb2dyZXNzLWJhciBzdHlsZT0id2lkdGg6IDEwMCU7In0NCjo6Og0KOjo6DQoNCiMgKipSZXN1bHRhZG9zIGUgRGlzY3Vzc8O1ZXMqKg0KDQpPcyByZXN1bHRhZG9zIHNlcsOjbyBhcHJlc2VudGFkb3MgZGUgYWNvcmRvIGNvbSBhcyB0YXhhcyBkZSBlcnJvIHRpcG8gSSwgbmEgc2l0dWHDp8OjbyBkZSBkaXN0cmlidWnDp8OjbyBub3JtYWwsIGUgcG9kZXIsIG5hIHNpdHVhw6fDo28gZGUgb3V0cmFzIGRpc3RyaWJ1acOnw7Vlcy4NCg0KIyMgKipQYWNvdGVzIFV0aWxpemFkb3MqKg0KDQpgYGB7ciBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KbGlicmFyeShEaXN0cmlidXRpb25UZXN0KQ0KbGlicmFyeShtb21lbnRzKQ0KbGlicmFyeShub3J0ZXN0KQ0KbGlicmFyeShEZXNjVG9vbHMpDQpsaWJyYXJ5KGZCYXNpY3MpDQpsaWJyYXJ5KGRwbHlyKQ0KbGlicmFyeSh0aWR5cikNCmxpYnJhcnkoZ2dwbG90MikNCiNsaWJyYXJ5KGthYmxlRXh0cmEpDQpsaWJyYXJ5KGtuaXRyKQ0KbGlicmFyeSh0aW55dGV4KQ0KbGlicmFyeShQdWJsaXNoKQ0KYGBgDQoNCg0KDQoNCg0KIyMgKipTaW11bGHDp8OjbyoqDQoNCg0KYGBge3IgYW1vc3RyYSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCiMgVGFtYW5obyBkZSBBbW9zdHJhDQpSZXN1bHRhZG9zIDwtIE5VTEwNCk5OIDwtIDEwDQoNCiMgUmVwZXRpw6fDo28NCmVzY29wbyA8LSBleHBhbmQuZ3JpZCgNCiAgdGFtYW5ob19hbW9zdHJhID0gc2VxKDI1LCAzMCwgNSksDQogIHJlcGV0aWNhbyA9IHNlcSgxLCBOTikNCikNCg0KUmVzdWx0YWRvcyA8LSBwdXJycjo6bWFwMl9kZnIoZXNjb3BvJHRhbWFuaG9fYW1vc3RyYSxlc2NvcG8kcmVwZXRpY2FvLCBmdW5jdGlvbih0YW1hbmhvX2Ftb3N0cmEsIGlpKXsNCiAgcHJpbnQocGFzdGUwKHRhbWFuaG9fYW1vc3RyYSwgIi0iLCBpaSkpDQogICN4IDwtcmNhdWNoeSh0YW1hbmhvX2Ftb3N0cmEsIDAsMSkNCiAgeCA8LXJub3JtKHRhbWFuaG9fYW1vc3RyYSwgMCwxKQ0KICAjeCA8LSByZ2FtbWEodGFtYW5ob19hbW9zdHJhLCBzaGFwZSA9IDEwLCByYXRlID0gMS8xMCkNCiAgdGliYmxlKA0KICAgIEtvbG1vZ29yb3ZfU21pcm5vdiA9IGtzLnRlc3QoeCwgcG5vcm0sIG1lYW4oeCksIHNkKHgpKSRwLnZhbHVlLA0KICAgIEphcnF1ZV9CZXJhID0gSmFycXVlQmVyYVRlc3QoeCkkcC52YWx1ZSwNCiAgICBBbmRlcnNvbl9EYXJsaW5nID0gQW5kZXJzb25EYXJsaW5nVGVzdCh4LCBudWxsID0gInBub3JtIiwgbWVhbih4KSwgc2QoeCkpJHAudmFsdWUsDQogICAgTGlsbGllZm9ycyA9IExpbGxpZVRlc3QoeCkkcC52YWx1ZSwNCiAgICBTaGFwaXJvX1dpbGsgPSBzaGFwaXJvLnRlc3QoeCkkcC52YWx1ZSwNCiAgICBDcmFtZXJfVm9uX01pc2VzID0gY3ZtLnRlc3QoeCkkcC52YWx1ZSwNCiAgICBEX0Fnb3N0aW5vID0gYWdvc3Rpbm8udGVzdCh4KSRwLnZhbHVlLA0KICAgIFpLID0gemsudGVzdCh4LCAnbm9ybScpJHAudmFsdWUsDQogICAgWkMgPSB6Yy50ZXN0KHgsICdub3JtJykkcC52YWx1ZSwNCiAgICBaQSA9IHphLnRlc3QoeCwgJ25vcm0nKSRwLnZhbHVlLA0KICAgIGFtb3N0cmEgPSB0YW1hbmhvX2Ftb3N0cmEsDQogICAgdGVudGF0aXZhID0gaWkNCiAgKQ0KfQ0KKQ0KYGBgDQoNCg0KOjo6IHByb2dyZXNzDQo6Ojogey5wcm9ncmVzcy1iYXIgc3R5bGU9IndpZHRoOiAxMDAlOyJ9DQo6OjoNCjo6Og0KDQoNCg0KIyMgKipDb21wYXJhw6fDo28gZG8gUC12YWxvcioqDQoNCg0KYGBge3IgY29tcGFyYWNhbywgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NClJlc3VsdGFkb3MgfD4NCiAgdGlkeXI6OnBpdm90X2xvbmdlcigNCiAgICBuYW1lc190byA9ICJtb2RlbG8iLA0KICAgIHZhbHVlc190byA9ICJlc3RhdGlzdGljYSIsDQogICAgY29scyA9IGMoS29sbW9nb3Jvdl9TbWlybm92LA0KICAgICAgICAgICAgIEphcnF1ZV9CZXJhLA0KICAgICAgICAgICAgIEFuZGVyc29uX0RhcmxpbmcsDQogICAgICAgICAgICAgTGlsbGllZm9ycywNCiAgICAgICAgICAgICBTaGFwaXJvX1dpbGssDQogICAgICAgICAgICAgQ3JhbWVyX1Zvbl9NaXNlcywNCiAgICAgICAgICAgICBEX0Fnb3N0aW5vLA0KICAgICAgICAgICAgIFpLLA0KICAgICAgICAgICAgIFpDLA0KICAgICAgICAgICAgIFpBKSl8Pg0KICBncm91cF9ieShhbW9zdHJhLCBtb2RlbG8pfD4NCiAgc3VtbWFyaXNlKA0KICAgIG1pbmltbyA9IG1pbihlc3RhdGlzdGljYSksDQogICAgbWVkaWFuYSA9IG1lYW4oZXN0YXRpc3RpY2EpLA0KICAgIG1heGltbyA9IG1lZGlhbihlc3RhdGlzdGljYSkrc2QoZXN0YXRpc3RpY2EpKXw+DQogIGdncGxvdChhZXMoeCA9IGFtb3N0cmEsIHkgPSBtZWRpYW5hLCB5bWluID0gbWluaW1vLCB5bWF4ID0gIG1heGltbywgDQogICAgICAgICAgICAgY29sb3IgPSBtb2RlbG8pKSsNCiAgZ2VvbV9saW5lKCkrDQogIGdlb21faml0dGVyKCkrDQogIGdlb21fcG9pbnQoKSsNCiAgZ2d0aXRsZSgiQ29tcGFyYcOnw6NvIGRvIFAtdmFsb3IgTcOpZGlvIikrDQogIHRoZW1lX2J3KCkrDQogIHNjYWxlX3lfY29udGludW91cyhsYWJlbHMgPSBzY2FsZXM6OnBlcmNlbnQsIGxpbWl0cyA9IGMoMCwxKSkrDQogIGxhYnMoeCA9ICJUYW1hbmhvIEFtb3N0cmFsIiwgDQogICAgICAgeSA9ICJFcnJvIFRpcG8gSSIsIA0KICAgICAgIGNvbG9yID0gIlRpcG9zIGRlIFRlc3RlcyIpDQpgYGANCg0KDQoNCg0KDQo6OjogcHJvZ3Jlc3MNCjo6OiB7LnByb2dyZXNzLWJhciBzdHlsZT0id2lkdGg6IDEwMCU7In0NCjo6Og0KOjo6DQoNCg0KDQojIyAqKlBvZGVyIGRvIFRlc3RlKioNCg0KQSBmaWd1cmEgMiBFc3TDo28gYXByZXNlbnRhZG9zIG9zIHZhbG9yZXMgZGUgcG9kZXIgcGFyYSBvcyBvaXRvIHRlc3RlcyBlbSBmdW7Dp8OjbyBkbyB0YW1hbmhvIGRhIGFtb3N0cmEgbiBwYXJhIGRpc3RyaWJ1acOnw6NvIGdhbW1hLg0KDQoNCg0KYGBge3IgcG9kZXIsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQpSZXN1bHRhZG9zIHw+DQogIHRpZHlyOjpwaXZvdF9sb25nZXIoDQogICAgbmFtZXNfdG8gPSAibW9kZWxvIiwNCiAgICB2YWx1ZXNfdG8gPSAiZXN0YXRpc3RpY2EiLA0KICAgIGNvbHMgPSBjKEtvbG1vZ29yb3ZfU21pcm5vdiwNCiAgICAgICAgICAgICBKYXJxdWVfQmVyYSwNCiAgICAgICAgICAgICBBbmRlcnNvbl9EYXJsaW5nLA0KICAgICAgICAgICAgIExpbGxpZWZvcnMsDQogICAgICAgICAgICAgU2hhcGlyb19XaWxrLA0KICAgICAgICAgICAgIENyYW1lcl9Wb25fTWlzZXMsDQogICAgICAgICAgICAgRF9BZ29zdGlubywNCiAgICAgICAgICAgICBaSywNCiAgICAgICAgICAgICBaQywNCiAgICAgICAgICAgICBaQSkpfD4NCiAgZ3JvdXBfYnkoYW1vc3RyYSwgbW9kZWxvKXw+DQogIHN1bW1hcmlzZSgNCiAgICBtaW5pbW8gPSBtaW4oZXN0YXRpc3RpY2EpLA0KICAgIG1lZGlhbmEgPSBtZWFuKGVzdGF0aXN0aWNhIDwgLjA1KSwNCiAgICBtYXhpbW8gPSBtZWRpYW4oZXN0YXRpc3RpY2EpK3NkKGVzdGF0aXN0aWNhKSl8Pg0KICBnZ3Bsb3QoYWVzKHggPSBhbW9zdHJhLCB5ID0gbWVkaWFuYSwgeW1pbiA9IG1pbmltbywgeW1heCA9ICBtYXhpbW8sIGNvbG9yID0gbW9kZWxvKSkrDQogIGdlb21fbGluZSgpKw0KICBnZW9tX2ppdHRlcigpKw0KICBnZW9tX3BvaW50KCkrDQogIGdndGl0bGUoIkNvbXBhcmHDp8OjbyBkbyBQb2RlciBkbyBUZXN0ZSIsIHN1YnRpdGxlID0gIlNpbXVsYcOnw6NvIikrDQogIHRoZW1lX2J3KCkrDQogIHNjYWxlX3lfY29udGludW91cyhsYWJlbHMgPSBzY2FsZXM6OnBlcmNlbnQsIGxpbWl0cyA9IGMoMCwxKSkrDQogIGxhYnMoeCA9ICJUYW1hbmhvIEFtb3N0cmFsIiwgDQogICAgICAgeSA9ICJQb2RlciBkbyBUZXN0ZSIsIA0KICAgICAgIGNvbG9yID0gIlRpcG9zIGRlIFRlc3RlcyIpDQpgYGANCg0KDQoNCjo6OiBwcm9ncmVzcw0KOjo6IHsucHJvZ3Jlc3MtYmFyIHN0eWxlPSJ3aWR0aDogMTAwJTsifQ0KOjo6DQo6OjoNCg0KDQoNCg0KDQojICoqUmVmZXLDqm5jaWFzIEJpYmxpb2dyw6FmaWNhcyoqDQoNCkFOREVSU09OLCBULiBXLjsgREFSTElORywgRC4gQS4gQSB0ZXN0IG9mIGdvb2RuZXNzIG9mIHQuSm91cm5hbCBvZiBBbWVyaWNhblN0YXRpc3RpY2FsIEFzc29jaWF0aW9uLCB2LjQ5LCBwLiA3NjUtNzY5LCAxOTU0Lg0KDQpEYEFHT1NUSU5PLCBSLiBCLiBUcmFuc2Zvcm1hdGlvbiB0byBOb21hbGl0eSBvZiB0aGUgTnVsbCBEaXN0cmlidXRpb24gb2YgRzEuQmlvbWUtdHJpa2EsIHYuNTcsIG4uMywgcC42NzktNjgxLCAxOTcwDQoNCkphcnF1ZSBDTSwgQmVyYSBBSyAoMTk4NykuIOKAnEEgVGVzdCBmb3IgTm9ybWFsaXR5IG9mIE9ic2VydmF0aW9ucyBhbmQgUmVncmVzc2lvbiBSZXNpZHVhbHMu4oCdIEludGVybmF0aW9uYWwgU3RhdGlzdGljYWwgUmV2aWV3LiBSZXZ1ZSBJbnRlcm5hdGlvbmFsIGRlIFN0YXRpc3RpcXVlLCA1NSgyKSwgMTYz4oCTMTcyLg0KZG9pOjEwLjIzMDcvMTQwMzE5Mi4NCg0KS29sbW9nb3JvdiwgQS4sIFN1bGxhIGRldGVybWluYXppb25lIGVtcGlyaWNhIGRpIHVuYSBsZWdnZSBkaSBkaXN0cmlidXRpb25lLA0KR2lvcm5hbGUgZGVsbOKAmSBJc3RpdHV0byBJdGFsaWFubyBkZWdsaSBBdHR1YXJpIDQgKDE5MzMpLCA4M+KAkzkxLg0KDQpMSUxMSUVGT1JTLCBILiBXLiBPbiB0aGUgS29sbW9nb3Jvdi1TbWlybm92IHRlc3QgZm9yIG5vcm1hbGl0eSB3aXRoIG1lYW4gYW5kIHZhcmktYW5jZSB1bmtub3duLkpvdXJuYWwgb2YgQW1lcmljYW4gU3RhdGlzdGljYWwgQXNzb2NpYXRpb24sIHYuNjIsIHAuNTM0LTU0NCwgMTk2Ny4NCg0KU0hBUElSTywgUy4gUy47IFdJTEssIE0uIEIuIEFuIGFuYWx5c2lzIG9mIHZhcmlhbmNlIHRlc3QgZm9yIG5vcm1hbGl0eSAoY29tcGxldGUgc2FtLXBsZXMpLkJpb21ldHJpa2EsIHYuNTIsIHAuIDU5MS02MTEsIDE5NjUuDQoNCg0KWmhhbmcgSiAoMjAwMikuIOKAnFBvd2VyZnVsIEdvb2RuZXNzLW9mLUZpdCBUZXN0cyBCYXNlZCBvbiB0aGUgTGlrZWxpaG9vZCBSYXRpby7igJ0gSm91cm5hbCBvZg0KdGhlIFJveWFsIFN0YXRpc3RpY2FsIFNvY2lldHkgQiwgNjQoMiksIDI4MeKAkzI5NC4gZG9pOjEwLjExMTEvMTQ2Ny05ODY4LjAwMzM3Lg0KDQoNCg0KOjo6IHByb2dyZXNzDQo6Ojogey5wcm9ncmVzcy1iYXIgc3R5bGU9IndpZHRoOiAxMDAlOyJ9DQo6OjoNCjo6Og0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQo=