Figure 6.1: Election Quality, Power-Sharing Governments, and Aid: Individual

Patterns

# Libraries
library(tidyverse)
library(ggrepel)
library(tikzDevice)
library(gridExtra)
library(cowplot)

# Load data
load("./data/nelda_ps.rda")

# Plot Power-Sharing
nelda_ps$cabinetINClabel <- ifelse(nelda_ps$cabinetINC.12 == 1,
                                   "Power-Sharing", 
                                   "No Power-Sharing")

nelda_quality_boxplot <- ggplot(nelda_ps, aes(x = cabinetINClabel, y = quality)) +
  geom_jitter(height = 0.1, size = 1.7, alpha = 0.5) +
  geom_boxplot(aes(fill = cabinetINClabel), alpha = 0.6) +
  scale_fill_brewer(palette = "Blues") + 
  stat_summary(aes(group = 1), fun.y = mean, geom = "point", shape = 23,
               size = 4, fill = "#d7191c", color = "#d7191c") + 
  theme_bw() +
  theme(legend.position = "none") + 
  labs(x = "", y = "NELDA Election Quality Index")


# Plot Aid
nelda_aid_plot <- ggplot(nelda_ps, aes(x = log(aiddata_AidGDP), y = quality)) + 
  geom_jitter(size = 1.7, 
              width = 0.1, 
              height = 0.1,
              alpha = 0.5) +
  geom_smooth(method = "lm") +
  theme_bw() +
  labs(y = "NELDA Election Quality Index", x = "All Aid / GDP (log)")

# Output for Manuscript
# options( tikzDocumentDeclaration = "\\documentclass[11pt]{article}" )
# tikz("../figures/aid_ps_individ_nelda.tex", height = 3.5)
# plot_grid(nelda_quality_boxplot, nelda_aid_plot)
# dev.off()

# Output for Rep. Archive
plot_grid(nelda_quality_boxplot, nelda_aid_plot)

Figure 6.2: Foreign Aid and Election Quality in Election Rounds with and without Power-Sharing

# Libraries
library(tidyverse)
library(ggrepel)
library(gridExtra)

# Load data
load("./data/nelda_ps.rda")


aid_ps_election_nelda_plot <- ggplot(nelda_ps, aes(x = aid_ln, y = quality)) +
  geom_jitter(size = 2, width = 0.1, height = 0.1,  alpha = 0.5) + 
  geom_smooth(method = "lm") +
  facet_wrap( ~ cabinetINC.12, nrow = 1,
              labeller = labeller(cabinetINC.12 = c("0" = "No Power-Sharing", 
                                                    "1" = "Power-Sharing"))) +
  theme_bw() +
  theme(strip.text = element_text(size=11)) +
  labs(x = "Aid / GDP (log)", y = "NELDA Election Quality Index")


# options( tikzDocumentDeclaration = "\\documentclass[11pt]{article}" )
# tikz("../figures/aid_ps_interaction_rawdata.tex", height = 3.5, width = 6.5)
# grid.arrange(aid_ps_election_nelda_plot)
# dev.off()

# Output Replication Archive
print(aid_ps_election_nelda_plot)

Figure 6.3: Marginal Effect Plots for the Interaction between Foreign Aid and Power-Sharing

# Libraries
library(tidyverse)
library(rms)
library(tikzDevice)

# load data
load("./data/nelda_ps.rda")

# Reestimate Models

# Models NELDA
model_aidps_quality_cabinc <- ols(quality ~ 
                                       aid_ln *  
                                       cabinetINC.12 +
                                       WBnatres + 
                                       fh + 
                                       nonstate + 
                                       conf_intens + 
                                       log(gdp_per_capita_un) + 
                                       log(population)
                                       ,
                                     data = nelda_ps, x = T, y = T)
model_aidps_quality_cabinc <- robcov(model_aidps_quality_cabinc, nelda_ps$country)

model_aidps_quality_cabcount <- ols(quality ~ 
                                       aid_ln *  
                                       cabinetCOUNT.12 +
                                       WBnatres + 
                                       fh + 
                                       nonstate + 
                                       conf_intens + 
                                       log(gdp_per_capita_un) + 
                                       log(population)
                                       ,
                                     data = nelda_ps, x = T, y = T)
model_aidps_quality_cabcount <- robcov(model_aidps_quality_cabcount, nelda_ps$country)

# Plot ME
source("./functions/interaction_plots.R")

# Output for manuscript
# options( tikzDocumentDeclaration = "\\documentclass[11pt]{article}" )
# tikz("../figures/interaction_aidpselections.tex", height = 3.5)
# par(mfrow=c(1,3),
#     mar = c(4, 5, 4, 2),
#     cex.lab = 1.1,
#     cex.axis = 0.9,
#     mgp = c(3, 0.7, 0))
# 
# interaction_plot_continuous(model_aidps_quality_cabcount, 
#                             "cabinetCOUNT.12", 
#                             "aid_ln", 
#                             "aid_ln * cabinetCOUNT.12",
#                             title = "",
#                             ylab = "Marginal effect of Power-Sharing (cabinet) \n on Election Quality ",
#                             xlab = "a) Aid / GDP (Log)\n",
#                             add_median_effect = T,
#                             
#                             conf = .90)
# 
# interaction_plot_continuous(model_aidps_quality_cabcount, 
#                             "aid_ln", 
#                             "cabinetCOUNT.12", 
#                             "aid_ln * cabinetCOUNT.12",
#                             title = "",
#                             xlab = "\n Power-Sharing (cabinet) - \nNumber of rebel seats",
#                             ylab = "Estimated marginal coefficient of\n Aid / GDP (log)",
#                             conf = .90)
# 
# interaction_plot_binary(model_aidps_quality_cabinc, 
#                             "aid_ln", 
#                             "cabinetINC.12", 
#                             "aid_ln * cabinetINC.12",
#                             title = "",
#                              xlab = "\n Power-Sharing (cabinet) - \nBinary",
#                         ylab = "Estimated marginal coefficient of\n Aid / GDP (log)",
#                             conf = .90)
# 
# dev.off()

# Output for Replication Archive:
par(mfrow=c(1,3),
    mar = c(4, 5, 4, 2),
    cex.lab = 1.1,
    cex.axis = 0.9,
    mgp = c(3, 0.7, 0))

interaction_plot_continuous(model_aidps_quality_cabcount, 
                            "cabinetCOUNT.12", 
                            "aid_ln", 
                            "aid_ln * cabinetCOUNT.12",
                            title = "",
                            ylab = "Marginal effect of Power-Sharing (cabinet) \n on Election Quality ",
                            xlab = "a) Aid / GDP (Log)\n",
                            add_median_effect = T,
                            conf = .90)

interaction_plot_continuous(model_aidps_quality_cabcount, 
                            "aid_ln", 
                            "cabinetCOUNT.12", 
                            "aid_ln * cabinetCOUNT.12",
                            title = "",
                            xlab = "\n Power-Sharing (cabinet) - \nNumber of rebel seats",
                            ylab = "Estimated marginal coefficient of\n Aid / GDP (log)",
                            conf = .90)

interaction_plot_binary(model_aidps_quality_cabinc, 
                            "aid_ln", 
                            "cabinetINC.12", 
                            "aid_ln * cabinetINC.12",
                            title = "",
                             xlab = "\n Power-Sharing (cabinet) - \nBinary",
                        ylab = "Estimated marginal coefficient of\n Aid / GDP (log)",
                            conf = .90)

Figure 6.3: Model Predictions for the Effect of Foreign Aid and Power-Sharing on Post-Conflict Election Quality

# Libraries
library(tidyverse)
library(rms)

# Load Data
load("./data/nelda_ps.rda")

# Estimate Model
datadist_nelda <- datadist(nelda_ps); options(datadist='datadist_nelda')
model_aidps_quality_cabcount <- ols(v2xel_frefair ~ 
                                       aid_ln *  
                                       cabinetCOUNT.12 +
                                       WBnatres + 
                                       fh + 
                                       nonstate + 
                                       conf_intens +
                                       log(gdp_per_capita_un) + 
                                       log(population)
                                       ,
                                     data = nelda_ps, x = T, y = T)
model_aidps_quality_cabcount <- robcov(model_aidps_quality_cabcount, nelda_ps$country)

# Generate Predictions
prediction_nelda <- Predict(model_aidps_quality_cabcount, 
                            cabinetCOUNT.12 = c(0, 10), # no / much power-sharing
                            aid_ln = seq(-6, 3.9, 0.1), 
                            fh = 3.57, 
                            WBnatres = 7.860124) # range of aid



# generate plot
ME_aidps_interaction_nelda <- ggplot(data.frame(prediction_nelda), 
                                    aes(x = exp(aid_ln), 
                                        y = yhat, 
                                        group = as.factor(cabinetCOUNT.12))) + 
  geom_line( color = "black", size = 1) + 
  geom_ribbon(aes(ymax = upper, 
                  ymin = lower, 
                  fill = as.factor(cabinetCOUNT.12)), 
              alpha = 0.7) +
  scale_fill_manual(values = c("#b3cde3", "#e41a1c"), 
                    name = "Number of Rebels \nin the Power-Sharing Coalition:") +
  theme_bw() +
  theme(text = element_text(size=8)) +
  labs(x = "Aid / GDP", 
       y = "Election Quality") +
  theme(legend.position = "bottom") 


prediction_nelda_ps <- Predict(model_aidps_quality_cabcount, 
                               cabinetCOUNT.12 = seq(0, 10, 1), 
                               aid_ln = c(0, 3.4),
                               fh = 3.57, 
                               WBnatres = 7.860124)

prediction_nelda_ps$aid_ln <- round(exp(prediction_nelda_ps$aid_ln), 0)


meplot_aidps_nelda_interaction_ps <- ggplot(data.frame(prediction_nelda_ps), 
                                            aes(x = cabinetCOUNT.12, 
                                                y = yhat, 
                                                group = as.factor(aid_ln))) + 
  geom_line( color = "black", size = 1) + 
  geom_ribbon(aes(ymax = upper, 
                  ymin = lower, 
                  fill = as.factor(aid_ln)), 
              alpha = 0.7) +
  scale_x_continuous(breaks = seq(0, 10, 2)) +
  scale_fill_manual(values = c("#b3cde3", "#e41a1c"), 
                    name = "Aid in per cent of GDP:") +
  theme_bw() +
  theme(text = element_text(size=8)) +
  labs(x = "Power-Sharing (No. of Rebel Seats)", 
       y = "Election Quality") +
  theme(legend.position = "bottom") 


# Outut Manuscript
# options( tikzDocumentDeclaration = "\\documentclass[11pt]{article}" )
# tikz("../figures/aidps_elections_ME.tex", height = 4.5, width = 6.5)
# grid.arrange(meplot_aidps_nelda_interaction_ps,
#              ME_aidps_interaction_nelda,
#              nrow = 1)
# dev.off()

# Output Replication Archive
gridExtra::grid.arrange(meplot_aidps_nelda_interaction_ps, 
                        ME_aidps_interaction_nelda,
                        nrow = 1)

Figure 6.4: Probing Mechanisms I: Variation in Types of Power-Sharing and Aid and Election Quality

# Libraries
library(tidyverse)
library(lfe)

# Load data 
load("./data/nelda_ps.rda")

model_aidps_quality_cabinc <- felm(quality ~ 
                                       aid_ln *  
                                       cabinetINC.12 +
                                       WBnatres + 
                                       fh + 
                                       nonstate + 
                                       conf_intens + 
                                       log(gdp_per_capita_un) + 
                                       log(population)
                                   | 0 | 0 | country, 
                                   data = nelda_ps)


model_aidps_quality_seninc <- felm(quality ~ 
                                       aid_ln *  
                                       seniorINC.12 +
                                       WBnatres + 
                                       fh + 
                                       nonstate + 
                                       conf_intens + 
                                       log(gdp_per_capita_un) + 
                                       log(population)
                                   | 0 | 0 | country, 
                                   data = nelda_ps)


model_aidps_quality_nonseninc <- felm(quality ~ 
                                       aid_ln *  
                                       nonseniorINC.12 +
                                       WBnatres + 
                                       fh + 
                                       nonstate + 
                                       conf_intens + 
                                       log(gdp_per_capita_un) + 
                                       log(population)
                                   | 0 | 0 | country, 
                                   data = nelda_ps)

model_aidps_quality_dga <- felm(quality ~ 
                                       log(dga_gdp_null + 1) *  
                                       cabinetINC.12 +
                                  aid_ln +
                                       WBnatres + 
                                       fh + 
                                       nonstate + 
                                       conf_intens + 
                                       log(gdp_per_capita_un) + 
                                       log(population)
                                   | 0 | 0 | country, 
                                   data = nelda_ps)


model_aidps_quality_progaid <- felm(quality ~ 
                                       log(program_aid_gdp_null + 1) *  
                                       cabinetINC.12 +
                                  aid_ln +
                                       WBnatres + 
                                       fh + 
                                       nonstate + 
                                       conf_intens + 
                                       log(gdp_per_capita_un) + 
                                       log(population)
                                   | 0 | 0 | country, 
                                   data = nelda_ps)


model_aidps_quality_budgetaid <- felm(quality ~ 
                                       log(budget_aid_gdp_null + 1) *  
                                       cabinetINC.12 +
                                  aid_ln +
                                       WBnatres + 
                                       fh + 
                                       nonstate + 
                                       conf_intens + 
                                       log(gdp_per_capita_un) + 
                                       log(population)
                                   | 0 | 0 | country, 
                                   data = nelda_ps)

# extract coefficients for interaction term
mechanism_models <- list("Cabinet PS (Baseline)" = model_aidps_quality_cabinc, 
                         "Senior PS" = model_aidps_quality_seninc, 
                         "Nonsenior PS" = model_aidps_quality_nonseninc, 
                         "DGA" = model_aidps_quality_dga, 
                         "Program Aid"= model_aidps_quality_progaid, 
                         "Budget Aid" = model_aidps_quality_budgetaid) %>% 
   enframe() %>% 
  mutate(tidymodel = map(value, broom::tidy)) %>% 
  unnest(tidymodel) %>% 
  filter(grepl(":", term)) %>% 
  mutate(name = forcats::fct_relevel(name, c("Cabinet PS (Baseline)", 
                                      "Senior PS", 
                                      "Nonsenior PS", 
                                      "DGA", 
                                      "Program Aid", 
                                      "Budget Aid")))
mechanism_models_elec <- mechanism_models
save(mechanism_models_elec, file= "./data/mechanism_models_elec.rda")


mechanisms_elec_models_plot <- ggplot(mechanism_models, aes(x = name, y = estimate) ) +
  geom_point() +
  geom_errorbar(aes(ymin = estimate - 1.67 * std.error, 
                    ymax = estimate + 1.67 * std.error), 
                width = 0) +
  theme_bw() +
  theme(axis.title.y = element_text(size = 10)) +
  geom_hline(yintercept = 0, linetype = 2) +
  labs(x = "", y = "Coefficient Estimate of Interaction between \n Different Types of Power-Sharing (binary) \n and Different Aid Types")


# Output for manuscript
# options(tikzDocumentDeclaration = "\\documentclass[11pt]{article}" )
# tikz("../figures/mechanims_elec_models_plot.tex", height = 2.75)
# print(mechanisms_elec_models_plot)
# dev.off()

# Output for replication archive

print(mechanisms_elec_models_plot)

Table 6.1: Individual Effects of Power-Sharing and Foreign Aid on Post-Conflict Election Quality

# Libraries
library(rms)
library(texreg)

# Load data
load("./data/nelda_ps.rda") 

## Models NELDA (V-Dem Models see Appendix)
model_ps_quality_cabcount <- ols(quality ~ 
                                   cabinetCOUNT.12 +
                                   aid_ln +  
                                   WBnatres + 
                                   fh + 
                                   nonstate + 
                                   conf_intens + 
                                   log(gdp_per_capita_un) + 
                                   log(population)
                                 ,
                                 data = nelda_ps, x = T, y = T)
model_ps_quality_cabcount <- robcov(model_ps_quality_cabcount, nelda_ps$country)

model_ps_quality_seniorcount <- ols(quality ~ 
                                      seniorCOUNT.12 +
                                      aid_ln +  
                                      WBnatres + 
                                      fh + 
                                      nonstate + 
                                      conf_intens + 
                                      log(gdp_per_capita_un) + 
                                      log(population)
                                    ,
                                    data = nelda_ps, x = T, y = T)
model_ps_quality_seniorcount <- robcov(model_ps_quality_seniorcount, nelda_ps$country)

model_ps_quality_nonseniorcount <- ols(quality ~ 
                                         nonseniorCOUNT.12 +
                                         aid_ln +  
                                         WBnatres + 
                                         fh + 
                                         nonstate + 
                                         conf_intens + 
                                         log(gdp_per_capita_un) + 
                                         log(population)
                                       ,
                                       data = nelda_ps, x = T, y = T)
model_ps_quality_nonseniorcount <- robcov(model_ps_quality_nonseniorcount, nelda_ps$country)


# Models Aid
# DGA
model_dga_quality <- ols(quality ~ 
                           cabinetCOUNT.12 +
                           log(dga_gdp_null + 1 )+ 
                           aid_ln +  
                           WBnatres + 
                           fh + 
                           nonstate + 
                           conf_intens + 
                           log(gdp_per_capita_un) + 
                           log(population)
                         ,
                         data = nelda_ps, x = T, y = T)
model_dga_quality <- robcov(model_dga_quality, nelda_ps$country)

# program aid
model_prog_aid_quality <- ols(quality ~ 
                                cabinetCOUNT.12 +
                                log(program_aid_gdp_null + 1 )+ 
                                aid_ln +  
                                WBnatres + 
                                fh + 
                                nonstate + 
                                conf_intens + 
                                log(gdp_per_capita_un) + 
                                log(population)
                              ,
                              data = nelda_ps, x = T, y = T)
model_prog_aid_quality <- robcov(model_prog_aid_quality, nelda_ps$country)

# budget aid
model_budgetaid_quality <- ols(quality ~ 
                                 cabinetCOUNT.12 +
                                 log(budget_aid_gdp_null + 1 )+ 
                                 aid_ln +  
                                 WBnatres + 
                                 fh + 
                                 nonstate + 
                                 conf_intens + 
                                 log(gdp_per_capita_un) + 
                                 log(population)
                               ,
                               data = nelda_ps, x = T, y = T)
model_budgetaid_quality <- robcov(model_budgetaid_quality, nelda_ps$country)

# individual effects model list
ind_effect_models <- list(model_ps_quality_cabcount, 
                         model_ps_quality_seniorcount, 
                         model_ps_quality_nonseniorcount, 
                         model_dga_quality, 
                         model_prog_aid_quality, 
                         model_budgetaid_quality)


# Output
coef_name_map <- list(cabinetCOUNT.12 = "Power-Sharing (cabinet)",
                 seniorCOUNT.12 = "Power-Sharing (senior)", 
                 nonseniorCOUNT.12 = "Power-Sharing (nonsenior)", 
                 aid_ln = "Aid/GDP (log)", 
                 dga_gdp_null = "DGA/GDP (log)", 
                 program_aid_gdp_null= "Program Aid / GDP (log)", 
                 budget_aid_gdp_null = "Budget Aid / GDP (log", 
                 WBnatres = "Nat. Res. Rents", 
                 fh = "Regime Type (FH)", 
                 nonstate = "Nonstate Conflict", 
                 conf_intens =  "Conflict Intensity", 
                 population = "Population (log)", 
                 gdp_per_capita_un = "GDP p/c (log)")

# Get number of clusters
source("./functions/extract_ols_custom.R")

# Output Manuscript
# texreg(l = ind_effect_models,
#           stars = c(0.001, 0.01, 0.05, 0.1),
#           custom.coef.map = coef_name_map,
#        file = "../output/aid_ps_indeff_elections.tex",
#           symbol = "+",
#           table = F,
#           booktabs = T,
#           use.packages = F,
#           dcolumn = T,
#           include.lr = F,
#           include.rsquared = F,
#                  include.cluster = T,
# 
#           include.adjrs = T,
#         caption = "")


# Output Replication Archive
htmlreg(l = ind_effect_models, 
          stars = c(0.001, 0.01, 0.05, 0.1),
          custom.coef.map = coef_name_map,
          symbol = "+",
          table = F,
          booktabs = T,
          use.packages = F,
      
          dcolumn = T,
          include.lr = F,
          include.rsquared = F,
          include.adjrs = T,
          include.cluster = T,
        caption = "", 
        star.symbol = "\\*")
Model 1 Model 2 Model 3 Model 4 Model 5 Model 6
Power-Sharing (cabinet) 0.12* 0.10+ 0.11* 0.13*
(0.05) (0.05) (0.05) (0.05)
Power-Sharing (senior) 0.42**
(0.14)
Power-Sharing (nonsenior) 0.15*
(0.07)
Aid/GDP (log) -0.08 -0.09 -0.07 -0.12 -0.18* -0.14
(0.09) (0.09) (0.09) (0.09) (0.09) (0.09)
DGA/GDP (log) 0.47
(0.38)
Program Aid / GDP (log) 0.36
(0.42)
Budget Aid / GDP (log 0.31
(0.27)
Nat. Res. Rents -0.03+ -0.03* -0.02 -0.03+ -0.03+ -0.03*
(0.01) (0.02) (0.01) (0.02) (0.02) (0.01)
Regime Type (FH) 0.31* 0.29+ 0.32* 0.28+ 0.31* 0.27+
(0.15) (0.15) (0.16) (0.16) (0.16) (0.15)
Nonstate Conflict -2.52** -2.47** -2.56** -2.48** -2.46** -2.55**
(0.83) (0.82) (0.84) (0.81) (0.82) (0.88)
Conflict Intensity -0.68 -0.65 -0.66 -0.72 -0.78+ -0.77
(0.49) (0.47) (0.50) (0.49) (0.46) (0.50)
Population (log) 0.06 0.07 0.06 0.09 0.09 0.09
(0.22) (0.21) (0.22) (0.21) (0.22) (0.22)
GDP p/c (log) -0.24 -0.22 -0.25 -0.18 -0.13 -0.18
(0.24) (0.24) (0.24) (0.25) (0.30) (0.24)
Num. obs. 142 142 142 142 142 142
Countries 41 41 41 41 41 41
Adj. R2 0.17 0.19 0.16 0.18 0.17 0.18
***p < 0.001, **p < 0.01, *p < 0.05, +p < 0.1

Table 6.2: The Interactive Effect of Aid and Power-Sharing on Election Quality

# Libraries
library(rms)

# Load data
load("./data/nelda_ps.rda") 

# nelda_ps <- filter(nelda_ps, country != "Bosnia-Herzegovina")

# Models NELDA
model_aidps_quality_cabinc <- ols(quality ~ 
                                       aid_ln *  
                                       cabinetINC.12 +
                                       WBnatres + 
                                       fh + 
                                       nonstate + 
                                       conf_intens + 
                                       log(gdp_per_capita_un) + 
                                       log(population)
                                       ,
                                     data = nelda_ps, x = T, y = T)
model_aidps_quality_cabinc <- robcov(model_aidps_quality_cabinc, nelda_ps$country)


model_aidps_quality_cabcount <- ols(quality ~ 
                                       aid_ln *  
                                       cabinetCOUNT.12 +
                                       WBnatres + 
                                       fh + 
                                       nonstate + 
                                       conf_intens + 
                                       log(gdp_per_capita_un) + 
                                       log(population)
                                       ,
                                     data = nelda_ps, x = T, y = T)
model_aidps_quality_cabcount <- robcov(model_aidps_quality_cabcount, nelda_ps$country)

# Model Vdem
model_aidps_vdem_cabinc <- ols(v2xel_frefair ~ 
                                       aid_ln *  
                                       cabinetINC.12 +
                                       WBnatres + 
                                       fh + 
                                       nonstate + 
                                       conf_intens + 
                                       log(gdp_per_capita_un) + 
                                       log(population)
                                       ,
                                     data = nelda_ps, x = T, y = T)
model_aidps_vdem_cabinc <- robcov(model_aidps_vdem_cabinc, nelda_ps$country)


model_aidps_vdem_cabcount <- ols(v2xel_frefair ~ 
                                       aid_ln *  
                                       cabinetCOUNT.12 +
                                       WBnatres + 
                                       fh + 
                                       nonstate + 
                                       conf_intens + 
                                       log(gdp_per_capita_un) + 
                                       log(population)
                                       ,
                                     data = nelda_ps, x = T, y = T)
model_aidps_vdem_cabcount <- robcov(model_aidps_vdem_cabcount, nelda_ps$country)


# Output
int_eff_model_list <- list(model_aidps_quality_cabinc, 
                           model_aidps_quality_cabcount, 
                           model_aidps_vdem_cabinc, 
                           model_aidps_vdem_cabcount)

coef_name_map <- list( cabinetINC.12 = "Power-Sharing (binary)",
                       "aid_ln * cabinetINC.12" = "Power-Sharing (binary) * Aid", 
                       cabinetCOUNT.12 = "Power-Sharing (cabinet)",
                       "aid_ln * cabinetCOUNT.12" = "Power-Sharing (cabinet) * Aid", 
                       aid_ln = "Aid/GDP (log)", 
                       dga_gdp_null = "DGA/GDP (log)", 
                       program_aid_gdp_null= "Program Aid / GDP (log)", 
                       budget_aid_gdp_null = "Budget Aid / GDP (log", 
                       WBnatres = "Nat. Res. Rents", 
                       fh = "Regime Type (FH)", 
                       nonstate = "Nonstate Conflict", 
                       conf_intens =  "Conflict Intensity", 
                       population = "Population (log)", 
                       gdp_per_capita_un = "GDP p/c (log)")

source("./functions/custom_texreg.R")
environment(custom_texreg) <- asNamespace('texreg')

# custom_texreg(l = int_eff_model_list, 
#           stars = c(0.001, 0.01, 0.05, 0.1),
#           custom.coef.map = coef_name_map,
#           file = "../output/aidps_elections_interaction_mainresults.tex", 
#           symbol = "+",
#           table = F,
#           booktabs = T,
#           custom.multicol = T, 
#            custom.model.names = c(" \\multicolumn{2}{c}{\\textbf{NELDA Election Quality}} & 
#                               \\multicolumn{2}{c}{\\textbf{V-Dem Clean Elections Index}} \\\\ 
#                               \\cmidrule(r){2-3} \\cmidrule(r){4-5} 
#                               & \\multicolumn{1}{c}{(1)  }",
#                               "\\multicolumn{1}{c}{(2)  }",
#                               "\\multicolumn{1}{c}{(3)  }",
#                               "\\multicolumn{1}{c}{(4)  }"),
#           use.packages = F,
#           dcolumn = T,
#           include.lr = F,
#         include.cluster = T, 
#           include.rsquared = F,
#           include.adjrs = T)

htmlreg(l = int_eff_model_list, 
          stars = c(0.001, 0.01, 0.05, 0.1),
          custom.coef.map = coef_name_map,
          symbol = "+",
          table = F,
          booktabs = T,
          use.packages = F,
          dcolumn = T,
          include.lr = F,
        include.cluster = T, 
          include.rsquared = F,
          include.adjrs = T,
        caption = "", 
        star.symbol = "\\*")
Model 1 Model 2 Model 3 Model 4
Power-Sharing (binary) -2.97** -0.24*
(1.12) (0.11)
Power-Sharing (binary) * Aid 1.49*** 0.17***
(0.43) (0.04)
Power-Sharing (cabinet) -0.22* -0.04*
(0.09) (0.02)
Power-Sharing (cabinet) * Aid 0.12*** 0.02***
(0.04) (0.01)
Aid/GDP (log) -0.12 -0.08 -0.02+ -0.01
(0.08) (0.09) (0.01) (0.01)
Nat. Res. Rents -0.03* -0.03* -0.01*** -0.01***
(0.01) (0.02) (0.00) (0.00)
Regime Type (FH) 0.33* 0.29+ 0.09*** 0.08***
(0.15) (0.15) (0.02) (0.02)
Nonstate Conflict -2.48** -2.46** -0.25*** -0.24***
(0.80) (0.80) (0.05) (0.05)
Conflict Intensity -0.47 -0.58 0.02 0.01
(0.45) (0.49) (0.05) (0.07)
Population (log) 0.08 0.07 0.03* 0.02
(0.21) (0.21) (0.01) (0.01)
GDP p/c (log) -0.20 -0.18 0.02 0.02
(0.23) (0.25) (0.02) (0.02)
Num. obs. 142 142 141 141
Countries 41 41 41 41
Adj. R2 0.21 0.18 0.53 0.49
***p < 0.001, **p < 0.01, *p < 0.05, +p < 0.1

Table 6.3: Probing Mechanisms II: Aid Cut-Offs, Election Monitors, and Post-Conflict Election Quality

# Libraries
library(rms)
library(plm)
library(countrycode)

# load data
load("./data/nelda_ps.rda")

# aid cutoffs
model_aidps_aidcutoff <- ols(quality ~ 
                                       aid_ln  +
                                      nelda57 * # aid cutoff
                                       cabinetCOUNT.12 +
                                       WBnatres + 
                                       fh + 
                                       nonstate + 
                                       conf_intens + 
                                       log(gdp_per_capita_un) + 
                                       log(population)
                                       ,
                             data = nelda_ps, x = T, y = T)
model_aidps_aidcutoff <- robcov(model_aidps_aidcutoff, nelda_ps$country)

# election monitors
model_aidps_elmons <- ols(quality ~ 
                            aid_ln  +
                            nelda45 * # aid cutoff
                            cabinetCOUNT.12 +
                            WBnatres + 
                            fh + 
                            nonstate + 
                            conf_intens + 
                            log(gdp_per_capita_un) + 
                            log(population)
                          ,
                          data = nelda_ps, x = T, y = T)
model_aidps_elmons <- robcov(model_aidps_elmons, nelda_ps$country)

# aid cutoffs
model_aidps_aidcutoff_vdem <- ols(v2xel_frefair ~ 
                                       aid_ln  +
                                      nelda57 * # aid cutoff
                                       cabinetCOUNT.12 +
                                       WBnatres + 
                                       fh + 
                                       nonstate + 
                                       conf_intens + 
                                       log(gdp_per_capita_un) + 
                                       log(population)
                                       ,
                                     data = nelda_ps, x = T, y = T)
model_aidps_aidcutoff_vdem <- robcov(model_aidps_aidcutoff_vdem, nelda_ps$country)

# election monitors
model_aidps_elmons_vdem <- ols(v2xel_frefair ~ 
                            aid_ln  +
                            nelda45 * # election monitors
                            cabinetCOUNT.12 +
                            WBnatres + 
                            fh + 
                            nonstate + 
                            conf_intens + 
                            log(gdp_per_capita_un) + 
                            log(population)
                          ,
                          data = nelda_ps, x = T, y = T)
model_aidps_elmons_vdem <- robcov(model_aidps_elmons_vdem, nelda_ps$country)

# Output
model_list <- list(model_aidps_aidcutoff, 
                   model_aidps_elmons, 
                   model_aidps_aidcutoff_vdem, 
                   model_aidps_elmons_vdem)

coef_name_map <- list( cabinetINC.12 = "Power-Sharing (binary)",
                       cabinetCOUNT.12 = "Power-Sharing (cabinet)",
                       
                       nelda57 = "Aid Cut-Off", 
                       "nelda57 * cabinetCOUNT.12" = "Power-Sharing (cabinet) * Aid Cut-Off",
                       nelda45 = "Election Monitors",
                       
                       "nelda45 * cabinetCOUNT.12" = "Power-Sharing (cabinet) * Election Monitors",
                       
                       "aid_ln * cabinetINC.12" = "Power-Sharing (binary) * Aid", 
                       "aid_ln * cabinetCOUNT.12" = "Power-Sharing (cabinet) * Aid", 
                       aid_ln = "Aid/GDP (log)", 
                       dga_gdp_null = "DGA/GDP (log)", 
                       program_aid_gdp_null= "Program Aid / GDP (log)", 
                       budget_aid_gdp_null = "Budget Aid / GDP (log", 
                       WBnatres = "Nat. Res. Rents", 
                       fh = "Regime Type (FH)", 
                       nonstate = "Nonstate Conflict", 
                       conf_intens =  "Conflict Intensity", 
                       population = "Population (log)", 
                       gdp_per_capita_un = "GDP p/c (log)")



source("./functions/custom_texreg.R")
environment(custom_texreg) <- asNamespace('texreg')

# 
# custom_texreg(l = model_list,
#               stars = c(0.001, 0.01, 0.05, 0.1),
#               file = "../output/aidcutoff_elmon_elections.tex", 
#               custom.coef.map = coef_name_map,
#               symbol = "+",
#               table = F,
#               booktabs = T,
#               use.packages = F,
#               custom.multicol = T, 
#               custom.model.names = c(" \\multicolumn{2}{c}{\\textbf{NELDA Election Quality}} & 
#                               \\multicolumn{2}{c}{\\textbf{V-Dem Clean Elections Index}} \\\\ 
#                               \\cmidrule(r){2-3} \\cmidrule(r){4-5} 
#                               & \\multicolumn{1}{c}{(1)  }",
#                               "\\multicolumn{1}{c}{(2)  }",
#                               "\\multicolumn{1}{c}{(3)  }",
#                               "\\multicolumn{1}{c}{(4)  }"),
#               dcolumn = T,
#               include.lr = F,
#               include.rsquared = F,
#               include.adjrs = T,
#               include.cluster = T)


htmlreg(l = model_list,
          stars = c(0.001, 0.01, 0.05, 0.1),
          custom.coef.map = coef_name_map,
          symbol = "+",
          table = F,
          booktabs = T,
          use.packages = F,
      
          dcolumn = T,
          include.lr = F,
          include.rsquared = F,
          include.adjrs = T,
          include.cluster = T,
        caption = "", 
        star.symbol = "\\*")
Model 1 Model 2 Model 3 Model 4
Power-Sharing (cabinet) 0.11* 0.48 0.02* 0.02
(0.05) (0.63) (0.01) (0.09)
Aid Cut-Off -0.41 -0.02
(0.83) (0.09)
Power-Sharing (cabinet) * Aid Cut-Off 1.43** 0.15**
(0.47) (0.05)
Election Monitors 0.57 0.03
(0.71) (0.05)
Power-Sharing (cabinet) * Election Monitors -0.36 0.00
(0.63) (0.09)
Aid/GDP (log) -0.09 -0.10 -0.01 -0.01
(0.08) (0.09) (0.01) (0.01)
Nat. Res. Rents -0.03+ -0.03+ -0.01*** -0.01***
(0.01) (0.01) (0.00) (0.00)
Regime Type (FH) 0.32* 0.35* 0.09*** 0.09***
(0.15) (0.17) (0.02) (0.02)
Nonstate Conflict -2.60** -2.27** -0.26*** -0.24***
(0.90) (0.87) (0.05) (0.05)
Conflict Intensity -0.76 -0.67 -0.01 -0.01
(0.49) (0.50) (0.07) (0.07)
Population (log) 0.08 0.02 0.02 0.02
(0.22) (0.18) (0.01) (0.02)
GDP p/c (log) -0.29 -0.28 0.01 0.01
(0.24) (0.24) (0.02) (0.03)
Num. obs. 142 142 141 141
Countries 41 41 41 41
Adj. R2 0.17 0.16 0.46 0.45
***p < 0.001, **p < 0.01, *p < 0.05, +p < 0.1

Table 6.4: Robustness Checks and Alternative Specifications for the Interaction Effect of Aid and Power-Sharing on Election Quality

# Libraries
library(rms)
library(plm)
library(countrycode)
library(texreg)

# load data
load("./data/nelda_ps.rda")

# Ethnic Fractionalization
model_aidps_quality_cabcount_elf <- ols(quality ~ 
                                       aid_ln *  
                                       cabinetCOUNT.12 +
                                       WBnatres + 
                                       fh + 
                                       nonstate + 
                                       conf_intens + 
                                       log(gdp_per_capita_un) + 
                                       log(population) +
                                         Ethnic
                                       ,
                                     data = nelda_ps, x = T, y = T)
model_aidps_quality_cabcount_elf <- robcov(model_aidps_quality_cabcount_elf, nelda_ps$country)


# PKO
model_aidps_quality_cabcount_pko <- ols(quality ~ 
                                       aid_ln *  
                                       cabinetCOUNT.12 +
                                       WBnatres + 
                                       fh + 
                                       nonstate + 
                                       conf_intens + 
                                       log(gdp_per_capita_un) + 
                                       log(population) +
                                         DS_ordinal
                                       ,
                                     data = nelda_ps, x = T, y = T)
model_aidps_quality_cabcount_pko <- robcov(model_aidps_quality_cabcount_pko, nelda_ps$country)

# cabinet size
library(readxl)
cnts <- read_excel("./data/CNTSDATA.xls")

DEFINEDNAME: 21 00 00 01 0b 00 00 00 01 00 00 00 00 00 00 0d 3b 00 00 00 00 e5 3b 00 00 c1 00 DEFINEDNAME: 21 00 00 01 0b 00 00 00 01 00 00 00 00 00 00 0d 3b 00 00 00 00 e5 3b 00 00 c1 00 DEFINEDNAME: 21 00 00 01 0b 00 00 00 01 00 00 00 00 00 00 0d 3b 00 00 00 00 e5 3b 00 00 c1 00 DEFINEDNAME: 21 00 00 01 0b 00 00 00 01 00 00 00 00 00 00 0d 3b 00 00 00 00 e5 3b 00 00 c1 00

cnts <- cnts %>% filter(year >= 1989)

cnts$iso3c <- countrycode(cnts$country, "country.name", "iso3c")
cnts <- cnts %>% filter(country != "SOMALILAND")

testcabsize <- left_join(nelda_ps, cnts[, c("iso3c", "year", "polit10")])

testcabsize$ps_share <- testcabsize$cabinetCOUNT / testcabsize$polit10 * 100

model_el_cabshare <- ols(quality ~ 
                           aid_ln *  
                           ps_share +
                           WBnatres + 
                           fh + 
                           nonstate + 
                           conf_intens + 
                           log(gdp_per_capita_un) + 
                           log(population) 
                         
                         ,
                         data = testcabsize, x = T, y = T)
model_el_cabshare <- robcov(model_el_cabshare, testcabsize$country)

# Was Incumbent contested: nelda20
nelda_ps <- as.data.frame(nelda_ps)
nelda_ps$nelda20 <- ifelse(nelda_ps$nelda20 == "yes", 1, 0)

inc_contested <- nelda_ps %>% 
  filter(nelda20 == 1)

inc_notcontested <- nelda_ps %>% 
  filter(nelda20 == 0)

inc_contested_model <- ols(quality ~ 
                             aid_ln *
                             cabinetCOUNT.12  +
                             WBnatres + 
                             fh + 
                             nonstate + 
                             conf_intens + 
                             log(gdp_per_capita_un) + 
                             log(population)  
                           ,
                           data = inc_contested, x = T, y = T)
inc_contested_model <- robcov(inc_contested_model, inc_contested$country)

inc_notcontested_model <- ols(quality ~ 
                                aid_ln *
                                cabinetCOUNT.12  +
                                WBnatres + 
                                fh + 
                                nonstate + 
                                conf_intens + 
                                log(gdp_per_capita_un) + 
                                log(population)  
                              ,
                              data = inc_notcontested, x = T, y = T)
inc_notcontested_model <- robcov(inc_notcontested_model, inc_notcontested$country)

# Type of Election 
model_aidps_quality_cabcount_eltype <- ols(quality ~ 
                                       aid_ln *  
                                       cabinetCOUNT.12 +
                                       WBnatres + 
                                       fh + 
                                       nonstate + 
                                       conf_intens + 
                                       log(gdp_per_capita_un) + 
                                       log(population) +
                                        types
                                       ,
                                     data = nelda_ps, x = T, y = T)
model_aidps_quality_cabcount_eltype <- robcov(model_aidps_quality_cabcount_eltype, nelda_ps$country)

# Random Effects
countryre_aidps_quality_cabcount <- plm(quality ~ 
                                       aid_ln *  
                                       cabinetCOUNT.12 +
                                       WBnatres + 
                                       fh + 
                                       nonstate + 
                                       conf_intens + 
                                       log(gdp_per_capita_un) + 
                                       log(population) 
                                       ,
                                     data = nelda_ps,
                                     index = c("country", "electionid"),
                                     model = "random")

series nelda16, nelda23notes, nelda41notes, nelda42notes, longenough, Item, newconflictinyearv412, onset5v412, onset8v412, onset20v412, bothgovterrv412 are constants and have been removed

countryre_aidps_quality_cabcount$vcov <- vcovHC(countryre_aidps_quality_cabcount)



# Region FE
nelda_ps$region_fe <- countrycode(nelda_ps$country, "country.name", "region")

regionfe_aidps_quality_cabcount <- ols(quality ~ 
                                       aid_ln *  
                                       cabinetCOUNT.12 +
                                       WBnatres + 
                                       fh + 
                                         nonstate + 
                                       conf_intens + 
                                       log(gdp_per_capita_un) + 
                                       log(population)+
                                         region_fe 
                                       ,
                                     data = nelda_ps, y = T, x = T)
regionfe_aidps_quality_cabcount <- robcov(regionfe_aidps_quality_cabcount, nelda_ps$country)

# Country FE
countryfe_aidps_quality_cabcount <- plm(quality ~ 
                                       aid_ln *  
                                       cabinetCOUNT.12 +
                                       WBnatres + 
                                       fh + 
                                       nonstate + 
                                       conf_intens + 
                                       log(gdp_per_capita_un) + 
                                       log(population) 
                                       ,
                                     data = nelda_ps,
                                     index = c("country", "electionid"),
                                     model = "within")

series nelda16, nelda23notes, nelda41notes, nelda42notes, longenough, Item, newconflictinyearv412, onset5v412, onset8v412, onset20v412, bothgovterrv412 are constants and have been removed

countryfe_aidps_quality_cabcount$vcov <- vcovHC(countryfe_aidps_quality_cabcount)


# Output

# First: create model list
rob_election_modellist <- list(model_aidps_quality_cabcount_elf, 
                               model_aidps_quality_cabcount_pko, 
                               model_el_cabshare,
                               inc_contested_model,
                               inc_notcontested_model, 
                               # model_aidps_quality_cabcount_eltype,
                               countryre_aidps_quality_cabcount, 
                               regionfe_aidps_quality_cabcount)

coef_name_map <- list(cabinetINC.12 = "Power-Sharing (binary)",
                      cabinetCOUNT.12 = "Power-Sharing (cabinet)",
                      "aid_ln:cabinetCOUNT.12" = "Power-Sharing (cabinet) * Aid",
                      "aid_ln * cabinetCOUNT.12" = "Power-Sharing (cabinet) * Aid",
                      ps_share = "Power-Sharing (cabinet share)",
                      "aid_ln * ps_share" = "Power-Sharing (cabinet share) * Aid",
                      
                    
                      aid_ln = "Aid/GDP (log)",
                      WBnatres = "Nat. Res. Rents", 
                      fh = "Regime Type (FH)", 
                      nonstate = "Nonstate Conflict", 
                      conf_intens =  "Conflict Intensity", 
                      population = "Population (log)", 
                      "log(population)" = "Population (log)",
                      gdp_per_capita_un = "GDP p/c (log)",
                      "log(gdp_per_capita_un)" = "GDP p/c (log)",
                      Ethnic = "Ethnic Fractionalization", 
                      DS_ordinal = "UN PKO", 
                      nelda45 = "Election Monitors", 
                      types = "Type of Election")

source("./functions/extract_ols_custom.R")
source("./functions/extract_plm_custom.R")

# Output Manuscript
texreg(rob_election_modellist,
       stars = c(0.001, 0.01, 0.05, 0.1),
       custom.coef.map = coef_name_map,
       file = "../output/aidps_elections_interaction_robustness.tex",
       symbol = "+",
       table = F,
       booktabs = T,
       custom.model.names = c("(1) ELF", 
                              "(2) UN PKO", 
                              "(3) Cab. Size", 
                              "(4) Inc. Contest.", 
                              "(5) Inc. Not Cont.", 
                              "(6) RE", 
                              "(6) Region FE" ),
       use.packages = F,
       dcolumn = T,
       include.lr = F,
       include.adjrs = T,
       caption = "",
       star.symbol = "\\*",
       include.rsquared = F,
       include.cluster = T,
       include.variance = F)

# Output Replication Archive
texreg::htmlreg(rob_election_modellist, 
                stars = c(0.001, 0.01, 0.05, 0.1),
                custom.coef.map = coef_name_map,
                symbol = "+",
                table = F,
                 custom.model.names = c("(1) ELF", 
                              "(2) UN PKO", 
                              "(3) Cab. Size", 
                              "(4) Inc. Contest.", 
                              "(5) Inc. Not Cont.", 
                              "(6) RE", 
                              "(6) Region FE" ),
                booktabs = T,
                use.packages = F,
                dcolumn = T,
                include.lr = F,
                include.adjrs = T,
                caption = "", 
                star.symbol = "\\*", 
                include.rsquared = F,
                include.cluster = T,
                include.variance = F)
(1) ELF (2) UN PKO (3) Cab. Size (4) Inc. Contest. (5) Inc. Not Cont. (6) RE (6) Region FE
Power-Sharing (cabinet) -0.18+ -0.17+ -0.11 -0.33** -0.27* -0.21+
(0.11) (0.09) (0.11) (0.12) (0.12) (0.11)
Power-Sharing (cabinet) * Aid 0.09* 0.09* 0.10** 0.15** 0.12* 0.10**
(0.04) (0.04) (0.04) (0.05) (0.05) (0.04)
Power-Sharing (cabinet share) -0.05+
(0.02)
Power-Sharing (cabinet share) * Aid 0.03**
(0.01)
Aid/GDP (log) -0.16+ -0.09 -0.04 -0.18 0.02 -0.02 -0.09
(0.08) (0.09) (0.10) (0.12) (0.09) (0.11) (0.10)
Nat. Res. Rents -0.04*** -0.03+ -0.02 -0.04* -0.03+ -0.01 -0.04**
(0.01) (0.02) (0.02) (0.02) (0.02) (0.02) (0.01)
Regime Type (FH) 0.26+ 0.32* 0.19 0.44* 0.24 0.35+ 0.33*
(0.14) (0.16) (0.20) (0.21) (0.16) (0.18) (0.16)
Nonstate Conflict -2.86** -2.46** -1.99* -1.07 -3.59*** -2.99*** -3.02***
(1.03) (0.80) (0.94) (1.15) (0.47) (0.75) (0.81)
Conflict Intensity -0.70 -0.78 -0.61 -0.65 -0.67 -0.63 -0.07
(0.45) (0.51) (0.52) (0.55) (0.56) (0.67) (0.52)
Population (log) -0.01 0.07 0.21 -0.09 0.30 -0.08 -0.01
(0.14) (0.21) (0.25) (0.22) (0.19) (0.19) (0.18)
GDP p/c (log) -0.29 -0.16 -0.00 -0.36 -0.15 -0.21 -0.32
(0.24) (0.24) (0.33) (0.30) (0.26) (0.33) (0.31)
Ethnic Fractionalization 2.69***
(0.68)
UN PKO 0.17
(0.19)
Num. obs. 142 142 114 74 68 142 142
Countries 41 41 36 41 34 41 41
Adj. R2 0.31 0.19 0.10 0.13 0.22 0.40 0.36
***p < 0.001, **p < 0.01, *p < 0.05, +p < 0.1

Table 6.5: Matching Results for the Interactive Effect of Foreign Aid and Power-Sharing on Post-Conflict Election Quality

# Libraries
library(rms)
library(texreg)

# Load matched data set
load("./data/nelda_ps_matched.rda")

match_df_elec_reg$aid_ln <- log(match_df_elec_reg$aiddata_AidGDP)


# NELDA
model_matched_aidps_cabINC_nelda <- rms::ols(quality ~ 
                                             aid_ln * cabinetINC.12 +
                                             log(gdp_per_capita_un) +
                                             log(population) +
                                             conf_intens +
                                             #        nonstate +
                                             WBnatres +
                                             fh, 
                                           data = match_df_elec_reg , 
                                           x = T , y = T)

model_matched_aidps_cabINC_nelda  <- robcov(model_matched_aidps_cabINC_nelda , match_df_elec_reg$country)



# cabinetINC * Aid; V-Dem
model_matched_aidps_cabINC_vdem <- rms::ols(v2xel_frefair ~ 
                                               aid_ln * cabinetINC.12 +
                                              log(gdp_per_capita_un) +
                                              log(population) +
                                              conf_intens +
                                              #        nonstate +
                                              WBnatres +
                                              fh , 
                                             data = match_df_elec_reg , 
                                            x = T , y = T)

model_matched_aidps_cabINC_vdem  <- robcov(model_matched_aidps_cabINC_vdem , match_df_elec_reg$country)


# Output 
matched_election_modellist <- list(model_matched_aidps_cabINC_nelda, 
                                   model_matched_aidps_cabINC_vdem)

coef_name_map <- list(cabinetINC.12 = "Power-Sharing (binary)",
                      "aid_ln * cabinetINC.12" = "Power-Sharing (binary) * Aid",
                      ps_share = "Power-Sharing (cabinet share)",
                      
                    
                      aid_ln = "Aid/GDP (log)",
                      WBnatres = "Nat. Res. Rents", 
                      fh = "Regime Type (FH)", 
                      nonstate = "Nonstate Conflict", 
                      conf_intens =  "Conflict Intensity", 
                      population = "Population (log)", 
                      "log(population)" = "Population (log)",
                      gdp_per_capita_un = "GDP p/c (log)",
                      "log(gdp_per_capita_un)" = "GDP p/c (log)",
                      Ethnic = "Ethnic Fractionalization", 
                      DS_ordinal = "UN PKO", 
                      nelda45 = "Election Monitors", 
                      types = "Type of Election")

source("./functions/extract_ols_custom.R")

# texreg(matched_election_modellist, 
#        file = "../output/matched_results_elections.tex",
#                 stars = c(0.001, 0.01, 0.05, 0.1),
#                 custom.coef.map = coef_name_map,
#                 symbol = "+",
#                 table = F,
#                 booktabs = T,
#                 use.packages = F,
#                 custom.model.names = c("(1) NELDA", "(2) V-Dem"),
#                 dcolumn = T,
#                 include.lr = F,
#                 include.adjrs = T,
#                 caption = "", 
#                 star.symbol = "\\*", 
#                 include.rsquared = F,
#                 include.cluster = T,
#                 include.variance = F)


texreg::htmlreg(matched_election_modellist, 
                stars = c(0.001, 0.01, 0.05, 0.1),
                custom.coef.map = coef_name_map,
                symbol = "+",
                table = F,
                booktabs = T,
                use.packages = F,
                custom.model.names = c("(1) NELDA", "V-Dem"),
                dcolumn = T,
                include.lr = F,
                include.adjrs = T,
                caption = "", 
                star.symbol = "\\*", 
                include.rsquared = F,
                include.cluster = T,
                include.variance = F)
(1) NELDA V-Dem
Power-Sharing (binary) -2.30* -0.16+
(1.08) (0.08)
Power-Sharing (binary) * Aid 1.11* 0.13***
(0.46) (0.03)
Aid/GDP (log) 0.18 -0.00
(0.39) (0.04)
Nat. Res. Rents -0.02 -0.00
(0.02) (0.00)
Regime Type (FH) 0.16 0.10+
(0.37) (0.05)
Conflict Intensity -1.75*** -0.02
(0.51) (0.08)
Population (log) 0.58* 0.04+
(0.29) (0.02)
GDP p/c (log) 0.12 0.03
(0.59) (0.06)
Num. obs. 72 72
Countries 26 26
Adj. R2 0.18 0.33
***p < 0.001, **p < 0.01, *p < 0.05, +p < 0.1

Table 6.6 Instrumental Variable Results for the Interactive Effect of Foreign Aid and Power-Sharing on Post-Conflict Election Quality

# Libraries
library(tidyverse)
library(lfe)

# Load elections data
load("./data/nelda_ps.rda")

# load instrument data for aid
load(file = "./data/instrumentedAid2.RData")

nelda_ivreg <- left_join(nelda_ps, instrument_df,
                         by = c("year", "iso2c"))

nelda_ivreg$total_sum_except <- as.numeric(nelda_ivreg$total_sum_except)

nelda_ivreg$instr_aid_gdp <- log(nelda_ivreg$total_sum_except / nelda_ivreg$GDP)

nelda_ivreg$date <- NULL
nelda_ivreg$StartDate2 <- NULL
nelda_ivreg$yearmon.x <- NULL
nelda_ivreg$yearmon.y <- NULL
nelda_ivreg[nelda_ivreg == ""] <- NA


# hard code interactions for felm
nelda_ivreg$cabXaid_instr <- nelda_ivreg$cabinetCOUNT.12 * nelda_ivreg$instr_aid_gdp
nelda_ivreg$cabXaid <- nelda_ivreg$cabinetCOUNT.12 * nelda_ivreg$aid_ln

# Models
model_iv_aidps_nelda <- felm(quality  ~ 
                          cabinetCOUNT.12  + 
                          WBnatres + 
                          fh + 
                          nonstate + 
                          conf_intens + 
                          log(gdp_per_capita_un) + 
                          log(population) 
                          | 0 | (cabXaid_instr | aid_ln ~ cabXaid + instr_aid_gdp ) | country, data = nelda_ivreg)

# V-Dem
model_iv_aidps_vdem <- felm(v2xel_frefair  ~ 
                          cabinetCOUNT.12  + 
                          WBnatres + 
                          fh + 
                          nonstate + 
                          conf_intens + 
                          log(gdp_per_capita_un) + 
                          log(population) 
                          | 0 | (cabXaid_instr | aid_ln ~ cabXaid + instr_aid_gdp ) | country, data = nelda_ivreg)


# Output

model_list <- list(model_iv_aidps_nelda, 
                   model_iv_aidps_vdem)
# coef name map

coef_name_map <- list(cabinetCOUNT.12 = "Power-Sharing (cabinet)",
                      "`aid_ln(fit)`" = "Aid / GDP (instrumented)",
                      "`cabXaid_instr(fit)`" = "Power-Sharing (cabinet) * Aid (instrumented)", 
                      "aid_ln * cabinetINC.12" = "Power-Sharing (binary) * Aid",

                    
                      aid_ln = "Aid/GDP (log)",
                      WBnatres = "Nat. Res. Rents", 
                      fh = "Regime Type (FH)", 
                      nonstate = "Nonstate Conflict", 
                      conf_intens =  "Conflict Intensity", 
                      population = "Population (log)", 
                      "log(population)" = "Population (log)",
                      gdp_per_capita_un = "GDP p/c (log)",
                      "log(gdp_per_capita_un)" = "GDP p/c (log)")

source("./functions/custom_texreg.R")
environment(custom_texreg) <- asNamespace('texreg')

# Output Manuscript
# custom_texreg(model_list, 
#               custom.coef.map = coef_name_map, 
#               file = "../output/iv_results_elections.tex",
#               add.lines = list(c("Kleibergen-Paap rk Wald F statistic",
#                                  "17.50",
#                                  "17.50"),
#                                c("Adj. R$^2$",
#                                  round(summary(model_iv_aidps_nelda)$adj.r.squared, 2),
#                                  round(summary(model_iv_aidps_vdem)$adj.r.squared, 2)), 
#                                 c("Countries", 
#                                  length(unique(nelda_ivreg$country)), 
#                                  length(unique(nelda_ivreg$country)))), 
#               stars = c(0.001, 0.01, 0.05, 0.1),
#               symbol = "+",
#               table = F,
#               booktabs = T,
#               use.packages = F,
#               custom.model.names = c("(1) NELDA", "(2) V-Dem"),
#               dcolumn = T,
#               include.lr = F,
#               caption = "", 
#               star.symbol = "\\*", 
#               include.rsquared = F,
#               include.adjrs = F, 
#               include.cluster = T,
#               include.variance = F)

# output replication archive
texreg::htmlreg(model_list,
              custom.coef.map = coef_name_map, 
              stars = c(0.001, 0.01, 0.05, 0.1),
              symbol = "+",
              table = F,
              booktabs = T,
              use.packages = F,
              custom.model.names = c("(1) NELDA", "(2) V-Dem"),
              dcolumn = T,
              include.lr = F,
              caption = "", 
              star.symbol = "\\*", 
              include.rsquared = F,
              include.adjrs = T, 
              include.cluster = T,
              include.variance = F)
(1) NELDA (2) V-Dem
Power-Sharing (cabinet) -2.03* -0.37***
(0.80) (0.07)
Aid / GDP (instrumented) -0.04 -0.03
(0.22) (0.03)
Power-Sharing (cabinet) * Aid (instrumented) 0.10** 0.02***
(0.04) (0.00)
Nat. Res. Rents -0.03+ -0.01***
(0.02) (0.00)
Regime Type (FH) 0.27 0.09***
(0.18) (0.02)
Nonstate Conflict -2.49** -0.24***
(0.86) (0.05)
Conflict Intensity -0.61 0.03
(0.53) (0.08)
Population (log) 0.10 0.02
(0.24) (0.02)
GDP p/c (log) -0.14 0.00
(0.34) (0.04)
Num. obs. 142 141
Adj. R2 (full model) 0.18 0.49
Adj. R2 (proj model) 0.18 0.49
***p < 0.001, **p < 0.01, *p < 0.05, +p < 0.1

Supplement: Stata code to generate F-Statistics for IV/2SLS models


use ".\data\ivelections.dta", replace

*gen aid_ln = log(aiddata_AidGDP)
gen gdp_pc_ln = log(gdp_per_capita_un)
gen ln_pop = log(population)

gen cabXaid = cabinetINC_12 * aid_ln
gen cabXinsaid = cabinetINC_12 * instr_aid_gdp

* 2SLS for NELDA election quality to extract F-Statistic
ivreg2 quality cabinetINC_12 /// 
nonstate WBnatres fh gdp_pc_ln ln_pop conf_intens (aid_ln cabXaid =  instr_aid_gdp cabXinsaid) , cluster(country) ffirst

ivreg2 v2xel_frefair cabinetINC_12 /// 
nonstate WBnatres fh gdp_pc_ln ln_pop conf_intens (aid_ln cabXaid =  instr_aid_gdp cabXinsaid) , cluster(country) ffirst
LS0tDQp0aXRsZTogIkNoYXB0ZXIgNjogRWxlY3Rpb24gUXVhbGl0eSINCm91dHB1dDogDQogIGh0bWxfZG9jdW1lbnQ6DQogICAgdG9jOiB0cnVlDQogICAgdG9jX2Zsb2F0OiANCiAgICAgIGNvbGxhcHNlZDogZmFsc2UNCiAgICBjb2RlX2Rvd25sb2FkOiB0cnVlDQogICAgY29kZV9mb2xkaW5nOiAiaGlkZSINCg0KLS0tDQoNCg0KIyBGaWd1cmUgNi4xOiBFbGVjdGlvbiBRdWFsaXR5LCBQb3dlci1TaGFyaW5nIEdvdmVybm1lbnRzLCBhbmQgQWlkOiBJbmRpdmlkdWFsDQpQYXR0ZXJucw0KDQpgYGB7ciwgZmlnLmFsaWduID0gImNlbnRlciIsIG1lc3NhZ2U9RixmaWcuaGVpZ2h0ID0gMy41LCAgd2FybmluZz1GLCBjYWNoZSA9IFQsIGNvbW1lbnRzID0gRiwgZGV2ID0gIkNhaXJvUE5HIn0NCiMgTGlicmFyaWVzDQpsaWJyYXJ5KHRpZHl2ZXJzZSkNCmxpYnJhcnkoZ2dyZXBlbCkNCmxpYnJhcnkodGlrekRldmljZSkNCmxpYnJhcnkoZ3JpZEV4dHJhKQ0KbGlicmFyeShjb3dwbG90KQ0KDQojIExvYWQgZGF0YQ0KbG9hZCgiLi9kYXRhL25lbGRhX3BzLnJkYSIpDQoNCiMgUGxvdCBQb3dlci1TaGFyaW5nDQpuZWxkYV9wcyRjYWJpbmV0SU5DbGFiZWwgPC0gaWZlbHNlKG5lbGRhX3BzJGNhYmluZXRJTkMuMTIgPT0gMSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlBvd2VyLVNoYXJpbmciLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk5vIFBvd2VyLVNoYXJpbmciKQ0KDQpuZWxkYV9xdWFsaXR5X2JveHBsb3QgPC0gZ2dwbG90KG5lbGRhX3BzLCBhZXMoeCA9IGNhYmluZXRJTkNsYWJlbCwgeSA9IHF1YWxpdHkpKSArDQogIGdlb21faml0dGVyKGhlaWdodCA9IDAuMSwgc2l6ZSA9IDEuNywgYWxwaGEgPSAwLjUpICsNCiAgZ2VvbV9ib3hwbG90KGFlcyhmaWxsID0gY2FiaW5ldElOQ2xhYmVsKSwgYWxwaGEgPSAwLjYpICsNCiAgc2NhbGVfZmlsbF9icmV3ZXIocGFsZXR0ZSA9ICJCbHVlcyIpICsgDQogIHN0YXRfc3VtbWFyeShhZXMoZ3JvdXAgPSAxKSwgZnVuLnkgPSBtZWFuLCBnZW9tID0gInBvaW50Iiwgc2hhcGUgPSAyMywNCiAgICAgICAgICAgICAgIHNpemUgPSA0LCBmaWxsID0gIiNkNzE5MWMiLCBjb2xvciA9ICIjZDcxOTFjIikgKyANCiAgdGhlbWVfYncoKSArDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIikgKyANCiAgbGFicyh4ID0gIiIsIHkgPSAiTkVMREEgRWxlY3Rpb24gUXVhbGl0eSBJbmRleCIpDQoNCg0KIyBQbG90IEFpZA0KbmVsZGFfYWlkX3Bsb3QgPC0gZ2dwbG90KG5lbGRhX3BzLCBhZXMoeCA9IGxvZyhhaWRkYXRhX0FpZEdEUCksIHkgPSBxdWFsaXR5KSkgKyANCiAgZ2VvbV9qaXR0ZXIoc2l6ZSA9IDEuNywgDQogICAgICAgICAgICAgIHdpZHRoID0gMC4xLCANCiAgICAgICAgICAgICAgaGVpZ2h0ID0gMC4xLA0KICAgICAgICAgICAgICBhbHBoYSA9IDAuNSkgKw0KICBnZW9tX3Ntb290aChtZXRob2QgPSAibG0iKSArDQogIHRoZW1lX2J3KCkgKw0KICBsYWJzKHkgPSAiTkVMREEgRWxlY3Rpb24gUXVhbGl0eSBJbmRleCIsIHggPSAiQWxsIEFpZCAvIEdEUCAobG9nKSIpDQoNCiMgT3V0cHV0IGZvciBNYW51c2NyaXB0DQojIG9wdGlvbnMoIHRpa3pEb2N1bWVudERlY2xhcmF0aW9uID0gIlxcZG9jdW1lbnRjbGFzc1sxMXB0XXthcnRpY2xlfSIgKQ0KIyB0aWt6KCIuLi9maWd1cmVzL2FpZF9wc19pbmRpdmlkX25lbGRhLnRleCIsIGhlaWdodCA9IDMuNSkNCiMgcGxvdF9ncmlkKG5lbGRhX3F1YWxpdHlfYm94cGxvdCwgbmVsZGFfYWlkX3Bsb3QpDQojIGRldi5vZmYoKQ0KDQojIE91dHB1dCBmb3IgUmVwLiBBcmNoaXZlDQpwbG90X2dyaWQobmVsZGFfcXVhbGl0eV9ib3hwbG90LCBuZWxkYV9haWRfcGxvdCkNCg0KDQpgYGANCg0KDQojIEZpZ3VyZSA2LjI6IEZvcmVpZ24gQWlkIGFuZCBFbGVjdGlvbiBRdWFsaXR5IGluIEVsZWN0aW9uIFJvdW5kcyB3aXRoIGFuZCB3aXRob3V0IFBvd2VyLVNoYXJpbmcNCg0KYGBge3IsIGZpZy5hbGlnbiA9ICJjZW50ZXIiLGZpZy5oZWlnaHQgPSAzLjUsICBtZXNzYWdlPUYsIHdhcm5pbmc9RiwgY2FjaGUgPSBULCBjb21tZW50cyA9IEYsIGRldiA9ICJDYWlyb1BORyJ9DQojIExpYnJhcmllcw0KbGlicmFyeSh0aWR5dmVyc2UpDQpsaWJyYXJ5KGdncmVwZWwpDQpsaWJyYXJ5KGdyaWRFeHRyYSkNCg0KIyBMb2FkIGRhdGENCmxvYWQoIi4vZGF0YS9uZWxkYV9wcy5yZGEiKQ0KDQoNCmFpZF9wc19lbGVjdGlvbl9uZWxkYV9wbG90IDwtIGdncGxvdChuZWxkYV9wcywgYWVzKHggPSBhaWRfbG4sIHkgPSBxdWFsaXR5KSkgKw0KICBnZW9tX2ppdHRlcihzaXplID0gMiwgd2lkdGggPSAwLjEsIGhlaWdodCA9IDAuMSwgIGFscGhhID0gMC41KSArIA0KICBnZW9tX3Ntb290aChtZXRob2QgPSAibG0iKSArDQogIGZhY2V0X3dyYXAoIH4gY2FiaW5ldElOQy4xMiwgbnJvdyA9IDEsDQogICAgICAgICAgICAgIGxhYmVsbGVyID0gbGFiZWxsZXIoY2FiaW5ldElOQy4xMiA9IGMoIjAiID0gIk5vIFBvd2VyLVNoYXJpbmciLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiMSIgPSAiUG93ZXItU2hhcmluZyIpKSkgKw0KICB0aGVtZV9idygpICsNCiAgdGhlbWUoc3RyaXAudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplPTExKSkgKw0KICBsYWJzKHggPSAiQWlkIC8gR0RQIChsb2cpIiwgeSA9ICJORUxEQSBFbGVjdGlvbiBRdWFsaXR5IEluZGV4IikNCg0KDQojIG9wdGlvbnMoIHRpa3pEb2N1bWVudERlY2xhcmF0aW9uID0gIlxcZG9jdW1lbnRjbGFzc1sxMXB0XXthcnRpY2xlfSIgKQ0KIyB0aWt6KCIuLi9maWd1cmVzL2FpZF9wc19pbnRlcmFjdGlvbl9yYXdkYXRhLnRleCIsIGhlaWdodCA9IDMuNSwgd2lkdGggPSA2LjUpDQojIGdyaWQuYXJyYW5nZShhaWRfcHNfZWxlY3Rpb25fbmVsZGFfcGxvdCkNCiMgZGV2Lm9mZigpDQoNCiMgT3V0cHV0IFJlcGxpY2F0aW9uIEFyY2hpdmUNCnByaW50KGFpZF9wc19lbGVjdGlvbl9uZWxkYV9wbG90KQ0KDQpgYGANCg0KDQojIEZpZ3VyZSA2LjM6IE1hcmdpbmFsIEVmZmVjdCBQbG90cyBmb3IgdGhlIEludGVyYWN0aW9uIGJldHdlZW4gRm9yZWlnbiBBaWQgYW5kIFBvd2VyLVNoYXJpbmcNCg0KYGBge3IsIGZpZy5hbGlnbiA9ICJjZW50ZXIiLCBtZXNzYWdlPUYsIHdhcm5pbmc9RiwgY2FjaGUgPSBULCBmaWcud2lkdGggPSA4LCBmaWcuaGVpZ2h0PTMuNSwgY29tbWVudHMgPSBGLCBkZXYgPSAiQ2Fpcm9QTkcifQ0KIyBMaWJyYXJpZXMNCmxpYnJhcnkodGlkeXZlcnNlKQ0KbGlicmFyeShybXMpDQpsaWJyYXJ5KHRpa3pEZXZpY2UpDQoNCiMgbG9hZCBkYXRhDQpsb2FkKCIuL2RhdGEvbmVsZGFfcHMucmRhIikNCg0KIyBSZWVzdGltYXRlIE1vZGVscw0KDQojIE1vZGVscyBORUxEQQ0KbW9kZWxfYWlkcHNfcXVhbGl0eV9jYWJpbmMgPC0gb2xzKHF1YWxpdHkgfiANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFpZF9sbiAqICANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhYmluZXRJTkMuMTIgKw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0JuYXRyZXMgKyANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZoICsgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub25zdGF0ZSArIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZl9pbnRlbnMgKyANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZyhnZHBfcGVyX2NhcGl0YV91bikgKyANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZyhwb3B1bGF0aW9uKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBuZWxkYV9wcywgeCA9IFQsIHkgPSBUKQ0KbW9kZWxfYWlkcHNfcXVhbGl0eV9jYWJpbmMgPC0gcm9iY292KG1vZGVsX2FpZHBzX3F1YWxpdHlfY2FiaW5jLCBuZWxkYV9wcyRjb3VudHJ5KQ0KDQptb2RlbF9haWRwc19xdWFsaXR5X2NhYmNvdW50IDwtIG9scyhxdWFsaXR5IH4gDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhaWRfbG4gKiAgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWJpbmV0Q09VTlQuMTIgKw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0JuYXRyZXMgKyANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZoICsgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub25zdGF0ZSArIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZl9pbnRlbnMgKyANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZyhnZHBfcGVyX2NhcGl0YV91bikgKyANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZyhwb3B1bGF0aW9uKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBuZWxkYV9wcywgeCA9IFQsIHkgPSBUKQ0KbW9kZWxfYWlkcHNfcXVhbGl0eV9jYWJjb3VudCA8LSByb2Jjb3YobW9kZWxfYWlkcHNfcXVhbGl0eV9jYWJjb3VudCwgbmVsZGFfcHMkY291bnRyeSkNCg0KIyBQbG90IE1FDQpzb3VyY2UoIi4vZnVuY3Rpb25zL2ludGVyYWN0aW9uX3Bsb3RzLlIiKQ0KDQojIE91dHB1dCBmb3IgbWFudXNjcmlwdA0KIyBvcHRpb25zKCB0aWt6RG9jdW1lbnREZWNsYXJhdGlvbiA9ICJcXGRvY3VtZW50Y2xhc3NbMTFwdF17YXJ0aWNsZX0iICkNCiMgdGlreigiLi4vZmlndXJlcy9pbnRlcmFjdGlvbl9haWRwc2VsZWN0aW9ucy50ZXgiLCBoZWlnaHQgPSAzLjUpDQojIHBhcihtZnJvdz1jKDEsMyksDQojICAgICBtYXIgPSBjKDQsIDUsIDQsIDIpLA0KIyAgICAgY2V4LmxhYiA9IDEuMSwNCiMgICAgIGNleC5heGlzID0gMC45LA0KIyAgICAgbWdwID0gYygzLCAwLjcsIDApKQ0KIyANCiMgaW50ZXJhY3Rpb25fcGxvdF9jb250aW51b3VzKG1vZGVsX2FpZHBzX3F1YWxpdHlfY2FiY291bnQsIA0KIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNhYmluZXRDT1VOVC4xMiIsIA0KIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFpZF9sbiIsIA0KIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFpZF9sbiAqIGNhYmluZXRDT1VOVC4xMiIsDQojICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aXRsZSA9ICIiLA0KIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeWxhYiA9ICJNYXJnaW5hbCBlZmZlY3Qgb2YgUG93ZXItU2hhcmluZyAoY2FiaW5ldCkgXG4gb24gRWxlY3Rpb24gUXVhbGl0eSAiLA0KIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeGxhYiA9ICJhKSBBaWQgLyBHRFAgKExvZylcbiIsDQojICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRfbWVkaWFuX2VmZmVjdCA9IFQsDQojICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmYgPSAuOTApDQojIA0KIyBpbnRlcmFjdGlvbl9wbG90X2NvbnRpbnVvdXMobW9kZWxfYWlkcHNfcXVhbGl0eV9jYWJjb3VudCwgDQojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYWlkX2xuIiwgDQojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY2FiaW5ldENPVU5ULjEyIiwgDQojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYWlkX2xuICogY2FiaW5ldENPVU5ULjEyIiwNCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlID0gIiIsDQojICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bGFiID0gIlxuIFBvd2VyLVNoYXJpbmcgKGNhYmluZXQpIC0gXG5OdW1iZXIgb2YgcmViZWwgc2VhdHMiLA0KIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeWxhYiA9ICJFc3RpbWF0ZWQgbWFyZ2luYWwgY29lZmZpY2llbnQgb2ZcbiBBaWQgLyBHRFAgKGxvZykiLA0KIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZiA9IC45MCkNCiMgDQojIGludGVyYWN0aW9uX3Bsb3RfYmluYXJ5KG1vZGVsX2FpZHBzX3F1YWxpdHlfY2FiaW5jLCANCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhaWRfbG4iLCANCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjYWJpbmV0SU5DLjEyIiwgDQojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYWlkX2xuICogY2FiaW5ldElOQy4xMiIsDQojICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aXRsZSA9ICIiLA0KIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhsYWIgPSAiXG4gUG93ZXItU2hhcmluZyAoY2FiaW5ldCkgLSBcbkJpbmFyeSIsDQojICAgICAgICAgICAgICAgICAgICAgICAgIHlsYWIgPSAiRXN0aW1hdGVkIG1hcmdpbmFsIGNvZWZmaWNpZW50IG9mXG4gQWlkIC8gR0RQIChsb2cpIiwNCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmYgPSAuOTApDQojIA0KIyBkZXYub2ZmKCkNCg0KIyBPdXRwdXQgZm9yIFJlcGxpY2F0aW9uIEFyY2hpdmU6DQpwYXIobWZyb3c9YygxLDMpLA0KICAgIG1hciA9IGMoNCwgNSwgNCwgMiksDQogICAgY2V4LmxhYiA9IDEuMSwNCiAgICBjZXguYXhpcyA9IDAuOSwNCiAgICBtZ3AgPSBjKDMsIDAuNywgMCkpDQoNCmludGVyYWN0aW9uX3Bsb3RfY29udGludW91cyhtb2RlbF9haWRwc19xdWFsaXR5X2NhYmNvdW50LCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY2FiaW5ldENPVU5ULjEyIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgImFpZF9sbiIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhaWRfbG4gKiBjYWJpbmV0Q09VTlQuMTIiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlID0gIiIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgeWxhYiA9ICJNYXJnaW5hbCBlZmZlY3Qgb2YgUG93ZXItU2hhcmluZyAoY2FiaW5ldCkgXG4gb24gRWxlY3Rpb24gUXVhbGl0eSAiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhsYWIgPSAiYSkgQWlkIC8gR0RQIChMb2cpXG4iLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZF9tZWRpYW5fZWZmZWN0ID0gVCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25mID0gLjkwKQ0KDQppbnRlcmFjdGlvbl9wbG90X2NvbnRpbnVvdXMobW9kZWxfYWlkcHNfcXVhbGl0eV9jYWJjb3VudCwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgImFpZF9sbiIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjYWJpbmV0Q09VTlQuMTIiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYWlkX2xuICogY2FiaW5ldENPVU5ULjEyIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aXRsZSA9ICIiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhsYWIgPSAiXG4gUG93ZXItU2hhcmluZyAoY2FiaW5ldCkgLSBcbk51bWJlciBvZiByZWJlbCBzZWF0cyIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgeWxhYiA9ICJFc3RpbWF0ZWQgbWFyZ2luYWwgY29lZmZpY2llbnQgb2ZcbiBBaWQgLyBHRFAgKGxvZykiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmYgPSAuOTApDQoNCmludGVyYWN0aW9uX3Bsb3RfYmluYXJ5KG1vZGVsX2FpZHBzX3F1YWxpdHlfY2FiaW5jLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYWlkX2xuIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgImNhYmluZXRJTkMuMTIiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYWlkX2xuICogY2FiaW5ldElOQy4xMiIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGUgPSAiIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeGxhYiA9ICJcbiBQb3dlci1TaGFyaW5nIChjYWJpbmV0KSAtIFxuQmluYXJ5IiwNCiAgICAgICAgICAgICAgICAgICAgICAgIHlsYWIgPSAiRXN0aW1hdGVkIG1hcmdpbmFsIGNvZWZmaWNpZW50IG9mXG4gQWlkIC8gR0RQIChsb2cpIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25mID0gLjkwKQ0KDQoNCmBgYA0KDQojIEZpZ3VyZSA2LjM6IE1vZGVsIFByZWRpY3Rpb25zIGZvciB0aGUgRWZmZWN0IG9mIEZvcmVpZ24gQWlkIGFuZCBQb3dlci1TaGFyaW5nIG9uIFBvc3QtQ29uZmxpY3QgRWxlY3Rpb24gUXVhbGl0eQ0KDQpgYGB7ciwgZmlnLmFsaWduID0gImNlbnRlciIsIG1lc3NhZ2U9Riwgd2FybmluZz1GLCBjYWNoZSA9IFQsIGNvbW1lbnRzID0gRiwgZmlnLndpZHRoID0gNi41LCBmaWcuaGVpZ2h0ID0gNC41LGRldiA9ICJDYWlyb1BORyJ9DQojIExpYnJhcmllcw0KbGlicmFyeSh0aWR5dmVyc2UpDQpsaWJyYXJ5KHJtcykNCg0KIyBMb2FkIERhdGENCmxvYWQoIi4vZGF0YS9uZWxkYV9wcy5yZGEiKQ0KDQojIEVzdGltYXRlIE1vZGVsDQpkYXRhZGlzdF9uZWxkYSA8LSBkYXRhZGlzdChuZWxkYV9wcyk7IG9wdGlvbnMoZGF0YWRpc3Q9J2RhdGFkaXN0X25lbGRhJykNCm1vZGVsX2FpZHBzX3F1YWxpdHlfY2FiY291bnQgPC0gb2xzKHYyeGVsX2ZyZWZhaXIgfiANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFpZF9sbiAqICANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhYmluZXRDT1VOVC4xMiArDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXQm5hdHJlcyArIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmggKyANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vbnN0YXRlICsgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25mX2ludGVucyArDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2coZ2RwX3Blcl9jYXBpdGFfdW4pICsgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2cocG9wdWxhdGlvbikNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhID0gbmVsZGFfcHMsIHggPSBULCB5ID0gVCkNCm1vZGVsX2FpZHBzX3F1YWxpdHlfY2FiY291bnQgPC0gcm9iY292KG1vZGVsX2FpZHBzX3F1YWxpdHlfY2FiY291bnQsIG5lbGRhX3BzJGNvdW50cnkpDQoNCiMgR2VuZXJhdGUgUHJlZGljdGlvbnMNCnByZWRpY3Rpb25fbmVsZGEgPC0gUHJlZGljdChtb2RlbF9haWRwc19xdWFsaXR5X2NhYmNvdW50LCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWJpbmV0Q09VTlQuMTIgPSBjKDAsIDEwKSwgIyBubyAvIG11Y2ggcG93ZXItc2hhcmluZw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFpZF9sbiA9IHNlcSgtNiwgMy45LCAwLjEpLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaCA9IDMuNTcsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdCbmF0cmVzID0gNy44NjAxMjQpICMgcmFuZ2Ugb2YgYWlkDQoNCg0KDQojIGdlbmVyYXRlIHBsb3QNCk1FX2FpZHBzX2ludGVyYWN0aW9uX25lbGRhIDwtIGdncGxvdChkYXRhLmZyYW1lKHByZWRpY3Rpb25fbmVsZGEpLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFlcyh4ID0gZXhwKGFpZF9sbiksIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHkgPSB5aGF0LCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncm91cCA9IGFzLmZhY3RvcihjYWJpbmV0Q09VTlQuMTIpKSkgKyANCiAgZ2VvbV9saW5lKCBjb2xvciA9ICJibGFjayIsIHNpemUgPSAxKSArIA0KICBnZW9tX3JpYmJvbihhZXMoeW1heCA9IHVwcGVyLCANCiAgICAgICAgICAgICAgICAgIHltaW4gPSBsb3dlciwgDQogICAgICAgICAgICAgICAgICBmaWxsID0gYXMuZmFjdG9yKGNhYmluZXRDT1VOVC4xMikpLCANCiAgICAgICAgICAgICAgYWxwaGEgPSAwLjcpICsNCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gYygiI2IzY2RlMyIsICIjZTQxYTFjIiksIA0KICAgICAgICAgICAgICAgICAgICBuYW1lID0gIk51bWJlciBvZiBSZWJlbHMgXG5pbiB0aGUgUG93ZXItU2hhcmluZyBDb2FsaXRpb246IikgKw0KICB0aGVtZV9idygpICsNCiAgdGhlbWUodGV4dCA9IGVsZW1lbnRfdGV4dChzaXplPTgpKSArDQogIGxhYnMoeCA9ICJBaWQgLyBHRFAiLCANCiAgICAgICB5ID0gIkVsZWN0aW9uIFF1YWxpdHkiKSArDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJib3R0b20iKSANCg0KDQpwcmVkaWN0aW9uX25lbGRhX3BzIDwtIFByZWRpY3QobW9kZWxfYWlkcHNfcXVhbGl0eV9jYWJjb3VudCwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FiaW5ldENPVU5ULjEyID0gc2VxKDAsIDEwLCAxKSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWlkX2xuID0gYygwLCAzLjQpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZoID0gMy41NywgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0JuYXRyZXMgPSA3Ljg2MDEyNCkNCg0KcHJlZGljdGlvbl9uZWxkYV9wcyRhaWRfbG4gPC0gcm91bmQoZXhwKHByZWRpY3Rpb25fbmVsZGFfcHMkYWlkX2xuKSwgMCkNCg0KDQptZXBsb3RfYWlkcHNfbmVsZGFfaW50ZXJhY3Rpb25fcHMgPC0gZ2dwbG90KGRhdGEuZnJhbWUocHJlZGljdGlvbl9uZWxkYV9wcyksIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZXMoeCA9IGNhYmluZXRDT1VOVC4xMiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5ID0geWhhdCwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncm91cCA9IGFzLmZhY3RvcihhaWRfbG4pKSkgKyANCiAgZ2VvbV9saW5lKCBjb2xvciA9ICJibGFjayIsIHNpemUgPSAxKSArIA0KICBnZW9tX3JpYmJvbihhZXMoeW1heCA9IHVwcGVyLCANCiAgICAgICAgICAgICAgICAgIHltaW4gPSBsb3dlciwgDQogICAgICAgICAgICAgICAgICBmaWxsID0gYXMuZmFjdG9yKGFpZF9sbikpLCANCiAgICAgICAgICAgICAgYWxwaGEgPSAwLjcpICsNCiAgc2NhbGVfeF9jb250aW51b3VzKGJyZWFrcyA9IHNlcSgwLCAxMCwgMikpICsNCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gYygiI2IzY2RlMyIsICIjZTQxYTFjIiksIA0KICAgICAgICAgICAgICAgICAgICBuYW1lID0gIkFpZCBpbiBwZXIgY2VudCBvZiBHRFA6IikgKw0KICB0aGVtZV9idygpICsNCiAgdGhlbWUodGV4dCA9IGVsZW1lbnRfdGV4dChzaXplPTgpKSArDQogIGxhYnMoeCA9ICJQb3dlci1TaGFyaW5nIChOby4gb2YgUmViZWwgU2VhdHMpIiwgDQogICAgICAgeSA9ICJFbGVjdGlvbiBRdWFsaXR5IikgKw0KICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAiYm90dG9tIikgDQoNCg0KIyBPdXR1dCBNYW51c2NyaXB0DQojIG9wdGlvbnMoIHRpa3pEb2N1bWVudERlY2xhcmF0aW9uID0gIlxcZG9jdW1lbnRjbGFzc1sxMXB0XXthcnRpY2xlfSIgKQ0KIyB0aWt6KCIuLi9maWd1cmVzL2FpZHBzX2VsZWN0aW9uc19NRS50ZXgiLCBoZWlnaHQgPSA0LjUsIHdpZHRoID0gNi41KQ0KIyBncmlkLmFycmFuZ2UobWVwbG90X2FpZHBzX25lbGRhX2ludGVyYWN0aW9uX3BzLA0KIyAgICAgICAgICAgICAgTUVfYWlkcHNfaW50ZXJhY3Rpb25fbmVsZGEsDQojICAgICAgICAgICAgICBucm93ID0gMSkNCiMgZGV2Lm9mZigpDQoNCiMgT3V0cHV0IFJlcGxpY2F0aW9uIEFyY2hpdmUNCmdyaWRFeHRyYTo6Z3JpZC5hcnJhbmdlKG1lcGxvdF9haWRwc19uZWxkYV9pbnRlcmFjdGlvbl9wcywgDQogICAgICAgICAgICAgICAgICAgICAgICBNRV9haWRwc19pbnRlcmFjdGlvbl9uZWxkYSwNCiAgICAgICAgICAgICAgICAgICAgICAgIG5yb3cgPSAxKQ0KDQpgYGANCg0KDQojIEZpZ3VyZSA2LjQ6IFByb2JpbmcgTWVjaGFuaXNtcyBJOiBWYXJpYXRpb24gaW4gVHlwZXMgb2YgUG93ZXItU2hhcmluZyBhbmQgQWlkIGFuZCAgRWxlY3Rpb24gUXVhbGl0eQ0KDQpgYGB7ciwgZmlnLmFsaWduID0gImNlbnRlciIsIG1lc3NhZ2U9Riwgd2FybmluZz1GLCBjYWNoZSA9IFQsZmlnLmhlaWdodCA9IDMuNSwgY29tbWVudHMgPSBGLCBkZXYgPSAiQ2Fpcm9QTkcifQ0KDQojIExpYnJhcmllcw0KbGlicmFyeSh0aWR5dmVyc2UpDQpsaWJyYXJ5KGxmZSkNCg0KIyBMb2FkIGRhdGEgDQpsb2FkKCIuL2RhdGEvbmVsZGFfcHMucmRhIikNCg0KbW9kZWxfYWlkcHNfcXVhbGl0eV9jYWJpbmMgPC0gZmVsbShxdWFsaXR5IH4gDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhaWRfbG4gKiAgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWJpbmV0SU5DLjEyICsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdCbmF0cmVzICsgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaCArIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9uc3RhdGUgKyANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZfaW50ZW5zICsgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2coZ2RwX3Blcl9jYXBpdGFfdW4pICsgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2cocG9wdWxhdGlvbikNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAwIHwgMCB8IGNvdW50cnksIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhID0gbmVsZGFfcHMpDQoNCg0KbW9kZWxfYWlkcHNfcXVhbGl0eV9zZW5pbmMgPC0gZmVsbShxdWFsaXR5IH4gDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhaWRfbG4gKiAgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZW5pb3JJTkMuMTIgKw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0JuYXRyZXMgKyANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZoICsgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub25zdGF0ZSArIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZl9pbnRlbnMgKyANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZyhnZHBfcGVyX2NhcGl0YV91bikgKyANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZyhwb3B1bGF0aW9uKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IDAgfCAwIHwgY291bnRyeSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBuZWxkYV9wcykNCg0KDQptb2RlbF9haWRwc19xdWFsaXR5X25vbnNlbmluYyA8LSBmZWxtKHF1YWxpdHkgfiANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFpZF9sbiAqICANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vbnNlbmlvcklOQy4xMiArDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXQm5hdHJlcyArIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmggKyANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vbnN0YXRlICsgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25mX2ludGVucyArIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nKGdkcF9wZXJfY2FwaXRhX3VuKSArIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nKHBvcHVsYXRpb24pDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgMCB8IDAgfCBjb3VudHJ5LCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IG5lbGRhX3BzKQ0KDQptb2RlbF9haWRwc19xdWFsaXR5X2RnYSA8LSBmZWxtKHF1YWxpdHkgfiANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZyhkZ2FfZ2RwX251bGwgKyAxKSAqICANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhYmluZXRJTkMuMTIgKw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFpZF9sbiArDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXQm5hdHJlcyArIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmggKyANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vbnN0YXRlICsgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25mX2ludGVucyArIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nKGdkcF9wZXJfY2FwaXRhX3VuKSArIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nKHBvcHVsYXRpb24pDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgMCB8IDAgfCBjb3VudHJ5LCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IG5lbGRhX3BzKQ0KDQoNCm1vZGVsX2FpZHBzX3F1YWxpdHlfcHJvZ2FpZCA8LSBmZWxtKHF1YWxpdHkgfiANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZyhwcm9ncmFtX2FpZF9nZHBfbnVsbCArIDEpICogIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FiaW5ldElOQy4xMiArDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWlkX2xuICsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdCbmF0cmVzICsgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaCArIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9uc3RhdGUgKyANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZfaW50ZW5zICsgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2coZ2RwX3Blcl9jYXBpdGFfdW4pICsgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2cocG9wdWxhdGlvbikNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAwIHwgMCB8IGNvdW50cnksIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhID0gbmVsZGFfcHMpDQoNCg0KbW9kZWxfYWlkcHNfcXVhbGl0eV9idWRnZXRhaWQgPC0gZmVsbShxdWFsaXR5IH4gDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2coYnVkZ2V0X2FpZF9nZHBfbnVsbCArIDEpICogIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FiaW5ldElOQy4xMiArDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWlkX2xuICsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdCbmF0cmVzICsgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaCArIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9uc3RhdGUgKyANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZfaW50ZW5zICsgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2coZ2RwX3Blcl9jYXBpdGFfdW4pICsgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2cocG9wdWxhdGlvbikNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAwIHwgMCB8IGNvdW50cnksIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhID0gbmVsZGFfcHMpDQoNCiMgZXh0cmFjdCBjb2VmZmljaWVudHMgZm9yIGludGVyYWN0aW9uIHRlcm0NCm1lY2hhbmlzbV9tb2RlbHMgPC0gbGlzdCgiQ2FiaW5ldCBQUyAoQmFzZWxpbmUpIiA9IG1vZGVsX2FpZHBzX3F1YWxpdHlfY2FiaW5jLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAiU2VuaW9yIFBTIiA9IG1vZGVsX2FpZHBzX3F1YWxpdHlfc2VuaW5jLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAiTm9uc2VuaW9yIFBTIiA9IG1vZGVsX2FpZHBzX3F1YWxpdHlfbm9uc2VuaW5jLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAiREdBIiA9IG1vZGVsX2FpZHBzX3F1YWxpdHlfZGdhLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAiUHJvZ3JhbSBBaWQiPSBtb2RlbF9haWRwc19xdWFsaXR5X3Byb2dhaWQsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICJCdWRnZXQgQWlkIiA9IG1vZGVsX2FpZHBzX3F1YWxpdHlfYnVkZ2V0YWlkKSAlPiUgDQogICBlbmZyYW1lKCkgJT4lIA0KICBtdXRhdGUodGlkeW1vZGVsID0gbWFwKHZhbHVlLCBicm9vbTo6dGlkeSkpICU+JSANCiAgdW5uZXN0KHRpZHltb2RlbCkgJT4lIA0KICBmaWx0ZXIoZ3JlcGwoIjoiLCB0ZXJtKSkgJT4lIA0KICBtdXRhdGUobmFtZSA9IGZvcmNhdHM6OmZjdF9yZWxldmVsKG5hbWUsIGMoIkNhYmluZXQgUFMgKEJhc2VsaW5lKSIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiU2VuaW9yIFBTIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJOb25zZW5pb3IgUFMiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkRHQSIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUHJvZ3JhbSBBaWQiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkJ1ZGdldCBBaWQiKSkpDQptZWNoYW5pc21fbW9kZWxzX2VsZWMgPC0gbWVjaGFuaXNtX21vZGVscw0Kc2F2ZShtZWNoYW5pc21fbW9kZWxzX2VsZWMsIGZpbGU9ICIuL2RhdGEvbWVjaGFuaXNtX21vZGVsc19lbGVjLnJkYSIpDQoNCg0KbWVjaGFuaXNtc19lbGVjX21vZGVsc19wbG90IDwtIGdncGxvdChtZWNoYW5pc21fbW9kZWxzLCBhZXMoeCA9IG5hbWUsIHkgPSBlc3RpbWF0ZSkgKSArDQogIGdlb21fcG9pbnQoKSArDQogIGdlb21fZXJyb3JiYXIoYWVzKHltaW4gPSBlc3RpbWF0ZSAtIDEuNjcgKiBzdGQuZXJyb3IsIA0KICAgICAgICAgICAgICAgICAgICB5bWF4ID0gZXN0aW1hdGUgKyAxLjY3ICogc3RkLmVycm9yKSwgDQogICAgICAgICAgICAgICAgd2lkdGggPSAwKSArDQogIHRoZW1lX2J3KCkgKw0KICB0aGVtZShheGlzLnRpdGxlLnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEwKSkgKw0KICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwLCBsaW5ldHlwZSA9IDIpICsNCiAgbGFicyh4ID0gIiIsIHkgPSAiQ29lZmZpY2llbnQgRXN0aW1hdGUgb2YgSW50ZXJhY3Rpb24gYmV0d2VlbiBcbiBEaWZmZXJlbnQgVHlwZXMgb2YgUG93ZXItU2hhcmluZyAoYmluYXJ5KSBcbiBhbmQgRGlmZmVyZW50IEFpZCBUeXBlcyIpDQoNCg0KIyBPdXRwdXQgZm9yIG1hbnVzY3JpcHQNCiMgb3B0aW9ucyh0aWt6RG9jdW1lbnREZWNsYXJhdGlvbiA9ICJcXGRvY3VtZW50Y2xhc3NbMTFwdF17YXJ0aWNsZX0iICkNCiMgdGlreigiLi4vZmlndXJlcy9tZWNoYW5pbXNfZWxlY19tb2RlbHNfcGxvdC50ZXgiLCBoZWlnaHQgPSAyLjc1KQ0KIyBwcmludChtZWNoYW5pc21zX2VsZWNfbW9kZWxzX3Bsb3QpDQojIGRldi5vZmYoKQ0KDQojIE91dHB1dCBmb3IgcmVwbGljYXRpb24gYXJjaGl2ZQ0KDQpwcmludChtZWNoYW5pc21zX2VsZWNfbW9kZWxzX3Bsb3QpDQoNCmBgYA0KDQoNCg0KIyBUYWJsZSA2LjE6IEluZGl2aWR1YWwgRWZmZWN0cyBvZiBQb3dlci1TaGFyaW5nIGFuZCBGb3JlaWduIEFpZCBvbiBQb3N0LUNvbmZsaWN0IEVsZWN0aW9uIFF1YWxpdHkNCg0KYGBge3IsIHJlc3VsdHM9ImFzaXMiLCBtZXNzYWdlPUYsIHdhcm5pbmc9RiwgY2FjaGUgPSBULCBjb21tZW50cyA9IEZ9DQoNCiMgTGlicmFyaWVzDQpsaWJyYXJ5KHJtcykNCmxpYnJhcnkodGV4cmVnKQ0KDQojIExvYWQgZGF0YQ0KbG9hZCgiLi9kYXRhL25lbGRhX3BzLnJkYSIpIA0KDQojIyBNb2RlbHMgTkVMREEgKFYtRGVtIE1vZGVscyBzZWUgQXBwZW5kaXgpDQptb2RlbF9wc19xdWFsaXR5X2NhYmNvdW50IDwtIG9scyhxdWFsaXR5IH4gDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhYmluZXRDT1VOVC4xMiArDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFpZF9sbiArICANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0JuYXRyZXMgKyANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmggKyANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9uc3RhdGUgKyANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZl9pbnRlbnMgKyANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nKGdkcF9wZXJfY2FwaXRhX3VuKSArIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2cocG9wdWxhdGlvbikNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBuZWxkYV9wcywgeCA9IFQsIHkgPSBUKQ0KbW9kZWxfcHNfcXVhbGl0eV9jYWJjb3VudCA8LSByb2Jjb3YobW9kZWxfcHNfcXVhbGl0eV9jYWJjb3VudCwgbmVsZGFfcHMkY291bnRyeSkNCg0KbW9kZWxfcHNfcXVhbGl0eV9zZW5pb3Jjb3VudCA8LSBvbHMocXVhbGl0eSB+IA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZW5pb3JDT1VOVC4xMiArDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFpZF9sbiArICANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0JuYXRyZXMgKyANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmggKyANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9uc3RhdGUgKyANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZl9pbnRlbnMgKyANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nKGdkcF9wZXJfY2FwaXRhX3VuKSArIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2cocG9wdWxhdGlvbikNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBuZWxkYV9wcywgeCA9IFQsIHkgPSBUKQ0KbW9kZWxfcHNfcXVhbGl0eV9zZW5pb3Jjb3VudCA8LSByb2Jjb3YobW9kZWxfcHNfcXVhbGl0eV9zZW5pb3Jjb3VudCwgbmVsZGFfcHMkY291bnRyeSkNCg0KbW9kZWxfcHNfcXVhbGl0eV9ub25zZW5pb3Jjb3VudCA8LSBvbHMocXVhbGl0eSB+IA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub25zZW5pb3JDT1VOVC4xMiArDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFpZF9sbiArICANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0JuYXRyZXMgKyANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmggKyANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9uc3RhdGUgKyANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZl9pbnRlbnMgKyANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nKGdkcF9wZXJfY2FwaXRhX3VuKSArIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2cocG9wdWxhdGlvbikNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBuZWxkYV9wcywgeCA9IFQsIHkgPSBUKQ0KbW9kZWxfcHNfcXVhbGl0eV9ub25zZW5pb3Jjb3VudCA8LSByb2Jjb3YobW9kZWxfcHNfcXVhbGl0eV9ub25zZW5pb3Jjb3VudCwgbmVsZGFfcHMkY291bnRyeSkNCg0KDQojIE1vZGVscyBBaWQNCiMgREdBDQptb2RlbF9kZ2FfcXVhbGl0eSA8LSBvbHMocXVhbGl0eSB+IA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FiaW5ldENPVU5ULjEyICsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZyhkZ2FfZ2RwX251bGwgKyAxICkrIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgYWlkX2xuICsgIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgV0JuYXRyZXMgKyANCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGZoICsgDQogICAgICAgICAgICAgICAgICAgICAgICAgICBub25zdGF0ZSArIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZl9pbnRlbnMgKyANCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZyhnZHBfcGVyX2NhcGl0YV91bikgKyANCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZyhwb3B1bGF0aW9uKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICwNCiAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhID0gbmVsZGFfcHMsIHggPSBULCB5ID0gVCkNCm1vZGVsX2RnYV9xdWFsaXR5IDwtIHJvYmNvdihtb2RlbF9kZ2FfcXVhbGl0eSwgbmVsZGFfcHMkY291bnRyeSkNCg0KIyBwcm9ncmFtIGFpZA0KbW9kZWxfcHJvZ19haWRfcXVhbGl0eSA8LSBvbHMocXVhbGl0eSB+IA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWJpbmV0Q09VTlQuMTIgKw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2cocHJvZ3JhbV9haWRfZ2RwX251bGwgKyAxICkrIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhaWRfbG4gKyAgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdCbmF0cmVzICsgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZoICsgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vbnN0YXRlICsgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZfaW50ZW5zICsgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZyhnZHBfcGVyX2NhcGl0YV91bikgKyANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nKHBvcHVsYXRpb24pDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhID0gbmVsZGFfcHMsIHggPSBULCB5ID0gVCkNCm1vZGVsX3Byb2dfYWlkX3F1YWxpdHkgPC0gcm9iY292KG1vZGVsX3Byb2dfYWlkX3F1YWxpdHksIG5lbGRhX3BzJGNvdW50cnkpDQoNCiMgYnVkZ2V0IGFpZA0KbW9kZWxfYnVkZ2V0YWlkX3F1YWxpdHkgPC0gb2xzKHF1YWxpdHkgfiANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhYmluZXRDT1VOVC4xMiArDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2coYnVkZ2V0X2FpZF9nZHBfbnVsbCArIDEgKSsgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhaWRfbG4gKyAgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXQm5hdHJlcyArIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmggKyANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vbnN0YXRlICsgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25mX2ludGVucyArIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nKGdkcF9wZXJfY2FwaXRhX3VuKSArIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nKHBvcHVsYXRpb24pDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBuZWxkYV9wcywgeCA9IFQsIHkgPSBUKQ0KbW9kZWxfYnVkZ2V0YWlkX3F1YWxpdHkgPC0gcm9iY292KG1vZGVsX2J1ZGdldGFpZF9xdWFsaXR5LCBuZWxkYV9wcyRjb3VudHJ5KQ0KDQojIGluZGl2aWR1YWwgZWZmZWN0cyBtb2RlbCBsaXN0DQppbmRfZWZmZWN0X21vZGVscyA8LSBsaXN0KG1vZGVsX3BzX3F1YWxpdHlfY2FiY291bnQsIA0KICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGVsX3BzX3F1YWxpdHlfc2VuaW9yY291bnQsIA0KICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGVsX3BzX3F1YWxpdHlfbm9uc2VuaW9yY291bnQsIA0KICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGVsX2RnYV9xdWFsaXR5LCANCiAgICAgICAgICAgICAgICAgICAgICAgICBtb2RlbF9wcm9nX2FpZF9xdWFsaXR5LCANCiAgICAgICAgICAgICAgICAgICAgICAgICBtb2RlbF9idWRnZXRhaWRfcXVhbGl0eSkNCg0KDQojIE91dHB1dA0KY29lZl9uYW1lX21hcCA8LSBsaXN0KGNhYmluZXRDT1VOVC4xMiA9ICJQb3dlci1TaGFyaW5nIChjYWJpbmV0KSIsDQogICAgICAgICAgICAgICAgIHNlbmlvckNPVU5ULjEyID0gIlBvd2VyLVNoYXJpbmcgKHNlbmlvcikiLCANCiAgICAgICAgICAgICAgICAgbm9uc2VuaW9yQ09VTlQuMTIgPSAiUG93ZXItU2hhcmluZyAobm9uc2VuaW9yKSIsIA0KICAgICAgICAgICAgICAgICBhaWRfbG4gPSAiQWlkL0dEUCAobG9nKSIsIA0KICAgICAgICAgICAgICAgICBkZ2FfZ2RwX251bGwgPSAiREdBL0dEUCAobG9nKSIsIA0KICAgICAgICAgICAgICAgICBwcm9ncmFtX2FpZF9nZHBfbnVsbD0gIlByb2dyYW0gQWlkIC8gR0RQIChsb2cpIiwgDQogICAgICAgICAgICAgICAgIGJ1ZGdldF9haWRfZ2RwX251bGwgPSAiQnVkZ2V0IEFpZCAvIEdEUCAobG9nIiwgDQogICAgICAgICAgICAgICAgIFdCbmF0cmVzID0gIk5hdC4gUmVzLiBSZW50cyIsIA0KICAgICAgICAgICAgICAgICBmaCA9ICJSZWdpbWUgVHlwZSAoRkgpIiwgDQogICAgICAgICAgICAgICAgIG5vbnN0YXRlID0gIk5vbnN0YXRlIENvbmZsaWN0IiwgDQogICAgICAgICAgICAgICAgIGNvbmZfaW50ZW5zID0gICJDb25mbGljdCBJbnRlbnNpdHkiLCANCiAgICAgICAgICAgICAgICAgcG9wdWxhdGlvbiA9ICJQb3B1bGF0aW9uIChsb2cpIiwgDQogICAgICAgICAgICAgICAgIGdkcF9wZXJfY2FwaXRhX3VuID0gIkdEUCBwL2MgKGxvZykiKQ0KDQojIEdldCBudW1iZXIgb2YgY2x1c3RlcnMNCnNvdXJjZSgiLi9mdW5jdGlvbnMvZXh0cmFjdF9vbHNfY3VzdG9tLlIiKQ0KDQojIE91dHB1dCBNYW51c2NyaXB0DQojIHRleHJlZyhsID0gaW5kX2VmZmVjdF9tb2RlbHMsDQojICAgICAgICAgICBzdGFycyA9IGMoMC4wMDEsIDAuMDEsIDAuMDUsIDAuMSksDQojICAgICAgICAgICBjdXN0b20uY29lZi5tYXAgPSBjb2VmX25hbWVfbWFwLA0KIyAgICAgICAgZmlsZSA9ICIuLi9vdXRwdXQvYWlkX3BzX2luZGVmZl9lbGVjdGlvbnMudGV4IiwNCiMgICAgICAgICAgIHN5bWJvbCA9ICIrIiwNCiMgICAgICAgICAgIHRhYmxlID0gRiwNCiMgICAgICAgICAgIGJvb2t0YWJzID0gVCwNCiMgICAgICAgICAgIHVzZS5wYWNrYWdlcyA9IEYsDQojICAgICAgICAgICBkY29sdW1uID0gVCwNCiMgICAgICAgICAgIGluY2x1ZGUubHIgPSBGLA0KIyAgICAgICAgICAgaW5jbHVkZS5yc3F1YXJlZCA9IEYsDQojICAgICAgICAgICAgICAgICAgaW5jbHVkZS5jbHVzdGVyID0gVCwNCiMgDQojICAgICAgICAgICBpbmNsdWRlLmFkanJzID0gVCwNCiMgICAgICAgICBjYXB0aW9uID0gIiIpDQoNCg0KIyBPdXRwdXQgUmVwbGljYXRpb24gQXJjaGl2ZQ0KaHRtbHJlZyhsID0gaW5kX2VmZmVjdF9tb2RlbHMsIA0KICAgICAgICAgIHN0YXJzID0gYygwLjAwMSwgMC4wMSwgMC4wNSwgMC4xKSwNCiAgICAgICAgICBjdXN0b20uY29lZi5tYXAgPSBjb2VmX25hbWVfbWFwLA0KICAgICAgICAgIHN5bWJvbCA9ICIrIiwNCiAgICAgICAgICB0YWJsZSA9IEYsDQogICAgICAgICAgYm9va3RhYnMgPSBULA0KICAgICAgICAgIHVzZS5wYWNrYWdlcyA9IEYsDQogICAgICANCiAgICAgICAgICBkY29sdW1uID0gVCwNCiAgICAgICAgICBpbmNsdWRlLmxyID0gRiwNCiAgICAgICAgICBpbmNsdWRlLnJzcXVhcmVkID0gRiwNCiAgICAgICAgICBpbmNsdWRlLmFkanJzID0gVCwNCiAgICAgICAgICBpbmNsdWRlLmNsdXN0ZXIgPSBULA0KICAgICAgICBjYXB0aW9uID0gIiIsIA0KICAgICAgICBzdGFyLnN5bWJvbCA9ICJcXCoiKQ0KDQoNCmBgYA0KDQoNCg0KIyBUYWJsZSA2LjI6IFRoZSBJbnRlcmFjdGl2ZSBFZmZlY3Qgb2YgQWlkIGFuZCBQb3dlci1TaGFyaW5nIG9uIEVsZWN0aW9uIFF1YWxpdHkNCg0KYGBge3IsIHJlc3VsdHM9ImFzaXMiLCBtZXNzYWdlPUYsIHdhcm5pbmc9RiwgY2FjaGUgPSBULCBjb21tZW50cyA9IEZ9DQoNCiMgTGlicmFyaWVzDQpsaWJyYXJ5KHJtcykNCg0KIyBMb2FkIGRhdGENCmxvYWQoIi4vZGF0YS9uZWxkYV9wcy5yZGEiKSANCg0KIyBuZWxkYV9wcyA8LSBmaWx0ZXIobmVsZGFfcHMsIGNvdW50cnkgIT0gIkJvc25pYS1IZXJ6ZWdvdmluYSIpDQoNCiMgTW9kZWxzIE5FTERBDQptb2RlbF9haWRwc19xdWFsaXR5X2NhYmluYyA8LSBvbHMocXVhbGl0eSB+IA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWlkX2xuICogIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FiaW5ldElOQy4xMiArDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXQm5hdHJlcyArIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmggKyANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vbnN0YXRlICsgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25mX2ludGVucyArIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nKGdkcF9wZXJfY2FwaXRhX3VuKSArIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nKHBvcHVsYXRpb24pDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IG5lbGRhX3BzLCB4ID0gVCwgeSA9IFQpDQptb2RlbF9haWRwc19xdWFsaXR5X2NhYmluYyA8LSByb2Jjb3YobW9kZWxfYWlkcHNfcXVhbGl0eV9jYWJpbmMsIG5lbGRhX3BzJGNvdW50cnkpDQoNCg0KbW9kZWxfYWlkcHNfcXVhbGl0eV9jYWJjb3VudCA8LSBvbHMocXVhbGl0eSB+IA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWlkX2xuICogIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FiaW5ldENPVU5ULjEyICsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdCbmF0cmVzICsgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaCArIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9uc3RhdGUgKyANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZfaW50ZW5zICsgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2coZ2RwX3Blcl9jYXBpdGFfdW4pICsgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2cocG9wdWxhdGlvbikNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhID0gbmVsZGFfcHMsIHggPSBULCB5ID0gVCkNCm1vZGVsX2FpZHBzX3F1YWxpdHlfY2FiY291bnQgPC0gcm9iY292KG1vZGVsX2FpZHBzX3F1YWxpdHlfY2FiY291bnQsIG5lbGRhX3BzJGNvdW50cnkpDQoNCiMgTW9kZWwgVmRlbQ0KbW9kZWxfYWlkcHNfdmRlbV9jYWJpbmMgPC0gb2xzKHYyeGVsX2ZyZWZhaXIgfiANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFpZF9sbiAqICANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhYmluZXRJTkMuMTIgKw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0JuYXRyZXMgKyANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZoICsgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub25zdGF0ZSArIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZl9pbnRlbnMgKyANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZyhnZHBfcGVyX2NhcGl0YV91bikgKyANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZyhwb3B1bGF0aW9uKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBuZWxkYV9wcywgeCA9IFQsIHkgPSBUKQ0KbW9kZWxfYWlkcHNfdmRlbV9jYWJpbmMgPC0gcm9iY292KG1vZGVsX2FpZHBzX3ZkZW1fY2FiaW5jLCBuZWxkYV9wcyRjb3VudHJ5KQ0KDQoNCm1vZGVsX2FpZHBzX3ZkZW1fY2FiY291bnQgPC0gb2xzKHYyeGVsX2ZyZWZhaXIgfiANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFpZF9sbiAqICANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhYmluZXRDT1VOVC4xMiArDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXQm5hdHJlcyArIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmggKyANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vbnN0YXRlICsgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25mX2ludGVucyArIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nKGdkcF9wZXJfY2FwaXRhX3VuKSArIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nKHBvcHVsYXRpb24pDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IG5lbGRhX3BzLCB4ID0gVCwgeSA9IFQpDQptb2RlbF9haWRwc192ZGVtX2NhYmNvdW50IDwtIHJvYmNvdihtb2RlbF9haWRwc192ZGVtX2NhYmNvdW50LCBuZWxkYV9wcyRjb3VudHJ5KQ0KDQoNCiMgT3V0cHV0DQppbnRfZWZmX21vZGVsX2xpc3QgPC0gbGlzdChtb2RlbF9haWRwc19xdWFsaXR5X2NhYmluYywgDQogICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RlbF9haWRwc19xdWFsaXR5X2NhYmNvdW50LCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGVsX2FpZHBzX3ZkZW1fY2FiaW5jLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGVsX2FpZHBzX3ZkZW1fY2FiY291bnQpDQoNCmNvZWZfbmFtZV9tYXAgPC0gbGlzdCggY2FiaW5ldElOQy4xMiA9ICJQb3dlci1TaGFyaW5nIChiaW5hcnkpIiwNCiAgICAgICAgICAgICAgICAgICAgICAgImFpZF9sbiAqIGNhYmluZXRJTkMuMTIiID0gIlBvd2VyLVNoYXJpbmcgKGJpbmFyeSkgKiBBaWQiLCANCiAgICAgICAgICAgICAgICAgICAgICAgY2FiaW5ldENPVU5ULjEyID0gIlBvd2VyLVNoYXJpbmcgKGNhYmluZXQpIiwNCiAgICAgICAgICAgICAgICAgICAgICAgImFpZF9sbiAqIGNhYmluZXRDT1VOVC4xMiIgPSAiUG93ZXItU2hhcmluZyAoY2FiaW5ldCkgKiBBaWQiLCANCiAgICAgICAgICAgICAgICAgICAgICAgYWlkX2xuID0gIkFpZC9HRFAgKGxvZykiLCANCiAgICAgICAgICAgICAgICAgICAgICAgZGdhX2dkcF9udWxsID0gIkRHQS9HRFAgKGxvZykiLCANCiAgICAgICAgICAgICAgICAgICAgICAgcHJvZ3JhbV9haWRfZ2RwX251bGw9ICJQcm9ncmFtIEFpZCAvIEdEUCAobG9nKSIsIA0KICAgICAgICAgICAgICAgICAgICAgICBidWRnZXRfYWlkX2dkcF9udWxsID0gIkJ1ZGdldCBBaWQgLyBHRFAgKGxvZyIsIA0KICAgICAgICAgICAgICAgICAgICAgICBXQm5hdHJlcyA9ICJOYXQuIFJlcy4gUmVudHMiLCANCiAgICAgICAgICAgICAgICAgICAgICAgZmggPSAiUmVnaW1lIFR5cGUgKEZIKSIsIA0KICAgICAgICAgICAgICAgICAgICAgICBub25zdGF0ZSA9ICJOb25zdGF0ZSBDb25mbGljdCIsIA0KICAgICAgICAgICAgICAgICAgICAgICBjb25mX2ludGVucyA9ICAiQ29uZmxpY3QgSW50ZW5zaXR5IiwgDQogICAgICAgICAgICAgICAgICAgICAgIHBvcHVsYXRpb24gPSAiUG9wdWxhdGlvbiAobG9nKSIsIA0KICAgICAgICAgICAgICAgICAgICAgICBnZHBfcGVyX2NhcGl0YV91biA9ICJHRFAgcC9jIChsb2cpIikNCg0Kc291cmNlKCIuL2Z1bmN0aW9ucy9jdXN0b21fdGV4cmVnLlIiKQ0KZW52aXJvbm1lbnQoY3VzdG9tX3RleHJlZykgPC0gYXNOYW1lc3BhY2UoJ3RleHJlZycpDQoNCiMgY3VzdG9tX3RleHJlZyhsID0gaW50X2VmZl9tb2RlbF9saXN0LCANCiMgICAgICAgICAgIHN0YXJzID0gYygwLjAwMSwgMC4wMSwgMC4wNSwgMC4xKSwNCiMgICAgICAgICAgIGN1c3RvbS5jb2VmLm1hcCA9IGNvZWZfbmFtZV9tYXAsDQojICAgICAgICAgICBmaWxlID0gIi4uL291dHB1dC9haWRwc19lbGVjdGlvbnNfaW50ZXJhY3Rpb25fbWFpbnJlc3VsdHMudGV4IiwgDQojICAgICAgICAgICBzeW1ib2wgPSAiKyIsDQojICAgICAgICAgICB0YWJsZSA9IEYsDQojICAgICAgICAgICBib29rdGFicyA9IFQsDQojICAgICAgICAgICBjdXN0b20ubXVsdGljb2wgPSBULCANCiMgICAgICAgICAgICBjdXN0b20ubW9kZWwubmFtZXMgPSBjKCIgXFxtdWx0aWNvbHVtbnsyfXtjfXtcXHRleHRiZntORUxEQSBFbGVjdGlvbiBRdWFsaXR5fX0gJiANCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxtdWx0aWNvbHVtbnsyfXtjfXtcXHRleHRiZntWLURlbSBDbGVhbiBFbGVjdGlvbnMgSW5kZXh9fSBcXFxcIA0KIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXGNtaWRydWxlKHIpezItM30gXFxjbWlkcnVsZShyKXs0LTV9IA0KIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmIFxcbXVsdGljb2x1bW57MX17Y317KDEpICB9IiwNCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlxcbXVsdGljb2x1bW57MX17Y317KDIpICB9IiwNCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlxcbXVsdGljb2x1bW57MX17Y317KDMpICB9IiwNCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlxcbXVsdGljb2x1bW57MX17Y317KDQpICB9IiksDQojICAgICAgICAgICB1c2UucGFja2FnZXMgPSBGLA0KIyAgICAgICAgICAgZGNvbHVtbiA9IFQsDQojICAgICAgICAgICBpbmNsdWRlLmxyID0gRiwNCiMgICAgICAgICBpbmNsdWRlLmNsdXN0ZXIgPSBULCANCiMgICAgICAgICAgIGluY2x1ZGUucnNxdWFyZWQgPSBGLA0KIyAgICAgICAgICAgaW5jbHVkZS5hZGpycyA9IFQpDQoNCmh0bWxyZWcobCA9IGludF9lZmZfbW9kZWxfbGlzdCwgDQogICAgICAgICAgc3RhcnMgPSBjKDAuMDAxLCAwLjAxLCAwLjA1LCAwLjEpLA0KICAgICAgICAgIGN1c3RvbS5jb2VmLm1hcCA9IGNvZWZfbmFtZV9tYXAsDQogICAgICAgICAgc3ltYm9sID0gIisiLA0KICAgICAgICAgIHRhYmxlID0gRiwNCiAgICAgICAgICBib29rdGFicyA9IFQsDQogICAgICAgICAgdXNlLnBhY2thZ2VzID0gRiwNCiAgICAgICAgICBkY29sdW1uID0gVCwNCiAgICAgICAgICBpbmNsdWRlLmxyID0gRiwNCiAgICAgICAgaW5jbHVkZS5jbHVzdGVyID0gVCwgDQogICAgICAgICAgaW5jbHVkZS5yc3F1YXJlZCA9IEYsDQogICAgICAgICAgaW5jbHVkZS5hZGpycyA9IFQsDQogICAgICAgIGNhcHRpb24gPSAiIiwgDQogICAgICAgIHN0YXIuc3ltYm9sID0gIlxcKiIpDQoNCg0KYGBgDQoNCg0KDQojIFRhYmxlIDYuMzogUHJvYmluZyBNZWNoYW5pc21zIElJOiBBaWQgQ3V0LU9mZnMsIEVsZWN0aW9uIE1vbml0b3JzLCBhbmQgUG9zdC1Db25mbGljdCBFbGVjdGlvbiBRdWFsaXR5DQoNCmBgYHtyLCByZXN1bHRzPSJhc2lzIiwgbWVzc2FnZT1GLCB3YXJuaW5nPUYsIGNhY2hlID0gVCwgY29tbWVudHMgPSBGfQ0KDQojIExpYnJhcmllcw0KbGlicmFyeShybXMpDQpsaWJyYXJ5KHBsbSkNCmxpYnJhcnkoY291bnRyeWNvZGUpDQoNCiMgbG9hZCBkYXRhDQpsb2FkKCIuL2RhdGEvbmVsZGFfcHMucmRhIikNCg0KIyBhaWQgY3V0b2Zmcw0KbW9kZWxfYWlkcHNfYWlkY3V0b2ZmIDwtIG9scyhxdWFsaXR5IH4gDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhaWRfbG4gICsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmVsZGE1NyAqICMgYWlkIGN1dG9mZg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FiaW5ldENPVU5ULjEyICsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdCbmF0cmVzICsgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaCArIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9uc3RhdGUgKyANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZfaW50ZW5zICsgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2coZ2RwX3Blcl9jYXBpdGFfdW4pICsgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2cocG9wdWxhdGlvbikNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IG5lbGRhX3BzLCB4ID0gVCwgeSA9IFQpDQptb2RlbF9haWRwc19haWRjdXRvZmYgPC0gcm9iY292KG1vZGVsX2FpZHBzX2FpZGN1dG9mZiwgbmVsZGFfcHMkY291bnRyeSkNCg0KIyBlbGVjdGlvbiBtb25pdG9ycw0KbW9kZWxfYWlkcHNfZWxtb25zIDwtIG9scyhxdWFsaXR5IH4gDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgYWlkX2xuICArDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgbmVsZGE0NSAqICMgYWlkIGN1dG9mZg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhYmluZXRDT1VOVC4xMiArDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgV0JuYXRyZXMgKyANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaCArIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vbnN0YXRlICsgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZl9pbnRlbnMgKyANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2coZ2RwX3Blcl9jYXBpdGFfdW4pICsgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nKHBvcHVsYXRpb24pDQogICAgICAgICAgICAgICAgICAgICAgICAgICwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IG5lbGRhX3BzLCB4ID0gVCwgeSA9IFQpDQptb2RlbF9haWRwc19lbG1vbnMgPC0gcm9iY292KG1vZGVsX2FpZHBzX2VsbW9ucywgbmVsZGFfcHMkY291bnRyeSkNCg0KIyBhaWQgY3V0b2Zmcw0KbW9kZWxfYWlkcHNfYWlkY3V0b2ZmX3ZkZW0gPC0gb2xzKHYyeGVsX2ZyZWZhaXIgfiANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFpZF9sbiAgKw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZWxkYTU3ICogIyBhaWQgY3V0b2ZmDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWJpbmV0Q09VTlQuMTIgKw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0JuYXRyZXMgKyANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZoICsgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub25zdGF0ZSArIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZl9pbnRlbnMgKyANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZyhnZHBfcGVyX2NhcGl0YV91bikgKyANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZyhwb3B1bGF0aW9uKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBuZWxkYV9wcywgeCA9IFQsIHkgPSBUKQ0KbW9kZWxfYWlkcHNfYWlkY3V0b2ZmX3ZkZW0gPC0gcm9iY292KG1vZGVsX2FpZHBzX2FpZGN1dG9mZl92ZGVtLCBuZWxkYV9wcyRjb3VudHJ5KQ0KDQojIGVsZWN0aW9uIG1vbml0b3JzDQptb2RlbF9haWRwc19lbG1vbnNfdmRlbSA8LSBvbHModjJ4ZWxfZnJlZmFpciB+IA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFpZF9sbiAgKw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5lbGRhNDUgKiAjIGVsZWN0aW9uIG1vbml0b3JzDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FiaW5ldENPVU5ULjEyICsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBXQm5hdHJlcyArIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZoICsgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9uc3RhdGUgKyANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25mX2ludGVucyArIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZyhnZHBfcGVyX2NhcGl0YV91bikgKyANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2cocG9wdWxhdGlvbikNCiAgICAgICAgICAgICAgICAgICAgICAgICAgLA0KICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhID0gbmVsZGFfcHMsIHggPSBULCB5ID0gVCkNCm1vZGVsX2FpZHBzX2VsbW9uc192ZGVtIDwtIHJvYmNvdihtb2RlbF9haWRwc19lbG1vbnNfdmRlbSwgbmVsZGFfcHMkY291bnRyeSkNCg0KIyBPdXRwdXQNCm1vZGVsX2xpc3QgPC0gbGlzdChtb2RlbF9haWRwc19haWRjdXRvZmYsIA0KICAgICAgICAgICAgICAgICAgIG1vZGVsX2FpZHBzX2VsbW9ucywgDQogICAgICAgICAgICAgICAgICAgbW9kZWxfYWlkcHNfYWlkY3V0b2ZmX3ZkZW0sIA0KICAgICAgICAgICAgICAgICAgIG1vZGVsX2FpZHBzX2VsbW9uc192ZGVtKQ0KDQpjb2VmX25hbWVfbWFwIDwtIGxpc3QoIGNhYmluZXRJTkMuMTIgPSAiUG93ZXItU2hhcmluZyAoYmluYXJ5KSIsDQogICAgICAgICAgICAgICAgICAgICAgIGNhYmluZXRDT1VOVC4xMiA9ICJQb3dlci1TaGFyaW5nIChjYWJpbmV0KSIsDQogICAgICAgICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgICAgICAgICBuZWxkYTU3ID0gIkFpZCBDdXQtT2ZmIiwgDQogICAgICAgICAgICAgICAgICAgICAgICJuZWxkYTU3ICogY2FiaW5ldENPVU5ULjEyIiA9ICJQb3dlci1TaGFyaW5nIChjYWJpbmV0KSAqIEFpZCBDdXQtT2ZmIiwNCiAgICAgICAgICAgICAgICAgICAgICAgbmVsZGE0NSA9ICJFbGVjdGlvbiBNb25pdG9ycyIsDQogICAgICAgICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgICAgICAgICAibmVsZGE0NSAqIGNhYmluZXRDT1VOVC4xMiIgPSAiUG93ZXItU2hhcmluZyAoY2FiaW5ldCkgKiBFbGVjdGlvbiBNb25pdG9ycyIsDQogICAgICAgICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgICAgICAgICAiYWlkX2xuICogY2FiaW5ldElOQy4xMiIgPSAiUG93ZXItU2hhcmluZyAoYmluYXJ5KSAqIEFpZCIsIA0KICAgICAgICAgICAgICAgICAgICAgICAiYWlkX2xuICogY2FiaW5ldENPVU5ULjEyIiA9ICJQb3dlci1TaGFyaW5nIChjYWJpbmV0KSAqIEFpZCIsIA0KICAgICAgICAgICAgICAgICAgICAgICBhaWRfbG4gPSAiQWlkL0dEUCAobG9nKSIsIA0KICAgICAgICAgICAgICAgICAgICAgICBkZ2FfZ2RwX251bGwgPSAiREdBL0dEUCAobG9nKSIsIA0KICAgICAgICAgICAgICAgICAgICAgICBwcm9ncmFtX2FpZF9nZHBfbnVsbD0gIlByb2dyYW0gQWlkIC8gR0RQIChsb2cpIiwgDQogICAgICAgICAgICAgICAgICAgICAgIGJ1ZGdldF9haWRfZ2RwX251bGwgPSAiQnVkZ2V0IEFpZCAvIEdEUCAobG9nIiwgDQogICAgICAgICAgICAgICAgICAgICAgIFdCbmF0cmVzID0gIk5hdC4gUmVzLiBSZW50cyIsIA0KICAgICAgICAgICAgICAgICAgICAgICBmaCA9ICJSZWdpbWUgVHlwZSAoRkgpIiwgDQogICAgICAgICAgICAgICAgICAgICAgIG5vbnN0YXRlID0gIk5vbnN0YXRlIENvbmZsaWN0IiwgDQogICAgICAgICAgICAgICAgICAgICAgIGNvbmZfaW50ZW5zID0gICJDb25mbGljdCBJbnRlbnNpdHkiLCANCiAgICAgICAgICAgICAgICAgICAgICAgcG9wdWxhdGlvbiA9ICJQb3B1bGF0aW9uIChsb2cpIiwgDQogICAgICAgICAgICAgICAgICAgICAgIGdkcF9wZXJfY2FwaXRhX3VuID0gIkdEUCBwL2MgKGxvZykiKQ0KDQoNCg0Kc291cmNlKCIuL2Z1bmN0aW9ucy9jdXN0b21fdGV4cmVnLlIiKQ0KZW52aXJvbm1lbnQoY3VzdG9tX3RleHJlZykgPC0gYXNOYW1lc3BhY2UoJ3RleHJlZycpDQoNCiMgDQojIGN1c3RvbV90ZXhyZWcobCA9IG1vZGVsX2xpc3QsDQojICAgICAgICAgICAgICAgc3RhcnMgPSBjKDAuMDAxLCAwLjAxLCAwLjA1LCAwLjEpLA0KIyAgICAgICAgICAgICAgIGZpbGUgPSAiLi4vb3V0cHV0L2FpZGN1dG9mZl9lbG1vbl9lbGVjdGlvbnMudGV4IiwgDQojICAgICAgICAgICAgICAgY3VzdG9tLmNvZWYubWFwID0gY29lZl9uYW1lX21hcCwNCiMgICAgICAgICAgICAgICBzeW1ib2wgPSAiKyIsDQojICAgICAgICAgICAgICAgdGFibGUgPSBGLA0KIyAgICAgICAgICAgICAgIGJvb2t0YWJzID0gVCwNCiMgICAgICAgICAgICAgICB1c2UucGFja2FnZXMgPSBGLA0KIyAgICAgICAgICAgICAgIGN1c3RvbS5tdWx0aWNvbCA9IFQsIA0KIyAgICAgICAgICAgICAgIGN1c3RvbS5tb2RlbC5uYW1lcyA9IGMoIiBcXG11bHRpY29sdW1uezJ9e2N9e1xcdGV4dGJme05FTERBIEVsZWN0aW9uIFF1YWxpdHl9fSAmIA0KIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXG11bHRpY29sdW1uezJ9e2N9e1xcdGV4dGJme1YtRGVtIENsZWFuIEVsZWN0aW9ucyBJbmRleH19IFxcXFwgDQojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxcY21pZHJ1bGUocil7Mi0zfSBcXGNtaWRydWxlKHIpezQtNX0gDQojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYgXFxtdWx0aWNvbHVtbnsxfXtjfXsoMSkgIH0iLA0KIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXFxtdWx0aWNvbHVtbnsxfXtjfXsoMikgIH0iLA0KIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXFxtdWx0aWNvbHVtbnsxfXtjfXsoMykgIH0iLA0KIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXFxtdWx0aWNvbHVtbnsxfXtjfXsoNCkgIH0iKSwNCiMgICAgICAgICAgICAgICBkY29sdW1uID0gVCwNCiMgICAgICAgICAgICAgICBpbmNsdWRlLmxyID0gRiwNCiMgICAgICAgICAgICAgICBpbmNsdWRlLnJzcXVhcmVkID0gRiwNCiMgICAgICAgICAgICAgICBpbmNsdWRlLmFkanJzID0gVCwNCiMgICAgICAgICAgICAgICBpbmNsdWRlLmNsdXN0ZXIgPSBUKQ0KDQoNCmh0bWxyZWcobCA9IG1vZGVsX2xpc3QsDQogICAgICAgICAgc3RhcnMgPSBjKDAuMDAxLCAwLjAxLCAwLjA1LCAwLjEpLA0KICAgICAgICAgIGN1c3RvbS5jb2VmLm1hcCA9IGNvZWZfbmFtZV9tYXAsDQogICAgICAgICAgc3ltYm9sID0gIisiLA0KICAgICAgICAgIHRhYmxlID0gRiwNCiAgICAgICAgICBib29rdGFicyA9IFQsDQogICAgICAgICAgdXNlLnBhY2thZ2VzID0gRiwNCiAgICAgIA0KICAgICAgICAgIGRjb2x1bW4gPSBULA0KICAgICAgICAgIGluY2x1ZGUubHIgPSBGLA0KICAgICAgICAgIGluY2x1ZGUucnNxdWFyZWQgPSBGLA0KICAgICAgICAgIGluY2x1ZGUuYWRqcnMgPSBULA0KICAgICAgICAgIGluY2x1ZGUuY2x1c3RlciA9IFQsDQogICAgICAgIGNhcHRpb24gPSAiIiwgDQogICAgICAgIHN0YXIuc3ltYm9sID0gIlxcKiIpDQoNCg0KDQpgYGANCg0KIyBUYWJsZSA2LjQ6IFJvYnVzdG5lc3MgQ2hlY2tzIGFuZCBBbHRlcm5hdGl2ZSBTcGVjaWZpY2F0aW9ucyBmb3IgdGhlIEludGVyYWN0aW9uIEVmZmVjdCBvZiBBaWQgYW5kIFBvd2VyLVNoYXJpbmcgb24gRWxlY3Rpb24gUXVhbGl0eQ0KDQpgYGB7ciwgcmVzdWx0cz0iYXNpcyIsIG1lc3NhZ2U9Riwgd2FybmluZz1GLCBjYWNoZSA9IFQsIGNvbW1lbnRzID0gRn0NCg0KIyBMaWJyYXJpZXMNCmxpYnJhcnkocm1zKQ0KbGlicmFyeShwbG0pDQpsaWJyYXJ5KGNvdW50cnljb2RlKQ0KbGlicmFyeSh0ZXhyZWcpDQoNCiMgbG9hZCBkYXRhDQpsb2FkKCIuL2RhdGEvbmVsZGFfcHMucmRhIikNCg0KIyBFdGhuaWMgRnJhY3Rpb25hbGl6YXRpb24NCm1vZGVsX2FpZHBzX3F1YWxpdHlfY2FiY291bnRfZWxmIDwtIG9scyhxdWFsaXR5IH4gDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhaWRfbG4gKiAgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWJpbmV0Q09VTlQuMTIgKw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0JuYXRyZXMgKyANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZoICsgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub25zdGF0ZSArIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZl9pbnRlbnMgKyANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZyhnZHBfcGVyX2NhcGl0YV91bikgKyANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZyhwb3B1bGF0aW9uKSArDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV0aG5pYw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBuZWxkYV9wcywgeCA9IFQsIHkgPSBUKQ0KbW9kZWxfYWlkcHNfcXVhbGl0eV9jYWJjb3VudF9lbGYgPC0gcm9iY292KG1vZGVsX2FpZHBzX3F1YWxpdHlfY2FiY291bnRfZWxmLCBuZWxkYV9wcyRjb3VudHJ5KQ0KDQoNCiMgUEtPDQptb2RlbF9haWRwc19xdWFsaXR5X2NhYmNvdW50X3BrbyA8LSBvbHMocXVhbGl0eSB+IA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWlkX2xuICogIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FiaW5ldENPVU5ULjEyICsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdCbmF0cmVzICsgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaCArIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9uc3RhdGUgKyANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZfaW50ZW5zICsgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2coZ2RwX3Blcl9jYXBpdGFfdW4pICsgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2cocG9wdWxhdGlvbikgKw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEU19vcmRpbmFsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IG5lbGRhX3BzLCB4ID0gVCwgeSA9IFQpDQptb2RlbF9haWRwc19xdWFsaXR5X2NhYmNvdW50X3BrbyA8LSByb2Jjb3YobW9kZWxfYWlkcHNfcXVhbGl0eV9jYWJjb3VudF9wa28sIG5lbGRhX3BzJGNvdW50cnkpDQoNCiMgY2FiaW5ldCBzaXplDQpsaWJyYXJ5KHJlYWR4bCkNCmNudHMgPC0gcmVhZF9leGNlbCgiLi9kYXRhL0NOVFNEQVRBLnhscyIpDQoNCmNudHMgPC0gY250cyAlPiUgZmlsdGVyKHllYXIgPj0gMTk4OSkNCg0KY250cyRpc28zYyA8LSBjb3VudHJ5Y29kZShjbnRzJGNvdW50cnksICJjb3VudHJ5Lm5hbWUiLCAiaXNvM2MiKQ0KY250cyA8LSBjbnRzICU+JSBmaWx0ZXIoY291bnRyeSAhPSAiU09NQUxJTEFORCIpDQoNCnRlc3RjYWJzaXplIDwtIGxlZnRfam9pbihuZWxkYV9wcywgY250c1ssIGMoImlzbzNjIiwgInllYXIiLCAicG9saXQxMCIpXSkNCg0KdGVzdGNhYnNpemUkcHNfc2hhcmUgPC0gdGVzdGNhYnNpemUkY2FiaW5ldENPVU5UIC8gdGVzdGNhYnNpemUkcG9saXQxMCAqIDEwMA0KDQptb2RlbF9lbF9jYWJzaGFyZSA8LSBvbHMocXVhbGl0eSB+IA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgYWlkX2xuICogIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgcHNfc2hhcmUgKw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgV0JuYXRyZXMgKyANCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGZoICsgDQogICAgICAgICAgICAgICAgICAgICAgICAgICBub25zdGF0ZSArIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZl9pbnRlbnMgKyANCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZyhnZHBfcGVyX2NhcGl0YV91bikgKyANCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZyhwb3B1bGF0aW9uKSANCiAgICAgICAgICAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICAgICAgICAgICAsDQogICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IHRlc3RjYWJzaXplLCB4ID0gVCwgeSA9IFQpDQptb2RlbF9lbF9jYWJzaGFyZSA8LSByb2Jjb3YobW9kZWxfZWxfY2Fic2hhcmUsIHRlc3RjYWJzaXplJGNvdW50cnkpDQoNCiMgV2FzIEluY3VtYmVudCBjb250ZXN0ZWQ6IG5lbGRhMjANCm5lbGRhX3BzIDwtIGFzLmRhdGEuZnJhbWUobmVsZGFfcHMpDQpuZWxkYV9wcyRuZWxkYTIwIDwtIGlmZWxzZShuZWxkYV9wcyRuZWxkYTIwID09ICJ5ZXMiLCAxLCAwKQ0KDQppbmNfY29udGVzdGVkIDwtIG5lbGRhX3BzICU+JSANCiAgZmlsdGVyKG5lbGRhMjAgPT0gMSkNCg0KaW5jX25vdGNvbnRlc3RlZCA8LSBuZWxkYV9wcyAlPiUgDQogIGZpbHRlcihuZWxkYTIwID09IDApDQoNCmluY19jb250ZXN0ZWRfbW9kZWwgPC0gb2xzKHF1YWxpdHkgfiANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWlkX2xuICoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FiaW5ldENPVU5ULjEyICArDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdCbmF0cmVzICsgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZoICsgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vbnN0YXRlICsgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZfaW50ZW5zICsgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZyhnZHBfcGVyX2NhcGl0YV91bikgKyANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nKHBvcHVsYXRpb24pICANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBpbmNfY29udGVzdGVkLCB4ID0gVCwgeSA9IFQpDQppbmNfY29udGVzdGVkX21vZGVsIDwtIHJvYmNvdihpbmNfY29udGVzdGVkX21vZGVsLCBpbmNfY29udGVzdGVkJGNvdW50cnkpDQoNCmluY19ub3Rjb250ZXN0ZWRfbW9kZWwgPC0gb2xzKHF1YWxpdHkgfiANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWlkX2xuICoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FiaW5ldENPVU5ULjEyICArDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdCbmF0cmVzICsgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZoICsgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vbnN0YXRlICsgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZfaW50ZW5zICsgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZyhnZHBfcGVyX2NhcGl0YV91bikgKyANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nKHBvcHVsYXRpb24pICANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBpbmNfbm90Y29udGVzdGVkLCB4ID0gVCwgeSA9IFQpDQppbmNfbm90Y29udGVzdGVkX21vZGVsIDwtIHJvYmNvdihpbmNfbm90Y29udGVzdGVkX21vZGVsLCBpbmNfbm90Y29udGVzdGVkJGNvdW50cnkpDQoNCiMgVHlwZSBvZiBFbGVjdGlvbiANCm1vZGVsX2FpZHBzX3F1YWxpdHlfY2FiY291bnRfZWx0eXBlIDwtIG9scyhxdWFsaXR5IH4gDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhaWRfbG4gKiAgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWJpbmV0Q09VTlQuMTIgKw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0JuYXRyZXMgKyANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZoICsgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub25zdGF0ZSArIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZl9pbnRlbnMgKyANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZyhnZHBfcGVyX2NhcGl0YV91bikgKyANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZyhwb3B1bGF0aW9uKSArDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZXMNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhID0gbmVsZGFfcHMsIHggPSBULCB5ID0gVCkNCm1vZGVsX2FpZHBzX3F1YWxpdHlfY2FiY291bnRfZWx0eXBlIDwtIHJvYmNvdihtb2RlbF9haWRwc19xdWFsaXR5X2NhYmNvdW50X2VsdHlwZSwgbmVsZGFfcHMkY291bnRyeSkNCg0KIyBSYW5kb20gRWZmZWN0cw0KY291bnRyeXJlX2FpZHBzX3F1YWxpdHlfY2FiY291bnQgPC0gcGxtKHF1YWxpdHkgfiANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFpZF9sbiAqICANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhYmluZXRDT1VOVC4xMiArDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXQm5hdHJlcyArIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmggKyANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vbnN0YXRlICsgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25mX2ludGVucyArIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nKGdkcF9wZXJfY2FwaXRhX3VuKSArIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nKHBvcHVsYXRpb24pIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBuZWxkYV9wcywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleCA9IGMoImNvdW50cnkiLCAiZWxlY3Rpb25pZCIpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGVsID0gInJhbmRvbSIpDQpjb3VudHJ5cmVfYWlkcHNfcXVhbGl0eV9jYWJjb3VudCR2Y292IDwtIHZjb3ZIQyhjb3VudHJ5cmVfYWlkcHNfcXVhbGl0eV9jYWJjb3VudCkNCg0KDQoNCiMgUmVnaW9uIEZFDQpuZWxkYV9wcyRyZWdpb25fZmUgPC0gY291bnRyeWNvZGUobmVsZGFfcHMkY291bnRyeSwgImNvdW50cnkubmFtZSIsICJyZWdpb24iKQ0KDQpyZWdpb25mZV9haWRwc19xdWFsaXR5X2NhYmNvdW50IDwtIG9scyhxdWFsaXR5IH4gDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhaWRfbG4gKiAgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWJpbmV0Q09VTlQuMTIgKw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0JuYXRyZXMgKyANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZoICsgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vbnN0YXRlICsgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25mX2ludGVucyArIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nKGdkcF9wZXJfY2FwaXRhX3VuKSArIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nKHBvcHVsYXRpb24pKw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdpb25fZmUgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IG5lbGRhX3BzLCB5ID0gVCwgeCA9IFQpDQpyZWdpb25mZV9haWRwc19xdWFsaXR5X2NhYmNvdW50IDwtIHJvYmNvdihyZWdpb25mZV9haWRwc19xdWFsaXR5X2NhYmNvdW50LCBuZWxkYV9wcyRjb3VudHJ5KQ0KDQojIENvdW50cnkgRkUNCmNvdW50cnlmZV9haWRwc19xdWFsaXR5X2NhYmNvdW50IDwtIHBsbShxdWFsaXR5IH4gDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhaWRfbG4gKiAgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWJpbmV0Q09VTlQuMTIgKw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0JuYXRyZXMgKyANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZoICsgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub25zdGF0ZSArIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZl9pbnRlbnMgKyANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZyhnZHBfcGVyX2NhcGl0YV91bikgKyANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZyhwb3B1bGF0aW9uKSANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhID0gbmVsZGFfcHMsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXggPSBjKCJjb3VudHJ5IiwgImVsZWN0aW9uaWQiKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RlbCA9ICJ3aXRoaW4iKQ0KY291bnRyeWZlX2FpZHBzX3F1YWxpdHlfY2FiY291bnQkdmNvdiA8LSB2Y292SEMoY291bnRyeWZlX2FpZHBzX3F1YWxpdHlfY2FiY291bnQpDQoNCg0KIyBPdXRwdXQNCg0KIyBGaXJzdDogY3JlYXRlIG1vZGVsIGxpc3QNCnJvYl9lbGVjdGlvbl9tb2RlbGxpc3QgPC0gbGlzdChtb2RlbF9haWRwc19xdWFsaXR5X2NhYmNvdW50X2VsZiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kZWxfYWlkcHNfcXVhbGl0eV9jYWJjb3VudF9wa28sIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGVsX2VsX2NhYnNoYXJlLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluY19jb250ZXN0ZWRfbW9kZWwsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5jX25vdGNvbnRlc3RlZF9tb2RlbCwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBtb2RlbF9haWRwc19xdWFsaXR5X2NhYmNvdW50X2VsdHlwZSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudHJ5cmVfYWlkcHNfcXVhbGl0eV9jYWJjb3VudCwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnaW9uZmVfYWlkcHNfcXVhbGl0eV9jYWJjb3VudCkNCg0KY29lZl9uYW1lX21hcCA8LSBsaXN0KGNhYmluZXRJTkMuMTIgPSAiUG93ZXItU2hhcmluZyAoYmluYXJ5KSIsDQogICAgICAgICAgICAgICAgICAgICAgY2FiaW5ldENPVU5ULjEyID0gIlBvd2VyLVNoYXJpbmcgKGNhYmluZXQpIiwNCiAgICAgICAgICAgICAgICAgICAgICAiYWlkX2xuOmNhYmluZXRDT1VOVC4xMiIgPSAiUG93ZXItU2hhcmluZyAoY2FiaW5ldCkgKiBBaWQiLA0KICAgICAgICAgICAgICAgICAgICAgICJhaWRfbG4gKiBjYWJpbmV0Q09VTlQuMTIiID0gIlBvd2VyLVNoYXJpbmcgKGNhYmluZXQpICogQWlkIiwNCiAgICAgICAgICAgICAgICAgICAgICBwc19zaGFyZSA9ICJQb3dlci1TaGFyaW5nIChjYWJpbmV0IHNoYXJlKSIsDQogICAgICAgICAgICAgICAgICAgICAgImFpZF9sbiAqIHBzX3NoYXJlIiA9ICJQb3dlci1TaGFyaW5nIChjYWJpbmV0IHNoYXJlKSAqIEFpZCIsDQogICAgICAgICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgICAgICAgIGFpZF9sbiA9ICJBaWQvR0RQIChsb2cpIiwNCiAgICAgICAgICAgICAgICAgICAgICBXQm5hdHJlcyA9ICJOYXQuIFJlcy4gUmVudHMiLCANCiAgICAgICAgICAgICAgICAgICAgICBmaCA9ICJSZWdpbWUgVHlwZSAoRkgpIiwgDQogICAgICAgICAgICAgICAgICAgICAgbm9uc3RhdGUgPSAiTm9uc3RhdGUgQ29uZmxpY3QiLCANCiAgICAgICAgICAgICAgICAgICAgICBjb25mX2ludGVucyA9ICAiQ29uZmxpY3QgSW50ZW5zaXR5IiwgDQogICAgICAgICAgICAgICAgICAgICAgcG9wdWxhdGlvbiA9ICJQb3B1bGF0aW9uIChsb2cpIiwgDQogICAgICAgICAgICAgICAgICAgICAgImxvZyhwb3B1bGF0aW9uKSIgPSAiUG9wdWxhdGlvbiAobG9nKSIsDQogICAgICAgICAgICAgICAgICAgICAgZ2RwX3Blcl9jYXBpdGFfdW4gPSAiR0RQIHAvYyAobG9nKSIsDQogICAgICAgICAgICAgICAgICAgICAgImxvZyhnZHBfcGVyX2NhcGl0YV91bikiID0gIkdEUCBwL2MgKGxvZykiLA0KICAgICAgICAgICAgICAgICAgICAgIEV0aG5pYyA9ICJFdGhuaWMgRnJhY3Rpb25hbGl6YXRpb24iLCANCiAgICAgICAgICAgICAgICAgICAgICBEU19vcmRpbmFsID0gIlVOIFBLTyIsIA0KICAgICAgICAgICAgICAgICAgICAgIG5lbGRhNDUgPSAiRWxlY3Rpb24gTW9uaXRvcnMiLCANCiAgICAgICAgICAgICAgICAgICAgICB0eXBlcyA9ICJUeXBlIG9mIEVsZWN0aW9uIikNCg0Kc291cmNlKCIuL2Z1bmN0aW9ucy9leHRyYWN0X29sc19jdXN0b20uUiIpDQpzb3VyY2UoIi4vZnVuY3Rpb25zL2V4dHJhY3RfcGxtX2N1c3RvbS5SIikNCg0KIyBPdXRwdXQgTWFudXNjcmlwdA0KdGV4cmVnKHJvYl9lbGVjdGlvbl9tb2RlbGxpc3QsDQogICAgICAgc3RhcnMgPSBjKDAuMDAxLCAwLjAxLCAwLjA1LCAwLjEpLA0KICAgICAgIGN1c3RvbS5jb2VmLm1hcCA9IGNvZWZfbmFtZV9tYXAsDQogICAgICAgZmlsZSA9ICIuLi9vdXRwdXQvYWlkcHNfZWxlY3Rpb25zX2ludGVyYWN0aW9uX3JvYnVzdG5lc3MudGV4IiwNCiAgICAgICBzeW1ib2wgPSAiKyIsDQogICAgICAgdGFibGUgPSBGLA0KICAgICAgIGJvb2t0YWJzID0gVCwNCiAgICAgICBjdXN0b20ubW9kZWwubmFtZXMgPSBjKCIoMSkgRUxGIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKDIpIFVOIFBLTyIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIigzKSBDYWIuIFNpemUiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIoNCkgSW5jLiBDb250ZXN0LiIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIig1KSBJbmMuIE5vdCBDb250LiIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIig2KSBSRSIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIig2KSBSZWdpb24gRkUiICksDQogICAgICAgdXNlLnBhY2thZ2VzID0gRiwNCiAgICAgICBkY29sdW1uID0gVCwNCiAgICAgICBpbmNsdWRlLmxyID0gRiwNCiAgICAgICBpbmNsdWRlLmFkanJzID0gVCwNCiAgICAgICBjYXB0aW9uID0gIiIsDQogICAgICAgc3Rhci5zeW1ib2wgPSAiXFwqIiwNCiAgICAgICBpbmNsdWRlLnJzcXVhcmVkID0gRiwNCiAgICAgICBpbmNsdWRlLmNsdXN0ZXIgPSBULA0KICAgICAgIGluY2x1ZGUudmFyaWFuY2UgPSBGKQ0KDQojIE91dHB1dCBSZXBsaWNhdGlvbiBBcmNoaXZlDQp0ZXhyZWc6Omh0bWxyZWcocm9iX2VsZWN0aW9uX21vZGVsbGlzdCwgDQogICAgICAgICAgICAgICAgc3RhcnMgPSBjKDAuMDAxLCAwLjAxLCAwLjA1LCAwLjEpLA0KICAgICAgICAgICAgICAgIGN1c3RvbS5jb2VmLm1hcCA9IGNvZWZfbmFtZV9tYXAsDQogICAgICAgICAgICAgICAgc3ltYm9sID0gIisiLA0KICAgICAgICAgICAgICAgIHRhYmxlID0gRiwNCiAgICAgICAgICAgICAgICAgY3VzdG9tLm1vZGVsLm5hbWVzID0gYygiKDEpIEVMRiIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIigyKSBVTiBQS08iLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIoMykgQ2FiLiBTaXplIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKDQpIEluYy4gQ29udGVzdC4iLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIoNSkgSW5jLiBOb3QgQ29udC4iLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIoNikgUkUiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIoNikgUmVnaW9uIEZFIiApLA0KICAgICAgICAgICAgICAgIGJvb2t0YWJzID0gVCwNCiAgICAgICAgICAgICAgICB1c2UucGFja2FnZXMgPSBGLA0KICAgICAgICAgICAgICAgIGRjb2x1bW4gPSBULA0KICAgICAgICAgICAgICAgIGluY2x1ZGUubHIgPSBGLA0KICAgICAgICAgICAgICAgIGluY2x1ZGUuYWRqcnMgPSBULA0KICAgICAgICAgICAgICAgIGNhcHRpb24gPSAiIiwgDQogICAgICAgICAgICAgICAgc3Rhci5zeW1ib2wgPSAiXFwqIiwgDQogICAgICAgICAgICAgICAgaW5jbHVkZS5yc3F1YXJlZCA9IEYsDQogICAgICAgICAgICAgICAgaW5jbHVkZS5jbHVzdGVyID0gVCwNCiAgICAgICAgICAgICAgICBpbmNsdWRlLnZhcmlhbmNlID0gRikNCg0KYGBgDQoNCiMgVGFibGUgNi41OiBNYXRjaGluZyBSZXN1bHRzIGZvciB0aGUgSW50ZXJhY3RpdmUgRWZmZWN0IG9mIEZvcmVpZ24gQWlkIGFuZCBQb3dlci1TaGFyaW5nIG9uIFBvc3QtQ29uZmxpY3QgRWxlY3Rpb24gUXVhbGl0eQ0KDQpgYGB7ciwgcmVzdWx0cz0iYXNpcyIsIG1lc3NhZ2U9Riwgd2FybmluZz1GLCBjYWNoZSA9IFQsIGNvbW1lbnRzID0gRn0NCiMgTGlicmFyaWVzDQpsaWJyYXJ5KHJtcykNCmxpYnJhcnkodGV4cmVnKQ0KDQojIExvYWQgbWF0Y2hlZCBkYXRhIHNldA0KbG9hZCgiLi9kYXRhL25lbGRhX3BzX21hdGNoZWQucmRhIikNCg0KbWF0Y2hfZGZfZWxlY19yZWckYWlkX2xuIDwtIGxvZyhtYXRjaF9kZl9lbGVjX3JlZyRhaWRkYXRhX0FpZEdEUCkNCg0KDQojIE5FTERBDQptb2RlbF9tYXRjaGVkX2FpZHBzX2NhYklOQ19uZWxkYSA8LSBybXM6Om9scyhxdWFsaXR5IH4gDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhaWRfbG4gKiBjYWJpbmV0SU5DLjEyICsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZyhnZHBfcGVyX2NhcGl0YV91bikgKw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nKHBvcHVsYXRpb24pICsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZfaW50ZW5zICsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgICAgICAgIG5vbnN0YXRlICsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdCbmF0cmVzICsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZoLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhID0gbWF0Y2hfZGZfZWxlY19yZWcgLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4ID0gVCAsIHkgPSBUKQ0KDQptb2RlbF9tYXRjaGVkX2FpZHBzX2NhYklOQ19uZWxkYSAgPC0gcm9iY292KG1vZGVsX21hdGNoZWRfYWlkcHNfY2FiSU5DX25lbGRhICwgbWF0Y2hfZGZfZWxlY19yZWckY291bnRyeSkNCg0KDQoNCiMgY2FiaW5ldElOQyAqIEFpZDsgVi1EZW0NCm1vZGVsX21hdGNoZWRfYWlkcHNfY2FiSU5DX3ZkZW0gPC0gcm1zOjpvbHModjJ4ZWxfZnJlZmFpciB+IA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhaWRfbG4gKiBjYWJpbmV0SU5DLjEyICsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2coZ2RwX3Blcl9jYXBpdGFfdW4pICsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2cocG9wdWxhdGlvbikgKw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZfaW50ZW5zICsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjICAgICAgICBub25zdGF0ZSArDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0JuYXRyZXMgKw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZoICwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhID0gbWF0Y2hfZGZfZWxlY19yZWcgLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeCA9IFQgLCB5ID0gVCkNCg0KbW9kZWxfbWF0Y2hlZF9haWRwc19jYWJJTkNfdmRlbSAgPC0gcm9iY292KG1vZGVsX21hdGNoZWRfYWlkcHNfY2FiSU5DX3ZkZW0gLCBtYXRjaF9kZl9lbGVjX3JlZyRjb3VudHJ5KQ0KDQoNCiMgT3V0cHV0IA0KbWF0Y2hlZF9lbGVjdGlvbl9tb2RlbGxpc3QgPC0gbGlzdChtb2RlbF9tYXRjaGVkX2FpZHBzX2NhYklOQ19uZWxkYSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGVsX21hdGNoZWRfYWlkcHNfY2FiSU5DX3ZkZW0pDQoNCmNvZWZfbmFtZV9tYXAgPC0gbGlzdChjYWJpbmV0SU5DLjEyID0gIlBvd2VyLVNoYXJpbmcgKGJpbmFyeSkiLA0KICAgICAgICAgICAgICAgICAgICAgICJhaWRfbG4gKiBjYWJpbmV0SU5DLjEyIiA9ICJQb3dlci1TaGFyaW5nIChiaW5hcnkpICogQWlkIiwNCiAgICAgICAgICAgICAgICAgICAgICBwc19zaGFyZSA9ICJQb3dlci1TaGFyaW5nIChjYWJpbmV0IHNoYXJlKSIsDQogICAgICAgICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgICAgICAgIGFpZF9sbiA9ICJBaWQvR0RQIChsb2cpIiwNCiAgICAgICAgICAgICAgICAgICAgICBXQm5hdHJlcyA9ICJOYXQuIFJlcy4gUmVudHMiLCANCiAgICAgICAgICAgICAgICAgICAgICBmaCA9ICJSZWdpbWUgVHlwZSAoRkgpIiwgDQogICAgICAgICAgICAgICAgICAgICAgbm9uc3RhdGUgPSAiTm9uc3RhdGUgQ29uZmxpY3QiLCANCiAgICAgICAgICAgICAgICAgICAgICBjb25mX2ludGVucyA9ICAiQ29uZmxpY3QgSW50ZW5zaXR5IiwgDQogICAgICAgICAgICAgICAgICAgICAgcG9wdWxhdGlvbiA9ICJQb3B1bGF0aW9uIChsb2cpIiwgDQogICAgICAgICAgICAgICAgICAgICAgImxvZyhwb3B1bGF0aW9uKSIgPSAiUG9wdWxhdGlvbiAobG9nKSIsDQogICAgICAgICAgICAgICAgICAgICAgZ2RwX3Blcl9jYXBpdGFfdW4gPSAiR0RQIHAvYyAobG9nKSIsDQogICAgICAgICAgICAgICAgICAgICAgImxvZyhnZHBfcGVyX2NhcGl0YV91bikiID0gIkdEUCBwL2MgKGxvZykiLA0KICAgICAgICAgICAgICAgICAgICAgIEV0aG5pYyA9ICJFdGhuaWMgRnJhY3Rpb25hbGl6YXRpb24iLCANCiAgICAgICAgICAgICAgICAgICAgICBEU19vcmRpbmFsID0gIlVOIFBLTyIsIA0KICAgICAgICAgICAgICAgICAgICAgIG5lbGRhNDUgPSAiRWxlY3Rpb24gTW9uaXRvcnMiLCANCiAgICAgICAgICAgICAgICAgICAgICB0eXBlcyA9ICJUeXBlIG9mIEVsZWN0aW9uIikNCg0Kc291cmNlKCIuL2Z1bmN0aW9ucy9leHRyYWN0X29sc19jdXN0b20uUiIpDQoNCiMgdGV4cmVnKG1hdGNoZWRfZWxlY3Rpb25fbW9kZWxsaXN0LCANCiMgICAgICAgIGZpbGUgPSAiLi4vb3V0cHV0L21hdGNoZWRfcmVzdWx0c19lbGVjdGlvbnMudGV4IiwNCiMgICAgICAgICAgICAgICAgIHN0YXJzID0gYygwLjAwMSwgMC4wMSwgMC4wNSwgMC4xKSwNCiMgICAgICAgICAgICAgICAgIGN1c3RvbS5jb2VmLm1hcCA9IGNvZWZfbmFtZV9tYXAsDQojICAgICAgICAgICAgICAgICBzeW1ib2wgPSAiKyIsDQojICAgICAgICAgICAgICAgICB0YWJsZSA9IEYsDQojICAgICAgICAgICAgICAgICBib29rdGFicyA9IFQsDQojICAgICAgICAgICAgICAgICB1c2UucGFja2FnZXMgPSBGLA0KIyAgICAgICAgICAgICAgICAgY3VzdG9tLm1vZGVsLm5hbWVzID0gYygiKDEpIE5FTERBIiwgIigyKSBWLURlbSIpLA0KIyAgICAgICAgICAgICAgICAgZGNvbHVtbiA9IFQsDQojICAgICAgICAgICAgICAgICBpbmNsdWRlLmxyID0gRiwNCiMgICAgICAgICAgICAgICAgIGluY2x1ZGUuYWRqcnMgPSBULA0KIyAgICAgICAgICAgICAgICAgY2FwdGlvbiA9ICIiLCANCiMgICAgICAgICAgICAgICAgIHN0YXIuc3ltYm9sID0gIlxcKiIsIA0KIyAgICAgICAgICAgICAgICAgaW5jbHVkZS5yc3F1YXJlZCA9IEYsDQojICAgICAgICAgICAgICAgICBpbmNsdWRlLmNsdXN0ZXIgPSBULA0KIyAgICAgICAgICAgICAgICAgaW5jbHVkZS52YXJpYW5jZSA9IEYpDQoNCg0KdGV4cmVnOjpodG1scmVnKG1hdGNoZWRfZWxlY3Rpb25fbW9kZWxsaXN0LCANCiAgICAgICAgICAgICAgICBzdGFycyA9IGMoMC4wMDEsIDAuMDEsIDAuMDUsIDAuMSksDQogICAgICAgICAgICAgICAgY3VzdG9tLmNvZWYubWFwID0gY29lZl9uYW1lX21hcCwNCiAgICAgICAgICAgICAgICBzeW1ib2wgPSAiKyIsDQogICAgICAgICAgICAgICAgdGFibGUgPSBGLA0KICAgICAgICAgICAgICAgIGJvb2t0YWJzID0gVCwNCiAgICAgICAgICAgICAgICB1c2UucGFja2FnZXMgPSBGLA0KICAgICAgICAgICAgICAgIGN1c3RvbS5tb2RlbC5uYW1lcyA9IGMoIigxKSBORUxEQSIsICJWLURlbSIpLA0KICAgICAgICAgICAgICAgIGRjb2x1bW4gPSBULA0KICAgICAgICAgICAgICAgIGluY2x1ZGUubHIgPSBGLA0KICAgICAgICAgICAgICAgIGluY2x1ZGUuYWRqcnMgPSBULA0KICAgICAgICAgICAgICAgIGNhcHRpb24gPSAiIiwgDQogICAgICAgICAgICAgICAgc3Rhci5zeW1ib2wgPSAiXFwqIiwgDQogICAgICAgICAgICAgICAgaW5jbHVkZS5yc3F1YXJlZCA9IEYsDQogICAgICAgICAgICAgICAgaW5jbHVkZS5jbHVzdGVyID0gVCwNCiAgICAgICAgICAgICAgICBpbmNsdWRlLnZhcmlhbmNlID0gRikNCg0KDQpgYGANCg0KIyBUYWJsZSA2LjYgSW5zdHJ1bWVudGFsIFZhcmlhYmxlIFJlc3VsdHMgZm9yIHRoZSBJbnRlcmFjdGl2ZSBFZmZlY3Qgb2YgRm9yZWlnbiBBaWQgYW5kIFBvd2VyLVNoYXJpbmcgb24gUG9zdC1Db25mbGljdCBFbGVjdGlvbiBRdWFsaXR5DQoNCmBgYHtyLCByZXN1bHRzPSJhc2lzIiwgbWVzc2FnZT1GLCB3YXJuaW5nPUYsIGNhY2hlID0gVCwgY29tbWVudHMgPSBGLCBkZXYgPSAiQ2Fpcm9QTkcifQ0KIyBMaWJyYXJpZXMNCmxpYnJhcnkodGlkeXZlcnNlKQ0KbGlicmFyeShsZmUpDQoNCiMgTG9hZCBlbGVjdGlvbnMgZGF0YQ0KbG9hZCgiLi9kYXRhL25lbGRhX3BzLnJkYSIpDQoNCiMgbG9hZCBpbnN0cnVtZW50IGRhdGEgZm9yIGFpZA0KbG9hZChmaWxlID0gIi4vZGF0YS9pbnN0cnVtZW50ZWRBaWQyLlJEYXRhIikNCg0KbmVsZGFfaXZyZWcgPC0gbGVmdF9qb2luKG5lbGRhX3BzLCBpbnN0cnVtZW50X2RmLA0KICAgICAgICAgICAgICAgICAgICAgICAgIGJ5ID0gYygieWVhciIsICJpc28yYyIpKQ0KDQpuZWxkYV9pdnJlZyR0b3RhbF9zdW1fZXhjZXB0IDwtIGFzLm51bWVyaWMobmVsZGFfaXZyZWckdG90YWxfc3VtX2V4Y2VwdCkNCg0KbmVsZGFfaXZyZWckaW5zdHJfYWlkX2dkcCA8LSBsb2cobmVsZGFfaXZyZWckdG90YWxfc3VtX2V4Y2VwdCAvIG5lbGRhX2l2cmVnJEdEUCkNCg0KbmVsZGFfaXZyZWckZGF0ZSA8LSBOVUxMDQpuZWxkYV9pdnJlZyRTdGFydERhdGUyIDwtIE5VTEwNCm5lbGRhX2l2cmVnJHllYXJtb24ueCA8LSBOVUxMDQpuZWxkYV9pdnJlZyR5ZWFybW9uLnkgPC0gTlVMTA0KbmVsZGFfaXZyZWdbbmVsZGFfaXZyZWcgPT0gIiJdIDwtIE5BDQoNCg0KIyBoYXJkIGNvZGUgaW50ZXJhY3Rpb25zIGZvciBmZWxtDQpuZWxkYV9pdnJlZyRjYWJYYWlkX2luc3RyIDwtIG5lbGRhX2l2cmVnJGNhYmluZXRDT1VOVC4xMiAqIG5lbGRhX2l2cmVnJGluc3RyX2FpZF9nZHANCm5lbGRhX2l2cmVnJGNhYlhhaWQgPC0gbmVsZGFfaXZyZWckY2FiaW5ldENPVU5ULjEyICogbmVsZGFfaXZyZWckYWlkX2xuDQoNCiMgTW9kZWxzDQptb2RlbF9pdl9haWRwc19uZWxkYSA8LSBmZWxtKHF1YWxpdHkgIH4gDQogICAgICAgICAgICAgICAgICAgICAgICAgIGNhYmluZXRDT1VOVC4xMiAgKyANCiAgICAgICAgICAgICAgICAgICAgICAgICAgV0JuYXRyZXMgKyANCiAgICAgICAgICAgICAgICAgICAgICAgICAgZmggKyANCiAgICAgICAgICAgICAgICAgICAgICAgICAgbm9uc3RhdGUgKyANCiAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZl9pbnRlbnMgKyANCiAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nKGdkcF9wZXJfY2FwaXRhX3VuKSArIA0KICAgICAgICAgICAgICAgICAgICAgICAgICBsb2cocG9wdWxhdGlvbikgDQogICAgICAgICAgICAgICAgICAgICAgICAgIHwgMCB8IChjYWJYYWlkX2luc3RyIHwgYWlkX2xuIH4gY2FiWGFpZCArIGluc3RyX2FpZF9nZHAgKSB8IGNvdW50cnksIGRhdGEgPSBuZWxkYV9pdnJlZykNCg0KIyBWLURlbQ0KbW9kZWxfaXZfYWlkcHNfdmRlbSA8LSBmZWxtKHYyeGVsX2ZyZWZhaXIgIH4gDQogICAgICAgICAgICAgICAgICAgICAgICAgIGNhYmluZXRDT1VOVC4xMiAgKyANCiAgICAgICAgICAgICAgICAgICAgICAgICAgV0JuYXRyZXMgKyANCiAgICAgICAgICAgICAgICAgICAgICAgICAgZmggKyANCiAgICAgICAgICAgICAgICAgICAgICAgICAgbm9uc3RhdGUgKyANCiAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZl9pbnRlbnMgKyANCiAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nKGdkcF9wZXJfY2FwaXRhX3VuKSArIA0KICAgICAgICAgICAgICAgICAgICAgICAgICBsb2cocG9wdWxhdGlvbikgDQogICAgICAgICAgICAgICAgICAgICAgICAgIHwgMCB8IChjYWJYYWlkX2luc3RyIHwgYWlkX2xuIH4gY2FiWGFpZCArIGluc3RyX2FpZF9nZHAgKSB8IGNvdW50cnksIGRhdGEgPSBuZWxkYV9pdnJlZykNCg0KDQojIE91dHB1dA0KDQptb2RlbF9saXN0IDwtIGxpc3QobW9kZWxfaXZfYWlkcHNfbmVsZGEsIA0KICAgICAgICAgICAgICAgICAgIG1vZGVsX2l2X2FpZHBzX3ZkZW0pDQojIGNvZWYgbmFtZSBtYXANCg0KY29lZl9uYW1lX21hcCA8LSBsaXN0KGNhYmluZXRDT1VOVC4xMiA9ICJQb3dlci1TaGFyaW5nIChjYWJpbmV0KSIsDQogICAgICAgICAgICAgICAgICAgICAgImBhaWRfbG4oZml0KWAiID0gIkFpZCAvIEdEUCAoaW5zdHJ1bWVudGVkKSIsDQogICAgICAgICAgICAgICAgICAgICAgImBjYWJYYWlkX2luc3RyKGZpdClgIiA9ICJQb3dlci1TaGFyaW5nIChjYWJpbmV0KSAqIEFpZCAoaW5zdHJ1bWVudGVkKSIsIA0KICAgICAgICAgICAgICAgICAgICAgICJhaWRfbG4gKiBjYWJpbmV0SU5DLjEyIiA9ICJQb3dlci1TaGFyaW5nIChiaW5hcnkpICogQWlkIiwNCg0KICAgICAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICAgICAgICBhaWRfbG4gPSAiQWlkL0dEUCAobG9nKSIsDQogICAgICAgICAgICAgICAgICAgICAgV0JuYXRyZXMgPSAiTmF0LiBSZXMuIFJlbnRzIiwgDQogICAgICAgICAgICAgICAgICAgICAgZmggPSAiUmVnaW1lIFR5cGUgKEZIKSIsIA0KICAgICAgICAgICAgICAgICAgICAgIG5vbnN0YXRlID0gIk5vbnN0YXRlIENvbmZsaWN0IiwgDQogICAgICAgICAgICAgICAgICAgICAgY29uZl9pbnRlbnMgPSAgIkNvbmZsaWN0IEludGVuc2l0eSIsIA0KICAgICAgICAgICAgICAgICAgICAgIHBvcHVsYXRpb24gPSAiUG9wdWxhdGlvbiAobG9nKSIsIA0KICAgICAgICAgICAgICAgICAgICAgICJsb2cocG9wdWxhdGlvbikiID0gIlBvcHVsYXRpb24gKGxvZykiLA0KICAgICAgICAgICAgICAgICAgICAgIGdkcF9wZXJfY2FwaXRhX3VuID0gIkdEUCBwL2MgKGxvZykiLA0KICAgICAgICAgICAgICAgICAgICAgICJsb2coZ2RwX3Blcl9jYXBpdGFfdW4pIiA9ICJHRFAgcC9jIChsb2cpIikNCg0Kc291cmNlKCIuL2Z1bmN0aW9ucy9jdXN0b21fdGV4cmVnLlIiKQ0KZW52aXJvbm1lbnQoY3VzdG9tX3RleHJlZykgPC0gYXNOYW1lc3BhY2UoJ3RleHJlZycpDQoNCiMgT3V0cHV0IE1hbnVzY3JpcHQNCiMgY3VzdG9tX3RleHJlZyhtb2RlbF9saXN0LCANCiMgICAgICAgICAgICAgICBjdXN0b20uY29lZi5tYXAgPSBjb2VmX25hbWVfbWFwLCANCiMgICAgICAgICAgICAgICBmaWxlID0gIi4uL291dHB1dC9pdl9yZXN1bHRzX2VsZWN0aW9ucy50ZXgiLA0KIyAgICAgICAgICAgICAgIGFkZC5saW5lcyA9IGxpc3QoYygiS2xlaWJlcmdlbi1QYWFwIHJrIFdhbGQgRiBzdGF0aXN0aWMiLA0KIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiMTcuNTAiLA0KIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiMTcuNTAiKSwNCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMoIkFkai4gUiReMiQiLA0KIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3VuZChzdW1tYXJ5KG1vZGVsX2l2X2FpZHBzX25lbGRhKSRhZGouci5zcXVhcmVkLCAyKSwNCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm91bmQoc3VtbWFyeShtb2RlbF9pdl9haWRwc192ZGVtKSRhZGouci5zcXVhcmVkLCAyKSksIA0KIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMoIkNvdW50cmllcyIsIA0KIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZW5ndGgodW5pcXVlKG5lbGRhX2l2cmVnJGNvdW50cnkpKSwgDQojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlbmd0aCh1bmlxdWUobmVsZGFfaXZyZWckY291bnRyeSkpKSksIA0KIyAgICAgICAgICAgICAgIHN0YXJzID0gYygwLjAwMSwgMC4wMSwgMC4wNSwgMC4xKSwNCiMgICAgICAgICAgICAgICBzeW1ib2wgPSAiKyIsDQojICAgICAgICAgICAgICAgdGFibGUgPSBGLA0KIyAgICAgICAgICAgICAgIGJvb2t0YWJzID0gVCwNCiMgICAgICAgICAgICAgICB1c2UucGFja2FnZXMgPSBGLA0KIyAgICAgICAgICAgICAgIGN1c3RvbS5tb2RlbC5uYW1lcyA9IGMoIigxKSBORUxEQSIsICIoMikgVi1EZW0iKSwNCiMgICAgICAgICAgICAgICBkY29sdW1uID0gVCwNCiMgICAgICAgICAgICAgICBpbmNsdWRlLmxyID0gRiwNCiMgICAgICAgICAgICAgICBjYXB0aW9uID0gIiIsIA0KIyAgICAgICAgICAgICAgIHN0YXIuc3ltYm9sID0gIlxcKiIsIA0KIyAgICAgICAgICAgICAgIGluY2x1ZGUucnNxdWFyZWQgPSBGLA0KIyAgICAgICAgICAgICAgIGluY2x1ZGUuYWRqcnMgPSBGLCANCiMgICAgICAgICAgICAgICBpbmNsdWRlLmNsdXN0ZXIgPSBULA0KIyAgICAgICAgICAgICAgIGluY2x1ZGUudmFyaWFuY2UgPSBGKQ0KDQojIG91dHB1dCByZXBsaWNhdGlvbiBhcmNoaXZlDQp0ZXhyZWc6Omh0bWxyZWcobW9kZWxfbGlzdCwNCiAgICAgICAgICAgICAgY3VzdG9tLmNvZWYubWFwID0gY29lZl9uYW1lX21hcCwgDQogICAgICAgICAgICAgIHN0YXJzID0gYygwLjAwMSwgMC4wMSwgMC4wNSwgMC4xKSwNCiAgICAgICAgICAgICAgc3ltYm9sID0gIisiLA0KICAgICAgICAgICAgICB0YWJsZSA9IEYsDQogICAgICAgICAgICAgIGJvb2t0YWJzID0gVCwNCiAgICAgICAgICAgICAgdXNlLnBhY2thZ2VzID0gRiwNCiAgICAgICAgICAgICAgY3VzdG9tLm1vZGVsLm5hbWVzID0gYygiKDEpIE5FTERBIiwgIigyKSBWLURlbSIpLA0KICAgICAgICAgICAgICBkY29sdW1uID0gVCwNCiAgICAgICAgICAgICAgaW5jbHVkZS5sciA9IEYsDQogICAgICAgICAgICAgIGNhcHRpb24gPSAiIiwgDQogICAgICAgICAgICAgIHN0YXIuc3ltYm9sID0gIlxcKiIsIA0KICAgICAgICAgICAgICBpbmNsdWRlLnJzcXVhcmVkID0gRiwNCiAgICAgICAgICAgICAgaW5jbHVkZS5hZGpycyA9IFQsIA0KICAgICAgICAgICAgICBpbmNsdWRlLmNsdXN0ZXIgPSBULA0KICAgICAgICAgICAgICBpbmNsdWRlLnZhcmlhbmNlID0gRikNCg0KYGBgDQoNCiMgU3VwcGxlbWVudDogU3RhdGEgY29kZSB0byBnZW5lcmF0ZSBGLVN0YXRpc3RpY3MgZm9yIElWLzJTTFMgbW9kZWxzDQpgYGB7ciwgZW5naW5lID0gInN0YXRhIiwgZXZhbCA9IEZ9DQoNCnVzZSAiLlxkYXRhXGl2ZWxlY3Rpb25zLmR0YSIsIHJlcGxhY2UNCg0KKmdlbiBhaWRfbG4gPSBsb2coYWlkZGF0YV9BaWRHRFApDQpnZW4gZ2RwX3BjX2xuID0gbG9nKGdkcF9wZXJfY2FwaXRhX3VuKQ0KZ2VuIGxuX3BvcCA9IGxvZyhwb3B1bGF0aW9uKQ0KDQpnZW4gY2FiWGFpZCA9IGNhYmluZXRJTkNfMTIgKiBhaWRfbG4NCmdlbiBjYWJYaW5zYWlkID0gY2FiaW5ldElOQ18xMiAqIGluc3RyX2FpZF9nZHANCg0KKiAyU0xTIGZvciBORUxEQSBlbGVjdGlvbiBxdWFsaXR5IHRvIGV4dHJhY3QgRi1TdGF0aXN0aWMNCml2cmVnMiBxdWFsaXR5IGNhYmluZXRJTkNfMTIgLy8vIA0Kbm9uc3RhdGUgV0JuYXRyZXMgZmggZ2RwX3BjX2xuIGxuX3BvcCBjb25mX2ludGVucyAoYWlkX2xuIGNhYlhhaWQgPSAgaW5zdHJfYWlkX2dkcCBjYWJYaW5zYWlkKSAsIGNsdXN0ZXIoY291bnRyeSkgZmZpcnN0DQoNCml2cmVnMiB2MnhlbF9mcmVmYWlyIGNhYmluZXRJTkNfMTIgLy8vIA0Kbm9uc3RhdGUgV0JuYXRyZXMgZmggZ2RwX3BjX2xuIGxuX3BvcCBjb25mX2ludGVucyAoYWlkX2xuIGNhYlhhaWQgPSAgaW5zdHJfYWlkX2dkcCBjYWJYaW5zYWlkKSAsIGNsdXN0ZXIoY291bnRyeSkgZmZpcnN0DQoNCg0KYGBgDQoNCg==