1 Actividad 1. Análisis y aplicación de datos panel

1.0.1 Pregunta detonadora:

¿Qué factores afectan la probabilidad de tener una pareja?

  • Edad: numérico años
  • Hobbies: numérico cantidad
  • Trabajo: binaria
  • Salario: numérico cantidad
  • Índice de atractividad: numérico
  • Dating apps: numérico cantidad de apps donde está
    • ¿Qué app?: numérico categórico
  • Preferencia sexual: numérico categórico
  • Autoestima: numérico índice
  • Parejas anteriores: numérico cantidad

1.0.1.1 Modelo económico →

relación = f(edad, hobbies, trabajo, dinero, índice de atractividad, dating apps, preferencia sexual, autoestima

1.0.1.2 Modelo econométrico →

relación = B0+ (b1edad^2) + (b2hobbies) + (b3trabajo)+ (b4dinero)+(b5atractividad) +(b6 dating apps)+(b7preferencia sexual)+(b8 autoestima) +(b9que_app)+(b10parejas anteriores )+ mu

2 Tarea 1. Definición de Tipo de Datos

2.1 Datos Panel

Los datos panel son aquellos que contienen observaciones de múltiples unidades a lo largo del tiempo, es decir, que una unidad puede ser repetida puesto se observa en varios periodos de tiempo.1 Este tipo de datos permite analizar los datos de interés dentro de cada unidad a lo largo del tiempo.

2.2 Datos Transversales

Los datos transversales son observaciones de múltiples unidades, pero en un solo periodo de tiempo. Son útiles para realizar análisis descriptivos y comparativos.2

2.3 Datos Series de Tiempo

Los datos de series de tiempo tienen observaciones de una sola variable (o varias variables) en distintos periodos de tiempo, pero de manera regular y secuencial. Se pueden mencionar como aquellos datos que son recopilados de forma periódica en algún intérvalo de tiempo. 3

3 Indicadores del Banco Mundial

3.1 Tema 1 DATOS PANEL

3.1.1 Actividad 1

3.1.1.0.0.1 Obtener información de un país

Para obtener información directamente se puede buscar el indicador dentro de la página de indicadores del banco mundial y sacar el código que sale en el enlace de la página. Los códigos de 2 letras de los países estan en la ISO 3166-1.

Ejemplo de sacar indicador:

https://data.worldbank.org/indicator/NY.GDP.PCAP.CD?view=chart

El código del indicador es NY.GDP.PCAP.CD.

## Obtiene info de 1 país
gdp_data<- wb_data(country = "MX", indicator = "NY.GDP.PCAP.CD", start_date = 2013, end_date = 2023 )

kable(head(gdp_data)) %>% kable_classic_2()
iso2c iso3c country date NY.GDP.PCAP.CD unit obs_status footnote last_updated
MX MEX Mexico 2013 11317.491 NA NA NA 2024-02-21
MX MEX Mexico 2014 11490.022 NA NA NA 2024-02-21
MX MEX Mexico 2015 10098.173 NA NA NA 2024-02-21
MX MEX Mexico 2016 9152.737 NA NA NA 2024-02-21
MX MEX Mexico 2017 9693.330 NA NA NA 2024-02-21
MX MEX Mexico 2018 10130.321 NA NA NA 2024-02-21

Se generó la extracción de un indicador de PIB per cápita de México para los años de 2013 a 2023.

##Obtiene info de más países
gdp_data2<- wb_data(country = c("MX", "EC", "CA"), indicator = "NY.GDP.PCAP.CD", start_date = 2013, end_date = 2023 )

kable(head(gdp_data2)) %>% kable_classic()
iso2c iso3c country date NY.GDP.PCAP.CD unit obs_status footnote last_updated
CA CAN Canada 2013 52635.17 NA NA NA 2024-02-21
CA CAN Canada 2014 50956.00 NA NA NA 2024-02-21
CA CAN Canada 2015 43596.14 NA NA NA 2024-02-21
CA CAN Canada 2016 42315.60 NA NA NA 2024-02-21
CA CAN Canada 2017 45129.43 NA NA NA 2024-02-21
CA CAN Canada 2018 46548.64 NA NA NA 2024-02-21

Estos son datos de panel porque se tiene diferentes países en diferentes periodos de tiempo con la misma regularidad. Se tiene el mismo indicador de PIB per cápita de los mismos 10 años agregando a Ecuador y Canada.

3.1.1.0.0.2 Limpieza de información

Para tener solo la información necesaria.

panel<- gdp_data2 %>% select(country, date, NY.GDP.PCAP.CD)
kable(head(panel)) %>% kable_classic()
country date NY.GDP.PCAP.CD
Canada 2013 52635.17
Canada 2014 50956.00
Canada 2015 43596.14
Canada 2016 42315.60
Canada 2017 45129.43
Canada 2018 46548.64

4 Ejercicio 2. Conjunto de Datos Panel con Indicadores del Banco Central

4.0.0.0.0.1 Extraccion de datos

Variable endógena:

Parámetros:

panel_salud<- wb_data(country = c("MX", "CA", "US", "CH", "CO","CN" ), indicator =c("SP.DYN.LE00.IN", 
                                                                  "EN.ATM.CO2E.PC",
                                                                  "IE.PPI.WATR.CD", 
                                                                  "NY.GDP.PCAP.CD", 
                                                                  "EN.POP.DNST", 
                                                                  "SH.MED.BEDS.ZS",
                                                                  "SH.IMM.IDPT",
                                                                  "SH.MED.SAOP.P5", 
                                                                  "VC.IHR.PSRC.P5",
                                                                  "EN.POP.SLUM.UR.ZS"), start_date =1950 , end_date=2023)
panel_salud<-subset(panel_salud, date==1990| date==2000 | date==2010| date==2020)
panel_salud<- pdata.frame(panel_salud, index = c("country", "date"))
kable(head(panel_salud)) %>% kable_classic()
iso2c iso3c country date EN.ATM.CO2E.PC EN.POP.DNST EN.POP.SLUM.UR.ZS IE.PPI.WATR.CD NY.GDP.PCAP.CD SH.IMM.IDPT SH.MED.BEDS.ZS SH.MED.SAOP.P5 SP.DYN.LE00.IN VC.IHR.PSRC.P5
CA CAN Canada 1990 15.148969 3.088602 NA NA 21525.8611 88 6.00 NA 77.43659 2.375511
CA CAN Canada 2000 16.757467 3.422611 NA NA 24271.0021 89 3.77 NA 79.16683 1.779469
CA CAN Canada 2010 15.794538 3.792822 NA NA 47562.0834 89 2.78 NA 81.32220 1.640000
CA CAN Canada 2020 13.599375 4.239226 NA NA 43562.4358 92 NA NA 81.67049 2.003236
CN CHN China 1990 1.914546 120.915506 NA NA 347.5784 97 2.58 NA 68.00500 NA
CN CHN China 2000 2.650409 134.492481 NA 72400000 959.3604 85 1.68 NA 71.88100 NA
4.0.0.0.0.2 Visualización de Nulos

La verificación de NAs dentro de los datos se llama Panel Balanceado. En este caso se puede observar que se cuentan con gran pérdida de datos en algunos de los indicadores. La decisión a tomar es elimiar aquellas columnas que tienen un gran porcentaje de valores nulos para imputar aquellos que tengan un porcentaje de valores perdidos menor o igual al 10%.

vis_miss(panel_salud)

4.0.0.0.0.3 Delimitación de variables a utilizar
panel_salud<-panel_salud %>% select(-c(iso2c, iso3c,EN.ATM.CO2E.PC, EN.POP.SLUM.UR.ZS,IE.PPI.WATR.CD, SH.MED.BEDS.ZS, SH.MED.SAOP.P5))
kable(head(panel_salud)) %>% kable_classic()
country date EN.POP.DNST NY.GDP.PCAP.CD SH.IMM.IDPT SP.DYN.LE00.IN VC.IHR.PSRC.P5
Canada 1990 3.088602 21525.8611 88 77.43659 2.375511
Canada 2000 3.422611 24271.0021 89 79.16683 1.779469
Canada 2010 3.792822 47562.0834 89 81.32220 1.640000
Canada 2020 4.239226 43562.4358 92 81.67049 2.003236
China 1990 120.915506 347.5784 97 68.00500 NA
China 2000 134.492481 959.3604 85 71.88100 NA
4.0.0.0.0.4 Visualización de Nulos
vis_miss(panel_salud)

4.0.0.0.0.5 Imputación de datos
#panel_salud<- panel_salud %>% mice(m=5, method="pmm", maxit = 10)

panel_salud<- complete(panel_salud)
vis_miss(panel_salud)

Después de la imputación de los datos se puede observar como es que para todos los indicadores seleccionados ya no cuentan con valores nulos, se tiene el 100% de los valores presentes.

5 Tarea 2. Gráficas de heterogeneidad

5.0.0.1 Visualización de heterogeneidad

plotmeans(SP.DYN.LE00.IN ~ country, data = panel_salud, n.label=FALSE, main= "Heterogeneidad entre países")

La línea que une los promedios no se mantiene constante a lo largo de las diferentes observaciones de los países. Por consiguiente, se puede decir que la gráfica tiene diferentes picos donde los intervalos de confianza tampoco se presentan dentro de un mismo rango, se ve una variación muy grande entre los promedios de los países, presentando una variabilidad inconsistente. De esta manera es que de forma visual se presenta heterogeneidad, diferencia significativa en las medias o dispersión entre los grupos.

En términos de países sí es deseable que se pueda contar con heterogeneidad entre para poder contar con una forma de comparación entre los grupos.

plotmeans(SP.DYN.LE00.IN ~ date, data = panel_salud, n.label=FALSE, main= "Heterogeneidad entre años")

En términos de los años, se puede observar que si tiene picos pero de una manera un poco más consistente entre las décadas. Los intervalos de confianza también varían entre las décadas aunque no en gran manera. En el mismo caso como entre países, los años presentan heterogeneidad.

6 Ejercicio 3. Modelos con Indicadores del Banco Mundial

Siguiendo con la información presentada en los pasos anteriores, se seguirá trabajando con el modelamiento de una regresión para predecir la esperanza de vida en años en diferentes países a base de diferentes indicadores de diferentes índoles como económicos, de salud y de población.

6.1 Modelado

6.1.1 1. Regresión agrupado (pooled)

pooled<- plm(SP.DYN.LE00.IN ~ EN.POP.DNST+
              NY.GDP.PCAP.CD+
              SH.IMM.IDPT+
              VC.IHR.PSRC.P5, 
             data = panel_salud, 
             model = "pooling")


summary(pooled)
## Pooling Model
## 
## Call:
## plm(formula = SP.DYN.LE00.IN ~ EN.POP.DNST + NY.GDP.PCAP.CD + 
##     SH.IMM.IDPT + VC.IHR.PSRC.P5, data = panel_salud, model = "pooling")
## 
## Unbalanced Panel: n = 6, T = 2-4, N = 22
## 
## Residuals:
##      Min.   1st Qu.    Median   3rd Qu.      Max. 
## -3.411991 -1.047104 -0.024523  1.241106  2.598083 
## 
## Coefficients:
##                   Estimate  Std. Error t-value  Pr(>|t|)    
## (Intercept)     6.6229e+01  3.9377e+00 16.8190 4.971e-12 ***
## EN.POP.DNST    -2.4460e-03  6.4382e-03 -0.3799 0.7087152    
## NY.GDP.PCAP.CD  8.1505e-05  2.0245e-05  4.0260 0.0008764 ***
## SH.IMM.IDPT     1.0276e-01  4.3969e-02  2.3371 0.0319280 *  
## VC.IHR.PSRC.P5 -7.5102e-02  2.3553e-02 -3.1886 0.0053773 ** 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Total Sum of Squares:    343.78
## Residual Sum of Squares: 57.636
## R-Squared:      0.83234
## Adj. R-Squared: 0.79289
## F-statistic: 21.0994 on 4 and 17 DF, p-value: 2.0641e-06

En este modelo se puede observar como es que el PIB per cápita, la cantidad de niños que son vacunados y el índice de homicidios intencionales, son significativos para predecir la esperanza de vida en años. Estas variables son significativas al menos con un 95% de nivel de confianza, el modelo como tal explica (de manera ajustada) el 79.28% de la varianza de los datos.

6.1.2 2. Efectos Fijos (within)

within<- plm(SP.DYN.LE00.IN ~ EN.POP.DNST+
              NY.GDP.PCAP.CD+
              SH.IMM.IDPT+
              VC.IHR.PSRC.P5, 
             data = panel_salud, 
             model = "within")


summary(within)
## Oneway (individual) effect Within Model
## 
## Call:
## plm(formula = SP.DYN.LE00.IN ~ EN.POP.DNST + NY.GDP.PCAP.CD + 
##     SH.IMM.IDPT + VC.IHR.PSRC.P5, data = panel_salud, model = "within")
## 
## Unbalanced Panel: n = 6, T = 2-4, N = 22
## 
## Residuals:
##     Min.  1st Qu.   Median  3rd Qu.     Max. 
## -1.43966 -0.80116  0.18810  0.82978  1.25760 
## 
## Coefficients:
##                   Estimate  Std. Error t-value Pr(>|t|)   
## EN.POP.DNST     2.7849e-02  4.0410e-02  0.6891 0.503842   
## NY.GDP.PCAP.CD  7.0917e-05  2.9678e-05  2.3896 0.034163 * 
## SH.IMM.IDPT     7.3990e-02  3.1809e-02  2.3261 0.038342 * 
## VC.IHR.PSRC.P5 -9.8453e-02  2.6217e-02 -3.7553 0.002745 **
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Total Sum of Squares:    83.675
## Residual Sum of Squares: 15.62
## R-Squared:      0.81332
## Adj. R-Squared: 0.67331
## F-statistic: 13.0705 on 4 and 12 DF, p-value: 0.00024884

Para el caso de within, se puede observar como es que se tienen 3 variables significativas para poder pronosticar la esperanza de vida en años, en específico el PIB per cápita, el índicde de niños que estan vacunados y el índice de homicidios intencionados. Presenta un buen modelo aunque podría tener mejor desempeño.

6.1.3 Prueba PF

pFtest(within, pooled)
## 
##  F test for individual effects
## 
## data:  SP.DYN.LE00.IN ~ EN.POP.DNST + NY.GDP.PCAP.CD + SH.IMM.IDPT +  ...
## F = 6.4557, df1 = 5, df2 = 12, p-value = 0.003911
## alternative hypothesis: significant effects

Cuando aparece como alternative hypothesis: significant effects se tiene que escoger el mejor modelo de los dos puesto que uno tiene mejor comportamiento que el otro. Si tuviera non-significan effects puedo utilizar ambos modelos sin tema. Por esta razón, es que en este caso sabemos que hay un mejor modelo entre los dos propuestos, y basando la decisión en las métricas presentadas se selecciona el modelo pooled.

6.2 3. Modelo aleatorio (random)

6.2.1 Walhus

walhus<- plm(SP.DYN.LE00.IN ~ EN.POP.DNST+
              NY.GDP.PCAP.CD+
              SH.IMM.IDPT+
              VC.IHR.PSRC.P5, 
             data = panel_salud, 
             model = "random",
             random.method = "walhus")


summary(walhus)
## Oneway (individual) effect Random Effect Model 
##    (Wallace-Hussain's transformation)
## 
## Call:
## plm(formula = SP.DYN.LE00.IN ~ EN.POP.DNST + NY.GDP.PCAP.CD + 
##     SH.IMM.IDPT + VC.IHR.PSRC.P5, data = panel_salud, model = "random", 
##     random.method = "walhus")
## 
## Unbalanced Panel: n = 6, T = 2-4, N = 22
## 
## Effects:
##                  var std.dev share
## idiosyncratic 0.4819  0.6942 0.079
## individual    5.6497  2.3769 0.921
## theta:
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##  0.7977  0.8555  0.8555  0.8503  0.8555  0.8555 
## 
## Residuals:
##     Min.  1st Qu.   Median     Mean  3rd Qu.     Max. 
## -1.80052 -0.83627  0.04402  0.00284  0.81264  1.52288 
## 
## Coefficients:
##                   Estimate  Std. Error z-value  Pr(>|z|)    
## (Intercept)     6.8238e+01  3.0340e+00 22.4911 < 2.2e-16 ***
## EN.POP.DNST     5.4896e-03  1.8827e-02  0.2916  0.770611    
## NY.GDP.PCAP.CD  8.1656e-05  2.0252e-05  4.0320 5.530e-05 ***
## SH.IMM.IDPT     7.7236e-02  2.7720e-02  2.7863  0.005331 ** 
## VC.IHR.PSRC.P5 -9.8181e-02  2.2256e-02 -4.4113 1.027e-05 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Total Sum of Squares:    126.08
## Residual Sum of Squares: 17.175
## R-Squared:      0.86381
## Adj. R-Squared: 0.83176
## Chisq: 71.2043 on 4 DF, p-value: 1.2639e-14

Para el modelo Walhus se puede observar como es que se tiene que PIB per cápita y el índice de homicidios intencionales son las únicas variables significativas para poder predecir la esperanza de vida en años, estas dos variables con un índice de confianza del 99%. El modelo tiene una explicación del 68.82% de la varianza de los datos, lo cual podría decir que no sería el mejor modelo para realizar una predicción per tampoco sería el peor.

6.2.1.0.0.1 Amemiya
amemiya<- plm(SP.DYN.LE00.IN ~ EN.POP.DNST+
              NY.GDP.PCAP.CD+
              SH.IMM.IDPT+
              VC.IHR.PSRC.P5, 
             data = panel_salud, 
             model = "random",
             random.method = "amemiya")


summary(amemiya)
## Oneway (individual) effect Random Effect Model 
##    (Amemiya's transformation)
## 
## Call:
## plm(formula = SP.DYN.LE00.IN ~ EN.POP.DNST + NY.GDP.PCAP.CD + 
##     SH.IMM.IDPT + VC.IHR.PSRC.P5, data = panel_salud, model = "random", 
##     random.method = "amemiya")
## 
## Unbalanced Panel: n = 6, T = 2-4, N = 22
## 
## Effects:
##                 var std.dev share
## idiosyncratic 1.302   1.141     1
## individual    0.000   0.000     0
## theta:
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##       0       0       0       0       0       0 
## 
## Residuals:
##      Min.   1st Qu.    Median   3rd Qu.      Max. 
## -3.411991 -1.047104 -0.024523  1.241106  2.598083 
## 
## Coefficients:
##                   Estimate  Std. Error z-value  Pr(>|z|)    
## (Intercept)     6.6229e+01  3.9377e+00 16.8190 < 2.2e-16 ***
## EN.POP.DNST    -2.4460e-03  6.4382e-03 -0.3799  0.704011    
## NY.GDP.PCAP.CD  8.1505e-05  2.0245e-05  4.0260 5.673e-05 ***
## SH.IMM.IDPT     1.0276e-01  4.3969e-02  2.3371  0.019435 *  
## VC.IHR.PSRC.P5 -7.5102e-02  2.3553e-02 -3.1886  0.001429 ** 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Total Sum of Squares:    343.78
## Residual Sum of Squares: 57.636
## R-Squared:      0.83234
## Adj. R-Squared: 0.79289
## Chisq: 84.3975 on 4 DF, p-value: < 2.22e-16

En el caso de amemiya se cuenta con un un comportamiento similar, se tiene como es que el PIB per cápita y el índice de homicidios intencionales son variables significativas para la predicción o pronóstico de la esperanza de vida en años aunque con un menor índice de confianza en el PIB per cápita. El modelo explica solo el 61.47% de la varianza de los datos.

6.2.1.0.0.2 Nerlove
nerlove<- plm(SP.DYN.LE00.IN ~ EN.POP.DNST+
              NY.GDP.PCAP.CD+
              SH.IMM.IDPT+
              VC.IHR.PSRC.P5, 
             data = panel_salud, 
             model = "random",
             random.method = "nerlove")


summary(nerlove)
## Oneway (individual) effect Random Effect Model 
##    (Nerlove's transformation)
## 
## Call:
## plm(formula = SP.DYN.LE00.IN ~ EN.POP.DNST + NY.GDP.PCAP.CD + 
##     SH.IMM.IDPT + VC.IHR.PSRC.P5, data = panel_salud, model = "random", 
##     random.method = "nerlove")
## 
## Unbalanced Panel: n = 6, T = 2-4, N = 22
## 
## Effects:
##                  var std.dev share
## idiosyncratic 0.7100  0.8426 0.087
## individual    7.4068  2.7215 0.913
## theta:
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##  0.7861  0.8470  0.8470  0.8415  0.8470  0.8470 
## 
## Residuals:
##     Min.  1st Qu.   Median     Mean  3rd Qu.     Max. 
## -1.82177 -0.85026  0.03870  0.00259  0.79928  1.53245 
## 
## Coefficients:
##                   Estimate  Std. Error z-value  Pr(>|z|)    
## (Intercept)     6.8265e+01  2.9941e+00 22.8001 < 2.2e-16 ***
## EN.POP.DNST     4.8131e-03  1.8138e-02  0.2654  0.790730    
## NY.GDP.PCAP.CD  8.1902e-05  2.0083e-05  4.0782 4.538e-05 ***
## SH.IMM.IDPT     7.7416e-02  2.7808e-02  2.7839  0.005371 ** 
## VC.IHR.PSRC.P5 -9.8006e-02  2.2260e-02 -4.4028 1.069e-05 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Total Sum of Squares:    130.85
## Residual Sum of Squares: 17.311
## R-Squared:      0.86774
## Adj. R-Squared: 0.83661
## Chisq: 71.1581 on 4 DF, p-value: 1.2926e-14

Dentro del modelo de Nerlove, las variables significativas para pronosticar la esperanza de vida en años se incrementa pero disminuyendo su nivel de confianza, se presentan como significativas el PIB per cápita del país así como la densidad de población (ambas con un 90% de nivel de confianza), y el índice de homicidios intencionales con un 99% de confianza. En cuanto al desempeño del modelo se puede observar como es que el 62.51% de la varianza de los datos si está siendo explicada por el modelo.

6.3 Prueba Hausman

phtest(nerlove, pooled)
## 
##  Hausman Test
## 
## data:  SP.DYN.LE00.IN ~ EN.POP.DNST + NY.GDP.PCAP.CD + SH.IMM.IDPT +  ...
## chisq = 1.3586, df = 4, p-value = 0.8514
## alternative hypothesis: one model is inconsistent

Este test dice que entre los dos modelos evaluados se tienen inconsistencias entre el desempeño, entonces es neceario escoger uno de los demás. De ambos modelos (fijos y aleatorios)0se selecciona elmodelo aleatorio de nerlove puesto que cuenta con mejores métricas de explicación de la varianza.

7 Tarea 3. Patentes

Para este ejercicio se presenta una base de datos que incluye diferentes empresas en distintos periodos de tiempo (lo cual permite tener datos panel) con datos demográficos y financieros de las empresas para determinar la cantidad de patentes aprobadas.

Descripción de las variables

  • cusip: firm identifier

  • merger: =1 if major merger 

- employ: employees in 1000s 

- return: return on stock, % 

- patents: patents applied for 

- patentsg: patents granted 

- stckpr: price common stock 

- rnd: R&D expend, current mill $ 

- rndeflt: R&D expend, 1972 mill $ 

- rndstck: stock of R&D 

- sales: sales, current mill. $ 

- sic: 4 digit industry 

- year: 72 through 81 

7.0.0.1 Carga de datos

patents<- read.csv("C:/Users/Astrid Gonzalez/Documents/UNIVERSIDAD/OCTAVO/PATENT 3.csv")
patents<- patents[,1:13]
kable(head(patents)) %>% kable_classic()
cusip merger employ return patents patentsg stckpr rnd rndeflt rndstck sales sic year
800 0 10 6 22 24 48 3 3 16 344 3740 2012
800 0 12 6 34 32 58 3 3 17 436 3740 2013
800 0 12 4 31 30 33 3 3 20 535 3740 2014
800 0 12 5 32 34 38 3 3 22 567 3740 2015
800 0 13 5 40 28 35 4 3 23 631 3740 2016
800 0 13 5 60 33 34 4 3 25 706 3740 2017
patents<- pdata.frame(patents, index = c("cusip", "year"))
str(patents)
## Classes 'pdata.frame' and 'data.frame':  2260 obs. of  13 variables:
##  $ cusip   : Factor w/ 226 levels "800","4626","4671",..: 1 1 1 1 1 1 1 1 1 1 ...
##   ..- attr(*, "names")= chr [1:2260] "800-2012" "800-2013" "800-2014" "800-2015" ...
##   ..- attr(*, "index")=Classes 'pindex' and 'data.frame':    2260 obs. of  2 variables:
##   .. ..$ cusip: Factor w/ 226 levels "800","4626","4671",..: 1 1 1 1 1 1 1 1 1 1 ...
##   .. ..$ year : Factor w/ 10 levels "2012","2013",..: 1 2 3 4 5 6 7 8 9 10 ...
##  $ merger  : 'pseries' Named int  0 0 0 0 0 0 0 0 0 0 ...
##   ..- attr(*, "names")= chr [1:2260] "800-2012" "800-2013" "800-2014" "800-2015" ...
##   ..- attr(*, "index")=Classes 'pindex' and 'data.frame':    2260 obs. of  2 variables:
##   .. ..$ cusip: Factor w/ 226 levels "800","4626","4671",..: 1 1 1 1 1 1 1 1 1 1 ...
##   .. ..$ year : Factor w/ 10 levels "2012","2013",..: 1 2 3 4 5 6 7 8 9 10 ...
##  $ employ  : 'pseries' Named int  10 12 12 12 13 13 14 14 13 12 ...
##   ..- attr(*, "names")= chr [1:2260] "800-2012" "800-2013" "800-2014" "800-2015" ...
##   ..- attr(*, "index")=Classes 'pindex' and 'data.frame':    2260 obs. of  2 variables:
##   .. ..$ cusip: Factor w/ 226 levels "800","4626","4671",..: 1 1 1 1 1 1 1 1 1 1 ...
##   .. ..$ year : Factor w/ 10 levels "2012","2013",..: 1 2 3 4 5 6 7 8 9 10 ...
##  $ return  : 'pseries' Named int  6 6 4 5 5 5 5 5 4 5 ...
##   ..- attr(*, "names")= chr [1:2260] "800-2012" "800-2013" "800-2014" "800-2015" ...
##   ..- attr(*, "index")=Classes 'pindex' and 'data.frame':    2260 obs. of  2 variables:
##   .. ..$ cusip: Factor w/ 226 levels "800","4626","4671",..: 1 1 1 1 1 1 1 1 1 1 ...
##   .. ..$ year : Factor w/ 10 levels "2012","2013",..: 1 2 3 4 5 6 7 8 9 10 ...
##  $ patents : 'pseries' Named int  22 34 31 32 40 60 57 77 38 5 ...
##   ..- attr(*, "names")= chr [1:2260] "800-2012" "800-2013" "800-2014" "800-2015" ...
##   ..- attr(*, "index")=Classes 'pindex' and 'data.frame':    2260 obs. of  2 variables:
##   .. ..$ cusip: Factor w/ 226 levels "800","4626","4671",..: 1 1 1 1 1 1 1 1 1 1 ...
##   .. ..$ year : Factor w/ 10 levels "2012","2013",..: 1 2 3 4 5 6 7 8 9 10 ...
##  $ patentsg: 'pseries' Named int  24 32 30 34 28 33 53 47 64 70 ...
##   ..- attr(*, "names")= chr [1:2260] "800-2012" "800-2013" "800-2014" "800-2015" ...
##   ..- attr(*, "index")=Classes 'pindex' and 'data.frame':    2260 obs. of  2 variables:
##   .. ..$ cusip: Factor w/ 226 levels "800","4626","4671",..: 1 1 1 1 1 1 1 1 1 1 ...
##   .. ..$ year : Factor w/ 10 levels "2012","2013",..: 1 2 3 4 5 6 7 8 9 10 ...
##  $ stckpr  : 'pseries' Named int  48 58 33 38 35 34 31 34 46 41 ...
##   ..- attr(*, "names")= chr [1:2260] "800-2012" "800-2013" "800-2014" "800-2015" ...
##   ..- attr(*, "index")=Classes 'pindex' and 'data.frame':    2260 obs. of  2 variables:
##   .. ..$ cusip: Factor w/ 226 levels "800","4626","4671",..: 1 1 1 1 1 1 1 1 1 1 ...
##   .. ..$ year : Factor w/ 10 levels "2012","2013",..: 1 2 3 4 5 6 7 8 9 10 ...
##  $ rnd     : 'pseries' Named int  3 3 3 3 4 4 5 5 7 8 ...
##   ..- attr(*, "names")= chr [1:2260] "800-2012" "800-2013" "800-2014" "800-2015" ...
##   ..- attr(*, "index")=Classes 'pindex' and 'data.frame':    2260 obs. of  2 variables:
##   .. ..$ cusip: Factor w/ 226 levels "800","4626","4671",..: 1 1 1 1 1 1 1 1 1 1 ...
##   .. ..$ year : Factor w/ 10 levels "2012","2013",..: 1 2 3 4 5 6 7 8 9 10 ...
##  $ rndeflt : 'pseries' Named int  3 3 3 3 3 3 3 3 4 4 ...
##   ..- attr(*, "names")= chr [1:2260] "800-2012" "800-2013" "800-2014" "800-2015" ...
##   ..- attr(*, "index")=Classes 'pindex' and 'data.frame':    2260 obs. of  2 variables:
##   .. ..$ cusip: Factor w/ 226 levels "800","4626","4671",..: 1 1 1 1 1 1 1 1 1 1 ...
##   .. ..$ year : Factor w/ 10 levels "2012","2013",..: 1 2 3 4 5 6 7 8 9 10 ...
##  $ rndstck : 'pseries' Named int  16 17 20 22 23 25 27 30 34 38 ...
##   ..- attr(*, "names")= chr [1:2260] "800-2012" "800-2013" "800-2014" "800-2015" ...
##   ..- attr(*, "index")=Classes 'pindex' and 'data.frame':    2260 obs. of  2 variables:
##   .. ..$ cusip: Factor w/ 226 levels "800","4626","4671",..: 1 1 1 1 1 1 1 1 1 1 ...
##   .. ..$ year : Factor w/ 10 levels "2012","2013",..: 1 2 3 4 5 6 7 8 9 10 ...
##  $ sales   : 'pseries' Named int  344 436 535 567 631 706 819 992 1045 939 ...
##   ..- attr(*, "names")= chr [1:2260] "800-2012" "800-2013" "800-2014" "800-2015" ...
##   ..- attr(*, "index")=Classes 'pindex' and 'data.frame':    2260 obs. of  2 variables:
##   .. ..$ cusip: Factor w/ 226 levels "800","4626","4671",..: 1 1 1 1 1 1 1 1 1 1 ...
##   .. ..$ year : Factor w/ 10 levels "2012","2013",..: 1 2 3 4 5 6 7 8 9 10 ...
##  $ sic     : 'pseries' Named int  3740 3740 3740 3740 3740 3740 3740 3740 3740 3740 ...
##   ..- attr(*, "names")= chr [1:2260] "800-2012" "800-2013" "800-2014" "800-2015" ...
##   ..- attr(*, "index")=Classes 'pindex' and 'data.frame':    2260 obs. of  2 variables:
##   .. ..$ cusip: Factor w/ 226 levels "800","4626","4671",..: 1 1 1 1 1 1 1 1 1 1 ...
##   .. ..$ year : Factor w/ 10 levels "2012","2013",..: 1 2 3 4 5 6 7 8 9 10 ...
##  $ year    : Factor w/ 10 levels "2012","2013",..: 1 2 3 4 5 6 7 8 9 10 ...
##   ..- attr(*, "names")= chr [1:2260] "800-2012" "800-2013" "800-2014" "800-2015" ...
##   ..- attr(*, "index")=Classes 'pindex' and 'data.frame':    2260 obs. of  2 variables:
##   .. ..$ cusip: Factor w/ 226 levels "800","4626","4671",..: 1 1 1 1 1 1 1 1 1 1 ...
##   .. ..$ year : Factor w/ 10 levels "2012","2013",..: 1 2 3 4 5 6 7 8 9 10 ...
##  - attr(*, "index")=Classes 'pindex' and 'data.frame':   2260 obs. of  2 variables:
##   ..$ cusip: Factor w/ 226 levels "800","4626","4671",..: 1 1 1 1 1 1 1 1 1 1 ...
##   ..$ year : Factor w/ 10 levels "2012","2013",..: 1 2 3 4 5 6 7 8 9 10 ...

7.0.0.2 Transformación de variables

patents$year<- as.factor(patents$year)
patents$sic <- as.factor(patents$sic)
patents$merger<- as.factor(patents$merger)
patents$cusip<- as.factor(patents$cusip)

str(patents)
## Classes 'pdata.frame' and 'data.frame':  2260 obs. of  13 variables:
##  $ cusip   : Factor w/ 226 levels "800","4626","4671",..: 1 1 1 1 1 1 1 1 1 1 ...
##   ..- attr(*, "names")= chr [1:2260] "800-2012" "800-2013" "800-2014" "800-2015" ...
##   ..- attr(*, "index")=Classes 'pindex' and 'data.frame':    2260 obs. of  2 variables:
##   .. ..$ cusip: Factor w/ 226 levels "800","4626","4671",..: 1 1 1 1 1 1 1 1 1 1 ...
##   .. ..$ year : Factor w/ 10 levels "2012","2013",..: 1 2 3 4 5 6 7 8 9 10 ...
##  $ merger  : Factor w/ 2 levels "0","1": 1 1 1 1 1 1 1 1 1 1 ...
##   ..- attr(*, "names")= chr [1:2260] "800-2012" "800-2013" "800-2014" "800-2015" ...
##   ..- attr(*, "index")=Classes 'pindex' and 'data.frame':    2260 obs. of  2 variables:
##   .. ..$ cusip: Factor w/ 226 levels "800","4626","4671",..: 1 1 1 1 1 1 1 1 1 1 ...
##   .. ..$ year : Factor w/ 10 levels "2012","2013",..: 1 2 3 4 5 6 7 8 9 10 ...
##  $ employ  : 'pseries' Named int  10 12 12 12 13 13 14 14 13 12 ...
##   ..- attr(*, "names")= chr [1:2260] "800-2012" "800-2013" "800-2014" "800-2015" ...
##   ..- attr(*, "index")=Classes 'pindex' and 'data.frame':    2260 obs. of  2 variables:
##   .. ..$ cusip: Factor w/ 226 levels "800","4626","4671",..: 1 1 1 1 1 1 1 1 1 1 ...
##   .. ..$ year : Factor w/ 10 levels "2012","2013",..: 1 2 3 4 5 6 7 8 9 10 ...
##  $ return  : 'pseries' Named int  6 6 4 5 5 5 5 5 4 5 ...
##   ..- attr(*, "names")= chr [1:2260] "800-2012" "800-2013" "800-2014" "800-2015" ...
##   ..- attr(*, "index")=Classes 'pindex' and 'data.frame':    2260 obs. of  2 variables:
##   .. ..$ cusip: Factor w/ 226 levels "800","4626","4671",..: 1 1 1 1 1 1 1 1 1 1 ...
##   .. ..$ year : Factor w/ 10 levels "2012","2013",..: 1 2 3 4 5 6 7 8 9 10 ...
##  $ patents : 'pseries' Named int  22 34 31 32 40 60 57 77 38 5 ...
##   ..- attr(*, "names")= chr [1:2260] "800-2012" "800-2013" "800-2014" "800-2015" ...
##   ..- attr(*, "index")=Classes 'pindex' and 'data.frame':    2260 obs. of  2 variables:
##   .. ..$ cusip: Factor w/ 226 levels "800","4626","4671",..: 1 1 1 1 1 1 1 1 1 1 ...
##   .. ..$ year : Factor w/ 10 levels "2012","2013",..: 1 2 3 4 5 6 7 8 9 10 ...
##  $ patentsg: 'pseries' Named int  24 32 30 34 28 33 53 47 64 70 ...
##   ..- attr(*, "names")= chr [1:2260] "800-2012" "800-2013" "800-2014" "800-2015" ...
##   ..- attr(*, "index")=Classes 'pindex' and 'data.frame':    2260 obs. of  2 variables:
##   .. ..$ cusip: Factor w/ 226 levels "800","4626","4671",..: 1 1 1 1 1 1 1 1 1 1 ...
##   .. ..$ year : Factor w/ 10 levels "2012","2013",..: 1 2 3 4 5 6 7 8 9 10 ...
##  $ stckpr  : 'pseries' Named int  48 58 33 38 35 34 31 34 46 41 ...
##   ..- attr(*, "names")= chr [1:2260] "800-2012" "800-2013" "800-2014" "800-2015" ...
##   ..- attr(*, "index")=Classes 'pindex' and 'data.frame':    2260 obs. of  2 variables:
##   .. ..$ cusip: Factor w/ 226 levels "800","4626","4671",..: 1 1 1 1 1 1 1 1 1 1 ...
##   .. ..$ year : Factor w/ 10 levels "2012","2013",..: 1 2 3 4 5 6 7 8 9 10 ...
##  $ rnd     : 'pseries' Named int  3 3 3 3 4 4 5 5 7 8 ...
##   ..- attr(*, "names")= chr [1:2260] "800-2012" "800-2013" "800-2014" "800-2015" ...
##   ..- attr(*, "index")=Classes 'pindex' and 'data.frame':    2260 obs. of  2 variables:
##   .. ..$ cusip: Factor w/ 226 levels "800","4626","4671",..: 1 1 1 1 1 1 1 1 1 1 ...
##   .. ..$ year : Factor w/ 10 levels "2012","2013",..: 1 2 3 4 5 6 7 8 9 10 ...
##  $ rndeflt : 'pseries' Named int  3 3 3 3 3 3 3 3 4 4 ...
##   ..- attr(*, "names")= chr [1:2260] "800-2012" "800-2013" "800-2014" "800-2015" ...
##   ..- attr(*, "index")=Classes 'pindex' and 'data.frame':    2260 obs. of  2 variables:
##   .. ..$ cusip: Factor w/ 226 levels "800","4626","4671",..: 1 1 1 1 1 1 1 1 1 1 ...
##   .. ..$ year : Factor w/ 10 levels "2012","2013",..: 1 2 3 4 5 6 7 8 9 10 ...
##  $ rndstck : 'pseries' Named int  16 17 20 22 23 25 27 30 34 38 ...
##   ..- attr(*, "names")= chr [1:2260] "800-2012" "800-2013" "800-2014" "800-2015" ...
##   ..- attr(*, "index")=Classes 'pindex' and 'data.frame':    2260 obs. of  2 variables:
##   .. ..$ cusip: Factor w/ 226 levels "800","4626","4671",..: 1 1 1 1 1 1 1 1 1 1 ...
##   .. ..$ year : Factor w/ 10 levels "2012","2013",..: 1 2 3 4 5 6 7 8 9 10 ...
##  $ sales   : 'pseries' Named int  344 436 535 567 631 706 819 992 1045 939 ...
##   ..- attr(*, "names")= chr [1:2260] "800-2012" "800-2013" "800-2014" "800-2015" ...
##   ..- attr(*, "index")=Classes 'pindex' and 'data.frame':    2260 obs. of  2 variables:
##   .. ..$ cusip: Factor w/ 226 levels "800","4626","4671",..: 1 1 1 1 1 1 1 1 1 1 ...
##   .. ..$ year : Factor w/ 10 levels "2012","2013",..: 1 2 3 4 5 6 7 8 9 10 ...
##  $ sic     : Factor w/ 85 levels "2000","2010",..: 75 75 75 75 75 75 75 75 75 75 ...
##   ..- attr(*, "names")= chr [1:2260] "800-2012" "800-2013" "800-2014" "800-2015" ...
##   ..- attr(*, "index")=Classes 'pindex' and 'data.frame':    2260 obs. of  2 variables:
##   .. ..$ cusip: Factor w/ 226 levels "800","4626","4671",..: 1 1 1 1 1 1 1 1 1 1 ...
##   .. ..$ year : Factor w/ 10 levels "2012","2013",..: 1 2 3 4 5 6 7 8 9 10 ...
##  $ year    : Factor w/ 10 levels "2012","2013",..: 1 2 3 4 5 6 7 8 9 10 ...
##   ..- attr(*, "names")= chr [1:2260] "800-2012" "800-2013" "800-2014" "800-2015" ...
##   ..- attr(*, "index")=Classes 'pindex' and 'data.frame':    2260 obs. of  2 variables:
##   .. ..$ cusip: Factor w/ 226 levels "800","4626","4671",..: 1 1 1 1 1 1 1 1 1 1 ...
##   .. ..$ year : Factor w/ 10 levels "2012","2013",..: 1 2 3 4 5 6 7 8 9 10 ...
##  - attr(*, "index")=Classes 'pindex' and 'data.frame':   2260 obs. of  2 variables:
##   ..$ cusip: Factor w/ 226 levels "800","4626","4671",..: 1 1 1 1 1 1 1 1 1 1 ...
##   ..$ year : Factor w/ 10 levels "2012","2013",..: 1 2 3 4 5 6 7 8 9 10 ...

7.0.0.3 Visualización de valores Nulos

vis_dat(patents)

vis_miss(patents)

Como se puede observar, se cuenta con valores nulos en un 0.7%, debido a su baja concentración de valores faltantes, se toma la decisión de realizar una imputación de datos puesto se encuentra todavía en valores aceptables para imputar.

colSums(is.na(patents))
##    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

7.0.0.4 Imputación de datos

set.seed(123)
patents_miced<- mice(patents, m=5, maxit=5, method = "cart")
## 
##  iter imp variable
##   1   1  employ  return  stckpr  rndstck  sales
##   1   2  employ  return  stckpr  rndstck  sales
##   1   3  employ  return  stckpr  rndstck  sales
##   1   4  employ  return  stckpr  rndstck  sales
##   1   5  employ  return  stckpr  rndstck  sales
##   2   1  employ  return  stckpr  rndstck  sales
##   2   2  employ  return  stckpr  rndstck  sales
##   2   3  employ  return  stckpr  rndstck  sales
##   2   4  employ  return  stckpr  rndstck  sales
##   2   5  employ  return  stckpr  rndstck  sales
##   3   1  employ  return  stckpr  rndstck  sales
##   3   2  employ  return  stckpr  rndstck  sales
##   3   3  employ  return  stckpr  rndstck  sales
##   3   4  employ  return  stckpr  rndstck  sales
##   3   5  employ  return  stckpr  rndstck  sales
##   4   1  employ  return  stckpr  rndstck  sales
##   4   2  employ  return  stckpr  rndstck  sales
##   4   3  employ  return  stckpr  rndstck  sales
##   4   4  employ  return  stckpr  rndstck  sales
##   4   5  employ  return  stckpr  rndstck  sales
##   5   1  employ  return  stckpr  rndstck  sales
##   5   2  employ  return  stckpr  rndstck  sales
##   5   3  employ  return  stckpr  rndstck  sales
##   5   4  employ  return  stckpr  rndstck  sales
##   5   5  employ  return  stckpr  rndstck  sales
patents<- complete(patents_miced)
vis_miss(patents)

Después de la imputación ya se cuenta con el 100% de los datos para comenzar a transformar y modelar.

7.0.0.5 Transofrmación de datos

Para solucionar que el sistema reconociera a la variable employ como númerica se decidió generar una nueva columna.

patents<- patents %>% mutate(employee= employ*1)

head(patents)
##   cusip merger employ return patents patentsg stckpr rnd rndeflt rndstck sales
## 1   800      0     10      6      22       24     48   3       3      16   344
## 2   800      0     12      6      34       32     58   3       3      17   436
## 3   800      0     12      4      31       30     33   3       3      20   535
## 4   800      0     12      5      32       34     38   3       3      22   567
## 5   800      0     13      5      40       28     35   4       3      23   631
## 6   800      0     13      5      60       33     34   4       3      25   706
##    sic year employee
## 1 3740 2012       10
## 2 3740 2013       12
## 3 3740 2014       12
## 4 3740 2015       12
## 5 3740 2016       13
## 6 3740 2017       13

7.0.0.6 Análisis de correlación

patent_numeric<- Filter(is.numeric, patents) %>% select(-employ)
patent_cor<- cor(patent_numeric)

corrplot(patent_cor,method = 'color', order = 'alphabet', type = 'lower')

Tomando en cuenta el análisis de correlación de variables, seleccionamos aquellas que estarían relacionadas a la cantidad de patentes autorizadas que se tienen en las empresas a un nivel del 0.4 y superior.

7.0.0.7 Selección de variables

patents1<- patents %>% select(c(patentsg,rnd, rndeflt, rndstck, sales, employee, patents, year, cusip))
patents2<- patents %>% select(c(patentsg,rnd, rndeflt, rndstck, sales, stckpr, employee, patents, year, cusip))
patents3<- patents %>% select(c(patentsg, rndeflt, rndstck, sales, patents, employee, year, cusip))

7.0.0.8 Pueba de heterogeneidad

plotmeans(patentsg ~ cusip, data = patents2, n.label=FALSE, main= "Heterogeneidad entre empresas")

Se puede observar como es que entre las empresas si se cuenta con una heterogeneidad puesto la línea de los promedios no se mantiene constante, se tienen picos importantes con una gran elevación, así como los rangos de confianza.

plotmeans(patentsg ~ year, data = patents2, n.label=FALSE, main= "Heterogeneidad entre años")

En términos de años se puede observar como también se cuenta con heterogeneidad al no contar con una línea constante aunque no presenta tanta variación (o en magnitudes muy altas). Los rangos de confianza aparentan tener una apertura similar.

7.1 Modelado

Para el modelado se generaron 2 bases de datos diferentes para realizar la evaluación de la decisión presentada en las variables de correlación. A esto se le denominó como patents1 y patents3.

7.1.1 Pooled

7.1.1.1 Patents1

pooled<- plm(patentsg~rnd+
               rndeflt+
               rndstck+
               sales+
               employee, 
               data=patent_numeric, model ="pooling")
summary(pooled)
## Pooling Model
## 
## Call:
## plm(formula = patentsg ~ rnd + rndeflt + rndstck + sales + employee, 
##     data = patent_numeric, model = "pooling")
## 
## Unbalanced Panel: n = 54, T = 1-242, N = 2260
## 
## Residuals:
##      Min.   1st Qu.    Median   3rd Qu.      Max. 
## -416.2323   -8.2121   -4.8365   -1.0479  538.1839 
## 
## Coefficients:
##                Estimate  Std. Error t-value  Pr(>|t|)    
## (Intercept)  4.66691243  1.19006678  3.9216 9.061e-05 ***
## rnd         -0.81409095  0.09576591 -8.5008 < 2.2e-16 ***
## rndeflt      0.46887428  0.07982390  5.8739 4.889e-09 ***
## rndstck      0.09432911  0.01358260  6.9449 4.938e-12 ***
## sales       -0.00173527  0.00055574 -3.1225  0.001816 ** 
## employee     1.32568923  0.05708009 23.2251 < 2.2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Total Sum of Squares:    14168000
## Residual Sum of Squares: 6056700
## R-Squared:      0.5725
## Adj. R-Squared: 0.57156
## F-statistic: 603.712 on 5 and 2254 DF, p-value: < 2.22e-16

Para este primer modelo se presentan todas las variables como significativas para el pronóstico de patentes aceptadas par alas empresas con un nivel de confianza igual o mayor a 99%. Aunque se podría decir que el modelo no tiene un gran desempeño puesto representa solo el 57.16% de la varianza de los datos.

7.1.1.2 Patents3

pooled<- plm(patentsg~rndeflt+
               rndstck+
               sales+
               employee, 
               data=patent_numeric, model ="pooling")
summary(pooled)
## Pooling Model
## 
## Call:
## plm(formula = patentsg ~ rndeflt + rndstck + sales + employee, 
##     data = patent_numeric, model = "pooling")
## 
## Unbalanced Panel: n = 54, T = 1-242, N = 2260
## 
## Residuals:
##      Min.   1st Qu.    Median   3rd Qu.      Max. 
## -463.8220   -8.7292   -5.1706   -1.3107  544.2801 
## 
## Coefficients:
##                Estimate  Std. Error t-value  Pr(>|t|)    
## (Intercept)  5.02258807  1.20797798  4.1578 3.333e-05 ***
## rndeflt      0.00101163  0.05872310  0.0172    0.9863    
## rndstck     -0.00820691  0.00634278 -1.2939    0.1958    
## sales       -0.00299354  0.00054406 -5.5022 4.175e-08 ***
## employee     1.44598166  0.05616524 25.7451 < 2.2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Total Sum of Squares:    14168000
## Residual Sum of Squares: 6250900
## R-Squared:      0.5588
## Adj. R-Squared: 0.55802
## F-statistic: 714.009 on 4 and 2255 DF, p-value: < 2.22e-16

Para la segunda selección de variables se obserca como las ventas y la cantidad de empleados son las significativas para poder pronosticar las patentes otorgadas, explicando menos de varianza que la base de datos anterior.

7.1.2 Within

7.1.2.1 Patents1

within1<- plm(patentsg~rnd+
               rndeflt+
               rndstck+
               sales+
               employee, 
               data=patent_numeric, model ="within")
summary(within1)
## Oneway (individual) effect Within Model
## 
## Call:
## plm(formula = patentsg ~ rnd + rndeflt + rndstck + sales + employee, 
##     data = patent_numeric, model = "within")
## 
## Unbalanced Panel: n = 54, T = 1-242, N = 2260
## 
## Residuals:
##      Min.   1st Qu.    Median   3rd Qu.      Max. 
## -413.3143  -13.6661   -3.0405    5.4509  525.3385 
## 
## Coefficients:
##             Estimate  Std. Error t-value  Pr(>|t|)    
## rnd      -0.85290736  0.09634668 -8.8525 < 2.2e-16 ***
## rndeflt   0.44904629  0.08098770  5.5446 3.299e-08 ***
## rndstck   0.10134782  0.01366122  7.4187 1.680e-13 ***
## sales    -0.00184343  0.00055801 -3.3036 0.0009699 ***
## employee  1.34855048  0.05793901 23.2753 < 2.2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Total Sum of Squares:    13623000
## Residual Sum of Squares: 5898100
## R-Squared:      0.56705
## Adj. R-Squared: 0.55564
## F-statistic: 576.548 on 5 and 2201 DF, p-value: < 2.22e-16

Para el caso de within de la primera base de datos se presenta de nuevo como es que todas las variables son significativas con una R ajustada del 55.64%.

7.1.2.2 Patents3

within3<- plm(patentsg~rndeflt+
               rndstck+
               sales+
               employee, 
               data=patent_numeric, model ="within")
summary(within3)
## Oneway (individual) effect Within Model
## 
## Call:
## plm(formula = patentsg ~ rndeflt + rndstck + sales + employee, 
##     data = patent_numeric, model = "within")
## 
## Unbalanced Panel: n = 54, T = 1-242, N = 2260
## 
## Residuals:
##      Min.   1st Qu.    Median   3rd Qu.      Max. 
## -456.8419  -13.4296   -3.4891    4.7625  533.5554 
## 
## Coefficients:
##            Estimate Std. Error t-value  Pr(>|t|)    
## rndeflt  -0.0430254  0.0599260 -0.7180    0.4728    
## rndstck  -0.0059439  0.0064134 -0.9268    0.3541    
## sales    -0.0031409  0.0005478 -5.7337 1.118e-08 ***
## employee  1.4764714  0.0570852 25.8643 < 2.2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Total Sum of Squares:    13623000
## Residual Sum of Squares: 6108100
## R-Squared:      0.55164
## Adj. R-Squared: 0.54003
## F-statistic: 677.297 on 4 and 2202 DF, p-value: < 2.22e-16

En la segunda base de datos se siguen manteniendo las variables significativas aunque su explicación de la varianza disminuye.

7.2 Aleatorios

7.2.0.1 Walhus

Patents 1

walhus1<- plm(patentsg~rnd+
               rndeflt+
               rndstck+
               sales+
               employee, 
               data=patent_numeric, 
              model = "random",
             random.method = "walhus")
summary(walhus1)
## Oneway (individual) effect Random Effect Model 
##    (Wallace-Hussain's transformation)
## 
## Call:
## plm(formula = patentsg ~ rnd + rndeflt + rndstck + sales + employee, 
##     data = patent_numeric, model = "random", random.method = "walhus")
## 
## Unbalanced Panel: n = 54, T = 1-242, N = 2260
## 
## Effects:
##                    var  std.dev share
## idiosyncratic 2681.756   51.786 0.998
## individual       5.756    2.399 0.002
## theta:
##     Min.  1st Qu.   Median     Mean  3rd Qu.     Max. 
## 0.001071 0.082865 0.137225 0.127430 0.174618 0.188730 
## 
## Residuals:
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
## -415.42   -8.31   -4.95   -0.06   -0.75  536.75 
## 
## Coefficients:
##                Estimate  Std. Error z-value  Pr(>|z|)    
## (Intercept)  4.86188710  1.32590835  3.6668 0.0002456 ***
## rnd         -0.82503082  0.09567070 -8.6237 < 2.2e-16 ***
## rndeflt      0.46981432  0.07977992  5.8889 3.888e-09 ***
## rndstck      0.09598874  0.01357078  7.0732 1.514e-12 ***
## sales       -0.00175641  0.00055515 -3.1638 0.0015571 ** 
## employee     1.32691182  0.05708273 23.2454 < 2.2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Total Sum of Squares:    14050000
## Residual Sum of Squares: 6028400
## R-Squared:      0.57094
## Adj. R-Squared: 0.56999
## Chisq: 3003.29 on 5 DF, p-value: < 2.22e-16

De nuevo, para la primera base de datos se presentan todas las variables como significativas para pronosticar las patentes otorgadas con una mejor explicación de la varianza.

7.2.0.2 Patents3

walhus3<- plm(patentsg~rndeflt+
               rndstck+
               sales+
               employee, 
               data=patent_numeric, 
              model = "random",
             random.method = "walhus")
summary(walhus3)
## Oneway (individual) effect Random Effect Model 
##    (Wallace-Hussain's transformation)
## 
## Call:
## plm(formula = patentsg ~ rndeflt + rndstck + sales + employee, 
##     data = patent_numeric, model = "random", random.method = "walhus")
## 
## Unbalanced Panel: n = 54, T = 1-242, N = 2260
## 
## Effects:
##                   var std.dev share
## idiosyncratic 2775.64   52.68     1
## individual       0.00    0.00     0
## theta:
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##       0       0       0       0       0       0 
## 
## Residuals:
##      Min.   1st Qu.    Median   3rd Qu.      Max. 
## -463.8220   -8.7292   -5.1706   -1.3107  544.2801 
## 
## Coefficients:
##                Estimate  Std. Error z-value  Pr(>|z|)    
## (Intercept)  5.02258807  1.20797798  4.1578 3.213e-05 ***
## rndeflt      0.00101163  0.05872310  0.0172    0.9863    
## rndstck     -0.00820691  0.00634278 -1.2939    0.1957    
## sales       -0.00299354  0.00054406 -5.5022 3.750e-08 ***
## employee     1.44598166  0.05616524 25.7451 < 2.2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Total Sum of Squares:    14168000
## Residual Sum of Squares: 6250900
## R-Squared:      0.5588
## Adj. R-Squared: 0.55802
## Chisq: 2856.04 on 4 DF, p-value: < 2.22e-16

La segunda base de datos presenta los mismos resultados que en sus modelos anteriores, con mayor varianza explicada por los datos pero aún no se podría considerar como un buen modelo.

7.2.0.3 Amemiya

Patents 1

amemiya1<- plm(patentsg~rnd+
               rndeflt+
               rndstck+
               sales+
               employee,
               data=patent_numeric,
              model = "random",
             random.method = "amemiya")
summary(amemiya1)
## Oneway (individual) effect Random Effect Model 
##    (Amemiya's transformation)
## 
## Call:
## plm(formula = patentsg ~ rnd + rndeflt + rndstck + sales + employee, 
##     data = patent_numeric, model = "random", random.method = "amemiya")
## 
## Unbalanced Panel: n = 54, T = 1-242, N = 2260
## 
## Effects:
##                    var  std.dev share
## idiosyncratic 2679.725   51.766 0.996
## individual      10.144    3.185 0.004
## theta:
##     Min.  1st Qu.   Median     Mean  3rd Qu.     Max. 
## 0.001887 0.133906 0.210829 0.193481 0.259814 0.277576 
## 
## Residuals:
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
## -415.02   -8.60   -4.96   -0.08   -0.64  535.94 
## 
## Coefficients:
##                Estimate  Std. Error z-value  Pr(>|z|)    
## (Intercept)  4.94225689  1.41331548  3.4969 0.0004707 ***
## rnd         -0.82988493  0.09561895 -8.6791 < 2.2e-16 ***
## rndeflt      0.46967145  0.07976780  5.8880 3.909e-09 ***
## rndstck      0.09674998  0.01356406  7.1328 9.834e-13 ***
## sales       -0.00176707  0.00055483 -3.1849 0.0014480 ** 
## employee     1.32791567  0.05708917 23.2604 < 2.2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Total Sum of Squares:    13996000
## Residual Sum of Squares: 6014200
## R-Squared:      0.57028
## Adj. R-Squared: 0.56932
## Chisq: 2996.17 on 5 DF, p-value: < 2.22e-16

Siguiendo la misma progresión, se tienen todas las variables como significativas con un buen nivel de confianza y una explicación de la varianza más elevada aunque aún menor que con el modelo Pooled.

7.2.0.4 Patents3

amemiya3<- plm(patentsg~rndeflt+
               rndstck+
               sales+
               employee,
               data=patent_numeric,
              model = "random",
             random.method = "amemiya")
summary(amemiya3)
## Oneway (individual) effect Random Effect Model 
##    (Amemiya's transformation)
## 
## Call:
## plm(formula = patentsg ~ rndeflt + rndstck + sales + employee, 
##     data = patent_numeric, model = "random", random.method = "amemiya")
## 
## Unbalanced Panel: n = 54, T = 1-242, N = 2260
## 
## Effects:
##                   var std.dev share
## idiosyncratic 2773.88   52.67     1
## individual       0.00    0.00     0
## theta:
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##       0       0       0       0       0       0 
## 
## Residuals:
##      Min.   1st Qu.    Median   3rd Qu.      Max. 
## -463.8220   -8.7292   -5.1706   -1.3107  544.2801 
## 
## Coefficients:
##                Estimate  Std. Error z-value  Pr(>|z|)    
## (Intercept)  5.02258807  1.20797798  4.1578 3.213e-05 ***
## rndeflt      0.00101163  0.05872310  0.0172    0.9863    
## rndstck     -0.00820691  0.00634278 -1.2939    0.1957    
## sales       -0.00299354  0.00054406 -5.5022 3.750e-08 ***
## employee     1.44598166  0.05616524 25.7451 < 2.2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Total Sum of Squares:    14168000
## Residual Sum of Squares: 6250900
## R-Squared:      0.5588
## Adj. R-Squared: 0.55802
## Chisq: 2856.04 on 4 DF, p-value: < 2.22e-16

Dentro de la base de datos de patentes 3 se puede observar el mismo comportamiento de contar solo con sales y employee como variables significativas para el pronóstico, aún con una explicación de la varianza baja con una r ajustada de 55.82%.

7.2.0.5 Nerlove

Patents 1

nerlove1<- plm(patentsg~rnd+
               rndeflt+
               rndstck+
               sales+
               employee,
               data=patent_numeric,
              model = "random",
             random.method = "nerlove")
summary(nerlove1)
## Oneway (individual) effect Random Effect Model 
##    (Nerlove's transformation)
## 
## Call:
## plm(formula = patentsg ~ rnd + rndeflt + rndstck + sales + employee, 
##     data = patent_numeric, model = "random", random.method = "nerlove")
## 
## Unbalanced Panel: n = 54, T = 1-242, N = 2260
## 
## Effects:
##                    var  std.dev share
## idiosyncratic 2609.767   51.086 0.972
## individual      73.815    8.592 0.028
## theta:
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
## 0.01385 0.46464 0.57458 0.52147 0.62644 0.64297 
## 
## Residuals:
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
## -413.33  -10.02   -4.42    0.02    1.18  531.44 
## 
## Coefficients:
##                Estimate  Std. Error z-value  Pr(>|z|)    
## (Intercept)  4.91955991  2.18489470  2.2516  0.024346 *  
## rnd         -0.84563319  0.09536160 -8.8676 < 2.2e-16 ***
## rndeflt      0.46240880  0.07983756  5.7919 6.961e-09 ***
## rndstck      0.09952423  0.01352705  7.3574 1.875e-13 ***
## sales       -0.00181298  0.00055307 -3.2780  0.001045 ** 
## employee     1.33676896  0.05716653 23.3838 < 2.2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Total Sum of Squares:    13773000
## Residual Sum of Squares: 5949700
## R-Squared:      0.56802
## Adj. R-Squared: 0.56706
## Chisq: 2969.86 on 5 DF, p-value: < 2.22e-16

Para este modelo utilizando Nerlove, se pueden observar todas las variables como significativas para el pronóstico de las patentes otorgadas en una empresa. Representa solo el 56.7% de la varianza de los datos.

nerlove2<- plm(patentsg~rndeflt+
               rndstck+
               sales+
               employee,
               data=patent_numeric,
              model = "random",
             random.method = "nerlove")
summary(nerlove2)
## Oneway (individual) effect Random Effect Model 
##    (Nerlove's transformation)
## 
## Call:
## plm(formula = patentsg ~ rndeflt + rndstck + sales + employee, 
##     data = patent_numeric, model = "random", random.method = "nerlove")
## 
## Unbalanced Panel: n = 54, T = 1-242, N = 2260
## 
## Effects:
##                    var  std.dev share
## idiosyncratic 2702.688   51.987 0.976
## individual      66.348    8.145 0.024
## theta:
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
## 0.01205 0.43748 0.54952 0.49791 0.60321 0.62043 
## 
## Residuals:
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
## -458.51  -10.22   -4.96   -0.02    0.53  538.88 
## 
## Coefficients:
##                Estimate  Std. Error z-value  Pr(>|z|)    
## (Intercept)  5.37365820  2.13349891  2.5187   0.01178 *  
## rndeflt     -0.02290264  0.05895586 -0.3885   0.69767    
## rndstck     -0.00701707  0.00633631 -1.1074   0.26810    
## sales       -0.00310121  0.00054275 -5.7139 1.104e-08 ***
## employee     1.46202688  0.05630236 25.9674 < 2.2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Total Sum of Squares:    13787000
## Residual Sum of Squares: 6161200
## R-Squared:      0.55311
## Adj. R-Squared: 0.55231
## Chisq: 2796.73 on 4 DF, p-value: < 2.22e-16

Para la tercera base de datos se cuentan las mismas 2 variables como significativas para poder pronosticar las patentes otorgadas, con un 55.23% de la varianza siendo explicada.

7.3 Evalución de modelo

pFtest(within, pooled)
## 
##  F test for individual effects
## 
## data:  SP.DYN.LE00.IN ~ EN.POP.DNST + NY.GDP.PCAP.CD + SH.IMM.IDPT +  ...
## F = 2141, df1 = 2243, df2 = 12, p-value < 2.2e-16
## alternative hypothesis: significant effects
phtest(walhus1, pooled)
## 
##  Hausman Test
## 
## data:  patentsg ~ rnd + rndeflt + rndstck + sales + employee
## chisq = 73.831, df = 4, p-value = 3.521e-15
## alternative hypothesis: one model is inconsistent

Se cuenta con efectos significativos entre los modelos presentados como fijos por lo tal se podría mencionar que el mejor modelo de los dos (tomando en cuenta solo la base de datos 1 que fue quien obtuvo un mejor desempeño en general) en las métricas de cantidad de variables significativas, la proporción de la varianza siendo explicada por el modelo e incluso los índices de confianza presentados.

Como la prueba de Hausman presenta inconsistencias entre los modelos entonces se debe seleccionar alguno que esté teniendo el mejor desmepeño. En este caso el modelo que se selecciona es el método agrupado de los fijos puesto fue el que explico la mayor proporción de varianza en el modelo. Se puede reconocer que o se tiene un mejor desempeño del modelo puesto que se decidió excluir la variables de patentes solicitadas para su otorgación, esto debido a que es una variable altamente correlacionada que en lugar de traer beneficios al modelo para explicar el comportamiento necesario o como ciertas variables afectan (en que magnitud y dirección) a la otorgación de patentes, más alla que la cantidad de patentes presentadas.


  1. Sancho, A., Serrano, S. (2005). Econometría de Economías. Recuperado de: https://www.uv.es/~sancho/panel↩︎

  2. Ortega, C. (s.f). Datos transversales: Qué son, características y tipos. Recuperado de: https://www.questionpro.com/blog/es/datos-transversales/↩︎

  3. Universidad de Sonora. (s.f). Series de Tiempo - Estadística. Recuperado de: http://www.estadistica.mat.uson.mx/Material/seriesdetiempo.pdf↩︎

LS0tDQp0aXRsZTogIlRhcmVhIDE6IEludGVncmFjacOzbiBkZSBUZW1hIDEiDQphdXRob3I6ICJBc3RyaWQgUGFvbGEgR29uesOhbGV6IETDrWF6IC0gQTAwODMwMTE0Ig0KZGF0ZTogIjIwMjQtMDItMjAiDQpvdXRwdXQ6DQogIGh0bWxfZG9jdW1lbnQ6DQogICAgdG9jOiBUUlVFDQogICAgdG9jX2Zsb2F0OiBUUlVFDQogICAgbnVtYmVyX3NlY3Rpb25zOiB0cnVlDQogICAgY29kZV9kb3dubG9hZDogVFJVRQ0KLS0tDQoNCmBgYHtyIHNldHVwLCBpbmNsdWRlPUZBTFNFfQ0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KGVjaG8gPSBUUlVFLCB3YXJuaW5nID0gRkFMU0UpDQpgYGANCg0KIVtdKGdpcGh5LmdpZil7d2lkdGg9IjI0NSJ9DQoNCmBgYHtyIGxpYnJlcmlhcywgaW5jbHVkZT1GQUxTRX0NCmxpYnJhcnkoV0RJKSAjI1dvcmxkIERldmVsb3BtZW50IEluZGljYXRvcnMNCmxpYnJhcnkod2JzdGF0cykgIyMgRXN0YWTDrXN0aWNhcyBkZWwgYmFuY28gbXVuZGlhbA0KbGlicmFyeSh0aWR5dmVyc2UpDQpsaWJyYXJ5KGthYmxlRXh0cmEpDQpsaWJyYXJ5KHZpc2RhdCkNCmxpYnJhcnkoZ2dwbG90MikNCmxpYnJhcnkoZ3Bsb3RzKQ0KbGlicmFyeShtaWNlKSAjIyBpbXB1dGFjacOzbiBkZSBkYXRvcw0KbGlicmFyeShwbG0pICMjIHBhcmEgaGFjZXIgZWwgbW9kZWxhZG8gY29uIGRhdG9zIGRlIHBhbmVsDQpsaWJyYXJ5KHN0YXJnYXplcikNCmxpYnJhcnkoY29ycnBsb3QpDQpgYGANCg0KIyAqKkFjdGl2aWRhZCAxLiBBbsOhbGlzaXMgeSBhcGxpY2FjacOzbiBkZSBkYXRvcyBwYW5lbCoqDQoNCiMjIyAqKipQcmVndW50YSBkZXRvbmFkb3JhOioqKg0KDQrCv1F1w6kgZmFjdG9yZXMgYWZlY3RhbiBsYSBwcm9iYWJpbGlkYWQgZGUgdGVuZXIgdW5hIHBhcmVqYT8NCg0KLSAgIEVkYWQ6IG51bcOpcmljbyBhw7Fvcw0KLSAgIEhvYmJpZXM6IG51bcOpcmljbyBjYW50aWRhZA0KLSAgIFRyYWJham86IGJpbmFyaWENCi0gICBTYWxhcmlvOiBudW3DqXJpY28gY2FudGlkYWQNCi0gICDDjW5kaWNlIGRlIGF0cmFjdGl2aWRhZDogbnVtw6lyaWNvDQotICAgRGF0aW5nIGFwcHM6IG51bcOpcmljbyBjYW50aWRhZCBkZSBhcHBzIGRvbmRlIGVzdMOhDQogICAgLSAgIMK/UXXDqSBhcHA/OiBudW3DqXJpY28gY2F0ZWfDs3JpY28NCi0gICBQcmVmZXJlbmNpYSBzZXh1YWw6IG51bcOpcmljbyBjYXRlZ8Ozcmljbw0KLSAgIEF1dG9lc3RpbWE6IG51bcOpcmljbyDDrW5kaWNlDQotICAgUGFyZWphcyBhbnRlcmlvcmVzOiBudW3DqXJpY28gY2FudGlkYWQNCg0KIyMjIyAqKk1vZGVsbyBlY29uw7NtaWNvIOKGkioqDQoNCnJlbGFjacOzbiA9IGYoZWRhZCwgaG9iYmllcywgdHJhYmFqbywgZGluZXJvLCDDrW5kaWNlIGRlIGF0cmFjdGl2aWRhZCwgZGF0aW5nIGFwcHMsIHByZWZlcmVuY2lhIHNleHVhbCwgYXV0b2VzdGltYQ0KDQojIyMjICoqTW9kZWxvIGVjb25vbcOpdHJpY28g4oaSKioNCg0KcmVsYWNpw7NuID0gQjArIChiMSplZGFkXF4yKSArIChiMipob2JiaWVzKSArIChiMyp0cmFiYWpvKSsgKGI0KmRpbmVybykrKGI1KmF0cmFjdGl2aWRhZCkgKyhiNiogZGF0aW5nIGFwcHMpKyhiNypwcmVmZXJlbmNpYSBzZXh1YWwpKyhiOCogYXV0b2VzdGltYSkgKyhiOSpxdWVfYXBwKSsoYjEwKnBhcmVqYXMgYW50ZXJpb3JlcyApKyBtdQ0KDQojIFRhcmVhIDEuIERlZmluaWNpw7NuIGRlIFRpcG8gZGUgRGF0b3MNCg0KIyMgRGF0b3MgUGFuZWwNCg0KTG9zIGRhdG9zIHBhbmVsIHNvbiBhcXVlbGxvcyBxdWUgY29udGllbmVuIG9ic2VydmFjaW9uZXMgZGUgbcO6bHRpcGxlcyB1bmlkYWRlcyBhIGxvIGxhcmdvIGRlbCB0aWVtcG8sIGVzIGRlY2lyLCBxdWUgdW5hIHVuaWRhZCBwdWVkZSBzZXIgcmVwZXRpZGEgcHVlc3RvIHNlIG9ic2VydmEgZW4gdmFyaW9zIHBlcmlvZG9zIGRlIHRpZW1wby5bXjFdIEVzdGUgdGlwbyBkZSBkYXRvcyBwZXJtaXRlIGFuYWxpemFyIGxvcyBkYXRvcyBkZSBpbnRlcsOpcyBkZW50cm8gZGUgY2FkYSB1bmlkYWQgYSBsbyBsYXJnbyBkZWwgdGllbXBvLg0KDQpbXjFdOiBTYW5jaG8sIEEuLCBTZXJyYW5vLCBTLiAoMjAwNSkuIEVjb25vbWV0csOtYSBkZSBFY29ub23DrWFzLiBSZWN1cGVyYWRvIGRlOiA8aHR0cHM6Ly93d3cudXYuZXMvfnNhbmNoby9wYW5lbD4NCg0KIyMgRGF0b3MgVHJhbnN2ZXJzYWxlcw0KDQpMb3MgZGF0b3MgdHJhbnN2ZXJzYWxlcyBzb24gb2JzZXJ2YWNpb25lcyBkZSBtw7psdGlwbGVzIHVuaWRhZGVzLCBwZXJvIGVuIHVuIHNvbG8gcGVyaW9kbyBkZSB0aWVtcG8uIFNvbiDDunRpbGVzIHBhcmEgcmVhbGl6YXIgYW7DoWxpc2lzIGRlc2NyaXB0aXZvcyB5IGNvbXBhcmF0aXZvcy5bXjJdXA0KDQpbXjJdOiBPcnRlZ2EsIEMuIChzLmYpLiBEYXRvcyB0cmFuc3ZlcnNhbGVzOiBRdcOpIHNvbiwgY2FyYWN0ZXLDrXN0aWNhcyB5IHRpcG9zLiBSZWN1cGVyYWRvIGRlOiA8aHR0cHM6Ly93d3cucXVlc3Rpb25wcm8uY29tL2Jsb2cvZXMvZGF0b3MtdHJhbnN2ZXJzYWxlcy8+DQoNCiMjIERhdG9zIFNlcmllcyBkZSBUaWVtcG8NCg0KTG9zIGRhdG9zIGRlIHNlcmllcyBkZSB0aWVtcG8gdGllbmVuIG9ic2VydmFjaW9uZXMgZGUgdW5hIHNvbGEgdmFyaWFibGUgKG8gdmFyaWFzIHZhcmlhYmxlcykgZW4gZGlzdGludG9zIHBlcmlvZG9zIGRlIHRpZW1wbywgcGVybyBkZSBtYW5lcmEgcmVndWxhciB5IHNlY3VlbmNpYWwuIFNlIHB1ZWRlbiBtZW5jaW9uYXIgY29tbyBhcXVlbGxvcyBkYXRvcyBxdWUgc29uIHJlY29waWxhZG9zIGRlIGZvcm1hIHBlcmnDs2RpY2EgZW4gYWxnw7puIGludMOpcnZhbG8gZGUgdGllbXBvLiBbXjNdDQoNClteM106IFVuaXZlcnNpZGFkIGRlIFNvbm9yYS4gKHMuZikuIFNlcmllcyBkZSBUaWVtcG8gLSBFc3RhZMOtc3RpY2EuIFJlY3VwZXJhZG8gZGU6IDxodHRwOi8vd3d3LmVzdGFkaXN0aWNhLm1hdC51c29uLm14L01hdGVyaWFsL3Nlcmllc2RldGllbXBvLnBkZj4NCg0KIyBJbmRpY2Fkb3JlcyBkZWwgQmFuY28gTXVuZGlhbA0KDQohW10oJTIyQzovVXNlcnMvQXN0cmlkJTIwR29uemFsZXovRG93bmxvYWRzL2dpcGh5LmdpZiUyMikNCg0KIyMgVGVtYSAxICoqREFUT1MgUEFORUwqKg0KDQojIyMgQWN0aXZpZGFkIDENCg0KIyMjIyMjIE9idGVuZXIgaW5mb3JtYWNpw7NuIGRlIHVuIHBhw61zDQoNClBhcmEgb2J0ZW5lciBpbmZvcm1hY2nDs24gZGlyZWN0YW1lbnRlIHNlIHB1ZWRlIGJ1c2NhciBlbCBpbmRpY2Fkb3IgZGVudHJvIGRlIGxhIHDDoWdpbmEgZGUgaW5kaWNhZG9yZXMgZGVsIGJhbmNvIG11bmRpYWwgeSBzYWNhciBlbCBjw7NkaWdvIHF1ZSBzYWxlIGVuIGVsIGVubGFjZSBkZSBsYSBww6FnaW5hLiBMb3MgY8OzZGlnb3MgZGUgMiBsZXRyYXMgZGUgbG9zIHBhw61zZXMgZXN0YW4gZW4gbGEgSVNPIDMxNjYtMS4NCg0KRWplbXBsbyBkZSBzYWNhciBpbmRpY2Fkb3I6DQoNCjxodHRwczovL2RhdGEud29ybGRiYW5rLm9yZy9pbmRpY2F0b3IvTlkuR0RQLlBDQVAuQ0Q/dmlldz1jaGFydD4NCg0KRWwgY8OzZGlnbyBkZWwgaW5kaWNhZG9yIGVzIFtOWS5HRFAuUENBUC5DRF0oaHR0cHM6Ly9kYXRhLndvcmxkYmFuay5vcmcvaW5kaWNhdG9yL05ZLkdEUC5QQ0FQLkNEP3ZpZXc9Y2hhcnQpLg0KDQpgYGB7cn0NCiMjIE9idGllbmUgaW5mbyBkZSAxIHBhw61zDQpnZHBfZGF0YTwtIHdiX2RhdGEoY291bnRyeSA9ICJNWCIsIGluZGljYXRvciA9ICJOWS5HRFAuUENBUC5DRCIsIHN0YXJ0X2RhdGUgPSAyMDEzLCBlbmRfZGF0ZSA9IDIwMjMgKQ0KDQprYWJsZShoZWFkKGdkcF9kYXRhKSkgJT4lIGthYmxlX2NsYXNzaWNfMigpDQpgYGANCg0KU2UgZ2VuZXLDsyBsYSBleHRyYWNjacOzbiBkZSB1biBpbmRpY2Fkb3IgZGUgUElCIHBlciBjw6FwaXRhIGRlIE3DqXhpY28gcGFyYSBsb3MgYcOxb3MgZGUgMjAxMyBhIDIwMjMuDQoNCmBgYHtyfQ0KIyNPYnRpZW5lIGluZm8gZGUgbcOhcyBwYcOtc2VzDQpnZHBfZGF0YTI8LSB3Yl9kYXRhKGNvdW50cnkgPSBjKCJNWCIsICJFQyIsICJDQSIpLCBpbmRpY2F0b3IgPSAiTlkuR0RQLlBDQVAuQ0QiLCBzdGFydF9kYXRlID0gMjAxMywgZW5kX2RhdGUgPSAyMDIzICkNCg0Ka2FibGUoaGVhZChnZHBfZGF0YTIpKSAlPiUga2FibGVfY2xhc3NpYygpDQpgYGANCg0KRXN0b3Mgc29uIGRhdG9zIGRlIHBhbmVsIHBvcnF1ZSBzZSB0aWVuZSBkaWZlcmVudGVzIHBhw61zZXMgZW4gZGlmZXJlbnRlcyBwZXJpb2RvcyBkZSB0aWVtcG8gY29uIGxhIG1pc21hIHJlZ3VsYXJpZGFkLiBTZSB0aWVuZSBlbCBtaXNtbyBpbmRpY2Fkb3IgZGUgUElCIHBlciBjw6FwaXRhIGRlIGxvcyBtaXNtb3MgMTAgYcOxb3MgYWdyZWdhbmRvIGEgRWN1YWRvciB5IENhbmFkYS4NCg0KIyMjIyMjIExpbXBpZXphIGRlIGluZm9ybWFjacOzbg0KDQpQYXJhIHRlbmVyIHNvbG8gbGEgaW5mb3JtYWNpw7NuIG5lY2VzYXJpYS4NCg0KYGBge3J9DQpwYW5lbDwtIGdkcF9kYXRhMiAlPiUgc2VsZWN0KGNvdW50cnksIGRhdGUsIE5ZLkdEUC5QQ0FQLkNEKQ0Ka2FibGUoaGVhZChwYW5lbCkpICU+JSBrYWJsZV9jbGFzc2ljKCkNCmBgYA0KDQojIEVqZXJjaWNpbyAyLiBDb25qdW50byBkZSBEYXRvcyBQYW5lbCBjb24gSW5kaWNhZG9yZXMgZGVsIEJhbmNvIENlbnRyYWwNCg0KIyMjIyMjIEV4dHJhY2Npb24gZGUgZGF0b3MNCg0KVmFyaWFibGUgZW5kw7NnZW5hOg0KDQotICAgTGlmZSBFeHBlY3RhbmN5IFRvdGFsICh5ZWFycykuIDxodHRwczovL2RhdGEud29ybGRiYW5rLm9yZy9pbmRpY2F0b3IvU1AuRFlOLkxFMDAuSU4/dmlldz1jaGFydD4NCg0KUGFyw6FtZXRyb3M6DQoNCi0gICBDTzIgRW1pc3Npb25zLiA8aHR0cHM6Ly9kYXRhLndvcmxkYmFuay5vcmcvaW5kaWNhdG9yL0VOLkFUTS5DTzJFLlBDP3ZpZXc9Y2hhcnQ+DQoNCi0gICBJbnZlc3RtZW50IGluIHdhdGVyIGFuZCBzYW5pdGF0aW9uLiA8aHR0cHM6Ly9kYXRhLndvcmxkYmFuay5vcmcvaW5kaWNhdG9yL0lFLlBQSS5XQVRSLkNEP3ZpZXc9Y2hhcnQ+DQoNCi0gICBHRFAuIDxodHRwczovL2RhdGEud29ybGRiYW5rLm9yZy9pbmRpY2F0b3IvTlkuR0RQLlBDQVAuQ0Q/dmlldz1jaGFydD4NCg0KLSAgIFBvcHVsYXRpb24gRGVuc2l0eS4gPGh0dHBzOi8vZGF0YS53b3JsZGJhbmsub3JnL2luZGljYXRvci9FTi5QT1AuRE5TVD92aWV3PWNoYXJ0Pg0KDQotICAgQ2FudGlkYWQgZGUgY2FtYXMgZGlzcG9uaWJsZXMuIDxodHRwczovL2RhdGEud29ybGRiYW5rLm9yZy9pbmRpY2F0b3IvU0guTUVELkJFRFMuWlM/dmlldz1jaGFydD4NCg0KLSAgIEltbXVuaXphdGlvbi4gQ2hpbGRyZW4gMTIgdG8gMjMgbW9udGhzLiA8aHR0cHM6Ly9kYXRhLndvcmxkYmFuay5vcmcvaW5kaWNhdG9yL1NILklNTS5JRFBUP3ZpZXc9Y2hhcnQ+DQoNCi0gICBTdXJnaWNhbCBTcGVjaWFsaXN0cyBwZXIgMTAwMCBoYWJpdGFudHMuIDxodHRwczovL2RhdGEud29ybGRiYW5rLm9yZy9pbmRpY2F0b3IvU0guTUVELlNBT1AuUDU/dmlldz1jaGFydD4NCg0KLSAgIEludGVudGlvbmFsIEhvbW9jaWRlcyBwZXIgMTAwLDAwMC4gPGh0dHBzOi8vZGF0YS53b3JsZGJhbmsub3JnL2luZGljYXRvci9WQy5JSFIuUFNSQy5QNT92aWV3PWNoYXJ0Pg0KDQotICAgUG9wdWxhdGlvbiBsaXZpbmcgaW4gc2x1bXMuIDxodHRwczovL2RhdGEud29ybGRiYW5rLm9yZy9pbmRpY2F0b3IvRU4uUE9QLlNMVU0uVVIuWlM/dmlldz1jaGFydD4NCg0KYGBge3J9DQpwYW5lbF9zYWx1ZDwtIHdiX2RhdGEoY291bnRyeSA9IGMoIk1YIiwgIkNBIiwgIlVTIiwgIkNIIiwgIkNPIiwiQ04iICksIGluZGljYXRvciA9YygiU1AuRFlOLkxFMDAuSU4iLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFTi5BVE0uQ08yRS5QQyIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSUUuUFBJLldBVFIuQ0QiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJOWS5HRFAuUENBUC5DRCIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkVOLlBPUC5ETlNUIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiU0guTUVELkJFRFMuWlMiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlNILklNTS5JRFBUIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJTSC5NRUQuU0FPUC5QNSIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZDLklIUi5QU1JDLlA1IiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFTi5QT1AuU0xVTS5VUi5aUyIpLCBzdGFydF9kYXRlID0xOTUwICwgZW5kX2RhdGU9MjAyMykNCnBhbmVsX3NhbHVkPC1zdWJzZXQocGFuZWxfc2FsdWQsIGRhdGU9PTE5OTB8IGRhdGU9PTIwMDAgfCBkYXRlPT0yMDEwfCBkYXRlPT0yMDIwKQ0KcGFuZWxfc2FsdWQ8LSBwZGF0YS5mcmFtZShwYW5lbF9zYWx1ZCwgaW5kZXggPSBjKCJjb3VudHJ5IiwgImRhdGUiKSkNCmthYmxlKGhlYWQocGFuZWxfc2FsdWQpKSAlPiUga2FibGVfY2xhc3NpYygpDQpgYGANCg0KIyMjIyMjIFZpc3VhbGl6YWNpw7NuIGRlIE51bG9zDQoNCkxhIHZlcmlmaWNhY2nDs24gZGUgTkFzIGRlbnRybyBkZSBsb3MgZGF0b3Mgc2UgbGxhbWEgUGFuZWwgQmFsYW5jZWFkby4gRW4gZXN0ZSBjYXNvIHNlIHB1ZWRlIG9ic2VydmFyIHF1ZSBzZSBjdWVudGFuIGNvbiBncmFuIHDDqXJkaWRhIGRlIGRhdG9zIGVuIGFsZ3Vub3MgZGUgbG9zIGluZGljYWRvcmVzLiBMYSBkZWNpc2nDs24gYSB0b21hciBlcyBlbGltaWFyIGFxdWVsbGFzIGNvbHVtbmFzIHF1ZSB0aWVuZW4gdW4gZ3JhbiBwb3JjZW50YWplIGRlIHZhbG9yZXMgbnVsb3MgcGFyYSBpbXB1dGFyIGFxdWVsbG9zIHF1ZSB0ZW5nYW4gdW4gcG9yY2VudGFqZSBkZSB2YWxvcmVzIHBlcmRpZG9zIG1lbm9yIG8gaWd1YWwgYWwgMTAlLg0KDQpgYGB7cn0NCnZpc19taXNzKHBhbmVsX3NhbHVkKQ0KYGBgDQoNCiMjIyMjIyBEZWxpbWl0YWNpw7NuIGRlIHZhcmlhYmxlcyBhIHV0aWxpemFyDQoNCmBgYHtyfQ0KcGFuZWxfc2FsdWQ8LXBhbmVsX3NhbHVkICU+JSBzZWxlY3QoLWMoaXNvMmMsIGlzbzNjLEVOLkFUTS5DTzJFLlBDLCBFTi5QT1AuU0xVTS5VUi5aUyxJRS5QUEkuV0FUUi5DRCwgU0guTUVELkJFRFMuWlMsIFNILk1FRC5TQU9QLlA1KSkNCmthYmxlKGhlYWQocGFuZWxfc2FsdWQpKSAlPiUga2FibGVfY2xhc3NpYygpDQpgYGANCg0KIyMjIyMjIFZpc3VhbGl6YWNpw7NuIGRlIE51bG9zDQoNCmBgYHtyfQ0KdmlzX21pc3MocGFuZWxfc2FsdWQpDQpgYGANCg0KIyMjIyMjIEltcHV0YWNpw7NuIGRlIGRhdG9zDQoNCmBgYHtyfQ0KI3BhbmVsX3NhbHVkPC0gcGFuZWxfc2FsdWQgJT4lIG1pY2UobT01LCBtZXRob2Q9InBtbSIsIG1heGl0ID0gMTApDQoNCnBhbmVsX3NhbHVkPC0gY29tcGxldGUocGFuZWxfc2FsdWQpDQpgYGANCg0KYGBge3J9DQp2aXNfbWlzcyhwYW5lbF9zYWx1ZCkNCmBgYA0KDQpEZXNwdcOpcyBkZSBsYSBpbXB1dGFjacOzbiBkZSBsb3MgZGF0b3Mgc2UgcHVlZGUgb2JzZXJ2YXIgY29tbyBlcyBxdWUgcGFyYSB0b2RvcyBsb3MgaW5kaWNhZG9yZXMgc2VsZWNjaW9uYWRvcyB5YSBubyBjdWVudGFuIGNvbiB2YWxvcmVzIG51bG9zLCBzZSB0aWVuZSBlbCAxMDAlIGRlIGxvcyB2YWxvcmVzIHByZXNlbnRlcy4NCg0KIyBUYXJlYSAyLiBHcsOhZmljYXMgZGUgaGV0ZXJvZ2VuZWlkYWQNCg0KIyMjIyBWaXN1YWxpemFjacOzbiBkZSBoZXRlcm9nZW5laWRhZA0KDQpgYGB7cn0NCnBsb3RtZWFucyhTUC5EWU4uTEUwMC5JTiB+IGNvdW50cnksIGRhdGEgPSBwYW5lbF9zYWx1ZCwgbi5sYWJlbD1GQUxTRSwgbWFpbj0gIkhldGVyb2dlbmVpZGFkIGVudHJlIHBhw61zZXMiKQ0KYGBgDQoNCkxhIGzDrW5lYSBxdWUgdW5lIGxvcyBwcm9tZWRpb3Mgbm8gc2UgbWFudGllbmUgY29uc3RhbnRlIGEgbG8gbGFyZ28gZGUgbGFzIGRpZmVyZW50ZXMgb2JzZXJ2YWNpb25lcyBkZSBsb3MgcGHDrXNlcy4gUG9yIGNvbnNpZ3VpZW50ZSwgc2UgcHVlZGUgZGVjaXIgcXVlIGxhIGdyw6FmaWNhIHRpZW5lIGRpZmVyZW50ZXMgcGljb3MgZG9uZGUgbG9zIGludGVydmFsb3MgZGUgY29uZmlhbnphIHRhbXBvY28gc2UgcHJlc2VudGFuIGRlbnRybyBkZSB1biBtaXNtbyByYW5nbywgc2UgdmUgdW5hIHZhcmlhY2nDs24gbXV5IGdyYW5kZSBlbnRyZSBsb3MgcHJvbWVkaW9zIGRlIGxvcyBwYcOtc2VzLCBwcmVzZW50YW5kbyB1bmEgdmFyaWFiaWxpZGFkIGluY29uc2lzdGVudGUuIERlIGVzdGEgbWFuZXJhIGVzIHF1ZSBkZSBmb3JtYSB2aXN1YWwgc2UgcHJlc2VudGEgaGV0ZXJvZ2VuZWlkYWQsIGRpZmVyZW5jaWEgc2lnbmlmaWNhdGl2YSBlbiBsYXMgbWVkaWFzIG8gZGlzcGVyc2nDs24gZW50cmUgbG9zIGdydXBvcy4NCg0KRW4gdMOpcm1pbm9zIGRlIHBhw61zZXMgc8OtIGVzIGRlc2VhYmxlIHF1ZSBzZSBwdWVkYSBjb250YXIgY29uIGhldGVyb2dlbmVpZGFkIGVudHJlIHBhcmEgcG9kZXIgY29udGFyIGNvbiB1bmEgZm9ybWEgZGUgY29tcGFyYWNpw7NuIGVudHJlIGxvcyBncnVwb3MuDQoNCmBgYHtyfQ0KcGxvdG1lYW5zKFNQLkRZTi5MRTAwLklOIH4gZGF0ZSwgZGF0YSA9IHBhbmVsX3NhbHVkLCBuLmxhYmVsPUZBTFNFLCBtYWluPSAiSGV0ZXJvZ2VuZWlkYWQgZW50cmUgYcOxb3MiKQ0KYGBgDQoNCkVuIHTDqXJtaW5vcyBkZSBsb3MgYcOxb3MsIHNlIHB1ZWRlIG9ic2VydmFyIHF1ZSBzaSB0aWVuZSBwaWNvcyBwZXJvIGRlIHVuYSBtYW5lcmEgdW4gcG9jbyBtw6FzIGNvbnNpc3RlbnRlIGVudHJlIGxhcyBkw6ljYWRhcy4gTG9zIGludGVydmFsb3MgZGUgY29uZmlhbnphIHRhbWJpw6luIHZhcsOtYW4gZW50cmUgbGFzIGTDqWNhZGFzIGF1bnF1ZSBubyBlbiBncmFuIG1hbmVyYS4gRW4gZWwgbWlzbW8gY2FzbyBjb21vIGVudHJlIHBhw61zZXMsIGxvcyBhw7FvcyBwcmVzZW50YW4gaGV0ZXJvZ2VuZWlkYWQuDQoNCiMgRWplcmNpY2lvIDMuIE1vZGVsb3MgY29uIEluZGljYWRvcmVzIGRlbCBCYW5jbyBNdW5kaWFsDQoNClNpZ3VpZW5kbyBjb24gbGEgaW5mb3JtYWNpw7NuIHByZXNlbnRhZGEgZW4gbG9zIHBhc29zIGFudGVyaW9yZXMsIHNlIHNlZ3VpcsOhIHRyYWJhamFuZG8gY29uIGVsIG1vZGVsYW1pZW50byBkZSB1bmEgcmVncmVzacOzbiBwYXJhIHByZWRlY2lyIGxhIGVzcGVyYW56YSBkZSB2aWRhIGVuIGHDsW9zIGVuIGRpZmVyZW50ZXMgcGHDrXNlcyBhIGJhc2UgZGUgZGlmZXJlbnRlcyBpbmRpY2Fkb3JlcyBkZSBkaWZlcmVudGVzIMOtbmRvbGVzIGNvbW8gZWNvbsOzbWljb3MsIGRlIHNhbHVkIHkgZGUgcG9ibGFjacOzbi4NCg0KIyMgTW9kZWxhZG8NCg0KIyMjIDEuIFJlZ3Jlc2nDs24gYWdydXBhZG8gKHBvb2xlZCkNCg0KYGBge3J9DQoNCnBvb2xlZDwtIHBsbShTUC5EWU4uTEUwMC5JTiB+IEVOLlBPUC5ETlNUKw0KICAgICAgICAgICAgICBOWS5HRFAuUENBUC5DRCsNCiAgICAgICAgICAgICAgU0guSU1NLklEUFQrDQogICAgICAgICAgICAgIFZDLklIUi5QU1JDLlA1LCANCiAgICAgICAgICAgICBkYXRhID0gcGFuZWxfc2FsdWQsIA0KICAgICAgICAgICAgIG1vZGVsID0gInBvb2xpbmciKQ0KDQoNCnN1bW1hcnkocG9vbGVkKQ0KYGBgDQoNCkVuIGVzdGUgbW9kZWxvIHNlIHB1ZWRlIG9ic2VydmFyIGNvbW8gZXMgcXVlIGVsIFBJQiBwZXIgY8OhcGl0YSwgbGEgY2FudGlkYWQgZGUgbmnDsW9zIHF1ZSBzb24gdmFjdW5hZG9zIHkgZWwgw61uZGljZSBkZSBob21pY2lkaW9zIGludGVuY2lvbmFsZXMsIHNvbiBzaWduaWZpY2F0aXZvcyBwYXJhIHByZWRlY2lyIGxhIGVzcGVyYW56YSBkZSB2aWRhIGVuIGHDsW9zLiBFc3RhcyB2YXJpYWJsZXMgc29uIHNpZ25pZmljYXRpdmFzIGFsIG1lbm9zIGNvbiB1biA5NSUgZGUgbml2ZWwgZGUgY29uZmlhbnphLCBlbCBtb2RlbG8gY29tbyB0YWwgZXhwbGljYSAoZGUgbWFuZXJhIGFqdXN0YWRhKSBlbCA3OS4yOCUgZGUgbGEgdmFyaWFuemEgZGUgbG9zIGRhdG9zLg0KDQojIyMgMi4gRWZlY3RvcyBGaWpvcyAod2l0aGluKQ0KDQpgYGB7cn0NCg0Kd2l0aGluPC0gcGxtKFNQLkRZTi5MRTAwLklOIH4gRU4uUE9QLkROU1QrDQogICAgICAgICAgICAgIE5ZLkdEUC5QQ0FQLkNEKw0KICAgICAgICAgICAgICBTSC5JTU0uSURQVCsNCiAgICAgICAgICAgICAgVkMuSUhSLlBTUkMuUDUsIA0KICAgICAgICAgICAgIGRhdGEgPSBwYW5lbF9zYWx1ZCwgDQogICAgICAgICAgICAgbW9kZWwgPSAid2l0aGluIikNCg0KDQpzdW1tYXJ5KHdpdGhpbikNCg0KYGBgDQpQYXJhIGVsIGNhc28gZGUgd2l0aGluLCBzZSBwdWVkZSBvYnNlcnZhciBjb21vIGVzIHF1ZSBzZSB0aWVuZW4gMyB2YXJpYWJsZXMgc2lnbmlmaWNhdGl2YXMgcGFyYSBwb2RlciBwcm9ub3N0aWNhciBsYSBlc3BlcmFuemEgZGUgdmlkYSBlbiBhw7FvcywgZW4gZXNwZWPDrWZpY28gZWwgUElCIHBlciBjw6FwaXRhLCBlbCDDrW5kaWNkZSBkZSBuacOxb3MgcXVlIGVzdGFuIHZhY3VuYWRvcyB5IGVsIMOtbmRpY2UgZGUgaG9taWNpZGlvcyBpbnRlbmNpb25hZG9zLiBQcmVzZW50YSB1biBidWVuIG1vZGVsbyBhdW5xdWUgcG9kcsOtYSB0ZW5lciBtZWpvciBkZXNlbXBlw7FvLiANCg0KIyMjIFBydWViYSBQRg0KDQpgYGB7cn0NCnBGdGVzdCh3aXRoaW4sIHBvb2xlZCkNCg0KYGBgDQoNCkN1YW5kbyBhcGFyZWNlIGNvbW8gYWx0ZXJuYXRpdmUgaHlwb3RoZXNpczogc2lnbmlmaWNhbnQgZWZmZWN0cyBzZSB0aWVuZSBxdWUgZXNjb2dlciBlbCBtZWpvciBtb2RlbG8gZGUgbG9zIGRvcyBwdWVzdG8gcXVlIHVubyB0aWVuZSBtZWpvciBjb21wb3J0YW1pZW50byBxdWUgZWwgb3Ryby4gU2kgdHV2aWVyYSBub24tc2lnbmlmaWNhbiBlZmZlY3RzIHB1ZWRvIHV0aWxpemFyIGFtYm9zIG1vZGVsb3Mgc2luIHRlbWEuIFBvciBlc3RhIHJhesOzbiwgZXMgcXVlIGVuIGVzdGUgY2FzbyBzYWJlbW9zIHF1ZSBoYXkgdW4gbWVqb3IgbW9kZWxvIGVudHJlIGxvcyBkb3MgcHJvcHVlc3RvcywgeSBiYXNhbmRvIGxhIGRlY2lzacOzbiBlbiBsYXMgbcOpdHJpY2FzIHByZXNlbnRhZGFzIHNlIHNlbGVjY2lvbmEgZWwgbW9kZWxvICoqcG9vbGVkKiouDQoNCiMjIDMuIE1vZGVsbyBhbGVhdG9yaW8gKHJhbmRvbSkNCg0KIyMjIFdhbGh1cw0KDQpgYGB7cn0NCndhbGh1czwtIHBsbShTUC5EWU4uTEUwMC5JTiB+IEVOLlBPUC5ETlNUKw0KICAgICAgICAgICAgICBOWS5HRFAuUENBUC5DRCsNCiAgICAgICAgICAgICAgU0guSU1NLklEUFQrDQogICAgICAgICAgICAgIFZDLklIUi5QU1JDLlA1LCANCiAgICAgICAgICAgICBkYXRhID0gcGFuZWxfc2FsdWQsIA0KICAgICAgICAgICAgIG1vZGVsID0gInJhbmRvbSIsDQogICAgICAgICAgICAgcmFuZG9tLm1ldGhvZCA9ICJ3YWxodXMiKQ0KDQoNCnN1bW1hcnkod2FsaHVzKQ0KYGBgDQoNClBhcmEgZWwgbW9kZWxvIFdhbGh1cyBzZSBwdWVkZSBvYnNlcnZhciBjb21vIGVzIHF1ZSBzZSB0aWVuZSBxdWUgUElCIHBlciBjw6FwaXRhIHkgZWwgw61uZGljZSBkZSBob21pY2lkaW9zIGludGVuY2lvbmFsZXMgc29uIGxhcyDDum5pY2FzIHZhcmlhYmxlcyBzaWduaWZpY2F0aXZhcyBwYXJhIHBvZGVyIHByZWRlY2lyIGxhIGVzcGVyYW56YSBkZSB2aWRhIGVuIGHDsW9zLCBlc3RhcyBkb3MgdmFyaWFibGVzIGNvbiB1biDDrW5kaWNlIGRlIGNvbmZpYW56YSBkZWwgOTklLiBFbCBtb2RlbG8gdGllbmUgdW5hIGV4cGxpY2FjacOzbiBkZWwgNjguODIlIGRlIGxhIHZhcmlhbnphIGRlIGxvcyBkYXRvcywgbG8gY3VhbCBwb2Ryw61hIGRlY2lyIHF1ZSBubyBzZXLDrWEgZWwgbWVqb3IgbW9kZWxvIHBhcmEgcmVhbGl6YXIgdW5hIHByZWRpY2Npw7NuIHBlciB0YW1wb2NvIHNlcsOtYSBlbCBwZW9yLg0KDQojIyMjIyMgQW1lbWl5YQ0KDQpgYGB7cn0NCmFtZW1peWE8LSBwbG0oU1AuRFlOLkxFMDAuSU4gfiBFTi5QT1AuRE5TVCsNCiAgICAgICAgICAgICAgTlkuR0RQLlBDQVAuQ0QrDQogICAgICAgICAgICAgIFNILklNTS5JRFBUKw0KICAgICAgICAgICAgICBWQy5JSFIuUFNSQy5QNSwgDQogICAgICAgICAgICAgZGF0YSA9IHBhbmVsX3NhbHVkLCANCiAgICAgICAgICAgICBtb2RlbCA9ICJyYW5kb20iLA0KICAgICAgICAgICAgIHJhbmRvbS5tZXRob2QgPSAiYW1lbWl5YSIpDQoNCg0Kc3VtbWFyeShhbWVtaXlhKQ0KYGBgDQoNCkVuIGVsIGNhc28gZGUgYW1lbWl5YSBzZSBjdWVudGEgY29uIHVuIHVuIGNvbXBvcnRhbWllbnRvIHNpbWlsYXIsIHNlIHRpZW5lIGNvbW8gZXMgcXVlIGVsIFBJQiBwZXIgY8OhcGl0YSB5IGVsIMOtbmRpY2UgZGUgaG9taWNpZGlvcyBpbnRlbmNpb25hbGVzIHNvbiB2YXJpYWJsZXMgc2lnbmlmaWNhdGl2YXMgcGFyYSBsYSBwcmVkaWNjacOzbiBvIHByb27Ds3N0aWNvIGRlIGxhIGVzcGVyYW56YSBkZSB2aWRhIGVuIGHDsW9zIGF1bnF1ZSBjb24gdW4gbWVub3Igw61uZGljZSBkZSBjb25maWFuemEgZW4gZWwgUElCIHBlciBjw6FwaXRhLiBFbCBtb2RlbG8gZXhwbGljYSBzb2xvIGVsIDYxLjQ3JSBkZSBsYSB2YXJpYW56YSBkZSBsb3MgZGF0b3MuDQoNCiMjIyMjIyBOZXJsb3ZlDQoNCmBgYHtyfQ0KbmVybG92ZTwtIHBsbShTUC5EWU4uTEUwMC5JTiB+IEVOLlBPUC5ETlNUKw0KICAgICAgICAgICAgICBOWS5HRFAuUENBUC5DRCsNCiAgICAgICAgICAgICAgU0guSU1NLklEUFQrDQogICAgICAgICAgICAgIFZDLklIUi5QU1JDLlA1LCANCiAgICAgICAgICAgICBkYXRhID0gcGFuZWxfc2FsdWQsIA0KICAgICAgICAgICAgIG1vZGVsID0gInJhbmRvbSIsDQogICAgICAgICAgICAgcmFuZG9tLm1ldGhvZCA9ICJuZXJsb3ZlIikNCg0KDQpzdW1tYXJ5KG5lcmxvdmUpDQpgYGANCg0KRGVudHJvIGRlbCBtb2RlbG8gZGUgTmVybG92ZSwgbGFzIHZhcmlhYmxlcyBzaWduaWZpY2F0aXZhcyBwYXJhIHByb25vc3RpY2FyIGxhIGVzcGVyYW56YSBkZSB2aWRhIGVuIGHDsW9zIHNlIGluY3JlbWVudGEgcGVybyBkaXNtaW51eWVuZG8gc3Ugbml2ZWwgZGUgY29uZmlhbnphLCBzZSBwcmVzZW50YW4gY29tbyBzaWduaWZpY2F0aXZhcyBlbCBQSUIgcGVyIGPDoXBpdGEgZGVsIHBhw61zIGFzw60gY29tbyBsYSBkZW5zaWRhZCBkZSBwb2JsYWNpw7NuIChhbWJhcyBjb24gdW4gOTAlIGRlIG5pdmVsIGRlIGNvbmZpYW56YSksIHkgZWwgw61uZGljZSBkZSBob21pY2lkaW9zIGludGVuY2lvbmFsZXMgY29uIHVuIDk5JSBkZSBjb25maWFuemEuIEVuIGN1YW50byBhbCBkZXNlbXBlw7FvIGRlbCBtb2RlbG8gc2UgcHVlZGUgb2JzZXJ2YXIgY29tbyBlcyBxdWUgZWwgNjIuNTElIGRlIGxhIHZhcmlhbnphIGRlIGxvcyBkYXRvcyBzaSBlc3TDoSBzaWVuZG8gZXhwbGljYWRhIHBvciBlbCBtb2RlbG8uDQoNCiMjIFBydWViYSBIYXVzbWFuDQoNCmBgYHtyfQ0KcGh0ZXN0KG5lcmxvdmUsIHBvb2xlZCkNCmBgYA0KDQpFc3RlIHRlc3QgZGljZSBxdWUgZW50cmUgbG9zIGRvcyBtb2RlbG9zIGV2YWx1YWRvcyBzZSB0aWVuZW4gaW5jb25zaXN0ZW5jaWFzIGVudHJlIGVsIGRlc2VtcGXDsW8sIGVudG9uY2VzIGVzIG5lY2VhcmlvIGVzY29nZXIgdW5vIGRlIGxvcyBkZW3DoXMuIERlIGFtYm9zIG1vZGVsb3MgKGZpam9zIHkgYWxlYXRvcmlvcykwc2Ugc2VsZWNjaW9uYSBlbG1vZGVsbyBhbGVhdG9yaW8gZGUgbmVybG92ZSBwdWVzdG8gcXVlIGN1ZW50YSBjb24gbWVqb3JlcyBtw6l0cmljYXMgZGUgZXhwbGljYWNpw7NuIGRlIGxhIHZhcmlhbnphLiANCg0KIyBUYXJlYSAzLiBQYXRlbnRlcw0KDQpQYXJhIGVzdGUgZWplcmNpY2lvIHNlIHByZXNlbnRhIHVuYSBiYXNlIGRlIGRhdG9zIHF1ZSBpbmNsdXllIGRpZmVyZW50ZXMgZW1wcmVzYXMgZW4gZGlzdGludG9zIHBlcmlvZG9zIGRlIHRpZW1wbyAobG8gY3VhbCBwZXJtaXRlIHRlbmVyIGRhdG9zIHBhbmVsKSBjb24gZGF0b3MgZGVtb2dyw6FmaWNvcyB5IGZpbmFuY2llcm9zIGRlIGxhcyBlbXByZXNhcyBwYXJhIGRldGVybWluYXIgbGEgY2FudGlkYWQgZGUgcGF0ZW50ZXMgYXByb2JhZGFzLg0KDQoqKkRlc2NyaXBjacOzbiBkZSBsYXMgdmFyaWFibGVzKioNCg0KIC0gY3VzaXA6IGZpcm0gaWRlbnRpZmllcg0KDQogLSBtZXJnZXI6ID0xIGlmIG1ham9yIG1lcmdlcsKgDQoNClwtIGVtcGxveTogZW1wbG95ZWVzIGluIDEwMDBzwqANCg0KXC0gcmV0dXJuOiByZXR1cm4gb24gc3RvY2ssICXCoA0KDQpcLSBwYXRlbnRzOiBwYXRlbnRzIGFwcGxpZWQgZm9ywqANCg0KXC0gcGF0ZW50c2c6IHBhdGVudHMgZ3JhbnRlZMKgDQoNClwtIHN0Y2twcjogcHJpY2UgY29tbW9uIHN0b2NrwqANCg0KXC0gcm5kOiBSJkQgZXhwZW5kLCBjdXJyZW50IG1pbGwgXCTCoA0KDQpcLSBybmRlZmx0OiBSJkQgZXhwZW5kLCAxOTcyIG1pbGwgXCTCoA0KDQpcLSBybmRzdGNrOiBzdG9jayBvZiBSJkTCoA0KDQpcLSBzYWxlczogc2FsZXMsIGN1cnJlbnQgbWlsbC4gXCTCoA0KDQpcLSBzaWM6IDQgZGlnaXQgaW5kdXN0cnnCoA0KDQpcLSB5ZWFyOiA3MiB0aHJvdWdoIDgxwqANCg0KIyMjIyBDYXJnYSBkZSBkYXRvcw0KDQpgYGB7cn0NCnBhdGVudHM8LSByZWFkLmNzdigiQzovVXNlcnMvQXN0cmlkIEdvbnphbGV6L0RvY3VtZW50cy9VTklWRVJTSURBRC9PQ1RBVk8vUEFURU5UIDMuY3N2IikNCnBhdGVudHM8LSBwYXRlbnRzWywxOjEzXQ0Ka2FibGUoaGVhZChwYXRlbnRzKSkgJT4lIGthYmxlX2NsYXNzaWMoKQ0KYGBgDQoNCmBgYHtyfQ0KcGF0ZW50czwtIHBkYXRhLmZyYW1lKHBhdGVudHMsIGluZGV4ID0gYygiY3VzaXAiLCAieWVhciIpKQ0KYGBgDQoNCmBgYHtyfQ0Kc3RyKHBhdGVudHMpDQpgYGANCg0KIyMjIyBUcmFuc2Zvcm1hY2nDs24gZGUgdmFyaWFibGVzDQoNCmBgYHtyfQ0KcGF0ZW50cyR5ZWFyPC0gYXMuZmFjdG9yKHBhdGVudHMkeWVhcikNCnBhdGVudHMkc2ljIDwtIGFzLmZhY3RvcihwYXRlbnRzJHNpYykNCnBhdGVudHMkbWVyZ2VyPC0gYXMuZmFjdG9yKHBhdGVudHMkbWVyZ2VyKQ0KcGF0ZW50cyRjdXNpcDwtIGFzLmZhY3RvcihwYXRlbnRzJGN1c2lwKQ0KDQpzdHIocGF0ZW50cykNCmBgYA0KDQojIyMjIFZpc3VhbGl6YWNpw7NuIGRlIHZhbG9yZXMgTnVsb3MNCg0KYGBge3J9DQp2aXNfZGF0KHBhdGVudHMpDQoNCnZpc19taXNzKHBhdGVudHMpDQpgYGANCg0KQ29tbyBzZSBwdWVkZSBvYnNlcnZhciwgc2UgY3VlbnRhIGNvbiB2YWxvcmVzIG51bG9zIGVuIHVuIDAuNyUsIGRlYmlkbyBhIHN1IGJhamEgY29uY2VudHJhY2nDs24gZGUgdmFsb3JlcyBmYWx0YW50ZXMsIHNlIHRvbWEgbGEgZGVjaXNpw7NuIGRlIHJlYWxpemFyIHVuYSBpbXB1dGFjacOzbiBkZSBkYXRvcyBwdWVzdG8gc2UgZW5jdWVudHJhIHRvZGF2w61hIGVuIHZhbG9yZXMgYWNlcHRhYmxlcyBwYXJhIGltcHV0YXIuDQoNCmBgYHtyfQ0KY29sU3Vtcyhpcy5uYShwYXRlbnRzKSkNCmBgYA0KDQojIyMjIEltcHV0YWNpw7NuIGRlIGRhdG9zDQoNCmBgYHtyfQ0Kc2V0LnNlZWQoMTIzKQ0KcGF0ZW50c19taWNlZDwtIG1pY2UocGF0ZW50cywgbT01LCBtYXhpdD01LCBtZXRob2QgPSAiY2FydCIpDQpwYXRlbnRzPC0gY29tcGxldGUocGF0ZW50c19taWNlZCkNCmBgYA0KDQpgYGB7cn0NCnZpc19taXNzKHBhdGVudHMpDQpgYGANCg0KRGVzcHXDqXMgZGUgbGEgaW1wdXRhY2nDs24geWEgc2UgY3VlbnRhIGNvbiBlbCAxMDAlIGRlIGxvcyBkYXRvcyBwYXJhIGNvbWVuemFyIGEgdHJhbnNmb3JtYXIgeSBtb2RlbGFyLg0KDQojIyMjIFRyYW5zb2ZybWFjacOzbiBkZSBkYXRvcw0KDQpQYXJhIHNvbHVjaW9uYXIgcXVlIGVsIHNpc3RlbWEgcmVjb25vY2llcmEgYSBsYSB2YXJpYWJsZSBlbXBsb3kgY29tbyBuw7ptZXJpY2Egc2UgZGVjaWRpw7MgZ2VuZXJhciB1bmEgbnVldmEgY29sdW1uYS4NCg0KYGBge3J9DQpwYXRlbnRzPC0gcGF0ZW50cyAlPiUgbXV0YXRlKGVtcGxveWVlPSBlbXBsb3kqMSkNCg0KaGVhZChwYXRlbnRzKQ0KYGBgDQoNCiMjIyMgQW7DoWxpc2lzIGRlIGNvcnJlbGFjacOzbg0KDQpgYGB7cn0NCnBhdGVudF9udW1lcmljPC0gRmlsdGVyKGlzLm51bWVyaWMsIHBhdGVudHMpICU+JSBzZWxlY3QoLWVtcGxveSkNCnBhdGVudF9jb3I8LSBjb3IocGF0ZW50X251bWVyaWMpDQoNCmNvcnJwbG90KHBhdGVudF9jb3IsbWV0aG9kID0gJ2NvbG9yJywgb3JkZXIgPSAnYWxwaGFiZXQnLCB0eXBlID0gJ2xvd2VyJykNCmBgYA0KDQpUb21hbmRvIGVuIGN1ZW50YSBlbCBhbsOhbGlzaXMgZGUgY29ycmVsYWNpw7NuIGRlIHZhcmlhYmxlcywgc2VsZWNjaW9uYW1vcyBhcXVlbGxhcyBxdWUgZXN0YXLDrWFuIHJlbGFjaW9uYWRhcyBhIGxhIGNhbnRpZGFkIGRlIHBhdGVudGVzIGF1dG9yaXphZGFzIHF1ZSBzZSB0aWVuZW4gZW4gbGFzIGVtcHJlc2FzIGEgdW4gbml2ZWwgZGVsIDAuNCB5IHN1cGVyaW9yLg0KDQojIyMjIFNlbGVjY2nDs24gZGUgdmFyaWFibGVzDQoNCmBgYHtyfQ0KcGF0ZW50czE8LSBwYXRlbnRzICU+JSBzZWxlY3QoYyhwYXRlbnRzZyxybmQsIHJuZGVmbHQsIHJuZHN0Y2ssIHNhbGVzLCBlbXBsb3llZSwgcGF0ZW50cywgeWVhciwgY3VzaXApKQ0KcGF0ZW50czI8LSBwYXRlbnRzICU+JSBzZWxlY3QoYyhwYXRlbnRzZyxybmQsIHJuZGVmbHQsIHJuZHN0Y2ssIHNhbGVzLCBzdGNrcHIsIGVtcGxveWVlLCBwYXRlbnRzLCB5ZWFyLCBjdXNpcCkpDQpwYXRlbnRzMzwtIHBhdGVudHMgJT4lIHNlbGVjdChjKHBhdGVudHNnLCBybmRlZmx0LCBybmRzdGNrLCBzYWxlcywgcGF0ZW50cywgZW1wbG95ZWUsIHllYXIsIGN1c2lwKSkNCmBgYA0KDQojIyMjIFB1ZWJhIGRlIGhldGVyb2dlbmVpZGFkDQoNCmBgYHtyfQ0KcGxvdG1lYW5zKHBhdGVudHNnIH4gY3VzaXAsIGRhdGEgPSBwYXRlbnRzMiwgbi5sYWJlbD1GQUxTRSwgbWFpbj0gIkhldGVyb2dlbmVpZGFkIGVudHJlIGVtcHJlc2FzIikNCmBgYA0KDQpTZSBwdWVkZSBvYnNlcnZhciBjb21vIGVzIHF1ZSBlbnRyZSBsYXMgZW1wcmVzYXMgc2kgc2UgY3VlbnRhIGNvbiB1bmEgaGV0ZXJvZ2VuZWlkYWQgcHVlc3RvIGxhIGzDrW5lYSBkZSBsb3MgcHJvbWVkaW9zIG5vIHNlIG1hbnRpZW5lIGNvbnN0YW50ZSwgc2UgdGllbmVuIHBpY29zIGltcG9ydGFudGVzIGNvbiB1bmEgZ3JhbiBlbGV2YWNpw7NuLCBhc8OtIGNvbW8gbG9zIHJhbmdvcyBkZSBjb25maWFuemEuDQoNCmBgYHtyfQ0KcGxvdG1lYW5zKHBhdGVudHNnIH4geWVhciwgZGF0YSA9IHBhdGVudHMyLCBuLmxhYmVsPUZBTFNFLCBtYWluPSAiSGV0ZXJvZ2VuZWlkYWQgZW50cmUgYcOxb3MiKQ0KYGBgDQoNCkVuIHTDqXJtaW5vcyBkZSBhw7FvcyBzZSBwdWVkZSBvYnNlcnZhciBjb21vIHRhbWJpw6luIHNlIGN1ZW50YSBjb24gaGV0ZXJvZ2VuZWlkYWQgYWwgbm8gY29udGFyIGNvbiB1bmEgbMOtbmVhIGNvbnN0YW50ZSBhdW5xdWUgbm8gcHJlc2VudGEgdGFudGEgdmFyaWFjacOzbiAobyBlbiBtYWduaXR1ZGVzIG11eSBhbHRhcykuIExvcyByYW5nb3MgZGUgY29uZmlhbnphIGFwYXJlbnRhbiB0ZW5lciB1bmEgYXBlcnR1cmEgc2ltaWxhci4NCg0KIyMgTW9kZWxhZG8NCg0KUGFyYSBlbCBtb2RlbGFkbyBzZSBnZW5lcmFyb24gMiBiYXNlcyBkZSBkYXRvcyBkaWZlcmVudGVzIHBhcmEgcmVhbGl6YXIgbGEgZXZhbHVhY2nDs24gZGUgbGEgZGVjaXNpw7NuIHByZXNlbnRhZGEgZW4gbGFzIHZhcmlhYmxlcyBkZSBjb3JyZWxhY2nDs24uIEEgZXN0byBzZSBsZSBkZW5vbWluw7MgY29tbyBwYXRlbnRzMSB5IHBhdGVudHMzLg0KDQojIyMgUG9vbGVkDQoNCiMjIyMgUGF0ZW50czENCg0KYGBge3J9DQpwb29sZWQ8LSBwbG0ocGF0ZW50c2d+cm5kKw0KICAgICAgICAgICAgICAgcm5kZWZsdCsNCiAgICAgICAgICAgICAgIHJuZHN0Y2srDQogICAgICAgICAgICAgICBzYWxlcysNCiAgICAgICAgICAgICAgIGVtcGxveWVlLCANCiAgICAgICAgICAgICAgIGRhdGE9cGF0ZW50X251bWVyaWMsIG1vZGVsID0icG9vbGluZyIpDQpzdW1tYXJ5KHBvb2xlZCkNCmBgYA0KDQpQYXJhIGVzdGUgcHJpbWVyIG1vZGVsbyBzZSBwcmVzZW50YW4gdG9kYXMgbGFzIHZhcmlhYmxlcyBjb21vIHNpZ25pZmljYXRpdmFzIHBhcmEgZWwgcHJvbsOzc3RpY28gZGUgcGF0ZW50ZXMgYWNlcHRhZGFzIHBhciBhbGFzIGVtcHJlc2FzIGNvbiB1biBuaXZlbCBkZSBjb25maWFuemEgaWd1YWwgbyBtYXlvciBhIDk5JS4gQXVucXVlIHNlIHBvZHLDrWEgZGVjaXIgcXVlIGVsIG1vZGVsbyBubyB0aWVuZSB1biBncmFuIGRlc2VtcGXDsW8gcHVlc3RvIHJlcHJlc2VudGEgc29sbyBlbCA1Ny4xNiUgZGUgbGEgdmFyaWFuemEgZGUgbG9zIGRhdG9zLg0KDQojIyMjIFBhdGVudHMzDQoNCmBgYHtyfQ0KcG9vbGVkPC0gcGxtKHBhdGVudHNnfnJuZGVmbHQrDQogICAgICAgICAgICAgICBybmRzdGNrKw0KICAgICAgICAgICAgICAgc2FsZXMrDQogICAgICAgICAgICAgICBlbXBsb3llZSwgDQogICAgICAgICAgICAgICBkYXRhPXBhdGVudF9udW1lcmljLCBtb2RlbCA9InBvb2xpbmciKQ0Kc3VtbWFyeShwb29sZWQpDQpgYGANCg0KUGFyYSBsYSBzZWd1bmRhIHNlbGVjY2nDs24gZGUgdmFyaWFibGVzIHNlIG9ic2VyY2EgY29tbyBsYXMgdmVudGFzIHkgbGEgY2FudGlkYWQgZGUgZW1wbGVhZG9zIHNvbiBsYXMgc2lnbmlmaWNhdGl2YXMgcGFyYSBwb2RlciBwcm9ub3N0aWNhciBsYXMgcGF0ZW50ZXMgb3RvcmdhZGFzLCBleHBsaWNhbmRvIG1lbm9zIGRlIHZhcmlhbnphIHF1ZSBsYSBiYXNlIGRlIGRhdG9zIGFudGVyaW9yLg0KDQojIyMgV2l0aGluDQoNCiMjIyMgUGF0ZW50czENCg0KYGBge3J9DQp3aXRoaW4xPC0gcGxtKHBhdGVudHNnfnJuZCsNCiAgICAgICAgICAgICAgIHJuZGVmbHQrDQogICAgICAgICAgICAgICBybmRzdGNrKw0KICAgICAgICAgICAgICAgc2FsZXMrDQogICAgICAgICAgICAgICBlbXBsb3llZSwgDQogICAgICAgICAgICAgICBkYXRhPXBhdGVudF9udW1lcmljLCBtb2RlbCA9IndpdGhpbiIpDQpzdW1tYXJ5KHdpdGhpbjEpDQpgYGANCg0KUGFyYSBlbCBjYXNvIGRlIHdpdGhpbiBkZSBsYSBwcmltZXJhIGJhc2UgZGUgZGF0b3Mgc2UgcHJlc2VudGEgZGUgbnVldm8gY29tbyBlcyBxdWUgdG9kYXMgbGFzIHZhcmlhYmxlcyBzb24gc2lnbmlmaWNhdGl2YXMgY29uIHVuYSBSIGFqdXN0YWRhIGRlbCA1NS42NCUuDQoNCiMjIyMgUGF0ZW50czMNCg0KYGBge3J9DQp3aXRoaW4zPC0gcGxtKHBhdGVudHNnfnJuZGVmbHQrDQogICAgICAgICAgICAgICBybmRzdGNrKw0KICAgICAgICAgICAgICAgc2FsZXMrDQogICAgICAgICAgICAgICBlbXBsb3llZSwgDQogICAgICAgICAgICAgICBkYXRhPXBhdGVudF9udW1lcmljLCBtb2RlbCA9IndpdGhpbiIpDQpzdW1tYXJ5KHdpdGhpbjMpDQpgYGANCg0KRW4gbGEgc2VndW5kYSBiYXNlIGRlIGRhdG9zIHNlIHNpZ3VlbiBtYW50ZW5pZW5kbyBsYXMgdmFyaWFibGVzIHNpZ25pZmljYXRpdmFzIGF1bnF1ZSBzdSBleHBsaWNhY2nDs24gZGUgbGEgdmFyaWFuemEgZGlzbWludXllLg0KDQojIyBBbGVhdG9yaW9zDQoNCiMjIyMgV2FsaHVzDQoNCioqUGF0ZW50cyAxKioNCg0KYGBge3J9DQp3YWxodXMxPC0gcGxtKHBhdGVudHNnfnJuZCsNCiAgICAgICAgICAgICAgIHJuZGVmbHQrDQogICAgICAgICAgICAgICBybmRzdGNrKw0KICAgICAgICAgICAgICAgc2FsZXMrDQogICAgICAgICAgICAgICBlbXBsb3llZSwgDQogICAgICAgICAgICAgICBkYXRhPXBhdGVudF9udW1lcmljLCANCiAgICAgICAgICAgICAgbW9kZWwgPSAicmFuZG9tIiwNCiAgICAgICAgICAgICByYW5kb20ubWV0aG9kID0gIndhbGh1cyIpDQpzdW1tYXJ5KHdhbGh1czEpDQpgYGANCg0KRGUgbnVldm8sIHBhcmEgbGEgcHJpbWVyYSBiYXNlIGRlIGRhdG9zIHNlIHByZXNlbnRhbiB0b2RhcyBsYXMgdmFyaWFibGVzIGNvbW8gc2lnbmlmaWNhdGl2YXMgcGFyYSBwcm9ub3N0aWNhciBsYXMgcGF0ZW50ZXMgb3RvcmdhZGFzIGNvbiB1bmEgbWVqb3IgZXhwbGljYWNpw7NuIGRlIGxhIHZhcmlhbnphLg0KDQojIyMjIFBhdGVudHMzDQoNCmBgYHtyfQ0Kd2FsaHVzMzwtIHBsbShwYXRlbnRzZ35ybmRlZmx0Kw0KICAgICAgICAgICAgICAgcm5kc3RjaysNCiAgICAgICAgICAgICAgIHNhbGVzKw0KICAgICAgICAgICAgICAgZW1wbG95ZWUsIA0KICAgICAgICAgICAgICAgZGF0YT1wYXRlbnRfbnVtZXJpYywgDQogICAgICAgICAgICAgIG1vZGVsID0gInJhbmRvbSIsDQogICAgICAgICAgICAgcmFuZG9tLm1ldGhvZCA9ICJ3YWxodXMiKQ0Kc3VtbWFyeSh3YWxodXMzKQ0KYGBgDQoNCkxhIHNlZ3VuZGEgYmFzZSBkZSBkYXRvcyBwcmVzZW50YSBsb3MgbWlzbW9zIHJlc3VsdGFkb3MgcXVlIGVuIHN1cyBtb2RlbG9zIGFudGVyaW9yZXMsIGNvbiBtYXlvciB2YXJpYW56YSBleHBsaWNhZGEgcG9yIGxvcyBkYXRvcyBwZXJvIGHDum4gbm8gc2UgcG9kcsOtYSBjb25zaWRlcmFyIGNvbW8gdW4gYnVlbiBtb2RlbG8uDQoNCiMjIyMgQW1lbWl5YQ0KDQoqKlBhdGVudHMgMSoqDQoNCmBgYHtyfQ0KYW1lbWl5YTE8LSBwbG0ocGF0ZW50c2d+cm5kKw0KICAgICAgICAgICAgICAgcm5kZWZsdCsNCiAgICAgICAgICAgICAgIHJuZHN0Y2srDQogICAgICAgICAgICAgICBzYWxlcysNCiAgICAgICAgICAgICAgIGVtcGxveWVlLA0KICAgICAgICAgICAgICAgZGF0YT1wYXRlbnRfbnVtZXJpYywNCiAgICAgICAgICAgICAgbW9kZWwgPSAicmFuZG9tIiwNCiAgICAgICAgICAgICByYW5kb20ubWV0aG9kID0gImFtZW1peWEiKQ0Kc3VtbWFyeShhbWVtaXlhMSkNCmBgYA0KDQpTaWd1aWVuZG8gbGEgbWlzbWEgcHJvZ3Jlc2nDs24sIHNlIHRpZW5lbiB0b2RhcyBsYXMgdmFyaWFibGVzIGNvbW8gc2lnbmlmaWNhdGl2YXMgY29uIHVuIGJ1ZW4gbml2ZWwgZGUgY29uZmlhbnphIHkgdW5hIGV4cGxpY2FjacOzbiBkZSBsYSB2YXJpYW56YSBtw6FzIGVsZXZhZGEgYXVucXVlIGHDum4gbWVub3IgcXVlIGNvbiBlbCBtb2RlbG8gUG9vbGVkLg0KDQojIyMjIFBhdGVudHMzDQoNCmBgYHtyfQ0KYW1lbWl5YTM8LSBwbG0ocGF0ZW50c2d+cm5kZWZsdCsNCiAgICAgICAgICAgICAgIHJuZHN0Y2srDQogICAgICAgICAgICAgICBzYWxlcysNCiAgICAgICAgICAgICAgIGVtcGxveWVlLA0KICAgICAgICAgICAgICAgZGF0YT1wYXRlbnRfbnVtZXJpYywNCiAgICAgICAgICAgICAgbW9kZWwgPSAicmFuZG9tIiwNCiAgICAgICAgICAgICByYW5kb20ubWV0aG9kID0gImFtZW1peWEiKQ0Kc3VtbWFyeShhbWVtaXlhMykNCmBgYA0KDQpEZW50cm8gZGUgbGEgYmFzZSBkZSBkYXRvcyBkZSBwYXRlbnRlcyAzIHNlIHB1ZWRlIG9ic2VydmFyIGVsIG1pc21vIGNvbXBvcnRhbWllbnRvIGRlIGNvbnRhciBzb2xvIGNvbiBzYWxlcyB5IGVtcGxveWVlIGNvbW8gdmFyaWFibGVzIHNpZ25pZmljYXRpdmFzIHBhcmEgZWwgcHJvbsOzc3RpY28sIGHDum4gY29uIHVuYSBleHBsaWNhY2nDs24gZGUgbGEgdmFyaWFuemEgYmFqYSBjb24gdW5hIHIgYWp1c3RhZGEgZGUgNTUuODIlLg0KDQojIyMjIE5lcmxvdmUNCg0KKipQYXRlbnRzIDEqKg0KDQpgYGB7cn0NCm5lcmxvdmUxPC0gcGxtKHBhdGVudHNnfnJuZCsNCiAgICAgICAgICAgICAgIHJuZGVmbHQrDQogICAgICAgICAgICAgICBybmRzdGNrKw0KICAgICAgICAgICAgICAgc2FsZXMrDQogICAgICAgICAgICAgICBlbXBsb3llZSwNCiAgICAgICAgICAgICAgIGRhdGE9cGF0ZW50X251bWVyaWMsDQogICAgICAgICAgICAgIG1vZGVsID0gInJhbmRvbSIsDQogICAgICAgICAgICAgcmFuZG9tLm1ldGhvZCA9ICJuZXJsb3ZlIikNCnN1bW1hcnkobmVybG92ZTEpDQpgYGANCg0KUGFyYSBlc3RlIG1vZGVsbyB1dGlsaXphbmRvIE5lcmxvdmUsIHNlIHB1ZWRlbiBvYnNlcnZhciB0b2RhcyBsYXMgdmFyaWFibGVzIGNvbW8gc2lnbmlmaWNhdGl2YXMgcGFyYSBlbCBwcm9uw7NzdGljbyBkZSBsYXMgcGF0ZW50ZXMgb3RvcmdhZGFzIGVuIHVuYSBlbXByZXNhLiBSZXByZXNlbnRhIHNvbG8gZWwgNTYuNyUgZGUgbGEgdmFyaWFuemEgZGUgbG9zIGRhdG9zLg0KDQpgYGB7cn0NCm5lcmxvdmUyPC0gcGxtKHBhdGVudHNnfnJuZGVmbHQrDQogICAgICAgICAgICAgICBybmRzdGNrKw0KICAgICAgICAgICAgICAgc2FsZXMrDQogICAgICAgICAgICAgICBlbXBsb3llZSwNCiAgICAgICAgICAgICAgIGRhdGE9cGF0ZW50X251bWVyaWMsDQogICAgICAgICAgICAgIG1vZGVsID0gInJhbmRvbSIsDQogICAgICAgICAgICAgcmFuZG9tLm1ldGhvZCA9ICJuZXJsb3ZlIikNCnN1bW1hcnkobmVybG92ZTIpDQpgYGANCg0KUGFyYSBsYSB0ZXJjZXJhIGJhc2UgZGUgZGF0b3Mgc2UgY3VlbnRhbiBsYXMgbWlzbWFzIDIgdmFyaWFibGVzIGNvbW8gc2lnbmlmaWNhdGl2YXMgcGFyYSBwb2RlciBwcm9ub3N0aWNhciBsYXMgcGF0ZW50ZXMgb3RvcmdhZGFzLCBjb24gdW4gNTUuMjMlIGRlIGxhIHZhcmlhbnphIHNpZW5kbyBleHBsaWNhZGEuDQoNCiMjIEV2YWx1Y2nDs24gZGUgbW9kZWxvDQoNCmBgYHtyfQ0KcEZ0ZXN0KHdpdGhpbiwgcG9vbGVkKQ0KDQpwaHRlc3Qod2FsaHVzMSwgcG9vbGVkKQ0KDQpgYGANCg0KU2UgY3VlbnRhIGNvbiBlZmVjdG9zIHNpZ25pZmljYXRpdm9zIGVudHJlIGxvcyBtb2RlbG9zIHByZXNlbnRhZG9zIGNvbW8gZmlqb3MgcG9yIGxvIHRhbCBzZSBwb2Ryw61hIG1lbmNpb25hciBxdWUgZWwgbWVqb3IgbW9kZWxvIGRlIGxvcyBkb3MgKHRvbWFuZG8gZW4gY3VlbnRhIHNvbG8gbGEgYmFzZSBkZSBkYXRvcyAxIHF1ZSBmdWUgcXVpZW4gb2J0dXZvIHVuIG1lam9yIGRlc2VtcGXDsW8gZW4gZ2VuZXJhbCkgZW4gbGFzIG3DqXRyaWNhcyBkZSBjYW50aWRhZCBkZSB2YXJpYWJsZXMgc2lnbmlmaWNhdGl2YXMsIGxhIHByb3BvcmNpw7NuIGRlIGxhIHZhcmlhbnphIHNpZW5kbyBleHBsaWNhZGEgcG9yIGVsIG1vZGVsbyBlIGluY2x1c28gbG9zIMOtbmRpY2VzIGRlIGNvbmZpYW56YSBwcmVzZW50YWRvcy4NCg0KQ29tbyBsYSBwcnVlYmEgZGUgSGF1c21hbiBwcmVzZW50YSBpbmNvbnNpc3RlbmNpYXMgZW50cmUgbG9zIG1vZGVsb3MgZW50b25jZXMgc2UgZGViZSBzZWxlY2Npb25hciBhbGd1bm8gcXVlIGVzdMOpIHRlbmllbmRvIGVsIG1lam9yIGRlc21lcGXDsW8uIEVuIGVzdGUgY2FzbyBlbCBtb2RlbG8gcXVlIHNlIHNlbGVjY2lvbmEgZXMgZWwgbcOpdG9kbyBhZ3J1cGFkbyBkZSBsb3MgZmlqb3MgcHVlc3RvIGZ1ZSBlbCBxdWUgZXhwbGljbyBsYSBtYXlvciBwcm9wb3JjacOzbiBkZSB2YXJpYW56YSBlbiBlbCBtb2RlbG8uIFNlIHB1ZWRlIHJlY29ub2NlciBxdWUgbyBzZSB0aWVuZSB1biBtZWpvciBkZXNlbXBlw7FvIGRlbCBtb2RlbG8gcHVlc3RvIHF1ZSBzZSBkZWNpZGnDsyBleGNsdWlyIGxhIHZhcmlhYmxlcyBkZSBwYXRlbnRlcyBzb2xpY2l0YWRhcyBwYXJhIHN1IG90b3JnYWNpw7NuLCBlc3RvIGRlYmlkbyBhIHF1ZSBlcyB1bmEgdmFyaWFibGUgYWx0YW1lbnRlIGNvcnJlbGFjaW9uYWRhIHF1ZSBlbiBsdWdhciBkZSB0cmFlciBiZW5lZmljaW9zIGFsIG1vZGVsbyBwYXJhIGV4cGxpY2FyIGVsIGNvbXBvcnRhbWllbnRvIG5lY2VzYXJpbyBvIGNvbW8gY2llcnRhcyB2YXJpYWJsZXMgYWZlY3RhbiAoZW4gcXVlIG1hZ25pdHVkIHkgZGlyZWNjacOzbikgYSBsYSBvdG9yZ2FjacOzbiBkZSBwYXRlbnRlcywgbcOhcyBhbGxhIHF1ZSBsYSBjYW50aWRhZCBkZSBwYXRlbnRlcyBwcmVzZW50YWRhcy4gDQoNCg==