library(tidyverse)
library(targets)
library(ggdag)
library(dagitty)
library(here)

withr::with_dir(here::here(), {
  source(tar_read(plot_funs))
  source(tar_read(misc_funs))
})

update_geom_defaults(ggdag:::GeomDagText, list(family = "Noto Sans", face = "plain"))

my_seed <- 1234
set.seed(my_seed)

Full messy model

huge_messy_dag <- dagitty('
dag {
"Corruption[t-1]" [adjusted,pos="7.000,2.000"]
"Corruption[t-i]" [pos="2.000,2.000"]
"Corruption[t]" [pos="12.000,2.000"]
"Democracy[t-1]" [adjusted,pos="7.250,1.000"]
"Democracy[t-i]" [pos="2.250,1.000"]
"Democracy[t]" [pos="12.250,1.000"]
"Disasters[t-1]" [adjusted,pos="7.250,12.000"]
"Disasters[t-i]" [pos="2.250,12.000"]
"Disasters[t]" [pos="12.250,12.000"]
"Education[t-1]" [adjusted,pos="6.250,8.000"]
"Education[t-i]" [pos="1.250,8.000"]
"Education[t]" [pos="11.250,8.000"]
"GDP/capita[t-1]" [adjusted,pos="6.000,6.000"]
"GDP/capita[t-i]" [pos="1.000,6.000"]
"GDP/capita[t]" [pos="11.000,6.000"]
"Health[t-1]" [adjusted,pos="6.500,9.000"]
"Health[t-i]" [pos="1.500,9.000"]
"Health[t]" [pos="11.500,9.000"]
"Mortality[t-1]" [adjusted,pos="6.750,10.000"]
"Mortality[t-i]" [pos="1.750,10.000"]
"Mortality[t]" [pos="11.750,10.000"]
"Outcome[t-1]" [pos="9.000,6.500"]
"Outcome[t-i]" [pos="4.000,6.500"]
"Outcome[t]" [outcome,pos="14.000,6.500"]
"Restrictions[t-1]" [exposure,pos="8.000,7.750"]
"Restrictions[t-i]" [adjusted,pos="3.000,7.750"]
"Restrictions[t]" [pos="13.000,7.750"]
"Trade[t-1]" [adjusted,pos="6.000,7.000"]
"Trade[t-i]" [pos="1.000,7.000"]
"Trade[t]" [pos="11.000,7.000"]
"Violence[t-1]" [adjusted,pos="6.250,5.000"]
"Violence[t-i]" [pos="1.250,5.000"]
"Violence[t]" [pos="11.250,5.000"]
"`Civil liberties`[t-1]" [adjusted,pos="6.500,4.000"]
"`Civil liberties`[t-i]" [pos="1.500,4.000"]
"`Civil liberties`[t]" [pos="11.500,4.000"]
"`Internal conflict`[t-1]" [adjusted,pos="7.000,11.000"]
"`Internal conflict`[t-i]" [pos="2.000,11.000"]
"`Internal conflict`[t]" [pos="12.000,11.000"]
"`Rule of law`[t-1]" [adjusted,pos="6.750,3.000"]
"`Rule of law`[t-i]" [pos="1.750,3.000"]
"`Rule of law`[t]" [pos="11.750,3.000"]
"Corruption[t-1]" -> "Corruption[t]"
"Corruption[t-1]" -> "Outcome[t-1]"
"Corruption[t-1]" -> "Restrictions[t-1]"
"Corruption[t-i]" -> "Corruption[t-1]"
"Corruption[t-i]" -> "Outcome[t-i]"
"Corruption[t-i]" -> "Restrictions[t-i]"
"Corruption[t]" -> "Outcome[t]"
"Corruption[t]" -> "Restrictions[t]"
"Democracy[t-1]" -> "Corruption[t-1]"
"Democracy[t-1]" -> "Democracy[t]"
"Democracy[t-1]" -> "Outcome[t-1]"
"Democracy[t-1]" -> "Restrictions[t-1]"
"Democracy[t-1]" -> "`Rule of law`[t-1]"
"Democracy[t-i]" -> "Democracy[t-1]"
"Democracy[t-i]" -> "Outcome[t-i]"
"Democracy[t-i]" -> "Restrictions[t-i]"
"Democracy[t]" -> "Corruption[t]"
"Democracy[t]" -> "Outcome[t]"
"Democracy[t]" -> "Restrictions[t]"
"Democracy[t]" -> "`Rule of law`[t]"
"Disasters[t-1]" -> "Outcome[t-1]"
"Disasters[t-1]" -> "Restrictions[t-1]"
"Disasters[t-i]" -> "Outcome[t-i]"
"Disasters[t-i]" -> "Restrictions[t-i]"
"Disasters[t]" -> "Outcome[t]"
"Disasters[t]" -> "Restrictions[t]"
"Education[t-1]" -> "Education[t]"
"Education[t-1]" -> "Outcome[t-1]"
"Education[t-1]" -> "Restrictions[t-1]"
"Education[t-i]" -> "Education[t-1]"
"Education[t-i]" -> "Outcome[t-i]"
"Education[t-i]" -> "Restrictions[t-i]"
"Education[t]" -> "Outcome[t]"
"Education[t]" -> "Restrictions[t]"
"GDP/capita[t-1]" -> "GDP/capita[t]"
"GDP/capita[t-1]" -> "Outcome[t-1]"
"GDP/capita[t-1]" -> "Restrictions[t-1]"
"GDP/capita[t-i]" -> "GDP/capita[t-1]"
"GDP/capita[t-i]" -> "Outcome[t-i]"
"GDP/capita[t-i]" -> "Restrictions[t-i]"
"GDP/capita[t]" -> "Outcome[t]"
"GDP/capita[t]" -> "Restrictions[t]"
"Health[t-1]" -> "Health[t]"
"Health[t-1]" -> "Outcome[t-1]"
"Health[t-1]" -> "Restrictions[t-1]"
"Health[t-i]" -> "Health[t-1]"
"Health[t-i]" -> "Outcome[t-i]"
"Health[t-i]" -> "Restrictions[t-i]"
"Health[t]" -> "Outcome[t]"
"Health[t]" -> "Restrictions[t]"
"Mortality[t-1]" -> "Mortality[t]"
"Mortality[t-1]" -> "Outcome[t-1]"
"Mortality[t-1]" -> "Restrictions[t-1]"
"Mortality[t-i]" -> "Mortality[t-1]"
"Mortality[t-i]" -> "Outcome[t-i]"
"Mortality[t-i]" -> "Restrictions[t-i]"
"Mortality[t]" -> "Outcome[t]"
"Mortality[t]" -> "Restrictions[t]"
"Outcome[t-1]" -> "Outcome[t]"
"Outcome[t-i]" -> "Outcome[t-1]"
"Restrictions[t-1]" -> "Outcome[t-1]"
"Restrictions[t-1]" -> "Outcome[t]"
"Restrictions[t-1]" -> "Restrictions[t]"
"Restrictions[t-i]" -> "Outcome[t-1]"
"Restrictions[t-i]" -> "Outcome[t-i]"
"Restrictions[t-i]" -> "Restrictions[t-1]"
"Restrictions[t]" -> "Outcome[t]"
"Trade[t-1]" -> "Outcome[t-1]"
"Trade[t-1]" -> "Restrictions[t-1]"
"Trade[t-1]" -> "Trade[t]"
"Trade[t-i]" -> "Outcome[t-i]"
"Trade[t-i]" -> "Restrictions[t-i]"
"Trade[t-i]" -> "Trade[t-1]"
"Trade[t]" -> "GDP/capita[t]"
"Trade[t]" -> "Outcome[t]"
"Trade[t]" -> "Restrictions[t]"
"Violence[t-1]" -> "Outcome[t-1]"
"Violence[t-1]" -> "Restrictions[t-1]"
"Violence[t-1]" -> "Violence[t]"
"Violence[t-i]" -> "Outcome[t-i]"
"Violence[t-i]" -> "Restrictions[t-i]"
"Violence[t-i]" -> "Violence[t-1]"
"Violence[t]" -> "Outcome[t]"
"Violence[t]" -> "Restrictions[t]"
"`Civil liberties`[t-1]" -> "Outcome[t-1]"
"`Civil liberties`[t-1]" -> "Restrictions[t-1]"
"`Civil liberties`[t-1]" -> "`Civil liberties`[t]"
"`Civil liberties`[t-i]" -> "Outcome[t-i]"
"`Civil liberties`[t-i]" -> "Restrictions[t-i]"
"`Civil liberties`[t-i]" -> "`Civil liberties`[t-1]"
"`Civil liberties`[t]" -> "Outcome[t]"
"`Civil liberties`[t]" -> "Restrictions[t]"
"`Internal conflict`[t-1]" -> "Outcome[t-1]"
"`Internal conflict`[t-1]" -> "Restrictions[t-1]"
"`Internal conflict`[t-1]" -> "`Internal conflict`[t]"
"`Internal conflict`[t-i]" -> "Outcome[t-i]"
"`Internal conflict`[t-i]" -> "Restrictions[t-i]"
"`Internal conflict`[t-i]" -> "`Internal conflict`[t-1]"
"`Internal conflict`[t]" -> "Outcome[t]"
"`Internal conflict`[t]" -> "Restrictions[t]"
"`Rule of law`[t-1]" -> "Outcome[t-1]"
"`Rule of law`[t-1]" -> "Restrictions[t-1]"
"`Rule of law`[t-1]" -> "`Rule of law`[t]"
"`Rule of law`[t-i]" -> "Outcome[t-i]"
"`Rule of law`[t-i]" -> "Restrictions[t-i]"
"`Rule of law`[t-i]" -> "`Rule of law`[t-1]"
"`Rule of law`[t]" -> "Outcome[t]"
"`Rule of law`[t]" -> "Restrictions[t]"
}
')

huge_messy_dag_plot <- huge_messy_dag %>% 
  tidy_dagitty() %>% 
  mutate(var_type = case_when(
    str_detect(name, "Outcome") ~ "Outcome",
    str_detect(name, "Restrictions") ~ "Restrictions",
    TRUE ~ "Z"
  )) %>% 
  mutate(time_period = case_when(
    str_detect(name, "t-1") ~ 2,
    str_detect(name, "t-i") ~ 1,
    TRUE ~ 3
  )) %>% 
  mutate(arrow_color = case_when(
    name == "Restrictions[t-1]" & to == "Outcome[t]" ~ "#FF4136",
    TRUE ~ "grey60"
  ))

ggplot(huge_messy_dag_plot, aes(x = x, y = y, xend = xend, yend = yend)) +
  geom_dag_edges(aes(edge_colour = arrow_color)) +
  geom_dag_point(aes(color = var_type, alpha = time_period), size = 12) +
  geom_dag_text(data = filter(huge_messy_dag_plot, var_type == "Outcome"),
                color = "black", size = pts(9), parse = TRUE) +
  geom_dag_text(data = filter(huge_messy_dag_plot, var_type == "Restrictions"),
                color = "black", size = pts(9), parse = TRUE) +
  geom_dag_text(data = filter(huge_messy_dag_plot, var_type == "Z"),
                color = "black", size = pts(9), parse = TRUE) +
  scale_color_manual(values = c("#B10DC9", "#FF851B", "grey60")) +
  scale_y_reverse() +
  guides(alpha = FALSE, color = FALSE) +
  theme_dag()

Simpler model with families of confounders

simplerish_dag <- dagitty('
dag {
"`Human rights & politics`[t-1]" [adjusted,pos="5,1.5"]
"`Human rights & politics`[t-i]" [pos="1,1.5"]
"`Human rights & politics`[t]" [pos="9,1.5"]
"`Economics & development`[t-1]" [adjusted,pos="5,2.5"]
"`Economics & development`[t-i]" [pos="1,2.5"]
"`Economics & development`[t]" [pos="9,2.5"]
"Outcome[t-1]" [pos="6.5,1.75"]
"Outcome[t-i]" [adjusted,pos="2.5,1.75"]
"Outcome[t]" [outcome,pos="10.5,1.75"]
"Restrictions[t-1]" [exposure,pos="6,2.25"]
"Restrictions[t-i]" [adjusted,pos="2,2.25"]
"Restrictions[t]" [pos="10,2.25"]
"`Unexpected shocks`[t-1]" [adjusted,pos="5,2"]
"`Unexpected shocks`[t-i]" [pos="1,2"]
"`Unexpected shocks`[t]" [pos="9,2"]
"`Human rights & politics`[t-1]" -> "`Human rights & politics`[t]"
"`Human rights & politics`[t-1]" -> "Outcome[t-1]"
"`Human rights & politics`[t-1]" -> "Restrictions[t-1]"
"`Human rights & politics`[t-1]" -> "Restrictions[t]"
"`Human rights & politics`[t-i]" -> "`Human rights & politics`[t-1]"
"`Human rights & politics`[t-i]" -> "Outcome[t-i]"
"`Human rights & politics`[t-i]" -> "Restrictions[t-i]"
"`Human rights & politics`[t]" -> "Outcome[t]"
"`Human rights & politics`[t]" -> "Restrictions[t]"
"`Economics & development`[t-1]" -> "`Economics & development`[t]"
"`Economics & development`[t-1]" -> "Outcome[t-1]"
"`Economics & development`[t-1]" -> "Restrictions[t-1]"
"`Economics & development`[t-1]" -> "Restrictions[t]"
"`Economics & development`[t-i]" -> "`Economics & development`[t-1]"
"`Economics & development`[t-i]" -> "Outcome[t-i]"
"`Economics & development`[t-i]" -> "Restrictions[t-i]"
"`Economics & development`[t]" -> "Outcome[t]"
"`Economics & development`[t]" -> "Restrictions[t]"
"Outcome[t-1]" -> "Outcome[t]"
"Outcome[t-1]" -> "Restrictions[t]"
"Outcome[t-i]" -> "Outcome[t-1]"
"Outcome[t-i]" -> "Restrictions[t-1]"
"Restrictions[t]" -> "Outcome[t]"
"Restrictions[t-1]" -> "Outcome[t-1]"
"Restrictions[t-i]" -> "Outcome[t-i]"
"Restrictions[t-1]" -> "Outcome[t]"
"Restrictions[t-1]" -> "Restrictions[t]"
"Restrictions[t-i]" -> "Outcome[t-1]"
"Restrictions[t-i]" -> "Restrictions[t-1]"
"`Unexpected shocks`[t-1]" -> "Outcome[t-1]"
"`Unexpected shocks`[t-1]" -> "Restrictions[t-1]"
"`Unexpected shocks`[t-1]" -> "Restrictions[t]"
"`Unexpected shocks`[t-1]" -> "`Unexpected shocks`[t]"
"`Unexpected shocks`[t-i]" -> "Outcome[t-i]"
"`Unexpected shocks`[t-i]" -> "Restrictions[t-i]"
"`Unexpected shocks`[t-i]" -> "`Unexpected shocks`[t-1]"
"`Unexpected shocks`[t]" -> "Outcome[t]"
"`Unexpected shocks`[t]" -> "Restrictions[t]"
}
')

simplerish_dag_plot <- simplerish_dag %>% 
  tidy_dagitty() %>% 
  mutate(var_type = case_when(
    str_detect(name, "Outcome") ~ "Outcome",
    str_detect(name, "Restrictions") ~ "Restrictions",
    TRUE ~ "Z"
  )) %>% 
  mutate(time_period = case_when(
    str_detect(name, "t-1") ~ 2,
    str_detect(name, "t-i") ~ 1,
    TRUE ~ 3
  )) %>% 
  mutate(arrow_color = case_when(
    name == "Restrictions[t-1]" & to == "Outcome[t]" ~ "#FF4136",
    TRUE ~ "grey60"
  ))

ggplot(simplerish_dag_plot, aes(x = x, y = y, xend = xend, yend = yend)) +
  geom_dag_edges(aes(edge_colour = arrow_color)) +
  geom_dag_point(aes(color = var_type, alpha = time_period), size = 12) +
  geom_dag_text(data = filter(simplerish_dag_plot, var_type == "Outcome"),
                color = "black", size = pts(9), parse = TRUE) +
  geom_dag_text(data = filter(simplerish_dag_plot, var_type == "Restrictions"),
                color = "black", size = pts(9), parse = TRUE) +
  geom_dag_text(data = filter(simplerish_dag_plot, var_type == "Z"),
                color = "black", size = pts(9), parse = TRUE) +
  scale_color_manual(values = c("#B10DC9", "#FF851B", "grey60")) +
  scale_y_reverse() +
  guides(alpha = FALSE, color = FALSE) +
  theme_dag()

Simplest model

simple_dag <- dagitty('
dag {
"Outcome[t-i]" [pos="1.5,2"]
"Outcome[t-1]" [pos="3.5,2"]
"Outcome[t]" [outcome,pos="6,2"]
"Restrictions[t-i]" [pos="1,1"]
"Restrictions[t-1]" [exposure,pos="3,1"]
"Restrictions[t]" [pos="5,1"]
"Z[t-i]" [pos="1,3"]
"Z[t-1]" [pos="3,3"]
"Z[t]" [pos="5,3"]
"Outcome[t-1]" -> "Outcome[t]"
"Outcome[t-1]" -> "Restrictions[t]"
"Outcome[t-i]" -> "Outcome[t-1]"
"Outcome[t-i]" -> "Restrictions[t-1]"
"Restrictions[t]" -> "Outcome[t]"
"Restrictions[t-1]" -> "Outcome[t-1]"
"Restrictions[t-i]" -> "Outcome[t-i]"
"Restrictions[t-1]" -> "Outcome[t]"
"Restrictions[t-1]" -> "Restrictions[t]"
"Restrictions[t-i]" -> "Outcome[t-1]"
"Restrictions[t-i]" -> "Restrictions[t-1]"
"Z[t-1]" -> "Outcome[t-1]"
"Z[t-1]" -> "Restrictions[t-1]"
"Z[t-1]" -> "Restrictions[t]"
"Z[t-1]" -> "Z[t]"
"Z[t-i]" -> "Outcome[t-i]"
"Z[t-i]" -> "Restrictions[t-1]"
"Z[t-i]" -> "Restrictions[t-i]"
"Z[t-i]" -> "Z[t-1]"
"Z[t]" -> "Outcome[t]"
"Z[t]" -> "Restrictions[t]"
}
') 

simple_dag_plot <- simple_dag %>% 
  tidy_dagitty() %>% 
  mutate(var_type = case_when(
    str_detect(name, "Outcome") ~ "Outcome",
    str_detect(name, "Restrictions") ~ "Restrictions",
    str_detect(name, "Z") ~ "Z"
  )) %>% 
  mutate(time_period = case_when(
    str_detect(name, "t-1") ~ 2,
    str_detect(name, "t-i") ~ 1,
    TRUE ~ 3
  )) %>% 
  mutate(arrow_color = case_when(
    name == "Restrictions[t-1]" & to == "Outcome[t]" ~ "#FF4136",
    TRUE ~ "grey60"
  )) %>% 
  mutate(letter_only = case_when(
    str_detect(name, "Outcome") ~ str_replace(name, "Outcome", "Y"),
    str_detect(name, "Restrictions") ~ str_replace(name, "Restrictions", "X"),
    TRUE ~ name
  ))

simple_dag_out <- ggplot(simple_dag_plot, aes(x = x, y = y, xend = xend, yend = yend)) +
  geom_dag_edges(aes(edge_colour = arrow_color)) +
  geom_dag_point(aes(color = var_type, alpha = time_period), size = 12) +
  geom_dag_text(data = filter(simple_dag_plot, var_type == "Outcome"),
                color = "black", size = pts(11), parse = TRUE, 
                nudge_y = 0.2, nudge_x = 0.3) +
  geom_dag_text(data = filter(simple_dag_plot, var_type == "Restrictions"),
                color = "black", size = pts(11), parse = TRUE, 
                nudge_y = -0.25) +
  geom_dag_text(data = filter(simple_dag_plot, var_type == "Z"),
                color = "black", size = pts(11), parse = TRUE,
                nudge_y = 0) +
  scale_color_manual(values = c("#B10DC9", "#FF851B", "grey60")) +
  guides(alpha = FALSE, color = FALSE) +
  theme_dag()
simple_dag_out

simple_dag_letters_out <- ggplot(simple_dag_plot, aes(x = x, y = y, xend = xend, yend = yend)) +
  geom_dag_edges(aes(edge_colour = arrow_color)) +
  geom_dag_point(aes(color = var_type, alpha = time_period), size = 12) +
  geom_dag_text(aes(label = letter_only),
                color = "black", size = pts(11), parse = TRUE) +
  scale_color_manual(values = c("#B10DC9", "#FF851B", "grey60")) +
  guides(alpha = FALSE, color = FALSE) +
  theme_dag()
simple_dag_letters_out

ggsave(here("analysis", "output", "dag_simple_letters.pdf"), simple_dag_letters_out,
       width = 7, height = 3.75, device = cairo_pdf)
ggsave(here("analysis", "output", "dag_simple_letters.png"), simple_dag_letters_out,
       width = 7, height = 3.75, dpi = 300, type = "cairo")

Adjustment sets

These DAGs are complex—especially the one with every possible node. However, they have important analytical value. We cannot randomly assign countries to impose anti-NGO laws or restrict the environment for civil society—doing that is completely infeasable (and unethical!). This means that we cannot use experimental data to measure the causal effect of anti-NGO restrictions on foreign aid, or \(E[\text{Aid} \mid do(\text{Restrictions})]\). We also don’t have any quasi-experimental situations that would allow for context-based identification of the effect of restrictions on aid.

Simply measuring \(E[\text{Aid} \mid \text{Restrictions}]\) is trivial—just run lm(aid ~ restrictions) and look at the coefficient. However, this estimate cannot be interpreted in any sort of causal way, since correlation is not causation. Using the logic of do-calculus, we can actually use the relationships between the nodes in the DAG to transform \(E[\text{Aid} \mid do(\text{Restrictions})]\) into a do-free expression by making statistical adjustments and closing backdoor pathways that open up spurious relationships between restrictions and aid. As long as we can find a minimally sufficient adjustment set—or a set of nodes or variables that need to be adjusted in order to ensure that restrictions is d-separated from aid—we can isolate and identify the causal link between restrictions and aid.

Rather than go through the complex math behind the three rules of do-calculus, we can use R (or dagitty.net) to identify minimal sufficient adjustment sets based on the three DAGs above.

  • Huge complicated DAG:

    huge_messy_dag %>%
      adjustmentSets()
    ## { Corruption[t-1], Democracy[t-1], Disasters[t-1], Education[t-1],
    ##   GDP/capita[t-1], Health[t-1], Mortality[t-1], Restrictions[t-i], Trade[t-1],
    ##   Violence[t-1], `Civil liberties`[t-1], `Internal conflict`[t-1], `Rule of
    ##   law`[t-1] }
  • Simpler-ish DAG:

    simplerish_dag %>%
      adjustmentSets()
    ## { Outcome[t-i], Restrictions[t-i], `Economics & development`[t-1], `Human rights
    ##   & politics`[t-1], `Unexpected shocks`[t-1] }
  • Simple DAG:

    simple_dag %>%
      adjustmentSets()
    ## { Outcome[t-i], Restrictions[t-i], Z[t-1] }

 

In other words, if we want to isolate the causal effect of anti-NGO restrictions in time \(t\) on aid in time \(t+1\) (i.e. the effect of lagged restrictions), we need to adjust for lagged aid (\(t-1\)), lagged restrictions (\(t-1\)), and time-varying confounders (\(t\)).

Fortunately, marginal structural models allow us to make all of these adjustments using special inverse probability weights that take this lagging structure and treatment history into account.

\[ \text{Continuous stabilized IPW}_{it} = \prod^t_{t = 1} \frac{f_{X | \bar{X}, V}[(X_{it} | \bar{X}_{i, t-1}, V_i); \mu_1, \sigma^2_1]}{f_{X | \bar{X}, Y, Z, V}[(X_{it} | \bar{X}_{i, t-1}, Y_{i, t-1}, Z_{it}, V_i), \mu_2, \sigma^2_2]} \]

  • The numerator contains the probability of the observed treatment status (\(X_{it}\)) at each time given the previous history of treatment (\(\bar{X}_{i, t-1}\)) and time invariant confounders (\(V_i\)).
  • The denominator contains the probability of the observed treatment status (\(X_{it}\)) at each time given the previous history of treatment (\(\bar{X}_{i, t-1}\)), previous outcome (\(Y_{i, t-1}\)), time varying confounders (\(Z_{it}\)), and time invariant confounders (\(V_i\)).
  • These two probability distributions have a mean of \(\mu_{1, 2}\) and variance of \(\sigma^2_{1, 2}\).

Finally, these weights are used in an outcome model similar to this:

lm(outcome ~ lag_treatment, weights = ipw)

Doing this process closes the backdoor pathways between lagged restrictions and present aid and is theoretically sufficient for isolating the causal link between the two.

Final variables to use

Based on these DAGs, here are the variables we use in our treatment and outcome models:

  • Outcome
    • H1: log aid in \(t\) (total_oda_lead and total_oda_log_lead)
    • H2: proportion of aid given for contentious causes in \(t\) (prop_contentious)
    • H3: proportion of aid given to domestic/international NGOS in \(t\) (prop_ngo_dom and prop_ngo_foreign)
  • Treatment
    • Anti-civil society laws and general restrictive environment in \(t-1\) (barriers_total and v2xcs_ccsi)
  • Time-varying confounders (all in \(t-1\))
    • Human rights and politics
      • Electoral democracy: v2x_polyarchy
      • Corruption: v2x_corr
      • Rule of law: v2x_rule
      • Civil liberties index: v2x_civlib
      • Physical violence index: v2x_clphy
      • Private civil liberties index: v2x_clpriv
    • Economics and development
      • Wealth: gdpcap_log
      • International trade: un_trade_pct_gdp
      • Educational equality: v2peedueq
      • Health equality: v2pehealth
      • Infant mortality rate: e_peinfmor
    • Unexpected shocks
      • Internal conflict: internal_conflict_past_5
      • Natural disasters: natural_dis_count
  • Time-invarying confounders
    • Country code included as multilevel random effects((1 | gwcode))
LS0tCnRpdGxlOiAiQ2F1c2FsIG1vZGVsIGFuZCB0aGVvcnkiCmF1dGhvcjogIlN1cGFybmEgQ2hhdWRocnkgYW5kIEFuZHJldyBIZWlzcyIKZGF0ZTogImByIGZvcm1hdChTeXMudGltZSgpLCAnJUYnKWAiCmVkaXRvcl9vcHRpb25zOiAKICBjaHVua19vdXRwdXRfdHlwZTogY29uc29sZQotLS0KCmBgYHtyIHNldHVwLCBpbmNsdWRlPUZBTFNFfQprbml0cjo6b3B0c19jaHVuayRzZXQoZmlnLnJldGluYSA9IDMsCiAgICAgICAgICAgICAgICAgICAgICB0aWR5Lm9wdHMgPSBsaXN0KHdpZHRoLmN1dG9mZiA9IDEyMCksICAjIEZvciBjb2RlCiAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zKHdpZHRoID0gOTApLCAgIyBGb3Igb3V0cHV0CiAgICAgICAgICAgICAgICAgICAgICBmaWcuYXNwID0gMC42MTgsIGZpZy53aWR0aCA9IDcsIAogICAgICAgICAgICAgICAgICAgICAgZmlnLmFsaWduID0gImNlbnRlciIsIG91dC53aWR0aCA9ICIxMDAlIikKCm9wdGlvbnMoZHBseXIuc3VtbWFyaXNlLmluZm9ybSA9IEZBTFNFKQpgYGAKCmBgYHtyIGxvYWQtbGlicmFyaWVzLCB3YXJuaW5nPUZBTFNFLCBtZXNzYWdlPUZBTFNFfQpsaWJyYXJ5KHRpZHl2ZXJzZSkKbGlicmFyeSh0YXJnZXRzKQpsaWJyYXJ5KGdnZGFnKQpsaWJyYXJ5KGRhZ2l0dHkpCmxpYnJhcnkoaGVyZSkKCndpdGhyOjp3aXRoX2RpcihoZXJlOjpoZXJlKCksIHsKICBzb3VyY2UodGFyX3JlYWQocGxvdF9mdW5zKSkKICBzb3VyY2UodGFyX3JlYWQobWlzY19mdW5zKSkKfSkKCnVwZGF0ZV9nZW9tX2RlZmF1bHRzKGdnZGFnOjo6R2VvbURhZ1RleHQsIGxpc3QoZmFtaWx5ID0gIk5vdG8gU2FucyIsIGZhY2UgPSAicGxhaW4iKSkKCm15X3NlZWQgPC0gMTIzNApzZXQuc2VlZChteV9zZWVkKQpgYGAKCgojIEZ1bGwgbWVzc3kgbW9kZWwKCmBgYHtyIGZ1bGwtZ2lhbnQtZGFnLCBmaWcud2lkdGg9MTAsIGZpZy5oZWlnaHQ9NywgZmlnLmFzcD1OVUxMfQpodWdlX21lc3N5X2RhZyA8LSBkYWdpdHR5KCcKZGFnIHsKIkNvcnJ1cHRpb25bdC0xXSIgW2FkanVzdGVkLHBvcz0iNy4wMDAsMi4wMDAiXQoiQ29ycnVwdGlvblt0LWldIiBbcG9zPSIyLjAwMCwyLjAwMCJdCiJDb3JydXB0aW9uW3RdIiBbcG9zPSIxMi4wMDAsMi4wMDAiXQoiRGVtb2NyYWN5W3QtMV0iIFthZGp1c3RlZCxwb3M9IjcuMjUwLDEuMDAwIl0KIkRlbW9jcmFjeVt0LWldIiBbcG9zPSIyLjI1MCwxLjAwMCJdCiJEZW1vY3JhY3lbdF0iIFtwb3M9IjEyLjI1MCwxLjAwMCJdCiJEaXNhc3RlcnNbdC0xXSIgW2FkanVzdGVkLHBvcz0iNy4yNTAsMTIuMDAwIl0KIkRpc2FzdGVyc1t0LWldIiBbcG9zPSIyLjI1MCwxMi4wMDAiXQoiRGlzYXN0ZXJzW3RdIiBbcG9zPSIxMi4yNTAsMTIuMDAwIl0KIkVkdWNhdGlvblt0LTFdIiBbYWRqdXN0ZWQscG9zPSI2LjI1MCw4LjAwMCJdCiJFZHVjYXRpb25bdC1pXSIgW3Bvcz0iMS4yNTAsOC4wMDAiXQoiRWR1Y2F0aW9uW3RdIiBbcG9zPSIxMS4yNTAsOC4wMDAiXQoiR0RQL2NhcGl0YVt0LTFdIiBbYWRqdXN0ZWQscG9zPSI2LjAwMCw2LjAwMCJdCiJHRFAvY2FwaXRhW3QtaV0iIFtwb3M9IjEuMDAwLDYuMDAwIl0KIkdEUC9jYXBpdGFbdF0iIFtwb3M9IjExLjAwMCw2LjAwMCJdCiJIZWFsdGhbdC0xXSIgW2FkanVzdGVkLHBvcz0iNi41MDAsOS4wMDAiXQoiSGVhbHRoW3QtaV0iIFtwb3M9IjEuNTAwLDkuMDAwIl0KIkhlYWx0aFt0XSIgW3Bvcz0iMTEuNTAwLDkuMDAwIl0KIk1vcnRhbGl0eVt0LTFdIiBbYWRqdXN0ZWQscG9zPSI2Ljc1MCwxMC4wMDAiXQoiTW9ydGFsaXR5W3QtaV0iIFtwb3M9IjEuNzUwLDEwLjAwMCJdCiJNb3J0YWxpdHlbdF0iIFtwb3M9IjExLjc1MCwxMC4wMDAiXQoiT3V0Y29tZVt0LTFdIiBbcG9zPSI5LjAwMCw2LjUwMCJdCiJPdXRjb21lW3QtaV0iIFtwb3M9IjQuMDAwLDYuNTAwIl0KIk91dGNvbWVbdF0iIFtvdXRjb21lLHBvcz0iMTQuMDAwLDYuNTAwIl0KIlJlc3RyaWN0aW9uc1t0LTFdIiBbZXhwb3N1cmUscG9zPSI4LjAwMCw3Ljc1MCJdCiJSZXN0cmljdGlvbnNbdC1pXSIgW2FkanVzdGVkLHBvcz0iMy4wMDAsNy43NTAiXQoiUmVzdHJpY3Rpb25zW3RdIiBbcG9zPSIxMy4wMDAsNy43NTAiXQoiVHJhZGVbdC0xXSIgW2FkanVzdGVkLHBvcz0iNi4wMDAsNy4wMDAiXQoiVHJhZGVbdC1pXSIgW3Bvcz0iMS4wMDAsNy4wMDAiXQoiVHJhZGVbdF0iIFtwb3M9IjExLjAwMCw3LjAwMCJdCiJWaW9sZW5jZVt0LTFdIiBbYWRqdXN0ZWQscG9zPSI2LjI1MCw1LjAwMCJdCiJWaW9sZW5jZVt0LWldIiBbcG9zPSIxLjI1MCw1LjAwMCJdCiJWaW9sZW5jZVt0XSIgW3Bvcz0iMTEuMjUwLDUuMDAwIl0KImBDaXZpbCBsaWJlcnRpZXNgW3QtMV0iIFthZGp1c3RlZCxwb3M9IjYuNTAwLDQuMDAwIl0KImBDaXZpbCBsaWJlcnRpZXNgW3QtaV0iIFtwb3M9IjEuNTAwLDQuMDAwIl0KImBDaXZpbCBsaWJlcnRpZXNgW3RdIiBbcG9zPSIxMS41MDAsNC4wMDAiXQoiYEludGVybmFsIGNvbmZsaWN0YFt0LTFdIiBbYWRqdXN0ZWQscG9zPSI3LjAwMCwxMS4wMDAiXQoiYEludGVybmFsIGNvbmZsaWN0YFt0LWldIiBbcG9zPSIyLjAwMCwxMS4wMDAiXQoiYEludGVybmFsIGNvbmZsaWN0YFt0XSIgW3Bvcz0iMTIuMDAwLDExLjAwMCJdCiJgUnVsZSBvZiBsYXdgW3QtMV0iIFthZGp1c3RlZCxwb3M9IjYuNzUwLDMuMDAwIl0KImBSdWxlIG9mIGxhd2BbdC1pXSIgW3Bvcz0iMS43NTAsMy4wMDAiXQoiYFJ1bGUgb2YgbGF3YFt0XSIgW3Bvcz0iMTEuNzUwLDMuMDAwIl0KIkNvcnJ1cHRpb25bdC0xXSIgLT4gIkNvcnJ1cHRpb25bdF0iCiJDb3JydXB0aW9uW3QtMV0iIC0+ICJPdXRjb21lW3QtMV0iCiJDb3JydXB0aW9uW3QtMV0iIC0+ICJSZXN0cmljdGlvbnNbdC0xXSIKIkNvcnJ1cHRpb25bdC1pXSIgLT4gIkNvcnJ1cHRpb25bdC0xXSIKIkNvcnJ1cHRpb25bdC1pXSIgLT4gIk91dGNvbWVbdC1pXSIKIkNvcnJ1cHRpb25bdC1pXSIgLT4gIlJlc3RyaWN0aW9uc1t0LWldIgoiQ29ycnVwdGlvblt0XSIgLT4gIk91dGNvbWVbdF0iCiJDb3JydXB0aW9uW3RdIiAtPiAiUmVzdHJpY3Rpb25zW3RdIgoiRGVtb2NyYWN5W3QtMV0iIC0+ICJDb3JydXB0aW9uW3QtMV0iCiJEZW1vY3JhY3lbdC0xXSIgLT4gIkRlbW9jcmFjeVt0XSIKIkRlbW9jcmFjeVt0LTFdIiAtPiAiT3V0Y29tZVt0LTFdIgoiRGVtb2NyYWN5W3QtMV0iIC0+ICJSZXN0cmljdGlvbnNbdC0xXSIKIkRlbW9jcmFjeVt0LTFdIiAtPiAiYFJ1bGUgb2YgbGF3YFt0LTFdIgoiRGVtb2NyYWN5W3QtaV0iIC0+ICJEZW1vY3JhY3lbdC0xXSIKIkRlbW9jcmFjeVt0LWldIiAtPiAiT3V0Y29tZVt0LWldIgoiRGVtb2NyYWN5W3QtaV0iIC0+ICJSZXN0cmljdGlvbnNbdC1pXSIKIkRlbW9jcmFjeVt0XSIgLT4gIkNvcnJ1cHRpb25bdF0iCiJEZW1vY3JhY3lbdF0iIC0+ICJPdXRjb21lW3RdIgoiRGVtb2NyYWN5W3RdIiAtPiAiUmVzdHJpY3Rpb25zW3RdIgoiRGVtb2NyYWN5W3RdIiAtPiAiYFJ1bGUgb2YgbGF3YFt0XSIKIkRpc2FzdGVyc1t0LTFdIiAtPiAiT3V0Y29tZVt0LTFdIgoiRGlzYXN0ZXJzW3QtMV0iIC0+ICJSZXN0cmljdGlvbnNbdC0xXSIKIkRpc2FzdGVyc1t0LWldIiAtPiAiT3V0Y29tZVt0LWldIgoiRGlzYXN0ZXJzW3QtaV0iIC0+ICJSZXN0cmljdGlvbnNbdC1pXSIKIkRpc2FzdGVyc1t0XSIgLT4gIk91dGNvbWVbdF0iCiJEaXNhc3RlcnNbdF0iIC0+ICJSZXN0cmljdGlvbnNbdF0iCiJFZHVjYXRpb25bdC0xXSIgLT4gIkVkdWNhdGlvblt0XSIKIkVkdWNhdGlvblt0LTFdIiAtPiAiT3V0Y29tZVt0LTFdIgoiRWR1Y2F0aW9uW3QtMV0iIC0+ICJSZXN0cmljdGlvbnNbdC0xXSIKIkVkdWNhdGlvblt0LWldIiAtPiAiRWR1Y2F0aW9uW3QtMV0iCiJFZHVjYXRpb25bdC1pXSIgLT4gIk91dGNvbWVbdC1pXSIKIkVkdWNhdGlvblt0LWldIiAtPiAiUmVzdHJpY3Rpb25zW3QtaV0iCiJFZHVjYXRpb25bdF0iIC0+ICJPdXRjb21lW3RdIgoiRWR1Y2F0aW9uW3RdIiAtPiAiUmVzdHJpY3Rpb25zW3RdIgoiR0RQL2NhcGl0YVt0LTFdIiAtPiAiR0RQL2NhcGl0YVt0XSIKIkdEUC9jYXBpdGFbdC0xXSIgLT4gIk91dGNvbWVbdC0xXSIKIkdEUC9jYXBpdGFbdC0xXSIgLT4gIlJlc3RyaWN0aW9uc1t0LTFdIgoiR0RQL2NhcGl0YVt0LWldIiAtPiAiR0RQL2NhcGl0YVt0LTFdIgoiR0RQL2NhcGl0YVt0LWldIiAtPiAiT3V0Y29tZVt0LWldIgoiR0RQL2NhcGl0YVt0LWldIiAtPiAiUmVzdHJpY3Rpb25zW3QtaV0iCiJHRFAvY2FwaXRhW3RdIiAtPiAiT3V0Y29tZVt0XSIKIkdEUC9jYXBpdGFbdF0iIC0+ICJSZXN0cmljdGlvbnNbdF0iCiJIZWFsdGhbdC0xXSIgLT4gIkhlYWx0aFt0XSIKIkhlYWx0aFt0LTFdIiAtPiAiT3V0Y29tZVt0LTFdIgoiSGVhbHRoW3QtMV0iIC0+ICJSZXN0cmljdGlvbnNbdC0xXSIKIkhlYWx0aFt0LWldIiAtPiAiSGVhbHRoW3QtMV0iCiJIZWFsdGhbdC1pXSIgLT4gIk91dGNvbWVbdC1pXSIKIkhlYWx0aFt0LWldIiAtPiAiUmVzdHJpY3Rpb25zW3QtaV0iCiJIZWFsdGhbdF0iIC0+ICJPdXRjb21lW3RdIgoiSGVhbHRoW3RdIiAtPiAiUmVzdHJpY3Rpb25zW3RdIgoiTW9ydGFsaXR5W3QtMV0iIC0+ICJNb3J0YWxpdHlbdF0iCiJNb3J0YWxpdHlbdC0xXSIgLT4gIk91dGNvbWVbdC0xXSIKIk1vcnRhbGl0eVt0LTFdIiAtPiAiUmVzdHJpY3Rpb25zW3QtMV0iCiJNb3J0YWxpdHlbdC1pXSIgLT4gIk1vcnRhbGl0eVt0LTFdIgoiTW9ydGFsaXR5W3QtaV0iIC0+ICJPdXRjb21lW3QtaV0iCiJNb3J0YWxpdHlbdC1pXSIgLT4gIlJlc3RyaWN0aW9uc1t0LWldIgoiTW9ydGFsaXR5W3RdIiAtPiAiT3V0Y29tZVt0XSIKIk1vcnRhbGl0eVt0XSIgLT4gIlJlc3RyaWN0aW9uc1t0XSIKIk91dGNvbWVbdC0xXSIgLT4gIk91dGNvbWVbdF0iCiJPdXRjb21lW3QtaV0iIC0+ICJPdXRjb21lW3QtMV0iCiJSZXN0cmljdGlvbnNbdC0xXSIgLT4gIk91dGNvbWVbdC0xXSIKIlJlc3RyaWN0aW9uc1t0LTFdIiAtPiAiT3V0Y29tZVt0XSIKIlJlc3RyaWN0aW9uc1t0LTFdIiAtPiAiUmVzdHJpY3Rpb25zW3RdIgoiUmVzdHJpY3Rpb25zW3QtaV0iIC0+ICJPdXRjb21lW3QtMV0iCiJSZXN0cmljdGlvbnNbdC1pXSIgLT4gIk91dGNvbWVbdC1pXSIKIlJlc3RyaWN0aW9uc1t0LWldIiAtPiAiUmVzdHJpY3Rpb25zW3QtMV0iCiJSZXN0cmljdGlvbnNbdF0iIC0+ICJPdXRjb21lW3RdIgoiVHJhZGVbdC0xXSIgLT4gIk91dGNvbWVbdC0xXSIKIlRyYWRlW3QtMV0iIC0+ICJSZXN0cmljdGlvbnNbdC0xXSIKIlRyYWRlW3QtMV0iIC0+ICJUcmFkZVt0XSIKIlRyYWRlW3QtaV0iIC0+ICJPdXRjb21lW3QtaV0iCiJUcmFkZVt0LWldIiAtPiAiUmVzdHJpY3Rpb25zW3QtaV0iCiJUcmFkZVt0LWldIiAtPiAiVHJhZGVbdC0xXSIKIlRyYWRlW3RdIiAtPiAiR0RQL2NhcGl0YVt0XSIKIlRyYWRlW3RdIiAtPiAiT3V0Y29tZVt0XSIKIlRyYWRlW3RdIiAtPiAiUmVzdHJpY3Rpb25zW3RdIgoiVmlvbGVuY2VbdC0xXSIgLT4gIk91dGNvbWVbdC0xXSIKIlZpb2xlbmNlW3QtMV0iIC0+ICJSZXN0cmljdGlvbnNbdC0xXSIKIlZpb2xlbmNlW3QtMV0iIC0+ICJWaW9sZW5jZVt0XSIKIlZpb2xlbmNlW3QtaV0iIC0+ICJPdXRjb21lW3QtaV0iCiJWaW9sZW5jZVt0LWldIiAtPiAiUmVzdHJpY3Rpb25zW3QtaV0iCiJWaW9sZW5jZVt0LWldIiAtPiAiVmlvbGVuY2VbdC0xXSIKIlZpb2xlbmNlW3RdIiAtPiAiT3V0Y29tZVt0XSIKIlZpb2xlbmNlW3RdIiAtPiAiUmVzdHJpY3Rpb25zW3RdIgoiYENpdmlsIGxpYmVydGllc2BbdC0xXSIgLT4gIk91dGNvbWVbdC0xXSIKImBDaXZpbCBsaWJlcnRpZXNgW3QtMV0iIC0+ICJSZXN0cmljdGlvbnNbdC0xXSIKImBDaXZpbCBsaWJlcnRpZXNgW3QtMV0iIC0+ICJgQ2l2aWwgbGliZXJ0aWVzYFt0XSIKImBDaXZpbCBsaWJlcnRpZXNgW3QtaV0iIC0+ICJPdXRjb21lW3QtaV0iCiJgQ2l2aWwgbGliZXJ0aWVzYFt0LWldIiAtPiAiUmVzdHJpY3Rpb25zW3QtaV0iCiJgQ2l2aWwgbGliZXJ0aWVzYFt0LWldIiAtPiAiYENpdmlsIGxpYmVydGllc2BbdC0xXSIKImBDaXZpbCBsaWJlcnRpZXNgW3RdIiAtPiAiT3V0Y29tZVt0XSIKImBDaXZpbCBsaWJlcnRpZXNgW3RdIiAtPiAiUmVzdHJpY3Rpb25zW3RdIgoiYEludGVybmFsIGNvbmZsaWN0YFt0LTFdIiAtPiAiT3V0Y29tZVt0LTFdIgoiYEludGVybmFsIGNvbmZsaWN0YFt0LTFdIiAtPiAiUmVzdHJpY3Rpb25zW3QtMV0iCiJgSW50ZXJuYWwgY29uZmxpY3RgW3QtMV0iIC0+ICJgSW50ZXJuYWwgY29uZmxpY3RgW3RdIgoiYEludGVybmFsIGNvbmZsaWN0YFt0LWldIiAtPiAiT3V0Y29tZVt0LWldIgoiYEludGVybmFsIGNvbmZsaWN0YFt0LWldIiAtPiAiUmVzdHJpY3Rpb25zW3QtaV0iCiJgSW50ZXJuYWwgY29uZmxpY3RgW3QtaV0iIC0+ICJgSW50ZXJuYWwgY29uZmxpY3RgW3QtMV0iCiJgSW50ZXJuYWwgY29uZmxpY3RgW3RdIiAtPiAiT3V0Y29tZVt0XSIKImBJbnRlcm5hbCBjb25mbGljdGBbdF0iIC0+ICJSZXN0cmljdGlvbnNbdF0iCiJgUnVsZSBvZiBsYXdgW3QtMV0iIC0+ICJPdXRjb21lW3QtMV0iCiJgUnVsZSBvZiBsYXdgW3QtMV0iIC0+ICJSZXN0cmljdGlvbnNbdC0xXSIKImBSdWxlIG9mIGxhd2BbdC0xXSIgLT4gImBSdWxlIG9mIGxhd2BbdF0iCiJgUnVsZSBvZiBsYXdgW3QtaV0iIC0+ICJPdXRjb21lW3QtaV0iCiJgUnVsZSBvZiBsYXdgW3QtaV0iIC0+ICJSZXN0cmljdGlvbnNbdC1pXSIKImBSdWxlIG9mIGxhd2BbdC1pXSIgLT4gImBSdWxlIG9mIGxhd2BbdC0xXSIKImBSdWxlIG9mIGxhd2BbdF0iIC0+ICJPdXRjb21lW3RdIgoiYFJ1bGUgb2YgbGF3YFt0XSIgLT4gIlJlc3RyaWN0aW9uc1t0XSIKfQonKQoKaHVnZV9tZXNzeV9kYWdfcGxvdCA8LSBodWdlX21lc3N5X2RhZyAlPiUgCiAgdGlkeV9kYWdpdHR5KCkgJT4lIAogIG11dGF0ZSh2YXJfdHlwZSA9IGNhc2Vfd2hlbigKICAgIHN0cl9kZXRlY3QobmFtZSwgIk91dGNvbWUiKSB+ICJPdXRjb21lIiwKICAgIHN0cl9kZXRlY3QobmFtZSwgIlJlc3RyaWN0aW9ucyIpIH4gIlJlc3RyaWN0aW9ucyIsCiAgICBUUlVFIH4gIloiCiAgKSkgJT4lIAogIG11dGF0ZSh0aW1lX3BlcmlvZCA9IGNhc2Vfd2hlbigKICAgIHN0cl9kZXRlY3QobmFtZSwgInQtMSIpIH4gMiwKICAgIHN0cl9kZXRlY3QobmFtZSwgInQtaSIpIH4gMSwKICAgIFRSVUUgfiAzCiAgKSkgJT4lIAogIG11dGF0ZShhcnJvd19jb2xvciA9IGNhc2Vfd2hlbigKICAgIG5hbWUgPT0gIlJlc3RyaWN0aW9uc1t0LTFdIiAmIHRvID09ICJPdXRjb21lW3RdIiB+ICIjRkY0MTM2IiwKICAgIFRSVUUgfiAiZ3JleTYwIgogICkpCgpnZ3Bsb3QoaHVnZV9tZXNzeV9kYWdfcGxvdCwgYWVzKHggPSB4LCB5ID0geSwgeGVuZCA9IHhlbmQsIHllbmQgPSB5ZW5kKSkgKwogIGdlb21fZGFnX2VkZ2VzKGFlcyhlZGdlX2NvbG91ciA9IGFycm93X2NvbG9yKSkgKwogIGdlb21fZGFnX3BvaW50KGFlcyhjb2xvciA9IHZhcl90eXBlLCBhbHBoYSA9IHRpbWVfcGVyaW9kKSwgc2l6ZSA9IDEyKSArCiAgZ2VvbV9kYWdfdGV4dChkYXRhID0gZmlsdGVyKGh1Z2VfbWVzc3lfZGFnX3Bsb3QsIHZhcl90eXBlID09ICJPdXRjb21lIiksCiAgICAgICAgICAgICAgICBjb2xvciA9ICJibGFjayIsIHNpemUgPSBwdHMoOSksIHBhcnNlID0gVFJVRSkgKwogIGdlb21fZGFnX3RleHQoZGF0YSA9IGZpbHRlcihodWdlX21lc3N5X2RhZ19wbG90LCB2YXJfdHlwZSA9PSAiUmVzdHJpY3Rpb25zIiksCiAgICAgICAgICAgICAgICBjb2xvciA9ICJibGFjayIsIHNpemUgPSBwdHMoOSksIHBhcnNlID0gVFJVRSkgKwogIGdlb21fZGFnX3RleHQoZGF0YSA9IGZpbHRlcihodWdlX21lc3N5X2RhZ19wbG90LCB2YXJfdHlwZSA9PSAiWiIpLAogICAgICAgICAgICAgICAgY29sb3IgPSAiYmxhY2siLCBzaXplID0gcHRzKDkpLCBwYXJzZSA9IFRSVUUpICsKICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gYygiI0IxMERDOSIsICIjRkY4NTFCIiwgImdyZXk2MCIpKSArCiAgc2NhbGVfeV9yZXZlcnNlKCkgKwogIGd1aWRlcyhhbHBoYSA9IEZBTFNFLCBjb2xvciA9IEZBTFNFKSArCiAgdGhlbWVfZGFnKCkKYGBgCgoKIyBTaW1wbGVyIG1vZGVsIHdpdGggZmFtaWxpZXMgb2YgY29uZm91bmRlcnMKCmBgYHtyIHNpbXBsZXJpc2gtZGFnLCBmaWcud2lkdGg9MTAuNSwgZmlnLmhlaWdodD00LjUsIGZpZy5hc3A9TlVMTH0Kc2ltcGxlcmlzaF9kYWcgPC0gZGFnaXR0eSgnCmRhZyB7CiJgSHVtYW4gcmlnaHRzICYgcG9saXRpY3NgW3QtMV0iIFthZGp1c3RlZCxwb3M9IjUsMS41Il0KImBIdW1hbiByaWdodHMgJiBwb2xpdGljc2BbdC1pXSIgW3Bvcz0iMSwxLjUiXQoiYEh1bWFuIHJpZ2h0cyAmIHBvbGl0aWNzYFt0XSIgW3Bvcz0iOSwxLjUiXQoiYEVjb25vbWljcyAmIGRldmVsb3BtZW50YFt0LTFdIiBbYWRqdXN0ZWQscG9zPSI1LDIuNSJdCiJgRWNvbm9taWNzICYgZGV2ZWxvcG1lbnRgW3QtaV0iIFtwb3M9IjEsMi41Il0KImBFY29ub21pY3MgJiBkZXZlbG9wbWVudGBbdF0iIFtwb3M9IjksMi41Il0KIk91dGNvbWVbdC0xXSIgW3Bvcz0iNi41LDEuNzUiXQoiT3V0Y29tZVt0LWldIiBbYWRqdXN0ZWQscG9zPSIyLjUsMS43NSJdCiJPdXRjb21lW3RdIiBbb3V0Y29tZSxwb3M9IjEwLjUsMS43NSJdCiJSZXN0cmljdGlvbnNbdC0xXSIgW2V4cG9zdXJlLHBvcz0iNiwyLjI1Il0KIlJlc3RyaWN0aW9uc1t0LWldIiBbYWRqdXN0ZWQscG9zPSIyLDIuMjUiXQoiUmVzdHJpY3Rpb25zW3RdIiBbcG9zPSIxMCwyLjI1Il0KImBVbmV4cGVjdGVkIHNob2Nrc2BbdC0xXSIgW2FkanVzdGVkLHBvcz0iNSwyIl0KImBVbmV4cGVjdGVkIHNob2Nrc2BbdC1pXSIgW3Bvcz0iMSwyIl0KImBVbmV4cGVjdGVkIHNob2Nrc2BbdF0iIFtwb3M9IjksMiJdCiJgSHVtYW4gcmlnaHRzICYgcG9saXRpY3NgW3QtMV0iIC0+ICJgSHVtYW4gcmlnaHRzICYgcG9saXRpY3NgW3RdIgoiYEh1bWFuIHJpZ2h0cyAmIHBvbGl0aWNzYFt0LTFdIiAtPiAiT3V0Y29tZVt0LTFdIgoiYEh1bWFuIHJpZ2h0cyAmIHBvbGl0aWNzYFt0LTFdIiAtPiAiUmVzdHJpY3Rpb25zW3QtMV0iCiJgSHVtYW4gcmlnaHRzICYgcG9saXRpY3NgW3QtMV0iIC0+ICJSZXN0cmljdGlvbnNbdF0iCiJgSHVtYW4gcmlnaHRzICYgcG9saXRpY3NgW3QtaV0iIC0+ICJgSHVtYW4gcmlnaHRzICYgcG9saXRpY3NgW3QtMV0iCiJgSHVtYW4gcmlnaHRzICYgcG9saXRpY3NgW3QtaV0iIC0+ICJPdXRjb21lW3QtaV0iCiJgSHVtYW4gcmlnaHRzICYgcG9saXRpY3NgW3QtaV0iIC0+ICJSZXN0cmljdGlvbnNbdC1pXSIKImBIdW1hbiByaWdodHMgJiBwb2xpdGljc2BbdF0iIC0+ICJPdXRjb21lW3RdIgoiYEh1bWFuIHJpZ2h0cyAmIHBvbGl0aWNzYFt0XSIgLT4gIlJlc3RyaWN0aW9uc1t0XSIKImBFY29ub21pY3MgJiBkZXZlbG9wbWVudGBbdC0xXSIgLT4gImBFY29ub21pY3MgJiBkZXZlbG9wbWVudGBbdF0iCiJgRWNvbm9taWNzICYgZGV2ZWxvcG1lbnRgW3QtMV0iIC0+ICJPdXRjb21lW3QtMV0iCiJgRWNvbm9taWNzICYgZGV2ZWxvcG1lbnRgW3QtMV0iIC0+ICJSZXN0cmljdGlvbnNbdC0xXSIKImBFY29ub21pY3MgJiBkZXZlbG9wbWVudGBbdC0xXSIgLT4gIlJlc3RyaWN0aW9uc1t0XSIKImBFY29ub21pY3MgJiBkZXZlbG9wbWVudGBbdC1pXSIgLT4gImBFY29ub21pY3MgJiBkZXZlbG9wbWVudGBbdC0xXSIKImBFY29ub21pY3MgJiBkZXZlbG9wbWVudGBbdC1pXSIgLT4gIk91dGNvbWVbdC1pXSIKImBFY29ub21pY3MgJiBkZXZlbG9wbWVudGBbdC1pXSIgLT4gIlJlc3RyaWN0aW9uc1t0LWldIgoiYEVjb25vbWljcyAmIGRldmVsb3BtZW50YFt0XSIgLT4gIk91dGNvbWVbdF0iCiJgRWNvbm9taWNzICYgZGV2ZWxvcG1lbnRgW3RdIiAtPiAiUmVzdHJpY3Rpb25zW3RdIgoiT3V0Y29tZVt0LTFdIiAtPiAiT3V0Y29tZVt0XSIKIk91dGNvbWVbdC0xXSIgLT4gIlJlc3RyaWN0aW9uc1t0XSIKIk91dGNvbWVbdC1pXSIgLT4gIk91dGNvbWVbdC0xXSIKIk91dGNvbWVbdC1pXSIgLT4gIlJlc3RyaWN0aW9uc1t0LTFdIgoiUmVzdHJpY3Rpb25zW3RdIiAtPiAiT3V0Y29tZVt0XSIKIlJlc3RyaWN0aW9uc1t0LTFdIiAtPiAiT3V0Y29tZVt0LTFdIgoiUmVzdHJpY3Rpb25zW3QtaV0iIC0+ICJPdXRjb21lW3QtaV0iCiJSZXN0cmljdGlvbnNbdC0xXSIgLT4gIk91dGNvbWVbdF0iCiJSZXN0cmljdGlvbnNbdC0xXSIgLT4gIlJlc3RyaWN0aW9uc1t0XSIKIlJlc3RyaWN0aW9uc1t0LWldIiAtPiAiT3V0Y29tZVt0LTFdIgoiUmVzdHJpY3Rpb25zW3QtaV0iIC0+ICJSZXN0cmljdGlvbnNbdC0xXSIKImBVbmV4cGVjdGVkIHNob2Nrc2BbdC0xXSIgLT4gIk91dGNvbWVbdC0xXSIKImBVbmV4cGVjdGVkIHNob2Nrc2BbdC0xXSIgLT4gIlJlc3RyaWN0aW9uc1t0LTFdIgoiYFVuZXhwZWN0ZWQgc2hvY2tzYFt0LTFdIiAtPiAiUmVzdHJpY3Rpb25zW3RdIgoiYFVuZXhwZWN0ZWQgc2hvY2tzYFt0LTFdIiAtPiAiYFVuZXhwZWN0ZWQgc2hvY2tzYFt0XSIKImBVbmV4cGVjdGVkIHNob2Nrc2BbdC1pXSIgLT4gIk91dGNvbWVbdC1pXSIKImBVbmV4cGVjdGVkIHNob2Nrc2BbdC1pXSIgLT4gIlJlc3RyaWN0aW9uc1t0LWldIgoiYFVuZXhwZWN0ZWQgc2hvY2tzYFt0LWldIiAtPiAiYFVuZXhwZWN0ZWQgc2hvY2tzYFt0LTFdIgoiYFVuZXhwZWN0ZWQgc2hvY2tzYFt0XSIgLT4gIk91dGNvbWVbdF0iCiJgVW5leHBlY3RlZCBzaG9ja3NgW3RdIiAtPiAiUmVzdHJpY3Rpb25zW3RdIgp9CicpCgpzaW1wbGVyaXNoX2RhZ19wbG90IDwtIHNpbXBsZXJpc2hfZGFnICU+JSAKICB0aWR5X2RhZ2l0dHkoKSAlPiUgCiAgbXV0YXRlKHZhcl90eXBlID0gY2FzZV93aGVuKAogICAgc3RyX2RldGVjdChuYW1lLCAiT3V0Y29tZSIpIH4gIk91dGNvbWUiLAogICAgc3RyX2RldGVjdChuYW1lLCAiUmVzdHJpY3Rpb25zIikgfiAiUmVzdHJpY3Rpb25zIiwKICAgIFRSVUUgfiAiWiIKICApKSAlPiUgCiAgbXV0YXRlKHRpbWVfcGVyaW9kID0gY2FzZV93aGVuKAogICAgc3RyX2RldGVjdChuYW1lLCAidC0xIikgfiAyLAogICAgc3RyX2RldGVjdChuYW1lLCAidC1pIikgfiAxLAogICAgVFJVRSB+IDMKICApKSAlPiUgCiAgbXV0YXRlKGFycm93X2NvbG9yID0gY2FzZV93aGVuKAogICAgbmFtZSA9PSAiUmVzdHJpY3Rpb25zW3QtMV0iICYgdG8gPT0gIk91dGNvbWVbdF0iIH4gIiNGRjQxMzYiLAogICAgVFJVRSB+ICJncmV5NjAiCiAgKSkKCmdncGxvdChzaW1wbGVyaXNoX2RhZ19wbG90LCBhZXMoeCA9IHgsIHkgPSB5LCB4ZW5kID0geGVuZCwgeWVuZCA9IHllbmQpKSArCiAgZ2VvbV9kYWdfZWRnZXMoYWVzKGVkZ2VfY29sb3VyID0gYXJyb3dfY29sb3IpKSArCiAgZ2VvbV9kYWdfcG9pbnQoYWVzKGNvbG9yID0gdmFyX3R5cGUsIGFscGhhID0gdGltZV9wZXJpb2QpLCBzaXplID0gMTIpICsKICBnZW9tX2RhZ190ZXh0KGRhdGEgPSBmaWx0ZXIoc2ltcGxlcmlzaF9kYWdfcGxvdCwgdmFyX3R5cGUgPT0gIk91dGNvbWUiKSwKICAgICAgICAgICAgICAgIGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IHB0cyg5KSwgcGFyc2UgPSBUUlVFKSArCiAgZ2VvbV9kYWdfdGV4dChkYXRhID0gZmlsdGVyKHNpbXBsZXJpc2hfZGFnX3Bsb3QsIHZhcl90eXBlID09ICJSZXN0cmljdGlvbnMiKSwKICAgICAgICAgICAgICAgIGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IHB0cyg5KSwgcGFyc2UgPSBUUlVFKSArCiAgZ2VvbV9kYWdfdGV4dChkYXRhID0gZmlsdGVyKHNpbXBsZXJpc2hfZGFnX3Bsb3QsIHZhcl90eXBlID09ICJaIiksCiAgICAgICAgICAgICAgICBjb2xvciA9ICJibGFjayIsIHNpemUgPSBwdHMoOSksIHBhcnNlID0gVFJVRSkgKwogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBjKCIjQjEwREM5IiwgIiNGRjg1MUIiLCAiZ3JleTYwIikpICsKICBzY2FsZV95X3JldmVyc2UoKSArCiAgZ3VpZGVzKGFscGhhID0gRkFMU0UsIGNvbG9yID0gRkFMU0UpICsKICB0aGVtZV9kYWcoKQpgYGAKCgojIFNpbXBsZXN0IG1vZGVsCgpgYGB7ciBzaW1wbGUtZGFnLCBmaWcud2lkdGg9NywgZmlnLmhlaWdodD0zLjc1LCBmaWcuYXNwPU5VTEx9CnNpbXBsZV9kYWcgPC0gZGFnaXR0eSgnCmRhZyB7CiJPdXRjb21lW3QtaV0iIFtwb3M9IjEuNSwyIl0KIk91dGNvbWVbdC0xXSIgW3Bvcz0iMy41LDIiXQoiT3V0Y29tZVt0XSIgW291dGNvbWUscG9zPSI2LDIiXQoiUmVzdHJpY3Rpb25zW3QtaV0iIFtwb3M9IjEsMSJdCiJSZXN0cmljdGlvbnNbdC0xXSIgW2V4cG9zdXJlLHBvcz0iMywxIl0KIlJlc3RyaWN0aW9uc1t0XSIgW3Bvcz0iNSwxIl0KIlpbdC1pXSIgW3Bvcz0iMSwzIl0KIlpbdC0xXSIgW3Bvcz0iMywzIl0KIlpbdF0iIFtwb3M9IjUsMyJdCiJPdXRjb21lW3QtMV0iIC0+ICJPdXRjb21lW3RdIgoiT3V0Y29tZVt0LTFdIiAtPiAiUmVzdHJpY3Rpb25zW3RdIgoiT3V0Y29tZVt0LWldIiAtPiAiT3V0Y29tZVt0LTFdIgoiT3V0Y29tZVt0LWldIiAtPiAiUmVzdHJpY3Rpb25zW3QtMV0iCiJSZXN0cmljdGlvbnNbdF0iIC0+ICJPdXRjb21lW3RdIgoiUmVzdHJpY3Rpb25zW3QtMV0iIC0+ICJPdXRjb21lW3QtMV0iCiJSZXN0cmljdGlvbnNbdC1pXSIgLT4gIk91dGNvbWVbdC1pXSIKIlJlc3RyaWN0aW9uc1t0LTFdIiAtPiAiT3V0Y29tZVt0XSIKIlJlc3RyaWN0aW9uc1t0LTFdIiAtPiAiUmVzdHJpY3Rpb25zW3RdIgoiUmVzdHJpY3Rpb25zW3QtaV0iIC0+ICJPdXRjb21lW3QtMV0iCiJSZXN0cmljdGlvbnNbdC1pXSIgLT4gIlJlc3RyaWN0aW9uc1t0LTFdIgoiWlt0LTFdIiAtPiAiT3V0Y29tZVt0LTFdIgoiWlt0LTFdIiAtPiAiUmVzdHJpY3Rpb25zW3QtMV0iCiJaW3QtMV0iIC0+ICJSZXN0cmljdGlvbnNbdF0iCiJaW3QtMV0iIC0+ICJaW3RdIgoiWlt0LWldIiAtPiAiT3V0Y29tZVt0LWldIgoiWlt0LWldIiAtPiAiUmVzdHJpY3Rpb25zW3QtMV0iCiJaW3QtaV0iIC0+ICJSZXN0cmljdGlvbnNbdC1pXSIKIlpbdC1pXSIgLT4gIlpbdC0xXSIKIlpbdF0iIC0+ICJPdXRjb21lW3RdIgoiWlt0XSIgLT4gIlJlc3RyaWN0aW9uc1t0XSIKfQonKSAKCnNpbXBsZV9kYWdfcGxvdCA8LSBzaW1wbGVfZGFnICU+JSAKICB0aWR5X2RhZ2l0dHkoKSAlPiUgCiAgbXV0YXRlKHZhcl90eXBlID0gY2FzZV93aGVuKAogICAgc3RyX2RldGVjdChuYW1lLCAiT3V0Y29tZSIpIH4gIk91dGNvbWUiLAogICAgc3RyX2RldGVjdChuYW1lLCAiUmVzdHJpY3Rpb25zIikgfiAiUmVzdHJpY3Rpb25zIiwKICAgIHN0cl9kZXRlY3QobmFtZSwgIloiKSB+ICJaIgogICkpICU+JSAKICBtdXRhdGUodGltZV9wZXJpb2QgPSBjYXNlX3doZW4oCiAgICBzdHJfZGV0ZWN0KG5hbWUsICJ0LTEiKSB+IDIsCiAgICBzdHJfZGV0ZWN0KG5hbWUsICJ0LWkiKSB+IDEsCiAgICBUUlVFIH4gMwogICkpICU+JSAKICBtdXRhdGUoYXJyb3dfY29sb3IgPSBjYXNlX3doZW4oCiAgICBuYW1lID09ICJSZXN0cmljdGlvbnNbdC0xXSIgJiB0byA9PSAiT3V0Y29tZVt0XSIgfiAiI0ZGNDEzNiIsCiAgICBUUlVFIH4gImdyZXk2MCIKICApKSAlPiUgCiAgbXV0YXRlKGxldHRlcl9vbmx5ID0gY2FzZV93aGVuKAogICAgc3RyX2RldGVjdChuYW1lLCAiT3V0Y29tZSIpIH4gc3RyX3JlcGxhY2UobmFtZSwgIk91dGNvbWUiLCAiWSIpLAogICAgc3RyX2RldGVjdChuYW1lLCAiUmVzdHJpY3Rpb25zIikgfiBzdHJfcmVwbGFjZShuYW1lLCAiUmVzdHJpY3Rpb25zIiwgIlgiKSwKICAgIFRSVUUgfiBuYW1lCiAgKSkKCnNpbXBsZV9kYWdfb3V0IDwtIGdncGxvdChzaW1wbGVfZGFnX3Bsb3QsIGFlcyh4ID0geCwgeSA9IHksIHhlbmQgPSB4ZW5kLCB5ZW5kID0geWVuZCkpICsKICBnZW9tX2RhZ19lZGdlcyhhZXMoZWRnZV9jb2xvdXIgPSBhcnJvd19jb2xvcikpICsKICBnZW9tX2RhZ19wb2ludChhZXMoY29sb3IgPSB2YXJfdHlwZSwgYWxwaGEgPSB0aW1lX3BlcmlvZCksIHNpemUgPSAxMikgKwogIGdlb21fZGFnX3RleHQoZGF0YSA9IGZpbHRlcihzaW1wbGVfZGFnX3Bsb3QsIHZhcl90eXBlID09ICJPdXRjb21lIiksCiAgICAgICAgICAgICAgICBjb2xvciA9ICJibGFjayIsIHNpemUgPSBwdHMoMTEpLCBwYXJzZSA9IFRSVUUsIAogICAgICAgICAgICAgICAgbnVkZ2VfeSA9IDAuMiwgbnVkZ2VfeCA9IDAuMykgKwogIGdlb21fZGFnX3RleHQoZGF0YSA9IGZpbHRlcihzaW1wbGVfZGFnX3Bsb3QsIHZhcl90eXBlID09ICJSZXN0cmljdGlvbnMiKSwKICAgICAgICAgICAgICAgIGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IHB0cygxMSksIHBhcnNlID0gVFJVRSwgCiAgICAgICAgICAgICAgICBudWRnZV95ID0gLTAuMjUpICsKICBnZW9tX2RhZ190ZXh0KGRhdGEgPSBmaWx0ZXIoc2ltcGxlX2RhZ19wbG90LCB2YXJfdHlwZSA9PSAiWiIpLAogICAgICAgICAgICAgICAgY29sb3IgPSAiYmxhY2siLCBzaXplID0gcHRzKDExKSwgcGFyc2UgPSBUUlVFLAogICAgICAgICAgICAgICAgbnVkZ2VfeSA9IDApICsKICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gYygiI0IxMERDOSIsICIjRkY4NTFCIiwgImdyZXk2MCIpKSArCiAgZ3VpZGVzKGFscGhhID0gRkFMU0UsIGNvbG9yID0gRkFMU0UpICsKICB0aGVtZV9kYWcoKQpzaW1wbGVfZGFnX291dApgYGAKCmBgYHtyIHNpbXBsZS1kYWctbGV0dGVycywgZmlnLndpZHRoPTcsIGZpZy5oZWlnaHQ9My43NSwgZmlnLmFzcD1OVUxMfQpzaW1wbGVfZGFnX2xldHRlcnNfb3V0IDwtIGdncGxvdChzaW1wbGVfZGFnX3Bsb3QsIGFlcyh4ID0geCwgeSA9IHksIHhlbmQgPSB4ZW5kLCB5ZW5kID0geWVuZCkpICsKICBnZW9tX2RhZ19lZGdlcyhhZXMoZWRnZV9jb2xvdXIgPSBhcnJvd19jb2xvcikpICsKICBnZW9tX2RhZ19wb2ludChhZXMoY29sb3IgPSB2YXJfdHlwZSwgYWxwaGEgPSB0aW1lX3BlcmlvZCksIHNpemUgPSAxMikgKwogIGdlb21fZGFnX3RleHQoYWVzKGxhYmVsID0gbGV0dGVyX29ubHkpLAogICAgICAgICAgICAgICAgY29sb3IgPSAiYmxhY2siLCBzaXplID0gcHRzKDExKSwgcGFyc2UgPSBUUlVFKSArCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IGMoIiNCMTBEQzkiLCAiI0ZGODUxQiIsICJncmV5NjAiKSkgKwogIGd1aWRlcyhhbHBoYSA9IEZBTFNFLCBjb2xvciA9IEZBTFNFKSArCiAgdGhlbWVfZGFnKCkKc2ltcGxlX2RhZ19sZXR0ZXJzX291dAoKZ2dzYXZlKGhlcmUoImFuYWx5c2lzIiwgIm91dHB1dCIsICJkYWdfc2ltcGxlX2xldHRlcnMucGRmIiksIHNpbXBsZV9kYWdfbGV0dGVyc19vdXQsCiAgICAgICB3aWR0aCA9IDcsIGhlaWdodCA9IDMuNzUsIGRldmljZSA9IGNhaXJvX3BkZikKZ2dzYXZlKGhlcmUoImFuYWx5c2lzIiwgIm91dHB1dCIsICJkYWdfc2ltcGxlX2xldHRlcnMucG5nIiksIHNpbXBsZV9kYWdfbGV0dGVyc19vdXQsCiAgICAgICB3aWR0aCA9IDcsIGhlaWdodCA9IDMuNzUsIGRwaSA9IDMwMCwgdHlwZSA9ICJjYWlybyIpCmBgYAoKCgojIEFkanVzdG1lbnQgc2V0cwoKVGhlc2UgREFHcyBhcmUgY29tcGxleOKAlGVzcGVjaWFsbHkgdGhlIG9uZSB3aXRoIGV2ZXJ5IHBvc3NpYmxlIG5vZGUuIEhvd2V2ZXIsIHRoZXkgaGF2ZSBpbXBvcnRhbnQgYW5hbHl0aWNhbCB2YWx1ZS4gV2UgY2Fubm90IHJhbmRvbWx5IGFzc2lnbiBjb3VudHJpZXMgdG8gaW1wb3NlIGFudGktTkdPIGxhd3Mgb3IgcmVzdHJpY3QgdGhlIGVudmlyb25tZW50IGZvciBjaXZpbCBzb2NpZXR54oCUZG9pbmcgdGhhdCBpcyBjb21wbGV0ZWx5IGluZmVhc2FibGUgKGFuZCB1bmV0aGljYWwhKS4gVGhpcyBtZWFucyB0aGF0IHdlIGNhbm5vdCB1c2UgZXhwZXJpbWVudGFsIGRhdGEgdG8gbWVhc3VyZSB0aGUgY2F1c2FsIGVmZmVjdCBvZiBhbnRpLU5HTyByZXN0cmljdGlvbnMgb24gZm9yZWlnbiBhaWQsIG9yICRFW1x0ZXh0e0FpZH0gXG1pZCBkbyhcdGV4dHtSZXN0cmljdGlvbnN9KV0kLiBXZSBhbHNvIGRvbid0IGhhdmUgYW55IHF1YXNpLWV4cGVyaW1lbnRhbCBzaXR1YXRpb25zIHRoYXQgd291bGQgYWxsb3cgZm9yIGNvbnRleHQtYmFzZWQgaWRlbnRpZmljYXRpb24gb2YgdGhlIGVmZmVjdCBvZiByZXN0cmljdGlvbnMgb24gYWlkLgoKU2ltcGx5IG1lYXN1cmluZyAkRVtcdGV4dHtBaWR9IFxtaWQgXHRleHR7UmVzdHJpY3Rpb25zfV0kIGlzIHRyaXZpYWzigJRqdXN0IHJ1biBgbG0oYWlkIH4gcmVzdHJpY3Rpb25zKWAgYW5kIGxvb2sgYXQgdGhlIGNvZWZmaWNpZW50LiBIb3dldmVyLCB0aGlzIGVzdGltYXRlIGNhbm5vdCBiZSBpbnRlcnByZXRlZCBpbiBhbnkgc29ydCBvZiBjYXVzYWwgd2F5LCBzaW5jZSBjb3JyZWxhdGlvbiBpcyBub3QgY2F1c2F0aW9uLiBVc2luZyB0aGUgbG9naWMgb2YgKmRvKi1jYWxjdWx1cywgd2UgY2FuIGFjdHVhbGx5IHVzZSB0aGUgcmVsYXRpb25zaGlwcyBiZXR3ZWVuIHRoZSBub2RlcyBpbiB0aGUgREFHIHRvIHRyYW5zZm9ybSAkRVtcdGV4dHtBaWR9IFxtaWQgZG8oXHRleHR7UmVzdHJpY3Rpb25zfSldJCBpbnRvIGEgKmRvKi1mcmVlIGV4cHJlc3Npb24gYnkgbWFraW5nIHN0YXRpc3RpY2FsIGFkanVzdG1lbnRzIGFuZCBjbG9zaW5nIGJhY2tkb29yIHBhdGh3YXlzIHRoYXQgb3BlbiB1cCBzcHVyaW91cyByZWxhdGlvbnNoaXBzIGJldHdlZW4gcmVzdHJpY3Rpb25zIGFuZCBhaWQuIEFzIGxvbmcgYXMgd2UgY2FuIGZpbmQgYSBtaW5pbWFsbHkgc3VmZmljaWVudCBhZGp1c3RtZW50IHNldOKAlG9yIGEgc2V0IG9mIG5vZGVzIG9yIHZhcmlhYmxlcyB0aGF0IG5lZWQgdG8gYmUgYWRqdXN0ZWQgaW4gb3JkZXIgdG8gZW5zdXJlIHRoYXQgcmVzdHJpY3Rpb25zIGlzICpkKi1zZXBhcmF0ZWQgZnJvbSBhaWTigJR3ZSBjYW4gaXNvbGF0ZSBhbmQgaWRlbnRpZnkgdGhlIGNhdXNhbCBsaW5rIGJldHdlZW4gcmVzdHJpY3Rpb25zIGFuZCBhaWQuCgpSYXRoZXIgdGhhbiBnbyB0aHJvdWdoIHRoZSBjb21wbGV4IG1hdGggYmVoaW5kIHRoZSB0aHJlZSBydWxlcyBvZiAqZG8qLWNhbGN1bHVzLCB3ZSBjYW4gdXNlIFIgKG9yIGRhZ2l0dHkubmV0KSB0byBpZGVudGlmeSBtaW5pbWFsIHN1ZmZpY2llbnQgYWRqdXN0bWVudCBzZXRzIGJhc2VkIG9uIHRoZSB0aHJlZSBEQUdzIGFib3ZlLgoKLSBIdWdlIGNvbXBsaWNhdGVkIERBRzoKCmBgYHtyIGh1Z2UtZGFnLWFkanVzdG1lbnQsIGluZGVudD0iICAgICIsIGNsYXNzLnNvdXJjZSA9ICdmb2xkLXNob3cnfQpodWdlX21lc3N5X2RhZyAlPiUKICBhZGp1c3RtZW50U2V0cygpCmBgYAoKLSBTaW1wbGVyLWlzaCBEQUc6CgpgYGB7ciBzaW1wbGVyaXNoLWRhZy1hZGp1c3RtZW50LCBpbmRlbnQ9IiAgICAiLCBjbGFzcy5zb3VyY2UgPSAnZm9sZC1zaG93J30Kc2ltcGxlcmlzaF9kYWcgJT4lCiAgYWRqdXN0bWVudFNldHMoKQpgYGAKCi0gU2ltcGxlIERBRzoKCmBgYHtyIHNpbXBsZS1kYWctYWRqdXN0bWVudCwgaW5kZW50PSIgICAgIiwgY2xhc3Muc291cmNlID0gJ2ZvbGQtc2hvdyd9CnNpbXBsZV9kYWcgJT4lCiAgYWRqdXN0bWVudFNldHMoKQpgYGAKClwgCgpJbiBvdGhlciB3b3JkcywgaWYgd2Ugd2FudCB0byBpc29sYXRlIHRoZSBjYXVzYWwgZWZmZWN0IG9mIGFudGktTkdPIHJlc3RyaWN0aW9ucyBpbiB0aW1lICR0JCBvbiBhaWQgaW4gdGltZSAkdCsxJCAoaS5lLiB0aGUgZWZmZWN0IG9mIGxhZ2dlZCByZXN0cmljdGlvbnMpLCB3ZSBuZWVkIHRvIGFkanVzdCBmb3IgbGFnZ2VkIGFpZCAoJHQtMSQpLCBsYWdnZWQgcmVzdHJpY3Rpb25zICgkdC0xJCksIGFuZCB0aW1lLXZhcnlpbmcgY29uZm91bmRlcnMgKCR0JCkuIAoKRm9ydHVuYXRlbHksIG1hcmdpbmFsIHN0cnVjdHVyYWwgbW9kZWxzIGFsbG93IHVzIHRvIG1ha2UgYWxsIG9mIHRoZXNlIGFkanVzdG1lbnRzIHVzaW5nIHNwZWNpYWwgaW52ZXJzZSBwcm9iYWJpbGl0eSB3ZWlnaHRzIHRoYXQgdGFrZSB0aGlzIGxhZ2dpbmcgc3RydWN0dXJlIGFuZCB0cmVhdG1lbnQgaGlzdG9yeSBpbnRvIGFjY291bnQuCgokJApcdGV4dHtDb250aW51b3VzIHN0YWJpbGl6ZWQgSVBXfV97aXR9ID0gXHByb2RedF97dCA9IDF9IFxmcmFje2Zfe1ggfCBcYmFye1h9LCBWfVsoWF97aXR9IHwgXGJhcntYfV97aSwgdC0xfSwgVl9pKTsgXG11XzEsIFxzaWdtYV4yXzFdfXtmX3tYIHwgXGJhcntYfSwgWSwgWiwgVn1bKFhfe2l0fSB8IFxiYXJ7WH1fe2ksIHQtMX0sIFlfe2ksIHQtMX0sIFpfe2l0fSwgVl9pKSwgXG11XzIsIFxzaWdtYV4yXzJdfQokJAoKLSBUaGUgbnVtZXJhdG9yIGNvbnRhaW5zIHRoZSBwcm9iYWJpbGl0eSBvZiB0aGUgb2JzZXJ2ZWQgdHJlYXRtZW50IHN0YXR1cyAoJFhfe2l0fSQpIGF0IGVhY2ggdGltZSBnaXZlbiB0aGUgcHJldmlvdXMgaGlzdG9yeSBvZiB0cmVhdG1lbnQgKCRcYmFye1h9X3tpLCB0LTF9JCkgYW5kIHRpbWUgaW52YXJpYW50IGNvbmZvdW5kZXJzICgkVl9pJCkuIAotIFRoZSBkZW5vbWluYXRvciBjb250YWlucyB0aGUgcHJvYmFiaWxpdHkgb2YgdGhlIG9ic2VydmVkIHRyZWF0bWVudCBzdGF0dXMgKCRYX3tpdH0kKSBhdCBlYWNoIHRpbWUgZ2l2ZW4gdGhlIHByZXZpb3VzIGhpc3Rvcnkgb2YgdHJlYXRtZW50ICgkXGJhcntYfV97aSwgdC0xfSQpLCBwcmV2aW91cyBvdXRjb21lICgkWV97aSwgdC0xfSQpLCB0aW1lICp2YXJ5aW5nKiBjb25mb3VuZGVycyAoJFpfe2l0fSQpLCBhbmQgdGltZSAqaW52YXJpYW50KiBjb25mb3VuZGVycyAoJFZfaSQpLgotIFRoZXNlIHR3byBwcm9iYWJpbGl0eSBkaXN0cmlidXRpb25zIGhhdmUgYSBtZWFuIG9mICRcbXVfezEsIDJ9JCBhbmQgdmFyaWFuY2Ugb2YgJFxzaWdtYV4yX3sxLCAyfSQuCgpGaW5hbGx5LCB0aGVzZSB3ZWlnaHRzIGFyZSB1c2VkIGluIGFuIG91dGNvbWUgbW9kZWwgc2ltaWxhciB0byB0aGlzOgoKYGBge3IgZXZhbD1GQUxTRSwgY2xhc3Muc291cmNlID0gJ2ZvbGQtc2hvdyd9CmxtKG91dGNvbWUgfiBsYWdfdHJlYXRtZW50LCB3ZWlnaHRzID0gaXB3KQpgYGAKCkRvaW5nIHRoaXMgcHJvY2VzcyBjbG9zZXMgdGhlIGJhY2tkb29yIHBhdGh3YXlzIGJldHdlZW4gbGFnZ2VkIHJlc3RyaWN0aW9ucyBhbmQgcHJlc2VudCBhaWQgYW5kIGlzIHRoZW9yZXRpY2FsbHkgc3VmZmljaWVudCBmb3IgaXNvbGF0aW5nIHRoZSBjYXVzYWwgbGluayBiZXR3ZWVuIHRoZSB0d28uCgoKIyBGaW5hbCB2YXJpYWJsZXMgdG8gdXNlCgpCYXNlZCBvbiB0aGVzZSBEQUdzLCBoZXJlIGFyZSB0aGUgdmFyaWFibGVzIHdlIHVzZSBpbiBvdXIgdHJlYXRtZW50IGFuZCBvdXRjb21lIG1vZGVsczoKCi0gKipPdXRjb21lKioKICAtIEh+MX46IGxvZyBhaWQgaW4gJHQkIChgdG90YWxfb2RhX2xlYWRgIGFuZCBgdG90YWxfb2RhX2xvZ19sZWFkYCkKICAtIEh+Mn46IHByb3BvcnRpb24gb2YgYWlkIGdpdmVuIGZvciBjb250ZW50aW91cyBjYXVzZXMgaW4gJHQkIChgcHJvcF9jb250ZW50aW91c2ApCiAgLSBIfjN+OiBwcm9wb3J0aW9uIG9mIGFpZCBnaXZlbiB0byBkb21lc3RpYy9pbnRlcm5hdGlvbmFsIE5HT1MgaW4gJHQkIChgcHJvcF9uZ29fZG9tYCBhbmQgYHByb3BfbmdvX2ZvcmVpZ25gKQotICoqVHJlYXRtZW50KioKICAtIEFudGktY2l2aWwgc29jaWV0eSBsYXdzIGFuZCBnZW5lcmFsIHJlc3RyaWN0aXZlIGVudmlyb25tZW50IGluICR0LTEkIChgYmFycmllcnNfdG90YWxgIGFuZCBgdjJ4Y3NfY2NzaWApCi0gKipUaW1lLXZhcnlpbmcgY29uZm91bmRlcnMqKiAoYWxsIGluICR0LTEkKQogIC0gSHVtYW4gcmlnaHRzIGFuZCBwb2xpdGljcwogICAgLSBFbGVjdG9yYWwgZGVtb2NyYWN5OiBgdjJ4X3BvbHlhcmNoeWAKICAgIC0gQ29ycnVwdGlvbjogYHYyeF9jb3JyYAogICAgLSBSdWxlIG9mIGxhdzogYHYyeF9ydWxlYAogICAgLSBDaXZpbCBsaWJlcnRpZXMgaW5kZXg6IGB2MnhfY2l2bGliYAogICAgLSBQaHlzaWNhbCB2aW9sZW5jZSBpbmRleDogYHYyeF9jbHBoeWAKICAgIC0gUHJpdmF0ZSBjaXZpbCBsaWJlcnRpZXMgaW5kZXg6IGB2MnhfY2xwcml2YAogIC0gRWNvbm9taWNzIGFuZCBkZXZlbG9wbWVudAogICAgLSBXZWFsdGg6IGBnZHBjYXBfbG9nYAogICAgLSBJbnRlcm5hdGlvbmFsIHRyYWRlOiBgdW5fdHJhZGVfcGN0X2dkcGAKICAgIC0gRWR1Y2F0aW9uYWwgZXF1YWxpdHk6IGB2MnBlZWR1ZXFgCiAgICAtIEhlYWx0aCBlcXVhbGl0eTogYHYycGVoZWFsdGhgCiAgICAtIEluZmFudCBtb3J0YWxpdHkgcmF0ZTogYGVfcGVpbmZtb3JgCiAgLSBVbmV4cGVjdGVkIHNob2NrcwogICAgLSBJbnRlcm5hbCBjb25mbGljdDogYGludGVybmFsX2NvbmZsaWN0X3Bhc3RfNWAKICAgIC0gTmF0dXJhbCBkaXNhc3RlcnM6IGBuYXR1cmFsX2Rpc19jb3VudGAKLSAqKlRpbWUtaW52YXJ5aW5nIGNvbmZvdW5kZXJzKioKICAtIENvdW50cnkgY29kZSBpbmNsdWRlZCBhcyBtdWx0aWxldmVsIHJhbmRvbSBlZmZlY3RzKGAoMSB8IGd3Y29kZSlgKQo=