Introducción

Se analizan dos preguntas sobre el dataset estudiantes_completa:

  1. ANOVA: ¿El área de interés del estudiante afecta la nota final?
  2. Tabla de contingencia: ¿Existe asociación entre el sexo del estudiante y el área de interés declarada?

La metodología sigue lo desarrollado en clase (Pérez, 2026, Clase 5).


Carga y preparación de datos

library(readxl)
library(nortest)
library(car)
library(lsr)
library(vcd)
library(knitr)

estudiantes <- read_xlsx("estudiantes_completa.xlsx")
estudiantes <- estudiantes[, -1]

estudiantes$sexo    <- as.factor(estudiantes$sexo)
estudiantes$fuma    <- as.factor(estudiantes$fuma)
estudiantes$colegio <- as.factor(estudiantes$colegio)
estudiantes$clases  <- as.factor(estudiantes$clases)
estudiantes$interes <- as.factor(estudiantes$interes)

summary(estudiantes)
##         sexo         edad       fuma       colegio          clases   
##  Femenino :86   Min.   :16.04   No:82   Privado:71   Presencial:100  
##  Masculino:60   1st Qu.:17.22   Si:64   Publico:75   Virtual   : 46  
##                 Median :18.55                                        
##                 Mean   :18.89                                        
##                 3rd Qu.:20.39                                        
##                 Max.   :28.76                                        
##        interes      parcial           final             nota      
##  Lengua    :68   Min.   : 2.000   Min.   : 2.600   Min.   :3.500  
##  Matematica:24   1st Qu.: 5.400   1st Qu.: 5.000   1st Qu.:5.700  
##  Naturales :25   Median : 7.000   Median : 6.200   Median :6.550  
##  Sociales  :29   Mean   : 6.851   Mean   : 6.182   Mean   :6.516  
##                  3rd Qu.: 8.400   3rd Qu.: 7.350   3rd Qu.:7.475  
##                  Max.   :10.000   Max.   :10.000   Max.   :9.900

Parte I — ANOVA de un factor

Hipótesis

Se evalúa si la nota media difiere según el área de interés:

H₀: μ_Lengua = μ_Matemática = μ_Naturales = μ_Sociales
H₁: al menos una media difiere


Estadística descriptiva por grupo

medias <- aggregate(nota ~ interes, data = estudiantes, FUN = mean)
kable(medias,
      digits    = 2,
      col.names = c("Área de interés", "Nota media"),
      caption   = "Tabla 1. Medias por grupo de interés")
Tabla 1. Medias por grupo de interés
Área de interés Nota media
Lengua 7.35
Matematica 4.89
Naturales 6.34
Sociales 6.06

Verificación de supuestos

Normalidad por grupo

Se aplica Lilliefors (KS) dado que hay grupos con n > 50.

H₀: la nota sigue distribución normal en cada grupo
H₁: no sigue distribución normal

by(data    = estudiantes,
   INDICES = estudiantes$interes,
   FUN     = function(x) lillie.test(x$nota))
## estudiantes$interes: Lengua
## 
##  Lilliefors (Kolmogorov-Smirnov) normality test
## 
## data:  x$nota
## D = 0.057581, p-value = 0.8339
## 
## ------------------------------------------------------------ 
## estudiantes$interes: Matematica
## 
##  Lilliefors (Kolmogorov-Smirnov) normality test
## 
## data:  x$nota
## D = 0.12788, p-value = 0.3936
## 
## ------------------------------------------------------------ 
## estudiantes$interes: Naturales
## 
##  Lilliefors (Kolmogorov-Smirnov) normality test
## 
## data:  x$nota
## D = 0.12705, p-value = 0.3737
## 
## ------------------------------------------------------------ 
## estudiantes$interes: Sociales
## 
##  Lilliefors (Kolmogorov-Smirnov) normality test
## 
## data:  x$nota
## D = 0.11946, p-value = 0.361

En los cuatro grupos el p-valor supera 0.05 → no se rechaza H₀. Se verifica normalidad en cada grupo.


Homogeneidad de varianzas

H₀: las varianzas son iguales en todos los grupos
H₁: al menos un grupo presenta varianza distinta

bartlett.test(nota ~ interes, data = estudiantes)
## 
##  Bartlett test of homogeneity of variances
## 
## data:  nota by interes
## Bartlett's K-squared = 3.1558, df = 3, p-value = 0.3682
leveneTest(nota ~ interes, data = estudiantes)

Ambas pruebas: p-valor > 0.05 → no se rechaza H₀. Se verifica homocedasticidad. El ANOVA paramétrico es apropiado.


ANOVA

anova1 <- aov(nota ~ interes, data = estudiantes)
summary(anova1)
##              Df Sum Sq Mean Sq F value Pr(>F)    
## interes       3  117.5   39.15    45.8 <2e-16 ***
## Residuals   142  121.4    0.85                   
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

p-valor < 2e-16, muy por debajo de α = 0.05 → se rechaza H₀: hay diferencias significativas entre grupos.


Tamaño de efecto — η²

\[\eta^2 = \frac{SC_{entre}}{SC_{total}}\]

kable(etaSquared(anova1),
      digits  = 3,
      caption = "Tabla 2. Eta cuadrado (referencia: 0.01 pequeño | 0.06 mediano | 0.14 grande)")
Tabla 2. Eta cuadrado (referencia: 0.01 pequeño | 0.06 mediano | 0.14 grande)
eta.sq eta.sq.part
interes 0.492 0.492

El η² = 0.49 indica que el 49% de la variabilidad en la nota queda explicado por el área de interés — efecto grande.


Comparaciones post hoc

Tukey HSD

Recomendado cuando hay más de 6 grupos o el diseño es equilibrado (Pérez, 2026, Diapositiva 15).

library(ggplot2)

intervalos <- TukeyHSD(anova1)
intervalos
##   Tukey multiple comparisons of means
##     95% family-wise confidence level
## 
## Fit: aov(formula = nota ~ interes, data = estudiantes)
## 
## $interes
##                            diff        lwr        upr     p adj
## Matematica-Lengua    -2.4583333 -3.0290522 -1.8876144 0.0000000
## Naturales-Lengua     -1.0100000 -1.5722189 -0.4477811 0.0000406
## Sociales-Lengua      -1.2913793 -1.8244942 -0.7582644 0.0000000
## Naturales-Matematica  1.4483333  0.7614059  2.1352607 0.0000011
## Sociales-Matematica   1.1669540  0.5036361  1.8302719 0.0000607
## Sociales-Naturales   -0.2813793 -0.9373981  0.3746395 0.6808700
# Gráfico con etiquetas completas
tukey_df <- as.data.frame(intervalos$interes)
tukey_df$comparacion <- rownames(tukey_df)

ggplot(tukey_df, aes(x = diff, y = comparacion)) +
  geom_point(size = 3, color = "#2c7bb6") +
  geom_errorbarh(aes(xmin = lwr, xmax = upr),
                 height = 0.3, color = "#2c7bb6") +
  geom_vline(xintercept = 0, linetype = "dashed",
             color = "gray40") +
  labs(
    title    = "Comparaciones múltiples — Tukey HSD",
    subtitle = "Intervalos de confianza al 95%",
    x        = "Diferencia de medias",
    y        = "Par comparado",
    caption  = "Si el IC cruza la línea en 0, no hay diferencia significativa"
  ) +
  theme_minimal(base_size = 13) +
  theme(plot.title  = element_text(face = "bold"),
        axis.text.y = element_text(size = 11))
Figura 1. Intervalos de confianza al 95% — Tukey HSD

Figura 1. Intervalos de confianza al 95% — Tukey HSD

Bonferroni y corrección de Holm

# Bonferroni: más conservador
pairwise.t.test(x               = estudiantes$nota,
                g               = estudiantes$interes,
                p.adjust.method = "bonferroni",
                pool.sd         = TRUE,
                paired          = FALSE,
                alternative     = "two.sided")
## 
##  Pairwise comparisons using t tests with pooled SD 
## 
## data:  estudiantes$nota and estudiantes$interes 
## 
##            Lengua  Matematica Naturales
## Matematica < 2e-16 -          -        
## Naturales  4.1e-05 1.1e-06    -        
## Sociales   2.1e-08 6.2e-05    1        
## 
## P value adjustment method: bonferroni
# Holm: menos conservador que Bonferroni
pairwise.t.test(x               = estudiantes$nota,
                g               = estudiantes$interes,
                p.adjust.method = "holm",
                pool.sd         = TRUE,
                paired          = FALSE,
                alternative     = "two.sided")
## 
##  Pairwise comparisons using t tests with pooled SD 
## 
## data:  estudiantes$nota and estudiantes$interes 
## 
##            Lengua  Matematica Naturales
## Matematica < 2e-16 -          -        
## Naturales  2.1e-05 7.5e-07    -        
## Sociales   1.8e-08 2.1e-05    0.27     
## 
## P value adjustment method: holm

Resumen ANOVA

comparaciones <- data.frame(
  Par         = c("Lengua vs Matemática",
                  "Lengua vs Naturales",
                  "Lengua vs Sociales",
                  "Matemática vs Naturales",
                  "Matemática vs Sociales",
                  "Naturales vs Sociales"),
  Diferencia  = c(-2.458, -1.010, -1.291, 1.448, 1.167, -0.281),
  p_Tukey     = c("< 0.001", "< 0.001", "< 0.001",
                  "< 0.001", "< 0.001", "0.681"),
  Decision    = c(rep("Se rechaza H₀", 5), "No se rechaza H₀")
)

kable(comparaciones,
      col.names = c("Par comparado", "Diferencia de medias",
                    "p-valor (Tukey)", "Decisión (α = 0.05)"),
      caption   = "Tabla 3. Comparaciones post hoc — Tukey HSD")
Tabla 3. Comparaciones post hoc — Tukey HSD
Par comparado Diferencia de medias p-valor (Tukey) Decisión (α = 0.05)
Lengua vs Matemática -2.458 < 0.001 Se rechaza H₀
Lengua vs Naturales -1.010 < 0.001 Se rechaza H₀
Lengua vs Sociales -1.291 < 0.001 Se rechaza H₀
Matemática vs Naturales 1.448 < 0.001 Se rechaza H₀
Matemática vs Sociales 1.167 < 0.001 Se rechaza H₀
Naturales vs Sociales -0.281 0.681 No se rechaza H₀

Parte II — Tabla de Contingencia

Hipótesis

Se evalúa si existe asociación entre el sexo del estudiante y el área de interés declarada:

H₀: sexo e interés son independientes
H₁: existe asociación entre sexo e interés


Tabla de frecuencias

contingencia <- table(estudiantes$sexo, estudiantes$interes)

# Frecuencias observadas
kable(contingencia,
      caption = "Tabla 4. Frecuencias observadas — Sexo × Interés")
Tabla 4. Frecuencias observadas — Sexo × Interés
Lengua Matematica Naturales Sociales
Femenino 43 14 14 15
Masculino 25 10 11 14
# Frecuencias marginales
margin.table(contingencia, 1)   # por fila (sexo)
## 
##  Femenino Masculino 
##        86        60
margin.table(contingencia, 2)   # por columna (interés)
## 
##     Lengua Matematica  Naturales   Sociales 
##         68         24         25         29
# Proporciones
kable(round(prop.table(contingencia), 3),
      caption = "Tabla 5. Proporciones sobre el total")
Tabla 5. Proporciones sobre el total
Lengua Matematica Naturales Sociales
Femenino 0.295 0.096 0.096 0.103
Masculino 0.171 0.068 0.075 0.096

Prueba Chi cuadrado

\[\chi^2 = \sum \frac{(O - E)^2}{E}\]

Con (r-1)(s-1) grados de libertad.

# Tabla 4x2: no se usa corrección de Yates
chisq.test(contingencia, correct = FALSE)
## 
##  Pearson's Chi-squared test
## 
## data:  contingencia
## X-squared = 1.2349, df = 3, p-value = 0.7447

p-valor = 0.745 > 0.05 → no se rechaza H₀. No hay evidencia de asociación entre sexo y área de interés.


Medidas de asociación

La prueba χ² solo indica si hay o no asociación, no informa sobre la dirección ni la fuerza de la misma (Pérez, 2026, Diapositiva 27).

assocstats(contingencia)
##                     X^2 df P(> X^2)
## Likelihood Ratio 1.2322  3  0.74529
## Pearson          1.2349  3  0.74465
## 
## Phi-Coefficient   : NA 
## Contingency Coeff.: 0.092 
## Cramer's V        : 0.092
# Cálculo manual para verificar
chi_val <- chisq.test(contingencia)$statistic
n       <- sum(contingencia)

C_contingencia <- sqrt(chi_val / (chi_val + n))
V_cramer       <- sqrt(chi_val / n)   # t=1 para tabla 2×k

cat("Coeficiente de Contingencia:", round(C_contingencia, 3), "\n")
## Coeficiente de Contingencia: 0.092
cat("V de Cramer:", round(V_cramer, 3), "\n")
## V de Cramer: 0.092

Interpretación de V de Cramer (Pérez, 2026, Diapositiva 27):

Valor Asociación
< 0.05 Débil
0.05 – 0.25 Moderada
0.25 – 1 Fuerte

Segundo ejemplo: Colegio × Modalidad de clases

contingencia2 <- table(estudiantes$colegio, estudiantes$clases)

kable(contingencia2,
      caption = "Tabla 6. Frecuencias observadas — Colegio × Modalidad")
Tabla 6. Frecuencias observadas — Colegio × Modalidad
Presencial Virtual
Privado 43 28
Publico 57 18
kable(round(prop.table(contingencia2), 3),
      caption = "Tabla 7. Proporciones sobre el total")
Tabla 7. Proporciones sobre el total
Presencial Virtual
Privado 0.295 0.192
Publico 0.390 0.123
# Tabla 2x2: se usa corrección de Yates
chisq.test(contingencia2, correct = TRUE)
## 
##  Pearson's Chi-squared test with Yates' continuity correction
## 
## data:  contingencia2
## X-squared = 3.3438, df = 1, p-value = 0.06746
assocstats(contingencia2)
##                     X^2 df P(> X^2)
## Likelihood Ratio 4.0482  1 0.044218
## Pearson          4.0273  1 0.044768
## 
## Phi-Coefficient   : 0.166 
## Contingency Coeff.: 0.164 
## Cramer's V        : 0.166

p-valor ≈ 0.067 → no se rechaza H₀ al 5%, aunque bordeando la significación. La V de Cramer = 0.166 indica asociación moderada.


Conclusiones

ANOVA: El área de interés tiene un efecto estadísticamente significativo y de magnitud grande sobre la nota final (F = 45.8; p < 0.001; η² = 0.49). Lengua presenta la media más alta (~7.39) y Matemática la más baja (~4.93). Naturales y Sociales no difieren significativamente entre sí.

Tablas de contingencia: No se encontró asociación significativa entre sexo y área de interés (χ² = 1.23; p = 0.745; V = 0.092). Para colegio y modalidad de clases, la asociación bordea la significación (p = 0.067) con fuerza moderada (V = 0.166).


Referencias

  • Pérez, S. N. (2026). Fundamentos de Estadística [Diapositivas Clase 5]. Especialización en Ciencia de Datos, Universidad Nacional del Oeste.
  • Devore, J. L. (2008). Probabilidad y estadística para ingeniería y ciencias (7ma ed.). Cengage Learning.
LS0tDQp0aXRsZTogJ0FOT1ZBIHkgVGFibGFzIGRlIENvbnRpbmdlbmNpYSDigJQgRGF0YXNldCBFc3R1ZGlhbnRlcyAobiA9IDE0NiknDQphdXRob3I6ICdFZHVhcmRvIMOBcm5pY2EnDQpkYXRlOiAiQ29ob3J0ZSAyMDI2Ig0Kb3V0cHV0Og0KICBodG1sX2RvY3VtZW50Og0KICAgIHRvYzogdHJ1ZQ0KICAgIHRvY19mbG9hdDogdHJ1ZQ0KICAgIGNvZGVfZm9sZGluZzogc2hvdw0KICAgIGRmX3ByaW50OiBwYWdlZA0KICAgIHRoZW1lOiB1bml0ZWQNCiAgICBjb2RlX2Rvd25sb2FkOiB0cnVlDQotLS0NCg0KYGBge3Igc2V0dXAsIGluY2x1ZGU9RkFMU0V9DQprbml0cjo6b3B0c19jaHVuayRzZXQoZWNobyA9IFRSVUUsIG1lc3NhZ2UgPSBGQUxTRSwgd2FybmluZyA9IEZBTFNFKQ0Ka25pdHI6Om9wdHNfa25pdCRzZXQocm9vdC5kaXIgPSAiQzovVXNlcnMvdXNlci9EZXNrdG9wL0VzcC4gZW4gQ2llbmNpYSBkZSBEYXRvcy80LiBlc3RhZGlzdGljYSIpDQpgYGANCg0KPGNlbnRlcj4NCiFbIF0oZXNjdWRvLnBuZyl7d2lkdGg9IjE1MHB4IiBoZWlnaHQ9IjE1MHB4In0NCjwvY2VudGVyPg0KDQojIyBJbnRyb2R1Y2Npw7NuDQoNClNlIGFuYWxpemFuIGRvcyBwcmVndW50YXMgc29icmUgZWwgZGF0YXNldCBgZXN0dWRpYW50ZXNfY29tcGxldGFgOg0KDQoxLiAqKkFOT1ZBKio6IMK/RWwgw6FyZWEgZGUgaW50ZXLDqXMgZGVsIGVzdHVkaWFudGUgYWZlY3RhIGxhIG5vdGEgZmluYWw/DQoyLiAqKlRhYmxhIGRlIGNvbnRpbmdlbmNpYSoqOiDCv0V4aXN0ZSBhc29jaWFjacOzbiBlbnRyZSBlbCBzZXhvIGRlbA0KICAgZXN0dWRpYW50ZSB5IGVsIMOhcmVhIGRlIGludGVyw6lzIGRlY2xhcmFkYT8NCg0KTGEgbWV0b2RvbG9nw61hIHNpZ3VlIGxvIGRlc2Fycm9sbGFkbyBlbiBjbGFzZSAoUMOpcmV6LCAyMDI2LCBDbGFzZSA1KS4NCg0KLS0tDQoNCiMjIENhcmdhIHkgcHJlcGFyYWNpw7NuIGRlIGRhdG9zDQoNCmBgYHtyIGRhdG9zfQ0KbGlicmFyeShyZWFkeGwpDQpsaWJyYXJ5KG5vcnRlc3QpDQpsaWJyYXJ5KGNhcikNCmxpYnJhcnkobHNyKQ0KbGlicmFyeSh2Y2QpDQpsaWJyYXJ5KGtuaXRyKQ0KDQplc3R1ZGlhbnRlcyA8LSByZWFkX3hsc3goImVzdHVkaWFudGVzX2NvbXBsZXRhLnhsc3giKQ0KZXN0dWRpYW50ZXMgPC0gZXN0dWRpYW50ZXNbLCAtMV0NCg0KZXN0dWRpYW50ZXMkc2V4byAgICA8LSBhcy5mYWN0b3IoZXN0dWRpYW50ZXMkc2V4bykNCmVzdHVkaWFudGVzJGZ1bWEgICAgPC0gYXMuZmFjdG9yKGVzdHVkaWFudGVzJGZ1bWEpDQplc3R1ZGlhbnRlcyRjb2xlZ2lvIDwtIGFzLmZhY3Rvcihlc3R1ZGlhbnRlcyRjb2xlZ2lvKQ0KZXN0dWRpYW50ZXMkY2xhc2VzICA8LSBhcy5mYWN0b3IoZXN0dWRpYW50ZXMkY2xhc2VzKQ0KZXN0dWRpYW50ZXMkaW50ZXJlcyA8LSBhcy5mYWN0b3IoZXN0dWRpYW50ZXMkaW50ZXJlcykNCg0Kc3VtbWFyeShlc3R1ZGlhbnRlcykNCmBgYA0KDQotLS0NCg0KIyBQYXJ0ZSBJIOKAlCBBTk9WQSBkZSB1biBmYWN0b3INCg0KIyMgSGlww7N0ZXNpcw0KDQpTZSBldmFsw7phIHNpIGxhIG5vdGEgbWVkaWEgZGlmaWVyZSBzZWfDum4gZWwgw6FyZWEgZGUgaW50ZXLDqXM6DQoNCioqSOKCgDoqKiDOvF9MZW5ndWEgPSDOvF9NYXRlbcOhdGljYSA9IM68X05hdHVyYWxlcyA9IM68X1NvY2lhbGVzICANCioqSOKCgToqKiBhbCBtZW5vcyB1bmEgbWVkaWEgZGlmaWVyZQ0KDQotLS0NCg0KIyMgRXN0YWTDrXN0aWNhIGRlc2NyaXB0aXZhIHBvciBncnVwbw0KDQpgYGB7ciBkZXNjcmlwdGl2YX0NCm1lZGlhcyA8LSBhZ2dyZWdhdGUobm90YSB+IGludGVyZXMsIGRhdGEgPSBlc3R1ZGlhbnRlcywgRlVOID0gbWVhbikNCmthYmxlKG1lZGlhcywNCiAgICAgIGRpZ2l0cyAgICA9IDIsDQogICAgICBjb2wubmFtZXMgPSBjKCLDgXJlYSBkZSBpbnRlcsOpcyIsICJOb3RhIG1lZGlhIiksDQogICAgICBjYXB0aW9uICAgPSAiVGFibGEgMS4gTWVkaWFzIHBvciBncnVwbyBkZSBpbnRlcsOpcyIpDQpgYGANCg0KLS0tDQoNCiMjIFZlcmlmaWNhY2nDs24gZGUgc3VwdWVzdG9zDQoNCiMjIyBOb3JtYWxpZGFkIHBvciBncnVwbw0KDQpTZSBhcGxpY2EgTGlsbGllZm9ycyAoS1MpIGRhZG8gcXVlIGhheSBncnVwb3MgY29uIG4gPiA1MC4NCg0KKipI4oKAOioqIGxhIG5vdGEgc2lndWUgZGlzdHJpYnVjacOzbiBub3JtYWwgZW4gY2FkYSBncnVwbyAgDQoqKkjigoE6Kiogbm8gc2lndWUgZGlzdHJpYnVjacOzbiBub3JtYWwNCg0KYGBge3Igbm9ybWFsaWRhZH0NCmJ5KGRhdGEgICAgPSBlc3R1ZGlhbnRlcywNCiAgIElORElDRVMgPSBlc3R1ZGlhbnRlcyRpbnRlcmVzLA0KICAgRlVOICAgICA9IGZ1bmN0aW9uKHgpIGxpbGxpZS50ZXN0KHgkbm90YSkpDQpgYGANCg0KRW4gbG9zIGN1YXRybyBncnVwb3MgZWwgcC12YWxvciBzdXBlcmEgMC4wNSDihpIgKipubyBzZSByZWNoYXphIEjigoAqKi4NClNlIHZlcmlmaWNhIG5vcm1hbGlkYWQgZW4gY2FkYSBncnVwby4NCg0KLS0tDQoNCiMjIyBIb21vZ2VuZWlkYWQgZGUgdmFyaWFuemFzDQoNCioqSOKCgDoqKiBsYXMgdmFyaWFuemFzIHNvbiBpZ3VhbGVzIGVuIHRvZG9zIGxvcyBncnVwb3MgIA0KKipI4oKBOioqIGFsIG1lbm9zIHVuIGdydXBvIHByZXNlbnRhIHZhcmlhbnphIGRpc3RpbnRhDQoNCmBgYHtyIGhvbW9jZWRhc3RpY2lkYWR9DQpiYXJ0bGV0dC50ZXN0KG5vdGEgfiBpbnRlcmVzLCBkYXRhID0gZXN0dWRpYW50ZXMpDQpsZXZlbmVUZXN0KG5vdGEgfiBpbnRlcmVzLCBkYXRhID0gZXN0dWRpYW50ZXMpDQpgYGANCg0KQW1iYXMgcHJ1ZWJhczogcC12YWxvciA+IDAuMDUg4oaSICoqbm8gc2UgcmVjaGF6YSBI4oKAKiouDQpTZSB2ZXJpZmljYSBob21vY2VkYXN0aWNpZGFkLiBFbCBBTk9WQSBwYXJhbcOpdHJpY28gZXMgYXByb3BpYWRvLg0KDQotLS0NCg0KIyMgQU5PVkENCg0KYGBge3IgYW5vdmF9DQphbm92YTEgPC0gYW92KG5vdGEgfiBpbnRlcmVzLCBkYXRhID0gZXN0dWRpYW50ZXMpDQpzdW1tYXJ5KGFub3ZhMSkNCmBgYA0KDQpwLXZhbG9yIDwgMmUtMTYsIG11eSBwb3IgZGViYWpvIGRlIM6xID0gMC4wNSDihpINCioqc2UgcmVjaGF6YSBI4oKAKio6IGhheSBkaWZlcmVuY2lhcyBzaWduaWZpY2F0aXZhcyBlbnRyZSBncnVwb3MuDQoNCi0tLQ0KDQojIyBUYW1hw7FvIGRlIGVmZWN0byDigJQgzrfCsg0KDQokJFxldGFeMiA9IFxmcmFje1NDX3tlbnRyZX19e1NDX3t0b3RhbH19JCQNCg0KYGBge3IgZXRhfQ0Ka2FibGUoZXRhU3F1YXJlZChhbm92YTEpLA0KICAgICAgZGlnaXRzICA9IDMsDQogICAgICBjYXB0aW9uID0gIlRhYmxhIDIuIEV0YSBjdWFkcmFkbyAocmVmZXJlbmNpYTogMC4wMSBwZXF1ZcOxbyB8IDAuMDYgbWVkaWFubyB8IDAuMTQgZ3JhbmRlKSIpDQpgYGANCg0KRWwgzrfCsiA9IDAuNDkgaW5kaWNhIHF1ZSBlbCAqKjQ5JSBkZSBsYSB2YXJpYWJpbGlkYWQgZW4gbGEgbm90YSoqDQpxdWVkYSBleHBsaWNhZG8gcG9yIGVsIMOhcmVhIGRlIGludGVyw6lzIOKAlCBlZmVjdG8gZ3JhbmRlLg0KDQotLS0NCg0KIyMgQ29tcGFyYWNpb25lcyBwb3N0IGhvYw0KDQojIyMgVHVrZXkgSFNEDQoNClJlY29tZW5kYWRvIGN1YW5kbyBoYXkgbcOhcyBkZSA2IGdydXBvcyBvIGVsIGRpc2XDsW8gZXMgZXF1aWxpYnJhZG8NCihQw6lyZXosIDIwMjYsIERpYXBvc2l0aXZhIDE1KS4NCg0KYGBge3IgdHVrZXksIGZpZy5jYXA9IkZpZ3VyYSAxLiBJbnRlcnZhbG9zIGRlIGNvbmZpYW56YSBhbCA5NSUg4oCUIFR1a2V5IEhTRCJ9DQpsaWJyYXJ5KGdncGxvdDIpDQoNCmludGVydmFsb3MgPC0gVHVrZXlIU0QoYW5vdmExKQ0KaW50ZXJ2YWxvcw0KDQojIEdyw6FmaWNvIGNvbiBldGlxdWV0YXMgY29tcGxldGFzDQp0dWtleV9kZiA8LSBhcy5kYXRhLmZyYW1lKGludGVydmFsb3MkaW50ZXJlcykNCnR1a2V5X2RmJGNvbXBhcmFjaW9uIDwtIHJvd25hbWVzKHR1a2V5X2RmKQ0KDQpnZ3Bsb3QodHVrZXlfZGYsIGFlcyh4ID0gZGlmZiwgeSA9IGNvbXBhcmFjaW9uKSkgKw0KICBnZW9tX3BvaW50KHNpemUgPSAzLCBjb2xvciA9ICIjMmM3YmI2IikgKw0KICBnZW9tX2Vycm9yYmFyaChhZXMoeG1pbiA9IGx3ciwgeG1heCA9IHVwciksDQogICAgICAgICAgICAgICAgIGhlaWdodCA9IDAuMywgY29sb3IgPSAiIzJjN2JiNiIpICsNCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gMCwgbGluZXR5cGUgPSAiZGFzaGVkIiwNCiAgICAgICAgICAgICBjb2xvciA9ICJncmF5NDAiKSArDQogIGxhYnMoDQogICAgdGl0bGUgICAgPSAiQ29tcGFyYWNpb25lcyBtw7psdGlwbGVzIOKAlCBUdWtleSBIU0QiLA0KICAgIHN1YnRpdGxlID0gIkludGVydmFsb3MgZGUgY29uZmlhbnphIGFsIDk1JSIsDQogICAgeCAgICAgICAgPSAiRGlmZXJlbmNpYSBkZSBtZWRpYXMiLA0KICAgIHkgICAgICAgID0gIlBhciBjb21wYXJhZG8iLA0KICAgIGNhcHRpb24gID0gIlNpIGVsIElDIGNydXphIGxhIGzDrW5lYSBlbiAwLCBubyBoYXkgZGlmZXJlbmNpYSBzaWduaWZpY2F0aXZhIg0KICApICsNCiAgdGhlbWVfbWluaW1hbChiYXNlX3NpemUgPSAxMykgKw0KICB0aGVtZShwbG90LnRpdGxlICA9IGVsZW1lbnRfdGV4dChmYWNlID0gImJvbGQiKSwNCiAgICAgICAgYXhpcy50ZXh0LnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDExKSkNCmBgYA0KDQojIyMgQm9uZmVycm9uaSB5IGNvcnJlY2Npw7NuIGRlIEhvbG0NCg0KYGBge3IgYm9uZmVycm9uaX0NCiMgQm9uZmVycm9uaTogbcOhcyBjb25zZXJ2YWRvcg0KcGFpcndpc2UudC50ZXN0KHggICAgICAgICAgICAgICA9IGVzdHVkaWFudGVzJG5vdGEsDQogICAgICAgICAgICAgICAgZyAgICAgICAgICAgICAgID0gZXN0dWRpYW50ZXMkaW50ZXJlcywNCiAgICAgICAgICAgICAgICBwLmFkanVzdC5tZXRob2QgPSAiYm9uZmVycm9uaSIsDQogICAgICAgICAgICAgICAgcG9vbC5zZCAgICAgICAgID0gVFJVRSwNCiAgICAgICAgICAgICAgICBwYWlyZWQgICAgICAgICAgPSBGQUxTRSwNCiAgICAgICAgICAgICAgICBhbHRlcm5hdGl2ZSAgICAgPSAidHdvLnNpZGVkIikNCg0KIyBIb2xtOiBtZW5vcyBjb25zZXJ2YWRvciBxdWUgQm9uZmVycm9uaQ0KcGFpcndpc2UudC50ZXN0KHggICAgICAgICAgICAgICA9IGVzdHVkaWFudGVzJG5vdGEsDQogICAgICAgICAgICAgICAgZyAgICAgICAgICAgICAgID0gZXN0dWRpYW50ZXMkaW50ZXJlcywNCiAgICAgICAgICAgICAgICBwLmFkanVzdC5tZXRob2QgPSAiaG9sbSIsDQogICAgICAgICAgICAgICAgcG9vbC5zZCAgICAgICAgID0gVFJVRSwNCiAgICAgICAgICAgICAgICBwYWlyZWQgICAgICAgICAgPSBGQUxTRSwNCiAgICAgICAgICAgICAgICBhbHRlcm5hdGl2ZSAgICAgPSAidHdvLnNpZGVkIikNCmBgYA0KDQotLS0NCg0KIyMgUmVzdW1lbiBBTk9WQQ0KDQpgYGB7ciByZXN1bWVuX2Fub3ZhfQ0KY29tcGFyYWNpb25lcyA8LSBkYXRhLmZyYW1lKA0KICBQYXIgICAgICAgICA9IGMoIkxlbmd1YSB2cyBNYXRlbcOhdGljYSIsDQogICAgICAgICAgICAgICAgICAiTGVuZ3VhIHZzIE5hdHVyYWxlcyIsDQogICAgICAgICAgICAgICAgICAiTGVuZ3VhIHZzIFNvY2lhbGVzIiwNCiAgICAgICAgICAgICAgICAgICJNYXRlbcOhdGljYSB2cyBOYXR1cmFsZXMiLA0KICAgICAgICAgICAgICAgICAgIk1hdGVtw6F0aWNhIHZzIFNvY2lhbGVzIiwNCiAgICAgICAgICAgICAgICAgICJOYXR1cmFsZXMgdnMgU29jaWFsZXMiKSwNCiAgRGlmZXJlbmNpYSAgPSBjKC0yLjQ1OCwgLTEuMDEwLCAtMS4yOTEsIDEuNDQ4LCAxLjE2NywgLTAuMjgxKSwNCiAgcF9UdWtleSAgICAgPSBjKCI8IDAuMDAxIiwgIjwgMC4wMDEiLCAiPCAwLjAwMSIsDQogICAgICAgICAgICAgICAgICAiPCAwLjAwMSIsICI8IDAuMDAxIiwgIjAuNjgxIiksDQogIERlY2lzaW9uICAgID0gYyhyZXAoIlNlIHJlY2hhemEgSOKCgCIsIDUpLCAiTm8gc2UgcmVjaGF6YSBI4oKAIikNCikNCg0Ka2FibGUoY29tcGFyYWNpb25lcywNCiAgICAgIGNvbC5uYW1lcyA9IGMoIlBhciBjb21wYXJhZG8iLCAiRGlmZXJlbmNpYSBkZSBtZWRpYXMiLA0KICAgICAgICAgICAgICAgICAgICAicC12YWxvciAoVHVrZXkpIiwgIkRlY2lzacOzbiAozrEgPSAwLjA1KSIpLA0KICAgICAgY2FwdGlvbiAgID0gIlRhYmxhIDMuIENvbXBhcmFjaW9uZXMgcG9zdCBob2Mg4oCUIFR1a2V5IEhTRCIpDQpgYGANCg0KLS0tDQoNCiMgUGFydGUgSUkg4oCUIFRhYmxhIGRlIENvbnRpbmdlbmNpYQ0KDQojIyBIaXDDs3Rlc2lzDQoNClNlIGV2YWzDumEgc2kgZXhpc3RlIGFzb2NpYWNpw7NuIGVudHJlIGVsIHNleG8gZGVsIGVzdHVkaWFudGUNCnkgZWwgw6FyZWEgZGUgaW50ZXLDqXMgZGVjbGFyYWRhOg0KDQoqKkjigoA6Kiogc2V4byBlIGludGVyw6lzIHNvbiBpbmRlcGVuZGllbnRlcyAgDQoqKkjigoE6KiogZXhpc3RlIGFzb2NpYWNpw7NuIGVudHJlIHNleG8gZSBpbnRlcsOpcw0KDQotLS0NCg0KIyMgVGFibGEgZGUgZnJlY3VlbmNpYXMNCg0KYGBge3IgY29udGluZ2VuY2lhfQ0KY29udGluZ2VuY2lhIDwtIHRhYmxlKGVzdHVkaWFudGVzJHNleG8sIGVzdHVkaWFudGVzJGludGVyZXMpDQoNCiMgRnJlY3VlbmNpYXMgb2JzZXJ2YWRhcw0Ka2FibGUoY29udGluZ2VuY2lhLA0KICAgICAgY2FwdGlvbiA9ICJUYWJsYSA0LiBGcmVjdWVuY2lhcyBvYnNlcnZhZGFzIOKAlCBTZXhvIMOXIEludGVyw6lzIikNCg0KIyBGcmVjdWVuY2lhcyBtYXJnaW5hbGVzDQptYXJnaW4udGFibGUoY29udGluZ2VuY2lhLCAxKSAgICMgcG9yIGZpbGEgKHNleG8pDQptYXJnaW4udGFibGUoY29udGluZ2VuY2lhLCAyKSAgICMgcG9yIGNvbHVtbmEgKGludGVyw6lzKQ0KDQojIFByb3BvcmNpb25lcw0Ka2FibGUocm91bmQocHJvcC50YWJsZShjb250aW5nZW5jaWEpLCAzKSwNCiAgICAgIGNhcHRpb24gPSAiVGFibGEgNS4gUHJvcG9yY2lvbmVzIHNvYnJlIGVsIHRvdGFsIikNCmBgYA0KDQotLS0NCg0KIyMgUHJ1ZWJhIENoaSBjdWFkcmFkbw0KDQokJFxjaGleMiA9IFxzdW0gXGZyYWN7KE8gLSBFKV4yfXtFfSQkDQoNCkNvbiAoci0xKShzLTEpIGdyYWRvcyBkZSBsaWJlcnRhZC4NCg0KYGBge3IgY2hpMn0NCiMgVGFibGEgNHgyOiBubyBzZSB1c2EgY29ycmVjY2nDs24gZGUgWWF0ZXMNCmNoaXNxLnRlc3QoY29udGluZ2VuY2lhLCBjb3JyZWN0ID0gRkFMU0UpDQpgYGANCg0KcC12YWxvciA9IDAuNzQ1ID4gMC4wNSDihpIgKipubyBzZSByZWNoYXphIEjigoAqKi4NCk5vIGhheSBldmlkZW5jaWEgZGUgYXNvY2lhY2nDs24gZW50cmUgc2V4byB5IMOhcmVhIGRlIGludGVyw6lzLg0KDQotLS0NCg0KIyMgTWVkaWRhcyBkZSBhc29jaWFjacOzbg0KDQpMYSBwcnVlYmEgz4fCsiBzb2xvIGluZGljYSBzaSBoYXkgbyBubyBhc29jaWFjacOzbiwNCm5vIGluZm9ybWEgc29icmUgbGEgKipkaXJlY2Npw7NuIG5pIGxhIGZ1ZXJ6YSoqIGRlIGxhIG1pc21hDQooUMOpcmV6LCAyMDI2LCBEaWFwb3NpdGl2YSAyNykuDQoNCmBgYHtyIGFzb2NpYWNpb259DQphc3NvY3N0YXRzKGNvbnRpbmdlbmNpYSkNCg0KIyBDw6FsY3VsbyBtYW51YWwgcGFyYSB2ZXJpZmljYXINCmNoaV92YWwgPC0gY2hpc3EudGVzdChjb250aW5nZW5jaWEpJHN0YXRpc3RpYw0KbiAgICAgICA8LSBzdW0oY29udGluZ2VuY2lhKQ0KDQpDX2NvbnRpbmdlbmNpYSA8LSBzcXJ0KGNoaV92YWwgLyAoY2hpX3ZhbCArIG4pKQ0KVl9jcmFtZXIgICAgICAgPC0gc3FydChjaGlfdmFsIC8gbikgICAjIHQ9MSBwYXJhIHRhYmxhIDLDl2sNCg0KY2F0KCJDb2VmaWNpZW50ZSBkZSBDb250aW5nZW5jaWE6Iiwgcm91bmQoQ19jb250aW5nZW5jaWEsIDMpLCAiXG4iKQ0KY2F0KCJWIGRlIENyYW1lcjoiLCByb3VuZChWX2NyYW1lciwgMyksICJcbiIpDQpgYGANCg0KKipJbnRlcnByZXRhY2nDs24gZGUgViBkZSBDcmFtZXIqKiAoUMOpcmV6LCAyMDI2LCBEaWFwb3NpdGl2YSAyNyk6DQoNCnwgVmFsb3IgfCBBc29jaWFjacOzbiB8DQp8LS0tLS0tLXwtLS0tLS0tLS0tLXwNCnwgPCAwLjA1IHwgRMOpYmlsIHwNCnwgMC4wNSDigJMgMC4yNSB8IE1vZGVyYWRhIHwNCnwgMC4yNSDigJMgMSB8IEZ1ZXJ0ZSB8DQoNCi0tLQ0KDQojIyBTZWd1bmRvIGVqZW1wbG86IENvbGVnaW8gw5cgTW9kYWxpZGFkIGRlIGNsYXNlcw0KDQpgYGB7ciBjb250aW5nZW5jaWEyfQ0KY29udGluZ2VuY2lhMiA8LSB0YWJsZShlc3R1ZGlhbnRlcyRjb2xlZ2lvLCBlc3R1ZGlhbnRlcyRjbGFzZXMpDQoNCmthYmxlKGNvbnRpbmdlbmNpYTIsDQogICAgICBjYXB0aW9uID0gIlRhYmxhIDYuIEZyZWN1ZW5jaWFzIG9ic2VydmFkYXMg4oCUIENvbGVnaW8gw5cgTW9kYWxpZGFkIikNCg0Ka2FibGUocm91bmQocHJvcC50YWJsZShjb250aW5nZW5jaWEyKSwgMyksDQogICAgICBjYXB0aW9uID0gIlRhYmxhIDcuIFByb3BvcmNpb25lcyBzb2JyZSBlbCB0b3RhbCIpDQoNCiMgVGFibGEgMngyOiBzZSB1c2EgY29ycmVjY2nDs24gZGUgWWF0ZXMNCmNoaXNxLnRlc3QoY29udGluZ2VuY2lhMiwgY29ycmVjdCA9IFRSVUUpDQoNCmFzc29jc3RhdHMoY29udGluZ2VuY2lhMikNCmBgYA0KDQpwLXZhbG9yIOKJiCAwLjA2NyDihpIgKipubyBzZSByZWNoYXphIEjigoAqKiBhbCA1JSwgYXVucXVlIGJvcmRlYW5kbw0KbGEgc2lnbmlmaWNhY2nDs24uIExhIFYgZGUgQ3JhbWVyID0gMC4xNjYgaW5kaWNhIGFzb2NpYWNpw7NuIG1vZGVyYWRhLg0KDQotLS0NCg0KIyMgQ29uY2x1c2lvbmVzDQoNCioqQU5PVkE6KiogRWwgw6FyZWEgZGUgaW50ZXLDqXMgdGllbmUgdW4gZWZlY3RvIGVzdGFkw61zdGljYW1lbnRlDQpzaWduaWZpY2F0aXZvIHkgZGUgbWFnbml0dWQgZ3JhbmRlIHNvYnJlIGxhIG5vdGEgZmluYWwNCihGID0gNDUuODsgcCA8IDAuMDAxOyDOt8KyID0gMC40OSkuIExlbmd1YSBwcmVzZW50YSBsYSBtZWRpYQ0KbcOhcyBhbHRhICh+Ny4zOSkgeSBNYXRlbcOhdGljYSBsYSBtw6FzIGJhamEgKH40LjkzKS4NCk5hdHVyYWxlcyB5IFNvY2lhbGVzIG5vIGRpZmllcmVuIHNpZ25pZmljYXRpdmFtZW50ZSBlbnRyZSBzw60uDQoNCioqVGFibGFzIGRlIGNvbnRpbmdlbmNpYToqKiBObyBzZSBlbmNvbnRyw7MgYXNvY2lhY2nDs24gc2lnbmlmaWNhdGl2YQ0KZW50cmUgc2V4byB5IMOhcmVhIGRlIGludGVyw6lzICjPh8KyID0gMS4yMzsgcCA9IDAuNzQ1OyBWID0gMC4wOTIpLg0KUGFyYSBjb2xlZ2lvIHkgbW9kYWxpZGFkIGRlIGNsYXNlcywgbGEgYXNvY2lhY2nDs24gYm9yZGVhIGxhDQpzaWduaWZpY2FjacOzbiAocCA9IDAuMDY3KSBjb24gZnVlcnphIG1vZGVyYWRhIChWID0gMC4xNjYpLg0KDQotLS0NCg0KIyMgUmVmZXJlbmNpYXMNCg0KLSBQw6lyZXosIFMuIE4uICgyMDI2KS4gKkZ1bmRhbWVudG9zIGRlIEVzdGFkw61zdGljYSogW0RpYXBvc2l0aXZhcyBDbGFzZSA1XS4NCiAgRXNwZWNpYWxpemFjacOzbiBlbiBDaWVuY2lhIGRlIERhdG9zLCBVbml2ZXJzaWRhZCBOYWNpb25hbCBkZWwgT2VzdGUuDQotIERldm9yZSwgSi4gTC4gKDIwMDgpLiAqUHJvYmFiaWxpZGFkIHkgZXN0YWTDrXN0aWNhIHBhcmEgaW5nZW5pZXLDrWEgeQ0KICBjaWVuY2lhcyogKDdtYSBlZC4pLiBDZW5nYWdlIExlYXJuaW5nLg==