Teoría

La información del clima se obtiene del ASOS (Automated Surface Observing System) ubicados e los aeropuertos de las ciudades del mundo. # Instalar paquetes y llamar librerías

# install.packages("riem") # sirve para accesar al ASOS para obtener datos climáticos
library(riem)
## Warning: package 'riem' was built under R version 4.3.3
# install.packages("tidyverse") #Manipulación de datos
library(tidyverse)
## Warning: package 'tidyverse' was built under R version 4.3.3
## Warning: package 'ggplot2' was built under R version 4.3.3
## ── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
## ✔ dplyr     1.1.3     ✔ readr     2.1.4
## ✔ forcats   1.0.0     ✔ stringr   1.5.1
## ✔ ggplot2   3.5.0     ✔ tibble    3.2.1
## ✔ lubridate 1.9.3     ✔ 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
# install.packages("ggplot2") # Gráficas con mejor diseño que plot
library(ggplot2)
# install.packages("plotly")
library(plotly)
## Warning: package 'plotly' was built under R version 4.3.3
## 
## Attaching package: 'plotly'
## 
## The following object is masked from 'package:ggplot2':
## 
##     last_plot
## 
## The following object is masked from 'package:stats':
## 
##     filter
## 
## The following object is masked from 'package:graphics':
## 
##     layout

Paso 1. Buscar la red del país (México) y copiar CODE

view(riem_networks()) #todos los install deben ir con gato
# MX__ASOS

Paso 2. Buscar la estación o ciudad(Monterrey) y copiar ID

# view(riem_stations("MX__ASOS"))
# MMMY

Paso 3. Obtener datos del clima

clima_mty <- riem_measures("MMMY")

Ejercicio 1. Obtener datos del clima de monterrey de febrero 2024

clima_mty_feb <- subset(clima_mty, valid >= as.POSIXct("2024-02-01 00:000") & valid <= as.POSIXct("2024-02-29 23:59"))
str(clima_mty_feb)
## tibble [713 × 32] (S3: tbl_df/tbl/data.frame)
##  $ station          : chr [1:713] "MMMY" "MMMY" "MMMY" "MMMY" ...
##  $ valid            : POSIXct[1:713], format: "2024-02-01 06:40:00" "2024-02-01 07:04:00" ...
##  $ lon              : num [1:713] -100 -100 -100 -100 -100 ...
##  $ lat              : num [1:713] 25.8 25.8 25.8 25.8 25.8 ...
##  $ tmpf             : num [1:713] 57.2 55.4 57.2 59 64.4 66.2 69.8 73.4 75.2 77 ...
##  $ dwpf             : num [1:713] 55.4 55.4 55.4 57.2 57.2 57.2 57.2 57.2 57.2 57.2 ...
##  $ relh             : num [1:713] 93.7 100 93.7 93.7 77.5 ...
##  $ drct             : num [1:713] 110 0 0 210 0 30 120 110 150 130 ...
##  $ sknt             : num [1:713] 3 0 0 3 0 4 4 8 5 8 ...
##  $ p01i             : num [1:713] 0 0 0 0 0 0 0 0 0 0 ...
##  $ alti             : num [1:713] 30.1 30.1 30.1 30.1 30.1 ...
##  $ mslp             : num [1:713] NA NA NA NA NA NA NA NA NA NA ...
##  $ vsby             : num [1:713] 8 2 1.5 2 4 4 5 5 5 7 ...
##  $ gust             : num [1:713] NA NA NA NA NA NA NA NA NA NA ...
##  $ skyc1            : chr [1:713] "BKN" "BKN" "BKN" "BKN" ...
##  $ skyc2            : chr [1:713] NA NA "OVC" "OVC" ...
##  $ skyc3            : chr [1:713] NA NA NA NA ...
##  $ skyc4            : chr [1:713] NA NA NA NA ...
##  $ skyl1            : num [1:713] 2000 500 500 500 7000 3500 NA NA NA NA ...
##  $ skyl2            : num [1:713] NA NA 1000 1000 NA NA NA NA NA NA ...
##  $ skyl3            : num [1:713] NA NA NA NA NA NA NA NA NA NA ...
##  $ skyl4            : num [1:713] NA NA NA NA NA NA NA NA NA NA ...
##  $ wxcodes          : chr [1:713] NA "BR" "BR" "BR" ...
##  $ ice_accretion_1hr: logi [1:713] NA NA NA NA NA NA ...
##  $ ice_accretion_3hr: logi [1:713] NA NA NA NA NA NA ...
##  $ ice_accretion_6hr: logi [1:713] NA NA NA NA NA NA ...
##  $ peak_wind_gust   : logi [1:713] NA NA NA NA NA NA ...
##  $ peak_wind_drct   : logi [1:713] NA NA NA NA NA NA ...
##  $ peak_wind_time   : logi [1:713] NA NA NA NA NA NA ...
##  $ feel             : num [1:713] 57.2 55.4 57.2 59 64.4 66.2 69.8 73.4 75.2 77 ...
##  $ metar            : chr [1:713] "MMMY 011240Z 11003KT 8SM BKN020 14/13 A3007 RMK 8/500" "MMMY 011304Z 00000KT 2SM BR BKN005 13/13 A3007 RMK 8/500" "MMMY 011340Z 00000KT 1 1/2SM BR BKN005 OVC010 14/13 A3007 RMK 8/5//" "MMMY 011445Z 21003KT 2SM BR BKN005 OVC010 15/14 A3008 RMK SLP/// 5//// 9// 8/5// BINOVC" ...
##  $ snowdepth        : logi [1:713] NA NA NA NA NA NA ...

Ejercicio 2. Graficar la Humedad Relativa en Monterrey durante Febrero 2024

plot(clima_mty_feb$valid,clima_mty_feb$relh,type="l",main="Humedad Relativa en Monterrey durante Febrero 2024", xlab="Fecha", ylab="Humedad Relativa")

#Promediar Humedad Relativa Diaria
clima_mty_feb$date <- as.Date(clima_mty_feb$valid) 
#Agregamos columna que no exisitía, la cual se fue hasta final llamada Date
cmfd <- aggregate(clima_mty_feb, by=list(date=clima_mty_feb$date), FUN=mean)
str(cmfd)
## 'data.frame':    30 obs. of  34 variables:
##  $ date             : Date, format: "2024-02-01" "2024-02-02" ...
##  $ station          : num  NA NA NA NA NA NA NA NA NA NA ...
##  $ valid            : POSIXct, format: "2024-02-01 14:44:41" "2024-02-02 12:10:37" ...
##  $ lon              : num  -100 -100 -100 -100 -100 ...
##  $ lat              : num  25.8 25.8 25.8 25.8 25.8 ...
##  $ tmpf             : num  67.3 70.4 72.2 69.3 65.7 ...
##  $ dwpf             : num  56.2 55 42.4 27.6 26.2 ...
##  $ relh             : num  69.5 62.9 45.5 29 23.7 ...
##  $ drct             : num  97.4 134.6 188.8 281.7 297.5 ...
##  $ sknt             : num  4.79 5 11.08 9.71 8.29 ...
##  $ p01i             : num  0 0 0 0 0 0 0 0 0 0 ...
##  $ alti             : num  30 29.7 29.6 29.8 30.1 ...
##  $ mslp             : num  NA NA NA NA NA NA NA NA NA NA ...
##  $ vsby             : num  5.71 7.67 12.12 11.88 11.29 ...
##  $ gust             : num  NA NA NA NA NA NA NA NA NA NA ...
##  $ skyc1            : num  NA NA NA NA NA NA NA NA NA NA ...
##  $ skyc2            : num  NA NA NA NA NA NA NA NA NA NA ...
##  $ skyc3            : num  NA NA NA NA NA NA NA NA NA NA ...
##  $ skyc4            : num  NA NA NA NA NA NA NA NA NA NA ...
##  $ skyl1            : num  NA NA NA NA NA ...
##  $ skyl2            : num  NA NA NA NA NA NA NA NA NA NA ...
##  $ skyl3            : num  NA NA NA NA NA NA NA NA NA NA ...
##  $ skyl4            : num  NA NA NA NA NA NA NA NA NA NA ...
##  $ wxcodes          : num  NA NA NA NA NA NA NA NA NA NA ...
##  $ ice_accretion_1hr: num  NA NA NA NA NA NA NA NA NA NA ...
##  $ ice_accretion_3hr: num  NA NA NA NA NA NA NA NA NA NA ...
##  $ ice_accretion_6hr: num  NA NA NA NA NA NA NA NA NA NA ...
##  $ peak_wind_gust   : num  NA NA NA NA NA NA NA NA NA NA ...
##  $ peak_wind_drct   : num  NA NA NA NA NA NA NA NA NA NA ...
##  $ peak_wind_time   : num  NA NA NA NA NA NA NA NA NA NA ...
##  $ feel             : num  67.3 70 71.2 68.6 65.7 ...
##  $ metar            : num  NA NA NA NA NA NA NA NA NA NA ...
##  $ snowdepth        : num  NA NA NA NA NA NA NA NA NA NA ...
##  $ date             : Date, format: "2024-02-01" "2024-02-02" ...
# Graficar la Humedad Relativa promedio por día
plot(cmfd$date,cmfd$relh,type="l",main="Humedad Relativa en Monterrey promedio durante Febrero 2024 por dia", xlab="Fecha", ylab="Humedad Relativa")

Ejercicio 3. Graficar la temperatura promedio diaria durante febrero 2024 en Puebla

#Primero debemos obtener los datos de sólo 2024
clima_pue <- riem_measures("MMPB")
clima_pue_feb <- subset(clima_pue, valid >= as.POSIXct("2024-02-01 00:000") & valid <= as.POSIXct("2024-02-29 23:59"))
#Agregar tabla del clima en Celcius
clima_pue_feb$centi <- clima_pue_feb$tmpf-32*0.5556
cmfp <- aggregate(clima_pue_feb, by=list(centi=clima_pue_feb$centi), FUN=mean)
cmfp$date <- as.Date(cmfp$valid) 
# Gradicar la Humedad Relativa promedio por día
plot(clima_pue_feb$valid,clima_pue_feb$relh,type="l",main="Humedad Relativa en Monterrey durante Puebla 2024", xlab="Fecha", ylab="Humedad Relativa")

#Promediar Humedad Relativa Diaria
clima_pue_feb$date <- as.Date(clima_pue_feb$valid) 
#Agregamos columna que no exisitía, la cual se fue hasta final llamada Date
cmfp <- aggregate(clima_pue_feb, by=list(date=clima_pue_feb$date), FUN=mean)
str(cmfp)
## 'data.frame':    30 obs. of  35 variables:
##  $ date             : Date, format: "2024-02-01" "2024-02-02" ...
##  $ station          : num  NA NA NA NA NA NA NA NA NA NA ...
##  $ valid            : POSIXct, format: "2024-02-01 13:17:55" "2024-02-02 13:43:04" ...
##  $ lon              : num  -98.2 -98.2 -98.2 -98.2 -98.2 ...
##  $ lat              : num  19.1 19.1 19.1 19.1 19.1 ...
##  $ tmpf             : num  60.4 63.7 62.9 62.7 64.7 ...
##  $ dwpf             : num  34.1 40 29.2 27.6 12.6 ...
##  $ relh             : num  39.3 43.7 30.6 31.3 15.1 ...
##  $ drct             : num  206 193 151 209 234 ...
##  $ sknt             : num  6.71 10 17.36 4.93 10.57 ...
##  $ p01i             : num  0 0 0 0 0 0 0 0 0 0 ...
##  $ alti             : num  30.3 30.2 30.1 30.1 30.2 ...
##  $ mslp             : num  NA NA NA NA NA NA NA NA NA NA ...
##  $ vsby             : num  8.21 7.92 7.64 11.21 11.07 ...
##  $ gust             : num  NA NA NA NA NA NA NA NA NA NA ...
##  $ skyc1            : num  NA NA NA NA NA NA NA NA NA NA ...
##  $ skyc2            : num  NA NA NA NA NA NA NA NA NA NA ...
##  $ skyc3            : num  NA NA NA NA NA NA NA NA NA NA ...
##  $ skyc4            : num  NA NA NA NA NA NA NA NA NA NA ...
##  $ skyl1            : num  7429 NA NA NA NA ...
##  $ skyl2            : num  NA NA NA NA NA NA NA NA NA NA ...
##  $ skyl3            : num  NA NA NA NA NA NA NA NA NA NA ...
##  $ skyl4            : num  NA NA NA NA NA NA NA NA NA NA ...
##  $ wxcodes          : num  NA NA NA NA NA NA NA NA NA NA ...
##  $ ice_accretion_1hr: num  NA NA NA NA NA NA NA NA NA NA ...
##  $ ice_accretion_3hr: num  NA NA NA NA NA NA NA NA NA NA ...
##  $ ice_accretion_6hr: num  NA NA NA NA NA NA NA NA NA NA ...
##  $ peak_wind_gust   : num  NA NA NA NA NA NA NA NA NA NA ...
##  $ peak_wind_drct   : num  NA NA NA NA NA NA NA NA NA NA ...
##  $ peak_wind_time   : num  NA NA NA NA NA NA NA NA NA NA ...
##  $ feel             : num  59.9 63.4 62.8 62.4 64 ...
##  $ metar            : num  NA NA NA NA NA NA NA NA NA NA ...
##  $ snowdepth        : num  NA NA NA NA NA NA NA NA NA NA ...
##  $ centi            : num  42.6 45.9 45.1 44.9 46.9 ...
##  $ date             : Date, format: "2024-02-01" "2024-02-02" ...
# Graficar la Humedad Relativa promedio por día
plot(cmfp$date,cmfp$relh,type="l",main="Humedad Relativa en Monterrey durante Puebla 2024 por dia", xlab="Fecha", ylab="Humedad Relativa")

Conclusion

En este ejercicio se hizo de ASOS (Automated Surface Observing System), plataforma que funciona como una red de estaciones meteorológicas automatizadas. Está diseñada para funcionar en aeropuertos, tanto grandes como pequeños, pero también proporciona información valiosa para la investigación meteorológica, hidrológica y climatológica. Además de la instalación de distintas librerias como ser tidyverse, ggplot2 y plotly, para así obtener datos de distintos paises, ciudades y obtener pronósticos o estadísticas de temperatura, cambios de humedad, etc.

Este modelo será de utilidad y podrá ser usada para la toma de decisiones de distintas aerolineas, servicios de transporte y hasta de hoteles varios.

LS0tDQp0aXRsZTogIkNsaW1hIg0KYXV0aG9yOiAiRmFiaWFuYSBNZWRpbmFjZWxsaSBBMDA4MzU4NiINCmRhdGU6ICIyMDI0LTAyLTI5Ig0Kb3V0cHV0Og0KIGh0bWxfZG9jdW1lbnQ6ICAgIA0KICAgIHRvYzogVFJVRQ0KICAgIHRvY19mbG9hdDogVFJVRQ0KICAgIGNvZGVfZG93bmxvYWQ6IFRSVUUNCiAgICB0aGVtZTogZGFyaw0KLS0tDQoNCiFbXShDOlxcVXNlcnNcXEhQXFxEZXNrdG9wXFxEYXRpc1xcZHJha2UtYW5kLWpvc2gtam9zaC1wZWNrLmdpZikNCg0KIyA8c3BhbiBzdHlsZT0iY29sb3I6IHllbGxvdzsiPlRlb3LDrWE8L3NwYW4+DQpMYSBpbmZvcm1hY2nDs24gZGVsIGNsaW1hIHNlIG9idGllbmUgZGVsICoqQVNPUyoqICgqQXV0b21hdGVkIFN1cmZhY2UgT2JzZXJ2aW5nIFN5c3RlbSopIHViaWNhZG9zIGUgbG9zIGFlcm9wdWVydG9zIGRlIGxhcyBjaXVkYWRlcyBkZWwgbXVuZG8uDQojIDxzcGFuIHN0eWxlPSJjb2xvcjogeWVsbG93OyI+SW5zdGFsYXIgcGFxdWV0ZXMgeSBsbGFtYXIgbGlicmVyw61hczwvc3Bhbj4NCmBgYHtyfQ0KIyBpbnN0YWxsLnBhY2thZ2VzKCJyaWVtIikgIyBzaXJ2ZSBwYXJhIGFjY2VzYXIgYWwgQVNPUyBwYXJhIG9idGVuZXIgZGF0b3MgY2xpbcOhdGljb3MNCmxpYnJhcnkocmllbSkNCiMgaW5zdGFsbC5wYWNrYWdlcygidGlkeXZlcnNlIikgI01hbmlwdWxhY2nDs24gZGUgZGF0b3MNCmxpYnJhcnkodGlkeXZlcnNlKQ0KIyBpbnN0YWxsLnBhY2thZ2VzKCJnZ3Bsb3QyIikgIyBHcsOhZmljYXMgY29uIG1lam9yIGRpc2XDsW8gcXVlIHBsb3QNCmxpYnJhcnkoZ2dwbG90MikNCiMgaW5zdGFsbC5wYWNrYWdlcygicGxvdGx5IikNCmxpYnJhcnkocGxvdGx5KQ0KYGBgDQojIDxzcGFuIHN0eWxlPSJjb2xvcjogeWVsbG93OyI+UGFzbyAxLiBCdXNjYXIgbGEgcmVkIGRlbCBwYcOtcyAoTcOpeGljbykgeSBjb3BpYXIgQ09ERTwvc3Bhbj4NCmBgYHtyfQ0KdmlldyhyaWVtX25ldHdvcmtzKCkpICN0b2RvcyBsb3MgaW5zdGFsbCBkZWJlbiBpciBjb24gZ2F0bw0KIyBNWF9fQVNPUw0KYGBgDQojIDxzcGFuIHN0eWxlPSJjb2xvcjogeWVsbG93OyI+UGFzbyAyLiBCdXNjYXIgbGEgZXN0YWNpw7NuIG8gY2l1ZGFkKE1vbnRlcnJleSkgeSBjb3BpYXIgSUQ8L3NwYW4+DQpgYGB7cn0NCiMgdmlldyhyaWVtX3N0YXRpb25zKCJNWF9fQVNPUyIpKQ0KIyBNTU1ZDQpgYGANCiMgPHNwYW4gc3R5bGU9ImNvbG9yOiB5ZWxsb3c7Ij5QYXNvIDMuIE9idGVuZXIgZGF0b3MgZGVsIGNsaW1hPC9zcGFuPg0KYGBge3J9DQpjbGltYV9tdHkgPC0gcmllbV9tZWFzdXJlcygiTU1NWSIpDQpgYGANCiMgPHNwYW4gc3R5bGU9ImNvbG9yOiBibHVlOyI+RWplcmNpY2lvIDEuIE9idGVuZXIgZGF0b3MgZGVsIGNsaW1hIGRlIG1vbnRlcnJleSBkZSBmZWJyZXJvIDIwMjQ8L3NwYW4+DQpgYGB7cn0NCmNsaW1hX210eV9mZWIgPC0gc3Vic2V0KGNsaW1hX210eSwgdmFsaWQgPj0gYXMuUE9TSVhjdCgiMjAyNC0wMi0wMSAwMDowMDAiKSAmIHZhbGlkIDw9IGFzLlBPU0lYY3QoIjIwMjQtMDItMjkgMjM6NTkiKSkNCnN0cihjbGltYV9tdHlfZmViKQ0KYGBgDQojIDxzcGFuIHN0eWxlPSJjb2xvcjogYmx1ZTsiPkVqZXJjaWNpbyAyLiBHcmFmaWNhciBsYSBIdW1lZGFkIFJlbGF0aXZhIGVuIE1vbnRlcnJleSBkdXJhbnRlIEZlYnJlcm8gMjAyNDwvc3Bhbj4gIA0KDQpgYGB7ciB3YXJuaW5nPUZBTFNFfQ0KcGxvdChjbGltYV9tdHlfZmViJHZhbGlkLGNsaW1hX210eV9mZWIkcmVsaCx0eXBlPSJsIixtYWluPSJIdW1lZGFkIFJlbGF0aXZhIGVuIE1vbnRlcnJleSBkdXJhbnRlIEZlYnJlcm8gMjAyNCIsIHhsYWI9IkZlY2hhIiwgeWxhYj0iSHVtZWRhZCBSZWxhdGl2YSIpDQoNCiNQcm9tZWRpYXIgSHVtZWRhZCBSZWxhdGl2YSBEaWFyaWENCmNsaW1hX210eV9mZWIkZGF0ZSA8LSBhcy5EYXRlKGNsaW1hX210eV9mZWIkdmFsaWQpIA0KI0FncmVnYW1vcyBjb2x1bW5hIHF1ZSBubyBleGlzaXTDrWEsIGxhIGN1YWwgc2UgZnVlIGhhc3RhIGZpbmFsIGxsYW1hZGEgRGF0ZQ0KY21mZCA8LSBhZ2dyZWdhdGUoY2xpbWFfbXR5X2ZlYiwgYnk9bGlzdChkYXRlPWNsaW1hX210eV9mZWIkZGF0ZSksIEZVTj1tZWFuKQ0Kc3RyKGNtZmQpDQoNCiMgR3JhZmljYXIgbGEgSHVtZWRhZCBSZWxhdGl2YSBwcm9tZWRpbyBwb3IgZMOtYQ0KcGxvdChjbWZkJGRhdGUsY21mZCRyZWxoLHR5cGU9ImwiLG1haW49Ikh1bWVkYWQgUmVsYXRpdmEgZW4gTW9udGVycmV5IHByb21lZGlvIGR1cmFudGUgRmVicmVybyAyMDI0IHBvciBkaWEiLCB4bGFiPSJGZWNoYSIsIHlsYWI9Ikh1bWVkYWQgUmVsYXRpdmEiKQ0KYGBgICANCg0KIyA8c3BhbiBzdHlsZT0iY29sb3I6IGJsdWU7Ij5FamVyY2ljaW8gMy4gR3JhZmljYXIgbGEgdGVtcGVyYXR1cmEgcHJvbWVkaW8gZGlhcmlhIGR1cmFudGUgZmVicmVybyAyMDI0IGVuIFB1ZWJsYTwvc3Bhbj4gIA0KYGBge3J9DQojUHJpbWVybyBkZWJlbW9zIG9idGVuZXIgbG9zIGRhdG9zIGRlIHPDs2xvIDIwMjQNCmNsaW1hX3B1ZSA8LSByaWVtX21lYXN1cmVzKCJNTVBCIikNCmNsaW1hX3B1ZV9mZWIgPC0gc3Vic2V0KGNsaW1hX3B1ZSwgdmFsaWQgPj0gYXMuUE9TSVhjdCgiMjAyNC0wMi0wMSAwMDowMDAiKSAmIHZhbGlkIDw9IGFzLlBPU0lYY3QoIjIwMjQtMDItMjkgMjM6NTkiKSkNCmBgYA0KYGBge3Igd2FybmluZz1GQUxTRX0NCiNBZ3JlZ2FyIHRhYmxhIGRlbCBjbGltYSBlbiBDZWxjaXVzDQpjbGltYV9wdWVfZmViJGNlbnRpIDwtIGNsaW1hX3B1ZV9mZWIkdG1wZi0zMiowLjU1NTYNCmNtZnAgPC0gYWdncmVnYXRlKGNsaW1hX3B1ZV9mZWIsIGJ5PWxpc3QoY2VudGk9Y2xpbWFfcHVlX2ZlYiRjZW50aSksIEZVTj1tZWFuKQ0KY21mcCRkYXRlIDwtIGFzLkRhdGUoY21mcCR2YWxpZCkgDQojIEdyYWRpY2FyIGxhIEh1bWVkYWQgUmVsYXRpdmEgcHJvbWVkaW8gcG9yIGTDrWENCnBsb3QoY2xpbWFfcHVlX2ZlYiR2YWxpZCxjbGltYV9wdWVfZmViJHJlbGgsdHlwZT0ibCIsbWFpbj0iSHVtZWRhZCBSZWxhdGl2YSBlbiBNb250ZXJyZXkgZHVyYW50ZSBQdWVibGEgMjAyNCIsIHhsYWI9IkZlY2hhIiwgeWxhYj0iSHVtZWRhZCBSZWxhdGl2YSIpDQoNCiNQcm9tZWRpYXIgSHVtZWRhZCBSZWxhdGl2YSBEaWFyaWENCmNsaW1hX3B1ZV9mZWIkZGF0ZSA8LSBhcy5EYXRlKGNsaW1hX3B1ZV9mZWIkdmFsaWQpIA0KI0FncmVnYW1vcyBjb2x1bW5hIHF1ZSBubyBleGlzaXTDrWEsIGxhIGN1YWwgc2UgZnVlIGhhc3RhIGZpbmFsIGxsYW1hZGEgRGF0ZQ0KY21mcCA8LSBhZ2dyZWdhdGUoY2xpbWFfcHVlX2ZlYiwgYnk9bGlzdChkYXRlPWNsaW1hX3B1ZV9mZWIkZGF0ZSksIEZVTj1tZWFuKQ0Kc3RyKGNtZnApDQoNCiMgR3JhZmljYXIgbGEgSHVtZWRhZCBSZWxhdGl2YSBwcm9tZWRpbyBwb3IgZMOtYQ0KcGxvdChjbWZwJGRhdGUsY21mcCRyZWxoLHR5cGU9ImwiLG1haW49Ikh1bWVkYWQgUmVsYXRpdmEgZW4gTW9udGVycmV5IGR1cmFudGUgUHVlYmxhIDIwMjQgcG9yIGRpYSIsIHhsYWI9IkZlY2hhIiwgeWxhYj0iSHVtZWRhZCBSZWxhdGl2YSIpDQpgYGAgIA0KDQojIDxzcGFuIHN0eWxlPSJjb2xvcjogYmx1ZTsiPkNvbmNsdXNpb248L3NwYW4+DQpFbiBlc3RlIGVqZXJjaWNpbyBzZSBoaXpvIGRlICoqQVNPUyoqICgqQXV0b21hdGVkIFN1cmZhY2UgT2JzZXJ2aW5nIFN5c3RlbSopLCBwbGF0YWZvcm1hIHF1ZSBmdW5jaW9uYSBjb21vIHVuYSByZWQgZGUgZXN0YWNpb25lcyBtZXRlb3JvbMOzZ2ljYXMgYXV0b21hdGl6YWRhcy4gRXN0w6EgZGlzZcOxYWRhIHBhcmEgZnVuY2lvbmFyIGVuIGFlcm9wdWVydG9zLCB0YW50byBncmFuZGVzIGNvbW8gcGVxdWXDsW9zLCBwZXJvIHRhbWJpw6luIHByb3BvcmNpb25hIGluZm9ybWFjacOzbiB2YWxpb3NhIHBhcmEgbGEgaW52ZXN0aWdhY2nDs24gbWV0ZW9yb2zDs2dpY2EsIGhpZHJvbMOzZ2ljYSB5IGNsaW1hdG9sw7NnaWNhLiBBZGVtw6FzIGRlIGxhIGluc3RhbGFjacOzbiBkZSBkaXN0aW50YXMgbGlicmVyaWFzIGNvbW8gc2VyIHRpZHl2ZXJzZSwgZ2dwbG90MiB5IHBsb3RseSwgcGFyYSBhc8OtIG9idGVuZXIgZGF0b3MgZGUgZGlzdGludG9zIHBhaXNlcywgY2l1ZGFkZXMgeSBvYnRlbmVyIHByb27Ds3N0aWNvcyBvIGVzdGFkw61zdGljYXMgZGUgdGVtcGVyYXR1cmEsIGNhbWJpb3MgZGUgaHVtZWRhZCwgZXRjLg0KDQpFc3RlIG1vZGVsbyBzZXLDoSBkZSB1dGlsaWRhZCB5IHBvZHLDoSBzZXIgdXNhZGEgcGFyYSBsYSB0b21hIGRlIGRlY2lzaW9uZXMgZGUgZGlzdGludGFzIGFlcm9saW5lYXMsIHNlcnZpY2lvcyBkZSB0cmFuc3BvcnRlIHkgaGFzdGEgZGUgaG90ZWxlcyB2YXJpb3MuDQo=