This file replicates all figures and tables from Chapter 4: Data and Research Design.
Figure 4.1: Aid Flows Before and After Conflict Termination
# Load Libraries
library(tidyverse)
library(foreign)
library(countrycode)
library(cowplot)
library(tikzDevice)
# Read data files
load("./data/diss_df.rda")
aid <- read.dta("./data/aiddata_full.dta")
ucdp_cy <- read_csv("./data/133280_onset2012csv.csv")
# load two small helper function to determine pre- and post-conflict years
ag_seq <- function(x) {
runs <- cumsum(c(0, diff(x) != 1 ))
return(runs)
}
source("./functions/identifyPostConflictYears.R")
# load and wrangle ucdp data
ucdp_cy <- ucdp_cy %>%
arrange(gwno, year) %>%
group_by(gwno) %>%
mutate(iso2c = countrycode(gwno, "cown", "iso2c"),
ucdp_dummy = ifelse(incidencev412 == 1, 1, 0),
pc = pcIdentifier(ucdp_dummy),
pc = ifelse(pc == 2, 1, 0),
conflict_ep_id = cumsum(c(ifelse(first(ucdp_dummy) == 1,
1, 0),
diff(ucdp_dummy) != 0)),
conflict_ep_id = as.numeric(ifelse(ucdp_dummy == 1,
conflict_ep_id,
NA)),
peace_ep_id = cumsum(c(ifelse(first(pc) == 2,
2, 1),
diff(pc) != 0)),
peace_ep_id = as.numeric(ifelse(pc == 1, peace_ep_id, NA)))%>%
group_by(gwno, conflict_ep_id) %>%
mutate(conflict_year = -1 * rev(cumsum(ucdp_dummy == 1))) %>%
group_by(gwno, peace_ep_id) %>%
mutate(peace_year = cumsum(pc == 1)) %>%
group_by(gwno) %>%
mutate(conf_and_peace_years = conflict_year + peace_year)
# Merge in Aid data
ucdp_cy <- left_join(ucdp_cy,
aid,
by = c("iso2c" = "iso2", "year")) %>%
filter(year >= 1989) %>%
dplyr::rename(wb_AidGNI = DT_ODA_ODAT_GN_ZS,
wb_AidPC = DT_ODA_ODAT_PC_ZS,
wb_AidGmentXP = DT_ODA_ODAT_XP_ZS,
oecd_Aid = aid_oecd_commitment2011USD,
oecd_Aid_mill = aid_oecd_commitment2011USD_mill,
aiddata_Aid = commitment_amount_usd_constant)
ucdp_cy_df <- ucdp_cy %>%
filter(conf_and_peace_years >= -5 &
conf_and_peace_years <= 5 &
conf_and_peace_years != 0) %>%
group_by(conf_and_peace_years)
conf_pc_aid_plot <- ggplot(ucdp_cy_df,
aes(x = conf_and_peace_years,
y = log(aiddata_Aid / population),
color = factor(pc))) +
geom_jitter(data = ucdp_cy_df %>%
filter(log(aiddata_Aid / population) < 5 &
log(aiddata_Aid / population) > 0),
width = 0.2,
alpha = 0.55) +
geom_smooth(data = ucdp_cy_df %>%
filter(pc == 1),
inherit.aes = T,
method = "loess") +
geom_smooth(data = ucdp_cy_df %>%
filter(pc == 0),
method = "loess") +
scale_x_continuous(breaks = -10:10) +
scale_color_manual(values = c("#e41a1c", "#2ca25f" )) +
geom_vline(aes(xintercept = 0), color = "black") +
theme(legend.position = "none") +
labs(x = "Years before / after end of internal armed conflict",
y = "Aid per capita (log)")
# This piece of code generates the plot to included in the .tex doc
# options( tikzDocumentDeclaration = "\\documentclass[11pt]{article}" )
# tikz("../figures/pc_aid_flows.tex", height = 4.5)
# plot_grid(conf_pc_aid_plot,
# align = "v", nrow = 1)
# dev.off()
# Output replication plot
print(conf_pc_aid_plot)

Figure 4.2: Distribution of Post-Conflict Democratic and Autocratic Change
# Libraries
library(dplyr)
library(ggplot2)
library(tikzDevice)
library(cowplot)
library(gridExtra)
# Democratization Scores
hist_polity <- ggplot(diss_df, aes(x = polity_chng)) +
geom_histogram(color = "black", fill = "white", bins = 10) +
theme_bw() +
labs(x = "Polity", y = "Frequency") +
geom_vline(aes(xintercept = mean(polity_chng, na.rm = T)), color = "red",
linetype = "dashed", size = 1)
hist_fh <- ggplot(diss_df, aes(x = fh_chng)) +
geom_histogram(color = "black", fill = "white", bins = 7) +
theme_bw() +
labs(x = "Freedom House", y = "Frequency") +
geom_vline(aes(xintercept = mean(fh_chng, na.rm = T)), color = "red",
linetype = "dashed", size = 1)
# Output manuscript
# options(tikzDocumentDeclaration = "\\documentclass[16pt]{article}")
# tikz("../figures/descriptive_stats_polityFH.tex", height = 2.5)
# plot_grid(hist_polity, hist_fh, ncol = 2)
# dev.off()
# Output replication archive
plot_grid(hist_polity, hist_fh, ncol = 2)

Figure 4.3: Elections in Post-Conflict Countries
# Libraries
library(tidyverse)
library(foreign)
library(countrycode)
library(cowplot)
library(tikzDevice)
library(lubridate)
# Load data
load("./data/nelda_ps.rda")
# prepare data
nelda_desc_obs_table <- nelda_ps %>%
mutate(mmdd = ifelse(nchar(mmdd) == 3, paste0("0", mmdd), mmdd),
date = paste0(year, mmdd)) %>%
mutate(date = ymd(date)) %>%
arrange(country) %>%
dplyr::mutate(year = year(date),
date = format(date, "%d.%m.%Y"),
cabinetCOUNT = as.integer(cabinetCOUNT)) %>%
dplyr::mutate(election_string = paste(date, types, sep = " ")) %>%
group_by(country, year, types)
# generate plot
election_plot <- ggplot(nelda_desc_obs_table,
aes(x = year, fill = types)) +
geom_bar(aes(alpha = factor(-quality)),
stat = "bin", bins = length(unique(nelda_desc_obs_table$year))) +
facet_wrap( ~ country, labeller = (country = label_wrap_gen(50)),
ncol = 3) +
scale_y_continuous(breaks = 0:5) +
scale_fill_brewer(palette = "Dark2", guide = guide_legend(title = NULL)) +
theme_bw() +
scale_alpha_discrete(guide = "none") +
theme(legend.position = "bottom") +
labs(x = "", y = "Number of Elections in given year")
# Output for manuscript
# options( tikzDocumentDeclaration = "\\documentclass[12pt]{article}" )
# tikz("../figures/elections_instances.tex", height = 12)
# print(election_plot)
# dev.off()
# Output for replication archive
print(election_plot)

Figure 4.4: Trends in Power-Sharing Governments
# Libraries
library(tidyverse)
library(cowplot)
library(tikzDevice)
# Data
load("./data/diss_df.rda")
# Plot Power-Sharing
plotpscount <- diss_df %>%
group_by(year) %>%
summarise(cabinetCOUNT = sum(cabinetCOUNT),
seniorCOUNT = sum(seniorCOUNT),
nonseniorCOUNT = sum(nonseniorCOUNT)) %>%
gather(pstype, count, seniorCOUNT, nonseniorCOUNT) %>%
ggplot(., aes(x = year, y = count, group = pstype)) +
geom_area( aes(fill = pstype)) +
scale_fill_brewer("",
breaks=c("seniorCOUNT", "nonseniorCOUNT"),
labels = c("Power-Sharing (senior positions)",
"Power-Sharing (nonsenior positions)")) +
theme(legend.position = "none") +
labs(y = "Number of Cabinet Seats",
x = "Year",
title = "Counts of Rebel Seats \n in all country-years")
plotpsinc <- diss_df %>%
group_by(year) %>%
summarise(cabinetINC = sum(cabinetINC),
seniorINC = sum(ifelse(seniorCOUNT > 0, 1, 0)),
nonseniorINC = sum(ifelse(nonseniorCOUNT > 0, 1, 0)),
cabinetCOUNT = sum(cabinetCOUNT),
seniorCOUNT = sum(seniorCOUNT),
nonseniorCOUNT = sum(nonseniorCOUNT)) %>%
gather(pstype, count, seniorINC, nonseniorINC) %>%
ggplot(., aes(x = year, y = count, group = pstype)) +
scale_y_continuous(breaks = c(0, 2, 4, 6, 8)) +
geom_area( aes(fill = pstype)) +
scale_fill_brewer("",
breaks=c("seniorINC", "nonseniorINC"),
labels = c("Power-Sharing (senior positions)",
"Power-Sharing (nonsenior positions)")) +
theme(legend.position = "none") +
labs(y = "Number of Country-Years",
x = "Year",
title = "Instances of Power-Sharing \n in all country-years")
psplots_legend <- get_legend(plotpscount + theme(legend.position = "bottom",
legend.direction = "vertical"))
# Plot using tikz
# this is required to get point sizes right
options( tikzDocumentDeclaration = "\\documentclass[15pt]{article}" )
# tikz("../figures/trendps.tex", height = 4)
# plot_grid(plot_grid(plotpsinc,
# plotpscount,
# nrow = 1,
# align = 'vh'),
# psplots_legend,
# ncol = 1,
# rel_heights = c(1, .2))
# dev.off()
# Output for replication archive
plot_grid(plot_grid(plotpsinc,
plotpscount,
hjust = -1,
nrow = 1,
align = 'vh'),
psplots_legend,
ncol = 1,
rel_heights = c(1, .2))

Figure 4.6: Establishing Face Validity of the Relationship between Levels of Aid Commitment and Theoretical Mechanisms
library(tidyverse)
library(countrycode)
library(cowplot)
# Load data
load("./data/nelda_ps.rda")
# data management prior to plotting
nelda_aid <- nelda_ps %>%
mutate(dga = dga / (gdp_per_capita_un * population),
commodity_aid = commodity_aid / (gdp_per_capita_un * population),
program_aid = program_aid / (gdp_per_capita_un * population),
aiddata_Aid = aiddata_Aid / (gdp_per_capita_un * population))
# Was aid threatened to be cut off?
aid_comparison_aidwithheld <- nelda_aid %>%
ungroup() %>%
rename(aid_withheld = nelda57) %>%
mutate(aid_withheld = ifelse(aid_withheld == "N/A", NA, aid_withheld),
aid_withheld = ifelse(aid_withheld == "unclear", NA, aid_withheld),
aid_withheld = ifelse(aid_withheld == 1, "yes", "no")) %>%
dplyr::select(dga, commodity_aid, program_aid, aiddata_Aid, aid_withheld, country, year) %>%
mutate_each(funs(log), -aid_withheld, -country, -year) %>%
gather(key, value, -aid_withheld, -country, -year) %>%
filter(!is.na(value)) %>%
filter(!is.na(aid_withheld)) %>%
mutate(key = forcats::fct_relevel(factor(key),
c("dga", "commodity_aid", "program_aid", "aiddata_Aid")))
# plot the data!
aid_comparison_aidwithheld_plot <- ggplot(aid_comparison_aidwithheld,
aes(x = aid_withheld,
y = value,
group = key)) +
geom_jitter(size = 1.7, alpha = 0.5) +
geom_boxplot(aes(fill = aid_withheld,
group = aid_withheld),
alpha = 0.9) +
facet_wrap( ~ key,
nrow = 1,
labeller = labeller(key = c(dga = "DGA",
aiddata_Aid = "All Aid",
commodity_aid = "Budget Aid",
program_aid = "Program Aid"))) +
scale_fill_brewer(name = "NELDA57: \"Is aid threatened to be cut off?\"") +
theme_bw() +
labs(x = "", y = "Aid / GDP (log)") +
theme(legend.position = "bottom")
# output for manuscript
# library(tikzDevice)
# options( tikzDocumentDeclaration = "\\documentclass[11pt]{article}" )
# tikz("../figures/aidcutoff_boxplots.tex", height = 4)
# print(aid_comparison_aidwithheld_plot)
# dev.off()
# output for replication archive
plot(aid_comparison_aidwithheld_plot)

Table 4.1: List of Countries
library(xtable)
# function to extract years of observation from the dataset
extract_years <- function(df) {
year_start <- subset(df, firstFive == 1, c("year", "firstFive"))
year_between <- subset(df, diff(firstFive) != 1, c("year", "firstFive"))
year_end <- df[nrow(df), c("year", "firstFive")]
years_full <- rbind(year_start, year_between, year_end)
years_full <- years_full[order(years_full$year), ]
# print(years_full)
if(nrow(years_full) == 2) {
years_full <- paste(years_full[, "year"], collapse = "-")
return(years_full)
}
else {
years_string <- vector()
for(i in seq(2, nrow(years_full), 2)) {
years_string <- c(years_string, paste(years_full[(i-1):i, "year"], collapse = "-"))
}
years_full <- paste(years_string, collapse = ", ")
return(years_full)
}
}
# helper function that extracts values from data set
generate_desc <- function(df) {
z <- plyr::ddply(df, plyr::.(GWNo), .fun = function(x) {
c(Country = as.character(unique(x$Location)),
Years = extract_years(x),
MeanAidGDP = round(mean(x$aiddata_AidGDP, na.rm = TRUE), 2),
HasPS = ifelse(1 %in% x$cabinetINC, "Yes", "No"),
MeanPolity = round(mean(x$polity2, na.rm = TRUE), 1),
MeanFH = round(mean(x$fh, na.rm = TRUE),1))
})
return(z)
}
countryList <- generate_desc(diss_df)
countryList <- countryList[order(countryList$Country), ]
# set NA in Elections to zero
# countryList$Elections.TRUE[is.na(countryList$Elections.TRUE)] <- 0
countryList[countryList$GWNo == 437, "Country"] <- "Cote D'Ivoire"
countryList[countryList$GWNo == 490, "Country"] <- "Democratic Republic of Congo"
countryList <- plyr::rename(countryList, c("Years" = "Years obs.",
"MeanAidGDP" = "$\\varnothing \\frac{\\textit{Aid}}{\\textit{GDP}}$",
"HasPS" = "Has PS?",
"MeanPolity" = "$\\varnothing$ Polity IV",
"MeanFH" = "$\\varnothing$ FH"))
# "Elections.TRUE" = "No. of Elections"))
countryList[, 6] <- ifelse(countryList[, 6] == "NaN",
NA,
countryList[, 6])
countryList_p <- xtable(countryList[, 2:ncol(countryList)], digits = 1)
# Output for Document
print(countryList_p,
file = "../output/obs_descr.tex",
NA.string = ".",
include.rownames = FALSE,
floating = FALSE,
booktabs = TRUE,
sanitize.colnames.function = function(x) return(x))
# Output for Replication Archive
print(countryList_p,
type = "html",
NA.string = ".",
include.rownames = FALSE,
floating = FALSE,
booktabs = TRUE,
sanitize.colnames.function = function(x) return(x))
Country
|
Years obs.
|
\(\varnothing \frac{\textit{Aid}}{\textit{GDP}}\)
|
Has PS?
|
\(\varnothing\) Polity IV
|
\(\varnothing\) FH
|
Angola
|
2005-2006
|
1.03
|
Yes
|
-2
|
2.5
|
Azerbaijan
|
1996-2000, 2006-2010
|
2.45
|
No
|
-6.8
|
2.6
|
Bangladesh
|
1993-1997
|
3.02
|
Yes
|
6
|
4.9
|
Bosnia and Herzegovina
|
1996-2000
|
18.61
|
Yes
|
.
|
3.1
|
Burundi
|
2009-2010
|
29.09
|
No
|
6
|
3.2
|
Cambodia
|
1999-2003
|
13.18
|
No
|
2
|
2.3
|
Central African Republic
|
2003-2005, 2007-2008
|
8.62
|
No
|
-1
|
2.8
|
Comoros
|
1990-1994, 1998-2002
|
12.67
|
Yes
|
2.5
|
3.6
|
Congo
|
1994-1996, 2000-2001, 2003-2007
|
8.12
|
No
|
-1.6
|
3.4
|
Cote D’Ivoire
|
2005-2009
|
3.73
|
Yes
|
0
|
2.1
|
Croatia
|
1996-2000
|
0.76
|
No
|
-1.2
|
4.3
|
Democratic Republic of Congo
|
2002-2005, 2009-2010
|
24.38
|
Yes
|
3
|
2
|
Djibouti
|
1995-1998, 2000-2004
|
13.26
|
Yes
|
-1.7
|
2.9
|
El Salvador
|
1992-1996
|
5.1
|
No
|
7
|
5
|
Georgia
|
1994-1998, 2005-2007, 2009-2010
|
6
|
No
|
5.6
|
4.2
|
Guatemala
|
1996-2000
|
1.97
|
No
|
8
|
4.5
|
Guinea-Bissau
|
2000-2004
|
23.9
|
No
|
2.6
|
3.5
|
Haiti
|
1992-1996, 2005-2009
|
10.4
|
No
|
3
|
2.7
|
Indonesia
|
1993-1996, 2006-2010
|
0.98
|
No
|
1.3
|
3.8
|
Lebanon
|
1991-1995
|
1.99
|
No
|
.
|
2.8
|
Lesotho
|
1999-2003
|
9.62
|
No
|
5.6
|
4.6
|
Liberia
|
1991-1995, 2004-2008
|
42.1
|
Yes
|
2.6
|
2.9
|
Macedonia
|
2002-2006
|
4.9
|
Yes
|
9
|
5
|
Mali
|
1991-1993, 1995-1999
|
12.89
|
Yes
|
5.8
|
5.1
|
Mexico
|
1997-2001
|
0.22
|
No
|
6.8
|
4.9
|
Moldova
|
1993-1997
|
5.24
|
No
|
7
|
4
|
Mozambique
|
1993-1997
|
36.12
|
No
|
2.8
|
4
|
Nepal
|
2007-2010
|
5.38
|
Yes
|
6
|
3.9
|
Nicaragua
|
1991-1995
|
16.97
|
No
|
6.4
|
4.1
|
Niger
|
1998-2002, 2009-2010
|
12.01
|
Yes
|
2
|
3.4
|
Nigeria
|
2005-2008
|
2.57
|
No
|
4
|
3.9
|
Panama
|
1990-1994
|
2.92
|
No
|
8.2
|
5
|
Papua New Guinea
|
1997-2001
|
13.89
|
No
|
4
|
5.4
|
Paraguay
|
1990-1994
|
1.32
|
No
|
5
|
4.8
|
Peru
|
2000-2004
|
1.5
|
No
|
8.2
|
5.4
|
Rumania
|
1990-1994
|
0.98
|
No
|
5
|
3.6
|
Russia (Soviet Union)
|
1997-1998
|
2.04
|
No
|
3
|
4.2
|
Rwanda
|
2003-2007
|
23.78
|
No
|
-3
|
2.5
|
Senegal
|
2004-2008
|
9
|
No
|
7.6
|
5.4
|
Serbia
|
1992-1996, 2000-2004
|
6.71
|
No
|
0
|
3.6
|
Sierra Leone
|
2001-2005
|
29.37
|
No
|
4.4
|
4.2
|
Somalia
|
1997-2000, 2003-2005
|
6.64
|
No
|
0
|
1.3
|
Tajikistan
|
1999-2003
|
16.53
|
No
|
-1.4
|
2.2
|
Trinidad and Tobago
|
1991-1995
|
0.48
|
No
|
9
|
6.8
|
Uzbekistan
|
2001-2003, 2005-2009
|
1.67
|
No
|
-9
|
1.2
|
Venezuela
|
1993-1997
|
0.29
|
No
|
8
|
5.2
|
Table 4.4: Countries with Power-Sharing and Elections
library(tidyverse)
load("./data/diss_df.rda")
load("./data/nelda_ps.rda")
countries_withPS <- diss_df %>%
group_by(Location, GWNo) %>%
summarise(country_hadPS = sum(1 %in% cabinetINC))
elections_withPS <- nelda_ps %>%
group_by(country, ccode) %>%
summarise(election_hadPS = sum(1 %in% cabinetINC.12))
countries_withPS <- left_join(countries_withPS,
elections_withPS,
by = c("GWNo" = "ccode")) %>%
group_by(Location) %>%
mutate()
countries_withPS %>% group_by(country_hadPS, election_hadPS) %>%
summarise(countries = paste(Location, collapse = ", ")) %>%
replace_na(list(election_hadPS = 0)) %>%
mutate(category = c("withoutPS_election", "without_PS_noelection", "withPS_electionafterPS",
"withPS_election", "withPS_noelection")) %>%
select(category, countries) %>%
mutate(no_countries = length(unlist(strsplit(countries, ",")))) %>%
spread(category, countries) %>%
select(withPS_election, withPS_electionafterPS, withPS_noelection, withoutPS_election, without_PS_noelection) %>%
knitr::kable()
Nepal, Democratic Republic of Congo (Zaire), Liberia, Comoros, Mali, Niger, Djibouti, Bosnia and Herzegovina, Macedonia |
Bangladesh |
Angola, Cote D’Ivoire |
Paraguay, Guatemala, Lebanon, Venezuela, Burundi, Peru, Cambodia, El Salvador, Indonesia, Mozambique, Panama, Papua New Guinea, Rumania, Rwanda, Senegal, Trinidad and Tobago, Georgia, Haiti, Sierra Leone, Serbia, Azerbaijan, Croatia, Moldova, Tajikistan, Mexico, Congo, Guinea-Bissau, Lesotho, Uzbekistan, Central African Republic, Nigeria |
Nicaragua, Somalia, Russia (Soviet Union) |
How many countries had power-sharing? (Bottom row of table in manuscript)
load("./data/diss_df.rda")
diss_df %>%
group_by(Location) %>%
summarise(had_power_sharing = sum(any(1 %in% cabinetINC))) %>%
group_by(had_power_sharing) %>%
tally()
## # A tibble: 2 × 2
## had_power_sharing n
## <int> <int>
## 1 0 34
## 2 1 12
Table 4.6: Summary Statistics I: Dependent and Key Independent Variables in the Cross-Sectional Sample
library(pastecs)
library(xtable)
load("./data/diss_df.rda")
# For all dependent variables in the cross-section time series sample
sum_stats <- stat.desc(diss_df[ , c("polity2_t2",
"fh_t2",
"v2x_jucon",
"LJI",
"v2dlencmps",
"v2x_corr",
"cabinetCOUNT",
"aiddata_AidGDP",
"dga_gdp_zero",
"program_aid_gdp_zero",
"commodity_aid_gdp_zero",
"nonstate",
"conf_intens",
"ln_gdp_pc",
"ln_pop",
"WBnatres"
)])
# Better variable names
names(sum_stats) <- c("Polity",
"Freedom House",
"Judicial Independence (V-Dem)",
"Judicial Independence (LJI)",
"Particularistic Spending (V-Dem)",
"Political Corruption (V-Dem)",
"Power-Sharing (cabinet)",
"Aid/GDP",
"Democracy and Governance Aid",
"Program Aid",
"Budget Aid",
"Nonstate Conflict",
"Conflict Intensity",
"GDP p/c",
"Population",
"Natural Resource Rents")
# transpose data.frame (rows to colums)
sum_stats <- t(sum_stats)
# keep statistics of interest
sum_stats <- as.data.frame(sum_stats[, c("nbr.val", "min", "max", "mean", "std.dev", "median")])
names(sum_stats) <- c("Obs", "Min", "Max", "Mean", "Std.Dev", "Median")
knitr::kable(sum_stats, digits = 1)
Polity |
263 |
-9.0 |
10.0 |
3.2 |
5.1 |
5.0 |
Freedom House |
272 |
1.0 |
7.0 |
3.8 |
1.4 |
4.0 |
Judicial Independence (V-Dem) |
273 |
0.0 |
0.9 |
0.4 |
0.2 |
0.5 |
Judicial Independence (LJI) |
273 |
0.0 |
0.9 |
0.3 |
0.2 |
0.3 |
Particularistic Spending (V-Dem) |
273 |
-3.0 |
1.7 |
0.0 |
1.0 |
0.1 |
Political Corruption (V-Dem) |
273 |
0.2 |
0.9 |
0.7 |
0.2 |
0.8 |
Power-Sharing (cabinet) |
273 |
0.0 |
17.0 |
0.6 |
2.2 |
0.0 |
Aid/GDP |
273 |
0.0 |
176.7 |
10.2 |
15.5 |
6.6 |
Democracy and Governance Aid |
273 |
0.0 |
13.6 |
1.0 |
1.8 |
0.3 |
Program Aid |
273 |
0.0 |
37.8 |
5.2 |
5.8 |
3.6 |
Budget Aid |
273 |
0.0 |
142.5 |
3.9 |
11.2 |
0.9 |
Nonstate Conflict |
273 |
0.0 |
1.0 |
0.1 |
0.3 |
0.0 |
Conflict Intensity |
273 |
0.0 |
1.0 |
0.3 |
0.5 |
0.0 |
GDP p/c |
273 |
4.4 |
8.8 |
6.7 |
1.0 |
6.6 |
Population |
273 |
12.9 |
19.3 |
15.9 |
1.4 |
15.8 |
Natural Resource Rents |
273 |
0.0 |
82.6 |
10.9 |
16.2 |
3.4 |
The following code generates the sparklines of the variable distributions in the manuscript (which is only feasible for the TeX output):
# Output for manuscript (adds sparklines)
source("./functions/gen_sparkline_hist.R")
digitmat <- matrix(c(5, 0, rep(1, 5), # Polity
5, 0, rep(1, 5), # FH
5, 0, rep(1, 5), # JudInd 1
5, 0, rep(1, 5), # JudInd 2
5, 0, rep(1, 5), # Part Spend
5, 0, rep(1, 5), # Corruption
5, 0, rep(1, 5), # Power-Shainrg
5, 0, rep(1, 5), # Aid
5, 0, rep(1, 5), # Aid
5, 0, rep(1, 5), # Aid
5, 0, rep(1, 5), # Aid
5, 0, rep(1, 5), # nonstate
5, 0, rep(1, 5), # conflict intensity
5, 0, rep(1, 5), # gdp
5, 0, rep(1, 5), # population
5, 0, rep(1, 5)), # wbnatres
ncol = ncol(sum_stats) + 1,
nrow = nrow(sum_stats), byrow = TRUE)
# add column for sparkline
digitmat <- cbind(digitmat, rep(0, nrow(digitmat)))
sum_stats[1, "Distribution"] <- gen_sparkline_hist(diss_df$polity2_t2, 10)
sum_stats[2, "Distribution"] <- gen_sparkline_hist(diss_df$fh_t2, 10)
sum_stats[3, "Distribution"] <- gen_sparkline_hist(diss_df$v2x_jucon, 10)
sum_stats[4, "Distribution"] <- gen_sparkline_hist(diss_df$LJI, 10)
sum_stats[5, "Distribution"] <- gen_sparkline_hist(diss_df$v2dlencmps, 10)
sum_stats[6, "Distribution"] <- gen_sparkline_hist(diss_df$v2x_corr, 10)
sum_stats[7, "Distribution"] <- gen_sparkline_hist(diss_df$cabinetCOUNT, 10)
sum_stats[8, "Distribution"] <- gen_sparkline_hist(log(diss_df$aiddata_AidGDP), 10)
sum_stats[9, "Distribution"] <- gen_sparkline_hist(log(diss_df$dga_gdp_zero + 1), 10)
sum_stats[10, "Distribution"] <- gen_sparkline_hist(log(diss_df$program_aid_gdp_zero + 1), 10)
sum_stats[11, "Distribution"] <- gen_sparkline_hist(log(diss_df$commodity_aid_gdp_zero + 1), 10)
sum_stats[12, "Distribution"] <- gen_sparkline_hist(diss_df$nonstate, 2)
sum_stats[13, "Distribution"] <- gen_sparkline_hist(diss_df$conf_intens, 2)
sum_stats[14, "Distribution"] <- gen_sparkline_hist(diss_df$ln_gdp_pc, 10)
sum_stats[15, "Distribution"] <- gen_sparkline_hist(diss_df$ln_pop, 10)
sum_stats[16, "Distribution"] <- gen_sparkline_hist(diss_df$WBnatres, 10)
# print table
sum_stats <- xtable(sum_stats, digits=digitmat, align = "rrrrrrrc")
print.xtable(sum_stats,
file="../output//summarystats.tex",
type="latex", floating = FALSE, booktabs = TRUE,
sanitize.text.function = function(x){x})
Table 4.6: Summary Statistics II: Dependent and Key Independent Variables in the Elections Sample
library(pastecs)
library(xtable)
load("./data/nelda_ps.rda")
nelda_ps$ln_gdp_pc <- log(nelda_ps$GDP_per_capita)
nelda_ps$ln_pop <- log(nelda_ps$population)
# For all dependent variables in the cross-section time series sample
sum_stats <- stat.desc(nelda_ps[ , c("quality",
"v2xel_frefair",
"cabinetCOUNT.12",
"aiddata_AidGDP",
"dga_gdp_null",
"program_aid_gdp_null",
"budget_aid_gdp_null",
"nonstate",
"conf_intens",
"ln_gdp_pc",
"ln_pop",
"WBnatres"
)])
# Better variable names
names(sum_stats) <- c("NELDA Election Quality",
"V-Dem Clean Election Index",
"Power-Sharing (cabinet)",
"Aid/GDP",
"Democracy and Governance Aid",
"Program Aid",
"Budget Aid",
"Nonstate Conflict",
"Conflict Intensity",
"GDP p/c",
"Population",
"Natural Resource Rents")
# transpose data.frame (rows to colums)
sum_stats <- t(sum_stats)
# keep statistics of interest
sum_stats <- as.data.frame(sum_stats[, c("nbr.val", "min", "max", "mean", "std.dev", "median")])
names(sum_stats) <- c("Obs", "Min", "Max", "Mean", "Std.Dev", "Median")
knitr::kable(sum_stats, digits = 1)
NELDA Election Quality |
145 |
3.0 |
9.0 |
7.2 |
1.7 |
8.0 |
V-Dem Clean Election Index |
144 |
0.1 |
0.9 |
0.5 |
0.2 |
0.5 |
Power-Sharing (cabinet) |
145 |
0.0 |
18.0 |
0.8 |
2.9 |
0.0 |
Aid/GDP |
142 |
0.0 |
54.1 |
10.4 |
13.0 |
7.3 |
Democracy and Governance Aid |
145 |
0.0 |
13.6 |
1.2 |
2.2 |
0.5 |
Program Aid |
145 |
0.0 |
36.7 |
5.3 |
6.6 |
3.4 |
Budget Aid |
145 |
0.0 |
45.0 |
3.7 |
7.3 |
1.6 |
Nonstate Conflict |
145 |
0.0 |
1.0 |
0.1 |
0.2 |
0.0 |
Conflict Intensity |
145 |
0.0 |
1.0 |
0.2 |
0.4 |
0.0 |
GDP p/c |
142 |
5.0 |
8.7 |
6.7 |
1.0 |
6.7 |
Population |
145 |
12.9 |
19.3 |
15.8 |
1.3 |
15.8 |
Natural Resource Rents |
145 |
0.0 |
51.2 |
7.9 |
12.1 |
2.3 |
Code for sparklines (histograms in the table)
# Output for manuscript (adds sparklines)
source("./functions/gen_sparkline_hist.R")
digitmat <- matrix(c(5, 0, rep(1, 5), # Polity
5, 0, rep(1, 5), # FH
5, 0, rep(1, 5), # Power-Shainrg
5, 0, rep(1, 5), # Aid
5, 0, rep(1, 5), # Aid
5, 0, rep(1, 5), # Aid
5, 0, rep(1, 5), # Aid
5, 0, rep(1, 5), # nonstate
5, 0, rep(1, 5), # conflict intensity
5, 0, rep(1, 5), # gdp
5, 0, rep(1, 5), # population
5, 0, rep(1, 5)),
ncol = ncol(sum_stats) + 1,
nrow = nrow(sum_stats), byrow = TRUE)
# add column for sparkline
digitmat <- cbind(digitmat, rep(0, nrow(digitmat)))
sum_stats[1, "Distribution"] <- gen_sparkline_hist(nelda_ps$quality, 10)
sum_stats[2, "Distribution"] <- gen_sparkline_hist(nelda_ps$v2xel_frefair, 10)
sum_stats[3, "Distribution"] <- gen_sparkline_hist(nelda_ps$cabinetCOUNT.12, 10)
sum_stats[4, "Distribution"] <- gen_sparkline_hist(log(nelda_ps$aiddata_AidGDP), 10)
sum_stats[5, "Distribution"] <- gen_sparkline_hist(log(nelda_ps$dga_gdp_null + 1), 10)
sum_stats[6, "Distribution"] <- gen_sparkline_hist(log(nelda_ps$program_aid_gdp_null + 1), 10)
sum_stats[7, "Distribution"] <- gen_sparkline_hist(log(nelda_ps$budget_aid_gdp_null + 1), 10)
sum_stats[8, "Distribution"] <- gen_sparkline_hist(nelda_ps$nonstate, 2)
sum_stats[9, "Distribution"] <- gen_sparkline_hist(nelda_ps$conf_intens, 2)
sum_stats[10, "Distribution"] <- gen_sparkline_hist(nelda_ps$ln_gdp_pc, 10)
sum_stats[11, "Distribution"] <- gen_sparkline_hist(nelda_ps$ln_pop, 10)
sum_stats[12, "Distribution"] <- gen_sparkline_hist(nelda_ps$WBnatres, 10)
# print table
sum_stats <- xtable(sum_stats, digits=digitmat, align = "rrrrrrrc")
print.xtable(sum_stats,
file="../output//summarystats_elections.tex",
type="latex", floating = FALSE, booktabs = TRUE,
sanitize.text.function = function(x){x})
LS0tDQp0aXRsZTogIkNoYXB0ZXIgNDogRGF0YSBhbmQgUmVzZWFyY2ggRGVzaWduIg0Kb3V0cHV0OiANCiAgaHRtbF9kb2N1bWVudDoNCiAgICB0b2M6IHRydWUNCiAgICB0b2NfZmxvYXQ6IA0KICAgICAgY29sbGFwc2VkOiBmYWxzZQ0KICAgIGNvZGVfZG93bmxvYWQ6IHRydWUNCiAgICBjb2RlX2ZvbGRpbmc6ICJoaWRlIg0KLS0tDQoNClRoaXMgZmlsZSByZXBsaWNhdGVzIGFsbCBmaWd1cmVzIGFuZCB0YWJsZXMgZnJvbSBDaGFwdGVyIDQ6IERhdGEgYW5kIFJlc2VhcmNoIERlc2lnbi4NCg0KIyBGaWd1cmUgNC4xOiBBaWQgRmxvd3MgQmVmb3JlIGFuZCBBZnRlciBDb25mbGljdCBUZXJtaW5hdGlvbg0KDQpgYGB7ciwgZmlnLmFsaWduID0gImNlbnRlciIsIG1lc3NhZ2U9Riwgd2FybmluZz1GLCBjYWNoZSA9IFQsIGNvbW1lbnRzID0gRn0NCg0KDQojIExvYWQgTGlicmFyaWVzDQpsaWJyYXJ5KHRpZHl2ZXJzZSkNCmxpYnJhcnkoZm9yZWlnbikNCmxpYnJhcnkoY291bnRyeWNvZGUpDQpsaWJyYXJ5KGNvd3Bsb3QpDQpsaWJyYXJ5KHRpa3pEZXZpY2UpDQoNCiMgUmVhZCBkYXRhIGZpbGVzDQpsb2FkKCIuL2RhdGEvZGlzc19kZi5yZGEiKQ0KYWlkIDwtIHJlYWQuZHRhKCIuL2RhdGEvYWlkZGF0YV9mdWxsLmR0YSIpDQp1Y2RwX2N5IDwtIHJlYWRfY3N2KCIuL2RhdGEvMTMzMjgwX29uc2V0MjAxMmNzdi5jc3YiKQ0KDQoNCiMgbG9hZCB0d28gc21hbGwgaGVscGVyIGZ1bmN0aW9uIHRvIGRldGVybWluZSBwcmUtIGFuZCBwb3N0LWNvbmZsaWN0IHllYXJzDQphZ19zZXEgPC0gZnVuY3Rpb24oeCkgew0KICBydW5zIDwtIGN1bXN1bShjKDAsIGRpZmYoeCkgIT0gMSApKQ0KICByZXR1cm4ocnVucykNCn0NCg0Kc291cmNlKCIuL2Z1bmN0aW9ucy9pZGVudGlmeVBvc3RDb25mbGljdFllYXJzLlIiKQ0KDQoNCiMgbG9hZCBhbmQgd3JhbmdsZSB1Y2RwIGRhdGENCnVjZHBfY3kgPC0gdWNkcF9jeSAlPiUgDQogIGFycmFuZ2UoZ3dubywgeWVhcikgJT4lIA0KICBncm91cF9ieShnd25vKSAlPiUgDQogIG11dGF0ZShpc28yYyA9IGNvdW50cnljb2RlKGd3bm8sICJjb3duIiwgImlzbzJjIiksDQogICAgICAgICB1Y2RwX2R1bW15ID0gaWZlbHNlKGluY2lkZW5jZXY0MTIgPT0gMSwgMSwgMCksDQogICAgICAgICBwYyA9IHBjSWRlbnRpZmllcih1Y2RwX2R1bW15KSwNCiAgICAgICAgIHBjID0gaWZlbHNlKHBjID09IDIsIDEsIDApLA0KICAgICAgICAgY29uZmxpY3RfZXBfaWQgPSBjdW1zdW0oYyhpZmVsc2UoZmlyc3QodWNkcF9kdW1teSkgPT0gMSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLCAwKSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaWZmKHVjZHBfZHVtbXkpICE9IDApKSwgDQogICAgICAgICBjb25mbGljdF9lcF9pZCA9IGFzLm51bWVyaWMoaWZlbHNlKHVjZHBfZHVtbXkgPT0gMSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZsaWN0X2VwX2lkLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTkEpKSwNCiAgICAgICAgIHBlYWNlX2VwX2lkID0gY3Vtc3VtKGMoaWZlbHNlKGZpcnN0KHBjKSA9PSAyLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIsIDEpLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlmZihwYykgIT0gMCkpLA0KICAgICAgICAgcGVhY2VfZXBfaWQgPSBhcy5udW1lcmljKGlmZWxzZShwYyA9PSAxLCBwZWFjZV9lcF9pZCwgTkEpKSklPiUgDQogIGdyb3VwX2J5KGd3bm8sIGNvbmZsaWN0X2VwX2lkKSAlPiUgDQogIG11dGF0ZShjb25mbGljdF95ZWFyID0gLTEgKiByZXYoY3Vtc3VtKHVjZHBfZHVtbXkgPT0gMSkpKSAlPiUgDQogIGdyb3VwX2J5KGd3bm8sIHBlYWNlX2VwX2lkKSAlPiUgDQogIG11dGF0ZShwZWFjZV95ZWFyID0gY3Vtc3VtKHBjID09IDEpKSAlPiUgDQogIGdyb3VwX2J5KGd3bm8pICU+JSANCiAgbXV0YXRlKGNvbmZfYW5kX3BlYWNlX3llYXJzID0gY29uZmxpY3RfeWVhciArIHBlYWNlX3llYXIpDQoNCiMgTWVyZ2UgaW4gQWlkIGRhdGENCnVjZHBfY3kgPC0gbGVmdF9qb2luKHVjZHBfY3ksIA0KICAgICAgICAgICAgICAgICAgICAgYWlkLCANCiAgICAgICAgICAgICAgICAgICAgIGJ5ID0gYygiaXNvMmMiID0gImlzbzIiLCAieWVhciIpKSAlPiUgDQogIGZpbHRlcih5ZWFyID49IDE5ODkpICU+JSANCiAgZHBseXI6OnJlbmFtZSh3Yl9BaWRHTkkgPSBEVF9PREFfT0RBVF9HTl9aUywNCiAgICAgICAgICAgICAgICB3Yl9BaWRQQyA9IERUX09EQV9PREFUX1BDX1pTLA0KICAgICAgICAgICAgICAgIHdiX0FpZEdtZW50WFAgPSBEVF9PREFfT0RBVF9YUF9aUywNCiAgICAgICAgICAgICAgICBvZWNkX0FpZCA9IGFpZF9vZWNkX2NvbW1pdG1lbnQyMDExVVNELA0KICAgICAgICAgICAgICAgIG9lY2RfQWlkX21pbGwgPSBhaWRfb2VjZF9jb21taXRtZW50MjAxMVVTRF9taWxsLA0KICAgICAgICAgICAgICAgIGFpZGRhdGFfQWlkID0gY29tbWl0bWVudF9hbW91bnRfdXNkX2NvbnN0YW50KQ0KDQoNCnVjZHBfY3lfZGYgPC0gdWNkcF9jeSAlPiUgDQogIGZpbHRlcihjb25mX2FuZF9wZWFjZV95ZWFycyA+PSAtNSAmDQogICAgICAgICAgIGNvbmZfYW5kX3BlYWNlX3llYXJzIDw9IDUgJg0KICAgICAgICAgICBjb25mX2FuZF9wZWFjZV95ZWFycyAhPSAwKSAlPiUgDQogIGdyb3VwX2J5KGNvbmZfYW5kX3BlYWNlX3llYXJzKSANCg0KDQpjb25mX3BjX2FpZF9wbG90IDwtIGdncGxvdCh1Y2RwX2N5X2RmLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGFlcyh4ID0gY29uZl9hbmRfcGVhY2VfeWVhcnMsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHkgPSBsb2coYWlkZGF0YV9BaWQgLyBwb3B1bGF0aW9uKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvciA9IGZhY3RvcihwYykpKSArICANCiAgZ2VvbV9qaXR0ZXIoZGF0YSA9IHVjZHBfY3lfZGYgJT4lDQogICAgICAgICAgICAgICAgZmlsdGVyKGxvZyhhaWRkYXRhX0FpZCAvIHBvcHVsYXRpb24pIDwgNSAmDQogICAgICAgICAgICAgICAgICAgICAgICAgbG9nKGFpZGRhdGFfQWlkIC8gcG9wdWxhdGlvbikgPiAwKSwNCiAgICAgICAgICAgICAgd2lkdGggPSAwLjIsDQogICAgICAgICAgICAgIGFscGhhID0gMC41NSkgKw0KICBnZW9tX3Ntb290aChkYXRhID0gdWNkcF9jeV9kZiAlPiUgDQogICAgICAgICAgICAgICAgZmlsdGVyKHBjID09IDEpLCANCiAgICAgICAgICAgICAgaW5oZXJpdC5hZXMgPSBULCANCiAgICAgICAgICAgICAgbWV0aG9kID0gImxvZXNzIikgKyAgDQogIGdlb21fc21vb3RoKGRhdGEgPSB1Y2RwX2N5X2RmICU+JSANCiAgICAgICAgICAgICAgICBmaWx0ZXIocGMgPT0gMCksDQogICAgICAgICAgICAgIG1ldGhvZCA9ICJsb2VzcyIpICsNCiAgc2NhbGVfeF9jb250aW51b3VzKGJyZWFrcyA9IC0xMDoxMCkgKw0KICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gYygiI2U0MWExYyIsICIjMmNhMjVmIiApKSArDQogIGdlb21fdmxpbmUoYWVzKHhpbnRlcmNlcHQgPSAwKSwgY29sb3IgPSAiYmxhY2siKSArDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIikgKw0KICBsYWJzKHggPSAiWWVhcnMgYmVmb3JlIC8gYWZ0ZXIgZW5kIG9mIGludGVybmFsIGFybWVkIGNvbmZsaWN0IiwNCiAgICAgICB5ID0gIkFpZCBwZXIgY2FwaXRhIChsb2cpIikNCg0KIyBUaGlzIHBpZWNlIG9mIGNvZGUgZ2VuZXJhdGVzIHRoZSBwbG90IHRvIGluY2x1ZGVkIGluIHRoZSAudGV4IGRvYw0KIyBvcHRpb25zKCB0aWt6RG9jdW1lbnREZWNsYXJhdGlvbiA9ICJcXGRvY3VtZW50Y2xhc3NbMTFwdF17YXJ0aWNsZX0iICkNCiMgdGlreigiLi4vZmlndXJlcy9wY19haWRfZmxvd3MudGV4IiwgaGVpZ2h0ID0gNC41KQ0KIyBwbG90X2dyaWQoY29uZl9wY19haWRfcGxvdCwNCiMgICAgICAgICAgIGFsaWduID0gInYiLCBucm93ID0gMSkNCiMgZGV2Lm9mZigpDQoNCiMgT3V0cHV0IHJlcGxpY2F0aW9uIHBsb3QNCnByaW50KGNvbmZfcGNfYWlkX3Bsb3QpDQoNCg0KDQpgYGANCg0KPCEtLSAqTm90ZToqIFRoZSB5LWF4aXMgcmVwcmVzZW50cyB0aGUgbG9nZ2VkIHZhbHVlIG9mIGFpZCBwZXIgY2FwaXRhLiBEYXRhIHBvaW50cyBhcmUgaW5kaXZpZHVhbCBjb3VudHJ5LXllYXJzIHdpdGggZXh0cmVtZSBvdXRsaWVycyByZW1vdmVkIGZvciB2aXN1YWwgY2xhcml0eSAoaW5jbHVkaW5nIG91dGxpZXJzIGRvZXMgbm90IGNoYW5nZSB0aGUgb3ZlcmFsbCBwYXR0ZXJuKS4gVGhlIHgtYXhpcyBjb2RlcyB0aGUgeWVhciBiZWZvcmUgb3IgYWZ0ZXIgdGhlIGVuZCBvZiBhIGNvbmZsaWN0IGFzIGNvZGVkIGJ5IHRoZSBVcHBzYWxhIENvbmZsaWN0IERhdGEgUHJvZ3JhbSAoVGhlbW7DqXIgYW5kIFdhbGxlbnN0ZWVuIDIwMTMpOyBuZWdhdGl2ZSB2YWx1ZXMgaW5kaWNhdGUgdGhlIHllYXJzIGJlZm9yZSB0aGUgZW5kIG9mIGEgY29uZmxpY3QsIHBvc2l0aXZlIHZhbHVlcyBhcmUgcG9zdC1jb25mbGljdCB5ZWFycy4gVGhlIGxpbmVzIHJlcHJlc2VudCBhIHJlZ3Jlc3Npb24gb2YgYWlkIHBlciBHRFAgb24geWVhciBpbiB0aGUgcmVzcGVjdGl2ZSBjb25mbGljdCAvIHBvc3QtY29uZmxpY3QgZ3JvdXAuIC0tPg0KDQoNCiMgRmlndXJlIDQuMjogRGlzdHJpYnV0aW9uIG9mIFBvc3QtQ29uZmxpY3QgRGVtb2NyYXRpYyBhbmQgQXV0b2NyYXRpYyBDaGFuZ2UNCg0KYGBge3IsIG1lc3NhZ2U9Riwgd2FybmluZz1GLCBjYWNoZSA9IFQsIGNvbW1lbnRzID0gRiwgZmlnLmhlaWdodCA9IDMsIGZpZy5hbGlnbiA9ICJjZW50ZXIifQ0KIyBMaWJyYXJpZXMNCg0KbGlicmFyeShkcGx5cikNCmxpYnJhcnkoZ2dwbG90MikNCmxpYnJhcnkodGlrekRldmljZSkNCmxpYnJhcnkoY293cGxvdCkNCmxpYnJhcnkoZ3JpZEV4dHJhKQ0KDQojIERlbW9jcmF0aXphdGlvbiBTY29yZXMNCg0KaGlzdF9wb2xpdHkgPC0gZ2dwbG90KGRpc3NfZGYsIGFlcyh4ID0gcG9saXR5X2NobmcpKSArIA0KICBnZW9tX2hpc3RvZ3JhbShjb2xvciA9ICJibGFjayIsIGZpbGwgPSAid2hpdGUiLCBiaW5zID0gMTApICsgDQogIHRoZW1lX2J3KCkgKw0KICBsYWJzKHggPSAiUG9saXR5IiwgeSA9ICJGcmVxdWVuY3kiKSArDQogIGdlb21fdmxpbmUoYWVzKHhpbnRlcmNlcHQgPSBtZWFuKHBvbGl0eV9jaG5nLCBuYS5ybSA9IFQpKSwgY29sb3IgPSAicmVkIiwgDQogICAgICAgICAgIGxpbmV0eXBlID0gImRhc2hlZCIsIHNpemUgPSAxKQ0KDQpoaXN0X2ZoIDwtICBnZ3Bsb3QoZGlzc19kZiwgYWVzKHggPSBmaF9jaG5nKSkgKyANCiAgZ2VvbV9oaXN0b2dyYW0oY29sb3IgPSAiYmxhY2siLCBmaWxsID0gIndoaXRlIiwgYmlucyA9IDcpICsNCiAgdGhlbWVfYncoKSArDQogIGxhYnMoeCA9ICJGcmVlZG9tIEhvdXNlIiwgeSA9ICJGcmVxdWVuY3kiKSArDQogIGdlb21fdmxpbmUoYWVzKHhpbnRlcmNlcHQgPSBtZWFuKGZoX2NobmcsIG5hLnJtID0gVCkpLCBjb2xvciA9ICJyZWQiLCANCiAgICAgICAgICAgICBsaW5ldHlwZSA9ICJkYXNoZWQiLCBzaXplID0gMSkNCg0KDQojIE91dHB1dCBtYW51c2NyaXB0DQojIG9wdGlvbnModGlrekRvY3VtZW50RGVjbGFyYXRpb24gPSAiXFxkb2N1bWVudGNsYXNzWzE2cHRde2FydGljbGV9IikNCiMgdGlreigiLi4vZmlndXJlcy9kZXNjcmlwdGl2ZV9zdGF0c19wb2xpdHlGSC50ZXgiLCBoZWlnaHQgPSAyLjUpDQojIHBsb3RfZ3JpZChoaXN0X3BvbGl0eSwgaGlzdF9maCwgbmNvbCA9IDIpDQojIGRldi5vZmYoKQ0KDQojIE91dHB1dCByZXBsaWNhdGlvbiBhcmNoaXZlDQpwbG90X2dyaWQoaGlzdF9wb2xpdHksIGhpc3RfZmgsIG5jb2wgPSAyKQ0KDQoNCmBgYA0KDQoNCiMgRmlndXJlIDQuMzogRWxlY3Rpb25zIGluIFBvc3QtQ29uZmxpY3QgQ291bnRyaWVzDQoNCg0KYGBge3IsIG1lc3NhZ2U9Riwgd2FybmluZz1GLCBjYWNoZSA9IFQsIGNvbW1lbnRzID0gRiwgZmlnLmhlaWdodD0xMiwgZmlnLmFsaWduID0gImNlbnRlciJ9DQoNCiMgTGlicmFyaWVzDQoNCmxpYnJhcnkodGlkeXZlcnNlKQ0KbGlicmFyeShmb3JlaWduKQ0KbGlicmFyeShjb3VudHJ5Y29kZSkNCmxpYnJhcnkoY293cGxvdCkNCmxpYnJhcnkodGlrekRldmljZSkNCmxpYnJhcnkobHVicmlkYXRlKQ0KDQojIExvYWQgZGF0YQ0KDQpsb2FkKCIuL2RhdGEvbmVsZGFfcHMucmRhIikNCg0KIyBwcmVwYXJlIGRhdGENCm5lbGRhX2Rlc2Nfb2JzX3RhYmxlIDwtIG5lbGRhX3BzICU+JSANCiAgbXV0YXRlKG1tZGQgPSBpZmVsc2UobmNoYXIobW1kZCkgPT0gMywgcGFzdGUwKCIwIiwgbW1kZCksIG1tZGQpLA0KICAgICAgICAgZGF0ZSA9IHBhc3RlMCh5ZWFyLCBtbWRkKSkgJT4lIA0KICBtdXRhdGUoZGF0ZSA9IHltZChkYXRlKSkgJT4lIA0KICBhcnJhbmdlKGNvdW50cnkpICU+JSANCiAgZHBseXI6Om11dGF0ZSh5ZWFyID0geWVhcihkYXRlKSwNCiAgICAgICAgICAgICAgICBkYXRlID0gZm9ybWF0KGRhdGUsICIlZC4lbS4lWSIpLA0KICAgICAgICAgY2FiaW5ldENPVU5UID0gYXMuaW50ZWdlcihjYWJpbmV0Q09VTlQpKSAlPiUgDQogIGRwbHlyOjptdXRhdGUoZWxlY3Rpb25fc3RyaW5nID0gcGFzdGUoZGF0ZSwgdHlwZXMsIHNlcCA9ICIgIikpICU+JSANCiAgZ3JvdXBfYnkoY291bnRyeSwgeWVhciwgdHlwZXMpICANCg0KIyBnZW5lcmF0ZSBwbG90DQplbGVjdGlvbl9wbG90IDwtIGdncGxvdChuZWxkYV9kZXNjX29ic190YWJsZSwgDQogICAgICAgICAgICAgICAgICAgICAgICBhZXMoeCA9IHllYXIsIGZpbGwgPSB0eXBlcykpICsgDQogIGdlb21fYmFyKGFlcyhhbHBoYSA9IGZhY3RvcigtcXVhbGl0eSkpLA0KICAgICAgICAgICBzdGF0ID0gImJpbiIsIGJpbnMgPSBsZW5ndGgodW5pcXVlKG5lbGRhX2Rlc2Nfb2JzX3RhYmxlJHllYXIpKSkgKyANCiAgZmFjZXRfd3JhcCggfiBjb3VudHJ5LCBsYWJlbGxlciA9IChjb3VudHJ5ID0gbGFiZWxfd3JhcF9nZW4oNTApKSwNCiAgICAgICAgICAgICAgbmNvbCA9IDMpICsgDQogIHNjYWxlX3lfY29udGludW91cyhicmVha3MgPSAwOjUpICsgDQogIHNjYWxlX2ZpbGxfYnJld2VyKHBhbGV0dGUgPSAiRGFyazIiLCBndWlkZSA9IGd1aWRlX2xlZ2VuZCh0aXRsZSA9IE5VTEwpKSArIA0KICB0aGVtZV9idygpICsNCiAgc2NhbGVfYWxwaGFfZGlzY3JldGUoZ3VpZGUgPSAibm9uZSIpICsgDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJib3R0b20iKSArDQogIGxhYnMoeCA9ICIiLCB5ID0gIk51bWJlciBvZiBFbGVjdGlvbnMgaW4gZ2l2ZW4geWVhciIpDQoNCiMgT3V0cHV0IGZvciBtYW51c2NyaXB0DQoNCiMgb3B0aW9ucyggdGlrekRvY3VtZW50RGVjbGFyYXRpb24gPSAiXFxkb2N1bWVudGNsYXNzWzEycHRde2FydGljbGV9IiApDQojIHRpa3ooIi4uL2ZpZ3VyZXMvZWxlY3Rpb25zX2luc3RhbmNlcy50ZXgiLCBoZWlnaHQgPSAxMikNCiMgcHJpbnQoZWxlY3Rpb25fcGxvdCkNCiMgZGV2Lm9mZigpDQoNCiMgT3V0cHV0IGZvciByZXBsaWNhdGlvbiBhcmNoaXZlDQpwcmludChlbGVjdGlvbl9wbG90KQ0KDQoNCmBgYA0KDQo8IS0tICpGaWd1cmUgTm90ZSBmcm9tIE1hbnVzY3JpcHQ6KiAxNDUgZWxlY3Rpb25zIGluIDQxIGNvdW50cmllcy4gT3BhY2l0eSBpcyBhZGp1c3RlZCBhY2NvcmRpbmcgdG8gZWxlY3Rpb24gcXVhbGl0eTogdHJhbnNsdWNlbnQgYmFycyBpbmRpY2F0ZSBsZXNzIGluc3RhbmNlcyBvZiBlbGVjdGlvbiBtYW5pcHVsYXRpb247IG1vcmUgc29saWQgYmFycyBpbmRpY2F0ZSBtb3JlIGluc3RhbmNlcyBvZiBlbGVjdGlvbiBtYW5pcHVsYXRpb24uIEZvciB0aGUgY29uc3RydWN0aW9uIG9mIHRoZSBlbGVjdGlvbiBxdWFsaXR5IGluZGljYXRvciBmcm9tIHRoZSBORUxEQSBkYXRhIHNlZSBzdWJzZWN0aW9uIDQuMi4yLiBDb25zdGl0dWVudCBhc3NlbWJseSBlbGVjdGlvbnMgdG9vayBwbGFjZSBpbiBOZXBhbCBhbmQgUGFyYWd1YXkuIC0tPg0KDQoNCiMgRmlndXJlIDQuNDogVHJlbmRzIGluIFBvd2VyLVNoYXJpbmcgR292ZXJubWVudHMNCg0KYGBge3IsIG1lc3NhZ2U9Riwgd2FybmluZz1GLCBjYWNoZSA9IFQsIGNvbW1lbnRzID0gRiwgZmlnLmFsaWduID0gImNlbnRlciJ9DQoNCiMgTGlicmFyaWVzDQpsaWJyYXJ5KHRpZHl2ZXJzZSkNCmxpYnJhcnkoY293cGxvdCkNCmxpYnJhcnkodGlrekRldmljZSkNCg0KIyBEYXRhDQpsb2FkKCIuL2RhdGEvZGlzc19kZi5yZGEiKQ0KDQojIFBsb3QgUG93ZXItU2hhcmluZw0KDQpwbG90cHNjb3VudCA8LSBkaXNzX2RmICU+JSANCiAgZ3JvdXBfYnkoeWVhcikgJT4lIA0KICBzdW1tYXJpc2UoY2FiaW5ldENPVU5UID0gc3VtKGNhYmluZXRDT1VOVCksDQogICAgICAgICAgICBzZW5pb3JDT1VOVCA9IHN1bShzZW5pb3JDT1VOVCksDQogICAgICAgICAgICBub25zZW5pb3JDT1VOVCA9IHN1bShub25zZW5pb3JDT1VOVCkpICU+JSANCiAgZ2F0aGVyKHBzdHlwZSwgY291bnQsIHNlbmlvckNPVU5ULCBub25zZW5pb3JDT1VOVCkgJT4lIA0KICBnZ3Bsb3QoLiwgYWVzKHggPSB5ZWFyLCB5ID0gY291bnQsIGdyb3VwID0gcHN0eXBlKSkgKyANCiBnZW9tX2FyZWEoIGFlcyhmaWxsID0gcHN0eXBlKSkgKw0KICBzY2FsZV9maWxsX2JyZXdlcigiIiwgDQogICAgICAgICAgICAgICAgICAgIGJyZWFrcz1jKCJzZW5pb3JDT1VOVCIsICJub25zZW5pb3JDT1VOVCIpLCANCiAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYygiUG93ZXItU2hhcmluZyAoc2VuaW9yIHBvc2l0aW9ucykiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUG93ZXItU2hhcmluZyAobm9uc2VuaW9yIHBvc2l0aW9ucykiKSkgKw0KICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpICsgDQogIGxhYnMoeSA9ICJOdW1iZXIgb2YgQ2FiaW5ldCBTZWF0cyIsIA0KICAgICAgIHggPSAiWWVhciIsDQogICAgICAgdGl0bGUgPSAiQ291bnRzIG9mIFJlYmVsIFNlYXRzIFxuIGluIGFsbCBjb3VudHJ5LXllYXJzIikgDQoNCg0KcGxvdHBzaW5jIDwtIGRpc3NfZGYgJT4lIA0KICBncm91cF9ieSh5ZWFyKSAlPiUgDQogIHN1bW1hcmlzZShjYWJpbmV0SU5DID0gc3VtKGNhYmluZXRJTkMpLA0KICAgICAgICAgICAgc2VuaW9ySU5DID0gc3VtKGlmZWxzZShzZW5pb3JDT1VOVCA+IDAsIDEsIDApKSwNCiAgICAgICAgICAgIG5vbnNlbmlvcklOQyA9IHN1bShpZmVsc2Uobm9uc2VuaW9yQ09VTlQgPiAwLCAxLCAwKSksDQogICAgICAgICAgICBjYWJpbmV0Q09VTlQgPSBzdW0oY2FiaW5ldENPVU5UKSwNCiAgICAgICAgICAgIHNlbmlvckNPVU5UID0gc3VtKHNlbmlvckNPVU5UKSwNCiAgICAgICAgICAgIG5vbnNlbmlvckNPVU5UID0gc3VtKG5vbnNlbmlvckNPVU5UKSkgJT4lIA0KICBnYXRoZXIocHN0eXBlLCBjb3VudCwgc2VuaW9ySU5DLCBub25zZW5pb3JJTkMpICU+JSANCiAgZ2dwbG90KC4sIGFlcyh4ID0geWVhciwgeSA9IGNvdW50LCBncm91cCA9IHBzdHlwZSkpICsgDQogIHNjYWxlX3lfY29udGludW91cyhicmVha3MgPSBjKDAsIDIsIDQsIDYsIDgpKSArDQogIGdlb21fYXJlYSggYWVzKGZpbGwgPSBwc3R5cGUpKSArDQogIHNjYWxlX2ZpbGxfYnJld2VyKCIiLCANCiAgICAgICAgICAgICAgICAgICAgYnJlYWtzPWMoInNlbmlvcklOQyIsICJub25zZW5pb3JJTkMiKSwgDQogICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGMoIlBvd2VyLVNoYXJpbmcgKHNlbmlvciBwb3NpdGlvbnMpIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlBvd2VyLVNoYXJpbmcgKG5vbnNlbmlvciBwb3NpdGlvbnMpIikpICsNCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKSArIA0KICBsYWJzKHkgPSAiTnVtYmVyIG9mIENvdW50cnktWWVhcnMiLCANCiAgICAgICB4ID0gIlllYXIiLCANCiAgICAgICB0aXRsZSA9ICJJbnN0YW5jZXMgb2YgUG93ZXItU2hhcmluZyBcbiBpbiBhbGwgY291bnRyeS15ZWFycyIpIA0KDQpwc3Bsb3RzX2xlZ2VuZCA8LSBnZXRfbGVnZW5kKHBsb3Rwc2NvdW50ICsgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gImJvdHRvbSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVnZW5kLmRpcmVjdGlvbiA9ICJ2ZXJ0aWNhbCIpKQ0KDQoNCiMgUGxvdCB1c2luZyB0aWt6DQoNCiMgdGhpcyBpcyByZXF1aXJlZCB0byBnZXQgcG9pbnQgc2l6ZXMgcmlnaHQNCm9wdGlvbnMoIHRpa3pEb2N1bWVudERlY2xhcmF0aW9uID0gIlxcZG9jdW1lbnRjbGFzc1sxNXB0XXthcnRpY2xlfSIgKQ0KDQojIHRpa3ooIi4uL2ZpZ3VyZXMvdHJlbmRwcy50ZXgiLCBoZWlnaHQgPSA0KQ0KIyBwbG90X2dyaWQocGxvdF9ncmlkKHBsb3Rwc2luYywNCiMgICAgICAgICAgICAgICAgICAgICBwbG90cHNjb3VudCwNCiMgICAgICAgICAgICAgICAgICAgICBucm93ID0gMSwNCiMgICAgICAgICAgICAgICAgICAgICBhbGlnbiA9ICd2aCcpLA0KIyAgICAgICAgICAgcHNwbG90c19sZWdlbmQsDQojICAgICAgICAgICBuY29sID0gMSwNCiMgICAgICAgICAgIHJlbF9oZWlnaHRzID0gYygxLCAuMikpDQojIGRldi5vZmYoKQ0KDQojIE91dHB1dCBmb3IgcmVwbGljYXRpb24gYXJjaGl2ZQ0KcGxvdF9ncmlkKHBsb3RfZ3JpZChwbG90cHNpbmMsIA0KICAgICAgICAgICAgICAgICAgICBwbG90cHNjb3VudCwNCiAgICAgICAgICAgICAgICAgICAgaGp1c3QgPSAtMSwNCiAgICAgICAgICAgICAgICAgICAgbnJvdyA9IDEsDQogICAgICAgICAgICAgICAgICAgIGFsaWduID0gJ3ZoJyksIA0KICAgICAgICAgIHBzcGxvdHNfbGVnZW5kLCANCiAgICAgICAgICBuY29sID0gMSwgICANCiAgICAgICAgICByZWxfaGVpZ2h0cyA9IGMoMSwgLjIpKQ0KYGBgDQoNCg0KDQoNCiMgRmlndXJlIDQuNTogRm9yZWlnbiBBaWQgYWZ0ZXIgQ2l2aWwgQ29uZmxpY3QsIDE5OTAtMjAxMA0KDQpgYGB7ciwgbWVzc2FnZT1GLCB3YXJuaW5nPUYsIGNhY2hlPVQsIGNvbW1lbnRzID0gRixmaWcuaGVpZ2h0ID0gMTIsIGZpZy5hbGlnbiA9ICJjZW50ZXIiLCBkZXY9IkNhaXJvUE5HIn0NCg0KbGlicmFyeShmb3JjYXRzKQ0KbGlicmFyeSh0aWR5dmVyc2UpDQpsaWJyYXJ5KGNvdW50cnljb2RlKQ0KbGlicmFyeShjb3dwbG90KQ0KDQpsb2FkKCIuL2RhdGEvZGlzc19kZi5yZGEiKQ0KDQphaWRfcGxvdCA8LSBkaXNzX2RmICU+JSANCiAgdW5ncm91cCgpICU+JSANCiAgbXV0YXRlKExvY2F0aW9uID0gYXMuY2hhcmFjdGVyKExvY2F0aW9uKSwgDQogICAgICAgICBMb2NhdGlvbiA9IGlmZWxzZShncmVwbCgiQ290ZSIsIExvY2F0aW9uKSwgIkl2b3J5IENvYXN0IiwgTG9jYXRpb24pLCANCiAgICAgICAgIExvY2F0aW9uID0gaWZlbHNlKGdyZXBsKCJaYWlyZSIsIExvY2F0aW9uKSwgIkRSQyIsIExvY2F0aW9uKSkgJT4lIA0KICBncm91cF9ieShMb2NhdGlvbikgJT4lIA0KICBtdXRhdGUoYWlkbWVhbiA9IG1lYW4oYWlkZGF0YV9BaWRHRFAsIG5hLnJtID0gVCksDQogICAgICAgICBhaWRtZWRpYW4gPSBtZWRpYW4oYWlkZGF0YV9BaWRHRFAsIG5hLnJtID0gVCksIA0KICAgICAgICAgbWVhbnBzID0gbWVhbihjYWJpbmV0Q09VTlQpLCANCiAgICAgICAgIGhhZFBTID0gaWZlbHNlKGFueSgxICVpbiUgY2FiaW5ldElOQyksICJZZXMiLCAiTm8iKSkgJT4lIA0KICB1bmdyb3VwKCkgJT4lIA0KICBtdXRhdGUoTG9jYXRpb24gPSBmY3RfcmVvcmRlcihMb2NhdGlvbiwgYWlkbWVkaWFuKSkgJT4lIA0KICANCiAgIyBwbG90IHN0YXJ0cyBoZXJlDQogIGdncGxvdCguICwgYWVzKExvY2F0aW9uKSkgKw0KICBnZW9tX2JveHBsb3QoYWVzKHkgPSBhaWRkYXRhX0FpZEdEUCwgDQogICAgICAgICAgICAgICAgICAgY29sb3IgPSBhcy5mYWN0b3IoaGFkUFMpLCANCiAgICAgICAgICAgICAgICAgICBmaWxsID0gYXMuZmFjdG9yKGhhZFBTKSksIG91dGxpZXIuc2hhcGUgPSBOQSwgDQogICAgICAgICAgICAgICBhbHBoYSA9IDAuNykgKyANCiAgZ2VvbV9qaXR0ZXIoYWVzKHkgPSBhaWRkYXRhX0FpZEdEUCwgDQogICAgICAgICAgICAgICAgICBjb2xvciA9IGFzLmZhY3RvcihoYWRQUykpLCANCiAgICAgICAgICAgICAgc2l6ZSA9IDEuNSkgKw0KICBzY2FsZV9maWxsX21hbnVhbCgiQ291bnRyeSBoYWQgUG93ZXItU2hhcmluZzoiLCANCiAgICAgICAgICAgICAgICAgICAgIHZhbHVlcyA9IGMoIiNiM2NkZTMiLCAiI2U0MWExYyIpKSArDQogIHNjYWxlX2NvbG9yX21hbnVhbCgiQ291bnRyeSBoYWQgUG93ZXItU2hhcmluZzoiLCANCiAgICAgICAgICAgICAgICAgICAgIHZhbHVlcyA9IGMoIiNiM2NkZTMiLCAiI2U0MWExYyIpKSArDQogIGxhYnMoeSA9ICJBaWQgLyBHRFAiLCB4ID0gIiIpICsNCiAgdGhlbWVfY293cGxvdCgpICsNCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gImJvdHRvbSIpICsNCg0KICBjb29yZF9mbGlwKCkNCg0KIyBPdXRwdXQgZm9yIE1hbnVzY3JpcHQNCiMgbGlicmFyeSh0aWt6RGV2aWNlKQ0KIyBvcHRpb25zKCB0aWt6RG9jdW1lbnREZWNsYXJhdGlvbiA9ICJcXGRvY3VtZW50Y2xhc3NbMTFwdF17YXJ0aWNsZX0iICkNCiMgdGlreigiLi4vZmlndXJlcy9haWRvdmVydmlldy50ZXgiLCBoZWlnaHQgPSAxMiwgd2lkdGggPSA4Ljc1KQ0KIyBwcmludChhaWRfcGxvdCkNCiMgZGV2Lm9mZigpDQoNCiMgT3V0cHV0IGZvciBSZXBsaWNhdGlvbiBBcmNoaXZlDQpwcmludChhaWRfcGxvdCkNCg0KYGBgDQoNCg0KIyBGaWd1cmUgNC42OiBFc3RhYmxpc2hpbmcgRmFjZSBWYWxpZGl0eSBvZiB0aGUgUmVsYXRpb25zaGlwIGJldHdlZW4gTGV2ZWxzIG9mIEFpZCBDb21taXRtZW50IGFuZCBUaGVvcmV0aWNhbCBNZWNoYW5pc21zDQoNCmBgYHtyLCBtZXNzYWdlPUYsIHdhcm5pbmc9RiwgY2FjaGU9VCwgY29tbWVudHMgPSBGLCBmaWcuYWxpZ24gPSAiY2VudGVyIn0NCg0KbGlicmFyeSh0aWR5dmVyc2UpDQpsaWJyYXJ5KGNvdW50cnljb2RlKQ0KbGlicmFyeShjb3dwbG90KQ0KDQojIExvYWQgZGF0YQ0KDQpsb2FkKCIuL2RhdGEvbmVsZGFfcHMucmRhIikNCg0KIyBkYXRhIG1hbmFnZW1lbnQgcHJpb3IgdG8gcGxvdHRpbmcNCm5lbGRhX2FpZCA8LSBuZWxkYV9wcyAlPiUNCiAgbXV0YXRlKGRnYSA9IGRnYSAvIChnZHBfcGVyX2NhcGl0YV91biAqIHBvcHVsYXRpb24pLA0KICAgICAgICAgY29tbW9kaXR5X2FpZCA9IGNvbW1vZGl0eV9haWQgLyAoZ2RwX3Blcl9jYXBpdGFfdW4gKiBwb3B1bGF0aW9uKSwNCiAgICAgICAgIHByb2dyYW1fYWlkID0gcHJvZ3JhbV9haWQgLyAoZ2RwX3Blcl9jYXBpdGFfdW4gKiBwb3B1bGF0aW9uKSwNCiAgICAgICAgIGFpZGRhdGFfQWlkID0gYWlkZGF0YV9BaWQgLyAoZ2RwX3Blcl9jYXBpdGFfdW4gKiBwb3B1bGF0aW9uKSkNCg0KIyBXYXMgYWlkIHRocmVhdGVuZWQgdG8gYmUgY3V0IG9mZj8NCmFpZF9jb21wYXJpc29uX2FpZHdpdGhoZWxkIDwtIG5lbGRhX2FpZCAlPiUgDQogIHVuZ3JvdXAoKSAlPiUgDQogIHJlbmFtZShhaWRfd2l0aGhlbGQgPSBuZWxkYTU3KSAlPiUgDQogIG11dGF0ZShhaWRfd2l0aGhlbGQgPSBpZmVsc2UoYWlkX3dpdGhoZWxkID09ICJOL0EiLCBOQSwgYWlkX3dpdGhoZWxkKSwNCiAgICAgICAgIGFpZF93aXRoaGVsZCA9IGlmZWxzZShhaWRfd2l0aGhlbGQgPT0gInVuY2xlYXIiLCBOQSwgYWlkX3dpdGhoZWxkKSwNCiAgICAgICAgIGFpZF93aXRoaGVsZCA9IGlmZWxzZShhaWRfd2l0aGhlbGQgPT0gMSwgInllcyIsICJubyIpKSAlPiUgDQogIGRwbHlyOjpzZWxlY3QoZGdhLCBjb21tb2RpdHlfYWlkLCBwcm9ncmFtX2FpZCwgYWlkZGF0YV9BaWQsIGFpZF93aXRoaGVsZCwgY291bnRyeSwgeWVhcikgJT4lIA0KICBtdXRhdGVfZWFjaChmdW5zKGxvZyksIC1haWRfd2l0aGhlbGQsIC1jb3VudHJ5LCAteWVhcikgJT4lIA0KICBnYXRoZXIoa2V5LCB2YWx1ZSwgLWFpZF93aXRoaGVsZCwgLWNvdW50cnksIC15ZWFyKSAlPiUgDQogIGZpbHRlcighaXMubmEodmFsdWUpKSAlPiUgDQogIGZpbHRlcighaXMubmEoYWlkX3dpdGhoZWxkKSkgJT4lIA0KICBtdXRhdGUoa2V5ID0gZm9yY2F0czo6ZmN0X3JlbGV2ZWwoZmFjdG9yKGtleSksIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYygiZGdhIiwgImNvbW1vZGl0eV9haWQiLCAicHJvZ3JhbV9haWQiLCAiYWlkZGF0YV9BaWQiKSkpDQoNCiMgcGxvdCB0aGUgZGF0YSENCmFpZF9jb21wYXJpc29uX2FpZHdpdGhoZWxkX3Bsb3QgPC0gZ2dwbG90KGFpZF9jb21wYXJpc29uX2FpZHdpdGhoZWxkLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFlcyh4ID0gYWlkX3dpdGhoZWxkLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5ID0gdmFsdWUsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyb3VwID0ga2V5KSkgKyANCiAgZ2VvbV9qaXR0ZXIoc2l6ZSA9IDEuNywgYWxwaGEgPSAwLjUpICsgDQogIGdlb21fYm94cGxvdChhZXMoZmlsbCA9IGFpZF93aXRoaGVsZCwgDQogICAgICAgICAgICAgICAgICAgZ3JvdXAgPSBhaWRfd2l0aGhlbGQpLCANCiAgICAgICAgICAgICAgIGFscGhhID0gMC45KSArIA0KICBmYWNldF93cmFwKCB+IGtleSwgDQogICAgICAgICAgICAgIG5yb3cgPSAxLCANCiAgICAgICAgICAgICAgbGFiZWxsZXIgPSBsYWJlbGxlcihrZXkgPSBjKGRnYSA9ICJER0EiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFpZGRhdGFfQWlkID0gIkFsbCBBaWQiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbW9kaXR5X2FpZCA9ICJCdWRnZXQgQWlkIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2dyYW1fYWlkID0gIlByb2dyYW0gQWlkIikpKSArIA0KICANCiAgc2NhbGVfZmlsbF9icmV3ZXIobmFtZSA9ICJORUxEQTU3OiBcIklzIGFpZCB0aHJlYXRlbmVkIHRvIGJlIGN1dCBvZmY/XCIiKSArIA0KICB0aGVtZV9idygpICsNCiAgbGFicyh4ID0gIiIsIHkgPSAiQWlkIC8gR0RQIChsb2cpIikgKw0KICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAiYm90dG9tIikgDQoNCiMgb3V0cHV0IGZvciBtYW51c2NyaXB0DQojIGxpYnJhcnkodGlrekRldmljZSkNCiMgb3B0aW9ucyggdGlrekRvY3VtZW50RGVjbGFyYXRpb24gPSAiXFxkb2N1bWVudGNsYXNzWzExcHRde2FydGljbGV9IiApDQojIHRpa3ooIi4uL2ZpZ3VyZXMvYWlkY3V0b2ZmX2JveHBsb3RzLnRleCIsIGhlaWdodCA9IDQpDQojIHByaW50KGFpZF9jb21wYXJpc29uX2FpZHdpdGhoZWxkX3Bsb3QpDQojIGRldi5vZmYoKQ0KDQojIG91dHB1dCBmb3IgcmVwbGljYXRpb24gYXJjaGl2ZQ0KcGxvdChhaWRfY29tcGFyaXNvbl9haWR3aXRoaGVsZF9wbG90KQ0KYGBgDQoNCg0KIyBUYWJsZSA0LjE6IExpc3Qgb2YgQ291bnRyaWVzDQoNCmBgYHtyLCBtZXNzYWdlPUYsIHdhcm5pbmc9RiwgY2FjaGUgPSBULCByZXN1bHRzID0gImFzaXMiLCBjb21tZW50cyA9IEYgfQ0KDQoNCmxpYnJhcnkoeHRhYmxlKQ0KDQojIGZ1bmN0aW9uIHRvIGV4dHJhY3QgeWVhcnMgb2Ygb2JzZXJ2YXRpb24gZnJvbSB0aGUgZGF0YXNldA0KZXh0cmFjdF95ZWFycyA8LSBmdW5jdGlvbihkZikgew0KICB5ZWFyX3N0YXJ0IDwtIHN1YnNldChkZiwgZmlyc3RGaXZlID09IDEsIGMoInllYXIiLCAiZmlyc3RGaXZlIikpDQogIHllYXJfYmV0d2VlbiA8LSBzdWJzZXQoZGYsIGRpZmYoZmlyc3RGaXZlKSAhPSAxLCBjKCJ5ZWFyIiwgImZpcnN0Rml2ZSIpKQ0KICB5ZWFyX2VuZCA8LSBkZltucm93KGRmKSwgYygieWVhciIsICJmaXJzdEZpdmUiKV0NCiAgeWVhcnNfZnVsbCA8LSByYmluZCh5ZWFyX3N0YXJ0LCB5ZWFyX2JldHdlZW4sIHllYXJfZW5kKQ0KICB5ZWFyc19mdWxsIDwtIHllYXJzX2Z1bGxbb3JkZXIoeWVhcnNfZnVsbCR5ZWFyKSwgXQ0KICANCiAgIyBwcmludCh5ZWFyc19mdWxsKQ0KICANCiAgaWYobnJvdyh5ZWFyc19mdWxsKSA9PSAyKSB7DQogICAgeWVhcnNfZnVsbCA8LSBwYXN0ZSh5ZWFyc19mdWxsWywgInllYXIiXSwgY29sbGFwc2UgPSAiLSIpDQogICAgcmV0dXJuKHllYXJzX2Z1bGwpDQogIH0NCiAgZWxzZSB7DQogICAgeWVhcnNfc3RyaW5nIDwtIHZlY3RvcigpDQogICAgZm9yKGkgaW4gc2VxKDIsIG5yb3coeWVhcnNfZnVsbCksIDIpKSB7DQogICAgICB5ZWFyc19zdHJpbmcgPC0gYyh5ZWFyc19zdHJpbmcsIHBhc3RlKHllYXJzX2Z1bGxbKGktMSk6aSwgInllYXIiXSwgY29sbGFwc2UgPSAiLSIpKQ0KDQogICAgfQ0KICAgIHllYXJzX2Z1bGwgPC0gcGFzdGUoeWVhcnNfc3RyaW5nLCBjb2xsYXBzZSA9ICIsICIpDQogICAgcmV0dXJuKHllYXJzX2Z1bGwpDQogIH0NCiAgDQp9DQoNCiMgaGVscGVyIGZ1bmN0aW9uIHRoYXQgZXh0cmFjdHMgdmFsdWVzIGZyb20gZGF0YSBzZXQNCmdlbmVyYXRlX2Rlc2MgPC0gZnVuY3Rpb24oZGYpIHsNCiAgeiA8LSBwbHlyOjpkZHBseShkZiwgIHBseXI6Oi4oR1dObyksIC5mdW4gPSBmdW5jdGlvbih4KSB7DQogICAgYyhDb3VudHJ5ID0gYXMuY2hhcmFjdGVyKHVuaXF1ZSh4JExvY2F0aW9uKSksDQogICAgICBZZWFycyA9IGV4dHJhY3RfeWVhcnMoeCksDQogICAgICBNZWFuQWlkR0RQID0gcm91bmQobWVhbih4JGFpZGRhdGFfQWlkR0RQLCBuYS5ybSA9IFRSVUUpLCAyKSwNCiAgICAgIEhhc1BTID0gaWZlbHNlKDEgJWluJSB4JGNhYmluZXRJTkMsICJZZXMiLCAiTm8iKSwNCiAgICAgIE1lYW5Qb2xpdHkgPSByb3VuZChtZWFuKHgkcG9saXR5MiwgbmEucm0gPSBUUlVFKSwgMSksDQogICAgICBNZWFuRkggPSByb3VuZChtZWFuKHgkZmgsIG5hLnJtID0gVFJVRSksMSkpDQogIH0pDQogIHJldHVybih6KQ0KfQ0KICANCiAgICANCmNvdW50cnlMaXN0IDwtIGdlbmVyYXRlX2Rlc2MoZGlzc19kZikNCg0KY291bnRyeUxpc3QgPC0gY291bnRyeUxpc3Rbb3JkZXIoY291bnRyeUxpc3QkQ291bnRyeSksIF0NCg0KIyBzZXQgTkEgaW4gRWxlY3Rpb25zIHRvIHplcm8NCiMgY291bnRyeUxpc3QkRWxlY3Rpb25zLlRSVUVbaXMubmEoY291bnRyeUxpc3QkRWxlY3Rpb25zLlRSVUUpXSA8LSAwIA0KDQpjb3VudHJ5TGlzdFtjb3VudHJ5TGlzdCRHV05vID09IDQzNywgIkNvdW50cnkiXSA8LSAiQ290ZSBEJ0l2b2lyZSINCmNvdW50cnlMaXN0W2NvdW50cnlMaXN0JEdXTm8gPT0gNDkwLCAiQ291bnRyeSJdIDwtICJEZW1vY3JhdGljIFJlcHVibGljIG9mIENvbmdvIg0KDQpjb3VudHJ5TGlzdCA8LSBwbHlyOjpyZW5hbWUoY291bnRyeUxpc3QsIGMoIlllYXJzIiA9ICJZZWFycyBvYnMuIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTWVhbkFpZEdEUCIgPSAiJFxcdmFybm90aGluZyBcXGZyYWN7XFx0ZXh0aXR7QWlkfX17XFx0ZXh0aXR7R0RQfX0kIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSGFzUFMiID0gIkhhcyBQUz8iLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTWVhblBvbGl0eSIgPSAiJFxcdmFybm90aGluZyQgIFBvbGl0eSBJViIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk1lYW5GSCIgPSAiJFxcdmFybm90aGluZyQgIEZIIikpDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjICAgICAgICJFbGVjdGlvbnMuVFJVRSIgPSAiTm8uIG9mIEVsZWN0aW9ucyIpKQ0KDQpjb3VudHJ5TGlzdFssIDZdIDwtIGlmZWxzZShjb3VudHJ5TGlzdFssIDZdID09ICJOYU4iLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgIE5BLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50cnlMaXN0WywgNl0pDQoNCmNvdW50cnlMaXN0X3AgPC0geHRhYmxlKGNvdW50cnlMaXN0WywgMjpuY29sKGNvdW50cnlMaXN0KV0sIGRpZ2l0cyA9IDEpDQoNCiMgT3V0cHV0IGZvciBEb2N1bWVudA0KcHJpbnQoY291bnRyeUxpc3RfcCwgDQogICAgICBmaWxlID0gIi4uL291dHB1dC9vYnNfZGVzY3IudGV4IiwgDQogICAgICBOQS5zdHJpbmcgPSAiLiIsIA0KICAgICAgaW5jbHVkZS5yb3duYW1lcyA9IEZBTFNFLA0KICAgICAgZmxvYXRpbmcgPSBGQUxTRSwgDQogICAgICBib29rdGFicyA9IFRSVUUsIA0KICAgICAgc2FuaXRpemUuY29sbmFtZXMuZnVuY3Rpb24gPSBmdW5jdGlvbih4KSByZXR1cm4oeCkpDQoNCiMgT3V0cHV0IGZvciBSZXBsaWNhdGlvbiBBcmNoaXZlDQpwcmludChjb3VudHJ5TGlzdF9wLCANCiAgICAgIHR5cGUgPSAiaHRtbCIsDQogICAgICBOQS5zdHJpbmcgPSAiLiIsIA0KICAgICAgaW5jbHVkZS5yb3duYW1lcyA9IEZBTFNFLA0KICAgICAgZmxvYXRpbmcgPSBGQUxTRSwgDQogICAgICBib29rdGFicyA9IFRSVUUsIA0KICAgICAgc2FuaXRpemUuY29sbmFtZXMuZnVuY3Rpb24gPSBmdW5jdGlvbih4KSByZXR1cm4oeCkpDQoNCg0KDQoNCmBgYA0KDQo8IS0tIDxwPiZuYnNwOzwvcD4gLS0+DQo8IS0tICpUYWJsZSBjYXB0aW9uIGZyb20gbWFudXNjcmlwdDoqOiAgQSB0b3RhbCBvZiA0NiBjb3VudHJpZXMuIEFpZCBkYXRhIGlzIHRha2VuIGZyb20gdGhlIEFpZERhdGEgcHJvamVjdCAoVGllcm5leSBldCBhbC4gMjAxMSkuIEdEUCBkYXRhIGlzIHRha2VuIGZyb20gdGhlIFdvcmxkIEJhbmsgKHNlZSBodHRwOi8vZGF0YS53b3JsZGJhbmsub3JnICkuIFBvbGl0eSBJViBkYXRhIGZyb20gdGhlIFBvbGl0eSBJViBwcm9qZWN0IChNYXJzaGFsbCwgSmFnZ2VycywgYW5kIEd1cnIgMjAxNSksIEZyZWVkb20gSG91c2UgZGF0YSBmcm9tIEZyZWVkb20gSG91c2UgKDIwMTMpLiBGb3IgYSBkaXNjdXNzaW9uIG9mIGRhdGEgc291cmNlcywgc2VlIGJlbG93LiBGcmVlZG9tIEhvdXNlIHNjb3JlcyBoYXZlIGJlZW4gaW52ZXJ0ZWQgdG8gaW5jcmVhc2UgY29tcGFyYWJpbGl0eSBiZXR3ZWVuIFBvbGl0eSBhbmQgRkggKGkuZS4gaGlnaGVyIHZhbHVlcyBpbmRpY2F0ZSBhIGhpZ2hlciBsZXZlbCBvZiBkZW1vY3JhY3kpLiBBbiDigJwu4oCdIGluZGljYXRlcyBtaXNzaW5nIGRhdGEuIC0tPg0KDQojIFRhYmxlIDQuNDogQ291bnRyaWVzIHdpdGggUG93ZXItU2hhcmluZyBhbmQgRWxlY3Rpb25zDQoNCmBgYHtyLCBtZXNzYWdlPUYsIHdhcm5pbmc9RiwgY2FjaGUgPSBULCBjb21tZW50cyA9IEYsICBmaWcuYWxpZ24gPSAiY2VudGVyIn0NCg0KbGlicmFyeSh0aWR5dmVyc2UpDQoNCmxvYWQoIi4vZGF0YS9kaXNzX2RmLnJkYSIpDQpsb2FkKCIuL2RhdGEvbmVsZGFfcHMucmRhIikNCg0KY291bnRyaWVzX3dpdGhQUyA8LSBkaXNzX2RmICU+JQ0KICBncm91cF9ieShMb2NhdGlvbiwgR1dObykgJT4lDQogIHN1bW1hcmlzZShjb3VudHJ5X2hhZFBTID0gc3VtKDEgJWluJSBjYWJpbmV0SU5DKSkNCg0KZWxlY3Rpb25zX3dpdGhQUyA8LSBuZWxkYV9wcyAlPiUNCiAgZ3JvdXBfYnkoY291bnRyeSwgY2NvZGUpICU+JQ0KICAgIHN1bW1hcmlzZShlbGVjdGlvbl9oYWRQUyA9IHN1bSgxICVpbiUgY2FiaW5ldElOQy4xMikpIA0KICANCg0KY291bnRyaWVzX3dpdGhQUyA8LSBsZWZ0X2pvaW4oY291bnRyaWVzX3dpdGhQUywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZWN0aW9uc193aXRoUFMsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBieSA9IGMoIkdXTm8iID0gImNjb2RlIikpICU+JSANCiAgZ3JvdXBfYnkoTG9jYXRpb24pICU+JSANCiAgbXV0YXRlKCkNCg0KDQpjb3VudHJpZXNfd2l0aFBTICU+JSBncm91cF9ieShjb3VudHJ5X2hhZFBTLCBlbGVjdGlvbl9oYWRQUykgJT4lIA0KICBzdW1tYXJpc2UoY291bnRyaWVzID0gcGFzdGUoTG9jYXRpb24sIGNvbGxhcHNlID0gIiwgIikpICU+JSANCiAgcmVwbGFjZV9uYShsaXN0KGVsZWN0aW9uX2hhZFBTID0gMCkpICU+JQ0KICBtdXRhdGUoY2F0ZWdvcnkgPSBjKCJ3aXRob3V0UFNfZWxlY3Rpb24iLCAid2l0aG91dF9QU19ub2VsZWN0aW9uIiwgIndpdGhQU19lbGVjdGlvbmFmdGVyUFMiLCANCiAgICAgICAgICAgICAgICAgICAgICAid2l0aFBTX2VsZWN0aW9uIiwgIndpdGhQU19ub2VsZWN0aW9uIikpICU+JSANCiAgc2VsZWN0KGNhdGVnb3J5LCBjb3VudHJpZXMpICU+JSANCiAgbXV0YXRlKG5vX2NvdW50cmllcyA9IGxlbmd0aCh1bmxpc3Qoc3Ryc3BsaXQoY291bnRyaWVzLCAiLCIpKSkpICU+JSANCiAgc3ByZWFkKGNhdGVnb3J5LCBjb3VudHJpZXMpICU+JSANCiAgc2VsZWN0KHdpdGhQU19lbGVjdGlvbiwgd2l0aFBTX2VsZWN0aW9uYWZ0ZXJQUywgd2l0aFBTX25vZWxlY3Rpb24sIHdpdGhvdXRQU19lbGVjdGlvbiwgd2l0aG91dF9QU19ub2VsZWN0aW9uKSAlPiUgDQogIGtuaXRyOjprYWJsZSgpDQogIA0KDQoNCmBgYA0KDQpIb3cgbWFueSBjb3VudHJpZXMgaGFkIHBvd2VyLXNoYXJpbmc/IChCb3R0b20gcm93IG9mIHRhYmxlIGluIG1hbnVzY3JpcHQpDQoNCmBgYHtyLCBtZXNzYWdlPUYsIHdhcm5pbmc9RiwgY2FjaGUgPSBULCBjb21tZW50cyA9IEYsICBmaWcuYWxpZ24gPSAiY2VudGVyIn0NCg0KbG9hZCgiLi9kYXRhL2Rpc3NfZGYucmRhIikNCg0KZGlzc19kZiAlPiUgDQogIGdyb3VwX2J5KExvY2F0aW9uKSAlPiUgDQogIHN1bW1hcmlzZShoYWRfcG93ZXJfc2hhcmluZyA9IHN1bShhbnkoMSAlaW4lIGNhYmluZXRJTkMpKSkgJT4lIA0KICBncm91cF9ieShoYWRfcG93ZXJfc2hhcmluZykgJT4lIA0KICB0YWxseSgpDQoNCmBgYA0KDQoNCiMgVGFibGUgNC42OiBTdW1tYXJ5IFN0YXRpc3RpY3MgSTogRGVwZW5kZW50IGFuZCBLZXkgSW5kZXBlbmRlbnQgVmFyaWFibGVzIGluIHRoZSBDcm9zcy1TZWN0aW9uYWwgU2FtcGxlDQoNCmBgYHtyLCBtZXNzYWdlPUYsIHdhcm5pbmc9RiwgY2FjaGUgPSBULCByZXN1bHRzID0gImFzaXMiLCBjb21tZW50cyA9IEYgfQ0KDQpsaWJyYXJ5KHBhc3RlY3MpDQpsaWJyYXJ5KHh0YWJsZSkNCmxvYWQoIi4vZGF0YS9kaXNzX2RmLnJkYSIpDQoNCiMgRm9yIGFsbCBkZXBlbmRlbnQgdmFyaWFibGVzIGluIHRoZSBjcm9zcy1zZWN0aW9uIHRpbWUgc2VyaWVzIHNhbXBsZQ0Kc3VtX3N0YXRzIDwtIHN0YXQuZGVzYyhkaXNzX2RmWyAsIGMoInBvbGl0eTJfdDIiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImZoX3QyIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2MnhfanVjb24iLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJMSkkiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInYyZGxlbmNtcHMiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2MnhfY29yciIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY2FiaW5ldENPVU5UIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYWlkZGF0YV9BaWRHRFAiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRnYV9nZHBfemVybyIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInByb2dyYW1fYWlkX2dkcF96ZXJvIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29tbW9kaXR5X2FpZF9nZHBfemVybyIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibm9uc3RhdGUiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjb25mX2ludGVucyIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImxuX2dkcF9wYyIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImxuX3BvcCIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIldCbmF0cmVzIg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKV0pDQojIEJldHRlciB2YXJpYWJsZSBuYW1lcw0KbmFtZXMoc3VtX3N0YXRzKSA8LSBjKCJQb2xpdHkiLCANCiAgICAgICAgICAgICAgICAgICAgICAiRnJlZWRvbSBIb3VzZSIsIA0KICAgICAgICAgICAgICAgICAgICAgICJKdWRpY2lhbCBJbmRlcGVuZGVuY2UgKFYtRGVtKSIsIA0KICAgICAgICAgICAgICAgICAgICAgICJKdWRpY2lhbCBJbmRlcGVuZGVuY2UgKExKSSkiLCANCiAgICAgICAgICAgICAgICAgICAgICAiUGFydGljdWxhcmlzdGljIFNwZW5kaW5nIChWLURlbSkiLA0KICAgICAgICAgICAgICAgICAgICAgICJQb2xpdGljYWwgQ29ycnVwdGlvbiAoVi1EZW0pIiwNCiAgICAgICAgICAgICAgICAgICAgICAiUG93ZXItU2hhcmluZyAoY2FiaW5ldCkiLCANCiAgICAgICAgICAgICAgICAgICAgICAiQWlkL0dEUCIsDQogICAgICAgICAgICAgICAgICAgICAgIkRlbW9jcmFjeSBhbmQgR292ZXJuYW5jZSBBaWQiLCANCiAgICAgICAgICAgICAgICAgICAgICAiUHJvZ3JhbSBBaWQiLCANCiAgICAgICAgICAgICAgICAgICAgICAiQnVkZ2V0IEFpZCIsDQogICAgICAgICAgICAgICAgICAgICAgIk5vbnN0YXRlIENvbmZsaWN0IiwgDQogICAgICAgICAgICAgICAgICAgICAgIkNvbmZsaWN0IEludGVuc2l0eSIsDQogICAgICAgICAgICAgICAgICAgICAgIkdEUCBwL2MiLCANCiAgICAgICAgICAgICAgICAgICAgICAiUG9wdWxhdGlvbiIsDQogICAgICAgICAgICAgICAgICAgICAgIk5hdHVyYWwgUmVzb3VyY2UgUmVudHMiKQ0KDQojIHRyYW5zcG9zZSBkYXRhLmZyYW1lIChyb3dzIHRvIGNvbHVtcykNCnN1bV9zdGF0cyA8LSB0KHN1bV9zdGF0cykgDQoNCiMga2VlcCBzdGF0aXN0aWNzIG9mIGludGVyZXN0DQpzdW1fc3RhdHMgPC0gYXMuZGF0YS5mcmFtZShzdW1fc3RhdHNbLCBjKCJuYnIudmFsIiwgIm1pbiIsICJtYXgiLCAibWVhbiIsICJzdGQuZGV2IiwgICJtZWRpYW4iKV0pDQoNCm5hbWVzKHN1bV9zdGF0cykgPC0gYygiT2JzIiwgIk1pbiIsICJNYXgiLCAiTWVhbiIsICJTdGQuRGV2IiwgIk1lZGlhbiIpDQoNCmtuaXRyOjprYWJsZShzdW1fc3RhdHMsIGRpZ2l0cyA9IDEpDQoNCmBgYA0KDQpUaGUgZm9sbG93aW5nIGNvZGUgZ2VuZXJhdGVzIHRoZSBzcGFya2xpbmVzIG9mIHRoZSB2YXJpYWJsZSBkaXN0cmlidXRpb25zIGluIHRoZSBtYW51c2NyaXB0ICh3aGljaCBpcyBvbmx5IGZlYXNpYmxlIGZvciB0aGUgVGVYIG91dHB1dCk6DQoNCmBgYHtyLGV2YWwgPSBGLCBtZXNzYWdlPUYsIHdhcm5pbmc9RiwgY2FjaGU9VCwgY29tbWVudHM9RiB9DQoNCiMgT3V0cHV0IGZvciBtYW51c2NyaXB0IChhZGRzIHNwYXJrbGluZXMpDQpzb3VyY2UoIi4vZnVuY3Rpb25zL2dlbl9zcGFya2xpbmVfaGlzdC5SIikNCg0KZGlnaXRtYXQgPC0gbWF0cml4KGMoNSwgMCwgcmVwKDEsIDUpLCAjIFBvbGl0eQ0KICAgICAgICAgICAgICAgICAgICAgNSwgMCwgcmVwKDEsIDUpLCAjIEZIDQogICAgICAgICAgICAgICAgICAgICA1LCAwLCByZXAoMSwgNSksICMgSnVkSW5kIDENCiAgICAgICAgICAgICAgICAgICAgIDUsIDAsIHJlcCgxLCA1KSwgIyBKdWRJbmQgMg0KICAgICAgICAgICAgICAgICAgICAgNSwgMCwgcmVwKDEsIDUpLCAjIFBhcnQgU3BlbmQNCiAgICAgICAgICAgICAgICAgICAgIDUsIDAsIHJlcCgxLCA1KSwgIyBDb3JydXB0aW9uDQogICAgICAgICAgICAgICAgICAgICA1LCAwLCByZXAoMSwgNSksICMgUG93ZXItU2hhaW5yZw0KICAgICAgICAgICAgICAgICAgICAgNSwgMCwgcmVwKDEsIDUpLCAjIEFpZA0KICAgICAgICAgICAgICAgICAgICAgNSwgMCwgcmVwKDEsIDUpLCAjIEFpZA0KICAgICAgICAgICAgICAgICAgICAgNSwgMCwgcmVwKDEsIDUpLCAjIEFpZA0KICAgICAgICAgICAgICAgICAgICAgNSwgMCwgcmVwKDEsIDUpLCAjIEFpZA0KICAgICAgICAgICAgICAgICAgICAgNSwgMCwgcmVwKDEsIDUpLCAjIG5vbnN0YXRlDQogICAgICAgICAgICAgICAgICAgICA1LCAwLCByZXAoMSwgNSksICMgY29uZmxpY3QgaW50ZW5zaXR5DQogICAgICAgICAgICAgICAgICAgICA1LCAwLCByZXAoMSwgNSksICMgZ2RwIA0KICAgICAgICAgICAgICAgICAgICAgNSwgMCwgcmVwKDEsIDUpLCAjIHBvcHVsYXRpb24NCiAgICAgICAgICAgICAgICAgICAgIDUsIDAsIHJlcCgxLCA1KSksICMgd2JuYXRyZXMNCg0KICAgICAgICAgICAgICAgICAgIG5jb2wgPSBuY29sKHN1bV9zdGF0cykgKyAxLA0KICAgICAgICAgICAgICAgICAgIG5yb3cgPSBucm93KHN1bV9zdGF0cyksIGJ5cm93ID0gVFJVRSkNCg0KIyBhZGQgY29sdW1uIGZvciBzcGFya2xpbmUNCmRpZ2l0bWF0IDwtIGNiaW5kKGRpZ2l0bWF0LCByZXAoMCwgbnJvdyhkaWdpdG1hdCkpKQ0KDQpzdW1fc3RhdHNbMSwgIkRpc3RyaWJ1dGlvbiJdIDwtIGdlbl9zcGFya2xpbmVfaGlzdChkaXNzX2RmJHBvbGl0eTJfdDIsIDEwKQ0Kc3VtX3N0YXRzWzIsICJEaXN0cmlidXRpb24iXSA8LSBnZW5fc3BhcmtsaW5lX2hpc3QoZGlzc19kZiRmaF90MiwgMTApDQpzdW1fc3RhdHNbMywgIkRpc3RyaWJ1dGlvbiJdIDwtIGdlbl9zcGFya2xpbmVfaGlzdChkaXNzX2RmJHYyeF9qdWNvbiwgMTApDQpzdW1fc3RhdHNbNCwgIkRpc3RyaWJ1dGlvbiJdIDwtIGdlbl9zcGFya2xpbmVfaGlzdChkaXNzX2RmJExKSSwgMTApDQpzdW1fc3RhdHNbNSwgIkRpc3RyaWJ1dGlvbiJdIDwtIGdlbl9zcGFya2xpbmVfaGlzdChkaXNzX2RmJHYyZGxlbmNtcHMsIDEwKQ0Kc3VtX3N0YXRzWzYsICJEaXN0cmlidXRpb24iXSA8LSBnZW5fc3BhcmtsaW5lX2hpc3QoZGlzc19kZiR2MnhfY29yciwgMTApDQpzdW1fc3RhdHNbNywgIkRpc3RyaWJ1dGlvbiJdIDwtIGdlbl9zcGFya2xpbmVfaGlzdChkaXNzX2RmJGNhYmluZXRDT1VOVCwgMTApDQpzdW1fc3RhdHNbOCwgIkRpc3RyaWJ1dGlvbiJdIDwtIGdlbl9zcGFya2xpbmVfaGlzdChsb2coZGlzc19kZiRhaWRkYXRhX0FpZEdEUCksIDEwKQ0Kc3VtX3N0YXRzWzksICJEaXN0cmlidXRpb24iXSA8LSBnZW5fc3BhcmtsaW5lX2hpc3QobG9nKGRpc3NfZGYkZGdhX2dkcF96ZXJvICsgMSksIDEwKQ0Kc3VtX3N0YXRzWzEwLCAiRGlzdHJpYnV0aW9uIl0gPC0gZ2VuX3NwYXJrbGluZV9oaXN0KGxvZyhkaXNzX2RmJHByb2dyYW1fYWlkX2dkcF96ZXJvICsgMSksIDEwKQ0Kc3VtX3N0YXRzWzExLCAiRGlzdHJpYnV0aW9uIl0gPC0gZ2VuX3NwYXJrbGluZV9oaXN0KGxvZyhkaXNzX2RmJGNvbW1vZGl0eV9haWRfZ2RwX3plcm8gKyAxKSwgMTApDQpzdW1fc3RhdHNbMTIsICJEaXN0cmlidXRpb24iXSA8LSBnZW5fc3BhcmtsaW5lX2hpc3QoZGlzc19kZiRub25zdGF0ZSwgMikNCnN1bV9zdGF0c1sxMywgIkRpc3RyaWJ1dGlvbiJdIDwtIGdlbl9zcGFya2xpbmVfaGlzdChkaXNzX2RmJGNvbmZfaW50ZW5zLCAyKQ0Kc3VtX3N0YXRzWzE0LCAiRGlzdHJpYnV0aW9uIl0gPC0gZ2VuX3NwYXJrbGluZV9oaXN0KGRpc3NfZGYkbG5fZ2RwX3BjLCAxMCkNCnN1bV9zdGF0c1sxNSwgIkRpc3RyaWJ1dGlvbiJdIDwtIGdlbl9zcGFya2xpbmVfaGlzdChkaXNzX2RmJGxuX3BvcCwgMTApDQpzdW1fc3RhdHNbMTYsICJEaXN0cmlidXRpb24iXSA8LSBnZW5fc3BhcmtsaW5lX2hpc3QoZGlzc19kZiRXQm5hdHJlcywgMTApDQoNCg0KIyBwcmludCB0YWJsZQ0Kc3VtX3N0YXRzIDwtIHh0YWJsZShzdW1fc3RhdHMsIGRpZ2l0cz1kaWdpdG1hdCwgYWxpZ24gPSAicnJycnJycmMiKQ0KcHJpbnQueHRhYmxlKHN1bV9zdGF0cywNCiAgICAgICAgICAgICBmaWxlPSIuLi9vdXRwdXQvL3N1bW1hcnlzdGF0cy50ZXgiLA0KICAgICAgICAgICAgIHR5cGU9ImxhdGV4IiwgZmxvYXRpbmcgPSBGQUxTRSwgYm9va3RhYnMgPSBUUlVFLA0KICAgICAgICAgICAgIHNhbml0aXplLnRleHQuZnVuY3Rpb24gPSBmdW5jdGlvbih4KXt4fSkNCg0KDQpgYGANCg0KDQoNCiMgVGFibGUgNC42OiBTdW1tYXJ5IFN0YXRpc3RpY3MgSUk6IERlcGVuZGVudCBhbmQgS2V5IEluZGVwZW5kZW50IFZhcmlhYmxlcyBpbiB0aGUgRWxlY3Rpb25zIFNhbXBsZQ0KDQpgYGB7ciwgbWVzc2FnZT1GLCB3YXJuaW5nPUYsIGNhY2hlID0gVCwgcmVzdWx0cyA9ICJhc2lzIiwgY29tbWVudHMgPSBGIH0NCg0KbGlicmFyeShwYXN0ZWNzKQ0KbGlicmFyeSh4dGFibGUpDQpsb2FkKCIuL2RhdGEvbmVsZGFfcHMucmRhIikNCm5lbGRhX3BzJGxuX2dkcF9wYyA8LSBsb2cobmVsZGFfcHMkR0RQX3Blcl9jYXBpdGEpDQpuZWxkYV9wcyRsbl9wb3AgPC0gbG9nKG5lbGRhX3BzJHBvcHVsYXRpb24pDQoNCiMgRm9yIGFsbCBkZXBlbmRlbnQgdmFyaWFibGVzIGluIHRoZSBjcm9zcy1zZWN0aW9uIHRpbWUgc2VyaWVzIHNhbXBsZQ0Kc3VtX3N0YXRzIDwtIHN0YXQuZGVzYyhuZWxkYV9wc1sgLCBjKCJxdWFsaXR5IiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2MnhlbF9mcmVmYWlyIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNhYmluZXRDT1VOVC4xMiIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFpZGRhdGFfQWlkR0RQIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkZ2FfZ2RwX251bGwiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwcm9ncmFtX2FpZF9nZHBfbnVsbCIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImJ1ZGdldF9haWRfZ2RwX251bGwiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm5vbnN0YXRlIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29uZl9pbnRlbnMiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJsbl9nZHBfcGMiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJsbl9wb3AiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJXQm5hdHJlcyINCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKV0pDQojIEJldHRlciB2YXJpYWJsZSBuYW1lcw0KbmFtZXMoc3VtX3N0YXRzKSA8LSBjKCJORUxEQSBFbGVjdGlvbiBRdWFsaXR5IiwgDQogICAgICAgICAgICAgICAgICAgICAgIlYtRGVtIENsZWFuIEVsZWN0aW9uIEluZGV4IiwgDQogICAgICAgICAgICAgICAgICAgICAgIlBvd2VyLVNoYXJpbmcgKGNhYmluZXQpIiwgDQogICAgICAgICAgICAgICAgICAgICAgIkFpZC9HRFAiLA0KICAgICAgICAgICAgICAgICAgICAgICJEZW1vY3JhY3kgYW5kIEdvdmVybmFuY2UgQWlkIiwgDQogICAgICAgICAgICAgICAgICAgICAgIlByb2dyYW0gQWlkIiwgDQogICAgICAgICAgICAgICAgICAgICAgIkJ1ZGdldCBBaWQiLA0KICAgICAgICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgICAgICAgICJOb25zdGF0ZSBDb25mbGljdCIsIA0KICAgICAgICAgICAgICAgICAgICAgICJDb25mbGljdCBJbnRlbnNpdHkiLA0KICAgICAgICAgICAgICAgICAgICAgICJHRFAgcC9jIiwgDQogICAgICAgICAgICAgICAgICAgICAgIlBvcHVsYXRpb24iLA0KICAgICAgICAgICAgICAgICAgICAgICJOYXR1cmFsIFJlc291cmNlIFJlbnRzIikNCg0KIyB0cmFuc3Bvc2UgZGF0YS5mcmFtZSAocm93cyB0byBjb2x1bXMpDQpzdW1fc3RhdHMgPC0gdChzdW1fc3RhdHMpIA0KDQojIGtlZXAgc3RhdGlzdGljcyBvZiBpbnRlcmVzdA0Kc3VtX3N0YXRzIDwtIGFzLmRhdGEuZnJhbWUoc3VtX3N0YXRzWywgYygibmJyLnZhbCIsICJtaW4iLCAibWF4IiwgIm1lYW4iLCAic3RkLmRldiIsICAibWVkaWFuIildKQ0KDQpuYW1lcyhzdW1fc3RhdHMpIDwtIGMoIk9icyIsICJNaW4iLCAiTWF4IiwgIk1lYW4iLCAiU3RkLkRldiIsICJNZWRpYW4iKQ0KDQprbml0cjo6a2FibGUoc3VtX3N0YXRzLCBkaWdpdHMgPSAxKQ0KDQpgYGANCg0KQ29kZSBmb3Igc3BhcmtsaW5lcyAoaGlzdG9ncmFtcyBpbiB0aGUgdGFibGUpDQoNCmBgYHtyLCBldmFsID0gRiwgbWVzc2FnZT1GLCB3YXJuaW5nPUYsIGNhY2hlPVQsIGNvbW1lbnRzPUYgfQ0KDQojIE91dHB1dCBmb3IgbWFudXNjcmlwdCAoYWRkcyBzcGFya2xpbmVzKQ0Kc291cmNlKCIuL2Z1bmN0aW9ucy9nZW5fc3BhcmtsaW5lX2hpc3QuUiIpDQoNCmRpZ2l0bWF0IDwtIG1hdHJpeChjKDUsIDAsIHJlcCgxLCA1KSwgIyBQb2xpdHkNCiAgICAgICAgICAgICAgICAgICAgIDUsIDAsIHJlcCgxLCA1KSwgIyBGSA0KICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgICAgICAgNSwgMCwgcmVwKDEsIDUpLCAjIFBvd2VyLVNoYWlucmcNCiAgICAgICAgICAgICAgICAgICAgIDUsIDAsIHJlcCgxLCA1KSwgIyBBaWQNCiAgICAgICAgICAgICAgICAgICAgIDUsIDAsIHJlcCgxLCA1KSwgIyBBaWQNCiAgICAgICAgICAgICAgICAgICAgIDUsIDAsIHJlcCgxLCA1KSwgIyBBaWQNCiAgICAgICAgICAgICAgICAgICAgIDUsIDAsIHJlcCgxLCA1KSwgIyBBaWQNCiAgICAgICAgICAgICAgICAgICAgIDUsIDAsIHJlcCgxLCA1KSwgIyBub25zdGF0ZQ0KICAgICAgICAgICAgICAgICAgICAgNSwgMCwgcmVwKDEsIDUpLCAjIGNvbmZsaWN0IGludGVuc2l0eQ0KICAgICAgICAgICAgICAgICAgICAgNSwgMCwgcmVwKDEsIDUpLCAjIGdkcCANCiAgICAgICAgICAgICAgICAgICAgIDUsIDAsIHJlcCgxLCA1KSwgIyBwb3B1bGF0aW9uDQogICAgICAgICAgICAgICAgICAgICA1LCAwLCByZXAoMSwgNSkpLA0KDQogICAgICAgICAgICAgICAgICAgbmNvbCA9IG5jb2woc3VtX3N0YXRzKSArIDEsDQogICAgICAgICAgICAgICAgICAgbnJvdyA9IG5yb3coc3VtX3N0YXRzKSwgYnlyb3cgPSBUUlVFKQ0KDQojIGFkZCBjb2x1bW4gZm9yIHNwYXJrbGluZQ0KZGlnaXRtYXQgPC0gY2JpbmQoZGlnaXRtYXQsIHJlcCgwLCBucm93KGRpZ2l0bWF0KSkpDQoNCnN1bV9zdGF0c1sxLCAiRGlzdHJpYnV0aW9uIl0gPC0gZ2VuX3NwYXJrbGluZV9oaXN0KG5lbGRhX3BzJHF1YWxpdHksIDEwKQ0Kc3VtX3N0YXRzWzIsICJEaXN0cmlidXRpb24iXSA8LSBnZW5fc3BhcmtsaW5lX2hpc3QobmVsZGFfcHMkdjJ4ZWxfZnJlZmFpciwgMTApDQpzdW1fc3RhdHNbMywgIkRpc3RyaWJ1dGlvbiJdIDwtIGdlbl9zcGFya2xpbmVfaGlzdChuZWxkYV9wcyRjYWJpbmV0Q09VTlQuMTIsIDEwKQ0Kc3VtX3N0YXRzWzQsICJEaXN0cmlidXRpb24iXSA8LSBnZW5fc3BhcmtsaW5lX2hpc3QobG9nKG5lbGRhX3BzJGFpZGRhdGFfQWlkR0RQKSwgMTApDQpzdW1fc3RhdHNbNSwgIkRpc3RyaWJ1dGlvbiJdIDwtIGdlbl9zcGFya2xpbmVfaGlzdChsb2cobmVsZGFfcHMkZGdhX2dkcF9udWxsICsgMSksIDEwKQ0Kc3VtX3N0YXRzWzYsICJEaXN0cmlidXRpb24iXSA8LSBnZW5fc3BhcmtsaW5lX2hpc3QobG9nKG5lbGRhX3BzJHByb2dyYW1fYWlkX2dkcF9udWxsICsgMSksIDEwKQ0Kc3VtX3N0YXRzWzcsICJEaXN0cmlidXRpb24iXSA8LSBnZW5fc3BhcmtsaW5lX2hpc3QobG9nKG5lbGRhX3BzJGJ1ZGdldF9haWRfZ2RwX251bGwgKyAxKSwgMTApDQpzdW1fc3RhdHNbOCwgIkRpc3RyaWJ1dGlvbiJdIDwtIGdlbl9zcGFya2xpbmVfaGlzdChuZWxkYV9wcyRub25zdGF0ZSwgMikNCnN1bV9zdGF0c1s5LCAiRGlzdHJpYnV0aW9uIl0gPC0gZ2VuX3NwYXJrbGluZV9oaXN0KG5lbGRhX3BzJGNvbmZfaW50ZW5zLCAyKQ0Kc3VtX3N0YXRzWzEwLCAiRGlzdHJpYnV0aW9uIl0gPC0gZ2VuX3NwYXJrbGluZV9oaXN0KG5lbGRhX3BzJGxuX2dkcF9wYywgMTApDQpzdW1fc3RhdHNbMTEsICJEaXN0cmlidXRpb24iXSA8LSBnZW5fc3BhcmtsaW5lX2hpc3QobmVsZGFfcHMkbG5fcG9wLCAxMCkNCnN1bV9zdGF0c1sxMiwgIkRpc3RyaWJ1dGlvbiJdIDwtIGdlbl9zcGFya2xpbmVfaGlzdChuZWxkYV9wcyRXQm5hdHJlcywgMTApDQoNCiMgcHJpbnQgdGFibGUNCnN1bV9zdGF0cyA8LSB4dGFibGUoc3VtX3N0YXRzLCBkaWdpdHM9ZGlnaXRtYXQsIGFsaWduID0gInJycnJycnJjIikNCnByaW50Lnh0YWJsZShzdW1fc3RhdHMsDQogICAgICAgICAgICAgZmlsZT0iLi4vb3V0cHV0Ly9zdW1tYXJ5c3RhdHNfZWxlY3Rpb25zLnRleCIsDQogICAgICAgICAgICAgdHlwZT0ibGF0ZXgiLCBmbG9hdGluZyA9IEZBTFNFLCBib29rdGFicyA9IFRSVUUsDQogICAgICAgICAgICAgc2FuaXRpemUudGV4dC5mdW5jdGlvbiA9IGZ1bmN0aW9uKHgpe3h9KQ0KDQpgYGANCg==