Introduction and data import

This R file generates the daily and weekly speech databases.

setwd("C:/Users/fkraus/Desktop/Articles/effects of CB speeches on stablecoins/2025")

# Packages
require(gt)
require(gtsummary)
library(dplyr)
library(tidyr)
library(stringr)
library(lubridate)
library(readr)
library(purrr)
library(httr)
library(jsonlite)
library(data.table)   # pratique pour expansions rapides
library(fixest)
library(ggplot2)
require(scales)

options(dplyr.summarise.inform = FALSE)
theme_set(theme_minimal(base_size = 12))

sent_pred <-   read.csv(file="C:/Users/fkraus/Desktop/Articles/effects of CB speeches on stablecoins/2025/2b_cbdc_sentence_preds_with_author_desc.csv") 
countries <-   read.csv(file="C:/Users/fkraus/Desktop/Articles/effects of CB speeches on stablecoins/2025/countries2.csv", sep=";")
titles <-   read.csv(file="C:/Users/fkraus/Desktop/Articles/effects of CB speeches on stablecoins/2025/cbdc_title_flags_from_matches.csv")

Speech database

Sentence-level database

Data import

We use the database 2b_cbdc_sentence_preds_with_author_desc.csv downloaded from the Kaggle notebook. We also use the countries2.csv file that merge the authors of speeches with their Central Bank and Countries. For some cases, there are multiple authors for a specific speech. Fortunately, these case are rare and they group authors from the same Central Banks and the same Countries. We manually retrieve their informations and add them directly.

sent_pred2 <- sent_pred %>%
  select(-c(country,description) )%>%
  distinct()%>%
  left_join(countries%>%unique(), by=c("author"))%>%
  mutate(Country =case_when(
    author=="Jacqueline Loh; Benoît Cœuré" ~ "ECB Board", 
    author=="Thomas Jordan; Martin Schlegel; Antoine Martin"~"Switzerland", 
    author=="Petra Tschudin; Thomas Moser"~"Switzerland",
    author=="Olaf Sleijpen; Klaas Knot; Steven Maijoor" ~ "Netherlands",
    TRUE ~ Country))%>% 
  mutate(Central_Bank =case_when(
    author=="Jacqueline Loh; Benoît Cœuré" ~ "European Central Bank", 
    author=="Thomas Jordan; Martin Schlegel; Antoine Martin"~"Swiss National Bank", 
    author=="Petra Tschudin; Thomas Moser"~"Swiss National Bank",
    author=="Olaf Sleijpen; Klaas Knot; Steven Maijoor" ~ "European Central Bank",
    TRUE ~ Central_Bank))%>%
  mutate(
    datetime = parse_date_time(
      date,
      orders = c("d/m/Y H:M:S", "d/m/Y H:M", "Y-m-d H:M:S", "Y-m-d H:M"),
      tz = "UTC"  
    ),
    date = as_date(datetime)  # keep a pure Date too (optional)
  )%>%select(-datetime)%>%
  filter(date >= as.Date("2015-01-01"))%>% select(-X)

We save the complete list of speeches in a .csv file (completelist.csv). Note that the database has loose keywords conditions, in order to capture all speeches related to CBDC. However, some sentences are linked to titles and/or references, or to crypto-assets exclusively (see for example the first observations above).

write.table(sent_pred2,
            file = "C:/Users/fkraus/Desktop/Articles/effects of CB speeches on stablecoins/2025/completelist.csv",
            sep = ";", dec = ".",
            row.names = FALSE, col.names = TRUE,
            fileEncoding = "UTF-8")

We manually note each title. The dataset list.csv is the same as completelist.csv, with an additional column cbdc_sentence that is equal to FALSE when sentences are related to keywords in title or in references. We then remove these “wrong” sentences, and add the corresponding currency to each Central Bank manually.

auer_data <- readxl::read_excel("C:/users/fkraus/Desktop/Articles/effects of CB speeches on stablecoins/speechesstances.xlsx")%>%filter(source=="auer")

sentence_base <- read.csv2("C:/Users/fkraus/Desktop/Articles/effects of CB speeches on stablecoins/2025/list.csv",
                        fileEncoding = "UTF-8",
                        stringsAsFactors = FALSE)%>%
  left_join(titles %>% select(url, cbdc_in_title), by='url')%>%
  unique()%>%
  mutate(cbdc_sentence = ifelse(is.na(cbdc_sentence), "TRUE",cbdc_sentence))%>%
  filter(!cbdc_sentence=="FALSE")%>% # we only keep the true CBDC-related sentences
  mutate(
    datetime = parse_date_time(
      date,
      orders = c("d/m/Y H:M:S", "d/m/Y H:M", "Y-m-d H:M:S", "Y-m-d H:M"),
      tz = "UTC"   
    ),
    date = as_date(datetime)  
  )%>%select(-datetime) %>%
select(-c(match_type,  keyword,source,  cbdc_sentence))%>%
  mutate(date = as.Date(date)) %>%
  distinct()%>%
  mutate(Currency = case_when(
    Central_Bank == "Bank of England" ~ "GBP", 
    Central_Bank == "European Central Bank" ~ "EUR", 
    Central_Bank == "Bank of Japan" ~ "JPY", 
    Central_Bank == "Bank of Canada" ~ "CAD", 
    Central_Bank == "Reserve Bank of Australia" ~ "AUD", 
    Central_Bank == "Monetary Authority of Singapore" ~ "SGD", 
    Central_Bank == "Sveriges Riksbank" ~ "SEK", 
    Central_Bank == "Bank of Korea" ~ "KRW", 
    Central_Bank == "Fed" ~ "USD", 
    Central_Bank == "Central Bank of Malaysia" ~ "MYR", 
    Central_Bank == "Central Bank of Chile" ~ "CLP", 
    Central_Bank == "National Bank of the Republic of (North) Macedonia" ~ "MKD", 
    Central_Bank == "Czech National Bank" ~ "CZK", 
    Central_Bank == "South African Reserve Bank" ~ "ZAR", 
    Central_Bank == "Bank of Botswana" ~ "BWP", 
    Central_Bank == "Central Bank of Barbados" ~ "BBD", 
    Central_Bank == "National Bank of Denmark" ~ "DKK", 
    Central_Bank == "Bank of Mauritius" ~ "MUR", 
    Central_Bank == "State Bank of Pakistan" ~ "PKR", 
    Central_Bank == "Central Bank of Sri Lanka"    ~ "LKR", 
    Central_Bank ==  "Swiss National Bank"  ~ "CHF", 
    Central_Bank ==  "Central Bank of the Philippines"  ~ "PHP", 
    Central_Bank == "Central Bank of Iceland"  ~ "ISK", 
    Central_Bank ==  "Bank of Thailand"  ~ "THB", 
    Central_Bank ==  "Reserve Bank of New Zealand" ~ "NZD", 
    Central_Bank == "Eastern Caribbean Central Bank" ~ "XCD", 
    Central_Bank == "Central Bank of The Bahamas"  ~ "BSD", 
    Central_Bank == "Hong Kong Monetary Authority" ~ "HKD", 
    Central_Bank ==  "Norges Bank"   ~ "NOK", 
    Central_Bank ==   "Central Bank of Bosnia and Herzegovina"     ~ "BAM", 
    Central_Bank ==  "Central Bank of Kuwait"  ~ "KWD", 
    Central_Bank == "Central Bank of Morocco"  ~ "MAD", 
    Central_Bank ==   "Bank of Mexico"  ~ "MXN", 
    Central_Bank == "Bank of Albania"   ~ "ALL", 
    Central_Bank ==   "Bank of Russia"  ~ "RUB", 
    Central_Bank == "Reserve Bank of India"  ~ "INR", 
    Central_Bank == "People's Bank of China" ~ "CNY", 
    Central_Bank == "Bank Indonesia"     ~ "IDR", 
    Central_Bank ==   "Central Bank of Kenya"~ "KES", 
    Central_Bank ==  "Central Bank of Nigeria"     ~ "NGN", 
    Central_Bank ==  "National Bank of Serbia"    ~ "RSD", 
    Central_Bank == "Bank of Israel"   ~ "ILS", 
    Central_Bank == "Central Bank of the Republic of Kosovo"  ~ "EUR", 
    Central_Bank == "Bank of Finland"  ~ "EUR", 
    Central_Bank ==  "Central Bank of Nepal"  ~ "NPR", 
    Central_Bank ==  "Central Bank of Cyprus"  ~ "EUR", 
    Central_Bank == "Central Bank of Eswatini"  ~ "SZL", 
    Central_Bank == "Bank of Slovenia" ~ "EUR", 
    TRUE~"Other"
    ))%>%
  select(-c(X, X.1))
sentence_base%>%filter(Central_Bank=="Bank of Finland")

Statistics on sentence-level data

We now have a sentence-level clean database that contains the type_label (retail, wholesale, general/unspecified), the sentiment_label (positive, negative, neutral), stance_label (Pro-CBDC, Anti-CBDC, Wait-and-See) and discourse_label (Risk-Benefit, Feature, Process) associated with each sentence measured by BERT.

Summary statistics of sentence-level database (N = 5397 sentences)
Number of sentences Share within dimension
Discourse
Process 2,381 44.1%
Feature 1,543 28.6%
Risk-Benefit 1,473 27.3%
Sentiment
neutral 3,029 56.1%
positive 1,937 35.9%
negative 431 8.0%
Stance
Pro-CBDC 2,813 52.1%
Wait-and-See 2,051 38.0%
Anti-CBDC 533 9.9%
Type de CBDC
Retail CBDC 2,854 52.9%
General/Unspecified 2,114 39.2%
Wholesale CBDC 429 7.9%

In total, there are 5397 uniques sentences, mostly about Retail CBDC (53% of speeches), while unspecified (39%) and wholesale (8%) are relatively marginally mentioned. Overall, the sentiment is essentially neutral yet pro-CBDC. In addition, we can see that there are less speeches about wholesale CBDC, but they tend to be more positive/Pro-CBDC :

In addition, we can observe that some Central Banks - and notably ECB - tend to communicate more than others :

Day/Week-level database

We have sentiment, stance, discourse and type of CBDC discussed at sentence-level. We transform the sentiments (positive, neutral et negative) and stances (Pro-CBDC, Wait-and-See et Anti-CBDC) in numeric values (1, 0, -1) to obtain similar data as in Auer & al (2021) and Dionysopoulos & Makridis (2025).

Then, for a given speech, we measure the average sentiment and stance. We then aggregate the sentiment and stance daily-level as their average across all speeches that day.

We also decompose by type of CBDC discussed within each day, as well as for ECB, Fed and other central banks, and for developed versus emerging markets central banks.


bankday_type <- speech_level %>%
  group_by(date, Central_Bank, type_label) %>%
  summarise(
    sent_btk   = mean(sent_speech,   na.rm = TRUE),
    stance_btk = mean(stance_speech, na.rm = TRUE),
    .groups = "drop"
  )



type_daily <- bankday_type %>%
  group_by(date, type_label) %>%
  summarise(
    index_sent_type   = mean(sent_btk,   na.rm = TRUE),
    index_stance_type = mean(stance_btk, na.rm = TRUE),
    .groups = "drop"
  )


bankday_all <- bankday_type %>%
  group_by(date, Central_Bank) %>%
  summarise(
    sent_bt_all   = mean(sent_btk,   na.rm = TRUE),
    stance_bt_all = mean(stance_btk, na.rm = TRUE),
    .groups = "drop"
  )


sentence_base2 <- sentence_base%>%
  select(url, date)%>%
  distinct(url, date)%>%
  inner_join(auer_data%>%select(URL_text, speech_stance), by=c("url"="URL_text"))%>%
  group_by(date)%>%
  summarize(stance_auer = mean(speech_stance))

global_daily <- bankday_all %>%
  group_by(date) %>%
  summarise(
    index_sent_global   = mean(sent_bt_all,   na.rm = TRUE),
    index_stance_global = mean(stance_bt_all, na.rm = TRUE),
    .groups = "drop"
  )%>%
  left_join(sentence_base2, by="date")%>%
  mutate(speechday = 1)


global_daily_deveme <- bankday_all %>%
  mutate(deveme = case_when(Central_Bank %in% c("Bank of England", 
                                            "European Central Bank", 
                                            "Fed", 
                                            "Bank of Japan", 
                                            "Bank of Canada", 
                                            "Reserve Bank of Australia", 
                                            "Sveriges Riksbank", 
                                            "Swiss National Bank", 
                                            "Central Bank of Iceland", "Norges Bank", 
                                            "National Bank of Denmark",
                                            "Reserve Bank of New Zealand", "Bank of Finland")  ~"Developed", 
                       TRUE ~"Emerging"))%>%
  group_by(deveme, date)%>%
  summarise(index_sent_deveme = mean(sent_bt_all,na.rm = TRUE), 
              index_stance_deveme=mean(stance_bt_all,na.rm = TRUE))%>%
  arrange(date)%>%ungroup()%>% 
  dplyr::rename(
    sent  = index_sent_deveme,
    stance = index_stance_deveme
  ) %>% 
  pivot_wider(
    id_cols   = date,
    names_from  = deveme,              # "Developed", "Emerging"
    values_from = c(sent, stance),
    names_glue  = "{.value}_{deveme}",  # sent_Developed, stance_Developed, etc.
    values_fill = list(sent = 0, stance = 0)
  )


global_daily_decomposed <- bankday_all %>%
  mutate(CB = case_when(Central_Bank %in% c(
    "European Central Bank") ~ "ECB", 
    Central_Bank =="Fed" ~ "Fed",
    TRUE ~ "Other"))%>%
  group_by(CB, date)%>%
  summarise(index_sent_cb = mean(sent_bt_all,na.rm = TRUE), 
              index_stance_cb=mean(stance_bt_all,na.rm = TRUE))%>%
  arrange(date)%>%ungroup()%>% 
  dplyr::rename(
    sent  = index_sent_cb,
    stance = index_stance_cb
  ) %>% 
  pivot_wider(
    id_cols   = date,
    names_from  = CB,              # "Developed", "Emerging"
    values_from = c(sent, stance),
    names_glue  = "{.value}_{CB}",  # sent_Developed, stance_Developed, etc.
    values_fill = list(sent = 0, stance = 0)
  )


global_daily_fedecb <- bankday_all %>%
  mutate(CB = case_when(Central_Bank %in% c(
    "European Central Bank", "Fed") ~ "ECBFED", 
    TRUE ~ "nonECBFED"))%>%
  group_by(CB, date)%>%
  summarise(index_sent_cb = mean(sent_bt_all,na.rm = TRUE), 
              index_stance_cb=mean(stance_bt_all,na.rm = TRUE))%>%
  arrange(date)%>%ungroup()%>% 
  dplyr::rename(
    sent  = index_sent_cb,
    stance = index_stance_cb
  ) %>% 
  pivot_wider(
    id_cols   = date,
    names_from  = CB,              # "Developed", "Emerging"
    values_from = c(sent, stance),
    names_glue  = "{.value}_{CB}",  # sent_Developed, stance_Developed, etc.
    values_fill = list(sent = 0, stance = 0)
  )

deveme_cb <- global_daily_deveme %>%
  left_join(global_daily_decomposed, by="date")%>%
  left_join(global_daily_fedecb, by="date")

Dynamics of speeches sentiments

Weekly

weekly_sentiment_plot <- cbdc_idx_weekly_labels%>%ggplot(aes(x=date_week, y=index_sent_global))+
  geom_point()+geom_line(lwd=.5, lty=2)+labs(x="", y="Weekly Sentiment")

daily_sentiment_plot <- cbdc_idx_daily_labels%>%ggplot(aes(x=date, y=index_sent_global))+
  geom_point(size=1)+geom_line(lwd=.5, lty=2)+labs(x="", y="Daily Sentiment")

daily_sentiment_plot/weekly_sentiment_plot 

Statistics of weekly speeches

global_daily %>%
  left_join(type_daily_sent_wide,   by = "date") %>%
  left_join(type_daily_stance_wide, by = "date") %>%
  left_join(deveme_cb,              by = "date") %>%
  arrange(date) %>%
  mutate(week = floor_date(date, unit = "week")) %>%
  group_by(week) %>%
  summarise(across(where(is.numeric), ~ mean(.x, na.rm = TRUE)), .groups = "drop") %>%
  select(-speechday)%>%
  tbl_summary(
    type = list(
      all_continuous() ~ "continuous2",  # tous les continus
      week ~ "continuous"               # sauf week
    ),
    statistic = list(
      all_continuous() ~ c("{mean} ({sd})"),
      week ~ "{min}, {max}"             # seulement min/max pour week
    ),
    label = week ~ "Week (min, max)"
  )%>%
  modify_footnote(everything() ~ NA_character_)
Characteristic N = 295
Week (min, max) 2016-02-28, 2025-06-15
index_sent_global
    Mean (SD) 0.33 (0.37)
index_stance_global
    Mean (SD) 0.50 (0.38)
stance_auer
    Mean (SD) 0.45 (0.63)
    Unknown 99
sent_General.Unspecified
    Mean (SD) 0.23 (0.38)
    Unknown 26
sent_Retail.CBDC
    Mean (SD) 0.30 (0.40)
    Unknown 73
sent_Wholesale.CBDC
    Mean (SD) 0.69 (0.40)
    Unknown 153
stance_General.Unspecified
    Mean (SD) 0.44 (0.40)
    Unknown 26
stance_Retail.CBDC
    Mean (SD) 0.44 (0.45)
    Unknown 73
stance_Wholesale.CBDC
    Mean (SD) 0.78 (0.36)
    Unknown 153
sent_Developed
    Mean (SD) 0.20 (0.30)
sent_Emerging
    Mean (SD) 0.16 (0.30)
stance_Developed
    Mean (SD) 0.33 (0.34)
stance_Emerging
    Mean (SD) 0.21 (0.34)
sent_Other
    Mean (SD) 0.19 (0.31)
sent_ECB
    Mean (SD) 0.18 (0.29)
sent_Fed
    Mean (SD) -0.0032 (0.0580)
stance_Other
    Mean (SD) 0.28 (0.35)
stance_ECB
    Mean (SD) 0.27 (0.33)
stance_Fed
    Mean (SD) 0.011 (0.083)
sent_nonECBFED
    Mean (SD) 0.19 (0.31)
sent_ECBFED
    Mean (SD) 0.17 (0.30)
stance_nonECBFED
    Mean (SD) 0.28 (0.35)
stance_ECBFED
    Mean (SD) 0.27 (0.33)

Stablecoins supply data

Data import

Statistics

panel_artemis_trimmed %>%
  select(Date, supply, stablecoin)%>%
  tbl_summary(by=stablecoin,
    type = list(
      all_continuous() ~ "continuous2",  # tous les continus
      Date ~ "continuous"               # sauf week
    ),
    statistic = list(
      all_continuous() ~ c("{mean} ({sd})"),
      Date ~ "{min}, {max}"             # seulement min/max pour week
    ),
    label = Date ~ "Date (min, max)"
  )%>%
  modify_footnote(everything() ~ NA_character_)
Characteristic AYSD
N = 391
BUSD
N = 340
cEUR
N = 1,401
cUSD
N = 47
DAI
N = 1,944
EURC
N = 1,069
FDUSD
N = 727
PYUSD
N = 694
USD0
N = 372
USDC
N = 2,296
USDe
N = 588
USDGLO
N = 546
USDP
N = 2,310
USDS
N = 321
USDT
N = 2,825
USDY
N = 584
Date (min, max) 2024-08-05, 2025-10-21 2024-08-31, 2025-10-21 2021-07-11, 2025-10-21 2025-08-29, 2025-10-21 2019-11-23, 2025-10-21 2022-07-09, 2025-10-21 2023-08-05, 2025-10-21 2023-09-09, 2025-10-21 2024-08-28, 2025-10-21 2018-10-17, 2025-10-21 2024-01-05, 2025-10-19 2024-02-01, 2025-10-21 2018-10-10, 2025-10-21 2024-10-26, 2025-10-21 2015-12-08, 2025-10-21 2024-01-05, 2025-10-21
supply















    Mean (SD) 70,719,608 (68,990,092) 337,130,067 (25,003,950) 18,296,966 (13,327,185) 146,370,152 (69,792,967) 4,448,341,212 (2,356,732,077) 84,686,832 (66,646,634) 1,868,248,233 (913,223,249) 626,776,286 (484,825,385) 671,778,959 (341,271,342) 28,755,546,082 (21,595,129,898) 4,822,102,281 (3,431,221,409) 3,093,883 (644,218) 463,487,550 (374,289,377) 7,149,699,496 (1,069,000,697) 57,454,318,058 (52,167,651,561) 374,343,880 (210,577,377)

Final Database

Daily

data_artemis <-panel_artemis_trimmed%>%
  left_join(cbdc_idx_daily_labels, by=c("Date"="date"))%>%
  mutate(quarteryear = paste0(quarter(Date), year(Date) ))%>%
  left_join(GPR, by=c("Date"="date"))%>%
  left_join(vix_data, by=c("Date"="date"))%>%
  arrange(stablecoin, Date)%>%
  mutate(FTX = ifelse(Date > as.Date("2022-11-01"),1,0 ))%>%
  mutate(Luna = ifelse(Date > as.Date("2022-05-01"),1,0 ))%>%
  mutate(pegType = case_when(
    stablecoin == "USDT"~ "USD",
    stablecoin == "USDP"~ "USD",
    stablecoin == "USDC"~ "USD",
    stablecoin == "DAI"~ "USD",
    stablecoin == "cEUR"~ "EUR",
    stablecoin == "EURC"~ "EUR",
    stablecoin == "FDUSD"~ "USD",
    stablecoin == "PYUSD"~ "USD",
    stablecoin == "USDY"~ "USD",
    stablecoin == "USDe"~ "USD",
    stablecoin == "USDGLO"~ "USD",
    stablecoin == "AYSD"~ "USD",
    stablecoin == "BUSD"~ "USD",
    stablecoin == "USD0"~ "USD",
    stablecoin == "USDS"~ "USD",
    stablecoin == "cUSD"~ "USD"
    ))%>%
  mutate(pegMechanism = case_when(
    stablecoin == "USDT"~ "fiat",
    stablecoin == "USDP"~ "fiat",
    stablecoin == "USDC"~ "fiat",
    stablecoin == "DAI"~ "crypto",
    stablecoin == "cEUR"~ "algo",
    stablecoin == "EURC"~ "fiat",
    stablecoin == "FDUSD"~ "fiat",
    stablecoin == "PYUSD"~ "fiat",
    stablecoin == "USDY"~ "fiat",
    stablecoin == "USDe"~ "fiat",
    stablecoin == "USDGLO"~ "fiat",
    stablecoin == "AYSD"~ "fiat",
    stablecoin == "BUSD"~ "fiat",
    stablecoin == "USD0"~ "fiat",
    stablecoin == "USDS"~ "fiat",
    stablecoin == "cUSD"~ "fiat"
    
  ))%>%
  mutate(across(-Date, ~ tidyr::replace_na(.x, 0)))%>% # remove this to replace 0 with NA when there's no speech
  rename_with(~ gsub("\\.", "_", .x))

Weekly

data_artemis_weekly <-panel_artemis_trimmed_weekly%>%
  left_join(cbdc_idx_weekly_labels, by=c("week"="date_week"))%>%
  mutate(quarteryear = paste0(quarter(week), year(week) ))%>%
  left_join(vix_data_weekly, by="week")%>%
  left_join(GPR_data_weekly, by="week")%>%
  arrange(stablecoin, week)%>%
  dplyr::select(stablecoin, week,everything())%>%
  #na.omit()%>%
  mutate(FTX = ifelse(week > as.Date("2022-11-01"),1,0 ))%>%
  mutate(Luna = ifelse(week > as.Date("2022-05-01"),1,0 ))%>%
  arrange(stablecoin, week)%>%
  mutate(pegType = case_when(
    stablecoin == "USDT"~ "USD",
    stablecoin == "USDP"~ "USD",
    stablecoin == "USDC"~ "USD",
    stablecoin == "DAI"~ "USD",
    stablecoin == "cEUR"~ "EUR",
    stablecoin == "EURC"~ "EUR",
    stablecoin == "FDUSD"~ "USD",
    stablecoin == "PYUSD"~ "USD",
    stablecoin == "USDY"~ "USD",
    stablecoin == "USDe"~ "USD",
    stablecoin == "USDGLO"~ "USD",
    stablecoin == "AYSD"~ "USD",
    stablecoin == "BUSD"~ "USD",
    stablecoin == "USD0"~ "USD",
    stablecoin == "USDS"~ "USD",
    stablecoin == "cUSD"~ "USD"
    ))%>%
  mutate(pegMechanism = case_when(
    stablecoin == "USDT"~ "fiat",
    stablecoin == "USDP"~ "fiat",
    stablecoin == "USDC"~ "fiat",
    stablecoin == "DAI"~ "crypto",
    stablecoin == "cEUR"~ "algo",
    stablecoin == "EURC"~ "fiat",
    stablecoin == "FDUSD"~ "fiat",
    stablecoin == "PYUSD"~ "fiat",
    stablecoin == "USDY"~ "fiat",
    stablecoin == "USDe"~ "fiat",
    stablecoin == "USDGLO"~ "fiat",
    stablecoin == "AYSD"~ "fiat",
    stablecoin == "BUSD"~ "fiat",
    stablecoin == "USD0"~ "fiat",
    stablecoin == "USDS"~ "fiat",
    stablecoin == "cUSD"~ "fiat"
    
  ))%>%
  mutate(across(-stablecoin, ~ tidyr::replace_na(.x, 0)))%>%# remove this to replace 0 with NA when there's no speech
  rename_with(~ gsub("\\.", "_", .x))

library(haven)
#haven::write_dta(data_artemis, "C:/users/fkraus/Desktop/Articles/effects of CB speeches on stablecoins/2025/data_artemis.dta")
#haven::write_dta(data_artemis_weekly, "C:/users/fkraus/Desktop/Articles/effects of CB speeches on stablecoins/2025/data_artemis_weekly.dta")
data_artemis_weekly

Local Projections

\[ Y_{i,t+h}-Y_{i,t-1}= \alpha_i+ \alpha_q + \beta^h \Delta X_t + \gamma Z_t + \mu_{i,t} \] Where \(Y\) is the log-difference of stablecoin supply, \(\alpha_i\) is an individual FE, and \(X_t\) is our index of speech CBDC-related sentiment/stance. \(Z_t\) are control variables representing the VIX and the GPRD and their lags, and dummies representing Terra-Luna and FTX crashes. We include individual (\(\alpha_i\)) and quarter-year (\(\alpha_q\)) fixed-effects.
Note : we take the 90% interval confidences for all estimations. Standard errors are heteroskedasticity robusts (clusterized by stablecoin). Data are in weekly frequencies.

Baseline results

IRFs Effect of sentiment/stance shocks on the log-difference supply (from Artemis.xyz).

Developed Versus Emerging Central Banks

ECB, Fed and Other

Effect on fiat currency

LS0tDQp0aXRsZTogIlIgTm90ZWJvb2s6IENCREMgU3BlZWNoZXMiDQpvdXRwdXQ6DQogIGh0bWxfbm90ZWJvb2s6IA0KICAgIHRvYzogdHJ1ZQ0KICAgIHRvY19kZXB0aDogMw0KICAgIHRvY19mbG9hdDogdHJ1ZQ0KICBodG1sX2RvY3VtZW50Og0KICAgIGRmX3ByaW50OiBwYWdlZA0KICB3b3JkX2RvY3VtZW50OiBkZWZhdWx0DQogIHBkZl9kb2N1bWVudDogZGVmYXVsdA0KLS0tDQoNCg0KIyBJbnRyb2R1Y3Rpb24gYW5kIGRhdGEgaW1wb3J0DQoNClRoaXMgUiBmaWxlIGdlbmVyYXRlcyB0aGUgZGFpbHkgYW5kIHdlZWtseSBzcGVlY2ggZGF0YWJhc2VzLg0KDQoNCg0KYGBge3Igc2V0dXAsIGNvbGxhcHNlPVRSVUV9DQpzZXR3ZCgiQzovVXNlcnMvZmtyYXVzL0Rlc2t0b3AvQXJ0aWNsZXMvZWZmZWN0cyBvZiBDQiBzcGVlY2hlcyBvbiBzdGFibGVjb2lucy8yMDI1IikNCg0KIyBQYWNrYWdlcw0KcmVxdWlyZShndCkNCnJlcXVpcmUoZ3RzdW1tYXJ5KQ0KbGlicmFyeShkcGx5cikNCmxpYnJhcnkodGlkeXIpDQpsaWJyYXJ5KHN0cmluZ3IpDQpsaWJyYXJ5KGx1YnJpZGF0ZSkNCmxpYnJhcnkocmVhZHIpDQpsaWJyYXJ5KHB1cnJyKQ0KbGlicmFyeShodHRyKQ0KbGlicmFyeShqc29ubGl0ZSkNCmxpYnJhcnkoZGF0YS50YWJsZSkgICAjIHByYXRpcXVlIHBvdXIgZXhwYW5zaW9ucyByYXBpZGVzDQpsaWJyYXJ5KGZpeGVzdCkNCmxpYnJhcnkoZ2dwbG90MikNCnJlcXVpcmUoc2NhbGVzKQ0KDQpvcHRpb25zKGRwbHlyLnN1bW1hcmlzZS5pbmZvcm0gPSBGQUxTRSkNCnRoZW1lX3NldCh0aGVtZV9taW5pbWFsKGJhc2Vfc2l6ZSA9IDEyKSkNCg0Kc2VudF9wcmVkIDwtICAgcmVhZC5jc3YoZmlsZT0iQzovVXNlcnMvZmtyYXVzL0Rlc2t0b3AvQXJ0aWNsZXMvZWZmZWN0cyBvZiBDQiBzcGVlY2hlcyBvbiBzdGFibGVjb2lucy8yMDI1LzJiX2NiZGNfc2VudGVuY2VfcHJlZHNfd2l0aF9hdXRob3JfZGVzYy5jc3YiKSANCmNvdW50cmllcyA8LSAgIHJlYWQuY3N2KGZpbGU9IkM6L1VzZXJzL2ZrcmF1cy9EZXNrdG9wL0FydGljbGVzL2VmZmVjdHMgb2YgQ0Igc3BlZWNoZXMgb24gc3RhYmxlY29pbnMvMjAyNS9jb3VudHJpZXMyLmNzdiIsIHNlcD0iOyIpDQp0aXRsZXMgPC0gICByZWFkLmNzdihmaWxlPSJDOi9Vc2Vycy9ma3JhdXMvRGVza3RvcC9BcnRpY2xlcy9lZmZlY3RzIG9mIENCIHNwZWVjaGVzIG9uIHN0YWJsZWNvaW5zLzIwMjUvY2JkY190aXRsZV9mbGFnc19mcm9tX21hdGNoZXMuY3N2IikNCmBgYA0KDQojIFNwZWVjaCBkYXRhYmFzZQ0KDQojIyBTZW50ZW5jZS1sZXZlbCBkYXRhYmFzZQ0KDQojIyMgRGF0YSBpbXBvcnQNCg0KV2UgdXNlIHRoZSBkYXRhYmFzZSBgMmJfY2JkY19zZW50ZW5jZV9wcmVkc193aXRoX2F1dGhvcl9kZXNjLmNzdmAgZG93bmxvYWRlZCBmcm9tIHRoZSBLYWdnbGUgbm90ZWJvb2suIFdlIGFsc28gdXNlIHRoZSBgY291bnRyaWVzMi5jc3ZgIGZpbGUgdGhhdCBtZXJnZSB0aGUgYXV0aG9ycyBvZiBzcGVlY2hlcyB3aXRoIHRoZWlyIENlbnRyYWwgQmFuayBhbmQgQ291bnRyaWVzLiBGb3Igc29tZSBjYXNlcywgdGhlcmUgYXJlIG11bHRpcGxlIGF1dGhvcnMgZm9yIGEgc3BlY2lmaWMgc3BlZWNoLiBGb3J0dW5hdGVseSwgdGhlc2UgY2FzZSBhcmUgcmFyZSBhbmQgdGhleSBncm91cCBhdXRob3JzIGZyb20gdGhlIHNhbWUgQ2VudHJhbCBCYW5rcyBhbmQgdGhlIHNhbWUgQ291bnRyaWVzLiBXZSBtYW51YWxseSByZXRyaWV2ZSB0aGVpciBpbmZvcm1hdGlvbnMgYW5kIGFkZCB0aGVtIGRpcmVjdGx5Lg0KDQoNCmBgYHtyLCBlY2hvPVRSVUUsIHdhcm5pbmc9RkFMU0UsIGNvbGxhcHNlPVRSVUV9DQpzZW50X3ByZWQyIDwtIHNlbnRfcHJlZCAlPiUNCiAgc2VsZWN0KC1jKGNvdW50cnksZGVzY3JpcHRpb24pICklPiUNCiAgZGlzdGluY3QoKSU+JQ0KICBsZWZ0X2pvaW4oY291bnRyaWVzJT4ldW5pcXVlKCksIGJ5PWMoImF1dGhvciIpKSU+JQ0KICBtdXRhdGUoQ291bnRyeSA9Y2FzZV93aGVuKA0KICAgIGF1dGhvcj09IkphY3F1ZWxpbmUgTG9oOyBCZW5vw650IEPFk3Vyw6kiIH4gIkVDQiBCb2FyZCIsIA0KICAgIGF1dGhvcj09IlRob21hcyBKb3JkYW47IE1hcnRpbiBTY2hsZWdlbDsgQW50b2luZSBNYXJ0aW4ifiJTd2l0emVybGFuZCIsIA0KICAgIGF1dGhvcj09IlBldHJhIFRzY2h1ZGluOyBUaG9tYXMgTW9zZXIifiJTd2l0emVybGFuZCIsDQogICAgYXV0aG9yPT0iT2xhZiBTbGVpanBlbjsgS2xhYXMgS25vdDsgU3RldmVuIE1haWpvb3IiIH4gIk5ldGhlcmxhbmRzIiwNCiAgICBUUlVFIH4gQ291bnRyeSkpJT4lIA0KICBtdXRhdGUoQ2VudHJhbF9CYW5rID1jYXNlX3doZW4oDQogICAgYXV0aG9yPT0iSmFjcXVlbGluZSBMb2g7IEJlbm/DrnQgQ8WTdXLDqSIgfiAiRXVyb3BlYW4gQ2VudHJhbCBCYW5rIiwgDQogICAgYXV0aG9yPT0iVGhvbWFzIEpvcmRhbjsgTWFydGluIFNjaGxlZ2VsOyBBbnRvaW5lIE1hcnRpbiJ+IlN3aXNzIE5hdGlvbmFsIEJhbmsiLCANCiAgICBhdXRob3I9PSJQZXRyYSBUc2NodWRpbjsgVGhvbWFzIE1vc2VyIn4iU3dpc3MgTmF0aW9uYWwgQmFuayIsDQogICAgYXV0aG9yPT0iT2xhZiBTbGVpanBlbjsgS2xhYXMgS25vdDsgU3RldmVuIE1haWpvb3IiIH4gIkV1cm9wZWFuIENlbnRyYWwgQmFuayIsDQogICAgVFJVRSB+IENlbnRyYWxfQmFuaykpJT4lDQogIG11dGF0ZSgNCiAgICBkYXRldGltZSA9IHBhcnNlX2RhdGVfdGltZSgNCiAgICAgIGRhdGUsDQogICAgICBvcmRlcnMgPSBjKCJkL20vWSBIOk06UyIsICJkL20vWSBIOk0iLCAiWS1tLWQgSDpNOlMiLCAiWS1tLWQgSDpNIiksDQogICAgICB0eiA9ICJVVEMiICANCiAgICApLA0KICAgIGRhdGUgPSBhc19kYXRlKGRhdGV0aW1lKSAgIyBrZWVwIGEgcHVyZSBEYXRlIHRvbyAob3B0aW9uYWwpDQogICklPiVzZWxlY3QoLWRhdGV0aW1lKSU+JQ0KICBmaWx0ZXIoZGF0ZSA+PSBhcy5EYXRlKCIyMDE1LTAxLTAxIikpJT4lIHNlbGVjdCgtWCkNCg0KYGBgDQoNCldlIHNhdmUgdGhlIGNvbXBsZXRlIGxpc3Qgb2Ygc3BlZWNoZXMgaW4gYSBgLmNzdmAgZmlsZSAoYGNvbXBsZXRlbGlzdC5jc3ZgKS4gTm90ZSB0aGF0IHRoZSBkYXRhYmFzZSBoYXMgbG9vc2Uga2V5d29yZHMgY29uZGl0aW9ucywgaW4gb3JkZXIgdG8gY2FwdHVyZSBhbGwgc3BlZWNoZXMgcmVsYXRlZCB0byBDQkRDLiBIb3dldmVyLCBzb21lIHNlbnRlbmNlcyBhcmUgbGlua2VkIHRvIHRpdGxlcyBhbmQvb3IgcmVmZXJlbmNlcywgb3IgdG8gY3J5cHRvLWFzc2V0cyBleGNsdXNpdmVseSAoc2VlIGZvciBleGFtcGxlIHRoZSBmaXJzdCBvYnNlcnZhdGlvbnMgYWJvdmUpLg0KDQoNCmBgYHtyLCBlY2hvPVRSVUUsIGNvbGxhcHNlPVRSVUV9DQp3cml0ZS50YWJsZShzZW50X3ByZWQyLA0KICAgICAgICAgICAgZmlsZSA9ICJDOi9Vc2Vycy9ma3JhdXMvRGVza3RvcC9BcnRpY2xlcy9lZmZlY3RzIG9mIENCIHNwZWVjaGVzIG9uIHN0YWJsZWNvaW5zLzIwMjUvY29tcGxldGVsaXN0LmNzdiIsDQogICAgICAgICAgICBzZXAgPSAiOyIsIGRlYyA9ICIuIiwNCiAgICAgICAgICAgIHJvdy5uYW1lcyA9IEZBTFNFLCBjb2wubmFtZXMgPSBUUlVFLA0KICAgICAgICAgICAgZmlsZUVuY29kaW5nID0gIlVURi04IikNCmBgYA0KDQpXZSBtYW51YWxseSBub3RlIGVhY2ggdGl0bGUuIFRoZSBkYXRhc2V0IGBsaXN0LmNzdmAgaXMgdGhlIHNhbWUgYXMgYGNvbXBsZXRlbGlzdC5jc3ZgLCB3aXRoIGFuIGFkZGl0aW9uYWwgY29sdW1uIGBjYmRjX3NlbnRlbmNlYCB0aGF0IGlzIGVxdWFsIHRvIGBGQUxTRWAgd2hlbiBzZW50ZW5jZXMgYXJlIHJlbGF0ZWQgdG8ga2V5d29yZHMgaW4gdGl0bGUgb3IgaW4gcmVmZXJlbmNlcy4gV2UgdGhlbiByZW1vdmUgdGhlc2UgIndyb25nIiBzZW50ZW5jZXMsIGFuZCBhZGQgdGhlIGNvcnJlc3BvbmRpbmcgY3VycmVuY3kgdG8gZWFjaCBDZW50cmFsIEJhbmsgbWFudWFsbHkuDQoNCg0KYGBge3IsIGVjaG89VFJVRSwgY29sbGFwc2U9VFJVRX0NCmF1ZXJfZGF0YSA8LSByZWFkeGw6OnJlYWRfZXhjZWwoIkM6L3VzZXJzL2ZrcmF1cy9EZXNrdG9wL0FydGljbGVzL2VmZmVjdHMgb2YgQ0Igc3BlZWNoZXMgb24gc3RhYmxlY29pbnMvc3BlZWNoZXNzdGFuY2VzLnhsc3giKSU+JWZpbHRlcihzb3VyY2U9PSJhdWVyIikNCg0Kc2VudGVuY2VfYmFzZSA8LSByZWFkLmNzdjIoIkM6L1VzZXJzL2ZrcmF1cy9EZXNrdG9wL0FydGljbGVzL2VmZmVjdHMgb2YgQ0Igc3BlZWNoZXMgb24gc3RhYmxlY29pbnMvMjAyNS9saXN0LmNzdiIsDQogICAgICAgICAgICAgICAgICAgICAgICBmaWxlRW5jb2RpbmcgPSAiVVRGLTgiLA0KICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nc0FzRmFjdG9ycyA9IEZBTFNFKSU+JQ0KICBsZWZ0X2pvaW4odGl0bGVzICU+JSBzZWxlY3QodXJsLCBjYmRjX2luX3RpdGxlKSwgYnk9J3VybCcpJT4lDQogIHVuaXF1ZSgpJT4lDQogIG11dGF0ZShjYmRjX3NlbnRlbmNlID0gaWZlbHNlKGlzLm5hKGNiZGNfc2VudGVuY2UpLCAiVFJVRSIsY2JkY19zZW50ZW5jZSkpJT4lDQogIGZpbHRlcighY2JkY19zZW50ZW5jZT09IkZBTFNFIiklPiUgIyB3ZSBvbmx5IGtlZXAgdGhlIHRydWUgQ0JEQy1yZWxhdGVkIHNlbnRlbmNlcw0KICBtdXRhdGUoDQogICAgZGF0ZXRpbWUgPSBwYXJzZV9kYXRlX3RpbWUoDQogICAgICBkYXRlLA0KICAgICAgb3JkZXJzID0gYygiZC9tL1kgSDpNOlMiLCAiZC9tL1kgSDpNIiwgIlktbS1kIEg6TTpTIiwgIlktbS1kIEg6TSIpLA0KICAgICAgdHogPSAiVVRDIiAgIA0KICAgICksDQogICAgZGF0ZSA9IGFzX2RhdGUoZGF0ZXRpbWUpICANCiAgKSU+JXNlbGVjdCgtZGF0ZXRpbWUpICU+JQ0Kc2VsZWN0KC1jKG1hdGNoX3R5cGUsICBrZXl3b3JkLHNvdXJjZSwgIGNiZGNfc2VudGVuY2UpKSU+JQ0KICBtdXRhdGUoZGF0ZSA9IGFzLkRhdGUoZGF0ZSkpICU+JQ0KICBkaXN0aW5jdCgpJT4lDQogIG11dGF0ZShDdXJyZW5jeSA9IGNhc2Vfd2hlbigNCiAgICBDZW50cmFsX0JhbmsgPT0gIkJhbmsgb2YgRW5nbGFuZCIgfiAiR0JQIiwgDQogICAgQ2VudHJhbF9CYW5rID09ICJFdXJvcGVhbiBDZW50cmFsIEJhbmsiIH4gIkVVUiIsIA0KICAgIENlbnRyYWxfQmFuayA9PSAiQmFuayBvZiBKYXBhbiIgfiAiSlBZIiwgDQogICAgQ2VudHJhbF9CYW5rID09ICJCYW5rIG9mIENhbmFkYSIgfiAiQ0FEIiwgDQogICAgQ2VudHJhbF9CYW5rID09ICJSZXNlcnZlIEJhbmsgb2YgQXVzdHJhbGlhIiB+ICJBVUQiLCANCiAgICBDZW50cmFsX0JhbmsgPT0gIk1vbmV0YXJ5IEF1dGhvcml0eSBvZiBTaW5nYXBvcmUiIH4gIlNHRCIsIA0KICAgIENlbnRyYWxfQmFuayA9PSAiU3ZlcmlnZXMgUmlrc2JhbmsiIH4gIlNFSyIsIA0KICAgIENlbnRyYWxfQmFuayA9PSAiQmFuayBvZiBLb3JlYSIgfiAiS1JXIiwgDQogICAgQ2VudHJhbF9CYW5rID09ICJGZWQiIH4gIlVTRCIsIA0KICAgIENlbnRyYWxfQmFuayA9PSAiQ2VudHJhbCBCYW5rIG9mIE1hbGF5c2lhIiB+ICJNWVIiLCANCiAgICBDZW50cmFsX0JhbmsgPT0gIkNlbnRyYWwgQmFuayBvZiBDaGlsZSIgfiAiQ0xQIiwgDQogICAgQ2VudHJhbF9CYW5rID09ICJOYXRpb25hbCBCYW5rIG9mIHRoZSBSZXB1YmxpYyBvZiAoTm9ydGgpIE1hY2Vkb25pYSIgfiAiTUtEIiwgDQogICAgQ2VudHJhbF9CYW5rID09ICJDemVjaCBOYXRpb25hbCBCYW5rIiB+ICJDWksiLCANCiAgICBDZW50cmFsX0JhbmsgPT0gIlNvdXRoIEFmcmljYW4gUmVzZXJ2ZSBCYW5rIiB+ICJaQVIiLCANCiAgICBDZW50cmFsX0JhbmsgPT0gIkJhbmsgb2YgQm90c3dhbmEiIH4gIkJXUCIsIA0KICAgIENlbnRyYWxfQmFuayA9PSAiQ2VudHJhbCBCYW5rIG9mIEJhcmJhZG9zIiB+ICJCQkQiLCANCiAgICBDZW50cmFsX0JhbmsgPT0gIk5hdGlvbmFsIEJhbmsgb2YgRGVubWFyayIgfiAiREtLIiwgDQogICAgQ2VudHJhbF9CYW5rID09ICJCYW5rIG9mIE1hdXJpdGl1cyIgfiAiTVVSIiwgDQogICAgQ2VudHJhbF9CYW5rID09ICJTdGF0ZSBCYW5rIG9mIFBha2lzdGFuIiB+ICJQS1IiLCANCiAgICBDZW50cmFsX0JhbmsgPT0gIkNlbnRyYWwgQmFuayBvZiBTcmkgTGFua2EiICAgIH4gIkxLUiIsIA0KICAgIENlbnRyYWxfQmFuayA9PSAgIlN3aXNzIE5hdGlvbmFsIEJhbmsiICB+ICJDSEYiLCANCiAgICBDZW50cmFsX0JhbmsgPT0gICJDZW50cmFsIEJhbmsgb2YgdGhlIFBoaWxpcHBpbmVzIiAgfiAiUEhQIiwgDQogICAgQ2VudHJhbF9CYW5rID09ICJDZW50cmFsIEJhbmsgb2YgSWNlbGFuZCIgIH4gIklTSyIsIA0KICAgIENlbnRyYWxfQmFuayA9PSAgIkJhbmsgb2YgVGhhaWxhbmQiICB+ICJUSEIiLCANCiAgICBDZW50cmFsX0JhbmsgPT0gICJSZXNlcnZlIEJhbmsgb2YgTmV3IFplYWxhbmQiIH4gIk5aRCIsIA0KICAgIENlbnRyYWxfQmFuayA9PSAiRWFzdGVybiBDYXJpYmJlYW4gQ2VudHJhbCBCYW5rIiB+ICJYQ0QiLCANCiAgICBDZW50cmFsX0JhbmsgPT0gIkNlbnRyYWwgQmFuayBvZiBUaGUgQmFoYW1hcyIgIH4gIkJTRCIsIA0KICAgIENlbnRyYWxfQmFuayA9PSAiSG9uZyBLb25nIE1vbmV0YXJ5IEF1dGhvcml0eSIgfiAiSEtEIiwgDQogICAgQ2VudHJhbF9CYW5rID09ICAiTm9yZ2VzIEJhbmsiICAgfiAiTk9LIiwgDQogICAgQ2VudHJhbF9CYW5rID09ICAgIkNlbnRyYWwgQmFuayBvZiBCb3NuaWEgYW5kIEhlcnplZ292aW5hIiAgICAgfiAiQkFNIiwgDQogICAgQ2VudHJhbF9CYW5rID09ICAiQ2VudHJhbCBCYW5rIG9mIEt1d2FpdCIgIH4gIktXRCIsIA0KICAgIENlbnRyYWxfQmFuayA9PSAiQ2VudHJhbCBCYW5rIG9mIE1vcm9jY28iICB+ICJNQUQiLCANCiAgICBDZW50cmFsX0JhbmsgPT0gICAiQmFuayBvZiBNZXhpY28iICB+ICJNWE4iLCANCiAgICBDZW50cmFsX0JhbmsgPT0gIkJhbmsgb2YgQWxiYW5pYSIgICB+ICJBTEwiLCANCiAgICBDZW50cmFsX0JhbmsgPT0gICAiQmFuayBvZiBSdXNzaWEiICB+ICJSVUIiLCANCiAgICBDZW50cmFsX0JhbmsgPT0gIlJlc2VydmUgQmFuayBvZiBJbmRpYSIgIH4gIklOUiIsIA0KICAgIENlbnRyYWxfQmFuayA9PSAiUGVvcGxlJ3MgQmFuayBvZiBDaGluYSIgfiAiQ05ZIiwgDQogICAgQ2VudHJhbF9CYW5rID09ICJCYW5rIEluZG9uZXNpYSIgICAgIH4gIklEUiIsIA0KICAgIENlbnRyYWxfQmFuayA9PSAgICJDZW50cmFsIEJhbmsgb2YgS2VueWEifiAiS0VTIiwgDQogICAgQ2VudHJhbF9CYW5rID09ICAiQ2VudHJhbCBCYW5rIG9mIE5pZ2VyaWEiICAgICB+ICJOR04iLCANCiAgICBDZW50cmFsX0JhbmsgPT0gICJOYXRpb25hbCBCYW5rIG9mIFNlcmJpYSIgICAgfiAiUlNEIiwgDQogICAgQ2VudHJhbF9CYW5rID09ICJCYW5rIG9mIElzcmFlbCIgICB+ICJJTFMiLCANCiAgICBDZW50cmFsX0JhbmsgPT0gIkNlbnRyYWwgQmFuayBvZiB0aGUgUmVwdWJsaWMgb2YgS29zb3ZvIiAgfiAiRVVSIiwgDQogICAgQ2VudHJhbF9CYW5rID09ICJCYW5rIG9mIEZpbmxhbmQiICB+ICJFVVIiLCANCiAgICBDZW50cmFsX0JhbmsgPT0gICJDZW50cmFsIEJhbmsgb2YgTmVwYWwiICB+ICJOUFIiLCANCiAgICBDZW50cmFsX0JhbmsgPT0gICJDZW50cmFsIEJhbmsgb2YgQ3lwcnVzIiAgfiAiRVVSIiwgDQogICAgQ2VudHJhbF9CYW5rID09ICJDZW50cmFsIEJhbmsgb2YgRXN3YXRpbmkiICB+ICJTWkwiLCANCiAgICBDZW50cmFsX0JhbmsgPT0gIkJhbmsgb2YgU2xvdmVuaWEiIH4gIkVVUiIsIA0KICAgIFRSVUV+Ik90aGVyIg0KICAgICkpJT4lDQogIHNlbGVjdCgtYyhYLCBYLjEpKQ0KYGBgDQoNCg0KDQpgYGB7cn0NCnNlbnRlbmNlX2Jhc2UlPiVmaWx0ZXIoQ2VudHJhbF9CYW5rPT0iQmFuayBvZiBGaW5sYW5kIikNCmBgYA0KDQojIyMgU3RhdGlzdGljcyBvbiBzZW50ZW5jZS1sZXZlbCBkYXRhIA0KDQpXZSBub3cgaGF2ZSBhIHNlbnRlbmNlLWxldmVsIGNsZWFuIGRhdGFiYXNlIHRoYXQgY29udGFpbnMgdGhlIGB0eXBlX2xhYmVsYCAocmV0YWlsLCB3aG9sZXNhbGUsIGdlbmVyYWwvdW5zcGVjaWZpZWQpLCB0aGUgYHNlbnRpbWVudF9sYWJlbGAgKHBvc2l0aXZlLCBuZWdhdGl2ZSwgbmV1dHJhbCksIGBzdGFuY2VfbGFiZWxgIChQcm8tQ0JEQywgQW50aS1DQkRDLCBXYWl0LWFuZC1TZWUpIGFuZCBgZGlzY291cnNlX2xhYmVsYCAoUmlzay1CZW5lZml0LCBGZWF0dXJlLCBQcm9jZXNzKSBhc3NvY2lhdGVkIHdpdGggZWFjaCBzZW50ZW5jZSBtZWFzdXJlZCBieSBCRVJULg0KDQpgYGB7ciwgZWNobz1GQUxTRSwgd2FybmluZz1GQUxTRX0NCnRvdGFsX3NlbnRlbmNlcyA8LSBucm93KHNlbnRlbmNlX2Jhc2UpDQoNCiMgVGFibGUgcsOpY2FwIGVuIGZvcm1hdCBsb25nDQpzdW1tYXJ5X3N0YXRzX3NlbnRlbmNlIDwtIGJpbmRfcm93cygNCiAgc2VudGVuY2VfYmFzZSAlPiUNCiAgICBjb3VudChsZXZlbCA9IHR5cGVfbGFiZWwsIG5hbWUgPSAibiIpICU+JQ0KICAgIG11dGF0ZShkaW1lbnNpb24gPSAiVHlwZSBkZSBDQkRDIiksDQogIA0KICBzZW50ZW5jZV9iYXNlICU+JQ0KICAgIGNvdW50KGxldmVsID0gc2VudGltZW50X2xhYmVsLCBuYW1lID0gIm4iKSAlPiUNCiAgICBtdXRhdGUoZGltZW5zaW9uID0gIlNlbnRpbWVudCIpLA0KICANCiAgc2VudGVuY2VfYmFzZSAlPiUNCiAgICBjb3VudChsZXZlbCA9IHN0YW5jZV9sYWJlbCwgbmFtZSA9ICJuIikgJT4lDQogICAgbXV0YXRlKGRpbWVuc2lvbiA9ICJTdGFuY2UiKSwNCiAgDQogIHNlbnRlbmNlX2Jhc2UgJT4lDQogICAgY291bnQobGV2ZWwgPSBkaXNjb3Vyc2VfbGFiZWwsIG5hbWUgPSAibiIpICU+JQ0KICAgIG11dGF0ZShkaW1lbnNpb24gPSAiRGlzY291cnNlIikNCikgJT4lDQogIGdyb3VwX2J5KGRpbWVuc2lvbikgJT4lDQogIG11dGF0ZShzaGFyZSA9IG4gLyBzdW0obikpICU+JQ0KICB1bmdyb3VwKCkNCnJlcXVpcmUoc2NhbGVzKQ0KDQojIFRhYmxlYXUgZ3QgcGx1cyBjbGFpcg0Kc3VtbWFyeV9zdGF0c19zZW50ZW5jZSAlPiUNCiAgYXJyYW5nZShkaW1lbnNpb24sIGRlc2MobikpICU+JQ0KICBtdXRhdGUoc2hhcmUgPSBzY2FsZXM6OnBlcmNlbnQoc2hhcmUsIGFjY3VyYWN5ID0gMC4xKSkgJT4lDQogIGd0KHJvd25hbWVfY29sID0gImxldmVsIiwgZ3JvdXBuYW1lX2NvbCA9ICJkaW1lbnNpb24iKSAlPiUNCiAgdGFiX2hlYWRlcigNCiAgICB0aXRsZSA9IHBhc3RlMCgNCiAgICAgICJTdW1tYXJ5IHN0YXRpc3RpY3Mgb2Ygc2VudGVuY2UtbGV2ZWwgZGF0YWJhc2UgKE4gPSAiLA0KICAgICAgdG90YWxfc2VudGVuY2VzLCAiIHNlbnRlbmNlcykiDQogICAgKQ0KICApICU+JQ0KICBjb2xzX2xhYmVsKA0KICAgIGxldmVsID0gIkNhdGVnb3J5IiwNCiAgICBuICAgICA9ICJOdW1iZXIgb2Ygc2VudGVuY2VzIiwNCiAgICBzaGFyZSA9ICJTaGFyZSB3aXRoaW4gZGltZW5zaW9uIg0KICApICU+JQ0KICBmbXRfbnVtYmVyKGNvbHVtbnMgPSBuLCBkZWNpbWFscyA9IDApICU+JQ0KICBjb2xzX2FsaWduKA0KICAgIGFsaWduICAgPSAiY2VudGVyIiwNCiAgICBjb2x1bW5zID0gYyhuLCBzaGFyZSkNCiAgKQ0KYGBgDQpJbiB0b3RhbCwgdGhlcmUgYXJlICoqNTM5NyB1bmlxdWVzIHNlbnRlbmNlcyoqLCAqKm1vc3RseSBhYm91dCBSZXRhaWwgQ0JEQyoqICg1MyUgb2Ygc3BlZWNoZXMpLCB3aGlsZSB1bnNwZWNpZmllZCAoMzklKSBhbmQgd2hvbGVzYWxlICg4JSkgYXJlIHJlbGF0aXZlbHkgbWFyZ2luYWxseSBtZW50aW9uZWQuIE92ZXJhbGwsIHRoZSBzZW50aW1lbnQgaXMgZXNzZW50aWFsbHkgKipuZXV0cmFsKiogeWV0ICoqcHJvLUNCREMqKi4gSW4gYWRkaXRpb24sIHdlIGNhbiBzZWUgdGhhdCB0aGVyZSBhcmUgKipsZXNzIHNwZWVjaGVzIGFib3V0IHdob2xlc2FsZSBDQkRDKiosIGJ1dCB0aGV5IHRlbmQgdG8gYmUgbW9yZSBwb3NpdGl2ZS9Qcm8tQ0JEQyA6DQoNCmBgYHtyLCBlY2hvPUZBTFNFfQ0KcmVxdWlyZShwYXRjaHdvcmspDQpzZW50aW1lbnRfYnlfdHlwZSA8LSBzZW50ZW5jZV9iYXNlICU+JQ0KICBncm91cF9ieSh0eXBlX2xhYmVsLCBzZW50aW1lbnRfbGFiZWwpJT4lDQogIHN1bW1hcml6ZShjb3VudD1uKCkpJT4lDQogIG11dGF0ZSgNCiAgICB0eXBlX2xhYmVsICAgICAgPSBmYWN0b3IodHlwZV9sYWJlbCwgbGV2ZWxzID0gYygiR2VuZXJhbC9VbnNwZWNpZmllZCIsIlJldGFpbCBDQkRDIiwiV2hvbGVzYWxlIENCREMiKSksDQogICAgc2VudGltZW50X2xhYmVsID0gZmFjdG9yKHNlbnRpbWVudF9sYWJlbCwgbGV2ZWxzID0gYygibmVnYXRpdmUiLCJuZXV0cmFsIiwicG9zaXRpdmUiKSkNCiAgKSAlPiUNCiAgZ2dwbG90KGFlcyh4ID0gdHlwZV9sYWJlbCwgeSA9IGNvdW50LCBmaWxsID0gc2VudGltZW50X2xhYmVsKSkgKw0KICBnZW9tX2NvbCgpICsNCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gYyhuZWdhdGl2ZSA9ICIjZDczMDI3IiwgbmV1dHJhbCA9ICIjYmRiZGJkIiwgcG9zaXRpdmUgPSAiIzFhOTg1MCIpLA0KICAgICAgICAgICAgICAgICAgICBuYW1lID0gIlNlbnRpbWVudCIpICsNCiAgbGFicyh4ID0gTlVMTCwgeSA9ICJDb3VudCIsIHRpdGxlPSJTZW50ZW5jZS1sZXZlbCBzZW50aW1lbnQgYnkgdHlwZSIpICsNCiAgdGhlbWVfYncoKSArDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJib3R0b20iKQ0KDQoNCnN0YW5jZV9ieV90eXBlIDwtIHNlbnRlbmNlX2Jhc2UgJT4lDQogIGdyb3VwX2J5KHR5cGVfbGFiZWwsIHN0YW5jZV9sYWJlbCklPiUNCiAgc3VtbWFyaXplKGNvdW50PW4oKSklPiUNCiAgbXV0YXRlKA0KICAgIHR5cGVfbGFiZWwgICAgICA9IGZhY3Rvcih0eXBlX2xhYmVsLCBsZXZlbHMgPSBjKCJHZW5lcmFsL1Vuc3BlY2lmaWVkIiwiUmV0YWlsIENCREMiLCJXaG9sZXNhbGUgQ0JEQyIpKSwNCiAgICBzdGFuY2VfbGFiZWwgPSBmYWN0b3Ioc3RhbmNlX2xhYmVsLCBsZXZlbHMgPSBjKCJBbnRpLUNCREMiLCJXYWl0LWFuZC1TZWUiLCJQcm8tQ0JEQyIpKQ0KICApICU+JQ0KICBnZ3Bsb3QoYWVzKHggPSB0eXBlX2xhYmVsLCB5ID0gY291bnQsIGZpbGwgPSBzdGFuY2VfbGFiZWwpKSArDQogIGdlb21fY29sKCkgKw0KICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBjKCJBbnRpLUNCREMiID0gIiNkNzMwMjciLCAiV2FpdC1hbmQtU2VlIiA9ICIjYmRiZGJkIiwgIlByby1DQkRDIiA9ICIjMWE5ODUwIiksDQogICAgICAgICAgICAgICAgICAgIG5hbWUgPSAiU3RhbmNlIikgKw0KICBsYWJzKHggPSBOVUxMLCB5ID0gIiIsIHRpdGxlPSJTZW50ZW5jZS1sZXZlbCBzdGFuY2UgYnkgdHlwZSIpICsNCiAgdGhlbWVfYncoKSArDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJib3R0b20iKQ0KDQpzZW50aW1lbnRfYnlfdHlwZSArIHN0YW5jZV9ieV90eXBlDQpgYGANCg0KSW4gYWRkaXRpb24sIHdlIGNhbiBvYnNlcnZlIHRoYXQgc29tZSBDZW50cmFsIEJhbmtzIC0gYW5kIG5vdGFibHkgRUNCIC0gdGVuZCB0byBjb21tdW5pY2F0ZSBtb3JlIHRoYW4gb3RoZXJzIDoNCg0KYGBge3IsIGVjaG89RkFMU0V9DQpyZXF1aXJlKGZvcmNhdHMpDQoNCnNlbnRlbmNlX2Jhc2UgJT4lDQogIGNvdW50KENlbnRyYWxfQmFuaywgbmFtZSA9ICJjb3VudCIpICU+JQ0KICBtdXRhdGUoQ2VudHJhbF9CYW5rID0gZmN0X3Jlb3JkZXIoQ2VudHJhbF9CYW5rLCBjb3VudCwgLmRlc2MgPSBUUlVFKSkgJT4lDQogIGZpbHRlcighY291bnQ8MjApJT4lDQogIGdncGxvdChhZXMoQ2VudHJhbF9CYW5rLCBjb3VudCkpICsNCiAgZ2VvbV9jb2woKSArDQogIGNvb3JkX2ZsaXAoKSArICAjIGVhc2llciB0byByZWFkIGxvbmcgbGFiZWxzOyByZW1vdmUgaWYgeW91IHByZWZlciB2ZXJ0aWNhbA0KICBsYWJzKHggPSBOVUxMLCB5ID0gIkNvdW50IiwgdGl0bGU9Ik51bWJlciBvZiBzZW50ZW5jZXMgcmVsYXRlZCB0byBDQkRDIGJ5IENlbnRyYWwgQmFuayoiLA0KICAgICAgIGNhcHRpb249IipSZW1vdmVkIGNlbnRyYWwgYmFua3Mgd2l0aCBsZXNzIHRoYW4gMjAgc2VudGVuY2VzIGFib3V0IENCREMiKSArDQogIHRoZW1lX21pbmltYWwoKQ0KYGBgDQoNCg0KIyMgRGF5L1dlZWstbGV2ZWwgZGF0YWJhc2UNCg0KV2UgaGF2ZSBzZW50aW1lbnQsIHN0YW5jZSwgZGlzY291cnNlIGFuZCB0eXBlIG9mIENCREMgZGlzY3Vzc2VkIGF0IHNlbnRlbmNlLWxldmVsLiBXZSB0cmFuc2Zvcm0gdGhlIHNlbnRpbWVudHMgKGBwb3NpdGl2ZWAsIGBuZXV0cmFsYCBldCBgbmVnYXRpdmVgKSBhbmQgc3RhbmNlcyAoYFByby1DQkRDYCwgYFdhaXQtYW5kLVNlZWAgZXQgYEFudGktQ0JEQ2ApIGluIG51bWVyaWMgdmFsdWVzICgxLCAwLCAtMSkgdG8gb2J0YWluIHNpbWlsYXIgZGF0YSBhcyBpbiBBdWVyICYgYWwgKDIwMjEpIGFuZCBEaW9ueXNvcG91bG9zICYgTWFrcmlkaXMgKDIwMjUpLg0KDQpgYGB7ciwgZWNobz1GQUxTRX0NCnNpZ25fZnJvbV9zZW50aW1lbnQgPC0gZnVuY3Rpb24obGJsKSB7DQogIHggPC0gc3RyX3RvX2xvd2VyKGxibCkNCiAgY2FzZV93aGVuKA0KICAgIHN0cl9kZXRlY3QoeCwgInBvc2l0aXZlIikgfiAgMUwsDQogICAgc3RyX2RldGVjdCh4LCAibmVnYXRpdmUiKSB+IC0xTCwNCiAgICBUUlVFIH4gMEwgICMgbmV1dHJhbCwgb3RoZXINCiAgKQ0KfQ0Kc2lnbl9mcm9tX3N0YW5jZSA8LSBmdW5jdGlvbihsYmwpIHsNCiAgeCA8LSBzdHJfdG9fbG93ZXIobGJsKQ0KICBjYXNlX3doZW4oDQogICAgc3RyX2RldGVjdCh4LCAicHJvIikgICAgICAgICAgICB+ICAxTCwgICMgcHJvLWNiZGMNCiAgICBzdHJfZGV0ZWN0KHgsICJhbnRpIikgICAgICAgICAgIH4gLTFMLCAgIyBhbnRpLWNiZGMNCiAgICBzdHJfZGV0ZWN0KHgsICJ3YWl0IikgICAgICAgICAgIH4gIDBMLCAgIyB3YWl0LWFuZC1zZWUNCiAgICBUUlVFIH4gMEwNCiAgKQ0KfQ0KDQpzcGVlY2hlc19zaWducyA8LSBzZW50ZW5jZV9iYXNlICU+JQ0KICBtdXRhdGUoDQogICAgc2VudF9zaWduICAgPSBzaWduX2Zyb21fc2VudGltZW50KHNlbnRpbWVudF9sYWJlbCksDQogICAgc3RhbmNlX3NpZ24gPSBzaWduX2Zyb21fc3RhbmNlKHN0YW5jZV9sYWJlbCkNCiAgKQ0KDQpgYGANCg0KVGhlbiwgZm9yIGEgZ2l2ZW4gc3BlZWNoLCB3ZSBtZWFzdXJlIHRoZSBhdmVyYWdlIHNlbnRpbWVudCBhbmQgc3RhbmNlLiBXZSB0aGVuIGFnZ3JlZ2F0ZSB0aGUgc2VudGltZW50IGFuZCBzdGFuY2UgZGFpbHktbGV2ZWwgYXMgdGhlaXIgYXZlcmFnZSBhY3Jvc3MgYWxsIHNwZWVjaGVzIHRoYXQgZGF5LiANCmBgYHtyLCBlY2hvPUZBTFNFfQ0Kc3BlZWNoX2xldmVsIDwtIHNwZWVjaGVzX3NpZ25zICU+JQ0KICAjbGVmdF9qb2luKHNlbnRlbmNlX2Jhc2UyLCBieT1jKCJ1cmwiLCAiZGF0ZSIpKSU+JQ0KICBncm91cF9ieSh1cmwsIGRhdGUsIENlbnRyYWxfQmFuaywgdHlwZV9sYWJlbCkgJT4lDQogIHN1bW1hcmlzZSgNCiAgICBzZW50X3NwZWVjaCAgID0gbWVhbihzZW50X3NpZ24sICAgbmEucm0gPSBUUlVFKSwNCiAgICBzdGFuY2Vfc3BlZWNoID0gbWVhbihzdGFuY2Vfc2lnbiwgbmEucm0gPSBUUlVFKSwNCiAgICAjc3RhbmNlX2F1ZXIgPSBtZWFuKHNwZWVjaF9zdGFuY2UpLA0KICAgIC5ncm91cHMgPSAiZHJvcCINCiAgKQ0KDQpgYGANCldlIGFsc28gZGVjb21wb3NlIGJ5IHR5cGUgb2YgQ0JEQyBkaXNjdXNzZWQgd2l0aGluIGVhY2ggZGF5LCBhcyB3ZWxsIGFzIGZvciBFQ0IsIEZlZCBhbmQgb3RoZXIgY2VudHJhbCBiYW5rcywgYW5kIGZvciBkZXZlbG9wZWQgdmVyc3VzIGVtZXJnaW5nIG1hcmtldHMgY2VudHJhbCBiYW5rcy4NCg0KDQpgYGB7cn0NCg0KYmFua2RheV90eXBlIDwtIHNwZWVjaF9sZXZlbCAlPiUNCiAgZ3JvdXBfYnkoZGF0ZSwgQ2VudHJhbF9CYW5rLCB0eXBlX2xhYmVsKSAlPiUNCiAgc3VtbWFyaXNlKA0KICAgIHNlbnRfYnRrICAgPSBtZWFuKHNlbnRfc3BlZWNoLCAgIG5hLnJtID0gVFJVRSksDQogICAgc3RhbmNlX2J0ayA9IG1lYW4oc3RhbmNlX3NwZWVjaCwgbmEucm0gPSBUUlVFKSwNCiAgICAuZ3JvdXBzID0gImRyb3AiDQogICkNCg0KDQoNCnR5cGVfZGFpbHkgPC0gYmFua2RheV90eXBlICU+JQ0KICBncm91cF9ieShkYXRlLCB0eXBlX2xhYmVsKSAlPiUNCiAgc3VtbWFyaXNlKA0KICAgIGluZGV4X3NlbnRfdHlwZSAgID0gbWVhbihzZW50X2J0aywgICBuYS5ybSA9IFRSVUUpLA0KICAgIGluZGV4X3N0YW5jZV90eXBlID0gbWVhbihzdGFuY2VfYnRrLCBuYS5ybSA9IFRSVUUpLA0KICAgIC5ncm91cHMgPSAiZHJvcCINCiAgKQ0KDQoNCmJhbmtkYXlfYWxsIDwtIGJhbmtkYXlfdHlwZSAlPiUNCiAgZ3JvdXBfYnkoZGF0ZSwgQ2VudHJhbF9CYW5rKSAlPiUNCiAgc3VtbWFyaXNlKA0KICAgIHNlbnRfYnRfYWxsICAgPSBtZWFuKHNlbnRfYnRrLCAgIG5hLnJtID0gVFJVRSksDQogICAgc3RhbmNlX2J0X2FsbCA9IG1lYW4oc3RhbmNlX2J0aywgbmEucm0gPSBUUlVFKSwNCiAgICAuZ3JvdXBzID0gImRyb3AiDQogICkNCg0KDQpzZW50ZW5jZV9iYXNlMiA8LSBzZW50ZW5jZV9iYXNlJT4lDQogIHNlbGVjdCh1cmwsIGRhdGUpJT4lDQogIGRpc3RpbmN0KHVybCwgZGF0ZSklPiUNCiAgaW5uZXJfam9pbihhdWVyX2RhdGElPiVzZWxlY3QoVVJMX3RleHQsIHNwZWVjaF9zdGFuY2UpLCBieT1jKCJ1cmwiPSJVUkxfdGV4dCIpKSU+JQ0KICBncm91cF9ieShkYXRlKSU+JQ0KICBzdW1tYXJpemUoc3RhbmNlX2F1ZXIgPSBtZWFuKHNwZWVjaF9zdGFuY2UpKQ0KDQpnbG9iYWxfZGFpbHkgPC0gYmFua2RheV9hbGwgJT4lDQogIGdyb3VwX2J5KGRhdGUpICU+JQ0KICBzdW1tYXJpc2UoDQogICAgaW5kZXhfc2VudF9nbG9iYWwgICA9IG1lYW4oc2VudF9idF9hbGwsICAgbmEucm0gPSBUUlVFKSwNCiAgICBpbmRleF9zdGFuY2VfZ2xvYmFsID0gbWVhbihzdGFuY2VfYnRfYWxsLCBuYS5ybSA9IFRSVUUpLA0KICAgIC5ncm91cHMgPSAiZHJvcCINCiAgKSU+JQ0KICBsZWZ0X2pvaW4oc2VudGVuY2VfYmFzZTIsIGJ5PSJkYXRlIiklPiUNCiAgbXV0YXRlKHNwZWVjaGRheSA9IDEpDQoNCg0KZ2xvYmFsX2RhaWx5X2RldmVtZSA8LSBiYW5rZGF5X2FsbCAlPiUNCiAgbXV0YXRlKGRldmVtZSA9IGNhc2Vfd2hlbihDZW50cmFsX0JhbmsgJWluJSBjKCJCYW5rIG9mIEVuZ2xhbmQiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkV1cm9wZWFuIENlbnRyYWwgQmFuayIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRmVkIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJCYW5rIG9mIEphcGFuIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJCYW5rIG9mIENhbmFkYSIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUmVzZXJ2ZSBCYW5rIG9mIEF1c3RyYWxpYSIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiU3ZlcmlnZXMgUmlrc2JhbmsiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlN3aXNzIE5hdGlvbmFsIEJhbmsiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNlbnRyYWwgQmFuayBvZiBJY2VsYW5kIiwgIk5vcmdlcyBCYW5rIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJOYXRpb25hbCBCYW5rIG9mIERlbm1hcmsiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUmVzZXJ2ZSBCYW5rIG9mIE5ldyBaZWFsYW5kIiwgIkJhbmsgb2YgRmlubGFuZCIpICB+IkRldmVsb3BlZCIsIA0KICAgICAgICAgICAgICAgICAgICAgICBUUlVFIH4iRW1lcmdpbmciKSklPiUNCiAgZ3JvdXBfYnkoZGV2ZW1lLCBkYXRlKSU+JQ0KICBzdW1tYXJpc2UoaW5kZXhfc2VudF9kZXZlbWUgPSBtZWFuKHNlbnRfYnRfYWxsLG5hLnJtID0gVFJVRSksIA0KICAgICAgICAgICAgICBpbmRleF9zdGFuY2VfZGV2ZW1lPW1lYW4oc3RhbmNlX2J0X2FsbCxuYS5ybSA9IFRSVUUpKSU+JQ0KICBhcnJhbmdlKGRhdGUpJT4ldW5ncm91cCgpJT4lIA0KICBkcGx5cjo6cmVuYW1lKA0KICAgIHNlbnQgID0gaW5kZXhfc2VudF9kZXZlbWUsDQogICAgc3RhbmNlID0gaW5kZXhfc3RhbmNlX2RldmVtZQ0KICApICU+JSANCiAgcGl2b3Rfd2lkZXIoDQogICAgaWRfY29scyAgID0gZGF0ZSwNCiAgICBuYW1lc19mcm9tICA9IGRldmVtZSwgICAgICAgICAgICAgICMgIkRldmVsb3BlZCIsICJFbWVyZ2luZyINCiAgICB2YWx1ZXNfZnJvbSA9IGMoc2VudCwgc3RhbmNlKSwNCiAgICBuYW1lc19nbHVlICA9ICJ7LnZhbHVlfV97ZGV2ZW1lfSIsICAjIHNlbnRfRGV2ZWxvcGVkLCBzdGFuY2VfRGV2ZWxvcGVkLCBldGMuDQogICAgdmFsdWVzX2ZpbGwgPSBsaXN0KHNlbnQgPSAwLCBzdGFuY2UgPSAwKQ0KICApDQoNCg0KZ2xvYmFsX2RhaWx5X2RlY29tcG9zZWQgPC0gYmFua2RheV9hbGwgJT4lDQogIG11dGF0ZShDQiA9IGNhc2Vfd2hlbihDZW50cmFsX0JhbmsgJWluJSBjKA0KICAgICJFdXJvcGVhbiBDZW50cmFsIEJhbmsiKSB+ICJFQ0IiLCANCiAgICBDZW50cmFsX0JhbmsgPT0iRmVkIiB+ICJGZWQiLA0KICAgIFRSVUUgfiAiT3RoZXIiKSklPiUNCiAgZ3JvdXBfYnkoQ0IsIGRhdGUpJT4lDQogIHN1bW1hcmlzZShpbmRleF9zZW50X2NiID0gbWVhbihzZW50X2J0X2FsbCxuYS5ybSA9IFRSVUUpLCANCiAgICAgICAgICAgICAgaW5kZXhfc3RhbmNlX2NiPW1lYW4oc3RhbmNlX2J0X2FsbCxuYS5ybSA9IFRSVUUpKSU+JQ0KICBhcnJhbmdlKGRhdGUpJT4ldW5ncm91cCgpJT4lIA0KICBkcGx5cjo6cmVuYW1lKA0KICAgIHNlbnQgID0gaW5kZXhfc2VudF9jYiwNCiAgICBzdGFuY2UgPSBpbmRleF9zdGFuY2VfY2INCiAgKSAlPiUgDQogIHBpdm90X3dpZGVyKA0KICAgIGlkX2NvbHMgICA9IGRhdGUsDQogICAgbmFtZXNfZnJvbSAgPSBDQiwgICAgICAgICAgICAgICMgIkRldmVsb3BlZCIsICJFbWVyZ2luZyINCiAgICB2YWx1ZXNfZnJvbSA9IGMoc2VudCwgc3RhbmNlKSwNCiAgICBuYW1lc19nbHVlICA9ICJ7LnZhbHVlfV97Q0J9IiwgICMgc2VudF9EZXZlbG9wZWQsIHN0YW5jZV9EZXZlbG9wZWQsIGV0Yy4NCiAgICB2YWx1ZXNfZmlsbCA9IGxpc3Qoc2VudCA9IDAsIHN0YW5jZSA9IDApDQogICkNCg0KDQpnbG9iYWxfZGFpbHlfZmVkZWNiIDwtIGJhbmtkYXlfYWxsICU+JQ0KICBtdXRhdGUoQ0IgPSBjYXNlX3doZW4oQ2VudHJhbF9CYW5rICVpbiUgYygNCiAgICAiRXVyb3BlYW4gQ2VudHJhbCBCYW5rIiwgIkZlZCIpIH4gIkVDQkZFRCIsIA0KICAgIFRSVUUgfiAibm9uRUNCRkVEIikpJT4lDQogIGdyb3VwX2J5KENCLCBkYXRlKSU+JQ0KICBzdW1tYXJpc2UoaW5kZXhfc2VudF9jYiA9IG1lYW4oc2VudF9idF9hbGwsbmEucm0gPSBUUlVFKSwgDQogICAgICAgICAgICAgIGluZGV4X3N0YW5jZV9jYj1tZWFuKHN0YW5jZV9idF9hbGwsbmEucm0gPSBUUlVFKSklPiUNCiAgYXJyYW5nZShkYXRlKSU+JXVuZ3JvdXAoKSU+JSANCiAgZHBseXI6OnJlbmFtZSgNCiAgICBzZW50ICA9IGluZGV4X3NlbnRfY2IsDQogICAgc3RhbmNlID0gaW5kZXhfc3RhbmNlX2NiDQogICkgJT4lIA0KICBwaXZvdF93aWRlcigNCiAgICBpZF9jb2xzICAgPSBkYXRlLA0KICAgIG5hbWVzX2Zyb20gID0gQ0IsICAgICAgICAgICAgICAjICJEZXZlbG9wZWQiLCAiRW1lcmdpbmciDQogICAgdmFsdWVzX2Zyb20gPSBjKHNlbnQsIHN0YW5jZSksDQogICAgbmFtZXNfZ2x1ZSAgPSAiey52YWx1ZX1fe0NCfSIsICAjIHNlbnRfRGV2ZWxvcGVkLCBzdGFuY2VfRGV2ZWxvcGVkLCBldGMuDQogICAgdmFsdWVzX2ZpbGwgPSBsaXN0KHNlbnQgPSAwLCBzdGFuY2UgPSAwKQ0KICApDQoNCmRldmVtZV9jYiA8LSBnbG9iYWxfZGFpbHlfZGV2ZW1lICU+JQ0KICBsZWZ0X2pvaW4oZ2xvYmFsX2RhaWx5X2RlY29tcG9zZWQsIGJ5PSJkYXRlIiklPiUNCiAgbGVmdF9qb2luKGdsb2JhbF9kYWlseV9mZWRlY2IsIGJ5PSJkYXRlIikNCg0KYGBgDQoNCmBgYHtyLCBlY2hvPUZBTFNFLCBpbmNsdWRlPUZBTFNFfQ0KYWxsX2RheXMgPC0gdGliYmxlKGRhdGUgPSBzZXEobWluKHNlbnRlbmNlX2Jhc2UkZGF0ZSwgbmEucm0gPSBUUlVFKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heChzZW50ZW5jZV9iYXNlJGRhdGUsIG5hLnJtID0gVFJVRSksIGJ5ID0gImRheSIpKQ0KDQp0eXBlX2RhaWx5X3NlbnRfd2lkZSA8LSB0eXBlX2RhaWx5ICU+JQ0KICBtdXRhdGUodHlwZV9jb2wgPSBtYWtlLm5hbWVzKHR5cGVfbGFiZWwpKSAlPiUNCiAgc2VsZWN0KGRhdGUsIHR5cGVfY29sLCBpbmRleF9zZW50X3R5cGUpICU+JQ0KICBwaXZvdF93aWRlcihuYW1lc19mcm9tID0gdHlwZV9jb2wsIHZhbHVlc19mcm9tID0gaW5kZXhfc2VudF90eXBlLCBuYW1lc19wcmVmaXggPSAic2VudF8iKQ0KDQp0eXBlX2RhaWx5X3N0YW5jZV93aWRlIDwtIHR5cGVfZGFpbHkgJT4lDQogIG11dGF0ZSh0eXBlX2NvbCA9IG1ha2UubmFtZXModHlwZV9sYWJlbCkpICU+JQ0KICBzZWxlY3QoZGF0ZSwgdHlwZV9jb2wsIGluZGV4X3N0YW5jZV90eXBlKSAlPiUNCiAgcGl2b3Rfd2lkZXIobmFtZXNfZnJvbSA9IHR5cGVfY29sLCB2YWx1ZXNfZnJvbSA9IGluZGV4X3N0YW5jZV90eXBlLCBuYW1lc19wcmVmaXggPSAic3RhbmNlXyIpDQoNCmNiZGNfaWR4X2RhaWx5X2xhYmVscyA8LSBhbGxfZGF5cyAlPiUNCiAgbGVmdF9qb2luKGdsb2JhbF9kYWlseSwgYnkgPSAiZGF0ZSIpICU+JQ0KICBsZWZ0X2pvaW4odHlwZV9kYWlseV9zZW50X3dpZGUsICAgYnkgPSAiZGF0ZSIpICU+JQ0KICBsZWZ0X2pvaW4odHlwZV9kYWlseV9zdGFuY2Vfd2lkZSwgYnkgPSAiZGF0ZSIpICU+JQ0KICBsZWZ0X2pvaW4oZGV2ZW1lX2NiLCBieT0iZGF0ZSIpJT4lDQogIGFycmFuZ2UoZGF0ZSkNCg0KY2JkY19pZHhfd2Vla2x5X2xhYmVscyA8LSBjYmRjX2lkeF9kYWlseV9sYWJlbHMgJT4lDQogIG11dGF0ZSh3ZWVrID0gZmxvb3JfZGF0ZShkYXRlLCB1bml0ID0gIndlZWsiKSkgJT4lDQogIGdyb3VwX2J5KHdlZWspICU+JQ0KICBzdW1tYXJpc2UoYWNyb3NzKHdoZXJlKGlzLm51bWVyaWMpLCB+IG1lYW4oLngsIG5hLnJtID0gVFJVRSkpLCAuZ3JvdXBzID0gImRyb3AiKSAlPiUNCiAgZHBseXI6OnJlbmFtZShkYXRlX3dlZWsgPSB3ZWVrKQ0KDQpgYGANCg0KIyMjIER5bmFtaWNzIG9mIHNwZWVjaGVzIHNlbnRpbWVudHMNCg0KV2Vla2x5DQoNCmBgYHtyfQ0Kd2Vla2x5X3NlbnRpbWVudF9wbG90IDwtIGNiZGNfaWR4X3dlZWtseV9sYWJlbHMlPiVnZ3Bsb3QoYWVzKHg9ZGF0ZV93ZWVrLCB5PWluZGV4X3NlbnRfZ2xvYmFsKSkrDQogIGdlb21fcG9pbnQoKStnZW9tX2xpbmUobHdkPS41LCBsdHk9MikrbGFicyh4PSIiLCB5PSJXZWVrbHkgU2VudGltZW50IikNCg0KZGFpbHlfc2VudGltZW50X3Bsb3QgPC0gY2JkY19pZHhfZGFpbHlfbGFiZWxzJT4lZ2dwbG90KGFlcyh4PWRhdGUsIHk9aW5kZXhfc2VudF9nbG9iYWwpKSsNCiAgZ2VvbV9wb2ludChzaXplPTEpK2dlb21fbGluZShsd2Q9LjUsIGx0eT0yKStsYWJzKHg9IiIsIHk9IkRhaWx5IFNlbnRpbWVudCIpDQoNCmRhaWx5X3NlbnRpbWVudF9wbG90L3dlZWtseV9zZW50aW1lbnRfcGxvdCANCmBgYA0KDQojIyMgU3RhdGlzdGljcyBvZiB3ZWVrbHkgc3BlZWNoZXMNCmBgYHtyfQ0KZ2xvYmFsX2RhaWx5ICU+JQ0KICBsZWZ0X2pvaW4odHlwZV9kYWlseV9zZW50X3dpZGUsICAgYnkgPSAiZGF0ZSIpICU+JQ0KICBsZWZ0X2pvaW4odHlwZV9kYWlseV9zdGFuY2Vfd2lkZSwgYnkgPSAiZGF0ZSIpICU+JQ0KICBsZWZ0X2pvaW4oZGV2ZW1lX2NiLCAgICAgICAgICAgICAgYnkgPSAiZGF0ZSIpICU+JQ0KICBhcnJhbmdlKGRhdGUpICU+JQ0KICBtdXRhdGUod2VlayA9IGZsb29yX2RhdGUoZGF0ZSwgdW5pdCA9ICJ3ZWVrIikpICU+JQ0KICBncm91cF9ieSh3ZWVrKSAlPiUNCiAgc3VtbWFyaXNlKGFjcm9zcyh3aGVyZShpcy5udW1lcmljKSwgfiBtZWFuKC54LCBuYS5ybSA9IFRSVUUpKSwgLmdyb3VwcyA9ICJkcm9wIikgJT4lDQogIHNlbGVjdCgtc3BlZWNoZGF5KSU+JQ0KICB0Ymxfc3VtbWFyeSgNCiAgICB0eXBlID0gbGlzdCgNCiAgICAgIGFsbF9jb250aW51b3VzKCkgfiAiY29udGludW91czIiLCAgIyB0b3VzIGxlcyBjb250aW51cw0KICAgICAgd2VlayB+ICJjb250aW51b3VzIiAgICAgICAgICAgICAgICMgc2F1ZiB3ZWVrDQogICAgKSwNCiAgICBzdGF0aXN0aWMgPSBsaXN0KA0KICAgICAgYWxsX2NvbnRpbnVvdXMoKSB+IGMoInttZWFufSAoe3NkfSkiKSwNCiAgICAgIHdlZWsgfiAie21pbn0sIHttYXh9IiAgICAgICAgICAgICAjIHNldWxlbWVudCBtaW4vbWF4IHBvdXIgd2Vlaw0KICAgICksDQogICAgbGFiZWwgPSB3ZWVrIH4gIldlZWsgKG1pbiwgbWF4KSINCiAgKSU+JQ0KICBtb2RpZnlfZm9vdG5vdGUoZXZlcnl0aGluZygpIH4gTkFfY2hhcmFjdGVyXykNCmBgYA0KDQoNCg0KIyBTdGFibGVjb2lucyBzdXBwbHkgZGF0YQ0KIyMgRGF0YSBpbXBvcnQNCmBgYHtyLCBlY2hvPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBtZXNzYWdlPUZBTFNFfQ0KYXJ0ZW1pcyA8LSByZWFkcjo6cmVhZF9jc3YyKA0KICAiQzovVXNlcnMvZmtyYXVzL0Rlc2t0b3AvQXJ0aWNsZXMvZWZmZWN0cyBvZiBDQiBzcGVlY2hlcyBvbiBzdGFibGVjb2lucy9BcnRlbWlzIGRhdGEvU3RhYmxlY29pbiBTdXBwbHkgYnkgU3RhYmxlY29pbi5jc3YiLA0KICBzaG93X2NvbF90eXBlcyA9IEZBTFNFDQopDQoNCkdQUiA8LSByZWFkeGw6OnJlYWRfZXhjZWwoIkM6L3VzZXJzL2ZrcmF1cy9EZXNrdG9wL0FydGljbGVzL2VmZmVjdHMgb2YgQ0Igc3BlZWNoZXMgb24gc3RhYmxlY29pbnMvMjAyNS9HUFIueGxzeCIpJT4lDQogIG11dGF0ZShkYXRlPWFzLkRhdGUoZGF0ZSkpJT4lDQogIHNlbGVjdCgtYyhEQVkpKQ0KcmVxdWlyZShxdWFudG1vZCkNClZJWCA8LSBnZXRTeW1ib2xzKCJeVklYIiwgc3JjPSJ5YWhvbyIsIGF1dG8uYXNzaWduID0gRkFMU0UpIA0Kdml4X2RhdGEgPC0gZGF0YS5mcmFtZShkYXRlID0gaW5kZXgoVklYKSwgY29yZWRhdGEoVklYKSklPiUNCiAgZHBseXI6OnJlbmFtZSgiVklYX2Nsb3NlIiA9IGBWSVguQ2xvc2VgKSU+JQ0KICBzZWxlY3QoZGF0ZSwgVklYX2Nsb3NlKQ0Kdml4X2RhdGFfd2Vla2x5IDwtIGRhdGEuZnJhbWUoZGF0ZSA9IGluZGV4KFZJWCksIGNvcmVkYXRhKFZJWCkpJT4lDQogIGRwbHlyOjpyZW5hbWUoIlZJWF9jbG9zZSIgPSBgVklYLkNsb3NlYCklPiUNCiAgc2VsZWN0KGRhdGUsIFZJWF9jbG9zZSklPiUNCiAgbXV0YXRlKHdlZWsgPSBmbG9vcl9kYXRlKGRhdGUsICJ3ZWVrIikpJT4lDQogIGdyb3VwX2J5KHdlZWspJT4lDQogIHN1bW1hcml6ZShWSVhfY2xvc2UgPSBtZWFuKFZJWF9jbG9zZSwgbmEucm09VCkpDQoNCkdQUl9kYXRhX3dlZWtseSA8LSByZWFkeGw6OnJlYWRfZXhjZWwoIkM6L1VzZXJzL2ZrcmF1cy9EZXNrdG9wL0FydGljbGVzL2VmZmVjdHMgb2YgQ0Igc3BlZWNoZXMgb24gc3RhYmxlY29pbnMvMjAyNS9HUFIueGxzeCIpJT4lDQogIG11dGF0ZShkYXRlPWFzLkRhdGUoZGF0ZSkpJT4lDQogIHNlbGVjdCgtYyhEQVkpICklPiUNCiAgbXV0YXRlKHdlZWs9Zmxvb3JfZGF0ZShkYXRlLCAid2VlayIpKSU+JQ0KICBncm91cF9ieSh3ZWVrKSU+JQ0KICBzdW1tYXJpemUoTjEwRCA9IG1lYW4oTjEwRCksIEdQUkQgPSBtZWFuKEdQUkQpLCANCiAgICAgICAgICAgIEdQUkRfQUNUID0gbWVhbihHUFJEX0FDVCksIEdQUkRfVEhSRUFUPW1lYW4oR1BSRF9USFJFQVQpKSU+JQ0KICBmaWx0ZXIod2VlayA+IGFzLkRhdGUoIjIwMTctMDEtMDEiKSkNCg0KQ0JEQ19JbmRpY2VzIDwtIHJlYWQuY3N2MigiQzovVXNlcnMvZmtyYXVzL0Rlc2t0b3AvQ0JEQ19JbmRpY2VzLmNzdiIsDQogICAgICAgICAgICAgICAgICAgICAgICBmaWxlRW5jb2RpbmcgPSAiVVRGLTgiLA0KICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nc0FzRmFjdG9ycyA9IEZBTFNFKSU+JQ0KICBkcGx5cjo6cmVuYW1lKCJDQkRDX1VuY2VydGFpbnR5Ij0iQ0JEQy5VbmNlcnRhaW50eS5JbmRleCIsIA0KICAgICAgICAgICAgICAgICJDQkRDX0F0dGVudGlvbiI9IkNCREMuQXR0ZW50aW9uLkluZGV4IiklPiUNCiAgbXV0YXRlKERhdGUgPSBhcy5EYXRlKERhdGUsIGZvcm1hdCA9ICIlZC8lbS8lWSIpKSU+JQ0KICAgbXV0YXRlKA0KICAgICMgZml4IG51bWVyaWMgY29sdW1ucyByZWFkIGFzIGNoYXJhY3Rlcg0KICAgIGFjcm9zcyhjKENCRENfVW5jZXJ0YWludHksIENCRENfQXR0ZW50aW9uKSwNCiAgICAgICAgICAgfiBhcy5udW1lcmljKGdzdWIoIiwiLCAiLiIsIC4pKSksDQogICAgaXNvX3llYXIgPSBpc295ZWFyKERhdGUpLA0KICAgIGlzb193ZWVrID0gaXNvd2VlayhEYXRlKQ0KICApICU+JQ0KICBkaXN0aW5jdChpc29feWVhciwgaXNvX3dlZWssIC5rZWVwX2FsbCA9IFRSVUUpIA0KDQoNCiMgc2V0IHlvdXIgZGVzaXJlZCBuYW1lcw0KbmFtZXMoYXJ0ZW1pcykgPC0gYygiRGF0ZSIsIkFZU0QiLCJCVVNEIiwiREFJIiwiRVVSQyIsIkZEVVNEIiwiUFlVU0QiLCJVU0QwIiwiVVNEQyIsICAgICAgICAgICAgICAgICJVU0RHTE8iLCJVU0RQIiwiVVNEUyIsIlVTRFQiLCJVU0RZIiwiVVNEZSIsImNFVVIiLCJjS0VTIiwiY1JFQUwiLCJjVVNEIikNCg0KYXJ0ZW1pc19yYXcgPC0gYXJ0ZW1pcyAlPiUNCiAgbXV0YXRlKA0KICAgIERhdGUgPSBkbXlfaG0oRGF0ZSwgdHogPSAiVVRDIikgICMgb3IgZG15X2htcyBpZiB5b3UgaGFkIHNlY29uZHMNCiAgKQ0KDQojIHJlc2hhcGUgdG8gbG9uZyB3aXRoIHBpdm90X2xvbmdlciAodmFyaWFibGUgd2lsbCBiZSBjaGFyYWN0ZXIpDQpwYW5lbF9hcnRlbWlzIDwtIGFydGVtaXNfcmF3ICU+JQ0KICBtdXRhdGUoRGF0ZSA9IGFzLkRhdGUoRGF0ZSwgZm9ybWF0PSIlZC8lbS8leSIpKSAlPiUNCiAgcGl2b3RfbG9uZ2VyKA0KICAgIGNvbHMgPSAtRGF0ZSwNCiAgICBuYW1lc190byA9ICJzdGFibGVjb2luIiwNCiAgICB2YWx1ZXNfdG8gPSAic3VwcGx5IiwNCiAgICB2YWx1ZXNfdHJhbnNmb3JtID0gbGlzdChzdXBwbHkgPSBhcy5udW1lcmljKSAgICMgZW5zdXJlcyBudW1lcmljLCBOQXMgd2hlcmUgbmVlZGVkDQogICkgJT4lDQogIGFycmFuZ2Uoc3RhYmxlY29pbiwgRGF0ZSkgICU+JSAjIElNUE9SVEFOVDogc29ydCBiZWZvcmUgcGxvdHRpbmcNCiAgZ3JvdXBfYnkoc3RhYmxlY29pbiklPiUNCiAgbXV0YXRlKGxvZ19zdXBwbHkgPSBsb2coMStzdXBwbHkpLCBkbG9nX3N1cHBseSA9IGxvZ19zdXBwbHkgLSBsYWcobG9nX3N1cHBseSkpDQoNCg0KI3JlbW92ZSBvdXRsaWVycyBpbiBkbG9nX3N1cHANCnBhbmVsX2FydGVtaXNfdHJpbW1lZCA8LSBwYW5lbF9hcnRlbWlzICU+JQ0KICBncm91cF9ieShzdGFibGVjb2luKSAlPiUNCiAgbXV0YXRlKA0KICAgIHEwMSA9IHF1YW50aWxlKGRsb2dfc3VwcGx5LCAwLjA1LCBuYS5ybSA9IFRSVUUpLA0KICAgIHE5OSA9IHF1YW50aWxlKGRsb2dfc3VwcGx5LCAwLjk1LCBuYS5ybSA9IFRSVUUpDQogICkgJT4lDQogICMga2VlcCBvYnNlcnZhdGlvbnMgaW5zaWRlIFtxMDEsIHE5OV0NCiAgZmlsdGVyKGlzLmZpbml0ZShkbG9nX3N1cHBseSksDQogICAgICAgICAhaXMubmEocTAxKSwgIWlzLm5hKHE5OSksDQogICAgICAgICBkbG9nX3N1cHBseSA+PSBxMDEsDQogICAgICAgICBkbG9nX3N1cHBseSA8PSBxOTkpICU+JQ0KICBzZWxlY3QoLXEwMSwgLXE5OSkgJT4lDQogIGZpbHRlcihzZChkbG9nX3N1cHBseSwgbmEucm09VCkgPiAgMWUtMDYsICFkbG9nX3N1cHBseSA9PTApJT4lDQogIHVuZ3JvdXAoKQ0KDQoNCnBhbmVsX2FydGVtaXNfdHJpbW1lZF93ZWVrbHkgPC0gcGFuZWxfYXJ0ZW1pc190cmltbWVkICU+JQ0KICBtdXRhdGUod2VlayA9IGZsb29yX2RhdGUoRGF0ZSwgIndlZWsiKSklPiUNCiAgZ3JvdXBfYnkod2Vlaywgc3RhYmxlY29pbiklPiUNCiAgc3VtbWFyaXplKHN1cHBseT1tZWFuKHN1cHBseSkpJT4lDQogIG11dGF0ZShsb2dfc3VwcGx5ID0gbG9nKHN1cHBseSksICBkbG9nX3N1cHBseSA9IGxvZ19zdXBwbHktbGFnKGxvZ19zdXBwbHkpICkNCg0KDQpgYGANCiMjIFN0YXRpc3RpY3MNCmBgYHtyLCB3YXJuaW5nPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCBlY2hvPUZBTFNFfQ0KcGFuZWxfYXJ0ZW1pc190cmltbWVkICU+JSBmaWx0ZXIoRGF0ZSA8PWFzLkRhdGUoIjIwMjUtMDYtMDEiKSklPiUNCiAgZ2dwbG90KGFlcyhEYXRlLCBsb2dfc3VwcGx5KSkgKw0KICBnZW9tX2xpbmUobmEucm0gPSBUUlVFLCBsd2Q9MC44KSArDQogIGxhYnMoeCA9ICJEYXRlIiwgeSA9ICJTdXBwbHkgKGxvZykiLCB0aXRsZSA9ICJTdGFibGVjb2lucyBzdXBwbHkgKEFydGVtaXMpIiwgY2FwdGlvbiA9ICJOb3RlOiB3ZSByZW1vdmUgb3V0bGllcnMgYnkgdHJpbW1pbmcgZGF0YSBvdXRzaWRlIDUlLTk1JSBxdWFudGlsZXMuIikgKw0KICB0aGVtZV9taW5pbWFsKCkrZmFjZXRfd3JhcCh+c3RhYmxlY29pbiwgc2NhbGVzPSJmcmVlX3kiKQ0KYGBgDQpgYGB7cn0NCnBhbmVsX2FydGVtaXNfdHJpbW1lZCAlPiUNCiAgc2VsZWN0KERhdGUsIHN1cHBseSwgc3RhYmxlY29pbiklPiUNCiAgdGJsX3N1bW1hcnkoYnk9c3RhYmxlY29pbiwNCiAgICB0eXBlID0gbGlzdCgNCiAgICAgIGFsbF9jb250aW51b3VzKCkgfiAiY29udGludW91czIiLCAgIyB0b3VzIGxlcyBjb250aW51cw0KICAgICAgRGF0ZSB+ICJjb250aW51b3VzIiAgICAgICAgICAgICAgICMgc2F1ZiB3ZWVrDQogICAgKSwNCiAgICBzdGF0aXN0aWMgPSBsaXN0KA0KICAgICAgYWxsX2NvbnRpbnVvdXMoKSB+IGMoInttZWFufSAoe3NkfSkiKSwNCiAgICAgIERhdGUgfiAie21pbn0sIHttYXh9IiAgICAgICAgICAgICAjIHNldWxlbWVudCBtaW4vbWF4IHBvdXIgd2Vlaw0KICAgICksDQogICAgbGFiZWwgPSBEYXRlIH4gIkRhdGUgKG1pbiwgbWF4KSINCiAgKSU+JQ0KICBtb2RpZnlfZm9vdG5vdGUoZXZlcnl0aGluZygpIH4gTkFfY2hhcmFjdGVyXykNCmBgYA0KDQojIEZpbmFsIERhdGFiYXNlDQojIyBEYWlseQ0KYGBge3J9DQpkYXRhX2FydGVtaXMgPC1wYW5lbF9hcnRlbWlzX3RyaW1tZWQlPiUNCiAgbGVmdF9qb2luKGNiZGNfaWR4X2RhaWx5X2xhYmVscywgYnk9YygiRGF0ZSI9ImRhdGUiKSklPiUNCiAgbXV0YXRlKHF1YXJ0ZXJ5ZWFyID0gcGFzdGUwKHF1YXJ0ZXIoRGF0ZSksIHllYXIoRGF0ZSkgKSklPiUNCiAgbGVmdF9qb2luKEdQUiwgYnk9YygiRGF0ZSI9ImRhdGUiKSklPiUNCiAgbGVmdF9qb2luKHZpeF9kYXRhLCBieT1jKCJEYXRlIj0iZGF0ZSIpKSU+JQ0KICBhcnJhbmdlKHN0YWJsZWNvaW4sIERhdGUpJT4lDQogIG11dGF0ZShGVFggPSBpZmVsc2UoRGF0ZSA+IGFzLkRhdGUoIjIwMjItMTEtMDEiKSwxLDAgKSklPiUNCiAgbXV0YXRlKEx1bmEgPSBpZmVsc2UoRGF0ZSA+IGFzLkRhdGUoIjIwMjItMDUtMDEiKSwxLDAgKSklPiUNCiAgbXV0YXRlKHBlZ1R5cGUgPSBjYXNlX3doZW4oDQogICAgc3RhYmxlY29pbiA9PSAiVVNEVCJ+ICJVU0QiLA0KICAgIHN0YWJsZWNvaW4gPT0gIlVTRFAifiAiVVNEIiwNCiAgICBzdGFibGVjb2luID09ICJVU0RDIn4gIlVTRCIsDQogICAgc3RhYmxlY29pbiA9PSAiREFJIn4gIlVTRCIsDQogICAgc3RhYmxlY29pbiA9PSAiY0VVUiJ+ICJFVVIiLA0KICAgIHN0YWJsZWNvaW4gPT0gIkVVUkMifiAiRVVSIiwNCiAgICBzdGFibGVjb2luID09ICJGRFVTRCJ+ICJVU0QiLA0KICAgIHN0YWJsZWNvaW4gPT0gIlBZVVNEIn4gIlVTRCIsDQogICAgc3RhYmxlY29pbiA9PSAiVVNEWSJ+ICJVU0QiLA0KICAgIHN0YWJsZWNvaW4gPT0gIlVTRGUifiAiVVNEIiwNCiAgICBzdGFibGVjb2luID09ICJVU0RHTE8ifiAiVVNEIiwNCiAgICBzdGFibGVjb2luID09ICJBWVNEIn4gIlVTRCIsDQogICAgc3RhYmxlY29pbiA9PSAiQlVTRCJ+ICJVU0QiLA0KICAgIHN0YWJsZWNvaW4gPT0gIlVTRDAifiAiVVNEIiwNCiAgICBzdGFibGVjb2luID09ICJVU0RTIn4gIlVTRCIsDQogICAgc3RhYmxlY29pbiA9PSAiY1VTRCJ+ICJVU0QiDQogICAgKSklPiUNCiAgbXV0YXRlKHBlZ01lY2hhbmlzbSA9IGNhc2Vfd2hlbigNCiAgICBzdGFibGVjb2luID09ICJVU0RUIn4gImZpYXQiLA0KICAgIHN0YWJsZWNvaW4gPT0gIlVTRFAifiAiZmlhdCIsDQogICAgc3RhYmxlY29pbiA9PSAiVVNEQyJ+ICJmaWF0IiwNCiAgICBzdGFibGVjb2luID09ICJEQUkifiAiY3J5cHRvIiwNCiAgICBzdGFibGVjb2luID09ICJjRVVSIn4gImFsZ28iLA0KICAgIHN0YWJsZWNvaW4gPT0gIkVVUkMifiAiZmlhdCIsDQogICAgc3RhYmxlY29pbiA9PSAiRkRVU0QifiAiZmlhdCIsDQogICAgc3RhYmxlY29pbiA9PSAiUFlVU0QifiAiZmlhdCIsDQogICAgc3RhYmxlY29pbiA9PSAiVVNEWSJ+ICJmaWF0IiwNCiAgICBzdGFibGVjb2luID09ICJVU0RlIn4gImZpYXQiLA0KICAgIHN0YWJsZWNvaW4gPT0gIlVTREdMTyJ+ICJmaWF0IiwNCiAgICBzdGFibGVjb2luID09ICJBWVNEIn4gImZpYXQiLA0KICAgIHN0YWJsZWNvaW4gPT0gIkJVU0QifiAiZmlhdCIsDQogICAgc3RhYmxlY29pbiA9PSAiVVNEMCJ+ICJmaWF0IiwNCiAgICBzdGFibGVjb2luID09ICJVU0RTIn4gImZpYXQiLA0KICAgIHN0YWJsZWNvaW4gPT0gImNVU0QifiAiZmlhdCINCiAgICANCiAgKSklPiUNCiAgbXV0YXRlKGFjcm9zcygtRGF0ZSwgfiB0aWR5cjo6cmVwbGFjZV9uYSgueCwgMCkpKSU+JSAjIHJlbW92ZSB0aGlzIHRvIHJlcGxhY2UgMCB3aXRoIE5BIHdoZW4gdGhlcmUncyBubyBzcGVlY2gNCiAgcmVuYW1lX3dpdGgofiBnc3ViKCJcXC4iLCAiXyIsIC54KSkNCg0KYGBgDQoNCiMjIFdlZWtseQ0KDQpgYGB7cn0NCmRhdGFfYXJ0ZW1pc193ZWVrbHkgPC1wYW5lbF9hcnRlbWlzX3RyaW1tZWRfd2Vla2x5JT4lDQogIGxlZnRfam9pbihjYmRjX2lkeF93ZWVrbHlfbGFiZWxzLCBieT1jKCJ3ZWVrIj0iZGF0ZV93ZWVrIikpJT4lDQogIG11dGF0ZShxdWFydGVyeWVhciA9IHBhc3RlMChxdWFydGVyKHdlZWspLCB5ZWFyKHdlZWspICkpJT4lDQogIGxlZnRfam9pbih2aXhfZGF0YV93ZWVrbHksIGJ5PSJ3ZWVrIiklPiUNCiAgbGVmdF9qb2luKEdQUl9kYXRhX3dlZWtseSwgYnk9IndlZWsiKSU+JQ0KICBhcnJhbmdlKHN0YWJsZWNvaW4sIHdlZWspJT4lDQogIGRwbHlyOjpzZWxlY3Qoc3RhYmxlY29pbiwgd2VlayxldmVyeXRoaW5nKCkpJT4lDQogICNuYS5vbWl0KCklPiUNCiAgbXV0YXRlKEZUWCA9IGlmZWxzZSh3ZWVrID4gYXMuRGF0ZSgiMjAyMi0xMS0wMSIpLDEsMCApKSU+JQ0KICBtdXRhdGUoTHVuYSA9IGlmZWxzZSh3ZWVrID4gYXMuRGF0ZSgiMjAyMi0wNS0wMSIpLDEsMCApKSU+JQ0KICBhcnJhbmdlKHN0YWJsZWNvaW4sIHdlZWspJT4lDQogIG11dGF0ZShwZWdUeXBlID0gY2FzZV93aGVuKA0KICAgIHN0YWJsZWNvaW4gPT0gIlVTRFQifiAiVVNEIiwNCiAgICBzdGFibGVjb2luID09ICJVU0RQIn4gIlVTRCIsDQogICAgc3RhYmxlY29pbiA9PSAiVVNEQyJ+ICJVU0QiLA0KICAgIHN0YWJsZWNvaW4gPT0gIkRBSSJ+ICJVU0QiLA0KICAgIHN0YWJsZWNvaW4gPT0gImNFVVIifiAiRVVSIiwNCiAgICBzdGFibGVjb2luID09ICJFVVJDIn4gIkVVUiIsDQogICAgc3RhYmxlY29pbiA9PSAiRkRVU0QifiAiVVNEIiwNCiAgICBzdGFibGVjb2luID09ICJQWVVTRCJ+ICJVU0QiLA0KICAgIHN0YWJsZWNvaW4gPT0gIlVTRFkifiAiVVNEIiwNCiAgICBzdGFibGVjb2luID09ICJVU0RlIn4gIlVTRCIsDQogICAgc3RhYmxlY29pbiA9PSAiVVNER0xPIn4gIlVTRCIsDQogICAgc3RhYmxlY29pbiA9PSAiQVlTRCJ+ICJVU0QiLA0KICAgIHN0YWJsZWNvaW4gPT0gIkJVU0QifiAiVVNEIiwNCiAgICBzdGFibGVjb2luID09ICJVU0QwIn4gIlVTRCIsDQogICAgc3RhYmxlY29pbiA9PSAiVVNEUyJ+ICJVU0QiLA0KICAgIHN0YWJsZWNvaW4gPT0gImNVU0QifiAiVVNEIg0KICAgICkpJT4lDQogIG11dGF0ZShwZWdNZWNoYW5pc20gPSBjYXNlX3doZW4oDQogICAgc3RhYmxlY29pbiA9PSAiVVNEVCJ+ICJmaWF0IiwNCiAgICBzdGFibGVjb2luID09ICJVU0RQIn4gImZpYXQiLA0KICAgIHN0YWJsZWNvaW4gPT0gIlVTREMifiAiZmlhdCIsDQogICAgc3RhYmxlY29pbiA9PSAiREFJIn4gImNyeXB0byIsDQogICAgc3RhYmxlY29pbiA9PSAiY0VVUiJ+ICJhbGdvIiwNCiAgICBzdGFibGVjb2luID09ICJFVVJDIn4gImZpYXQiLA0KICAgIHN0YWJsZWNvaW4gPT0gIkZEVVNEIn4gImZpYXQiLA0KICAgIHN0YWJsZWNvaW4gPT0gIlBZVVNEIn4gImZpYXQiLA0KICAgIHN0YWJsZWNvaW4gPT0gIlVTRFkifiAiZmlhdCIsDQogICAgc3RhYmxlY29pbiA9PSAiVVNEZSJ+ICJmaWF0IiwNCiAgICBzdGFibGVjb2luID09ICJVU0RHTE8ifiAiZmlhdCIsDQogICAgc3RhYmxlY29pbiA9PSAiQVlTRCJ+ICJmaWF0IiwNCiAgICBzdGFibGVjb2luID09ICJCVVNEIn4gImZpYXQiLA0KICAgIHN0YWJsZWNvaW4gPT0gIlVTRDAifiAiZmlhdCIsDQogICAgc3RhYmxlY29pbiA9PSAiVVNEUyJ+ICJmaWF0IiwNCiAgICBzdGFibGVjb2luID09ICJjVVNEIn4gImZpYXQiDQogICAgDQogICkpJT4lDQogIG11dGF0ZShhY3Jvc3MoLXN0YWJsZWNvaW4sIH4gdGlkeXI6OnJlcGxhY2VfbmEoLngsIDApKSklPiUjIHJlbW92ZSB0aGlzIHRvIHJlcGxhY2UgMCB3aXRoIE5BIHdoZW4gdGhlcmUncyBubyBzcGVlY2gNCiAgcmVuYW1lX3dpdGgofiBnc3ViKCJcXC4iLCAiXyIsIC54KSkNCmBgYA0KDQoNCg0KDQpgYGB7cn0NCg0KbGlicmFyeShoYXZlbikNCiNoYXZlbjo6d3JpdGVfZHRhKGRhdGFfYXJ0ZW1pcywgIkM6L3VzZXJzL2ZrcmF1cy9EZXNrdG9wL0FydGljbGVzL2VmZmVjdHMgb2YgQ0Igc3BlZWNoZXMgb24gc3RhYmxlY29pbnMvMjAyNS9kYXRhX2FydGVtaXMuZHRhIikNCiNoYXZlbjo6d3JpdGVfZHRhKGRhdGFfYXJ0ZW1pc193ZWVrbHksICJDOi91c2Vycy9ma3JhdXMvRGVza3RvcC9BcnRpY2xlcy9lZmZlY3RzIG9mIENCIHNwZWVjaGVzIG9uIHN0YWJsZWNvaW5zLzIwMjUvZGF0YV9hcnRlbWlzX3dlZWtseS5kdGEiKQ0KDQpgYGANCg0KDQpgYGB7cn0NCmRhdGFfYXJ0ZW1pc193ZWVrbHkNCmBgYA0KDQoNCg0KIyBMb2NhbCBQcm9qZWN0aW9ucw0KDQokJA0KWV97aSx0K2h9LVlfe2ksdC0xfT0gXGFscGhhX2krIFxhbHBoYV9xICsgXGJldGFeaCBcRGVsdGEgWF90ICsgXGdhbW1hIFpfdCArIFxtdV97aSx0fQ0KJCQNCldoZXJlICRZJCBpcyB0aGUgbG9nLWRpZmZlcmVuY2Ugb2Ygc3RhYmxlY29pbiBzdXBwbHksICRcYWxwaGFfaSQgaXMgYW4gaW5kaXZpZHVhbCBGRSwgYW5kICRYX3QkIGlzIG91ciBpbmRleCBvZiBzcGVlY2ggQ0JEQy1yZWxhdGVkIHNlbnRpbWVudC9zdGFuY2UuICRaX3QkIGFyZSBjb250cm9sIHZhcmlhYmxlcyByZXByZXNlbnRpbmcgdGhlIFZJWCBhbmQgdGhlIEdQUkQgYW5kIHRoZWlyIGxhZ3MsIGFuZCBkdW1taWVzIHJlcHJlc2VudGluZyBUZXJyYS1MdW5hIGFuZCBGVFggY3Jhc2hlcy4gV2UgaW5jbHVkZSBpbmRpdmlkdWFsICgkXGFscGhhX2kkKSBhbmQgcXVhcnRlci15ZWFyICgkXGFscGhhX3EkKSBmaXhlZC1lZmZlY3RzLiAgDQpOb3RlIDogd2UgdGFrZSB0aGUgOTAlIGludGVydmFsIGNvbmZpZGVuY2VzIGZvciBhbGwgZXN0aW1hdGlvbnMuIFN0YW5kYXJkIGVycm9ycyBhcmUgaGV0ZXJvc2tlZGFzdGljaXR5IHJvYnVzdHMgKGNsdXN0ZXJpemVkIGJ5IHN0YWJsZWNvaW4pLiBEYXRhIGFyZSBpbiB3ZWVrbHkgZnJlcXVlbmNpZXMuDQoNCg0KIyMgQmFzZWxpbmUgcmVzdWx0cw0KYGBge3IsIGVjaG89RkFMU0UsIGluY2x1ZGU9RkFMU0V9DQpyZXF1aXJlKGxwaXJmcykNCmhvciA9IDEyDQpjb25maW50ID0gMS42NQ0KdmNvdiA9ICJ2Y292SEMiDQogDQpyZXN1bHRzX2FydGVtaXNfYXVlcl93IDwtIGxwX2xpbl9wYW5lbChkYXRhX2FydGVtaXNfd2Vla2x5JT4lDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdChzdGFibGVjb2luLCB3ZWVrLCBldmVyeXRoaW5nKCkpLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZG9nX2RhdGEgPSAiZGxvZ19zdXBwbHkiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob2NrPWMoInN0YW5jZV9hdWVyIiksIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlmZl9zaG9jayA9IFQsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdW11bF9tdWx0ID0gVCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhbmVsX21vZGVsPSJ3aXRoaW4iLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFuZWxfZWZmZWN0PSJpbmRpdmlkdWFsIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb2J1c3RfY292ID0gdmNvdiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvYnVzdF90eXBlID0gIkhDMSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjX2V4b2dfZGF0YSA9IGMoIkdQUkQiLCAiVklYX2Nsb3NlIiwgInF1YXJ0ZXJ5ZWFyIiwgIkx1bmEiLCAiRlRYIiksIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbF9leG9nX2RhdGEgPSBjKCJHUFJEIiwgIlZJWF9jbG9zZSIpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFnc19leG9nX2RhdGEgPSAxLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmludCA9IGNvbmZpbnQsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBob3IgPSBob3IpDQoNCg0KcmVzdWx0c19hcnRlbWlzX2dsb2JhbF9zZW50X3cgPC0gbHBfbGluX3BhbmVsKGRhdGFfYXJ0ZW1pc193ZWVrbHklPiUNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0KHN0YWJsZWNvaW4sIHdlZWssIGV2ZXJ5dGhpbmcoKSksIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kb2dfZGF0YSA9ICJkbG9nX3N1cHBseSIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvY2s9YygiaW5kZXhfc2VudF9nbG9iYWwiICApLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1bXVsX211bHQgPSBULA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFuZWxfbW9kZWw9IndpdGhpbiIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYW5lbF9lZmZlY3Q9ImluZGl2aWR1YWwiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvYnVzdF9jb3YgPSB2Y292LA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm9idXN0X3R5cGUgPSAiSEMxIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNfZXhvZ19kYXRhID0gYygiR1BSRCIsICJWSVhfY2xvc2UiLCAicXVhcnRlcnllYXIiLCAiTHVuYSIsICJGVFgiKSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsX2V4b2dfZGF0YSA9IGMoIkdQUkQiLCAiVklYX2Nsb3NlIiksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWdzX2V4b2dfZGF0YSA9IDEsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmludCA9IGNvbmZpbnQsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBob3IgPSBob3IpDQoNCg0KcmVzdWx0c19hcnRlbWlzX2dsb2JhbF9zdGFuY2VfdyA8LSBscF9saW5fcGFuZWwoZGF0YV9hcnRlbWlzX3dlZWtseSU+JQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3Qoc3RhYmxlY29pbiwgd2VlaywgZXZlcnl0aGluZygpKSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmRvZ19kYXRhID0gImRsb2dfc3VwcGx5IiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaG9jaz1jKCJpbmRleF9zdGFuY2VfZ2xvYmFsIiAgKSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdW11bF9tdWx0ID0gVCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhbmVsX21vZGVsPSJ3aXRoaW4iLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFuZWxfZWZmZWN0PSJpbmRpdmlkdWFsIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb2J1c3RfY292ID0gdmNvdiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvYnVzdF90eXBlID0gIkhDMSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjX2V4b2dfZGF0YSA9IGMoIkdQUkQiLCAiVklYX2Nsb3NlIiwgInF1YXJ0ZXJ5ZWFyIiwgIkx1bmEiLCAiRlRYIiksIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbF9leG9nX2RhdGEgPSBjKCJHUFJEIiwgIlZJWF9jbG9zZSIpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFnc19leG9nX2RhdGEgPSAxLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpbnQgPWNvbmZpbnQsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBob3IgPSBob3IpDQoNCnJlc3VsdHNfYXJ0ZW1pc19nZW5lcmFsX3NlbnRfdyA8LSBscF9saW5fcGFuZWwoZGF0YV9hcnRlbWlzX3dlZWtseSU+JQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3Qoc3RhYmxlY29pbiwgd2VlaywgZXZlcnl0aGluZygpKSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmRvZ19kYXRhID0gImRsb2dfc3VwcGx5IiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaG9jaz1jKCJzZW50X0dlbmVyYWxfVW5zcGVjaWZpZWQiICApLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1bXVsX211bHQgPSBULA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFuZWxfbW9kZWw9IndpdGhpbiIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYW5lbF9lZmZlY3Q9ImluZGl2aWR1YWwiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvYnVzdF9jb3YgPXZjb3YsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb2J1c3RfdHlwZSA9ICJIQzEiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY19leG9nX2RhdGEgPSBjKCJHUFJEIiwgIlZJWF9jbG9zZSIsICJxdWFydGVyeWVhciIsICJMdW5hIiwgIkZUWCIpLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxfZXhvZ19kYXRhID0gYygiR1BSRCIsICJWSVhfY2xvc2UiKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhZ3NfZXhvZ19kYXRhID0gMSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maW50ID0gY29uZmludCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhvciA9IGhvcikNCg0KcmVzdWx0c19hcnRlbWlzX2dlbmVyYWxfc3RhbmNlX3cgPC0gbHBfbGluX3BhbmVsKGRhdGFfYXJ0ZW1pc193ZWVrbHklPiUNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0KHN0YWJsZWNvaW4sIHdlZWssIGV2ZXJ5dGhpbmcoKSksIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kb2dfZGF0YSA9ICJkbG9nX3N1cHBseSIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvY2s9Yygic3RhbmNlX0dlbmVyYWxfVW5zcGVjaWZpZWQiICApLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1bXVsX211bHQgPSBULA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFuZWxfbW9kZWw9IndpdGhpbiIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYW5lbF9lZmZlY3Q9ImluZGl2aWR1YWwiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvYnVzdF9jb3YgPSB2Y292LA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm9idXN0X3R5cGUgPSAiSEMxIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNfZXhvZ19kYXRhID0gYygiR1BSRCIsICJWSVhfY2xvc2UiLCAicXVhcnRlcnllYXIiLCAiTHVuYSIsICJGVFgiKSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsX2V4b2dfZGF0YSA9IGMoIkdQUkQiLCAiVklYX2Nsb3NlIiksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWdzX2V4b2dfZGF0YSA9IDEsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maW50ID0gY29uZmludCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhvciA9IGhvcikNCg0KcmVzdWx0c19hcnRlbWlzX3JldGFpbF9zZW50X3cgPC0gbHBfbGluX3BhbmVsKGRhdGFfYXJ0ZW1pc193ZWVrbHklPiUNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0KHN0YWJsZWNvaW4sIHdlZWssIGV2ZXJ5dGhpbmcoKSksIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kb2dfZGF0YSA9ICJkbG9nX3N1cHBseSIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvY2s9Yygic2VudF9SZXRhaWxfQ0JEQyIgICksIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VtdWxfbXVsdCA9IFQsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYW5lbF9tb2RlbD0id2l0aGluIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhbmVsX2VmZmVjdD0iaW5kaXZpZHVhbCIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm9idXN0X2NvdiA9IHZjb3YsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb2J1c3RfdHlwZSA9ICJIQzEiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY19leG9nX2RhdGEgPSBjKCJHUFJEIiwgIlZJWF9jbG9zZSIsICJxdWFydGVyeWVhciIsICJMdW5hIiwgIkZUWCIpLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxfZXhvZ19kYXRhID0gYygiR1BSRCIsICJWSVhfY2xvc2UiKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhZ3NfZXhvZ19kYXRhID0gMSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maW50ID0gY29uZmludCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhvciA9IGhvcikNCg0KcmVzdWx0c19hcnRlbWlzX3JldGFpbF9zdGFuY2VfdyA8LSBscF9saW5fcGFuZWwoZGF0YV9hcnRlbWlzX3dlZWtseSU+JQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3Qoc3RhYmxlY29pbiwgd2VlaywgZXZlcnl0aGluZygpKSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmRvZ19kYXRhID0gImRsb2dfc3VwcGx5IiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaG9jaz1jKCJzdGFuY2VfUmV0YWlsX0NCREMiICApLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1bXVsX211bHQgPSBULA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFuZWxfbW9kZWw9IndpdGhpbiIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYW5lbF9lZmZlY3Q9ImluZGl2aWR1YWwiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvYnVzdF9jb3YgPSB2Y292LA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm9idXN0X3R5cGUgPSAiSEMxIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNfZXhvZ19kYXRhID0gYygiR1BSRCIsICJWSVhfY2xvc2UiLCAicXVhcnRlcnllYXIiLCAiTHVuYSIsICJGVFgiKSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsX2V4b2dfZGF0YSA9IGMoIkdQUkQiLCAiVklYX2Nsb3NlIiksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWdzX2V4b2dfZGF0YSA9IDEsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmludCA9IGNvbmZpbnQsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBob3IgPSBob3IpDQoNCg0KcmVzdWx0c19hcnRlbWlzX3dob2xlc2FsZV9zZW50X3cgPC0gbHBfbGluX3BhbmVsKGRhdGFfYXJ0ZW1pc193ZWVrbHklPiUNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0KHN0YWJsZWNvaW4sIHdlZWssIGV2ZXJ5dGhpbmcoKSksIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kb2dfZGF0YSA9ICJkbG9nX3N1cHBseSIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvY2s9Yygic2VudF9XaG9sZXNhbGVfQ0JEQyIgICksIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VtdWxfbXVsdCA9IFQsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYW5lbF9tb2RlbD0id2l0aGluIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhbmVsX2VmZmVjdD0iaW5kaXZpZHVhbCIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm9idXN0X2NvdiA9IHZjb3YsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb2J1c3RfdHlwZSA9ICJIQzEiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY19leG9nX2RhdGEgPSBjKCJHUFJEIiwgIlZJWF9jbG9zZSIsICJxdWFydGVyeWVhciIsICJMdW5hIiwgIkZUWCIpLCAgIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbF9leG9nX2RhdGEgPSBjKCJHUFJEIiwgIlZJWF9jbG9zZSIpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFnc19leG9nX2RhdGEgPSAxLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpbnQgPSBjb25maW50LA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaG9yID0gaG9yKQ0KDQpyZXN1bHRzX2FydGVtaXNfd2hvbGVzYWxlX3N0YW5jZV93IDwtIGxwX2xpbl9wYW5lbChkYXRhX2FydGVtaXNfd2Vla2x5JT4lDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdChzdGFibGVjb2luLCB3ZWVrLCBldmVyeXRoaW5nKCkpLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZG9nX2RhdGEgPSAiZGxvZ19zdXBwbHkiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob2NrPWMoInN0YW5jZV9XaG9sZXNhbGVfQ0JEQyIgICksIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VtdWxfbXVsdCA9IFQsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYW5lbF9tb2RlbD0id2l0aGluIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhbmVsX2VmZmVjdD0iaW5kaXZpZHVhbCIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm9idXN0X2NvdiA9IHZjb3YsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb2J1c3RfdHlwZSA9ICJIQzEiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY19leG9nX2RhdGEgPSBjKCJHUFJEIiwgIlZJWF9jbG9zZSIsICJxdWFydGVyeWVhciIsICJMdW5hIiwgIkZUWCIpLCAgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsX2V4b2dfZGF0YSA9IGMoIkdQUkQiLCAiVklYX2Nsb3NlIiksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWdzX2V4b2dfZGF0YSA9IDEsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmludCA9IGNvbmZpbnQsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBob3IgPSBob3IpDQoNCg0KDQpwbG90X2F1ZXJfdzwtcGxvdChyZXN1bHRzX2FydGVtaXNfYXVlcl93KQ0KDQpwbG90X2dsb2JhbHNlbnRfdzwtcGxvdChyZXN1bHRzX2FydGVtaXNfZ2xvYmFsX3NlbnRfdykNCnBsb3RfZ2xvYmFsc3RhbmNlX3c8LXBsb3QocmVzdWx0c19hcnRlbWlzX2dsb2JhbF9zdGFuY2VfdykNCg0KcGxvdF9nZW5zZW50X3c8LXBsb3QocmVzdWx0c19hcnRlbWlzX2dlbmVyYWxfc2VudF93KQ0KcGxvdF9nZW5zdGFuY2VfdzwtcGxvdChyZXN1bHRzX2FydGVtaXNfZ2VuZXJhbF9zdGFuY2VfdykNCg0KcGxvdF9yZXRzZW50X3c8LXBsb3QocmVzdWx0c19hcnRlbWlzX3JldGFpbF9zZW50X3cpDQpwbG90X3JldHN0YW5jZV93PC1wbG90KHJlc3VsdHNfYXJ0ZW1pc19yZXRhaWxfc3RhbmNlX3cpDQoNCnBsb3Rfd2hvc2VudF93PC1wbG90KHJlc3VsdHNfYXJ0ZW1pc193aG9sZXNhbGVfc2VudF93KQ0KcGxvdF93aG9zdGFuY2VfdzwtcGxvdChyZXN1bHRzX2FydGVtaXNfd2hvbGVzYWxlX3N0YW5jZV93KQ0KYGBgDQoNCklSRnMgDQpFZmZlY3Qgb2Ygc2VudGltZW50L3N0YW5jZSBzaG9ja3Mgb24gdGhlIGxvZy1kaWZmZXJlbmNlIHN1cHBseSAoZnJvbSBBcnRlbWlzLnh5eikuDQpgYGB7ciwgZWNobz1GQUxTRX0NCnBsb3RfYXVlcl93Kw0KICBwbG90X2Fubm90YXRpb24odGl0bGUgPSBzdHJfd3JhcCgiQXVlciBTZW50aW1lbnQiLCB3aWR0aCA9IDkwKSkgJg0KICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41LCBzaXplID0gMTEpKQ0KDQoocGxvdF9nbG9iYWxzZW50X3crcGxvdF9nbG9iYWxzdGFuY2VfdykrDQogIHBsb3RfYW5ub3RhdGlvbih0aXRsZSA9IHN0cl93cmFwKCJHbG9iYWwgU2VudGltZW50IChBKSBhbmQgU3RhbmNlIChCKSIsIHdpZHRoID0gOTApKSAmDQogIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUsIHNpemUgPSAxMSkpJg0KICBwbG90X2Fubm90YXRpb24odGFnX2xldmVscyA9IGMoJ0EnKSkNCg0KKHBsb3RfZ2Vuc2VudF93K3Bsb3RfZ2Vuc3RhbmNlX3cpKw0KICBwbG90X2Fubm90YXRpb24odGl0bGUgPSBzdHJfd3JhcCgiR2VuZXJhbCBTZW50aW1lbnQgKEEpIGFuZCBTdGFuY2UgKEIpIiwgd2lkdGggPSA5MCkpICYNCiAgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSwgc2l6ZSA9IDExKSkmDQogIHBsb3RfYW5ub3RhdGlvbih0YWdfbGV2ZWxzID0gYygnQScpKQ0KDQoocGxvdF9yZXRzZW50X3crcGxvdF9yZXRzdGFuY2VfdykrDQogIHBsb3RfYW5ub3RhdGlvbih0aXRsZSA9IHN0cl93cmFwKCJSZXRhaWwgU2VudGltZW50IChBKSBhbmQgU3RhbmNlIChCKSIsIHdpZHRoID0gOTApKSAmDQogIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUsIHNpemUgPSAxMSkpJg0KICBwbG90X2Fubm90YXRpb24odGFnX2xldmVscyA9IGMoJ0EnKSkNCg0KKHBsb3Rfd2hvc2VudF93K3Bsb3Rfd2hvc3RhbmNlX3cpKw0KICBwbG90X2Fubm90YXRpb24odGl0bGUgPSBzdHJfd3JhcCgiV2hvbGVzYWxlIFNlbnRpbWVudCAoQSkgYW5kIFN0YW5jZSAoQikiLCB3aWR0aCA9IDkwKSkgJg0KICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41LCBzaXplID0gMTEpKSYNCiAgcGxvdF9hbm5vdGF0aW9uKHRhZ19sZXZlbHMgPSBjKCdBJykpDQoNCg0KYGBgDQoNCg0KDQoNCiMjIERldmVsb3BlZCBWZXJzdXMgRW1lcmdpbmcgQ2VudHJhbCBCYW5rcw0KDQpgYGB7ciwgaW5jbHVkZT1GQUxTRX0NCnJlc3VsdHNfYXJ0ZW1pc19zZW50X2Rldl93IDwtIGxwX2xpbl9wYW5lbChkYXRhX2FydGVtaXNfd2Vla2x5LCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZG9nX2RhdGEgPSAiZGxvZ19zdXBwbHkiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob2NrPWMoInNlbnRfRGV2ZWxvcGVkIiAgKSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdW11bF9tdWx0ID0gVCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhbmVsX21vZGVsPSJ3aXRoaW4iLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFuZWxfZWZmZWN0PSJpbmRpdmlkdWFsIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb2J1c3RfY292ID0gdmNvdiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvYnVzdF90eXBlID0gIkhDMSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjX2V4b2dfZGF0YSA9IGMoIkdQUkQiLCAiVklYX2Nsb3NlIiwgInF1YXJ0ZXJ5ZWFyIiwgIkx1bmEiLCAiRlRYIiksICANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxfZXhvZ19kYXRhID0gYygiR1BSRCIsICJWSVhfY2xvc2UiKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhZ3NfZXhvZ19kYXRhID0gMSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpbnQgPSBjb25maW50LA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaG9yID0gaG9yKQ0KDQpyZXN1bHRzX2FydGVtaXNfc2VudF9lbWVfdyA8LSBscF9saW5fcGFuZWwoZGF0YV9hcnRlbWlzX3dlZWtseSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmRvZ19kYXRhID0gImRsb2dfc3VwcGx5IiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaG9jaz1jKCJzZW50X0VtZXJnaW5nIiAgKSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdW11bF9tdWx0ID0gVCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhbmVsX21vZGVsPSJ3aXRoaW4iLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFuZWxfZWZmZWN0PSJpbmRpdmlkdWFsIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb2J1c3RfY292ID0gdmNvdiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvYnVzdF90eXBlID0gIkhDMSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjX2V4b2dfZGF0YSA9IGMoIkdQUkQiLCAiVklYX2Nsb3NlIiwgInF1YXJ0ZXJ5ZWFyIiwgIkx1bmEiLCAiRlRYIiksIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbF9leG9nX2RhdGEgPSBjKCJHUFJEIiwgIlZJWF9jbG9zZSIpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFnc19leG9nX2RhdGEgPSAxLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmludCA9IGNvbmZpbnQsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBob3IgPSBob3IpDQoNCiMjIw0KcmVzdWx0c19hcnRlbWlzX3N0YW5jZV9kZXZfdyA8LSBscF9saW5fcGFuZWwoZGF0YV9hcnRlbWlzX3dlZWtseSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmRvZ19kYXRhID0gImRsb2dfc3VwcGx5IiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaG9jaz1jKCJzdGFuY2VfRGV2ZWxvcGVkIiAgKSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdW11bF9tdWx0ID0gVCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhbmVsX21vZGVsPSJ3aXRoaW4iLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFuZWxfZWZmZWN0PSJpbmRpdmlkdWFsIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb2J1c3RfY292ID0gdmNvdiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvYnVzdF90eXBlID0gIkhDMSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjX2V4b2dfZGF0YSA9IGMoIkdQUkQiLCAiVklYX2Nsb3NlIiwgInF1YXJ0ZXJ5ZWFyIiwgIkx1bmEiLCAiRlRYIiksICAgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsX2V4b2dfZGF0YSA9IGMoIkdQUkQiLCAiVklYX2Nsb3NlIiksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWdzX2V4b2dfZGF0YSA9IDEsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maW50ID0gY29uZmludCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhvciA9IGhvcikNCg0KcmVzdWx0c19hcnRlbWlzX3N0YW5jZV9lbWVfdyA8LSBscF9saW5fcGFuZWwoZGF0YV9hcnRlbWlzX3dlZWtseSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmRvZ19kYXRhID0gImRsb2dfc3VwcGx5IiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaG9jaz1jKCJzdGFuY2VfRW1lcmdpbmciICApLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1bXVsX211bHQgPSBULA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFuZWxfbW9kZWw9IndpdGhpbiIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYW5lbF9lZmZlY3Q9ImluZGl2aWR1YWwiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvYnVzdF9jb3YgPSB2Y292LCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvYnVzdF90eXBlID0gIkhDMSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjX2V4b2dfZGF0YSA9IGMoIkdQUkQiLCAiVklYX2Nsb3NlIiwgInF1YXJ0ZXJ5ZWFyIiwgIkx1bmEiLCAiRlRYIiksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsX2V4b2dfZGF0YSA9IGMoIkdQUkQiLCAiVklYX2Nsb3NlIiksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWdzX2V4b2dfZGF0YSA9IDEsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maW50ID0gY29uZmludCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhvciA9IGhvcikNCg0KDQoNCkRldmVsb3BlZF9zZW50X3Bsb3QgPC0gcGxvdChyZXN1bHRzX2FydGVtaXNfc2VudF9kZXZfdykNCkVtZXJnaW5nX3NlbnRfcGxvdDwtcGxvdChyZXN1bHRzX2FydGVtaXNfc2VudF9lbWVfdykNCg0KRGV2ZWxvcGVkX3N0YW5jZV9wbG90PC1wbG90KHJlc3VsdHNfYXJ0ZW1pc19zdGFuY2VfZGV2X3cpDQpFbWVyZ2luZ19zdGFuY2VfcGxvdDwtcGxvdChyZXN1bHRzX2FydGVtaXNfc3RhbmNlX2VtZV93KQ0KDQoNCg0KYGBgDQoNCmBgYHtyLCBlY2hvPUZBTFNFfQ0KKERldmVsb3BlZF9zZW50X3Bsb3QrRGV2ZWxvcGVkX3N0YW5jZV9wbG90KSsNCiAgcGxvdF9hbm5vdGF0aW9uKHRpdGxlID0gc3RyX3dyYXAoIkdsb2JhbCBTZW50aW1lbnQgKEEpIGFuZCBTdGFuY2UgKEIpIG9mIERldmVsb3BlZCBNYXJrZXRzIENCIiwgd2lkdGggPSA5MCkpICYNCiAgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSwgc2l6ZSA9IDExKSkmDQogIHBsb3RfYW5ub3RhdGlvbih0YWdfbGV2ZWxzID0gYygnQScpKQ0KDQooRW1lcmdpbmdfc2VudF9wbG90K0VtZXJnaW5nX3N0YW5jZV9wbG90KSsNCiAgcGxvdF9hbm5vdGF0aW9uKHRpdGxlID0gc3RyX3dyYXAoIkdsb2JhbCBTZW50aW1lbnQgKEEpIGFuZCBTdGFuY2UgKEIpIG9mIEVtZXJnaW5nIE1hcmtldHMgQ0IiLCB3aWR0aCA9IDkwKSkgJg0KICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41LCBzaXplID0gMTEpKSYNCiAgcGxvdF9hbm5vdGF0aW9uKHRhZ19sZXZlbHMgPSBjKCdBJykpDQpgYGANCg0KIyMgRUNCLCBGZWQgYW5kIE90aGVyDQpgYGB7ciwgaW5jbHVkZT1GQUxTRX0NCnJlc3VsdHNfYXJ0ZW1pc19zdGFuY2VfZWNiX3cgPC0gbHBfbGluX3BhbmVsKGRhdGFfYXJ0ZW1pc193ZWVrbHksIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kb2dfZGF0YSA9ICJkbG9nX3N1cHBseSIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvY2s9Yygic3RhbmNlX0VDQiIgICksIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VtdWxfbXVsdCA9IFQsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYW5lbF9tb2RlbD0id2l0aGluIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhbmVsX2VmZmVjdD0iaW5kaXZpZHVhbCIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm9idXN0X2NvdiA9IHZjb3YsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm9idXN0X3R5cGUgPSAiSEMxIiwNCmNfZXhvZ19kYXRhID0gYygiR1BSRCIsICJWSVhfY2xvc2UiLCAicXVhcnRlcnllYXIiLCAiTHVuYSIsICJGVFgiKSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbF9leG9nX2RhdGEgPSBjKCJHUFJEIiwgIlZJWF9jbG9zZSIpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFnc19leG9nX2RhdGEgPSAxLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmludCA9IGNvbmZpbnQsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBob3IgPSBob3IpDQoNCnJlc3VsdHNfYXJ0ZW1pc19zZW50X2VjYl93IDwtIGxwX2xpbl9wYW5lbChkYXRhX2FydGVtaXNfd2Vla2x5LCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZG9nX2RhdGEgPSAiZGxvZ19zdXBwbHkiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob2NrPWMoInNlbnRfRUNCIiAgKSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdW11bF9tdWx0ID0gVCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhbmVsX21vZGVsPSJ3aXRoaW4iLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFuZWxfZWZmZWN0PSJpbmRpdmlkdWFsIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb2J1c3RfY292ID0gdmNvdiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvYnVzdF90eXBlID0gIkhDMSIsDQpjX2V4b2dfZGF0YSA9IGMoIkdQUkQiLCAiVklYX2Nsb3NlIiwgInF1YXJ0ZXJ5ZWFyIiwgIkx1bmEiLCAiRlRYIiksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxfZXhvZ19kYXRhID0gYygiR1BSRCIsICJWSVhfY2xvc2UiKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhZ3NfZXhvZ19kYXRhID0gMSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpbnQgPSBjb25maW50LA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaG9yID0gaG9yKQ0KDQoNCnJlc3VsdHNfYXJ0ZW1pc19zdGFuY2VfZmVkX3cgPC0gbHBfbGluX3BhbmVsKGRhdGFfYXJ0ZW1pc193ZWVrbHksIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kb2dfZGF0YSA9ICJkbG9nX3N1cHBseSIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvY2s9Yygic3RhbmNlX0ZlZCIgICksIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VtdWxfbXVsdCA9IFQsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYW5lbF9tb2RlbD0id2l0aGluIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhbmVsX2VmZmVjdD0iaW5kaXZpZHVhbCIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm9idXN0X2NvdiA9IHZjb3YsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb2J1c3RfdHlwZSA9ICJIQzEiLA0KY19leG9nX2RhdGEgPSBjKCJHUFJEIiwgIlZJWF9jbG9zZSIsICJxdWFydGVyeWVhciIsICJMdW5hIiwgIkZUWCIpLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsX2V4b2dfZGF0YSA9IGMoIkdQUkQiLCAiVklYX2Nsb3NlIiksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWdzX2V4b2dfZGF0YSA9IDEsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maW50ID0gY29uZmludCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhvciA9IGhvcikNCg0KcmVzdWx0c19hcnRlbWlzX3NlbnRfZmVkX3cgPC0gbHBfbGluX3BhbmVsKGRhdGFfYXJ0ZW1pc193ZWVrbHksIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kb2dfZGF0YSA9ICJkbG9nX3N1cHBseSIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvY2s9Yygic2VudF9GZWQiICApLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1bXVsX211bHQgPSBULA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFuZWxfbW9kZWw9IndpdGhpbiIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYW5lbF9lZmZlY3Q9ImluZGl2aWR1YWwiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvYnVzdF9jb3YgPSB2Y292LA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm9idXN0X3R5cGUgPSAiSEMxIiwNCmNfZXhvZ19kYXRhID0gYygiR1BSRCIsICJWSVhfY2xvc2UiLCAicXVhcnRlcnllYXIiLCAiTHVuYSIsICJGVFgiKSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbF9leG9nX2RhdGEgPSBjKCJHUFJEIiwgIlZJWF9jbG9zZSIpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFnc19leG9nX2RhdGEgPSAxLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmludCA9IGNvbmZpbnQsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBob3IgPSBob3IpDQoNCg0KcmVzdWx0c19hcnRlbWlzX3N0YW5jZV9vdGhfdyA8LSBscF9saW5fcGFuZWwoZGF0YV9hcnRlbWlzX3dlZWtseSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmRvZ19kYXRhID0gImRsb2dfc3VwcGx5IiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaG9jaz1jKCJzdGFuY2VfT3RoZXIiICApLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1bXVsX211bHQgPSBULA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFuZWxfbW9kZWw9IndpdGhpbiIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYW5lbF9lZmZlY3Q9ImluZGl2aWR1YWwiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvYnVzdF9jb3YgPSB2Y292LA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm9idXN0X3R5cGUgPSAiSEMxIiwNCmNfZXhvZ19kYXRhID0gYygiR1BSRCIsICJWSVhfY2xvc2UiLCAicXVhcnRlcnllYXIiLCAiTHVuYSIsICJGVFgiKSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbF9leG9nX2RhdGEgPSBjKCJHUFJEIiwgIlZJWF9jbG9zZSIpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFnc19leG9nX2RhdGEgPSAxLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmludCA9IGNvbmZpbnQsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBob3IgPSBob3IpDQoNCnJlc3VsdHNfYXJ0ZW1pc19zZW50X290aF93IDwtIGxwX2xpbl9wYW5lbChkYXRhX2FydGVtaXNfd2Vla2x5LCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZG9nX2RhdGEgPSAiZGxvZ19zdXBwbHkiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob2NrPWMoInNlbnRfT3RoZXIiICApLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1bXVsX211bHQgPSBULA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFuZWxfbW9kZWw9IndpdGhpbiIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYW5lbF9lZmZlY3Q9ImluZGl2aWR1YWwiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvYnVzdF9jb3YgPSB2Y292LA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm9idXN0X3R5cGUgPSAiSEMxIiwNCmNfZXhvZ19kYXRhID0gYygiR1BSRCIsICJWSVhfY2xvc2UiLCAicXVhcnRlcnllYXIiLCAiTHVuYSIsICJGVFgiKSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbF9leG9nX2RhdGEgPSBjKCJHUFJEIiwgIlZJWF9jbG9zZSIpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFnc19leG9nX2RhdGEgPSAxLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmludCA9IGNvbmZpbnQsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBob3IgPSBob3IpDQoNCmVjYl9zZW50X3Bsb3QgPC0gcGxvdChyZXN1bHRzX2FydGVtaXNfc2VudF9lY2JfdykNCmVjYl9zdGFuY2VfcGxvdCA8LSBwbG90KHJlc3VsdHNfYXJ0ZW1pc19zdGFuY2VfZWNiX3cpDQoNCmZlZF9zZW50X3Bsb3Q8LXBsb3QocmVzdWx0c19hcnRlbWlzX3NlbnRfZmVkX3cpDQpmZWRfc3RhbmNlX3Bsb3QgPC0gcGxvdChyZXN1bHRzX2FydGVtaXNfc3RhbmNlX2ZlZF93KQ0KDQpvdGhlcl9zZW50X3Bsb3Q8LXBsb3QocmVzdWx0c19hcnRlbWlzX3NlbnRfb3RoX3cpDQpvdGhlcl9zdGFuY2VfcGxvdCA8LSBwbG90KHJlc3VsdHNfYXJ0ZW1pc19zdGFuY2Vfb3RoX3cpDQoNCmBgYA0KDQpgYGB7ciwgZWNobz1GQUxTRX0NCihlY2Jfc2VudF9wbG90K2VjYl9zdGFuY2VfcGxvdCkrDQogIHBsb3RfYW5ub3RhdGlvbih0aXRsZSA9IHN0cl93cmFwKCJHbG9iYWwgU2VudGltZW50IChBKSBhbmQgU3RhbmNlIChCKSBvZiBFQ0IiLCB3aWR0aCA9IDkwKSkgJg0KICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41LCBzaXplID0gMTEpKSYNCiAgcGxvdF9hbm5vdGF0aW9uKHRhZ19sZXZlbHMgPSBjKCdBJykpDQoNCihmZWRfc2VudF9wbG90K2ZlZF9zdGFuY2VfcGxvdCkrDQogIHBsb3RfYW5ub3RhdGlvbih0aXRsZSA9IHN0cl93cmFwKCJHbG9iYWwgU2VudGltZW50IChBKSBhbmQgU3RhbmNlIChCKSBvZiBGZWQiLCB3aWR0aCA9IDkwKSkgJg0KICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41LCBzaXplID0gMTEpKSYNCiAgcGxvdF9hbm5vdGF0aW9uKHRhZ19sZXZlbHMgPSBjKCdBJykpDQoNCihvdGhlcl9zZW50X3Bsb3Qrb3RoZXJfc3RhbmNlX3Bsb3QpKw0KICBwbG90X2Fubm90YXRpb24odGl0bGUgPSBzdHJfd3JhcCgiR2xvYmFsIFNlbnRpbWVudCAoQSkgYW5kIFN0YW5jZSAoQikgb2YgT3RoZXIgQ0IiLCB3aWR0aCA9IDkwKSkgJg0KICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41LCBzaXplID0gMTEpKSYNCiAgcGxvdF9hbm5vdGF0aW9uKHRhZ19sZXZlbHMgPSBjKCdBJykpDQoNCmBgYA0KDQoNCiMjIEVmZmVjdCBvbiBmaWF0IGN1cnJlbmN5DQpgYGB7ciwgZWNobz1GQUxTRSwgaW5jbHVkZT1GQUxTRX0NCmVjYl9ldXJfc2VudCA8LSBscF9saW5fcGFuZWwoZGF0YV9hcnRlbWlzX3dlZWtseSU+JWZpbHRlcihzdGFibGVjb2luJWluJSBjKCJFVVJDIiwiY0VVUiIpKSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmRvZ19kYXRhID0gImRsb2dfc3VwcGx5IiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaG9jaz1jKCJzZW50X0VDQiIgICksIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VtdWxfbXVsdCA9IFQsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYW5lbF9tb2RlbD0id2l0aGluIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhbmVsX2VmZmVjdD0iaW5kaXZpZHVhbCIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm9idXN0X2NvdiA9IHZjb3YsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb2J1c3RfdHlwZSA9ICJIQzEiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY19leG9nX2RhdGEgPSBjKCJHUFJEIiwgIlZJWF9jbG9zZSIsICJxdWFydGVyeWVhciIpLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxfZXhvZ19kYXRhID0gYygiR1BSRCIsICJWSVhfY2xvc2UiKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhZ3NfZXhvZ19kYXRhID0gMSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpbnQgPSBjb25maW50LA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaG9yID0gaG9yKQ0KDQplY2JfZXVyX3N0YW5jZSA8LSBscF9saW5fcGFuZWwoZGF0YV9hcnRlbWlzX3dlZWtseSU+JWZpbHRlcihzdGFibGVjb2luJWluJSBjKCJFVVJDIiwiY0VVUiIpKSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmRvZ19kYXRhID0gImRsb2dfc3VwcGx5IiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaG9jaz1jKCJzdGFuY2VfRUNCIiAgKSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdW11bF9tdWx0ID0gVCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhbmVsX21vZGVsPSJ3aXRoaW4iLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFuZWxfZWZmZWN0PSJpbmRpdmlkdWFsIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb2J1c3RfY292ID0gdmNvdiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvYnVzdF90eXBlID0gIkhDMSIsDQpjX2V4b2dfZGF0YSA9IGMoIkdQUkQiLCAiVklYX2Nsb3NlIiwgInF1YXJ0ZXJ5ZWFyIiwgIkx1bmEiLCAiRlRYIiksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxfZXhvZ19kYXRhID0gYygiR1BSRCIsICJWSVhfY2xvc2UiKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhZ3NfZXhvZ19kYXRhID0gMSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpbnQgPSBjb25maW50LA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaG9yID0gaG9yKQ0KDQplY2JfZXVyX3NlbnRfcGxvdCA8LSBwbG90KGVjYl9ldXJfc2VudCkNCmVjYl9ldXJfc3RhbmNlX3Bsb3QgPC0gcGxvdChlY2JfZXVyX3N0YW5jZSkNCg0KYGBgDQpgYGB7ciwgZWNobz1GQUxTRX0NCihlY2JfZXVyX3NlbnRfcGxvdCtlY2JfZXVyX3N0YW5jZV9wbG90KSsNCiAgcGxvdF9hbm5vdGF0aW9uKHRpdGxlID0gc3RyX3dyYXAoIkdsb2JhbCBTZW50aW1lbnQgKEEpIGFuZCBTdGFuY2UgKEIpIG9mIEVDQiBvbiBFVVItZGVub21pbmF0ZWQgc3RhYmxlY29pbnMiLCB3aWR0aCA9IDkwKSkgJg0KICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41LCBzaXplID0gMTEpKSYNCiAgcGxvdF9hbm5vdGF0aW9uKHRhZ19sZXZlbHMgPSBjKCdBJykpDQoNCg0KYGBgDQoNCmBgYHtyLCBlY2hvPUZBTFNFLCBpbmNsdWRlPUZBTFNFfQ0KZWNiX3VzZF9zZW50IDwtIGxwX2xpbl9wYW5lbChkYXRhX2FydGVtaXNfd2Vla2x5JT4lZmlsdGVyKCFzdGFibGVjb2luICVpbiUgYygiRVVSQyIsImNFVVIiKSksIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kb2dfZGF0YSA9ICJkbG9nX3N1cHBseSIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvY2s9Yygic2VudF9FQ0IiICApLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1bXVsX211bHQgPSBULA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFuZWxfbW9kZWw9IndpdGhpbiIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYW5lbF9lZmZlY3Q9ImluZGl2aWR1YWwiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvYnVzdF9jb3YgPSB2Y292LA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb2J1c3RfdHlwZSA9ICJIQzEiLA0KY19leG9nX2RhdGEgPSBjKCJHUFJEIiwgIlZJWF9jbG9zZSIsICJxdWFydGVyeWVhciIsICJMdW5hIiwgIkZUWCIpLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsX2V4b2dfZGF0YSA9IGMoIkdQUkQiLCAiVklYX2Nsb3NlIiksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWdzX2V4b2dfZGF0YSA9IDEsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maW50ID0gY29uZmludCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhvciA9IGhvcikNCg0KZWNiX3VzZF9zdGFuY2UgPC0gbHBfbGluX3BhbmVsKGRhdGFfYXJ0ZW1pc193ZWVrbHklPiVmaWx0ZXIoIXN0YWJsZWNvaW4gJWluJSBjKCJFVVJDIiwiY0VVUiIpKSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmRvZ19kYXRhID0gImRsb2dfc3VwcGx5IiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaG9jaz1jKCJzdGFuY2VfRUNCIiAgKSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdW11bF9tdWx0ID0gVCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhbmVsX21vZGVsPSJ3aXRoaW4iLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFuZWxfZWZmZWN0PSJpbmRpdmlkdWFsIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb2J1c3RfY292ID0gdmNvdiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvYnVzdF90eXBlID0gIkhDMSIsDQpjX2V4b2dfZGF0YSA9IGMoIkdQUkQiLCAiVklYX2Nsb3NlIiwgInF1YXJ0ZXJ5ZWFyIiwgIkx1bmEiLCAiRlRYIiksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxfZXhvZ19kYXRhID0gYygiR1BSRCIsICJWSVhfY2xvc2UiKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhZ3NfZXhvZ19kYXRhID0gMSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpbnQgPSBjb25maW50LA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaG9yID0gaG9yKQ0KDQplY2JfdXNkX3NlbnRfcGxvdCA8LSBwbG90KGVjYl91c2Rfc2VudCkNCmVjYl91c2Rfc3RhbmNlX3Bsb3QgPC0gcGxvdChlY2JfdXNkX3N0YW5jZSkNCmBgYA0KYGBge3IsIGVjaG89RkFMU0V9DQooZWNiX3VzZF9zZW50X3Bsb3QrZWNiX3VzZF9zdGFuY2VfcGxvdCkrDQogIHBsb3RfYW5ub3RhdGlvbih0aXRsZSA9IHN0cl93cmFwKCJHbG9iYWwgU2VudGltZW50IChBKSBhbmQgU3RhbmNlIChCKSBvZiBFQ0Igb24gVVNELWRlbm9taW5hdGVkIHN0YWJsZWNvaW5zIiwgd2lkdGggPSA5MCkpICYNCiAgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSwgc2l6ZSA9IDExKSkmDQogIHBsb3RfYW5ub3RhdGlvbih0YWdfbGV2ZWxzID0gYygnQScpKQ0KDQpgYGANCg0KDQoNCg0KDQoNCg0K