Modelos de Ecuaciones Estructurales

Guillermo Cázares Cruz - A01283709 (llegué tarde, así que la primera parte del archivo me lo compartió Victor Manuel Muñoz Tirado - A01423434)

22-02-2024

Teoría

Los Modelos de Ecuaciones Estructurales (Sem) es una técnica de análisis de estadistica multivariada, que permite analizar paterones complejos de relaciones entre variables, realizar comparaciones entre e intragrupos, y validar modelos teóricos y empiricos.

Ejemplo “Estudio de Holzinger y Swineford (1939)”: Contexto, Tipos de Fórmulas, Estructura del Modelo, Análisis Factorial Confirmatorio (10 puntos, 2.5 c/u)

Contexto

Holzinger y Swineford realizaron exámenes de habilidad mental a adolescentes de 7° y 8° de dos escuelas (Pasteur y Grand-white).

La base de datos esta incluida como paquete en R e incluye las siguientes variables y columnas:

    • id: identificador

    • sex: género (1 Hombre, 2 Mujer)

    • ageyr: años

    • agemo: meses

    • school: escuela

    • grade: grado

    • x1: percepción visual

    • x2: juego con cubos

    • x3: juego con pastillas / espaciales

    • x4: comprension de párrafos

    • x5: completar oraciones

    • x6: significados de palabras

    • x7: sumas aceleradas

    • x8: conteo acelerado de puntos

    • x9: discriminacion acelerada de mayusculas rectas y curvas

      Se busca identificar las relaciones entre las habilidades visual (x1,x2,x3), textual (x4,x5,x6) y velocidad (x7,x8,x9) de los adolescentes.

Llamar librerias

#install.packages('lavaan')
#install.packages('lavaanPlot')
library(lavaan)
library(lavaanPlot)
#lavaan = Latent variable analysis (no se observa, se infiere)

Importar base de datos

df1 <- HolzingerSwineford1939

Entender la base de datos

str(df1)
## 'data.frame':    301 obs. of  15 variables:
##  $ id    : int  1 2 3 4 5 6 7 8 9 11 ...
##  $ sex   : int  1 2 2 1 2 2 1 2 2 2 ...
##  $ ageyr : int  13 13 13 13 12 14 12 12 13 12 ...
##  $ agemo : int  1 7 1 2 2 1 1 2 0 5 ...
##  $ school: Factor w/ 2 levels "Grant-White",..: 2 2 2 2 2 2 2 2 2 2 ...
##  $ grade : int  7 7 7 7 7 7 7 7 7 7 ...
##  $ x1    : num  3.33 5.33 4.5 5.33 4.83 ...
##  $ x2    : num  7.75 5.25 5.25 7.75 4.75 5 6 6.25 5.75 5.25 ...
##  $ x3    : num  0.375 2.125 1.875 3 0.875 ...
##  $ x4    : num  2.33 1.67 1 2.67 2.67 ...
##  $ x5    : num  5.75 3 1.75 4.5 4 3 6 4.25 5.75 5 ...
##  $ x6    : num  1.286 1.286 0.429 2.429 2.571 ...
##  $ x7    : num  3.39 3.78 3.26 3 3.7 ...
##  $ x8    : num  5.75 6.25 3.9 5.3 6.3 6.65 6.2 5.15 4.65 4.55 ...
##  $ x9    : num  6.36 7.92 4.42 4.86 5.92 ...
colSums(is.na(df1))
##     id    sex  ageyr  agemo school  grade     x1     x2     x3     x4     x5 
##      0      0      0      0      0      1      0      0      0      0      0 
##     x6     x7     x8     x9 
##      0      0      0      0

Tipos de formulas

  1. Regresión (~) Variable que depende de otras

  2. Variables latentes (=~) No se observa, se infiere

  3. Varianzas y covarianzas (~~) Relaciones entre variables latnetes y observadas (Varianza entre si misma, covarianza entre otras)

  4. Intercepto (~1) Valor esperado cuando las demas variables son cero

Estructura Modelo 1

modelo1 <- ' # Regresiones
             # Variables latentes
             visual =~ x1 + x2 + x3
             textual =~ x4 + x5 + x6
             velocidad =~ x7 + x8 + x9
             # Varianzas y covarianzas
             # Intercepto
'

Generar el Análisis Factorial Confirmatorio (CFA)

fit <- cfa(modelo1, df1)
summary(fit)
## lavaan 0.6.17 ended normally after 35 iterations
## 
##   Estimator                                         ML
##   Optimization method                           NLMINB
##   Number of model parameters                        21
## 
##   Number of observations                           301
## 
## Model Test User Model:
##                                                       
##   Test statistic                                85.306
##   Degrees of freedom                                24
##   P-value (Chi-square)                           0.000
## 
## Parameter Estimates:
## 
##   Standard errors                             Standard
##   Information                                 Expected
##   Information saturated (h1) model          Structured
## 
## Latent Variables:
##                    Estimate  Std.Err  z-value  P(>|z|)
##   visual =~                                           
##     x1                1.000                           
##     x2                0.554    0.100    5.554    0.000
##     x3                0.729    0.109    6.685    0.000
##   textual =~                                          
##     x4                1.000                           
##     x5                1.113    0.065   17.014    0.000
##     x6                0.926    0.055   16.703    0.000
##   velocidad =~                                        
##     x7                1.000                           
##     x8                1.180    0.165    7.152    0.000
##     x9                1.082    0.151    7.155    0.000
## 
## Covariances:
##                    Estimate  Std.Err  z-value  P(>|z|)
##   visual ~~                                           
##     textual           0.408    0.074    5.552    0.000
##     velocidad         0.262    0.056    4.660    0.000
##   textual ~~                                          
##     velocidad         0.173    0.049    3.518    0.000
## 
## Variances:
##                    Estimate  Std.Err  z-value  P(>|z|)
##    .x1                0.549    0.114    4.833    0.000
##    .x2                1.134    0.102   11.146    0.000
##    .x3                0.844    0.091    9.317    0.000
##    .x4                0.371    0.048    7.779    0.000
##    .x5                0.446    0.058    7.642    0.000
##    .x6                0.356    0.043    8.277    0.000
##    .x7                0.799    0.081    9.823    0.000
##    .x8                0.488    0.074    6.573    0.000
##    .x9                0.566    0.071    8.003    0.000
##     visual            0.809    0.145    5.564    0.000
##     textual           0.979    0.112    8.737    0.000
##     velocidad         0.384    0.086    4.451    0.000
lavaanPlot(fit, coef=TRUE, cov=TRUE)

Conclusión:

Dentro de los grupos, la variable mayormente relacionada de cada grupo es: conteo acelerado de puntos (velocidad), completar oraciones (textual), y juego con pastillas / espaciales (visual).

Entre los diferentes grupos, el par que está mayormente relacionado es visual y textual (0.41), mientras que el par menormente relacionado es textual y velocidad (0.17).

Ejercicio “Democracia Política e Industrialización”: Contexto, Estructura del Modelo, Análisis Factorial Confirmatorio (30 puntos, 10 c/u)

Contexto

La base de datos contiene distintas mediciones sobre la democracia política e industralización en paises en desarrollo durante 1960 y 1965

La tabla incluye los siguientes datos:

  • y1: Calificaciones sobre libertada de prensa en 1960

  • y2: Libertad de la oposición política en 1960

  • y3: Imparcialidad de elecciones en 1960

  • y4: Eficacia de la legislatura electa en 1960

  • y5: Calificaciones sobre libertad de prensa en 1965

  • y6: Libertad de la oposición política en 1965

  • y7: Imparcialidad de elecciones en 1965

  • y8: Eficacia de la legislatura electa en 1965

  • x1: PIB per cápita en 1960

  • x2: Consumo de energía inanimada per cápita en 1960

  • x3: Porcentaje de la fuerza laboral en la industria en 1960

Importar la base de datos

df2 <- PoliticalDemocracy

Entender la base de datos

colSums(is.na(df2))
## y1 y2 y3 y4 y5 y6 y7 y8 x1 x2 x3 
##  0  0  0  0  0  0  0  0  0  0  0
str(df2)
## 'data.frame':    75 obs. of  11 variables:
##  $ y1: num  2.5 1.25 7.5 8.9 10 7.5 7.5 7.5 2.5 10 ...
##  $ y2: num  0 0 8.8 8.8 3.33 ...
##  $ y3: num  3.33 3.33 10 10 10 ...
##  $ y4: num  0 0 9.2 9.2 6.67 ...
##  $ y5: num  1.25 6.25 8.75 8.91 7.5 ...
##  $ y6: num  0 1.1 8.09 8.13 3.33 ...
##  $ y7: num  3.73 6.67 10 10 10 ...
##  $ y8: num  3.333 0.737 8.212 4.615 6.667 ...
##  $ x1: num  4.44 5.38 5.96 6.29 5.86 ...
##  $ x2: num  3.64 5.06 6.26 7.57 6.82 ...
##  $ x3: num  2.56 3.57 5.22 6.27 4.57 ...

Estructura Modelo 2

modelo2 <- ' # Regresiones
              Politica1965 ~ Politica1960 + Economia1960
              Politica1960 ~ Economia1960
             # Variables latentes
             Politica1965 =~ y5 + y6 + y7 + y8
             Politica1960 =~ y1 + y2 + y3 + y4
             Economia1960 =~ x1 + x2 + x3
             # Varianzas y covarianzas
             # Intercepto
'

Se utilizó Pol1970 ~ Eco1960 en vez del otro posible orden debido a que daba mejores resultados.

Generar el Análisis Factorial Confirmatorio (CFA)

fit_2 <- cfa(modelo2, df2)
summary(fit_2)
## lavaan 0.6.17 ended normally after 42 iterations
## 
##   Estimator                                         ML
##   Optimization method                           NLMINB
##   Number of model parameters                        25
## 
##   Number of observations                            75
## 
## Model Test User Model:
##                                                       
##   Test statistic                                72.462
##   Degrees of freedom                                41
##   P-value (Chi-square)                           0.002
## 
## Parameter Estimates:
## 
##   Standard errors                             Standard
##   Information                                 Expected
##   Information saturated (h1) model          Structured
## 
## Latent Variables:
##                    Estimate  Std.Err  z-value  P(>|z|)
##   Politica1965 =~                                     
##     y5                1.000                           
##     y6                1.258    0.164    7.651    0.000
##     y7                1.282    0.158    8.137    0.000
##     y8                1.310    0.154    8.529    0.000
##   Politica1960 =~                                     
##     y1                1.000                           
##     y2                1.354    0.175    7.755    0.000
##     y3                1.044    0.150    6.961    0.000
##     y4                1.300    0.138    9.412    0.000
##   Economia1960 =~                                     
##     x1                1.000                           
##     x2                2.182    0.139   15.714    0.000
##     x3                1.819    0.152   11.956    0.000
## 
## Regressions:
##                    Estimate  Std.Err  z-value  P(>|z|)
##   Politica1965 ~                                      
##     Politica1960      0.864    0.113    7.671    0.000
##     Economia1960      0.453    0.220    2.064    0.039
##   Politica1960 ~                                      
##     Economia1960      1.474    0.392    3.763    0.000
## 
## Variances:
##                    Estimate  Std.Err  z-value  P(>|z|)
##    .y5                2.390    0.447    5.351    0.000
##    .y6                4.343    0.796    5.456    0.000
##    .y7                3.510    0.668    5.252    0.000
##    .y8                2.940    0.586    5.019    0.000
##    .y1                1.942    0.395    4.910    0.000
##    .y2                6.490    1.185    5.479    0.000
##    .y3                5.340    0.943    5.662    0.000
##    .y4                2.887    0.610    4.731    0.000
##    .x1                0.082    0.020    4.180    0.000
##    .x2                0.118    0.070    1.689    0.091
##    .x3                0.467    0.090    5.174    0.000
##    .Politica1965      0.115    0.200    0.575    0.565
##    .Politica1960      3.872    0.893    4.338    0.000
##     Economia1960      0.448    0.087    5.169    0.000
lavaanPlot(fit_2, coef=TRUE, cov=TRUE)

Conclusión

Dentro de los grupos, la variable mayormente relacionada de cada grupo es: Consumo de energía inanimada per cápita en 1960 (Economia1960), Libertad de la oposición política en 1960 (Politica1960), y Imparcialidad de elecciones en 1965 (Politica1965).

Entre los diferentes grupos, el par que está mayormente relacionado es Politica1960 y Economia1960 (1.47), mientras que el par menormente relacionado es Politica1965 y Economia1960 (0.45).

LS0tDQp0aXRsZTogIkVjdWFjaW9uZXMgZXN0cnVjdHVyYWxlcyINCmF1dGhvcjogIkd1aWxsZXJtbyBDYXphcmVzIENydXoiDQpkYXRlOiAiMjAyNC0wMi0yMiINCm91dHB1dDogDQogIGh0bWxfZG9jdW1lbnQ6DQogICAgdG9jOiBUUlVFDQogICAgdG9jX2Zsb2F0OiBUUlVFDQogICAgY29kZV9kb3dubG9hZDogVFJVRQ0KLS0tDQoNCiFbXShodHRwczovL21lZGlhLmdpcGh5LmNvbS9tZWRpYS92MS5ZMmxrUFRjNU1HSTNOakV4WkhSemVtTnVaSGR5ZVcwMU5tMTJlbTR6TW5FeGIyNTNZbnBwY1c5b00yWnNOMmc1WTNoelp5WmxjRDEyTVY5bmFXWnpYM05sWVhKamFDWmpkRDFuLzNvNllnNEdVVmdJVWczYmY3Vy9naXBoeS5naWYpDQoNCiMgTW9kZWxvcyBkZSBFY3VhY2lvbmVzIEVzdHJ1Y3R1cmFsZXMNCg0KR3VpbGxlcm1vIEPDoXphcmVzIENydXogLSBBMDEyODM3MDkgKGxsZWd1w6kgdGFyZGUsIGFzw60gcXVlIGxhIHByaW1lcmEgcGFydGUgZGVsIGFyY2hpdm8gbWUgbG8gY29tcGFydGnDsyBWaWN0b3IgTWFudWVsIE11w7FveiBUaXJhZG8gLSBBMDE0MjM0MzQpDQoNCjIyLTAyLTIwMjQNCg0KIyMgVGVvcsOtYQ0KDQpMb3MgKipNb2RlbG9zIGRlIEVjdWFjaW9uZXMgRXN0cnVjdHVyYWxlcyAoU2VtKSoqIGVzIHVuYSB0w6ljbmljYSBkZSBhbsOhbGlzaXMgZGUgZXN0YWRpc3RpY2EgbXVsdGl2YXJpYWRhLCBxdWUgcGVybWl0ZSBhbmFsaXphciBwYXRlcm9uZXMgY29tcGxlam9zIGRlIHJlbGFjaW9uZXMgZW50cmUgdmFyaWFibGVzLCByZWFsaXphciBjb21wYXJhY2lvbmVzIGVudHJlIGUgaW50cmFncnVwb3MsIHkgdmFsaWRhciBtb2RlbG9zIHRlw7NyaWNvcyB5IGVtcGlyaWNvcy4NCg0KIyBFamVtcGxvICJFc3R1ZGlvIGRlIEhvbHppbmdlciB5IFN3aW5lZm9yZCAoMTkzOSkiOiBDb250ZXh0bywgVGlwb3MgZGUgRsOzcm11bGFzLCBFc3RydWN0dXJhIGRlbCBNb2RlbG8sIEFuw6FsaXNpcyBGYWN0b3JpYWwgQ29uZmlybWF0b3JpbyAoMTAgcHVudG9zLCAgMi41IGMvdSkNCg0KIyMgQ29udGV4dG8NCg0KSG9semluZ2VyIHkgU3dpbmVmb3JkIHJlYWxpemFyb24gZXjDoW1lbmVzIGRlIGhhYmlsaWRhZCBtZW50YWwgYSBhZG9sZXNjZW50ZXMgZGUgN8KwIHkgOMKwIGRlIGRvcyBlc2N1ZWxhcyAoKlBhc3RldXIgeSBHcmFuZC13aGl0ZSopLg0KDQpMYSBiYXNlIGRlIGRhdG9zIGVzdGEgaW5jbHVpZGEgY29tbyBwYXF1ZXRlIGVuIFIgZSBpbmNsdXllIGxhcyBzaWd1aWVudGVzIHZhcmlhYmxlcyB5IGNvbHVtbmFzOg0KDQotICAgPGRpdj4NCg0KICAgID4gLSAgIGlkOiBpZGVudGlmaWNhZG9yDQogICAgPg0KICAgID4gLSAgIHNleDogZ8OpbmVybyAoMSBIb21icmUsIDIgTXVqZXIpDQogICAgPg0KICAgID4gLSAgIGFnZXlyOiBhw7Fvcw0KICAgID4NCiAgICA+IC0gICBhZ2VtbzogbWVzZXMNCiAgICA+DQogICAgPiAtICAgc2Nob29sOiBlc2N1ZWxhDQogICAgPg0KICAgID4gLSAgIGdyYWRlOiBncmFkbw0KICAgID4NCiAgICA+IC0gICB4MTogcGVyY2VwY2nDs24gdmlzdWFsDQogICAgPg0KICAgID4gLSAgIHgyOiBqdWVnbyBjb24gY3Vib3MNCiAgICA+DQogICAgPiAtICAgeDM6IGp1ZWdvIGNvbiBwYXN0aWxsYXMgLyBlc3BhY2lhbGVzDQogICAgPg0KICAgID4gLSAgIHg0OiBjb21wcmVuc2lvbiBkZSBww6FycmFmb3MNCiAgICA+DQogICAgPiAtICAgeDU6IGNvbXBsZXRhciBvcmFjaW9uZXMNCiAgICA+DQogICAgPiAtICAgeDY6IHNpZ25pZmljYWRvcyBkZSBwYWxhYnJhcw0KICAgID4NCiAgICA+IC0gICB4Nzogc3VtYXMgYWNlbGVyYWRhcw0KICAgID4NCiAgICA+IC0gICB4ODogY29udGVvIGFjZWxlcmFkbyBkZSBwdW50b3MNCiAgICA+DQogICAgPiAtICAgeDk6IGRpc2NyaW1pbmFjaW9uIGFjZWxlcmFkYSBkZSBtYXl1c2N1bGFzIHJlY3RhcyB5IGN1cnZhcw0KICAgID4NCiAgICA+ICAgICBTZSBidXNjYSBpZGVudGlmaWNhciBsYXMgcmVsYWNpb25lcyBlbnRyZSBsYXMgaGFiaWxpZGFkZXMgdmlzdWFsICh4MSx4Mix4MyksIHRleHR1YWwgKHg0LHg1LHg2KSB5IHZlbG9jaWRhZCAoeDcseDgseDkpIGRlIGxvcyBhZG9sZXNjZW50ZXMuDQoNCiAgICA8L2Rpdj4NCg0KIyMgTGxhbWFyIGxpYnJlcmlhcw0KDQpgYGB7ciBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KI2luc3RhbGwucGFja2FnZXMoJ2xhdmFhbicpDQojaW5zdGFsbC5wYWNrYWdlcygnbGF2YWFuUGxvdCcpDQpsaWJyYXJ5KGxhdmFhbikNCmxpYnJhcnkobGF2YWFuUGxvdCkNCiNsYXZhYW4gPSBMYXRlbnQgdmFyaWFibGUgYW5hbHlzaXMgKG5vIHNlIG9ic2VydmEsIHNlIGluZmllcmUpDQpgYGANCg0KIyMgSW1wb3J0YXIgYmFzZSBkZSBkYXRvcw0KDQpgYGB7cn0NCmRmMSA8LSBIb2x6aW5nZXJTd2luZWZvcmQxOTM5DQpgYGANCg0KIyMgRW50ZW5kZXIgbGEgYmFzZSBkZSBkYXRvcw0KDQpgYGB7cn0NCnN0cihkZjEpDQpgYGANCg0KYGBge3J9DQpjb2xTdW1zKGlzLm5hKGRmMSkpDQpgYGANCg0KIyMgVGlwb3MgZGUgZm9ybXVsYXMNCg0KMS4gICoqUmVncmVzacOzbioqICh+KSBWYXJpYWJsZSBxdWUgZGVwZW5kZSBkZSBvdHJhcw0KDQoyLiAgKipWYXJpYWJsZXMgbGF0ZW50ZXMqKiAoPX4pIE5vIHNlIG9ic2VydmEsIHNlIGluZmllcmUNCg0KMy4gICoqVmFyaWFuemFzIHkgY292YXJpYW56YXMqKiAofn4pIFJlbGFjaW9uZXMgZW50cmUgdmFyaWFibGVzIGxhdG5ldGVzIHkgb2JzZXJ2YWRhcyAoVmFyaWFuemEgZW50cmUgc2kgbWlzbWEsIGNvdmFyaWFuemEgZW50cmUgb3RyYXMpDQoNCjQuICAqKkludGVyY2VwdG8qKiAofjEpIFZhbG9yIGVzcGVyYWRvIGN1YW5kbyBsYXMgZGVtYXMgdmFyaWFibGVzIHNvbiBjZXJvDQoNCiMjIEVzdHJ1Y3R1cmEgTW9kZWxvIDENCg0KYGBge3J9DQptb2RlbG8xIDwtICcgIyBSZWdyZXNpb25lcw0KICAgICAgICAgICAgICMgVmFyaWFibGVzIGxhdGVudGVzDQogICAgICAgICAgICAgdmlzdWFsID1+IHgxICsgeDIgKyB4Mw0KICAgICAgICAgICAgIHRleHR1YWwgPX4geDQgKyB4NSArIHg2DQogICAgICAgICAgICAgdmVsb2NpZGFkID1+IHg3ICsgeDggKyB4OQ0KICAgICAgICAgICAgICMgVmFyaWFuemFzIHkgY292YXJpYW56YXMNCiAgICAgICAgICAgICAjIEludGVyY2VwdG8NCicNCmBgYA0KDQojIyBHZW5lcmFyIGVsIEFuw6FsaXNpcyBGYWN0b3JpYWwgQ29uZmlybWF0b3JpbyAoQ0ZBKQ0KDQpgYGB7cn0NCmZpdCA8LSBjZmEobW9kZWxvMSwgZGYxKQ0Kc3VtbWFyeShmaXQpDQpsYXZhYW5QbG90KGZpdCwgY29lZj1UUlVFLCBjb3Y9VFJVRSkNCmBgYA0KDQojIyBDb25jbHVzacOzbjoNCg0KRGVudHJvIGRlIGxvcyBncnVwb3MsIGxhIHZhcmlhYmxlIG1heW9ybWVudGUgcmVsYWNpb25hZGEgZGUgY2FkYSBncnVwbyBlczogY29udGVvIGFjZWxlcmFkbyBkZSBwdW50b3MgKHZlbG9jaWRhZCksIGNvbXBsZXRhciBvcmFjaW9uZXMgKHRleHR1YWwpLCB5IGp1ZWdvIGNvbiBwYXN0aWxsYXMgLyBlc3BhY2lhbGVzICh2aXN1YWwpLg0KDQpFbnRyZSBsb3MgZGlmZXJlbnRlcyBncnVwb3MsIGVsIHBhciBxdWUgZXN0w6EgbWF5b3JtZW50ZSByZWxhY2lvbmFkbyBlcyB2aXN1YWwgeSB0ZXh0dWFsICgwLjQxKSwgbWllbnRyYXMgcXVlIGVsIHBhciBtZW5vcm1lbnRlIHJlbGFjaW9uYWRvIGVzIHRleHR1YWwgeSB2ZWxvY2lkYWQgKDAuMTcpLg0KDQoNCiMgRWplcmNpY2lvICJEZW1vY3JhY2lhIFBvbMOtdGljYSBlIEluZHVzdHJpYWxpemFjacOzbiI6IENvbnRleHRvLCBFc3RydWN0dXJhIGRlbCBNb2RlbG8sIEFuw6FsaXNpcyBGYWN0b3JpYWwgQ29uZmlybWF0b3JpbyAoMzAgcHVudG9zLCAxMCBjL3UpDQoNCiMjIENvbnRleHRvDQoNCkxhIGJhc2UgZGUgZGF0b3MgY29udGllbmUgZGlzdGludGFzIG1lZGljaW9uZXMgc29icmUgbGEgZGVtb2NyYWNpYSBwb2zDrXRpY2EgZSBpbmR1c3RyYWxpemFjacOzbiBlbiBwYWlzZXMgZW4gZGVzYXJyb2xsbyBkdXJhbnRlIDE5NjAgeSAxOTY1DQoNCkxhIHRhYmxhIGluY2x1eWUgbG9zIHNpZ3VpZW50ZXMgZGF0b3M6DQoNCiogeTE6IENhbGlmaWNhY2lvbmVzIHNvYnJlIGxpYmVydGFkYSBkZSBwcmVuc2EgZW4gMTk2MA0KDQoqIHkyOiBMaWJlcnRhZCBkZSBsYSBvcG9zaWNpw7NuIHBvbMOtdGljYSBlbiAxOTYwDQoNCiogeTM6IEltcGFyY2lhbGlkYWQgZGUgZWxlY2Npb25lcyBlbiAxOTYwDQoNCiogeTQ6IEVmaWNhY2lhIGRlIGxhIGxlZ2lzbGF0dXJhIGVsZWN0YSBlbiAxOTYwDQoNCiogeTU6IENhbGlmaWNhY2lvbmVzIHNvYnJlIGxpYmVydGFkIGRlIHByZW5zYSBlbiAxOTY1DQoNCiogeTY6IExpYmVydGFkIGRlIGxhIG9wb3NpY2nDs24gcG9sw610aWNhIGVuIDE5NjUNCg0KKiB5NzogSW1wYXJjaWFsaWRhZCBkZSBlbGVjY2lvbmVzIGVuIDE5NjUNCg0KKiB5ODogRWZpY2FjaWEgZGUgbGEgbGVnaXNsYXR1cmEgZWxlY3RhIGVuIDE5NjUNCg0KKiB4MTogUElCIHBlciBjw6FwaXRhIGVuIDE5NjANCg0KKiB4MjogQ29uc3VtbyBkZSBlbmVyZ8OtYSBpbmFuaW1hZGEgcGVyIGPDoXBpdGEgZW4gMTk2MA0KDQoqIHgzOiBQb3JjZW50YWplIGRlIGxhIGZ1ZXJ6YSBsYWJvcmFsIGVuIGxhIGluZHVzdHJpYSBlbiAxOTYwDQoNCiMjIEltcG9ydGFyIGxhIGJhc2UgZGUgZGF0b3MNCg0KYGBge3J9DQpkZjIgPC0gUG9saXRpY2FsRGVtb2NyYWN5DQpgYGANCg0KIyMgRW50ZW5kZXIgbGEgYmFzZSBkZSBkYXRvcw0KDQpgYGB7cn0NCmNvbFN1bXMoaXMubmEoZGYyKSkNCmBgYA0KDQpgYGB7cn0NCnN0cihkZjIpDQpgYGANCg0KIyMgRXN0cnVjdHVyYSBNb2RlbG8gMg0KDQpgYGB7cn0NCm1vZGVsbzIgPC0gJyAjIFJlZ3Jlc2lvbmVzDQogICAgICAgICAgICAgIFBvbGl0aWNhMTk2NSB+IFBvbGl0aWNhMTk2MCArIEVjb25vbWlhMTk2MA0KICAgICAgICAgICAgICBQb2xpdGljYTE5NjAgfiBFY29ub21pYTE5NjANCiAgICAgICAgICAgICAjIFZhcmlhYmxlcyBsYXRlbnRlcw0KICAgICAgICAgICAgIFBvbGl0aWNhMTk2NSA9fiB5NSArIHk2ICsgeTcgKyB5OA0KICAgICAgICAgICAgIFBvbGl0aWNhMTk2MCA9fiB5MSArIHkyICsgeTMgKyB5NA0KICAgICAgICAgICAgIEVjb25vbWlhMTk2MCA9fiB4MSArIHgyICsgeDMNCiAgICAgICAgICAgICAjIFZhcmlhbnphcyB5IGNvdmFyaWFuemFzDQogICAgICAgICAgICAgIyBJbnRlcmNlcHRvDQonDQpgYGANCg0KU2UgdXRpbGl6w7MgUG9sMTk3MCB+IEVjbzE5NjAgZW4gdmV6IGRlbCBvdHJvIHBvc2libGUgb3JkZW4gZGViaWRvIGEgcXVlIGRhYmEgbWVqb3JlcyByZXN1bHRhZG9zLg0KDQojIyBHZW5lcmFyIGVsIEFuw6FsaXNpcyBGYWN0b3JpYWwgQ29uZmlybWF0b3JpbyAoQ0ZBKQ0KDQpgYGB7cn0NCmZpdF8yIDwtIGNmYShtb2RlbG8yLCBkZjIpDQpzdW1tYXJ5KGZpdF8yKQ0KbGF2YWFuUGxvdChmaXRfMiwgY29lZj1UUlVFLCBjb3Y9VFJVRSkNCmBgYA0KDQojIyBDb25jbHVzacOzbg0KDQpEZW50cm8gZGUgbG9zIGdydXBvcywgbGEgdmFyaWFibGUgbWF5b3JtZW50ZSByZWxhY2lvbmFkYSBkZSBjYWRhIGdydXBvIGVzOiBDb25zdW1vIGRlIGVuZXJnw61hIGluYW5pbWFkYSBwZXIgY8OhcGl0YSBlbiAxOTYwIChFY29ub21pYTE5NjApLCBMaWJlcnRhZCBkZSBsYSBvcG9zaWNpw7NuIHBvbMOtdGljYSBlbiAxOTYwIChQb2xpdGljYTE5NjApLCB5IEltcGFyY2lhbGlkYWQgZGUgZWxlY2Npb25lcyBlbiAxOTY1IChQb2xpdGljYTE5NjUpLg0KDQpFbnRyZSBsb3MgZGlmZXJlbnRlcyBncnVwb3MsIGVsIHBhciBxdWUgZXN0w6EgbWF5b3JtZW50ZSByZWxhY2lvbmFkbyBlcyBQb2xpdGljYTE5NjAgeSBFY29ub21pYTE5NjAgKDEuNDcpLCBtaWVudHJhcyBxdWUgZWwgcGFyIG1lbm9ybWVudGUgcmVsYWNpb25hZG8gZXMgUG9saXRpY2ExOTY1IHkgRWNvbm9taWExOTYwICgwLjQ1KS4NCg0KDQo=