# librarias
library(nortest)
library(corrplot)
library(car)
library(ellipse)
library(mvnormalTest)
library(ACSWR)
- O objeto
air_polution contém 42 observações de 7
variáveis sobre a poluição de ar registradas às 12:00 PM em Los Angeles
em diferentes dias. Com os dados sobre a poluição do ar examine a
suposição de normalidade bivariada para o par de variáveis \(X_5\) = NO2 e \(X_6\) = O3.
- Examine a normalidade univariada de \(X_5\) e \(X_6\).
- Calcule as formas quadráticas \(d_i^2 =
(\mathbf{x}_i - \mathbf{\bar{x}})^\top \mathbf{S}^{-1}(\mathbf{x}_i -
\mathbf{\bar{x}})\), \(i = 1,\ldots,
42\), \(\mathbf{x}_j^\top =
[x_{i5},x_{i6}]\) e construa um Q-Q plot apropriado para a forma
quadrática \(d^2\). A suposição de
normalidade bivariada para os dados é razoável?
- Determine a proporção de observações de \(\mathbf{x}_i^\top = [x_{i5},x_{i6}]\),
\(i = 1,\ldots, 42\) dentro do gráfico
de contorno de uma normal bivariada com uma probabilidade de 50%.
air_pollution <- read.table("~/Documents/Cursos_GET_UFF/20241GET00126A1/Datasets/air_pollution.dat")
colnames(air_pollution) <- c("wind","solar_radiation","CO","NO","NO2","O3","HC")
head(air_pollution)
air_pollution_56 <- air_pollution[,c(5,6)]
pairs(air_pollution_56, pch = 19)

boxplot(air_pollution_56, pch = 19)

par(mfrow=c(2,2))
nvar <- ncol(air_pollution_56)
nomes <- names(air_pollution_56)
for (i in 1:ncol(air_pollution_56)) {
hist(air_pollution_56[,i], main = paste("Histograma de",nomes[i]), xlab = paste(nomes[i]))
plot(density(air_pollution_56[,i]), main = paste("Densidade de",nomes[i]))
}

par(mfrow=c(1,2))
for (j in 1:nvar)
{
qqPlot(scale(air_pollution_56[,j]),dist="norm",mean=0,sd=1,col.lines=1,grid="FALSE",
xlab="quantil da N(0,1)",ylab=nomes[j],cex=1.2,pch=20,id=FALSE)
}

# Shapiro Wilks Test
shapiro.test(air_pollution_56[,1])
Shapiro-Wilk normality test
data: air_pollution_56[, 1]
W = 0.93004, p-value = 0.013
shapiro.test(air_pollution_56[,2])
Shapiro-Wilk normality test
data: air_pollution_56[, 2]
W = 0.89603, p-value = 0.001098
n <- nrow(air_pollution_56)
nvar <- ncol(air_pollution_56)
vmu <- colMeans(air_pollution_56)
mcov <- cov(air_pollution_56)
# forma quadrática
d2 <- n*mahalanobis(air_pollution_56,center=vmu,cov=mcov)
qqPlot(d2,dist="chisq",df=nvar,col.lines=1,grid="FALSE",
xlab="quantil da distribuição qui-quadrado",
ylab="d2",
cex=1.2,
pch = 20,
id = FALSE)

Mardia_Test<-mardia(air_pollution_56)
Mardia_Test$mv.test
rho <- cor(air_pollution_56)
var <- diag(mcov)
i=1;j=2
plot(ellipse::ellipse(x = rho[i,j],
scale = c(sqrt(var[i]),sqrt(var[j])),
centre = c(vmu[i],vmu[j]),
level = 0.5
),
type = "l",
xlab = nomes[i],
ylab = nomes[j])
lines(vmu[i],vmu[j], pch = 8, col = "red", type = "p")
points(air_pollution_56[,i],air_pollution_56[,j],
pch=20,
cex=1.2,
cex.lab=1.2,
cex.axis=1.2,
col="darkgreen")

- Um ecologista de vida selvagem, mediu \(x_1\): comprimento do cauda
(
tail_length) em milimetros e \(x_2\): comprimento das asas
(wing_length) em milimetros em uma amostra de 45 aves
fêmeas da especie hook-billed kites (Gavião-caracoleiro em
português). As observações estão armazenadas no objeto
birds_data.
- Examine a normalidade univariada das variáveis \(X_1\):
tail_length e \(X_2\) = wing_length.
- Examine a normalidade bivariada de \([X_1,X_2]^\top\). É um modelo viável para
\([X_1,X_2]^\top\)?
- Suponha que é sabido que \(\mu_1\)
= 190 mm e \(\mu_2\) = 275 mm para
machos da espécie hook-billed kites. São esses valores
razoáveis para o comprimento médio da cauda e o comprimento médio das
assas para aves fêmeas? Explique.
birds_data<- read.table("~/Documents/Cursos_GET_UFF/20241GET00126A1/Datasets/birds.dat")
colnames(birds_data) <- c("tail_length","wing_length")
- O objeto
psy_profile_data consiste de 130 observações
geradas por pontuações (scores) de um teste psicológico
administrado em adolescentes peruanos (15, 16 e 17 anos de idade). Para
cada adolescente o sexo [gender (masc. = 1 , fem. = 2)] e estado
socioeconômico [socio (baixo = 1, médio = 2)] também foi registrado. As
pontuações foram acumuladas em 5 subescalas rotuladas como:
independência (indep), suporte (supp), benevolência (benev),
conformidade (conform), e liderança (leader).
- Examine a normalidade univariada de cada uma das seguintes
variáveis:
indep, supp, benev,
conform, e leader.
- Usando todas as 5 variáveis, verifique a suposição de normalidade
multivariada.
- Construa uma elipse de 99% de confiança para cada par de
variáveis.
- Assumindo normalidade multivariada. Determine os comprimentos e
direções dos eixos do ellipsóide de 95% de confiança para \(\mathbf{\mu}\).
psy_profile_data <- read.table("~/Documents/Cursos_GET_UFF/20241GET00126A1/Datasets/psy_profile.dat")
colnames(psy_profile_data) <- c("indep","supp","benev","conform","leader","gender","socio")
head(psy_profile_data)
- Um estudo psicológico formado por 4 testes foi conduzido em 32
mulheres e 32 homens. As pontuações de cada teste para cada indivíduo
foram coletadas em um vetor [
pict,
formas,brinqu,vocab]. As
componentes são descritas a seguir:
pict: score obtido no teste de inconsistência
pictoriais,
formas: score obtido no teste de placas de formas,
brinqu: score obtido no teste de reconhecimento de
brinquedos,
vocab: score obtido no teste de vocabulário.
Um dos interesses do estudo é saber se o vetor de médias das
pontuações dos testes é o mesmo para homens e mulheres. Para isso
conduza um teste de hipóteses apropriado. Não esqueça de checar todas as
suposições.
data(mfp)
homens = mfp[,1:4]
mulheres = mfp[,5:8]
colnames(homens) <- c("pict", "formas", "brinqu", "vocab")
colnames(mulheres) <- c("pict", "formas", "brinqu", "vocab")
psy_tests <- rbind(homens,mulheres)
sexo <- rbind(matrix("M",nrow = 32),matrix("F",nrow=32))
psy_tests$sexo <- sexo
head(psy_tests)
n1 <- nrow(homens); n2 <- nrow(mulheres); p <- ncol(mulheres)
m1 <- matrix(colMeans(homens),ncol = 1); m2 <- matrix(colMeans(mulheres),ncol = 1)
S1 <- var(homens); S2 <- var(mulheres)
Spl <- (1/(n1+n2-2))*((n1-1)*S1 + (n2-1)*S2); invSpl <- solve(Spl)
t2_calc <- ((n1*n2)/(n1+n2))*t(m1 - m2)%*%invSpl%*%(m1-m2)
f_calc <- (n1+n2-1-p)/((n1+n2-2)*p)*t2calc
p_valor <- pf(fcalc,df1=p,df2 = n1+n2-p-1,lower.tail = FALSE)
data.frame(t2_calc,f_calc,p_valor)
LS0tCnRpdGxlOiAiQXVsYSBQcsOhdGljYSAxIChHRVQwMDEyNikgLSBOb3JtYWwgTXVsdGl2YXJpYWRhIgpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sKLS0tCgpgYGB7ciBzZXR1cCwgd2FybmluZz1GQUxTRSwgbWVzc2FnZT1GQUxTRX0KIyBsaWJyYXJpYXMKbGlicmFyeShub3J0ZXN0KQpsaWJyYXJ5KGNvcnJwbG90KQpsaWJyYXJ5KGNhcikKbGlicmFyeShlbGxpcHNlKQpsaWJyYXJ5KG12bm9ybWFsVGVzdCkKbGlicmFyeShBQ1NXUikKYGBgCgoKMS4gTyBvYmpldG8gYGFpcl9wb2x1dGlvbmAgY29udMOpbSA0MiBvYnNlcnZhw6fDtWVzIGRlIDcgdmFyacOhdmVpcyBzb2JyZSBhIHBvbHVpw6fDo28gZGUgYXIgcmVnaXN0cmFkYXMgw6BzIDEyOjAwIFBNIGVtIExvcyBBbmdlbGVzIGVtIGRpZmVyZW50ZXMgZGlhcy4gCkNvbSBvcyBkYWRvcyBzb2JyZSBhIHBvbHVpw6fDo28gZG8gYXIgZXhhbWluZSBhIHN1cG9zacOnw6NvIGRlIG5vcm1hbGlkYWRlIGJpdmFyaWFkYSBwYXJhIG8gcGFyIGRlIHZhcmnDoXZlaXMgJFhfNSQgPSBOTzIgZSAkWF82JCA9IE8zLgoKYS4gRXhhbWluZSBhIG5vcm1hbGlkYWRlIHVuaXZhcmlhZGEgZGUgJFhfNSQgZSAkWF82JC4gCmIuIENhbGN1bGUgYXMgZm9ybWFzIHF1YWRyw6F0aWNhcyAkZF9pXjIgPSAoXG1hdGhiZnt4fV9pIC0gXG1hdGhiZntcYmFye3h9fSleXHRvcCBcbWF0aGJme1N9XnstMX0oXG1hdGhiZnt4fV9pIC0gXG1hdGhiZntcYmFye3h9fSkkLCAkaSA9IDEsXGxkb3RzLCA0MiQsICRcbWF0aGJme3h9X2peXHRvcCA9IFt4X3tpNX0seF97aTZ9XSQgZSBjb25zdHJ1YSB1bSBRLVEgcGxvdCBhcHJvcHJpYWRvIHBhcmEgYSBmb3JtYSBxdWFkcsOhdGljYSAkZF4yJC4gQSBzdXBvc2nDp8OjbyBkZSBub3JtYWxpZGFkZSBiaXZhcmlhZGEgcGFyYSBvcyBkYWRvcyDDqSByYXpvw6F2ZWw/CmMuIERldGVybWluZSBhIHByb3BvcsOnw6NvIGRlIG9ic2VydmHDp8O1ZXMgZGUgJFxtYXRoYmZ7eH1faV5cdG9wID0gW3hfe2k1fSx4X3tpNn1dJCwgJGkgPSAxLFxsZG90cywgNDIkIGRlbnRybyBkbyBncsOhZmljbyBkZSBjb250b3JubyBkZSB1bWEgbm9ybWFsIGJpdmFyaWFkYSBjb20gdW1hIHByb2JhYmlsaWRhZGUgZGUgNTAlLgoKCgpgYGB7cn0KYWlyX3BvbGx1dGlvbiA8LSByZWFkLnRhYmxlKCJ+L0RvY3VtZW50cy9DdXJzb3NfR0VUX1VGRi8yMDI0MUdFVDAwMTI2QTEvRGF0YXNldHMvYWlyX3BvbGx1dGlvbi5kYXQiKQpjb2xuYW1lcyhhaXJfcG9sbHV0aW9uKSA8LSBjKCJ3aW5kIiwic29sYXJfcmFkaWF0aW9uIiwiQ08iLCJOTyIsIk5PMiIsIk8zIiwiSEMiKQpoZWFkKGFpcl9wb2xsdXRpb24pCmBgYAoKYGBge3J9CmFpcl9wb2xsdXRpb25fNTYgPC0gYWlyX3BvbGx1dGlvblssYyg1LDYpXQpwYWlycyhhaXJfcG9sbHV0aW9uXzU2LCBwY2ggPSAxOSkKYGBgCmBgYHtyfQpib3hwbG90KGFpcl9wb2xsdXRpb25fNTYsIHBjaCA9IDE5KQpgYGAKCmBgYHtyfQpwYXIobWZyb3c9YygyLDIpKQpudmFyICA8LSBuY29sKGFpcl9wb2xsdXRpb25fNTYpCm5vbWVzIDwtIG5hbWVzKGFpcl9wb2xsdXRpb25fNTYpCmZvciAoaSBpbiAxOm5jb2woYWlyX3BvbGx1dGlvbl81NikpIHsKICBoaXN0KGFpcl9wb2xsdXRpb25fNTZbLGldLCBtYWluID0gcGFzdGUoIkhpc3RvZ3JhbWEgZGUiLG5vbWVzW2ldKSwgeGxhYiA9IHBhc3RlKG5vbWVzW2ldKSkKICBwbG90KGRlbnNpdHkoYWlyX3BvbGx1dGlvbl81NlssaV0pLCBtYWluID0gcGFzdGUoIkRlbnNpZGFkZSBkZSIsbm9tZXNbaV0pKQp9CmBgYApgYGB7cn0KcGFyKG1mcm93PWMoMSwyKSkKZm9yIChqIGluIDE6bnZhcikKewogIHFxUGxvdChzY2FsZShhaXJfcG9sbHV0aW9uXzU2WyxqXSksZGlzdD0ibm9ybSIsbWVhbj0wLHNkPTEsY29sLmxpbmVzPTEsZ3JpZD0iRkFMU0UiLAogICAgICAgICB4bGFiPSJxdWFudGlsIGRhIE4oMCwxKSIseWxhYj1ub21lc1tqXSxjZXg9MS4yLHBjaD0yMCxpZD1GQUxTRSkKfQpgYGAKCmBgYHtyfQojIFNoYXBpcm8gV2lsa3MgVGVzdApzaGFwaXJvLnRlc3QoYWlyX3BvbGx1dGlvbl81NlssMV0pCnNoYXBpcm8udGVzdChhaXJfcG9sbHV0aW9uXzU2WywyXSkKYGBgCgoKYGBge3J9Cm4gPC0gbnJvdyhhaXJfcG9sbHV0aW9uXzU2KQpudmFyIDwtIG5jb2woYWlyX3BvbGx1dGlvbl81NikKdm11IDwtIGNvbE1lYW5zKGFpcl9wb2xsdXRpb25fNTYpCm1jb3YgPC0gY292KGFpcl9wb2xsdXRpb25fNTYpCiMgZm9ybWEgcXVhZHLDoXRpY2EKZDIgPC0gbiptYWhhbGFub2JpcyhhaXJfcG9sbHV0aW9uXzU2LGNlbnRlcj12bXUsY292PW1jb3YpCnFxUGxvdChkMixkaXN0PSJjaGlzcSIsZGY9bnZhcixjb2wubGluZXM9MSxncmlkPSJGQUxTRSIsCiAgICAgICB4bGFiPSJxdWFudGlsIGRhIGRpc3RyaWJ1acOnw6NvIHF1aS1xdWFkcmFkbyIsCiAgICAgICB5bGFiPSJkMiIsCiAgICAgICBjZXg9MS4yLCAKICAgICAgIHBjaCA9IDIwLAogICAgICAgaWQgPSBGQUxTRSkKYGBgCmBgYHtyfQpNYXJkaWFfVGVzdDwtbWFyZGlhKGFpcl9wb2xsdXRpb25fNTYpCk1hcmRpYV9UZXN0JG12LnRlc3QKYGBgCgpgYGB7cn0KcmhvIDwtIGNvcihhaXJfcG9sbHV0aW9uXzU2KQp2YXIgPC0gZGlhZyhtY292KQppPTE7aj0yCnBsb3QoZWxsaXBzZTo6ZWxsaXBzZSh4ID0gcmhvW2ksal0sCiAgICAgICAgICAgICAgICAgICAgICBzY2FsZSA9IGMoc3FydCh2YXJbaV0pLHNxcnQodmFyW2pdKSksCiAgICAgICAgICAgICAgICAgICAgICBjZW50cmUgPSBjKHZtdVtpXSx2bXVbal0pLAogICAgICAgICAgICAgICAgICAgICAgbGV2ZWwgPSAwLjUKICAgICAgICAgICAgICAgICAgICAgICksCiAgICAgdHlwZSA9ICJsIiwKICAgICB4bGFiID0gbm9tZXNbaV0sCiAgICAgeWxhYiA9IG5vbWVzW2pdKQpsaW5lcyh2bXVbaV0sdm11W2pdLCBwY2ggPSA4LCBjb2wgPSAicmVkIiwgdHlwZSA9ICJwIikKcG9pbnRzKGFpcl9wb2xsdXRpb25fNTZbLGldLGFpcl9wb2xsdXRpb25fNTZbLGpdLAogICAgICAgcGNoPTIwLAogICAgICAgY2V4PTEuMiwKICAgICAgIGNleC5sYWI9MS4yLAogICAgICAgY2V4LmF4aXM9MS4yLAogICAgICAgY29sPSJkYXJrZ3JlZW4iKQpgYGAKCgoKMi4gVW0gZWNvbG9naXN0YSBkZSB2aWRhIHNlbHZhZ2VtLCBtZWRpdSAkeF8xJDogY29tcHJpbWVudG8gZG8gY2F1ZGEgKGB0YWlsX2xlbmd0aGApIGVtIG1pbGltZXRyb3MgIGUgJHhfMiQ6IGNvbXByaW1lbnRvIGRhcyBhc2FzIChgd2luZ19sZW5ndGhgKSBlbSBtaWxpbWV0cm9zIGVtIHVtYSBhbW9zdHJhIGRlIDQ1IGF2ZXMgZsOqbWVhcyBkYSBlc3BlY2llICpob29rLWJpbGxlZCBraXRlcyogKEdhdmnDo28tY2FyYWNvbGVpcm8gZW0gcG9ydHVndcOqcykuIEFzIG9ic2VydmHDp8O1ZXMgZXN0w6NvIGFybWF6ZW5hZGFzIG5vIG9iamV0byBgYmlyZHNfZGF0YWAuCgphLiBFeGFtaW5lIGEgbm9ybWFsaWRhZGUgdW5pdmFyaWFkYSBkYXMgdmFyacOhdmVpcyAkWF8xJDogYHRhaWxfbGVuZ3RoYCBlICRYXzIkID0gYHdpbmdfbGVuZ3RoYC4KYi4gRXhhbWluZSBhIG5vcm1hbGlkYWRlIGJpdmFyaWFkYSBkZSAkW1hfMSxYXzJdXlx0b3AkLiDDiSB1bSBtb2RlbG8gdmnDoXZlbCBwYXJhICRbWF8xLFhfMl1eXHRvcCQ/CmMuIFN1cG9uaGEgcXVlIMOpIHNhYmlkbyBxdWUgJFxtdV8xJCA9IDE5MCBtbSBlICRcbXVfMiQgPSAyNzUgbW0gcGFyYSBtYWNob3MgZGEgZXNww6ljaWUgKmhvb2stYmlsbGVkIGtpdGVzKi4gU8OjbyBlc3NlcyB2YWxvcmVzIHJhem/DoXZlaXMgcGFyYSBvIGNvbXByaW1lbnRvIG3DqWRpbyBkYSBjYXVkYSBlIG8gY29tcHJpbWVudG8gbcOpZGlvIGRhcyBhc3NhcyBwYXJhIGF2ZXMgZsOqbWVhcz8gRXhwbGlxdWUuIAoKCmBgYHtyfQpiaXJkc19kYXRhPC0gcmVhZC50YWJsZSgifi9Eb2N1bWVudHMvQ3Vyc29zX0dFVF9VRkYvMjAyNDFHRVQwMDEyNkExL0RhdGFzZXRzL2JpcmRzLmRhdCIpCmNvbG5hbWVzKGJpcmRzX2RhdGEpIDwtIGMoInRhaWxfbGVuZ3RoIiwid2luZ19sZW5ndGgiKQpgYGAKCgozLiBPIG9iamV0byBgcHN5X3Byb2ZpbGVfZGF0YWAgY29uc2lzdGUgZGUgMTMwIG9ic2VydmHDp8O1ZXMgZ2VyYWRhcyBwb3IgcG9udHVhw6fDtWVzICgqc2NvcmVzKikgZGUgdW0gdGVzdGUgcHNpY29sw7NnaWNvIGFkbWluaXN0cmFkbyBlbSBhZG9sZXNjZW50ZXMgcGVydWFub3MgKDE1LCAxNiBlIDE3IGFub3MgZGUgaWRhZGUpLiBQYXJhIGNhZGEgYWRvbGVzY2VudGUgbyBzZXhvIFtnZW5kZXIgKG1hc2MuID0gMSAsIGZlbS4gPSAyKV0gZSBlc3RhZG8gc29jaW9lY29uw7RtaWNvIFtzb2NpbyAoYmFpeG8gPSAxLCBtw6lkaW8gPSAyKV0gdGFtYsOpbSBmb2kgcmVnaXN0cmFkby4gQXMgcG9udHVhw6fDtWVzIGZvcmFtIGFjdW11bGFkYXMgZW0gNSBzdWJlc2NhbGFzIHJvdHVsYWRhcyBjb21vOiBpbmRlcGVuZMOqbmNpYSAoaW5kZXApLCBzdXBvcnRlIChzdXBwKSwgYmVuZXZvbMOqbmNpYSAoYmVuZXYpLCBjb25mb3JtaWRhZGUgKGNvbmZvcm0pLCBlIGxpZGVyYW7Dp2EgKGxlYWRlcikuIAoKKGEpIEV4YW1pbmUgYSBub3JtYWxpZGFkZSB1bml2YXJpYWRhIGRlIGNhZGEgdW1hIGRhcyBzZWd1aW50ZXMgdmFyacOhdmVpczogYGluZGVwYCwgYHN1cHBgLCBgYmVuZXZgLCBgY29uZm9ybWAsIGUgYGxlYWRlcmAuCihiKSBVc2FuZG8gdG9kYXMgYXMgNSB2YXJpw6F2ZWlzLCB2ZXJpZmlxdWUgYSBzdXBvc2nDp8OjbyBkZSBub3JtYWxpZGFkZSBtdWx0aXZhcmlhZGEuIAooYykgQ29uc3RydWEgdW1hIGVsaXBzZSBkZSA5OSUgZGUgY29uZmlhbsOnYSBwYXJhIGNhZGEgcGFyIGRlIHZhcmnDoXZlaXMuCihkKSBBc3N1bWluZG8gbm9ybWFsaWRhZGUgbXVsdGl2YXJpYWRhLiBEZXRlcm1pbmUgb3MgY29tcHJpbWVudG9zIGUgZGlyZcOnw7VlcyBkb3MgZWl4b3MgZG8gZWxsaXBzw7NpZGUgZGUgOTUlIGRlIGNvbmZpYW7Dp2EgcGFyYSAkXG1hdGhiZntcbXV9JC4KCgoKYGBge3J9CnBzeV9wcm9maWxlX2RhdGEgPC0gcmVhZC50YWJsZSgifi9Eb2N1bWVudHMvQ3Vyc29zX0dFVF9VRkYvMjAyNDFHRVQwMDEyNkExL0RhdGFzZXRzL3BzeV9wcm9maWxlLmRhdCIpCmNvbG5hbWVzKHBzeV9wcm9maWxlX2RhdGEpIDwtIGMoImluZGVwIiwic3VwcCIsImJlbmV2IiwiY29uZm9ybSIsImxlYWRlciIsImdlbmRlciIsInNvY2lvIikKaGVhZChwc3lfcHJvZmlsZV9kYXRhKQpgYGAKCjQuIFVtIGVzdHVkbyBwc2ljb2zDs2dpY28gZm9ybWFkbyBwb3IgNCB0ZXN0ZXMgZm9pIGNvbmR1emlkbyBlbSAzMiBtdWxoZXJlcyBlIDMyIGhvbWVucy4gQXMgcG9udHVhw6fDtWVzIGRlIGNhZGEgdGVzdGUgcGFyYSBjYWRhIGluZGl2w61kdW8gZm9yYW0gY29sZXRhZGFzIGVtIHVtIHZldG9yIFtgcGljdGAsIGBmb3JtYXNgLGBicmlucXVgLGB2b2NhYmBdLiBBcyBjb21wb25lbnRlcyBzw6NvIGRlc2NyaXRhcyBhIHNlZ3VpcjoKCi0gYHBpY3RgOiBzY29yZSBvYnRpZG8gbm8gdGVzdGUgZGUgaW5jb25zaXN0w6puY2lhIHBpY3RvcmlhaXMsIAotIGBmb3JtYXNgOiBzY29yZSBvYnRpZG8gbm8gdGVzdGUgZGUgcGxhY2FzIGRlIGZvcm1hcywgCi0gYGJyaW5xdWA6IHNjb3JlIG9idGlkbyBubyB0ZXN0ZSBkZSByZWNvbmhlY2ltZW50byBkZSBicmlucXVlZG9zLCAKLSBgdm9jYWJgOiBzY29yZSBvYnRpZG8gbm8gdGVzdGUgZGUgdm9jYWJ1bMOhcmlvLiAgCgpVbSBkb3MgaW50ZXJlc3NlcyBkbyBlc3R1ZG8gw6kgc2FiZXIgc2UgbyB2ZXRvciBkZSBtw6lkaWFzIGRhcyBwb250dWHDp8O1ZXMgZG9zIHRlc3RlcyDDqSBvIG1lc21vIHBhcmEgaG9tZW5zIGUgbXVsaGVyZXMuIFBhcmEgaXNzbyBjb25kdXphIHVtIHRlc3RlIGRlIGhpcMOzdGVzZXMgYXByb3ByaWFkby4gTsOjbyBlc3F1ZcOnYSBkZSBjaGVjYXIgdG9kYXMgYXMgc3Vwb3Npw6fDtWVzLiAKCgpgYGB7cn0KZGF0YShtZnApCmhvbWVucyA9IG1mcFssMTo0XQptdWxoZXJlcyA9IG1mcFssNTo4XQpjb2xuYW1lcyhob21lbnMpIDwtIGMoInBpY3QiLCAiZm9ybWFzIiwgImJyaW5xdSIsICJ2b2NhYiIpCmNvbG5hbWVzKG11bGhlcmVzKSA8LSBjKCJwaWN0IiwgImZvcm1hcyIsICJicmlucXUiLCAidm9jYWIiKQpwc3lfdGVzdHMgPC0gcmJpbmQoaG9tZW5zLG11bGhlcmVzKQpzZXhvIDwtIHJiaW5kKG1hdHJpeCgiTSIsbnJvdyA9IDMyKSxtYXRyaXgoIkYiLG5yb3c9MzIpKQpwc3lfdGVzdHMkc2V4byA8LSBzZXhvCmhlYWQocHN5X3Rlc3RzKQpgYGAKYGBge3J9Cm4xICA8LSBucm93KGhvbWVucyk7IG4yIDwtIG5yb3cobXVsaGVyZXMpOyBwIDwtIG5jb2wobXVsaGVyZXMpCm0xICA8LSBtYXRyaXgoY29sTWVhbnMoaG9tZW5zKSxuY29sID0gMSk7IG0yIDwtIG1hdHJpeChjb2xNZWFucyhtdWxoZXJlcyksbmNvbCA9IDEpIApTMSAgPC0gdmFyKGhvbWVucyk7IFMyIDwtIHZhcihtdWxoZXJlcykKU3BsIDwtICgxLyhuMStuMi0yKSkqKChuMS0xKSpTMSArIChuMi0xKSpTMik7IGludlNwbCA8LSBzb2x2ZShTcGwpCnQyX2NhbGMgPC0gKChuMSpuMikvKG4xK24yKSkqdChtMSAtIG0yKSUqJWludlNwbCUqJShtMS1tMikKZl9jYWxjICA8LSAobjErbjItMS1wKS8oKG4xK24yLTIpKnApKnQyY2FsYwpwX3ZhbG9yIDwtIHBmKGZjYWxjLGRmMT1wLGRmMiA9IG4xK24yLXAtMSxsb3dlci50YWlsID0gRkFMU0UpCmRhdGEuZnJhbWUodDJfY2FsYyxmX2NhbGMscF92YWxvcikKYGBgCgoKCgoK