XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX PRÁTICA EM R COM ESTATÍSTICA I XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

AMOSTRAGEM SIMPLES: A amostragem aleatória simples é o processo mais elementar e frequentemente utilizado. Corresponde a uma amostra de elementos retirados ao acaso da população, isto é, cada indivíduo é escolhido completamente ao acaso e cada membro da população tem a mesma probabilidade se ser incluído na amostra.

#150 amostras, de zero e 1, com reposição, e probabilidades equivalentes
amostra=sample(c(0,1),150,replace=T,prob=c(0.5,0.5))
#vai extrair amostra de zero e 1
#150= quantidade de amostras que ele vai gerar
#replace= amostra que ele vai gerar será com reposição
#prob= indica a probabilidade para o zero e para o 1 respectivamente - neste exemplo as probabilidade são ao acaso
amostra
  [1] 0 0 0 1 1 1 0 0 0 1 0 0 0 1 1 1 1 0 1 1 0 1 1 0 0 0 1 0 1 0 1 0 1 1 1 1 1 1 0 0 0 0 0 1 0 1 1 0 1 0 1 0 1 1 0 1 0 0 1 0 1 0 0 0 1
 [66] 1 0 1 1 1 1 0 0 1 0 0 1 1 0 0 1 0 0 0 1 0 0 1 1 1 0 0 1 1 0 0 1 1 1 1 1 0 0 0 0 0 1 1 0 1 1 0 0 1 0 0 1 1 0 0 0 0 1 0 1 1 0 0 0 0
[131] 1 0 0 1 1 0 1 1 1 1 0 1 1 0 1 0 0 1 0 0
summary(as.factor(amostra))
 0  1 
77 73 

150 amostras, de zero e 1, com reposição, mais chances para zero

amostra=sample(c(0,1),150,replace=T,prob=c(0.7,0.3))
amostra
  [1] 0 1 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 1 1 0 0 0 0 1 0 0 0 0 0 1 0 0 1 0 1 0 0 0 0 1 1 0 1 0 0 1 1 0 1 1 0 0 0 1 0 1 0 0 0 0 0
 [66] 0 1 0 0 1 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 1 0 1 0 0 1 0 0 0 0 1 0 1 1 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 1
[131] 0 0 0 0 1 0 1 0 1 0 0 1 0 1 0 0 0 0 1 1
summary(as.factor(amostra))
  0   1 
107  43 

150 amostras, de 1 a 1000, sem reposição, prob. equivalentes

amostra=sample(c(1:1000),150,replace=F)
amostra
  [1]  37 517 986 520  14 940 714  54 258 328 455 861 390 893 604 708 514 957 976 159 871 415 235  35 411 872 961 668 781 277 599 646
 [33] 576 911 259 484 803 909 178 630 760 999 732 368 424 728  60 573 176 989 279 224 495 280 103 641 219 325 456 242 715  78 698 958
 [65] 413 721 499 120 180 472 937 307 742 949 402   5 168 614 530 618 172 111   8  67 636 752 824 153  85 888 782 426 359  65 565 969
 [97] 254 648 150 563 860 162 123 864 535 247 799 451 476 356 425  21 902 410 600 438 637 405 372 695 891  41  83 204 578 241 779 412
[129] 729 467 218 136 930 608 679 457 478 436  86  33 670 847 193 705 213 972 831 523 868 574

Aplicação prática do uso de amostras simples

#Gerando amostra de conjuntos de dados (30% dos dados de iris)

amostra=sample(c(0,1),150,replace=T,prob=c(0.7,0.3))
summary(as.factor(amostra))
  0   1 
116  34 

Gerando amostra

#veja que eu criei nova variável, pois não quero alterar os dados originais, ou seja, eu quero ter meus próprios dados.
amostrairis=iris[amostra==1,]
amostrairis
#podemos ver a dimensão dos dados através do dim
dim(amostrairis)
[1] 34  5

Repetir experimento

set.seed(2345)
sample(c(1000),1)
[1] 483

Repetindo

set.seed(2345)
sample(c(1000),1)
[1] 483

XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX AMOSTRAGEM SISTEMÁTICA: Na amostragem sistemática, seleciona-se as unidades amostrais através de um esquema preestabelecido de sistematização, visando cobrir a população em toda a sua extensão, obtendo-se um modelo uniforme.

#install.packages("TeachingSampling")
library("TeachingSampling")
Carregando pacotes exigidos: dplyr

Attaching package: ‘dplyr’

The following objects are masked from ‘package:stats’:

    filter, lag

The following objects are masked from ‘package:base’:

    intersect, setdiff, setequal, union

Carregando pacotes exigidos: magrittr

Amostra sistematica de tamanha 150, 10 grupos

amostra = S.SY(150, 10)
amostra
      [,1]
 [1,]    7
 [2,]   17
 [3,]   27
 [4,]   37
 [5,]   47
 [6,]   57
 [7,]   67
 [8,]   77
 [9,]   87
[10,]   97
[11,]  107
[12,]  117
[13,]  127
[14,]  137
[15,]  147
dim(amostra)
[1] 15  1

Usamos em iris

amostrairis=iris[amostra,]

amostrairis

Verificamos

Tamanho

dim(amostrairis)
[1] 15  5

XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX AMOSTRAGEM ESTRATIFICADA: consiste em especificar quantos elementos da amostra serão retirados em cada estrato. É costume considerar três tipos de amostragem estratificada: uniforme, proporcional e ótima.

A estratificada uniforme, sorteia-se igual número de elementos em cada estrato. A amostra estratificada proporcional produz um erro amostral menor ou igual a amostra aleatória simples, é mais precisa. A igualdade ocorre quando as médias ou as proporções que estamos analisando são iguais em todos os níveis dos estratos. A amostragem estratificada ótima é sempre igual ou mais precisa que a amostra estratificada proporcional. Ambos os métodos são igualmente precisos quando os desvios-padrão são iguais dentro de cada camada, neste caso ambos os métodos são completamente equivalentes.

#install.packages("sampling")
library("sampling")

Proporção

#nesse método que usaremos ele nos dá a proporção de cada extrato. O iris tem 150 registros e 3 espécies, onde cada espécie está 
#representada proporcionalmente - 50 registros de cada espécie.Portanto, aqui queremos gerar uma proporção de 25 de cada espécie
#então, teremos como resultado final um conjunto de dados com 75 registros. Nós poderíamos gerar este resultado mostrando uma
#amostragem simples, porém não teríamos a garantia de que haveria uma representatividade igual das classes(mesma proporção) 
proporcao=25

Srswor amostra simples sem reposição, srswr com reposição, poisson, systematic; a ordem de size é que está no conjunto de dados

amostrairis2=strata(data=iris,stratanames=c("Species"),size=c(rep(proporcao,3)),method="srswor")
Error in strata(data = iris, stratanames = c("Species"), size = c(rep(proporcao,  : 
  object 'proporcao' not found
summary(amostrairis2)
       Species      ID_unit            Prob        Stratum 
 setosa    :25   Min.   :  1.00   Min.   :0.5   Min.   :1  
 versicolor:25   1st Qu.: 37.50   1st Qu.:0.5   1st Qu.:1  
 virginica :25   Median : 77.00   Median :0.5   Median :2  
                 Mean   : 74.59   Mean   :0.5   Mean   :2  
                 3rd Qu.:111.50   3rd Qu.:0.5   3rd Qu.:3  
                 Max.   :148.00   Max.   :0.5   Max.   :3  

Dados de infertilidade

infert
summary(infert)
   education        age            parity         induced            case         spontaneous        stratum      pooled.stratum 
 0-5yrs : 12   Min.   :21.00   Min.   :1.000   Min.   :0.0000   Min.   :0.0000   Min.   :0.0000   Min.   : 1.00   Min.   : 1.00  
 6-11yrs:120   1st Qu.:28.00   1st Qu.:1.000   1st Qu.:0.0000   1st Qu.:0.0000   1st Qu.:0.0000   1st Qu.:21.00   1st Qu.:19.00  
 12+ yrs:116   Median :31.00   Median :2.000   Median :0.0000   Median :0.0000   Median :0.0000   Median :42.00   Median :36.00  
               Mean   :31.50   Mean   :2.093   Mean   :0.5726   Mean   :0.3347   Mean   :0.5766   Mean   :41.87   Mean   :33.58  
               3rd Qu.:35.25   3rd Qu.:3.000   3rd Qu.:1.0000   3rd Qu.:1.0000   3rd Qu.:1.0000   3rd Qu.:62.25   3rd Qu.:48.25  
               Max.   :44.00   Max.   :6.000   Max.   :2.0000   Max.   :1.0000   Max.   :2.0000   Max.   :83.00   Max.   :63.00  

Amostragem por estratos de education

amostra=strata(data=infert,stratanames=c("education"),size=c(5,48,47), method="srswor")

Resultado

amostra
summary(amostra)
   education     ID_unit            Prob           Stratum    
 0-5yrs : 5   Min.   :  1.00   Min.   :0.4000   Min.   :1.00  
 6-11yrs:48   1st Qu.: 63.25   1st Qu.:0.4000   1st Qu.:2.00  
 12+ yrs:47   Median :131.00   Median :0.4052   Median :2.00  
              Mean   :123.43   Mean   :0.4033   Mean   :2.42  
              3rd Qu.:175.75   3rd Qu.:0.4052   3rd Qu.:3.00  
              Max.   :241.00   Max.   :0.4167   Max.   :3.00  

XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX MEDIDAS DE CENTRALIDADE E VARIABILIDADE: Dentre todas as informações, podemos retirar valores que representem, de algum modo, todo o conjunto. Esses valores são denominados “Medidas de Tendência Central ou Medidas de Centralidade”. As medidas de centralidade que apresentaremos são a Média Aritmética, a Moda e a Mediana.

Dados dos jogadores

jogadores = c(40000,18000,12000,250000,30000,140000,300000,40000,800000)
jogadores
[1]  40000  18000  12000 250000  30000 140000 300000  40000 800000

Média

mean(jogadores)
[1] 181111.1

Mediana (Não é afetada pelo valor do outlier)

median(jogadores)
[1] 40000

Quartis

quartis  = quantile(jogadores)
quartis
    0%    25%    50%    75%   100% 
 12000  30000  40000 250000 800000 
boxplot(jogadores)

3º quartil

quartis[4]
   75% 
250000 

Desvio padrão

sd(jogadores)
[1] 255307.9

Resumo

summary(jogadores)
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
  12000   30000   40000  181111  250000  800000 

XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX TEOREMA CENTRAL DO LIMITE: O Teorema Central do Limite (TCL) afirma que a soma (S) de N variáveis aleatórias independentes (X), com qualquer distribuição e variâncias semelhantes, é uma variável com distribuição que se aproxima da distribuição de Gauss (distribuição normal) quando N aumenta. “Este teorema nos diz que se tivermos muitas variáveis aleatórias, mesmo que elas não sejam normalmente distribuidas sua média deverá ser proximo a uma distribuição normal.”

#omitir warnings
options(warn=-1)
#install.packages("semTools")
library(semTools)
Carregando pacotes exigidos: lavaan
This is lavaan 0.6-12
lavaan is FREE software! Please report any bugs.
 
###############################################################################
This is semTools 0.5-6
All users of R (or SEM) are invited to submit functions or ideas for functions.
###############################################################################

Inicializa um vetor

z = rep(0,500)
z
  [1] 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 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 0 0 0 0 0 0 0 0 0 0 0
 [66] 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 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 0 0 0 0 0 0 0 0 0 0 0
[131] 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 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 0 0 0 0 0 0 0 0 0 0 0
[196] 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 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 0 0 0 0 0 0 0 0 0 0 0
[261] 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 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 0 0 0 0 0 0 0 0 0 0 0
[326] 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 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 0 0 0 0 0 0 0 0 0 0 0
[391] 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 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 0 0 0 0 0 0 0 0 0 0 0
[456] 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 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

Gera as amostras

for (i in 1:500) {
  m = mvrnonnorm(1000, c(1, 2), matrix(c(10, 2, 2, 5), 2, 2),
                 skewness = c(5, 2), kurtosis = c(3, 3))
#grava a média da amostra
  z[i] =mean(m)

  #imprime as 3 primeiras
  if (i<4){hist(m,breaks=50, main= paste0("Histrograma ", i ))}
}

Imprime a distribuição da média das amostras

XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX TESTES DE NORMALIDADE: são baseados na função de distribuição empírica. O teste Ryan-Joiner (similar ao teste Shapiro-Wilk) é baseado em regressão e correlação. Todos os três testes tendem a funcionar bem na identificação de uma distribuição como não normal quando a distribuição é assimétrica. [Para testar dados que não estão normalmente distribu]

Repetir o experimento

set.seed(123)

Gera mil variáveis normalmente distribuidas

x = rnorm(1000)
x

Gráfico QQ

#rodar com Ctrl+shift+enter
qqnorm(x)
qqline(x)

hist(x)

Teste de Shapiro:tem como objetivo avaliar se uma distribuição é semelhante a uma distribuição normal. A distribuição normal também pode ser chamada de gaussiana e sua forma assemelha-se a de um sino. Esse tipo de distribuição é muito importante, por ser frequentemente usada para modelar fenômenos naturais.

Valor de p acima de 0,05, não há indício para a não confirmar a hipótese nula de dados normalmente distribuidos

shapiro.test(x) 

    Shapiro-Wilk normality test

data:  x
W = 0.99838, p-value = 0.4765

Histograma com linha de densidade

#rodar com Ctrl+shift+enter
hist(x, main="")
par(new=TRUE)
plot(density(x),ylab = "", xlab = "", axes=F, lwd=2.5 ) 

Dados não normalmente distribuidos

#rodar com Ctrl+shift+enter
#install.packages("semTools")
library(semTools)
m = mvrnonnorm(1000, c(1, 2), matrix(c(10, 2, 2, 5), 2, 2),
                 skewness = c(5, 2), kurtosis = c(3, 3))
qqnorm(m)
qqline(m)

shapiro.test(m)

    Shapiro-Wilk normality test

data:  m
W = 0.8857, p-value < 2.2e-16

Dados que não lembram em nada uma distribuição normal

#rodar com Ctrl+shift+enter
hist(m, main="")
par(new=TRUE)
plot(density(m),ylab = "", xlab = "", axes=F, lwd=2.5 ) 

shapiro.test(m)

XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

Pequenas e Grandes Amostras Espera-se uma média de 3,5.

Amostra pequena

x = sample(1:6,6,replace = T)
mean(x)
[1] 4

Amostra grande

x = sample(1:6,10000,replace = T)
mean(x)
[1] 3.4755

XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

LS0tDQp0aXRsZTogIkRhdGEgU2NpZW5jZSBwYXJhIENpZW50aXN0YSBkZSBEYWRvcyINCm91dHB1dDogaHRtbF9ub3RlYm9vaw0KLS0tDQoNClhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWA0KUFLDgVRJQ0EgRU0gUiBDT00gRVNUQVTDjVNUSUNBIEkNClhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYDQoNCkFNT1NUUkFHRU0gU0lNUExFUzogQSBhbW9zdHJhZ2VtIGFsZWF0w7NyaWEgc2ltcGxlcyDDqSBvIHByb2Nlc3NvIG1haXMgZWxlbWVudGFyIGUgZnJlcXVlbnRlbWVudGUgdXRpbGl6YWRvLiBDb3JyZXNwb25kZSBhIHVtYSBhbW9zdHJhIGRlIGVsZW1lbnRvcyByZXRpcmFkb3MgYW8gYWNhc28gZGEgcG9wdWxhw6fDo28sIGlzdG8gw6ksIGNhZGEgaW5kaXbDrWR1byDDqSBlc2NvbGhpZG8gY29tcGxldGFtZW50ZSBhbyBhY2FzbyBlIGNhZGEgbWVtYnJvIGRhIHBvcHVsYcOnw6NvIHRlbSBhIG1lc21hIHByb2JhYmlsaWRhZGUgc2Ugc2VyIGluY2x1w61kbyBuYSBhbW9zdHJhLg0KDQpgYGB7cn0NCiMxNTAgYW1vc3RyYXMsIGRlIHplcm8gZSAxLCBjb20gcmVwb3Npw6fDo28sIGUgcHJvYmFiaWxpZGFkZXMgZXF1aXZhbGVudGVzDQphbW9zdHJhPXNhbXBsZShjKDAsMSksMTUwLHJlcGxhY2U9VCxwcm9iPWMoMC41LDAuNSkpDQojdmFpIGV4dHJhaXIgYW1vc3RyYSBkZSB6ZXJvIGUgMQ0KIzE1MD0gcXVhbnRpZGFkZSBkZSBhbW9zdHJhcyBxdWUgZWxlIHZhaSBnZXJhcg0KI3JlcGxhY2U9IGFtb3N0cmEgcXVlIGVsZSB2YWkgZ2VyYXIgc2Vyw6EgY29tIHJlcG9zacOnw6NvDQojcHJvYj0gaW5kaWNhIGEgcHJvYmFiaWxpZGFkZSBwYXJhIG8gemVybyBlIHBhcmEgbyAxIHJlc3BlY3RpdmFtZW50ZSAtIG5lc3RlIGV4ZW1wbG8gYXMgcHJvYmFiaWxpZGFkZSBzw6NvIGFvIGFjYXNvDQphbW9zdHJhDQpzdW1tYXJ5KGFzLmZhY3RvcihhbW9zdHJhKSkNCmBgYA0KDQoxNTAgYW1vc3RyYXMsIGRlIHplcm8gZSAxLCBjb20gcmVwb3Npw6fDo28sIG1haXMgY2hhbmNlcyBwYXJhIHplcm8NCmBgYHtyfQ0KYW1vc3RyYT1zYW1wbGUoYygwLDEpLDE1MCxyZXBsYWNlPVQscHJvYj1jKDAuNywwLjMpKQ0KYW1vc3RyYQ0Kc3VtbWFyeShhcy5mYWN0b3IoYW1vc3RyYSkpDQpgYGANCg0KMTUwIGFtb3N0cmFzLCBkZSAxIGEgMTAwMCwgc2VtIHJlcG9zacOnw6NvLCBwcm9iLiBlcXVpdmFsZW50ZXMNCmBgYHtyfQ0KYW1vc3RyYT1zYW1wbGUoYygxOjEwMDApLDE1MCxyZXBsYWNlPUYpDQphbW9zdHJhDQpgYGANCkFwbGljYcOnw6NvIHByw6F0aWNhIGRvIHVzbyBkZSBhbW9zdHJhcyBzaW1wbGVzDQoNCmBgYHtyfQ0KI0dlcmFuZG8gYW1vc3RyYSBkZSBjb25qdW50b3MgZGUgZGFkb3MgKDMwJSBkb3MgZGFkb3MgZGUgaXJpcykNCg0KYW1vc3RyYT1zYW1wbGUoYygwLDEpLDE1MCxyZXBsYWNlPVQscHJvYj1jKDAuNywwLjMpKQ0Kc3VtbWFyeShhcy5mYWN0b3IoYW1vc3RyYSkpDQpgYGANCkdlcmFuZG8gYW1vc3RyYQ0KYGBge3J9DQojdmVqYSBxdWUgZXUgY3JpZWkgbm92YSB2YXJpw6F2ZWwsIHBvaXMgbsOjbyBxdWVybyBhbHRlcmFyIG9zIGRhZG9zIG9yaWdpbmFpcywgb3Ugc2VqYSwgZXUgcXVlcm8gdGVyIG1ldXMgcHLDs3ByaW9zIGRhZG9zLg0KYW1vc3RyYWlyaXM9aXJpc1thbW9zdHJhPT0xLF0NCmFtb3N0cmFpcmlzDQojcG9kZW1vcyB2ZXIgYSBkaW1lbnPDo28gZG9zIGRhZG9zIGF0cmF2w6lzIGRvIGRpbQ0KZGltKGFtb3N0cmFpcmlzKQ0KYGBgDQoNClJlcGV0aXIgZXhwZXJpbWVudG8NCmBgYHtyfQ0Kc2V0LnNlZWQoMjM0NSkNCnNhbXBsZShjKDEwMDApLDEpDQpgYGANClJlcGV0aW5kbw0KYGBge3J9DQpzZXQuc2VlZCgyMzQ1KQ0Kc2FtcGxlKGMoMTAwMCksMSkNCmBgYA0KWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWA0KQU1PU1RSQUdFTSBTSVNURU3DgVRJQ0E6IE5hIGFtb3N0cmFnZW0gc2lzdGVtw6F0aWNhLCBzZWxlY2lvbmEtc2UgYXMgdW5pZGFkZXMgYW1vc3RyYWlzIGF0cmF2w6lzIGRlIHVtIGVzcXVlbWEgcHJlZXN0YWJlbGVjaWRvIGRlIHNpc3RlbWF0aXphw6fDo28sIHZpc2FuZG8gY29icmlyIGEgcG9wdWxhw6fDo28gZW0gdG9kYSBhIHN1YSBleHRlbnPDo28sIG9idGVuZG8tc2UgdW0gbW9kZWxvIHVuaWZvcm1lLg0KDQpgYGB7cn0NCiNpbnN0YWxsLnBhY2thZ2VzKCJUZWFjaGluZ1NhbXBsaW5nIikNCmxpYnJhcnkoIlRlYWNoaW5nU2FtcGxpbmciKQ0KYGBgDQoNCkFtb3N0cmEgc2lzdGVtYXRpY2EgZGUgdGFtYW5oYSAxNTAsIDEwIGdydXBvcw0KYGBge3J9DQphbW9zdHJhID0gUy5TWSgxNTAsIDEwKQ0KYW1vc3RyYQ0KDQpkaW0oYW1vc3RyYSkNCmBgYA0KDQpVc2Ftb3MgZW0gaXJpcw0KDQpgYGB7cn0NCmFtb3N0cmFpcmlzPWlyaXNbYW1vc3RyYSxdDQoNCmFtb3N0cmFpcmlzDQpgYGANClZlcmlmaWNhbW9zDQpgYGB7cn0NCmFtb3N0cmFpcmlzDQpgYGANClRhbWFuaG8NCmBgYHtyfQ0KZGltKGFtb3N0cmFpcmlzKQ0KYGBgDQoNClhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFgNCkFNT1NUUkFHRU0gRVNUUkFUSUZJQ0FEQTogY29uc2lzdGUgZW0gZXNwZWNpZmljYXIgcXVhbnRvcyBlbGVtZW50b3MgZGEgYW1vc3RyYSBzZXLDo28gcmV0aXJhZG9zIGVtIGNhZGEgZXN0cmF0by4gw4kgY29zdHVtZSBjb25zaWRlcmFyIHRyw6pzIHRpcG9zIGRlIGFtb3N0cmFnZW0gZXN0cmF0aWZpY2FkYTogdW5pZm9ybWUsIHByb3BvcmNpb25hbCBlIMOzdGltYS4gDQoNCkEgZXN0cmF0aWZpY2FkYSB1bmlmb3JtZSwgc29ydGVpYS1zZSBpZ3VhbCBuw7ptZXJvIGRlIGVsZW1lbnRvcyBlbSBjYWRhIGVzdHJhdG8uDQpBIGFtb3N0cmEgZXN0cmF0aWZpY2FkYSBwcm9wb3JjaW9uYWwgcHJvZHV6IHVtIGVycm8gYW1vc3RyYWwgbWVub3Igb3UgaWd1YWwgYSBhbW9zdHJhIGFsZWF0w7NyaWEgc2ltcGxlcywgw6kgbWFpcyBwcmVjaXNhLiBBIGlndWFsZGFkZSBvY29ycmUgcXVhbmRvIGFzIG3DqWRpYXMgb3UgYXMgcHJvcG9yw6fDtWVzIHF1ZSBlc3RhbW9zIGFuYWxpc2FuZG8gc8OjbyBpZ3VhaXMgZW0gdG9kb3Mgb3MgbsOtdmVpcyBkb3MgZXN0cmF0b3MuDQpBIGFtb3N0cmFnZW0gZXN0cmF0aWZpY2FkYSDDs3RpbWEgw6kgc2VtcHJlIGlndWFsIG91IG1haXMgcHJlY2lzYSBxdWUgYSBhbW9zdHJhIGVzdHJhdGlmaWNhZGEgcHJvcG9yY2lvbmFsLiBBbWJvcyBvcyBtw6l0b2RvcyBzw6NvIGlndWFsbWVudGUgcHJlY2lzb3MgcXVhbmRvIG9zIGRlc3Zpb3MtcGFkcsOjbyBzw6NvIGlndWFpcyBkZW50cm8gZGUgY2FkYSBjYW1hZGEsIG5lc3RlIGNhc28gYW1ib3Mgb3MgbcOpdG9kb3Mgc8OjbyBjb21wbGV0YW1lbnRlIGVxdWl2YWxlbnRlcy4NCg0KDQpgYGB7cn0NCiNpbnN0YWxsLnBhY2thZ2VzKCJzYW1wbGluZyIpDQpsaWJyYXJ5KCJzYW1wbGluZyIpDQpgYGANCg0KUHJvcG9yw6fDo28NCmBgYHtyfQ0KI25lc3NlIG3DqXRvZG8gcXVlIHVzYXJlbW9zIGVsZSBub3MgZMOhIGEgcHJvcG9yw6fDo28gZGUgY2FkYSBleHRyYXRvLiBPIGlyaXMgdGVtIDE1MCByZWdpc3Ryb3MgZSAzIGVzcMOpY2llcywgb25kZSBjYWRhIGVzcMOpY2llIGVzdMOhIA0KI3JlcHJlc2VudGFkYSBwcm9wb3JjaW9uYWxtZW50ZSAtIDUwIHJlZ2lzdHJvcyBkZSBjYWRhIGVzcMOpY2llLlBvcnRhbnRvLCBhcXVpIHF1ZXJlbW9zIGdlcmFyIHVtYSBwcm9wb3LDp8OjbyBkZSAyNSBkZSBjYWRhIGVzcMOpY2llDQojZW50w6NvLCB0ZXJlbW9zIGNvbW8gcmVzdWx0YWRvIGZpbmFsIHVtIGNvbmp1bnRvIGRlIGRhZG9zIGNvbSA3NSByZWdpc3Ryb3MuIE7Ds3MgcG9kZXLDrWFtb3MgZ2VyYXIgZXN0ZSByZXN1bHRhZG8gbW9zdHJhbmRvIHVtYQ0KI2Ftb3N0cmFnZW0gc2ltcGxlcywgcG9yw6ltIG7Do28gdGVyw61hbW9zIGEgZ2FyYW50aWEgZGUgcXVlIGhhdmVyaWEgdW1hIHJlcHJlc2VudGF0aXZpZGFkZSBpZ3VhbCBkYXMgY2xhc3NlcyhtZXNtYSBwcm9wb3LDp8OjbykgDQpwcm9wb3JjYW89MjUNCmBgYA0KDQpTcnN3b3IgYW1vc3RyYSBzaW1wbGVzIHNlbSByZXBvc2nDp8Ojbywgc3Jzd3IgY29tIHJlcG9zacOnw6NvLCBwb2lzc29uLCBzeXN0ZW1hdGljOyBhIG9yZGVtIGRlIHNpemUgw6kgcXVlIGVzdMOhIG5vIGNvbmp1bnRvIGRlIGRhZG9zDQoNCmBgYHtyfQ0KYW1vc3RyYWlyaXMyPXN0cmF0YShkYXRhPWlyaXMsc3RyYXRhbmFtZXM9YygiU3BlY2llcyIpLHNpemU9YyhyZXAocHJvcG9yY2FvLDMpKSxtZXRob2Q9InNyc3dvciIpDQpgYGANCg0KYGBge3J9DQojcmVzdWx0YWRvDQoNCnN1bW1hcnkoYW1vc3RyYWlyaXMyKQ0KYGBgDQpEYWRvcyBkZSBpbmZlcnRpbGlkYWRlDQpgYGB7cn0NCmluZmVydA0Kc3VtbWFyeShpbmZlcnQpDQpgYGANCkFtb3N0cmFnZW0gcG9yIGVzdHJhdG9zIGRlIGVkdWNhdGlvbg0KYGBge3J9DQphbW9zdHJhPXN0cmF0YShkYXRhPWluZmVydCxzdHJhdGFuYW1lcz1jKCJlZHVjYXRpb24iKSxzaXplPWMoNSw0OCw0NyksIG1ldGhvZD0ic3Jzd29yIikNCmBgYA0KUmVzdWx0YWRvDQpgYGB7cn0NCmFtb3N0cmENCnN1bW1hcnkoYW1vc3RyYSkNCmBgYA0KDQpYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYDQpNRURJREFTIERFIENFTlRSQUxJREFERSBFIFZBUklBQklMSURBREU6IERlbnRyZSB0b2RhcyBhcyBpbmZvcm1hw6fDtWVzLCBwb2RlbW9zIHJldGlyYXIgdmFsb3JlcyBxdWUgcmVwcmVzZW50ZW0sIGRlIGFsZ3VtIG1vZG8sIHRvZG8gbyBjb25qdW50by4gRXNzZXMgdmFsb3JlcyBzw6NvIGRlbm9taW5hZG9zIOKAnE1lZGlkYXMgZGUgVGVuZMOqbmNpYSBDZW50cmFsIG91IE1lZGlkYXMgZGUgQ2VudHJhbGlkYWRl4oCdLiBBcyBtZWRpZGFzIGRlIGNlbnRyYWxpZGFkZSBxdWUgYXByZXNlbnRhcmVtb3Mgc8OjbyBhIE3DqWRpYSBBcml0bcOpdGljYSwgYSBNb2RhIGUgYSBNZWRpYW5hLg0KDQpEYWRvcyBkb3Mgam9nYWRvcmVzDQpgYGB7cn0NCmpvZ2Fkb3JlcyA9IGMoNDAwMDAsMTgwMDAsMTIwMDAsMjUwMDAwLDMwMDAwLDE0MDAwMCwzMDAwMDAsNDAwMDAsODAwMDAwKQ0Kam9nYWRvcmVzDQpgYGANCk3DqWRpYQ0KYGBge3J9DQptZWFuKGpvZ2Fkb3JlcykNCmBgYA0KTWVkaWFuYSAoTsOjbyDDqSBhZmV0YWRhIHBlbG8gdmFsb3IgZG8gb3V0bGllcikNCmBgYHtyfQ0KbWVkaWFuKGpvZ2Fkb3JlcykNCmBgYA0KUXVhcnRpcw0KYGBge3J9DQpxdWFydGlzICA9IHF1YW50aWxlKGpvZ2Fkb3JlcykNCnF1YXJ0aXMNCmJveHBsb3Qoam9nYWRvcmVzKQ0KYGBgDQozwrogcXVhcnRpbA0KYGBge3J9DQpxdWFydGlzWzRdDQpgYGANCkRlc3ZpbyBwYWRyw6NvDQpgYGB7cn0NCnNkKGpvZ2Fkb3JlcykNCmBgYA0KUmVzdW1vDQpgYGB7cn0NCnN1bW1hcnkoam9nYWRvcmVzKQ0KYGBgDQoNClhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFgNClRFT1JFTUEgQ0VOVFJBTCBETyBMSU1JVEU6IE8gVGVvcmVtYSBDZW50cmFsIGRvIExpbWl0ZSAoVENMKSBhZmlybWEgcXVlIGEgc29tYSAoUykgZGUgTiB2YXJpw6F2ZWlzIGFsZWF0w7NyaWFzIGluZGVwZW5kZW50ZXMgKFgpLCBjb20gcXVhbHF1ZXIgZGlzdHJpYnVpw6fDo28gZSB2YXJpw6JuY2lhcyBzZW1lbGhhbnRlcywgw6kgdW1hIHZhcmnDoXZlbCBjb20gZGlzdHJpYnVpw6fDo28gcXVlIHNlIGFwcm94aW1hIGRhIGRpc3RyaWJ1acOnw6NvIGRlIEdhdXNzIChkaXN0cmlidWnDp8OjbyBub3JtYWwpIHF1YW5kbyBOIGF1bWVudGEuDQoiRXN0ZSB0ZW9yZW1hIG5vcyBkaXogcXVlIHNlIHRpdmVybW9zIG11aXRhcyB2YXJpw6F2ZWlzIGFsZWF0w7NyaWFzLCBtZXNtbyBxdWUgZWxhcyBuw6NvIHNlamFtIG5vcm1hbG1lbnRlIGRpc3RyaWJ1aWRhcyBzdWEgbcOpZGlhIGRldmVyw6Egc2VyIHByb3hpbW8gYSB1bWEgZGlzdHJpYnVpw6fDo28gbm9ybWFsLiINCg0KYGBge3J9DQojb21pdGlyIHdhcm5pbmdzDQpvcHRpb25zKHdhcm49LTEpDQojaW5zdGFsbC5wYWNrYWdlcygic2VtVG9vbHMiKQ0KbGlicmFyeShzZW1Ub29scykNCg0KYGBgDQoNCkluaWNpYWxpemEgdW0gdmV0b3IgDQpgYGB7cn0NCnogPSByZXAoMCw1MDApDQp6DQpgYGANCkdlcmEgYXMgYW1vc3RyYXMNCmBgYHtyfQ0KZm9yIChpIGluIDE6NTAwKSB7DQogIG0gPSBtdnJub25ub3JtKDEwMDAsIGMoMSwgMiksIG1hdHJpeChjKDEwLCAyLCAyLCA1KSwgMiwgMiksDQogICAgICAgICAgICAgICAgIHNrZXduZXNzID0gYyg1LCAyKSwga3VydG9zaXMgPSBjKDMsIDMpKQ0KI2dyYXZhIGEgbcOpZGlhIGRhIGFtb3N0cmENCiAgeltpXSA9bWVhbihtKQ0KDQogICNpbXByaW1lIGFzIDMgcHJpbWVpcmFzDQogIGlmIChpPDQpe2hpc3QobSxicmVha3M9NTAsIG1haW49IHBhc3RlMCgiSGlzdHJvZ3JhbWEgIiwgaSApKX0NCn0NCmBgYA0KSW1wcmltZSBhIGRpc3RyaWJ1acOnw6NvIGRhIG3DqWRpYSBkYXMgYW1vc3RyYXMNCmBgYHtyfQ0KaGlzdCh6KQ0KYGBgDQoNClhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWA0KWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWA0KVEVTVEVTIERFIE5PUk1BTElEQURFOiAgc8OjbyBiYXNlYWRvcyBuYSBmdW7Dp8OjbyBkZSBkaXN0cmlidWnDp8OjbyBlbXDDrXJpY2EuIE8gdGVzdGUgUnlhbi1Kb2luZXIgKHNpbWlsYXIgYW8gdGVzdGUgU2hhcGlyby1XaWxrKSDDqSBiYXNlYWRvIGVtIHJlZ3Jlc3PDo28gZSBjb3JyZWxhw6fDo28uIFRvZG9zIG9zIHRyw6pzIHRlc3RlcyB0ZW5kZW0gYSBmdW5jaW9uYXIgYmVtIG5hIGlkZW50aWZpY2HDp8OjbyBkZSB1bWEgZGlzdHJpYnVpw6fDo28gY29tbyBuw6NvIG5vcm1hbCBxdWFuZG8gYSBkaXN0cmlidWnDp8OjbyDDqSBhc3NpbcOpdHJpY2EuIFtQYXJhIHRlc3RhciBkYWRvcyBxdWUgbsOjbyBlc3TDo28gbm9ybWFsbWVudGUgZGlzdHJpYnVdDQoNCg0KUmVwZXRpciBvIGV4cGVyaW1lbnRvDQpgYGB7cn0NCnNldC5zZWVkKDEyMykNCmBgYA0KR2VyYSBtaWwgdmFyacOhdmVpcyBub3JtYWxtZW50ZSBkaXN0cmlidWlkYXMNCmBgYHtyfQ0KeCA9IHJub3JtKDEwMDApDQp4DQpgYGANCkdyw6FmaWNvIFFRDQpgYGB7cn0NCiNyb2RhciBjb20gQ3RybCtzaGlmdCtlbnRlcg0KcXFub3JtKHgpDQpxcWxpbmUoeCkNCmhpc3QoeCkNCmBgYA0KDQpUZXN0ZSBkZSBTaGFwaXJvOnRlbSBjb21vIG9iamV0aXZvIGF2YWxpYXIgc2UgdW1hIGRpc3RyaWJ1acOnw6NvIMOpIHNlbWVsaGFudGUgYSB1bWEgZGlzdHJpYnVpw6fDo28gbm9ybWFsLiBBIGRpc3RyaWJ1acOnw6NvIG5vcm1hbCB0YW1iw6ltIHBvZGUgc2VyIGNoYW1hZGEgZGUgZ2F1c3NpYW5hIGUgc3VhIGZvcm1hIGFzc2VtZWxoYS1zZSBhIGRlIHVtIHNpbm8uIEVzc2UgdGlwbyBkZSBkaXN0cmlidWnDp8OjbyDDqSBtdWl0byBpbXBvcnRhbnRlLCBwb3Igc2VyIGZyZXF1ZW50ZW1lbnRlIHVzYWRhIHBhcmEgbW9kZWxhciBmZW7DtG1lbm9zIG5hdHVyYWlzLg0KDQpWYWxvciBkZSBwIGFjaW1hIGRlIDAsMDUsIG7Do28gaMOhIGluZMOtY2lvIHBhcmEgYSBuw6NvIGNvbmZpcm1hciBhIGhpcMOzdGVzZSBudWxhIGRlIGRhZG9zIG5vcm1hbG1lbnRlIGRpc3RyaWJ1aWRvcw0KYGBge3J9DQpzaGFwaXJvLnRlc3QoeCkgDQpgYGANCg0KSGlzdG9ncmFtYSBjb20gbGluaGEgZGUgZGVuc2lkYWRlDQpgYGB7cn0NCiNyb2RhciBjb20gQ3RybCtzaGlmdCtlbnRlcg0KaGlzdCh4LCBtYWluPSIiKQ0KcGFyKG5ldz1UUlVFKQ0KcGxvdChkZW5zaXR5KHgpLHlsYWIgPSAiIiwgeGxhYiA9ICIiLCBheGVzPUYsIGx3ZD0yLjUgKSANCmBgYA0KRGFkb3MgbsOjbyBub3JtYWxtZW50ZSBkaXN0cmlidWlkb3MNCmBgYHtyfQ0KI3JvZGFyIGNvbSBDdHJsK3NoaWZ0K2VudGVyDQojaW5zdGFsbC5wYWNrYWdlcygic2VtVG9vbHMiKQ0KbGlicmFyeShzZW1Ub29scykNCm0gPSBtdnJub25ub3JtKDEwMDAsIGMoMSwgMiksIG1hdHJpeChjKDEwLCAyLCAyLCA1KSwgMiwgMiksDQogICAgICAgICAgICAgICAgIHNrZXduZXNzID0gYyg1LCAyKSwga3VydG9zaXMgPSBjKDMsIDMpKQ0KcXFub3JtKG0pDQpxcWxpbmUobSkNCmBgYA0KDQoNCmBgYHtyfQ0Kc2hhcGlyby50ZXN0KG0pDQpgYGANCg0KRGFkb3MgcXVlIG7Do28gbGVtYnJhbSBlbSBuYWRhIHVtYSBkaXN0cmlidWnDp8OjbyBub3JtYWwNCmBgYHtyfQ0KI3JvZGFyIGNvbSBDdHJsK3NoaWZ0K2VudGVyDQpoaXN0KG0sIG1haW49IiIpDQpwYXIobmV3PVRSVUUpDQpwbG90KGRlbnNpdHkobSkseWxhYiA9ICIiLCB4bGFiID0gIiIsIGF4ZXM9RiwgbHdkPTIuNSApIA0KYGBgDQoNCmBgYHtyfQ0Kc2hhcGlyby50ZXN0KG0pDQpgYGANClhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWA0KWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWA0KDQpQZXF1ZW5hcyBlIEdyYW5kZXMgQW1vc3RyYXMgRXNwZXJhLXNlIHVtYSBtw6lkaWEgZGUgMyw1Lg0KDQpBbW9zdHJhIHBlcXVlbmENCmBgYHtyfQ0KeCA9IHNhbXBsZSgxOjYsNixyZXBsYWNlID0gVCkNCm1lYW4oeCkNCmBgYA0KQW1vc3RyYSBncmFuZGUNCmBgYHtyfQ0KeCA9IHNhbXBsZSgxOjYsMTAwMDAscmVwbGFjZSA9IFQpDQptZWFuKHgpDQoNCmBgYA0KDQpYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFgNCg0KDQoNCg0KDQoNCg0KDQo=