SECCIÓN A: Fundamentos de R

BLOQUE 1: Introducción a R

El objetivo de esta sesión es identificar el ambiente de trabajo de R, sus componentes y los objetos de trabajo.

  1. Instalación de R. https://cran.r-project.org
  2. Ambiente de trabajo: Consola y script.
  3. Objetos en R: Vectores, dataframes, matrices, listas, funciones

Algunos vectores de numéricos:

3
c(2, 3)
1:5
301:350

Vectores nombrados:

a <- 10:30

Y se pueden recuperar para el trabajo posterior:

a

Ahora vectores de texto:

saludo <- c("Hola", "Yo", "Soy", "Jesus")

Datos almacenados en vectores:

saludo
2:5
saludo2 <- c(saludo, 2:5)
saludo2

Un dataframe:

myDataframe <- data.frame(orden = 1:5, ciudad = c("Ibague", "Bogota", "Tunja", "Cali", "Medellin"), letras = letters[1:5], meses = month.name[1:5], salario = rnorm(5, 200, 50))
myDataframe

Una matriz:

myMatrix1 = matrix(1:12, nrow = 3)
myMatrix1

Otra matriz con texto:

myMatrix2 = matrix(c(1:11, "a"), nrow = 3)
myMatrix2

Una matriz que nos recuerda quien es ‘a’:

myMatrix3 = matrix(c(1:11, a), nrow = 3)
myMatrix3

Finalmente una lista:

myLista <- list(vector = a, matrix = myMatrix1, dataframe = myDataframe)
myLista
  1. Lógica de trabajo en R y Operaciones
  2. Entender los objetos de entrada y salida
  3. Reference card

Taller 1

  1. Crear cinco vectores así: a) Nombre de los compañeros de la fila, b) Actividad, c) Programa, d) Estatura, e) Peso
  2. Crear un dataframe con esos cinco vectores.
  3. Crear una lista con los cinco vectores y el dataframe.
  4. Encontrar el índice de masa corporal de cada compañero.

  5. Plan B:

names(super.adj)
[1] "dpto"            "ciiu"            "ciudad"         
[4] "activoCorriente" "pasivoCorriente" "razonCorriente" 

BLOQUE 2: Creación, ejecución y almacenamiento de código

Promover el uso de scripts en R para la facilitar la replicación del análisis.

  1. Escritura del script o código en R. (Ahora con Rstudio)
  2. Algunas reglas de estilo. https://google.github.io/styleguide/Rguide.xml
  3. Edición del código.
  4. Funciones y operaciones en R
  5. Tareas repetitivas.

Taller 2

Construir un script que explique los objetos de R y muestre con ejemplos su uso. Introducir un parámetro para ejecutar el código cambiando el parámetro.

BLOQUE 3: Funciones en R

Construir y ejecutar funciones de usuario en R.

  1. Script de una función en R Una función incorporada en la base de R:
mean

Otra función un poco más elaborada:

lm

Nuestra función:

myMean <- function(x) {
  mySum  <- sum(x, na.rm = TRUE)
  myN    <- length(x)
  mySum / myN 
}

Usando nuestra función:

vector <- c(1, NA, 5, 9)
myMean(x = vector)

Ajustando nuestra función:

myMean <- function(x) {
  mySum  <- sum(x, na.rm = TRUE)
  myN    <- length(na.omit(x))
  mySum / myN 
}

y ahora:

myMean(x = vector)
  1. Variables de un función. Podemos extender las funciones a campos escalares y campos vectoriales, es decir con una o más variables de entrada y salida.
myMean <- function(x) {
  mySum  <- sum(x, na.rm = TRUE)
  myN    <- length(na.omit(x))
  myMean <- mySum / myN
  return(c(suma = mySum, muestra = myN, media = myMean))
}
myMean(vector)

Ahora con dos entradas:

myMean <- function(x, y) {
  mySum  <- sum(x, na.rm = TRUE)
  myN    <- length(na.omit(x))
  myMean <- mySum / myN
  mySd   <- sd(x, na.rm = TRUE)
  mySe   <- mySd / sqrt(myN)
  myZ    <- qnorm(y, 0, 1)
  seMax  <- myZ * mySe
  return(c(suma = mySum, muestra = myN, media = myMean, errorMax = seMax))
}
myMean(vector, 0.975)
  1. Ámbito de una función
ls()
  1. Uso en el contexto de R

Taller 3.

Escribir una función que describa una variable o vector. La función debe generar una lista con el número de observaciones, el número de valores perdidos, la media, la varianza, la desviación estándar, el coeficiente de variación, el error estándar, los valores mínimo y máximo, y los cuartiles.

Escribir una función que identifique las observaciones irregulares a través del método de Tukey.

BLOQUE 4: Los paquetes o programas en R

Buscar, instalar y usar paquetes de análisis en R.

  1. Lugares de búsqueda y actualización:
  1. https://cran.r-project.org/ y Task View
  2. https://www.r-bloggers.com
  1. Instalación de paquetes.
  2. Uso de los paquetes. Vignettes and webpages. Ej.:
  1. https://cran.r-project.org/web/packages/dplyr/vignettes/dplyr.html
  2. lmtest.
  1. Instalar
  1. dplyr y conocer algunas de sus funcionalidades
  2. DescTools
  3. foreign
  4. readxl
  5. xlsx

Taller 4

  1. Instalar tidyverse
  2. Buscar un paquete que estime modelos panel e instalarlo.

BLOQUE 5: Importación y exportación de datos y resultados

Importar y exportar datos y resultados a otras aplicaciones.

  1. Importar datos desde, y hacia, Stata, SPSS y Excel. Primero desde Stata:
library(foreign)
getwd()
#d <- read.dta("pwt90.dta")
#install.packages("readstata13")
library(readstata13)
d <- read.dta13("pwt90.dta")

Ahora a conocer nuestros datos:

dim(d)
names(d)
str(d)

Segundo, desde excel:

super <- readxl::read_excel("BalanceGeneral2015SIREMV2.xls")
super <- readxl::read_excel("BalanceGeneral2015SIREMV2.xls")
dim(super)
[1] 26533   242
names(super)
  [1] "NIT"                                                     
  [2] "RAZON SOCIAL"                                            
  [3] "CIUDAD"                                                  
  [4] "DEPARTAMENTO"                                            
  [5] "CIIU"                                                    
  [6] "SECTOR"                                                  
  [7] "1105 CAJA"                                               
  [8] "1110 BANCOS"                                             
  [9] "1115 REMESAS EN TRÃ\u0081NSITO"                          
 [10] "1120 CUENTAS DE AHORRO"                                  
 [11] "1125 FONDOS"                                             
 [12] "11 SUBTOTAL DISPONIBLE"                                  
 [13] "12 INVERSIONES"                                          
 [14] "1305 CLIENTES"                                           
 [15] "1310 CUENTAS CORRIENTES COMERCIALES (CP)"                
 [16] "1315 CUENTAS POR COBRAR A CASA MATRIZ (CP)"              
 [17] "1320 CUENTAS POR COBRAR A VINCULADOS ECONÓMICOS (CP)"   
 [18] "1323 CUENTAS POR COBRAR A DIRECTORES (CP)"               
 [19] "1325 CUENTAS POR COBRAR A SOCIOS Y ACCIONISTAS (CP)"     
 [20] "1328 APORTES POR COBRAR (CP)"                            
 [21] "1330 ANTICIPOS Y AVANCES (CP)"                           
 [22] "1332 CUENTAS DE OPERACIÓN CONJUNTA (CP)"                
 [23] "1335 DEPÓSITOS (CP)"                                    
 [24] "1340 PROMESAS DE COMPRAVENTA (CP)"                       
 [25] "1345 INGRESOS POR COBRAR (CP)"                           
 [26] "1350 RETENCIÓN SOBRE CONTRATOS (CP)"                    
 [27] "1355 ANTICIPO DE IMPTOS. Y CONTRIB.O SALDOS A FAVOR (CP)"
 [28] "1360 RECLAMACIONES (CP)"                                 
 [29] "1365 CUENTAS POR COBRAR A TRABAJADORES (CP)"             
 [30] "1370 PRESTAMOS A PARTICULARES (CP)"                      
 [31] "1380 DEUDORES VARIOS (CP)"                               
 [32] "1385 DERECHOS DE RECOMP. DE CART. NEGOCIADA (CP)"        
 [33] "1390 DEUDAS DE DIFÃ\u008dCIL COBRO (CP)"                 
 [34] "1399 PROVISIONES (CP)"                                   
 [35] "13 SUBTOTAL DEUDORES (CP)"                               
 [36] "1405 MATERIAS PRIMAS"                                    
 [37] "1410 PRODUCTOS EN PROCESO"                               
 [38] "1415 OBRAS DE CONSTRUC. EN CURSO"                        
 [39] "1417 OBRAS DE URBANISMO"                                 
 [40] "1420 CONTRATOS EN EJECUCIÓN (CP)"                       
 [41] "1425 CULTIVOS EN DESARROLLO (CP)"                        
 [42] "1428 PLANTACIONES AGRÃ\u008dCOLAS (CP)"                  
 [43] "1430 PRODUCTOS TERMINADOS"                               
 [44] "1435 M/CÃ\u008dAS NO FABRICADAS POR LA EMP."             
 [45] "1440 BIENES RAÃ\u008dCES PARA LA VENTA"                  
 [46] "1445 SEMOVIENTES (CP)"                                   
 [47] "1450 TERRENOS"                                           
 [48] "1455 MATERIALES, REPUESTOS Y ACCESORIOS (CP)"            
 [49] "1460 ENVASES Y EMPAQUES (CP)"                            
 [50] "1465 INVENTARIOS EN TRÃ\u0081NSITO (CP)"                 
 [51] "1499 PROVISIONES (CP)"                                   
 [52] "14 SUBTOTAL INVENTARIOS (CP)"                            
 [53] "1705 GASTOS PAGADOS POR ANTICIPADO (CP)"                 
 [54] "1710 CARGOS DIFERIDOS (CP)"                              
 [55] "1715 COSTOS DE EXPLORACIÓN POR AMORTIZAR (CP)"          
 [56] "1720 COSTOS DE EXPLOTACIÓN Y DESARROLLO (CP)"           
 [57] "1730 CARGOS POR CORRECCIÓN MONETARIA DIFERIDA (CP)"     
 [58] "1798 AMORTIZACIÓN ACUMULADA (CP)"                       
 [59] "17 SUBTOTAL DIFERIDO (CP)"                               
 [60] "TOTAL ACTIVO CORRIENTE"                                  
 [61] "12 INVERSIONES__1"                                       
 [62] "1305 CLIENTES__1"                                        
 [63] "1310 CUENTAS CORRIENTES COMERCIALES"                     
 [64] "1315 CUENTAS POR COBRAR A CASA MATRIZ"                   
 [65] "1320 CUENTAS POR COBRAR A VINCULADOS ECONÓM."           
 [66] "1323 CUENTAS POR COBRAR A DIRECTORES"                    
 [67] "1325 CUENTAS POR COBRAR A SOCIOS Y ACCIONISTAS"          
 [68] "1330 ANTICIPOS Y AVANCES"                                
 [69] "1332 CUENTAS DE OPERACIÓN CONJUNTA"                     
 [70] "1335 DEPÓSITOS"                                         
 [71] "1340 PROMESAS DE COMPRAVENTA"                            
 [72] "1345 INGRESOS POR COBRAR"                                
 [73] "1350 RETENCIÓN SOBRE CONTRATOS"                         
 [74] "1355 ANTICIPO DE IMPTOS.Y CONTRIB.O SALDOS A FAVOR"      
 [75] "1360 RECLAMACIONES"                                      
 [76] "1365 CUENTAS POR COBRAR A TRABAJADORES"                  
 [77] "1370 PRESTAMOS A PARTICULARES"                           
 [78] "1380 DEUDORES VARIOS"                                    
 [79] "1385 DERECHOS DE RECOMP. DE CART.NEGOCIADA"              
 [80] "1390 DEUDAS DE DIFÃ\u008dCIL COBRO"                      
 [81] "1399 PROVISIONES"                                        
 [82] "13 SUBTOTAL DEUDORES A LARGO PLAZO"                      
 [83] "15 PROPIEDADES PLANTA Y EQUIPO"                          
 [84] "1605 CRÉDITO MERCANTIL"                                 
 [85] "1610 MARCAS"                                             
 [86] "1615 PATENTES"                                           
 [87] "1620 CONCESIONES Y FRANQUICIAS"                          
 [88] "1625 DERECHOS"                                           
 [89] "1630 KNOW HOW"                                           
 [90] "1635 LICENCIAS"                                          
 [91] "1698 AMORTIZACIÓN ACUMULADA"                            
 [92] "1699 PROVISIONES"                                        
 [93] "16 SUBTOTAL INTANGIBLES"                                 
 [94] "1705 GASTOS PAGADOS POR ANTICIPADO"                      
 [95] "1710 CARGOS DIFERIDOS"                                   
 [96] "1715 COSTOS DE EXPLORACIÓN POR AMORTIZAR"               
 [97] "1720 COSTOS DE EXPLOTACIÓN Y DESARROLLO"                
 [98] "1730 CARGOS POR CORRECCIÓN MONETARIA DIFERIDA"          
 [99] "1798 AMORTIZACIÓN ACUMULADA"                            
[100] "17 SUBTOTAL DIFERIDOS"                                   
[101] "1805 BIENES DE ARTE Y CULTURA"                           
[102] "1895 DIVERSOS"                                           
[103] "1899 PROVISIONES"                                        
[104] "18 SUBTOTAL OTROS ACTIVOS"                               
[105] "1905 DE INVERSIONES"                                     
[106] "1910 DE PROPIEDADES PLANTA Y EQUIPO"                     
[107] "1995 DE OTROS ACTIVOS"                                   
[108] "19 SUBTOTAL VALORIZACIONES"                              
[109] "TOTAL ACTIVO NO CORRIENTE"                               
[110] "TOTAL ACTIVO"                                            
[111] "21 OBLIGACIONES FINANCIERAS (CP)"                        
[112] "22 PROVEEDORES (CP)"                                     
[113] "2305 CUENTAS CORRIENTES COMERCIALES (CP)"                
[114] "2310 A CASA MATRIZ (CP)"                                 
[115] "2315 A COMPAÑÃ\u008dAS VINCULADAS (CP)"                 
[116] "2320 A CONTRATISTAS (CP)"                                
[117] "2330 ORDENES DE COMPRA POR UTILIZAR (CP)"                
[118] "2335 COSTOS Y GASTOS POR PAGAR (CP)"                     
[119] "2340 INSTALAMENTOS POR PAGAR (CP)"                       
[120] "2345 ACREEDORES OFICIALES (CP)"                          
[121] "2350 REGALÃ\u008dAS POR PAGAR (CP)"                      
[122] "2355 DEUDAS CON ACCIONISTAS O SOCIOS (CP)"               
[123] "2357 DEUDAS CON DIRECTORES (CP)"                         
[124] "2360 DIVIDENDOS O PARTICIPACIONES POR PAGAR (CP)"        
[125] "2365 RETENCIÓN EN LA FUENTE (CP)"                       
[126] "2367 IMPUESTO A LAS VENTAS RETENIDO (CP)"                
[127] "2368 IMPUESTO DE INDUSTRIA Y COMERCIO RETENIDO (CP)"     
[128] "2370 RETENCIONES Y APORTES DE NÓMINA (CP)"              
[129] "2375 CUOTAS POR DEVOLVER"                                
[130] "2380 ACREEDORES (CP)"                                    
[131] "23 SUBTOTAL CUENTAS POR PAGAR (CP)"                      
[132] "24 IMPUESTOS GRAVÃ\u0081MENES Y TASAS (CP)"              
[133] "25 OBLIGACIONES LABORALES (CP)"                          
[134] "2605 PARA COSTOS Y GASTOS (CP)"                          
[135] "2610 PARA OBLIGACIONES LABORALES (CP)"                   
[136] "2615 PARA OBLIGACIONES FISCALES (CP)"                    
[137] "2620 PENSIONES DE JUBILACIÓN (CP)"                      
[138] "2625 PARA OBRAS DE URBANISMO (CP)"                       
[139] "2630 PARA MANTENIMIENTO Y REPARACIONES (CP)"             
[140] "2635 PARA CONTINGENCIAS (CP)"                            
[141] "2640 PARA OBLIGACIONES DE GARANTÃ\u008dAS (CP)"          
[142] "2695 PROVISIONES DIVERSAS (CP)"                          
[143] "26 SUBTOTAL PASIVOS ESTIMAD. Y PROVIS. (CP)"             
[144] "27 DIFERIDOS (CP)"                                       
[145] "2805 ANTICIPOS Y AVANCES RECIBIDOS (CP)"                 
[146] "2810 DEPÓSITOS RECIBIDOS (CP)"                          
[147] "2815 INGRESOS RECIBIDOS PARA TERCEROS (CP)"              
[148] "2820 CUENTAS DE OPERACIÓN CONJUNTA (CP)"                
[149] "2825 RETENCIONES A TERCEROS SOBRE CONTRATOSV"            
[150] "2830 EMBARGOS JUDICIALES (CP)"                           
[151] "2835 ACREEDORES DEL SISTEMA (CP)"                        
[152] "2840 CUENTAS EN PARTICIPACIÓN (CP)"                     
[153] "2895 DIVERSOS (CP)"                                      
[154] "28 SUBTOTAL OTROS PASIVOS (CP)"                          
[155] "2905 BONOS EN CIRCULACIÓN (CP)"                         
[156] "2910 BONOS OBLIGATOR. CONVERTIBLES EN ACCIONES (CP)"     
[157] "2915 PAPELES COMERCIALES (CP)"                           
[158] "2920 BONOS PENSIONALES (CP)"                             
[159] "2925 TÃ\u008dTULOS PENSIONALES (CP)"                     
[160] "29 SUBTOTAL BONOS Y PAPELES COMERCIA. (CP)"              
[161] "TOTAL PASIVO CORRIENTE"                                  
[162] "21 OBLIGACIONES FINANCIERAS"                             
[163] "22 PROVEEDORES (LP)"                                     
[164] "2305 CUENTAS CORRIENTES COMERCIALES"                     
[165] "2310 A CASA MATRIZ"                                      
[166] "2315 A COMPAÑÃ\u008dAS VINCULADAS"                      
[167] "2320 A CONTRATISTAS"                                     
[168] "2335 COSTOS Y GASTOS POR PAGAR"                          
[169] "2345 ACREEDORES OFICIALES"                               
[170] "2350 REGALÃ\u008dAS POR PAGAR"                           
[171] "2355 DEUDAS CON ACCIONISTAS O SOCIOS"                    
[172] "2357 DEUDAS CON DIRECTORES"                              
[173] "2360 DIVIDENDOS O PARTICIPACIONES POR PAGAR"             
[174] "2375 CUOTAS POR DEVOLVER__1"                             
[175] "2380 ACREEDORES VARIOS"                                  
[176] "23 SUBTOTAL CUENTAS POR PAGAR"                           
[177] "24 IMPUESTOS GRAVÃ\u0081MENES Y TASAS (LP)"              
[178] "25 OBLIGACIONES LABORALES"                               
[179] "2605 PARA COSTOS Y GASTOS"                               
[180] "2610 PARA OBLIGACIONES LABORALES"                        
[181] "2615 PARA OBLIGACIONES FISCALES"                         
[182] "2620 PENSIONES DE JUBILACIÓN (LP)"                      
[183] "2625 PARA OBRAS DE URBANISMO"                            
[184] "2635 PARA CONTINGENCIAS"                                 
[185] "2640 PARA OBLIGACIONES DE GARANTÃ\u008dAS"               
[186] "2695 PROVISIONES DIVERSAS"                               
[187] "26 SUBTOTAL PASIVOS ESTIMAD. Y PROVIS."                  
[188] "2705 INGRESOS RECIBIDOS POR ANTICIPADO"                  
[189] "2710 ABONOS DIFERIDOS"                                   
[190] "2715 UTILIDAD DIFERIDA EN VENTAS A PLAZOS"               
[191] "2720 CRÉDITO POR CORRECCIÓN MONETARIA DIFERIDA"        
[192] "2725 IMPUESTOS DIFERIDOS"                                
[193] "27 SUBTOTAL DIFERIDOS"                                   
[194] "2805 AVANCES Y ANTICIPOS RECIBIDOS"                      
[195] "2810 DEPÓSITOS RECIBIDOS"                               
[196] "2815 INGRESOS RECIBIDOS PARA TERCEROS"                   
[197] "2820 CUENTAS DE OPERACIÓN CONJUNTA"                     
[198] "2825 RETENCIONES A TERCEROS SOBRE CONTRATOS"             
[199] "2835 ACREEDORES DEL SISTEMA (LP)"                        
[200] "2840 CUENTAS EN PARTICIPACIÓN"                          
[201] "2895 DIVERSOS"                                           
[202] "28 SUBTOTAL OTROS PASIVOS"                               
[203] "2905 BONOS EN CIRCULACIÓN"                              
[204] "2910 BONOS OBLIGATOR. CONVERTIBLES EN ACCIONES"          
[205] "2915 PAPELES COMERCIALES"                                
[206] "2920 BONOS PENSIONALES (LP)"                             
[207] "2925 TÃ\u008dTULOS PENSIONALES (LP)"                     
[208] "29 SUBTOTAL BONOS Y PAPELES COMERCIA."                   
[209] "TOTAL PASIVO NO CORRIENTE"                               
[210] "TOTAL PASIVO"                                            
[211] "3105 CAPITAL SUSCRITO Y PAGADO"                          
[212] "3115 APORTES SOCIALES"                                   
[213] "3120 CAPITAL ASIGNADO"                                   
[214] "3125 INVERSIÓN SUPLEMENTARIA AL CAPITAL ASIGNADO"       
[215] "3130 CAPITAL DE PERSONAS NATURALES"                      
[216] "3135 APORTES DEL ESTADO"                                 
[217] "3140 FONDO SOCIAL"                                       
[218] "31 SUBTOTAL CAPITAL SOCIAL"                              
[219] "3205 PRIMA EN COLOC.ACC,CUOTAS O PARTES DE INT. SOCIAL"  
[220] "3210 DONACIONES"                                         
[221] "3215 CRÉDITO MERCANTIL"                                 
[222] "3220 KNOW HOW"                                           
[223] "3225 SUPERÃ\u0081VIT MÉTODO DE PARTICIPACIÓN"          
[224] "32 SUBTOTAL SUPERÃ\u0081VIT DE CAPITAL"                  
[225] "33 RESERVAS"                                             
[226] "34 REVALORIZACIÓN DEL PATRIMONIO"                       
[227] "35 DIVIDEN. O PARTC. DECRET. EN ACC.O CUOTAS"            
[228] "36 RESULTADOS DEL EJERCICIO"                             
[229] "3705 UTILIDADES ACUMULADAS"                              
[230] "3710 PERDIDAS ACUMULADAS"                                
[231] "37 RESULTADOS DE EJERCICIOS ANTERIORES"                  
[232] "38 SUPERÃ\u0081VIT POR VALORIZACIONES"                   
[233] "TOTAL PATRIMONIO"                                        
[234] "TOTAL PASIVO Y PATRIMONIO"                               
[235] "81 DERECHOS CONTINGENTES"                                
[236] "82 DEUDORAS FISCALES"                                    
[237] "83 DEUDORAS DE CONTROL"                                  
[238] "9 CUENTAS DE ORDEN ACREEDORAS POR CONTRA"                
[239] "91 RESPONSABILIDADES CONTINGENTES"                       
[240] "92 ACREEDORAS FISCALES"                                  
[241] "93 ACREEDORAS DE CONTROL"                                
[242] "8 CTAS DE ORDEN DEUDORAS POR CONTRA"                     

Tercero, sin convertir a excel:

super2 <- read.csv("BalanceGeneral2015SIREMV2.txt", header = TRUE, sep = ";", dec = ",", as.is = TRUE)
dim(super2)
names(super2)
  1. Exportar resultados a Word, Excel, Latex, y HTML. Una opción con DescTools:
library(DescTools)
XLView(head(super))

Otra opción:

library(xlsx)
write.xlsx(head(super), file = "supersociedades.xlsx", sheetName = "myData", showNA = FALSE)

Taller 5

  1. Descargar las estadísticas de población, crecimiento económico y empleo del Banco Mundial para latinoamérica, en formato Excel, e importarlas a R. Describir los datos.

BLOQUE 6: La potencia de ggplot2

Explorar el potencial de ggplot2 para describir datos.

Algunos ajustes a los nombres de la base de datos:

library(dplyr)
super.adj <- data.frame(dpto = super$DEPARTAMENTO, ciiu = super$CIIU, ciudad = super$CIUDAD)
super.adj$activoCorriente <- super$`TOTAL ACTIVO CORRIENTE`
super.adj$pasivoCorriente <- super$`TOTAL PASIVO CORRIENTE`
super.adj$razonCorriente <- ifelse(super.adj$pasivoCorriente > 0, super.adj$activoCorriente / super.adj$pasivoCorriente, NA)

Un gráfico de muestra en R base:

hist(x = super.adj$razonCorriente)
boxplot(razonCorriente ~ dpto, data = super.adj)
library(ggplot2)
ggplot(data = super.adj, aes(x = razonCorriente)) + geom_histogram()
ggplot(data = super.adj, aes(x = razonCorriente, y = dpto)) + geom_boxplot()

Removiendo los outliers:

super.adj.filtered <- filter(super.adj, razonCorriente < 10)
hist(x = super.adj.filtered$razonCorriente)
boxplot(razonCorriente ~ dpto, data = super.adj.filtered)
ggplot(data = super.adj.filtered, aes(x = razonCorriente)) + geom_histogram()
ggplot(data = super.adj.filtered, aes(x = dpto, y = razonCorriente)) + geom_boxplot() + coord_flip()

Seleccionando los departamentos a analizar:

library(ggplot2)
myDpto <- c("BOGOTA D.C.", "BOYACA", "TOLIMA")
ggplot(data = filter(super.adj, razonCorriente < 10 & dpto %in% myDpto), aes(x = razonCorriente)) + geom_histogram() + facet_wrap(~ dpto, scales = "free_y")

Ahora uno de dispersión:

plot(activoCorriente ~ pasivoCorriente, data = super.adj.filtered)
ggplot(data = filter(super.adj, razonCorriente < 10 & dpto %in% myDpto), aes(x = pasivoCorriente, y = activoCorriente)) + geom_point() + facet_wrap(~ dpto, scales = "free") + geom_smooth(method = "lm")

Taller 6

Estudiar la relación entre educación (capital humano) y crecimiento en la base de datos PWT9.0.

BLOQUE 7: Actividad Integradora

Aplicar todo lo aprendido hasta el momento a un proyecto de investigación.

Construir la sección de descripción de los datos de un proyecto de investigación o un informe de consultoría.

SECCIÓN B: Aplicación de R a la Econometría

BLOQUE DE REPASO DE CARGA DE DATOS

https://www.supersociedades.gov.co/Servicio_Ciudadano/tramitesyservicios/Paginas/SIREM.aspx

Fundamentos de regresión: Mínimos cuadrados, propiedades y supuestos.

library(readxl)
pg2013 <- read_excel("EstadoResultados2013SIREMV2.xlsx")
names(pg2013)

pg2014 <- read_excel("EstadoResultados2014SIREMV2.xlsx")
names(pg2014)

names(pg2013) == names(pg2014)

pg2015 <- read_excel("EstadoResultados2015SIREMV2.xls")
names(pg2015)

names(pg2013) == names(pg2015)
cbind(names(pg2013), names(pg2015))
pg2015 <- pg2015[ , -5]

names(pg2015) <- names(pg2013)

pg <- list(pg2013, pg2014, pg2015)

names(pg[[1]]) == names(pg[[2]])
names(pg[[1]]) == names(pg[[3]])
all(names(pg[[1]]) == names(pg[[3]]))
which((names(pg[[1]]) == names(pg[[3]])) == FALSE)
cbind(names(pg[[1]]), names(pg[[3]]))
all(names(pg[[1]]) == names(pg[[3]]))
[1] TRUE
names(pg1315)
 [1] "year"      "nit"       "razSoc"    "ciudad"    "dpto"      "ciiu"     
 [7] "sector"    "ingOpe"    "cosVen"    "utiBru"    "gasAdm"    "gasVen"   
[13] "utiOpe"    "ingNoOpe"  "gasNoOpe"  "intereses" "uadi"      "impRen"   
[19] "udi"      
names(ef1315)
 [1] "year"       "nit"        "razSoc"     "ciudad"     "dpto"       "ciiu"      
 [7] "sector"     "disponible" "actCte"     "actTot"     "pasCte"     "pasTot"    
[13] "patTot"     "ingOpe"     "cosVen"     "utiBru"     "gasAdm"     "gasVen"    
[19] "utiOpe"     "ingNoOpe"   "gasNoOpe"   "intereses"  "uadi"       "impRen"    
[25] "udi"       
summary(ef1315)
     year                nit               razSoc             ciudad         
 Length:61725       Min.   :800000001   Length:61725       Length:61725      
 Class :character   1st Qu.:811022490   Class :character   Class :character  
 Mode  :character   Median :860031774   Mode  :character   Mode  :character  
                    Mean   :853634412                                        
                    3rd Qu.:900113369                                        
                    Max.   :900868847                                        
                                                                             
     dpto               ciiu              sector            disponible       
 Length:61725       Length:61725       Length:61725       Min.   :        0  
 Class :character   Class :character   Class :character   1st Qu.:    21691  
 Mode  :character   Mode  :character   Mode  :character   Median :   115710  
                                                          Mean   :   780900  
                                                          3rd Qu.:   436700  
                                                          Max.   :851257912  
                                                                             
     actCte              actTot              pasCte              pasTot         
 Min.   :0.000e+00   Min.   :0.000e+00   Min.   :0.000e+00   Min.   :0.000e+00  
 1st Qu.:6.753e+05   1st Qu.:1.846e+06   1st Qu.:2.799e+05   1st Qu.:5.020e+05  
 Median :1.938e+06   Median :4.659e+06   Median :9.924e+05   Median :1.664e+06  
 Mean   :7.761e+06   Mean   :2.217e+07   Mean   :5.406e+06   Mean   :8.561e+06  
 3rd Qu.:5.607e+06   3rd Qu.:1.209e+07   3rd Qu.:3.366e+06   3rd Qu.:5.245e+06  
 Max.   :2.480e+09   Max.   :2.135e+10   Max.   :2.004e+09   Max.   :1.034e+10  
                                                                                
     patTot               ingOpe              cosVen          
 Min.   :-1.541e+08   Min.   :0.000e+00   Min.   :   -263571  
 1st Qu.: 6.915e+05   1st Qu.:4.844e+05   1st Qu.:         0  
 Median : 1.993e+06   Median :2.342e+06   Median :   1022109  
 Mean   : 1.361e+07   Mean   :1.433e+07   Mean   :  10182120  
 3rd Qu.: 5.902e+06   3rd Qu.:8.364e+06   3rd Qu.:   5253834  
 Max.   : 2.009e+10   Max.   :7.150e+09   Max.   :7306821025  
                                                              
     utiBru               gasAdm              gasVen         
 Min.   :-789124779   Min.   :0.000e+00   Min.   :        0  
 1st Qu.:    221524   1st Qu.:1.429e+05   1st Qu.:        0  
 Median :    843321   Median :4.419e+05   Median :     4073  
 Mean   :   4150083   Mean   :1.576e+06   Mean   :  1504727  
 3rd Qu.:   2540752   3rd Qu.:1.121e+06   3rd Qu.:   504420  
 Max.   :2604211940   Max.   :1.584e+09   Max.   :711338660  
                                                             
     utiOpe              ingNoOpe            gasNoOpe           intereses        
 Min.   :-804018063   Min.   :0.000e+00   Min.   :0.000e+00   Min.   :        0  
 1st Qu.:      -919   1st Qu.:5.885e+03   1st Qu.:1.857e+04   1st Qu.:     2657  
 Median :    129360   Median :5.888e+04   Median :9.798e+04   Median :    31586  
 Mean   :   1069615   Mean   :9.914e+05   Mean   :1.044e+06   Mean   :   262747  
 3rd Qu.:    585156   3rd Qu.:3.123e+05   3rd Qu.:3.983e+05   3rd Qu.:   143260  
 Max.   :2280130395   Max.   :2.373e+09   Max.   :2.364e+09   Max.   :244475651  
                                                              NA's   :12482      
      uadi                impRen               udi            
 Min.   :-794796715   Min.   :-33842819   Min.   :-794796715  
 1st Qu.:      9059   1st Qu.:    15294   1st Qu.:      1619  
 Median :    120628   Median :    55274   Median :     73386  
 Mean   :   1016672   Mean   :   386905   Mean   :    674177  
 3rd Qu.:    512378   3rd Qu.:   188080   3rd Qu.:    340166  
 Max.   :2219800850   Max.   :849789644   Max.   :1380571993  
                      NA's   :7085                            

BLOQUE 8: El modelo de regresión simple y múltiple.

Explorar el uso de R para la estimación de modelos de regresión.

ef1315 %>% 
  filter(dpto == "BOYACA") %>% 
  select(razCor, roa) %>% 
  ggplot(aes(x = log(razCor), y = roa)) + geom_point() + geom_smooth() #method = "lm")

Heteroscedasticidad:

bptest(regBoyaca, ~ log(razCor) + I(log(razCor))^2, data = dataBoyaca)

    studentized Breusch-Pagan test

data:  regBoyaca
BP = 0.0032455, df = 1, p-value = 0.9546
gqtest(regBoyaca, order.by = ~razCor, data = dataBoyaca)

    Goldfeld-Quandt test

data:  regBoyaca
GQ = 1.1669, df1 = 144, df2 = 143, p-value = 0.1783
alternative hypothesis: variance increases from segment 1 to 2
resettest(regBoyaca)

    RESET test

data:  regBoyaca
RESET = 1.857, df1 = 2, df2 = 287, p-value = 0.158
# Reset test
resettest(regBoyaca)
coeftest(regBoyaca, vcov = vcovHC(regBoyaca))

t test of coefficients:

             Estimate Std. Error t value Pr(>|t|)   
(Intercept) 0.0026151  0.0121086  0.2160 0.829166   
log(razCor) 0.0407920  0.0131554  3.1008 0.002121 **
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
coeftest(regBoyaca, vcov = vcovHC(regBoyaca))
coeftest(regBoyaca)

Factor de inflación de Varianza:

ef1315 %>% 
  filter(dpto == "BOYACA") %>% 
  select(razCor, roa, actTot) %>% 
  lm(roa ~ log(razCor) + actTot, data = .) %>%  #, na.action = na.omit)
  summary

Call:
lm(formula = roa ~ log(razCor) + actTot, data = .)

Residuals:
     Min       1Q   Median       3Q      Max 
-1.01129 -0.02797  0.00418  0.03249  0.67294 

Coefficients:
              Estimate Std. Error t value Pr(>|t|)    
(Intercept) -6.820e-03  1.103e-02  -0.618    0.537    
log(razCor)  4.221e-02  7.038e-03   5.997    6e-09 ***
actTot       1.302e-09  8.244e-10   1.580    0.115    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 0.135 on 288 degrees of freedom
Multiple R-squared:  0.1129,    Adjusted R-squared:  0.1067 
F-statistic: 18.32 on 2 and 288 DF,  p-value: 3.239e-08
ef1315 %>% 
  filter(dpto == "BOYACA") %>% 
  select(razCor, roa, actTot) %>% 
  lm(roa ~ log(razCor) + actTot, data = .) %>%  #, na.action = na.omit)
  summary
ef1315 %>% 
  #filter(dpto == "BOYACA") %>%
  filter(razCor > 0) %>% 
  select(razCor, roa) %>%
  lm(roa ~ log(razCor), data = .) %>%  #, na.action = na.omit)
  summary
ef1315 %>% 
  #filter(dpto == "BOYACA") %>%
  filter(razCor > 0) %>% 
  select(razCor, roa, actTot) %>%
  lm(roa ~ log(razCor) + actTot, data = .) %>%  #, na.action = na.omit)
  summary
ef1315$ciiu1 <- substr(ef1315$ciiu, 1,1) 
ef1315 %>% select(nit, ciiu, ciiu1) %>% head()

Aplicaciones de la regresión. Interpretación de los resultados: Efectos marginales y modelos no lineales.

ef1315 %>% 
  #filter(dpto == "BOYACA") %>%
  filter(razCor > 0) %>% 
  lm(roa ~ log(razCor) + actTot + ciiu1, data = .) %>%  #, na.action = na.omit)
  summary

Validación de los modelos. Supuestos.

Taller

BLOQUE 9: Regresión múltiple en la Investigación

Estudiar el uso de los modelos de regresión en la investigación.

Lectura de artículos de investigación.

Comparación de los modelo de regresión y análisis.

Informes de investigación tipo paper/artículo.

htmlreg(myRegs, file = "output.doc")
The table was written to the file 'output.doc'.

BLOQUE 10: Regresión sobre múltiples grupos y uso avanzado de R.

Estudiar el uso de los modelos de regresión en estructuras complejas de datos generalmente utilizados en la investigación.

# Desarrollar regresiones por departamentos y analizar la distribución de los coeficientes a través del país.

Integrar las herramientas de tidyverse al análisis de regresión.

BLOQUE 11: Modelos Panel estáticos en R

Explorar el uso de R para la estimación de modelos de panel (Pooling, Efectos fijos, Efectos aleatorios)

Fundamentación

Estimación de los modelos en R.

Taller reporte de resultados de investigación.

BLOQUE 12: Sesión de Consolidación

Repasar y aclarar dudas sobre R y Econometría.

Aclaración de dudas.

Presentación y discusión de los proyectos.

LS0tDQp0aXRsZTogIlIgcGFyYSBJbnZlc3RpZ2FjacOzbiBlbiBDaWVuY2lhcyBlY29uw7NtaWNhcyB5IGFkbWluaXN0cmF0aXZhcyINCm91dHB1dDoNCiAgaHRtbF9ub3RlYm9vazogZGVmYXVsdA0KZWRpdG9yX29wdGlvbnM6DQogIGNodW5rX291dHB1dF90eXBlOiBjb25zb2xlDQotLS0NCg0KIyBTRUNDSdNOIEE6IEZ1bmRhbWVudG9zIGRlIFINCiMjIEJMT1FVRSAxOiBJbnRyb2R1Y2Np824gYSBSDQpFbCBvYmpldGl2byBkZSBlc3RhIHNlc2nzbiBlcyBpZGVudGlmaWNhciBlbCBhbWJpZW50ZSBkZSB0cmFiYWpvIGRlIFIsIHN1cyBjb21wb25lbnRlcyB5IGxvcyBvYmpldG9zIGRlIHRyYWJham8uDQoNCjEuICBJbnN0YWxhY2nzbiBkZSBSLiAgaHR0cHM6Ly9jcmFuLnItcHJvamVjdC5vcmcNCjIuICBBbWJpZW50ZSBkZSB0cmFiYWpvOiBDb25zb2xhIHkgc2NyaXB0LiAgICANCjMuICBPYmpldG9zIGVuIFI6IFZlY3RvcmVzLCBkYXRhZnJhbWVzLCBtYXRyaWNlcywgbGlzdGFzLCBmdW5jaW9uZXMNCg0KQWxndW5vcyB2ZWN0b3JlcyBkZSBudW3pcmljb3M6DQpgYGB7cn0NCjMNCmMoMiwgMykNCjE6NQ0KMzAxOjM1MA0KYGBgDQpWZWN0b3JlcyBub21icmFkb3M6DQpgYGB7cn0NCmEgPC0gMTA6MzANCmBgYA0KWSBzZSBwdWVkZW4gcmVjdXBlcmFyIHBhcmEgZWwgdHJhYmFqbyBwb3N0ZXJpb3I6DQpgYGB7cn0NCmENCmBgYA0KDQpBaG9yYSB2ZWN0b3JlcyBkZSB0ZXh0bzoNCmBgYHtyfQ0Kc2FsdWRvIDwtIGMoIkhvbGEiLCAiWW8iLCAiU295IiwgIkplc3VzIikNCmBgYA0KDQpEYXRvcyBhbG1hY2VuYWRvcyBlbiB2ZWN0b3JlczoNCmBgYHtyfQ0Kc2FsdWRvDQoyOjUNCnNhbHVkbzIgPC0gYyhzYWx1ZG8sIDI6NSkNCnNhbHVkbzINCmBgYA0KVW4gZGF0YWZyYW1lOg0KYGBge3J9DQpteURhdGFmcmFtZSA8LSBkYXRhLmZyYW1lKG9yZGVuID0gMTo1LCBjaXVkYWQgPSBjKCJJYmFndWUiLCAiQm9nb3RhIiwgIlR1bmphIiwgIkNhbGkiLCAiTWVkZWxsaW4iKSwgbGV0cmFzID0gbGV0dGVyc1sxOjVdLCBtZXNlcyA9IG1vbnRoLm5hbWVbMTo1XSwgc2FsYXJpbyA9IHJub3JtKDUsIDIwMCwgNTApKQ0KbXlEYXRhZnJhbWUNCmBgYA0KDQpVbmEgbWF0cml6OiANCmBgYHtyfQ0KbXlNYXRyaXgxID0gbWF0cml4KDE6MTIsIG5yb3cgPSAzKQ0KbXlNYXRyaXgxDQpgYGANCg0KT3RyYSBtYXRyaXogY29uIHRleHRvOg0KYGBge3J9DQpteU1hdHJpeDIgPSBtYXRyaXgoYygxOjExLCAiYSIpLCBucm93ID0gMykNCm15TWF0cml4Mg0KYGBgDQoNClVuYSBtYXRyaXogcXVlIG5vcyByZWN1ZXJkYSBxdWllbiBlcyAnYSc6DQpgYGB7cn0NCm15TWF0cml4MyA9IG1hdHJpeChjKDE6MTEsIGEpLCBucm93ID0gMykNCm15TWF0cml4Mw0KYGBgDQoNCkZpbmFsbWVudGUgdW5hIGxpc3RhOg0KYGBge3J9DQpteUxpc3RhIDwtIGxpc3QodmVjdG9yID0gYSwgbWF0cml4ID0gbXlNYXRyaXgxLCBkYXRhZnJhbWUgPSBteURhdGFmcmFtZSkNCm15TGlzdGENCmBgYA0KDQo0LiAgTPNnaWNhIGRlIHRyYWJham8gZW4gUiB5IE9wZXJhY2lvbmVzDQo1LiAgRW50ZW5kZXIgbG9zIG9iamV0b3MgZGUgZW50cmFkYSB5IHNhbGlkYQ0KNi4gIFJlZmVyZW5jZSBjYXJkDQoNClRhbGxlciAxDQotLS0tLS0tLS0NCjEuICBDcmVhciBjaW5jbyB2ZWN0b3JlcyBhc+06IGEpIE5vbWJyZSBkZSBsb3MgY29tcGHxZXJvcyAgZGUgbGEgZmlsYSwgYikgQWN0aXZpZGFkLCBjKSBQcm9ncmFtYSwgZCkgRXN0YXR1cmEsIGUpIFBlc28NCjIuICBDcmVhciB1biBkYXRhZnJhbWUgY29uIGVzb3MgY2luY28gdmVjdG9yZXMuICANCjMuICBDcmVhciB1bmEgbGlzdGEgY29uIGxvcyBjaW5jbyB2ZWN0b3JlcyB5IGVsIGRhdGFmcmFtZS4NCjQuICBFbmNvbnRyYXIgZWwg7W5kaWNlIGRlIG1hc2EgY29ycG9yYWwgZGUgY2FkYSBjb21wYfFlcm8uDQoNCjUuICBQbGFuIEI6ICANCmBgYHtyfQ0KbG9hZCgic3VwZXJzb2NpZWRhZGVzX2NvcnJpZW50ZS5SZHRhIikNCmxzKCkNCm5hbWVzKHN1cGVyLmFkaikNCmBgYA0KDQoNCg0KIyMgQkxPUVVFIDI6IENyZWFjafNuLCBlamVjdWNp824geSBhbG1hY2VuYW1pZW50byBkZSBj82RpZ28NClByb21vdmVyIGVsIHVzbyBkZSBzY3JpcHRzIGVuIFIgcGFyYSBsYSBmYWNpbGl0YXIgbGEgcmVwbGljYWNp824gZGVsIGFu4Wxpc2lzLiAgDQoNCjEuICBFc2NyaXR1cmEgZGVsIHNjcmlwdCBvIGPzZGlnbyBlbiBSLiAgKEFob3JhIGNvbiBSc3R1ZGlvKQ0KMi4gIEFsZ3VuYXMgcmVnbGFzIGRlIGVzdGlsby4gIGh0dHBzOi8vZ29vZ2xlLmdpdGh1Yi5pby9zdHlsZWd1aWRlL1JndWlkZS54bWwNCjMuICBFZGljafNuIGRlbCBj82RpZ28uDQo0LiAgRnVuY2lvbmVzIHkgb3BlcmFjaW9uZXMgZW4gUg0KNS4gIFRhcmVhcyByZXBldGl0aXZhcy4NCg0KVGFsbGVyIDINCi0tLS0tLS0tDQpDb25zdHJ1aXIgdW4gc2NyaXB0IHF1ZSBleHBsaXF1ZSBsb3Mgb2JqZXRvcyBkZSBSIHkgbXVlc3RyZSBjb24gZWplbXBsb3Mgc3UgdXNvLiBJbnRyb2R1Y2lyIHVuIHBhcuFtZXRybyBwYXJhIGVqZWN1dGFyIGVsIGPzZGlnbyBjYW1iaWFuZG8gZWwgcGFy4W1ldHJvLg0KDQojIyBCTE9RVUUgMzogIEZ1bmNpb25lcyBlbiBSDQpDb25zdHJ1aXIgeSBlamVjdXRhciBmdW5jaW9uZXMgZGUgdXN1YXJpbyBlbiBSLiAgDQoNCjEuICBTY3JpcHQgZGUgdW5hIGZ1bmNp824gZW4gUg0KVW5hIGZ1bmNp824gaW5jb3Jwb3JhZGEgZW4gbGEgYmFzZSBkZSBSOg0KYGBge3J9DQptZWFuDQpgYGANCk90cmEgZnVuY2nzbiB1biBwb2NvIG3hcyBlbGFib3JhZGE6DQpgYGB7cn0NCmxtDQpgYGANCk51ZXN0cmEgZnVuY2nzbjoNCmBgYHtyfQ0KbXlNZWFuIDwtIGZ1bmN0aW9uKHgpIHsNCiAgbXlTdW0gIDwtIHN1bSh4LCBuYS5ybSA9IFRSVUUpDQogIG15TiAgICA8LSBsZW5ndGgoeCkNCiAgbXlTdW0gLyBteU4gDQp9DQpgYGANClVzYW5kbyBudWVzdHJhIGZ1bmNp8246DQpgYGB7cn0NCnZlY3RvciA8LSBjKDEsIE5BLCA1LCA5KQ0KbXlNZWFuKHggPSB2ZWN0b3IpDQpgYGANCkFqdXN0YW5kbyBudWVzdHJhIGZ1bmNp8246DQpgYGB7cn0NCm15TWVhbiA8LSBmdW5jdGlvbih4KSB7DQogIG15U3VtICA8LSBzdW0oeCwgbmEucm0gPSBUUlVFKQ0KICBteU4gICAgPC0gbGVuZ3RoKG5hLm9taXQoeCkpDQogIG15U3VtIC8gbXlOIA0KfQ0KDQpgYGANCnkgYWhvcmE6DQpgYGB7cn0NCm15TWVhbih4ID0gdmVjdG9yKQ0KYGBgDQoyLiAgVmFyaWFibGVzIGRlIHVuIGZ1bmNp824uICBQb2RlbW9zIGV4dGVuZGVyIGxhcyBmdW5jaW9uZXMgYSBjYW1wb3MgZXNjYWxhcmVzIHkgY2FtcG9zIHZlY3RvcmlhbGVzLCBlcyBkZWNpciBjb24gdW5hIG8gbeFzIHZhcmlhYmxlcyBkZSBlbnRyYWRhIHkgc2FsaWRhLg0KYGBge3J9DQpteU1lYW4gPC0gZnVuY3Rpb24oeCkgew0KICBteVN1bSAgPC0gc3VtKHgsIG5hLnJtID0gVFJVRSkNCiAgbXlOICAgIDwtIGxlbmd0aChuYS5vbWl0KHgpKQ0KICBteU1lYW4gPC0gbXlTdW0gLyBteU4NCiAgcmV0dXJuKGMoc3VtYSA9IG15U3VtLCBtdWVzdHJhID0gbXlOLCBtZWRpYSA9IG15TWVhbikpDQp9DQpteU1lYW4odmVjdG9yKQ0KYGBgDQpBaG9yYSBjb24gZG9zIGVudHJhZGFzOg0KYGBge3J9DQpteU1lYW4gPC0gZnVuY3Rpb24oeCwgeSkgew0KICBteVN1bSAgPC0gc3VtKHgsIG5hLnJtID0gVFJVRSkNCiAgbXlOICAgIDwtIGxlbmd0aChuYS5vbWl0KHgpKQ0KICBteU1lYW4gPC0gbXlTdW0gLyBteU4NCiAgbXlTZCAgIDwtIHNkKHgsIG5hLnJtID0gVFJVRSkNCiAgbXlTZSAgIDwtIG15U2QgLyBzcXJ0KG15TikNCiAgbXlaICAgIDwtIHFub3JtKHksIDAsIDEpDQogIHNlTWF4ICA8LSBteVogKiBteVNlDQogIHJldHVybihjKHN1bWEgPSBteVN1bSwgbXVlc3RyYSA9IG15TiwgbWVkaWEgPSBteU1lYW4sIGVycm9yTWF4ID0gc2VNYXgpKQ0KfQ0KbXlNZWFuKHZlY3RvciwgMC45NzUpDQpgYGANCjMuICDBbWJpdG8gZGUgdW5hIGZ1bmNp824NCmBgYHtyfQ0KbHMoKQ0KYGBgDQo0LiAgVXNvIGVuIGVsIGNvbnRleHRvIGRlIFINCg0KVGFsbGVyIDMuICANCi0tLS0tLS0tLQ0KRXNjcmliaXIgdW5hIGZ1bmNp824gcXVlIGRlc2NyaWJhIHVuYSB2YXJpYWJsZSBvIHZlY3Rvci4gIExhIGZ1bmNp824gZGViZSBnZW5lcmFyIHVuYSBsaXN0YSBjb24gZWwgbvptZXJvIGRlIG9ic2VydmFjaW9uZXMsIGVsIG76bWVybyBkZSB2YWxvcmVzIHBlcmRpZG9zLCBsYSBtZWRpYSwgbGEgdmFyaWFuemEsIGxhIGRlc3ZpYWNp824gZXN04W5kYXIsIGVsIGNvZWZpY2llbnRlIGRlIHZhcmlhY2nzbiwgZWwgZXJyb3IgZXN04W5kYXIsIGxvcyB2YWxvcmVzIG3tbmltbyB5IG3heGltbywgeSBsb3MgY3VhcnRpbGVzLg0KDQpFc2NyaWJpciB1bmEgZnVuY2nzbiBxdWUgaWRlbnRpZmlxdWUgbGFzIG9ic2VydmFjaW9uZXMgaXJyZWd1bGFyZXMgYSB0cmF26XMgZGVsIG3pdG9kbyBkZSBUdWtleS4NCg0KIyMgQkxPUVVFIDQ6ICBMb3MgcGFxdWV0ZXMgbyBwcm9ncmFtYXMgZW4gUg0KQnVzY2FyLCBpbnN0YWxhciB5IHVzYXIgcGFxdWV0ZXMgZGUgYW7hbGlzaXMgZW4gUi4gIA0KDQoxLiAgTHVnYXJlcyBkZSBi+nNxdWVkYSB5IGFjdHVhbGl6YWNp8246ICANCiAgYSkgaHR0cHM6Ly9jcmFuLnItcHJvamVjdC5vcmcvIHkgVGFzayBWaWV3DQogIGIpIGh0dHBzOi8vd3d3LnItYmxvZ2dlcnMuY29tDQoyLiAgSW5zdGFsYWNp824gZGUgcGFxdWV0ZXMuDQozLiAgVXNvIGRlIGxvcyBwYXF1ZXRlcy4gIFZpZ25ldHRlcyBhbmQgd2VicGFnZXMuICBFai46DQogIGEpICBodHRwczovL2NyYW4uci1wcm9qZWN0Lm9yZy93ZWIvcGFja2FnZXMvZHBseXIvdmlnbmV0dGVzL2RwbHlyLmh0bWwNCiAgYikgIGxtdGVzdC4NCjQuICBJbnN0YWxhciANCiAgYSkgZHBseXIgeSBjb25vY2VyIGFsZ3VuYXMgZGUgc3VzIGZ1bmNpb25hbGlkYWRlcw0KICBiKSBEZXNjVG9vbHMNCiAgYykgZm9yZWlnbg0KICBkKSByZWFkeGwNCiAgZSkgeGxzeA0KDQpUYWxsZXIgNA0KLS0tLS0tLS0NCjEuICBJbnN0YWxhciB0aWR5dmVyc2UNCjIuICBCdXNjYXIgdW4gcGFxdWV0ZSBxdWUgZXN0aW1lIG1vZGVsb3MgcGFuZWwgZSBpbnN0YWxhcmxvLg0KDQoNCiMjIEJMT1FVRSA1OiAgSW1wb3J0YWNp824geSBleHBvcnRhY2nzbiBkZSBkYXRvcyB5IHJlc3VsdGFkb3MNCkltcG9ydGFyIHkgZXhwb3J0YXIgZGF0b3MgeSByZXN1bHRhZG9zIGEgb3RyYXMgYXBsaWNhY2lvbmVzLg0KDQoxLiAgSW1wb3J0YXIgZGF0b3MgZGVzZGUsIHkgaGFjaWEsIFN0YXRhLCBTUFNTIHkgRXhjZWwuDQpQcmltZXJvIGRlc2RlIFN0YXRhOg0KYGBge3J9DQpsaWJyYXJ5KGZvcmVpZ24pDQpnZXR3ZCgpDQojZCA8LSByZWFkLmR0YSgicHd0OTAuZHRhIikNCiNpbnN0YWxsLnBhY2thZ2VzKCJyZWFkc3RhdGExMyIpDQpsaWJyYXJ5KHJlYWRzdGF0YTEzKQ0KZCA8LSByZWFkLmR0YTEzKCJwd3Q5MC5kdGEiKQ0KYGBgDQpBaG9yYSBhIGNvbm9jZXIgbnVlc3Ryb3MgZGF0b3M6DQpgYGB7cn0NCmRpbShkKQ0KbmFtZXMoZCkNCnN0cihkKQ0KYGBgDQoNClNlZ3VuZG8sIGRlc2RlIGV4Y2VsOg0KYGBge3J9DQpzdXBlciA8LSByZWFkeGw6OnJlYWRfZXhjZWwoIkJhbGFuY2VHZW5lcmFsMjAxNVNJUkVNVjIueGxzIikNCmRpbShzdXBlcikNCm5hbWVzKHN1cGVyKQ0KYGBgDQpUZXJjZXJvLCBzaW4gY29udmVydGlyIGEgZXhjZWw6DQpgYGB7cn0NCnN1cGVyMiA8LSByZWFkLmNzdigiQmFsYW5jZUdlbmVyYWwyMDE1U0lSRU1WMi50eHQiLCBoZWFkZXIgPSBUUlVFLCBzZXAgPSAiOyIsIGRlYyA9ICIsIiwgYXMuaXMgPSBUUlVFKQ0KZGltKHN1cGVyMikNCm5hbWVzKHN1cGVyMikNCmBgYA0KDQoyLiAgRXhwb3J0YXIgcmVzdWx0YWRvcyBhIFdvcmQsIEV4Y2VsLCBMYXRleCwgeSBIVE1MLg0KVW5hIG9wY2nzbiBjb24gRGVzY1Rvb2xzOg0KYGBge3J9DQpsaWJyYXJ5KERlc2NUb29scykNClhMVmlldyhoZWFkKHN1cGVyKSkNCmBgYA0KT3RyYSBvcGNp8246DQpgYGB7cn0NCmxpYnJhcnkoeGxzeCkNCndyaXRlLnhsc3goaGVhZChzdXBlciksIGZpbGUgPSAic3VwZXJzb2NpZWRhZGVzLnhsc3giLCBzaGVldE5hbWUgPSAibXlEYXRhIiwgc2hvd05BID0gRkFMU0UpDQpgYGANCg0KVGFsbGVyIDUNCi0tLS0tLS0tDQoxLiAgRGVzY2FyZ2FyIGxhcyBlc3RhZO1zdGljYXMgZGUgcG9ibGFjafNuLCBjcmVjaW1pZW50byBlY29u821pY28geSBlbXBsZW8gZGVsIEJhbmNvIE11bmRpYWwgcGFyYSBsYXRpbm9hbelyaWNhLCBlbiBmb3JtYXRvIEV4Y2VsLCBlIGltcG9ydGFybGFzIGEgUi4gIERlc2NyaWJpciBsb3MgZGF0b3MuIA0KDQojIyBCTE9RVUUgNjogIExhIHBvdGVuY2lhIGRlIGdncGxvdDINCkV4cGxvcmFyIGVsIHBvdGVuY2lhbCBkZSBnZ3Bsb3QyIHBhcmEgZGVzY3JpYmlyIGRhdG9zLiAgDQoNCkFsZ3Vub3MgYWp1c3RlcyBhIGxvcyBub21icmVzIGRlIGxhIGJhc2UgZGUgZGF0b3M6DQpgYGB7cn0NCmxpYnJhcnkoZHBseXIpDQpzdXBlci5hZGogPC0gZGF0YS5mcmFtZShkcHRvID0gc3VwZXIkREVQQVJUQU1FTlRPLCBjaWl1ID0gc3VwZXIkQ0lJVSwgY2l1ZGFkID0gc3VwZXIkQ0lVREFEKQ0Kc3VwZXIuYWRqJGFjdGl2b0NvcnJpZW50ZSA8LSBzdXBlciRgVE9UQUwgQUNUSVZPIENPUlJJRU5URWANCnN1cGVyLmFkaiRwYXNpdm9Db3JyaWVudGUgPC0gc3VwZXIkYFRPVEFMIFBBU0lWTyBDT1JSSUVOVEVgDQpzdXBlci5hZGokcmF6b25Db3JyaWVudGUgPC0gaWZlbHNlKHN1cGVyLmFkaiRwYXNpdm9Db3JyaWVudGUgPiAwLCBzdXBlci5hZGokYWN0aXZvQ29ycmllbnRlIC8gc3VwZXIuYWRqJHBhc2l2b0NvcnJpZW50ZSwgTkEpDQoNCmBgYA0KDQpVbiBncuFmaWNvIGRlIG11ZXN0cmEgZW4gUiBiYXNlOg0KYGBge3J9DQpoaXN0KHggPSBzdXBlci5hZGokcmF6b25Db3JyaWVudGUpDQpib3hwbG90KHJhem9uQ29ycmllbnRlIH4gZHB0bywgZGF0YSA9IHN1cGVyLmFkaikNCmBgYA0KDQpgYGB7cn0NCmxpYnJhcnkoZ2dwbG90MikNCmdncGxvdChkYXRhID0gc3VwZXIuYWRqLCBhZXMoeCA9IHJhem9uQ29ycmllbnRlKSkgKyBnZW9tX2hpc3RvZ3JhbSgpDQpnZ3Bsb3QoZGF0YSA9IHN1cGVyLmFkaiwgYWVzKHggPSByYXpvbkNvcnJpZW50ZSwgeSA9IGRwdG8pKSArIGdlb21fYm94cGxvdCgpDQpgYGANClJlbW92aWVuZG8gbG9zIG91dGxpZXJzOg0KYGBge3J9DQpzdXBlci5hZGouZmlsdGVyZWQgPC0gZmlsdGVyKHN1cGVyLmFkaiwgcmF6b25Db3JyaWVudGUgPCAxMCkNCmhpc3QoeCA9IHN1cGVyLmFkai5maWx0ZXJlZCRyYXpvbkNvcnJpZW50ZSkNCmJveHBsb3QocmF6b25Db3JyaWVudGUgfiBkcHRvLCBkYXRhID0gc3VwZXIuYWRqLmZpbHRlcmVkKQ0KYGBgDQoNCmBgYHtyfQ0KZ2dwbG90KGRhdGEgPSBzdXBlci5hZGouZmlsdGVyZWQsIGFlcyh4ID0gcmF6b25Db3JyaWVudGUpKSArIGdlb21faGlzdG9ncmFtKCkNCmdncGxvdChkYXRhID0gc3VwZXIuYWRqLmZpbHRlcmVkLCBhZXMoeCA9IGRwdG8sIHkgPSByYXpvbkNvcnJpZW50ZSkpICsgZ2VvbV9ib3hwbG90KCkgKyBjb29yZF9mbGlwKCkNCmBgYA0KDQpTZWxlY2Npb25hbmRvIGxvcyBkZXBhcnRhbWVudG9zIGEgYW5hbGl6YXI6DQpgYGB7cn0NCmxpYnJhcnkoZ2dwbG90MikNCm15RHB0byA8LSBjKCJCT0dPVEEgRC5DLiIsICJCT1lBQ0EiLCAiVE9MSU1BIikNCmdncGxvdChkYXRhID0gZmlsdGVyKHN1cGVyLmFkaiwgcmF6b25Db3JyaWVudGUgPCAxMCAmIGRwdG8gJWluJSBteURwdG8pLCBhZXMoeCA9IHJhem9uQ29ycmllbnRlKSkgKyBnZW9tX2hpc3RvZ3JhbSgpICsgZmFjZXRfd3JhcCh+IGRwdG8sIHNjYWxlcyA9ICJmcmVlX3kiKQ0KYGBgDQoNCkFob3JhIHVubyBkZSBkaXNwZXJzafNuOg0KYGBge3J9DQpwbG90KGFjdGl2b0NvcnJpZW50ZSB+IHBhc2l2b0NvcnJpZW50ZSwgZGF0YSA9IHN1cGVyLmFkai5maWx0ZXJlZCkNCmdncGxvdChkYXRhID0gZmlsdGVyKHN1cGVyLmFkaiwgcmF6b25Db3JyaWVudGUgPCAxMCAmIGRwdG8gJWluJSBteURwdG8pLCBhZXMoeCA9IHBhc2l2b0NvcnJpZW50ZSwgeSA9IGFjdGl2b0NvcnJpZW50ZSkpICsgZ2VvbV9wb2ludCgpICsgZmFjZXRfd3JhcCh+IGRwdG8sIHNjYWxlcyA9ICJmcmVlIikgKyBnZW9tX3Ntb290aChtZXRob2QgPSAibG0iKQ0KDQpgYGANCg0KDQpUYWxsZXIgNg0KLS0tLS0tLS0NCkVzdHVkaWFyIGxhIHJlbGFjafNuIGVudHJlIGVkdWNhY2nzbiAoY2FwaXRhbCBodW1hbm8pIHkgY3JlY2ltaWVudG8gZW4gbGEgYmFzZSBkZSBkYXRvcyBQV1Q5LjAuIA0KDQoNCiMjIEJMT1FVRSA3OiAgQWN0aXZpZGFkIEludGVncmFkb3JhDQpBcGxpY2FyIHRvZG8gbG8gYXByZW5kaWRvIGhhc3RhIGVsIG1vbWVudG8gYSB1biBwcm95ZWN0byBkZSBpbnZlc3RpZ2FjafNuLiANCg0KQ29uc3RydWlyIGxhIHNlY2Np824gZGUgZGVzY3JpcGNp824gZGUgbG9zIGRhdG9zIGRlIHVuIHByb3llY3RvIGRlIGludmVzdGlnYWNp824gbyB1biBpbmZvcm1lIGRlIGNvbnN1bHRvcu1hLg0KDQojIFNFQ0NJ004gQjogIEFwbGljYWNp824gZGUgUiBhIGxhIEVjb25vbWV0cu1hDQoNCiMjIEJMT1FVRSBERSBSRVBBU08gREUgQ0FSR0EgREUgREFUT1MNCmh0dHBzOi8vd3d3LnN1cGVyc29jaWVkYWRlcy5nb3YuY28vU2VydmljaW9fQ2l1ZGFkYW5vL3RyYW1pdGVzeXNlcnZpY2lvcy9QYWdpbmFzL1NJUkVNLmFzcHgNCg0KRnVuZGFtZW50b3MgZGUgcmVncmVzafNuOiBN7W5pbW9zIGN1YWRyYWRvcywgcHJvcGllZGFkZXMgeSBzdXB1ZXN0b3MuDQpgYGB7cn0NCmxpYnJhcnkocmVhZHhsKQ0KcGcyMDEzIDwtIHJlYWRfZXhjZWwoIkVzdGFkb1Jlc3VsdGFkb3MyMDEzU0lSRU1WMi54bHN4IikNCm5hbWVzKHBnMjAxMykNCg0KcGcyMDE0IDwtIHJlYWRfZXhjZWwoIkVzdGFkb1Jlc3VsdGFkb3MyMDE0U0lSRU1WMi54bHN4IikNCm5hbWVzKHBnMjAxNCkNCg0KbmFtZXMocGcyMDEzKSA9PSBuYW1lcyhwZzIwMTQpDQoNCnBnMjAxNSA8LSByZWFkX2V4Y2VsKCJFc3RhZG9SZXN1bHRhZG9zMjAxNVNJUkVNVjIueGxzIikNCm5hbWVzKHBnMjAxNSkNCg0KbmFtZXMocGcyMDEzKSA9PSBuYW1lcyhwZzIwMTUpDQpjYmluZChuYW1lcyhwZzIwMTMpLCBuYW1lcyhwZzIwMTUpKQ0KcGcyMDE1IDwtIHBnMjAxNVsgLCAtNV0NCg0KbmFtZXMocGcyMDE1KSA8LSBuYW1lcyhwZzIwMTMpDQoNCnBnIDwtIGxpc3QocGcyMDEzLCBwZzIwMTQsIHBnMjAxNSkNCg0KbmFtZXMocGdbWzFdXSkgPT0gbmFtZXMocGdbWzJdXSkNCm5hbWVzKHBnW1sxXV0pID09IG5hbWVzKHBnW1szXV0pDQphbGwobmFtZXMocGdbWzFdXSkgPT0gbmFtZXMocGdbWzNdXSkpDQp3aGljaCgobmFtZXMocGdbWzFdXSkgPT0gbmFtZXMocGdbWzNdXSkpID09IEZBTFNFKQ0KY2JpbmQobmFtZXMocGdbWzFdXSksIG5hbWVzKHBnW1szXV0pKQ0KDQpgYGANCg0KDQpgYGB7cn0NCmxpYnJhcnkocmVhZHhsKQ0KYmcyMDEzIDwtIHJlYWRfZXhjZWwoIkJhbGFuY2VHZW5lcmFsMjAxM1NJUkVNVjIueGxzeCIpDQpuYW1lcyhiZzIwMTMpDQoNCmJnMjAxNCA8LSByZWFkX2V4Y2VsKCJCYWxhbmNlR2VuZXJhbDIwMTRTSVJFTVYyLnhsc3giKQ0KbmFtZXMoYmcyMDE0KQ0KDQpuYW1lcyhiZzIwMTMpID09IG5hbWVzKGJnMjAxNCkNCg0KYmcyMDE1IDwtIHJlYWRfZXhjZWwoIkJhbGFuY2VHZW5lcmFsMjAxNVNJUkVNVjIueGxzIikNCm5hbWVzKGJnMjAxNSkNCg0KbmFtZXMoYmcyMDEzKSA9PSBuYW1lcyhiZzIwMTUpDQoNCmJnMjAxNSA8LSBiZzIwMTVbICwgLTVdDQpuYW1lcyhiZzIwMTMpID09IG5hbWVzKGJnMjAxNSkNCg0KbGlicmFyeShkcGx5cikNCmJnMTMxNSA8LSBiaW5kX3Jvd3MoYmcyMDEzLCBiZzIwMTQsIGJnMjAxNSwgLmlkID0gInllYXIiKQ0KbmFtZXMoYmcxMzE1KQ0KDQpiZzEzMTUgPC0gYmcxMzE1WyAsIGMoMSwgMjo3LCAxMywgNjEsIDExMSwgMTYyLCAyMTEsIDIzNCldDQpuYW1lcyhiZzEzMTUpDQpuYW1lcyhiZzEzMTUpIDwtIGMoInllYXIiLCAibml0IiwgInJhelNvYyIsICJjaXVkYWQiLCAiZHB0byIsDQogICAgICAgICAgICAgICAgICAgImNpaXUiLCAic2VjdG9yIiwgImRpc3BvbmlibGUiLCAiYWN0Q3RlIiwNCiAgICAgICAgICAgICAgICAgICAiYWN0VG90IiwgInBhc0N0ZSIsICJwYXNUb3QiLCAicGF0VG90IikNCm5hbWVzKGJnMTMxNSkNCmBgYA0KDQoNCmBgYHtyfQ0KcGcxMzE1IDwtIGJpbmRfcm93cyhwZywgLmlkID0gInllYXIiKQ0KZGltKHBnMTMxNSkNCm5hbWVzKHBnMTMxNSkNCm5hbWVzKHBnMTMxNSkgPC0gYygieWVhciIsICJuaXQiLCAicmF6U29jIiwgImNpdWRhZCIsICJkcHRvIiwgImNpaXUiLCAic2VjdG9yIiwNCiAgICAgICAgICAgICAgICAgICAiaW5nT3BlIiwgImNvc1ZlbiIsICJ1dGlCcnUiLCAiZ2FzQWRtIiwgImdhc1ZlbiIsICJ1dGlPcGUiLA0KICAgICAgICAgICAgICAgICAgICJpbmdOb09wZSIsICJnYXNOb09wZSIsICJpbnRlcmVzZXMiLCAidWFkaSIsICJpbXBSZW4iLCAidWRpIg0KICAgICAgICAgICAgICAgICAgICkNCm5hbWVzKHBnMTMxNSkNCmBgYA0KDQpgYGB7cn0NCmVmMTMxNSA8LSBtZXJnZShiZzEzMTUsIHBnMTMxNSkNCm5hbWVzKGVmMTMxNSkNCmBgYA0KDQpgYGB7cn0NCnN1bW1hcnkoZWYxMzE1KQ0KYGBgDQoNCmBgYHtyfQ0KbGlicmFyeShkcGx5cikNCmVmMTMxNSA8LSBlZjEzMTUgJT4lIA0KICBtdXRhdGUoDQogICAgcmF6Q29yID0gaWZlbHNlKHBhc0N0ZSA9PSAwLCBOQSwgYWN0Q3RlIC8gcGFzQ3RlKSwNCiAgICByb2EgICAgPSBpZmVsc2UoaW5nT3BlID09IDAsIE5BLCB1ZGkgLyBpbmdPcGUpIA0KICApDQoNCnN1bW1hcnkoZWYxMzE1KQ0KDQplZjEzMTUgPC0gZWYxMzE1ICU+JSANCiAgZmlsdGVyKHJvYSA+IC0xICYgcm9hIDwgMSkNCg0Kc3VtbWFyeShlZjEzMTUpDQoNCg0KbGlicmFyeShnZ3Bsb3QyKQ0KZ2dwbG90KGVmMTMxNSwgYWVzKHggPSBsb2cocmF6Q29yKSwgeSA9IHJvYSkpICsgZ2VvbV9wb2ludCgpICsgZmFjZXRfd3JhcCh+IGRwdG8pDQpgYGANCg0KDQojIyBCTE9RVUUgODogIEVsIG1vZGVsbyBkZSByZWdyZXNp824gc2ltcGxlIHkgbfpsdGlwbGUuDQpFeHBsb3JhciBlbCB1c28gZGUgUiBwYXJhIGxhIGVzdGltYWNp824gZGUgbW9kZWxvcyBkZSByZWdyZXNp824uDQoNCmBgYHtyfQ0KZWYxMzE1ICU+JSANCiAgZmlsdGVyKGRwdG8gPT0gIkJPWUFDQSIpICU+JSANCiAgc2VsZWN0KHJhekNvciwgcm9hKSAlPiUgDQogIGdncGxvdChhZXMoeCA9IGxvZyhyYXpDb3IpLCB5ID0gcm9hKSkgKyBnZW9tX3BvaW50KCkgKyBnZW9tX3Ntb290aCgpICNtZXRob2QgPSAibG0iKQ0KYGBgDQoNCmBgYHtyfQ0KZWYxMzE1ICU+JSANCiAgZmlsdGVyKGRwdG8gPT0gIkJPWUFDQSIpICU+JSANCiAgc2VsZWN0KHJhekNvciwgcm9hKSAlPiUgDQogIGxtKHJvYSB+IGxvZyhyYXpDb3IpLCBkYXRhID0gLikgJT4lICAjLCBuYS5hY3Rpb24gPSBuYS5vbWl0KQ0KICBzdW1tYXJ5DQoNCmRhdGFCb3lhY2EgPC0gZWYxMzE1ICU+JSANCiAgZmlsdGVyKGRwdG8gPT0gIkJPWUFDQSIpICU+JSANCiAgc2VsZWN0KHJhekNvciwgcm9hKQ0KDQpyZWdCb3lhY2EgPC0gbG0ocm9hIH4gbG9nKHJhekNvciksIGRhdGEgPSBkYXRhQm95YWNhKQ0KDQpwbG90KHJlZ0JveWFjYSkNCiMsIG5hLmFjdGlvbiA9IG5hLm9taXQpDQpgYGANCkhldGVyb3NjZWRhc3RpY2lkYWQ6DQpgYGB7cn0NCmxpYnJhcnkobG10ZXN0KQ0KIyBCcmV1c2NoLVBhZ2FuIHRlc3QNCmJwdGVzdChyZWdCb3lhY2EpDQpgYGANCg0KYGBge3J9DQojIFdoaXRlIHRlc3QNCmJwdGVzdChyZWdCb3lhY2EsIH4gbG9nKHJhekNvcikgKyBJKGxvZyhyYXpDb3IpKV4yLCBkYXRhID0gZGF0YUJveWFjYSkNCmBgYA0KDQpgYGB7cn0NCiMgR29sZGZlbGQtUXVhbmR0IHRlc3QNCmdxdGVzdChyZWdCb3lhY2EsIG9yZGVyLmJ5ID0gfnJhekNvciwgZGF0YSA9IGRhdGFCb3lhY2EpDQpgYGANCg0KYGBge3J9DQojIFJlc2V0IHRlc3QNCnJlc2V0dGVzdChyZWdCb3lhY2EpDQpgYGANCg0KYGBge3J9DQpsaWJyYXJ5KHNhbmR3aWNoKQ0KcmVnQm95YWNhIDwtIGxtKHJvYSB+IGxvZyhyYXpDb3IpLCBkYXRhID0gZGF0YUJveWFjYSkNCmNvZWYocmVnQm95YWNhKQ0KdmNvdihyZWdCb3lhY2EpDQpgYGANCg0KDQpgYGB7cn0NCmNvZWZ0ZXN0KHJlZ0JveWFjYSwgdmNvdiA9IHZjb3ZIQyhyZWdCb3lhY2EpKQ0KYGBgDQoNCg0KYGBge3J9DQpjb2VmdGVzdChyZWdCb3lhY2EpDQpgYGANCg0KRmFjdG9yIGRlIGluZmxhY2nzbiBkZSBWYXJpYW56YToNCmBgYHtyfQ0KI2luc3RhbGwucGFja2FnZXMoImNhciIpDQpsaWJyYXJ5KGNhcikNCnJlZ0JveWFjYTIgPC0gbG0ocm9hIH4gbG9nKHJhekNvcikgKyBhY3RUb3QsIGRhdGEgPSBmaWx0ZXIoZWYxMzE1LCBkcHRvID09ICJCT1lBQ0EiKSkNCmNvZWYocmVnQm95YWNhMikNCnZpZihyZWdCb3lhY2EyKQ0KYGBgDQoNCmBgYHtyfQ0KZWYxMzE1ICU+JSANCiAgZmlsdGVyKGRwdG8gPT0gIkJPWUFDQSIpICU+JSANCiAgc2VsZWN0KHJhekNvciwgcm9hLCBhY3RUb3QpICU+JSANCiAgbG0ocm9hIH4gbG9nKHJhekNvcikgKyBhY3RUb3QsIGRhdGEgPSAuKSAlPiUgICMsIG5hLmFjdGlvbiA9IG5hLm9taXQpDQogIHN1bW1hcnkNCmBgYA0KDQpgYGB7cn0NCmVmMTMxNSAlPiUgDQogICNmaWx0ZXIoZHB0byA9PSAiQk9ZQUNBIikgJT4lDQogIGZpbHRlcihyYXpDb3IgPiAwKSAlPiUgDQogIHNlbGVjdChyYXpDb3IsIHJvYSkgJT4lDQogIGxtKHJvYSB+IGxvZyhyYXpDb3IpLCBkYXRhID0gLikgJT4lICAjLCBuYS5hY3Rpb24gPSBuYS5vbWl0KQ0KICBzdW1tYXJ5DQpgYGANCg0KYGBge3J9DQplZjEzMTUgJT4lIA0KICAjZmlsdGVyKGRwdG8gPT0gIkJPWUFDQSIpICU+JQ0KICBmaWx0ZXIocmF6Q29yID4gMCkgJT4lIA0KICBzZWxlY3QocmF6Q29yLCByb2EsIGFjdFRvdCkgJT4lDQogIGxtKHJvYSB+IGxvZyhyYXpDb3IpICsgYWN0VG90LCBkYXRhID0gLikgJT4lICAjLCBuYS5hY3Rpb24gPSBuYS5vbWl0KQ0KICBzdW1tYXJ5DQpgYGANCg0KYGBge3J9DQplZjEzMTUgJT4lIA0KICAjZmlsdGVyKGRwdG8gPT0gIkJPWUFDQSIpICU+JQ0KICBmaWx0ZXIocmF6Q29yID4gMCkgJT4lIA0KICBzZWxlY3QocmF6Q29yLCByb2EsIGFjdFRvdCwgZHB0bykgJT4lDQogIGxtKHJvYSB+IGxvZyhyYXpDb3IpICsgYWN0VG90ICsgZHB0bywgZGF0YSA9IC4pICU+JSAgIywgbmEuYWN0aW9uID0gbmEub21pdCkNCiAgc3VtbWFyeQ0KYGBgDQoNCmBgYHtyfQ0KZWYxMzE1JGNpaXUxIDwtIHN1YnN0cihlZjEzMTUkY2lpdSwgMSwxKSANCmVmMTMxNSAlPiUgc2VsZWN0KG5pdCwgY2lpdSwgY2lpdTEpICU+JSBoZWFkKCkNCmBgYA0KDQpBcGxpY2FjaW9uZXMgZGUgbGEgcmVncmVzafNuLiAgSW50ZXJwcmV0YWNp824gZGUgbG9zIHJlc3VsdGFkb3M6IEVmZWN0b3MgbWFyZ2luYWxlcyB5IG1vZGVsb3Mgbm8gbGluZWFsZXMuDQpgYGB7cn0NCmVmMTMxNSAlPiUgDQogICNmaWx0ZXIoZHB0byA9PSAiQk9ZQUNBIikgJT4lDQogIGZpbHRlcihyYXpDb3IgPiAwKSAlPiUgDQogIGxtKHJvYSB+IGxvZyhyYXpDb3IpICsgYWN0VG90ICsgY2lpdTEsIGRhdGEgPSAuKSAlPiUgICMsIG5hLmFjdGlvbiA9IG5hLm9taXQpDQogIHN1bW1hcnkNCg0KYGBgDQoNCmBgYHtyfQ0KDQpgYGANCg0KVmFsaWRhY2nzbiBkZSBsb3MgbW9kZWxvcy4gIFN1cHVlc3Rvcy4NCg0KVGFsbGVyDQoNCiMjIEJMT1FVRSA5OiAgUmVncmVzafNuIG36bHRpcGxlIGVuIGxhIEludmVzdGlnYWNp824gIA0KRXN0dWRpYXIgZWwgdXNvIGRlIGxvcyBtb2RlbG9zIGRlIHJlZ3Jlc2nzbiBlbiBsYSBpbnZlc3RpZ2FjafNuLg0KDQpMZWN0dXJhIGRlIGFydO1jdWxvcyBkZSBpbnZlc3RpZ2FjafNuLg0KDQpDb21wYXJhY2nzbiBkZSBsb3MgbW9kZWxvIGRlIHJlZ3Jlc2nzbiB5IGFu4Wxpc2lzLg0KDQpJbmZvcm1lcyBkZSBpbnZlc3RpZ2FjafNuIHRpcG8gcGFwZXIvYXJ07WN1bG8uDQoNCmBgYHtyfQ0KbW9kZWwxIDwtIHJvYSB+IGxvZyhyYXpDb3IpDQptb2RlbDIgPC0gcm9hIH4gbG9nKHJhekNvcikgKyBhY3RUb3QNCm1vZGVsMyA8LSByb2EgfiBsb2cocmF6Q29yKSAqIGFjdFRvdA0KDQpteU1vZGVscyA8LSBsaXN0KG1vZGVsMSwgbW9kZWwyLCBtb2RlbDMpDQpteU1vZGVscw0KDQpteVJlZ3MgPC0gbGFwcGx5KG15TW9kZWxzLCBmdW5jdGlvbih4KSBsbSh4LCBkYXRhID0gZmlsdGVyKGVmMTMxNSwgZHB0byA9PSAiQk9ZQUNBIikpKQ0KDQpsaWJyYXJ5KCJ0ZXhyZWciKQ0KaHRtbHJlZyhteVJlZ3MsIGZpbGUgPSAib3V0cHV0LmRvYyIpDQpgYGANCg0KIyMgQkxPUVVFIDEwOiAgUmVncmVzafNuIHNvYnJlIG36bHRpcGxlcyBncnVwb3MgeSB1c28gYXZhbnphZG8gZGUgUi4gDQpFc3R1ZGlhciBlbCB1c28gZGUgbG9zIG1vZGVsb3MgZGUgcmVncmVzafNuIGVuIGVzdHJ1Y3R1cmFzIGNvbXBsZWphcyBkZSBkYXRvcyBnZW5lcmFsbWVudGUgdXRpbGl6YWRvcyBlbiBsYSBpbnZlc3RpZ2FjafNuLiAgDQoNCmBgYHtyfQ0KIyBEZXNhcnJvbGxhciByZWdyZXNpb25lcyBwb3IgZGVwYXJ0YW1lbnRvcyB5IGFuYWxpemFyIGxhIGRpc3RyaWJ1Y2nzbiBkZSBsb3MgY29lZmljaWVudGVzIGEgdHJhdulzIGRlbCBwYe1zLg0KYGBgDQoNCkludGVncmFyIGxhcyBoZXJyYW1pZW50YXMgZGUgdGlkeXZlcnNlIGFsIGFu4Wxpc2lzIGRlIHJlZ3Jlc2nzbi4NCg0KDQojIyBCTE9RVUUgMTE6ICBNb2RlbG9zIFBhbmVsIGVzdOF0aWNvcyBlbiBSDQpFeHBsb3JhciBlbCB1c28gZGUgUiBwYXJhIGxhIGVzdGltYWNp824gZGUgbW9kZWxvcyBkZSBwYW5lbCAoUG9vbGluZywgRWZlY3RvcyBmaWpvcywgRWZlY3RvcyBhbGVhdG9yaW9zKSANCg0KRnVuZGFtZW50YWNp824NCg0KRXN0aW1hY2nzbiBkZSBsb3MgbW9kZWxvcyBlbiBSLg0KDQpUYWxsZXIgcmVwb3J0ZSBkZSByZXN1bHRhZG9zIGRlIGludmVzdGlnYWNp824uIA0KDQojIyBCTE9RVUUgMTI6ICBTZXNp824gZGUgQ29uc29saWRhY2nzbg0KUmVwYXNhciB5IGFjbGFyYXIgZHVkYXMgc29icmUgUiB5IEVjb25vbWV0cu1hLg0KDQpBY2xhcmFjafNuIGRlIGR1ZGFzLg0KDQpQcmVzZW50YWNp824geSBkaXNjdXNp824gZGUgbG9zIHByb3llY3Rvcy4NCg==