Regresión Logit: PROSOCIEDAD

Se realizó para estimar la relación existente entre las variables independientes y la variable dependiente que en este caso es dicotómica (¿Ha realizado alguna donación a alguna organización de la sociedad civil?)

Limpieza de la base de datos:
library(dplyr)
## 
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
## 
##     filter, lag
## The following objects are masked from 'package:base':
## 
##     intersect, setdiff, setequal, union
library(tidyr)
library(mlogit)
## Loading required package: dfidx
## 
## Attaching package: 'dfidx'
## The following object is masked from 'package:stats':
## 
##     filter
library(readxl)

Donaciones <- read_excel("/Users/eduardoleyva/Desktop/Donaciones.xlsx")

Donaciones <- Donaciones %>%
  filter(X.Ha.realizado.alguna.donación.a.alguna.organización.de.la.sociedad.civil. != 0)
Donaciones <- Donaciones %>%
  filter(X.Ha.recibido.agradecimientos.por.su.donación.por.parte.de.la.organización.a.la.que.donó. != 0)


FinalDonaciones <- Donaciones %>%
  mutate(X.Ha.realizado.alguna.donación.a.alguna.organización.de.la.sociedad.civil. = recode(X.Ha.realizado.alguna.donación.a.alguna.organización.de.la.sociedad.civil., "1" = "0", "2" = "1"))

FinalDonaciones <- FinalDonaciones %>%
  mutate(X.Ha.recibido.agradecimientos.por.su.donación.por.parte.de.la.organización.a.la.que.donó. = recode(X.Ha.recibido.agradecimientos.por.su.donación.por.parte.de.la.organización.a.la.que.donó., "1" = "0", "2" = "1"))

FinalDonaciones <- FinalDonaciones %>%
  mutate(X.Estaría.dispuesto.a.realizar.futuras.donaciones.a.la.misma.organización.o.a.otra.organización.de.la.sociedad.civil. = 
           recode(X.Estaría.dispuesto.a.realizar.futuras.donaciones.a.la.misma.organización.o.a.otra.organización.de.la.sociedad.civil.,
                  "0" = "1",
                  "1" = "2",
                  "2" = "3",
                  "3" = "4",
                  "4" = "5")
         )

FinalDonaciones$X.Ha.realizado.alguna.donación.a.alguna.organización.de.la.sociedad.civil. <- as.numeric(FinalDonaciones$X.Ha.realizado.alguna.donación.a.alguna.organización.de.la.sociedad.civil.)
FinalDonaciones$X.Siente.que.su.donación.ha.tenido.un.impacto.positivo.en.la.sociedad. <- as.numeric(FinalDonaciones$X.Siente.que.su.donación.ha.tenido.un.impacto.positivo.en.la.sociedad.)
FinalDonaciones$X.Ha.recibido.agradecimientos.por.su.donación.por.parte.de.la.organización.a.la.que.donó. <- as.numeric(FinalDonaciones$X.Ha.recibido.agradecimientos.por.su.donación.por.parte.de.la.organización.a.la.que.donó.)
Regresión 1:
Regresión1 <- glm(X.Ha.realizado.alguna.donación.a.alguna.organización.de.la.sociedad.civil. ~ X.Siente.que.su.donación.ha.tenido.un.impacto.positivo.en.la.sociedad. + X.Ha.recibido.agradecimientos.por.su.donación.por.parte.de.la.organización.a.la.que.donó., data = FinalDonaciones, family = binomial(), maxit = 100)

summary(Regresión1)
## 
## Call:
## glm(formula = X.Ha.realizado.alguna.donación.a.alguna.organización.de.la.sociedad.civil. ~ 
##     X.Siente.que.su.donación.ha.tenido.un.impacto.positivo.en.la.sociedad. + 
##         X.Ha.recibido.agradecimientos.por.su.donación.por.parte.de.la.organización.a.la.que.donó., 
##     family = binomial(), data = FinalDonaciones, maxit = 100)
## 
## Deviance Residuals: 
##        Min          1Q      Median          3Q         Max  
## -1.461e-06  -1.461e-06  -1.461e-06  -1.461e-06  -1.461e-06  
## 
## Coefficients:
##                                                                                             Estimate
## (Intercept)                                                                               -2.757e+01
## X.Siente.que.su.donación.ha.tenido.un.impacto.positivo.en.la.sociedad.                    -1.149e-14
## X.Ha.recibido.agradecimientos.por.su.donación.por.parte.de.la.organización.a.la.que.donó. -1.192e-14
##                                                                                           Std. Error
## (Intercept)                                                                                2.033e+05
## X.Siente.que.su.donación.ha.tenido.un.impacto.positivo.en.la.sociedad.                     1.844e+05
## X.Ha.recibido.agradecimientos.por.su.donación.por.parte.de.la.organización.a.la.que.donó.  1.114e+05
##                                                                                           z value
## (Intercept)                                                                                     0
## X.Siente.que.su.donación.ha.tenido.un.impacto.positivo.en.la.sociedad.                          0
## X.Ha.recibido.agradecimientos.por.su.donación.por.parte.de.la.organización.a.la.que.donó.       0
##                                                                                           Pr(>|z|)
## (Intercept)                                                                                      1
## X.Siente.que.su.donación.ha.tenido.un.impacto.positivo.en.la.sociedad.                           1
## X.Ha.recibido.agradecimientos.por.su.donación.por.parte.de.la.organización.a.la.que.donó.        1
## 
## (Dispersion parameter for binomial family taken to be 1)
## 
##     Null deviance: 0.0000e+00  on 150  degrees of freedom
## Residual deviance: 3.2228e-10  on 148  degrees of freedom
## AIC: 6
## 
## Number of Fisher Scoring iterations: 26
Regresión 2:
Regresión2 <- glm(X.Ha.realizado.alguna.donación.a.alguna.organización.de.la.sociedad.civil. ~ X.Siente.que.su.donación.ha.tenido.un.impacto.positivo.en.la.sociedad. + X.Estaría.dispuesto.a.realizar.futuras.donaciones.a.la.misma.organización.o.a.otra.organización.de.la.sociedad.civil., data = FinalDonaciones, family = binomial(), maxit = 100)

summary(Regresión2)
## 
## Call:
## glm(formula = X.Ha.realizado.alguna.donación.a.alguna.organización.de.la.sociedad.civil. ~ 
##     X.Siente.que.su.donación.ha.tenido.un.impacto.positivo.en.la.sociedad. + 
##         X.Estaría.dispuesto.a.realizar.futuras.donaciones.a.la.misma.organización.o.a.otra.organización.de.la.sociedad.civil., 
##     family = binomial(), data = FinalDonaciones, maxit = 100)
## 
## Deviance Residuals: 
##        Min          1Q      Median          3Q         Max  
## -1.461e-06  -1.461e-06  -1.461e-06  -1.461e-06  -1.461e-06  
## 
## Coefficients:
##                                                                                                                          Estimate
## (Intercept)                                                                                                            -2.757e+01
## X.Siente.que.su.donación.ha.tenido.un.impacto.positivo.en.la.sociedad.                                                 -2.987e-14
## X.Estaría.dispuesto.a.realizar.futuras.donaciones.a.la.misma.organización.o.a.otra.organización.de.la.sociedad.civil.3  2.701e-14
## X.Estaría.dispuesto.a.realizar.futuras.donaciones.a.la.misma.organización.o.a.otra.organización.de.la.sociedad.civil.4  4.687e-16
## X.Estaría.dispuesto.a.realizar.futuras.donaciones.a.la.misma.organización.o.a.otra.organización.de.la.sociedad.civil.5  8.054e-15
##                                                                                                                        Std. Error
## (Intercept)                                                                                                             2.090e+05
## X.Siente.que.su.donación.ha.tenido.un.impacto.positivo.en.la.sociedad.                                                  1.976e+05
## X.Estaría.dispuesto.a.realizar.futuras.donaciones.a.la.misma.organización.o.a.otra.organización.de.la.sociedad.civil.3  1.196e+05
## X.Estaría.dispuesto.a.realizar.futuras.donaciones.a.la.misma.organización.o.a.otra.organización.de.la.sociedad.civil.4  2.350e+05
## X.Estaría.dispuesto.a.realizar.futuras.donaciones.a.la.misma.organización.o.a.otra.organización.de.la.sociedad.civil.5  4.297e+05
##                                                                                                                        z value
## (Intercept)                                                                                                                  0
## X.Siente.que.su.donación.ha.tenido.un.impacto.positivo.en.la.sociedad.                                                       0
## X.Estaría.dispuesto.a.realizar.futuras.donaciones.a.la.misma.organización.o.a.otra.organización.de.la.sociedad.civil.3       0
## X.Estaría.dispuesto.a.realizar.futuras.donaciones.a.la.misma.organización.o.a.otra.organización.de.la.sociedad.civil.4       0
## X.Estaría.dispuesto.a.realizar.futuras.donaciones.a.la.misma.organización.o.a.otra.organización.de.la.sociedad.civil.5       0
##                                                                                                                        Pr(>|z|)
## (Intercept)                                                                                                                   1
## X.Siente.que.su.donación.ha.tenido.un.impacto.positivo.en.la.sociedad.                                                        1
## X.Estaría.dispuesto.a.realizar.futuras.donaciones.a.la.misma.organización.o.a.otra.organización.de.la.sociedad.civil.3        1
## X.Estaría.dispuesto.a.realizar.futuras.donaciones.a.la.misma.organización.o.a.otra.organización.de.la.sociedad.civil.4        1
## X.Estaría.dispuesto.a.realizar.futuras.donaciones.a.la.misma.organización.o.a.otra.organización.de.la.sociedad.civil.5        1
## 
## (Dispersion parameter for binomial family taken to be 1)
## 
##     Null deviance: 0.0000e+00  on 150  degrees of freedom
## Residual deviance: 3.2228e-10  on 146  degrees of freedom
## AIC: 10
## 
## Number of Fisher Scoring iterations: 26
Pruebas Chi Cuadrada
Regresión 1:
RegresiónChi1=Regresión1$null.deviance - Regresión1$deviance
RegresiónChi1
## [1] -3.222782e-10
Regresión 2:
RegresiónChi2=Regresión2$null.deviance - Regresión2$deviance
RegresiónChi2
## [1] -3.222782e-10
Prueba de Hipótesis:
Los profesionistas de mayor nivel de ingresos anuales tienen una mayor frecuencia de donación en dinero que aquellos de menor nivel de ingresos anuales.
DatosHipótesis <- read_excel("/Users/eduardoleyva/Desktop/Base limpia LETRAS donadores.xlsx")
## New names:
## • `Estado` -> `Estado...2`
## • `Estado` -> `Estado...52`
ingresosDF <- data.frame(Ingresos = DatosHipótesis$`Ingresos anuales`,
                    Donaciones = DatosHipótesis$X.Podría.indicarnos.cuánto.ha.donado.en.términos.monetarios.en.el.último.año.)

ingresosDF$DonacionNumerica <- case_when(
  ingresosDF$Donaciones == "Menos de $1,000" ~ 500,
  ingresosDF$Donaciones == "Entre $1,000 y $5,000" ~ 3000,
  ingresosDF$Donaciones == "Entre $5,001 y $10,000" ~ 7500,
  ingresosDF$Donaciones == "Más de $10,000" ~ 10000,
  ingresosDF$Donaciones == "0" ~ 0
)

resumen <- ingresosDF %>%
  group_by(Ingresos) %>%
  summarise(MediaDonaciones = mean(DonacionNumerica),
            DesvEstandarDonaciones = sd(DonacionNumerica),
            N = n())

print(resumen)
## # A tibble: 6 × 4
##   Ingresos                  MediaDonaciones DesvEstandarDonaciones     N
##   <chr>                               <dbl>                  <dbl> <int>
## 1 0                                   3349.                  3979.    76
## 2 Entre $100,001 y $150,000           1176.                  1960.    17
## 3 Entre $40,000 y $100,000            2188.                  3276.    16
## 4 Menos de $40,000                    2000                   2762.    48
## 5 Más de $150,000                     2324.                  3132.    37
## 6 <NA>                                  NA                     NA      3
modelo <- aov(DonacionNumerica ~ Ingresos, data = ingresosDF)
anova_tabla <- summary(modelo)
print(anova_tabla)
##              Df    Sum Sq  Mean Sq F value Pr(>F)  
## Ingresos      4 9.901e+07 24751538   2.205   0.07 .
## Residuals   189 2.122e+09 11225006                 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 3 observations deleted due to missingness
p_valor <- anova_tabla[[1]][["Pr(>F)"]][1]
print(p_valor)
## [1] 0.07001671
if (p_valor < 0.05) {
  cat("Rechazamos la hipótesis nula (H0). Aceptamos la hipótesis alternativa (H2).\n")
} else {
  cat("No podemos rechazar la hipótesis nula (H0): La frecuencia de donación en dinero es la misma para todos los niveles de ingresos")
}
## No podemos rechazar la hipótesis nula (H0): La frecuencia de donación en dinero es la misma para todos los niveles de ingresos
La cantidad donada está positivamente correlacionada con la frecuencia de donación.
datos <- read_excel("/Users/eduardoleyva/Desktop/Base limpia LETRAS donadores.xlsx")
## New names:
## • `Estado` -> `Estado...2`
## • `Estado` -> `Estado...52`
ingresosDF <- data.frame(Ingresos = datos$X.Con.qué.frecuencia.realiza.donaciones.monetarias.,
                    Donaciones = datos$X.Podría.indicarnos.cuánto.ha.donado.en.términos.monetarios.en.el.último.año.)

ingresosDF$DonacionNumerica <- case_when(
  ingresosDF$Donaciones == "Menos de $1,000" ~ 500,
  ingresosDF$Donaciones == "Entre $1,000 y $5,000" ~ 3000,
  ingresosDF$Donaciones == "Entre $5,001 y $10,000" ~ 7500,
  ingresosDF$Donaciones == "Más de $10,000" ~ 10000,
  ingresosDF$Donaciones == "0" ~ 0
)

resumen <- ingresosDF %>%
  group_by(Ingresos) %>%
  summarise(MediaDonaciones = mean(DonacionNumerica),
            DesvEstandarDonaciones = sd(DonacionNumerica),
            N = n())

print(resumen)
## # A tibble: 6 × 4
##   Ingresos   MediaDonaciones DesvEstandarDonaciones     N
##   <chr>                <dbl>                  <dbl> <int>
## 1 0                    1750                   3335.    66
## 2 Anual                2342.                  2832.    57
## 3 Mensual              3139.                  3739.    36
## 4 Semestral            2972.                  3475.    18
## 5 Trimestral           4471.                  3797.    17
## 6 <NA>                   NA                     NA      3
resumen <- ingresosDF %>%
  group_by(Ingresos) %>%
  summarise(MediaDonaciones = mean(DonacionNumerica),
            DesvEstandarDonaciones = sd(DonacionNumerica),
            N = n())

print(resumen)
## # A tibble: 6 × 4
##   Ingresos   MediaDonaciones DesvEstandarDonaciones     N
##   <chr>                <dbl>                  <dbl> <int>
## 1 0                    1750                   3335.    66
## 2 Anual                2342.                  2832.    57
## 3 Mensual              3139.                  3739.    36
## 4 Semestral            2972.                  3475.    18
## 5 Trimestral           4471.                  3797.    17
## 6 <NA>                   NA                     NA      3
modelo2 <- aov(DonacionNumerica ~ Ingresos, data = ingresosDF)
anova_tabla2 <- summary(modelo2)
print(anova_tabla2)
##              Df    Sum Sq  Mean Sq F value Pr(>F)  
## Ingresos      4 1.231e+08 30762827   2.772 0.0285 *
## Residuals   189 2.097e+09 11097783                 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 3 observations deleted due to missingness
p_valor2 <- anova_tabla2[[1]][["Pr(>F)"]][1]
print(p_valor2)
## [1] 0.02852504
if (p_valor2 < 0.05) {
  cat("Se rechaza H0: La cantidad donada no está correlacionada con la frecuencia de donación.")
} else {
  cat("Se acepta H0: La cantidad donada no está correlacionada con la frecuencia de donación.")
}
## Se rechaza H0: La cantidad donada no está correlacionada con la frecuencia de donación.
LS0tCnRpdGxlOiAiUmVncmVzacOzbiBMb2dpc3RpY2EgeSBQcnVlYmFzIGRlIEhpcMOzdGVzaXMiCmF1dGhvcjogIkVkdWFyZG8gTGV5dmEsIFNhcmEgT2Nhw7FhLCBHYWJpcmVsIE1lZGluYSwgRW5yaXF1ZSBQYWJsbyIKZGF0ZTogIjIwMjMtMDYtMDIiCm91dHB1dDogCiAgaHRtbF9kb2N1bWVudDoKICAgIHRvYzogVFJVRQogICAgdG9jX2Zsb2F0OiBUUlVFCiAgICBjb2RlX2Rvd25sb2FkOiBUUlVFCi0tLQoKIyMjIFJlZ3Jlc2nDs24gTG9naXQ6IFBST1NPQ0lFREFECgojIyMjIFNlIHJlYWxpesOzIHBhcmEgZXN0aW1hciBsYSByZWxhY2nDs24gZXhpc3RlbnRlIGVudHJlIGxhcyB2YXJpYWJsZXMgaW5kZXBlbmRpZW50ZXMgeSBsYSB2YXJpYWJsZSBkZXBlbmRpZW50ZSBxdWUgZW4gZXN0ZSBjYXNvIGVzIGRpY290w7NtaWNhICjCv0hhIHJlYWxpemFkbyBhbGd1bmEgZG9uYWNpw7NuIGEgYWxndW5hIG9yZ2FuaXphY2nDs24gZGUgbGEgc29jaWVkYWQgY2l2aWw/KQoKIyMjIyMgTGltcGllemEgZGUgbGEgYmFzZSBkZSBkYXRvczoKCmBgYHtyfQpsaWJyYXJ5KGRwbHlyKQpsaWJyYXJ5KHRpZHlyKQpsaWJyYXJ5KG1sb2dpdCkKbGlicmFyeShyZWFkeGwpCgpEb25hY2lvbmVzIDwtIHJlYWRfZXhjZWwoIi9Vc2Vycy9lZHVhcmRvbGV5dmEvRGVza3RvcC9Eb25hY2lvbmVzLnhsc3giKQoKRG9uYWNpb25lcyA8LSBEb25hY2lvbmVzICU+JQogIGZpbHRlcihYLkhhLnJlYWxpemFkby5hbGd1bmEuZG9uYWNpw7NuLmEuYWxndW5hLm9yZ2FuaXphY2nDs24uZGUubGEuc29jaWVkYWQuY2l2aWwuICE9IDApCkRvbmFjaW9uZXMgPC0gRG9uYWNpb25lcyAlPiUKICBmaWx0ZXIoWC5IYS5yZWNpYmlkby5hZ3JhZGVjaW1pZW50b3MucG9yLnN1LmRvbmFjacOzbi5wb3IucGFydGUuZGUubGEub3JnYW5pemFjacOzbi5hLmxhLnF1ZS5kb27Dsy4gIT0gMCkKCgpGaW5hbERvbmFjaW9uZXMgPC0gRG9uYWNpb25lcyAlPiUKICBtdXRhdGUoWC5IYS5yZWFsaXphZG8uYWxndW5hLmRvbmFjacOzbi5hLmFsZ3VuYS5vcmdhbml6YWNpw7NuLmRlLmxhLnNvY2llZGFkLmNpdmlsLiA9IHJlY29kZShYLkhhLnJlYWxpemFkby5hbGd1bmEuZG9uYWNpw7NuLmEuYWxndW5hLm9yZ2FuaXphY2nDs24uZGUubGEuc29jaWVkYWQuY2l2aWwuLCAiMSIgPSAiMCIsICIyIiA9ICIxIikpCgpGaW5hbERvbmFjaW9uZXMgPC0gRmluYWxEb25hY2lvbmVzICU+JQogIG11dGF0ZShYLkhhLnJlY2liaWRvLmFncmFkZWNpbWllbnRvcy5wb3Iuc3UuZG9uYWNpw7NuLnBvci5wYXJ0ZS5kZS5sYS5vcmdhbml6YWNpw7NuLmEubGEucXVlLmRvbsOzLiA9IHJlY29kZShYLkhhLnJlY2liaWRvLmFncmFkZWNpbWllbnRvcy5wb3Iuc3UuZG9uYWNpw7NuLnBvci5wYXJ0ZS5kZS5sYS5vcmdhbml6YWNpw7NuLmEubGEucXVlLmRvbsOzLiwgIjEiID0gIjAiLCAiMiIgPSAiMSIpKQoKRmluYWxEb25hY2lvbmVzIDwtIEZpbmFsRG9uYWNpb25lcyAlPiUKICBtdXRhdGUoWC5Fc3RhcsOtYS5kaXNwdWVzdG8uYS5yZWFsaXphci5mdXR1cmFzLmRvbmFjaW9uZXMuYS5sYS5taXNtYS5vcmdhbml6YWNpw7NuLm8uYS5vdHJhLm9yZ2FuaXphY2nDs24uZGUubGEuc29jaWVkYWQuY2l2aWwuID0gCiAgICAgICAgICAgcmVjb2RlKFguRXN0YXLDrWEuZGlzcHVlc3RvLmEucmVhbGl6YXIuZnV0dXJhcy5kb25hY2lvbmVzLmEubGEubWlzbWEub3JnYW5pemFjacOzbi5vLmEub3RyYS5vcmdhbml6YWNpw7NuLmRlLmxhLnNvY2llZGFkLmNpdmlsLiwKICAgICAgICAgICAgICAgICAgIjAiID0gIjEiLAogICAgICAgICAgICAgICAgICAiMSIgPSAiMiIsCiAgICAgICAgICAgICAgICAgICIyIiA9ICIzIiwKICAgICAgICAgICAgICAgICAgIjMiID0gIjQiLAogICAgICAgICAgICAgICAgICAiNCIgPSAiNSIpCiAgICAgICAgICkKCkZpbmFsRG9uYWNpb25lcyRYLkhhLnJlYWxpemFkby5hbGd1bmEuZG9uYWNpw7NuLmEuYWxndW5hLm9yZ2FuaXphY2nDs24uZGUubGEuc29jaWVkYWQuY2l2aWwuIDwtIGFzLm51bWVyaWMoRmluYWxEb25hY2lvbmVzJFguSGEucmVhbGl6YWRvLmFsZ3VuYS5kb25hY2nDs24uYS5hbGd1bmEub3JnYW5pemFjacOzbi5kZS5sYS5zb2NpZWRhZC5jaXZpbC4pCkZpbmFsRG9uYWNpb25lcyRYLlNpZW50ZS5xdWUuc3UuZG9uYWNpw7NuLmhhLnRlbmlkby51bi5pbXBhY3RvLnBvc2l0aXZvLmVuLmxhLnNvY2llZGFkLiA8LSBhcy5udW1lcmljKEZpbmFsRG9uYWNpb25lcyRYLlNpZW50ZS5xdWUuc3UuZG9uYWNpw7NuLmhhLnRlbmlkby51bi5pbXBhY3RvLnBvc2l0aXZvLmVuLmxhLnNvY2llZGFkLikKRmluYWxEb25hY2lvbmVzJFguSGEucmVjaWJpZG8uYWdyYWRlY2ltaWVudG9zLnBvci5zdS5kb25hY2nDs24ucG9yLnBhcnRlLmRlLmxhLm9yZ2FuaXphY2nDs24uYS5sYS5xdWUuZG9uw7MuIDwtIGFzLm51bWVyaWMoRmluYWxEb25hY2lvbmVzJFguSGEucmVjaWJpZG8uYWdyYWRlY2ltaWVudG9zLnBvci5zdS5kb25hY2nDs24ucG9yLnBhcnRlLmRlLmxhLm9yZ2FuaXphY2nDs24uYS5sYS5xdWUuZG9uw7MuKQoKYGBgCgojIyMjIyBSZWdyZXNpw7NuIDE6CgpgYGB7cn0KClJlZ3Jlc2nDs24xIDwtIGdsbShYLkhhLnJlYWxpemFkby5hbGd1bmEuZG9uYWNpw7NuLmEuYWxndW5hLm9yZ2FuaXphY2nDs24uZGUubGEuc29jaWVkYWQuY2l2aWwuIH4gWC5TaWVudGUucXVlLnN1LmRvbmFjacOzbi5oYS50ZW5pZG8udW4uaW1wYWN0by5wb3NpdGl2by5lbi5sYS5zb2NpZWRhZC4gKyBYLkhhLnJlY2liaWRvLmFncmFkZWNpbWllbnRvcy5wb3Iuc3UuZG9uYWNpw7NuLnBvci5wYXJ0ZS5kZS5sYS5vcmdhbml6YWNpw7NuLmEubGEucXVlLmRvbsOzLiwgZGF0YSA9IEZpbmFsRG9uYWNpb25lcywgZmFtaWx5ID0gYmlub21pYWwoKSwgbWF4aXQgPSAxMDApCgpzdW1tYXJ5KFJlZ3Jlc2nDs24xKQoKYGBgCgojIyMjIyBSZWdyZXNpw7NuIDI6CgpgYGB7cn0KUmVncmVzacOzbjIgPC0gZ2xtKFguSGEucmVhbGl6YWRvLmFsZ3VuYS5kb25hY2nDs24uYS5hbGd1bmEub3JnYW5pemFjacOzbi5kZS5sYS5zb2NpZWRhZC5jaXZpbC4gfiBYLlNpZW50ZS5xdWUuc3UuZG9uYWNpw7NuLmhhLnRlbmlkby51bi5pbXBhY3RvLnBvc2l0aXZvLmVuLmxhLnNvY2llZGFkLiArIFguRXN0YXLDrWEuZGlzcHVlc3RvLmEucmVhbGl6YXIuZnV0dXJhcy5kb25hY2lvbmVzLmEubGEubWlzbWEub3JnYW5pemFjacOzbi5vLmEub3RyYS5vcmdhbml6YWNpw7NuLmRlLmxhLnNvY2llZGFkLmNpdmlsLiwgZGF0YSA9IEZpbmFsRG9uYWNpb25lcywgZmFtaWx5ID0gYmlub21pYWwoKSwgbWF4aXQgPSAxMDApCgpzdW1tYXJ5KFJlZ3Jlc2nDs24yKQpgYGAKCiMjIyMjIFBydWViYXMgQ2hpIEN1YWRyYWRhCiMjIyMjIyBSZWdyZXNpw7NuIDE6CgpgYGB7cn0KUmVncmVzacOzbkNoaTE9UmVncmVzacOzbjEkbnVsbC5kZXZpYW5jZSAtIFJlZ3Jlc2nDs24xJGRldmlhbmNlClJlZ3Jlc2nDs25DaGkxCmBgYAoKIyMjIyMjIFJlZ3Jlc2nDs24gMjoKCmBgYHtyfQpSZWdyZXNpw7NuQ2hpMj1SZWdyZXNpw7NuMiRudWxsLmRldmlhbmNlIC0gUmVncmVzacOzbjIkZGV2aWFuY2UKUmVncmVzacOzbkNoaTIKYGBgCgojIyMjIyBQcnVlYmEgZGUgSGlww7N0ZXNpczogCiMjIyMjIyBMb3MgcHJvZmVzaW9uaXN0YXMgZGUgbWF5b3Igbml2ZWwgZGUgaW5ncmVzb3MgYW51YWxlcyB0aWVuZW4gdW5hIG1heW9yIGZyZWN1ZW5jaWEgZGUgZG9uYWNpw7NuIGVuIGRpbmVybyBxdWUgYXF1ZWxsb3MgZGUgbWVub3Igbml2ZWwgZGUgaW5ncmVzb3MgYW51YWxlcy4KCmBgYHtyfQpEYXRvc0hpcMOzdGVzaXMgPC0gcmVhZF9leGNlbCgiL1VzZXJzL2VkdWFyZG9sZXl2YS9EZXNrdG9wL0Jhc2UgbGltcGlhIExFVFJBUyBkb25hZG9yZXMueGxzeCIpCgppbmdyZXNvc0RGIDwtIGRhdGEuZnJhbWUoSW5ncmVzb3MgPSBEYXRvc0hpcMOzdGVzaXMkYEluZ3Jlc29zIGFudWFsZXNgLAogICAgICAgICAgICAgICAgICAgIERvbmFjaW9uZXMgPSBEYXRvc0hpcMOzdGVzaXMkWC5Qb2Ryw61hLmluZGljYXJub3MuY3XDoW50by5oYS5kb25hZG8uZW4udMOpcm1pbm9zLm1vbmV0YXJpb3MuZW4uZWwuw7psdGltby5hw7FvLikKCmluZ3Jlc29zREYkRG9uYWNpb25OdW1lcmljYSA8LSBjYXNlX3doZW4oCiAgaW5ncmVzb3NERiREb25hY2lvbmVzID09ICJNZW5vcyBkZSAkMSwwMDAiIH4gNTAwLAogIGluZ3Jlc29zREYkRG9uYWNpb25lcyA9PSAiRW50cmUgJDEsMDAwIHkgJDUsMDAwIiB+IDMwMDAsCiAgaW5ncmVzb3NERiREb25hY2lvbmVzID09ICJFbnRyZSAkNSwwMDEgeSAkMTAsMDAwIiB+IDc1MDAsCiAgaW5ncmVzb3NERiREb25hY2lvbmVzID09ICJNw6FzIGRlICQxMCwwMDAiIH4gMTAwMDAsCiAgaW5ncmVzb3NERiREb25hY2lvbmVzID09ICIwIiB+IDAKKQoKcmVzdW1lbiA8LSBpbmdyZXNvc0RGICU+JQogIGdyb3VwX2J5KEluZ3Jlc29zKSAlPiUKICBzdW1tYXJpc2UoTWVkaWFEb25hY2lvbmVzID0gbWVhbihEb25hY2lvbk51bWVyaWNhKSwKICAgICAgICAgICAgRGVzdkVzdGFuZGFyRG9uYWNpb25lcyA9IHNkKERvbmFjaW9uTnVtZXJpY2EpLAogICAgICAgICAgICBOID0gbigpKQoKcHJpbnQocmVzdW1lbikKCm1vZGVsbyA8LSBhb3YoRG9uYWNpb25OdW1lcmljYSB+IEluZ3Jlc29zLCBkYXRhID0gaW5ncmVzb3NERikKYW5vdmFfdGFibGEgPC0gc3VtbWFyeShtb2RlbG8pCnByaW50KGFub3ZhX3RhYmxhKQoKcF92YWxvciA8LSBhbm92YV90YWJsYVtbMV1dW1siUHIoPkYpIl1dWzFdCnByaW50KHBfdmFsb3IpCmlmIChwX3ZhbG9yIDwgMC4wNSkgewogIGNhdCgiUmVjaGF6YW1vcyBsYSBoaXDDs3Rlc2lzIG51bGEgKEgwKS4gQWNlcHRhbW9zIGxhIGhpcMOzdGVzaXMgYWx0ZXJuYXRpdmEgKEgyKS5cbiIpCn0gZWxzZSB7CiAgY2F0KCJObyBwb2RlbW9zIHJlY2hhemFyIGxhIGhpcMOzdGVzaXMgbnVsYSAoSDApOiBMYSBmcmVjdWVuY2lhIGRlIGRvbmFjacOzbiBlbiBkaW5lcm8gZXMgbGEgbWlzbWEgcGFyYSB0b2RvcyBsb3Mgbml2ZWxlcyBkZSBpbmdyZXNvcyIpCn0KCmBgYAoKIyMjIyMgTGEgY2FudGlkYWQgZG9uYWRhIGVzdMOhIHBvc2l0aXZhbWVudGUgY29ycmVsYWNpb25hZGEgY29uIGxhIGZyZWN1ZW5jaWEgZGUgZG9uYWNpw7NuLgoKYGBge3J9CmRhdG9zIDwtIHJlYWRfZXhjZWwoIi9Vc2Vycy9lZHVhcmRvbGV5dmEvRGVza3RvcC9CYXNlIGxpbXBpYSBMRVRSQVMgZG9uYWRvcmVzLnhsc3giKQoKaW5ncmVzb3NERiA8LSBkYXRhLmZyYW1lKEluZ3Jlc29zID0gZGF0b3MkWC5Db24ucXXDqS5mcmVjdWVuY2lhLnJlYWxpemEuZG9uYWNpb25lcy5tb25ldGFyaWFzLiwKICAgICAgICAgICAgICAgICAgICBEb25hY2lvbmVzID0gZGF0b3MkWC5Qb2Ryw61hLmluZGljYXJub3MuY3XDoW50by5oYS5kb25hZG8uZW4udMOpcm1pbm9zLm1vbmV0YXJpb3MuZW4uZWwuw7psdGltby5hw7FvLikKCmluZ3Jlc29zREYkRG9uYWNpb25OdW1lcmljYSA8LSBjYXNlX3doZW4oCiAgaW5ncmVzb3NERiREb25hY2lvbmVzID09ICJNZW5vcyBkZSAkMSwwMDAiIH4gNTAwLAogIGluZ3Jlc29zREYkRG9uYWNpb25lcyA9PSAiRW50cmUgJDEsMDAwIHkgJDUsMDAwIiB+IDMwMDAsCiAgaW5ncmVzb3NERiREb25hY2lvbmVzID09ICJFbnRyZSAkNSwwMDEgeSAkMTAsMDAwIiB+IDc1MDAsCiAgaW5ncmVzb3NERiREb25hY2lvbmVzID09ICJNw6FzIGRlICQxMCwwMDAiIH4gMTAwMDAsCiAgaW5ncmVzb3NERiREb25hY2lvbmVzID09ICIwIiB+IDAKKQoKcmVzdW1lbiA8LSBpbmdyZXNvc0RGICU+JQogIGdyb3VwX2J5KEluZ3Jlc29zKSAlPiUKICBzdW1tYXJpc2UoTWVkaWFEb25hY2lvbmVzID0gbWVhbihEb25hY2lvbk51bWVyaWNhKSwKICAgICAgICAgICAgRGVzdkVzdGFuZGFyRG9uYWNpb25lcyA9IHNkKERvbmFjaW9uTnVtZXJpY2EpLAogICAgICAgICAgICBOID0gbigpKQoKcHJpbnQocmVzdW1lbikKCnJlc3VtZW4gPC0gaW5ncmVzb3NERiAlPiUKICBncm91cF9ieShJbmdyZXNvcykgJT4lCiAgc3VtbWFyaXNlKE1lZGlhRG9uYWNpb25lcyA9IG1lYW4oRG9uYWNpb25OdW1lcmljYSksCiAgICAgICAgICAgIERlc3ZFc3RhbmRhckRvbmFjaW9uZXMgPSBzZChEb25hY2lvbk51bWVyaWNhKSwKICAgICAgICAgICAgTiA9IG4oKSkKCnByaW50KHJlc3VtZW4pCgptb2RlbG8yIDwtIGFvdihEb25hY2lvbk51bWVyaWNhIH4gSW5ncmVzb3MsIGRhdGEgPSBpbmdyZXNvc0RGKQphbm92YV90YWJsYTIgPC0gc3VtbWFyeShtb2RlbG8yKQpwcmludChhbm92YV90YWJsYTIpCgpwX3ZhbG9yMiA8LSBhbm92YV90YWJsYTJbWzFdXVtbIlByKD5GKSJdXVsxXQpwcmludChwX3ZhbG9yMikKaWYgKHBfdmFsb3IyIDwgMC4wNSkgewogIGNhdCgiU2UgcmVjaGF6YSBIMDogTGEgY2FudGlkYWQgZG9uYWRhIG5vIGVzdMOhIGNvcnJlbGFjaW9uYWRhIGNvbiBsYSBmcmVjdWVuY2lhIGRlIGRvbmFjacOzbi4iKQp9IGVsc2UgewogIGNhdCgiU2UgYWNlcHRhIEgwOiBMYSBjYW50aWRhZCBkb25hZGEgbm8gZXN0w6EgY29ycmVsYWNpb25hZGEgY29uIGxhIGZyZWN1ZW5jaWEgZGUgZG9uYWNpw7NuLiIpCn0KYGBgCgo=