En el modelo de regresión lineal simple se quieren conocer las interrelaciones entre dos variables, de las cuales por lo menos una es una variable aleatoria

Supuestos

1.-La relación entre Y y X es lineal.

2.-Las Xi son variables no estocƔsticas (no aleatorias) cuyos valores son fijos (o controlados por el experimentador).

3.-La media del tƩrmino error es cero.

4.-La varianza del tƩrmino error es igual en todos los niveles de X. Es el principio de homocedasticidad.

5.-No existe autocorrelación entre el término error de diferentes niveles de X.

6.-La covarianza entre el tƩrmino error y la variable explicativa X es cero.

7.-El número de observaciones (el tamaño de la muestra) debe ser superior al número de parÔmetros a estimar.

8.-Los valores de X en una muestra dada no pueden ser todos iguales, teóricamente la var(X) debe ser un número finito positivo.

9.-El modelo estĆ” correctamente especificado.

10.-No existe multicolinealidad perfecta.

Supuestos según mi interpretación

Relaciónes por default
La relación entre Y y X es lineal. (Esta relación se ve desde la grÔfica de la variable dependiente e independiente)

Las Xi son variables no estocƔsticas (no aleatorias) cuyos valores son fijos (o controlados por el experimentador). (No hace falta explicarla)

El número de observaciones (el tamaño de la muestra) debe ser superior al número de parÔmetros a estimar.(Si tenemos 4 betas, las observaciones deben ser mínimo 5, n<betas )

Los valores de X en una muestra dada no pueden ser todos iguales, teóricamente la var(X) debe ser un número finito positivo. LOS VALORES DE Y DEBEN SER DIFERENTES PARA CADA x

El modelo estÔ correctamente especificado.(Tiene que ver la coherencia teórica del modelo, no una relación espuria )


Supuestos que tienen que ver con el error

La media del tƩrmino error es cero. (solo basta con obtener el promedio)

TambiƩn hay que checar la normalidad de los errores

La varianza del tƩrmino error es igual en todos los niveles de X. Es el principio de homocedasticidad.(se obtienen con bp.test)

La covarianza entre el término error y la variable explicativa X es cero. (Se hace una covarianza entre x y los errore, otros hacen una correlación, estoy casi seguro que no es necesario, nunca va a haber correlación )


Supuestos que sólo aplican a ciertos casos

No existe multicolinealidad perfecta. (Sólo para regresiones multiples, se hace una correlación entre las variables)

No existe autocorrelación entre el término error de diferentes niveles de X. (Se debe ser hacer en series de tiempo con la prueba durbin-watson)

Importar y explorar datos

url1<-"https://raw.githubusercontent.com/armandovl/datasets_uno/main/Avance_Metodos.csv"
datos1<-read.csv(url(url1))
head(datos1)

Estamos probando si el porcentaje de deserción escolar a los 15 años estÔ en función del porcentaje de carencia alimenticia, las observaciones son por municipios en México

#ver la relación entre las variables
plot(datos1$por_car_alim,datos1$por_des_15,)

#ponemos el grƔfico mƔs estƩtico
plot(datos1$por_car_alim,datos1$por_des_15,
     col="green3", #color a los puntos
     pch=18, #cambiar el tipo de puntos
     main="Relación carencia alimentaria y deserción escolar",#título
     xlab = "% poblacion con carencia aimentaria" ,
     ylab = "% poblacion con deserción escolar" 
     )

Obtener manualmente la pendiente y el intercepto

#desviación estandar en x
sd(datos1$por_car_alim)
[1] 19.07691
#desviación estandar en y
sd(datos1$por_des_15)
[1] 9.630251
correlacionXY<-cor(datos1[,2:6])
print(correlacionXY)
              por_des_15 po_per_pob por_sin_seg por_car_salud por_car_alim
por_des_15     1.0000000  0.7543165   0.2726830     0.2784925    0.8202800
po_per_pob     0.7543165  1.0000000   0.3299312     0.3303831    0.8710004
por_sin_seg    0.2726830  0.3299312   1.0000000     0.9524951    0.2592960
por_car_salud  0.2784925  0.3303831   0.9524951     1.0000000    0.2668206
por_car_alim   0.8202800  0.8710004   0.2592960     0.2668206    1.0000000
correlacionXY<-cor(datos1[,2:6])[5,1] #la posición columna 3,fila 1
print(correlacionXY)
[1] 0.82028
#valor de la pendiente
correlacionXY<-cor(datos1[,2:6])[5,1]
desvX<-sd(datos1$por_car_alim)
desvY<-sd(datos1$por_des_15)

pendiente<-correlacionXY*(desvY/desvX)
print(pendiente)
[1] 0.4140871
#calcular el valor de la pendiente 2
covarianzaXY<-cov(datos1$por_car_alim,datos1$por_des_15)
varianzaX<-var(datos1$por_car_alim)

pendiente2<-covarianzaXY/varianzaX
print(pendiente2)
[1] 0.4140871
#cƔlculo del intercepto
mediaX<-mean(datos1$por_car_alim)
mediaY<-mean(datos1$por_des_15)

intercepto<-mediaY-(pendiente2*mediaX)
print(intercepto)
[1] 0.7722395

Entrenar el modelo

modelo1<-lm(datos1$por_des_15~datos1$por_car_alim)
#ver los coeficientes
modelo1

Call:
lm(formula = datos1$por_des_15 ~ datos1$por_car_alim)

Coefficients:
        (Intercept)  datos1$por_car_alim  
             0.7722               0.4141  
#ver el resumen del modelo
#se destaca el p valor de 2.2 por 10 a la -16, nos dice que si hay pendiente
summary(modelo1)

Call:
lm(formula = datos1$por_des_15 ~ datos1$por_car_alim)

Residuals:
     Min       1Q   Median       3Q      Max 
-20.8050  -3.0055  -0.4101   2.4206  31.4353 

Coefficients:
                    Estimate Std. Error t value Pr(>|t|)    
(Intercept)         0.772240   0.216663   3.564 0.000372 ***
datos1$por_car_alim 0.414087   0.005829  71.045  < 2e-16 ***
---
Signif. codes:  0 ā€˜***’ 0.001 ā€˜**’ 0.01 ā€˜*’ 0.05 ā€˜.’ 0.1 ā€˜ ’ 1

Residual standard error: 5.509 on 2454 degrees of freedom
Multiple R-squared:  0.6729,    Adjusted R-squared:  0.6727 
F-statistic:  5047 on 1 and 2454 DF,  p-value: < 2.2e-16
anova(modelo1) #el p valor serĆ­a el mismo si le sacamos un anova al modelo
Analysis of Variance Table

Response: datos1$por_des_15
                      Df Sum Sq Mean Sq F value    Pr(>F)    
datos1$por_car_alim    1 153197  153197  5047.4 < 2.2e-16 ***
Residuals           2454  74484      30                      
---
Signif. codes:  0 ā€˜***’ 0.001 ā€˜**’ 0.01 ā€˜*’ 0.05 ā€˜.’ 0.1 ā€˜ ’ 1
#grafico unido
par(mfcol = c(2, 2))
plot(modelo1)

par(mfcol = c(1, 1))

AnƔlizar los supuestos de los residuos

residuos=residuals(modelo1)

La media del tƩrmino error es cero. (solo basta con obtener el promedio)

mean(residuos)
[1] -1.48209e-17

Normalidad de los errores

TambiƩn hay que checar la normalidad de os errores
ver si los errores son independientes , se distribuyen de manera normal

plot(modelo,2)

par(mfrow=c(2,1))
hist(residuos, col="yellow")
boxplot(residuos, bty="l", range=1.5, col="yellow", horizontal=T,xlab="residuos")


par(mfrow=c(1,1))

hist(residuos,
     breaks=25,
     col="lightblue",
     freq=FALSE,
     )

lines(density(residuos), lwd = 2, col = 'blue')

#tendencia de curva normal
x <- seq(min(residuos), max(residuos), length = 40)
f <- dnorm(x, mean = mean(residuos), sd = sd(residuos))
lines(x, f, col = "red", lwd = 2)


Test de normalidad h0= distribución normal, se busca valores mayores a 0.05

! En este caso ,No se acepta el supuesto de normalidad

shapiro.test(residuos) #menos de 50 observaciones

    Shapiro-Wilk normality test

data:  residuos
W = 0.95077, p-value < 2.2e-16
#para mƔs de 50 observaciones
#kolmorogov
ks.test(residuos,"pnorm", mean(residuos), sd(residuos))

    One-sample Kolmogorov-Smirnov test

data:  residuos
D = 0.083476, p-value = 2.776e-15
alternative hypothesis: two-sided
ks.test(residuos, "pnorm") #creo que es mejor la de arriba

    One-sample Kolmogorov-Smirnov test

data:  residuos
D = 0.31932, p-value < 2.2e-16
alternative hypothesis: two-sided
# Alternativamente conviene usar la modificación de Lilliefors a este test.
# Esta corrección considera que los parÔmetros son estimados, a diferencia
# del «ks» «a secas»:

library(nortest)
lillie.test(residuos)

    Lilliefors (Kolmogorov-Smirnov) normality test

data:  residuos
D = 0.083476, p-value < 2.2e-16
# realizar la prueba Anderson-Darling para comprobar la normalidad
ad.test (residuos)

    Anderson-Darling normality test

data:  residuos
A = 30.174, p-value < 2.2e-16

Homogeneidad de varianzas

La varianza del tƩrmino error es igual en todos los niveles de X. Es el principio de homocedasticidad.(se obtienen con bp.test)

Se busca un pvalor mayor a 0.05 ya que la h0=las pruebas son homogeneas


#En este caso se rechaza la h0, por lo tanto hay heteregeneidad de varianza,no se cumple el supuesto
library(lmtest)
bptest(modelo)

    studentized Breusch-Pagan test

data:  modelo
BP = 329.13, df = 1, p-value < 2.2e-16

Probar la homogeneidad por el mƩtodo grƔfico
los residuos versus los predichos hacen una forma de embudo

predichos=fitted(modelo1)
plot(residuos~predichos)

plot(residuos)

plot(modelo1,1)

relacion residuos con X (no endogeneidad)

Creo que nunca va a haber correlacion

cor(residuos, datos1$por_car_alim)
[1] -3.80044e-18
cov(residuos, datos1$por_car_alim)
[1] -3.993438e-16
plot (datos1$por_car_alim,residuos)

plot (residuos~datos1$por_des_15)

plot (datos1$por_des_15,residuos)

LS0tDQp0aXRsZTogIlJlZ3Jlc2nDs24gTGluZWFsIFN1cHVlc3RvcyINCm91dHB1dDogaHRtbF9ub3RlYm9vaw0KDQotLS0NCjxwIGFsaWduPSJqdXN0aWZ5Ij4NCkVuIGVsIG1vZGVsbyBkZSByZWdyZXNpw7NuIGxpbmVhbCBzaW1wbGUgc2UgcXVpZXJlbiBjb25vY2VyIGxhcyBpbnRlcnJlbGFjaW9uZXMgZW50cmUgZG9zIHZhcmlhYmxlcywgZGUgbGFzIGN1YWxlcyBwb3IgbG8gbWVub3MgdW5hIGVzIHVuYSB2YXJpYWJsZSBhbGVhdG9yaWEgDQo8L3A+DQoNCiMjIFN1cHVlc3Rvcw0KPHAgYWxpZ249Imp1c3RpZnkiPg0KMS4tTGEgcmVsYWNpw7NuIGVudHJlIFkgeSBYIGVzIGxpbmVhbC48YnI+DQoNCjIuLUxhcyBYaSBzb24gdmFyaWFibGVzIG5vIGVzdG9jw6FzdGljYXMgKG5vIGFsZWF0b3JpYXMpIGN1eW9zIHZhbG9yZXMgc29uIGZpam9zIChvIGNvbnRyb2xhZG9zIHBvciBlbCBleHBlcmltZW50YWRvcikuPGJyPiANCg0KMy4tTGEgbWVkaWEgZGVsIHTDqXJtaW5vIGVycm9yIGVzIGNlcm8uIDxicj4NCg0KNC4tTGEgdmFyaWFuemEgZGVsIHTDqXJtaW5vIGVycm9yIGVzIGlndWFsIGVuIHRvZG9zIGxvcyBuaXZlbGVzIGRlIFguIEVzIGVsIHByaW5jaXBpbyBkZSBob21vY2VkYXN0aWNpZGFkLjxicj4NCg0KNS4tTm8gZXhpc3RlIGF1dG9jb3JyZWxhY2nDs24gZW50cmUgZWwgdMOpcm1pbm8gZXJyb3IgZGUgZGlmZXJlbnRlcyBuaXZlbGVzIGRlIFguPGJyPg0KDQo2Li1MYSBjb3ZhcmlhbnphIGVudHJlIGVsIHTDqXJtaW5vIGVycm9yIHkgbGEgdmFyaWFibGUgZXhwbGljYXRpdmEgWCBlcyBjZXJvLjxicj4NCg0KNy4tRWwgbsO6bWVybyBkZSBvYnNlcnZhY2lvbmVzIChlbCB0YW1hw7FvIGRlIGxhIG11ZXN0cmEpIGRlYmUgc2VyIHN1cGVyaW9yIGFsIG7Dum1lcm8gZGUgcGFyw6FtZXRyb3MgYSBlc3RpbWFyLjxicj4NCg0KOC4tTG9zIHZhbG9yZXMgZGUgWCBlbiB1bmEgbXVlc3RyYSBkYWRhIG5vIHB1ZWRlbiBzZXIgdG9kb3MgaWd1YWxlcywgdGXDs3JpY2FtZW50ZSBsYSB2YXIoWCkgZGViZSBzZXIgdW4gbsO6bWVybyBmaW5pdG8gcG9zaXRpdm8uPGJyPg0KDQo5Li1FbCBtb2RlbG8gZXN0w6EgY29ycmVjdGFtZW50ZSBlc3BlY2lmaWNhZG8uPGJyPg0KDQoxMC4tTm8gZXhpc3RlIG11bHRpY29saW5lYWxpZGFkIHBlcmZlY3RhLjxicj4NCjwvcD4NCg0KIyMgU3VwdWVzdG9zIHNlZ8O6biBtaSBpbnRlcnByZXRhY2nDs24NCg0KPHA+DQo8c3Ryb25nPlJlbGFjacOzbmVzIHBvciBkZWZhdWx0PC9zdHJvbmc+IDxicj4NCkxhIHJlbGFjacOzbiBlbnRyZSBZIHkgWCBlcyBsaW5lYWwuIChFc3RhIHJlbGFjacOzbiBzZSB2ZSBkZXNkZSBsYSBncsOhZmljYSBkZSBsYSB2YXJpYWJsZSBkZXBlbmRpZW50ZSBlIGluZGVwZW5kaWVudGUpPGJyPg0KDQpMYXMgWGkgc29uIHZhcmlhYmxlcyBubyBlc3RvY8Ohc3RpY2FzIChubyBhbGVhdG9yaWFzKSBjdXlvcyB2YWxvcmVzIHNvbiBmaWpvcyAobyBjb250cm9sYWRvcyBwb3IgZWwgZXhwZXJpbWVudGFkb3IpLiAoTm8gaGFjZSBmYWx0YSBleHBsaWNhcmxhKSA8YnI+DQoNCkVsIG7Dum1lcm8gZGUgb2JzZXJ2YWNpb25lcyAoZWwgdGFtYcOxbyBkZSBsYSBtdWVzdHJhKSBkZWJlIHNlciBzdXBlcmlvciBhbCBuw7ptZXJvIGRlIHBhcsOhbWV0cm9zIGEgZXN0aW1hci4oU2kgdGVuZW1vcyA0IGJldGFzLCBsYXMgb2JzZXJ2YWNpb25lcyBkZWJlbiBzZXIgbcOtbmltbyA1LCBuPGJldGFzICk8YnI+DQoNCkxvcyB2YWxvcmVzIGRlIFggZW4gdW5hIG11ZXN0cmEgZGFkYSBubyBwdWVkZW4gc2VyIHRvZG9zIGlndWFsZXMsIHRlw7NyaWNhbWVudGUgbGEgdmFyKFgpIGRlYmUgc2VyIHVuIG7Dum1lcm8gZmluaXRvIHBvc2l0aXZvLiBMT1MgVkFMT1JFUyBERSBZIERFQkVOIFNFUiBESUZFUkVOVEVTIFBBUkEgQ0FEQSB4PGJyPg0KDQpFbCBtb2RlbG8gZXN0w6EgY29ycmVjdGFtZW50ZSBlc3BlY2lmaWNhZG8uKFRpZW5lIHF1ZSB2ZXIgbGEgY29oZXJlbmNpYSB0ZcOzcmljYSBkZWwgbW9kZWxvLCBubyB1bmEgcmVsYWNpw7NuIGVzcHVyaWEgKTxicj4NCjwvcD4NCg0KPGJyPg0KDQo8c3Ryb25nPlN1cHVlc3RvcyBxdWUgdGllbmVuIHF1ZSB2ZXIgY29uIGVsIGVycm9yPC9zdHJvbmc+DQo8cD4NCkxhIG1lZGlhIGRlbCB0w6lybWlubyBlcnJvciBlcyBjZXJvLiAoc29sbyBiYXN0YSBjb24gb2J0ZW5lciBlbCBwcm9tZWRpbyk8YnI+DQoNCjxzdHJvbmc+VGFtYmnDqW4gaGF5IHF1ZSBjaGVjYXIgbGEgbm9ybWFsaWRhZCBkZSBsb3MgZXJyb3Jlczwvc3Ryb25nPg0KDQpMYSB2YXJpYW56YSBkZWwgdMOpcm1pbm8gZXJyb3IgZXMgaWd1YWwgZW4gdG9kb3MgbG9zIG5pdmVsZXMgZGUgWC4gRXMgZWwgcHJpbmNpcGlvIGRlIGhvbW9jZWRhc3RpY2lkYWQuKHNlIG9idGllbmVuIGNvbiBicC50ZXN0KSA8YnI+DQoNCg0KTGEgY292YXJpYW56YSBlbnRyZSBlbCB0w6lybWlubyBlcnJvciB5IGxhIHZhcmlhYmxlIGV4cGxpY2F0aXZhIFggZXMgY2Vyby4gKFNlIGhhY2UgdW5hIGNvdmFyaWFuemEgZW50cmUgeCB5IGxvcyBlcnJvcmUsIG90cm9zIGhhY2VuIHVuYSBjb3JyZWxhY2nDs24sIGVzdG95IGNhc2kgc2VndXJvIHF1ZSBubyBlcyBuZWNlc2FyaW8sIG51bmNhIHZhIGEgaGFiZXIgY29ycmVsYWNpw7NuICkgPGJyPg0KDQo8YnI+DQoNCjwvcD4NCg0KPHN0cm9uZz5TdXB1ZXN0b3MgcXVlIHPDs2xvIGFwbGljYW4gYSBjaWVydG9zIGNhc29zPC9zdHJvbmc+DQo8cD4NCk5vIGV4aXN0ZSBtdWx0aWNvbGluZWFsaWRhZCBwZXJmZWN0YS4gKFPDs2xvIHBhcmEgcmVncmVzaW9uZXMgbXVsdGlwbGVzLCBzZSBoYWNlIHVuYSBjb3JyZWxhY2nDs24gZW50cmUgbGFzIHZhcmlhYmxlcykgPGJyPg0KDQpObyBleGlzdGUgYXV0b2NvcnJlbGFjacOzbiBlbnRyZSBlbCB0w6lybWlubyBlcnJvciBkZSBkaWZlcmVudGVzIG5pdmVsZXMgZGUgWC4gKFNlIGRlYmUgc2VyIGhhY2VyIGVuIHNlcmllcyBkZSB0aWVtcG8gY29uIGxhIHBydWViYSBkdXJiaW4td2F0c29uKTxicj4NCjwvcD4NCg0KDQojIyBJbXBvcnRhciB5IGV4cGxvcmFyIGRhdG9zDQpgYGB7cn0NCnVybDE8LSJodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vYXJtYW5kb3ZsL2RhdGFzZXRzX3Vuby9tYWluL0F2YW5jZV9NZXRvZG9zLmNzdiINCmRhdG9zMTwtcmVhZC5jc3YodXJsKHVybDEpKQ0KaGVhZChkYXRvczEpDQpgYGANCg0KRXN0YW1vcyBwcm9iYW5kbyBzaSBlbCBwb3JjZW50YWplIGRlIGRlc2VyY2nDs24gZXNjb2xhciBhIGxvcyAxNSBhw7FvcyBlc3TDoSBlbiBmdW5jacOzbiBkZWwgcG9yY2VudGFqZSBkZSBjYXJlbmNpYSBhbGltZW50aWNpYSwgbGFzIG9ic2VydmFjaW9uZXMgc29uIHBvciBtdW5pY2lwaW9zIGVuIE3DqXhpY28NCmBgYHtyfQ0KI3ZlciBsYSByZWxhY2nDs24gZW50cmUgbGFzIHZhcmlhYmxlcw0KcGxvdChkYXRvczEkcG9yX2Nhcl9hbGltLGRhdG9zMSRwb3JfZGVzXzE1KQ0KYGBgDQoNCmBgYHtyfQ0KI3BvbmVtb3MgZWwgZ3LDoWZpY28gbcOhcyBlc3TDqXRpY28NCnBsb3QoZGF0b3MxJHBvcl9jYXJfYWxpbSxkYXRvczEkcG9yX2Rlc18xNSwNCiAgICAgY29sPSJncmVlbjMiLCAjY29sb3IgYSBsb3MgcHVudG9zDQogICAgIHBjaD0xOCwgI2NhbWJpYXIgZWwgdGlwbyBkZSBwdW50b3MNCiAgICAgbWFpbj0iUmVsYWNpw7NuIGNhcmVuY2lhIGFsaW1lbnRhcmlhIHkgZGVzZXJjacOzbiBlc2NvbGFyIiwjdMOtdHVsbw0KICAgICB4bGFiID0gIiUgcG9ibGFjaW9uIGNvbiBjYXJlbmNpYSBhaW1lbnRhcmlhIiAsDQogICAgIHlsYWIgPSAiJSBwb2JsYWNpb24gY29uIGRlc2VyY2nDs24gZXNjb2xhciIgDQogICAgICkNCmBgYA0KDQojIyBPYnRlbmVyIG1hbnVhbG1lbnRlIGxhIHBlbmRpZW50ZSB5IGVsIGludGVyY2VwdG8NCg0KYGBge3J9DQojZGVzdmlhY2nDs24gZXN0YW5kYXIgZW4geA0Kc2QoZGF0b3MxJHBvcl9jYXJfYWxpbSkNCmBgYA0KDQpgYGB7cn0NCiNkZXN2aWFjacOzbiBlc3RhbmRhciBlbiB5DQpzZChkYXRvczEkcG9yX2Rlc18xNSkNCmBgYA0KYGBge3J9DQpjb3JyZWxhY2lvblhZPC1jb3IoZGF0b3MxWywyOjZdKQ0KcHJpbnQoY29ycmVsYWNpb25YWSkNCmBgYA0KYGBge3J9DQpjb3JyZWxhY2lvblhZPC1jb3IoZGF0b3MxWywyOjZdKVs1LDFdICNsYSBwb3NpY2nDs24gY29sdW1uYSAzLGZpbGEgMQ0KcHJpbnQoY29ycmVsYWNpb25YWSkNCmBgYA0KDQpgYGB7cn0NCiN2YWxvciBkZSBsYSBwZW5kaWVudGUNCmNvcnJlbGFjaW9uWFk8LWNvcihkYXRvczFbLDI6Nl0pWzUsMV0NCmRlc3ZYPC1zZChkYXRvczEkcG9yX2Nhcl9hbGltKQ0KZGVzdlk8LXNkKGRhdG9zMSRwb3JfZGVzXzE1KQ0KDQpwZW5kaWVudGU8LWNvcnJlbGFjaW9uWFkqKGRlc3ZZL2Rlc3ZYKQ0KcHJpbnQocGVuZGllbnRlKQ0KDQpgYGANCg0KDQoNCmBgYHtyfQ0KI2NhbGN1bGFyIGVsIHZhbG9yIGRlIGxhIHBlbmRpZW50ZSAyDQpjb3ZhcmlhbnphWFk8LWNvdihkYXRvczEkcG9yX2Nhcl9hbGltLGRhdG9zMSRwb3JfZGVzXzE1KQ0KdmFyaWFuemFYPC12YXIoZGF0b3MxJHBvcl9jYXJfYWxpbSkNCg0KcGVuZGllbnRlMjwtY292YXJpYW56YVhZL3ZhcmlhbnphWA0KcHJpbnQocGVuZGllbnRlMikNCmBgYA0KYGBge3J9DQojY8OhbGN1bG8gZGVsIGludGVyY2VwdG8NCm1lZGlhWDwtbWVhbihkYXRvczEkcG9yX2Nhcl9hbGltKQ0KbWVkaWFZPC1tZWFuKGRhdG9zMSRwb3JfZGVzXzE1KQ0KDQppbnRlcmNlcHRvPC1tZWRpYVktKHBlbmRpZW50ZTIqbWVkaWFYKQ0KcHJpbnQoaW50ZXJjZXB0bykNCmBgYA0KDQoNCiMjIEVudHJlbmFyIGVsIG1vZGVsbw0KYGBge3J9DQptb2RlbG8xPC1sbShkYXRvczEkcG9yX2Rlc18xNX5kYXRvczEkcG9yX2Nhcl9hbGltKQ0KYGBgDQoNCmBgYHtyfQ0KI3ZlciBsb3MgY29lZmljaWVudGVzDQptb2RlbG8xDQpgYGANCg0KYGBge3J9DQojdmVyIGVsIHJlc3VtZW4gZGVsIG1vZGVsbw0KI3NlIGRlc3RhY2EgZWwgcCB2YWxvciBkZSAyLjIgcG9yIDEwIGEgbGEgLTE2LCBub3MgZGljZSBxdWUgc2kgaGF5IHBlbmRpZW50ZQ0Kc3VtbWFyeShtb2RlbG8xKQ0KYGBgDQoNCmBgYHtyfQ0KYW5vdmEobW9kZWxvMSkgI2VsIHAgdmFsb3Igc2Vyw61hIGVsIG1pc21vIHNpIGxlIHNhY2Ftb3MgdW4gYW5vdmEgYWwgbW9kZWxvDQpgYGANCmBgYHtyfQ0KI2dyYWZpY28gdW5pZG8NCnBhcihtZmNvbCA9IGMoMiwgMikpDQpwbG90KG1vZGVsbzEpDQoNCnBhcihtZmNvbCA9IGMoMSwgMSkpDQpgYGANCg0KDQoNCiMjIEFuw6FsaXphciBsb3Mgc3VwdWVzdG9zIGRlIGxvcyByZXNpZHVvcw0KYGBge3J9DQpyZXNpZHVvcz1yZXNpZHVhbHMobW9kZWxvMSkNCmBgYA0KDQojIyMgTGEgbWVkaWEgZGVsIHTDqXJtaW5vIGVycm9yIGVzIGNlcm8uIChzb2xvIGJhc3RhIGNvbiBvYnRlbmVyIGVsIHByb21lZGlvKQ0KYGBge3J9DQptZWFuKHJlc2lkdW9zKSAjZXMgbXV5IGNlcmNhbmEgYSBjZXJvLCBwZXJvIGVuIGVzdGUgY2FzbyBlbiBuZWdhdGl2bywgcGVybyBjZXJjYW5vIGEgY2Vybw0KYGBgDQojIyMgTm9ybWFsaWRhZCBkZSBsb3MgZXJyb3Jlcw0KVGFtYmnDqW4gaGF5IHF1ZSBjaGVjYXIgbGEgbm9ybWFsaWRhZCBkZSBvcyBlcnJvcmVzIDxicj4NCnZlciBzaSBsb3MgZXJyb3JlcyBzb24gaW5kZXBlbmRpZW50ZXMgLCBzZSBkaXN0cmlidXllbiBkZSBtYW5lcmEgbm9ybWFsDQoNCmBgYHtyfQ0KI2RlIG1hbmVyYSBncmFmaWNhIHBhcmVjZSBxdWUgbm8gaGF5IG5vcm1hbGlkYWQNCnBsb3QobW9kZWxvLDIpDQpgYGANCmBgYHtyfQ0KcGFyKG1mcm93PWMoMiwxKSkNCmhpc3QocmVzaWR1b3MsIGNvbD0ieWVsbG93IikNCmJveHBsb3QocmVzaWR1b3MsIGJ0eT0ibCIsIHJhbmdlPTEuNSwgY29sPSJ5ZWxsb3ciLCBob3Jpem9udGFsPVQseGxhYj0icmVzaWR1b3MiKQ0KDQoNCnBhcihtZnJvdz1jKDEsMSkpDQpgYGANCg0KYGBge3J9DQojc2VndW5kbyBtw6l0b2RvLCBzZSB2ZSB1bmEgY3VydG9zaXMgZ3JhbmRlDQpoaXN0KHJlc2lkdW9zLA0KICAgICBicmVha3M9MjUsDQogICAgIGNvbD0ibGlnaHRibHVlIiwNCiAgICAgZnJlcT1GQUxTRSwNCiAgICAgKQ0KDQpsaW5lcyhkZW5zaXR5KHJlc2lkdW9zKSwgbHdkID0gMiwgY29sID0gJ2JsdWUnKQ0KDQojdGVuZGVuY2lhIGRlIGN1cnZhIG5vcm1hbA0KeCA8LSBzZXEobWluKHJlc2lkdW9zKSwgbWF4KHJlc2lkdW9zKSwgbGVuZ3RoID0gNDApDQpmIDwtIGRub3JtKHgsIG1lYW4gPSBtZWFuKHJlc2lkdW9zKSwgc2QgPSBzZChyZXNpZHVvcykpDQpsaW5lcyh4LCBmLCBjb2wgPSAicmVkIiwgbHdkID0gMikNCmBgYA0KPGJyPiBUZXN0IGRlIG5vcm1hbGlkYWQgaDA9IGRpc3RyaWJ1Y2nDs24gbm9ybWFsLCBzZSBidXNjYSB2YWxvcmVzIG1heW9yZXMgYSAwLjA1DQoNCiEgRW4gZXN0ZSBjYXNvICxObyBzZSBhY2VwdGEgZWwgc3VwdWVzdG8gZGUgbm9ybWFsaWRhZA0KDQpgYGB7cn0NCnNoYXBpcm8udGVzdChyZXNpZHVvcykgI21lbm9zIGRlIDUwIG9ic2VydmFjaW9uZXMNCmBgYA0KDQpgYGB7cn0NCiNwYXJhIG3DoXMgZGUgNTAgb2JzZXJ2YWNpb25lcw0KI2tvbG1vcm9nb3YNCmtzLnRlc3QocmVzaWR1b3MsInBub3JtIiwgbWVhbihyZXNpZHVvcyksIHNkKHJlc2lkdW9zKSkNCmBgYA0KDQpgYGB7cn0NCmtzLnRlc3QocmVzaWR1b3MsICJwbm9ybSIpICNjcmVvIHF1ZSBlcyBtZWpvciBsYSBkZSBhcnJpYmENCmBgYA0KDQpgYGB7ciBtZXNzYWdlPUZBTFNFfQ0KIyBBbHRlcm5hdGl2YW1lbnRlIGNvbnZpZW5lIHVzYXIgbGEgbW9kaWZpY2FjacOzbiBkZSBMaWxsaWVmb3JzIGEgZXN0ZSB0ZXN0Lg0KIyBFc3RhIGNvcnJlY2Npw7NuIGNvbnNpZGVyYSBxdWUgbG9zIHBhcsOhbWV0cm9zIHNvbiBlc3RpbWFkb3MsIGEgZGlmZXJlbmNpYQ0KIyBkZWwgwqtrc8K7IMKrYSBzZWNhc8K7Og0KDQpsaWJyYXJ5KG5vcnRlc3QpDQpsaWxsaWUudGVzdChyZXNpZHVvcykNCmBgYA0KYGBge3J9DQojIHJlYWxpemFyIGxhIHBydWViYSBBbmRlcnNvbi1EYXJsaW5nIHBhcmEgY29tcHJvYmFyIGxhIG5vcm1hbGlkYWQNCmFkLnRlc3QgKHJlc2lkdW9zKQ0KDQpgYGANCg0KIyMjIEhvbW9nZW5laWRhZCBkZSB2YXJpYW56YXMNCg0KTGEgdmFyaWFuemEgZGVsIHTDqXJtaW5vIGVycm9yIGVzIGlndWFsIGVuIHRvZG9zIGxvcyBuaXZlbGVzIGRlIFguIEVzIGVsIHByaW5jaXBpbyBkZSBob21vY2VkYXN0aWNpZGFkLihzZSBvYnRpZW5lbiBjb24gYnAudGVzdCk8YnI+DQoNClNlIGJ1c2NhIHVuIHB2YWxvciBtYXlvciBhIDAuMDUgeWEgcXVlIGxhIGgwPWxhcyBwcnVlYmFzIHNvbiBob21vZ2VuZWFzDQpgYGB7ciBtZXNzYWdlPUZBTFNFfQ0KDQojRW4gZXN0ZSBjYXNvIHNlIHJlY2hhemEgbGEgaDAsIHBvciBsbyB0YW50byBoYXkgaGV0ZXJlZ2VuZWlkYWQgZGUgdmFyaWFuemEsbm8gc2UgY3VtcGxlIGVsIHN1cHVlc3RvDQpsaWJyYXJ5KGxtdGVzdCkNCmJwdGVzdChtb2RlbG8pDQoNCmBgYA0KUHJvYmFyIGxhIGhvbW9nZW5laWRhZCBwb3IgZWwgbcOpdG9kbyBncsOhZmljbzxicj4NCmxvcyByZXNpZHVvcyB2ZXJzdXMgbG9zIHByZWRpY2hvcyBoYWNlbiB1bmEgZm9ybWEgZGUgZW1idWRvDQoNCmBgYHtyfQ0KcHJlZGljaG9zPWZpdHRlZChtb2RlbG8xKQ0KcGxvdChyZXNpZHVvc35wcmVkaWNob3MpDQpgYGANCmBgYHtyfQ0KcGxvdChyZXNpZHVvcykgI2dyYWZpY2FyIHNvbG8gcmVzaWR1b3MNCmBgYA0KYGBge3J9DQpwbG90KG1vZGVsbzEsMSkNCmBgYA0KIyMgcmVsYWNpb24gcmVzaWR1b3MgY29uIFggKG5vIGVuZG9nZW5laWRhZCkNCg0KQ3JlbyBxdWUgbnVuY2EgdmEgYSBoYWJlciBjb3JyZWxhY2lvbg0KDQpgYGB7cn0NCmNvcihyZXNpZHVvcywgZGF0b3MxJHBvcl9jYXJfYWxpbSkNCg0KYGBgDQoNCmBgYHtyfQ0KY292KHJlc2lkdW9zLCBkYXRvczEkcG9yX2Nhcl9hbGltKQ0KYGBgDQpgYGB7cn0NCnBsb3QgKGRhdG9zMSRwb3JfY2FyX2FsaW0scmVzaWR1b3MpDQpgYGANCg0KYGBge3J9DQpwbG90IChyZXNpZHVvc35kYXRvczEkcG9yX2Rlc18xNSkNCmBgYA0KDQoNCg0KYGBge3J9DQpwbG90IChkYXRvczEkcG9yX2Rlc18xNSxyZXNpZHVvcykNCmBgYA0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg==