Con el objetivo de poder determinar si existe o no una significancia
estadística para la diferencia entre la Recuperación Global de
la Zafra 2023-2024 y la de la Zafra 2024-2025 se realizan pruebas de
hipótesis para medias / medianas.
library(dplyr)
library(ggplot2)
library(ggpubr)
dataset <- read.csv(file = 'C:/Users/sbarrios/OneDrive - Universidad Galileo/Data Science/R/Proyectos/Pantaleon/Optimizador PrO GT/Data/Recuperacion Global PSA.csv')
dataset$Zafra <- as.character(dataset$Zafra)
dataset
Funciones de Densidad: Recuperación Global PSA
df1 <- data.frame(RG = dataset[dataset$Zafra == "2024",]$Recuperacion_Global_5861,zafra=dataset[dataset$Zafra == "2024",]$Zafra)
df2 <- data.frame(RG = dataset[dataset$Zafra == "2025",]$Recuperacion_Global_5861,zafra=dataset[dataset$Zafra == "2025",]$Zafra)
df1$zafra <- as.character(df1$zafra)
df2$zafra <- as.character(df2$zafra)
df_RG <- data.frame("Zafra" = c("2024","2025"),
"Media" = c(mean(df1$RG, na.rm=TRUE),mean(df2$RG, na.rm=TRUE)),
"Mediana" = c(median(df1$RG, na.rm=TRUE),median(df2$RG, na.rm=TRUE)),
"Desv. Estándar" = c(sd(df1$RG, na.rm=TRUE),sd(df2$RG, na.rm=TRUE))
)
df_RG
ggplot() +
geom_density(data = df1, aes(x = RG,fill=zafra),alpha=0.7) +
geom_density(data = df2, aes(x = RG,fill=zafra),alpha=0.7)

ggtitle("Global Recovery Distributions")
$title
[1] "Global Recovery Distributions"
attr(,"class")
[1] "labels"
Prueba de Normalidad de Recuperación Global PSA
Se conduce una prueba Shapiro-Wilk para la Recuperación
Global PSA de la zafra 2024 y 2025 con el objetivo de verificar la
asunción de normalidad. El test Shapiro-Wilk considera
como Hipótesis Nula \(H_0\) que los
datos son normalmente distribuidos.
# Shapiro-Wilk normality test for Recuperación Global PSA 2024
with(dataset, shapiro.test(dataset[dataset$Zafra == "2024",]$Recuperacion_Global_5861))
Shapiro-Wilk normality test
data: dataset[dataset$Zafra == "2024", ]$Recuperacion_Global_5861
W = 0.90491, p-value = 1.838e-09
A un nivel de significancia del 5% rechazamos la hipótesis nula de
normalidad y concluimos que los datos no están normalmente
distribuidos.
# Shapiro-Wilk normality test for Recuperación Global PSA 2025
with(dataset, shapiro.test(dataset[dataset$Zafra == "2025",]$Recuperacion_Global_5861))
Shapiro-Wilk normality test
data: dataset[dataset$Zafra == "2025", ]$Recuperacion_Global_5861
W = 0.73898, p-value = 5.647e-12
A un nivel de significancia del 5% rechazamos la hipótesis nula de
normalidad y concluimos que los datos no están normalmente
distribuidos.
Prueba Wilcoxon
Debido a que ambas muestras no cumplen el requisito de ser
normalmente distribuidas, se elige la prueba Wilcoxon de Dos
Muestras No Pareadas como una alternativa no-paramétrica a la
prueba t-Test de Dos Muestras No Pareadas, la cual es
útil para comparar dos grupos independientes de muestras cuando
no están normalmente distribuidas.
\(H_0: RG_{2024} - RG_{2025} \geq
0\)
\(H_1: RG_{2024} - RG_{2025} <
0\)
x <- dataset[dataset$Zafra == "2024",]$Recuperacion_Global_5861
y <- dataset[dataset$Zafra == "2025",]$Recuperacion_Global_5861
res_Wilcox <- wilcox.test(x, y, alternative = "less", mu = 0.0, conf.level = 0.95)
res_Wilcox
Wilcoxon rank sum test with continuity correction
data: x and y
W = 4539, p-value = 2.365e-12
alternative hypothesis: true location shift is less than 0
res_Wilcox$p.value
[1] 2.36456e-12
A un nivel de confianza del 95%, con un p-value de
2.36456e-12 rechazamos la hipótesis nula \(H_0: RG_{2024} - RG_{2025} \geq
0\) y existe evidencia estadística suficiente para
concluir que \(H_1: RG_{2024} -
RG_{2025} < 0\), es decir, el Rendimiento para la
zafra 2025 es mayor al de la zafra 2024.
Prueba t-Test de Dos Muestras No Pareadas Varianzas Desiguales
Se muestra como ejercicio la prueba t-Test de Dos Muestras No
Pareadas, la cual es útil para comparar dos grupos
independientes de muestras cuando se asume que están normalmente
distribuidas.
\(H_0: RG_{2024} - RG_{2025} \geq
0\)
\(H_1: RG_{2024} - RG_{2025} <
0\)
res_tTest <- t.test(x, y, alternative = 'less', mu = 0.0, var.equal = FALSE)
res_tTest
Welch Two Sample t-test
data: x and y
t = -5.8281, df = 217.95, p-value = 9.998e-09
alternative hypothesis: true difference in means is less than 0
95 percent confidence interval:
-Inf -1.433232
sample estimates:
mean of x mean of y
81.00380 83.00393
res_tTest$p.value
[1] 9.997796e-09
A un nivel de confianza del 95%, con un p-value de
9.997796e-09 rechazamos la hipótesis nula \(H_0: RG_{2024} - RG_{2025} \geq
0\) y existe evidencia estadística suficiente para
concluir que \(H_1: RG_{2024} -
RG_{2025} < 0\), es decir, el Rendimiento para la
zafra 2025 es mayor al de la zafra 2024.
Prueba Wilcoxon para Diferencia Mínima Significativa entre
Recuperación Global 2024 y 2025
Se conduce el test de Wilcoxon para encontrar una diferencia mínima
significativa entre las Recuperaciones Globales 2024 y 2025
\(H_0: RG_{2025} - RG_{2024} \leq
1.42\)
\(H_1: RG_{2025} - RG_{2024} >
1.42\)
x <- dataset[dataset$Zafra == "2024",]$Recuperacion_Global_5861
y <- dataset[dataset$Zafra == "2025",]$Recuperacion_Global_5861
res_Wilcox <- wilcox.test(y, x, alternative = "great", mu = 1.42 , conf.level = 0.95)
res_Wilcox
Wilcoxon rank sum test with continuity correction
data: y and x
W = 10156, p-value = 0.04665
alternative hypothesis: true location shift is greater than 1.42
res_Wilcox$p.value
[1] 0.04664756
A un nivel de confianza del 95%, con un p-value de 0.04664756
rechazamos la hipótesis nula \(H_0: RG_{2025}
- RG_{2024} \leq 1.42\) y existe evidencia estadística
suficiente para concluir que \(H_1:
RG_{2025} - RG_{2024} > 1.42\), es decir, el
Rendimiento para la zafra 2025 es mayor al de la zafra 2024 por
al menos 1.42%.
Prueba ANOVA para Dos Muestras (Un factor)
Se realiza una prueba ANOVA con las dos muestras, equivalente a
prueba t-Student, para un solo factor (Zafra).
dataset_anova <- dataset
dataset_anova$Zafra <- factor(dataset_anova$Zafra)
one.way <- aov(Recuperacion_Global_5861 ~ Zafra, data = dataset_anova)
summary(one.way)
Df Sum Sq Mean Sq F value Pr(>F)
Zafra 1 257 257.01 32.09 3.64e-08 ***
Residuals 280 2242 8.01
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Con un p-value de 3.64e-08 se rechaza la hipótesis
nula de medias iguales y el factor Zafra tiene un
impacto significativo en la Recuperación Global, y por lo tanto se
concluye que las medias son diferentes.
ggplot(data = dataset_anova, aes(x = Zafra, y = Recuperacion_Global_5861)) + geom_boxplot() + geom_jitter(aes(color = Zafra)) + ggtitle("Box Plot Recuperacion Global (%)")

LS0tDQp0aXRsZTogIlByTyBHdWF0ZW1hbGEgUkcgSHlwb3RoZXNpcyBUZXN0aW5nIg0Kb3V0cHV0OiBodG1sX25vdGVib29rDQotLS0NCg0KQ29uIGVsIG9iamV0aXZvIGRlIHBvZGVyIGRldGVybWluYXIgc2kgZXhpc3RlIG8gbm8gdW5hIHNpZ25pZmljYW5jaWEgZXN0YWTDrXN0aWNhIHBhcmEgbGEgZGlmZXJlbmNpYSBlbnRyZSBsYSAqUmVjdXBlcmFjacOzbiBHbG9iYWwqIGRlIGxhIFphZnJhIDIwMjMtMjAyNCB5IGxhIGRlIGxhIFphZnJhIDIwMjQtMjAyNSBzZSByZWFsaXphbiBwcnVlYmFzIGRlIGhpcMOzdGVzaXMgcGFyYSBtZWRpYXMgLyBtZWRpYW5hcy4gDQoNCmBgYHtyfQ0KbGlicmFyeShkcGx5cikNCmxpYnJhcnkoZ2dwbG90MikNCmxpYnJhcnkoZ2dwdWJyKQ0KYGBgDQoNCmBgYHtyfQ0KZGF0YXNldCA8LSByZWFkLmNzdihmaWxlID0gJ0M6L1VzZXJzL3NiYXJyaW9zL09uZURyaXZlIC0gVW5pdmVyc2lkYWQgR2FsaWxlby9EYXRhIFNjaWVuY2UvUi9Qcm95ZWN0b3MvUGFudGFsZW9uL09wdGltaXphZG9yIFByTyBHVC9EYXRhL1JlY3VwZXJhY2lvbiBHbG9iYWwgUFNBLmNzdicpDQpkYXRhc2V0JFphZnJhIDwtIGFzLmNoYXJhY3RlcihkYXRhc2V0JFphZnJhKQ0KZGF0YXNldA0KYGBgDQoNCg0KIyMjIEZ1bmNpb25lcyBkZSBEZW5zaWRhZDogUmVjdXBlcmFjacOzbiBHbG9iYWwgUFNBDQoNCmBgYHtyfQ0KZGYxIDwtIGRhdGEuZnJhbWUoUkcgPSBkYXRhc2V0W2RhdGFzZXQkWmFmcmEgPT0gIjIwMjQiLF0kUmVjdXBlcmFjaW9uX0dsb2JhbF81ODYxLHphZnJhPWRhdGFzZXRbZGF0YXNldCRaYWZyYSA9PSAiMjAyNCIsXSRaYWZyYSkNCmRmMiA8LSBkYXRhLmZyYW1lKFJHID0gZGF0YXNldFtkYXRhc2V0JFphZnJhID09ICIyMDI1IixdJFJlY3VwZXJhY2lvbl9HbG9iYWxfNTg2MSx6YWZyYT1kYXRhc2V0W2RhdGFzZXQkWmFmcmEgPT0gIjIwMjUiLF0kWmFmcmEpDQoNCmRmMSR6YWZyYSA8LSBhcy5jaGFyYWN0ZXIoZGYxJHphZnJhKQ0KZGYyJHphZnJhIDwtIGFzLmNoYXJhY3RlcihkZjIkemFmcmEpDQoNCg0KZGZfUkcgPC0gZGF0YS5mcmFtZSgiWmFmcmEiID0gYygiMjAyNCIsIjIwMjUiKSwgDQogICAgICAgICAgICAgICAgICAgICAgIk1lZGlhIiA9IGMobWVhbihkZjEkUkcsIG5hLnJtPVRSVUUpLG1lYW4oZGYyJFJHLCBuYS5ybT1UUlVFKSksDQogICAgICAgICAgICAgICAgICAgICAgIk1lZGlhbmEiID0gYyhtZWRpYW4oZGYxJFJHLCBuYS5ybT1UUlVFKSxtZWRpYW4oZGYyJFJHLCBuYS5ybT1UUlVFKSksDQogICAgICAgICAgICAgICAgICAgICAgIkRlc3YuIEVzdMOhbmRhciIgPSBjKHNkKGRmMSRSRywgbmEucm09VFJVRSksc2QoZGYyJFJHLCBuYS5ybT1UUlVFKSkNCiAgICAgICAgICAgICAgICAgICAgICApDQoNCmRmX1JHDQoNCmdncGxvdCgpICsgDQogIGdlb21fZGVuc2l0eShkYXRhID0gZGYxLCBhZXMoeCA9IFJHLGZpbGw9emFmcmEpLGFscGhhPTAuNykgKyANCiAgZ2VvbV9kZW5zaXR5KGRhdGEgPSBkZjIsIGFlcyh4ID0gUkcsZmlsbD16YWZyYSksYWxwaGE9MC43KQ0KICBnZ3RpdGxlKCJHbG9iYWwgUmVjb3ZlcnkgRGlzdHJpYnV0aW9ucyIpDQpgYGANCg0KIyMjIFBydWViYSBkZSBOb3JtYWxpZGFkIGRlIFJlY3VwZXJhY2nDs24gR2xvYmFsIFBTQQ0KDQpTZSBjb25kdWNlIHVuYSBwcnVlYmEgKlNoYXBpcm8tV2lsayogcGFyYSBsYSBSZWN1cGVyYWNpw7NuIEdsb2JhbCBQU0EgZGUgbGEgemFmcmEgMjAyNCB5IDIwMjUgY29uIGVsIG9iamV0aXZvIGRlIHZlcmlmaWNhciBsYSBhc3VuY2nDs24gZGUgKm5vcm1hbGlkYWQqLg0KRWwgdGVzdCAqU2hhcGlyby1XaWxrKiBjb25zaWRlcmEgY29tbyBIaXDDs3Rlc2lzIE51bGEgJEhfMCQgcXVlIGxvcyBkYXRvcyBzb24gbm9ybWFsbWVudGUgZGlzdHJpYnVpZG9zLg0KDQpgYGB7cn0NCiMgU2hhcGlyby1XaWxrIG5vcm1hbGl0eSB0ZXN0IGZvciBSZWN1cGVyYWNpw7NuIEdsb2JhbCBQU0EgMjAyNA0Kd2l0aChkYXRhc2V0LCBzaGFwaXJvLnRlc3QoZGF0YXNldFtkYXRhc2V0JFphZnJhID09ICIyMDI0IixdJFJlY3VwZXJhY2lvbl9HbG9iYWxfNTg2MSkpDQpgYGANCkEgdW4gbml2ZWwgZGUgc2lnbmlmaWNhbmNpYSBkZWwgNSUgcmVjaGF6YW1vcyBsYSBoaXDDs3Rlc2lzIG51bGEgZGUgbm9ybWFsaWRhZCB5IGNvbmNsdWltb3MgcXVlIGxvcyBkYXRvcyAqKm5vIGVzdMOhbiBub3JtYWxtZW50ZSBkaXN0cmlidWlkb3MqKi4NCg0KYGBge3J9DQojIFNoYXBpcm8tV2lsayBub3JtYWxpdHkgdGVzdCBmb3IgUmVjdXBlcmFjacOzbiBHbG9iYWwgUFNBIDIwMjUNCndpdGgoZGF0YXNldCwgc2hhcGlyby50ZXN0KGRhdGFzZXRbZGF0YXNldCRaYWZyYSA9PSAiMjAyNSIsXSRSZWN1cGVyYWNpb25fR2xvYmFsXzU4NjEpKQ0KYGBgDQpBIHVuIG5pdmVsIGRlIHNpZ25pZmljYW5jaWEgZGVsIDUlIHJlY2hhemFtb3MgbGEgaGlww7N0ZXNpcyBudWxhIGRlIG5vcm1hbGlkYWQgeSBjb25jbHVpbW9zIHF1ZSBsb3MgZGF0b3MgKipubyBlc3TDoW4gbm9ybWFsbWVudGUgZGlzdHJpYnVpZG9zKiouDQoNCiMjIyBQcnVlYmEgV2lsY294b24NCg0KRGViaWRvIGEgcXVlIGFtYmFzIG11ZXN0cmFzIG5vIGN1bXBsZW4gZWwgcmVxdWlzaXRvIGRlIHNlciBub3JtYWxtZW50ZSBkaXN0cmlidWlkYXMsIHNlIGVsaWdlIGxhIHBydWViYSAqKldpbGNveG9uIGRlIERvcyBNdWVzdHJhcyBObyBQYXJlYWRhcyoqIGNvbW8gdW5hIGFsdGVybmF0aXZhIG5vLXBhcmFtw6l0cmljYSBhIGxhIHBydWViYSAqKnQtVGVzdCBkZSBEb3MgTXVlc3RyYXMgTm8gUGFyZWFkYXMqKiwgbGEgY3VhbCBlcyDDunRpbCBwYXJhIGNvbXBhcmFyIGRvcyBncnVwb3MgaW5kZXBlbmRpZW50ZXMgZGUgbXVlc3RyYXMgY3VhbmRvICoqbm8gZXN0w6FuIG5vcm1hbG1lbnRlIGRpc3RyaWJ1aWRhcyoqLg0KDQokSF8wOiBSR197MjAyNH0gLSBSR197MjAyNX0gXGdlcSAwJA0KDQokSF8xOiBSR197MjAyNH0gLSBSR197MjAyNX0gPCAwJA0KDQpgYGB7cn0NCnggPC0gZGF0YXNldFtkYXRhc2V0JFphZnJhID09ICIyMDI0IixdJFJlY3VwZXJhY2lvbl9HbG9iYWxfNTg2MQ0KeSA8LSBkYXRhc2V0W2RhdGFzZXQkWmFmcmEgPT0gIjIwMjUiLF0kUmVjdXBlcmFjaW9uX0dsb2JhbF81ODYxDQoNCnJlc19XaWxjb3ggPC0gd2lsY294LnRlc3QoeCwgeSwgYWx0ZXJuYXRpdmUgPSAibGVzcyIsIG11ID0gMC4wLCBjb25mLmxldmVsID0gMC45NSkNCnJlc19XaWxjb3gNCmBgYA0KYGBge3J9DQpyZXNfV2lsY294JHAudmFsdWUNCmBgYA0KQSB1biBuaXZlbCBkZSBjb25maWFuemEgZGVsIDk1JSwgY29uIHVuICoqcC12YWx1ZSBkZSAyLjM2NDU2ZS0xMiByZWNoYXphbW9zIGxhIGhpcMOzdGVzaXMgbnVsYSAkSF8wOiBSR197MjAyNH0gLSBSR197MjAyNX0gXGdlcSAwJCoqIHkgZXhpc3RlIGV2aWRlbmNpYSBlc3RhZMOtc3RpY2Egc3VmaWNpZW50ZSBwYXJhIGNvbmNsdWlyIHF1ZSAqKiRIXzE6IFJHX3syMDI0fSAtIFJHX3syMDI1fSA8IDAkKiosIGVzIGRlY2lyLCBlbCBSZW5kaW1pZW50byBwYXJhIGxhIHphZnJhIDIwMjUgZXMgbWF5b3IgYWwgZGUgbGEgemFmcmEgMjAyNC4NCg0KIyMjIFBydWViYSB0LVRlc3QgZGUgRG9zIE11ZXN0cmFzIE5vIFBhcmVhZGFzIFZhcmlhbnphcyBEZXNpZ3VhbGVzDQoNClNlIG11ZXN0cmEgY29tbyBlamVyY2ljaW8gbGEgcHJ1ZWJhICoqdC1UZXN0IGRlIERvcyBNdWVzdHJhcyBObyBQYXJlYWRhcyoqLCBsYSBjdWFsIGVzIMO6dGlsIHBhcmEgY29tcGFyYXIgZG9zIGdydXBvcyBpbmRlcGVuZGllbnRlcyBkZSBtdWVzdHJhcyBjdWFuZG8gc2UgYXN1bWUgcXVlIGVzdMOhbiBub3JtYWxtZW50ZSBkaXN0cmlidWlkYXMuDQoNCiRIXzA6IFJHX3syMDI0fSAtIFJHX3syMDI1fSBcZ2VxIDAkDQoNCiRIXzE6IFJHX3syMDI0fSAtIFJHX3syMDI1fSA8IDAkDQoNCmBgYHtyfQ0KcmVzX3RUZXN0IDwtIHQudGVzdCh4LCB5LCBhbHRlcm5hdGl2ZSA9ICdsZXNzJywgbXUgPSAwLjAsIHZhci5lcXVhbCA9IEZBTFNFKQ0KcmVzX3RUZXN0DQpgYGANCmBgYHtyfQ0KcmVzX3RUZXN0JHAudmFsdWUNCmBgYA0KQSB1biBuaXZlbCBkZSBjb25maWFuemEgZGVsIDk1JSwgY29uIHVuICoqcC12YWx1ZSBkZSA5Ljk5Nzc5NmUtMDkgcmVjaGF6YW1vcyBsYSBoaXDDs3Rlc2lzIG51bGEgJEhfMDogUkdfezIwMjR9IC0gUkdfezIwMjV9IFxnZXEgMCQqKiB5IGV4aXN0ZSBldmlkZW5jaWEgZXN0YWTDrXN0aWNhIHN1ZmljaWVudGUgcGFyYSBjb25jbHVpciBxdWUgKiokSF8xOiBSR197MjAyNH0gLSBSR197MjAyNX0gPCAwJCoqLCBlcyBkZWNpciwgZWwgUmVuZGltaWVudG8gcGFyYSBsYSB6YWZyYSAyMDI1IGVzIG1heW9yIGFsIGRlIGxhIHphZnJhIDIwMjQuDQoNCg0KIyMjIFBydWViYSBXaWxjb3hvbiBwYXJhIERpZmVyZW5jaWEgTcOtbmltYSBTaWduaWZpY2F0aXZhIGVudHJlIFJlY3VwZXJhY2nDs24gR2xvYmFsIDIwMjQgeSAyMDI1DQoNClNlIGNvbmR1Y2UgZWwgdGVzdCBkZSBXaWxjb3hvbiBwYXJhIGVuY29udHJhciB1bmEgZGlmZXJlbmNpYSBtw61uaW1hIHNpZ25pZmljYXRpdmEgZW50cmUgbGFzIFJlY3VwZXJhY2lvbmVzIEdsb2JhbGVzIDIwMjQgeSAyMDI1DQoNCiRIXzA6IFJHX3syMDI1fSAtIFJHX3syMDI0fSBcbGVxIDEuNDIkDQoNCiRIXzE6IFJHX3syMDI1fSAtIFJHX3syMDI0fSA+IDEuNDIkDQoNCmBgYHtyfQ0KeCA8LSBkYXRhc2V0W2RhdGFzZXQkWmFmcmEgPT0gIjIwMjQiLF0kUmVjdXBlcmFjaW9uX0dsb2JhbF81ODYxDQp5IDwtIGRhdGFzZXRbZGF0YXNldCRaYWZyYSA9PSAiMjAyNSIsXSRSZWN1cGVyYWNpb25fR2xvYmFsXzU4NjENCg0KcmVzX1dpbGNveCA8LSB3aWxjb3gudGVzdCh5LCB4LCBhbHRlcm5hdGl2ZSA9ICJncmVhdCIsIG11ID0gMS40MiAsIGNvbmYubGV2ZWwgPSAwLjk1KQ0KcmVzX1dpbGNveA0KYGBgDQpgYGB7cn0NCnJlc19XaWxjb3gkcC52YWx1ZQ0KYGBgDQpBIHVuIG5pdmVsIGRlIGNvbmZpYW56YSBkZWwgOTUlLCBjb24gdW4gKipwLXZhbHVlIGRlIDAuMDQ2NjQ3NTYgcmVjaGF6YW1vcyBsYSBoaXDDs3Rlc2lzIG51bGEgJEhfMDogUkdfezIwMjV9IC0gUkdfezIwMjR9IFxsZXEgMS40MiQqKiB5IGV4aXN0ZSBldmlkZW5jaWEgZXN0YWTDrXN0aWNhIHN1ZmljaWVudGUgcGFyYSBjb25jbHVpciBxdWUgKiokSF8xOiBSR197MjAyNX0gLSBSR197MjAyNH0gPiAxLjQyJCoqLCBlcyBkZWNpciwgZWwgUmVuZGltaWVudG8gcGFyYSBsYSB6YWZyYSAyMDI1IGVzIG1heW9yIGFsIGRlIGxhIHphZnJhIDIwMjQgKipwb3IgYWwgbWVub3MgMS40MiUqKi4NCg0KIyMjIFBydWViYSBBTk9WQSBwYXJhIERvcyBNdWVzdHJhcyAoVW4gZmFjdG9yKQ0KDQpTZSByZWFsaXphIHVuYSBwcnVlYmEgQU5PVkEgY29uIGxhcyBkb3MgbXVlc3RyYXMsIGVxdWl2YWxlbnRlIGEgcHJ1ZWJhIHQtU3R1ZGVudCwgcGFyYSB1biBzb2xvIGZhY3RvciAoWmFmcmEpLg0KDQpgYGB7cn0NCmRhdGFzZXRfYW5vdmEgPC0gZGF0YXNldA0KZGF0YXNldF9hbm92YSRaYWZyYSA8LSBmYWN0b3IoZGF0YXNldF9hbm92YSRaYWZyYSkNCm9uZS53YXkgPC0gYW92KFJlY3VwZXJhY2lvbl9HbG9iYWxfNTg2MSB+IFphZnJhLCBkYXRhID0gZGF0YXNldF9hbm92YSkNCnN1bW1hcnkob25lLndheSkNCmBgYA0KQ29uIHVuICoqcC12YWx1ZSBkZSAzLjY0ZS0wOCoqIHNlIHJlY2hhemEgbGEgaGlww7N0ZXNpcyBudWxhIGRlIG1lZGlhcyBpZ3VhbGVzIHkgZWwgZmFjdG9yICoqWmFmcmEqKiB0aWVuZSB1biBpbXBhY3RvIHNpZ25pZmljYXRpdm8gZW4gbGEgUmVjdXBlcmFjacOzbiBHbG9iYWwsIHkgcG9yIGxvIHRhbnRvIHNlIGNvbmNsdXllIHF1ZSAqKmxhcyBtZWRpYXMgc29uIGRpZmVyZW50ZXMqKi4gDQoNCmBgYHtyfQ0KZ2dwbG90KGRhdGEgPSBkYXRhc2V0X2Fub3ZhLCBhZXMoeCA9IFphZnJhLCB5ID0gUmVjdXBlcmFjaW9uX0dsb2JhbF81ODYxKSkgKyBnZW9tX2JveHBsb3QoKSArIGdlb21faml0dGVyKGFlcyhjb2xvciA9IFphZnJhKSkgKyBnZ3RpdGxlKCJCb3ggUGxvdCBSZWN1cGVyYWNpb24gR2xvYmFsICglKSIpDQpgYGANCg0K