Script para la obtención de indicadores del Banco Mundial

Integrantes del equipo:

  1. Vivian Pérez Mosqueda - A01731984
  2. Sebastian Romano Mena - A00831709
  3. Victor Manuel Muñoz Tirado - A01423434
library(WDI)
library(wbstats)
library(tidyverse)
gob_data <- wb_data(country = c("MX","EC","Ca"), indicator = "NY.GDP.PCAP.CD", start_date=2013, end_date=2023)
panel <- select(gob_data,country,date,NY.GDP.PCAP.CD)

Ejercicio 2: Conjunto de datos de panel con indicadores del Banco Mundial

library(gplots)
library(plm)
eco_data<-wb_data(country = c("AR","US","MX","CN"), indicator = c("NY.GDP.MKTP.KD.ZG","SL.UEM.TOTL.ZS",
"AG.LND.AGRI.ZS", "AG.LND.ARBL.ZS", "EG.ELC.ACCS.ZS", "SP.POP.GROW", "GB.XPD.RSDV.GD.ZS"))
panel <- select(eco_data,country,date,NY.GDP.MKTP.KD.ZG)
panel <-subset(eco_data,date==2000 | date==2010 | date==2015 | date==2020)
panel <- pdata.frame(panel, index=c("country","date"))

Tarea 2: Gráficas de Heterogeneidad

plotmeans(panel$NY.GDP.MKTP.KD.ZG ~ panel$country,xlab="País",ylab="GDP",
             mean.labels=TRUE, digits=-3,
             col="red",connect=TRUE, main="Heterogeneidad entre paises")  

plotmeans(panel$NY.GDP.MKTP.KD.ZG ~ panel$date,xlab="Años",ylab="GDP",
             mean.labels=TRUE, digits=-3,
             col="red", connect=TRUE, main="Heterogeneidad entre años")

    • Pregunta 1: La línea que une los promedios entre países presenta picos y entre años se mantiene una línea casi horizontal hasta llegar al año 2020, donde presenta picos más marcados.

    • Pregunta 2: Los intervalos de confianza se encuentran desfasados en ambas gráficas.

    • Pregunta 3: Sí existe heterogeneidad, lo que significa que hay una variación en los datos. Esto puede ser algo deseable en los datos debido a que esto nos permite encontrar diferencias entre las variables.

Ejercicio 3: Modelos con Indicadores del Banco Mundial

pooled<-plm(NY.GDP.MKTP.KD.ZG ~ SL.UEM.TOTL.ZS+
AG.LND.AGRI.ZS+AG.LND.ARBL.ZS+EG.ELC.ACCS.ZS+SP.POP.GROW+GB.XPD.RSDV.GD.ZS , data=panel ,model = "pooling")

summary(pooled)
## Pooling Model
## 
## Call:
## plm(formula = NY.GDP.MKTP.KD.ZG ~ SL.UEM.TOTL.ZS + AG.LND.AGRI.ZS + 
##     AG.LND.ARBL.ZS + EG.ELC.ACCS.ZS + SP.POP.GROW + GB.XPD.RSDV.GD.ZS, 
##     data = panel, model = "pooling")
## 
## Balanced Panel: n = 4, T = 4, N = 16
## 
## Residuals:
##    Min. 1st Qu.  Median 3rd Qu.    Max. 
## -8.1043 -1.9711  1.2967  2.3740  5.8281 
## 
## Coefficients:
##                    Estimate Std. Error t-value Pr(>|t|)
## (Intercept)       108.49114  161.77765  0.6706   0.5193
## SL.UEM.TOTL.ZS     -0.11244    0.70155 -0.1603   0.8762
## AG.LND.AGRI.ZS      1.07183    0.65102  1.6464   0.1341
## AG.LND.ARBL.ZS      2.14456    1.21025  1.7720   0.1102
## EG.ELC.ACCS.ZS     -1.82557    1.44565 -1.2628   0.2384
## SP.POP.GROW        -4.69836    4.18512 -1.1226   0.2906
## GB.XPD.RSDV.GD.ZS  -1.70636    2.19119 -0.7787   0.4561
## 
## Total Sum of Squares:    512.67
## Residual Sum of Squares: 236.86
## R-Squared:      0.53799
## Adj. R-Squared: 0.22998
## F-statistic: 1.74666 on 6 and 9 DF, p-value: 0.21687
within<-plm(NY.GDP.MKTP.KD.ZG ~ SL.UEM.TOTL.ZS+
AG.LND.AGRI.ZS+AG.LND.ARBL.ZS+EG.ELC.ACCS.ZS+SP.POP.GROW+GB.XPD.RSDV.GD.ZS , data=panel ,model = "within")

summary(within)
## Oneway (individual) effect Within Model
## 
## Call:
## plm(formula = NY.GDP.MKTP.KD.ZG ~ SL.UEM.TOTL.ZS + AG.LND.AGRI.ZS + 
##     AG.LND.ARBL.ZS + EG.ELC.ACCS.ZS + SP.POP.GROW + GB.XPD.RSDV.GD.ZS, 
##     data = panel, model = "within")
## 
## Balanced Panel: n = 4, T = 4, N = 16
## 
## Residuals:
##     Min.  1st Qu.   Median  3rd Qu.     Max. 
## -4.98771 -2.38596  0.41446  1.92653  5.64725 
## 
## Coefficients:
##                   Estimate Std. Error t-value Pr(>|t|)  
## SL.UEM.TOTL.ZS    -0.60572    0.97119 -0.6237  0.55579  
## AG.LND.AGRI.ZS     3.29170    1.43542  2.2932  0.06167 .
## AG.LND.ARBL.ZS     0.47688    2.68288  0.1777  0.86477  
## EG.ELC.ACCS.ZS     0.75577    3.26340  0.2316  0.82455  
## SP.POP.GROW       -3.77042    7.00843 -0.5380  0.60995  
## GB.XPD.RSDV.GD.ZS -3.72381    7.02411 -0.5301  0.61505  
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Total Sum of Squares:    401.22
## Residual Sum of Squares: 144.53
## R-Squared:      0.63977
## Adj. R-Squared: 0.099435
## F-statistic: 1.77603 on 6 and 6 DF, p-value: 0.25126
pFtest(within,pooled)
## 
##  F test for individual effects
## 
## data:  NY.GDP.MKTP.KD.ZG ~ SL.UEM.TOTL.ZS + AG.LND.AGRI.ZS + AG.LND.ARBL.ZS +  ...
## F = 1.2777, df1 = 3, df2 = 6, p-value = 0.364
## alternative hypothesis: significant effects
walhus<-plm(NY.GDP.MKTP.KD.ZG ~ SL.UEM.TOTL.ZS+
AG.LND.AGRI.ZS+AG.LND.ARBL.ZS+EG.ELC.ACCS.ZS+SP.POP.GROW+GB.XPD.RSDV.GD.ZS , data=panel ,model = "random", random.method = "walhus")

summary(walhus)
## Oneway (individual) effect Random Effect Model 
##    (Wallace-Hussain's transformation)
## 
## Call:
## plm(formula = NY.GDP.MKTP.KD.ZG ~ SL.UEM.TOTL.ZS + AG.LND.AGRI.ZS + 
##     AG.LND.ARBL.ZS + EG.ELC.ACCS.ZS + SP.POP.GROW + GB.XPD.RSDV.GD.ZS, 
##     data = panel, model = "random", random.method = "walhus")
## 
## Balanced Panel: n = 4, T = 4, N = 16
## 
## Effects:
##                  var std.dev share
## idiosyncratic 19.349   4.399     1
## individual     0.000   0.000     0
## theta: 0
## 
## Residuals:
##    Min. 1st Qu.  Median 3rd Qu.    Max. 
## -8.1043 -1.9711  1.2967  2.3740  5.8281 
## 
## Coefficients:
##                    Estimate Std. Error z-value Pr(>|z|)  
## (Intercept)       108.49114  161.77765  0.6706  0.50246  
## SL.UEM.TOTL.ZS     -0.11244    0.70155 -0.1603  0.87267  
## AG.LND.AGRI.ZS      1.07183    0.65102  1.6464  0.09968 .
## AG.LND.ARBL.ZS      2.14456    1.21025  1.7720  0.07640 .
## EG.ELC.ACCS.ZS     -1.82557    1.44565 -1.2628  0.20666  
## SP.POP.GROW        -4.69836    4.18512 -1.1226  0.26159  
## GB.XPD.RSDV.GD.ZS  -1.70636    2.19119 -0.7787  0.43614  
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Total Sum of Squares:    512.67
## Residual Sum of Squares: 236.86
## R-Squared:      0.53799
## Adj. R-Squared: 0.22998
## Chisq: 10.4799 on 6 DF, p-value: 0.10584
nerlove<-plm(NY.GDP.MKTP.KD.ZG ~ SL.UEM.TOTL.ZS+
AG.LND.AGRI.ZS+AG.LND.ARBL.ZS+EG.ELC.ACCS.ZS+SP.POP.GROW+GB.XPD.RSDV.GD.ZS , data=panel ,model = "random", random.method = "nerlove")

summary(nerlove)
## Oneway (individual) effect Random Effect Model 
##    (Nerlove's transformation)
## 
## Call:
## plm(formula = NY.GDP.MKTP.KD.ZG ~ SL.UEM.TOTL.ZS + AG.LND.AGRI.ZS + 
##     AG.LND.ARBL.ZS + EG.ELC.ACCS.ZS + SP.POP.GROW + GB.XPD.RSDV.GD.ZS, 
##     data = panel, model = "random", random.method = "nerlove")
## 
## Balanced Panel: n = 4, T = 4, N = 16
## 
## Effects:
##                   var std.dev share
## idiosyncratic   9.033   3.006 0.028
## individual    308.516  17.565 0.972
## theta: 0.9148
## 
## Residuals:
##     Min.  1st Qu.   Median  3rd Qu.     Max. 
## -5.44445 -2.22648  0.45774  2.91280  4.41861 
## 
## Coefficients:
##                    Estimate Std. Error z-value Pr(>|z|)  
## (Intercept)       -93.54726  235.48687 -0.3973  0.69118  
## SL.UEM.TOTL.ZS     -0.47168    0.82125 -0.5743  0.56574  
## AG.LND.AGRI.ZS      2.77116    1.11836  2.4779  0.01322 *
## AG.LND.ARBL.ZS      1.39124    1.94063  0.7169  0.47343  
## EG.ELC.ACCS.ZS     -0.50775    2.27171 -0.2235  0.82314  
## SP.POP.GROW        -4.94041    5.70743 -0.8656  0.38670  
## GB.XPD.RSDV.GD.ZS  -1.43001    4.94935 -0.2889  0.77264  
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Total Sum of Squares:    402.03
## Residual Sum of Squares: 162.37
## R-Squared:      0.59612
## Adj. R-Squared: 0.32687
## Chisq: 13.2839 on 6 DF, p-value: 0.038742
phtest(nerlove,within)
## 
##  Hausman Test
## 
## data:  NY.GDP.MKTP.KD.ZG ~ SL.UEM.TOTL.ZS + AG.LND.AGRI.ZS + AG.LND.ARBL.ZS +  ...
## chisq = 0.42756, df = 6, p-value = 0.9986
## alternative hypothesis: one model is inconsistent

Tarea 3: Patentes

library(WDI)
library(wbstats)
library(tidyverse)
library(gplots)
library(plm)
library(readxl)
library(dplyr)
library(gplots)
PATENT_3 <- read_excel("PATENT 3.xls",sheet = "Sheet1")
PATENT_3 <- na.omit(PATENT_3)
panel<- select(PATENT_3,patentsg,return, year, cusip , employ , rnd, sales, stckpr)
plotmeans(panel$patentsg ~ panel$year,xlab="Años",ylab="Patentes",
             mean.labels=TRUE, digits=-3,
             col="red",connect=TRUE, main="Heterogeneidad entre patentes")  

plotmeans(panel$patentsg ~ panel$cusip,xlab="Empresas",ylab="Patentes",
             mean.labels=TRUE, digits=-3,
             col="red",connect=TRUE, main="Heterogeneidad entre empresas") 

panel2<-pdata.frame(panel, index=c("cusip","year"))
within <- plm(patentsg ~ return + employ + rnd + sales + stckpr, data = panel, index = c("cusip", "year"), model = "within")

walhus <- plm(patentsg ~ return + employ + rnd + sales + stckpr, data = panel, index = c("cusip", "year"), model = "random", random.method = 'walhus')
phtest(walhus, within)
## 
##  Hausman Test
## 
## data:  patentsg ~ return + employ + rnd + sales + stckpr
## chisq = 501.39, df = 5, p-value < 2.2e-16
## alternative hypothesis: one model is inconsistent
summary(within)
## Oneway (individual) effect Within Model
## 
## Call:
## plm(formula = patentsg ~ return + employ + rnd + sales + stckpr, 
##     data = panel, model = "within", index = c("cusip", "year"))
## 
## Unbalanced Panel: n = 215, T = 2-10, N = 2083
## 
## Residuals:
##       Min.    1st Qu.     Median    3rd Qu.       Max. 
## -219.22852   -2.15429   -0.32051    1.82530  267.24979 
## 
## Coefficients:
##           Estimate  Std. Error  t-value  Pr(>|t|)    
## return -0.05875796  0.10859324  -0.5411   0.58852    
## employ -0.06008489  0.06378744  -0.9420   0.34634    
## rnd    -0.13925828  0.01277223 -10.9032 < 2.2e-16 ***
## sales  -0.00157648  0.00036809  -4.2829 1.938e-05 ***
## stckpr  0.05327363  0.02907453   1.8323   0.06706 .  
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Total Sum of Squares:    713530
## Residual Sum of Squares: 587240
## R-Squared:      0.177
## Adj. R-Squared: 0.080254
## F-statistic: 80.1338 on 5 and 1863 DF, p-value: < 2.22e-16
summary(walhus)
## Oneway (individual) effect Random Effect Model 
##    (Wallace-Hussain's transformation)
## 
## Call:
## plm(formula = patentsg ~ return + employ + rnd + sales + stckpr, 
##     data = panel, model = "random", random.method = "walhus", 
##     index = c("cusip", "year"))
## 
## Unbalanced Panel: n = 215, T = 2-10, N = 2083
## 
## Effects:
##                   var std.dev share
## idiosyncratic  491.88   22.18 0.182
## individual    2206.61   46.97 0.818
## theta:
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##  0.6833  0.8523  0.8523  0.8504  0.8523  0.8523 
## 
## Residuals:
##     Min.  1st Qu.   Median     Mean  3rd Qu.     Max. 
## -145.414   -4.430   -2.204    0.037    0.557  307.273 
## 
## Coefficients:
##                Estimate  Std. Error z-value  Pr(>|z|)    
## (Intercept) 14.02575017  3.21531882  4.3622 1.288e-05 ***
## return      -0.12918817  0.12078351 -1.0696    0.2848    
## employ       0.86554048  0.04969144 17.4183 < 2.2e-16 ***
## rnd         -0.09578384  0.01366226 -7.0108 2.369e-12 ***
## sales       -0.00243471  0.00039724 -6.1290 8.843e-10 ***
## stckpr       0.20200524  0.03136593  6.4403 1.193e-10 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Total Sum of Squares:    1004200
## Residual Sum of Squares: 828750
## R-Squared:      0.17473
## Adj. R-Squared: 0.17275
## Chisq: 441.974 on 5 DF, p-value: < 2.22e-16
  • El mejor modelo, cuando comparamos el modelo fijo y aleatorio, nos da como resultado que el modelo aleatoria nos da un mejor resultado a comparación del modelo fijo, a pesar de que la prueba de Hausman nos da como hipótesis que uno de los modelos es inconsistente. Con respecto a qué tan buenos serían estos modelos en pronóstico, en mi opinión, creo que estos modelos son bastante deficientes y que los pronósticos realizados nos darán resultados los cuales pueden que no sean del todo satisfactorios.
LS0tDQp0aXRsZTogIkFjdGl2aWRhZCAxIg0KYXV0aG9yOiAiVmljdG9yIE1hbnVlbCBNdcOxb3ogVGlyYWRvIEEwMTQyMzQzNCINCmRhdGU6ICIyMDI0LTAyLTIxIg0Kb3V0cHV0Og0KIGh0bWxfZG9jdW1lbnQ6DQogIHRvYzogVFJVRQ0KICB0b2NfZmxvYXQ6IFRSVUUNCiAgY29kZV9kb3dubG9hZDogVFJVRQ0KIGVkaXRvcl9vcHRpb25zOg0KICBtYXJrZG93bjoNCiAgd3JhcDogNzINCi0tLQ0KDQohW10oaHR0cHM6Ly9saDMuZ29vZ2xldXNlcmNvbnRlbnQuY29tL3Byb3h5L1RmWjBobFMwbWtWNDd3bXFFaXZvR0hPRnhIX09JSjBpcDBYZHVzX0NOdVVtWm92endKVTZjdmJYdmlIblpab0lxMkhQLWZOR2NxVFp1ajZPWnlMSmkzY0pFQUk2MVpQMDVnT19tNmJ3LUpLOVQ1Q3cpDQoNCiMgU2NyaXB0IHBhcmEgbGEgb2J0ZW5jacOzbiBkZSBpbmRpY2Fkb3JlcyBkZWwgQmFuY28gTXVuZGlhbA0KDQpJbnRlZ3JhbnRlcyBkZWwgZXF1aXBvOg0KDQoxLiAgVml2aWFuIFDDqXJleiBNb3NxdWVkYSAtIEEwMTczMTk4NA0KMi4gIFNlYmFzdGlhbiBSb21hbm8gTWVuYSAtIEEwMDgzMTcwOQ0KMy4gIFZpY3RvciBNYW51ZWwgTXXDsW96IFRpcmFkbyAtIEEwMTQyMzQzNA0KDQpgYGB7ciBsaWJyZXJpYXMgMSwgbWVzc2FnZT1GQUxTRX0NCmxpYnJhcnkoV0RJKQ0KbGlicmFyeSh3YnN0YXRzKQ0KbGlicmFyeSh0aWR5dmVyc2UpDQpgYGANCg0KYGBge3IgRGF0b3MgMX0NCmdvYl9kYXRhIDwtIHdiX2RhdGEoY291bnRyeSA9IGMoIk1YIiwiRUMiLCJDYSIpLCBpbmRpY2F0b3IgPSAiTlkuR0RQLlBDQVAuQ0QiLCBzdGFydF9kYXRlPTIwMTMsIGVuZF9kYXRlPTIwMjMpDQpgYGANCg0KYGBge3IgUGFuZWwgZGUgZGF0b3MgMX0NCnBhbmVsIDwtIHNlbGVjdChnb2JfZGF0YSxjb3VudHJ5LGRhdGUsTlkuR0RQLlBDQVAuQ0QpDQpgYGANCg0KIyBFamVyY2ljaW8gMjogQ29uanVudG8gZGUgZGF0b3MgZGUgcGFuZWwgY29uIGluZGljYWRvcmVzIGRlbCBCYW5jbyBNdW5kaWFsDQoNCmBgYHtyIGxpYnJlcmlhcyAyLCBtZXNzYWdlPUZBTFNFfQ0KbGlicmFyeShncGxvdHMpDQpsaWJyYXJ5KHBsbSkNCmBgYA0KDQpgYGB7ciBEYXRvcyAyfQ0KZWNvX2RhdGE8LXdiX2RhdGEoY291bnRyeSA9IGMoIkFSIiwiVVMiLCJNWCIsIkNOIiksIGluZGljYXRvciA9IGMoIk5ZLkdEUC5NS1RQLktELlpHIiwiU0wuVUVNLlRPVEwuWlMiLA0KIkFHLkxORC5BR1JJLlpTIiwgIkFHLkxORC5BUkJMLlpTIiwgIkVHLkVMQy5BQ0NTLlpTIiwgIlNQLlBPUC5HUk9XIiwgIkdCLlhQRC5SU0RWLkdELlpTIikpDQpgYGANCg0KYGBge3IgUGFuZWwgZGUgZGF0b3MgMn0NCnBhbmVsIDwtIHNlbGVjdChlY29fZGF0YSxjb3VudHJ5LGRhdGUsTlkuR0RQLk1LVFAuS0QuWkcpDQpwYW5lbCA8LXN1YnNldChlY29fZGF0YSxkYXRlPT0yMDAwIHwgZGF0ZT09MjAxMCB8IGRhdGU9PTIwMTUgfCBkYXRlPT0yMDIwKQ0KcGFuZWwgPC0gcGRhdGEuZnJhbWUocGFuZWwsIGluZGV4PWMoImNvdW50cnkiLCJkYXRlIikpDQpgYGANCg0KIVtdKDxodHRwczovL3d3dy5hbmFseXRpY3NsYW5lLmNvbS9zdG9yYWdlLzIwMjAvMDUvbW92aWUuZ2lmPikNCg0KIyBUYXJlYSAyOiBHcsOhZmljYXMgZGUgSGV0ZXJvZ2VuZWlkYWQNCg0KYGBge3IgSGV0ZXJvZ2VuZWlkYWQgZW50cmUgcGFpc2VzfQ0KcGxvdG1lYW5zKHBhbmVsJE5ZLkdEUC5NS1RQLktELlpHIH4gcGFuZWwkY291bnRyeSx4bGFiPSJQYcOtcyIseWxhYj0iR0RQIiwNCiAgICAgICAgICAgICBtZWFuLmxhYmVscz1UUlVFLCBkaWdpdHM9LTMsDQogICAgICAgICAgICAgY29sPSJyZWQiLGNvbm5lY3Q9VFJVRSwgbWFpbj0iSGV0ZXJvZ2VuZWlkYWQgZW50cmUgcGFpc2VzIikgIA0KYGBgDQoNCmBgYHtyIEhldGVyb2dlbmVpZGFkIGVudHJlIGHDsW9zfQ0KcGxvdG1lYW5zKHBhbmVsJE5ZLkdEUC5NS1RQLktELlpHIH4gcGFuZWwkZGF0ZSx4bGFiPSJBw7FvcyIseWxhYj0iR0RQIiwNCiAgICAgICAgICAgICBtZWFuLmxhYmVscz1UUlVFLCBkaWdpdHM9LTMsDQogICAgICAgICAgICAgY29sPSJyZWQiLCBjb25uZWN0PVRSVUUsIG1haW49IkhldGVyb2dlbmVpZGFkIGVudHJlIGHDsW9zIikNCmBgYA0KDQotICAgPGRpdj4NCg0KICAgID4gLSAgICoqUHJlZ3VudGEgMSoqOiBMYSBsw61uZWEgcXVlIHVuZSBsb3MgcHJvbWVkaW9zIGVudHJlIHBhw61zZXMgcHJlc2VudGEgcGljb3MgeSBlbnRyZSBhw7FvcyBzZSBtYW50aWVuZSB1bmEgbMOtbmVhIGNhc2kgaG9yaXpvbnRhbCBoYXN0YSBsbGVnYXIgYWwgYcOxbyAyMDIwLCBkb25kZSBwcmVzZW50YSBwaWNvcyBtw6FzIG1hcmNhZG9zLg0KICAgID4NCiAgICA+IC0gICAqKlByZWd1bnRhIDIqKjogTG9zIGludGVydmFsb3MgZGUgY29uZmlhbnphIHNlIGVuY3VlbnRyYW4gZGVzZmFzYWRvcyBlbiBhbWJhcyBncsOhZmljYXMuDQogICAgPg0KICAgID4gLSAgICoqUHJlZ3VudGEgMyoqOiBTw60gZXhpc3RlIGhldGVyb2dlbmVpZGFkLCBsbyBxdWUgc2lnbmlmaWNhIHF1ZSBoYXkgdW5hIHZhcmlhY2nDs24gZW4gbG9zIGRhdG9zLiBFc3RvIHB1ZWRlIHNlciBhbGdvIGRlc2VhYmxlIGVuIGxvcyBkYXRvcyBkZWJpZG8gYSBxdWUgZXN0byBub3MgcGVybWl0ZSBlbmNvbnRyYXIgZGlmZXJlbmNpYXMgZW50cmUgbGFzIHZhcmlhYmxlcy4NCg0KICAgIDwvZGl2Pg0KDQojIEVqZXJjaWNpbyAzOiBNb2RlbG9zIGNvbiBJbmRpY2Fkb3JlcyBkZWwgQmFuY28gTXVuZGlhbA0KDQpgYGB7ciBNb2RlbG8gcG9vbGVkfQ0KcG9vbGVkPC1wbG0oTlkuR0RQLk1LVFAuS0QuWkcgfiBTTC5VRU0uVE9UTC5aUysNCkFHLkxORC5BR1JJLlpTK0FHLkxORC5BUkJMLlpTK0VHLkVMQy5BQ0NTLlpTK1NQLlBPUC5HUk9XK0dCLlhQRC5SU0RWLkdELlpTICwgZGF0YT1wYW5lbCAsbW9kZWwgPSAicG9vbGluZyIpDQoNCnN1bW1hcnkocG9vbGVkKQ0KYGBgDQoNCmBgYHtyIE1vZGVsbyB3aXRoaW59DQp3aXRoaW48LXBsbShOWS5HRFAuTUtUUC5LRC5aRyB+IFNMLlVFTS5UT1RMLlpTKw0KQUcuTE5ELkFHUkkuWlMrQUcuTE5ELkFSQkwuWlMrRUcuRUxDLkFDQ1MuWlMrU1AuUE9QLkdST1crR0IuWFBELlJTRFYuR0QuWlMgLCBkYXRhPXBhbmVsICxtb2RlbCA9ICJ3aXRoaW4iKQ0KDQpzdW1tYXJ5KHdpdGhpbikNCmBgYA0KDQpgYGB7ciBQcnVlYmEgcEZ9DQpwRnRlc3Qod2l0aGluLHBvb2xlZCkNCmBgYA0KDQpgYGB7ciBNb2RlbG8gcmFuZG9tICh3YWxodXMpfQ0Kd2FsaHVzPC1wbG0oTlkuR0RQLk1LVFAuS0QuWkcgfiBTTC5VRU0uVE9UTC5aUysNCkFHLkxORC5BR1JJLlpTK0FHLkxORC5BUkJMLlpTK0VHLkVMQy5BQ0NTLlpTK1NQLlBPUC5HUk9XK0dCLlhQRC5SU0RWLkdELlpTICwgZGF0YT1wYW5lbCAsbW9kZWwgPSAicmFuZG9tIiwgcmFuZG9tLm1ldGhvZCA9ICJ3YWxodXMiKQ0KDQpzdW1tYXJ5KHdhbGh1cykNCmBgYA0KDQpgYGB7ciBNb2RlbG8gcmFuZG9tIChuZXJsb3ZlKX0NCm5lcmxvdmU8LXBsbShOWS5HRFAuTUtUUC5LRC5aRyB+IFNMLlVFTS5UT1RMLlpTKw0KQUcuTE5ELkFHUkkuWlMrQUcuTE5ELkFSQkwuWlMrRUcuRUxDLkFDQ1MuWlMrU1AuUE9QLkdST1crR0IuWFBELlJTRFYuR0QuWlMgLCBkYXRhPXBhbmVsICxtb2RlbCA9ICJyYW5kb20iLCByYW5kb20ubWV0aG9kID0gIm5lcmxvdmUiKQ0KDQpzdW1tYXJ5KG5lcmxvdmUpDQpgYGANCg0KYGBge3IgUHJ1ZWJhIGRlIGhhdXNtYW59DQpwaHRlc3QobmVybG92ZSx3aXRoaW4pDQpgYGANCg0KIVtdKDxodHRwczovL3kueWFybi5jby82MDA0ZGRhZi1lM2FmLTRjNWQtODkyYS02YThmNWRkMGM0MGNfdGV4dC5naWY+KQ0KDQojIFRhcmVhIDM6IFBhdGVudGVzDQoNCmBgYHtyIGxpYnJlcmlhcyAzLCBtZXNzYWdlPUZBTFNFfQ0KbGlicmFyeShXREkpDQpsaWJyYXJ5KHdic3RhdHMpDQpsaWJyYXJ5KHRpZHl2ZXJzZSkNCmxpYnJhcnkoZ3Bsb3RzKQ0KbGlicmFyeShwbG0pDQpsaWJyYXJ5KHJlYWR4bCkNCmxpYnJhcnkoZHBseXIpDQpsaWJyYXJ5KGdwbG90cykNCmBgYA0KDQpgYGB7ciwgaW5jbHVkZT1GQUxTRX0NCnNldHdkKCJFOi9DYXJyZXJhL09jdGF2byBzZW1lc3RyZSBMSVQiKQ0KYGBgDQoNCmBgYHtyIEJhc2UgZGUgZGF0b3N9DQpQQVRFTlRfMyA8LSByZWFkX2V4Y2VsKCJQQVRFTlQgMy54bHMiLHNoZWV0ID0gIlNoZWV0MSIpDQpgYGANCg0KYGBge3IgT21pdCBOYX0NClBBVEVOVF8zIDwtIG5hLm9taXQoUEFURU5UXzMpDQpgYGANCg0KYGBge3IgUGFuZWwgUGF0ZW50ZX0NCnBhbmVsPC0gc2VsZWN0KFBBVEVOVF8zLHBhdGVudHNnLHJldHVybiwgeWVhciwgY3VzaXAgLCBlbXBsb3kgLCBybmQsIHNhbGVzLCBzdGNrcHIpDQpgYGANCg0KYGBge3IgSGV0ZXJvZ2VuZWlkYWQgZW50cmUgcGF0ZW50ZXN9DQpwbG90bWVhbnMocGFuZWwkcGF0ZW50c2cgfiBwYW5lbCR5ZWFyLHhsYWI9IkHDsW9zIix5bGFiPSJQYXRlbnRlcyIsDQogICAgICAgICAgICAgbWVhbi5sYWJlbHM9VFJVRSwgZGlnaXRzPS0zLA0KICAgICAgICAgICAgIGNvbD0icmVkIixjb25uZWN0PVRSVUUsIG1haW49IkhldGVyb2dlbmVpZGFkIGVudHJlIHBhdGVudGVzIikgIA0KYGBgDQoNCmBgYHtyIEhldGVyb2dlbmVpZGFkIGVudHJlIGVtcHJlc2FzLHdhcm5pbmc9RkFMU0V9DQpwbG90bWVhbnMocGFuZWwkcGF0ZW50c2cgfiBwYW5lbCRjdXNpcCx4bGFiPSJFbXByZXNhcyIseWxhYj0iUGF0ZW50ZXMiLA0KICAgICAgICAgICAgIG1lYW4ubGFiZWxzPVRSVUUsIGRpZ2l0cz0tMywNCiAgICAgICAgICAgICBjb2w9InJlZCIsY29ubmVjdD1UUlVFLCBtYWluPSJIZXRlcm9nZW5laWRhZCBlbnRyZSBlbXByZXNhcyIpIA0KYGBgDQoNCmBgYHtyIFBhbmVsIGRhdGEuZnJhbWV9DQpwYW5lbDI8LXBkYXRhLmZyYW1lKHBhbmVsLCBpbmRleD1jKCJjdXNpcCIsInllYXIiKSkNCmBgYA0KDQpgYGB7ciBNb2RlbG9zIHdpdGhpbiB5IHdhbGh1c30NCndpdGhpbiA8LSBwbG0ocGF0ZW50c2cgfiByZXR1cm4gKyBlbXBsb3kgKyBybmQgKyBzYWxlcyArIHN0Y2twciwgZGF0YSA9IHBhbmVsLCBpbmRleCA9IGMoImN1c2lwIiwgInllYXIiKSwgbW9kZWwgPSAid2l0aGluIikNCg0Kd2FsaHVzIDwtIHBsbShwYXRlbnRzZyB+IHJldHVybiArIGVtcGxveSArIHJuZCArIHNhbGVzICsgc3Rja3ByLCBkYXRhID0gcGFuZWwsIGluZGV4ID0gYygiY3VzaXAiLCAieWVhciIpLCBtb2RlbCA9ICJyYW5kb20iLCByYW5kb20ubWV0aG9kID0gJ3dhbGh1cycpDQpgYGANCg0KYGBge3IgSGF1c21hbiB0ZXN0fQ0KcGh0ZXN0KHdhbGh1cywgd2l0aGluKQ0KYGBgDQoNCmBgYHtyIFJlc3VtZW4gd2l0aGlufQ0Kc3VtbWFyeSh3aXRoaW4pDQpgYGANCg0KYGBge3IgUmVzdW1lbiB3YWxodXN9DQpzdW1tYXJ5KHdhbGh1cykNCmBgYA0KDQotICAgPGRpdj4NCg0KICAgIHwgRWwgbWVqb3IgbW9kZWxvLCBjdWFuZG8gY29tcGFyYW1vcyBlbCBtb2RlbG8gZmlqbyB5IGFsZWF0b3Jpbywgbm9zIGRhIGNvbW8gcmVzdWx0YWRvIHF1ZSBlbCBtb2RlbG8gYWxlYXRvcmlhIG5vcyBkYSB1biBtZWpvciByZXN1bHRhZG8gYSBjb21wYXJhY2nDs24gZGVsIG1vZGVsbyBmaWpvLCBhIHBlc2FyIGRlIHF1ZSBsYSBwcnVlYmEgZGUgSGF1c21hbiBub3MgZGEgY29tbyBoaXDDs3Rlc2lzIHF1ZSB1bm8gZGUgbG9zIG1vZGVsb3MgZXMgaW5jb25zaXN0ZW50ZS4gQ29uIHJlc3BlY3RvIGEgcXXDqSB0YW4gYnVlbm9zIHNlcsOtYW4gZXN0b3MgbW9kZWxvcyBlbiBwcm9uw7NzdGljbywgZW4gbWkgb3BpbmnDs24sIGNyZW8gcXVlIGVzdG9zIG1vZGVsb3Mgc29uIGJhc3RhbnRlIGRlZmljaWVudGVzIHkgcXVlIGxvcyBwcm9uw7NzdGljb3MgcmVhbGl6YWRvcyBub3MgZGFyw6FuIHJlc3VsdGFkb3MgbG9zIGN1YWxlcyBwdWVkZW4gcXVlIG5vIHNlYW4gZGVsIHRvZG8gc2F0aXNmYWN0b3Jpb3MuDQoNCiAgICA8L2Rpdj4NCg==