1 Elaborado por:

Nicolás Martínez Ramos
Bioestadístico Oficina de Investigaciones
Psicólogo, Esp. medición y evaluación psicológica y mg. bioestadística

2 Exploración base de datos

library(readxl)
BASE <- read_excel("ACTITUDES HACIA LOS GRUPOS BALINT Y SU INFLUENCIA EN EL BIENESTAR PSICOSOCIAL(1-177).xlsx") # 5-08-2026

library(dplyr) 
library(dlookr)
library(DT)
library(janitor)


BASE <- BASE %>%
  clean_names()  # Convierte todo a snake_case automáticamente

2.1 Limpieza base

#Items 
names(BASE)[15:29] <- paste0("i4_", 1:15)
names(BASE)[30] <- "i5_1"


#recodificando los niveles de los items 
BASE[15:30] <- lapply(BASE[15:30], function(x) as.numeric(gsub("=.*", "", x)))

#creando copia de factor de los items

nuevas_vars <- lapply(BASE[15:30], as.factor)
names(nuevas_vars) <- paste0(names(BASE)[15:30], "_f")
BASE <- cbind(BASE, nuevas_vars)

#Variables sociodemográficas

##edad
BASE$edad[BASE$edad == "juan fernando camargo arenas"] <- NA #ID 130
BASE$edad2 <- as.numeric(gsub("=.*", "", BASE$edad))

##sexo
BASE$genero <- as.factor(gsub("^[A-Z]\\.\\s*", "", BASE$genero))

##profesion
BASE$profesion_unificada <- case_when(
  grepl("resident", BASE$cual_es_su_profesion, ignore.case = TRUE) ~ "Residente de medicina",
  grepl("especialista", BASE$cual_es_su_profesion, ignore.case = TRUE) ~ "Médico especialista",
  grepl("medic[ao] general|^medic[ao]$", BASE$cual_es_su_profesion, ignore.case = TRUE) ~ "Médico general",
  grepl("enfermer[ií]a$|auxiliar de enfermer", BASE$cual_es_su_profesion, ignore.case = TRUE) ~ "Auxiliar de enfermería",
  grepl("coordinadora de enfermer", BASE$cual_es_su_profesion, ignore.case = TRUE) ~ "Coordinadora de enfermería",
  grepl("enfermero", BASE$cual_es_su_profesion, ignore.case = TRUE) ~ "Enfermero(a)",
  grepl("tecnico en auxiliar", BASE$cual_es_su_profesion, ignore.case = TRUE) ~ "Técnico auxiliar de enfermería",
  grepl("administrativo", BASE$cual_es_su_profesion, ignore.case = TRUE) ~ "Administrativo",
  grepl("biolog", BASE$cual_es_su_profesion, ignore.case = TRUE) ~ "Bióloga",
  grepl("citohistotecnolog", BASE$cual_es_su_profesion, ignore.case = TRUE) ~ "Citohistotecnóloga",
  grepl("fisioterapeuta", BASE$cual_es_su_profesion, ignore.case = TRUE) ~ "Fisioterapeuta",
  grepl("ingeniero de sistemas", BASE$cual_es_su_profesion, ignore.case = TRUE) ~ "Ingeniero de sistemas",
  grepl("instrumentadora", BASE$cual_es_su_profesion, ignore.case = TRUE) ~ "Instrumentadora quirúrgica",
  grepl("qu[ií]mic[ao] far", BASE$cual_es_su_profesion, ignore.case = TRUE) ~ "Químico farmacéutico",
  grepl("^asistencial$", BASE$cual_es_su_profesion, ignore.case = TRUE) ~ "Asistencial",
  grepl("^X$", BASE$cual_es_su_profesion, ignore.case = TRUE) ~ "Desconocido",
  TRUE ~ as.character(BASE$cual_es_su_profesion)
)

BASE$profesion_unificada <- as.factor(BASE$profesion_unificada)

## especialidad
BASE$especialidad_unificada <- case_when(
  grepl("anestesiolog", BASE$cual_es_su_especialidad, ignore.case = TRUE) ~ "Anestesiología",
  grepl("^an[oó]nimo$", BASE$cual_es_su_especialidad, ignore.case = TRUE) ~ "Desconocido",
  grepl("cirugia pediatrica|cirug[ií]a pedi[aá]trica", BASE$cual_es_su_especialidad, ignore.case = TRUE) ~ "Cirugía pediátrica",
  grepl("^cirujano$", BASE$cual_es_su_especialidad, ignore.case = TRUE) ~ "Cirugía general",
  grepl("paliativ", BASE$cual_es_su_especialidad, ignore.case = TRUE) ~ "Cuidados paliativos",
  grepl("urgencia|emergencia", BASE$cual_es_su_especialidad, ignore.case = TRUE) ~ "Medicina de urgencias/emergencias",
  grepl("neonatolog", BASE$cual_es_su_especialidad, ignore.case = TRUE) ~ "Neonatología",
  grepl("neumolog.*pediatr|pediatr.*neumolog", BASE$cual_es_su_especialidad, ignore.case = TRUE) ~ "Neumología pediátrica",
  grepl("medicina.*familiar|residente de medicina familiar", BASE$cual_es_su_especialidad, ignore.case = TRUE) ~ "Medicina familiar",
  grepl("medicina interna", BASE$cual_es_su_especialidad, ignore.case = TRUE) ~ "Medicina interna",
  grepl("medicina\\s*general|medico general|médico general", BASE$cual_es_su_especialidad, ignore.case = TRUE) ~ "Medicina general",
  grepl("^general$", BASE$cual_es_su_especialidad, ignore.case = TRUE) ~ "Medicina general",
  grepl("geriatria|geriatría", BASE$cual_es_su_especialidad, ignore.case = TRUE) ~ "Geriatría",
  grepl("hematolog", BASE$cual_es_su_especialidad, ignore.case = TRUE) ~ "Hematología",
  grepl("pediatr", BASE$cual_es_su_especialidad, ignore.case = TRUE) ~ "Pediatría",
  grepl("patologia|patología|sst.*patolog", BASE$cual_es_su_especialidad, ignore.case = TRUE) ~ "Patología",
  grepl("psiquiatr", BASE$cual_es_su_especialidad, ignore.case = TRUE) ~ "Psiquiatría",
  grepl("radioterapia", BASE$cual_es_su_especialidad, ignore.case = TRUE) ~ "Radioterapia",
  grepl("radiolog", BASE$cual_es_su_especialidad, ignore.case = TRUE) ~ "Radiología",
  grepl("urologia|urología", BASE$cual_es_su_especialidad, ignore.case = TRUE) ~ "Urología",
  TRUE ~ as.character(BASE$cual_es_su_especialidad)
)
BASE$especialidad_unificada <- as.factor(BASE$especialidad_unificada)

## años ejercicio profesional
BASE$anos_de_ejercicio_profesional <- as.factor(gsub("^[A-Z]\\.\\s*", "", BASE$anos_de_ejercicio_profesional))

#cargo desempeñado
BASE$esta_desempenando_un_cargo_en_el_cual_tenga_personal_a_cargo <- as.factor(gsub("^[A-Z]\\.\\s*", "", BASE$esta_desempenando_un_cargo_en_el_cual_tenga_personal_a_cargo))

#participacio nen actividades docentes
BASE$participa_en_actividades_docentes <- as.factor(gsub("^[A-Z]\\.\\s*", "", BASE$participa_en_actividades_docentes))







library(stringr)
library(stringi)

# 1. Normalizar texto: minúsculas, sin tildes, sin espacios extra
esp <- BASE$cual_es_su_profesion %>%
  str_to_lower() %>%
  stri_trans_general("Latin-ASCII") %>%
  str_squish()

# 2. Patrones
pat_enfermeria <- "enfermer|auxiliar"
pat_medico <- paste(
  "anestes", "cirug", "paliativ", "dolor", "emergenc", "urgenc",
  "fellow", "neonat", "general", "geriatr", "hemat", "medicina",
  "medico", "pediatr", "patolog", "psiquiat", "radiol", "radioter",
  "residente", "urolog", "neumol",
  sep = "|"
)

# 3. Nueva variable (residentes y fellows quedan en médicos)
BASE$grupo_profesional <- case_when(
  str_detect(esp, pat_enfermeria) ~ "Enfermería",
  str_detect(esp, pat_medico)     ~ "Profesionales médicos",
  TRUE                            ~ "Otros"
) %>%
  factor(levels = c("Profesionales médicos", "Enfermería", "Otros"))

3 Análisis descriptivo (sin ítems)

edad se reportó como variable continua.

library(gtsummary)
tabla0 <- BASE %>%
  select(ha_participado_alguna_vez_en_un_grupo_balint_ya_sea_actualmente_o_en_el_pasado, durante_cuanto_tiempo_ha_participado_en_grupos_balint, a_durante_mis_estudios_de_pregrado, b_durante_la_residencia_medica,
c_como_especialista_subespecialista, d_durante_mis_estudios_para_subespecialista, e_como_auxiliar_de_enfermeria_enfermer, f_como_administrativo, genero, grupo_profesional, profesion_unificada, especialidad_unificada, anos_de_ejercicio_profesional, esta_desempenando_un_cargo_en_el_cual_tenga_personal_a_cargo, participa_en_actividades_docentes, edad2) %>%
  tbl_summary(
    type = list(
      all_categorical() ~ "categorical",
      edad2 ~ "continuous"
    ),
    label = list(
      ha_participado_alguna_vez_en_un_grupo_balint_ya_sea_actualmente_o_en_el_pasado ~ "Participación actual o pasada en grupo balint", 
      durante_cuanto_tiempo_ha_participado_en_grupos_balint ~ "Tiempo participación grpo balint", 
      a_durante_mis_estudios_de_pregrado ~ "Durante pregrado", 
      b_durante_la_residencia_medica ~ "Durante Residencia médica",
      c_como_especialista_subespecialista ~ "Como Especialista - subespecialista", 
      d_durante_mis_estudios_para_subespecialista ~ "Durante estudios subespecialidad", 
      e_como_auxiliar_de_enfermeria_enfermer ~ "Como auxiliar de enfermería", 
      f_como_administrativo ~ "Como administrativo", 
      genero ~ "Género", 
      grupo_profesional ~ "Grupo profesional",
      profesion_unificada ~ "Profesion", 
      especialidad_unificada ~ "Especialidad", 
      anos_de_ejercicio_profesional ~ "Años ejercicio profesional", 
      esta_desempenando_un_cargo_en_el_cual_tenga_personal_a_cargo ~ "Desempeño trabajo en que el tenga personal a cargo", 
      participa_en_actividades_docentes ~ "Partiipación act. docente",
      edad2 ~ "Edad"
    ),
    statistic = list(
      all_categorical() ~ "{n} ({p}%)",
      edad2 ~ "{mean} ({sd})"
    ),
    digits = list(
      all_categorical() ~ 1,
      edad2 ~ 1
    ),
    missing = "ifany",
    missing_text = "Sin dato"
  ) %>%
  modify_header(label ~ "**Variable**") %>%
  bold_labels() %>%
  modify_caption("**Tabla 1**")

tabla0
Tabla 1
Variable N = 1771
Participación actual o pasada en grupo balint
    Actualmente participo en un grupo Balint. 80.0 (45.2%)
    He participado en un grupo Balint en el pasado. 84.0 (47.5%)
    Nunca he participado en un grupo Balint. 13.0 (7.3%)
Tiempo participación grpo balint
    De 1 a 2 años. 49.0 (27.7%)
    De 2 a 3 años 10.0 (5.6%)
    Más de 3 años. 34.0 (19.2%)
    Menos de un año. 84.0 (47.5%)
Durante pregrado
    NO 168.0 (94.9%)
    SI 9.0 (5.1%)
Durante Residencia médica
    NO 118.0 (66.7%)
    SI 59.0 (33.3%)
Como Especialista - subespecialista
    NO 140.0 (79.1%)
    SI 37.0 (20.9%)
Durante estudios subespecialidad
    NO 173.0 (97.7%)
    SI 4.0 (2.3%)
Como auxiliar de enfermería
    NO 139.0 (78.5%)
    SI 38.0 (21.5%)
Como administrativo
    NO 132.0 (74.6%)
    SI 45.0 (25.4%)
Género
    Femenino 133.0 (75.1%)
    Masculino 44.0 (24.9%)
Grupo profesional
    Profesionales médicos 93.0 (52.5%)
    Enfermería 52.0 (29.4%)
    Otros 32.0 (18.1%)
Profesion
    Administrativo 23.0 (13.0%)
    Asistencial 1.0 (0.6%)
    Auxiliar de enfermería 8.0 (4.5%)
    Bióloga 1.0 (0.6%)
    Citohistotecnóloga 1.0 (0.6%)
    Desconocido 1.0 (0.6%)
    Enfermero(a) 44.0 (24.9%)
    Fisioterapeuta 1.0 (0.6%)
    Ingeniero de sistemas 1.0 (0.6%)
    Instrumentadora quirúrgica 1.0 (0.6%)
    Médica General 1.0 (0.6%)
    Médico especialista 37.0 (20.9%)
    Médico general 6.0 (3.4%)
    Químico farmacéutico 2.0 (1.1%)
    Residente de medicina 49.0 (27.7%)
Especialidad
    Anestesiología 5.0 (6.5%)
    Cirugía general 1.0 (1.3%)
    Cirugía pediátrica 1.0 (1.3%)
    Cuidados paliativos 7.0 (9.1%)
    Desconocido 1.0 (1.3%)
    Geriatría 2.0 (2.6%)
    Hematología 2.0 (2.6%)
    Medicina de urgencias/emergencias 9.0 (11.7%)
    Medicina familiar 9.0 (11.7%)
    Medicina general 7.0 (9.1%)
    Medicina interna 6.0 (7.8%)
    Neonatología 2.0 (2.6%)
    Neumología pediátrica 1.0 (1.3%)
    Patología 2.0 (2.6%)
    Pediatría 7.0 (9.1%)
    Psiquiatría 3.0 (3.9%)
    Radiología 5.0 (6.5%)
    Radioterapia 1.0 (1.3%)
    Urología 6.0 (7.8%)
    Sin dato 100
Años ejercicio profesional
    11-19 años 47.0 (26.6%)
    6-10 años 31.0 (17.5%)
    Hasta 5 años 57.0 (32.2%)
    Más de 20 años. 42.0 (23.7%)
Desempeño trabajo en que el tenga personal a cargo
    No 100.0 (56.5%)
    Sí 77.0 (43.5%)
Partiipación act. docente
    No 110.0 (62.1%)
    Sí 67.0 (37.9%)
Edad 37.4 (8.7)
    Sin dato 11
1 n (%); Mean (SD)

4 Gráfico Likert de respuesta

library(likert)
library(ggplot2)

library(dplyr)

BASE <- BASE %>%
  mutate(
    # i4_1 a i4_15: 1-2 = Bajo, 3-5 = Alto
    across(
      i4_1:i4_15,
      ~ factor(if_else(. <= 2, "Bajo", "Alto"), levels = c("Bajo", "Alto")),
      .names = "{.col}_cat"
    ),
    # i5_1 invertida: 1-3 = Alto, 4-5 = Bajo
    i5_1_cat = factor(if_else(i5_1 <= 3, "Alto", "Bajo"), levels = c("Bajo", "Alto"))
  )

datos_likert <- BASE %>%
  select(i4_1_cat, i4_2_cat, i4_3_cat, i4_4_cat, i4_5_cat, i4_6_cat, i4_7_cat, i4_8_cat, i4_9_cat, i4_10_cat, i4_11_cat, i4_12_cat, i4_13_cat, i4_14_cat, i4_15_cat, i5_1_cat)

names(datos_likert) <- c(
  "4.1 Relaciones con pacientes",
  "4.2 Relación apoyo colegas",
  "4.3 Mejoró relaciones equipo",
  "4.4 Resolución de problemas",
  "4.5 Disminuyó burnout",
  "4.6 Manejo de pacientes",
  "4.7 Empatía",
  "4.8 Satisfacción",
  "4.9 Autocuidado",
  "4.10 Red de apoyo",
  "4.11 Identidad profesional",
  "4.12 Discusiones aburridas",
  "4.13 Discusiones superficiales",
  "4.14 Incomodidad al compartir",
  "4.15 Orientación no profesional",
  "5.1 Importancia del Grupo Balint"
)

library(ggstats)

gglikert_stacked(datos_likert, labels_size = 6) +
  scale_fill_manual(
    values = c("indianred3",  "steelblue"),
    name = "Respuesta"
  ) +
  ggtitle("Escala Likert",
          subtitle = "Actitudes Grupo Balint") +
  theme_minimal(base_size = 13) +
  theme(
    plot.title = element_text(face = "bold", size = 25, color = "black"),
    plot.subtitle = element_text(size = 20, color = "black"),
    axis.text = element_text(color = "black", size = 20),
    axis.title = element_text(color = "black"),
    legend.text = element_text(color = "black", size = 20),
    legend.title = element_text(color = "black", size = 20, face = "bold"),
    legend.position = "bottom",
    panel.grid.major.y = element_blank(),
    plot.background = element_rect(fill = "white", color = NA)
  )

4.1 Gráfico para profesionales de medicina

BASE_MED <- BASE %>% filter(grupo_profesional == "Profesionales médicos")

datos_likert_MED <- BASE_MED %>%
  select(i4_1_cat, i4_2_cat, i4_3_cat, i4_4_cat, i4_5_cat, i4_6_cat, i4_7_cat, i4_8_cat, i4_9_cat, i4_10_cat, i4_11_cat, i4_12_cat, i4_13_cat, i4_14_cat, i4_15_cat, i5_1_cat)

names(datos_likert_MED) <- c(
  "4.1 Relaciones con pacientes",
  "4.2 Relación apoyo colegas",
  "4.3 Mejoró relaciones equipo",
  "4.4 Resolución de problemas",
  "4.5 Disminuyó burnout",
  "4.6 Manejo de pacientes",
  "4.7 Empatía",
  "4.8 Satisfacción",
  "4.9 Autocuidado",
  "4.10 Red de apoyo",
  "4.11 Identidad profesional",
  "4.12 Discusiones aburridas",
  "4.13 Discusiones superficiales",
  "4.14 Incomodidad al compartir",
  "4.15 Orientación no profesional",
  "5.1 Importancia del Grupo Balint"
)

gglikert_stacked(datos_likert_MED, labels_size = 6) +
  scale_fill_manual(
    values = c("indianred3", "steelblue"),
    name = "Respuesta"
  ) +
  ggtitle("Escala Likert",
          subtitle = "Actitudes Grupo Balint profesionales medicina (n = 93)") +
  theme_minimal(base_size = 13) +
  theme(
    plot.title = element_text(face = "bold", size = 25, color = "black"),
    plot.subtitle = element_text(size = 20, color = "black"),
    axis.text = element_text(color = "black", size = 20),
    axis.title = element_text(color = "black"),
    legend.text = element_text(color = "black", size = 20),
    legend.title = element_text(color = "black", size = 20, face = "bold"),
    legend.position = "bottom",
    panel.grid.major.y = element_blank(),
    plot.background = element_rect(fill = "white", color = NA)
  )

4.2 Gráfico profesionales de enfermería

BASE_ENF <- BASE %>% filter(grupo_profesional == "Enfermería")

datos_likert_ENF <- BASE_ENF %>%
  select(i4_1_cat, i4_2_cat, i4_3_cat, i4_4_cat, i4_5_cat, i4_6_cat, i4_7_cat, i4_8_cat, i4_9_cat, i4_10_cat, i4_11_cat, i4_12_cat, i4_13_cat, i4_14_cat, i4_15_cat, i5_1_cat)

names(datos_likert_ENF) <- c(
  "4.1 Relaciones con pacientes",
  "4.2 Relación apoyo colegas",
  "4.3 Mejoró relaciones equipo",
  "4.4 Resolución de problemas",
  "4.5 Disminuyó burnout",
  "4.6 Manejo de pacientes",
  "4.7 Empatía",
  "4.8 Satisfacción",
  "4.9 Autocuidado",
  "4.10 Red de apoyo",
  "4.11 Identidad profesional",
  "4.12 Discusiones aburridas",
  "4.13 Discusiones superficiales",
  "4.14 Incomodidad al compartir",
  "4.15 Orientación no profesional",
  "5.1 Importancia del Grupo Balint"
)

gglikert_stacked(datos_likert_ENF, labels_size = 6) +
  scale_fill_manual(
    values = c("indianred3", "steelblue"),
    name = "Respuesta"
  ) +
  ggtitle("Escala Likert",
          subtitle = "Actitudes Grupo Balint profesionales Enfermería (n = 52)") +
  theme_minimal(base_size = 13) +
  theme(
    plot.title = element_text(face = "bold", size = 25, color = "black"),
    plot.subtitle = element_text(size = 20, color = "black"),
    axis.text = element_text(color = "black", size = 20),
    axis.title = element_text(color = "black"),
    legend.text = element_text(color = "black", size = 20),
    legend.title = element_text(color = "black", size = 20, face = "bold"),
    legend.position = "bottom",
    panel.grid.major.y = element_blank(),
    plot.background = element_rect(fill = "white", color = NA)
  )

4.3 Gráfico otros

BASE_OTRO <- BASE %>% filter(grupo_profesional == "Otros")

datos_likert_OTRO <- BASE_OTRO %>%
  select(i4_1_cat, i4_2_cat, i4_3_cat, i4_4_cat, i4_5_cat, i4_6_cat, i4_7_cat, i4_8_cat, i4_9_cat, i4_10_cat, i4_11_cat, i4_12_cat, i4_13_cat, i4_14_cat, i4_15_cat, i5_1_cat)

names(datos_likert_OTRO) <- c(
  "4.1 Relaciones con pacientes",
  "4.2 Relación apoyo colegas",
  "4.3 Mejoró relaciones equipo",
  "4.4 Resolución de problemas",
  "4.5 Disminuyó burnout",
  "4.6 Manejo de pacientes",
  "4.7 Empatía",
  "4.8 Satisfacción",
  "4.9 Autocuidado",
  "4.10 Red de apoyo",
  "4.11 Identidad profesional",
  "4.12 Discusiones aburridas",
  "4.13 Discusiones superficiales",
  "4.14 Incomodidad al compartir",
  "4.15 Orientación no profesional",
  "5.1 Importancia del Grupo Balint"
)

gglikert_stacked(datos_likert_OTRO, labels_size = 6) +
  scale_fill_manual(
    values = c("indianred3", "steelblue"),
    name = "Respuesta"
  ) +
  ggtitle("Escala Likert",
          subtitle = "Actitudes Grupo Balint Otros profesionales (n = 32)") +
  theme_minimal(base_size = 13) +
  theme(
    plot.title = element_text(face = "bold", size = 25, color = "black"),
    plot.subtitle = element_text(size = 20, color = "black"),
    axis.text = element_text(color = "black", size = 20),
    axis.title = element_text(color = "black"),
    legend.text = element_text(color = "black", size = 20),
    legend.title = element_text(color = "black", size = 20, face = "bold"),
    legend.position = "bottom",
    panel.grid.major.y = element_blank(),
    plot.background = element_rect(fill = "white", color = NA)
  )

Recodificando los valores de los items aparentemente invertidos

BASE <- BASE %>%
  mutate(
    across(c(i4_12, i4_13, i4_14, i4_15), ~ 6 - .)
  )

5 Realización análisis factorial exploratorio

  • Se evalua el supuesto de la adecuacion muestral
  • Se evalua el supuesto de identidad
  • Se evalua el supuesto de relacion entre variables
library(psych)
KMO(BASE[,15:30])
## Kaiser-Meyer-Olkin factor adequacy
## Call: KMO(r = BASE[, 15:30])
## Overall MSA =  0.94
## MSA for each item = 
##  i4_1  i4_2  i4_3  i4_4  i4_5  i4_6  i4_7  i4_8  i4_9 i4_10 i4_11 i4_12 i4_13 
##  0.97  0.94  0.95  0.96  0.96  0.96  0.96  0.96  0.96  0.93  0.94  0.80  0.82 
## i4_14 i4_15  i5_1 
##  0.88  0.80  0.91
bartlett.test(BASE[,15:30])
## 
##  Bartlett test of homogeneity of variances
## 
## data:  BASE[, 15:30]
## Bartlett's K-squared = 18.759, df = 15, p-value = 0.2249
library(corrplot)
library(Hmisc)

# Correlación de Spearman
res <- rcorr(as.matrix(BASE[,15:30]), type = "spearman")
cor_matrix <- res$r

# Paleta de colores suave (rojo-blanco-azul)
mis_colores <- colorRampPalette(c("salmon", "white", "skyblue"))(200)


corrplot(cor_matrix,
         method = "color",        # celdas coloreadas (más "clásico" que círculos)
         type = "lower",          # solo mitad inferior
         addCoef.col = "black",   # muestra el número en negro dentro de cada celda
         number.cex = 1.2,        # tamaño del número
         col = mis_colores,       # paleta suave
         tl.col = "black",        # texto de las etiquetas en negro
         tl.srt = 50,             # rota las etiquetas 45°
         tl.cex = 1.5,            # tamaño de las etiquetas
         diag = FALSE,            # oculta la diagonal (correlación de cada ítem consigo mismo = 1)
         title = "Matriz de correlación de Spearman",
         mar = c(0,0,2,0))        # margen para que se vea bien el título

Cumple el supuesto de adecuación muestral, de relación entre variables pero no se cumple el supuesto de identidad (resultado no significativo en la prueba de esfericidad de bartlett)

5.1 Perfilación de sujetos a partir del resultado de actitud

  • Posiblemente se peuda descubrir una actitud alta y baja
library(mclust)
DATA_PROFILES <- BASE[, 15:30]
set.seed(2025)
mc1 <-mclustBIC(BASE[,15:30]) 
summary(mc1) # 3 grupos
## Best BIC values:
##              EEE,3      EEE,1      EEV,1
## BIC      -6842.973 -6945.5907 -6945.5907
## BIC diff     0.000  -102.6181  -102.6181
set.seed(2025)
model1 <- Mclust(BASE[,15:30], modelNames = "EEE", G = 3)
summary(model1)
## ---------------------------------------------------- 
## Gaussian finite mixture model fitted by EM algorithm 
## ---------------------------------------------------- 
## 
## Mclust EEE (ellipsoidal, equal volume, shape and orientation) model with 3
## components: 
## 
##  log-likelihood   n  df       BIC       ICL
##       -2940.104 177 186 -6842.973 -6843.214
## 
## Clustering table:
##   1   2   3 
## 123   8  46

Se revisan los intervalos de confianza

library(tibble)
library(tidyr)

means <- data.frame(model1$parameters$mean) %>%
  rownames_to_column() %>%
  rename(DATA_PROFILES = rowname) %>%
  pivot_longer(cols = c(X1, X2, X3), names_to = "Profile", values_to = "Mean") %>%
  mutate(
    Mean = round(Mean, 2),
    # Estandarización Z (normalización usando media y desviación estándar)
    Mean = (Mean - mean(Mean)) / sd(Mean)
  )

p <- means %>%
  mutate(
    Profile = case_when(
      Profile == "X1" ~ "P1 (123)",
      Profile == "X2" ~ "P2 (8)",
      Profile == "X3" ~ "P3 (46)",
      TRUE ~ Profile
    )
  ) %>%
  ggplot(aes(
    x = DATA_PROFILES,
    y = Mean,
    group = Profile,
    color = Profile
  )) +
  geom_point(size = 2.25) +
  geom_line(linewidth = 1.25) +
  scale_x_discrete(
    limits = c(
      "i4_1", "i4_2", "i4_3", "i4_4", "i4_5", "i4_6", "i4_7", "i4_8",
      "i4_9", "i4_10", "i4_11", "i4_12", "i4_13", "i4_14", "i4_15",
      "i5_1"
    )
  ) +
  scale_color_manual(
    values = c(
      "P1 (123)" = "blue2",
      "P2 (8)" = "green4",
      "P3 (46)" = "red"
    )
  ) +
  labs(
    x = "Items actitud",
    y = "Media estandarizada",
    color = "Perfil",
    title = "Perfiles Actitud grupo Balint"
  ) +
  theme_bw(base_size = 14) +
  theme(
    axis.text.x = element_text(angle = 90, hjust = 1, size = 20, face = "bold"),
    axis.text.y = element_text(size = 20, face = "bold"),
    axis.title.x = element_text(size = 22, face = "bold"),
    axis.title.y = element_text(size = 22, face = "bold"),
    legend.position = "right",
    legend.text = element_text(size = 15, face = "bold"),
    legend.title = element_text(size = 25, face = "bold")
  )

p

Se encontraron 3 potenciales perfiles, de manera general da la impesión que existe un perfil de sujetos que tienen una actitud más positiva acerca del grupo Balint, sin emabrgo no encuentran gran aporte (items 5.1). Los otros se diferencian especialmente en los ítems que parecen invertidos.

5.2 Caracterización perfiles de actitud

# Extraer las clasificaciones del modelo
clases <- model1$classification

# Agregar las clases al data frame
BASE <- BASE %>%
  mutate(Perfil = clases)

BASE$Perfil <- factor(BASE$Perfil, levels = c(1, 3, 2), labels = c ("Alto", "Medio", "Bajo"))
tabla1 <- BASE %>%
  select(
    ha_participado_alguna_vez_en_un_grupo_balint_ya_sea_actualmente_o_en_el_pasado,
    durante_cuanto_tiempo_ha_participado_en_grupos_balint, genero, grupo_profesional,   anos_de_ejercicio_profesional,esta_desempenando_un_cargo_en_el_cual_tenga_personal_a_cargo,
    participa_en_actividades_docentes, edad2, Perfil
  ) %>%
  tbl_summary(
    by = Perfil,
    type = list(
      all_categorical() ~ "categorical",
      edad2 ~ "continuous"
    ),
    label = list(
      ha_participado_alguna_vez_en_un_grupo_balint_ya_sea_actualmente_o_en_el_pasado ~ "Participación actual o pasada en grupo Balint",
      durante_cuanto_tiempo_ha_participado_en_grupos_balint ~ "Tiempo participación grupo Balint",
      genero ~ "Género",
      grupo_profesional ~ "Grupo profesional",
      anos_de_ejercicio_profesional ~ "Años ejercicio profesional",
      esta_desempenando_un_cargo_en_el_cual_tenga_personal_a_cargo ~ "Desempeña cargo con personal a cargo",
      participa_en_actividades_docentes ~ "Participación act. docente",
      edad2 ~ "Edad"
    ),
    statistic = list(
      all_categorical() ~ "{n} ({p}%)",
      edad2 ~ "{mean} ({sd})"
    ),
    digits = list(
      all_categorical() ~ 1,
      edad2 ~ 1
    ),
    missing = "ifany",
    missing_text = "Sin dato"
  ) %>%
  add_overall(last = TRUE, col_label = "**Total**, N = {N}") %>%
  modify_header(label ~ "**Variable**") %>%
  modify_spanning_header(all_stat_cols() ~ "**Perfil**") %>%
  bold_labels() %>%
  modify_caption("**Tabla 1**")

tabla1
Tabla 1
Variable
Perfil
Alto
N = 123
1
Medio
N = 46
1
Bajo
N = 8
1
Total, N = 1771
Participación actual o pasada en grupo Balint



    Actualmente participo en un grupo Balint. 64.0 (52.0%) 14.0 (30.4%) 2.0 (25.0%) 80.0 (45.2%)
    He participado en un grupo Balint en el pasado. 53.0 (43.1%) 25.0 (54.3%) 6.0 (75.0%) 84.0 (47.5%)
    Nunca he participado en un grupo Balint. 6.0 (4.9%) 7.0 (15.2%) 0.0 (0.0%) 13.0 (7.3%)
Tiempo participación grupo Balint



    De 1 a 2 años. 36.0 (29.3%) 11.0 (23.9%) 2.0 (25.0%) 49.0 (27.7%)
    De 2 a 3 años 7.0 (5.7%) 2.0 (4.3%) 1.0 (12.5%) 10.0 (5.6%)
    Más de 3 años. 26.0 (21.1%) 8.0 (17.4%) 0.0 (0.0%) 34.0 (19.2%)
    Menos de un año. 54.0 (43.9%) 25.0 (54.3%) 5.0 (62.5%) 84.0 (47.5%)
Género



    Femenino 93.0 (75.6%) 33.0 (71.7%) 7.0 (87.5%) 133.0 (75.1%)
    Masculino 30.0 (24.4%) 13.0 (28.3%) 1.0 (12.5%) 44.0 (24.9%)
Grupo profesional



    Profesionales médicos 69.0 (56.1%) 19.0 (41.3%) 5.0 (62.5%) 93.0 (52.5%)
    Enfermería 33.0 (26.8%) 17.0 (37.0%) 2.0 (25.0%) 52.0 (29.4%)
    Otros 21.0 (17.1%) 10.0 (21.7%) 1.0 (12.5%) 32.0 (18.1%)
Años ejercicio profesional



    11-19 años 35.0 (28.5%) 10.0 (21.7%) 2.0 (25.0%) 47.0 (26.6%)
    6-10 años 17.0 (13.8%) 12.0 (26.1%) 2.0 (25.0%) 31.0 (17.5%)
    Hasta 5 años 44.0 (35.8%) 11.0 (23.9%) 2.0 (25.0%) 57.0 (32.2%)
    Más de 20 años. 27.0 (22.0%) 13.0 (28.3%) 2.0 (25.0%) 42.0 (23.7%)
Desempeña cargo con personal a cargo



    No 67.0 (54.5%) 27.0 (58.7%) 6.0 (75.0%) 100.0 (56.5%)
    Sí 56.0 (45.5%) 19.0 (41.3%) 2.0 (25.0%) 77.0 (43.5%)
Participación act. docente



    No 75.0 (61.0%) 31.0 (67.4%) 4.0 (50.0%) 110.0 (62.1%)
    Sí 48.0 (39.0%) 15.0 (32.6%) 4.0 (50.0%) 67.0 (37.9%)
Edad 37.1 (9.1) 38.2 (7.9) 38.0 (8.5) 37.4 (8.7)
    Sin dato 7 4 0 11
1 n (%); Mean (SD)

````

LS0tDQp0aXRsZTogIkFjdGl0dWQgYmFsaW50Ig0Kb3V0cHV0Og0KICBodG1sX2RvY3VtZW50Og0KICAgIHRoZW1lOiBqb3VybmFsDQogICAgaGlnaGxpZ2h0OiB0YW5nbw0KICAgIHRvYzogdHJ1ZQ0KICAgIHRvY19kZXB0aDogMw0KICAgIHRvY19mbG9hdDoNCiAgICAgIGNvbGxhcHNlZDogZmFsc2UNCiAgICBudW1iZXJfc2VjdGlvbnM6IHRydWUNCiAgICBjb2RlX2ZvbGRpbmc6IGhpZGUNCiAgICBjb2RlX2Rvd25sb2FkOiB0cnVlDQogICAgc2VsZl9jb250YWluZWQ6IHRydWUNCiAgICBkZl9wcmludDogcGFnZWQNCi0tLQ0KDQpgYGB7ciBzZXR1cCwgaW5jbHVkZT1GQUxTRX0NCmtuaXRyOjpvcHRzX2NodW5rJHNldCh3YXJuaW5nID0gRkFMU0UsIG1lc3NhZ2UgPSBGQUxTRSkNCmBgYA0KDQojIyBFbGFib3JhZG8gcG9yOg0KDQp8ICpOaWNvbMOhcyBNYXJ0w61uZXogUmFtb3MqIHwNCnwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18DQp8ICoqKkJpb2VzdGFkw61zdGljbyBPZmljaW5hIGRlIEludmVzdGlnYWNpb25lcyoqKiB8DQp8ICoqKlBzaWPDs2xvZ28sIEVzcC4gbWVkaWNpw7NuIHkgZXZhbHVhY2nDs24gcHNpY29sw7NnaWNhIHkgbWcuIGJpb2VzdGFkw61zdGljYSoqKiB8DQoNCmBgYHtyfQ0KYGBgDQoNCiMjIEV4cGxvcmFjacOzbiBiYXNlIGRlIGRhdG9zDQoNCmBgYHtyfQ0KbGlicmFyeShyZWFkeGwpDQpCQVNFIDwtIHJlYWRfZXhjZWwoIkFDVElUVURFUyBIQUNJQSBMT1MgR1JVUE9TIEJBTElOVCBZIFNVIElORkxVRU5DSUEgRU4gRUwgQklFTkVTVEFSIFBTSUNPU09DSUFMKDEtMTc3KS54bHN4IikgIyA1LTA4LTIwMjYNCg0KbGlicmFyeShkcGx5cikgDQpsaWJyYXJ5KGRsb29rcikNCmxpYnJhcnkoRFQpDQpsaWJyYXJ5KGphbml0b3IpDQoNCg0KQkFTRSA8LSBCQVNFICU+JQ0KICBjbGVhbl9uYW1lcygpICAjIENvbnZpZXJ0ZSB0b2RvIGEgc25ha2VfY2FzZSBhdXRvbcOhdGljYW1lbnRlDQpgYGANCg0KIyMjIExpbXBpZXphIGJhc2UNCg0KYGBge3J9DQojSXRlbXMgDQpuYW1lcyhCQVNFKVsxNToyOV0gPC0gcGFzdGUwKCJpNF8iLCAxOjE1KQ0KbmFtZXMoQkFTRSlbMzBdIDwtICJpNV8xIg0KDQoNCiNyZWNvZGlmaWNhbmRvIGxvcyBuaXZlbGVzIGRlIGxvcyBpdGVtcyANCkJBU0VbMTU6MzBdIDwtIGxhcHBseShCQVNFWzE1OjMwXSwgZnVuY3Rpb24oeCkgYXMubnVtZXJpYyhnc3ViKCI9LioiLCAiIiwgeCkpKQ0KDQojY3JlYW5kbyBjb3BpYSBkZSBmYWN0b3IgZGUgbG9zIGl0ZW1zDQoNCm51ZXZhc192YXJzIDwtIGxhcHBseShCQVNFWzE1OjMwXSwgYXMuZmFjdG9yKQ0KbmFtZXMobnVldmFzX3ZhcnMpIDwtIHBhc3RlMChuYW1lcyhCQVNFKVsxNTozMF0sICJfZiIpDQpCQVNFIDwtIGNiaW5kKEJBU0UsIG51ZXZhc192YXJzKQ0KDQojVmFyaWFibGVzIHNvY2lvZGVtb2dyw6FmaWNhcw0KDQojI2VkYWQNCkJBU0UkZWRhZFtCQVNFJGVkYWQgPT0gImp1YW4gZmVybmFuZG8gY2FtYXJnbyBhcmVuYXMiXSA8LSBOQSAjSUQgMTMwDQpCQVNFJGVkYWQyIDwtIGFzLm51bWVyaWMoZ3N1YigiPS4qIiwgIiIsIEJBU0UkZWRhZCkpDQoNCiMjc2V4bw0KQkFTRSRnZW5lcm8gPC0gYXMuZmFjdG9yKGdzdWIoIl5bQS1aXVxcLlxccyoiLCAiIiwgQkFTRSRnZW5lcm8pKQ0KDQojI3Byb2Zlc2lvbg0KQkFTRSRwcm9mZXNpb25fdW5pZmljYWRhIDwtIGNhc2Vfd2hlbigNCiAgZ3JlcGwoInJlc2lkZW50IiwgQkFTRSRjdWFsX2VzX3N1X3Byb2Zlc2lvbiwgaWdub3JlLmNhc2UgPSBUUlVFKSB+ICJSZXNpZGVudGUgZGUgbWVkaWNpbmEiLA0KICBncmVwbCgiZXNwZWNpYWxpc3RhIiwgQkFTRSRjdWFsX2VzX3N1X3Byb2Zlc2lvbiwgaWdub3JlLmNhc2UgPSBUUlVFKSB+ICJNw6lkaWNvIGVzcGVjaWFsaXN0YSIsDQogIGdyZXBsKCJtZWRpY1thb10gZ2VuZXJhbHxebWVkaWNbYW9dJCIsIEJBU0UkY3VhbF9lc19zdV9wcm9mZXNpb24sIGlnbm9yZS5jYXNlID0gVFJVRSkgfiAiTcOpZGljbyBnZW5lcmFsIiwNCiAgZ3JlcGwoImVuZmVybWVyW2nDrV1hJHxhdXhpbGlhciBkZSBlbmZlcm1lciIsIEJBU0UkY3VhbF9lc19zdV9wcm9mZXNpb24sIGlnbm9yZS5jYXNlID0gVFJVRSkgfiAiQXV4aWxpYXIgZGUgZW5mZXJtZXLDrWEiLA0KICBncmVwbCgiY29vcmRpbmFkb3JhIGRlIGVuZmVybWVyIiwgQkFTRSRjdWFsX2VzX3N1X3Byb2Zlc2lvbiwgaWdub3JlLmNhc2UgPSBUUlVFKSB+ICJDb29yZGluYWRvcmEgZGUgZW5mZXJtZXLDrWEiLA0KICBncmVwbCgiZW5mZXJtZXJvIiwgQkFTRSRjdWFsX2VzX3N1X3Byb2Zlc2lvbiwgaWdub3JlLmNhc2UgPSBUUlVFKSB+ICJFbmZlcm1lcm8oYSkiLA0KICBncmVwbCgidGVjbmljbyBlbiBhdXhpbGlhciIsIEJBU0UkY3VhbF9lc19zdV9wcm9mZXNpb24sIGlnbm9yZS5jYXNlID0gVFJVRSkgfiAiVMOpY25pY28gYXV4aWxpYXIgZGUgZW5mZXJtZXLDrWEiLA0KICBncmVwbCgiYWRtaW5pc3RyYXRpdm8iLCBCQVNFJGN1YWxfZXNfc3VfcHJvZmVzaW9uLCBpZ25vcmUuY2FzZSA9IFRSVUUpIH4gIkFkbWluaXN0cmF0aXZvIiwNCiAgZ3JlcGwoImJpb2xvZyIsIEJBU0UkY3VhbF9lc19zdV9wcm9mZXNpb24sIGlnbm9yZS5jYXNlID0gVFJVRSkgfiAiQmnDs2xvZ2EiLA0KICBncmVwbCgiY2l0b2hpc3RvdGVjbm9sb2ciLCBCQVNFJGN1YWxfZXNfc3VfcHJvZmVzaW9uLCBpZ25vcmUuY2FzZSA9IFRSVUUpIH4gIkNpdG9oaXN0b3RlY27Ds2xvZ2EiLA0KICBncmVwbCgiZmlzaW90ZXJhcGV1dGEiLCBCQVNFJGN1YWxfZXNfc3VfcHJvZmVzaW9uLCBpZ25vcmUuY2FzZSA9IFRSVUUpIH4gIkZpc2lvdGVyYXBldXRhIiwNCiAgZ3JlcGwoImluZ2VuaWVybyBkZSBzaXN0ZW1hcyIsIEJBU0UkY3VhbF9lc19zdV9wcm9mZXNpb24sIGlnbm9yZS5jYXNlID0gVFJVRSkgfiAiSW5nZW5pZXJvIGRlIHNpc3RlbWFzIiwNCiAgZ3JlcGwoImluc3RydW1lbnRhZG9yYSIsIEJBU0UkY3VhbF9lc19zdV9wcm9mZXNpb24sIGlnbm9yZS5jYXNlID0gVFJVRSkgfiAiSW5zdHJ1bWVudGFkb3JhIHF1aXLDunJnaWNhIiwNCiAgZ3JlcGwoInF1W2nDrV1taWNbYW9dIGZhciIsIEJBU0UkY3VhbF9lc19zdV9wcm9mZXNpb24sIGlnbm9yZS5jYXNlID0gVFJVRSkgfiAiUXXDrW1pY28gZmFybWFjw6l1dGljbyIsDQogIGdyZXBsKCJeYXNpc3RlbmNpYWwkIiwgQkFTRSRjdWFsX2VzX3N1X3Byb2Zlc2lvbiwgaWdub3JlLmNhc2UgPSBUUlVFKSB+ICJBc2lzdGVuY2lhbCIsDQogIGdyZXBsKCJeWCQiLCBCQVNFJGN1YWxfZXNfc3VfcHJvZmVzaW9uLCBpZ25vcmUuY2FzZSA9IFRSVUUpIH4gIkRlc2Nvbm9jaWRvIiwNCiAgVFJVRSB+IGFzLmNoYXJhY3RlcihCQVNFJGN1YWxfZXNfc3VfcHJvZmVzaW9uKQ0KKQ0KDQpCQVNFJHByb2Zlc2lvbl91bmlmaWNhZGEgPC0gYXMuZmFjdG9yKEJBU0UkcHJvZmVzaW9uX3VuaWZpY2FkYSkNCg0KIyMgZXNwZWNpYWxpZGFkDQpCQVNFJGVzcGVjaWFsaWRhZF91bmlmaWNhZGEgPC0gY2FzZV93aGVuKA0KICBncmVwbCgiYW5lc3Rlc2lvbG9nIiwgQkFTRSRjdWFsX2VzX3N1X2VzcGVjaWFsaWRhZCwgaWdub3JlLmNhc2UgPSBUUlVFKSB+ICJBbmVzdGVzaW9sb2fDrWEiLA0KICBncmVwbCgiXmFuW2/Ds11uaW1vJCIsIEJBU0UkY3VhbF9lc19zdV9lc3BlY2lhbGlkYWQsIGlnbm9yZS5jYXNlID0gVFJVRSkgfiAiRGVzY29ub2NpZG8iLA0KICBncmVwbCgiY2lydWdpYSBwZWRpYXRyaWNhfGNpcnVnW2nDrV1hIHBlZGlbYcOhXXRyaWNhIiwgQkFTRSRjdWFsX2VzX3N1X2VzcGVjaWFsaWRhZCwgaWdub3JlLmNhc2UgPSBUUlVFKSB+ICJDaXJ1Z8OtYSBwZWRpw6F0cmljYSIsDQogIGdyZXBsKCJeY2lydWphbm8kIiwgQkFTRSRjdWFsX2VzX3N1X2VzcGVjaWFsaWRhZCwgaWdub3JlLmNhc2UgPSBUUlVFKSB+ICJDaXJ1Z8OtYSBnZW5lcmFsIiwNCiAgZ3JlcGwoInBhbGlhdGl2IiwgQkFTRSRjdWFsX2VzX3N1X2VzcGVjaWFsaWRhZCwgaWdub3JlLmNhc2UgPSBUUlVFKSB+ICJDdWlkYWRvcyBwYWxpYXRpdm9zIiwNCiAgZ3JlcGwoInVyZ2VuY2lhfGVtZXJnZW5jaWEiLCBCQVNFJGN1YWxfZXNfc3VfZXNwZWNpYWxpZGFkLCBpZ25vcmUuY2FzZSA9IFRSVUUpIH4gIk1lZGljaW5hIGRlIHVyZ2VuY2lhcy9lbWVyZ2VuY2lhcyIsDQogIGdyZXBsKCJuZW9uYXRvbG9nIiwgQkFTRSRjdWFsX2VzX3N1X2VzcGVjaWFsaWRhZCwgaWdub3JlLmNhc2UgPSBUUlVFKSB+ICJOZW9uYXRvbG9nw61hIiwNCiAgZ3JlcGwoIm5ldW1vbG9nLipwZWRpYXRyfHBlZGlhdHIuKm5ldW1vbG9nIiwgQkFTRSRjdWFsX2VzX3N1X2VzcGVjaWFsaWRhZCwgaWdub3JlLmNhc2UgPSBUUlVFKSB+ICJOZXVtb2xvZ8OtYSBwZWRpw6F0cmljYSIsDQogIGdyZXBsKCJtZWRpY2luYS4qZmFtaWxpYXJ8cmVzaWRlbnRlIGRlIG1lZGljaW5hIGZhbWlsaWFyIiwgQkFTRSRjdWFsX2VzX3N1X2VzcGVjaWFsaWRhZCwgaWdub3JlLmNhc2UgPSBUUlVFKSB+ICJNZWRpY2luYSBmYW1pbGlhciIsDQogIGdyZXBsKCJtZWRpY2luYSBpbnRlcm5hIiwgQkFTRSRjdWFsX2VzX3N1X2VzcGVjaWFsaWRhZCwgaWdub3JlLmNhc2UgPSBUUlVFKSB+ICJNZWRpY2luYSBpbnRlcm5hIiwNCiAgZ3JlcGwoIm1lZGljaW5hXFxzKmdlbmVyYWx8bWVkaWNvIGdlbmVyYWx8bcOpZGljbyBnZW5lcmFsIiwgQkFTRSRjdWFsX2VzX3N1X2VzcGVjaWFsaWRhZCwgaWdub3JlLmNhc2UgPSBUUlVFKSB+ICJNZWRpY2luYSBnZW5lcmFsIiwNCiAgZ3JlcGwoIl5nZW5lcmFsJCIsIEJBU0UkY3VhbF9lc19zdV9lc3BlY2lhbGlkYWQsIGlnbm9yZS5jYXNlID0gVFJVRSkgfiAiTWVkaWNpbmEgZ2VuZXJhbCIsDQogIGdyZXBsKCJnZXJpYXRyaWF8Z2VyaWF0csOtYSIsIEJBU0UkY3VhbF9lc19zdV9lc3BlY2lhbGlkYWQsIGlnbm9yZS5jYXNlID0gVFJVRSkgfiAiR2VyaWF0csOtYSIsDQogIGdyZXBsKCJoZW1hdG9sb2ciLCBCQVNFJGN1YWxfZXNfc3VfZXNwZWNpYWxpZGFkLCBpZ25vcmUuY2FzZSA9IFRSVUUpIH4gIkhlbWF0b2xvZ8OtYSIsDQogIGdyZXBsKCJwZWRpYXRyIiwgQkFTRSRjdWFsX2VzX3N1X2VzcGVjaWFsaWRhZCwgaWdub3JlLmNhc2UgPSBUUlVFKSB+ICJQZWRpYXRyw61hIiwNCiAgZ3JlcGwoInBhdG9sb2dpYXxwYXRvbG9nw61hfHNzdC4qcGF0b2xvZyIsIEJBU0UkY3VhbF9lc19zdV9lc3BlY2lhbGlkYWQsIGlnbm9yZS5jYXNlID0gVFJVRSkgfiAiUGF0b2xvZ8OtYSIsDQogIGdyZXBsKCJwc2lxdWlhdHIiLCBCQVNFJGN1YWxfZXNfc3VfZXNwZWNpYWxpZGFkLCBpZ25vcmUuY2FzZSA9IFRSVUUpIH4gIlBzaXF1aWF0csOtYSIsDQogIGdyZXBsKCJyYWRpb3RlcmFwaWEiLCBCQVNFJGN1YWxfZXNfc3VfZXNwZWNpYWxpZGFkLCBpZ25vcmUuY2FzZSA9IFRSVUUpIH4gIlJhZGlvdGVyYXBpYSIsDQogIGdyZXBsKCJyYWRpb2xvZyIsIEJBU0UkY3VhbF9lc19zdV9lc3BlY2lhbGlkYWQsIGlnbm9yZS5jYXNlID0gVFJVRSkgfiAiUmFkaW9sb2fDrWEiLA0KICBncmVwbCgidXJvbG9naWF8dXJvbG9nw61hIiwgQkFTRSRjdWFsX2VzX3N1X2VzcGVjaWFsaWRhZCwgaWdub3JlLmNhc2UgPSBUUlVFKSB+ICJVcm9sb2fDrWEiLA0KICBUUlVFIH4gYXMuY2hhcmFjdGVyKEJBU0UkY3VhbF9lc19zdV9lc3BlY2lhbGlkYWQpDQopDQpCQVNFJGVzcGVjaWFsaWRhZF91bmlmaWNhZGEgPC0gYXMuZmFjdG9yKEJBU0UkZXNwZWNpYWxpZGFkX3VuaWZpY2FkYSkNCg0KIyMgYcOxb3MgZWplcmNpY2lvIHByb2Zlc2lvbmFsDQpCQVNFJGFub3NfZGVfZWplcmNpY2lvX3Byb2Zlc2lvbmFsIDwtIGFzLmZhY3Rvcihnc3ViKCJeW0EtWl1cXC5cXHMqIiwgIiIsIEJBU0UkYW5vc19kZV9lamVyY2ljaW9fcHJvZmVzaW9uYWwpKQ0KDQojY2FyZ28gZGVzZW1wZcOxYWRvDQpCQVNFJGVzdGFfZGVzZW1wZW5hbmRvX3VuX2NhcmdvX2VuX2VsX2N1YWxfdGVuZ2FfcGVyc29uYWxfYV9jYXJnbyA8LSBhcy5mYWN0b3IoZ3N1YigiXltBLVpdXFwuXFxzKiIsICIiLCBCQVNFJGVzdGFfZGVzZW1wZW5hbmRvX3VuX2NhcmdvX2VuX2VsX2N1YWxfdGVuZ2FfcGVyc29uYWxfYV9jYXJnbykpDQoNCiNwYXJ0aWNpcGFjaW8gbmVuIGFjdGl2aWRhZGVzIGRvY2VudGVzDQpCQVNFJHBhcnRpY2lwYV9lbl9hY3RpdmlkYWRlc19kb2NlbnRlcyA8LSBhcy5mYWN0b3IoZ3N1YigiXltBLVpdXFwuXFxzKiIsICIiLCBCQVNFJHBhcnRpY2lwYV9lbl9hY3RpdmlkYWRlc19kb2NlbnRlcykpDQoNCg0KDQoNCg0KDQoNCmxpYnJhcnkoc3RyaW5ncikNCmxpYnJhcnkoc3RyaW5naSkNCg0KIyAxLiBOb3JtYWxpemFyIHRleHRvOiBtaW7DunNjdWxhcywgc2luIHRpbGRlcywgc2luIGVzcGFjaW9zIGV4dHJhDQplc3AgPC0gQkFTRSRjdWFsX2VzX3N1X3Byb2Zlc2lvbiAlPiUNCiAgc3RyX3RvX2xvd2VyKCkgJT4lDQogIHN0cmlfdHJhbnNfZ2VuZXJhbCgiTGF0aW4tQVNDSUkiKSAlPiUNCiAgc3RyX3NxdWlzaCgpDQoNCiMgMi4gUGF0cm9uZXMNCnBhdF9lbmZlcm1lcmlhIDwtICJlbmZlcm1lcnxhdXhpbGlhciINCnBhdF9tZWRpY28gPC0gcGFzdGUoDQogICJhbmVzdGVzIiwgImNpcnVnIiwgInBhbGlhdGl2IiwgImRvbG9yIiwgImVtZXJnZW5jIiwgInVyZ2VuYyIsDQogICJmZWxsb3ciLCAibmVvbmF0IiwgImdlbmVyYWwiLCAiZ2VyaWF0ciIsICJoZW1hdCIsICJtZWRpY2luYSIsDQogICJtZWRpY28iLCAicGVkaWF0ciIsICJwYXRvbG9nIiwgInBzaXF1aWF0IiwgInJhZGlvbCIsICJyYWRpb3RlciIsDQogICJyZXNpZGVudGUiLCAidXJvbG9nIiwgIm5ldW1vbCIsDQogIHNlcCA9ICJ8Ig0KKQ0KDQojIDMuIE51ZXZhIHZhcmlhYmxlIChyZXNpZGVudGVzIHkgZmVsbG93cyBxdWVkYW4gZW4gbcOpZGljb3MpDQpCQVNFJGdydXBvX3Byb2Zlc2lvbmFsIDwtIGNhc2Vfd2hlbigNCiAgc3RyX2RldGVjdChlc3AsIHBhdF9lbmZlcm1lcmlhKSB+ICJFbmZlcm1lcsOtYSIsDQogIHN0cl9kZXRlY3QoZXNwLCBwYXRfbWVkaWNvKSAgICAgfiAiUHJvZmVzaW9uYWxlcyBtw6lkaWNvcyIsDQogIFRSVUUgICAgICAgICAgICAgICAgICAgICAgICAgICAgfiAiT3Ryb3MiDQopICU+JQ0KICBmYWN0b3IobGV2ZWxzID0gYygiUHJvZmVzaW9uYWxlcyBtw6lkaWNvcyIsICJFbmZlcm1lcsOtYSIsICJPdHJvcyIpKQ0KDQoNCg0KYGBgDQoNCiMjIEFuw6FsaXNpcyBkZXNjcmlwdGl2byAoc2luIMOtdGVtcykNCg0KZWRhZCBzZSByZXBvcnTDsyBjb21vIHZhcmlhYmxlIGNvbnRpbnVhLg0KDQpgYGB7cn0NCmxpYnJhcnkoZ3RzdW1tYXJ5KQ0KdGFibGEwIDwtIEJBU0UgJT4lDQogIHNlbGVjdChoYV9wYXJ0aWNpcGFkb19hbGd1bmFfdmV6X2VuX3VuX2dydXBvX2JhbGludF95YV9zZWFfYWN0dWFsbWVudGVfb19lbl9lbF9wYXNhZG8sIGR1cmFudGVfY3VhbnRvX3RpZW1wb19oYV9wYXJ0aWNpcGFkb19lbl9ncnVwb3NfYmFsaW50LCBhX2R1cmFudGVfbWlzX2VzdHVkaW9zX2RlX3ByZWdyYWRvLCBiX2R1cmFudGVfbGFfcmVzaWRlbmNpYV9tZWRpY2EsDQpjX2NvbW9fZXNwZWNpYWxpc3RhX3N1YmVzcGVjaWFsaXN0YSwgZF9kdXJhbnRlX21pc19lc3R1ZGlvc19wYXJhX3N1YmVzcGVjaWFsaXN0YSwgZV9jb21vX2F1eGlsaWFyX2RlX2VuZmVybWVyaWFfZW5mZXJtZXIsIGZfY29tb19hZG1pbmlzdHJhdGl2bywgZ2VuZXJvLCBncnVwb19wcm9mZXNpb25hbCwgcHJvZmVzaW9uX3VuaWZpY2FkYSwgZXNwZWNpYWxpZGFkX3VuaWZpY2FkYSwgYW5vc19kZV9lamVyY2ljaW9fcHJvZmVzaW9uYWwsIGVzdGFfZGVzZW1wZW5hbmRvX3VuX2NhcmdvX2VuX2VsX2N1YWxfdGVuZ2FfcGVyc29uYWxfYV9jYXJnbywgcGFydGljaXBhX2VuX2FjdGl2aWRhZGVzX2RvY2VudGVzLCBlZGFkMikgJT4lDQogIHRibF9zdW1tYXJ5KA0KICAgIHR5cGUgPSBsaXN0KA0KICAgICAgYWxsX2NhdGVnb3JpY2FsKCkgfiAiY2F0ZWdvcmljYWwiLA0KICAgICAgZWRhZDIgfiAiY29udGludW91cyINCiAgICApLA0KICAgIGxhYmVsID0gbGlzdCgNCiAgICAgIGhhX3BhcnRpY2lwYWRvX2FsZ3VuYV92ZXpfZW5fdW5fZ3J1cG9fYmFsaW50X3lhX3NlYV9hY3R1YWxtZW50ZV9vX2VuX2VsX3Bhc2FkbyB+ICJQYXJ0aWNpcGFjacOzbiBhY3R1YWwgbyBwYXNhZGEgZW4gZ3J1cG8gYmFsaW50IiwgDQogICAgICBkdXJhbnRlX2N1YW50b190aWVtcG9faGFfcGFydGljaXBhZG9fZW5fZ3J1cG9zX2JhbGludCB+ICJUaWVtcG8gcGFydGljaXBhY2nDs24gZ3JwbyBiYWxpbnQiLCANCiAgICAgIGFfZHVyYW50ZV9taXNfZXN0dWRpb3NfZGVfcHJlZ3JhZG8gfiAiRHVyYW50ZSBwcmVncmFkbyIsIA0KICAgICAgYl9kdXJhbnRlX2xhX3Jlc2lkZW5jaWFfbWVkaWNhIH4gIkR1cmFudGUgUmVzaWRlbmNpYSBtw6lkaWNhIiwNCiAgICAgIGNfY29tb19lc3BlY2lhbGlzdGFfc3ViZXNwZWNpYWxpc3RhIH4gIkNvbW8gRXNwZWNpYWxpc3RhIC0gc3ViZXNwZWNpYWxpc3RhIiwgDQogICAgICBkX2R1cmFudGVfbWlzX2VzdHVkaW9zX3BhcmFfc3ViZXNwZWNpYWxpc3RhIH4gIkR1cmFudGUgZXN0dWRpb3Mgc3ViZXNwZWNpYWxpZGFkIiwgDQogICAgICBlX2NvbW9fYXV4aWxpYXJfZGVfZW5mZXJtZXJpYV9lbmZlcm1lciB+ICJDb21vIGF1eGlsaWFyIGRlIGVuZmVybWVyw61hIiwgDQogICAgICBmX2NvbW9fYWRtaW5pc3RyYXRpdm8gfiAiQ29tbyBhZG1pbmlzdHJhdGl2byIsIA0KICAgICAgZ2VuZXJvIH4gIkfDqW5lcm8iLCANCiAgICAgIGdydXBvX3Byb2Zlc2lvbmFsIH4gIkdydXBvIHByb2Zlc2lvbmFsIiwNCiAgICAgIHByb2Zlc2lvbl91bmlmaWNhZGEgfiAiUHJvZmVzaW9uIiwgDQogICAgICBlc3BlY2lhbGlkYWRfdW5pZmljYWRhIH4gIkVzcGVjaWFsaWRhZCIsIA0KICAgICAgYW5vc19kZV9lamVyY2ljaW9fcHJvZmVzaW9uYWwgfiAiQcOxb3MgZWplcmNpY2lvIHByb2Zlc2lvbmFsIiwgDQogICAgICBlc3RhX2Rlc2VtcGVuYW5kb191bl9jYXJnb19lbl9lbF9jdWFsX3RlbmdhX3BlcnNvbmFsX2FfY2FyZ28gfiAiRGVzZW1wZcOxbyB0cmFiYWpvIGVuIHF1ZSBlbCB0ZW5nYSBwZXJzb25hbCBhIGNhcmdvIiwgDQogICAgICBwYXJ0aWNpcGFfZW5fYWN0aXZpZGFkZXNfZG9jZW50ZXMgfiAiUGFydGlpcGFjacOzbiBhY3QuIGRvY2VudGUiLA0KICAgICAgZWRhZDIgfiAiRWRhZCINCiAgICApLA0KICAgIHN0YXRpc3RpYyA9IGxpc3QoDQogICAgICBhbGxfY2F0ZWdvcmljYWwoKSB+ICJ7bn0gKHtwfSUpIiwNCiAgICAgIGVkYWQyIH4gInttZWFufSAoe3NkfSkiDQogICAgKSwNCiAgICBkaWdpdHMgPSBsaXN0KA0KICAgICAgYWxsX2NhdGVnb3JpY2FsKCkgfiAxLA0KICAgICAgZWRhZDIgfiAxDQogICAgKSwNCiAgICBtaXNzaW5nID0gImlmYW55IiwNCiAgICBtaXNzaW5nX3RleHQgPSAiU2luIGRhdG8iDQogICkgJT4lDQogIG1vZGlmeV9oZWFkZXIobGFiZWwgfiAiKipWYXJpYWJsZSoqIikgJT4lDQogIGJvbGRfbGFiZWxzKCkgJT4lDQogIG1vZGlmeV9jYXB0aW9uKCIqKlRhYmxhIDEqKiIpDQoNCnRhYmxhMA0KDQoNCg0KYGBgDQoNCiMjIEdyw6FmaWNvIExpa2VydCBkZSByZXNwdWVzdGENCg0KYGBge3J9DQpsaWJyYXJ5KGxpa2VydCkNCmxpYnJhcnkoZ2dwbG90MikNCg0KbGlicmFyeShkcGx5cikNCg0KQkFTRSA8LSBCQVNFICU+JQ0KICBtdXRhdGUoDQogICAgIyBpNF8xIGEgaTRfMTU6IDEtMiA9IEJham8sIDMtNSA9IEFsdG8NCiAgICBhY3Jvc3MoDQogICAgICBpNF8xOmk0XzE1LA0KICAgICAgfiBmYWN0b3IoaWZfZWxzZSguIDw9IDIsICJCYWpvIiwgIkFsdG8iKSwgbGV2ZWxzID0gYygiQmFqbyIsICJBbHRvIikpLA0KICAgICAgLm5hbWVzID0gInsuY29sfV9jYXQiDQogICAgKSwNCiAgICAjIGk1XzEgaW52ZXJ0aWRhOiAxLTMgPSBBbHRvLCA0LTUgPSBCYWpvDQogICAgaTVfMV9jYXQgPSBmYWN0b3IoaWZfZWxzZShpNV8xIDw9IDMsICJBbHRvIiwgIkJham8iKSwgbGV2ZWxzID0gYygiQmFqbyIsICJBbHRvIikpDQogICkNCg0KZGF0b3NfbGlrZXJ0IDwtIEJBU0UgJT4lDQogIHNlbGVjdChpNF8xX2NhdCwgaTRfMl9jYXQsIGk0XzNfY2F0LCBpNF80X2NhdCwgaTRfNV9jYXQsIGk0XzZfY2F0LCBpNF83X2NhdCwgaTRfOF9jYXQsIGk0XzlfY2F0LCBpNF8xMF9jYXQsIGk0XzExX2NhdCwgaTRfMTJfY2F0LCBpNF8xM19jYXQsIGk0XzE0X2NhdCwgaTRfMTVfY2F0LCBpNV8xX2NhdCkNCg0KbmFtZXMoZGF0b3NfbGlrZXJ0KSA8LSBjKA0KICAiNC4xIFJlbGFjaW9uZXMgY29uIHBhY2llbnRlcyIsDQogICI0LjIgUmVsYWNpw7NuIGFwb3lvIGNvbGVnYXMiLA0KICAiNC4zIE1lam9yw7MgcmVsYWNpb25lcyBlcXVpcG8iLA0KICAiNC40IFJlc29sdWNpw7NuIGRlIHByb2JsZW1hcyIsDQogICI0LjUgRGlzbWludXnDsyBidXJub3V0IiwNCiAgIjQuNiBNYW5lam8gZGUgcGFjaWVudGVzIiwNCiAgIjQuNyBFbXBhdMOtYSIsDQogICI0LjggU2F0aXNmYWNjacOzbiIsDQogICI0LjkgQXV0b2N1aWRhZG8iLA0KICAiNC4xMCBSZWQgZGUgYXBveW8iLA0KICAiNC4xMSBJZGVudGlkYWQgcHJvZmVzaW9uYWwiLA0KICAiNC4xMiBEaXNjdXNpb25lcyBhYnVycmlkYXMiLA0KICAiNC4xMyBEaXNjdXNpb25lcyBzdXBlcmZpY2lhbGVzIiwNCiAgIjQuMTQgSW5jb21vZGlkYWQgYWwgY29tcGFydGlyIiwNCiAgIjQuMTUgT3JpZW50YWNpw7NuIG5vIHByb2Zlc2lvbmFsIiwNCiAgIjUuMSBJbXBvcnRhbmNpYSBkZWwgR3J1cG8gQmFsaW50Ig0KKQ0KDQpsaWJyYXJ5KGdnc3RhdHMpDQoNCmdnbGlrZXJ0X3N0YWNrZWQoZGF0b3NfbGlrZXJ0LCBsYWJlbHNfc2l6ZSA9IDYpICsNCiAgc2NhbGVfZmlsbF9tYW51YWwoDQogICAgdmFsdWVzID0gYygiaW5kaWFucmVkMyIsICAic3RlZWxibHVlIiksDQogICAgbmFtZSA9ICJSZXNwdWVzdGEiDQogICkgKw0KICBnZ3RpdGxlKCJFc2NhbGEgTGlrZXJ0IiwNCiAgICAgICAgICBzdWJ0aXRsZSA9ICJBY3RpdHVkZXMgR3J1cG8gQmFsaW50IikgKw0KICB0aGVtZV9taW5pbWFsKGJhc2Vfc2l6ZSA9IDEzKSArDQogIHRoZW1lKA0KICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoZmFjZSA9ICJib2xkIiwgc2l6ZSA9IDI1LCBjb2xvciA9ICJibGFjayIpLA0KICAgIHBsb3Quc3VidGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDIwLCBjb2xvciA9ICJibGFjayIpLA0KICAgIGF4aXMudGV4dCA9IGVsZW1lbnRfdGV4dChjb2xvciA9ICJibGFjayIsIHNpemUgPSAyMCksDQogICAgYXhpcy50aXRsZSA9IGVsZW1lbnRfdGV4dChjb2xvciA9ICJibGFjayIpLA0KICAgIGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDIwKSwNCiAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoY29sb3IgPSAiYmxhY2siLCBzaXplID0gMjAsIGZhY2UgPSAiYm9sZCIpLA0KICAgIGxlZ2VuZC5wb3NpdGlvbiA9ICJib3R0b20iLA0KICAgIHBhbmVsLmdyaWQubWFqb3IueSA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICBwbG90LmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9ICJ3aGl0ZSIsIGNvbG9yID0gTkEpDQogICkNCg0KDQpgYGANCg0KIyMjIEdyw6FmaWNvIHBhcmEgcHJvZmVzaW9uYWxlcyBkZSBtZWRpY2luYQ0KDQpgYGB7cn0NCkJBU0VfTUVEIDwtIEJBU0UgJT4lIGZpbHRlcihncnVwb19wcm9mZXNpb25hbCA9PSAiUHJvZmVzaW9uYWxlcyBtw6lkaWNvcyIpDQoNCmRhdG9zX2xpa2VydF9NRUQgPC0gQkFTRV9NRUQgJT4lDQogIHNlbGVjdChpNF8xX2NhdCwgaTRfMl9jYXQsIGk0XzNfY2F0LCBpNF80X2NhdCwgaTRfNV9jYXQsIGk0XzZfY2F0LCBpNF83X2NhdCwgaTRfOF9jYXQsIGk0XzlfY2F0LCBpNF8xMF9jYXQsIGk0XzExX2NhdCwgaTRfMTJfY2F0LCBpNF8xM19jYXQsIGk0XzE0X2NhdCwgaTRfMTVfY2F0LCBpNV8xX2NhdCkNCg0KbmFtZXMoZGF0b3NfbGlrZXJ0X01FRCkgPC0gYygNCiAgIjQuMSBSZWxhY2lvbmVzIGNvbiBwYWNpZW50ZXMiLA0KICAiNC4yIFJlbGFjacOzbiBhcG95byBjb2xlZ2FzIiwNCiAgIjQuMyBNZWpvcsOzIHJlbGFjaW9uZXMgZXF1aXBvIiwNCiAgIjQuNCBSZXNvbHVjacOzbiBkZSBwcm9ibGVtYXMiLA0KICAiNC41IERpc21pbnV5w7MgYnVybm91dCIsDQogICI0LjYgTWFuZWpvIGRlIHBhY2llbnRlcyIsDQogICI0LjcgRW1wYXTDrWEiLA0KICAiNC44IFNhdGlzZmFjY2nDs24iLA0KICAiNC45IEF1dG9jdWlkYWRvIiwNCiAgIjQuMTAgUmVkIGRlIGFwb3lvIiwNCiAgIjQuMTEgSWRlbnRpZGFkIHByb2Zlc2lvbmFsIiwNCiAgIjQuMTIgRGlzY3VzaW9uZXMgYWJ1cnJpZGFzIiwNCiAgIjQuMTMgRGlzY3VzaW9uZXMgc3VwZXJmaWNpYWxlcyIsDQogICI0LjE0IEluY29tb2RpZGFkIGFsIGNvbXBhcnRpciIsDQogICI0LjE1IE9yaWVudGFjacOzbiBubyBwcm9mZXNpb25hbCIsDQogICI1LjEgSW1wb3J0YW5jaWEgZGVsIEdydXBvIEJhbGludCINCikNCg0KZ2dsaWtlcnRfc3RhY2tlZChkYXRvc19saWtlcnRfTUVELCBsYWJlbHNfc2l6ZSA9IDYpICsNCiAgc2NhbGVfZmlsbF9tYW51YWwoDQogICAgdmFsdWVzID0gYygiaW5kaWFucmVkMyIsICJzdGVlbGJsdWUiKSwNCiAgICBuYW1lID0gIlJlc3B1ZXN0YSINCiAgKSArDQogIGdndGl0bGUoIkVzY2FsYSBMaWtlcnQiLA0KICAgICAgICAgIHN1YnRpdGxlID0gIkFjdGl0dWRlcyBHcnVwbyBCYWxpbnQgcHJvZmVzaW9uYWxlcyBtZWRpY2luYSAobiA9IDkzKSIpICsNCiAgdGhlbWVfbWluaW1hbChiYXNlX3NpemUgPSAxMykgKw0KICB0aGVtZSgNCiAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGZhY2UgPSAiYm9sZCIsIHNpemUgPSAyNSwgY29sb3IgPSAiYmxhY2siKSwNCiAgICBwbG90LnN1YnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAyMCwgY29sb3IgPSAiYmxhY2siKSwNCiAgICBheGlzLnRleHQgPSBlbGVtZW50X3RleHQoY29sb3IgPSAiYmxhY2siLCBzaXplID0gMjApLA0KICAgIGF4aXMudGl0bGUgPSBlbGVtZW50X3RleHQoY29sb3IgPSAiYmxhY2siKSwNCiAgICBsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChjb2xvciA9ICJibGFjayIsIHNpemUgPSAyMCksDQogICAgbGVnZW5kLnRpdGxlID0gZWxlbWVudF90ZXh0KGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDIwLCBmYWNlID0gImJvbGQiKSwNCiAgICBsZWdlbmQucG9zaXRpb24gPSAiYm90dG9tIiwNCiAgICBwYW5lbC5ncmlkLm1ham9yLnkgPSBlbGVtZW50X2JsYW5rKCksDQogICAgcGxvdC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSAid2hpdGUiLCBjb2xvciA9IE5BKQ0KICApDQpgYGANCg0KIyMjIEdyw6FmaWNvIHByb2Zlc2lvbmFsZXMgZGUgZW5mZXJtZXLDrWENCg0KYGBge3J9DQpCQVNFX0VORiA8LSBCQVNFICU+JSBmaWx0ZXIoZ3J1cG9fcHJvZmVzaW9uYWwgPT0gIkVuZmVybWVyw61hIikNCg0KZGF0b3NfbGlrZXJ0X0VORiA8LSBCQVNFX0VORiAlPiUNCiAgc2VsZWN0KGk0XzFfY2F0LCBpNF8yX2NhdCwgaTRfM19jYXQsIGk0XzRfY2F0LCBpNF81X2NhdCwgaTRfNl9jYXQsIGk0XzdfY2F0LCBpNF84X2NhdCwgaTRfOV9jYXQsIGk0XzEwX2NhdCwgaTRfMTFfY2F0LCBpNF8xMl9jYXQsIGk0XzEzX2NhdCwgaTRfMTRfY2F0LCBpNF8xNV9jYXQsIGk1XzFfY2F0KQ0KDQpuYW1lcyhkYXRvc19saWtlcnRfRU5GKSA8LSBjKA0KICAiNC4xIFJlbGFjaW9uZXMgY29uIHBhY2llbnRlcyIsDQogICI0LjIgUmVsYWNpw7NuIGFwb3lvIGNvbGVnYXMiLA0KICAiNC4zIE1lam9yw7MgcmVsYWNpb25lcyBlcXVpcG8iLA0KICAiNC40IFJlc29sdWNpw7NuIGRlIHByb2JsZW1hcyIsDQogICI0LjUgRGlzbWludXnDsyBidXJub3V0IiwNCiAgIjQuNiBNYW5lam8gZGUgcGFjaWVudGVzIiwNCiAgIjQuNyBFbXBhdMOtYSIsDQogICI0LjggU2F0aXNmYWNjacOzbiIsDQogICI0LjkgQXV0b2N1aWRhZG8iLA0KICAiNC4xMCBSZWQgZGUgYXBveW8iLA0KICAiNC4xMSBJZGVudGlkYWQgcHJvZmVzaW9uYWwiLA0KICAiNC4xMiBEaXNjdXNpb25lcyBhYnVycmlkYXMiLA0KICAiNC4xMyBEaXNjdXNpb25lcyBzdXBlcmZpY2lhbGVzIiwNCiAgIjQuMTQgSW5jb21vZGlkYWQgYWwgY29tcGFydGlyIiwNCiAgIjQuMTUgT3JpZW50YWNpw7NuIG5vIHByb2Zlc2lvbmFsIiwNCiAgIjUuMSBJbXBvcnRhbmNpYSBkZWwgR3J1cG8gQmFsaW50Ig0KKQ0KDQpnZ2xpa2VydF9zdGFja2VkKGRhdG9zX2xpa2VydF9FTkYsIGxhYmVsc19zaXplID0gNikgKw0KICBzY2FsZV9maWxsX21hbnVhbCgNCiAgICB2YWx1ZXMgPSBjKCJpbmRpYW5yZWQzIiwgInN0ZWVsYmx1ZSIpLA0KICAgIG5hbWUgPSAiUmVzcHVlc3RhIg0KICApICsNCiAgZ2d0aXRsZSgiRXNjYWxhIExpa2VydCIsDQogICAgICAgICAgc3VidGl0bGUgPSAiQWN0aXR1ZGVzIEdydXBvIEJhbGludCBwcm9mZXNpb25hbGVzIEVuZmVybWVyw61hIChuID0gNTIpIikgKw0KICB0aGVtZV9taW5pbWFsKGJhc2Vfc2l6ZSA9IDEzKSArDQogIHRoZW1lKA0KICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoZmFjZSA9ICJib2xkIiwgc2l6ZSA9IDI1LCBjb2xvciA9ICJibGFjayIpLA0KICAgIHBsb3Quc3VidGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDIwLCBjb2xvciA9ICJibGFjayIpLA0KICAgIGF4aXMudGV4dCA9IGVsZW1lbnRfdGV4dChjb2xvciA9ICJibGFjayIsIHNpemUgPSAyMCksDQogICAgYXhpcy50aXRsZSA9IGVsZW1lbnRfdGV4dChjb2xvciA9ICJibGFjayIpLA0KICAgIGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDIwKSwNCiAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoY29sb3IgPSAiYmxhY2siLCBzaXplID0gMjAsIGZhY2UgPSAiYm9sZCIpLA0KICAgIGxlZ2VuZC5wb3NpdGlvbiA9ICJib3R0b20iLA0KICAgIHBhbmVsLmdyaWQubWFqb3IueSA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICBwbG90LmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9ICJ3aGl0ZSIsIGNvbG9yID0gTkEpDQogICkNCmBgYA0KDQojIyMgR3LDoWZpY28gb3Ryb3MNCg0KYGBge3J9DQpCQVNFX09UUk8gPC0gQkFTRSAlPiUgZmlsdGVyKGdydXBvX3Byb2Zlc2lvbmFsID09ICJPdHJvcyIpDQoNCmRhdG9zX2xpa2VydF9PVFJPIDwtIEJBU0VfT1RSTyAlPiUNCiAgc2VsZWN0KGk0XzFfY2F0LCBpNF8yX2NhdCwgaTRfM19jYXQsIGk0XzRfY2F0LCBpNF81X2NhdCwgaTRfNl9jYXQsIGk0XzdfY2F0LCBpNF84X2NhdCwgaTRfOV9jYXQsIGk0XzEwX2NhdCwgaTRfMTFfY2F0LCBpNF8xMl9jYXQsIGk0XzEzX2NhdCwgaTRfMTRfY2F0LCBpNF8xNV9jYXQsIGk1XzFfY2F0KQ0KDQpuYW1lcyhkYXRvc19saWtlcnRfT1RSTykgPC0gYygNCiAgIjQuMSBSZWxhY2lvbmVzIGNvbiBwYWNpZW50ZXMiLA0KICAiNC4yIFJlbGFjacOzbiBhcG95byBjb2xlZ2FzIiwNCiAgIjQuMyBNZWpvcsOzIHJlbGFjaW9uZXMgZXF1aXBvIiwNCiAgIjQuNCBSZXNvbHVjacOzbiBkZSBwcm9ibGVtYXMiLA0KICAiNC41IERpc21pbnV5w7MgYnVybm91dCIsDQogICI0LjYgTWFuZWpvIGRlIHBhY2llbnRlcyIsDQogICI0LjcgRW1wYXTDrWEiLA0KICAiNC44IFNhdGlzZmFjY2nDs24iLA0KICAiNC45IEF1dG9jdWlkYWRvIiwNCiAgIjQuMTAgUmVkIGRlIGFwb3lvIiwNCiAgIjQuMTEgSWRlbnRpZGFkIHByb2Zlc2lvbmFsIiwNCiAgIjQuMTIgRGlzY3VzaW9uZXMgYWJ1cnJpZGFzIiwNCiAgIjQuMTMgRGlzY3VzaW9uZXMgc3VwZXJmaWNpYWxlcyIsDQogICI0LjE0IEluY29tb2RpZGFkIGFsIGNvbXBhcnRpciIsDQogICI0LjE1IE9yaWVudGFjacOzbiBubyBwcm9mZXNpb25hbCIsDQogICI1LjEgSW1wb3J0YW5jaWEgZGVsIEdydXBvIEJhbGludCINCikNCg0KZ2dsaWtlcnRfc3RhY2tlZChkYXRvc19saWtlcnRfT1RSTywgbGFiZWxzX3NpemUgPSA2KSArDQogIHNjYWxlX2ZpbGxfbWFudWFsKA0KICAgIHZhbHVlcyA9IGMoImluZGlhbnJlZDMiLCAic3RlZWxibHVlIiksDQogICAgbmFtZSA9ICJSZXNwdWVzdGEiDQogICkgKw0KICBnZ3RpdGxlKCJFc2NhbGEgTGlrZXJ0IiwNCiAgICAgICAgICBzdWJ0aXRsZSA9ICJBY3RpdHVkZXMgR3J1cG8gQmFsaW50IE90cm9zIHByb2Zlc2lvbmFsZXMgKG4gPSAzMikiKSArDQogIHRoZW1lX21pbmltYWwoYmFzZV9zaXplID0gMTMpICsNCiAgdGhlbWUoDQogICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChmYWNlID0gImJvbGQiLCBzaXplID0gMjUsIGNvbG9yID0gImJsYWNrIiksDQogICAgcGxvdC5zdWJ0aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMjAsIGNvbG9yID0gImJsYWNrIiksDQogICAgYXhpcy50ZXh0ID0gZWxlbWVudF90ZXh0KGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDIwKSwNCiAgICBheGlzLnRpdGxlID0gZWxlbWVudF90ZXh0KGNvbG9yID0gImJsYWNrIiksDQogICAgbGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoY29sb3IgPSAiYmxhY2siLCBzaXplID0gMjApLA0KICAgIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfdGV4dChjb2xvciA9ICJibGFjayIsIHNpemUgPSAyMCwgZmFjZSA9ICJib2xkIiksDQogICAgbGVnZW5kLnBvc2l0aW9uID0gImJvdHRvbSIsDQogICAgcGFuZWwuZ3JpZC5tYWpvci55ID0gZWxlbWVudF9ibGFuaygpLA0KICAgIHBsb3QuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gIndoaXRlIiwgY29sb3IgPSBOQSkNCiAgKQ0KYGBgDQoNCipSZWNvZGlmaWNhbmRvIGxvcyB2YWxvcmVzIGRlIGxvcyBpdGVtcyBhcGFyZW50ZW1lbnRlIGludmVydGlkb3MqDQoNCmBgYHtyfQ0KQkFTRSA8LSBCQVNFICU+JQ0KICBtdXRhdGUoDQogICAgYWNyb3NzKGMoaTRfMTIsIGk0XzEzLCBpNF8xNCwgaTRfMTUpLCB+IDYgLSAuKQ0KICApDQoNCmBgYA0KDQojIyBSZWFsaXphY2nDs24gYW7DoWxpc2lzIGZhY3RvcmlhbCBleHBsb3JhdG9yaW8NCg0KLSBTZSBldmFsdWEgZWwgc3VwdWVzdG8gZGUgbGEgYWRlY3VhY2lvbiBtdWVzdHJhbA0KLSBTZSBldmFsdWEgZWwgc3VwdWVzdG8gZGUgaWRlbnRpZGFkDQotIFNlIGV2YWx1YSBlbCBzdXB1ZXN0byBkZSByZWxhY2lvbiBlbnRyZSB2YXJpYWJsZXMNCg0KYGBge3J9DQpsaWJyYXJ5KHBzeWNoKQ0KS01PKEJBU0VbLDE1OjMwXSkNCmJhcnRsZXR0LnRlc3QoQkFTRVssMTU6MzBdKQ0KDQpsaWJyYXJ5KGNvcnJwbG90KQ0KbGlicmFyeShIbWlzYykNCg0KIyBDb3JyZWxhY2nDs24gZGUgU3BlYXJtYW4NCnJlcyA8LSByY29ycihhcy5tYXRyaXgoQkFTRVssMTU6MzBdKSwgdHlwZSA9ICJzcGVhcm1hbiIpDQpjb3JfbWF0cml4IDwtIHJlcyRyDQoNCiMgUGFsZXRhIGRlIGNvbG9yZXMgc3VhdmUgKHJvam8tYmxhbmNvLWF6dWwpDQptaXNfY29sb3JlcyA8LSBjb2xvclJhbXBQYWxldHRlKGMoInNhbG1vbiIsICJ3aGl0ZSIsICJza3libHVlIikpKDIwMCkNCg0KDQpjb3JycGxvdChjb3JfbWF0cml4LA0KICAgICAgICAgbWV0aG9kID0gImNvbG9yIiwgICAgICAgICMgY2VsZGFzIGNvbG9yZWFkYXMgKG3DoXMgImNsw6FzaWNvIiBxdWUgY8OtcmN1bG9zKQ0KICAgICAgICAgdHlwZSA9ICJsb3dlciIsICAgICAgICAgICMgc29sbyBtaXRhZCBpbmZlcmlvcg0KICAgICAgICAgYWRkQ29lZi5jb2wgPSAiYmxhY2siLCAgICMgbXVlc3RyYSBlbCBuw7ptZXJvIGVuIG5lZ3JvIGRlbnRybyBkZSBjYWRhIGNlbGRhDQogICAgICAgICBudW1iZXIuY2V4ID0gMS4yLCAgICAgICAgIyB0YW1hw7FvIGRlbCBuw7ptZXJvDQogICAgICAgICBjb2wgPSBtaXNfY29sb3JlcywgICAgICAgIyBwYWxldGEgc3VhdmUNCiAgICAgICAgIHRsLmNvbCA9ICJibGFjayIsICAgICAgICAjIHRleHRvIGRlIGxhcyBldGlxdWV0YXMgZW4gbmVncm8NCiAgICAgICAgIHRsLnNydCA9IDUwLCAgICAgICAgICAgICAjIHJvdGEgbGFzIGV0aXF1ZXRhcyA0NcKwDQogICAgICAgICB0bC5jZXggPSAxLjUsICAgICAgICAgICAgIyB0YW1hw7FvIGRlIGxhcyBldGlxdWV0YXMNCiAgICAgICAgIGRpYWcgPSBGQUxTRSwgICAgICAgICAgICAjIG9jdWx0YSBsYSBkaWFnb25hbCAoY29ycmVsYWNpw7NuIGRlIGNhZGEgw610ZW0gY29uc2lnbyBtaXNtbyA9IDEpDQogICAgICAgICB0aXRsZSA9ICJNYXRyaXogZGUgY29ycmVsYWNpw7NuIGRlIFNwZWFybWFuIiwNCiAgICAgICAgIG1hciA9IGMoMCwwLDIsMCkpICAgICAgICAjIG1hcmdlbiBwYXJhIHF1ZSBzZSB2ZWEgYmllbiBlbCB0w610dWxvDQoNCg0KDQpgYGANCg0KQ3VtcGxlIGVsIHN1cHVlc3RvIGRlIGFkZWN1YWNpw7NuIG11ZXN0cmFsLCBkZSByZWxhY2nDs24gZW50cmUgdmFyaWFibGVzIHBlcm8gbm8gc2UgY3VtcGxlIGVsIHN1cHVlc3RvIGRlIGlkZW50aWRhZCAocmVzdWx0YWRvIG5vIHNpZ25pZmljYXRpdm8gZW4gbGEgcHJ1ZWJhIGRlIGVzZmVyaWNpZGFkIGRlIGJhcnRsZXR0KQ0KDQojIyMgUGVyZmlsYWNpw7NuIGRlIHN1amV0b3MgYSBwYXJ0aXIgZGVsIHJlc3VsdGFkbyBkZSBhY3RpdHVkDQoNCi0gUG9zaWJsZW1lbnRlIHNlIHBldWRhIGRlc2N1YnJpciB1bmEgYWN0aXR1ZCBhbHRhIHkgYmFqYQ0KDQpgYGB7cn0NCmxpYnJhcnkobWNsdXN0KQ0KREFUQV9QUk9GSUxFUyA8LSBCQVNFWywgMTU6MzBdDQpzZXQuc2VlZCgyMDI1KQ0KbWMxIDwtbWNsdXN0QklDKEJBU0VbLDE1OjMwXSkgDQpzdW1tYXJ5KG1jMSkgIyAzIGdydXBvcw0KDQpgYGANCg0KYGBge3J9DQpzZXQuc2VlZCgyMDI1KQ0KbW9kZWwxIDwtIE1jbHVzdChCQVNFWywxNTozMF0sIG1vZGVsTmFtZXMgPSAiRUVFIiwgRyA9IDMpDQpzdW1tYXJ5KG1vZGVsMSkNCg0KYGBgDQoNCioqU2UgcmV2aXNhbiBsb3MgaW50ZXJ2YWxvcyBkZSBjb25maWFuemEqKg0KDQpgYGB7cn0NCmxpYnJhcnkodGliYmxlKQ0KbGlicmFyeSh0aWR5cikNCg0KbWVhbnMgPC0gZGF0YS5mcmFtZShtb2RlbDEkcGFyYW1ldGVycyRtZWFuKSAlPiUNCiAgcm93bmFtZXNfdG9fY29sdW1uKCkgJT4lDQogIHJlbmFtZShEQVRBX1BST0ZJTEVTID0gcm93bmFtZSkgJT4lDQogIHBpdm90X2xvbmdlcihjb2xzID0gYyhYMSwgWDIsIFgzKSwgbmFtZXNfdG8gPSAiUHJvZmlsZSIsIHZhbHVlc190byA9ICJNZWFuIikgJT4lDQogIG11dGF0ZSgNCiAgICBNZWFuID0gcm91bmQoTWVhbiwgMiksDQogICAgIyBFc3RhbmRhcml6YWNpw7NuIFogKG5vcm1hbGl6YWNpw7NuIHVzYW5kbyBtZWRpYSB5IGRlc3ZpYWNpw7NuIGVzdMOhbmRhcikNCiAgICBNZWFuID0gKE1lYW4gLSBtZWFuKE1lYW4pKSAvIHNkKE1lYW4pDQogICkNCg0KcCA8LSBtZWFucyAlPiUNCiAgbXV0YXRlKA0KICAgIFByb2ZpbGUgPSBjYXNlX3doZW4oDQogICAgICBQcm9maWxlID09ICJYMSIgfiAiUDEgKDEyMykiLA0KICAgICAgUHJvZmlsZSA9PSAiWDIiIH4gIlAyICg4KSIsDQogICAgICBQcm9maWxlID09ICJYMyIgfiAiUDMgKDQ2KSIsDQogICAgICBUUlVFIH4gUHJvZmlsZQ0KICAgICkNCiAgKSAlPiUNCiAgZ2dwbG90KGFlcygNCiAgICB4ID0gREFUQV9QUk9GSUxFUywNCiAgICB5ID0gTWVhbiwNCiAgICBncm91cCA9IFByb2ZpbGUsDQogICAgY29sb3IgPSBQcm9maWxlDQogICkpICsNCiAgZ2VvbV9wb2ludChzaXplID0gMi4yNSkgKw0KICBnZW9tX2xpbmUobGluZXdpZHRoID0gMS4yNSkgKw0KICBzY2FsZV94X2Rpc2NyZXRlKA0KICAgIGxpbWl0cyA9IGMoDQogICAgICAiaTRfMSIsICJpNF8yIiwgImk0XzMiLCAiaTRfNCIsICJpNF81IiwgImk0XzYiLCAiaTRfNyIsICJpNF84IiwNCiAgICAgICJpNF85IiwgImk0XzEwIiwgImk0XzExIiwgImk0XzEyIiwgImk0XzEzIiwgImk0XzE0IiwgImk0XzE1IiwNCiAgICAgICJpNV8xIg0KICAgICkNCiAgKSArDQogIHNjYWxlX2NvbG9yX21hbnVhbCgNCiAgICB2YWx1ZXMgPSBjKA0KICAgICAgIlAxICgxMjMpIiA9ICJibHVlMiIsDQogICAgICAiUDIgKDgpIiA9ICJncmVlbjQiLA0KICAgICAgIlAzICg0NikiID0gInJlZCINCiAgICApDQogICkgKw0KICBsYWJzKA0KICAgIHggPSAiSXRlbXMgYWN0aXR1ZCIsDQogICAgeSA9ICJNZWRpYSBlc3RhbmRhcml6YWRhIiwNCiAgICBjb2xvciA9ICJQZXJmaWwiLA0KICAgIHRpdGxlID0gIlBlcmZpbGVzIEFjdGl0dWQgZ3J1cG8gQmFsaW50Ig0KICApICsNCiAgdGhlbWVfYncoYmFzZV9zaXplID0gMTQpICsNCiAgdGhlbWUoDQogICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA5MCwgaGp1c3QgPSAxLCBzaXplID0gMjAsIGZhY2UgPSAiYm9sZCIpLA0KICAgIGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KHNpemUgPSAyMCwgZmFjZSA9ICJib2xkIiksDQogICAgYXhpcy50aXRsZS54ID0gZWxlbWVudF90ZXh0KHNpemUgPSAyMiwgZmFjZSA9ICJib2xkIiksDQogICAgYXhpcy50aXRsZS55ID0gZWxlbWVudF90ZXh0KHNpemUgPSAyMiwgZmFjZSA9ICJib2xkIiksDQogICAgbGVnZW5kLnBvc2l0aW9uID0gInJpZ2h0IiwNCiAgICBsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTUsIGZhY2UgPSAiYm9sZCIpLA0KICAgIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMjUsIGZhY2UgPSAiYm9sZCIpDQogICkNCg0KcA0KYGBgDQoNClNlIGVuY29udHJhcm9uIDMgcG90ZW5jaWFsZXMgcGVyZmlsZXMsIGRlIG1hbmVyYSBnZW5lcmFsIGRhIGxhIGltcGVzacOzbiBxdWUgZXhpc3RlIHVuIHBlcmZpbCBkZSBzdWpldG9zIHF1ZSB0aWVuZW4gdW5hIGFjdGl0dWQgbcOhcyBwb3NpdGl2YSBhY2VyY2EgZGVsIGdydXBvIEJhbGludCwgc2luIGVtYWJyZ28gbm8gZW5jdWVudHJhbiBncmFuIGFwb3J0ZSAoaXRlbXMgNS4xKS4gTG9zIG90cm9zIHNlIGRpZmVyZW5jaWFuIGVzcGVjaWFsbWVudGUgZW4gbG9zIMOtdGVtcyBxdWUgcGFyZWNlbiBpbnZlcnRpZG9zLg0KDQojIyMgQ2FyYWN0ZXJpemFjacOzbiBwZXJmaWxlcyBkZSBhY3RpdHVkDQoNCmBgYHtyfQ0KIyBFeHRyYWVyIGxhcyBjbGFzaWZpY2FjaW9uZXMgZGVsIG1vZGVsbw0KY2xhc2VzIDwtIG1vZGVsMSRjbGFzc2lmaWNhdGlvbg0KDQojIEFncmVnYXIgbGFzIGNsYXNlcyBhbCBkYXRhIGZyYW1lDQpCQVNFIDwtIEJBU0UgJT4lDQogIG11dGF0ZShQZXJmaWwgPSBjbGFzZXMpDQoNCkJBU0UkUGVyZmlsIDwtIGZhY3RvcihCQVNFJFBlcmZpbCwgbGV2ZWxzID0gYygxLCAzLCAyKSwgbGFiZWxzID0gYyAoIkFsdG8iLCAiTWVkaW8iLCAiQmFqbyIpKQ0KYGBgDQoNCmBgYHtyfQ0KdGFibGExIDwtIEJBU0UgJT4lDQogIHNlbGVjdCgNCiAgICBoYV9wYXJ0aWNpcGFkb19hbGd1bmFfdmV6X2VuX3VuX2dydXBvX2JhbGludF95YV9zZWFfYWN0dWFsbWVudGVfb19lbl9lbF9wYXNhZG8sDQogICAgZHVyYW50ZV9jdWFudG9fdGllbXBvX2hhX3BhcnRpY2lwYWRvX2VuX2dydXBvc19iYWxpbnQsIGdlbmVybywgZ3J1cG9fcHJvZmVzaW9uYWwsICAgYW5vc19kZV9lamVyY2ljaW9fcHJvZmVzaW9uYWwsZXN0YV9kZXNlbXBlbmFuZG9fdW5fY2FyZ29fZW5fZWxfY3VhbF90ZW5nYV9wZXJzb25hbF9hX2NhcmdvLA0KICAgIHBhcnRpY2lwYV9lbl9hY3RpdmlkYWRlc19kb2NlbnRlcywgZWRhZDIsIFBlcmZpbA0KICApICU+JQ0KICB0Ymxfc3VtbWFyeSgNCiAgICBieSA9IFBlcmZpbCwNCiAgICB0eXBlID0gbGlzdCgNCiAgICAgIGFsbF9jYXRlZ29yaWNhbCgpIH4gImNhdGVnb3JpY2FsIiwNCiAgICAgIGVkYWQyIH4gImNvbnRpbnVvdXMiDQogICAgKSwNCiAgICBsYWJlbCA9IGxpc3QoDQogICAgICBoYV9wYXJ0aWNpcGFkb19hbGd1bmFfdmV6X2VuX3VuX2dydXBvX2JhbGludF95YV9zZWFfYWN0dWFsbWVudGVfb19lbl9lbF9wYXNhZG8gfiAiUGFydGljaXBhY2nDs24gYWN0dWFsIG8gcGFzYWRhIGVuIGdydXBvIEJhbGludCIsDQogICAgICBkdXJhbnRlX2N1YW50b190aWVtcG9faGFfcGFydGljaXBhZG9fZW5fZ3J1cG9zX2JhbGludCB+ICJUaWVtcG8gcGFydGljaXBhY2nDs24gZ3J1cG8gQmFsaW50IiwNCiAgICAgIGdlbmVybyB+ICJHw6luZXJvIiwNCiAgICAgIGdydXBvX3Byb2Zlc2lvbmFsIH4gIkdydXBvIHByb2Zlc2lvbmFsIiwNCiAgICAgIGFub3NfZGVfZWplcmNpY2lvX3Byb2Zlc2lvbmFsIH4gIkHDsW9zIGVqZXJjaWNpbyBwcm9mZXNpb25hbCIsDQogICAgICBlc3RhX2Rlc2VtcGVuYW5kb191bl9jYXJnb19lbl9lbF9jdWFsX3RlbmdhX3BlcnNvbmFsX2FfY2FyZ28gfiAiRGVzZW1wZcOxYSBjYXJnbyBjb24gcGVyc29uYWwgYSBjYXJnbyIsDQogICAgICBwYXJ0aWNpcGFfZW5fYWN0aXZpZGFkZXNfZG9jZW50ZXMgfiAiUGFydGljaXBhY2nDs24gYWN0LiBkb2NlbnRlIiwNCiAgICAgIGVkYWQyIH4gIkVkYWQiDQogICAgKSwNCiAgICBzdGF0aXN0aWMgPSBsaXN0KA0KICAgICAgYWxsX2NhdGVnb3JpY2FsKCkgfiAie259ICh7cH0lKSIsDQogICAgICBlZGFkMiB+ICJ7bWVhbn0gKHtzZH0pIg0KICAgICksDQogICAgZGlnaXRzID0gbGlzdCgNCiAgICAgIGFsbF9jYXRlZ29yaWNhbCgpIH4gMSwNCiAgICAgIGVkYWQyIH4gMQ0KICAgICksDQogICAgbWlzc2luZyA9ICJpZmFueSIsDQogICAgbWlzc2luZ190ZXh0ID0gIlNpbiBkYXRvIg0KICApICU+JQ0KICBhZGRfb3ZlcmFsbChsYXN0ID0gVFJVRSwgY29sX2xhYmVsID0gIioqVG90YWwqKiwgTiA9IHtOfSIpICU+JQ0KICBtb2RpZnlfaGVhZGVyKGxhYmVsIH4gIioqVmFyaWFibGUqKiIpICU+JQ0KICBtb2RpZnlfc3Bhbm5pbmdfaGVhZGVyKGFsbF9zdGF0X2NvbHMoKSB+ICIqKlBlcmZpbCoqIikgJT4lDQogIGJvbGRfbGFiZWxzKCkgJT4lDQogIG1vZGlmeV9jYXB0aW9uKCIqKlRhYmxhIDEqKiIpDQoNCnRhYmxhMQ0KYGBgDQoNClxgXGBcYFxgDQo=