Librerías

library(RMariaDB) # Para base de datos Mysql
library(tidyverse) #Para manipulacion de datos
library(plotly) # Graficos dinamicos
library(ggsci) #paletas de colores
library(flextable) #Tablas con formato informe academico

Conexion

conexion <- dbConnect(RMariaDB::MariaDB(),
                       user ='root',
                       password ="",
                       dbname ='CLASES_BD',
                       host ='localhost')
dbListTables(conexion)
 [1] "COVID_CASOS_ARG"             "COVID_CLASIFICACION"         "COVID_CLASIFICACION_DETALLE"
 [4] "COVID_DEPARTAMENTO"          "COVID_ORIGEN_FINANCIAMIENTO" "COVID_PAIS"                 
 [7] "COVID_PROVINCIA"             "COVID_SEXO"                  "COVID_SINO"                 
[10] "COVID_TIPO_EDAD"            

Lectura de Tablas de Mysql

COVID_CASOS_ARG = tbl(conexion,"COVID_CASOS_ARG")
COVID_CLASIFICACION = tbl(conexion,"COVID_CLASIFICACION")
COVID_CLASIFICACION_DETALLE = tbl(conexion,"COVID_CLASIFICACION_DETALLE")
COVID_DEPARTAMENTO = tbl(conexion,"COVID_DEPARTAMENTO")
COVID_ORIGEN_FINANCIAMIENTO = tbl(conexion,"COVID_ORIGEN_FINANCIAMIENTO")
COVID_PAIS = tbl(conexion,"COVID_PAIS")
COVID_PROVINCIA = tbl(conexion,"COVID_PROVINCIA")
COVID_SEXO = tbl(conexion,"COVID_SEXO")
COVID_SINO = tbl(conexion,"COVID_SINO")
COVID_TIPO_EDAD = tbl(conexion,"COVID_TIPO_EDAD")

Actividades: Realizar las consultas para obtener la siguiente información:

COVID_CASOS_ARG %>% 
  left_join(COVID_TIPO_EDAD) %>% 
  left_join(COVID_CLASIFICACION) %>% 
  left_join(COVID_CLASIFICACION_DETALLE %>% 
              select(-ID_CLASIFICACION)) %>% 
  mutate(EDAD = ifelse(TIPO_EDAD == "Meses",EDAD/12,EDAD)) %>% 
  mutate(Edad_rangos = case_when(EDAD < 10 ~ "1",
                                 EDAD < 20 ~ "2",
                                 EDAD < 30 ~ "2",
                                 EDAD < 40 ~ "3",
                                 EDAD < 50 ~ "4",
                                 EDAD < 60 ~ "5",
                                 EDAD < 70 ~ "6",
                                 EDAD < 80 ~ "7",
                                 T ~ "8")) %>% 
  group_by(Edad_rangos) %>% 
  summarise(confiramdos = sum(CLASIFICACION == "Confirmado"),
            fallecidos = sum(CLASIFICACION_DETALLE == "Caso confirmado - Fallecido")) %>% 
  mutate(letalidad = fallecidos/confiramdos)
pregunta_1 = COVID_CASOS_ARG %>% 
  left_join(COVID_TIPO_EDAD) %>% 
  left_join(COVID_CLASIFICACION) %>% 
  left_join(COVID_CLASIFICACION_DETALLE %>% 
              select(-ID_CLASIFICACION)) %>% 
  mutate(EDAD = ifelse(TIPO_EDAD == "Meses",EDAD/12,EDAD)) %>% 
  mutate(Edad_rangos = case_when(EDAD < 10 ~ "1",
                                 EDAD < 20 ~ "2",
                                 EDAD < 30 ~ "2",
                                 EDAD < 40 ~ "3",
                                 EDAD < 50 ~ "4",
                                 EDAD < 60 ~ "5",
                                 EDAD < 70 ~ "6",
                                 EDAD < 80 ~ "7",
                                 T ~ "8")) %>% 
  group_by(Edad_rangos) %>% 
  summarise(confiramdos = sum(CLASIFICACION == "Confirmado"),
            fallecidos = sum(CLASIFICACION_DETALLE == "Caso confirmado - Fallecido")) %>% 
  mutate(letalidad = fallecidos/confiramdos) %>% 
  collect()
flextable(pregunta_1)

Edad_rangos

confiramdos

fallecidos

letalidad

5

4659

123

0.0264

4

6861

58

0.0085

3

8643

23

0.0027

2

11155

10

0.0009

7

1476

226

0.1531

6

2478

189

0.0763

8

1581

349

0.2207

1

2704

1

0.0004

p1 = pregunta_1 %>% 
  mutate(Edad_rangos = as.factor(Edad_rangos)) %>% 
  pivot_longer(-Edad_rangos, names_to = "Estatus", values_to = "Casos") %>% 
  ggplot(aes(fill = Edad_rangos, y = Casos, x = Edad_rangos)) + 
  geom_bar(position="stack", stat="identity") +
  theme_minimal() +
  scale_fill_jco() +
  facet_wrap(~Estatus, scales = "free") +
  ggtitle("Confirmados/Fallecidos/Letalidad") +
  theme(legend.position = "none") +
  xlab("Rangos de Edad")

ggplotly(p1,width = 900, height = 500)

¿Como R consulta los datos en una base estructurada sin escribir en SQL ?

COVID_CASOS_ARG %>% 
  left_join(COVID_TIPO_EDAD) %>% 
  left_join(COVID_CLASIFICACION) %>% 
  left_join(COVID_CLASIFICACION_DETALLE %>% 
              select(-ID_CLASIFICACION)) %>% 
  mutate(EDAD = ifelse(TIPO_EDAD == "Meses",EDAD/12,EDAD)) %>% 
  mutate(Edad_rangos = case_when(EDAD < 10 ~ "1",
                                 EDAD < 20 ~ "2",
                                 EDAD < 30 ~ "2",
                                 EDAD < 40 ~ "3",
                                 EDAD < 50 ~ "4",
                                 EDAD < 60 ~ "5",
                                 EDAD < 70 ~ "6",
                                 EDAD < 80 ~ "7",
                                 T ~ "8")) %>% 
  group_by(Edad_rangos) %>% 
  summarise(confiramdos = sum(CLASIFICACION == "Confirmado"),
            fallecidos = sum(CLASIFICACION_DETALLE == "Caso confirmado - Fallecido")) %>% 
  mutate(letalidad = fallecidos/confiramdos) %>% 
  show_query()
<SQL>
SELECT `Edad_rangos`, `confiramdos`, `fallecidos`, `fallecidos` / `confiramdos` AS `letalidad`
FROM (SELECT `Edad_rangos`, SUM(`CLASIFICACION` = 'Confirmado') AS `confiramdos`, SUM(`CLASIFICACION_DETALLE` = 'Caso confirmado - Fallecido') AS `fallecidos`
FROM (SELECT `ID_CASO`, `ID_SEXO`, `EDAD`, `ID_TIPO_EDAD`, `ID_PAIS_RESIDENCIA`, `ID_PROVINCIA_RESIDENCIA`, `ID_DEPARTAMENTO_RESIDENCIA`, `ID_PROVINCIA_CARGA`, `FECHA_INICIO_SINTOMAS`, `FECHA_APERTURA`, `SEMANA_APERTURA`, `FECHA_INTERNACION`, `CUIDADO_INTENSIVO`, `FECHA_CUIDADO_INTENSIVO`, `FALLECIDO`, `FECHA_FALLECIMIENTO`, `ASISTENCIA_RESPIRATORIA_MECANICA`, `ID_ORIGEN_FINANCIAMIENTO`, `ID_CLASIFICACION`, `ID_CLASIFICACION_DETALLE`, `FECHA_DIAGNOSTICO`, `TIPO_EDAD`, `CLASIFICACION`, `CLASIFICACION_DETALLE`, CASE
WHEN (`EDAD` < 10.0) THEN ('1')
WHEN (`EDAD` < 20.0) THEN ('2')
WHEN (`EDAD` < 30.0) THEN ('2')
WHEN (`EDAD` < 40.0) THEN ('3')
WHEN (`EDAD` < 50.0) THEN ('4')
WHEN (`EDAD` < 60.0) THEN ('5')
WHEN (`EDAD` < 70.0) THEN ('6')
WHEN (`EDAD` < 80.0) THEN ('7')
ELSE ('8')
END AS `Edad_rangos`
FROM (SELECT `ID_CASO`, `ID_SEXO`, CASE WHEN (`TIPO_EDAD` = 'Meses') THEN (`EDAD` / 12.0) WHEN NOT(`TIPO_EDAD` = 'Meses') THEN (`EDAD`) END AS `EDAD`, `ID_TIPO_EDAD`, `ID_PAIS_RESIDENCIA`, `ID_PROVINCIA_RESIDENCIA`, `ID_DEPARTAMENTO_RESIDENCIA`, `ID_PROVINCIA_CARGA`, `FECHA_INICIO_SINTOMAS`, `FECHA_APERTURA`, `SEMANA_APERTURA`, `FECHA_INTERNACION`, `CUIDADO_INTENSIVO`, `FECHA_CUIDADO_INTENSIVO`, `FALLECIDO`, `FECHA_FALLECIMIENTO`, `ASISTENCIA_RESPIRATORIA_MECANICA`, `ID_ORIGEN_FINANCIAMIENTO`, `ID_CLASIFICACION`, `ID_CLASIFICACION_DETALLE`, `FECHA_DIAGNOSTICO`, `TIPO_EDAD`, `CLASIFICACION`, `CLASIFICACION_DETALLE`
FROM (SELECT `LHS`.`ID_CASO` AS `ID_CASO`, `LHS`.`ID_SEXO` AS `ID_SEXO`, `LHS`.`EDAD` AS `EDAD`, `LHS`.`ID_TIPO_EDAD` AS `ID_TIPO_EDAD`, `LHS`.`ID_PAIS_RESIDENCIA` AS `ID_PAIS_RESIDENCIA`, `LHS`.`ID_PROVINCIA_RESIDENCIA` AS `ID_PROVINCIA_RESIDENCIA`, `LHS`.`ID_DEPARTAMENTO_RESIDENCIA` AS `ID_DEPARTAMENTO_RESIDENCIA`, `LHS`.`ID_PROVINCIA_CARGA` AS `ID_PROVINCIA_CARGA`, `LHS`.`FECHA_INICIO_SINTOMAS` AS `FECHA_INICIO_SINTOMAS`, `LHS`.`FECHA_APERTURA` AS `FECHA_APERTURA`, `LHS`.`SEMANA_APERTURA` AS `SEMANA_APERTURA`, `LHS`.`FECHA_INTERNACION` AS `FECHA_INTERNACION`, `LHS`.`CUIDADO_INTENSIVO` AS `CUIDADO_INTENSIVO`, `LHS`.`FECHA_CUIDADO_INTENSIVO` AS `FECHA_CUIDADO_INTENSIVO`, `LHS`.`FALLECIDO` AS `FALLECIDO`, `LHS`.`FECHA_FALLECIMIENTO` AS `FECHA_FALLECIMIENTO`, `LHS`.`ASISTENCIA_RESPIRATORIA_MECANICA` AS `ASISTENCIA_RESPIRATORIA_MECANICA`, `LHS`.`ID_ORIGEN_FINANCIAMIENTO` AS `ID_ORIGEN_FINANCIAMIENTO`, `LHS`.`ID_CLASIFICACION` AS `ID_CLASIFICACION`, `LHS`.`ID_CLASIFICACION_DETALLE` AS `ID_CLASIFICACION_DETALLE`, `LHS`.`FECHA_DIAGNOSTICO` AS `FECHA_DIAGNOSTICO`, `LHS`.`TIPO_EDAD` AS `TIPO_EDAD`, `LHS`.`CLASIFICACION` AS `CLASIFICACION`, `RHS`.`CLASIFICACION_DETALLE` AS `CLASIFICACION_DETALLE`
FROM (SELECT `LHS`.`ID_CASO` AS `ID_CASO`, `LHS`.`ID_SEXO` AS `ID_SEXO`, `LHS`.`EDAD` AS `EDAD`, `LHS`.`ID_TIPO_EDAD` AS `ID_TIPO_EDAD`, `LHS`.`ID_PAIS_RESIDENCIA` AS `ID_PAIS_RESIDENCIA`, `LHS`.`ID_PROVINCIA_RESIDENCIA` AS `ID_PROVINCIA_RESIDENCIA`, `LHS`.`ID_DEPARTAMENTO_RESIDENCIA` AS `ID_DEPARTAMENTO_RESIDENCIA`, `LHS`.`ID_PROVINCIA_CARGA` AS `ID_PROVINCIA_CARGA`, `LHS`.`FECHA_INICIO_SINTOMAS` AS `FECHA_INICIO_SINTOMAS`, `LHS`.`FECHA_APERTURA` AS `FECHA_APERTURA`, `LHS`.`SEMANA_APERTURA` AS `SEMANA_APERTURA`, `LHS`.`FECHA_INTERNACION` AS `FECHA_INTERNACION`, `LHS`.`CUIDADO_INTENSIVO` AS `CUIDADO_INTENSIVO`, `LHS`.`FECHA_CUIDADO_INTENSIVO` AS `FECHA_CUIDADO_INTENSIVO`, `LHS`.`FALLECIDO` AS `FALLECIDO`, `LHS`.`FECHA_FALLECIMIENTO` AS `FECHA_FALLECIMIENTO`, `LHS`.`ASISTENCIA_RESPIRATORIA_MECANICA` AS `ASISTENCIA_RESPIRATORIA_MECANICA`, `LHS`.`ID_ORIGEN_FINANCIAMIENTO` AS `ID_ORIGEN_FINANCIAMIENTO`, `LHS`.`ID_CLASIFICACION` AS `ID_CLASIFICACION`, `LHS`.`ID_CLASIFICACION_DETALLE` AS `ID_CLASIFICACION_DETALLE`, `LHS`.`FECHA_DIAGNOSTICO` AS `FECHA_DIAGNOSTICO`, `LHS`.`TIPO_EDAD` AS `TIPO_EDAD`, `RHS`.`CLASIFICACION` AS `CLASIFICACION`
FROM (SELECT `LHS`.`ID_CASO` AS `ID_CASO`, `LHS`.`ID_SEXO` AS `ID_SEXO`, `LHS`.`EDAD` AS `EDAD`, `LHS`.`ID_TIPO_EDAD` AS `ID_TIPO_EDAD`, `LHS`.`ID_PAIS_RESIDENCIA` AS `ID_PAIS_RESIDENCIA`, `LHS`.`ID_PROVINCIA_RESIDENCIA` AS `ID_PROVINCIA_RESIDENCIA`, `LHS`.`ID_DEPARTAMENTO_RESIDENCIA` AS `ID_DEPARTAMENTO_RESIDENCIA`, `LHS`.`ID_PROVINCIA_CARGA` AS `ID_PROVINCIA_CARGA`, `LHS`.`FECHA_INICIO_SINTOMAS` AS `FECHA_INICIO_SINTOMAS`, `LHS`.`FECHA_APERTURA` AS `FECHA_APERTURA`, `LHS`.`SEMANA_APERTURA` AS `SEMANA_APERTURA`, `LHS`.`FECHA_INTERNACION` AS `FECHA_INTERNACION`, `LHS`.`CUIDADO_INTENSIVO` AS `CUIDADO_INTENSIVO`, `LHS`.`FECHA_CUIDADO_INTENSIVO` AS `FECHA_CUIDADO_INTENSIVO`, `LHS`.`FALLECIDO` AS `FALLECIDO`, `LHS`.`FECHA_FALLECIMIENTO` AS `FECHA_FALLECIMIENTO`, `LHS`.`ASISTENCIA_RESPIRATORIA_MECANICA` AS `ASISTENCIA_RESPIRATORIA_MECANICA`, `LHS`.`ID_ORIGEN_FINANCIAMIENTO` AS `ID_ORIGEN_FINANCIAMIENTO`, `LHS`.`ID_CLASIFICACION` AS `ID_CLASIFICACION`, `LHS`.`ID_CLASIFICACION_DETALLE` AS `ID_CLASIFICACION_DETALLE`, `LHS`.`FECHA_DIAGNOSTICO` AS `FECHA_DIAGNOSTICO`, `RHS`.`TIPO_EDAD` AS `TIPO_EDAD`
FROM `COVID_CASOS_ARG` AS `LHS`
LEFT JOIN `COVID_TIPO_EDAD` AS `RHS`
ON (`LHS`.`ID_TIPO_EDAD` = `RHS`.`ID_TIPO_EDAD`)
) `LHS`
LEFT JOIN `COVID_CLASIFICACION` AS `RHS`
ON (`LHS`.`ID_CLASIFICACION` = `RHS`.`ID_CLASIFICACION`)
) `LHS`
LEFT JOIN (SELECT `ID_CLASIFICACION_DETALLE`, `CLASIFICACION_DETALLE`
FROM `COVID_CLASIFICACION_DETALLE`) `RHS`
ON (`LHS`.`ID_CLASIFICACION_DETALLE` = `RHS`.`ID_CLASIFICACION_DETALLE`)
) `dbplyr_053`) `dbplyr_054`) `dbplyr_055`
GROUP BY `Edad_rangos`) `dbplyr_056`
LS0tCnRpdGxlOiAiUiAvIFNRTCIKc3VidGl0bGU6ICJSYWZhZWwgWmFtYnJhbm8iCm91dHB1dDogaHRtbF9ub3RlYm9vawotLS0KCgpgYGB7ciBzZXR1cCwgaW5jbHVkZT1GQUxTRX0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KGVjaG8gPSBULCBtZXNzYWdlID0gRkFMU0UsIHdhcm5pbmcgPSBGQUxTRSxmaWcud2lkdGg9MjAsIGZpZy5oZWlnaHQ9OCkKYGBgCgoKIyMgTGlicmVyw61hcwpgYGB7cn0KbGlicmFyeShSTWFyaWFEQikgIyBQYXJhIGJhc2UgZGUgZGF0b3MgTXlzcWwKbGlicmFyeSh0aWR5dmVyc2UpICNQYXJhIG1hbmlwdWxhY2lvbiBkZSBkYXRvcwpsaWJyYXJ5KHBsb3RseSkgIyBHcmFmaWNvcyBkaW5hbWljb3MKbGlicmFyeShnZ3NjaSkgI3BhbGV0YXMgZGUgY29sb3JlcwpsaWJyYXJ5KGZsZXh0YWJsZSkgI1RhYmxhcyBjb24gZm9ybWF0byBpbmZvcm1lIGFjYWRlbWljbwpgYGAKCgojIyBDb25leGlvbgpgYGB7ciwgZXZhbD1GQUxTRX0KY29uZXhpb24gPC0gZGJDb25uZWN0KFJNYXJpYURCOjpNYXJpYURCKCksCiAgICAgICAgICAgICAgICAgICAgICAgdXNlciA9J3Jvb3QnLAogICAgICAgICAgICAgICAgICAgICAgIHBhc3N3b3JkID0iIiwKICAgICAgICAgICAgICAgICAgICAgICBkYm5hbWUgPSdDTEFTRVNfQkQnLAogICAgICAgICAgICAgICAgICAgICAgIGhvc3QgPSdsb2NhbGhvc3QnKQpgYGAKCiogUGFyYSB2ZXIgZWwgbGlzdGFkbyBkZSB0YWJsYXMgZGUgbGEgYmFzZSBkZSBkYXRvczoKYGBge3J9CmRiTGlzdFRhYmxlcyhjb25leGlvbikKYGBgCgojIyBMZWN0dXJhIGRlIFRhYmxhcyBkZSBNeXNxbApgYGB7cn0KQ09WSURfQ0FTT1NfQVJHID0gdGJsKGNvbmV4aW9uLCJDT1ZJRF9DQVNPU19BUkciKQpDT1ZJRF9DTEFTSUZJQ0FDSU9OID0gdGJsKGNvbmV4aW9uLCJDT1ZJRF9DTEFTSUZJQ0FDSU9OIikKQ09WSURfQ0xBU0lGSUNBQ0lPTl9ERVRBTExFID0gdGJsKGNvbmV4aW9uLCJDT1ZJRF9DTEFTSUZJQ0FDSU9OX0RFVEFMTEUiKQpDT1ZJRF9ERVBBUlRBTUVOVE8gPSB0YmwoY29uZXhpb24sIkNPVklEX0RFUEFSVEFNRU5UTyIpCkNPVklEX09SSUdFTl9GSU5BTkNJQU1JRU5UTyA9IHRibChjb25leGlvbiwiQ09WSURfT1JJR0VOX0ZJTkFOQ0lBTUlFTlRPIikKQ09WSURfUEFJUyA9IHRibChjb25leGlvbiwiQ09WSURfUEFJUyIpCkNPVklEX1BST1ZJTkNJQSA9IHRibChjb25leGlvbiwiQ09WSURfUFJPVklOQ0lBIikKQ09WSURfU0VYTyA9IHRibChjb25leGlvbiwiQ09WSURfU0VYTyIpCkNPVklEX1NJTk8gPSB0YmwoY29uZXhpb24sIkNPVklEX1NJTk8iKQpDT1ZJRF9USVBPX0VEQUQgPSB0YmwoY29uZXhpb24sIkNPVklEX1RJUE9fRURBRCIpCmBgYAoKCiMjIEFjdGl2aWRhZGVzOiBSZWFsaXphciBsYXMgY29uc3VsdGFzIHBhcmEgb2J0ZW5lciBsYSBzaWd1aWVudGUgaW5mb3JtYWNpb8yBbjoKCiogQXJtYXIgOSBncnVwb3MgZXRhcmlvcyAoZWwgcHJpbWVybyBkZSAwIGEgOSBhbsyDb3MsIGVsIHNlZ3VuZG8gZGUgMTAgYSAxOSwgLi4uLCBlbCBhbnRldcyBbHRpbW8gZGUgNzAgYSA3OSB5IGVsIHXMgWx0aW1vIHBhcmEgbGFzIHBlcnNvbmFzIG1heW9yZXMgYSA4MCBhbsyDb3MpLiBDYWxjdWxhciBsYSBjYW50aWRhZCBkZSBjYXNvcyBjb25maXJtYWRvcywgZmFsbGVjaWRvcyB5IHRhc2EgZGUgbGV0YWxpZGFkIHBhcmEgY2FkYSBncnVwby4KCmBgYHtyICx9CkNPVklEX0NBU09TX0FSRyAlPiUgCiAgbGVmdF9qb2luKENPVklEX1RJUE9fRURBRCkgJT4lIAogIGxlZnRfam9pbihDT1ZJRF9DTEFTSUZJQ0FDSU9OKSAlPiUgCiAgbGVmdF9qb2luKENPVklEX0NMQVNJRklDQUNJT05fREVUQUxMRSAlPiUgCiAgICAgICAgICAgICAgc2VsZWN0KC1JRF9DTEFTSUZJQ0FDSU9OKSkgJT4lIAogIG11dGF0ZShFREFEID0gaWZlbHNlKFRJUE9fRURBRCA9PSAiTWVzZXMiLEVEQUQvMTIsRURBRCkpICU+JSAKICBtdXRhdGUoRWRhZF9yYW5nb3MgPSBjYXNlX3doZW4oRURBRCA8IDEwIH4gIjEiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFREFEIDwgMjAgfiAiMiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVEQUQgPCAzMCB+ICIyIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRURBRCA8IDQwIH4gIjMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFREFEIDwgNTAgfiAiNCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVEQUQgPCA2MCB+ICI1IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRURBRCA8IDcwIH4gIjYiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFREFEIDwgODAgfiAiNyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFQgfiAiOCIpKSAlPiUgCiAgZ3JvdXBfYnkoRWRhZF9yYW5nb3MpICU+JSAKICBzdW1tYXJpc2UoY29uZmlyYW1kb3MgPSBzdW0oQ0xBU0lGSUNBQ0lPTiA9PSAiQ29uZmlybWFkbyIpLAogICAgICAgICAgICBmYWxsZWNpZG9zID0gc3VtKENMQVNJRklDQUNJT05fREVUQUxMRSA9PSAiQ2FzbyBjb25maXJtYWRvIC0gRmFsbGVjaWRvIikpICU+JSAKICBtdXRhdGUobGV0YWxpZGFkID0gZmFsbGVjaWRvcy9jb25maXJhbWRvcykKYGBgCgoKKiBQYXJhIHBvZGVyIGd1YXJkYXIgbGEgc2FsaWRhIGVuIHVuYSB2YXJpYWJsZSBzb2xvIGhhY2UgZmFsdGEgYWdyZWdhciBsYSBmdW5jaW9uICoqImNvbGxlY3QoKSIqKiBhbCBmaW5hbCBkZSBsYSBzZW50ZW5jaWEsIHkgYXNpZ25hciB1biBub21icmUgYSBsYSBkYXRhLCBlbiBlc3RlIGNhc28gInByZWd1bnRhXzEiCgoKYGBge3J9CnByZWd1bnRhXzEgPSBDT1ZJRF9DQVNPU19BUkcgJT4lIAogIGxlZnRfam9pbihDT1ZJRF9USVBPX0VEQUQpICU+JSAKICBsZWZ0X2pvaW4oQ09WSURfQ0xBU0lGSUNBQ0lPTikgJT4lIAogIGxlZnRfam9pbihDT1ZJRF9DTEFTSUZJQ0FDSU9OX0RFVEFMTEUgJT4lIAogICAgICAgICAgICAgIHNlbGVjdCgtSURfQ0xBU0lGSUNBQ0lPTikpICU+JSAKICBtdXRhdGUoRURBRCA9IGlmZWxzZShUSVBPX0VEQUQgPT0gIk1lc2VzIixFREFELzEyLEVEQUQpKSAlPiUgCiAgbXV0YXRlKEVkYWRfcmFuZ29zID0gY2FzZV93aGVuKEVEQUQgPCAxMCB+ICIxIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRURBRCA8IDIwIH4gIjIiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFREFEIDwgMzAgfiAiMiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVEQUQgPCA0MCB+ICIzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRURBRCA8IDUwIH4gIjQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFREFEIDwgNjAgfiAiNSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVEQUQgPCA3MCB+ICI2IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRURBRCA8IDgwIH4gIjciLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUIH4gIjgiKSkgJT4lIAogIGdyb3VwX2J5KEVkYWRfcmFuZ29zKSAlPiUgCiAgc3VtbWFyaXNlKGNvbmZpcmFtZG9zID0gc3VtKENMQVNJRklDQUNJT04gPT0gIkNvbmZpcm1hZG8iKSwKICAgICAgICAgICAgZmFsbGVjaWRvcyA9IHN1bShDTEFTSUZJQ0FDSU9OX0RFVEFMTEUgPT0gIkNhc28gY29uZmlybWFkbyAtIEZhbGxlY2lkbyIpKSAlPiUgCiAgbXV0YXRlKGxldGFsaWRhZCA9IGZhbGxlY2lkb3MvY29uZmlyYW1kb3MpICU+JSAKICBjb2xsZWN0KCkKYGBgCgoKYGBge3J9CmZsZXh0YWJsZShwcmVndW50YV8xKQpgYGAKCmBgYHtyfQpwMSA9IHByZWd1bnRhXzEgJT4lIAogIG11dGF0ZShFZGFkX3JhbmdvcyA9IGFzLmZhY3RvcihFZGFkX3JhbmdvcykpICU+JSAKICBwaXZvdF9sb25nZXIoLUVkYWRfcmFuZ29zLCBuYW1lc190byA9ICJFc3RhdHVzIiwgdmFsdWVzX3RvID0gIkNhc29zIikgJT4lIAogIGdncGxvdChhZXMoZmlsbCA9IEVkYWRfcmFuZ29zLCB5ID0gQ2Fzb3MsIHggPSBFZGFkX3JhbmdvcykpICsgCiAgZ2VvbV9iYXIocG9zaXRpb249InN0YWNrIiwgc3RhdD0iaWRlbnRpdHkiKSArCiAgdGhlbWVfbWluaW1hbCgpICsKICBzY2FsZV9maWxsX2pjbygpICsKICBmYWNldF93cmFwKH5Fc3RhdHVzLCBzY2FsZXMgPSAiZnJlZSIpICsKICBnZ3RpdGxlKCJDb25maXJtYWRvcy9GYWxsZWNpZG9zL0xldGFsaWRhZCIpICsKICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpICsKICB4bGFiKCJSYW5nb3MgZGUgRWRhZCIpCgpnZ3Bsb3RseShwMSx3aWR0aCA9IDkwMCwgaGVpZ2h0ID0gNTAwKQpgYGAKCgojIyDCv0NvbW8gUiBjb25zdWx0YSBsb3MgZGF0b3MgZW4gdW5hIGJhc2UgZXN0cnVjdHVyYWRhIHNpbiBlc2NyaWJpciBlbiBTUUwgPwoKKiBBIHRyYXbDqXMgZGVsIHVuaXZlcnNvIGRlIHBhcXVldGVzIGRlIHRpZHl2ZXJzZSBlc3BlY8OtZmljYW1lbnRlICoqImRwbHlyIioqIHkgKioiZGJwbHlyIioqIHNlIHRyYWR1Y2UgYXV0b23DoXRpY2FtZW50ZSBsYSBzaW50YXhpcyBSIGEgU1FMLCBhIGNvbnRpbnVhY2nDs24gc2UgbXVlc3RyYSBsYSB0cmFkdWNjacOzbiBhIFNRTCBxdWUgcmVhbGl6YSBSIGJham8gZWwgY2Fww7MsIHNpbXBsZW1lbnRlIGFncmVnYW5kbyBsYSBmdW5jacOzbiAqKiJzaG93X3F1ZXJ5IioqIGVuIGx1Z2FyIGRlICoqImNvbGxlY3QiKiogYWwgZmluYWwgZGUgbGEgc2VudGVuY2lhLiBFbiBsYSBzYWxpZGEgcG9kcsOhbiBub3RhciBxdWUgc2UgZW51bWVyYW4gdG9kb3MgbG9zIGNhbXBvcyBlbiBsdWdhciBkZSB1c2FyICIqIgoKCmBgYHtyfQpDT1ZJRF9DQVNPU19BUkcgJT4lIAogIGxlZnRfam9pbihDT1ZJRF9USVBPX0VEQUQpICU+JSAKICBsZWZ0X2pvaW4oQ09WSURfQ0xBU0lGSUNBQ0lPTikgJT4lIAogIGxlZnRfam9pbihDT1ZJRF9DTEFTSUZJQ0FDSU9OX0RFVEFMTEUgJT4lIAogICAgICAgICAgICAgIHNlbGVjdCgtSURfQ0xBU0lGSUNBQ0lPTikpICU+JSAKICBtdXRhdGUoRURBRCA9IGlmZWxzZShUSVBPX0VEQUQgPT0gIk1lc2VzIixFREFELzEyLEVEQUQpKSAlPiUgCiAgbXV0YXRlKEVkYWRfcmFuZ29zID0gY2FzZV93aGVuKEVEQUQgPCAxMCB+ICIxIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRURBRCA8IDIwIH4gIjIiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFREFEIDwgMzAgfiAiMiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVEQUQgPCA0MCB+ICIzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRURBRCA8IDUwIH4gIjQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFREFEIDwgNjAgfiAiNSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVEQUQgPCA3MCB+ICI2IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRURBRCA8IDgwIH4gIjciLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUIH4gIjgiKSkgJT4lIAogIGdyb3VwX2J5KEVkYWRfcmFuZ29zKSAlPiUgCiAgc3VtbWFyaXNlKGNvbmZpcmFtZG9zID0gc3VtKENMQVNJRklDQUNJT04gPT0gIkNvbmZpcm1hZG8iKSwKICAgICAgICAgICAgZmFsbGVjaWRvcyA9IHN1bShDTEFTSUZJQ0FDSU9OX0RFVEFMTEUgPT0gIkNhc28gY29uZmlybWFkbyAtIEZhbGxlY2lkbyIpKSAlPiUgCiAgbXV0YXRlKGxldGFsaWRhZCA9IGZhbGxlY2lkb3MvY29uZmlyYW1kb3MpICU+JSAKICBzaG93X3F1ZXJ5KCkKYGBgCgoKCgoK