Importar paquetes y llamar librerías

#install.packages("readxl")
library(readxl)
#install.packages("plm")
library(plm)
#install.packages("gplots")
library(gplots)
library(tidyverse)
library(plm)
library(gplots)
#install.packages("WDI")
library(WDI)
#install.packages("wbstats")
library(wbstats)
library(lmtest)
library(sandwich)

Parte 1. Patentes

#¿Cómo se relaciona el aumento en la inversión en Research & Development con el número de patentes concedidas por las empresas, considerando que el efecto de la inversión puede presentarse hasta tres años después?

df1 <- read.csv("/Users/carlalievanoespinosa/Desktop/business analytics/8vo semestre/df1.csv")

df1 <- df1 %>%
  arrange(cusip, year)
df1_panel <- pdata.frame(
  df1,
  index = c("cusip", "year")
)

pdim(df1_panel)
## Balanced Panel: n = 226, T = 10, N = 2260
#Rezago de 3 años
df1_panel$rnd_lag1 <- stats::lag(
  df1_panel$rndeflt,
  k = 1
)

df1_panel$rnd_lag2 <- stats::lag(
  df1_panel$rndeflt,
  k = 2
)

df1_panel$rnd_lag3 <- stats::lag(
  df1_panel$rndeflt,
  k = 3
)

head(
  df1_panel[
    ,
    c(
      "cusip",
      "year",
      "rndeflt",
      "rnd_lag1",
      "rnd_lag2",
      "rnd_lag3"
    )
  ],
  15
)
##           cusip year rndeflt rnd_lag1 rnd_lag2 rnd_lag3
## 800-2012    800 2012       3       NA       NA       NA
## 800-2013    800 2013       3        3       NA       NA
## 800-2014    800 2014       3        3        3       NA
## 800-2015    800 2015       3        3        3        3
## 800-2016    800 2016       3        3        3        3
## 800-2017    800 2017       3        3        3        3
## 800-2018    800 2018       3        3        3        3
## 800-2019    800 2019       3        3        3        3
## 800-2020    800 2020       4        3        3        3
## 800-2021    800 2021       4        4        3        3
## 4626-2012  4626 2012       1       NA       NA       NA
## 4626-2013  4626 2013       1        1       NA       NA
## 4626-2014  4626 2014       1        1        1       NA
## 4626-2015  4626 2015       1        1        1        1
## 4626-2016  4626 2016       1        1        1        1
variables_modelo <- c(
  "patents",
  "patentsg",
  "rndeflt",
  "rnd_lag1",
  "rnd_lag2",
  "rnd_lag3"
)

df_model <- df1_panel[
  complete.cases(df1_panel[, variables_modelo]),
]

pdim(df_model)
## Balanced Panel: n = 226, T = 7, N = 1582
sort(unique(df_model$year))
## [1] 2015 2016 2017 2018 2019 2020 2021
## Levels: 2012 2013 2014 2015 2016 2017 2018 2019 2020 2021
##PARTE A. R&D → PATENTES SOLICITADAS

# OPCIÓN 1 - MODELO POOLED

pooled_patents <- plm(
  patents ~ rndeflt +
    rnd_lag1 +
    rnd_lag2 +
    rnd_lag3,
  data = df_model,
  model = "pooling"
)

summary(pooled_patents)
## Pooling Model
## 
## Call:
## plm(formula = patents ~ rndeflt + rnd_lag1 + rnd_lag2 + rnd_lag3, 
##     data = df_model, model = "pooling")
## 
## Balanced Panel: n = 226, T = 7, N = 1582
## 
## Residuals:
##      Min.   1st Qu.    Median   3rd Qu.      Max. 
## -407.1786  -11.5903  -10.3097   -5.0386  715.2093 
## 
## Coefficients:
##             Estimate Std. Error t-value  Pr(>|t|)    
## (Intercept) 11.59027    1.39586  8.3033 < 2.2e-16 ***
## rndeflt      0.34591    0.20470  1.6899  0.091250 .  
## rnd_lag1     0.18937    0.32489  0.5829  0.560063    
## rnd_lag2    -0.91870    0.30137 -3.0484  0.002339 ** 
## rnd_lag3     0.90251    0.20228  4.4616 8.711e-06 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Total Sum of Squares:    7131900
## Residual Sum of Squares: 4577600
## R-Squared:      0.35815
## Adj. R-Squared: 0.35652
## F-statistic: 219.992 on 4 and 1577 DF, p-value: < 2.22e-16
# OPCIÓN 2 - EFECTOS FIJOS

within_patents <- plm(
  patents ~ rndeflt +
    rnd_lag1 +
    rnd_lag2 +
    rnd_lag3,
  data = df_model,
  model = "within",
  effect = "individual"
)

summary(within_patents)
## Oneway (individual) effect Within Model
## 
## Call:
## plm(formula = patents ~ rndeflt + rnd_lag1 + rnd_lag2 + rnd_lag3, 
##     data = df_model, effect = "individual", model = "within")
## 
## Balanced Panel: n = 226, T = 7, N = 1582
## 
## Residuals:
##       Min.    1st Qu.     Median    3rd Qu.       Max. 
## -488.46648   -1.26762   -0.14286    1.60287  175.72053 
## 
## Coefficients:
##           Estimate Std. Error t-value  Pr(>|t|)    
## rndeflt  -0.424555   0.102322 -4.1492 3.544e-05 ***
## rnd_lag1 -0.054727   0.149961 -0.3649    0.7152    
## rnd_lag2 -0.205098   0.141414 -1.4503    0.1472    
## rnd_lag3 -0.572877   0.106157 -5.3965 8.014e-08 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Total Sum of Squares:    908870
## Residual Sum of Squares: 774890
## R-Squared:      0.14742
## Adj. R-Squared: 0.00301
## F-statistic: 58.4433 on 4 and 1352 DF, p-value: < 2.22e-16
# PRUEBA F
# H0: Pooled es suficiente
# H1: existen efectos individuales por empresa

prueba_f_patents <- pFtest(
  within_patents,
  pooled_patents
)

prueba_f_patents
## 
##  F test for individual effects
## 
## data:  patents ~ rndeflt + rnd_lag1 + rnd_lag2 + rnd_lag3
## F = 29.488, df1 = 225, df2 = 1352, p-value < 2.2e-16
## alternative hypothesis: significant effects
# OPCIÓN 3 - EFECTOS ALEATORIOS

random_patents <- plm(
  patents ~ rndeflt +
    rnd_lag1 +
    rnd_lag2 +
    rnd_lag3,
  data = df_model,
  model = "random",
  effect = "individual"
)

summary(random_patents)
## Oneway (individual) effect Random Effect Model 
##    (Swamy-Arora's transformation)
## 
## Call:
## plm(formula = patents ~ rndeflt + rnd_lag1 + rnd_lag2 + rnd_lag3, 
##     data = df_model, effect = "individual", model = "random")
## 
## Balanced Panel: n = 226, T = 7, N = 1582
## 
## Effects:
##                   var std.dev share
## idiosyncratic  573.14   23.94 0.362
## individual    1010.67   31.79 0.638
## theta: 0.7262
## 
## Residuals:
##       Min.    1st Qu.     Median    3rd Qu.       Max. 
## -390.99395   -4.63077   -3.74683   -0.79097  326.02391 
## 
## Coefficients:
##              Estimate Std. Error z-value Pr(>|z|)    
## (Intercept) 14.943717   2.686516  5.5625 2.66e-08 ***
## rndeflt      0.207926   0.115444  1.8011  0.07169 .  
## rnd_lag1    -0.141619   0.177775 -0.7966  0.42567    
## rnd_lag2    -0.019263   0.166886 -0.1154  0.90811    
## rnd_lag3     0.294035   0.116054  2.5336  0.01129 *  
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Total Sum of Squares:    1375200
## Residual Sum of Squares: 1280200
## R-Squared:      0.069071
## Adj. R-Squared: 0.066709
## Chisq: 117.006 on 4 DF, p-value: < 2.22e-16
# PRUEBA LM DE BREUSCH-PAGAN
# H0: no existen efectos individuales aleatorios
# H1: Random es preferible a Pooled

prueba_lm_patents <- plmtest(
  pooled_patents,
  effect = "individual",
  type = "bp"
)

prueba_lm_patents
## 
##  Lagrange Multiplier Test - (Breusch-Pagan)
## 
## data:  patents ~ rndeflt + rnd_lag1 + rnd_lag2 + rnd_lag3
## chisq = 2479.5, df = 1, p-value < 2.2e-16
## alternative hypothesis: significant effects
# PRUEBA DE HAUSMAN

prueba_hausman_patents <- phtest(
  within_patents,
  random_patents
)

prueba_hausman_patents
## 
##  Hausman Test
## 
## data:  patents ~ rndeflt + rnd_lag1 + rnd_lag2 + rnd_lag3
## chisq = 430.84, df = 4, p-value < 2.2e-16
## alternative hypothesis: one model is inconsistent
if(
  prueba_f_patents$p.value >= 0.05 &
  prueba_lm_patents$p.value >= 0.05
){
  
  modelo_patents_nombre <- "Pooled"
  modelo_patents <- pooled_patents
  
} else if(
  prueba_f_patents$p.value < 0.05 &
  prueba_lm_patents$p.value >= 0.05
){
  
  modelo_patents_nombre <- "Fixed Effects"
  modelo_patents <- within_patents
  
} else if(
  prueba_f_patents$p.value >= 0.05 &
  prueba_lm_patents$p.value < 0.05
){
  
  modelo_patents_nombre <- "Random Effects"
  modelo_patents <- random_patents
  
} else {
  
  if(prueba_hausman_patents$p.value < 0.05){
    
    modelo_patents_nombre <- "Fixed Effects"
    modelo_patents <- within_patents
    
  } else {
    
    modelo_patents_nombre <- "Random Effects"
    modelo_patents <- random_patents
    
  }
}

modelo_patents_nombre
## [1] "Fixed Effects"
summary(modelo_patents)
## Oneway (individual) effect Within Model
## 
## Call:
## plm(formula = patents ~ rndeflt + rnd_lag1 + rnd_lag2 + rnd_lag3, 
##     data = df_model, effect = "individual", model = "within")
## 
## Balanced Panel: n = 226, T = 7, N = 1582
## 
## Residuals:
##       Min.    1st Qu.     Median    3rd Qu.       Max. 
## -488.46648   -1.26762   -0.14286    1.60287  175.72053 
## 
## Coefficients:
##           Estimate Std. Error t-value  Pr(>|t|)    
## rndeflt  -0.424555   0.102322 -4.1492 3.544e-05 ***
## rnd_lag1 -0.054727   0.149961 -0.3649    0.7152    
## rnd_lag2 -0.205098   0.141414 -1.4503    0.1472    
## rnd_lag3 -0.572877   0.106157 -5.3965 8.014e-08 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Total Sum of Squares:    908870
## Residual Sum of Squares: 774890
## R-Squared:      0.14742
## Adj. R-Squared: 0.00301
## F-statistic: 58.4433 on 4 and 1352 DF, p-value: < 2.22e-16
##PARTE B. R&D → PATENTES CONCEDIDAS

# OPCIÓN 1 - POOLED

pooled_granted <- plm(
  patentsg ~ rndeflt +
    rnd_lag1 +
    rnd_lag2 +
    rnd_lag3,
  data = df_model,
  model = "pooling"
)

summary(pooled_granted)
## Pooling Model
## 
## Call:
## plm(formula = patentsg ~ rndeflt + rnd_lag1 + rnd_lag2 + rnd_lag3, 
##     data = df_model, model = "pooling")
## 
## Balanced Panel: n = 226, T = 7, N = 1582
## 
## Residuals:
##      Min.   1st Qu.    Median   3rd Qu.      Max. 
## -450.6105  -13.8552  -11.8552   -4.6872  673.3196 
## 
## Coefficients:
##              Estimate Std. Error t-value  Pr(>|t|)    
## (Intercept) 13.855242   1.437257  9.6401 < 2.2e-16 ***
## rndeflt     -0.037879   0.210769 -0.1797 0.8573951    
## rnd_lag1     0.621334   0.334529  1.8573 0.0634493 .  
## rnd_lag2    -1.116372   0.310310 -3.5976 0.0003311 ***
## rnd_lag3     1.158833   0.208283  5.5638 3.097e-08 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Total Sum of Squares:    8365600
## Residual Sum of Squares: 4853100
## R-Squared:      0.41987
## Adj. R-Squared: 0.4184
## F-statistic: 285.337 on 4 and 1577 DF, p-value: < 2.22e-16
# OPCIÓN 2 - EFECTOS FIJOS

within_granted <- plm(
  patentsg ~ rndeflt +
    rnd_lag1 +
    rnd_lag2 +
    rnd_lag3,
  data = df_model,
  model = "within",
  effect = "individual"
)

summary(within_granted)
## Oneway (individual) effect Within Model
## 
## Call:
## plm(formula = patentsg ~ rndeflt + rnd_lag1 + rnd_lag2 + rnd_lag3, 
##     data = df_model, effect = "individual", model = "within")
## 
## Balanced Panel: n = 226, T = 7, N = 1582
## 
## Residuals:
##       Min.    1st Qu.     Median    3rd Qu.       Max. 
## -172.66694   -1.45774   -0.20473    1.46162  125.35634 
## 
## Coefficients:
##           Estimate Std. Error t-value  Pr(>|t|)    
## rndeflt  -0.526476   0.054287 -9.6980 < 2.2e-16 ***
## rnd_lag1  0.357361   0.079562  4.4916 7.671e-06 ***
## rnd_lag2 -0.204800   0.075028 -2.7297  0.006422 ** 
## rnd_lag3  0.184111   0.056322  3.2689  0.001107 ** 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Total Sum of Squares:    241040
## Residual Sum of Squares: 218120
## R-Squared:      0.095086
## Adj. R-Squared: -0.058187
## F-statistic: 35.5164 on 4 and 1352 DF, p-value: < 2.22e-16
#Prueba F
prueba_f_granted <- pFtest(
  within_granted,
  pooled_granted
)

prueba_f_granted
## 
##  F test for individual effects
## 
## data:  patentsg ~ rndeflt + rnd_lag1 + rnd_lag2 + rnd_lag3
## F = 127.69, df1 = 225, df2 = 1352, p-value < 2.2e-16
## alternative hypothesis: significant effects
# OPCIÓN 3 - EFECTOS ALEATORIOS

random_granted <- plm(
  patentsg ~ rndeflt +
    rnd_lag1 +
    rnd_lag2 +
    rnd_lag3,
  data = df_model,
  model = "random",
  effect = "individual"
)

summary(random_granted)
## Oneway (individual) effect Random Effect Model 
##    (Swamy-Arora's transformation)
## 
## Call:
## plm(formula = patentsg ~ rndeflt + rnd_lag1 + rnd_lag2 + rnd_lag3, 
##     data = df_model, effect = "individual", model = "random")
## 
## Balanced Panel: n = 226, T = 7, N = 1582
## 
## Effects:
##                   var std.dev share
## idiosyncratic  161.33   12.70 0.105
## individual    1375.90   37.09 0.895
## theta: 0.8716
## 
## Residuals:
##       Min.    1st Qu.     Median    3rd Qu.       Max. 
## -105.63542   -3.34358   -2.47193   -0.17583  163.19022 
## 
## Coefficients:
##              Estimate Std. Error z-value  Pr(>|z|)    
## (Intercept) 19.258655   2.893187  6.6566 2.803e-11 ***
## rndeflt     -0.312896   0.059729 -5.2386 1.618e-07 ***
## rnd_lag1     0.323558   0.090629  3.5701 0.0003568 ***
## rnd_lag2    -0.133673   0.085224 -1.5685 0.1167662    
## rnd_lag3     0.469500   0.060632  7.7434 9.678e-15 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Total Sum of Squares:    374890
## Residual Sum of Squares: 330960
## R-Squared:      0.11719
## Adj. R-Squared: 0.11495
## Chisq: 209.346 on 4 DF, p-value: < 2.22e-16
prueba_lm_granted <- plmtest(
  pooled_granted,
  effect = "individual",
  type = "bp"
)

prueba_lm_granted
## 
##  Lagrange Multiplier Test - (Breusch-Pagan)
## 
## data:  patentsg ~ rndeflt + rnd_lag1 + rnd_lag2 + rnd_lag3
## chisq = 4000.6, df = 1, p-value < 2.2e-16
## alternative hypothesis: significant effects
#Prueba Hausman
prueba_hausman_granted <- phtest(
  within_granted,
  random_granted
)

prueba_hausman_granted
## 
##  Hausman Test
## 
## data:  patentsg ~ rndeflt + rnd_lag1 + rnd_lag2 + rnd_lag3
## chisq = 265.5, df = 4, p-value < 2.2e-16
## alternative hypothesis: one model is inconsistent
if(
  prueba_f_granted$p.value >= 0.05 &
  prueba_lm_granted$p.value >= 0.05
){
  
  modelo_final_nombre <- "Pooled"
  modelo_final <- pooled_granted
  
} else if(
  prueba_f_granted$p.value < 0.05 &
  prueba_lm_granted$p.value >= 0.05
){
  
  modelo_final_nombre <- "Fixed Effects"
  modelo_final <- within_granted
  
} else if(
  prueba_f_granted$p.value >= 0.05 &
  prueba_lm_granted$p.value < 0.05
){
  
  modelo_final_nombre <- "Random Effects"
  modelo_final <- random_granted
  
} else {
  
  if(prueba_hausman_granted$p.value < 0.05){
    
    modelo_final_nombre <- "Fixed Effects"
    modelo_final <- within_granted
    
  } else {
    
    modelo_final_nombre <- "Random Effects"
    modelo_final <- random_granted
    
  }
}

modelo_final_nombre
## [1] "Fixed Effects"
summary(modelo_final)
## Oneway (individual) effect Within Model
## 
## Call:
## plm(formula = patentsg ~ rndeflt + rnd_lag1 + rnd_lag2 + rnd_lag3, 
##     data = df_model, effect = "individual", model = "within")
## 
## Balanced Panel: n = 226, T = 7, N = 1582
## 
## Residuals:
##       Min.    1st Qu.     Median    3rd Qu.       Max. 
## -172.66694   -1.45774   -0.20473    1.46162  125.35634 
## 
## Coefficients:
##           Estimate Std. Error t-value  Pr(>|t|)    
## rndeflt  -0.526476   0.054287 -9.6980 < 2.2e-16 ***
## rnd_lag1  0.357361   0.079562  4.4916 7.671e-06 ***
## rnd_lag2 -0.204800   0.075028 -2.7297  0.006422 ** 
## rnd_lag3  0.184111   0.056322  3.2689  0.001107 ** 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Total Sum of Squares:    241040
## Residual Sum of Squares: 218120
## R-Squared:      0.095086
## Adj. R-Squared: -0.058187
## F-statistic: 35.5164 on 4 and 1352 DF, p-value: < 2.22e-16
resultado_robusto <- coeftest(
  modelo_final,
  vcov = vcovHC(
    modelo_final,
    method = "arellano",
    type = "HC1",
    cluster = "group"
  )
)

resultado_robusto
## 
## t test of coefficients:
## 
##          Estimate Std. Error t value Pr(>|t|)   
## rndeflt  -0.52648    0.16145 -3.2609 0.001138 **
## rnd_lag1  0.35736    0.22267  1.6049 0.108755   
## rnd_lag2 -0.20480    0.20870 -0.9813 0.326613   
## rnd_lag3  0.18411    0.10777  1.7084 0.087799 . 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
#Efecto acumulado de R&D durante los cuatro años

coef_rnd <- coef(modelo_final)[
  c(
    "rndeflt",
    "rnd_lag1",
    "rnd_lag2",
    "rnd_lag3"
  )
]

coef_rnd
##    rndeflt   rnd_lag1   rnd_lag2   rnd_lag3 
## -0.5264760  0.3573614 -0.2048000  0.1841114
efecto_acumulado <- sum(coef_rnd)

efecto_acumulado
## [1] -0.1898031
cor(
  as.data.frame(
    df_model[, c(
      "rndeflt",
      "rnd_lag1",
      "rnd_lag2",
      "rnd_lag3"
    )]
  ),
  use = "complete.obs"
)
##            rndeflt  rnd_lag1  rnd_lag2  rnd_lag3
## rndeflt  1.0000000 0.9951703 0.9866716 0.9849683
## rnd_lag1 0.9951703 1.0000000 0.9947065 0.9883012
## rnd_lag2 0.9866716 0.9947065 1.0000000 0.9946290
## rnd_lag3 0.9849683 0.9883012 0.9946290 1.0000000
library(car)
## Loading required package: carData
## 
## Attaching package: 'car'
## The following object is masked from 'package:dplyr':
## 
##     recode
## The following object is masked from 'package:purrr':
## 
##     some
linearHypothesis(
  modelo_final,
  "rndeflt + rnd_lag1 + rnd_lag2 + rnd_lag3 = 0",
  vcov. = vcovHC(
    modelo_final,
    method = "arellano",
    type = "HC1",
    cluster = "group"
  )
)
## 
## Linear hypothesis test:
## rndeflt  + rnd_lag1  + rnd_lag2  + rnd_lag3 = 0
## 
## Model 1: restricted model
## Model 2: patentsg ~ rndeflt + rnd_lag1 + rnd_lag2 + rnd_lag3
## 
## Note: Coefficient covariance matrix supplied.
## 
##   Res.Df Df  Chisq Pr(>Chisq)   
## 1   1353                        
## 2   1352  1 9.4683   0.002091 **
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
# ==============================================================
# CORRECCIÓN DE MULTICOLINEALIDAD Y MODELO FINAL
# ==============================================================

# Crear una sola variable que resume el R&D
# de los tres años anteriores

df_model$rnd_prom_3 <- (
  df_model$rnd_lag1 +
  df_model$rnd_lag2 +
  df_model$rnd_lag3
) / 3


# --------------------------------------------------------------
# MODELO FINAL DE EFECTOS FIJOS
# Fixed Effects ya fue seleccionado previamente
# mediante las pruebas F, LM y Hausman
# --------------------------------------------------------------

modelo_final_fe <- plm(
  patentsg ~ rnd_prom_3,
  data = df_model,
  model = "within",
  effect = "individual"
)

summary(modelo_final_fe)
## Oneway (individual) effect Within Model
## 
## Call:
## plm(formula = patentsg ~ rnd_prom_3, data = df_model, effect = "individual", 
##     model = "within")
## 
## Balanced Panel: n = 226, T = 7, N = 1582
## 
## Residuals:
##       Min.    1st Qu.     Median    3rd Qu.       Max. 
## -187.73029   -1.44924   -0.24304    1.38790  127.28454 
## 
## Coefficients:
##             Estimate Std. Error t-value Pr(>|t|)
## rnd_prom_3 -0.056013   0.040439 -1.3851   0.1662
## 
## Total Sum of Squares:    241040
## Residual Sum of Squares: 240700
## R-Squared:      0.0014139
## Adj. R-Squared: -0.16514
## F-statistic: 1.91861 on 1 and 1355 DF, p-value: 0.16624
# --------------------------------------------------------------
# ERRORES ESTÁNDAR ROBUSTOS
# --------------------------------------------------------------

resultado_robusto_final <- coeftest(
  modelo_final_fe,
  vcov = vcovHC(
    modelo_final_fe,
    method = "arellano",
    type = "HC1",
    cluster = "group"
  )
)

resultado_robusto_final
## 
## t test of coefficients:
## 
##             Estimate Std. Error t value Pr(>|t|)
## rnd_prom_3 -0.056013   0.093829  -0.597   0.5506
# ==============================================================
# NUEVA ESPECIFICACIÓN: STOCK DE R&D
# ==============================================================

# Modelo de efectos fijos
# Fixed Effects ya fue seleccionado con F, LM y Hausman

modelo_stock <- plm(
  patentsg ~ rndstck,
  data = df1_panel,
  model = "within",
  effect = "individual"
)

summary(modelo_stock)
## Oneway (individual) effect Within Model
## 
## Call:
## plm(formula = patentsg ~ rndstck, data = df1_panel, effect = "individual", 
##     model = "within")
## 
## Unbalanced Panel: n = 216, T = 2-10, N = 2103
## 
## Residuals:
##       Min.    1st Qu.     Median    3rd Qu.       Max. 
## -228.16717   -2.01585   -0.32629    1.60338  268.63087 
## 
## Coefficients:
##           Estimate Std. Error t-value  Pr(>|t|)    
## rndstck -0.0317122  0.0016961 -18.698 < 2.2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Total Sum of Squares:    713560
## Residual Sum of Squares: 601970
## R-Squared:      0.15638
## Adj. R-Squared: 0.059761
## F-statistic: 349.601 on 1 and 1886 DF, p-value: < 2.22e-16
# Errores estándar robustos

resultado_stock_robusto <- coeftest(
  modelo_stock,
  vcov = vcovHC(
    modelo_stock,
    method = "arellano",
    type = "HC1",
    cluster = "group"
  )
)

resultado_stock_robusto
## 
## t test of coefficients:
## 
##          Estimate Std. Error t value Pr(>|t|)   
## rndstck -0.031712   0.010369 -3.0584 0.002256 **
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
# ============================================================
# VALIDACIÓN DEL MODELO CON STOCK DE R&D
# ============================================================

# Misma muestra para los tres modelos
df_stock <- df1_panel[
  complete.cases(df1_panel[, c("patentsg", "rndstck")]),
]


# 1. Pooled
pooled_stock <- plm(
  patentsg ~ rndstck,
  data = df_stock,
  model = "pooling"
)


# 2. Fixed Effects
fixed_stock <- plm(
  patentsg ~ rndstck,
  data = df_stock,
  model = "within",
  effect = "individual"
)


# 3. Random Effects
random_stock <- plm(
  patentsg ~ rndstck,
  data = df_stock,
  model = "random",
  effect = "individual"
)


# ------------------------------------------------------------
# PRUEBAS DE SELECCIÓN
# ------------------------------------------------------------

# Heterogeneidad: Pooled vs Fixed
pFtest(fixed_stock, pooled_stock)
## 
##  F test for individual effects
## 
## data:  patentsg ~ rndstck
## F = 123.64, df1 = 215, df2 = 1886, p-value < 2.2e-16
## alternative hypothesis: significant effects
# Pooled vs Random
plmtest(
  pooled_stock,
  effect = "individual",
  type = "bp"
)
## 
##  Lagrange Multiplier Test - (Breusch-Pagan)
## 
## data:  patentsg ~ rndstck
## chisq = 5795.9, df = 1, p-value < 2.2e-16
## alternative hypothesis: significant effects
# Fixed vs Random
phtest(
  fixed_stock,
  random_stock
)
## 
##  Hausman Test
## 
## data:  patentsg ~ rndstck
## chisq = 273.98, df = 1, p-value < 2.2e-16
## alternative hypothesis: one model is inconsistent
# ------------------------------------------------------------
# EFECTOS FIJOS DE EMPRESA Y AÑO
# ------------------------------------------------------------

fixed_stock_tw <- plm(
  patentsg ~ rndstck,
  data = df_stock,
  model = "within",
  effect = "twoways"
)

summary(fixed_stock_tw)
## Twoways effects Within Model
## 
## Call:
## plm(formula = patentsg ~ rndstck, data = df_stock, effect = "twoways", 
##     model = "within")
## 
## Unbalanced Panel: n = 216, T = 2-10, N = 2103
## 
## Residuals:
##       Min.    1st Qu.     Median    3rd Qu.       Max. 
## -222.10922   -3.12579   -0.58684    2.78151  267.33331 
## 
## Coefficients:
##           Estimate Std. Error t-value  Pr(>|t|)    
## rndstck -0.0298525  0.0017259 -17.297 < 2.2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Total Sum of Squares:    678060
## Residual Sum of Squares: 584840
## R-Squared:      0.13748
## Adj. R-Squared: 0.034092
## F-statistic: 299.191 on 1 and 1877 DF, p-value: < 2.22e-16
# Errores robustos
resultado_stock_tw <- coeftest(
  fixed_stock_tw,
  vcov = vcovHC(
    fixed_stock_tw,
    method = "arellano",
    type = "HC1",
    cluster = "group"
  )
)

resultado_stock_tw
## 
## t test of coefficients:
## 
##          Estimate Std. Error t value Pr(>|t|)   
## rndstck -0.029853   0.010193 -2.9286 0.003446 **
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
# ==============================================================
# PREDICCIÓN DE PATENTES CONCEDIDAS PARA 2022
# ==============================================================

library(dplyr)
library(plm)

# --------------------------------------------------------------
# 1. Preparar datos para el modelo predictivo
# --------------------------------------------------------------

df_pred_model <- df1 %>%
  mutate(
    year = as.numeric(as.character(year))
  ) %>%
  filter(
    !is.na(patentsg),
    !is.na(rndstck)
  ) %>%
  arrange(cusip, year)

df_pred_panel <- pdata.frame(
  df_pred_model,
  index = c("cusip", "year")
)


# --------------------------------------------------------------
# 2. Modelo predictivo
# Efectos fijos por empresa + tendencia temporal
# --------------------------------------------------------------

modelo_pred <- plm(
  patentsg ~ rndstck + year,
  data = df_pred_panel,
  model = "within",
  effect = "individual"
)

summary(modelo_pred)
## Oneway (individual) effect Within Model
## 
## Call:
## plm(formula = patentsg ~ rndstck + year, data = df_pred_panel, 
##     effect = "individual", model = "within")
## 
## Unbalanced Panel: n = 216, T = 2-10, N = 2103
## 
## Residuals:
##       Min.    1st Qu.     Median    3rd Qu.       Max. 
## -222.10922   -3.12579   -0.58684    2.78151  267.33331 
## 
## Coefficients:
##             Estimate  Std. Error  t-value  Pr(>|t|)    
## rndstck   -0.0298525   0.0017259 -17.2971 < 2.2e-16 ***
## year2013  -0.2894251   1.7532973  -0.1651  0.868903    
## year2014  -0.2517885   1.7522766  -0.1437  0.885759    
## year2015  -2.0185134   1.7544393  -1.1505  0.250077    
## year2016  -1.9026020   1.7580438  -1.0822  0.279291    
## year2017  -4.0596771   1.7612893  -2.3049  0.021278 *  
## year2018  -3.4622903   1.7698353  -1.9563  0.050580 .  
## year2019 -10.2173979   1.7744538  -5.7581 9.919e-09 ***
## year2020  -5.1674518   1.7811633  -2.9012  0.003761 ** 
## year2021  -2.5948339   1.7891830  -1.4503  0.147145    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Total Sum of Squares:    713560
## Residual Sum of Squares: 584840
## R-Squared:      0.18039
## Adj. R-Squared: 0.082142
## F-statistic: 41.3115 on 10 and 1877 DF, p-value: < 2.22e-16
# --------------------------------------------------------------
# 3. Proyectar rndstck de cada empresa para 2022
# usando su tendencia histórica
# --------------------------------------------------------------

rndstck_2022 <- df_pred_model %>%
  group_by(cusip) %>%
  filter(sum(!is.na(rndstck)) >= 2) %>%
  group_modify(~{
    
    modelo_rnd <- lm(
      rndstck ~ year,
      data = .x
    )
    
    tibble(
      year = 2022,
      rndstck_pred = predict(
        modelo_rnd,
        newdata = data.frame(year = 2022)
      )
    )
    
  }) %>%
  ungroup()


# --------------------------------------------------------------
# 4. Extraer coeficientes del modelo
# --------------------------------------------------------------

beta_rnd <- unname(
  coef(modelo_pred)["rndstck"]
)

beta_year <- unname(
  coef(modelo_pred)["year"]
)

efectos_empresa <- fixef(
  modelo_pred,
  type = "level"
)


# --------------------------------------------------------------
# 5. Predecir patentes concedidas para 2022
# --------------------------------------------------------------

prediccion_2022 <- rndstck_2022 %>%
  mutate(
    
    efecto_empresa = unname(
      efectos_empresa[as.character(cusip)]
    ),
    
    patentsg_pred =
      efecto_empresa +
      beta_rnd * rndstck_pred +
      beta_year * 2022,
    
    # Las patentes no pueden ser negativas
    patentsg_pred = pmax(
      0,
      patentsg_pred
    ),
    
    # Redondear a número entero de patentes
    patentsg_pred_round = round(
      patentsg_pred
    )
    
  ) %>%
  filter(
    !is.na(patentsg_pred)
  ) %>%
  select(
    cusip,
    year,
    rndstck_pred,
    patentsg_pred,
    patentsg_pred_round
  ) %>%
  arrange(
    desc(patentsg_pred)
  )


# --------------------------------------------------------------
# 6. Resultados de la predicción 2022
# --------------------------------------------------------------

prediccion_2022
## # A tibble: 0 × 5
## # ℹ 5 variables: cusip <int>, year <dbl>, rndstck_pred <dbl>,
## #   patentsg_pred <dbl>, patentsg_pred_round <dbl>
# Primeras 20 empresas con mayor predicción
head(prediccion_2022, 20)
## # A tibble: 0 × 5
## # ℹ 5 variables: cusip <int>, year <dbl>, rndstck_pred <dbl>,
## #   patentsg_pred <dbl>, patentsg_pred_round <dbl>
# Resumen de predicciones
summary(prediccion_2022$patentsg_pred)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
## 
# Total de patentes concedidas estimadas para 2022
sum(prediccion_2022$patentsg_pred_round)
## [1] 0

#CONCLUSIÓN: Los resultados muestran que existen diferencias significativas entre las empresas, por lo que el modelo de efectos fijos fue el más adecuado para analizar la relación entre la inversión en R&D y las patentes concedidas. Después de corregir el problema de multicolinealidad mediante el uso del stock acumulado de R&D (rndstck), se encontró una relación negativa y estadísticamente significativa con las patentes concedidas ((), (p=0.0034)), incluso al controlar por diferencias entre empresas y entre años. Esto indica que, dentro de una misma empresa, un aumento en el stock de R&D no se refleja necesariamente en un aumento inmediato de las patentes concedidas. Por lo tanto, los resultados no respaldan la hipótesis inicial de una relación positiva directa y sugieren que el proceso mediante el cual la inversión en investigación se convierte en patentes puede depender de otros factores y de periodos de tiempo más amplios.

Parte 2. Cuidado de la piel

#Si tuvieras que invertir en alguna sub - categoría, ¿en cuál lo harías? Justifica ampliamente tu respuesta.

df2 <- read.csv("/Users/carlalievanoespinosa/Desktop/business analytics/8vo semestre/df2.csv")

df2 <- read.csv(
  "/Users/carlalievanoespinosa/Desktop/business analytics/8vo semestre/df2.csv",
  skip = 1,
  check.names = FALSE,
  na.strings = c("-", "")
  )

# Subcategorías
categorias <- c(
  "Bath and Shower",
  "Deodorants",
  "Depilatories",
  "Fragrances",
  "Hair Care",
  "Men's Grooming",
  "Skin Care",
  "Sun Care"
)

# Pasar de formato ancho a formato largo
df2_long <- df2 %>%
  select(Category, all_of(as.character(2011:2025))) %>%
  pivot_longer(
    cols = all_of(as.character(2011:2025)),
    names_to = "year",
    values_to = "market_size"
  ) %>%
  mutate(
    year = as.integer(year),
    market_size = parse_number(as.character(market_size))
  )


totales <- df2_long %>%
  filter(Category == "Beauty and Personal Care") %>%
  select(year, total_market = market_size)

# Calcular participación de mercado
df2_model <- df2_long %>%
  filter(Category %in% categorias) %>%
  left_join(totales, by = "year") %>%
  mutate(
    market_share = (market_size / total_market) * 100,
    trend = year - 2011,
    category = factor(Category)
  ) %>%
  arrange(category, year)

# Revisar
head(df2_model)
## # A tibble: 6 × 7
##   Category         year market_size total_market market_share trend category    
##   <chr>           <int>       <dbl>        <dbl>        <dbl> <dbl> <fct>       
## 1 Bath and Shower  2011       8410.      126329.         6.66     0 Bath and Sh…
## 2 Bath and Shower  2012       9085       136020.         6.68     1 Bath and Sh…
## 3 Bath and Shower  2013       9711.      142539.         6.81     2 Bath and Sh…
## 4 Bath and Shower  2014      10227.      149165.         6.86     3 Bath and Sh…
## 5 Bath and Shower  2015      10815.      157656.         6.86     4 Bath and Sh…
## 6 Bath and Shower  2016      11482.      170488.         6.73     5 Bath and Sh…
# Panel
df2_panel <- pdata.frame(
  as.data.frame(df2_model),
  index = c("category", "year")
)

# Revisar estructura del panel
pdim(df2_panel)
## Balanced Panel: n = 8, T = 15, N = 120
# Comprobar si es balanceado
is.pbalanced(df2_panel)
## [1] TRUE
# PRUEBA DE HETEROGENEIDAD

par(mar = c(8, 4, 3, 1))

plotmeans(
  market_share ~ category,
  data = df2_model,
  las = 2,
  xlab = "",
  ylab = "Participación de mercado (%)"
)
## Warning in arrows(x, li, x, pmax(y - gap, li), col = barcol, lwd = lwd, :
## zero-length arrow is of indeterminate angle and so skipped
## Warning in arrows(x, li, x, pmax(y - gap, li), col = barcol, lwd = lwd, :
## zero-length arrow is of indeterminate angle and so skipped
## Warning in arrows(x, li, x, pmax(y - gap, li), col = barcol, lwd = lwd, :
## zero-length arrow is of indeterminate angle and so skipped
## Warning in arrows(x, li, x, pmax(y - gap, li), col = barcol, lwd = lwd, :
## zero-length arrow is of indeterminate angle and so skipped
## Warning in arrows(x, li, x, pmax(y - gap, li), col = barcol, lwd = lwd, :
## zero-length arrow is of indeterminate angle and so skipped
## Warning in arrows(x, li, x, pmax(y - gap, li), col = barcol, lwd = lwd, :
## zero-length arrow is of indeterminate angle and so skipped
## Warning in arrows(x, li, x, pmax(y - gap, li), col = barcol, lwd = lwd, :
## zero-length arrow is of indeterminate angle and so skipped
## Warning in arrows(x, li, x, pmax(y - gap, li), col = barcol, lwd = lwd, :
## zero-length arrow is of indeterminate angle and so skipped
## Warning in arrows(x, ui, x, pmin(y + gap, ui), col = barcol, lwd = lwd, :
## zero-length arrow is of indeterminate angle and so skipped
## Warning in arrows(x, ui, x, pmin(y + gap, ui), col = barcol, lwd = lwd, :
## zero-length arrow is of indeterminate angle and so skipped
## Warning in arrows(x, ui, x, pmin(y + gap, ui), col = barcol, lwd = lwd, :
## zero-length arrow is of indeterminate angle and so skipped
## Warning in arrows(x, ui, x, pmin(y + gap, ui), col = barcol, lwd = lwd, :
## zero-length arrow is of indeterminate angle and so skipped
## Warning in arrows(x, ui, x, pmin(y + gap, ui), col = barcol, lwd = lwd, :
## zero-length arrow is of indeterminate angle and so skipped
## Warning in arrows(x, ui, x, pmin(y + gap, ui), col = barcol, lwd = lwd, :
## zero-length arrow is of indeterminate angle and so skipped
## Warning in arrows(x, ui, x, pmin(y + gap, ui), col = barcol, lwd = lwd, :
## zero-length arrow is of indeterminate angle and so skipped
## Warning in arrows(x, ui, x, pmin(y + gap, ui), col = barcol, lwd = lwd, :
## zero-length arrow is of indeterminate angle and so skipped

# OPCIÓN 1 - MODELO DE REGRESIÓN AGRUPADA (POOLED)

pooled <- plm(
  market_share ~ trend,
  data = df2_panel,
  model = "pooling"
)

summary(pooled)
## Pooling Model
## 
## Call:
## plm(formula = market_share ~ trend, data = df2_panel, model = "pooling")
## 
## Balanced Panel: n = 8, T = 15, N = 120
## 
## Residuals:
##       Min.    1st Qu.     Median    3rd Qu.       Max. 
## -10.616051  -5.734911  -0.098855   6.435351  12.001541 
## 
## Coefficients:
##              Estimate Std. Error t-value Pr(>|t|)    
## (Intercept) 10.488539   1.292050  8.1177 5.16e-13 ***
## trend        0.051766   0.157070  0.3296   0.7423    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Total Sum of Squares:    6527
## Residual Sum of Squares: 6521
## R-Squared:      0.00091964
## Adj. R-Squared: -0.0075471
## F-statistic: 0.108618 on 1 and 118 DF, p-value: 0.74231
# OPCIÓN 2 - MODELO DE EFECTOS FIJOS (WITHIN)

within <- plm(
  market_share ~ trend,
  data = df2_panel,
  model = "within",
  effect = "individual"
)

summary(within)
## Oneway (individual) effect Within Model
## 
## Call:
## plm(formula = market_share ~ trend, data = df2_panel, effect = "individual", 
##     model = "within")
## 
## Balanced Panel: n = 8, T = 15, N = 120
## 
## Residuals:
##       Min.    1st Qu.     Median    3rd Qu.       Max. 
## -1.8250909 -0.3761985 -0.0040966  0.2783801  2.6852699 
## 
## Coefficients:
##       Estimate Std. Error t-value Pr(>|t|)   
## trend 0.051766   0.016069  3.2215 0.001674 **
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Total Sum of Squares:    70.204
## Residual Sum of Squares: 64.202
## R-Squared:      0.085501
## Adj. R-Squared: 0.019591
## F-statistic: 10.3779 on 1 and 111 DF, p-value: 0.0016738
# PRUEBA F

prueba_f <- pFtest(within, pooled)

prueba_f
## 
##  F test for individual effects
## 
## data:  market_share ~ trend
## F = 1594.8, df1 = 7, df2 = 111, p-value < 2.2e-16
## alternative hypothesis: significant effects
# OPCIÓN 3 - MODELO DE EFECTOS ALEATORIOS (RANDOM)

random <- plm(
  market_share ~ trend,
  data = df2_panel,
  model = "random",
  effect = "individual"
)

summary(random)
## Oneway (individual) effect Random Effect Model 
##    (Swamy-Arora's transformation)
## 
## Call:
## plm(formula = market_share ~ trend, data = df2_panel, effect = "individual", 
##     model = "random")
## 
## Balanced Panel: n = 8, T = 15, N = 120
## 
## Effects:
##                   var std.dev share
## idiosyncratic  0.5784  0.7605 0.009
## individual    61.4547  7.8393 0.991
## theta: 0.975
## 
## Residuals:
##     Min.  1st Qu.   Median  3rd Qu.     Max. 
## -1.72003 -0.46571 -0.12213  0.22992  2.79033 
## 
## Coefficients:
##              Estimate Std. Error z-value  Pr(>|z|)    
## (Intercept) 10.488539   2.774764  3.7800 0.0001568 ***
## trend        0.051766   0.016069  3.2215 0.0012753 ** 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Total Sum of Squares:    74.253
## Residual Sum of Squares: 68.25
## R-Squared:      0.080839
## Adj. R-Squared: 0.073049
## Chisq: 10.3779 on 1 DF, p-value: 0.0012753
# PRUEBA DE HAUSMAN

prueba_hausman <- phtest(within, random)

prueba_hausman
## 
##  Hausman Test
## 
## data:  market_share ~ trend
## chisq = 1.1842e-15, df = 1, p-value = 1
## alternative hypothesis: one model is inconsistent
if(prueba_f$p.value >= 0.05){
  
  modelo_final <- "pooled"
  
} else {
  
  if(prueba_hausman$p.value < 0.05){
    
    modelo_final <- "within"
    
  } else {
    
    modelo_final <- "random"
    
  }
}

modelo_final
## [1] "random"
# CONCLUSIÓN:
# De acuerdo con la prueba de Hausman, el p-value es mayor a 0.05. Por lo tanto, el modelo de Efectos Aleatorios es más adecuado
# que el modelo de Efectos Fijos.

# Se utilizará el modelo Random para realizar la predicción de la participación de mercado de cada subcategoría para 2026.
# Coeficientes del modelo Random
beta0 <- coef(random)["(Intercept)"]
beta1 <- coef(random)["trend"]

beta0
## (Intercept) 
##    10.48854
beta1
##     trend 
## 0.0517657
# Calcular la parte común estimada por el modelo
df2_model <- df2_model %>%
  mutate(
    pred_parte_comun = beta0 + beta1 * trend,
    diferencia = market_share - pred_parte_comun
  )

# Extraer los efectos aleatorios estimados por el modelo
efectos_random <- ranef(random)

efectos_random
## Bath and Shower      Deodorants    Depilatories      Fragrances       Hair Care 
##       -3.988697       -3.273814      -10.150282        4.193032        7.908366 
##  Men's Grooming       Skin Care        Sun Care 
##        4.908848       10.099658       -9.697110
# Crear datos para 2026
nuevo_2026 <- data.frame(
  category = names(efectos_random),
  year = 2026,
  trend = 15
)

# Coeficientes
beta0 <- coef(random)["(Intercept)"]
beta1 <- coef(random)["trend"]

# Incorporar los efectos aleatorios
nuevo_2026$efecto_random <- as.numeric(efectos_random)

# Predicción 2026
nuevo_2026$market_share_2026 <-
  beta0 +
  beta1 * nuevo_2026$trend +
  nuevo_2026$efecto_random

nuevo_2026
##          category year trend efecto_random market_share_2026
## 1 Bath and Shower 2026    15     -3.988697          7.276328
## 2      Deodorants 2026    15     -3.273814          7.991210
## 3    Depilatories 2026    15    -10.150282          1.114743
## 4      Fragrances 2026    15      4.193032         15.458056
## 5       Hair Care 2026    15      7.908366         19.173390
## 6  Men's Grooming 2026    15      4.908848         16.173872
## 7       Skin Care 2026    15     10.099658         21.364682
## 8        Sun Care 2026    15     -9.697110          1.567914
actual_2025 <- df2_model %>%
  filter(year == 2025) %>%
  select(
    category,
    market_share_2025 = market_share
  )

resultado_final <- nuevo_2026 %>%
  select(
    category,
    market_share_2026
  ) %>%
  left_join(actual_2025, by = "category") %>%
  mutate(
    cambio_pp = market_share_2026 - market_share_2025
  ) %>%
  arrange(desc(market_share_2026))

resultado_final
##          category market_share_2026 market_share_2025  cambio_pp
## 1       Skin Care         21.364682        22.9054931 -1.5408111
## 2       Hair Care         19.173390        17.9499600  1.2234302
## 3  Men's Grooming         16.173872        15.7874748  0.3863973
## 4      Fragrances         15.458056        18.0941915 -2.6361351
## 5      Deodorants          7.991210         6.9593731  1.0318371
## 6 Bath and Shower          7.276328         6.8055431  0.4707847
## 7        Sun Care          1.567914         1.3796231  0.1882909
## 8    Depilatories          1.114743         0.5972074  0.5175352

#CONCLUSIÓN: Con base en los resultados del modelo de efectos aleatorios, Hair Care representa la alternativa de inversión más atractiva entre las subcategorías analizadas de Beauty & Personal Care para 2026. #Para 2026, Hair Care presenta una participación de mercado estimada de 19.17%, lo que la posiciona como la segunda subcategoría con mayor participación proyectada, únicamente por debajo de Skin Care, con 21.36%. Esto indica que Hair Care ya cuenta con una presencia importante dentro del mercado total de Beauty & Personal Care, por lo que una inversión en esta categoría no dependería del crecimiento de un segmento pequeño o poco consolidado, sino de una categoría que actualmente representa una proporción significativa del mercado. #Además, Hair Care presenta el mayor incremento absoluto esperado en participación de mercado entre las principales subcategorías, pasando de aproximadamente 17.95% en 2025 a 19.17% en 2026. Esto representa un crecimiento de alrededor de 1.22 puntos porcentuales.

Parte 3. Banco mundial

# obtener esperanza de vida de varios países
life_expectancy_data <- wb_data(country = c("MX", "US", "CA"),
                                indicator = "SP.DYN.LE00.IN",
                                start_date = 1950,end_date = 2025)
# Preparar datos
life_data <- life_expectancy_data %>%
  transmute(
    country = country,
    year = as.integer(date),
    life_expectancy = SP.DYN.LE00.IN
  ) %>%
  filter(!is.na(life_expectancy)) %>%
  mutate(
    trend = year - min(year)
  ) %>%
  arrange(country, year)

head(life_data)
## # A tibble: 6 × 4
##   country  year life_expectancy trend
##   <chr>   <int>           <dbl> <int>
## 1 Canada   1960            71.1     0
## 2 Canada   1961            71.3     1
## 3 Canada   1962            71.4     2
## 4 Canada   1963            71.4     3
## 5 Canada   1964            71.8     4
## 6 Canada   1965            71.9     5
life_panel <- pdata.frame(
  life_data,
  index = c("country", "year")
)

pdim(life_panel)
## Balanced Panel: n = 3, T = 65, N = 195
is.pbalanced(life_panel)
## [1] TRUE
plotmeans(
  life_expectancy ~ country,
  data = life_data,
  xlab = "País",
  ylab = "Esperanza de vida"
)

ggplot(
  life_data,
  aes(
    x = year,
    y = life_expectancy,
    color = country
  )
) +
  geom_line(linewidth = 1) +
  labs(
    title = "Evolución de la esperanza de vida",
    x = "Año",
    y = "Esperanza de vida",
    color = "País"
  ) +
  theme_minimal()

#Opción 1 - Efectos agrupados
pooled_life <- plm(
  life_expectancy ~ trend,
  data = life_panel,
  model = "pooling"
)

summary(pooled_life)
## Pooling Model
## 
## Call:
## plm(formula = life_expectancy ~ trend, data = life_panel, model = "pooling")
## 
## Balanced Panel: n = 3, T = 65, N = 195
## 
## Residuals:
##     Min.  1st Qu.   Median  3rd Qu.     Max. 
## -12.5473  -3.4926   1.8974   3.9455   5.0129 
## 
## Coefficients:
##              Estimate Std. Error t-value  Pr(>|t|)    
## (Intercept) 66.120307   0.656051 100.785 < 2.2e-16 ***
## trend        0.223581   0.017686  12.642 < 2.2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Total Sum of Squares:    7575
## Residual Sum of Squares: 4143.7
## R-Squared:      0.45297
## Adj. R-Squared: 0.45013
## F-statistic: 159.814 on 1 and 193 DF, p-value: < 2.22e-16
#Opción 2 - Efectos fijos
fixed_life <- plm(
  life_expectancy ~ trend,
  data = life_panel,
  model = "within",
  effect = "individual"
)

summary(fixed_life)
## Oneway (individual) effect Within Model
## 
## Call:
## plm(formula = life_expectancy ~ trend, data = life_panel, effect = "individual", 
##     model = "within")
## 
## Balanced Panel: n = 3, T = 65, N = 195
## 
## Residuals:
##     Min.  1st Qu.   Median  3rd Qu.     Max. 
## -6.79967 -0.48439  0.29545  1.11777  3.37249 
## 
## Coefficients:
##        Estimate Std. Error t-value  Pr(>|t|)    
## trend 0.2235814  0.0076021   29.41 < 2.2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Total Sum of Squares:    4188.9
## Residual Sum of Squares: 757.67
## R-Squared:      0.81912
## Adj. R-Squared: 0.81628
## F-statistic: 864.969 on 1 and 191 DF, p-value: < 2.22e-16
prueba_f_life <- pFtest(
  fixed_life,
  pooled_life
)

prueba_f_life
## 
##  F test for individual effects
## 
## data:  life_expectancy ~ trend
## F = 426.79, df1 = 2, df2 = 191, p-value < 2.2e-16
## alternative hypothesis: significant effects
#Opción 3 - Efectos aleatorios
random_life <- plm(
  life_expectancy ~ trend,
  data = life_panel,
  model = "random",
  effect = "individual"
)

summary(random_life)
## Oneway (individual) effect Random Effect Model 
##    (Swamy-Arora's transformation)
## 
## Call:
## plm(formula = life_expectancy ~ trend, data = life_panel, effect = "individual", 
##     model = "random")
## 
## Balanced Panel: n = 3, T = 65, N = 195
## 
## Effects:
##                  var std.dev share
## idiosyncratic  3.967   1.992 0.132
## individual    25.986   5.098 0.868
## theta: 0.9516
## 
## Residuals:
##     Min.  1st Qu.   Median  3rd Qu.     Max. 
## -7.07789 -0.44781  0.37419  1.19318  3.09427 
## 
## Coefficients:
##               Estimate Std. Error z-value  Pr(>|z|)    
## (Intercept) 66.1203066  2.9565836  22.364 < 2.2e-16 ***
## trend        0.2235814  0.0076021  29.410 < 2.2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Total Sum of Squares:    4196.8
## Residual Sum of Squares: 765.61
## R-Squared:      0.81757
## Adj. R-Squared: 0.81663
## Chisq: 864.969 on 1 DF, p-value: < 2.22e-16
prueba_hausman_life <- phtest(
  fixed_life,
  random_life
)

prueba_hausman_life
## 
##  Hausman Test
## 
## data:  life_expectancy ~ trend
## chisq = 8.1205e-15, df = 1, p-value = 1
## alternative hypothesis: one model is inconsistent
# Extraer efectos aleatorios por país
efectos_life <- ranef(random_life)

efectos_life
##        Canada        Mexico United States 
##      3.991447     -5.734168      1.742721
# Coeficientes del modelo Random
beta0 <- coef(random_life)["(Intercept)"]
beta1 <- coef(random_life)["trend"]

beta0
## (Intercept) 
##    66.12031
beta1
##     trend 
## 0.2235814
# Año inicial de la base
anio_inicial <- min(life_data$year)

# Crear base para predicción 2026
nuevo_2026_life <- data.frame(
  country = names(efectos_life),
  year = 2026,
  trend = 2026 - anio_inicial,
  efecto_random = as.numeric(efectos_life)
)

nuevo_2026_life
##         country year trend efecto_random
## 1        Canada 2026    66      3.991447
## 2        Mexico 2026    66     -5.734168
## 3 United States 2026    66      1.742721
# Predicción de esperanza de vida para 2026
nuevo_2026_life <- nuevo_2026_life %>%
  mutate(
    life_expectancy_2026 =
      beta0 +
      beta1 * trend +
      efecto_random
  )

nuevo_2026_life
##         country year trend efecto_random life_expectancy_2026
## 1        Canada 2026    66      3.991447             84.86813
## 2        Mexico 2026    66     -5.734168             75.14251
## 3 United States 2026    66      1.742721             82.61940
resultado_2026_life <- nuevo_2026_life %>%
  select(
    country,
    life_expectancy_2026
  ) %>%
  arrange(desc(life_expectancy_2026))

resultado_2026_life
##         country life_expectancy_2026
## 1        Canada             84.86813
## 2 United States             82.61940
## 3        Mexico             75.14251
max(life_data$year)
## [1] 2024
ultimo_anio <- max(life_data$year)

actual_life <- life_data %>%
  filter(year == ultimo_anio) %>%
  select(
    country,
    life_expectancy_actual = life_expectancy
  )

resultado_final_life <- resultado_2026_life %>%
  left_join(
    actual_life,
    by = "country"
  ) %>%
  mutate(
    cambio = life_expectancy_2026 -
      life_expectancy_actual
  ) %>%
  arrange(desc(life_expectancy_2026))

resultado_final_life
##         country life_expectancy_2026 life_expectancy_actual     cambio
## 1        Canada             84.86813               82.10805  2.7600790
## 2 United States             82.61940               78.89024  3.7291577
## 3        Mexico             75.14251               75.26400 -0.1214876

#COCLUSIÓN: De acuerdo con el modelo de efectos aleatorios, Canadá presenta la mayor esperanza de vida estimada para 2026, con aproximadamente 84.87 años, seguido por Estados Unidos con 82.62 años y México con 75.14 años. Los resultados muestran que las diferencias estructurales entre los países se mantendrían, con una brecha proyectada de aproximadamente 9.73 años entre Canadá y México y de 7.48 años entre Estados Unidos y México.

file <- "Actividad_1_patentes.Rmd"

x <- readLines(
  file,
  encoding = "UTF-8",
  warn = FALSE
)
LS0tCnRpdGxlOiAiQWN0aXZpZGFkIDEiCmF1dGhvcjogIkNhcmxhIExpZXZhbm8gLSBBMDE3MTE4NTYiCm91dHB1dDoKICBodG1sX2RvY3VtZW50OgogICAgdG9jOiBUUlVFCiAgICB0b2NfZmxvYXQ6IFRSVUUKICAgIGNvZGVfZG93bmxvYWQ6IFRSVUUKICAgIHRoZW1lOiBjZXJ1bGVhbgpkYXRlOiAiMjAyNi0wOC0xMiIKLS0tCgohW10oaHR0cHM6Ly93d3cud2FzaGluZ3RvbnBvc3QuY29tL3dwLWFwcHMvaW1ycy5waHA/c3JjPWh0dHBzOi8vYXJjLWFuZ2xlcmZpc2gtd2FzaHBvc3QtcHJvZC13YXNocG9zdC5zMy5hbWF6b25hd3MuY29tL3B1YmxpYy9QVjVES0tDVFg2UExQQkoyWVVMQ0ZORlJDUV9zaXplLW5vcm1hbGl6ZWQuanBnJnc9MTQ0MCkKCiMgSW1wb3J0YXIgcGFxdWV0ZXMgeSBsbGFtYXIgbGlicmVyw61hcwpgYGB7ciBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQojaW5zdGFsbC5wYWNrYWdlcygicmVhZHhsIikKbGlicmFyeShyZWFkeGwpCiNpbnN0YWxsLnBhY2thZ2VzKCJwbG0iKQpsaWJyYXJ5KHBsbSkKI2luc3RhbGwucGFja2FnZXMoImdwbG90cyIpCmxpYnJhcnkoZ3Bsb3RzKQpsaWJyYXJ5KHRpZHl2ZXJzZSkKbGlicmFyeShwbG0pCmxpYnJhcnkoZ3Bsb3RzKQojaW5zdGFsbC5wYWNrYWdlcygiV0RJIikKbGlicmFyeShXREkpCiNpbnN0YWxsLnBhY2thZ2VzKCJ3YnN0YXRzIikKbGlicmFyeSh3YnN0YXRzKQpsaWJyYXJ5KGxtdGVzdCkKbGlicmFyeShzYW5kd2ljaCkKYGBgCgoKIyBQYXJ0ZSAxLiBQYXRlbnRlcwojwr9Dw7NtbyBzZSByZWxhY2lvbmEgZWwgYXVtZW50byBlbiBsYSBpbnZlcnNpw7NuIGVuIFJlc2VhcmNoICYgRGV2ZWxvcG1lbnQgY29uIGVsIG7Dum1lcm8gZGUgcGF0ZW50ZXMgY29uY2VkaWRhcyBwb3IgbGFzIGVtcHJlc2FzLCBjb25zaWRlcmFuZG8gcXVlIGVsIGVmZWN0byBkZSBsYSBpbnZlcnNpw7NuIHB1ZWRlIHByZXNlbnRhcnNlIGhhc3RhIHRyZXMgYcOxb3MgZGVzcHXDqXM/CgpgYGB7cn0KZGYxIDwtIHJlYWQuY3N2KCIvVXNlcnMvY2FybGFsaWV2YW5vZXNwaW5vc2EvRGVza3RvcC9idXNpbmVzcyBhbmFseXRpY3MvOHZvIHNlbWVzdHJlL2RmMS5jc3YiKQoKZGYxIDwtIGRmMSAlPiUKICBhcnJhbmdlKGN1c2lwLCB5ZWFyKQpkZjFfcGFuZWwgPC0gcGRhdGEuZnJhbWUoCiAgZGYxLAogIGluZGV4ID0gYygiY3VzaXAiLCAieWVhciIpCikKCnBkaW0oZGYxX3BhbmVsKQoKI1JlemFnbyBkZSAzIGHDsW9zCmRmMV9wYW5lbCRybmRfbGFnMSA8LSBzdGF0czo6bGFnKAogIGRmMV9wYW5lbCRybmRlZmx0LAogIGsgPSAxCikKCmRmMV9wYW5lbCRybmRfbGFnMiA8LSBzdGF0czo6bGFnKAogIGRmMV9wYW5lbCRybmRlZmx0LAogIGsgPSAyCikKCmRmMV9wYW5lbCRybmRfbGFnMyA8LSBzdGF0czo6bGFnKAogIGRmMV9wYW5lbCRybmRlZmx0LAogIGsgPSAzCikKCmhlYWQoCiAgZGYxX3BhbmVsWwogICAgLAogICAgYygKICAgICAgImN1c2lwIiwKICAgICAgInllYXIiLAogICAgICAicm5kZWZsdCIsCiAgICAgICJybmRfbGFnMSIsCiAgICAgICJybmRfbGFnMiIsCiAgICAgICJybmRfbGFnMyIKICAgICkKICBdLAogIDE1CikKCnZhcmlhYmxlc19tb2RlbG8gPC0gYygKICAicGF0ZW50cyIsCiAgInBhdGVudHNnIiwKICAicm5kZWZsdCIsCiAgInJuZF9sYWcxIiwKICAicm5kX2xhZzIiLAogICJybmRfbGFnMyIKKQoKZGZfbW9kZWwgPC0gZGYxX3BhbmVsWwogIGNvbXBsZXRlLmNhc2VzKGRmMV9wYW5lbFssIHZhcmlhYmxlc19tb2RlbG9dKSwKXQoKcGRpbShkZl9tb2RlbCkKCnNvcnQodW5pcXVlKGRmX21vZGVsJHllYXIpKQoKIyNQQVJURSBBLiBSJkQg4oaSIFBBVEVOVEVTIFNPTElDSVRBREFTCgojIE9QQ0nDk04gMSAtIE1PREVMTyBQT09MRUQKCnBvb2xlZF9wYXRlbnRzIDwtIHBsbSgKICBwYXRlbnRzIH4gcm5kZWZsdCArCiAgICBybmRfbGFnMSArCiAgICBybmRfbGFnMiArCiAgICBybmRfbGFnMywKICBkYXRhID0gZGZfbW9kZWwsCiAgbW9kZWwgPSAicG9vbGluZyIKKQoKc3VtbWFyeShwb29sZWRfcGF0ZW50cykKCiMgT1BDScOTTiAyIC0gRUZFQ1RPUyBGSUpPUwoKd2l0aGluX3BhdGVudHMgPC0gcGxtKAogIHBhdGVudHMgfiBybmRlZmx0ICsKICAgIHJuZF9sYWcxICsKICAgIHJuZF9sYWcyICsKICAgIHJuZF9sYWczLAogIGRhdGEgPSBkZl9tb2RlbCwKICBtb2RlbCA9ICJ3aXRoaW4iLAogIGVmZmVjdCA9ICJpbmRpdmlkdWFsIgopCgpzdW1tYXJ5KHdpdGhpbl9wYXRlbnRzKQoKIyBQUlVFQkEgRgojIEgwOiBQb29sZWQgZXMgc3VmaWNpZW50ZQojIEgxOiBleGlzdGVuIGVmZWN0b3MgaW5kaXZpZHVhbGVzIHBvciBlbXByZXNhCgpwcnVlYmFfZl9wYXRlbnRzIDwtIHBGdGVzdCgKICB3aXRoaW5fcGF0ZW50cywKICBwb29sZWRfcGF0ZW50cwopCgpwcnVlYmFfZl9wYXRlbnRzCgojIE9QQ0nDk04gMyAtIEVGRUNUT1MgQUxFQVRPUklPUwoKcmFuZG9tX3BhdGVudHMgPC0gcGxtKAogIHBhdGVudHMgfiBybmRlZmx0ICsKICAgIHJuZF9sYWcxICsKICAgIHJuZF9sYWcyICsKICAgIHJuZF9sYWczLAogIGRhdGEgPSBkZl9tb2RlbCwKICBtb2RlbCA9ICJyYW5kb20iLAogIGVmZmVjdCA9ICJpbmRpdmlkdWFsIgopCgpzdW1tYXJ5KHJhbmRvbV9wYXRlbnRzKQoKIyBQUlVFQkEgTE0gREUgQlJFVVNDSC1QQUdBTgojIEgwOiBubyBleGlzdGVuIGVmZWN0b3MgaW5kaXZpZHVhbGVzIGFsZWF0b3Jpb3MKIyBIMTogUmFuZG9tIGVzIHByZWZlcmlibGUgYSBQb29sZWQKCnBydWViYV9sbV9wYXRlbnRzIDwtIHBsbXRlc3QoCiAgcG9vbGVkX3BhdGVudHMsCiAgZWZmZWN0ID0gImluZGl2aWR1YWwiLAogIHR5cGUgPSAiYnAiCikKCnBydWViYV9sbV9wYXRlbnRzCgojIFBSVUVCQSBERSBIQVVTTUFOCgpwcnVlYmFfaGF1c21hbl9wYXRlbnRzIDwtIHBodGVzdCgKICB3aXRoaW5fcGF0ZW50cywKICByYW5kb21fcGF0ZW50cwopCgpwcnVlYmFfaGF1c21hbl9wYXRlbnRzCgppZigKICBwcnVlYmFfZl9wYXRlbnRzJHAudmFsdWUgPj0gMC4wNSAmCiAgcHJ1ZWJhX2xtX3BhdGVudHMkcC52YWx1ZSA+PSAwLjA1Cil7CiAgCiAgbW9kZWxvX3BhdGVudHNfbm9tYnJlIDwtICJQb29sZWQiCiAgbW9kZWxvX3BhdGVudHMgPC0gcG9vbGVkX3BhdGVudHMKICAKfSBlbHNlIGlmKAogIHBydWViYV9mX3BhdGVudHMkcC52YWx1ZSA8IDAuMDUgJgogIHBydWViYV9sbV9wYXRlbnRzJHAudmFsdWUgPj0gMC4wNQopewogIAogIG1vZGVsb19wYXRlbnRzX25vbWJyZSA8LSAiRml4ZWQgRWZmZWN0cyIKICBtb2RlbG9fcGF0ZW50cyA8LSB3aXRoaW5fcGF0ZW50cwogIAp9IGVsc2UgaWYoCiAgcHJ1ZWJhX2ZfcGF0ZW50cyRwLnZhbHVlID49IDAuMDUgJgogIHBydWViYV9sbV9wYXRlbnRzJHAudmFsdWUgPCAwLjA1Cil7CiAgCiAgbW9kZWxvX3BhdGVudHNfbm9tYnJlIDwtICJSYW5kb20gRWZmZWN0cyIKICBtb2RlbG9fcGF0ZW50cyA8LSByYW5kb21fcGF0ZW50cwogIAp9IGVsc2UgewogIAogIGlmKHBydWViYV9oYXVzbWFuX3BhdGVudHMkcC52YWx1ZSA8IDAuMDUpewogICAgCiAgICBtb2RlbG9fcGF0ZW50c19ub21icmUgPC0gIkZpeGVkIEVmZmVjdHMiCiAgICBtb2RlbG9fcGF0ZW50cyA8LSB3aXRoaW5fcGF0ZW50cwogICAgCiAgfSBlbHNlIHsKICAgIAogICAgbW9kZWxvX3BhdGVudHNfbm9tYnJlIDwtICJSYW5kb20gRWZmZWN0cyIKICAgIG1vZGVsb19wYXRlbnRzIDwtIHJhbmRvbV9wYXRlbnRzCiAgICAKICB9Cn0KCm1vZGVsb19wYXRlbnRzX25vbWJyZQoKc3VtbWFyeShtb2RlbG9fcGF0ZW50cykKCiMjUEFSVEUgQi4gUiZEIOKGkiBQQVRFTlRFUyBDT05DRURJREFTCgojIE9QQ0nDk04gMSAtIFBPT0xFRAoKcG9vbGVkX2dyYW50ZWQgPC0gcGxtKAogIHBhdGVudHNnIH4gcm5kZWZsdCArCiAgICBybmRfbGFnMSArCiAgICBybmRfbGFnMiArCiAgICBybmRfbGFnMywKICBkYXRhID0gZGZfbW9kZWwsCiAgbW9kZWwgPSAicG9vbGluZyIKKQoKc3VtbWFyeShwb29sZWRfZ3JhbnRlZCkKCiMgT1BDScOTTiAyIC0gRUZFQ1RPUyBGSUpPUwoKd2l0aGluX2dyYW50ZWQgPC0gcGxtKAogIHBhdGVudHNnIH4gcm5kZWZsdCArCiAgICBybmRfbGFnMSArCiAgICBybmRfbGFnMiArCiAgICBybmRfbGFnMywKICBkYXRhID0gZGZfbW9kZWwsCiAgbW9kZWwgPSAid2l0aGluIiwKICBlZmZlY3QgPSAiaW5kaXZpZHVhbCIKKQoKc3VtbWFyeSh3aXRoaW5fZ3JhbnRlZCkKCiNQcnVlYmEgRgpwcnVlYmFfZl9ncmFudGVkIDwtIHBGdGVzdCgKICB3aXRoaW5fZ3JhbnRlZCwKICBwb29sZWRfZ3JhbnRlZAopCgpwcnVlYmFfZl9ncmFudGVkCgojIE9QQ0nDk04gMyAtIEVGRUNUT1MgQUxFQVRPUklPUwoKcmFuZG9tX2dyYW50ZWQgPC0gcGxtKAogIHBhdGVudHNnIH4gcm5kZWZsdCArCiAgICBybmRfbGFnMSArCiAgICBybmRfbGFnMiArCiAgICBybmRfbGFnMywKICBkYXRhID0gZGZfbW9kZWwsCiAgbW9kZWwgPSAicmFuZG9tIiwKICBlZmZlY3QgPSAiaW5kaXZpZHVhbCIKKQoKc3VtbWFyeShyYW5kb21fZ3JhbnRlZCkKCgpwcnVlYmFfbG1fZ3JhbnRlZCA8LSBwbG10ZXN0KAogIHBvb2xlZF9ncmFudGVkLAogIGVmZmVjdCA9ICJpbmRpdmlkdWFsIiwKICB0eXBlID0gImJwIgopCgpwcnVlYmFfbG1fZ3JhbnRlZAoKI1BydWViYSBIYXVzbWFuCnBydWViYV9oYXVzbWFuX2dyYW50ZWQgPC0gcGh0ZXN0KAogIHdpdGhpbl9ncmFudGVkLAogIHJhbmRvbV9ncmFudGVkCikKCnBydWViYV9oYXVzbWFuX2dyYW50ZWQKCmlmKAogIHBydWViYV9mX2dyYW50ZWQkcC52YWx1ZSA+PSAwLjA1ICYKICBwcnVlYmFfbG1fZ3JhbnRlZCRwLnZhbHVlID49IDAuMDUKKXsKICAKICBtb2RlbG9fZmluYWxfbm9tYnJlIDwtICJQb29sZWQiCiAgbW9kZWxvX2ZpbmFsIDwtIHBvb2xlZF9ncmFudGVkCiAgCn0gZWxzZSBpZigKICBwcnVlYmFfZl9ncmFudGVkJHAudmFsdWUgPCAwLjA1ICYKICBwcnVlYmFfbG1fZ3JhbnRlZCRwLnZhbHVlID49IDAuMDUKKXsKICAKICBtb2RlbG9fZmluYWxfbm9tYnJlIDwtICJGaXhlZCBFZmZlY3RzIgogIG1vZGVsb19maW5hbCA8LSB3aXRoaW5fZ3JhbnRlZAogIAp9IGVsc2UgaWYoCiAgcHJ1ZWJhX2ZfZ3JhbnRlZCRwLnZhbHVlID49IDAuMDUgJgogIHBydWViYV9sbV9ncmFudGVkJHAudmFsdWUgPCAwLjA1Cil7CiAgCiAgbW9kZWxvX2ZpbmFsX25vbWJyZSA8LSAiUmFuZG9tIEVmZmVjdHMiCiAgbW9kZWxvX2ZpbmFsIDwtIHJhbmRvbV9ncmFudGVkCiAgCn0gZWxzZSB7CiAgCiAgaWYocHJ1ZWJhX2hhdXNtYW5fZ3JhbnRlZCRwLnZhbHVlIDwgMC4wNSl7CiAgICAKICAgIG1vZGVsb19maW5hbF9ub21icmUgPC0gIkZpeGVkIEVmZmVjdHMiCiAgICBtb2RlbG9fZmluYWwgPC0gd2l0aGluX2dyYW50ZWQKICAgIAogIH0gZWxzZSB7CiAgICAKICAgIG1vZGVsb19maW5hbF9ub21icmUgPC0gIlJhbmRvbSBFZmZlY3RzIgogICAgbW9kZWxvX2ZpbmFsIDwtIHJhbmRvbV9ncmFudGVkCiAgICAKICB9Cn0KCm1vZGVsb19maW5hbF9ub21icmUKCnN1bW1hcnkobW9kZWxvX2ZpbmFsKQoKcmVzdWx0YWRvX3JvYnVzdG8gPC0gY29lZnRlc3QoCiAgbW9kZWxvX2ZpbmFsLAogIHZjb3YgPSB2Y292SEMoCiAgICBtb2RlbG9fZmluYWwsCiAgICBtZXRob2QgPSAiYXJlbGxhbm8iLAogICAgdHlwZSA9ICJIQzEiLAogICAgY2x1c3RlciA9ICJncm91cCIKICApCikKCnJlc3VsdGFkb19yb2J1c3RvCgojRWZlY3RvIGFjdW11bGFkbyBkZSBSJkQgZHVyYW50ZSBsb3MgY3VhdHJvIGHDsW9zCgpjb2VmX3JuZCA8LSBjb2VmKG1vZGVsb19maW5hbClbCiAgYygKICAgICJybmRlZmx0IiwKICAgICJybmRfbGFnMSIsCiAgICAicm5kX2xhZzIiLAogICAgInJuZF9sYWczIgogICkKXQoKY29lZl9ybmQKCmVmZWN0b19hY3VtdWxhZG8gPC0gc3VtKGNvZWZfcm5kKQoKZWZlY3RvX2FjdW11bGFkbwoKCmNvcigKICBhcy5kYXRhLmZyYW1lKAogICAgZGZfbW9kZWxbLCBjKAogICAgICAicm5kZWZsdCIsCiAgICAgICJybmRfbGFnMSIsCiAgICAgICJybmRfbGFnMiIsCiAgICAgICJybmRfbGFnMyIKICAgICldCiAgKSwKICB1c2UgPSAiY29tcGxldGUub2JzIgopCgpsaWJyYXJ5KGNhcikKCmxpbmVhckh5cG90aGVzaXMoCiAgbW9kZWxvX2ZpbmFsLAogICJybmRlZmx0ICsgcm5kX2xhZzEgKyBybmRfbGFnMiArIHJuZF9sYWczID0gMCIsCiAgdmNvdi4gPSB2Y292SEMoCiAgICBtb2RlbG9fZmluYWwsCiAgICBtZXRob2QgPSAiYXJlbGxhbm8iLAogICAgdHlwZSA9ICJIQzEiLAogICAgY2x1c3RlciA9ICJncm91cCIKICApCikKCiMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIyBDT1JSRUNDScOTTiBERSBNVUxUSUNPTElORUFMSURBRCBZIE1PREVMTyBGSU5BTAojID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgojIENyZWFyIHVuYSBzb2xhIHZhcmlhYmxlIHF1ZSByZXN1bWUgZWwgUiZECiMgZGUgbG9zIHRyZXMgYcOxb3MgYW50ZXJpb3JlcwoKZGZfbW9kZWwkcm5kX3Byb21fMyA8LSAoCiAgZGZfbW9kZWwkcm5kX2xhZzEgKwogIGRmX21vZGVsJHJuZF9sYWcyICsKICBkZl9tb2RlbCRybmRfbGFnMwopIC8gMwoKCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyBNT0RFTE8gRklOQUwgREUgRUZFQ1RPUyBGSUpPUwojIEZpeGVkIEVmZmVjdHMgeWEgZnVlIHNlbGVjY2lvbmFkbyBwcmV2aWFtZW50ZQojIG1lZGlhbnRlIGxhcyBwcnVlYmFzIEYsIExNIHkgSGF1c21hbgojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgptb2RlbG9fZmluYWxfZmUgPC0gcGxtKAogIHBhdGVudHNnIH4gcm5kX3Byb21fMywKICBkYXRhID0gZGZfbW9kZWwsCiAgbW9kZWwgPSAid2l0aGluIiwKICBlZmZlY3QgPSAiaW5kaXZpZHVhbCIKKQoKc3VtbWFyeShtb2RlbG9fZmluYWxfZmUpCgoKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojIEVSUk9SRVMgRVNUw4FOREFSIFJPQlVTVE9TCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCnJlc3VsdGFkb19yb2J1c3RvX2ZpbmFsIDwtIGNvZWZ0ZXN0KAogIG1vZGVsb19maW5hbF9mZSwKICB2Y292ID0gdmNvdkhDKAogICAgbW9kZWxvX2ZpbmFsX2ZlLAogICAgbWV0aG9kID0gImFyZWxsYW5vIiwKICAgIHR5cGUgPSAiSEMxIiwKICAgIGNsdXN0ZXIgPSAiZ3JvdXAiCiAgKQopCgpyZXN1bHRhZG9fcm9idXN0b19maW5hbAoKIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQojIE5VRVZBIEVTUEVDSUZJQ0FDScOTTjogU1RPQ0sgREUgUiZECiMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCiMgTW9kZWxvIGRlIGVmZWN0b3MgZmlqb3MKIyBGaXhlZCBFZmZlY3RzIHlhIGZ1ZSBzZWxlY2Npb25hZG8gY29uIEYsIExNIHkgSGF1c21hbgoKbW9kZWxvX3N0b2NrIDwtIHBsbSgKICBwYXRlbnRzZyB+IHJuZHN0Y2ssCiAgZGF0YSA9IGRmMV9wYW5lbCwKICBtb2RlbCA9ICJ3aXRoaW4iLAogIGVmZmVjdCA9ICJpbmRpdmlkdWFsIgopCgpzdW1tYXJ5KG1vZGVsb19zdG9jaykKCgojIEVycm9yZXMgZXN0w6FuZGFyIHJvYnVzdG9zCgpyZXN1bHRhZG9fc3RvY2tfcm9idXN0byA8LSBjb2VmdGVzdCgKICBtb2RlbG9fc3RvY2ssCiAgdmNvdiA9IHZjb3ZIQygKICAgIG1vZGVsb19zdG9jaywKICAgIG1ldGhvZCA9ICJhcmVsbGFubyIsCiAgICB0eXBlID0gIkhDMSIsCiAgICBjbHVzdGVyID0gImdyb3VwIgogICkKKQoKcmVzdWx0YWRvX3N0b2NrX3JvYnVzdG8KCiMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiMgVkFMSURBQ0nDk04gREVMIE1PREVMTyBDT04gU1RPQ0sgREUgUiZECiMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgojIE1pc21hIG11ZXN0cmEgcGFyYSBsb3MgdHJlcyBtb2RlbG9zCmRmX3N0b2NrIDwtIGRmMV9wYW5lbFsKICBjb21wbGV0ZS5jYXNlcyhkZjFfcGFuZWxbLCBjKCJwYXRlbnRzZyIsICJybmRzdGNrIildKSwKXQoKCiMgMS4gUG9vbGVkCnBvb2xlZF9zdG9jayA8LSBwbG0oCiAgcGF0ZW50c2cgfiBybmRzdGNrLAogIGRhdGEgPSBkZl9zdG9jaywKICBtb2RlbCA9ICJwb29saW5nIgopCgoKIyAyLiBGaXhlZCBFZmZlY3RzCmZpeGVkX3N0b2NrIDwtIHBsbSgKICBwYXRlbnRzZyB+IHJuZHN0Y2ssCiAgZGF0YSA9IGRmX3N0b2NrLAogIG1vZGVsID0gIndpdGhpbiIsCiAgZWZmZWN0ID0gImluZGl2aWR1YWwiCikKCgojIDMuIFJhbmRvbSBFZmZlY3RzCnJhbmRvbV9zdG9jayA8LSBwbG0oCiAgcGF0ZW50c2cgfiBybmRzdGNrLAogIGRhdGEgPSBkZl9zdG9jaywKICBtb2RlbCA9ICJyYW5kb20iLAogIGVmZmVjdCA9ICJpbmRpdmlkdWFsIgopCgoKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyBQUlVFQkFTIERFIFNFTEVDQ0nDk04KIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiMgSGV0ZXJvZ2VuZWlkYWQ6IFBvb2xlZCB2cyBGaXhlZApwRnRlc3QoZml4ZWRfc3RvY2ssIHBvb2xlZF9zdG9jaykKCiMgUG9vbGVkIHZzIFJhbmRvbQpwbG10ZXN0KAogIHBvb2xlZF9zdG9jaywKICBlZmZlY3QgPSAiaW5kaXZpZHVhbCIsCiAgdHlwZSA9ICJicCIKKQoKIyBGaXhlZCB2cyBSYW5kb20KcGh0ZXN0KAogIGZpeGVkX3N0b2NrLAogIHJhbmRvbV9zdG9jawopCgoKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyBFRkVDVE9TIEZJSk9TIERFIEVNUFJFU0EgWSBBw5FPCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgpmaXhlZF9zdG9ja190dyA8LSBwbG0oCiAgcGF0ZW50c2cgfiBybmRzdGNrLAogIGRhdGEgPSBkZl9zdG9jaywKICBtb2RlbCA9ICJ3aXRoaW4iLAogIGVmZmVjdCA9ICJ0d293YXlzIgopCgpzdW1tYXJ5KGZpeGVkX3N0b2NrX3R3KQoKCiMgRXJyb3JlcyByb2J1c3RvcwpyZXN1bHRhZG9fc3RvY2tfdHcgPC0gY29lZnRlc3QoCiAgZml4ZWRfc3RvY2tfdHcsCiAgdmNvdiA9IHZjb3ZIQygKICAgIGZpeGVkX3N0b2NrX3R3LAogICAgbWV0aG9kID0gImFyZWxsYW5vIiwKICAgIHR5cGUgPSAiSEMxIiwKICAgIGNsdXN0ZXIgPSAiZ3JvdXAiCiAgKQopCgpyZXN1bHRhZG9fc3RvY2tfdHcKCiMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIyBQUkVESUNDScOTTiBERSBQQVRFTlRFUyBDT05DRURJREFTIFBBUkEgMjAyMgojID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgpsaWJyYXJ5KGRwbHlyKQpsaWJyYXJ5KHBsbSkKCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyAxLiBQcmVwYXJhciBkYXRvcyBwYXJhIGVsIG1vZGVsbyBwcmVkaWN0aXZvCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCmRmX3ByZWRfbW9kZWwgPC0gZGYxICU+JQogIG11dGF0ZSgKICAgIHllYXIgPSBhcy5udW1lcmljKGFzLmNoYXJhY3Rlcih5ZWFyKSkKICApICU+JQogIGZpbHRlcigKICAgICFpcy5uYShwYXRlbnRzZyksCiAgICAhaXMubmEocm5kc3RjaykKICApICU+JQogIGFycmFuZ2UoY3VzaXAsIHllYXIpCgpkZl9wcmVkX3BhbmVsIDwtIHBkYXRhLmZyYW1lKAogIGRmX3ByZWRfbW9kZWwsCiAgaW5kZXggPSBjKCJjdXNpcCIsICJ5ZWFyIikKKQoKCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyAyLiBNb2RlbG8gcHJlZGljdGl2bwojIEVmZWN0b3MgZmlqb3MgcG9yIGVtcHJlc2EgKyB0ZW5kZW5jaWEgdGVtcG9yYWwKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKbW9kZWxvX3ByZWQgPC0gcGxtKAogIHBhdGVudHNnIH4gcm5kc3RjayArIHllYXIsCiAgZGF0YSA9IGRmX3ByZWRfcGFuZWwsCiAgbW9kZWwgPSAid2l0aGluIiwKICBlZmZlY3QgPSAiaW5kaXZpZHVhbCIKKQoKc3VtbWFyeShtb2RlbG9fcHJlZCkKCgojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiMgMy4gUHJveWVjdGFyIHJuZHN0Y2sgZGUgY2FkYSBlbXByZXNhIHBhcmEgMjAyMgojIHVzYW5kbyBzdSB0ZW5kZW5jaWEgaGlzdMOzcmljYQojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgpybmRzdGNrXzIwMjIgPC0gZGZfcHJlZF9tb2RlbCAlPiUKICBncm91cF9ieShjdXNpcCkgJT4lCiAgZmlsdGVyKHN1bSghaXMubmEocm5kc3RjaykpID49IDIpICU+JQogIGdyb3VwX21vZGlmeSh+ewogICAgCiAgICBtb2RlbG9fcm5kIDwtIGxtKAogICAgICBybmRzdGNrIH4geWVhciwKICAgICAgZGF0YSA9IC54CiAgICApCiAgICAKICAgIHRpYmJsZSgKICAgICAgeWVhciA9IDIwMjIsCiAgICAgIHJuZHN0Y2tfcHJlZCA9IHByZWRpY3QoCiAgICAgICAgbW9kZWxvX3JuZCwKICAgICAgICBuZXdkYXRhID0gZGF0YS5mcmFtZSh5ZWFyID0gMjAyMikKICAgICAgKQogICAgKQogICAgCiAgfSkgJT4lCiAgdW5ncm91cCgpCgoKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojIDQuIEV4dHJhZXIgY29lZmljaWVudGVzIGRlbCBtb2RlbG8KIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKYmV0YV9ybmQgPC0gdW5uYW1lKAogIGNvZWYobW9kZWxvX3ByZWQpWyJybmRzdGNrIl0KKQoKYmV0YV95ZWFyIDwtIHVubmFtZSgKICBjb2VmKG1vZGVsb19wcmVkKVsieWVhciJdCikKCmVmZWN0b3NfZW1wcmVzYSA8LSBmaXhlZigKICBtb2RlbG9fcHJlZCwKICB0eXBlID0gImxldmVsIgopCgoKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojIDUuIFByZWRlY2lyIHBhdGVudGVzIGNvbmNlZGlkYXMgcGFyYSAyMDIyCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCnByZWRpY2Npb25fMjAyMiA8LSBybmRzdGNrXzIwMjIgJT4lCiAgbXV0YXRlKAogICAgCiAgICBlZmVjdG9fZW1wcmVzYSA9IHVubmFtZSgKICAgICAgZWZlY3Rvc19lbXByZXNhW2FzLmNoYXJhY3RlcihjdXNpcCldCiAgICApLAogICAgCiAgICBwYXRlbnRzZ19wcmVkID0KICAgICAgZWZlY3RvX2VtcHJlc2EgKwogICAgICBiZXRhX3JuZCAqIHJuZHN0Y2tfcHJlZCArCiAgICAgIGJldGFfeWVhciAqIDIwMjIsCiAgICAKICAgICMgTGFzIHBhdGVudGVzIG5vIHB1ZWRlbiBzZXIgbmVnYXRpdmFzCiAgICBwYXRlbnRzZ19wcmVkID0gcG1heCgKICAgICAgMCwKICAgICAgcGF0ZW50c2dfcHJlZAogICAgKSwKICAgIAogICAgIyBSZWRvbmRlYXIgYSBuw7ptZXJvIGVudGVybyBkZSBwYXRlbnRlcwogICAgcGF0ZW50c2dfcHJlZF9yb3VuZCA9IHJvdW5kKAogICAgICBwYXRlbnRzZ19wcmVkCiAgICApCiAgICAKICApICU+JQogIGZpbHRlcigKICAgICFpcy5uYShwYXRlbnRzZ19wcmVkKQogICkgJT4lCiAgc2VsZWN0KAogICAgY3VzaXAsCiAgICB5ZWFyLAogICAgcm5kc3Rja19wcmVkLAogICAgcGF0ZW50c2dfcHJlZCwKICAgIHBhdGVudHNnX3ByZWRfcm91bmQKICApICU+JQogIGFycmFuZ2UoCiAgICBkZXNjKHBhdGVudHNnX3ByZWQpCiAgKQoKCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyA2LiBSZXN1bHRhZG9zIGRlIGxhIHByZWRpY2Npw7NuIDIwMjIKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKcHJlZGljY2lvbl8yMDIyCgojIFByaW1lcmFzIDIwIGVtcHJlc2FzIGNvbiBtYXlvciBwcmVkaWNjacOzbgpoZWFkKHByZWRpY2Npb25fMjAyMiwgMjApCgojIFJlc3VtZW4gZGUgcHJlZGljY2lvbmVzCnN1bW1hcnkocHJlZGljY2lvbl8yMDIyJHBhdGVudHNnX3ByZWQpCgojIFRvdGFsIGRlIHBhdGVudGVzIGNvbmNlZGlkYXMgZXN0aW1hZGFzIHBhcmEgMjAyMgpzdW0ocHJlZGljY2lvbl8yMDIyJHBhdGVudHNnX3ByZWRfcm91bmQpCmBgYAojQ09OQ0xVU0nDk046IExvcyByZXN1bHRhZG9zIG11ZXN0cmFuIHF1ZSBleGlzdGVuIGRpZmVyZW5jaWFzIHNpZ25pZmljYXRpdmFzIGVudHJlIGxhcyBlbXByZXNhcywgcG9yIGxvIHF1ZSBlbCBtb2RlbG8gZGUgKiplZmVjdG9zIGZpam9zKiogZnVlIGVsIG3DoXMgYWRlY3VhZG8gcGFyYSBhbmFsaXphciBsYSByZWxhY2nDs24gZW50cmUgbGEgaW52ZXJzacOzbiBlbiBSJkQgeSBsYXMgcGF0ZW50ZXMgY29uY2VkaWRhcy4gRGVzcHXDqXMgZGUgY29ycmVnaXIgZWwgcHJvYmxlbWEgZGUgbXVsdGljb2xpbmVhbGlkYWQgbWVkaWFudGUgZWwgdXNvIGRlbCAqKnN0b2NrIGFjdW11bGFkbyBkZSBSJkQgKGBybmRzdGNrYCkqKiwgc2UgZW5jb250csOzIHVuYSByZWxhY2nDs24gbmVnYXRpdmEgeSBlc3RhZMOtc3RpY2FtZW50ZSBzaWduaWZpY2F0aXZhIGNvbiBsYXMgcGF0ZW50ZXMgY29uY2VkaWRhcyAoKFxiZXRhPS0wLjAyOTkpLCAocD0wLjAwMzQpKSwgaW5jbHVzbyBhbCBjb250cm9sYXIgcG9yIGRpZmVyZW5jaWFzIGVudHJlIGVtcHJlc2FzIHkgZW50cmUgYcOxb3MuIEVzdG8gaW5kaWNhIHF1ZSwgZGVudHJvIGRlIHVuYSBtaXNtYSBlbXByZXNhLCB1biBhdW1lbnRvIGVuIGVsIHN0b2NrIGRlIFImRCBubyBzZSByZWZsZWphIG5lY2VzYXJpYW1lbnRlIGVuIHVuIGF1bWVudG8gaW5tZWRpYXRvIGRlIGxhcyBwYXRlbnRlcyBjb25jZWRpZGFzLiBQb3IgbG8gdGFudG8sIGxvcyByZXN1bHRhZG9zIG5vIHJlc3BhbGRhbiBsYSBoaXDDs3Rlc2lzIGluaWNpYWwgZGUgdW5hIHJlbGFjacOzbiBwb3NpdGl2YSBkaXJlY3RhIHkgc3VnaWVyZW4gcXVlIGVsIHByb2Nlc28gbWVkaWFudGUgZWwgY3VhbCBsYSBpbnZlcnNpw7NuIGVuIGludmVzdGlnYWNpw7NuIHNlIGNvbnZpZXJ0ZSBlbiBwYXRlbnRlcyBwdWVkZSBkZXBlbmRlciBkZSBvdHJvcyBmYWN0b3JlcyB5IGRlIHBlcmlvZG9zIGRlIHRpZW1wbyBtw6FzIGFtcGxpb3MuCgoKCiMgUGFydGUgMi4gQ3VpZGFkbyBkZSBsYSBwaWVsCiNTaSB0dXZpZXJhcyBxdWUgaW52ZXJ0aXIgZW4gYWxndW5hIHN1YiAtIGNhdGVnb3LDrWEsIMK/ZW4gY3XDoWwgbG8gaGFyw61hcz8gSnVzdGlmaWNhIGFtcGxpYW1lbnRlIHR1IHJlc3B1ZXN0YS4KCmBgYHtyfQpkZjIgPC0gcmVhZC5jc3YoIi9Vc2Vycy9jYXJsYWxpZXZhbm9lc3Bpbm9zYS9EZXNrdG9wL2J1c2luZXNzIGFuYWx5dGljcy84dm8gc2VtZXN0cmUvZGYyLmNzdiIpCgpkZjIgPC0gcmVhZC5jc3YoCiAgIi9Vc2Vycy9jYXJsYWxpZXZhbm9lc3Bpbm9zYS9EZXNrdG9wL2J1c2luZXNzIGFuYWx5dGljcy84dm8gc2VtZXN0cmUvZGYyLmNzdiIsCiAgc2tpcCA9IDEsCiAgY2hlY2submFtZXMgPSBGQUxTRSwKICBuYS5zdHJpbmdzID0gYygiLSIsICIiKQogICkKCiMgU3ViY2F0ZWdvcsOtYXMKY2F0ZWdvcmlhcyA8LSBjKAogICJCYXRoIGFuZCBTaG93ZXIiLAogICJEZW9kb3JhbnRzIiwKICAiRGVwaWxhdG9yaWVzIiwKICAiRnJhZ3JhbmNlcyIsCiAgIkhhaXIgQ2FyZSIsCiAgIk1lbidzIEdyb29taW5nIiwKICAiU2tpbiBDYXJlIiwKICAiU3VuIENhcmUiCikKCiMgUGFzYXIgZGUgZm9ybWF0byBhbmNobyBhIGZvcm1hdG8gbGFyZ28KZGYyX2xvbmcgPC0gZGYyICU+JQogIHNlbGVjdChDYXRlZ29yeSwgYWxsX29mKGFzLmNoYXJhY3RlcigyMDExOjIwMjUpKSkgJT4lCiAgcGl2b3RfbG9uZ2VyKAogICAgY29scyA9IGFsbF9vZihhcy5jaGFyYWN0ZXIoMjAxMToyMDI1KSksCiAgICBuYW1lc190byA9ICJ5ZWFyIiwKICAgIHZhbHVlc190byA9ICJtYXJrZXRfc2l6ZSIKICApICU+JQogIG11dGF0ZSgKICAgIHllYXIgPSBhcy5pbnRlZ2VyKHllYXIpLAogICAgbWFya2V0X3NpemUgPSBwYXJzZV9udW1iZXIoYXMuY2hhcmFjdGVyKG1hcmtldF9zaXplKSkKICApCgoKdG90YWxlcyA8LSBkZjJfbG9uZyAlPiUKICBmaWx0ZXIoQ2F0ZWdvcnkgPT0gIkJlYXV0eSBhbmQgUGVyc29uYWwgQ2FyZSIpICU+JQogIHNlbGVjdCh5ZWFyLCB0b3RhbF9tYXJrZXQgPSBtYXJrZXRfc2l6ZSkKCiMgQ2FsY3VsYXIgcGFydGljaXBhY2nDs24gZGUgbWVyY2FkbwpkZjJfbW9kZWwgPC0gZGYyX2xvbmcgJT4lCiAgZmlsdGVyKENhdGVnb3J5ICVpbiUgY2F0ZWdvcmlhcykgJT4lCiAgbGVmdF9qb2luKHRvdGFsZXMsIGJ5ID0gInllYXIiKSAlPiUKICBtdXRhdGUoCiAgICBtYXJrZXRfc2hhcmUgPSAobWFya2V0X3NpemUgLyB0b3RhbF9tYXJrZXQpICogMTAwLAogICAgdHJlbmQgPSB5ZWFyIC0gMjAxMSwKICAgIGNhdGVnb3J5ID0gZmFjdG9yKENhdGVnb3J5KQogICkgJT4lCiAgYXJyYW5nZShjYXRlZ29yeSwgeWVhcikKCiMgUmV2aXNhcgpoZWFkKGRmMl9tb2RlbCkKCgojIFBhbmVsCmRmMl9wYW5lbCA8LSBwZGF0YS5mcmFtZSgKICBhcy5kYXRhLmZyYW1lKGRmMl9tb2RlbCksCiAgaW5kZXggPSBjKCJjYXRlZ29yeSIsICJ5ZWFyIikKKQoKIyBSZXZpc2FyIGVzdHJ1Y3R1cmEgZGVsIHBhbmVsCnBkaW0oZGYyX3BhbmVsKQoKIyBDb21wcm9iYXIgc2kgZXMgYmFsYW5jZWFkbwppcy5wYmFsYW5jZWQoZGYyX3BhbmVsKQoKCiMgUFJVRUJBIERFIEhFVEVST0dFTkVJREFECgpwYXIobWFyID0gYyg4LCA0LCAzLCAxKSkKCnBsb3RtZWFucygKICBtYXJrZXRfc2hhcmUgfiBjYXRlZ29yeSwKICBkYXRhID0gZGYyX21vZGVsLAogIGxhcyA9IDIsCiAgeGxhYiA9ICIiLAogIHlsYWIgPSAiUGFydGljaXBhY2nDs24gZGUgbWVyY2FkbyAoJSkiCikKCgojIE9QQ0nDk04gMSAtIE1PREVMTyBERSBSRUdSRVNJw5NOIEFHUlVQQURBIChQT09MRUQpCgpwb29sZWQgPC0gcGxtKAogIG1hcmtldF9zaGFyZSB+IHRyZW5kLAogIGRhdGEgPSBkZjJfcGFuZWwsCiAgbW9kZWwgPSAicG9vbGluZyIKKQoKc3VtbWFyeShwb29sZWQpCgojIE9QQ0nDk04gMiAtIE1PREVMTyBERSBFRkVDVE9TIEZJSk9TIChXSVRISU4pCgp3aXRoaW4gPC0gcGxtKAogIG1hcmtldF9zaGFyZSB+IHRyZW5kLAogIGRhdGEgPSBkZjJfcGFuZWwsCiAgbW9kZWwgPSAid2l0aGluIiwKICBlZmZlY3QgPSAiaW5kaXZpZHVhbCIKKQoKc3VtbWFyeSh3aXRoaW4pCgoKIyBQUlVFQkEgRgoKcHJ1ZWJhX2YgPC0gcEZ0ZXN0KHdpdGhpbiwgcG9vbGVkKQoKcHJ1ZWJhX2YKCiMgT1BDScOTTiAzIC0gTU9ERUxPIERFIEVGRUNUT1MgQUxFQVRPUklPUyAoUkFORE9NKQoKcmFuZG9tIDwtIHBsbSgKICBtYXJrZXRfc2hhcmUgfiB0cmVuZCwKICBkYXRhID0gZGYyX3BhbmVsLAogIG1vZGVsID0gInJhbmRvbSIsCiAgZWZmZWN0ID0gImluZGl2aWR1YWwiCikKCnN1bW1hcnkocmFuZG9tKQoKIyBQUlVFQkEgREUgSEFVU01BTgoKcHJ1ZWJhX2hhdXNtYW4gPC0gcGh0ZXN0KHdpdGhpbiwgcmFuZG9tKQoKcHJ1ZWJhX2hhdXNtYW4KCmlmKHBydWViYV9mJHAudmFsdWUgPj0gMC4wNSl7CiAgCiAgbW9kZWxvX2ZpbmFsIDwtICJwb29sZWQiCiAgCn0gZWxzZSB7CiAgCiAgaWYocHJ1ZWJhX2hhdXNtYW4kcC52YWx1ZSA8IDAuMDUpewogICAgCiAgICBtb2RlbG9fZmluYWwgPC0gIndpdGhpbiIKICAgIAogIH0gZWxzZSB7CiAgICAKICAgIG1vZGVsb19maW5hbCA8LSAicmFuZG9tIgogICAgCiAgfQp9Cgptb2RlbG9fZmluYWwKCgojIENPTkNMVVNJw5NOOgojIERlIGFjdWVyZG8gY29uIGxhIHBydWViYSBkZSBIYXVzbWFuLCBlbCBwLXZhbHVlIGVzIG1heW9yIGEgMC4wNS4gUG9yIGxvIHRhbnRvLCBlbCBtb2RlbG8gZGUgRWZlY3RvcyBBbGVhdG9yaW9zIGVzIG3DoXMgYWRlY3VhZG8KIyBxdWUgZWwgbW9kZWxvIGRlIEVmZWN0b3MgRmlqb3MuCgojIFNlIHV0aWxpemFyw6EgZWwgbW9kZWxvIFJhbmRvbSBwYXJhIHJlYWxpemFyIGxhIHByZWRpY2Npw7NuIGRlIGxhIHBhcnRpY2lwYWNpw7NuIGRlIG1lcmNhZG8gZGUgY2FkYSBzdWJjYXRlZ29yw61hIHBhcmEgMjAyNi4KCgpgYGAKCmBgYHtyfQojIENvZWZpY2llbnRlcyBkZWwgbW9kZWxvIFJhbmRvbQpiZXRhMCA8LSBjb2VmKHJhbmRvbSlbIihJbnRlcmNlcHQpIl0KYmV0YTEgPC0gY29lZihyYW5kb20pWyJ0cmVuZCJdCgpiZXRhMApiZXRhMQoKIyBDYWxjdWxhciBsYSBwYXJ0ZSBjb23Dum4gZXN0aW1hZGEgcG9yIGVsIG1vZGVsbwpkZjJfbW9kZWwgPC0gZGYyX21vZGVsICU+JQogIG11dGF0ZSgKICAgIHByZWRfcGFydGVfY29tdW4gPSBiZXRhMCArIGJldGExICogdHJlbmQsCiAgICBkaWZlcmVuY2lhID0gbWFya2V0X3NoYXJlIC0gcHJlZF9wYXJ0ZV9jb211bgogICkKCiMgRXh0cmFlciBsb3MgZWZlY3RvcyBhbGVhdG9yaW9zIGVzdGltYWRvcyBwb3IgZWwgbW9kZWxvCmVmZWN0b3NfcmFuZG9tIDwtIHJhbmVmKHJhbmRvbSkKCmVmZWN0b3NfcmFuZG9tCgpgYGAKCmBgYHtyfQojIENyZWFyIGRhdG9zIHBhcmEgMjAyNgpudWV2b18yMDI2IDwtIGRhdGEuZnJhbWUoCiAgY2F0ZWdvcnkgPSBuYW1lcyhlZmVjdG9zX3JhbmRvbSksCiAgeWVhciA9IDIwMjYsCiAgdHJlbmQgPSAxNQopCgojIENvZWZpY2llbnRlcwpiZXRhMCA8LSBjb2VmKHJhbmRvbSlbIihJbnRlcmNlcHQpIl0KYmV0YTEgPC0gY29lZihyYW5kb20pWyJ0cmVuZCJdCgojIEluY29ycG9yYXIgbG9zIGVmZWN0b3MgYWxlYXRvcmlvcwpudWV2b18yMDI2JGVmZWN0b19yYW5kb20gPC0gYXMubnVtZXJpYyhlZmVjdG9zX3JhbmRvbSkKCiMgUHJlZGljY2nDs24gMjAyNgpudWV2b18yMDI2JG1hcmtldF9zaGFyZV8yMDI2IDwtCiAgYmV0YTAgKwogIGJldGExICogbnVldm9fMjAyNiR0cmVuZCArCiAgbnVldm9fMjAyNiRlZmVjdG9fcmFuZG9tCgpudWV2b18yMDI2CmBgYApgYGB7cn0KYWN0dWFsXzIwMjUgPC0gZGYyX21vZGVsICU+JQogIGZpbHRlcih5ZWFyID09IDIwMjUpICU+JQogIHNlbGVjdCgKICAgIGNhdGVnb3J5LAogICAgbWFya2V0X3NoYXJlXzIwMjUgPSBtYXJrZXRfc2hhcmUKICApCgpyZXN1bHRhZG9fZmluYWwgPC0gbnVldm9fMjAyNiAlPiUKICBzZWxlY3QoCiAgICBjYXRlZ29yeSwKICAgIG1hcmtldF9zaGFyZV8yMDI2CiAgKSAlPiUKICBsZWZ0X2pvaW4oYWN0dWFsXzIwMjUsIGJ5ID0gImNhdGVnb3J5IikgJT4lCiAgbXV0YXRlKAogICAgY2FtYmlvX3BwID0gbWFya2V0X3NoYXJlXzIwMjYgLSBtYXJrZXRfc2hhcmVfMjAyNQogICkgJT4lCiAgYXJyYW5nZShkZXNjKG1hcmtldF9zaGFyZV8yMDI2KSkKCnJlc3VsdGFkb19maW5hbApgYGAKI0NPTkNMVVNJw5NOOiBDb24gYmFzZSBlbiBsb3MgcmVzdWx0YWRvcyBkZWwgbW9kZWxvIGRlIGVmZWN0b3MgYWxlYXRvcmlvcywgSGFpciBDYXJlIHJlcHJlc2VudGEgbGEgYWx0ZXJuYXRpdmEgZGUgaW52ZXJzacOzbiBtw6FzIGF0cmFjdGl2YSBlbnRyZSBsYXMgc3ViY2F0ZWdvcsOtYXMgYW5hbGl6YWRhcyBkZSBCZWF1dHkgJiBQZXJzb25hbCBDYXJlIHBhcmEgMjAyNi4KI1BhcmEgMjAyNiwgSGFpciBDYXJlIHByZXNlbnRhIHVuYSBwYXJ0aWNpcGFjacOzbiBkZSBtZXJjYWRvIGVzdGltYWRhIGRlIDE5LjE3JSwgbG8gcXVlIGxhIHBvc2ljaW9uYSBjb21vIGxhIHNlZ3VuZGEgc3ViY2F0ZWdvcsOtYSBjb24gbWF5b3IgcGFydGljaXBhY2nDs24gcHJveWVjdGFkYSwgw7puaWNhbWVudGUgcG9yIGRlYmFqbyBkZSBTa2luIENhcmUsIGNvbiAyMS4zNiUuIEVzdG8gaW5kaWNhIHF1ZSBIYWlyIENhcmUgeWEgY3VlbnRhIGNvbiB1bmEgcHJlc2VuY2lhIGltcG9ydGFudGUgZGVudHJvIGRlbCBtZXJjYWRvIHRvdGFsIGRlIEJlYXV0eSAmIFBlcnNvbmFsIENhcmUsIHBvciBsbyBxdWUgdW5hIGludmVyc2nDs24gZW4gZXN0YSBjYXRlZ29yw61hIG5vIGRlcGVuZGVyw61hIGRlbCBjcmVjaW1pZW50byBkZSB1biBzZWdtZW50byBwZXF1ZcOxbyBvIHBvY28gY29uc29saWRhZG8sIHNpbm8gZGUgdW5hIGNhdGVnb3LDrWEgcXVlIGFjdHVhbG1lbnRlIHJlcHJlc2VudGEgdW5hIHByb3BvcmNpw7NuIHNpZ25pZmljYXRpdmEgZGVsIG1lcmNhZG8uCiNBZGVtw6FzLCBIYWlyIENhcmUgcHJlc2VudGEgZWwgbWF5b3IgaW5jcmVtZW50byBhYnNvbHV0byBlc3BlcmFkbyBlbiBwYXJ0aWNpcGFjacOzbiBkZSBtZXJjYWRvIGVudHJlIGxhcyBwcmluY2lwYWxlcyBzdWJjYXRlZ29yw61hcywgcGFzYW5kbyBkZSBhcHJveGltYWRhbWVudGUgMTcuOTUlIGVuIDIwMjUgYSAxOS4xNyUgZW4gMjAyNi4gRXN0byByZXByZXNlbnRhIHVuIGNyZWNpbWllbnRvIGRlIGFscmVkZWRvciBkZSAxLjIyIHB1bnRvcyBwb3JjZW50dWFsZXMuCgoKCiMgUGFydGUgMy4gQmFuY28gbXVuZGlhbAoKYGBge3J9CiMgb2J0ZW5lciBlc3BlcmFuemEgZGUgdmlkYSBkZSB2YXJpb3MgcGHDrXNlcwpsaWZlX2V4cGVjdGFuY3lfZGF0YSA8LSB3Yl9kYXRhKGNvdW50cnkgPSBjKCJNWCIsICJVUyIsICJDQSIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGljYXRvciA9ICJTUC5EWU4uTEUwMC5JTiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRfZGF0ZSA9IDE5NTAsZW5kX2RhdGUgPSAyMDI1KQoKYGBgCgpgYGB7cn0KIyBQcmVwYXJhciBkYXRvcwpsaWZlX2RhdGEgPC0gbGlmZV9leHBlY3RhbmN5X2RhdGEgJT4lCiAgdHJhbnNtdXRlKAogICAgY291bnRyeSA9IGNvdW50cnksCiAgICB5ZWFyID0gYXMuaW50ZWdlcihkYXRlKSwKICAgIGxpZmVfZXhwZWN0YW5jeSA9IFNQLkRZTi5MRTAwLklOCiAgKSAlPiUKICBmaWx0ZXIoIWlzLm5hKGxpZmVfZXhwZWN0YW5jeSkpICU+JQogIG11dGF0ZSgKICAgIHRyZW5kID0geWVhciAtIG1pbih5ZWFyKQogICkgJT4lCiAgYXJyYW5nZShjb3VudHJ5LCB5ZWFyKQoKaGVhZChsaWZlX2RhdGEpCgpsaWZlX3BhbmVsIDwtIHBkYXRhLmZyYW1lKAogIGxpZmVfZGF0YSwKICBpbmRleCA9IGMoImNvdW50cnkiLCAieWVhciIpCikKCnBkaW0obGlmZV9wYW5lbCkKaXMucGJhbGFuY2VkKGxpZmVfcGFuZWwpCmBgYAoKYGBge3J9CnBsb3RtZWFucygKICBsaWZlX2V4cGVjdGFuY3kgfiBjb3VudHJ5LAogIGRhdGEgPSBsaWZlX2RhdGEsCiAgeGxhYiA9ICJQYcOtcyIsCiAgeWxhYiA9ICJFc3BlcmFuemEgZGUgdmlkYSIKKQpgYGAKCmBgYHtyfQpnZ3Bsb3QoCiAgbGlmZV9kYXRhLAogIGFlcygKICAgIHggPSB5ZWFyLAogICAgeSA9IGxpZmVfZXhwZWN0YW5jeSwKICAgIGNvbG9yID0gY291bnRyeQogICkKKSArCiAgZ2VvbV9saW5lKGxpbmV3aWR0aCA9IDEpICsKICBsYWJzKAogICAgdGl0bGUgPSAiRXZvbHVjacOzbiBkZSBsYSBlc3BlcmFuemEgZGUgdmlkYSIsCiAgICB4ID0gIkHDsW8iLAogICAgeSA9ICJFc3BlcmFuemEgZGUgdmlkYSIsCiAgICBjb2xvciA9ICJQYcOtcyIKICApICsKICB0aGVtZV9taW5pbWFsKCkKYGBgCgpgYGB7cn0KI09wY2nDs24gMSAtIEVmZWN0b3MgYWdydXBhZG9zCnBvb2xlZF9saWZlIDwtIHBsbSgKICBsaWZlX2V4cGVjdGFuY3kgfiB0cmVuZCwKICBkYXRhID0gbGlmZV9wYW5lbCwKICBtb2RlbCA9ICJwb29saW5nIgopCgpzdW1tYXJ5KHBvb2xlZF9saWZlKQoKI09wY2nDs24gMiAtIEVmZWN0b3MgZmlqb3MKZml4ZWRfbGlmZSA8LSBwbG0oCiAgbGlmZV9leHBlY3RhbmN5IH4gdHJlbmQsCiAgZGF0YSA9IGxpZmVfcGFuZWwsCiAgbW9kZWwgPSAid2l0aGluIiwKICBlZmZlY3QgPSAiaW5kaXZpZHVhbCIKKQoKc3VtbWFyeShmaXhlZF9saWZlKQoKcHJ1ZWJhX2ZfbGlmZSA8LSBwRnRlc3QoCiAgZml4ZWRfbGlmZSwKICBwb29sZWRfbGlmZQopCgpwcnVlYmFfZl9saWZlCgoKI09wY2nDs24gMyAtIEVmZWN0b3MgYWxlYXRvcmlvcwpyYW5kb21fbGlmZSA8LSBwbG0oCiAgbGlmZV9leHBlY3RhbmN5IH4gdHJlbmQsCiAgZGF0YSA9IGxpZmVfcGFuZWwsCiAgbW9kZWwgPSAicmFuZG9tIiwKICBlZmZlY3QgPSAiaW5kaXZpZHVhbCIKKQoKc3VtbWFyeShyYW5kb21fbGlmZSkKCnBydWViYV9oYXVzbWFuX2xpZmUgPC0gcGh0ZXN0KAogIGZpeGVkX2xpZmUsCiAgcmFuZG9tX2xpZmUKKQoKcHJ1ZWJhX2hhdXNtYW5fbGlmZQoKYGBgCmBgYHtyfQojIEV4dHJhZXIgZWZlY3RvcyBhbGVhdG9yaW9zIHBvciBwYcOtcwplZmVjdG9zX2xpZmUgPC0gcmFuZWYocmFuZG9tX2xpZmUpCgplZmVjdG9zX2xpZmUKCiMgQ29lZmljaWVudGVzIGRlbCBtb2RlbG8gUmFuZG9tCmJldGEwIDwtIGNvZWYocmFuZG9tX2xpZmUpWyIoSW50ZXJjZXB0KSJdCmJldGExIDwtIGNvZWYocmFuZG9tX2xpZmUpWyJ0cmVuZCJdCgpiZXRhMApiZXRhMQoKIyBBw7FvIGluaWNpYWwgZGUgbGEgYmFzZQphbmlvX2luaWNpYWwgPC0gbWluKGxpZmVfZGF0YSR5ZWFyKQoKIyBDcmVhciBiYXNlIHBhcmEgcHJlZGljY2nDs24gMjAyNgpudWV2b18yMDI2X2xpZmUgPC0gZGF0YS5mcmFtZSgKICBjb3VudHJ5ID0gbmFtZXMoZWZlY3Rvc19saWZlKSwKICB5ZWFyID0gMjAyNiwKICB0cmVuZCA9IDIwMjYgLSBhbmlvX2luaWNpYWwsCiAgZWZlY3RvX3JhbmRvbSA9IGFzLm51bWVyaWMoZWZlY3Rvc19saWZlKQopCgpudWV2b18yMDI2X2xpZmUKCiMgUHJlZGljY2nDs24gZGUgZXNwZXJhbnphIGRlIHZpZGEgcGFyYSAyMDI2Cm51ZXZvXzIwMjZfbGlmZSA8LSBudWV2b18yMDI2X2xpZmUgJT4lCiAgbXV0YXRlKAogICAgbGlmZV9leHBlY3RhbmN5XzIwMjYgPQogICAgICBiZXRhMCArCiAgICAgIGJldGExICogdHJlbmQgKwogICAgICBlZmVjdG9fcmFuZG9tCiAgKQoKbnVldm9fMjAyNl9saWZlCgpyZXN1bHRhZG9fMjAyNl9saWZlIDwtIG51ZXZvXzIwMjZfbGlmZSAlPiUKICBzZWxlY3QoCiAgICBjb3VudHJ5LAogICAgbGlmZV9leHBlY3RhbmN5XzIwMjYKICApICU+JQogIGFycmFuZ2UoZGVzYyhsaWZlX2V4cGVjdGFuY3lfMjAyNikpCgpyZXN1bHRhZG9fMjAyNl9saWZlCgptYXgobGlmZV9kYXRhJHllYXIpCgp1bHRpbW9fYW5pbyA8LSBtYXgobGlmZV9kYXRhJHllYXIpCgphY3R1YWxfbGlmZSA8LSBsaWZlX2RhdGEgJT4lCiAgZmlsdGVyKHllYXIgPT0gdWx0aW1vX2FuaW8pICU+JQogIHNlbGVjdCgKICAgIGNvdW50cnksCiAgICBsaWZlX2V4cGVjdGFuY3lfYWN0dWFsID0gbGlmZV9leHBlY3RhbmN5CiAgKQoKcmVzdWx0YWRvX2ZpbmFsX2xpZmUgPC0gcmVzdWx0YWRvXzIwMjZfbGlmZSAlPiUKICBsZWZ0X2pvaW4oCiAgICBhY3R1YWxfbGlmZSwKICAgIGJ5ID0gImNvdW50cnkiCiAgKSAlPiUKICBtdXRhdGUoCiAgICBjYW1iaW8gPSBsaWZlX2V4cGVjdGFuY3lfMjAyNiAtCiAgICAgIGxpZmVfZXhwZWN0YW5jeV9hY3R1YWwKICApICU+JQogIGFycmFuZ2UoZGVzYyhsaWZlX2V4cGVjdGFuY3lfMjAyNikpCgpyZXN1bHRhZG9fZmluYWxfbGlmZQpgYGAKI0NPQ0xVU0nDk046IERlIGFjdWVyZG8gY29uIGVsIG1vZGVsbyBkZSBlZmVjdG9zIGFsZWF0b3Jpb3MsIENhbmFkw6EgcHJlc2VudGEgbGEgbWF5b3IgZXNwZXJhbnphIGRlIHZpZGEgZXN0aW1hZGEgcGFyYSAyMDI2LCBjb24gYXByb3hpbWFkYW1lbnRlIDg0Ljg3IGHDsW9zLCBzZWd1aWRvIHBvciBFc3RhZG9zIFVuaWRvcyBjb24gODIuNjIgYcOxb3MgeSBNw6l4aWNvIGNvbiA3NS4xNCBhw7Fvcy4gTG9zIHJlc3VsdGFkb3MgbXVlc3RyYW4gcXVlIGxhcyBkaWZlcmVuY2lhcyBlc3RydWN0dXJhbGVzIGVudHJlIGxvcyBwYcOtc2VzIHNlIG1hbnRlbmRyw61hbiwgY29uIHVuYSBicmVjaGEgcHJveWVjdGFkYSBkZSBhcHJveGltYWRhbWVudGUgOS43MyBhw7FvcyBlbnRyZSBDYW5hZMOhIHkgTcOpeGljbyB5IGRlIDcuNDggYcOxb3MgZW50cmUgRXN0YWRvcyBVbmlkb3MgeSBNw6l4aWNvLgoKCmBgYHtyfQpmaWxlIDwtICJBY3RpdmlkYWRfMV9wYXRlbnRlcy5SbWQiCgp4IDwtIHJlYWRMaW5lcygKICBmaWxlLAogIGVuY29kaW5nID0gIlVURi04IiwKICB3YXJuID0gRkFMU0UKKQpgYGAKCg==