Packages

pacman::p_load(tidyverse, 
               janitor, 
               visdat, 
               tableone, 
               emmeans)

Dataset

df <- read_csv("https://docs.google.com/spreadsheets/d/e/2PACX-1vSlA8QaLV8oP976nOJ0l9RwdZRqnPY5RXyEFFyXwWQ3iEZEc_xKVynZZGcXjAWLveK1ckDiOBTnwy2V/pub?gid=888653489&single=true&output=csv")
Parsed with column specification:
cols(
  .default = col_character(),
  `Número de autores` = col_double(),
  `Año de publicación` = col_double(),
  `n secuelas` = col_double(),
  `Pacientes que incluye el informe` = col_double(),
  Cumple = col_double(),
  `No cumple` = col_double(),
  SUMA = col_double()
)
See spec(...) for full column specifications.

Data exploration 1

head(df)
# names(df)

Data cleaning

Cleaning and removing not used variables

df <- df %>% 
  janitor::clean_names() %>% 
  janitor::remove_empty(c("cols", "rows"))
df <- df %>%
  select(
    titulo_del_estudio, 
  revista,
  pais_1er_autor_o_afiliacion,
  continente,
  numero_de_autores,
  ano_de_publicacion,
  antes_post_care,
  denticion_afect,
  tema,
  t1:ci13, 
  calidad = cumple
  )

Check NA

visdat::vis_dat(df)

Remove columns with more than 50% of NA

df <- df %>% 
  purrr::discard(~sum(is.na(.x))/length(.x)* 100 >=50) 

Elimino los que tienen revista o año NA

Dataset ready for analysis

Analysis and tables

Year and journals

df %>% 
  ggplot(aes(x = ano_de_publicacion, fill = revista)) + 
  geom_histogram(bins = 10) + 
  labs(
    title = "Articles per journal per year", 
    x = "Year", 
    y = "Articles", 
    fill = "Journal"
  ) + 
  ggpubr::theme_pubclean()

Table journal by year by n

df %>%
  group_by(revista, ano_de_publicacion) %>% 
  summarise(n = n()) %>% 
  pivot_wider(names_from = ano_de_publicacion, 
              values_from = n, 
              values_fill = list(n = 0))

Graph journal by n by year

df %>%
  group_by(revista, ano_de_publicacion) %>% 
  summarise(n = n()) %>% 
  ggplot(aes(x = as_factor(ano_de_publicacion), 
             y = n, 
             group = revista, 
             color = revista)) + 
  geom_line() + 
  scale_y_log10() + 
  labs(
    title = "Publication by journal", 
    x = "Year", 
    y = "Articles (Log 10 n)", 
    color = "Journal"
  )  + 
  ggpubr::theme_pubclean()

df %>% 
  janitor::tabyl(revista) %>% 
  adorn_totals("row") %>%
  adorn_pct_formatting()
                 revista   n percent
          Dent Traumatol 141   69.5%
  Eur Arch Paediatr Dent  10    4.9%
 Int J Clin Pediatr Dent  16    7.9%
         Int J Paed Dent   2    1.0%
     J Clin Pediatr Dent  19    9.4%
            Pediatr Dent  15    7.4%
                   Total 203  100.0%
df %>%
  janitor::tabyl(ano_de_publicacion, revista) %>%
  janitor::adorn_percentages("col") %>%
  janitor::adorn_totals("col") %>% 
  janitor::adorn_pct_formatting(rounding = "half up", digits = 0) %>%
  janitor::adorn_ns() %>% 
  janitor::adorn_title("combined") 
 ano_de_publicacion/revista Dent Traumatol Eur Arch Paediatr Dent Int J Clin Pediatr Dent
                       2008       35% (50)                10% (1)                  0% (0)
                       2009       12% (17)                10% (1)                 13% (2)
                       2010       17% (24)                 0% (0)                  0% (0)
                       2011       17% (24)                30% (3)                 19% (3)
                       2012        7% (10)                20% (2)                 13% (2)
                       2013        3%  (4)                 0% (0)                 19% (3)
                       2014        2%  (3)                 0% (0)                  6% (1)
                       2015        3%  (4)                10% (1)                 13% (2)
                       2016        1%  (1)                 0% (0)                  6% (1)
                       2017        1%  (2)                 0% (0)                  6% (1)
                       2018        1%  (2)                20% (2)                  6% (1)
 Int J Paed Dent J Clin Pediatr Dent Pediatr Dent     Total
          0% (0)              0% (0)       0% (0)  45% (51)
          0% (0)             11% (2)      33% (5)  78% (27)
          0% (0)             11% (2)      20% (3)  48% (29)
          0% (0)              5% (1)       7% (1)  78% (32)
         50% (1)             21% (4)      33% (5) 144% (24)
          0% (0)             11% (2)       0% (0)  32%  (9)
         50% (1)              0% (0)       0% (0)  58%  (5)
          0% (0)             11% (2)       7% (1)  43% (10)
          0% (0)             16% (3)       0% (0)  23%  (5)
          0% (0)             16% (3)       0% (0)  23%  (6)
          0% (0)              0% (0)       0% (0)  28%  (5)

Countries, journals and year

Countries

df %>%
  janitor::tabyl(pais_1er_autor_o_afiliacion) %>%
  arrange(desc(n)) %>% 
  #  adorn_totals("row") %>%
  adorn_pct_formatting(rounding = "half up", digits = 0)

Countries per year

df %>% 
  group_by(pais_1er_autor_o_afiliacion, ano_de_publicacion, revista) %>%
  count(sort = T) %>% 
  filter(n > 1) %>% 
  ggplot(aes(x = as_factor(ano_de_publicacion), y = n, color = pais_1er_autor_o_afiliacion)) + 
  geom_jitter(alpha = .7) + 
  labs(
    title = "Case reports by country",
    subtitle = "Only countries with >1", 
    x = "Year", 
    y = "Case reports", 
    color = "Country"
  ) +
  ggpubr::theme_pubclean()

  


pivot_wider(names_from = ano_de_publicacion, values_from = n) %>% 
  ggplot(aes(x = as_factor(ano_de_publicacion), y = n))
Error in build_wider_spec(data, names_from = !!names_from, values_from = !!values_from,  : 
  el argumento "data" está ausente, sin valor por omisión

Pre and post CARE

df %>% 
  aov(calidad ~ antes_post_care, data = .) %>% 
  summary()
                 Df Sum Sq Mean Sq F value Pr(>F)
antes_post_care   1    5.1   5.076   0.735  0.392
Residuals       201 1388.2   6.907               

Pre and post CARE by country

Pendiente

ver si existe cambio por país antes y despues

Ver distribución por paises años revistas

df %>%
  janitor::tabyl(revista) %>%
  arrange(desc(n)) %>% 
  #  adorn_totals("row") %>%
  adorn_pct_formatting(rounding = "half up", digits = 0) %>% 
  adorn_totals("col")

hacer una tabla que combine todo esto

luego hacer una evaluación de la calidad

Quality

Calculo la calidad total

df <- df %>%
  mutate(calidad = reduce(select( .,  introduccion_4_b_hace_referencia_a_la_literatura_medica_pertinente_number:x88),
  `+`  ))

mean(df$calidad)
[1] 14.36946

Quality by year

Quality by journal

Figure quality mean by year and journal

Inferential

Hay diferencia por año?

summary(aov(calidad ~ ano_de_publicacion, data = df))
                    Df Sum Sq Mean Sq F value  Pr(>F)   
ano_de_publicacion   1   45.9   45.89   6.846 0.00956 **
Residuals          201 1347.4    6.70                   
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Hay diferencia por revista?

summary(aov(calidad ~ revista, data = df))
             Df Sum Sq Mean Sq F value  Pr(>F)   
revista       5  104.9   20.98   3.209 0.00829 **
Residuals   197 1288.4    6.54                   
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Hay diferencia antes y después del 2013?

df %>% 
  mutate(care = case_when(
    ano_de_publicacion > 2013 ~ "Despues", 
    TRUE ~ "Antes" 
  )) %>% 
  aov(calidad~care, data = .) %>% 
  summary()
             Df Sum Sq Mean Sq F value Pr(>F)
care          1    5.1   5.076   0.735  0.392
Residuals   201 1388.2   6.907               
df %>% 
  aov(calidad~revista, data = .) %>% 
  TukeyHSD()
  Tukey multiple comparisons of means
    95% family-wise confidence level

Fit: aov(formula = calidad ~ revista, data = .)

$revista
                                                     diff        lwr        upr     p adj
Eur Arch Paediatr Dent-Dent Traumatol           2.3666667 -0.0418685  4.7752018 0.0572236
Int J Clin Pediatr Dent-Dent Traumatol         -1.4583333 -3.3999091  0.4832425 0.2606121
Int J Paed Dent-Dent Traumatol                  2.1666667 -3.0743741  7.4077074 0.8413587
J Clin Pediatr Dent-Dent Traumatol             -0.2807018 -2.0793561  1.5179526 0.9976729
Pediatr Dent-Dent Traumatol                     0.5333333 -1.4655212  2.5321879 0.9725610
Int J Clin Pediatr Dent-Eur Arch Paediatr Dent -3.8250000 -6.7918853 -0.8581147 0.0036173
Int J Paed Dent-Eur Arch Paediatr Dent         -0.2000000 -5.9009824  5.5009824 0.9999985
J Clin Pediatr Dent-Eur Arch Paediatr Dent     -2.6473684 -5.5227552  0.2280184 0.0904329
Pediatr Dent-Eur Arch Paediatr Dent            -1.8333333 -4.8380149  1.1713482 0.4966393
Int J Paed Dent-Int J Clin Pediatr Dent         3.6250000 -1.8949525  9.1449525 0.4113784
J Clin Pediatr Dent-Int J Clin Pediatr Dent     1.1776316 -1.3196718  3.6749350 0.7524336
Pediatr Dent-Int J Clin Pediatr Dent            1.9916667 -0.6534772  4.6368105 0.2580469
J Clin Pediatr Dent-Int J Paed Dent            -2.4473684 -7.9186860  3.0239492 0.7916917
Pediatr Dent-Int J Paed Dent                   -1.6333333 -7.1736923  3.9070257 0.9578912
Pediatr Dent-J Clin Pediatr Dent                0.8140351 -1.7280560  3.3561261 0.9405930

Journal comparison

Year comparison

Continent comparison

Pre-post CARE comparison

first author country comparison

LS0tCnRpdGxlOiAiQ2FsaWRhZCByZXBvcnRlcyBUcmF1bWEgRGVudGFsIgpvdXRwdXQ6IAogIGh0bWxfbm90ZWJvb2s6IAogICAgdG9jOiB5ZXMKICAgIHRvY19mbG9hdDogdHJ1ZQogICAgZmlnX2NhcHRpb246IHRydWUKLS0tCgojIFBhY2thZ2VzCmBgYHtyfQpwYWNtYW46OnBfbG9hZCh0aWR5dmVyc2UsIAogICAgICAgICAgICAgICBqYW5pdG9yLCAKICAgICAgICAgICAgICAgdmlzZGF0LCAKICAgICAgICAgICAgICAgdGFibGVvbmUsIAogICAgICAgICAgICAgICBlbW1lYW5zKQpgYGAKCiMgRGF0YXNldAoKYGBge3IsIHdhcm5pbmc9RkFMU0V9CmRmIDwtIHJlYWRfY3N2KCJodHRwczovL2RvY3MuZ29vZ2xlLmNvbS9zcHJlYWRzaGVldHMvZC9lLzJQQUNYLTF2U2xBOFFhTFY4b1A5NzZuT0owbDlSd2RaUnFuUFk1Ulh5RUZGeVh3V1EzaUVaRWNfeEtWeW5aWkdjWGpBV0x2ZUsxY2tEaU9CVG53eTJWL3B1Yj9naWQ9ODg4NjUzNDg5JnNpbmdsZT10cnVlJm91dHB1dD1jc3YiKQpgYGAKCgojIERhdGEgZXhwbG9yYXRpb24gMQpgYGB7ciBoZWFkfQpoZWFkKGRmKQpgYGAKCmBgYHtyIG5hbWVzfQojIG5hbWVzKGRmKQpgYGAKCgojIERhdGEgY2xlYW5pbmcKCkNsZWFuaW5nIGFuZCByZW1vdmluZyBub3QgdXNlZCB2YXJpYWJsZXMKYGBge3IgamFuaXRvcn0KZGYgPC0gZGYgJT4lIAogIGphbml0b3I6OmNsZWFuX25hbWVzKCkgJT4lIAogIGphbml0b3I6OnJlbW92ZV9lbXB0eShjKCJjb2xzIiwgInJvd3MiKSkKYGBgCgpgYGB7ciBzZWxlY2Npb25vIGFsZ3VuYXMgdmFyc30KZGYgPC0gZGYgJT4lCiAgc2VsZWN0KAogICAgdGl0dWxvX2RlbF9lc3R1ZGlvLCAKICByZXZpc3RhLAogIHBhaXNfMWVyX2F1dG9yX29fYWZpbGlhY2lvbiwKICBjb250aW5lbnRlLAogIG51bWVyb19kZV9hdXRvcmVzLAogIGFub19kZV9wdWJsaWNhY2lvbiwKICBhbnRlc19wb3N0X2NhcmUsCiAgZGVudGljaW9uX2FmZWN0LAogIHRlbWEsCiAgdDE6Y2kxMywgCiAgY2FsaWRhZCA9IGN1bXBsZQogICkKYGBgCgoKCkNoZWNrIE5BCgpgYGB7cn0KdmlzZGF0Ojp2aXNfZGF0KGRmKQpgYGAKUmVtb3ZlIGNvbHVtbnMgd2l0aCBtb3JlIHRoYW4gNTAlIG9mIE5BCgpgYGB7cn0KZGYgPC0gZGYgJT4lIAogIHB1cnJyOjpkaXNjYXJkKH5zdW0oaXMubmEoLngpKS9sZW5ndGgoLngpKiAxMDAgPj01MCkgCmBgYAoKCkVsaW1pbm8gbG9zIHF1ZSB0aWVuZW4gcmV2aXN0YSBvIGHDsW8gTkEKCkRhdGFzZXQgcmVhZHkgZm9yIGFuYWx5c2lzCgojIEFuYWx5c2lzIGFuZCB0YWJsZXMKCiMjIFllYXIgYW5kIGpvdXJuYWxzCmBgYHtyfQpkZiAlPiUgCiAgZ2dwbG90KGFlcyh4ID0gYW5vX2RlX3B1YmxpY2FjaW9uLCBmaWxsID0gcmV2aXN0YSkpICsgCiAgZ2VvbV9oaXN0b2dyYW0oYmlucyA9IDEwKSArIAogIGxhYnMoCiAgICB0aXRsZSA9ICJBcnRpY2xlcyBwZXIgam91cm5hbCBwZXIgeWVhciIsIAogICAgeCA9ICJZZWFyIiwgCiAgICB5ID0gIkFydGljbGVzIiwgCiAgICBmaWxsID0gIkpvdXJuYWwiCiAgKSArIAogIGdncHVicjo6dGhlbWVfcHViY2xlYW4oKQpgYGAKVGFibGUgam91cm5hbCBieSB5ZWFyIGJ5IG4KYGBge3J9CmRmICU+JQogIGdyb3VwX2J5KHJldmlzdGEsIGFub19kZV9wdWJsaWNhY2lvbikgJT4lIAogIHN1bW1hcmlzZShuID0gbigpKSAlPiUgCiAgcGl2b3Rfd2lkZXIobmFtZXNfZnJvbSA9IGFub19kZV9wdWJsaWNhY2lvbiwgCiAgICAgICAgICAgICAgdmFsdWVzX2Zyb20gPSBuLCAKICAgICAgICAgICAgICB2YWx1ZXNfZmlsbCA9IGxpc3QobiA9IDApKQpgYGAKCkdyYXBoIGpvdXJuYWwgYnkgbiBieSB5ZWFyCmBgYHtyfQpkZiAlPiUKICBncm91cF9ieShyZXZpc3RhLCBhbm9fZGVfcHVibGljYWNpb24pICU+JSAKICBzdW1tYXJpc2UobiA9IG4oKSkgJT4lIAogIGdncGxvdChhZXMoeCA9IGFzX2ZhY3Rvcihhbm9fZGVfcHVibGljYWNpb24pLCAKICAgICAgICAgICAgIHkgPSBuLCAKICAgICAgICAgICAgIGdyb3VwID0gcmV2aXN0YSwgCiAgICAgICAgICAgICBjb2xvciA9IHJldmlzdGEpKSArIAogIGdlb21fbGluZSgpICsgCiAgc2NhbGVfeV9sb2cxMCgpICsgCiAgbGFicygKICAgIHRpdGxlID0gIlB1YmxpY2F0aW9uIGJ5IGpvdXJuYWwiLCAKICAgIHggPSAiWWVhciIsIAogICAgeSA9ICJBcnRpY2xlcyAoTG9nIDEwIG4pIiwgCiAgICBjb2xvciA9ICJKb3VybmFsIgogICkgICsgCiAgZ2dwdWJyOjp0aGVtZV9wdWJjbGVhbigpCmBgYApgYGB7cn0KZGYgJT4lIAogIGphbml0b3I6OnRhYnlsKHJldmlzdGEpICU+JSAKICBhZG9ybl90b3RhbHMoInJvdyIpICU+JQogIGFkb3JuX3BjdF9mb3JtYXR0aW5nKCkKYGBgCgpgYGB7cn0KZGYgJT4lCiAgamFuaXRvcjo6dGFieWwoYW5vX2RlX3B1YmxpY2FjaW9uLCByZXZpc3RhKSAlPiUKICBqYW5pdG9yOjphZG9ybl9wZXJjZW50YWdlcygiY29sIikgJT4lCiAgamFuaXRvcjo6YWRvcm5fdG90YWxzKCJjb2wiKSAlPiUgCiAgamFuaXRvcjo6YWRvcm5fcGN0X2Zvcm1hdHRpbmcocm91bmRpbmcgPSAiaGFsZiB1cCIsIGRpZ2l0cyA9IDApICU+JQogIGphbml0b3I6OmFkb3JuX25zKCkgJT4lIAogIGphbml0b3I6OmFkb3JuX3RpdGxlKCJjb21iaW5lZCIpIAoKCmBgYAojIyBDb3VudHJpZXMsIGpvdXJuYWxzIGFuZCB5ZWFyCgojIyMgQ291bnRyaWVzCgoKYGBge3J9CmRmICU+JQogIGphbml0b3I6OnRhYnlsKHBhaXNfMWVyX2F1dG9yX29fYWZpbGlhY2lvbikgJT4lCiAgYXJyYW5nZShkZXNjKG4pKSAlPiUgCiAgIyAgYWRvcm5fdG90YWxzKCJyb3ciKSAlPiUKICBhZG9ybl9wY3RfZm9ybWF0dGluZyhyb3VuZGluZyA9ICJoYWxmIHVwIiwgZGlnaXRzID0gMCkKYGBgCgojIyMgQ291bnRyaWVzIHBlciB5ZWFyCgpgYGB7cn0KZGYgJT4lIAogIGdyb3VwX2J5KHBhaXNfMWVyX2F1dG9yX29fYWZpbGlhY2lvbiwgYW5vX2RlX3B1YmxpY2FjaW9uLCByZXZpc3RhKSAlPiUKICBjb3VudChzb3J0ID0gVCkgJT4lIAogIGZpbHRlcihuID4gMSkgJT4lIAogIGdncGxvdChhZXMoeCA9IGFzX2ZhY3Rvcihhbm9fZGVfcHVibGljYWNpb24pLCB5ID0gbiwgY29sb3IgPSBwYWlzXzFlcl9hdXRvcl9vX2FmaWxpYWNpb24pKSArIAogIGdlb21faml0dGVyKGFscGhhID0gLjcpICsgCiAgbGFicygKICAgIHRpdGxlID0gIkNhc2UgcmVwb3J0cyBieSBjb3VudHJ5IiwKICAgIHN1YnRpdGxlID0gIk9ubHkgY291bnRyaWVzIHdpdGggPjEiLCAKICAgIHggPSAiWWVhciIsIAogICAgeSA9ICJDYXNlIHJlcG9ydHMiLCAKICAgIGNvbG9yID0gIkNvdW50cnkiCiAgKSArCiAgZ2dwdWJyOjp0aGVtZV9wdWJjbGVhbigpCiAgCgoKcGl2b3Rfd2lkZXIobmFtZXNfZnJvbSA9IGFub19kZV9wdWJsaWNhY2lvbiwgdmFsdWVzX2Zyb20gPSBuKSAlPiUgCiAgZ2dwbG90KGFlcyh4ID0gYXNfZmFjdG9yKGFub19kZV9wdWJsaWNhY2lvbiksIHkgPSBuKSkKICBzdW1tYXJpc2UoIG4gPSBjb3VudCgpKSAlPiUgCiAgICBnZ3Bsb3QoYWVzKHggPSBhbm9fZGUpKQogICMgZ2dwbG90KGFlcykKICBwaXZvdF93aWRlcihuYW1lc19mcm9tID0gYW5vX2RlX3B1YmxpY2FjaW9uLCB2YWx1ZXNfZnJvbSA9IG4pCmBgYAoKCiMjIFByZSBhbmQgcG9zdCBDQVJFCgpgYGB7cn0KZGYgJT4lIAogIGdyb3VwX2J5KGFudGVzX3Bvc3RfY2FyZSkgJT4lIAogIHN1bW1hcmlzZShuID0gbigpLCBtZWFuID0gbWVhbihjYWxpZGFkKSwgc2QgPSBzZChjYWxpZGFkKSkgJT4lIAogIG11dGF0ZV9pZihpcy5udW1lcmljLCByb3VuZCwgMSkKYGBgCgoKYGBge3J9CmRmICU+JSAKICBhb3YoY2FsaWRhZCB+IGFudGVzX3Bvc3RfY2FyZSwgZGF0YSA9IC4pICU+JSAKICBzdW1tYXJ5KCkKYGBgCgojIyBQcmUgYW5kIHBvc3QgQ0FSRSBieSBjb3VudHJ5CgpgYGB7cn0KZGYgJT4lIAogIGdyb3VwX2J5KGFudGVzX3Bvc3RfY2FyZSwgcGFpc18xZXJfYXV0b3Jfb19hZmlsaWFjaW9uKSAlPiUgCiAgc3VtbWFyaXNlKG1lYW4gPSBtZWFuKGNhbGlkYWQpKSAlPiUgCiAgcGl2b3Rfd2lkZXIobmFtZXNfZnJvbSA9IGFudGVzX3Bvc3RfY2FyZSwgCiAgICAgICAgICAgICAgdmFsdWVzX2Zyb20gPSBtZWFuKSAlPiUgCiAgbXV0YXRlX2lmKGlzLm51bWVyaWMsIHJvdW5kLCAxKQpgYGAKUGVuZGllbnRlCgp2ZXIgc2kgZXhpc3RlIGNhbWJpbyBwb3IgcGHDrXMgYW50ZXMgeSBkZXNwdWVzCgpWZXIgZGlzdHJpYnVjacOzbiBwb3IgCnBhaXNlcwphw7FvcwpyZXZpc3RhcwpgYGB7cn0KZGYgJT4lCiAgamFuaXRvcjo6dGFieWwocmV2aXN0YSkgJT4lCiAgYXJyYW5nZShkZXNjKG4pKSAlPiUgCiAgIyAgYWRvcm5fdG90YWxzKCJyb3ciKSAlPiUKICBhZG9ybl9wY3RfZm9ybWF0dGluZyhyb3VuZGluZyA9ICJoYWxmIHVwIiwgZGlnaXRzID0gMCkgJT4lIAogIGFkb3JuX3RvdGFscygiY29sIikKYGBgCgoKaGFjZXIgdW5hIHRhYmxhIHF1ZSBjb21iaW5lIHRvZG8gZXN0bwoKbHVlZ28gaGFjZXIgdW5hIGV2YWx1YWNpw7NuIGRlIGxhIGNhbGlkYWQKCgojIyBRdWFsaXR5CgpDYWxjdWxvIGxhIGNhbGlkYWQgdG90YWwKYGBge3J9CiMgZGYgPC0gZGYgJT4lCiMgIG11dGF0ZShjYWxpZGFkID0gcmVkdWNlKHNlbGVjdCggLiwgICMgaW50cm9kdWNjaW9uXzRfYl9oYWNlX3JlZmVyZW5jaWFfYV9sYV9saXRlcmF0dXJhX21lZGljYV9wZXJ0aW5lbnRlX251bWJlcjp4ODgpLAojICBgK2AgICkpCmBgYAoKYGBge3J9CmRmICU+JSAKICBnZ3Bsb3QoYWVzKHggPSBjYWxpZGFkKSkgKyAKICBnZW9tX2hpc3RvZ3JhbShiaW5zID0gOCkgKyAKICBmYWNldF9ncmlkKHJldmlzdGF+LikKYGBgCgpgYGB7cn0KZGYgJT4lIAogIGdncGxvdChhZXMoeCA9IGNhbGlkYWQpKSArIAogIGdlb21faGlzdG9ncmFtKGJpbnMgPSA4KSArIAogIGZhY2V0X2dyaWQoYW5vX2RlX3B1YmxpY2FjaW9ufi4pCmBgYApgYGB7cn0KbWVhbihkZiRjYWxpZGFkKQpgYGAKYGBge3J9CmRmICU+JSAKICBzdW1tYXJpc2UobiA9IG4oKSwgCiAgICAgICAgICAgIFFNZWFuID0gbWVhbihjYWxpZGFkKSwgCiAgICAgICAgICAgIHNkID0gc2QoY2FsaWRhZCksIAogICAgICAgICAgICBtZWRpYW4gPSBtZWRpYW4oY2FsaWRhZCksIAogICAgICAgICAgICBtaW4gPSBtaW4oY2FsaWRhZCksIAogICAgICAgICAgICBtYXggPSBtYXgoY2FsaWRhZCkpICU+JSAKICBtdXRhdGVfaWYoaXMubnVtZXJpYywgcm91bmQsIDApCmBgYAoKCgojIyBRdWFsaXR5IGJ5IHllYXIKCmBgYHtyfQpkZiAlPiUgCiAgZ3JvdXBfYnkoYW5vX2RlX3B1YmxpY2FjaW9uKSAlPiUgCiAgc3VtbWFyaXNlKG4gPSBuKCksIHF1YWxpdHlNZWFuID0gbWVhbihjYWxpZGFkKSwgc2QgPSBzZChjYWxpZGFkKSkgJT4lIAogIG11dGF0ZV9pZihpcy5udW1lcmljLCByb3VuZCwgMSkgCmBgYAoKCgojIyBRdWFsaXR5IGJ5IGpvdXJuYWwKCmBgYHtyfQpkZiAlPiUgCiAgZ3JvdXBfYnkocmV2aXN0YSkgJT4lIAogIHN1bW1hcmlzZShuID0gbigpLCBxdWFsaXR5TWVhbiA9IG1lYW4oY2FsaWRhZCksIHNkID0gc2QoY2FsaWRhZCksIG1lZGlhbiA9IG1lZGlhbihjYWxpZGFkKSkgJT4lIAogIG11dGF0ZV9pZihpcy5udW1lcmljLCByb3VuZCwgMSkKYGBgCgojIyBGaWd1cmUgcXVhbGl0eSBtZWFuIGJ5IHllYXIgYW5kIGpvdXJuYWwKCmBgYHtyfQpkZiAlPiUKICBncm91cF9ieShhbm9fZGVfcHVibGljYWNpb24sIHJldmlzdGEpICU+JQogIHN1bW1hcmlzZShjYWxpZGFkUHJvbWVkaW8gPSBtZWFuKGNhbGlkYWQpKSAlPiUgCiAgIyBkcm9wX25hKCkgJT4lIAogICMgcGl2b3Rfd2lkZXIobmFtZXNfZnJvbSA9IGFub19kZV9wdWJsaWNhY2lvbiwKICAjICAgICAgICAgICAgdmFsdWVzX2Zyb20gPSBjYWxpZGFkUHJvbWVkaW8pICU+JQogIGdncGxvdChhZXMoCiAgICB4ID0gYW5vX2RlX3B1YmxpY2FjaW9uLCAKICAgICMgeCA9IGFzX2ZhY3Rvcihhbm9fZGVfcHVibGljYWNpb24pLAogICAgeSA9IGNhbGlkYWRQcm9tZWRpbywKICAgIGNvbG9yID0gcmV2aXN0YSwKICAgIGdyb3VwID0gcmV2aXN0YQogICAgKSkgKwogIGdlb21fbGluZSgpICsKICBnZW9tX3BvaW50KCkgKwogIGZhY2V0X2dyaWQoLiB+IHJldmlzdGEpICsKICAjIHNjYWxlX3hfZGlzY3JldGUobGltaXRzID0gYygiMjAwOCIsCiAgIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiMjAxMyIsCiAgIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiMjAxOCIpKSArCiAgdGhlbWVfbGlnaHQoKSArCiAgIyB0aGVtZShheGlzLnRleHQueD1lbGVtZW50X3RleHQoc2l6ZT1yZWwoMC42KSkpICsKICBsYWJzKHRpdGxlID0gIk1lYW4gQ0FSRSBxdWFsaXR5IGluZGV4IG9mIHB1Ymxpc2hlZCBjYXNlLXJlcG9ydHMiLAogICAgICAgc3VidGl0bGUgPSAiUmVkIGxpbmUgPSBDQVJFIGd1aWRlbGluZXMgcHVibGlzaGVkIiwgCiAgICAgICB5ID0gIk1lYW4gQ0FSRSBpbmRleCIsCiAgICAgICB4ID0gIlllYXIiLAogICAgICAgY29sb3IgPSAiSm91cm5hbCIKICApICsgCiAgeWxpbSgwLCAyNCkgKyAKICBzY2FsZV94X2NvbnRpbnVvdXMoYnJlYWtzPXNlcSgyMDA4LCAyMDE4LCAyKSkgKwogIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IDIwMTMsIGxpbmV0eXBlPSJkb3R0ZWQiLCAKICAgICAgICAgICAgICAgIGNvbG9yID0gInJlZCIsIHNpemU9LjUpCiAgCgpgYGAKYGBge3J9CmRmICU+JSAKICBnZ3Bsb3QoYWVzKHggPSBhbm9fZGVfcHVibGljYWNpb24sIHkgPSBjYWxpZGFkLCBjb2xvciA9IHJldmlzdGEpKSArIAogIGdlb21faml0dGVyKCkgKyAKICB5bGltKDAsIDMwKSArIAogIGxhYnModGl0bGUgPSAiSW5kaXZpZHVhbCBxdWFsaXR5IG9mIGNhc2UtcmVwb3J0cyBieSB5ZWFyIGFuZCBqb3VybmFsIiwgCiAgICAgICB5ID0gIkNBUkUgaW5kZXgiLCAKICAgICAgIHggPSAiWWVhciIsIAogICAgICAgY29sb3IgPSAiSm91cm5hbCIpICsgCiAgdGhlbWVfbGlnaHQoKQpgYGAKIyBJbmZlcmVudGlhbAoKIyMgSGF5IGRpZmVyZW5jaWEgcG9yIGHDsW8/CmBgYHtyfQpzdW1tYXJ5KGFvdihjYWxpZGFkIH4gYW5vX2RlX3B1YmxpY2FjaW9uLCBkYXRhID0gZGYpKQpgYGAKCiMjIEhheSBkaWZlcmVuY2lhIHBvciByZXZpc3RhPwpgYGB7cn0Kc3VtbWFyeShhb3YoY2FsaWRhZCB+IHJldmlzdGEsIGRhdGEgPSBkZikpCmBgYAoKCiMjIEhheSBkaWZlcmVuY2lhIGFudGVzIHkgZGVzcHXDqXMgZGVsIDIwMTM/CgpgYGB7cn0KZGYgJT4lIAogIG11dGF0ZShjYXJlID0gY2FzZV93aGVuKAogICAgYW5vX2RlX3B1YmxpY2FjaW9uID4gMjAxMyB+ICJEZXNwdWVzIiwgCiAgICBUUlVFIH4gIkFudGVzIiAKICApKSAlPiUgCiAgYW92KGNhbGlkYWR+Y2FyZSwgZGF0YSA9IC4pICU+JSAKICBzdW1tYXJ5KCkKYGBgCgpgYGB7cn0KZGYgJT4lIAogIGFvdihjYWxpZGFkfnJldmlzdGEsIGRhdGEgPSAuKSAlPiUgCiAgVHVrZXlIU0QoKQpgYGAKCiMjIEpvdXJuYWwgY29tcGFyaXNvbgpgYGB7cn0KZGYgJT4lIAogIGFvdihjYWxpZGFkfnJldmlzdGEsIGRhdGEgPSAuKSAlPiUgCiAgZW1tZWFuczo6ZW1tZWFucyguLCB+cmV2aXN0YSkgJT4lIAogICMgVHVrZXlIU0QoKSAlPiUgCiAgZW1tZWFuczo6Y29udHJhc3QoLiwKICAgICAgICBtZXRob2QgPSAidHVrZXkiKSAlPiUgCiAgcGxvdChlbW1lYW5zOjpjb250cmFzdCguLAogICAgICAgIG1ldGhvZCA9ICJ0dWtleSIpKSArCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gMCwgY29sb3IgPSAicmVkIiwgbHR5PTIpICsgCiAgZ2dwdWJyOjp0aGVtZV9wdWJjbGVhbigpICsgCiAgbGFicyh0aXRsZSA9ICJKb3VybmFsIGNvbXBhcmlzb24gKEFOT1ZBICsgVHVrZXlIU0QpIiwgCiAgICAgICB5ID0gIkNvbnRyYXN0IiwgCiAgICAgICB4ID0gIkVzdGltYXRlIikKCmBgYAojIyBZZWFyIGNvbXBhcmlzb24KYGBge3J9CmRmICU+JQogIGFvdihjYWxpZGFkIH4gYXNfZmFjdG9yKGFub19kZV9wdWJsaWNhY2lvbiksIGRhdGEgPSAuKSAlPiUKICBlbW1lYW5zOjplbW1lYW5zKC4sIH4gYXNfZmFjdG9yKGFub19kZV9wdWJsaWNhY2lvbikpICU+JQogICMgVHVrZXlIU0QoKSAlPiUKICBlbW1lYW5zOjpjb250cmFzdCguLAogICAgICAgICAgICAgICAgICAgIG1ldGhvZCA9ICJ0dWtleSIpICU+JQogIHBsb3QoZW1tZWFuczo6Y29udHJhc3QoLiwKICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZCA9ICJ0dWtleSIpKSArCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gMCwKICAgICAgICAgICAgIGNvbG9yID0gInJlZCIsCiAgICAgICAgICAgICBsdHkgPSAyKSArCiAgZ2dwdWJyOjp0aGVtZV9wdWJjbGVhbigpICsKICBsYWJzKHRpdGxlID0gIlllYXIgY29tcGFyaXNvbiAoQU5PVkEgKyBUdWtleUhTRCkiLAogICAgICAgeSA9ICJDb250cmFzdCIsCiAgICAgICB4ID0gIkVzdGltYXRlIikKYGBgCiMjIENvbnRpbmVudCBjb21wYXJpc29uCmBgYHtyfQpkZiAlPiUKICBhb3YoY2FsaWRhZCB+IGNvbnRpbmVudGUsIGRhdGEgPSAuKSAlPiUKICBlbW1lYW5zOjplbW1lYW5zKC4sIH4gY29udGluZW50ZSkgJT4lCiAgIyBUdWtleUhTRCgpICU+JQogIGVtbWVhbnM6OmNvbnRyYXN0KC4sCiAgICAgICAgICAgICAgICAgICAgbWV0aG9kID0gInR1a2V5IikgJT4lCiAgcGxvdChlbW1lYW5zOjpjb250cmFzdCguLAogICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kID0gInR1a2V5IikpICsKICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAwLAogICAgICAgICAgICAgY29sb3IgPSAicmVkIiwKICAgICAgICAgICAgIGx0eSA9IDIpICsKICBnZ3B1YnI6OnRoZW1lX3B1YmNsZWFuKCkgKwogIGxhYnModGl0bGUgPSAiQ29udGluZW50IGNvbXBhcmlzb24gKEFOT1ZBICsgVHVrZXlIU0QpIiwKICAgICAgIHkgPSAiQ29udHJhc3QiLAogICAgICAgeCA9ICJFc3RpbWF0ZSIpCmBgYAojIyBQcmUtcG9zdCBDQVJFIGNvbXBhcmlzb24KYGBge3J9CmRmICU+JQogIGFvdihjYWxpZGFkIH4gYW50ZXNfcG9zdF9jYXJlLCBkYXRhID0gLikgJT4lCiAgZW1tZWFuczo6ZW1tZWFucyguLCB+IGFudGVzX3Bvc3RfY2FyZSkgJT4lCiAgIyBUdWtleUhTRCgpICU+JQogIGVtbWVhbnM6OmNvbnRyYXN0KC4sCiAgICAgICAgICAgICAgICAgICAgbWV0aG9kID0gInR1a2V5IikgJT4lCiAgcGxvdChlbW1lYW5zOjpjb250cmFzdCguLAogICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kID0gInR1a2V5IikpICsKICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAwLAogICAgICAgICAgICAgY29sb3IgPSAicmVkIiwKICAgICAgICAgICAgIGx0eSA9IDIpICsKICBnZ3B1YnI6OnRoZW1lX3B1YmNsZWFuKCkgKwogIGxhYnModGl0bGUgPSAiUHJlIGFuZCBwb3N0IENBUkUgcHVibGljYXRpb24gKEFOT1ZBICsgVHVrZXlIU0QpIiwKICAgICAgIHkgPSAiQ29udHJhc3QiLAogICAgICAgeCA9ICJFc3RpbWF0ZSIpCmBgYAojIyBmaXJzdCBhdXRob3IgY291bnRyeSBjb21wYXJpc29uCmBgYHtyfQpkZiAlPiUKICBhb3YoY2FsaWRhZCB+IHBhaXNfMWVyX2F1dG9yX29fYWZpbGlhY2lvbiwgZGF0YSA9IC4pICU+JQogIGVtbWVhbnM6OmVtbWVhbnMoLiwgfiBwYWlzXzFlcl9hdXRvcl9vX2FmaWxpYWNpb24pICU+JQogICMgVHVrZXlIU0QoKSAlPiUKICBlbW1lYW5zOjpjb250cmFzdCguLAogICAgICAgICAgICAgICAgICAgIG1ldGhvZCA9ICJ0dWtleSIpICU+JQogIHBsb3QoZW1tZWFuczo6Y29udHJhc3QoLiwKICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZCA9ICJ0dWtleSIpKSArCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gMCwKICAgICAgICAgICAgIGNvbG9yID0gInJlZCIsCiAgICAgICAgICAgICBsdHkgPSAyKSArCiAgZ2dwdWJyOjp0aGVtZV9wdWJjbGVhbigpICsKICBsYWJzKHRpdGxlID0gIkNvdW50cnkgZmlyc3QgYXV0aG9yIChBTk9WQSArIFR1a2V5SFNEKSIsCiAgICAgICB5ID0gIkNvbnRyYXN0IiwKICAgICAgIHggPSAiRXN0aW1hdGUiKQpgYGA=