library(PMCMR)

Ejercicios

Relaciones sexuales entre universitarios

El departamento de Psicología de una Universidad de Castilla-La Mancha ha realizado un estudio sobre hábitos, preferencias y satisfacción sexual en estudiantes universitarios. Hemos utilizado los datos que recogieron en sus encuestas y queremos conocer si existen diferencias entre la frecuencia mensual de relaciones sexuales de estudiantes universitarios pertenecientes a tres titulaciones universitarias diferentes:

T1: 11 14 7 15 11 13 11 16 10 15 18 12 9 9 10 10 15 10 14 10 10 12 14 12 15 7 13 6 10 15 20 10 13 10 6 14 8 10 8 11

T2: 13 10 12 7 5 10 10 16 9 7 7 2 6 9 9 8 8 10 3 6 5 2 9 3 4 5 10 8 5 9 10 8 13 10 0 2 1 1 0 4

T3: 6 7 3 5 9 6 1 6 0 2 5 6 11 6 7 0 5 7 5 4 7 4 2 8 9 6 1 4 7 7 8 9 7 5 1 6 9 4 7 6

Contesta las siguientes preguntas:

* Introduce los datos en R creando las 2 variables: una que incluya las frecuencias de actividad sexual y otra que será un factor, que nos proporcionará información sobre la titulación universitaria de cada uno de los estudiantes.

v1<-c(11, 14, 7, 15, 11, 13, 11 ,16 ,10, 15 ,18, 12, 9,
      9, 10, 10, 15, 10, 14, 10, 10, 12, 14 ,12, 15, 7 ,13 ,6, 10 ,15, 20 ,10, 13 ,10 ,6 ,14 ,8 ,10 ,8, 11)
v2<-c(13, 10, 12, 7, 5, 10, 10 ,16, 9, 7 ,7, 2, 6, 9, 9, 8, 8, 10 ,3 ,6, 5, 2, 9 ,3, 4, 5, 10 ,8 ,5, 9, 10, 8, 13, 10, 0, 2, 1, 1, 0, 4)
v3<-c(6, 7 ,3 ,5 ,9, 6, 1 ,6 ,0 ,2, 5, 6, 11, 6, 7 ,0 ,5, 7, 5, 4 ,7 ,4, 2, 8, 9 ,6 ,1 ,4 ,7 ,7 ,8 ,9 ,7 ,5 ,1 ,6 ,9, 4, 7, 6)
frec_as<-c(v1,v2,v3)
titulaciones<- as.factor(c(rep(c("T1", "T2", "T3"), each =40)))

* Explora los datos de la muestra mediante gráficos y descriptivos. ¿Observamos diferencias en los valores promedios y de variabilidad por grupos?

Exploramos los datos de la muestra:

boxplot(frec_as ~ titulaciones, col = c("yellow", "blue", "white"), ylab = "Frecuencia Relaciones Sexuales")

Luego las medias son:

tapply(frec_as, titulaciones, mean)
   T1    T2    T3 
11.60  6.90  5.45 

Con el gráfico anterior podemos notar que las varianzas son diferentes, además se podría decir que las 3 medias son diferentes, pero entre “T1” y “T2”, parece que tienen una media estadísticamente semejante.


* Realiza un test F (ANOVA) para comparar las medias de las 3 poblaciones. ¿Cuáles serían las hipótesis nula y alternativa?

Vamos a probar si \[H_0:\mu_{T1}=\mu_{T2}=\mu_{T3}\], es decir si las tres medias so iguales.

anova1 = aov( lm(frec_as~ titulaciones) )#Realizamos el ANOVA

Pedimos un resumen de la tabla del ANOVA

summary(anova1)
              Df Sum Sq Mean Sq F value   Pr(>F)    
titulaciones   2  826.9   413.4   38.98 1.07e-13 ***
Residuals    117 1241.1    10.6                     
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Elementos generados en el ANOVA:

names(anova1)
 [1] "coefficients"  "residuals"     "effects"       "rank"          "fitted.values" "assign"        "qr"           
 [8] "df.residual"   "contrasts"     "xlevels"       "call"          "terms"         "model"        

Debido a que el valor p es 1.07e-13, que es menor que el nivel de significancia de 0.05, puede rechazar la hipótesis nula y concluir que algunas de las titulaciones tienen diferentes medias.


* También indica quién sería el valor crítico de F bajo la hipótesis nula, que nos proporcionará la definición de una región de aceptación y rechazo (consideramos un nivel de significación alfa = 0.05).

Bajo la Ho el estadístico de contraste F se distribuye como una F de grados de libertad (I-1), (n-I) donde I es el número de grupos que disponemos y n el tamaño total de la muestral. Así obtenemos el cuantil buscado:

qf(0.05, 2-1, 40*3-2, lower.tail = F)
[1] 3.921478

* Describe los resultados obtenidos indicando quién es el valor del estadístico de contraste (F), los grados de libertad del factor, los grados de libertad residuales y el valor de P.

Grados de libertad factor:2 Grados de libertad Residuales:117 Valor P:1.07e-13

Valores del estadístico > 3.921478 estarán incluidos en la región de rechazo. En nuetro caso 38.98 es mucho mayor que el valor crítico obtenido.

* ¿Qué valor obtenemos para la estimación de la varianza común de los datos?

La raíz cuadrada de la media de los cuadrados del error, además de proporcionarnos una estimación de la varianza muestral de todos los datos, se utiliza en la obtención de los intervalos de confianza de las medias en cada uno de los grupos de interés.

[1] 10.6

* Tras evaluar la tabla ANOVA, ¿cuál sería tu conclusión en el contexto del problema?

Se rechaza la hipotesis nula y se concluye que existe diferencia entre la actividad sexual de los estudiantes de cada titulación.


* Determina los intervalos de confianza para las medias de frecuencia sexual en cada uno de las titulaciones descritas.

Intervalo de confianza de la media de las relaciones sexuales para la titulación T1, con un nivel de confianza del 95%:

media1 <- mean(frec_as[titulaciones=="T1"]) 
valor_t1 <- pt(0.05/2, 117 - 2) 
sp1 <- sqrt(10.6)  #desviación típica de la varianza muestral común
ee1  <- valor_t1 * (sp1/ sqrt(6))  #error de estimación 
media1
[1] 11.6

límite superior del intervalo de confianza de la media

media1 + ee1
[1] 12.27781

límite inferior del intervalo de confianza de la media

media1 - ee1
[1] 10.92219

Intervalo de confianza de la media de las relaciones sexuales para la titulación T2, con un nivel de confianza del 95%:

media2 <- mean(frec_as[titulaciones=="T2"]) 
valor_t2 <- pt(0.05/2, 117 - 2) 
sp2 <- sqrt(10.6)  #desviación típica de la varianza muestral común
ee2  <- valor_t2 * (sp2/ sqrt(6))  #error de estimación 
media2
[1] 6.9

límite superior del intervalo de confianza de la media

media2 + ee2
[1] 7.577806

límite inferior del intervalo de confianza de la media

media2 - ee2
[1] 6.222194

Intervalo de confianza de la media de las relaciones sexuales para la titulación T3, con un nivel de confianza del 95%:

media3 <- mean(frec_as[titulaciones=="T3"]) 
valor_t3 <- pt(0.05/2, 117 - 2) 
sp3 <- sqrt(10.6)  #desviación típica de la varianza muestral común
ee3  <- valor_t3 * (sp3/ sqrt(6))  #error de estimación 
media3
[1] 5.45

límite superior del intervalo de confianza de la media

media3 + ee3
[1] 6.127806

límite inferior del intervalo de confianza de la media

media3 - ee3
[1] 4.772194

* Si se han obtenido diferencias significativas entre los grupos, determina dónde se muestran esas diferencias utilizando el test HSD de Tukey. Representa gráficamente las diferencias encontradas e intrepreta los resultados obtenidos.

intervals1 = TukeyHSD(anova1)
intervals1
  Tukey multiple comparisons of means
    95% family-wise confidence level

Fit: aov(formula = lm(frec_as ~ titulaciones))

$`titulaciones`
       diff       lwr        upr     p adj
T2-T1 -4.70 -6.428861 -2.9711395 0.0000000
T3-T1 -6.15 -7.878861 -4.4211395 0.0000000
T3-T2 -1.45 -3.178861  0.2788605 0.1189269
plot(intervals1)

Se puede ver que son muy diferentes entre todos los grupos.


* A partir de los residuos obtenidos y mediante procedimientos gráficos, confirma la validez del modelo comprobando el cumplimiento de las 3 condiciones asumidas al hacer el ANOVA. ¿Crees que el modelo ANOVA utilizado es válido para estos datos?

A partir de los residuos del modelo comprobaremos si el modelo ANOVA es adecuado. Los supuestos que se deben cumplir son tres: independencia, homocedasticidad y normalidad

Independencia

plot(anova1$residuals)

Normalidad Los gráficos y descriptivos nos informan si se verifica la igualdad de varianzas en los grupos descritos:

summary(anova1$residuals)
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
 -6.900  -1.900   0.400   0.000   2.175   9.100 
boxplot(anova1$residuals)

hist(anova1$residuals)

qqnorm(anova1$residuals) 
qqline(anova1$residuals)

El test de Shapiro-Wilk indica que no tenemos evidencia suficiente para rechazar la hipótesis nula (normalidad de los residuos)

shapiro.test(anova1$residuals)

    Shapiro-Wilk normality test

data:  anova1$residuals
W = 0.98473, p-value = 0.1945

Como obtenemos un valor p mayor a 0.05, podemos concluir que los datos se distribuyen normalmente.

Homocedasticidad

boxplot(anova1$residuals~titulaciones, col = c("yellow", "blue", "white")) 

* Si NO se verificaran estas condiciones, ¿hay alguna prueba no paramétrica para abordar los datos? Pruébalo y comenta los resultados obtenidos.

Kruskal-Wallis y pruebas post-hoc

kruskal.test(frec_as, titulaciones)

    Kruskal-Wallis rank sum test

data:  frec_as and titulaciones
Kruskal-Wallis chi-squared = 51.504, df = 2, p-value = 6.547e-12
qchisq(0.05, 2-1, lower.tail = F)
[1] 3.841459

Valores del estadístico > 3.841459 estarán incluidos en la región de rechazo. En nuetro caso 51.504 es mucho mayor que el valor crítico obtenido. Por lo tanto se concluye que provienen de poblaciones diferentes.

LS0tDQp0aXRsZTogIkFOT1ZBIg0KYXV0aG9yOiAiQW5kculzIFZpbnVlemEiDQpkYXRlOiAiMjggZGUgc2VwdGllbWJyZSBkZSAyMDE4Ig0Kb3V0cHV0OiBodG1sX25vdGVib29rDQotLS0NCjxib2R5IHN0eWxlID0iYmFja2dyb3VuZDogdXJsKCdodHRwczovL3IxLmlsaWtld2FsbHBhcGVyLm5ldC9pcGFkLWFpci13YWxscGFwZXJzL2Rvd25sb2FkLzMwMjkxL0dlb21ldHJpYy1HcmVlbi1XaGFsZS1NaW5pbWFsLWlwYWQtYWlyLXdhbGxwYXBlci1pbGlrZXdhbGxwYXBlcl9jb20uanBnJykgIGNlbnRlciBjZW50ZXIgZml4ZWQ7Ij4NCg0KYGBge3J9DQpsaWJyYXJ5KFBNQ01SKQ0KYGBgDQoNCiMjIEVqZXJjaWNpb3MNCipSZWxhY2lvbmVzIHNleHVhbGVzIGVudHJlIHVuaXZlcnNpdGFyaW9zKg0KDQpFbCBkZXBhcnRhbWVudG8gZGUgUHNpY29sb2ftYSBkZSB1bmEgVW5pdmVyc2lkYWQgZGUgQ2FzdGlsbGEtTGEgTWFuY2hhIGhhIHJlYWxpemFkbyB1biBlc3R1ZGlvIHNvYnJlIGjhYml0b3MsIHByZWZlcmVuY2lhcyB5IHNhdGlzZmFjY2nzbiBzZXh1YWwgZW4gZXN0dWRpYW50ZXMgdW5pdmVyc2l0YXJpb3MuIEhlbW9zIHV0aWxpemFkbyBsb3MgZGF0b3MgcXVlIHJlY29naWVyb24gZW4gc3VzIGVuY3Vlc3RhcyB5IHF1ZXJlbW9zIGNvbm9jZXIgc2kgZXhpc3RlbiBkaWZlcmVuY2lhcyBlbnRyZSBsYSBmcmVjdWVuY2lhIG1lbnN1YWwgZGUgcmVsYWNpb25lcyBzZXh1YWxlcyBkZSBlc3R1ZGlhbnRlcyB1bml2ZXJzaXRhcmlvcyBwZXJ0ZW5lY2llbnRlcyBhIHRyZXMgdGl0dWxhY2lvbmVzIHVuaXZlcnNpdGFyaWFzIGRpZmVyZW50ZXM6DQoNCioqVDEqKjogMTEgMTQgNyAxNSAxMSAxMyAxMSAxNiAxMCAxNSAxOCAxMiA5IDkgMTAgMTAgMTUgMTAgMTQgMTAgMTAgMTIgMTQgMTIgMTUgNyAxMyA2IDEwIDE1IDIwIDEwIDEzIDEwIDYgMTQgOCAxMCA4IDExDQoNCioqVDIqKjogMTMgMTAgMTIgNyA1IDEwIDEwIDE2IDkgNyA3IDIgNiA5IDkgOCA4IDEwIDMgNiA1IDIgOSAzIDQgNSAxMCA4IDUgOSAxMCA4IDEzIDEwIDAgMiAxIDEgMCA0DQoNCioqVDMqKjogNiA3IDMgNSA5IDYgMSA2IDAgMiA1IDYgMTEgNiA3IDAgNSA3IDUgNCA3IDQgMiA4IDkgNiAxIDQgNyA3IDggOSA3IDUgMSA2IDkgNCA3IDYNCg0KDQoNCkNvbnRlc3RhIGxhcyBzaWd1aWVudGVzIHByZWd1bnRhczoNCjxociBjb2xvcj0iYmx1ZSIgc2l6ZT0zPg0KDQojIyMqIEludHJvZHVjZSBsb3MgZGF0b3MgZW4gUiBjcmVhbmRvIGxhcyAyIHZhcmlhYmxlczogdW5hIHF1ZSBpbmNsdXlhIGxhcyBmcmVjdWVuY2lhcyBkZSBhY3RpdmlkYWQgc2V4dWFsIHkgb3RyYSBxdWUgc2Vy4SB1biBmYWN0b3IsIHF1ZSBub3MgcHJvcG9yY2lvbmFy4SBpbmZvcm1hY2nzbiBzb2JyZSBsYSB0aXR1bGFjafNuIHVuaXZlcnNpdGFyaWEgZGUgY2FkYSB1bm8gZGUgbG9zIGVzdHVkaWFudGVzLg0KYGBge3J9DQp2MTwtYygxMSwgMTQsIDcsIDE1LCAxMSwgMTMsIDExICwxNiAsMTAsIDE1ICwxOCwgMTIsIDksDQogICAgICA5LCAxMCwgMTAsIDE1LCAxMCwgMTQsIDEwLCAxMCwgMTIsIDE0ICwxMiwgMTUsIDcgLDEzICw2LCAxMCAsMTUsIDIwICwxMCwgMTMgLDEwICw2ICwxNCAsOCAsMTAgLDgsIDExKQ0KdjI8LWMoMTMsIDEwLCAxMiwgNywgNSwgMTAsIDEwICwxNiwgOSwgNyAsNywgMiwgNiwgOSwgOSwgOCwgOCwgMTAgLDMgLDYsIDUsIDIsIDkgLDMsIDQsIDUsIDEwICw4ICw1LCA5LCAxMCwgOCwgMTMsIDEwLCAwLCAyLCAxLCAxLCAwLCA0KQ0KdjM8LWMoNiwgNyAsMyAsNSAsOSwgNiwgMSAsNiAsMCAsMiwgNSwgNiwgMTEsIDYsIDcgLDAgLDUsIDcsIDUsIDQgLDcgLDQsIDIsIDgsIDkgLDYgLDEgLDQgLDcgLDcgLDggLDkgLDcgLDUgLDEgLDYgLDksIDQsIDcsIDYpDQpmcmVjX2FzPC1jKHYxLHYyLHYzKQ0KdGl0dWxhY2lvbmVzPC0gYXMuZmFjdG9yKGMocmVwKGMoIlQxIiwgIlQyIiwgIlQzIiksIGVhY2ggPTQwKSkpDQpgYGANCg0KPGhyIGNvbG9yPSJibHVlIiBzaXplPTM+DQoNCiMjIyogRXhwbG9yYSBsb3MgZGF0b3MgZGUgbGEgbXVlc3RyYSBtZWRpYW50ZSBncuFmaWNvcyB5IGRlc2NyaXB0aXZvcy4gv09ic2VydmFtb3MgZGlmZXJlbmNpYXMgZW4gbG9zIHZhbG9yZXMgcHJvbWVkaW9zIHkgZGUgdmFyaWFiaWxpZGFkIHBvciBncnVwb3M/DQoNCg0KRXhwbG9yYW1vcyBsb3MgZGF0b3MgZGUgbGEgbXVlc3RyYToNCg0KYGBge3J9DQpib3hwbG90KGZyZWNfYXMgfiB0aXR1bGFjaW9uZXMsIGNvbCA9IGMoInllbGxvdyIsICJibHVlIiwgIndoaXRlIiksIHlsYWIgPSAiRnJlY3VlbmNpYSBSZWxhY2lvbmVzIFNleHVhbGVzIikNCmBgYA0KTHVlZ28gbGFzIG1lZGlhcyBzb246DQoNCmBgYHtyfQ0KdGFwcGx5KGZyZWNfYXMsIHRpdHVsYWNpb25lcywgbWVhbikNCmBgYA0KDQoNCkNvbiBlbCBncuFmaWNvIGFudGVyaW9yIHBvZGVtb3Mgbm90YXIgcXVlIGxhcyB2YXJpYW56YXMgc29uIGRpZmVyZW50ZXMsIGFkZW3hcyBzZSBwb2Ry7WEgZGVjaXIgcXVlIGxhcyAzIG1lZGlhcyBzb24gZGlmZXJlbnRlcywgcGVybyBlbnRyZSAiVDEiIHkgIlQyIiwgcGFyZWNlIHF1ZSB0aWVuZW4gdW5hIG1lZGlhIGVzdGFk7XN0aWNhbWVudGUgc2VtZWphbnRlLg0KDQoNCjxociBjb2xvcj0iYmx1ZSIgc2l6ZT0zPg0KIyMjKiBSZWFsaXphIHVuIHRlc3QgRiAoQU5PVkEpIHBhcmEgY29tcGFyYXIgbGFzIG1lZGlhcyBkZSBsYXMgMyBwb2JsYWNpb25lcy4gv0N14WxlcyBzZXLtYW4gbGFzIGhpcPN0ZXNpcyBudWxhIHkgYWx0ZXJuYXRpdmE/DQoNClZhbW9zIGEgcHJvYmFyIHNpIA0KJCRIXzA6XG11X3tUMX09XG11X3tUMn09XG11X3tUM30kJCwNCmVzIGRlY2lyIHNpIGxhcyB0cmVzIG1lZGlhcyBzbyBpZ3VhbGVzLg0KDQpgYGB7cn0NCmFub3ZhMSA9IGFvdiggbG0oZnJlY19hc34gdGl0dWxhY2lvbmVzKSApI1JlYWxpemFtb3MgZWwgQU5PVkENCmBgYA0KUGVkaW1vcyB1biByZXN1bWVuIGRlIGxhIHRhYmxhIGRlbCBBTk9WQQ0KYGBge3J9DQpzdW1tYXJ5KGFub3ZhMSkNCmBgYA0KDQoNCkVsZW1lbnRvcyBnZW5lcmFkb3MgZW4gZWwgQU5PVkE6DQoNCmBgYHtyfQ0KbmFtZXMoYW5vdmExKQ0KYGBgDQoNCkRlYmlkbyBhIHF1ZSBlbCB2YWxvciBwIGVzIDEuMDdlLTEzLCBxdWUgZXMgbWVub3IgcXVlIGVsIG5pdmVsIGRlIHNpZ25pZmljYW5jaWEgZGUgMC4wNSwgcHVlZGUgcmVjaGF6YXIgbGEgaGlw83Rlc2lzIG51bGEgeSBjb25jbHVpciBxdWUgYWxndW5hcyBkZSBsYXMgdGl0dWxhY2lvbmVzIHRpZW5lbiBkaWZlcmVudGVzIG1lZGlhcy4NCg0KPGhyIGNvbG9yPSJibHVlIiBzaXplPTM+DQoNCiMjIyogVGFtYmnpbiBpbmRpY2EgcXVp6W4gc2Vy7WEgZWwgdmFsb3IgY3LtdGljbyBkZSBGIGJham8gbGEgaGlw83Rlc2lzIG51bGEsIHF1ZSBub3MgcHJvcG9yY2lvbmFy4SBsYSBkZWZpbmljafNuIGRlIHVuYSByZWdp824gZGUgYWNlcHRhY2nzbiB5IHJlY2hhem8gKGNvbnNpZGVyYW1vcyB1biBuaXZlbCBkZSBzaWduaWZpY2FjafNuIGFsZmEgPSAwLjA1KS4NCg0KQmFqbyBsYSBIbyBlbCBlc3RhZO1zdGljbyBkZSBjb250cmFzdGUgRiBzZSBkaXN0cmlidXllIGNvbW8gdW5hIEYgZGUgZ3JhZG9zIGRlIGxpYmVydGFkIChJLTEpLCAobi1JKSBkb25kZSBJIGVzIGVsIG76bWVybyBkZSBncnVwb3MgcXVlIGRpc3BvbmVtb3MgeSBuIGVsIHRhbWHxbyB0b3RhbCBkZSBsYSBtdWVzdHJhbC4gQXPtIG9idGVuZW1vcyBlbCBjdWFudGlsIGJ1c2NhZG86DQoNCmBgYHtyfQ0KcWYoMC4wNSwgMi0xLCA0MCozLTIsIGxvd2VyLnRhaWwgPSBGKQ0KYGBgDQoNCg0KPGhyIGNvbG9yPSJibHVlIiBzaXplPTM+DQojIyMqIERlc2NyaWJlIGxvcyByZXN1bHRhZG9zIG9idGVuaWRvcyBpbmRpY2FuZG8gcXVp6W4gZXMgZWwgdmFsb3IgZGVsIGVzdGFk7XN0aWNvIGRlIGNvbnRyYXN0ZSAoRiksIGxvcyBncmFkb3MgZGUgbGliZXJ0YWQgZGVsIGZhY3RvciwgbG9zIGdyYWRvcyBkZSBsaWJlcnRhZCByZXNpZHVhbGVzIHkgZWwgdmFsb3IgZGUgUC4NCg0KR3JhZG9zIGRlIGxpYmVydGFkIGZhY3RvcjoyDQpHcmFkb3MgZGUgbGliZXJ0YWQgUmVzaWR1YWxlczoxMTcNClZhbG9yIFA6MS4wN2UtMTMNCg0KVmFsb3JlcyBkZWwgZXN0YWTtc3RpY28gPiAzLjkyMTQ3OCBlc3RhcuFuIGluY2x1aWRvcyBlbiBsYSByZWdp824gZGUgcmVjaGF6by4gRW4gbnVldHJvIGNhc28gIDM4Ljk4IGVzIG11Y2hvIG1heW9yIHF1ZSBlbCB2YWxvciBjcu10aWNvIG9idGVuaWRvLg0KPGhyIGNvbG9yPSJibHVlIiBzaXplPTM+DQojIyMqIL9RdekgdmFsb3Igb2J0ZW5lbW9zIHBhcmEgbGEgZXN0aW1hY2nzbiBkZSBsYSB2YXJpYW56YSBjb236biBkZSBsb3MgZGF0b3M/DQoNCkxhIHJh7XogY3VhZHJhZGEgZGUgbGEgbWVkaWEgZGUgbG9zIGN1YWRyYWRvcyBkZWwgZXJyb3IsIGFkZW3hcyBkZSBwcm9wb3JjaW9uYXJub3MgdW5hIGVzdGltYWNp824gZGUgbGEgdmFyaWFuemEgbXVlc3RyYWwgZGUgdG9kb3MgbG9zIGRhdG9zLCBzZSB1dGlsaXphIGVuIGxhIG9idGVuY2nzbiBkZSBsb3MgaW50ZXJ2YWxvcyBkZSBjb25maWFuemEgZGUgbGFzIG1lZGlhcyBlbiBjYWRhIHVubyBkZSBsb3MgZ3J1cG9zIGRlIGludGVy6XMuDQoNCmBgYHtyIGVjaG89RkFMU0V9DQoxMC42DQpgYGANCg0KPGhyIGNvbG9yPSJibHVlIiBzaXplPTM+DQojIyMqIFRyYXMgZXZhbHVhciBsYSB0YWJsYSBBTk9WQSwgv2N14Wwgc2Vy7WEgdHUgY29uY2x1c2nzbiBlbiBlbCBjb250ZXh0byBkZWwgcHJvYmxlbWE/DQoNClNlIHJlY2hhemEgbGEgaGlwb3Rlc2lzIG51bGEgeSBzZSBjb25jbHV5ZSBxdWUgZXhpc3RlIGRpZmVyZW5jaWEgZW50cmUgbGEgYWN0aXZpZGFkIHNleHVhbCBkZSBsb3MgZXN0dWRpYW50ZXMgZGUgY2FkYSB0aXR1bGFjafNuLg0KDQo8aHIgY29sb3I9ImJsdWUiIHNpemU9Mz4NCg0KIyMjKiBEZXRlcm1pbmEgbG9zIGludGVydmFsb3MgZGUgY29uZmlhbnphIHBhcmEgbGFzIG1lZGlhcyBkZSBmcmVjdWVuY2lhIHNleHVhbCBlbiBjYWRhIHVubyBkZSBsYXMgdGl0dWxhY2lvbmVzIGRlc2NyaXRhcy4NCg0KDQoNCkludGVydmFsbyBkZSBjb25maWFuemEgZGUgbGEgbWVkaWEgZGUgbGFzIHJlbGFjaW9uZXMgc2V4dWFsZXMgcGFyYSBsYSB0aXR1bGFjafNuICpUMSosIGNvbiB1biBuaXZlbCBkZSBjb25maWFuemEgZGVsIDk1JToNCg0KDQpgYGB7cn0NCm1lZGlhMSA8LSBtZWFuKGZyZWNfYXNbdGl0dWxhY2lvbmVzPT0iVDEiXSkgDQp2YWxvcl90MSA8LSBwdCgwLjA1LzIsIDExNyAtIDIpIA0Kc3AxIDwtIHNxcnQoMTAuNikgICNkZXN2aWFjafNuIHTtcGljYSBkZSBsYSB2YXJpYW56YSBtdWVzdHJhbCBjb236bg0KZWUxICA8LSB2YWxvcl90MSAqIChzcDEvIHNxcnQoNikpICAjZXJyb3IgZGUgZXN0aW1hY2nzbiANCm1lZGlhMQ0KYGBgDQoNCmztbWl0ZSBzdXBlcmlvciBkZWwgaW50ZXJ2YWxvIGRlIGNvbmZpYW56YSBkZSBsYSBtZWRpYSANCmBgYHtyfQ0KbWVkaWExICsgZWUxDQpgYGANCg0KbO1taXRlIGluZmVyaW9yIGRlbCBpbnRlcnZhbG8gZGUgY29uZmlhbnphIGRlIGxhIG1lZGlhIA0KDQpgYGB7cn0NCm1lZGlhMSAtIGVlMQ0KYGBgDQoNCkludGVydmFsbyBkZSBjb25maWFuemEgZGUgbGEgbWVkaWEgZGUgbGFzIHJlbGFjaW9uZXMgc2V4dWFsZXMgcGFyYSBsYSB0aXR1bGFjafNuICpUMiosIGNvbiB1biBuaXZlbCBkZSBjb25maWFuemEgZGVsIDk1JToNCg0KDQpgYGB7cn0NCm1lZGlhMiA8LSBtZWFuKGZyZWNfYXNbdGl0dWxhY2lvbmVzPT0iVDIiXSkgDQp2YWxvcl90MiA8LSBwdCgwLjA1LzIsIDExNyAtIDIpIA0Kc3AyIDwtIHNxcnQoMTAuNikgICNkZXN2aWFjafNuIHTtcGljYSBkZSBsYSB2YXJpYW56YSBtdWVzdHJhbCBjb236bg0KZWUyICA8LSB2YWxvcl90MiAqIChzcDIvIHNxcnQoNikpICAjZXJyb3IgZGUgZXN0aW1hY2nzbiANCm1lZGlhMg0KYGBgDQoNCmztbWl0ZSBzdXBlcmlvciBkZWwgaW50ZXJ2YWxvIGRlIGNvbmZpYW56YSBkZSBsYSBtZWRpYSANCmBgYHtyfQ0KbWVkaWEyICsgZWUyDQpgYGANCg0KbO1taXRlIGluZmVyaW9yIGRlbCBpbnRlcnZhbG8gZGUgY29uZmlhbnphIGRlIGxhIG1lZGlhIA0KDQpgYGB7cn0NCm1lZGlhMiAtIGVlMg0KYGBgDQpJbnRlcnZhbG8gZGUgY29uZmlhbnphIGRlIGxhIG1lZGlhIGRlIGxhcyByZWxhY2lvbmVzIHNleHVhbGVzIHBhcmEgbGEgdGl0dWxhY2nzbiAqVDMqLCBjb24gdW4gbml2ZWwgZGUgY29uZmlhbnphIGRlbCA5NSU6DQoNCg0KYGBge3J9DQptZWRpYTMgPC0gbWVhbihmcmVjX2FzW3RpdHVsYWNpb25lcz09IlQzIl0pIA0KdmFsb3JfdDMgPC0gcHQoMC4wNS8yLCAxMTcgLSAyKSANCnNwMyA8LSBzcXJ0KDEwLjYpICAjZGVzdmlhY2nzbiB07XBpY2EgZGUgbGEgdmFyaWFuemEgbXVlc3RyYWwgY29t+m4NCmVlMyAgPC0gdmFsb3JfdDMgKiAoc3AzLyBzcXJ0KDYpKSAgI2Vycm9yIGRlIGVzdGltYWNp824gDQptZWRpYTMNCmBgYA0KDQps7W1pdGUgc3VwZXJpb3IgZGVsIGludGVydmFsbyBkZSBjb25maWFuemEgZGUgbGEgbWVkaWEgDQpgYGB7cn0NCm1lZGlhMyArIGVlMw0KYGBgDQoNCmztbWl0ZSBpbmZlcmlvciBkZWwgaW50ZXJ2YWxvIGRlIGNvbmZpYW56YSBkZSBsYSBtZWRpYSANCg0KYGBge3J9DQptZWRpYTMgLSBlZTMNCmBgYA0KDQoNCjxociBjb2xvcj0iYmx1ZSIgc2l6ZT0zPg0KIyMjKiBTaSBzZSBoYW4gb2J0ZW5pZG8gZGlmZXJlbmNpYXMgc2lnbmlmaWNhdGl2YXMgZW50cmUgbG9zIGdydXBvcywgZGV0ZXJtaW5hIGTzbmRlIHNlIG11ZXN0cmFuIGVzYXMgZGlmZXJlbmNpYXMgdXRpbGl6YW5kbyBlbCB0ZXN0IEhTRCBkZSBUdWtleS4gUmVwcmVzZW50YSBncuFmaWNhbWVudGUgbGFzIGRpZmVyZW5jaWFzIGVuY29udHJhZGFzIGUgaW50cmVwcmV0YSBsb3MgcmVzdWx0YWRvcyBvYnRlbmlkb3MuDQoNCg0KYGBge3J9DQppbnRlcnZhbHMxID0gVHVrZXlIU0QoYW5vdmExKQ0KaW50ZXJ2YWxzMQ0KYGBgDQoNCmBgYHtyfQ0KcGxvdChpbnRlcnZhbHMxKQ0KYGBgDQpTZSBwdWVkZSB2ZXIgcXVlIHNvbiBtdXkgZGlmZXJlbnRlcyBlbnRyZSB0b2RvcyBsb3MgZ3J1cG9zLg0KDQo8aHIgY29sb3I9ImJsdWUiIHNpemU9Mz4NCiMjIyogQSBwYXJ0aXIgZGUgbG9zIHJlc2lkdW9zIG9idGVuaWRvcyB5IG1lZGlhbnRlIHByb2NlZGltaWVudG9zIGdy4WZpY29zLCBjb25maXJtYSBsYSB2YWxpZGV6IGRlbCBtb2RlbG8gY29tcHJvYmFuZG8gZWwgY3VtcGxpbWllbnRvIGRlIGxhcyAzIGNvbmRpY2lvbmVzIGFzdW1pZGFzIGFsIGhhY2VyIGVsIEFOT1ZBLiC/Q3JlZXMgcXVlIGVsIG1vZGVsbyBBTk9WQSB1dGlsaXphZG8gZXMgduFsaWRvIHBhcmEgZXN0b3MgZGF0b3M/DQoNCkEgcGFydGlyIGRlIGxvcyByZXNpZHVvcyBkZWwgbW9kZWxvIGNvbXByb2JhcmVtb3Mgc2kgZWwgbW9kZWxvIEFOT1ZBIGVzIGFkZWN1YWRvLiBMb3Mgc3VwdWVzdG9zIHF1ZSBzZSBkZWJlbiBjdW1wbGlyIHNvbiB0cmVzOiBpbmRlcGVuZGVuY2lhLCBob21vY2VkYXN0aWNpZGFkIHkgbm9ybWFsaWRhZA0KDQoqSW5kZXBlbmRlbmNpYSoNCg0KYGBge3J9DQpwbG90KGFub3ZhMSRyZXNpZHVhbHMpDQpgYGANCipOb3JtYWxpZGFkKg0KTG9zIGdy4WZpY29zIHkgZGVzY3JpcHRpdm9zIG5vcyBpbmZvcm1hbiBzaSBzZSB2ZXJpZmljYSBsYSBpZ3VhbGRhZCBkZSB2YXJpYW56YXMgZW4gbG9zIGdydXBvcyBkZXNjcml0b3M6DQpgYGB7cn0NCnN1bW1hcnkoYW5vdmExJHJlc2lkdWFscykNCmBgYA0KDQpgYGB7cn0NCmJveHBsb3QoYW5vdmExJHJlc2lkdWFscykNCmBgYA0KDQpgYGB7cn0NCmhpc3QoYW5vdmExJHJlc2lkdWFscykNCmBgYA0KYGBge3J9DQpxcW5vcm0oYW5vdmExJHJlc2lkdWFscykgDQpxcWxpbmUoYW5vdmExJHJlc2lkdWFscykNCmBgYA0KDQpFbCB0ZXN0IGRlIFNoYXBpcm8tV2lsayBpbmRpY2EgcXVlIG5vIHRlbmVtb3MgZXZpZGVuY2lhIHN1ZmljaWVudGUgcGFyYSByZWNoYXphciBsYSBoaXDzdGVzaXMgbnVsYSAobm9ybWFsaWRhZCBkZSBsb3MgcmVzaWR1b3MpDQoNCg0KYGBge3J9DQpzaGFwaXJvLnRlc3QoYW5vdmExJHJlc2lkdWFscykNCmBgYA0KDQpDb21vIG9idGVuZW1vcyB1biB2YWxvciBwIG1heW9yIGEgMC4wNSwgcG9kZW1vcyBjb25jbHVpciBxdWUgbG9zIGRhdG9zIHNlIGRpc3RyaWJ1eWVuIG5vcm1hbG1lbnRlLg0KDQoqSG9tb2NlZGFzdGljaWRhZCoNCg0KYGBge3J9DQpib3hwbG90KGFub3ZhMSRyZXNpZHVhbHN+dGl0dWxhY2lvbmVzLCBjb2wgPSBjKCJ5ZWxsb3ciLCAiYmx1ZSIsICJ3aGl0ZSIpKSANCmBgYA0KDQoNCiMjIyogU2kgTk8gc2UgdmVyaWZpY2FyYW4gZXN0YXMgY29uZGljaW9uZXMsIL9oYXkgYWxndW5hIHBydWViYSBubyBwYXJhbel0cmljYSBwYXJhIGFib3JkYXIgbG9zIGRhdG9zPyBQcnXpYmFsbyB5IGNvbWVudGEgbG9zIHJlc3VsdGFkb3Mgb2J0ZW5pZG9zLg0KDQpLcnVza2FsLVdhbGxpcyB5IHBydWViYXMgcG9zdC1ob2MNCg0KYGBge3J9DQprcnVza2FsLnRlc3QoZnJlY19hcywgdGl0dWxhY2lvbmVzKQ0KYGBgDQoNCmBgYHtyfQ0KcWNoaXNxKDAuMDUsIDItMSwgbG93ZXIudGFpbCA9IEYpDQpgYGANClZhbG9yZXMgZGVsIGVzdGFk7XN0aWNvID4gMy44NDE0NTkgZXN0YXLhbiBpbmNsdWlkb3MgZW4gbGEgcmVnafNuIGRlIHJlY2hhem8uIEVuIG51ZXRybyBjYXNvIDUxLjUwNCBlcyBtdWNobyBtYXlvciBxdWUgZWwgdmFsb3IgY3LtdGljbyBvYnRlbmlkby4gUG9yIGxvIHRhbnRvIHNlIGNvbmNsdXllIHF1ZSBwcm92aWVuZW4gZGUgcG9ibGFjaW9uZXMgZGlmZXJlbnRlcy4NCg0KDQoNCg==