library(tidyverse)
library(targets)
library(scales)
library(ggbeeswarm)
library(patchwork)
library(here)
# Generated via random.org
set.seed(9951)
matrix_from_vector <- function(x, ncol) {
n_balanced <- ceiling(length(x) / ncol) * ncol
matrix(c(x, rep(NA, n_balanced - length(x))), ncol = ncol)
}
# Load data
# Need to use this withr thing because tar_read() and tar_load() need to see the
# _targets folder in the current directory, but this .Rmd file is in a subfolder
withr::with_dir(here::here(), {
source(tar_read(plot_funs))
tar_load(pandem_clean)
tar_load(pandem_single)
tar_load(derogations_clean)
tar_load(vdem_clean)
tar_load(pandem_derog)
})
V-Dem pandemic emergency declarations
A majority of countries made some sort of official public health response to the pandemic, and most used legal avenues for their responses: 80% of countries used legal instruments to declare public emergencies at some point during 2020, while 16% used extralegal avenues. Only a handful had no official national emergency response throughout 2020: Canada, China, Germany, Nicaragua, and North Korea.
pandem_single %>%
count(emlaw_cond_min) %>%
mutate(prop = n / sum(n))
|
emlaw_cond_min
|
n
|
prop
|
|
Emergency response with legal instruments
|
116
|
0.8055556
|
|
Emergency response without legal instruments
|
23
|
0.1597222
|
|
No emergency response
|
5
|
0.0347222
|
pandem_single %>%
count(emlaw_fct_min) %>%
mutate(prop = n / sum(n))
|
emlaw_fct_min
|
n
|
prop
|
|
Declaration in existing legal framework
|
49
|
0.3402778
|
|
Declaration in existing legal framework, distinguishes public health emergency
|
15
|
0.1041667
|
|
Declaration of disaster where different from emergency
|
8
|
0.0555556
|
|
Declaration using other legislation
|
44
|
0.3055556
|
|
Emergency response without legal instruments
|
23
|
0.1597222
|
|
No emergency response
|
5
|
0.0347222
|
pandem_single %>%
filter(emlaw_cond_min == "No emergency response") %>%
select(country_name, emlaw_cond)
|
country_name
|
emlaw_cond
|
|
Canada
|
No emergency response
|
|
China
|
No emergency response
|
|
Germany
|
No emergency response
|
|
Nicaragua
|
No emergency response
|
|
North Korea
|
No emergency response
|
There are distinct patterns that help determine which kind of response a country made. There is a uniform distribution of adherence to democratic values within countries that used legal methods for declaring emergencies. For instance, both Denmark and Tajikistan used legal instruments to declare their respective emergencies. However, among countries that declared emergencies without any legal instruments, there are no countries that score above 0.5 on V-Dem’s liberal democracy index.
This is also true when looking at regime type specifically. Only one democracy—Sri Lanka—declared an emergency extralegally.
pandem_single %>%
group_by(emlaw_cond_min) %>%
arrange(v2x_libdem) %>%
slice(c(1, 2, n() - 1, n())) %>%
select(country_name, emlaw_cond_min, v2x_libdem)
|
country_name
|
emlaw_cond_min
|
v2x_libdem
|
|
Tajikistan
|
Emergency response with legal instruments
|
0.062
|
|
Azerbaijan
|
Emergency response with legal instruments
|
0.070
|
|
Sweden
|
Emergency response with legal instruments
|
0.829
|
|
Denmark
|
Emergency response with legal instruments
|
0.858
|
|
Eritrea
|
Emergency response without legal instruments
|
0.012
|
|
Saudi Arabia
|
Emergency response without legal instruments
|
0.040
|
|
Benin
|
Emergency response without legal instruments
|
0.461
|
|
Sri Lanka
|
Emergency response without legal instruments
|
0.469
|
|
North Korea
|
No emergency response
|
0.014
|
|
China
|
No emergency response
|
0.050
|
|
Canada
|
No emergency response
|
0.776
|
|
Germany
|
No emergency response
|
0.779
|
pandem_single %>%
ggplot(aes(y = fct_rev(emlaw_cond_min), x = v2x_libdem, color = emlaw_cond_min)) +
geom_quasirandom(groupOnX = FALSE, width = 0.1) +
guides(color = FALSE) +
scale_color_viridis_d(option = "plasma", end = 0.8) +
scale_y_discrete(labels = function(x) str_wrap(x, width = 15)) +
coord_cartesian(xlim = c(0, 1)) +
labs(x = "V-Dem liberal democracy index", y = NULL,
caption = "Lower values indicate less democracy") +
theme_pandem() +
theme(panel.grid.major.y = element_blank())

pandem_single %>%
group_by(emlaw_cond_min, regime) %>%
summarize(n = n())
|
emlaw_cond_min
|
regime
|
n
|
|
Emergency response with legal instruments
|
Closed autocracy
|
9
|
|
Emergency response with legal instruments
|
Electoral autocracy
|
43
|
|
Emergency response with legal instruments
|
Electoral democracy
|
36
|
|
Emergency response with legal instruments
|
Liberal democracy
|
28
|
|
Emergency response without legal instruments
|
Closed autocracy
|
8
|
|
Emergency response without legal instruments
|
Electoral autocracy
|
14
|
|
Emergency response without legal instruments
|
Electoral democracy
|
1
|
|
No emergency response
|
Closed autocracy
|
2
|
|
No emergency response
|
Electoral autocracy
|
1
|
|
No emergency response
|
Liberal democracy
|
2
|
pandem_single %>%
filter(emlaw_cond_min == "Emergency response without legal instruments",
regime == "Electoral democracy") %>%
select(country_name)
pandem_single %>%
ggplot(aes(x = regime, y = fct_rev(emlaw_cond_min), color = emlaw_cond_min)) +
geom_point(position = position_jitter(width = 0.1, height = 0.1)) +
scale_color_viridis_d(option = "plasma", end = 0.8) +
scale_x_discrete(labels = function(x) str_wrap(x, width = 15)) +
scale_y_discrete(labels = function(x) str_wrap(x, width = 15)) +
guides(color = FALSE) +
labs(x = "V-Dem Regimes of the World index", y = NULL) +
theme_pandem() +
theme(panel.grid.major.y = element_blank())

Human rights violations and democratic backsliding
An overarching fear as countries declared emergency pandemic measures is that these measures would serve as an excuse to violate human rights, limit the space for civil society, and lead to democratic backsliding.
The variety of pandemic-justified human rights violations differs by countries’ formal responses. Those that implemented emergency measures without a formal legal process were more likely to violate non-derogable rights and engage in discriminatory measures. Surprisingly, those that used legal instruments were more likely to enforce these measures harshly, potentially because there was a formal process backing up the measures—there are legislative teeth, so to speak.
violation_summary <- pandem_derog %>%
group_by(emlaw_cond_min) %>%
summarize(across(c(discrim, ndrights, pomviol),
~mean(.)))
plot_violation_ndrights <- violation_summary %>%
pivot_longer(-emlaw_cond_min) %>%
filter(name == "ndrights") %>%
ggplot(aes(x = value, y = fct_rev(emlaw_cond_min), color = emlaw_cond_min)) +
geom_pointrange(aes(xmin = 0, xmax = value)) +
guides(color = FALSE) +
scale_x_continuous(labels = percent_format(accuracy = 1)) +
scale_y_discrete(labels = function(x) str_wrap(x, width = 15)) +
scale_color_viridis_d(option = "plasma", end = 0.8) +
labs(x = "Proportion violating non-derogable rights", y = NULL,
title = "Violations of nonderogable rights") +
theme_pandem() +
theme(panel.grid.major.y = element_blank())
plot_violation_discrim <- violation_summary %>%
pivot_longer(-emlaw_cond_min) %>%
filter(name == "discrim") %>%
ggplot(aes(x = value, y = fct_rev(emlaw_cond_min), color = emlaw_cond_min)) +
geom_pointrange(aes(xmin = 0, xmax = value)) +
guides(color = FALSE) +
scale_y_discrete(labels = function(x) str_wrap(x, width = 15)) +
scale_color_viridis_d(option = "plasma", end = 0.8) +
labs(x = "Average discriminatory measures", y = NULL,
caption = "Original scale ranges from 0–3",
title = "Discriminatory measures") +
theme_pandem() +
theme(panel.grid.major.y = element_blank())
plot_violation_pomviol <- violation_summary %>%
pivot_longer(-emlaw_cond_min) %>%
filter(name == "pomviol") %>%
ggplot(aes(x = value, y = fct_rev(emlaw_cond_min), color = emlaw_cond_min)) +
geom_pointrange(aes(xmin = 0, xmax = value)) +
guides(color = FALSE) +
scale_y_discrete(labels = function(x) str_wrap(x, width = 15)) +
scale_color_viridis_d(option = "plasma", end = 0.8) +
labs(x = "Average abusive enforcement", y = NULL,
caption = "Original scale ranges from 0–3",
title = "Abusive enforcement") +
theme_pandem() +
theme(panel.grid.major.y = element_blank())
plot_violation_discrim / plot_violation_ndrights / plot_violation_pomviol

The level of civil society openness varies substantially across these four types of derogations. Countries that formally derogated have far more open civil society than those that did not derogate. However, civil society openness isn’t necessarily a strong predictor of whether emergency measures are temporary or proportional. The 5 derogating countries that ended up abusing their privileges have relatively unrestricted and freely regulated civil societies.
Countries that did not official derogate have more restricted space for civil society, and countries that did not issue a formal legal emergency and did not formally derogate tend to have an even lower average civil society index. Not surprisingly, countries that have not ratified the ICCPR have highly restricted civil societies.
pandem_derog %>%
ggplot(aes(x = v2xcs_ccsi, y = fct_rev(type_clean_letter), color = type_clean_letter)) +
stat_summary(aes(fill = type_clean_letter), geom = "point", fun = "mean",
size = 4, pch = 23, color = "white", alpha = 0.4,
position = position_nudge(x = 0, y = -0.2)) +
geom_quasirandom(groupOnX = FALSE, width = 0.1) +
guides(color = FALSE, fill = FALSE) +
scale_y_discrete(labels = function(x) str_wrap(x, width = 15)) +
scale_color_viridis_d(option = "plasma", end = 0.8) +
scale_fill_viridis_d(option = "plasma", end = 0.8) +
coord_cartesian(xlim = c(0, 1)) +
labs(x = "Average V-Dem core civil society index", y = NULL,
caption = "Diamonds show mean value; lower values indicate more limited civil society") +
theme_pandem() +
theme(panel.grid.major.y = element_blank())

pandem_derog %>%
ggplot(aes(x = v2xcs_ccsi, y = pandem)) +
geom_point(aes(color = type_clean_letter)) +
geom_smooth(method = "lm") +
scale_color_viridis_d(option = "plasma", end = 0.95) +
guides(color = guide_legend(ncol = 2)) +
coord_cartesian(xlim = c(0, 1)) +
labs(x = "V-Dem core civil society index", y = "Pandemic violations index", color = NULL) +
theme_pandem()

pandem_derog %>%
ggplot(aes(x = v2xcs_ccsi, y = panback)) +
geom_point(aes(color = type_clean_letter)) +
geom_smooth(method = "gam") +
scale_color_viridis_d(option = "plasma", end = 0.95) +
guides(color = guide_legend(ncol = 2)) +
coord_cartesian(xlim = c(0, 1), ylim = c(0, 0.5)) +
labs(x = "V-Dem core civil society index", y = "Pandemic backsliding index", color = NULL) +
theme_pandem()

pandem_derog %>%
ggplot(aes(x = v2x_libdem, y = pandem)) +
geom_point(aes(color = type_clean_letter)) +
geom_smooth(method = "lm") +
scale_color_viridis_d(option = "plasma", end = 0.8) +
guides(color = guide_legend(ncol = 2)) +
labs(x = "V-Dem liberal democracy index", y = "Pandemic violations index", color = NULL) +
theme_pandem()

pandem_derog %>%
ggplot(aes(x = v2x_libdem, y = panback)) +
geom_point(aes(color = type_clean_letter)) +
geom_smooth(method = "gam") +
scale_color_viridis_d(option = "plasma", end = 0.8) +
guides(color = guide_legend(ncol = 2)) +
coord_cartesian(ylim = c(0, 0.5)) +
labs(x = "V-Dem liberal democracy index", y = "Pandemic backsliding index", color = NULL) +
theme_pandem()

LS0tCnRpdGxlOiAiR2VuZXJhbCBhbmFseXNpcyIKYXV0aG9yOiAiU3VwYXJuYSBDaGF1ZGhyeSBhbmQgQW5kcmV3IEhlaXNzIgpkYXRlOiAiYHIgZm9ybWF0KFN5cy50aW1lKCksICclRicpYCIKb3V0cHV0OiAKICBodG1sX2RvY3VtZW50OgogICAgY29kZV9mb2xkaW5nOiBoaWRlCmVkaXRvcl9vcHRpb25zOiAKICBjaHVua19vdXRwdXRfdHlwZTogY29uc29sZQotLS0KCmBgYHtyIHNldHVwLCBpbmNsdWRlPUZBTFNFfQpsaWJyYXJ5KGtuaXRyKQpsaWJyYXJ5KGthYmxlRXh0cmEpCmtuaXRfcHJpbnQuZGF0YS5mcmFtZSA8LSBmdW5jdGlvbih4LCAuLi4pIHsKICByZXMgPC0gcGFzdGUoYygnJywgJycsIGthYmxlX3N0eWxpbmcoa2FibGUoeCwgYm9va3RhYnMgPSBUUlVFKSkpLCBjb2xsYXBzZSA9ICdcbicpCiAgYXNpc19vdXRwdXQocmVzKQp9CgpyZWdpc3RlclMzbWV0aG9kKCJrbml0X3ByaW50IiwgImRhdGEuZnJhbWUiLCBrbml0X3ByaW50LmRhdGEuZnJhbWUpCnJlZ2lzdGVyUzNtZXRob2QoImtuaXRfcHJpbnQiLCAiZ3JvdXBlZF9kZiIsIGtuaXRfcHJpbnQuZGF0YS5mcmFtZSkKCmtuaXRyOjpvcHRzX2NodW5rJHNldChmaWcucmV0aW5hID0gMywKICAgICAgICAgICAgICAgICAgICAgIHRpZHkub3B0cyA9IGxpc3Qod2lkdGguY3V0b2ZmID0gMTIwKSwgICMgRm9yIGNvZGUKICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnMod2lkdGggPSA5MCksICAjIEZvciBvdXRwdXQKICAgICAgICAgICAgICAgICAgICAgIGZpZy5hc3AgPSAwLjYxOCwgZmlnLndpZHRoID0gNywgCiAgICAgICAgICAgICAgICAgICAgICBmaWcuYWxpZ24gPSAiY2VudGVyIiwgb3V0LndpZHRoID0gIjg1JSIpCgpvcHRpb25zKGRwbHlyLnN1bW1hcmlzZS5pbmZvcm0gPSBGQUxTRSwKICAgICAgICBrbml0ci5rYWJsZS5OQSA9ICIiKQpgYGAKCmBgYHtyIGxvYWQtbGlicmFyaWVzLWRhdGEsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CmxpYnJhcnkodGlkeXZlcnNlKQpsaWJyYXJ5KHRhcmdldHMpCmxpYnJhcnkoc2NhbGVzKQpsaWJyYXJ5KGdnYmVlc3dhcm0pCmxpYnJhcnkocGF0Y2h3b3JrKQpsaWJyYXJ5KGhlcmUpCgojIEdlbmVyYXRlZCB2aWEgcmFuZG9tLm9yZwpzZXQuc2VlZCg5OTUxKQoKbWF0cml4X2Zyb21fdmVjdG9yIDwtIGZ1bmN0aW9uKHgsIG5jb2wpIHsKICBuX2JhbGFuY2VkIDwtIGNlaWxpbmcobGVuZ3RoKHgpIC8gbmNvbCkgKiBuY29sCiAgbWF0cml4KGMoeCwgcmVwKE5BLCBuX2JhbGFuY2VkIC0gbGVuZ3RoKHgpKSksIG5jb2wgPSBuY29sKQp9CgojIExvYWQgZGF0YQojIE5lZWQgdG8gdXNlIHRoaXMgd2l0aHIgdGhpbmcgYmVjYXVzZSB0YXJfcmVhZCgpIGFuZCB0YXJfbG9hZCgpIG5lZWQgdG8gc2VlIHRoZQojIF90YXJnZXRzIGZvbGRlciBpbiB0aGUgY3VycmVudCBkaXJlY3RvcnksIGJ1dCB0aGlzIC5SbWQgZmlsZSBpcyBpbiBhIHN1YmZvbGRlcgp3aXRocjo6d2l0aF9kaXIoaGVyZTo6aGVyZSgpLCB7CiAgc291cmNlKHRhcl9yZWFkKHBsb3RfZnVucykpCiAgCiAgdGFyX2xvYWQocGFuZGVtX2NsZWFuKQogIHRhcl9sb2FkKHBhbmRlbV9zaW5nbGUpCiAgdGFyX2xvYWQoZGVyb2dhdGlvbnNfY2xlYW4pCiAgdGFyX2xvYWQodmRlbV9jbGVhbikKICB0YXJfbG9hZChwYW5kZW1fZGVyb2cpCn0pCmBgYAoKIyBWLURlbSBwYW5kZW1pYyBlbWVyZ2VuY3kgZGVjbGFyYXRpb25zCgpBIG1ham9yaXR5IG9mIGNvdW50cmllcyBtYWRlIHNvbWUgc29ydCBvZiBvZmZpY2lhbCBwdWJsaWMgaGVhbHRoIHJlc3BvbnNlIHRvIHRoZSBwYW5kZW1pYywgYW5kIG1vc3QgdXNlZCBsZWdhbCBhdmVudWVzIGZvciB0aGVpciByZXNwb25zZXM6IDgwJSBvZiBjb3VudHJpZXMgdXNlZCBsZWdhbCBpbnN0cnVtZW50cyB0byBkZWNsYXJlIHB1YmxpYyBlbWVyZ2VuY2llcyBhdCBzb21lIHBvaW50IGR1cmluZyAyMDIwLCB3aGlsZSAxNiUgdXNlZCBleHRyYWxlZ2FsIGF2ZW51ZXMuIE9ubHkgYSBoYW5kZnVsIGhhZCBubyBvZmZpY2lhbCBuYXRpb25hbCBlbWVyZ2VuY3kgcmVzcG9uc2UgdGhyb3VnaG91dCAyMDIwOiBDYW5hZGEsIENoaW5hLCBHZXJtYW55LCBOaWNhcmFndWEsIGFuZCBOb3J0aCBLb3JlYS4KCmBgYHtyIGVtZXJnZW5jeS1sYXctZGVjbGFyYXRpb25zfQpwYW5kZW1fc2luZ2xlICU+JSAKICBjb3VudChlbWxhd19jb25kX21pbikgJT4lIAogIG11dGF0ZShwcm9wID0gbiAvIHN1bShuKSkKCnBhbmRlbV9zaW5nbGUgJT4lIAogIGNvdW50KGVtbGF3X2ZjdF9taW4pICU+JSAKICBtdXRhdGUocHJvcCA9IG4gLyBzdW0obikpCgpwYW5kZW1fc2luZ2xlICU+JSAKICBmaWx0ZXIoZW1sYXdfY29uZF9taW4gPT0gIk5vIGVtZXJnZW5jeSByZXNwb25zZSIpICU+JSAKICBzZWxlY3QoY291bnRyeV9uYW1lLCBlbWxhd19jb25kKQpgYGAKClRoZXJlIGFyZSBkaXN0aW5jdCBwYXR0ZXJucyB0aGF0IGhlbHAgZGV0ZXJtaW5lIHdoaWNoIGtpbmQgb2YgcmVzcG9uc2UgYSBjb3VudHJ5IG1hZGUuIFRoZXJlIGlzIGEgdW5pZm9ybSBkaXN0cmlidXRpb24gb2YgYWRoZXJlbmNlIHRvIGRlbW9jcmF0aWMgdmFsdWVzIHdpdGhpbiBjb3VudHJpZXMgdGhhdCB1c2VkIGxlZ2FsIG1ldGhvZHMgZm9yIGRlY2xhcmluZyBlbWVyZ2VuY2llcy4gRm9yIGluc3RhbmNlLCBib3RoIERlbm1hcmsgYW5kIFRhamlraXN0YW4gdXNlZCBsZWdhbCBpbnN0cnVtZW50cyB0byBkZWNsYXJlIHRoZWlyIHJlc3BlY3RpdmUgZW1lcmdlbmNpZXMuIEhvd2V2ZXIsIGFtb25nIGNvdW50cmllcyB0aGF0IGRlY2xhcmVkIGVtZXJnZW5jaWVzIHdpdGhvdXQgYW55IGxlZ2FsIGluc3RydW1lbnRzLCB0aGVyZSBhcmUgbm8gY291bnRyaWVzIHRoYXQgc2NvcmUgYWJvdmUgMC41IG9uIFYtRGVtJ3MgbGliZXJhbCBkZW1vY3JhY3kgaW5kZXguCgpUaGlzIGlzIGFsc28gdHJ1ZSB3aGVuIGxvb2tpbmcgYXQgcmVnaW1lIHR5cGUgc3BlY2lmaWNhbGx5LiBPbmx5IG9uZSBkZW1vY3JhY3nigJRTcmkgTGFua2HigJRkZWNsYXJlZCBhbiBlbWVyZ2VuY3kgZXh0cmFsZWdhbGx5LgoKYGBge3IgZGVtb2NyYWN5LWRlY2xhcmF0aW9ufQpwYW5kZW1fc2luZ2xlICU+JSAKICBncm91cF9ieShlbWxhd19jb25kX21pbikgJT4lIAogIGFycmFuZ2UodjJ4X2xpYmRlbSkgJT4lIAogIHNsaWNlKGMoMSwgMiwgbigpIC0gMSwgbigpKSkgJT4lIAogIHNlbGVjdChjb3VudHJ5X25hbWUsIGVtbGF3X2NvbmRfbWluLCB2MnhfbGliZGVtKQoKcGFuZGVtX3NpbmdsZSAlPiUgCiAgZ2dwbG90KGFlcyh5ID0gZmN0X3JldihlbWxhd19jb25kX21pbiksIHggPSB2MnhfbGliZGVtLCBjb2xvciA9IGVtbGF3X2NvbmRfbWluKSkgKwogIGdlb21fcXVhc2lyYW5kb20oZ3JvdXBPblggPSBGQUxTRSwgd2lkdGggPSAwLjEpICsKICBndWlkZXMoY29sb3IgPSBGQUxTRSkgKwogIHNjYWxlX2NvbG9yX3ZpcmlkaXNfZChvcHRpb24gPSAicGxhc21hIiwgZW5kID0gMC44KSArCiAgc2NhbGVfeV9kaXNjcmV0ZShsYWJlbHMgPSBmdW5jdGlvbih4KSBzdHJfd3JhcCh4LCB3aWR0aCA9IDE1KSkgKwogIGNvb3JkX2NhcnRlc2lhbih4bGltID0gYygwLCAxKSkgKwogIGxhYnMoeCA9ICJWLURlbSBsaWJlcmFsIGRlbW9jcmFjeSBpbmRleCIsIHkgPSBOVUxMLAogICAgICAgY2FwdGlvbiA9ICJMb3dlciB2YWx1ZXMgaW5kaWNhdGUgbGVzcyBkZW1vY3JhY3kiKSArCiAgdGhlbWVfcGFuZGVtKCkgKwogIHRoZW1lKHBhbmVsLmdyaWQubWFqb3IueSA9IGVsZW1lbnRfYmxhbmsoKSkKYGBgCgpgYGB7ciByZWdpbWUtZGVjbGFyYXRpb259CnBhbmRlbV9zaW5nbGUgJT4lIAogIGdyb3VwX2J5KGVtbGF3X2NvbmRfbWluLCByZWdpbWUpICU+JSAKICBzdW1tYXJpemUobiA9IG4oKSkKCnBhbmRlbV9zaW5nbGUgJT4lIAogIGZpbHRlcihlbWxhd19jb25kX21pbiA9PSAiRW1lcmdlbmN5IHJlc3BvbnNlIHdpdGhvdXQgbGVnYWwgaW5zdHJ1bWVudHMiLAogICAgICAgICByZWdpbWUgPT0gIkVsZWN0b3JhbCBkZW1vY3JhY3kiKSAlPiUgCiAgc2VsZWN0KGNvdW50cnlfbmFtZSkKCnBhbmRlbV9zaW5nbGUgJT4lIAogIGdncGxvdChhZXMoeCA9IHJlZ2ltZSwgeSA9IGZjdF9yZXYoZW1sYXdfY29uZF9taW4pLCBjb2xvciA9IGVtbGF3X2NvbmRfbWluKSkgKwogIGdlb21fcG9pbnQocG9zaXRpb24gPSBwb3NpdGlvbl9qaXR0ZXIod2lkdGggPSAwLjEsIGhlaWdodCA9IDAuMSkpICsKICBzY2FsZV9jb2xvcl92aXJpZGlzX2Qob3B0aW9uID0gInBsYXNtYSIsIGVuZCA9IDAuOCkgKwogIHNjYWxlX3hfZGlzY3JldGUobGFiZWxzID0gZnVuY3Rpb24oeCkgc3RyX3dyYXAoeCwgd2lkdGggPSAxNSkpICsKICBzY2FsZV95X2Rpc2NyZXRlKGxhYmVscyA9IGZ1bmN0aW9uKHgpIHN0cl93cmFwKHgsIHdpZHRoID0gMTUpKSArCiAgZ3VpZGVzKGNvbG9yID0gRkFMU0UpICsKICBsYWJzKHggPSAiVi1EZW0gUmVnaW1lcyBvZiB0aGUgV29ybGQgaW5kZXgiLCB5ID0gTlVMTCkgKwogIHRoZW1lX3BhbmRlbSgpICsKICB0aGVtZShwYW5lbC5ncmlkLm1ham9yLnkgPSBlbGVtZW50X2JsYW5rKCkpCmBgYAoKIyBGb3JtYWwgSUNDUFIgZGVyb2dhdGlvbnMKCk1hbnkgcGFuZGVtaWMtbGV2ZWwgcHVibGljIGhlYWx0aCBtZWFzdXJlcyBuZWNlc3NhcmlseSBlbnRhaWwgaW1wb3NpbmcgbGltaXRhdGlvbnMgb24gcGVyc29uYWwgcmlnaHRzIGFuZCBmcmVlZG9tcy4gVG8gY3VydGFpbCB0aGUgc3ByZWFkIG9mIHRoZSB2aXJ1cywgY291bnRyaWVzIGltcG9zZWQgbG9ja2Rvd25zIGFuZCBlbmFjdGVkIHJlc3RyaWN0aW9ucyBvbiBtb3ZlbWVudCBhbmQgYXNzb2NpYXRpb24uIFdoaWxlIGNvdW50cmllcyBhcmUgb3N0ZW5zaWJseSBmcmVlIHRvIG1ha2UgdGhlc2UgZGVjaXNpb25zIHdpdGhpbiB0aGVpciBvd24gYm9yZGVycywgbWFueSBjb3VudHJpZXMgYXJlIGFsc28gYm91bmQgdG8gZm9sbG93IGludGVybmF0aW9uYWwgYWdyZWVtZW50cyBsaWtlIHRoZSBJQ0NQUi4gU2lnbmF0b3JpZXMgdG8gdGhlIElDQ1BSIGhhdmUgdGhlIGFiaWxpdHkgdG8gZm9ybWFsbHkgZGVyb2dhdGUgdGhlaXIgYWdyZWVtZW50cyBvbiBhIHRlbXBvcmFyeSBiYXNpcywgYnV0IG5vdCBhbGwgY291bnRyaWVzIGRpZCB0aGlzIGluIDIwMjAuIAoKVi1EZW0gZG9lc24ndCBrZWVwIHRyYWNrIG9mIGFjdHVhbCBmb3JtYWwgZGVyb2dhdGlvbnMsIHNvIHdlIGNvbGxlY3RlZCB0aGlzIGRhdGEgYnkgaGFuZC4KCmBgYHtyIGRlcm9nYXRpb25zLXN1bW1hcnl9CmRlcm9nX2NvdW50IDwtIGRlcm9nYXRpb25zX2NsZWFuICU+JSAKICBmaWx0ZXIocmF0aWZpZWQgPT0gMSkgJT4lIAogIGNvdW50KGRlcm9nYXRlKQpkZXJvZ19jb3VudApgYGAKCk9mIHRoZSBgciBzdW0oZGVyb2dfY291bnQkbilgIGNvdW50cmllcyB0aGF0IGhhdmUgcmF0aWZpZWQgdGhlIElDQ1BSLCBgciBmaWx0ZXIoZGVyb2dfY291bnQsIGRlcm9nYXRlID09IDEpJG5gIHN1Ym1pdHRlZCBmb3JtYWwgZGVyb2dhdGlvbnMuCgojIyBUeXBvbG9neSBvZiBkZXJvZ2F0aW9uCgpgYGB7cn0KcGFuZGVtX2Rlcm9nICU+JSAKICBjb3VudChkZXJvZ2F0ZSwgbm9ucHJvcG9ydGlvbmFsKQoKcGFuZGVtX2Rlcm9nICU+JSAKICBjb3VudCh0eXBlX2NsZWFuKQpgYGAKCioqQTogRGVyb2dhdGVkIGFzIGludGVuZGVkKioKCkhlcmUgYXJlIHRoZSBjb3VudHJpZXMgdGhhdCBkZXJvZ2F0ZWQsIHByb3ZpZGVkIGFuIGVuZCBkYXRlLCBhbmQgdXNlZCBwcm9wb3J0aW9uYWwgb3IgbmVjZXNzYXJ5IG1lYXN1cmVzOgoKYGBge3J9CnBhbmRlbV9kZXJvZyAlPiUgCiAgZmlsdGVyKHR5cGUgPT0gIkEiKSAlPiUgCiAgc2VsZWN0KGNvdW50cnlfbmFtZSwgZGVyb2dhdGlvbl9zdGFydCwgZGVyb2dhdGlvbl9lbmQpCmBgYAoKKipCOiBPZmZpY2lhbGx5IGRlcm9nYXRlZCBidXQgbWVhc3VyZXMgbm90IHRlbXBvcmFyeS9wcm9wb3J0aW9uYWwvbmVjZXNzYXJ5KioKCkhlcmUgYXJlIHRoZSBjb3VudHJpZXMgdGhhdCBkZXJvZ2F0ZWQgYW5kIGRpZCBub3QgcHJvdmlkZSBhbiBlbmQgZGF0ZSBvciB1c2UgcHJvcG9ydGlvbmFsIG1lYXN1cmVzOgoKYGBge3J9CnBhbmRlbV9kZXJvZyAlPiUgCiAgZmlsdGVyKHR5cGUgPT0gIkIiKSAlPiUgCiAgc2VsZWN0KGNvdW50cnlfbmFtZSwgZGVyb2dhdGlvbl9zdGFydCwgZGVyb2dhdGlvbl9lbmQsIG5vbnByb3BvcnRpb25hbCkKYGBgCgoqKkM6IEVtZXJnZW5jeSBkZWNsYXJlZCBidXQgbm8gZm9ybWFsIGRlcm9nYXRpb24qKgoKSGVyZSBhcmUgdGhlIElDQ1BSIHNpZ25hdG9yeSBjb3VudHJpZXMgdGhhdCBkZWNsYXJlZCBhbiBlbWVyZ2VuY3kgYnV0IGRpZCBub3QgZm9ybWFsbHkgZGVyb2dhdGU6CgpgYGB7cn0KcGFuZGVtX2Rlcm9nICU+JSAKICBmaWx0ZXIodHlwZSA9PSAiQyIpICU+JSAKICBhcnJhbmdlKGNvdW50cnlfbmFtZSkgJT4lIAogIHB1bGwoY291bnRyeV9uYW1lKSAlPiUgCiAgbWF0cml4X2Zyb21fdmVjdG9yKG5jb2wgPSA0KSAlPiUgCiAga2JsKCkgJT4lIAogIGthYmxlX3N0eWxpbmcoKQpgYGAKCioqRDogTm8gZW1lcmdlbmN5LCBubyBmb3JtYWwgZGVyb2dhdGlvbioqCgpBbmQgaGVyZSBhcmUgdGhlIElDQ1BSIHNpZ25hdG9yeSBjb3VudHJpZXMgdGhhdCBoYWQgbm8gZm9ybWFsIGxlZ2FsIGVtZXJnZW5jeSBhbmQgZGlkIG5vdCBkZXJvZ2F0ZToKCmBgYHtyfQpwYW5kZW1fZGVyb2cgJT4lIAogIGZpbHRlcih0eXBlID09ICJEIikgJT4lIAogIGFycmFuZ2UoY291bnRyeV9uYW1lKSAlPiUgCiAgcHVsbChjb3VudHJ5X25hbWUpICU+JSAKICBtYXRyaXhfZnJvbV92ZWN0b3IobmNvbCA9IDQpICU+JSAKICBrYmwoKSAlPiUgCiAga2FibGVfc3R5bGluZygpCmBgYAoKCiMgSHVtYW4gcmlnaHRzIHZpb2xhdGlvbnMgYW5kIGRlbW9jcmF0aWMgYmFja3NsaWRpbmcKCkFuIG92ZXJhcmNoaW5nIGZlYXIgYXMgY291bnRyaWVzIGRlY2xhcmVkIGVtZXJnZW5jeSBwYW5kZW1pYyBtZWFzdXJlcyBpcyB0aGF0IHRoZXNlIG1lYXN1cmVzIHdvdWxkIHNlcnZlIGFzIGFuIGV4Y3VzZSB0byB2aW9sYXRlIGh1bWFuIHJpZ2h0cywgbGltaXQgdGhlIHNwYWNlIGZvciBjaXZpbCBzb2NpZXR5LCBhbmQgbGVhZCB0byBkZW1vY3JhdGljIGJhY2tzbGlkaW5nLgoKVGhlIHZhcmlldHkgb2YgcGFuZGVtaWMtanVzdGlmaWVkIGh1bWFuIHJpZ2h0cyB2aW9sYXRpb25zIGRpZmZlcnMgYnkgY291bnRyaWVzJyBmb3JtYWwgcmVzcG9uc2VzLiBUaG9zZSB0aGF0IGltcGxlbWVudGVkIGVtZXJnZW5jeSBtZWFzdXJlcyB3aXRob3V0IGEgZm9ybWFsIGxlZ2FsIHByb2Nlc3Mgd2VyZSBtb3JlIGxpa2VseSB0byB2aW9sYXRlIG5vbi1kZXJvZ2FibGUgcmlnaHRzIGFuZCBlbmdhZ2UgaW4gZGlzY3JpbWluYXRvcnkgbWVhc3VyZXMuIFN1cnByaXNpbmdseSwgdGhvc2UgdGhhdCB1c2VkIGxlZ2FsIGluc3RydW1lbnRzIHdlcmUgbW9yZSBsaWtlbHkgdG8gZW5mb3JjZSB0aGVzZSBtZWFzdXJlcyBoYXJzaGx5LCBwb3RlbnRpYWxseSBiZWNhdXNlIHRoZXJlIHdhcyBhIGZvcm1hbCBwcm9jZXNzIGJhY2tpbmcgdXAgdGhlIG1lYXN1cmVz4oCUdGhlcmUgYXJlIGxlZ2lzbGF0aXZlIHRlZXRoLCBzbyB0byBzcGVhay4KCmBgYHtyIHZpb2xhdGlvbi1wbG90cywgZmlnLndpZHRoPTYsIGZpZy5oZWlnaHQ9OSwgZmlnLmFzcD1OVUxMfQp2aW9sYXRpb25fc3VtbWFyeSA8LSBwYW5kZW1fZGVyb2cgJT4lIAogIGdyb3VwX2J5KGVtbGF3X2NvbmRfbWluKSAlPiUgCiAgc3VtbWFyaXplKGFjcm9zcyhjKGRpc2NyaW0sIG5kcmlnaHRzLCBwb212aW9sKSwKICAgICAgICAgICAgICAgICAgIH5tZWFuKC4pKSkKCnBsb3RfdmlvbGF0aW9uX25kcmlnaHRzIDwtIHZpb2xhdGlvbl9zdW1tYXJ5ICU+JSAKICBwaXZvdF9sb25nZXIoLWVtbGF3X2NvbmRfbWluKSAlPiUgCiAgZmlsdGVyKG5hbWUgPT0gIm5kcmlnaHRzIikgJT4lIAogIGdncGxvdChhZXMoeCA9IHZhbHVlLCB5ID0gZmN0X3JldihlbWxhd19jb25kX21pbiksIGNvbG9yID0gZW1sYXdfY29uZF9taW4pKSArCiAgZ2VvbV9wb2ludHJhbmdlKGFlcyh4bWluID0gMCwgeG1heCA9IHZhbHVlKSkgKwogIGd1aWRlcyhjb2xvciA9IEZBTFNFKSArCiAgc2NhbGVfeF9jb250aW51b3VzKGxhYmVscyA9IHBlcmNlbnRfZm9ybWF0KGFjY3VyYWN5ID0gMSkpICsKICBzY2FsZV95X2Rpc2NyZXRlKGxhYmVscyA9IGZ1bmN0aW9uKHgpIHN0cl93cmFwKHgsIHdpZHRoID0gMTUpKSArCiAgc2NhbGVfY29sb3JfdmlyaWRpc19kKG9wdGlvbiA9ICJwbGFzbWEiLCBlbmQgPSAwLjgpICsKICBsYWJzKHggPSAiUHJvcG9ydGlvbiB2aW9sYXRpbmcgbm9uLWRlcm9nYWJsZSByaWdodHMiLCB5ID0gTlVMTCwKICAgICAgIHRpdGxlID0gIlZpb2xhdGlvbnMgb2Ygbm9uZGVyb2dhYmxlIHJpZ2h0cyIpICsKICB0aGVtZV9wYW5kZW0oKSArCiAgdGhlbWUocGFuZWwuZ3JpZC5tYWpvci55ID0gZWxlbWVudF9ibGFuaygpKQoKcGxvdF92aW9sYXRpb25fZGlzY3JpbSA8LSB2aW9sYXRpb25fc3VtbWFyeSAlPiUgCiAgcGl2b3RfbG9uZ2VyKC1lbWxhd19jb25kX21pbikgJT4lIAogIGZpbHRlcihuYW1lID09ICJkaXNjcmltIikgJT4lIAogIGdncGxvdChhZXMoeCA9IHZhbHVlLCB5ID0gZmN0X3JldihlbWxhd19jb25kX21pbiksIGNvbG9yID0gZW1sYXdfY29uZF9taW4pKSArCiAgZ2VvbV9wb2ludHJhbmdlKGFlcyh4bWluID0gMCwgeG1heCA9IHZhbHVlKSkgKwogIGd1aWRlcyhjb2xvciA9IEZBTFNFKSArCiAgc2NhbGVfeV9kaXNjcmV0ZShsYWJlbHMgPSBmdW5jdGlvbih4KSBzdHJfd3JhcCh4LCB3aWR0aCA9IDE1KSkgKwogIHNjYWxlX2NvbG9yX3ZpcmlkaXNfZChvcHRpb24gPSAicGxhc21hIiwgZW5kID0gMC44KSArCiAgbGFicyh4ID0gIkF2ZXJhZ2UgZGlzY3JpbWluYXRvcnkgbWVhc3VyZXMiLCB5ID0gTlVMTCwKICAgICAgIGNhcHRpb24gPSAiT3JpZ2luYWwgc2NhbGUgcmFuZ2VzIGZyb20gMOKAkzMiLAogICAgICAgdGl0bGUgPSAiRGlzY3JpbWluYXRvcnkgbWVhc3VyZXMiKSArCiAgdGhlbWVfcGFuZGVtKCkgKwogIHRoZW1lKHBhbmVsLmdyaWQubWFqb3IueSA9IGVsZW1lbnRfYmxhbmsoKSkKCnBsb3RfdmlvbGF0aW9uX3BvbXZpb2wgPC0gdmlvbGF0aW9uX3N1bW1hcnkgJT4lIAogIHBpdm90X2xvbmdlcigtZW1sYXdfY29uZF9taW4pICU+JSAKICBmaWx0ZXIobmFtZSA9PSAicG9tdmlvbCIpICU+JSAKICBnZ3Bsb3QoYWVzKHggPSB2YWx1ZSwgeSA9IGZjdF9yZXYoZW1sYXdfY29uZF9taW4pLCBjb2xvciA9IGVtbGF3X2NvbmRfbWluKSkgKwogIGdlb21fcG9pbnRyYW5nZShhZXMoeG1pbiA9IDAsIHhtYXggPSB2YWx1ZSkpICsKICBndWlkZXMoY29sb3IgPSBGQUxTRSkgKwogIHNjYWxlX3lfZGlzY3JldGUobGFiZWxzID0gZnVuY3Rpb24oeCkgc3RyX3dyYXAoeCwgd2lkdGggPSAxNSkpICsKICBzY2FsZV9jb2xvcl92aXJpZGlzX2Qob3B0aW9uID0gInBsYXNtYSIsIGVuZCA9IDAuOCkgKwogIGxhYnMoeCA9ICJBdmVyYWdlIGFidXNpdmUgZW5mb3JjZW1lbnQiLCB5ID0gTlVMTCwKICAgICAgIGNhcHRpb24gPSAiT3JpZ2luYWwgc2NhbGUgcmFuZ2VzIGZyb20gMOKAkzMiLAogICAgICAgdGl0bGUgPSAiQWJ1c2l2ZSBlbmZvcmNlbWVudCIpICsKICB0aGVtZV9wYW5kZW0oKSArCiAgdGhlbWUocGFuZWwuZ3JpZC5tYWpvci55ID0gZWxlbWVudF9ibGFuaygpKQoKcGxvdF92aW9sYXRpb25fZGlzY3JpbSAvIHBsb3RfdmlvbGF0aW9uX25kcmlnaHRzIC8gcGxvdF92aW9sYXRpb25fcG9tdmlvbApgYGAKClRoZSBsZXZlbCBvZiBjaXZpbCBzb2NpZXR5IG9wZW5uZXNzIHZhcmllcyBzdWJzdGFudGlhbGx5IGFjcm9zcyB0aGVzZSBmb3VyIHR5cGVzIG9mIGRlcm9nYXRpb25zLiBDb3VudHJpZXMgdGhhdCBmb3JtYWxseSBkZXJvZ2F0ZWQgaGF2ZSBmYXIgbW9yZSBvcGVuIGNpdmlsIHNvY2lldHkgdGhhbiB0aG9zZSB0aGF0IGRpZCBub3QgZGVyb2dhdGUuIEhvd2V2ZXIsIGNpdmlsIHNvY2lldHkgb3Blbm5lc3MgaXNuJ3QgbmVjZXNzYXJpbHkgYSBzdHJvbmcgcHJlZGljdG9yIG9mIHdoZXRoZXIgZW1lcmdlbmN5IG1lYXN1cmVzIGFyZSB0ZW1wb3Jhcnkgb3IgcHJvcG9ydGlvbmFsLiBUaGUgNSBkZXJvZ2F0aW5nIGNvdW50cmllcyB0aGF0IGVuZGVkIHVwIGFidXNpbmcgdGhlaXIgcHJpdmlsZWdlcyBoYXZlIHJlbGF0aXZlbHkgdW5yZXN0cmljdGVkIGFuZCBmcmVlbHkgcmVndWxhdGVkIGNpdmlsIHNvY2lldGllcy4gCgpDb3VudHJpZXMgdGhhdCBkaWQgbm90IG9mZmljaWFsIGRlcm9nYXRlIGhhdmUgbW9yZSByZXN0cmljdGVkIHNwYWNlIGZvciBjaXZpbCBzb2NpZXR5LCBhbmQgY291bnRyaWVzIHRoYXQgZGlkIG5vdCBpc3N1ZSBhIGZvcm1hbCBsZWdhbCBlbWVyZ2VuY3kgYW5kIGRpZCBub3QgZm9ybWFsbHkgZGVyb2dhdGUgdGVuZCB0byBoYXZlIGFuIGV2ZW4gbG93ZXIgYXZlcmFnZSBjaXZpbCBzb2NpZXR5IGluZGV4LiBOb3Qgc3VycHJpc2luZ2x5LCBjb3VudHJpZXMgdGhhdCBoYXZlIG5vdCByYXRpZmllZCB0aGUgSUNDUFIgaGF2ZSBoaWdobHkgcmVzdHJpY3RlZCBjaXZpbCBzb2NpZXRpZXMuCgpgYGB7ciBjc3NpLWRlcm9nYXRpb259CnBhbmRlbV9kZXJvZyAlPiUgCiAgZ2dwbG90KGFlcyh4ID0gdjJ4Y3NfY2NzaSwgeSA9IGZjdF9yZXYodHlwZV9jbGVhbl9sZXR0ZXIpLCBjb2xvciA9IHR5cGVfY2xlYW5fbGV0dGVyKSkgKwogIHN0YXRfc3VtbWFyeShhZXMoZmlsbCA9IHR5cGVfY2xlYW5fbGV0dGVyKSwgZ2VvbSA9ICJwb2ludCIsIGZ1biA9ICJtZWFuIiwgCiAgICAgICAgICAgICAgIHNpemUgPSA0LCBwY2ggPSAyMywgY29sb3IgPSAid2hpdGUiLCBhbHBoYSA9IDAuNCwgCiAgICAgICAgICAgICAgIHBvc2l0aW9uID0gcG9zaXRpb25fbnVkZ2UoeCA9IDAsIHkgPSAtMC4yKSkgKwogIGdlb21fcXVhc2lyYW5kb20oZ3JvdXBPblggPSBGQUxTRSwgd2lkdGggPSAwLjEpICsKICBndWlkZXMoY29sb3IgPSBGQUxTRSwgZmlsbCA9IEZBTFNFKSArCiAgc2NhbGVfeV9kaXNjcmV0ZShsYWJlbHMgPSBmdW5jdGlvbih4KSBzdHJfd3JhcCh4LCB3aWR0aCA9IDE1KSkgKwogIHNjYWxlX2NvbG9yX3ZpcmlkaXNfZChvcHRpb24gPSAicGxhc21hIiwgZW5kID0gMC44KSArCiAgc2NhbGVfZmlsbF92aXJpZGlzX2Qob3B0aW9uID0gInBsYXNtYSIsIGVuZCA9IDAuOCkgKwogIGNvb3JkX2NhcnRlc2lhbih4bGltID0gYygwLCAxKSkgKwogIGxhYnMoeCA9ICJBdmVyYWdlIFYtRGVtIGNvcmUgY2l2aWwgc29jaWV0eSBpbmRleCIsIHkgPSBOVUxMLAogICAgICAgY2FwdGlvbiA9ICJEaWFtb25kcyBzaG93IG1lYW4gdmFsdWU7IGxvd2VyIHZhbHVlcyBpbmRpY2F0ZSBtb3JlIGxpbWl0ZWQgY2l2aWwgc29jaWV0eSIpICsKICB0aGVtZV9wYW5kZW0oKSArCiAgdGhlbWUocGFuZWwuZ3JpZC5tYWpvci55ID0gZWxlbWVudF9ibGFuaygpKQpgYGAKCgpgYGB7ciBtZXNzYWdlPUZBTFNFfQpwYW5kZW1fZGVyb2cgJT4lIAogIGdncGxvdChhZXMoeCA9IHYyeGNzX2Njc2ksIHkgPSBwYW5kZW0pKSArCiAgZ2VvbV9wb2ludChhZXMoY29sb3IgPSB0eXBlX2NsZWFuX2xldHRlcikpICsKICBnZW9tX3Ntb290aChtZXRob2QgPSAibG0iKSArCiAgc2NhbGVfY29sb3JfdmlyaWRpc19kKG9wdGlvbiA9ICJwbGFzbWEiLCBlbmQgPSAwLjk1KSArCiAgZ3VpZGVzKGNvbG9yID0gZ3VpZGVfbGVnZW5kKG5jb2wgPSAyKSkgKwogIGNvb3JkX2NhcnRlc2lhbih4bGltID0gYygwLCAxKSkgKwogIGxhYnMoeCA9ICJWLURlbSBjb3JlIGNpdmlsIHNvY2lldHkgaW5kZXgiLCB5ID0gIlBhbmRlbWljIHZpb2xhdGlvbnMgaW5kZXgiLCBjb2xvciA9IE5VTEwpICsKICB0aGVtZV9wYW5kZW0oKQpgYGAKCmBgYHtyIG1lc3NhZ2U9RkFMU0V9CnBhbmRlbV9kZXJvZyAlPiUgCiAgZ2dwbG90KGFlcyh4ID0gdjJ4Y3NfY2NzaSwgeSA9IHBhbmJhY2spKSArCiAgZ2VvbV9wb2ludChhZXMoY29sb3IgPSB0eXBlX2NsZWFuX2xldHRlcikpICsKICBnZW9tX3Ntb290aChtZXRob2QgPSAiZ2FtIikgKwogIHNjYWxlX2NvbG9yX3ZpcmlkaXNfZChvcHRpb24gPSAicGxhc21hIiwgZW5kID0gMC45NSkgKwogIGd1aWRlcyhjb2xvciA9IGd1aWRlX2xlZ2VuZChuY29sID0gMikpICsKICBjb29yZF9jYXJ0ZXNpYW4oeGxpbSA9IGMoMCwgMSksIHlsaW0gPSBjKDAsIDAuNSkpICsKICBsYWJzKHggPSAiVi1EZW0gY29yZSBjaXZpbCBzb2NpZXR5IGluZGV4IiwgeSA9ICJQYW5kZW1pYyBiYWNrc2xpZGluZyBpbmRleCIsIGNvbG9yID0gTlVMTCkgKwogIHRoZW1lX3BhbmRlbSgpCmBgYAoKYGBge3IgbWVzc2FnZT1GQUxTRX0KcGFuZGVtX2Rlcm9nICU+JSAKICBnZ3Bsb3QoYWVzKHggPSB2MnhfbGliZGVtLCB5ID0gcGFuZGVtKSkgKwogIGdlb21fcG9pbnQoYWVzKGNvbG9yID0gdHlwZV9jbGVhbl9sZXR0ZXIpKSArCiAgZ2VvbV9zbW9vdGgobWV0aG9kID0gImxtIikgKwogIHNjYWxlX2NvbG9yX3ZpcmlkaXNfZChvcHRpb24gPSAicGxhc21hIiwgZW5kID0gMC44KSArCiAgZ3VpZGVzKGNvbG9yID0gZ3VpZGVfbGVnZW5kKG5jb2wgPSAyKSkgKwogIGxhYnMoeCA9ICJWLURlbSBsaWJlcmFsIGRlbW9jcmFjeSBpbmRleCIsIHkgPSAiUGFuZGVtaWMgdmlvbGF0aW9ucyBpbmRleCIsIGNvbG9yID0gTlVMTCkgKwogIHRoZW1lX3BhbmRlbSgpCmBgYAoKYGBge3IgbWVzc2FnZT1GQUxTRX0KcGFuZGVtX2Rlcm9nICU+JSAKICBnZ3Bsb3QoYWVzKHggPSB2MnhfbGliZGVtLCB5ID0gcGFuYmFjaykpICsKICBnZW9tX3BvaW50KGFlcyhjb2xvciA9IHR5cGVfY2xlYW5fbGV0dGVyKSkgKwogIGdlb21fc21vb3RoKG1ldGhvZCA9ICJnYW0iKSArCiAgc2NhbGVfY29sb3JfdmlyaWRpc19kKG9wdGlvbiA9ICJwbGFzbWEiLCBlbmQgPSAwLjgpICsKICBndWlkZXMoY29sb3IgPSBndWlkZV9sZWdlbmQobmNvbCA9IDIpKSArCiAgY29vcmRfY2FydGVzaWFuKHlsaW0gPSBjKDAsIDAuNSkpICsKICBsYWJzKHggPSAiVi1EZW0gbGliZXJhbCBkZW1vY3JhY3kgaW5kZXgiLCB5ID0gIlBhbmRlbWljIGJhY2tzbGlkaW5nIGluZGV4IiwgY29sb3IgPSBOVUxMKSArCiAgdGhlbWVfcGFuZGVtKCkKYGBgCgoKYGBge3IgZXZhbD1GQUxTRSwgaW5jbHVkZT1GQUxTRX0KcGFuZGVtX3N1bW1hcnkgPC0gcGFuZGVtX3NpbmdsZSAlPiUKICBncm91cF9ieShlbWxhd19jb25kX21pbikgJT4lIAogIHN1bW1hcml6ZShhY3Jvc3MoYyh2MnhfbGliZGVtLCB2MnhfcmVnaW1lLCBwYW5kZW0sIHBhbmJhY2ssIG5kcmlnaHRzKSwKICAgICAgICAgICAgICAgICAgIH4gdGliYmxlKG4gPSBsZW5ndGgoLiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZWFuID0gbWVhbiguKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlID0gc2QoLikgLyBzcXJ0KG4pLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdXBwZXIgPSBtZWFuICsgKHFub3JtKDAuOTc1KSAqIHNlKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvd2VyID0gbWVhbiArIChxbm9ybSgwLjAyNSkgKiBzZSkpKSkgJT4lIAogIHBpdm90X2xvbmdlcihjKHYyeF9saWJkZW0sIHYyeF9yZWdpbWUsIHBhbmRlbSwgcGFuYmFjaywgbmRyaWdodHMpKSAlPiUgCiAgdW5wYWNrKHZhbHVlKQoKcGFuZGVtX3N1bW1hcnkgJT4lIAogIGZpbHRlcihuYW1lID09ICJuZHJpZ2h0cyIpICU+JSAKICBnZ3Bsb3QoYWVzKHggPSBtZWFuLCB5ID0gZmN0X3JldihlbWxhd19jb25kX21pbiksIGNvbG9yID0gZW1sYXdfY29uZF9taW4pKSArCiAgZ2VvbV9wb2ludHJhbmdlKGFlcyh4bWluID0gMCwgeG1heCA9IG1lYW4pKSArCiAgZ3VpZGVzKGNvbG9yID0gRkFMU0UpICsKICBzY2FsZV94X2NvbnRpbnVvdXMobGFiZWxzID0gcGVyY2VudF9mb3JtYXQoYWNjdXJhY3kgPSAxKSkgKwogIHNjYWxlX2NvbG9yX3ZpcmlkaXNfZChvcHRpb24gPSAicGxhc21hIiwgZW5kID0gMC44KSArCiAgbGFicyh4ID0gIlByb3BvcnRpb24gdmlvbGF0aW5nIG5vbi1kZXJvZ2FibGUgcmlnaHRzIiwgeSA9IE5VTEwpICsKICB0aGVtZV9wYW5kZW0oKSArCiAgdGhlbWUocGFuZWwuZ3JpZC5tYWpvci55ID0gZWxlbWVudF9ibGFuaygpKQoKCnBhbmRlbV9zaW5nbGUgJT4lIAogIGdncGxvdChhZXMoeCA9IGFzLmZhY3RvcihuZHJpZ2h0cyksIHkgPSBlbWxhd19jb25kX21pbiwgY29sb3IgPSBlbWxhd19jb25kX21pbikpICsKICBnZW9tX3BvaW50KHBvc2l0aW9uID0gcG9zaXRpb25faml0dGVyKHdpZHRoID0gMC4xLCBoZWlnaHQgPSAwLjIpKSArCiAgc2NhbGVfY29sb3JfdmlyaWRpc19kKG9wdGlvbiA9ICJwbGFzbWEiLCBlbmQgPSAwLjgpICsKICAjIHNjYWxlX3hfY29udGludW91cyhicmVha3MgPSBjKDAsIDEpKSArCiAgbGFicyh4ID0gIlByb3BvcnRpb24gdmlvbGF0aW5nIG5vbi1kZXJvZ2FibGUgcmlnaHRzIiwgeSA9IE5VTEwpICsKICB0aGVtZV9wYW5kZW0oKSArCiAgdGhlbWUocGFuZWwuZ3JpZC5tYWpvci55ID0gZWxlbWVudF9ibGFuaygpKQoKcGFuZGVtX3NpbmdsZSAlPiUgCiAgZ2dwbG90KGFlcyh4ID0gdjJ4X2xpYmRlbSwgeSA9IHBhbmRlbSkpICsKICBnZW9tX3BvaW50KGFlcyhjb2xvciA9IGVtbGF3X2NvbmRfbWluKSkgKwogIGdlb21fc21vb3RoKG1ldGhvZCA9ICJsbSIpICsKICBzY2FsZV9jb2xvcl92aXJpZGlzX2Qob3B0aW9uID0gInBsYXNtYSIsIGVuZCA9IDAuOCkgKwogIGxhYnMoeCA9ICJWLURlbSBsaWJlcmFsIGRlbW9jcmFjeSBpbmRleCIsIHkgPSAiUGFuZGVtaWMgdmlvbGF0aW9ucyBpbmRleCIsIGNvbG9yID0gTlVMTCkgKwogIHRoZW1lX3BhbmRlbSgpICsKICB0aGVtZShwYW5lbC5ncmlkLm1ham9yLnkgPSBlbGVtZW50X2JsYW5rKCkpCmBgYAoK