Bibliotecas
library(tidyverse)
library(janitor)
library(infer)
library(ggplot2)
library(ggpubr)
library(car)
Punto 1
En una encuesta realizada en Colombia a 128 sistemas de producción de
aguacate, se encontró que 47 de ellos usan fertilización orgánica y el
restante utilizan fertilización química. Construya un intervalo de
confianza del 99% para la proporción del uso de fertilizante orgánico en
este tipo de sistemas de producción. Interprete sus resultados.
- x = proporción que usa fertilizante orgánico
- n = número total de encuestados
- nc = nivel de confianza
- xgorro = porcentaje de proporcion
- se = error estandar
- f = valor establecido para un nc de 99%
- Icprop = vector que contiene los intervalos de confianza
Icprop = function(x,n,nc = 0.99)
{ xgorro = x/n
se = sqrt((xgorro * (1 - xgorro))/n)
f = qnorm((1 + nc)/2)
Icprop = c(xgorro - (f * se), xgorro, xgorro + (f*se))
return(Icprop)
}
x = 47
n = 128
nc = 0.99
Icprop(x,n,nc)
## [1] 0.2574403 0.3671875 0.4769347
Interpretación
Según la encuesta la proporción que usaba fertilizante orgánico era
de un 36.7% osea 47 sistemas, pero en realidad la proporción real se
encuentra dentro de un intervalo de 25.7% a 47.7% del total de
sistemas.
Punto 2
- Ingrediente de interés = Buffel - Cenchrus ciliaris - Hoja,
Tallo
- Departamentos = Antioquia y Cesar
- Variable respuesta de interés = edad de corte
alimentro <- read_csv("Alimentro-Depurada.csv")
alimentro %>% head
Datos punto 2
datosp2 <- alimentro %>%
filter(ingrediente == "Buffel - Cenchrus ciliaris - Hoja, Tallo") %>%
filter(departamento %in% c("Antioquia","Cesar"))
Exploratorio
Promedio
datosp2 %>%
group_by(ingrediente, departamento) %>%
summarise(promedio = mean(edad_corte_d))
Juego de
hipótesis
\[H_0: edad \ corte \ Antioquia = edad \
corte \ Cesar \\
H_1 : edad \ corte \ Antioquia \neq edad\ corte\ Cesar\]
Nivel de
significancia
En este caso usaremos un nivel de significancia del 5% (0.05)
Prueba de shapiro
wilk
shapiro.test(x = datosp2$edad_corte_d)
##
## Shapiro-Wilk normality test
##
## data: datosp2$edad_corte_d
## W = 0.73847, p-value < 2.2e-16
Solución
- Vamos a usar la función var.test() con los siguientes argumentos:
- formula: y ~ x. En este caso “y” es la variable edad de corte y el
“x” es el departamento.
- ratio: es el resultado del cociente de las dos varianzas. En este
caso asumimos en la hipótesis nula el valor de “1”.
- alternative: tipo de prueba. En este es bilateral (“two.sided”)
- conf.level: nivel de confianza. En este caso es 0.95 (1 - 0.5)
var.test(datosp2$edad_corte_d ~ datosp2$departamento,
ratio = 1,
alternative = "two.sided",
conf.level = 0.95)
##
## F test to compare two variances
##
## data: datosp2$edad_corte_d by datosp2$departamento
## F = 9.5607, num df = 189, denom df = 993, p-value < 2.2e-16
## alternative hypothesis: true ratio of variances is not equal to 1
## 95 percent confidence interval:
## 7.733251 12.019476
## sample estimates:
## ratio of variances
## 9.56071
Conclusión
- Como el valor p (2.2e-16) es menor que el nivel de significancia
(0.05), si existe evidencia para rechazar la hipótesis, es decir, que el
promedio de la edad de corte del departamento de Antioquia es diferente
al promedio de la edad de corte del departamento del Cesar.
- Como el intervalo de confianza (LI: 7.733251, LS: 12.019476) no
contiene el valor de referencia (“1”), si existe evidencia para rechazar
la hipótesis.
Punto 3
Usted fue asignado (a) para probar a través de métodos estadísticos
si en promedio la grasa dorsal (mm) de dos líneas genéticas de porcinos
presentan diferencias estadísticas y ¿cuál sería el rango de valores
esperados para la diferencia de esas dos líneas genéticas? ¿Cuál línea
genética recomendaría?
linea_a <- c(13.94, 15.30, 16.92, 14.89, 17.34, 17.43, 16.83, 15.61,
16.95, 17.69, 15.16, 16.53, 17.22, 15.17, 16.63)
linea_b <-c(15.62, 13.84, 14.25, 12.79, 17.01, 16.92, 11.13, 13.72,
14.26, 14.55, 14.11, 18.04, 12.17, 13.59, 13.81)
Juego de
hipótesis
\[H_0: promedio \ grasa \ dorsal \ linea
\ a = promedio \ grasa \ dorsal \ linea \ b \\
H_1 : promedio \ grasa \ dorsal \ linea \ a \neq promedio \ grasa \
dorsal \ linea \ b \]
Nivel de
significancia
En este caso usaremos un nivel de significancia del 5% (0.05)
Normalidad
Gráfico
ggqqplot(data = diferencia)

- Podemos concluir que si se cumple la normalidad, ya que los datos se
encuentran dentro de la banda de confianza
Igualdad de
varianza
var.test(x = linea_a, y = linea_b,
ratio = 1, alternative = "two.sided")
##
## F test to compare two variances
##
## data: linea_a and linea_b
## F = 0.37318, num df = 14, denom df = 14, p-value = 0.07551
## alternative hypothesis: true ratio of variances is not equal to 1
## 95 percent confidence interval:
## 0.125286 1.111535
## sample estimates:
## ratio of variances
## 0.3731753
Prueba t-student
t.test(x = linea_a, y = linea_b,
alternative = "two.sided",
conf.level = 0.95,
paired = TRUE,
var.equal = TRUE)
##
## Paired t-test
##
## data: linea_a and linea_b
## t = 3.5317, df = 14, p-value = 0.003319
## alternative hypothesis: true mean difference is not equal to 0
## 95 percent confidence interval:
## 0.7278099 2.9788568
## sample estimates:
## mean difference
## 1.853333
Conclusion
- Como el valor p (0.0003319) es menor que el nivel de significancia,
existe evidencia para rechazar la hipótesis nula, es decir, que el
promedio de la “linea a” es diferente al promedio para de la “linea
b”.
- Como el intervalo de confianza no contiene al cero ([0.7278099,
2.9788568]), existe evidencia para rechazar la hipótesis nula. Además,
el promedio de la “linea a” podría estar desde 0.72 hasta 2.97 puntos
por encima dela “linea b”
¿Cuál sería el rango
de valores esperados para la diferencia de esas dos líneas
genéticas?
- El rango de diferencia que podemos esperar esta entre (0.7278099 -
2.9788568)
¿Cuál línea genética
recomendaría?
- Nosotras recomendaríamos la línea genética A, porque está por encima
de la linea b, y es recomendable que los cerdos tengan un mayor
porcentaje de grasa dorsal ya que es un indicador importante para una
buena productividad.
Punto 4
Con la misma base de datos ALIMENTRO del punto 2 y usando la misma
información (ingrediente de interés, departamentos y variable
respuesta), responda lo siguiente:
¿Cuál de los dos
departamentos presenta mayor variabilidad para la variable de
interés?
Densidades
datosp2 %>%
ggplot(aes(x = edad_corte_d, color = departamento)) +
geom_density() +
scale_x_log10()

Respuesta
Presenta mayor variabilidad el departamento del Cesar con respecto a
la edad de corte del pasto Buffel - Cenchrus ciliaris, puesto que al
analizar el grafico de densidad podemos observar que presenta mas
oscilaciones, esto debido a que el departamento del Cesar presenta mas
datos para este pasto
¿Es diferente
estadísticamente la variabilidad de ambos departamentos?
Si la prueba estadística se lo permite, construya un intervalo de
confianza del 95% para complementar sus respuestas.
Normalidad
ggqqplot(data = datosp2$edad_corte_d)

- De este gráfico podemos inferir que la distribucción no es normal,
puestos que los datos de la variedad estan alejados de la diagonal y se
salen de la banda de confianza
Prueba de
Levene
leveneTest(datosp2$edad_corte_d ~ datosp2$departamento)
Respuesta
Como el valor P (< 2.2e-16) es inferior a nuestro nivel de
significancia (0.05) podemos concluir que si existe una diferencia
significativa entre las varianzas de los dos departamentos
comparados.
Punto 5
Se realizaron 30 experimentos independientes en donde se evaluó la
afección de una plaga en hojas de cítricos, en cada uno de ellos se
calculó el promedio del área afectada (en porcentaje) de las hojas bajo
análisis. Utilizando técnicas de Bootstrapping construya un intervalo de
confianza (com ambos métodos: error estándar y percentil) del 95% para
el promedio del área afectada.
area <- c(29.2, 17.0, 28.9, 17.3, 13.8, 5.8, 27.5, 18.2, 27.6, 30.9,
32.8, 22.6, 15.3, 23.3, 12.4, 30.0, 19.5, 17.0, 18.7, 20.4,
18.6, 44.1, 17.9, 17.9, 30.0, 25.1, 24.3, 22.1, 21.8, 21.9)
Promedio muestra
promedio_area <- mean(area)
promedio_area
## [1] 22.39667
Remuestreo
datosp5 <- data.frame(area)
set.seed(2022)
remuestreo_p5 <- datosp5 %>%
specify(response = area) %>%
generate(reps = 1000, type = "bootstrap") %>%
calculate(stat = "mean")
remuestreo_p5
Gráfico de
remuestreo
remuestreo_p5 %>%
visualize()

Intervalo de
confianza con percentiles (95%):
ic_p5_percentil <-
remuestreo_p5 %>%
get_confidence_interval(level = 0.95, type = "percentile")
ic_p5_percentil
Graficamos los
intervalos de confianza con el método de percentiles
remuestreo_p5 %>%
visualize() +
shade_confidence_interval(endpoints = ic_p5_percentil)

Calculamos el
intervalo de confianza por el método de error estándar:
proporcion_muestral <-
prop.table(table(area))
ic_errorestandar <- remuestreo_p5 %>%
get_confidence_interval(level = 0.95,
type = "se",
point_estimate = promedio_area)
ic_errorestandar
Graficamos los
intervalos de confianza con el método de error estándar
remuestreo_p5 %>%
visualize() +
shade_confidence_interval(endpoints = ic_errorestandar)

Gráfico de los dos
intervalos de confianza
remuestreo_p5 %>%
visualize() +
shade_confidence_interval(endpoints = ic_p5_percentil,
color = "forestgreen",
fill = "white") +
shade_confidence_interval(endpoints = ic_errorestandar,
color = "dodgerblue",
fill = "white") +
geom_vline(xintercept = promedio_area, color = "red", lty = 2, size = 1.5) +
geom_vline(xintercept = promedio_remuestreo, color = "black", lty = 2, size = 1.5)

Conclusión
- Podemos concluir que el promedio del remuestreo es casi igual al de
la muestra inicial, lo que quiere decir que si hacemos nuevos
remuestreos obtendremos los mismos intervalos de confianza.
- También podemos concluir que con ambos métodos el intervalo de
confianza va a incluir el valor real del promedio del área afectada
LS0tDQp0aXRsZTogIkFjdGl2aWRhZCAjMiINCmF1dGhvcjogIkF5bGluIENyaXN0aW5hIEVjaGF2YXJyaWEgeSBTYXJhIE1lbGlzYSBQYWxhY2lvIFJlZ2lubyINCmRhdGU6ICIyMDIzLTA1LTExIg0Kb3V0cHV0OiANCiAgaHRtbF9kb2N1bWVudDoNCiAgICB0b2M6IHRydWUNCiAgICB0b2NfZGVwdGg6IDUNCiAgICB0b2NfZmxvYXQ6IHRydWUNCiAgICBudW1iZXJfc2VjdGlvbnM6IHRydWUNCiAgICB0aGVtZTogY29zbW8NCiAgICBoaWdobGlnaHQ6IGJyZWV6ZWRhcmsNCiAgICBkZl9wcmludDogcGFnZWQNCiAgICBjb2RlX2ZvbGRpbmc6IGhpZGUNCiAgICBjb2RlX2Rvd25sb2FkOiB0cnVlDQotLS0NCg0KYGBge3Igc2V0dXAsIGluY2x1ZGU9RkFMU0V9DQprbml0cjo6b3B0c19jaHVuayRzZXQoZWNobyA9IFRSVUUsd2FybmluZyA9IEZBTFNFLG1lc3NhZ2UgPSBGQUxTRSkNCmBgYA0KDQojIEJpYmxpb3RlY2FzIA0KDQpgYGB7cn0NCmxpYnJhcnkodGlkeXZlcnNlKQ0KbGlicmFyeShqYW5pdG9yKQ0KbGlicmFyeShpbmZlcikNCmxpYnJhcnkoZ2dwbG90MikNCmxpYnJhcnkoZ2dwdWJyKQ0KbGlicmFyeShjYXIpDQpgYGANCg0KIyBQdW50byAxDQoNCkVuIHVuYSBlbmN1ZXN0YSByZWFsaXphZGEgZW4gQ29sb21iaWEgYSAxMjggc2lzdGVtYXMgZGUgcHJvZHVjY2nDs24gZGUgYWd1YWNhdGUsIHNlIGVuY29udHLDsyBxdWUgNDcgZGUgZWxsb3MgdXNhbiBmZXJ0aWxpemFjacOzbiBvcmfDoW5pY2EgeSBlbCByZXN0YW50ZSB1dGlsaXphbiBmZXJ0aWxpemFjacOzbiBxdcOtbWljYS4gQ29uc3RydXlhIHVuIGludGVydmFsbyBkZSBjb25maWFuemEgZGVsIDk5JSBwYXJhIGxhIHByb3BvcmNpw7NuIGRlbCB1c28gZGUgZmVydGlsaXphbnRlIG9yZ8OhbmljbyBlbiBlc3RlIHRpcG8gZGUgc2lzdGVtYXMgZGUgcHJvZHVjY2nDs24uIEludGVycHJldGUgc3VzIHJlc3VsdGFkb3MuDQoNCi0geCA9IHByb3BvcmNpw7NuIHF1ZSB1c2EgZmVydGlsaXphbnRlIG9yZ8OhbmljbyAgDQotIG4gPSBuw7ptZXJvIHRvdGFsIGRlIGVuY3Vlc3RhZG9zDQotIG5jID0gbml2ZWwgZGUgY29uZmlhbnphDQotIHhnb3JybyA9IHBvcmNlbnRhamUgZGUgcHJvcG9yY2lvbg0KLSBzZSA9IGVycm9yIGVzdGFuZGFyDQotIGYgPSB2YWxvciBlc3RhYmxlY2lkbyBwYXJhIHVuIG5jIGRlIDk5JQ0KLSBJY3Byb3AgPSB2ZWN0b3IgcXVlIGNvbnRpZW5lIGxvcyBpbnRlcnZhbG9zIGRlIGNvbmZpYW56YQ0KDQoNCmBgYHtyfQ0KSWNwcm9wID0gZnVuY3Rpb24oeCxuLG5jID0gMC45OSkNCiAgeyB4Z29ycm8gPSB4L24gDQpzZSA9IHNxcnQoKHhnb3JybyAqICgxIC0geGdvcnJvKSkvbikNCmYgPSBxbm9ybSgoMSArIG5jKS8yKQ0KSWNwcm9wID0gYyh4Z29ycm8gLSAoZiAqIHNlKSwgeGdvcnJvLCB4Z29ycm8gKyAoZipzZSkpDQpyZXR1cm4oSWNwcm9wKQ0KfQ0KDQpgYGANCmBgYHtyfQ0KeCA9IDQ3DQpuID0gMTI4DQpuYyA9IDAuOTkNCkljcHJvcCh4LG4sbmMpDQpgYGANCg0KIyMgSW50ZXJwcmV0YWNpw7NuDQoNClNlZ8O6biBsYSBlbmN1ZXN0YSBsYSBwcm9wb3JjacOzbiBxdWUgdXNhYmEgZmVydGlsaXphbnRlIG9yZ8OhbmljbyBlcmEgZGUgdW4gMzYuNyUgb3NlYSA0NyBzaXN0ZW1hcywgcGVybyBlbiByZWFsaWRhZCBsYSBwcm9wb3JjacOzbiByZWFsIHNlIGVuY3VlbnRyYSBkZW50cm8gZGUgdW4gaW50ZXJ2YWxvIGRlIDI1LjclIGEgNDcuNyUgZGVsIHRvdGFsIGRlIHNpc3RlbWFzLg0KDQoNCiMgUHVudG8gMg0KDQotIEluZ3JlZGllbnRlIGRlIGludGVyw6lzID0gQnVmZmVsIC0gQ2VuY2hydXMgY2lsaWFyaXMgLSBIb2phLCBUYWxsbw0KLSBEZXBhcnRhbWVudG9zID0gQW50aW9xdWlhIHkgQ2VzYXINCi0gVmFyaWFibGUgcmVzcHVlc3RhIGRlIGludGVyw6lzID0gZWRhZCBkZSBjb3J0ZQ0KDQpgYGB7cn0NCmFsaW1lbnRybyA8LSByZWFkX2NzdigiQWxpbWVudHJvLURlcHVyYWRhLmNzdiIpDQphbGltZW50cm8gJT4lIGhlYWQNCg0KYGBgDQoNCiMjIERhdG9zIHB1bnRvIDINCg0KYGBge3J9DQpkYXRvc3AyIDwtIGFsaW1lbnRybyAlPiUgDQogIGZpbHRlcihpbmdyZWRpZW50ZSA9PSAiQnVmZmVsIC0gQ2VuY2hydXMgY2lsaWFyaXMgLSBIb2phLCBUYWxsbyIpICU+JSANCiAgZmlsdGVyKGRlcGFydGFtZW50byAlaW4lIGMoIkFudGlvcXVpYSIsIkNlc2FyIikpDQpgYGANCg0KDQojIyBFeHBsb3JhdG9yaW8NCg0KDQojIyMgUHJvbWVkaW8NCg0KYGBge3J9DQpkYXRvc3AyICU+JSANCmdyb3VwX2J5KGluZ3JlZGllbnRlLCBkZXBhcnRhbWVudG8pICU+JQ0KICBzdW1tYXJpc2UocHJvbWVkaW8gPSBtZWFuKGVkYWRfY29ydGVfZCkpDQoNCmBgYA0KDQoNCiMjIEp1ZWdvIGRlIGhpcMOzdGVzaXMgDQoNCiQkSF8wOiBlZGFkIFwgY29ydGUgXCBBbnRpb3F1aWEgPSBlZGFkIFwgY29ydGUgXCBDZXNhciBcXA0KSF8xIDogZWRhZCBcIGNvcnRlIFwgQW50aW9xdWlhIFxuZXEgZWRhZFwgY29ydGVcIENlc2FyJCQNCg0KIyMjIE5pdmVsIGRlIHNpZ25pZmljYW5jaWEgDQoNCkVuIGVzdGUgY2FzbyB1c2FyZW1vcyB1biBuaXZlbCBkZSBzaWduaWZpY2FuY2lhIGRlbCA1JSAoMC4wNSkNCg0KIyMgUHJ1ZWJhIGRlIHNoYXBpcm8gd2lsaw0KDQpgYGB7cn0NCnNoYXBpcm8udGVzdCh4ID0gZGF0b3NwMiRlZGFkX2NvcnRlX2QpIA0KYGBgDQoNCiMjIFNvbHVjacOzbiAgDQoNCi0gVmFtb3MgYSB1c2FyIGxhIGZ1bmNpw7NuIHZhci50ZXN0KCkgY29uIGxvcyBzaWd1aWVudGVzIGFyZ3VtZW50b3M6DQogIC0gZm9ybXVsYTogeSB+IHguIEVuIGVzdGUgY2FzbyDigJx54oCdIGVzIGxhIHZhcmlhYmxlIGVkYWQgZGUgY29ydGUgeSBlbCDigJx44oCdIGVzIGVsIGRlcGFydGFtZW50by4NCiAgLSByYXRpbzogZXMgZWwgcmVzdWx0YWRvIGRlbCBjb2NpZW50ZSBkZSBsYXMgZG9zIHZhcmlhbnphcy4gRW4gZXN0ZSBjYXNvIGFzdW1pbW9zIGVuIGxhIGhpcMOzdGVzaXMgbnVsYSBlbCB2YWxvciBkZSDigJwx4oCdLg0KICAtIGFsdGVybmF0aXZlOiB0aXBvIGRlIHBydWViYS4gRW4gZXN0ZSBlcyBiaWxhdGVyYWwgKOKAnHR3by5zaWRlZOKAnSkNCiAgLSBjb25mLmxldmVsOiBuaXZlbCBkZSBjb25maWFuemEuIEVuIGVzdGUgY2FzbyBlcyAwLjk1ICgxIC0gMC41KQ0KDQpgYGB7cn0NCiAgdmFyLnRlc3QoZGF0b3NwMiRlZGFkX2NvcnRlX2QgfiBkYXRvc3AyJGRlcGFydGFtZW50bywNCiAgICAgICAgIHJhdGlvID0gMSwNCiAgICAgICAgIGFsdGVybmF0aXZlID0gInR3by5zaWRlZCIsDQogICAgICAgICBjb25mLmxldmVsID0gMC45NSkNCmBgYA0KIyMgQ29uY2x1c2nDs24NCg0KDQotIENvbW8gZWwgdmFsb3IgcCAoMi4yZS0xNikgZXMgbWVub3IgcXVlIGVsIG5pdmVsIGRlIHNpZ25pZmljYW5jaWEgKDAuMDUpLCBzaSBleGlzdGUgZXZpZGVuY2lhIHBhcmEgcmVjaGF6YXIgbGEgaGlww7N0ZXNpcywgZXMgZGVjaXIsIHF1ZSBlbCBwcm9tZWRpbyBkZSBsYSBlZGFkIGRlIGNvcnRlIGRlbCBkZXBhcnRhbWVudG8gZGUgQW50aW9xdWlhIGVzIGRpZmVyZW50ZSBhbCBwcm9tZWRpbyBkZSBsYSBlZGFkIGRlIGNvcnRlIGRlbCBkZXBhcnRhbWVudG8gZGVsIENlc2FyLg0KLSBDb21vIGVsIGludGVydmFsbyBkZSBjb25maWFuemEgKExJOiA3LjczMzI1MSwgTFM6IDEyLjAxOTQ3Nikgbm8gY29udGllbmUgZWwgdmFsb3IgZGUgcmVmZXJlbmNpYSAo4oCcMeKAnSksIHNpIGV4aXN0ZSBldmlkZW5jaWEgcGFyYSByZWNoYXphciBsYSBoaXDDs3Rlc2lzLg0KDQojIFB1bnRvIDMNCg0KVXN0ZWQgZnVlIGFzaWduYWRvIChhKSBwYXJhIHByb2JhciBhIHRyYXbDqXMgZGUgbcOpdG9kb3MgZXN0YWTDrXN0aWNvcyBzaSBlbiBwcm9tZWRpbyBsYSBncmFzYSBkb3JzYWwgKG1tKSBkZSBkb3MgbMOtbmVhcyBnZW7DqXRpY2FzIGRlIHBvcmNpbm9zIHByZXNlbnRhbiBkaWZlcmVuY2lhcyBlc3RhZMOtc3RpY2FzIHkgwr9jdcOhbCBzZXLDrWEgZWwgcmFuZ28gZGUgdmFsb3JlcyBlc3BlcmFkb3MgcGFyYSBsYSBkaWZlcmVuY2lhIGRlIGVzYXMgZG9zIGzDrW5lYXMgZ2Vuw6l0aWNhcz8gwr9DdcOhbCBsw61uZWEgZ2Vuw6l0aWNhIHJlY29tZW5kYXLDrWE/DQoNCmBgYHtyfQ0KbGluZWFfYSA8LSBjKDEzLjk0LCAxNS4zMCwgMTYuOTIsIDE0Ljg5LCAxNy4zNCwgMTcuNDMsIDE2LjgzLCAxNS42MSwNCiAgICAgICAgICAgICAxNi45NSwgMTcuNjksIDE1LjE2LCAxNi41MywgMTcuMjIsIDE1LjE3LCAxNi42MykNCg0KbGluZWFfYiA8LWMoMTUuNjIsIDEzLjg0LCAxNC4yNSwgMTIuNzksIDE3LjAxLCAxNi45MiwgMTEuMTMsIDEzLjcyLA0KICAgICAgICAgICAgMTQuMjYsIDE0LjU1LCAxNC4xMSwgMTguMDQsIDEyLjE3LCAxMy41OSwgMTMuODEpDQoNCiAgDQpgYGANCiMjIEp1ZWdvIGRlIGhpcMOzdGVzaXMgDQoNCiQkSF8wOiBwcm9tZWRpbyBcIGdyYXNhIFwgZG9yc2FsIFwgbGluZWEgXCAgYSA9IHByb21lZGlvIFwgZ3Jhc2EgXCBkb3JzYWwgXCBsaW5lYSBcICBiIFxcDQpIXzEgOiBwcm9tZWRpbyBcIGdyYXNhIFwgZG9yc2FsIFwgbGluZWEgXCAgYSBcbmVxIHByb21lZGlvIFwgZ3Jhc2EgXCBkb3JzYWwgXCBsaW5lYSBcICBiICQkDQoNCiMjIyBOaXZlbCBkZSBzaWduaWZpY2FuY2lhIA0KDQpFbiBlc3RlIGNhc28gdXNhcmVtb3MgdW4gbml2ZWwgZGUgc2lnbmlmaWNhbmNpYSBkZWwgNSUgKDAuMDUpDQoNCg0KIyMgRGlmZXJlbmNpYSBkZSBtZWRpYXMNCg0KDQpgYGB7cn0NCmRpZmVyZW5jaWEgPC0gbGluZWFfYSAtIGxpbmVhX2INCmRpZmVyZW5jaWENCmBgYA0KIyMgTm9ybWFsaWRhZA0KDQpHcsOhZmljbw0KDQpgYGB7cn0NCmdncXFwbG90KGRhdGEgPSBkaWZlcmVuY2lhKQ0KYGBgDQoNCi0gUG9kZW1vcyBjb25jbHVpciBxdWUgc2kgc2UgY3VtcGxlIGxhIG5vcm1hbGlkYWQsIHlhIHF1ZSBsb3MgZGF0b3Mgc2UgZW5jdWVudHJhbiBkZW50cm8gZGUgbGEgYmFuZGEgZGUgY29uZmlhbnphDQoNCiMjIElndWFsZGFkIGRlIHZhcmlhbnphDQoNCmBgYHtyfQ0KdmFyLnRlc3QoeCA9IGxpbmVhX2EsIHkgPSBsaW5lYV9iLA0KICAgICAgICAgcmF0aW8gPSAxLCBhbHRlcm5hdGl2ZSA9ICJ0d28uc2lkZWQiKQ0KYGBgDQoNCiMjIFBydWViYSB0LXN0dWRlbnQNCg0KYGBge3J9DQp0LnRlc3QoeCA9IGxpbmVhX2EsIHkgPSBsaW5lYV9iLA0KICAgICAgIGFsdGVybmF0aXZlID0gInR3by5zaWRlZCIsDQogICAgICAgY29uZi5sZXZlbCA9IDAuOTUsDQogICAgICAgcGFpcmVkID0gVFJVRSwNCiAgICAgICB2YXIuZXF1YWwgPSBUUlVFKQ0KYGBgDQojIyBDb25jbHVzaW9uDQoNCi0gQ29tbyBlbCB2YWxvciBwICgwLjAwMDMzMTkpIGVzIG1lbm9yIHF1ZSBlbCBuaXZlbCBkZSBzaWduaWZpY2FuY2lhLCBleGlzdGUgZXZpZGVuY2lhIHBhcmEgcmVjaGF6YXIgbGEgaGlww7N0ZXNpcyBudWxhLCBlcyBkZWNpciwgcXVlIGVsIHByb21lZGlvIGRlIGxhICJsaW5lYSBhIiBlcyBkaWZlcmVudGUgYWwgcHJvbWVkaW8gcGFyYSBkZSBsYSAibGluZWEgYiIuDQotIENvbW8gZWwgaW50ZXJ2YWxvIGRlIGNvbmZpYW56YSBubyBjb250aWVuZSBhbCBjZXJvIChbMC43Mjc4MDk5LCAyLjk3ODg1NjhdKSwgZXhpc3RlIGV2aWRlbmNpYSBwYXJhIHJlY2hhemFyIGxhIGhpcMOzdGVzaXMgbnVsYS4gQWRlbcOhcywgZWwgcHJvbWVkaW8gZGUgbGEgImxpbmVhIGEiIHBvZHLDrWEgZXN0YXIgZGVzZGUgMC43MiBoYXN0YSAyLjk3IHB1bnRvcyBwb3IgZW5jaW1hIGRlbGEgImxpbmVhIGIiDQoNCg0KIyMgwr9DdcOhbCBzZXLDrWEgZWwgcmFuZ28gZGUgdmFsb3JlcyBlc3BlcmFkb3MgcGFyYSBsYSBkaWZlcmVuY2lhIGRlIGVzYXMgZG9zIGzDrW5lYXMgZ2Vuw6l0aWNhcz8gDQoNCi0gRWwgcmFuZ28gZGUgZGlmZXJlbmNpYSBxdWUgcG9kZW1vcyBlc3BlcmFyIGVzdGEgZW50cmUgKDAuNzI3ODA5OSAtIDIuOTc4ODU2OCkNCg0KIyMgwr9DdcOhbCBsw61uZWEgZ2Vuw6l0aWNhIHJlY29tZW5kYXLDrWE/DQoNCi0gTm9zb3RyYXMgcmVjb21lbmRhcsOtYW1vcyBsYSBsw61uZWEgZ2Vuw6l0aWNhIEEsIHBvcnF1ZSBlc3TDoSBwb3IgZW5jaW1hIGRlIGxhIGxpbmVhIGIsIHkgZXMgcmVjb21lbmRhYmxlIHF1ZSBsb3MgY2VyZG9zIHRlbmdhbiB1biBtYXlvciBwb3JjZW50YWplIGRlIGdyYXNhIGRvcnNhbCB5YSBxdWUgZXMgdW4gaW5kaWNhZG9yIGltcG9ydGFudGUgcGFyYSB1bmEgYnVlbmEgcHJvZHVjdGl2aWRhZC4NCg0KDQojIFB1bnRvIDQNCg0KDQpDb24gbGEgbWlzbWEgYmFzZSBkZSBkYXRvcyBBTElNRU5UUk8gZGVsIHB1bnRvIDIgeSB1c2FuZG8gbGEgbWlzbWEgaW5mb3JtYWNpw7NuIChpbmdyZWRpZW50ZSBkZSBpbnRlcsOpcywgZGVwYXJ0YW1lbnRvcyB5IHZhcmlhYmxlIHJlc3B1ZXN0YSksIHJlc3BvbmRhIGxvIHNpZ3VpZW50ZToNCg0KIyMgwr9DdcOhbCBkZSBsb3MgZG9zIGRlcGFydGFtZW50b3MgcHJlc2VudGEgbWF5b3IgdmFyaWFiaWxpZGFkIHBhcmEgbGEgdmFyaWFibGUgZGUgaW50ZXLDqXM/DQoNCg0KIyMjIERlbnNpZGFkZXMNCg0KDQpgYGB7cn0NCmRhdG9zcDIgJT4lIA0KICBnZ3Bsb3QoYWVzKHggPSBlZGFkX2NvcnRlX2QsIGNvbG9yID0gZGVwYXJ0YW1lbnRvKSkgKw0KICBnZW9tX2RlbnNpdHkoKSArDQogIHNjYWxlX3hfbG9nMTAoKQ0KYGBgDQoNCg0KIyMjIFJlc3B1ZXN0YQ0KDQpQcmVzZW50YSBtYXlvciB2YXJpYWJpbGlkYWQgZWwgZGVwYXJ0YW1lbnRvIGRlbCBDZXNhciBjb24gcmVzcGVjdG8gYSBsYSBlZGFkIGRlIGNvcnRlIGRlbCBwYXN0byBCdWZmZWwgLSBDZW5jaHJ1cyBjaWxpYXJpcywgcHVlc3RvIHF1ZSBhbCBhbmFsaXphciBlbCBncmFmaWNvIGRlIGRlbnNpZGFkIHBvZGVtb3Mgb2JzZXJ2YXIgcXVlIHByZXNlbnRhIG1hcyBvc2NpbGFjaW9uZXMsIGVzdG8gZGViaWRvIGEgcXVlIGVsIGRlcGFydGFtZW50byBkZWwgQ2VzYXIgcHJlc2VudGEgbWFzIGRhdG9zIHBhcmEgZXN0ZSBwYXN0bw0KDQojIyDCv0VzIGRpZmVyZW50ZSBlc3RhZMOtc3RpY2FtZW50ZSBsYSB2YXJpYWJpbGlkYWQgZGUgYW1ib3MgZGVwYXJ0YW1lbnRvcz8NClNpIGxhIHBydWViYSBlc3RhZMOtc3RpY2Egc2UgbG8gcGVybWl0ZSwgY29uc3RydXlhIHVuIGludGVydmFsbyBkZSBjb25maWFuemEgZGVsIDk1JSBwYXJhIGNvbXBsZW1lbnRhciBzdXMgcmVzcHVlc3Rhcy4NCg0KDQojIyMgTm9ybWFsaWRhZA0KDQpgYGB7cn0NCmdncXFwbG90KGRhdGEgPSBkYXRvc3AyJGVkYWRfY29ydGVfZCkNCmBgYA0KDQotIERlIGVzdGUgZ3LDoWZpY28gcG9kZW1vcyBpbmZlcmlyIHF1ZSBsYSBkaXN0cmlidWNjacOzbiBubyBlcyBub3JtYWwsIHB1ZXN0b3MgcXVlIGxvcyBkYXRvcyAgZGUgbGEgdmFyaWVkYWQgZXN0YW4gYWxlamFkb3MgZGUgbGEgZGlhZ29uYWwgeSBzZSBzYWxlbiBkZSBsYSBiYW5kYSBkZSBjb25maWFuemENCg0KDQojIyMgIFBydWViYSBkZSBMZXZlbmUNCg0KYGBge3J9DQpsZXZlbmVUZXN0KGRhdG9zcDIkZWRhZF9jb3J0ZV9kIH4gZGF0b3NwMiRkZXBhcnRhbWVudG8pDQpgYGANCiMjIyBSZXNwdWVzdGEgDQoNCkNvbW8gZWwgdmFsb3IgUCAoPCAyLjJlLTE2KSBlcyBpbmZlcmlvciBhIG51ZXN0cm8gbml2ZWwgZGUgc2lnbmlmaWNhbmNpYSAoMC4wNSkgcG9kZW1vcyBjb25jbHVpciBxdWUgc2kgZXhpc3RlIHVuYSBkaWZlcmVuY2lhIHNpZ25pZmljYXRpdmEgZW50cmUgbGFzIHZhcmlhbnphcyBkZSBsb3MgZG9zIGRlcGFydGFtZW50b3MgY29tcGFyYWRvcy4NCg0KIyBQdW50byA1DQoNClNlIHJlYWxpemFyb24gMzAgZXhwZXJpbWVudG9zIGluZGVwZW5kaWVudGVzIGVuIGRvbmRlIHNlIGV2YWx1w7MgbGEgYWZlY2Npw7NuIGRlIHVuYSBwbGFnYSBlbiBob2phcyBkZSBjw610cmljb3MsIGVuIGNhZGEgdW5vIGRlIGVsbG9zIHNlIGNhbGN1bMOzIGVsIHByb21lZGlvIGRlbCDDoXJlYSBhZmVjdGFkYSAoZW4gcG9yY2VudGFqZSkgZGUgbGFzIGhvamFzIGJham8gYW7DoWxpc2lzLiBVdGlsaXphbmRvIHTDqWNuaWNhcyBkZSBCb290c3RyYXBwaW5nIGNvbnN0cnV5YSB1biBpbnRlcnZhbG8gZGUgY29uZmlhbnphIChjb20gYW1ib3MgbcOpdG9kb3M6IGVycm9yIGVzdMOhbmRhciB5IHBlcmNlbnRpbCkgZGVsIDk1JSBwYXJhIGVsIHByb21lZGlvIGRlbCDDoXJlYSBhZmVjdGFkYS4NCg0KDQpgYGB7cn0NCmFyZWEgPC0gYygyOS4yLCAxNy4wLCAyOC45LCAxNy4zLCAxMy44LCA1LjgsIDI3LjUsIDE4LjIsIDI3LjYsIDMwLjksDQogICAgICAgICAgMzIuOCwgMjIuNiwgMTUuMywgMjMuMywgMTIuNCwgMzAuMCwgMTkuNSwgMTcuMCwgMTguNywgMjAuNCwNCiAgICAgICAgICAxOC42LCA0NC4xLCAxNy45LCAxNy45LCAzMC4wLCAyNS4xLCAyNC4zLCAyMi4xLCAyMS44LCAyMS45KQ0KDQpgYGANCiMjIFByb21lZGlvIG11ZXN0cmENCg0KYGBge3J9DQpwcm9tZWRpb19hcmVhIDwtIG1lYW4oYXJlYSkNCnByb21lZGlvX2FyZWENCmBgYA0KDQojIyBSZW11ZXN0cmVvDQoNCmBgYHtyfQ0KZGF0b3NwNSA8LSBkYXRhLmZyYW1lKGFyZWEpIA0Kc2V0LnNlZWQoMjAyMikNCnJlbXVlc3RyZW9fcDUgPC0gZGF0b3NwNSAlPiUgDQogIHNwZWNpZnkocmVzcG9uc2UgPSBhcmVhKSAlPiUgDQogIGdlbmVyYXRlKHJlcHMgPSAxMDAwLCB0eXBlID0gImJvb3RzdHJhcCIpICU+JSANCiAgY2FsY3VsYXRlKHN0YXQgPSAibWVhbiIpDQoNCnJlbXVlc3RyZW9fcDUNCmBgYA0KDQojIyMgbWVkaWEgZGVsIHJlbXVlc3RyZW8NCg0KYGBge3J9DQpwcm9tZWRpb19yZW11ZXN0cmVvIDwtIHJlbXVlc3RyZW9fcDUkc3RhdCAlPiUgbWVhbigpDQpwcm9tZWRpb19yZW11ZXN0cmVvDQpgYGANCg0KDQojIyMgR3LDoWZpY28gZGUgcmVtdWVzdHJlbw0KDQpgYGB7cn0NCnJlbXVlc3RyZW9fcDUgJT4lIA0KICB2aXN1YWxpemUoKQ0KYGBgDQoNCiMjIEludGVydmFsbyBkZSBjb25maWFuemEgY29uIHBlcmNlbnRpbGVzICg5NSUpOg0KDQpgYGB7cn0NCmljX3A1X3BlcmNlbnRpbCA8LQ0KICByZW11ZXN0cmVvX3A1ICU+JQ0KICBnZXRfY29uZmlkZW5jZV9pbnRlcnZhbChsZXZlbCA9IDAuOTUsIHR5cGUgPSAicGVyY2VudGlsZSIpDQppY19wNV9wZXJjZW50aWwNCmBgYA0KIyMjIEdyYWZpY2Ftb3MgbG9zIGludGVydmFsb3MgZGUgY29uZmlhbnphIGNvbiBlbCBtw6l0b2RvIGRlIHBlcmNlbnRpbGVzDQoNCmBgYHtyfQ0KcmVtdWVzdHJlb19wNSAlPiUgDQogIHZpc3VhbGl6ZSgpICsNCiAgc2hhZGVfY29uZmlkZW5jZV9pbnRlcnZhbChlbmRwb2ludHMgPSBpY19wNV9wZXJjZW50aWwpDQoNCmBgYA0KDQojIyBDYWxjdWxhbW9zIGVsIGludGVydmFsbyBkZSBjb25maWFuemEgcG9yIGVsIG3DqXRvZG8gZGUgZXJyb3IgZXN0w6FuZGFyOg0KDQpgYGB7cn0NCnByb3BvcmNpb25fbXVlc3RyYWwgPC0NCiAgcHJvcC50YWJsZSh0YWJsZShhcmVhKSkNCg0KaWNfZXJyb3Jlc3RhbmRhciA8LSByZW11ZXN0cmVvX3A1ICU+JQ0KICBnZXRfY29uZmlkZW5jZV9pbnRlcnZhbChsZXZlbCA9IDAuOTUsDQogICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUgPSAic2UiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICBwb2ludF9lc3RpbWF0ZSA9IHByb21lZGlvX2FyZWEpDQoNCmljX2Vycm9yZXN0YW5kYXINCg0KDQpgYGANCiMjIyBHcmFmaWNhbW9zIGxvcyBpbnRlcnZhbG9zIGRlIGNvbmZpYW56YSBjb24gZWwgbcOpdG9kbyBkZSBlcnJvciBlc3TDoW5kYXINCg0KDQpgYGB7cn0NCnJlbXVlc3RyZW9fcDUgJT4lIA0KICB2aXN1YWxpemUoKSArDQogIHNoYWRlX2NvbmZpZGVuY2VfaW50ZXJ2YWwoZW5kcG9pbnRzID0gaWNfZXJyb3Jlc3RhbmRhcikNCmBgYA0KDQoNCiMjIEdyw6FmaWNvIGRlIGxvcyBkb3MgaW50ZXJ2YWxvcyBkZSBjb25maWFuemENCg0KYGBge3J9DQpyZW11ZXN0cmVvX3A1ICU+JQ0KICB2aXN1YWxpemUoKSArDQogIHNoYWRlX2NvbmZpZGVuY2VfaW50ZXJ2YWwoZW5kcG9pbnRzID0gaWNfcDVfcGVyY2VudGlsLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yID0gImZvcmVzdGdyZWVuIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxsID0gIndoaXRlIikgKw0KICBzaGFkZV9jb25maWRlbmNlX2ludGVydmFsKGVuZHBvaW50cyA9IGljX2Vycm9yZXN0YW5kYXIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3IgPSAiZG9kZ2VyYmx1ZSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsbCA9ICJ3aGl0ZSIpICsNCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gcHJvbWVkaW9fYXJlYSwgY29sb3IgPSAicmVkIiwgbHR5ID0gMiwgc2l6ZSA9IDEuNSkgKw0KICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSBwcm9tZWRpb19yZW11ZXN0cmVvLCBjb2xvciA9ICJibGFjayIsIGx0eSA9IDIsIHNpemUgPSAxLjUpIA0KYGBgDQoNCiMjIENvbmNsdXNpw7NuDQoNCi0gIFBvZGVtb3MgY29uY2x1aXIgcXVlIGVsIHByb21lZGlvIGRlbCByZW11ZXN0cmVvIGVzIGNhc2kgaWd1YWwgYWwgZGUgbGEgbXVlc3RyYSBpbmljaWFsLCBsbyBxdWUgcXVpZXJlIGRlY2lyIHF1ZSBzaSBoYWNlbW9zIG51ZXZvcyByZW11ZXN0cmVvcyBvYnRlbmRyZW1vcyBsb3MgbWlzbW9zIGludGVydmFsb3MgZGUgY29uZmlhbnphLg0KLSBUYW1iacOpbiBwb2RlbW9zIGNvbmNsdWlyIHF1ZSBjb24gYW1ib3MgbcOpdG9kb3MgZWwgaW50ZXJ2YWxvIGRlIGNvbmZpYW56YSB2YSBhIGluY2x1aXIgZWwgdmFsb3IgcmVhbCBkZWwgcHJvbWVkaW8gZGVsIMOhcmVhIGFmZWN0YWRhDQoNCg0KDQoNCg0KDQo=