Contexto

Calidad del Suelo: o SPH: pH del Suelo o NC: Contenido de Nutrientes o OM: Materia Orgánica • Calidad del Agua: o CL: Niveles de Contaminantes o DO: Oxígeno Disuelto o WPH: pH del Agua • Salud del Ecosistema o SD: Diversidad de Especies o BM: Biomasa o EP: Productividad del Ecosistema

Fuente Parte 1: “C:\Users\serva\Downloads\hogares.xlsx” Fuente parte 2: “C:\Users\serva\Downloads\population.csv” Fuente Parte 3:“C:\Users\serva\Downloads\ecosistema.csv”

Instalar paquetes y llamar libreriras

#install.packages("tidyverse")
library(tidyverse)
#install.packages("gplots")
library(gplots)
#install.packages("plm")
library(plm)
#install.packages("DataExplorer")
library(DataExplorer)
#install.packages("forecast")
library(forecast)
#install.packages("lavaan")
library(lavaan)
#install.packages("lavaanPlot")
library(lavaanPlot)
#install.packages("readxl")
library(readxl)
#install.packages("lmtest")
library(lmtest)
# install.packages("WDI")
library(WDI)
# install.packages("wbstats")
library(wbstats)
# install.packages("tidyverse")
library(tidyverse)
#install.packages("devtools")
library(devtools)
#devtools::install_github("diegovalle/mxmaps")
library(mxmaps)
#install.packages("remotes")
library(remotes)
#install.packages("sf")
library(sf)
#install.packages("forecast")
library(forecast)

Tema 1. Datos de panel: Hogares

Importar la base de datos

dfP1 <- read_excel("C:/Users/serva/Downloads/hogares.xlsx")

# 2) Renombrar la columna 'Año' -> 'Anio' sin usar la ñ (soporta A�o / Año / Año)
names(dfP1)[grepl("^A.{1,2}o$", names(dfP1))] <- "Anio"

# (Opcional) Verifica cómo quedaron los nombres
print(names(dfP1))
## [1] "HogarID"      "Anio"         "Miembros"     "Ingreso"      "Gasto"       
## [6] "Ahorro"       "Satisfacción"
# 3) Tipos
dfP1$HogarID <- as.integer(dfP1$HogarID)
dfP1$Anio    <- as.integer(dfP1$Anio)

# 4) Crear el panel
panel1 <- pdata.frame(dfP1, index = c("HogarID", "Anio"))

Revisar Heterogeneidad

plotmeans(Ingreso ~ HogarID, main = "Heterogeneidad entre hogares para el ingreso", data = panel1)

## Modelo 1, Renombrar “Satisfacción” sin Tilde por problemas de tipo de archivo

# (1) Renombrar 'Satisfacción' -> 'Satisfaccion' SIN tilde
col_sat <- grep("^Satisf", names(dfP1), ignore.case = TRUE, value = TRUE)
stopifnot(length(col_sat) == 1)
names(dfP1)[names(dfP1) == col_sat] <- "Satisfaccion"
names(dfP1)  # debe mostrar 'Satisfaccion'
## [1] "HogarID"      "Anio"         "Miembros"     "Ingreso"      "Gasto"       
## [6] "Ahorro"       "Satisfaccion"

Modelo 1. Recrear el panel DESPUÉS del rename

panel1 <- pdata.frame(dfP1, index = c("HogarID","Anio"))

# Comprobación: ¿existe Satisfaccion en panel1?
names(panel1)
## [1] "HogarID"      "Anio"         "Miembros"     "Ingreso"      "Gasto"       
## [6] "Ahorro"       "Satisfaccion"
grep("^Satisf", names(panel1), value = TRUE)
## [1] "Satisfaccion"
stopifnot("Satisfaccion" %in% names(panel1))

Modelo 1, Regresión agrupada

pooled <- plm(Ingreso ~ Satisfaccion, data = panel1, model = "pooling")
summary(pooled)
## Pooling Model
## 
## Call:
## plm(formula = Ingreso ~ Satisfaccion, data = panel1, model = "pooling")
## 
## Balanced Panel: n = 100, T = 10, N = 1000
## 
## Residuals:
##      Min.   1st Qu.    Median   3rd Qu.      Max. 
## -20196.53  -5106.46   -575.98   5095.02  23468.66 
## 
## Coefficients:
##              Estimate Std. Error t-value  Pr(>|t|)    
## (Intercept)  10597.75     976.80  10.850 < 2.2e-16 ***
## Satisfaccion  2890.77     166.68  17.343 < 2.2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Total Sum of Squares:    6.8145e+10
## Residual Sum of Squares: 5.2364e+10
## R-Squared:      0.23158
## Adj. R-Squared: 0.23081
## F-statistic: 300.772 on 1 and 998 DF, p-value: < 2.22e-16

Modelo 2, Efectos fijos (whitin)

within <- plm(Ingreso ~ Satisfaccion , data = panel1, model = "within")
summary(within)
## Oneway (individual) effect Within Model
## 
## Call:
## plm(formula = Ingreso ~ Satisfaccion, data = panel1, model = "within")
## 
## Balanced Panel: n = 100, T = 10, N = 1000
## 
## Residuals:
##       Min.    1st Qu.     Median    3rd Qu.       Max. 
## -15591.951  -3123.123    -74.284   3010.168  13134.979 
## 
## Coefficients:
##              Estimate Std. Error t-value  Pr(>|t|)    
## Satisfaccion  1698.14     132.73  12.794 < 2.2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Total Sum of Squares:    2.3013e+10
## Residual Sum of Squares: 1.9469e+10
## R-Squared:      0.15403
## Adj. R-Squared: 0.05993
## F-statistic: 163.687 on 1 and 899 DF, p-value: < 2.22e-16

Modelo Pooled vs >Modelo de efectos fijos

pFtest(within, pooled)
## 
##  F test for individual effects
## 
## data:  Ingreso ~ Satisfaccion
## F = 15.343, df1 = 99, df2 = 899, p-value < 2.2e-16
## alternative hypothesis: significant effects

Modelo 3. Efectos Aleatorios (random) - metodo walhus

walhus <- plm(Ingreso ~ Satisfaccion, data = panel1, model = "random", random.method = "walhus")
summary(walhus)
## Oneway (individual) effect Random Effect Model 
##    (Wallace-Hussain's transformation)
## 
## Call:
## plm(formula = Ingreso ~ Satisfaccion, data = panel1, model = "random", 
##     random.method = "walhus")
## 
## Balanced Panel: n = 100, T = 10, N = 1000
## 
## Effects:
##                    var  std.dev share
## idiosyncratic 23574420     4855  0.45
## individual    28789336     5366  0.55
## theta: 0.7249
## 
## Residuals:
##      Min.   1st Qu.    Median   3rd Qu.      Max. 
## -16507.33  -3220.23   -147.96   3184.91  15215.46 
## 
## Coefficients:
##              Estimate Std. Error z-value  Pr(>|z|)    
## (Intercept)  16632.69     925.15  17.978 < 2.2e-16 ***
## Satisfaccion  1831.41     131.69  13.907 < 2.2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Total Sum of Squares:    2.6429e+10
## Residual Sum of Squares: 2.2139e+10
## R-Squared:      0.16233
## Adj. R-Squared: 0.16149
## Chisq: 193.404 on 1 DF, p-value: < 2.22e-16

Modelo 3. Efectos Aleatorios (random) - metodo amemiya

amemiya <- plm(Ingreso ~ Satisfaccion, data = panel1, model = "random", random.method = "amemiya")
summary(amemiya)
## Oneway (individual) effect Random Effect Model 
##    (Amemiya's transformation)
## 
## Call:
## plm(formula = Ingreso ~ Satisfaccion, data = panel1, model = "random", 
##     random.method = "amemiya")
## 
## Balanced Panel: n = 100, T = 10, N = 1000
## 
## Effects:
##                    var  std.dev share
## idiosyncratic 21631698     4651 0.393
## individual    33418160     5781 0.607
## theta: 0.7534
## 
## Residuals:
##      Min.   1st Qu.    Median   3rd Qu.      Max. 
## -16370.54  -3188.47   -210.78   3188.52  14905.18 
## 
## Coefficients:
##              Estimate Std. Error z-value  Pr(>|z|)    
## (Intercept)  16777.35     953.98  17.587 < 2.2e-16 ***
## Satisfaccion  1806.01     130.63  13.825 < 2.2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Total Sum of Squares:    2.5757e+10
## Residual Sum of Squares: 2.1617e+10
## R-Squared:      0.16074
## Adj. R-Squared: 0.1599
## Chisq: 191.14 on 1 DF, p-value: < 2.22e-16

Modelo 3. Efectos Aleatorios (random) - metodo nerlove

nerlove <- plm(Ingreso ~ Satisfaccion, data = panel1, model = "random", random.method = "nerlove")
summary(nerlove)
## Oneway (individual) effect Random Effect Model 
##    (Nerlove's transformation)
## 
## Call:
## plm(formula = Ingreso ~ Satisfaccion, data = panel1, model = "random", 
##     random.method = "nerlove")
## 
## Balanced Panel: n = 100, T = 10, N = 1000
## 
## Effects:
##                    var  std.dev share
## idiosyncratic 19468528     4412 0.351
## individual    35940737     5995 0.649
## theta: 0.7733
## 
## Residuals:
##      Min.   1st Qu.    Median   3rd Qu.      Max. 
## -16275.51  -3113.76   -212.49   3188.29  14690.19 
## 
## Coefficients:
##              Estimate Std. Error z-value  Pr(>|z|)    
## (Intercept)  16869.92     981.37  17.190 < 2.2e-16 ***
## Satisfaccion  1789.76     129.95  13.773 < 2.2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Total Sum of Squares:    2.5332e+10
## Residual Sum of Squares: 2.1286e+10
## R-Squared:      0.15972
## Adj. R-Squared: 0.15888
## Chisq: 189.701 on 1 DF, p-value: < 2.22e-16

Modelo de efectos fijos vs modelo de efectos aleatorios

phtest(walhus,within)
## 
##  Hausman Test
## 
## data:  Ingreso ~ Satisfaccion
## chisq = 64.632, df = 1, p-value = 9.03e-16
## alternative hypothesis: one model is inconsistent

Si es pvalue es <0.05 usamos efecctos fijos.

Por lo tanto nos quedamos con el modelo de efectos fijos

Tema 2. Series de Tiempo: Mapas

Generar Serie de Tiempo y mapa

dfP2 <- df_mxstate_2020

df_mxstate_2020$value <- dfP2$pop
mxstate_choropleth(df_mxstate_2020)

Importar base de datos

dfP3 <- read.csv("C:\\Users\\serva\\Downloads\\population.csv")

Generar serie de tiempo: TX

dfP3_1 <- dfP3 %>% filter(state == "TX")
ts <- ts (dfP3_1$population, start= 1900, frequency = 1)

Generar el modelo ARIMA

arima <- auto.arima(ts)
summary(arima)
## Series: ts 
## ARIMA(0,2,2) 
## 
## Coefficients:
##           ma1      ma2
##       -0.5950  -0.1798
## s.e.   0.0913   0.0951
## 
## sigma^2 = 1.031e+10:  log likelihood = -1527.14
## AIC=3060.28   AICc=3060.5   BIC=3068.6
## 
## Training set error measures:
##                    ME     RMSE      MAE       MPE      MAPE      MASE
## Training set 12147.62 99818.31 59257.39 0.1046163 0.5686743 0.2672197
##                     ACF1
## Training set -0.02136734

Generar el Pronostico

pronostico <- forecast(arima, level= 95, h = 5)
pronostico
##      Point Forecast    Lo 95    Hi 95
## 2020       29398472 29199487 29597457
## 2021       29806827 29463665 30149990
## 2022       30215183 29742956 30687410
## 2023       30623538 30024100 31222977
## 2024       31031894 30303359 31760429
plot(pronostico, main = "Poblacion Texas")

Tema 3, Modelos de ecuaciones estructurales

Importar la base de datos

dfP3 <- read.csv("C:\\Users\\serva\\Downloads\\ecosistema.csv")

Generar el Modelo

modelo <- ' #Regresiones
              EcoSalud ~ SueloCalidad + AguaCalidad
              # Variables latentes
              SueloCalidad =~ SPH + NC + OM
              AguaCalidad =~ CL + DO + WPH
              EcoSalud =~ SD + BM + EP
              # Varianzas y covarianzas
              #Intercepto
              '

Generar el Diagrama

dfE <- scale(dfP3)
dfEE <- cfa(modelo, dfE)
## Warning: lavaan->lav_object_post_check():  
##    covariance matrix of latent variables is not positive definite ; use 
##    lavInspect(fit, "cov.lv") to investigate.
summary(dfEE)
## lavaan 0.6-19 ended normally after 145 iterations
## 
##   Estimator                                         ML
##   Optimization method                           NLMINB
##   Number of model parameters                        21
## 
##   Number of observations                           200
## 
## Model Test User Model:
##                                                       
##   Test statistic                                17.149
##   Degrees of freedom                                24
##   P-value (Chi-square)                           0.842
## 
## Parameter Estimates:
## 
##   Standard errors                             Standard
##   Information                                 Expected
##   Information saturated (h1) model          Structured
## 
## Latent Variables:
##                    Estimate  Std.Err  z-value  P(>|z|)
##   SueloCalidad =~                                     
##     SPH               1.000                           
##     NC                2.217    1.332    1.664    0.096
##     OM                0.167    0.402    0.414    0.679
##   AguaCalidad =~                                      
##     CL                1.000                           
##     DO               -0.827    0.427   -1.936    0.053
##     WPH               0.404    0.359    1.124    0.261
##   EcoSalud =~                                         
##     SD                1.000                           
##     BM               -1.899    3.995   -0.475    0.634
##     EP               -4.224    8.093   -0.522    0.602
## 
## Regressions:
##                    Estimate  Std.Err  z-value  P(>|z|)
##   EcoSalud ~                                          
##     SueloCalidad      0.530    1.499    0.353    0.724
##     AguaCalidad       0.583    1.507    0.387    0.699
## 
## Covariances:
##                    Estimate  Std.Err  z-value  P(>|z|)
##   SueloCalidad ~~                                     
##     AguaCalidad      -0.079    0.051   -1.558    0.119
## 
## Variances:
##                    Estimate  Std.Err  z-value  P(>|z|)
##    .SPH               0.926    0.103    9.016    0.000
##    .NC                0.657    0.226    2.906    0.004
##    .OM                0.993    0.100    9.978    0.000
##    .CL                0.953    0.118    8.086    0.000
##    .DO                0.966    0.108    8.977    0.000
##    .WPH               0.988    0.099    9.938    0.000
##    .SD                0.992    0.100    9.954    0.000
##    .BM                0.985    0.102    9.618    0.000
##    .EP                0.948    0.166    5.720    0.000
##     SueloCalidad      0.069    0.057    1.197    0.231
##     AguaCalidad       0.042    0.075    0.558    0.577
##    .EcoSalud          0.018    0.073    0.246    0.806
lavaanPlot(dfEE, coef= TRUE, cov = TRUE)
LS0tDQp0aXRsZTogIkFjdGl2aWRhZCBJbnRlZ3JhZG9yYSAyIg0KYXV0aG9yOiAiU2VydmFuZG8gQmFjYSBEw61heiBBMDA4MzQ2NDciDQpkYXRlOiAiMjAyNS0wOC0yMSINCm91dHB1dDoNCiAgaHRtbF9kb2N1bWVudDoNCiAgICB0b2M6IFRydWUNCiAgICB0b2NfZmxvYXQ6IFRydWUNCiAgICBjb2RlX2Rvd25sb2FkOiBUcnVlDQogICAgdGhlbWU6IGRhcmsNCi0tLQ0KPGNlbnRlcj4NCiFbXShodHRwczovL3RzZTEubW0uYmluZy5uZXQvdGgvaWQvT0lQLnFuRm4weXBtekJPUHcyUDRGd1BzNXdIYUZqP3I9MCZjYj10aGZjMSZycz0xJnBpZD1JbWdEZXRNYWluJm89NyZybT0zKQ0KPC9jZW50ZXI+DQoNCg0KIyA8c3BhbiBzdHlsZSA9ImNvbG9yOiB5ZWxsb3ciPiBDb250ZXh0byA8L3NwYW4+DQoNCkNhbGlkYWQgZGVsIFN1ZWxvOg0KbyBTUEg6IHBIIGRlbCBTdWVsbw0KbyBOQzogQ29udGVuaWRvIGRlIE51dHJpZW50ZXMNCm8gT006IE1hdGVyaWEgT3Jnw6FuaWNhDQrigKIgQ2FsaWRhZCBkZWwgQWd1YToNCm8gQ0w6IE5pdmVsZXMgZGUgQ29udGFtaW5hbnRlcw0KbyBETzogT3jDrWdlbm8gRGlzdWVsdG8NCm8gV1BIOiBwSCBkZWwgQWd1YQ0K4oCiIFNhbHVkIGRlbCBFY29zaXN0ZW1hDQpvIFNEOiBEaXZlcnNpZGFkIGRlIEVzcGVjaWVzDQpvIEJNOiBCaW9tYXNhDQpvIEVQOiBQcm9kdWN0aXZpZGFkIGRlbCBFY29zaXN0ZW1hDQoNCkZ1ZW50ZSBQYXJ0ZSAxOiAiQzpcXFVzZXJzXFxzZXJ2YVxcRG93bmxvYWRzXFxob2dhcmVzLnhsc3giDQpGdWVudGUgcGFydGUgMjogIkM6XFxVc2Vyc1xcc2VydmFcXERvd25sb2Fkc1xccG9wdWxhdGlvbi5jc3YiDQpGdWVudGUgUGFydGUgMzoiQzpcXFVzZXJzXFxzZXJ2YVxcRG93bmxvYWRzXFxlY29zaXN0ZW1hLmNzdiINCg0KDQojIDxzcGFuIHN0eWxlID0iY29sb3I6IHllbGxvdyI+IEluc3RhbGFyIHBhcXVldGVzIHkgbGxhbWFyIGxpYnJlcmlyYXM8L3NwYW4+DQpgYGB7ciBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KI2luc3RhbGwucGFja2FnZXMoInRpZHl2ZXJzZSIpDQpsaWJyYXJ5KHRpZHl2ZXJzZSkNCiNpbnN0YWxsLnBhY2thZ2VzKCJncGxvdHMiKQ0KbGlicmFyeShncGxvdHMpDQojaW5zdGFsbC5wYWNrYWdlcygicGxtIikNCmxpYnJhcnkocGxtKQ0KI2luc3RhbGwucGFja2FnZXMoIkRhdGFFeHBsb3JlciIpDQpsaWJyYXJ5KERhdGFFeHBsb3JlcikNCiNpbnN0YWxsLnBhY2thZ2VzKCJmb3JlY2FzdCIpDQpsaWJyYXJ5KGZvcmVjYXN0KQ0KI2luc3RhbGwucGFja2FnZXMoImxhdmFhbiIpDQpsaWJyYXJ5KGxhdmFhbikNCiNpbnN0YWxsLnBhY2thZ2VzKCJsYXZhYW5QbG90IikNCmxpYnJhcnkobGF2YWFuUGxvdCkNCiNpbnN0YWxsLnBhY2thZ2VzKCJyZWFkeGwiKQ0KbGlicmFyeShyZWFkeGwpDQojaW5zdGFsbC5wYWNrYWdlcygibG10ZXN0IikNCmxpYnJhcnkobG10ZXN0KQ0KIyBpbnN0YWxsLnBhY2thZ2VzKCJXREkiKQ0KbGlicmFyeShXREkpDQojIGluc3RhbGwucGFja2FnZXMoIndic3RhdHMiKQ0KbGlicmFyeSh3YnN0YXRzKQ0KIyBpbnN0YWxsLnBhY2thZ2VzKCJ0aWR5dmVyc2UiKQ0KbGlicmFyeSh0aWR5dmVyc2UpDQojaW5zdGFsbC5wYWNrYWdlcygiZGV2dG9vbHMiKQ0KbGlicmFyeShkZXZ0b29scykNCiNkZXZ0b29sczo6aW5zdGFsbF9naXRodWIoImRpZWdvdmFsbGUvbXhtYXBzIikNCmxpYnJhcnkobXhtYXBzKQ0KI2luc3RhbGwucGFja2FnZXMoInJlbW90ZXMiKQ0KbGlicmFyeShyZW1vdGVzKQ0KI2luc3RhbGwucGFja2FnZXMoInNmIikNCmxpYnJhcnkoc2YpDQojaW5zdGFsbC5wYWNrYWdlcygiZm9yZWNhc3QiKQ0KbGlicmFyeShmb3JlY2FzdCkNCmBgYA0KDQojIDxzcGFuIHN0eWxlID0iY29sb3I6IHllbGxvdyI+IFRlbWEgMS4gRGF0b3MgZGUgcGFuZWw6IEhvZ2FyZXMgPC9zcGFuPg0KDQojIyA8c3BhbiBzdHlsZSA9ImNvbG9yOiB5ZWxsb3ciPiBJbXBvcnRhciBsYSBiYXNlIGRlIGRhdG9zIDwvc3Bhbj4NCmBgYHtyfQ0KZGZQMSA8LSByZWFkX2V4Y2VsKCJDOi9Vc2Vycy9zZXJ2YS9Eb3dubG9hZHMvaG9nYXJlcy54bHN4IikNCg0KIyAyKSBSZW5vbWJyYXIgbGEgY29sdW1uYSAnQcOxbycgLT4gJ0FuaW8nIHNpbiB1c2FyIGxhIMOxIChzb3BvcnRhIEHvv71vIC8gQcODwrFvIC8gQcOxbykNCm5hbWVzKGRmUDEpW2dyZXBsKCJeQS57MSwyfW8kIiwgbmFtZXMoZGZQMSkpXSA8LSAiQW5pbyINCg0KIyAoT3BjaW9uYWwpIFZlcmlmaWNhIGPDs21vIHF1ZWRhcm9uIGxvcyBub21icmVzDQpwcmludChuYW1lcyhkZlAxKSkNCg0KIyAzKSBUaXBvcw0KZGZQMSRIb2dhcklEIDwtIGFzLmludGVnZXIoZGZQMSRIb2dhcklEKQ0KZGZQMSRBbmlvICAgIDwtIGFzLmludGVnZXIoZGZQMSRBbmlvKQ0KDQojIDQpIENyZWFyIGVsIHBhbmVsDQpwYW5lbDEgPC0gcGRhdGEuZnJhbWUoZGZQMSwgaW5kZXggPSBjKCJIb2dhcklEIiwgIkFuaW8iKSkNCg0KYGBgDQoNCiMjIDxzcGFuIHN0eWxlID0iY29sb3I6IHllbGxvdyI+IFJldmlzYXIgSGV0ZXJvZ2VuZWlkYWQgPC9zcGFuPg0KYGBge3IgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCnBsb3RtZWFucyhJbmdyZXNvIH4gSG9nYXJJRCwgbWFpbiA9ICJIZXRlcm9nZW5laWRhZCBlbnRyZSBob2dhcmVzIHBhcmEgZWwgaW5ncmVzbyIsIGRhdGEgPSBwYW5lbDEpDQpgYGANCiMjIDxzcGFuIHN0eWxlID0iY29sb3I6IHllbGxvdyI+IE1vZGVsbyAxLCBSZW5vbWJyYXIgIlNhdGlzZmFjY2nDs24iIHNpbiBUaWxkZSBwb3IgcHJvYmxlbWFzIGRlIHRpcG8gZGUgYXJjaGl2byA8L3NwYW4+DQpgYGB7cn0NCiMgKDEpIFJlbm9tYnJhciAnU2F0aXNmYWNjacOzbicgLT4gJ1NhdGlzZmFjY2lvbicgU0lOIHRpbGRlDQpjb2xfc2F0IDwtIGdyZXAoIl5TYXRpc2YiLCBuYW1lcyhkZlAxKSwgaWdub3JlLmNhc2UgPSBUUlVFLCB2YWx1ZSA9IFRSVUUpDQpzdG9waWZub3QobGVuZ3RoKGNvbF9zYXQpID09IDEpDQpuYW1lcyhkZlAxKVtuYW1lcyhkZlAxKSA9PSBjb2xfc2F0XSA8LSAiU2F0aXNmYWNjaW9uIg0KbmFtZXMoZGZQMSkgICMgZGViZSBtb3N0cmFyICdTYXRpc2ZhY2Npb24nDQoNCmBgYA0KDQojIyA8c3BhbiBzdHlsZSA9ImNvbG9yOiB5ZWxsb3ciPiBNb2RlbG8gMS4gUmVjcmVhciBlbCBwYW5lbCBERVNQVcOJUyBkZWwgcmVuYW1lIDwvc3Bhbj4NCmBgYHtyfQ0KcGFuZWwxIDwtIHBkYXRhLmZyYW1lKGRmUDEsIGluZGV4ID0gYygiSG9nYXJJRCIsIkFuaW8iKSkNCg0KIyBDb21wcm9iYWNpw7NuOiDCv2V4aXN0ZSBTYXRpc2ZhY2Npb24gZW4gcGFuZWwxPw0KbmFtZXMocGFuZWwxKQ0KZ3JlcCgiXlNhdGlzZiIsIG5hbWVzKHBhbmVsMSksIHZhbHVlID0gVFJVRSkNCnN0b3BpZm5vdCgiU2F0aXNmYWNjaW9uIiAlaW4lIG5hbWVzKHBhbmVsMSkpDQpgYGANCg0KIyMgPHNwYW4gc3R5bGUgPSJjb2xvcjogeWVsbG93Ij4gTW9kZWxvIDEsIFJlZ3Jlc2nDs24gYWdydXBhZGEgPC9zcGFuPg0KYGBge3J9DQpwb29sZWQgPC0gcGxtKEluZ3Jlc28gfiBTYXRpc2ZhY2Npb24sIGRhdGEgPSBwYW5lbDEsIG1vZGVsID0gInBvb2xpbmciKQ0Kc3VtbWFyeShwb29sZWQpDQpgYGANCg0KIyMgPHNwYW4gc3R5bGUgPSJjb2xvcjogeWVsbG93Ij4gTW9kZWxvIDIsIEVmZWN0b3MgZmlqb3MgKHdoaXRpbikgPC9zcGFuPg0KYGBge3J9DQp3aXRoaW4gPC0gcGxtKEluZ3Jlc28gfiBTYXRpc2ZhY2Npb24gLCBkYXRhID0gcGFuZWwxLCBtb2RlbCA9ICJ3aXRoaW4iKQ0Kc3VtbWFyeSh3aXRoaW4pDQpgYGANCg0KIyMgPHNwYW4gc3R5bGUgPSJjb2xvcjogeWVsbG93Ij4gTW9kZWxvIFBvb2xlZCB2cyA+TW9kZWxvIGRlIGVmZWN0b3MgZmlqb3MgPC9zcGFuPg0KYGBge3J9DQpwRnRlc3Qod2l0aGluLCBwb29sZWQpDQpgYGANCiMjIDxzcGFuIHN0eWxlID0iY29sb3I6IHllbGxvdyI+IE1vZGVsbyAzLiBFZmVjdG9zIEFsZWF0b3Jpb3MgKHJhbmRvbSkgLSBtZXRvZG8gd2FsaHVzIDwvc3Bhbj4NCmBgYHtyfQ0Kd2FsaHVzIDwtIHBsbShJbmdyZXNvIH4gU2F0aXNmYWNjaW9uLCBkYXRhID0gcGFuZWwxLCBtb2RlbCA9ICJyYW5kb20iLCByYW5kb20ubWV0aG9kID0gIndhbGh1cyIpDQpzdW1tYXJ5KHdhbGh1cykNCmBgYA0KIyMgPHNwYW4gc3R5bGUgPSJjb2xvcjogeWVsbG93Ij4gTW9kZWxvIDMuIEVmZWN0b3MgQWxlYXRvcmlvcyAocmFuZG9tKSAtIG1ldG9kbyBhbWVtaXlhIDwvc3Bhbj4NCmBgYHtyfQ0KYW1lbWl5YSA8LSBwbG0oSW5ncmVzbyB+IFNhdGlzZmFjY2lvbiwgZGF0YSA9IHBhbmVsMSwgbW9kZWwgPSAicmFuZG9tIiwgcmFuZG9tLm1ldGhvZCA9ICJhbWVtaXlhIikNCnN1bW1hcnkoYW1lbWl5YSkNCmBgYA0KIyMgPHNwYW4gc3R5bGUgPSJjb2xvcjogeWVsbG93Ij4gTW9kZWxvIDMuIEVmZWN0b3MgQWxlYXRvcmlvcyAocmFuZG9tKSAtIG1ldG9kbyBuZXJsb3ZlIDwvc3Bhbj4NCmBgYHtyfQ0KbmVybG92ZSA8LSBwbG0oSW5ncmVzbyB+IFNhdGlzZmFjY2lvbiwgZGF0YSA9IHBhbmVsMSwgbW9kZWwgPSAicmFuZG9tIiwgcmFuZG9tLm1ldGhvZCA9ICJuZXJsb3ZlIikNCnN1bW1hcnkobmVybG92ZSkNCmBgYA0KIyMgPHNwYW4gc3R5bGUgPSJjb2xvcjogeWVsbG93Ij4gTW9kZWxvIGRlIGVmZWN0b3MgZmlqb3MgdnMgbW9kZWxvIGRlIGVmZWN0b3MgYWxlYXRvcmlvcyA8L3NwYW4+DQpgYGB7cn0NCnBodGVzdCh3YWxodXMsd2l0aGluKQ0KYGBgDQpTaSBlcyBwdmFsdWUgZXMgPDAuMDUgdXNhbW9zIGVmZWNjdG9zIGZpam9zLg0KDQpQb3IgbG8gdGFudG8gbm9zIHF1ZWRhbW9zIGNvbiBlbCBtb2RlbG8gZGUgZWZlY3RvcyBmaWpvcw0KDQoNCiMgPHNwYW4gc3R5bGUgPSJjb2xvcjogeWVsbG93Ij4gVGVtYSAyLiBTZXJpZXMgZGUgVGllbXBvOiBNYXBhcyA8L3NwYW4+DQoNCiMjIDxzcGFuIHN0eWxlID0iY29sb3I6IHllbGxvdyI+IEdlbmVyYXIgU2VyaWUgZGUgVGllbXBvIHkgbWFwYSA8L3NwYW4+DQpgYGB7cn0NCmRmUDIgPC0gZGZfbXhzdGF0ZV8yMDIwDQoNCmRmX214c3RhdGVfMjAyMCR2YWx1ZSA8LSBkZlAyJHBvcA0KbXhzdGF0ZV9jaG9yb3BsZXRoKGRmX214c3RhdGVfMjAyMCkNCmBgYA0KDQojIyA8c3BhbiBzdHlsZSA9ImNvbG9yOiB5ZWxsb3ciPiBJbXBvcnRhciBiYXNlIGRlIGRhdG9zPC9zcGFuPg0KYGBge3J9DQpkZlAzIDwtIHJlYWQuY3N2KCJDOlxcVXNlcnNcXHNlcnZhXFxEb3dubG9hZHNcXHBvcHVsYXRpb24uY3N2IikNCmBgYA0KDQojIyA8c3BhbiBzdHlsZSA9ImNvbG9yOiB5ZWxsb3ciPiBHZW5lcmFyIHNlcmllIGRlIHRpZW1wbzogVFg8L3NwYW4+DQpgYGB7cn0NCmRmUDNfMSA8LSBkZlAzICU+JSBmaWx0ZXIoc3RhdGUgPT0gIlRYIikNCnRzIDwtIHRzIChkZlAzXzEkcG9wdWxhdGlvbiwgc3RhcnQ9IDE5MDAsIGZyZXF1ZW5jeSA9IDEpDQpgYGANCg0KDQojIyA8c3BhbiBzdHlsZSA9ImNvbG9yOiB5ZWxsb3ciPiBHZW5lcmFyIGVsIG1vZGVsbyBBUklNQSA8L3NwYW4+DQpgYGB7cn0NCmFyaW1hIDwtIGF1dG8uYXJpbWEodHMpDQpzdW1tYXJ5KGFyaW1hKQ0KYGBgDQojIyA8c3BhbiBzdHlsZSA9ImNvbG9yOiB5ZWxsb3ciPiBHZW5lcmFyIGVsIFByb25vc3RpY28gPC9zcGFuPg0KYGBge3J9DQpwcm9ub3N0aWNvIDwtIGZvcmVjYXN0KGFyaW1hLCBsZXZlbD0gOTUsIGggPSA1KQ0KcHJvbm9zdGljbw0KcGxvdChwcm9ub3N0aWNvLCBtYWluID0gIlBvYmxhY2lvbiBUZXhhcyIpDQpgYGANCg0KIyA8c3BhbiBzdHlsZSA9ImNvbG9yOiB5ZWxsb3ciPiBUZW1hIDMsIE1vZGVsb3MgZGUgZWN1YWNpb25lcyBlc3RydWN0dXJhbGVzIDwvc3Bhbj4NCg0KIyMgPHNwYW4gc3R5bGUgPSJjb2xvcjogeWVsbG93Ij4gSW1wb3J0YXIgbGEgYmFzZSBkZSBkYXRvcyA8L3NwYW4+DQpgYGB7cn0NCmRmUDMgPC0gcmVhZC5jc3YoIkM6XFxVc2Vyc1xcc2VydmFcXERvd25sb2Fkc1xcZWNvc2lzdGVtYS5jc3YiKQ0KYGBgDQoNCiMjIDxzcGFuIHN0eWxlID0iY29sb3I6IHllbGxvdyI+IEdlbmVyYXIgZWwgTW9kZWxvIDwvc3Bhbj4NCmBgYHtyfQ0KbW9kZWxvIDwtICcgI1JlZ3Jlc2lvbmVzDQogICAgICAgICAgICAgIEVjb1NhbHVkIH4gU3VlbG9DYWxpZGFkICsgQWd1YUNhbGlkYWQNCiAgICAgICAgICAgICAgIyBWYXJpYWJsZXMgbGF0ZW50ZXMNCiAgICAgICAgICAgICAgU3VlbG9DYWxpZGFkID1+IFNQSCArIE5DICsgT00NCiAgICAgICAgICAgICAgQWd1YUNhbGlkYWQgPX4gQ0wgKyBETyArIFdQSA0KICAgICAgICAgICAgICBFY29TYWx1ZCA9fiBTRCArIEJNICsgRVANCiAgICAgICAgICAgICAgIyBWYXJpYW56YXMgeSBjb3Zhcmlhbnphcw0KICAgICAgICAgICAgICAjSW50ZXJjZXB0bw0KICAgICAgICAgICAgICAnDQoNCmBgYA0KDQojIyA8c3BhbiBzdHlsZSA9ImNvbG9yOiB5ZWxsb3ciPiBHZW5lcmFyIGVsIERpYWdyYW1hIDwvc3Bhbj4NCmBgYHtyfQ0KZGZFIDwtIHNjYWxlKGRmUDMpDQpkZkVFIDwtIGNmYShtb2RlbG8sIGRmRSkNCnN1bW1hcnkoZGZFRSkNCmxhdmFhblBsb3QoZGZFRSwgY29lZj0gVFJVRSwgY292ID0gVFJVRSkNCmBgYA0KDQoNCg==