Forecast Pronóstico

Definición: Declaración sobre el valor futuro de una variable de interés.
Ejemplo: Walt Disney World tiene un departamento de 20 personas, dedicadas a realizar pronósticos de visitas para realizar pedidos de bebidas y alimentos.
Lema: Los pronósticos NO son perfectos.

Elementos para un mejor pronóstico:

  • Horizonte de tiempo
  • Preciso
  • Confiable
  • Unidades significativas
  • Simple de entender y usar
  • Costo-beneficio

6 Pasos para realizar un pronóstico:

  1. Determinar el propósito
  2. Establecer horizonte de tiempo
  3. Obtener, limpiar y analizar datos apropiados
  4. Seleccionar técnica para pronosticar
  5. Realizar el pronóstico
  6. Monitorear el error del pronóstico

Error: es la diferencia entre el valor real y el valor pronóstico.

Formula de Error
\[ \text{Error} = \text{Valor Real} - \text{Valor Pronosticado} \]

Mean Absolute Deviation (MAD)
\[ MAD = \frac{1}{n} \sum_{i=1}^{n} |y_i - \hat{y}_i| \]

Mean Squared Error (MAD)
\[ MSE = \frac{1}{n} \sum_{i=1}^{n} (y_i - \hat{y}_i)^2 \]

Mean Absolute Percent Error (MAPE)
\[ MAPE = \frac{1}{n} \sum_{i=1}^{n} \left| \frac{y_i - \hat{y}_i}{y_i} \right| \times 100\% \]

Series de Tiempo: Los pronósticos se observan en Series de Tiempo.

Los 5 Patrones en las Series de Tiempo son:

  1. Tendencia
  2. Ciclos
  3. Temporalidad
  4. Irregular
  5. Aleatorio

Series de Tiempo

0. Concepto

Una serie de tiempo es una colecci’on de observaciones sobre un determindado fenómeno efectuadas en momentos de tuempo sucesivos, usualmente equiespaciados.

Ejemplos de series de tiempos son: 1. Precio de acciones 2. Niveles de inventario 3. Rotación de personas 4. Ventas 5. Informes trimestrales

1. Instalar paquetes y llamar librerias

#install.packages("forecast")
library(forecast)
## Registered S3 method overwritten by 'quantmod':
##   method            from
##   as.zoo.data.frame zoo

2. Crea la serie de tiempo

# Paso 1. Obtener los valores dependientes
produccion <- c(50,53,55,57,55,60)

# Paso 2. Agregar a los valores anteriores su tiempo correspondiente (crear una serie de tiempo)
serie_de_tiempo <- ts(data = produccion, start = c(2020,1), frequency = 4)
#serie_de_tiempo <- ts(data = produccion, start = c(2020,4), frequency = 12) # para que arranque en abril con una frecuencia mensual
serie_de_tiempo
##      Qtr1 Qtr2 Qtr3 Qtr4
## 2020   50   53   55   57
## 2021   55   60

3. Crear modelo ARIMA

ARIMA: AutoRegressive Integrated Moving Average o Modelo Autorregresivo

Integrado de Media Movil

ARIMA (p,d,q)
+ “p” = orden de auto-regresion
+ “d” = orden de integracion (diferenciacion)
+ “q” = orden del promedio movil

¿Cuándo se usa?
Cuando las estimaciones futuras se explican por los datos del pasado y no por variables independientes.

Ejemplo: Tipo de Cambio

modelo <- auto.arima(serie_de_tiempo, D=1) # Se le agrega D cuando la grafica tiene temporalidad
modelo
## Series: serie_de_tiempo 
## 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)
## Series: serie_de_tiempo 
## 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

4. Realizar el Pronostico

pronostico <- forecast(modelo, level= c(99), h=5)
pronostico
##         Point Forecast    Lo 99    Hi 99
## 2021 Q3             61 57.34813 64.65187
## 2021 Q4             63 59.34813 66.65187
## 2022 Q1             61 57.34813 64.65187
## 2022 Q2             66 62.34813 69.65187
## 2022 Q3             67 61.83547 72.16453
plot(pronostico)

Banco Mundial

0. Concepto

El Banco Mundial (WB) es un organismo multinacional especializado en finanzas.

En R se puede acceder a sus indicadores a través de la librería WBI.

1. Instalar paquetes y llamar librerias

#install.packages("WDI")
#install.packages("wbstats")
#install.packages("tidyverse")

library(WDI)
library(wbstats)
library(tidyverse)
## ── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
## ✔ dplyr     1.1.2     ✔ 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

2. Crea la serie de tiempo

# Paso 1. Obtener los valores dependientes
gdp_data <- wb_data(country = "MX", indicator = "NY.GDP.MKTP.CD", start_date = 1973, end_date = 2022)
gdp_data
## # A tibble: 50 × 9
##    iso2c iso3c country  date NY.GDP.MKTP.CD unit  obs_status footnote
##    <chr> <chr> <chr>   <dbl>          <dbl> <chr> <chr>      <chr>   
##  1 MX    MEX   Mexico   1973   55280212668. <NA>  <NA>       <NA>    
##  2 MX    MEX   Mexico   1974   72000179026. <NA>  <NA>       <NA>    
##  3 MX    MEX   Mexico   1975   88000000000  <NA>  <NA>       <NA>    
##  4 MX    MEX   Mexico   1976   88876787991. <NA>  <NA>       <NA>    
##  5 MX    MEX   Mexico   1977   81912502624. <NA>  <NA>       <NA>    
##  6 MX    MEX   Mexico   1978  102647292867. <NA>  <NA>       <NA>    
##  7 MX    MEX   Mexico   1979  134529639572. <NA>  <NA>       <NA>    
##  8 MX    MEX   Mexico   1980  205576980832. <NA>  <NA>       <NA>    
##  9 MX    MEX   Mexico   1981  263802132209. <NA>  <NA>       <NA>    
## 10 MX    MEX   Mexico   1982  184603593511. <NA>  <NA>       <NA>    
## # ℹ 40 more rows
## # ℹ 1 more variable: last_updated <date>
# Paso 2. Agregar a los valores anteriores su tiempo correspondiente (crear una serie de tiempo)
serie_de_tiempo <- ts(data = gdp_data$NY.GDP.MKTP.CD, start = c(1973), frequency = 1)
#serie_de_tiempo <- ts(data = produccion, start = c(2020,4), frequency = 12) # para que arranque en abril con una frecuencia mensual
serie_de_tiempo
## Time Series:
## Start = 1973 
## End = 2022 
## Frequency = 1 
##  [1] 5.528021e+10 7.200018e+10 8.800000e+10 8.887679e+10 8.191250e+10
##  [6] 1.026473e+11 1.345296e+11 2.055770e+11 2.638021e+11 1.846036e+11
## [11] 1.561675e+11 1.842312e+11 1.952414e+11 1.345561e+11 1.475426e+11
## [16] 1.816112e+11 2.214031e+11 2.612537e+11 3.131397e+11 3.631578e+11
## [21] 5.007334e+11 5.278106e+11 3.600725e+11 4.109730e+11 5.004160e+11
## [26] 5.264997e+11 6.002330e+11 7.079099e+11 7.567029e+11 7.721097e+11
## [31] 7.293350e+11 7.822429e+11 8.774769e+11 9.753834e+11 1.052697e+12
## [36] 1.109987e+12 9.000470e+11 1.057801e+12 1.180487e+12 1.201094e+12
## [41] 1.274444e+12 1.315356e+12 1.171870e+12 1.078493e+12 1.158912e+12
## [46] 1.222406e+12 1.269010e+12 1.090515e+12 1.272839e+12 1.414187e+12
## attr(,"label")
## [1] GDP (current US$)

3. Crear modelo ARIMA

modelo <- auto.arima(serie_de_tiempo) # Se le agrega D cuando la grafica tiene temporalidad
modelo
## Series: serie_de_tiempo 
## ARIMA(0,1,0) 
## 
## sigma^2 = 7.381e+21:  log likelihood = -1303.18
## AIC=2608.36   AICc=2608.44   BIC=2610.25
summary(modelo)
## Series: serie_de_tiempo 
## ARIMA(0,1,0) 
## 
## sigma^2 = 7.381e+21:  log likelihood = -1303.18
## AIC=2608.36   AICc=2608.44   BIC=2610.25
## 
## Training set error measures:
##                       ME        RMSE         MAE      MPE     MAPE     MASE
## Training set 27179245230 85046847387 67623045592 4.943879 14.05421 0.980016
##                     ACF1
## Training set -0.01519178

4. Realizar el Pronostico

pronostico <- forecast(modelo, level= c(95), h=5)
pronostico
##      Point Forecast        Lo 95        Hi 95
## 2023   1.414187e+12 1.245806e+12 1.582568e+12
## 2024   1.414187e+12 1.176060e+12 1.652314e+12
## 2025   1.414187e+12 1.122543e+12 1.705832e+12
## 2026   1.414187e+12 1.077425e+12 1.750949e+12
## 2027   1.414187e+12 1.037676e+12 1.790699e+12
plot(pronostico)

LS0tCnRpdGxlOiAiTUFBY3Q0OCIKYXV0aG9yOiAiRXN0ZWZhbnkgVmlsbGFsb2JvcyIKZGF0ZTogIjIwMjMtMDktMjkiCm91dHB1dDogCiAgaHRtbF9kb2N1bWVudDoKICAgIHRvYzogVFJVRQogICAgdG9jX2Zsb2F0OiBUUlVFCiAgICBjb2RlX2Rvd25sb2FkOiBUUlVFCiAgICB0aGVtZTogInNhbmRzdG9uZSIKICAgIGhpZ2hsaWdodDogImVzcHJlc3NvIgotLS0KCiMgKipGb3JlY2FzdCBQcm9uw7NzdGljbyoqICAgCioqRGVmaW5pY2nDs246KiogRGVjbGFyYWNpw7NuIHNvYnJlIGVsIHZhbG9yIGZ1dHVybyBkZSB1bmEgdmFyaWFibGUgZGUgaW50ZXLDqXMuICAgCioqRWplbXBsbzoqKiBXYWx0IERpc25leSBXb3JsZCB0aWVuZSB1biBkZXBhcnRhbWVudG8gZGUgMjAgcGVyc29uYXMsIGRlZGljYWRhcyBhIHJlYWxpemFyIHByb27Ds3N0aWNvcyBkZSB2aXNpdGFzIHBhcmEgcmVhbGl6YXIgcGVkaWRvcyBkZSBiZWJpZGFzIHkgYWxpbWVudG9zLiAgIAoqKkxlbWE6KiogTG9zIHByb27Ds3N0aWNvcyBOTyBzb24gcGVyZmVjdG9zLiAgCgojIyMgKipFbGVtZW50b3MgcGFyYSB1biBtZWpvciBwcm9uw7NzdGljbzoqKiAgCisgSG9yaXpvbnRlIGRlIHRpZW1wbyAgCisgUHJlY2lzbyAgIAorIENvbmZpYWJsZSAgCisgVW5pZGFkZXMgc2lnbmlmaWNhdGl2YXMgIAorIFNpbXBsZSBkZSBlbnRlbmRlciB5IHVzYXIgICAKKyBDb3N0by1iZW5lZmljaW8gICAKCiMjIyAqKjYgUGFzb3MgcGFyYSByZWFsaXphciB1biBwcm9uw7NzdGljbzoqKiAgIAoxLiBEZXRlcm1pbmFyIGVsIHByb3DDs3NpdG8gICAKMi4gRXN0YWJsZWNlciBob3Jpem9udGUgZGUgdGllbXBvICAgCjMuIE9idGVuZXIsIGxpbXBpYXIgeSBhbmFsaXphciBkYXRvcyBhcHJvcGlhZG9zICAgCjQuIFNlbGVjY2lvbmFyIHTDqWNuaWNhIHBhcmEgcHJvbm9zdGljYXIgICAKNS4gUmVhbGl6YXIgZWwgcHJvbsOzc3RpY28gIAo2LiBNb25pdG9yZWFyIGVsIGVycm9yIGRlbCBwcm9uw7NzdGljbyAgIAoKKipFcnJvcjoqKiBlcyBsYSBkaWZlcmVuY2lhIGVudHJlIGVsIHZhbG9yIHJlYWwgeSBlbCB2YWxvciBwcm9uw7NzdGljby4gICAKCkZvcm11bGEgZGUgRXJyb3IgICAKXFsKXHRleHR7RXJyb3J9ID0gXHRleHR7VmFsb3IgUmVhbH0gLSBcdGV4dHtWYWxvciBQcm9ub3N0aWNhZG99ClxdCgpNZWFuIEFic29sdXRlIERldmlhdGlvbiAoTUFEKSAgIApcWwpNQUQgPSBcZnJhY3sxfXtufSBcc3VtX3tpPTF9XntufSB8eV9pIC0gXGhhdHt5fV9pfApcXQoKTWVhbiBTcXVhcmVkIEVycm9yIChNQUQpICAgClxbCk1TRSA9IFxmcmFjezF9e259IFxzdW1fe2k9MX1ee259ICh5X2kgLSBcaGF0e3l9X2kpXjIKXF0KCk1lYW4gQWJzb2x1dGUgUGVyY2VudCBFcnJvciAoTUFQRSkgICAKXFsKTUFQRSA9IFxmcmFjezF9e259IFxzdW1fe2k9MX1ee259IFxsZWZ0fCBcZnJhY3t5X2kgLSBcaGF0e3l9X2l9e3lfaX0gXHJpZ2h0fCBcdGltZXMgMTAwXCUKXF0KCioqU2VyaWVzIGRlIFRpZW1wbzoqKiBMb3MgcHJvbsOzc3RpY29zIHNlIG9ic2VydmFuIGVuIFNlcmllcyBkZSBUaWVtcG8uICAgIAoKIyMjICoqTG9zIDUgUGF0cm9uZXMgZW4gbGFzIFNlcmllcyBkZSBUaWVtcG8gc29uOioqICAgCgohW10oL1VzZXJzL2VzdGVmYW55dmlsbGFsb2Jvcy9EZXNrdG9wL1NjcmVlbiBTaG90IDIwMjMtMDktMzAgYXQgMjAuMjkuNDUucG5nKQoKYS4gVGVuZGVuY2lhICAKYi4gQ2ljbG9zICAKYy4gVGVtcG9yYWxpZGFkICAKZC4gSXJyZWd1bGFyICAgCmUuIEFsZWF0b3JpbyAgCgojIDxzcGFuIHN0eWxlPSJjb2xvcjogb3JhbmdlOyI+KipTZXJpZXMgZGUgVGllbXBvKio8L3NwYW4+ICAgCgojIyA8c3BhbiBzdHlsZT0iY29sb3I6IG9yYW5nZTsiPjAuIENvbmNlcHRvPC9zcGFuPiAgClVuYSAqKnNlcmllIGRlIHRpZW1wbyoqIGVzIHVuYSBjb2xlY2NpJ29uIGRlIG9ic2VydmFjaW9uZXMgc29icmUgdW4gZGV0ZXJtaW5kYWRvIGZlbsOzbWVubyBlZmVjdHVhZGFzIGVuIG1vbWVudG9zIGRlIHR1ZW1wbyBzdWNlc2l2b3MsIHVzdWFsbWVudGUgZXF1aWVzcGFjaWFkb3MuICAgCgoqKkVqZW1wbG9zIGRlIHNlcmllcyBkZSB0aWVtcG9zIHNvbjoqKgoxLiBQcmVjaW8gZGUgYWNjaW9uZXMKMi4gTml2ZWxlcyBkZSBpbnZlbnRhcmlvCjMuIFJvdGFjacOzbiBkZSBwZXJzb25hcwo0LiBWZW50YXMKNS4gSW5mb3JtZXMgdHJpbWVzdHJhbGVzCgojIyA8c3BhbiBzdHlsZT0iY29sb3I6IG9yYW5nZTsiPjEuIEluc3RhbGFyIHBhcXVldGVzIHkgbGxhbWFyIGxpYnJlcmlhczwvc3Bhbj4KYGBge3J9CiNpbnN0YWxsLnBhY2thZ2VzKCJmb3JlY2FzdCIpCmxpYnJhcnkoZm9yZWNhc3QpCmBgYAoKIyMgPHNwYW4gc3R5bGU9ImNvbG9yOiBvcmFuZ2U7Ij4yLiBDcmVhIGxhIHNlcmllIGRlIHRpZW1wbzwvc3Bhbj4KYGBge3J9CiMgUGFzbyAxLiBPYnRlbmVyIGxvcyB2YWxvcmVzIGRlcGVuZGllbnRlcwpwcm9kdWNjaW9uIDwtIGMoNTAsNTMsNTUsNTcsNTUsNjApCgojIFBhc28gMi4gQWdyZWdhciBhIGxvcyB2YWxvcmVzIGFudGVyaW9yZXMgc3UgdGllbXBvIGNvcnJlc3BvbmRpZW50ZSAoY3JlYXIgdW5hIHNlcmllIGRlIHRpZW1wbykKc2VyaWVfZGVfdGllbXBvIDwtIHRzKGRhdGEgPSBwcm9kdWNjaW9uLCBzdGFydCA9IGMoMjAyMCwxKSwgZnJlcXVlbmN5ID0gNCkKI3NlcmllX2RlX3RpZW1wbyA8LSB0cyhkYXRhID0gcHJvZHVjY2lvbiwgc3RhcnQgPSBjKDIwMjAsNCksIGZyZXF1ZW5jeSA9IDEyKSAjIHBhcmEgcXVlIGFycmFucXVlIGVuIGFicmlsIGNvbiB1bmEgZnJlY3VlbmNpYSBtZW5zdWFsCnNlcmllX2RlX3RpZW1wbwpgYGAKCiMjIDxzcGFuIHN0eWxlPSJjb2xvcjogb3JhbmdlOyI+My4gQ3JlYXIgbW9kZWxvIEFSSU1BPC9zcGFuPgoKKipBUklNQToqKiBBdXRvUmVncmVzc2l2ZSBJbnRlZ3JhdGVkIE1vdmluZyBBdmVyYWdlIG8gTW9kZWxvIEF1dG9ycmVncmVzaXZvCgpJbnRlZ3JhZG8gZGUgTWVkaWEgTW92aWwgIAoKKipBUklNQSAocCxkLHEpKiogIAorICJwIiA9IG9yZGVuIGRlIGF1dG8tcmVncmVzaW9uICAKKyAiZCIgPSBvcmRlbiBkZSBpbnRlZ3JhY2lvbiAoZGlmZXJlbmNpYWNpb24pICAKKyAicSIgPSBvcmRlbiBkZWwgcHJvbWVkaW8gbW92aWwgIAoKKirCv0N1w6FuZG8gc2UgdXNhPyoqICAgCkN1YW5kbyBsYXMgZXN0aW1hY2lvbmVzIGZ1dHVyYXMgc2UgZXhwbGljYW4gcG9yIGxvcyBkYXRvcyBkZWwgcGFzYWRvIHkgbm8gcG9yIHZhcmlhYmxlcyBpbmRlcGVuZGllbnRlcy4gICAKCioqRWplbXBsbzoqKiBUaXBvIGRlIENhbWJpbyAgCgpgYGB7cn0KbW9kZWxvIDwtIGF1dG8uYXJpbWEoc2VyaWVfZGVfdGllbXBvLCBEPTEpICMgU2UgbGUgYWdyZWdhIEQgY3VhbmRvIGxhIGdyYWZpY2EgdGllbmUgdGVtcG9yYWxpZGFkCm1vZGVsbwpzdW1tYXJ5KG1vZGVsbykKYGBgCiMjIDxzcGFuIHN0eWxlPSJjb2xvcjogb3JhbmdlOyI+NC4gUmVhbGl6YXIgZWwgUHJvbm9zdGljbzwvc3Bhbj4KCmBgYHtyfQpwcm9ub3N0aWNvIDwtIGZvcmVjYXN0KG1vZGVsbywgbGV2ZWw9IGMoOTkpLCBoPTUpCnByb25vc3RpY28KcGxvdChwcm9ub3N0aWNvKQpgYGAKCiAgCiMgPHNwYW4gc3R5bGU9ImNvbG9yOiBkYXJrYmx1ZTsiPioqQmFuY28gTXVuZGlhbCoqPC9zcGFuPiAgIAoKIyMgPHNwYW4gc3R5bGU9ImNvbG9yOiBkYXJrYmx1ZTsiPjAuIENvbmNlcHRvPC9zcGFuPiAgCkVsICoqQmFuY28gTXVuZGlhbCAoV0IpKiogZXMgdW4gb3JnYW5pc21vIG11bHRpbmFjaW9uYWwgZXNwZWNpYWxpemFkbyBlbiBmaW5hbnphcy4gIAoKRW4gUiBzZSBwdWVkZSBhY2NlZGVyIGEgc3VzIGluZGljYWRvcmVzIGEgdHJhdsOpcyBkZSBsYSBsaWJyZXLDrWEgV0JJLiAgCgojIyA8c3BhbiBzdHlsZT0iY29sb3I6IGRhcmtibHVlOyI+MS4gSW5zdGFsYXIgcGFxdWV0ZXMgeSBsbGFtYXIgbGlicmVyaWFzPC9zcGFuPgpgYGB7cn0KI2luc3RhbGwucGFja2FnZXMoIldESSIpCiNpbnN0YWxsLnBhY2thZ2VzKCJ3YnN0YXRzIikKI2luc3RhbGwucGFja2FnZXMoInRpZHl2ZXJzZSIpCgpsaWJyYXJ5KFdESSkKbGlicmFyeSh3YnN0YXRzKQpsaWJyYXJ5KHRpZHl2ZXJzZSkKYGBgCgojIyA8c3BhbiBzdHlsZT0iY29sb3I6IGRhcmtibHVlOyI+Mi4gQ3JlYSBsYSBzZXJpZSBkZSB0aWVtcG88L3NwYW4+CmBgYHtyfQojIFBhc28gMS4gT2J0ZW5lciBsb3MgdmFsb3JlcyBkZXBlbmRpZW50ZXMKZ2RwX2RhdGEgPC0gd2JfZGF0YShjb3VudHJ5ID0gIk1YIiwgaW5kaWNhdG9yID0gIk5ZLkdEUC5NS1RQLkNEIiwgc3RhcnRfZGF0ZSA9IDE5NzMsIGVuZF9kYXRlID0gMjAyMikKZ2RwX2RhdGEKCiMgUGFzbyAyLiBBZ3JlZ2FyIGEgbG9zIHZhbG9yZXMgYW50ZXJpb3JlcyBzdSB0aWVtcG8gY29ycmVzcG9uZGllbnRlIChjcmVhciB1bmEgc2VyaWUgZGUgdGllbXBvKQpzZXJpZV9kZV90aWVtcG8gPC0gdHMoZGF0YSA9IGdkcF9kYXRhJE5ZLkdEUC5NS1RQLkNELCBzdGFydCA9IGMoMTk3MyksIGZyZXF1ZW5jeSA9IDEpCiNzZXJpZV9kZV90aWVtcG8gPC0gdHMoZGF0YSA9IHByb2R1Y2Npb24sIHN0YXJ0ID0gYygyMDIwLDQpLCBmcmVxdWVuY3kgPSAxMikgIyBwYXJhIHF1ZSBhcnJhbnF1ZSBlbiBhYnJpbCBjb24gdW5hIGZyZWN1ZW5jaWEgbWVuc3VhbApzZXJpZV9kZV90aWVtcG8KYGBgCgojIyA8c3BhbiBzdHlsZT0iY29sb3I6IGRhcmtibHVlOyI+My4gQ3JlYXIgbW9kZWxvIEFSSU1BPC9zcGFuPgoKYGBge3J9Cm1vZGVsbyA8LSBhdXRvLmFyaW1hKHNlcmllX2RlX3RpZW1wbykgIyBTZSBsZSBhZ3JlZ2EgRCBjdWFuZG8gbGEgZ3JhZmljYSB0aWVuZSB0ZW1wb3JhbGlkYWQKbW9kZWxvCnN1bW1hcnkobW9kZWxvKQpgYGAKIyMgPHNwYW4gc3R5bGU9ImNvbG9yOiBkYXJrYmx1ZTsiPjQuIFJlYWxpemFyIGVsIFByb25vc3RpY288L3NwYW4+CgpgYGB7cn0KcHJvbm9zdGljbyA8LSBmb3JlY2FzdChtb2RlbG8sIGxldmVsPSBjKDk1KSwgaD01KQpwcm9ub3N0aWNvCnBsb3QocHJvbm9zdGljbykKYGBgCgoKCg==