Ejemplo de Produccion

#install.packages("forecast")
library(forecast)
## Registered S3 method overwritten by 'quantmod':
##   method            from
##   as.zoo.data.frame zoo
library(plm)
library(tidyverse)
## ── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
## ✔ dplyr     1.1.4     ✔ readr     2.1.5
## ✔ forcats   1.0.0     ✔ stringr   1.5.1
## ✔ ggplot2   3.5.2     ✔ tibble    3.2.1
## ✔ lubridate 1.9.3     ✔ tidyr     1.3.1
## ✔ purrr     1.0.2
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## ✖ dplyr::between() masks plm::between()
## ✖ dplyr::filter()  masks stats::filter()
## ✖ dplyr::lag()     masks plm::lag(), stats::lag()
## ✖ dplyr::lead()    masks plm::lead()
## ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
library(WDI)
library(wbstats)
library(gplots)
## 
## Attaching package: 'gplots'
## 
## The following object is masked from 'package:stats':
## 
##     lowess
library(readxl)

Ejemplo de Produccion

Contexto

Una serie de tiempo es una colecciones de obsvervaciones sobre un determinado fenomeno efectuados en momentos de tiempos sucesivos, usualmente equiespaciados.

Ejemplos de series de tiempo son: 1- Precio de Acciones 2- Niveles de Inventario 3- Rotacion de personal 4- Ventas 5- PIB (GDP)

Crear la serie de tiempo

Ejemplo: Los siguentes datos de produccion trimestral inician en el primer trimestre de 2020. Se busca pronosticar la produccion de los siguentes 5 trimestres

produccion<- c(50,53,55,57,55,60)
st_produccion <-ts(data=produccion, start= c(2020,1), frequency = 4) # En este caso, la serie de tiempo inicia en 2020, en el primer mes 1

#MENSUAL: st_produccion <-ts(data=produccion, start= c(2020,1), frequency = 4) # En este caso, la serie de tiempo inicia en 2020, en el octavo mes

#MENSUAL: st_produccion <-ts(data=produccion, start= c(2020,8), frequency = 4) # En este caso, la serie de tiempo inicia en 2020, en el octavo mes

#ANUAL: st_produccion <-ts(data=produccion, start= c(2020), frequency = 1) # En este caso, la serie de tiempo inicia en 2020

Generar el pronostico

ARIMA Significa Modelo Autorregtesivo Integrado de Promedio Movil, en ingles

modelo_produccion <- auto.arima(st_produccion, D=1) # Diferenciador Estacional
modelo_produccion
## Series: st_produccion 
## ARIMA(0,0,0)(0,1,0)[4] with drift 
## 
## Coefficients:
##        drift
##       1.5000
## s.e.  0.1768
## 
## sigma^2 = 2.01:  log likelihood = -2.84
## AIC=9.68   AICc=-2.32   BIC=7.06
summary(modelo_produccion)
## Series: st_produccion 
## ARIMA(0,0,0)(0,1,0)[4] with drift 
## 
## Coefficients:
##        drift
##       1.5000
## s.e.  0.1768
## 
## sigma^2 = 2.01:  log likelihood = -2.84
## AIC=9.68   AICc=-2.32   BIC=7.06
## 
## Training set error measures:
##                      ME      RMSE       MAE        MPE      MAPE       MASE
## Training set 0.03333332 0.5787923 0.3666667 0.03685269 0.6429133 0.06111111
##                    ACF1
## Training set -0.5073047
# Al comparar modelos seleccionaos el que tengas menor MAPE

Generar el pronostico

pronostico_produccion <- forecast(modelo_produccion, level=c(95), h=5)
# si no nos dice otra cosa, el nivel de confiabilidad es de 95%. los periodos a pronosticar es H. 
pronostico_produccion
##         Point Forecast    Lo 95    Hi 95
## 2021 Q3             61 58.22127 63.77873
## 2021 Q4             63 60.22127 65.77873
## 2022 Q1             61 58.22127 63.77873
## 2022 Q2             66 63.22127 68.77873
## 2022 Q3             67 63.07028 70.92972
plot(pronostico_produccion)

Ejercicio 1. Mexico rumbo al 2050

Obtener los datos hsitoricos de su poblaciopn y generar un pronostico hasta 2025 Como equipo de 3 escogimos El estado de Baja California Norte

poblacion_baja<- c(1660855, 2112140, 2487367, 2844690, 3155070, 3315766, 3769020, 4131619)
st_baja <-ts(data=poblacion_baja, start= c(1990,1), frequency = .2) 
modelo_poblacion_baja <- auto.arima(st_baja, D=1) # Diferenciador Estacional
modelo_poblacion_baja
## Series: st_baja 
## ARIMA(0,1,0) with drift 
## 
## Coefficients:
##           drift
##       352966.29
## s.e.   34733.47
## 
## sigma^2 = 9.852e+09:  log likelihood = -89.93
## AIC=183.86   AICc=186.86   BIC=183.75
summary(modelo_poblacion_baja)
## Series: st_baja 
## ARIMA(0,1,0) with drift 
## 
## Coefficients:
##           drift
##       352966.29
## s.e.   34733.47
## 
## sigma^2 = 9.852e+09:  log likelihood = -89.93
## AIC=183.86   AICc=186.86   BIC=183.75
## 
## Training set error measures:
##                   ME     RMSE      MAE       MPE     MAPE       MASE       ACF1
## Training set 163.486 85961.23 58877.63 0.1909166 1.978027 0.02006349 -0.1336052
pronostico_poblacion <- forecast(modelo_poblacion_baja, level=c(95), h=5)
pronostico_poblacion
##      Point Forecast   Lo 95   Hi 95
## 2030        4484585 4290040 4679130
## 2035        4837552 4562423 5112680
## 2040        5190518 4853556 5527480
## 2045        5543484 5154394 5932574
## 2050        5896450 5461435 6331466
plot(pronostico_poblacion)

Conclusion: El análisis de la población de Baja California Norte, con datos de 1990 a 2025, muestra un crecimiento sostenido a lo largo del periodo. El modelo ARIMA(0,1,0) con drift estima un incremento promedio anual de aproximadamente 352,966 habitantes. Esto refleja una tendencia clara de expansión poblacional que, de mantenerse, implica que la región seguirá experimentando un aumento constante de su población hasta 2025, con implicaciones para planificación urbana, infraestructura y servicios públicos.

Ejercicio 3

Materia 1: Horrible primer introducion al programa de negocios del TEC pero me fyu muy bien ya que tuve la poprtunidad de conocer y aprender mas de mi maestro David Wha. Porque hubo un porblema con mi equipo de trabajo todo un drama. Aprindimos pestel,KPI y Fodas

Materia 2. Fue la mas dificil de primer semstre ya que fue mi introduccion a mis clases de finanzas en el tec, conoci acerca del interes simple, balance general, estados resultados.

Materia 3. Esa estaba padre, me gusto fue la continuacion de razonamiento matematico, conoci que era las hipotesis nulas o hipotesis alternativa.

Materia 4. estuvo padre solo que me fue mal en la evidencia porque hice mi grabacion en un atuendo no profesional, trae shorts y me bajo puntos.

Materia 5. Bloque en conjunto de final de mercadotecnia con un poco de inteligencia de negocios

Materia 6. Fue retadora esa clase, la evidencia estuvo bien rara y dificil y a todos nos salieron resultados diferentes y el examen estuvo pesado0

Materia 7. Mejor clase con el professor raul clase de introducion a R

Materia 8. No es de mis favoritas se me hizo muy larga 10 semanas de clase, examen final pesado.

Materia 9. Semana Tec de Boot camp de programacion muy buena clase con el maestro Raul.

Materia 10. Mi intercambio a la universidad de San Diego, USA.

Actividad 2. Hersheys

El propósito de esta actividad es aplicar y/o construir modelos de series de tiempo, con el objetivo de generar escenarios futuros considerando los datos (primarios y/o secundarios) proporcionados, utilizando las herramientas de analítica de datos y pronósticos de series de tiempo. La actividad depende de los datos disponibles de socio formador o el caso, asimismo depende de la intenciones específicas que quiera reforzar el profesor.

Lectura de base de datos

ventas <- read_xlsx("/Users/sebastianespi/Downloads/Ventas_Históricas_Lechitas.xlsx")
str(ventas)
## tibble [36 × 1] (S3: tbl_df/tbl/data.frame)
##  $ Ventas: num [1:36] 25521 23740 26254 25868 27073 ...
st_ventas<- ts(data=ventas, start= c(2017,1), frequency = 12)

Crear el Modelo ARIMA

modelo_ventas <- auto.arima(st_ventas)
modelo_ventas
## Series: st_ventas 
## ARIMA(1,0,0)(1,1,0)[12] with drift 
## 
## Coefficients:
##          ar1     sar1     drift
##       0.6383  -0.5517  288.8979
## s.e.  0.1551   0.2047   14.5026
## 
## sigma^2 = 202701:  log likelihood = -181.5
## AIC=371   AICc=373.11   BIC=375.72
summary(modelo_ventas)
## Series: st_ventas 
## ARIMA(1,0,0)(1,1,0)[12] with drift 
## 
## Coefficients:
##          ar1     sar1     drift
##       0.6383  -0.5517  288.8979
## s.e.  0.1551   0.2047   14.5026
## 
## sigma^2 = 202701:  log likelihood = -181.5
## AIC=371   AICc=373.11   BIC=375.72
## 
## Training set error measures:
##                    ME    RMSE    MAE        MPE      MAPE       MASE      ACF1
## Training set 25.22158 343.864 227.17 0.08059932 0.7069542 0.06491044 0.2081026
pronostico_ventas <- forecast(modelo_ventas, level=c(95), h=12)
plot(pronostico_ventas)

LS0tCnRpdGxlOiAiQWN0aXZpZGFkIDIiCmF1dGhvcjogIlNlYmFzdGlhbiBFc3Bpbm96YSBBMDA4MzM3MDQiCmRhdGU6ICIyMDI1LTA4LTE0IgpvdXRwdXQ6IAogaHRtbF9kb2N1bWVudDogCiAgdG9jOiBUUlVFCiAgdG9jX2Zsb2F0OiBUUlVFCiAgY29kZV9kb3dubG9hZDogVFJVRQogIHRoZW1lOiBjb3NtbwotLS0KIVtdKGh0dHBzOi8vcXVhbnRkYXJlLmNvbS93cC1jb250ZW50L3VwbG9hZHMvMjAyMS8wMi8zRF9hbmltYXRpb25fY2xlYXJfYmFja2dyb3VuZC5naWYpCgojIDxzcGFuIHN0eWxlPSdjb2xvcjpibHVlOyc+IEVqZW1wbG8gZGUgUHJvZHVjY2lvbiAgPC9zcGFuPgpgYGB7cn0KI2luc3RhbGwucGFja2FnZXMoImZvcmVjYXN0IikKbGlicmFyeShmb3JlY2FzdCkKbGlicmFyeShwbG0pCmxpYnJhcnkodGlkeXZlcnNlKQpsaWJyYXJ5KFdESSkKbGlicmFyeSh3YnN0YXRzKQpsaWJyYXJ5KGdwbG90cykKbGlicmFyeShyZWFkeGwpCmBgYAoKCiMgPHNwYW4gc3R5bGU9J2NvbG9yOmJsdWU7Jz4gRWplbXBsbyBkZSBQcm9kdWNjaW9uICA8L3NwYW4+CgojIyA8c3BhbiBzdHlsZT0nY29sb3I6Ymx1ZTsnPiBDb250ZXh0byAgPC9zcGFuPgoKVW5hICoqc2VyaWUgZGUgdGllbXBvKiogZXMgdW5hIGNvbGVjY2lvbmVzIGRlIG9ic3ZlcnZhY2lvbmVzIHNvYnJlIHVuIGRldGVybWluYWRvIGZlbm9tZW5vIGVmZWN0dWFkb3MgZW4gbW9tZW50b3MgZGUgdGllbXBvcyBzdWNlc2l2b3MsIHVzdWFsbWVudGUgZXF1aWVzcGFjaWFkb3MuIAoKRWplbXBsb3MgZGUgc2VyaWVzIGRlIHRpZW1wbyBzb246IAoxLSBQcmVjaW8gZGUgQWNjaW9uZXMKMi0gTml2ZWxlcyBkZSBJbnZlbnRhcmlvCjMtIFJvdGFjaW9uIGRlIHBlcnNvbmFsCjQtIFZlbnRhcwo1LSBQSUIgKEdEUCkKCiMjIDxzcGFuIHN0eWxlPSdjb2xvcjpibHVlOyc+IENyZWFyIGxhIHNlcmllIGRlIHRpZW1wbyAgPC9zcGFuPgpFamVtcGxvOiBMb3Mgc2lndWVudGVzIGRhdG9zIGRlIHByb2R1Y2Npb24gdHJpbWVzdHJhbCBpbmljaWFuIGVuIGVsIHByaW1lciB0cmltZXN0cmUgZGUgMjAyMC4gU2UgYnVzY2EgcHJvbm9zdGljYXIgbGEgcHJvZHVjY2lvbiBkZSBsb3Mgc2lndWVudGVzIDUgdHJpbWVzdHJlcwpgYGB7cn0KCnByb2R1Y2Npb248LSBjKDUwLDUzLDU1LDU3LDU1LDYwKQpzdF9wcm9kdWNjaW9uIDwtdHMoZGF0YT1wcm9kdWNjaW9uLCBzdGFydD0gYygyMDIwLDEpLCBmcmVxdWVuY3kgPSA0KSAjIEVuIGVzdGUgY2FzbywgbGEgc2VyaWUgZGUgdGllbXBvIGluaWNpYSBlbiAyMDIwLCBlbiBlbCBwcmltZXIgbWVzIDEKCiNNRU5TVUFMOiBzdF9wcm9kdWNjaW9uIDwtdHMoZGF0YT1wcm9kdWNjaW9uLCBzdGFydD0gYygyMDIwLDEpLCBmcmVxdWVuY3kgPSA0KSAjIEVuIGVzdGUgY2FzbywgbGEgc2VyaWUgZGUgdGllbXBvIGluaWNpYSBlbiAyMDIwLCBlbiBlbCBvY3Rhdm8gbWVzCgojTUVOU1VBTDogc3RfcHJvZHVjY2lvbiA8LXRzKGRhdGE9cHJvZHVjY2lvbiwgc3RhcnQ9IGMoMjAyMCw4KSwgZnJlcXVlbmN5ID0gNCkgIyBFbiBlc3RlIGNhc28sIGxhIHNlcmllIGRlIHRpZW1wbyBpbmljaWEgZW4gMjAyMCwgZW4gZWwgb2N0YXZvIG1lcwoKI0FOVUFMOiBzdF9wcm9kdWNjaW9uIDwtdHMoZGF0YT1wcm9kdWNjaW9uLCBzdGFydD0gYygyMDIwKSwgZnJlcXVlbmN5ID0gMSkgIyBFbiBlc3RlIGNhc28sIGxhIHNlcmllIGRlIHRpZW1wbyBpbmljaWEgZW4gMjAyMApgYGAKCiMjIDxzcGFuIHN0eWxlPSdjb2xvcjpibHVlOyc+IEdlbmVyYXIgZWwgcHJvbm9zdGljbyAgPC9zcGFuPgoqKkFSSU1BKiogU2lnbmlmaWNhIE1vZGVsbyBBdXRvcnJlZ3Rlc2l2byBJbnRlZ3JhZG8gZGUgUHJvbWVkaW8gTW92aWwsIGVuIGluZ2xlcwpgYGB7cn0KbW9kZWxvX3Byb2R1Y2Npb24gPC0gYXV0by5hcmltYShzdF9wcm9kdWNjaW9uLCBEPTEpICMgRGlmZXJlbmNpYWRvciBFc3RhY2lvbmFsCm1vZGVsb19wcm9kdWNjaW9uCnN1bW1hcnkobW9kZWxvX3Byb2R1Y2Npb24pCiMgQWwgY29tcGFyYXIgbW9kZWxvcyBzZWxlY2Npb25hb3MgZWwgcXVlIHRlbmdhcyBtZW5vciBNQVBFCgpgYGAKCiMjIDxzcGFuIHN0eWxlPSdjb2xvcjpibHVlOyc+IEdlbmVyYXIgZWwgcHJvbm9zdGljbyAgPC9zcGFuPgpgYGB7cn0KcHJvbm9zdGljb19wcm9kdWNjaW9uIDwtIGZvcmVjYXN0KG1vZGVsb19wcm9kdWNjaW9uLCBsZXZlbD1jKDk1KSwgaD01KQojIHNpIG5vIG5vcyBkaWNlIG90cmEgY29zYSwgZWwgbml2ZWwgZGUgY29uZmlhYmlsaWRhZCBlcyBkZSA5NSUuIGxvcyBwZXJpb2RvcyBhIHByb25vc3RpY2FyIGVzIEguIApwcm9ub3N0aWNvX3Byb2R1Y2Npb24KcGxvdChwcm9ub3N0aWNvX3Byb2R1Y2Npb24pCmBgYAoKIyA8c3BhbiBzdHlsZT0nY29sb3I6Z3JlZW47Jz4gRWplcmNpY2lvIDEuIE1leGljbyBydW1ibyBhbCAyMDUwICA8L3NwYW4+Ck9idGVuZXIgbG9zIGRhdG9zIGhzaXRvcmljb3MgZGUgc3UgcG9ibGFjaW9wbiB5IGdlbmVyYXIgdW4gcHJvbm9zdGljbyBoYXN0YSAyMDI1CkNvbW8gZXF1aXBvIGRlIDMgZXNjb2dpbW9zIEVsIGVzdGFkbyBkZSBCYWphIENhbGlmb3JuaWEgTm9ydGUKCmBgYHtyfQpwb2JsYWNpb25fYmFqYTwtIGMoMTY2MDg1NSwgMjExMjE0MCwgMjQ4NzM2NywgMjg0NDY5MCwgMzE1NTA3MCwgMzMxNTc2NiwgMzc2OTAyMCwgNDEzMTYxOSkKc3RfYmFqYSA8LXRzKGRhdGE9cG9ibGFjaW9uX2JhamEsIHN0YXJ0PSBjKDE5OTAsMSksIGZyZXF1ZW5jeSA9IC4yKSAKbW9kZWxvX3BvYmxhY2lvbl9iYWphIDwtIGF1dG8uYXJpbWEoc3RfYmFqYSwgRD0xKSAjIERpZmVyZW5jaWFkb3IgRXN0YWNpb25hbAptb2RlbG9fcG9ibGFjaW9uX2JhamEKc3VtbWFyeShtb2RlbG9fcG9ibGFjaW9uX2JhamEpCnByb25vc3RpY29fcG9ibGFjaW9uIDwtIGZvcmVjYXN0KG1vZGVsb19wb2JsYWNpb25fYmFqYSwgbGV2ZWw9Yyg5NSksIGg9NSkKcHJvbm9zdGljb19wb2JsYWNpb24KcGxvdChwcm9ub3N0aWNvX3BvYmxhY2lvbikKCmBgYApDb25jbHVzaW9uOiBFbCBhbsOhbGlzaXMgZGUgbGEgcG9ibGFjacOzbiBkZSBCYWphIENhbGlmb3JuaWEgTm9ydGUsIGNvbiBkYXRvcyBkZSAxOTkwIGEgMjAyNSwgbXVlc3RyYSB1biBjcmVjaW1pZW50byBzb3N0ZW5pZG8gYSBsbyBsYXJnbyBkZWwgcGVyaW9kby4gRWwgbW9kZWxvIEFSSU1BKDAsMSwwKSBjb24gZHJpZnQgZXN0aW1hIHVuIGluY3JlbWVudG8gcHJvbWVkaW8gYW51YWwgZGUgYXByb3hpbWFkYW1lbnRlIDM1Miw5NjYgaGFiaXRhbnRlcy4gRXN0byByZWZsZWphIHVuYSB0ZW5kZW5jaWEgY2xhcmEgZGUgZXhwYW5zacOzbiBwb2JsYWNpb25hbCBxdWUsIGRlIG1hbnRlbmVyc2UsIGltcGxpY2EgcXVlIGxhIHJlZ2nDs24gc2VndWlyw6EgZXhwZXJpbWVudGFuZG8gdW4gYXVtZW50byBjb25zdGFudGUgZGUgc3UgcG9ibGFjacOzbiBoYXN0YSAyMDI1LCBjb24gaW1wbGljYWNpb25lcyBwYXJhIHBsYW5pZmljYWNpw7NuIHVyYmFuYSwgaW5mcmFlc3RydWN0dXJhIHkgc2VydmljaW9zIHDDumJsaWNvcy4KCiMgPHNwYW4gc3R5bGU9J2NvbG9yOmJsdWU7Jz4gRWplcmNpY2lvIDMgPC9zcGFuPgpNYXRlcmlhIDE6IEhvcnJpYmxlIHByaW1lciBpbnRyb2R1Y2lvbiBhbCBwcm9ncmFtYSBkZSBuZWdvY2lvcyBkZWwgVEVDIHBlcm8gbWUgZnl1IG11eSBiaWVuIHlhIHF1ZSB0dXZlIGxhIHBvcHJ0dW5pZGFkIGRlIGNvbm9jZXIgeSBhcHJlbmRlciBtYXMgZGUgbWkgbWFlc3RybyBEYXZpZCBXaGEuIFBvcnF1ZSBodWJvIHVuIHBvcmJsZW1hIGNvbiBtaSBlcXVpcG8gZGUgdHJhYmFqbyB0b2RvIHVuIGRyYW1hLiBBcHJpbmRpbW9zIHBlc3RlbCxLUEkgeSBGb2RhcwoKTWF0ZXJpYSAyLiBGdWUgbGEgbWFzIGRpZmljaWwgZGUgcHJpbWVyIHNlbXN0cmUgeWEgcXVlIGZ1ZSBtaSBpbnRyb2R1Y2Npb24gYSBtaXMgY2xhc2VzIGRlIGZpbmFuemFzIGVuIGVsIHRlYywgY29ub2NpIGFjZXJjYSBkZWwgaW50ZXJlcyBzaW1wbGUsIGJhbGFuY2UgZ2VuZXJhbCwgZXN0YWRvcyByZXN1bHRhZG9zLiAKCk1hdGVyaWEgMy4gRXNhIGVzdGFiYSBwYWRyZSwgbWUgZ3VzdG8gZnVlIGxhIGNvbnRpbnVhY2lvbiBkZSByYXpvbmFtaWVudG8gbWF0ZW1hdGljbywgY29ub2NpIHF1ZSBlcmEgbGFzIGhpcG90ZXNpcyBudWxhcyBvIGhpcG90ZXNpcyBhbHRlcm5hdGl2YS4KCk1hdGVyaWEgNC4gZXN0dXZvIHBhZHJlIHNvbG8gcXVlIG1lIGZ1ZSBtYWwgZW4gbGEgZXZpZGVuY2lhIHBvcnF1ZSBoaWNlIG1pIGdyYWJhY2lvbiBlbiB1biBhdHVlbmRvIG5vIHByb2Zlc2lvbmFsLCB0cmFlIHNob3J0cyB5IG1lIGJham8gcHVudG9zLiAKCk1hdGVyaWEgNS4gQmxvcXVlIGVuIGNvbmp1bnRvIGRlIGZpbmFsIGRlIG1lcmNhZG90ZWNuaWEgY29uIHVuIHBvY28gZGUgaW50ZWxpZ2VuY2lhIGRlIG5lZ29jaW9zCgpNYXRlcmlhIDYuIEZ1ZSByZXRhZG9yYSBlc2EgY2xhc2UsIGxhIGV2aWRlbmNpYSBlc3R1dm8gYmllbiByYXJhIHkgZGlmaWNpbCB5IGEgdG9kb3Mgbm9zIHNhbGllcm9uIHJlc3VsdGFkb3MgZGlmZXJlbnRlcyB5IGVsIGV4YW1lbiBlc3R1dm8gcGVzYWRvMAoKTWF0ZXJpYSA3LiBNZWpvciBjbGFzZSBjb24gZWwgcHJvZmVzc29yIHJhdWwgY2xhc2UgZGUgaW50cm9kdWNpb24gYSBSCgpNYXRlcmlhIDguIE5vIGVzIGRlIG1pcyBmYXZvcml0YXMgc2UgbWUgaGl6byBtdXkgbGFyZ2EgMTAgc2VtYW5hcyBkZSBjbGFzZSwgZXhhbWVuIGZpbmFsIHBlc2Fkby4KCk1hdGVyaWEgOS4gU2VtYW5hIFRlYyBkZSBCb290IGNhbXAgZGUgcHJvZ3JhbWFjaW9uIG11eSBidWVuYSBjbGFzZSBjb24gZWwgbWFlc3RybyBSYXVsLgoKTWF0ZXJpYSAxMC4gTWkgaW50ZXJjYW1iaW8gYSBsYSB1bml2ZXJzaWRhZCBkZSBTYW4gRGllZ28sIFVTQS4gCgojIDxzcGFuIHN0eWxlPSdjb2xvcjpicm93bjsnPiBBY3RpdmlkYWQgMi4gSGVyc2hleXMgPC9zcGFuPgoKIVtdKGh0dHBzOi8vY29va2luZ3BhbmRhLmNvbS9jZG4vc2hvcC9hcnRpY2xlcy9Hb29leV9DaG9jb2xhdGVfR2lmc184LmdpZj92PTE2NTI4MTUyOTUpCgpFbCBwcm9ww7NzaXRvIGRlIGVzdGEgYWN0aXZpZGFkIGVzIGFwbGljYXIgeS9vIGNvbnN0cnVpciBtb2RlbG9zIGRlIHNlcmllcyBkZSB0aWVtcG8sIGNvbiBlbCBvYmpldGl2byBkZSBnZW5lcmFyIGVzY2VuYXJpb3MgZnV0dXJvcyBjb25zaWRlcmFuZG8gbG9zIGRhdG9zIChwcmltYXJpb3MgeS9vIHNlY3VuZGFyaW9zKSAgcHJvcG9yY2lvbmFkb3MsIHV0aWxpemFuZG8gbGFzIGhlcnJhbWllbnRhcyBkZSBhbmFsw610aWNhIGRlIGRhdG9zIHkgcHJvbsOzc3RpY29zIGRlIHNlcmllcyBkZSB0aWVtcG8uIExhIGFjdGl2aWRhZCBkZXBlbmRlIGRlIGxvcyBkYXRvcyBkaXNwb25pYmxlcyBkZSBzb2NpbyBmb3JtYWRvciBvIGVsIGNhc28sIGFzaW1pc21vIGRlcGVuZGUgZGUgbGEgaW50ZW5jaW9uZXMgZXNwZWPDrWZpY2FzIHF1ZSBxdWllcmEgcmVmb3J6YXIgZWwgcHJvZmVzb3IuCgojIyA8c3BhbiBzdHlsZT0nY29sb3I6YnJvd247Jz4gTGVjdHVyYSBkZSBiYXNlIGRlIGRhdG9zIDwvc3Bhbj4KYGBge3J9CnZlbnRhcyA8LSByZWFkX3hsc3goIi9Vc2Vycy9zZWJhc3RpYW5lc3BpL0Rvd25sb2Fkcy9WZW50YXNfSGlzdG/MgXJpY2FzX0xlY2hpdGFzLnhsc3giKQpzdHIodmVudGFzKQpzdF92ZW50YXM8LSB0cyhkYXRhPXZlbnRhcywgc3RhcnQ9IGMoMjAxNywxKSwgZnJlcXVlbmN5ID0gMTIpCmBgYAoKIyMgPHNwYW4gc3R5bGU9J2NvbG9yOmJyb3duOyc+IENyZWFyIGVsIE1vZGVsbyBBUklNQSA8L3NwYW4+CmBgYHtyfQptb2RlbG9fdmVudGFzIDwtIGF1dG8uYXJpbWEoc3RfdmVudGFzKQptb2RlbG9fdmVudGFzCnN1bW1hcnkobW9kZWxvX3ZlbnRhcykKcHJvbm9zdGljb192ZW50YXMgPC0gZm9yZWNhc3QobW9kZWxvX3ZlbnRhcywgbGV2ZWw9Yyg5NSksIGg9MTIpCnBsb3QocHJvbm9zdGljb192ZW50YXMpCmBgYAoKCgoK