Librerias

library(WDI)
library(wbstats)
library(ggplot2)
library(gplots)
library(plm)
library(tidyverse)
library(readxl)
library(WDI)
library(wbstats)
library(ggplot2)
library(gplots)
library(plm)
library(lmtest)
library(pglm)

1. Sesión. Modelo Econométrico

2. Código sesiones 2, 3 y 4

Analisis de Datos de Panel

Información de paises e indicadores

### A. Obtener la información de 1 país
PIB_MEX <- wb_data(country = "MX", indicator = "NY.GDP.PCAP.CD",
                   start_date = 1900, end_date = 2025)

summary(PIB_MEX)
##     iso2c              iso3c             country               date     
##  Length:64          Length:64          Length:64          Min.   :1960  
##  Class :character   Class :character   Class :character   1st Qu.:1976  
##  Mode  :character   Mode  :character   Mode  :character   Median :1992  
##                                                           Mean   :1992  
##                                                           3rd Qu.:2007  
##                                                           Max.   :2023  
##  NY.GDP.PCAP.CD        unit            obs_status          footnote        
##  Min.   :  355.1   Length:64          Length:64          Length:64         
##  1st Qu.: 1427.8   Class :character   Class :character   Class :character  
##  Median : 4006.5   Mode  :character   Mode  :character   Mode  :character  
##  Mean   : 5097.1                                                           
##  3rd Qu.: 8905.4                                                           
##  Max.   :13790.0                                                           
##   last_updated       
##  Min.   :2025-01-28  
##  1st Qu.:2025-01-28  
##  Median :2025-01-28  
##  Mean   :2025-01-28  
##  3rd Qu.:2025-01-28  
##  Max.   :2025-01-28
ggplot(PIB_MEX, aes(x= date, y=NY.GDP.PCAP.CD)) + 
  geom_point() +
  geom_line()+
  labs(title = "PIB per Capita en México (Current USD)", x = "Año", y ="Valor")

### B. Obtener la información de varios países
PIB_PANEL <- wb_data(country = c("MX","US", "CA"), indicator = "NY.GDP.PCAP.CD",
                   start_date = 1900, end_date = 2025)
summary(PIB_PANEL)
##     iso2c              iso3c             country               date     
##  Length:192         Length:192         Length:192         Min.   :1960  
##  Class :character   Class :character   Class :character   1st Qu.:1976  
##  Mode  :character   Mode  :character   Mode  :character   Median :1992  
##                                                           Mean   :1992  
##                                                           3rd Qu.:2007  
##                                                           Max.   :2023  
##  NY.GDP.PCAP.CD        unit            obs_status          footnote        
##  Min.   :  355.1   Length:192         Length:192         Length:192        
##  1st Qu.: 4059.2   Class :character   Class :character   Class :character  
##  Median :10544.4   Mode  :character   Mode  :character   Mode  :character  
##  Mean   :19152.2                                                           
##  3rd Qu.:29010.1                                                           
##  Max.   :82769.4                                                           
##   last_updated       
##  Min.   :2025-01-28  
##  1st Qu.:2025-01-28  
##  Median :2025-01-28  
##  Mean   :2025-01-28  
##  3rd Qu.:2025-01-28  
##  Max.   :2025-01-28
ggplot(PIB_PANEL, aes(x= date, y=NY.GDP.PCAP.CD, color=iso3c)) + 
  geom_point() +
  geom_line()+
  labs(title = "PIB per Capita en Norteamérica (Current USD)", x = "Año", y ="Valor")

### C. Obtener la información de varios indicadores en varios países

MEGAPIB <- wb_data(country = c("MX","US", "CA"), indicator = c("NY.GDP.PCAP.CD", "SP.DYN.LE00.IN"),
                   start_date = 1900, end_date = 2025)

summary(MEGAPIB)
##     iso2c              iso3c             country               date     
##  Length:192         Length:192         Length:192         Min.   :1960  
##  Class :character   Class :character   Class :character   1st Qu.:1976  
##  Mode  :character   Mode  :character   Mode  :character   Median :1992  
##                                                           Mean   :1992  
##                                                           3rd Qu.:2007  
##                                                           Max.   :2023  
##                                                                         
##  NY.GDP.PCAP.CD    SP.DYN.LE00.IN 
##  Min.   :  355.1   Min.   :55.02  
##  1st Qu.: 4059.2   1st Qu.:71.11  
##  Median :10544.4   Median :74.36  
##  Mean   :19152.2   Mean   :73.41  
##  3rd Qu.:29010.1   3rd Qu.:77.49  
##  Max.   :82769.4   Max.   :82.22  
##                    NA's   :3
### D. Heterogeneidad - Variación entre individuos
plotmeans(NY.GDP.PCAP.CD ~ country, main = "Heterogeneidad entre países", xlab = "País", ylab = "PIB per Capita", data = MEGAPIB)

Interpretación: - Alta Heterogenidad: Si los puntos (medias) están muy separados entre países. - Baja Heterogenidad: Si los puntos (medias) están muy cerca uno de otros. - En este caso, EUA y Canadá tienen un PIB per Cápita mayor que México, mostrando alta heterogenidad entre países.

Modelos y Prueba de Hausman

datos_panel <- pdata.frame(PIB_PANEL, index = c("country", "date"))

#Modelo de efectos fijos
modelo_efectos_fijos <- plm(NY.GDP.PCAP.CD ~ date, data=datos_panel, model = "within")

#Modelo de efectos aleatorios
modelo_efectos_aleatorios <- plm(NY.GDP.PCAP.CD ~ date, data=datos_panel, model ="random")

#Prueba de hausman
phtest(modelo_efectos_fijos, modelo_efectos_aleatorios)
## 
##  Hausman Test
## 
## data:  NY.GDP.PCAP.CD ~ date
## chisq = 3.8736e-13, df = 63, p-value = 1
## alternative hypothesis: one model is inconsistent
#Como el p-value es mayor a 0.05, usamos el modelo de efectos aleatorios

4. Código Sesión 5

Actividad Patentes

Importar Base de Datos

patentes <- read_excel("/Users/paulatam/Desktop/MARCE/PATENT 3.xls")

Entender Base de Datos

summary(patentes)
##      cusip            merger           employ            return       
##  Min.   :   800   Min.   :0.0000   Min.   :  0.085   Min.   :-73.022  
##  1st Qu.:368514   1st Qu.:0.0000   1st Qu.:  1.227   1st Qu.:  5.128  
##  Median :501116   Median :0.0000   Median :  3.842   Median :  7.585  
##  Mean   :514536   Mean   :0.0177   Mean   : 18.826   Mean   :  8.003  
##  3rd Qu.:754688   3rd Qu.:0.0000   3rd Qu.: 15.442   3rd Qu.: 10.501  
##  Max.   :878555   Max.   :1.0000   Max.   :506.531   Max.   : 48.675  
##                                    NA's   :21        NA's   :8        
##     patents         patentsg           stckpr              rnd           
##  Min.   :  0.0   Min.   :   0.00   Min.   :  0.1875   Min.   :   0.0000  
##  1st Qu.:  1.0   1st Qu.:   1.00   1st Qu.:  7.6250   1st Qu.:   0.6847  
##  Median :  3.0   Median :   4.00   Median : 16.5000   Median :   2.1456  
##  Mean   : 22.9   Mean   :  27.14   Mean   : 22.6270   Mean   :  29.3398  
##  3rd Qu.: 15.0   3rd Qu.:  19.00   3rd Qu.: 29.2500   3rd Qu.:  11.9168  
##  Max.   :906.0   Max.   :1063.00   Max.   :402.0000   Max.   :1719.3535  
##                                    NA's   :2                             
##     rndeflt             rndstck             sales               sic      
##  Min.   :   0.0000   Min.   :   0.125   Min.   :    1.22   Min.   :2000  
##  1st Qu.:   0.4788   1st Qu.:   5.152   1st Qu.:   52.99   1st Qu.:2890  
##  Median :   1.4764   Median :  13.353   Median :  174.06   Median :3531  
##  Mean   :  19.7238   Mean   : 163.823   Mean   : 1219.60   Mean   :3333  
##  3rd Qu.:   8.7527   3rd Qu.:  74.563   3rd Qu.:  728.96   3rd Qu.:3661  
##  Max.   :1000.7876   Max.   :9755.352   Max.   :44224.00   Max.   :9997  
##                      NA's   :157        NA's   :3                        
##       year     
##  Min.   :2012  
##  1st Qu.:2014  
##  Median :2016  
##  Mean   :2016  
##  3rd Qu.:2019  
##  Max.   :2021  
## 
sum(is.na(patentes)) #contas NAs
## [1] 191
sapply(patentes, function(x) sum(is.na(x)))
##    cusip   merger   employ   return  patents patentsg   stckpr      rnd 
##        0        0       21        8        0        0        2        0 
##  rndeflt  rndstck    sales      sic     year 
##        0      157        3        0        0
patentes1 <- na.omit(patentes)

A. Construcción del modelo de datos en panel

panel_patentes <- pdata.frame(patentes1, index = c("cusip", "year"))

B. Modelo de Efectos Fijos y Aleatorios

Modelo de efectos fijos

modelo_efectos_fijos_patentes <- plm(patents ~ merger + employ + return + patentsg + stckpr + rnd + rndeflt + sales + sic, data = panel_patentes, model = "within")

Modelo de efectos aleatorios

modelo_efectos_aleatorios_patentes <- plm(patents ~ merger + employ + return + patentsg + stckpr + rnd + rndeflt + sales + sic, data = panel_patentes, model ="random")

Prueba de hausman

phtest(modelo_efectos_fijos_patentes, modelo_efectos_aleatorios_patentes)
## 
##  Hausman Test
## 
## data:  patents ~ merger + employ + return + patentsg + stckpr + rnd +  ...
## chisq = 917.76, df = 8, p-value < 2.2e-16
## alternative hypothesis: one model is inconsistent

C. Pruebas de heterocedasticidad y autocorrelación serial

Prueba de Heterocedasticidad para el model de efectos fijos

bptest(modelo_efectos_aleatorios_patentes)
## 
##  studentized Breusch-Pagan test
## 
## data:  modelo_efectos_aleatorios_patentes
## BP = 616, df = 9, p-value < 2.2e-16
# como el pvalue es < 0.05, hay heterocedasticidad en los residuos

Prueba de Heterocedasticidad para el model de efectos aleatorios

bptest(modelo_efectos_aleatorios_patentes)
## 
##  studentized Breusch-Pagan test
## 
## data:  modelo_efectos_aleatorios_patentes
## BP = 616, df = 9, p-value < 2.2e-16
# como el pvalue es < 0.05, hay heterocedasticidad en los residuos

pwartest(modelo_efectos_fijos_patentes)
## 
##  Wooldridge's test for serial correlation in FE panels
## 
## data:  modelo_efectos_fijos_patentes
## F = 73.741, df1 = 1, df2 = 1866, p-value < 2.2e-16
## alternative hypothesis: serial correlation
# como el pvalue es < 0.05, hay autocorrelación serial en los errores

pbnftest(modelo_efectos_aleatorios_patentes)
## 
##  modified Bhargava/Franzini/Narendranathan Panel Durbin-Watson Test
## 
## data:  patents ~ merger + employ + return + patentsg + stckpr + rnd +  ...
## DW = 0.89311
## alternative hypothesis: serial correlation in idiosyncratic errors
# como el valor es de < 1.5, hay autocorrelación positiva significativa

D. Correción del modelo con errores estandar robustos

coeficientes_corregidos <- coeftest(modelo_efectos_fijos_patentes, vcov=vcovHC(modelo_efectos_fijos_patentes, type = "HC0"))

solo_coeficientes <- coeficientes_corregidos[,1]

E. Generar Pronósticos y evaluar modelo

datos_de_prueba <- data.frame(merger=0, employ=10, return=6, patentsg=24, stckpr=48, rnd=3, rndeflt=3, rndstck=16, sales=344)

prediction <- sum(solo_coeficientes*c(datos_de_prueba$merger, datos_de_prueba$employ, datos_de_prueba$return, datos_de_prueba$patentsg, datos_de_prueba$stckpr, datos_de_prueba$rnd, datos_de_prueba$rndeflt, datos_de_prueba$sales))

prediction
## [1] -5.620776
LS0tCnRpdGxlOiAiQWN0aXZkYWQgMS4gQW7DoWxpc2lzIHkgYXBsaWNhY2nDs24gZGUgZGF0b3MgcGFuZWwiCmF1dGhvcjogIk1hcmNlbG8gVGFtIEFyaWNhIC0gQTAxNzIyMTQwIgpkYXRlOiAiYHIgU3lzLkRhdGUoKWAiCm91dHB1dDogCiAgaHRtbF9kb2N1bWVudDoKICAgIHRvYzogVFJVRQogICAgdG9jX2Zsb2F0OiBUUlVFCiAgICBjb2RlX2Rvd25sb2FkOiBUUlVFCiAgICB0aGVtZTogY2VydWxlYW4KLS0tCgohW10oL1VzZXJzL3BhdWxhdGFtL0Rlc2t0b3AvTUFSQ0UvdW5pZmllZC1wYXRlbnRzLmdpZikKCiMgTGlicmVyaWFzCmBgYHtyIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CmxpYnJhcnkoV0RJKQpsaWJyYXJ5KHdic3RhdHMpCmxpYnJhcnkoZ2dwbG90MikKbGlicmFyeShncGxvdHMpCmxpYnJhcnkocGxtKQpsaWJyYXJ5KHRpZHl2ZXJzZSkKbGlicmFyeShyZWFkeGwpCmxpYnJhcnkoV0RJKQpsaWJyYXJ5KHdic3RhdHMpCmxpYnJhcnkoZ2dwbG90MikKbGlicmFyeShncGxvdHMpCmxpYnJhcnkocGxtKQpsaWJyYXJ5KGxtdGVzdCkKbGlicmFyeShwZ2xtKQpgYGAKCiMgMS4gU2VzacOzbi4gTW9kZWxvIEVjb25vbcOpdHJpY28KIVtdKC9Vc2Vycy9wYXVsYXRhbS9EZXNrdG9wL01BUkNFL1doYXRzQXBwIEltYWdlIDIwMjUtMDItMTQgYXQgOC4xOC4zNiBBTS5qcGcpCgojIDIuIEPDs2RpZ28gc2VzaW9uZXMgMiwgMyB5IDQKIyMgQW5hbGlzaXMgZGUgRGF0b3MgZGUgUGFuZWwKIyMjIEluZm9ybWFjacOzbiBkZSBwYWlzZXMgZSBpbmRpY2Fkb3JlcwpgYGB7ciBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQojIyMgQS4gT2J0ZW5lciBsYSBpbmZvcm1hY2nDs24gZGUgMSBwYcOtcwpQSUJfTUVYIDwtIHdiX2RhdGEoY291bnRyeSA9ICJNWCIsIGluZGljYXRvciA9ICJOWS5HRFAuUENBUC5DRCIsCiAgICAgICAgICAgICAgICAgICBzdGFydF9kYXRlID0gMTkwMCwgZW5kX2RhdGUgPSAyMDI1KQoKc3VtbWFyeShQSUJfTUVYKQpgYGAKCmBgYHtyIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CmdncGxvdChQSUJfTUVYLCBhZXMoeD0gZGF0ZSwgeT1OWS5HRFAuUENBUC5DRCkpICsgCiAgZ2VvbV9wb2ludCgpICsKICBnZW9tX2xpbmUoKSsKICBsYWJzKHRpdGxlID0gIlBJQiBwZXIgQ2FwaXRhIGVuIE3DqXhpY28gKEN1cnJlbnQgVVNEKSIsIHggPSAiQcOxbyIsIHkgPSJWYWxvciIpCmBgYAoKYGBge3IgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0KIyMjIEIuIE9idGVuZXIgbGEgaW5mb3JtYWNpw7NuIGRlIHZhcmlvcyBwYcOtc2VzClBJQl9QQU5FTCA8LSB3Yl9kYXRhKGNvdW50cnkgPSBjKCJNWCIsIlVTIiwgIkNBIiksIGluZGljYXRvciA9ICJOWS5HRFAuUENBUC5DRCIsCiAgICAgICAgICAgICAgICAgICBzdGFydF9kYXRlID0gMTkwMCwgZW5kX2RhdGUgPSAyMDI1KQpzdW1tYXJ5KFBJQl9QQU5FTCkKYGBgCgpgYGB7ciBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQpnZ3Bsb3QoUElCX1BBTkVMLCBhZXMoeD0gZGF0ZSwgeT1OWS5HRFAuUENBUC5DRCwgY29sb3I9aXNvM2MpKSArIAogIGdlb21fcG9pbnQoKSArCiAgZ2VvbV9saW5lKCkrCiAgbGFicyh0aXRsZSA9ICJQSUIgcGVyIENhcGl0YSBlbiBOb3J0ZWFtw6lyaWNhIChDdXJyZW50IFVTRCkiLCB4ID0gIkHDsW8iLCB5ID0iVmFsb3IiKQpgYGAKCmBgYHtyIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CiMjIyBDLiBPYnRlbmVyIGxhIGluZm9ybWFjacOzbiBkZSB2YXJpb3MgaW5kaWNhZG9yZXMgZW4gdmFyaW9zIHBhw61zZXMKCk1FR0FQSUIgPC0gd2JfZGF0YShjb3VudHJ5ID0gYygiTVgiLCJVUyIsICJDQSIpLCBpbmRpY2F0b3IgPSBjKCJOWS5HRFAuUENBUC5DRCIsICJTUC5EWU4uTEUwMC5JTiIpLAogICAgICAgICAgICAgICAgICAgc3RhcnRfZGF0ZSA9IDE5MDAsIGVuZF9kYXRlID0gMjAyNSkKCnN1bW1hcnkoTUVHQVBJQikKYGBgCgpgYGB7ciBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQojIyMgRC4gSGV0ZXJvZ2VuZWlkYWQgLSBWYXJpYWNpw7NuIGVudHJlIGluZGl2aWR1b3MKcGxvdG1lYW5zKE5ZLkdEUC5QQ0FQLkNEIH4gY291bnRyeSwgbWFpbiA9ICJIZXRlcm9nZW5laWRhZCBlbnRyZSBwYcOtc2VzIiwgeGxhYiA9ICJQYcOtcyIsIHlsYWIgPSAiUElCIHBlciBDYXBpdGEiLCBkYXRhID0gTUVHQVBJQikKYGBgCkludGVycHJldGFjacOzbjoKLSBBbHRhIEhldGVyb2dlbmlkYWQ6IFNpIGxvcyBwdW50b3MgKG1lZGlhcykgZXN0w6FuIG11eSBzZXBhcmFkb3MgZW50cmUgcGHDrXNlcy4KLSBCYWphIEhldGVyb2dlbmlkYWQ6IFNpIGxvcyBwdW50b3MgKG1lZGlhcykgZXN0w6FuIG11eSBjZXJjYSB1bm8gZGUgb3Ryb3MuCi0gRW4gZXN0ZSBjYXNvLCBFVUEgeSBDYW5hZMOhIHRpZW5lbiB1biBQSUIgcGVyIEPDoXBpdGEgbWF5b3IgcXVlIE3DqXhpY28sIG1vc3RyYW5kbyBhbHRhIGhldGVyb2dlbmlkYWQgZW50cmUgcGHDrXNlcy4KCiMjIyBNb2RlbG9zIHkgUHJ1ZWJhIGRlIEhhdXNtYW4KYGBge3IgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0KZGF0b3NfcGFuZWwgPC0gcGRhdGEuZnJhbWUoUElCX1BBTkVMLCBpbmRleCA9IGMoImNvdW50cnkiLCAiZGF0ZSIpKQoKI01vZGVsbyBkZSBlZmVjdG9zIGZpam9zCm1vZGVsb19lZmVjdG9zX2Zpam9zIDwtIHBsbShOWS5HRFAuUENBUC5DRCB+IGRhdGUsIGRhdGE9ZGF0b3NfcGFuZWwsIG1vZGVsID0gIndpdGhpbiIpCgojTW9kZWxvIGRlIGVmZWN0b3MgYWxlYXRvcmlvcwptb2RlbG9fZWZlY3Rvc19hbGVhdG9yaW9zIDwtIHBsbShOWS5HRFAuUENBUC5DRCB+IGRhdGUsIGRhdGE9ZGF0b3NfcGFuZWwsIG1vZGVsID0icmFuZG9tIikKCiNQcnVlYmEgZGUgaGF1c21hbgpwaHRlc3QobW9kZWxvX2VmZWN0b3NfZmlqb3MsIG1vZGVsb19lZmVjdG9zX2FsZWF0b3Jpb3MpCgojQ29tbyBlbCBwLXZhbHVlIGVzIG1heW9yIGEgMC4wNSwgdXNhbW9zIGVsIG1vZGVsbyBkZSBlZmVjdG9zIGFsZWF0b3Jpb3MKYGBgCgojIDMuIExpbmsgQXBsaWNhY2nDs24gU2hpbnkKW0luZGljYWRvcmVzIEJhbmNvIE11bmRpYWxdIChodHRwczovL2hlY3RvcmQxZy5zaGlueWFwcHMuaW8vVWx0aW1hX0FQUC8pCgojIDQuIEPDs2RpZ28gU2VzacOzbiA1CiMjIEFjdGl2aWRhZCBQYXRlbnRlcwojIyMgSW1wb3J0YXIgQmFzZSBkZSBEYXRvcwpgYGB7ciBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQpwYXRlbnRlcyA8LSByZWFkX2V4Y2VsKCIvVXNlcnMvcGF1bGF0YW0vRGVza3RvcC9NQVJDRS9QQVRFTlQgMy54bHMiKQpgYGAKCiMjIyBFbnRlbmRlciBCYXNlIGRlIERhdG9zCmBgYHtyIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CnN1bW1hcnkocGF0ZW50ZXMpCnN1bShpcy5uYShwYXRlbnRlcykpICNjb250YXMgTkFzCnNhcHBseShwYXRlbnRlcywgZnVuY3Rpb24oeCkgc3VtKGlzLm5hKHgpKSkKcGF0ZW50ZXMxIDwtIG5hLm9taXQocGF0ZW50ZXMpCmBgYAoKIyMjIEEuIENvbnN0cnVjY2nDs24gZGVsIG1vZGVsbyBkZSBkYXRvcyBlbiBwYW5lbApgYGB7ciBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQpwYW5lbF9wYXRlbnRlcyA8LSBwZGF0YS5mcmFtZShwYXRlbnRlczEsIGluZGV4ID0gYygiY3VzaXAiLCAieWVhciIpKQpgYGAKCiMjIyBCLiBNb2RlbG8gZGUgRWZlY3RvcyBGaWpvcyB5IEFsZWF0b3Jpb3MKIyMjIyBNb2RlbG8gZGUgZWZlY3RvcyBmaWpvcwpgYGB7ciBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQptb2RlbG9fZWZlY3Rvc19maWpvc19wYXRlbnRlcyA8LSBwbG0ocGF0ZW50cyB+IG1lcmdlciArIGVtcGxveSArIHJldHVybiArIHBhdGVudHNnICsgc3Rja3ByICsgcm5kICsgcm5kZWZsdCArIHNhbGVzICsgc2ljLCBkYXRhID0gcGFuZWxfcGF0ZW50ZXMsIG1vZGVsID0gIndpdGhpbiIpCmBgYAoKIyMjIyBNb2RlbG8gZGUgZWZlY3RvcyBhbGVhdG9yaW9zCmBgYHtyIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9Cm1vZGVsb19lZmVjdG9zX2FsZWF0b3Jpb3NfcGF0ZW50ZXMgPC0gcGxtKHBhdGVudHMgfiBtZXJnZXIgKyBlbXBsb3kgKyByZXR1cm4gKyBwYXRlbnRzZyArIHN0Y2twciArIHJuZCArIHJuZGVmbHQgKyBzYWxlcyArIHNpYywgZGF0YSA9IHBhbmVsX3BhdGVudGVzLCBtb2RlbCA9InJhbmRvbSIpCmBgYAoKIyMjIyBQcnVlYmEgZGUgaGF1c21hbgpgYGB7ciBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQpwaHRlc3QobW9kZWxvX2VmZWN0b3NfZmlqb3NfcGF0ZW50ZXMsIG1vZGVsb19lZmVjdG9zX2FsZWF0b3Jpb3NfcGF0ZW50ZXMpCmBgYAoKIyMjIEMuIFBydWViYXMgZGUgaGV0ZXJvY2VkYXN0aWNpZGFkIHkgYXV0b2NvcnJlbGFjacOzbiBzZXJpYWwKIyMjIyBQcnVlYmEgZGUgSGV0ZXJvY2VkYXN0aWNpZGFkIHBhcmEgZWwgbW9kZWwgZGUgZWZlY3RvcyBmaWpvcwpgYGB7ciBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQpicHRlc3QobW9kZWxvX2VmZWN0b3NfYWxlYXRvcmlvc19wYXRlbnRlcykKIyBjb21vIGVsIHB2YWx1ZSBlcyA8IDAuMDUsIGhheSBoZXRlcm9jZWRhc3RpY2lkYWQgZW4gbG9zIHJlc2lkdW9zCmBgYAoKIyMjIyBQcnVlYmEgZGUgSGV0ZXJvY2VkYXN0aWNpZGFkIHBhcmEgZWwgbW9kZWwgZGUgZWZlY3RvcyBhbGVhdG9yaW9zCmBgYHtyIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CmJwdGVzdChtb2RlbG9fZWZlY3Rvc19hbGVhdG9yaW9zX3BhdGVudGVzKQojIGNvbW8gZWwgcHZhbHVlIGVzIDwgMC4wNSwgaGF5IGhldGVyb2NlZGFzdGljaWRhZCBlbiBsb3MgcmVzaWR1b3MKCnB3YXJ0ZXN0KG1vZGVsb19lZmVjdG9zX2Zpam9zX3BhdGVudGVzKQojIGNvbW8gZWwgcHZhbHVlIGVzIDwgMC4wNSwgaGF5IGF1dG9jb3JyZWxhY2nDs24gc2VyaWFsIGVuIGxvcyBlcnJvcmVzCgpwYm5mdGVzdChtb2RlbG9fZWZlY3Rvc19hbGVhdG9yaW9zX3BhdGVudGVzKQojIGNvbW8gZWwgdmFsb3IgZXMgZGUgPCAxLjUsIGhheSBhdXRvY29ycmVsYWNpw7NuIHBvc2l0aXZhIHNpZ25pZmljYXRpdmEKYGBgCgojIyMgRC4gQ29ycmVjacOzbiBkZWwgbW9kZWxvIGNvbiBlcnJvcmVzIGVzdGFuZGFyIHJvYnVzdG9zCmBgYHtyIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CmNvZWZpY2llbnRlc19jb3JyZWdpZG9zIDwtIGNvZWZ0ZXN0KG1vZGVsb19lZmVjdG9zX2Zpam9zX3BhdGVudGVzLCB2Y292PXZjb3ZIQyhtb2RlbG9fZWZlY3Rvc19maWpvc19wYXRlbnRlcywgdHlwZSA9ICJIQzAiKSkKCnNvbG9fY29lZmljaWVudGVzIDwtIGNvZWZpY2llbnRlc19jb3JyZWdpZG9zWywxXQpgYGAKCiMjIyBFLiBHZW5lcmFyIFByb27Ds3N0aWNvcyB5IGV2YWx1YXIgbW9kZWxvCmBgYHtyIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CmRhdG9zX2RlX3BydWViYSA8LSBkYXRhLmZyYW1lKG1lcmdlcj0wLCBlbXBsb3k9MTAsIHJldHVybj02LCBwYXRlbnRzZz0yNCwgc3Rja3ByPTQ4LCBybmQ9Mywgcm5kZWZsdD0zLCBybmRzdGNrPTE2LCBzYWxlcz0zNDQpCgpwcmVkaWN0aW9uIDwtIHN1bShzb2xvX2NvZWZpY2llbnRlcypjKGRhdG9zX2RlX3BydWViYSRtZXJnZXIsIGRhdG9zX2RlX3BydWViYSRlbXBsb3ksIGRhdG9zX2RlX3BydWViYSRyZXR1cm4sIGRhdG9zX2RlX3BydWViYSRwYXRlbnRzZywgZGF0b3NfZGVfcHJ1ZWJhJHN0Y2twciwgZGF0b3NfZGVfcHJ1ZWJhJHJuZCwgZGF0b3NfZGVfcHJ1ZWJhJHJuZGVmbHQsIGRhdG9zX2RlX3BydWViYSRzYWxlcykpCgpwcmVkaWN0aW9uCmBgYA==