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.
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.
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.
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
La tabla de frecuencia muestra el numero de veces que se
repite una variable
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
Graficas de datos cualitativos y cuentitativos
merma
ggplot(merma_total, aes(x=Mes, y=Kilos, fill=Kilos)) +
geom_bar(stat="identity" )+
labs(title = "Kilos por Mes",
x = "Mes", y = "Kilos")

En esta grafica podemos observar los kilos de merma producido por
mes. El mes que genera mayor cantidad de merma es el mes de
agosto con 30,000 kilos de merma,
mientras que el mes de septiembre es el que menos
genera merma con 15,000 kilos de merma.
srap
ggplot(scrap, aes(x=Ubicación.de.origen, y=Cantidad)) +
geom_bar(stat="identity", fill="skyblue") + scale_fill_grey() +
labs(title = "Cantidad por Ubicacion",
x = "Cantidad", y = "Ubicación")

En esta grafica podemos observar la cantidad de productos y/o
materiales que se requieren para cada estacion de trabajo. La estacion
que requiere mayor uso de materiales es la
Pre-produccion.
Graficos de dispercion
merma
ggplot(merma_total , aes(x=Mes, y=Kilos)) +
geom_point()+
labs(title = "Kilos por Mes",
x = "Mes", y = "Kilos")
Observaciones:
- Agosto y Mayo son los meses que mas producen
merma.
- Enero y Septiembre son los meses que producen menos
merma.
Al visualizar estos datos podriamos inferir que en los meses donde
hay mayor numero de merma son los meses con mayor produccion. Mientras
que en los meses con menos numero de merma son los meses con menos
produccion.
scrap
ggplot(scrap , aes(x=Cantidad, y=Ubicación.de.origen)) +
geom_boxplot()+
labs(title = "Cantidad por Estación",
x = "Cantidad", y = "Ubicación")

En la grafica de dispercion de scrap podemos observar con mayor
claridad la cantidad de productos y/o materiales que se necesitan para
cada area de trabajo.
En su mayoria las tres areas de trabajo utilizan entre 0 y 25 productos
y/o materiables, sin embargo, en ocaciones Pre-produccion ocupa mayor
cantidad de productos y/o materiables.
produccion de carton
ggplot(pcarton2, aes(x=`PIEZAS PROG.`, y=CLIENTE)) +
geom_point() +
labs(title = "Piezas programadas por cliente",
x = "Piezas Programadas", y = "Cliente")

En la grafica de dispercion de produccion de carton podemos observar
cuales son los clientes que piden mayor demanda de piezas, los cuales
son:
- Meridian Lightweight
- Stabilus 1
- Stabilus 3
- Varroc
- Yanfeng
Reflexión de la actividad.
Realizando la preparación y análisis de datos se pudieron encontrar
varios datos interesantes como:
- Agosto y Mayo son los meses que la empresa produce mayor número de
merma, por lo que se puede inferir que estos son los meses con mayor
producción.
- Enero y septiembre son los meses que la empresa produce menor número
de merma, por lo que se puede inferir que estos son los meses con menor
producción.
- Pre-producción es el área de trabajo que requiere mayor cantidad de
productos y materiales
- Los clientes con mayor demanda son: Meridian Lightweight, Stabilus
1, Stabilus 3, Yanfeng y Varroc
Adicional a lo anterior, es importante mencionar que realizar la
limpieza de datos es importante para generar un análisis correcto de la
base de datos.
LS0tCnRpdGxlOiAiRU5UUkVHQUJMRSBSNSIKYXV0aG9yOiAiQW5hIFBhdHJpY2lhIEFwb250ZSAtIEEwMTI4MzkyOCIKZGF0ZTogImByIFN5cy5EYXRlKClgIgpvdXRwdXQ6IAogIGh0bWxfZG9jdW1lbnQ6CiAgICB0b2M6IHRydWUKICAgIHRvY19mbG9hdDogdHJ1ZQogICAgY29kZV9kb3dubG9hZDogdHJ1ZQotLS0KCjxpbWcgc3JjPSAiL1VzZXJzL2FuaXRhMy9EZXNrdG9wL2NiIGltZyByLnBuZyI+CgojIyBMaWJyZXJpYXMgIAoKYGBge3IgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0KbGlicmFyeShkcGx5cikKbGlicmFyeShwbHlyKQpsaWJyYXJ5KGdncGxvdDIpCiMgaW5zdGFsbC5wYWNrYWdlcygibmFuaWFyIikKbGlicmFyeShuYW5pYXIpCiMgaW5zdGFsbC5wYWNrYWdlcygiSG1pc2MiKQpsaWJyYXJ5KEhtaXNjKSAgCiMgaW5zdGFsbC5wYWNrYWdlcygicHN5Y2giKQpsaWJyYXJ5KHBzeWNoKQpsaWJyYXJ5KHRpZHl2ZXJzZSkKIyBpbnN0YWxsLnBhY2thZ2VzKCJqYW5pdG9yIikKbGlicmFyeShqYW5pdG9yKQojIGluc3RhbGwucGFja2FnZXMoImtuaXRyIikKbGlicmFyeShrbml0cikKIyBpbnN0YWxsLnBhY2thZ2VzKCJwb2xsc3RlciIpCmxpYnJhcnkocG9sbHN0ZXIpCmBgYAoKIyMgSW1wb3J0YXIgQmFzZXMgZGUgZGF0b3MKCmBgYHtyfQptZXJtYSA8LSByZWFkLmNzdigiL1VzZXJzL2FuaXRhMy9Eb3dubG9hZHMvRk9STSAtIE1lcm1hLmNzdiIpCnNjcmFwIDwtIHJlYWQuY3N2KCIvVXNlcnMvYW5pdGEzL0Rvd25sb2Fkcy9GT1JNIC0gU2NyYXAuY3N2IikKcGNhcnRvbiA8LSByZWFkLmNzdigiL1VzZXJzL2FuaXRhMy9Eb3dubG9hZHMvRk9STSAtIFByb2R1Y2Npb24gQ2FydG9uIE1lcy5jc3YiKQpgYGAKCiMjIDxzcGFuIHN0eWxlPSJjb2xvcjogIzNBNUZDRCI+ICoqTWVybWEqKiA8L3NwYW4+CgojIyMgMSkgwr9DdcOhbnRhcyB2YXJpYWJsZXMgeSBjdWFudG9zIHJlZ2lzdHJvcyB0aWVuZSBsYSBiYXNlIGRlIGRhdG9zPwpgYGB7cn0KZGVzY3JpYmUobWVybWEpCmRpbShtZXJtYSkKYGBgCgojIyMgMikgQ2xhc2lmaWNhIGNhZGEgdmFyaWFibGUgZW4gY3VhbGl0YXRpdmEsIGN1YW50aXRhdGl2YSBkaXNjcmV0YSBvIGN1YW50aXRhdGl2YSBjb250aW51YQojIyMgMykgRWxpZ2UgbGEgZXNjYWxhIGRlIG1lZGljacOzbiBkZSBjYWRhIHZhcmlhYmxlLgoKYGBge3IgZWNobyA9IEZBTFNFLCByZXN1bHRzID0gVFJVRX0KVmFyaWFibGU8LWMoImBGZWNoYWAiLCJNZXMiLCAiYEtpbG9zYCIpClR5cGU8LWMoIkN1YWxpdGF0aXZhIiwgIkN1YWxpdGF0aXZhIiwgIkN1YW50aXRhdGl2YSAoZGlzY3JldGEpIikKdGFibGU8LWRhdGEuZnJhbWUoVmFyaWFibGUsVHlwZSkKa25pdHI6OmthYmxlKHRhYmxlKQpgYGAKCiMjIyA0KSBBcGxpY2EgYWwgbWVub3MgMiB0w6ljbmljYXMgZGUgbGltcGllemEgZGUgYmFzZXMgZGUgZGF0b3MgeSBleHBsw61jYWxhcyBicmV2ZW1lbnRlLCDCv3BvciBxdcOpIHJlYWxpemFzdGUgZXNhcyB0w6ljbmljYXM/CgoqKkVsaW1pbmFyIHJlbmdsb25lcyBkZSBUb3RhbCBwb3IgbWVzKioKYGBge3J9Cm1lcm1hIDwtIG1lcm1hWy0gZ3JlcCgiVG90YWwiLCBtZXJtYSRNZXMpLF0KYGBgCgoqKkVsaW1pbmFyIGNvbHVtbmEgdmFjaWEqKgpgYGB7cn0KbWVybWEgPC0gc2VsZWN0KG1lcm1hLCAtWCkKYGBgCgoqKkNhbWJpYXIgdGlwbyBkZSBkYXRvcyoqICAKQ2FtYmlhciB2YXJpYWJsZSBraWxvcyBhIG51bWVyaWNvCmBgYHtyfQptZXJtYSRLaWxvcyA8LSBhcy5udW1lcmljKG1lcm1hJEtpbG9zKQpgYGAKCkNhbWJpYXIgdmFyaWFibGUgY2FyYWN0ZXIgYSBmZWNoYQpgYGB7cn0KbWVybWEkRmVjaGEgPC0gYXMuRGF0ZShtZXJtYSRGZWNoYSwgZm9ybWF0ID0gIiVkLyVtLyVZIikKYGBgCgoqKkFncmVnYXIgY29sdW1uYSBkZSBUb3RhbCBwb3IgbWVzKioKYGBge3J9Cm1lcm1hX3RvdGFsIDwtIGFnZ3JlZ2F0ZShLaWxvcyB+IE1lcywgZGF0YSA9IG1lcm1hLCBzdW0pCmBgYAoKIyMgPHNwYW4gc3R5bGU9ImNvbG9yOiAjM0E1RkNEIj4gKipTY3JhcCoqIDwvc3Bhbj4KCiMjIyAxKSDCv0N1w6FudGFzIHZhcmlhYmxlcyB5IGN1YW50b3MgcmVnaXN0cm9zIHRpZW5lIGxhIGJhc2UgZGUgZGF0b3M/CmBgYHtyfQpkZXNjcmliZShzY3JhcCkKZGltKHNjcmFwKQpgYGAKCiMjIyAyKSBDbGFzaWZpY2EgY2FkYSB2YXJpYWJsZSBlbiBjdWFsaXRhdGl2YSwgY3VhbnRpdGF0aXZhIGRpc2NyZXRhIG8gY3VhbnRpdGF0aXZhIGNvbnRpbnVhCiMjIyAzKSBFbGlnZSBsYSBlc2NhbGEgZGUgbWVkaWNpw7NuIGRlIGNhZGEgdmFyaWFibGUuCgpgYGB7ciBlY2hvID0gRkFMU0UsIHJlc3VsdHMgPSBUUlVFfQpWYXJpYWJsZTwtYygiYFJlZmVyZW5jaWFgIiwiYEZlY2hhYCIsICJgSG9yYWAiLCJgUHJvZHVjdG9gIiwgImBDYW50aWRhZGAiLCAiYFVuaWRhZCBkZSBtZWRpZGFkYCIsICJgVWJpY2FjacOzbiBkZSBvcmlnZW5gIiwgImBVYmljYWN1w7NuIGRlIGRlc2VjaG9gIiwgImBFc3RhZG9gIikKVHlwZTwtYygiQ3VhbGl0YXRpdmEiLCAiQ3VhbGl0YXRpdmEiLCAiQ3VhbnRpdGF0aXZhIChjb250aW51YSkiLCAiQ3VhbGl0YXRpdmEiLCJDdWFudGl0YXRpdmEgKGRpc2NyZXRhKSIsICJDdWFsaXRhdGl2YSIsICJDdWFsaXRhdGl2YSIsICJDdWFsaXRhdGl2YSIsICJDdWFsaXRhdGl2YSIgICkKdGFibGU8LWRhdGEuZnJhbWUoVmFyaWFibGUsVHlwZSkKa25pdHI6OmthYmxlKHRhYmxlKQpgYGAKCiMjIyA0KSBBcGxpY2EgYWwgbWVub3MgMiB0w6ljbmljYXMgZGUgbGltcGllemEgZGUgYmFzZXMgZGUgZGF0b3MgeSBleHBsw61jYWxhcyBicmV2ZW1lbnRlLCDCv3BvciBxdcOpIHJlYWxpemFzdGUgZXNhcyB0w6ljbmljYXM/CgoqKkVsaW1pbmFyIHJlbmdsb24gZGUgbWVzIHkgdG90YWwqKgpgYGB7cn0Kc2NyYXAgPC0gc2NyYXBbLSBncmVwKCJhZ29zdG8iLCBzY3JhcCRSZWZlcmVuY2lhKSxdCmBgYAoKKipFbGltaW5hciBjb2x1bW5hcyoqCmBgYHtyfQpzY3JhcCA8LSBzZWxlY3Qoc2NyYXAsIC1VbmlkYWQuZGUubWVkaWRhKQpzY3JhcCA8LSBzZWxlY3Qoc2NyYXAsIC1Fc3RhZG8pCmBgYAoKKipDYW1iaWFyIHRpcG8gZGUgZGF0byoqICAKQ2FtYmlhciB2YXJpYWJsZSBjYXJhY3RlciBhIGZlY2hhCmBgYHtyfQptZXJtYSRGZWNoYSA8LSBhcy5EYXRlKG1lcm1hJEZlY2hhLCBmb3JtYXQgPSAiJWQvJW0vJVkiKQpgYGAKCiMjIDxzcGFuIHN0eWxlPSJjb2xvcjogIzNBNUZDRCI+ICoqUHJvZHVjY2lvbiBkZSBDYXJ0b24qKiA8L3NwYW4+CgojIyMgMSkgwr9DdcOhbnRhcyB2YXJpYWJsZXMgeSBjdWFudG9zIHJlZ2lzdHJvcyB0aWVuZSBsYSBiYXNlIGRlIGRhdG9zPwpgYGB7cn0KZGVzY3JpYmUocGNhcnRvbikKZGltKHBjYXJ0b24pCmBgYAoKIyMjIDIpIENsYXNpZmljYSBjYWRhIHZhcmlhYmxlIGVuIGN1YWxpdGF0aXZhLCBjdWFudGl0YXRpdmEgZGlzY3JldGEgbyBjdWFudGl0YXRpdmEgY29udGludWEKIyMjIDMpIEVsaWdlIGxhIGVzY2FsYSBkZSBtZWRpY2nDs24gZGUgY2FkYSB2YXJpYWJsZS4KCmBgYHtyIGVjaG8gPSBGQUxTRSwgcmVzdWx0cyA9IFRSVUV9ClZhcmlhYmxlPC1jKCJgQ2xpZW50ZWAiLCJgSUQgRm9ybWAiLCAiYFByb2R1Y3RvYCIsImBQaWV6YXMgcHJvZ3JhbWFkYXNgIiwgImBUaWVtcG8gbWludXRvc2AiLCAiYEhvcmEgZmluYCIsICJgRXN0YWNpb24gYXJyYW5xdWVgIiwgImBMYW1pbmFzIHByb2Nlc2FkYXNgIiwgImBJbmljaW8gc2V0IHVwYCIsICJgRmluIGluaWNpbyBzZXQgdXBgIiwgImBJbmljaW8gZGUgcHJvY2Vzb2AiLCAiYEZpbiBkZSBwcm9jZXNvYCIsICJgVGllbXBvIGNhbGlkYWRgIikKVHlwZTwtYygiQ3VhbGl0YXRpdmEgKG5vbWluYWwpIiwiQ3VhbGl0YXRpdmEgKG5vbWluYWwpIiwgIkN1YWxpdGF0aXZhIChub21pbmFsKSIsIkN1YW50aXRhdGl2YSAoZGlzY3JldGEpIiwgIkN1YW50aXRhdGl2YSAoZGlzY3JldGEpIiwgIkN1YW50aXRhdGl2YSAoY29udGludWEpIiwgIkN1YWxpdGF0aXZhIChub21pbmFsKSIsICJDdWFudGl0YXRpdmEiLCAiQ3VhbnRpdGF0aXZhIChjb250aW51YSkiLCAiQ3VhbnRpdGF0aXZhIChjb250aW51YSkiLCAiQ3VhbnRpdGF0aXZhIChjb250aW51YSkiLCAiQ3VhbnRpdGF0aXZhIChjb250aW51YSkiLCAiQ3VhbnRpdGF0aXZhIChkaXNjcmV0YSkiICkKCnRhYmxlPC1kYXRhLmZyYW1lKFZhcmlhYmxlLFR5cGUpCmtuaXRyOjprYWJsZSh0YWJsZSkKYGBgCgojIyMgNCkgQXBsaWNhIGFsIG1lbm9zIDIgdMOpY25pY2FzIGRlIGxpbXBpZXphIGRlIGJhc2VzIGRlIGRhdG9zIHkgZXhwbMOtY2FsYXMgYnJldmVtZW50ZSwgwr9wb3IgcXXDqSByZWFsaXphc3RlIGVzYXMgdMOpY25pY2FzPwoKKipFbGltaW5hIGNvbHVtbmFzKiogIAoKRWxpbWluYXIgY29sdW1uYSBOby4gZGUgY2xpZW50ZQpgYGB7cn0KcGNhcnRvbiA8LSBzZWxlY3QocGNhcnRvbiwgLVgpCmBgYAoKRWxpbWluYXIgY29sdW1uYSB0aXBvIGRlIG1ldGVyaWFsZXMKYGBge3J9CnBjYXJ0b24gPC0gc2VsZWN0KHBjYXJ0b24sIC1YLjEzKQpgYGAKCioqUGFzYWUgZmlsYSBhIG5vbWJyZXMgZGUgY29sdW1uYSoqCmBgYHtyfQpwY2FydG9uMiA8LSBwY2FydG9uCmNvbG5hbWVzKHBjYXJ0b24yKSA8LSBwY2FydG9uWzEsXQpjb2xuYW1lcyhwY2FydG9uMikKYGBgCgoqKkVsaW1pbmFyIHByaW1lciBmaWxhKioKYGBge3J9CnBjYXJ0b24yIDwtIHBjYXJ0b24yWy0xLF0KYGBgCgoKIyMgQW7DoWxpc2lzIGVzdGFkw61zdGljbyBkZXNjcmlwdGl2bwpSZWFsaXphciB1biBhbsOhbGlzaXMgZXN0YWTDrXN0aWNvIGRlc2NyaXB0aXZvIGVuIGVsIHF1ZSBsb2dyZXMgZGVzdGFjYXIgZWwgY29uanVudG8gZGUgZGF0b3MsIHF1ZSBhcG95YW4gYSBsYSBlbXByZXNhIGEgbWVqb3JhciBzdSBvcGVyYWNpw7NuLiAKKkluY29ycG9yYSBhbCBtZW5vcyBkb3MgcHJvcHVlc3RhcyBjb25jcmV0YXMsIGFwb3lhZGFzIGRlIHR1IGFuw6FsaXNpcyBlbiBkb25kZSBzZSBpbmNsdXllIGFsIG1lbm9zOiAoMSkgVGFibGEgZGUgZnJlY3VlbmNpYSwgKG9wY2lvbmFsKSBUYWJsYXMgY3J1emFkYXMsICgyLTMpIEdyw6FmaWNvcyBkZSBkYXRvcyBjdWFsaXRhdGl2b3MgeSBjdWFudGl0YXRpdm9zLCBhc8OtIGNvbW8gKDItMykgR3LDoWZpY29zIGRlIGRpc3BlcnNpw7NuLioKCiMjIyBUYWJsYSBkZSBmcmVjdWVuY2lhICAgCkxhICp0YWJsYSBkZSBmcmVjdWVuY2lhKiBtdWVzdHJhIGVsIG51bWVybyBkZSB2ZWNlcyBxdWUgc2UgcmVwaXRlIHVuYSB2YXJpYWJsZQoKKipzY3JhcCoqCmBgYHtyfQp1YmljYWNpb24gPC0gc2NyYXAgJT4lIGdyb3VwX2J5KFViaWNhY2nDs24uZGUub3JpZ2VuKSAlPiUgdGFsbHkoKQp1YmljYWNpb24KYGBgCgoqKm1lcm1hKioKYGBge3J9Cm1lcyA8LSBtZXJtYSAlPiUgZ3JvdXBfYnkoTWVzKSAlPiUgdGFsbHkoKQptZXMKYGBgCgojIyMgR3JhZmljYXMgZGUgZGF0b3MgY3VhbGl0YXRpdm9zIHkgY3VlbnRpdGF0aXZvcyAgCgoqKm1lcm1hKioKYGBge3J9CmdncGxvdChtZXJtYV90b3RhbCwgYWVzKHg9TWVzLCB5PUtpbG9zLCBmaWxsPUtpbG9zKSkgKwogIGdlb21fYmFyKHN0YXQ9ImlkZW50aXR5IiApKyAKICBsYWJzKHRpdGxlID0gIktpbG9zIHBvciBNZXMiLCAKICAgICAgIHggPSAiTWVzIiwgeSA9ICJLaWxvcyIpCmBgYAoKRW4gZXN0YSBncmFmaWNhIHBvZGVtb3Mgb2JzZXJ2YXIgbG9zIGtpbG9zIGRlIG1lcm1hIHByb2R1Y2lkbyBwb3IgbWVzLiBFbCBtZXMgcXVlIGdlbmVyYSBtYXlvciBjYW50aWRhZCBkZSBtZXJtYSBlcyBlbCBtZXMgZGUgKiphZ29zdG8qKiBjb24gKiozMCwwMDAqKiBraWxvcyBkZSBtZXJtYSwgbWllbnRyYXMgcXVlIGVsIG1lcyBkZSAqKnNlcHRpZW1icmUqKiBlcyBlbCBxdWUgbWVub3MgZ2VuZXJhIG1lcm1hIGNvbiAqKjE1LDAwMCoqIGtpbG9zIGRlIG1lcm1hLgoKCioqc3JhcCoqCmBgYHtyfQpnZ3Bsb3Qoc2NyYXAsIGFlcyh4PVViaWNhY2nDs24uZGUub3JpZ2VuLCB5PUNhbnRpZGFkKSkgKwogIGdlb21fYmFyKHN0YXQ9ImlkZW50aXR5IiwgZmlsbD0ic2t5Ymx1ZSIpICsgc2NhbGVfZmlsbF9ncmV5KCkgKyAKICBsYWJzKHRpdGxlID0gIkNhbnRpZGFkIHBvciBVYmljYWNpb24iLCAKICAgICAgIHggPSAiQ2FudGlkYWQiLCB5ID0gIlViaWNhY2nDs24iKQpgYGAKCkVuIGVzdGEgZ3JhZmljYSBwb2RlbW9zIG9ic2VydmFyIGxhIGNhbnRpZGFkIGRlIHByb2R1Y3RvcyB5L28gbWF0ZXJpYWxlcyBxdWUgc2UgcmVxdWllcmVuIHBhcmEgY2FkYSBlc3RhY2lvbiBkZSB0cmFiYWpvLiBMYSBlc3RhY2lvbiBxdWUgcmVxdWllcmUgbWF5b3IgdXNvIGRlIG1hdGVyaWFsZXMgZXMgbGEgKipQcmUtcHJvZHVjY2lvbioqLgoKIyMjIEdyYWZpY29zIGRlIGRpc3BlcmNpb24KCioqbWVybWEqKgpgYGB7cn0KZ2dwbG90KG1lcm1hX3RvdGFsICwgYWVzKHg9TWVzLCB5PUtpbG9zKSkgKyAKICAgIGdlb21fcG9pbnQoKSsgCiAgbGFicyh0aXRsZSA9ICJLaWxvcyBwb3IgTWVzIiwgCiAgICAgICB4ID0gIk1lcyIsIHkgPSAiS2lsb3MiKQpgYGAKKipPYnNlcnZhY2lvbmVzOioqICAKLSAqKkFnb3N0byB5IE1heW8qKiBzb24gbG9zIG1lc2VzIHF1ZSBtYXMgcHJvZHVjZW4gbWVybWEuICAKLSAqKkVuZXJvIHkgU2VwdGllbWJyZSoqIHNvbiBsb3MgbWVzZXMgcXVlIHByb2R1Y2VuIG1lbm9zIG1lcm1hLiAgCgpBbCB2aXN1YWxpemFyIGVzdG9zIGRhdG9zIHBvZHJpYW1vcyBpbmZlcmlyIHF1ZSBlbiBsb3MgbWVzZXMgZG9uZGUgaGF5IG1heW9yIG51bWVybyBkZSBtZXJtYSBzb24gbG9zIG1lc2VzIGNvbiBtYXlvciBwcm9kdWNjaW9uLiBNaWVudHJhcyBxdWUgZW4gbG9zIG1lc2VzIGNvbiBtZW5vcyBudW1lcm8gZGUgbWVybWEgc29uIGxvcyBtZXNlcyBjb24gbWVub3MgcHJvZHVjY2lvbi4KCioqc2NyYXAqKgpgYGB7cn0KZ2dwbG90KHNjcmFwICwgYWVzKHg9Q2FudGlkYWQsIHk9VWJpY2FjacOzbi5kZS5vcmlnZW4pKSArIAogICAgZ2VvbV9ib3hwbG90KCkrIAogIGxhYnModGl0bGUgPSAiQ2FudGlkYWQgcG9yIEVzdGFjacOzbiIsIAogICAgICAgeCA9ICJDYW50aWRhZCIsIHkgPSAiVWJpY2FjacOzbiIpCmBgYAoKRW4gbGEgZ3JhZmljYSBkZSBkaXNwZXJjaW9uIGRlIHNjcmFwIHBvZGVtb3Mgb2JzZXJ2YXIgY29uIG1heW9yIGNsYXJpZGFkIGxhIGNhbnRpZGFkIGRlIHByb2R1Y3RvcyB5L28gbWF0ZXJpYWxlcyBxdWUgc2UgbmVjZXNpdGFuIHBhcmEgY2FkYSBhcmVhIGRlIHRyYWJham8uICAgCkVuIHN1IG1heW9yaWEgbGFzIHRyZXMgYXJlYXMgZGUgdHJhYmFqbyB1dGlsaXphbiBlbnRyZSAwIHkgMjUgcHJvZHVjdG9zIHkvbyBtYXRlcmlhYmxlcywgc2luIGVtYmFyZ28sIGVuIG9jYWNpb25lcyBQcmUtcHJvZHVjY2lvbiBvY3VwYSBtYXlvciBjYW50aWRhZCBkZSBwcm9kdWN0b3MgeS9vIG1hdGVyaWFibGVzLgoKKipwcm9kdWNjaW9uIGRlIGNhcnRvbioqCmBgYHtyfQpnZ3Bsb3QocGNhcnRvbjIsIGFlcyh4PWBQSUVaQVMgUFJPRy5gLCB5PUNMSUVOVEUpKSArIAogICAgZ2VvbV9wb2ludCgpICsgCiAgbGFicyh0aXRsZSA9ICJQaWV6YXMgcHJvZ3JhbWFkYXMgcG9yIGNsaWVudGUiLCAKICAgICAgIHggPSAiUGllemFzIFByb2dyYW1hZGFzIiwgeSA9ICJDbGllbnRlIikKYGBgCgpFbiBsYSBncmFmaWNhIGRlIGRpc3BlcmNpb24gZGUgcHJvZHVjY2lvbiBkZSBjYXJ0b24gcG9kZW1vcyBvYnNlcnZhciBjdWFsZXMgc29uIGxvcyBjbGllbnRlcyBxdWUgcGlkZW4gbWF5b3IgZGVtYW5kYSBkZSBwaWV6YXMsIGxvcyBjdWFsZXMgc29uOiAgCi0gTWVyaWRpYW4gTGlnaHR3ZWlnaHQgIAotIFN0YWJpbHVzIDEgIAotIFN0YWJpbHVzIDMgIAotIFZhcnJvYyAgCi0gWWFuZmVuZyAgCgojIyBSZWZsZXhpw7NuIGRlIGxhIGFjdGl2aWRhZC4KClJlYWxpemFuZG8gbGEgcHJlcGFyYWNpw7NuIHkgYW7DoWxpc2lzIGRlIGRhdG9zIHNlIHB1ZGllcm9uIGVuY29udHJhciB2YXJpb3MgZGF0b3MgaW50ZXJlc2FudGVzIGNvbW86ICAKCi0gQWdvc3RvIHkgTWF5byBzb24gbG9zIG1lc2VzIHF1ZSBsYSBlbXByZXNhIHByb2R1Y2UgbWF5b3IgbsO6bWVybyBkZSBtZXJtYSwgcG9yIGxvIHF1ZSBzZSBwdWVkZSBpbmZlcmlyIHF1ZSBlc3RvcyBzb24gbG9zIG1lc2VzIGNvbiBtYXlvciBwcm9kdWNjacOzbi4KLSBFbmVybyB5IHNlcHRpZW1icmUgc29uIGxvcyBtZXNlcyBxdWUgbGEgZW1wcmVzYSBwcm9kdWNlIG1lbm9yIG7Dum1lcm8gZGUgbWVybWEsIHBvciBsbyBxdWUgc2UgcHVlZGUgaW5mZXJpciBxdWUgZXN0b3Mgc29uIGxvcyBtZXNlcyBjb24gbWVub3IgcHJvZHVjY2nDs24uCi0gUHJlLXByb2R1Y2Npw7NuIGVzIGVsIMOhcmVhIGRlIHRyYWJham8gcXVlIHJlcXVpZXJlIG1heW9yIGNhbnRpZGFkIGRlIHByb2R1Y3RvcyB5IG1hdGVyaWFsZXMgCi0gTG9zIGNsaWVudGVzIGNvbiBtYXlvciBkZW1hbmRhIHNvbjogIE1lcmlkaWFuIExpZ2h0d2VpZ2h0LCBTdGFiaWx1cyAxLCBTdGFiaWx1cyAzLCAgWWFuZmVuZyAgeSBWYXJyb2MKCkFkaWNpb25hbCBhIGxvIGFudGVyaW9yLCBlcyBpbXBvcnRhbnRlIG1lbmNpb25hciBxdWUgcmVhbGl6YXIgbGEgbGltcGllemEgZGUgZGF0b3MgZXMgaW1wb3J0YW50ZSBwYXJhIGdlbmVyYXIgdW4gYW7DoWxpc2lzIGNvcnJlY3RvIGRlIGxhIGJhc2UgZGUgZGF0b3MuCgo=