library(tidyverse)
library(scales)
library(patchwork)
library(pander)
library(kableExtra)
library(countrycode)
library(sf)
library(here)

source(here("lib", "graphics.R"))
source(here("lib", "pandoc.R"))

my_seed <- 1234
set.seed(my_seed)
df_donor <- readRDS(here("data", "derived_data", "df_donor.rds"))
df_donor_us <- readRDS(here("data", "derived_data", "df_donor_usaid.rds"))

df_country_aid <- readRDS(here("data", "derived_data", "df_country_aid.rds"))
df_country_aid_laws <- filter(df_country_aid, laws)

df_autocracies <- readRDS(here("data", "derived_data", "df_autocracies.rds"))

Overall data summary

num_countries <- df_country_aid_laws %>% distinct(gwcode) %>% nrow()
num_years <- df_country_aid_laws %>% distinct(year) %>% nrow()
year_first <- df_country_aid_laws %>% distinct(year) %>% min()
year_last <- df_country_aid_laws %>% distinct(year) %>% max()

Our data includes information about 142 countries across 25 years (from 1990–2014)

Summary of variables in model

(From our AJPS submission): The values here are slightly different from what we had at ISA and MPSA (and our ISQ submission) because we’re now using V-Dem 8.0 and AidData 3.1.

And now the values are even different-er, since we’re using V-Dem 10.0 and have really clean data now.

vars_to_summarize <- read_csv(here("data", "manual_data", "coefs.csv")) %>% 
  mutate(summary_order = 1:n())

vars_summarized <- df_country_aid_laws %>%
  select(one_of(vars_to_summarize$term)) %>%
  mutate(total_oda = total_oda / 1000000) %>%
  mutate(gdpcap_log = exp(gdpcap_log)) %>% 
  pivot_longer(names_to = "term", values_to = "value", everything()) %>%
  filter(!is.na(value)) %>% 
  group_by(term) %>%
  summarize(N = n(),
            Mean = mean(value),
            Median = median(value),
            `Std. Dev.` = sd(value),
            Min = min(value),
            Max = max(value)) %>% 
  ungroup() %>% 
  left_join(vars_to_summarize, by = "term") %>%
  arrange(summary_order) %>%
  mutate(across(c(Mean, `Std. Dev.`, Median, Min, Max),
                ~case_when(
                  format == "percent" ~ percent_format(accuracy = 0.1)(.),
                  format == "dollar" ~ dollar_format(accuracy = 1)(.),
                  format == "number" ~ comma_format(accuracy = 0.1)(.)))) %>% 
  mutate(N = comma(N)) %>% 
  select(category, subcategory, Variable = term_clean_table, Source = source, 
         Mean, `Std. Dev.`, Median, Min, Max, N)

vars_summarized %>% 
  select(-category, ` ` = subcategory) %>% 
  kbl() %>% 
  kable_styling() %>% 
  pack_rows(index = table(fct_inorder(vars_summarized$category))) %>% 
  collapse_rows(columns = 1, valign = "top")
Variable Source Mean Std. Dev. Median Min Max N
Outcome
Total aid (constant 2011 USD, millions) OECD and AidData $1,261 $2,918 $445 $0 $63,233 3,435
Proportion of contentious aid OECD and AidData 6.8% 10.4% 2.9% 0.0% 100.0% 3,435
Proportion of aid to domestic NGOs USAID 4.2% 13.9% 0.2% 0.0% 100.0% 3,435
Proportion of aid to foreign NGOs USAID 13.1% 20.1% 0.9% 0.0% 100.0% 3,435
Treatment
Total legal barriers @christensen2013 and @Chaudhry:2016 1.6 1.9 1.0 0.0 9.5 3,435
Barriers to advocacy @christensen2013 and @Chaudhry:2016 0.3 0.5 0.0 0.0 2.0 3,435
Barriers to entry @christensen2013 and @Chaudhry:2016 0.8 0.9 1.0 0.0 3.0 3,435
Barriers to funding @christensen2013 and @Chaudhry:2016 0.4 0.9 0.0 0.0 4.5 3,435
Core civil society index @christensen2013 and @Chaudhry:2016 0.6 0.3 0.7 0.0 1.0 3,435
Confounders
Human rights and politics Electoral democracy index (polyarchy) V-Dem 0.4 0.2 0.4 0.0 0.9 3,435
Political corruption index V-Dem 0.6 0.3 0.7 0.0 1.0 3,435
Rule of law index V-Dem 0.5 0.3 0.4 0.0 1.0 3,435
Civil liberties index V-Dem 0.6 0.2 0.7 0.0 1.0 3,435
Physical violence index V-Dem 0.6 0.3 0.6 0.0 1.0 3,435
Private civil liberties index V-Dem 0.6 0.3 0.7 0.0 1.0 3,435
Economics and development GDP per capita (constant 2011 USD) UN $6,418 $10,464 $2,758 $92 $82,410 3,435
Trade as % of GDP UN 78.4% 46.1% 69.6% 1.9% 441.6% 3,435
Educational equality V-Dem 0.1 1.3 -0.1 -3.2 3.6 3,435
Health equality V-Dem 0.1 1.4 -0.1 -3.3 3.5 3,435
Infant mortality rate (deaths per 1,000 birhts) V-Dem and Gapminder 44.7 34.3 35.3 2.2 171.0 3,435
Unexpected shocks Internal conflict in last 5 years UCDP/PRIO 0.3 0.5 0.0 0.0 1.0 3,435
Natural disasters EM-DAT 2.1 3.5 1.0 0.0 43.0 3,435

Aid stuff

Overall OECD aid

total_oecd_aid <- df_country_aid_laws %>%
  summarise(total = dollar(sum(total_oda))) %>% 
  pull(total)

OECD members donated $4,333,135,732,679 between 1990 and 2013.

plot_aid <- df_country_aid_laws %>%
  filter(year <= 2013) %>% 
  group_by(year) %>%
  summarise(total = sum(total_oda)) %>% 
  mutate(fake_facet_title = "ODA commitments (all OECD)")

fig_oecd_aid <- ggplot(plot_aid, aes(x = year, y = (total / 1000000000))) + 
  geom_line(size = 0.5) +
  labs(x = NULL, y = "Billions of USD") +
  scale_y_continuous(labels = dollar) +
  coord_cartesian(xlim = c(1990, 2015)) +
  theme_donors() + 
  facet_wrap(vars(fake_facet_title))
fig_oecd_aid

Proportion of contentious vs. noncontentious aid

df_donor %>%
  filter(year >= 1990) %>%
  group_by(purpose_contentiousness) %>%
  summarise(Total = sum(oda)) %>%
  ungroup() %>% 
  mutate(Percent = Total / sum(Total)) %>%
  mutate(Total = dollar(Total), 
         Percent = percent_format(accuracy = 0.1)(Percent)) %>% 
  rename(`Contentiousness` = purpose_contentiousness) %>% 
  kbl() %>% 
  kable_styling()
Contentiousness Total Percent
High $267,373,936,986 6.2%
Low $4,071,293,867,271 93.8%
plot_aid_contentiousness <- df_donor %>%
  filter(year >= 1990) %>%
  group_by(year, purpose_contentiousness) %>%
  summarise(total = sum(oda)) %>%
  mutate(perc = total / sum(total)) %>%
  filter(purpose_contentiousness == "High") %>% 
  mutate(fake_facet_title = "Contentious aid (all OECD)")

fig_oecd_contention <- ggplot(plot_aid_contentiousness, aes(x = year, y = perc)) + 
  geom_line(size = 0.5) +
  scale_y_continuous(labels = percent_format(accuracy = 1)) + 
  labs(x = NULL, y = "Percent") +
  coord_cartesian(xlim = c(1990, 2015)) +
  theme_donors() +
  facet_wrap(vars(fake_facet_title))
fig_oecd_contention

USAID aid

total_us_aid <- df_country_aid_laws %>%
  summarise(total = dollar(sum(oda_us))) %>% 
  pull(total)

total_us_aid_post_2000 <- df_country_aid_laws %>%
  filter(year > 1999) %>%
  summarise(total = dollar(sum(oda_us))) %>% 
  pull(total)

The US donated $389,773,308,222 between 1990 and 2014 and $266,150,720,203 between 2000 and 2014.

plot_aid_us <- df_country_aid_laws %>%
  filter(year >= 1990) %>% 
  group_by(year) %>%
  summarise(total = sum(oda_us)) %>% 
  mutate(fake_facet_title = "ODA commitments (USAID only)")

fig_us_aid <- ggplot(plot_aid_us, aes(x = year, y = (total / 1000000000))) + 
  geom_line(size = 0.5) +
  expand_limits(y = 0) +
  labs(x = NULL, y = "Billions of USD") +
  scale_y_continuous(labels = dollar) +
  coord_cartesian(xlim = c(1990, 2015)) +
  theme_donors() +
  facet_wrap(vars(fake_facet_title))
fig_us_aid

Proportion of US aid to types of NGOs

Total amounts over time:

usaid_total <- df_country_aid_laws %>% 
  summarise(total = sum(oda_us)) %>% pull(total)

channels_nice <- tribble(
  ~channel,         ~channel_clean,
  "oda_us_ngo_dom", "Domestic NGOs",
  "oda_us_ngo_int", "International NGOs",
  "oda_us_ngo_us",  "US-based NGOs"
)

df_country_aid_laws %>%
  pivot_longer(names_to = "channel", values_to = "total_oda_us",
               c(oda_us_ngo_dom, oda_us_ngo_int, oda_us_ngo_us)) %>% 
  group_by(channel) %>%
  summarise(total = sum(total_oda_us)) %>%
  ungroup() %>% 
  left_join(channels_nice, by = "channel") %>% 
  mutate(perc = total / usaid_total) %>%
  mutate(total = dollar(total), perc = percent(perc)) %>% 
  select(Channel = channel_clean, Total = total, Percent = perc) %>% 
  kbl() %>% 
  kable_styling()
Channel Total Percent
Domestic NGOs $7,057,013,854 1.8%
International NGOs $14,412,538,155 3.7%
US-based NGOs $31,189,618,294 8.0%

The US clearly favors US-based NGOs or international NGOs over domestic NGOs.

usaid_total_yearly <- df_country_aid_laws %>%
  group_by(year) %>%
  summarise(annual_total = sum(oda_us)) %>% 
  mutate(fake_facet_title = "USAID ODA channeled through NGOs")

plot_usaid_channel <- df_country_aid_laws %>%
  filter(year >= 1990) %>% 
  pivot_longer(names_to = "channel", values_to = "total_oda_us", 
               c(oda_us_ngo_dom, oda_us_ngo_int, oda_us_ngo_us)) %>%
  group_by(year, channel) %>%
  summarise(total = sum(total_oda_us)) %>%
  left_join(usaid_total_yearly, by = "year") %>%
  mutate(perc = total / annual_total) %>%
  left_join(channels_nice, by = "channel")

fig_usaid_channel <- ggplot(plot_usaid_channel, 
                            aes(x = year, y = perc, colour = channel_clean)) + 
  geom_line(size = 0.5) +
  scale_y_continuous(labels = percent_format(accuracy = 1)) + 
  scale_colour_manual(values = channel_colors) +
  labs(x = NULL, y = "Percent") +
  guides(colour = guide_legend(title = NULL, reverse = TRUE, nrow = 2)) +
  coord_cartesian(xlim = c(1990, 2015)) +
  theme_donors() + 
  facet_wrap(vars(fake_facet_title))
fig_usaid_channel

USAID data categorizes all aid as government-channeled before 2000 because of some quirk in the data.

plot_usaid_channels_all <- df_donor_us %>%
  group_by(year, channel_subcategory_name) %>%
  summarise(total = sum(oda_us_2011)) %>%
  mutate(perc = total / sum(total)) %>%
  mutate(channel = ifelse(str_detect(channel_subcategory_name, "NGO"), "NGO", "Other"))

ggplot(plot_usaid_channels_all, 
       aes(x = year, y = perc, colour = channel_subcategory_name)) + 
  geom_line(size = 0.5) +
  scale_y_continuous(labels = percent_format(accuracy = 1)) + 
  labs(x = NULL, y = "Percent of US aid given through different channels") +
  guides(colour = guide_legend(title = NULL, ncol = 2)) +
  theme_donors()

So we just look at aid after 2000.

fig_usaid_channel_trimmed <- fig_usaid_channel +
  coord_cartesian(xlim = c(2000, 2015))
fig_usaid_channel_trimmed

All DV figures combined

fig_dvs <- (fig_oecd_aid + fig_oecd_contention) / 
  (fig_us_aid + fig_usaid_channel_trimmed) &
  theme_donors(base_size = 10) +
  theme(legend.text = element_text(size = rel(0.6)),
        axis.title.y = element_text(margin = margin(r = 3)),
        legend.box.margin = margin(t = -0.5, unit = "lines"))

fig_dvs

ggsave(here("analysis", "output", "fig-dvs.pdf"), fig_dvs,
       width = 6.5, height = 4.75, device = cairo_pdf)
ggsave(here("analysis", "output", "fig-dvs.png"), fig_dvs,
       width = 6.5, height = 4.75, dpi = 300, type = "cairo")

Aid

Aid over time, by donor type

aid_donor_type_time <- df_donor %>%
  group_by(year, donor_type_collapsed) %>%
  summarise(total_aid = sum(oda, na.rm = TRUE))

ggplot(aid_donor_type_time, aes(x = year, y = total_aid / 1000000000,
                                colour = donor_type_collapsed)) +
  geom_line(size = 0.5) +
  labs(x = NULL, y = "Billions of USD",
       caption = "Source: OECD and AidData. 2011 dollars.") +
  guides(colour = guide_legend(title = NULL)) +
  scale_y_continuous(labels = dollar) + 
  theme_donors()

Aid over time, by contentiousness

aid_contention_time <- df_donor %>%
  group_by(year, purpose_contentiousness) %>%
  summarise(total_aid = sum(oda, na.rm = TRUE))

ggplot(aid_contention_time, aes(x = year, y = total_aid / 1000000000,
                                colour = purpose_contentiousness)) +
  geom_line(size = 0.5) +
  labs(x = NULL, y = "Billions of USD",
       caption = "Source: OECD and AidData. 2011 dollars.") +
  guides(colour = guide_legend(title = NULL)) +
  scale_y_continuous(labels = dollar) + 
  theme_donors()

Restrictions and aid

inv_logit <- function(f, a) {
  a <- (1 - 2 * a)
  (a * (1 + exp(f)) + (exp(f) - 1)) / (2 * a * (1 + exp(f)))
}

dvs_clean_names <- tribble(
  ~barrier, ~barrier_clean,
  "barriers_total", "All barriers",
  "advocacy", "Barriers to advocacy",
  "entry", "Barriers to entry",
  "funding", "Barriers to funding"
)

ivs_clean_names <- tribble(
  ~variable, ~variable_clean, ~hypothesis,
  "total_oda_lead1", "Total ODA", "H1",
  "prop_contentious_lead1", "Contentious aid", "H2",
  "prop_ngo_dom_lead1", "Aid to domestic NGOs", "H3",
  "prop_ngo_foreign_lead1", "Aid to foreign NGOs", "H3"
)

Restrictions and ODA (H1)

df_plot_barriers_oda <- df_country_aid_laws %>% 
  select(year, gwcode, country, total_oda_lead1,
         one_of(dvs_clean_names$barrier)) %>% 
  pivot_longer(names_to = "barrier", values_to = "value", 
               one_of(dvs_clean_names$barrier)) %>% 
  left_join(dvs_clean_names, by = "barrier") %>% 
  mutate(barrier_clean = fct_inorder(barrier_clean, ordered = TRUE))

ggplot(df_plot_barriers_oda, 
       aes(x = value, y = total_oda_lead1, color = barrier_clean)) +
  geom_point(alpha = 0.5) +
  stat_smooth(method = "lm") +
  stat_smooth(data = filter(df_plot_barriers_oda, 
                            total_oda_lead1 > 10000000000), 
              method = "lm", linetype = "21") +
  scale_y_continuous(labels = dollar) +
  guides(color = FALSE) +
  labs(x = "Number of legal barriers", y = "Total ODA in next year",
       title = "Total ODA in next year",
       subtitle = "Dotted lines show trends when omitting observations\nwith less than $10,000,000,000 in ODA") +
  theme_donors(10) +
  theme(strip.text.x = element_text(margin = margin(t = 1, b = 1))) +
  facet_wrap(vars(barrier_clean), scales = "free_x", nrow = 2)

Restrictions and contentiousness (H2)

df_plot_barriers_contention <- df_country_aid_laws %>% 
  select(year, gwcode, country, prop_contentious_lead1,
         one_of(dvs_clean_names$barrier))  %>% 
  pivot_longer(names_to = "barrier", values_to = "value", 
               one_of(dvs_clean_names$barrier)) %>% 
  left_join(dvs_clean_names, by = "barrier") %>% 
  mutate(barrier_clean = fct_inorder(barrier_clean, ordered = TRUE))

ggplot(df_plot_barriers_contention, 
       aes(x = value, y = prop_contentious_lead1, color = barrier_clean)) +
  geom_point(alpha = 0.5) +
  stat_smooth(method = "lm") +
  stat_smooth(data = filter(df_plot_barriers_contention, 
                            prop_contentious_lead1 > 0.05), 
              method = "lm", linetype = "21") +
  scale_y_continuous(labels = percent) +
  guides(color = FALSE) +
  labs(x = "Number of legal barriers", 
       y = "Proportion of contentious aid in next year",
       title = "Proportion of contentious aid in next year",
       subtitle = "Dotted lines show trends when omitting observations\nwith less than 5% contentious aid") +
  theme_donors(10) +
  theme(strip.text.x = element_text(margin = margin(t = 1, b = 1))) +
  facet_wrap(vars(barrier_clean), scales = "free_x", nrow = 2)

Restrictions and NGOs (H3)

df_plot_barriers_ngos <- df_country_aid_laws %>% 
  select(year, gwcode, country, 
         prop_ngo_dom_lead1, prop_ngo_foreign_lead1,
         one_of(dvs_clean_names$barrier)) %>% 
  pivot_longer(names_to = "barrier", values_to = "value", 
               one_of(dvs_clean_names$barrier)) %>% 
  pivot_longer(names_to = "ngo_type", values_to = "prop_ngo", 
               c(prop_ngo_dom_lead1, prop_ngo_foreign_lead1)) %>% 
  left_join(dvs_clean_names, by = "barrier") %>% 
  left_join(ivs_clean_names, by = c("ngo_type" = "variable")) %>% 
  mutate(barrier_clean = fct_inorder(barrier_clean, ordered = TRUE))

ggplot(df_plot_barriers_ngos, 
       aes(x = value, y = prop_ngo, color = barrier_clean)) +
  geom_point(alpha = 0.5) +
  stat_smooth(method = "lm") +
  stat_smooth(data = filter(df_plot_barriers_ngos, 
                            prop_ngo > 0.05), 
              method = "lm", linetype = "21") +
  scale_y_continuous(labels = percent) +
  guides(color = FALSE) +
  labs(x = "Number of legal barriers", 
       y = "Proportion of aid to NGOs in next year",
       title = "Proportion of aid channeled to types of NGOs in next year",
       subtitle = "Dotted lines show trends when omitting observations\nwith less than 5% aid to NGOs") +
  coord_cartesian(ylim = c(0, 1)) +
  theme_donors(10) +
  theme(strip.text.x = element_text(margin = margin(t = 1, b = 1))) +
  facet_wrap(vars(variable_clean, barrier_clean), scales = "free_x", ncol = 4)

CCSI and all DVs (all hypotheses)

df_plot_ccsi_ngos <- df_country_aid_laws %>% 
  select(year, gwcode, country, 
         one_of(ivs_clean_names$variable), v2xcs_ccsi) %>% 
  pivot_longer(names_to = "variable", values_to = "value", 
               c(one_of(ivs_clean_names$variable))) %>% 
  left_join(ivs_clean_names, by = "variable") %>% 
  mutate(hypothesis_clean = paste0(hypothesis, ": ", variable_clean)) %>% 
  arrange(hypothesis_clean) %>% 
  mutate(hypothesis_clean = fct_inorder(hypothesis_clean, ordered = TRUE))
  
ggplot(df_plot_ccsi_ngos, 
       aes(x = v2xcs_ccsi, y = value, color = hypothesis)) +
  geom_point(alpha = 0.25) +
  scale_color_viridis_d(option = "plasma", end = 0.9) +
  guides(color = FALSE) +
  labs(x = "Civil society index", 
       y = "Variable value in next year",
       title = "Core civil society index") +
  theme_donors() +
  facet_wrap(vars(hypothesis_clean), scales = "free_y")

CIVICUS restrictions

civicus <- read_csv(here("data", "raw_data", "Civicus", "civicus_monitor_2017.csv"),
                    na = "Null") %>%
  mutate(Population = as.double(Population),  # Integers can't handle world population
         Rating = factor(Rating, levels = c("Open", "Narrowed", "Obstructed", 
                                            "Repressed", "Closed"), 
                         ordered = TRUE),
         iso3 = countrycode(Country, "country.name", "iso3c",
                            custom_match = c("Kosovo" = "XKK",
                                             "Micronesia" = "FSM")))

# Use the Robinson map projection
projection <- "ESRI:54030"

world_map <- read_sf(here("data", "raw_data", "ne_110m_admin_0_countries",
                          "ne_110m_admin_0_countries.shp")) %>% 
  filter(ISO_A3 != "ATA")
civicus %>% count(Rating) %>% pandoc.table()
Rating n
Open 26
Narrowed 64
Obstructed 50
Repressed 35
Closed 20
map_with_civicus <- world_map %>% 
  # Fix some Natural Earth ISO weirdness
  mutate(ISO_A3 = ifelse(ISO_A3 == "-99", as.character(ISO_A3_EH), as.character(ISO_A3))) %>% 
  mutate(ISO_A3 = case_when(
    .$ISO_A3 == "GRL" ~ "DNK",
    .$NAME == "Norway" ~ "NOR",
    .$NAME == "Kosovo" ~ "XKK",
    TRUE ~ ISO_A3
  )) %>% 
  left_join(select(civicus, iso3, Rating), by = c("ISO_A3" = "iso3"))

plot_civicus_map <- ggplot() +
  geom_sf(data = map_with_civicus, aes(fill = Rating), size = 0.15, color = "black") +
  coord_sf(crs = st_crs(projection)) +
  scale_fill_manual(values = c("grey90", "grey70", "grey45",
                               "grey20", "black"),
                    na.translate = FALSE, name = "Civic space") +
  theme_donors_map() + 
  theme(legend.key.size = unit(0.7, "lines"))

plot_civicus_map

ggsave(here("analysis", "output", "fig-civicus-map.pdf"), plot_civicus_map,
       width = 5.5, height = 3, device = cairo_pdf)
ggsave(here("analysis", "output", "fig-civicus-map.png"), plot_civicus_map,
       width = 5.5, height = 3, dpi = 300, type = "cairo")

List of countries included in models

matrix_from_vector <- function(x, ncol) {
  n_balanced <- ceiling(length(x) / ncol) * ncol
  matrix(c(x, rep(NA, n_balanced - length(x))), ncol = ncol)
}

all_countries <- df_country_aid_laws %>% 
  distinct(country) %>% 
  arrange(country) %>% 
  pull(country) 

caption <- paste0("All countries included in models (N = ", 
                  length(all_countries),
                  ") {#tbl:countries}")

ncol_countries <- 4

tbl_countries <- all_countries %>% 
  matrix_from_vector(ncol = ncol_countries) %>% 
  pandoc.table.return(justify = paste0(rep("l", ncol_countries), collapse = ""), 
                      caption = caption, missing = "")

cat(tbl_countries)
All countries included in models (N = 142) {#tbl:countries}
Afghanistan Ecuador Liberia Saudi Arabia
Albania Egypt Libya Senegal
Algeria El Salvador Lithuania Serbia
Angola Equatorial Guinea Madagascar Sierra Leone
Argentina Eritrea Malawi Singapore
Armenia Estonia Malaysia Slovakia
Azerbaijan Eswatini Mali Slovenia
Bahrain Ethiopia Mauritania Solomon Islands
Bangladesh Fiji Mauritius Somalia
Belarus Gabon Mexico South Africa
Benin Gambia Moldova South Korea
Bhutan Georgia Mongolia South Sudan
Bolivia Ghana Montenegro Sri Lanka
Bosnia & Herzegovina Guatemala Morocco Sudan
Botswana Guinea Mozambique Syria
Brazil Guinea-Bissau Myanmar (Burma) Tajikistan
Bulgaria Guyana Namibia Tanzania
Burkina Faso Haiti Nepal Thailand
Burundi Honduras Nicaragua Timor-Leste
Cambodia Hungary Niger Togo
Cameroon India Nigeria Trinidad & Tobago
Central African Republic Indonesia North Korea Tunisia
Chile Iran North Macedonia Turkey
China Iraq Oman Turkmenistan
Colombia Israel Pakistan Uganda
Comoros Jamaica Panama Ukraine
Congo - Brazzaville Jordan Papua New Guinea United Arab Emirates
Congo - Kinshasa Kazakhstan Paraguay Uruguay
Costa Rica Kenya Peru Uzbekistan
Côte d’Ivoire Kosovo Philippines Venezuela
Croatia Kuwait Poland Vietnam
Cuba Kyrgyzstan Portugal Yemen
Cyprus Laos Qatar Zambia
Czechia Latvia Romania Zimbabwe
Djibouti Lebanon Russia
Dominican Republic Lesotho Rwanda
cat(tbl_countries, file = here("analysis", "output", "tbl-countries.md"))
LS0tCnRpdGxlOiAiR2VuZXJhbCBhbmFseXNpcyIKYXV0aG9yOiAiU3VwYXJuYSBDaGF1ZGhyeSBhbmQgQW5kcmV3IEhlaXNzIgpkYXRlOiAiYHIgZm9ybWF0KFN5cy50aW1lKCksICclRicpYCIKb3V0cHV0OiAKICBodG1sX2RvY3VtZW50OgogICAgY29kZV9mb2xkaW5nOiBoaWRlCmVkaXRvcl9vcHRpb25zOiAKICBjaHVua19vdXRwdXRfdHlwZTogY29uc29sZQotLS0KCmBgYHtyIHNldHVwLCBpbmNsdWRlPUZBTFNFfQprbml0cjo6b3B0c19jaHVuayRzZXQoZmlnLnJldGluYSA9IDMsCiAgICAgICAgICAgICAgICAgICAgICB0aWR5Lm9wdHMgPSBsaXN0KHdpZHRoLmN1dG9mZiA9IDEyMCksICAjIEZvciBjb2RlCiAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zKHdpZHRoID0gOTApLCAgIyBGb3Igb3V0cHV0CiAgICAgICAgICAgICAgICAgICAgICBmaWcuYXNwID0gMC42MTgsIGZpZy53aWR0aCA9IDcsIAogICAgICAgICAgICAgICAgICAgICAgZmlnLmFsaWduID0gImNlbnRlciIsIG91dC53aWR0aCA9ICI4NSUiKQoKb3B0aW9ucyhkcGx5ci5zdW1tYXJpc2UuaW5mb3JtID0gRkFMU0UsCiAgICAgICAga25pdHIua2FibGUuTkEgPSAiIikKYGBgCgoKYGBge3IgbG9hZC1saWJyYXJpZXMsIHdhcm5pbmc9RkFMU0UsIG1lc3NhZ2U9RkFMU0V9CmxpYnJhcnkodGlkeXZlcnNlKQpsaWJyYXJ5KHNjYWxlcykKbGlicmFyeShwYXRjaHdvcmspCmxpYnJhcnkocGFuZGVyKQpsaWJyYXJ5KGthYmxlRXh0cmEpCmxpYnJhcnkoY291bnRyeWNvZGUpCmxpYnJhcnkoc2YpCmxpYnJhcnkoaGVyZSkKCnNvdXJjZShoZXJlKCJsaWIiLCAiZ3JhcGhpY3MuUiIpKQpzb3VyY2UoaGVyZSgibGliIiwgInBhbmRvYy5SIikpCgpteV9zZWVkIDwtIDEyMzQKc2V0LnNlZWQobXlfc2VlZCkKYGBgCgpgYGB7ciBsb2FkLWRhdGF9CmRmX2Rvbm9yIDwtIHJlYWRSRFMoaGVyZSgiZGF0YSIsICJkZXJpdmVkX2RhdGEiLCAiZGZfZG9ub3IucmRzIikpCmRmX2Rvbm9yX3VzIDwtIHJlYWRSRFMoaGVyZSgiZGF0YSIsICJkZXJpdmVkX2RhdGEiLCAiZGZfZG9ub3JfdXNhaWQucmRzIikpCgpkZl9jb3VudHJ5X2FpZCA8LSByZWFkUkRTKGhlcmUoImRhdGEiLCAiZGVyaXZlZF9kYXRhIiwgImRmX2NvdW50cnlfYWlkLnJkcyIpKQpkZl9jb3VudHJ5X2FpZF9sYXdzIDwtIGZpbHRlcihkZl9jb3VudHJ5X2FpZCwgbGF3cykKCmRmX2F1dG9jcmFjaWVzIDwtIHJlYWRSRFMoaGVyZSgiZGF0YSIsICJkZXJpdmVkX2RhdGEiLCAiZGZfYXV0b2NyYWNpZXMucmRzIikpCmBgYAoKCiMgT3ZlcmFsbCBkYXRhIHN1bW1hcnkKCmBgYHtyIGRhdGEtc3VtbWFyeX0KbnVtX2NvdW50cmllcyA8LSBkZl9jb3VudHJ5X2FpZF9sYXdzICU+JSBkaXN0aW5jdChnd2NvZGUpICU+JSBucm93KCkKbnVtX3llYXJzIDwtIGRmX2NvdW50cnlfYWlkX2xhd3MgJT4lIGRpc3RpbmN0KHllYXIpICU+JSBucm93KCkKeWVhcl9maXJzdCA8LSBkZl9jb3VudHJ5X2FpZF9sYXdzICU+JSBkaXN0aW5jdCh5ZWFyKSAlPiUgbWluKCkKeWVhcl9sYXN0IDwtIGRmX2NvdW50cnlfYWlkX2xhd3MgJT4lIGRpc3RpbmN0KHllYXIpICU+JSBtYXgoKQpgYGAKCk91ciBkYXRhIGluY2x1ZGVzIGluZm9ybWF0aW9uIGFib3V0IGByIG51bV9jb3VudHJpZXNgIGNvdW50cmllcyBhY3Jvc3MgYHIgbnVtX3llYXJzYCB5ZWFycyAoZnJvbSBgciB5ZWFyX2ZpcnN0YOKAk2ByIHllYXJfbGFzdGApCgoKIyBTdW1tYXJ5IG9mIHZhcmlhYmxlcyBpbiBtb2RlbAoKKCpGcm9tIG91ciBBSlBTIHN1Ym1pc3Npb24qKTogVGhlIHZhbHVlcyBoZXJlIGFyZSBzbGlnaHRseSBkaWZmZXJlbnQgZnJvbSB3aGF0IHdlIGhhZCBhdCBJU0EgYW5kIE1QU0EgKGFuZCBvdXIgSVNRIHN1Ym1pc3Npb24pIGJlY2F1c2Ugd2UncmUgbm93IHVzaW5nIFYtRGVtIDguMCBhbmQgQWlkRGF0YSAzLjEuIAoKQW5kIG5vdyB0aGUgdmFsdWVzIGFyZSBldmVuIGRpZmZlcmVudC1lciwgc2luY2Ugd2UncmUgdXNpbmcgVi1EZW0gMTAuMCBhbmQgaGF2ZSByZWFsbHkgY2xlYW4gZGF0YSBub3cuCgpgYGB7ciBzdW1tYXJ5LXZhcnMtbW9kZWwsIHJlc3VsdHM9ImFzaXMiLCBtZXNzYWdlPUZBTFNFfQp2YXJzX3RvX3N1bW1hcml6ZSA8LSByZWFkX2NzdihoZXJlKCJkYXRhIiwgIm1hbnVhbF9kYXRhIiwgImNvZWZzLmNzdiIpKSAlPiUgCiAgbXV0YXRlKHN1bW1hcnlfb3JkZXIgPSAxOm4oKSkKCnZhcnNfc3VtbWFyaXplZCA8LSBkZl9jb3VudHJ5X2FpZF9sYXdzICU+JQogIHNlbGVjdChvbmVfb2YodmFyc190b19zdW1tYXJpemUkdGVybSkpICU+JQogIG11dGF0ZSh0b3RhbF9vZGEgPSB0b3RhbF9vZGEgLyAxMDAwMDAwKSAlPiUKICBtdXRhdGUoZ2RwY2FwX2xvZyA9IGV4cChnZHBjYXBfbG9nKSkgJT4lIAogIHBpdm90X2xvbmdlcihuYW1lc190byA9ICJ0ZXJtIiwgdmFsdWVzX3RvID0gInZhbHVlIiwgZXZlcnl0aGluZygpKSAlPiUKICBmaWx0ZXIoIWlzLm5hKHZhbHVlKSkgJT4lIAogIGdyb3VwX2J5KHRlcm0pICU+JQogIHN1bW1hcml6ZShOID0gbigpLAogICAgICAgICAgICBNZWFuID0gbWVhbih2YWx1ZSksCiAgICAgICAgICAgIE1lZGlhbiA9IG1lZGlhbih2YWx1ZSksCiAgICAgICAgICAgIGBTdGQuIERldi5gID0gc2QodmFsdWUpLAogICAgICAgICAgICBNaW4gPSBtaW4odmFsdWUpLAogICAgICAgICAgICBNYXggPSBtYXgodmFsdWUpKSAlPiUgCiAgdW5ncm91cCgpICU+JSAKICBsZWZ0X2pvaW4odmFyc190b19zdW1tYXJpemUsIGJ5ID0gInRlcm0iKSAlPiUKICBhcnJhbmdlKHN1bW1hcnlfb3JkZXIpICU+JQogIG11dGF0ZShhY3Jvc3MoYyhNZWFuLCBgU3RkLiBEZXYuYCwgTWVkaWFuLCBNaW4sIE1heCksCiAgICAgICAgICAgICAgICB+Y2FzZV93aGVuKAogICAgICAgICAgICAgICAgICBmb3JtYXQgPT0gInBlcmNlbnQiIH4gcGVyY2VudF9mb3JtYXQoYWNjdXJhY3kgPSAwLjEpKC4pLAogICAgICAgICAgICAgICAgICBmb3JtYXQgPT0gImRvbGxhciIgfiBkb2xsYXJfZm9ybWF0KGFjY3VyYWN5ID0gMSkoLiksCiAgICAgICAgICAgICAgICAgIGZvcm1hdCA9PSAibnVtYmVyIiB+IGNvbW1hX2Zvcm1hdChhY2N1cmFjeSA9IDAuMSkoLikpKSkgJT4lIAogIG11dGF0ZShOID0gY29tbWEoTikpICU+JSAKICBzZWxlY3QoY2F0ZWdvcnksIHN1YmNhdGVnb3J5LCBWYXJpYWJsZSA9IHRlcm1fY2xlYW5fdGFibGUsIFNvdXJjZSA9IHNvdXJjZSwgCiAgICAgICAgIE1lYW4sIGBTdGQuIERldi5gLCBNZWRpYW4sIE1pbiwgTWF4LCBOKQoKdmFyc19zdW1tYXJpemVkICU+JSAKICBzZWxlY3QoLWNhdGVnb3J5LCBgIGAgPSBzdWJjYXRlZ29yeSkgJT4lIAogIGtibCgpICU+JSAKICBrYWJsZV9zdHlsaW5nKCkgJT4lIAogIHBhY2tfcm93cyhpbmRleCA9IHRhYmxlKGZjdF9pbm9yZGVyKHZhcnNfc3VtbWFyaXplZCRjYXRlZ29yeSkpKSAlPiUgCiAgY29sbGFwc2Vfcm93cyhjb2x1bW5zID0gMSwgdmFsaWduID0gInRvcCIpCmBgYAoKCiMgQWlkIHN0dWZmCgojIyBPdmVyYWxsIE9FQ0QgYWlkCgpgYGB7ciBzdW1tYXJpemUtb2VjZC1haWR9CnRvdGFsX29lY2RfYWlkIDwtIGRmX2NvdW50cnlfYWlkX2xhd3MgJT4lCiAgc3VtbWFyaXNlKHRvdGFsID0gZG9sbGFyKHN1bSh0b3RhbF9vZGEpKSkgJT4lIAogIHB1bGwodG90YWwpCmBgYAoKT0VDRCBtZW1iZXJzIGRvbmF0ZWQgYHIgdG90YWxfb2VjZF9haWRgIGJldHdlZW4gMTk5MCBhbmQgMjAxMy4KCmBgYHtyIHBsb3Qtb2VjZC1haWR9CnBsb3RfYWlkIDwtIGRmX2NvdW50cnlfYWlkX2xhd3MgJT4lCiAgZmlsdGVyKHllYXIgPD0gMjAxMykgJT4lIAogIGdyb3VwX2J5KHllYXIpICU+JQogIHN1bW1hcmlzZSh0b3RhbCA9IHN1bSh0b3RhbF9vZGEpKSAlPiUgCiAgbXV0YXRlKGZha2VfZmFjZXRfdGl0bGUgPSAiT0RBIGNvbW1pdG1lbnRzIChhbGwgT0VDRCkiKQoKZmlnX29lY2RfYWlkIDwtIGdncGxvdChwbG90X2FpZCwgYWVzKHggPSB5ZWFyLCB5ID0gKHRvdGFsIC8gMTAwMDAwMDAwMCkpKSArIAogIGdlb21fbGluZShzaXplID0gMC41KSArCiAgbGFicyh4ID0gTlVMTCwgeSA9ICJCaWxsaW9ucyBvZiBVU0QiKSArCiAgc2NhbGVfeV9jb250aW51b3VzKGxhYmVscyA9IGRvbGxhcikgKwogIGNvb3JkX2NhcnRlc2lhbih4bGltID0gYygxOTkwLCAyMDE1KSkgKwogIHRoZW1lX2Rvbm9ycygpICsgCiAgZmFjZXRfd3JhcCh2YXJzKGZha2VfZmFjZXRfdGl0bGUpKQpmaWdfb2VjZF9haWQKYGBgCgojIyBQcm9wb3J0aW9uIG9mIGNvbnRlbnRpb3VzIHZzLiBub25jb250ZW50aW91cyBhaWQKCmBgYHtyIHN1bW1hcml6ZS1jb250ZW50aW91cy1haWQsIHJlc3VsdHM9ImFzaXMifQpkZl9kb25vciAlPiUKICBmaWx0ZXIoeWVhciA+PSAxOTkwKSAlPiUKICBncm91cF9ieShwdXJwb3NlX2NvbnRlbnRpb3VzbmVzcykgJT4lCiAgc3VtbWFyaXNlKFRvdGFsID0gc3VtKG9kYSkpICU+JQogIHVuZ3JvdXAoKSAlPiUgCiAgbXV0YXRlKFBlcmNlbnQgPSBUb3RhbCAvIHN1bShUb3RhbCkpICU+JQogIG11dGF0ZShUb3RhbCA9IGRvbGxhcihUb3RhbCksIAogICAgICAgICBQZXJjZW50ID0gcGVyY2VudF9mb3JtYXQoYWNjdXJhY3kgPSAwLjEpKFBlcmNlbnQpKSAlPiUgCiAgcmVuYW1lKGBDb250ZW50aW91c25lc3NgID0gcHVycG9zZV9jb250ZW50aW91c25lc3MpICU+JSAKICBrYmwoKSAlPiUgCiAga2FibGVfc3R5bGluZygpCmBgYAoKYGBge3IgcGxvdC1jb250ZW50aW91cy1haWR9CnBsb3RfYWlkX2NvbnRlbnRpb3VzbmVzcyA8LSBkZl9kb25vciAlPiUKICBmaWx0ZXIoeWVhciA+PSAxOTkwKSAlPiUKICBncm91cF9ieSh5ZWFyLCBwdXJwb3NlX2NvbnRlbnRpb3VzbmVzcykgJT4lCiAgc3VtbWFyaXNlKHRvdGFsID0gc3VtKG9kYSkpICU+JQogIG11dGF0ZShwZXJjID0gdG90YWwgLyBzdW0odG90YWwpKSAlPiUKICBmaWx0ZXIocHVycG9zZV9jb250ZW50aW91c25lc3MgPT0gIkhpZ2giKSAlPiUgCiAgbXV0YXRlKGZha2VfZmFjZXRfdGl0bGUgPSAiQ29udGVudGlvdXMgYWlkIChhbGwgT0VDRCkiKQoKZmlnX29lY2RfY29udGVudGlvbiA8LSBnZ3Bsb3QocGxvdF9haWRfY29udGVudGlvdXNuZXNzLCBhZXMoeCA9IHllYXIsIHkgPSBwZXJjKSkgKyAKICBnZW9tX2xpbmUoc2l6ZSA9IDAuNSkgKwogIHNjYWxlX3lfY29udGludW91cyhsYWJlbHMgPSBwZXJjZW50X2Zvcm1hdChhY2N1cmFjeSA9IDEpKSArIAogIGxhYnMoeCA9IE5VTEwsIHkgPSAiUGVyY2VudCIpICsKICBjb29yZF9jYXJ0ZXNpYW4oeGxpbSA9IGMoMTk5MCwgMjAxNSkpICsKICB0aGVtZV9kb25vcnMoKSArCiAgZmFjZXRfd3JhcCh2YXJzKGZha2VfZmFjZXRfdGl0bGUpKQpmaWdfb2VjZF9jb250ZW50aW9uCmBgYAoKIyMgVVNBSUQgYWlkCgpgYGB7ciBzdW1tYXJpemUtdXMtYWlkfQp0b3RhbF91c19haWQgPC0gZGZfY291bnRyeV9haWRfbGF3cyAlPiUKICBzdW1tYXJpc2UodG90YWwgPSBkb2xsYXIoc3VtKG9kYV91cykpKSAlPiUgCiAgcHVsbCh0b3RhbCkKCnRvdGFsX3VzX2FpZF9wb3N0XzIwMDAgPC0gZGZfY291bnRyeV9haWRfbGF3cyAlPiUKICBmaWx0ZXIoeWVhciA+IDE5OTkpICU+JQogIHN1bW1hcmlzZSh0b3RhbCA9IGRvbGxhcihzdW0ob2RhX3VzKSkpICU+JSAKICBwdWxsKHRvdGFsKQpgYGAKClRoZSBVUyBkb25hdGVkIGByIHRvdGFsX3VzX2FpZGAgYmV0d2VlbiAxOTkwIGFuZCAyMDE0IGFuZCBgciB0b3RhbF91c19haWRfcG9zdF8yMDAwYCBiZXR3ZWVuIDIwMDAgYW5kIDIwMTQuCgpgYGB7ciBwbG90LXVzLWFpZH0KcGxvdF9haWRfdXMgPC0gZGZfY291bnRyeV9haWRfbGF3cyAlPiUKICBmaWx0ZXIoeWVhciA+PSAxOTkwKSAlPiUgCiAgZ3JvdXBfYnkoeWVhcikgJT4lCiAgc3VtbWFyaXNlKHRvdGFsID0gc3VtKG9kYV91cykpICU+JSAKICBtdXRhdGUoZmFrZV9mYWNldF90aXRsZSA9ICJPREEgY29tbWl0bWVudHMgKFVTQUlEIG9ubHkpIikKCmZpZ191c19haWQgPC0gZ2dwbG90KHBsb3RfYWlkX3VzLCBhZXMoeCA9IHllYXIsIHkgPSAodG90YWwgLyAxMDAwMDAwMDAwKSkpICsgCiAgZ2VvbV9saW5lKHNpemUgPSAwLjUpICsKICBleHBhbmRfbGltaXRzKHkgPSAwKSArCiAgbGFicyh4ID0gTlVMTCwgeSA9ICJCaWxsaW9ucyBvZiBVU0QiKSArCiAgc2NhbGVfeV9jb250aW51b3VzKGxhYmVscyA9IGRvbGxhcikgKwogIGNvb3JkX2NhcnRlc2lhbih4bGltID0gYygxOTkwLCAyMDE1KSkgKwogIHRoZW1lX2Rvbm9ycygpICsKICBmYWNldF93cmFwKHZhcnMoZmFrZV9mYWNldF90aXRsZSkpCmZpZ191c19haWQKYGBgCgojIyBQcm9wb3J0aW9uIG9mIFVTIGFpZCB0byB0eXBlcyBvZiBOR09zCgpUb3RhbCBhbW91bnRzIG92ZXIgdGltZToKCmBgYHtyIHN1bW1hcml6ZS1haWQtY2hhbm5lbHMsIHJlc3VsdHM9ImFzaXMifQp1c2FpZF90b3RhbCA8LSBkZl9jb3VudHJ5X2FpZF9sYXdzICU+JSAKICBzdW1tYXJpc2UodG90YWwgPSBzdW0ob2RhX3VzKSkgJT4lIHB1bGwodG90YWwpCgpjaGFubmVsc19uaWNlIDwtIHRyaWJibGUoCiAgfmNoYW5uZWwsICAgICAgICAgfmNoYW5uZWxfY2xlYW4sCiAgIm9kYV91c19uZ29fZG9tIiwgIkRvbWVzdGljIE5HT3MiLAogICJvZGFfdXNfbmdvX2ludCIsICJJbnRlcm5hdGlvbmFsIE5HT3MiLAogICJvZGFfdXNfbmdvX3VzIiwgICJVUy1iYXNlZCBOR09zIgopCgpkZl9jb3VudHJ5X2FpZF9sYXdzICU+JQogIHBpdm90X2xvbmdlcihuYW1lc190byA9ICJjaGFubmVsIiwgdmFsdWVzX3RvID0gInRvdGFsX29kYV91cyIsCiAgICAgICAgICAgICAgIGMob2RhX3VzX25nb19kb20sIG9kYV91c19uZ29faW50LCBvZGFfdXNfbmdvX3VzKSkgJT4lIAogIGdyb3VwX2J5KGNoYW5uZWwpICU+JQogIHN1bW1hcmlzZSh0b3RhbCA9IHN1bSh0b3RhbF9vZGFfdXMpKSAlPiUKICB1bmdyb3VwKCkgJT4lIAogIGxlZnRfam9pbihjaGFubmVsc19uaWNlLCBieSA9ICJjaGFubmVsIikgJT4lIAogIG11dGF0ZShwZXJjID0gdG90YWwgLyB1c2FpZF90b3RhbCkgJT4lCiAgbXV0YXRlKHRvdGFsID0gZG9sbGFyKHRvdGFsKSwgcGVyYyA9IHBlcmNlbnQocGVyYykpICU+JSAKICBzZWxlY3QoQ2hhbm5lbCA9IGNoYW5uZWxfY2xlYW4sIFRvdGFsID0gdG90YWwsIFBlcmNlbnQgPSBwZXJjKSAlPiUgCiAga2JsKCkgJT4lIAogIGthYmxlX3N0eWxpbmcoKQpgYGAKClRoZSBVUyBjbGVhcmx5IGZhdm9ycyBVUy1iYXNlZCBOR09zIG9yIGludGVybmF0aW9uYWwgTkdPcyBvdmVyIGRvbWVzdGljIE5HT3MuCgpgYGB7ciBwbG90LWFpZC1jaGFubmVsc30KdXNhaWRfdG90YWxfeWVhcmx5IDwtIGRmX2NvdW50cnlfYWlkX2xhd3MgJT4lCiAgZ3JvdXBfYnkoeWVhcikgJT4lCiAgc3VtbWFyaXNlKGFubnVhbF90b3RhbCA9IHN1bShvZGFfdXMpKSAlPiUgCiAgbXV0YXRlKGZha2VfZmFjZXRfdGl0bGUgPSAiVVNBSUQgT0RBIGNoYW5uZWxlZCB0aHJvdWdoIE5HT3MiKQoKcGxvdF91c2FpZF9jaGFubmVsIDwtIGRmX2NvdW50cnlfYWlkX2xhd3MgJT4lCiAgZmlsdGVyKHllYXIgPj0gMTk5MCkgJT4lIAogIHBpdm90X2xvbmdlcihuYW1lc190byA9ICJjaGFubmVsIiwgdmFsdWVzX3RvID0gInRvdGFsX29kYV91cyIsIAogICAgICAgICAgICAgICBjKG9kYV91c19uZ29fZG9tLCBvZGFfdXNfbmdvX2ludCwgb2RhX3VzX25nb191cykpICU+JQogIGdyb3VwX2J5KHllYXIsIGNoYW5uZWwpICU+JQogIHN1bW1hcmlzZSh0b3RhbCA9IHN1bSh0b3RhbF9vZGFfdXMpKSAlPiUKICBsZWZ0X2pvaW4odXNhaWRfdG90YWxfeWVhcmx5LCBieSA9ICJ5ZWFyIikgJT4lCiAgbXV0YXRlKHBlcmMgPSB0b3RhbCAvIGFubnVhbF90b3RhbCkgJT4lCiAgbGVmdF9qb2luKGNoYW5uZWxzX25pY2UsIGJ5ID0gImNoYW5uZWwiKQoKZmlnX3VzYWlkX2NoYW5uZWwgPC0gZ2dwbG90KHBsb3RfdXNhaWRfY2hhbm5lbCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZXMoeCA9IHllYXIsIHkgPSBwZXJjLCBjb2xvdXIgPSBjaGFubmVsX2NsZWFuKSkgKyAKICBnZW9tX2xpbmUoc2l6ZSA9IDAuNSkgKwogIHNjYWxlX3lfY29udGludW91cyhsYWJlbHMgPSBwZXJjZW50X2Zvcm1hdChhY2N1cmFjeSA9IDEpKSArIAogIHNjYWxlX2NvbG91cl9tYW51YWwodmFsdWVzID0gY2hhbm5lbF9jb2xvcnMpICsKICBsYWJzKHggPSBOVUxMLCB5ID0gIlBlcmNlbnQiKSArCiAgZ3VpZGVzKGNvbG91ciA9IGd1aWRlX2xlZ2VuZCh0aXRsZSA9IE5VTEwsIHJldmVyc2UgPSBUUlVFLCBucm93ID0gMikpICsKICBjb29yZF9jYXJ0ZXNpYW4oeGxpbSA9IGMoMTk5MCwgMjAxNSkpICsKICB0aGVtZV9kb25vcnMoKSArIAogIGZhY2V0X3dyYXAodmFycyhmYWtlX2ZhY2V0X3RpdGxlKSkKZmlnX3VzYWlkX2NoYW5uZWwKYGBgCgpVU0FJRCBkYXRhIGNhdGVnb3JpemVzIGFsbCBhaWQgYXMgZ292ZXJubWVudC1jaGFubmVsZWQgYmVmb3JlIDIwMDAgYmVjYXVzZSBvZiBzb21lIHF1aXJrIGluIHRoZSBkYXRhLgoKYGBge3IgcGxvdC1hbGwtY2hhbm5lbHN9CnBsb3RfdXNhaWRfY2hhbm5lbHNfYWxsIDwtIGRmX2Rvbm9yX3VzICU+JQogIGdyb3VwX2J5KHllYXIsIGNoYW5uZWxfc3ViY2F0ZWdvcnlfbmFtZSkgJT4lCiAgc3VtbWFyaXNlKHRvdGFsID0gc3VtKG9kYV91c18yMDExKSkgJT4lCiAgbXV0YXRlKHBlcmMgPSB0b3RhbCAvIHN1bSh0b3RhbCkpICU+JQogIG11dGF0ZShjaGFubmVsID0gaWZlbHNlKHN0cl9kZXRlY3QoY2hhbm5lbF9zdWJjYXRlZ29yeV9uYW1lLCAiTkdPIiksICJOR08iLCAiT3RoZXIiKSkKCmdncGxvdChwbG90X3VzYWlkX2NoYW5uZWxzX2FsbCwgCiAgICAgICBhZXMoeCA9IHllYXIsIHkgPSBwZXJjLCBjb2xvdXIgPSBjaGFubmVsX3N1YmNhdGVnb3J5X25hbWUpKSArIAogIGdlb21fbGluZShzaXplID0gMC41KSArCiAgc2NhbGVfeV9jb250aW51b3VzKGxhYmVscyA9IHBlcmNlbnRfZm9ybWF0KGFjY3VyYWN5ID0gMSkpICsgCiAgbGFicyh4ID0gTlVMTCwgeSA9ICJQZXJjZW50IG9mIFVTIGFpZCBnaXZlbiB0aHJvdWdoIGRpZmZlcmVudCBjaGFubmVscyIpICsKICBndWlkZXMoY29sb3VyID0gZ3VpZGVfbGVnZW5kKHRpdGxlID0gTlVMTCwgbmNvbCA9IDIpKSArCiAgdGhlbWVfZG9ub3JzKCkKYGBgCgpTbyB3ZSBqdXN0IGxvb2sgYXQgYWlkIGFmdGVyIDIwMDAuCgpgYGB7ciBwbG90LWNoYW5uZWxzLXBvc3QtMjAwMCwgd2FybmluZz1GQUxTRSwgbWVzc2FnZT1GQUxTRX0KZmlnX3VzYWlkX2NoYW5uZWxfdHJpbW1lZCA8LSBmaWdfdXNhaWRfY2hhbm5lbCArCiAgY29vcmRfY2FydGVzaWFuKHhsaW0gPSBjKDIwMDAsIDIwMTUpKQpmaWdfdXNhaWRfY2hhbm5lbF90cmltbWVkCmBgYAoKIyMgQWxsIERWIGZpZ3VyZXMgY29tYmluZWQKCmBgYHtyIHBsb3QtYWxsLWR2cywgZmlnLndpZHRoPTYuNSwgZmlnLmhlaWdodD00Ljc1LCBmaWcuYXNwPU5VTEx9CmZpZ19kdnMgPC0gKGZpZ19vZWNkX2FpZCArIGZpZ19vZWNkX2NvbnRlbnRpb24pIC8gCiAgKGZpZ191c19haWQgKyBmaWdfdXNhaWRfY2hhbm5lbF90cmltbWVkKSAmCiAgdGhlbWVfZG9ub3JzKGJhc2Vfc2l6ZSA9IDEwKSArCiAgdGhlbWUobGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IHJlbCgwLjYpKSwKICAgICAgICBheGlzLnRpdGxlLnkgPSBlbGVtZW50X3RleHQobWFyZ2luID0gbWFyZ2luKHIgPSAzKSksCiAgICAgICAgbGVnZW5kLmJveC5tYXJnaW4gPSBtYXJnaW4odCA9IC0wLjUsIHVuaXQgPSAibGluZXMiKSkKCmZpZ19kdnMKZ2dzYXZlKGhlcmUoImFuYWx5c2lzIiwgIm91dHB1dCIsICJmaWctZHZzLnBkZiIpLCBmaWdfZHZzLAogICAgICAgd2lkdGggPSA2LjUsIGhlaWdodCA9IDQuNzUsIGRldmljZSA9IGNhaXJvX3BkZikKZ2dzYXZlKGhlcmUoImFuYWx5c2lzIiwgIm91dHB1dCIsICJmaWctZHZzLnBuZyIpLCBmaWdfZHZzLAogICAgICAgd2lkdGggPSA2LjUsIGhlaWdodCA9IDQuNzUsIGRwaSA9IDMwMCwgdHlwZSA9ICJjYWlybyIpCmBgYAoKCiMgTGVnYWwgcmVzdHJpY3Rpb25zIG9uIE5HT3MKCiMjIERDSlcgLyBDaGF1ZGhyeSBpbmRleGVzCgpgYGB7ciBkY2p3LWluZGV4LXRhYmxlLCByZXN1bHRzPSJhc2lzIiwgbWVzc2FnZT1GQUxTRX0KZGNqd19pbmRleGVzIDwtIHJlYWRfY3N2KGhlcmUoImRhdGEiLCAibWFudWFsX2RhdGEiLCAiZGNqd19pbmRleC5jc3YiKSkgJT4lCiAgbXV0YXRlKExhd3MgPSBzdHJfcmVwbGFjZV9hbGwoTGF3cywgIlxuIiwgIlxuXG4iKSkKCmNhcHRpb24gPC0gIkRlc2NyaXB0aW9uIG9mIGluZGV4ZXMgb2YgTkdPIGJhcnJpZXJzIHsjdGJsOm5nby1iYXJyaWVycy1pbmRleH0iCmRjandfaW5kZXhfdGFibGUgPC0gcGFuZG9jLnRhYmxlLnJldHVybihkY2p3X2luZGV4ZXMsIGtlZXAubGluZS5icmVha3MgPSBUUlVFLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlID0gImdyaWQiLCBqdXN0aWZ5ID0gImxsbCIsIGNhcHRpb24gPSBjYXB0aW9uKQoKY2F0KGRjandfaW5kZXhfdGFibGUpCmNhdChkY2p3X2luZGV4X3RhYmxlLCBmaWxlID0gaGVyZSgiYW5hbHlzaXMiLCAib3V0cHV0IiwgInRibC1uZ28tYmFycmllcnMtaW5kZXgubWQiKSkKYGBgCgojIyBOR08gYmFycmllcnMgb3ZlciB0aW1lCgpgYGB7ciBhZHZvY2FjeS1sYXdzLCBtZXNzYWdlPUZBTFNFLCBmaWcud2lkdGg9Ni41LCBmaWcuaGVpZ2h0PTZ9CiMgYmFycmllcnNfdG90YWwgPSBhZHZvY2FjeSArIGVudHJ5ICsgZnVuZGluZwpkY2p3X3F1ZXN0aW9ucyA8LSByZWFkX2NzdihoZXJlKCJkYXRhIiwgIm1hbnVhbF9kYXRhIiwgImRjandfcXVlc3Rpb25zLmNzdiIpKSAlPiUgCiAgZmlsdGVyKCFpZ25vcmVfaW5faW5kZXgpICU+JSAKICBzZWxlY3QoYmFycmllcl9ncm91cCA9IGJhcnJpZXJfZGlzcGxheSwgYmFycmllciA9IHF1ZXN0aW9uX2NsZWFuLCAKICAgICAgICAgYmFycmllcl9kaXNwbGF5ID0gcXVlc3Rpb25fZGlzcGxheSkgJT4lIAogIG11dGF0ZShiYXJyaWVyX2dyb3VwID0gcGFzdGUwKCJCYXJyaWVycyB0byAiLCBzdHJfdG9fbG93ZXIoYmFycmllcl9ncm91cCkpKQoKZGZfYmFycmllcnMgPC0gZGZfY291bnRyeV9haWRfbGF3cyAlPiUgCiAgZ3JvdXBfYnkoZ3djb2RlLCB5ZWFyKSAlPiUgCiAgc3VtbWFyaXplKGFjcm9zcyhvbmVfb2YoZGNqd19xdWVzdGlvbnMkYmFycmllciksIH4uID4gMCkpICU+JSAKICBncm91cF9ieSh5ZWFyKSAlPiUgCiAgc3VtbWFyaXplKGFjcm9zcygtZ3djb2RlLCB+c3VtKC4pKSkgJT4lIAogIHVuZ3JvdXAoKSAlPiUgCiAgcGl2b3RfbG9uZ2VyKG5hbWVzX3RvID0gImJhcnJpZXIiLCB2YWx1ZXNfdG8gPSAidmFsdWUiLCAteWVhcikgJT4lIAogIGxlZnRfam9pbihkY2p3X3F1ZXN0aW9ucywgYnkgPSAiYmFycmllciIpICU+JSAKICBtdXRhdGUoYmFycmllcl9kaXNwbGF5ID0gc3RyX3JlcGxhY2UoYmFycmllcl9kaXNwbGF5LCAiWFhYIiwgIlxuIikpICU+JSAKICBhcnJhbmdlKGRlc2ModmFsdWUpKSAlPiUgCiAgbXV0YXRlKGJhcnJpZXJfZGlzcGxheSA9IGZjdF9pbm9yZGVyKGJhcnJpZXJfZGlzcGxheSwgb3JkZXJlZCA9IFRSVUUpKQoKZGNqd19lbnRyeV9wbG90IDwtIGdncGxvdChmaWx0ZXIoZGZfYmFycmllcnMsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXJyaWVyX2dyb3VwID09ICJCYXJyaWVycyB0byBlbnRyeSIpLCAKICAgICAgICAgICAgICAgICAgICAgICAgICBhZXMoeCA9IHllYXIsIHkgPSB2YWx1ZSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yID0gYmFycmllcl9kaXNwbGF5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5ldHlwZSA9IGJhcnJpZXJfZGlzcGxheSkpICsKICBnZW9tX2xpbmUoc2l6ZSA9IDAuNSkgKwogIGV4cGFuZF9saW1pdHMoeSA9IGMoMCwgOTApKSArCiAgc2NhbGVfeV9jb250aW51b3VzKHNlYy5heGlzID0gc2VjX2F4aXMofiAuIC8gbnVtX2NvdW50cmllcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBwZXJjZW50X2Zvcm1hdChhY2N1cmFjeSA9IDEpKSwKICAgICAgICAgICAgICAgICAgICAgZXhwYW5kID0gYygwLCAwKSkgKwogIHNjYWxlX2NvbG91cl9tYW51YWwodmFsdWVzID0gYygiYmxhY2siLCAiZ3JleTgwIiwgImdyZXk1MCIpLCBuYW1lID0gTlVMTCkgKwogIHNjYWxlX2xpbmV0eXBlX21hbnVhbCh2YWx1ZXMgPSBjKCJzb2xpZCIsICJzb2xpZCIsICIyMSIpLCBuYW1lID0gTlVMTCkgKwogIGNvb3JkX2NhcnRlc2lhbih4bGltID0gYygxOTkwLCAyMDE1KSwgeWxpbSA9IGMoMCwgOTApKSArCiAgZ3VpZGVzKGNvbG9yID0gZ3VpZGVfbGVnZW5kKG5yb3cgPSAyKSkgKwogIGxhYnMoeCA9IE5VTEwsIHkgPSAiTnVtYmVyIG9mIGNvdW50cmllcyIpICsKICB0aGVtZV9kb25vcnMoMTApICsgCiAgdGhlbWUobGVnZW5kLmp1c3RpZmljYXRpb24gPSAibGVmdCIpICsKICBmYWNldF93cmFwKHZhcnMoYmFycmllcl9ncm91cCkpCgpkY2p3X2Z1bmRpbmdfcGxvdCA8LSBnZ3Bsb3QoZmlsdGVyKGRmX2JhcnJpZXJzLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXJyaWVyX2dyb3VwID09ICJCYXJyaWVycyB0byBmdW5kaW5nIiksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgYWVzKHggPSB5ZWFyLCB5ID0gdmFsdWUsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yID0gYmFycmllcl9kaXNwbGF5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmV0eXBlID0gYmFycmllcl9kaXNwbGF5KSkgKwogIGdlb21fbGluZShzaXplID0gMC41KSArCiAgc2NhbGVfeV9jb250aW51b3VzKHNlYy5heGlzID0gc2VjX2F4aXMofiAuIC8gbnVtX2NvdW50cmllcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBwZXJjZW50X2Zvcm1hdChhY2N1cmFjeSA9IDEpKSwKICAgICAgICAgICAgICAgICAgICAgZXhwYW5kID0gYygwLCAwKSkgKwogIHNjYWxlX2NvbG91cl9tYW51YWwodmFsdWVzID0gYygiYmxhY2siLCAiZ3JleTgwIiwgImdyZXk1MCIsICJibGFjayIsICJncmV5ODAiKSwgbmFtZSA9IE5VTEwpICsKICBzY2FsZV9saW5ldHlwZV9tYW51YWwodmFsdWVzID0gYygic29saWQiLCAic29saWQiLCAic29saWQiLCAiMjEiLCAiMjEiKSwgbmFtZSA9IE5VTEwpICsKICBjb29yZF9jYXJ0ZXNpYW4oeGxpbSA9IGMoMTk5MCwgMjAxNSksIHlsaW0gPSBjKDAsIDQwKSkgKwogIGd1aWRlcyhjb2xvciA9IGd1aWRlX2xlZ2VuZChucm93ID0gMyksCiAgICAgICAgIGxpbmV0eXBlID0gZ3VpZGVfbGVnZW5kKG5yb3cgPSAzKSkgKwogIGxhYnMoeCA9IE5VTEwsIHkgPSAiTnVtYmVyIG9mIGNvdW50cmllcyIpICsKICB0aGVtZV9kb25vcnMoMTApICsgCiAgdGhlbWUobGVnZW5kLmp1c3RpZmljYXRpb24gPSAibGVmdCIpICsKICBmYWNldF93cmFwKHZhcnMoYmFycmllcl9ncm91cCkpCgpkY2p3X2Fkdm9jYWN5X3Bsb3QgPC0gZ2dwbG90KGZpbHRlcihkZl9iYXJyaWVycywgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhcnJpZXJfZ3JvdXAgPT0gIkJhcnJpZXJzIHRvIGFkdm9jYWN5IiksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgYWVzKHggPSB5ZWFyLCB5ID0gdmFsdWUsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yID0gYmFycmllcl9kaXNwbGF5KSkgKwogIGdlb21fbGluZShzaXplID0gMC41KSArCiAgc2NhbGVfeV9jb250aW51b3VzKHNlYy5heGlzID0gc2VjX2F4aXMofiAuIC8gbnVtX2NvdW50cmllcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBwZXJjZW50X2Zvcm1hdChhY2N1cmFjeSA9IDEpKSwKICAgICAgICAgICAgICAgICAgICAgZXhwYW5kID0gYygwLCAwKSkgKwogIHNjYWxlX2NvbG91cl9tYW51YWwodmFsdWVzID0gYygiYmxhY2siLCAiZ3JleTgwIiksIG5hbWUgPSBOVUxMKSArCiAgY29vcmRfY2FydGVzaWFuKHhsaW0gPSBjKDE5OTAsIDIwMTUpLCB5bGltID0gYygwLCA2MCkpICsKICBndWlkZXMoY29sb3IgPSBndWlkZV9sZWdlbmQobnJvdyA9IDEpKSArCiAgbGFicyh4ID0gTlVMTCwgeSA9ICJOdW1iZXIgb2YgY291bnRyaWVzIikgKwogIHRoZW1lX2Rvbm9ycygxMCkgKyAKICB0aGVtZShsZWdlbmQuanVzdGlmaWNhdGlvbiA9ICJsZWZ0IikgKwogIGZhY2V0X3dyYXAodmFycyhiYXJyaWVyX2dyb3VwKSkKCmRmX2Njc2lfcGxvdCA8LSBkZl9jb3VudHJ5X2FpZCAlPiUKICBsZWZ0X2pvaW4oZGZfYXV0b2NyYWNpZXMsIGJ5ID0gImd3Y29kZSIpICU+JQogIGdyb3VwX2J5KHllYXIsIGF1dG9jcmFjeSkgJT4lCiAgbmVzdCgpICU+JSAKICBtdXRhdGUoY2lzID0gZGF0YSAlPiUgbWFwKH4gbWVhbl9jbF9ub3JtYWwoLiR2Mnhjc19jY3NpKSkpICU+JSAKICB1bm5lc3QoY2lzKSAlPiUgCiAgdW5ncm91cCgpICU+JSAKICBtdXRhdGUoZmFrZV9mYWNldF90aXRsZSA9ICJDb3JlIGNpdmlsIHNvY2lldHkgaW5kZXgiLAogICAgICAgICBhdXRvY3JhY3kgPSBmYWN0b3IoYXV0b2NyYWN5LCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGMoIkRlbW9jcmFjaWVzIChSZWdpbWVzIG9mIHRoZSBXb3JsZCA+IDQpIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk5vbi1kZW1vY3JhY2llcyAoUmVnaW1lcyBvZiB0aGUgV29ybGQg4omkIDQpIiksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JkZXJlZCA9IFRSVUUpKQoKZmlnX2Njc2kgPC0gZ2dwbG90KGRmX2Njc2lfcGxvdCwgYWVzKHggPSB5ZWFyLCB5ID0geSkpICsKICBnZW9tX3JpYmJvbihhZXMoeW1pbiA9IHltaW4sIHltYXggPSB5bWF4LCBmaWxsID0gYXV0b2NyYWN5KSwgYWxwaGEgPSAwLjIpICsKICBnZW9tX2xpbmUoYWVzKGNvbG9yID0gYXV0b2NyYWN5KSwgc2l6ZSA9IDAuNSkgKwogIGFubm90YXRlKGdlb20gPSAidGV4dCIsIHggPSAyMDE1LCB5ID0gMC4xLCBoanVzdCA9ICJyaWdodCIsIHNpemUgPSBwdHMoNyksCiAgICAgICAgICAgbGFiZWwgPSAiSGlnaGVyIHZhbHVlcyA9IG1vcmUgb3BlbiBjaXZpbCBzb2NpZXR5IikgKwogIHNjYWxlX2NvbG91cl9tYW51YWwodmFsdWVzID0gYygiYmxhY2siLCAiZ3JleTc1IiksIG5hbWUgPSBOVUxMKSArCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gYygiYmxhY2siLCAiZ3JleTc1IiksIG5hbWUgPSBOVUxMKSArCiAgc2NhbGVfbGluZXR5cGVfbWFudWFsKHZhbHVlcyA9IGMoInNvbGlkIiwgInNvbGlkIiwgIjIxIikpICsKICBjb29yZF9jYXJ0ZXNpYW4oeGxpbSA9IGMoMTk5MCwgMjAxNSksIHlsaW0gPSBjKDAsIDEpKSArCiAgZ3VpZGVzKGNvbG9yID0gZ3VpZGVfbGVnZW5kKG5yb3cgPSAyKSkgKwogIGxhYnMoeSA9ICJBdmVyYWdlIiwgeCA9IE5VTEwpICsKICB0aGVtZV9kb25vcnMoMTApICsKICB0aGVtZShsZWdlbmQuanVzdGlmaWNhdGlvbiA9ICJsZWZ0IikgKwogIGZhY2V0X3dyYXAodmFycyhmYWtlX2ZhY2V0X3RpdGxlKSkKCmJhcnJpZXJzX3N1bW1hcnkgPC0gCiAgKChkY2p3X2VudHJ5X3Bsb3QgKyBkY2p3X2Z1bmRpbmdfcGxvdCkgLyAKICAgICAoZGNqd19hZHZvY2FjeV9wbG90ICsgZmlnX2Njc2kpKSAmCiAgdGhlbWUobGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IHJlbCgwLjYpKSwKICAgICAgICBheGlzLnRpdGxlLnkgPSBlbGVtZW50X3RleHQobWFyZ2luID0gbWFyZ2luKHIgPSAzKSksCiAgICAgICAgbGVnZW5kLmJveC5tYXJnaW4gPSBtYXJnaW4odCA9IC0wLjUsIHVuaXQgPSAibGluZXMiKSkKCmJhcnJpZXJzX3N1bW1hcnkKZ2dzYXZlKGhlcmUoImFuYWx5c2lzIiwgIm91dHB1dCIsICJmaWctYmFycmllcnMtc3VtbWFyeS5wZGYiKSwgYmFycmllcnNfc3VtbWFyeSwKICAgICAgIHdpZHRoID0gNi41LCBoZWlnaHQgPSA2LCBkZXZpY2UgPSBjYWlyb19wZGYpCmdnc2F2ZShoZXJlKCJhbmFseXNpcyIsICJvdXRwdXQiLCAiZmlnLWJhcnJpZXJzLXN1bW1hcnkucG5nIiksIGJhcnJpZXJzX3N1bW1hcnksCiAgICAgICB3aWR0aCA9IDYuNSwgaGVpZ2h0ID0gNiwgZHBpID0gMzAwLCB0eXBlID0gImNhaXJvIikKYGBgCgojIyBDb21wdWxzb3J5IHZzLiBidXJkZW5zb21lIHJlZ2lzdHJhdGlvbgoKTGF3cyByZXF1aXJpbmcgTkdPIHJlZ2lzdHJhdGlvbiBhcmVuJ3QgbmVjZXNzYXJpbHkgYSBzaWduIG9mIG9wcHJlc3Npb27igJRldmVuIHRoZSBVUyByZXF1aXJlcyB0aGF0IG5vbnByb2ZpdHMgdGhhdCBlYXJuIGFib3ZlIGEgY2VydGFpbiB0aHJlc2hvbGQgcmVnaXN0ZXIgYXMgNTAxKGMpKDMpIG9yZ2FuaXphdGlvbnMuIFRob3VnaCB0aGUgZmlndXJlIGJlbG93IHNob3dzIHRoYXQgY29tcHVsc29yeSByZWd1bGF0aW9uIGhhdmUgaW5jcmVhc2VkIG92ZXIgdGltZSwgYWN0dWFsIHJlc3RyaWN0aW9uIGhhcyBvY2N1cnJlZCB0b28uIEJ1cmRlbnNvbWUgcmVnaXN0cmF0aW9uIGlzIG5vdCBqdXN0IGFub3RoZXIgc3RhbmRhcmQgbGF5ZXIgb2YgYnVyZWF1Y3JhY3kuCgpgYGB7ciBjb21wdWxzb3J5LXZzLWJ1cmRlbnNvbWUsIGZpZy53aWR0aD02LCBmaWcuaGVpZ2h0PTIuNSwgZmlnLmFzcD1OVUxMfQpkZl9yZWd1bGF0aW9uIDwtIGRmX2NvdW50cnlfYWlkX2xhd3MgJT4lCiAgbGVmdF9qb2luKHNlbGVjdChkZl9hdXRvY3JhY2llcywgZ3djb2RlLCBhdXRvY3JhY3kpLCBieSA9ICJnd2NvZGUiKSAlPiUKICBncm91cF9ieSh5ZWFyLCBhdXRvY3JhY3kpICU+JQogIHN1bW1hcmlzZShgUmVnaXN0cmF0aW9uIHJlcXVpcmVkYCA9IHN1bShuZ29fcmVnaXN0ZXIpIC8gbigpLAogICAgICAgICAgICBgUmVnaXN0cmF0aW9uIGJ1cmRlbnNvbWVgID0gc3VtKG5nb19yZWdpc3Rlcl9idXJkZW4pIC8gbigpKSAlPiUKICB1bmdyb3VwKCkgJT4lIAogIHBpdm90X2xvbmdlcihuYW1lc190byA9ICJ0eXBlX29mX2xhdyIsIHZhbHVlc190byA9ICJ2YWx1ZSIsIC1jKHllYXIsIGF1dG9jcmFjeSkpICU+JSAKICBtdXRhdGUoYXV0b2NyYWN5ID0gCiAgICAgICAgICAgZmFjdG9yKGF1dG9jcmFjeSwgbGV2ZWxzID0gYyhUUlVFLCBGQUxTRSksCiAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGMoIk5vbi1kZW1vY3JhY2llcyIsICJEZW1vY3JhY2llcyIpKSkKCmZpZ19yZWd1bGF0aW9uX2J1cmRlbiA8LSBnZ3Bsb3QoZGZfcmVndWxhdGlvbiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWVzKHggPSB5ZWFyLCB5ID0gdmFsdWUsIGNvbG9yID0gdHlwZV9vZl9sYXcpKSArCiAgZ2VvbV9saW5lKHNpemUgPSAwLjUpICsKICBzY2FsZV95X2NvbnRpbnVvdXMobGFiZWxzID0gcGVyY2VudF9mb3JtYXQoYWNjdXJhY3kgPSAxKSkgKwogIHNjYWxlX3hfY29udGludW91cyhleHBhbmQgPSBjKDAsIDApKSArCiAgY29vcmRfY2FydGVzaWFuKHlsaW0gPSBjKDAsIDAuNyksIHhsaW0gPSBjKDE5OTAsIDIwMTQpKSArCiAgZ3VpZGVzKGNvbG91ciA9IGd1aWRlX2xlZ2VuZCh0aXRsZSA9IE5VTEwpKSArCiAgbGFicyh4ID0gTlVMTCwgeSA9ICJQcm9wb3J0aW9uIG9mIGNvdW50cmllc1xud2l0aCByZWd1bGF0aW9uIikgKwogIHRoZW1lX2Rvbm9ycygxMCkgKwogIGZhY2V0X3dyYXAodmFycyhhdXRvY3JhY3kpKQoKZmlnX3JlZ3VsYXRpb25fYnVyZGVuCmdnc2F2ZShoZXJlKCJhbmFseXNpcyIsICJvdXRwdXQiLCAiZmlnLXJlZ3VsYXRpb24tYnVyZGVuLnBkZiIpLCBmaWdfZHZzLAogICAgICAgd2lkdGggPSA2LCBoZWlnaHQgPSAyLjUsIGRldmljZSA9IGNhaXJvX3BkZikKZ2dzYXZlKGhlcmUoImFuYWx5c2lzIiwgIm91dHB1dCIsICJmaWctcmVndWxhdGlvbi1idXJkZW4ucG5nIiksIGZpZ19kdnMsCiAgICAgICB3aWR0aCA9IDYsIGhlaWdodCA9IDIuNSwgZHBpID0gMzAwLCB0eXBlID0gImNhaXJvIikKYGBgCgoKIyBBaWQKCiMjIEFpZCBvdmVyIHRpbWUsIGJ5IGRvbm9yIHR5cGUKCmBgYHtyIGFpZC1ieS1kb25vcn0KYWlkX2Rvbm9yX3R5cGVfdGltZSA8LSBkZl9kb25vciAlPiUKICBncm91cF9ieSh5ZWFyLCBkb25vcl90eXBlX2NvbGxhcHNlZCkgJT4lCiAgc3VtbWFyaXNlKHRvdGFsX2FpZCA9IHN1bShvZGEsIG5hLnJtID0gVFJVRSkpCgpnZ3Bsb3QoYWlkX2Rvbm9yX3R5cGVfdGltZSwgYWVzKHggPSB5ZWFyLCB5ID0gdG90YWxfYWlkIC8gMTAwMDAwMDAwMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvdXIgPSBkb25vcl90eXBlX2NvbGxhcHNlZCkpICsKICBnZW9tX2xpbmUoc2l6ZSA9IDAuNSkgKwogIGxhYnMoeCA9IE5VTEwsIHkgPSAiQmlsbGlvbnMgb2YgVVNEIiwKICAgICAgIGNhcHRpb24gPSAiU291cmNlOiBPRUNEIGFuZCBBaWREYXRhLiAyMDExIGRvbGxhcnMuIikgKwogIGd1aWRlcyhjb2xvdXIgPSBndWlkZV9sZWdlbmQodGl0bGUgPSBOVUxMKSkgKwogIHNjYWxlX3lfY29udGludW91cyhsYWJlbHMgPSBkb2xsYXIpICsgCiAgdGhlbWVfZG9ub3JzKCkKYGBgCgojIyBBaWQgb3ZlciB0aW1lLCBieSBjb250ZW50aW91c25lc3MKCmBgYHtyIGFpZC1ieS1jb250ZW50aW9ufQphaWRfY29udGVudGlvbl90aW1lIDwtIGRmX2Rvbm9yICU+JQogIGdyb3VwX2J5KHllYXIsIHB1cnBvc2VfY29udGVudGlvdXNuZXNzKSAlPiUKICBzdW1tYXJpc2UodG90YWxfYWlkID0gc3VtKG9kYSwgbmEucm0gPSBUUlVFKSkKCmdncGxvdChhaWRfY29udGVudGlvbl90aW1lLCBhZXMoeCA9IHllYXIsIHkgPSB0b3RhbF9haWQgLyAxMDAwMDAwMDAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG91ciA9IHB1cnBvc2VfY29udGVudGlvdXNuZXNzKSkgKwogIGdlb21fbGluZShzaXplID0gMC41KSArCiAgbGFicyh4ID0gTlVMTCwgeSA9ICJCaWxsaW9ucyBvZiBVU0QiLAogICAgICAgY2FwdGlvbiA9ICJTb3VyY2U6IE9FQ0QgYW5kIEFpZERhdGEuIDIwMTEgZG9sbGFycy4iKSArCiAgZ3VpZGVzKGNvbG91ciA9IGd1aWRlX2xlZ2VuZCh0aXRsZSA9IE5VTEwpKSArCiAgc2NhbGVfeV9jb250aW51b3VzKGxhYmVscyA9IGRvbGxhcikgKyAKICB0aGVtZV9kb25vcnMoKQpgYGAKCiMgUmVzdHJpY3Rpb25zIGFuZCBhaWQgey50YWJzZXQgLnRhYnNldC1mYWRlIC50YWJzZXQtcGlsbHN9CgpgYGB7ciByZXN0cmljdGlvbnMtYWlkLWNvcnJlbGF0aW9uc30KaW52X2xvZ2l0IDwtIGZ1bmN0aW9uKGYsIGEpIHsKICBhIDwtICgxIC0gMiAqIGEpCiAgKGEgKiAoMSArIGV4cChmKSkgKyAoZXhwKGYpIC0gMSkpIC8gKDIgKiBhICogKDEgKyBleHAoZikpKQp9CgpkdnNfY2xlYW5fbmFtZXMgPC0gdHJpYmJsZSgKICB+YmFycmllciwgfmJhcnJpZXJfY2xlYW4sCiAgImJhcnJpZXJzX3RvdGFsIiwgIkFsbCBiYXJyaWVycyIsCiAgImFkdm9jYWN5IiwgIkJhcnJpZXJzIHRvIGFkdm9jYWN5IiwKICAiZW50cnkiLCAiQmFycmllcnMgdG8gZW50cnkiLAogICJmdW5kaW5nIiwgIkJhcnJpZXJzIHRvIGZ1bmRpbmciCikKCml2c19jbGVhbl9uYW1lcyA8LSB0cmliYmxlKAogIH52YXJpYWJsZSwgfnZhcmlhYmxlX2NsZWFuLCB+aHlwb3RoZXNpcywKICAidG90YWxfb2RhX2xlYWQxIiwgIlRvdGFsIE9EQSIsICJIMSIsCiAgInByb3BfY29udGVudGlvdXNfbGVhZDEiLCAiQ29udGVudGlvdXMgYWlkIiwgIkgyIiwKICAicHJvcF9uZ29fZG9tX2xlYWQxIiwgIkFpZCB0byBkb21lc3RpYyBOR09zIiwgIkgzIiwKICAicHJvcF9uZ29fZm9yZWlnbl9sZWFkMSIsICJBaWQgdG8gZm9yZWlnbiBOR09zIiwgIkgzIgopCmBgYAoKIyMgUmVzdHJpY3Rpb25zIGFuZCBPREEgKEh+MX4pCgpgYGB7ciByZXN0cmljdGlvbnMtYWlkLWgxLCB3YXJuaW5nPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCBmaWcud2lkdGg9OCwgZmlnLmhlaWdodD00LjV9CmRmX3Bsb3RfYmFycmllcnNfb2RhIDwtIGRmX2NvdW50cnlfYWlkX2xhd3MgJT4lIAogIHNlbGVjdCh5ZWFyLCBnd2NvZGUsIGNvdW50cnksIHRvdGFsX29kYV9sZWFkMSwKICAgICAgICAgb25lX29mKGR2c19jbGVhbl9uYW1lcyRiYXJyaWVyKSkgJT4lIAogIHBpdm90X2xvbmdlcihuYW1lc190byA9ICJiYXJyaWVyIiwgdmFsdWVzX3RvID0gInZhbHVlIiwgCiAgICAgICAgICAgICAgIG9uZV9vZihkdnNfY2xlYW5fbmFtZXMkYmFycmllcikpICU+JSAKICBsZWZ0X2pvaW4oZHZzX2NsZWFuX25hbWVzLCBieSA9ICJiYXJyaWVyIikgJT4lIAogIG11dGF0ZShiYXJyaWVyX2NsZWFuID0gZmN0X2lub3JkZXIoYmFycmllcl9jbGVhbiwgb3JkZXJlZCA9IFRSVUUpKQoKZ2dwbG90KGRmX3Bsb3RfYmFycmllcnNfb2RhLCAKICAgICAgIGFlcyh4ID0gdmFsdWUsIHkgPSB0b3RhbF9vZGFfbGVhZDEsIGNvbG9yID0gYmFycmllcl9jbGVhbikpICsKICBnZW9tX3BvaW50KGFscGhhID0gMC41KSArCiAgc3RhdF9zbW9vdGgobWV0aG9kID0gImxtIikgKwogIHN0YXRfc21vb3RoKGRhdGEgPSBmaWx0ZXIoZGZfcGxvdF9iYXJyaWVyc19vZGEsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdG90YWxfb2RhX2xlYWQxID4gMTAwMDAwMDAwMDApLCAKICAgICAgICAgICAgICBtZXRob2QgPSAibG0iLCBsaW5ldHlwZSA9ICIyMSIpICsKICBzY2FsZV95X2NvbnRpbnVvdXMobGFiZWxzID0gZG9sbGFyKSArCiAgZ3VpZGVzKGNvbG9yID0gRkFMU0UpICsKICBsYWJzKHggPSAiTnVtYmVyIG9mIGxlZ2FsIGJhcnJpZXJzIiwgeSA9ICJUb3RhbCBPREEgaW4gbmV4dCB5ZWFyIiwKICAgICAgIHRpdGxlID0gIlRvdGFsIE9EQSBpbiBuZXh0IHllYXIiLAogICAgICAgc3VidGl0bGUgPSAiRG90dGVkIGxpbmVzIHNob3cgdHJlbmRzIHdoZW4gb21pdHRpbmcgb2JzZXJ2YXRpb25zXG53aXRoIGxlc3MgdGhhbiAkMTAsMDAwLDAwMCwwMDAgaW4gT0RBIikgKwogIHRoZW1lX2Rvbm9ycygxMCkgKwogIHRoZW1lKHN0cmlwLnRleHQueCA9IGVsZW1lbnRfdGV4dChtYXJnaW4gPSBtYXJnaW4odCA9IDEsIGIgPSAxKSkpICsKICBmYWNldF93cmFwKHZhcnMoYmFycmllcl9jbGVhbiksIHNjYWxlcyA9ICJmcmVlX3giLCBucm93ID0gMikKYGBgCgojIyBSZXN0cmljdGlvbnMgYW5kIGNvbnRlbnRpb3VzbmVzcyAoSH4yfikKCmBgYHtyIHJlc3RyaWN0aW9ucy1haWQtaDIsIHdhcm5pbmc9RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIGZpZy53aWR0aD04LCBmaWcuaGVpZ2h0PTQuNX0KZGZfcGxvdF9iYXJyaWVyc19jb250ZW50aW9uIDwtIGRmX2NvdW50cnlfYWlkX2xhd3MgJT4lIAogIHNlbGVjdCh5ZWFyLCBnd2NvZGUsIGNvdW50cnksIHByb3BfY29udGVudGlvdXNfbGVhZDEsCiAgICAgICAgIG9uZV9vZihkdnNfY2xlYW5fbmFtZXMkYmFycmllcikpICAlPiUgCiAgcGl2b3RfbG9uZ2VyKG5hbWVzX3RvID0gImJhcnJpZXIiLCB2YWx1ZXNfdG8gPSAidmFsdWUiLCAKICAgICAgICAgICAgICAgb25lX29mKGR2c19jbGVhbl9uYW1lcyRiYXJyaWVyKSkgJT4lIAogIGxlZnRfam9pbihkdnNfY2xlYW5fbmFtZXMsIGJ5ID0gImJhcnJpZXIiKSAlPiUgCiAgbXV0YXRlKGJhcnJpZXJfY2xlYW4gPSBmY3RfaW5vcmRlcihiYXJyaWVyX2NsZWFuLCBvcmRlcmVkID0gVFJVRSkpCgpnZ3Bsb3QoZGZfcGxvdF9iYXJyaWVyc19jb250ZW50aW9uLCAKICAgICAgIGFlcyh4ID0gdmFsdWUsIHkgPSBwcm9wX2NvbnRlbnRpb3VzX2xlYWQxLCBjb2xvciA9IGJhcnJpZXJfY2xlYW4pKSArCiAgZ2VvbV9wb2ludChhbHBoYSA9IDAuNSkgKwogIHN0YXRfc21vb3RoKG1ldGhvZCA9ICJsbSIpICsKICBzdGF0X3Ntb290aChkYXRhID0gZmlsdGVyKGRmX3Bsb3RfYmFycmllcnNfY29udGVudGlvbiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wX2NvbnRlbnRpb3VzX2xlYWQxID4gMC4wNSksIAogICAgICAgICAgICAgIG1ldGhvZCA9ICJsbSIsIGxpbmV0eXBlID0gIjIxIikgKwogIHNjYWxlX3lfY29udGludW91cyhsYWJlbHMgPSBwZXJjZW50KSArCiAgZ3VpZGVzKGNvbG9yID0gRkFMU0UpICsKICBsYWJzKHggPSAiTnVtYmVyIG9mIGxlZ2FsIGJhcnJpZXJzIiwgCiAgICAgICB5ID0gIlByb3BvcnRpb24gb2YgY29udGVudGlvdXMgYWlkIGluIG5leHQgeWVhciIsCiAgICAgICB0aXRsZSA9ICJQcm9wb3J0aW9uIG9mIGNvbnRlbnRpb3VzIGFpZCBpbiBuZXh0IHllYXIiLAogICAgICAgc3VidGl0bGUgPSAiRG90dGVkIGxpbmVzIHNob3cgdHJlbmRzIHdoZW4gb21pdHRpbmcgb2JzZXJ2YXRpb25zXG53aXRoIGxlc3MgdGhhbiA1JSBjb250ZW50aW91cyBhaWQiKSArCiAgdGhlbWVfZG9ub3JzKDEwKSArCiAgdGhlbWUoc3RyaXAudGV4dC54ID0gZWxlbWVudF90ZXh0KG1hcmdpbiA9IG1hcmdpbih0ID0gMSwgYiA9IDEpKSkgKwogIGZhY2V0X3dyYXAodmFycyhiYXJyaWVyX2NsZWFuKSwgc2NhbGVzID0gImZyZWVfeCIsIG5yb3cgPSAyKQpgYGAKCiMjIFJlc3RyaWN0aW9ucyBhbmQgTkdPcyAoSH4zfikKCmBgYHtyIHJlc3RyaWN0aW9ucy1haWQtaDMsIHdhcm5pbmc9RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIGZpZy53aWR0aD04LCBmaWcuaGVpZ2h0PTQuNX0KZGZfcGxvdF9iYXJyaWVyc19uZ29zIDwtIGRmX2NvdW50cnlfYWlkX2xhd3MgJT4lIAogIHNlbGVjdCh5ZWFyLCBnd2NvZGUsIGNvdW50cnksIAogICAgICAgICBwcm9wX25nb19kb21fbGVhZDEsIHByb3BfbmdvX2ZvcmVpZ25fbGVhZDEsCiAgICAgICAgIG9uZV9vZihkdnNfY2xlYW5fbmFtZXMkYmFycmllcikpICU+JSAKICBwaXZvdF9sb25nZXIobmFtZXNfdG8gPSAiYmFycmllciIsIHZhbHVlc190byA9ICJ2YWx1ZSIsIAogICAgICAgICAgICAgICBvbmVfb2YoZHZzX2NsZWFuX25hbWVzJGJhcnJpZXIpKSAlPiUgCiAgcGl2b3RfbG9uZ2VyKG5hbWVzX3RvID0gIm5nb190eXBlIiwgdmFsdWVzX3RvID0gInByb3BfbmdvIiwgCiAgICAgICAgICAgICAgIGMocHJvcF9uZ29fZG9tX2xlYWQxLCBwcm9wX25nb19mb3JlaWduX2xlYWQxKSkgJT4lIAogIGxlZnRfam9pbihkdnNfY2xlYW5fbmFtZXMsIGJ5ID0gImJhcnJpZXIiKSAlPiUgCiAgbGVmdF9qb2luKGl2c19jbGVhbl9uYW1lcywgYnkgPSBjKCJuZ29fdHlwZSIgPSAidmFyaWFibGUiKSkgJT4lIAogIG11dGF0ZShiYXJyaWVyX2NsZWFuID0gZmN0X2lub3JkZXIoYmFycmllcl9jbGVhbiwgb3JkZXJlZCA9IFRSVUUpKQoKZ2dwbG90KGRmX3Bsb3RfYmFycmllcnNfbmdvcywgCiAgICAgICBhZXMoeCA9IHZhbHVlLCB5ID0gcHJvcF9uZ28sIGNvbG9yID0gYmFycmllcl9jbGVhbikpICsKICBnZW9tX3BvaW50KGFscGhhID0gMC41KSArCiAgc3RhdF9zbW9vdGgobWV0aG9kID0gImxtIikgKwogIHN0YXRfc21vb3RoKGRhdGEgPSBmaWx0ZXIoZGZfcGxvdF9iYXJyaWVyc19uZ29zLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BfbmdvID4gMC4wNSksIAogICAgICAgICAgICAgIG1ldGhvZCA9ICJsbSIsIGxpbmV0eXBlID0gIjIxIikgKwogIHNjYWxlX3lfY29udGludW91cyhsYWJlbHMgPSBwZXJjZW50KSArCiAgZ3VpZGVzKGNvbG9yID0gRkFMU0UpICsKICBsYWJzKHggPSAiTnVtYmVyIG9mIGxlZ2FsIGJhcnJpZXJzIiwgCiAgICAgICB5ID0gIlByb3BvcnRpb24gb2YgYWlkIHRvIE5HT3MgaW4gbmV4dCB5ZWFyIiwKICAgICAgIHRpdGxlID0gIlByb3BvcnRpb24gb2YgYWlkIGNoYW5uZWxlZCB0byB0eXBlcyBvZiBOR09zIGluIG5leHQgeWVhciIsCiAgICAgICBzdWJ0aXRsZSA9ICJEb3R0ZWQgbGluZXMgc2hvdyB0cmVuZHMgd2hlbiBvbWl0dGluZyBvYnNlcnZhdGlvbnNcbndpdGggbGVzcyB0aGFuIDUlIGFpZCB0byBOR09zIikgKwogIGNvb3JkX2NhcnRlc2lhbih5bGltID0gYygwLCAxKSkgKwogIHRoZW1lX2Rvbm9ycygxMCkgKwogIHRoZW1lKHN0cmlwLnRleHQueCA9IGVsZW1lbnRfdGV4dChtYXJnaW4gPSBtYXJnaW4odCA9IDEsIGIgPSAxKSkpICsKICBmYWNldF93cmFwKHZhcnModmFyaWFibGVfY2xlYW4sIGJhcnJpZXJfY2xlYW4pLCBzY2FsZXMgPSAiZnJlZV94IiwgbmNvbCA9IDQpCmBgYAoKIyMgQ0NTSSBhbmQgYWxsIERWcyAoYWxsIGh5cG90aGVzZXMpCgpgYGB7ciBjY3NpLWFpZC1hbGxocywgd2FybmluZz1GQUxTRSwgZmlnLndpZHRoPTgsIGZpZy5oZWlnaHQ9NC41fQpkZl9wbG90X2Njc2lfbmdvcyA8LSBkZl9jb3VudHJ5X2FpZF9sYXdzICU+JSAKICBzZWxlY3QoeWVhciwgZ3djb2RlLCBjb3VudHJ5LCAKICAgICAgICAgb25lX29mKGl2c19jbGVhbl9uYW1lcyR2YXJpYWJsZSksIHYyeGNzX2Njc2kpICU+JSAKICBwaXZvdF9sb25nZXIobmFtZXNfdG8gPSAidmFyaWFibGUiLCB2YWx1ZXNfdG8gPSAidmFsdWUiLCAKICAgICAgICAgICAgICAgYyhvbmVfb2YoaXZzX2NsZWFuX25hbWVzJHZhcmlhYmxlKSkpICU+JSAKICBsZWZ0X2pvaW4oaXZzX2NsZWFuX25hbWVzLCBieSA9ICJ2YXJpYWJsZSIpICU+JSAKICBtdXRhdGUoaHlwb3RoZXNpc19jbGVhbiA9IHBhc3RlMChoeXBvdGhlc2lzLCAiOiAiLCB2YXJpYWJsZV9jbGVhbikpICU+JSAKICBhcnJhbmdlKGh5cG90aGVzaXNfY2xlYW4pICU+JSAKICBtdXRhdGUoaHlwb3RoZXNpc19jbGVhbiA9IGZjdF9pbm9yZGVyKGh5cG90aGVzaXNfY2xlYW4sIG9yZGVyZWQgPSBUUlVFKSkKICAKZ2dwbG90KGRmX3Bsb3RfY2NzaV9uZ29zLCAKICAgICAgIGFlcyh4ID0gdjJ4Y3NfY2NzaSwgeSA9IHZhbHVlLCBjb2xvciA9IGh5cG90aGVzaXMpKSArCiAgZ2VvbV9wb2ludChhbHBoYSA9IDAuMjUpICsKICBzY2FsZV9jb2xvcl92aXJpZGlzX2Qob3B0aW9uID0gInBsYXNtYSIsIGVuZCA9IDAuOSkgKwogIGd1aWRlcyhjb2xvciA9IEZBTFNFKSArCiAgbGFicyh4ID0gIkNpdmlsIHNvY2lldHkgaW5kZXgiLCAKICAgICAgIHkgPSAiVmFyaWFibGUgdmFsdWUgaW4gbmV4dCB5ZWFyIiwKICAgICAgIHRpdGxlID0gIkNvcmUgY2l2aWwgc29jaWV0eSBpbmRleCIpICsKICB0aGVtZV9kb25vcnMoKSArCiAgZmFjZXRfd3JhcCh2YXJzKGh5cG90aGVzaXNfY2xlYW4pLCBzY2FsZXMgPSAiZnJlZV95IikKYGBgCgoKIyBDSVZJQ1VTIHJlc3RyaWN0aW9ucwoKYGBge3IgY2l2aWN1cy1kYXRhLCB3YXJuaW5nPUZBTFNFLCBtZXNzYWdlPUZBTFNFfQpjaXZpY3VzIDwtIHJlYWRfY3N2KGhlcmUoImRhdGEiLCAicmF3X2RhdGEiLCAiQ2l2aWN1cyIsICJjaXZpY3VzX21vbml0b3JfMjAxNy5jc3YiKSwKICAgICAgICAgICAgICAgICAgICBuYSA9ICJOdWxsIikgJT4lCiAgbXV0YXRlKFBvcHVsYXRpb24gPSBhcy5kb3VibGUoUG9wdWxhdGlvbiksICAjIEludGVnZXJzIGNhbid0IGhhbmRsZSB3b3JsZCBwb3B1bGF0aW9uCiAgICAgICAgIFJhdGluZyA9IGZhY3RvcihSYXRpbmcsIGxldmVscyA9IGMoIk9wZW4iLCAiTmFycm93ZWQiLCAiT2JzdHJ1Y3RlZCIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJSZXByZXNzZWQiLCAiQ2xvc2VkIiksIAogICAgICAgICAgICAgICAgICAgICAgICAgb3JkZXJlZCA9IFRSVUUpLAogICAgICAgICBpc28zID0gY291bnRyeWNvZGUoQ291bnRyeSwgImNvdW50cnkubmFtZSIsICJpc28zYyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXN0b21fbWF0Y2ggPSBjKCJLb3Nvdm8iID0gIlhLSyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNaWNyb25lc2lhIiA9ICJGU00iKSkpCgojIFVzZSB0aGUgUm9iaW5zb24gbWFwIHByb2plY3Rpb24KcHJvamVjdGlvbiA8LSAiRVNSSTo1NDAzMCIKCndvcmxkX21hcCA8LSByZWFkX3NmKGhlcmUoImRhdGEiLCAicmF3X2RhdGEiLCAibmVfMTEwbV9hZG1pbl8wX2NvdW50cmllcyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIm5lXzExMG1fYWRtaW5fMF9jb3VudHJpZXMuc2hwIikpICU+JSAKICBmaWx0ZXIoSVNPX0EzICE9ICJBVEEiKQpgYGAKCmBgYHtyIGNpdmljdXMtbnVtYmVycywgcmVzdWx0cz0iYXNpcyJ9CmNpdmljdXMgJT4lIGNvdW50KFJhdGluZykgJT4lIHBhbmRvYy50YWJsZSgpCmBgYAoKYGBge3IgY2l2aWN1cy1tYXAsIGZpZy53aWR0aD01LjUsIGZpZy5oZWlnaHQ9M30KbWFwX3dpdGhfY2l2aWN1cyA8LSB3b3JsZF9tYXAgJT4lIAogICMgRml4IHNvbWUgTmF0dXJhbCBFYXJ0aCBJU08gd2VpcmRuZXNzCiAgbXV0YXRlKElTT19BMyA9IGlmZWxzZShJU09fQTMgPT0gIi05OSIsIGFzLmNoYXJhY3RlcihJU09fQTNfRUgpLCBhcy5jaGFyYWN0ZXIoSVNPX0EzKSkpICU+JSAKICBtdXRhdGUoSVNPX0EzID0gY2FzZV93aGVuKAogICAgLiRJU09fQTMgPT0gIkdSTCIgfiAiRE5LIiwKICAgIC4kTkFNRSA9PSAiTm9yd2F5IiB+ICJOT1IiLAogICAgLiROQU1FID09ICJLb3Nvdm8iIH4gIlhLSyIsCiAgICBUUlVFIH4gSVNPX0EzCiAgKSkgJT4lIAogIGxlZnRfam9pbihzZWxlY3QoY2l2aWN1cywgaXNvMywgUmF0aW5nKSwgYnkgPSBjKCJJU09fQTMiID0gImlzbzMiKSkKCnBsb3RfY2l2aWN1c19tYXAgPC0gZ2dwbG90KCkgKwogIGdlb21fc2YoZGF0YSA9IG1hcF93aXRoX2NpdmljdXMsIGFlcyhmaWxsID0gUmF0aW5nKSwgc2l6ZSA9IDAuMTUsIGNvbG9yID0gImJsYWNrIikgKwogIGNvb3JkX3NmKGNycyA9IHN0X2Nycyhwcm9qZWN0aW9uKSkgKwogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IGMoImdyZXk5MCIsICJncmV5NzAiLCAiZ3JleTQ1IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJncmV5MjAiLCAiYmxhY2siKSwKICAgICAgICAgICAgICAgICAgICBuYS50cmFuc2xhdGUgPSBGQUxTRSwgbmFtZSA9ICJDaXZpYyBzcGFjZSIpICsKICB0aGVtZV9kb25vcnNfbWFwKCkgKyAKICB0aGVtZShsZWdlbmQua2V5LnNpemUgPSB1bml0KDAuNywgImxpbmVzIikpCgpwbG90X2NpdmljdXNfbWFwCmdnc2F2ZShoZXJlKCJhbmFseXNpcyIsICJvdXRwdXQiLCAiZmlnLWNpdmljdXMtbWFwLnBkZiIpLCBwbG90X2NpdmljdXNfbWFwLAogICAgICAgd2lkdGggPSA1LjUsIGhlaWdodCA9IDMsIGRldmljZSA9IGNhaXJvX3BkZikKZ2dzYXZlKGhlcmUoImFuYWx5c2lzIiwgIm91dHB1dCIsICJmaWctY2l2aWN1cy1tYXAucG5nIiksIHBsb3RfY2l2aWN1c19tYXAsCiAgICAgICB3aWR0aCA9IDUuNSwgaGVpZ2h0ID0gMywgZHBpID0gMzAwLCB0eXBlID0gImNhaXJvIikKYGBgCgoKIyBMaXN0IG9mIGNvdW50cmllcyBpbmNsdWRlZCBpbiBtb2RlbHMKCmBgYHtyIGxpc3QtY291bnRyaWVzLCByZXN1bHRzPSJhc2lzIn0KbWF0cml4X2Zyb21fdmVjdG9yIDwtIGZ1bmN0aW9uKHgsIG5jb2wpIHsKICBuX2JhbGFuY2VkIDwtIGNlaWxpbmcobGVuZ3RoKHgpIC8gbmNvbCkgKiBuY29sCiAgbWF0cml4KGMoeCwgcmVwKE5BLCBuX2JhbGFuY2VkIC0gbGVuZ3RoKHgpKSksIG5jb2wgPSBuY29sKQp9CgphbGxfY291bnRyaWVzIDwtIGRmX2NvdW50cnlfYWlkX2xhd3MgJT4lIAogIGRpc3RpbmN0KGNvdW50cnkpICU+JSAKICBhcnJhbmdlKGNvdW50cnkpICU+JSAKICBwdWxsKGNvdW50cnkpIAoKY2FwdGlvbiA8LSBwYXN0ZTAoIkFsbCBjb3VudHJpZXMgaW5jbHVkZWQgaW4gbW9kZWxzIChOID0gIiwgCiAgICAgICAgICAgICAgICAgIGxlbmd0aChhbGxfY291bnRyaWVzKSwKICAgICAgICAgICAgICAgICAgIikgeyN0Ymw6Y291bnRyaWVzfSIpCgpuY29sX2NvdW50cmllcyA8LSA0Cgp0YmxfY291bnRyaWVzIDwtIGFsbF9jb3VudHJpZXMgJT4lIAogIG1hdHJpeF9mcm9tX3ZlY3RvcihuY29sID0gbmNvbF9jb3VudHJpZXMpICU+JSAKICBwYW5kb2MudGFibGUucmV0dXJuKGp1c3RpZnkgPSBwYXN0ZTAocmVwKCJsIiwgbmNvbF9jb3VudHJpZXMpLCBjb2xsYXBzZSA9ICIiKSwgCiAgICAgICAgICAgICAgICAgICAgICBjYXB0aW9uID0gY2FwdGlvbiwgbWlzc2luZyA9ICIiKQoKY2F0KHRibF9jb3VudHJpZXMpCmNhdCh0YmxfY291bnRyaWVzLCBmaWxlID0gaGVyZSgiYW5hbHlzaXMiLCAib3V0cHV0IiwgInRibC1jb3VudHJpZXMubWQiKSkKYGBgCg==