Packages

library(tidyverse) # for data wrangling, graphs, etc
library(nnet) # for ordinal log reg

Dataset

df <- read_csv("dataset/historiaactividad.csv")
Parsed with column specification:
cols(
  .default = col_character(),
  ID = col_integer(),
  `Etnicidad?` = col_integer(),
  `Apellidos mapuches?` = col_integer(),
  `Lesiones de caries [5.5]` = col_integer(),
  `Lesiones de caries [5.4]` = col_integer(),
  `Lesiones de caries [5.3]` = col_integer(),
  `Lesiones de caries [5.2]` = col_integer(),
  `Lesiones de caries [5.1]` = col_integer(),
  `Lesiones de caries [6.1]` = col_integer(),
  `Lesiones de caries [6.2]` = col_integer(),
  `Lesiones de caries [6.3]` = col_integer(),
  `Lesiones de caries [6.4]` = col_integer(),
  `Lesiones de caries [6.5]` = col_integer(),
  `Lesiones de caries [7.5]` = col_integer(),
  `Lesiones de caries [7.4]` = col_integer(),
  `Lesiones de caries [7.3]` = col_integer(),
  `Lesiones de caries [7.2]` = col_integer(),
  `Lesiones de caries [7.1]` = col_integer(),
  `Lesiones de caries [8.1]` = col_integer(),
  `Lesiones de caries [8.2]` = col_integer()
  # ... with 26 more columns
)
See spec(...) for full column specifications.

Select only the variables for this analysis

df <- df %>% 
  select(-starts_with("Lesiones")) %>% 
  select(-starts_with("Actividad")) # Por alguna razón no puedo ocupar -col:col
glimpse(df)
Observations: 292
Variables: 53
$ ID                                                                              <int> ...
$ Apellido examinador/a                                                           <chr> ...
$ sexo                                                                            <chr> ...
$ Lugar de examen                                                                 <chr> ...
$ Etnicidad?                                                                      <int> ...
$ Apellidos mapuches?                                                             <int> ...
$ Dtes presentes                                                                  <int> ...
$ Caso o control                                                                  <chr> ...
$ contarHistoria                                                                  <int> ...
$ contarActividad                                                                 <int> ...
$ binHistoria                                                                     <chr> ...
$ binActividad                                                                    <chr> ...
$ HistoriaActividad                                                               <chr> ...
$ Parentesco de/la apoderado/a                                                    <chr> ...
$ Fecha                                                                           <chr> ...
$ [Placa dental]                                                                  <chr> ...
$ [Cepillado]                                                                     <chr> ...
$ [Pasta dental fluorada]                                                         <chr> ...
$ [Uso de mamadera DIURNA con azúcar]                                             <chr> ...
$ [Uso de mamadera NOCTURNA con azúcar]                                           <chr> ...
$ [Ingesta de bebidas carbonatadas con azúcar]                                    <chr> ...
$ [Ingesta Jugos naturales]                                                       <chr> ...
$ [Ha asistido a control odg?]                                                    <chr> ...
$ [Ha asistido a control niño sano médico?]                                       <chr> ...
$ [Huerta con alimentos en casa?]                                                 <chr> ...
$ [Agua potable en casa]                                                          <chr> ...
$ [Luz eléctrica en casa]                                                         <chr> ...
$ Previsión salud familiar                                                        <chr> ...
$ Qué idiomas se hablan en la casa?                                               <chr> ...
$ Edad apoderado                                                                  <chr> ...
$ Edad madre o apoderada femenina                                                 <chr> ...
$ Etnicidad padre o apoderado masculino                                           <chr> ...
$ Trabajo padre o apoderado masculino                                             <chr> ...
$ Autorreconocimiento etnicidad padres o apoderados [Padre o apoderado masculino] <chr> ...
$ Autorreconocimiento etnicidad padres o apoderados [Madre o apoderada femenina]  <chr> ...
$ Empleo padres o apoderados [Padre o apoderado masculino]                        <chr> ...
$ Empleo padres o apoderados [Madre o apoderada femenina]                         <chr> ...
$ Educación padres o apoderados [Padre o apoderado masculino]                     <chr> ...
$ Educación padres o apoderados [Madre o apoderada femenina]                      <chr> ...
$ Empleo padre                                                                    <chr> ...
$ Empleo madre                                                                    <chr> ...
$ Vivienda                                                                        <chr> ...
$ Género apoderado                                                                <chr> ...
$ [Grupo familiar se reconoce mapuche]                                            <chr> ...
$ [Apoderado (responsable del menor) se reconoce mapuche)]                        <chr> ...
$ [Vive en campo?]                                                                <chr> ...
$ Puntaje ficha CAS                                                               <chr> ...
$ c1                                                                              <chr> ...
$ e                                                                               <chr> ...
$ o                                                                               <chr> ...
$ c3                                                                              <chr> ...
$ c1eo                                                                            <chr> ...
$ c3eo                                                                            <chr> ...
dim(df)
[1] 292  53

Check history of caries

options(digits = 2)
table(df$binHistoria)

 No  Si 
197  94 

Check activity of caries

table(df$binActividad)

 No  Si 
124 167 

Table History x activity in %

addmargins(prop.table(table(df$binHistoria, df$binActividad))*100)
     
         No    Si   Sum
  No   34.7  33.0  67.7
  Si    7.9  24.4  32.3
  Sum  42.6  57.4 100.0

Prepare everything for the regression Relevel

class(df$HistoriaActividad)
[1] "character"
df$HistoriaActividad <-  as.factor(df$HistoriaActividad)
df$HistoriaActividad2 <- relevel(df$HistoriaActividad, ref = "NoNo")
levels(df$HistoriaActividad2)
[1] "NoNo" "NoSi" "SiNo" "SiSi"

Change all to Fct

df[] <- lapply( df, factor)

MLR

test <- multinom( HistoriaActividad2 ~ 
                    `[Placa dental]`+ 
                    `[Cepillado]`+ 
                    `[Pasta dental fluorada]`   +
                    `[Uso de mamadera DIURNA con azúcar]`   +
                    `[Uso de mamadera NOCTURNA con azúcar]` +
                    `[Ingesta de bebidas carbonatadas con azúcar]`  +
                    `[Ingesta Jugos naturales]` +   
                    `[Ha asistido a control odg?]`  +
                    `[Ha asistido a control niño sano médico?]` +
                    `[Huerta con alimentos en casa?]`   +
                    `[Agua potable en casa]`        +
                    `[Luz eléctrica en casa]`       +
                    `[Grupo familiar se reconoce mapuche]`  +
                    `[Vive en campo?]` ,
                  data = df)
# weights:  120 (87 variable)
initial  value 403.411659 
iter  10 value 338.649295
iter  20 value 334.703810
iter  30 value 334.289864
iter  40 value 334.170181
iter  50 value 334.160093
final  value 334.159513 
converged

View summary of the model

summary(test)
Call:
multinom(formula = HistoriaActividad2 ~ `[Placa dental]` + `[Cepillado]` + 
    `[Pasta dental fluorada]` + `[Uso de mamadera DIURNA con azúcar]` + 
    `[Uso de mamadera NOCTURNA con azúcar]` + `[Ingesta de bebidas carbonatadas con azúcar]` + 
    `[Ingesta Jugos naturales]` + `[Ha asistido a control odg?]` + 
    `[Ha asistido a control niño sano médico?]` + `[Huerta con alimentos en casa?]` + 
    `[Agua potable en casa]` + `[Luz eléctrica en casa]` + `[Grupo familiar se reconoce mapuche]` + 
    `[Vive en campo?]`, data = df)

Coefficients:
     (Intercept) `[Placa dental]`No `[Placa dental]`Si `[Cepillado]`No
NoSi        0.17             -0.014              0.975            0.50
SiNo       -1.36             -0.950             -0.272           -0.76
SiSi       -0.08              0.037             -0.051           -0.26
     `[Cepillado]`Si `[Pasta dental fluorada]`No `[Pasta dental fluorada]`Si
NoSi            0.46                        0.59                        0.37
SiNo           -0.46                        0.10                       -1.32
SiSi            0.24                        0.19                       -0.21
     `[Uso de mamadera DIURNA con azúcar]`No
NoSi                                   0.087
SiNo                                  -0.484
SiSi                                  -0.278
     `[Uso de mamadera DIURNA con azúcar]`Si
NoSi                                    0.87
SiNo                                   -0.74
SiSi                                    0.26
     `[Uso de mamadera NOCTURNA con azúcar]`No
NoSi                                      0.77
SiNo                                     -0.31
SiSi                                      1.02
     `[Uso de mamadera NOCTURNA con azúcar]`Si
NoSi                                      0.19
SiNo                                     -0.91
SiSi                                     -1.03
     `[Ingesta de bebidas carbonatadas con azúcar]`No
NoSi                                             0.23
SiNo                                            -0.74
SiSi                                            -0.81
     `[Ingesta de bebidas carbonatadas con azúcar]`Si
NoSi                                             0.73
SiNo                                            -0.49
SiSi                                             0.80
     `[Ingesta Jugos naturales]`No `[Ingesta Jugos naturales]`Si
NoSi                         0.610                         0.350
SiNo                        -0.478                        -0.744
SiSi                        -0.038                         0.024
     `[Ha asistido a control odg?]`No `[Ha asistido a control odg?]`Si
NoSi                             0.55                             0.41
SiNo                            -1.02                            -0.20
SiSi                            -1.19                             1.17
     `[Ha asistido a control niño sano médico?]`No
NoSi                                          -7.7
SiNo                                          -7.9
SiSi                                         -13.1
     `[Ha asistido a control niño sano médico?]`Si
NoSi                                           8.7
SiNo                                           6.6
SiSi                                          13.0
     `[Huerta con alimentos en casa?]`No `[Huerta con alimentos en casa?]`Si
NoSi                                0.14                                0.82
SiNo                               -0.98                               -0.24
SiSi                               -0.53                                0.52
     `[Agua potable en casa]`No `[Agua potable en casa]`Si
NoSi                      0.798                      0.163
SiNo                     -1.282                      0.060
SiSi                     -0.047                      0.033
     `[Luz eléctrica en casa]`No `[Luz eléctrica en casa]`Si
NoSi                        15.5                     -14.492
SiNo                        -1.3                       0.098
SiSi                        15.2                     -15.239
     `[Grupo familiar se reconoce mapuche]`No
NoSi                                     0.28
SiNo                                    -0.77
SiSi                                    -0.23
     `[Grupo familiar se reconoce mapuche]`Si `[Vive en campo?]`No
NoSi                                     0.68                 0.77
SiNo                                    -0.45                -0.92
SiSi                                     0.21                -0.16
     `[Vive en campo?]`Si
NoSi                 0.19
SiNo                -0.30
SiSi                 0.14

Std. Errors:
     (Intercept) `[Placa dental]`No `[Placa dental]`Si `[Cepillado]`No
NoSi        0.22              16.51              16.51           16.51
SiNo        0.35               0.36               0.35            0.37
SiSi        0.23               6.08               6.08            6.08
     `[Cepillado]`Si `[Pasta dental fluorada]`No `[Pasta dental fluorada]`Si
NoSi           16.51                       16.51                       16.51
SiNo            0.36                        0.56                        0.52
SiSi            6.08                        6.10                        6.10
     `[Uso de mamadera DIURNA con azúcar]`No
NoSi                                   16.51
SiNo                                    0.62
SiSi                                    6.09
     `[Uso de mamadera DIURNA con azúcar]`Si
NoSi                                   16.51
SiNo                                    0.67
SiSi                                    6.09
     `[Uso de mamadera NOCTURNA con azúcar]`No
NoSi                                     16.51
SiNo                                      0.49
SiSi                                      6.09
     `[Uso de mamadera NOCTURNA con azúcar]`Si
NoSi                                      16.5
SiNo                                       0.5
SiSi                                       6.1
     `[Ingesta de bebidas carbonatadas con azúcar]`No
NoSi                                            16.51
SiNo                                             0.36
SiSi                                             6.08
     `[Ingesta de bebidas carbonatadas con azúcar]`Si
NoSi                                            16.51
SiNo                                             0.34
SiSi                                             6.08
     `[Ingesta Jugos naturales]`No `[Ingesta Jugos naturales]`Si
NoSi                         16.51                         16.51
SiNo                          0.43                          0.39
SiSi                          6.09                          6.08
     `[Ha asistido a control odg?]`No `[Ha asistido a control odg?]`Si
NoSi                            16.51                            16.51
SiNo                             0.47                             0.45
SiSi                             6.10                             6.10
     `[Ha asistido a control niño sano médico?]`No
NoSi                                       2.1e+02
SiNo                                       1.1e-06
SiSi                                       1.3e+02
     `[Ha asistido a control niño sano médico?]`Si
NoSi                                        178.60
SiNo                                          0.13
SiSi                                        114.95
     `[Huerta con alimentos en casa?]`No `[Huerta con alimentos en casa?]`Si
NoSi                               16.51                               16.51
SiNo                                0.41                                0.41
SiSi                                6.08                                6.08
     `[Agua potable en casa]`No `[Agua potable en casa]`Si
NoSi                      16.51                      16.51
SiNo                       0.65                       0.58
SiSi                       6.09                       6.09
     `[Luz eléctrica en casa]`No `[Luz eléctrica en casa]`Si
NoSi                     5.2e+01                       19.47
SiNo                     3.7e-07                        0.13
SiSi                     3.0e+01                       42.05
     `[Grupo familiar se reconoce mapuche]`No
NoSi                                    16.51
SiNo                                     0.39
SiSi                                     6.08
     `[Grupo familiar se reconoce mapuche]`Si `[Vive en campo?]`No
NoSi                                    16.51                16.51
SiNo                                     0.39                 0.41
SiSi                                     6.08                 6.08
     `[Vive en campo?]`Si
NoSi                16.51
SiNo                 0.39
SiSi                 6.08

Residual Deviance: 668 
AIC: 764 

Check ## Prediction

head(predict(test, df, type = "prob"))
  NoNo  NoSi  SiNo SiSi
1 0.16 0.082 0.094 0.67
2 0.30 0.351 0.076 0.27
3 0.29 0.332 0.253 0.13
4 0.13 0.351 0.041 0.48
5 0.30 0.351 0.076 0.27
6 0.27 0.359 0.039 0.33

z values

z <- summary(test)$coefficients/summary(test)$standard.errors
z
     (Intercept) `[Placa dental]`No `[Placa dental]`Si `[Cepillado]`No
NoSi        0.76           -0.00087             0.0590           0.030
SiNo       -3.84           -2.60978            -0.7669          -2.086
SiSi       -0.35            0.00601            -0.0083          -0.042
     `[Cepillado]`Si `[Pasta dental fluorada]`No `[Pasta dental fluorada]`Si
NoSi           0.028                       0.036                       0.022
SiNo          -1.280                       0.184                      -2.570
SiSi           0.040                       0.032                      -0.034
     `[Uso de mamadera DIURNA con azúcar]`No
NoSi                                  0.0053
SiNo                                 -0.7763
SiSi                                 -0.0457
     `[Uso de mamadera DIURNA con azúcar]`Si
NoSi                                   0.053
SiNo                                  -1.098
SiSi                                   0.043
     `[Uso de mamadera NOCTURNA con azúcar]`No
NoSi                                     0.046
SiNo                                    -0.644
SiSi                                     0.167
     `[Uso de mamadera NOCTURNA con azúcar]`Si
NoSi                                     0.012
SiNo                                    -1.824
SiSi                                    -0.170
     `[Ingesta de bebidas carbonatadas con azúcar]`No
NoSi                                            0.014
SiNo                                           -2.057
SiSi                                           -0.134
     `[Ingesta de bebidas carbonatadas con azúcar]`Si
NoSi                                            0.044
SiNo                                           -1.440
SiSi                                            0.131
     `[Ingesta Jugos naturales]`No `[Ingesta Jugos naturales]`Si
NoSi                        0.0370                        0.0212
SiNo                       -1.1083                       -1.9011
SiSi                       -0.0062                        0.0039
     `[Ha asistido a control odg?]`No `[Ha asistido a control odg?]`Si
NoSi                            0.033                            0.025
SiNo                           -2.185                           -0.448
SiSi                           -0.195                            0.193
     `[Ha asistido a control niño sano médico?]`No
NoSi                                      -3.6e-02
SiNo                                      -7.0e+06
SiSi                                      -1.0e-01
     `[Ha asistido a control niño sano médico?]`Si
NoSi                                         0.049
SiNo                                        51.893
SiSi                                         0.113
     `[Huerta con alimentos en casa?]`No `[Huerta con alimentos en casa?]`Si
NoSi                              0.0086                               0.050
SiNo                             -2.4269                              -0.574
SiSi                             -0.0874                               0.085
     `[Agua potable en casa]`No `[Agua potable en casa]`Si
NoSi                     0.0483                     0.0099
SiNo                    -1.9874                     0.1041
SiSi                    -0.0077                     0.0054
     `[Luz eléctrica en casa]`No `[Luz eléctrica en casa]`Si
NoSi                     2.9e-01                       -0.74
SiNo                    -3.6e+06                        0.77
SiSi                     5.1e-01                       -0.36
     `[Grupo familiar se reconoce mapuche]`No
NoSi                                    0.017
SiNo                                   -1.993
SiSi                                   -0.037
     `[Grupo familiar se reconoce mapuche]`Si `[Vive en campo?]`No
NoSi                                    0.041                0.047
SiNo                                   -1.173               -2.229
SiSi                                    0.035               -0.026
     `[Vive en campo?]`Si
NoSi                0.011
SiNo               -0.758
SiSi                0.024

2 tailed p values

p <- (1 - pnorm(abs(z), 0, 1))*2
p
     (Intercept) `[Placa dental]`No `[Placa dental]`Si `[Cepillado]`No
NoSi     0.44820             0.9993               0.95           0.976
SiNo     0.00012             0.0091               0.44           0.037
SiSi     0.72913             0.9952               0.99           0.966
     `[Cepillado]`Si `[Pasta dental fluorada]`No `[Pasta dental fluorada]`Si
NoSi            0.98                        0.97                        0.98
SiNo            0.20                        0.85                        0.01
SiSi            0.97                        0.97                        0.97
     `[Uso de mamadera DIURNA con azúcar]`No
NoSi                                    1.00
SiNo                                    0.44
SiSi                                    0.96
     `[Uso de mamadera DIURNA con azúcar]`Si
NoSi                                    0.96
SiNo                                    0.27
SiSi                                    0.97
     `[Uso de mamadera NOCTURNA con azúcar]`No
NoSi                                      0.96
SiNo                                      0.52
SiSi                                      0.87
     `[Uso de mamadera NOCTURNA con azúcar]`Si
NoSi                                     0.991
SiNo                                     0.068
SiSi                                     0.865
     `[Ingesta de bebidas carbonatadas con azúcar]`No
NoSi                                             0.99
SiNo                                             0.04
SiSi                                             0.89
     `[Ingesta de bebidas carbonatadas con azúcar]`Si
NoSi                                             0.96
SiNo                                             0.15
SiSi                                             0.90
     `[Ingesta Jugos naturales]`No `[Ingesta Jugos naturales]`Si
NoSi                          0.97                         0.983
SiNo                          0.27                         0.057
SiSi                          1.00                         0.997
     `[Ha asistido a control odg?]`No `[Ha asistido a control odg?]`Si
NoSi                            0.973                             0.98
SiNo                            0.029                             0.65
SiSi                            0.846                             0.85
     `[Ha asistido a control niño sano médico?]`No
NoSi                                          0.97
SiNo                                          0.00
SiSi                                          0.92
     `[Ha asistido a control niño sano médico?]`Si
NoSi                                          0.96
SiNo                                          0.00
SiSi                                          0.91
     `[Huerta con alimentos en casa?]`No `[Huerta con alimentos en casa?]`Si
NoSi                               0.993                                0.96
SiNo                               0.015                                0.57
SiSi                               0.930                                0.93
     `[Agua potable en casa]`No `[Agua potable en casa]`Si
NoSi                      0.961                       0.99
SiNo                      0.047                       0.92
SiSi                      0.994                       1.00
     `[Luz eléctrica en casa]`No `[Luz eléctrica en casa]`Si
NoSi                        0.77                        0.46
SiNo                        0.00                        0.44
SiSi                        0.61                        0.72
     `[Grupo familiar se reconoce mapuche]`No
NoSi                                    0.986
SiNo                                    0.046
SiSi                                    0.970
     `[Grupo familiar se reconoce mapuche]`Si `[Vive en campo?]`No
NoSi                                     0.97                0.963
SiNo                                     0.24                0.026
SiSi                                     0.97                0.979
     `[Vive en campo?]`Si
NoSi                 0.99
SiNo                 0.45
SiSi                 0.98
head(fitted(test))
  NoNo  NoSi  SiNo SiSi
1 0.16 0.082 0.094 0.67
2 0.30 0.351 0.076 0.27
3 0.29 0.332 0.253 0.13
4 0.13 0.351 0.041 0.48
5 0.30 0.351 0.076 0.27
6 0.27 0.359 0.039 0.33
df$predict <- predict(test, df)
addmargins(table(df$predict, df$HistoriaActividad2))
      
       NoNo NoSi SiNo SiSi Sum
  NoNo   43   23    7    5  78
  NoSi   51   64   14   44 173
  SiNo    1    0    1    0   2
  SiSi    6    9    1   22  38
  Sum   101   96   23   71 291
chisq.test(table(df$predict, df$HistoriaActividad2))
Chi-squared approximation may be incorrect

    Pearson's Chi-squared test

data:  table(df$predict, df$HistoriaActividad2)
X-squared = 50, df = 9, p-value = 5e-08

Odds ratios

oddrat
                                     (Intercept) 
                                         2.4e+00 
                              `[Placa dental]`No 
                                         9.8e-01 
                              `[Placa dental]`Si 
                                         1.7e+00 
                                 `[Cepillado]`No 
                                         8.3e-01 
                                 `[Cepillado]`Si 
                                              NA 
                     `[Pasta dental fluorada]`No 
                                         1.6e+00 
                     `[Pasta dental fluorada]`Si 
                                              NA 
         `[Uso de mamadera DIURNA con azúcar]`No 
                                         5.8e-01 
         `[Uso de mamadera DIURNA con azúcar]`Si 
                                              NA 
       `[Uso de mamadera NOCTURNA con azúcar]`No 
                                         2.5e+00 
       `[Uso de mamadera NOCTURNA con azúcar]`Si 
                                              NA 
`[Ingesta de bebidas carbonatadas con azúcar]`No 
                                         4.8e-01 
`[Ingesta de bebidas carbonatadas con azúcar]`Si 
                                              NA 
                   `[Ingesta Jugos naturales]`No 
                                         1.2e+00 
                   `[Ingesta Jugos naturales]`Si 
                                              NA 
                `[Ha asistido a control odg?]`No 
                                         6.4e-01 
                `[Ha asistido a control odg?]`Si 
                                              NA 
   `[Ha asistido a control niño sano médico?]`No 
                                         1.5e-07 
   `[Ha asistido a control niño sano médico?]`Si 
                                              NA 
             `[Huerta con alimentos en casa?]`No 
                                         4.4e-01 
             `[Huerta con alimentos en casa?]`Si 
                                              NA 
                      `[Agua potable en casa]`No 
                                         1.2e+00 
                      `[Agua potable en casa]`Si 
                                              NA 
                     `[Luz eléctrica en casa]`No 
                                         4.6e+13 
                     `[Luz eléctrica en casa]`Si 
                                              NA 
        `[Grupo familiar se reconoce mapuche]`No 
                                         6.8e-01 
        `[Grupo familiar se reconoce mapuche]`Si 
                                              NA 
                            `[Vive en campo?]`No 
                                         1.0e+00 
                            `[Vive en campo?]`Si 
                                              NA 
LS0tDQp0aXRsZTogIlJpc2sgZmFjdG9ycyBmb3IgZWFybHkgY2hpbGRob29kIGNhcmllcyBhY3Rpdml0eSBhbmQgaGlzdG9yeSINCmF1dGhvcjogU2VyZ2lvIFVyaWJlDQpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sNCi0tLQ0KDQoNCiMgUGFja2FnZXMNCmBgYHtyIGV2YWw9RkFMU0V9DQpsaWJyYXJ5KHRpZHl2ZXJzZSkgIyBmb3IgZGF0YSB3cmFuZ2xpbmcsIGdyYXBocywgZXRjDQpsaWJyYXJ5KG5uZXQpICMgZm9yIG9yZGluYWwgbG9nIHJlZw0KYGBgDQoNCiMgRGF0YXNldA0KYGBge3IgZGF0YWZyYW1lfQ0KZGYgPC0gcmVhZF9jc3YoImRhdGFzZXQvaGlzdG9yaWFhY3RpdmlkYWQuY3N2IikNCmBgYA0KU2VsZWN0IG9ubHkgdGhlIHZhcmlhYmxlcyBmb3IgdGhpcyBhbmFseXNpcw0KYGBge3J9DQpkZiA8LSBkZiAlPiUgDQogIHNlbGVjdCgtc3RhcnRzX3dpdGgoIkxlc2lvbmVzIikpICU+JSANCiAgc2VsZWN0KC1zdGFydHNfd2l0aCgiQWN0aXZpZGFkIikpICMgUG9yIGFsZ3VuYSByYXrDs24gbm8gcHVlZG8gb2N1cGFyIC1jb2w6Y29sDQpgYGANCg0KYGBge3IgY2hlY2sgc3RydWN0dXJlfQ0KZ2xpbXBzZShkZikNCmRpbShkZikNCmBgYA0KDQpDaGVjayBoaXN0b3J5IG9mIGNhcmllcw0KYGBge3IgVGFibGUgSGlzdH0NCm9wdGlvbnMoZGlnaXRzID0gMikNCnRhYmxlKGRmJGJpbkhpc3RvcmlhKQ0KYGBgDQpDaGVjayBhY3Rpdml0eSBvZiBjYXJpZXMNCmBgYHtyIHRhYmxlIEFjdH0NCnRhYmxlKGRmJGJpbkFjdGl2aWRhZCkNCg0KYGBgDQpUYWJsZSBIaXN0b3J5IHggYWN0aXZpdHkgaW4gJQ0KYGBge3IgdGFibGUgaGlzdCB4IGFjdH0NCmFkZG1hcmdpbnMocHJvcC50YWJsZSh0YWJsZShkZiRiaW5IaXN0b3JpYSwgZGYkYmluQWN0aXZpZGFkKSkqMTAwKQ0KDQpgYGANCg0KUHJlcGFyZSBldmVyeXRoaW5nIGZvciB0aGUgcmVncmVzc2lvbg0KUmVsZXZlbA0KYGBge3J9DQpjbGFzcyhkZiRIaXN0b3JpYUFjdGl2aWRhZCkNCmRmJEhpc3RvcmlhQWN0aXZpZGFkIDwtICBhcy5mYWN0b3IoZGYkSGlzdG9yaWFBY3RpdmlkYWQpDQpkZiRIaXN0b3JpYUFjdGl2aWRhZDIgPC0gcmVsZXZlbChkZiRIaXN0b3JpYUFjdGl2aWRhZCwgcmVmID0gIk5vTm8iKQ0KbGV2ZWxzKGRmJEhpc3RvcmlhQWN0aXZpZGFkMikNCmBgYA0KQ2hhbmdlIGFsbCB0byBGY3QNCg0KYGBge3J9DQpkZltdIDwtIGxhcHBseSggZGYsIGZhY3RvcikNCg0KYGBgDQoNCg0KIyBNTFINCmBgYHtyfQ0KdGVzdCA8LSBtdWx0aW5vbSggSGlzdG9yaWFBY3RpdmlkYWQyIH4gDQogICAgICAgICAgICAgICAgICAgIGBbUGxhY2EgZGVudGFsXWArIA0KICAgICAgICAgICAgICAgICAgICBgW0NlcGlsbGFkb11gKyANCiAgICAgICAgICAgICAgICAgICAgYFtQYXN0YSBkZW50YWwgZmx1b3JhZGFdYAkrDQogICAgICAgICAgICAgICAgICAgIGBbVXNvIGRlIG1hbWFkZXJhIERJVVJOQSBjb24gYXrDumNhcl1gCSsNCiAgICAgICAgICAgICAgICAgICAgYFtVc28gZGUgbWFtYWRlcmEgTk9DVFVSTkEgY29uIGF6w7pjYXJdYAkrDQogICAgICAgICAgICAgICAgICAgIGBbSW5nZXN0YSBkZSBiZWJpZGFzIGNhcmJvbmF0YWRhcyBjb24gYXrDumNhcl1gCSsNCiAgICAgICAgICAgICAgICAgICAgYFtJbmdlc3RhIEp1Z29zIG5hdHVyYWxlc11gCSsJDQogICAgICAgICAgICAgICAgICAgIGBbSGEgYXNpc3RpZG8gYSBjb250cm9sIG9kZz9dYAkrDQogICAgICAgICAgICAgICAgICAgIGBbSGEgYXNpc3RpZG8gYSBjb250cm9sIG5pw7FvIHNhbm8gbcOpZGljbz9dYAkrDQogICAgICAgICAgICAgICAgICAgIGBbSHVlcnRhIGNvbiBhbGltZW50b3MgZW4gY2FzYT9dYAkrDQogICAgICAgICAgICAgICAgICAgIGBbQWd1YSBwb3RhYmxlIGVuIGNhc2FdYAkJKw0KICAgICAgICAgICAgICAgICAgICBgW0x1eiBlbMOpY3RyaWNhIGVuIGNhc2FdYAkJKw0KICAgICAgICAgICAgICAgICAgICBgW0dydXBvIGZhbWlsaWFyIHNlIHJlY29ub2NlIG1hcHVjaGVdYAkrDQogICAgICAgICAgICAgICAgICAgIGBbVml2ZSBlbiBjYW1wbz9dYCAsDQogICAgICAgICAgICAgICAgICBkYXRhID0gZGYpDQpgYGANClZpZXcgc3VtbWFyeSBvZiB0aGUgbW9kZWwNCmBgYHtyfQ0Kc3VtbWFyeSh0ZXN0KQ0KYGBgDQoNCg0KQ2hlY2sNCiMjIFByZWRpY3Rpb24NCmBgYHtyIHByZWRpY3Rpb259DQpoZWFkKHByZWRpY3QodGVzdCwgZGYsIHR5cGUgPSAicHJvYiIpKQ0KYGBgDQoNCiMjIHogdmFsdWVzDQoNCg0KYGBge3J9DQp6IDwtIHN1bW1hcnkodGVzdCkkY29lZmZpY2llbnRzL3N1bW1hcnkodGVzdCkkc3RhbmRhcmQuZXJyb3JzDQp6DQpgYGANCiMjIDIgdGFpbGVkIHAgdmFsdWVzDQpgYGB7cn0NCnAgPC0gKDEgLSBwbm9ybShhYnMoeiksIDAsIDEpKSoyDQpwDQpgYGANCg0KYGBge3J9DQpoZWFkKGZpdHRlZCh0ZXN0KSkNCmBgYA0KDQoNCmBgYHtyfQ0KZGYkcHJlZGljdCA8LSBwcmVkaWN0KHRlc3QsIGRmKQ0KYWRkbWFyZ2lucyh0YWJsZShkZiRwcmVkaWN0LCBkZiRIaXN0b3JpYUFjdGl2aWRhZDIpKQ0KYGBgDQpgYGB7cn0NCmNoaXNxLnRlc3QodGFibGUoZGYkcHJlZGljdCwgZGYkSGlzdG9yaWFBY3RpdmlkYWQyKSkNCmBgYA0KDQoNCiMjIE9kZHMgcmF0aW9zDQpgYGB7ciBvZGRzIHJhdGlvc30NCg0KbW9kZWwgPC0gZ2xtKEhpc3RvcmlhQWN0aXZpZGFkMiB+IA0KICAgICAgICAgICAgICAgICAgICBgW1BsYWNhIGRlbnRhbF1gKyANCiAgICAgICAgICAgICAgICAgICAgYFtDZXBpbGxhZG9dYCsgDQogICAgICAgICAgICAgICAgICAgIGBbUGFzdGEgZGVudGFsIGZsdW9yYWRhXWAJKw0KICAgICAgICAgICAgICAgICAgICBgW1VzbyBkZSBtYW1hZGVyYSBESVVSTkEgY29uIGF6w7pjYXJdYAkrDQogICAgICAgICAgICAgICAgICAgIGBbVXNvIGRlIG1hbWFkZXJhIE5PQ1RVUk5BIGNvbiBhesO6Y2FyXWAJKw0KICAgICAgICAgICAgICAgICAgICBgW0luZ2VzdGEgZGUgYmViaWRhcyBjYXJib25hdGFkYXMgY29uIGF6w7pjYXJdYAkrDQogICAgICAgICAgICAgICAgICAgIGBbSW5nZXN0YSBKdWdvcyBuYXR1cmFsZXNdYAkrCQ0KICAgICAgICAgICAgICAgICAgICBgW0hhIGFzaXN0aWRvIGEgY29udHJvbCBvZGc/XWAJKw0KICAgICAgICAgICAgICAgICAgICBgW0hhIGFzaXN0aWRvIGEgY29udHJvbCBuacOxbyBzYW5vIG3DqWRpY28/XWAJKw0KICAgICAgICAgICAgICAgICAgICBgW0h1ZXJ0YSBjb24gYWxpbWVudG9zIGVuIGNhc2E/XWAJKw0KICAgICAgICAgICAgICAgICAgICBgW0FndWEgcG90YWJsZSBlbiBjYXNhXWAJCSsNCiAgICAgICAgICAgICAgICAgICAgYFtMdXogZWzDqWN0cmljYSBlbiBjYXNhXWAJCSsNCiAgICAgICAgICAgICAgICAgICAgYFtHcnVwbyBmYW1pbGlhciBzZSByZWNvbm9jZSBtYXB1Y2hlXWAJKw0KICAgICAgICAgICAgICAgICAgICBgW1ZpdmUgZW4gY2FtcG8/XWAgLA0KICAgICAgICAgICAgICAgICAgZGF0YSA9IGRmLCBmYW1pbHk9Ymlub21pYWwoImxvZ2l0IikpDQpvZGRyYXQgPC0gZXhwKGNvZWYobW9kZWwpKQ0Kb2RkcmF0DQpgYGANCg==