CALCULAR TASA DE NATALIDAD (por 1,000 habitantes)

Es importante recordar que se trabajará con una base de datos externa, por lo tanto será llamada al script y se accederá a ella por medio del nombre “df”.

# -> CALCULAR TASA DE NATALIDAD

# Obtención de df

df <- read.csv('/Volumes/JESUS SSD/TRABAJOS EPIGENETICA/estadisticas_vitales_mexico_2018_2021.csv')

# Datos
nacimientos <- df$nacimientos_registrados # Número de nacimientos en un año 
total_poblacion <- df$poblacion_total # Población total en ese año 


# Cálculo de la tasa de natalidad 
tasa_natalidad <- (nacimientos / total_poblacion) * 1000

# Resultado
cat("Tasa de natalidad:", 
    # decidí sacar el promedio porque de la forma básica me arroja 3 vectores.
    mean(tasa_natalidad, na.rm = TRUE), 
    "nacimientos por cada 1,000 habitantes durante el periodo 2018-2021\n")
Tasa de natalidad: 15.49277 nacimientos por cada 1,000 habitantes durante el periodo 2018-2021
df$tasa_natalidad <- (df$nacimientos_registrados / df$poblacion_total) * 1000

df[, c("año", "tasa_natalidad")]
NA

SE HARÁ USO DE LA LIBRERIA ggplot2 PARA VISUALIZAR LOS DATOS.

# Visualización 
library(ggplot2)


# calcular tasas de natalidad 
df$tasa_natalidad <- (df$nacimientos_registrados / df$poblacion_total) * 1000

# Gráfico
ggplot(df, aes(x = año, y = tasa_natalidad, fill = año)) +
  geom_bar(stat = "identity") +
  geom_text(aes(label = round(tasa_natalidad, 2)), vjust = -0.3, size = 4
  ) +
  labs(title = "Tasa de natalidad por año", x = "Año", y = "Tasa de natalidad (por 1,000 habitantes)"
  ) +
  theme_classic()

CALCULAR TASA DE MORTALIDAD (por 1,000 habitantes)

# Calculo de la tasa de mortalidad 

tasa_mortalidad <- (df$defunciones_registradas/df$poblacion_total) * 1000

df$tasa_mortalidad <- (df$defunciones_registradas / df$poblacion_total) * 1000

df[, c("año", "tasa_mortalidad")]


# Resultado
cat("Tasa de mortalidad:", 
    # decidí sacar el promedio porque de la forma básica me arroja 3 vectores.
    mean(tasa_mortalidad, na.rm = TRUE), 
    "muertes por cada 1,000 habitantes durante el periodo 2018-2021\n")
Tasa de mortalidad: 7.303069 muertes por cada 1,000 habitantes durante el periodo 2018-2021

SE HARÁ USO DE LA LIBRERIA ggplot2 PARA VISUALIZAR LOS DATOS.

CALCULAR INCREMENTO NATURAL (por 1,000 habitantes)

La formula para calcular el incremento natural es:

Tasa de natalidad - Tasa de mortalidad = Incremento natural

incremento_natural <- (tasa_natalidad - tasa_mortalidad)

df$incremento_natural <- df$tasa_natalidad - df$tasa_mortalidad

df[, c("año", "incremento_natural")]

# Resultado
cat("Incremento natural", 
    # decidí sacar el promedio porque de la forma básica me arroja 3 vectores.
    mean(incremento_natural, na.rm = TRUE), 
    "por cada 1,000 habitantes durante el periodo 2018-2021\n")
Incremento natural 8.189702 por cada 1,000 habitantes durante el periodo 2018-2021
str(df)
'data.frame':   4 obs. of  9 variables:
 $ año                          : int  2018 2019 2020 2021
 $ poblacion_total              : int  124738000 125930000 126014024 126705138
 $ nacimientos_registrados      : int  2162535 2092214 1629211 1912178
 $ defunciones_registradas      : int  722611 747784 1086743 1122249
 $ incremento_natural           : num  11.54 10.68 4.3 6.23
 $ casos_covid_confirmados      : int  0 0 1437185 NA
 $ defunciones_covid_confirmadas: int  0 0 126507 NA
 $ tasa_natalidad               : num  17.3 16.6 12.9 15.1
 $ tasa_mortalidad              : num  5.79 5.94 8.62 8.86

SE HARÁ USO DE LA LIBRERIA ggplot2 PARA VISUALIZAR LOS DATOS.

library(ggplot2)

ggplot(df, aes(x = año, y = incremento_natural)) +
  geom_line(linewidth = 1) +
  geom_point(size = 3) +
  geom_text(
    aes(label = round(incremento_natural, 2)),
    vjust = -1.5,
    size = 4
  ) +
  scale_y_continuous(expand = expansion(mult = c(0.05, 0.2))) +
  labs(
    title = "Dinámica del incremento natural de la población",
    x = "Año",
    y = "Incremento natural (por cada 1,000 habitantes)"
  ) +
  theme_minimal()

CALCULAR TASA DE LETALIDAD POR COVID-19 (%) DONDE EXISTAN CASOS

# Resultado
cat("Letalidad por Covid-19 fue de", 
    # decidí sacar el promedio porque de la forma básica me arroja 3 vectores.
    mean(porc_letalidad, na.rm = TRUE), 
    "% durante 2020.\n ")
Letalidad por Covid-19 fue de 8.802416 % durante 2020.
 
df$letalidad_covid <- (df$defunciones_covid_confirmadas / df$casos_covid_confirmados) * 100

df[, c("año", "letalidad_covid")]

df_letalidad <- df[df$casos_covid_confirmados > 0, c("año", "letalidad_covid")]

df_letalidad
NA

La letalidad solo se calculó para el año en el que se registraron casos confirmados, ya que en los otros años no hubo casos, por lo que la letalidad no es estadísticamente calculable.

SE HARÁ USO DE LA LIBRERIA ggplot2 PARA VISUALIZAR LOS DATOS.

letalidad_valida <- letalidad[!is.na(letalidad) & !is.nan(letalidad)]
valores <- c(
  Letalidad = letalidad_valida,
  "No letalidad" = 1 - letalidad_valida
)
pie(
  valores,
  labels = paste0(names(valores), ": ", round(valores * 100, 2), "%"),
  main = "Letalidad por Covid-19 en el año 2020",
  col = c("firebrick", "blue")
)

USO DE FLEXTABLE

Petición:

Construye una con flextable que incluya: anio, poblacion_total, nacimientos_registrados, defunciones_registradas, incremento_natural y las tasas calculadas.

# Crear el conjunto de datos 

library(flextable)

datos <- data.frame(
  año = c(2018, 2019, 2020, 2021),
  poblacion_total = c(124738000, 125930000, 126014024, 126705138),
  nacimientos_registrados = c(2162535, 2092214, 1629211, 1912178),
  defunciones_registradas = c(722611, 747784, 1086743, 1122249),
  casos_covid_confirmados = c(0, 0, 1437185, 0),
  defunciones_covid_confirmadas = c(0, 0, 126507, 0)
)

datos$tasa_natalidad <- (datos$nacimientos_registrados /
                         datos$poblacion_total) * 1000

datos$tasa_mortalidad <- (datos$defunciones_registradas /
                          datos$poblacion_total) * 1000

datos$incremento_natural <- datos$tasa_natalidad - datos$tasa_mortalidad

datos$tasa_letalidad <- (datos$defunciones_covid_confirmadas / datos$casos_covid_confirmados) * 100

# Redondear solo columnas númericas
datos_redondeados <- datos %>%
  mutate_if(is.numeric, round, 2)

# Crear la tabla con flextable
flextable(datos_redondeados) %>%
  autofit()

año

poblacion_total

nacimientos_registrados

defunciones_registradas

casos_covid_confirmados

defunciones_covid_confirmadas

tasa_natalidad

tasa_mortalidad

incremento_natural

tasa_letalidad

2,018

124,738,000

2,162,535

722,611

0

0

17.34

5.79

11.54

2,019

125,930,000

2,092,214

747,784

0

0

16.61

5.94

10.68

2,020

126,014,024

1,629,211

1,086,743

1,437,185

126,507

12.93

8.62

4.30

8.8

2,021

126,705,138

1,912,178

1,122,249

0

0

15.09

8.86

6.23

Preguntas:

  1. ¿En qué año se observa la mayor tasa de mortalidad y cómo se relaciona con la pandemia?

    • Se observa un incremento en la mortalidad, se puede entender que la pandemia incrementó los numeros de muertes en la población.
  2. ¿Cómo cambia la tasa de natalidad entre 2018 y 2021?

    • Se presentó una reducción de la tasa de natalidad. El año con la tasa más baja fue en 2020.
  3. ¿Qué ocurre con el incremento natural durante ese periodo?

    • Cae a pique en 2020 e intenta subir un poco si nivel en 2021, siendo 2018 el año con los números más altos.
  4. ¿Qué significa la tasa de letalidad por COVID-19 que obtuviste para 2020?

    • Representa el porcentaje de personas que fallecen entre quienes padecieron de Covid-19.
LS0tCnRpdGxlOiAiQW7DoWxpc2lzIGRlIEVzdGFkw61zdGljYXMgVml0YWxlcyBlbiBNw6l4aWNvICgyMDE44oCTMjAyMSkgLSBUQVJFQSIKYXV0aG9yOiAiTENCTS4gSmVzw7pzIEFuZ2VsIEhlcm7DoW5kZXogQ2jDoXZleiIKZGF0ZTogIjEyIGRlIGRpY2llbWJyZSAyMDI1IgpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sKLS0tCgojIyBDQUxDVUxBUiBUQVNBIERFIE5BVEFMSURBRCAocG9yIDEsMDAwIGhhYml0YW50ZXMpCgo+ICpFcyBpbXBvcnRhbnRlIHJlY29yZGFyIHF1ZSBzZSB0cmFiYWphcsOhIGNvbiB1bmEgYmFzZSBkZSBkYXRvcyBleHRlcm5hLCBwb3IgbG8gdGFudG8gc2Vyw6EgbGxhbWFkYSBhbCBzY3JpcHQgeSBzZSBhY2NlZGVyw6EgYSBlbGxhIHBvciBtZWRpbyBkZWwgbm9tYnJlICJkZiIuKgoKYGBge3J9CiMgLT4gQ0FMQ1VMQVIgVEFTQSBERSBOQVRBTElEQUQKCiMgT2J0ZW5jacOzbiBkZSBkZgoKZGYgPC0gcmVhZC5jc3YoJy9Wb2x1bWVzL0pFU1VTIFNTRC9UUkFCQUpPUyBFUElHRU5FVElDQS9lc3RhZGlzdGljYXNfdml0YWxlc19tZXhpY29fMjAxOF8yMDIxLmNzdicpCgojIERhdG9zCm5hY2ltaWVudG9zIDwtIGRmJG5hY2ltaWVudG9zX3JlZ2lzdHJhZG9zICMgTsO6bWVybyBkZSBuYWNpbWllbnRvcyBlbiB1biBhw7FvIAp0b3RhbF9wb2JsYWNpb24gPC0gZGYkcG9ibGFjaW9uX3RvdGFsICMgUG9ibGFjacOzbiB0b3RhbCBlbiBlc2UgYcOxbyAKCgojIEPDoWxjdWxvIGRlIGxhIHRhc2EgZGUgbmF0YWxpZGFkIAp0YXNhX25hdGFsaWRhZCA8LSAobmFjaW1pZW50b3MgLyB0b3RhbF9wb2JsYWNpb24pICogMTAwMAoKIyBSZXN1bHRhZG8KY2F0KCJUYXNhIGRlIG5hdGFsaWRhZDoiLCAKICAgICMgZGVjaWTDrSBzYWNhciBlbCBwcm9tZWRpbyBwb3JxdWUgZGUgbGEgZm9ybWEgYsOhc2ljYSBtZSBhcnJvamEgMyB2ZWN0b3Jlcy4KICAgIG1lYW4odGFzYV9uYXRhbGlkYWQsIG5hLnJtID0gVFJVRSksIAogICAgIm5hY2ltaWVudG9zIHBvciBjYWRhIDEsMDAwIGhhYml0YW50ZXMgZHVyYW50ZSBlbCBwZXJpb2RvIDIwMTgtMjAyMVxuIikKCmRmJHRhc2FfbmF0YWxpZGFkIDwtIChkZiRuYWNpbWllbnRvc19yZWdpc3RyYWRvcyAvIGRmJHBvYmxhY2lvbl90b3RhbCkgKiAxMDAwCgpkZlssIGMoImHDsW8iLCAidGFzYV9uYXRhbGlkYWQiKV0KCmBgYAoKIyMjIFNFIEhBUsOBIFVTTyBERSBMQSBMSUJSRVJJQSBnZ3Bsb3QyIFBBUkEgVklTVUFMSVpBUiBMT1MgREFUT1MuCgpgYGB7cn0KIyBWaXN1YWxpemFjacOzbiAKbGlicmFyeShnZ3Bsb3QyKQoKCiMgY2FsY3VsYXIgdGFzYXMgZGUgbmF0YWxpZGFkIApkZiR0YXNhX25hdGFsaWRhZCA8LSAoZGYkbmFjaW1pZW50b3NfcmVnaXN0cmFkb3MgLyBkZiRwb2JsYWNpb25fdG90YWwpICogMTAwMAoKIyBHcsOhZmljbwpnZ3Bsb3QoZGYsIGFlcyh4ID0gYcOxbywgeSA9IHRhc2FfbmF0YWxpZGFkLCBmaWxsID0gYcOxbykpICsKICBnZW9tX2JhcihzdGF0ID0gImlkZW50aXR5IikgKwogIGdlb21fdGV4dChhZXMobGFiZWwgPSByb3VuZCh0YXNhX25hdGFsaWRhZCwgMikpLCB2anVzdCA9IC0wLjMsIHNpemUgPSA0CiAgKSArCiAgbGFicyh0aXRsZSA9ICJUYXNhIGRlIG5hdGFsaWRhZCBwb3IgYcOxbyIsIHggPSAiQcOxbyIsIHkgPSAiVGFzYSBkZSBuYXRhbGlkYWQgKHBvciAxLDAwMCBoYWJpdGFudGVzKSIKICApICsKICB0aGVtZV9jbGFzc2ljKCkKYGBgCgojIyBDQUxDVUxBUiBUQVNBIERFIE1PUlRBTElEQUQgKHBvciAxLDAwMCBoYWJpdGFudGVzKQoKYGBge3J9CiMgQ2FsY3VsbyBkZSBsYSB0YXNhIGRlIG1vcnRhbGlkYWQgCgp0YXNhX21vcnRhbGlkYWQgPC0gKGRmJGRlZnVuY2lvbmVzX3JlZ2lzdHJhZGFzL2RmJHBvYmxhY2lvbl90b3RhbCkgKiAxMDAwCgpkZiR0YXNhX21vcnRhbGlkYWQgPC0gKGRmJGRlZnVuY2lvbmVzX3JlZ2lzdHJhZGFzIC8gZGYkcG9ibGFjaW9uX3RvdGFsKSAqIDEwMDAKCmRmWywgYygiYcOxbyIsICJ0YXNhX21vcnRhbGlkYWQiKV0KCgojIFJlc3VsdGFkbwpjYXQoIlRhc2EgZGUgbW9ydGFsaWRhZDoiLCAKICAgICMgZGVjaWTDrSBzYWNhciBlbCBwcm9tZWRpbyBwb3JxdWUgZGUgbGEgZm9ybWEgYsOhc2ljYSBtZSBhcnJvamEgMyB2ZWN0b3Jlcy4KICAgIG1lYW4odGFzYV9tb3J0YWxpZGFkLCBuYS5ybSA9IFRSVUUpLCAKICAgICJtdWVydGVzIHBvciBjYWRhIDEsMDAwIGhhYml0YW50ZXMgZHVyYW50ZSBlbCBwZXJpb2RvIDIwMTgtMjAyMVxuIikKCgpgYGAKCiMjIyBTRSBIQVLDgSBVU08gREUgTEEgTElCUkVSSUEgZ2dwbG90MiBQQVJBIFZJU1VBTElaQVIgTE9TIERBVE9TLgoKYGBge3J9CiMgVmlzdWFsaXphY2nDs24gCmxpYnJhcnkoZ2dwbG90MikKCgojIGNhbGN1bGFyIHRhc2FzIGRlIG5hdGFsaWRhZCAKZGYkdGFzYV9tb3J0YWxpZGFkIDwtIChkZiRkZWZ1bmNpb25lc19yZWdpc3RyYWRhcyAvIGRmJHBvYmxhY2lvbl90b3RhbCkgKiAxMDAwCgoKCiMgR3LDoWZpY28KZ2dwbG90KGRmLCBhZXMoeCA9IGHDsW8sIHkgPSB0YXNhX21vcnRhbGlkYWQsIGZpbGwgPSBhw7FvKSkgKwogICMgZ2VvbV9jb2woZmlsbCA9ICJzdGVlbGJsdWUiKSArCiAgZ2VvbV9iYXIoc3RhdCA9ICJpZGVudGl0eSIpICsKICBnZW9tX3RleHQoYWVzKGxhYmVsID0gcm91bmQodGFzYV9tb3J0YWxpZGFkLCAyKSksIHZqdXN0ID0gLTAuMywgc2l6ZSA9IDQpICsKICBsYWJzKHRpdGxlID0gIlRhc2EgZGUgbW9ydGFsaWRhZCBwb3IgYcOxbyIsIHggPSAiQcOxbyIsIHkgPSAiVGFzYSBkZSBtb3J0YWxpZGFkIChwb3IgMSwwMDAgaGFiaXRhbnRlcykiKSArCiAgdGhlbWVfY2xhc3NpYygpCmBgYAoKIyMgQ0FMQ1VMQVIgSU5DUkVNRU5UTyBOQVRVUkFMIChwb3IgMSwwMDAgaGFiaXRhbnRlcykKCj4gTGEgZm9ybXVsYSBwYXJhIGNhbGN1bGFyIGVsIGluY3JlbWVudG8gbmF0dXJhbCBlczoKPgo+ICpUYXNhIGRlIG5hdGFsaWRhZCAtIFRhc2EgZGUgbW9ydGFsaWRhZCA9IEluY3JlbWVudG8gbmF0dXJhbCoKCmBgYHtyfQppbmNyZW1lbnRvX25hdHVyYWwgPC0gKHRhc2FfbmF0YWxpZGFkIC0gdGFzYV9tb3J0YWxpZGFkKQoKZGYkaW5jcmVtZW50b19uYXR1cmFsIDwtIGRmJHRhc2FfbmF0YWxpZGFkIC0gZGYkdGFzYV9tb3J0YWxpZGFkCgpkZlssIGMoImHDsW8iLCAiaW5jcmVtZW50b19uYXR1cmFsIildCgojIFJlc3VsdGFkbwpjYXQoIkluY3JlbWVudG8gbmF0dXJhbCIsIAogICAgIyBkZWNpZMOtIHNhY2FyIGVsIHByb21lZGlvIHBvcnF1ZSBkZSBsYSBmb3JtYSBiw6FzaWNhIG1lIGFycm9qYSAzIHZlY3RvcmVzLgogICAgbWVhbihpbmNyZW1lbnRvX25hdHVyYWwsIG5hLnJtID0gVFJVRSksIAogICAgInBvciBjYWRhIDEsMDAwIGhhYml0YW50ZXMgZHVyYW50ZSBlbCBwZXJpb2RvIDIwMTgtMjAyMVxuIikKYGBgCgpgYGB7cn0Kc3RyKGRmKQpgYGAKCgojIyMgU0UgSEFSw4EgVVNPIERFIExBIExJQlJFUklBIGdncGxvdDIgUEFSQSBWSVNVQUxJWkFSIExPUyBEQVRPUy4KCmBgYHtyfQpsaWJyYXJ5KGdncGxvdDIpCgpnZ3Bsb3QoZGYsIGFlcyh4ID0gYcOxbywgeSA9IGluY3JlbWVudG9fbmF0dXJhbCkpICsKICBnZW9tX2xpbmUobGluZXdpZHRoID0gMSkgKwogIGdlb21fcG9pbnQoc2l6ZSA9IDMpICsKICBnZW9tX3RleHQoCiAgICBhZXMobGFiZWwgPSByb3VuZChpbmNyZW1lbnRvX25hdHVyYWwsIDIpKSwKICAgIHZqdXN0ID0gLTEuNSwKICAgIHNpemUgPSA0CiAgKSArCiAgc2NhbGVfeV9jb250aW51b3VzKGV4cGFuZCA9IGV4cGFuc2lvbihtdWx0ID0gYygwLjA1LCAwLjIpKSkgKwogIGxhYnMoCiAgICB0aXRsZSA9ICJEaW7DoW1pY2EgZGVsIGluY3JlbWVudG8gbmF0dXJhbCBkZSBsYSBwb2JsYWNpw7NuIiwKICAgIHggPSAiQcOxbyIsCiAgICB5ID0gIkluY3JlbWVudG8gbmF0dXJhbCAocG9yIGNhZGEgMSwwMDAgaGFiaXRhbnRlcykiCiAgKSArCiAgdGhlbWVfbWluaW1hbCgpCmBgYAoKIyMgQ0FMQ1VMQVIgVEFTQSBERSBMRVRBTElEQUQgUE9SIENPVklELTE5ICglKSBET05ERSBFWElTVEFOIENBU09TCgpgYGB7cn0KIyBSZXN1bHRhZG8KY2F0KCJMZXRhbGlkYWQgcG9yIENvdmlkLTE5IGZ1ZSBkZSIsIAogICAgIyBkZWNpZMOtIHNhY2FyIGVsIHByb21lZGlvIHBvcnF1ZSBkZSBsYSBmb3JtYSBiw6FzaWNhIG1lIGFycm9qYSAzIHZlY3RvcmVzLgogICAgbWVhbihwb3JjX2xldGFsaWRhZCwgbmEucm0gPSBUUlVFKSwgCiAgICAiJSBkdXJhbnRlIDIwMjAuXG4gIikKCmRmJGxldGFsaWRhZF9jb3ZpZCA8LSAoZGYkZGVmdW5jaW9uZXNfY292aWRfY29uZmlybWFkYXMgLyBkZiRjYXNvc19jb3ZpZF9jb25maXJtYWRvcykgKiAxMDAKCmRmWywgYygiYcOxbyIsICJsZXRhbGlkYWRfY292aWQiKV0KCmRmX2xldGFsaWRhZCA8LSBkZltkZiRjYXNvc19jb3ZpZF9jb25maXJtYWRvcyA+IDAsIGMoImHDsW8iLCAibGV0YWxpZGFkX2NvdmlkIildCgpkZl9sZXRhbGlkYWQKCmBgYAoKPiAqTGEgbGV0YWxpZGFkIHNvbG8gc2UgY2FsY3Vsw7MgcGFyYSBlbCBhw7FvIGVuIGVsIHF1ZSBzZSByZWdpc3RyYXJvbiBjYXNvcyBjb25maXJtYWRvcywgeWEgcXVlIGVuIGxvcyBvdHJvcyBhw7FvcyBubyBodWJvIGNhc29zLCBwb3IgbG8gcXVlIGxhIGxldGFsaWRhZCBubyBlcyBlc3RhZMOtc3RpY2FtZW50ZSBjYWxjdWxhYmxlLioKCiMjIyBTRSBIQVLDgSBVU08gREUgTEEgTElCUkVSSUEgZ2dwbG90MiBQQVJBIFZJU1VBTElaQVIgTE9TIERBVE9TLgoKYGBge3J9CmxldGFsaWRhZF92YWxpZGEgPC0gbGV0YWxpZGFkWyFpcy5uYShsZXRhbGlkYWQpICYgIWlzLm5hbihsZXRhbGlkYWQpXQp2YWxvcmVzIDwtIGMoCiAgTGV0YWxpZGFkID0gbGV0YWxpZGFkX3ZhbGlkYSwKICAiTm8gbGV0YWxpZGFkIiA9IDEgLSBsZXRhbGlkYWRfdmFsaWRhCikKcGllKAogIHZhbG9yZXMsCiAgbGFiZWxzID0gcGFzdGUwKG5hbWVzKHZhbG9yZXMpLCAiOiAiLCByb3VuZCh2YWxvcmVzICogMTAwLCAyKSwgIiUiKSwKICBtYWluID0gIkxldGFsaWRhZCBwb3IgQ292aWQtMTkgZW4gZWwgYcOxbyAyMDIwIiwKICBjb2wgPSBjKCJmaXJlYnJpY2siLCAiYmx1ZSIpCikKYGBgCgojIyMgVVNPIERFIEZMRVhUQUJMRQoKUGV0aWNpw7NuOgoKPiBDb25zdHJ1eWUgdW5hIGNvbiBmbGV4dGFibGUgcXVlIGluY2x1eWE6IGFuaW8sIHBvYmxhY2lvbl90b3RhbCwgbmFjaW1pZW50b3NfcmVnaXN0cmFkb3MsIGRlZnVuY2lvbmVzX3JlZ2lzdHJhZGFzLCBpbmNyZW1lbnRvX25hdHVyYWwgeSBsYXMgdGFzYXMgY2FsY3VsYWRhcy4KCmBgYHtyfQojIENyZWFyIGVsIGNvbmp1bnRvIGRlIGRhdG9zIAoKbGlicmFyeShmbGV4dGFibGUpCgpkYXRvcyA8LSBkYXRhLmZyYW1lKAogIGHDsW8gPSBjKDIwMTgsIDIwMTksIDIwMjAsIDIwMjEpLAogIHBvYmxhY2lvbl90b3RhbCA9IGMoMTI0NzM4MDAwLCAxMjU5MzAwMDAsIDEyNjAxNDAyNCwgMTI2NzA1MTM4KSwKICBuYWNpbWllbnRvc19yZWdpc3RyYWRvcyA9IGMoMjE2MjUzNSwgMjA5MjIxNCwgMTYyOTIxMSwgMTkxMjE3OCksCiAgZGVmdW5jaW9uZXNfcmVnaXN0cmFkYXMgPSBjKDcyMjYxMSwgNzQ3Nzg0LCAxMDg2NzQzLCAxMTIyMjQ5KSwKICBjYXNvc19jb3ZpZF9jb25maXJtYWRvcyA9IGMoMCwgMCwgMTQzNzE4NSwgMCksCiAgZGVmdW5jaW9uZXNfY292aWRfY29uZmlybWFkYXMgPSBjKDAsIDAsIDEyNjUwNywgMCkKKQoKZGF0b3MkdGFzYV9uYXRhbGlkYWQgPC0gKGRhdG9zJG5hY2ltaWVudG9zX3JlZ2lzdHJhZG9zIC8KICAgICAgICAgICAgICAgICAgICAgICAgIGRhdG9zJHBvYmxhY2lvbl90b3RhbCkgKiAxMDAwCgpkYXRvcyR0YXNhX21vcnRhbGlkYWQgPC0gKGRhdG9zJGRlZnVuY2lvbmVzX3JlZ2lzdHJhZGFzIC8KICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRvcyRwb2JsYWNpb25fdG90YWwpICogMTAwMAoKZGF0b3MkaW5jcmVtZW50b19uYXR1cmFsIDwtIGRhdG9zJHRhc2FfbmF0YWxpZGFkIC0gZGF0b3MkdGFzYV9tb3J0YWxpZGFkCgpkYXRvcyR0YXNhX2xldGFsaWRhZCA8LSAoZGF0b3MkZGVmdW5jaW9uZXNfY292aWRfY29uZmlybWFkYXMgLyBkYXRvcyRjYXNvc19jb3ZpZF9jb25maXJtYWRvcykgKiAxMDAKCiMgUmVkb25kZWFyIHNvbG8gY29sdW1uYXMgbsO6bWVyaWNhcwpkYXRvc19yZWRvbmRlYWRvcyA8LSBkYXRvcyAlPiUKICBtdXRhdGVfaWYoaXMubnVtZXJpYywgcm91bmQsIDIpCgojIENyZWFyIGxhIHRhYmxhIGNvbiBmbGV4dGFibGUKZmxleHRhYmxlKGRhdG9zX3JlZG9uZGVhZG9zKSAlPiUKICBhdXRvZml0KCkKYGBgCgojIyMgUHJlZ3VudGFzOgoKMS4gIMK/RW4gcXXDqSBhw7FvIHNlIG9ic2VydmEgbGEgbWF5b3IgdGFzYSBkZSBtb3J0YWxpZGFkIHkgY8OzbW8gc2UgcmVsYWNpb25hIGNvbiBsYSBwYW5kZW1pYT8KCiAgICAtICAgU2Ugb2JzZXJ2YSB1biBpbmNyZW1lbnRvIGVuIGxhIG1vcnRhbGlkYWQsIHNlIHB1ZWRlIGVudGVuZGVyIHF1ZSBsYSBwYW5kZW1pYSBpbmNyZW1lbnTDsyBsb3MgbnVtZXJvcyBkZSBtdWVydGVzIGVuIGxhIHBvYmxhY2nDs24uCgoyLiAgwr9Dw7NtbyBjYW1iaWEgbGEgdGFzYSBkZSBuYXRhbGlkYWQgZW50cmUgMjAxOCB5IDIwMjE/CgogICAgLSAgIFNlIHByZXNlbnTDsyB1bmEgcmVkdWNjacOzbiBkZSBsYSB0YXNhIGRlIG5hdGFsaWRhZC4gRWwgYcOxbyBjb24gbGEgdGFzYSBtw6FzIGJhamEgZnVlIGVuIDIwMjAuCgozLiAgwr9RdcOpIG9jdXJyZSBjb24gZWwgaW5jcmVtZW50byBuYXR1cmFsIGR1cmFudGUgZXNlIHBlcmlvZG8/CgogICAgLSAgIENhZSBhIHBpcXVlIGVuIDIwMjAgZSBpbnRlbnRhIHN1YmlyIHVuIHBvY28gc2kgbml2ZWwgZW4gMjAyMSwgc2llbmRvIDIwMTggZWwgYcOxbyBjb24gbG9zIG7Dum1lcm9zIG3DoXMgYWx0b3MuCgo0LiAgwr9RdcOpIHNpZ25pZmljYSBsYSB0YXNhIGRlIGxldGFsaWRhZCBwb3IgQ09WSUQtMTkgcXVlIG9idHV2aXN0ZSBwYXJhIDIwMjA/CgogICAgLSAgIFJlcHJlc2VudGEgZWwgcG9yY2VudGFqZSBkZSBwZXJzb25hcyBxdWUgZmFsbGVjZW4gZW50cmUgcXVpZW5lcyBwYWRlY2llcm9uIGRlIENvdmlkLTE5Lgo=