rm(list = ls())

Sys.setenv(LANG = "en")
library(xlsx)
library(readr)
library(readxl)
library(tidyverse)
library(stringr)
library(stringi)
library(gghighlight)
library(countrycode)
library(countries)
library(janitor)
library(sf)

library(janitor)
library(sf)
library(ggthemes)
library(here)
library(viridis)
library(ggplot2)
library(formatR)
library(gtools)
library(nnet) 
library(patchwork)
library(ggh4x)

library(plm)
library(broom)
library(ggalluvial)

library(pals)

Load data —————————————————————

Large datasets (move load to different notebook)

aggregates <- read_csv("../aggregated_data/aggregates.csv")
aggregates_year <- read_csv("../aggregated_data/aggregates_year.csv")

Convert vars to factor. read_csv changes original type.

aggregates_year <- aggregates_year %>% 
  mutate(subregion_rf = as_factor(subregion),
        subregion_rf = relevel(subregion_rf, "Northern America"),
        continent = as_factor(continent),
        continent = relevel(continent, "Americas"))

Figure 6. Regression

regr_numeric <- c("population_n",
                  "immig_stock",
                  "immig_relative_stock",
                  "emig_stock",
                  "emig_stock_rel_ctry",
                  "research_GDP",
                  "research",
                  "GDP")

aggregates_mod <- aggregates_year %>% 
    filter(!is.na(ISO3)) %>% 
    filter(pubyear %in% c(1996, 2000, 2005, 2010, 2015, 2020),
           !is.na(GDP) & !is.na(research)) %>% 
    mutate(repr_y_s_2 = as.factor(if_else(repr_y_s %in% c("Fair", "Over"), 0, 1)),
           across(all_of(regr_numeric), ~ .x + 0.000000000001))

Linear probability model.

Functions

tidy_r1 <- function(reg) {
  reg %>% tidy(conf.int = TRUE) %>% 
    filter(!str_detect(term, 'pubyear'), 
           !term %in% c("(Intercept)", "log(population_n)")) %>% 
    mutate(term = str_remove(term, "subregion_rf"),
           term = str_remove(term, "continent"),
           term = case_when(
               term == "log(GDP)" ~  "GDPpc",
               term == "log(research_GDP)" ~  "Research as % of GDPpc",
               term == "gsouthGlobal South" ~ "Global South",
               term == "log(emig_stock)" ~ "Emigration stock",
               term == "log(immig_stock)" ~ "Immigration stock",
               TRUE ~ term),
           term = fct_reorder(term, estimate),
           significant = if_else(p.value <= 0.05, false = 0, 1),
           effects = case_when(
               estimate < 0 ~ "over",
               estimate == 0 ~ "fair",
               estimate > 0 ~ "under"
           ))
  
}

plot_reg <- function(reg_tidy, ptitle) { 
    
    reg_tidy %>%  
        filter(term != "(Intercept)") %>% 
        ggplot(aes(estimate, term)) +
        geom_point(aes(color = factor(significant))) +
        geom_errorbarh(aes(xmin = conf.low, xmax = conf.high, color = factor(significant)), height = 0) +
        geom_vline(xintercept = 0, lty = 2) +
        theme_minimal() +
        theme(axis.text = element_text(size = 7),
              axis.title.x = element_text(size = 6),
              legend.position="none",
              plot.title = element_text(size=8)) +
        labs(title = ptitle,
             y = NULL,
             x = "Regression coefficient") +
        scale_color_manual(values=c("0" = "#434343", "1" = "#6BA2D6"))
}

Depvar: Under-research

  • Aim of regression: understand how countries economic resources (GDP and research investment) and geographic regions affects likelihood of being an under-researched country.
  • log(GDP) works better than factor version, as it is significant. Income groups are not significant.
  • Note migration variables have been removed, as they are part of the dependent variable.
  • pubyear transformed to factor.
r1_continent <- lm(as.numeric(repr_y_s_2) ~ as.factor(pubyear) + continent + log(population_n) + log(GDP) + log(research_GDP), aggregates_mod)
r1_region <- lm(as.numeric(repr_y_s_2) ~ as.factor(pubyear) + subregion_rf + log(population_n) + log(GDP) + log(research_GDP), aggregates_mod)

Depvar: Research salience

#Absolute stocks
r2_continent <- lm(log(as.numeric(art_country_y)) ~ as.factor(pubyear) + continent + log(population_n) + log(GDP) + log(immig_stock) + log(emig_stock) + log(research_GDP), aggregates_mod)
r2_region <- lm(log(as.numeric(art_country_y))  ~ as.factor(pubyear) + subregion_rf + log(population_n) + log(GDP) + log(immig_stock) + log(emig_stock) + log(research_GDP), aggregates_mod)

#Relative stocks
r2_continent_rel <- lm(log(as.numeric(art_country_y)) ~ as.factor(pubyear) + continent + log(population_n) + log(GDP) + log(immig_relative_stock) + log(emig_stock_rel_ctry) + log(research_GDP), aggregates_mod)
r2_region_rel <- lm(log(as.numeric(art_country_y))  ~ as.factor(pubyear) + subregion_rf + log(population_n) + log(GDP) + log(immig_relative_stock) + log(emig_stock_rel_ctry) + log(research_GDP), aggregates_mod)

Plots

# Under-research
r1_continent_tidy <- r1_continent %>% tidy_r1 
(r1_continent_plot <- r1_continent_tidy %>% plot_reg("1A - Underrepresentation:\n Continents"))
ggsave("../output_figures/cplot_continent.png", plot = last_plot())


r1_region_tidy <- r1_region %>% tidy_r1
(r1_region_plot <- r1_region_tidy %>% plot_reg("1B - Underrepresentation:\n Subregions"))
ggsave("../output_figures/cplot_subregion.png", plot = last_plot())


# Research salience
r2_continent_tidy <- r2_continent %>% tidy_r1 
(r2_continent_plot <- r2_continent_tidy %>% plot_reg("2A - Salience:\n Continents"))
ggsave("../output_figures/cplot_counts_continent.png", plot = last_plot())


r2_region_tidy <- r2_region %>% tidy_r1 
(r2_region_plot <- r2_region_tidy %>% plot_reg("2B - Salience:\n Subregions"))
ggsave("../output_figures/cplot_counts_subregion.png", plot = last_plot())


# Research salience. Relative.Note the results are exactly the same as with absolute numbers!
r2_continent_rel_tidy <- r2_continent_rel %>% tidy_r1 
(r2_continent_rel_plot <- r2_continent_rel_tidy %>% plot_reg("Model S.1:Continents"))
ggsave("../output_figures/cplot_counts_continent_rel.png", plot = last_plot())


r2_region_rel_tidy <- r2_region_rel %>% tidy_r1 
(r2_region_rel_plot <- r2_region_rel_tidy %>% plot_reg("Model S.2: Subregions"))
ggsave("../output_figures/cplot_counts_subregion_rel.png", plot = last_plot())

Combining plots


r1_continent_plot / r1_region_plot #/ r1_gsouth_plot  

ggsave("../output_figures/cplot_combined.png", width = 6, height = 7, dpi = 500, limitsize = F, plot = last_plot())


r2_continent_plot / r2_region_plot #/ r2_gsouth_plot 

ggsave("../output_figures/cplot_counts_combined.png", width = 6, height = 7, dpi = 500, limitsize = F, plot = last_plot())


(r1_continent_plot + r1_region_plot) / (r2_continent_plot + r2_region_plot) 
ggsave("../output_figures/cplot_all.png", width = 6, height = 7, dpi = 500, limitsize = F, plot = last_plot())

LS0tDQp0aXRsZTogIlIgTm90ZWJvb2siDQpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sNCi0tLQ0KDQpgYGB7cn0NCnJtKGxpc3QgPSBscygpKQ0KDQpTeXMuc2V0ZW52KExBTkcgPSAiZW4iKQ0KbGlicmFyeSh4bHN4KQ0KbGlicmFyeShyZWFkcikNCmxpYnJhcnkocmVhZHhsKQ0KbGlicmFyeSh0aWR5dmVyc2UpDQpsaWJyYXJ5KHN0cmluZ3IpDQpsaWJyYXJ5KHN0cmluZ2kpDQpsaWJyYXJ5KGdnaGlnaGxpZ2h0KQ0KbGlicmFyeShjb3VudHJ5Y29kZSkNCmxpYnJhcnkoY291bnRyaWVzKQ0KbGlicmFyeShqYW5pdG9yKQ0KbGlicmFyeShzZikNCg0KbGlicmFyeShqYW5pdG9yKQ0KbGlicmFyeShzZikNCmxpYnJhcnkoZ2d0aGVtZXMpDQpsaWJyYXJ5KGhlcmUpDQpsaWJyYXJ5KHZpcmlkaXMpDQpsaWJyYXJ5KGdncGxvdDIpDQpsaWJyYXJ5KGZvcm1hdFIpDQpsaWJyYXJ5KGd0b29scykNCmxpYnJhcnkobm5ldCkgDQpsaWJyYXJ5KHBhdGNod29yaykNCmxpYnJhcnkoZ2doNHgpDQoNCmxpYnJhcnkocGxtKQ0KbGlicmFyeShicm9vbSkNCmxpYnJhcnkoZ2dhbGx1dmlhbCkNCg0KbGlicmFyeShwYWxzKQ0KYGBgDQoNCiMgTG9hZCBkYXRhIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KDQojIyBMYXJnZSBkYXRhc2V0cyAobW92ZSBsb2FkIHRvIGRpZmZlcmVudCBub3RlYm9vaykNCg0KYGBge3J9DQphZ2dyZWdhdGVzIDwtIHJlYWRfY3N2KCIuLi9hZ2dyZWdhdGVkX2RhdGEvYWdncmVnYXRlcy5jc3YiKQ0KYWdncmVnYXRlc195ZWFyIDwtIHJlYWRfY3N2KCIuLi9hZ2dyZWdhdGVkX2RhdGEvYWdncmVnYXRlc195ZWFyLmNzdiIpDQpgYGANCiMjIENvbnZlcnQgdmFycyB0byBmYWN0b3IuIHJlYWRfY3N2IGNoYW5nZXMgb3JpZ2luYWwgdHlwZS4NCmBgYHtyfQ0KYWdncmVnYXRlc195ZWFyIDwtIGFnZ3JlZ2F0ZXNfeWVhciAlPiUgDQogIG11dGF0ZShzdWJyZWdpb25fcmYgPSBhc19mYWN0b3Ioc3VicmVnaW9uKSwNCiAgICAgICAgc3VicmVnaW9uX3JmID0gcmVsZXZlbChzdWJyZWdpb25fcmYsICJOb3J0aGVybiBBbWVyaWNhIiksDQogICAgICAgIGNvbnRpbmVudCA9IGFzX2ZhY3Rvcihjb250aW5lbnQpLA0KICAgICAgICBjb250aW5lbnQgPSByZWxldmVsKGNvbnRpbmVudCwgIkFtZXJpY2FzIikpDQpgYGANCg0KIyMgRmlndXJlIDYuIFJlZ3Jlc3Npb24NCg0KYGBge3J9DQpyZWdyX251bWVyaWMgPC0gYygicG9wdWxhdGlvbl9uIiwNCiAgICAgICAgICAgICAgICAgICJpbW1pZ19zdG9jayIsDQogICAgICAgICAgICAgICAgICAiaW1taWdfcmVsYXRpdmVfc3RvY2siLA0KICAgICAgICAgICAgICAgICAgImVtaWdfc3RvY2siLA0KICAgICAgICAgICAgICAgICAgImVtaWdfc3RvY2tfcmVsX2N0cnkiLA0KICAgICAgICAgICAgICAgICAgInJlc2VhcmNoX0dEUCIsDQogICAgICAgICAgICAgICAgICAicmVzZWFyY2giLA0KICAgICAgICAgICAgICAgICAgIkdEUCIpDQoNCmFnZ3JlZ2F0ZXNfbW9kIDwtIGFnZ3JlZ2F0ZXNfeWVhciAlPiUgDQogICAgZmlsdGVyKCFpcy5uYShJU08zKSkgJT4lIA0KICAgIGZpbHRlcihwdWJ5ZWFyICVpbiUgYygxOTk2LCAyMDAwLCAyMDA1LCAyMDEwLCAyMDE1LCAyMDIwKSwNCiAgICAgICAgICAgIWlzLm5hKEdEUCkgJiAhaXMubmEocmVzZWFyY2gpKSAlPiUgDQogICAgbXV0YXRlKHJlcHJfeV9zXzIgPSBhcy5mYWN0b3IoaWZfZWxzZShyZXByX3lfcyAlaW4lIGMoIkZhaXIiLCAiT3ZlciIpLCAwLCAxKSksDQogICAgICAgICAgIGFjcm9zcyhhbGxfb2YocmVncl9udW1lcmljKSwgfiAueCArIDAuMDAwMDAwMDAwMDAxKSkNCmBgYA0KDQojIyBMaW5lYXIgcHJvYmFiaWxpdHkgbW9kZWwuDQoNCiMjIyBGdW5jdGlvbnMNCmBgYHtyfQ0KdGlkeV9yMSA8LSBmdW5jdGlvbihyZWcpIHsNCiAgcmVnICU+JSB0aWR5KGNvbmYuaW50ID0gVFJVRSkgJT4lIA0KICAgIGZpbHRlcighc3RyX2RldGVjdCh0ZXJtLCAncHVieWVhcicpLCANCiAgICAgICAgICAgIXRlcm0gJWluJSBjKCIoSW50ZXJjZXB0KSIsICJsb2cocG9wdWxhdGlvbl9uKSIpKSAlPiUgDQogICAgbXV0YXRlKHRlcm0gPSBzdHJfcmVtb3ZlKHRlcm0sICJzdWJyZWdpb25fcmYiKSwNCiAgICAgICAgICAgdGVybSA9IHN0cl9yZW1vdmUodGVybSwgImNvbnRpbmVudCIpLA0KICAgICAgICAgICB0ZXJtID0gY2FzZV93aGVuKA0KICAgICAgICAgICAgICAgdGVybSA9PSAibG9nKEdEUCkiIH4gICJHRFBwYyIsDQogICAgICAgICAgICAgICB0ZXJtID09ICJsb2cocmVzZWFyY2hfR0RQKSIgfiAgIlJlc2VhcmNoIGFzICUgb2YgR0RQcGMiLA0KICAgICAgICAgICAgICAgdGVybSA9PSAiZ3NvdXRoR2xvYmFsIFNvdXRoIiB+ICJHbG9iYWwgU291dGgiLA0KICAgICAgICAgICAgICAgdGVybSA9PSAibG9nKGVtaWdfc3RvY2spIiB+ICJFbWlncmF0aW9uIHN0b2NrIiwNCiAgICAgICAgICAgICAgIHRlcm0gPT0gImxvZyhpbW1pZ19zdG9jaykiIH4gIkltbWlncmF0aW9uIHN0b2NrIiwNCiAgICAgICAgICAgICAgIFRSVUUgfiB0ZXJtKSwNCiAgICAgICAgICAgdGVybSA9IGZjdF9yZW9yZGVyKHRlcm0sIGVzdGltYXRlKSwNCiAgICAgICAgICAgc2lnbmlmaWNhbnQgPSBpZl9lbHNlKHAudmFsdWUgPD0gMC4wNSwgZmFsc2UgPSAwLCAxKSwNCiAgICAgICAgICAgZWZmZWN0cyA9IGNhc2Vfd2hlbigNCiAgICAgICAgICAgICAgIGVzdGltYXRlIDwgMCB+ICJvdmVyIiwNCiAgICAgICAgICAgICAgIGVzdGltYXRlID09IDAgfiAiZmFpciIsDQogICAgICAgICAgICAgICBlc3RpbWF0ZSA+IDAgfiAidW5kZXIiDQogICAgICAgICAgICkpDQogIA0KfQ0KDQpwbG90X3JlZyA8LSBmdW5jdGlvbihyZWdfdGlkeSwgcHRpdGxlKSB7IA0KICAgIA0KICAgIHJlZ190aWR5ICU+JSAgDQogICAgICAgIGZpbHRlcih0ZXJtICE9ICIoSW50ZXJjZXB0KSIpICU+JSANCiAgICAgICAgZ2dwbG90KGFlcyhlc3RpbWF0ZSwgdGVybSkpICsNCiAgICAgICAgZ2VvbV9wb2ludChhZXMoY29sb3IgPSBmYWN0b3Ioc2lnbmlmaWNhbnQpKSkgKw0KICAgICAgICBnZW9tX2Vycm9yYmFyaChhZXMoeG1pbiA9IGNvbmYubG93LCB4bWF4ID0gY29uZi5oaWdoLCBjb2xvciA9IGZhY3RvcihzaWduaWZpY2FudCkpLCBoZWlnaHQgPSAwKSArDQogICAgICAgIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IDAsIGx0eSA9IDIpICsNCiAgICAgICAgdGhlbWVfbWluaW1hbCgpICsNCiAgICAgICAgdGhlbWUoYXhpcy50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSA3KSwNCiAgICAgICAgICAgICAgYXhpcy50aXRsZS54ID0gZWxlbWVudF90ZXh0KHNpemUgPSA2KSwNCiAgICAgICAgICAgICAgbGVnZW5kLnBvc2l0aW9uPSJub25lIiwNCiAgICAgICAgICAgICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplPTgpKSArDQogICAgICAgIGxhYnModGl0bGUgPSBwdGl0bGUsDQogICAgICAgICAgICAgeSA9IE5VTEwsDQogICAgICAgICAgICAgeCA9ICJSZWdyZXNzaW9uIGNvZWZmaWNpZW50IikgKw0KICAgICAgICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzPWMoIjAiID0gIiM0MzQzNDMiLCAiMSIgPSAiIzZCQTJENiIpKQ0KfQ0KYGBgDQojIyMgRGVwdmFyOiBVbmRlci1yZXNlYXJjaA0KDQotIEFpbSBvZiByZWdyZXNzaW9uOiB1bmRlcnN0YW5kIGhvdyBjb3VudHJpZXMgZWNvbm9taWMgcmVzb3VyY2VzIChHRFAgYW5kIHJlc2VhcmNoIGludmVzdG1lbnQpIGFuZCBnZW9ncmFwaGljIHJlZ2lvbnMgYWZmZWN0cyBsaWtlbGlob29kIG9mIGJlaW5nIGFuIHVuZGVyLXJlc2VhcmNoZWQgY291bnRyeS4NCi0gbG9nKEdEUCkgd29ya3MgYmV0dGVyIHRoYW4gZmFjdG9yIHZlcnNpb24sIGFzIGl0IGlzIHNpZ25pZmljYW50LiBJbmNvbWUgZ3JvdXBzIGFyZSBub3Qgc2lnbmlmaWNhbnQuDQotIE5vdGUgbWlncmF0aW9uIHZhcmlhYmxlcyBoYXZlIGJlZW4gcmVtb3ZlZCwgYXMgdGhleSBhcmUgcGFydCBvZiB0aGUgZGVwZW5kZW50IHZhcmlhYmxlLg0KLSBwdWJ5ZWFyIHRyYW5zZm9ybWVkIHRvIGZhY3Rvci4NCmBgYHtyfQ0KcjFfY29udGluZW50IDwtIGxtKGFzLm51bWVyaWMocmVwcl95X3NfMikgfiBhcy5mYWN0b3IocHVieWVhcikgKyBjb250aW5lbnQgKyBsb2cocG9wdWxhdGlvbl9uKSArIGxvZyhHRFApICsgbG9nKHJlc2VhcmNoX0dEUCksIGFnZ3JlZ2F0ZXNfbW9kKQ0KcjFfcmVnaW9uIDwtIGxtKGFzLm51bWVyaWMocmVwcl95X3NfMikgfiBhcy5mYWN0b3IocHVieWVhcikgKyBzdWJyZWdpb25fcmYgKyBsb2cocG9wdWxhdGlvbl9uKSArIGxvZyhHRFApICsgbG9nKHJlc2VhcmNoX0dEUCksIGFnZ3JlZ2F0ZXNfbW9kKQ0KYGBgDQoNCiMjIyBEZXB2YXI6IFJlc2VhcmNoIHNhbGllbmNlDQpgYGB7cn0NCiNBYnNvbHV0ZSBzdG9ja3MNCnIyX2NvbnRpbmVudCA8LSBsbShsb2coYXMubnVtZXJpYyhhcnRfY291bnRyeV95KSkgfiBhcy5mYWN0b3IocHVieWVhcikgKyBjb250aW5lbnQgKyBsb2cocG9wdWxhdGlvbl9uKSArIGxvZyhHRFApICsgbG9nKGltbWlnX3N0b2NrKSArIGxvZyhlbWlnX3N0b2NrKSArIGxvZyhyZXNlYXJjaF9HRFApLCBhZ2dyZWdhdGVzX21vZCkNCnIyX3JlZ2lvbiA8LSBsbShsb2coYXMubnVtZXJpYyhhcnRfY291bnRyeV95KSkgIH4gYXMuZmFjdG9yKHB1YnllYXIpICsgc3VicmVnaW9uX3JmICsgbG9nKHBvcHVsYXRpb25fbikgKyBsb2coR0RQKSArIGxvZyhpbW1pZ19zdG9jaykgKyBsb2coZW1pZ19zdG9jaykgKyBsb2cocmVzZWFyY2hfR0RQKSwgYWdncmVnYXRlc19tb2QpDQoNCiNSZWxhdGl2ZSBzdG9ja3MNCnIyX2NvbnRpbmVudF9yZWwgPC0gbG0obG9nKGFzLm51bWVyaWMoYXJ0X2NvdW50cnlfeSkpIH4gYXMuZmFjdG9yKHB1YnllYXIpICsgY29udGluZW50ICsgbG9nKHBvcHVsYXRpb25fbikgKyBsb2coR0RQKSArIGxvZyhpbW1pZ19yZWxhdGl2ZV9zdG9jaykgKyBsb2coZW1pZ19zdG9ja19yZWxfY3RyeSkgKyBsb2cocmVzZWFyY2hfR0RQKSwgYWdncmVnYXRlc19tb2QpDQpyMl9yZWdpb25fcmVsIDwtIGxtKGxvZyhhcy5udW1lcmljKGFydF9jb3VudHJ5X3kpKSAgfiBhcy5mYWN0b3IocHVieWVhcikgKyBzdWJyZWdpb25fcmYgKyBsb2cocG9wdWxhdGlvbl9uKSArIGxvZyhHRFApICsgbG9nKGltbWlnX3JlbGF0aXZlX3N0b2NrKSArIGxvZyhlbWlnX3N0b2NrX3JlbF9jdHJ5KSArIGxvZyhyZXNlYXJjaF9HRFApLCBhZ2dyZWdhdGVzX21vZCkNCmBgYA0KDQojIyMgUGxvdHMNCmBgYHtyfQ0KIyBVbmRlci1yZXNlYXJjaA0KcjFfY29udGluZW50X3RpZHkgPC0gcjFfY29udGluZW50ICU+JSB0aWR5X3IxIA0KKHIxX2NvbnRpbmVudF9wbG90IDwtIHIxX2NvbnRpbmVudF90aWR5ICU+JSBwbG90X3JlZygiMUEgLSBVbmRlcnJlcHJlc2VudGF0aW9uOlxuIENvbnRpbmVudHMiKSkNCmdnc2F2ZSgiLi4vb3V0cHV0X2ZpZ3VyZXMvY3Bsb3RfY29udGluZW50LnBuZyIsIHBsb3QgPSBsYXN0X3Bsb3QoKSkNCg0KcjFfcmVnaW9uX3RpZHkgPC0gcjFfcmVnaW9uICU+JSB0aWR5X3IxDQoocjFfcmVnaW9uX3Bsb3QgPC0gcjFfcmVnaW9uX3RpZHkgJT4lIHBsb3RfcmVnKCIxQiAtIFVuZGVycmVwcmVzZW50YXRpb246XG4gU3VicmVnaW9ucyIpKQ0KZ2dzYXZlKCIuLi9vdXRwdXRfZmlndXJlcy9jcGxvdF9zdWJyZWdpb24ucG5nIiwgcGxvdCA9IGxhc3RfcGxvdCgpKQ0KDQojIFJlc2VhcmNoIHNhbGllbmNlDQpyMl9jb250aW5lbnRfdGlkeSA8LSByMl9jb250aW5lbnQgJT4lIHRpZHlfcjEgDQoocjJfY29udGluZW50X3Bsb3QgPC0gcjJfY29udGluZW50X3RpZHkgJT4lIHBsb3RfcmVnKCIyQSAtIFNhbGllbmNlOlxuIENvbnRpbmVudHMiKSkNCmdnc2F2ZSgiLi4vb3V0cHV0X2ZpZ3VyZXMvY3Bsb3RfY291bnRzX2NvbnRpbmVudC5wbmciLCBwbG90ID0gbGFzdF9wbG90KCkpDQoNCnIyX3JlZ2lvbl90aWR5IDwtIHIyX3JlZ2lvbiAlPiUgdGlkeV9yMSANCihyMl9yZWdpb25fcGxvdCA8LSByMl9yZWdpb25fdGlkeSAlPiUgcGxvdF9yZWcoIjJCIC0gU2FsaWVuY2U6XG4gU3VicmVnaW9ucyIpKQ0KZ2dzYXZlKCIuLi9vdXRwdXRfZmlndXJlcy9jcGxvdF9jb3VudHNfc3VicmVnaW9uLnBuZyIsIHBsb3QgPSBsYXN0X3Bsb3QoKSkNCg0KIyBSZXNlYXJjaCBzYWxpZW5jZS4gUmVsYXRpdmUuTm90ZSB0aGUgcmVzdWx0cyBhcmUgZXhhY3RseSB0aGUgc2FtZSBhcyB3aXRoIGFic29sdXRlIG51bWJlcnMhDQpyMl9jb250aW5lbnRfcmVsX3RpZHkgPC0gcjJfY29udGluZW50X3JlbCAlPiUgdGlkeV9yMSANCihyMl9jb250aW5lbnRfcmVsX3Bsb3QgPC0gcjJfY29udGluZW50X3JlbF90aWR5ICU+JSBwbG90X3JlZygiTW9kZWwgUy4xOkNvbnRpbmVudHMiKSkNCmdnc2F2ZSgiLi4vb3V0cHV0X2ZpZ3VyZXMvY3Bsb3RfY291bnRzX2NvbnRpbmVudF9yZWwucG5nIiwgcGxvdCA9IGxhc3RfcGxvdCgpKQ0KDQpyMl9yZWdpb25fcmVsX3RpZHkgPC0gcjJfcmVnaW9uX3JlbCAlPiUgdGlkeV9yMSANCihyMl9yZWdpb25fcmVsX3Bsb3QgPC0gcjJfcmVnaW9uX3JlbF90aWR5ICU+JSBwbG90X3JlZygiTW9kZWwgUy4yOiBTdWJyZWdpb25zIikpDQpnZ3NhdmUoIi4uL291dHB1dF9maWd1cmVzL2NwbG90X2NvdW50c19zdWJyZWdpb25fcmVsLnBuZyIsIHBsb3QgPSBsYXN0X3Bsb3QoKSkNCg0KYGBgDQojIyMgQ29tYmluaW5nIHBsb3RzDQpgYGB7cn0NCg0KcjFfY29udGluZW50X3Bsb3QgLyByMV9yZWdpb25fcGxvdCAjLyByMV9nc291dGhfcGxvdCAgDQoNCmdnc2F2ZSgiLi4vb3V0cHV0X2ZpZ3VyZXMvY3Bsb3RfY29tYmluZWQucG5nIiwgd2lkdGggPSA2LCBoZWlnaHQgPSA3LCBkcGkgPSA1MDAsIGxpbWl0c2l6ZSA9IEYsIHBsb3QgPSBsYXN0X3Bsb3QoKSkNCg0KcjJfY29udGluZW50X3Bsb3QgLyByMl9yZWdpb25fcGxvdCAjLyByMl9nc291dGhfcGxvdCANCg0KZ2dzYXZlKCIuLi9vdXRwdXRfZmlndXJlcy9jcGxvdF9jb3VudHNfY29tYmluZWQucG5nIiwgd2lkdGggPSA2LCBoZWlnaHQgPSA3LCBkcGkgPSA1MDAsIGxpbWl0c2l6ZSA9IEYsIHBsb3QgPSBsYXN0X3Bsb3QoKSkNCg0KKHIxX2NvbnRpbmVudF9wbG90ICsgcjFfcmVnaW9uX3Bsb3QpIC8gKHIyX2NvbnRpbmVudF9wbG90ICsgcjJfcmVnaW9uX3Bsb3QpIA0KZ2dzYXZlKCIuLi9vdXRwdXRfZmlndXJlcy9maWd1cmVfNl9jcGxvdF9hbGwucG5nIiwgd2lkdGggPSA2LCBoZWlnaHQgPSA3LCBkcGkgPSA1MDAsIGxpbWl0c2l6ZSA9IEYsIHBsb3QgPSBsYXN0X3Bsb3QoKSkNCmBgYA0KDQoNCg0KDQoNCg0KDQoNCg0K