Hotel Mirage

El Hotel Mirage necesita conocer la demanda de sus servicios durante el tiempo para poder asignar una mayor o menor cantidad de presupuesto a su operatividad. Debido a que es un hotel nuevo, solamente cuenta con información de los 12 meses en los que ha estado operativo.

Datos originales

library(boot)

ocupacion <- c(78, 82, 75, 80, 85, 88, 92, 90, 86, 84, 80, 83)

Función para calcular la media

bootstrap_media <- function(data, indices) {
  return(mean(data[indices]))
}

La ocupación promedio observada durante los 12 meses es de aproximadamente 83.58%.

Bootstrap con 1000 repeticiones

set.seed(616)

bootstrap_result <- boot(data = ocupacion,
                         statistic = bootstrap_media,
                         R = 1000)

print(bootstrap_result)
## 
## ORDINARY NONPARAMETRIC BOOTSTRAP
## 
## 
## Call:
## boot(data = ocupacion, statistic = bootstrap_media, R = 1000)
## 
## 
## Bootstrap Statistics :
##     original     bias    std. error
## t1* 83.58333 0.07033333    1.358444

Intervalo de confianza con 1000 repeticiones

intervalo_confianza <- boot.ci(bootstrap_result, type = "perc")

print(intervalo_confianza)
## BOOTSTRAP CONFIDENCE INTERVAL CALCULATIONS
## Based on 1000 bootstrap replicates
## 
## CALL : 
## boot.ci(boot.out = bootstrap_result, type = "perc")
## 
## Intervals : 
## Level     Percentile     
## 95%   (81.00, 86.42 )  
## Calculations and Intervals on Original Scale
hist(bootstrap_result$t,
     main = "Distribución Bootstrap de la Ocupación",
     xlab = "Ocupación promedio",
     col = "lightblue",
     border = "black")

Con 1000 repeticiones, el intervalo de confianza del 95% se encuentra aproximadamente entre 81% y 86.3%. Esto indica el rango en el que podría esperarse que se encuentre la ocupación promedio del hotel para el siguiente periodo, tomando como base los datos disponibles.

Bootstrap con 100000 repeticiones

set.seed(616)

bootstrap_result_100000 <- boot(data = ocupacion,
                                statistic = bootstrap_media,
                                R = 100000)

print(bootstrap_result_100000)
## 
## ORDINARY NONPARAMETRIC BOOTSTRAP
## 
## 
## Call:
## boot(data = ocupacion, statistic = bootstrap_media, R = 1e+05)
## 
## 
## Bootstrap Statistics :
##     original       bias    std. error
## t1* 83.58333 -0.003584167    1.374485

Intervalo de confianza con 100000 repeticiones

intervalo_confianza_100000 <- boot.ci(bootstrap_result_100000,
                                      type = "perc")

print(intervalo_confianza_100000)
## BOOTSTRAP CONFIDENCE INTERVAL CALCULATIONS
## Based on 100000 bootstrap replicates
## 
## CALL : 
## boot.ci(boot.out = bootstrap_result_100000, type = "perc")
## 
## Intervals : 
## Level     Percentile     
## 95%   (80.92, 86.25 )  
## Calculations and Intervals on Original Scale
hist(bootstrap_result_100000$t,
     main = "Distribución Bootstrap con 100000 repeticiones",
     xlab = "Ocupación promedio",
     col = "lightblue",
     border = "black")

Al aumentar de 1000 a 100000 repeticiones, el intervalo cambia muy poco y se mantiene aproximadamente entre 80.9% y 86.3%. La principal diferencia es que con una mayor cantidad de repeticiones el resultado se vuelve más estable y disminuye la variación causada por el proceso aleatorio del bootstrap.

Corrección de la ocupación de diciembre

El dueño del hotel indicó que la ocupación de diciembre no fue de 83%, sino de 73%. Por lo tanto, se modifican los datos originales.

ocupacion_corregida <- c(78, 82, 75, 80, 85, 88, 92, 90, 86, 84, 80, 73)

mean(ocupacion_corregida)
## [1] 82.75

Con esta corrección, la ocupación promedio baja de 83.58% a 82.75%.

Bootstrap corregido con 1000 repeticiones

set.seed(616)

bootstrap_corregido <- boot(data = ocupacion_corregida,
                            statistic = bootstrap_media,
                            R = 1000)

print(bootstrap_corregido)
## 
## ORDINARY NONPARAMETRIC BOOTSTRAP
## 
## 
## Call:
## boot(data = ocupacion_corregida, statistic = bootstrap_media, 
##     R = 1000)
## 
## 
## Bootstrap Statistics :
##     original  bias    std. error
## t1*    82.75  0.0545    1.605597

Intervalo corregido con 1000 repeticiones

intervalo_corregido <- boot.ci(bootstrap_corregido, type = "perc")

print(intervalo_corregido)
## BOOTSTRAP CONFIDENCE INTERVAL CALCULATIONS
## Based on 1000 bootstrap replicates
## 
## CALL : 
## boot.ci(boot.out = bootstrap_corregido, type = "perc")
## 
## Intervals : 
## Level     Percentile     
## 95%   (79.67, 86.00 )  
## Calculations and Intervals on Original Scale
hist(bootstrap_corregido$t,
     main = "Bootstrap con diciembre corregido",
     xlab = "Ocupación promedio",
     col = "lightblue",
     border = "black")

Después de corregir diciembre, el intervalo de confianza se encuentra aproximadamente entre 79.6% y 85.9%. En comparación con los datos originales, la media disminuye y el límite inferior del intervalo ahora puede caer por debajo del 80%.

Bootstrap corregido con 100000 repeticiones

set.seed(616)

bootstrap_corregido_100000 <- boot(data = ocupacion_corregida,
                                   statistic = bootstrap_media,
                                   R = 100000)

print(bootstrap_corregido_100000)
## 
## ORDINARY NONPARAMETRIC BOOTSTRAP
## 
## 
## Call:
## boot(data = ocupacion_corregida, statistic = bootstrap_media, 
##     R = 1e+05)
## 
## 
## Bootstrap Statistics :
##     original     bias    std. error
## t1*    82.75 -0.0033175    1.610442

Intervalo corregido con 100000 repeticiones

intervalo_corregido_100000 <- boot.ci(bootstrap_corregido_100000,
                                      type = "perc")

print(intervalo_corregido_100000)
## BOOTSTRAP CONFIDENCE INTERVAL CALCULATIONS
## Based on 100000 bootstrap replicates
## 
## CALL : 
## boot.ci(boot.out = bootstrap_corregido_100000, type = "perc")
## 
## Intervals : 
## Level     Percentile     
## 95%   (79.58, 85.92 )  
## Calculations and Intervals on Original Scale
hist(bootstrap_corregido_100000$t,
     main = "Bootstrap corregido con 100000 repeticiones",
     xlab = "Ocupación promedio",
     col = "lightblue",
     border = "black")

Con 100000 repeticiones, el resultado vuelve a ser muy parecido al obtenido con 1000 repeticiones y se estabiliza aproximadamente entre 79.6% y 85.9%.

Acciones recomendadas si la ocupación cae por debajo del 80%

Si la ocupación del Hotel Mirage cae por debajo del 80%, una de las primeras acciones sería reducir gastos variables que no sean indispensables, sin afectar la calidad del servicio. También se podrían utilizar promociones durante los días o temporadas con menor demanda, ofrecer paquetes con servicios incluidos y dar descuentos por reservaciones anticipadas.

Otra opción sería aumentar la publicidad en redes sociales y crear convenios con empresas, agencias de viaje o plataformas de reservaciones para atraer más huéspedes. Es importante que el hotel no reduzca gastos relacionados directamente con la experiencia del cliente, ya que una disminución en la calidad del servicio podría provocar malas reseñas y reducir todavía más la demanda.

Conclusión

El bootstrap permite estimar el comportamiento de la ocupación del Hotel Mirage aunque solamente se tenga información de 12 meses. Con los datos originales, la ocupación promedio es de aproximadamente 83.58% y el intervalo de confianza se encuentra alrededor de 81% a 86.3%. Al aumentar las repeticiones de 1000 a 100000, los resultados cambian muy poco, pero se vuelven más estables.

Cuando se corrige la ocupación de diciembre de 83% a 73%, la media disminuye a 82.75% y el intervalo se amplía aproximadamente de 79.6% a 85.9%. Esto muestra que ahora existe una mayor posibilidad de que la ocupación caiga por debajo del 80%. En ese caso, el hotel debería utilizar promociones, publicidad, convenios y control de gastos para reducir el riesgo de pérdidas económicas.

LS0tCnRpdGxlOiAiRWplcmNpY2lvIGRlIEJvb3RzdHJhcCAtIEhvdGVsIE1pcmFnZSIKYXV0aG9yOiAiUmFmYWVsIE5hdmFycm8gR2FyemEiCm91dHB1dDoKICBodG1sX2RvY3VtZW50OgogICAgdG9jOiBUUlVFCiAgICB0b2NfZmxvYXQ6IFRSVUUKICAgIGNvZGVfZG93bmxvYWQ6IFRSVUUKZGF0ZTogIjIwMjYtMDgtMTkiCi0tLQoKIyBIb3RlbCBNaXJhZ2UKCkVsIEhvdGVsIE1pcmFnZSBuZWNlc2l0YSBjb25vY2VyIGxhIGRlbWFuZGEgZGUgc3VzIHNlcnZpY2lvcyBkdXJhbnRlIGVsIHRpZW1wbyBwYXJhIHBvZGVyIGFzaWduYXIgdW5hIG1heW9yIG8gbWVub3IgY2FudGlkYWQgZGUgcHJlc3VwdWVzdG8gYSBzdSBvcGVyYXRpdmlkYWQuIERlYmlkbyBhIHF1ZSBlcyB1biBob3RlbCBudWV2bywgc29sYW1lbnRlIGN1ZW50YSBjb24gaW5mb3JtYWNpw7NuIGRlIGxvcyAxMiBtZXNlcyBlbiBsb3MgcXVlIGhhIGVzdGFkbyBvcGVyYXRpdm8uCgojIERhdG9zIG9yaWdpbmFsZXMKCmBgYHtyfQpsaWJyYXJ5KGJvb3QpCgpvY3VwYWNpb24gPC0gYyg3OCwgODIsIDc1LCA4MCwgODUsIDg4LCA5MiwgOTAsIDg2LCA4NCwgODAsIDgzKQpgYGAKCiMgRnVuY2nDs24gcGFyYSBjYWxjdWxhciBsYSBtZWRpYQoKYGBge3J9CmJvb3RzdHJhcF9tZWRpYSA8LSBmdW5jdGlvbihkYXRhLCBpbmRpY2VzKSB7CiAgcmV0dXJuKG1lYW4oZGF0YVtpbmRpY2VzXSkpCn0KYGBgCgpMYSBvY3VwYWNpw7NuIHByb21lZGlvIG9ic2VydmFkYSBkdXJhbnRlIGxvcyAxMiBtZXNlcyBlcyBkZSBhcHJveGltYWRhbWVudGUgODMuNTglLgoKIyBCb290c3RyYXAgY29uIDEwMDAgcmVwZXRpY2lvbmVzCgpgYGB7cn0Kc2V0LnNlZWQoNjE2KQoKYm9vdHN0cmFwX3Jlc3VsdCA8LSBib290KGRhdGEgPSBvY3VwYWNpb24sCiAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aXN0aWMgPSBib290c3RyYXBfbWVkaWEsCiAgICAgICAgICAgICAgICAgICAgICAgICBSID0gMTAwMCkKCnByaW50KGJvb3RzdHJhcF9yZXN1bHQpCmBgYAoKIyBJbnRlcnZhbG8gZGUgY29uZmlhbnphIGNvbiAxMDAwIHJlcGV0aWNpb25lcwoKYGBge3J9CmludGVydmFsb19jb25maWFuemEgPC0gYm9vdC5jaShib290c3RyYXBfcmVzdWx0LCB0eXBlID0gInBlcmMiKQoKcHJpbnQoaW50ZXJ2YWxvX2NvbmZpYW56YSkKYGBgCgpgYGB7cn0KaGlzdChib290c3RyYXBfcmVzdWx0JHQsCiAgICAgbWFpbiA9ICJEaXN0cmlidWNpw7NuIEJvb3RzdHJhcCBkZSBsYSBPY3VwYWNpw7NuIiwKICAgICB4bGFiID0gIk9jdXBhY2nDs24gcHJvbWVkaW8iLAogICAgIGNvbCA9ICJsaWdodGJsdWUiLAogICAgIGJvcmRlciA9ICJibGFjayIpCmBgYAoKQ29uIDEwMDAgcmVwZXRpY2lvbmVzLCBlbCBpbnRlcnZhbG8gZGUgY29uZmlhbnphIGRlbCA5NSUgc2UgZW5jdWVudHJhIGFwcm94aW1hZGFtZW50ZSBlbnRyZSA4MSUgeSA4Ni4zJS4gRXN0byBpbmRpY2EgZWwgcmFuZ28gZW4gZWwgcXVlIHBvZHLDrWEgZXNwZXJhcnNlIHF1ZSBzZSBlbmN1ZW50cmUgbGEgb2N1cGFjacOzbiBwcm9tZWRpbyBkZWwgaG90ZWwgcGFyYSBlbCBzaWd1aWVudGUgcGVyaW9kbywgdG9tYW5kbyBjb21vIGJhc2UgbG9zIGRhdG9zIGRpc3BvbmlibGVzLgoKIyBCb290c3RyYXAgY29uIDEwMDAwMCByZXBldGljaW9uZXMKCmBgYHtyfQpzZXQuc2VlZCg2MTYpCgpib290c3RyYXBfcmVzdWx0XzEwMDAwMCA8LSBib290KGRhdGEgPSBvY3VwYWNpb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGlzdGljID0gYm9vdHN0cmFwX21lZGlhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFIgPSAxMDAwMDApCgpwcmludChib290c3RyYXBfcmVzdWx0XzEwMDAwMCkKYGBgCgojIEludGVydmFsbyBkZSBjb25maWFuemEgY29uIDEwMDAwMCByZXBldGljaW9uZXMKCmBgYHtyfQppbnRlcnZhbG9fY29uZmlhbnphXzEwMDAwMCA8LSBib290LmNpKGJvb3RzdHJhcF9yZXN1bHRfMTAwMDAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUgPSAicGVyYyIpCgpwcmludChpbnRlcnZhbG9fY29uZmlhbnphXzEwMDAwMCkKYGBgCgpgYGB7cn0KaGlzdChib290c3RyYXBfcmVzdWx0XzEwMDAwMCR0LAogICAgIG1haW4gPSAiRGlzdHJpYnVjacOzbiBCb290c3RyYXAgY29uIDEwMDAwMCByZXBldGljaW9uZXMiLAogICAgIHhsYWIgPSAiT2N1cGFjacOzbiBwcm9tZWRpbyIsCiAgICAgY29sID0gImxpZ2h0Ymx1ZSIsCiAgICAgYm9yZGVyID0gImJsYWNrIikKYGBgCgpBbCBhdW1lbnRhciBkZSAxMDAwIGEgMTAwMDAwIHJlcGV0aWNpb25lcywgZWwgaW50ZXJ2YWxvIGNhbWJpYSBtdXkgcG9jbyB5IHNlIG1hbnRpZW5lIGFwcm94aW1hZGFtZW50ZSBlbnRyZSA4MC45JSB5IDg2LjMlLiBMYSBwcmluY2lwYWwgZGlmZXJlbmNpYSBlcyBxdWUgY29uIHVuYSBtYXlvciBjYW50aWRhZCBkZSByZXBldGljaW9uZXMgZWwgcmVzdWx0YWRvIHNlIHZ1ZWx2ZSBtw6FzIGVzdGFibGUgeSBkaXNtaW51eWUgbGEgdmFyaWFjacOzbiBjYXVzYWRhIHBvciBlbCBwcm9jZXNvIGFsZWF0b3JpbyBkZWwgYm9vdHN0cmFwLgoKIyBDb3JyZWNjacOzbiBkZSBsYSBvY3VwYWNpw7NuIGRlIGRpY2llbWJyZQoKRWwgZHVlw7FvIGRlbCBob3RlbCBpbmRpY8OzIHF1ZSBsYSBvY3VwYWNpw7NuIGRlIGRpY2llbWJyZSBubyBmdWUgZGUgODMlLCBzaW5vIGRlIDczJS4gUG9yIGxvIHRhbnRvLCBzZSBtb2RpZmljYW4gbG9zIGRhdG9zIG9yaWdpbmFsZXMuCgpgYGB7cn0Kb2N1cGFjaW9uX2NvcnJlZ2lkYSA8LSBjKDc4LCA4MiwgNzUsIDgwLCA4NSwgODgsIDkyLCA5MCwgODYsIDg0LCA4MCwgNzMpCgptZWFuKG9jdXBhY2lvbl9jb3JyZWdpZGEpCmBgYAoKQ29uIGVzdGEgY29ycmVjY2nDs24sIGxhIG9jdXBhY2nDs24gcHJvbWVkaW8gYmFqYSBkZSA4My41OCUgYSA4Mi43NSUuCgojIEJvb3RzdHJhcCBjb3JyZWdpZG8gY29uIDEwMDAgcmVwZXRpY2lvbmVzCgpgYGB7cn0Kc2V0LnNlZWQoNjE2KQoKYm9vdHN0cmFwX2NvcnJlZ2lkbyA8LSBib290KGRhdGEgPSBvY3VwYWNpb25fY29ycmVnaWRhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGlzdGljID0gYm9vdHN0cmFwX21lZGlhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgUiA9IDEwMDApCgpwcmludChib290c3RyYXBfY29ycmVnaWRvKQpgYGAKCiMgSW50ZXJ2YWxvIGNvcnJlZ2lkbyBjb24gMTAwMCByZXBldGljaW9uZXMKCmBgYHtyfQppbnRlcnZhbG9fY29ycmVnaWRvIDwtIGJvb3QuY2koYm9vdHN0cmFwX2NvcnJlZ2lkbywgdHlwZSA9ICJwZXJjIikKCnByaW50KGludGVydmFsb19jb3JyZWdpZG8pCmBgYAoKYGBge3J9Cmhpc3QoYm9vdHN0cmFwX2NvcnJlZ2lkbyR0LAogICAgIG1haW4gPSAiQm9vdHN0cmFwIGNvbiBkaWNpZW1icmUgY29ycmVnaWRvIiwKICAgICB4bGFiID0gIk9jdXBhY2nDs24gcHJvbWVkaW8iLAogICAgIGNvbCA9ICJsaWdodGJsdWUiLAogICAgIGJvcmRlciA9ICJibGFjayIpCmBgYAoKRGVzcHXDqXMgZGUgY29ycmVnaXIgZGljaWVtYnJlLCBlbCBpbnRlcnZhbG8gZGUgY29uZmlhbnphIHNlIGVuY3VlbnRyYSBhcHJveGltYWRhbWVudGUgZW50cmUgNzkuNiUgeSA4NS45JS4gRW4gY29tcGFyYWNpw7NuIGNvbiBsb3MgZGF0b3Mgb3JpZ2luYWxlcywgbGEgbWVkaWEgZGlzbWludXllIHkgZWwgbMOtbWl0ZSBpbmZlcmlvciBkZWwgaW50ZXJ2YWxvIGFob3JhIHB1ZWRlIGNhZXIgcG9yIGRlYmFqbyBkZWwgODAlLgoKIyBCb290c3RyYXAgY29ycmVnaWRvIGNvbiAxMDAwMDAgcmVwZXRpY2lvbmVzCgpgYGB7cn0Kc2V0LnNlZWQoNjE2KQoKYm9vdHN0cmFwX2NvcnJlZ2lkb18xMDAwMDAgPC0gYm9vdChkYXRhID0gb2N1cGFjaW9uX2NvcnJlZ2lkYSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aXN0aWMgPSBib290c3RyYXBfbWVkaWEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUiA9IDEwMDAwMCkKCnByaW50KGJvb3RzdHJhcF9jb3JyZWdpZG9fMTAwMDAwKQpgYGAKCiMgSW50ZXJ2YWxvIGNvcnJlZ2lkbyBjb24gMTAwMDAwIHJlcGV0aWNpb25lcwoKYGBge3J9CmludGVydmFsb19jb3JyZWdpZG9fMTAwMDAwIDwtIGJvb3QuY2koYm9vdHN0cmFwX2NvcnJlZ2lkb18xMDAwMDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSA9ICJwZXJjIikKCnByaW50KGludGVydmFsb19jb3JyZWdpZG9fMTAwMDAwKQpgYGAKCmBgYHtyfQpoaXN0KGJvb3RzdHJhcF9jb3JyZWdpZG9fMTAwMDAwJHQsCiAgICAgbWFpbiA9ICJCb290c3RyYXAgY29ycmVnaWRvIGNvbiAxMDAwMDAgcmVwZXRpY2lvbmVzIiwKICAgICB4bGFiID0gIk9jdXBhY2nDs24gcHJvbWVkaW8iLAogICAgIGNvbCA9ICJsaWdodGJsdWUiLAogICAgIGJvcmRlciA9ICJibGFjayIpCmBgYAoKQ29uIDEwMDAwMCByZXBldGljaW9uZXMsIGVsIHJlc3VsdGFkbyB2dWVsdmUgYSBzZXIgbXV5IHBhcmVjaWRvIGFsIG9idGVuaWRvIGNvbiAxMDAwIHJlcGV0aWNpb25lcyB5IHNlIGVzdGFiaWxpemEgYXByb3hpbWFkYW1lbnRlIGVudHJlIDc5LjYlIHkgODUuOSUuCgojIEFjY2lvbmVzIHJlY29tZW5kYWRhcyBzaSBsYSBvY3VwYWNpw7NuIGNhZSBwb3IgZGViYWpvIGRlbCA4MCUKClNpIGxhIG9jdXBhY2nDs24gZGVsIEhvdGVsIE1pcmFnZSBjYWUgcG9yIGRlYmFqbyBkZWwgODAlLCB1bmEgZGUgbGFzIHByaW1lcmFzIGFjY2lvbmVzIHNlcsOtYSByZWR1Y2lyIGdhc3RvcyB2YXJpYWJsZXMgcXVlIG5vIHNlYW4gaW5kaXNwZW5zYWJsZXMsIHNpbiBhZmVjdGFyIGxhIGNhbGlkYWQgZGVsIHNlcnZpY2lvLiBUYW1iacOpbiBzZSBwb2Ryw61hbiB1dGlsaXphciBwcm9tb2Npb25lcyBkdXJhbnRlIGxvcyBkw61hcyBvIHRlbXBvcmFkYXMgY29uIG1lbm9yIGRlbWFuZGEsIG9mcmVjZXIgcGFxdWV0ZXMgY29uIHNlcnZpY2lvcyBpbmNsdWlkb3MgeSBkYXIgZGVzY3VlbnRvcyBwb3IgcmVzZXJ2YWNpb25lcyBhbnRpY2lwYWRhcy4KCk90cmEgb3BjacOzbiBzZXLDrWEgYXVtZW50YXIgbGEgcHVibGljaWRhZCBlbiByZWRlcyBzb2NpYWxlcyB5IGNyZWFyIGNvbnZlbmlvcyBjb24gZW1wcmVzYXMsIGFnZW5jaWFzIGRlIHZpYWplIG8gcGxhdGFmb3JtYXMgZGUgcmVzZXJ2YWNpb25lcyBwYXJhIGF0cmFlciBtw6FzIGh1w6lzcGVkZXMuIEVzIGltcG9ydGFudGUgcXVlIGVsIGhvdGVsIG5vIHJlZHV6Y2EgZ2FzdG9zIHJlbGFjaW9uYWRvcyBkaXJlY3RhbWVudGUgY29uIGxhIGV4cGVyaWVuY2lhIGRlbCBjbGllbnRlLCB5YSBxdWUgdW5hIGRpc21pbnVjacOzbiBlbiBsYSBjYWxpZGFkIGRlbCBzZXJ2aWNpbyBwb2Ryw61hIHByb3ZvY2FyIG1hbGFzIHJlc2XDsWFzIHkgcmVkdWNpciB0b2RhdsOtYSBtw6FzIGxhIGRlbWFuZGEuCgojIENvbmNsdXNpw7NuCgpFbCBib290c3RyYXAgcGVybWl0ZSBlc3RpbWFyIGVsIGNvbXBvcnRhbWllbnRvIGRlIGxhIG9jdXBhY2nDs24gZGVsIEhvdGVsIE1pcmFnZSBhdW5xdWUgc29sYW1lbnRlIHNlIHRlbmdhIGluZm9ybWFjacOzbiBkZSAxMiBtZXNlcy4gQ29uIGxvcyBkYXRvcyBvcmlnaW5hbGVzLCBsYSBvY3VwYWNpw7NuIHByb21lZGlvIGVzIGRlIGFwcm94aW1hZGFtZW50ZSA4My41OCUgeSBlbCBpbnRlcnZhbG8gZGUgY29uZmlhbnphIHNlIGVuY3VlbnRyYSBhbHJlZGVkb3IgZGUgODElIGEgODYuMyUuIEFsIGF1bWVudGFyIGxhcyByZXBldGljaW9uZXMgZGUgMTAwMCBhIDEwMDAwMCwgbG9zIHJlc3VsdGFkb3MgY2FtYmlhbiBtdXkgcG9jbywgcGVybyBzZSB2dWVsdmVuIG3DoXMgZXN0YWJsZXMuCgpDdWFuZG8gc2UgY29ycmlnZSBsYSBvY3VwYWNpw7NuIGRlIGRpY2llbWJyZSBkZSA4MyUgYSA3MyUsIGxhIG1lZGlhIGRpc21pbnV5ZSBhIDgyLjc1JSB5IGVsIGludGVydmFsbyBzZSBhbXBsw61hIGFwcm94aW1hZGFtZW50ZSBkZSA3OS42JSBhIDg1LjklLiBFc3RvIG11ZXN0cmEgcXVlIGFob3JhIGV4aXN0ZSB1bmEgbWF5b3IgcG9zaWJpbGlkYWQgZGUgcXVlIGxhIG9jdXBhY2nDs24gY2FpZ2EgcG9yIGRlYmFqbyBkZWwgODAlLiBFbiBlc2UgY2FzbywgZWwgaG90ZWwgZGViZXLDrWEgdXRpbGl6YXIgcHJvbW9jaW9uZXMsIHB1YmxpY2lkYWQsIGNvbnZlbmlvcyB5IGNvbnRyb2wgZGUgZ2FzdG9zIHBhcmEgcmVkdWNpciBlbCByaWVzZ28gZGUgcMOpcmRpZGFzIGVjb27Ds21pY2FzLgo=