Global Terrorism Dataset
First, I had a look at the dataset that Dr. Martinez Machain suggested in her email, the Global Terrorism Dataset.
If we sum the number of total terrorist acts per country per year, we see that the top three countries are Iraq, Pakistan and Afghanistan.
Source: https://www.start.umd.edu/data-tools/global-terrorism-database-gtd
The Global Terrorism Database (GTD) is an open-source database including information on terrorist events around the world since 1970 (currently updated through 2018). Unlike many other event databases, the GTD includes systematic data on international as well as domestic terrorist incidents that have occurred during this time period and now includes over 190,000 cases.
LaFree, G., & Dugan, L. (2007). Introducing the global terrorism database. Terrorism and political violence, 19(2), 181-204.
Total terrorist attacks
Total terrorist attacks between 1970 and 2019
gtd %>%
group_by(country_txt, region_txt) %>%
summarise(sum = n()) %>%
ungroup() %>%
filter(sum > 4000) %>%
ggplot(aes(x = reorder(country_txt, sum),
y = sum,
fill = as.factor(region_txt))) +
scale_fill_manual(values = c("#001219","#005f73","#0a9396","#94d2bd",
"#ee9b00","#ca6702","#bb3e03","#ae2012","#9b2226")) +
coord_flip() +
geom_bar(stat = "identity") +
ggthemes::theme_pander() +
theme(legend.position = "bottom",
legend.title = element_blank()) +
ggtitle("Total terrorist attacks 1970 - 2019")
## `summarise()` has grouped output by 'country_txt'. You can override using the `.groups` argument.

Suicide attacks
If we look only at suicide attack, the countries are still Iraq, Afghanistan and Pakistan.
There does not appear to be a variable to indicate if the terrorist attack was related explicitly to Islamic Fundamentalism.
Suicide terrorist attacks between 1970 and 2019
gtd %>%
filter(suicide == 1 ) %>%
group_by(country_txt, region_txt) %>%
summarise(suicide_sum = n()) %>%
ungroup() %>%
filter(suicide_sum > 50) %>%
ggplot(aes(x = reorder(country_txt, suicide_sum),
y = suicide_sum,
fill = as.factor(region_txt))) +
scale_fill_manual(values = c("#001219", "#0a9396", "#ee9b00", "#ca6702","#bb3e03",
"#005f73", "#94d2bd", "#ae2012", "#9b2226")) +
coord_flip() +
geom_bar(stat = "identity") +
ggthemes::theme_pander() +
theme(legend.position = "bottom", legend.title = element_blank()) +
ggtitle("Suicide terrorist attacks 1970 - 2019")
## `summarise()` has grouped output by 'country_txt'. You can override using the `.groups` argument.

Look only at 2019
gtd %>%
filter(suicide == 1 ) %>%
filter(iyear == 2019) %>%
group_by(country_txt, iyear, region_txt) %>%
select(year = iyear, everything()) %>%
summarise(suicide_sum = n()) %>%
arrange(desc(suicide_sum)) %>%
head(20) %>%
ungroup() %>%
ggplot(aes(x = reorder(country_txt, suicide_sum),
y = suicide_sum,
fill = as.factor(region_txt))) +
scale_fill_manual(values = c("#001219", "#0a9396",
"#ca6702","#9b2226",
"#94d2bd","#ee9b00")) +
coord_flip() +
geom_bar(stat = "identity") + facet_wrap(~year) +
ggthemes::theme_pander() +
theme(legend.position = "bottom", legend.title = element_blank()) +
ggtitle("Total suicide terrorist attacks per country in 2019")
## `summarise()` has grouped output by 'country_txt', 'year'. You can override using the `.groups` argument.

So for the dataset, we can add a variable with number of terrorist attacks per country per year or we can create a binary variable with a cut-off point.
We can also look at number of terrorist attacks per capita per year and run a scatter plot with PD budgets to see if there is a linear relationship
## `summarise()` has grouped output by 'cow_code', 'year'. You can override using the `.groups` argument.
## `summarise()` has grouped output by 'cow_code'. You can override using the `.groups` argument.
## `summarise()` has grouped output by 'cow_code'. You can override using the `.groups` argument.
## `summarise()` has grouped output by 'cow_code', 'year'. You can override using the `.groups` argument.
A tibble: 173 x 2
country avg_suicide 1 Afghanistan 4.17 2 Iraq 1.67 3 Somalia 1.06 4 Nigeria 1
5 Pakistan 0.833 6 Egypt 0.5
7 Niger 0.444 8 Sri Lanka 0.389 9 Philippines 0.333 10 Mali 0.278 # … with 163 more rows
Scatterplot comparing all types of terrorist attacks per capita vs PD budgets per capita
the_df %>%
mutate(attacks_pc = sum_attacks / pop, na.rm = TRUE) %>%
ggplot(aes(y = log(budget_pc), x = log(attacks_pc))) +
geom_smooth(method = "lm", color = "#9d0208") +
geom_point(aes(color = as.factor(region_6), shape = as.factor(region_6))) +
facet_wrap(~year) +
scale_color_manual(values = c("#219ebc", "#264653", "#43aa8b", "#6d597a", "#e63946", "#f4a261"), name = NULL) +
scale_shape_manual(values = c(15,16,17,18,19,10), name = NULL) +
xlab("Logged number of terrorist attacks per capita") +
ylab("Logged PD budget per capita") +
theme(legend.position = "left") +
ggthemes::theme_pander() +
ggtitle("Total terrorist attacks per capita vs PD budgets per capita")
## `geom_smooth()` using formula 'y ~ x'

Scatterplot comparing suicide terrorist attacks per capita vs PD budgets per capita
the_df %>%
mutate(attacks_pc = sum_suicides / pop, na.rm = TRUE) %>%
ggplot(aes(y = log(budget_pc), x = log(attacks_pc))) +
geom_smooth(method = "lm", color = "#9d0208") +
geom_point(aes(color = as.factor(region_6), shape = as.factor(region_6))) +
facet_wrap(~year) +
scale_color_manual(values = c("#219ebc", "#264653", "#43aa8b",
"#6d597a", "#e63946", "#f4a261"), name = NULL) +
scale_shape_manual(values = c(15,16,17,18,19,10), name = NULL) +
xlab("Logged number of terrorist attacks per capita") +
ylab("Logged PD budget per capita") +
theme(legend.position = "left") +
ggthemes::theme_pander() +
ggtitle("Suicide attacks per capita vs PD budgets per capita")
## `geom_smooth()` using formula 'y ~ x'

the_df %>%
ggplot(aes(y = log(budget_pc), x = log(sum_suicides))) +
geom_smooth(method = "lm", color = "#9d0208") +
geom_point(aes(color = as.factor(region_6), shape = as.factor(region_6))) +
facet_wrap(~year) +
scale_color_manual(values = c("#219ebc", "#264653", "#43aa8b",
"#6d597a", "#e63946", "#f4a261"), name = NULL) +
scale_shape_manual(values = c(15,16,17,18,19,10), name = NULL) +
xlab("Logged number of terrorist attacks per capita") +
ylab("Logged PD budget per capita") +
theme(legend.position = "left") +
ggthemes::theme_pander() +
ggtitle("Suicide attacks per capita vs PD budgets per capita")
## `geom_smooth()` using formula 'y ~ x'

Only looking at terrorist attacks in 2019
the_df %>%
filter(year == 2019) %>%
mutate(attacks_pc = sum_attacks / pop, na.rm = TRUE) %>%
ggplot(aes(y = log(budget), x = log(sum_attacks), group = as.factor(region_6))) +
geom_smooth(method = "lm", color = "#9d0208", alpha = 0.5) +
geom_point(aes(color = as.factor(region_6), shape = as.factor(region_6))) +
facet_wrap(~region_6) +
scale_color_manual(values = c("#219ebc", "#264653", "#43aa8b", "#6d597a", "#e63946", "#f4a261"),
name = NULL) +
scale_shape_manual(values = c(15,16,17,18,19,10),
name = NULL) +
xlab("Logged number of terrorist attacks per capita") +
ylab("Logged PD budget per capita") +
theme(legend.position = "left") +
ggthemes::theme_pander() +
ggtitle("Total terrorist attacks per capita vs PD budgets per capita in 2019")
## `geom_smooth()` using formula 'y ~ x'

Suicide attacks per capita vs PD budgets per capita since 2013
the_df %>%
filter(year > 2012) %>%
mutate(attacks_pc = sum_suicides / pop, na.rm = TRUE) %>%
ggplot(aes(y = log(budget_pc), x = log(attacks_pc))) +
geom_smooth(method = "lm", color = "#9d0208") +
geom_point(aes(color = as.factor(region_6), shape = as.factor(region_6))) +
facet_wrap(~region_6) +
scale_color_manual(values = c("#219ebc", "#264653", "#43aa8b", "#6d597a", "#e63946", "#f4a261"), name = NULL) +
scale_shape_manual(values = c(15,16,17,18,19,10), name = NULL) +
xlab("Logged number of terrorist attacks per capita") +
ylab("Logged PD budget per capita") +
theme(legend.position = "left") +
ggthemes::theme_pander() +
ggtitle("Suicide attacks per capita vs PD budgets per capita since 2013")
## `geom_smooth()` using formula 'y ~ x'

Chinese aid dataset
Next we can decide which countries are in China’s sphere of influence.
Source: https://www.aiddata.org/data/chinese-global-official-finance-dataset
This dataset tracks the known universe of overseas Chinese official finance between 2000-2014, capturing 4,373 records totaling $354.4 billion. The data includes both Chinese aid and non-concessional official financing.
Bluhm, R., Dreher, A., Fuchs, A., Parks, B. C., Strange, A., & Tierney, M.J. (2018). Connective Financing: Chinese Infrastructure Projects and the Diffusion of Economic Activity in Developing Countries. AidData Working Paper
Looking at the total aid from China between 2000 to 2014
china_aid %>%
filter(!is.na(region_name)) %>%
group_by(country, region_name) %>%
filter(!grepl("regional", country)) %>%
summarise(sum_aid = sum(chn_aid, na.rm = TRUE)) %>%
ungroup() %>%
top_n(30) %>%
ggplot(aes(x= reorder(country, sum_aid),
y = sum_aid,
fill = as.factor(region_name))) +
geom_bar(stat = "identity") +
coord_flip() +
scale_fill_manual(values = c("#005f73","#0a9396","#94d2bd","#ee9b00",
"#ca6702","#bb3e03","#ae2012","#9b2226"),
name = NULL) +
theme(axis.text.y = element_text(size = 10),
axis.title.y = element_blank(),
legend.position = "bottom") +
xlab("country") +
ylab("Total aid from China") +
ggthemes::theme_pander() +
ggtitle("Total aid from China betweem 2000 - 2014")
## `summarise()` has grouped output by 'country'. You can override using the `.groups` argument.
## Selecting by sum_aid

china_aid %>%
filter(!is.na(region_name)) %>%
group_by(country, region_name) %>%
filter(!grepl("regional", country)) %>%
summarise(sum_aid = sum(chn_aid, na.rm = TRUE)) %>%
ungroup() %>%
top_n(20) %>% pull(country) -> top_china_aid_vector
## `summarise()` has grouped output by 'country'. You can override using the `.groups` argument.
## Selecting by sum_aid
top_china_aid_vector
[1] “Angola” “Argentina” “Belarus” “Brazil” “Ecuador”
[6] “Ethiopia” “Ghana” “India” “Indonesia” “Iran”
[11] “Kazakhstan” “Laos” “Nigeria” “Pakistan” “Philippines” [16] “Russia” “Sri Lanka” “Sudan” “Venezuela” “Viet Nam”
china_aid %>%
filter(!is.na(region_name)) %>%
group_by(country, region_name) %>%
filter(!grepl("regional", country)) %>%
mutate(chn_aid_pc = chn_aid / population, na.rm = TRUE) %>%
summarise(sum_aid_pc = sum(chn_aid_pc, na.rm = TRUE)) %>%
ungroup() %>%
top_n(20) %>% pull(country) -> top_china_aid_pc_vector
## `summarise()` has grouped output by 'country'. You can override using the `.groups` argument.
## Selecting by sum_aid_pc
top_china_aid_pc_vector
[1] “Albania” “Antigua & Barbuda” “Bahamas”
[4] “Belarus” “Bosnia-Herzegovina” “Cyprus”
[7] “Dominica” “Equatorial Guinea” “Fiji”
[10] “Grenada” “Laos” “Maldives”
[13] “Mauritius” “Mongolia” “Samoa”
[16] “Sao Tome & Principe” “Seychelles” “Tonga”
[19] “Turkmenistan” “Venezuela”
Chinese FDI in Africa
Source: https://www.aiddata.org/data/aiddatas-chinese-official-finance-to-africa-dataset-version-1-1-1
This is a dataset of Chinese official finance activities that spans 50 African countries over the 2000-2012 period. It includes 1,952 Chinese development finance projects across 3,545 physical locations.
Dreher, A., Fuchs, A., Hodler, R., Parks, B. C., Raschky, P. A., & Tierney, M.J. (2019). African Leaders and the Geography of China’s Foreign Assistance. Journal of Development Economics, 140, 44-71.
Total development finance investment to Africa from China 2000 to 2012
fdi_af %>%
top_n(25) %>%
ggplot(aes(x = reorder(country, sum_fdi), y = sum_fdi, fill = country)) +
geom_bar(stat = "identity") +
coord_flip() + ggthemes::theme_pander() +
theme(axis.text.y = element_text(size = 10),
axis.title.y = element_blank(),
legend.position = "none") + ggthemes::theme_pander() +
xlab("Total development finance costs") +
ylab("Country") +
ggthemes::theme_pander() + theme(legend.position = "none") +
ggtitle("Total development finance investment from China 2000 to 2012 ")
## Selecting by cow_code

Looking at the financial development investment per capita to Africa 2000 to 2102
the_df <-merge(the_df, fdi_af, by = c("cow_code"), all.x = TRUE)
the_df %>%
filter(sum_fdi > 10000) %>%
mutate(fdi_pc = sum_fdi / pop, na.rm = TRUE) %>%
ggplot(aes(x = reorder(country.x, fdi_pc), y = fdi_pc, fill = country.x)) +
geom_bar(stat = "identity") +
coord_flip() + ggthemes::theme_pander() +
theme(axis.text.y = element_text(size = 10),
axis.title.y = element_blank(),
legend.position = "none") + ggthemes::theme_pander() +
xlab("Total finance costs per capita") +
ylab("Country") +
ggthemes::theme_pander() + theme(legend.position = "none") +
ggtitle("Total finance per capita from China 2000 to 2012 ")

Russia’s Sphere of Influence
Russia’s sphere contains all post-soviet countries and all countries that are contiguous to Russia
China’s Sphere of Influence
China’s spehere contains top 20 aid recipients per capita and top financial recipients per capita from XXX YYY years/
It also contains all countries contiguous to China.
Average voting similarity to China in the UN
Source: https://dataverse.harvard.edu/dataset.xhtml?persistentId=doi:10.7910/DVN/5GQIVU
Rodrigues Vieira, V. (2018). Who joins counter-hegemonic IGOs? Early and late members of the China-led Asian Infrastructure Investment Bank. Research & Politics, 5(2)
China Alignment correspond to the average ideal point scale (ranging from 0 to 100) of Bailey et al. (2015) for a state’s vote with Chinese positions in the United Nations General Assembly between 1990 and 2009, a period during which US leadership in world affairs seemed robust. This measures the strength of international ties with China in political terms
aiib <- read_dta("C:/Users/Paula/Desktop/AIIB-ForResubmission.dta")
aiib %>%
select(country, chinaalignment) %>%
arrange(desc(chinaalignment)) %>%
filter(chinaalignment > 9000) %>%
kbl() %>%
kable_paper("striped",
full_width = F)
|
country
|
chinaalignment
|
|
Vietnam
|
9407.000
|
|
Myanmar
|
9340.000
|
|
Korea, Dem. Rep.
|
9259.000
|
|
Lao PDR
|
9223.000
|
|
Cuba
|
9175.999
|
|
Zimbabwe
|
9109.000
|
|
Syrian Arab Republic
|
9096.000
|
|
Libya
|
9086.000
|
|
Iran, Islamic Rep.
|
9086.000
|
|
Yemen, Rep.
|
9070.000
|
|
Sudan
|
9061.000
|
|
Oman
|
9027.000
|
|
Egypt, Arab Rep.
|
9019.000
|
|
Qatar
|
9016.000
|
|
Iraq
|
9008.000
|
aiib %>%
filter(chinaalignment > 8800) %>%
ggplot(aes(x = reorder(country, chinaalignment), y = chinaalignment, fill = country)) +
geom_bar(stat = "identity") +
coord_flip() + ggthemes::theme_pander() +
theme(axis.text.y = element_text(size = 10),
axis.title.y = element_blank(),
legend.position = "none") + ggthemes::theme_pander() +
ylab("Voting similarity to China (average)") +
xlab("Country") +
ggthemes::theme_pander() + theme(legend.position = "none") +
ggtitle("Top aligned to Chinese UN voting 2000 - 2014")

aiib %>%
filter(chinaalignment < 5500) %>%
ggplot(aes(x = reorder(country, chinaalignment), y = chinaalignment, fill = country)) +
geom_bar(stat = "identity") +
coord_flip() + ggthemes::theme_pander() +
theme(axis.text.y = element_text(size = 10),
axis.title.y = element_blank(),
legend.position = "none") + ggthemes::theme_pander() +
ylab("Voting similarity to China (average)") +
xlab("Country") +
ggthemes::theme_pander() + theme(legend.position = "none") +
ggtitle("Least aligned to Chinese UN voting 2000 - 2014")

map <- ne_countries(scale = "medium", returnclass = "sf")
aiib$iso3c <- countrycode(aiib$country, "cown","iso3c")
map_aiib <- merge(map, aiib, by.x = "adm0_a3", by.y = "wbcode", all.x = TRUE)
View(map)
coord <- read_html("https://developers.google.com/public-data/docs/canonical/countries_csv")
coord_tables <- coord %>% html_table(header = TRUE, fill = TRUE)
coordy <- coord_tables[[1]]
col_map <- merge(map_aiib, coordy, by.x= "iso_a2", by.y = "country", all.y = TRUE)
map_aiib %>%
# filter(geounit != "Siachen Glacier") %>%
filter(subregion == "Eastern Asia" | subregion == "South-Eastern Asia" | subregion == "Southern Asia") %>%
ggplot() +
geom_sf(aes(fill = chinaalignment),
position = "identity") +
labs(fill='Russian Sphere') +
# geom_label(aes(longitude+1, latitude+1, label = factor(geounit)), size = 3) +
ggthemes::theme_map() +
theme(legend.position = "blank") +
scale_fill_distiller(palette = "RdBu")

col_map %>%
filter(continent == "Africa") %>% ggplot() +
geom_sf(aes(fill = chinaalignment),
position = "identity") +
labs(fill='Russian Sphere') +
geom_label(aes(longitude+1, latitude+1, label = factor(geounit)), size = 3) +
ggthemes::theme_map() +
theme(legend.position = "blank") +
scale_fill_distiller(palette = "RdBu")

plyr::count(map_aiib$subregion)
x freq
1 Antarctica 1 2 Australia and New Zealand 4 3 Caribbean 25 4 Central America 8 5 Central Asia 5 6 Eastern Africa 19 7 Eastern Asia 8 8 Eastern Europe 10 9 Melanesia 5 10 Micronesia 7 11 Middle Africa 9 12 Northern Africa 7 13 Northern America 5 14 Northern Europe 15 15 Polynesia 8 16 Seven seas (open ocean) 5 17 South-Eastern Asia 11 18 South America 13 19 Southern Africa 5 20 Southern Asia 10 21 Southern Europe 16 22 Western Africa 17 23 Western Asia 19 24 Western Europe 9
europe_cropped <- st_crop(map_aiib, xmin = -20, xmax = 45,
ymin = 30, ymax = 73)
## although coordinates are longitude/latitude, st_intersection assumes that they are planar
europe_cropped %>%
filter(subregion == "Eastern Europe" | subregion == "Northern Europe" | subregion == "Southern Europe" | subregion == "Western Europe") %>%
ggplot() +
geom_sf(aes(fill = chinaalignment),
position = "identity") +
labs(fill='Russian Sphere') +
# geom_label(aes(longitude+1, latitude+1, label = factor(geounit)), size = 3) +
ggthemes::theme_map() +
theme(legend.position = "blank") +
scale_fill_distiller(palette = "RdBu")

aiib %>%
filter(aiibmember == 1) %>%
select(country) %>%
kbl() %>%
kable_paper("striped",
full_width = F)
|
country
|
|
Brazil
|
|
United Kingdom
|
|
Netherlands
|
|
Luxembourg
|
|
France
|
|
Switzerland
|
|
Spain
|
|
Portugal
|
|
Germany
|
|
Poland
|
|
Austria
|
|
Italy
|
|
Malta
|
|
Russian Federation
|
|
Georgia
|
|
Azerbaijan
|
|
Finland
|
|
Sweden
|
|
Norway
|
|
Denmark
|
|
Iceland
|
|
South Africa
|
|
Iran, Islamic Rep.
|
|
Turkey
|
|
Egypt, Arab Rep.
|
|
Jordan
|
|
Israel
|
|
Saudi Arabia
|
|
Kuwait
|
|
Qatar
|
|
United Arab Emirates
|
|
Oman
|
|
Tajikistan
|
|
Kyrgyz Republic
|
|
Uzbekistan
|
|
Kazakhstan
|
|
Mongolia
|
|
Korea, Rep.
|
|
India
|
|
Pakistan
|
|
Bangladesh
|
|
Myanmar
|
|
Sri Lanka
|
|
Maldives
|
|
Nepal
|
|
Thailand
|
|
Cambodia
|
|
Lao PDR
|
|
Vietnam
|
|
Malaysia
|
|
Singapore
|
|
Philippines
|
|
Indonesia
|
|
Australia
|
|
New Zealand
|
Chinese Public Diplomacy Efforts and Activities
soviet_iron_curtain_vector <- c("Albania",
"Bulgaria",
"Czech Republic",
"Poland",
"Kosovo",
"Romania",
"Hungary",
"Slovakia",
"Bosnia and Herzegovina",
"Croatia",
"Macedonia",
"Montenegro",
"Serbia")
soviet_republics_vector <- c("Russia", "Lithuania", "Georgia",
"Estonia" ,
"Latvia" ,
"Ukraine" ,
"Belarus" ,
"Moldova" ,
"Kyrgyzstan",
"Uzbekistan",
"Tajikistan",
"Armenia" ,
"Azerbaijan",
"Turkmenistan",
"Russia" ,
"Kazakhstan")
the_df %<>%
dplyr::mutate(soviet_iron_curtain = ifelse(country.x %in% soviet_iron_curtain_vector, 1, 0))
the_df %<>%
dplyr::mutate(soviet_republics = ifelse(country.x %in% soviet_republics_vector, 1, 0))
the_df %<>% mutate(rus_influence = ifelse(country.x == "Russia", 1,
ifelse(soviet_republics == 1, 1,
ifelse(soviet_iron_curtain == 1, 1, 0))))
eurasian_dev_bank <- c("Russia", "Armenia", "Belarus", "Kazakhstan", "Kyrgystan", "Tajikistan")
brics <- c("Brazil", "Russia", "India", "China", "South Africa")
qccm <- c("China", "Afhganistan", "Pakistan", "Tajikistan")
forum_china_africa_coop <- c("China", "Algeria", "Angola", "Benin", "Botswana", "Burkina Faso")
US Trade Dependence
the_df %>%
select(country, year, us_trade_dependence) %>%
filter(us_trade_dependence > 0.1) %>%
arrange(desc(us_trade_dependence)) %>%
filter(year == 2019) %>%
filter(us_trade_dependence > 0.3) %>%
kbl() %>%
kable_paper("striped",
full_width = F)
|
country
|
year
|
us_trade_dependence
|
|
Mexico
|
2019
|
0.6193343
|
|
Honduras
|
2019
|
0.5459561
|
|
Canada
|
2019
|
0.5366950
|
|
Nicaragua
|
2019
|
0.4553335
|
|
Bahamas, The
|
2019
|
0.3743550
|
|
Trinidad and Tobago
|
2019
|
0.3496008
|
|
Haiti
|
2019
|
0.3317885
|
|
Dominican Republic
|
2019
|
0.3269815
|
|
Guatemala
|
2019
|
0.3067713
|
the_df %>%
filter(gdp_const > 500000000000) %>%
select(country, year, us_trade_dependence) %>%
arrange(desc(us_trade_dependence)) %>%
# filter(us_trade_dependence > 0.2) %>%
ggplot(aes(y = us_trade_dependence,
x = reorder(country, us_trade_dependence), fill = country)) +
coord_flip() +
geom_histogram(stat = "identity") + ggthemes::theme_pander() +
facet_grid(~year, scales = "free") + theme(legend.position = "none") +
ggtitle("Level of trade dependence in countries over 500 million GDP") + xlab("") + ylab("Percentage of total trade that is with US")

Divide budget by cost of living
url <- "https://www.numbeo.com/cost-of-living/rankings_by_country.jsp?title=2019"
# Countries with no INDEX
col_url <- read_html(url)
col_table <- col_url %>% html_table(header = TRUE, fill = TRUE)
col_19 <- col_table[[2]]
col_19$year <- replicate(119, 2019)
col_19$rank <- NULL
col_19 %<>%
clean_names()
col_19$cow_code <- countrycode(col_19$country, "country.name", "cown")
col_19 %<>% dplyr::mutate(cow_code = ifelse(country == "Palestine", 6666,
ifelse(country == "Serbia", 345,
ifelse(country == "Hong Kong", 997, cow_code))))
col_19 %>%
arrange(desc(cost_of_living_index)) %>%
filter(cost_of_living_index > 65) %>%
head() %>%
kbl() %>%
kable_paper("striped",
full_width = F)
|
rank
|
country
|
cost_of_living_index
|
rent_index
|
cost_of_living_plus_rent_index
|
groceries_index
|
restaurant_price_index
|
local_purchasing_power_index
|
year
|
cow_code
|
|
NA
|
Switzerland
|
121.16
|
50.25
|
87.11
|
120.81
|
123.09
|
129.70
|
2019
|
225
|
|
NA
|
Iceland
|
101.86
|
48.28
|
76.13
|
92.10
|
111.85
|
91.80
|
2019
|
395
|
|
NA
|
Norway
|
100.99
|
37.28
|
70.40
|
92.67
|
111.53
|
103.61
|
2019
|
385
|
|
NA
|
Bahamas
|
92.40
|
33.49
|
64.11
|
76.97
|
99.92
|
57.01
|
2019
|
31
|
|
NA
|
Luxembourg
|
86.09
|
55.64
|
71.47
|
75.10
|
96.08
|
106.26
|
2019
|
212
|
|
NA
|
Japan
|
83.33
|
27.97
|
56.75
|
83.58
|
48.75
|
103.12
|
2019
|
740
|
Examining 2019 cost of living adjustment
# df_19 <- the_df %>%
# filter(year == 2019)
#
#
# df_19 <- merge(df_19, col_19, by = c("cow_code"), all.x = TRUE)
#
# options(scipen = 999)
#
#
#
# df_19 %>%
# # mutate(cost_living_percent = cost_of_living_index / 100, na.rm = TRUE) %>%
# mutate(adj_budget = budget / cost_of_living_index) %>%
# select(country = country.x, adj_budget, budget) %>%
# arrange(desc(adj_budget)) -> t1
#
# df_19 %>%
# # mutate(cost_living_percent = cost_of_living_index / 100, na.rm = TRUE) %>%
# mutate(adj_budget = budget / cost_of_living_index) %>%
# select(country = country.x, budget, adj_budget) %>%
# arrange(desc(budget)) -> t2
#
# kbl(list(t1, t2), digits = 0, caption = "Arranged By Adjusted Budget LEFT and By Raw Budget RIGHT") %>%
# kable_paper("striped",
# full_width = T)
Purchase Power Parity
Source: https://data.worldbank.org/indicator/PA.NUS.PPPC.RF
Price level ratio is the ratio of a purchasing power parity (PPP) conversion factor to an exchange rate. It provides a measure of the differences in price levels between countries by indicating the number of units of the common currency needed to buy the same volume of the aggregation level in each country.
Indicator source: International Comparison Program, World Bank
#
# library(WDI)
#
# ppp = WDI(indicator='PA.NUS.PPPC.RF', country="all", start=2019, end=2019)
# ppp$ppp <- ppp$PA.NUS.PPPC.RF
# ppp$PA.NUS.PPPC.RF <- NULL
#
# View(ppp)
#
# ppp$cow_code <- countrycode(ppp$iso2c, "iso2c", "cown")
#
# ppp %<>%
# dplyr::mutate(cow_code = ifelse(country == "West Bank and Gaza", 6666,
# ifelse(country == "Serbia", 345,
# ifelse(country == "Hong Kong SAR, China", 997, cow_code))))
#
# ppp$country <- NULL
#
#
# try %<>%
# filter(!is.na(cow_code)) %>%
# mutate(ppp_budget_div = budget / ppp) %>%
# mutate(ppp_budget_mul = budget * ppp) %>%
# filter(country.x != "Kosovo") %>%
# select(country.x, budget, ppp, cow_code, ppp_budget_div,ppp_budget_mul ) -> hi
#
# View(hi)
#
# try %>%
# group_by(country.x) %>%
# mutate(ppp_budget = budget / ppp) %>%
# select(country = country.x, ppp_budget, raw_budget = budget) %>%
# arrange(desc(ppp_budget)) -> t3
#
# try %>%
# group_by(country.x) %>%
# mutate(ppp_budget = budget / ppp) %>%
# select(country.x, raw_budget = budget, ppp_budget) %>%
# arrange(desc(raw_budget)) -> t4
#
# kbl(list(t3, t4), digits = 0, caption = "Arranged By PPP Adjusted Budget LEFT and By PPP Raw Budget RIGHT") %>%
# kable_paper("striped",
# full_width = T)
# col %<>%
# select(cow_code, year, everything())
#
#
# url <- "https://www.numbeo.com/cost-of-living/rankings_by_country.jsp?title=2018"
#
# col_url <- read_html(url)
# col_table <- col_url %>% html_table(header = TRUE, fill = TRUE)
# col_18 <- col_table[[2]]
#
# col_18$year <- replicate(115, 2018)
#
# col_18 %<>%
# clean_names()
#
# col_18$cow_code <- countrycode(col_18$country, "country.name", "cown")
# # Some values were not matched unambiguously: Bermuda, Hong Kong, Jersey, Macao, Palestine, Puerto Rico, Serbia
#
# col_18 %<>% dplyr::mutate(cow_code = ifelse(country == "Palestine", 6666,
# ifelse(country == "Serbia", 345,
# ifelse(country == "Hong Kong", 997, cow_code))))
# col %<>%
# select(cow_code, year, everything())
Adjust prices to 2014 prices
country <- "United States"
countries_dataframe <- show_countries()
Generating URL to request all 299 results
inflation_dataframe <- retrieve_inflation_data(country, countries_dataframe)
Retrieving inflation data for US Generating URL to request all 61 results
# Provide a World Bank API URL and `url_all_results` will convert it into one with all results for that indicator
original_url <- "http://api.worldbank.org/v2/country"
# "http://api.worldbank.org/v2/country?format=json&per_page=304"
url_all_results(original_url)
Generating URL to request all 299 results [1] “http://api.worldbank.org/v2/country?format=json&per_page=299”
the_df$budget_const <- adjust_for_inflation(the_df$budget,
the_df$year,
country,
to_date = 2014,
inflation_dataframe = inflation_dataframe,
countries_dataframe = countries_dataframe)
the_df$budget_pc_const <- adjust_for_inflation(the_df$budget_pc,
the_df$year,
country,
to_date = 2014,
inflation_dataframe = inflation_dataframe,
countries_dataframe = countries_dataframe)
Economic factors
PD Budget per capita and US exports per capita to the country
Across the years
the_df %>%
# filter(pop > 1000000) %>%
ggplot(aes(y = log(budget_const), x = log(us_exports_pc))) +
geom_smooth(method = "lm", color = "#9d0208", se = FALSE) +
geom_point(aes(color = as.factor(region_6), shape = as.factor(region_6))) + facet_wrap(~year) +
scale_color_manual(values = c("#219ebc", "#264653", "#43aa8b", "#6d597a", "#e63946", "#f4a261"),
name = NULL) +
scale_shape_manual(values = c(15,16,17,18,19,10),
name = NULL) +
ggtitle("Exports from US per capita vs PD budget per capita") +
xlab("Logged US exports per capita") +
ylab("Logged PD budget per capita") +
theme(legend.position = "left") + ggthemes::theme_pander()
## `geom_smooth()` using formula 'y ~ x'

Only for 2019
the_df %>%
# filter(pop > 1000000) %>%
filter(year == 2018) %>%
ggplot(aes(y = log(budget_const), x = log(us_exports_pc), group = as.factor(region_6))) +
geom_smooth(method = "lm", color = "#9d0208", se = FALSE) +
geom_point(aes(color = as.factor(region_6), shape = as.factor(region_6))) +
facet_wrap(~region_6) +
scale_color_manual(values = c("#219ebc", "#264653", "#43aa8b", "#6d597a", "#e63946", "#f4a261"),
name = NULL) +
scale_shape_manual(values = c(15,16,17,18,19,10),
name = NULL) +
ggtitle("Exports per capita vs PD budget per capita in 2019") +
xlab("Logged US exports per capita") +
ylab("Logged PD budget per capita") +
theme(legend.position = "left") + ggthemes::theme_pander()
## `geom_smooth()` using formula 'y ~ x'

Trade openness
Total export and total imports divided by total GDP
Across the years
the_df %>%
# filter(pop > 1000000) %>%
ggplot(aes(y = log(budget_const), x =log(trade_openess))) +
geom_smooth(method = "lm", color = "#9d0208", se = FALSE) +
geom_point(aes(color = as.factor(region_6), shape = as.factor(region_6))) + facet_wrap(~year) +
scale_color_manual(values = c("#219ebc", "#264653", "#43aa8b", "#6d597a", "#e63946", "#f4a261"),
name = NULL) +
scale_shape_manual(values = c(15,16,17,18,19,10),
name = NULL) +
ggtitle("Trade openess vs PD budget per capita") +
xlab("Trade openess") +
ylab("Logged PD budget per capita") +
theme(legend.position = "left") +
ggthemes::theme_pander()
## `geom_smooth()` using formula 'y ~ x'

Only for 2019
the_df %>%
filter(year == 2019) %>%
ggplot(aes(y = log(budget_const), x = log(trade_openess))) +
geom_smooth(method = "lm", color = "#9d0208", se = FALSE) +
# geom_text(aes(label = country, color = as.factor(region_6)), size = 3) +
geom_point(aes(color = as.factor(region_6), shape = as.factor(region_6))) +
scale_color_manual(values = c("#219ebc", "#264653", "#43aa8b", "#6d597a", "#e63946", "#f4a261"),
name = NULL) +
scale_shape_manual(values = c(15,16,17,18,19,10),
name = NULL) +
ggtitle("Trade openess vs PD budget per capita in 2019") +
facet_wrap(~region_6) +
xlab("Trade openness") +
ylab("Logged PD budget per capita") +
theme(legend.position = "left") + ggthemes::theme_pander()
## `geom_smooth()` using formula 'y ~ x'

Infant mortality
Infant mortality is a proxy for poverty levels: number of infant deaths per thousand live births
Across the years
the_df %>%
# filter(pop > 1000000) %>%
filter(year < 2018) %>%
ggplot(aes(y = log(budget_const), x = log(infant_mort), group = as.factor(region_6))) +
geom_point(aes(color = as.factor(region_6), shape = as.factor(region_6))) + facet_wrap(~year) +
scale_color_manual(values = c("#219ebc", "#264653", "#43aa8b", "#6d597a", "#e63946", "#f4a261"),
name = NULL) +
scale_shape_manual(values = c(15,16,17,18,19,10),
name = NULL) +
ggtitle("Infant mortality age vs PD budget per capita") +
xlab("Deaths per thousand under 5") +
ylab("Logged PD budget per capita") +
theme(legend.position = "left") + ggthemes::theme_pander()

Only for 2019
the_df %>%
filter(year == 2015) %>%
ggplot(aes(y = log(budget_const), x = infant_mort, group = as.factor(region_6))) +
geom_smooth(method = "lm", color = "#9d0208", se = FALSE) +
geom_point(aes(color = as.factor(region_6), shape = as.factor(region_6))) +
facet_wrap(~region_6) +
scale_color_manual(values = c("#219ebc", "#264653", "#43aa8b", "#6d597a", "#e63946", "#f4a261"),
name = NULL) +
scale_shape_manual(values = c(15,16,17,18,19,10),
name = NULL) +
ggtitle("Infant mortality vs PD budget per capita in 2019") +
xlab("Infant mortality") +
ylab("Logged PD budget per capita") +
theme(legend.position = "left") + ggthemes::theme_pander()
## `geom_smooth()` using formula 'y ~ x'

GDP per capita
Across the years
the_df %>%
ggplot(aes(y = log(budget_const), x = log(gdp_pc_const), group = as.factor(region_6))) +
geom_point(aes(color = as.factor(region_6), shape = as.factor(region_6))) + facet_wrap(~year) +
scale_color_manual(values = c("#219ebc", "#264653", "#43aa8b", "#6d597a", "#e63946", "#f4a261"),
name = NULL) +
scale_shape_manual(values = c(15,16,17,18,19,10),
name = NULL) +
ggtitle("Logged GDP per capita and logged PD budget per capita") +
xlab("Logged GDP per capita") +
ylab("Logged PD budget per capita") +
theme(legend.position = "left") + ggthemes::theme_pander()

Only for 2019
the_df %>%
filter(year == 2019) %>%
ggplot(aes(y = log(budget_const), x = log(gdp_pc_const), group = as.factor(region_6))) +
geom_smooth(method = "lm", color = "#9d0208", se = FALSE) +
geom_point(aes(color = as.factor(region_6), shape = as.factor(region_6))) +
facet_wrap(~region_6) +
scale_color_manual(values = c("#219ebc", "#264653", "#43aa8b", "#6d597a", "#e63946", "#f4a261"),
name = NULL) +
scale_shape_manual(values = c(15,16,17,18,19,10),
name = NULL) +
ggtitle("GDP per capita vs PD budget per capita in 2019") +
ylab("Logged GDP per capita") +
xlab("Logged PD budget per capita") +
theme(legend.position = "left") + ggthemes::theme_pander()
## `geom_smooth()` using formula 'y ~ x'

Polity Index
Across the years
Evidence of a U shaped relationship? More pronounced as years go on.
the_df %>%
filter(pop > 1000000) %>%
ggplot(aes(y = log(budget_pc), x = electoral_demo)) +
geom_smooth(method = "lm", color = "#9d0208") +
geom_point(aes(color = as.factor(region_6), shape = as.factor(region_6))) +
facet_wrap(~year) +
scale_color_manual(values = c("#219ebc", "#264653", "#43aa8b", "#6d597a", "#e63946", "#f4a261"),
name = NULL) +
scale_shape_manual(values = c(15,16,17,18,19,10),
name = NULL) +
ggtitle("Polity Score vs PD budget per capita") +
xlab("Polity Score") +
ylab("Logged PD budget per capita") +
theme(legend.position = "left") + ggthemes::theme_pander()
## `geom_smooth()` using formula 'y ~ x'

Only for 2019
the_df %>%
filter(year == 2019) %>%
ggplot(aes(y = log(budget_pc), x = electoral_demo, group = as.factor(region_6))) +
geom_smooth(method = "loess", color = "#9d0208", se = FALSE) +
geom_point(aes(color = as.factor(region_6), shape = as.factor(region_6))) +
facet_wrap(~region_6) +
scale_color_manual(values = c("#219ebc", "#264653", "#43aa8b", "#6d597a", "#e63946", "#f4a261"),
name = NULL) +
scale_shape_manual(values = c(15,16,17,18,19,10),
name = NULL) +
ggtitle("Polity Score vs PD budget per capita in 2019") +
xlab("Polity Score (-10 to 10)") +
ylab("Logged budget") +
theme(legend.position = "left") + ggthemes::theme_pander()
## `geom_smooth()` using formula 'y ~ x'

Percentage of population that follows Muslim faith
Across the years
the_df %>%
mutate(muslim_pc = percent_muslim_jitter / pop, na.rm = TRUE) %>%
ggplot(aes(y = log(budget_const), x = muslim_pc)) +
geom_smooth(method = "loess", color = "#9d0208") +
geom_point(aes(color = as.factor(region_6), shape = as.factor(region_6))) +
facet_wrap(~year) +
scale_color_manual(values = c("#219ebc", "#264653", "#43aa8b", "#6d597a", "#e63946", "#f4a261"),
name = NULL) +
scale_shape_manual(values = c(15,16,17,18,19,10),
name = NULL) +
ggtitle("Muslim population % vs PD budget per capita") +
xlab("Percentage of population Muslim") +
ylab("Logged PD budget per capita") +
theme(legend.position = "left") + ggthemes::theme_pander()
## `geom_smooth()` using formula 'y ~ x'

Only for 2019
the_df %>%
mutate(muslim_pc = percent_muslim_jitter / pop, na.rm = TRUE) %>%
filter(year == 2019) %>%
ggplot(aes(y = log(budget_const), x = muslim_pc, group = as.factor(region_6))) +
# geom_smooth(method = "loess", color = "#9d0208") +
geom_point(aes(color = as.factor(region_6), shape = as.factor(region_6))) +
facet_wrap(~region_6) +
scale_color_manual(values = c("#219ebc", "#264653", "#43aa8b", "#6d597a", "#e63946", "#f4a261"),
name = NULL) +
scale_shape_manual(values = c(15,16,17,18,19,10),
name = NULL) +
ggtitle("Muslim population % vs PD budget per capita in 2019") +
xlab("Percentage of population Muslim") +
ylab("Logged PD budget per capita") +
theme(legend.position = "left") + ggthemes::theme_pander()

Similar UN voting
It reflects states’ UN voting positions in relation to the US-led liberal order (calculated on a single dimension).
Source: https://dataverse.harvard.edu/dataset.xhtml?persistentId=doi:10.7910/DVN/LEJUQZ
Bailey, M.A., Strezhnev, A., and Voeten, E (2017). Estimating dynamic state preferences from United Nations voting data. Journal of Conflict Resolution 61.2: 430-456.
Across the years
the_df %>%
filter(year == 2014) %>%
ggplot(aes(y = log(budget), x = ideal_point_distance)) +
geom_smooth(method = "lm", color = "#9d0208", alpha = 0.5) +
geom_point(aes(color = as.factor(region_6), shape = as.factor(region_6))) +
# facet_wrap(~year) +
scale_color_manual(values = c("#219ebc", "#264653", "#43aa8b", "#6d597a", "#e63946", "#f4a261"), name = NULL) +
scale_shape_manual(values = c(15,16,17,18,19,10), name = NULL) +
ggtitle("UN voting similarity vs PD budget per capita") +
xlab("Distance from US ideal score") +
ylab("Logged PD budget per capita") +
theme(legend.position = "left") +
ggthemes::theme_pander()
## `geom_smooth()` using formula 'y ~ x'

We can see two clusters appear!
Only for 2019
the_df %>%
filter(year == 2019) %>%
ggplot(aes(y = log(budget_const), x = ideal_point_distance, group = as.factor(region_6))) +
geom_smooth(method = "lm", color = "#9d0208", se = FALSE) +
geom_point(aes(color = as.factor(region_6), shape = as.factor(region_6))) +
facet_wrap(~region_6) +
scale_color_manual(values = c("#219ebc", "#264653", "#43aa8b", "#6d597a", "#e63946", "#f4a261"),
name = NULL) +
scale_shape_manual(values = c(15,16,17,18,19,10),
name = NULL) +
ggtitle("UN voting similarity vs PD budget per capita") +
xlab("Distance from US ideal score") +
ylab("Logged PD budget per capita") +
theme(legend.position = "left") +
ggthemes::theme_pander()
## `geom_smooth()` using formula 'y ~ x'

Important US votes
Source: Erik Voeten “Data and Analyses of Voting in the UN General Assembly” Routledge Handbook of International Organization, edited by Bob Reinalda (published May 27, 2013)
Important votes determined by the US State Department: Whether the vote was classified as important by the U.S. State Department report “Voting Practices in the United Nations”. These classifications began with session 39
# library(unvotes)
# library(lubridate)
#
# count(un_roll_call_issues, issue, sort = TRUE)
#
# joined <- un_votes %>%
# inner_join(un_roll_calls, by = "rcid") %>%
# inner_join(un_roll_call_issues, by = "rcid") %>%
# ungroup()
#
# important <- joined %>%
# filter(importantvote == 1) %>%
# select(rcid, country, vote, session, date)
#
# important %>%
# mutate(vote_fac = as.factor(vote)) %>%
# mutate(vote_num = as.numeric(vote_fac)) %>%
# distinct(session, country, rcid, vote_num, .keep_all = "TRUE") -> temp2
#
# temp2 %>%
# select(rcid, country, vote_num, session) %>%
# pivot_wider(names_from = country, values_from = "vote_num" ) -> imp_wide
#
# temp2 %>%
# group_by(country_name)
# mutate(country = if_else(Response == Correct_answer, 1, 0))
#
Level of domestic autonomy
Measures the extent to which the country’s govt have full sovereign control over the territory.
Higher scores indicate more control
Across all years
the_df %>%
ggplot(aes(y = log(budget_pc_const), x = intl_autonomy)) +
geom_smooth(method = "lm", color = "#9d0208") +
geom_point(aes(color = as.factor(region_6), shape = as.factor(region_6))) +
facet_wrap(~year) +
scale_color_manual(values = c("#219ebc", "#264653", "#43aa8b", "#6d597a", "#e63946", "#f4a261"), name = NULL) +
scale_shape_manual(values = c(15,16,17,18,19,10), name = NULL) +
ggtitle("Domestic autonomy vs PD budget per capita") +
xlab("Domestic autonomy") +
ylab("Logged PD budget per capita") +
theme(legend.position = "left") +
ggthemes::theme_pander()
## `geom_smooth()` using formula 'y ~ x'

Only for 2019
the_df %>%
filter(year == 2013) %>%
ggplot(aes(y = log(budget_pc_const), x = intl_autonomy, group = as.factor(region_6))) +
geom_smooth(method = "lm", color = "#9d0208", se = FALSE) +
geom_point(aes(color = as.factor(region_6), shape = as.factor(region_6))) +
facet_wrap(~region_6) +
scale_color_manual(values = c("#219ebc", "#264653", "#43aa8b", "#6d597a", "#e63946", "#f4a261"),
name = NULL) +
scale_shape_manual(values = c(15,16,17,18,19,10),
name = NULL) +
ggtitle("Domestic autonomy vs PD budget per capita") +
xlab("Domestic autonomy") +
ylab("Logged PD budget per capita") +
theme(legend.position = "left") + ggthemes::theme_pander()
## `geom_smooth()` using formula 'y ~ x'

US diplomatic visits
Number of visits by heads of state to the US
## `summarise()` has grouped output by 'cow_code'. You can override using the `.groups` argument.
|
From
|
year
|
n
|
|
Israel
|
2000
|
5
|
|
United Kingdom
|
1990
|
5
|
|
Germany, Federal Republic of
|
1990
|
4
|
|
Iraq
|
2004
|
4
|
|
Ireland
|
1996
|
4
|
|
Israel
|
1978
|
4
|
|
Israel
|
1993
|
4
|
|
Israel
|
1995
|
4
|
|
Israel
|
1996
|
4
|
|
Israel
|
2001
|
4
|
|
Israel
|
2002
|
4
|
|
Israel
|
2009
|
4
|
|
Italy
|
1990
|
4
|
|
Japan
|
1990
|
4
|
|
Jordan
|
2002
|
4
|
|
Peru
|
2006
|
4
|
|
Australia
|
2009
|
3
|
|
Bosnia-Herzegovina
|
1994
|
3
|
|
Canada
|
1983
|
3
|
|
Canada
|
1989
|
3
|
|
Canada
|
1990
|
3
|
|
Canada
|
1993
|
3
|
|
Canada
|
2008
|
3
|
|
Canada
|
2011
|
3
|
|
Canada
|
2012
|
3
|
|
Colombia
|
1990
|
3
|
|
Colombia
|
2002
|
3
|
|
Ecuador
|
1992
|
3
|
|
Egypt
|
1978
|
3
|
|
Germany
|
2007
|
3
|
|
Germany
|
2009
|
3
|
|
Germany, Federal Republic of
|
1963
|
3
|
|
Germany, Federal Republic of
|
1982
|
3
|
|
Germany, Federal Republic of
|
1983
|
3
|
|
Iraq
|
2007
|
3
|
|
Iraq
|
2008
|
3
|
|
Iraq
|
2009
|
3
|
|
Israel
|
1973
|
3
|
|
Israel
|
1977
|
3
|
|
Israel
|
1983
|
3
|
|
Israel
|
1987
|
3
|
|
Israel
|
1994
|
3
|
|
Israel
|
1997
|
3
|
|
Israel
|
1998
|
3
|
|
Israel
|
2010
|
3
|
|
Israel
|
2011
|
3
|
|
Israel
|
2014
|
3
|
|
Italy
|
1983
|
3
|
|
Italy
|
1999
|
3
|
|
Italy
|
2003
|
3
|
|
Italy
|
2004
|
3
|
|
Italy
|
2012
|
3
|
|
Italy
|
2016
|
3
|
|
Japan
|
1983
|
3
|
|
Japan
|
1993
|
3
|
|
Japan
|
2001
|
3
|
|
Japan
|
2009
|
3
|
|
Japan
|
2016
|
3
|
|
Jordan
|
1994
|
3
|
|
Jordan
|
1996
|
3
|
|
Jordan
|
1998
|
3
|
|
Jordan
|
1999
|
3
|
|
Jordan
|
2000
|
3
|
|
Jordan
|
2004
|
3
|
|
Jordan
|
2014
|
3
|
|
Jordan
|
2016
|
3
|
|
Mexico
|
1992
|
3
|
|
Mexico
|
2008
|
3
|
|
Pakistan
|
2003
|
3
|
|
Pakistan
|
2006
|
3
|
|
Singapore
|
2016
|
3
|
|
Slovak Republic
|
1999
|
3
|
|
Spain
|
2003
|
3
|
|
Spain
|
2004
|
3
|
|
United Kingdom
|
1960
|
3
|
|
United Kingdom
|
1970
|
3
|
|
United Kingdom
|
1978
|
3
|
|
United Kingdom
|
1983
|
3
|
|
United Kingdom
|
1992
|
3
|
|
United Kingdom
|
2001
|
3
|
|
United Kingdom
|
2003
|
3
|
|
United Kingdom
|
2004
|
3
|
|
United Kingdom
|
2006
|
3
|
|
United Kingdom
|
2007
|
3
|
|
United Kingdom
|
2008
|
3
|
|
United Kingdom
|
2009
|
3
|
|
United Kingdom
|
2012
|
3
|
|
Afghanistan
|
2003
|
2
|
|
Afghanistan
|
2004
|
2
|
|
Afghanistan
|
2007
|
2
|
|
Albania
|
1999
|
2
|
|
Algeria
|
2001
|
2
|
|
Antigua and Barbuda
|
1994
|
2
|
|
Argentina
|
1961
|
2
|
|
Argentina
|
1994
|
2
|
|
Argentina
|
1999
|
2
|
|
Argentina
|
2001
|
2
|
|
Australia
|
1952
|
2
|
|
Australia
|
1956
|
2
|
|
Australia
|
1962
|
2
|
|
Australia
|
1965
|
2
|
|
Australia
|
1966
|
2
|
|
Australia
|
1993
|
2
|
|
Australia
|
2003
|
2
|
|
Australia
|
2008
|
2
|
|
Australia
|
2011
|
2
|
|
Australia
|
2016
|
2
|
|
Barbados
|
1994
|
2
|
|
Belgium
|
1948
|
2
|
|
Belgium
|
1969
|
2
|
|
Bosnian Federation
|
1996
|
2
|
|
Brazil
|
1990
|
2
|
|
Brazil
|
1991
|
2
|
|
Brazil
|
2001
|
2
|
|
Brazil
|
2009
|
2
|
|
Bulgaria
|
1998
|
2
|
|
Bulgaria
|
2012
|
2
|
|
Cameroon
|
2003
|
2
|
|
Canada
|
1947
|
2
|
|
Canada
|
1960
|
2
|
|
Canada
|
1961
|
2
|
|
Canada
|
1963
|
2
|
|
Canada
|
1964
|
2
|
|
Canada
|
1965
|
2
|
|
Canada
|
1976
|
2
|
|
Canada
|
1977
|
2
|
|
Canada
|
1981
|
2
|
|
Canada
|
1992
|
2
|
|
Canada
|
1997
|
2
|
|
Canada
|
2000
|
2
|
|
Canada
|
2001
|
2
|
|
Canada
|
2002
|
2
|
|
Canada
|
2004
|
2
|
|
Canada
|
2009
|
2
|
|
Canada
|
2016
|
2
|
|
Chile
|
1994
|
2
|
|
China, People’s Republic of
|
2009
|
2
|
|
China, People’s Republic of
|
2010
|
2
|
|
China, People’s Republic of
|
2011
|
2
|
|
China, People’s Republic of
|
2016
|
2
|
|
Colombia
|
1998
|
2
|
|
Colombia
|
2001
|
2
|
|
Colombia
|
2003
|
2
|
|
Colombia
|
2006
|
2
|
|
Colombia
|
2008
|
2
|
|
Colombia
|
2009
|
2
|
|
Costa Rica
|
1982
|
2
|
|
Croatia
|
1995
|
2
|
|
Croatia
|
1996
|
2
|
|
Czech Republic
|
1995
|
2
|
|
Czech Republic
|
1999
|
2
|
|
Czechoslovakia
|
1990
|
2
|
|
Democratic Republic of the Congo (Zaire)
|
1989
|
2
|
|
Democratic Republic of the Congo (Zaire)
|
2003
|
2
|
|
Denmark
|
1967
|
2
|
|
Denmark
|
1970
|
2
|
|
Denmark
|
1978
|
2
|
|
Denmark
|
2012
|
2
|
|
Denmark
|
2016
|
2
|
|
Djibouti
|
2014
|
2
|
|
Dominica
|
1984
|
2
|
|
Dominica
|
1994
|
2
|
|
Egypt
|
1979
|
2
|
|
Egypt
|
1983
|
2
|
|
Egypt
|
1985
|
2
|
|
Egypt
|
1989
|
2
|
|
Egypt
|
1993
|
2
|
|
Egypt
|
1995
|
2
|
|
Egypt
|
2002
|
2
|
|
Egypt
|
2014
|
2
|
|
El Salvador
|
1984
|
2
|
|
El Salvador
|
1985
|
2
|
|
El Salvador
|
1990
|
2
|
|
El Salvador
|
1991
|
2
|
|
El Salvador
|
2004
|
2
|
|
El Salvador
|
2005
|
2
|
|
El Salvador
|
2006
|
2
|
|
El Salvador
|
2007
|
2
|
|
El Salvador
|
2008
|
2
|
|
Ethiopia
|
1963
|
2
|
|
Ethiopia
|
2014
|
2
|
|
Finland
|
1970
|
2
|
|
Finland
|
1999
|
2
|
|
Finland
|
2002
|
2
|
|
Finland
|
2016
|
2
|
|
France
|
1951
|
2
|
|
France
|
1976
|
2
|
|
France
|
1990
|
2
|
|
France
|
1993
|
2
|
|
France
|
1999
|
2
|
|
France
|
2000
|
2
|
|
France
|
2001
|
2
|
|
France
|
2007
|
2
|
|
France
|
2008
|
2
|
|
France
|
2010
|
2
|
|
France
|
2011
|
2
|
|
France
|
2012
|
2
|
|
Gabon
|
1977
|
2
|
|
Georgia
|
1999
|
2
|
|
Georgia
|
2012
|
2
|
|
Germany
|
1991
|
2
|
|
Germany
|
1992
|
2
|
|
Germany
|
1993
|
2
|
|
Germany
|
1997
|
2
|
|
Germany
|
1999
|
2
|
|
Germany
|
2001
|
2
|
|
Germany
|
2004
|
2
|
|
Germany
|
2006
|
2
|
|
Germany
|
2012
|
2
|
|
Germany
|
2015
|
2
|
|
Germany, Federal Republic of
|
1961
|
2
|
|
Germany, Federal Republic of
|
1965
|
2
|
|
Germany, Federal Republic of
|
1969
|
2
|
|
Germany, Federal Republic of
|
1971
|
2
|
|
Germany, Federal Republic of
|
1973
|
2
|
|
Germany, Federal Republic of
|
1975
|
2
|
|
Germany, Federal Republic of
|
1976
|
2
|
|
Germany, Federal Republic of
|
1980
|
2
|
|
Germany, Federal Republic of
|
1984
|
2
|
|
Germany, Federal Republic of
|
1988
|
2
|
|
Ghana
|
2005
|
2
|
|
Greece
|
1996
|
2
|
|
Guatemala
|
1989
|
2
|
|
Guatemala
|
2008
|
2
|
|
Haiti
|
1993
|
2
|
|
Haiti
|
1994
|
2
|
|
Honduras
|
2006
|
2
|
|
Hungary
|
1990
|
2
|
|
Hungary
|
1991
|
2
|
|
Hungary
|
1998
|
2
|
|
Hungary
|
1999
|
2
|
|
Iceland
|
1988
|
2
|
|
Iceland
|
1991
|
2
|
|
India
|
1985
|
2
|
|
India
|
2008
|
2
|
|
India
|
2009
|
2
|
|
India
|
2016
|
2
|
|
Indonesia
|
1961
|
2
|
|
Iran
|
1968
|
2
|
|
Iran
|
1969
|
2
|
|
Iraq
|
2005
|
2
|
|
Iraq
|
2006
|
2
|
|
Iraq
|
2015
|
2
|
|
Ireland
|
1963
|
2
|
|
Ireland
|
1993
|
2
|
|
Ireland
|
1997
|
2
|
|
Ireland
|
1998
|
2
|
|
Ireland
|
2000
|
2
|
|
Ireland
|
2001
|
2
|
|
Ireland
|
2004
|
2
|
|
Ireland
|
2008
|
2
|
|
Israel
|
1970
|
2
|
|
Israel
|
1975
|
2
|
|
Israel
|
1979
|
2
|
|
Israel
|
1980
|
2
|
|
Israel
|
1982
|
2
|
|
Israel
|
1986
|
2
|
|
Israel
|
1989
|
2
|
|
Israel
|
1992
|
2
|
|
Israel
|
1999
|
2
|
|
Israel
|
2005
|
2
|
|
Israel
|
2006
|
2
|
|
Israel
|
2007
|
2
|
|
Israel
|
2008
|
2
|
|
Israel
|
2012
|
2
|
|
Israel
|
2015
|
2
|
|
Italy
|
1967
|
2
|
|
Italy
|
1976
|
2
|
|
Italy
|
1982
|
2
|
|
Italy
|
1985
|
2
|
|
Italy
|
1987
|
2
|
|
Italy
|
1988
|
2
|
|
Italy
|
1996
|
2
|
|
Italy
|
1998
|
2
|
|
Italy
|
2008
|
2
|
|
Italy
|
2009
|
2
|
|
Italy
|
2010
|
2
|
|
Jamaica
|
1970
|
2
|
|
Jamaica
|
1983
|
2
|
|
Japan
|
1972
|
2
|
|
Japan
|
1975
|
2
|
|
Japan
|
1976
|
2
|
|
Japan
|
1985
|
2
|
|
Japan
|
1989
|
2
|
|
Japan
|
1991
|
2
|
|
Japan
|
1992
|
2
|
|
Japan
|
1994
|
2
|
|
Japan
|
1996
|
2
|
|
Japan
|
1997
|
2
|
|
Japan
|
2004
|
2
|
|
Japan
|
2007
|
2
|
|
Japan
|
2010
|
2
|
|
Japan
|
2011
|
2
|
|
Japan
|
2012
|
2
|
|
Jordan
|
1967
|
2
|
|
Jordan
|
1974
|
2
|
|
Jordan
|
1985
|
2
|
|
Jordan
|
1995
|
2
|
|
Jordan
|
1997
|
2
|
|
Jordan
|
2001
|
2
|
|
Jordan
|
2003
|
2
|
|
Jordan
|
2005
|
2
|
|
Jordan
|
2006
|
2
|
|
Jordan
|
2007
|
2
|
|
Jordan
|
2008
|
2
|
|
Jordan
|
2010
|
2
|
|
Kazakhstan
|
1999
|
2
|
|
Korea
|
1969
|
2
|
|
Korea
|
2009
|
2
|
|
Kuwait
|
1988
|
2
|
|
Lebanon
|
1983
|
2
|
|
Lebanon
|
1996
|
2
|
|
Lebanon
|
2002
|
2
|
|
Liberia
|
2007
|
2
|
|
Liberia
|
2015
|
2
|
|
Luxembourg
|
2005
|
2
|
|
Macedonia, Former Yugoslav Republic of
|
1999
|
2
|
|
Marshall Islands
|
1990
|
2
|
|
Mexico
|
1964
|
2
|
|
Mexico
|
1970
|
2
|
|
Mexico
|
1981
|
2
|
|
Mexico
|
1990
|
2
|
|
Mexico
|
1991
|
2
|
|
Mexico
|
1994
|
2
|
|
Mexico
|
2000
|
2
|
|
Mexico
|
2001
|
2
|
|
Mexico
|
2009
|
2
|
|
Mexico
|
2010
|
2
|
|
Mexico
|
2012
|
2
|
|
Mexico
|
2016
|
2
|
|
Micronesia
|
1990
|
2
|
|
Morocco
|
1970
|
2
|
|
Morocco
|
1982
|
2
|
|
Nepal
|
1960
|
2
|
|
Netherlands
|
1952
|
2
|
|
Netherlands
|
1995
|
2
|
|
Netherlands
|
1999
|
2
|
|
Netherlands
|
2008
|
2
|
|
Netherlands
|
2009
|
2
|
|
New Zealand
|
2014
|
2
|
|
Nigeria
|
1999
|
2
|
|
Nigeria
|
2001
|
2
|
|
Nigeria
|
2004
|
2
|
|
Norway
|
1979
|
2
|
|
Norway
|
1989
|
2
|
|
Norway
|
1995
|
2
|
|
Norway
|
1999
|
2
|
|
Norway
|
2016
|
2
|
|
Pakistan
|
1998
|
2
|
|
Pakistan
|
2002
|
2
|
|
Pakistan
|
2004
|
2
|
|
Pakistan
|
2008
|
2
|
|
Pakistan
|
2009
|
2
|
|
Panama
|
1977
|
2
|
|
Panama
|
2008
|
2
|
|
Papua New Guinea
|
1990
|
2
|
|
Paraguay
|
2008
|
2
|
|
Peru
|
2011
|
2
|
|
Poland
|
1990
|
2
|
|
Poland
|
1991
|
2
|
|
Poland
|
2002
|
2
|
|
Poland
|
2003
|
2
|
|
Poland
|
2004
|
2
|
|
Poland
|
2005
|
2
|
|
Portugal
|
1990
|
2
|
|
Portugal
|
1992
|
2
|
|
Qatar
|
2015
|
2
|
|
Romania
|
2004
|
2
|
|
Russia
|
1992
|
2
|
|
Russia
|
1997
|
2
|
|
Russia
|
2009
|
2
|
|
Russia
|
2010
|
2
|
|
Senegal
|
2004
|
2
|
|
South Africa
|
2001
|
2
|
|
South Korea
|
2008
|
2
|
|
South Korea
|
2011
|
2
|
|
Spain
|
1980
|
2
|
|
Spain
|
1993
|
2
|
|
Spain
|
1999
|
2
|
|
Spain
|
2001
|
2
|
|
Spain
|
2002
|
2
|
|
Spain
|
2009
|
2
|
|
Spain
|
2010
|
2
|
|
Sweden
|
2009
|
2
|
|
Tanzania
|
2008
|
2
|
|
Thailand
|
2016
|
2
|
|
Tunisia
|
2014
|
2
|
|
Turkey
|
1954
|
2
|
|
Turkey
|
1992
|
2
|
|
Turkey
|
1993
|
2
|
|
Turkey
|
1995
|
2
|
|
Turkey
|
1999
|
2
|
|
Turkey
|
2004
|
2
|
|
Turkey
|
2008
|
2
|
|
Turkey
|
2009
|
2
|
|
Turkey
|
2012
|
2
|
|
Uganda
|
2003
|
2
|
|
Ukraine
|
1994
|
2
|
|
Ukraine
|
1999
|
2
|
|
Ukraine
|
2014
|
2
|
|
United Kingdom
|
1957
|
2
|
|
United Kingdom
|
1959
|
2
|
|
United Kingdom
|
1961
|
2
|
|
United Kingdom
|
1964
|
2
|
|
United Kingdom
|
1975
|
2
|
|
United Kingdom
|
1976
|
2
|
|
United Kingdom
|
1985
|
2
|
|
United Kingdom
|
1991
|
2
|
|
United Kingdom
|
1998
|
2
|
|
United Kingdom
|
2002
|
2
|
|
United Kingdom
|
2005
|
2
|
|
Uruguay
|
1990
|
2
|
|
Uruguay
|
1994
|
2
|
|
Venezuela
|
1977
|
2
|
|
Venezuela
|
1989
|
2
|
|
Venezuela
|
1990
|
2
|
|
Venezuela
|
1991
|
2
|
|
Venezuela
|
1999
|
2
|
|
From
|
n
|
|
Israel
|
113
|
|
United Kingdom
|
99
|
|
Japan
|
80
|
|
Canada
|
76
|
|
Jordan
|
76
|
|
Italy
|
75
|
|
Australia
|
55
|
|
Mexico
|
55
|
|
Germany, Federal Republic of
|
53
|
|
France
|
52
|
|
Ireland
|
50
|
|
Pakistan
|
41
|
|
Turkey
|
41
|
US trips
Trips by US President / Secretaries of State abroad
travels %>%
group_by(cow_code, year) %>%
filter(Pres == 1) %>%
summarise(sum_pres_travels = n()) %>%
ungroup() -> pres_travel
## `summarise()` has grouped output by 'cow_code'. You can override using the `.groups` argument.
travels %>%
group_by(cow_code, year) %>%
summarise(sum_all_travels = n()) %>%
ungroup() -> all_travel
## `summarise()` has grouped output by 'cow_code'. You can override using the `.groups` argument.
travels %>%
group_by(cow_code, year) %>%
summarise(sum_index_travels = sum(dashindex)) %>%
ungroup() -> score_travel
## `summarise()` has grouped output by 'cow_code'. You can override using the `.groups` argument.
the_df <- merge(the_df, pres_travel, by = c("cow_code", "year"), all.x = TRUE)
the_df <- merge(the_df, head_visits, by = c("cow_code", "year"), all.x = TRUE)
the_df <- merge(the_df, all_travel, by = c("cow_code", "year"), all.x = TRUE)
the_df <- merge(the_df, score_travel, by = c("cow_code", "year"), all.x = TRUE)
### Across the years
library(tidyr)
the_df %>%
filter(year < 2017) %>%
mutate(all_travel = coalesce(sum_all_travels, 0)) %>%
ggplot(aes(y = log(budget_pc_const), x = all_travel)) +
geom_smooth(method = "lm", color = "#9d0208", alpha = 0.5) +
geom_point(aes(color = as.factor(region_6), shape = as.factor(region_6))) +
facet_wrap(~year)+
scale_color_manual(values = c("#219ebc", "#264653", "#43aa8b", "#6d597a", "#e63946", "#f4a261"), name = NULL) +
scale_shape_manual(values = c(15,16,17,18,19,10), name = NULL) +
ggtitle("UN voting similarity vs PD budget per capita") +
xlab("Distance from US ideal score") +
ylab("Logged PD budget per capita") +
theme(legend.position = "left") +
ggthemes::theme_pander()
## `geom_smooth()` using formula 'y ~ x'

the_df %>%
filter(year < 2017) %>%
# mutate(score_travel = coalesce(sum_index_travels, 0)) %>%
ggplot(aes(y = log(budget_pc_const), x = sum_index_travels)) +
geom_smooth(method = "lm", color = "#9d0208", alpha = 0.5) +
geom_text(aes(label = country, color = as.factor(region_6))) +
# geom_point(aes(color = as.factor(region_6), shape = as.factor(region_6))) +
facet_wrap(~year)+
scale_color_manual(values = c("#219ebc", "#264653", "#43aa8b", "#6d597a", "#e63946", "#f4a261"), name = NULL) +
scale_shape_manual(values = c(15,16,17,18,19,10), name = NULL) +
ggtitle("High level visits DASH score vs PD budget per capita") +
xlab("High level visits DASH score") +
ylab("Logged PD budget per capita") +
theme(legend.position = "left") +
ggthemes::theme_pander()
## `geom_smooth()` using formula 'y ~ x'

Only for 2016
the_df %>%
filter(year == 2016) %>%
mutate(all_travel = coalesce(sum_all_travels, 0)) %>%
ggplot(aes(y = log(budget_pc_const), x = all_travel)) +
geom_smooth(method = "lm", color = "#9d0208", se = FALSE) +
geom_point(aes(color = as.factor(region_6), shape = as.factor(region_6))) +
facet_wrap(~region_6) +
scale_color_manual(values = c("#219ebc", "#264653", "#43aa8b", "#6d597a", "#e63946", "#f4a261"),
name = NULL) +
scale_shape_manual(values = c(15,16,17,18,19,10),
name = NULL) +
ggtitle("high level visits vs PD budget per capita") +
xlab("Number of high level visits") +
ylab("Logged PD budget per capita") +
theme(legend.position = "left") +
ggthemes::theme_pander()
## `geom_smooth()` using formula 'y ~ x'

travels %>%
filter(Pres == 1) %>%
group_by(Country, year) %>%
count() %>%
arrange(desc(n)) %>%
kbl() %>%
kable_paper("striped",
full_width = F)
|
Country
|
year
|
n
|
|
Germany
|
2015
|
5
|
|
Germany
|
2016
|
3
|
|
Italy
|
1999
|
3
|
|
Japan
|
2016
|
3
|
|
Afghanistan
|
2010
|
2
|
|
Belgium
|
1989
|
2
|
|
Belgium
|
2014
|
2
|
|
Canada
|
1981
|
2
|
|
Canada
|
1991
|
2
|
|
Canada
|
1995
|
2
|
|
Denmark
|
2009
|
2
|
|
Egypt
|
1979
|
2
|
|
Egypt
|
2000
|
2
|
|
Egypt
|
2008
|
2
|
|
France
|
1959
|
2
|
|
France
|
1974
|
2
|
|
France
|
1982
|
2
|
|
France
|
1989
|
2
|
|
France
|
1991
|
2
|
|
France
|
2009
|
2
|
|
France
|
2011
|
2
|
|
Germany
|
1999
|
2
|
|
Germany
|
2009
|
2
|
|
Germany
|
2014
|
2
|
|
Germany, Federal Republic of
|
1978
|
2
|
|
Germany, Federal Republic of
|
1985
|
2
|
|
Israel
|
2008
|
2
|
|
Italy
|
1994
|
2
|
|
Japan
|
2000
|
2
|
|
Mexico
|
1966
|
2
|
|
Mexico
|
1981
|
2
|
|
Mexico
|
2002
|
2
|
|
Mexico
|
2009
|
2
|
|
Russia
|
2002
|
2
|
|
Russia
|
2006
|
2
|
|
Saudi Arabia
|
2008
|
2
|
|
Senegal
|
2013
|
2
|
|
South Africa
|
2013
|
2
|
|
Switzerland
|
2000
|
2
|
|
U.S.S.R.
|
1974
|
2
|
|
United Kingdom
|
1959
|
2
|
|
United Kingdom
|
1961
|
2
|
|
United Kingdom
|
1969
|
2
|
|
United Kingdom
|
1990
|
2
|
|
United Kingdom
|
1991
|
2
|
|
United Kingdom
|
1994
|
2
|
|
United Kingdom
|
1998
|
2
|
|
United Kingdom
|
2003
|
2
|
|
Afghanistan
|
1959
|
1
|
|
Afghanistan
|
2006
|
1
|
|
Afghanistan
|
2008
|
1
|
|
Afghanistan
|
2012
|
1
|
|
Afghanistan
|
2014
|
1
|
|
Albania
|
2007
|
1
|
|
Argentina
|
1960
|
1
|
|
Argentina
|
1990
|
1
|
|
Argentina
|
1997
|
1
|
|
Argentina
|
2005
|
1
|
|
Argentina
|
2016
|
1
|
|
Australia
|
1966
|
1
|
|
Australia
|
1967
|
1
|
|
Australia
|
1992
|
1
|
|
Australia
|
1996
|
1
|
|
Australia
|
2003
|
1
|
|
Australia
|
2007
|
1
|
|
Australia
|
2011
|
1
|
|
Australia
|
2014
|
1
|
|
Austria
|
1961
|
1
|
|
Austria
|
1972
|
1
|
|
Austria
|
1974
|
1
|
|
Austria
|
1975
|
1
|
|
Austria
|
1979
|
1
|
|
Austria
|
2006
|
1
|
|
Bahrain
|
2008
|
1
|
|
Bangladesh
|
2000
|
1
|
|
Barbados
|
1982
|
1
|
|
Barbados
|
1997
|
1
|
|
Belarus
|
1994
|
1
|
|
Belgium
|
1945
|
1
|
|
Belgium
|
1969
|
1
|
|
Belgium
|
1974
|
1
|
|
Belgium
|
1975
|
1
|
|
Belgium
|
1978
|
1
|
|
Belgium
|
1985
|
1
|
|
Belgium
|
1988
|
1
|
|
Belgium
|
1994
|
1
|
|
Belgium
|
1999
|
1
|
|
Belgium
|
2001
|
1
|
|
Belgium
|
2005
|
1
|
|
Benin
|
2008
|
1
|
|
Bosnia-Herzegovina
|
1996
|
1
|
|
Bosnia-Herzegovina
|
1997
|
1
|
|
Bosnia-Herzegovina
|
1999
|
1
|
|
Botswana
|
1998
|
1
|
|
Botswana
|
2003
|
1
|
|
Brazil
|
1947
|
1
|
|
Brazil
|
1960
|
1
|
|
Brazil
|
1978
|
1
|
|
Brazil
|
1982
|
1
|
|
Brazil
|
1990
|
1
|
|
Brazil
|
1992
|
1
|
|
Brazil
|
1997
|
1
|
|
Brazil
|
2005
|
1
|
|
Brazil
|
2007
|
1
|
|
Brazil
|
2011
|
1
|
|
Brunei Darussalam
|
2000
|
1
|
|
Bulgaria
|
1999
|
1
|
|
Bulgaria
|
2007
|
1
|
|
Burma
|
2012
|
1
|
|
Burma
|
2014
|
1
|
|
Cambodia
|
2012
|
1
|
|
Canada
|
1947
|
1
|
|
Canada
|
1953
|
1
|
|
Canada
|
1958
|
1
|
|
Canada
|
1959
|
1
|
|
Canada
|
1961
|
1
|
|
Canada
|
1964
|
1
|
|
Canada
|
1966
|
1
|
|
Canada
|
1967
|
1
|
|
Canada
|
1972
|
1
|
|
Canada
|
1985
|
1
|
|
Canada
|
1987
|
1
|
|
Canada
|
1988
|
1
|
|
Canada
|
1989
|
1
|
|
Canada
|
1990
|
1
|
|
Canada
|
1993
|
1
|
|
Canada
|
1997
|
1
|
|
Canada
|
1999
|
1
|
|
Canada
|
2001
|
1
|
|
Canada
|
2002
|
1
|
|
Canada
|
2004
|
1
|
|
Canada
|
2007
|
1
|
|
Canada
|
2009
|
1
|
|
Canada
|
2010
|
1
|
|
Canada
|
2016
|
1
|
|
Chile
|
1960
|
1
|
|
Chile
|
1990
|
1
|
|
Chile
|
1998
|
1
|
|
Chile
|
2004
|
1
|
|
Chile
|
2011
|
1
|
|
China
|
2001
|
1
|
|
China
|
2002
|
1
|
|
China
|
2005
|
1
|
|
China
|
2008
|
1
|
|
China, People’s Republic of
|
1972
|
1
|
|
China, People’s Republic of
|
1975
|
1
|
|
China, People�s Republic of
|
1984
|
1
|
|
China, People�s Republic of
|
1989
|
1
|
|
China, People�s Republic of
|
1998
|
1
|
|
China, People�s Republic of
|
2009
|
1
|
|
China, People�s Republic of
|
2014
|
1
|
|
China, People�s Republic of
|
2016
|
1
|
|
Colombia
|
1961
|
1
|
|
Colombia
|
1982
|
1
|
|
Colombia
|
1990
|
1
|
|
Colombia
|
2000
|
1
|
|
Colombia
|
2004
|
1
|
|
Colombia
|
2007
|
1
|
|
Colombia
|
2012
|
1
|
|
Costa Rica
|
1963
|
1
|
|
Costa Rica
|
1968
|
1
|
|
Costa Rica
|
1982
|
1
|
|
Costa Rica
|
1989
|
1
|
|
Costa Rica
|
1997
|
1
|
|
Costa Rica
|
2013
|
1
|
|
Croatia
|
1996
|
1
|
|
Croatia
|
2008
|
1
|
|
Cuba
|
2016
|
1
|
|
Czech Republic
|
1994
|
1
|
|
Czech Republic
|
2002
|
1
|
|
Czech Republic
|
2007
|
1
|
|
Czech Republic
|
2009
|
1
|
|
Czech Republic
|
2010
|
1
|
|
Czechoslovakia
|
1990
|
1
|
|
Denmark
|
1997
|
1
|
|
Denmark
|
2005
|
1
|
|
Egypt
|
1974
|
1
|
|
Egypt
|
1978
|
1
|
|
Egypt
|
1990
|
1
|
|
Egypt
|
1994
|
1
|
|
Egypt
|
1996
|
1
|
|
Egypt
|
2003
|
1
|
|
Egypt
|
2009
|
1
|
|
El Salvador
|
1968
|
1
|
|
El Salvador
|
1999
|
1
|
|
El Salvador
|
2002
|
1
|
|
El Salvador
|
2011
|
1
|
|
Estonia
|
2006
|
1
|
|
Estonia
|
2014
|
1
|
|
Ethiopia
|
2015
|
1
|
|
Finland
|
1975
|
1
|
|
Finland
|
1988
|
1
|
|
Finland
|
1990
|
1
|
|
Finland
|
1992
|
1
|
|
Finland
|
1997
|
1
|
|
France
|
1957
|
1
|
|
France
|
1960
|
1
|
|
France
|
1961
|
1
|
|
France
|
1969
|
1
|
|
France
|
1970
|
1
|
|
France
|
1975
|
1
|
|
France
|
1978
|
1
|
|
France
|
1979
|
1
|
|
France
|
1984
|
1
|
|
France
|
1985
|
1
|
|
France
|
1990
|
1
|
|
France
|
1993
|
1
|
|
France
|
1994
|
1
|
|
France
|
1995
|
1
|
|
France
|
1996
|
1
|
|
France
|
1997
|
1
|
|
France
|
1999
|
1
|
|
France
|
2002
|
1
|
|
France
|
2003
|
1
|
|
France
|
2004
|
1
|
|
France
|
2008
|
1
|
|
France
|
2014
|
1
|
|
France
|
2015
|
1
|
|
Georgia
|
2005
|
1
|
|
Germany
|
1945
|
1
|
|
Germany
|
1963
|
1
|
|
Germany
|
1967
|
1
|
|
Germany
|
1969
|
1
|
|
Germany
|
1978
|
1
|
|
Germany
|
1982
|
1
|
|
Germany
|
1987
|
1
|
|
Germany
|
1990
|
1
|
|
Germany
|
1992
|
1
|
|
Germany
|
1994
|
1
|
|
Germany
|
1995
|
1
|
|
Germany
|
1998
|
1
|
|
Germany
|
2000
|
1
|
|
Germany
|
2002
|
1
|
|
Germany
|
2005
|
1
|
|
Germany
|
2006
|
1
|
|
Germany
|
2007
|
1
|
|
Germany
|
2008
|
1
|
|
Germany
|
2013
|
1
|
|
Germany, Federal Republic of
|
1959
|
1
|
|
Germany, Federal Republic of
|
1963
|
1
|
|
Germany, Federal Republic of
|
1975
|
1
|
|
Germany, Federal Republic of
|
1982
|
1
|
|
Germany, Federal Republic of
|
1987
|
1
|
|
Germany, Federal Republic of
|
1989
|
1
|
|
Ghana
|
1998
|
1
|
|
Ghana
|
2008
|
1
|
|
Ghana
|
2009
|
1
|
|
Greece
|
1959
|
1
|
|
Greece
|
1991
|
1
|
|
Greece
|
1999
|
1
|
|
Greece
|
2016
|
1
|
|
Grenada
|
1986
|
1
|
|
Guatemala
|
1968
|
1
|
|
Guatemala
|
1999
|
1
|
|
Guatemala
|
2007
|
1
|
|
Haiti
|
1995
|
1
|
|
Honduras
|
1968
|
1
|
|
Honduras
|
1982
|
1
|
|
Honduras
|
1999
|
1
|
|
Hungary
|
1989
|
1
|
|
Hungary
|
1994
|
1
|
|
Hungary
|
1996
|
1
|
|
Hungary
|
2006
|
1
|
|
Iceland
|
1973
|
1
|
|
Iceland
|
1986
|
1
|
|
India
|
1959
|
1
|
|
India
|
1969
|
1
|
|
India
|
1978
|
1
|
|
India
|
2000
|
1
|
|
India
|
2006
|
1
|
|
India
|
2010
|
1
|
|
India
|
2015
|
1
|
|
Indonesia
|
1969
|
1
|
|
Indonesia
|
1975
|
1
|
|
Indonesia
|
1986
|
1
|
|
Indonesia
|
1994
|
1
|
|
Indonesia
|
2003
|
1
|
|
Indonesia
|
2006
|
1
|
|
Indonesia
|
2010
|
1
|
|
Indonesia
|
2011
|
1
|
|
Iran
|
1959
|
1
|
|
Iran
|
1972
|
1
|
|
Iran
|
1978
|
1
|
|
Iraq
|
2003
|
1
|
|
Iraq
|
2006
|
1
|
|
Iraq
|
2007
|
1
|
|
Iraq
|
2008
|
1
|
|
Iraq
|
2009
|
1
|
|
Ireland
|
1963
|
1
|
|
Ireland
|
1970
|
1
|
|
Ireland
|
1984
|
1
|
|
Ireland
|
1995
|
1
|
|
Ireland
|
1998
|
1
|
|
Ireland
|
2000
|
1
|
|
Ireland
|
2004
|
1
|
|
Ireland
|
2006
|
1
|
|
Ireland
|
2011
|
1
|
|
Israel
|
1974
|
1
|
|
Israel
|
1979
|
1
|
|
Israel
|
1994
|
1
|
|
Israel
|
1995
|
1
|
|
Israel
|
1996
|
1
|
|
Israel
|
1998
|
1
|
|
Israel
|
2013
|
1
|
|
Israel
|
2016
|
1
|
|
Italy
|
1959
|
1
|
|
Italy
|
1963
|
1
|
|
Italy
|
1967
|
1
|
|
Italy
|
1969
|
1
|
|
Italy
|
1970
|
1
|
|
Italy
|
1975
|
1
|
|
Italy
|
1980
|
1
|
|
Italy
|
1982
|
1
|
|
Italy
|
1987
|
1
|
|
Italy
|
1989
|
1
|
|
Italy
|
1991
|
1
|
|
Italy
|
1996
|
1
|
|
Italy
|
1997
|
1
|
|
Italy
|
2000
|
1
|
|
Italy
|
2001
|
1
|
|
Italy
|
2002
|
1
|
|
Italy
|
2004
|
1
|
|
Italy
|
2005
|
1
|
|
Italy
|
2007
|
1
|
|
Italy
|
2008
|
1
|
|
Italy
|
2009
|
1
|
|
Italy
|
2014
|
1
|
|
Jamaica
|
1982
|
1
|
|
Jamaica
|
2015
|
1
|
|
Japan
|
1974
|
1
|
|
Japan
|
1979
|
1
|
|
Japan
|
1980
|
1
|
|
Japan
|
1983
|
1
|
|
Japan
|
1986
|
1
|
|
Japan
|
1989
|
1
|
|
Japan
|
1992
|
1
|
|
Japan
|
1993
|
1
|
|
Japan
|
1996
|
1
|
|
Japan
|
1998
|
1
|
|
Japan
|
2002
|
1
|
|
Japan
|
2003
|
1
|
|
Japan
|
2005
|
1
|
|
Japan
|
2008
|
1
|
|
Japan
|
2009
|
1
|
|
Japan
|
2010
|
1
|
|
Japan
|
2014
|
1
|
|
Jordan
|
1974
|
1
|
|
Jordan
|
1994
|
1
|
|
Jordan
|
1999
|
1
|
|
Jordan
|
2003
|
1
|
|
Jordan
|
2006
|
1
|
|
Jordan
|
2013
|
1
|
|
Kenya
|
2015
|
1
|
|
Korea, Republic of
|
1952
|
1
|
|
Korea, Republic of
|
1960
|
1
|
|
Korea, Republic of
|
1966
|
1
|
|
Korea, Republic of
|
1974
|
1
|
|
Korea, Republic of
|
1979
|
1
|
|
Korea, Republic of
|
1983
|
1
|
|
Korea, Republic of
|
1989
|
1
|
|
Korea, Republic of
|
1992
|
1
|
|
Korea, Republic of
|
1993
|
1
|
|
Korea, Republic of
|
1996
|
1
|
|
Korea, Republic of
|
1998
|
1
|
|
Korea, Republic of
|
2002
|
1
|
|
Korea, Republic of
|
2005
|
1
|
|
Korea, Republic of
|
2008
|
1
|
|
Korea, Republic of
|
2009
|
1
|
|
Korea, Republic of
|
2010
|
1
|
|
Korea, Republic of
|
2012
|
1
|
|
Korea, Republic of
|
2014
|
1
|
|
Kuwait
|
1994
|
1
|
|
Kuwait
|
2008
|
1
|
|
Laos
|
2016
|
1
|
|
Latvia
|
1994
|
1
|
|
Latvia
|
2005
|
1
|
|
Latvia
|
2006
|
1
|
|
Liberia
|
1978
|
1
|
|
Liberia
|
2008
|
1
|
|
Lithuania
|
2002
|
1
|
|
Macedonia, Former Yugoslav Republic of
|
1999
|
1
|
|
Malaysia
|
1966
|
1
|
|
Malaysia
|
2014
|
1
|
|
Malaysia
|
2015
|
1
|
|
Malta
|
1989
|
1
|
|
Mexico
|
1947
|
1
|
|
Mexico
|
1953
|
1
|
|
Mexico
|
1959
|
1
|
|
Mexico
|
1960
|
1
|
|
Mexico
|
1962
|
1
|
|
Mexico
|
1967
|
1
|
|
Mexico
|
1969
|
1
|
|
Mexico
|
1970
|
1
|
|
Mexico
|
1974
|
1
|
|
Mexico
|
1979
|
1
|
|
Mexico
|
1982
|
1
|
|
Mexico
|
1983
|
1
|
|
Mexico
|
1986
|
1
|
|
Mexico
|
1988
|
1
|
|
Mexico
|
1990
|
1
|
|
Mexico
|
1997
|
1
|
|
Mexico
|
1999
|
1
|
|
Mexico
|
2001
|
1
|
|
Mexico
|
2004
|
1
|
|
Mexico
|
2006
|
1
|
|
Mexico
|
2007
|
1
|
|
Mexico
|
2012
|
1
|
|
Mexico
|
2013
|
1
|
|
Mexico
|
2014
|
1
|
|
Mongolia
|
2005
|
1
|
|
Morocco
|
1959
|
1
|
|
Morocco
|
1999
|
1
|
|
Netherlands
|
1989
|
1
|
|
Netherlands
|
1991
|
1
|
|
Netherlands
|
1997
|
1
|
|
Netherlands
|
2005
|
1
|
|
Netherlands
|
2014
|
1
|
|
New Zealand
|
1966
|
1
|
|
New Zealand
|
1999
|
1
|
|
Nicaragua
|
1968
|
1
|
|
Nicaragua
|
1999
|
1
|
|
Nigeria
|
1978
|
1
|
|
Nigeria
|
2000
|
1
|
|
Nigeria
|
2003
|
1
|
|
Norway
|
1999
|
1
|
|
Norway
|
2009
|
1
|
|
Oman
|
2000
|
1
|
|
Pakistan
|
1959
|
1
|
|
Pakistan
|
1967
|
1
|
|
Pakistan
|
1969
|
1
|
|
Pakistan
|
2000
|
1
|
|
Pakistan
|
2006
|
1
|
|
Palestinian Authority
|
1998
|
1
|
|
Palestinian Authority
|
2008
|
1
|
|
Palestinian Authority
|
2013
|
1
|
|
Panama
|
1956
|
1
|
|
Panama
|
1978
|
1
|
|
Panama
|
1992
|
1
|
|
Panama
|
2005
|
1
|
|
Panama
|
2015
|
1
|
|
Peru
|
2002
|
1
|
|
Peru
|
2008
|
1
|
|
Peru
|
2016
|
1
|
|
Philippines
|
1960
|
1
|
|
Philippines
|
1966
|
1
|
|
Philippines
|
1969
|
1
|
|
Philippines
|
1975
|
1
|
|
Philippines
|
1994
|
1
|
|
Philippines
|
1996
|
1
|
|
Philippines
|
2003
|
1
|
|
Philippines
|
2014
|
1
|
|
Philippines
|
2015
|
1
|
|
Poland
|
1972
|
1
|
|
Poland
|
1975
|
1
|
|
Poland
|
1977
|
1
|
|
Poland
|
1989
|
1
|
|
Poland
|
1992
|
1
|
|
Poland
|
1994
|
1
|
|
Poland
|
1997
|
1
|
|
Poland
|
2001
|
1
|
|
Poland
|
2003
|
1
|
|
Poland
|
2007
|
1
|
|
Poland
|
2011
|
1
|
|
Poland
|
2014
|
1
|
|
Poland
|
2016
|
1
|
|
Portugal
|
1960
|
1
|
|
Portugal
|
1971
|
1
|
|
Portugal
|
1974
|
1
|
|
Portugal
|
1980
|
1
|
|
Portugal
|
1985
|
1
|
|
Portugal
|
2000
|
1
|
|
Portugal
|
2003
|
1
|
|
Portugal
|
2010
|
1
|
|
Qatar
|
2003
|
1
|
|
Republic of China
|
1960
|
1
|
|
Romania
|
1969
|
1
|
|
Romania
|
1975
|
1
|
|
Romania
|
1997
|
1
|
|
Romania
|
2002
|
1
|
|
Romania
|
2008
|
1
|
|
Russia
|
1993
|
1
|
|
Russia
|
1994
|
1
|
|
Russia
|
1995
|
1
|
|
Russia
|
1996
|
1
|
|
Russia
|
1998
|
1
|
|
Russia
|
2000
|
1
|
|
Russia
|
2003
|
1
|
|
Russia
|
2005
|
1
|
|
Russia
|
2008
|
1
|
|
Russia
|
2009
|
1
|
|
Russia
|
2013
|
1
|
|
Rwanda
|
1998
|
1
|
|
Rwanda
|
2008
|
1
|
|
Saudi Arabia
|
1974
|
1
|
|
Saudi Arabia
|
1978
|
1
|
|
Saudi Arabia
|
1990
|
1
|
|
Saudi Arabia
|
1992
|
1
|
|
Saudi Arabia
|
1994
|
1
|
|
Saudi Arabia
|
2009
|
1
|
|
Saudi Arabia
|
2014
|
1
|
|
Saudi Arabia
|
2015
|
1
|
|
Saudi Arabia
|
2016
|
1
|
|
Senegal
|
1998
|
1
|
|
Senegal
|
2003
|
1
|
|
Serbia-Montenegro (Kosovo)
|
1999
|
1
|
|
Singapore
|
1992
|
1
|
|
Singapore
|
2003
|
1
|
|
Singapore
|
2006
|
1
|
|
Singapore
|
2009
|
1
|
|
Slovakia
|
2005
|
1
|
|
Slovenia
|
1999
|
1
|
|
Slovenia
|
2001
|
1
|
|
Slovenia
|
2008
|
1
|
|
Somalia
|
1993
|
1
|
|
South Africa
|
1998
|
1
|
|
South Africa
|
2003
|
1
|
|
Spain
|
1959
|
1
|
|
Spain
|
1970
|
1
|
|
Spain
|
1975
|
1
|
|
Spain
|
1980
|
1
|
|
Spain
|
1985
|
1
|
|
Spain
|
1991
|
1
|
|
Spain
|
1995
|
1
|
|
Spain
|
1997
|
1
|
|
Spain
|
2001
|
1
|
|
Spain
|
2016
|
1
|
|
Suriname
|
1967
|
1
|
|
Sweden
|
2001
|
1
|
|
Sweden
|
2013
|
1
|
|
Switzerland
|
1955
|
1
|
|
Switzerland
|
1977
|
1
|
|
Switzerland
|
1985
|
1
|
|
Switzerland
|
1990
|
1
|
|
Switzerland
|
1994
|
1
|
|
Switzerland
|
1998
|
1
|
|
Switzerland
|
1999
|
1
|
|
Syria
|
1974
|
1
|
|
Syria
|
1994
|
1
|
|
Tanzania
|
2000
|
1
|
|
Tanzania
|
2008
|
1
|
|
Tanzania
|
2013
|
1
|
|
Thailand
|
1966
|
1
|
|
Thailand
|
1967
|
1
|
|
Thailand
|
1969
|
1
|
|
Thailand
|
1996
|
1
|
|
Thailand
|
2003
|
1
|
|
Thailand
|
2008
|
1
|
|
Thailand
|
2012
|
1
|
|
Trinidad and Tobago
|
2009
|
1
|
|
Tunisia
|
1959
|
1
|
|
Turkey
|
1959
|
1
|
|
Turkey
|
1991
|
1
|
|
Turkey
|
1999
|
1
|
|
Turkey
|
2004
|
1
|
|
Turkey
|
2009
|
1
|
|
Turkey
|
2015
|
1
|
|
U.S.S.R.
|
1972
|
1
|
|
U.S.S.R.
|
1988
|
1
|
|
U.S.S.R.
|
1991
|
1
|
|
Uganda
|
1998
|
1
|
|
Uganda
|
2003
|
1
|
|
Ukraine
|
1994
|
1
|
|
Ukraine
|
1995
|
1
|
|
Ukraine
|
2000
|
1
|
|
Ukraine
|
2008
|
1
|
|
United Arab Emirates
|
2008
|
1
|
|
United Kingdom
|
1945
|
1
|
|
United Kingdom
|
1946
|
1
|
|
United Kingdom
|
1953
|
1
|
|
United Kingdom
|
1957
|
1
|
|
United Kingdom
|
1962
|
1
|
|
United Kingdom
|
1963
|
1
|
|
United Kingdom
|
1970
|
1
|
|
United Kingdom
|
1971
|
1
|
|
United Kingdom
|
1977
|
1
|
|
United Kingdom
|
1982
|
1
|
|
United Kingdom
|
1984
|
1
|
|
United Kingdom
|
1988
|
1
|
|
United Kingdom
|
1989
|
1
|
|
United Kingdom
|
1995
|
1
|
|
United Kingdom
|
1997
|
1
|
|
United Kingdom
|
2000
|
1
|
|
United Kingdom
|
2001
|
1
|
|
United Kingdom
|
2005
|
1
|
|
United Kingdom
|
2008
|
1
|
|
United Kingdom
|
2009
|
1
|
|
United Kingdom
|
2011
|
1
|
|
United Kingdom
|
2016
|
1
|
|
United Kingdom (Northern Ireland)
|
2013
|
1
|
|
United Kingdom (Wales)
|
2014
|
1
|
|
Uruguay
|
1960
|
1
|
|
Uruguay
|
1967
|
1
|
|
Uruguay
|
1990
|
1
|
|
Uruguay
|
2007
|
1
|
|
Vatican City
|
1959
|
1
|
|
Vatican City
|
1963
|
1
|
|
Vatican City
|
1967
|
1
|
|
Vatican City
|
1969
|
1
|
|
Vatican City
|
1970
|
1
|
|
Vatican City
|
1975
|
1
|
|
Vatican City
|
1980
|
1
|
|
Vatican City
|
1982
|
1
|
|
Vatican City
|
1987
|
1
|
|
Vatican City
|
1989
|
1
|
|
Vatican City
|
1991
|
1
|
|
Vatican City
|
1994
|
1
|
|
Vatican City
|
2002
|
1
|
|
Vatican City
|
2004
|
1
|
|
Vatican City
|
2005
|
1
|
|
Vatican City
|
2007
|
1
|
|
Vatican City
|
2008
|
1
|
|
Vatican City
|
2009
|
1
|
|
Vatican City
|
2014
|
1
|
|
Venezuela
|
1961
|
1
|
|
Venezuela
|
1978
|
1
|
|
Venezuela
|
1990
|
1
|
|
Venezuela
|
1997
|
1
|
|
Vietnam
|
1966
|
1
|
|
Vietnam
|
1967
|
1
|
|
Vietnam
|
1969
|
1
|
|
Vietnam
|
2000
|
1
|
|
Vietnam
|
2006
|
1
|
|
Vietnam
|
2016
|
1
|
|
Yugoslavia
|
1970
|
1
|
|
Yugoslavia
|
1975
|
1
|
|
Yugoslavia
|
1980
|
1
|
|
Yugoslavia (Kosovo)
|
2001
|
1
|
Trips by US presidents and Secretaries of State
Total number of trips by US presidents and Secretaries of State between 1945 to 2017
travels %>%
group_by(Country) %>%
count() %>%
filter(n > 50) %>%
arrange(desc(n)) %>%
ggplot(aes(y = n,
x = reorder(Country, n), fill = Country)) +
coord_flip() +
geom_histogram(stat = "identity") + ggthemes::theme_pander() +
theme(legend.position = "none") +
ggtitle("Trips by US Presidents & State Secretaries 1945-2017") +
xlab("Country") +
ylab("Number Trips by US President & Secretaries of State")

|
Country
|
n
|
|
United Kingdom
|
221
|
|
France
|
210
|
|
Israel
|
158
|
|
Belgium
|
135
|
|
Egypt
|
126
|
|
Germany
|
106
|
|
Italy
|
94
|
|
Canada
|
86
|
|
Switzerland
|
86
|
|
Mexico
|
85
|
|
Saudi Arabia
|
84
|
|
Japan
|
81
|
|
Jordan
|
81
|
|
Syria
|
75
|
|
Palestinian Authority
|
63
|
|
Korea, Republic of
|
60
|
|
Germany, Federal Republic of
|
58
|
|
Russia
|
54
|
US troop levels
troops <- read.csv("C:/Users/Paula/Desktop/troops and military spending.csv", header = TRUE)
troops %>%
filter(year > 1950) %>%
group_by(country) %>%
summarise(sum_troops = sum(troops)) %>%
filter(sum_troops > 50000) %>%
arrange(desc(sum_troops)) %>%
kbl() %>%
kable_paper("striped",
full_width = F)
|
country
|
sum_troops
|
|
Germany
|
9854626
|
|
Japan
|
3827418
|
|
Korea, Republic of
|
3528080
|
|
South Vietnam
|
2636065
|
|
United Kingdom
|
1331832
|
|
France
|
684654
|
|
Philippines
|
663660
|
|
Italy
|
645229
|
|
Panama
|
474807
|
|
Iraq
|
420463
|
|
Thailand
|
381483
|
|
Spain
|
374901
|
|
Turkey
|
293246
|
|
Canada
|
251386
|
|
Cuba / Guantanamo
|
172792
|
|
Iceland
|
160254
|
|
Kuwait
|
154330
|
|
Taiwan
|
152322
|
|
Greece
|
144344
|
|
Saudi Arabia
|
101200
|
|
Portugal
|
94018
|
|
Morocco
|
92359
|
|
Netherlands
|
84441
|
|
Belgium
|
83230
|
|
Libya
|
76543
|
|
Afghanistan
|
56699
|
|
Bosnia and Herzegovina
|
52056
|
troops %>%
group_by(ccode) %>%
summarise(sum_troops = sum(troops)) %>%
ungroup() -> troop_levels
the_df <- merge(the_df, troop_levels, by.x = "cow_code", by.y = "ccode", all.x = TRUE)
library(stargazer)
the_df$sum_pres_travels[is.na(the_df$sum_pres_travels)] <- 0
the_df$sum_head_vists[is.na(the_df$sum_head_vists)] <- 0
the_df$sum_troops[is.na(the_df$sum_troops)] <- 0
the_df %>%
filter(sum_troops > 1) %>%
filter(year == 2019) %>%
ggplot(aes(y = log(budget_pc), x = log(sum_troops + 1), group = as.factor(region_6))) +
# geom_point(aes(color = as.factor(region_6), shape = as.factor(region_6))) +
geom_smooth(method = "lm", se = FALSE, aes(color = as.factor(region_6))) +
geom_text(aes(label = country, color = region_6), size = 4) +
facet_wrap(~region_6) +
scale_color_manual(values = c("#219ebc", "#264653", "#43aa8b", "#6d597a", "#e63946", "#f4a261"),
name = NULL) +
scale_shape_manual(values = c(15,16,17,18,19,10),
name = NULL) +
ggtitle("UN voting similarity vs PD budget per capita") +
xlab("Distance from US ideal score") +
ylab("Logged PD budget per capita") +
theme(legend.position = "left") + ggthemes::theme_pander()
## `geom_smooth()` using formula 'y ~ x'

the_df %>%
# filter(sum_troops > 1) %>%
ggplot(aes(y = log(budget_pc), x = log(sum_troops + 1), group = as.factor(region_6)), alpha = 0.5) +
geom_point(aes(color = as.factor(region_6), shape = as.factor(region_6))) +
geom_smooth(method = "lm", se = FALSE, aes(color = as.factor(region_6))) +
# geom_text(aes(label = country, color = region_6), size = 4) +
facet_wrap(~year) +
scale_color_manual(values = c("#219ebc", "#264653", "#43aa8b", "#6d597a", "#e63946", "#f4a261"),
name = NULL) +
scale_shape_manual(values = c(15,16,17,18,19,10),
name = NULL) +
ggtitle("UN voting similarity vs PD budget per capita") +
xlab("Distance from US ideal score") +
ylab("Logged PD budget per capita") +
theme(legend.position = "left") + ggthemes::theme_pander()
## `geom_smooth()` using formula 'y ~ x'

US bases and “lily pads”
Source: https://github.com/meflynn/troopdata
Troop deployment data were initially compiled by Tim Kane using information obtained from the U.S. Department of Defense’s Defense Manpower Data Center (DMDC). The original data ended in 2005 and we have updated it to run through 2020
library(troopdata)
troops_us <- get_troopdata(startyear = 2013, endyear = 2020)
us_base_df <-read.csv("C:/Users/Paula/Desktop/PD_original_datasets/Bases.csv")
us_base_df %>%
filter(base == 1) %>%
group_by(Country.Name) %>%
count() %>%
arrange(desc(n)) %>%
filter(n > 2) %>%
kbl() %>%
kable_paper("striped",
full_width = F)
|
Country.Name
|
n
|
|
Japan
|
42
|
|
Germany
|
40
|
|
Korea, South
|
30
|
|
Puerto Rico
|
19
|
|
United Kingdom
|
16
|
|
Italy
|
14
|
|
Afghanistan
|
9
|
|
Kuwait
|
9
|
|
Marshall Islands
|
6
|
|
Oman
|
6
|
|
Turkey
|
6
|
|
Belgium
|
5
|
|
Qatar
|
5
|
|
Bahrain
|
4
|
|
Australia
|
3
|
|
Guam
|
3
|
|
Northern Mariana Islands
|
3
|
|
Romania
|
3
|
|
United Arab Emirates
|
3
|
us_base_df %>%
filter(lilypad == 1) %>%
group_by(Country.Name) %>%
count() %>%
arrange(desc(n)) %>%
filter(n > 2) %>%
kbl() %>%
kable_paper("striped",
full_width = F)
|
Country.Name
|
n
|
|
Saudi Arabia
|
9
|
|
Syria
|
8
|
|
Israel
|
6
|
|
Pakistan
|
6
|
|
Philippines
|
6
|
|
Colombia
|
4
|
|
Germany
|
4
|
|
Netherlands
|
4
|
|
Bulgaria
|
3
|
|
Cameroon
|
3
|
|
Peru
|
3
|
us_base_df %>%
group_by(Country.Name) %>%
count() %>%
arrange(desc(n)) %>%
filter(n > 5) %>%
kbl() %>%
kable_paper("striped",
full_width = F)
|
Country.Name
|
n
|
|
Germany
|
44
|
|
Japan
|
42
|
|
Korea, South
|
32
|
|
Puerto Rico
|
19
|
|
United Kingdom
|
16
|
|
Italy
|
15
|
|
Syria
|
10
|
|
Afghanistan
|
9
|
|
Honduras
|
9
|
|
Kuwait
|
9
|
|
Saudi Arabia
|
9
|
|
Belize
|
8
|
|
Guatemala
|
7
|
|
Belgium
|
6
|
|
Israel
|
6
|
|
Marshall Islands
|
6
|
|
Netherlands
|
6
|
|
Oman
|
6
|
|
Pakistan
|
6
|
|
Panama
|
6
|
|
Philippines
|
6
|
|
Turkey
|
6
|
# war_on_terror <- c("Afghanistan", "Yemen", "Syria", "Iraq", "Pakistan")
#
# my_pd9 %<>%
# dplyr::mutate(war_on_terror = ifelse(country_name %in% war_on_terror, 1, 0))
UN VOTING TWO CLUSTERS
# the_df %>%
# filter(year == 2014) %>%
# select(country, ideal_point_distance) %>%
# arrange(desc(ideal_point_distance))
#
#
#
# names(the_df)
#
# low_model <- plm(lead(log(budget_pc)) ~ log(gdp_pc_const) +
# log(pop) +
# log(us_exports_pc) +
# civ_lib_fh +
# relig_frac +
# rule_law_fh,
# data = low_un,
# model = "within", effect = "time",
# index = c("cow_code", "year"))
#
#
# high_model <- plm(lead(log(budget_pc)) ~ log(gdp_pc_const) +
# log(pop) +
# log(us_exports_pc) +
# civ_lib_fh +
# relig_frac +
# rule_law_fh,
# data = high_un,
# model = "within", effect = "time",
# index = c("cow_code", "year"))
#
# stargazer(low_model, high_model, column.labels = c("Low", "High"),
# type = "text")
Five year averages of dependent variables
# the_df$period <- cut(the_df$year, seq(2013, 2018, 1))
#
# pwt.ma <- ddply(pwt, .(country, period), numcolwise(mean))
#
# pwt.ma
#
#
excluding_countries <- c("Cuba", "Syria", "Yemen", "Libya")
the_df %<>%
mutate(muslim_percent = percent_muslim_jitter / pop, na.rm = TRUE) %>%
filter(!is.na(cow_code))
asia_df <- the_df %>%
filter(region_6 == "Asia")
africa_df <- the_df %>%
filter(region_6 == "Africa")
mena_df <- the_df %>%
filter(region_6 == "MENA")
west_df <- the_df %>%
filter(region_6 == "West")
latin_df <- the_df %>%
filter(region_6 == "Latin")
soviet_df <- the_df %>%
filter(region_6 == "Post Soviet")
dv <- "log(budget)"
ivs <- c("electoral_demo",
"log(gdp_pc_const)",
"log(pop)",
"muslim_percent")
form_1 <- as.formula(paste(dv, paste(ivs, collapse = " + "), sep = " ~ "))
LS0tDQp0aXRsZTogIlNjYXR0ZXJwbG90cyBhbmQgYmFyY2hhcnRzIg0KYXV0aG9yOiAiUGF1bGEiDQpkYXRlOiAiOC8xOS8yMDIxIg0Kb3V0cHV0Og0KICBodG1sX2RvY3VtZW50Og0KICAgIHRoZW1lOiBmbGF0bHkNCiAgICB0b2M6IHRydWUNCiAgICB0b2NfZmxvYXQ6IHRydWUNCiAgICBjb2RlX2Rvd25sb2FkOiB0cnVlDQogICAgdG9jX2RlcHRoOiA1DQogICAgDQotLS0NCg0KYGBge2NzcywgZWNobyA9IEZBTFNFfQ0KDQp0Ym9keSB0cjpudGgtY2hpbGQob2RkKSB7YmFja2dyb3VuZDogI2VlZTt9DQogICAgDQpoMSwgaDIsIGgzIHt0ZXh0LWFsaWduOiBjZW50ZXI7fQ0KDQpgYGANCg0KYGBge3Igc2V0dXAsIGluY2x1ZGUgPSBGQUxTRX0NCg0KbGlicmFyeShwbG0pDQpsaWJyYXJ5KHN0YXJnYXplcikNCmxpYnJhcnkobG10ZXN0KQ0KbGlicmFyeShzYW5kd2ljaCkNCmxpYnJhcnkodGlkeXZlcnNlKQ0KbGlicmFyeShtYWdyaXR0cikNCmxpYnJhcnkod2VzYW5kZXJzb24pDQpsaWJyYXJ5KGNvdW50cnljb2RlKQ0KbGlicmFyeShza2ltcikNCmxpYnJhcnkocHJpY2VSKQ0KbGlicmFyeShrbml0cikgDQpsaWJyYXJ5KGthYmxlRXh0cmEpDQpsaWJyYXJ5KHNjYWxlcykNCmxpYnJhcnkocmVzaGFwZTIpDQpsaWJyYXJ5KGphbml0b3IpDQpsaWJyYXJ5KHJuYXR1cmFsZWFydGgpDQpsaWJyYXJ5KHNmKQ0KbGlicmFyeShydmVzdCkNCmxpYnJhcnkoaGF2ZW4pDQpsaWJyYXJ5KFJDb2xvckJyZXdlcikNCmxpYnJhcnkoanNvbmxpdGUpDQpsaWJyYXJ5KHByaWNlUikNCg0KDQp0aGVfZGYgPC0gcmVhZC5jc3YoIkM6L1VzZXJzL1BhdWxhL0Rlc2t0b3AvUERfb3JpZ2luYWxfZGF0YXNldHMvcHJvdG8yLmNzdiIpDQoNCg0KdGhlX2RmJFguMSA8LSBOVUxMDQoNCnRoZV9kZiAlPD4lIA0KICBtdXRhdGUoY291bnRyeSA9IGlmZWxzZShjb3VudHJ5ID09ICJUcmluaWRhZCBBbmQgVG9iYWdvIiwgIlRyaW5pZGFkIGFuZCBUb2JhZ28iLA0KICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoY291bnRyeSA9PSAiQm9zbmlhIEFuZCBIZXJ6ZWdvdmluYSIsICJCb3NuaWEgYW5kIEhlcnplZ292aW5hIiwgY291bnRyeSkpKSAlPiUgDQogIG11dGF0ZShjb3dfY29kZSA9IGlmZWxzZShjb3VudHJ5ID09ICJUYWl3YW4iLCA3MTMsIGNvd19jb2RlKSkNCg0KZ3RkIDwtIHJlYWQuY3N2KCJDOi9Vc2Vycy9QYXVsYS9EZXNrdG9wL1BEX29yaWdpbmFsX2RhdGFzZXRzL2d0ZC5jc3YiKQ0KDQoNCnRoZV9kZiRyZWdpb25fNiA8LSByZWNvZGVfZmFjdG9yKHRoZV9kZiRyZWdpb25fNiwgIkFzaWEgYW5kIFBhY2lmaWMiID0gIkFzaWEiLA0KICAgICAgICAgICAgICAgICJMYXRpbiBBbWVyaWNhIENhcmliYmVhbiIgPSAiTGF0aW4iLA0KICAgICAgICAgICAgICAgICJTdWItU2FoYXJhIiA9ICJBZnJpY2EiKQ0KDQprbml0cjo6b3B0c19jaHVuayRzZXQoZWNobyA9IFRSVUUsIHdhcm5pbmcgPSBGQUxTRSwgcmVzdWx0cyA9ICJhc2lzIiwgb3V0LndpZHRoID0gIjQwMCUiKQ0KDQpgYGANCg0KDQojIEdsb2JhbCBUZXJyb3Jpc20gRGF0YXNldA0KDQpGaXJzdCwgSSBoYWQgYSBsb29rIGF0IHRoZSBkYXRhc2V0IHRoYXQgRHIuIE1hcnRpbmV6IE1hY2hhaW4gc3VnZ2VzdGVkIGluIGhlciBlbWFpbCwgdGhlIEdsb2JhbCBUZXJyb3Jpc20gRGF0YXNldC4NCg0KSWYgd2Ugc3VtIHRoZSBudW1iZXIgb2YgdG90YWwgdGVycm9yaXN0IGFjdHMgcGVyIGNvdW50cnkgcGVyIHllYXIsIHdlIHNlZSB0aGF0IHRoZSB0b3AgdGhyZWUgY291bnRyaWVzIGFyZSBJcmFxLCBQYWtpc3RhbiBhbmQgQWZnaGFuaXN0YW4uDQoNClNvdXJjZTogaHR0cHM6Ly93d3cuc3RhcnQudW1kLmVkdS9kYXRhLXRvb2xzL2dsb2JhbC10ZXJyb3Jpc20tZGF0YWJhc2UtZ3RkDQoNClRoZSBHbG9iYWwgVGVycm9yaXNtIERhdGFiYXNlIChHVEQpIGlzIGFuIG9wZW4tc291cmNlIGRhdGFiYXNlIGluY2x1ZGluZyBpbmZvcm1hdGlvbiBvbiB0ZXJyb3Jpc3QgZXZlbnRzIGFyb3VuZCB0aGUgd29ybGQgc2luY2UgMTk3MCAoY3VycmVudGx5IHVwZGF0ZWQgdGhyb3VnaCAyMDE4KS4gVW5saWtlIG1hbnkgb3RoZXIgZXZlbnQgZGF0YWJhc2VzLCB0aGUgR1REIGluY2x1ZGVzIHN5c3RlbWF0aWMgZGF0YSBvbiBpbnRlcm5hdGlvbmFsIGFzIHdlbGwgYXMgZG9tZXN0aWMgdGVycm9yaXN0IGluY2lkZW50cyB0aGF0IGhhdmUgb2NjdXJyZWQgZHVyaW5nIHRoaXMgdGltZSBwZXJpb2QgYW5kIG5vdyBpbmNsdWRlcyBvdmVyIDE5MCwwMDAgY2FzZXMuDQoNCkxhRnJlZSwgRy4sICYgRHVnYW4sIEwuICgyMDA3KS4gSW50cm9kdWNpbmcgdGhlIGdsb2JhbCB0ZXJyb3Jpc20gZGF0YWJhc2UuIFRlcnJvcmlzbSBhbmQgcG9saXRpY2FsIHZpb2xlbmNlLCAxOSgyKSwgMTgxLTIwNC4NCg0KIyBUb3RhbCB0ZXJyb3Jpc3QgYXR0YWNrcyANCg0KIyMjIFRvdGFsIHRlcnJvcmlzdCBhdHRhY2tzIGJldHdlZW4gMTk3MCBhbmQgMjAxOQ0KDQpgYGB7ciBndGRfYXR0YWNrc30NCg0KZ3RkICU+JSANCiAgZ3JvdXBfYnkoY291bnRyeV90eHQsIHJlZ2lvbl90eHQpICU+JSANCiAgc3VtbWFyaXNlKHN1bSA9IG4oKSkgJT4lIA0KICB1bmdyb3VwKCkgJT4lIA0KICBmaWx0ZXIoc3VtID4gNDAwMCkgJT4lIA0KICBnZ3Bsb3QoYWVzKHggPSByZW9yZGVyKGNvdW50cnlfdHh0LCBzdW0pLCANCiAgICAgICAgICAgICB5ID0gc3VtLCANCiAgICAgICAgICAgICBmaWxsID0gYXMuZmFjdG9yKHJlZ2lvbl90eHQpKSkgKyANCiAgICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBjKCIjMDAxMjE5IiwiIzAwNWY3MyIsIiMwYTkzOTYiLCIjOTRkMmJkIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIjZWU5YjAwIiwiI2NhNjcwMiIsIiNiYjNlMDMiLCIjYWUyMDEyIiwiIzliMjIyNiIpKSArIA0KICBjb29yZF9mbGlwKCkgKw0KICBnZW9tX2JhcihzdGF0ID0gImlkZW50aXR5IikgKyANCiAgZ2d0aGVtZXM6OnRoZW1lX3BhbmRlcigpICsNCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gImJvdHRvbSIsIA0KICAgICAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X2JsYW5rKCkpICsgDQogIGdndGl0bGUoIlRvdGFsIHRlcnJvcmlzdCBhdHRhY2tzIDE5NzAgLSAyMDE5IikNCg0KYGBgDQoNCiMgU3VpY2lkZSBhdHRhY2tzIA0KDQpJZiB3ZSBsb29rIG9ubHkgYXQgc3VpY2lkZSBhdHRhY2ssIHRoZSBjb3VudHJpZXMgYXJlIHN0aWxsIElyYXEsIEFmZ2hhbmlzdGFuIGFuZCBQYWtpc3Rhbi4NCg0KVGhlcmUgZG9lcyBub3QgYXBwZWFyIHRvIGJlIGEgdmFyaWFibGUgdG8gaW5kaWNhdGUgaWYgdGhlIHRlcnJvcmlzdCBhdHRhY2sgd2FzIHJlbGF0ZWQgZXhwbGljaXRseSB0byBJc2xhbWljIEZ1bmRhbWVudGFsaXNtLiANCg0KIyMjIFN1aWNpZGUgdGVycm9yaXN0IGF0dGFja3MgYmV0d2VlbiAxOTcwIGFuZCAyMDE5DQoNCmBgYHtyIGd0ZF9zdWljaWRlfQ0KDQpndGQgJT4lIA0KICBmaWx0ZXIoc3VpY2lkZSA9PSAxICkgJT4lIA0KICBncm91cF9ieShjb3VudHJ5X3R4dCwgcmVnaW9uX3R4dCkgJT4lIA0KICBzdW1tYXJpc2Uoc3VpY2lkZV9zdW0gPSBuKCkpICU+JSANCiAgdW5ncm91cCgpICU+JSANCiAgZmlsdGVyKHN1aWNpZGVfc3VtID4gNTApICU+JSANCiAgZ2dwbG90KGFlcyh4ID0gcmVvcmRlcihjb3VudHJ5X3R4dCwgc3VpY2lkZV9zdW0pLCANCiAgICAgICAgICAgICB5ID0gc3VpY2lkZV9zdW0sIA0KICAgICAgICAgICAgIGZpbGwgPSBhcy5mYWN0b3IocmVnaW9uX3R4dCkpKSArIA0KICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBjKCIjMDAxMjE5IiwgIiMwYTkzOTYiLCAiI2VlOWIwMCIsICIjY2E2NzAyIiwiI2JiM2UwMyIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiMwMDVmNzMiLCAiIzk0ZDJiZCIsICIjYWUyMDEyIiwgIiM5YjIyMjYiKSkgKw0KICBjb29yZF9mbGlwKCkgKw0KICBnZW9tX2JhcihzdGF0ID0gImlkZW50aXR5IikgKyANCiAgZ2d0aGVtZXM6OnRoZW1lX3BhbmRlcigpICsNCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gImJvdHRvbSIsIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfYmxhbmsoKSkgKw0KICBnZ3RpdGxlKCJTdWljaWRlIHRlcnJvcmlzdCBhdHRhY2tzIDE5NzAgLSAyMDE5IikNCg0KYGBgDQoNCiMjIyBMb29rIG9ubHkgYXQgMjAxOQ0KDQpgYGB7ciBndGRfc3VpY2lkZV8yMDE5fQ0KDQpndGQgJT4lIA0KICBmaWx0ZXIoc3VpY2lkZSA9PSAxICkgJT4lIA0KICAgIGZpbHRlcihpeWVhciA9PSAyMDE5KSAlPiUgDQogIGdyb3VwX2J5KGNvdW50cnlfdHh0LCBpeWVhciwgcmVnaW9uX3R4dCkgJT4lIA0KICBzZWxlY3QoeWVhciA9IGl5ZWFyLCBldmVyeXRoaW5nKCkpICU+JSANCiAgc3VtbWFyaXNlKHN1aWNpZGVfc3VtID0gbigpKSAlPiUgDQogIGFycmFuZ2UoZGVzYyhzdWljaWRlX3N1bSkpICU+JSANCiAgaGVhZCgyMCkgJT4lIA0KICB1bmdyb3VwKCkgICU+JSANCiAgZ2dwbG90KGFlcyh4ID0gcmVvcmRlcihjb3VudHJ5X3R4dCwgc3VpY2lkZV9zdW0pLCANCiAgICAgICAgICAgICB5ID0gc3VpY2lkZV9zdW0sIA0KICAgICAgICAgICAgIGZpbGwgPSBhcy5mYWN0b3IocmVnaW9uX3R4dCkpKSArIA0KICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBjKCIjMDAxMjE5IiwgIiMwYTkzOTYiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIjY2E2NzAyIiwiIzliMjIyNiIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiM5NGQyYmQiLCIjZWU5YjAwIikpICsNCiAgY29vcmRfZmxpcCgpICsNCiAgZ2VvbV9iYXIoc3RhdCA9ICJpZGVudGl0eSIpICsgZmFjZXRfd3JhcCh+eWVhcikgKw0KICBnZ3RoZW1lczo6dGhlbWVfcGFuZGVyKCkgKw0KICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAiYm90dG9tIiwgbGVnZW5kLnRpdGxlID0gZWxlbWVudF9ibGFuaygpKSArDQogIGdndGl0bGUoIlRvdGFsIHN1aWNpZGUgdGVycm9yaXN0IGF0dGFja3MgcGVyIGNvdW50cnkgaW4gMjAxOSIpDQoNCg0KYGBgDQoNCg0KU28gZm9yIHRoZSBkYXRhc2V0LCB3ZSBjYW4gYWRkIGEgdmFyaWFibGUgd2l0aCBudW1iZXIgb2YgdGVycm9yaXN0IGF0dGFja3MgcGVyIGNvdW50cnkgcGVyIHllYXIgb3Igd2UgY2FuIGNyZWF0ZSBhIGJpbmFyeSB2YXJpYWJsZSB3aXRoIGEgY3V0LW9mZiBwb2ludC4gDQoNCldlIGNhbiBhbHNvIGxvb2sgYXQgbnVtYmVyIG9mIHRlcnJvcmlzdCBhdHRhY2tzIHBlciBjYXBpdGEgcGVyIHllYXIgYW5kIHJ1biBhIHNjYXR0ZXIgcGxvdCB3aXRoIFBEIGJ1ZGdldHMgdG8gc2VlIGlmIHRoZXJlIGlzIGEgbGluZWFyIHJlbGF0aW9uc2hpcA0KDQpgYGB7ciwgZWNobyA9IEZBTFNFfQ0KDQpndGQkY293X2NvZGUgPC0gY291bnRyeWNvZGUoZ3RkJGNvdW50cnlfdHh0LCAiY291bnRyeS5uYW1lIiwgImNvd24iKQ0KDQpndGQgJTw+JSANCiAgIG11dGF0ZShjb3dfY29kZSA9IGlmZWxzZShjb3VudHJ5X3R4dCA9PSAiV2VzdCBCYW5rIGFuZCBHYXphIFN0cmlwIiwgNjY2NiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoY291bnRyeV90eHQgPT0gIlNlcmJpYSIsIDM0NSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoY291bnRyeV90eHQgPT0gIkhvbmcgS29uZyIsIDk5NywgY293X2NvZGUpKSkpDQoNCmd0ZCAlPiUgDQogIGdyb3VwX2J5KGNvd19jb2RlLCBpeWVhciwgcmVnaW9uX3R4dCkgJT4lIA0KICBzZWxlY3QoeWVhciA9IGl5ZWFyLCBldmVyeXRoaW5nKCkpICU+JSANCiAgc3VtbWFyaXNlKHN1bV9hdHRhY2tzID0gbigpKSAlPiUgDQogIHVuZ3JvdXAoKSAtPiBndGRfYW5udWFsX3N1bQ0KDQpndGQgJT4lIA0KICBncm91cF9ieShjb3dfY29kZSwgaXllYXIpICU+JSANCiAgc2VsZWN0KHllYXIgPSBpeWVhciwgZXZlcnl0aGluZygpKSAlPiUgDQogIGZpbHRlcihzdWljaWRlID09IDEpICU+JSANCiAgc3VtbWFyaXNlKHN1bV9zdWljaWRlcyA9IG4oKSkgJT4lIA0KICB1bmdyb3VwKCkgLT4gZ3RkX2FubnVhbF9zdWljaWRlDQoNCmd0ZCAlPiUgDQogIGdyb3VwX2J5KGNvd19jb2RlLCBpeWVhcikgJT4lIA0KICBzZWxlY3QoeWVhciA9IGl5ZWFyLCBldmVyeXRoaW5nKCkpICU+JSANCiAgZmlsdGVyKHN1aWNpZGUgPT0gMSkgJT4lIA0KICBzdW1tYXJpc2Uoc3VtX2FsbF95ZWFyX3N1aWNpZGVzID0gbigpKSAlPiUgDQogIHVuZ3JvdXAoKSAtPiBndGRfdG90YWxfc3VpY2lkZQ0KDQpndGQgJT4lIA0KICBncm91cF9ieShjb3dfY29kZSwgaXllYXIsIHJlZ2lvbl90eHQpICU+JSANCiAgc2VsZWN0KHllYXIgPSBpeWVhciwgZXZlcnl0aGluZygpKSAlPiUgDQogIHN1bW1hcmlzZShzdW1fYWxsX3llYXJfYXR0YWNrcyA9IG4oKSkgJT4lIA0KICB1bmdyb3VwKCkgLT4gZ3RkX3RvdGFsX3N1bQ0KDQp0aGVfZGYgPC0gbWVyZ2UodGhlX2RmLCBndGRfYW5udWFsX3N1bSwgYnkgPSBjKCJjb3dfY29kZSIsICJ5ZWFyIiksIGFsbC54ID0gVFJVRSkNCnRoZV9kZiA8LSBtZXJnZSh0aGVfZGYsIGd0ZF9hbm51YWxfc3VpY2lkZSwgYnkgPSBjKCJjb3dfY29kZSIsICJ5ZWFyIiksIGFsbC54ID0gVFJVRSkNCg0KdGhlX2RmIDwtIG1lcmdlKHRoZV9kZiwgZ3RkX3RvdGFsX3N1aWNpZGUsIGJ5ID0gYygiY293X2NvZGUiLCAieWVhciIpLCBhbGwueCA9IFRSVUUpDQp0aGVfZGYgPC0gbWVyZ2UodGhlX2RmLCBndGRfdG90YWxfc3VtLCBieSA9IGMoImNvd19jb2RlIiwgInllYXIiKSwgYWxsLnggPSBUUlVFKQ0KDQp0aGVfZGYgJT4lIA0KICBncm91cF9ieShjb3dfY29kZSkgJT4lIA0KICBtdXRhdGUoYXZnX3N1aWNpZGUgPSBzdW1fYWxsX3llYXJfc3VpY2lkZXMgLyAxOCkgJT4lDQogIHVuZ3JvdXAoKSAlPiUgDQogIGZpbHRlcih5ZWFyID09IDIwMTkpICU+JSANCiAgc2VsZWN0KGNvdW50cnksIGF2Z19zdWljaWRlKSAlPiUgDQogIGFycmFuZ2UoZGVzYyhhdmdfc3VpY2lkZSkpDQoNCnRoZV9kZiAlPiUgDQogIGdyb3VwX2J5KGNvd19jb2RlKSAlPiUgDQogIG11dGF0ZShhdmdfYXR0YWNrcyA9IHJvdW5kKG1lYW4oc3VtX2FsbF95ZWFyX2F0dGFja3MsIG5hLnJtID0gVFJVRSkpLCAwKSAlPiUNCiAgdW5ncm91cCgpICU+JSANCiAgZmlsdGVyKHllYXIgPT0gMjAxOSkgJT4lIA0KICBzZWxlY3QoY291bnRyeSwgYXZnX2F0dGFja3MpICU+JSANCiAgYXJyYW5nZShkZXNjKGF2Z19hdHRhY2tzKSkgLT4gaG8NCg0KVmlldyhobykNCg0KYGBgDQoNCg0KU2NhdHRlcnBsb3QgY29tcGFyaW5nIGFsbCB0eXBlcyBvZiB0ZXJyb3Jpc3QgYXR0YWNrcyBwZXIgY2FwaXRhIHZzIFBEIGJ1ZGdldHMgcGVyIGNhcGl0YQ0KDQpgYGB7ciAgYXR0YWNrX3NjYXR0ZXJ9DQoNCnRoZV9kZiAlPiUNCiAgbXV0YXRlKGF0dGFja3NfcGMgPSBzdW1fYXR0YWNrcyAvIHBvcCwgbmEucm0gPSBUUlVFKSAlPiUgDQogIGdncGxvdChhZXMoeSA9IGxvZyhidWRnZXRfcGMpLCB4ID0gbG9nKGF0dGFja3NfcGMpKSkgKw0KICAgICAgZ2VvbV9zbW9vdGgobWV0aG9kID0gImxtIiwgY29sb3IgPSAiIzlkMDIwOCIpICsNCiAgZ2VvbV9wb2ludChhZXMoY29sb3IgPSBhcy5mYWN0b3IocmVnaW9uXzYpLCBzaGFwZSA9IGFzLmZhY3RvcihyZWdpb25fNikpKSArDQogIGZhY2V0X3dyYXAofnllYXIpICsNCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IGMoIiMyMTllYmMiLCAiIzI2NDY1MyIsICIjNDNhYThiIiwgIiM2ZDU5N2EiLCAiI2U2Mzk0NiIsICIjZjRhMjYxIiksIG5hbWUgPSBOVUxMKSArDQogIHNjYWxlX3NoYXBlX21hbnVhbCh2YWx1ZXMgPSBjKDE1LDE2LDE3LDE4LDE5LDEwKSwgbmFtZSA9IE5VTEwpICsNCiAgeGxhYigiTG9nZ2VkIG51bWJlciBvZiB0ZXJyb3Jpc3QgYXR0YWNrcyBwZXIgY2FwaXRhIikgKw0KICB5bGFiKCJMb2dnZWQgUEQgYnVkZ2V0IHBlciBjYXBpdGEiKSArDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJsZWZ0IikgKw0KICBnZ3RoZW1lczo6dGhlbWVfcGFuZGVyKCkgKyANCiAgZ2d0aXRsZSgiVG90YWwgdGVycm9yaXN0IGF0dGFja3MgcGVyIGNhcGl0YSB2cyBQRCBidWRnZXRzIHBlciBjYXBpdGEiKQ0KDQpgYGANCg0KU2NhdHRlcnBsb3QgY29tcGFyaW5nIHN1aWNpZGUgdGVycm9yaXN0IGF0dGFja3MgcGVyIGNhcGl0YSB2cyBQRCBidWRnZXRzIHBlciBjYXBpdGENCg0KDQpgYGB7ciBzdWljaWRlX2Jhcn0NCg0KdGhlX2RmICU+JQ0KICBtdXRhdGUoYXR0YWNrc19wYyA9IHN1bV9zdWljaWRlcyAvIHBvcCwgbmEucm0gPSBUUlVFKSAlPiUgDQogIGdncGxvdChhZXMoeSA9IGxvZyhidWRnZXRfcGMpLCB4ID0gbG9nKGF0dGFja3NfcGMpKSkgKw0KICBnZW9tX3Ntb290aChtZXRob2QgPSAibG0iLCBjb2xvciA9ICIjOWQwMjA4IikgKw0KICBnZW9tX3BvaW50KGFlcyhjb2xvciA9IGFzLmZhY3RvcihyZWdpb25fNiksIHNoYXBlID0gYXMuZmFjdG9yKHJlZ2lvbl82KSkpICsNCiAgZmFjZXRfd3JhcCh+eWVhcikgKw0KICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gYygiIzIxOWViYyIsICIjMjY0NjUzIiwgIiM0M2FhOGIiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiM2ZDU5N2EiLCAiI2U2Mzk0NiIsICIjZjRhMjYxIiksIG5hbWUgPSBOVUxMKSArDQogIHNjYWxlX3NoYXBlX21hbnVhbCh2YWx1ZXMgPSBjKDE1LDE2LDE3LDE4LDE5LDEwKSwgbmFtZSA9IE5VTEwpICsNCiAgeGxhYigiTG9nZ2VkIG51bWJlciBvZiB0ZXJyb3Jpc3QgYXR0YWNrcyBwZXIgY2FwaXRhIikgKw0KICB5bGFiKCJMb2dnZWQgUEQgYnVkZ2V0IHBlciBjYXBpdGEiKSArDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJsZWZ0IikgKw0KICBnZ3RoZW1lczo6dGhlbWVfcGFuZGVyKCkgKyANCiAgZ2d0aXRsZSgiU3VpY2lkZSBhdHRhY2tzIHBlciBjYXBpdGEgdnMgUEQgYnVkZ2V0cyBwZXIgY2FwaXRhIikNCg0KYGBgDQoNCmBgYHtyIHN1aWNpZGVfdG90YWxfc2NhdHRlcn0NCg0KdGhlX2RmICU+JQ0KICANCiAgDQogIGdncGxvdChhZXMoeSA9IGxvZyhidWRnZXRfcGMpLCB4ID0gbG9nKHN1bV9zdWljaWRlcykpKSArDQogIGdlb21fc21vb3RoKG1ldGhvZCA9ICJsbSIsIGNvbG9yID0gIiM5ZDAyMDgiKSArDQogIGdlb21fcG9pbnQoYWVzKGNvbG9yID0gYXMuZmFjdG9yKHJlZ2lvbl82KSwgc2hhcGUgPSBhcy5mYWN0b3IocmVnaW9uXzYpKSkgKw0KICBmYWNldF93cmFwKH55ZWFyKSArDQogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBjKCIjMjE5ZWJjIiwgIiMyNjQ2NTMiLCAiIzQzYWE4YiIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIzZkNTk3YSIsICIjZTYzOTQ2IiwgIiNmNGEyNjEiKSwgbmFtZSA9IE5VTEwpICsNCiAgc2NhbGVfc2hhcGVfbWFudWFsKHZhbHVlcyA9IGMoMTUsMTYsMTcsMTgsMTksMTApLCBuYW1lID0gTlVMTCkgKw0KICB4bGFiKCJMb2dnZWQgbnVtYmVyIG9mIHRlcnJvcmlzdCBhdHRhY2tzIHBlciBjYXBpdGEiKSArDQogIHlsYWIoIkxvZ2dlZCBQRCBidWRnZXQgcGVyIGNhcGl0YSIpICsNCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gImxlZnQiKSArDQogIGdndGhlbWVzOjp0aGVtZV9wYW5kZXIoKSArIA0KICBnZ3RpdGxlKCJTdWljaWRlIGF0dGFja3MgcGVyIGNhcGl0YSB2cyBQRCBidWRnZXRzIHBlciBjYXBpdGEiKQ0KDQpgYGANCg0KIyMgT25seSBsb29raW5nIGF0IHRlcnJvcmlzdCBhdHRhY2tzIGluIDIwMTkNCg0KYGBge3Igc3VpY2lkZV9iYXJfMTl9DQoNCnRoZV9kZiAlPiUNCiAgZmlsdGVyKHllYXIgPT0gMjAxOSkgJT4lIA0KICBtdXRhdGUoYXR0YWNrc19wYyA9IHN1bV9hdHRhY2tzIC8gcG9wLCBuYS5ybSA9IFRSVUUpICU+JSANCiAgZ2dwbG90KGFlcyh5ID0gbG9nKGJ1ZGdldCksIHggPSBsb2coc3VtX2F0dGFja3MpLCBncm91cCA9IGFzLmZhY3RvcihyZWdpb25fNikpKSArIA0KICBnZW9tX3Ntb290aChtZXRob2QgPSAibG0iLCBjb2xvciA9ICIjOWQwMjA4IiwgYWxwaGEgPSAwLjUpICsNCiAgZ2VvbV9wb2ludChhZXMoY29sb3IgPSBhcy5mYWN0b3IocmVnaW9uXzYpLCBzaGFwZSA9IGFzLmZhY3RvcihyZWdpb25fNikpKSArIA0KICBmYWNldF93cmFwKH5yZWdpb25fNikgKyANCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IGMoIiMyMTllYmMiLCAiIzI2NDY1MyIsICIjNDNhYThiIiwgIiM2ZDU5N2EiLCAiI2U2Mzk0NiIsICIjZjRhMjYxIiksDQogICAgICAgICAgICAgICAgICAgbmFtZSA9IE5VTEwpICsNCiAgc2NhbGVfc2hhcGVfbWFudWFsKHZhbHVlcyA9IGMoMTUsMTYsMTcsMTgsMTksMTApLA0KICAgICAgICAgICAgICAgICAgICAgbmFtZSA9IE5VTEwpICsNCiAgeGxhYigiTG9nZ2VkIG51bWJlciBvZiB0ZXJyb3Jpc3QgYXR0YWNrcyBwZXIgY2FwaXRhIikgKw0KICB5bGFiKCJMb2dnZWQgUEQgYnVkZ2V0IHBlciBjYXBpdGEiKSArDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJsZWZ0IikgKw0KICBnZ3RoZW1lczo6dGhlbWVfcGFuZGVyKCkgKyANCiAgZ2d0aXRsZSgiVG90YWwgdGVycm9yaXN0IGF0dGFja3MgcGVyIGNhcGl0YSB2cyBQRCBidWRnZXRzIHBlciBjYXBpdGEgaW4gMjAxOSIpDQoNCmBgYA0KDQoNCiMjIFN1aWNpZGUgYXR0YWNrcyBwZXIgY2FwaXRhIHZzIFBEIGJ1ZGdldHMgcGVyIGNhcGl0YSBzaW5jZSAyMDEzDQoNCmBgYHtyIHN1aWNpZGVfc2NhdHRlcn0NCg0KdGhlX2RmICU+JQ0KICBmaWx0ZXIoeWVhciA+IDIwMTIpICU+JSANCiAgbXV0YXRlKGF0dGFja3NfcGMgPSBzdW1fc3VpY2lkZXMgLyBwb3AsIG5hLnJtID0gVFJVRSkgJT4lIA0KICBnZ3Bsb3QoYWVzKHkgPSBsb2coYnVkZ2V0X3BjKSwgeCA9IGxvZyhhdHRhY2tzX3BjKSkpICsNCiAgZ2VvbV9zbW9vdGgobWV0aG9kID0gImxtIiwgY29sb3IgPSAiIzlkMDIwOCIpICsNCiAgZ2VvbV9wb2ludChhZXMoY29sb3IgPSBhcy5mYWN0b3IocmVnaW9uXzYpLCBzaGFwZSA9IGFzLmZhY3RvcihyZWdpb25fNikpKSArDQogIGZhY2V0X3dyYXAofnJlZ2lvbl82KSArDQogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBjKCIjMjE5ZWJjIiwgIiMyNjQ2NTMiLCAiIzQzYWE4YiIsICIjNmQ1OTdhIiwgIiNlNjM5NDYiLCAiI2Y0YTI2MSIpLCBuYW1lID0gTlVMTCkgKw0KICBzY2FsZV9zaGFwZV9tYW51YWwodmFsdWVzID0gYygxNSwxNiwxNywxOCwxOSwxMCksIG5hbWUgPSBOVUxMKSArDQogIHhsYWIoIkxvZ2dlZCBudW1iZXIgb2YgdGVycm9yaXN0IGF0dGFja3MgcGVyIGNhcGl0YSIpICsNCiAgeWxhYigiTG9nZ2VkIFBEIGJ1ZGdldCBwZXIgY2FwaXRhIikgKw0KICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibGVmdCIpICsNCiAgZ2d0aGVtZXM6OnRoZW1lX3BhbmRlcigpICsgDQogIGdndGl0bGUoIlN1aWNpZGUgYXR0YWNrcyBwZXIgY2FwaXRhIHZzIFBEIGJ1ZGdldHMgcGVyIGNhcGl0YSBzaW5jZSAyMDEzIikNCg0KYGBgDQoNCg0KDQoNCiMgQ2hpbmVzZSBhaWQgZGF0YXNldA0KDQpOZXh0IHdlIGNhbiBkZWNpZGUgd2hpY2ggY291bnRyaWVzIGFyZSBpbiBDaGluYSdzIHNwaGVyZSBvZiBpbmZsdWVuY2UuDQoNCg0KYGBge3IgY2hpbmFfYWlkX2luc3RhbGwsIGVjaG8gPSBGQUxTRX0NCg0KbGlicmFyeShmb3JlaWduKQ0KbGlicmFyeShyZWFkeGwpDQoNCm1hc3RlciA8LSAgcmVhZC5jc3YoIkM6L1VzZXJzL1BhdWxhL0Rlc2t0b3AvbWFzdGVyX2NvcHlfMTk0OF8yMDE5LmNzdiIpDQoNCmNoaW5hX29yaWcgPC0gcmVhZF9leGNlbCgiQzovVXNlcnMvUGF1bGEvRGVza3RvcC9HbG9iYWxDaGluZXNlT2ZmaWNpYWxGaW5hbmNlRGF0YXNldF92MS4wLnhsc3giKQ0KDQoNCmNoaW5hX29yaWcgJT4lIA0KICBkcGx5cjo6c2VsZWN0KGNvdW50cnkgPSByZWNpcGllbnRfY29uZGVuc2VkLCB5ZWFyLCANCiAgICAgICAgICAgICAgICBjaG5fYWlkID0gdXNkX2RlZmxfMjAxNCkgLT4gY2hpbmFfYWlkDQoNCmNoaW5hX2FpZCRjb3dfY29kZSA8LSBjb3VudHJ5Y29kZShjaGluYV9haWQkY291bnRyeSwgImNvdW50cnkubmFtZSIsICJjb3duIikNCg0KY2hpbmFfYWlkIDwtIG1lcmdlKGNoaW5hX2FpZCwgbWFzdGVyLCBieSA9IGMoImNvd19jb2RlIiwgInllYXIiKSwgYWxsLnggPSBUUlVFKQ0KDQpgYGANCg0KU291cmNlOiAgaHR0cHM6Ly93d3cuYWlkZGF0YS5vcmcvZGF0YS9jaGluZXNlLWdsb2JhbC1vZmZpY2lhbC1maW5hbmNlLWRhdGFzZXQNCg0KVGhpcyBkYXRhc2V0IHRyYWNrcyB0aGUga25vd24gdW5pdmVyc2Ugb2Ygb3ZlcnNlYXMgQ2hpbmVzZSBvZmZpY2lhbCBmaW5hbmNlIGJldHdlZW4gMjAwMC0yMDE0LCBjYXB0dXJpbmcgNCwzNzMgcmVjb3JkcyB0b3RhbGluZyAkMzU0LjQgYmlsbGlvbi4gVGhlIGRhdGEgaW5jbHVkZXMgYm90aCBDaGluZXNlIGFpZCBhbmQgbm9uLWNvbmNlc3Npb25hbCBvZmZpY2lhbCBmaW5hbmNpbmcuDQoNCkJsdWhtLCBSLiwgRHJlaGVyLCBBLiwgRnVjaHMsIEEuLCBQYXJrcywgQi4gQy4sIFN0cmFuZ2UsIEEuLCAmIFRpZXJuZXksIE0uSi4gKDIwMTgpLiBDb25uZWN0aXZlIEZpbmFuY2luZzogQ2hpbmVzZSBJbmZyYXN0cnVjdHVyZSBQcm9qZWN0cyBhbmQgdGhlIERpZmZ1c2lvbiBvZiBFY29ub21pYyBBY3Rpdml0eSBpbiBEZXZlbG9waW5nIENvdW50cmllcy4gQWlkRGF0YSBXb3JraW5nIFBhcGVyDQoNCiMjIyBMb29raW5nIGF0IHRoZSB0b3RhbCBhaWQgZnJvbSBDaGluYSBiZXR3ZWVuIDIwMDAgdG8gMjAxNA0KDQpgYGB7ciBhaWRfY2hpbmFfMDBfMTR9DQoNCmNoaW5hX2FpZCAlPiUgDQogIGZpbHRlcighaXMubmEocmVnaW9uX25hbWUpKSAlPiUgDQogIGdyb3VwX2J5KGNvdW50cnksIHJlZ2lvbl9uYW1lKSAlPiUgDQogIGZpbHRlcighZ3JlcGwoInJlZ2lvbmFsIiwgY291bnRyeSkpICU+JSANCiAgc3VtbWFyaXNlKHN1bV9haWQgPSBzdW0oY2huX2FpZCwgbmEucm0gPSBUUlVFKSkgJT4lIA0KICB1bmdyb3VwKCkgJT4lIA0KICB0b3BfbigzMCkgJT4lIA0KICBnZ3Bsb3QoYWVzKHg9IHJlb3JkZXIoY291bnRyeSwgc3VtX2FpZCksIA0KICAgICAgICAgICAgIHkgPSBzdW1fYWlkLCANCiAgICAgICAgICAgICBmaWxsID0gYXMuZmFjdG9yKHJlZ2lvbl9uYW1lKSkpICsgDQogIGdlb21fYmFyKHN0YXQgPSAiaWRlbnRpdHkiKSArIA0KICBjb29yZF9mbGlwKCkgKyANCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gYygiIzAwNWY3MyIsIiMwYTkzOTYiLCIjOTRkMmJkIiwiI2VlOWIwMCIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiNjYTY3MDIiLCIjYmIzZTAzIiwiI2FlMjAxMiIsIiM5YjIyMjYiKSwgDQogICAgICAgICAgICAgICAgICAgIG5hbWUgPSBOVUxMKSArDQogIHRoZW1lKGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMCksDQogICAgICAgIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfYmxhbmsoKSwgDQogICAgICAgIGxlZ2VuZC5wb3NpdGlvbiA9ICJib3R0b20iKSArIA0KICB4bGFiKCJjb3VudHJ5IikgKw0KICB5bGFiKCJUb3RhbCBhaWQgZnJvbSBDaGluYSIpICsNCiAgZ2d0aGVtZXM6OnRoZW1lX3BhbmRlcigpICsgDQogIGdndGl0bGUoIlRvdGFsIGFpZCBmcm9tIENoaW5hIGJldHdlZW0gMjAwMCAtIDIwMTQiKSANCg0KY2hpbmFfYWlkICU+JSANCiAgZmlsdGVyKCFpcy5uYShyZWdpb25fbmFtZSkpICU+JSANCiAgZ3JvdXBfYnkoY291bnRyeSwgcmVnaW9uX25hbWUpICU+JSANCiAgZmlsdGVyKCFncmVwbCgicmVnaW9uYWwiLCBjb3VudHJ5KSkgJT4lIA0KICBzdW1tYXJpc2Uoc3VtX2FpZCA9IHN1bShjaG5fYWlkLCBuYS5ybSA9IFRSVUUpKSAlPiUgDQogIHVuZ3JvdXAoKSAlPiUgDQogIHRvcF9uKDIwKSAlPiUgcHVsbChjb3VudHJ5KSAtPiB0b3BfY2hpbmFfYWlkX3ZlY3Rvcg0KDQp0b3BfY2hpbmFfYWlkX3ZlY3Rvcg0KDQoNCmNoaW5hX2FpZCAlPiUgDQogIGZpbHRlcighaXMubmEocmVnaW9uX25hbWUpKSAlPiUgDQogIGdyb3VwX2J5KGNvdW50cnksIHJlZ2lvbl9uYW1lKSAlPiUgDQogIGZpbHRlcighZ3JlcGwoInJlZ2lvbmFsIiwgY291bnRyeSkpICU+JSANCiAgbXV0YXRlKGNobl9haWRfcGMgPSBjaG5fYWlkIC8gcG9wdWxhdGlvbiwgbmEucm0gPSBUUlVFKSAlPiUgDQogIHN1bW1hcmlzZShzdW1fYWlkX3BjID0gc3VtKGNobl9haWRfcGMsIG5hLnJtID0gVFJVRSkpICU+JSANCiAgdW5ncm91cCgpICU+JSANCiAgdG9wX24oMjApICU+JSBwdWxsKGNvdW50cnkpIC0+IHRvcF9jaGluYV9haWRfcGNfdmVjdG9yDQoNCnRvcF9jaGluYV9haWRfcGNfdmVjdG9yDQogIA0KDQpgYGANCg0KIyMgQ2hpbmVzZSBGREkgaW4gQWZyaWNhDQoNClNvdXJjZTogaHR0cHM6Ly93d3cuYWlkZGF0YS5vcmcvZGF0YS9haWRkYXRhcy1jaGluZXNlLW9mZmljaWFsLWZpbmFuY2UtdG8tYWZyaWNhLWRhdGFzZXQtdmVyc2lvbi0xLTEtMQ0KDQpUaGlzIGlzIGEgZGF0YXNldCBvZiBDaGluZXNlIG9mZmljaWFsIGZpbmFuY2UgYWN0aXZpdGllcyB0aGF0IHNwYW5zIDUwIEFmcmljYW4gY291bnRyaWVzIG92ZXIgdGhlIDIwMDAtMjAxMiBwZXJpb2QuIEl0IGluY2x1ZGVzIDEsOTUyIENoaW5lc2UgZGV2ZWxvcG1lbnQgZmluYW5jZSBwcm9qZWN0cyBhY3Jvc3MgMyw1NDUgcGh5c2ljYWwgbG9jYXRpb25zLg0KDQpEcmVoZXIsIEEuLCBGdWNocywgQS4sIEhvZGxlciwgUi4sIFBhcmtzLCBCLiBDLiwgUmFzY2hreSwgUC4gQS4sICYgVGllcm5leSwgTS5KLiAoMjAxOSkuIEFmcmljYW4gTGVhZGVycyBhbmQgdGhlIEdlb2dyYXBoeSBvZiBDaGluYSdzIEZvcmVpZ24gQXNzaXN0YW5jZS4gSm91cm5hbCBvZiBEZXZlbG9wbWVudCBFY29ub21pY3MsIDE0MCwgNDQtNzEuDQoNCmBgYHtyIGNoaW5hX2ZkaSwgZWNobyA9IEZBTFNFfQ0KDQphZnJpY2FfZmRpIDwtIHJlYWQuY3N2KCJDOi9Vc2Vycy9QYXVsYS9EZXNrdG9wL2NoaW5hX2ZkaS5jc3YiKQ0KbmFtZXMoYWZyaWNhX2ZkaSkgPC0gYWZyaWNhX2ZkaVsxLF0NCmFmcmljYV9mZGkgPC0gYWZyaWNhX2ZkaVstMSxdDQoNCmFmcmljYV9mZGkgJTw+JSANCiAgc2VsZWN0KHllYXIgPSAiVVMkIG1uLCB1bmFkanVzdGVkIiwgZXZlcnl0aGluZygpKSANCg0KYWZyaWNhX2ZkaTIgPC0gYWZyaWNhX2ZkaVstYygxOjEzKSwgXSANCmFmcmljYV9mZGkzIDwtIGFmcmljYV9mZGkyWy1jKDE4OjIyKSwgXSAgDQoNCg0Kd2lkZV9mZGkgPC0gbWVsdChhZnJpY2FfZmRpMywNCiAgICAgICAgICAgICAgICAgICBpZC52YXJzID0gYygieWVhciIpLA0KICAgICAgICAgICAgICAgICAgIHZhcmlhYmxlLm5hbWUgPSAiY291bnRyeSIsDQogICAgICAgICAgICAgICAgICAgdmFsdWUubmFtZSA9ICJmZGkiKQ0KDQp3aWRlX2ZkaSAlPiUNCiAgZmlsdGVyKGNvdW50cnkgIT0gInRvdGFsX3VzX21uIikgJT4lIA0KICBtdXRhdGUoZmRpX2Ftb3VudCA9IGFzLm51bWVyaWMoZmRpKSkgJT4lIA0KICBmaWx0ZXIoIWdyZXBsKCJUb3RhbCIsIGNvdW50cnkpKSAlPiUgDQogIGZpbHRlcighaXMubmEoY291bnRyeSkpICU+JSANCiAgZ3JvdXBfYnkoY291bnRyeSkgJT4lIA0KICBzdW1tYXJpc2Uoc3VtX2ZkaSA9IHN1bShmZGlfYW1vdW50LCBuYS5ybSA9IFRSVUUpKSAlPiUNCiAgdW5ncm91cCgpIC0+IGZkaV9hZiANCg0KZmRpX2FmJGNvd19jb2RlIDwtIGNvdW50cnljb2RlKGZkaV9hZiRjb3VudHJ5LCAiY291bnRyeS5uYW1lIiwgImNvd24iKQ0KDQpgYGANCg0KDQojIyBUb3RhbCBkZXZlbG9wbWVudCBmaW5hbmNlIGludmVzdG1lbnQgdG8gQWZyaWNhIGZyb20gQ2hpbmEgMjAwMCB0byAyMDEyDQoNCmBgYHtyIGNoaW5hX2Rldl9maW59DQoNCmZkaV9hZiAlPiUgDQogICAgdG9wX24oMjUpICU+JSANCiAgZ2dwbG90KGFlcyh4ID0gcmVvcmRlcihjb3VudHJ5LCBzdW1fZmRpKSwgeSA9IHN1bV9mZGksIGZpbGwgPSBjb3VudHJ5KSkgKyANCiAgZ2VvbV9iYXIoc3RhdCA9ICJpZGVudGl0eSIpICsgDQogIGNvb3JkX2ZsaXAoKSArIGdndGhlbWVzOjp0aGVtZV9wYW5kZXIoKSArDQogIHRoZW1lKGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMCksDQogICAgICAgIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfYmxhbmsoKSwgDQogICAgICAgIGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIikgKyBnZ3RoZW1lczo6dGhlbWVfcGFuZGVyKCkgKw0KICB4bGFiKCJUb3RhbCBkZXZlbG9wbWVudCBmaW5hbmNlIGNvc3RzIikgKw0KICB5bGFiKCJDb3VudHJ5IikgKw0KICBnZ3RoZW1lczo6dGhlbWVfcGFuZGVyKCkgKyB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpICsNCiAgZ2d0aXRsZSgiVG90YWwgZGV2ZWxvcG1lbnQgZmluYW5jZSBpbnZlc3RtZW50IGZyb20gQ2hpbmEgMjAwMCB0byAyMDEyICIpIA0KDQoNCmBgYA0KDQojIyBMb29raW5nIGF0IHRoZSBmaW5hbmNpYWwgZGV2ZWxvcG1lbnQgaW52ZXN0bWVudCBwZXIgY2FwaXRhIHRvIEFmcmljYSAyMDAwIHRvIDIxMDINCg0KYGBge3IgY2hpbmFfZGV2X2Zpbl9wY30NCg0KdGhlX2RmIDwtbWVyZ2UodGhlX2RmLCBmZGlfYWYsIGJ5ID0gYygiY293X2NvZGUiKSwgYWxsLnggPSBUUlVFKQ0KDQp0aGVfZGYgJT4lIA0KICBmaWx0ZXIoc3VtX2ZkaSA+IDEwMDAwKSAlPiUgDQogIG11dGF0ZShmZGlfcGMgPSBzdW1fZmRpIC8gcG9wLCBuYS5ybSA9IFRSVUUpICU+JSANCiAgZ2dwbG90KGFlcyh4ID0gcmVvcmRlcihjb3VudHJ5LngsIGZkaV9wYyksIHkgPSBmZGlfcGMsIGZpbGwgPSBjb3VudHJ5LngpKSArIA0KICBnZW9tX2JhcihzdGF0ID0gImlkZW50aXR5IikgKyANCiAgY29vcmRfZmxpcCgpICsgZ2d0aGVtZXM6OnRoZW1lX3BhbmRlcigpICsNCiAgdGhlbWUoYXhpcy50ZXh0LnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEwKSwNCiAgICAgICAgYXhpcy50aXRsZS55ID0gZWxlbWVudF9ibGFuaygpLCANCiAgICAgICAgbGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKSArIGdndGhlbWVzOjp0aGVtZV9wYW5kZXIoKSArDQogIHhsYWIoIlRvdGFsIGZpbmFuY2UgY29zdHMgcGVyIGNhcGl0YSIpICsNCiAgeWxhYigiQ291bnRyeSIpICsNCiAgZ2d0aGVtZXM6OnRoZW1lX3BhbmRlcigpICsgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKSArDQogIGdndGl0bGUoIlRvdGFsIGZpbmFuY2UgcGVyIGNhcGl0YSBmcm9tIENoaW5hIDIwMDAgdG8gMjAxMiAiKSANCg0KYGBgDQoNCg0KIyBSdXNzaWEncyBTcGhlcmUgb2YgSW5mbHVlbmNlIA0KDQpSdXNzaWEncyBzcGhlcmUgY29udGFpbnMgYWxsIHBvc3Qtc292aWV0IGNvdW50cmllcyBhbmQgYWxsIGNvdW50cmllcyB0aGF0IGFyZSBjb250aWd1b3VzIHRvIFJ1c3NpYQ0KDQpgYGB7ciwgZWNobyA9IEZBTFNFfQ0KDQpydXNzaWFfZHlhZCA8LSByZWFkLmNzdigiQzovVXNlcnMvUGF1bGEvRGVza3RvcC9QRF9vcmlnaW5hbF9kYXRhc2V0cy9ydXNzaWFfZHlhZC5jc3YiKQ0KDQp0aGVfZGYgPC0gbWVyZ2UodGhlX2RmLCBydXNzaWFfZHlhZCwgYnkgPSBjKCJjb3dfY29kZSIsICJ5ZWFyIiksIGFsbC54ID0gVFJVRSkNCg0KYGBgDQoNCg0KIyBDaGluYSdzIFNwaGVyZSBvZiBJbmZsdWVuY2UNCg0KQ2hpbmEncyBzcGVoZXJlIGNvbnRhaW5zIHRvcCAyMCBhaWQgcmVjaXBpZW50cyBwZXIgY2FwaXRhIGFuZCB0b3AgZmluYW5jaWFsIHJlY2lwaWVudHMgcGVyIGNhcGl0YSBmcm9tIFhYWCBZWVkgeWVhcnMvDQoNCkl0IGFsc28gY29udGFpbnMgYWxsIGNvdW50cmllcyBjb250aWd1b3VzIHRvIENoaW5hLg0KDQojIEF2ZXJhZ2Ugdm90aW5nIHNpbWlsYXJpdHkgdG8gQ2hpbmEgaW4gdGhlIFVODQoNClNvdXJjZTogaHR0cHM6Ly9kYXRhdmVyc2UuaGFydmFyZC5lZHUvZGF0YXNldC54aHRtbD9wZXJzaXN0ZW50SWQ9ZG9pOjEwLjc5MTAvRFZOLzVHUUlWVQ0KDQpSb2RyaWd1ZXMgVmllaXJhLCBWLiAoMjAxOCkuIFdobyBqb2lucyBjb3VudGVyLWhlZ2Vtb25pYyBJR09zPyBFYXJseSBhbmQgbGF0ZSBtZW1iZXJzIG9mIHRoZSBDaGluYS1sZWQgQXNpYW4gSW5mcmFzdHJ1Y3R1cmUgSW52ZXN0bWVudCBCYW5rLiBSZXNlYXJjaCAmIFBvbGl0aWNzLCA1KDIpDQoNCkNoaW5hIEFsaWdubWVudCBjb3JyZXNwb25kIHRvIHRoZSBhdmVyYWdlIGlkZWFsIHBvaW50IHNjYWxlIChyYW5naW5nIGZyb20gMCB0byAxMDApIG9mIEJhaWxleSBldCBhbC4gKDIwMTUpIGZvciBhIHN0YXRl4oCZcyB2b3RlIHdpdGggQ2hpbmVzZSBwb3NpdGlvbnMgaW4gdGhlIFVuaXRlZCBOYXRpb25zIEdlbmVyYWwgQXNzZW1ibHkgYmV0d2VlbiAxOTkwIGFuZCAyMDA5LCBhIHBlcmlvZCBkdXJpbmcgd2hpY2ggVVMgbGVhZGVyc2hpcCBpbiB3b3JsZCBhZmZhaXJzIHNlZW1lZCByb2J1c3QuIFRoaXMgbWVhc3VyZXMgdGhlIHN0cmVuZ3RoIG9mIGludGVybmF0aW9uYWwgdGllcyB3aXRoIENoaW5hIGluIHBvbGl0aWNhbCB0ZXJtcw0KDQpgYGB7ciBhaWlifQ0KDQphaWliIDwtIHJlYWRfZHRhKCJDOi9Vc2Vycy9QYXVsYS9EZXNrdG9wL0FJSUItRm9yUmVzdWJtaXNzaW9uLmR0YSIpDQogIA0KYWlpYiAlPiUgDQogIHNlbGVjdChjb3VudHJ5LCBjaGluYWFsaWdubWVudCkgJT4lDQogIGFycmFuZ2UoZGVzYyhjaGluYWFsaWdubWVudCkpICU+JSANCiAgZmlsdGVyKGNoaW5hYWxpZ25tZW50ID4gOTAwMCkgJT4lIA0KICBrYmwoKSAlPiUNCiAga2FibGVfcGFwZXIoInN0cmlwZWQiLA0KICAgICAgICAgICAgICBmdWxsX3dpZHRoID0gRikNCg0KYWlpYiAlPiUgDQogICAgZmlsdGVyKGNoaW5hYWxpZ25tZW50ID4gODgwMCkgJT4lIA0KICBnZ3Bsb3QoYWVzKHggPSByZW9yZGVyKGNvdW50cnksIGNoaW5hYWxpZ25tZW50KSwgeSA9IGNoaW5hYWxpZ25tZW50LCBmaWxsID0gY291bnRyeSkpICsgDQogIGdlb21fYmFyKHN0YXQgPSAiaWRlbnRpdHkiKSArIA0KICBjb29yZF9mbGlwKCkgKyBnZ3RoZW1lczo6dGhlbWVfcGFuZGVyKCkgKw0KICB0aGVtZShheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTApLA0KICAgICAgICBheGlzLnRpdGxlLnkgPSBlbGVtZW50X2JsYW5rKCksIA0KICAgICAgICBsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpICsgZ2d0aGVtZXM6OnRoZW1lX3BhbmRlcigpICsNCiAgeWxhYigiVm90aW5nIHNpbWlsYXJpdHkgdG8gQ2hpbmEgKGF2ZXJhZ2UpIikgKw0KICB4bGFiKCJDb3VudHJ5IikgKw0KICBnZ3RoZW1lczo6dGhlbWVfcGFuZGVyKCkgKyB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpICsNCiAgZ2d0aXRsZSgiVG9wIGFsaWduZWQgdG8gQ2hpbmVzZSBVTiB2b3RpbmcgMjAwMCAtIDIwMTQiKSAgDQoNCmFpaWIgJT4lIA0KICAgIGZpbHRlcihjaGluYWFsaWdubWVudCA8IDU1MDApICU+JSANCiAgZ2dwbG90KGFlcyh4ID0gcmVvcmRlcihjb3VudHJ5LCBjaGluYWFsaWdubWVudCksIHkgPSBjaGluYWFsaWdubWVudCwgZmlsbCA9IGNvdW50cnkpKSArIA0KICBnZW9tX2JhcihzdGF0ID0gImlkZW50aXR5IikgKyANCiAgY29vcmRfZmxpcCgpICsgZ2d0aGVtZXM6OnRoZW1lX3BhbmRlcigpICsNCiAgdGhlbWUoYXhpcy50ZXh0LnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEwKSwNCiAgICAgICAgYXhpcy50aXRsZS55ID0gZWxlbWVudF9ibGFuaygpLCANCiAgICAgICAgbGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKSArIGdndGhlbWVzOjp0aGVtZV9wYW5kZXIoKSArDQogIHlsYWIoIlZvdGluZyBzaW1pbGFyaXR5IHRvIENoaW5hIChhdmVyYWdlKSIpICsNCiAgeGxhYigiQ291bnRyeSIpICsNCiAgZ2d0aGVtZXM6OnRoZW1lX3BhbmRlcigpICsgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKSArDQogIGdndGl0bGUoIkxlYXN0IGFsaWduZWQgdG8gQ2hpbmVzZSBVTiB2b3RpbmcgMjAwMCAtIDIwMTQiKSANCg0KYGBgDQoNCmBgYHtyfQ0KDQptYXAgPC0gbmVfY291bnRyaWVzKHNjYWxlID0gIm1lZGl1bSIsIHJldHVybmNsYXNzID0gInNmIikNCg0KYWlpYiRpc28zYyA8LSBjb3VudHJ5Y29kZShhaWliJGNvdW50cnksICJjb3duIiwiaXNvM2MiKQ0KDQptYXBfYWlpYiA8LSBtZXJnZShtYXAsIGFpaWIsIGJ5LnggPSAiYWRtMF9hMyIsIGJ5LnkgPSAid2Jjb2RlIiwgYWxsLnggPSBUUlVFKQ0KDQpWaWV3KG1hcCkNCg0KY29vcmQgPC0gcmVhZF9odG1sKCJodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wdWJsaWMtZGF0YS9kb2NzL2Nhbm9uaWNhbC9jb3VudHJpZXNfY3N2IikNCmNvb3JkX3RhYmxlcyA8LSBjb29yZCAlPiUgaHRtbF90YWJsZShoZWFkZXIgPSBUUlVFLCBmaWxsID0gVFJVRSkNCmNvb3JkeSA8LSBjb29yZF90YWJsZXNbWzFdXQ0KY29sX21hcCA8LSBtZXJnZShtYXBfYWlpYiwgY29vcmR5LCBieS54PSAiaXNvX2EyIiwgYnkueSA9ICJjb3VudHJ5IiwgYWxsLnkgPSBUUlVFKQ0KDQptYXBfYWlpYiAlPiUNCiAgIyBmaWx0ZXIoZ2VvdW5pdCAhPSAiU2lhY2hlbiBHbGFjaWVyIikgJT4lDQogIGZpbHRlcihzdWJyZWdpb24gPT0gIkVhc3Rlcm4gQXNpYSIgfCBzdWJyZWdpb24gPT0gIlNvdXRoLUVhc3Rlcm4gQXNpYSIgfCBzdWJyZWdpb24gPT0gIlNvdXRoZXJuIEFzaWEiKSAlPiUNCiAgZ2dwbG90KCkgKw0KICBnZW9tX3NmKGFlcyhmaWxsID0gY2hpbmFhbGlnbm1lbnQpLA0KICAgICAgICAgICBwb3NpdGlvbiA9ICJpZGVudGl0eSIpICsNCiAgbGFicyhmaWxsPSdSdXNzaWFuIFNwaGVyZScpICsNCiAgIyBnZW9tX2xhYmVsKGFlcyhsb25naXR1ZGUrMSwgbGF0aXR1ZGUrMSwgbGFiZWwgPSBmYWN0b3IoZ2VvdW5pdCkpLCBzaXplID0gMykgKw0KICBnZ3RoZW1lczo6dGhlbWVfbWFwKCkgKw0KICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAiYmxhbmsiKSArDQogIHNjYWxlX2ZpbGxfZGlzdGlsbGVyKHBhbGV0dGUgPSAiUmRCdSIpDQoNCmNvbF9tYXAgJT4lDQpmaWx0ZXIoY29udGluZW50ID09ICJBZnJpY2EiKSAlPiUgICBnZ3Bsb3QoKSArDQogIGdlb21fc2YoYWVzKGZpbGwgPSBjaGluYWFsaWdubWVudCksDQogICAgICAgICAgIHBvc2l0aW9uID0gImlkZW50aXR5IikgKw0KICBsYWJzKGZpbGw9J1J1c3NpYW4gU3BoZXJlJykgKw0KICBnZW9tX2xhYmVsKGFlcyhsb25naXR1ZGUrMSwgbGF0aXR1ZGUrMSwgbGFiZWwgPSBmYWN0b3IoZ2VvdW5pdCkpLCBzaXplID0gMykgKw0KICBnZ3RoZW1lczo6dGhlbWVfbWFwKCkgKw0KICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAiYmxhbmsiKSArDQogIHNjYWxlX2ZpbGxfZGlzdGlsbGVyKHBhbGV0dGUgPSAiUmRCdSIpDQoNCnBseXI6OmNvdW50KG1hcF9haWliJHN1YnJlZ2lvbikNCg0KZXVyb3BlX2Nyb3BwZWQgPC0gc3RfY3JvcChtYXBfYWlpYiwgeG1pbiA9IC0yMCwgeG1heCA9IDQ1LA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeW1pbiA9IDMwLCB5bWF4ID0gNzMpDQoNCmV1cm9wZV9jcm9wcGVkICU+JQ0KICBmaWx0ZXIoc3VicmVnaW9uID09ICJFYXN0ZXJuIEV1cm9wZSIgfCBzdWJyZWdpb24gPT0gIk5vcnRoZXJuIEV1cm9wZSIgfCBzdWJyZWdpb24gPT0gIlNvdXRoZXJuIEV1cm9wZSIgfCBzdWJyZWdpb24gPT0gIldlc3Rlcm4gRXVyb3BlIikgJT4lDQogIGdncGxvdCgpICsNCiAgZ2VvbV9zZihhZXMoZmlsbCA9IGNoaW5hYWxpZ25tZW50KSwNCiAgICAgICAgICAgcG9zaXRpb24gPSAiaWRlbnRpdHkiKSArDQogIGxhYnMoZmlsbD0nUnVzc2lhbiBTcGhlcmUnKSArDQogICMgZ2VvbV9sYWJlbChhZXMobG9uZ2l0dWRlKzEsIGxhdGl0dWRlKzEsIGxhYmVsID0gZmFjdG9yKGdlb3VuaXQpKSwgc2l6ZSA9IDMpICsNCiAgZ2d0aGVtZXM6OnRoZW1lX21hcCgpICsNCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gImJsYW5rIikgKw0KICBzY2FsZV9maWxsX2Rpc3RpbGxlcihwYWxldHRlID0gIlJkQnUiKQ0KDQoNCmBgYA0KDQoNCmBgYHtyfQ0KDQphaWliICU+JSANCiAgZmlsdGVyKGFpaWJtZW1iZXIgPT0gMSkgJT4lIA0KICBzZWxlY3QoY291bnRyeSkgJT4lIA0KICBrYmwoKSAlPiUNCiAga2FibGVfcGFwZXIoInN0cmlwZWQiLA0KICAgICAgICAgICAgICBmdWxsX3dpZHRoID0gRikNCg0KYGBgDQoNCg0KIyBDaGluZXNlIFB1YmxpYyBEaXBsb21hY3kgRWZmb3J0cyBhbmQgQWN0aXZpdGllcw0KDQoNCmBgYHtyIGVjaG8gPSBGQUxTRX0NCg0KY2hpbmFfcGQgPC0gcmVhZC5jc3YoIkM6L1VzZXJzL1BhdWxhL0Rlc2t0b3AvQ2hpbmVzZVB1YmxpY0RpcGxvbWFjeS5jc3YiKQ0KDQpgYGANCg0KDQpgYGB7cn0NCg0Kc292aWV0X2lyb25fY3VydGFpbl92ZWN0b3IgPC0gYygiQWxiYW5pYSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJCdWxnYXJpYSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDemVjaCBSZXB1YmxpYyIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUG9sYW5kIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJLb3Nvdm8iLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlJvbWFuaWEiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkh1bmdhcnkiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiU2xvdmFraWEiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkJvc25pYSBhbmQgSGVyemVnb3ZpbmEiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ3JvYXRpYSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNYWNlZG9uaWEiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk1vbnRlbmVncm8iLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlNlcmJpYSIpDQoNCnNvdmlldF9yZXB1YmxpY3NfdmVjdG9yIDwtIGMoIlJ1c3NpYSIsICJMaXRodWFuaWEiLCAiR2VvcmdpYSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFc3RvbmlhIgksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJMYXR2aWEiCSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlVrcmFpbmUiCSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkJlbGFydXMiCSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk1vbGRvdmEiCSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkt5cmd5enN0YW4iLAkNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlV6YmVraXN0YW4iLAkNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlRhamlraXN0YW4iLAkNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkFybWVuaWEiCSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkF6ZXJiYWlqYW4iLAkNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlR1cmttZW5pc3RhbiIsCQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUnVzc2lhIgksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJLYXpha2hzdGFuIikNCg0KdGhlX2RmICU8PiUNCiAgZHBseXI6Om11dGF0ZShzb3ZpZXRfaXJvbl9jdXJ0YWluID0gaWZlbHNlKGNvdW50cnkueCAlaW4lIHNvdmlldF9pcm9uX2N1cnRhaW5fdmVjdG9yLCAxLCAwKSkgDQoNCnRoZV9kZiAlPD4lDQogIGRwbHlyOjptdXRhdGUoc292aWV0X3JlcHVibGljcyA9IGlmZWxzZShjb3VudHJ5LnggJWluJSBzb3ZpZXRfcmVwdWJsaWNzX3ZlY3RvciwgMSwgMCkpIA0KDQoNCnRoZV9kZiAlPD4lIG11dGF0ZShydXNfaW5mbHVlbmNlID0gaWZlbHNlKGNvdW50cnkueCA9PSAiUnVzc2lhIiwgMSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKHNvdmlldF9yZXB1YmxpY3MgPT0gMSwgMSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShzb3ZpZXRfaXJvbl9jdXJ0YWluID09IDEsIDEsIDApKSkpDQoNCmV1cmFzaWFuX2Rldl9iYW5rIDwtIGMoIlJ1c3NpYSIsICJBcm1lbmlhIiwgIkJlbGFydXMiLCAiS2F6YWtoc3RhbiIsICJLeXJneXN0YW4iLCAiVGFqaWtpc3RhbiIpDQoNCmJyaWNzIDwtIGMoIkJyYXppbCIsICJSdXNzaWEiLCAiSW5kaWEiLCAiQ2hpbmEiLCAiU291dGggQWZyaWNhIikNCg0KcWNjbSA8LSBjKCJDaGluYSIsICJBZmhnYW5pc3RhbiIsICJQYWtpc3RhbiIsICJUYWppa2lzdGFuIikNCg0KZm9ydW1fY2hpbmFfYWZyaWNhX2Nvb3AgPC0gYygiQ2hpbmEiLCAiQWxnZXJpYSIsICJBbmdvbGEiLCAiQmVuaW4iLCAiQm90c3dhbmEiLCAiQnVya2luYSBGYXNvIikNCg0KDQpgYGANCg0KDQpgYGB7ciwgZWNobyA9IEZBTFNFfQ0KIyANCiMgbWFwIDwtIG5lX2NvdW50cmllcyhzY2FsZSA9ICJtZWRpdW0iLCByZXR1cm5jbGFzcyA9ICJzZiIpDQojIA0KIyBtaW5pMTUgPC0gdGhlX2RmW3doaWNoKHRoZV9kZiR5ZWFyID09IDIwMTUpLF0NCiMgDQojIG1hcCRjb3dfY29kZSA8LSBjb3VudHJ5Y29kZShtYXAkbmFtZV9sb25nLCAiY291bnRyeS5uYW1lIiwgImNvd24iKQ0KIyAgDQojIG1hcDE1IDwtIG1lcmdlKG1hcCwgbWluaTE1LCBieSA9ICJjb3dfY29kZSIsIGFsbC54ID0gVFJVRSkNCiMgDQojIHJ1c3NpYV9jcm9wcGVkIDwtIHN0X2Nyb3AobWFwMTUsIHhtaW4gPSAtMjAsIHhtYXggPSAyMDAsDQojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHltaW4gPSAxMCwgeW1heCA9IDE1MCkNCiMgDQojIHJ1c3NpYV9jcm9wcGVkICU+JSANCiMgICBnZ3Bsb3QoKSArDQojICAgZ2VvbV9zZihhZXMoZmlsbCA9IGFzLmZhY3RvcihydXNfaW5mbHVlbmNlKSksIA0KIyAgICAgICAgICAgIHBvc2l0aW9uID0gImlkZW50aXR5IikgKyANCiMgICAgbGFicyhmaWxsPSdSdXNzaWFuIFNwaGVyZScpICsgZ2d0aGVtZXM6OnRoZW1lX21hcCgpICsgDQojICAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gImJsYW5rIikNCg0KbWFwICU+JSANCiAgc2VsZWN0KG5hbWUsIGlzbzNjID0gYnJrX2EzLCBjb250aW5lbnQsIHJlZ2lvbl93YiwgcmVnaW9uX3VuLCBzdWJ1bml0LCBpbmNvbWVfZ3JwLCBnZW9tZXRyeSkgLT4gbXlfbWFwDQoNCg0KDQpgYGANCg0KIyMgTWFraW5nIHZhcmlhYmxlcw0KDQojIyMjIFRyYWRlIG9wZW5uZXNzIGZvcm11bGE6DQoNCnRvdGFsIGV4cG9ydHMgYW5kIHRvdGFsIGltcG9ydHMgLyB0b3RhbCBHRFANCg0KDQojIyMjIFVTIGRlcGVuZGVuY2UgZm9ybXVsYToNCg0KZXhwb3J0cyB0byBVUyBhbmQgaW1wb3J0cyBmcm9tIFVTIC8gdG90YWwgZXhwb3J0cyBhbmQgdG90YWwgaW1wb3J0cw0KDQoNCmBgYHtyIHBlcl9jYXBpdGFfdmFyaWFibGVzfQ0KDQp0aGVfZGYkY291bnRyeSA8LSB0aGVfZGYkY291bnRyeS54DQp0aGVfZGYkY291bnRyeS55IDwtIE5VTEwNCg0KdGhlX2RmICU+JSANCiAgbXV0YXRlKGJ1ZGdldF9wYyA9IGJ1ZGdldCAvIHBvcCwgbmEucm0gPSBUUlVFKSAlPiUNCiAgbXV0YXRlKGV4cG9ydHNfcGMgPSBleHBvcnRzX2JvcCAvIHBvcCwgbmEucm0gPSBUUlVFKSAlPiUgDQogIG11dGF0ZShiYWxhbmNlX3RyYWRlID0gZXhwb3J0c19ib3AgKyBpbXBvcnRzX2JvcCwgbmEucm0gPSBUUlVFKSAlPiUgDQogIG11dGF0ZSh0cmFkZV9vcGVuZXNzID0gYmFsYW5jZV90cmFkZSAvIGdkcF9jb25zdCwgbmEucm0gPSBUUlVFKSAlPiUgDQogIG11dGF0ZSh1c19iYWxhbmNlX3RyYWRlID0gdXNfZXhwb3J0c190b19jb3VudHJ5ICsgdXNfaW1wb3J0c19mcm9tX2NvdW50cnksIG5hLnJtID0gVFJVRSkgJT4lIA0KICBtdXRhdGUodXNfdHJhZGVfZGVwZW5kZW5jZSA9IHVzX2JhbGFuY2VfdHJhZGUgLyBiYWxhbmNlX3RyYWRlLCBuYS5ybSA9IFRSVUUpICU+JSANCiAgbXV0YXRlKHVzX2V4cG9ydHNfcGMgPSB1c19leHBvcnRzX3RvX2NvdW50cnkgLyBwb3AsIG5hLnJtID0gVFJVRSkgJT4lIA0KICBtdXRhdGUobXVzbGltX3BlcmNlbnQgPSBwZXJjZW50X211c2xpbV9qaXR0ZXIgLyBwb3AsIG5hLnJtID0gVFJVRSkgJT4lIA0KICBtdXRhdGUodXNfaW1wb3J0c19wYyA9IHVzX2ltcG9ydHNfZnJvbV9jb3VudHJ5IC8gcG9wLCBuYS5ybSA9IFRSVUUpIC0+IHRoZV9kZg0KDQoNCmBgYA0KDQoNCiMjIFVTIFRyYWRlIERlcGVuZGVuY2UNCg0KYGBge3J9DQoNCnRoZV9kZiAlPiUgDQogIHNlbGVjdChjb3VudHJ5LCB5ZWFyLCB1c190cmFkZV9kZXBlbmRlbmNlKSAlPiUgDQogIGZpbHRlcih1c190cmFkZV9kZXBlbmRlbmNlID4gMC4xKSAlPiUgDQogIGFycmFuZ2UoZGVzYyh1c190cmFkZV9kZXBlbmRlbmNlKSkgJT4lDQogIGZpbHRlcih5ZWFyID09IDIwMTkpICU+JSANCiAgZmlsdGVyKHVzX3RyYWRlX2RlcGVuZGVuY2UgPiAwLjMpICU+JSANCiAga2JsKCkgJT4lDQogIGthYmxlX3BhcGVyKCJzdHJpcGVkIiwNCiAgICAgICAgICAgICAgZnVsbF93aWR0aCA9IEYpDQoNCnRoZV9kZiAlPiUgDQogIGZpbHRlcihnZHBfY29uc3QgPiA1MDAwMDAwMDAwMDApICU+JSANCiAgc2VsZWN0KGNvdW50cnksIHllYXIsIHVzX3RyYWRlX2RlcGVuZGVuY2UpICU+JSANCiAgYXJyYW5nZShkZXNjKHVzX3RyYWRlX2RlcGVuZGVuY2UpKSAlPiUNCiAgIyBmaWx0ZXIodXNfdHJhZGVfZGVwZW5kZW5jZSA+IDAuMikgJT4lIA0KICBnZ3Bsb3QoYWVzKHkgPSB1c190cmFkZV9kZXBlbmRlbmNlLA0KICAgICAgICAgICAgIHggPSByZW9yZGVyKGNvdW50cnksIHVzX3RyYWRlX2RlcGVuZGVuY2UpLCBmaWxsID0gY291bnRyeSkpICsNCiAgY29vcmRfZmxpcCgpICsNCiAgZ2VvbV9oaXN0b2dyYW0oc3RhdCA9ICJpZGVudGl0eSIpICsgZ2d0aGVtZXM6OnRoZW1lX3BhbmRlcigpICsNCiAgZmFjZXRfZ3JpZCh+eWVhciwgc2NhbGVzID0gImZyZWUiKSArIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIikgKyANCiAgZ2d0aXRsZSgiTGV2ZWwgb2YgdHJhZGUgZGVwZW5kZW5jZSBpbiBjb3VudHJpZXMgb3ZlciA1MDAgbWlsbGlvbiBHRFAiKSArIHhsYWIoIiIpICsgeWxhYigiUGVyY2VudGFnZSBvZiB0b3RhbCB0cmFkZSB0aGF0IGlzIHdpdGggVVMiKQ0KDQpgYGANCg0KIyMgRGl2aWRlIGJ1ZGdldCBieSBjb3N0IG9mIGxpdmluZw0KDQpgYGB7cn0NCnVybCA8LSAiaHR0cHM6Ly93d3cubnVtYmVvLmNvbS9jb3N0LW9mLWxpdmluZy9yYW5raW5nc19ieV9jb3VudHJ5LmpzcD90aXRsZT0yMDE5Ig0KDQoNCiMgQ291bnRyaWVzIHdpdGggbm8gSU5ERVgNCg0KDQoNCmNvbF91cmwgPC0gcmVhZF9odG1sKHVybCkNCmNvbF90YWJsZSA8LSBjb2xfdXJsICU+JSBodG1sX3RhYmxlKGhlYWRlciA9IFRSVUUsIGZpbGwgPSBUUlVFKQ0KY29sXzE5IDwtIGNvbF90YWJsZVtbMl1dDQoNCmNvbF8xOSR5ZWFyIDwtIHJlcGxpY2F0ZSgxMTksIDIwMTkpDQpjb2xfMTkkcmFuayA8LSBOVUxMDQpjb2xfMTkgJTw+JSANCiAgY2xlYW5fbmFtZXMoKQ0KDQpjb2xfMTkkY293X2NvZGUgPC0gY291bnRyeWNvZGUoY29sXzE5JGNvdW50cnksICJjb3VudHJ5Lm5hbWUiLCAiY293biIpDQoNCmNvbF8xOSAlPD4lIGRwbHlyOjptdXRhdGUoY293X2NvZGUgPSBpZmVsc2UoY291bnRyeSA9PSAiUGFsZXN0aW5lIiwgNjY2NiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGNvdW50cnkgPT0gIlNlcmJpYSIsIDM0NSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoY291bnRyeSA9PSAiSG9uZyBLb25nIiwgOTk3LCBjb3dfY29kZSkpKSkNCg0KY29sXzE5ICU+JSANCiAgYXJyYW5nZShkZXNjKGNvc3Rfb2ZfbGl2aW5nX2luZGV4KSkgJT4lIA0KICBmaWx0ZXIoY29zdF9vZl9saXZpbmdfaW5kZXggPiA2NSkgJT4lIA0KICBoZWFkKCkgJT4lIA0KICBrYmwoKSAlPiUNCiAga2FibGVfcGFwZXIoInN0cmlwZWQiLA0KICAgICAgICAgICAgICBmdWxsX3dpZHRoID0gRikNCg0KDQpgYGANCg0KDQojIEV4YW1pbmluZyAyMDE5IGNvc3Qgb2YgbGl2aW5nIGFkanVzdG1lbnQNCg0KYGBge3J9DQoNCiMgZGZfMTkgPC0gdGhlX2RmICU+JSANCiMgICBmaWx0ZXIoeWVhciA9PSAyMDE5KQ0KIyANCiMgDQojIGRmXzE5IDwtIG1lcmdlKGRmXzE5LCBjb2xfMTksIGJ5ID0gYygiY293X2NvZGUiKSwgYWxsLnggPSBUUlVFKQ0KIyANCiMgb3B0aW9ucyhzY2lwZW4gPSA5OTkpDQojIA0KIyANCiMgDQojIGRmXzE5ICU+JSAgDQojICAgIyBtdXRhdGUoY29zdF9saXZpbmdfcGVyY2VudCA9IGNvc3Rfb2ZfbGl2aW5nX2luZGV4IC8gMTAwLCBuYS5ybSA9IFRSVUUpICU+JSANCiMgICBtdXRhdGUoYWRqX2J1ZGdldCA9IGJ1ZGdldCAvIGNvc3Rfb2ZfbGl2aW5nX2luZGV4KSAlPiUgDQojICAgc2VsZWN0KGNvdW50cnkgPSBjb3VudHJ5LngsIGFkal9idWRnZXQsIGJ1ZGdldCkgJT4lIA0KIyAgIGFycmFuZ2UoZGVzYyhhZGpfYnVkZ2V0KSkgLT4gdDENCiMgDQojIGRmXzE5ICU+JSAgDQojICAgIyBtdXRhdGUoY29zdF9saXZpbmdfcGVyY2VudCA9IGNvc3Rfb2ZfbGl2aW5nX2luZGV4IC8gMTAwLCBuYS5ybSA9IFRSVUUpICU+JSANCiMgICBtdXRhdGUoYWRqX2J1ZGdldCA9IGJ1ZGdldCAvIGNvc3Rfb2ZfbGl2aW5nX2luZGV4KSAlPiUgDQojICAgc2VsZWN0KGNvdW50cnkgPSBjb3VudHJ5LngsIGJ1ZGdldCwgYWRqX2J1ZGdldCkgJT4lIA0KIyAgIGFycmFuZ2UoZGVzYyhidWRnZXQpKSAtPiB0Mg0KIyANCiMga2JsKGxpc3QodDEsIHQyKSwgZGlnaXRzID0gMCwgY2FwdGlvbiA9ICJBcnJhbmdlZCBCeSBBZGp1c3RlZCBCdWRnZXQgTEVGVCBhbmQgQnkgUmF3IEJ1ZGdldCBSSUdIVCIpICU+JQ0KIyAgICBrYWJsZV9wYXBlcigic3RyaXBlZCIsDQojICAgICAgICAgICAgICAgIGZ1bGxfd2lkdGggPSBUKQ0KDQpgYGANCg0KIyBQdXJjaGFzZSBQb3dlciBQYXJpdHkNCiANClNvdXJjZTogaHR0cHM6Ly9kYXRhLndvcmxkYmFuay5vcmcvaW5kaWNhdG9yL1BBLk5VUy5QUFBDLlJGDQoNClByaWNlIGxldmVsIHJhdGlvIGlzIHRoZSByYXRpbyBvZiBhIHB1cmNoYXNpbmcgcG93ZXIgcGFyaXR5IChQUFApIGNvbnZlcnNpb24gZmFjdG9yIHRvIGFuIGV4Y2hhbmdlIHJhdGUuIEl0IHByb3ZpZGVzIGEgbWVhc3VyZSBvZiB0aGUgZGlmZmVyZW5jZXMgaW4gcHJpY2UgbGV2ZWxzIGJldHdlZW4gY291bnRyaWVzIGJ5IGluZGljYXRpbmcgdGhlIG51bWJlciBvZiB1bml0cyBvZiB0aGUgY29tbW9uIGN1cnJlbmN5IG5lZWRlZCB0byBidXkgdGhlIHNhbWUgdm9sdW1lIG9mIHRoZSBhZ2dyZWdhdGlvbiBsZXZlbCBpbiBlYWNoIGNvdW50cnkuDQoNCkluZGljYXRvciBzb3VyY2U6IA0KSW50ZXJuYXRpb25hbCBDb21wYXJpc29uIFByb2dyYW0sIFdvcmxkIEJhbmsNCg0KDQpgYGB7cn0NCiMgDQojIGxpYnJhcnkoV0RJKQ0KIyANCiMgcHBwID0gV0RJKGluZGljYXRvcj0nUEEuTlVTLlBQUEMuUkYnLCBjb3VudHJ5PSJhbGwiLCBzdGFydD0yMDE5LCBlbmQ9MjAxOSkNCiMgcHBwJHBwcCA8LSBwcHAkUEEuTlVTLlBQUEMuUkYNCiMgcHBwJFBBLk5VUy5QUFBDLlJGIDwtIE5VTEwNCiMgDQojIFZpZXcocHBwKQ0KIyANCiMgcHBwJGNvd19jb2RlIDwtIGNvdW50cnljb2RlKHBwcCRpc28yYywgImlzbzJjIiwgImNvd24iKQ0KIyANCiMgcHBwICU8PiUgDQojIGRwbHlyOjptdXRhdGUoY293X2NvZGUgPSBpZmVsc2UoY291bnRyeSA9PSAiV2VzdCBCYW5rIGFuZCBHYXphIiwgNjY2NiwgDQojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGNvdW50cnkgPT0gIlNlcmJpYSIsIDM0NSwgDQojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShjb3VudHJ5ID09ICJIb25nIEtvbmcgU0FSLCBDaGluYSIsIDk5NywgY293X2NvZGUpKSkpDQojIA0KIyBwcHAkY291bnRyeSA8LSBOVUxMDQojIA0KIyANCiMgdHJ5ICU8PiUgIA0KIyAgIGZpbHRlcighaXMubmEoY293X2NvZGUpKSAlPiUgDQojICAgbXV0YXRlKHBwcF9idWRnZXRfZGl2ID0gYnVkZ2V0IC8gcHBwKSAlPiUgDQojICAgbXV0YXRlKHBwcF9idWRnZXRfbXVsID0gYnVkZ2V0ICogcHBwKSAlPiUgDQojICAgZmlsdGVyKGNvdW50cnkueCAhPSAiS29zb3ZvIikgJT4lIA0KIyAgIHNlbGVjdChjb3VudHJ5LngsIGJ1ZGdldCwgcHBwLCBjb3dfY29kZSwgcHBwX2J1ZGdldF9kaXYscHBwX2J1ZGdldF9tdWwgKSAtPiBoaQ0KIyANCiMgVmlldyhoaSkNCiMgDQojIHRyeSAlPiUgDQojICAgZ3JvdXBfYnkoY291bnRyeS54KSAlPiUgDQojICAgbXV0YXRlKHBwcF9idWRnZXQgPSBidWRnZXQgLyBwcHApICU+JSANCiMgICBzZWxlY3QoY291bnRyeSA9IGNvdW50cnkueCwgcHBwX2J1ZGdldCwgcmF3X2J1ZGdldCA9IGJ1ZGdldCkgJT4lIA0KIyAgIGFycmFuZ2UoZGVzYyhwcHBfYnVkZ2V0KSkgLT4gdDMgDQojIA0KIyB0cnkgJT4lIA0KIyAgIGdyb3VwX2J5KGNvdW50cnkueCkgJT4lIA0KIyAgIG11dGF0ZShwcHBfYnVkZ2V0ID0gYnVkZ2V0IC8gcHBwKSAlPiUgDQojICAgc2VsZWN0KGNvdW50cnkueCwgcmF3X2J1ZGdldCA9IGJ1ZGdldCwgcHBwX2J1ZGdldCkgJT4lIA0KIyAgIGFycmFuZ2UoZGVzYyhyYXdfYnVkZ2V0KSkgLT4gdDQNCiMgDQojIGtibChsaXN0KHQzLCB0NCksIGRpZ2l0cyA9IDAsIGNhcHRpb24gPSAiQXJyYW5nZWQgQnkgUFBQIEFkanVzdGVkIEJ1ZGdldCBMRUZUIGFuZCBCeSBQUFAgUmF3IEJ1ZGdldCBSSUdIVCIpICU+JQ0KIyAgICBrYWJsZV9wYXBlcigic3RyaXBlZCIsDQojICAgICAgICAgICAgICAgIGZ1bGxfd2lkdGggPSBUKQ0KDQpgYGANCg0KYGBge3J9DQoNCiMgY29sICU8PiUgDQojICAgc2VsZWN0KGNvd19jb2RlLCB5ZWFyLCBldmVyeXRoaW5nKCkpIA0KIyANCiMgDQojIHVybCA8LSAiaHR0cHM6Ly93d3cubnVtYmVvLmNvbS9jb3N0LW9mLWxpdmluZy9yYW5raW5nc19ieV9jb3VudHJ5LmpzcD90aXRsZT0yMDE4Ig0KIyANCiMgY29sX3VybCA8LSByZWFkX2h0bWwodXJsKQ0KIyBjb2xfdGFibGUgPC0gY29sX3VybCAlPiUgaHRtbF90YWJsZShoZWFkZXIgPSBUUlVFLCBmaWxsID0gVFJVRSkNCiMgY29sXzE4IDwtIGNvbF90YWJsZVtbMl1dDQojIA0KIyBjb2xfMTgkeWVhciA8LSByZXBsaWNhdGUoMTE1LCAyMDE4KQ0KIyANCiMgY29sXzE4ICU8PiUgDQojICAgY2xlYW5fbmFtZXMoKQ0KIyANCiMgY29sXzE4JGNvd19jb2RlIDwtIGNvdW50cnljb2RlKGNvbF8xOCRjb3VudHJ5LCAiY291bnRyeS5uYW1lIiwgImNvd24iKQ0KIyAjIFNvbWUgdmFsdWVzIHdlcmUgbm90IG1hdGNoZWQgdW5hbWJpZ3VvdXNseTogQmVybXVkYSwgSG9uZyBLb25nLCBKZXJzZXksIE1hY2FvLCBQYWxlc3RpbmUsIFB1ZXJ0byBSaWNvLCBTZXJiaWENCiMgDQojIGNvbF8xOCAlPD4lIGRwbHlyOjptdXRhdGUoY293X2NvZGUgPSBpZmVsc2UoY291bnRyeSA9PSAiUGFsZXN0aW5lIiwgNjY2NiwgDQojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoY291bnRyeSA9PSAiU2VyYmlhIiwgMzQ1LCANCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGNvdW50cnkgPT0gIkhvbmcgS29uZyIsIDk5NywgY293X2NvZGUpKSkpDQojIGNvbCAlPD4lIA0KIyAgIHNlbGVjdChjb3dfY29kZSwgeWVhciwgZXZlcnl0aGluZygpKSANCg0KYGBgDQoNCg0KDQojIyBBZGp1c3QgcHJpY2VzIHRvIDIwMTQgcHJpY2VzDQoNCmBgYHtyIG1lc3NhZ2UgPSBGQUxTRSwgd2FybmluZyA9IEZBTFNFfQ0KDQpjb3VudHJ5IDwtICJVbml0ZWQgU3RhdGVzIg0KY291bnRyaWVzX2RhdGFmcmFtZSA8LSBzaG93X2NvdW50cmllcygpDQppbmZsYXRpb25fZGF0YWZyYW1lIDwtIHJldHJpZXZlX2luZmxhdGlvbl9kYXRhKGNvdW50cnksIGNvdW50cmllc19kYXRhZnJhbWUpDQoNCiMgUHJvdmlkZSBhIFdvcmxkIEJhbmsgQVBJIFVSTCBhbmQgYHVybF9hbGxfcmVzdWx0c2Agd2lsbCBjb252ZXJ0IGl0IGludG8gb25lIHdpdGggYWxsIHJlc3VsdHMgZm9yIHRoYXQgaW5kaWNhdG9yDQpvcmlnaW5hbF91cmwgPC0gImh0dHA6Ly9hcGkud29ybGRiYW5rLm9yZy92Mi9jb3VudHJ5IiANCg0KIyAiaHR0cDovL2FwaS53b3JsZGJhbmsub3JnL3YyL2NvdW50cnk/Zm9ybWF0PWpzb24mcGVyX3BhZ2U9MzA0Ig0KdXJsX2FsbF9yZXN1bHRzKG9yaWdpbmFsX3VybCkNCg0KdGhlX2RmJGJ1ZGdldF9jb25zdCA8LSBhZGp1c3RfZm9yX2luZmxhdGlvbih0aGVfZGYkYnVkZ2V0LCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZV9kZiR5ZWFyLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50cnksIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9fZGF0ZSA9IDIwMTQsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZsYXRpb25fZGF0YWZyYW1lID0gaW5mbGF0aW9uX2RhdGFmcmFtZSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50cmllc19kYXRhZnJhbWUgPSBjb3VudHJpZXNfZGF0YWZyYW1lKQ0KDQp0aGVfZGYkYnVkZ2V0X3BjX2NvbnN0IDwtIGFkanVzdF9mb3JfaW5mbGF0aW9uKHRoZV9kZiRidWRnZXRfcGMsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZV9kZiR5ZWFyLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50cnksIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9fZGF0ZSA9IDIwMTQsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZsYXRpb25fZGF0YWZyYW1lID0gaW5mbGF0aW9uX2RhdGFmcmFtZSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50cmllc19kYXRhZnJhbWUgPSBjb3VudHJpZXNfZGF0YWZyYW1lKQ0KDQoNCmBgYA0KDQojIyBFY29ub21pYyBmYWN0b3JzIA0KDQojIyMgUEQgQnVkZ2V0IHBlciBjYXBpdGEgYW5kIFVTIGV4cG9ydHMgcGVyIGNhcGl0YSB0byB0aGUgY291bnRyeQ0KDQojIyMjIEFjcm9zcyB0aGUgeWVhcnMNCg0KYGBge3J9DQoNCnRoZV9kZiAlPiUNCiAgIyBmaWx0ZXIocG9wID4gMTAwMDAwMCkgJT4lIA0KICBnZ3Bsb3QoYWVzKHkgPSBsb2coYnVkZ2V0X2NvbnN0KSwgeCA9IGxvZyh1c19leHBvcnRzX3BjKSkpICsgDQogICAgZ2VvbV9zbW9vdGgobWV0aG9kID0gImxtIiwgY29sb3IgPSAiIzlkMDIwOCIsIHNlID0gRkFMU0UpICsNCiAgZ2VvbV9wb2ludChhZXMoY29sb3IgPSBhcy5mYWN0b3IocmVnaW9uXzYpLCBzaGFwZSA9IGFzLmZhY3RvcihyZWdpb25fNikpKSArIGZhY2V0X3dyYXAofnllYXIpICsgDQogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBjKCIjMjE5ZWJjIiwgIiMyNjQ2NTMiLCAiIzQzYWE4YiIsICIjNmQ1OTdhIiwgIiNlNjM5NDYiLCAiI2Y0YTI2MSIpLA0KICAgICAgICAgICAgICAgICAgIG5hbWUgPSBOVUxMKSArDQogIHNjYWxlX3NoYXBlX21hbnVhbCh2YWx1ZXMgPSBjKDE1LDE2LDE3LDE4LDE5LDEwKSwNCiAgICAgICAgICAgICAgICAgICAgIG5hbWUgPSBOVUxMKSArDQogIGdndGl0bGUoIkV4cG9ydHMgZnJvbSBVUyBwZXIgY2FwaXRhIHZzIFBEIGJ1ZGdldCBwZXIgY2FwaXRhIikgKyANCiAgeGxhYigiTG9nZ2VkIFVTIGV4cG9ydHMgcGVyIGNhcGl0YSIpICsNCiAgeWxhYigiTG9nZ2VkIFBEIGJ1ZGdldCBwZXIgY2FwaXRhIikgKyANCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gImxlZnQiKSArIGdndGhlbWVzOjp0aGVtZV9wYW5kZXIoKQ0KDQpgYGANCg0KDQoNCiMjIyMgT25seSBmb3IgMjAxOQ0KDQpgYGB7cn0NCg0KdGhlX2RmICU+JQ0KICAjIGZpbHRlcihwb3AgPiAxMDAwMDAwKSAlPiUgDQogIGZpbHRlcih5ZWFyID09IDIwMTgpICU+JSANCiAgZ2dwbG90KGFlcyh5ID0gbG9nKGJ1ZGdldF9jb25zdCksIHggPSBsb2codXNfZXhwb3J0c19wYyksIGdyb3VwID0gYXMuZmFjdG9yKHJlZ2lvbl82KSkpICsgDQogIGdlb21fc21vb3RoKG1ldGhvZCA9ICJsbSIsIGNvbG9yID0gIiM5ZDAyMDgiLCBzZSA9IEZBTFNFKSArDQogIGdlb21fcG9pbnQoYWVzKGNvbG9yID0gYXMuZmFjdG9yKHJlZ2lvbl82KSwgc2hhcGUgPSBhcy5mYWN0b3IocmVnaW9uXzYpKSkgKyANCiAgZmFjZXRfd3JhcCh+cmVnaW9uXzYpICsgDQogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBjKCIjMjE5ZWJjIiwgIiMyNjQ2NTMiLCAiIzQzYWE4YiIsICIjNmQ1OTdhIiwgIiNlNjM5NDYiLCAiI2Y0YTI2MSIpLA0KICAgICAgICAgICAgICAgICAgIG5hbWUgPSBOVUxMKSArDQogIHNjYWxlX3NoYXBlX21hbnVhbCh2YWx1ZXMgPSBjKDE1LDE2LDE3LDE4LDE5LDEwKSwNCiAgICAgICAgICAgICAgICAgICAgIG5hbWUgPSBOVUxMKSArDQogIGdndGl0bGUoIkV4cG9ydHMgcGVyIGNhcGl0YSB2cyBQRCBidWRnZXQgcGVyIGNhcGl0YSBpbiAyMDE5IikgKyANCiAgeGxhYigiTG9nZ2VkIFVTIGV4cG9ydHMgcGVyIGNhcGl0YSIpICsNCiAgeWxhYigiTG9nZ2VkIFBEIGJ1ZGdldCBwZXIgY2FwaXRhIikgKyANCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gImxlZnQiKSArIGdndGhlbWVzOjp0aGVtZV9wYW5kZXIoKQ0KDQpgYGANCg0KIyBUcmFkZSBvcGVubmVzcw0KDQpUb3RhbCBleHBvcnQgYW5kIHRvdGFsIGltcG9ydHMgZGl2aWRlZCBieSB0b3RhbCBHRFANCg0KIyMgQWNyb3NzIHRoZSB5ZWFycw0KDQpgYGB7cn0NCg0KdGhlX2RmICU+JQ0KICAjIGZpbHRlcihwb3AgPiAxMDAwMDAwKSAlPiUgDQogIGdncGxvdChhZXMoeSA9IGxvZyhidWRnZXRfY29uc3QpLCB4ID1sb2codHJhZGVfb3BlbmVzcykpKSArIA0KICBnZW9tX3Ntb290aChtZXRob2QgPSAibG0iLCBjb2xvciA9ICIjOWQwMjA4Iiwgc2UgPSBGQUxTRSkgKw0KICBnZW9tX3BvaW50KGFlcyhjb2xvciA9IGFzLmZhY3RvcihyZWdpb25fNiksIHNoYXBlID0gYXMuZmFjdG9yKHJlZ2lvbl82KSkpICsgZmFjZXRfd3JhcCh+eWVhcikgKyANCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IGMoIiMyMTllYmMiLCAiIzI2NDY1MyIsICIjNDNhYThiIiwgIiM2ZDU5N2EiLCAiI2U2Mzk0NiIsICIjZjRhMjYxIiksDQogICAgICAgICAgICAgICAgICAgbmFtZSA9IE5VTEwpICsNCiAgc2NhbGVfc2hhcGVfbWFudWFsKHZhbHVlcyA9IGMoMTUsMTYsMTcsMTgsMTksMTApLA0KICAgICAgICAgICAgICAgICAgICAgbmFtZSA9IE5VTEwpICsNCiAgZ2d0aXRsZSgiVHJhZGUgb3BlbmVzcyB2cyBQRCBidWRnZXQgcGVyIGNhcGl0YSIpICsgDQogIHhsYWIoIlRyYWRlIG9wZW5lc3MiKSArDQogIHlsYWIoIkxvZ2dlZCBQRCBidWRnZXQgcGVyIGNhcGl0YSIpICsgDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJsZWZ0IikgKyANCiAgZ2d0aGVtZXM6OnRoZW1lX3BhbmRlcigpDQoNCmBgYA0KDQojIyMgT25seSBmb3IgMjAxOQ0KDQpgYGB7cn0NCg0KdGhlX2RmICU+JQ0KICBmaWx0ZXIoeWVhciA9PSAyMDE5KSAlPiUgDQogIGdncGxvdChhZXMoeSA9IGxvZyhidWRnZXRfY29uc3QpLCB4ID0gbG9nKHRyYWRlX29wZW5lc3MpKSkgKw0KICBnZW9tX3Ntb290aChtZXRob2QgPSAibG0iLCBjb2xvciA9ICIjOWQwMjA4Iiwgc2UgPSBGQUxTRSkgKw0KICAjIGdlb21fdGV4dChhZXMobGFiZWwgPSBjb3VudHJ5LCBjb2xvciA9IGFzLmZhY3RvcihyZWdpb25fNikpLCBzaXplID0gMykgKw0KICBnZW9tX3BvaW50KGFlcyhjb2xvciA9IGFzLmZhY3RvcihyZWdpb25fNiksIHNoYXBlID0gYXMuZmFjdG9yKHJlZ2lvbl82KSkpICsgDQogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBjKCIjMjE5ZWJjIiwgIiMyNjQ2NTMiLCAiIzQzYWE4YiIsICIjNmQ1OTdhIiwgIiNlNjM5NDYiLCAiI2Y0YTI2MSIpLA0KICAgICAgICAgICAgICAgICAgIG5hbWUgPSBOVUxMKSArDQogIHNjYWxlX3NoYXBlX21hbnVhbCh2YWx1ZXMgPSBjKDE1LDE2LDE3LDE4LDE5LDEwKSwNCiAgICAgICAgICAgICAgICAgICAgIG5hbWUgPSBOVUxMKSArDQogIGdndGl0bGUoIlRyYWRlIG9wZW5lc3MgdnMgUEQgYnVkZ2V0IHBlciBjYXBpdGEgaW4gMjAxOSIpICsNCiAgZmFjZXRfd3JhcCh+cmVnaW9uXzYpICsgDQogIHhsYWIoIlRyYWRlIG9wZW5uZXNzIikgKw0KICB5bGFiKCJMb2dnZWQgUEQgYnVkZ2V0IHBlciBjYXBpdGEiKSArIA0KICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibGVmdCIpICsgZ2d0aGVtZXM6OnRoZW1lX3BhbmRlcigpDQoNCmBgYA0KDQoNCiMgSW5mYW50IG1vcnRhbGl0eQ0KDQpJbmZhbnQgbW9ydGFsaXR5IGlzIGEgcHJveHkgZm9yIHBvdmVydHkgbGV2ZWxzOiBudW1iZXIgb2YgaW5mYW50IGRlYXRocyBwZXIgdGhvdXNhbmQgbGl2ZSBiaXJ0aHMNCg0KIyMjIEFjcm9zcyB0aGUgeWVhcnMNCg0KYGBge3J9DQoNCnRoZV9kZiAlPiUNCiAgIyBmaWx0ZXIocG9wID4gMTAwMDAwMCkgJT4lIA0KICBmaWx0ZXIoeWVhciA8IDIwMTgpICU+JSANCiAgZ2dwbG90KGFlcyh5ID0gbG9nKGJ1ZGdldF9jb25zdCksIHggPSBsb2coaW5mYW50X21vcnQpLCBncm91cCA9IGFzLmZhY3RvcihyZWdpb25fNikpKSArIA0KICBnZW9tX3BvaW50KGFlcyhjb2xvciA9IGFzLmZhY3RvcihyZWdpb25fNiksIHNoYXBlID0gYXMuZmFjdG9yKHJlZ2lvbl82KSkpICsgZmFjZXRfd3JhcCh+eWVhcikgKyANCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IGMoIiMyMTllYmMiLCAiIzI2NDY1MyIsICIjNDNhYThiIiwgIiM2ZDU5N2EiLCAiI2U2Mzk0NiIsICIjZjRhMjYxIiksDQogICAgICAgICAgICAgICAgICAgbmFtZSA9IE5VTEwpICsNCiAgc2NhbGVfc2hhcGVfbWFudWFsKHZhbHVlcyA9IGMoMTUsMTYsMTcsMTgsMTksMTApLA0KICAgICAgICAgICAgICAgICAgICAgbmFtZSA9IE5VTEwpICsNCiAgZ2d0aXRsZSgiSW5mYW50IG1vcnRhbGl0eSBhZ2UgdnMgUEQgYnVkZ2V0IHBlciBjYXBpdGEiKSArIA0KICB4bGFiKCJEZWF0aHMgcGVyIHRob3VzYW5kIHVuZGVyIDUiKSArDQogIHlsYWIoIkxvZ2dlZCBQRCBidWRnZXQgcGVyIGNhcGl0YSIpICsgDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJsZWZ0IikgKyBnZ3RoZW1lczo6dGhlbWVfcGFuZGVyKCkNCg0KYGBgDQoNCiMjIyBPbmx5IGZvciAyMDE5DQoNCmBgYHtyfQ0KDQp0aGVfZGYgJT4lDQogIGZpbHRlcih5ZWFyID09IDIwMTUpICU+JSANCiAgZ2dwbG90KGFlcyh5ID0gbG9nKGJ1ZGdldF9jb25zdCksIHggPSBpbmZhbnRfbW9ydCwgZ3JvdXAgPSBhcy5mYWN0b3IocmVnaW9uXzYpKSkgKyANCiAgZ2VvbV9zbW9vdGgobWV0aG9kID0gImxtIiwgY29sb3IgPSAiIzlkMDIwOCIsIHNlID0gRkFMU0UpICsNCiAgZ2VvbV9wb2ludChhZXMoY29sb3IgPSBhcy5mYWN0b3IocmVnaW9uXzYpLCBzaGFwZSA9IGFzLmZhY3RvcihyZWdpb25fNikpKSArDQogIGZhY2V0X3dyYXAofnJlZ2lvbl82KSArIA0KICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gYygiIzIxOWViYyIsICIjMjY0NjUzIiwgIiM0M2FhOGIiLCAiIzZkNTk3YSIsICIjZTYzOTQ2IiwgIiNmNGEyNjEiKSwNCiAgICAgICAgICAgICAgICAgICBuYW1lID0gTlVMTCkgKw0KICBzY2FsZV9zaGFwZV9tYW51YWwodmFsdWVzID0gYygxNSwxNiwxNywxOCwxOSwxMCksDQogICAgICAgICAgICAgICAgICAgICBuYW1lID0gTlVMTCkgKw0KICBnZ3RpdGxlKCJJbmZhbnQgbW9ydGFsaXR5IHZzIFBEIGJ1ZGdldCBwZXIgY2FwaXRhIGluIDIwMTkiKSArIA0KICB4bGFiKCJJbmZhbnQgbW9ydGFsaXR5IikgKw0KICB5bGFiKCJMb2dnZWQgUEQgYnVkZ2V0IHBlciBjYXBpdGEiKSArIA0KICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibGVmdCIpICsgZ2d0aGVtZXM6OnRoZW1lX3BhbmRlcigpDQoNCmBgYA0KDQoNCg0KIyBHRFAgcGVyIGNhcGl0YQ0KDQojIyMgQWNyb3NzIHRoZSB5ZWFycw0KDQpgYGB7cn0NCg0KdGhlX2RmICU+JQ0KICBnZ3Bsb3QoYWVzKHkgPSBsb2coYnVkZ2V0X2NvbnN0KSwgeCA9IGxvZyhnZHBfcGNfY29uc3QpLCBncm91cCA9IGFzLmZhY3RvcihyZWdpb25fNikpKSArIA0KICBnZW9tX3BvaW50KGFlcyhjb2xvciA9IGFzLmZhY3RvcihyZWdpb25fNiksIHNoYXBlID0gYXMuZmFjdG9yKHJlZ2lvbl82KSkpICsgZmFjZXRfd3JhcCh+eWVhcikgKyANCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IGMoIiMyMTllYmMiLCAiIzI2NDY1MyIsICIjNDNhYThiIiwgIiM2ZDU5N2EiLCAiI2U2Mzk0NiIsICIjZjRhMjYxIiksDQogICAgICAgICAgICAgICAgICAgbmFtZSA9IE5VTEwpICsNCiAgc2NhbGVfc2hhcGVfbWFudWFsKHZhbHVlcyA9IGMoMTUsMTYsMTcsMTgsMTksMTApLA0KICAgICAgICAgICAgICAgICAgICAgbmFtZSA9IE5VTEwpICsNCiAgZ2d0aXRsZSgiTG9nZ2VkIEdEUCBwZXIgY2FwaXRhIGFuZCBsb2dnZWQgUEQgYnVkZ2V0IHBlciBjYXBpdGEiKSArIA0KICB4bGFiKCJMb2dnZWQgR0RQIHBlciBjYXBpdGEiKSArDQogIHlsYWIoIkxvZ2dlZCBQRCBidWRnZXQgcGVyIGNhcGl0YSIpICsgDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJsZWZ0IikgKyBnZ3RoZW1lczo6dGhlbWVfcGFuZGVyKCkNCg0KYGBgDQoNCiMjIyBPbmx5IGZvciAyMDE5DQoNCmBgYHtyfQ0KDQp0aGVfZGYgJT4lDQogIGZpbHRlcih5ZWFyID09IDIwMTkpICU+JSANCiAgZ2dwbG90KGFlcyh5ID0gbG9nKGJ1ZGdldF9jb25zdCksIHggPSBsb2coZ2RwX3BjX2NvbnN0KSwgZ3JvdXAgPSBhcy5mYWN0b3IocmVnaW9uXzYpKSkgKyANCiAgZ2VvbV9zbW9vdGgobWV0aG9kID0gImxtIiwgY29sb3IgPSAiIzlkMDIwOCIsIHNlID0gRkFMU0UpICsNCiAgZ2VvbV9wb2ludChhZXMoY29sb3IgPSBhcy5mYWN0b3IocmVnaW9uXzYpLCBzaGFwZSA9IGFzLmZhY3RvcihyZWdpb25fNikpKSArIA0KICBmYWNldF93cmFwKH5yZWdpb25fNikgKyANCnNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBjKCIjMjE5ZWJjIiwgIiMyNjQ2NTMiLCAiIzQzYWE4YiIsICIjNmQ1OTdhIiwgIiNlNjM5NDYiLCAiI2Y0YTI2MSIpLA0KICAgICAgICAgICAgICAgICAgIG5hbWUgPSBOVUxMKSArDQogIHNjYWxlX3NoYXBlX21hbnVhbCh2YWx1ZXMgPSBjKDE1LDE2LDE3LDE4LDE5LDEwKSwNCiAgICAgICAgICAgICAgICAgICAgIG5hbWUgPSBOVUxMKSArDQogIGdndGl0bGUoIkdEUCBwZXIgY2FwaXRhIHZzIFBEIGJ1ZGdldCBwZXIgY2FwaXRhIGluIDIwMTkiKSArIA0KICB5bGFiKCJMb2dnZWQgR0RQIHBlciBjYXBpdGEiKSArDQogIHhsYWIoIkxvZ2dlZCBQRCBidWRnZXQgcGVyIGNhcGl0YSIpICsgDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJsZWZ0IikgKyBnZ3RoZW1lczo6dGhlbWVfcGFuZGVyKCkNCg0KYGBgDQoNCg0KIyBQb2xpdHkgSW5kZXgNCg0KIyMjIEFjcm9zcyB0aGUgeWVhcnMNCg0KRXZpZGVuY2Ugb2YgYSBVIHNoYXBlZCByZWxhdGlvbnNoaXA/IE1vcmUgcHJvbm91bmNlZCBhcyB5ZWFycyBnbyBvbi4NCg0KYGBge3J9DQoNCnRoZV9kZiAlPiUNCiAgZmlsdGVyKHBvcCA+IDEwMDAwMDApICU+JSANCiAgZ2dwbG90KGFlcyh5ID0gbG9nKGJ1ZGdldF9wYyksIHggPSBlbGVjdG9yYWxfZGVtbykpICsgDQogICAgZ2VvbV9zbW9vdGgobWV0aG9kID0gImxtIiwgY29sb3IgPSAiIzlkMDIwOCIpICsNCiAgZ2VvbV9wb2ludChhZXMoY29sb3IgPSBhcy5mYWN0b3IocmVnaW9uXzYpLCBzaGFwZSA9IGFzLmZhY3RvcihyZWdpb25fNikpKSArDQogIGZhY2V0X3dyYXAofnllYXIpICsgDQogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBjKCIjMjE5ZWJjIiwgIiMyNjQ2NTMiLCAiIzQzYWE4YiIsICIjNmQ1OTdhIiwgIiNlNjM5NDYiLCAiI2Y0YTI2MSIpLA0KICAgICAgICAgICAgICAgICAgIG5hbWUgPSBOVUxMKSArDQogIHNjYWxlX3NoYXBlX21hbnVhbCh2YWx1ZXMgPSBjKDE1LDE2LDE3LDE4LDE5LDEwKSwNCiAgICAgICAgICAgICAgICAgICAgIG5hbWUgPSBOVUxMKSArDQogIGdndGl0bGUoIlBvbGl0eSBTY29yZSB2cyBQRCBidWRnZXQgcGVyIGNhcGl0YSIpICsgDQogIHhsYWIoIlBvbGl0eSBTY29yZSIpICsNCiAgeWxhYigiTG9nZ2VkIFBEIGJ1ZGdldCBwZXIgY2FwaXRhIikgKyANCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gImxlZnQiKSArIGdndGhlbWVzOjp0aGVtZV9wYW5kZXIoKQ0KDQpgYGANCg0KIyMjIE9ubHkgZm9yIDIwMTkNCg0KYGBge3J9DQoNCnRoZV9kZiAlPiUNCiAgZmlsdGVyKHllYXIgPT0gMjAxOSkgJT4lIA0KICBnZ3Bsb3QoYWVzKHkgPSBsb2coYnVkZ2V0X3BjKSwgeCA9IGVsZWN0b3JhbF9kZW1vLCBncm91cCA9IGFzLmZhY3RvcihyZWdpb25fNikpKSArIA0KICBnZW9tX3Ntb290aChtZXRob2QgPSAibG9lc3MiLCBjb2xvciA9ICIjOWQwMjA4Iiwgc2UgPSBGQUxTRSkgKw0KICBnZW9tX3BvaW50KGFlcyhjb2xvciA9IGFzLmZhY3RvcihyZWdpb25fNiksIHNoYXBlID0gYXMuZmFjdG9yKHJlZ2lvbl82KSkpICsgDQogIGZhY2V0X3dyYXAofnJlZ2lvbl82KSArIA0Kc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IGMoIiMyMTllYmMiLCAiIzI2NDY1MyIsICIjNDNhYThiIiwgIiM2ZDU5N2EiLCAiI2U2Mzk0NiIsICIjZjRhMjYxIiksDQogICAgICAgICAgICAgICAgICAgbmFtZSA9IE5VTEwpICsNCiAgc2NhbGVfc2hhcGVfbWFudWFsKHZhbHVlcyA9IGMoMTUsMTYsMTcsMTgsMTksMTApLA0KICAgICAgICAgICAgICAgICAgICAgbmFtZSA9IE5VTEwpICsNCiAgZ2d0aXRsZSgiUG9saXR5IFNjb3JlIHZzIFBEIGJ1ZGdldCBwZXIgY2FwaXRhIGluIDIwMTkiKSArIA0KICB4bGFiKCJQb2xpdHkgU2NvcmUgKC0xMCB0byAxMCkiKSArDQogIHlsYWIoIkxvZ2dlZCBidWRnZXQiKSArDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJsZWZ0IikgKyBnZ3RoZW1lczo6dGhlbWVfcGFuZGVyKCkNCg0KYGBgDQoNCg0KIyBQZXJjZW50YWdlIG9mIHBvcHVsYXRpb24gdGhhdCBmb2xsb3dzIE11c2xpbSBmYWl0aA0KDQojIyMgQWNyb3NzIHRoZSB5ZWFycw0KDQpgYGB7cn0NCg0KdGhlX2RmICU+JQ0KICBtdXRhdGUobXVzbGltX3BjID0gcGVyY2VudF9tdXNsaW1faml0dGVyIC8gcG9wLCBuYS5ybSA9IFRSVUUpICU+JSANCiAgZ2dwbG90KGFlcyh5ID0gbG9nKGJ1ZGdldF9jb25zdCksIHggPSBtdXNsaW1fcGMpKSArIA0KICBnZW9tX3Ntb290aChtZXRob2QgPSAibG9lc3MiLCBjb2xvciA9ICIjOWQwMjA4IikgKw0KICBnZW9tX3BvaW50KGFlcyhjb2xvciA9IGFzLmZhY3RvcihyZWdpb25fNiksIHNoYXBlID0gYXMuZmFjdG9yKHJlZ2lvbl82KSkpICsNCiAgZmFjZXRfd3JhcCh+eWVhcikgKyANCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IGMoIiMyMTllYmMiLCAiIzI2NDY1MyIsICIjNDNhYThiIiwgIiM2ZDU5N2EiLCAiI2U2Mzk0NiIsICIjZjRhMjYxIiksDQogICAgICAgICAgICAgICAgICAgbmFtZSA9IE5VTEwpICsNCiAgc2NhbGVfc2hhcGVfbWFudWFsKHZhbHVlcyA9IGMoMTUsMTYsMTcsMTgsMTksMTApLA0KICAgICAgICAgICAgICAgICAgICAgbmFtZSA9IE5VTEwpICsNCiAgZ2d0aXRsZSgiTXVzbGltIHBvcHVsYXRpb24gJSB2cyBQRCBidWRnZXQgcGVyIGNhcGl0YSIpICsgDQogIHhsYWIoIlBlcmNlbnRhZ2Ugb2YgcG9wdWxhdGlvbiBNdXNsaW0iKSArDQogIHlsYWIoIkxvZ2dlZCBQRCBidWRnZXQgcGVyIGNhcGl0YSIpICsgDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJsZWZ0IikgKyBnZ3RoZW1lczo6dGhlbWVfcGFuZGVyKCkNCg0KYGBgDQoNCiMjIyBPbmx5IGZvciAyMDE5DQoNCmBgYHtyfQ0KDQp0aGVfZGYgJT4lDQogIG11dGF0ZShtdXNsaW1fcGMgPSBwZXJjZW50X211c2xpbV9qaXR0ZXIgLyBwb3AsIG5hLnJtID0gVFJVRSkgJT4lIA0KICBmaWx0ZXIoeWVhciA9PSAyMDE5KSAlPiUgDQogIGdncGxvdChhZXMoeSA9IGxvZyhidWRnZXRfY29uc3QpLCB4ID0gbXVzbGltX3BjLCBncm91cCA9IGFzLmZhY3RvcihyZWdpb25fNikpKSArIA0KICAjIGdlb21fc21vb3RoKG1ldGhvZCA9ICJsb2VzcyIsIGNvbG9yID0gIiM5ZDAyMDgiKSArDQogIGdlb21fcG9pbnQoYWVzKGNvbG9yID0gYXMuZmFjdG9yKHJlZ2lvbl82KSwgc2hhcGUgPSBhcy5mYWN0b3IocmVnaW9uXzYpKSkgKyANCiAgZmFjZXRfd3JhcCh+cmVnaW9uXzYpICsgDQogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBjKCIjMjE5ZWJjIiwgIiMyNjQ2NTMiLCAiIzQzYWE4YiIsICIjNmQ1OTdhIiwgIiNlNjM5NDYiLCAiI2Y0YTI2MSIpLA0KICAgICAgICAgICAgICAgICAgIG5hbWUgPSBOVUxMKSArDQogIHNjYWxlX3NoYXBlX21hbnVhbCh2YWx1ZXMgPSBjKDE1LDE2LDE3LDE4LDE5LDEwKSwNCiAgICAgICAgICAgICAgICAgICAgIG5hbWUgPSBOVUxMKSArDQogIGdndGl0bGUoIk11c2xpbSBwb3B1bGF0aW9uICUgdnMgUEQgYnVkZ2V0IHBlciBjYXBpdGEgaW4gMjAxOSIpICsgDQogIHhsYWIoIlBlcmNlbnRhZ2Ugb2YgcG9wdWxhdGlvbiBNdXNsaW0iKSArDQogIHlsYWIoIkxvZ2dlZCBQRCBidWRnZXQgcGVyIGNhcGl0YSIpICsgDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJsZWZ0IikgKyBnZ3RoZW1lczo6dGhlbWVfcGFuZGVyKCkNCg0KYGBgDQoNCg0KIyBHb3Zlcm5tZW50IGNlbnNvcnNoaXAgb2YgbWVkaWENCg0KTGV2ZWwgb2YgZ292ZXJubWVudCBjZW5zb3JzaGlwIG9mIHRoZSBuYXRpb25hbCBtZWRpYSAoZnJvbSBWLURFTSBkYXRhc2V0KQ0KDQpIaWdoZXIgc2NvcmVzIGluZGljYXRlIG1vcmUgZnJlZWRlb20gZnJvbSBnb3Zlcm5tZW50IGNlbnNvcnNoaXAgaW4gdGhlIG5hdGlvbmFsIG1lZGlhDQoNCiMjIyBBY3Jvc3MgdGhlIHllYXJzDQoNCmBgYHtyfQ0KDQp0aGVfZGYgJT4lDQogIGdncGxvdChhZXMoeSA9IGxvZyhidWRnZXRfY29uc3QpLCB4ID0gZ292X2NlbnNvcl9tZWRpYS54LCBncm91cCA9IGFzLmZhY3RvcihyZWdpb25fNikpKSArIA0KICBnZW9tX3BvaW50KGFlcyhjb2xvciA9IGFzLmZhY3RvcihyZWdpb25fNiksIHNoYXBlID0gYXMuZmFjdG9yKHJlZ2lvbl82KSkpICsgDQogIGZhY2V0X3dyYXAofnllYXIpICsgDQogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBjKCIjMjE5ZWJjIiwgIiMyNjQ2NTMiLCAiIzQzYWE4YiIsICIjNmQ1OTdhIiwgIiNlNjM5NDYiLCAiI2Y0YTI2MSIpLCBuYW1lID0gTlVMTCkgKw0KICBzY2FsZV9zaGFwZV9tYW51YWwodmFsdWVzID0gYygxNSwxNiwxNywxOCwxOSwxMCksbmFtZSA9IE5VTEwpICsNCiAgZ2d0aXRsZSgiR292ZXJubWVudCBtZWRpYSBjZW5zb3JzaGlwIHNjb3JlIHZzIFBEIGJ1ZGdldCBwZXIgY2FwaXRhIikgKyANCiAgeGxhYigiR292ZXJubWVudCBtZWRpYSIpICsNCiAgeWxhYigiTG9nZ2VkIFBEIGJ1ZGdldCBwZXIgY2FwaXRhIikgKyANCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gImxlZnQiKSArDQogIGdndGhlbWVzOjp0aGVtZV9wYW5kZXIoKQ0KDQpgYGANCg0KIyMjIE9ubHkgZm9yIDIwMTkNCg0KYGBge3J9DQoNCnRoZV9kZiAlPiUNCiAgZmlsdGVyKHllYXIgPT0gMjAxOSkgJT4lIA0KICBnZ3Bsb3QoYWVzKHkgPSBsb2coYnVkZ2V0X2NvbnN0KSwgeCA9IGdvdl9jZW5zb3JfbWVkaWEueCkpICsgDQogIGdlb21fc21vb3RoKG1ldGhvZCA9ICJsbSIsIGNvbG9yID0gIiM5ZDAyMDgiKSArDQogIGdlb21fcG9pbnQoYWVzKGNvbG9yID0gYXMuZmFjdG9yKHJlZ2lvbl82KSwgc2hhcGUgPSBhcy5mYWN0b3IocmVnaW9uXzYpKSkgKw0KICBmYWNldF93cmFwKH5yZWdpb25fNikgKw0KICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gYygiIzIxOWViYyIsICIjMjY0NjUzIiwgIiM0M2FhOGIiLCAiIzZkNTk3YSIsICIjZTYzOTQ2IiwgIiNmNGEyNjEiKSwgbmFtZSA9IE5VTEwpICsNCiAgc2NhbGVfc2hhcGVfbWFudWFsKHZhbHVlcyA9IGMoMTUsMTYsMTcsMTgsMTksMTApLCBuYW1lID0gTlVMTCkgKw0KICBnZ3RpdGxlKCJHb3Zlcm5tZW50IG1lZGlhIGNlbnNvcnNoaXAgc2NvcmUgdnMgUEQgYnVkZ2V0IHBlciBjYXBpdGEgaW4gMjAxOSIpICsgDQogIHhsYWIoIkZyZWVkZW9tIGZyb20gZ292ZXJubWVudCBjZW5zb3JzaGlwIGluIHRoZSBtZWRpYSIpICsNCiAgeWxhYigiTG9nZ2VkIFBEIGJ1ZGdldCBwZXIgY2FwaXRhIikgKyANCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gImxlZnQiKSArDQogIGdndGhlbWVzOjp0aGVtZV9wYW5kZXIoKQ0KDQpgYGANCg0KDQojIFNpbWlsYXIgVU4gdm90aW5nDQoNCkl0IHJlZmxlY3RzIHN0YXRlcycgVU4gdm90aW5nIHBvc2l0aW9ucyBpbiByZWxhdGlvbiB0byB0aGUgVVMtbGVkIGxpYmVyYWwgb3JkZXIgKGNhbGN1bGF0ZWQgb24gYSBzaW5nbGUgZGltZW5zaW9uKS4NCg0KU291cmNlOiBodHRwczovL2RhdGF2ZXJzZS5oYXJ2YXJkLmVkdS9kYXRhc2V0LnhodG1sP3BlcnNpc3RlbnRJZD1kb2k6MTAuNzkxMC9EVk4vTEVKVVFaIA0KDQpCYWlsZXksIE0uQS4sIFN0cmV6aG5ldiwgQS4sIGFuZCBWb2V0ZW4sIEUgKDIwMTcpLiBFc3RpbWF0aW5nIGR5bmFtaWMgc3RhdGUgcHJlZmVyZW5jZXMgZnJvbSBVbml0ZWQgTmF0aW9ucyB2b3RpbmcgZGF0YS4gSm91cm5hbCBvZiBDb25mbGljdCBSZXNvbHV0aW9uIDYxLjI6IDQzMC00NTYuIA0KDQojIyMgQWNyb3NzIHRoZSB5ZWFycw0KDQpgYGB7cn0NCg0KdGhlX2RmICU+JQ0KICBmaWx0ZXIoeWVhciA9PSAyMDE0KSAlPiUgDQogIGdncGxvdChhZXMoeSA9IGxvZyhidWRnZXQpLCB4ID0gaWRlYWxfcG9pbnRfZGlzdGFuY2UpKSArDQogIGdlb21fc21vb3RoKG1ldGhvZCA9ICJsbSIsIGNvbG9yID0gIiM5ZDAyMDgiLCBhbHBoYSA9IDAuNSkgKw0KICBnZW9tX3BvaW50KGFlcyhjb2xvciA9IGFzLmZhY3RvcihyZWdpb25fNiksIHNoYXBlID0gYXMuZmFjdG9yKHJlZ2lvbl82KSkpICsNCiAgIyBmYWNldF93cmFwKH55ZWFyKSArDQogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBjKCIjMjE5ZWJjIiwgIiMyNjQ2NTMiLCAiIzQzYWE4YiIsICIjNmQ1OTdhIiwgIiNlNjM5NDYiLCAiI2Y0YTI2MSIpLCBuYW1lID0gTlVMTCkgKw0KICBzY2FsZV9zaGFwZV9tYW51YWwodmFsdWVzID0gYygxNSwxNiwxNywxOCwxOSwxMCksIG5hbWUgPSBOVUxMKSArDQogIGdndGl0bGUoIlVOIHZvdGluZyBzaW1pbGFyaXR5IHZzIFBEIGJ1ZGdldCBwZXIgY2FwaXRhIikgKw0KICB4bGFiKCJEaXN0YW5jZSBmcm9tIFVTIGlkZWFsIHNjb3JlIikgKw0KICB5bGFiKCJMb2dnZWQgUEQgYnVkZ2V0IHBlciBjYXBpdGEiKSArDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJsZWZ0IikgKw0KICBnZ3RoZW1lczo6dGhlbWVfcGFuZGVyKCkNCg0KYGBgDQoNCldlIGNhbiBzZWUgdHdvIGNsdXN0ZXJzIGFwcGVhciENCg0KIyMjIyBPbmx5IGZvciAyMDE5DQoNCmBgYHtyfQ0KdGhlX2RmICU+JQ0KICBmaWx0ZXIoeWVhciA9PSAyMDE5KSAlPiUNCiAgZ2dwbG90KGFlcyh5ID0gbG9nKGJ1ZGdldF9jb25zdCksIHggPSBpZGVhbF9wb2ludF9kaXN0YW5jZSwgZ3JvdXAgPSBhcy5mYWN0b3IocmVnaW9uXzYpKSkgKw0KICBnZW9tX3Ntb290aChtZXRob2QgPSAibG0iLCBjb2xvciA9ICIjOWQwMjA4Iiwgc2UgPSBGQUxTRSkgKw0KICBnZW9tX3BvaW50KGFlcyhjb2xvciA9IGFzLmZhY3RvcihyZWdpb25fNiksIHNoYXBlID0gYXMuZmFjdG9yKHJlZ2lvbl82KSkpICsNCiAgZmFjZXRfd3JhcCh+cmVnaW9uXzYpICsNCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IGMoIiMyMTllYmMiLCAiIzI2NDY1MyIsICIjNDNhYThiIiwgIiM2ZDU5N2EiLCAiI2U2Mzk0NiIsICIjZjRhMjYxIiksDQogICAgICAgICAgICAgICAgICAgbmFtZSA9IE5VTEwpICsNCiAgc2NhbGVfc2hhcGVfbWFudWFsKHZhbHVlcyA9IGMoMTUsMTYsMTcsMTgsMTksMTApLA0KICAgICAgICAgICAgICAgICAgICAgbmFtZSA9IE5VTEwpICsNCiAgZ2d0aXRsZSgiVU4gdm90aW5nIHNpbWlsYXJpdHkgdnMgUEQgYnVkZ2V0IHBlciBjYXBpdGEiKSArDQogIHhsYWIoIkRpc3RhbmNlIGZyb20gVVMgaWRlYWwgc2NvcmUiKSArDQogIHlsYWIoIkxvZ2dlZCBQRCBidWRnZXQgcGVyIGNhcGl0YSIpICsNCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gImxlZnQiKSArIA0KICBnZ3RoZW1lczo6dGhlbWVfcGFuZGVyKCkNCg0KYGBgDQoNCiMgSW1wb3J0YW50IFVTIHZvdGVzDQoNClNvdXJjZTogRXJpayBWb2V0ZW4gIkRhdGEgYW5kIEFuYWx5c2VzIG9mIFZvdGluZyBpbiB0aGUgVU4gR2VuZXJhbCBBc3NlbWJseSIgUm91dGxlZGdlIEhhbmRib29rIG9mIEludGVybmF0aW9uYWwgT3JnYW5pemF0aW9uLCBlZGl0ZWQgYnkgQm9iIFJlaW5hbGRhIChwdWJsaXNoZWQgTWF5IDI3LCAyMDEzKQ0KDQpJbXBvcnRhbnQgdm90ZXMgZGV0ZXJtaW5lZCBieSB0aGUgVVMgU3RhdGUgRGVwYXJ0bWVudDogV2hldGhlciB0aGUgdm90ZSB3YXMgY2xhc3NpZmllZCBhcyBpbXBvcnRhbnQgYnkgdGhlIFUuUy4gU3RhdGUgRGVwYXJ0bWVudCByZXBvcnQNCiJWb3RpbmcgUHJhY3RpY2VzIGluIHRoZSBVbml0ZWQgTmF0aW9ucyIuIFRoZXNlIGNsYXNzaWZpY2F0aW9ucyBiZWdhbiB3aXRoIHNlc3Npb24gMzkNCg0KDQpgYGB7cn0NCg0KIyBsaWJyYXJ5KHVudm90ZXMpDQojIGxpYnJhcnkobHVicmlkYXRlKQ0KIyANCiMgY291bnQodW5fcm9sbF9jYWxsX2lzc3VlcywgaXNzdWUsIHNvcnQgPSBUUlVFKQ0KIyANCiMgam9pbmVkIDwtIHVuX3ZvdGVzICU+JQ0KIyAgIGlubmVyX2pvaW4odW5fcm9sbF9jYWxscywgYnkgPSAicmNpZCIpICU+JSANCiMgICBpbm5lcl9qb2luKHVuX3JvbGxfY2FsbF9pc3N1ZXMsIGJ5ID0gInJjaWQiKSAlPiUgDQojICAgdW5ncm91cCgpDQojIA0KIyBpbXBvcnRhbnQgPC0gam9pbmVkICU+JSANCiMgICBmaWx0ZXIoaW1wb3J0YW50dm90ZSA9PSAxKSAlPiUgDQojICAgc2VsZWN0KHJjaWQsIGNvdW50cnksIHZvdGUsIHNlc3Npb24sIGRhdGUpDQojIA0KIyBpbXBvcnRhbnQgJT4lDQojICAgbXV0YXRlKHZvdGVfZmFjID0gYXMuZmFjdG9yKHZvdGUpKSAlPiUgDQojICAgbXV0YXRlKHZvdGVfbnVtID0gYXMubnVtZXJpYyh2b3RlX2ZhYykpICU+JSANCiMgICBkaXN0aW5jdChzZXNzaW9uLCBjb3VudHJ5LCByY2lkLCB2b3RlX251bSwgLmtlZXBfYWxsID0gIlRSVUUiKSAtPiB0ZW1wMg0KIyANCiMgdGVtcDIgJT4lIA0KIyAgIHNlbGVjdChyY2lkLCBjb3VudHJ5LCB2b3RlX251bSwgc2Vzc2lvbikgJT4lIA0KIyAgIHBpdm90X3dpZGVyKG5hbWVzX2Zyb20gPSBjb3VudHJ5LCB2YWx1ZXNfZnJvbSA9ICJ2b3RlX251bSIgKSAtPiBpbXBfd2lkZQ0KIyANCiMgdGVtcDIgJT4lIA0KIyAgIGdyb3VwX2J5KGNvdW50cnlfbmFtZSkNCiMgICBtdXRhdGUoY291bnRyeSA9IGlmX2Vsc2UoUmVzcG9uc2UgPT0gQ29ycmVjdF9hbnN3ZXIsIDEsIDApKQ0KIyANCg0KDQpgYGANCg0KDQoNCiMgTGV2ZWwgb2YgZG9tZXN0aWMgYXV0b25vbXkgDQoNCk1lYXN1cmVzIHRoZSBleHRlbnQgdG8gd2hpY2ggdGhlIGNvdW50cnkncyBnb3Z0IGhhdmUgZnVsbCBzb3ZlcmVpZ24gY29udHJvbCBvdmVyIHRoZSB0ZXJyaXRvcnkuDQoNCkhpZ2hlciBzY29yZXMgaW5kaWNhdGUgbW9yZSBjb250cm9sDQoNCiMjIyMgQWNyb3NzIGFsbCB5ZWFycw0KDQpgYGB7cn0NCg0KdGhlX2RmICU+JQ0KICBnZ3Bsb3QoYWVzKHkgPSBsb2coYnVkZ2V0X3BjX2NvbnN0KSwgeCA9IGludGxfYXV0b25vbXkpKSArDQogIGdlb21fc21vb3RoKG1ldGhvZCA9ICJsbSIsIGNvbG9yID0gIiM5ZDAyMDgiKSArDQogIGdlb21fcG9pbnQoYWVzKGNvbG9yID0gYXMuZmFjdG9yKHJlZ2lvbl82KSwgc2hhcGUgPSBhcy5mYWN0b3IocmVnaW9uXzYpKSkgKw0KICBmYWNldF93cmFwKH55ZWFyKSArDQogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBjKCIjMjE5ZWJjIiwgIiMyNjQ2NTMiLCAiIzQzYWE4YiIsICIjNmQ1OTdhIiwgIiNlNjM5NDYiLCAiI2Y0YTI2MSIpLCBuYW1lID0gTlVMTCkgKw0KICBzY2FsZV9zaGFwZV9tYW51YWwodmFsdWVzID0gYygxNSwxNiwxNywxOCwxOSwxMCksIG5hbWUgPSBOVUxMKSArDQogIGdndGl0bGUoIkRvbWVzdGljIGF1dG9ub215IHZzIFBEIGJ1ZGdldCBwZXIgY2FwaXRhIikgKw0KICB4bGFiKCJEb21lc3RpYyBhdXRvbm9teSIpICsNCiAgeWxhYigiTG9nZ2VkIFBEIGJ1ZGdldCBwZXIgY2FwaXRhIikgKw0KICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibGVmdCIpICsNCiAgZ2d0aGVtZXM6OnRoZW1lX3BhbmRlcigpDQoNCmBgYA0KDQojIyMjIE9ubHkgZm9yIDIwMTkNCg0KYGBge3J9DQoNCnRoZV9kZiAlPiUNCiAgZmlsdGVyKHllYXIgPT0gMjAxMykgJT4lDQogIGdncGxvdChhZXMoeSA9IGxvZyhidWRnZXRfcGNfY29uc3QpLCB4ID0gaW50bF9hdXRvbm9teSwgZ3JvdXAgPSBhcy5mYWN0b3IocmVnaW9uXzYpKSkgKw0KICBnZW9tX3Ntb290aChtZXRob2QgPSAibG0iLCBjb2xvciA9ICIjOWQwMjA4Iiwgc2UgPSBGQUxTRSkgKw0KICBnZW9tX3BvaW50KGFlcyhjb2xvciA9IGFzLmZhY3RvcihyZWdpb25fNiksIHNoYXBlID0gYXMuZmFjdG9yKHJlZ2lvbl82KSkpICsNCiAgZmFjZXRfd3JhcCh+cmVnaW9uXzYpICsNCiBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gYygiIzIxOWViYyIsICIjMjY0NjUzIiwgIiM0M2FhOGIiLCAiIzZkNTk3YSIsICIjZTYzOTQ2IiwgIiNmNGEyNjEiKSwNCiAgICAgICAgICAgICAgICAgICBuYW1lID0gTlVMTCkgKw0KICBzY2FsZV9zaGFwZV9tYW51YWwodmFsdWVzID0gYygxNSwxNiwxNywxOCwxOSwxMCksDQogICAgICAgICAgICAgICAgICAgICBuYW1lID0gTlVMTCkgKw0KICBnZ3RpdGxlKCJEb21lc3RpYyBhdXRvbm9teSB2cyBQRCBidWRnZXQgcGVyIGNhcGl0YSIpICsNCiAgeGxhYigiRG9tZXN0aWMgYXV0b25vbXkiKSArDQogIHlsYWIoIkxvZ2dlZCBQRCBidWRnZXQgcGVyIGNhcGl0YSIpICsNCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gImxlZnQiKSArIGdndGhlbWVzOjp0aGVtZV9wYW5kZXIoKQ0KDQpgYGANCg0KDQojIFVTIGRpcGxvbWF0aWMgdmlzaXRzIA0KDQpOdW1iZXIgb2YgdmlzaXRzIGJ5IGhlYWRzIG9mIHN0YXRlIHRvIHRoZSBVUyANCg0KYGBge3IgdmlzaXRzLCBlY2hvID0gRkFMU0V9DQoNCnZpc2l0cyA8LSByZWFkLmNzdigiQzovVXNlcnMvUGF1bGEvRGVza3RvcC9kaXBsb21hdGljX3Zpc2l0cy5jc3YiKQ0KDQp2aXNpdHMkeWVhciA8LSBhcy5pbnRlZ2VyKHN0cl9zdWIodmlzaXRzJERhdGUsIC00LCAtMSkpDQoNCnZpc2l0cyRjb3dfY29kZSA8LSBjb3VudHJ5Y29kZSh2aXNpdHMkRnJvbSwgImNvdW50cnkubmFtZSIsICJjb3duIikNCg0KdmlzaXRzICU8PiUgDQogIHNlbGVjdChjb3dfY29kZSwgRnJvbSwgZXZlcnl0aGluZygpKQ0KDQp2aXNpdHMgJTw+JSANCiAgZHBseXI6Om11dGF0ZShjb3dfY29kZSA9IGlmZWxzZShGcm9tID09ICJVLlMuUy5SLiIsIDM2NSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKEZyb20gPT0gIlBhbGVzdGluaWFuIEF1dGhvcml0eSIsIDY2NjYsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoRnJvbSA9PSAiU2VyYmlhIGFuZCBNb250ZW5lZ3JvIiwgMzQ1LA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShGcm9tID09ICJTZXJiaWEiLDM0NSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKEZyb20gPT0gIll1Z29zbGF2aWEgKEtvc292bykiLCAzNDcsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoRnJvbSA9PSAiTWljcm9uZXNpYSIsIDk4NywgY293X2NvZGUpKSkpKSkpDQoNCnZpc2l0cyAlPiUgDQogIGdyb3VwX2J5KGNvd19jb2RlLCB5ZWFyKSAlPiUgDQogIHN1bW1hcmlzZShzdW1faGVhZF92aXN0cyA9IG4oKSkgJT4lIA0KICB1bmdyb3VwKCkgLT4gaGVhZF92aXNpdHMNCg0KdmlzaXRzICU+JSANCiAgZ3JvdXBfYnkoRnJvbSwgeWVhcikgJT4lIA0KICBjb3VudCgpICU+JSANCiAgZmlsdGVyKG4gPiAxKSAlPiUgDQogIGFycmFuZ2UoZGVzYyhuKSkgJT4lIA0KICBrYmwoKSAlPiUNCiAga2FibGVfcGFwZXIoInN0cmlwZWQiLA0KICAgICAgICAgICAgICBmdWxsX3dpZHRoID0gRikgDQoNCnZpc2l0cyAlPiUgDQogIGdyb3VwX2J5KEZyb20pICU+JSANCiAgY291bnQoKSAlPiUgDQogIGZpbHRlcihuID4gNDApICU+JSANCiAgYXJyYW5nZShkZXNjKG4pKSAlPiUgDQogIGtibCgpICU+JQ0KICBrYWJsZV9wYXBlcigic3RyaXBlZCIsDQogICAgICAgICAgICAgIGZ1bGxfd2lkdGggPSBGKSANCg0KYGBgDQoNCiMgVVMgdHJpcHMNCg0KVHJpcHMgYnkgVVMgUHJlc2lkZW50IC8gU2VjcmV0YXJpZXMgb2YgU3RhdGUgYWJyb2FkDQoNCmBgYHtyIHRyaXBzLCBlY2hvID0gRkFMU0V9DQoNCnRyYXZlbHMgPC0gcmVhZC5jc3YoIkM6L1VzZXJzL1BhdWxhL0Rlc2t0b3AvZGlwbG9tYXRpY190cmF2ZWxzLmNzdiIpDQoNCnRyYXZlbHMkeWVhciA8LSBhcy5pbnRlZ2VyKHN0cl9zdWIodHJhdmVscyREYXRlLCAtNCwgLTEpKQ0KDQp0cmF2ZWxzJGNvd19jb2RlIDwtIGNvdW50cnljb2RlKHRyYXZlbHMkQ291bnRyeSwgImNvdW50cnkubmFtZSIsICJjb3duIikNCg0KdHJhdmVscyAlPD4lIA0KICBzZWxlY3QoY293X2NvZGUsIENvdW50cnksIGV2ZXJ5dGhpbmcoKSkNCg0KdHJhdmVscyAlPD4lIA0KICBkcGx5cjo6bXV0YXRlKGNvd19jb2RlID0gaWZlbHNlKENvdW50cnkgPT0gIlUuUy5TLlIuIiwgMzY1LA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoQ291bnRyeSA9PSAiUGFsZXN0aW5pYW4gQXV0aG9yaXR5IiwgNjY2NiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShDb3VudHJ5ID09ICJTZXJiaWEgYW5kIE1vbnRlbmVncm8iLCAzNDUsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKENvdW50cnkgPT0gIlNlcmJpYSIsMzQ1LA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoQ291bnRyeSA9PSAiWXVnb3NsYXZpYSAoS29zb3ZvKSIsIDM0NywgY293X2NvZGUpKSkpKSkNCg0KYGBgDQoNCg0KYGBge3J9DQp0cmF2ZWxzICU+JSANCiAgZ3JvdXBfYnkoY293X2NvZGUsIHllYXIpICU+JSANCiAgZmlsdGVyKFByZXMgPT0gMSkgJT4lIA0KICBzdW1tYXJpc2Uoc3VtX3ByZXNfdHJhdmVscyA9IG4oKSkgJT4lIA0KICB1bmdyb3VwKCkgLT4gcHJlc190cmF2ZWwNCg0KdHJhdmVscyAlPiUgDQogIGdyb3VwX2J5KGNvd19jb2RlLCB5ZWFyKSAlPiUgDQogIHN1bW1hcmlzZShzdW1fYWxsX3RyYXZlbHMgPSBuKCkpICU+JSANCiAgdW5ncm91cCgpIC0+IGFsbF90cmF2ZWwNCg0KdHJhdmVscyAlPiUgDQogIGdyb3VwX2J5KGNvd19jb2RlLCB5ZWFyKSAlPiUgDQogIHN1bW1hcmlzZShzdW1faW5kZXhfdHJhdmVscyA9IHN1bShkYXNoaW5kZXgpKSAlPiUgDQogIHVuZ3JvdXAoKSAtPiBzY29yZV90cmF2ZWwNCg0KdGhlX2RmIDwtIG1lcmdlKHRoZV9kZiwgcHJlc190cmF2ZWwsIGJ5ID0gYygiY293X2NvZGUiLCAieWVhciIpLCBhbGwueCA9IFRSVUUpIA0KdGhlX2RmIDwtIG1lcmdlKHRoZV9kZiwgaGVhZF92aXNpdHMsIGJ5ID0gYygiY293X2NvZGUiLCAieWVhciIpLCBhbGwueCA9IFRSVUUpIA0KdGhlX2RmIDwtIG1lcmdlKHRoZV9kZiwgYWxsX3RyYXZlbCwgYnkgPSBjKCJjb3dfY29kZSIsICJ5ZWFyIiksIGFsbC54ID0gVFJVRSkgDQp0aGVfZGYgPC0gbWVyZ2UodGhlX2RmLCBzY29yZV90cmF2ZWwsIGJ5ID0gYygiY293X2NvZGUiLCAieWVhciIpLCBhbGwueCA9IFRSVUUpIA0KDQpgYGANCg0KYGBge3J9DQojIyMgQWNyb3NzIHRoZSB5ZWFycw0KDQpsaWJyYXJ5KHRpZHlyKQ0KDQoNCnRoZV9kZiAlPiUNCiAgZmlsdGVyKHllYXIgPCAyMDE3KSAlPiUgDQogIG11dGF0ZShhbGxfdHJhdmVsID0gY29hbGVzY2Uoc3VtX2FsbF90cmF2ZWxzLCAwKSkgJT4lIA0KICBnZ3Bsb3QoYWVzKHkgPSBsb2coYnVkZ2V0X3BjX2NvbnN0KSwgeCA9IGFsbF90cmF2ZWwpKSArDQogIGdlb21fc21vb3RoKG1ldGhvZCA9ICJsbSIsIGNvbG9yID0gIiM5ZDAyMDgiLCBhbHBoYSA9IDAuNSkgKw0KICBnZW9tX3BvaW50KGFlcyhjb2xvciA9IGFzLmZhY3RvcihyZWdpb25fNiksIHNoYXBlID0gYXMuZmFjdG9yKHJlZ2lvbl82KSkpICsNCiAgZmFjZXRfd3JhcCh+eWVhcikrDQogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBjKCIjMjE5ZWJjIiwgIiMyNjQ2NTMiLCAiIzQzYWE4YiIsICIjNmQ1OTdhIiwgIiNlNjM5NDYiLCAiI2Y0YTI2MSIpLCBuYW1lID0gTlVMTCkgKw0KICBzY2FsZV9zaGFwZV9tYW51YWwodmFsdWVzID0gYygxNSwxNiwxNywxOCwxOSwxMCksIG5hbWUgPSBOVUxMKSArDQogIGdndGl0bGUoIlVOIHZvdGluZyBzaW1pbGFyaXR5IHZzIFBEIGJ1ZGdldCBwZXIgY2FwaXRhIikgKw0KICB4bGFiKCJEaXN0YW5jZSBmcm9tIFVTIGlkZWFsIHNjb3JlIikgKw0KICB5bGFiKCJMb2dnZWQgUEQgYnVkZ2V0IHBlciBjYXBpdGEiKSArDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJsZWZ0IikgKw0KICBnZ3RoZW1lczo6dGhlbWVfcGFuZGVyKCkNCg0KDQpgYGANCg0KYGBge3J9DQoNCg0KdGhlX2RmICU+JQ0KICBmaWx0ZXIoeWVhciA8IDIwMTcpICU+JSANCiAgIyBtdXRhdGUoc2NvcmVfdHJhdmVsID0gY29hbGVzY2Uoc3VtX2luZGV4X3RyYXZlbHMsIDApKSAlPiUgDQogIGdncGxvdChhZXMoeSA9IGxvZyhidWRnZXRfcGNfY29uc3QpLCB4ID0gc3VtX2luZGV4X3RyYXZlbHMpKSArDQogIGdlb21fc21vb3RoKG1ldGhvZCA9ICJsbSIsIGNvbG9yID0gIiM5ZDAyMDgiLCBhbHBoYSA9IDAuNSkgKw0KICBnZW9tX3RleHQoYWVzKGxhYmVsID0gY291bnRyeSwgY29sb3IgPSBhcy5mYWN0b3IocmVnaW9uXzYpKSkgKw0KICAjIGdlb21fcG9pbnQoYWVzKGNvbG9yID0gYXMuZmFjdG9yKHJlZ2lvbl82KSwgc2hhcGUgPSBhcy5mYWN0b3IocmVnaW9uXzYpKSkgKw0KICBmYWNldF93cmFwKH55ZWFyKSsNCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IGMoIiMyMTllYmMiLCAiIzI2NDY1MyIsICIjNDNhYThiIiwgIiM2ZDU5N2EiLCAiI2U2Mzk0NiIsICIjZjRhMjYxIiksIG5hbWUgPSBOVUxMKSArDQogIHNjYWxlX3NoYXBlX21hbnVhbCh2YWx1ZXMgPSBjKDE1LDE2LDE3LDE4LDE5LDEwKSwgbmFtZSA9IE5VTEwpICsNCiAgZ2d0aXRsZSgiSGlnaCBsZXZlbCB2aXNpdHMgREFTSCBzY29yZSB2cyBQRCBidWRnZXQgcGVyIGNhcGl0YSIpICsNCiAgeGxhYigiSGlnaCBsZXZlbCB2aXNpdHMgREFTSCBzY29yZSIpICsNCiAgeWxhYigiTG9nZ2VkIFBEIGJ1ZGdldCBwZXIgY2FwaXRhIikgKw0KICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibGVmdCIpICsNCiAgZ2d0aGVtZXM6OnRoZW1lX3BhbmRlcigpDQoNCmBgYA0KDQoNCiMjIyMgT25seSBmb3IgMjAxNg0KDQpgYGB7cn0NCnRoZV9kZiAlPiUNCiAgZmlsdGVyKHllYXIgPT0gMjAxNikgJT4lDQogIG11dGF0ZShhbGxfdHJhdmVsID0gY29hbGVzY2Uoc3VtX2FsbF90cmF2ZWxzLCAwKSkgJT4lIA0KICBnZ3Bsb3QoYWVzKHkgPSBsb2coYnVkZ2V0X3BjX2NvbnN0KSwgeCA9IGFsbF90cmF2ZWwpKSArDQogIGdlb21fc21vb3RoKG1ldGhvZCA9ICJsbSIsIGNvbG9yID0gIiM5ZDAyMDgiLCBzZSA9IEZBTFNFKSArDQogIGdlb21fcG9pbnQoYWVzKGNvbG9yID0gYXMuZmFjdG9yKHJlZ2lvbl82KSwgc2hhcGUgPSBhcy5mYWN0b3IocmVnaW9uXzYpKSkgKw0KICBmYWNldF93cmFwKH5yZWdpb25fNikgKw0KICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gYygiIzIxOWViYyIsICIjMjY0NjUzIiwgIiM0M2FhOGIiLCAiIzZkNTk3YSIsICIjZTYzOTQ2IiwgIiNmNGEyNjEiKSwNCiAgICAgICAgICAgICAgICAgICBuYW1lID0gTlVMTCkgKw0KICBzY2FsZV9zaGFwZV9tYW51YWwodmFsdWVzID0gYygxNSwxNiwxNywxOCwxOSwxMCksDQogICAgICAgICAgICAgICAgICAgICBuYW1lID0gTlVMTCkgKw0KICBnZ3RpdGxlKCJoaWdoIGxldmVsIHZpc2l0cyB2cyBQRCBidWRnZXQgcGVyIGNhcGl0YSIpICsNCiAgeGxhYigiTnVtYmVyIG9mIGhpZ2ggbGV2ZWwgdmlzaXRzIikgKw0KICB5bGFiKCJMb2dnZWQgUEQgYnVkZ2V0IHBlciBjYXBpdGEiKSArDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJsZWZ0IikgKyANCiAgZ2d0aGVtZXM6OnRoZW1lX3BhbmRlcigpDQoNCmBgYA0KDQoNCg0KYGBge3J9DQoNCnRyYXZlbHMgJT4lIA0KICBmaWx0ZXIoUHJlcyA9PSAxKSAlPiUgDQogIGdyb3VwX2J5KENvdW50cnksIHllYXIpICU+JSANCiAgY291bnQoKSAlPiUgDQogIGFycmFuZ2UoZGVzYyhuKSkgJT4lIA0KICBrYmwoKSAlPiUNCiAga2FibGVfcGFwZXIoInN0cmlwZWQiLA0KICAgICAgICAgICAgICBmdWxsX3dpZHRoID0gRikgDQoNCmBgYA0KDQojIFRyaXBzIGJ5IFVTIHByZXNpZGVudHMgYW5kIFNlY3JldGFyaWVzIG9mIFN0YXRlIA0KDQojIyMgVG90YWwgbnVtYmVyIG9mIHRyaXBzIGJ5IFVTIHByZXNpZGVudHMgYW5kIFNlY3JldGFyaWVzIG9mIFN0YXRlIGJldHdlZW4gMTk0NSB0byAyMDE3DQoNCmBgYHtyfQ0KDQp0cmF2ZWxzICU+JSANCiAgZ3JvdXBfYnkoQ291bnRyeSkgJT4lIA0KICBjb3VudCgpICU+JSANCiAgZmlsdGVyKG4gPiA1MCkgJT4lIA0KICBhcnJhbmdlKGRlc2MobikpICU+JSANCiAgZ2dwbG90KGFlcyh5ID0gbiwNCiAgICAgICAgICAgICB4ID0gcmVvcmRlcihDb3VudHJ5LCBuKSwgZmlsbCA9IENvdW50cnkpKSArDQogIGNvb3JkX2ZsaXAoKSArDQogIGdlb21faGlzdG9ncmFtKHN0YXQgPSAiaWRlbnRpdHkiKSArIGdndGhlbWVzOjp0aGVtZV9wYW5kZXIoKSArDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIikgKyANCiAgZ2d0aXRsZSgiVHJpcHMgYnkgVVMgUHJlc2lkZW50cyAmIFN0YXRlIFNlY3JldGFyaWVzIDE5NDUtMjAxNyIpICsgDQogIHhsYWIoIkNvdW50cnkiKSArDQogIHlsYWIoIk51bWJlciBUcmlwcyBieSBVUyBQcmVzaWRlbnQgJiBTZWNyZXRhcmllcyBvZiBTdGF0ZSIpDQoNCmBgYA0KDQpgYGB7ciwgZWNobyA9IEZBTFNFfQ0KDQp0cmF2ZWxzICU+JSANCiAgZ3JvdXBfYnkoQ291bnRyeSkgJT4lIA0KICBjb3VudCgpICU+JSANCiAgYXJyYW5nZShkZXNjKG4pKSAlPiUgDQogIGZpbHRlcihuID4gNTApICU+JSANCiAga2JsKCkgJT4lDQogIGthYmxlX3BhcGVyKCJzdHJpcGVkIiwNCiAgICAgICAgICAgICAgZnVsbF93aWR0aCA9IEYpIA0KDQpgYGANCg0KIyBVUyB0cm9vcCBsZXZlbHMNCg0KYGBge3J9DQoNCnRyb29wcyA8LSByZWFkLmNzdigiQzovVXNlcnMvUGF1bGEvRGVza3RvcC90cm9vcHMgYW5kIG1pbGl0YXJ5IHNwZW5kaW5nLmNzdiIsIGhlYWRlciA9IFRSVUUpDQoNCnRyb29wcyAlPiUgDQogIGZpbHRlcih5ZWFyID4gMTk1MCkgJT4lICANCiAgZ3JvdXBfYnkoY291bnRyeSkgJT4lIA0KICBzdW1tYXJpc2Uoc3VtX3Ryb29wcyA9IHN1bSh0cm9vcHMpKSAlPiUNCiAgZmlsdGVyKHN1bV90cm9vcHMgPiA1MDAwMCkgJT4lIA0KICBhcnJhbmdlKGRlc2Moc3VtX3Ryb29wcykpICU+JSANCiAga2JsKCkgJT4lDQogIGthYmxlX3BhcGVyKCJzdHJpcGVkIiwNCiAgICAgICAgICAgICAgZnVsbF93aWR0aCA9IEYpIA0KDQpgYGANCg0KYGBge3J9DQoNCnRyb29wcyAlPiUgDQogIGdyb3VwX2J5KGNjb2RlKSAlPiUgDQogIHN1bW1hcmlzZShzdW1fdHJvb3BzID0gc3VtKHRyb29wcykpICU+JSANCiAgdW5ncm91cCgpIC0+IHRyb29wX2xldmVscw0KDQp0aGVfZGYgPC0gbWVyZ2UodGhlX2RmLCB0cm9vcF9sZXZlbHMsIGJ5LnggPSAiY293X2NvZGUiLCBieS55ID0gImNjb2RlIiwgYWxsLnggPSBUUlVFKQ0KDQpgYGANCg0KDQpgYGB7cn0NCg0KbGlicmFyeShzdGFyZ2F6ZXIpDQoNCnRoZV9kZiRzdW1fcHJlc190cmF2ZWxzW2lzLm5hKHRoZV9kZiRzdW1fcHJlc190cmF2ZWxzKV0gPC0gMA0KdGhlX2RmJHN1bV9oZWFkX3Zpc3RzW2lzLm5hKHRoZV9kZiRzdW1faGVhZF92aXN0cyldIDwtIDANCnRoZV9kZiRzdW1fdHJvb3BzW2lzLm5hKHRoZV9kZiRzdW1fdHJvb3BzKV0gPC0gMA0KDQpgYGANCg0KYGBge3J9DQoNCnRoZV9kZiAlPiUNCiAgZmlsdGVyKHN1bV90cm9vcHMgPiAxKSAlPiUgDQogIGZpbHRlcih5ZWFyID09IDIwMTkpICU+JSANCiAgZ2dwbG90KGFlcyh5ID0gbG9nKGJ1ZGdldF9wYyksIHggPSBsb2coc3VtX3Ryb29wcyArIDEpLCBncm91cCA9IGFzLmZhY3RvcihyZWdpb25fNikpKSArDQogICMgZ2VvbV9wb2ludChhZXMoY29sb3IgPSBhcy5mYWN0b3IocmVnaW9uXzYpLCBzaGFwZSA9IGFzLmZhY3RvcihyZWdpb25fNikpKSArDQogIGdlb21fc21vb3RoKG1ldGhvZCA9ICJsbSIsIHNlID0gRkFMU0UsIGFlcyhjb2xvciA9IGFzLmZhY3RvcihyZWdpb25fNikpKSArIA0KICBnZW9tX3RleHQoYWVzKGxhYmVsID0gY291bnRyeSwgY29sb3IgPSByZWdpb25fNiksIHNpemUgPSA0KSArDQogIGZhY2V0X3dyYXAofnJlZ2lvbl82KSArDQogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBjKCIjMjE5ZWJjIiwgIiMyNjQ2NTMiLCAiIzQzYWE4YiIsICIjNmQ1OTdhIiwgIiNlNjM5NDYiLCAiI2Y0YTI2MSIpLA0KICAgICAgICAgICAgICAgICAgIG5hbWUgPSBOVUxMKSArDQogIHNjYWxlX3NoYXBlX21hbnVhbCh2YWx1ZXMgPSBjKDE1LDE2LDE3LDE4LDE5LDEwKSwNCiAgICAgICAgICAgICAgICAgICAgIG5hbWUgPSBOVUxMKSArDQogIGdndGl0bGUoIlVOIHZvdGluZyBzaW1pbGFyaXR5IHZzIFBEIGJ1ZGdldCBwZXIgY2FwaXRhIikgKw0KICB4bGFiKCJEaXN0YW5jZSBmcm9tIFVTIGlkZWFsIHNjb3JlIikgKw0KICB5bGFiKCJMb2dnZWQgUEQgYnVkZ2V0IHBlciBjYXBpdGEiKSArDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJsZWZ0IikgKyBnZ3RoZW1lczo6dGhlbWVfcGFuZGVyKCkNCg0KYGBgDQoNCg0KYGBge3J9DQoNCnRoZV9kZiAlPiUNCiAgIyBmaWx0ZXIoc3VtX3Ryb29wcyA+IDEpICU+JSANCiAgZ2dwbG90KGFlcyh5ID0gbG9nKGJ1ZGdldF9wYyksIHggPSBsb2coc3VtX3Ryb29wcyArIDEpLCBncm91cCA9IGFzLmZhY3RvcihyZWdpb25fNikpLCBhbHBoYSA9IDAuNSkgKw0KICBnZW9tX3BvaW50KGFlcyhjb2xvciA9IGFzLmZhY3RvcihyZWdpb25fNiksIHNoYXBlID0gYXMuZmFjdG9yKHJlZ2lvbl82KSkpICsNCiAgZ2VvbV9zbW9vdGgobWV0aG9kID0gImxtIiwgc2UgPSBGQUxTRSwgYWVzKGNvbG9yID0gYXMuZmFjdG9yKHJlZ2lvbl82KSkpICsgDQogICMgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IGNvdW50cnksIGNvbG9yID0gcmVnaW9uXzYpLCBzaXplID0gNCkgKw0KICBmYWNldF93cmFwKH55ZWFyKSArIA0KICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gYygiIzIxOWViYyIsICIjMjY0NjUzIiwgIiM0M2FhOGIiLCAiIzZkNTk3YSIsICIjZTYzOTQ2IiwgIiNmNGEyNjEiKSwNCiAgICAgICAgICAgICAgICAgICBuYW1lID0gTlVMTCkgKw0KICBzY2FsZV9zaGFwZV9tYW51YWwodmFsdWVzID0gYygxNSwxNiwxNywxOCwxOSwxMCksDQogICAgICAgICAgICAgICAgICAgICBuYW1lID0gTlVMTCkgKw0KICBnZ3RpdGxlKCJVTiB2b3Rpbmcgc2ltaWxhcml0eSB2cyBQRCBidWRnZXQgcGVyIGNhcGl0YSIpICsNCiAgeGxhYigiRGlzdGFuY2UgZnJvbSBVUyBpZGVhbCBzY29yZSIpICsNCiAgeWxhYigiTG9nZ2VkIFBEIGJ1ZGdldCBwZXIgY2FwaXRhIikgKw0KICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibGVmdCIpICsgZ2d0aGVtZXM6OnRoZW1lX3BhbmRlcigpDQoNCmBgYA0KDQoNCiMgT3ZlcnNlYXMgTWlsaXRhcnkgQmFzZXMgaW4gQ2hpbmEsIFJ1c3NpYSBhbmQgdGhlIFVTDQoNClNvdXJjZTogaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvTGlzdF9vZl9jb3VudHJpZXNfd2l0aF9vdmVyc2Vhc19taWxpdGFyeV9iYXNlcw0KDQoNCg0KYGBge3J9DQogIA0KDQpgYGANCg0KIyBVUyBiYXNlcyBhbmQgImxpbHkgcGFkcyINCg0KU291cmNlOiAgaHR0cHM6Ly9naXRodWIuY29tL21lZmx5bm4vdHJvb3BkYXRhDQoNClRyb29wIGRlcGxveW1lbnQgZGF0YSB3ZXJlIGluaXRpYWxseSBjb21waWxlZCBieSBUaW0gS2FuZSB1c2luZyBpbmZvcm1hdGlvbiBvYnRhaW5lZCBmcm9tIHRoZSBVLlMuIERlcGFydG1lbnQgb2YgRGVmZW5zZeKAmXMgRGVmZW5zZSBNYW5wb3dlciBEYXRhIENlbnRlciAoRE1EQykuIFRoZSBvcmlnaW5hbCBkYXRhIGVuZGVkIGluIDIwMDUgYW5kIHdlIGhhdmUgdXBkYXRlZCBpdCB0byBydW4gdGhyb3VnaCAyMDIwDQoNCmBgYHtyfQ0KbGlicmFyeSh0cm9vcGRhdGEpDQoNCnRyb29wc191cyA8LSBnZXRfdHJvb3BkYXRhKHN0YXJ0eWVhciA9IDIwMTMsIGVuZHllYXIgPSAyMDIwKQ0KDQpgYGANCg0KDQoNCmBgYHtyfQ0KDQp1c19iYXNlX2RmIDwtcmVhZC5jc3YoIkM6L1VzZXJzL1BhdWxhL0Rlc2t0b3AvUERfb3JpZ2luYWxfZGF0YXNldHMvQmFzZXMuY3N2IikgDQogIA0KdXNfYmFzZV9kZiAlPiUgDQogIGZpbHRlcihiYXNlID09IDEpICU+JQ0KICBncm91cF9ieShDb3VudHJ5Lk5hbWUpICU+JSANCiAgY291bnQoKSAlPiUgDQogIGFycmFuZ2UoZGVzYyhuKSkgJT4lIA0KICBmaWx0ZXIobiA+IDIpICU+JSANCiAga2JsKCkgJT4lDQogIGthYmxlX3BhcGVyKCJzdHJpcGVkIiwNCiAgICAgICAgICAgICAgZnVsbF93aWR0aCA9IEYpDQoNCiAgdXNfYmFzZV9kZiAlPiUgDQogIGZpbHRlcihsaWx5cGFkID09IDEpICU+JQ0KICBncm91cF9ieShDb3VudHJ5Lk5hbWUpICU+JSANCiAgY291bnQoKSAlPiUgDQogIGFycmFuZ2UoZGVzYyhuKSkgJT4lIA0KICBmaWx0ZXIobiA+IDIpICU+JSANCiAga2JsKCkgJT4lDQogIGthYmxlX3BhcGVyKCJzdHJpcGVkIiwNCiAgICAgICAgICAgICAgZnVsbF93aWR0aCA9IEYpDQoNCiAgdXNfYmFzZV9kZiAlPiUgDQogIGdyb3VwX2J5KENvdW50cnkuTmFtZSkgJT4lIA0KICBjb3VudCgpICU+JSANCiAgYXJyYW5nZShkZXNjKG4pKSAlPiUgDQogIGZpbHRlcihuID4gNSkgJT4lIA0KICBrYmwoKSAlPiUNCiAga2FibGVfcGFwZXIoInN0cmlwZWQiLA0KICAgICAgICAgICAgICBmdWxsX3dpZHRoID0gRikNCiAgDQojIHdhcl9vbl90ZXJyb3IgPC0gYygiQWZnaGFuaXN0YW4iLCAiWWVtZW4iLCAiU3lyaWEiLCAiSXJhcSIsICJQYWtpc3RhbiIpDQojIA0KIyBteV9wZDkgJTw+JQ0KIyAgIGRwbHlyOjptdXRhdGUod2FyX29uX3RlcnJvciA9IGlmZWxzZShjb3VudHJ5X25hbWUgJWluJSB3YXJfb25fdGVycm9yLCAxLCAwKSkgDQoNCiAgDQpgYGANCg0KDQoNCg0KIyBVTiBWT1RJTkcgVFdPIENMVVNURVJTIA0KDQoNCmBgYHtyIHVuX2NsdXN0ZXJzfQ0KDQojIHRoZV9kZiAlPiUgDQojICAgIGZpbHRlcih5ZWFyID09IDIwMTQpICU+JSANCiMgICAgc2VsZWN0KGNvdW50cnksIGlkZWFsX3BvaW50X2Rpc3RhbmNlKSAlPiUgDQojICAgIGFycmFuZ2UoZGVzYyhpZGVhbF9wb2ludF9kaXN0YW5jZSkpDQojIA0KDQojIA0KIyANCiMgbmFtZXModGhlX2RmKQ0KIyANCiMgbG93X21vZGVsICA8LSBwbG0obGVhZChsb2coYnVkZ2V0X3BjKSkgfiBsb2coZ2RwX3BjX2NvbnN0KSArIA0KIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2cocG9wKSArIA0KIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2codXNfZXhwb3J0c19wYykgKw0KIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaXZfbGliX2ZoICsNCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVsaWdfZnJhYyArDQojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bGVfbGF3X2ZoLA0KIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhID0gbG93X3VuLA0KIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RlbCA9ICJ3aXRoaW4iLCBlZmZlY3QgPSAidGltZSIsDQojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4ID0gYygiY293X2NvZGUiLCAieWVhciIpKQ0KIyANCiMgDQojIGhpZ2hfbW9kZWwgIDwtIHBsbShsZWFkKGxvZyhidWRnZXRfcGMpKSB+IGxvZyhnZHBfcGNfY29uc3QpICsgDQojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZyhwb3ApICsgDQojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZyh1c19leHBvcnRzX3BjKSArDQojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNpdl9saWJfZmggKw0KIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWxpZ19mcmFjICsNCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVsZV9sYXdfZmgsDQojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBoaWdoX3VuLA0KIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RlbCA9ICJ3aXRoaW4iLCBlZmZlY3QgPSAidGltZSIsDQojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4ID0gYygiY293X2NvZGUiLCAieWVhciIpKQ0KIyANCiMgc3RhcmdhemVyKGxvd19tb2RlbCwgaGlnaF9tb2RlbCwgY29sdW1uLmxhYmVscyA9IGMoIkxvdyIsICJIaWdoIiksDQojICAgICAgICAgICB0eXBlID0gInRleHQiKQ0KDQoNCmBgYA0KIA0KDQoNCiMgRml2ZSB5ZWFyIGF2ZXJhZ2VzIG9mIGRlcGVuZGVudCB2YXJpYWJsZXMNCg0KYGBge3J9DQoNCiMgdGhlX2RmJHBlcmlvZCA8LSBjdXQodGhlX2RmJHllYXIsIHNlcSgyMDEzLCAyMDE4LCAxKSkgDQojIA0KIyBwd3QubWEgPC0gZGRwbHkocHd0LCAuKGNvdW50cnksIHBlcmlvZCksIG51bWNvbHdpc2UobWVhbikpDQojIA0KIyBwd3QubWENCiMgDQojIA0KYGBgDQoNCg0KYGBge3J9DQoNCg0KZXhjbHVkaW5nX2NvdW50cmllcyA8LSBjKCJDdWJhIiwgIlN5cmlhIiwgIlllbWVuIiwgIkxpYnlhIikNCg0KDQp0aGVfZGYgJTw+JQ0KICBtdXRhdGUobXVzbGltX3BlcmNlbnQgPSBwZXJjZW50X211c2xpbV9qaXR0ZXIgLyBwb3AsIG5hLnJtID0gVFJVRSkgJT4lDQogIGZpbHRlcighaXMubmEoY293X2NvZGUpKQ0KDQphc2lhX2RmIDwtIHRoZV9kZiAlPiUNCiAgZmlsdGVyKHJlZ2lvbl82ID09ICJBc2lhIikNCmFmcmljYV9kZiA8LSB0aGVfZGYgJT4lDQogIGZpbHRlcihyZWdpb25fNiA9PSAiQWZyaWNhIikNCm1lbmFfZGYgPC0gdGhlX2RmICU+JQ0KICBmaWx0ZXIocmVnaW9uXzYgPT0gIk1FTkEiKQ0Kd2VzdF9kZiA8LSB0aGVfZGYgJT4lDQogIGZpbHRlcihyZWdpb25fNiA9PSAiV2VzdCIpDQpsYXRpbl9kZiA8LSB0aGVfZGYgJT4lDQogIGZpbHRlcihyZWdpb25fNiA9PSAiTGF0aW4iKQ0Kc292aWV0X2RmIDwtIHRoZV9kZiAlPiUNCiAgZmlsdGVyKHJlZ2lvbl82ID09ICJQb3N0IFNvdmlldCIpDQoNCmR2IDwtICJsb2coYnVkZ2V0KSINCg0KDQoNCml2cyA8LSBjKCJlbGVjdG9yYWxfZGVtbyIsDQogICAgICAgICAibG9nKGdkcF9wY19jb25zdCkiLA0KICAgICAgICAgImxvZyhwb3ApIiwNCiAgICAgICAgICJtdXNsaW1fcGVyY2VudCIpDQoNCg0KDQoNCmZvcm1fMSA8LSBhcy5mb3JtdWxhKHBhc3RlKGR2LCBwYXN0ZShpdnMsIGNvbGxhcHNlID0gIiArICIpLCBzZXAgPSAiIH4gIikpDQoNCg0KYGBgDQo=