Se presenta un análisis de correlación de la Pérdida Indeterminada
Porcentual (%) de PSA para la Zafra 2021-2022.
Scatter - Correlation Plot Function
mapa_dispersion <- function(label_x,label_y,dataset) {
correlacion <- round(cor(dataset[[label_x]],dataset[[label_y]]),2)
ggplot(dataset, aes(.data[[label_x]], .data[[label_y]])) +
geom_point(
color="orange",
fill="#69b3a2",
shape=21,
alpha=0.5,
size=6,
stroke = 2
) +
geom_smooth(method=lm , color="#990000", fill="#FFCF00", se=TRUE) +
ggtitle(paste(label_y,"vrs.",label_x), subtitle = paste("Correlation: ",correlacion)) +
xlab(label_x) + ylab(label_y)
}
Dataset de Pérdidas Indeterminadas
El conjunto de datos analizados contiene 346
variables del Sistema de Control (Procesos de Fabricación)
y Laboratorio Industrial. La variable objetivo es la Pérdida
Indeterminada Porcentual (%), que es la proporción de pérdida que
corresponde a la Pérdida Indeterminada (kg/t) respecto al Total de
Pérdidas (kg/t) desde el Core Sampler.
dataset_indeterminadas_2022 <- read.csv(file = 'C:/Compartido/Recuperacion Global MRAMOS 2024/Indeterminadas_2022_Limpio.csv')
# Filter Dataset by Column Values:
df_2022 <- dataset_indeterminadas_2022[dataset_indeterminadas_2022$Perdidas_indeterminadas_Porcentaje<=25,] # Filter out "y" outliers
# Remoción de Variables Colineales: ID, Pérdida Indeterminada (kg/t), Recuperación Global (%), Recobrado (kg/t)
df_2022 <- df_2022[-c(1,77,79)]
df_2022
Función de Densidad: Pérdidas Indeterminadas (%)
# PDF
distr(df_2022,'Perdidas_indeterminadas_Porcentaje')
Warning: Font 'Arial Narrow' is not installed, has other name, or can't be found

# Boxplot
ggplot(df_2022, aes(y=Perdidas_indeterminadas_Porcentaje)) +
geom_boxplot(
# custom boxes
color="blue",
fill="blue",
alpha=0.2,
# Notch
notch=TRUE,
notchwidth = 0.8,
# custom outliers
outlier.colour="red",
outlier.fill="red",
outlier.size=3) +
scale_x_discrete() +
labs(title="Boxplot",x="", y = "Pérdida Indeterminada (%)")

# Descriptive Statistics
data.frame(Estadistica=stat.desc(df_2022$Perdidas_indeterminadas_Porcentaje))
NA
corr_var(df_2022, # dataframe name
Perdidas_indeterminadas_Porcentaje, # target
max_pvalue = 0.05, # significance level
top = 20, # top n most correlated variables with target
plot = T
)

Diagrama de Dispersión: Perdida Indeterminada - Dia Zafra
label_x <- "Dia_Zafra"
label_y <- "Perdidas_indeterminadas_Porcentaje"
mapa_dispersion(label_x,label_y,df_2022)

Se formula la hipótesis que las acciones correctivas que se realizan
al inicio de zafra (relacionado a finalización de instalaciones, ajustes
y mantenimientos) impactan en las pérdidas indeterminadas. Debido a que
estos efectos no pueden observarse directamente, se propone considerar
la variable de eficiencia de capacidad como un factor
de confusión en este análisis. La justificación es que,
dado que se demuestra la correlación entre la eficiencia de capacidad y
el día de zafra con la pérdida indeterminada, si estas acciones que
ocurren al inicio de la zafra pueden corregirse en el menor tiempo
posible, podrá entonces reducirse el périodo de pérdidas indeterminadas
altas.
El tratamiento de este factor de confusión será identificar y
filtrar las variables de proceso y laboratorio que tengan una
correlación alta con la eficiencia de capacidad, y concentrar el
análisis en las variables que después de este filtrado aún mantengan
correlación alta con la pérdida indeterminada.
El objetivo es encontrar posibles causas de pérdidas indeterminadas
cuando se haya logrado una “estabilidad operativa”.
Para analizar posibles causas relacionadas a la pérdida indeterminada
en operación estable, se propone eliminar las
variables que tienen alta correlación con la Eficiencia de
Capacidad. Para ello, se hace un análisis de correlación para con
la Eficiencia de Capacidad
Variables Correlacionadas con Eficiencia de Capacidad
corr_var(df_2022, # nombre del dataframe
Eficiencia_Capacidad_5527, # variable objetivo
max_pvalue = 0.05, # nivel de significancia para la región de rechazo en las pruebas de hipótesis
top = 25, # despliegue de las 25 variables más correlacionadas con la variable objetivo
plot = T
)

cor_var_eff <- corr_var(df_2022, # nombre del dataframe
Eficiencia_Capacidad_5527, # variable objetivo
max_pvalue = 0.05, # nivel de significancia para la región de rechazo en las pruebas de hipótesis
top = 25, # despliegue de las 25 variables más correlacionadas con la variable objetivo
plot = F
)
cor_var_eff
NA
listado_final <- cor_var_eff$variables
listado_final <- listado_final[listado_final != "Perdidas_indeterminadas_Porcentaje"]
listado_final <- append(listado_final,c(
"Dia_Zafra",
"Eficiencia_Capacidad_5527",
"Caña_Recibida_dia_5796",
"Tiempo_perdido_total_dia_1606"
))
df_filtered_2022 <- df_2022[,!names(df_2022) %in% listado_final]
df_filtered_2022
Una vez identificados los factores de confusión relacionados con la
estabilidad operativa, éstos se remueven del conjunto de datos para
examinar la correlación de las variables restantes con la pérdida
indeterminada. Se muestra el análisis de correlación a continuación:
corr_var(df_filtered_2022, # nombre del dataframe
Perdidas_indeterminadas_Porcentaje, # variable objetivo
max_pvalue = 0.05, # nivel de significancia para la región de rechazo en las pruebas de hipótesis
top = 25, # despliegue de las 30 variables más correlacionadas con la variable objetivo
plot = T
)

cor_var_eff <- corr_var(df_filtered_2022, # nombre del dataframe
Perdidas_indeterminadas_Porcentaje, # variable objetivo
max_pvalue = 0.05, # nivel de significancia para la región de rechazo en las pruebas de hipótesis
top = 25, # despliegue de las 25 variables más correlacionadas con la variable objetivo
plot = F
)
cor_var_eff
NA
Estas variables representan los factores que influyen directamente en
la pérdida indeterminada. Existen algunas variables que están
relacionadas con las pérdidas determinadas, y éstos
pueden identificarse directamente con su descripción y la dirección.
Por ejemplo, Pérdida en Bagazo es una pérdida
determinada. Se esperaría que al incrementarse, la pérdida indeterminada
se reduzca, pues ésta última se calcula restando las pérdidas
determinadas de una cantidad de azúcar disponible de entrada (cálculo de
suma cero). Por lo tanto la correlación se espera sea
“negativa”. Este mismo caso ocurriría con la
Pol de Bagazo, que se relaciona directamente con la
pérdida en bagazo y la Extracción de sacarosa que se
relaciona inversamente con la pérdida en bagazo.
Se presentan entonces correlaciones no esperadas.
Gráficos de Dispersión Variables Correlacionadas
Diagramas de Dispersión:
label_x <- "Temp_escape_2_TT589106"
label_y <- "Perdidas_indeterminadas_Porcentaje"
mapa_dispersion(label_x,label_y,df_filtered_2022)

label_x <- "Perdidas_Azucar_en_aguas_efluentes_5857"
label_y <- "Perdidas_indeterminadas_Porcentaje"
mapa_dispersion(label_x,label_y,df_filtered_2022)

label_x <- "Floculante_meladura__4797"
label_y <- "Perdidas_indeterminadas_Porcentaje"
mapa_dispersion(label_x,label_y,df_filtered_2022)

label_x <- "Brix_Miel_final_960"
label_y <- "Perdidas_indeterminadas_Porcentaje"
mapa_dispersion(label_x,label_y,df_filtered_2022)

label_x <- "Caña_Molida_hora_TA_2207"
label_y <- "Perdidas_indeterminadas_Porcentaje"
mapa_dispersion(label_x,label_y,df_filtered_2022)

label_x <- "Flujo_de_acido_Fosforico_clarificacion_de_meladura_FT583007"
label_y <- "Perdidas_indeterminadas_Porcentaje"
mapa_dispersion(label_x,label_y,df_filtered_2022)

label_x <- "Recirculacion_Magma_B_2630"
label_y <- "Perdidas_indeterminadas_Porcentaje"
mapa_dispersion(label_x,label_y,df_filtered_2022)

label_x <- "Retenido_malla_30_Azucar_Blanco_total_2581"
label_y <- "Perdidas_indeterminadas_Porcentaje"
mapa_dispersion(label_x,label_y,df_filtered_2022)

label_x <- "Flujo_agua_fria_cristalizador_vertical_2_FT64VC02"
label_y <- "Perdidas_indeterminadas_Porcentaje"
mapa_dispersion(label_x,label_y,df_filtered_2022)

LS0tDQp0aXRsZTogIkFuw6FsaXNpcyBQw6lyZGlkYXMgSW5kZXRlcm1pbmFkYXMgUFNBIDIwMjIiDQpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sNCi0tLQ0KDQpTZSBwcmVzZW50YSB1biBhbsOhbGlzaXMgZGUgY29ycmVsYWNpw7NuIGRlIGxhIFDDqXJkaWRhIEluZGV0ZXJtaW5hZGEgUG9yY2VudHVhbCAoJSkgZGUgUFNBIHBhcmEgbGEgKipaYWZyYSAyMDIxLTIwMjIqKi4NCg0KKk5vdGE6IEVzdGUgYW7DoWxpc2lzIHByZXRlbmRlIGF1eGlsaWFyIGFsIGFuw6FsaXNpcyBkZSBjYXVzYWxpZGFkLCBxdWUgc2UgbGxldmFyw6EgYSBjYWJvIGNvbiBsb3MgcHJvY2Vzb3MuKg0KDQojIyMgTGlicmFyaWVzDQpgYGB7cn0NCmxpYnJhcnkoZHBseXIpDQpsaWJyYXJ5KHBhc3RlY3MpDQpsaWJyYXJ5KGdncGxvdDIpDQpsaWJyYXJ5KGxhcmVzKQ0KYGBgDQoNCg0KIyMjIFNjYXR0ZXIgLSBDb3JyZWxhdGlvbiBQbG90IEZ1bmN0aW9uDQpgYGB7cn0NCm1hcGFfZGlzcGVyc2lvbiA8LSBmdW5jdGlvbihsYWJlbF94LGxhYmVsX3ksZGF0YXNldCkgew0KICBjb3JyZWxhY2lvbiA8LSByb3VuZChjb3IoZGF0YXNldFtbbGFiZWxfeF1dLGRhdGFzZXRbW2xhYmVsX3ldXSksMikNCiAgZ2dwbG90KGRhdGFzZXQsIGFlcyguZGF0YVtbbGFiZWxfeF1dLCAuZGF0YVtbbGFiZWxfeV1dKSkgKyANCiAgICBnZW9tX3BvaW50KA0KICAgICAgICBjb2xvcj0ib3JhbmdlIiwNCiAgICAgICAgZmlsbD0iIzY5YjNhMiIsDQogICAgICAgIHNoYXBlPTIxLA0KICAgICAgICBhbHBoYT0wLjUsDQogICAgICAgIHNpemU9NiwNCiAgICAgICAgc3Ryb2tlID0gMg0KICAgICAgICApICsNCiAgICBnZW9tX3Ntb290aChtZXRob2Q9bG0gLCBjb2xvcj0iIzk5MDAwMCIsIGZpbGw9IiNGRkNGMDAiLCBzZT1UUlVFKSArDQogICAgZ2d0aXRsZShwYXN0ZShsYWJlbF95LCJ2cnMuIixsYWJlbF94KSwgc3VidGl0bGUgPSBwYXN0ZSgiQ29ycmVsYXRpb246ICIsY29ycmVsYWNpb24pKSArDQogIHhsYWIobGFiZWxfeCkgKyB5bGFiKGxhYmVsX3kpDQp9DQpgYGANCg0KDQojIyMgRGF0YXNldCBkZSBQw6lyZGlkYXMgSW5kZXRlcm1pbmFkYXMNCg0KRWwgY29uanVudG8gZGUgZGF0b3MgYW5hbGl6YWRvcyBjb250aWVuZSAqKiozNDYgdmFyaWFibGVzKioqIGRlbCBTaXN0ZW1hIGRlIENvbnRyb2wgKFByb2Nlc29zIGRlIEZhYnJpY2FjacOzbikgeSBMYWJvcmF0b3JpbyBJbmR1c3RyaWFsLg0KTGEgdmFyaWFibGUgb2JqZXRpdm8gZXMgbGEgUMOpcmRpZGEgSW5kZXRlcm1pbmFkYSBQb3JjZW50dWFsICglKSwgcXVlIGVzICpsYSBwcm9wb3JjacOzbiBkZSBww6lyZGlkYSBxdWUgY29ycmVzcG9uZGUgYSBsYSBQw6lyZGlkYSBJbmRldGVybWluYWRhIChrZy90KSByZXNwZWN0byBhbCBUb3RhbCBkZSBQw6lyZGlkYXMgKGtnL3QpIGRlc2RlIGVsIENvcmUgU2FtcGxlciouDQpgYGB7cn0NCmRhdGFzZXRfaW5kZXRlcm1pbmFkYXNfMjAyMiA8LSByZWFkLmNzdihmaWxlID0gJ0M6L0NvbXBhcnRpZG8vUmVjdXBlcmFjaW9uIEdsb2JhbCBNUkFNT1MgMjAyNC9JbmRldGVybWluYWRhc18yMDIyX0xpbXBpby5jc3YnKQ0KDQoNCiMgRmlsdGVyIERhdGFzZXQgYnkgQ29sdW1uIFZhbHVlczoNCmRmXzIwMjIgPC0gZGF0YXNldF9pbmRldGVybWluYWRhc18yMDIyW2RhdGFzZXRfaW5kZXRlcm1pbmFkYXNfMjAyMiRQZXJkaWRhc19pbmRldGVybWluYWRhc19Qb3JjZW50YWplPD0yNSxdICMgRmlsdGVyIG91dCAieSIgb3V0bGllcnMNCg0KIyBSZW1vY2nDs24gZGUgVmFyaWFibGVzIENvbGluZWFsZXM6IElELCBQw6lyZGlkYSBJbmRldGVybWluYWRhIChrZy90KSwgUmVjdXBlcmFjacOzbiBHbG9iYWwgKCUpLCBSZWNvYnJhZG8gKGtnL3QpDQpkZl8yMDIyIDwtIGRmXzIwMjJbLWMoMSw3Nyw3OSldDQpkZl8yMDIyDQpgYGANCg0KIyMjIEZ1bmNpw7NuIGRlIERlbnNpZGFkOiBQw6lyZGlkYXMgSW5kZXRlcm1pbmFkYXMgKCUpDQpgYGB7cn0NCg0KIyBQREYNCmRpc3RyKGRmXzIwMjIsJ1BlcmRpZGFzX2luZGV0ZXJtaW5hZGFzX1BvcmNlbnRhamUnKQ0KDQojIEJveHBsb3QNCmdncGxvdChkZl8yMDIyLCBhZXMoeT1QZXJkaWRhc19pbmRldGVybWluYWRhc19Qb3JjZW50YWplKSkgKyANCiAgICBnZW9tX2JveHBsb3QoIA0KICAgICAgICAjIGN1c3RvbSBib3hlcw0KICAgICAgICBjb2xvcj0iYmx1ZSIsDQogICAgICAgIGZpbGw9ImJsdWUiLA0KICAgICAgICBhbHBoYT0wLjIsDQogICAgICAgIA0KICAgICAgICAjIE5vdGNoDQogICAgICAgIG5vdGNoPVRSVUUsDQogICAgICAgIG5vdGNod2lkdGggPSAwLjgsDQogICAgICAgIA0KICAgICAgICAjIGN1c3RvbSBvdXRsaWVycw0KICAgICAgICBvdXRsaWVyLmNvbG91cj0icmVkIiwNCiAgICAgICAgb3V0bGllci5maWxsPSJyZWQiLA0KICAgICAgICBvdXRsaWVyLnNpemU9MykgKw0KICBzY2FsZV94X2Rpc2NyZXRlKCkgKw0KICBsYWJzKHRpdGxlPSJCb3hwbG90Iix4PSIiLCB5ID0gIlDDqXJkaWRhIEluZGV0ZXJtaW5hZGEgKCUpIikNCg0KIyBEZXNjcmlwdGl2ZSBTdGF0aXN0aWNzDQpkYXRhLmZyYW1lKEVzdGFkaXN0aWNhPXN0YXQuZGVzYyhkZl8yMDIyJFBlcmRpZGFzX2luZGV0ZXJtaW5hZGFzX1BvcmNlbnRhamUpKQ0KDQpgYGANCg0KDQpgYGB7cn0NCmNvcnJfdmFyKGRmXzIwMjIsICMgZGF0YWZyYW1lIG5hbWUNCiAgUGVyZGlkYXNfaW5kZXRlcm1pbmFkYXNfUG9yY2VudGFqZSwgIyB0YXJnZXQNCiAgbWF4X3B2YWx1ZSA9IDAuMDUsICMgc2lnbmlmaWNhbmNlIGxldmVsDQogIHRvcCA9IDIwLCAjIHRvcCBuIG1vc3QgY29ycmVsYXRlZCB2YXJpYWJsZXMgd2l0aCB0YXJnZXQNCiAgcGxvdCA9IFQNCikNCmBgYA0KDQojIyMjIERpYWdyYW1hIGRlIERpc3BlcnNpw7NuOiBQZXJkaWRhIEluZGV0ZXJtaW5hZGEgLSBEaWEgWmFmcmENCmBgYHtyfQ0KbGFiZWxfeCA8LSAiRGlhX1phZnJhIg0KbGFiZWxfeSA8LSAiUGVyZGlkYXNfaW5kZXRlcm1pbmFkYXNfUG9yY2VudGFqZSINCg0KbWFwYV9kaXNwZXJzaW9uKGxhYmVsX3gsbGFiZWxfeSxkZl8yMDIyKQ0KYGBgDQoNCg0KU2UgZm9ybXVsYSBsYSBoaXDDs3Rlc2lzIHF1ZSBsYXMgYWNjaW9uZXMgY29ycmVjdGl2YXMgcXVlIHNlIHJlYWxpemFuIGFsIGluaWNpbyBkZSB6YWZyYSAocmVsYWNpb25hZG8gYSBmaW5hbGl6YWNpw7NuIGRlIGluc3RhbGFjaW9uZXMsIGFqdXN0ZXMgeSBtYW50ZW5pbWllbnRvcykgaW1wYWN0YW4gZW4gbGFzIHDDqXJkaWRhcyBpbmRldGVybWluYWRhcy4gRGViaWRvIGEgcXVlIGVzdG9zIGVmZWN0b3Mgbm8gcHVlZGVuIG9ic2VydmFyc2UgZGlyZWN0YW1lbnRlLCBzZSBwcm9wb25lIGNvbnNpZGVyYXIgbGEgdmFyaWFibGUgZGUgZWZpY2llbmNpYSBkZSBjYXBhY2lkYWQgY29tbyB1biBbKipmYWN0b3IgZGUgY29uZnVzacOzbioqXShodHRwczovL2VzLndpa2lwZWRpYS5vcmcvd2lraS9GYWN0b3JfZGVfY29uZnVzaSVDMyVCM24pIGVuIGVzdGUgYW7DoWxpc2lzLiBMYSBqdXN0aWZpY2FjacOzbiBlcyBxdWUsIGRhZG8gcXVlIHNlIGRlbXVlc3RyYSBsYSBjb3JyZWxhY2nDs24gZW50cmUgbGEgZWZpY2llbmNpYSBkZSBjYXBhY2lkYWQgeSBlbCBkw61hIGRlIHphZnJhIGNvbiBsYSBww6lyZGlkYSBpbmRldGVybWluYWRhLCBzaSBlc3RhcyBhY2Npb25lcyBxdWUgb2N1cnJlbiBhbCBpbmljaW8gZGUgbGEgemFmcmEgcHVlZGVuIGNvcnJlZ2lyc2UgZW4gZWwgbWVub3IgdGllbXBvIHBvc2libGUsIHBvZHLDoSBlbnRvbmNlcyByZWR1Y2lyc2UgZWwgcMOpcmlvZG8gZGUgcMOpcmRpZGFzIGluZGV0ZXJtaW5hZGFzIGFsdGFzLg0KDQoqRWwgdHJhdGFtaWVudG8gZGUgZXN0ZSBmYWN0b3IgZGUgY29uZnVzacOzbiBzZXLDoSBpZGVudGlmaWNhciB5IGZpbHRyYXIgbGFzIHZhcmlhYmxlcyBkZSBwcm9jZXNvIHkgbGFib3JhdG9yaW8gcXVlIHRlbmdhbiB1bmEgY29ycmVsYWNpw7NuIGFsdGEgY29uIGxhIGVmaWNpZW5jaWEgZGUgY2FwYWNpZGFkLCB5IGNvbmNlbnRyYXIgZWwgYW7DoWxpc2lzIGVuIGxhcyB2YXJpYWJsZXMgcXVlIGRlc3B1w6lzIGRlIGVzdGUgZmlsdHJhZG8gYcO6biBtYW50ZW5nYW4gY29ycmVsYWNpw7NuIGFsdGEgY29uIGxhIHDDqXJkaWRhIGluZGV0ZXJtaW5hZGEuKg0KDQpFbCBvYmpldGl2byBlcyBlbmNvbnRyYXIgcG9zaWJsZXMgY2F1c2FzIGRlIHDDqXJkaWRhcyBpbmRldGVybWluYWRhcyBjdWFuZG8gc2UgaGF5YSBsb2dyYWRvIHVuYSAiZXN0YWJpbGlkYWQgb3BlcmF0aXZhIi4NCg0KDQpQYXJhIGFuYWxpemFyIHBvc2libGVzIGNhdXNhcyByZWxhY2lvbmFkYXMgYSBsYSBww6lyZGlkYSBpbmRldGVybWluYWRhICoqZW4gb3BlcmFjacOzbiBlc3RhYmxlKiosIHNlIHByb3BvbmUgKmVsaW1pbmFyIGxhcyB2YXJpYWJsZXMgcXVlIHRpZW5lbiBhbHRhIGNvcnJlbGFjacOzbiBjb24gbGEgRWZpY2llbmNpYSBkZSBDYXBhY2lkYWQuKiBQYXJhIGVsbG8sIHNlIGhhY2UgdW4gYW7DoWxpc2lzIGRlIGNvcnJlbGFjacOzbiBwYXJhIGNvbiBsYSAqKkVmaWNpZW5jaWEgZGUgQ2FwYWNpZGFkKioNCg0KIyMjIyBWYXJpYWJsZXMgQ29ycmVsYWNpb25hZGFzIGNvbiBFZmljaWVuY2lhIGRlIENhcGFjaWRhZA0KDQpgYGB7cn0NCmNvcnJfdmFyKGRmXzIwMjIsICMgbm9tYnJlIGRlbCBkYXRhZnJhbWUNCiAgRWZpY2llbmNpYV9DYXBhY2lkYWRfNTUyNywgIyB2YXJpYWJsZSBvYmpldGl2bw0KICBtYXhfcHZhbHVlID0gMC4wNSwgIyBuaXZlbCBkZSBzaWduaWZpY2FuY2lhIHBhcmEgbGEgcmVnacOzbiBkZSByZWNoYXpvIGVuIGxhcyBwcnVlYmFzIGRlIGhpcMOzdGVzaXMNCiAgdG9wID0gMjUsICMgZGVzcGxpZWd1ZSBkZSBsYXMgMjUgdmFyaWFibGVzIG3DoXMgY29ycmVsYWNpb25hZGFzIGNvbiBsYSB2YXJpYWJsZSBvYmpldGl2bw0KICBwbG90ID0gVA0KKQ0KDQpgYGANCg0KYGBge3J9DQpjb3JfdmFyX2VmZiA8LSBjb3JyX3ZhcihkZl8yMDIyLCAjIG5vbWJyZSBkZWwgZGF0YWZyYW1lDQogIEVmaWNpZW5jaWFfQ2FwYWNpZGFkXzU1MjcsICMgdmFyaWFibGUgb2JqZXRpdm8NCiAgbWF4X3B2YWx1ZSA9IDAuMDUsICMgbml2ZWwgZGUgc2lnbmlmaWNhbmNpYSBwYXJhIGxhIHJlZ2nDs24gZGUgcmVjaGF6byBlbiBsYXMgcHJ1ZWJhcyBkZSBoaXDDs3Rlc2lzDQogIHRvcCA9IDI1LCAjIGRlc3BsaWVndWUgZGUgbGFzIDI1IHZhcmlhYmxlcyBtw6FzIGNvcnJlbGFjaW9uYWRhcyBjb24gbGEgdmFyaWFibGUgb2JqZXRpdm8NCiAgcGxvdCA9IEYNCikNCmNvcl92YXJfZWZmDQoNCmBgYA0KDQpgYGB7cn0NCmxpc3RhZG9fZmluYWwgPC0gY29yX3Zhcl9lZmYkdmFyaWFibGVzDQpsaXN0YWRvX2ZpbmFsIDwtIGxpc3RhZG9fZmluYWxbbGlzdGFkb19maW5hbCAhPSAiUGVyZGlkYXNfaW5kZXRlcm1pbmFkYXNfUG9yY2VudGFqZSJdDQpsaXN0YWRvX2ZpbmFsIDwtIGFwcGVuZChsaXN0YWRvX2ZpbmFsLGMoDQogICAgICAgICAgICAgICAgICAiRGlhX1phZnJhIiwNCiAgICAgICAgICAgICAgICAgICJFZmljaWVuY2lhX0NhcGFjaWRhZF81NTI3IiwNCiAgICAgICAgICAgICAgICAgICJDYcOxYV9SZWNpYmlkYV9kaWFfNTc5NiIsDQogICAgICAgICAgICAgICAgICAiVGllbXBvX3BlcmRpZG9fdG90YWxfZGlhXzE2MDYiDQogICAgICAgICAgICAgICAgICApKQ0KDQpkZl9maWx0ZXJlZF8yMDIyIDwtIGRmXzIwMjJbLCFuYW1lcyhkZl8yMDIyKSAlaW4lIGxpc3RhZG9fZmluYWxdDQpkZl9maWx0ZXJlZF8yMDIyDQpgYGANCg0KDQoNClVuYSB2ZXogaWRlbnRpZmljYWRvcyBsb3MgZmFjdG9yZXMgZGUgY29uZnVzacOzbiByZWxhY2lvbmFkb3MgY29uIGxhIGVzdGFiaWxpZGFkIG9wZXJhdGl2YSwgw6lzdG9zIHNlIHJlbXVldmVuIGRlbCBjb25qdW50byBkZSBkYXRvcyBwYXJhIGV4YW1pbmFyIGxhIGNvcnJlbGFjacOzbiBkZSBsYXMgdmFyaWFibGVzIHJlc3RhbnRlcyBjb24gbGEgcMOpcmRpZGEgaW5kZXRlcm1pbmFkYS4gU2UgbXVlc3RyYSBlbCBhbsOhbGlzaXMgZGUgY29ycmVsYWNpw7NuIGEgY29udGludWFjacOzbjoNCmBgYHtyfQ0KY29ycl92YXIoZGZfZmlsdGVyZWRfMjAyMiwgIyBub21icmUgZGVsIGRhdGFmcmFtZQ0KICBQZXJkaWRhc19pbmRldGVybWluYWRhc19Qb3JjZW50YWplLCAjIHZhcmlhYmxlIG9iamV0aXZvDQogIG1heF9wdmFsdWUgPSAwLjA1LCAjIG5pdmVsIGRlIHNpZ25pZmljYW5jaWEgcGFyYSBsYSByZWdpw7NuIGRlIHJlY2hhem8gZW4gbGFzIHBydWViYXMgZGUgaGlww7N0ZXNpcw0KICB0b3AgPSAyNSwgIyBkZXNwbGllZ3VlIGRlIGxhcyAyNSB2YXJpYWJsZXMgbcOhcyBjb3JyZWxhY2lvbmFkYXMgY29uIGxhIHZhcmlhYmxlIG9iamV0aXZvDQogIHBsb3QgPSBUDQopDQoNCmBgYA0KDQpgYGB7cn0NCmNvcl92YXJfZWZmIDwtIGNvcnJfdmFyKGRmX2ZpbHRlcmVkXzIwMjIsICMgbm9tYnJlIGRlbCBkYXRhZnJhbWUNCiAgUGVyZGlkYXNfaW5kZXRlcm1pbmFkYXNfUG9yY2VudGFqZSwgIyB2YXJpYWJsZSBvYmpldGl2bw0KICBtYXhfcHZhbHVlID0gMC4wNSwgIyBuaXZlbCBkZSBzaWduaWZpY2FuY2lhIHBhcmEgbGEgcmVnacOzbiBkZSByZWNoYXpvIGVuIGxhcyBwcnVlYmFzIGRlIGhpcMOzdGVzaXMNCiAgdG9wID0gMjUsICMgZGVzcGxpZWd1ZSBkZSBsYXMgMjUgdmFyaWFibGVzIG3DoXMgY29ycmVsYWNpb25hZGFzIGNvbiBsYSB2YXJpYWJsZSBvYmpldGl2bw0KICBwbG90ID0gRg0KKQ0KY29yX3Zhcl9lZmYNCg0KYGBgDQoNCg0KRXN0YXMgdmFyaWFibGVzIHJlcHJlc2VudGFuIGxvcyBmYWN0b3JlcyBxdWUgaW5mbHV5ZW4gZGlyZWN0YW1lbnRlIGVuIGxhIHDDqXJkaWRhIGluZGV0ZXJtaW5hZGEuIEV4aXN0ZW4gYWxndW5hcyB2YXJpYWJsZXMgcXVlIGVzdMOhbiByZWxhY2lvbmFkYXMgY29uIGxhcyAqKnDDqXJkaWRhcyBkZXRlcm1pbmFkYXMqKiwgeSDDqXN0b3MgcHVlZGVuIGlkZW50aWZpY2Fyc2UgZGlyZWN0YW1lbnRlIGNvbiBzdSBkZXNjcmlwY2nDs24geSBsYSBkaXJlY2Npw7NuLg0KDQpQb3IgZWplbXBsbywgKipQw6lyZGlkYSBlbiBCYWdhem8qKiBlcyB1bmEgcMOpcmRpZGEgZGV0ZXJtaW5hZGEuIFNlIGVzcGVyYXLDrWEgcXVlIGFsIGluY3JlbWVudGFyc2UsIGxhIHDDqXJkaWRhIGluZGV0ZXJtaW5hZGEgc2UgcmVkdXpjYSwgcHVlcyDDqXN0YSDDumx0aW1hIHNlIGNhbGN1bGEgcmVzdGFuZG8gbGFzIHDDqXJkaWRhcyBkZXRlcm1pbmFkYXMgZGUgdW5hIGNhbnRpZGFkIGRlIGF6w7pjYXIgZGlzcG9uaWJsZSBkZSBlbnRyYWRhIChjw6FsY3VsbyBkZSBzdW1hIGNlcm8pLiBQb3IgbG8gdGFudG8gbGEgY29ycmVsYWNpw7NuIHNlIGVzcGVyYSBzZWEgKioibmVnYXRpdmEiKiouIEVzdGUgbWlzbW8gY2FzbyBvY3Vycmlyw61hIGNvbiBsYSAqKlBvbCBkZSBCYWdhem8qKiwgcXVlIHNlIHJlbGFjaW9uYSBkaXJlY3RhbWVudGUgY29uIGxhIHDDqXJkaWRhIGVuIGJhZ2F6byB5IGxhICoqRXh0cmFjY2nDs24gZGUgc2FjYXJvc2EqKiBxdWUgc2UgcmVsYWNpb25hIGludmVyc2FtZW50ZSBjb24gbGEgcMOpcmRpZGEgZW4gYmFnYXpvLg0KDQpTZSBwcmVzZW50YW4gZW50b25jZXMgKmNvcnJlbGFjaW9uZXMgbm8gZXNwZXJhZGFzKi4NCg0KIyMjIEdyw6FmaWNvcyBkZSBEaXNwZXJzacOzbiBWYXJpYWJsZXMgQ29ycmVsYWNpb25hZGFzDQoNCiMjIyMgRGlhZ3JhbWFzIGRlIERpc3BlcnNpw7NuOg0KYGBge3J9DQpsYWJlbF94IDwtICJUZW1wX2VzY2FwZV8yX1RUNTg5MTA2Ig0KbGFiZWxfeSA8LSAiUGVyZGlkYXNfaW5kZXRlcm1pbmFkYXNfUG9yY2VudGFqZSINCg0KbWFwYV9kaXNwZXJzaW9uKGxhYmVsX3gsbGFiZWxfeSxkZl9maWx0ZXJlZF8yMDIyKQ0KYGBgDQoNCmBgYHtyfQ0KbGFiZWxfeCA8LSAiUGVyZGlkYXNfQXp1Y2FyX2VuX2FndWFzX2VmbHVlbnRlc181ODU3Ig0KbGFiZWxfeSA8LSAiUGVyZGlkYXNfaW5kZXRlcm1pbmFkYXNfUG9yY2VudGFqZSINCg0KbWFwYV9kaXNwZXJzaW9uKGxhYmVsX3gsbGFiZWxfeSxkZl9maWx0ZXJlZF8yMDIyKQ0KYGBgDQpgYGB7cn0NCmxhYmVsX3ggPC0gIkZsb2N1bGFudGVfbWVsYWR1cmFfXzQ3OTciDQpsYWJlbF95IDwtICJQZXJkaWRhc19pbmRldGVybWluYWRhc19Qb3JjZW50YWplIg0KDQptYXBhX2Rpc3BlcnNpb24obGFiZWxfeCxsYWJlbF95LGRmX2ZpbHRlcmVkXzIwMjIpDQpgYGANCg0KYGBge3J9DQpsYWJlbF94IDwtICJCcml4X01pZWxfZmluYWxfOTYwIg0KbGFiZWxfeSA8LSAiUGVyZGlkYXNfaW5kZXRlcm1pbmFkYXNfUG9yY2VudGFqZSINCg0KbWFwYV9kaXNwZXJzaW9uKGxhYmVsX3gsbGFiZWxfeSxkZl9maWx0ZXJlZF8yMDIyKQ0KYGBgDQpgYGB7cn0NCmxhYmVsX3ggPC0gIkNhw7FhX01vbGlkYV9ob3JhX1RBXzIyMDciDQpsYWJlbF95IDwtICJQZXJkaWRhc19pbmRldGVybWluYWRhc19Qb3JjZW50YWplIg0KDQptYXBhX2Rpc3BlcnNpb24obGFiZWxfeCxsYWJlbF95LGRmX2ZpbHRlcmVkXzIwMjIpDQpgYGANCg0KYGBge3J9DQpsYWJlbF94IDwtICJGbHVqb19kZV9hY2lkb19Gb3Nmb3JpY29fY2xhcmlmaWNhY2lvbl9kZV9tZWxhZHVyYV9GVDU4MzAwNyINCmxhYmVsX3kgPC0gIlBlcmRpZGFzX2luZGV0ZXJtaW5hZGFzX1BvcmNlbnRhamUiDQoNCm1hcGFfZGlzcGVyc2lvbihsYWJlbF94LGxhYmVsX3ksZGZfZmlsdGVyZWRfMjAyMikNCmBgYA0KDQpgYGB7cn0NCmxhYmVsX3ggPC0gIlJlY2lyY3VsYWNpb25fTWFnbWFfQl8yNjMwIg0KbGFiZWxfeSA8LSAiUGVyZGlkYXNfaW5kZXRlcm1pbmFkYXNfUG9yY2VudGFqZSINCg0KbWFwYV9kaXNwZXJzaW9uKGxhYmVsX3gsbGFiZWxfeSxkZl9maWx0ZXJlZF8yMDIyKQ0KYGBgDQoNCmBgYHtyfQ0KbGFiZWxfeCA8LSAiUmV0ZW5pZG9fbWFsbGFfMzBfQXp1Y2FyX0JsYW5jb190b3RhbF8yNTgxIg0KbGFiZWxfeSA8LSAiUGVyZGlkYXNfaW5kZXRlcm1pbmFkYXNfUG9yY2VudGFqZSINCg0KbWFwYV9kaXNwZXJzaW9uKGxhYmVsX3gsbGFiZWxfeSxkZl9maWx0ZXJlZF8yMDIyKQ0KYGBgDQoNCg0KYGBge3J9DQpsYWJlbF94IDwtICJGbHVqb19hZ3VhX2ZyaWFfY3Jpc3RhbGl6YWRvcl92ZXJ0aWNhbF8yX0ZUNjRWQzAyIg0KbGFiZWxfeSA8LSAiUGVyZGlkYXNfaW5kZXRlcm1pbmFkYXNfUG9yY2VudGFqZSINCg0KbWFwYV9kaXNwZXJzaW9uKGxhYmVsX3gsbGFiZWxfeSxkZl9maWx0ZXJlZF8yMDIyKQ0KYGBg