Economist-Style Plot using R
The graph was created by the Economist and can be replicated by using R as follows:

R Codes for Data Cleaning and Visualization
rm(list = ls())
# Package for data manipulation:
library(tidyverse)
# Load wbstats package:
library(wbstats)
# A list of indicators:
my_indicator <- c("SP.DYN.TFRT.IN", "SP.POP.TOTL", "NY.GDP.PCAP.CD")
# Collect data for indicators:
data <- wb(country = "all",
indicator = my_indicator,
startdate = 2017,
enddate = 2017)
# Relabel:
data %>%
select(iso3c, value, indicatorID, country) %>%
mutate(indicator_name = case_when(indicatorID == my_indicator[1] ~ "fertility",
indicatorID == my_indicator[2] ~ "population",
TRUE ~ "gdp")) -> data
# Country code:
general_information <- wb_cachelist
codes <- general_information[[1]]
codes %>%
select(iso3c, country, long, lat) %>%
filter(!is.na(long)) %>%
pull(iso3c) -> all_nations
# Convert to wide form for data set:
data %>%
filter(iso3c %in% all_nations) %>%
select(-indicatorID) %>%
spread(key = "indicator_name", value = "value") %>%
na.omit() -> dfPlot
# https://www.economist.com/graphic-detail/2019/08/30/south-koreas-fertility-rate-falls-to-a-record-low
library(scales)
library(ggrepel)
library(ggthemes)
pointColor <- "#2fc1d3"
my_font <- "Ubuntu Condensed"
h1 <- 0.75
h2 <- 0.5
grey20 <- "grey20"
dfPlot %>%
ggplot(aes(gdp, fertility, size = population)) +
geom_point(show.legend = FALSE, color = pointColor, alpha = 0.5) +
scale_size(range = c(1, 25)) +
geom_hline(aes(yintercept = 2.1), color = "#e5001c", alpha = 0.6, linetype = "dashed", size = 0.6) +
theme_economist_white(base_family = my_font) +
scale_x_continuous(labels = dollar, limits = c(100, 110000),
trans = "log10", expand = c(0.01, 0)) +
scale_y_continuous(breaks = seq(0, 8, 2), limits = c(0, 9),
position = "right", expand = c(0, 0)) +
# China + India:
geom_segment(data = dfPlot %>% filter(country %in% c("India", "China")),
aes(x = gdp, xend = gdp, y = fertility, yend = fertility - h1),
size = 0.5) +
geom_point(data = dfPlot %>% filter(country %in% c("India", "China")),
aes(x = gdp, y = fertility, size = population), shape = 21,
fill = pointColor, show.legend = FALSE) +
geom_text_repel(data = dfPlot %>% filter(country %in% c("India", "China")),
aes(x = gdp, y = fertility - h1, label = country),
nudge_x = -0.3, direction = "x", size = 4.5, family = my_font) +
# Thailand:
geom_text_repel(data = dfPlot %>% filter(country == "Thailand"),
aes(x = gdp, y = fertility, label = country),
direction = "x", nudge_x = -0.25, size = 4.5, family = my_font) +
geom_point(data = dfPlot %>% filter(country == "Thailand"),
aes(x = gdp, y = fertility, size = population), shape = 21,
fill = pointColor, show.legend = FALSE) +
# Vietnam:
geom_segment(data = dfPlot %>% filter(country == "Vietnam"),
aes(x = gdp, xend = gdp, y = fertility, yend = fertility - 1.2),
size = 0.5) +
geom_point(data = dfPlot %>% filter(country == "Vietnam"),
aes(x = gdp, y = fertility, size = population), shape = 21,
fill = pointColor, show.legend = FALSE) +
geom_text_repel(data = dfPlot %>% filter(country == "Vietnam"),
aes(x = gdp, y = fertility - 1.1, label = country),
direction = "y", nudge_y = -0.05, size = 4.5, family = my_font, fontface = "bold") +
# United States:
geom_segment(data = dfPlot %>% filter(country == "United States"),
aes(x = gdp, xend = gdp, y = fertility, yend = fertility + 0.3),
size = 0.5) +
geom_point(data = dfPlot %>% filter(country == "United States"),
aes(x = gdp, y = fertility, size = population), shape = 21,
fill = pointColor, show.legend = FALSE) +
geom_text_repel(data = dfPlot %>% filter(country == "United States"),
aes(x = gdp, y = fertility + 0.3, label = country),
nudge_y = 0.4, direction = "y", size = 4.5, family = my_font) +
# Singapore:
geom_segment(data = dfPlot %>% filter(country == "Singapore"),
aes(x = gdp, xend = gdp, y = fertility, yend = fertility - h2),
size = 0.5) +
geom_point(data = dfPlot %>% filter(country == "Singapore"),
aes(x = gdp, y = fertility, size = population), shape = 21,
fill = pointColor, show.legend = FALSE) +
geom_text_repel(data = dfPlot %>% filter(country == "Singapore"),
aes(x = gdp, y = fertility - h2, label = country),
nudge_x = -0.3, direction = "x", size = 4.5, family = my_font) +
# Japan:
geom_segment(data = dfPlot %>% filter(country == "Japan"),
aes(x = gdp, xend = gdp, y = fertility, yend = fertility + 1.3),
size = 0.5) +
geom_point(data = dfPlot %>% filter(country == "Japan"),
aes(x = gdp, y = fertility, size = population), shape = 21,
fill = pointColor, show.legend = FALSE) +
geom_text_repel(data = dfPlot %>% filter(country == "Japan"),
aes(x = gdp, y = fertility + 1.3, label = country),
nudge_x = -0.2, direction = "x", size = 4.6, family = my_font) +
# Niger:
geom_text_repel(data = dfPlot %>% filter(country == "Niger"),
aes(x = gdp, y = fertility, label = country),
direction = "x", nudge_x = 0.2, size = 4.5, family = my_font) +
geom_point(data = dfPlot %>% filter(country == "Niger"),
aes(x = gdp, y = fertility, size = population), shape = 21,
fill = pointColor, show.legend = FALSE) +
theme(plot.background = element_rect(fill = "white")) +
theme(plot.margin = unit(c(1, 1, 1, 0.8), "cm")) +
theme(axis.text.y = element_blank()) +
theme(axis.title.y = element_blank()) +
labs(x = "GDP per capital, $, log scale",
title = "Gone baby gone",
subtitle = "GDP and fertility, 2017",
caption = "Source: United Nations; World Bank") +
theme(plot.title = element_text(size = 20),
plot.subtitle = element_text(size = 15),
plot.caption = element_text(size = 11, colour = "grey30")) +
theme(axis.ticks.length.x = unit(2, "mm")) +
theme(axis.title.x = element_text(size = 14, color = "grey10"),
axis.text.x = element_text(size = 14, color = "grey20")) +
annotate("text", x = 110000, y = seq(0, 8, 2) + 0.2, label = seq(0, 8, 2), family = my_font, size = 5, color = "grey20") +
annotate("text", x = 110000, y = 8.7, label = "Fertility rate", family = my_font, size = 5, color = "grey10", hjust = 1) +
annotate("text", x = 100, y = 2.35, label = "Replacement fertility level",
family = "Arial Narrow", size = 5, color = "#e5001c", hjust = -0.02, alpha = 0.7)
library(grid)
grid.rect(x = 1, y = 0.995, hjust = 0.97, vjust = 0, gp = gpar(fill = "#e5001c", lwd = 0))
grid.rect(x = 0.05, y = 0.97, hjust = 0.97, vjust = 0, gp = gpar(fill = "#e5001c", lwd = 0))
LS0tCnRpdGxlOiAiVmlldG5hbSDigJlzIGZlcnRpbGl0eSByYXRlIgphdXRob3I6ICdOZ3V5ZW4gQ2hpIER1bmcnCnN1YnRpdGxlOiAiRGFpbHkgR3JhcGggU2VyaWVzIgpvdXRwdXQ6CiAgaHRtbF9kb2N1bWVudDogCiAgICBjb2RlX2Rvd25sb2FkOiB0cnVlCiAgICAjICAgY29kZV9mb2xkaW5nOiBoaWRlCiAgICBoaWdobGlnaHQ6IHplbmJ1cm4KICAgICMgbnVtYmVyX3NlY3Rpb25zOiB5ZXMKICAgIHRoZW1lOiAiZmxhdGx5IgogICAgdG9jOiBUUlVFCiAgICB0b2NfZmxvYXQ6IFRSVUUKLS0tCgpgYGB7ciBzZXR1cCxpbmNsdWRlPUZBTFNFfQprbml0cjo6b3B0c19jaHVuayRzZXQoZWNobyA9IFRSVUUsIHdhcm5pbmcgPSBGQUxTRSwgbWVzc2FnZSA9IEZBTFNFLCBmaWcud2lkdGggPSAxMCwgZmlnLmhlaWdodCA9IDYpCmBgYAoKIyBFY29ub21pc3QtU3R5bGUgUGxvdCB1c2luZyBSCgpUaGUgZ3JhcGggd2FzIGNyZWF0ZWQgYnkgW3RoZSBFY29ub21pc3RdKGh0dHBzOi8vd3d3LmVjb25vbWlzdC5jb20vZ3JhcGhpYy1kZXRhaWwvMjAxOS8wOC8zMC9zb3V0aC1rb3JlYXMtZmVydGlsaXR5LXJhdGUtZmFsbHMtdG8tYS1yZWNvcmQtbG93KSBhbmQgY2FuIGJlIHJlcGxpY2F0ZWQgYnkgdXNpbmcgUiBhcyBmb2xsb3dzOiAKICAKIVtdKC9ob21lL2toYW5oYW4vRmVydGlsaXR5LnBuZykKCgojIFIgQ29kZXMgZm9yIERhdGEgQ2xlYW5pbmcgYW5kIFZpc3VhbGl6YXRpb24KCgpgYGB7ciwgZXZhbD1GQUxTRX0KCnJtKGxpc3QgPSBscygpKQojIFBhY2thZ2UgZm9yIGRhdGEgbWFuaXB1bGF0aW9uOiAKbGlicmFyeSh0aWR5dmVyc2UpCgojIExvYWQgd2JzdGF0cyBwYWNrYWdlOiAKbGlicmFyeSh3YnN0YXRzKQoKIyBBIGxpc3Qgb2YgaW5kaWNhdG9yczogCm15X2luZGljYXRvciA8LSBjKCJTUC5EWU4uVEZSVC5JTiIsICJTUC5QT1AuVE9UTCIsICJOWS5HRFAuUENBUC5DRCIpCgojIENvbGxlY3QgZGF0YSBmb3IgaW5kaWNhdG9yczogCgpkYXRhIDwtIHdiKGNvdW50cnkgPSAiYWxsIiwKICAgICAgICAgICBpbmRpY2F0b3IgPSBteV9pbmRpY2F0b3IsCiAgICAgICAgICAgc3RhcnRkYXRlID0gMjAxNywKICAgICAgICAgICBlbmRkYXRlID0gMjAxNykKCiMgUmVsYWJlbDogCgpkYXRhICU+JSAKICBzZWxlY3QoaXNvM2MsIHZhbHVlLCBpbmRpY2F0b3JJRCwgY291bnRyeSkgJT4lIAogIG11dGF0ZShpbmRpY2F0b3JfbmFtZSA9IGNhc2Vfd2hlbihpbmRpY2F0b3JJRCA9PSBteV9pbmRpY2F0b3JbMV0gfiAiZmVydGlsaXR5IiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGljYXRvcklEID09IG15X2luZGljYXRvclsyXSB+ICJwb3B1bGF0aW9uIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRSVUUgfiAiZ2RwIikpIC0+IGRhdGEKCiMgQ291bnRyeSBjb2RlOiAKCmdlbmVyYWxfaW5mb3JtYXRpb24gPC0gIHdiX2NhY2hlbGlzdApjb2RlcyA8LSBnZW5lcmFsX2luZm9ybWF0aW9uW1sxXV0KCmNvZGVzICU+JSAKICBzZWxlY3QoaXNvM2MsIGNvdW50cnksIGxvbmcsIGxhdCkgJT4lIAogIGZpbHRlcighaXMubmEobG9uZykpICU+JSAKICBwdWxsKGlzbzNjKSAtPiBhbGxfbmF0aW9ucwoKIyBDb252ZXJ0IHRvIHdpZGUgZm9ybSBmb3IgZGF0YSBzZXQ6IAoKZGF0YSAlPiUgCiAgZmlsdGVyKGlzbzNjICVpbiUgYWxsX25hdGlvbnMpICU+JSAKICBzZWxlY3QoLWluZGljYXRvcklEKSAlPiUgCiAgc3ByZWFkKGtleSA9ICJpbmRpY2F0b3JfbmFtZSIsIHZhbHVlID0gInZhbHVlIikgJT4lIAogIG5hLm9taXQoKSAtPiBkZlBsb3QKCiMgaHR0cHM6Ly93d3cuZWNvbm9taXN0LmNvbS9ncmFwaGljLWRldGFpbC8yMDE5LzA4LzMwL3NvdXRoLWtvcmVhcy1mZXJ0aWxpdHktcmF0ZS1mYWxscy10by1hLXJlY29yZC1sb3cKCmxpYnJhcnkoc2NhbGVzKQpsaWJyYXJ5KGdncmVwZWwpCmxpYnJhcnkoZ2d0aGVtZXMpCgpwb2ludENvbG9yIDwtICIjMmZjMWQzIgpteV9mb250IDwtICJVYnVudHUgQ29uZGVuc2VkIgpoMSA8LSAwLjc1CmgyIDwtIDAuNQpncmV5MjAgPC0gImdyZXkyMCIKCgpkZlBsb3QgJT4lIAogIGdncGxvdChhZXMoZ2RwLCBmZXJ0aWxpdHksIHNpemUgPSBwb3B1bGF0aW9uKSkgKyAKICBnZW9tX3BvaW50KHNob3cubGVnZW5kID0gRkFMU0UsIGNvbG9yID0gcG9pbnRDb2xvciwgYWxwaGEgPSAwLjUpICsgCiAgc2NhbGVfc2l6ZShyYW5nZSA9IGMoMSwgMjUpKSArIAogIGdlb21faGxpbmUoYWVzKHlpbnRlcmNlcHQgPSAyLjEpLCBjb2xvciA9ICIjZTUwMDFjIiwgYWxwaGEgPSAwLjYsIGxpbmV0eXBlID0gImRhc2hlZCIsIHNpemUgPSAwLjYpICsgCiAgdGhlbWVfZWNvbm9taXN0X3doaXRlKGJhc2VfZmFtaWx5ID0gbXlfZm9udCkgKyAKICBzY2FsZV94X2NvbnRpbnVvdXMobGFiZWxzID0gZG9sbGFyLCBsaW1pdHMgPSBjKDEwMCwgMTEwMDAwKSwgCiAgICAgICAgICAgICAgICAgICAgIHRyYW5zID0gImxvZzEwIiwgZXhwYW5kID0gYygwLjAxLCAwKSkgKwogIHNjYWxlX3lfY29udGludW91cyhicmVha3MgPSBzZXEoMCwgOCwgMiksIGxpbWl0cyA9IGMoMCwgOSksIAogICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbiA9ICJyaWdodCIsIGV4cGFuZCA9IGMoMCwgMCkpICsgCiAgIyBDaGluYSArIEluZGlhOiAKICBnZW9tX3NlZ21lbnQoZGF0YSA9IGRmUGxvdCAlPiUgZmlsdGVyKGNvdW50cnkgJWluJSBjKCJJbmRpYSIsICJDaGluYSIpKSwgCiAgICAgICAgICAgICAgIGFlcyh4ID0gZ2RwLCB4ZW5kID0gZ2RwLCB5ID0gZmVydGlsaXR5LCB5ZW5kID0gZmVydGlsaXR5IC0gaDEpLCAKICAgICAgICAgICAgICAgc2l6ZSA9IDAuNSkgKyAKICBnZW9tX3BvaW50KGRhdGEgPSBkZlBsb3QgJT4lIGZpbHRlcihjb3VudHJ5ICVpbiUgYygiSW5kaWEiLCAiQ2hpbmEiKSksIAogICAgICAgICAgICAgYWVzKHggPSBnZHAsIHkgPSBmZXJ0aWxpdHksIHNpemUgPSBwb3B1bGF0aW9uKSwgc2hhcGUgPSAyMSwgCiAgICAgICAgICAgICBmaWxsID0gcG9pbnRDb2xvciwgc2hvdy5sZWdlbmQgPSBGQUxTRSkgKyAKICBnZW9tX3RleHRfcmVwZWwoZGF0YSA9IGRmUGxvdCAlPiUgZmlsdGVyKGNvdW50cnkgJWluJSBjKCJJbmRpYSIsICJDaGluYSIpKSwgCiAgICAgICAgICAgICAgICAgIGFlcyh4ID0gZ2RwLCB5ID0gZmVydGlsaXR5IC0gaDEsIGxhYmVsID0gY291bnRyeSksIAogICAgICAgICAgICAgICAgICBudWRnZV94ID0gLTAuMywgZGlyZWN0aW9uID0gIngiLCBzaXplID0gNC41LCBmYW1pbHkgPSBteV9mb250KSArIAogICMgVGhhaWxhbmQ6IAogIGdlb21fdGV4dF9yZXBlbChkYXRhID0gZGZQbG90ICU+JSBmaWx0ZXIoY291bnRyeSA9PSAiVGhhaWxhbmQiKSwgCiAgICAgICAgICAgICAgICAgIGFlcyh4ID0gZ2RwLCB5ID0gZmVydGlsaXR5LCBsYWJlbCA9IGNvdW50cnkpLCAKICAgICAgICAgICAgICAgICAgZGlyZWN0aW9uID0gIngiLCBudWRnZV94ID0gLTAuMjUsIHNpemUgPSA0LjUsIGZhbWlseSA9IG15X2ZvbnQpICsgCiAgZ2VvbV9wb2ludChkYXRhID0gZGZQbG90ICU+JSBmaWx0ZXIoY291bnRyeSA9PSAiVGhhaWxhbmQiKSwgCiAgICAgICAgICAgICBhZXMoeCA9IGdkcCwgeSA9IGZlcnRpbGl0eSwgc2l6ZSA9IHBvcHVsYXRpb24pLCBzaGFwZSA9IDIxLCAKICAgICAgICAgICAgIGZpbGwgPSBwb2ludENvbG9yLCBzaG93LmxlZ2VuZCA9IEZBTFNFKSArIAogICMgVmlldG5hbTogCiAgZ2VvbV9zZWdtZW50KGRhdGEgPSBkZlBsb3QgJT4lIGZpbHRlcihjb3VudHJ5ID09ICJWaWV0bmFtIiksCiAgICAgICAgICAgICAgIGFlcyh4ID0gZ2RwLCB4ZW5kID0gZ2RwLCB5ID0gZmVydGlsaXR5LCB5ZW5kID0gZmVydGlsaXR5IC0gMS4yKSwKICAgICAgICAgICAgICAgc2l6ZSA9IDAuNSkgICsKICBnZW9tX3BvaW50KGRhdGEgPSBkZlBsb3QgJT4lIGZpbHRlcihjb3VudHJ5ID09ICJWaWV0bmFtIiksIAogICAgICAgICAgICAgYWVzKHggPSBnZHAsIHkgPSBmZXJ0aWxpdHksIHNpemUgPSBwb3B1bGF0aW9uKSwgc2hhcGUgPSAyMSwgCiAgICAgICAgICAgICBmaWxsID0gcG9pbnRDb2xvciwgc2hvdy5sZWdlbmQgPSBGQUxTRSkgKyAKICBnZW9tX3RleHRfcmVwZWwoZGF0YSA9IGRmUGxvdCAlPiUgZmlsdGVyKGNvdW50cnkgPT0gIlZpZXRuYW0iKSwKICAgICAgICAgICAgICAgICAgYWVzKHggPSBnZHAsIHkgPSBmZXJ0aWxpdHkgLSAxLjEsIGxhYmVsID0gY291bnRyeSksCiAgICAgICAgICAgICAgICAgIGRpcmVjdGlvbiA9ICJ5IiwgbnVkZ2VfeSA9IC0wLjA1LCBzaXplID0gNC41LCBmYW1pbHkgPSBteV9mb250LCBmb250ZmFjZSA9ICJib2xkIikgKwogICMgVW5pdGVkIFN0YXRlczogCiAgZ2VvbV9zZWdtZW50KGRhdGEgPSBkZlBsb3QgJT4lIGZpbHRlcihjb3VudHJ5ID09ICJVbml0ZWQgU3RhdGVzIiksIAogICAgICAgICAgICAgICBhZXMoeCA9IGdkcCwgeGVuZCA9IGdkcCwgeSA9IGZlcnRpbGl0eSwgeWVuZCA9IGZlcnRpbGl0eSArIDAuMyksIAogICAgICAgICAgICAgICBzaXplID0gMC41KSArIAogIGdlb21fcG9pbnQoZGF0YSA9IGRmUGxvdCAlPiUgZmlsdGVyKGNvdW50cnkgPT0gIlVuaXRlZCBTdGF0ZXMiKSwgCiAgICAgICAgICAgICBhZXMoeCA9IGdkcCwgeSA9IGZlcnRpbGl0eSwgc2l6ZSA9IHBvcHVsYXRpb24pLCBzaGFwZSA9IDIxLCAKICAgICAgICAgICAgIGZpbGwgPSBwb2ludENvbG9yLCBzaG93LmxlZ2VuZCA9IEZBTFNFKSArCiAgZ2VvbV90ZXh0X3JlcGVsKGRhdGEgPSBkZlBsb3QgJT4lIGZpbHRlcihjb3VudHJ5ID09ICJVbml0ZWQgU3RhdGVzIiksCiAgICAgICAgICAgICAgICAgIGFlcyh4ID0gZ2RwLCB5ID0gZmVydGlsaXR5ICsgMC4zLCBsYWJlbCA9IGNvdW50cnkpLAogICAgICAgICAgICAgICAgICBudWRnZV95ID0gMC40LCBkaXJlY3Rpb24gPSAieSIsIHNpemUgPSA0LjUsIGZhbWlseSA9IG15X2ZvbnQpICsKICAjIFNpbmdhcG9yZTogCiAgZ2VvbV9zZWdtZW50KGRhdGEgPSBkZlBsb3QgJT4lIGZpbHRlcihjb3VudHJ5ID09ICJTaW5nYXBvcmUiKSwgCiAgICAgICAgICAgICAgIGFlcyh4ID0gZ2RwLCB4ZW5kID0gZ2RwLCB5ID0gZmVydGlsaXR5LCB5ZW5kID0gZmVydGlsaXR5IC0gaDIpLCAKICAgICAgICAgICAgICAgc2l6ZSA9IDAuNSkgKyAKICBnZW9tX3BvaW50KGRhdGEgPSBkZlBsb3QgJT4lIGZpbHRlcihjb3VudHJ5ID09ICJTaW5nYXBvcmUiKSwgCiAgICAgICAgICAgICBhZXMoeCA9IGdkcCwgeSA9IGZlcnRpbGl0eSwgc2l6ZSA9IHBvcHVsYXRpb24pLCBzaGFwZSA9IDIxLCAKICAgICAgICAgICAgIGZpbGwgPSBwb2ludENvbG9yLCBzaG93LmxlZ2VuZCA9IEZBTFNFKSArIAogIGdlb21fdGV4dF9yZXBlbChkYXRhID0gZGZQbG90ICU+JSBmaWx0ZXIoY291bnRyeSA9PSAiU2luZ2Fwb3JlIiksIAogICAgICAgICAgICAgICAgICBhZXMoeCA9IGdkcCwgeSA9IGZlcnRpbGl0eSAtIGgyLCBsYWJlbCA9IGNvdW50cnkpLCAKICAgICAgICAgICAgICAgICAgbnVkZ2VfeCA9IC0wLjMsIGRpcmVjdGlvbiA9ICJ4Iiwgc2l6ZSA9IDQuNSwgZmFtaWx5ID0gbXlfZm9udCkgKyAKICAjIEphcGFuOiAKICBnZW9tX3NlZ21lbnQoZGF0YSA9IGRmUGxvdCAlPiUgZmlsdGVyKGNvdW50cnkgPT0gIkphcGFuIiksIAogICAgICAgICAgICAgICBhZXMoeCA9IGdkcCwgeGVuZCA9IGdkcCwgeSA9IGZlcnRpbGl0eSwgeWVuZCA9IGZlcnRpbGl0eSArIDEuMyksIAogICAgICAgICAgICAgICBzaXplID0gMC41KSArIAogIGdlb21fcG9pbnQoZGF0YSA9IGRmUGxvdCAlPiUgZmlsdGVyKGNvdW50cnkgPT0gIkphcGFuIiksIAogICAgICAgICAgICAgYWVzKHggPSBnZHAsIHkgPSBmZXJ0aWxpdHksIHNpemUgPSBwb3B1bGF0aW9uKSwgc2hhcGUgPSAyMSwgCiAgICAgICAgICAgICBmaWxsID0gcG9pbnRDb2xvciwgc2hvdy5sZWdlbmQgPSBGQUxTRSkgKyAKICBnZW9tX3RleHRfcmVwZWwoZGF0YSA9IGRmUGxvdCAlPiUgZmlsdGVyKGNvdW50cnkgPT0gIkphcGFuIiksIAogICAgICAgICAgICAgICAgICBhZXMoeCA9IGdkcCwgeSA9IGZlcnRpbGl0eSArIDEuMywgbGFiZWwgPSBjb3VudHJ5KSwgCiAgICAgICAgICAgICAgICAgIG51ZGdlX3ggPSAtMC4yLCBkaXJlY3Rpb24gPSAieCIsIHNpemUgPSA0LjYsIGZhbWlseSA9IG15X2ZvbnQpICsgCiAgIyBOaWdlcjogCiAgZ2VvbV90ZXh0X3JlcGVsKGRhdGEgPSBkZlBsb3QgJT4lIGZpbHRlcihjb3VudHJ5ID09ICJOaWdlciIpLCAKICAgICAgICAgICAgICAgICAgYWVzKHggPSBnZHAsIHkgPSBmZXJ0aWxpdHksIGxhYmVsID0gY291bnRyeSksIAogICAgICAgICAgICAgICAgICBkaXJlY3Rpb24gPSAieCIsIG51ZGdlX3ggPSAwLjIsIHNpemUgPSA0LjUsIGZhbWlseSA9IG15X2ZvbnQpICsgCiAgZ2VvbV9wb2ludChkYXRhID0gZGZQbG90ICU+JSBmaWx0ZXIoY291bnRyeSA9PSAiTmlnZXIiKSwgCiAgICAgICAgICAgICBhZXMoeCA9IGdkcCwgeSA9IGZlcnRpbGl0eSwgc2l6ZSA9IHBvcHVsYXRpb24pLCBzaGFwZSA9IDIxLCAKICAgICAgICAgICAgIGZpbGwgPSBwb2ludENvbG9yLCBzaG93LmxlZ2VuZCA9IEZBTFNFKSArIAogIHRoZW1lKHBsb3QuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gIndoaXRlIikpICsgCiAgdGhlbWUocGxvdC5tYXJnaW4gPSB1bml0KGMoMSwgMSwgMSwgMC44KSwgImNtIikpICsgCiAgdGhlbWUoYXhpcy50ZXh0LnkgPSBlbGVtZW50X2JsYW5rKCkpICsgCiAgdGhlbWUoYXhpcy50aXRsZS55ID0gZWxlbWVudF9ibGFuaygpKSArIAogIGxhYnMoeCA9ICJHRFAgcGVyIGNhcGl0YWwsICQsIGxvZyBzY2FsZSIsIAogICAgICAgdGl0bGUgPSAiR29uZSBiYWJ5IGdvbmUiLCAKICAgICAgIHN1YnRpdGxlID0gIkdEUCBhbmQgZmVydGlsaXR5LCAyMDE3IiwgCiAgICAgICBjYXB0aW9uID0gIlNvdXJjZTogVW5pdGVkIE5hdGlvbnM7IFdvcmxkIEJhbmsiKSArIAogIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDIwKSwgCiAgICAgICAgcGxvdC5zdWJ0aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTUpLCAKICAgICAgICBwbG90LmNhcHRpb24gPSBlbGVtZW50X3RleHQoc2l6ZSA9IDExLCBjb2xvdXIgPSAiZ3JleTMwIikpICsgCiAgdGhlbWUoYXhpcy50aWNrcy5sZW5ndGgueCA9IHVuaXQoMiwgIm1tIikpICsgCiAgdGhlbWUoYXhpcy50aXRsZS54ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNCwgY29sb3IgPSAiZ3JleTEwIiksIAogICAgICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNCwgY29sb3IgPSAiZ3JleTIwIikpICsgCiAgYW5ub3RhdGUoInRleHQiLCB4ID0gMTEwMDAwLCB5ID0gc2VxKDAsIDgsIDIpICsgMC4yLCBsYWJlbCA9IHNlcSgwLCA4LCAyKSwgZmFtaWx5ID0gbXlfZm9udCwgc2l6ZSA9IDUsIGNvbG9yID0gImdyZXkyMCIpICsgCiAgYW5ub3RhdGUoInRleHQiLCB4ID0gMTEwMDAwLCB5ID0gOC43LCBsYWJlbCA9ICJGZXJ0aWxpdHkgcmF0ZSIsIGZhbWlseSA9IG15X2ZvbnQsIHNpemUgPSA1LCBjb2xvciA9ICJncmV5MTAiLCBoanVzdCA9IDEpICsgCiAgYW5ub3RhdGUoInRleHQiLCB4ID0gMTAwLCB5ID0gMi4zNSwgbGFiZWwgPSAiUmVwbGFjZW1lbnQgZmVydGlsaXR5IGxldmVsIiwgCiAgICAgICAgICAgZmFtaWx5ID0gIkFyaWFsIE5hcnJvdyIsIHNpemUgPSA1LCBjb2xvciA9ICIjZTUwMDFjIiwgaGp1c3QgPSAtMC4wMiwgYWxwaGEgPSAwLjcpCgoKbGlicmFyeShncmlkKQpncmlkLnJlY3QoeCA9IDEsIHkgPSAwLjk5NSwgaGp1c3QgPSAwLjk3LCB2anVzdCA9IDAsIGdwID0gZ3BhcihmaWxsID0gIiNlNTAwMWMiLCBsd2QgPSAwKSkKZ3JpZC5yZWN0KHggPSAwLjA1LCB5ID0gMC45NywgaGp1c3QgPSAwLjk3LCB2anVzdCA9IDAsIGdwID0gZ3BhcihmaWxsID0gIiNlNTAwMWMiLCBsd2QgPSAwKSkKCmBgYAoKCg==