Se realizó una encuesta con los estudiantes del curso de seminario de construcción, para conocer las características e información personal de los encuestados. La encuesta se aplicó en el salón de clase.
S<-read.csv("Matriz1.csv", sep = ";")
Las preguntas que se realizaron corresponden a:
names(M)
[1] "NOMBRE" "EDAD"
[3] "ESTATURA" "PESO"
[5] "NIVEL.EDUCATIVO" "SEXO"
[7] "HERMANOS" "HIJOS"
[9] "ESTRATO" "MATRICULADO"
[11] "NACIONALIDAD.REGIONAL" "ESTADO.CIVIL"
Tamaño de la muestra:
length.POSIXlt(S)
[1] 25
Con los datos obtenidos de la muestra, se realizó histogramas de las variables cuantitativas:
library(ggplot2)
ggplot(S, aes(x = EDAD)) + geom_histogram(breaks = seq(20, 40, by = 5), col = "black", fill = "green") + ggtitle("EDADES") + ylab("ENCUESTADOS") + theme(plot.title = element_text(hjust = 0.5)) + scale_y_continuous(breaks = seq(0, 14, by = 2), limits = c(0,14)) + xlab("EDADES [Años]") + annotate("text", x = c(22.5, 27.5, 32.5, 37.5), y = c(13.5, 6.5, 1.5, 2.5), label = c("52%", "24%", "4%", "8%"))

ggplot(S, aes(x = ESTATURA)) + geom_histogram(breaks = seq(1.5, 1.9, by = 0.1), col = "black", fill = "red") + ggtitle("ESTATURA") + ylab("ENCUESTADOS") + theme(plot.title = element_text(hjust = 0.5)) + scale_y_continuous(breaks = seq(0, 10, by = 2), limits = c(0,10)) + xlab("ESTATURAS [m]") + annotate("text", x = c(1.55, 1.65, 1.75, 1.85), y = c(9.5, 7.5, 6.5, 3.5), label = c("36%", "28%", "24%", "12%"))

ggplot(S, aes(x = PESO)) + geom_histogram(breaks = seq(50, 80, by = 6), col = "black", fill = "yellow") + ggtitle("PESO") + ylab("ENCUESTADOS") + theme(plot.title = element_text(hjust = 0.5)) + scale_y_continuous(breaks = seq(0, 7, by = 1), limits = c(0,7)) + xlab("PESOS [Kg]") + scale_x_continuous(breaks = seq(50, 80, by = 6), limits = c(50,80)) + annotate("text", x = c(53, 59, 65, 71, 77), y = c(4.5, 6.5, 2.5, 5.5, 6.5), label = c("16%", "24%", "8%", "20%", "24%"))

Análisis:
Variable EDAD: Se observa que el 76% de los encuestados están en un rango de edad entre los 20 y 30 años, lo que nos indica que más de la mitad de los estudiantes está por debajo de los 30 años. Nota:
Variable ESTATURA: El 64% de los encuestados se encuentran en un rango de estatura entre los 1.5 y 1.7 metros, que corresponden a estaturas promedios en Colombia.
Variable PESO: Los rangos donde se encuentra la mayor cantidad de encuestados es entre 50-62 kg y 68-80 kg. No hay una tendencia marcada en la gráfica.
Con las variables cualitativas se realizaron diagramas de barra:
tab.NE<-as.data.frame(prop.table(table(S$NIVEL.EDUCATIVO))*100)
colnames(tab.NE)<-c("NE", "PORCENTAJE")
l<-c("Estudiantes de pregrado", "Estudiantes de postgrado", "Estudiantes de doctarado")
n<-c("1", "2", "3")
library(ggplot2)
ggplot(tab.NE, aes(x = NE, y = PORCENTAJE)) + geom_bar(stat = "identity", width = 0.8, fill = c("violet", "darkgreen", "darkblue")) + scale_fill_discrete(name = "", breaks = n, labels = l) + theme(legend.position = "right", legend.background = element_rect(fill = "white", size = 0.5, linetype = "solid", colour = "darkgrey")) + ggtitle("NIVEL EDUCATIVO") + xlab("") + ylab("% ENCUESTADOS") + theme(plot.title = element_text(hjust = 0.5)) + geom_text(aes(y = PORCENTAJE, label = paste(round(PORCENTAJE, 2), "%")), position = position_dodge(width = 0.5), size=4, vjust=-0.5, hjust=0.5 ,col="black") + scale_x_discrete(breaks = n, labels = c("Estudiante de Pregrado", "Estudiante de Postgrado", "Estudiante de Doctorado")) + scale_y_continuous(breaks = seq(0, 60, by = 5), limits = c(0,60))

tab.sexo<-as.data.frame(prop.table(table(S$SEXO))*100)
colnames(tab.sexo)<-c("Sexo", "PORCENTAJE")
l<-c("Hombres", "Mujeres")
n<-c("1", "2")
library(ggplot2)
ggplot(tab.sexo, aes(x = Sexo, y = PORCENTAJE)) + geom_bar(stat = "identity", width = 0.8, fill =c("blue", "pink")) + scale_fill_discrete(name = "", breaks = n, labels = l) + theme(legend.position = "right", legend.background = element_rect(fill = "white", size = 0.5, linetype = "solid", colour = "darkgrey")) + ggtitle("GÉNERO") + xlab("") + ylab("% ENCUESTADOS") + theme(plot.title = element_text(hjust = 0.5)) + geom_text(aes(y = PORCENTAJE, label = paste(round(PORCENTAJE, 2), "%")), position = position_dodge(width = 0.5), size=4, vjust=-0.5, hjust=0.5 ,col="black") + scale_x_discrete(breaks = n, labels = c("Hombres", "Mujeres")) + scale_y_continuous(breaks = seq(0, 60, by = 5), limits = c(0,60))

tab.H<-as.data.frame(prop.table(table(S$HERMANOS))*100)
colnames(tab.H)<-c("Hermanos", "PORCENTAJE")
library(ggplot2)
ggplot(tab.H, aes(x = Hermanos, y = PORCENTAJE)) + geom_bar(stat = "identity", width = 0.8, fill = c("red", "orange","blue", "green", "yellow", "violet", "dark red")) + scale_fill_discrete(name = "", breaks = n, labels = l) + theme(legend.position = "right", legend.background = element_rect(fill = "white", size = 0.5, linetype = "solid", colour = "darkgrey")) + ggtitle("NÚMERO DE HERMANOS") + xlab("NÚMERO DE HERMANOS") + ylab("% ENCUESTADOS") + theme(plot.title = element_text(hjust = 0.5)) + geom_text(aes(y = PORCENTAJE, label = paste(round(PORCENTAJE, 2), "%")), position = position_dodge(width = 0.5), size=4, vjust=-0.5, hjust=0.5 ,col="black") + scale_y_continuous(breaks = seq(0, 30, by = 5), limits = c(0,30))

tab.Hi<-as.data.frame(prop.table(table(S$HIJOS))*100)
colnames(tab.Hi)<-c("Hijos", "PORCENTAJE")
library(ggplot2)
ggplot(tab.Hi, aes(x = Hijos, y = PORCENTAJE)) + geom_bar(stat = "identity", width = 0.8, fill = c("green", "yellow", "violet", "dark red")) + scale_fill_discrete(name = "", breaks = n, labels = l) + theme(legend.position = "right", legend.background = element_rect(fill = "white", size = 0.5, linetype = "solid", colour = "darkgrey")) + ggtitle("NÚMERO DE HIJOS") + xlab("NÚMERO DE HIJOS") + ylab("% ENCUESTADOS") + theme(plot.title = element_text(hjust = 0.5)) + scale_y_continuous(breaks = seq(0, 80, by = 5), limits = c(0,80)) + geom_text(aes(y = PORCENTAJE, label = paste(round(PORCENTAJE, 2), "%")), position = position_dodge(width = 0.5), size=4, vjust=0.5, hjust=-0.2 ,col="black") + coord_flip()

tab.Est<-as.data.frame(prop.table(table(S$ESTRATO))*100)
colnames(tab.Est)<-c("Estrato", "PORCENTAJE")
library(ggplot2)
ggplot(tab.Est, aes(x = Estrato, y = PORCENTAJE)) + geom_bar(stat = "identity", width = 0.8, fill = c("green", "yellow", "violet", "dark red", "dark blue")) + scale_fill_discrete(name = "", breaks = n, labels = l) + theme(legend.position = "right", legend.background = element_rect(fill = "white", size = 0.5, linetype = "solid", colour = "darkgrey")) + ggtitle("ESTRATOS") + xlab("") + ylab("% ENCUESTADOS") + theme(plot.title = element_text(hjust = 0.5)) + scale_y_continuous(breaks = seq(0, 60, by = 5), limits = c(0,60)) + geom_text(aes(y = PORCENTAJE, label = paste(round(PORCENTAJE, 2), "%")), position = position_dodge(width = 0.5), size=4, vjust=-0.5, hjust=0.5 ,col="black") + scale_x_discrete(breaks = c("1","2","3","4","5"), labels = c("Estrato 1", "Estrato 2", "Estrato 3", "Estrato 4", "Estrato 5"))

tab.M<-as.data.frame(prop.table(table(S$MATRICULADO))*100)
colnames(tab.M)<-c("Matriculado", "PORCENTAJE")
library(ggplot2)
ggplot(tab.M, aes(x = Matriculado, y = PORCENTAJE)) + geom_bar(stat = "identity", width = 0.5, fill = c("dark red", "dark blue")) + scale_fill_discrete(name = "", breaks = n, labels = l) + theme(legend.position = "right", legend.background = element_rect(fill = "white", size = 0.5, linetype = "solid", colour = "darkgrey")) + ggtitle("MATRICULADOS") + xlab("") + ylab("% ENCUESTADOS") + theme(plot.title = element_text(hjust = 0.5)) + scale_y_continuous(breaks = seq(0, 60, by = 5), limits = c(0,60)) + geom_text(aes(y = PORCENTAJE, label = paste(round(PORCENTAJE, 2), "%")), position = position_dodge(width = 0.5), size=4, vjust=-0.5, hjust=0.5 ,col="black") + scale_x_discrete(breaks = c("1","2"), labels = c("Si", "No"))

tab.Na<-as.data.frame(prop.table(table(S$NACIONALIDAD.REGIONAL))*100)
colnames(tab.Na)<-c("Na", "PORCENTAJE")
library(ggplot2)
ggplot(tab.Na, aes(x = Na, y = PORCENTAJE)) + geom_bar(stat = "identity", width = 0.8, fill = c("darkred", "dark green", "pink", "yellow", "orange")) + scale_fill_discrete(name = "", breaks = n, labels = l) + theme(legend.position = "right", legend.background = element_rect(fill = "white", size = 0.5, linetype = "solid", colour = "darkgrey")) + ggtitle("REGIÓN") + xlab("") + ylab("% ENCUESTADOS") + theme(plot.title = element_text(hjust = 0.5)) + scale_y_continuous(breaks = seq(0, 90, by = 10), limits = c(0,90)) + geom_text(aes(y = PORCENTAJE, label = paste(round(PORCENTAJE, 2), "%")), position = position_dodge(width = 0.5), size=4, vjust=0.5, hjust=-0.2 ,col="black") + scale_x_discrete(breaks = c("1","2", "3","4","5"), labels = c("Valle del Cauca", "Cauca", "Quindio", "Nariño", "Cundinamarca")) + coord_flip()

tab.EC<-as.data.frame(prop.table(table(S$ESTADO.CIVIL))*100)
colnames(tab.EC)<-c("EC", "PORCENTAJE")
library(ggplot2)
ggplot(tab.EC, aes(x="", y = PORCENTAJE, fill = EC)) + geom_bar(stat = "identity", width = 1)+coord_polar("y", start=0)+scale_fill_brewer(palette = "Set1", labels=c("soltero","Casado"))+ labs(title = "ESTADO CIVIL", x = NULL, y = NULL, fill = "ESTADO CIVIL")+scale_x_discrete(labels=NULL,breaks = NULL)+scale_y_discrete(labels=NULL,breaks = NULL)+ geom_text(aes(y = PORCENTAJE, label = paste(round(PORCENTAJE, 2), "%")), position = position_dodge(width = 1), size=4, vjust=0, hjust=1.2 ,col="black")+ylim(0, 100)+ theme(plot.title = element_text(hjust = 0.5)) + theme(legend.position = "right", legend.background = element_rect(fill = "white", size = 0.5, linetype = "solid", colour = "darkgrey"))
Scale for 'y' is already present. Adding another scale for 'y', which
will replace the existing scale.

Análisis:
VARIABLE NIVEL EDUCATIVO: El 56% de la muestra son estudiantes de pregrado.
VARIABLE SEXO: El 56% de las personas encuestadas son mujeres. Con respecto al número de mujeres estudiando la carrera de Ingeniería Civil, se observa que ha habido un incremento en comparación a los últimos años a nivel de percepción, pero para conocer con exactitud el incremento, se deberá recolectar datos de las admisiones de los años anteriores de la carrera y realizar un análisis estadístico.
VARIABLE HERMANOS: El 28% de los encuestados tiene un hermano.
VARIBLE HIJOS: El 76% de los encuestados no tiene hijos. Con los datos obtenidos se puede inferir que la tendencia en un ambiente universitario con edades menores a los 30 años es a no tener hijos, al menos en ese rango de edad.
VARIABLE ESTRATO: La mayoría de la muestra (52%), se encuentra en un estrato socio-económico 3.
VARIABLE MATRICULADOS: El 56% de los estudiantes se encuentran matriculados en el curso de seminario de construcción. Para obtener la información de los estudiantes que aprueban el curso, se debe tener los datos de las calificaciones finales de los estudiantes, además se debe confirmar cuantos estudiantes realmente matricularon la materia, ya que eso cambiaría la muestra de estudio.
VARIABLE REGIÓN: La mayoría de los encuestados son originarios del Valle del Cauca (84%)
VARIABLE ESTADO CIVIL: El 88% de los encuestados es soltero.
Para las variables de Edad, Peso y Estatura se obtuvieron las medidas de tendencia central y de dispersión.
summary(Edad)
Min. 1st Qu. Median Mean 3rd Qu. Max.
21.00 23.00 25.00 28.56 30.00 49.00
var(Edad)
[1] 74.92333
sd (Edad)
[1] 8.655827
range(Edad)
[1] 21 49
table(Edad)
Edad
21 22 23 24 25 26 27 28 30 31 37 40 47 48 49
2 3 4 2 2 2 2 1 1 1 1 1 1 1 1
summary(Peso)
Min. 1st Qu. Median Mean 3rd Qu. Max.
50.00 57.00 70.00 67.64 75.00 98.00
var(Peso)
[1] 156.1567
sd (Peso)
[1] 12.49627
range(Peso)
[1] 50 98
table(Peso)
Peso
50 51 54 57 59 60 65 70 71 72 74 75 76 78 80 90 98
2 1 1 4 1 1 2 1 1 2 1 2 1 2 1 1 1
summary(Est)
Min. 1st Qu. Median Mean 3rd Qu. Max.
1.520 1.600 1.670 1.677 1.750 1.880
var(Est)
[1] 0.01096433
sd (Est)
[1] 0.1047107
range(Est)
[1] 1.52 1.88
table(Est)
Est
1.52 1.53 1.54 1.57 1.58 1.6 1.62 1.65 1.67 1.68 1.7 1.72 1.75 1.78
1 1 1 2 1 3 1 2 1 1 2 1 2 1
1.79 1.8 1.83 1.84 1.88
1 1 1 1 1
Análisis:
La edad que más se repite es 22 años y la edad promedio de los encuestados es de 28.56 ~ 29 años. Con una mediana de 25 años. Posee una varianza alta, esto se puede atribuir a que existen edades entre los 37 a los 49 años que hace que aumente la dispersión de los datos.
El peso que más se repite es de 57 kg y el peso promedio de los encuestados es de 67.64 ~ 68 kg. Con una mediana de 70 kg. La varianza es alta debido a valores atípicos de 90 y 98 kg.
La estatura que más se repite es de 1.6 m y la estatura promedio de los encuestados es de 1.677 ~ 1.7 m. Con una mediana de 1.67 m. La varianza es pequeña debido a que los datos no se encuentran tan dispersos.
LS0tDQp0aXRsZTogIkVOQ1VFU1RBOiBDTEFTRSBTRU1JTkFSSU8gREUgQ09OU1RSVUNDSdNOIg0Kb3V0cHV0OiBodG1sX25vdGVib29rDQotLS0NClNlIHJlYWxpevMgdW5hIGVuY3Vlc3RhIGNvbiBsb3MgZXN0dWRpYW50ZXMgZGVsIGN1cnNvIGRlIHNlbWluYXJpbyBkZSBjb25zdHJ1Y2Np824sIHBhcmEgY29ub2NlciBsYXMgY2FyYWN0ZXLtc3RpY2FzIGUgaW5mb3JtYWNp824gcGVyc29uYWwgZGUgbG9zIGVuY3Vlc3RhZG9zLiANCkxhIGVuY3Vlc3RhIHNlIGFwbGlj8yBlbiBlbCBzYWzzbiBkZSBjbGFzZS4NCg0KYGBge3J9DQpTPC1yZWFkLmNzdigiTWF0cml6MS5jc3YiLCBzZXAgPSAiOyIpDQpgYGANCkxhcyBwcmVndW50YXMgcXVlIHNlIHJlYWxpemFyb24gY29ycmVzcG9uZGVuIGE6DQoNCmBgYHtyfQ0KbmFtZXMoTSkNCmBgYA0KVGFtYfFvIGRlIGxhIG11ZXN0cmE6DQpgYGB7cn0NCmxlbmd0aC5QT1NJWGx0KFMpDQpgYGANCg0KQ29uIGxvcyBkYXRvcyBvYnRlbmlkb3MgZGUgbGEgbXVlc3RyYSwgc2UgcmVhbGl68yBoaXN0b2dyYW1hcyBkZSBsYXMgdmFyaWFibGVzIGN1YW50aXRhdGl2YXM6DQoNCmBgYHtyfQ0KbGlicmFyeShnZ3Bsb3QyKQ0KZ2dwbG90KFMsIGFlcyh4ID0gRURBRCkpICsgZ2VvbV9oaXN0b2dyYW0oYnJlYWtzID0gc2VxKDIwLCA0MCwgYnkgPSA1KSwgY29sID0gImJsYWNrIiwgZmlsbCA9ICJncmVlbiIpICsgZ2d0aXRsZSgiRURBREVTIikgKyB5bGFiKCJFTkNVRVNUQURPUyIpICsgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSkpICsgc2NhbGVfeV9jb250aW51b3VzKGJyZWFrcyA9IHNlcSgwLCAxNCwgYnkgPSAyKSwgbGltaXRzID0gYygwLDE0KSkgKyB4bGFiKCJFREFERVMgW0Hxb3NdIikgKyBhbm5vdGF0ZSgidGV4dCIsIHggPSBjKDIyLjUsIDI3LjUsIDMyLjUsIDM3LjUpLCB5ID0gYygxMy41LCA2LjUsIDEuNSwgMi41KSwgbGFiZWwgPSBjKCI1MiUiLCAiMjQlIiwgIjQlIiwgIjglIikpDQogDQpnZ3Bsb3QoUywgYWVzKHggPSBFU1RBVFVSQSkpICsgZ2VvbV9oaXN0b2dyYW0oYnJlYWtzID0gc2VxKDEuNSwgMS45LCBieSA9IDAuMSksIGNvbCA9ICJibGFjayIsIGZpbGwgPSAicmVkIikgKyBnZ3RpdGxlKCJFU1RBVFVSQSIpICsgeWxhYigiRU5DVUVTVEFET1MiKSArIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUpKSArIHNjYWxlX3lfY29udGludW91cyhicmVha3MgPSBzZXEoMCwgMTAsIGJ5ID0gMiksIGxpbWl0cyA9IGMoMCwxMCkpICsgeGxhYigiRVNUQVRVUkFTIFttXSIpICsgYW5ub3RhdGUoInRleHQiLCB4ID0gYygxLjU1LCAxLjY1LCAxLjc1LCAxLjg1KSwgeSA9IGMoOS41LCA3LjUsIDYuNSwgMy41KSwgbGFiZWwgPSBjKCIzNiUiLCAiMjglIiwgIjI0JSIsICIxMiUiKSkNCg0KZ2dwbG90KFMsIGFlcyh4ID0gUEVTTykpICsgZ2VvbV9oaXN0b2dyYW0oYnJlYWtzID0gc2VxKDUwLCA4MCwgYnkgPSA2KSwgY29sID0gImJsYWNrIiwgZmlsbCA9ICJ5ZWxsb3ciKSArIGdndGl0bGUoIlBFU08iKSArIHlsYWIoIkVOQ1VFU1RBRE9TIikgKyB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41KSkgKyBzY2FsZV95X2NvbnRpbnVvdXMoYnJlYWtzID0gc2VxKDAsIDcsIGJ5ID0gMSksIGxpbWl0cyA9IGMoMCw3KSkgKyB4bGFiKCJQRVNPUyBbS2ddIikgKyBzY2FsZV94X2NvbnRpbnVvdXMoYnJlYWtzID0gc2VxKDUwLCA4MCwgYnkgPSA2KSwgbGltaXRzID0gYyg1MCw4MCkpICArIGFubm90YXRlKCJ0ZXh0IiwgeCA9IGMoNTMsIDU5LCA2NSwgNzEsIDc3KSwgeSA9IGMoNC41LCA2LjUsIDIuNSwgNS41LCA2LjUpLCBsYWJlbCA9IGMoIjE2JSIsICIyNCUiLCAiOCUiLCAiMjAlIiwgIjI0JSIpKQ0KDQoNCg0KYGBgDQpBbuFsaXNpczoNCg0KVmFyaWFibGUgRURBRDogU2Ugb2JzZXJ2YSBxdWUgZWwgNzYlIGRlIGxvcyBlbmN1ZXN0YWRvcyBlc3ThbiBlbiB1biByYW5nbyBkZSBlZGFkIGVudHJlIGxvcyAyMCB5IDMwIGHxb3MsIGxvIHF1ZSBub3MgaW5kaWNhIHF1ZSBt4XMgZGUgbGEgbWl0YWQgZGUgbG9zIGVzdHVkaWFudGVzIGVzdOEgcG9yIGRlYmFqbyBkZSBsb3MgMzAgYfFvcy4gTm90YTogDQoNClZhcmlhYmxlIEVTVEFUVVJBOiBFbCA2NCUgZGUgbG9zIGVuY3Vlc3RhZG9zIHNlIGVuY3VlbnRyYW4gZW4gdW4gcmFuZ28gZGUgZXN0YXR1cmEgZW50cmUgbG9zIDEuNSB5IDEuNyBtZXRyb3MsIHF1ZSBjb3JyZXNwb25kZW4gYSBlc3RhdHVyYXMgcHJvbWVkaW9zIGVuIENvbG9tYmlhLg0KDQpWYXJpYWJsZSBQRVNPOiBMb3MgcmFuZ29zIGRvbmRlIHNlIGVuY3VlbnRyYSBsYSBtYXlvciBjYW50aWRhZCBkZSBlbmN1ZXN0YWRvcyBlcyBlbnRyZSA1MC02MiBrZyB5IDY4LTgwIGtnLiBObyBoYXkgdW5hIHRlbmRlbmNpYSBtYXJjYWRhIGVuIGxhIGdy4WZpY2EuDQoNCg0KQ29uIGxhcyB2YXJpYWJsZXMgY3VhbGl0YXRpdmFzIHNlIHJlYWxpemFyb24gZGlhZ3JhbWFzIGRlIGJhcnJhOg0KDQpgYGB7cn0NCnRhYi5ORTwtYXMuZGF0YS5mcmFtZShwcm9wLnRhYmxlKHRhYmxlKFMkTklWRUwuRURVQ0FUSVZPKSkqMTAwKQ0KY29sbmFtZXModGFiLk5FKTwtYygiTkUiLCAiUE9SQ0VOVEFKRSIpDQoNCmw8LWMoIkVzdHVkaWFudGVzIGRlIHByZWdyYWRvIiwgIkVzdHVkaWFudGVzIGRlIHBvc3RncmFkbyIsICJFc3R1ZGlhbnRlcyBkZSBkb2N0YXJhZG8iKQ0KbjwtYygiMSIsICIyIiwgIjMiKQ0KbGlicmFyeShnZ3Bsb3QyKQ0KZ2dwbG90KHRhYi5ORSwgYWVzKHggPSBORSwgeSA9IFBPUkNFTlRBSkUpKSArIGdlb21fYmFyKHN0YXQgPSAiaWRlbnRpdHkiLCB3aWR0aCA9IDAuOCwgZmlsbCA9IGMoInZpb2xldCIsICJkYXJrZ3JlZW4iLCAiZGFya2JsdWUiKSkgKyBzY2FsZV9maWxsX2Rpc2NyZXRlKG5hbWUgPSAiIiwgYnJlYWtzID0gbiwgbGFiZWxzID0gbCkgKyB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAicmlnaHQiLCBsZWdlbmQuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gIndoaXRlIiwgc2l6ZSA9IDAuNSwgbGluZXR5cGUgPSAic29saWQiLCBjb2xvdXIgPSAiZGFya2dyZXkiKSkgKyBnZ3RpdGxlKCJOSVZFTCBFRFVDQVRJVk8iKSArIHhsYWIoIiIpICsgeWxhYigiJSBFTkNVRVNUQURPUyIpICsgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSkpICsgZ2VvbV90ZXh0KGFlcyh5ID0gUE9SQ0VOVEFKRSwgbGFiZWwgPSBwYXN0ZShyb3VuZChQT1JDRU5UQUpFLCAyKSwgIiUiKSksIHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2Uod2lkdGggPSAwLjUpLCBzaXplPTQsIHZqdXN0PS0wLjUsIGhqdXN0PTAuNSAsY29sPSJibGFjayIpICsgc2NhbGVfeF9kaXNjcmV0ZShicmVha3MgPSBuLCBsYWJlbHMgPSBjKCJFc3R1ZGlhbnRlIGRlIFByZWdyYWRvIiwgIkVzdHVkaWFudGUgZGUgUG9zdGdyYWRvIiwgIkVzdHVkaWFudGUgZGUgRG9jdG9yYWRvIikpICsgc2NhbGVfeV9jb250aW51b3VzKGJyZWFrcyA9IHNlcSgwLCA2MCwgYnkgPSA1KSwgbGltaXRzID0gYygwLDYwKSkNCg0KdGFiLnNleG88LWFzLmRhdGEuZnJhbWUocHJvcC50YWJsZSh0YWJsZShTJFNFWE8pKSoxMDApDQpjb2xuYW1lcyh0YWIuc2V4byk8LWMoIlNleG8iLCAiUE9SQ0VOVEFKRSIpDQoNCmw8LWMoIkhvbWJyZXMiLCAiTXVqZXJlcyIpDQpuPC1jKCIxIiwgIjIiKQ0KbGlicmFyeShnZ3Bsb3QyKQ0KZ2dwbG90KHRhYi5zZXhvLCBhZXMoeCA9IFNleG8sIHkgPSBQT1JDRU5UQUpFKSkgKyBnZW9tX2JhcihzdGF0ID0gImlkZW50aXR5Iiwgd2lkdGggPSAwLjgsIGZpbGwgPWMoImJsdWUiLCAicGluayIpKSArIHNjYWxlX2ZpbGxfZGlzY3JldGUobmFtZSA9ICIiLCBicmVha3MgPSBuLCBsYWJlbHMgPSBsKSArIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJyaWdodCIsIGxlZ2VuZC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSAid2hpdGUiLCBzaXplID0gMC41LCBsaW5ldHlwZSA9ICJzb2xpZCIsIGNvbG91ciA9ICJkYXJrZ3JleSIpKSArIGdndGl0bGUoIkfJTkVSTyIpICsgeGxhYigiIikgKyB5bGFiKCIlIEVOQ1VFU1RBRE9TIikgKyB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41KSkgKyBnZW9tX3RleHQoYWVzKHkgPSBQT1JDRU5UQUpFLCBsYWJlbCA9IHBhc3RlKHJvdW5kKFBPUkNFTlRBSkUsIDIpLCAiJSIpKSwgcG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSh3aWR0aCA9IDAuNSksIHNpemU9NCwgdmp1c3Q9LTAuNSwgaGp1c3Q9MC41ICxjb2w9ImJsYWNrIikgKyBzY2FsZV94X2Rpc2NyZXRlKGJyZWFrcyA9IG4sIGxhYmVscyA9IGMoIkhvbWJyZXMiLCAiTXVqZXJlcyIpKSArIHNjYWxlX3lfY29udGludW91cyhicmVha3MgPSBzZXEoMCwgNjAsIGJ5ID0gNSksIGxpbWl0cyA9IGMoMCw2MCkpDQoNCmBgYA0KYGBge3J9DQp0YWIuSDwtYXMuZGF0YS5mcmFtZShwcm9wLnRhYmxlKHRhYmxlKFMkSEVSTUFOT1MpKSoxMDApDQpjb2xuYW1lcyh0YWIuSCk8LWMoIkhlcm1hbm9zIiwgIlBPUkNFTlRBSkUiKQ0KDQoNCmxpYnJhcnkoZ2dwbG90MikNCmdncGxvdCh0YWIuSCwgYWVzKHggPSBIZXJtYW5vcywgeSA9IFBPUkNFTlRBSkUpKSArIGdlb21fYmFyKHN0YXQgPSAiaWRlbnRpdHkiLCB3aWR0aCA9IDAuOCwgZmlsbCA9IGMoInJlZCIsICJvcmFuZ2UiLCJibHVlIiwgImdyZWVuIiwgInllbGxvdyIsICJ2aW9sZXQiLCAiZGFyayByZWQiKSkgKyBzY2FsZV9maWxsX2Rpc2NyZXRlKG5hbWUgPSAiIiwgYnJlYWtzID0gbiwgbGFiZWxzID0gbCkgKyB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAicmlnaHQiLCBsZWdlbmQuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gIndoaXRlIiwgc2l6ZSA9IDAuNSwgbGluZXR5cGUgPSAic29saWQiLCBjb2xvdXIgPSAiZGFya2dyZXkiKSkgKyBnZ3RpdGxlKCJO2k1FUk8gREUgSEVSTUFOT1MiKSArIHhsYWIoIk7aTUVSTyBERSBIRVJNQU5PUyIpICsgeWxhYigiJSBFTkNVRVNUQURPUyIpICsgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSkpICsgZ2VvbV90ZXh0KGFlcyh5ID0gUE9SQ0VOVEFKRSwgbGFiZWwgPSBwYXN0ZShyb3VuZChQT1JDRU5UQUpFLCAyKSwgIiUiKSksIHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2Uod2lkdGggPSAwLjUpLCBzaXplPTQsIHZqdXN0PS0wLjUsIGhqdXN0PTAuNSAsY29sPSJibGFjayIpICsgc2NhbGVfeV9jb250aW51b3VzKGJyZWFrcyA9IHNlcSgwLCAzMCwgYnkgPSA1KSwgbGltaXRzID0gYygwLDMwKSkNCg0KYGBgDQpgYGB7cn0NCnRhYi5IaTwtYXMuZGF0YS5mcmFtZShwcm9wLnRhYmxlKHRhYmxlKFMkSElKT1MpKSoxMDApDQpjb2xuYW1lcyh0YWIuSGkpPC1jKCJIaWpvcyIsICJQT1JDRU5UQUpFIikNCg0KDQpsaWJyYXJ5KGdncGxvdDIpDQpnZ3Bsb3QodGFiLkhpLCBhZXMoeCA9IEhpam9zLCB5ID0gUE9SQ0VOVEFKRSkpICsgZ2VvbV9iYXIoc3RhdCA9ICJpZGVudGl0eSIsIHdpZHRoID0gMC44LCBmaWxsID0gYygiZ3JlZW4iLCAieWVsbG93IiwgInZpb2xldCIsICJkYXJrIHJlZCIpKSArIHNjYWxlX2ZpbGxfZGlzY3JldGUobmFtZSA9ICIiLCBicmVha3MgPSBuLCBsYWJlbHMgPSBsKSArIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJyaWdodCIsIGxlZ2VuZC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSAid2hpdGUiLCBzaXplID0gMC41LCBsaW5ldHlwZSA9ICJzb2xpZCIsIGNvbG91ciA9ICJkYXJrZ3JleSIpKSArIGdndGl0bGUoIk7aTUVSTyBERSBISUpPUyIpICsgeGxhYigiTtpNRVJPIERFIEhJSk9TIikgKyB5bGFiKCIlIEVOQ1VFU1RBRE9TIikgKyB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41KSkgKyBzY2FsZV95X2NvbnRpbnVvdXMoYnJlYWtzID0gc2VxKDAsIDgwLCBieSA9IDUpLCBsaW1pdHMgPSBjKDAsODApKSArIGdlb21fdGV4dChhZXMoeSA9IFBPUkNFTlRBSkUsIGxhYmVsID0gcGFzdGUocm91bmQoUE9SQ0VOVEFKRSwgMiksICIlIikpLCBwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlKHdpZHRoID0gMC41KSwgc2l6ZT00LCB2anVzdD0wLjUsIGhqdXN0PS0wLjIgLGNvbD0iYmxhY2siKSArIGNvb3JkX2ZsaXAoKQ0KYGBgDQpgYGB7cn0NCnRhYi5Fc3Q8LWFzLmRhdGEuZnJhbWUocHJvcC50YWJsZSh0YWJsZShTJEVTVFJBVE8pKSoxMDApDQpjb2xuYW1lcyh0YWIuRXN0KTwtYygiRXN0cmF0byIsICJQT1JDRU5UQUpFIikNCg0KDQpsaWJyYXJ5KGdncGxvdDIpDQpnZ3Bsb3QodGFiLkVzdCwgYWVzKHggPSBFc3RyYXRvLCB5ID0gUE9SQ0VOVEFKRSkpICsgZ2VvbV9iYXIoc3RhdCA9ICJpZGVudGl0eSIsIHdpZHRoID0gMC44LCBmaWxsID0gYygiZ3JlZW4iLCAieWVsbG93IiwgInZpb2xldCIsICJkYXJrIHJlZCIsICJkYXJrIGJsdWUiKSkgKyBzY2FsZV9maWxsX2Rpc2NyZXRlKG5hbWUgPSAiIiwgYnJlYWtzID0gbiwgbGFiZWxzID0gbCkgKyB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAicmlnaHQiLCBsZWdlbmQuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gIndoaXRlIiwgc2l6ZSA9IDAuNSwgbGluZXR5cGUgPSAic29saWQiLCBjb2xvdXIgPSAiZGFya2dyZXkiKSkgKyBnZ3RpdGxlKCJFU1RSQVRPUyIpICsgeGxhYigiIikgKyB5bGFiKCIlIEVOQ1VFU1RBRE9TIikgKyB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41KSkgKyBzY2FsZV95X2NvbnRpbnVvdXMoYnJlYWtzID0gc2VxKDAsIDYwLCBieSA9IDUpLCBsaW1pdHMgPSBjKDAsNjApKSArIGdlb21fdGV4dChhZXMoeSA9IFBPUkNFTlRBSkUsIGxhYmVsID0gcGFzdGUocm91bmQoUE9SQ0VOVEFKRSwgMiksICIlIikpLCBwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlKHdpZHRoID0gMC41KSwgc2l6ZT00LCB2anVzdD0tMC41LCBoanVzdD0wLjUgLGNvbD0iYmxhY2siKSArIHNjYWxlX3hfZGlzY3JldGUoYnJlYWtzID0gYygiMSIsIjIiLCIzIiwiNCIsIjUiKSwgbGFiZWxzID0gYygiRXN0cmF0byAxIiwgIkVzdHJhdG8gMiIsICJFc3RyYXRvIDMiLCAiRXN0cmF0byA0IiwgIkVzdHJhdG8gNSIpKQ0KYGBgDQpgYGB7cn0NCnRhYi5NPC1hcy5kYXRhLmZyYW1lKHByb3AudGFibGUodGFibGUoUyRNQVRSSUNVTEFETykpKjEwMCkNCmNvbG5hbWVzKHRhYi5NKTwtYygiTWF0cmljdWxhZG8iLCAiUE9SQ0VOVEFKRSIpDQoNCg0KbGlicmFyeShnZ3Bsb3QyKQ0KZ2dwbG90KHRhYi5NLCBhZXMoeCA9IE1hdHJpY3VsYWRvLCB5ID0gUE9SQ0VOVEFKRSkpICsgZ2VvbV9iYXIoc3RhdCA9ICJpZGVudGl0eSIsIHdpZHRoID0gMC41LCBmaWxsID0gYygiZGFyayByZWQiLCAiZGFyayBibHVlIikpICsgc2NhbGVfZmlsbF9kaXNjcmV0ZShuYW1lID0gIiIsIGJyZWFrcyA9IG4sIGxhYmVscyA9IGwpICsgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gInJpZ2h0IiwgbGVnZW5kLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9ICJ3aGl0ZSIsIHNpemUgPSAwLjUsIGxpbmV0eXBlID0gInNvbGlkIiwgY29sb3VyID0gImRhcmtncmV5IikpICsgZ2d0aXRsZSgiTUFUUklDVUxBRE9TIikgKyB4bGFiKCIiKSArIHlsYWIoIiUgRU5DVUVTVEFET1MiKSArIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUpKSArIHNjYWxlX3lfY29udGludW91cyhicmVha3MgPSBzZXEoMCwgNjAsIGJ5ID0gNSksIGxpbWl0cyA9IGMoMCw2MCkpICsgZ2VvbV90ZXh0KGFlcyh5ID0gUE9SQ0VOVEFKRSwgbGFiZWwgPSBwYXN0ZShyb3VuZChQT1JDRU5UQUpFLCAyKSwgIiUiKSksIHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2Uod2lkdGggPSAwLjUpLCBzaXplPTQsIHZqdXN0PS0wLjUsIGhqdXN0PTAuNSAsY29sPSJibGFjayIpICsgc2NhbGVfeF9kaXNjcmV0ZShicmVha3MgPSBjKCIxIiwiMiIpLCBsYWJlbHMgPSBjKCJTaSIsICJObyIpKQ0KYGBgDQpgYGB7cn0NCnRhYi5OYTwtYXMuZGF0YS5mcmFtZShwcm9wLnRhYmxlKHRhYmxlKFMkTkFDSU9OQUxJREFELlJFR0lPTkFMKSkqMTAwKQ0KY29sbmFtZXModGFiLk5hKTwtYygiTmEiLCAiUE9SQ0VOVEFKRSIpDQoNCg0KbGlicmFyeShnZ3Bsb3QyKQ0KZ2dwbG90KHRhYi5OYSwgYWVzKHggPSBOYSwgeSA9IFBPUkNFTlRBSkUpKSArIGdlb21fYmFyKHN0YXQgPSAiaWRlbnRpdHkiLCB3aWR0aCA9IDAuOCwgZmlsbCA9IGMoImRhcmtyZWQiLCAiZGFyayBncmVlbiIsICJwaW5rIiwgInllbGxvdyIsICJvcmFuZ2UiKSkgKyBzY2FsZV9maWxsX2Rpc2NyZXRlKG5hbWUgPSAiIiwgYnJlYWtzID0gbiwgbGFiZWxzID0gbCkgKyB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAicmlnaHQiLCBsZWdlbmQuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gIndoaXRlIiwgc2l6ZSA9IDAuNSwgbGluZXR5cGUgPSAic29saWQiLCBjb2xvdXIgPSAiZGFya2dyZXkiKSkgKyBnZ3RpdGxlKCJSRUdJ004iKSArIHhsYWIoIiIpICsgeWxhYigiJSBFTkNVRVNUQURPUyIpICsgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSkpICsgc2NhbGVfeV9jb250aW51b3VzKGJyZWFrcyA9IHNlcSgwLCA5MCwgYnkgPSAxMCksIGxpbWl0cyA9IGMoMCw5MCkpICsgZ2VvbV90ZXh0KGFlcyh5ID0gUE9SQ0VOVEFKRSwgbGFiZWwgPSBwYXN0ZShyb3VuZChQT1JDRU5UQUpFLCAyKSwgIiUiKSksIHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2Uod2lkdGggPSAwLjUpLCBzaXplPTQsIHZqdXN0PTAuNSwgaGp1c3Q9LTAuMiAsY29sPSJibGFjayIpICsgc2NhbGVfeF9kaXNjcmV0ZShicmVha3MgPSBjKCIxIiwiMiIsICIzIiwiNCIsIjUiKSwgbGFiZWxzID0gYygiVmFsbGUgZGVsIENhdWNhIiwgIkNhdWNhIiwgIlF1aW5kaW8iLCAiTmFyafFvIiwgIkN1bmRpbmFtYXJjYSIpKSArIGNvb3JkX2ZsaXAoKQ0KYGBgDQpgYGB7cn0NCnRhYi5FQzwtYXMuZGF0YS5mcmFtZShwcm9wLnRhYmxlKHRhYmxlKFMkRVNUQURPLkNJVklMKSkqMTAwKQ0KY29sbmFtZXModGFiLkVDKTwtYygiRUMiLCAiUE9SQ0VOVEFKRSIpDQoNCg0KbGlicmFyeShnZ3Bsb3QyKQ0KZ2dwbG90KHRhYi5FQywgYWVzKHg9IiIsIHkgPSBQT1JDRU5UQUpFLCBmaWxsID0gRUMpKSArIGdlb21fYmFyKHN0YXQgPSAiaWRlbnRpdHkiLCB3aWR0aCA9IDEpK2Nvb3JkX3BvbGFyKCJ5Iiwgc3RhcnQ9MCkrc2NhbGVfZmlsbF9icmV3ZXIocGFsZXR0ZSA9ICJTZXQxIiwgbGFiZWxzPWMoInNvbHRlcm8iLCJDYXNhZG8iKSkrIGxhYnModGl0bGUgPSAiRVNUQURPIENJVklMIiwgeCA9IE5VTEwsIHkgPSBOVUxMLCBmaWxsID0gIkVTVEFETyBDSVZJTCIpK3NjYWxlX3hfZGlzY3JldGUobGFiZWxzPU5VTEwsYnJlYWtzID0gTlVMTCkrc2NhbGVfeV9kaXNjcmV0ZShsYWJlbHM9TlVMTCxicmVha3MgPSBOVUxMKSsgZ2VvbV90ZXh0KGFlcyh5ID0gUE9SQ0VOVEFKRSwgbGFiZWwgPSBwYXN0ZShyb3VuZChQT1JDRU5UQUpFLCAyKSwgIiUiKSksIHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2Uod2lkdGggPSAxKSwgc2l6ZT00LCB2anVzdD0wLCBoanVzdD0xLjIgLGNvbD0iYmxhY2siKSt5bGltKDAsIDEwMCkrIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUpKSArIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJyaWdodCIsIGxlZ2VuZC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSAid2hpdGUiLCBzaXplID0gMC41LCBsaW5ldHlwZSA9ICJzb2xpZCIsIGNvbG91ciA9ICJkYXJrZ3JleSIpKQ0KYGBgDQpBbuFsaXNpczoNCg0KVkFSSUFCTEUgTklWRUwgRURVQ0FUSVZPOiBFbCA1NiUgZGUgbGEgbXVlc3RyYSBzb24gZXN0dWRpYW50ZXMgZGUgcHJlZ3JhZG8uDQoNClZBUklBQkxFIFNFWE86IEVsIDU2JSBkZSBsYXMgcGVyc29uYXMgZW5jdWVzdGFkYXMgc29uIG11amVyZXMuDQpDb24gcmVzcGVjdG8gYWwgbvptZXJvIGRlIG11amVyZXMgZXN0dWRpYW5kbyBsYSBjYXJyZXJhIGRlIEluZ2VuaWVy7WEgQ2l2aWwsIHNlIG9ic2VydmEgcXVlIGhhIGhhYmlkbyB1biBpbmNyZW1lbnRvIGVuIGNvbXBhcmFjafNuIGEgbG9zIPpsdGltb3MgYfFvcyBhIG5pdmVsIGRlIHBlcmNlcGNp824sIHBlcm8gcGFyYSBjb25vY2VyIGNvbiBleGFjdGl0dWQgZWwgaW5jcmVtZW50bywgc2UgZGViZXLhIHJlY29sZWN0YXIgZGF0b3MgZGUgbGFzIGFkbWlzaW9uZXMgZGUgbG9zIGHxb3MgYW50ZXJpb3JlcyBkZSBsYSBjYXJyZXJhIHkgcmVhbGl6YXIgdW4gYW7hbGlzaXMgZXN0YWTtc3RpY28uDQoNClZBUklBQkxFIEhFUk1BTk9TOiBFbCAyOCUgZGUgbG9zIGVuY3Vlc3RhZG9zIHRpZW5lIHVuIGhlcm1hbm8uDQoNClZBUklCTEUgSElKT1M6IEVsIDc2JSBkZSBsb3MgZW5jdWVzdGFkb3Mgbm8gdGllbmUgaGlqb3MuIENvbiBsb3MgZGF0b3Mgb2J0ZW5pZG9zIHNlIHB1ZWRlIGluZmVyaXIgcXVlIGxhIHRlbmRlbmNpYSBlbiB1biBhbWJpZW50ZSB1bml2ZXJzaXRhcmlvIGNvbiBlZGFkZXMgbWVub3JlcyBhIGxvcyAzMCBh8W9zIGVzIGEgbm8gdGVuZXIgaGlqb3MsIGFsIG1lbm9zIGVuIGVzZSByYW5nbyBkZSBlZGFkLg0KDQpWQVJJQUJMRSBFU1RSQVRPOiBMYSBtYXlvcu1hIGRlIGxhIG11ZXN0cmEgKDUyJSksIHNlIGVuY3VlbnRyYSBlbiB1biBlc3RyYXRvIHNvY2lvLWVjb27zbWljbyAzLg0KDQpWQVJJQUJMRSBNQVRSSUNVTEFET1M6IEVsIDU2JSBkZSBsb3MgZXN0dWRpYW50ZXMgc2UgZW5jdWVudHJhbiBtYXRyaWN1bGFkb3MgZW4gZWwgY3Vyc28gZGUgc2VtaW5hcmlvIGRlIGNvbnN0cnVjY2nzbi4gUGFyYSBvYnRlbmVyIGxhIGluZm9ybWFjafNuIGRlIGxvcyBlc3R1ZGlhbnRlcyBxdWUgYXBydWViYW4gZWwgY3Vyc28sIHNlIGRlYmUgdGVuZXIgbG9zIGRhdG9zIGRlIGxhcyBjYWxpZmljYWNpb25lcyBmaW5hbGVzIGRlIGxvcyBlc3R1ZGlhbnRlcywgYWRlbeFzIHNlIGRlYmUgY29uZmlybWFyIGN1YW50b3MgZXN0dWRpYW50ZXMgcmVhbG1lbnRlIG1hdHJpY3VsYXJvbiBsYSBtYXRlcmlhLCB5YSBxdWUgZXNvIGNhbWJpYXLtYSBsYSBtdWVzdHJhIGRlIGVzdHVkaW8uDQoNClZBUklBQkxFIFJFR0nTTjogTGEgbWF5b3LtYSBkZSBsb3MgZW5jdWVzdGFkb3Mgc29uIG9yaWdpbmFyaW9zIGRlbCBWYWxsZSBkZWwgQ2F1Y2EgKDg0JSkNCg0KVkFSSUFCTEUgRVNUQURPIENJVklMOiBFbCA4OCUgZGUgbG9zIGVuY3Vlc3RhZG9zIGVzIHNvbHRlcm8uDQoNCg0KUGFyYSBsYXMgdmFyaWFibGVzIGRlIEVkYWQsIFBlc28geSBFc3RhdHVyYSBzZSBvYnR1dmllcm9uIGxhcyBtZWRpZGFzIGRlIHRlbmRlbmNpYSBjZW50cmFsIHkgZGUgZGlzcGVyc2nzbi4NCg0KDQpgYGB7cn0NCnN1bW1hcnkoRWRhZCkNCnZhcihFZGFkKQ0Kc2QgKEVkYWQpDQpyYW5nZShFZGFkKQ0KdGFibGUoRWRhZCkNCg0Kc3VtbWFyeShQZXNvKQ0KdmFyKFBlc28pDQpzZCAoUGVzbykNCnJhbmdlKFBlc28pDQp0YWJsZShQZXNvKQ0KDQpzdW1tYXJ5KEVzdCkNCnZhcihFc3QpDQpzZCAoRXN0KQ0KcmFuZ2UoRXN0KQ0KdGFibGUoRXN0KQ0KYGBgDQpBbuFsaXNpczoNCg0KTGEgZWRhZCBxdWUgbeFzIHNlIHJlcGl0ZSBlcyAyMiBh8W9zIHkgbGEgZWRhZCBwcm9tZWRpbyBkZSBsb3MgZW5jdWVzdGFkb3MgZXMgZGUgMjguNTYgfiAyOSBh8W9zLiBDb24gdW5hIG1lZGlhbmEgZGUgMjUgYfFvcy4gUG9zZWUgdW5hIHZhcmlhbnphIGFsdGEsIGVzdG8gc2UgcHVlZGUgYXRyaWJ1aXIgYSBxdWUgZXhpc3RlbiBlZGFkZXMgZW50cmUgbG9zIDM3IGEgbG9zIDQ5IGHxb3MgcXVlIGhhY2UgcXVlIGF1bWVudGUgbGEgZGlzcGVyc2nzbiBkZSBsb3MgZGF0b3MuDQoNCkVsIHBlc28gcXVlIG3hcyBzZSByZXBpdGUgZXMgZGUgNTcga2cgeSBlbCBwZXNvIHByb21lZGlvIGRlIGxvcyBlbmN1ZXN0YWRvcyBlcyBkZSA2Ny42NCB+IDY4IGtnLiBDb24gdW5hIG1lZGlhbmEgZGUgNzAga2cuIExhIHZhcmlhbnphIGVzIGFsdGEgZGViaWRvIGEgdmFsb3JlcyBhdO1waWNvcyBkZSA5MCB5IDk4IGtnLg0KDQpMYSBlc3RhdHVyYSBxdWUgbeFzIHNlIHJlcGl0ZSBlcyBkZSAxLjYgbSB5IGxhIGVzdGF0dXJhIHByb21lZGlvIGRlIGxvcyBlbmN1ZXN0YWRvcyBlcyBkZSAxLjY3NyB+IDEuNyBtLiBDb24gdW5hIG1lZGlhbmEgZGUgMS42NyBtLiBMYSB2YXJpYW56YSBlcyBwZXF1ZfFhIGRlYmlkbyBhIHF1ZSBsb3MgZGF0b3Mgbm8gc2UgZW5jdWVudHJhbiB0YW4gZGlzcGVyc29zLg0KDQoNCg0K