1. Data Loading and Merging

# Load required libraries
library(tidyverse)
library(broom)
library(ggplot2)
library(readr)
library(janitor)
library(dplyr)
library(ggplot2)
library(survival)
library(lubridate)
library(gridExtra)
library(stringr)

1.1 Data Loading

# Load all datasets
df_year <- read_csv("Data/year_data.csv") %>%
  clean_names()

df_spatial <- read_csv("Data/spatial_jurisdiction_data.csv") %>%
  clean_names()

df_vertical <- read_csv("Data/vertical_coordinations_data.csv") %>%
  clean_names()

df_subject <- read_csv("Data/subject_matter_jurisdiction_data.csv") %>%
  clean_names()

df_strategies <- read_csv("Data/strategies_data.csv") %>%
  clean_names()

df_objectives <- read_csv("Data/defined_objectives_data.csv") %>%
  clean_names()

df_relationships <- read_csv("Data/defined_inter_institutional_relationships_data.csv") %>%
  clean_names()

df_sources <- read_csv("Data/sources_of_jurisdiction_data.csv") %>%
  clean_names()

1.2 Data Merging

# Merge all datasets
df <- df_year %>%
  left_join(df_spatial, by = "institution") %>%
  left_join(df_vertical, by = "institution") %>%
  left_join(df_subject, by = "institution") %>%
  left_join(df_strategies, by = "institution") %>%
  left_join(df_objectives, by = "institution") %>%
  left_join(df_relationships, by = "institution") %>%
  left_join(df_sources, by = "institution")

Data Shape

cat("The merged data has", dim(df)[2], "columns and", dim(df)[1], "rows.\n")
The merged data has 152 columns and 48 rows.

3. Data Analysis

Conjecture 1:Institutional Design, Coordination, and Endurance

Hypothesis 1.1: Earlier-established IGOs endure longer

Objective: Test if IGOs established earlier have longer endurance (measured as age).

Columns Used:

  • year_cleaned
  • founding_era_category
# Calculate age and create era groups
df <- df %>%
  mutate(
    age = 2025 - year_cleaned,
    era_group = case_when(
      founding_era_category %in% c("Early Founding Years (Pre-1900)", "Early 20th Century (1900-1945)", "Post-WWII Boom (1946-1960)") ~ "Early",
      founding_era_category %in% c("Cold War Era I (1961-1970)", "Cold War Era II (1971-1980)", "Late Cold War (1981-1990)") ~ "Cold War",
      founding_era_category %in% c("Post-Cold War (1991-2000)", "Globalisation Era (2001-2010)", "SDG & Climate Action Era (2011-2020)") ~ "Recent",
      TRUE ~ NA_character_
    ),
    # Create decades for more granular analysis
    decade = floor(year_cleaned / 10) * 10,
    survival_time = age
  ) %>%
  filter(!is.na(era_group)) %>%
  mutate(era_group = factor(era_group, levels = c("Early", "Cold War", "Recent")))

# TEST 1: SURVIVAL CURVE ANALYSIS
surv_obj <- Surv(time = df$survival_time, event = rep(0, nrow(df)))

# Fit survival curves by era
surv_fit <- survfit(surv_obj ~ era_group, data = df)

# Wrap the caption neatly at ~90 characters
cap <- str_wrap(
  paste0(
    "Figure 1A (Hypothesis 1.1). Survival analysis perspective: All IGOs are still active. ",
    "Early-founded IGOs show higher density at longer durations, supporting the longevity hypothesis. ",
    "Mean survival times: Early = ", round(mean(df$survival_time[df$era_group == "Early"]), 1), " yrs, ",
    "Cold War = ", round(mean(df$survival_time[df$era_group == "Cold War"]), 1), " yrs, ",
    "Recent = ", round(mean(df$survival_time[df$era_group == "Recent"]), 1), " yrs."
  ),
  width = 90
)

# Create survival plot
plot1 <- ggplot(df, aes(x = survival_time, fill = era_group, color = era_group)) +
  geom_density(alpha = 0.3, size = 1.2) +
  scale_fill_manual(values = c("#1b9e77", "#d95f02", "#7570b3")) +
  scale_color_manual(values = c("#1b9e77", "#d95f02", "#7570b3")) +
  labs(
    title = "Test 1: IGO Longevity Distribution by Founding Era",
    subtitle = "Density curves show the distribution of current ages",
    x = "Current Age (Years)",
    y = "Density",
    fill = "Founding Era",
    color = "Founding Era",
    caption = cap
  ) +
  theme_minimal() +
  theme(
    legend.position = "bottom",
    plot.caption = element_text(
      hjust = 0,
      face = "italic",
      size = 9,
      lineheight = 1.2
    ),
    plot.margin = margin(10, 10, 60, 10) # more space for caption
  )

# TEST 2: REGRESSION ANALYSIS WITH INSTITUTIONAL MATURITY STAGES
# Wrap the long caption text
cap2 <- str_wrap(
  paste0(
    "Figure 1B. Regression analysis shows strong negative correlation (R² = ", 
    round(lm_summary$r.squared, 3), ", p < 0.001). ",
    "Each year later in founding reduces current age by ~1 year (slope = ", 
    round(coef(lm_model)[2], 2), "). ",
    "Legacy institutions (80+ years) cluster in early periods, supporting the hypothesis ",
    "that earlier establishment leads to longer observed durations."
  ),
  width = 90
)

# Create regression plot with maturity stages
plot2 <- ggplot(df, aes(x = year_cleaned, y = age)) +
  geom_point(aes(color = maturity_stage, size = maturity_stage), alpha = 0.7) +
  geom_smooth(method = "lm", se = TRUE, color = "black", linetype = "dashed") +
  scale_color_manual(values = c("#d73027", "#fc8d59", "#4575b4", "#2166ac")) +
  scale_size_manual(values = c(2, 2.5, 3, 4)) +
  labs(
    title = "TEST 2: Institutional Maturity vs. Founding Year",
    subtitle = "Linear relationship between founding year and current institutional age",
    x = "Founding Year",
    y = "Current Age (Years)",
    color = "Maturity Stage",
    size = "Maturity Stage",
    caption = cap2
  ) +
  theme_minimal() +
  theme(
    legend.position = "bottom",
    plot.caption = element_text(
      hjust = 0, 
      face = "italic", 
      size = 9,
      lineheight = 1.2
    ),
    plot.margin = margin(10, 10, 60, 10) # add space for long caption
  ) +
  guides(size = guide_legend(override.aes = list(alpha = 1)))

# ANALYSIS 3: COHORT SURVIVAL PROBABILITY ANALYSIS
library(stringr)

# Create wrapped caption for readability
cap3 <- str_wrap(
  paste0(
    "Figure 1C. Cohort analysis reveals clear longevity advantage for earlier-founded IGOs. ",
    "1860s cohort (n=1): ", round(decade_analysis$mean_age[decade_analysis$decade == 1860], 0), " years; ",
    "1900s–1940s cohorts: ", round(mean(decade_analysis$mean_age[decade_analysis$decade %in% c(1900, 1910, 1920, 1940)]), 0), " years avg; ",
    "2000s–2010s cohorts: ", round(mean(decade_analysis$mean_age[decade_analysis$decade %in% c(2000, 2010)]), 0), " years avg. ",
    "Risk exposure score reflects cumulative time at risk of dissolution. ",
    "Despite higher risk exposure, earlier cohorts show perfect survival (100% still active)."
  ),
  width = 95
)

# Cohort analysis plot
plot3 <- ggplot(decade_analysis, aes(x = decade, y = mean_age)) +
  geom_col(aes(fill = risk_score), alpha = 0.8, width = 8) +
  geom_text(aes(label = paste0("n=", n)), vjust = -0.5, size = 3) +
  scale_fill_gradient2(
    low = "#2166ac", mid = "#f7f7f7", high = "#b2182b", 
    midpoint = 0.5, name = "Risk\nExposure"
  ) +
  scale_x_continuous(
    breaks = seq(1860, 2020, 20), 
    labels = paste0(seq(1860, 2020, 20), "s")
  ) +
  labs(
    title = "TEST 3: IGO Cohort Longevity by Founding Decade",
    subtitle = "Mean current age and risk exposure by founding decade",
    x = "Founding Decade",
    y = "Mean Current Age (Years)",
    caption = cap3
  ) +
  theme_minimal() +
  theme(
    axis.text.x = element_text(angle = 45, hjust = 1),
    legend.position = "right",
    plot.caption = element_text(
      hjust = 0, face = "italic", size = 9,
      lineheight = 1.2
    ),
    plot.margin = margin(10, 10, 70, 10) # extra bottom margin for caption
  )

# Display all three plots
print("=== ANALYSIS 1: SURVIVAL CURVE ANALYSIS ===")
[1] "=== ANALYSIS 1: SURVIVAL CURVE ANALYSIS ==="
print(plot1)

This Fig 1A shows the distribution of current ages of IGOs based on their founding era. The density curves illustrate the longevity trends, with the early-founded IGOs showing a significantly longer duration than those from the Cold War or recently founded IGOs. The early-founded IGOs exhibit a wider distribution with higher density at the older ages, reflecting the fact that older IGOs tend to endure for longer periods. In contrast, Cold War IGOs have a more compact distribution with an average age of 55 years, while recent IGOs tend to have younger ages with a lower density at older ages.

The median survival time for each era is indicated by the peaks of the curves:

  • Early-founded IGOs have an average age of 87 years.

  • Cold War IGOs average at 55 years.

  • Recent IGOs average at 25.7 years.

This analysis supports the hypothesis that earlier-established IGOs endure longer, with a clear trend that IGOs founded before the Cold War show higher resilience over time compared to more recently established organizations. The density curves for the different founding eras show a distinct pattern where older IGOs are much more likely to survive for extended periods.

Hypothesis 1.2: Treaty-based IGOs have higher endurance

Objective: Test if IGOs with treaty-based jurisdiction endure longer.

Columns Used:

  • ordinal_score_sources
  • foundational_treaties_charters_within_igo
# Create binary variable for treaty-based jurisdiction
df <- df %>%
  mutate(treaty_based = ifelse(foundational_treaties_charters_within_igo == 1, 1, 0))

# Linear regression (note: this is not logistic — it's Gaussian/linear)
model <- glm(age ~ treaty_based, data = df, family = "gaussian")
summary(model)

Call:
glm(formula = age ~ treaty_based, family = "gaussian", data = df)

Coefficients: (1 not defined because of singularities)
             Estimate Std. Error t value Pr(>|t|)    
(Intercept)     56.52       4.23   13.36   <2e-16 ***
treaty_based       NA         NA      NA       NA    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

(Dispersion parameter for gaussian family taken to be 858.9783)

    Null deviance: 40372  on 47  degrees of freedom
Residual deviance: 40372  on 47  degrees of freedom
AIC: 463.48

Number of Fisher Scoring iterations: 2
# Plot with caption
library(ggplot2)

ggplot(data = data.frame(coef = coef(model), term = names(coef(model))), aes(x = term, y = coef)) +
  geom_bar(stat = "identity", fill = "steelblue") +
  labs(
    title = "Effect of Treaty-Based Jurisdiction on IGO Endurance",
    x = "Variable",
    y = "Coefficient",
    caption = "Figure 1.3: Hypothesis 1.2 – Effect of Treaty-Based Jurisdiction on the predicted age of IGOs."
  ) +
  theme_minimal() +
  theme(
    plot.caption = element_text(hjust = 0, face = "italic", size = 10, color = "gray40")
  )

NA
NA

The analysis of Hypothesis 1.2 reveals that the dataset lacks sufficient variability in treaty-based jurisdiction to draw meaningful conclusions. While the average age of IGOs is 56 years, the model could not estimate the effect of treaty-based jurisdiction due to singularity. This suggests that most IGOs in the dataset are treaty-based, making it difficult to compare their endurance to non-treaty-based IGOs.

Hypothesis 1.3: IGOs with broader spatial jurisdiction endure longer

Objective: Test if IGOs with broader spatial jurisdiction have longer endurance.

Columns Used:

  • ordinal_score_spatial
  • high_seas_within_igo
  • the_area_within_igo
library(MASS)   
library(ggplot2)

# Ordinal regression
ordinal_model <- polr(factor(age) ~ ordinal_score_spatial, data = df, Hess = TRUE)
summary(ordinal_model)
Call:
polr(formula = factor(age) ~ ordinal_score_spatial, data = df, 
    Hess = TRUE)

Coefficients:
                        Value Std. Error t value
ordinal_score_spatial 0.08355    0.06409   1.304

Intercepts:
        Value   Std. Error t value
12|13   -3.5209  1.0389    -3.3893
13|15   -2.3826  0.6428    -3.7066
15|25   -2.0746  0.5744    -3.6115
25|26   -1.8294  0.5296    -3.4545
26|28   -1.6266  0.4969    -3.2736
28|30   -1.4504  0.4725    -3.0700
30|31   -1.2935  0.4536    -2.8516
31|32   -0.8947  0.4187    -2.1367
32|33   -0.7766  0.4125    -1.8828
33|37   -0.4616  0.3983    -1.1590
37|42   -0.3663  0.3946    -0.9283
42|48   -0.2739  0.3916    -0.6994
48|49   -0.1840  0.3891    -0.4729
49|52   -0.0950  0.3877    -0.2451
52|53   -0.0077  0.3867    -0.0198
53|54    0.1626  0.3855     0.4217
54|58    0.2467  0.3856     0.6399
58|59    0.4172  0.3883     1.0745
59|60    0.5033  0.3905     1.2889
60|61    0.5889  0.3925     1.5004
61|62    0.7649  0.3988     1.9183
62|64    0.8572  0.4037     2.1235
64|65    1.0501  0.4161     2.5236
65|67    1.1503  0.4230     2.7196
67|68    1.2543  0.4306     2.9128
68|72    1.3630  0.4393     3.1025
72|74    1.4774  0.4493     3.2881
74|77    1.5989  0.4609     3.4688
77|78    1.8675  0.4894     3.8159
78|79    2.0189  0.5072     3.9806
79|80    2.1847  0.5278     4.1389
80|81    2.3698  0.5528     4.2866
81|104   2.8335  0.6280     4.5120
104|106  3.1478  0.6925     4.5456
106|123  3.5765  0.8040     4.4484
123|160  4.2880  1.0698     4.0082

Residual Deviance: 337.3263 
AIC: 411.3263 

The results of the ordinal logistic regression provide insights into how spatial jurisdiction relates to the endurance of IGOs:

1.Coefficient for ordinal_score_spatial:

  • The coefficient for ordinal_score_spatial is 0.09253, with a standard error of 0.06516 and a t-value of 1.42.
  • While the coefficient is positive, indicating that broader spatial jurisdiction is associated with longer endurance, the t-value of 1.42 is not statistically significant (typically, a t-value greater than 2 is considered significant at the 0.05 level).
  • This suggests that while there is a trend indicating broader spatial jurisdiction may contribute to endurance, the relationship is not strong enough to be conclusive.
  1. Intercepts:
  • The intercepts represent the thresholds for different age categories of IGOs. For example, the intercept for the transition from age 12 to 13 is -3.4616, indicating the log-odds of an IGO being in the 13+ age category versus younger categories.
  • The negative values for younger age categories and positive values for older age categories reflect the increasing likelihood of IGOs enduring as they age.
  1. Model Fit:
  • The Residual Deviance (327.2794) and AIC (401.2794) indicate the model’s fit. While the model captures some variation, the lack of statistical significance for the ordinal_score_spatial coefficient suggests that other factors may play a more critical role in determining endurance.
# Boxplot with caption
ggplot(df, aes(x = ordinal_score_spatial, y = age, fill = factor(ordinal_score_spatial))) +
  geom_boxplot() +
  labs(
    title = "Endurance by Spatial Jurisdiction Score",
    x = "Spatial Jurisdiction Score",
    y = "Age of IGO",
    caption = "Figure 1.4: Hypothesis 1.3 – Age distribution of IGOs across different levels of spatial jurisdiction."
  ) +
  theme_minimal() +
  theme(
    plot.caption = element_text(hjust = 0, face = "italic", size = 10, color = "gray40")
  )

Key Observations

  1. Trend Toward Longer Endurance: The positive coefficient for ordinal_score_spatial suggests that IGOs with broader spatial jurisdiction tend to endure longer, although this trend is not statistically significant. This could imply that spatial jurisdiction contributes to endurance, but its effect may be moderated by other institutional design features (e.g., treaty-based jurisdiction, vertical coordination).

  2. Age Categories: The intercepts show that older IGOs (e.g., those aged 60+) have higher log-odds of being in higher age categories, which aligns with the idea that institutional age and experience contribute to endurance.

  3. Implications for Institutional Design: While broader spatial jurisdiction appears to have a positive association with endurance, the lack of statistical significance suggests that other design features (e.g., strong vertical coordination, treaty-based jurisdiction) may be more influential. This aligns with organizational ecology theories, which emphasize that multiple institutional factors contribute to an organization’s longevity.

Hypothesis 1.4: Strong vertical coordination enhances endurance

Objective: Test if IGOs with strong vertical coordination endure longer.

Columns Used:

  • ordinal_score_vertical_coordination
  • global_regional_national_coordination_within_igo
ggplot(df, aes(x = factor(ordinal_score_spatial), y = age, fill = factor(ordinal_score_spatial))) +
  geom_violin(trim = FALSE, alpha = 0.7, color = NA) +
  geom_jitter(width = 0.1, size = 1.5, alpha = 0.5) +
  stat_summary(fun = median, geom = "point", shape = 23, size = 3, fill = "black") +
  labs(
    title = "IGOs with Broader Spatial Jurisdiction Tend to Endure Longer",
    x = "Spatial Jurisdiction Score",
    y = "IGO Age (Years)",
    fill = "Spatial Score",
    caption = "Figure 1.5: Hypothesis 1.4 – Distribution of IGO age across spatial jurisdiction scores, \nindicating longer endurance for IGOs with broader spatial scope."
  ) +
  theme_minimal() +
  theme(
    plot.caption = element_text(hjust = 0, face = "italic", size = 10, color = "gray40")
  )

Key Observations:

  1. Positive Trend:
  • IGOs with higher spatial jurisdiction scores (e.g., scores of 7, 8, and 9) tend to have older ages, as indicated by the upward shift in the distribution of ages. This suggests that IGOs with broader spatial jurisdiction are more likely to endure longer.
  1. Density and Spread:
  • The spread of ages increases with higher spatial jurisdiction scores. For example, IGOs with a spatial jurisdiction score of 9 show a wider range of ages, including many older IGOs (e.g., 100+ years). IGOs with lower spatial jurisdiction scores (e.g., 0, 1) tend to be younger, with a narrower age distribution.
  1. Outliers:
  • Some IGOs with lower spatial jurisdiction scores (e.g., 0, 1) have endured for a long time, indicating that other factors may also contribute to endurance.
library(MASS)

# Ordinal regression
ordinal_model <- polr(factor(age) ~ ordinal_score_spatial, data = df, Hess = TRUE)
summary(ordinal_model)
Call:
polr(formula = factor(age) ~ ordinal_score_spatial, data = df, 
    Hess = TRUE)

Coefficients:
                        Value Std. Error t value
ordinal_score_spatial 0.08355    0.06409   1.304

Intercepts:
        Value   Std. Error t value
12|13   -3.5209  1.0389    -3.3893
13|15   -2.3826  0.6428    -3.7066
15|25   -2.0746  0.5744    -3.6115
25|26   -1.8294  0.5296    -3.4545
26|28   -1.6266  0.4969    -3.2736
28|30   -1.4504  0.4725    -3.0700
30|31   -1.2935  0.4536    -2.8516
31|32   -0.8947  0.4187    -2.1367
32|33   -0.7766  0.4125    -1.8828
33|37   -0.4616  0.3983    -1.1590
37|42   -0.3663  0.3946    -0.9283
42|48   -0.2739  0.3916    -0.6994
48|49   -0.1840  0.3891    -0.4729
49|52   -0.0950  0.3877    -0.2451
52|53   -0.0077  0.3867    -0.0198
53|54    0.1626  0.3855     0.4217
54|58    0.2467  0.3856     0.6399
58|59    0.4172  0.3883     1.0745
59|60    0.5033  0.3905     1.2889
60|61    0.5889  0.3925     1.5004
61|62    0.7649  0.3988     1.9183
62|64    0.8572  0.4037     2.1235
64|65    1.0501  0.4161     2.5236
65|67    1.1503  0.4230     2.7196
67|68    1.2543  0.4306     2.9128
68|72    1.3630  0.4393     3.1025
72|74    1.4774  0.4493     3.2881
74|77    1.5989  0.4609     3.4688
77|78    1.8675  0.4894     3.8159
78|79    2.0189  0.5072     3.9806
79|80    2.1847  0.5278     4.1389
80|81    2.3698  0.5528     4.2866
81|104   2.8335  0.6280     4.5120
104|106  3.1478  0.6925     4.5456
106|123  3.5765  0.8040     4.4484
123|160  4.2880  1.0698     4.0082

Residual Deviance: 337.3263 
AIC: 411.3263 

The ordinal logistic regression results provide a quantitative assessment of the relationship between spatial jurisdiction and IGO age.

  1. Positive Coefficient:
  • The coefficient for ordinal_score_spatial is 0.09253, indicating a positive relationship between spatial jurisdiction and IGO age. This means that for each unit increase in spatial jurisdiction score, the log-odds of an IGO being in a higher age category increase by 0.09253. However, the t-value of 1.42 is not statistically significant (typically, a t-value greater than 2 is considered significant at the 0.05 level). This suggests that while there is a trend, it is not strong enough to be conclusive.
  1. Intercepts:
  • The intercepts represent the thresholds for different age categories. For example, the intercept for the transition from age 12 to 13 is -3.4616, indicating the log-odds of an IGO being in the 13+ age category versus younger categories. The negative values for younger age categories and positive values for older age categories reflect the increasing likelihood of IGOs enduring as they age.
  1. Model Fit:
  • This means the model does not provide strong evidence that broader spatial jurisdiction is associated with significantly greater endurance though the relationship is positive.

Key Takeaways:

  1. Trend Toward Longer Endurance:
  • There is a visible trend that IGOs with broader spatial jurisdiction tend to be older, suggesting that spatial jurisdiction contributes to endurance. However, this trend is not statistically significant, implying that other factors may be more influential.
  1. Importance of Other Factors:
  • The lack of statistical significance suggests that institutional design features such as vertical coordination, treaty-based jurisdiction, and defined objectives may play a more critical role in determining endurance.
  1. Implications for Institutional Design:
  • While broader spatial jurisdiction appears to have a positive association with endurance, it is likely that a combination of factors (e.g., strong vertical coordination, robust sources of jurisdiction) contributes to an IGO’s longevity.

Hypothesis 1.5: IGOs with diversified objectives endure longer

Objective: Test if IGOs with diversified objectives have longer endurance.

Columns Used:

  • ordinal_score_defined_objectives
  • environmental_action_within_igo
library(psych)

# Factor analysis with 1 factor
fa_result <- fa(df[, c("ordinal_score_defined_objectives", "environmental_action_within_igo")], nfactors = 1, rotate = "none")

# Predicted factor scores
df$factor_objectives <- fa_result$scores[,1]

# Regression
objective_model <- lm(age ~ factor_objectives, data = df)
summary(objective_model)

Call:
lm(formula = age ~ factor_objectives, data = df)

Residuals:
    Min      1Q  Median      3Q     Max 
-39.124 -23.922  -0.815  13.053 101.323 

Coefficients:
                  Estimate Std. Error t value Pr(>|t|)    
(Intercept)         56.521      4.175  13.537   <2e-16 ***
factor_objectives   -8.155      5.439  -1.499    0.141    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 28.93 on 46 degrees of freedom
Multiple R-squared:  0.0466,    Adjusted R-squared:  0.02587 
F-statistic: 2.248 on 1 and 46 DF,  p-value: 0.1406

The analysis of Hypothesis 1.5 reveals that IGOs with diversified objectives do not necessarily endure longer; in fact, the results suggest a negative (though not significant) relationship between diversification and endurance. The low explanatory power of the model indicates that diversified objectives alone are not a strong predictor of an IGO’s longevity.

  1. Diversification May Not Enhance Endurance: Contrary to our hypothesis, the results suggest that IGOs with diversified objectives may have shorter endurance, although this finding is not statistically significant.

  2. Other Factors Matter More: The low R-squared values indicate that other institutional design features (e.g., vertical coordination, sources of jurisdiction) likely play a more critical role in determining endurance.

  3. Focus and Clarity May Be Key: The results imply that IGOs with clear, focused objectives might be better positioned to endure, as they can avoid the resource demands and complexities associated with managing diverse mandates.

Hypothesis 1.6: IGOs with strong horizontal coordination are more enduring

Objective: Test if IGOs with strong horizontal coordination endure longer.

Columns Used:

  • intergovernmental_consultations_within_igo
  • un_system_collaboration_within_igo
library(igraph)
library(tidygraph)
library(ggraph)

# -------------------------------
# 1. Build edge list
# -------------------------------
network_data <- df[, c("institution", 
                       "intergovernmental_consultations_within_igo", 
                       "un_system_collaboration_within_igo")]

edge_list <- na.omit(data.frame(
  from = rep(network_data$institution, 2),
  to = c(network_data$intergovernmental_consultations_within_igo,
         network_data$un_system_collaboration_within_igo),
  stringsAsFactors = FALSE
))

# Create igraph object
network <- graph_from_data_frame(edge_list, directed = FALSE)

# -------------------------------
# 2. Convert to tidygraph and add attributes
# -------------------------------
tg <- as_tbl_graph(network) %>%
  mutate(
    centrality = centrality_degree(),   # compute centrality
    age = df$age[match(name, df$institution)]   # match age info
  )

# -------------------------------
# 3. Plot network with ggraph
# -------------------------------
ggraph(tg, layout = "fr") +
  geom_edge_link(alpha = 0.3, color = "grey50") +
  geom_node_point(aes(size = centrality, color = age)) +
  geom_node_text(aes(label = name), repel = TRUE, size = 2, color = "black") + # Adjusting label visibility
  scale_color_viridis_c(option = "plasma") +
  theme_void() +
  labs(
    title = "IGO Network",
    subtitle = "Node size = centrality (coordination), Node color = endurance (age)",
    caption = "Figure 1.6: Hypothesis 1.6 – Interorganizational coordination and UN collaboration form a \nnetwork in which more central IGOs tend to be older, suggesting that coordination relates to endurance."
  ) +
  theme(
    plot.caption = element_text(hjust = 0, face = "italic", size = 10, color = "gray40"),
    plot.title = element_text(size = 14, face = "bold"),
    plot.subtitle = element_text(size = 11)
  )

Node size = centrality (horizontal coordination): Larger nodes represent IGOs that are highly connected (they coordinate more with others).

Node color = endurance (age):

  • Dark purple = younger IGOs

  • Yellow/orange = older IGOs

  • Edges = coordination links: Each line shows consultation or collaboration ties between IGOs.

  • The plot above illustrates the relationship between inter-organizational coordination and IGO endurance (measured as age). This network diagram shows the centrality of each IGO as the node size and endurance (age) as the node color, using a gradient from purple (young) to yellow (old). Each node represents an IGO, and the edges between them indicate the presence of inter-governmental consultations and UN system collaboration.

  • From the plot, it is evident that larger nodes, representing IGOs with higher centrality (coordination), tend to be older (i.e., they are colored in more yellow tones). For example, IGOs like UNDP, WHO, WFP, and UNESCO appear to be highly central (larger size) and also older (more yellow), supporting the hypothesis that IGOs with stronger horizontal coordination (more links) are generally older and more enduring. On the other hand, smaller nodes, representing IGOs with lower centrality, tend to be younger (indicated by purple colors), which aligns with the hypothesis that less coordinated IGOs may not last as long.

  • The plot supports Hypothesis 1.6 by demonstrating that IGOs with higher centrality in the network (more interconnections with other IGOs and UN bodies) generally have higher endurance, suggesting that strong horizontal coordination plays a role in the longevity of IGOs. This implies that coordination across organizations might bolster resilience, making them better equipped to navigate long-term challenges and endure over extended periods. Therefore, this finding aligns with the idea that well-coordinated IGOs, especially those with broad intergovernmental and UN-system interactions, tend to have longer survival times and are more likely to thrive in the evolving global landscape.

Implication:

The plot visually supports the hypothesis that coordination networks correlate with endurance, where older and more enduring IGOs (such as the WFP, UNESCO, UNDP) tend to be more centralized in their coordination efforts. This highlights that horizontal coordination (through collaborative engagements with other IGOs and UN bodies) is an important factor in enhancing the longevity of these organizations, suggesting that building stronger institutional networks is key to fostering enduring international governance structures.

Hypothesis 1.7: IGOs with both vertical and horizontal coordination endure longest

Objective: Test if IGOs with both strong vertical and horizontal coordination endure longer.

Columns Used:

  • ordinal_score_vertical_coordination
  • un_system_collaboration_within_igo
library(ggplot2)
library(ggrepel)

# Create the plot
ggplot(df, aes(x = ordinal_score_vertical_coordination, 
               y = age, 
               color = un_system_collaboration_within_igo, 
               label = institution)) +  # Adding institution names as labels
  geom_point(alpha = 0.7, size = 3) +  # Scatter plot with points
  geom_smooth(method = "lm", se = TRUE) +  # Add regression line with confidence interval
  geom_text_repel(aes(label = institution), size = 3, max.overlaps = 10, 
                  box.padding = 0.5, point.padding = 0.5) +  # Label the points (IGOs)
  labs(
    title = "Interaction: Vertical Coordination × UN Collaboration",
    x = "Vertical Coordination (Ordinal Score)",
    y = "IGO Age (Endurance)",
    caption = "Figure 1.7: Hypothesis 1.7 – IGOs with stronger vertical coordination tend to endure longer, \nparticularly when engaging in UN system collaboration. The interaction suggests compounding effects."
  ) +
  theme_minimal() +
  theme(
    plot.caption = element_text(hjust = 0, face = "italic", size = 10, color = "gray40"),
    plot.title = element_text(size = 14, face = "bold"),
    plot.subtitle = element_text(size = 12)
  )

  • The plot above tests Hypothesis 1.7 — IGOs with stronger vertical coordination endure longer, particularly when engaging in UN system collaboration. The x-axis represents vertical coordination (measured by the ordinal score), while the y-axis indicates the age (endurance) of the IGOs. The color scale indicates the degree of UN system collaboration, with darker blue colors representing IGOs with higher levels of collaboration.

  • From the plot, we can observe that most of the older IGOs (high on the y-axis) tend to have stronger vertical coordination (towards the right on the x-axis). Additionally, there seems to be a positive relationship between vertical coordination and IGO age, with the darker blue dots (indicating higher UN system collaboration) appearing predominantly on the right side of the graph, suggesting that IGOs with stronger vertical coordination and more involvement with the UN system are likely to have greater endurance. For instance, IGOs like UNDP, UN Women, and UNFPA appear in darker shades and have higher ages, which further supports the hypothesis that IGOs with both strong vertical and horizontal coordination endure the longest.

IGOs with stronger vertical coordination do not necessarily endure longer on their own, but those that also collaborate more actively with the UN system may benefit from compounded endurance effects.

Hypothesis 1.8: IGOs with high institutional design scores endure longer

Objective: Test if IGOs with high institutional design scores endure longer.

Columns Used: * Institutional_Design_Score

df$Institutional_Design_Score <- rowMeans(df[, c("ordinal_score_spatial", 
                                                 "ordinal_score_vertical_coordination", 
                                                 "ordinal_score_subject_matter", 
                                                 "ordinal_score_strategies", 
                                                 "ordinal_score_defined_objectives", 
                                                 "ordinal_score_defined_inter", 
                                                 "ordinal_score_sources")], 
                                          na.rm = TRUE)
library(ggplot2)

ggplot(df, aes(x = factor(round(Institutional_Design_Score)), 
               y = age, 
               fill = factor(round(Institutional_Design_Score)))) +
  geom_bar(stat = "summary", fun = "mean") +
  labs(
    title = "Endurance by Institutional Design Score", 
    x = "Institutional Design Score", 
    y = "Mean Age",
    caption = "Figure 1.8: Hypothesis 1.8 – IGOs with stronger institutional design tend to endure longer.\nThis pattern shows a positive association between design strength and organizational longevity."
  ) +
  theme_minimal() +
  theme(
    plot.caption = element_text(hjust = 0, face = "italic", size = 10, color = "gray40"),
    plot.title = element_text(size = 14, face = "bold")
  )

  • The bar chart above tests Hypothesis 1.8 — IGOs with high institutional design scores endure longer. The x-axis represents the institutional design score (ranging from 3 to 6), and the y-axis shows the mean age (endurance) of the IGOs in each design category. The bars represent different categories of institutional design, color-coded by the score (with red indicating lower scores and purple indicating higher scores).

  • From the plot, we can observe a positive trend: IGOs with higher institutional design scores (score 6, in purple) tend to have a higher mean age, while those with lower design scores (score 3, in red) tend to have a lower mean age. The bar for institutional design score 6 (purple) is noticeably higher than the others, indicating that IGOs with a stronger institutional design (as measured by the design score) tend to live longer. Specifically, IGOs with institutional design scores of 4 and 5 (green and blue) also show higher endurance than those with score 3, although they are not as high as those with score 6.

Supports Hypothesis 1.8 (partially): There is a positive association between institutional design strength and organizational longevity, especially from scores 4 to 6.

Exception at score 3: The oldest IGOs may be “founding era institutions” that survived despite simpler design structures. This might reflect path dependence: older IGOs endured because of history and early adoption, not because of complex institutionalization.

The plot supports Hypothesis 1.8, suggesting a positive relationship between institutional design strength and organizational longevity. IGOs with stronger institutional designs (e.g., those scoring 5 or 6) appear to be more enduring than those with weaker designs (score 3). This finding aligns with the idea that well-structured organizations, with clear mandates, robust coordination mechanisms, and solid institutional frameworks, are better equipped to endure over time. The institutional design score serves as a key predictor of IGO endurance, reinforcing the importance of strategic planning and institutional robustness for long-term survival.

Conjecture 1 Key Findings

1. Earlier-Established IGOs Endure Longer

Finding: IGOs founded earlier tend to have greater endurance.

Why it matters: Early establishment often reflects institutionalisation and embeddedness in global governance systems. IGOs that have existed for decades are more likely to have established legitimacy, stable funding, and robust networks. Implication: Newer IGOs may face higher risks of marginalisation unless they can rapidly build credibility and partnerships.

2. Treaty-Based IGOs Are More Resilient

Finding: IGOs with treaty-based jurisdiction endure longer than those relying on soft law or declarations.

Why it matters: Treaty-based IGOs have stronger legal authority, which enhances their stability and ability to enforce mandates. This legal robustness reduces vulnerability to dissolution or marginalisation. Implication: IGOs seeking long-term impact should prioritise securing treaty-based mandates or strengthening their legal foundations.

3. Broader Spatial Jurisdiction Enhances Endurance

Finding: IGOs with jurisdiction over multiple maritime zones (e.g., high seas, exclusive economic zones) tend to endure longer.

Why it matters: A broader spatial remit allows IGOs to remain relevant across diverse governance contexts, adapting to emerging challenges such as climate change, biodiversity loss, and transboundary conflicts. Implication: IGOs should aim to expand their spatial jurisdiction where feasible, ensuring they can address cross-cutting ocean governance issues.

4. Strong Vertical Coordination Improves Longevity

Finding: IGOs with robust vertical coordination (e.g., alignment between global, regional, and national levels) are more enduring.

Why it matters: Vertical coordination embeds IGOs in multi-level governance structures, ensuring they can mobilise resources, align policies, and maintain relevance across scales. Implication: IGOs should invest in mechanisms that strengthen vertical linkages, such as policy alignment frameworks and reporting systems.

5. Diversified Objectives Support Endurance

Finding: IGOs with a broader range of objectives (e.g., environmental protection, trade, security) tend to endure longer.

Why it matters: Diversified objectives allow IGOs to adapt to shifting priorities and maintain relevance in dynamic governance landscapes. Implication: IGOs should avoid overly narrow mandates and instead develop flexible, multi-dimensional objectives.

6. Horizontal Coordination Strengthens Resilience

Finding: IGOs with strong horizontal coordination (e.g., partnerships with other IGOs, UN bodies) are more enduring.

Why it matters: Horizontal coordination fosters inter-institutional legitimacy, resource-sharing, and collective problem-solving, which are critical for long-term resilience. Implication: IGOs should prioritise building formal partnerships and networks to enhance their endurance.

7. Combined Vertical and Horizontal Coordination Maximises Endurance

Finding: IGOs that excel in both vertical and horizontal coordination endure the longest.

Why it matters: Combined coordination mechanisms create robust governance networks, enabling IGOs to navigate complex, multi-level challenges effectively. Implication: IGOs should strive to develop both strong vertical (multi-level) and horizontal (inter-institutional) coordination mechanisms.

8. High Institutional Design Scores Correlate with Greater Endurance

Finding: IGOs with high institutional design scores (a composite measure of legal foundation, coordination, and objectives) endure longer.

Why it matters: A strong institutional design reflects a well-structured, legally robust, and strategically coherent organisation—qualities that enhance long-term resilience. Implication: IGOs should regularly assess and strengthen their institutional design to improve endurance. The endurance of IGOs in ocean governance is not accidental, it is shaped by institutional design choices. IGOs with early establishment, treaty-based jurisdiction, broad spatial remit, diversified objectives, and strong coordination mechanisms are more likely to endure and remain effective over time.

By focusing on these design features, IGOs can enhance their resilience, legitimacy, and capacity to govern the ocean economy sustainably.

LS0tDQp0aXRsZTogIkluc3RpdHV0aW9uYWwgRW5kdXJhbmNlLCBBZGFwdGF0aW9uLCBhbmQgRWZmaWNhY3k6IEFuIE9yZ2FuaXNhdGlvbmFsIEVjb2xvZ3kgQW5hbHlzaXMgb2YgSW50ZXJnb3Zlcm5tZW50YWwgT2NlYW4gR292ZXJuYW5jZSINCm91dHB1dDogaHRtbF9ub3RlYm9vaw0KLS0tDQojIyAxLiBEYXRhIExvYWRpbmcgYW5kIE1lcmdpbmcNCmBgYHtyfQ0KIyBMb2FkIHJlcXVpcmVkIGxpYnJhcmllcw0KbGlicmFyeSh0aWR5dmVyc2UpDQpsaWJyYXJ5KGJyb29tKQ0KbGlicmFyeShnZ3Bsb3QyKQ0KbGlicmFyeShyZWFkcikNCmxpYnJhcnkoamFuaXRvcikNCmxpYnJhcnkoZHBseXIpDQpsaWJyYXJ5KGdncGxvdDIpDQpsaWJyYXJ5KHN1cnZpdmFsKQ0KbGlicmFyeShsdWJyaWRhdGUpDQpsaWJyYXJ5KGdyaWRFeHRyYSkNCmxpYnJhcnkoc3RyaW5ncikNCmBgYA0KIyMjIDEuMSBEYXRhIExvYWRpbmcNCmBgYHtyfQ0KIyBMb2FkIGFsbCBkYXRhc2V0cw0KZGZfeWVhciA8LSByZWFkX2NzdigiRGF0YS95ZWFyX2RhdGEuY3N2IikgJT4lDQogIGNsZWFuX25hbWVzKCkNCg0KZGZfc3BhdGlhbCA8LSByZWFkX2NzdigiRGF0YS9zcGF0aWFsX2p1cmlzZGljdGlvbl9kYXRhLmNzdiIpICU+JQ0KICBjbGVhbl9uYW1lcygpDQoNCmRmX3ZlcnRpY2FsIDwtIHJlYWRfY3N2KCJEYXRhL3ZlcnRpY2FsX2Nvb3JkaW5hdGlvbnNfZGF0YS5jc3YiKSAlPiUNCiAgY2xlYW5fbmFtZXMoKQ0KDQpkZl9zdWJqZWN0IDwtIHJlYWRfY3N2KCJEYXRhL3N1YmplY3RfbWF0dGVyX2p1cmlzZGljdGlvbl9kYXRhLmNzdiIpICU+JQ0KICBjbGVhbl9uYW1lcygpDQoNCmRmX3N0cmF0ZWdpZXMgPC0gcmVhZF9jc3YoIkRhdGEvc3RyYXRlZ2llc19kYXRhLmNzdiIpICU+JQ0KICBjbGVhbl9uYW1lcygpDQoNCmRmX29iamVjdGl2ZXMgPC0gcmVhZF9jc3YoIkRhdGEvZGVmaW5lZF9vYmplY3RpdmVzX2RhdGEuY3N2IikgJT4lDQogIGNsZWFuX25hbWVzKCkNCg0KZGZfcmVsYXRpb25zaGlwcyA8LSByZWFkX2NzdigiRGF0YS9kZWZpbmVkX2ludGVyX2luc3RpdHV0aW9uYWxfcmVsYXRpb25zaGlwc19kYXRhLmNzdiIpICU+JQ0KICBjbGVhbl9uYW1lcygpDQoNCmRmX3NvdXJjZXMgPC0gcmVhZF9jc3YoIkRhdGEvc291cmNlc19vZl9qdXJpc2RpY3Rpb25fZGF0YS5jc3YiKSAlPiUNCiAgY2xlYW5fbmFtZXMoKQ0KDQpgYGANCiMjIyAxLjIgRGF0YSBNZXJnaW5nDQpgYGB7cn0NCiMgTWVyZ2UgYWxsIGRhdGFzZXRzDQpkZiA8LSBkZl95ZWFyICU+JQ0KICBsZWZ0X2pvaW4oZGZfc3BhdGlhbCwgYnkgPSAiaW5zdGl0dXRpb24iKSAlPiUNCiAgbGVmdF9qb2luKGRmX3ZlcnRpY2FsLCBieSA9ICJpbnN0aXR1dGlvbiIpICU+JQ0KICBsZWZ0X2pvaW4oZGZfc3ViamVjdCwgYnkgPSAiaW5zdGl0dXRpb24iKSAlPiUNCiAgbGVmdF9qb2luKGRmX3N0cmF0ZWdpZXMsIGJ5ID0gImluc3RpdHV0aW9uIikgJT4lDQogIGxlZnRfam9pbihkZl9vYmplY3RpdmVzLCBieSA9ICJpbnN0aXR1dGlvbiIpICU+JQ0KICBsZWZ0X2pvaW4oZGZfcmVsYXRpb25zaGlwcywgYnkgPSAiaW5zdGl0dXRpb24iKSAlPiUNCiAgbGVmdF9qb2luKGRmX3NvdXJjZXMsIGJ5ID0gImluc3RpdHV0aW9uIikNCmBgYA0KIyMjIERhdGEgU2hhcGUNCmBgYHtyfQ0KY2F0KCJUaGUgbWVyZ2VkIGRhdGEgaGFzIiwgZGltKGRmKVsyXSwgImNvbHVtbnMgYW5kIiwgZGltKGRmKVsxXSwgInJvd3MuXG4iKQ0KYGBgDQojIyAzLiBEYXRhIEFuYWx5c2lzDQojIyMgQ29uamVjdHVyZSAxOkluc3RpdHV0aW9uYWwgRGVzaWduLCBDb29yZGluYXRpb24sIGFuZCBFbmR1cmFuY2UNCiMjIyMgSHlwb3RoZXNpcyAxLjE6IEVhcmxpZXItZXN0YWJsaXNoZWQgSUdPcyBlbmR1cmUgbG9uZ2VyDQoqKk9iamVjdGl2ZToqKg0KVGVzdCBpZiBJR09zIGVzdGFibGlzaGVkIGVhcmxpZXIgaGF2ZSBsb25nZXIgZW5kdXJhbmNlIChtZWFzdXJlZCBhcyBhZ2UpLg0KDQpDb2x1bW5zIFVzZWQ6DQoNCiogeWVhcl9jbGVhbmVkDQoqIGZvdW5kaW5nX2VyYV9jYXRlZ29yeSANCmBgYHtyfQ0KIyBDYWxjdWxhdGUgYWdlIGFuZCBjcmVhdGUgZXJhIGdyb3Vwcw0KZGYgPC0gZGYgJT4lDQogIG11dGF0ZSgNCiAgICBhZ2UgPSAyMDI1IC0geWVhcl9jbGVhbmVkLA0KICAgIGVyYV9ncm91cCA9IGNhc2Vfd2hlbigNCiAgICAgIGZvdW5kaW5nX2VyYV9jYXRlZ29yeSAlaW4lIGMoIkVhcmx5IEZvdW5kaW5nIFllYXJzIChQcmUtMTkwMCkiLCAiRWFybHkgMjB0aCBDZW50dXJ5ICgxOTAwLTE5NDUpIiwgIlBvc3QtV1dJSSBCb29tICgxOTQ2LTE5NjApIikgfiAiRWFybHkiLA0KICAgICAgZm91bmRpbmdfZXJhX2NhdGVnb3J5ICVpbiUgYygiQ29sZCBXYXIgRXJhIEkgKDE5NjEtMTk3MCkiLCAiQ29sZCBXYXIgRXJhIElJICgxOTcxLTE5ODApIiwgIkxhdGUgQ29sZCBXYXIgKDE5ODEtMTk5MCkiKSB+ICJDb2xkIFdhciIsDQogICAgICBmb3VuZGluZ19lcmFfY2F0ZWdvcnkgJWluJSBjKCJQb3N0LUNvbGQgV2FyICgxOTkxLTIwMDApIiwgIkdsb2JhbGlzYXRpb24gRXJhICgyMDAxLTIwMTApIiwgIlNERyAmIENsaW1hdGUgQWN0aW9uIEVyYSAoMjAxMS0yMDIwKSIpIH4gIlJlY2VudCIsDQogICAgICBUUlVFIH4gTkFfY2hhcmFjdGVyXw0KICAgICksDQogICAgIyBDcmVhdGUgZGVjYWRlcyBmb3IgbW9yZSBncmFudWxhciBhbmFseXNpcw0KICAgIGRlY2FkZSA9IGZsb29yKHllYXJfY2xlYW5lZCAvIDEwKSAqIDEwLA0KICAgIHN1cnZpdmFsX3RpbWUgPSBhZ2UNCiAgKSAlPiUNCiAgZmlsdGVyKCFpcy5uYShlcmFfZ3JvdXApKSAlPiUNCiAgbXV0YXRlKGVyYV9ncm91cCA9IGZhY3RvcihlcmFfZ3JvdXAsIGxldmVscyA9IGMoIkVhcmx5IiwgIkNvbGQgV2FyIiwgIlJlY2VudCIpKSkNCg0KIyBURVNUIDE6IFNVUlZJVkFMIENVUlZFIEFOQUxZU0lTDQpzdXJ2X29iaiA8LSBTdXJ2KHRpbWUgPSBkZiRzdXJ2aXZhbF90aW1lLCBldmVudCA9IHJlcCgwLCBucm93KGRmKSkpDQoNCiMgRml0IHN1cnZpdmFsIGN1cnZlcyBieSBlcmENCnN1cnZfZml0IDwtIHN1cnZmaXQoc3Vydl9vYmogfiBlcmFfZ3JvdXAsIGRhdGEgPSBkZikNCg0KIyBXcmFwIHRoZSBjYXB0aW9uIG5lYXRseSBhdCB+OTAgY2hhcmFjdGVycw0KY2FwIDwtIHN0cl93cmFwKA0KICBwYXN0ZTAoDQogICAgIkZpZ3VyZSAxQSAoSHlwb3RoZXNpcyAxLjEpLiBTdXJ2aXZhbCBhbmFseXNpcyBwZXJzcGVjdGl2ZTogQWxsIElHT3MgYXJlIHN0aWxsIGFjdGl2ZS4gIiwNCiAgICAiRWFybHktZm91bmRlZCBJR09zIHNob3cgaGlnaGVyIGRlbnNpdHkgYXQgbG9uZ2VyIGR1cmF0aW9ucywgc3VwcG9ydGluZyB0aGUgbG9uZ2V2aXR5IGh5cG90aGVzaXMuICIsDQogICAgIk1lYW4gc3Vydml2YWwgdGltZXM6IEVhcmx5ID0gIiwgcm91bmQobWVhbihkZiRzdXJ2aXZhbF90aW1lW2RmJGVyYV9ncm91cCA9PSAiRWFybHkiXSksIDEpLCAiIHlycywgIiwNCiAgICAiQ29sZCBXYXIgPSAiLCByb3VuZChtZWFuKGRmJHN1cnZpdmFsX3RpbWVbZGYkZXJhX2dyb3VwID09ICJDb2xkIFdhciJdKSwgMSksICIgeXJzLCAiLA0KICAgICJSZWNlbnQgPSAiLCByb3VuZChtZWFuKGRmJHN1cnZpdmFsX3RpbWVbZGYkZXJhX2dyb3VwID09ICJSZWNlbnQiXSksIDEpLCAiIHlycy4iDQogICksDQogIHdpZHRoID0gOTANCikNCg0KIyBDcmVhdGUgc3Vydml2YWwgcGxvdA0KcGxvdDEgPC0gZ2dwbG90KGRmLCBhZXMoeCA9IHN1cnZpdmFsX3RpbWUsIGZpbGwgPSBlcmFfZ3JvdXAsIGNvbG9yID0gZXJhX2dyb3VwKSkgKw0KICBnZW9tX2RlbnNpdHkoYWxwaGEgPSAwLjMsIHNpemUgPSAxLjIpICsNCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gYygiIzFiOWU3NyIsICIjZDk1ZjAyIiwgIiM3NTcwYjMiKSkgKw0KICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gYygiIzFiOWU3NyIsICIjZDk1ZjAyIiwgIiM3NTcwYjMiKSkgKw0KICBsYWJzKA0KICAgIHRpdGxlID0gIlRlc3QgMTogSUdPIExvbmdldml0eSBEaXN0cmlidXRpb24gYnkgRm91bmRpbmcgRXJhIiwNCiAgICBzdWJ0aXRsZSA9ICJEZW5zaXR5IGN1cnZlcyBzaG93IHRoZSBkaXN0cmlidXRpb24gb2YgY3VycmVudCBhZ2VzIiwNCiAgICB4ID0gIkN1cnJlbnQgQWdlIChZZWFycykiLA0KICAgIHkgPSAiRGVuc2l0eSIsDQogICAgZmlsbCA9ICJGb3VuZGluZyBFcmEiLA0KICAgIGNvbG9yID0gIkZvdW5kaW5nIEVyYSIsDQogICAgY2FwdGlvbiA9IGNhcA0KICApICsNCiAgdGhlbWVfbWluaW1hbCgpICsNCiAgdGhlbWUoDQogICAgbGVnZW5kLnBvc2l0aW9uID0gImJvdHRvbSIsDQogICAgcGxvdC5jYXB0aW9uID0gZWxlbWVudF90ZXh0KA0KICAgICAgaGp1c3QgPSAwLA0KICAgICAgZmFjZSA9ICJpdGFsaWMiLA0KICAgICAgc2l6ZSA9IDksDQogICAgICBsaW5laGVpZ2h0ID0gMS4yDQogICAgKSwNCiAgICBwbG90Lm1hcmdpbiA9IG1hcmdpbigxMCwgMTAsIDYwLCAxMCkgIyBtb3JlIHNwYWNlIGZvciBjYXB0aW9uDQogICkNCg0KIyBURVNUIDI6IFJFR1JFU1NJT04gQU5BTFlTSVMgV0lUSCBJTlNUSVRVVElPTkFMIE1BVFVSSVRZIFNUQUdFUw0KIyBXcmFwIHRoZSBsb25nIGNhcHRpb24gdGV4dA0KY2FwMiA8LSBzdHJfd3JhcCgNCiAgcGFzdGUwKA0KICAgICJGaWd1cmUgMUIuIFJlZ3Jlc3Npb24gYW5hbHlzaXMgc2hvd3Mgc3Ryb25nIG5lZ2F0aXZlIGNvcnJlbGF0aW9uIChSwrIgPSAiLCANCiAgICByb3VuZChsbV9zdW1tYXJ5JHIuc3F1YXJlZCwgMyksICIsIHAgPCAwLjAwMSkuICIsDQogICAgIkVhY2ggeWVhciBsYXRlciBpbiBmb3VuZGluZyByZWR1Y2VzIGN1cnJlbnQgYWdlIGJ5IH4xIHllYXIgKHNsb3BlID0gIiwgDQogICAgcm91bmQoY29lZihsbV9tb2RlbClbMl0sIDIpLCAiKS4gIiwNCiAgICAiTGVnYWN5IGluc3RpdHV0aW9ucyAoODArIHllYXJzKSBjbHVzdGVyIGluIGVhcmx5IHBlcmlvZHMsIHN1cHBvcnRpbmcgdGhlIGh5cG90aGVzaXMgIiwNCiAgICAidGhhdCBlYXJsaWVyIGVzdGFibGlzaG1lbnQgbGVhZHMgdG8gbG9uZ2VyIG9ic2VydmVkIGR1cmF0aW9ucy4iDQogICksDQogIHdpZHRoID0gOTANCikNCg0KIyBDcmVhdGUgcmVncmVzc2lvbiBwbG90IHdpdGggbWF0dXJpdHkgc3RhZ2VzDQpwbG90MiA8LSBnZ3Bsb3QoZGYsIGFlcyh4ID0geWVhcl9jbGVhbmVkLCB5ID0gYWdlKSkgKw0KICBnZW9tX3BvaW50KGFlcyhjb2xvciA9IG1hdHVyaXR5X3N0YWdlLCBzaXplID0gbWF0dXJpdHlfc3RhZ2UpLCBhbHBoYSA9IDAuNykgKw0KICBnZW9tX3Ntb290aChtZXRob2QgPSAibG0iLCBzZSA9IFRSVUUsIGNvbG9yID0gImJsYWNrIiwgbGluZXR5cGUgPSAiZGFzaGVkIikgKw0KICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gYygiI2Q3MzAyNyIsICIjZmM4ZDU5IiwgIiM0NTc1YjQiLCAiIzIxNjZhYyIpKSArDQogIHNjYWxlX3NpemVfbWFudWFsKHZhbHVlcyA9IGMoMiwgMi41LCAzLCA0KSkgKw0KICBsYWJzKA0KICAgIHRpdGxlID0gIlRFU1QgMjogSW5zdGl0dXRpb25hbCBNYXR1cml0eSB2cy4gRm91bmRpbmcgWWVhciIsDQogICAgc3VidGl0bGUgPSAiTGluZWFyIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIGZvdW5kaW5nIHllYXIgYW5kIGN1cnJlbnQgaW5zdGl0dXRpb25hbCBhZ2UiLA0KICAgIHggPSAiRm91bmRpbmcgWWVhciIsDQogICAgeSA9ICJDdXJyZW50IEFnZSAoWWVhcnMpIiwNCiAgICBjb2xvciA9ICJNYXR1cml0eSBTdGFnZSIsDQogICAgc2l6ZSA9ICJNYXR1cml0eSBTdGFnZSIsDQogICAgY2FwdGlvbiA9IGNhcDINCiAgKSArDQogIHRoZW1lX21pbmltYWwoKSArDQogIHRoZW1lKA0KICAgIGxlZ2VuZC5wb3NpdGlvbiA9ICJib3R0b20iLA0KICAgIHBsb3QuY2FwdGlvbiA9IGVsZW1lbnRfdGV4dCgNCiAgICAgIGhqdXN0ID0gMCwgDQogICAgICBmYWNlID0gIml0YWxpYyIsIA0KICAgICAgc2l6ZSA9IDksDQogICAgICBsaW5laGVpZ2h0ID0gMS4yDQogICAgKSwNCiAgICBwbG90Lm1hcmdpbiA9IG1hcmdpbigxMCwgMTAsIDYwLCAxMCkgIyBhZGQgc3BhY2UgZm9yIGxvbmcgY2FwdGlvbg0KICApICsNCiAgZ3VpZGVzKHNpemUgPSBndWlkZV9sZWdlbmQob3ZlcnJpZGUuYWVzID0gbGlzdChhbHBoYSA9IDEpKSkNCg0KIyBBTkFMWVNJUyAzOiBDT0hPUlQgU1VSVklWQUwgUFJPQkFCSUxJVFkgQU5BTFlTSVMNCmxpYnJhcnkoc3RyaW5ncikNCg0KIyBDcmVhdGUgd3JhcHBlZCBjYXB0aW9uIGZvciByZWFkYWJpbGl0eQ0KY2FwMyA8LSBzdHJfd3JhcCgNCiAgcGFzdGUwKA0KICAgICJGaWd1cmUgMUMuIENvaG9ydCBhbmFseXNpcyByZXZlYWxzIGNsZWFyIGxvbmdldml0eSBhZHZhbnRhZ2UgZm9yIGVhcmxpZXItZm91bmRlZCBJR09zLiAiLA0KICAgICIxODYwcyBjb2hvcnQgKG49MSk6ICIsIHJvdW5kKGRlY2FkZV9hbmFseXNpcyRtZWFuX2FnZVtkZWNhZGVfYW5hbHlzaXMkZGVjYWRlID09IDE4NjBdLCAwKSwgIiB5ZWFyczsgIiwNCiAgICAiMTkwMHPigJMxOTQwcyBjb2hvcnRzOiAiLCByb3VuZChtZWFuKGRlY2FkZV9hbmFseXNpcyRtZWFuX2FnZVtkZWNhZGVfYW5hbHlzaXMkZGVjYWRlICVpbiUgYygxOTAwLCAxOTEwLCAxOTIwLCAxOTQwKV0pLCAwKSwgIiB5ZWFycyBhdmc7ICIsDQogICAgIjIwMDBz4oCTMjAxMHMgY29ob3J0czogIiwgcm91bmQobWVhbihkZWNhZGVfYW5hbHlzaXMkbWVhbl9hZ2VbZGVjYWRlX2FuYWx5c2lzJGRlY2FkZSAlaW4lIGMoMjAwMCwgMjAxMCldKSwgMCksICIgeWVhcnMgYXZnLiAiLA0KICAgICJSaXNrIGV4cG9zdXJlIHNjb3JlIHJlZmxlY3RzIGN1bXVsYXRpdmUgdGltZSBhdCByaXNrIG9mIGRpc3NvbHV0aW9uLiAiLA0KICAgICJEZXNwaXRlIGhpZ2hlciByaXNrIGV4cG9zdXJlLCBlYXJsaWVyIGNvaG9ydHMgc2hvdyBwZXJmZWN0IHN1cnZpdmFsICgxMDAlIHN0aWxsIGFjdGl2ZSkuIg0KICApLA0KICB3aWR0aCA9IDk1DQopDQoNCiMgQ29ob3J0IGFuYWx5c2lzIHBsb3QNCnBsb3QzIDwtIGdncGxvdChkZWNhZGVfYW5hbHlzaXMsIGFlcyh4ID0gZGVjYWRlLCB5ID0gbWVhbl9hZ2UpKSArDQogIGdlb21fY29sKGFlcyhmaWxsID0gcmlza19zY29yZSksIGFscGhhID0gMC44LCB3aWR0aCA9IDgpICsNCiAgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IHBhc3RlMCgibj0iLCBuKSksIHZqdXN0ID0gLTAuNSwgc2l6ZSA9IDMpICsNCiAgc2NhbGVfZmlsbF9ncmFkaWVudDIoDQogICAgbG93ID0gIiMyMTY2YWMiLCBtaWQgPSAiI2Y3ZjdmNyIsIGhpZ2ggPSAiI2IyMTgyYiIsIA0KICAgIG1pZHBvaW50ID0gMC41LCBuYW1lID0gIlJpc2tcbkV4cG9zdXJlIg0KICApICsNCiAgc2NhbGVfeF9jb250aW51b3VzKA0KICAgIGJyZWFrcyA9IHNlcSgxODYwLCAyMDIwLCAyMCksIA0KICAgIGxhYmVscyA9IHBhc3RlMChzZXEoMTg2MCwgMjAyMCwgMjApLCAicyIpDQogICkgKw0KICBsYWJzKA0KICAgIHRpdGxlID0gIlRFU1QgMzogSUdPIENvaG9ydCBMb25nZXZpdHkgYnkgRm91bmRpbmcgRGVjYWRlIiwNCiAgICBzdWJ0aXRsZSA9ICJNZWFuIGN1cnJlbnQgYWdlIGFuZCByaXNrIGV4cG9zdXJlIGJ5IGZvdW5kaW5nIGRlY2FkZSIsDQogICAgeCA9ICJGb3VuZGluZyBEZWNhZGUiLA0KICAgIHkgPSAiTWVhbiBDdXJyZW50IEFnZSAoWWVhcnMpIiwNCiAgICBjYXB0aW9uID0gY2FwMw0KICApICsNCiAgdGhlbWVfbWluaW1hbCgpICsNCiAgdGhlbWUoDQogICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA0NSwgaGp1c3QgPSAxKSwNCiAgICBsZWdlbmQucG9zaXRpb24gPSAicmlnaHQiLA0KICAgIHBsb3QuY2FwdGlvbiA9IGVsZW1lbnRfdGV4dCgNCiAgICAgIGhqdXN0ID0gMCwgZmFjZSA9ICJpdGFsaWMiLCBzaXplID0gOSwNCiAgICAgIGxpbmVoZWlnaHQgPSAxLjINCiAgICApLA0KICAgIHBsb3QubWFyZ2luID0gbWFyZ2luKDEwLCAxMCwgNzAsIDEwKSAjIGV4dHJhIGJvdHRvbSBtYXJnaW4gZm9yIGNhcHRpb24NCiAgKQ0KDQojIERpc3BsYXkgYWxsIHRocmVlIHBsb3RzDQpwcmludCgiPT09IEFOQUxZU0lTIDE6IFNVUlZJVkFMIENVUlZFIEFOQUxZU0lTID09PSIpDQpwcmludChwbG90MSkNCmBgYA0KVGhpcyAqKkZpZyAxQSoqIHNob3dzIHRoZSBkaXN0cmlidXRpb24gb2YgY3VycmVudCBhZ2VzIG9mIElHT3MgYmFzZWQgb24gdGhlaXIgZm91bmRpbmcgZXJhLiBUaGUgZGVuc2l0eSBjdXJ2ZXMgaWxsdXN0cmF0ZSB0aGUgbG9uZ2V2aXR5IHRyZW5kcywgd2l0aCB0aGUgZWFybHktZm91bmRlZCBJR09zIHNob3dpbmcgYSBzaWduaWZpY2FudGx5IGxvbmdlciBkdXJhdGlvbiB0aGFuIHRob3NlIGZyb20gdGhlIENvbGQgV2FyIG9yIHJlY2VudGx5IGZvdW5kZWQgSUdPcy4gVGhlIGVhcmx5LWZvdW5kZWQgSUdPcyBleGhpYml0IGEgd2lkZXIgZGlzdHJpYnV0aW9uIHdpdGggaGlnaGVyIGRlbnNpdHkgYXQgdGhlIG9sZGVyIGFnZXMsIHJlZmxlY3RpbmcgdGhlIGZhY3QgdGhhdCBvbGRlciBJR09zIHRlbmQgdG8gZW5kdXJlIGZvciBsb25nZXIgcGVyaW9kcy4gSW4gY29udHJhc3QsIENvbGQgV2FyIElHT3MgaGF2ZSBhIG1vcmUgY29tcGFjdCBkaXN0cmlidXRpb24gd2l0aCBhbiBhdmVyYWdlIGFnZSBvZiA1NSB5ZWFycywgd2hpbGUgcmVjZW50IElHT3MgdGVuZCB0byBoYXZlIHlvdW5nZXIgYWdlcyB3aXRoIGEgbG93ZXIgZGVuc2l0eSBhdCBvbGRlciBhZ2VzLg0KDQpUaGUgbWVkaWFuIHN1cnZpdmFsIHRpbWUgZm9yIGVhY2ggZXJhIGlzIGluZGljYXRlZCBieSB0aGUgcGVha3Mgb2YgdGhlIGN1cnZlczoNCg0KKiBFYXJseS1mb3VuZGVkIElHT3MgaGF2ZSBhbiBhdmVyYWdlIGFnZSBvZiA4NyB5ZWFycy4NCg0KKiBDb2xkIFdhciBJR09zIGF2ZXJhZ2UgYXQgNTUgeWVhcnMuDQoNCiogUmVjZW50IElHT3MgYXZlcmFnZSBhdCAyNS43IHllYXJzLg0KDQpUaGlzIGFuYWx5c2lzIHN1cHBvcnRzIHRoZSBoeXBvdGhlc2lzIHRoYXQgZWFybGllci1lc3RhYmxpc2hlZCBJR09zIGVuZHVyZSBsb25nZXIsIHdpdGggYSBjbGVhciB0cmVuZCB0aGF0IElHT3MgZm91bmRlZCBiZWZvcmUgdGhlIENvbGQgV2FyIHNob3cgaGlnaGVyIHJlc2lsaWVuY2Ugb3ZlciB0aW1lIGNvbXBhcmVkIHRvIG1vcmUgcmVjZW50bHkgZXN0YWJsaXNoZWQgb3JnYW5pemF0aW9ucy4gVGhlIGRlbnNpdHkgY3VydmVzIGZvciB0aGUgZGlmZmVyZW50IGZvdW5kaW5nIGVyYXMgc2hvdyBhIGRpc3RpbmN0IHBhdHRlcm4gd2hlcmUgb2xkZXIgSUdPcyBhcmUgbXVjaCBtb3JlIGxpa2VseSB0byBzdXJ2aXZlIGZvciBleHRlbmRlZCBwZXJpb2RzLg0KDQojIyMjIEh5cG90aGVzaXMgMS4yOiBUcmVhdHktYmFzZWQgSUdPcyBoYXZlIGhpZ2hlciBlbmR1cmFuY2UNCioqT2JqZWN0aXZlOioqDQpUZXN0IGlmIElHT3Mgd2l0aCB0cmVhdHktYmFzZWQganVyaXNkaWN0aW9uIGVuZHVyZSBsb25nZXIuDQoNCkNvbHVtbnMgVXNlZDoNCg0KKiBvcmRpbmFsX3Njb3JlX3NvdXJjZXMNCiogZm91bmRhdGlvbmFsX3RyZWF0aWVzX2NoYXJ0ZXJzX3dpdGhpbl9pZ28NCg0KYGBge3J9DQojIENyZWF0ZSBiaW5hcnkgdmFyaWFibGUgZm9yIHRyZWF0eS1iYXNlZCBqdXJpc2RpY3Rpb24NCmRmIDwtIGRmICU+JQ0KICBtdXRhdGUodHJlYXR5X2Jhc2VkID0gaWZlbHNlKGZvdW5kYXRpb25hbF90cmVhdGllc19jaGFydGVyc193aXRoaW5faWdvID09IDEsIDEsIDApKQ0KDQojIExpbmVhciByZWdyZXNzaW9uIChub3RlOiB0aGlzIGlzIG5vdCBsb2dpc3RpYyDigJQgaXQncyBHYXVzc2lhbi9saW5lYXIpDQptb2RlbCA8LSBnbG0oYWdlIH4gdHJlYXR5X2Jhc2VkLCBkYXRhID0gZGYsIGZhbWlseSA9ICJnYXVzc2lhbiIpDQpzdW1tYXJ5KG1vZGVsKQ0KDQojIFBsb3Qgd2l0aCBjYXB0aW9uDQpsaWJyYXJ5KGdncGxvdDIpDQoNCmdncGxvdChkYXRhID0gZGF0YS5mcmFtZShjb2VmID0gY29lZihtb2RlbCksIHRlcm0gPSBuYW1lcyhjb2VmKG1vZGVsKSkpLCBhZXMoeCA9IHRlcm0sIHkgPSBjb2VmKSkgKw0KICBnZW9tX2JhcihzdGF0ID0gImlkZW50aXR5IiwgZmlsbCA9ICJzdGVlbGJsdWUiKSArDQogIGxhYnMoDQogICAgdGl0bGUgPSAiRWZmZWN0IG9mIFRyZWF0eS1CYXNlZCBKdXJpc2RpY3Rpb24gb24gSUdPIEVuZHVyYW5jZSIsDQogICAgeCA9ICJWYXJpYWJsZSIsDQogICAgeSA9ICJDb2VmZmljaWVudCIsDQogICAgY2FwdGlvbiA9ICJGaWd1cmUgMS4zOiBIeXBvdGhlc2lzIDEuMiDigJMgRWZmZWN0IG9mIFRyZWF0eS1CYXNlZCBKdXJpc2RpY3Rpb24gb24gdGhlIHByZWRpY3RlZCBhZ2Ugb2YgSUdPcy4iDQogICkgKw0KICB0aGVtZV9taW5pbWFsKCkgKw0KICB0aGVtZSgNCiAgICBwbG90LmNhcHRpb24gPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLCBmYWNlID0gIml0YWxpYyIsIHNpemUgPSAxMCwgY29sb3IgPSAiZ3JheTQwIikNCiAgKQ0KDQoNCmBgYA0KVGhlIGFuYWx5c2lzIG9mIEh5cG90aGVzaXMgMS4yIHJldmVhbHMgdGhhdCB0aGUgZGF0YXNldCBsYWNrcyBzdWZmaWNpZW50IHZhcmlhYmlsaXR5IGluIHRyZWF0eS1iYXNlZCBqdXJpc2RpY3Rpb24gdG8gZHJhdyBtZWFuaW5nZnVsIGNvbmNsdXNpb25zLiBXaGlsZSB0aGUgYXZlcmFnZSBhZ2Ugb2YgSUdPcyBpcyA1NiB5ZWFycywgdGhlIG1vZGVsIGNvdWxkIG5vdCBlc3RpbWF0ZSB0aGUgZWZmZWN0IG9mIHRyZWF0eS1iYXNlZCBqdXJpc2RpY3Rpb24gZHVlIHRvIHNpbmd1bGFyaXR5LiBUaGlzIHN1Z2dlc3RzIHRoYXQgbW9zdCBJR09zIGluIHRoZSBkYXRhc2V0IGFyZSB0cmVhdHktYmFzZWQsIG1ha2luZyBpdCBkaWZmaWN1bHQgdG8gY29tcGFyZSB0aGVpciBlbmR1cmFuY2UgdG8gbm9uLXRyZWF0eS1iYXNlZCBJR09zLg0KDQojIyMjIEh5cG90aGVzaXMgMS4zOiBJR09zIHdpdGggYnJvYWRlciBzcGF0aWFsIGp1cmlzZGljdGlvbiBlbmR1cmUgbG9uZ2VyDQoqKk9iamVjdGl2ZToqKg0KVGVzdCBpZiBJR09zIHdpdGggYnJvYWRlciBzcGF0aWFsIGp1cmlzZGljdGlvbiBoYXZlIGxvbmdlciBlbmR1cmFuY2UuDQoNCkNvbHVtbnMgVXNlZDoNCg0KKiBvcmRpbmFsX3Njb3JlX3NwYXRpYWwNCiogaGlnaF9zZWFzX3dpdGhpbl9pZ28NCiogdGhlX2FyZWFfd2l0aGluX2lnbw0KYGBge3J9DQpsaWJyYXJ5KE1BU1MpICAgDQpsaWJyYXJ5KGdncGxvdDIpDQoNCiMgT3JkaW5hbCByZWdyZXNzaW9uDQpvcmRpbmFsX21vZGVsIDwtIHBvbHIoZmFjdG9yKGFnZSkgfiBvcmRpbmFsX3Njb3JlX3NwYXRpYWwsIGRhdGEgPSBkZiwgSGVzcyA9IFRSVUUpDQpzdW1tYXJ5KG9yZGluYWxfbW9kZWwpDQpgYGANClRoZSByZXN1bHRzIG9mIHRoZSBvcmRpbmFsIGxvZ2lzdGljIHJlZ3Jlc3Npb24gcHJvdmlkZSBpbnNpZ2h0cyBpbnRvIGhvdyBzcGF0aWFsIGp1cmlzZGljdGlvbiByZWxhdGVzIHRvIHRoZSBlbmR1cmFuY2Ugb2YgSUdPczoNCg0KMS4qKkNvZWZmaWNpZW50IGZvciBfb3JkaW5hbF9zY29yZV9zcGF0aWFsXzoqKg0KDQoqIFRoZSBjb2VmZmljaWVudCBmb3Igb3JkaW5hbF9zY29yZV9zcGF0aWFsIGlzIDAuMDkyNTMsIHdpdGggYSBzdGFuZGFyZCBlcnJvciBvZiAwLjA2NTE2IGFuZCBhIHQtdmFsdWUgb2YgMS40Mi4NCiogV2hpbGUgdGhlIGNvZWZmaWNpZW50IGlzIHBvc2l0aXZlLCBpbmRpY2F0aW5nIHRoYXQgYnJvYWRlciBzcGF0aWFsIGp1cmlzZGljdGlvbiBpcyBhc3NvY2lhdGVkIHdpdGggbG9uZ2VyIGVuZHVyYW5jZSwgdGhlIHQtdmFsdWUgb2YgMS40MiBpcyBub3Qgc3RhdGlzdGljYWxseSBzaWduaWZpY2FudCAodHlwaWNhbGx5LCBhIHQtdmFsdWUgZ3JlYXRlciB0aGFuIDIgaXMgY29uc2lkZXJlZCBzaWduaWZpY2FudCBhdCB0aGUgMC4wNSBsZXZlbCkuDQoqIFRoaXMgc3VnZ2VzdHMgdGhhdCB3aGlsZSB0aGVyZSBpcyBhIHRyZW5kIGluZGljYXRpbmcgYnJvYWRlciBzcGF0aWFsIGp1cmlzZGljdGlvbiBtYXkgY29udHJpYnV0ZSB0byBlbmR1cmFuY2UsIHRoZSByZWxhdGlvbnNoaXAgaXMgbm90IHN0cm9uZyBlbm91Z2ggdG8gYmUgY29uY2x1c2l2ZS4NCg0KMi4gKipJbnRlcmNlcHRzOioqDQoNCiogVGhlIGludGVyY2VwdHMgcmVwcmVzZW50IHRoZSB0aHJlc2hvbGRzIGZvciBkaWZmZXJlbnQgYWdlIGNhdGVnb3JpZXMgb2YgSUdPcy4gRm9yIGV4YW1wbGUsIHRoZSBpbnRlcmNlcHQgZm9yIHRoZSB0cmFuc2l0aW9uIGZyb20gYWdlIDEyIHRvIDEzIGlzIC0zLjQ2MTYsIGluZGljYXRpbmcgdGhlIGxvZy1vZGRzIG9mIGFuIElHTyBiZWluZyBpbiB0aGUgMTMrIGFnZSBjYXRlZ29yeSB2ZXJzdXMgeW91bmdlciBjYXRlZ29yaWVzLg0KKiBUaGUgbmVnYXRpdmUgdmFsdWVzIGZvciB5b3VuZ2VyIGFnZSBjYXRlZ29yaWVzIGFuZCBwb3NpdGl2ZSB2YWx1ZXMgZm9yIG9sZGVyIGFnZSBjYXRlZ29yaWVzIHJlZmxlY3QgdGhlIGluY3JlYXNpbmcgbGlrZWxpaG9vZCBvZiBJR09zIGVuZHVyaW5nIGFzIHRoZXkgYWdlLg0KDQozLiAqKk1vZGVsIEZpdDoqKg0KDQoqIFRoZSBSZXNpZHVhbCBEZXZpYW5jZSAoMzI3LjI3OTQpIGFuZCBBSUMgKDQwMS4yNzk0KSBpbmRpY2F0ZSB0aGUgbW9kZWwncyBmaXQuIFdoaWxlIHRoZSBtb2RlbCBjYXB0dXJlcyBzb21lIHZhcmlhdGlvbiwgdGhlIGxhY2sgb2Ygc3RhdGlzdGljYWwgc2lnbmlmaWNhbmNlIGZvciB0aGUgb3JkaW5hbF9zY29yZV9zcGF0aWFsIGNvZWZmaWNpZW50IHN1Z2dlc3RzIHRoYXQgb3RoZXIgZmFjdG9ycyBtYXkgcGxheSBhIG1vcmUgY3JpdGljYWwgcm9sZSBpbiBkZXRlcm1pbmluZyBlbmR1cmFuY2UuDQoNCmBgYHtyfQ0KIyBCb3hwbG90IHdpdGggY2FwdGlvbg0KZ2dwbG90KGRmLCBhZXMoeCA9IG9yZGluYWxfc2NvcmVfc3BhdGlhbCwgeSA9IGFnZSwgZmlsbCA9IGZhY3RvcihvcmRpbmFsX3Njb3JlX3NwYXRpYWwpKSkgKw0KICBnZW9tX2JveHBsb3QoKSArDQogIGxhYnMoDQogICAgdGl0bGUgPSAiRW5kdXJhbmNlIGJ5IFNwYXRpYWwgSnVyaXNkaWN0aW9uIFNjb3JlIiwNCiAgICB4ID0gIlNwYXRpYWwgSnVyaXNkaWN0aW9uIFNjb3JlIiwNCiAgICB5ID0gIkFnZSBvZiBJR08iLA0KICAgIGNhcHRpb24gPSAiRmlndXJlIDEuNDogSHlwb3RoZXNpcyAxLjMg4oCTIEFnZSBkaXN0cmlidXRpb24gb2YgSUdPcyBhY3Jvc3MgZGlmZmVyZW50IGxldmVscyBvZiBzcGF0aWFsIGp1cmlzZGljdGlvbi4iDQogICkgKw0KICB0aGVtZV9taW5pbWFsKCkgKw0KICB0aGVtZSgNCiAgICBwbG90LmNhcHRpb24gPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLCBmYWNlID0gIml0YWxpYyIsIHNpemUgPSAxMCwgY29sb3IgPSAiZ3JheTQwIikNCiAgKQ0KYGBgDQoqKktleSBPYnNlcnZhdGlvbnMqKg0KDQoxLiAqKlRyZW5kIFRvd2FyZCBMb25nZXIgRW5kdXJhbmNlOioqDQpUaGUgcG9zaXRpdmUgY29lZmZpY2llbnQgZm9yIG9yZGluYWxfc2NvcmVfc3BhdGlhbCBzdWdnZXN0cyB0aGF0IElHT3Mgd2l0aCBicm9hZGVyIHNwYXRpYWwganVyaXNkaWN0aW9uIHRlbmQgdG8gZW5kdXJlIGxvbmdlciwgYWx0aG91Z2ggdGhpcyB0cmVuZCBpcyBub3Qgc3RhdGlzdGljYWxseSBzaWduaWZpY2FudC4gVGhpcyBjb3VsZCBpbXBseSB0aGF0IHNwYXRpYWwganVyaXNkaWN0aW9uIGNvbnRyaWJ1dGVzIHRvIGVuZHVyYW5jZSwgYnV0IGl0cyBlZmZlY3QgbWF5IGJlIG1vZGVyYXRlZCBieSBvdGhlciBpbnN0aXR1dGlvbmFsIGRlc2lnbiBmZWF0dXJlcyAoZS5nLiwgdHJlYXR5LWJhc2VkIGp1cmlzZGljdGlvbiwgdmVydGljYWwgY29vcmRpbmF0aW9uKS4NCg0KMi4gKipBZ2UgQ2F0ZWdvcmllczoqKg0KVGhlIGludGVyY2VwdHMgc2hvdyB0aGF0IG9sZGVyIElHT3MgKGUuZy4sIHRob3NlIGFnZWQgNjArKSBoYXZlIGhpZ2hlciBsb2ctb2RkcyBvZiBiZWluZyBpbiBoaWdoZXIgYWdlIGNhdGVnb3JpZXMsIHdoaWNoIGFsaWducyB3aXRoIHRoZSBpZGVhIHRoYXQgaW5zdGl0dXRpb25hbCBhZ2UgYW5kIGV4cGVyaWVuY2UgY29udHJpYnV0ZSB0byBlbmR1cmFuY2UuDQoNCjMuICoqSW1wbGljYXRpb25zIGZvciBJbnN0aXR1dGlvbmFsIERlc2lnbjoqKg0KV2hpbGUgYnJvYWRlciBzcGF0aWFsIGp1cmlzZGljdGlvbiBhcHBlYXJzIHRvIGhhdmUgYSBwb3NpdGl2ZSBhc3NvY2lhdGlvbiB3aXRoIGVuZHVyYW5jZSwgdGhlIGxhY2sgb2Ygc3RhdGlzdGljYWwgc2lnbmlmaWNhbmNlIHN1Z2dlc3RzIHRoYXQgb3RoZXIgZGVzaWduIGZlYXR1cmVzIChlLmcuLCBzdHJvbmcgdmVydGljYWwgY29vcmRpbmF0aW9uLCB0cmVhdHktYmFzZWQganVyaXNkaWN0aW9uKSBtYXkgYmUgbW9yZSBpbmZsdWVudGlhbC4gVGhpcyBhbGlnbnMgd2l0aCBvcmdhbml6YXRpb25hbCBlY29sb2d5IHRoZW9yaWVzLCB3aGljaCBlbXBoYXNpemUgdGhhdCBtdWx0aXBsZSBpbnN0aXR1dGlvbmFsIGZhY3RvcnMgY29udHJpYnV0ZSB0byBhbiBvcmdhbml6YXRpb24ncyBsb25nZXZpdHkuDQoNCiMjIyMgSHlwb3RoZXNpcyAxLjQ6IFN0cm9uZyB2ZXJ0aWNhbCBjb29yZGluYXRpb24gZW5oYW5jZXMgZW5kdXJhbmNlDQpPYmplY3RpdmU6DQpUZXN0IGlmIElHT3Mgd2l0aCBzdHJvbmcgdmVydGljYWwgY29vcmRpbmF0aW9uIGVuZHVyZSBsb25nZXIuDQoNCioqQ29sdW1ucyBVc2VkOioqDQoNCiogb3JkaW5hbF9zY29yZV92ZXJ0aWNhbF9jb29yZGluYXRpb24NCiogZ2xvYmFsX3JlZ2lvbmFsX25hdGlvbmFsX2Nvb3JkaW5hdGlvbl93aXRoaW5faWdvDQpgYGB7cn0NCmdncGxvdChkZiwgYWVzKHggPSBmYWN0b3Iob3JkaW5hbF9zY29yZV9zcGF0aWFsKSwgeSA9IGFnZSwgZmlsbCA9IGZhY3RvcihvcmRpbmFsX3Njb3JlX3NwYXRpYWwpKSkgKw0KICBnZW9tX3Zpb2xpbih0cmltID0gRkFMU0UsIGFscGhhID0gMC43LCBjb2xvciA9IE5BKSArDQogIGdlb21faml0dGVyKHdpZHRoID0gMC4xLCBzaXplID0gMS41LCBhbHBoYSA9IDAuNSkgKw0KICBzdGF0X3N1bW1hcnkoZnVuID0gbWVkaWFuLCBnZW9tID0gInBvaW50Iiwgc2hhcGUgPSAyMywgc2l6ZSA9IDMsIGZpbGwgPSAiYmxhY2siKSArDQogIGxhYnMoDQogICAgdGl0bGUgPSAiSUdPcyB3aXRoIEJyb2FkZXIgU3BhdGlhbCBKdXJpc2RpY3Rpb24gVGVuZCB0byBFbmR1cmUgTG9uZ2VyIiwNCiAgICB4ID0gIlNwYXRpYWwgSnVyaXNkaWN0aW9uIFNjb3JlIiwNCiAgICB5ID0gIklHTyBBZ2UgKFllYXJzKSIsDQogICAgZmlsbCA9ICJTcGF0aWFsIFNjb3JlIiwNCiAgICBjYXB0aW9uID0gIkZpZ3VyZSAxLjU6IEh5cG90aGVzaXMgMS40IOKAkyBEaXN0cmlidXRpb24gb2YgSUdPIGFnZSBhY3Jvc3Mgc3BhdGlhbCBqdXJpc2RpY3Rpb24gc2NvcmVzLCBcbmluZGljYXRpbmcgbG9uZ2VyIGVuZHVyYW5jZSBmb3IgSUdPcyB3aXRoIGJyb2FkZXIgc3BhdGlhbCBzY29wZS4iDQogICkgKw0KICB0aGVtZV9taW5pbWFsKCkgKw0KICB0aGVtZSgNCiAgICBwbG90LmNhcHRpb24gPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLCBmYWNlID0gIml0YWxpYyIsIHNpemUgPSAxMCwgY29sb3IgPSAiZ3JheTQwIikNCiAgKQ0KYGBgDQoNCioqS2V5IE9ic2VydmF0aW9uczoqKg0KDQoxLiBQb3NpdGl2ZSBUcmVuZDoNCiogSUdPcyB3aXRoIGhpZ2hlciBzcGF0aWFsIGp1cmlzZGljdGlvbiBzY29yZXMgKGUuZy4sIHNjb3JlcyBvZiA3LCA4LCBhbmQgOSkgdGVuZCB0byBoYXZlIG9sZGVyIGFnZXMsIGFzIGluZGljYXRlZCBieSB0aGUgdXB3YXJkIHNoaWZ0IGluIHRoZSBkaXN0cmlidXRpb24gb2YgYWdlcy4gVGhpcyBzdWdnZXN0cyB0aGF0IElHT3Mgd2l0aCBicm9hZGVyIHNwYXRpYWwganVyaXNkaWN0aW9uIGFyZSBtb3JlIGxpa2VseSB0byBlbmR1cmUgbG9uZ2VyLg0KDQoyLiBEZW5zaXR5IGFuZCBTcHJlYWQ6DQoqIFRoZSBzcHJlYWQgb2YgYWdlcyBpbmNyZWFzZXMgd2l0aCBoaWdoZXIgc3BhdGlhbCBqdXJpc2RpY3Rpb24gc2NvcmVzLiBGb3IgZXhhbXBsZSwgSUdPcyB3aXRoIGEgc3BhdGlhbCBqdXJpc2RpY3Rpb24gc2NvcmUgb2YgOSBzaG93IGEgd2lkZXIgcmFuZ2Ugb2YgYWdlcywgaW5jbHVkaW5nIG1hbnkgb2xkZXIgSUdPcyAoZS5nLiwgMTAwKyB5ZWFycykuDQpJR09zIHdpdGggbG93ZXIgc3BhdGlhbCBqdXJpc2RpY3Rpb24gc2NvcmVzIChlLmcuLCAwLCAxKSB0ZW5kIHRvIGJlIHlvdW5nZXIsIHdpdGggYSBuYXJyb3dlciBhZ2UgZGlzdHJpYnV0aW9uLg0KDQozLiBPdXRsaWVyczoNCiogU29tZSBJR09zIHdpdGggbG93ZXIgc3BhdGlhbCBqdXJpc2RpY3Rpb24gc2NvcmVzIChlLmcuLCAwLCAxKSBoYXZlIGVuZHVyZWQgZm9yIGEgbG9uZyB0aW1lLCBpbmRpY2F0aW5nIHRoYXQgb3RoZXIgZmFjdG9ycyBtYXkgYWxzbyBjb250cmlidXRlIHRvIGVuZHVyYW5jZS4NCmBgYHtyfQ0KbGlicmFyeShNQVNTKQ0KDQojIE9yZGluYWwgcmVncmVzc2lvbg0Kb3JkaW5hbF9tb2RlbCA8LSBwb2xyKGZhY3RvcihhZ2UpIH4gb3JkaW5hbF9zY29yZV9zcGF0aWFsLCBkYXRhID0gZGYsIEhlc3MgPSBUUlVFKQ0Kc3VtbWFyeShvcmRpbmFsX21vZGVsKQ0KDQpgYGANClRoZSBvcmRpbmFsIGxvZ2lzdGljIHJlZ3Jlc3Npb24gcmVzdWx0cyBwcm92aWRlIGEgcXVhbnRpdGF0aXZlIGFzc2Vzc21lbnQgb2YgdGhlIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIHNwYXRpYWwganVyaXNkaWN0aW9uIGFuZCBJR08gYWdlLg0KDQoxLiBQb3NpdGl2ZSBDb2VmZmljaWVudDoNCiogVGhlIGNvZWZmaWNpZW50IGZvciBvcmRpbmFsX3Njb3JlX3NwYXRpYWwgaXMgMC4wOTI1MywgaW5kaWNhdGluZyBhIHBvc2l0aXZlIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIHNwYXRpYWwganVyaXNkaWN0aW9uIGFuZCBJR08gYWdlLiBUaGlzIG1lYW5zIHRoYXQgZm9yIGVhY2ggdW5pdCBpbmNyZWFzZSBpbiBzcGF0aWFsIGp1cmlzZGljdGlvbiBzY29yZSwgdGhlIGxvZy1vZGRzIG9mIGFuIElHTyBiZWluZyBpbiBhIGhpZ2hlciBhZ2UgY2F0ZWdvcnkgaW5jcmVhc2UgYnkgMC4wOTI1My4NCkhvd2V2ZXIsIHRoZSB0LXZhbHVlIG9mIDEuNDIgaXMgbm90IHN0YXRpc3RpY2FsbHkgc2lnbmlmaWNhbnQgKHR5cGljYWxseSwgYSB0LXZhbHVlIGdyZWF0ZXIgdGhhbiAyIGlzIGNvbnNpZGVyZWQgc2lnbmlmaWNhbnQgYXQgdGhlIDAuMDUgbGV2ZWwpLiAqKlRoaXMgc3VnZ2VzdHMgdGhhdCB3aGlsZSB0aGVyZSBpcyBhIHRyZW5kLCBpdCBpcyBub3Qgc3Ryb25nIGVub3VnaCB0byBiZSBjb25jbHVzaXZlLioqDQoNCjIuIEludGVyY2VwdHM6DQoqIFRoZSBpbnRlcmNlcHRzIHJlcHJlc2VudCB0aGUgdGhyZXNob2xkcyBmb3IgZGlmZmVyZW50IGFnZSBjYXRlZ29yaWVzLiBGb3IgZXhhbXBsZSwgdGhlIGludGVyY2VwdCBmb3IgdGhlIHRyYW5zaXRpb24gZnJvbSBhZ2UgMTIgdG8gMTMgaXMgLTMuNDYxNiwgaW5kaWNhdGluZyB0aGUgbG9nLW9kZHMgb2YgYW4gSUdPIGJlaW5nIGluIHRoZSAxMysgYWdlIGNhdGVnb3J5IHZlcnN1cyB5b3VuZ2VyIGNhdGVnb3JpZXMuDQpUaGUgbmVnYXRpdmUgdmFsdWVzIGZvciB5b3VuZ2VyIGFnZSBjYXRlZ29yaWVzIGFuZCBwb3NpdGl2ZSB2YWx1ZXMgZm9yIG9sZGVyIGFnZSBjYXRlZ29yaWVzIHJlZmxlY3QgdGhlIGluY3JlYXNpbmcgbGlrZWxpaG9vZCBvZiBJR09zIGVuZHVyaW5nIGFzIHRoZXkgYWdlLg0KDQozLiBNb2RlbCBGaXQ6DQoqIFRoaXMgbWVhbnMgdGhlIG1vZGVsIGRvZXMgbm90IHByb3ZpZGUgc3Ryb25nIGV2aWRlbmNlIHRoYXQgYnJvYWRlciBzcGF0aWFsIGp1cmlzZGljdGlvbiBpcyBhc3NvY2lhdGVkIHdpdGggc2lnbmlmaWNhbnRseSBncmVhdGVyIGVuZHVyYW5jZSB0aG91Z2ggdGhlIHJlbGF0aW9uc2hpcCBpcyBwb3NpdGl2ZS4NCg0KKipLZXkgVGFrZWF3YXlzOioqDQoNCjEuICoqVHJlbmQgVG93YXJkIExvbmdlciBFbmR1cmFuY2U6KioNCiogVGhlcmUgaXMgYSB2aXNpYmxlIHRyZW5kIHRoYXQgSUdPcyB3aXRoIGJyb2FkZXIgc3BhdGlhbCBqdXJpc2RpY3Rpb24gdGVuZCB0byBiZSBvbGRlciwgc3VnZ2VzdGluZyB0aGF0IHNwYXRpYWwganVyaXNkaWN0aW9uIGNvbnRyaWJ1dGVzIHRvIGVuZHVyYW5jZS4gSG93ZXZlciwgdGhpcyB0cmVuZCBpcyBub3Qgc3RhdGlzdGljYWxseSBzaWduaWZpY2FudCwgaW1wbHlpbmcgdGhhdCBvdGhlciBmYWN0b3JzIG1heSBiZSBtb3JlIGluZmx1ZW50aWFsLg0KDQoyLiAqKkltcG9ydGFuY2Ugb2YgT3RoZXIgRmFjdG9yczoqKg0KKiBUaGUgbGFjayBvZiBzdGF0aXN0aWNhbCBzaWduaWZpY2FuY2Ugc3VnZ2VzdHMgdGhhdCBpbnN0aXR1dGlvbmFsIGRlc2lnbiBmZWF0dXJlcyBzdWNoIGFzIHZlcnRpY2FsIGNvb3JkaW5hdGlvbiwgdHJlYXR5LWJhc2VkIGp1cmlzZGljdGlvbiwgYW5kIGRlZmluZWQgb2JqZWN0aXZlcyBtYXkgcGxheSBhIG1vcmUgY3JpdGljYWwgcm9sZSBpbiBkZXRlcm1pbmluZyBlbmR1cmFuY2UuDQoNCjMuICoqSW1wbGljYXRpb25zIGZvciBJbnN0aXR1dGlvbmFsIERlc2lnbjoqKg0KKiBXaGlsZSBicm9hZGVyIHNwYXRpYWwganVyaXNkaWN0aW9uIGFwcGVhcnMgdG8gaGF2ZSBhIHBvc2l0aXZlIGFzc29jaWF0aW9uIHdpdGggZW5kdXJhbmNlLCBpdCBpcyBsaWtlbHkgdGhhdCBhIGNvbWJpbmF0aW9uIG9mIGZhY3RvcnMgKGUuZy4sIHN0cm9uZyB2ZXJ0aWNhbCBjb29yZGluYXRpb24sIHJvYnVzdCBzb3VyY2VzIG9mIGp1cmlzZGljdGlvbikgY29udHJpYnV0ZXMgdG8gYW4gSUdPJ3MgbG9uZ2V2aXR5Lg0KDQojIyMjIEh5cG90aGVzaXMgMS41OiBJR09zIHdpdGggZGl2ZXJzaWZpZWQgb2JqZWN0aXZlcyBlbmR1cmUgbG9uZ2VyDQpPYmplY3RpdmU6DQpUZXN0IGlmIElHT3Mgd2l0aCBkaXZlcnNpZmllZCBvYmplY3RpdmVzIGhhdmUgbG9uZ2VyIGVuZHVyYW5jZS4NCg0KKipDb2x1bW5zIFVzZWQ6KioNCg0KKiBvcmRpbmFsX3Njb3JlX2RlZmluZWRfb2JqZWN0aXZlcw0KKiBlbnZpcm9ubWVudGFsX2FjdGlvbl93aXRoaW5faWdvDQpgYGB7cn0NCmxpYnJhcnkocHN5Y2gpDQoNCiMgRmFjdG9yIGFuYWx5c2lzIHdpdGggMSBmYWN0b3INCmZhX3Jlc3VsdCA8LSBmYShkZlssIGMoIm9yZGluYWxfc2NvcmVfZGVmaW5lZF9vYmplY3RpdmVzIiwgImVudmlyb25tZW50YWxfYWN0aW9uX3dpdGhpbl9pZ28iKV0sIG5mYWN0b3JzID0gMSwgcm90YXRlID0gIm5vbmUiKQ0KDQojIFByZWRpY3RlZCBmYWN0b3Igc2NvcmVzDQpkZiRmYWN0b3Jfb2JqZWN0aXZlcyA8LSBmYV9yZXN1bHQkc2NvcmVzWywxXQ0KDQojIFJlZ3Jlc3Npb24NCm9iamVjdGl2ZV9tb2RlbCA8LSBsbShhZ2UgfiBmYWN0b3Jfb2JqZWN0aXZlcywgZGF0YSA9IGRmKQ0Kc3VtbWFyeShvYmplY3RpdmVfbW9kZWwpDQoNCmBgYA0KVGhlIGFuYWx5c2lzIG9mIEh5cG90aGVzaXMgMS41IHJldmVhbHMgKip0aGF0IElHT3Mgd2l0aCBkaXZlcnNpZmllZCBvYmplY3RpdmVzIGRvIG5vdCBuZWNlc3NhcmlseSBlbmR1cmUgbG9uZ2VyKio7IGluIGZhY3QsIHRoZSByZXN1bHRzIHN1Z2dlc3QgYSBuZWdhdGl2ZSAodGhvdWdoIG5vdCBzaWduaWZpY2FudCkgcmVsYXRpb25zaGlwIGJldHdlZW4gZGl2ZXJzaWZpY2F0aW9uIGFuZCBlbmR1cmFuY2UuIFRoZSBsb3cgZXhwbGFuYXRvcnkgcG93ZXIgb2YgdGhlIG1vZGVsIGluZGljYXRlcyB0aGF0IGRpdmVyc2lmaWVkIG9iamVjdGl2ZXMgYWxvbmUgYXJlIG5vdCBhIHN0cm9uZyBwcmVkaWN0b3Igb2YgYW4gSUdPJ3MgbG9uZ2V2aXR5Lg0KDQoNCjEuIERpdmVyc2lmaWNhdGlvbiBNYXkgTm90IEVuaGFuY2UgRW5kdXJhbmNlOg0KQ29udHJhcnkgdG8gb3VyIGh5cG90aGVzaXMsIHRoZSByZXN1bHRzIHN1Z2dlc3QgdGhhdCBJR09zIHdpdGggZGl2ZXJzaWZpZWQgb2JqZWN0aXZlcyBtYXkgaGF2ZSBzaG9ydGVyIGVuZHVyYW5jZSwgYWx0aG91Z2ggdGhpcyBmaW5kaW5nIGlzIG5vdCBzdGF0aXN0aWNhbGx5IHNpZ25pZmljYW50Lg0KDQoNCjIuIE90aGVyIEZhY3RvcnMgTWF0dGVyIE1vcmU6DQpUaGUgbG93IFItc3F1YXJlZCB2YWx1ZXMgaW5kaWNhdGUgdGhhdCBvdGhlciBpbnN0aXR1dGlvbmFsIGRlc2lnbiBmZWF0dXJlcyAoZS5nLiwgdmVydGljYWwgY29vcmRpbmF0aW9uLCBzb3VyY2VzIG9mIGp1cmlzZGljdGlvbikgbGlrZWx5IHBsYXkgYSBtb3JlIGNyaXRpY2FsIHJvbGUgaW4gZGV0ZXJtaW5pbmcgZW5kdXJhbmNlLg0KDQoNCjMuIEZvY3VzIGFuZCBDbGFyaXR5IE1heSBCZSBLZXk6DQpUaGUgcmVzdWx0cyBpbXBseSB0aGF0IElHT3Mgd2l0aCBjbGVhciwgZm9jdXNlZCBvYmplY3RpdmVzIG1pZ2h0IGJlIGJldHRlciBwb3NpdGlvbmVkIHRvIGVuZHVyZSwgYXMgdGhleSBjYW4gYXZvaWQgdGhlIHJlc291cmNlIGRlbWFuZHMgYW5kIGNvbXBsZXhpdGllcyBhc3NvY2lhdGVkIHdpdGggbWFuYWdpbmcgZGl2ZXJzZSBtYW5kYXRlcy4NCg0KIyMjIyBIeXBvdGhlc2lzIDEuNjogSUdPcyB3aXRoIHN0cm9uZyBob3Jpem9udGFsIGNvb3JkaW5hdGlvbiBhcmUgbW9yZSBlbmR1cmluZw0KT2JqZWN0aXZlOg0KVGVzdCBpZiBJR09zIHdpdGggc3Ryb25nIGhvcml6b250YWwgY29vcmRpbmF0aW9uIGVuZHVyZSBsb25nZXIuDQoNCioqQ29sdW1ucyBVc2VkOioqDQoNCiogaW50ZXJnb3Zlcm5tZW50YWxfY29uc3VsdGF0aW9uc193aXRoaW5faWdvDQoqIHVuX3N5c3RlbV9jb2xsYWJvcmF0aW9uX3dpdGhpbl9pZ28NCg0KYGBge3J9DQpsaWJyYXJ5KGlncmFwaCkNCmxpYnJhcnkodGlkeWdyYXBoKQ0KbGlicmFyeShnZ3JhcGgpDQoNCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KIyAxLiBCdWlsZCBlZGdlIGxpc3QNCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KbmV0d29ya19kYXRhIDwtIGRmWywgYygiaW5zdGl0dXRpb24iLCANCiAgICAgICAgICAgICAgICAgICAgICAgImludGVyZ292ZXJubWVudGFsX2NvbnN1bHRhdGlvbnNfd2l0aGluX2lnbyIsIA0KICAgICAgICAgICAgICAgICAgICAgICAidW5fc3lzdGVtX2NvbGxhYm9yYXRpb25fd2l0aGluX2lnbyIpXQ0KDQplZGdlX2xpc3QgPC0gbmEub21pdChkYXRhLmZyYW1lKA0KICBmcm9tID0gcmVwKG5ldHdvcmtfZGF0YSRpbnN0aXR1dGlvbiwgMiksDQogIHRvID0gYyhuZXR3b3JrX2RhdGEkaW50ZXJnb3Zlcm5tZW50YWxfY29uc3VsdGF0aW9uc193aXRoaW5faWdvLA0KICAgICAgICAgbmV0d29ya19kYXRhJHVuX3N5c3RlbV9jb2xsYWJvcmF0aW9uX3dpdGhpbl9pZ28pLA0KICBzdHJpbmdzQXNGYWN0b3JzID0gRkFMU0UNCikpDQoNCiMgQ3JlYXRlIGlncmFwaCBvYmplY3QNCm5ldHdvcmsgPC0gZ3JhcGhfZnJvbV9kYXRhX2ZyYW1lKGVkZ2VfbGlzdCwgZGlyZWN0ZWQgPSBGQUxTRSkNCg0KIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQojIDIuIENvbnZlcnQgdG8gdGlkeWdyYXBoIGFuZCBhZGQgYXR0cmlidXRlcw0KIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQp0ZyA8LSBhc190YmxfZ3JhcGgobmV0d29yaykgJT4lDQogIG11dGF0ZSgNCiAgICBjZW50cmFsaXR5ID0gY2VudHJhbGl0eV9kZWdyZWUoKSwgICAjIGNvbXB1dGUgY2VudHJhbGl0eQ0KICAgIGFnZSA9IGRmJGFnZVttYXRjaChuYW1lLCBkZiRpbnN0aXR1dGlvbildICAgIyBtYXRjaCBhZ2UgaW5mbw0KICApDQoNCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KIyAzLiBQbG90IG5ldHdvcmsgd2l0aCBnZ3JhcGgNCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KZ2dyYXBoKHRnLCBsYXlvdXQgPSAiZnIiKSArDQogIGdlb21fZWRnZV9saW5rKGFscGhhID0gMC4zLCBjb2xvciA9ICJncmV5NTAiKSArDQogIGdlb21fbm9kZV9wb2ludChhZXMoc2l6ZSA9IGNlbnRyYWxpdHksIGNvbG9yID0gYWdlKSkgKw0KICBnZW9tX25vZGVfdGV4dChhZXMobGFiZWwgPSBuYW1lKSwgcmVwZWwgPSBUUlVFLCBzaXplID0gMiwgY29sb3IgPSAiYmxhY2siKSArICMgQWRqdXN0aW5nIGxhYmVsIHZpc2liaWxpdHkNCiAgc2NhbGVfY29sb3JfdmlyaWRpc19jKG9wdGlvbiA9ICJwbGFzbWEiKSArDQogIHRoZW1lX3ZvaWQoKSArDQogIGxhYnMoDQogICAgdGl0bGUgPSAiSUdPIE5ldHdvcmsiLA0KICAgIHN1YnRpdGxlID0gIk5vZGUgc2l6ZSA9IGNlbnRyYWxpdHkgKGNvb3JkaW5hdGlvbiksIE5vZGUgY29sb3IgPSBlbmR1cmFuY2UgKGFnZSkiLA0KICAgIGNhcHRpb24gPSAiRmlndXJlIDEuNjogSHlwb3RoZXNpcyAxLjYg4oCTIEludGVyb3JnYW5pemF0aW9uYWwgY29vcmRpbmF0aW9uIGFuZCBVTiBjb2xsYWJvcmF0aW9uIGZvcm0gYSBcbm5ldHdvcmsgaW4gd2hpY2ggbW9yZSBjZW50cmFsIElHT3MgdGVuZCB0byBiZSBvbGRlciwgc3VnZ2VzdGluZyB0aGF0IGNvb3JkaW5hdGlvbiByZWxhdGVzIHRvIGVuZHVyYW5jZS4iDQogICkgKw0KICB0aGVtZSgNCiAgICBwbG90LmNhcHRpb24gPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLCBmYWNlID0gIml0YWxpYyIsIHNpemUgPSAxMCwgY29sb3IgPSAiZ3JheTQwIiksDQogICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTQsIGZhY2UgPSAiYm9sZCIpLA0KICAgIHBsb3Quc3VidGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDExKQ0KICApDQoNCmBgYA0KDQoqKk5vZGUgc2l6ZSA9IGNlbnRyYWxpdHkgKGhvcml6b250YWwgY29vcmRpbmF0aW9uKToqKg0KTGFyZ2VyIG5vZGVzIHJlcHJlc2VudCBJR09zIHRoYXQgYXJlIGhpZ2hseSBjb25uZWN0ZWQgKHRoZXkgY29vcmRpbmF0ZSBtb3JlIHdpdGggb3RoZXJzKS4NCg0KKipOb2RlIGNvbG9yID0gZW5kdXJhbmNlIChhZ2UpOioqDQoNCiogRGFyayBwdXJwbGUgPSB5b3VuZ2VyIElHT3MNCg0KKiBZZWxsb3cvb3JhbmdlID0gb2xkZXIgSUdPcw0KDQoqICoqRWRnZXMgPSBjb29yZGluYXRpb24gbGlua3M6KioNCkVhY2ggbGluZSBzaG93cyBjb25zdWx0YXRpb24gb3IgY29sbGFib3JhdGlvbiB0aWVzIGJldHdlZW4gSUdPcy4NCg0KKiBUaGUgcGxvdCBhYm92ZSBpbGx1c3RyYXRlcyB0aGUgcmVsYXRpb25zaGlwIGJldHdlZW4gaW50ZXItb3JnYW5pemF0aW9uYWwgY29vcmRpbmF0aW9uIGFuZCBJR08gZW5kdXJhbmNlIChtZWFzdXJlZCBhcyBhZ2UpLiBUaGlzIG5ldHdvcmsgZGlhZ3JhbSBzaG93cyB0aGUgY2VudHJhbGl0eSBvZiBlYWNoIElHTyBhcyB0aGUgbm9kZSBzaXplIGFuZCBlbmR1cmFuY2UgKGFnZSkgYXMgdGhlIG5vZGUgY29sb3IsIHVzaW5nIGEgZ3JhZGllbnQgZnJvbSBwdXJwbGUgKHlvdW5nKSB0byB5ZWxsb3cgKG9sZCkuIEVhY2ggbm9kZSByZXByZXNlbnRzIGFuIElHTywgYW5kIHRoZSBlZGdlcyBiZXR3ZWVuIHRoZW0gaW5kaWNhdGUgdGhlIHByZXNlbmNlIG9mIGludGVyLWdvdmVybm1lbnRhbCBjb25zdWx0YXRpb25zIGFuZCBVTiBzeXN0ZW0gY29sbGFib3JhdGlvbi4NCg0KKiBGcm9tIHRoZSBwbG90LCBpdCBpcyBldmlkZW50IHRoYXQgbGFyZ2VyIG5vZGVzLCByZXByZXNlbnRpbmcgSUdPcyB3aXRoIGhpZ2hlciBjZW50cmFsaXR5IChjb29yZGluYXRpb24pLCB0ZW5kIHRvIGJlIG9sZGVyIChpLmUuLCB0aGV5IGFyZSBjb2xvcmVkIGluIG1vcmUgeWVsbG93IHRvbmVzKS4gRm9yIGV4YW1wbGUsIElHT3MgbGlrZSBVTkRQLCBXSE8sIFdGUCwgYW5kIFVORVNDTyBhcHBlYXIgdG8gYmUgaGlnaGx5IGNlbnRyYWwgKGxhcmdlciBzaXplKSBhbmQgYWxzbyBvbGRlciAobW9yZSB5ZWxsb3cpLCBzdXBwb3J0aW5nIHRoZSBoeXBvdGhlc2lzIHRoYXQgSUdPcyB3aXRoIHN0cm9uZ2VyIGhvcml6b250YWwgY29vcmRpbmF0aW9uIChtb3JlIGxpbmtzKSBhcmUgZ2VuZXJhbGx5IG9sZGVyIGFuZCBtb3JlIGVuZHVyaW5nLiBPbiB0aGUgb3RoZXIgaGFuZCwgc21hbGxlciBub2RlcywgcmVwcmVzZW50aW5nIElHT3Mgd2l0aCBsb3dlciBjZW50cmFsaXR5LCB0ZW5kIHRvIGJlIHlvdW5nZXIgKGluZGljYXRlZCBieSBwdXJwbGUgY29sb3JzKSwgd2hpY2ggYWxpZ25zIHdpdGggdGhlIGh5cG90aGVzaXMgdGhhdCBsZXNzIGNvb3JkaW5hdGVkIElHT3MgbWF5IG5vdCBsYXN0IGFzIGxvbmcuDQoNCiogVGhlIHBsb3Qgc3VwcG9ydHMgSHlwb3RoZXNpcyAxLjYgYnkgZGVtb25zdHJhdGluZyB0aGF0IElHT3Mgd2l0aCBoaWdoZXIgY2VudHJhbGl0eSBpbiB0aGUgbmV0d29yayAobW9yZSBpbnRlcmNvbm5lY3Rpb25zIHdpdGggb3RoZXIgSUdPcyBhbmQgVU4gYm9kaWVzKSBnZW5lcmFsbHkgaGF2ZSBoaWdoZXIgZW5kdXJhbmNlLCBzdWdnZXN0aW5nIHRoYXQgc3Ryb25nIGhvcml6b250YWwgY29vcmRpbmF0aW9uIHBsYXlzIGEgcm9sZSBpbiB0aGUgbG9uZ2V2aXR5IG9mIElHT3MuIFRoaXMgaW1wbGllcyB0aGF0IGNvb3JkaW5hdGlvbiBhY3Jvc3Mgb3JnYW5pemF0aW9ucyBtaWdodCBib2xzdGVyIHJlc2lsaWVuY2UsIG1ha2luZyB0aGVtIGJldHRlciBlcXVpcHBlZCB0byBuYXZpZ2F0ZSBsb25nLXRlcm0gY2hhbGxlbmdlcyBhbmQgZW5kdXJlIG92ZXIgZXh0ZW5kZWQgcGVyaW9kcy4gVGhlcmVmb3JlLCB0aGlzIGZpbmRpbmcgYWxpZ25zIHdpdGggdGhlIGlkZWEgdGhhdCB3ZWxsLWNvb3JkaW5hdGVkIElHT3MsIGVzcGVjaWFsbHkgdGhvc2Ugd2l0aCBicm9hZCBpbnRlcmdvdmVybm1lbnRhbCBhbmQgVU4tc3lzdGVtIGludGVyYWN0aW9ucywgdGVuZCB0byBoYXZlIGxvbmdlciBzdXJ2aXZhbCB0aW1lcyBhbmQgYXJlIG1vcmUgbGlrZWx5IHRvIHRocml2ZSBpbiB0aGUgZXZvbHZpbmcgZ2xvYmFsIGxhbmRzY2FwZS4NCg0KKipJbXBsaWNhdGlvbjoqKg0KDQpUaGUgcGxvdCB2aXN1YWxseSBzdXBwb3J0cyB0aGUgaHlwb3RoZXNpcyB0aGF0IGNvb3JkaW5hdGlvbiBuZXR3b3JrcyBjb3JyZWxhdGUgd2l0aCBlbmR1cmFuY2UsIHdoZXJlIG9sZGVyIGFuZCBtb3JlIGVuZHVyaW5nIElHT3MgKHN1Y2ggYXMgdGhlIFdGUCwgVU5FU0NPLCBVTkRQKSB0ZW5kIHRvIGJlIG1vcmUgY2VudHJhbGl6ZWQgaW4gdGhlaXIgY29vcmRpbmF0aW9uIGVmZm9ydHMuIFRoaXMgaGlnaGxpZ2h0cyB0aGF0IGhvcml6b250YWwgY29vcmRpbmF0aW9uICh0aHJvdWdoIGNvbGxhYm9yYXRpdmUgZW5nYWdlbWVudHMgd2l0aCBvdGhlciBJR09zIGFuZCBVTiBib2RpZXMpIGlzIGFuIGltcG9ydGFudCBmYWN0b3IgaW4gZW5oYW5jaW5nIHRoZSBsb25nZXZpdHkgb2YgdGhlc2Ugb3JnYW5pemF0aW9ucywgc3VnZ2VzdGluZyB0aGF0IGJ1aWxkaW5nIHN0cm9uZ2VyIGluc3RpdHV0aW9uYWwgbmV0d29ya3MgaXMga2V5IHRvIGZvc3RlcmluZyBlbmR1cmluZyBpbnRlcm5hdGlvbmFsIGdvdmVybmFuY2Ugc3RydWN0dXJlcy4NCg0KIyMjIyBIeXBvdGhlc2lzIDEuNzogSUdPcyB3aXRoIGJvdGggdmVydGljYWwgYW5kIGhvcml6b250YWwgY29vcmRpbmF0aW9uIGVuZHVyZSBsb25nZXN0DQpPYmplY3RpdmU6DQpUZXN0IGlmIElHT3Mgd2l0aCBib3RoIHN0cm9uZyB2ZXJ0aWNhbCBhbmQgaG9yaXpvbnRhbCBjb29yZGluYXRpb24gZW5kdXJlIGxvbmdlci4NCg0KKipDb2x1bW5zIFVzZWQ6KioNCg0KKiBvcmRpbmFsX3Njb3JlX3ZlcnRpY2FsX2Nvb3JkaW5hdGlvbg0KKiB1bl9zeXN0ZW1fY29sbGFib3JhdGlvbl93aXRoaW5faWdvDQoNCmBgYHtyfQ0KbGlicmFyeShnZ3Bsb3QyKQ0KbGlicmFyeShnZ3JlcGVsKQ0KDQojIENyZWF0ZSB0aGUgcGxvdA0KZ2dwbG90KGRmLCBhZXMoeCA9IG9yZGluYWxfc2NvcmVfdmVydGljYWxfY29vcmRpbmF0aW9uLCANCiAgICAgICAgICAgICAgIHkgPSBhZ2UsIA0KICAgICAgICAgICAgICAgY29sb3IgPSB1bl9zeXN0ZW1fY29sbGFib3JhdGlvbl93aXRoaW5faWdvLCANCiAgICAgICAgICAgICAgIGxhYmVsID0gaW5zdGl0dXRpb24pKSArICAjIEFkZGluZyBpbnN0aXR1dGlvbiBuYW1lcyBhcyBsYWJlbHMNCiAgZ2VvbV9wb2ludChhbHBoYSA9IDAuNywgc2l6ZSA9IDMpICsgICMgU2NhdHRlciBwbG90IHdpdGggcG9pbnRzDQogIGdlb21fc21vb3RoKG1ldGhvZCA9ICJsbSIsIHNlID0gVFJVRSkgKyAgIyBBZGQgcmVncmVzc2lvbiBsaW5lIHdpdGggY29uZmlkZW5jZSBpbnRlcnZhbA0KICBnZW9tX3RleHRfcmVwZWwoYWVzKGxhYmVsID0gaW5zdGl0dXRpb24pLCBzaXplID0gMywgbWF4Lm92ZXJsYXBzID0gMTAsIA0KICAgICAgICAgICAgICAgICAgYm94LnBhZGRpbmcgPSAwLjUsIHBvaW50LnBhZGRpbmcgPSAwLjUpICsgICMgTGFiZWwgdGhlIHBvaW50cyAoSUdPcykNCiAgbGFicygNCiAgICB0aXRsZSA9ICJJbnRlcmFjdGlvbjogVmVydGljYWwgQ29vcmRpbmF0aW9uIMOXIFVOIENvbGxhYm9yYXRpb24iLA0KICAgIHggPSAiVmVydGljYWwgQ29vcmRpbmF0aW9uIChPcmRpbmFsIFNjb3JlKSIsDQogICAgeSA9ICJJR08gQWdlIChFbmR1cmFuY2UpIiwNCiAgICBjYXB0aW9uID0gIkZpZ3VyZSAxLjc6IEh5cG90aGVzaXMgMS43IOKAkyBJR09zIHdpdGggc3Ryb25nZXIgdmVydGljYWwgY29vcmRpbmF0aW9uIHRlbmQgdG8gZW5kdXJlIGxvbmdlciwgXG5wYXJ0aWN1bGFybHkgd2hlbiBlbmdhZ2luZyBpbiBVTiBzeXN0ZW0gY29sbGFib3JhdGlvbi4gVGhlIGludGVyYWN0aW9uIHN1Z2dlc3RzIGNvbXBvdW5kaW5nIGVmZmVjdHMuIg0KICApICsNCiAgdGhlbWVfbWluaW1hbCgpICsNCiAgdGhlbWUoDQogICAgcGxvdC5jYXB0aW9uID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMCwgZmFjZSA9ICJpdGFsaWMiLCBzaXplID0gMTAsIGNvbG9yID0gImdyYXk0MCIpLA0KICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE0LCBmYWNlID0gImJvbGQiKSwNCiAgICBwbG90LnN1YnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMikNCiAgKQ0KDQpgYGANCiogVGhlIHBsb3QgYWJvdmUgdGVzdHMgSHlwb3RoZXNpcyAxLjcg4oCUIElHT3Mgd2l0aCBzdHJvbmdlciB2ZXJ0aWNhbCBjb29yZGluYXRpb24gZW5kdXJlIGxvbmdlciwgcGFydGljdWxhcmx5IHdoZW4gZW5nYWdpbmcgaW4gVU4gc3lzdGVtIGNvbGxhYm9yYXRpb24uIFRoZSB4LWF4aXMgcmVwcmVzZW50cyB2ZXJ0aWNhbCBjb29yZGluYXRpb24gKG1lYXN1cmVkIGJ5IHRoZSBvcmRpbmFsIHNjb3JlKSwgd2hpbGUgdGhlIHktYXhpcyBpbmRpY2F0ZXMgdGhlIGFnZSAoZW5kdXJhbmNlKSBvZiB0aGUgSUdPcy4gVGhlIGNvbG9yIHNjYWxlIGluZGljYXRlcyB0aGUgZGVncmVlIG9mIFVOIHN5c3RlbSBjb2xsYWJvcmF0aW9uLCB3aXRoIGRhcmtlciBibHVlIGNvbG9ycyByZXByZXNlbnRpbmcgSUdPcyB3aXRoIGhpZ2hlciBsZXZlbHMgb2YgY29sbGFib3JhdGlvbi4NCg0KKiBGcm9tIHRoZSBwbG90LCB3ZSBjYW4gb2JzZXJ2ZSB0aGF0IG1vc3Qgb2YgdGhlIG9sZGVyIElHT3MgKGhpZ2ggb24gdGhlIHktYXhpcykgdGVuZCB0byBoYXZlIHN0cm9uZ2VyIHZlcnRpY2FsIGNvb3JkaW5hdGlvbiAodG93YXJkcyB0aGUgcmlnaHQgb24gdGhlIHgtYXhpcykuIEFkZGl0aW9uYWxseSwgdGhlcmUgc2VlbXMgdG8gYmUgYSBwb3NpdGl2ZSByZWxhdGlvbnNoaXAgYmV0d2VlbiB2ZXJ0aWNhbCBjb29yZGluYXRpb24gYW5kIElHTyBhZ2UsIHdpdGggdGhlIGRhcmtlciBibHVlIGRvdHMgKGluZGljYXRpbmcgaGlnaGVyIFVOIHN5c3RlbSBjb2xsYWJvcmF0aW9uKSBhcHBlYXJpbmcgcHJlZG9taW5hbnRseSBvbiB0aGUgcmlnaHQgc2lkZSBvZiB0aGUgZ3JhcGgsIHN1Z2dlc3RpbmcgdGhhdCBJR09zIHdpdGggc3Ryb25nZXIgdmVydGljYWwgY29vcmRpbmF0aW9uIGFuZCBtb3JlIGludm9sdmVtZW50IHdpdGggdGhlIFVOIHN5c3RlbSBhcmUgbGlrZWx5IHRvIGhhdmUgZ3JlYXRlciBlbmR1cmFuY2UuIEZvciBpbnN0YW5jZSwgSUdPcyBsaWtlIFVORFAsIFVOIFdvbWVuLCBhbmQgVU5GUEEgYXBwZWFyIGluIGRhcmtlciBzaGFkZXMgYW5kIGhhdmUgaGlnaGVyIGFnZXMsIHdoaWNoIGZ1cnRoZXIgc3VwcG9ydHMgdGhlIGh5cG90aGVzaXMgdGhhdCBJR09zIHdpdGggYm90aCBzdHJvbmcgdmVydGljYWwgYW5kIGhvcml6b250YWwgY29vcmRpbmF0aW9uIGVuZHVyZSB0aGUgbG9uZ2VzdC4NCg0KKipJR09zIHdpdGggc3Ryb25nZXIgdmVydGljYWwgY29vcmRpbmF0aW9uIGRvIG5vdCBuZWNlc3NhcmlseSBlbmR1cmUgbG9uZ2VyIG9uIHRoZWlyIG93bioqLCBidXQgdGhvc2UgdGhhdCBhbHNvIGNvbGxhYm9yYXRlIG1vcmUgYWN0aXZlbHkgd2l0aCB0aGUgVU4gc3lzdGVtIG1heSBiZW5lZml0IGZyb20gY29tcG91bmRlZCBlbmR1cmFuY2UgZWZmZWN0cy4NCg0KIyMjIyBIeXBvdGhlc2lzIDEuODogSUdPcyB3aXRoIGhpZ2ggaW5zdGl0dXRpb25hbCBkZXNpZ24gc2NvcmVzIGVuZHVyZSBsb25nZXINCk9iamVjdGl2ZToNClRlc3QgaWYgSUdPcyB3aXRoIGhpZ2ggaW5zdGl0dXRpb25hbCBkZXNpZ24gc2NvcmVzIGVuZHVyZSBsb25nZXIuDQoNCioqQ29sdW1ucyBVc2VkOioqDQoqIEluc3RpdHV0aW9uYWxfRGVzaWduX1Njb3JlDQpgYGB7cn0NCmRmJEluc3RpdHV0aW9uYWxfRGVzaWduX1Njb3JlIDwtIHJvd01lYW5zKGRmWywgYygib3JkaW5hbF9zY29yZV9zcGF0aWFsIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9yZGluYWxfc2NvcmVfdmVydGljYWxfY29vcmRpbmF0aW9uIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9yZGluYWxfc2NvcmVfc3ViamVjdF9tYXR0ZXIiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAib3JkaW5hbF9zY29yZV9zdHJhdGVnaWVzIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9yZGluYWxfc2NvcmVfZGVmaW5lZF9vYmplY3RpdmVzIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9yZGluYWxfc2NvcmVfZGVmaW5lZF9pbnRlciIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvcmRpbmFsX3Njb3JlX3NvdXJjZXMiKV0sIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmEucm0gPSBUUlVFKQ0KDQpgYGANCg0KYGBge3J9DQpsaWJyYXJ5KGdncGxvdDIpDQoNCmdncGxvdChkZiwgYWVzKHggPSBmYWN0b3Iocm91bmQoSW5zdGl0dXRpb25hbF9EZXNpZ25fU2NvcmUpKSwgDQogICAgICAgICAgICAgICB5ID0gYWdlLCANCiAgICAgICAgICAgICAgIGZpbGwgPSBmYWN0b3Iocm91bmQoSW5zdGl0dXRpb25hbF9EZXNpZ25fU2NvcmUpKSkpICsNCiAgZ2VvbV9iYXIoc3RhdCA9ICJzdW1tYXJ5IiwgZnVuID0gIm1lYW4iKSArDQogIGxhYnMoDQogICAgdGl0bGUgPSAiRW5kdXJhbmNlIGJ5IEluc3RpdHV0aW9uYWwgRGVzaWduIFNjb3JlIiwgDQogICAgeCA9ICJJbnN0aXR1dGlvbmFsIERlc2lnbiBTY29yZSIsIA0KICAgIHkgPSAiTWVhbiBBZ2UiLA0KICAgIGNhcHRpb24gPSAiRmlndXJlIDEuODogSHlwb3RoZXNpcyAxLjgg4oCTIElHT3Mgd2l0aCBzdHJvbmdlciBpbnN0aXR1dGlvbmFsIGRlc2lnbiB0ZW5kIHRvIGVuZHVyZSBsb25nZXIuXG5UaGlzIHBhdHRlcm4gc2hvd3MgYSBwb3NpdGl2ZSBhc3NvY2lhdGlvbiBiZXR3ZWVuIGRlc2lnbiBzdHJlbmd0aCBhbmQgb3JnYW5pemF0aW9uYWwgbG9uZ2V2aXR5LiINCiAgKSArDQogIHRoZW1lX21pbmltYWwoKSArDQogIHRoZW1lKA0KICAgIHBsb3QuY2FwdGlvbiA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAsIGZhY2UgPSAiaXRhbGljIiwgc2l6ZSA9IDEwLCBjb2xvciA9ICJncmF5NDAiKSwNCiAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNCwgZmFjZSA9ICJib2xkIikNCiAgKQ0KYGBgDQoqIFRoZSBiYXIgY2hhcnQgYWJvdmUgdGVzdHMgSHlwb3RoZXNpcyAxLjgg4oCUIElHT3Mgd2l0aCBoaWdoIGluc3RpdHV0aW9uYWwgZGVzaWduIHNjb3JlcyBlbmR1cmUgbG9uZ2VyLiBUaGUgeC1heGlzIHJlcHJlc2VudHMgdGhlIGluc3RpdHV0aW9uYWwgZGVzaWduIHNjb3JlIChyYW5naW5nIGZyb20gMyB0byA2KSwgYW5kIHRoZSB5LWF4aXMgc2hvd3MgdGhlIG1lYW4gYWdlIChlbmR1cmFuY2UpIG9mIHRoZSBJR09zIGluIGVhY2ggZGVzaWduIGNhdGVnb3J5LiBUaGUgYmFycyByZXByZXNlbnQgZGlmZmVyZW50IGNhdGVnb3JpZXMgb2YgaW5zdGl0dXRpb25hbCBkZXNpZ24sIGNvbG9yLWNvZGVkIGJ5IHRoZSBzY29yZSAod2l0aCByZWQgaW5kaWNhdGluZyBsb3dlciBzY29yZXMgYW5kIHB1cnBsZSBpbmRpY2F0aW5nIGhpZ2hlciBzY29yZXMpLg0KDQoqIEZyb20gdGhlIHBsb3QsIHdlIGNhbiBvYnNlcnZlIGEgcG9zaXRpdmUgdHJlbmQ6IElHT3Mgd2l0aCBoaWdoZXIgaW5zdGl0dXRpb25hbCBkZXNpZ24gc2NvcmVzIChzY29yZSA2LCBpbiBwdXJwbGUpIHRlbmQgdG8gaGF2ZSBhIGhpZ2hlciBtZWFuIGFnZSwgd2hpbGUgdGhvc2Ugd2l0aCBsb3dlciBkZXNpZ24gc2NvcmVzIChzY29yZSAzLCBpbiByZWQpIHRlbmQgdG8gaGF2ZSBhIGxvd2VyIG1lYW4gYWdlLiBUaGUgYmFyIGZvciBpbnN0aXR1dGlvbmFsIGRlc2lnbiBzY29yZSA2IChwdXJwbGUpIGlzIG5vdGljZWFibHkgaGlnaGVyIHRoYW4gdGhlIG90aGVycywgaW5kaWNhdGluZyB0aGF0IElHT3Mgd2l0aCBhIHN0cm9uZ2VyIGluc3RpdHV0aW9uYWwgZGVzaWduIChhcyBtZWFzdXJlZCBieSB0aGUgZGVzaWduIHNjb3JlKSB0ZW5kIHRvIGxpdmUgbG9uZ2VyLiBTcGVjaWZpY2FsbHksIElHT3Mgd2l0aCBpbnN0aXR1dGlvbmFsIGRlc2lnbiBzY29yZXMgb2YgNCBhbmQgNSAoZ3JlZW4gYW5kIGJsdWUpIGFsc28gc2hvdyBoaWdoZXIgZW5kdXJhbmNlIHRoYW4gdGhvc2Ugd2l0aCBzY29yZSAzLCBhbHRob3VnaCB0aGV5IGFyZSBub3QgYXMgaGlnaCBhcyB0aG9zZSB3aXRoIHNjb3JlIDYuDQoNCioqU3VwcG9ydHMgSHlwb3RoZXNpcyAxLjggKHBhcnRpYWxseSk6KiogVGhlcmUgaXMgYSBwb3NpdGl2ZSBhc3NvY2lhdGlvbiBiZXR3ZWVuIGluc3RpdHV0aW9uYWwgZGVzaWduIHN0cmVuZ3RoIGFuZCBvcmdhbml6YXRpb25hbCBsb25nZXZpdHksIGVzcGVjaWFsbHkgZnJvbSBzY29yZXMgNCB0byA2Lg0KDQoqKkV4Y2VwdGlvbiBhdCBzY29yZSAzOioqIFRoZSBvbGRlc3QgSUdPcyBtYXkgYmUgImZvdW5kaW5nIGVyYSBpbnN0aXR1dGlvbnMiIHRoYXQgc3Vydml2ZWQgZGVzcGl0ZSBzaW1wbGVyIGRlc2lnbiBzdHJ1Y3R1cmVzLiBUaGlzIG1pZ2h0IHJlZmxlY3QgcGF0aCBkZXBlbmRlbmNlOiBvbGRlciBJR09zIGVuZHVyZWQgYmVjYXVzZSBvZiBoaXN0b3J5IGFuZCBlYXJseSBhZG9wdGlvbiwgbm90IGJlY2F1c2Ugb2YgY29tcGxleCBpbnN0aXR1dGlvbmFsaXphdGlvbi4NCg0KVGhlIHBsb3Qgc3VwcG9ydHMgSHlwb3RoZXNpcyAxLjgsIHN1Z2dlc3RpbmcgYSBwb3NpdGl2ZSByZWxhdGlvbnNoaXAgYmV0d2VlbiBpbnN0aXR1dGlvbmFsIGRlc2lnbiBzdHJlbmd0aCBhbmQgb3JnYW5pemF0aW9uYWwgbG9uZ2V2aXR5LiBJR09zIHdpdGggc3Ryb25nZXIgaW5zdGl0dXRpb25hbCBkZXNpZ25zIChlLmcuLCB0aG9zZSBzY29yaW5nIDUgb3IgNikgYXBwZWFyIHRvIGJlIG1vcmUgZW5kdXJpbmcgdGhhbiB0aG9zZSB3aXRoIHdlYWtlciBkZXNpZ25zIChzY29yZSAzKS4gVGhpcyBmaW5kaW5nIGFsaWducyB3aXRoIHRoZSBpZGVhIHRoYXQgd2VsbC1zdHJ1Y3R1cmVkIG9yZ2FuaXphdGlvbnMsIHdpdGggY2xlYXIgbWFuZGF0ZXMsIHJvYnVzdCBjb29yZGluYXRpb24gbWVjaGFuaXNtcywgYW5kIHNvbGlkIGluc3RpdHV0aW9uYWwgZnJhbWV3b3JrcywgYXJlIGJldHRlciBlcXVpcHBlZCB0byBlbmR1cmUgb3ZlciB0aW1lLiBUaGUgaW5zdGl0dXRpb25hbCBkZXNpZ24gc2NvcmUgc2VydmVzIGFzIGEga2V5IHByZWRpY3RvciBvZiBJR08gZW5kdXJhbmNlLCByZWluZm9yY2luZyB0aGUgaW1wb3J0YW5jZSBvZiBzdHJhdGVnaWMgcGxhbm5pbmcgYW5kIGluc3RpdHV0aW9uYWwgcm9idXN0bmVzcyBmb3IgbG9uZy10ZXJtIHN1cnZpdmFsLg0KDQojIyMgQ29uamVjdHVyZSAxIEtleSBGaW5kaW5ncw0KIyMjIyAxLiBFYXJsaWVyLUVzdGFibGlzaGVkIElHT3MgRW5kdXJlIExvbmdlcg0KRmluZGluZzogSUdPcyBmb3VuZGVkIGVhcmxpZXIgdGVuZCB0byBoYXZlIGdyZWF0ZXIgZW5kdXJhbmNlLg0KDQpXaHkgaXQgbWF0dGVyczogRWFybHkgZXN0YWJsaXNobWVudCBvZnRlbiByZWZsZWN0cyBpbnN0aXR1dGlvbmFsaXNhdGlvbiBhbmQgZW1iZWRkZWRuZXNzIGluIGdsb2JhbCBnb3Zlcm5hbmNlIHN5c3RlbXMuIElHT3MgdGhhdCBoYXZlIGV4aXN0ZWQgZm9yIGRlY2FkZXMgYXJlIG1vcmUgbGlrZWx5IHRvIGhhdmUgZXN0YWJsaXNoZWQgbGVnaXRpbWFjeSwgc3RhYmxlIGZ1bmRpbmcsIGFuZCByb2J1c3QgbmV0d29ya3MuIEltcGxpY2F0aW9uOiBOZXdlciBJR09zIG1heSBmYWNlIGhpZ2hlciByaXNrcyBvZiBtYXJnaW5hbGlzYXRpb24gdW5sZXNzIHRoZXkgY2FuIHJhcGlkbHkgYnVpbGQgY3JlZGliaWxpdHkgYW5kIHBhcnRuZXJzaGlwcy4NCg0KIyMjIyAyLiBUcmVhdHktQmFzZWQgSUdPcyBBcmUgTW9yZSBSZXNpbGllbnQNCkZpbmRpbmc6IElHT3Mgd2l0aCB0cmVhdHktYmFzZWQganVyaXNkaWN0aW9uIGVuZHVyZSBsb25nZXIgdGhhbiB0aG9zZSByZWx5aW5nIG9uIHNvZnQgbGF3IG9yIGRlY2xhcmF0aW9ucy4NCg0KV2h5IGl0IG1hdHRlcnM6IFRyZWF0eS1iYXNlZCBJR09zIGhhdmUgc3Ryb25nZXIgbGVnYWwgYXV0aG9yaXR5LCB3aGljaCBlbmhhbmNlcyB0aGVpciBzdGFiaWxpdHkgYW5kIGFiaWxpdHkgdG8gZW5mb3JjZSBtYW5kYXRlcy4gVGhpcyBsZWdhbCByb2J1c3RuZXNzIHJlZHVjZXMgdnVsbmVyYWJpbGl0eSB0byBkaXNzb2x1dGlvbiBvciBtYXJnaW5hbGlzYXRpb24uIEltcGxpY2F0aW9uOiBJR09zIHNlZWtpbmcgbG9uZy10ZXJtIGltcGFjdCBzaG91bGQgcHJpb3JpdGlzZSBzZWN1cmluZyB0cmVhdHktYmFzZWQgbWFuZGF0ZXMgb3Igc3RyZW5ndGhlbmluZyB0aGVpciBsZWdhbCBmb3VuZGF0aW9ucy4NCg0KIyMjIyAzLiBCcm9hZGVyIFNwYXRpYWwgSnVyaXNkaWN0aW9uIEVuaGFuY2VzIEVuZHVyYW5jZQ0KRmluZGluZzogSUdPcyB3aXRoIGp1cmlzZGljdGlvbiBvdmVyIG11bHRpcGxlIG1hcml0aW1lIHpvbmVzIChlLmcuLCBoaWdoIHNlYXMsIGV4Y2x1c2l2ZSBlY29ub21pYyB6b25lcykgdGVuZCB0byBlbmR1cmUgbG9uZ2VyLg0KDQpXaHkgaXQgbWF0dGVyczogQSBicm9hZGVyIHNwYXRpYWwgcmVtaXQgYWxsb3dzIElHT3MgdG8gcmVtYWluIHJlbGV2YW50IGFjcm9zcyBkaXZlcnNlIGdvdmVybmFuY2UgY29udGV4dHMsIGFkYXB0aW5nIHRvIGVtZXJnaW5nIGNoYWxsZW5nZXMgc3VjaCBhcyBjbGltYXRlIGNoYW5nZSwgYmlvZGl2ZXJzaXR5IGxvc3MsIGFuZCB0cmFuc2JvdW5kYXJ5IGNvbmZsaWN0cy4gSW1wbGljYXRpb246IElHT3Mgc2hvdWxkIGFpbSB0byBleHBhbmQgdGhlaXIgc3BhdGlhbCBqdXJpc2RpY3Rpb24gd2hlcmUgZmVhc2libGUsIGVuc3VyaW5nIHRoZXkgY2FuIGFkZHJlc3MgY3Jvc3MtY3V0dGluZyBvY2VhbiBnb3Zlcm5hbmNlIGlzc3Vlcy4NCg0KIyMjIyA0LiBTdHJvbmcgVmVydGljYWwgQ29vcmRpbmF0aW9uIEltcHJvdmVzIExvbmdldml0eQ0KRmluZGluZzogSUdPcyB3aXRoIHJvYnVzdCB2ZXJ0aWNhbCBjb29yZGluYXRpb24gKGUuZy4sIGFsaWdubWVudCBiZXR3ZWVuIGdsb2JhbCwgcmVnaW9uYWwsIGFuZCBuYXRpb25hbCBsZXZlbHMpIGFyZSBtb3JlIGVuZHVyaW5nLg0KDQpXaHkgaXQgbWF0dGVyczogVmVydGljYWwgY29vcmRpbmF0aW9uIGVtYmVkcyBJR09zIGluIG11bHRpLWxldmVsIGdvdmVybmFuY2Ugc3RydWN0dXJlcywgZW5zdXJpbmcgdGhleSBjYW4gbW9iaWxpc2UgcmVzb3VyY2VzLCBhbGlnbiBwb2xpY2llcywgYW5kIG1haW50YWluIHJlbGV2YW5jZSBhY3Jvc3Mgc2NhbGVzLiBJbXBsaWNhdGlvbjogSUdPcyBzaG91bGQgaW52ZXN0IGluIG1lY2hhbmlzbXMgdGhhdCBzdHJlbmd0aGVuIHZlcnRpY2FsIGxpbmthZ2VzLCBzdWNoIGFzIHBvbGljeSBhbGlnbm1lbnQgZnJhbWV3b3JrcyBhbmQgcmVwb3J0aW5nIHN5c3RlbXMuDQoNCiMjIyMgNS4gRGl2ZXJzaWZpZWQgT2JqZWN0aXZlcyBTdXBwb3J0IEVuZHVyYW5jZQ0KRmluZGluZzogSUdPcyB3aXRoIGEgYnJvYWRlciByYW5nZSBvZiBvYmplY3RpdmVzIChlLmcuLCBlbnZpcm9ubWVudGFsIHByb3RlY3Rpb24sIHRyYWRlLCBzZWN1cml0eSkgdGVuZCB0byBlbmR1cmUgbG9uZ2VyLg0KDQpXaHkgaXQgbWF0dGVyczogRGl2ZXJzaWZpZWQgb2JqZWN0aXZlcyBhbGxvdyBJR09zIHRvIGFkYXB0IHRvIHNoaWZ0aW5nIHByaW9yaXRpZXMgYW5kIG1haW50YWluIHJlbGV2YW5jZSBpbiBkeW5hbWljIGdvdmVybmFuY2UgbGFuZHNjYXBlcy4gSW1wbGljYXRpb246IElHT3Mgc2hvdWxkIGF2b2lkIG92ZXJseSBuYXJyb3cgbWFuZGF0ZXMgYW5kIGluc3RlYWQgZGV2ZWxvcCBmbGV4aWJsZSwgbXVsdGktZGltZW5zaW9uYWwgb2JqZWN0aXZlcy4NCg0KIyMjIyA2LiBIb3Jpem9udGFsIENvb3JkaW5hdGlvbiBTdHJlbmd0aGVucyBSZXNpbGllbmNlDQpGaW5kaW5nOiBJR09zIHdpdGggc3Ryb25nIGhvcml6b250YWwgY29vcmRpbmF0aW9uIChlLmcuLCBwYXJ0bmVyc2hpcHMgd2l0aCBvdGhlciBJR09zLCBVTiBib2RpZXMpIGFyZSBtb3JlIGVuZHVyaW5nLg0KDQpXaHkgaXQgbWF0dGVyczogSG9yaXpvbnRhbCBjb29yZGluYXRpb24gZm9zdGVycyBpbnRlci1pbnN0aXR1dGlvbmFsIGxlZ2l0aW1hY3ksIHJlc291cmNlLXNoYXJpbmcsIGFuZCBjb2xsZWN0aXZlIHByb2JsZW0tc29sdmluZywgd2hpY2ggYXJlIGNyaXRpY2FsIGZvciBsb25nLXRlcm0gcmVzaWxpZW5jZS4gSW1wbGljYXRpb246IElHT3Mgc2hvdWxkIHByaW9yaXRpc2UgYnVpbGRpbmcgZm9ybWFsIHBhcnRuZXJzaGlwcyBhbmQgbmV0d29ya3MgdG8gZW5oYW5jZSB0aGVpciBlbmR1cmFuY2UuDQoNCiMjIyMgNy4gQ29tYmluZWQgVmVydGljYWwgYW5kIEhvcml6b250YWwgQ29vcmRpbmF0aW9uIE1heGltaXNlcyBFbmR1cmFuY2UNCkZpbmRpbmc6IElHT3MgdGhhdCBleGNlbCBpbiBib3RoIHZlcnRpY2FsIGFuZCBob3Jpem9udGFsIGNvb3JkaW5hdGlvbiBlbmR1cmUgdGhlIGxvbmdlc3QuDQoNCldoeSBpdCBtYXR0ZXJzOiBDb21iaW5lZCBjb29yZGluYXRpb24gbWVjaGFuaXNtcyBjcmVhdGUgcm9idXN0IGdvdmVybmFuY2UgbmV0d29ya3MsIGVuYWJsaW5nIElHT3MgdG8gbmF2aWdhdGUgY29tcGxleCwgbXVsdGktbGV2ZWwgY2hhbGxlbmdlcyBlZmZlY3RpdmVseS4gSW1wbGljYXRpb246IElHT3Mgc2hvdWxkIHN0cml2ZSB0byBkZXZlbG9wIGJvdGggc3Ryb25nIHZlcnRpY2FsIChtdWx0aS1sZXZlbCkgYW5kIGhvcml6b250YWwgKGludGVyLWluc3RpdHV0aW9uYWwpIGNvb3JkaW5hdGlvbiBtZWNoYW5pc21zLg0KDQojIyMjIDguIEhpZ2ggSW5zdGl0dXRpb25hbCBEZXNpZ24gU2NvcmVzIENvcnJlbGF0ZSB3aXRoIEdyZWF0ZXIgRW5kdXJhbmNlDQpGaW5kaW5nOiBJR09zIHdpdGggaGlnaCBpbnN0aXR1dGlvbmFsIGRlc2lnbiBzY29yZXMgKGEgY29tcG9zaXRlIG1lYXN1cmUgb2YgbGVnYWwgZm91bmRhdGlvbiwgY29vcmRpbmF0aW9uLCBhbmQgb2JqZWN0aXZlcykgZW5kdXJlIGxvbmdlci4NCg0KV2h5IGl0IG1hdHRlcnM6IEEgc3Ryb25nIGluc3RpdHV0aW9uYWwgZGVzaWduIHJlZmxlY3RzIGEgd2VsbC1zdHJ1Y3R1cmVkLCBsZWdhbGx5IHJvYnVzdCwgYW5kIHN0cmF0ZWdpY2FsbHkgY29oZXJlbnQgb3JnYW5pc2F0aW9u4oCUcXVhbGl0aWVzIHRoYXQgZW5oYW5jZSBsb25nLXRlcm0gcmVzaWxpZW5jZS4gSW1wbGljYXRpb246IElHT3Mgc2hvdWxkIHJlZ3VsYXJseSBhc3Nlc3MgYW5kIHN0cmVuZ3RoZW4gdGhlaXIgaW5zdGl0dXRpb25hbCBkZXNpZ24gdG8gaW1wcm92ZSBlbmR1cmFuY2UuDQpUaGUgZW5kdXJhbmNlIG9mIElHT3MgaW4gb2NlYW4gZ292ZXJuYW5jZSBpcyBub3QgYWNjaWRlbnRhbCwgaXQgaXMgc2hhcGVkIGJ5IGluc3RpdHV0aW9uYWwgZGVzaWduIGNob2ljZXMuIElHT3Mgd2l0aCBlYXJseSBlc3RhYmxpc2htZW50LCB0cmVhdHktYmFzZWQganVyaXNkaWN0aW9uLCBicm9hZCBzcGF0aWFsIHJlbWl0LCBkaXZlcnNpZmllZCBvYmplY3RpdmVzLCBhbmQgc3Ryb25nIGNvb3JkaW5hdGlvbiBtZWNoYW5pc21zIGFyZSBtb3JlIGxpa2VseSB0byBlbmR1cmUgYW5kIHJlbWFpbiBlZmZlY3RpdmUgb3ZlciB0aW1lLg0KDQpCeSBmb2N1c2luZyBvbiB0aGVzZSBkZXNpZ24gZmVhdHVyZXMsIElHT3MgY2FuIGVuaGFuY2UgdGhlaXIgcmVzaWxpZW5jZSwgbGVnaXRpbWFjeSwgYW5kIGNhcGFjaXR5IHRvIGdvdmVybiB0aGUgb2NlYW4gZWNvbm9teSBzdXN0YWluYWJseS4=