Contexto

Para Arca Continental, la situación que están viviendo los dueños de las tienditas de la esquina no ha pasado desapercibida. Ellos, quienes por muchos años han sido nuestros principales aliados comerciales, no pueden por sí solos revertir la situación de riesgo en la que se encuentran por lo que, en Arca Continental, acorde a nuestra misión de “Generar el máximo valor para nuestros clientes, colaboradores, comunidades, y accionistas…” hemos decidido apoyar al fortalecimiento del canal tradicional a través del Proyecto Siglo XXI.

#Importar base de datos

#file.choose()
df <- read.csv("/Users/sofiaalcudia/Downloads/arca.csv")

#Entender la base de datos

summary(df)
##        ID              Año        Territorio        Sub.Territorio    
##  Min.   :     1   Min.   :2016   Length:466509      Length:466509     
##  1st Qu.:116628   1st Qu.:2017   Class :character   Class :character  
##  Median :233255   Median :2018   Mode  :character   Mode  :character  
##  Mean   :233255   Mean   :2018                                        
##  3rd Qu.:349882   3rd Qu.:2019                                        
##  Max.   :466509   Max.   :2019                                        
##      CEDI             Cliente             Nombre          Tamaño.Cte.Industria
##  Length:466509      Length:466509      Length:466509      Length:466509       
##  Class :character   Class :character   Class :character   Class :character    
##  Mode  :character   Mode  :character   Mode  :character   Mode  :character    
##                                                                               
##                                                                               
##                                                                               
##  Segmento.Det          Marca           Presentacion          Tamaño         
##  Length:466509      Length:466509      Length:466509      Length:466509     
##  Class :character   Class :character   Class :character   Class :character  
##  Mode  :character   Mode  :character   Mode  :character   Mode  :character  
##                                                                             
##                                                                             
##                                                                             
##  Retornable_NR         Enero             Febrero             Marzo          
##  Length:466509      Length:466509      Length:466509      Length:466509     
##  Class :character   Class :character   Class :character   Class :character  
##  Mode  :character   Mode  :character   Mode  :character   Mode  :character  
##                                                                             
##                                                                             
##                                                                             
##     Abril               Mayo              Junio              Julio          
##  Length:466509      Length:466509      Length:466509      Length:466509     
##  Class :character   Class :character   Class :character   Class :character  
##  Mode  :character   Mode  :character   Mode  :character   Mode  :character  
##                                                                             
##                                                                             
##                                                                             
##     Agosto           Septiembre          Octubre           Noviembre        
##  Length:466509      Length:466509      Length:466509      Length:466509     
##  Class :character   Class :character   Class :character   Class :character  
##  Mode  :character   Mode  :character   Mode  :character   Mode  :character  
##                                                                             
##                                                                             
##                                                                             
##   Diciembre        
##  Length:466509     
##  Class :character  
##  Mode  :character  
##                    
##                    
## 
library(tidyverse)
## ── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
## ✔ dplyr     1.1.3     ✔ readr     2.1.4
## ✔ forcats   1.0.0     ✔ stringr   1.5.0
## ✔ ggplot2   3.4.3     ✔ tibble    3.2.1
## ✔ lubridate 1.9.2     ✔ tidyr     1.3.0
## ✔ purrr     1.0.2     
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## ✖ dplyr::filter() masks stats::filter()
## ✖ dplyr::lag()    masks stats::lag()
## ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
str(df)
## 'data.frame':    466509 obs. of  25 variables:
##  $ ID                  : int  1 2 3 4 5 6 7 8 9 10 ...
##  $ Año                 : int  2016 2016 2016 2016 2016 2016 2016 2016 2016 2016 ...
##  $ Territorio          : chr  "Guadalajara" "Guadalajara" "Guadalajara" "Guadalajara" ...
##  $ Sub.Territorio      : chr  "Belenes" "Belenes" "Belenes" "Belenes" ...
##  $ CEDI                : chr  "Suc. Belenes" "Suc. Belenes" "Suc. Belenes" "Suc. Belenes" ...
##  $ Cliente             : chr  "77737" "77737" "77737" "77737" ...
##  $ Nombre              : chr  "ABARR" "ABARR" "ABARR" "ABARR" ...
##  $ Tamaño.Cte.Industria: chr  "Extra Grande" "Extra Grande" "Extra Grande" "Extra Grande" ...
##  $ Segmento.Det        : chr  "Agua Mineral" "Agua Purificada" "Agua Purificada" "Agua Saborizada" ...
##  $ Marca               : chr  "Topo Chico A.M." "Ciel Agua Purificada" "Ciel Agua Purificada" "Ciel Exprim" ...
##  $ Presentacion        : chr  "600 ml NR" "1 Ltro. N.R." "1.5 Lts. NR" "600 ml NR" ...
##  $ Tamaño              : chr  "Individual" "Individual" "Individual" "Individual" ...
##  $ Retornable_NR       : chr  "No Retornable" "No Retornable" "No Retornable" "No Retornable" ...
##  $ Enero               : chr  "" "" "" "" ...
##  $ Febrero             : chr  "" "2" "" "" ...
##  $ Marzo               : chr  "" "8" "3" "" ...
##  $ Abril               : chr  "" "4" "6" "" ...
##  $ Mayo                : chr  "" "4" "3" "" ...
##  $ Junio               : chr  "" "2" "3" "" ...
##  $ Julio               : chr  "" "2" "3" "" ...
##  $ Agosto              : chr  "" "2" "3" "" ...
##  $ Septiembre          : chr  "" "2" "3" "" ...
##  $ Octubre             : chr  "" "2" "3" "" ...
##  $ Noviembre           : chr  "" "4" "3" "" ...
##  $ Diciembre           : chr  "1" "2" "3" "1" ...
library(dplyr)
count(df,Territorio,sort=TRUE)
##    Territorio      n
## 1 Guadalajara 466508
## 2  Territorio      1

Observaciones: Eliminar renglon 184065 que tiene titulos en lugar de datos

#Limpiar la base de datos

df <- df[-184065,]
df$Enero <- as.integer(df$Enero)
## Warning: NAs introduced by coercion
df$Febrero <- as.integer(df$Febrero)
## Warning: NAs introduced by coercion
df$Marzo <- as.integer(df$Marzo)
## Warning: NAs introduced by coercion
df$Abril <- as.integer(df$Abril)
## Warning: NAs introduced by coercion
df$Mayo <- as.integer(df$Mayo)
## Warning: NAs introduced by coercion
df$Junio <- as.integer(df$Junio)
## Warning: NAs introduced by coercion
df$Julio <- as.integer(df$Julio)
## Warning: NAs introduced by coercion
df$Agosto <- as.integer(df$Agosto)
## Warning: NAs introduced by coercion
df$Septiembre <- as.integer(df$Septiembre)
## Warning: NAs introduced by coercion
df$Octubre <- as.integer(df$Octubre)
## Warning: NAs introduced by coercion
df$Noviembre <- as.integer(df$Noviembre)
## Warning: NAs introduced by coercion
df$Diciembre <- as.integer(df$Diciembre)
## Warning: NAs introduced by coercion
summary(df)
##        ID              Año        Territorio        Sub.Territorio    
##  Min.   :     1   Min.   :2016   Length:466508      Length:466508     
##  1st Qu.:116628   1st Qu.:2017   Class :character   Class :character  
##  Median :233256   Median :2018   Mode  :character   Mode  :character  
##  Mean   :233255   Mean   :2018                                        
##  3rd Qu.:349882   3rd Qu.:2019                                        
##  Max.   :466509   Max.   :2019                                        
##                                                                       
##      CEDI             Cliente             Nombre          Tamaño.Cte.Industria
##  Length:466508      Length:466508      Length:466508      Length:466508       
##  Class :character   Class :character   Class :character   Class :character    
##  Mode  :character   Mode  :character   Mode  :character   Mode  :character    
##                                                                               
##                                                                               
##                                                                               
##                                                                               
##  Segmento.Det          Marca           Presentacion          Tamaño         
##  Length:466508      Length:466508      Length:466508      Length:466508     
##  Class :character   Class :character   Class :character   Class :character  
##  Mode  :character   Mode  :character   Mode  :character   Mode  :character  
##                                                                             
##                                                                             
##                                                                             
##                                                                             
##  Retornable_NR          Enero           Febrero           Marzo       
##  Length:466508      Min.   :-19.00   Min.   :-11.00   Min.   :-32.00  
##  Class :character   1st Qu.:  1.00   1st Qu.:  1.00   1st Qu.:  1.00  
##  Mode  :character   Median :  2.00   Median :  2.00   Median :  3.00  
##                     Mean   :  9.39   Mean   :  9.09   Mean   : 10.54  
##                     3rd Qu.:  6.00   3rd Qu.:  6.00   3rd Qu.:  6.00  
##                     Max.   :999.00   Max.   :986.00   Max.   :986.00  
##                     NA's   :233551   NA's   :231285   NA's   :227506  
##      Abril             Mayo             Junio             Julio       
##  Min.   :-70.00   Min.   :-106.00   Min.   :-211.00   Min.   :-60.00  
##  1st Qu.:  1.00   1st Qu.:   1.00   1st Qu.:   1.00   1st Qu.:  1.00  
##  Median :  3.00   Median :   3.00   Median :   3.00   Median :  2.00  
##  Mean   : 10.62   Mean   :  11.44   Mean   :  10.98   Mean   : 10.72  
##  3rd Qu.:  6.00   3rd Qu.:   7.00   3rd Qu.:   6.00   3rd Qu.:  6.00  
##  Max.   :993.00   Max.   : 991.00   Max.   : 998.00   Max.   :993.00  
##  NA's   :224185   NA's   :217072    NA's   :215907    NA's   :223537  
##      Agosto          Septiembre        Octubre         Noviembre     
##  Min.   :-211.00   Min.   :-527     Min.   :-38.0    Min.   :-25.0   
##  1st Qu.:   1.00   1st Qu.:   1     1st Qu.:  1.0    1st Qu.:  1.0   
##  Median :   3.00   Median :   3     Median :  3.0    Median :  3.0   
##  Mean   :  10.95   Mean   :  12     Mean   : 12.1    Mean   : 11.8   
##  3rd Qu.:   6.00   3rd Qu.:   7     3rd Qu.:  7.0    3rd Qu.:  6.0   
##  Max.   : 999.00   Max.   : 993     Max.   :998.0    Max.   :991.0   
##  NA's   :220366    NA's   :337401   NA's   :338482   NA's   :338545  
##    Diciembre     
##  Min.   :-28     
##  1st Qu.:  1     
##  Median :  3     
##  Mean   : 13     
##  3rd Qu.:  7     
##  Max.   :997     
##  NA's   :341954

Observaciones:

#¿Cuantas N/A's tengo en la base de datos?
sum(is.na(df))
## [1] 3149791
# ¿Cuantos N/A's tengo por variable?
sapply(df,function(x) sum(is.na(x)))
##                   ID                  Año           Territorio 
##                    0                    0                    0 
##       Sub.Territorio                 CEDI              Cliente 
##                    0                    0                    0 
##               Nombre Tamaño.Cte.Industria         Segmento.Det 
##                    0                    0                    0 
##                Marca         Presentacion               Tamaño 
##                    0                    0                    0 
##        Retornable_NR                Enero              Febrero 
##                    0               233551               231285 
##                Marzo                Abril                 Mayo 
##               227506               224185               217072 
##                Junio                Julio               Agosto 
##               215907               223537               220366 
##           Septiembre              Octubre            Noviembre 
##               337401               338482               338545 
##            Diciembre 
##               341954
# Reemplazar N/A's con 0
df[is.na(df)] <- 0

#Las cantidades negativas son perdidas
#df$Enero<- abs(df$Enero)

#Agregar columna de ventas
df$Ventas <- df$Enero+df$Febrero+df$Marzo+df$Abril+df$Mayo+df$Junio+df$Julio+df$Agosto+df$Septiembre+
  df$Octubre+df$Noviembre+df$Diciembre

#Grafica de caja y bigotes
boxplot(df$Enero, horizontal=TRUE)

boxplot(df$Agosto, horizontal=TRUE)

summary(df)
##        ID              Año        Territorio        Sub.Territorio    
##  Min.   :     1   Min.   :2016   Length:466508      Length:466508     
##  1st Qu.:116628   1st Qu.:2017   Class :character   Class :character  
##  Median :233256   Median :2018   Mode  :character   Mode  :character  
##  Mean   :233255   Mean   :2018                                        
##  3rd Qu.:349882   3rd Qu.:2019                                        
##  Max.   :466509   Max.   :2019                                        
##      CEDI             Cliente             Nombre          Tamaño.Cte.Industria
##  Length:466508      Length:466508      Length:466508      Length:466508       
##  Class :character   Class :character   Class :character   Class :character    
##  Mode  :character   Mode  :character   Mode  :character   Mode  :character    
##                                                                               
##                                                                               
##                                                                               
##  Segmento.Det          Marca           Presentacion          Tamaño         
##  Length:466508      Length:466508      Length:466508      Length:466508     
##  Class :character   Class :character   Class :character   Class :character  
##  Mode  :character   Mode  :character   Mode  :character   Mode  :character  
##                                                                             
##                                                                             
##                                                                             
##  Retornable_NR          Enero           Febrero            Marzo        
##  Length:466508      Min.   :-19.00   Min.   :-11.000   Min.   :-32.000  
##  Class :character   1st Qu.:  0.00   1st Qu.:  0.000   1st Qu.:  0.000  
##  Mode  :character   Median :  0.00   Median :  0.000   Median :  0.000  
##                     Mean   :  4.69   Mean   :  4.581   Mean   :  5.401  
##                     3rd Qu.:  2.00   3rd Qu.:  2.000   3rd Qu.:  3.000  
##                     Max.   :999.00   Max.   :986.000   Max.   :986.000  
##      Abril              Mayo              Junio            Julio        
##  Min.   :-70.000   Min.   :-106.000   Min.   :-211.0   Min.   :-60.000  
##  1st Qu.:  0.000   1st Qu.:   0.000   1st Qu.:   0.0   1st Qu.:  0.000  
##  Median :  0.000   Median :   0.000   Median :   0.0   Median :  0.000  
##  Mean   :  5.519   Mean   :   6.117   Mean   :   5.9   Mean   :  5.583  
##  3rd Qu.:  3.000   3rd Qu.:   3.000   3rd Qu.:   3.0   3rd Qu.:  3.000  
##  Max.   :993.000   Max.   : 991.000   Max.   : 998.0   Max.   :993.000  
##      Agosto           Septiembre          Octubre          Noviembre      
##  Min.   :-211.000   Min.   :-527.000   Min.   :-38.000   Min.   :-25.000  
##  1st Qu.:   0.000   1st Qu.:   0.000   1st Qu.:  0.000   1st Qu.:  0.000  
##  Median :   0.000   Median :   0.000   Median :  0.000   Median :  0.000  
##  Mean   :   5.777   Mean   :   3.311   Mean   :  3.327   Mean   :  3.248  
##  3rd Qu.:   3.000   3rd Qu.:   1.000   3rd Qu.:  1.000   3rd Qu.:  1.000  
##  Max.   : 999.000   Max.   : 993.000   Max.   :998.000   Max.   :991.000  
##    Diciembre           Ventas       
##  Min.   :-28.000   Min.   :-527.00  
##  1st Qu.:  0.000   1st Qu.:   2.00  
##  Median :  0.000   Median :   7.00  
##  Mean   :  3.477   Mean   :  56.93  
##  3rd Qu.:  0.000   3rd Qu.:  26.00  
##  Max.   :997.000   Max.   :9517.00

Observacion #Pregunta 1 ¿Puede observarse un crecimiento en las ventas de algunos de los segmentos de productos de la familia Coca Cola en las tiendas en las que se implementó el Proyecto Siglo XXI de Arca Continental? Respuesta: Se observa un incremento general en las ventas

ggplot(df, aes(x=Año, y=Ventas)) + 
  geom_bar(stat="identity") + 
  labs(
    title= "VENTAS POR AÑO",
    subtitle= "Caso arca continental"
  )

#Pregunta 2 ¿El incremento en las ventas es similar entre los diferentes tamaños de clientes? Respuesta:Arca experimentó un aumento en las ventas en 2019 debido al crecimiento en el número de clientes de empresas grandes, micro y pequeñas. Durante ese año, el alza fue especialmente notable debido a la incorporación de empresas grandes y pequeñas.

ggplot(df, aes(x=Año, y=Ventas, colour=Tamaño.Cte.Industria)) + 
  geom_bar(stat="identity") + 
  labs(
    title= "VENTAS POR AÑO",
    subtitle= "Caso arca continental"
  )

df2 <- df %>% filter(Tamaño.Cte.Industria=="Extra Grande")

ggplot(df2, aes(x=Año, y= Ventas, colour=Tamaño.Cte.Industria)) +
  geom_bar(stat = "Identity") +
  labs(
    title = "Ventas por año",
    subtitle = "Caso Arca Continental"
  )

df3 <- df %>% filter(Tamaño.Cte.Industria=="Grande")

ggplot(df3, aes(x=Año, y= Ventas, colour=Tamaño.Cte.Industria)) +
  geom_bar(stat = "Identity") +
  labs(
    title = "Ventas por año",
    subtitle = "Caso Arca Continental"
  )

df4 <- df %>% filter(Tamaño.Cte.Industria=="Micro")

ggplot(df4, aes(x=Año, y= Ventas, colour=Tamaño.Cte.Industria)) +
  geom_bar(stat = "Identity") +
  labs(
    title = "Ventas por año",
    subtitle = "Caso Arca Continental"
  )

df5 <- df %>% filter(Tamaño.Cte.Industria=="Pequeño")

ggplot(df5, aes(x=Año, y= Ventas, colour=Tamaño.Cte.Industria)) +
  geom_bar(stat = "Identity") +
  labs(
    title = "Ventas por año",
    subtitle = "Caso Arca Continental"
  )

#Pregunta 3 ¿Cuál es el comportamiento observado de las unidades vendidas por mes de cada una de las marcas, independientemente de sus respectivas presentaciones? Respuesta: La marca Coca-Cola es la más vendida de todas, con incremento de ventas en 2019. La marca Sprite con incremento de ventas año con año

df6 <- df %>% filter(Marca=="Coca-Cola")

ggplot(df6, aes(x=Año, y= Ventas, colour=Tamaño.Cte.Industria)) +
  geom_bar(stat = "Identity") +
  labs(
    title = "Ventas por año de Coca Cola",
    subtitle = "Caso Arca Continental"
  )

df7 <- df %>% filter(Marca=="Sprite")

ggplot(df7, aes(x=Año, y= Ventas, colour=Tamaño.Cte.Industria)) +
  geom_bar(stat = "Identity") +
  labs(
    title = "Ventas por año de Sprite",
    subtitle = "Caso Arca Continental"
  )

#Pregunta 4 ¿Se ha incrementado la venta de productos en envases retornables en los últimos dos años? Respuesta: Si, crubiendo más tamaños de mercados.

df8 <- df %>% filter(Retornable_NR=="Retornable")

ggplot(df8, aes(x=Año, y= Ventas, colour=Tamaño.Cte.Industria)) +
  geom_bar(stat = "Identity") +
  labs(
    title = "Ventas por año de envases retornables",
    subtitle = "Caso Arca Continental"
  )

#Pregunta 5 ¿El comportamiento de la venta de agua ha incrementado en relación al de los refrescos o las bebidas isotónicas? Respuesta: Las ventas de Agua Purificada y Colas regular ah bajado en el último año. Pero por otro lado, las bebidas Isotónicas han estado en aumento año con año.

df9 <- df %>% filter(Segmento.Det=="Agua Purificada" | Segmento.Det=="Isotónicos Regular" | Segmento.Det=="Colas Regular")

ggplot(df9, aes(x=Año, y= Ventas, fill=Segmento.Det)) +
  geom_bar(position="dodge", stat = "Identity") +
  labs(
    title = "Ventas por año",
    subtitle = "Caso Arca Continental"
  )

#Pregunta 6 ¿A cuánto ascienden las ventas esperadas para el 2020 en la Coca Cola de 500 ml NR Vidrio? Respuesta: NoAcorde a un modelo predictivo utilizando regresion lineal, las ventas esperadas para Coca Cola de 500ml NR Vidrio en 2020 es de 444,066 unidades, con una R cuadrada ajustada del 48%.

df11 <- df %>% filter(Marca=="Coca-Cola" & Presentacion=="500 ml NR Vidrio") 

df12 <- aggregate(Ventas ~ Año, df11, sum)
df12$Año <- as.integer(df12$Año)
regresion <- lm(Ventas ~ Año, data=df12)
summary(regresion)
## 
## Call:
## lm(formula = Ventas ~ Año, data = df12)
## 
## Residuals:
##        1        2        3        4 
## -23838.5  35316.5    882.5 -12360.5 
## 
## Coefficients:
##              Estimate Std. Error t value Pr(>|t|)
## (Intercept) -54970594   28310425  -1.942    0.192
## Año             27433      14032   1.955    0.190
## 
## Residual standard error: 31380 on 2 degrees of freedom
## Multiple R-squared:  0.6565, Adjusted R-squared:  0.4847 
## F-statistic: 3.822 on 1 and 2 DF,  p-value: 0.1898
#Ecuacion de la recta y = -54,970,595 + 27,433*Año
datos <- data.frame(Año=2020)
predict(regresion,datos)
##        1 
## 444065.5
LS0tCnRpdGxlOiAiRXZpZGVuY2lhIgphdXRob3I6ICJTb2ZpYSBBbGN1ZGlhIEEwMDgzMTEyNSIKZGF0ZTogIjIwMjMtMDktMTMiCm91dHB1dDogCiBodG1sX2RvY3VtZW50OgogICB0b2M6IFRSVUUKICAgdG9jX2Zsb2F0OiBUUlVFCiAgIGNvZGVfZG93bmxvYWQ6IFRSVUUKICAgdGhlbWU6ICJqb3VybmFsIgogICBoaWdobGlnaHQ6ICJlc3ByZXNzbyIKLS0tCiFbXSgvVXNlcnMvc29maWFhbGN1ZGlhL0Rvd25sb2Fkcy9jcnktbGl0dGxlLWJveS5naWYpCgojIDxzcGFuIHN0eWxlPSJjb2xvcjogcmVkOyI+Q29udGV4dG88L3NwYW4+ClBhcmEgQXJjYSBDb250aW5lbnRhbCwgbGEgc2l0dWFjacOzbiBxdWUgZXN0w6FuIHZpdmllbmRvIGxvcyBkdWXDsW9zIGRlIGxhcyB0aWVuZGl0YXMgZGUgbGEgZXNxdWluYSBubyBoYSBwYXNhZG8gZGVzYXBlcmNpYmlkYS4gRWxsb3MsIHF1aWVuZXMgcG9yIG11Y2hvcyBhw7FvcyBoYW4gc2lkbyBudWVzdHJvcyBwcmluY2lwYWxlcyBhbGlhZG9zIGNvbWVyY2lhbGVzLCBubyBwdWVkZW4gcG9yIHPDrSBzb2xvcyByZXZlcnRpciBsYSBzaXR1YWNpw7NuIGRlIHJpZXNnbyBlbiBsYSBxdWUgc2UgZW5jdWVudHJhbiBwb3IgbG8gcXVlLCBlbiBBcmNhIENvbnRpbmVudGFsLCBhY29yZGUgYSBudWVzdHJhIG1pc2nDs24gZGUg4oCcR2VuZXJhciBlbCBtw6F4aW1vIHZhbG9yIHBhcmEgbnVlc3Ryb3MgY2xpZW50ZXMsIGNvbGFib3JhZG9yZXMsIGNvbXVuaWRhZGVzLCB5IGFjY2lvbmlzdGFz4oCm4oCdIGhlbW9zIGRlY2lkaWRvIGFwb3lhciBhbCBmb3J0YWxlY2ltaWVudG8gZGVsIGNhbmFsIHRyYWRpY2lvbmFsIGEgdHJhdsOpcyBkZWwgUHJveWVjdG8gU2lnbG8gWFhJLgoKCiM8c3BhbiBzdHlsZT0iY29sb3I6IHJlZDsiPkltcG9ydGFyIGJhc2UgZGUgZGF0b3M8L3NwYW4+CmBgYHtyfQojZmlsZS5jaG9vc2UoKQpkZiA8LSByZWFkLmNzdigiL1VzZXJzL3NvZmlhYWxjdWRpYS9Eb3dubG9hZHMvYXJjYS5jc3YiKQpgYGAKCiM8c3BhbiBzdHlsZT0iY29sb3I6IHJlZDsiPkVudGVuZGVyIGxhIGJhc2UgZGUgZGF0b3M8L3NwYW4+CmBgYHtyfQpzdW1tYXJ5KGRmKQpsaWJyYXJ5KHRpZHl2ZXJzZSkKc3RyKGRmKQpsaWJyYXJ5KGRwbHlyKQpjb3VudChkZixUZXJyaXRvcmlvLHNvcnQ9VFJVRSkKCmBgYCAKT2JzZXJ2YWNpb25lczoKRWxpbWluYXIgcmVuZ2xvbiAxODQwNjUgcXVlIHRpZW5lIHRpdHVsb3MgZW4gbHVnYXIgZGUgZGF0b3MKCiM8c3BhbiBzdHlsZT0iY29sb3I6IHJlZDsiPkxpbXBpYXIgbGEgYmFzZSBkZSBkYXRvczwvc3Bhbj4KYGBge3J9CmRmIDwtIGRmWy0xODQwNjUsXQpkZiRFbmVybyA8LSBhcy5pbnRlZ2VyKGRmJEVuZXJvKQpkZiRGZWJyZXJvIDwtIGFzLmludGVnZXIoZGYkRmVicmVybykKZGYkTWFyem8gPC0gYXMuaW50ZWdlcihkZiRNYXJ6bykKZGYkQWJyaWwgPC0gYXMuaW50ZWdlcihkZiRBYnJpbCkKZGYkTWF5byA8LSBhcy5pbnRlZ2VyKGRmJE1heW8pCmRmJEp1bmlvIDwtIGFzLmludGVnZXIoZGYkSnVuaW8pCmRmJEp1bGlvIDwtIGFzLmludGVnZXIoZGYkSnVsaW8pCmRmJEFnb3N0byA8LSBhcy5pbnRlZ2VyKGRmJEFnb3N0bykKZGYkU2VwdGllbWJyZSA8LSBhcy5pbnRlZ2VyKGRmJFNlcHRpZW1icmUpCmRmJE9jdHVicmUgPC0gYXMuaW50ZWdlcihkZiRPY3R1YnJlKQpkZiROb3ZpZW1icmUgPC0gYXMuaW50ZWdlcihkZiROb3ZpZW1icmUpCmRmJERpY2llbWJyZSA8LSBhcy5pbnRlZ2VyKGRmJERpY2llbWJyZSkKCnN1bW1hcnkoZGYpCmBgYAogIE9ic2VydmFjaW9uZXM6CiAgCmBgYHtyfQojwr9DdWFudGFzIE4vQSdzIHRlbmdvIGVuIGxhIGJhc2UgZGUgZGF0b3M/CnN1bShpcy5uYShkZikpCgojIMK/Q3VhbnRvcyBOL0EncyB0ZW5nbyBwb3IgdmFyaWFibGU/CnNhcHBseShkZixmdW5jdGlvbih4KSBzdW0oaXMubmEoeCkpKQoKIyBSZWVtcGxhemFyIE4vQSdzIGNvbiAwCmRmW2lzLm5hKGRmKV0gPC0gMAoKI0xhcyBjYW50aWRhZGVzIG5lZ2F0aXZhcyBzb24gcGVyZGlkYXMKI2RmJEVuZXJvPC0gYWJzKGRmJEVuZXJvKQoKI0FncmVnYXIgY29sdW1uYSBkZSB2ZW50YXMKZGYkVmVudGFzIDwtIGRmJEVuZXJvK2RmJEZlYnJlcm8rZGYkTWFyem8rZGYkQWJyaWwrZGYkTWF5bytkZiRKdW5pbytkZiRKdWxpbytkZiRBZ29zdG8rZGYkU2VwdGllbWJyZSsKICBkZiRPY3R1YnJlK2RmJE5vdmllbWJyZStkZiREaWNpZW1icmUKCiNHcmFmaWNhIGRlIGNhamEgeSBiaWdvdGVzCmJveHBsb3QoZGYkRW5lcm8sIGhvcml6b250YWw9VFJVRSkKYm94cGxvdChkZiRBZ29zdG8sIGhvcml6b250YWw9VFJVRSkKCnN1bW1hcnkoZGYpCmBgYAogIE9ic2VydmFjaW9uCiM8c3BhbiBzdHlsZT0iY29sb3I6IHJlZDsiPlByZWd1bnRhIDE8L3NwYW4+CsK/UHVlZGUgb2JzZXJ2YXJzZSB1biBjcmVjaW1pZW50byBlbiBsYXMgdmVudGFzIGRlIGFsZ3Vub3MgZGUgbG9zIHNlZ21lbnRvcyBkZSBwcm9kdWN0b3MgZGUgbGEgZmFtaWxpYSBDb2NhIENvbGEgZW4gbGFzIHRpZW5kYXMgZW4gbGFzIHF1ZSBzZSBpbXBsZW1lbnTDsyBlbCBQcm95ZWN0byBTaWdsbyBYWEkgZGUgQXJjYSBDb250aW5lbnRhbD8KKipSZXNwdWVzdGE6IFNlIG9ic2VydmEgdW4gaW5jcmVtZW50byBnZW5lcmFsIGVuIGxhcyB2ZW50YXMqKgpgYGB7cn0KZ2dwbG90KGRmLCBhZXMoeD1Bw7FvLCB5PVZlbnRhcykpICsgCiAgZ2VvbV9iYXIoc3RhdD0iaWRlbnRpdHkiKSArIAogIGxhYnMoCiAgICB0aXRsZT0gIlZFTlRBUyBQT1IgQcORTyIsCiAgICBzdWJ0aXRsZT0gIkNhc28gYXJjYSBjb250aW5lbnRhbCIKICApCgpgYGAKCiM8c3BhbiBzdHlsZT0iY29sb3I6IHJlZDsiPlByZWd1bnRhIDI8L3NwYW4+CsK/RWwgaW5jcmVtZW50byBlbiBsYXMgdmVudGFzIGVzIHNpbWlsYXIgZW50cmUgbG9zIGRpZmVyZW50ZXMgdGFtYcOxb3MgZGUgY2xpZW50ZXM/CioqUmVzcHVlc3RhOkFyY2EgZXhwZXJpbWVudMOzIHVuIGF1bWVudG8gZW4gbGFzIHZlbnRhcyBlbiAyMDE5IGRlYmlkbyBhbCBjcmVjaW1pZW50byBlbiBlbCBuw7ptZXJvIGRlIGNsaWVudGVzIGRlIGVtcHJlc2FzIGdyYW5kZXMsIG1pY3JvIHkgcGVxdWXDsWFzLiBEdXJhbnRlIGVzZSBhw7FvLCBlbCBhbHphIGZ1ZSBlc3BlY2lhbG1lbnRlIG5vdGFibGUgZGViaWRvIGEgbGEgaW5jb3Jwb3JhY2nDs24gZGUgZW1wcmVzYXMgZ3JhbmRlcyB5IHBlcXVlw7Fhcy4gKioKYGBge3J9CmdncGxvdChkZiwgYWVzKHg9QcOxbywgeT1WZW50YXMsIGNvbG91cj1UYW1hw7FvLkN0ZS5JbmR1c3RyaWEpKSArIAogIGdlb21fYmFyKHN0YXQ9ImlkZW50aXR5IikgKyAKICBsYWJzKAogICAgdGl0bGU9ICJWRU5UQVMgUE9SIEHDkU8iLAogICAgc3VidGl0bGU9ICJDYXNvIGFyY2EgY29udGluZW50YWwiCiAgKQoKZGYyIDwtIGRmICU+JSBmaWx0ZXIoVGFtYcOxby5DdGUuSW5kdXN0cmlhPT0iRXh0cmEgR3JhbmRlIikKCmdncGxvdChkZjIsIGFlcyh4PUHDsW8sIHk9IFZlbnRhcywgY29sb3VyPVRhbWHDsW8uQ3RlLkluZHVzdHJpYSkpICsKICBnZW9tX2JhcihzdGF0ID0gIklkZW50aXR5IikgKwogIGxhYnMoCiAgICB0aXRsZSA9ICJWZW50YXMgcG9yIGHDsW8iLAogICAgc3VidGl0bGUgPSAiQ2FzbyBBcmNhIENvbnRpbmVudGFsIgogICkKCmRmMyA8LSBkZiAlPiUgZmlsdGVyKFRhbWHDsW8uQ3RlLkluZHVzdHJpYT09IkdyYW5kZSIpCgpnZ3Bsb3QoZGYzLCBhZXMoeD1Bw7FvLCB5PSBWZW50YXMsIGNvbG91cj1UYW1hw7FvLkN0ZS5JbmR1c3RyaWEpKSArCiAgZ2VvbV9iYXIoc3RhdCA9ICJJZGVudGl0eSIpICsKICBsYWJzKAogICAgdGl0bGUgPSAiVmVudGFzIHBvciBhw7FvIiwKICAgIHN1YnRpdGxlID0gIkNhc28gQXJjYSBDb250aW5lbnRhbCIKICApCgpkZjQgPC0gZGYgJT4lIGZpbHRlcihUYW1hw7FvLkN0ZS5JbmR1c3RyaWE9PSJNaWNybyIpCgpnZ3Bsb3QoZGY0LCBhZXMoeD1Bw7FvLCB5PSBWZW50YXMsIGNvbG91cj1UYW1hw7FvLkN0ZS5JbmR1c3RyaWEpKSArCiAgZ2VvbV9iYXIoc3RhdCA9ICJJZGVudGl0eSIpICsKICBsYWJzKAogICAgdGl0bGUgPSAiVmVudGFzIHBvciBhw7FvIiwKICAgIHN1YnRpdGxlID0gIkNhc28gQXJjYSBDb250aW5lbnRhbCIKICApCgpkZjUgPC0gZGYgJT4lIGZpbHRlcihUYW1hw7FvLkN0ZS5JbmR1c3RyaWE9PSJQZXF1ZcOxbyIpCgpnZ3Bsb3QoZGY1LCBhZXMoeD1Bw7FvLCB5PSBWZW50YXMsIGNvbG91cj1UYW1hw7FvLkN0ZS5JbmR1c3RyaWEpKSArCiAgZ2VvbV9iYXIoc3RhdCA9ICJJZGVudGl0eSIpICsKICBsYWJzKAogICAgdGl0bGUgPSAiVmVudGFzIHBvciBhw7FvIiwKICAgIHN1YnRpdGxlID0gIkNhc28gQXJjYSBDb250aW5lbnRhbCIKICApCgoKCmBgYAoKIzxzcGFuIHN0eWxlPSJjb2xvcjogcmVkOyI+UHJlZ3VudGEgMzwvc3Bhbj4Kwr9DdcOhbCBlcyBlbCBjb21wb3J0YW1pZW50byBvYnNlcnZhZG8gZGUgbGFzIHVuaWRhZGVzIHZlbmRpZGFzIHBvciBtZXMgZGUgY2FkYSB1bmEgZGUgbGFzIG1hcmNhcywgaW5kZXBlbmRpZW50ZW1lbnRlIGRlIHN1cyByZXNwZWN0aXZhcyBwcmVzZW50YWNpb25lcz8KKlJlc3B1ZXN0YTogTGEgbWFyY2EgQ29jYS1Db2xhIGVzIGxhIG3DoXMgdmVuZGlkYSBkZSB0b2RhcywgY29uIGluY3JlbWVudG8gZGUgdmVudGFzIGVuIDIwMTkuIExhIG1hcmNhIFNwcml0ZSBjb24gaW5jcmVtZW50byBkZSB2ZW50YXMgYcOxbyBjb24gYcOxbyAqCmBgYHtyfQpkZjYgPC0gZGYgJT4lIGZpbHRlcihNYXJjYT09IkNvY2EtQ29sYSIpCgpnZ3Bsb3QoZGY2LCBhZXMoeD1Bw7FvLCB5PSBWZW50YXMsIGNvbG91cj1UYW1hw7FvLkN0ZS5JbmR1c3RyaWEpKSArCiAgZ2VvbV9iYXIoc3RhdCA9ICJJZGVudGl0eSIpICsKICBsYWJzKAogICAgdGl0bGUgPSAiVmVudGFzIHBvciBhw7FvIGRlIENvY2EgQ29sYSIsCiAgICBzdWJ0aXRsZSA9ICJDYXNvIEFyY2EgQ29udGluZW50YWwiCiAgKQoKZGY3IDwtIGRmICU+JSBmaWx0ZXIoTWFyY2E9PSJTcHJpdGUiKQoKZ2dwbG90KGRmNywgYWVzKHg9QcOxbywgeT0gVmVudGFzLCBjb2xvdXI9VGFtYcOxby5DdGUuSW5kdXN0cmlhKSkgKwogIGdlb21fYmFyKHN0YXQgPSAiSWRlbnRpdHkiKSArCiAgbGFicygKICAgIHRpdGxlID0gIlZlbnRhcyBwb3IgYcOxbyBkZSBTcHJpdGUiLAogICAgc3VidGl0bGUgPSAiQ2FzbyBBcmNhIENvbnRpbmVudGFsIgogICkKCmBgYAoKIzxzcGFuIHN0eWxlPSJjb2xvcjogcmVkOyI+UHJlZ3VudGEgNDwvc3Bhbj4Kwr9TZSBoYSBpbmNyZW1lbnRhZG8gbGEgdmVudGEgZGUgcHJvZHVjdG9zIGVuIGVudmFzZXMgcmV0b3JuYWJsZXMgZW4gbG9zIMO6bHRpbW9zIGRvcyBhw7Fvcz8KKlJlc3B1ZXN0YTogU2ksIGNydWJpZW5kbyBtw6FzIHRhbWHDsW9zIGRlIG1lcmNhZG9zLioKYGBge3J9CmRmOCA8LSBkZiAlPiUgZmlsdGVyKFJldG9ybmFibGVfTlI9PSJSZXRvcm5hYmxlIikKCmdncGxvdChkZjgsIGFlcyh4PUHDsW8sIHk9IFZlbnRhcywgY29sb3VyPVRhbWHDsW8uQ3RlLkluZHVzdHJpYSkpICsKICBnZW9tX2JhcihzdGF0ID0gIklkZW50aXR5IikgKwogIGxhYnMoCiAgICB0aXRsZSA9ICJWZW50YXMgcG9yIGHDsW8gZGUgZW52YXNlcyByZXRvcm5hYmxlcyIsCiAgICBzdWJ0aXRsZSA9ICJDYXNvIEFyY2EgQ29udGluZW50YWwiCiAgKQpgYGAKCiM8c3BhbiBzdHlsZT0iY29sb3I6IHJlZDsiPlByZWd1bnRhIDU8L3NwYW4+CsK/RWwgY29tcG9ydGFtaWVudG8gZGUgbGEgdmVudGEgZGUgYWd1YSBoYSBpbmNyZW1lbnRhZG8gZW4gcmVsYWNpw7NuIGFsIGRlIGxvcyByZWZyZXNjb3MgbyBsYXMgYmViaWRhcyBpc290w7NuaWNhcz8KKlJlc3B1ZXN0YTogTGFzIHZlbnRhcyBkZSBBZ3VhIFB1cmlmaWNhZGEgeSBDb2xhcyByZWd1bGFyIGFoIGJhamFkbyBlbiBlbCDDumx0aW1vIGHDsW8uIFBlcm8gcG9yIG90cm8gbGFkbywgbGFzIGJlYmlkYXMgSXNvdMOzbmljYXMgaGFuIGVzdGFkbyBlbiBhdW1lbnRvIGHDsW8gY29uIGHDsW8uKgpgYGB7cn0KZGY5IDwtIGRmICU+JSBmaWx0ZXIoU2VnbWVudG8uRGV0PT0iQWd1YSBQdXJpZmljYWRhIiB8IFNlZ21lbnRvLkRldD09Iklzb3TDs25pY29zIFJlZ3VsYXIiIHwgU2VnbWVudG8uRGV0PT0iQ29sYXMgUmVndWxhciIpCgpnZ3Bsb3QoZGY5LCBhZXMoeD1Bw7FvLCB5PSBWZW50YXMsIGZpbGw9U2VnbWVudG8uRGV0KSkgKwogIGdlb21fYmFyKHBvc2l0aW9uPSJkb2RnZSIsIHN0YXQgPSAiSWRlbnRpdHkiKSArCiAgbGFicygKICAgIHRpdGxlID0gIlZlbnRhcyBwb3IgYcOxbyIsCiAgICBzdWJ0aXRsZSA9ICJDYXNvIEFyY2EgQ29udGluZW50YWwiCiAgKQoKYGBgCgojPHNwYW4gc3R5bGU9ImNvbG9yOiByZWQ7Ij5QcmVndW50YSA2PC9zcGFuPgrCv0EgY3XDoW50byBhc2NpZW5kZW4gbGFzIHZlbnRhcyBlc3BlcmFkYXMgcGFyYSBlbCAyMDIwIGVuIGxhIENvY2EgQ29sYSBkZSA1MDAgbWwgTlIgVmlkcmlvPwoqUmVzcHVlc3RhOiBOb0Fjb3JkZSBhIHVuIG1vZGVsbyBwcmVkaWN0aXZvIHV0aWxpemFuZG8gcmVncmVzaW9uIGxpbmVhbCwgbGFzIHZlbnRhcyBlc3BlcmFkYXMgcGFyYSBDb2NhIENvbGEgZGUgNTAwbWwgTlIgVmlkcmlvIGVuIDIwMjAgZXMgZGUgNDQ0LDA2NiB1bmlkYWRlcywgY29uIHVuYSBSIGN1YWRyYWRhIGFqdXN0YWRhIGRlbCA0OCUuKgpgYGB7cn0KZGYxMSA8LSBkZiAlPiUgZmlsdGVyKE1hcmNhPT0iQ29jYS1Db2xhIiAmIFByZXNlbnRhY2lvbj09IjUwMCBtbCBOUiBWaWRyaW8iKSAKCmRmMTIgPC0gYWdncmVnYXRlKFZlbnRhcyB+IEHDsW8sIGRmMTEsIHN1bSkKZGYxMiRBw7FvIDwtIGFzLmludGVnZXIoZGYxMiRBw7FvKQpyZWdyZXNpb24gPC0gbG0oVmVudGFzIH4gQcOxbywgZGF0YT1kZjEyKQpzdW1tYXJ5KHJlZ3Jlc2lvbikKI0VjdWFjaW9uIGRlIGxhIHJlY3RhIHkgPSAtNTQsOTcwLDU5NSArIDI3LDQzMypBw7FvCmRhdG9zIDwtIGRhdGEuZnJhbWUoQcOxbz0yMDIwKQpwcmVkaWN0KHJlZ3Jlc2lvbixkYXRvcykKYGBgCgo=