Cargo Paquetes
library("tidyverse")
library("ggthemes")
library("ggplot2")
install.packages("nortest")
Error in install.packages : Updating loaded packages
library("nortest")
Abro mi df4
df5 <- read.csv("suma por areas y total.csv", header = TRUE, sep=",")
str(df5)
'data.frame': 34 obs. of 14 variables:
$ Centro.Salud: Factor w/ 3 levels "Externo ","Paillaco",..: 2 2 2 2 2 2 2 2 2 2 ...
$ Sexo : Factor w/ 2 levels "F","M": 1 1 2 1 1 1 1 1 2 2 ...
$ HOC1 : int 15 15 14 12 13 8 12 15 13 12 ...
$ CFC1 : int 12 17 14 13 19 13 16 12 19 17 ...
$ AEC1 : int 15 15 3 15 15 14 12 14 12 13 ...
$ TOTALC1 : int 42 47 31 40 47 35 40 41 44 42 ...
$ HOC2 : int 15 13 13 11 11 8 14 12 15 9 ...
$ CFC2 : int 14 18 20 16 18 18 20 18 19 20 ...
$ AEC2 : int 15 15 13 12 12 14 14 14 15 14 ...
$ TOTALC2 : int 44 46 46 39 41 40 48 44 49 43 ...
$ HOC3 : int 12 12 14 12 9 10 11 12 14 13 ...
$ CFC3 : int 14 18 19 17 20 16 17 20 18 20 ...
$ AEC3 : int 15 15 14 14 14 15 13 13 14 13 ...
$ TOTALC3 : int 41 45 47 43 43 41 41 45 46 46 ...
summary(df5)
Centro.Salud Sexo HOC1 CFC1 AEC1 TOTALC1
Externo :13 F:21 Min. : 6.00 Min. : 6.00 Min. : 3.00 Min. :22.00
Paillaco:17 M:13 1st Qu.:10.00 1st Qu.:12.25 1st Qu.:11.25 1st Qu.:35.00
Privado : 4 Median :11.00 Median :15.00 Median :12.50 Median :39.00
Mean :11.26 Mean :14.47 Mean :12.21 Mean :37.94
3rd Qu.:13.00 3rd Qu.:17.00 3rd Qu.:14.75 3rd Qu.:43.00
Max. :15.00 Max. :19.00 Max. :15.00 Max. :48.00
HOC2 CFC2 AEC2 TOTALC2 HOC3 CFC3
Min. : 4.00 Min. : 9.00 Min. : 6.00 Min. :24.00 "print" Min. : 8.00
1st Qu.:10.00 1st Qu.:14.25 1st Qu.:12.00 1st Qu.:37.25 1st Qu.: 9.25 1st Qu.:14.50
Median :11.00 Median :18.00 Median :14.00 Median :41.50 Median :12.00 Median :18.00
Mean :11.21 Mean :16.47 Mean :12.88 Mean :40.56 Mean :11.24 Mean :16.56
3rd Qu.:13.00 3rd Qu.:19.00 3rd Qu.:14.00 3rd Qu.:44.75 3rd Qu.:13.00 3rd Qu.:19.00
Max. :15.00 Max. :20.00 Max. :15.00 Max. :49.00 Max. :15.00 Max. :20.00
AEC3 TOTALC3
Min. : 5.00 Min. :20.00
1st Qu.:13.00 1st Qu.:38.00
Median :14.00 Median :43.00
Mean :13.29 Mean :41.09
3rd Qu.:15.00 3rd Qu.:46.00
Max. :15.00 Max. :50.00
agrego decimales para los calculos
options(digits=2)
Agrupo por centro de salud para el total de controles
df5 %>%
group_by(Centro.Salud) %>%
summarise(n = n(),
"Promedio(control1)" = mean(TOTALC1),
"SD(control1)" = sd(TOTALC1),
"min(control1)"= min(TOTALC1),
"max(control1)"=max(TOTALC1),
"Promedio(control2)" = mean(TOTALC2),
"SD(control2)" = sd(TOTALC2) ,
"min(control2)"=min(TOTALC2),
"max(control2)"=max(TOTALC2),
"Promedio(control3)" = mean(TOTALC3),
"SD(control3)" = sd(TOTALC3),
"min(control3)"=min(TOTALC3),
"max(control3"=max(TOTALC3))
Agrupo por Sexo para el total de los controles
df5 %>%
group_by(Sexo) %>%
summarise(n = n(),
"Promedio(control1)" = mean(TOTALC1),
"SD(control1)" = sd(TOTALC1),
"min(control1)"= min(TOTALC1),
"max(control1)"=max(TOTALC1),
"Promedio(control2)" = mean(TOTALC2),
"SD(control2)" = sd(TOTALC2) ,
"min(control2)"=min(TOTALC2),
"max(control2)"=max(TOTALC2),
"Promedio(control3)" = mean(TOTALC3),
"SD(control3)" = sd(TOTALC3),
"min(control3)"=min(TOTALC3),
"max(control3"=max(TOTALC3))
Calculo promedios y desviacion por centro de salud para cada uno de los controles del item higiene
df5 %>%
group_by(Centro.Salud) %>%
summarise(n = n(),
"PromedioOH(control1)" = mean(HOC1),
"SD OH(control1)" = sd(HOC1),
"PromedioOH(control2)" = mean(HOC2),
"SD OH(control2)" = sd(HOC2) ,
"Mean_OH(control3)" = mean(HOC3),
"SD OH(control3)" = sd(HOC3))
Calculo promedios y desviacion por centro de salud para cada uno de los controles del item confort
df5 %>%
group_by(Centro.Salud) %>%
summarise(n = n(),
"Promedio CF(control1)" = mean(CFC1),
"SD CF(control1)" = sd(CFC1),
"Promedio CF(control2)" = mean(CFC2),
"SD CF(control2)" = sd(CFC2) ,
"Mean CF(control3)" = mean(CFC3),
"SD CF(control3)" = sd(CFC3))
Calculo promedios y desviacion por centro de salud para cada uno de los controles del item autopercepcion estetica
df5 %>%
group_by(Centro.Salud) %>%
summarise(n = n(),
"Promedio AE(control1)" = mean(AEC1),
"SD AE(control1)" = sd(AEC1),
"Promedio AE(control2)" = mean(AEC2),
"SD AE(control2)" = sd(AEC2) ,
"Mean AE(control3)" = mean(AEC3),
"SD AE(control3)" = sd(AEC3))
Agrupo por sexo para cada uno de los controles del item higiene
df5 %>%
group_by(Sexo) %>%
summarise(n = n(),
"PromedioOH(control1)" = mean(HOC1),
"SD OH(control1)" = sd(HOC1),
"PromedioOH(control2)" = mean(HOC2),
"SD OH(control2)" = sd(HOC2) ,
"Mean_OH(control3)" = mean(HOC3),
"SD OH(control3)" = sd(HOC3))
Agrupo por sexo para cada uno de los controles del item confort
df5 %>%
group_by(Sexo) %>%
summarise(n = n(),
"Promedio CF(control1)" = mean(CFC1),
"SD CF(control1)" = sd(CFC1),
"Promedio CF(control2)" = mean(CFC2),
"SD CF(control2)" = sd(CFC2) ,
"Mean CF(control3)" = mean(CFC3),
"SD CF(control3)" = sd(CFC3))
Agrupo por sexo para cada uno de los controles del item autopercepcion
df5 %>%
group_by(Sexo) %>%
summarise(n = n(),
"Promedio AE(control1)" = mean(AEC1),
"SD AE(control1)" = sd(AEC1),
"Promedio AE(control2)" = mean(AEC2),
"SD AE(control2)" = sd(AEC2) ,
"Mean AE(control3)" = mean(AEC3),
"SD AE(control3)" = sd(AEC3))
Grafico para tipo de centro de salud y total del primer control
df5 %>%
ggplot(aes(x=Centro.Salud, y=TOTALC1, fill=Sexo)) +
scale_fill_manual(values=c("black", "blue")) +
geom_boxplot() +
geom_jitter() +
xlab("Centro de Salud") +
ylab("Puntaje encuesta") +
ggtitle("Puntaje total satisfaccion para primer control por centro de Salud") +
theme_economist() +
theme(legend.position = "right") +
scale_y_continuous(limits = c(0,50)) +
theme(axis.title.x = element_text(face="bold", vjust=-0.5, colour="black", size=rel(1))) +
theme(axis.title.y = element_text(face="bold", vjust=1.5, colour="black", size=rel(1))) +
scale_fill_discrete(name="Sexo", labels=c("Femenino","Masculino"))
Scale for 'fill' is already present. Adding another scale for 'fill', which will replace the
existing scale.
install.packages("nortest")
probando la URL 'https://cran.rstudio.com/bin/macosx/el-capitan/contrib/3.4/nortest_1.0-4.tgz'
Content type 'application/x-gzip' length 28699 bytes (28 KB)
==================================================
downloaded 28 KB
tar: Failed to set default locale
The downloaded binary packages are in
/var/folders/kk/vxjkvtsx4w13nnvfz58fmly40000gn/T//RtmpbAAv7n/downloaded_packages

Grafico para tipo de centro de salud y total del segundo control
df5 %>%
ggplot(aes(x=Centro.Salud, y=TOTALC2, fill=Sexo))+
geom_boxplot() +
geom_jitter() +
xlab("Centro de Salud") +
ylab("Puntaje encuesta") +
ggtitle("Puntaje total segundo control por centro de Salud") +
theme_economist() +
scale_y_continuous(limits = c(0,50))

Grafico para tipo de centro de salud y total del tercer control
df5 %>%
ggplot(aes(x=Centro.Salud, y=(TOTALC3), fill= Sexo)) +
geom_boxplot() +
geom_jitter() +
xlab("Centro de Salud") +
ylab("Puntaje encuesta") +
ggtitle("Puntaje total tercer control por centro de Salud") +
theme_economist() +
scale_y_continuous(limits = c(0,50))

Veo normalidad de mis datos
qqnorm(df5$TOTALC1, main = "Normalidad")

Shapito test para totalc1
shapiro.test(df5$TOTALC1)
Shapiro-Wilk normality test
data: df5$TOTALC1
W = 0.9, p-value = 0.02
test de anderson para totalC1
ad.test(df5$TOTALC1)
Anderson-Darling normality test
data: df5$TOTALC1
A = 0.8, p-value = 0.04
Existe diferencia entre centro de salud y la instalación en el primer control??
aov1 <- aov(df5$TOTALC1~df5$Centro.Salud)
summary(aov1)
Df Sum Sq Mean Sq F value Pr(>F)
df5$Centro.Salud 2 495 247.6 6.49 0.0044 **
Residuals 31 1183 38.2
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
TukeyHSD(aov1)
Tukey multiple comparisons of means
95% family-wise confidence level
Fit: aov(formula = df5$TOTALC1 ~ df5$Centro.Salud)
$`df5$Centro.Salud`
diff lwr upr p adj
Paillaco-Externo -0.36 -6 5.2 0.99
Privado-Externo -12.04 -21 -3.3 0.01
Privado-Paillaco -11.68 -20 -3.2 0.01
Lo mismo para prueba no parametrica
kruskal.test(df5$TOTALC1~df5$Centro.Salud)
Kruskal-Wallis rank sum test
data: df5$TOTALC1 by df5$Centro.Salud
Kruskal-Wallis chi-squared = 7, df = 2, p-value = 0.02
Existe diferencia entre centro de salud y la instalación en el segundo control??
aov2 <- aov(df5$TOTALC2~df5$Centro.Salud)
summary(aov2)
Df Sum Sq Mean Sq F value Pr(>F)
df5$Centro.Salud 2 261 130.7 3.78 0.034 *
Residuals 31 1071 34.5
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Lo mismo para prueba no parametrica
kruskal.test(df5$TOTALC2~df5$Centro.Salud)
Kruskal-Wallis rank sum test
data: df5$TOTALC2 by df5$Centro.Salud
Kruskal-Wallis chi-squared = 5, df = 2, p-value = 0.08
Existe diferencia entre centro de salud y la instalación en el segundo control??
aov3 <- aov(df5$TOTALC3~df5$Centro.Salud)
summary(aov3)
Df Sum Sq Mean Sq F value Pr(>F)
df5$Centro.Salud 2 101 50.3 1.06 0.36
Residuals 31 1478 47.7
Lo mismo para prueba no parametrica
kruskal.test(df5$TOTALC3~df5$Centro.Salud)
Kruskal-Wallis rank sum test
data: df5$TOTALC3 by df5$Centro.Salud
Kruskal-Wallis chi-squared = 1, df = 2, p-value = 0.6
Sumo por item los tres controles
df2 <- df5 %>%
mutate(SUMA_HO =HOC1 + HOC2 + HOC3, SUMA_CF= CFC1 + CFC2 + CFC3, SUMA_AE= AEC1 + AEC2 + AEC3)
Doy otra estructura a mi datos para los controles de higiene
long_df1 <- df2 %>%
select(Centro.Salud, Sexo, HOC1, HOC2,HOC3) %>%
gather(HOC1, HOC2,HOC3, key = "Higiene", value = "SUMA_HO")
Grafico item higiene oral (HO) por controles
long_df1 %>%
ggplot(aes(x=Higiene, y=SUMA_HO)) +
geom_boxplot() +
geom_jitter() +
xlab("Control por Higiene Oral") +
ylab("Puntaje HO") +
ggtitle("Puntaje de satisfaccion en HO") +
theme_economist() +
scale_y_continuous(limits = c(0,15))

Grafico item higiene oral (HO) por controles segun sexo

Existe diferencia entre el item de higiene y los diferentes controles ????
aov4 <- aov(long_df1$SUMA_HO~long_df1$Higiene)
summary(aov4)
Df Sum Sq Mean Sq F value Pr(>F)
long_df1$Higiene 2 0 0.03 0 1
Residuals 99 598 6.04
Lo mismo para no parametrico
kruskal.test(long_df1$Higiene~long_df1$SUMA_HO)
Kruskal-Wallis rank sum test
data: long_df1$Higiene by long_df1$SUMA_HO
Kruskal-Wallis chi-squared = 20, df = 10, p-value = 0.06
Doy otra estructura a mi datos para los controles confort
long_df2 <- df2 %>%
select(Centro.Salud, Sexo,CFC1, CFC2, CFC3) %>%
gather(CFC1, CFC2, CFC3, key = "Confort", value = "SUMA_CF")
Grafico item CF (confort) por controles
long_df2 %>%
ggplot(aes(x=Confort, y=SUMA_CF)) +
geom_boxplot() +
geom_jitter() +
xlab("Control por confort") +
ylab("Puntaje CF") +
ggtitle("Puntaje de satisfaccion en CF") +
theme_economist() +
scale_y_continuous(limits = c(0,20))

Grafico item CF (confort) por controles segun sexo

Existe diferencia entre el item de confort y los diferentes controles ????
aov5 <- aov(long_df2$SUMA_CF~long_df2$Confort)
summary(aov5)
Df Sum Sq Mean Sq F value Pr(>F)
long_df2$Confort 2 95 47.4 4.36 0.015 *
Residuals 99 1077 10.9
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Lo mismo para no parametricos
kruskal.test(long_df2$Confort~long_df2$SUMA_CF)
Kruskal-Wallis rank sum test
data: long_df2$Confort by long_df2$SUMA_CF
Kruskal-Wallis chi-squared = 20, df = 10, p-value = 0.3
Doy otra estructura a mi datos para los controles de autopercepcion
long_df3 <- df2 %>%
select(Centro.Salud, Sexo,AEC1, AEC2, AEC3) %>%
gather(AEC1, AEC2, AEC3, key = "Autopercepcion", value = "SUMA_AE")
Grafico item AE(autopercepcion estetica) por controles
long_df3 %>%
ggplot(aes(x=Autopercepcion, y=SUMA_AE)) +
geom_boxplot() +
geom_jitter() +
xlab("Control por autopercepcion") +
ylab("Puntaje AE") +
ggtitle("Puntaje de satisfaccion en AE") +
theme_economist() +
scale_y_continuous(limits = c(0,15))

Grafico item AE(autopercepcion estetica) por controles segun sexo

Grafico para autopercepcion por controles en barras pareadas
long_df3 %>%
ggplot(aes(x=Centro.Salud, y=Autopercepcion, fill= Autopercepcion)) +
geom_col() +
coord_flip() +
xlab("Centro de salud") +
ylab("Puntaje satisfaccion para autopercepcion") +
ggtitle("Puntaje de satisfaccion en AE en controles por centro de salud") +
theme_economist()

Existe diferencia entre el item de confort y los diferentes controles ????
aov6 <- aov(long_df3$SUMA_AE~long_df3$Autopercepcion)
summary(aov6)
Df Sum Sq Mean Sq F value Pr(>F)
long_df3$Autopercepcion 2 21 10.26 1.69 0.19
Residuals 99 600 6.06
Lo mismo para no parametricos
kruskal.test(long_df3$Autopercepcion~long_df3$SUMA_AE)
Kruskal-Wallis rank sum test
data: long_df3$Autopercepcion by long_df3$SUMA_AE
Kruskal-Wallis chi-squared = 10, df = 10, p-value = 0.4
LS0tCnRpdGxlOiAiMjAxN19TYXRpc2ZhY2Npb24gYnJhcXVldHMgb3J0b2RvbmNpYSIKb3V0cHV0OiBodG1sX25vdGVib29rCi0tLQoKIyBDYXJnbyBQYXF1ZXRlcwpgYGB7cn0KbGlicmFyeSgidGlkeXZlcnNlIikKbGlicmFyeSgiZ2d0aGVtZXMiKQpsaWJyYXJ5KCJnZ3Bsb3QyIikKaW5zdGFsbC5wYWNrYWdlcygibm9ydGVzdCIpCmxpYnJhcnkoIm5vcnRlc3QiKQpgYGAKI0Ficm8gbWkgZGY0CmBgYHtyfQpkZjUgPC0gcmVhZC5jc3YoInN1bWEgcG9yIGFyZWFzIHkgdG90YWwuY3N2IiwgaGVhZGVyID0gVFJVRSwgc2VwPSIsIikKc3RyKGRmNSkKc3VtbWFyeShkZjUpCmBgYAojYWdyZWdvIGRlY2ltYWxlcyBwYXJhIGxvcyBjYWxjdWxvcwpgYGB7cn0Kb3B0aW9ucyhkaWdpdHM9MikKYGBgCiNBZ3J1cG8gcG9yIGNlbnRybyBkZSBzYWx1ZCBwYXJhIGVsIHRvdGFsIGRlIGNvbnRyb2xlcyAKYGBge3J9CmRmNSAlPiUgCiAgZ3JvdXBfYnkoQ2VudHJvLlNhbHVkKSAlPiUgCiAgc3VtbWFyaXNlKG4gPSBuKCksIAogICAgICAgICAgICAiUHJvbWVkaW8oY29udHJvbDEpIiA9IG1lYW4oVE9UQUxDMSksIAogICAgICAgICAgICAiU0QoY29udHJvbDEpIiA9IHNkKFRPVEFMQzEpLAogICAgICAgICAgICAibWluKGNvbnRyb2wxKSI9IG1pbihUT1RBTEMxKSwKICAgICAgICAgICAgIm1heChjb250cm9sMSkiPW1heChUT1RBTEMxKSwKICAgICAgICAgICAgIlByb21lZGlvKGNvbnRyb2wyKSIgPSBtZWFuKFRPVEFMQzIpLCAKICAgICAgICAgICAgIlNEKGNvbnRyb2wyKSIgPSBzZChUT1RBTEMyKSAsCiAgICAgICAgICAgICJtaW4oY29udHJvbDIpIj1taW4oVE9UQUxDMiksCiAgICAgICAgICAgICJtYXgoY29udHJvbDIpIj1tYXgoVE9UQUxDMiksCiAgICAgICAgICAgICJQcm9tZWRpbyhjb250cm9sMykiID0gbWVhbihUT1RBTEMzKSwgCiAgICAgICAgICAgICJTRChjb250cm9sMykiID0gc2QoVE9UQUxDMyksCiAgICAgICAgICAgICJtaW4oY29udHJvbDMpIj1taW4oVE9UQUxDMyksCiAgICAgICAgICAgICJtYXgoY29udHJvbDMiPW1heChUT1RBTEMzKSkKYGBgCiNBZ3J1cG8gcG9yIFNleG8gcGFyYSBlbCB0b3RhbCBkZSBsb3MgY29udHJvbGVzCmBgYHtyfQpkZjUgJT4lIAogZ3JvdXBfYnkoU2V4bykgJT4lIAogIHN1bW1hcmlzZShuID0gbigpLCAKICAgICAgICAgICAgIlByb21lZGlvKGNvbnRyb2wxKSIgPSBtZWFuKFRPVEFMQzEpLCAKICAgICAgICAgICAgIlNEKGNvbnRyb2wxKSIgPSBzZChUT1RBTEMxKSwKICAgICAgICAgICAgIm1pbihjb250cm9sMSkiPSBtaW4oVE9UQUxDMSksCiAgICAgICAgICAgICJtYXgoY29udHJvbDEpIj1tYXgoVE9UQUxDMSksCiAgICAgICAgICAgICJQcm9tZWRpbyhjb250cm9sMikiID0gbWVhbihUT1RBTEMyKSwgCiAgICAgICAgICAgICJTRChjb250cm9sMikiID0gc2QoVE9UQUxDMikgLAogICAgICAgICAgICAibWluKGNvbnRyb2wyKSI9bWluKFRPVEFMQzIpLAogICAgICAgICAgICAibWF4KGNvbnRyb2wyKSI9bWF4KFRPVEFMQzIpLAogICAgICAgICAgICAiUHJvbWVkaW8oY29udHJvbDMpIiA9IG1lYW4oVE9UQUxDMyksIAogICAgICAgICAgICAiU0QoY29udHJvbDMpIiA9IHNkKFRPVEFMQzMpLAogICAgICAgICAgICAibWluKGNvbnRyb2wzKSI9bWluKFRPVEFMQzMpLAogICAgICAgICAgICAibWF4KGNvbnRyb2wzIj1tYXgoVE9UQUxDMykpCmBgYAojQ2FsY3VsbyBwcm9tZWRpb3MgeSBkZXN2aWFjaW9uIHBvciBjZW50cm8gZGUgc2FsdWQgcGFyYSBjYWRhIHVubyBkZSBsb3MgY29udHJvbGVzIGRlbCBpdGVtIGhpZ2llbmUKYGBge3J9CmRmNSAlPiUgCiAgZ3JvdXBfYnkoQ2VudHJvLlNhbHVkKSAlPiUgCiAgc3VtbWFyaXNlKG4gPSBuKCksIAogICAgICAgICAgICAiUHJvbWVkaW9PSChjb250cm9sMSkiID0gbWVhbihIT0MxKSwgCiAgICAgICAgICAgICJTRCBPSChjb250cm9sMSkiID0gc2QoSE9DMSksCiAgICAgICAgICAgICJQcm9tZWRpb09IKGNvbnRyb2wyKSIgPSBtZWFuKEhPQzIpLCAKICAgICAgICAgICAgIlNEIE9IKGNvbnRyb2wyKSIgPSBzZChIT0MyKSAsCiAgICAgICAgICAgICJNZWFuX09IKGNvbnRyb2wzKSIgPSBtZWFuKEhPQzMpLCAKICAgICAgICAgICAgIlNEIE9IKGNvbnRyb2wzKSIgPSBzZChIT0MzKSkKYGBgCiNDYWxjdWxvIHByb21lZGlvcyB5IGRlc3ZpYWNpb24gcG9yIGNlbnRybyBkZSBzYWx1ZCBwYXJhIGNhZGEgdW5vIGRlIGxvcyBjb250cm9sZXMgZGVsIGl0ZW0gY29uZm9ydApgYGB7cn0KZGY1ICU+JSAKICBncm91cF9ieShDZW50cm8uU2FsdWQpICU+JSAKICBzdW1tYXJpc2UobiA9IG4oKSwgCiAgICAgICAgICAgICJQcm9tZWRpbyBDRihjb250cm9sMSkiID0gbWVhbihDRkMxKSwgCiAgICAgICAgICAgICJTRCBDRihjb250cm9sMSkiID0gc2QoQ0ZDMSksCiAgICAgICAgICAgICJQcm9tZWRpbyBDRihjb250cm9sMikiID0gbWVhbihDRkMyKSwgCiAgICAgICAgICAgICJTRCBDRihjb250cm9sMikiID0gc2QoQ0ZDMikgLAogICAgICAgICAgICAiTWVhbiBDRihjb250cm9sMykiID0gbWVhbihDRkMzKSwgCiAgICAgICAgICAgICJTRCBDRihjb250cm9sMykiID0gc2QoQ0ZDMykpCmBgYAojQ2FsY3VsbyBwcm9tZWRpb3MgeSBkZXN2aWFjaW9uIHBvciBjZW50cm8gZGUgc2FsdWQgcGFyYSBjYWRhIHVubyBkZSBsb3MgY29udHJvbGVzIGRlbCBpdGVtIGF1dG9wZXJjZXBjaW9uIGVzdGV0aWNhCmBgYHtyfQpkZjUgJT4lIAogIGdyb3VwX2J5KENlbnRyby5TYWx1ZCkgJT4lIAogIHN1bW1hcmlzZShuID0gbigpLCAKICAgICAgICAgICAgIlByb21lZGlvIEFFKGNvbnRyb2wxKSIgPSBtZWFuKEFFQzEpLCAKICAgICAgICAgICAgIlNEIEFFKGNvbnRyb2wxKSIgPSBzZChBRUMxKSwKICAgICAgICAgICAgIlByb21lZGlvIEFFKGNvbnRyb2wyKSIgPSBtZWFuKEFFQzIpLCAKICAgICAgICAgICAgIlNEIEFFKGNvbnRyb2wyKSIgPSBzZChBRUMyKSAsCiAgICAgICAgICAgICJNZWFuIEFFKGNvbnRyb2wzKSIgPSBtZWFuKEFFQzMpLCAKICAgICAgICAgICAgIlNEIEFFKGNvbnRyb2wzKSIgPSBzZChBRUMzKSkKYGBgCiNBZ3J1cG8gcG9yIHNleG8gcGFyYSBjYWRhIHVubyBkZSBsb3MgY29udHJvbGVzIGRlbCBpdGVtIGhpZ2llbmUKYGBge3J9CmRmNSAlPiUgCiAgZ3JvdXBfYnkoU2V4bykgJT4lIAogIHN1bW1hcmlzZShuID0gbigpLCAKICAgICAgICAgICAgIlByb21lZGlvT0goY29udHJvbDEpIiA9IG1lYW4oSE9DMSksIAogICAgICAgICAgICAiU0QgT0goY29udHJvbDEpIiA9IHNkKEhPQzEpLAogICAgICAgICAgICAiUHJvbWVkaW9PSChjb250cm9sMikiID0gbWVhbihIT0MyKSwgCiAgICAgICAgICAgICJTRCBPSChjb250cm9sMikiID0gc2QoSE9DMikgLAogICAgICAgICAgICAiTWVhbl9PSChjb250cm9sMykiID0gbWVhbihIT0MzKSwgCiAgICAgICAgICAgICJTRCBPSChjb250cm9sMykiID0gc2QoSE9DMykpCmBgYAojQWdydXBvIHBvciBzZXhvIHBhcmEgY2FkYSB1bm8gZGUgbG9zIGNvbnRyb2xlcyBkZWwgaXRlbSBjb25mb3J0CmBgYHtyfQpkZjUgJT4lIAogIGdyb3VwX2J5KFNleG8pICU+JSAKICBzdW1tYXJpc2UobiA9IG4oKSwgCiAgICAgICAgICAgICJQcm9tZWRpbyBDRihjb250cm9sMSkiID0gbWVhbihDRkMxKSwgCiAgICAgICAgICAgICJTRCBDRihjb250cm9sMSkiID0gc2QoQ0ZDMSksCiAgICAgICAgICAgICJQcm9tZWRpbyBDRihjb250cm9sMikiID0gbWVhbihDRkMyKSwgCiAgICAgICAgICAgICJTRCBDRihjb250cm9sMikiID0gc2QoQ0ZDMikgLAogICAgICAgICAgICAiTWVhbiBDRihjb250cm9sMykiID0gbWVhbihDRkMzKSwgCiAgICAgICAgICAgICJTRCBDRihjb250cm9sMykiID0gc2QoQ0ZDMykpCmBgYAojI0FncnVwbyBwb3Igc2V4byBwYXJhIGNhZGEgdW5vIGRlIGxvcyBjb250cm9sZXMgZGVsIGl0ZW0gYXV0b3BlcmNlcGNpb24KYGBge3J9CmRmNSAlPiUgCiAgZ3JvdXBfYnkoU2V4bykgJT4lIAogIHN1bW1hcmlzZShuID0gbigpLCAKICAgICAgICAgICAgIlByb21lZGlvIEFFKGNvbnRyb2wxKSIgPSBtZWFuKEFFQzEpLCAKICAgICAgICAgICAgIlNEIEFFKGNvbnRyb2wxKSIgPSBzZChBRUMxKSwKICAgICAgICAgICAgIlByb21lZGlvIEFFKGNvbnRyb2wyKSIgPSBtZWFuKEFFQzIpLCAKICAgICAgICAgICAgIlNEIEFFKGNvbnRyb2wyKSIgPSBzZChBRUMyKSAsCiAgICAgICAgICAgICJNZWFuIEFFKGNvbnRyb2wzKSIgPSBtZWFuKEFFQzMpLCAKICAgICAgICAgICAgIlNEIEFFKGNvbnRyb2wzKSIgPSBzZChBRUMzKSkKYGBgCiNHcmFmaWNvIHBhcmEgdGlwbyBkZSBjZW50cm8gZGUgc2FsdWQgeSB0b3RhbCBkZWwgcHJpbWVyIGNvbnRyb2wKYGBge3J9CmRmNSAlPiUgCiAgZ2dwbG90KGFlcyh4PUNlbnRyby5TYWx1ZCwgeT1UT1RBTEMxLCBmaWxsPVNleG8pKSArCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzPWMoImJsYWNrIiwgImJsdWUiKSkgKwogIGdlb21fYm94cGxvdCgpICsKICBnZW9tX2ppdHRlcigpICsKICB4bGFiKCJDZW50cm8gZGUgU2FsdWQiKSArIAogIHlsYWIoIlB1bnRhamUgZW5jdWVzdGEiKSArIAogIGdndGl0bGUoIlB1bnRhamUgdG90YWwgc2F0aXNmYWNjaW9uIHBhcmEgcHJpbWVyIGNvbnRyb2wgcG9yIGNlbnRybyBkZSBTYWx1ZCIpICsgCiAgdGhlbWVfZWNvbm9taXN0KCkgKyAKICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAicmlnaHQiKSArIAogIHNjYWxlX3lfY29udGludW91cyhsaW1pdHMgPSBjKDAsNTApKSArIAogIHRoZW1lKGF4aXMudGl0bGUueCA9IGVsZW1lbnRfdGV4dChmYWNlPSJib2xkIiwgdmp1c3Q9LTAuNSwgY29sb3VyPSJibGFjayIsIHNpemU9cmVsKDEpKSkgKyAKICB0aGVtZShheGlzLnRpdGxlLnkgPSBlbGVtZW50X3RleHQoZmFjZT0iYm9sZCIsIHZqdXN0PTEuNSwgY29sb3VyPSJibGFjayIsIHNpemU9cmVsKDEpKSkgKwogIHNjYWxlX2ZpbGxfZGlzY3JldGUobmFtZT0iU2V4byIsIGxhYmVscz1jKCJGZW1lbmlubyIsIk1hc2N1bGlubyIpKQpgYGAKCiMjR3JhZmljbyBwYXJhIHRpcG8gZGUgY2VudHJvIGRlIHNhbHVkIHkgdG90YWwgZGVsIHNlZ3VuZG8gY29udHJvbApgYGB7cn0KZGY1ICU+JSAKICBnZ3Bsb3QoYWVzKHg9Q2VudHJvLlNhbHVkLCB5PVRPVEFMQzIsIGZpbGw9U2V4bykpKwogIGdlb21fYm94cGxvdCgpICsKICBnZW9tX2ppdHRlcigpICsKICB4bGFiKCJDZW50cm8gZGUgU2FsdWQiKSArCiAgeWxhYigiUHVudGFqZSBlbmN1ZXN0YSIpICsKICBnZ3RpdGxlKCJQdW50YWplIHRvdGFsIHNlZ3VuZG8gY29udHJvbCBwb3IgY2VudHJvIGRlIFNhbHVkIikgKwogIHRoZW1lX2Vjb25vbWlzdCgpICsKICBzY2FsZV95X2NvbnRpbnVvdXMobGltaXRzID0gYygwLDUwKSkgCmBgYAojI0dyYWZpY28gcGFyYSB0aXBvIGRlIGNlbnRybyBkZSBzYWx1ZCB5IHRvdGFsIGRlbCB0ZXJjZXIgY29udHJvbApgYGB7cn0KZGY1ICU+JSAKICBnZ3Bsb3QoYWVzKHg9Q2VudHJvLlNhbHVkLCB5PShUT1RBTEMzKSwgZmlsbD0gU2V4bykpICsKICBnZW9tX2JveHBsb3QoKSArCiAgZ2VvbV9qaXR0ZXIoKSArCiAgeGxhYigiQ2VudHJvIGRlIFNhbHVkIikgKwogIHlsYWIoIlB1bnRhamUgZW5jdWVzdGEiKSArCiAgZ2d0aXRsZSgiUHVudGFqZSB0b3RhbCB0ZXJjZXIgY29udHJvbCBwb3IgY2VudHJvIGRlIFNhbHVkIikgKwogIHRoZW1lX2Vjb25vbWlzdCgpICsKICBzY2FsZV95X2NvbnRpbnVvdXMobGltaXRzID0gYygwLDUwKSkgCmBgYAojVmVvIG5vcm1hbGlkYWQgZGUgbWlzIGRhdG9zCmBgYHtyfQpxcW5vcm0oZGY1JFRPVEFMQzEsIG1haW4gPSAiTm9ybWFsaWRhZCIpCmBgYAojU2hhcGl0byB0ZXN0IHBhcmEgdG90YWxjMQpgYGB7cn0Kc2hhcGlyby50ZXN0KGRmNSRUT1RBTEMxKQpgYGAKI3Rlc3QgZGUgYW5kZXJzb24gcGFyYSB0b3RhbEMxCmBgYHtyfQphZC50ZXN0KGRmNSRUT1RBTEMxKQpgYGAKI0V4aXN0ZSBkaWZlcmVuY2lhIGVudHJlIGNlbnRybyBkZSBzYWx1ZCB5IGxhIGluc3RhbGFjacOzbiBlbiBlbCBwcmltZXIgY29udHJvbD8/IApgYGB7cn0KYW92MSA8LSBhb3YoZGY1JFRPVEFMQzF+ZGY1JENlbnRyby5TYWx1ZCkKc3VtbWFyeShhb3YxKQpgYGAKYGBge3J9ClR1a2V5SFNEKGFvdjEpCmBgYAoKI0xvIG1pc21vIHBhcmEgcHJ1ZWJhIG5vIHBhcmFtZXRyaWNhCmBgYHtyfQprcnVza2FsLnRlc3QoZGY1JFRPVEFMQzF+ZGY1JENlbnRyby5TYWx1ZCkKYGBgCiNFeGlzdGUgZGlmZXJlbmNpYSBlbnRyZSBjZW50cm8gZGUgc2FsdWQgeSBsYSBpbnN0YWxhY2nDs24gZW4gZWwgc2VndW5kbyBjb250cm9sPz8gCmBgYHtyfQphb3YyIDwtIGFvdihkZjUkVE9UQUxDMn5kZjUkQ2VudHJvLlNhbHVkKQpzdW1tYXJ5KGFvdjIpCmBgYAojTG8gbWlzbW8gcGFyYSBwcnVlYmEgbm8gcGFyYW1ldHJpY2EKYGBge3J9CmtydXNrYWwudGVzdChkZjUkVE9UQUxDMn5kZjUkQ2VudHJvLlNhbHVkKQpgYGAKI0V4aXN0ZSBkaWZlcmVuY2lhIGVudHJlIGNlbnRybyBkZSBzYWx1ZCB5IGxhIGluc3RhbGFjacOzbiBlbiBlbCBzZWd1bmRvIGNvbnRyb2w/PyAKYGBge3J9CmFvdjMgPC0gYW92KGRmNSRUT1RBTEMzfmRmNSRDZW50cm8uU2FsdWQpCnN1bW1hcnkoYW92MykKYGBgCiNMbyBtaXNtbyBwYXJhIHBydWViYSBubyBwYXJhbWV0cmljYQpgYGB7cn0Ka3J1c2thbC50ZXN0KGRmNSRUT1RBTEMzfmRmNSRDZW50cm8uU2FsdWQpCmBgYAojU3VtbyBwb3IgaXRlbSBsb3MgdHJlcyBjb250cm9sZXMKYGBge3J9CmRmMiA8LSBkZjUgJT4lIAogIG11dGF0ZShTVU1BX0hPID1IT0MxICArIEhPQzIgKyBIT0MzLCBTVU1BX0NGPSBDRkMxICsgQ0ZDMiArIENGQzMsIFNVTUFfQUU9IEFFQzEgKyBBRUMyICsgQUVDMykKYGBgCiNEb3kgb3RyYSBlc3RydWN0dXJhIGEgbWkgZGF0b3MgcGFyYSBsb3MgY29udHJvbGVzIGRlIGhpZ2llbmUgCmBgYHtyfQpsb25nX2RmMSA8LSBkZjIgJT4lCiAgc2VsZWN0KENlbnRyby5TYWx1ZCwgU2V4bywgSE9DMSwgSE9DMixIT0MzKSAlPiUgCiAgZ2F0aGVyKEhPQzEsIEhPQzIsSE9DMywga2V5ID0gIkhpZ2llbmUiLCB2YWx1ZSA9ICJTVU1BX0hPIikgCmBgYAojR3JhZmljbyBpdGVtIGhpZ2llbmUgb3JhbCAoSE8pIHBvciBjb250cm9sZXMgCmBgYHtyfQpsb25nX2RmMSAlPiUgCiAgZ2dwbG90KGFlcyh4PUhpZ2llbmUsIHk9U1VNQV9ITykpICsKICBnZW9tX2JveHBsb3QoKSArCiAgZ2VvbV9qaXR0ZXIoKSArCnhsYWIoIkNvbnRyb2wgcG9yIEhpZ2llbmUgT3JhbCIpICsKICB5bGFiKCJQdW50YWplIEhPIikgKwogIGdndGl0bGUoIlB1bnRhamUgZGUgc2F0aXNmYWNjaW9uIGVuIEhPIikgKwogIHRoZW1lX2Vjb25vbWlzdCgpICsKICBzY2FsZV95X2NvbnRpbnVvdXMobGltaXRzID0gYygwLDE1KSkgCmBgYAojR3JhZmljbyBpdGVtIGhpZ2llbmUgb3JhbCAoSE8pIHBvciBjb250cm9sZXMgc2VndW4gc2V4bwpgYGB7cn0KbG9uZ19kZjEgJT4lIAogIGdncGxvdChhZXMoeD1IaWdpZW5lLCB5PVNVTUFfSE8sIGZpbGw9IFNleG8pKSArCiAgZ2VvbV9ib3hwbG90KCkgKwogIGdlb21faml0dGVyKCkgKwp4bGFiKCJDb250cm9sIHBvciBIaWdpZW5lIE9yYWwiKSArCiAgeWxhYigiUHVudGFqZSBITyIpICsKICBnZ3RpdGxlKCJQdW50YWplIGRlIHNhdGlzZmFjY2lvbiBlbiBITyBzZWd1biBzZXhvIikgKwogIHRoZW1lX2Vjb25vbWlzdCgpICsKICBzY2FsZV95X2NvbnRpbnVvdXMobGltaXRzID0gYygwLDE1KSkgKyAKICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAicmlnaHQiKSArIAogIHRoZW1lKGF4aXMudGl0bGUueCA9IGVsZW1lbnRfdGV4dChmYWNlPSJib2xkIiwgdmp1c3Q9LTAuNSwgY29sb3VyPSJibGFjayIsIHNpemU9cmVsKDEpKSkgKyAKICB0aGVtZShheGlzLnRpdGxlLnkgPSBlbGVtZW50X3RleHQoZmFjZT0iYm9sZCIsIHZqdXN0PTEuNSwgY29sb3VyPSJibGFjayIsIHNpemU9cmVsKDEpKSkgKwogIHNjYWxlX2ZpbGxfZGlzY3JldGUobmFtZT0iU2V4byIsIGxhYmVscz1jKCJGZW1lbmlubyIsIk1hc2N1bGlubyIpKQpgYGAKI0V4aXN0ZSBkaWZlcmVuY2lhIGVudHJlIGVsIGl0ZW0gZGUgaGlnaWVuZSB5IGxvcyBkaWZlcmVudGVzIGNvbnRyb2xlcyA/Pz8/IApgYGB7cn0KYW92NCA8LSBhb3YobG9uZ19kZjEkU1VNQV9IT35sb25nX2RmMSRIaWdpZW5lKQpzdW1tYXJ5KGFvdjQpCmBgYAojTG8gbWlzbW8gcGFyYSBubyBwYXJhbWV0cmljbwpgYGB7cn0Ka3J1c2thbC50ZXN0KGxvbmdfZGYxJEhpZ2llbmV+bG9uZ19kZjEkU1VNQV9ITykKYGBgCiNEb3kgb3RyYSBlc3RydWN0dXJhIGEgbWkgZGF0b3MgcGFyYSBsb3MgY29udHJvbGVzIGNvbmZvcnQgCmBgYHtyfQpsb25nX2RmMiA8LSBkZjIgJT4lCiAgc2VsZWN0KENlbnRyby5TYWx1ZCwgU2V4byxDRkMxLCBDRkMyLCBDRkMzKSAlPiUgCiAgZ2F0aGVyKENGQzEsIENGQzIsIENGQzMsIGtleSA9ICJDb25mb3J0IiwgdmFsdWUgPSAiU1VNQV9DRiIpIApgYGAKI0dyYWZpY28gaXRlbSBDRiAoY29uZm9ydCkgcG9yIGNvbnRyb2xlcwpgYGB7cn0KbG9uZ19kZjIgJT4lIAogIGdncGxvdChhZXMoeD1Db25mb3J0LCB5PVNVTUFfQ0YpKSArCiAgZ2VvbV9ib3hwbG90KCkgKwogIGdlb21faml0dGVyKCkgKwp4bGFiKCJDb250cm9sIHBvciBjb25mb3J0IikgKwogIHlsYWIoIlB1bnRhamUgQ0YiKSArCiAgZ2d0aXRsZSgiUHVudGFqZSBkZSBzYXRpc2ZhY2Npb24gZW4gQ0YiKSArCiAgdGhlbWVfZWNvbm9taXN0KCkgKyAKICBzY2FsZV95X2NvbnRpbnVvdXMobGltaXRzID0gYygwLDIwKSkgCmBgYAojR3JhZmljbyBpdGVtIENGIChjb25mb3J0KSBwb3IgY29udHJvbGVzIHNlZ3VuIHNleG8KYGBge3J9CmxvbmdfZGYyICU+JSAKICBnZ3Bsb3QoYWVzKHg9Q29uZm9ydCwgeT1TVU1BX0NGLCBmaWxsPSBTZXhvKSkgKwogIGdlb21fYm94cGxvdCgpICsKICBnZW9tX2ppdHRlcigpICsKeGxhYigiQ29udHJvbCBwb3IgY29uZm9ydCIpICsKICB5bGFiKCJQdW50YWplIENGIikgKwogIGdndGl0bGUoIlB1bnRhamUgZGUgc2F0aXNmYWNjaW9uIGVuIENGIHNlZ3VuIHNleG8iKSArCiAgdGhlbWVfZWNvbm9taXN0KCkgKwogIHNjYWxlX3lfY29udGludW91cyhsaW1pdHMgPSBjKDAsMjApKSArCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gInJpZ2h0IikgKyAKICB0aGVtZShheGlzLnRpdGxlLnggPSBlbGVtZW50X3RleHQoZmFjZT0iYm9sZCIsIHZqdXN0PS0wLjUsIGNvbG91cj0iYmxhY2siLCBzaXplPXJlbCgxKSkpICsgCiAgdGhlbWUoYXhpcy50aXRsZS55ID0gZWxlbWVudF90ZXh0KGZhY2U9ImJvbGQiLCB2anVzdD0xLjUsIGNvbG91cj0iYmxhY2siLCBzaXplPXJlbCgxKSkpICsKICBzY2FsZV9maWxsX2Rpc2NyZXRlKG5hbWU9IlNleG8iLCBsYWJlbHM9YygiRmVtZW5pbm8iLCJNYXNjdWxpbm8iKSkKYGBgCiNFeGlzdGUgZGlmZXJlbmNpYSBlbnRyZSBlbCBpdGVtIGRlIGNvbmZvcnQgeSBsb3MgZGlmZXJlbnRlcyBjb250cm9sZXMgPz8/PyAKYGBge3J9CmFvdjUgPC0gYW92KGxvbmdfZGYyJFNVTUFfQ0Z+bG9uZ19kZjIkQ29uZm9ydCkKc3VtbWFyeShhb3Y1KQpgYGAKI0xvIG1pc21vIHBhcmEgbm8gcGFyYW1ldHJpY29zCmBgYHtyfQprcnVza2FsLnRlc3QobG9uZ19kZjIkQ29uZm9ydH5sb25nX2RmMiRTVU1BX0NGKQpgYGAKI0RveSBvdHJhIGVzdHJ1Y3R1cmEgYSBtaSBkYXRvcyBwYXJhIGxvcyBjb250cm9sZXMgZGUgYXV0b3BlcmNlcGNpb24KYGBge3J9CmxvbmdfZGYzIDwtIGRmMiAlPiUKICBzZWxlY3QoQ2VudHJvLlNhbHVkLCBTZXhvLEFFQzEsIEFFQzIsIEFFQzMpICU+JSAKICBnYXRoZXIoQUVDMSwgQUVDMiwgQUVDMywga2V5ID0gIkF1dG9wZXJjZXBjaW9uIiwgdmFsdWUgPSAiU1VNQV9BRSIpIApgYGAKI0dyYWZpY28gaXRlbSBBRShhdXRvcGVyY2VwY2lvbiBlc3RldGljYSkgcG9yIGNvbnRyb2xlcwpgYGB7cn0KbG9uZ19kZjMgJT4lIAogIGdncGxvdChhZXMoeD1BdXRvcGVyY2VwY2lvbiwgeT1TVU1BX0FFKSkgKwogIGdlb21fYm94cGxvdCgpICsKICBnZW9tX2ppdHRlcigpICsKeGxhYigiQ29udHJvbCBwb3IgYXV0b3BlcmNlcGNpb24iKSArCiAgeWxhYigiUHVudGFqZSBBRSIpICsKICBnZ3RpdGxlKCJQdW50YWplIGRlIHNhdGlzZmFjY2lvbiBlbiBBRSIpICsKICB0aGVtZV9lY29ub21pc3QoKSArCiAgc2NhbGVfeV9jb250aW51b3VzKGxpbWl0cyA9IGMoMCwxNSkpIApgYGAKI0dyYWZpY28gaXRlbSBBRShhdXRvcGVyY2VwY2lvbiBlc3RldGljYSkgcG9yIGNvbnRyb2xlcyBzZWd1biBzZXhvCmBgYHtyfQpsb25nX2RmMyAlPiUgCiAgZ2dwbG90KGFlcyh4PUF1dG9wZXJjZXBjaW9uLCB5PVNVTUFfQUUsIGZpbGw9IFNleG8pKSArCiAgZ2VvbV9ib3hwbG90KCkgKwogIGdlb21faml0dGVyKCkgKwp4bGFiKCJDb250cm9sIHBvciBhdXRvcGVyY2VwY2lvbiIpICsKICB5bGFiKCJQdW50YWplIEFFIikgKwogIGdndGl0bGUoIlB1bnRhamUgZGUgc2F0aXNmYWNjaW9uIGVuIEFFIHNlZ3VuIHNleG8iKSArCiAgdGhlbWVfZWNvbm9taXN0KCkgKwogICBzY2FsZV95X2NvbnRpbnVvdXMobGltaXRzID0gYygwLDE1KSkgKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJyaWdodCIpICsgCiAgdGhlbWUoYXhpcy50aXRsZS54ID0gZWxlbWVudF90ZXh0KGZhY2U9ImJvbGQiLCB2anVzdD0tMC41LCBjb2xvdXI9ImJsYWNrIiwgc2l6ZT1yZWwoMSkpKSArIAogIHRoZW1lKGF4aXMudGl0bGUueSA9IGVsZW1lbnRfdGV4dChmYWNlPSJib2xkIiwgdmp1c3Q9MS41LCBjb2xvdXI9ImJsYWNrIiwgc2l6ZT1yZWwoMSkpKSArCiAgc2NhbGVfZmlsbF9kaXNjcmV0ZShuYW1lPSJTZXhvIiwgbGFiZWxzPWMoIkZlbWVuaW5vIiwiTWFzY3VsaW5vIikpCmBgYAojR3JhZmljbyBwYXJhIGF1dG9wZXJjZXBjaW9uIHBvciBjb250cm9sZXMgZW4gYmFycmFzIHBhcmVhZGFzCmBgYHtyfQpsb25nX2RmMyAlPiUgCiAgZ2dwbG90KGFlcyh4PUNlbnRyby5TYWx1ZCwgeT1BdXRvcGVyY2VwY2lvbiwgZmlsbD0gQXV0b3BlcmNlcGNpb24pKSArCiAgZ2VvbV9jb2woKSArCiAgY29vcmRfZmxpcCgpICsKeGxhYigiQ2VudHJvIGRlIHNhbHVkIikgKwogIHlsYWIoIlB1bnRhamUgc2F0aXNmYWNjaW9uIHBhcmEgYXV0b3BlcmNlcGNpb24iKSArCiAgZ2d0aXRsZSgiUHVudGFqZSBkZSBzYXRpc2ZhY2Npb24gZW4gQUUgZW4gY29udHJvbGVzIHBvciBjZW50cm8gZGUgc2FsdWQiKSArCiAgdGhlbWVfZWNvbm9taXN0KCkKYGBgCiNFeGlzdGUgZGlmZXJlbmNpYSBlbnRyZSBlbCBpdGVtIGRlIGNvbmZvcnQgeSBsb3MgZGlmZXJlbnRlcyBjb250cm9sZXMgPz8/PyAKYGBge3J9CmFvdjYgPC0gYW92KGxvbmdfZGYzJFNVTUFfQUV+bG9uZ19kZjMkQXV0b3BlcmNlcGNpb24pCnN1bW1hcnkoYW92NikKYGBgCiNMbyBtaXNtbyBwYXJhIG5vIHBhcmFtZXRyaWNvcwpgYGB7cn0Ka3J1c2thbC50ZXN0KGxvbmdfZGYzJEF1dG9wZXJjZXBjaW9ufmxvbmdfZGYzJFNVTUFfQUUpCmBgYAo=