df.donor <- readRDS(here("Data", "data_clean", "df_donor.rds"))
df.donor.us <- readRDS(here("Data", "data_clean", "df_donor_usaid.rds"))
df.country.aid <- readRDS(here("Data", "data_clean", "df_country_aid_no_imputation.rds"))
dcjw.questions.clean <- read_csv(here("Data", "data_manual", "dcjw_questions.csv"))
dcjw.responses.clean <- read_csv(here("Data", "data_manual", "dcjw_responses.csv"))
autocracies <- df.country.aid %>%
group_by(cowcode) %>%
summarise(polity.avg = mean(polity, na.rm = TRUE)) %>%
mutate(autocracy = polity.avg < 6) %>%
# These countries are missing polity scores
mutate(autocracy = case_when(
# Equatorial Guinea, Kuwait, Bahrain, UAE, Oman, Singapore
.$cowcode %in% c(411, 690, 692, 696, 698, 830) ~ TRUE,
# Serbia, Kosovo
.$cowcode %in% c(340, 347) ~ FALSE,
TRUE ~ .$autocracy
))
Overall data summary
Our data includes information about 140 countries across 33 years (from 1981–2013)
Summary of variables in model
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.
coef.names <- read_csv(here("Data", "data_manual", "coef_names.csv"))
vars.to.summarize <- coef.names %>%
filter(summarize == TRUE)
vars.summarized <- df.country.aid %>%
select(one_of(vars.to.summarize$term)) %>%
mutate(trade.pct.gdp = trade.pct.gdp / 100, # This is scaled up for modeling
total.oda = total.oda / 1000000) %>%
gather(term, value) %>%
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)) %>%
left_join(vars.to.summarize, by = "term") %>%
arrange(summary_order) %>%
select(Variable = term_clean_table, Source = source,
Mean, `Std. Dev.`, Median, Min, Max, N) %>%
as.data.frame()
caption <- "Summary of all variables included in models {#tbl:var-summary}"
var.summary <- pandoc.table.return(vars.summarized, keep.line.breaks = TRUE,
round = 2, big.mark = ",",
justify = "llcccccc", caption = caption, style = "multiline")
cat(var.summary)
Summary of all variables included in models {#tbl:var-summary}
Total aid (constant 2011 USD, millions) |
OECD and AidData |
1,193 |
2,677 |
427.2 |
0 |
63,233 |
4,620 |
Proportion of contentious aid |
OECD and AidData |
0.06 |
0.1 |
0.02 |
0 |
1 |
4,094 |
Proportion of aid to domestic NGOs |
USAID |
0.04 |
0.13 |
0 |
0 |
1 |
3,839 |
Proportion of aid to foreign NGOs |
USAID |
0.11 |
0.19 |
0 |
0 |
1 |
3,839 |
Total legal barriers |
@christensen2013 |
1.77 |
1.51 |
1 |
0 |
8.5 |
4,620 |
Barriers to advocacy |
@christensen2013 |
0.17 |
0.39 |
0 |
0 |
2 |
4,620 |
Barriers to entry |
@christensen2013 |
1.25 |
0.74 |
1 |
0 |
3 |
4,620 |
Barriers to funding |
@christensen2013 |
0.35 |
0.82 |
0 |
0 |
4.5 |
4,620 |
Civil society regulatory environment (CSRE) |
V-Dem |
0.87 |
2.81 |
0.82 |
-6.14 |
6.29 |
4,354 |
Polity IV (0–10) |
V-Dem |
5.02 |
3.08 |
5 |
0 |
10 |
4,554 |
GDP per capita (constant 2011 USD) |
UN and World Bank |
6,008 |
10,672 |
2,524 |
74.4 |
122,422 |
4,327 |
Trade as % of GDP |
UN and World Bank |
0.77 |
0.46 |
0.67 |
0.04 |
4.4 |
4,327 |
Corruption |
V-Dem |
6.03 |
2.47 |
6.38 |
0.12 |
9.77 |
4,301 |
Internal conflict in last 5 years |
UCDP/PRIO |
0.26 |
0.44 |
0 |
0 |
1 |
4,620 |
Natural disasters |
EM-DAT |
1.73 |
3.17 |
1 |
0 |
43 |
4,620 |
Aid stuff
Overall OECD aid
OECD members donated $5,510,560,469,842 between 1981 and 2013.
Proportion of contentious vs. noncontentious aid
High |
$282,593,012,392 |
5.1% |
Low |
$5,234,897,475,348 |
94.9% |
USAID aid
The US donated $518,402,980,278 between 1981 and 2013 and $246,651,914,047 between 2000 and 2013.
Proportion of US aid to types of NGOs
Total amounts over time:
oda.us.ngo.dom |
$5,657,894,514 |
1.09% |
oda.us.ngo.int |
$12,674,549,597 |
2.44% |
oda.us.ngo.us |
$27,679,409,629 |
5.34% |
The US clearly favors US-based NGOs or international NGOs over domestic NGOs.
usaid.total.yearly <- df.country.aid %>%
group_by(year) %>%
summarise(annual.total = sum(oda.us)) %>%
mutate(fake_facet_title = "USAID ODA channeled through NGOs")
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"
)
plot.usaid.channel <- df.country.aid %>%
gather(channel, 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)) +
theme_donors() +
facet_wrap(~ fake_facet_title)
fig.usaid.channel
USAID data categorizes all aid as government-channeled before 2000 because of some quirk in the data.
So we just look at aid after 2000.
Legal restrictions on NGOs
DCJW indexes
Description of indexes of NGO barriers {#tbl:ngo-barriers-index}
Barriers to entry |
3 |
- How burdensome is registration? (Not burdensome = 0; Burdensome = 1)
- In law, can an NGO appeal if denied registration? (Yes = 0; No = 1)
- Are barriers to entry different for NGOs receiving foreign funds? (Less burdensome = -1; Same = 0; More burdensome = 1)
|
Barriers to funding |
5 |
- Do NGOs need prior approval from the government to receive foreign funding? (Yes = 1; No = 0)
- Are NGOs required to channel foreign funding through state-owned banks or government ministries? (Yes = 1; No = 0)
- Are any additional restrictions on foreign support in place? (Yes = 1; No = 0)
- Are all NGOs prohibited from receiving foreign funds? (No = 0; Partially = 0.5; Yes = 1)
- Is a category of NGOs prohibited from receiving foreign funds? (No = 0; Partially = 0.5; Yes = 1)
|
Barriers to advocacy |
2 |
- Does the law restrict NGOs from engaging in political activities? (No = 0; Partially = 0.5; Yes = 1)
- Are restrictions on political activities different for NGOs receiving foreign funds? (Less restrictive = -1; Same = 0; More restrictive = 1)
|
Total barriers |
10 |
— |
NGO barriers over time
dcjw.questions <- read_csv(here("Data", "data_manual", "dcjw_questions.csv")) %>%
filter(!ignore_in_index) %>%
select(barrier_group = barrier_display, barrier = question_clean,
barrier_display = question_display) %>%
mutate(barrier_group = paste0("Barriers to ", str_to_lower(barrier_group)))
df.barriers <- df.country.aid %>%
group_by(cowcode, year) %>%
summarize_at(vars(one_of(dcjw.questions$barrier)), funs(. > 0)) %>%
group_by(year) %>%
summarize_at(vars(-cowcode, -year), funs(sum(.))) %>%
gather(barrier, value, -year) %>%
left_join(dcjw.questions, by = "barrier") %>%
mutate(barrier_display = str_replace(barrier_display, "XXX", "\n")) %>%
arrange(desc(value)) %>%
mutate(barrier_display = fct_inorder(barrier_display, ordered = TRUE))
dcjw_entry_plot <- ggplot(filter(df.barriers,
barrier_group == "Barriers to entry"),
aes(x = year, y = value,
color = barrier_display,
linetype = barrier_display)) +
geom_line(size = 0.5) +
expand_limits(y = c(0, 90)) +
scale_y_continuous(sec.axis = sec_axis(~ . / num.countries,
labels = percent_format(accuracy = 1)),
expand = c(0, 0)) +
scale_colour_manual(values = c("black", "grey80", "grey50"), name = NULL) +
scale_linetype_manual(values = c("solid", "solid", "21"), name = NULL) +
guides(color = guide_legend(nrow = 2)) +
labs(x = NULL, y = "Number of countries") +
theme_donors() +
theme(legend.justification = "left") +
facet_wrap(~ barrier_group)
dcjw_funding_plot <- ggplot(filter(df.barriers,
barrier_group == "Barriers to funding"),
aes(x = year, y = value,
color = barrier_display,
linetype = barrier_display)) +
geom_line(size = 0.5) +
expand_limits(y = c(0, 40)) +
scale_y_continuous(sec.axis = sec_axis(~ . / num.countries,
labels = percent_format(accuracy = 1)),
expand = c(0, 0)) +
scale_colour_manual(values = c("black", "grey80", "grey50", "black", "grey80"), name = NULL) +
scale_linetype_manual(values = c("solid", "solid", "solid", "21", "21"), name = NULL) +
guides(color = guide_legend(nrow = 3),
linetype = guide_legend(nrow = 3)) +
labs(x = NULL, y = "Number of countries") +
theme_donors() +
theme(legend.justification = "left") +
facet_wrap(~ barrier_group)
dcjw_advocacy_plot <- ggplot(filter(df.barriers,
barrier_group == "Barriers to advocacy"),
aes(x = year, y = value,
color = barrier_display)) +
geom_line(size = 0.5) +
expand_limits(y = c(0, 40)) +
scale_y_continuous(sec.axis = sec_axis(~ . / num.countries,
labels = percent_format(accuracy = 1)),
expand = c(0, 0)) +
scale_colour_manual(values = c("black", "grey80"), name = NULL) +
guides(color = guide_legend(nrow = 1)) +
labs(x = NULL, y = "Number of countries") +
theme_donors() +
theme(legend.justification = "left") +
facet_wrap(~ barrier_group)
df.csre.plot <- df.country.aid %>%
left_join(autocracies, by = "cowcode") %>%
group_by(year, autocracy) %>%
nest() %>%
mutate(cis = data %>% map(~ mean_cl_normal(.$csre))) %>%
unnest(cis) %>%
mutate(fake_facet_title = "Civil society regulatory environment",
autocracy = factor(autocracy,
labels = c("Democracy (Polity IV ≥ 6)",
"Non-democracy (Polity IV < 6)"),
ordered = TRUE))
fig.csre <- ggplot(df.csre.plot, aes(x = year, y = y)) +
geom_ribbon(aes(ymin = ymin, ymax = ymax, fill = autocracy), alpha = 0.2) +
geom_line(aes(color = autocracy), size = 0.5) +
annotate(geom = "text", x = 2013, y = -2.2, hjust = "right", size = 1.8,
label = "Larger values = more open civil society") +
scale_colour_manual(values = c("black", "grey75"), name = NULL) +
scale_fill_manual(values = c("black", "grey75"), name = NULL) +
scale_linetype_manual(values = c("solid", "solid", "21")) +
labs(y = "Average CSRE", x = NULL) +
theme_donors() +
theme(legend.justification = "left") +
facet_wrap(~ fake_facet_title)
barriers_summary <-
((dcjw_entry_plot + dcjw_funding_plot) /
(dcjw_advocacy_plot + fig.csre)) &
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"))
barriers_summary
Compulsory vs. burdensome registration
Laws requiring NGO registration aren’t necessarily a sign of oppression—even the US requires that nonprofits that earn above a certain threshold register as 501(c)(3) organizations. Though the figure below shows that compulsory regulation have increased over time, actual restriction has occurred too. Burdensome registration is not just another standard layer of bureaucracy.
df.regulation <- df.country.aid %>%
left_join(autocracies, by = "cowcode") %>%
group_by(year, autocracy) %>%
summarise(`Registration required` = sum(ngo_register) / n(),
`Registration burdensome` = sum(ngo_register_burden) / n()) %>%
gather(type.of.law, value, -year, -autocracy) %>%
mutate(autocracy =
factor(autocracy, levels = c(TRUE, FALSE),
labels = c("Non-democracies", "Democracies")))
fig.regulation.burden <- ggplot(df.regulation,
aes(x = year, y = value, colour = type.of.law)) +
geom_line(size = 0.5) +
scale_y_continuous(labels = percent_format(accuracy = 1)) +
scale_x_continuous(expand = c(0, 0)) +
coord_cartesian(ylim = c(0, 0.7), xlim = c(1980, 2015)) +
scale_colour_manual(values = burden.colors) +
guides(colour = guide_legend(title = NULL)) +
labs(x = NULL, y = "Proportion of countries\nwith regulation") +
theme_donors() +
facet_wrap(~ autocracy)
fig.regulation.burden
Aid
Aid over time, by donor type
Aid over time, by contentiousness
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(
~key, ~key.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_log_next_year", "Total ODA", "H1",
"prop.contentious_logit_next_year", "Contentious aid", "H2",
"prop.ngo.dom_logit_next_year", "Aid to domestic NGOs", "H3",
"prop.ngo.foreign_logit_next_year", "Aid to foreign NGOs", "H3"
)
Restrictions and ODA (H1)
df.plot.barriers.oda <- df.country.aid %>%
select(year, cowcode, country.name, total.oda_log_next_year,
one_of(dvs.clean.names$key)) %>%
gather(key, value, one_of(dvs.clean.names$key)) %>%
filter(!is.na(total.oda_log_next_year), !is.na(value)) %>%
mutate(total.oda.transformed = expm1(total.oda_log_next_year)) %>%
left_join(dvs.clean.names, by = "key") %>%
mutate(key.clean = fct_inorder(key.clean, ordered = TRUE))
ggplot(df.plot.barriers.oda,
aes(x = value, y = total.oda.transformed, color = key.clean)) +
geom_point(alpha = 0.5) +
stat_smooth(method = "lm") +
stat_smooth(data = filter(df.plot.barriers.oda,
total.oda.transformed > 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() +
theme(strip.text.x = element_text(margin = margin(t = 1, b = 1))) +
facet_wrap(~ key.clean, scales = "free_x", nrow = 2)
Restrictions and contentiousness (H2)
df.plot.barriers.contention <- df.country.aid %>%
select(year, cowcode, country.name, prop.contentious_logit_next_year,
one_of(dvs.clean.names$key)) %>%
gather(key, value, one_of(dvs.clean.names$key)) %>%
filter(!is.na(prop.contentious_logit_next_year), !is.na(value)) %>%
mutate(prop.contentious.transformed =
inv.logit(prop.contentious_logit_next_year, a = 0.001)) %>%
left_join(dvs.clean.names, by = "key") %>%
mutate(key.clean = fct_inorder(key.clean, ordered = TRUE))
ggplot(df.plot.barriers.contention,
aes(x = value, y = prop.contentious.transformed, color = key.clean)) +
geom_point(alpha = 0.5) +
stat_smooth(method = "lm") +
stat_smooth(data = filter(df.plot.barriers.contention,
prop.contentious.transformed > 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() +
theme(strip.text.x = element_text(margin = margin(t = 1, b = 1))) +
facet_wrap(~ key.clean, scales = "free_x", nrow = 2)
Restrictions and NGOs (H3)
df.plot.barriers.ngos <- df.country.aid %>%
select(year, cowcode, country.name,
prop.ngo.dom_logit_next_year, prop.ngo.foreign_logit_next_year,
one_of(dvs.clean.names$key)) %>%
gather(barrier, value, one_of(dvs.clean.names$key)) %>%
gather(variable, prop.ngo, prop.ngo.dom_logit_next_year,
prop.ngo.foreign_logit_next_year) %>%
filter(!is.na(prop.ngo)) %>%
mutate(prop.ngo.transformed = inv.logit(prop.ngo, a = 0.001)) %>%
left_join(dvs.clean.names, by = c("barrier" = "key")) %>%
left_join(ivs.clean.names, by = "variable") %>%
mutate(key.clean = fct_inorder(key.clean, ordered = TRUE))
ggplot(df.plot.barriers.ngos,
aes(x = value, y = prop.ngo.transformed, color = key.clean)) +
geom_point(alpha = 0.5) +
stat_smooth(method = "lm") +
stat_smooth(data = filter(df.plot.barriers.ngos,
prop.ngo.transformed > 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() +
theme(strip.text.x = element_text(margin = margin(t = 1, b = 1))) +
facet_wrap(~ variable.clean + key.clean, scales = "free_x", ncol = 4)
CSRE and all DVs (all hypotheses)
df.plot.csre.ngos <- df.country.aid %>%
select(year, cowcode, country.name,
prop.contentious_logit_next_year, total.oda_log_next_year,
prop.ngo.dom_logit_next_year, prop.ngo.foreign_logit_next_year,
csre) %>%
gather(variable, value, -c(year, cowcode, country.name, csre)) %>%
filter(!is.na(value)) %>%
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)) %>%
mutate(value.transformed = case_when(
.$hypothesis == "H1" ~ expm1(.$value),
.$hypothesis == "H2" ~ inv.logit(.$value, a = 0.001),
.$hypothesis == "H3" ~ inv.logit(.$value, a = 0.001),
))
ggplot(df.plot.csre.ngos,
aes(x = csre, y = value.transformed, color = hypothesis)) +
geom_point(alpha = 0.25) +
scale_color_viridis_d(option = "plasma", end = 0.9) +
guides(color = FALSE) +
labs(x = "Civil society regulatory environment",
y = "Variable value in next year",
title = "Civil society regulatory environment") +
theme_donors() +
facet_wrap(~ hypothesis.clean, scales = "free_y")
CIVICUS restrictions
civicus <- read_csv(here("data", "data_raw", "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"))
# Robinson projection
projection = 54030
world_shapes <- st_read(file.path("data", "data_raw", "ne_110m_admin_0_countries",
"ne_110m_admin_0_countries.shp"),
quiet = TRUE) %>%
filter(ISO_A3 != "ATA")
Open |
26 |
Narrowed |
64 |
Obstructed |
50 |
Repressed |
35 |
Closed |
20 |
map_with_civicus <- world_shapes %>%
# 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",
TRUE ~ ISO_A3
)) %>%
left_join(civicus, 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), datum = NA) +
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
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 %>%
distinct(country.name) %>%
arrange(country.name) %>%
pull(country.name)
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 = 140) {#tbl:countries}
Afghanistan |
Dominican Republic |
Lesotho |
Rwanda |
Albania |
Ecuador |
Liberia |
Saudi Arabia |
Algeria |
Egypt |
Lithuania |
Senegal |
Angola |
El Salvador |
Macedonia |
Serbia |
Argentina |
Equatorial Guinea |
Madagascar |
Sierra Leone |
Armenia |
Eritrea |
Malawi |
Singapore |
Azerbaijan |
Estonia |
Malaysia |
Slovakia |
Bahrain |
Ethiopia |
Mali |
Slovenia |
Bangladesh |
Fiji |
Mauritania |
Solomon Islands |
Belarus |
Gabon |
Mauritius |
South Africa |
Benin |
Gambia |
Mexico |
South Korea |
Bhutan |
Georgia |
Moldova |
Sri Lanka |
Bolivia |
Ghana |
Mongolia |
Sudan |
Bosnia & Herzegovina |
Guatemala |
Montenegro |
Swaziland |
Botswana |
Guinea |
Morocco |
Syria |
Brazil |
Guinea-Bissau |
Mozambique |
Taiwan |
Bulgaria |
Guyana |
Myanmar (Burma) |
Tajikistan |
Burkina Faso |
Haiti |
Namibia |
Tanzania |
Burundi |
Honduras |
Nepal |
Thailand |
Cambodia |
Hungary |
Nicaragua |
Timor-Leste |
Cameroon |
India |
Niger |
Togo |
Central African Republic |
Indonesia |
Nigeria |
Trinidad & Tobago |
Chad |
Iran |
North Korea |
Tunisia |
Chile |
Iraq |
Oman |
Turkey |
China |
Israel |
Pakistan |
Turkmenistan |
Colombia |
Jamaica |
Panama |
Uganda |
Comoros |
Jordan |
Papua New Guinea |
Ukraine |
Congo - Brazzaville |
Kazakhstan |
Paraguay |
United Arab Emirates |
Congo - Kinshasa |
Kenya |
Peru |
Uruguay |
Costa Rica |
Kosovo |
Philippines |
Uzbekistan |
Côte d’Ivoire |
Kuwait |
Poland |
Venezuela |
Croatia |
Kyrgyzstan |
Portugal |
Vietnam |
Cuba |
Laos |
Qatar |
Yemen |
Cyprus |
Latvia |
Romania |
Zambia |
Czechia |
Lebanon |
Russia |
Zimbabwe |
LS0tCnRpdGxlOiAiTm9uLW1vZGVsIGFuYWx5c2lzIgphdXRob3I6ICJTdXBhcm5hIENoYXVkaHJ5IGFuZCBBbmRyZXcgSGVpc3MiCmRhdGU6ICJgciBmb3JtYXQoU3lzLnRpbWUoKSwgJyVGJylgIgpvdXRwdXQ6IAogIGh0bWxfZG9jdW1lbnQ6CiAgICBjb2RlX2ZvbGRpbmc6IGhpZGUKZWRpdG9yX29wdGlvbnM6IAogIGNodW5rX291dHB1dF90eXBlOiBjb25zb2xlCi0tLQoKYGBge3IgbG9hZC1saWJyYXJpZXMsIG1lc3NhZ2U9RkFMU0V9CmtuaXRyOjpvcHRzX2NodW5rJHNldChmaWcucmV0aW5hID0gMiwKICAgICAgICAgICAgICAgICAgICAgIHRpZHkub3B0cyA9IGxpc3Qod2lkdGguY3V0b2ZmID0gMTIwKSwgICMgRm9yIGNvZGUKICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnMod2lkdGggPSAxMjApKSAgIyBGb3Igb3V0cHV0CgpsaWJyYXJ5KHRpZHl2ZXJzZSkKbGlicmFyeShzdHJpbmdyKQpsaWJyYXJ5KGZvcmNhdHMpCmxpYnJhcnkoc2NhbGVzKQpsaWJyYXJ5KHBhdGNod29yaykKbGlicmFyeShjb3VudHJ5Y29kZSkKbGlicmFyeShzZikKbGlicmFyeShoZXJlKQoKc291cmNlKGhlcmUoImxpYiIsICJncmFwaGljcy5SIikpCnNvdXJjZShoZXJlKCJsaWIiLCAicGFuZG9jLlIiKSkKc291cmNlKGhlcmUoImxpYiIsICJiYXllcy5SIikpCgpteS5zZWVkIDwtIDEyMzQKc2V0LnNlZWQobXkuc2VlZCkKYGBgCgpgYGB7ciBsb2FkLWRhdGEsIGNhY2hlPVRSVUUsIG1lc3NhZ2U9RkFMU0V9CmRmLmRvbm9yIDwtIHJlYWRSRFMoaGVyZSgiRGF0YSIsICJkYXRhX2NsZWFuIiwgImRmX2Rvbm9yLnJkcyIpKQpkZi5kb25vci51cyA8LSByZWFkUkRTKGhlcmUoIkRhdGEiLCAiZGF0YV9jbGVhbiIsICJkZl9kb25vcl91c2FpZC5yZHMiKSkKZGYuY291bnRyeS5haWQgPC0gcmVhZFJEUyhoZXJlKCJEYXRhIiwgImRhdGFfY2xlYW4iLCAiZGZfY291bnRyeV9haWRfbm9faW1wdXRhdGlvbi5yZHMiKSkKCmRjancucXVlc3Rpb25zLmNsZWFuIDwtIHJlYWRfY3N2KGhlcmUoIkRhdGEiLCAiZGF0YV9tYW51YWwiLCAiZGNqd19xdWVzdGlvbnMuY3N2IikpCmRjancucmVzcG9uc2VzLmNsZWFuIDwtIHJlYWRfY3N2KGhlcmUoIkRhdGEiLCAiZGF0YV9tYW51YWwiLCAiZGNqd19yZXNwb25zZXMuY3N2IikpCgphdXRvY3JhY2llcyA8LSBkZi5jb3VudHJ5LmFpZCAlPiUKICBncm91cF9ieShjb3djb2RlKSAlPiUKICBzdW1tYXJpc2UocG9saXR5LmF2ZyA9IG1lYW4ocG9saXR5LCBuYS5ybSA9IFRSVUUpKSAlPiUKICBtdXRhdGUoYXV0b2NyYWN5ID0gcG9saXR5LmF2ZyA8IDYpICU+JQogICMgVGhlc2UgY291bnRyaWVzIGFyZSBtaXNzaW5nIHBvbGl0eSBzY29yZXMKICBtdXRhdGUoYXV0b2NyYWN5ID0gY2FzZV93aGVuKAogICAgIyBFcXVhdG9yaWFsIEd1aW5lYSwgS3V3YWl0LCBCYWhyYWluLCBVQUUsIE9tYW4sIFNpbmdhcG9yZQogICAgLiRjb3djb2RlICVpbiUgYyg0MTEsIDY5MCwgNjkyLCA2OTYsIDY5OCwgODMwKSB+IFRSVUUsCiAgICAjIFNlcmJpYSwgS29zb3ZvCiAgICAuJGNvd2NvZGUgJWluJSBjKDM0MCwgMzQ3KSB+IEZBTFNFLAogICAgVFJVRSB+IC4kYXV0b2NyYWN5CiAgKSkKYGBgCgojIyBPdmVyYWxsIGRhdGEgc3VtbWFyeQoKYGBge3IgZGF0YS1zdW1tYXJ5fQpudW0uY291bnRyaWVzIDwtIGRmLmNvdW50cnkuYWlkICU+JSBkaXN0aW5jdChjb3djb2RlKSAlPiUgbnJvdygpCm51bS55ZWFycyA8LSBkZi5jb3VudHJ5LmFpZCAlPiUgZGlzdGluY3QoeWVhcikgJT4lIG5yb3coKQp5ZWFyLmZpcnN0IDwtIGRmLmNvdW50cnkuYWlkICU+JSBkaXN0aW5jdCh5ZWFyKSAlPiUgbWluKCkKeWVhci5sYXN0IDwtIGRmLmNvdW50cnkuYWlkICU+JSBkaXN0aW5jdCh5ZWFyKSAlPiUgbWF4KCkKYGBgCgpPdXIgZGF0YSBpbmNsdWRlcyBpbmZvcm1hdGlvbiBhYm91dCBgciBudW0uY291bnRyaWVzYCBjb3VudHJpZXMgYWNyb3NzIGByIG51bS55ZWFyc2AgeWVhcnMgKGZyb20gYHIgeWVhci5maXJzdGDigJNgciB5ZWFyLmxhc3RgKQoKCiMjIFN1bW1hcnkgb2YgdmFyaWFibGVzIGluIG1vZGVsCgpUaGUgdmFsdWVzIGhlcmUgYXJlIHNsaWdodGx5IGRpZmZlcmVudCBmcm9tIHdoYXQgd2UgaGFkIGF0IElTQSBhbmQgTVBTQSAoYW5kIG91ciBJU1Egc3VibWlzc2lvbikgYmVjYXVzZSB3ZSdyZSBub3cgdXNpbmcgVi1EZW0gOC4wIGFuZCBBaWREYXRhIDMuMS4gCgpgYGB7ciBzdW1tYXJ5LXZhcnMtbW9kZWwsIHJlc3VsdHM9ImFzaXMiLCBtZXNzYWdlPUZBTFNFfQpjb2VmLm5hbWVzIDwtIHJlYWRfY3N2KGhlcmUoIkRhdGEiLCAiZGF0YV9tYW51YWwiLCAiY29lZl9uYW1lcy5jc3YiKSkKCnZhcnMudG8uc3VtbWFyaXplIDwtIGNvZWYubmFtZXMgJT4lCiAgZmlsdGVyKHN1bW1hcml6ZSA9PSBUUlVFKQoKdmFycy5zdW1tYXJpemVkIDwtIGRmLmNvdW50cnkuYWlkICU+JQogIHNlbGVjdChvbmVfb2YodmFycy50by5zdW1tYXJpemUkdGVybSkpICU+JQogIG11dGF0ZSh0cmFkZS5wY3QuZ2RwID0gdHJhZGUucGN0LmdkcCAvIDEwMCwgICMgVGhpcyBpcyBzY2FsZWQgdXAgZm9yIG1vZGVsaW5nCiAgICAgICAgIHRvdGFsLm9kYSA9IHRvdGFsLm9kYSAvIDEwMDAwMDApICU+JQogIGdhdGhlcih0ZXJtLCB2YWx1ZSkgJT4lCiAgZmlsdGVyKCFpcy5uYSh2YWx1ZSkpICU+JSAKICBncm91cF9ieSh0ZXJtKSAlPiUKICBzdW1tYXJpemUoTiA9IG4oKSwKICAgICAgICAgICAgTWVhbiA9IG1lYW4odmFsdWUpLAogICAgICAgICAgICBNZWRpYW4gPSBtZWRpYW4odmFsdWUpLAogICAgICAgICAgICBgU3RkLiBEZXYuYCA9IHNkKHZhbHVlKSwKICAgICAgICAgICAgTWluID0gbWluKHZhbHVlKSwKICAgICAgICAgICAgTWF4ID0gbWF4KHZhbHVlKSkgJT4lIAogIGxlZnRfam9pbih2YXJzLnRvLnN1bW1hcml6ZSwgYnkgPSAidGVybSIpICU+JQogIGFycmFuZ2Uoc3VtbWFyeV9vcmRlcikgJT4lCiAgc2VsZWN0KFZhcmlhYmxlID0gdGVybV9jbGVhbl90YWJsZSwgU291cmNlID0gc291cmNlLCAKICAgICAgICAgTWVhbiwgYFN0ZC4gRGV2LmAsIE1lZGlhbiwgTWluLCBNYXgsIE4pICU+JQogIGFzLmRhdGEuZnJhbWUoKQoKY2FwdGlvbiA8LSAiU3VtbWFyeSBvZiBhbGwgdmFyaWFibGVzIGluY2x1ZGVkIGluIG1vZGVscyB7I3RibDp2YXItc3VtbWFyeX0iCnZhci5zdW1tYXJ5IDwtIHBhbmRvYy50YWJsZS5yZXR1cm4odmFycy5zdW1tYXJpemVkLCBrZWVwLmxpbmUuYnJlYWtzID0gVFJVRSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm91bmQgPSAyLCBiaWcubWFyayA9ICIsIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqdXN0aWZ5ID0gImxsY2NjY2NjIiwgY2FwdGlvbiA9IGNhcHRpb24sIHN0eWxlID0gIm11bHRpbGluZSIpCgpjYXQodmFyLnN1bW1hcnkpCmNhdCh2YXIuc3VtbWFyeSwgZmlsZSA9IGhlcmUoIk91dHB1dCIsICJ0YmwtdmFyLXN1bW1hcnkubWQiKSkKYGBgCgoKIyMgQWlkIHN0dWZmCgojIyMgT3ZlcmFsbCBPRUNEIGFpZAoKYGBge3Igc3VtbWFyaXplLW9lY2QtYWlkfQpkZi5jb3VudHJ5LmFpZCAlPiUKICBzdW1tYXJpc2UodG90YWwgPSBkb2xsYXIoc3VtKHRvdGFsLm9kYSkpKSAlPiUgCiAgcHVsbCh0b3RhbCkgLT4gdG90YWwub2VjZC5haWQKYGBgCgpPRUNEIG1lbWJlcnMgZG9uYXRlZCBgciB0b3RhbC5vZWNkLmFpZGAgYmV0d2VlbiAxOTgxIGFuZCAyMDEzLgoKYGBge3IgcGxvdC1vZWNkLWFpZH0KcGxvdC5haWQgPC0gZGYuY291bnRyeS5haWQgJT4lCiAgZ3JvdXBfYnkoeWVhcikgJT4lCiAgc3VtbWFyaXNlKHRvdGFsID0gc3VtKHRvdGFsLm9kYSkpICU+JSAKICBtdXRhdGUoZmFrZV9mYWNldF90aXRsZSA9ICJPREEgY29tbWl0bWVudHMgKGFsbCBPRUNEKSIpCgpmaWcub2VjZC5haWQgPC0gZ2dwbG90KHBsb3QuYWlkLCBhZXMoeCA9IHllYXIsIHkgPSAodG90YWwgLyAxMDAwMDAwMDAwKSkpICsgCiAgZ2VvbV9saW5lKHNpemUgPSAwLjUpICsKICBsYWJzKHggPSBOVUxMLCB5ID0gIkJpbGxpb25zIG9mIFVTRCIpICsKICBzY2FsZV95X2NvbnRpbnVvdXMobGFiZWxzID0gZG9sbGFyKSArCiAgdGhlbWVfZG9ub3JzKCkgKyAKICBmYWNldF93cmFwKH4gZmFrZV9mYWNldF90aXRsZSkKZmlnLm9lY2QuYWlkCmBgYAoKIyMjIFByb3BvcnRpb24gb2YgY29udGVudGlvdXMgdnMuIG5vbmNvbnRlbnRpb3VzIGFpZAoKYGBge3Igc3VtbWFyaXplLWNvbnRlbnRpb3VzLWFpZCwgcmVzdWx0cz0iYXNpcyJ9CmRmLmRvbm9yICU+JQogIGZpbHRlcih5ZWFyID4gMTk4MCkgJT4lCiAgZ3JvdXBfYnkocHVycG9zZS5jb250ZW50aW91c25lc3MpICU+JQogIHN1bW1hcmlzZSh0b3RhbCA9IHN1bShvZGEpKSAlPiUKICBtdXRhdGUocGVyYyA9IHRvdGFsIC8gc3VtKHRvdGFsKSkgJT4lCiAgbXV0YXRlKHRvdGFsID0gZG9sbGFyKHRvdGFsKSwgcGVyYyA9IHBlcmNlbnQocGVyYykpICU+JSAKICBwYW5kb2MudGFibGUoKQpgYGAKCmBgYHtyIHBsb3QtY29udGVudGlvdXMtYWlkfQpwbG90LmFpZC5jb250ZW50aW91c25lc3MgPC0gZGYuZG9ub3IgJT4lCiAgZmlsdGVyKHllYXIgPiAxOTgwKSAlPiUKICBncm91cF9ieSh5ZWFyLCBwdXJwb3NlLmNvbnRlbnRpb3VzbmVzcykgJT4lCiAgc3VtbWFyaXNlKHRvdGFsID0gc3VtKG9kYSkpICU+JQogIG11dGF0ZShwZXJjID0gdG90YWwgLyBzdW0odG90YWwpKSAlPiUKICBmaWx0ZXIocHVycG9zZS5jb250ZW50aW91c25lc3MgPT0gIkhpZ2giKSAlPiUgCiAgbXV0YXRlKGZha2VfZmFjZXRfdGl0bGUgPSAiQ29udGVudGlvdXMgYWlkIChhbGwgT0VDRCkiKQoKZmlnLm9lY2QuY29udGVudGlvbiA8LSBnZ3Bsb3QocGxvdC5haWQuY29udGVudGlvdXNuZXNzLCBhZXMoeCA9IHllYXIsIHkgPSBwZXJjKSkgKyAKICBnZW9tX2xpbmUoc2l6ZSA9IDAuNSkgKwogIHNjYWxlX3lfY29udGludW91cyhsYWJlbHMgPSBwZXJjZW50X2Zvcm1hdChhY2N1cmFjeSA9IDEpKSArIAogIGxhYnMoeCA9IE5VTEwsIHkgPSAiUGVyY2VudCIpICsKICB0aGVtZV9kb25vcnMoKSArCiAgZmFjZXRfd3JhcCh+IGZha2VfZmFjZXRfdGl0bGUpCmZpZy5vZWNkLmNvbnRlbnRpb24KYGBgCgojIyMgVVNBSUQgYWlkCgpgYGB7ciBzdW1tYXJpemUtdXMtYWlkfQpkZi5jb3VudHJ5LmFpZCAlPiUKICBzdW1tYXJpc2UodG90YWwgPSBkb2xsYXIoc3VtKG9kYS51cykpKSAlPiUgCiAgcHVsbCh0b3RhbCkgLT4gdG90YWwudXMuYWlkCgpkZi5jb3VudHJ5LmFpZCAlPiUKICBmaWx0ZXIoeWVhciA+IDE5OTkpICU+JQogIHN1bW1hcmlzZSh0b3RhbCA9IGRvbGxhcihzdW0ob2RhLnVzKSkpICU+JSAKICBwdWxsKHRvdGFsKSAtPiB0b3RhbC51cy5haWQucG9zdC4yMDAwCmBgYAoKVGhlIFVTIGRvbmF0ZWQgYHIgdG90YWwudXMuYWlkYCBiZXR3ZWVuIDE5ODEgYW5kIDIwMTMgYW5kIGByIHRvdGFsLnVzLmFpZC5wb3N0LjIwMDBgIGJldHdlZW4gMjAwMCBhbmQgMjAxMy4KCmBgYHtyIHBsb3QtdXMtYWlkfQpwbG90LmFpZC51cyA8LSBkZi5jb3VudHJ5LmFpZCAlPiUKICBncm91cF9ieSh5ZWFyKSAlPiUKICBzdW1tYXJpc2UodG90YWwgPSBzdW0ob2RhLnVzKSkgJT4lIAogIG11dGF0ZShmYWtlX2ZhY2V0X3RpdGxlID0gIk9EQSBjb21taXRtZW50cyAoVVNBSUQgb25seSkiKQoKZmlnLnVzLmFpZCA8LSBnZ3Bsb3QocGxvdC5haWQudXMsIGFlcyh4ID0geWVhciwgeSA9ICh0b3RhbCAvIDEwMDAwMDAwMDApKSkgKyAKICBnZW9tX2xpbmUoc2l6ZSA9IDAuNSkgKwogIGV4cGFuZF9saW1pdHMoeSA9IDApICsKICBsYWJzKHggPSBOVUxMLCB5ID0gIkJpbGxpb25zIG9mIFVTRCIpICsKICBzY2FsZV95X2NvbnRpbnVvdXMobGFiZWxzID0gZG9sbGFyKSArCiAgdGhlbWVfZG9ub3JzKCkgKwogIGZhY2V0X3dyYXAofiBmYWtlX2ZhY2V0X3RpdGxlKQpmaWcudXMuYWlkCmBgYAoKIyMjIFByb3BvcnRpb24gb2YgVVMgYWlkIHRvIHR5cGVzIG9mIE5HT3MKClRvdGFsIGFtb3VudHMgb3ZlciB0aW1lOgoKYGBge3Igc3VtbWFyaXplLWFpZC1jaGFubmVscywgcmVzdWx0cz0iYXNpcyJ9CnVzYWlkLnRvdGFsIDwtIGRmLmNvdW50cnkuYWlkICU+JSBzdW1tYXJpc2UodG90YWwgPSBzdW0ob2RhLnVzKSkgJT4lIHB1bGwodG90YWwpCgpkZi5jb3VudHJ5LmFpZCAlPiUKICBnYXRoZXIoY2hhbm5lbCwgdG90YWwub2RhLnVzLCBjKG9kYS51cy5uZ28uZG9tLCBvZGEudXMubmdvLmludCwgb2RhLnVzLm5nby51cykpICU+JQogIGdyb3VwX2J5KGNoYW5uZWwpICU+JQogIHN1bW1hcmlzZSh0b3RhbCA9IHN1bSh0b3RhbC5vZGEudXMpKSAlPiUKICBtdXRhdGUocGVyYyA9IHRvdGFsIC8gdXNhaWQudG90YWwpICU+JQogIG11dGF0ZSh0b3RhbCA9IGRvbGxhcih0b3RhbCksIHBlcmMgPSBwZXJjZW50KHBlcmMpKSAlPiUgCiAgcGFuZG9jLnRhYmxlKCkKYGBgCgpUaGUgVVMgY2xlYXJseSBmYXZvcnMgVVMtYmFzZWQgTkdPcyBvciBpbnRlcm5hdGlvbmFsIE5HT3Mgb3ZlciBkb21lc3RpYyBOR09zLgoKYGBge3IgcGxvdC1haWQtY2hhbm5lbHN9CnVzYWlkLnRvdGFsLnllYXJseSA8LSBkZi5jb3VudHJ5LmFpZCAlPiUKICBncm91cF9ieSh5ZWFyKSAlPiUKICBzdW1tYXJpc2UoYW5udWFsLnRvdGFsID0gc3VtKG9kYS51cykpICU+JSAKICBtdXRhdGUoZmFrZV9mYWNldF90aXRsZSA9ICJVU0FJRCBPREEgY2hhbm5lbGVkIHRocm91Z2ggTkdPcyIpCgpjaGFubmVscy5uaWNlIDwtIHRyaWJibGUoCiAgfmNoYW5uZWwsICAgICAgICAgfmNoYW5uZWwuY2xlYW4sCiAgIm9kYS51cy5uZ28uZG9tIiwgIkRvbWVzdGljIE5HT3MiLAogICJvZGEudXMubmdvLmludCIsICJJbnRlcm5hdGlvbmFsIE5HT3MiLAogICJvZGEudXMubmdvLnVzIiwgICJVUy1iYXNlZCBOR09zIgopCgpwbG90LnVzYWlkLmNoYW5uZWwgPC0gZGYuY291bnRyeS5haWQgJT4lCiAgZ2F0aGVyKGNoYW5uZWwsIHRvdGFsLm9kYS51cywgYyhvZGEudXMubmdvLmRvbSwgb2RhLnVzLm5nby5pbnQsIG9kYS51cy5uZ28udXMpKSAlPiUKICBncm91cF9ieSh5ZWFyLCBjaGFubmVsKSAlPiUKICBzdW1tYXJpc2UodG90YWwgPSBzdW0odG90YWwub2RhLnVzKSkgJT4lCiAgbGVmdF9qb2luKHVzYWlkLnRvdGFsLnllYXJseSwgYnkgPSAieWVhciIpICU+JQogIG11dGF0ZShwZXJjID0gdG90YWwgLyBhbm51YWwudG90YWwpICU+JQogIGxlZnRfam9pbihjaGFubmVscy5uaWNlLCBieSA9ICJjaGFubmVsIikKCmZpZy51c2FpZC5jaGFubmVsIDwtIGdncGxvdChwbG90LnVzYWlkLmNoYW5uZWwsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgYWVzKHggPSB5ZWFyLCB5ID0gcGVyYywgY29sb3VyID0gY2hhbm5lbC5jbGVhbikpICsgCiAgZ2VvbV9saW5lKHNpemUgPSAwLjUpICsKICBzY2FsZV95X2NvbnRpbnVvdXMobGFiZWxzID0gcGVyY2VudF9mb3JtYXQoYWNjdXJhY3kgPSAxKSkgKyAKICBzY2FsZV9jb2xvdXJfbWFudWFsKHZhbHVlcyA9IGNoYW5uZWwuY29sb3JzKSArCiAgbGFicyh4ID0gTlVMTCwgeSA9ICJQZXJjZW50IikgKwogIGd1aWRlcyhjb2xvdXIgPSBndWlkZV9sZWdlbmQodGl0bGUgPSBOVUxMLCByZXZlcnNlID0gVFJVRSwgbnJvdyA9IDIpKSArCiAgdGhlbWVfZG9ub3JzKCkgKyAKICBmYWNldF93cmFwKH4gZmFrZV9mYWNldF90aXRsZSkKZmlnLnVzYWlkLmNoYW5uZWwKYGBgCgpVU0FJRCBkYXRhIGNhdGVnb3JpemVzIGFsbCBhaWQgYXMgZ292ZXJubWVudC1jaGFubmVsZWQgYmVmb3JlIDIwMDAgYmVjYXVzZSBvZiBzb21lIHF1aXJrIGluIHRoZSBkYXRhLgoKYGBge3IgcGxvdC1hbGwtY2hhbm5lbHN9CnBsb3QudXNhaWQuY2hhbm5lbHMuYWxsIDwtIGRmLmRvbm9yLnVzICU+JQogIGdyb3VwX2J5KHllYXIsIGNoYW5uZWxfc3ViY2F0ZWdvcnlfbmFtZSkgJT4lCiAgc3VtbWFyaXNlKHRvdGFsID0gc3VtKG9kYS51cy4yMDExKSkgJT4lCiAgbXV0YXRlKHBlcmMgPSB0b3RhbCAvIHN1bSh0b3RhbCkpICU+JQogIG11dGF0ZShjaGFubmVsID0gaWZlbHNlKHN0cl9kZXRlY3QoY2hhbm5lbF9zdWJjYXRlZ29yeV9uYW1lLCAiTkdPIiksICJOR08iLCAiT3RoZXIiKSkKCmdncGxvdChwbG90LnVzYWlkLmNoYW5uZWxzLmFsbCwgCiAgICAgICBhZXMoeCA9IHllYXIsIHkgPSBwZXJjLCBjb2xvdXIgPSBjaGFubmVsX3N1YmNhdGVnb3J5X25hbWUpKSArIAogIGdlb21fbGluZShzaXplID0gMC41KSArCiAgc2NhbGVfeV9jb250aW51b3VzKGxhYmVscyA9IHBlcmNlbnRfZm9ybWF0KGFjY3VyYWN5ID0gMSkpICsgCiAgbGFicyh4ID0gTlVMTCwgeSA9ICJQZXJjZW50IG9mIFVTIGFpZCBnaXZlbiB0aHJvdWdoIGRpZmZlcmVudCBjaGFubmVscyIpICsKICBndWlkZXMoY29sb3VyID0gZ3VpZGVfbGVnZW5kKHRpdGxlID0gTlVMTCkpICsKICB0aGVtZV9kb25vcnMoKQpgYGAKClNvIHdlIGp1c3QgbG9vayBhdCBhaWQgYWZ0ZXIgMjAwMC4KCmBgYHtyIHBsb3QtY2hhbm5lbHMtcG9zdC0yMDAwfQpmaWcudXNhaWQuY2hhbm5lbC50cmltbWVkIDwtIGZpZy51c2FpZC5jaGFubmVsICsKICBjb29yZF9jYXJ0ZXNpYW4oeGxpbSA9IGMoMjAwMCwgMjAxMykpCmZpZy51c2FpZC5jaGFubmVsLnRyaW1tZWQKYGBgCgojIyMgQWxsIERWIGZpZ3VyZXMgY29tYmluZWQKCmBgYHtyIHBsb3QtYWxsLWR2cywgZmlnLndpZHRoPTUuNSwgZmlnLmhlaWdodD0zLjc1fQpmaWcuZHZzIDwtIChmaWcub2VjZC5haWQgKyBmaWcub2VjZC5jb250ZW50aW9uKSAvIAogIChmaWcudXMuYWlkICsgZmlnLnVzYWlkLmNoYW5uZWwudHJpbW1lZCkgJgogIHRoZW1lKGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSByZWwoMC42KSksCiAgICAgICAgYXhpcy50aXRsZS55ID0gZWxlbWVudF90ZXh0KG1hcmdpbiA9IG1hcmdpbihyID0gMykpLAogICAgICAgIGxlZ2VuZC5ib3gubWFyZ2luID0gbWFyZ2luKHQgPSAtMC41LCB1bml0ID0gImxpbmVzIikpCgpmaWcuZHZzCmZpZy5zYXZlLmNhaXJvKGZpZy5kdnMsIGZpbGVuYW1lID0gImZpZy1kdnMiLCAKICAgICAgICAgICAgICAgd2lkdGggPSA1LjUsIGhlaWdodCA9IDMuNzUpCmBgYAoKCiMjIExlZ2FsIHJlc3RyaWN0aW9ucyBvbiBOR09zCgojIyMgRENKVyBpbmRleGVzCgpgYGB7ciBkY2p3LWluZGV4LXRhYmxlLCByZXN1bHRzPSJhc2lzIiwgbWVzc2FnZT1GQUxTRX0KZGNqdy5pbmRleGVzIDwtIHJlYWRfY3N2KGhlcmUoIkRhdGEiLCAiZGF0YV9tYW51YWwiLCAiZGNqd19pbmRleC5jc3YiKSkgJT4lCiAgbXV0YXRlKExhd3MgPSBzdHJfcmVwbGFjZV9hbGwoTGF3cywgIlxuIiwgIlxuXG4iKSkKCmNhcHRpb24gPC0gIkRlc2NyaXB0aW9uIG9mIGluZGV4ZXMgb2YgTkdPIGJhcnJpZXJzIHsjdGJsOm5nby1iYXJyaWVycy1pbmRleH0iCmRjancuaW5kZXgudGFibGUgPC0gcGFuZG9jLnRhYmxlLnJldHVybihkY2p3LmluZGV4ZXMsIGtlZXAubGluZS5icmVha3MgPSBUUlVFLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlID0gImdyaWQiLCBqdXN0aWZ5ID0gImxsbCIsIGNhcHRpb24gPSBjYXB0aW9uKQoKY2F0KGRjancuaW5kZXgudGFibGUpCmNhdChkY2p3LmluZGV4LnRhYmxlLCBmaWxlID0gaGVyZSgiT3V0cHV0IiwgInRibC1uZ28tYmFycmllcnMtaW5kZXgubWQiKSkKYGBgCgojIyMgTkdPIGJhcnJpZXJzIG92ZXIgdGltZQoKYGBge3IgYWR2b2NhY3ktbGF3cywgbWVzc2FnZT1GQUxTRSwgZmlnLndpZHRoPTUuNSwgZmlnLmhlaWdodD00LjV9CmRjancucXVlc3Rpb25zIDwtIHJlYWRfY3N2KGhlcmUoIkRhdGEiLCAiZGF0YV9tYW51YWwiLCAiZGNqd19xdWVzdGlvbnMuY3N2IikpICU+JSAKICBmaWx0ZXIoIWlnbm9yZV9pbl9pbmRleCkgJT4lIAogIHNlbGVjdChiYXJyaWVyX2dyb3VwID0gYmFycmllcl9kaXNwbGF5LCBiYXJyaWVyID0gcXVlc3Rpb25fY2xlYW4sIAogICAgICAgICBiYXJyaWVyX2Rpc3BsYXkgPSBxdWVzdGlvbl9kaXNwbGF5KSAlPiUgCiAgbXV0YXRlKGJhcnJpZXJfZ3JvdXAgPSBwYXN0ZTAoIkJhcnJpZXJzIHRvICIsIHN0cl90b19sb3dlcihiYXJyaWVyX2dyb3VwKSkpCgpkZi5iYXJyaWVycyA8LSBkZi5jb3VudHJ5LmFpZCAlPiUgCiAgZ3JvdXBfYnkoY293Y29kZSwgeWVhcikgJT4lIAogIHN1bW1hcml6ZV9hdCh2YXJzKG9uZV9vZihkY2p3LnF1ZXN0aW9ucyRiYXJyaWVyKSksIGZ1bnMoLiA+IDApKSAlPiUgCiAgZ3JvdXBfYnkoeWVhcikgJT4lIAogIHN1bW1hcml6ZV9hdCh2YXJzKC1jb3djb2RlLCAteWVhciksIGZ1bnMoc3VtKC4pKSkgJT4lIAogIGdhdGhlcihiYXJyaWVyLCB2YWx1ZSwgLXllYXIpICU+JSAKICBsZWZ0X2pvaW4oZGNqdy5xdWVzdGlvbnMsIGJ5ID0gImJhcnJpZXIiKSAlPiUgCiAgbXV0YXRlKGJhcnJpZXJfZGlzcGxheSA9IHN0cl9yZXBsYWNlKGJhcnJpZXJfZGlzcGxheSwgIlhYWCIsICJcbiIpKSAlPiUgCiAgYXJyYW5nZShkZXNjKHZhbHVlKSkgJT4lIAogIG11dGF0ZShiYXJyaWVyX2Rpc3BsYXkgPSBmY3RfaW5vcmRlcihiYXJyaWVyX2Rpc3BsYXksIG9yZGVyZWQgPSBUUlVFKSkKCmRjandfZW50cnlfcGxvdCA8LSBnZ3Bsb3QoZmlsdGVyKGRmLmJhcnJpZXJzLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFycmllcl9ncm91cCA9PSAiQmFycmllcnMgdG8gZW50cnkiKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgYWVzKHggPSB5ZWFyLCB5ID0gdmFsdWUsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvciA9IGJhcnJpZXJfZGlzcGxheSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZXR5cGUgPSBiYXJyaWVyX2Rpc3BsYXkpKSArCiAgZ2VvbV9saW5lKHNpemUgPSAwLjUpICsKICBleHBhbmRfbGltaXRzKHkgPSBjKDAsIDkwKSkgKwogIHNjYWxlX3lfY29udGludW91cyhzZWMuYXhpcyA9IHNlY19heGlzKH4gLiAvIG51bS5jb3VudHJpZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gcGVyY2VudF9mb3JtYXQoYWNjdXJhY3kgPSAxKSksCiAgICAgICAgICAgICAgICAgICAgIGV4cGFuZCA9IGMoMCwgMCkpICsKICBzY2FsZV9jb2xvdXJfbWFudWFsKHZhbHVlcyA9IGMoImJsYWNrIiwgImdyZXk4MCIsICJncmV5NTAiKSwgbmFtZSA9IE5VTEwpICsKICBzY2FsZV9saW5ldHlwZV9tYW51YWwodmFsdWVzID0gYygic29saWQiLCAic29saWQiLCAiMjEiKSwgbmFtZSA9IE5VTEwpICsKICBndWlkZXMoY29sb3IgPSBndWlkZV9sZWdlbmQobnJvdyA9IDIpKSArCiAgbGFicyh4ID0gTlVMTCwgeSA9ICJOdW1iZXIgb2YgY291bnRyaWVzIikgKwogIHRoZW1lX2Rvbm9ycygpICsgCiAgdGhlbWUobGVnZW5kLmp1c3RpZmljYXRpb24gPSAibGVmdCIpICsKICBmYWNldF93cmFwKH4gYmFycmllcl9ncm91cCkKCmRjandfZnVuZGluZ19wbG90IDwtIGdncGxvdChmaWx0ZXIoZGYuYmFycmllcnMsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhcnJpZXJfZ3JvdXAgPT0gIkJhcnJpZXJzIHRvIGZ1bmRpbmciKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZXMoeCA9IHllYXIsIHkgPSB2YWx1ZSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3IgPSBiYXJyaWVyX2Rpc3BsYXksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZXR5cGUgPSBiYXJyaWVyX2Rpc3BsYXkpKSArCiAgZ2VvbV9saW5lKHNpemUgPSAwLjUpICsKICBleHBhbmRfbGltaXRzKHkgPSBjKDAsIDQwKSkgKwogIHNjYWxlX3lfY29udGludW91cyhzZWMuYXhpcyA9IHNlY19heGlzKH4gLiAvIG51bS5jb3VudHJpZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gcGVyY2VudF9mb3JtYXQoYWNjdXJhY3kgPSAxKSksCiAgICAgICAgICAgICAgICAgICAgIGV4cGFuZCA9IGMoMCwgMCkpICsKICBzY2FsZV9jb2xvdXJfbWFudWFsKHZhbHVlcyA9IGMoImJsYWNrIiwgImdyZXk4MCIsICJncmV5NTAiLCAiYmxhY2siLCAiZ3JleTgwIiksIG5hbWUgPSBOVUxMKSArCiAgc2NhbGVfbGluZXR5cGVfbWFudWFsKHZhbHVlcyA9IGMoInNvbGlkIiwgInNvbGlkIiwgInNvbGlkIiwgIjIxIiwgIjIxIiksIG5hbWUgPSBOVUxMKSArCiAgZ3VpZGVzKGNvbG9yID0gZ3VpZGVfbGVnZW5kKG5yb3cgPSAzKSwKICAgICAgICAgbGluZXR5cGUgPSBndWlkZV9sZWdlbmQobnJvdyA9IDMpKSArCiAgbGFicyh4ID0gTlVMTCwgeSA9ICJOdW1iZXIgb2YgY291bnRyaWVzIikgKwogIHRoZW1lX2Rvbm9ycygpICsgCiAgdGhlbWUobGVnZW5kLmp1c3RpZmljYXRpb24gPSAibGVmdCIpICsKICBmYWNldF93cmFwKH4gYmFycmllcl9ncm91cCkKCmRjandfYWR2b2NhY3lfcGxvdCA8LSBnZ3Bsb3QoZmlsdGVyKGRmLmJhcnJpZXJzLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFycmllcl9ncm91cCA9PSAiQmFycmllcnMgdG8gYWR2b2NhY3kiKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZXMoeCA9IHllYXIsIHkgPSB2YWx1ZSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3IgPSBiYXJyaWVyX2Rpc3BsYXkpKSArCiAgZ2VvbV9saW5lKHNpemUgPSAwLjUpICsKICBleHBhbmRfbGltaXRzKHkgPSBjKDAsIDQwKSkgKwogIHNjYWxlX3lfY29udGludW91cyhzZWMuYXhpcyA9IHNlY19heGlzKH4gLiAvIG51bS5jb3VudHJpZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gcGVyY2VudF9mb3JtYXQoYWNjdXJhY3kgPSAxKSksCiAgICAgICAgICAgICAgICAgICAgIGV4cGFuZCA9IGMoMCwgMCkpICsKICBzY2FsZV9jb2xvdXJfbWFudWFsKHZhbHVlcyA9IGMoImJsYWNrIiwgImdyZXk4MCIpLCBuYW1lID0gTlVMTCkgKwogIGd1aWRlcyhjb2xvciA9IGd1aWRlX2xlZ2VuZChucm93ID0gMSkpICsKICBsYWJzKHggPSBOVUxMLCB5ID0gIk51bWJlciBvZiBjb3VudHJpZXMiKSArCiAgdGhlbWVfZG9ub3JzKCkgKyAKICB0aGVtZShsZWdlbmQuanVzdGlmaWNhdGlvbiA9ICJsZWZ0IikgKwogIGZhY2V0X3dyYXAofiBiYXJyaWVyX2dyb3VwKQoKZGYuY3NyZS5wbG90IDwtIGRmLmNvdW50cnkuYWlkICU+JQogIGxlZnRfam9pbihhdXRvY3JhY2llcywgYnkgPSAiY293Y29kZSIpICU+JQogIGdyb3VwX2J5KHllYXIsIGF1dG9jcmFjeSkgJT4lCiAgbmVzdCgpICU+JSAKICBtdXRhdGUoY2lzID0gZGF0YSAlPiUgbWFwKH4gbWVhbl9jbF9ub3JtYWwoLiRjc3JlKSkpICU+JSAKICB1bm5lc3QoY2lzKSAlPiUgCiAgbXV0YXRlKGZha2VfZmFjZXRfdGl0bGUgPSAiQ2l2aWwgc29jaWV0eSByZWd1bGF0b3J5IGVudmlyb25tZW50IiwKICAgICAgICAgYXV0b2NyYWN5ID0gZmFjdG9yKGF1dG9jcmFjeSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBjKCJEZW1vY3JhY3kgKFBvbGl0eSBJViDiiaUgNikiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTm9uLWRlbW9jcmFjeSAoUG9saXR5IElWIDwgNikiKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmRlcmVkID0gVFJVRSkpCgpmaWcuY3NyZSA8LSBnZ3Bsb3QoZGYuY3NyZS5wbG90LCBhZXMoeCA9IHllYXIsIHkgPSB5KSkgKwogIGdlb21fcmliYm9uKGFlcyh5bWluID0geW1pbiwgeW1heCA9IHltYXgsIGZpbGwgPSBhdXRvY3JhY3kpLCBhbHBoYSA9IDAuMikgKwogIGdlb21fbGluZShhZXMoY29sb3IgPSBhdXRvY3JhY3kpLCBzaXplID0gMC41KSArCiAgYW5ub3RhdGUoZ2VvbSA9ICJ0ZXh0IiwgeCA9IDIwMTMsIHkgPSAtMi4yLCBoanVzdCA9ICJyaWdodCIsIHNpemUgPSAxLjgsCiAgICAgICAgICAgbGFiZWwgPSAiTGFyZ2VyIHZhbHVlcyA9IG1vcmUgb3BlbiBjaXZpbCBzb2NpZXR5IikgKwogIHNjYWxlX2NvbG91cl9tYW51YWwodmFsdWVzID0gYygiYmxhY2siLCAiZ3JleTc1IiksIG5hbWUgPSBOVUxMKSArCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gYygiYmxhY2siLCAiZ3JleTc1IiksIG5hbWUgPSBOVUxMKSArCiAgc2NhbGVfbGluZXR5cGVfbWFudWFsKHZhbHVlcyA9IGMoInNvbGlkIiwgInNvbGlkIiwgIjIxIikpICsKICBsYWJzKHkgPSAiQXZlcmFnZSBDU1JFIiwgeCA9IE5VTEwpICsKICB0aGVtZV9kb25vcnMoKSArCiAgdGhlbWUobGVnZW5kLmp1c3RpZmljYXRpb24gPSAibGVmdCIpICsKICBmYWNldF93cmFwKH4gZmFrZV9mYWNldF90aXRsZSkKCmJhcnJpZXJzX3N1bW1hcnkgPC0gCiAgKChkY2p3X2VudHJ5X3Bsb3QgKyBkY2p3X2Z1bmRpbmdfcGxvdCkgLyAKICAgICAoZGNqd19hZHZvY2FjeV9wbG90ICsgZmlnLmNzcmUpKSAmCiAgdGhlbWUobGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IHJlbCgwLjYpKSwKICAgICAgICBheGlzLnRpdGxlLnkgPSBlbGVtZW50X3RleHQobWFyZ2luID0gbWFyZ2luKHIgPSAzKSksCiAgICAgICAgbGVnZW5kLmJveC5tYXJnaW4gPSBtYXJnaW4odCA9IC0wLjUsIHVuaXQgPSAibGluZXMiKSkKCmJhcnJpZXJzX3N1bW1hcnkKZmlnLnNhdmUuY2Fpcm8oYmFycmllcnNfc3VtbWFyeSwgZmlsZW5hbWUgPSAiZmlnLWJhcnJpZXJzLXN1bW1hcnkiLAogICAgICAgICAgICAgICB3aWR0aCA9IDUuNSwgaGVpZ2h0ID0gNC41KQpgYGAKCiMjIyBDb21wdWxzb3J5IHZzLiBidXJkZW5zb21lIHJlZ2lzdHJhdGlvbgoKTGF3cyByZXF1aXJpbmcgTkdPIHJlZ2lzdHJhdGlvbiBhcmVuJ3QgbmVjZXNzYXJpbHkgYSBzaWduIG9mIG9wcHJlc3Npb27igJRldmVuIHRoZSBVUyByZXF1aXJlcyB0aGF0IG5vbnByb2ZpdHMgdGhhdCBlYXJuIGFib3ZlIGEgY2VydGFpbiB0aHJlc2hvbGQgcmVnaXN0ZXIgYXMgNTAxKGMpKDMpIG9yZ2FuaXphdGlvbnMuIFRob3VnaCB0aGUgZmlndXJlIGJlbG93IHNob3dzIHRoYXQgY29tcHVsc29yeSByZWd1bGF0aW9uIGhhdmUgaW5jcmVhc2VkIG92ZXIgdGltZSwgYWN0dWFsIHJlc3RyaWN0aW9uIGhhcyBvY2N1cnJlZCB0b28uIEJ1cmRlbnNvbWUgcmVnaXN0cmF0aW9uIGlzIG5vdCBqdXN0IGFub3RoZXIgc3RhbmRhcmQgbGF5ZXIgb2YgYnVyZWF1Y3JhY3kuCgpgYGB7ciBjb21wdWxzb3J5LXZzLWJ1cmRlbnNvbWUsIGZpZy53aWR0aD00LjUsIGZpZy5oZWlnaHQ9Mn0KZGYucmVndWxhdGlvbiA8LSBkZi5jb3VudHJ5LmFpZCAlPiUKICBsZWZ0X2pvaW4oYXV0b2NyYWNpZXMsIGJ5ID0gImNvd2NvZGUiKSAlPiUKICBncm91cF9ieSh5ZWFyLCBhdXRvY3JhY3kpICU+JQogIHN1bW1hcmlzZShgUmVnaXN0cmF0aW9uIHJlcXVpcmVkYCA9IHN1bShuZ29fcmVnaXN0ZXIpIC8gbigpLAogICAgICAgICAgICBgUmVnaXN0cmF0aW9uIGJ1cmRlbnNvbWVgID0gc3VtKG5nb19yZWdpc3Rlcl9idXJkZW4pIC8gbigpKSAlPiUKICBnYXRoZXIodHlwZS5vZi5sYXcsIHZhbHVlLCAteWVhciwgLWF1dG9jcmFjeSkgJT4lCiAgbXV0YXRlKGF1dG9jcmFjeSA9IAogICAgICAgICAgIGZhY3RvcihhdXRvY3JhY3ksIGxldmVscyA9IGMoVFJVRSwgRkFMU0UpLAogICAgICAgICAgICAgICAgICBsYWJlbHMgPSBjKCJOb24tZGVtb2NyYWNpZXMiLCAiRGVtb2NyYWNpZXMiKSkpCgpmaWcucmVndWxhdGlvbi5idXJkZW4gPC0gZ2dwbG90KGRmLnJlZ3VsYXRpb24sIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFlcyh4ID0geWVhciwgeSA9IHZhbHVlLCBjb2xvdXIgPSB0eXBlLm9mLmxhdykpICsKICBnZW9tX2xpbmUoc2l6ZSA9IDAuNSkgKwogIHNjYWxlX3lfY29udGludW91cyhsYWJlbHMgPSBwZXJjZW50X2Zvcm1hdChhY2N1cmFjeSA9IDEpKSArCiAgc2NhbGVfeF9jb250aW51b3VzKGV4cGFuZCA9IGMoMCwgMCkpICsKICBjb29yZF9jYXJ0ZXNpYW4oeWxpbSA9IGMoMCwgMC43KSwgeGxpbSA9IGMoMTk4MCwgMjAxNSkpICsKICBzY2FsZV9jb2xvdXJfbWFudWFsKHZhbHVlcyA9IGJ1cmRlbi5jb2xvcnMpICsKICBndWlkZXMoY29sb3VyID0gZ3VpZGVfbGVnZW5kKHRpdGxlID0gTlVMTCkpICsKICBsYWJzKHggPSBOVUxMLCB5ID0gIlByb3BvcnRpb24gb2YgY291bnRyaWVzXG53aXRoIHJlZ3VsYXRpb24iKSArCiAgdGhlbWVfZG9ub3JzKCkgKwogIGZhY2V0X3dyYXAofiBhdXRvY3JhY3kpCgpmaWcucmVndWxhdGlvbi5idXJkZW4KZmlnLnNhdmUuY2Fpcm8oZmlnLnJlZ3VsYXRpb24uYnVyZGVuLCBmaWxlbmFtZSA9ICJmaWctcmVndWxhdGlvbi1idXJkZW4iLAogICAgICAgICAgICAgICB3aWR0aCA9IDQuNSwgaGVpZ2h0ID0gMikKYGBgCgoKIyMgQWlkCgojIyMgQWlkIG92ZXIgdGltZSwgYnkgZG9ub3IgdHlwZQoKYGBge3IgYWlkLWJ5LWRvbm9yfQphaWQuZG9ub3IudHlwZS50aW1lIDwtIGRmLmRvbm9yICU+JQogIGdyb3VwX2J5KHllYXIsIGRvbm9yLnR5cGUuY29sbGFwc2VkKSAlPiUKICBzdW1tYXJpc2UodG90YWwuYWlkID0gc3VtKG9kYSwgbmEucm0gPSBUUlVFKSkKCmdncGxvdChhaWQuZG9ub3IudHlwZS50aW1lLCBhZXMoeCA9IHllYXIsIHkgPSB0b3RhbC5haWQgLyAxMDAwMDAwMDAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG91ciA9IGRvbm9yLnR5cGUuY29sbGFwc2VkKSkgKwogIGdlb21fbGluZShzaXplID0gMC41KSArCiAgbGFicyh4ID0gTlVMTCwgeSA9ICJCaWxsaW9ucyBvZiBVU0QiLAogICAgICAgY2FwdGlvbiA9ICJTb3VyY2U6IE9FQ0QgYW5kIEFpZERhdGEuIDIwMTEgZG9sbGFycy4iKSArCiAgZ3VpZGVzKGNvbG91ciA9IGd1aWRlX2xlZ2VuZCh0aXRsZSA9IE5VTEwpKSArCiAgc2NhbGVfeV9jb250aW51b3VzKGxhYmVscyA9IGRvbGxhcikgKyAKICB0aGVtZV9kb25vcnMoKQpgYGAKCiMjIyBBaWQgb3ZlciB0aW1lLCBieSBjb250ZW50aW91c25lc3MKCmBgYHtyIGFpZC1ieS1jb250ZW50aW9ufQphaWQuY29udGVudGlvbi50aW1lIDwtIGRmLmRvbm9yICU+JQogIGdyb3VwX2J5KHllYXIsIHB1cnBvc2UuY29udGVudGlvdXNuZXNzKSAlPiUKICBzdW1tYXJpc2UodG90YWwuYWlkID0gc3VtKG9kYSwgbmEucm0gPSBUUlVFKSkKCmdncGxvdChhaWQuY29udGVudGlvbi50aW1lLCBhZXMoeCA9IHllYXIsIHkgPSB0b3RhbC5haWQgLyAxMDAwMDAwMDAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG91ciA9IHB1cnBvc2UuY29udGVudGlvdXNuZXNzKSkgKwogIGdlb21fbGluZShzaXplID0gMC41KSArCiAgbGFicyh4ID0gTlVMTCwgeSA9ICJCaWxsaW9ucyBvZiBVU0QiLAogICAgICAgY2FwdGlvbiA9ICJTb3VyY2U6IE9FQ0QgYW5kIEFpZERhdGEuIDIwMTEgZG9sbGFycy4iKSArCiAgZ3VpZGVzKGNvbG91ciA9IGd1aWRlX2xlZ2VuZCh0aXRsZSA9IE5VTEwpKSArCiAgc2NhbGVfeV9jb250aW51b3VzKGxhYmVscyA9IGRvbGxhcikgKyAKICB0aGVtZV9kb25vcnMoKQpgYGAKCiMjIFJlc3RyaWN0aW9ucyBhbmQgYWlkIHsudGFic2V0IC50YWJzZXQtZmFkZSAudGFic2V0LXBpbGxzfQoKYGBge3IgcmVzdHJpY3Rpb25zLWFpZC1jb3JyZWxhdGlvbnN9Cmludi5sb2dpdCA8LSBmdW5jdGlvbihmLCBhKSB7CiAgYSA8LSAoMSAtIDIgKiBhKQogIChhICogKDEgKyBleHAoZikpICsgKGV4cChmKSAtIDEpKSAvICgyICogYSAqICgxICsgZXhwKGYpKSkKfQoKZHZzLmNsZWFuLm5hbWVzIDwtIHRyaWJibGUoCiAgfmtleSwgfmtleS5jbGVhbiwKICAiYmFycmllcnMudG90YWwiLCAiQWxsIGJhcnJpZXJzIiwKICAiYWR2b2NhY3kiLCAiQmFycmllcnMgdG8gYWR2b2NhY3kiLAogICJlbnRyeSIsICJCYXJyaWVycyB0byBlbnRyeSIsCiAgImZ1bmRpbmciLCAiQmFycmllcnMgdG8gZnVuZGluZyIKKQoKaXZzLmNsZWFuLm5hbWVzIDwtIHRyaWJibGUoCiAgfnZhcmlhYmxlLCB+dmFyaWFibGUuY2xlYW4sIH5oeXBvdGhlc2lzLAogICJ0b3RhbC5vZGFfbG9nX25leHRfeWVhciIsICJUb3RhbCBPREEiLCAiSDEiLAogICJwcm9wLmNvbnRlbnRpb3VzX2xvZ2l0X25leHRfeWVhciIsICJDb250ZW50aW91cyBhaWQiLCAiSDIiLAogICJwcm9wLm5nby5kb21fbG9naXRfbmV4dF95ZWFyIiwgIkFpZCB0byBkb21lc3RpYyBOR09zIiwgIkgzIiwKICAicHJvcC5uZ28uZm9yZWlnbl9sb2dpdF9uZXh0X3llYXIiLCAiQWlkIHRvIGZvcmVpZ24gTkdPcyIsICJIMyIKKQpgYGAKCiMjIyBSZXN0cmljdGlvbnMgYW5kIE9EQSAoSH4xfikKCmBgYHtyIHJlc3RyaWN0aW9ucy1haWQtaDEsIHdhcm5pbmc9RkFMU0UsIGZpZy53aWR0aD04LCBmaWcuaGVpZ2h0PTQuNX0KZGYucGxvdC5iYXJyaWVycy5vZGEgPC0gZGYuY291bnRyeS5haWQgJT4lIAogIHNlbGVjdCh5ZWFyLCBjb3djb2RlLCBjb3VudHJ5Lm5hbWUsIHRvdGFsLm9kYV9sb2dfbmV4dF95ZWFyLAogICAgICAgICBvbmVfb2YoZHZzLmNsZWFuLm5hbWVzJGtleSkpICU+JSAKICBnYXRoZXIoa2V5LCB2YWx1ZSwgb25lX29mKGR2cy5jbGVhbi5uYW1lcyRrZXkpKSAlPiUgCiAgZmlsdGVyKCFpcy5uYSh0b3RhbC5vZGFfbG9nX25leHRfeWVhciksICFpcy5uYSh2YWx1ZSkpICU+JSAKICBtdXRhdGUodG90YWwub2RhLnRyYW5zZm9ybWVkID0gZXhwbTEodG90YWwub2RhX2xvZ19uZXh0X3llYXIpKSAlPiUgCiAgbGVmdF9qb2luKGR2cy5jbGVhbi5uYW1lcywgYnkgPSAia2V5IikgJT4lIAogIG11dGF0ZShrZXkuY2xlYW4gPSBmY3RfaW5vcmRlcihrZXkuY2xlYW4sIG9yZGVyZWQgPSBUUlVFKSkKCmdncGxvdChkZi5wbG90LmJhcnJpZXJzLm9kYSwgCiAgICAgICBhZXMoeCA9IHZhbHVlLCB5ID0gdG90YWwub2RhLnRyYW5zZm9ybWVkLCBjb2xvciA9IGtleS5jbGVhbikpICsKICBnZW9tX3BvaW50KGFscGhhID0gMC41KSArCiAgc3RhdF9zbW9vdGgobWV0aG9kID0gImxtIikgKwogIHN0YXRfc21vb3RoKGRhdGEgPSBmaWx0ZXIoZGYucGxvdC5iYXJyaWVycy5vZGEsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdG90YWwub2RhLnRyYW5zZm9ybWVkID4gMTAwMDAwMDAwMDApLCAKICAgICAgICAgICAgICBtZXRob2QgPSAibG0iLCBsaW5ldHlwZSA9ICIyMSIpICsKICBzY2FsZV95X2NvbnRpbnVvdXMobGFiZWxzID0gZG9sbGFyKSArCiAgZ3VpZGVzKGNvbG9yID0gRkFMU0UpICsKICBsYWJzKHggPSAiTnVtYmVyIG9mIGxlZ2FsIGJhcnJpZXJzIiwgeSA9ICJUb3RhbCBPREEgaW4gbmV4dCB5ZWFyIiwKICAgICAgIHRpdGxlID0gIlRvdGFsIE9EQSBpbiBuZXh0IHllYXIiLAogICAgICAgc3VidGl0bGUgPSAiRG90dGVkIGxpbmVzIHNob3cgdHJlbmRzIHdoZW4gb21pdHRpbmcgb2JzZXJ2YXRpb25zXG53aXRoIGxlc3MgdGhhbiAkMTAsMDAwLDAwMCwwMDAgaW4gT0RBIikgKwogIHRoZW1lX2Rvbm9ycygpICsKICB0aGVtZShzdHJpcC50ZXh0LnggPSBlbGVtZW50X3RleHQobWFyZ2luID0gbWFyZ2luKHQgPSAxLCBiID0gMSkpKSArCiAgZmFjZXRfd3JhcCh+IGtleS5jbGVhbiwgc2NhbGVzID0gImZyZWVfeCIsIG5yb3cgPSAyKQpgYGAKCiMjIyBSZXN0cmljdGlvbnMgYW5kIGNvbnRlbnRpb3VzbmVzcyAoSH4yfikKCmBgYHtyIHJlc3RyaWN0aW9ucy1haWQtaDIsIHdhcm5pbmc9RkFMU0UsIGZpZy53aWR0aD04LCBmaWcuaGVpZ2h0PTQuNX0KZGYucGxvdC5iYXJyaWVycy5jb250ZW50aW9uIDwtIGRmLmNvdW50cnkuYWlkICU+JSAKICBzZWxlY3QoeWVhciwgY293Y29kZSwgY291bnRyeS5uYW1lLCBwcm9wLmNvbnRlbnRpb3VzX2xvZ2l0X25leHRfeWVhciwKICAgICAgICAgb25lX29mKGR2cy5jbGVhbi5uYW1lcyRrZXkpKSAlPiUgCiAgZ2F0aGVyKGtleSwgdmFsdWUsIG9uZV9vZihkdnMuY2xlYW4ubmFtZXMka2V5KSkgJT4lIAogIGZpbHRlcighaXMubmEocHJvcC5jb250ZW50aW91c19sb2dpdF9uZXh0X3llYXIpLCAhaXMubmEodmFsdWUpKSAlPiUgCiAgbXV0YXRlKHByb3AuY29udGVudGlvdXMudHJhbnNmb3JtZWQgPSAKICAgICAgICAgICBpbnYubG9naXQocHJvcC5jb250ZW50aW91c19sb2dpdF9uZXh0X3llYXIsIGEgPSAwLjAwMSkpICU+JSAKICBsZWZ0X2pvaW4oZHZzLmNsZWFuLm5hbWVzLCBieSA9ICJrZXkiKSAlPiUgCiAgbXV0YXRlKGtleS5jbGVhbiA9IGZjdF9pbm9yZGVyKGtleS5jbGVhbiwgb3JkZXJlZCA9IFRSVUUpKQoKZ2dwbG90KGRmLnBsb3QuYmFycmllcnMuY29udGVudGlvbiwgCiAgICAgICBhZXMoeCA9IHZhbHVlLCB5ID0gcHJvcC5jb250ZW50aW91cy50cmFuc2Zvcm1lZCwgY29sb3IgPSBrZXkuY2xlYW4pKSArCiAgZ2VvbV9wb2ludChhbHBoYSA9IDAuNSkgKwogIHN0YXRfc21vb3RoKG1ldGhvZCA9ICJsbSIpICsKICBzdGF0X3Ntb290aChkYXRhID0gZmlsdGVyKGRmLnBsb3QuYmFycmllcnMuY29udGVudGlvbiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wLmNvbnRlbnRpb3VzLnRyYW5zZm9ybWVkID4gMC4wNSksIAogICAgICAgICAgICAgIG1ldGhvZCA9ICJsbSIsIGxpbmV0eXBlID0gIjIxIikgKwogIHNjYWxlX3lfY29udGludW91cyhsYWJlbHMgPSBwZXJjZW50KSArCiAgZ3VpZGVzKGNvbG9yID0gRkFMU0UpICsKICBsYWJzKHggPSAiTnVtYmVyIG9mIGxlZ2FsIGJhcnJpZXJzIiwgCiAgICAgICB5ID0gIlByb3BvcnRpb24gb2YgY29udGVudGlvdXMgYWlkIGluIG5leHQgeWVhciIsCiAgICAgICB0aXRsZSA9ICJQcm9wb3J0aW9uIG9mIGNvbnRlbnRpb3VzIGFpZCBpbiBuZXh0IHllYXIiLAogICAgICAgc3VidGl0bGUgPSAiRG90dGVkIGxpbmVzIHNob3cgdHJlbmRzIHdoZW4gb21pdHRpbmcgb2JzZXJ2YXRpb25zXG53aXRoIGxlc3MgdGhhbiA1JSBjb250ZW50aW91cyBhaWQiKSArCiAgdGhlbWVfZG9ub3JzKCkgKwogIHRoZW1lKHN0cmlwLnRleHQueCA9IGVsZW1lbnRfdGV4dChtYXJnaW4gPSBtYXJnaW4odCA9IDEsIGIgPSAxKSkpICsKICBmYWNldF93cmFwKH4ga2V5LmNsZWFuLCBzY2FsZXMgPSAiZnJlZV94IiwgbnJvdyA9IDIpCmBgYAoKIyMjIFJlc3RyaWN0aW9ucyBhbmQgTkdPcyAoSH4zfikKCmBgYHtyIHJlc3RyaWN0aW9ucy1haWQtaDMsIHdhcm5pbmc9RkFMU0UsIGZpZy53aWR0aD04LCBmaWcuaGVpZ2h0PTQuNX0KZGYucGxvdC5iYXJyaWVycy5uZ29zIDwtIGRmLmNvdW50cnkuYWlkICU+JSAKICBzZWxlY3QoeWVhciwgY293Y29kZSwgY291bnRyeS5uYW1lLCAKICAgICAgICAgcHJvcC5uZ28uZG9tX2xvZ2l0X25leHRfeWVhciwgcHJvcC5uZ28uZm9yZWlnbl9sb2dpdF9uZXh0X3llYXIsCiAgICAgICAgIG9uZV9vZihkdnMuY2xlYW4ubmFtZXMka2V5KSkgJT4lIAogIGdhdGhlcihiYXJyaWVyLCB2YWx1ZSwgb25lX29mKGR2cy5jbGVhbi5uYW1lcyRrZXkpKSAlPiUgCiAgZ2F0aGVyKHZhcmlhYmxlLCBwcm9wLm5nbywgcHJvcC5uZ28uZG9tX2xvZ2l0X25leHRfeWVhciwKICAgICAgICAgcHJvcC5uZ28uZm9yZWlnbl9sb2dpdF9uZXh0X3llYXIpICU+JSAKICBmaWx0ZXIoIWlzLm5hKHByb3AubmdvKSkgJT4lIAogIG11dGF0ZShwcm9wLm5nby50cmFuc2Zvcm1lZCA9IGludi5sb2dpdChwcm9wLm5nbywgYSA9IDAuMDAxKSkgJT4lIAogIGxlZnRfam9pbihkdnMuY2xlYW4ubmFtZXMsIGJ5ID0gYygiYmFycmllciIgPSAia2V5IikpICU+JSAKICBsZWZ0X2pvaW4oaXZzLmNsZWFuLm5hbWVzLCBieSA9ICJ2YXJpYWJsZSIpICU+JSAKICBtdXRhdGUoa2V5LmNsZWFuID0gZmN0X2lub3JkZXIoa2V5LmNsZWFuLCBvcmRlcmVkID0gVFJVRSkpCgpnZ3Bsb3QoZGYucGxvdC5iYXJyaWVycy5uZ29zLCAKICAgICAgIGFlcyh4ID0gdmFsdWUsIHkgPSBwcm9wLm5nby50cmFuc2Zvcm1lZCwgY29sb3IgPSBrZXkuY2xlYW4pKSArCiAgZ2VvbV9wb2ludChhbHBoYSA9IDAuNSkgKwogIHN0YXRfc21vb3RoKG1ldGhvZCA9ICJsbSIpICsKICBzdGF0X3Ntb290aChkYXRhID0gZmlsdGVyKGRmLnBsb3QuYmFycmllcnMubmdvcywgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wLm5nby50cmFuc2Zvcm1lZCA+IDAuMDUpLCAKICAgICAgICAgICAgICBtZXRob2QgPSAibG0iLCBsaW5ldHlwZSA9ICIyMSIpICsKICBzY2FsZV95X2NvbnRpbnVvdXMobGFiZWxzID0gcGVyY2VudCkgKwogIGd1aWRlcyhjb2xvciA9IEZBTFNFKSArCiAgbGFicyh4ID0gIk51bWJlciBvZiBsZWdhbCBiYXJyaWVycyIsIAogICAgICAgeSA9ICJQcm9wb3J0aW9uIG9mIGFpZCB0byBOR09zIGluIG5leHQgeWVhciIsCiAgICAgICB0aXRsZSA9ICJQcm9wb3J0aW9uIG9mIGFpZCBjaGFubmVsZWQgdG8gdHlwZXMgb2YgTkdPcyBpbiBuZXh0IHllYXIiLAogICAgICAgc3VidGl0bGUgPSAiRG90dGVkIGxpbmVzIHNob3cgdHJlbmRzIHdoZW4gb21pdHRpbmcgb2JzZXJ2YXRpb25zXG53aXRoIGxlc3MgdGhhbiA1JSBhaWQgdG8gTkdPcyIpICsKICBjb29yZF9jYXJ0ZXNpYW4oeWxpbSA9IGMoMCwgMSkpICsKICB0aGVtZV9kb25vcnMoKSArCiAgdGhlbWUoc3RyaXAudGV4dC54ID0gZWxlbWVudF90ZXh0KG1hcmdpbiA9IG1hcmdpbih0ID0gMSwgYiA9IDEpKSkgKwogIGZhY2V0X3dyYXAofiB2YXJpYWJsZS5jbGVhbiArIGtleS5jbGVhbiwgc2NhbGVzID0gImZyZWVfeCIsIG5jb2wgPSA0KQpgYGAKCiMjIyBDU1JFIGFuZCBhbGwgRFZzIChhbGwgaHlwb3RoZXNlcykKCmBgYHtyIGNzcmUtYWlkLWFsbGhzLCB3YXJuaW5nPUZBTFNFLCBmaWcud2lkdGg9OCwgZmlnLmhlaWdodD00LjV9CmRmLnBsb3QuY3NyZS5uZ29zIDwtIGRmLmNvdW50cnkuYWlkICU+JSAKICBzZWxlY3QoeWVhciwgY293Y29kZSwgY291bnRyeS5uYW1lLCAKICAgICAgICAgcHJvcC5jb250ZW50aW91c19sb2dpdF9uZXh0X3llYXIsIHRvdGFsLm9kYV9sb2dfbmV4dF95ZWFyLAogICAgICAgICBwcm9wLm5nby5kb21fbG9naXRfbmV4dF95ZWFyLCBwcm9wLm5nby5mb3JlaWduX2xvZ2l0X25leHRfeWVhciwKICAgICAgICAgY3NyZSkgJT4lIAogIGdhdGhlcih2YXJpYWJsZSwgdmFsdWUsIC1jKHllYXIsIGNvd2NvZGUsIGNvdW50cnkubmFtZSwgY3NyZSkpICU+JSAKICBmaWx0ZXIoIWlzLm5hKHZhbHVlKSkgJT4lIAogIGxlZnRfam9pbihpdnMuY2xlYW4ubmFtZXMsIGJ5ID0gInZhcmlhYmxlIikgJT4lIAogIG11dGF0ZShoeXBvdGhlc2lzLmNsZWFuID0gcGFzdGUwKGh5cG90aGVzaXMsICI6ICIsIHZhcmlhYmxlLmNsZWFuKSkgJT4lIAogIGFycmFuZ2UoaHlwb3RoZXNpcy5jbGVhbikgJT4lIAogIG11dGF0ZShoeXBvdGhlc2lzLmNsZWFuID0gZmN0X2lub3JkZXIoaHlwb3RoZXNpcy5jbGVhbiwgb3JkZXJlZCA9IFRSVUUpKSAlPiUgCiAgbXV0YXRlKHZhbHVlLnRyYW5zZm9ybWVkID0gY2FzZV93aGVuKAogICAgLiRoeXBvdGhlc2lzID09ICJIMSIgfiBleHBtMSguJHZhbHVlKSwKICAgIC4kaHlwb3RoZXNpcyA9PSAiSDIiIH4gaW52LmxvZ2l0KC4kdmFsdWUsIGEgPSAwLjAwMSksCiAgICAuJGh5cG90aGVzaXMgPT0gIkgzIiB+IGludi5sb2dpdCguJHZhbHVlLCBhID0gMC4wMDEpLAogICkpCgpnZ3Bsb3QoZGYucGxvdC5jc3JlLm5nb3MsIAogICAgICAgYWVzKHggPSBjc3JlLCB5ID0gdmFsdWUudHJhbnNmb3JtZWQsIGNvbG9yID0gaHlwb3RoZXNpcykpICsKICBnZW9tX3BvaW50KGFscGhhID0gMC4yNSkgKwogIHNjYWxlX2NvbG9yX3ZpcmlkaXNfZChvcHRpb24gPSAicGxhc21hIiwgZW5kID0gMC45KSArCiAgZ3VpZGVzKGNvbG9yID0gRkFMU0UpICsKICBsYWJzKHggPSAiQ2l2aWwgc29jaWV0eSByZWd1bGF0b3J5IGVudmlyb25tZW50IiwgCiAgICAgICB5ID0gIlZhcmlhYmxlIHZhbHVlIGluIG5leHQgeWVhciIsCiAgICAgICB0aXRsZSA9ICJDaXZpbCBzb2NpZXR5IHJlZ3VsYXRvcnkgZW52aXJvbm1lbnQiKSArCiAgdGhlbWVfZG9ub3JzKCkgKwogIGZhY2V0X3dyYXAofiBoeXBvdGhlc2lzLmNsZWFuLCBzY2FsZXMgPSAiZnJlZV95IikKYGBgCgoKIyMgQ0lWSUNVUyByZXN0cmljdGlvbnMKCmBgYHtyIGNpdmljdXMtZGF0YSwgd2FybmluZz1GQUxTRSwgbWVzc2FnZT1GQUxTRX0KY2l2aWN1cyA8LSByZWFkX2NzdihoZXJlKCJkYXRhIiwgImRhdGFfcmF3IiwgIkNpdmljdXMiLCAiY2l2aWN1c19tb25pdG9yXzIwMTcuY3N2IiksCiAgICAgICAgICAgICAgICAgICAgbmEgPSAiTnVsbCIpICU+JQogIG11dGF0ZShQb3B1bGF0aW9uID0gYXMuZG91YmxlKFBvcHVsYXRpb24pLCAgIyBJbnRlZ2VycyBjYW4ndCBoYW5kbGUgd29ybGQgcG9wdWxhdGlvbgogICAgICAgICBSYXRpbmcgPSBmYWN0b3IoUmF0aW5nLCBsZXZlbHMgPSBjKCJPcGVuIiwgIk5hcnJvd2VkIiwgIk9ic3RydWN0ZWQiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUmVwcmVzc2VkIiwgIkNsb3NlZCIpLCAKICAgICAgICAgICAgICAgICAgICAgICAgIG9yZGVyZWQgPSBUUlVFKSwKICAgICAgICAgaXNvMyA9IGNvdW50cnljb2RlKENvdW50cnksICJjb3VudHJ5Lm5hbWUiLCAiaXNvM2MiKSkKCiMgUm9iaW5zb24gcHJvamVjdGlvbgpwcm9qZWN0aW9uID0gNTQwMzAKCndvcmxkX3NoYXBlcyA8LSBzdF9yZWFkKGZpbGUucGF0aCgiZGF0YSIsICJkYXRhX3JhdyIsICJuZV8xMTBtX2FkbWluXzBfY291bnRyaWVzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJuZV8xMTBtX2FkbWluXzBfY291bnRyaWVzLnNocCIpLAogICAgICAgICAgICAgICAgICAgICAgICBxdWlldCA9IFRSVUUpICU+JSAKICBmaWx0ZXIoSVNPX0EzICE9ICJBVEEiKQpgYGAKCmBgYHtyIGNpdmljdXMtbnVtYmVycywgcmVzdWx0cz0iYXNpcyJ9CmNpdmljdXMgJT4lIGNvdW50KFJhdGluZykgJT4lIHBhbmRvYy50YWJsZSgpCmBgYAoKYGBge3IgY2l2aWN1cy1tYXAsIGZpZy53aWR0aD01LjUsIGZpZy5oZWlnaHQ9M30KbWFwX3dpdGhfY2l2aWN1cyA8LSB3b3JsZF9zaGFwZXMgJT4lIAogICMgRml4IHNvbWUgTmF0dXJhbCBFYXJ0aCBJU08gd2VpcmRuZXNzCiAgbXV0YXRlKElTT19BMyA9IGlmZWxzZShJU09fQTMgPT0gIi05OSIsIGFzLmNoYXJhY3RlcihJU09fQTNfRUgpLCBhcy5jaGFyYWN0ZXIoSVNPX0EzKSkpICU+JSAKICBtdXRhdGUoSVNPX0EzID0gY2FzZV93aGVuKAogICAgLiRJU09fQTMgPT0gIkdSTCIgfiAiRE5LIiwKICAgIC4kTkFNRSA9PSAiTm9yd2F5IiB+ICJOT1IiLAogICAgVFJVRSB+IElTT19BMwogICkpICU+JSAKICBsZWZ0X2pvaW4oY2l2aWN1cywgYnkgPSBjKCJJU09fQTMiID0gImlzbzMiKSkKCnBsb3RfY2l2aWN1c19tYXAgPC0gZ2dwbG90KCkgKwogIGdlb21fc2YoZGF0YSA9IG1hcF93aXRoX2NpdmljdXMsIGFlcyhmaWxsID0gUmF0aW5nKSwgc2l6ZSA9IDAuMTUsIGNvbG9yID0gImJsYWNrIikgKwogIGNvb3JkX3NmKGNycyA9IHN0X2Nycyhwcm9qZWN0aW9uKSwgZGF0dW0gPSBOQSkgKwogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IGMoImdyZXk5MCIsICJncmV5NzAiLCAiZ3JleTQ1IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJncmV5MjAiLCAiYmxhY2siKSwKICAgICAgICAgICAgICAgICAgICBuYS50cmFuc2xhdGUgPSBGQUxTRSwgbmFtZSA9ICJDaXZpYyBzcGFjZSIpICsKICB0aGVtZV9kb25vcnNfbWFwKCkgKyB0aGVtZShsZWdlbmQua2V5LnNpemUgPSB1bml0KDAuNywgImxpbmVzIikpCgpwbG90X2NpdmljdXNfbWFwIApmaWcuc2F2ZS5jYWlybyhwbG90X2NpdmljdXNfbWFwLCBmaWxlbmFtZSA9ICJmaWctY2l2aWN1cy1tYXAiLAogICAgICAgICAgICAgICB3aWR0aCA9IDUuNSwgaGVpZ2h0ID0gMykKYGBgCgoKIyMgTGlzdCBvZiBjb3VudHJpZXMgaW5jbHVkZWQgaW4gbW9kZWxzCgpgYGB7ciBsaXN0LWNvdW50cmllcywgcmVzdWx0cz0iYXNpcyJ9Cm1hdHJpeF9mcm9tX3ZlY3RvciA8LSBmdW5jdGlvbih4LCBuY29sKSB7CiAgbl9iYWxhbmNlZCA8LSBjZWlsaW5nKGxlbmd0aCh4KSAvIG5jb2wpICogbmNvbAogIG1hdHJpeChjKHgsIHJlcChOQSwgbl9iYWxhbmNlZCAtIGxlbmd0aCh4KSkpLCBuY29sID0gbmNvbCkKfQoKYWxsX2NvdW50cmllcyA8LSBkZi5jb3VudHJ5LmFpZCAlPiUgCiAgZGlzdGluY3QoY291bnRyeS5uYW1lKSAlPiUgCiAgYXJyYW5nZShjb3VudHJ5Lm5hbWUpICU+JSAKICBwdWxsKGNvdW50cnkubmFtZSkgCgpjYXB0aW9uIDwtIHBhc3RlMCgiQWxsIGNvdW50cmllcyBpbmNsdWRlZCBpbiBtb2RlbHMgKE4gPSAiLCAKICAgICAgICAgICAgICAgICAgbGVuZ3RoKGFsbF9jb3VudHJpZXMpLAogICAgICAgICAgICAgICAgICAiKSB7I3RibDpjb3VudHJpZXN9IikKCm5jb2xfY291bnRyaWVzIDwtIDQKCnRibF9jb3VudHJpZXMgPC0gYWxsX2NvdW50cmllcyAlPiUgCiAgbWF0cml4X2Zyb21fdmVjdG9yKG5jb2wgPSBuY29sX2NvdW50cmllcykgJT4lIAogIHBhbmRvYy50YWJsZS5yZXR1cm4oanVzdGlmeSA9IHBhc3RlMChyZXAoImwiLCBuY29sX2NvdW50cmllcyksIGNvbGxhcHNlID0gIiIpLCAKICAgICAgICAgICAgICAgICAgICAgIGNhcHRpb24gPSBjYXB0aW9uLCBtaXNzaW5nID0gIiIpCgpjYXQodGJsX2NvdW50cmllcykKY2F0KHRibF9jb3VudHJpZXMsIGZpbGUgPSBoZXJlKCJPdXRwdXQiLCAidGJsLWNvdW50cmllcy5tZCIpKQpgYGAK