In this script, I select, recode and create variables of the Dutch survey on climate change from I&O research

#Load packages required for dataprep
rm(list = ls())
library(foreign) 
library(tidyverse) 
library(plyr) 
library(dplyr)

2019

#Load the datafiles one by one
io2019 <- foreign::read.spss("/Users/anuschka/Documents/gesis_dir/i&o/i&o2019.sav", use.value.labels = T,  to.data.frame = T)
#Gives a warning because of the open answers (long strings), but I won't use those anyway

#Now I will only select the variables that I need for my thesis, but here you can insert any variable that's in the dataset. Furthermore, I don't want the respondents that completed the survey with panelclix because they have more missings on demographic variables that i want to use
io2019sel <- io2019 %>% filter(bron=="IOPanel") %>%
            select(v18, v10_1:v10_3, v20_2, v20_4, v20_6, v20_8, v19c_1, id, bron, GESLACHT, IOOPLEIDING, IOINKOMEN, IOPOL2017, LEEFTIJD, ETNICITEIT_CBS2STEEKPROEF, stedc, opleiding_her, HUISHOUDENSSAMENSTELLING)

#Let's inspect the other datasets first to determine which questions are asked more often
io2020 <- foreign::read.spss("/Users/anuschka/Documents/gesis_dir/i&o/i&o2020.sav", use.value.labels = T,  to.data.frame = T)

look_for(io2020, "huishouden")

io2020sel <- io2020 %>% filter(bron=="I&O panel") %>%
            select(V01, V02, V10_1:V10_3, v20a_2, v20a_4, v20a_6, v20a_8, bron, id, cross1, IOOPLEIDING, IOINKOMEN, IOPOL2017, LEEFTIJD, OPLEID_HER, ETNICITEIT_CBS2STEEKPROEF, HUISHOUDENSSAMENSTELLING)

io2022 <- foreign::read.spss("/Users/anuschka/Documents/gesis_dir/i&o/i&o2022.sav", use.value.labels = T,  to.data.frame = T)

io2022sel <- io2022 %>% filter(bron=="I&O panel") %>%
            select(V01, V02, v10_1:v10_3, V20a_2, V20a_4, V20a_6, V20a_8, bron, id, cross1, IOOPLEIDING, LEEFTIJD, OPLEID_HER, IOINKOMEN_NEW, IOPOL2021, ETNICITEIT_CBS2STEEKPROEF, opleiding_her, HUISHOUDENSSAMENSTELLING) 

#No urbanity in 2020 and 2022
#Now I've selected the variables, I need to recode them in the same way across the three datasets
io2019sel$worried <- as.numeric(io2019sel$v18)
io2019sel <- io2019sel %>% 
     mutate_at(c("worried"), funs(recode(., `1` = 4, `2` = 3, `3` = 2, `4` = 1)))
io2019sel$worried[io2019sel$worried==5] <- NA

#Have to create a variable that ranges from 1 to 5
io2019sel$worried <- (io2019sel$worried - 1) *(4/3) + 1 

io2019sel$frontrunner <- as.numeric(io2019sel$v20_6)
io2019sel$worry_future <- as.numeric(io2019sel$v20_8)

io2019sel <- io2019sel %>% 
     mutate_at(c("frontrunner", "worry_future"), funs(recode(., `1` = 5, `2` = 4, `3` = 3, `4` = 2, `5`= 1)))

io2019sel$frontrunner[io2019sel$frontrunner==6] <- NA
io2019sel$worry_future[io2019sel$worry_future==6] <- NA

#Make the non-recoded dep vars also numeric, code "idk" as missing. 
io2019sel$resp_citiz <- as.numeric(io2019sel$v20_2)
io2019sel$resp_citiz[io2019sel$resp_citiz==6] <- NA
io2019sel$dk_start <- as.numeric(io2019sel$v20_4)
io2019sel$dk_start[io2019sel$dk_start==6] <- NA
io2019sel$do_gov <- as.numeric(io2019sel$v19c_1)
io2019sel$do_gov[io2019sel$do_gov==4] <- NA
io2019sel$do_gov <- (io2019sel$do_gov - 1) *(4/2) + 1
io2019sel$buss_help <- as.numeric(io2019sel$v10_1)
io2019sel$buss_help[io2019sel$buss_help==6] <- NA
io2019sel$min_contr <- as.numeric(io2019sel$v10_2)
io2019sel$min_contr[io2019sel$min_contr==6] <- NA
io2019sel$human_resp <- as.numeric(io2019sel$v10_3)
io2019sel$human_resp[io2019sel$human_resp==6] <- NA

#Recode the independent vars 
io2019sel$sex <- revalue(io2019sel$GESLACHT, c("Man"="1", "Vrouw"="2"))
table(io2019sel$IOINKOMEN, useNA = "always") 
io2019sel$income <- as.numeric(io2019sel$IOINKOMEN)
io2019sel$income[io2019sel$income==6] <- NA
mean(io2019sel$income, na.rm=T) 
io2019sel$income[is.na(io2019sel$income)] <- 3.076
io2019sel$income_quart <- with(io2019sel, cut(income, 
                                breaks=quantile(income, probs=seq(0,1, by=0.25), na.rm=TRUE), 
                                include.lowest=TRUE))
io2019sel$income_quart <- as.numeric(io2019sel$income_quart)

freq(io2019sel$ETNICITEIT_CBS2STEEKPROEF) 
io2019sel$ethnicity <- revalue(io2019sel$ETNICITEIT_CBS2STEEKPROEF, c("Autochtoon"="dutch", "Westerse allochtoon"="western", "Niet-Westerse allochtoon"="non-western","Onbekend" = "unknown"))

table(io2019sel$IOOPLEIDING)
io2019sel$IOOPLEIDING <- as.numeric(io2019sel$IOOPLEIDING)
io2019sel$isced[io2019sel$IOOPLEIDING == 1] <- 0
io2019sel$isced[io2019sel$IOOPLEIDING == 2] <- 1
io2019sel$isced[io2019sel$IOOPLEIDING == 3] <- 2
io2019sel$isced[io2019sel$IOOPLEIDING == 4] <- 3
io2019sel$isced[io2019sel$IOOPLEIDING == 5] <- 4
io2019sel$isced[io2019sel$IOOPLEIDING == 6 | io2019sel$IOOPLEIDING ==7] <- 5

io2019sel$educ_cat <- revalue(io2019sel$opleiding_her, c("Laag"="Low", "Middelbaar"="Medium", "Hoog"="High"))
io2019sel$urban <- revalue(io2019sel$stedc, c("Niet stedelijk"= "Low urbanity", "Weinig stedelijk"="Low urbanity", "Matig stedelijk"="Medium urbanity", "Sterk stedelijk"="High urbanity", "Zeer sterk stedelijk"="High urbanity"))
table(io2019sel$urban, useNA = "always") #2 missings

table(io2019sel$HUISHOUDENSSAMENSTELLING, useNA = "always")
io2019sel$HUISHOUDENSSAMENSTELLING <- as.numeric(io2019sel$HUISHOUDENSSAMENSTELLING)
io2019sel$marstat[io2019sel$HUISHOUDENSSAMENSTELLING==3 | io2019sel$HUISHOUDENSSAMENSTELLING ==4 | io2019sel$HUISHOUDENSSAMENSTELLING ==5] <- 1
io2019sel$marstat[io2019sel$HUISHOUDENSSAMENSTELLING==1 | io2019sel$HUISHOUDENSSAMENSTELLING ==2 | io2019sel$HUISHOUDENSSAMENSTELLING ==6] <- 2
io2019sel$marstat[io2019sel$HUISHOUDENSSAMENSTELLING ==7 ] <- NA
table(io2019sel$marstat, useNA = "always")

io2019sel$age <- as.numeric(as.character(io2019sel$LEEFTIJD))

#Lr placement based on CHES en poppa data on expert means
load("/Users/anuschka/Documents/climatechange/climatechange/data/all_waves/expert.RData")
io2019sel$party_name <- as.character(io2019sel$IOPOL2017)
io2019sel$party_name <- revalue(io2019sel$party_name, c("ChristenUnie"= "CU", "50 Plus"="50PLUS", "GroenLinks"="GL", "Partij voor de Dieren"="PvdD", "Forum voor Democratie"="FvD"))
io2019sel <- io2019sel %>% left_join(expert2, by="party_name") 

table(io2019sel$lroverall_mean, useNA = "always")

#Missings
lapply(io2019sel, table, useNA = "always")

mis_vars <- c("lroverall_mean") 

for (var in mis_vars) {
  io2019sel[is.na(io2019sel[,var]), var] <- mean(io2019sel[,var], na.rm = TRUE)
}

#Now I again select the variables that I want to keep
io2019sel <- io2019sel %>% 
            select(id, worried, frontrunner, worry_future, resp_citiz, dk_start, do_gov, buss_help, min_contr, human_resp, sex, educ_cat, isced, urban, age, income_quart, IOINKOMEN, IOPOL2017, ethnicity, marstat, lroverall_mean)  %>%
            dplyr::rename (lrplace = lroverall_mean)

save(io2019sel, file = "/Users/anuschka/Documents/climatechange/climatechange/data/all_waves/io2019sel.RData")

load("/Users/anuschka/Documents/climatechange/climatechange/data/all_waves/io2019sel.RData")

2020

#Do the same for 2020
io2020sel$worried <- as.numeric(io2020sel$V01)
io2020sel <- io2020sel %>% 
     mutate_at(c("worried"), funs(recode(., `1` = 4, `2` = 3, `3` = 2, `4` = 1)))
io2020sel$worried[io2020sel$worried==5] <- NA
io2020sel$worried <- (io2020sel$worried - 1) * (4/3) + 1

io2020sel$frontrunner <- as.numeric(io2020sel$v20a_6)
io2020sel$worry_future <- as.numeric(io2020sel$v20a_8)

io2020sel <- io2020sel %>% 
     mutate_at(c("frontrunner", "worry_future"), funs(recode(., `1` = 5, `2` = 4, `3` = 3, `4` = 2, `5`= 1)))

io2020sel$frontrunner[io2020sel$frontrunner==6] <- NA
io2020sel$worry_future[io2020sel$worry_future==6] <- NA

#Make the non-recoded dep vars also numeric, code "idk" as missing. 
io2020sel$resp_citiz <- as.numeric(io2020sel$v20a_2)
io2020sel$resp_citiz[io2020sel$resp_citiz==6] <- NA
io2020sel$dk_start <- as.numeric(io2020sel$v20a_4)
io2020sel$dk_start[io2020sel$dk_start==6] <- NA
io2020sel$buss_help <- as.numeric(io2020sel$V10_1)
io2020sel$buss_help[io2020sel$buss_help==6] <- NA
io2020sel$min_contr <- as.numeric(io2020sel$V10_2)
io2020sel$min_contr[io2020sel$min_contr==6] <- NA
io2020sel$human_resp <- as.numeric(io2020sel$V10_3)
io2020sel$human_resp[io2020sel$human_resp==6] <- NA

# This variable is not exactly asked in the same way as in previous wave
io2020sel$do_gov <- as.numeric(io2020sel$V02)
io2020sel <- io2020sel %>% 
     mutate_at(c("do_gov"), funs(recode(., `1` = 5, `2` = 4, `3` = 3, `4` = 2, `5`= 1)))
io2020sel$do_gov[io2020sel$do_gov==6] <- NA

#Independent vars
io2020sel$sex <- revalue(io2020sel$cross1, c("Man"="1", "Vrouw"="2"))
table(io2020sel$IOINKOMEN)
io2020sel$income <- as.numeric(io2020sel$IOINKOMEN)
io2020sel$income[io2020sel$income==6] <- NA
mean(io2020sel$income, na.rm=T) 
io2020sel$income[is.na(io2020sel$income)] <- 3.114
 io2020sel$income_quart <- with(io2020sel, cut(income, 
                                breaks=quantile(income, probs=seq(0,1, by=0.25), na.rm=TRUE), 
                                include.lowest=TRUE))
io2020sel$income_quart <- as.numeric(io2020sel$income_quart)

freq(io2020sel$ETNICITEIT_CBS2STEEKPROEF) 
io2020sel$ethnicity <- revalue(io2020sel$ETNICITEIT_CBS2STEEKPROEF, c("Autochtoon"="dutch", "Westerse allochtoon"="western", "Niet-Westerse allochtoon"="non-western","Onbekend" = "unknown"))

table(io2020sel$IOOPLEIDING)
io2020sel$IOOPLEIDING <- as.numeric(io2020sel$IOOPLEIDING)
io2020sel$isced[io2020sel$IOOPLEIDING == 1] <- 0
io2020sel$isced[io2020sel$IOOPLEIDING == 2] <- 1
io2020sel$isced[io2020sel$IOOPLEIDING == 3] <- 2
io2020sel$isced[io2020sel$IOOPLEIDING == 4] <- 3
io2020sel$isced[io2020sel$IOOPLEIDING == 5] <- 4
io2020sel$isced[io2020sel$IOOPLEIDING == 6 | io2020sel$IOOPLEIDING ==7] <- 5

io2020sel$educ_cat <- revalue(io2020sel$OPLEID_HER, c("laag"="Low", "midden"="Medium", "hoog"="High"))

table(io2020sel$HUISHOUDENSSAMENSTELLING, useNA = "always")
io2020sel$HUISHOUDENSSAMENSTELLING <- as.numeric(io2020sel$HUISHOUDENSSAMENSTELLING)
io2020sel$marstat[io2020sel$HUISHOUDENSSAMENSTELLING==3 | io2020sel$HUISHOUDENSSAMENSTELLING ==4 | io2020sel$HUISHOUDENSSAMENSTELLING ==5] <- 1
io2020sel$marstat[io2020sel$HUISHOUDENSSAMENSTELLING==1 | io2020sel$HUISHOUDENSSAMENSTELLING ==2 | io2020sel$HUISHOUDENSSAMENSTELLING ==6] <- 2
io2020sel$marstat[io2020sel$HUISHOUDENSSAMENSTELLING ==7 ] <- NA
table(io2020sel$marstat, useNA = "always")

io2020sel$age <- as.numeric(as.character(io2020sel$LEEFTIJD))

io2020sel$party_name <- as.character(io2020sel$IOPOL2017)
unique(io2020sel$party_name)
io2020sel$party_name <- revalue(io2020sel$party_name, c("ChristenUnie"= "CU", "50 Plus"="50PLUS", "GroenLinks"="GL", "Partij voor de Dieren"="PvdD", "Forum voor Democratie"="FvD"))
io2020sel <- io2020sel %>% left_join(expert2, by="party_name") 

# Missings
lapply(io2020sel, table, useNA = "always")

mis_vars <- c("lroverall_mean") 

for (var in mis_vars) {
  io2020sel[is.na(io2020sel[,var]), var] <- mean(io2020sel[,var], na.rm = TRUE)
}

#Select the variables that I want to keep
io2020sel <- io2020sel %>% 
            select(id, worried, frontrunner, worry_future, resp_citiz, dk_start, do_gov, buss_help, min_contr, human_resp, sex, educ_cat, isced, age, income_quart, IOINKOMEN, IOPOL2017, ethnicity, marstat, lroverall_mean) %>%
            dplyr::rename (lrplace = lroverall_mean)

save(io2020sel, file = "/Users/anuschka/Documents/climatechange/climatechange/data/all_waves/io2020sel.RData")

2022

#And the last wave of 2022
io2022sel$worried <- as.numeric(io2022sel$V01)
io2022sel <- io2022sel %>% 
     mutate_at(c("worried"), funs(recode(., `1` = 4, `2` = 3, `3` = 2, `4` = 1)))
io2022sel$worried[io2022sel$worried==5] <- NA
io2022sel$worried <- (io2022sel$worried - 1) * (4/3) + 1

io2022sel$frontrunner <- as.numeric(io2022sel$V20a_6)
io2022sel$worry_future <- as.numeric(io2022sel$V20a_8)

io2022sel <- io2022sel %>% 
     mutate_at(c("frontrunner", "worry_future"), funs(recode(., `1` = 5, `2` = 4, `3` = 3, `4` = 2, `5`= 1)))

io2022sel$frontrunner[io2022sel$frontrunner==6] <- NA
io2022sel$worry_future[io2022sel$worry_future==6] <- NA

#Make the non-recoded dep vars also numeric, code "idk" as missing. 
io2022sel$resp_citiz <- as.numeric(io2022sel$V20a_2)
io2022sel$resp_citiz[io2022sel$resp_citiz==6] <- NA
io2022sel$dk_start <- as.numeric(io2022sel$V20a_4)
io2022sel$dk_start[io2022sel$dk_start==6] <- NA
io2022sel$buss_help <- as.numeric(io2022sel$v10_1)
io2022sel$buss_help[io2022sel$buss_help==6] <- NA
io2022sel$min_contr <- as.numeric(io2022sel$v10_2)
io2022sel$min_contr[io2022sel$min_contr==6] <- NA
io2022sel$human_resp <- as.numeric(io2022sel$v10_3)
io2022sel$human_resp[io2022sel$human_resp==6] <- NA

io2022sel$do_gov <- as.numeric(io2022sel$V02)
io2022sel <- io2022sel %>% 
     mutate_at(c("do_gov"), funs(recode(., `1` = 5, `2` = 4, `3` = 3, `4` = 2, `5`= 1)))
io2022sel$do_gov[io2022sel$do_gov==6] <- NA

#Independent vars
io2022sel$sex <- revalue(io2022sel$cross1, c("Man"="1", "Vrouw"="2"))
table(io2022sel$IOINKOMEN, useNA = "always") 
io2022sel$income <- as.numeric(io2022sel$IOINKOMEN_NEW)
io2022sel$income[io2022sel$income==6] <- NA
mean(io2022sel$income, na.rm=T) 
io2022sel$income[is.na(io2022sel$income)] <- 4.354
 io2022sel$income_quart <- with(io2022sel, cut(income, 
                                breaks=quantile(income, probs=seq(0,1, by=0.25), na.rm=TRUE), 
                                include.lowest=TRUE))
io2022sel$income_quart <- as.numeric(io2022sel$income_quart)

freq(io2022sel$ETNICITEIT_CBS2STEEKPROEF) 
io2022sel$ethnicity <- revalue(io2022sel$ETNICITEIT_CBS2STEEKPROEF, c("Nederlands"="dutch", "Westers"="western", "Niet-westers"="non-western","Onbekend" = "unknown"))

table(io2022sel$IOOPLEIDING)
io2022sel$IOOPLEIDING <- as.numeric(io2022sel$IOOPLEIDING)
io2022sel$isced[io2022sel$IOOPLEIDING == 1] <- 0
io2022sel$isced[io2022sel$IOOPLEIDING == 2] <- 1
io2022sel$isced[io2022sel$IOOPLEIDING == 3] <- 2
io2022sel$isced[io2022sel$IOOPLEIDING == 4] <- 3
io2022sel$isced[io2022sel$IOOPLEIDING == 5] <- 4
io2022sel$isced[io2022sel$IOOPLEIDING == 6 | io2022sel$IOOPLEIDING ==7] <- 5

io2022sel$educ_cat <- revalue(io2022sel$OPLEID_HER, c("laag"="Low", "midden"="Medium", "hoog"="High"))

table(io2022sel$HUISHOUDENSSAMENSTELLING, useNA = "always")
io2022sel$HUISHOUDENSSAMENSTELLING <- as.numeric(io2022sel$HUISHOUDENSSAMENSTELLING)
io2022sel$marstat[io2022sel$HUISHOUDENSSAMENSTELLING==3 | io2022sel$HUISHOUDENSSAMENSTELLING ==4 | io2022sel$HUISHOUDENSSAMENSTELLING ==5] <- 1
io2022sel$marstat[io2022sel$HUISHOUDENSSAMENSTELLING==1 | io2022sel$HUISHOUDENSSAMENSTELLING ==2 | io2022sel$HUISHOUDENSSAMENSTELLING ==6] <- 2
io2022sel$marstat[io2022sel$HUISHOUDENSSAMENSTELLING ==7 ] <- NA
table(io2022sel$marstat, useNA = "always")

io2022sel$age <- as.numeric(as.character(io2022sel$LEEFTIJD))

io2022sel$party_name <- as.character(io2022sel$IOPOL2021)
unique(io2022sel$party_name)
io2022sel$party_name <- revalue(io2022sel$party_name, c("ChristenUnie"= "CU", "GroenLinks"="GL", "Partij voor de Dieren"="PvdD", "Forum voor Democratie"="FvD"))
io2022sel <- io2022sel %>% left_join(expert2, by="party_name") 

# Missings
lapply(io2022sel, table, useNA = "always")

mis_vars <- c("lroverall_mean") 

for (var in mis_vars) {
  io2022sel[is.na(io2022sel[,var]), var] <- mean(io2022sel[,var], na.rm = TRUE)
}

#Select the variables that I want to keep
io2022sel <- io2022sel %>% 
            select(id, worried, frontrunner, worry_future, resp_citiz, dk_start, do_gov, buss_help, min_contr, human_resp, sex, educ_cat, isced, age, income_quart, IOINKOMEN_NEW, IOPOL2021, ethnicity, marstat, lroverall_mean) %>%
            dplyr::rename (lrplace = lroverall_mean)

save(io2022sel, file = "/Users/anuschka/Documents/climatechange/climatechange/data/all_waves/io2022sel.RData")

Merging all datasets

#Check whether variables have the same level before merging
attributes(io2019sel$worried)
attributes(io2020sel$worried)
attributes(io2022sel$worried)

attributes(io2019sel$frontrunner)
attributes(io2020sel$frontrunner)
attributes(io2022sel$frontrunner)

attributes(io2019sel$sex)
attributes(io2020sel$sex)
attributes(io2022sel$sex)

attributes(io2019sel$income)
attributes(io2020sel$income)
attributes(io2022sel$income) 

attributes(io2019sel$educ_cat)
attributes(io2020sel$educ_cat)
attributes(io2022sel$educ_cat)

attributes(io2019sel$party_name)
attributes(io2020sel$party_name)
attributes(io2022sel$party_name) 

attributes(io2019sel$ethnicity)
attributes(io2020sel$ethnicity)
attributes(io2022sel$ethnicity) 
#Merging the variables into one dataset is quite easy now all variables are the same
load("/Users/anuschka/Documents/climatechange/climatechange/data/all_waves/io2019sel.RData")
load("/Users/anuschka/Documents/climatechange/climatechange/data/all_waves/io2020sel.RData")
load("/Users/anuschka/Documents/climatechange/climatechange/data/all_waves/io2022sel.RData")

io2019sel$surveyyear <- 2019
io2020sel$surveyyear <- 2020
io2022sel$surveyyear <- 2022

io_total <- plyr::rbind.fill(io2019sel, io2020sel, io2022sel)

save(io_total, file = "/Users/anuschka/Documents/climatechange/climatechange/data/final_data/io_total.RData")
load("./data/final_data/io_total.Rdata")

table(io_total$isced)
io_total$isced_cat[io_total$isced <=2] <- "Basic"
io_total$isced_cat[io_total$isced == 3 | io_total$isced == 4] <- "Intermediate"
io_total$isced_cat[io_total$isced >=5] <- "Advanced"
io_total$isced_cat <- factor(io_total$isced_cat, levels=c("Basic", "Intermediate", "Advanced"), ordered=TRUE)
table(io_total$isced_cat)

io_total$sex <- io_total$sex - 1

save(io_total, file="./data/final_data/io_total.Rdata")
LS0tDQp0aXRsZTogIkRhdGEgcHJlcGFyYXRpb24gSSZPIFJlc2VhcmNoIg0KYXV0aG9yOiAiQW51c2Noa2EgUGVlbGVuIg0KZGF0ZTogImByIFN5cy5EYXRlKClgIg0Kb3V0cHV0OiBodG1sX2RvY3VtZW50DQotLS0NCg0KYGBge3IsIGVjaG89RkFMU0V9DQprbml0cjo6b3B0c19jaHVuayRzZXQoZXZhbCA9IEZBTFNFKQ0Kb3B0aW9ucyh3aWR0aCA9IDEwMCkNCmNvbG9yaXplIDwtIGZ1bmN0aW9uKHgsIGNvbG9yKSB7c3ByaW50ZigiPHNwYW4gc3R5bGU9J2NvbG9yOiAlczsnPiVzPC9zcGFuPiIsIGNvbG9yLCB4KSB9DQpgYGANCg0KYGBge2NzcywgZWNobz1GQUxTRX0NCnByZSB7DQogIG1heC1oZWlnaHQ6IDMwMHB4Ow0KICBvdmVyZmxvdy15OiBhdXRvOw0KfQ0KDQpwcmVbY2xhc3NdIHsNCiAgbWF4LWhlaWdodDogMTAwcHg7DQp9DQpgYGANCg0KSW4gdGhpcyBzY3JpcHQsIEkgc2VsZWN0LCByZWNvZGUgYW5kIGNyZWF0ZSB2YXJpYWJsZXMgb2YgdGhlIER1dGNoIHN1cnZleSBvbiBjbGltYXRlIGNoYW5nZSBmcm9tIEkmTyByZXNlYXJjaA0KDQoNCmBgYHtyfQ0KI0xvYWQgcGFja2FnZXMgcmVxdWlyZWQgZm9yIGRhdGFwcmVwDQpybShsaXN0ID0gbHMoKSkNCmxpYnJhcnkoZm9yZWlnbikgDQpsaWJyYXJ5KHRpZHl2ZXJzZSkgDQpsaWJyYXJ5KHBseXIpIA0KbGlicmFyeShkcGx5cikNCmBgYA0KDQojIyAyMDE5IHstfQ0KDQpgYGB7cn0NCiNMb2FkIHRoZSBkYXRhZmlsZXMgb25lIGJ5IG9uZQ0KaW8yMDE5IDwtIGZvcmVpZ246OnJlYWQuc3BzcygiL1VzZXJzL2FudXNjaGthL0RvY3VtZW50cy9nZXNpc19kaXIvaSZvL2kmbzIwMTkuc2F2IiwgdXNlLnZhbHVlLmxhYmVscyA9IFQsICB0by5kYXRhLmZyYW1lID0gVCkNCiNHaXZlcyBhIHdhcm5pbmcgYmVjYXVzZSBvZiB0aGUgb3BlbiBhbnN3ZXJzIChsb25nIHN0cmluZ3MpLCBidXQgSSB3b24ndCB1c2UgdGhvc2UgYW55d2F5DQoNCiNOb3cgSSB3aWxsIG9ubHkgc2VsZWN0IHRoZSB2YXJpYWJsZXMgdGhhdCBJIG5lZWQgZm9yIG15IHRoZXNpcywgYnV0IGhlcmUgeW91IGNhbiBpbnNlcnQgYW55IHZhcmlhYmxlIHRoYXQncyBpbiB0aGUgZGF0YXNldC4gRnVydGhlcm1vcmUsIEkgZG9uJ3Qgd2FudCB0aGUgcmVzcG9uZGVudHMgdGhhdCBjb21wbGV0ZWQgdGhlIHN1cnZleSB3aXRoIHBhbmVsY2xpeCBiZWNhdXNlIHRoZXkgaGF2ZSBtb3JlIG1pc3NpbmdzIG9uIGRlbW9ncmFwaGljIHZhcmlhYmxlcyB0aGF0IGkgd2FudCB0byB1c2UNCmlvMjAxOXNlbCA8LSBpbzIwMTkgJT4lIGZpbHRlcihicm9uPT0iSU9QYW5lbCIpICU+JQ0KICAgICAgICAgICAgc2VsZWN0KHYxOCwgdjEwXzE6djEwXzMsIHYyMF8yLCB2MjBfNCwgdjIwXzYsIHYyMF84LCB2MTljXzEsIGlkLCBicm9uLCBHRVNMQUNIVCwgSU9PUExFSURJTkcsIElPSU5LT01FTiwgSU9QT0wyMDE3LCBMRUVGVElKRCwgRVROSUNJVEVJVF9DQlMyU1RFRUtQUk9FRiwgc3RlZGMsIG9wbGVpZGluZ19oZXIsIEhVSVNIT1VERU5TU0FNRU5TVEVMTElORykNCg0KI0xldCdzIGluc3BlY3QgdGhlIG90aGVyIGRhdGFzZXRzIGZpcnN0IHRvIGRldGVybWluZSB3aGljaCBxdWVzdGlvbnMgYXJlIGFza2VkIG1vcmUgb2Z0ZW4NCmlvMjAyMCA8LSBmb3JlaWduOjpyZWFkLnNwc3MoIi9Vc2Vycy9hbnVzY2hrYS9Eb2N1bWVudHMvZ2VzaXNfZGlyL2kmby9pJm8yMDIwLnNhdiIsIHVzZS52YWx1ZS5sYWJlbHMgPSBULCAgdG8uZGF0YS5mcmFtZSA9IFQpDQoNCmxvb2tfZm9yKGlvMjAyMCwgImh1aXNob3VkZW4iKQ0KDQppbzIwMjBzZWwgPC0gaW8yMDIwICU+JSBmaWx0ZXIoYnJvbj09IkkmTyBwYW5lbCIpICU+JQ0KICAgICAgICAgICAgc2VsZWN0KFYwMSwgVjAyLCBWMTBfMTpWMTBfMywgdjIwYV8yLCB2MjBhXzQsIHYyMGFfNiwgdjIwYV84LCBicm9uLCBpZCwgY3Jvc3MxLCBJT09QTEVJRElORywgSU9JTktPTUVOLCBJT1BPTDIwMTcsIExFRUZUSUpELCBPUExFSURfSEVSLCBFVE5JQ0lURUlUX0NCUzJTVEVFS1BST0VGLCBIVUlTSE9VREVOU1NBTUVOU1RFTExJTkcpDQoNCmlvMjAyMiA8LSBmb3JlaWduOjpyZWFkLnNwc3MoIi9Vc2Vycy9hbnVzY2hrYS9Eb2N1bWVudHMvZ2VzaXNfZGlyL2kmby9pJm8yMDIyLnNhdiIsIHVzZS52YWx1ZS5sYWJlbHMgPSBULCAgdG8uZGF0YS5mcmFtZSA9IFQpDQoNCmlvMjAyMnNlbCA8LSBpbzIwMjIgJT4lIGZpbHRlcihicm9uPT0iSSZPIHBhbmVsIikgJT4lDQogICAgICAgICAgICBzZWxlY3QoVjAxLCBWMDIsIHYxMF8xOnYxMF8zLCBWMjBhXzIsIFYyMGFfNCwgVjIwYV82LCBWMjBhXzgsIGJyb24sIGlkLCBjcm9zczEsIElPT1BMRUlESU5HLCBMRUVGVElKRCwgT1BMRUlEX0hFUiwgSU9JTktPTUVOX05FVywgSU9QT0wyMDIxLCBFVE5JQ0lURUlUX0NCUzJTVEVFS1BST0VGLCBvcGxlaWRpbmdfaGVyLCBIVUlTSE9VREVOU1NBTUVOU1RFTExJTkcpIA0KDQojTm8gdXJiYW5pdHkgaW4gMjAyMCBhbmQgMjAyMg0KYGBgDQoNCg0KYGBge3J9DQojTm93IEkndmUgc2VsZWN0ZWQgdGhlIHZhcmlhYmxlcywgSSBuZWVkIHRvIHJlY29kZSB0aGVtIGluIHRoZSBzYW1lIHdheSBhY3Jvc3MgdGhlIHRocmVlIGRhdGFzZXRzDQppbzIwMTlzZWwkd29ycmllZCA8LSBhcy5udW1lcmljKGlvMjAxOXNlbCR2MTgpDQppbzIwMTlzZWwgPC0gaW8yMDE5c2VsICU+JSANCiAgICAgbXV0YXRlX2F0KGMoIndvcnJpZWQiKSwgZnVucyhyZWNvZGUoLiwgYDFgID0gNCwgYDJgID0gMywgYDNgID0gMiwgYDRgID0gMSkpKQ0KaW8yMDE5c2VsJHdvcnJpZWRbaW8yMDE5c2VsJHdvcnJpZWQ9PTVdIDwtIE5BDQoNCiNIYXZlIHRvIGNyZWF0ZSBhIHZhcmlhYmxlIHRoYXQgcmFuZ2VzIGZyb20gMSB0byA1DQppbzIwMTlzZWwkd29ycmllZCA8LSAoaW8yMDE5c2VsJHdvcnJpZWQgLSAxKSAqKDQvMykgKyAxIA0KDQppbzIwMTlzZWwkZnJvbnRydW5uZXIgPC0gYXMubnVtZXJpYyhpbzIwMTlzZWwkdjIwXzYpDQppbzIwMTlzZWwkd29ycnlfZnV0dXJlIDwtIGFzLm51bWVyaWMoaW8yMDE5c2VsJHYyMF84KQ0KDQppbzIwMTlzZWwgPC0gaW8yMDE5c2VsICU+JSANCiAgICAgbXV0YXRlX2F0KGMoImZyb250cnVubmVyIiwgIndvcnJ5X2Z1dHVyZSIpLCBmdW5zKHJlY29kZSguLCBgMWAgPSA1LCBgMmAgPSA0LCBgM2AgPSAzLCBgNGAgPSAyLCBgNWA9IDEpKSkNCg0KaW8yMDE5c2VsJGZyb250cnVubmVyW2lvMjAxOXNlbCRmcm9udHJ1bm5lcj09Nl0gPC0gTkENCmlvMjAxOXNlbCR3b3JyeV9mdXR1cmVbaW8yMDE5c2VsJHdvcnJ5X2Z1dHVyZT09Nl0gPC0gTkENCg0KI01ha2UgdGhlIG5vbi1yZWNvZGVkIGRlcCB2YXJzIGFsc28gbnVtZXJpYywgY29kZSAiaWRrIiBhcyBtaXNzaW5nLiANCmlvMjAxOXNlbCRyZXNwX2NpdGl6IDwtIGFzLm51bWVyaWMoaW8yMDE5c2VsJHYyMF8yKQ0KaW8yMDE5c2VsJHJlc3BfY2l0aXpbaW8yMDE5c2VsJHJlc3BfY2l0aXo9PTZdIDwtIE5BDQppbzIwMTlzZWwkZGtfc3RhcnQgPC0gYXMubnVtZXJpYyhpbzIwMTlzZWwkdjIwXzQpDQppbzIwMTlzZWwkZGtfc3RhcnRbaW8yMDE5c2VsJGRrX3N0YXJ0PT02XSA8LSBOQQ0KaW8yMDE5c2VsJGRvX2dvdiA8LSBhcy5udW1lcmljKGlvMjAxOXNlbCR2MTljXzEpDQppbzIwMTlzZWwkZG9fZ292W2lvMjAxOXNlbCRkb19nb3Y9PTRdIDwtIE5BDQppbzIwMTlzZWwkZG9fZ292IDwtIChpbzIwMTlzZWwkZG9fZ292IC0gMSkgKig0LzIpICsgMQ0KaW8yMDE5c2VsJGJ1c3NfaGVscCA8LSBhcy5udW1lcmljKGlvMjAxOXNlbCR2MTBfMSkNCmlvMjAxOXNlbCRidXNzX2hlbHBbaW8yMDE5c2VsJGJ1c3NfaGVscD09Nl0gPC0gTkENCmlvMjAxOXNlbCRtaW5fY29udHIgPC0gYXMubnVtZXJpYyhpbzIwMTlzZWwkdjEwXzIpDQppbzIwMTlzZWwkbWluX2NvbnRyW2lvMjAxOXNlbCRtaW5fY29udHI9PTZdIDwtIE5BDQppbzIwMTlzZWwkaHVtYW5fcmVzcCA8LSBhcy5udW1lcmljKGlvMjAxOXNlbCR2MTBfMykNCmlvMjAxOXNlbCRodW1hbl9yZXNwW2lvMjAxOXNlbCRodW1hbl9yZXNwPT02XSA8LSBOQQ0KDQojUmVjb2RlIHRoZSBpbmRlcGVuZGVudCB2YXJzIA0KaW8yMDE5c2VsJHNleCA8LSByZXZhbHVlKGlvMjAxOXNlbCRHRVNMQUNIVCwgYygiTWFuIj0iMSIsICJWcm91dyI9IjIiKSkNCnRhYmxlKGlvMjAxOXNlbCRJT0lOS09NRU4sIHVzZU5BID0gImFsd2F5cyIpIA0KaW8yMDE5c2VsJGluY29tZSA8LSBhcy5udW1lcmljKGlvMjAxOXNlbCRJT0lOS09NRU4pDQppbzIwMTlzZWwkaW5jb21lW2lvMjAxOXNlbCRpbmNvbWU9PTZdIDwtIE5BDQptZWFuKGlvMjAxOXNlbCRpbmNvbWUsIG5hLnJtPVQpIA0KaW8yMDE5c2VsJGluY29tZVtpcy5uYShpbzIwMTlzZWwkaW5jb21lKV0gPC0gMy4wNzYNCmlvMjAxOXNlbCRpbmNvbWVfcXVhcnQgPC0gd2l0aChpbzIwMTlzZWwsIGN1dChpbmNvbWUsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVha3M9cXVhbnRpbGUoaW5jb21lLCBwcm9icz1zZXEoMCwxLCBieT0wLjI1KSwgbmEucm09VFJVRSksIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmNsdWRlLmxvd2VzdD1UUlVFKSkNCmlvMjAxOXNlbCRpbmNvbWVfcXVhcnQgPC0gYXMubnVtZXJpYyhpbzIwMTlzZWwkaW5jb21lX3F1YXJ0KQ0KDQpmcmVxKGlvMjAxOXNlbCRFVE5JQ0lURUlUX0NCUzJTVEVFS1BST0VGKSANCmlvMjAxOXNlbCRldGhuaWNpdHkgPC0gcmV2YWx1ZShpbzIwMTlzZWwkRVROSUNJVEVJVF9DQlMyU1RFRUtQUk9FRiwgYygiQXV0b2NodG9vbiI9ImR1dGNoIiwgIldlc3RlcnNlIGFsbG9jaHRvb24iPSJ3ZXN0ZXJuIiwgIk5pZXQtV2VzdGVyc2UgYWxsb2NodG9vbiI9Im5vbi13ZXN0ZXJuIiwiT25iZWtlbmQiID0gInVua25vd24iKSkNCg0KdGFibGUoaW8yMDE5c2VsJElPT1BMRUlESU5HKQ0KaW8yMDE5c2VsJElPT1BMRUlESU5HIDwtIGFzLm51bWVyaWMoaW8yMDE5c2VsJElPT1BMRUlESU5HKQ0KaW8yMDE5c2VsJGlzY2VkW2lvMjAxOXNlbCRJT09QTEVJRElORyA9PSAxXSA8LSAwDQppbzIwMTlzZWwkaXNjZWRbaW8yMDE5c2VsJElPT1BMRUlESU5HID09IDJdIDwtIDENCmlvMjAxOXNlbCRpc2NlZFtpbzIwMTlzZWwkSU9PUExFSURJTkcgPT0gM10gPC0gMg0KaW8yMDE5c2VsJGlzY2VkW2lvMjAxOXNlbCRJT09QTEVJRElORyA9PSA0XSA8LSAzDQppbzIwMTlzZWwkaXNjZWRbaW8yMDE5c2VsJElPT1BMRUlESU5HID09IDVdIDwtIDQNCmlvMjAxOXNlbCRpc2NlZFtpbzIwMTlzZWwkSU9PUExFSURJTkcgPT0gNiB8IGlvMjAxOXNlbCRJT09QTEVJRElORyA9PTddIDwtIDUNCg0KaW8yMDE5c2VsJGVkdWNfY2F0IDwtIHJldmFsdWUoaW8yMDE5c2VsJG9wbGVpZGluZ19oZXIsIGMoIkxhYWciPSJMb3ciLCAiTWlkZGVsYmFhciI9Ik1lZGl1bSIsICJIb29nIj0iSGlnaCIpKQ0KaW8yMDE5c2VsJHVyYmFuIDwtIHJldmFsdWUoaW8yMDE5c2VsJHN0ZWRjLCBjKCJOaWV0IHN0ZWRlbGlqayI9ICJMb3cgdXJiYW5pdHkiLCAiV2VpbmlnIHN0ZWRlbGlqayI9IkxvdyB1cmJhbml0eSIsICJNYXRpZyBzdGVkZWxpamsiPSJNZWRpdW0gdXJiYW5pdHkiLCAiU3Rlcmsgc3RlZGVsaWprIj0iSGlnaCB1cmJhbml0eSIsICJaZWVyIHN0ZXJrIHN0ZWRlbGlqayI9IkhpZ2ggdXJiYW5pdHkiKSkNCnRhYmxlKGlvMjAxOXNlbCR1cmJhbiwgdXNlTkEgPSAiYWx3YXlzIikgIzIgbWlzc2luZ3MNCg0KdGFibGUoaW8yMDE5c2VsJEhVSVNIT1VERU5TU0FNRU5TVEVMTElORywgdXNlTkEgPSAiYWx3YXlzIikNCmlvMjAxOXNlbCRIVUlTSE9VREVOU1NBTUVOU1RFTExJTkcgPC0gYXMubnVtZXJpYyhpbzIwMTlzZWwkSFVJU0hPVURFTlNTQU1FTlNURUxMSU5HKQ0KaW8yMDE5c2VsJG1hcnN0YXRbaW8yMDE5c2VsJEhVSVNIT1VERU5TU0FNRU5TVEVMTElORz09MyB8IGlvMjAxOXNlbCRIVUlTSE9VREVOU1NBTUVOU1RFTExJTkcgPT00IHwgaW8yMDE5c2VsJEhVSVNIT1VERU5TU0FNRU5TVEVMTElORyA9PTVdIDwtIDENCmlvMjAxOXNlbCRtYXJzdGF0W2lvMjAxOXNlbCRIVUlTSE9VREVOU1NBTUVOU1RFTExJTkc9PTEgfCBpbzIwMTlzZWwkSFVJU0hPVURFTlNTQU1FTlNURUxMSU5HID09MiB8IGlvMjAxOXNlbCRIVUlTSE9VREVOU1NBTUVOU1RFTExJTkcgPT02XSA8LSAyDQppbzIwMTlzZWwkbWFyc3RhdFtpbzIwMTlzZWwkSFVJU0hPVURFTlNTQU1FTlNURUxMSU5HID09NyBdIDwtIE5BDQp0YWJsZShpbzIwMTlzZWwkbWFyc3RhdCwgdXNlTkEgPSAiYWx3YXlzIikNCg0KaW8yMDE5c2VsJGFnZSA8LSBhcy5udW1lcmljKGFzLmNoYXJhY3RlcihpbzIwMTlzZWwkTEVFRlRJSkQpKQ0KDQojTHIgcGxhY2VtZW50IGJhc2VkIG9uIENIRVMgZW4gcG9wcGEgZGF0YSBvbiBleHBlcnQgbWVhbnMNCmxvYWQoIi9Vc2Vycy9hbnVzY2hrYS9Eb2N1bWVudHMvY2xpbWF0ZWNoYW5nZS9jbGltYXRlY2hhbmdlL2RhdGEvYWxsX3dhdmVzL2V4cGVydC5SRGF0YSIpDQppbzIwMTlzZWwkcGFydHlfbmFtZSA8LSBhcy5jaGFyYWN0ZXIoaW8yMDE5c2VsJElPUE9MMjAxNykNCmlvMjAxOXNlbCRwYXJ0eV9uYW1lIDwtIHJldmFsdWUoaW8yMDE5c2VsJHBhcnR5X25hbWUsIGMoIkNocmlzdGVuVW5pZSI9ICJDVSIsICI1MCBQbHVzIj0iNTBQTFVTIiwgIkdyb2VuTGlua3MiPSJHTCIsICJQYXJ0aWogdm9vciBkZSBEaWVyZW4iPSJQdmREIiwgIkZvcnVtIHZvb3IgRGVtb2NyYXRpZSI9IkZ2RCIpKQ0KaW8yMDE5c2VsIDwtIGlvMjAxOXNlbCAlPiUgbGVmdF9qb2luKGV4cGVydDIsIGJ5PSJwYXJ0eV9uYW1lIikgDQoNCnRhYmxlKGlvMjAxOXNlbCRscm92ZXJhbGxfbWVhbiwgdXNlTkEgPSAiYWx3YXlzIikNCg0KI01pc3NpbmdzDQpsYXBwbHkoaW8yMDE5c2VsLCB0YWJsZSwgdXNlTkEgPSAiYWx3YXlzIikNCg0KbWlzX3ZhcnMgPC0gYygibHJvdmVyYWxsX21lYW4iKSANCg0KZm9yICh2YXIgaW4gbWlzX3ZhcnMpIHsNCiAgaW8yMDE5c2VsW2lzLm5hKGlvMjAxOXNlbFssdmFyXSksIHZhcl0gPC0gbWVhbihpbzIwMTlzZWxbLHZhcl0sIG5hLnJtID0gVFJVRSkNCn0NCg0KI05vdyBJIGFnYWluIHNlbGVjdCB0aGUgdmFyaWFibGVzIHRoYXQgSSB3YW50IHRvIGtlZXANCmlvMjAxOXNlbCA8LSBpbzIwMTlzZWwgJT4lIA0KICAgICAgICAgICAgc2VsZWN0KGlkLCB3b3JyaWVkLCBmcm9udHJ1bm5lciwgd29ycnlfZnV0dXJlLCByZXNwX2NpdGl6LCBka19zdGFydCwgZG9fZ292LCBidXNzX2hlbHAsIG1pbl9jb250ciwgaHVtYW5fcmVzcCwgc2V4LCBlZHVjX2NhdCwgaXNjZWQsIHVyYmFuLCBhZ2UsIGluY29tZV9xdWFydCwgSU9JTktPTUVOLCBJT1BPTDIwMTcsIGV0aG5pY2l0eSwgbWFyc3RhdCwgbHJvdmVyYWxsX21lYW4pICAlPiUNCiAgICAgICAgICAgIGRwbHlyOjpyZW5hbWUgKGxycGxhY2UgPSBscm92ZXJhbGxfbWVhbikNCg0Kc2F2ZShpbzIwMTlzZWwsIGZpbGUgPSAiL1VzZXJzL2FudXNjaGthL0RvY3VtZW50cy9jbGltYXRlY2hhbmdlL2NsaW1hdGVjaGFuZ2UvZGF0YS9hbGxfd2F2ZXMvaW8yMDE5c2VsLlJEYXRhIikNCg0KbG9hZCgiL1VzZXJzL2FudXNjaGthL0RvY3VtZW50cy9jbGltYXRlY2hhbmdlL2NsaW1hdGVjaGFuZ2UvZGF0YS9hbGxfd2F2ZXMvaW8yMDE5c2VsLlJEYXRhIikNCmBgYA0KDQojIyAyMDIwIHstfQ0KDQpgYGB7cn0NCiNEbyB0aGUgc2FtZSBmb3IgMjAyMA0KaW8yMDIwc2VsJHdvcnJpZWQgPC0gYXMubnVtZXJpYyhpbzIwMjBzZWwkVjAxKQ0KaW8yMDIwc2VsIDwtIGlvMjAyMHNlbCAlPiUgDQogICAgIG11dGF0ZV9hdChjKCJ3b3JyaWVkIiksIGZ1bnMocmVjb2RlKC4sIGAxYCA9IDQsIGAyYCA9IDMsIGAzYCA9IDIsIGA0YCA9IDEpKSkNCmlvMjAyMHNlbCR3b3JyaWVkW2lvMjAyMHNlbCR3b3JyaWVkPT01XSA8LSBOQQ0KaW8yMDIwc2VsJHdvcnJpZWQgPC0gKGlvMjAyMHNlbCR3b3JyaWVkIC0gMSkgKiAoNC8zKSArIDENCg0KaW8yMDIwc2VsJGZyb250cnVubmVyIDwtIGFzLm51bWVyaWMoaW8yMDIwc2VsJHYyMGFfNikNCmlvMjAyMHNlbCR3b3JyeV9mdXR1cmUgPC0gYXMubnVtZXJpYyhpbzIwMjBzZWwkdjIwYV84KQ0KDQppbzIwMjBzZWwgPC0gaW8yMDIwc2VsICU+JSANCiAgICAgbXV0YXRlX2F0KGMoImZyb250cnVubmVyIiwgIndvcnJ5X2Z1dHVyZSIpLCBmdW5zKHJlY29kZSguLCBgMWAgPSA1LCBgMmAgPSA0LCBgM2AgPSAzLCBgNGAgPSAyLCBgNWA9IDEpKSkNCg0KaW8yMDIwc2VsJGZyb250cnVubmVyW2lvMjAyMHNlbCRmcm9udHJ1bm5lcj09Nl0gPC0gTkENCmlvMjAyMHNlbCR3b3JyeV9mdXR1cmVbaW8yMDIwc2VsJHdvcnJ5X2Z1dHVyZT09Nl0gPC0gTkENCg0KI01ha2UgdGhlIG5vbi1yZWNvZGVkIGRlcCB2YXJzIGFsc28gbnVtZXJpYywgY29kZSAiaWRrIiBhcyBtaXNzaW5nLiANCmlvMjAyMHNlbCRyZXNwX2NpdGl6IDwtIGFzLm51bWVyaWMoaW8yMDIwc2VsJHYyMGFfMikNCmlvMjAyMHNlbCRyZXNwX2NpdGl6W2lvMjAyMHNlbCRyZXNwX2NpdGl6PT02XSA8LSBOQQ0KaW8yMDIwc2VsJGRrX3N0YXJ0IDwtIGFzLm51bWVyaWMoaW8yMDIwc2VsJHYyMGFfNCkNCmlvMjAyMHNlbCRka19zdGFydFtpbzIwMjBzZWwkZGtfc3RhcnQ9PTZdIDwtIE5BDQppbzIwMjBzZWwkYnVzc19oZWxwIDwtIGFzLm51bWVyaWMoaW8yMDIwc2VsJFYxMF8xKQ0KaW8yMDIwc2VsJGJ1c3NfaGVscFtpbzIwMjBzZWwkYnVzc19oZWxwPT02XSA8LSBOQQ0KaW8yMDIwc2VsJG1pbl9jb250ciA8LSBhcy5udW1lcmljKGlvMjAyMHNlbCRWMTBfMikNCmlvMjAyMHNlbCRtaW5fY29udHJbaW8yMDIwc2VsJG1pbl9jb250cj09Nl0gPC0gTkENCmlvMjAyMHNlbCRodW1hbl9yZXNwIDwtIGFzLm51bWVyaWMoaW8yMDIwc2VsJFYxMF8zKQ0KaW8yMDIwc2VsJGh1bWFuX3Jlc3BbaW8yMDIwc2VsJGh1bWFuX3Jlc3A9PTZdIDwtIE5BDQoNCiMgVGhpcyB2YXJpYWJsZSBpcyBub3QgZXhhY3RseSBhc2tlZCBpbiB0aGUgc2FtZSB3YXkgYXMgaW4gcHJldmlvdXMgd2F2ZQ0KaW8yMDIwc2VsJGRvX2dvdiA8LSBhcy5udW1lcmljKGlvMjAyMHNlbCRWMDIpDQppbzIwMjBzZWwgPC0gaW8yMDIwc2VsICU+JSANCiAgICAgbXV0YXRlX2F0KGMoImRvX2dvdiIpLCBmdW5zKHJlY29kZSguLCBgMWAgPSA1LCBgMmAgPSA0LCBgM2AgPSAzLCBgNGAgPSAyLCBgNWA9IDEpKSkNCmlvMjAyMHNlbCRkb19nb3ZbaW8yMDIwc2VsJGRvX2dvdj09Nl0gPC0gTkENCg0KI0luZGVwZW5kZW50IHZhcnMNCmlvMjAyMHNlbCRzZXggPC0gcmV2YWx1ZShpbzIwMjBzZWwkY3Jvc3MxLCBjKCJNYW4iPSIxIiwgIlZyb3V3Ij0iMiIpKQ0KdGFibGUoaW8yMDIwc2VsJElPSU5LT01FTikNCmlvMjAyMHNlbCRpbmNvbWUgPC0gYXMubnVtZXJpYyhpbzIwMjBzZWwkSU9JTktPTUVOKQ0KaW8yMDIwc2VsJGluY29tZVtpbzIwMjBzZWwkaW5jb21lPT02XSA8LSBOQQ0KbWVhbihpbzIwMjBzZWwkaW5jb21lLCBuYS5ybT1UKSANCmlvMjAyMHNlbCRpbmNvbWVbaXMubmEoaW8yMDIwc2VsJGluY29tZSldIDwtIDMuMTE0DQogaW8yMDIwc2VsJGluY29tZV9xdWFydCA8LSB3aXRoKGlvMjAyMHNlbCwgY3V0KGluY29tZSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrcz1xdWFudGlsZShpbmNvbWUsIHByb2JzPXNlcSgwLDEsIGJ5PTAuMjUpLCBuYS5ybT1UUlVFKSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluY2x1ZGUubG93ZXN0PVRSVUUpKQ0KaW8yMDIwc2VsJGluY29tZV9xdWFydCA8LSBhcy5udW1lcmljKGlvMjAyMHNlbCRpbmNvbWVfcXVhcnQpDQoNCmZyZXEoaW8yMDIwc2VsJEVUTklDSVRFSVRfQ0JTMlNURUVLUFJPRUYpIA0KaW8yMDIwc2VsJGV0aG5pY2l0eSA8LSByZXZhbHVlKGlvMjAyMHNlbCRFVE5JQ0lURUlUX0NCUzJTVEVFS1BST0VGLCBjKCJBdXRvY2h0b29uIj0iZHV0Y2giLCAiV2VzdGVyc2UgYWxsb2NodG9vbiI9Indlc3Rlcm4iLCAiTmlldC1XZXN0ZXJzZSBhbGxvY2h0b29uIj0ibm9uLXdlc3Rlcm4iLCJPbmJla2VuZCIgPSAidW5rbm93biIpKQ0KDQp0YWJsZShpbzIwMjBzZWwkSU9PUExFSURJTkcpDQppbzIwMjBzZWwkSU9PUExFSURJTkcgPC0gYXMubnVtZXJpYyhpbzIwMjBzZWwkSU9PUExFSURJTkcpDQppbzIwMjBzZWwkaXNjZWRbaW8yMDIwc2VsJElPT1BMRUlESU5HID09IDFdIDwtIDANCmlvMjAyMHNlbCRpc2NlZFtpbzIwMjBzZWwkSU9PUExFSURJTkcgPT0gMl0gPC0gMQ0KaW8yMDIwc2VsJGlzY2VkW2lvMjAyMHNlbCRJT09QTEVJRElORyA9PSAzXSA8LSAyDQppbzIwMjBzZWwkaXNjZWRbaW8yMDIwc2VsJElPT1BMRUlESU5HID09IDRdIDwtIDMNCmlvMjAyMHNlbCRpc2NlZFtpbzIwMjBzZWwkSU9PUExFSURJTkcgPT0gNV0gPC0gNA0KaW8yMDIwc2VsJGlzY2VkW2lvMjAyMHNlbCRJT09QTEVJRElORyA9PSA2IHwgaW8yMDIwc2VsJElPT1BMRUlESU5HID09N10gPC0gNQ0KDQppbzIwMjBzZWwkZWR1Y19jYXQgPC0gcmV2YWx1ZShpbzIwMjBzZWwkT1BMRUlEX0hFUiwgYygibGFhZyI9IkxvdyIsICJtaWRkZW4iPSJNZWRpdW0iLCAiaG9vZyI9IkhpZ2giKSkNCg0KdGFibGUoaW8yMDIwc2VsJEhVSVNIT1VERU5TU0FNRU5TVEVMTElORywgdXNlTkEgPSAiYWx3YXlzIikNCmlvMjAyMHNlbCRIVUlTSE9VREVOU1NBTUVOU1RFTExJTkcgPC0gYXMubnVtZXJpYyhpbzIwMjBzZWwkSFVJU0hPVURFTlNTQU1FTlNURUxMSU5HKQ0KaW8yMDIwc2VsJG1hcnN0YXRbaW8yMDIwc2VsJEhVSVNIT1VERU5TU0FNRU5TVEVMTElORz09MyB8IGlvMjAyMHNlbCRIVUlTSE9VREVOU1NBTUVOU1RFTExJTkcgPT00IHwgaW8yMDIwc2VsJEhVSVNIT1VERU5TU0FNRU5TVEVMTElORyA9PTVdIDwtIDENCmlvMjAyMHNlbCRtYXJzdGF0W2lvMjAyMHNlbCRIVUlTSE9VREVOU1NBTUVOU1RFTExJTkc9PTEgfCBpbzIwMjBzZWwkSFVJU0hPVURFTlNTQU1FTlNURUxMSU5HID09MiB8IGlvMjAyMHNlbCRIVUlTSE9VREVOU1NBTUVOU1RFTExJTkcgPT02XSA8LSAyDQppbzIwMjBzZWwkbWFyc3RhdFtpbzIwMjBzZWwkSFVJU0hPVURFTlNTQU1FTlNURUxMSU5HID09NyBdIDwtIE5BDQp0YWJsZShpbzIwMjBzZWwkbWFyc3RhdCwgdXNlTkEgPSAiYWx3YXlzIikNCg0KaW8yMDIwc2VsJGFnZSA8LSBhcy5udW1lcmljKGFzLmNoYXJhY3RlcihpbzIwMjBzZWwkTEVFRlRJSkQpKQ0KDQppbzIwMjBzZWwkcGFydHlfbmFtZSA8LSBhcy5jaGFyYWN0ZXIoaW8yMDIwc2VsJElPUE9MMjAxNykNCnVuaXF1ZShpbzIwMjBzZWwkcGFydHlfbmFtZSkNCmlvMjAyMHNlbCRwYXJ0eV9uYW1lIDwtIHJldmFsdWUoaW8yMDIwc2VsJHBhcnR5X25hbWUsIGMoIkNocmlzdGVuVW5pZSI9ICJDVSIsICI1MCBQbHVzIj0iNTBQTFVTIiwgIkdyb2VuTGlua3MiPSJHTCIsICJQYXJ0aWogdm9vciBkZSBEaWVyZW4iPSJQdmREIiwgIkZvcnVtIHZvb3IgRGVtb2NyYXRpZSI9IkZ2RCIpKQ0KaW8yMDIwc2VsIDwtIGlvMjAyMHNlbCAlPiUgbGVmdF9qb2luKGV4cGVydDIsIGJ5PSJwYXJ0eV9uYW1lIikgDQoNCiMgTWlzc2luZ3MNCmxhcHBseShpbzIwMjBzZWwsIHRhYmxlLCB1c2VOQSA9ICJhbHdheXMiKQ0KDQptaXNfdmFycyA8LSBjKCJscm92ZXJhbGxfbWVhbiIpIA0KDQpmb3IgKHZhciBpbiBtaXNfdmFycykgew0KICBpbzIwMjBzZWxbaXMubmEoaW8yMDIwc2VsWyx2YXJdKSwgdmFyXSA8LSBtZWFuKGlvMjAyMHNlbFssdmFyXSwgbmEucm0gPSBUUlVFKQ0KfQ0KDQojU2VsZWN0IHRoZSB2YXJpYWJsZXMgdGhhdCBJIHdhbnQgdG8ga2VlcA0KaW8yMDIwc2VsIDwtIGlvMjAyMHNlbCAlPiUgDQogICAgICAgICAgICBzZWxlY3QoaWQsIHdvcnJpZWQsIGZyb250cnVubmVyLCB3b3JyeV9mdXR1cmUsIHJlc3BfY2l0aXosIGRrX3N0YXJ0LCBkb19nb3YsIGJ1c3NfaGVscCwgbWluX2NvbnRyLCBodW1hbl9yZXNwLCBzZXgsIGVkdWNfY2F0LCBpc2NlZCwgYWdlLCBpbmNvbWVfcXVhcnQsIElPSU5LT01FTiwgSU9QT0wyMDE3LCBldGhuaWNpdHksIG1hcnN0YXQsIGxyb3ZlcmFsbF9tZWFuKSAlPiUNCiAgICAgICAgICAgIGRwbHlyOjpyZW5hbWUgKGxycGxhY2UgPSBscm92ZXJhbGxfbWVhbikNCg0Kc2F2ZShpbzIwMjBzZWwsIGZpbGUgPSAiL1VzZXJzL2FudXNjaGthL0RvY3VtZW50cy9jbGltYXRlY2hhbmdlL2NsaW1hdGVjaGFuZ2UvZGF0YS9hbGxfd2F2ZXMvaW8yMDIwc2VsLlJEYXRhIikNCmBgYA0KDQojIyAyMDIyIHstfQ0KDQpgYGB7cn0NCiNBbmQgdGhlIGxhc3Qgd2F2ZSBvZiAyMDIyDQppbzIwMjJzZWwkd29ycmllZCA8LSBhcy5udW1lcmljKGlvMjAyMnNlbCRWMDEpDQppbzIwMjJzZWwgPC0gaW8yMDIyc2VsICU+JSANCiAgICAgbXV0YXRlX2F0KGMoIndvcnJpZWQiKSwgZnVucyhyZWNvZGUoLiwgYDFgID0gNCwgYDJgID0gMywgYDNgID0gMiwgYDRgID0gMSkpKQ0KaW8yMDIyc2VsJHdvcnJpZWRbaW8yMDIyc2VsJHdvcnJpZWQ9PTVdIDwtIE5BDQppbzIwMjJzZWwkd29ycmllZCA8LSAoaW8yMDIyc2VsJHdvcnJpZWQgLSAxKSAqICg0LzMpICsgMQ0KDQppbzIwMjJzZWwkZnJvbnRydW5uZXIgPC0gYXMubnVtZXJpYyhpbzIwMjJzZWwkVjIwYV82KQ0KaW8yMDIyc2VsJHdvcnJ5X2Z1dHVyZSA8LSBhcy5udW1lcmljKGlvMjAyMnNlbCRWMjBhXzgpDQoNCmlvMjAyMnNlbCA8LSBpbzIwMjJzZWwgJT4lIA0KICAgICBtdXRhdGVfYXQoYygiZnJvbnRydW5uZXIiLCAid29ycnlfZnV0dXJlIiksIGZ1bnMocmVjb2RlKC4sIGAxYCA9IDUsIGAyYCA9IDQsIGAzYCA9IDMsIGA0YCA9IDIsIGA1YD0gMSkpKQ0KDQppbzIwMjJzZWwkZnJvbnRydW5uZXJbaW8yMDIyc2VsJGZyb250cnVubmVyPT02XSA8LSBOQQ0KaW8yMDIyc2VsJHdvcnJ5X2Z1dHVyZVtpbzIwMjJzZWwkd29ycnlfZnV0dXJlPT02XSA8LSBOQQ0KDQojTWFrZSB0aGUgbm9uLXJlY29kZWQgZGVwIHZhcnMgYWxzbyBudW1lcmljLCBjb2RlICJpZGsiIGFzIG1pc3NpbmcuIA0KaW8yMDIyc2VsJHJlc3BfY2l0aXogPC0gYXMubnVtZXJpYyhpbzIwMjJzZWwkVjIwYV8yKQ0KaW8yMDIyc2VsJHJlc3BfY2l0aXpbaW8yMDIyc2VsJHJlc3BfY2l0aXo9PTZdIDwtIE5BDQppbzIwMjJzZWwkZGtfc3RhcnQgPC0gYXMubnVtZXJpYyhpbzIwMjJzZWwkVjIwYV80KQ0KaW8yMDIyc2VsJGRrX3N0YXJ0W2lvMjAyMnNlbCRka19zdGFydD09Nl0gPC0gTkENCmlvMjAyMnNlbCRidXNzX2hlbHAgPC0gYXMubnVtZXJpYyhpbzIwMjJzZWwkdjEwXzEpDQppbzIwMjJzZWwkYnVzc19oZWxwW2lvMjAyMnNlbCRidXNzX2hlbHA9PTZdIDwtIE5BDQppbzIwMjJzZWwkbWluX2NvbnRyIDwtIGFzLm51bWVyaWMoaW8yMDIyc2VsJHYxMF8yKQ0KaW8yMDIyc2VsJG1pbl9jb250cltpbzIwMjJzZWwkbWluX2NvbnRyPT02XSA8LSBOQQ0KaW8yMDIyc2VsJGh1bWFuX3Jlc3AgPC0gYXMubnVtZXJpYyhpbzIwMjJzZWwkdjEwXzMpDQppbzIwMjJzZWwkaHVtYW5fcmVzcFtpbzIwMjJzZWwkaHVtYW5fcmVzcD09Nl0gPC0gTkENCg0KaW8yMDIyc2VsJGRvX2dvdiA8LSBhcy5udW1lcmljKGlvMjAyMnNlbCRWMDIpDQppbzIwMjJzZWwgPC0gaW8yMDIyc2VsICU+JSANCiAgICAgbXV0YXRlX2F0KGMoImRvX2dvdiIpLCBmdW5zKHJlY29kZSguLCBgMWAgPSA1LCBgMmAgPSA0LCBgM2AgPSAzLCBgNGAgPSAyLCBgNWA9IDEpKSkNCmlvMjAyMnNlbCRkb19nb3ZbaW8yMDIyc2VsJGRvX2dvdj09Nl0gPC0gTkENCg0KI0luZGVwZW5kZW50IHZhcnMNCmlvMjAyMnNlbCRzZXggPC0gcmV2YWx1ZShpbzIwMjJzZWwkY3Jvc3MxLCBjKCJNYW4iPSIxIiwgIlZyb3V3Ij0iMiIpKQ0KdGFibGUoaW8yMDIyc2VsJElPSU5LT01FTiwgdXNlTkEgPSAiYWx3YXlzIikgDQppbzIwMjJzZWwkaW5jb21lIDwtIGFzLm51bWVyaWMoaW8yMDIyc2VsJElPSU5LT01FTl9ORVcpDQppbzIwMjJzZWwkaW5jb21lW2lvMjAyMnNlbCRpbmNvbWU9PTZdIDwtIE5BDQptZWFuKGlvMjAyMnNlbCRpbmNvbWUsIG5hLnJtPVQpIA0KaW8yMDIyc2VsJGluY29tZVtpcy5uYShpbzIwMjJzZWwkaW5jb21lKV0gPC0gNC4zNTQNCiBpbzIwMjJzZWwkaW5jb21lX3F1YXJ0IDwtIHdpdGgoaW8yMDIyc2VsLCBjdXQoaW5jb21lLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWtzPXF1YW50aWxlKGluY29tZSwgcHJvYnM9c2VxKDAsMSwgYnk9MC4yNSksIG5hLnJtPVRSVUUpLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5jbHVkZS5sb3dlc3Q9VFJVRSkpDQppbzIwMjJzZWwkaW5jb21lX3F1YXJ0IDwtIGFzLm51bWVyaWMoaW8yMDIyc2VsJGluY29tZV9xdWFydCkNCg0KZnJlcShpbzIwMjJzZWwkRVROSUNJVEVJVF9DQlMyU1RFRUtQUk9FRikgDQppbzIwMjJzZWwkZXRobmljaXR5IDwtIHJldmFsdWUoaW8yMDIyc2VsJEVUTklDSVRFSVRfQ0JTMlNURUVLUFJPRUYsIGMoIk5lZGVybGFuZHMiPSJkdXRjaCIsICJXZXN0ZXJzIj0id2VzdGVybiIsICJOaWV0LXdlc3RlcnMiPSJub24td2VzdGVybiIsIk9uYmVrZW5kIiA9ICJ1bmtub3duIikpDQoNCnRhYmxlKGlvMjAyMnNlbCRJT09QTEVJRElORykNCmlvMjAyMnNlbCRJT09QTEVJRElORyA8LSBhcy5udW1lcmljKGlvMjAyMnNlbCRJT09QTEVJRElORykNCmlvMjAyMnNlbCRpc2NlZFtpbzIwMjJzZWwkSU9PUExFSURJTkcgPT0gMV0gPC0gMA0KaW8yMDIyc2VsJGlzY2VkW2lvMjAyMnNlbCRJT09QTEVJRElORyA9PSAyXSA8LSAxDQppbzIwMjJzZWwkaXNjZWRbaW8yMDIyc2VsJElPT1BMRUlESU5HID09IDNdIDwtIDINCmlvMjAyMnNlbCRpc2NlZFtpbzIwMjJzZWwkSU9PUExFSURJTkcgPT0gNF0gPC0gMw0KaW8yMDIyc2VsJGlzY2VkW2lvMjAyMnNlbCRJT09QTEVJRElORyA9PSA1XSA8LSA0DQppbzIwMjJzZWwkaXNjZWRbaW8yMDIyc2VsJElPT1BMRUlESU5HID09IDYgfCBpbzIwMjJzZWwkSU9PUExFSURJTkcgPT03XSA8LSA1DQoNCmlvMjAyMnNlbCRlZHVjX2NhdCA8LSByZXZhbHVlKGlvMjAyMnNlbCRPUExFSURfSEVSLCBjKCJsYWFnIj0iTG93IiwgIm1pZGRlbiI9Ik1lZGl1bSIsICJob29nIj0iSGlnaCIpKQ0KDQp0YWJsZShpbzIwMjJzZWwkSFVJU0hPVURFTlNTQU1FTlNURUxMSU5HLCB1c2VOQSA9ICJhbHdheXMiKQ0KaW8yMDIyc2VsJEhVSVNIT1VERU5TU0FNRU5TVEVMTElORyA8LSBhcy5udW1lcmljKGlvMjAyMnNlbCRIVUlTSE9VREVOU1NBTUVOU1RFTExJTkcpDQppbzIwMjJzZWwkbWFyc3RhdFtpbzIwMjJzZWwkSFVJU0hPVURFTlNTQU1FTlNURUxMSU5HPT0zIHwgaW8yMDIyc2VsJEhVSVNIT1VERU5TU0FNRU5TVEVMTElORyA9PTQgfCBpbzIwMjJzZWwkSFVJU0hPVURFTlNTQU1FTlNURUxMSU5HID09NV0gPC0gMQ0KaW8yMDIyc2VsJG1hcnN0YXRbaW8yMDIyc2VsJEhVSVNIT1VERU5TU0FNRU5TVEVMTElORz09MSB8IGlvMjAyMnNlbCRIVUlTSE9VREVOU1NBTUVOU1RFTExJTkcgPT0yIHwgaW8yMDIyc2VsJEhVSVNIT1VERU5TU0FNRU5TVEVMTElORyA9PTZdIDwtIDINCmlvMjAyMnNlbCRtYXJzdGF0W2lvMjAyMnNlbCRIVUlTSE9VREVOU1NBTUVOU1RFTExJTkcgPT03IF0gPC0gTkENCnRhYmxlKGlvMjAyMnNlbCRtYXJzdGF0LCB1c2VOQSA9ICJhbHdheXMiKQ0KDQppbzIwMjJzZWwkYWdlIDwtIGFzLm51bWVyaWMoYXMuY2hhcmFjdGVyKGlvMjAyMnNlbCRMRUVGVElKRCkpDQoNCmlvMjAyMnNlbCRwYXJ0eV9uYW1lIDwtIGFzLmNoYXJhY3RlcihpbzIwMjJzZWwkSU9QT0wyMDIxKQ0KdW5pcXVlKGlvMjAyMnNlbCRwYXJ0eV9uYW1lKQ0KaW8yMDIyc2VsJHBhcnR5X25hbWUgPC0gcmV2YWx1ZShpbzIwMjJzZWwkcGFydHlfbmFtZSwgYygiQ2hyaXN0ZW5VbmllIj0gIkNVIiwgIkdyb2VuTGlua3MiPSJHTCIsICJQYXJ0aWogdm9vciBkZSBEaWVyZW4iPSJQdmREIiwgIkZvcnVtIHZvb3IgRGVtb2NyYXRpZSI9IkZ2RCIpKQ0KaW8yMDIyc2VsIDwtIGlvMjAyMnNlbCAlPiUgbGVmdF9qb2luKGV4cGVydDIsIGJ5PSJwYXJ0eV9uYW1lIikgDQoNCiMgTWlzc2luZ3MNCmxhcHBseShpbzIwMjJzZWwsIHRhYmxlLCB1c2VOQSA9ICJhbHdheXMiKQ0KDQptaXNfdmFycyA8LSBjKCJscm92ZXJhbGxfbWVhbiIpIA0KDQpmb3IgKHZhciBpbiBtaXNfdmFycykgew0KICBpbzIwMjJzZWxbaXMubmEoaW8yMDIyc2VsWyx2YXJdKSwgdmFyXSA8LSBtZWFuKGlvMjAyMnNlbFssdmFyXSwgbmEucm0gPSBUUlVFKQ0KfQ0KDQojU2VsZWN0IHRoZSB2YXJpYWJsZXMgdGhhdCBJIHdhbnQgdG8ga2VlcA0KaW8yMDIyc2VsIDwtIGlvMjAyMnNlbCAlPiUgDQogICAgICAgICAgICBzZWxlY3QoaWQsIHdvcnJpZWQsIGZyb250cnVubmVyLCB3b3JyeV9mdXR1cmUsIHJlc3BfY2l0aXosIGRrX3N0YXJ0LCBkb19nb3YsIGJ1c3NfaGVscCwgbWluX2NvbnRyLCBodW1hbl9yZXNwLCBzZXgsIGVkdWNfY2F0LCBpc2NlZCwgYWdlLCBpbmNvbWVfcXVhcnQsIElPSU5LT01FTl9ORVcsIElPUE9MMjAyMSwgZXRobmljaXR5LCBtYXJzdGF0LCBscm92ZXJhbGxfbWVhbikgJT4lDQogICAgICAgICAgICBkcGx5cjo6cmVuYW1lIChscnBsYWNlID0gbHJvdmVyYWxsX21lYW4pDQoNCnNhdmUoaW8yMDIyc2VsLCBmaWxlID0gIi9Vc2Vycy9hbnVzY2hrYS9Eb2N1bWVudHMvY2xpbWF0ZWNoYW5nZS9jbGltYXRlY2hhbmdlL2RhdGEvYWxsX3dhdmVzL2lvMjAyMnNlbC5SRGF0YSIpDQpgYGANCg0KIyMgTWVyZ2luZyBhbGwgZGF0YXNldHMgey19DQoNCmBgYHtyfQ0KI0NoZWNrIHdoZXRoZXIgdmFyaWFibGVzIGhhdmUgdGhlIHNhbWUgbGV2ZWwgYmVmb3JlIG1lcmdpbmcNCmF0dHJpYnV0ZXMoaW8yMDE5c2VsJHdvcnJpZWQpDQphdHRyaWJ1dGVzKGlvMjAyMHNlbCR3b3JyaWVkKQ0KYXR0cmlidXRlcyhpbzIwMjJzZWwkd29ycmllZCkNCg0KYXR0cmlidXRlcyhpbzIwMTlzZWwkZnJvbnRydW5uZXIpDQphdHRyaWJ1dGVzKGlvMjAyMHNlbCRmcm9udHJ1bm5lcikNCmF0dHJpYnV0ZXMoaW8yMDIyc2VsJGZyb250cnVubmVyKQ0KDQphdHRyaWJ1dGVzKGlvMjAxOXNlbCRzZXgpDQphdHRyaWJ1dGVzKGlvMjAyMHNlbCRzZXgpDQphdHRyaWJ1dGVzKGlvMjAyMnNlbCRzZXgpDQoNCmF0dHJpYnV0ZXMoaW8yMDE5c2VsJGluY29tZSkNCmF0dHJpYnV0ZXMoaW8yMDIwc2VsJGluY29tZSkNCmF0dHJpYnV0ZXMoaW8yMDIyc2VsJGluY29tZSkgDQoNCmF0dHJpYnV0ZXMoaW8yMDE5c2VsJGVkdWNfY2F0KQ0KYXR0cmlidXRlcyhpbzIwMjBzZWwkZWR1Y19jYXQpDQphdHRyaWJ1dGVzKGlvMjAyMnNlbCRlZHVjX2NhdCkNCg0KYXR0cmlidXRlcyhpbzIwMTlzZWwkcGFydHlfbmFtZSkNCmF0dHJpYnV0ZXMoaW8yMDIwc2VsJHBhcnR5X25hbWUpDQphdHRyaWJ1dGVzKGlvMjAyMnNlbCRwYXJ0eV9uYW1lKSANCg0KYXR0cmlidXRlcyhpbzIwMTlzZWwkZXRobmljaXR5KQ0KYXR0cmlidXRlcyhpbzIwMjBzZWwkZXRobmljaXR5KQ0KYXR0cmlidXRlcyhpbzIwMjJzZWwkZXRobmljaXR5KSANCg0KYGBgDQoNCmBgYHtyfQ0KI01lcmdpbmcgdGhlIHZhcmlhYmxlcyBpbnRvIG9uZSBkYXRhc2V0IGlzIHF1aXRlIGVhc3kgbm93IGFsbCB2YXJpYWJsZXMgYXJlIHRoZSBzYW1lDQpsb2FkKCIvVXNlcnMvYW51c2Noa2EvRG9jdW1lbnRzL2NsaW1hdGVjaGFuZ2UvY2xpbWF0ZWNoYW5nZS9kYXRhL2FsbF93YXZlcy9pbzIwMTlzZWwuUkRhdGEiKQ0KbG9hZCgiL1VzZXJzL2FudXNjaGthL0RvY3VtZW50cy9jbGltYXRlY2hhbmdlL2NsaW1hdGVjaGFuZ2UvZGF0YS9hbGxfd2F2ZXMvaW8yMDIwc2VsLlJEYXRhIikNCmxvYWQoIi9Vc2Vycy9hbnVzY2hrYS9Eb2N1bWVudHMvY2xpbWF0ZWNoYW5nZS9jbGltYXRlY2hhbmdlL2RhdGEvYWxsX3dhdmVzL2lvMjAyMnNlbC5SRGF0YSIpDQoNCmlvMjAxOXNlbCRzdXJ2ZXl5ZWFyIDwtIDIwMTkNCmlvMjAyMHNlbCRzdXJ2ZXl5ZWFyIDwtIDIwMjANCmlvMjAyMnNlbCRzdXJ2ZXl5ZWFyIDwtIDIwMjINCg0KaW9fdG90YWwgPC0gcGx5cjo6cmJpbmQuZmlsbChpbzIwMTlzZWwsIGlvMjAyMHNlbCwgaW8yMDIyc2VsKQ0KDQpzYXZlKGlvX3RvdGFsLCBmaWxlID0gIi9Vc2Vycy9hbnVzY2hrYS9Eb2N1bWVudHMvY2xpbWF0ZWNoYW5nZS9jbGltYXRlY2hhbmdlL2RhdGEvZmluYWxfZGF0YS9pb190b3RhbC5SRGF0YSIpDQpgYGANCg0KYGBge3J9DQpsb2FkKCIuL2RhdGEvZmluYWxfZGF0YS9pb190b3RhbC5SZGF0YSIpDQoNCnRhYmxlKGlvX3RvdGFsJGlzY2VkKQ0KaW9fdG90YWwkaXNjZWRfY2F0W2lvX3RvdGFsJGlzY2VkIDw9Ml0gPC0gIkJhc2ljIg0KaW9fdG90YWwkaXNjZWRfY2F0W2lvX3RvdGFsJGlzY2VkID09IDMgfCBpb190b3RhbCRpc2NlZCA9PSA0XSA8LSAiSW50ZXJtZWRpYXRlIg0KaW9fdG90YWwkaXNjZWRfY2F0W2lvX3RvdGFsJGlzY2VkID49NV0gPC0gIkFkdmFuY2VkIg0KaW9fdG90YWwkaXNjZWRfY2F0IDwtIGZhY3Rvcihpb190b3RhbCRpc2NlZF9jYXQsIGxldmVscz1jKCJCYXNpYyIsICJJbnRlcm1lZGlhdGUiLCAiQWR2YW5jZWQiKSwgb3JkZXJlZD1UUlVFKQ0KdGFibGUoaW9fdG90YWwkaXNjZWRfY2F0KQ0KDQppb190b3RhbCRzZXggPC0gaW9fdG90YWwkc2V4IC0gMQ0KDQpzYXZlKGlvX3RvdGFsLCBmaWxlPSIuL2RhdGEvZmluYWxfZGF0YS9pb190b3RhbC5SZGF0YSIpDQpgYGANCg0K