Life expectancy at birth by gender

#==============================
#   Collect and clean data
#==============================

# Load some packages: 
library(tidyverse)
library(rvest)

# Extract data from link: 
link <- "https://en.wikipedia.org/wiki/List_of_countries_by_life_expectancy?fbclid=IwAR0jRtf0RacPLxVPgcuu4zgYJl9HDk01cNy6u48vvyTuoK9CC1jZH8_pZPQ"


# Extract data: 

link %>% 
  read_html() %>% 
  html_nodes(xpath = '//*[@id="mw-content-text"]/div/table[2]') %>% 
  html_table(fill = TRUE) %>% 
  .[[1]] -> data_raw


# Rename for columns: 
names(data_raw) <- c("Rank", "Country", "Both", "Female", "Male")

# Remove the first row: 
data_raw %>% filter(Rank != "Rank") -> data_raw

# Conver to numeric and remove missing data: 

data_raw %>% 
  mutate(Country = factor(Country)) %>% 
  mutate_if(is.character, as.numeric) %>% 
  mutate(Country = as.character(Country)) %>% 
  mutate(Country = case_when(str_detect(Country, "Republic of China") ~ "China", TRUE ~ Country)) %>% 
  na.omit() -> df_life


# ASEAN country names: 
asean_link <- "https://en.wikipedia.org/wiki/Association_of_Southeast_Asian_Nations"

asean_link %>% 
  read_html() %>% 
  html_nodes(xpath = '//*[@id="mw-content-text"]/div/table[2]') %>% 
  html_table(fill = TRUE) %>% 
  .[[1]] -> asean_names

# G7 Countries: 
g7_link <- "https://en.wikipedia.org/wiki/Group_of_Seven"

g7_link %>% 
  read_html() %>% 
  html_nodes(xpath = '//*[@id="mw-content-text"]/div/table[5]') %>% 
  html_table(fill = TRUE) %>% 
  .[[1]] -> g7_names

# Filter data for ASEAN + G7 countries + China + India + South Korea: 

df_life %>% 
  filter(Country %in% c(asean_names$Country, g7_names$Member, "China", "India", "South Korea")) %>% 
  mutate(text_color = case_when(Country == "Vietnam" ~ "firebrick", TRUE ~ "gray20")) -> df_mini

df_mini %>% 
  arrange(Male) %>% 
  mutate(Country = factor(Country, levels = Country)) -> aseanG7_life

#===========
#  Plot 1
#===========

library(ggeconodist)
my_font <- "Ubuntu Condensed"

aseanG7_life %>% 
  ggplot(aes(x = Country)) + 
  geom_econodist(aes(ymin = Male, median = Both, ymax = Female), stat = "identity", show.legend = FALSE) + 
  scale_y_continuous(expand = c(0, 0), position = "right", limits = range(60, 90), breaks = seq(60, 90, 5)) +
  coord_flip() + 
  theme_econodist() + 
  theme(plot.margin = unit(rep(1.3, 4), "cm")) + 
  theme(axis.text.y = element_text(color = aseanG7_life$text_color, size = 14, family = my_font)) + 
  theme(axis.text.x = element_text(size = 14, family = my_font)) + 
  theme(plot.title = element_text(size = 26, family = my_font)) + 
  theme(plot.caption = element_text(size = 10, face = "italic")) + 
  labs(x = NULL, y = NULL, 
       title = "Figure 1: Life expectancy at birth by gender, 2018",
       caption = "Data Source: United Nations Development Programme") -> p   


grid.newpage()

p %>% 
  left_align(c("title", "caption")) %>% 
  add_econodist_legend(
    econodist_legend_grob(
      tenth_lab = "Male", 
      ninetieth_lab = "Female", 
      med_lab = "Both", 
      family = my_font, 
      label_size = 14,
      ), 
    below = "title"
    ) %>% 
  grid.draw()

#==============
#   Plot 2
#==============

df_mini %>% 
  arrange(Female) %>% 
  mutate(Country = factor(Country, levels = Country)) %>% 
  mutate(upperLabel = Female - 0.6, lowerLabel = Male + 0.6) -> dfPlot2 

dfvietnam <- dfPlot2 %>% filter(Country == "Vietnam")

dfPlot2 %>% 
  ggplot(aes(x = Country)) + 
  geom_econodist(aes(ymin = Male, median = Both, ymax = Female), stat = "identity", show.legend = FALSE) + 
  scale_y_continuous(expand = c(0, 0), position = "right", limits = range(60, 90), breaks = seq(60, 90, 5)) +
  geom_text(data = dfvietnam, aes(x = Country, y = upperLabel, label = Female), color = "gray30", size = 4.3, family = my_font) + 
  geom_text(data = dfvietnam, aes(x = Country, y = lowerLabel, label = Male), color = "gray30", size = 4.3, family = my_font) + 
  coord_flip() + 
  theme_econodist() + 
  theme(plot.margin = unit(rep(1.3, 4), "cm")) + 
  theme(axis.text.y = element_text(color = dfPlot2$text_color, size = 14, family = my_font)) + 
  theme(axis.text.x = element_text(size = 14, family = my_font)) + 
  theme(plot.title = element_text(size = 26, family = my_font)) + 
  theme(plot.caption = element_text(size = 10, face = "italic")) + 
  labs(x = NULL, y = NULL, 
       title = "Figure 2: Life expectancy at birth by Gender, 2018",
       caption = "Data Source: United Nations Development Programme") -> p2 

grid.newpage()

p2 %>% 
  left_align(c("title", "caption")) %>% 
  add_econodist_legend(
    econodist_legend_grob(
      tenth_lab = "Male", 
      ninetieth_lab = "Female", 
      med_lab = "Both", 
      family = my_font, 
      label_size = 14,
    ), 
    below = "title"
  ) %>% 
  grid.draw()

Countries have the biggest life expectancy gender gap

#===========
#  Plot 3
#===========

n <- nrow(dfPlot2)
some_countries <- c("Vietnam", "Russia", "Syria", "Ukraine")

df_life %>% 
  filter(!Country %in% c("Kiribati", "Eswatini")) %>% 
  mutate(lifeGap = Female - Male) %>% 
  arrange(-lifeGap) %>% 
  slice(1:n) %>% 
  mutate(upperLabel = Female - 0.5, lowerLabel = Male + 0.5) %>%  
  mutate(text_color = case_when(Country %in% some_countries ~ "firebrick", TRUE ~ "gray20")) %>% 
  arrange(Male) %>% 
  mutate(Country = factor(Country, levels = Country)) -> dfPlot3


dfPlot3 %>% filter(Country %in% some_countries) -> df_someCon


dfPlot3 %>% 
  ggplot(aes(x = Country)) + 
  geom_econodist(aes(ymin = Male, median = Both, ymax = Female), stat = "identity", show.legend = FALSE) + 
  scale_y_continuous(expand = c(0, 0), position = "right", limits = range(65, 85), breaks = seq(60, 90, 5)) +
  coord_flip() + 
  theme_econodist() + 
  theme(plot.margin = unit(rep(1.3, 4), "cm")) + 
  theme(axis.text.y = element_text(size = 14, family = my_font, color = dfPlot3$text_color)) + 
  theme(axis.text.x = element_text(size = 14, family = my_font)) + 
  theme(plot.title = element_text(size = 26, family = my_font)) + 
  theme(plot.caption = element_text(size = 10, face = "italic")) + 
  geom_text(data = df_someCon, aes(x = Country, y = upperLabel, label = Female), color = "gray30", size = 4.3, family = my_font) + 
  geom_text(data = df_someCon, aes(x = Country, y = lowerLabel, label = Male), color = "gray30", size = 4.3, family = my_font) + 
  labs(x = NULL, y = NULL, 
       title = "Figure 3: Life expectancy at birth by Gender, 2018",
       caption = "Data Source: United Nations Development Programme") -> p3

grid.newpage()

p3 %>% 
  left_align(c("title", "caption")) %>% 
  add_econodist_legend(
    econodist_legend_grob(
      tenth_lab = "Male", 
      ninetieth_lab = "Female", 
      med_lab = "Both", 
      family = my_font, 
      label_size = 14,
    ), 
    below = "title"
  ) %>% 
  grid.draw()

LS0tCnRpdGxlOiAnTGlmZSBleHBlY3RhbmN5IGF0IGJpcnRoIGJ5IGdlbmRlciwgMjAxOCcKYXV0aG9yOiAnTmd1eWVuIENoaSBEdW5nJwpzdWJ0aXRsZTogIkRhaWx5IEdyYXBoIFNlcmllcyIKb3V0cHV0OgogIGh0bWxfZG9jdW1lbnQ6IAogICAgY29kZV9kb3dubG9hZDogdHJ1ZQogICAgY29kZV9mb2xkaW5nOiBoaWRlCiAgICBoaWdobGlnaHQ6IHplbmJ1cm4KICAgICMgbnVtYmVyX3NlY3Rpb25zOiB5ZXMKICAgIHRoZW1lOiAiZmxhdGx5IgogICAgdG9jOiBUUlVFCiAgICB0b2NfZmxvYXQ6IFRSVUUKLS0tCgpgYGB7ciBzZXR1cCxpbmNsdWRlPUZBTFNFfQprbml0cjo6b3B0c19jaHVuayRzZXQoZWNobyA9IFRSVUUsIHdhcm5pbmcgPSBGQUxTRSwgbWVzc2FnZSA9IEZBTFNFKQpgYGAKCgojIExpZmUgZXhwZWN0YW5jeSBhdCBiaXJ0aCBieSBnZW5kZXIKCmBgYHtyLCBmaWcuaGVpZ2h0PTgsIGZpZy53aWR0aD0xMH0KCiM9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIyAgIENvbGxlY3QgYW5kIGNsZWFuIGRhdGEKIz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKIyBMb2FkIHNvbWUgcGFja2FnZXM6IApsaWJyYXJ5KHRpZHl2ZXJzZSkKbGlicmFyeShydmVzdCkKCiMgRXh0cmFjdCBkYXRhIGZyb20gbGluazogCmxpbmsgPC0gImh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0xpc3Rfb2ZfY291bnRyaWVzX2J5X2xpZmVfZXhwZWN0YW5jeT9mYmNsaWQ9SXdBUjBqUnRmMFJhY1BMeFZQZ2N1dTR6Z1lKbDlIRGswMWNOeTZ1NDh2dnlUdW9LOUNDMWpaSDhfcFpQUSIKCgojIEV4dHJhY3QgZGF0YTogCgpsaW5rICU+JSAKICByZWFkX2h0bWwoKSAlPiUgCiAgaHRtbF9ub2Rlcyh4cGF0aCA9ICcvLypbQGlkPSJtdy1jb250ZW50LXRleHQiXS9kaXYvdGFibGVbMl0nKSAlPiUgCiAgaHRtbF90YWJsZShmaWxsID0gVFJVRSkgJT4lIAogIC5bWzFdXSAtPiBkYXRhX3JhdwoKCiMgUmVuYW1lIGZvciBjb2x1bW5zOiAKbmFtZXMoZGF0YV9yYXcpIDwtIGMoIlJhbmsiLCAiQ291bnRyeSIsICJCb3RoIiwgIkZlbWFsZSIsICJNYWxlIikKCiMgUmVtb3ZlIHRoZSBmaXJzdCByb3c6IApkYXRhX3JhdyAlPiUgZmlsdGVyKFJhbmsgIT0gIlJhbmsiKSAtPiBkYXRhX3JhdwoKIyBDb252ZXIgdG8gbnVtZXJpYyBhbmQgcmVtb3ZlIG1pc3NpbmcgZGF0YTogCgpkYXRhX3JhdyAlPiUgCiAgbXV0YXRlKENvdW50cnkgPSBmYWN0b3IoQ291bnRyeSkpICU+JSAKICBtdXRhdGVfaWYoaXMuY2hhcmFjdGVyLCBhcy5udW1lcmljKSAlPiUgCiAgbXV0YXRlKENvdW50cnkgPSBhcy5jaGFyYWN0ZXIoQ291bnRyeSkpICU+JSAKICBtdXRhdGUoQ291bnRyeSA9IGNhc2Vfd2hlbihzdHJfZGV0ZWN0KENvdW50cnksICJSZXB1YmxpYyBvZiBDaGluYSIpIH4gIkNoaW5hIiwgVFJVRSB+IENvdW50cnkpKSAlPiUgCiAgbmEub21pdCgpIC0+IGRmX2xpZmUKCgojIEFTRUFOIGNvdW50cnkgbmFtZXM6IAphc2Vhbl9saW5rIDwtICJodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9Bc3NvY2lhdGlvbl9vZl9Tb3V0aGVhc3RfQXNpYW5fTmF0aW9ucyIKCmFzZWFuX2xpbmsgJT4lIAogIHJlYWRfaHRtbCgpICU+JSAKICBodG1sX25vZGVzKHhwYXRoID0gJy8vKltAaWQ9Im13LWNvbnRlbnQtdGV4dCJdL2Rpdi90YWJsZVsyXScpICU+JSAKICBodG1sX3RhYmxlKGZpbGwgPSBUUlVFKSAlPiUgCiAgLltbMV1dIC0+IGFzZWFuX25hbWVzCgojIEc3IENvdW50cmllczogCmc3X2xpbmsgPC0gImh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0dyb3VwX29mX1NldmVuIgoKZzdfbGluayAlPiUgCiAgcmVhZF9odG1sKCkgJT4lIAogIGh0bWxfbm9kZXMoeHBhdGggPSAnLy8qW0BpZD0ibXctY29udGVudC10ZXh0Il0vZGl2L3RhYmxlWzVdJykgJT4lIAogIGh0bWxfdGFibGUoZmlsbCA9IFRSVUUpICU+JSAKICAuW1sxXV0gLT4gZzdfbmFtZXMKCiMgRmlsdGVyIGRhdGEgZm9yIEFTRUFOICsgRzcgY291bnRyaWVzICsgQ2hpbmEgKyBJbmRpYSArIFNvdXRoIEtvcmVhOiAKCmRmX2xpZmUgJT4lIAogIGZpbHRlcihDb3VudHJ5ICVpbiUgYyhhc2Vhbl9uYW1lcyRDb3VudHJ5LCBnN19uYW1lcyRNZW1iZXIsICJDaGluYSIsICJJbmRpYSIsICJTb3V0aCBLb3JlYSIpKSAlPiUgCiAgbXV0YXRlKHRleHRfY29sb3IgPSBjYXNlX3doZW4oQ291bnRyeSA9PSAiVmlldG5hbSIgfiAiZmlyZWJyaWNrIiwgVFJVRSB+ICJncmF5MjAiKSkgLT4gZGZfbWluaQoKZGZfbWluaSAlPiUgCiAgYXJyYW5nZShNYWxlKSAlPiUgCiAgbXV0YXRlKENvdW50cnkgPSBmYWN0b3IoQ291bnRyeSwgbGV2ZWxzID0gQ291bnRyeSkpIC0+IGFzZWFuRzdfbGlmZQoKIz09PT09PT09PT09CiMgIFBsb3QgMQojPT09PT09PT09PT0KCmxpYnJhcnkoZ2dlY29ub2Rpc3QpCm15X2ZvbnQgPC0gIlVidW50dSBDb25kZW5zZWQiCgphc2Vhbkc3X2xpZmUgJT4lIAogIGdncGxvdChhZXMoeCA9IENvdW50cnkpKSArIAogIGdlb21fZWNvbm9kaXN0KGFlcyh5bWluID0gTWFsZSwgbWVkaWFuID0gQm90aCwgeW1heCA9IEZlbWFsZSksIHN0YXQgPSAiaWRlbnRpdHkiLCBzaG93LmxlZ2VuZCA9IEZBTFNFKSArIAogIHNjYWxlX3lfY29udGludW91cyhleHBhbmQgPSBjKDAsIDApLCBwb3NpdGlvbiA9ICJyaWdodCIsIGxpbWl0cyA9IHJhbmdlKDYwLCA5MCksIGJyZWFrcyA9IHNlcSg2MCwgOTAsIDUpKSArCiAgY29vcmRfZmxpcCgpICsgCiAgdGhlbWVfZWNvbm9kaXN0KCkgKyAKICB0aGVtZShwbG90Lm1hcmdpbiA9IHVuaXQocmVwKDEuMywgNCksICJjbSIpKSArIAogIHRoZW1lKGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KGNvbG9yID0gYXNlYW5HN19saWZlJHRleHRfY29sb3IsIHNpemUgPSAxNCwgZmFtaWx5ID0gbXlfZm9udCkpICsgCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE0LCBmYW1pbHkgPSBteV9mb250KSkgKyAKICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAyNiwgZmFtaWx5ID0gbXlfZm9udCkpICsgCiAgdGhlbWUocGxvdC5jYXB0aW9uID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMCwgZmFjZSA9ICJpdGFsaWMiKSkgKyAKICBsYWJzKHggPSBOVUxMLCB5ID0gTlVMTCwgCiAgICAgICB0aXRsZSA9ICJGaWd1cmUgMTogTGlmZSBleHBlY3RhbmN5IGF0IGJpcnRoIGJ5IGdlbmRlciwgMjAxOCIsCiAgICAgICBjYXB0aW9uID0gIkRhdGEgU291cmNlOiBVbml0ZWQgTmF0aW9ucyBEZXZlbG9wbWVudCBQcm9ncmFtbWUiKSAtPiBwICAgCgoKZ3JpZC5uZXdwYWdlKCkKCnAgJT4lIAogIGxlZnRfYWxpZ24oYygidGl0bGUiLCAiY2FwdGlvbiIpKSAlPiUgCiAgYWRkX2Vjb25vZGlzdF9sZWdlbmQoCiAgICBlY29ub2Rpc3RfbGVnZW5kX2dyb2IoCiAgICAgIHRlbnRoX2xhYiA9ICJNYWxlIiwgCiAgICAgIG5pbmV0aWV0aF9sYWIgPSAiRmVtYWxlIiwgCiAgICAgIG1lZF9sYWIgPSAiQm90aCIsIAogICAgICBmYW1pbHkgPSBteV9mb250LCAKICAgICAgbGFiZWxfc2l6ZSA9IDE0LAogICAgICApLCAKICAgIGJlbG93ID0gInRpdGxlIgogICAgKSAlPiUgCiAgZ3JpZC5kcmF3KCkKCiM9PT09PT09PT09PT09PQojICAgUGxvdCAyCiM9PT09PT09PT09PT09PQoKZGZfbWluaSAlPiUgCiAgYXJyYW5nZShGZW1hbGUpICU+JSAKICBtdXRhdGUoQ291bnRyeSA9IGZhY3RvcihDb3VudHJ5LCBsZXZlbHMgPSBDb3VudHJ5KSkgJT4lIAogIG11dGF0ZSh1cHBlckxhYmVsID0gRmVtYWxlIC0gMC42LCBsb3dlckxhYmVsID0gTWFsZSArIDAuNikgLT4gZGZQbG90MiAKCmRmdmlldG5hbSA8LSBkZlBsb3QyICU+JSBmaWx0ZXIoQ291bnRyeSA9PSAiVmlldG5hbSIpCgpkZlBsb3QyICU+JSAKICBnZ3Bsb3QoYWVzKHggPSBDb3VudHJ5KSkgKyAKICBnZW9tX2Vjb25vZGlzdChhZXMoeW1pbiA9IE1hbGUsIG1lZGlhbiA9IEJvdGgsIHltYXggPSBGZW1hbGUpLCBzdGF0ID0gImlkZW50aXR5Iiwgc2hvdy5sZWdlbmQgPSBGQUxTRSkgKyAKICBzY2FsZV95X2NvbnRpbnVvdXMoZXhwYW5kID0gYygwLCAwKSwgcG9zaXRpb24gPSAicmlnaHQiLCBsaW1pdHMgPSByYW5nZSg2MCwgOTApLCBicmVha3MgPSBzZXEoNjAsIDkwLCA1KSkgKwogIGdlb21fdGV4dChkYXRhID0gZGZ2aWV0bmFtLCBhZXMoeCA9IENvdW50cnksIHkgPSB1cHBlckxhYmVsLCBsYWJlbCA9IEZlbWFsZSksIGNvbG9yID0gImdyYXkzMCIsIHNpemUgPSA0LjMsIGZhbWlseSA9IG15X2ZvbnQpICsgCiAgZ2VvbV90ZXh0KGRhdGEgPSBkZnZpZXRuYW0sIGFlcyh4ID0gQ291bnRyeSwgeSA9IGxvd2VyTGFiZWwsIGxhYmVsID0gTWFsZSksIGNvbG9yID0gImdyYXkzMCIsIHNpemUgPSA0LjMsIGZhbWlseSA9IG15X2ZvbnQpICsgCiAgY29vcmRfZmxpcCgpICsgCiAgdGhlbWVfZWNvbm9kaXN0KCkgKyAKICB0aGVtZShwbG90Lm1hcmdpbiA9IHVuaXQocmVwKDEuMywgNCksICJjbSIpKSArIAogIHRoZW1lKGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KGNvbG9yID0gZGZQbG90MiR0ZXh0X2NvbG9yLCBzaXplID0gMTQsIGZhbWlseSA9IG15X2ZvbnQpKSArIAogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNCwgZmFtaWx5ID0gbXlfZm9udCkpICsgCiAgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMjYsIGZhbWlseSA9IG15X2ZvbnQpKSArIAogIHRoZW1lKHBsb3QuY2FwdGlvbiA9IGVsZW1lbnRfdGV4dChzaXplID0gMTAsIGZhY2UgPSAiaXRhbGljIikpICsgCiAgbGFicyh4ID0gTlVMTCwgeSA9IE5VTEwsIAogICAgICAgdGl0bGUgPSAiRmlndXJlIDI6IExpZmUgZXhwZWN0YW5jeSBhdCBiaXJ0aCBieSBHZW5kZXIsIDIwMTgiLAogICAgICAgY2FwdGlvbiA9ICJEYXRhIFNvdXJjZTogVW5pdGVkIE5hdGlvbnMgRGV2ZWxvcG1lbnQgUHJvZ3JhbW1lIikgLT4gcDIgCgpncmlkLm5ld3BhZ2UoKQoKcDIgJT4lIAogIGxlZnRfYWxpZ24oYygidGl0bGUiLCAiY2FwdGlvbiIpKSAlPiUgCiAgYWRkX2Vjb25vZGlzdF9sZWdlbmQoCiAgICBlY29ub2Rpc3RfbGVnZW5kX2dyb2IoCiAgICAgIHRlbnRoX2xhYiA9ICJNYWxlIiwgCiAgICAgIG5pbmV0aWV0aF9sYWIgPSAiRmVtYWxlIiwgCiAgICAgIG1lZF9sYWIgPSAiQm90aCIsIAogICAgICBmYW1pbHkgPSBteV9mb250LCAKICAgICAgbGFiZWxfc2l6ZSA9IDE0LAogICAgKSwgCiAgICBiZWxvdyA9ICJ0aXRsZSIKICApICU+JSAKICBncmlkLmRyYXcoKQoKYGBgCgoKIyBDb3VudHJpZXMgaGF2ZSB0aGUgYmlnZ2VzdCBsaWZlIGV4cGVjdGFuY3kgZ2VuZGVyIGdhcAoKYGBge3IsIGZpZy5oZWlnaHQ9OCwgZmlnLndpZHRoPTEwfQoKIz09PT09PT09PT09CiMgIFBsb3QgMwojPT09PT09PT09PT0KCm4gPC0gbnJvdyhkZlBsb3QyKQpzb21lX2NvdW50cmllcyA8LSBjKCJWaWV0bmFtIiwgIlJ1c3NpYSIsICJTeXJpYSIsICJVa3JhaW5lIikKCmRmX2xpZmUgJT4lIAogIGZpbHRlcighQ291bnRyeSAlaW4lIGMoIktpcmliYXRpIiwgIkVzd2F0aW5pIikpICU+JSAKICBtdXRhdGUobGlmZUdhcCA9IEZlbWFsZSAtIE1hbGUpICU+JSAKICBhcnJhbmdlKC1saWZlR2FwKSAlPiUgCiAgc2xpY2UoMTpuKSAlPiUgCiAgbXV0YXRlKHVwcGVyTGFiZWwgPSBGZW1hbGUgLSAwLjUsIGxvd2VyTGFiZWwgPSBNYWxlICsgMC41KSAlPiUgIAogIG11dGF0ZSh0ZXh0X2NvbG9yID0gY2FzZV93aGVuKENvdW50cnkgJWluJSBzb21lX2NvdW50cmllcyB+ICJmaXJlYnJpY2siLCBUUlVFIH4gImdyYXkyMCIpKSAlPiUgCiAgYXJyYW5nZShNYWxlKSAlPiUgCiAgbXV0YXRlKENvdW50cnkgPSBmYWN0b3IoQ291bnRyeSwgbGV2ZWxzID0gQ291bnRyeSkpIC0+IGRmUGxvdDMKCgpkZlBsb3QzICU+JSBmaWx0ZXIoQ291bnRyeSAlaW4lIHNvbWVfY291bnRyaWVzKSAtPiBkZl9zb21lQ29uCgoKZGZQbG90MyAlPiUgCiAgZ2dwbG90KGFlcyh4ID0gQ291bnRyeSkpICsgCiAgZ2VvbV9lY29ub2Rpc3QoYWVzKHltaW4gPSBNYWxlLCBtZWRpYW4gPSBCb3RoLCB5bWF4ID0gRmVtYWxlKSwgc3RhdCA9ICJpZGVudGl0eSIsIHNob3cubGVnZW5kID0gRkFMU0UpICsgCiAgc2NhbGVfeV9jb250aW51b3VzKGV4cGFuZCA9IGMoMCwgMCksIHBvc2l0aW9uID0gInJpZ2h0IiwgbGltaXRzID0gcmFuZ2UoNjUsIDg1KSwgYnJlYWtzID0gc2VxKDYwLCA5MCwgNSkpICsKICBjb29yZF9mbGlwKCkgKyAKICB0aGVtZV9lY29ub2Rpc3QoKSArIAogIHRoZW1lKHBsb3QubWFyZ2luID0gdW5pdChyZXAoMS4zLCA0KSwgImNtIikpICsgCiAgdGhlbWUoYXhpcy50ZXh0LnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE0LCBmYW1pbHkgPSBteV9mb250LCBjb2xvciA9IGRmUGxvdDMkdGV4dF9jb2xvcikpICsgCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE0LCBmYW1pbHkgPSBteV9mb250KSkgKyAKICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAyNiwgZmFtaWx5ID0gbXlfZm9udCkpICsgCiAgdGhlbWUocGxvdC5jYXB0aW9uID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMCwgZmFjZSA9ICJpdGFsaWMiKSkgKyAKICBnZW9tX3RleHQoZGF0YSA9IGRmX3NvbWVDb24sIGFlcyh4ID0gQ291bnRyeSwgeSA9IHVwcGVyTGFiZWwsIGxhYmVsID0gRmVtYWxlKSwgY29sb3IgPSAiZ3JheTMwIiwgc2l6ZSA9IDQuMywgZmFtaWx5ID0gbXlfZm9udCkgKyAKICBnZW9tX3RleHQoZGF0YSA9IGRmX3NvbWVDb24sIGFlcyh4ID0gQ291bnRyeSwgeSA9IGxvd2VyTGFiZWwsIGxhYmVsID0gTWFsZSksIGNvbG9yID0gImdyYXkzMCIsIHNpemUgPSA0LjMsIGZhbWlseSA9IG15X2ZvbnQpICsgCiAgbGFicyh4ID0gTlVMTCwgeSA9IE5VTEwsIAogICAgICAgdGl0bGUgPSAiRmlndXJlIDM6IExpZmUgZXhwZWN0YW5jeSBhdCBiaXJ0aCBieSBHZW5kZXIsIDIwMTgiLAogICAgICAgY2FwdGlvbiA9ICJEYXRhIFNvdXJjZTogVW5pdGVkIE5hdGlvbnMgRGV2ZWxvcG1lbnQgUHJvZ3JhbW1lIikgLT4gcDMKCmdyaWQubmV3cGFnZSgpCgpwMyAlPiUgCiAgbGVmdF9hbGlnbihjKCJ0aXRsZSIsICJjYXB0aW9uIikpICU+JSAKICBhZGRfZWNvbm9kaXN0X2xlZ2VuZCgKICAgIGVjb25vZGlzdF9sZWdlbmRfZ3JvYigKICAgICAgdGVudGhfbGFiID0gIk1hbGUiLCAKICAgICAgbmluZXRpZXRoX2xhYiA9ICJGZW1hbGUiLCAKICAgICAgbWVkX2xhYiA9ICJCb3RoIiwgCiAgICAgIGZhbWlseSA9IG15X2ZvbnQsIAogICAgICBsYWJlbF9zaXplID0gMTQsCiAgICApLCAKICAgIGJlbG93ID0gInRpdGxlIgogICkgJT4lIAogIGdyaWQuZHJhdygpCiAgICAKYGBgCgo=