Librerias

library(dplyr)
library(plyr)
library(ggplot2)
# install.packages("naniar")
library(naniar)
# install.packages("Hmisc")
library(Hmisc)  
# install.packages("psych")
library(psych)
library(tidyverse)
# install.packages("janitor")
library(janitor)
# install.packages("knitr")
library(knitr)
# install.packages("pollster")
library(pollster)

Importar Bases de datos

merma <- read.csv("/Users/anita3/Downloads/FORM - Merma.csv")
scrap <- read.csv("/Users/anita3/Downloads/FORM - Scrap.csv")
pcarton <- read.csv("/Users/anita3/Downloads/FORM - Produccion Carton Mes.csv")

Merma

1) ¿Cuántas variables y cuantos registros tiene la base de datos?

describe(merma)
## Warning in FUN(newX[, i], ...): no non-missing arguments to min; returning Inf
## Warning in FUN(newX[, i], ...): no non-missing arguments to max; returning -Inf
##        vars  n  mean    sd median trimmed   mad min  max range  skew kurtosis
## Fecha*    1 60 19.77 13.83   20.5   19.40 17.79   1   43    42  0.05    -1.34
## Mes*      2 60  6.25  4.56    5.0    5.60  4.45   1   19    18  1.05     0.44
## Kilos*    3 60 28.72 15.92   29.0   28.77 19.27   1   56    55 -0.03    -1.21
## X         4  0   NaN    NA     NA     NaN    NA Inf -Inf  -Inf    NA       NA
##          se
## Fecha* 1.79
## Mes*   0.59
## Kilos* 2.06
## X        NA
dim(merma)
## [1] 60  4

2) Clasifica cada variable en cualitativa, cuantitativa discreta o cuantitativa continua

3) Elige la escala de medición de cada variable.

Variable Type
Fecha Cualitativa
Mes Cualitativa
Kilos Cuantitativa (discreta)

4) Aplica al menos 2 técnicas de limpieza de bases de datos y explícalas brevemente, ¿por qué realizaste esas técnicas?

Eliminar renglones de Total por mes

merma <- merma[- grep("Total", merma$Mes),]

Eliminar columna vacia

merma <- select(merma, -X)

Cambiar tipo de datos Cambiar variable kilos a numerico

merma$Kilos <- as.numeric(merma$Kilos)

Cambiar variable caracter a fecha

merma$Fecha <- as.Date(merma$Fecha, format = "%d/%m/%Y")

Agregar columna de Total por mes

merma_total <- aggregate(Kilos ~ Mes, data = merma, sum)

Scrap

1) ¿Cuántas variables y cuantos registros tiene la base de datos?

describe(scrap)
##                       vars   n   mean     sd median trimmed   mad min  max
## Referencia*              1 251 126.00  72.60    126  126.00 93.40   1  251
## Fecha*                   2 251  16.21   7.11     17   16.50  7.41   1   27
## Hora*                    3 251 126.00  72.60    126  126.00 93.40   1  251
## Producto*                4 251  45.20  24.83     46   44.94 26.69   1   96
## Cantidad                 5 251  13.34 105.90      2    3.95  1.48   0 1674
## Unidad.de.medida*        6 251   2.00   0.06      2    2.00  0.00   1    2
## Ubicación.de.origen*     7 251   3.47   0.86      4    3.60  0.00   1    4
## Ubicación.de.desecho*    8 251   2.00   0.06      2    2.00  0.00   1    2
## Estado*                  9 251   2.00   0.06      2    2.00  0.00   1    2
##                       range   skew kurtosis   se
## Referencia*             250   0.00    -1.21 4.58
## Fecha*                   26  -0.29    -0.99 0.45
## Hora*                   250   0.00    -1.21 4.58
## Producto*                95   0.01    -0.80 1.57
## Cantidad               1674  15.37   237.90 6.68
## Unidad.de.medida*         1 -15.65   244.02 0.00
## Ubicación.de.origen*      3  -1.11    -0.62 0.05
## Ubicación.de.desecho*     1 -15.65   244.02 0.00
## Estado*                   1 -15.65   244.02 0.00
dim(scrap)
## [1] 251   9

2) Clasifica cada variable en cualitativa, cuantitativa discreta o cuantitativa continua

3) Elige la escala de medición de cada variable.

Variable Type
Referencia Cualitativa
Fecha Cualitativa
Hora Cuantitativa (continua)
Producto Cualitativa
Cantidad Cuantitativa (discreta)
Unidad de medidad Cualitativa
Ubicación de origen Cualitativa
Ubicacuón de desecho Cualitativa
Estado Cualitativa

4) Aplica al menos 2 técnicas de limpieza de bases de datos y explícalas brevemente, ¿por qué realizaste esas técnicas?

Eliminar renglon de mes y total

scrap <- scrap[- grep("agosto", scrap$Referencia),]

Eliminar columnas

scrap <- select(scrap, -Unidad.de.medida)
scrap <- select(scrap, -Estado)

Cambiar tipo de dato Cambiar variable caracter a fecha

merma$Fecha <- as.Date(merma$Fecha, format = "%d/%m/%Y")

Produccion de Carton

1) ¿Cuántas variables y cuantos registros tiene la base de datos?

describe(pcarton)
##                     vars  n  mean    sd median trimmed   mad min max range skew
## X*                     1 51 26.00 14.87     26   26.00 19.27   1  51    50 0.00
## X.1*                   2 51  5.24  2.16      5    5.15  2.97   1   9     8 0.34
## X.2*                   3 51 22.39 13.72     22   22.29 17.79   1  46    45 0.04
## X.3*                   4 51 26.00 14.87     26   26.00 19.27   1  51    50 0.00
## X.4*                   5 51 10.49  6.77      8   10.00  7.41   1  24    23 0.47
## X.5*                   6 51  3.53  2.59      2    3.17  1.48   1  11    10 0.93
## X.6*                   7 51 11.49  9.55     11   10.83 14.83   1  29    28 0.32
## X.7*                   8 51  7.63  4.60      8    7.56  7.41   1  14    13 0.08
## TIEMPO.DE.MAQUINAS*    9 51 10.04  8.53      9    9.17 10.38   1  28    27 0.58
## X.8*                  10 51  7.49  7.20      2    6.49  1.48   1  24    23 0.87
## X.9*                  11 51  7.88  7.94      2    6.73  1.48   1  26    25 0.94
## X.10*                 12 51 11.92 10.58      9   10.90 10.38   1  33    32 0.54
## X.11*                 13 51 11.92 10.58      9   10.90 10.38   1  33    32 0.54
## X.12*                 14 51  2.69  0.91      3    2.66  0.00   1   6     5 0.80
## X.13*                 15 51  1.16  0.42      1    1.05  0.00   1   3     2 2.60
##                     kurtosis   se
## X*                     -1.27 2.08
## X.1*                   -1.05 0.30
## X.2*                   -1.28 1.92
## X.3*                   -1.27 2.08
## X.4*                   -1.15 0.95
## X.5*                    0.16 0.36
## X.6*                   -1.39 1.34
## X.7*                   -1.61 0.64
## TIEMPO.DE.MAQUINAS*    -1.04 1.19
## X.8*                   -0.70 1.01
## X.9*                   -0.62 1.11
## X.10*                  -1.20 1.48
## X.11*                  -1.20 1.48
## X.12*                   2.58 0.13
## X.13*                   6.36 0.06
dim(pcarton)
## [1] 51 15

2) Clasifica cada variable en cualitativa, cuantitativa discreta o cuantitativa continua

3) Elige la escala de medición de cada variable.

Variable Type
Cliente Cualitativa (nominal)
ID Form Cualitativa (nominal)
Producto Cualitativa (nominal)
Piezas programadas Cuantitativa (discreta)
Tiempo minutos Cuantitativa (discreta)
Hora fin Cuantitativa (continua)
Estacion arranque Cualitativa (nominal)
Laminas procesadas Cuantitativa
Inicio set up Cuantitativa (continua)
Fin inicio set up Cuantitativa (continua)
Inicio de proceso Cuantitativa (continua)
Fin de proceso Cuantitativa (continua)
Tiempo calidad Cuantitativa (discreta)

4) Aplica al menos 2 técnicas de limpieza de bases de datos y explícalas brevemente, ¿por qué realizaste esas técnicas?

Elimina columnas

Eliminar columna No. de cliente

pcarton <- select(pcarton, -X)

Eliminar columna tipo de meteriales

pcarton <- select(pcarton, -X.13)

Pasae fila a nombres de columna

pcarton2 <- pcarton
colnames(pcarton2) <- pcarton[1,]
colnames(pcarton2)
##  [1] "CLIENTE"              "ID FORM"              "PRODUCTO"            
##  [4] "PIEZAS PROG."         "TMO: MIN."            "HR. FIN"             
##  [7] "ESTACION ARRANQUE"    "Laminas procesadas "  "INICIO SEP UP"       
## [10] "FIN INICIO DE SEP UP" "INICIO de PROCESO"    "FIN de PROCESO"      
## [13] "TIEMPO CALIDAD"

Eliminar primer fila

pcarton2 <- pcarton2[-1,]

Análisis estadístico descriptivo

Realizar un análisis estadístico descriptivo en el que logres destacar el conjunto de datos, que apoyan a la empresa a mejorar su operación. Incorpora al menos dos propuestas concretas, apoyadas de tu análisis en donde se incluye al menos: (1) Tabla de frecuencia, (opcional) Tablas cruzadas, (2-3) Gráficos de datos cualitativos y cuantitativos, así como (2-3) Gráficos de dispersión.

Tabla de frecuencia

scrap

ubicacion <- scrap %>% group_by(Ubicación.de.origen) %>% tally()
ubicacion
## # A tibble: 3 × 2
##   Ubicación.de.origen           n
##   <chr>                     <int>
## 1 SAB/Calidad/Entrega de PT    58
## 2 SAB/Post-Production          13
## 3 SAB/Pre-Production          179

merma

mes <- merma %>% group_by(Mes) %>% tally()
mes
## # A tibble: 9 × 2
##   Mes            n
##   <chr>      <int>
## 1 ABRIL          5
## 2 AGOSTO        11
## 3 ENERO          4
## 4 FEBRERO        6
## 5 JULIO          5
## 6 JUNIO          4
## 7 MARZO          6
## 8 MAYO           5
## 9 SEPTIEMBRE     4

Tabla cruzada

#mesykilos <- merma_total %>% tabyl(Mes~Kilos, data = merma_total,sum)

Graficos de dispercion

merma

ggplot(merma_total , aes(x=Mes, y=Kilos)) + 
    geom_point()

scrap

ggplot(scrap , aes(x=Cantidad, y=Ubicación.de.origen)) + 
    geom_point()

ggplot(scrap, aes(x=Cantidad, y=Ubicación.de.origen)) + 
    geom_point() 

produccion de carton

ggplot(pcarton2, aes(x=`PIEZAS PROG.`, y=CLIENTE)) + 
    geom_point() 

Reflexión de la actividad.

LS0tCnRpdGxlOiAiRW50cmVnYWJsZSBSNSIKYXV0aG9yOiAiQW5hIFBhdHJpY2lhIEFwb250ZSAtIEEwMTI4MzkyOCIKZGF0ZTogImByIFN5cy5EYXRlKClgIgpvdXRwdXQ6IAogIGh0bWxfZG9jdW1lbnQ6CiAgICB0b2M6IHRydWUKICAgIHRvY19mbG9hdDogdHJ1ZQogICAgY29kZV9kb3dubG9hZDogdHJ1ZQotLS0KCjxpbWcgc3JjPSAiL1VzZXJzL2FuaXRhMy9EZXNrdG9wL2NiIGltZyByLnBuZyI+CgojIyBMaWJyZXJpYXMgIAoKYGBge3IgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0KbGlicmFyeShkcGx5cikKbGlicmFyeShwbHlyKQpsaWJyYXJ5KGdncGxvdDIpCiMgaW5zdGFsbC5wYWNrYWdlcygibmFuaWFyIikKbGlicmFyeShuYW5pYXIpCiMgaW5zdGFsbC5wYWNrYWdlcygiSG1pc2MiKQpsaWJyYXJ5KEhtaXNjKSAgCiMgaW5zdGFsbC5wYWNrYWdlcygicHN5Y2giKQpsaWJyYXJ5KHBzeWNoKQpsaWJyYXJ5KHRpZHl2ZXJzZSkKIyBpbnN0YWxsLnBhY2thZ2VzKCJqYW5pdG9yIikKbGlicmFyeShqYW5pdG9yKQojIGluc3RhbGwucGFja2FnZXMoImtuaXRyIikKbGlicmFyeShrbml0cikKIyBpbnN0YWxsLnBhY2thZ2VzKCJwb2xsc3RlciIpCmxpYnJhcnkocG9sbHN0ZXIpCmBgYAoKIyMgSW1wb3J0YXIgQmFzZXMgZGUgZGF0b3MKCmBgYHtyfQptZXJtYSA8LSByZWFkLmNzdigiL1VzZXJzL2FuaXRhMy9Eb3dubG9hZHMvRk9STSAtIE1lcm1hLmNzdiIpCnNjcmFwIDwtIHJlYWQuY3N2KCIvVXNlcnMvYW5pdGEzL0Rvd25sb2Fkcy9GT1JNIC0gU2NyYXAuY3N2IikKcGNhcnRvbiA8LSByZWFkLmNzdigiL1VzZXJzL2FuaXRhMy9Eb3dubG9hZHMvRk9STSAtIFByb2R1Y2Npb24gQ2FydG9uIE1lcy5jc3YiKQpgYGAKCiMjIDxzcGFuIHN0eWxlPSJjb2xvcjogIzNBNUZDRCI+ICoqTWVybWEqKiA8L3NwYW4+CgojIyMgMSkgwr9DdcOhbnRhcyB2YXJpYWJsZXMgeSBjdWFudG9zIHJlZ2lzdHJvcyB0aWVuZSBsYSBiYXNlIGRlIGRhdG9zPwpgYGB7cn0KZGVzY3JpYmUobWVybWEpCmRpbShtZXJtYSkKYGBgCgojIyMgMikgQ2xhc2lmaWNhIGNhZGEgdmFyaWFibGUgZW4gY3VhbGl0YXRpdmEsIGN1YW50aXRhdGl2YSBkaXNjcmV0YSBvIGN1YW50aXRhdGl2YSBjb250aW51YQojIyMgMykgRWxpZ2UgbGEgZXNjYWxhIGRlIG1lZGljacOzbiBkZSBjYWRhIHZhcmlhYmxlLgoKYGBge3IgZWNobyA9IEZBTFNFLCByZXN1bHRzID0gVFJVRX0KVmFyaWFibGU8LWMoImBGZWNoYWAiLCJNZXMiLCAiYEtpbG9zYCIpClR5cGU8LWMoIkN1YWxpdGF0aXZhIiwgIkN1YWxpdGF0aXZhIiwgIkN1YW50aXRhdGl2YSAoZGlzY3JldGEpIikKdGFibGU8LWRhdGEuZnJhbWUoVmFyaWFibGUsVHlwZSkKa25pdHI6OmthYmxlKHRhYmxlKQpgYGAKCiMjIyA0KSBBcGxpY2EgYWwgbWVub3MgMiB0w6ljbmljYXMgZGUgbGltcGllemEgZGUgYmFzZXMgZGUgZGF0b3MgeSBleHBsw61jYWxhcyBicmV2ZW1lbnRlLCDCv3BvciBxdcOpIHJlYWxpemFzdGUgZXNhcyB0w6ljbmljYXM/CgoqKkVsaW1pbmFyIHJlbmdsb25lcyBkZSBUb3RhbCBwb3IgbWVzKioKYGBge3J9Cm1lcm1hIDwtIG1lcm1hWy0gZ3JlcCgiVG90YWwiLCBtZXJtYSRNZXMpLF0KYGBgCgoqKkVsaW1pbmFyIGNvbHVtbmEgdmFjaWEqKgpgYGB7cn0KbWVybWEgPC0gc2VsZWN0KG1lcm1hLCAtWCkKYGBgCgoqKkNhbWJpYXIgdGlwbyBkZSBkYXRvcyoqCkNhbWJpYXIgdmFyaWFibGUga2lsb3MgYSBudW1lcmljbwpgYGB7cn0KbWVybWEkS2lsb3MgPC0gYXMubnVtZXJpYyhtZXJtYSRLaWxvcykKYGBgCgpDYW1iaWFyIHZhcmlhYmxlIGNhcmFjdGVyIGEgZmVjaGEKYGBge3J9Cm1lcm1hJEZlY2hhIDwtIGFzLkRhdGUobWVybWEkRmVjaGEsIGZvcm1hdCA9ICIlZC8lbS8lWSIpCmBgYAoKKipBZ3JlZ2FyIGNvbHVtbmEgZGUgVG90YWwgcG9yIG1lcyoqCmBgYHtyfQptZXJtYV90b3RhbCA8LSBhZ2dyZWdhdGUoS2lsb3MgfiBNZXMsIGRhdGEgPSBtZXJtYSwgc3VtKQpgYGAKCiMjIDxzcGFuIHN0eWxlPSJjb2xvcjogIzNBNUZDRCI+ICoqU2NyYXAqKiA8L3NwYW4+CgojIyMgMSkgwr9DdcOhbnRhcyB2YXJpYWJsZXMgeSBjdWFudG9zIHJlZ2lzdHJvcyB0aWVuZSBsYSBiYXNlIGRlIGRhdG9zPwpgYGB7cn0KZGVzY3JpYmUoc2NyYXApCmRpbShzY3JhcCkKYGBgCgojIyMgMikgQ2xhc2lmaWNhIGNhZGEgdmFyaWFibGUgZW4gY3VhbGl0YXRpdmEsIGN1YW50aXRhdGl2YSBkaXNjcmV0YSBvIGN1YW50aXRhdGl2YSBjb250aW51YQojIyMgMykgRWxpZ2UgbGEgZXNjYWxhIGRlIG1lZGljacOzbiBkZSBjYWRhIHZhcmlhYmxlLgoKYGBge3IgZWNobyA9IEZBTFNFLCByZXN1bHRzID0gVFJVRX0KVmFyaWFibGU8LWMoImBSZWZlcmVuY2lhYCIsImBGZWNoYWAiLCAiYEhvcmFgIiwiYFByb2R1Y3RvYCIsICJgQ2FudGlkYWRgIiwgImBVbmlkYWQgZGUgbWVkaWRhZGAiLCAiYFViaWNhY2nDs24gZGUgb3JpZ2VuYCIsICJgVWJpY2FjdcOzbiBkZSBkZXNlY2hvYCIsICJgRXN0YWRvYCIpClR5cGU8LWMoIkN1YWxpdGF0aXZhIiwgIkN1YWxpdGF0aXZhIiwgIkN1YW50aXRhdGl2YSAoY29udGludWEpIiwgIkN1YWxpdGF0aXZhIiwiQ3VhbnRpdGF0aXZhIChkaXNjcmV0YSkiLCAiQ3VhbGl0YXRpdmEiLCAiQ3VhbGl0YXRpdmEiLCAiQ3VhbGl0YXRpdmEiLCAiQ3VhbGl0YXRpdmEiICApCnRhYmxlPC1kYXRhLmZyYW1lKFZhcmlhYmxlLFR5cGUpCmtuaXRyOjprYWJsZSh0YWJsZSkKYGBgCgojIyMgNCkgQXBsaWNhIGFsIG1lbm9zIDIgdMOpY25pY2FzIGRlIGxpbXBpZXphIGRlIGJhc2VzIGRlIGRhdG9zIHkgZXhwbMOtY2FsYXMgYnJldmVtZW50ZSwgwr9wb3IgcXXDqSByZWFsaXphc3RlIGVzYXMgdMOpY25pY2FzPwoKKipFbGltaW5hciByZW5nbG9uIGRlIG1lcyB5IHRvdGFsKioKYGBge3J9CnNjcmFwIDwtIHNjcmFwWy0gZ3JlcCgiYWdvc3RvIiwgc2NyYXAkUmVmZXJlbmNpYSksXQpgYGAKCioqRWxpbWluYXIgY29sdW1uYXMqKgpgYGB7cn0Kc2NyYXAgPC0gc2VsZWN0KHNjcmFwLCAtVW5pZGFkLmRlLm1lZGlkYSkKc2NyYXAgPC0gc2VsZWN0KHNjcmFwLCAtRXN0YWRvKQpgYGAKCioqQ2FtYmlhciB0aXBvIGRlIGRhdG8qKgpDYW1iaWFyIHZhcmlhYmxlIGNhcmFjdGVyIGEgZmVjaGEKYGBge3J9Cm1lcm1hJEZlY2hhIDwtIGFzLkRhdGUobWVybWEkRmVjaGEsIGZvcm1hdCA9ICIlZC8lbS8lWSIpCmBgYAoKIyMgPHNwYW4gc3R5bGU9ImNvbG9yOiAjM0E1RkNEIj4gKipQcm9kdWNjaW9uIGRlIENhcnRvbioqIDwvc3Bhbj4KCiMjIyAxKSDCv0N1w6FudGFzIHZhcmlhYmxlcyB5IGN1YW50b3MgcmVnaXN0cm9zIHRpZW5lIGxhIGJhc2UgZGUgZGF0b3M/CmBgYHtyfQpkZXNjcmliZShwY2FydG9uKQpkaW0ocGNhcnRvbikKYGBgCgojIyMgMikgQ2xhc2lmaWNhIGNhZGEgdmFyaWFibGUgZW4gY3VhbGl0YXRpdmEsIGN1YW50aXRhdGl2YSBkaXNjcmV0YSBvIGN1YW50aXRhdGl2YSBjb250aW51YQojIyMgMykgRWxpZ2UgbGEgZXNjYWxhIGRlIG1lZGljacOzbiBkZSBjYWRhIHZhcmlhYmxlLgoKYGBge3IgZWNobyA9IEZBTFNFLCByZXN1bHRzID0gVFJVRX0KVmFyaWFibGU8LWMoImBDbGllbnRlYCIsImBJRCBGb3JtYCIsICJgUHJvZHVjdG9gIiwiYFBpZXphcyBwcm9ncmFtYWRhc2AiLCAiYFRpZW1wbyBtaW51dG9zYCIsICJgSG9yYSBmaW5gIiwgImBFc3RhY2lvbiBhcnJhbnF1ZWAiLCAiYExhbWluYXMgcHJvY2VzYWRhc2AiLCAiYEluaWNpbyBzZXQgdXBgIiwgImBGaW4gaW5pY2lvIHNldCB1cGAiLCAiYEluaWNpbyBkZSBwcm9jZXNvYCIsICJgRmluIGRlIHByb2Nlc29gIiwgImBUaWVtcG8gY2FsaWRhZGAiKQpUeXBlPC1jKCJDdWFsaXRhdGl2YSAobm9taW5hbCkiLCJDdWFsaXRhdGl2YSAobm9taW5hbCkiLCAiQ3VhbGl0YXRpdmEgKG5vbWluYWwpIiwiQ3VhbnRpdGF0aXZhIChkaXNjcmV0YSkiLCAiQ3VhbnRpdGF0aXZhIChkaXNjcmV0YSkiLCAiQ3VhbnRpdGF0aXZhIChjb250aW51YSkiLCAiQ3VhbGl0YXRpdmEgKG5vbWluYWwpIiwgIkN1YW50aXRhdGl2YSIsICJDdWFudGl0YXRpdmEgKGNvbnRpbnVhKSIsICJDdWFudGl0YXRpdmEgKGNvbnRpbnVhKSIsICJDdWFudGl0YXRpdmEgKGNvbnRpbnVhKSIsICJDdWFudGl0YXRpdmEgKGNvbnRpbnVhKSIsICJDdWFudGl0YXRpdmEgKGRpc2NyZXRhKSIgKQoKdGFibGU8LWRhdGEuZnJhbWUoVmFyaWFibGUsVHlwZSkKa25pdHI6OmthYmxlKHRhYmxlKQpgYGAKCiMjIyA0KSBBcGxpY2EgYWwgbWVub3MgMiB0w6ljbmljYXMgZGUgbGltcGllemEgZGUgYmFzZXMgZGUgZGF0b3MgeSBleHBsw61jYWxhcyBicmV2ZW1lbnRlLCDCv3BvciBxdcOpIHJlYWxpemFzdGUgZXNhcyB0w6ljbmljYXM/CgoqKkVsaW1pbmEgY29sdW1uYXMqKgoKRWxpbWluYXIgY29sdW1uYSBOby4gZGUgY2xpZW50ZQpgYGB7cn0KcGNhcnRvbiA8LSBzZWxlY3QocGNhcnRvbiwgLVgpCmBgYAoKRWxpbWluYXIgY29sdW1uYSB0aXBvIGRlIG1ldGVyaWFsZXMKYGBge3J9CnBjYXJ0b24gPC0gc2VsZWN0KHBjYXJ0b24sIC1YLjEzKQpgYGAKCioqUGFzYWUgZmlsYSBhIG5vbWJyZXMgZGUgY29sdW1uYSoqCmBgYHtyfQpwY2FydG9uMiA8LSBwY2FydG9uCmNvbG5hbWVzKHBjYXJ0b24yKSA8LSBwY2FydG9uWzEsXQpjb2xuYW1lcyhwY2FydG9uMikKYGBgCgoqKkVsaW1pbmFyIHByaW1lciBmaWxhKioKYGBge3J9CnBjYXJ0b24yIDwtIHBjYXJ0b24yWy0xLF0KYGBgCgoKIyMgQW7DoWxpc2lzIGVzdGFkw61zdGljbyBkZXNjcmlwdGl2bwpSZWFsaXphciB1biBhbsOhbGlzaXMgZXN0YWTDrXN0aWNvIGRlc2NyaXB0aXZvIGVuIGVsIHF1ZSBsb2dyZXMgZGVzdGFjYXIgZWwgY29uanVudG8gZGUgZGF0b3MsIHF1ZSBhcG95YW4gYSBsYSBlbXByZXNhIGEgbWVqb3JhciBzdSBvcGVyYWNpw7NuLiAKKkluY29ycG9yYSBhbCBtZW5vcyBkb3MgcHJvcHVlc3RhcyBjb25jcmV0YXMsIGFwb3lhZGFzIGRlIHR1IGFuw6FsaXNpcyBlbiBkb25kZSBzZSBpbmNsdXllIGFsIG1lbm9zOiAoMSkgVGFibGEgZGUgZnJlY3VlbmNpYSwgKG9wY2lvbmFsKSBUYWJsYXMgY3J1emFkYXMsICgyLTMpIEdyw6FmaWNvcyBkZSBkYXRvcyBjdWFsaXRhdGl2b3MgeSBjdWFudGl0YXRpdm9zLCBhc8OtIGNvbW8gKDItMykgR3LDoWZpY29zIGRlIGRpc3BlcnNpw7NuLioKCiMjIyBUYWJsYSBkZSBmcmVjdWVuY2lhCgoqKnNjcmFwKioKYGBge3J9CnViaWNhY2lvbiA8LSBzY3JhcCAlPiUgZ3JvdXBfYnkoVWJpY2FjacOzbi5kZS5vcmlnZW4pICU+JSB0YWxseSgpCnViaWNhY2lvbgpgYGAKCioqbWVybWEqKgpgYGB7cn0KbWVzIDwtIG1lcm1hICU+JSBncm91cF9ieShNZXMpICU+JSB0YWxseSgpCm1lcwpgYGAKCiMjIyBUYWJsYSBjcnV6YWRhCgpgYGB7cn0KI21lc3lraWxvcyA8LSBtZXJtYV90b3RhbCAlPiUgdGFieWwoTWVzfktpbG9zLCBkYXRhID0gbWVybWFfdG90YWwsc3VtKQpgYGAKCiMjIyBHcmFmaWNvcyBkZSBkaXNwZXJjaW9uCgoqKm1lcm1hKioKYGBge3J9CmdncGxvdChtZXJtYV90b3RhbCAsIGFlcyh4PU1lcywgeT1LaWxvcykpICsgCiAgICBnZW9tX3BvaW50KCkKYGBgCgoqKnNjcmFwKioKYGBge3J9CmdncGxvdChzY3JhcCAsIGFlcyh4PUNhbnRpZGFkLCB5PVViaWNhY2nDs24uZGUub3JpZ2VuKSkgKyAKICAgIGdlb21fcG9pbnQoKQpgYGAKCmBgYHtyfQpnZ3Bsb3Qoc2NyYXAsIGFlcyh4PUNhbnRpZGFkLCB5PVViaWNhY2nDs24uZGUub3JpZ2VuKSkgKyAKICAgIGdlb21fcG9pbnQoKSAKYGBgCgoKKipwcm9kdWNjaW9uIGRlIGNhcnRvbioqCmBgYHtyfQpnZ3Bsb3QocGNhcnRvbjIsIGFlcyh4PWBQSUVaQVMgUFJPRy5gLCB5PUNMSUVOVEUpKSArIAogICAgZ2VvbV9wb2ludCgpIApgYGAKCgojIyBSZWZsZXhpw7NuIGRlIGxhIGFjdGl2aWRhZC4K