In this script I use loops to perform gamlss regressions for all 52 attitudes. The lists that I will get as output are saved with all the information, after which - in another script - i will extract the raw effects sizes used as input for the meta-regressions.

rm(list = ls())
library(gamlss)
library(tidyverse)
library(dplyr)
library(fastDummies)

ESS

load("./data/final_data/esstotal.RData")

# Gamlss cannot handle NAs, so I have to listwise delete all of them
ess_complete <- esstotal %>% drop_na()
ess_complete$time <- ess_complete$surveyyear - min(ess_complete$surveyyear)

# I want to build models. In the empty model, I only want to include time. 
predictors <- c("time")
deps <- c("worry", "cause", "pers_resp")

ess_list_empty <- list()

# Loop through each dependent variable
  for (i in 1:length(deps)) {
  # Specify the sigma formula
  sigma.formula <- as.formula(paste("~", paste(predictors, collapse = " + ")))
  # Perform the linear regression. The sigma formula pastes every variable one by one and calculates variance, the other formula shows the mean attitudes effects
  ess_fit <- gamlss(as.formula(paste(deps[i], "~", paste(predictors, collapse = " + "))), sigma.formula = sigma.formula,  family=NO(mu.link = "identity", sigma.link = "identity"), data = ess_complete, weights = weightvec)
  
  ess_list_empty[[i]] <- ess_fit
} 


summary(ess_list_empty[[1]]) #Sig pos effect of surveyyear on both intercept and variance (worry)
summary(ess_list_empty[[2]]) # Sig neg effect on intercept, sig pos effect on variance (cause)
summary(ess_list_empty[[3]]) # Sig pos effect on intercept, sig neg effect on variance (pers_resp)

 
save(ess_list_empty, file="./data/final_data/regression_outputs/ess_list_empty_w.RData")

#Estimate a second model with the indicators + time
predictors <- c("time", "sex", "isced_cat", "age")
deps <- c("worry", "cause", "pers_resp")

ess_list_preds <- list()

# Loop through each dependent variable
  for (i in 1:length(deps)) {
  # Specify the sigma formula
  sigma.formula <- as.formula(paste("~", paste(predictors, collapse = " + ")))
  # Perform the linear regression
  ess_fit <- gamlss(as.formula(paste(deps[i], "~", paste(predictors, collapse = " + "))), sigma.formula = sigma.formula, family=NO(mu.link = "identity", sigma.link = "identity"), data = ess_complete, weights = weightvec)
  
  ess_list_preds[[i]] <- ess_fit
} 

summary(ess_list_preds[[1]]) 

save(ess_list_preds, file="./data/final_data/regression_outputs/ess_list_preds_w_new.RData")

#Now the last model with interaction of time on predictor variables
ess_complete$age_time <- ess_complete$age * ess_complete$time
ess_complete$sex_time <- as.numeric(ess_complete$sex) * ess_complete$time
ess_complete <- fastDummies::dummy_cols(ess_complete, select_columns = "isced_cat")
ess_complete$isced_basic_time <- ess_complete$isced_cat_Basic * ess_complete$time
ess_complete$isced_intermediate_time <- ess_complete$isced_cat_Intermediate * ess_complete$time
ess_complete$isced_advanced_time <- ess_complete$isced_cat_Advanced * ess_complete$time

interactions <- c("age_time", "sex_time", "isced_intermediate_time", "isced_advanced_time")

ess_list_interactions <- list()

 for (i in 1:length(deps)) {
  # Specify the sigma formula
  sigma.formula <- as.formula(paste("~", paste(predictors, collapse = " + "), " + ", paste(interactions, collapse = " + ")))
  # Perform the linear regression
  ess_fit <- gamlss(as.formula(paste(deps[i], "~", paste(predictors, collapse = " + "), " + ", paste(interactions, collapse = "+ "))), sigma.formula = sigma.formula," + ", family=NO(mu.link = "identity", sigma.link = "identity"), data = ess_complete, weights = weightvec)
  
  ess_list_interactions[[i]] <- ess_fit
} 


summary(ess_list_interactions[[1]]) 
summary(ess_list_interactions[[2]]) 
summary(ess_list_interactions[[3]])

save(ess_list_interactions, file="./data/final_data/regression_outputs/ess_list_interactions_w_new.RData")

EVS

# Perform the same procedure for the EVS
load("./data/final_data/evssel.RData")

evs_complete <- evssel %>% dplyr::select(surveyyear:marstat, weightvec, isced_cat)
evs_complete <- evs_complete %>% drop_na()
evs_complete$time <- evs_complete$surveyyear - min(evs_complete$surveyyear)

predictors <- c("time")
deps <- c("climate5")

evs_list_empty <- list()

# Loop through each dependent variable
  for (i in 1:length(deps)) {
  # Specify the sigma formula
  sigma.formula <- as.formula(paste("~", paste(predictors, collapse = " + ")))
  # Perform the linear regrevsion
  evs_fit <- gamlss(as.formula(paste(deps[i], "~", paste(predictors, collapse = " + "))), sigma.formula = sigma.formula, family=NO(mu.link = "identity", sigma.link = "identity"), data = evs_complete, weights = weightvec)
  
  evs_list_empty[[i]] <- evs_fit
} 

summary(evs_list_empty[[1]]) #Sig pos effect of time on intercept

model1 <- evs_list_empty[[1]]

save(evs_list_empty, file="./data/final_data/regression_outputs/evs_list_empty_w.RData")

# Predictor model
predictors <- c("time", "sex", "isced_cat", "age")
deps <- c("climate5")

evs_list_preds <- list()

# Loop through each dependent variable
  for (i in 1:length(deps)) {
  # Specify the sigma formula
  sigma.formula <- as.formula(paste("~", paste(predictors, collapse = " + ")))
  # Perform the linear regrevsion
  evs_fit <- gamlss(as.formula(paste(deps[i], "~", paste(predictors, collapse = " + "))), sigma.formula = sigma.formula, family=NO(mu.link = "identity", sigma.link = "identity"), data = evs_complete, weights = weightvec)
  
  evs_list_preds[[i]] <- evs_fit
} 

summary(evs_list_preds[[1]]) 

save(evs_list_preds, file="./data/final_data/regression_outputs/evs_list_preds_w_new.RData")

#Now the last model with interaction of time on predictor variables
evs_complete$age_time <- evs_complete$age * evs_complete$time
evs_complete$sex_time <- as.numeric(evs_complete$sex) * evs_complete$time
evs_complete <- fastDummies::dummy_cols(evs_complete, select_columns = "isced_cat")
evs_complete$isced_basic_time <- evs_complete$isced_cat_Basic * evs_complete$time
evs_complete$isced_intermediate_time <- evs_complete$isced_cat_Intermediate * evs_complete$time
evs_complete$isced_advanced_time <- evs_complete$isced_cat_Advanced * evs_complete$time

interactions <- c("age_time", "sex_time", "isced_intermediate_time", "isced_advanced_time")

evs_list_interactions <- list()

 for (i in 1:length(deps)) {
  # Specify the sigma formula
  sigma.formula <- as.formula(paste("~", paste(predictors, collapse = " + "), " + ", paste(interactions, collapse = " + ")))
  # Perform the linear regrevsion
  evs_fit <- gamlss(as.formula(paste(deps[i], "~", paste(predictors, collapse = " + "), " + ", paste(interactions, collapse = "+ "))), sigma.formula = sigma.formula," + ", family=NO(mu.link = "identity", sigma.link = "identity"), data = evs_complete, weights = weightvec)
  
  evs_list_interactions[[i]] <- evs_fit
} 

summary(evs_list_interactions[[1]]) 

save(evs_list_interactions, file="./data/final_data/regression_outputs/evs_list_interactions_w_new.RData")

I&O

load("./data/final_data/io_total.RData")
io_complete <- io_total %>% dplyr::select(worried:surveyyear, weightvec, isced_cat)
#Urban, IOINKOMEN, IOPOL has to go away
io_complete = subset(io_complete, select = -c(urban,IOINKOMEN, IOPOL2017) )
io_complete <- io_complete %>% drop_na()

io_complete$time <- io_complete$surveyyear - min(io_complete$surveyyear)

predictors <- c("time")
deps <- c("worried", "frontrunner", "worry_future", "resp_citiz", "dk_start", "do_gov", "buss_help", "min_contr", "human_resp")

io_list_empty <- list()

# Loop through each dependent variable
  for (i in 1:length(deps)) {
  # Specify the sigma formula
  sigma.formula <- as.formula(paste("~", paste(predictors, collapse = " + ")))
  # Perform the linear regression
  io_fit <- gamlss(as.formula(paste(deps[i], "~", paste(predictors, collapse = " + "))), sigma.formula = sigma.formula, family=NO(mu.link = "identity", sigma.link = "identity"), data = io_complete, weights = weightvec)
  
  io_list_empty[[i]] <- io_fit
} 

summary(io_list_empty[[1]]) #Sig pos effect of time on intercept, not on variance
summary(io_list_empty[[2]])

model1 <- io_list_empty[[1]]
plot(model1, ts = "true")

save(io_list_empty, file="./data/final_data/regression_outputs/io_list_empty_w.RData")

# Predictor model
predictors <- c("time", "sex", "isced_cat", "age")
deps <- c("worried", "frontrunner", "worry_future", "resp_citiz", "dk_start", "do_gov", "buss_help", "min_contr", "human_resp")

io_list_preds <- list()

# Loop through each dependent variable
  for (i in 1:length(deps)) {
  # Specify the sigma formula
  sigma.formula <- as.formula(paste("~", paste(predictors, collapse = " + ")))
  # Perform the linear regression
  io_fit <- gamlss(as.formula(paste(deps[i], "~", paste(predictors, collapse = " + "))), sigma.formula = sigma.formula, family=NO(mu.link = "identity", sigma.link = "identity"), data = io_complete, weights = weightvec)
  
  io_list_preds[[i]] <- io_fit
} 

summary(io_list_preds[[1]]) 

save(io_list_preds, file="./data/final_data/regression_outputs/io_list_preds_w_new.RData")

#Now the last model with interaction of time on predictor variables
io_complete$age_time <- io_complete$age * io_complete$time
io_complete$sex_time <- as.numeric(io_complete$sex) * io_complete$time
io_complete <- fastDummies::dummy_cols(io_complete, select_columns = "isced_cat")
io_complete$isced_basic_time <- io_complete$isced_cat_Basic * io_complete$time
io_complete$isced_intermediate_time <- io_complete$isced_cat_Intermediate * io_complete$time
io_complete$isced_advanced_time <- io_complete$isced_cat_Advanced * io_complete$time

interactions <- c("age_time", "sex_time", "isced_intermediate_time", "isced_advanced_time")

io_list_interactions <- list()

 for (i in 1:length(deps)) {
  # Specify the sigma formula
  sigma.formula <- as.formula(paste("~", paste(predictors, collapse = " + "), " + ", paste(interactions, collapse = " + ")))
  # Perform the linear regression
  io_fit <- gamlss(as.formula(paste(deps[i], "~", paste(predictors, collapse = " + "), " + ", paste(interactions, collapse = "+ "))), sigma.formula = sigma.formula," + ", family=NO(mu.link = "identity", sigma.link = "identity"), data = io_complete, weights = weightvec)
  
  io_list_interactions[[i]] <- io_fit
} 


summary(io_list_interactions[[1]]) 

save(io_list_interactions, file="./data/final_data/regression_outputs/io_list_interactions_w_new.RData")

ISSP

load("./data/final_data/issptotal.Rdata")
issptotal$surveyyear[is.na(issptotal$surveyyear)] <- "2010"
issptotal$surveyyear <- as.numeric(issptotal$surveyyear)

# The issp has variables that are asked in all three waves, and variables that are asked only in 2 waves. So I have to run the code on subsets of the data. First I estimate the models for the statements that are asked throughout the three waves
issp_complete <- issptotal %>% dplyr::select(surveyyear:marstat, weightvec, isced_cat)
issp_complete <- issp_complete %>% drop_na()
issp_complete$time <- issp_complete$surveyyear - min(issp_complete$surveyyear)

# Time-only
predictors <- c("time")
deps <- c("worry", "lifeharm", "willing_price", "willing_tax", "willing_living", "do_right", "progharm", "econprotect", "people_decide")

issp_list_empty <- list()

# Loop through each dependent variable
  for (i in 1:length(deps)) {
  # Specify the sigma formula
  sigma.formula <- as.formula(paste("~", paste(predictors, collapse = " + ")))
  # Perform the linear regression
  issp_fit <- gamlss(as.formula(paste(deps[i], "~", paste(predictors, collapse = " + "))), sigma.formula = sigma.formula,
                     family=NO(mu.link = "identity", sigma.link = "identity"), data = issp_complete, weights = weightvec)
  
  issp_list_empty[[i]] <- issp_fit
} 

summary(issp_list_empty[[1]]) 
summary(issp_list_empty[[2]]) 
summary(issp_list_empty[[3]]) 
 
save(issp_list_empty, file="./data/final_data/regression_outputs/issp_list_empty_w.RData")

# Now with predictors
predictors <- c("time", "sex", "isced_cat", "age")
deps <- c("worry", "lifeharm", "willing_price", "willing_tax", "willing_living", "do_right", "progharm", "econprotect", "people_decide" )

issp_list_preds <- list()

# Loop through each dependent variable
  for (i in 1:length(deps)) {
  # Specify the sigma formula
  sigma.formula <- as.formula(paste("~", paste(predictors, collapse = " + ")))
  # Perform the linear regression
  issp_fit <- gamlss(as.formula(paste(deps[i], "~", paste(predictors, collapse = " + "))), sigma.formula = sigma.formula,
                      family=NO(mu.link = "identity", sigma.link = "identity"), data = issp_complete, weights = weightvec)
  
  issp_list_preds[[i]] <- issp_fit
} 

summary(issp_list_preds[[9]]) 

save(issp_list_preds, file="./data/final_data/regression_outputs/issp_list_preds_w_new.RData")

# And now interactions
issp_complete$age_time <- issp_complete$age * issp_complete$time
issp_complete$sex_time <- as.numeric(issp_complete$sex) * issp_complete$time
issp_complete <- fastDummies::dummy_cols(issp_complete, select_columns = "isced_cat")
issp_complete$isced_basic_time <- issp_complete$isced_cat_Basic * issp_complete$time
issp_complete$isced_intermediate_time <- issp_complete$isced_cat_Intermediate * issp_complete$time
issp_complete$isced_advanced_time <- issp_complete$isced_cat_Advanced * issp_complete$time

interactions <- c("age_time", "sex_time", "isced_intermediate_time", "isced_advanced_time")

issp_list_interactions <- list()

 for (i in 1:length(deps)) {
  # Specify the sigma formula
  sigma.formula <- as.formula(paste("~", paste(predictors, collapse = " + "), " + ", paste(interactions, collapse = " + ")))
  # Perform the linear regressisspn
  issp_fit <- gamlss(as.formula(paste(deps[i], "~", paste(predictors, collapse = " + "), " + ", paste(interactions, collapse = "+ "))), sigma.formula = sigma.formula," + ", family=NO(mu.link = "identity", sigma.link = "identity"), data = issp_complete, weights = weightvec)
  
  issp_list_interactions[[i]] <- issp_fit
} 

summary(issp_list_interactions[[1]]) 

save(issp_list_interactions, file="./data/final_data/regression_outputs/issp_list_interactions_w_new.RData")

# Now the variables that are only asked twice
issp_complete <- issptotal %>% dplyr::select(surveyyear, isced:growharm, weightvec, isced_cat)
issp_complete <- issp_complete %>% drop_na()
issp_complete$time <- issp_complete$surveyyear - min(issp_complete$surveyyear)

# Time-only model
predictors <- c("time")
deps <- c("exag", "moreimp", "othersame", "country_effort", "growharm")

issp_list_empty_2_waves <- list()

# Loop through each dependent variable
  for (i in 1:length(deps)) {
  # Specify the sigma formula
  sigma.formula <- as.formula(paste("~", paste(predictors, collapse = " + ")))
  # Perform the linear regression
  issp_fit <- gamlss(as.formula(paste(deps[i], "~", paste(predictors, collapse = " + "))), sigma.formula = sigma.formula, family=NO(mu.link = "identity", sigma.link = "identity"), data = issp_complete, weights = weightvec)
  
  issp_list_empty_2_waves[[i]] <- issp_fit
  } 

summary(issp_list_empty_2_waves[[1]]) 
summary(issp_list_empty_2_waves[[2]])
summary(issp_list_empty_2_waves[[3]]) 

save(issp_list_empty_2_waves, file="./data/final_data/regression_outputs/issp_list_empty_2_waves_w.RData")

# And the model with the predictors
predictors <- c("time", "sex", "isced_cat", "age")
deps <- c("exag", "moreimp", "othersame", "country_effort", "growharm")

issp_list_preds_2_waves <- list()

# Loop through each dependent variable
  for (i in 1:length(deps)) {
  # Specify the sigma formula
  sigma.formula <- as.formula(paste("~", paste(predictors, collapse = " + ")))
  # Perform the linear regression
  issp_fit <- gamlss(as.formula(paste(deps[i], "~", paste(predictors, collapse = " + "))), sigma.formula = sigma.formula, family=NO(mu.link = "identity", sigma.link = "identity"), data = issp_complete, weights = weightvec)
  
  issp_list_preds_2_waves[[i]] <- issp_fit
} 

summary(issp_list_preds_2_waves[[1]]) 

save(issp_list_preds_2_waves, file="./data/final_data/regression_outputs/issp_list_preds_2_waves_w_new.RData")

# And lastly, again the interactions
issp_complete$age_time <- issp_complete$age * issp_complete$time
issp_complete$sex_time <- as.numeric(issp_complete$sex) * issp_complete$time
issp_complete <- fastDummies::dummy_cols(issp_complete, select_columns = "isced_cat")
issp_complete$isced_basic_time <- issp_complete$isced_cat_Basic * issp_complete$time
issp_complete$isced_intermediate_time <- issp_complete$isced_cat_Intermediate * issp_complete$time
issp_complete$isced_advanced_time <- issp_complete$isced_cat_Advanced * issp_complete$time

interactions <- c("age_time", "sex_time", "isced_intermediate_time", "isced_advanced_time")

issp_list_interactions_2_waves <- list()

 for (i in 1:length(deps)) {
  # Specify the sigma formula
  sigma.formula <- as.formula(paste("~", paste(predictors, collapse = " + "), " + ", paste(interactions, collapse = " + ")))
  # Perform the linear regressisspn
  issp_fit <- gamlss(as.formula(paste(deps[i], "~", paste(predictors, collapse = " + "), " + ", paste(interactions, collapse = "+ "))), sigma.formula = sigma.formula," + ", family=NO(mu.link = "identity", sigma.link = "identity"), data = issp_complete, weights = weightvec)
  
  issp_list_interactions_2_waves[[i]] <- issp_fit
} 

summary(issp_list_interactions_2_waves[[1]]) 

save(issp_list_interactions_2_waves, file="./data/final_data/regression_outputs/issp_list_interactions_2_waves_w_new.RData")

EB

# Now the most difficult one: Eurobarometer. No items are asked steadily throughout time, so have to work with a lot of subsets. 
load("./data/final_data/eb_tot.Rdata")

# first 1986 - 1995
eb_complete <- eb_tot %>% dplyr::select(surveyyear, env_ec_stat, env_prsimp, sex, isced: urban, weightvec, isced_cat)
# Religion is only asked in one wave
eb_complete <- eb_complete %>% drop_na()
eb_complete$time <- eb_complete$surveyyear - min(eb_complete$surveyyear)

# First empty model 
predictors <- c("time")
deps <- c("env_ec_stat", "env_prsimp")

eb_list_empty_1986 <- list()

# Loop through each dependent variable
  for (i in 1:length(deps)) {
  # Specify the sigma formula
  sigma.formula <- as.formula(paste("~", paste(predictors, collapse = " + ")))
  # Perform the linear regression
  eb_fit <- gamlss(as.formula(paste(deps[i], "~", paste(predictors, collapse = " + "))), sigma.formula = sigma.formula,
                   family=NO(mu.link = "identity", sigma.link = "identity"), data = eb_complete, weights = weightvec)
  
  eb_list_empty_1986[[i]] <- eb_fit
} 

summary(eb_list_empty_1986[[1]]) 
summary(eb_list_empty_1986[[2]])

save(eb_list_empty_1986, file="./data/final_data/regression_outputs/eb_list_empty_1986_w.RData")

# Model with predictors
predictors <- c("time", "sex", "isced_cat", "age")
deps <- c("env_ec_stat", "env_prsimp")

eb_list_preds_1986 <- list()

# Loop through each dependent variable
  for (i in 1:length(deps)) {
  # Specify the sigma formula
  sigma.formula <- as.formula(paste("~", paste(predictors, collapse = " + ")))
  # Perform the linear regression
  eb_fit <- gamlss(as.formula(paste(deps[i], "~", paste(predictors, collapse = " + "))), sigma.formula = sigma.formula,
                   family=NO(mu.link = "identity", sigma.link = "identity"), data = eb_complete, weights = weightvec)
  
  eb_list_preds_1986[[i]] <- eb_fit
} 

summary(eb_list_preds_1986[[1]]) 
summary(eb_list_preds_1986[[2]])

save(eb_list_preds_1986, file="./data/final_data/regression_outputs/eb_list_preds_1986_w_new.RData")

# And the model with interactions
eb_complete$age_time <- eb_complete$age * eb_complete$time
eb_complete$sex_time <- as.numeric(eb_complete$sex) * eb_complete$time
eb_complete <- fastDummies::dummy_cols(eb_complete, select_columns = "isced_cat")
eb_complete$isced_basic_time <- eb_complete$isced_cat_Basic * eb_complete$time
eb_complete$isced_intermediate_time <- eb_complete$isced_cat_Intermediate * eb_complete$time
eb_complete$isced_advanced_time <- eb_complete$isced_cat_Advanced * eb_complete$time

interactions <- c("age_time", "sex_time", "isced_intermediate_time", "isced_advanced_time")

eb_list_interactions_1986 <- list()

 for (i in 1:length(deps)) {
  # Specify the sigma formula
  sigma.formula <- as.formula(paste("~", paste(predictors, collapse = " + "), " + ", paste(interactions, collapse = " + ")))
  # Perform the linear regression
  eb_fit <- gamlss(as.formula(paste(deps[i], "~", paste(predictors, collapse = " + "), " + ", paste(interactions, collapse = "+ "))), sigma.formula = sigma.formula," + ", family=NO(mu.link = "identity", sigma.link = "identity"), data = eb_complete, weights = weightvec)
  
  eb_list_interactions_1986[[i]] <- eb_fit
} 

summary(eb_list_interactions_1986[[1]]) 
summary(eb_list_interactions_1986[[2]])

save(eb_list_interactions_1986, file="./data/final_data/regression_outputs/eb_list_interactions_1986_w_new.RData")
# Now with the influence of environment on quality of life
eb_complete <- eb_tot %>% dplyr::select(surveyyear, env_quallife, sex, isced, urban, age, weightvec, isced_cat)
# Lrplace and income are not asked in all waves
eb_complete <- eb_complete %>% drop_na()
eb_complete$time <- eb_complete$surveyyear - min(eb_complete$surveyyear)

# First empty model 
predictors <- c("time")
deps <- c("env_quallife")

eb_list_empty_quallife <- list()

# Loop through each dependent variable
  for (i in 1:length(deps)) {
  # Specify the sigma formula
  sigma.formula <- as.formula(paste("~", paste(predictors, collapse = " + ")))
  # Perform the linear regression
  eb_fit <- gamlss(as.formula(paste(deps[i], "~", paste(predictors, collapse = " + "))), sigma.formula = sigma.formula, family=NO(mu.link = "identity", sigma.link = "identity"), data = eb_complete, weights = weightvec)
  
  eb_list_empty_quallife[[i]] <- eb_fit
} 

summary(eb_list_empty_quallife[[1]]) 

save(eb_list_empty_quallife, file="./data/final_data/regression_outputs/eb_list_empty_quallife_w.RData")

# Model with predictors
predictors <- c("time", "sex", "isced_cat", "age")
deps <- c("env_quallife")

eb_list_preds_quallife <- list()

# Loop through each dependent variable
  for (i in 1:length(deps)) {
  # Specify the sigma formula
  sigma.formula <- as.formula(paste("~", paste(predictors, collapse = " + ")))
  # Perform the linear regression
  eb_fit <- gamlss(as.formula(paste(deps[i], "~", paste(predictors, collapse = " + "))), sigma.formula = sigma.formula,
                   family=NO(mu.link = "identity", sigma.link = "identity"), data = eb_complete, weights = weightvec)
  
  eb_list_preds_quallife[[i]] <- eb_fit
} 

summary(eb_list_preds_quallife[[1]]) 

save(eb_list_preds_quallife, file="./data/final_data/regression_outputs/eb_list_preds_quallife_w_new.RData")

# And the model with interactions
eb_complete$age_time <- eb_complete$age * eb_complete$time
eb_complete$sex_time <- as.numeric(eb_complete$sex) * eb_complete$time
eb_complete <- fastDummies::dummy_cols(eb_complete, select_columns = "isced_cat")
eb_complete$isced_basic_time <- eb_complete$isced_cat_Basic * eb_complete$time
eb_complete$isced_intermediate_time <- eb_complete$isced_cat_Intermediate * eb_complete$time
eb_complete$isced_advanced_time <- eb_complete$isced_cat_Advanced * eb_complete$time

interactions <- c("age_time", "sex_time", "isced_intermediate_time", "isced_advanced_time")

eb_list_interactions_quallife <- list()

 for (i in 1:length(deps)) {
  # Specify the sigma formula
  sigma.formula <- as.formula(paste("~", paste(predictors, collapse = " + "), " + ", paste(interactions, collapse = " + ")))
  # Perform the linear regressebn
  eb_fit <- gamlss(as.formula(paste(deps[i], "~", paste(predictors, collapse = " + "), " + ", paste(interactions, collapse = "+ "))), sigma.formula = sigma.formula," + ", family=NO(mu.link = "identity", sigma.link = "identity"), data = eb_complete, weights = weightvec)
  
  eb_list_interactions_quallife[[i]] <- eb_fit
} 

summary(eb_list_interactions_quallife[[1]]) 

save(eb_list_interactions_quallife, file="./data/final_data/regression_outputs/eb_list_interactions_quallife_w_new.RData")
# Now 2 statements that are asked 4 times
eb_complete <- eb_tot %>% dplyr::select(surveyyear, role_ind, big_pol, sex, isced, urban, age, weightvec, isced_cat)
# Lrplace and income are not asked in all waves
eb_complete <- eb_complete %>% drop_na()
eb_complete$time <- eb_complete$surveyyear - min(eb_complete$surveyyear)

# First empty model 
predictors <- c("time")
deps <- c("role_ind", "big_pol")

eb_list_empty_2007 <- list()

# Loop through each dependent variable
  for (i in 1:length(deps)) {
  # Specify the sigma formula
  sigma.formula <- as.formula(paste("~", paste(predictors, collapse = " + ")))
  # Perform the linear regression
  eb_fit <- gamlss(as.formula(paste(deps[i], "~", paste(predictors, collapse = " + "))), sigma.formula = sigma.formula, family=NO(mu.link = "identity", sigma.link = "identity"), data = eb_complete, weights = weightvec)
  
  eb_list_empty_2007[[i]] <- eb_fit
} 

summary(eb_list_empty_2007[[2]]) 

save(eb_list_empty_2007, file="./data/final_data/regression_outputs/eb_list_empty_2007_w.RData")

# Model with predictors
predictors <- c("time", "sex", "isced_cat", "age")
deps <- c("role_ind", "big_pol")

eb_list_preds_2007 <- list()

# Loop through each dependent variable
  for (i in 1:length(deps)) {
  # Specify the sigma formula
  sigma.formula <- as.formula(paste("~", paste(predictors, collapse = " + ")))
  # Perform the linear regression
  eb_fit <- gamlss(as.formula(paste(deps[i], "~", paste(predictors, collapse = " + "))), sigma.formula = sigma.formula, family=NO(mu.link = "identity", sigma.link = "identity"), data = eb_complete, weights = weightvec)
  
  eb_list_preds_2007[[i]] <- eb_fit
} 

summary(eb_list_preds_2007[[1]]) 

save(eb_list_preds_2007, file="./data/final_data/regression_outputs/eb_list_preds_2007_w_new.RData")

# And the model with interactions
eb_complete$age_time <- eb_complete$age * eb_complete$time
eb_complete$sex_time <- as.numeric(eb_complete$sex) * eb_complete$time
eb_complete <- fastDummies::dummy_cols(eb_complete, select_columns = "isced_cat")
eb_complete$isced_basic_time <- eb_complete$isced_cat_Basic * eb_complete$time
eb_complete$isced_intermediate_time <- eb_complete$isced_cat_Intermediate * eb_complete$time
eb_complete$isced_advanced_time <- eb_complete$isced_cat_Advanced * eb_complete$time

interactions <- c("age_time", "sex_time", "isced_intermediate_time", "isced_advanced_time")

eb_list_interactions_2007 <- list()

 for (i in 1:length(deps)) {
  # Specify the sigma formula
  sigma.formula <- as.formula(paste("~", paste(predictors, collapse = " + "), " + ", paste(interactions, collapse = " + ")))
  # Perform the linear regressebn
  eb_fit <- gamlss(as.formula(paste(deps[i], "~", paste(predictors, collapse = " + "), " + ", paste(interactions, collapse = "+ "))), sigma.formula = sigma.formula," + ", family=NO(mu.link = "identity", sigma.link = "identity"), data = eb_complete, weights = weightvec)
  
  eb_list_interactions_2007[[i]] <- eb_fit
} 

summary(eb_list_interactions_2007[[1]]) 

save(eb_list_interactions_2007, file="./data/final_data/regression_outputs/eb_list_interactions_2007_w_new.RData")
# Now 2 statements that are asked 4 times
eb_complete <- eb_tot %>% dplyr::select(surveyyear, buyprod, sex, isced, urban, age, weightvec, isced_cat)
eb_complete <- eb_complete %>% drop_na()
eb_complete$time <- eb_complete$surveyyear - min(eb_complete$surveyyear)

# First empty model 
predictors <- c("time")
deps <- c("buyprod")

eb_list_empty_buyprod <- list()

# Loop through each dependent variable
  for (i in 1:length(deps)) {
  # Specify the sigma formula
  sigma.formula <- as.formula(paste("~", paste(predictors, collapse = " + ")))
  # Perform the linear regression
  eb_fit <- gamlss(as.formula(paste(deps[i], "~", paste(predictors, collapse = " + "))), sigma.formula = sigma.formula, family=NO(mu.link = "identity", sigma.link = "identity"), data = eb_complete, weights = weightvec)
  
  eb_list_empty_buyprod[[i]] <- eb_fit
} 

summary(eb_list_empty_buyprod[[1]]) 

save(eb_list_empty_buyprod, file="./data/final_data/regression_outputs/eb_list_empty_buyprod_w.RData")

# Model with predictors
predictors <- c("time", "sex", "isced_cat", "age")
deps <- c("buyprod")

eb_list_preds_buyprod <- list()

# Loop through each dependent variable
  for (i in 1:length(deps)) {
  # Specify the sigma formula
  sigma.formula <- as.formula(paste("~", paste(predictors, collapse = " + ")))
  # Perform the linear regression
  eb_fit <- gamlss(as.formula(paste(deps[i], "~", paste(predictors, collapse = " + "))), sigma.formula = sigma.formula, family=NO(mu.link = "identity", sigma.link = "identity"), data = eb_complete, weights = weightvec)
  
  eb_list_preds_buyprod[[i]] <- eb_fit
} 

summary(eb_list_preds_buyprod[[1]]) 

save(eb_list_preds_buyprod, file="./data/final_data/regression_outputs/eb_list_preds_buyprod_w_new.RData")

# And the model with interactions
eb_complete$age_time <- eb_complete$age * eb_complete$time
eb_complete$sex_time <- as.numeric(eb_complete$sex) * eb_complete$time
eb_complete <- fastDummies::dummy_cols(eb_complete, select_columns = "isced_cat")
eb_complete$isced_basic_time <- eb_complete$isced_cat_Basic * eb_complete$time
eb_complete$isced_intermediate_time <- eb_complete$isced_cat_Intermediate * eb_complete$time
eb_complete$isced_advanced_time <- eb_complete$isced_cat_Advanced * eb_complete$time

interactions <- c("age_time", "sex_time", "isced_intermediate_time", "isced_advanced_time")

eb_list_interactions_buyprod <- list()

 for (i in 1:length(deps)) {
  # Specify the sigma formula
  sigma.formula <- as.formula(paste("~", paste(predictors, collapse = " + "), " + ", paste(interactions, collapse = " + ")))
  # Perform the linear regression
  eb_fit <- gamlss(as.formula(paste(deps[i], "~", paste(predictors, collapse = " + "), " + ", paste(interactions, collapse = "+ "))), sigma.formula = sigma.formula," + ", family=NO(mu.link = "identity", sigma.link = "identity"), data = eb_complete, weights = weightvec)
  
  eb_list_interactions_buyprod[[i]] <- eb_fit
} 

summary(eb_list_interactions_buyprod[[1]]) 

save(eb_list_interactions_buyprod, file="./data/final_data/regression_outputs/eb_list_interactions_buyprod_w_new.RData")
# Now 2 statements that are asked 4 times
eb_complete <- eb_tot %>% dplyr::select(surveyyear, eff_daily, sex, isced, urban, age, weightvec, isced_cat)
eb_complete <- eb_complete %>% drop_na()
eb_complete$time <- eb_complete$surveyyear - min(eb_complete$surveyyear)

# First empty model 
predictors <- c("time")
deps <- c("eff_daily")

eb_list_empty_eff_daily <- list()

# Loop through each dependent variable
  for (i in 1:length(deps)) {
  # Specify the sigma formula
  sigma.formula <- as.formula(paste("~", paste(predictors, collapse = " + ")))
  # Perform the linear regression
  eb_fit <- gamlss(as.formula(paste(deps[i], "~", paste(predictors, collapse = " + "))), sigma.formula = sigma.formula, family=NO(mu.link = "identity", sigma.link = "identity"), data = eb_complete, weights = weightvec)
  
  eb_list_empty_eff_daily[[i]] <- eb_fit
} 

summary(eb_list_empty_eff_daily[[1]]) 

save(eb_list_empty_eff_daily, file="./data/final_data/regression_outputs/eb_list_empty_eff_daily_w.RData")

# Model with predictors
predictors <- c("time", "sex", "isced_cat", "age")
deps <- c("eff_daily")

eb_list_preds_eff_daily <- list()

# Loop through each dependent variable
  for (i in 1:length(deps)) {
  # Specify the sigma formula
  sigma.formula <- as.formula(paste("~", paste(predictors, collapse = " + ")))
  # Perform the linear regression
  eb_fit <- gamlss(as.formula(paste(deps[i], "~", paste(predictors, collapse = " + "))), sigma.formula = sigma.formula, family=NO(mu.link = "identity", sigma.link = "identity"), data = eb_complete, weights = weightvec)
  
  eb_list_preds_eff_daily[[i]] <- eb_fit
} 

summary(eb_list_preds_eff_daily[[1]]) 

save(eb_list_preds_eff_daily, file="./data/final_data/regression_outputs/eb_list_preds_eff_daily_w_new.RData")

# And the model with interactions
eb_complete$age_time <- eb_complete$age * eb_complete$time
eb_complete$sex_time <- as.numeric(eb_complete$sex) * eb_complete$time
eb_complete <- fastDummies::dummy_cols(eb_complete, select_columns = "isced_cat")
eb_complete$isced_basic_time <- eb_complete$isced_cat_Basic * eb_complete$time
eb_complete$isced_intermediate_time <- eb_complete$isced_cat_Intermediate * eb_complete$time
eb_complete$isced_advanced_time <- eb_complete$isced_cat_Advanced * eb_complete$time

interactions <- c("age_time", "sex_time", "isced_intermediate_time", "isced_advanced_time")

eb_list_interactions_eff_daily <- list()

 for (i in 1:length(deps)) {
  # Specify the sigma formula
  sigma.formula <- as.formula(paste("~", paste(predictors, collapse = " + "), " + ", paste(interactions, collapse = " + ")))
  # Perform the linear regression
  eb_fit <- gamlss(as.formula(paste(deps[i], "~", paste(predictors, collapse = " + "), " + ", paste(interactions, collapse = "+ "))), sigma.formula = sigma.formula," + ", family=NO(mu.link = "identity", sigma.link = "identity"), data = eb_complete, weights = weightvec)
  
  eb_list_interactions_eff_daily[[i]] <- eb_fit
} 

summary(eb_list_interactions_eff_daily[[1]]) 

save(eb_list_interactions_eff_daily, file="./data/final_data/regression_outputs/eb_list_interactions_eff_daily_w_new.RData")
# Now 4 vars that are asked 2 waves
eb_complete <- eb_tot %>% dplyr::select(surveyyear, cc_unstop:cc_prsact, sex, isced, urban, age, weightvec, isced_cat)
eb_complete <- eb_complete %>% drop_na()
eb_complete$time <- eb_complete$surveyyear - min(eb_complete$surveyyear)

# First empty model 
predictors <- c("time")
deps <- c("cc_unstop", "cc_exag", "cc_poseu", "cc_prsact")

eb_list_empty_2008 <- list()

# Loop through each dependent variable
  for (i in 1:length(deps)) {
  # Specify the sigma formula
  sigma.formula <- as.formula(paste("~", paste(predictors, collapse = " + ")))
  # Perform the linear regression
  eb_fit <- gamlss(as.formula(paste(deps[i], "~", paste(predictors, collapse = " + "))), sigma.formula = sigma.formula, family=NO(mu.link = "identity", sigma.link = "identity"), data = eb_complete, weights = weightvec)
  
  eb_list_empty_2008[[i]] <- eb_fit
} 

summary(eb_list_empty_2008[[1]]) 

save(eb_list_empty_2008, file="./data/final_data/regression_outputs/eb_list_empty_2008_w.RData")

# Model with predictors
predictors <- c("time", "sex", "isced_cat", "age")
deps <- c("cc_unstop", "cc_exag", "cc_poseu", "cc_prsact")

eb_list_preds_2008 <- list()

# Loop through each dependent variable
  for (i in 1:length(deps)) {
  # Specify the sigma formula
  sigma.formula <- as.formula(paste("~", paste(predictors, collapse = " + ")))
  # Perform the linear regression
  eb_fit <- gamlss(as.formula(paste(deps[i], "~", paste(predictors, collapse = " + "))), sigma.formula = sigma.formula, family=NO(mu.link = "identity", sigma.link = "identity"), data = eb_complete, weights = weightvec)
  
  eb_list_preds_2008[[i]] <- eb_fit
} 

summary(eb_list_preds_2008[[1]]) 

save(eb_list_preds_2008, file="./data/final_data/regression_outputs/eb_list_preds_2008_w_new.RData")

# And the model with interactions
eb_complete$age_time <- eb_complete$age * eb_complete$time
eb_complete$sex_time <- as.numeric(eb_complete$sex) * eb_complete$time
eb_complete <- fastDummies::dummy_cols(eb_complete, select_columns = "isced_cat")
eb_complete$isced_basic_time <- eb_complete$isced_cat_Basic * eb_complete$time
eb_complete$isced_intermediate_time <- eb_complete$isced_cat_Intermediate * eb_complete$time
eb_complete$isced_advanced_time <- eb_complete$isced_cat_Advanced * eb_complete$time

interactions <- c("age_time", "sex_time", "isced_intermediate_time", "isced_advanced_time")

eb_list_interactions_2008 <- list()

 for (i in 1:length(deps)) {
  # Specify the sigma formula
  sigma.formula <- as.formula(paste("~", paste(predictors, collapse = " + "), " + ", paste(interactions, collapse = " + ")))
  # Perform the linear regression
  eb_fit <- gamlss(as.formula(paste(deps[i], "~", paste(predictors, collapse = " + "), " + ", paste(interactions, collapse = "+ "))), sigma.formula = sigma.formula," + ", family=NO(mu.link = "identity", sigma.link = "identity"), data = eb_complete, weights = weightvec)
  
  eb_list_interactions_2008[[i]] <- eb_fit
} 

summary(eb_list_interactions_2008[[1]]) 

save(eb_list_interactions_2008, file="./data/final_data/regression_outputs/eb_list_interactions_2008_w_new.RData")
# Climate change perception asked in six waves
eb_complete <- eb_tot %>% dplyr::select(surveyyear, ccpercept, cchange, sex, isced, urban, age, weightvec, isced_cat)
eb_complete <- eb_complete %>% drop_na()
eb_complete$time <- eb_complete$surveyyear - min(eb_complete$surveyyear)

# First empty model 
predictors <- c("time")
deps <- c("ccpercept", "cchange")

eb_list_empty_2009 <- list()

# Loop through each dependent variable
  for (i in 1:length(deps)) {
  # Specify the sigma formula
  sigma.formula <- as.formula(paste("~", paste(predictors, collapse = " + ")))
  # Perform the linear regression
  eb_fit <- gamlss(as.formula(paste(deps[i], "~", paste(predictors, collapse = " + "))), sigma.formula = sigma.formula, family=NO(mu.link = "identity", sigma.link = "identity"), data = eb_complete, weights = weightvec)
  
  eb_list_empty_2009[[i]] <- eb_fit
} 

summary(eb_list_empty_2009[[1]]) 

save(eb_list_empty_2009, file="./data/final_data/regression_outputs/eb_list_empty_2009_w.RData")

# Model with predictors
predictors <- c("time", "sex", "isced_cat", "age")
deps <- c("ccpercept", "cchange")

eb_list_preds_2009 <- list()

# Loop through each dependent variable
  for (i in 1:length(deps)) {
  # Specify the sigma formula
  sigma.formula <- as.formula(paste("~", paste(predictors, collapse = " + ")))
  # Perform the linear regression
  eb_fit <- gamlss(as.formula(paste(deps[i], "~", paste(predictors, collapse = " + "))), sigma.formula = sigma.formula, family=NO(mu.link = "identity", sigma.link = "identity"), data = eb_complete, weights = weightvec)
  
  eb_list_preds_2009[[i]] <- eb_fit
} 

summary(eb_list_preds_2009[[1]]) 

save(eb_list_preds_2009, file="./data/final_data/regression_outputs/eb_list_preds_2009_w_new.RData")

# And the model with interactions
eb_complete$age_time <- eb_complete$age * eb_complete$time
eb_complete$sex_time <- as.numeric(eb_complete$sex) * eb_complete$time
eb_complete <- fastDummies::dummy_cols(eb_complete, select_columns = "isced_cat")
eb_complete$isced_basic_time <- eb_complete$isced_cat_Basic * eb_complete$time
eb_complete$isced_intermediate_time <- eb_complete$isced_cat_Intermediate * eb_complete$time
eb_complete$isced_advanced_time <- eb_complete$isced_cat_Advanced * eb_complete$time

interactions <- c("age_time", "sex_time", "isced_intermediate_time", "isced_advanced_time")

eb_list_interactions_2009 <- list()

 for (i in 1:length(deps)) {
  # Specify the sigma formula
  sigma.formula <- as.formula(paste("~", paste(predictors, collapse = " + "), " + ", paste(interactions, collapse = " + ")))
  # Perform the linear regression
  eb_fit <- gamlss(as.formula(paste(deps[i], "~", paste(predictors, collapse = " + "), " + ", paste(interactions, collapse = "+ "))), sigma.formula = sigma.formula," + ", family=NO(mu.link = "identity", sigma.link = "identity"), data = eb_complete, weights = weightvec)
  
  eb_list_interactions_2009[[i]] <- eb_fit
} 

summary(eb_list_interactions_2009[[1]]) 

save(eb_list_interactions_2009, file="./data/final_data/regression_outputs/eb_list_interactions_2009_w_new.RData")
# Personal importance asked in 3 waves
eb_complete <- eb_tot %>% dplyr::select(surveyyear, pers_imp, sex, isced, urban, age, weightvec, isced_cat)
eb_complete <- eb_complete %>% drop_na()
eb_complete$time <- eb_complete$surveyyear - min(eb_complete$surveyyear)

# First empty model 
predictors <- c("time")
deps <- c("pers_imp")

eb_list_empty_pers_imp <- list()

# Loop through each dependent variable
  for (i in 1:length(deps)) {
  # Specify the sigma formula
  sigma.formula <- as.formula(paste("~", paste(predictors, collapse = " + ")))
  # Perform the linear regression
  eb_fit <- gamlss(as.formula(paste(deps[i], "~", paste(predictors, collapse = " + "))), sigma.formula = sigma.formula,family=NO(mu.link = "identity", sigma.link = "identity"), data = eb_complete, weights = weightvec)
  
  eb_list_empty_pers_imp[[i]] <- eb_fit
} 

summary(eb_list_empty_pers_imp[[1]]) 

save(eb_list_empty_pers_imp, file="./data/final_data/regression_outputs/eb_list_empty_pers_imp_w.RData")

# Model with predictors
predictors <- c("time", "sex", "isced_cat", "age")
deps <- c("pers_imp")

eb_list_preds_pers_imp <- list()

# Loop through each dependent variable
  for (i in 1:length(deps)) {
  # Specify the sigma formula
  sigma.formula <- as.formula(paste("~", paste(predictors, collapse = " + ")))
  # Perform the linear regression
  eb_fit <- gamlss(as.formula(paste(deps[i], "~", paste(predictors, collapse = " + "))), sigma.formula = sigma.formula,
                   family=NO(mu.link = "identity", sigma.link = "identity"), data = eb_complete, weights = weightvec)
  
  eb_list_preds_pers_imp[[i]] <- eb_fit
} 

summary(eb_list_preds_pers_imp[[1]]) 

save(eb_list_preds_pers_imp, file="./data/final_data/regression_outputs/eb_list_preds_pers_imp_w_new.RData")

# And the model with interactions
eb_complete$age_time <- eb_complete$age * eb_complete$time
eb_complete$sex_time <- as.numeric(eb_complete$sex) * eb_complete$time
eb_complete <- fastDummies::dummy_cols(eb_complete, select_columns = "isced_cat")
eb_complete$isced_basic_time <- eb_complete$isced_cat_Basic * eb_complete$time
eb_complete$isced_intermediate_time <- eb_complete$isced_cat_Intermediate * eb_complete$time
eb_complete$isced_advanced_time <- eb_complete$isced_cat_Advanced * eb_complete$time

interactions <- c("age_time", "sex_time", "isced_intermediate_time", "isced_advanced_time")

eb_list_interactions_pers_imp <- list()

 for (i in 1:length(deps)) {
  # Specify the sigma formula
  sigma.formula <- as.formula(paste("~", paste(predictors, collapse = " + "), " + ", paste(interactions, collapse = " + ")))
  # Perform the linear regression
  eb_fit <- gamlss(as.formula(paste(deps[i], "~", paste(predictors, collapse = " + "), " + ", paste(interactions, collapse = "+ "))), sigma.formula = sigma.formula," + ", family=NO(mu.link = "identity", sigma.link = "identity"), data = eb_complete, weights = weightvec)
  
  eb_list_interactions_pers_imp[[i]] <- eb_fit
} 

summary(eb_list_interactions_pers_imp[[1]]) 

save(eb_list_interactions_pers_imp, file="./data/final_data/regression_outputs/eb_list_interactions_pers_imp_w_new.RData")
# Questions about who does enough asked in 3 waves
eb_complete <- eb_tot %>% dplyr::select(surveyyear, doprot_natgov:doprot_citiz, sex, isced, urban, age, weightvec, isced_cat)
eb_complete <- eb_complete %>% drop_na()
eb_complete$time <- eb_complete$surveyyear - min(eb_complete$surveyyear)

# First empty model 
predictors <- c("time")
deps <- c("doprot_natgov", "doprot_eu", "doprot_region", "doprot_comp", "doprot_citiz")

eb_list_empty_doprot <- list()

# Loop through each dependent variable
  for (i in 1:length(deps)) {
  # Specify the sigma formula
  sigma.formula <- as.formula(paste("~", paste(predictors, collapse = " + ")))
  # Perform the linear regression
  eb_fit <- gamlss(as.formula(paste(deps[i], "~", paste(predictors, collapse = " + "))), sigma.formula = sigma.formula, family=NO(mu.link = "identity", sigma.link = "identity"), data = eb_complete, weights = weightvec)
  
  eb_list_empty_doprot[[i]] <- eb_fit
} 

summary(eb_list_empty_doprot[[1]]) 

save(eb_list_empty_doprot, file="./data/final_data/regression_outputs/eb_list_empty_doprot_w.RData")

# Model with predictors
predictors <- c("time", "sex", "isced_cat", "age")
deps <- c("doprot_natgov", "doprot_eu", "doprot_region", "doprot_comp", "doprot_citiz")

eb_list_preds_doprot <- list()

# Loop through each dependent variable
  for (i in 1:length(deps)) {
  # Specify the sigma formula
  sigma.formula <- as.formula(paste("~", paste(predictors, collapse = " + ")))
  # Perform the linear regression
  eb_fit <- gamlss(as.formula(paste(deps[i], "~", paste(predictors, collapse = " + "))), sigma.formula = sigma.formula, family=NO(mu.link = "identity", sigma.link = "identity"), data = eb_complete, weights = weightvec)
  
  eb_list_preds_doprot[[i]] <- eb_fit
} 

summary(eb_list_preds_doprot[[1]]) 

save(eb_list_preds_doprot, file="./data/final_data/regression_outputs/eb_list_preds_doprot_w_new.RData")

# And the model with interactions
eb_complete$age_time <- eb_complete$age * eb_complete$time
eb_complete$sex_time <- as.numeric(eb_complete$sex) * eb_complete$time
eb_complete <- fastDummies::dummy_cols(eb_complete, select_columns = "isced_cat")
eb_complete$isced_basic_time <- eb_complete$isced_cat_Basic * eb_complete$time
eb_complete$isced_intermediate_time <- eb_complete$isced_cat_Intermediate * eb_complete$time
eb_complete$isced_advanced_time <- eb_complete$isced_cat_Advanced * eb_complete$time

interactions <- c("age_time", "sex_time", "isced_intermediate_time", "isced_advanced_time")

eb_list_interactions_doprot <- list()

 for (i in 1:length(deps)) {
  # Specify the sigma formula
  sigma.formula <- as.formula(paste("~", paste(predictors, collapse = " + "), " + ", paste(interactions, collapse = " + ")))
  # Perform the linear regression
  eb_fit <- gamlss(as.formula(paste(deps[i], "~", paste(predictors, collapse = " + "), " + ", paste(interactions, collapse = "+ "))), sigma.formula = sigma.formula," + ", family=NO(mu.link = "identity", sigma.link = "identity"), data = eb_complete, weights = weightvec)
  
  eb_list_interactions_doprot[[i]] <- eb_fit
} 

summary(eb_list_interactions_doprot[[1]]) 

save(eb_list_interactions_doprot, file="./data/final_data/regression_outputs/eb_list_interactions_doprot_w_new.RData")
# Questions about environment asked in 2 waves
eb_complete <- eb_tot %>% dplyr::select(surveyyear, envp_eg, effr_eg, sex, isced, urban, age, weightvec, isced_cat)
eb_complete <- eb_complete %>% drop_na()
eb_complete$time <- eb_complete$surveyyear - min(eb_complete$surveyyear)

# First empty model 
predictors <- c("time")
deps <- c("envp_eg", "effr_eg")

eb_list_empty_2011 <- list()

# Loop through each dependent variable
  for (i in 1:length(deps)) {
  # Specify the sigma formula
  sigma.formula <- as.formula(paste("~", paste(predictors, collapse = " + ")))
  # Perform the linear regression
  eb_fit <- gamlss(as.formula(paste(deps[i], "~", paste(predictors, collapse = " + "))), sigma.formula = sigma.formula, family=NO(mu.link = "identity", sigma.link = "identity"), data = eb_complete, weights = weightvec)
  
  eb_list_empty_2011[[i]] <- eb_fit
} 

summary(eb_list_empty_2011[[1]]) 

save(eb_list_empty_2011, file="./data/final_data/regression_outputs/eb_list_empty_2011_w.RData")

# Model with predictors
predictors <- c("time", "sex", "isced_cat", "age")
deps <- c("envp_eg", "effr_eg")

eb_list_preds_2011 <- list()

# Loop through each dependent variable
  for (i in 1:length(deps)) {
  # Specify the sigma formula
  sigma.formula <- as.formula(paste("~", paste(predictors, collapse = " + ")))
  # Perform the linear regression
  eb_fit <- gamlss(as.formula(paste(deps[i], "~", paste(predictors, collapse = " + "))), sigma.formula = sigma.formula, family=NO(mu.link = "identity", sigma.link = "identity"), data = eb_complete, weights = weightvec)
  
  eb_list_preds_2011[[i]] <- eb_fit
} 

summary(eb_list_preds_2011[[1]]) 

save(eb_list_preds_2011, file="./data/final_data/regression_outputs/eb_list_preds_2011_w_new.RData")

# And the model with interactions
eb_complete$age_time <- eb_complete$age * eb_complete$time
eb_complete$sex_time <- as.numeric(eb_complete$sex) * eb_complete$time
eb_complete <- fastDummies::dummy_cols(eb_complete, select_columns = "isced_cat")
eb_complete$isced_basic_time <- eb_complete$isced_cat_Basic * eb_complete$time
eb_complete$isced_intermediate_time <- eb_complete$isced_cat_Intermediate * eb_complete$time
eb_complete$isced_advanced_time <- eb_complete$isced_cat_Advanced * eb_complete$time

interactions <- c("age_time", "sex_time", "isced_intermediate_time", "isced_advanced_time")

eb_list_interactions_2011 <- list()

 for (i in 1:length(deps)) {
  # Specify the sigma formula
  sigma.formula <- as.formula(paste("~", paste(predictors, collapse = " + "), " + ", paste(interactions, collapse = " + ")))
  # Perform the linear regression
  eb_fit <- gamlss(as.formula(paste(deps[i], "~", paste(predictors, collapse = " + "), " + ", paste(interactions, collapse = "+ "))), sigma.formula = sigma.formula," + ", family=NO(mu.link = "identity", sigma.link = "identity"), data = eb_complete, weights = weightvec)
  
  eb_list_interactions_2011[[i]] <- eb_fit
} 

summary(eb_list_interactions_2011[[1]]) 

save(eb_list_interactions_2011, file="./data/final_data/regression_outputs/eb_list_interactions_2011_w_new.RData")
# Questions about naming climate change a problem
eb_complete <- eb_tot %>% dplyr::select(surveyyear, cchange2, cchangetot, sex, isced, urban, age, weightvec, isced_cat)
eb_complete <- eb_complete %>% drop_na()
eb_complete$time <- eb_complete$surveyyear - min(eb_complete$surveyyear)

# First empty model 
predictors <- c("time")
deps <- c("cchange2", "cchangetot")

eb_list_empty_cchange2 <- list()

# Loop through each dependent variable
  for (i in 1:length(deps)) {
  # Specify the sigma formula
  sigma.formula <- as.formula(paste("~", paste(predictors, collapse = " + ")))
  # Perform the linear regression
  eb_fit <- gamlss(as.formula(paste(deps[i], "~", paste(predictors, collapse = " + "))), sigma.formula = sigma.formula, family=NO(mu.link = "identity", sigma.link = "identity"), data = eb_complete, weights = weightvec)
  
  eb_list_empty_cchange2[[i]] <- eb_fit
} 

summary(eb_list_empty_cchange2[[1]]) 

save(eb_list_empty_cchange2, file="./data/final_data/regression_outputs/eb_list_empty_cchange2_w.RData")

# Model with predictors
predictors <- c("time", "sex", "isced_cat", "age")
deps <- c("cchange2", "cchangetot")

eb_list_preds_cchange2 <- list()

# Loop through each dependent variable
  for (i in 1:length(deps)) {
  # Specify the sigma formula
  sigma.formula <- as.formula(paste("~", paste(predictors, collapse = " + ")))
  # Perform the linear regression
  eb_fit <- gamlss(as.formula(paste(deps[i], "~", paste(predictors, collapse = " + "))), sigma.formula = sigma.formula,
                   family=NO(mu.link = "identity", sigma.link = "identity"), data = eb_complete, weights = weightvec)
  
  eb_list_preds_cchange2[[i]] <- eb_fit
} 

summary(eb_list_preds_cchange2[[1]]) 

save(eb_list_preds_cchange2, file="./data/final_data/regression_outputs/eb_list_preds_cchange2_w_new.RData")

# And the model with interactions
eb_complete$age_time <- eb_complete$age * eb_complete$time
eb_complete$sex_time <- as.numeric(eb_complete$sex) * eb_complete$time
eb_complete <- fastDummies::dummy_cols(eb_complete, select_columns = "isced_cat")
eb_complete$isced_basic_time <- eb_complete$isced_cat_Basic * eb_complete$time
eb_complete$isced_intermediate_time <- eb_complete$isced_cat_Intermediate * eb_complete$time
eb_complete$isced_advanced_time <- eb_complete$isced_cat_Advanced * eb_complete$time

interactions <- c("age_time", "sex_time", "isced_intermediate_time", "isced_advanced_time")

eb_list_interactions_cchange2 <- list()

 for (i in 1:length(deps)) {
  # Specify the sigma formula
  sigma.formula <- as.formula(paste("~", paste(predictors, collapse = " + "), " + ", paste(interactions, collapse = " + ")))
  # Perform the linear regression
  eb_fit <- gamlss(as.formula(paste(deps[i], "~", paste(predictors, collapse = " + "), " + ", paste(interactions, collapse = "+ "))), sigma.formula = sigma.formula," + ", family=NO(mu.link = "identity", sigma.link = "identity"), data = eb_complete, weights = weightvec)
  
  eb_list_interactions_cchange2[[i]] <- eb_fit
} 

summary(eb_list_interactions_cchange2[[1]]) 

save(eb_list_interactions_cchange2, file="./data/final_data/regression_outputs/eb_list_interactions_cchange2_w_new.RData")
# Question about personal action taken
eb_complete <- eb_tot %>% dplyr::select(surveyyear, prsaction, sex, isced, urban, age, weightvec, isced_cat)
eb_complete <- eb_complete %>% drop_na()
eb_complete$time <- eb_complete$surveyyear - min(eb_complete$surveyyear)

# First empty model 
predictors <- c("time")
deps <- c("prsaction")

eb_list_empty_prsaction <- list()

# Loop through each dependent variable
  for (i in 1:length(deps)) {
  # Specify the sigma formula
  sigma.formula <- as.formula(paste("~", paste(predictors, collapse = " + ")))
  # Perform the linear regression
  eb_fit <- gamlss(as.formula(paste(deps[i], "~", paste(predictors, collapse = " + "))), sigma.formula = sigma.formula, family=NO(mu.link = "identity", sigma.link = "identity"), data = eb_complete, weights = weightvec)
  
  eb_list_empty_prsaction[[i]] <- eb_fit
} 

summary(eb_list_empty_prsaction[[1]]) 

save(eb_list_empty_prsaction, file="./data/final_data/regression_outputs/eb_list_empty_prsaction_w.RData")

# Model with predictors
predictors <- c("time", "sex", "isced_cat", "age")
deps <- c("prsaction")

eb_list_preds_prsaction <- list()

# Loop through each dependent variable
  for (i in 1:length(deps)) {
  # Specify the sigma formula
  sigma.formula <- as.formula(paste("~", paste(predictors, collapse = " + ")))
  # Perform the linear regression
  eb_fit <- gamlss(as.formula(paste(deps[i], "~", paste(predictors, collapse = " + "))), sigma.formula = sigma.formula, family=NO(mu.link = "identity", sigma.link = "identity"), data = eb_complete, weights = weightvec)
  
  eb_list_preds_prsaction[[i]] <- eb_fit
} 

summary(eb_list_preds_prsaction[[1]]) 

save(eb_list_preds_prsaction, file="./data/final_data/regression_outputs/eb_list_preds_prsaction_w_new.RData")

# And the model with interactions
eb_complete$age_time <- eb_complete$age * eb_complete$time
eb_complete$sex_time <- as.numeric(eb_complete$sex) * eb_complete$time
eb_complete <- fastDummies::dummy_cols(eb_complete, select_columns = "isced_cat")
eb_complete$isced_basic_time <- eb_complete$isced_cat_Basic * eb_complete$time
eb_complete$isced_intermediate_time <- eb_complete$isced_cat_Intermediate * eb_complete$time
eb_complete$isced_advanced_time <- eb_complete$isced_cat_Advanced * eb_complete$time

interactions <- c("age_time", "sex_time", "isced_intermediate_time", "isced_advanced_time")

eb_list_interactions_prsaction <- list()

 for (i in 1:length(deps)) {
  # Specify the sigma formula
  sigma.formula <- as.formula(paste("~", paste(predictors, collapse = " + "), " + ", paste(interactions, collapse = " + ")))
  # Perform the linear regression
  eb_fit <- gamlss(as.formula(paste(deps[i], "~", paste(predictors, collapse = " + "), " + ", paste(interactions, collapse = "+ "))), sigma.formula = sigma.formula," + ", family=NO(mu.link = "identity", sigma.link = "identity"), data = eb_complete, weights = weightvec)
  
  eb_list_interactions_prsaction[[i]] <- eb_fit
} 

summary(eb_list_interactions_prsaction[[1]]) 

save(eb_list_interactions_prsaction, file="./data/final_data/regression_outputs/eb_list_interactions_prsaction_w_new.RData")
# Last item, whether the city undertakes enough action
eb_complete <- eb_tot %>% dplyr::select(surveyyear, doprot_city, sex, isced, urban, age, weightvec, isced_cat)
eb_complete <- eb_complete %>% drop_na()
eb_complete$time <- eb_complete$surveyyear - min(eb_complete$surveyyear)

# First empty model 
predictors <- c("time")
deps <- c("doprot_city")

eb_list_empty_doprot_city <- list()

# Loop through each dependent variable
  for (i in 1:length(deps)) {
  # Specify the sigma formula
  sigma.formula <- as.formula(paste("~", paste(predictors, collapse = " + ")))
  # Perform the linear regression
  eb_fit <- gamlss(as.formula(paste(deps[i], "~", paste(predictors, collapse = " + "))), sigma.formula = sigma.formula, family=NO(mu.link = "identity", sigma.link = "identity"), data = eb_complete, weights = weightvec)
  
  eb_list_empty_doprot_city[[i]] <- eb_fit
} 

summary(eb_list_empty_doprot_city[[1]]) 

save(eb_list_empty_doprot_city, file="./data/final_data/regression_outputs/eb_list_empty_doprot_city_w.RData")

# Model with predictors
predictors <- c("time", "sex", "isced_cat", "age")
deps <- c("doprot_city")

eb_list_preds_doprot_city <- list()

# Loop through each dependent variable
  for (i in 1:length(deps)) {
  # Specify the sigma formula
  sigma.formula <- as.formula(paste("~", paste(predictors, collapse = " + ")))
  # Perform the linear regression
  eb_fit <- gamlss(as.formula(paste(deps[i], "~", paste(predictors, collapse = " + "))), sigma.formula = sigma.formula, family=NO(mu.link = "identity", sigma.link = "identity"), data = eb_complete, weights = weightvec)
  
  eb_list_preds_doprot_city[[i]] <- eb_fit
} 

summary(eb_list_preds_doprot_city[[1]]) 

save(eb_list_preds_doprot_city, file="./data/final_data/regression_outputs/eb_list_preds_doprot_city_w_new.RData")

# And the model with interactions
eb_complete$age_time <- eb_complete$age * eb_complete$time
eb_complete$sex_time <- as.numeric(eb_complete$sex) * eb_complete$time
eb_complete <- fastDummies::dummy_cols(eb_complete, select_columns = "isced_cat")
eb_complete$isced_basic_time <- eb_complete$isced_cat_Basic * eb_complete$time
eb_complete$isced_intermediate_time <- eb_complete$isced_cat_Intermediate * eb_complete$time
eb_complete$isced_advanced_time <- eb_complete$isced_cat_Advanced * eb_complete$time

interactions <- c("age_time", "sex_time", "isced_intermediate_time", "isced_advanced_time")

eb_list_interactions_doprot_city <- list()

 for (i in 1:length(deps)) {
  # Specify the sigma formula
  sigma.formula <- as.formula(paste("~", paste(predictors, collapse = " + "), " + ", paste(interactions, collapse = " + ")))
  # Perform the linear regression
  eb_fit <- gamlss(as.formula(paste(deps[i], "~", paste(predictors, collapse = " + "), " + ", paste(interactions, collapse = "+ "))), sigma.formula = sigma.formula," + ", family=NO(mu.link = "identity", sigma.link = "identity"), data = eb_complete, weights = weightvec)
  
  eb_list_interactions_doprot_city[[i]] <- eb_fit
} 

summary(eb_list_interactions_doprot_city[[1]]) 

save(eb_list_interactions_doprot_city, file="./data/final_data/regression_outputs/eb_list_interactions_doprot_city_w_new.RData")

Motivaction

load("./data/final_data/mottotal.RData")

# Gamlss cannot handle NAs, so I have to listwise delete all of them
mot_complete <- mottotal %>% drop_na()
mot_complete$time <- mot_complete$surveyyear - min(mot_complete$surveyyear)

# I want to build models. In the empty model, I only want to include time. 
predictors <- c("time")
deps <- c("cchange_mot", "worried_mot", "futuregen", "nowor", "ontime", "gov", "resp_gov", "resp_comp", "resp_mkb", "resp_citiz_mot", "resp_you", "pers_resp_mot", "sust_choice", "contr", "energy", "noidea", "motiv")

mot_list_empty <- list()

# Loop through each dependent variable
  for (i in 1:length(deps)) {
  # Specify the sigma formula
  sigma.formula <- as.formula(paste("~", paste(predictors, collapse = " + ")))
  # Perform the linear regression. The sigma formula pastes every variable one by one and calculates variance, the other formula shows the mean attitudes effects
  mot_fit <- gamlss(as.formula(paste(deps[i], "~", paste(predictors, collapse = " + "))), sigma.formula = sigma.formula, family=NO(mu.link = "identity", sigma.link = "identity"), data = mot_complete, weights = weightvec)
  
  mot_list_empty[[i]] <- mot_fit
} 

summary(mot_list_empty[[8]]) 

save(mot_list_empty, file="./data/final_data/regression_outputs/mot_list_empty_w.RData")

#Estimate a second model with the indicators + time
predictors <- c("time", "sex", "isced_cat", "age")
deps <- c("cchange_mot", "worried_mot", "futuregen", "nowor", "ontime", "gov", "resp_gov", "resp_comp", "resp_mkb", "resp_citiz_mot", "resp_you", "pers_resp_mot", "sust_choice", "contr", "energy", "noidea", "motiv")

mot_list_preds <- list()

# Loop through each dependent variable
  for (i in 1:length(deps)) {
  # Specify the sigma formula
  sigma.formula <- as.formula(paste("~", paste(predictors, collapse = " + ")))
  # Perform the linear regrmotion
  mot_fit <- gamlss(as.formula(paste(deps[i], "~", paste(predictors, collapse = " + "))), sigma.formula = sigma.formula, family=NO(mu.link = "identity", sigma.link = "identity"), data = mot_complete, weights = weightvec)
  
  mot_list_preds[[i]] <- mot_fit
} 

summary(mot_list_preds[[1]]) 

save(mot_list_preds, file="./data/final_data/regression_outputs/mot_list_preds_w_new.RData")

#Now the last model with interaction of time on predictor variables
mot_complete$age_time <- mot_complete$age * mot_complete$time
mot_complete$sex_time <- as.numeric(mot_complete$sex) * mot_complete$time
mot_complete <- fastDummies::dummy_cols(mot_complete, select_columns = "isced_cat")
mot_complete$isced_basic_time <- mot_complete$isced_cat_Basic * mot_complete$time
mot_complete$isced_intermediate_time <- mot_complete$isced_cat_Intermediate * mot_complete$time
mot_complete$isced_advanced_time <- mot_complete$isced_cat_Advanced * mot_complete$time

interactions <- c("age_time", "sex_time", "isced_intermediate_time", "isced_advanced_time")


mot_list_interactions <- list()

 for (i in 1:length(deps)) {
  # Specify the sigma formula
  sigma.formula <- as.formula(paste("~", paste(predictors, collapse = " + "), " + ", paste(interactions, collapse = " + ")))
  # Perform the linear regrmotion
  mot_fit <- gamlss(as.formula(paste(deps[i], "~", paste(predictors, collapse = " + "), " + ", paste(interactions, collapse = "+ "))), sigma.formula = sigma.formula," + ", family=NO(mu.link = "identity", sigma.link = "identity"), data = mot_complete, weights = weightvec)
  
  mot_list_interactions[[i]] <- mot_fit
} 


summary(mot_list_interactions[[1]]) 

save(mot_list_interactions, file="./data/final_data/regression_outputs/mot_list_interactions_w_new.RData")

LISS

rm(list=ls())
load("./data/final_data/lisstotal.RData")

# Gamlss cannot handle NAs, so I have to listwise delete all of them
liss_complete <- lisstotal %>% drop_na()
liss_complete$time <- liss_complete$surveyyear - min(liss_complete$surveyyear)

# I want to build models. In the empty model, I only want to include time. 
predictors <- c("time")
deps <- c("lifestyle")

liss_list_empty <- list()

# Loop through each dependent variable
  for (i in 1:length(deps)) {
  # Specify the sigma formula
  sigma.formula <- as.formula(paste("~", paste(predictors, collapse = " + ")))
  # Perform the linear regression. The sigma formula pastes every variable one by one and calculates variance, the other formula shows the mean attitudes effects
  liss_fit <- gamlss(as.formula(paste(deps[i], "~", paste(predictors, collapse = " + "))), sigma.formula = sigma.formula, family=NO(mu.link = "identity", sigma.link = "identity"), data = liss_complete, weights = weightvec)
  
  liss_list_empty[[i]] <- liss_fit
} 

summary(liss_list_empty[[1]]) 

save(liss_list_empty, file="./data/final_data/regression_outputs/liss_list_empty_w.RData")

#Estimate a second model with the indicators + time
predictors <- c("time", "sex", "isced_cat", "age")
deps <- c("lifestyle")


liss_list_preds <- list()

# Loop through each dependent variable
  for (i in 1:length(deps)) {
  # Specify the sigma formula
  sigma.formula <- as.formula(paste("~", paste(predictors, collapse = " + ")))
  # Perform the linear regrlission
  liss_fit <- gamlss(as.formula(paste(deps[i], "~", paste(predictors, collapse = " + "))), sigma.formula = sigma.formula, family=NO(mu.link = "identity", sigma.link = "identity"), data = liss_complete, weights = weightvec)
  
  liss_list_preds[[i]] <- liss_fit
} 

summary(liss_list_preds[[1]]) 

save(liss_list_preds, file="./data/final_data/regression_outputs/liss_list_preds_w_new.RData")



#Now the last model with interaction of time on predictor variables
liss_complete$age_time <- liss_complete$age * liss_complete$time
liss_complete$sex_time <- as.numeric(liss_complete$sex) * liss_complete$time
liss_complete <- fastDummies::dummy_cols(liss_complete, select_columns = "isced_cat")
liss_complete$isced_basic_time <- liss_complete$isced_cat_Basic * liss_complete$time
liss_complete$isced_intermediate_time <- liss_complete$isced_cat_Intermediate * liss_complete$time
liss_complete$isced_advanced_time <- liss_complete$isced_cat_Advanced * liss_complete$time

interactions <- c("age_time", "sex_time", "isced_intermediate_time", "isced_advanced_time")

liss_list_interactions <- list()

 for (i in 1:length(deps)) {
  # Specify the sigma formula
  sigma.formula <- as.formula(paste("~", paste(predictors, collapse = " + "), " + ", paste(interactions, collapse = " + ")))
  # Perform the linear regression
  liss_fit <- gamlss(as.formula(paste(deps[i], "~", paste(predictors, collapse = " + "), " + ", paste(interactions, collapse = "+ "))), sigma.formula = sigma.formula," + ", family=NO(mu.link = "identity", sigma.link = "identity"), data = liss_complete, weights = weightvec)
  
  liss_list_interactions[[i]] <- liss_fit
} 


summary(liss_list_interactions[[1]]) 

save(liss_list_interactions, file="./data/final_data/regression_outputs/liss_list_interactions_w_new.RData")

SOCON

rm(list=ls())
load("./data/final_data/socontotal.RData")

# Gamlss cannot handle NAs, so I have to listwise delete all of them
socon_complete <- socontotal %>% drop_na()
socon_complete$time <- socon_complete$surveyyear - min(socon_complete$surveyyear)

# I want to build models. In the empty model, I only want to include time. 
predictors <- c("time")
deps <- c("fut_gen_socon")


socon_list_empty <- list()

# Loop through each dependent variable
  for (i in 1:length(deps)) {
  # Specify the sigma formula
  sigma.formula <- as.formula(paste("~", paste(predictors, collapse = " + ")))
  # Perform the linear regression. The sigma formula pastes every variable one by one and calculates variance, the other formula shows the mean attitudes effects
  socon_fit <- gamlss(as.formula(paste(deps[i], "~", paste(predictors, collapse = " + "))), sigma.formula = sigma.formula, family=NO(mu.link = "identity", sigma.link = "identity"), data = socon_complete, weights = weightvec)
  
  socon_list_empty[[i]] <- socon_fit
} 

summary(socon_list_empty[[1]]) 

save(socon_list_empty, file="./data/final_data/regression_outputs/socon_list_empty_w.RData")

#Estimate a second model with the indicators + time
predictors <- c("time", "sex", "isced_cat", "age")
deps <- c("fut_gen_socon")


socon_list_preds <- list()

# Loop through each dependent variable
  for (i in 1:length(deps)) {
  # Specify the sigma formula
  sigma.formula <- as.formula(paste("~", paste(predictors, collapse = " + ")))
  # Perform the linear regression
  socon_fit <- gamlss(as.formula(paste(deps[i], "~", paste(predictors, collapse = " + "))), sigma.formula = sigma.formula, family=NO(mu.link = "identity", sigma.link = "identity"), data = socon_complete, weights = weightvec)
  
  socon_list_preds[[i]] <- socon_fit
} 

summary(socon_list_preds[[1]]) 

save(socon_list_preds, file="./data/final_data/regression_outputs/socon_list_preds_w_new.RData")

#Now the last model with interaction of time on predictor variables
socon_complete$age_time <- socon_complete$age * socon_complete$time
socon_complete$sex_time <- as.numeric(socon_complete$sex) * socon_complete$time
socon_complete <- fastDummies::dummy_cols(socon_complete, select_columns = "isced_cat")
socon_complete$isced_basic_time <- socon_complete$isced_cat_Basic * socon_complete$time
socon_complete$isced_intermediate_time <- socon_complete$isced_cat_Intermediate * socon_complete$time
socon_complete$isced_advanced_time <- socon_complete$isced_cat_Advanced * socon_complete$time

interactions <- c("age_time", "sex_time", "isced_intermediate_time", "isced_advanced_time")


socon_list_interactions <- list()

 for (i in 1:length(deps)) {
  # Specify the sigma formula
  sigma.formula <- as.formula(paste("~", paste(predictors, collapse = " + "), " + ", paste(interactions, collapse = " + ")))
  # Perform the linear regression
  socon_fit <- gamlss(as.formula(paste(deps[i], "~", paste(predictors, collapse = " + "), " + ", paste(interactions, collapse = "+ "))), sigma.formula = sigma.formula," + ", family=NO(mu.link = "identity", sigma.link = "identity"), data = socon_complete, weights = weightvec)
  
  socon_list_interactions[[i]] <- socon_fit
} 


summary(socon_list_interactions[[1]]) 

save(socon_list_interactions, file="./data/final_data/regression_outputs/socon_list_interactions_w_new.RData")
LS0tDQp0aXRsZTogIkdhbWxzcyByZWdyZXNzaW9ucyBhbGwgZGF0YXNldHMiDQphdXRob3I6ICJBbnVzY2hrYSBQZWVsZW4iDQpkYXRlOiAiYHIgU3lzLkRhdGUoKWAiDQpvdXRwdXQ6IGh0bWxfZG9jdW1lbnQNCi0tLQ0KDQpgYGB7ciwgZWNobz1GQUxTRX0NCmtuaXRyOjpvcHRzX2NodW5rJHNldChldmFsID0gRkFMU0UpDQprbml0cjo6b3B0c19jaHVuayRzZXQobnVtYmVyX3NlY3Rpb25zID0gRkFMU0UpDQpvcHRpb25zKHdpZHRoID0gMTAwKQ0KY29sb3JpemUgPC0gZnVuY3Rpb24oeCwgY29sb3IpIHtzcHJpbnRmKCI8c3BhbiBzdHlsZT0nY29sb3I6ICVzOyc+JXM8L3NwYW4+IiwgY29sb3IsIHgpIH0NCmBgYA0KDQpgYGB7Y3NzLCBlY2hvPUZBTFNFfQ0KcHJlIHsNCiAgbWF4LWhlaWdodDogMzAwcHg7DQogIG92ZXJmbG93LXk6IGF1dG87DQp9DQoNCnByZVtjbGFzc10gew0KICBtYXgtaGVpZ2h0OiAxMDBweDsNCn0NCmBgYA0KDQpJbiB0aGlzIHNjcmlwdCBJIHVzZSBsb29wcyB0byBwZXJmb3JtIGdhbWxzcyByZWdyZXNzaW9ucyBmb3IgYWxsIDUyIGF0dGl0dWRlcy4gVGhlIGxpc3RzIHRoYXQgSSB3aWxsIGdldCBhcyBvdXRwdXQgYXJlIHNhdmVkIHdpdGggYWxsIHRoZSBpbmZvcm1hdGlvbiwgYWZ0ZXIgd2hpY2ggLSBpbiBhbm90aGVyIHNjcmlwdCAtIGkgd2lsbCBleHRyYWN0IHRoZSByYXcgZWZmZWN0cyBzaXplcyB1c2VkIGFzIGlucHV0IGZvciB0aGUgbWV0YS1yZWdyZXNzaW9ucy4gIA0KDQpgYGB7cn0NCnJtKGxpc3QgPSBscygpKQ0KbGlicmFyeShnYW1sc3MpDQpsaWJyYXJ5KHRpZHl2ZXJzZSkNCmxpYnJhcnkoZHBseXIpDQpsaWJyYXJ5KGZhc3REdW1taWVzKQ0KYGBgDQoNCiMjIEVTUyB7LX0NCg0KYGBge3J9DQpsb2FkKCIuL2RhdGEvZmluYWxfZGF0YS9lc3N0b3RhbC5SRGF0YSIpDQoNCiMgR2FtbHNzIGNhbm5vdCBoYW5kbGUgTkFzLCBzbyBJIGhhdmUgdG8gbGlzdHdpc2UgZGVsZXRlIGFsbCBvZiB0aGVtDQplc3NfY29tcGxldGUgPC0gZXNzdG90YWwgJT4lIGRyb3BfbmEoKQ0KZXNzX2NvbXBsZXRlJHRpbWUgPC0gZXNzX2NvbXBsZXRlJHN1cnZleXllYXIgLSBtaW4oZXNzX2NvbXBsZXRlJHN1cnZleXllYXIpDQoNCiMgSSB3YW50IHRvIGJ1aWxkIG1vZGVscy4gSW4gdGhlIGVtcHR5IG1vZGVsLCBJIG9ubHkgd2FudCB0byBpbmNsdWRlIHRpbWUuIA0KcHJlZGljdG9ycyA8LSBjKCJ0aW1lIikNCmRlcHMgPC0gYygid29ycnkiLCAiY2F1c2UiLCAicGVyc19yZXNwIikNCg0KZXNzX2xpc3RfZW1wdHkgPC0gbGlzdCgpDQoNCiMgTG9vcCB0aHJvdWdoIGVhY2ggZGVwZW5kZW50IHZhcmlhYmxlDQogIGZvciAoaSBpbiAxOmxlbmd0aChkZXBzKSkgew0KICAjIFNwZWNpZnkgdGhlIHNpZ21hIGZvcm11bGENCiAgc2lnbWEuZm9ybXVsYSA8LSBhcy5mb3JtdWxhKHBhc3RlKCJ+IiwgcGFzdGUocHJlZGljdG9ycywgY29sbGFwc2UgPSAiICsgIikpKQ0KICAjIFBlcmZvcm0gdGhlIGxpbmVhciByZWdyZXNzaW9uLiBUaGUgc2lnbWEgZm9ybXVsYSBwYXN0ZXMgZXZlcnkgdmFyaWFibGUgb25lIGJ5IG9uZSBhbmQgY2FsY3VsYXRlcyB2YXJpYW5jZSwgdGhlIG90aGVyIGZvcm11bGEgc2hvd3MgdGhlIG1lYW4gYXR0aXR1ZGVzIGVmZmVjdHMNCiAgZXNzX2ZpdCA8LSBnYW1sc3MoYXMuZm9ybXVsYShwYXN0ZShkZXBzW2ldLCAifiIsIHBhc3RlKHByZWRpY3RvcnMsIGNvbGxhcHNlID0gIiArICIpKSksIHNpZ21hLmZvcm11bGEgPSBzaWdtYS5mb3JtdWxhLCAgZmFtaWx5PU5PKG11LmxpbmsgPSAiaWRlbnRpdHkiLCBzaWdtYS5saW5rID0gImlkZW50aXR5IiksIGRhdGEgPSBlc3NfY29tcGxldGUsIHdlaWdodHMgPSB3ZWlnaHR2ZWMpDQogIA0KICBlc3NfbGlzdF9lbXB0eVtbaV1dIDwtIGVzc19maXQNCn0gDQoNCg0Kc3VtbWFyeShlc3NfbGlzdF9lbXB0eVtbMV1dKSAjU2lnIHBvcyBlZmZlY3Qgb2Ygc3VydmV5eWVhciBvbiBib3RoIGludGVyY2VwdCBhbmQgdmFyaWFuY2UgKHdvcnJ5KQ0Kc3VtbWFyeShlc3NfbGlzdF9lbXB0eVtbMl1dKSAjIFNpZyBuZWcgZWZmZWN0IG9uIGludGVyY2VwdCwgc2lnIHBvcyBlZmZlY3Qgb24gdmFyaWFuY2UgKGNhdXNlKQ0Kc3VtbWFyeShlc3NfbGlzdF9lbXB0eVtbM11dKSAjIFNpZyBwb3MgZWZmZWN0IG9uIGludGVyY2VwdCwgc2lnIG5lZyBlZmZlY3Qgb24gdmFyaWFuY2UgKHBlcnNfcmVzcCkNCg0KIA0Kc2F2ZShlc3NfbGlzdF9lbXB0eSwgZmlsZT0iLi9kYXRhL2ZpbmFsX2RhdGEvcmVncmVzc2lvbl9vdXRwdXRzL2Vzc19saXN0X2VtcHR5X3cuUkRhdGEiKQ0KDQojRXN0aW1hdGUgYSBzZWNvbmQgbW9kZWwgd2l0aCB0aGUgaW5kaWNhdG9ycyArIHRpbWUNCnByZWRpY3RvcnMgPC0gYygidGltZSIsICJzZXgiLCAiaXNjZWRfY2F0IiwgImFnZSIpDQpkZXBzIDwtIGMoIndvcnJ5IiwgImNhdXNlIiwgInBlcnNfcmVzcCIpDQoNCmVzc19saXN0X3ByZWRzIDwtIGxpc3QoKQ0KDQojIExvb3AgdGhyb3VnaCBlYWNoIGRlcGVuZGVudCB2YXJpYWJsZQ0KICBmb3IgKGkgaW4gMTpsZW5ndGgoZGVwcykpIHsNCiAgIyBTcGVjaWZ5IHRoZSBzaWdtYSBmb3JtdWxhDQogIHNpZ21hLmZvcm11bGEgPC0gYXMuZm9ybXVsYShwYXN0ZSgifiIsIHBhc3RlKHByZWRpY3RvcnMsIGNvbGxhcHNlID0gIiArICIpKSkNCiAgIyBQZXJmb3JtIHRoZSBsaW5lYXIgcmVncmVzc2lvbg0KICBlc3NfZml0IDwtIGdhbWxzcyhhcy5mb3JtdWxhKHBhc3RlKGRlcHNbaV0sICJ+IiwgcGFzdGUocHJlZGljdG9ycywgY29sbGFwc2UgPSAiICsgIikpKSwgc2lnbWEuZm9ybXVsYSA9IHNpZ21hLmZvcm11bGEsIGZhbWlseT1OTyhtdS5saW5rID0gImlkZW50aXR5Iiwgc2lnbWEubGluayA9ICJpZGVudGl0eSIpLCBkYXRhID0gZXNzX2NvbXBsZXRlLCB3ZWlnaHRzID0gd2VpZ2h0dmVjKQ0KICANCiAgZXNzX2xpc3RfcHJlZHNbW2ldXSA8LSBlc3NfZml0DQp9IA0KDQpzdW1tYXJ5KGVzc19saXN0X3ByZWRzW1sxXV0pIA0KDQpzYXZlKGVzc19saXN0X3ByZWRzLCBmaWxlPSIuL2RhdGEvZmluYWxfZGF0YS9yZWdyZXNzaW9uX291dHB1dHMvZXNzX2xpc3RfcHJlZHNfd19uZXcuUkRhdGEiKQ0KDQojTm93IHRoZSBsYXN0IG1vZGVsIHdpdGggaW50ZXJhY3Rpb24gb2YgdGltZSBvbiBwcmVkaWN0b3IgdmFyaWFibGVzDQplc3NfY29tcGxldGUkYWdlX3RpbWUgPC0gZXNzX2NvbXBsZXRlJGFnZSAqIGVzc19jb21wbGV0ZSR0aW1lDQplc3NfY29tcGxldGUkc2V4X3RpbWUgPC0gYXMubnVtZXJpYyhlc3NfY29tcGxldGUkc2V4KSAqIGVzc19jb21wbGV0ZSR0aW1lDQplc3NfY29tcGxldGUgPC0gZmFzdER1bW1pZXM6OmR1bW15X2NvbHMoZXNzX2NvbXBsZXRlLCBzZWxlY3RfY29sdW1ucyA9ICJpc2NlZF9jYXQiKQ0KZXNzX2NvbXBsZXRlJGlzY2VkX2Jhc2ljX3RpbWUgPC0gZXNzX2NvbXBsZXRlJGlzY2VkX2NhdF9CYXNpYyAqIGVzc19jb21wbGV0ZSR0aW1lDQplc3NfY29tcGxldGUkaXNjZWRfaW50ZXJtZWRpYXRlX3RpbWUgPC0gZXNzX2NvbXBsZXRlJGlzY2VkX2NhdF9JbnRlcm1lZGlhdGUgKiBlc3NfY29tcGxldGUkdGltZQ0KZXNzX2NvbXBsZXRlJGlzY2VkX2FkdmFuY2VkX3RpbWUgPC0gZXNzX2NvbXBsZXRlJGlzY2VkX2NhdF9BZHZhbmNlZCAqIGVzc19jb21wbGV0ZSR0aW1lDQoNCmludGVyYWN0aW9ucyA8LSBjKCJhZ2VfdGltZSIsICJzZXhfdGltZSIsICJpc2NlZF9pbnRlcm1lZGlhdGVfdGltZSIsICJpc2NlZF9hZHZhbmNlZF90aW1lIikNCg0KZXNzX2xpc3RfaW50ZXJhY3Rpb25zIDwtIGxpc3QoKQ0KDQogZm9yIChpIGluIDE6bGVuZ3RoKGRlcHMpKSB7DQogICMgU3BlY2lmeSB0aGUgc2lnbWEgZm9ybXVsYQ0KICBzaWdtYS5mb3JtdWxhIDwtIGFzLmZvcm11bGEocGFzdGUoIn4iLCBwYXN0ZShwcmVkaWN0b3JzLCBjb2xsYXBzZSA9ICIgKyAiKSwgIiArICIsIHBhc3RlKGludGVyYWN0aW9ucywgY29sbGFwc2UgPSAiICsgIikpKQ0KICAjIFBlcmZvcm0gdGhlIGxpbmVhciByZWdyZXNzaW9uDQogIGVzc19maXQgPC0gZ2FtbHNzKGFzLmZvcm11bGEocGFzdGUoZGVwc1tpXSwgIn4iLCBwYXN0ZShwcmVkaWN0b3JzLCBjb2xsYXBzZSA9ICIgKyAiKSwgIiArICIsIHBhc3RlKGludGVyYWN0aW9ucywgY29sbGFwc2UgPSAiKyAiKSkpLCBzaWdtYS5mb3JtdWxhID0gc2lnbWEuZm9ybXVsYSwiICsgIiwgZmFtaWx5PU5PKG11LmxpbmsgPSAiaWRlbnRpdHkiLCBzaWdtYS5saW5rID0gImlkZW50aXR5IiksIGRhdGEgPSBlc3NfY29tcGxldGUsIHdlaWdodHMgPSB3ZWlnaHR2ZWMpDQogIA0KICBlc3NfbGlzdF9pbnRlcmFjdGlvbnNbW2ldXSA8LSBlc3NfZml0DQp9IA0KDQoNCnN1bW1hcnkoZXNzX2xpc3RfaW50ZXJhY3Rpb25zW1sxXV0pIA0Kc3VtbWFyeShlc3NfbGlzdF9pbnRlcmFjdGlvbnNbWzJdXSkgDQpzdW1tYXJ5KGVzc19saXN0X2ludGVyYWN0aW9uc1tbM11dKQ0KDQpzYXZlKGVzc19saXN0X2ludGVyYWN0aW9ucywgZmlsZT0iLi9kYXRhL2ZpbmFsX2RhdGEvcmVncmVzc2lvbl9vdXRwdXRzL2Vzc19saXN0X2ludGVyYWN0aW9uc193X25ldy5SRGF0YSIpDQpgYGANCg0KIyMgRVZTIHstfQ0KDQpgYGB7cn0NCiMgUGVyZm9ybSB0aGUgc2FtZSBwcm9jZWR1cmUgZm9yIHRoZSBFVlMNCmxvYWQoIi4vZGF0YS9maW5hbF9kYXRhL2V2c3NlbC5SRGF0YSIpDQoNCmV2c19jb21wbGV0ZSA8LSBldnNzZWwgJT4lIGRwbHlyOjpzZWxlY3Qoc3VydmV5eWVhcjptYXJzdGF0LCB3ZWlnaHR2ZWMsIGlzY2VkX2NhdCkNCmV2c19jb21wbGV0ZSA8LSBldnNfY29tcGxldGUgJT4lIGRyb3BfbmEoKQ0KZXZzX2NvbXBsZXRlJHRpbWUgPC0gZXZzX2NvbXBsZXRlJHN1cnZleXllYXIgLSBtaW4oZXZzX2NvbXBsZXRlJHN1cnZleXllYXIpDQoNCnByZWRpY3RvcnMgPC0gYygidGltZSIpDQpkZXBzIDwtIGMoImNsaW1hdGU1IikNCg0KZXZzX2xpc3RfZW1wdHkgPC0gbGlzdCgpDQoNCiMgTG9vcCB0aHJvdWdoIGVhY2ggZGVwZW5kZW50IHZhcmlhYmxlDQogIGZvciAoaSBpbiAxOmxlbmd0aChkZXBzKSkgew0KICAjIFNwZWNpZnkgdGhlIHNpZ21hIGZvcm11bGENCiAgc2lnbWEuZm9ybXVsYSA8LSBhcy5mb3JtdWxhKHBhc3RlKCJ+IiwgcGFzdGUocHJlZGljdG9ycywgY29sbGFwc2UgPSAiICsgIikpKQ0KICAjIFBlcmZvcm0gdGhlIGxpbmVhciByZWdyZXZzaW9uDQogIGV2c19maXQgPC0gZ2FtbHNzKGFzLmZvcm11bGEocGFzdGUoZGVwc1tpXSwgIn4iLCBwYXN0ZShwcmVkaWN0b3JzLCBjb2xsYXBzZSA9ICIgKyAiKSkpLCBzaWdtYS5mb3JtdWxhID0gc2lnbWEuZm9ybXVsYSwgZmFtaWx5PU5PKG11LmxpbmsgPSAiaWRlbnRpdHkiLCBzaWdtYS5saW5rID0gImlkZW50aXR5IiksIGRhdGEgPSBldnNfY29tcGxldGUsIHdlaWdodHMgPSB3ZWlnaHR2ZWMpDQogIA0KICBldnNfbGlzdF9lbXB0eVtbaV1dIDwtIGV2c19maXQNCn0gDQoNCnN1bW1hcnkoZXZzX2xpc3RfZW1wdHlbWzFdXSkgI1NpZyBwb3MgZWZmZWN0IG9mIHRpbWUgb24gaW50ZXJjZXB0DQoNCm1vZGVsMSA8LSBldnNfbGlzdF9lbXB0eVtbMV1dDQoNCnNhdmUoZXZzX2xpc3RfZW1wdHksIGZpbGU9Ii4vZGF0YS9maW5hbF9kYXRhL3JlZ3Jlc3Npb25fb3V0cHV0cy9ldnNfbGlzdF9lbXB0eV93LlJEYXRhIikNCg0KIyBQcmVkaWN0b3IgbW9kZWwNCnByZWRpY3RvcnMgPC0gYygidGltZSIsICJzZXgiLCAiaXNjZWRfY2F0IiwgImFnZSIpDQpkZXBzIDwtIGMoImNsaW1hdGU1IikNCg0KZXZzX2xpc3RfcHJlZHMgPC0gbGlzdCgpDQoNCiMgTG9vcCB0aHJvdWdoIGVhY2ggZGVwZW5kZW50IHZhcmlhYmxlDQogIGZvciAoaSBpbiAxOmxlbmd0aChkZXBzKSkgew0KICAjIFNwZWNpZnkgdGhlIHNpZ21hIGZvcm11bGENCiAgc2lnbWEuZm9ybXVsYSA8LSBhcy5mb3JtdWxhKHBhc3RlKCJ+IiwgcGFzdGUocHJlZGljdG9ycywgY29sbGFwc2UgPSAiICsgIikpKQ0KICAjIFBlcmZvcm0gdGhlIGxpbmVhciByZWdyZXZzaW9uDQogIGV2c19maXQgPC0gZ2FtbHNzKGFzLmZvcm11bGEocGFzdGUoZGVwc1tpXSwgIn4iLCBwYXN0ZShwcmVkaWN0b3JzLCBjb2xsYXBzZSA9ICIgKyAiKSkpLCBzaWdtYS5mb3JtdWxhID0gc2lnbWEuZm9ybXVsYSwgZmFtaWx5PU5PKG11LmxpbmsgPSAiaWRlbnRpdHkiLCBzaWdtYS5saW5rID0gImlkZW50aXR5IiksIGRhdGEgPSBldnNfY29tcGxldGUsIHdlaWdodHMgPSB3ZWlnaHR2ZWMpDQogIA0KICBldnNfbGlzdF9wcmVkc1tbaV1dIDwtIGV2c19maXQNCn0gDQoNCnN1bW1hcnkoZXZzX2xpc3RfcHJlZHNbWzFdXSkgDQoNCnNhdmUoZXZzX2xpc3RfcHJlZHMsIGZpbGU9Ii4vZGF0YS9maW5hbF9kYXRhL3JlZ3Jlc3Npb25fb3V0cHV0cy9ldnNfbGlzdF9wcmVkc193X25ldy5SRGF0YSIpDQoNCiNOb3cgdGhlIGxhc3QgbW9kZWwgd2l0aCBpbnRlcmFjdGlvbiBvZiB0aW1lIG9uIHByZWRpY3RvciB2YXJpYWJsZXMNCmV2c19jb21wbGV0ZSRhZ2VfdGltZSA8LSBldnNfY29tcGxldGUkYWdlICogZXZzX2NvbXBsZXRlJHRpbWUNCmV2c19jb21wbGV0ZSRzZXhfdGltZSA8LSBhcy5udW1lcmljKGV2c19jb21wbGV0ZSRzZXgpICogZXZzX2NvbXBsZXRlJHRpbWUNCmV2c19jb21wbGV0ZSA8LSBmYXN0RHVtbWllczo6ZHVtbXlfY29scyhldnNfY29tcGxldGUsIHNlbGVjdF9jb2x1bW5zID0gImlzY2VkX2NhdCIpDQpldnNfY29tcGxldGUkaXNjZWRfYmFzaWNfdGltZSA8LSBldnNfY29tcGxldGUkaXNjZWRfY2F0X0Jhc2ljICogZXZzX2NvbXBsZXRlJHRpbWUNCmV2c19jb21wbGV0ZSRpc2NlZF9pbnRlcm1lZGlhdGVfdGltZSA8LSBldnNfY29tcGxldGUkaXNjZWRfY2F0X0ludGVybWVkaWF0ZSAqIGV2c19jb21wbGV0ZSR0aW1lDQpldnNfY29tcGxldGUkaXNjZWRfYWR2YW5jZWRfdGltZSA8LSBldnNfY29tcGxldGUkaXNjZWRfY2F0X0FkdmFuY2VkICogZXZzX2NvbXBsZXRlJHRpbWUNCg0KaW50ZXJhY3Rpb25zIDwtIGMoImFnZV90aW1lIiwgInNleF90aW1lIiwgImlzY2VkX2ludGVybWVkaWF0ZV90aW1lIiwgImlzY2VkX2FkdmFuY2VkX3RpbWUiKQ0KDQpldnNfbGlzdF9pbnRlcmFjdGlvbnMgPC0gbGlzdCgpDQoNCiBmb3IgKGkgaW4gMTpsZW5ndGgoZGVwcykpIHsNCiAgIyBTcGVjaWZ5IHRoZSBzaWdtYSBmb3JtdWxhDQogIHNpZ21hLmZvcm11bGEgPC0gYXMuZm9ybXVsYShwYXN0ZSgifiIsIHBhc3RlKHByZWRpY3RvcnMsIGNvbGxhcHNlID0gIiArICIpLCAiICsgIiwgcGFzdGUoaW50ZXJhY3Rpb25zLCBjb2xsYXBzZSA9ICIgKyAiKSkpDQogICMgUGVyZm9ybSB0aGUgbGluZWFyIHJlZ3JldnNpb24NCiAgZXZzX2ZpdCA8LSBnYW1sc3MoYXMuZm9ybXVsYShwYXN0ZShkZXBzW2ldLCAifiIsIHBhc3RlKHByZWRpY3RvcnMsIGNvbGxhcHNlID0gIiArICIpLCAiICsgIiwgcGFzdGUoaW50ZXJhY3Rpb25zLCBjb2xsYXBzZSA9ICIrICIpKSksIHNpZ21hLmZvcm11bGEgPSBzaWdtYS5mb3JtdWxhLCIgKyAiLCBmYW1pbHk9Tk8obXUubGluayA9ICJpZGVudGl0eSIsIHNpZ21hLmxpbmsgPSAiaWRlbnRpdHkiKSwgZGF0YSA9IGV2c19jb21wbGV0ZSwgd2VpZ2h0cyA9IHdlaWdodHZlYykNCiAgDQogIGV2c19saXN0X2ludGVyYWN0aW9uc1tbaV1dIDwtIGV2c19maXQNCn0gDQoNCnN1bW1hcnkoZXZzX2xpc3RfaW50ZXJhY3Rpb25zW1sxXV0pIA0KDQpzYXZlKGV2c19saXN0X2ludGVyYWN0aW9ucywgZmlsZT0iLi9kYXRhL2ZpbmFsX2RhdGEvcmVncmVzc2lvbl9vdXRwdXRzL2V2c19saXN0X2ludGVyYWN0aW9uc193X25ldy5SRGF0YSIpDQoNCmBgYA0KDQojIyBJJk8gey19DQoNCmBgYHtyfQ0KbG9hZCgiLi9kYXRhL2ZpbmFsX2RhdGEvaW9fdG90YWwuUkRhdGEiKQ0KaW9fY29tcGxldGUgPC0gaW9fdG90YWwgJT4lIGRwbHlyOjpzZWxlY3Qod29ycmllZDpzdXJ2ZXl5ZWFyLCB3ZWlnaHR2ZWMsIGlzY2VkX2NhdCkNCiNVcmJhbiwgSU9JTktPTUVOLCBJT1BPTCBoYXMgdG8gZ28gYXdheQ0KaW9fY29tcGxldGUgPSBzdWJzZXQoaW9fY29tcGxldGUsIHNlbGVjdCA9IC1jKHVyYmFuLElPSU5LT01FTiwgSU9QT0wyMDE3KSApDQppb19jb21wbGV0ZSA8LSBpb19jb21wbGV0ZSAlPiUgZHJvcF9uYSgpDQoNCmlvX2NvbXBsZXRlJHRpbWUgPC0gaW9fY29tcGxldGUkc3VydmV5eWVhciAtIG1pbihpb19jb21wbGV0ZSRzdXJ2ZXl5ZWFyKQ0KDQpwcmVkaWN0b3JzIDwtIGMoInRpbWUiKQ0KZGVwcyA8LSBjKCJ3b3JyaWVkIiwgImZyb250cnVubmVyIiwgIndvcnJ5X2Z1dHVyZSIsICJyZXNwX2NpdGl6IiwgImRrX3N0YXJ0IiwgImRvX2dvdiIsICJidXNzX2hlbHAiLCAibWluX2NvbnRyIiwgImh1bWFuX3Jlc3AiKQ0KDQppb19saXN0X2VtcHR5IDwtIGxpc3QoKQ0KDQojIExvb3AgdGhyb3VnaCBlYWNoIGRlcGVuZGVudCB2YXJpYWJsZQ0KICBmb3IgKGkgaW4gMTpsZW5ndGgoZGVwcykpIHsNCiAgIyBTcGVjaWZ5IHRoZSBzaWdtYSBmb3JtdWxhDQogIHNpZ21hLmZvcm11bGEgPC0gYXMuZm9ybXVsYShwYXN0ZSgifiIsIHBhc3RlKHByZWRpY3RvcnMsIGNvbGxhcHNlID0gIiArICIpKSkNCiAgIyBQZXJmb3JtIHRoZSBsaW5lYXIgcmVncmVzc2lvbg0KICBpb19maXQgPC0gZ2FtbHNzKGFzLmZvcm11bGEocGFzdGUoZGVwc1tpXSwgIn4iLCBwYXN0ZShwcmVkaWN0b3JzLCBjb2xsYXBzZSA9ICIgKyAiKSkpLCBzaWdtYS5mb3JtdWxhID0gc2lnbWEuZm9ybXVsYSwgZmFtaWx5PU5PKG11LmxpbmsgPSAiaWRlbnRpdHkiLCBzaWdtYS5saW5rID0gImlkZW50aXR5IiksIGRhdGEgPSBpb19jb21wbGV0ZSwgd2VpZ2h0cyA9IHdlaWdodHZlYykNCiAgDQogIGlvX2xpc3RfZW1wdHlbW2ldXSA8LSBpb19maXQNCn0gDQoNCnN1bW1hcnkoaW9fbGlzdF9lbXB0eVtbMV1dKSAjU2lnIHBvcyBlZmZlY3Qgb2YgdGltZSBvbiBpbnRlcmNlcHQsIG5vdCBvbiB2YXJpYW5jZQ0Kc3VtbWFyeShpb19saXN0X2VtcHR5W1syXV0pDQoNCm1vZGVsMSA8LSBpb19saXN0X2VtcHR5W1sxXV0NCnBsb3QobW9kZWwxLCB0cyA9ICJ0cnVlIikNCg0Kc2F2ZShpb19saXN0X2VtcHR5LCBmaWxlPSIuL2RhdGEvZmluYWxfZGF0YS9yZWdyZXNzaW9uX291dHB1dHMvaW9fbGlzdF9lbXB0eV93LlJEYXRhIikNCg0KIyBQcmVkaWN0b3IgbW9kZWwNCnByZWRpY3RvcnMgPC0gYygidGltZSIsICJzZXgiLCAiaXNjZWRfY2F0IiwgImFnZSIpDQpkZXBzIDwtIGMoIndvcnJpZWQiLCAiZnJvbnRydW5uZXIiLCAid29ycnlfZnV0dXJlIiwgInJlc3BfY2l0aXoiLCAiZGtfc3RhcnQiLCAiZG9fZ292IiwgImJ1c3NfaGVscCIsICJtaW5fY29udHIiLCAiaHVtYW5fcmVzcCIpDQoNCmlvX2xpc3RfcHJlZHMgPC0gbGlzdCgpDQoNCiMgTG9vcCB0aHJvdWdoIGVhY2ggZGVwZW5kZW50IHZhcmlhYmxlDQogIGZvciAoaSBpbiAxOmxlbmd0aChkZXBzKSkgew0KICAjIFNwZWNpZnkgdGhlIHNpZ21hIGZvcm11bGENCiAgc2lnbWEuZm9ybXVsYSA8LSBhcy5mb3JtdWxhKHBhc3RlKCJ+IiwgcGFzdGUocHJlZGljdG9ycywgY29sbGFwc2UgPSAiICsgIikpKQ0KICAjIFBlcmZvcm0gdGhlIGxpbmVhciByZWdyZXNzaW9uDQogIGlvX2ZpdCA8LSBnYW1sc3MoYXMuZm9ybXVsYShwYXN0ZShkZXBzW2ldLCAifiIsIHBhc3RlKHByZWRpY3RvcnMsIGNvbGxhcHNlID0gIiArICIpKSksIHNpZ21hLmZvcm11bGEgPSBzaWdtYS5mb3JtdWxhLCBmYW1pbHk9Tk8obXUubGluayA9ICJpZGVudGl0eSIsIHNpZ21hLmxpbmsgPSAiaWRlbnRpdHkiKSwgZGF0YSA9IGlvX2NvbXBsZXRlLCB3ZWlnaHRzID0gd2VpZ2h0dmVjKQ0KICANCiAgaW9fbGlzdF9wcmVkc1tbaV1dIDwtIGlvX2ZpdA0KfSANCg0Kc3VtbWFyeShpb19saXN0X3ByZWRzW1sxXV0pIA0KDQpzYXZlKGlvX2xpc3RfcHJlZHMsIGZpbGU9Ii4vZGF0YS9maW5hbF9kYXRhL3JlZ3Jlc3Npb25fb3V0cHV0cy9pb19saXN0X3ByZWRzX3dfbmV3LlJEYXRhIikNCg0KI05vdyB0aGUgbGFzdCBtb2RlbCB3aXRoIGludGVyYWN0aW9uIG9mIHRpbWUgb24gcHJlZGljdG9yIHZhcmlhYmxlcw0KaW9fY29tcGxldGUkYWdlX3RpbWUgPC0gaW9fY29tcGxldGUkYWdlICogaW9fY29tcGxldGUkdGltZQ0KaW9fY29tcGxldGUkc2V4X3RpbWUgPC0gYXMubnVtZXJpYyhpb19jb21wbGV0ZSRzZXgpICogaW9fY29tcGxldGUkdGltZQ0KaW9fY29tcGxldGUgPC0gZmFzdER1bW1pZXM6OmR1bW15X2NvbHMoaW9fY29tcGxldGUsIHNlbGVjdF9jb2x1bW5zID0gImlzY2VkX2NhdCIpDQppb19jb21wbGV0ZSRpc2NlZF9iYXNpY190aW1lIDwtIGlvX2NvbXBsZXRlJGlzY2VkX2NhdF9CYXNpYyAqIGlvX2NvbXBsZXRlJHRpbWUNCmlvX2NvbXBsZXRlJGlzY2VkX2ludGVybWVkaWF0ZV90aW1lIDwtIGlvX2NvbXBsZXRlJGlzY2VkX2NhdF9JbnRlcm1lZGlhdGUgKiBpb19jb21wbGV0ZSR0aW1lDQppb19jb21wbGV0ZSRpc2NlZF9hZHZhbmNlZF90aW1lIDwtIGlvX2NvbXBsZXRlJGlzY2VkX2NhdF9BZHZhbmNlZCAqIGlvX2NvbXBsZXRlJHRpbWUNCg0KaW50ZXJhY3Rpb25zIDwtIGMoImFnZV90aW1lIiwgInNleF90aW1lIiwgImlzY2VkX2ludGVybWVkaWF0ZV90aW1lIiwgImlzY2VkX2FkdmFuY2VkX3RpbWUiKQ0KDQppb19saXN0X2ludGVyYWN0aW9ucyA8LSBsaXN0KCkNCg0KIGZvciAoaSBpbiAxOmxlbmd0aChkZXBzKSkgew0KICAjIFNwZWNpZnkgdGhlIHNpZ21hIGZvcm11bGENCiAgc2lnbWEuZm9ybXVsYSA8LSBhcy5mb3JtdWxhKHBhc3RlKCJ+IiwgcGFzdGUocHJlZGljdG9ycywgY29sbGFwc2UgPSAiICsgIiksICIgKyAiLCBwYXN0ZShpbnRlcmFjdGlvbnMsIGNvbGxhcHNlID0gIiArICIpKSkNCiAgIyBQZXJmb3JtIHRoZSBsaW5lYXIgcmVncmVzc2lvbg0KICBpb19maXQgPC0gZ2FtbHNzKGFzLmZvcm11bGEocGFzdGUoZGVwc1tpXSwgIn4iLCBwYXN0ZShwcmVkaWN0b3JzLCBjb2xsYXBzZSA9ICIgKyAiKSwgIiArICIsIHBhc3RlKGludGVyYWN0aW9ucywgY29sbGFwc2UgPSAiKyAiKSkpLCBzaWdtYS5mb3JtdWxhID0gc2lnbWEuZm9ybXVsYSwiICsgIiwgZmFtaWx5PU5PKG11LmxpbmsgPSAiaWRlbnRpdHkiLCBzaWdtYS5saW5rID0gImlkZW50aXR5IiksIGRhdGEgPSBpb19jb21wbGV0ZSwgd2VpZ2h0cyA9IHdlaWdodHZlYykNCiAgDQogIGlvX2xpc3RfaW50ZXJhY3Rpb25zW1tpXV0gPC0gaW9fZml0DQp9IA0KDQoNCnN1bW1hcnkoaW9fbGlzdF9pbnRlcmFjdGlvbnNbWzFdXSkgDQoNCnNhdmUoaW9fbGlzdF9pbnRlcmFjdGlvbnMsIGZpbGU9Ii4vZGF0YS9maW5hbF9kYXRhL3JlZ3Jlc3Npb25fb3V0cHV0cy9pb19saXN0X2ludGVyYWN0aW9uc193X25ldy5SRGF0YSIpDQoNCmBgYA0KDQojIyBJU1NQIHstfQ0KDQpgYGB7cn0NCmxvYWQoIi4vZGF0YS9maW5hbF9kYXRhL2lzc3B0b3RhbC5SZGF0YSIpDQppc3NwdG90YWwkc3VydmV5eWVhcltpcy5uYShpc3NwdG90YWwkc3VydmV5eWVhcildIDwtICIyMDEwIg0KaXNzcHRvdGFsJHN1cnZleXllYXIgPC0gYXMubnVtZXJpYyhpc3NwdG90YWwkc3VydmV5eWVhcikNCg0KIyBUaGUgaXNzcCBoYXMgdmFyaWFibGVzIHRoYXQgYXJlIGFza2VkIGluIGFsbCB0aHJlZSB3YXZlcywgYW5kIHZhcmlhYmxlcyB0aGF0IGFyZSBhc2tlZCBvbmx5IGluIDIgd2F2ZXMuIFNvIEkgaGF2ZSB0byBydW4gdGhlIGNvZGUgb24gc3Vic2V0cyBvZiB0aGUgZGF0YS4gRmlyc3QgSSBlc3RpbWF0ZSB0aGUgbW9kZWxzIGZvciB0aGUgc3RhdGVtZW50cyB0aGF0IGFyZSBhc2tlZCB0aHJvdWdob3V0IHRoZSB0aHJlZSB3YXZlcw0KaXNzcF9jb21wbGV0ZSA8LSBpc3NwdG90YWwgJT4lIGRwbHlyOjpzZWxlY3Qoc3VydmV5eWVhcjptYXJzdGF0LCB3ZWlnaHR2ZWMsIGlzY2VkX2NhdCkNCmlzc3BfY29tcGxldGUgPC0gaXNzcF9jb21wbGV0ZSAlPiUgZHJvcF9uYSgpDQppc3NwX2NvbXBsZXRlJHRpbWUgPC0gaXNzcF9jb21wbGV0ZSRzdXJ2ZXl5ZWFyIC0gbWluKGlzc3BfY29tcGxldGUkc3VydmV5eWVhcikNCg0KIyBUaW1lLW9ubHkNCnByZWRpY3RvcnMgPC0gYygidGltZSIpDQpkZXBzIDwtIGMoIndvcnJ5IiwgImxpZmVoYXJtIiwgIndpbGxpbmdfcHJpY2UiLCAid2lsbGluZ190YXgiLCAid2lsbGluZ19saXZpbmciLCAiZG9fcmlnaHQiLCAicHJvZ2hhcm0iLCAiZWNvbnByb3RlY3QiLCAicGVvcGxlX2RlY2lkZSIpDQoNCmlzc3BfbGlzdF9lbXB0eSA8LSBsaXN0KCkNCg0KIyBMb29wIHRocm91Z2ggZWFjaCBkZXBlbmRlbnQgdmFyaWFibGUNCiAgZm9yIChpIGluIDE6bGVuZ3RoKGRlcHMpKSB7DQogICMgU3BlY2lmeSB0aGUgc2lnbWEgZm9ybXVsYQ0KICBzaWdtYS5mb3JtdWxhIDwtIGFzLmZvcm11bGEocGFzdGUoIn4iLCBwYXN0ZShwcmVkaWN0b3JzLCBjb2xsYXBzZSA9ICIgKyAiKSkpDQogICMgUGVyZm9ybSB0aGUgbGluZWFyIHJlZ3Jlc3Npb24NCiAgaXNzcF9maXQgPC0gZ2FtbHNzKGFzLmZvcm11bGEocGFzdGUoZGVwc1tpXSwgIn4iLCBwYXN0ZShwcmVkaWN0b3JzLCBjb2xsYXBzZSA9ICIgKyAiKSkpLCBzaWdtYS5mb3JtdWxhID0gc2lnbWEuZm9ybXVsYSwNCiAgICAgICAgICAgICAgICAgICAgIGZhbWlseT1OTyhtdS5saW5rID0gImlkZW50aXR5Iiwgc2lnbWEubGluayA9ICJpZGVudGl0eSIpLCBkYXRhID0gaXNzcF9jb21wbGV0ZSwgd2VpZ2h0cyA9IHdlaWdodHZlYykNCiAgDQogIGlzc3BfbGlzdF9lbXB0eVtbaV1dIDwtIGlzc3BfZml0DQp9IA0KDQpzdW1tYXJ5KGlzc3BfbGlzdF9lbXB0eVtbMV1dKSANCnN1bW1hcnkoaXNzcF9saXN0X2VtcHR5W1syXV0pIA0Kc3VtbWFyeShpc3NwX2xpc3RfZW1wdHlbWzNdXSkgDQogDQpzYXZlKGlzc3BfbGlzdF9lbXB0eSwgZmlsZT0iLi9kYXRhL2ZpbmFsX2RhdGEvcmVncmVzc2lvbl9vdXRwdXRzL2lzc3BfbGlzdF9lbXB0eV93LlJEYXRhIikNCg0KIyBOb3cgd2l0aCBwcmVkaWN0b3JzDQpwcmVkaWN0b3JzIDwtIGMoInRpbWUiLCAic2V4IiwgImlzY2VkX2NhdCIsICJhZ2UiKQ0KZGVwcyA8LSBjKCJ3b3JyeSIsICJsaWZlaGFybSIsICJ3aWxsaW5nX3ByaWNlIiwgIndpbGxpbmdfdGF4IiwgIndpbGxpbmdfbGl2aW5nIiwgImRvX3JpZ2h0IiwgInByb2doYXJtIiwgImVjb25wcm90ZWN0IiwgInBlb3BsZV9kZWNpZGUiICkNCg0KaXNzcF9saXN0X3ByZWRzIDwtIGxpc3QoKQ0KDQojIExvb3AgdGhyb3VnaCBlYWNoIGRlcGVuZGVudCB2YXJpYWJsZQ0KICBmb3IgKGkgaW4gMTpsZW5ndGgoZGVwcykpIHsNCiAgIyBTcGVjaWZ5IHRoZSBzaWdtYSBmb3JtdWxhDQogIHNpZ21hLmZvcm11bGEgPC0gYXMuZm9ybXVsYShwYXN0ZSgifiIsIHBhc3RlKHByZWRpY3RvcnMsIGNvbGxhcHNlID0gIiArICIpKSkNCiAgIyBQZXJmb3JtIHRoZSBsaW5lYXIgcmVncmVzc2lvbg0KICBpc3NwX2ZpdCA8LSBnYW1sc3MoYXMuZm9ybXVsYShwYXN0ZShkZXBzW2ldLCAifiIsIHBhc3RlKHByZWRpY3RvcnMsIGNvbGxhcHNlID0gIiArICIpKSksIHNpZ21hLmZvcm11bGEgPSBzaWdtYS5mb3JtdWxhLA0KICAgICAgICAgICAgICAgICAgICAgIGZhbWlseT1OTyhtdS5saW5rID0gImlkZW50aXR5Iiwgc2lnbWEubGluayA9ICJpZGVudGl0eSIpLCBkYXRhID0gaXNzcF9jb21wbGV0ZSwgd2VpZ2h0cyA9IHdlaWdodHZlYykNCiAgDQogIGlzc3BfbGlzdF9wcmVkc1tbaV1dIDwtIGlzc3BfZml0DQp9IA0KDQpzdW1tYXJ5KGlzc3BfbGlzdF9wcmVkc1tbOV1dKSANCg0Kc2F2ZShpc3NwX2xpc3RfcHJlZHMsIGZpbGU9Ii4vZGF0YS9maW5hbF9kYXRhL3JlZ3Jlc3Npb25fb3V0cHV0cy9pc3NwX2xpc3RfcHJlZHNfd19uZXcuUkRhdGEiKQ0KDQojIEFuZCBub3cgaW50ZXJhY3Rpb25zDQppc3NwX2NvbXBsZXRlJGFnZV90aW1lIDwtIGlzc3BfY29tcGxldGUkYWdlICogaXNzcF9jb21wbGV0ZSR0aW1lDQppc3NwX2NvbXBsZXRlJHNleF90aW1lIDwtIGFzLm51bWVyaWMoaXNzcF9jb21wbGV0ZSRzZXgpICogaXNzcF9jb21wbGV0ZSR0aW1lDQppc3NwX2NvbXBsZXRlIDwtIGZhc3REdW1taWVzOjpkdW1teV9jb2xzKGlzc3BfY29tcGxldGUsIHNlbGVjdF9jb2x1bW5zID0gImlzY2VkX2NhdCIpDQppc3NwX2NvbXBsZXRlJGlzY2VkX2Jhc2ljX3RpbWUgPC0gaXNzcF9jb21wbGV0ZSRpc2NlZF9jYXRfQmFzaWMgKiBpc3NwX2NvbXBsZXRlJHRpbWUNCmlzc3BfY29tcGxldGUkaXNjZWRfaW50ZXJtZWRpYXRlX3RpbWUgPC0gaXNzcF9jb21wbGV0ZSRpc2NlZF9jYXRfSW50ZXJtZWRpYXRlICogaXNzcF9jb21wbGV0ZSR0aW1lDQppc3NwX2NvbXBsZXRlJGlzY2VkX2FkdmFuY2VkX3RpbWUgPC0gaXNzcF9jb21wbGV0ZSRpc2NlZF9jYXRfQWR2YW5jZWQgKiBpc3NwX2NvbXBsZXRlJHRpbWUNCg0KaW50ZXJhY3Rpb25zIDwtIGMoImFnZV90aW1lIiwgInNleF90aW1lIiwgImlzY2VkX2ludGVybWVkaWF0ZV90aW1lIiwgImlzY2VkX2FkdmFuY2VkX3RpbWUiKQ0KDQppc3NwX2xpc3RfaW50ZXJhY3Rpb25zIDwtIGxpc3QoKQ0KDQogZm9yIChpIGluIDE6bGVuZ3RoKGRlcHMpKSB7DQogICMgU3BlY2lmeSB0aGUgc2lnbWEgZm9ybXVsYQ0KICBzaWdtYS5mb3JtdWxhIDwtIGFzLmZvcm11bGEocGFzdGUoIn4iLCBwYXN0ZShwcmVkaWN0b3JzLCBjb2xsYXBzZSA9ICIgKyAiKSwgIiArICIsIHBhc3RlKGludGVyYWN0aW9ucywgY29sbGFwc2UgPSAiICsgIikpKQ0KICAjIFBlcmZvcm0gdGhlIGxpbmVhciByZWdyZXNzaXNzcG4NCiAgaXNzcF9maXQgPC0gZ2FtbHNzKGFzLmZvcm11bGEocGFzdGUoZGVwc1tpXSwgIn4iLCBwYXN0ZShwcmVkaWN0b3JzLCBjb2xsYXBzZSA9ICIgKyAiKSwgIiArICIsIHBhc3RlKGludGVyYWN0aW9ucywgY29sbGFwc2UgPSAiKyAiKSkpLCBzaWdtYS5mb3JtdWxhID0gc2lnbWEuZm9ybXVsYSwiICsgIiwgZmFtaWx5PU5PKG11LmxpbmsgPSAiaWRlbnRpdHkiLCBzaWdtYS5saW5rID0gImlkZW50aXR5IiksIGRhdGEgPSBpc3NwX2NvbXBsZXRlLCB3ZWlnaHRzID0gd2VpZ2h0dmVjKQ0KICANCiAgaXNzcF9saXN0X2ludGVyYWN0aW9uc1tbaV1dIDwtIGlzc3BfZml0DQp9IA0KDQpzdW1tYXJ5KGlzc3BfbGlzdF9pbnRlcmFjdGlvbnNbWzFdXSkgDQoNCnNhdmUoaXNzcF9saXN0X2ludGVyYWN0aW9ucywgZmlsZT0iLi9kYXRhL2ZpbmFsX2RhdGEvcmVncmVzc2lvbl9vdXRwdXRzL2lzc3BfbGlzdF9pbnRlcmFjdGlvbnNfd19uZXcuUkRhdGEiKQ0KDQojIE5vdyB0aGUgdmFyaWFibGVzIHRoYXQgYXJlIG9ubHkgYXNrZWQgdHdpY2UNCmlzc3BfY29tcGxldGUgPC0gaXNzcHRvdGFsICU+JSBkcGx5cjo6c2VsZWN0KHN1cnZleXllYXIsIGlzY2VkOmdyb3doYXJtLCB3ZWlnaHR2ZWMsIGlzY2VkX2NhdCkNCmlzc3BfY29tcGxldGUgPC0gaXNzcF9jb21wbGV0ZSAlPiUgZHJvcF9uYSgpDQppc3NwX2NvbXBsZXRlJHRpbWUgPC0gaXNzcF9jb21wbGV0ZSRzdXJ2ZXl5ZWFyIC0gbWluKGlzc3BfY29tcGxldGUkc3VydmV5eWVhcikNCg0KIyBUaW1lLW9ubHkgbW9kZWwNCnByZWRpY3RvcnMgPC0gYygidGltZSIpDQpkZXBzIDwtIGMoImV4YWciLCAibW9yZWltcCIsICJvdGhlcnNhbWUiLCAiY291bnRyeV9lZmZvcnQiLCAiZ3Jvd2hhcm0iKQ0KDQppc3NwX2xpc3RfZW1wdHlfMl93YXZlcyA8LSBsaXN0KCkNCg0KIyBMb29wIHRocm91Z2ggZWFjaCBkZXBlbmRlbnQgdmFyaWFibGUNCiAgZm9yIChpIGluIDE6bGVuZ3RoKGRlcHMpKSB7DQogICMgU3BlY2lmeSB0aGUgc2lnbWEgZm9ybXVsYQ0KICBzaWdtYS5mb3JtdWxhIDwtIGFzLmZvcm11bGEocGFzdGUoIn4iLCBwYXN0ZShwcmVkaWN0b3JzLCBjb2xsYXBzZSA9ICIgKyAiKSkpDQogICMgUGVyZm9ybSB0aGUgbGluZWFyIHJlZ3Jlc3Npb24NCiAgaXNzcF9maXQgPC0gZ2FtbHNzKGFzLmZvcm11bGEocGFzdGUoZGVwc1tpXSwgIn4iLCBwYXN0ZShwcmVkaWN0b3JzLCBjb2xsYXBzZSA9ICIgKyAiKSkpLCBzaWdtYS5mb3JtdWxhID0gc2lnbWEuZm9ybXVsYSwgZmFtaWx5PU5PKG11LmxpbmsgPSAiaWRlbnRpdHkiLCBzaWdtYS5saW5rID0gImlkZW50aXR5IiksIGRhdGEgPSBpc3NwX2NvbXBsZXRlLCB3ZWlnaHRzID0gd2VpZ2h0dmVjKQ0KICANCiAgaXNzcF9saXN0X2VtcHR5XzJfd2F2ZXNbW2ldXSA8LSBpc3NwX2ZpdA0KICB9IA0KDQpzdW1tYXJ5KGlzc3BfbGlzdF9lbXB0eV8yX3dhdmVzW1sxXV0pIA0Kc3VtbWFyeShpc3NwX2xpc3RfZW1wdHlfMl93YXZlc1tbMl1dKQ0Kc3VtbWFyeShpc3NwX2xpc3RfZW1wdHlfMl93YXZlc1tbM11dKSANCg0Kc2F2ZShpc3NwX2xpc3RfZW1wdHlfMl93YXZlcywgZmlsZT0iLi9kYXRhL2ZpbmFsX2RhdGEvcmVncmVzc2lvbl9vdXRwdXRzL2lzc3BfbGlzdF9lbXB0eV8yX3dhdmVzX3cuUkRhdGEiKQ0KDQojIEFuZCB0aGUgbW9kZWwgd2l0aCB0aGUgcHJlZGljdG9ycw0KcHJlZGljdG9ycyA8LSBjKCJ0aW1lIiwgInNleCIsICJpc2NlZF9jYXQiLCAiYWdlIikNCmRlcHMgPC0gYygiZXhhZyIsICJtb3JlaW1wIiwgIm90aGVyc2FtZSIsICJjb3VudHJ5X2VmZm9ydCIsICJncm93aGFybSIpDQoNCmlzc3BfbGlzdF9wcmVkc18yX3dhdmVzIDwtIGxpc3QoKQ0KDQojIExvb3AgdGhyb3VnaCBlYWNoIGRlcGVuZGVudCB2YXJpYWJsZQ0KICBmb3IgKGkgaW4gMTpsZW5ndGgoZGVwcykpIHsNCiAgIyBTcGVjaWZ5IHRoZSBzaWdtYSBmb3JtdWxhDQogIHNpZ21hLmZvcm11bGEgPC0gYXMuZm9ybXVsYShwYXN0ZSgifiIsIHBhc3RlKHByZWRpY3RvcnMsIGNvbGxhcHNlID0gIiArICIpKSkNCiAgIyBQZXJmb3JtIHRoZSBsaW5lYXIgcmVncmVzc2lvbg0KICBpc3NwX2ZpdCA8LSBnYW1sc3MoYXMuZm9ybXVsYShwYXN0ZShkZXBzW2ldLCAifiIsIHBhc3RlKHByZWRpY3RvcnMsIGNvbGxhcHNlID0gIiArICIpKSksIHNpZ21hLmZvcm11bGEgPSBzaWdtYS5mb3JtdWxhLCBmYW1pbHk9Tk8obXUubGluayA9ICJpZGVudGl0eSIsIHNpZ21hLmxpbmsgPSAiaWRlbnRpdHkiKSwgZGF0YSA9IGlzc3BfY29tcGxldGUsIHdlaWdodHMgPSB3ZWlnaHR2ZWMpDQogIA0KICBpc3NwX2xpc3RfcHJlZHNfMl93YXZlc1tbaV1dIDwtIGlzc3BfZml0DQp9IA0KDQpzdW1tYXJ5KGlzc3BfbGlzdF9wcmVkc18yX3dhdmVzW1sxXV0pIA0KDQpzYXZlKGlzc3BfbGlzdF9wcmVkc18yX3dhdmVzLCBmaWxlPSIuL2RhdGEvZmluYWxfZGF0YS9yZWdyZXNzaW9uX291dHB1dHMvaXNzcF9saXN0X3ByZWRzXzJfd2F2ZXNfd19uZXcuUkRhdGEiKQ0KDQojIEFuZCBsYXN0bHksIGFnYWluIHRoZSBpbnRlcmFjdGlvbnMNCmlzc3BfY29tcGxldGUkYWdlX3RpbWUgPC0gaXNzcF9jb21wbGV0ZSRhZ2UgKiBpc3NwX2NvbXBsZXRlJHRpbWUNCmlzc3BfY29tcGxldGUkc2V4X3RpbWUgPC0gYXMubnVtZXJpYyhpc3NwX2NvbXBsZXRlJHNleCkgKiBpc3NwX2NvbXBsZXRlJHRpbWUNCmlzc3BfY29tcGxldGUgPC0gZmFzdER1bW1pZXM6OmR1bW15X2NvbHMoaXNzcF9jb21wbGV0ZSwgc2VsZWN0X2NvbHVtbnMgPSAiaXNjZWRfY2F0IikNCmlzc3BfY29tcGxldGUkaXNjZWRfYmFzaWNfdGltZSA8LSBpc3NwX2NvbXBsZXRlJGlzY2VkX2NhdF9CYXNpYyAqIGlzc3BfY29tcGxldGUkdGltZQ0KaXNzcF9jb21wbGV0ZSRpc2NlZF9pbnRlcm1lZGlhdGVfdGltZSA8LSBpc3NwX2NvbXBsZXRlJGlzY2VkX2NhdF9JbnRlcm1lZGlhdGUgKiBpc3NwX2NvbXBsZXRlJHRpbWUNCmlzc3BfY29tcGxldGUkaXNjZWRfYWR2YW5jZWRfdGltZSA8LSBpc3NwX2NvbXBsZXRlJGlzY2VkX2NhdF9BZHZhbmNlZCAqIGlzc3BfY29tcGxldGUkdGltZQ0KDQppbnRlcmFjdGlvbnMgPC0gYygiYWdlX3RpbWUiLCAic2V4X3RpbWUiLCAiaXNjZWRfaW50ZXJtZWRpYXRlX3RpbWUiLCAiaXNjZWRfYWR2YW5jZWRfdGltZSIpDQoNCmlzc3BfbGlzdF9pbnRlcmFjdGlvbnNfMl93YXZlcyA8LSBsaXN0KCkNCg0KIGZvciAoaSBpbiAxOmxlbmd0aChkZXBzKSkgew0KICAjIFNwZWNpZnkgdGhlIHNpZ21hIGZvcm11bGENCiAgc2lnbWEuZm9ybXVsYSA8LSBhcy5mb3JtdWxhKHBhc3RlKCJ+IiwgcGFzdGUocHJlZGljdG9ycywgY29sbGFwc2UgPSAiICsgIiksICIgKyAiLCBwYXN0ZShpbnRlcmFjdGlvbnMsIGNvbGxhcHNlID0gIiArICIpKSkNCiAgIyBQZXJmb3JtIHRoZSBsaW5lYXIgcmVncmVzc2lzc3BuDQogIGlzc3BfZml0IDwtIGdhbWxzcyhhcy5mb3JtdWxhKHBhc3RlKGRlcHNbaV0sICJ+IiwgcGFzdGUocHJlZGljdG9ycywgY29sbGFwc2UgPSAiICsgIiksICIgKyAiLCBwYXN0ZShpbnRlcmFjdGlvbnMsIGNvbGxhcHNlID0gIisgIikpKSwgc2lnbWEuZm9ybXVsYSA9IHNpZ21hLmZvcm11bGEsIiArICIsIGZhbWlseT1OTyhtdS5saW5rID0gImlkZW50aXR5Iiwgc2lnbWEubGluayA9ICJpZGVudGl0eSIpLCBkYXRhID0gaXNzcF9jb21wbGV0ZSwgd2VpZ2h0cyA9IHdlaWdodHZlYykNCiAgDQogIGlzc3BfbGlzdF9pbnRlcmFjdGlvbnNfMl93YXZlc1tbaV1dIDwtIGlzc3BfZml0DQp9IA0KDQpzdW1tYXJ5KGlzc3BfbGlzdF9pbnRlcmFjdGlvbnNfMl93YXZlc1tbMV1dKSANCg0Kc2F2ZShpc3NwX2xpc3RfaW50ZXJhY3Rpb25zXzJfd2F2ZXMsIGZpbGU9Ii4vZGF0YS9maW5hbF9kYXRhL3JlZ3Jlc3Npb25fb3V0cHV0cy9pc3NwX2xpc3RfaW50ZXJhY3Rpb25zXzJfd2F2ZXNfd19uZXcuUkRhdGEiKQ0KYGBgDQoNCiMjIEVCIHstfQ0KDQpgYGB7cn0NCiMgTm93IHRoZSBtb3N0IGRpZmZpY3VsdCBvbmU6IEV1cm9iYXJvbWV0ZXIuIE5vIGl0ZW1zIGFyZSBhc2tlZCBzdGVhZGlseSB0aHJvdWdob3V0IHRpbWUsIHNvIGhhdmUgdG8gd29yayB3aXRoIGEgbG90IG9mIHN1YnNldHMuIA0KbG9hZCgiLi9kYXRhL2ZpbmFsX2RhdGEvZWJfdG90LlJkYXRhIikNCg0KIyBmaXJzdCAxOTg2IC0gMTk5NQ0KZWJfY29tcGxldGUgPC0gZWJfdG90ICU+JSBkcGx5cjo6c2VsZWN0KHN1cnZleXllYXIsIGVudl9lY19zdGF0LCBlbnZfcHJzaW1wLCBzZXgsIGlzY2VkOiB1cmJhbiwgd2VpZ2h0dmVjLCBpc2NlZF9jYXQpDQojIFJlbGlnaW9uIGlzIG9ubHkgYXNrZWQgaW4gb25lIHdhdmUNCmViX2NvbXBsZXRlIDwtIGViX2NvbXBsZXRlICU+JSBkcm9wX25hKCkNCmViX2NvbXBsZXRlJHRpbWUgPC0gZWJfY29tcGxldGUkc3VydmV5eWVhciAtIG1pbihlYl9jb21wbGV0ZSRzdXJ2ZXl5ZWFyKQ0KDQojIEZpcnN0IGVtcHR5IG1vZGVsIA0KcHJlZGljdG9ycyA8LSBjKCJ0aW1lIikNCmRlcHMgPC0gYygiZW52X2VjX3N0YXQiLCAiZW52X3Byc2ltcCIpDQoNCmViX2xpc3RfZW1wdHlfMTk4NiA8LSBsaXN0KCkNCg0KIyBMb29wIHRocm91Z2ggZWFjaCBkZXBlbmRlbnQgdmFyaWFibGUNCiAgZm9yIChpIGluIDE6bGVuZ3RoKGRlcHMpKSB7DQogICMgU3BlY2lmeSB0aGUgc2lnbWEgZm9ybXVsYQ0KICBzaWdtYS5mb3JtdWxhIDwtIGFzLmZvcm11bGEocGFzdGUoIn4iLCBwYXN0ZShwcmVkaWN0b3JzLCBjb2xsYXBzZSA9ICIgKyAiKSkpDQogICMgUGVyZm9ybSB0aGUgbGluZWFyIHJlZ3Jlc3Npb24NCiAgZWJfZml0IDwtIGdhbWxzcyhhcy5mb3JtdWxhKHBhc3RlKGRlcHNbaV0sICJ+IiwgcGFzdGUocHJlZGljdG9ycywgY29sbGFwc2UgPSAiICsgIikpKSwgc2lnbWEuZm9ybXVsYSA9IHNpZ21hLmZvcm11bGEsDQogICAgICAgICAgICAgICAgICAgZmFtaWx5PU5PKG11LmxpbmsgPSAiaWRlbnRpdHkiLCBzaWdtYS5saW5rID0gImlkZW50aXR5IiksIGRhdGEgPSBlYl9jb21wbGV0ZSwgd2VpZ2h0cyA9IHdlaWdodHZlYykNCiAgDQogIGViX2xpc3RfZW1wdHlfMTk4NltbaV1dIDwtIGViX2ZpdA0KfSANCg0Kc3VtbWFyeShlYl9saXN0X2VtcHR5XzE5ODZbWzFdXSkgDQpzdW1tYXJ5KGViX2xpc3RfZW1wdHlfMTk4NltbMl1dKQ0KDQpzYXZlKGViX2xpc3RfZW1wdHlfMTk4NiwgZmlsZT0iLi9kYXRhL2ZpbmFsX2RhdGEvcmVncmVzc2lvbl9vdXRwdXRzL2ViX2xpc3RfZW1wdHlfMTk4Nl93LlJEYXRhIikNCg0KIyBNb2RlbCB3aXRoIHByZWRpY3RvcnMNCnByZWRpY3RvcnMgPC0gYygidGltZSIsICJzZXgiLCAiaXNjZWRfY2F0IiwgImFnZSIpDQpkZXBzIDwtIGMoImVudl9lY19zdGF0IiwgImVudl9wcnNpbXAiKQ0KDQplYl9saXN0X3ByZWRzXzE5ODYgPC0gbGlzdCgpDQoNCiMgTG9vcCB0aHJvdWdoIGVhY2ggZGVwZW5kZW50IHZhcmlhYmxlDQogIGZvciAoaSBpbiAxOmxlbmd0aChkZXBzKSkgew0KICAjIFNwZWNpZnkgdGhlIHNpZ21hIGZvcm11bGENCiAgc2lnbWEuZm9ybXVsYSA8LSBhcy5mb3JtdWxhKHBhc3RlKCJ+IiwgcGFzdGUocHJlZGljdG9ycywgY29sbGFwc2UgPSAiICsgIikpKQ0KICAjIFBlcmZvcm0gdGhlIGxpbmVhciByZWdyZXNzaW9uDQogIGViX2ZpdCA8LSBnYW1sc3MoYXMuZm9ybXVsYShwYXN0ZShkZXBzW2ldLCAifiIsIHBhc3RlKHByZWRpY3RvcnMsIGNvbGxhcHNlID0gIiArICIpKSksIHNpZ21hLmZvcm11bGEgPSBzaWdtYS5mb3JtdWxhLA0KICAgICAgICAgICAgICAgICAgIGZhbWlseT1OTyhtdS5saW5rID0gImlkZW50aXR5Iiwgc2lnbWEubGluayA9ICJpZGVudGl0eSIpLCBkYXRhID0gZWJfY29tcGxldGUsIHdlaWdodHMgPSB3ZWlnaHR2ZWMpDQogIA0KICBlYl9saXN0X3ByZWRzXzE5ODZbW2ldXSA8LSBlYl9maXQNCn0gDQoNCnN1bW1hcnkoZWJfbGlzdF9wcmVkc18xOTg2W1sxXV0pIA0Kc3VtbWFyeShlYl9saXN0X3ByZWRzXzE5ODZbWzJdXSkNCg0Kc2F2ZShlYl9saXN0X3ByZWRzXzE5ODYsIGZpbGU9Ii4vZGF0YS9maW5hbF9kYXRhL3JlZ3Jlc3Npb25fb3V0cHV0cy9lYl9saXN0X3ByZWRzXzE5ODZfd19uZXcuUkRhdGEiKQ0KDQojIEFuZCB0aGUgbW9kZWwgd2l0aCBpbnRlcmFjdGlvbnMNCmViX2NvbXBsZXRlJGFnZV90aW1lIDwtIGViX2NvbXBsZXRlJGFnZSAqIGViX2NvbXBsZXRlJHRpbWUNCmViX2NvbXBsZXRlJHNleF90aW1lIDwtIGFzLm51bWVyaWMoZWJfY29tcGxldGUkc2V4KSAqIGViX2NvbXBsZXRlJHRpbWUNCmViX2NvbXBsZXRlIDwtIGZhc3REdW1taWVzOjpkdW1teV9jb2xzKGViX2NvbXBsZXRlLCBzZWxlY3RfY29sdW1ucyA9ICJpc2NlZF9jYXQiKQ0KZWJfY29tcGxldGUkaXNjZWRfYmFzaWNfdGltZSA8LSBlYl9jb21wbGV0ZSRpc2NlZF9jYXRfQmFzaWMgKiBlYl9jb21wbGV0ZSR0aW1lDQplYl9jb21wbGV0ZSRpc2NlZF9pbnRlcm1lZGlhdGVfdGltZSA8LSBlYl9jb21wbGV0ZSRpc2NlZF9jYXRfSW50ZXJtZWRpYXRlICogZWJfY29tcGxldGUkdGltZQ0KZWJfY29tcGxldGUkaXNjZWRfYWR2YW5jZWRfdGltZSA8LSBlYl9jb21wbGV0ZSRpc2NlZF9jYXRfQWR2YW5jZWQgKiBlYl9jb21wbGV0ZSR0aW1lDQoNCmludGVyYWN0aW9ucyA8LSBjKCJhZ2VfdGltZSIsICJzZXhfdGltZSIsICJpc2NlZF9pbnRlcm1lZGlhdGVfdGltZSIsICJpc2NlZF9hZHZhbmNlZF90aW1lIikNCg0KZWJfbGlzdF9pbnRlcmFjdGlvbnNfMTk4NiA8LSBsaXN0KCkNCg0KIGZvciAoaSBpbiAxOmxlbmd0aChkZXBzKSkgew0KICAjIFNwZWNpZnkgdGhlIHNpZ21hIGZvcm11bGENCiAgc2lnbWEuZm9ybXVsYSA8LSBhcy5mb3JtdWxhKHBhc3RlKCJ+IiwgcGFzdGUocHJlZGljdG9ycywgY29sbGFwc2UgPSAiICsgIiksICIgKyAiLCBwYXN0ZShpbnRlcmFjdGlvbnMsIGNvbGxhcHNlID0gIiArICIpKSkNCiAgIyBQZXJmb3JtIHRoZSBsaW5lYXIgcmVncmVzc2lvbg0KICBlYl9maXQgPC0gZ2FtbHNzKGFzLmZvcm11bGEocGFzdGUoZGVwc1tpXSwgIn4iLCBwYXN0ZShwcmVkaWN0b3JzLCBjb2xsYXBzZSA9ICIgKyAiKSwgIiArICIsIHBhc3RlKGludGVyYWN0aW9ucywgY29sbGFwc2UgPSAiKyAiKSkpLCBzaWdtYS5mb3JtdWxhID0gc2lnbWEuZm9ybXVsYSwiICsgIiwgZmFtaWx5PU5PKG11LmxpbmsgPSAiaWRlbnRpdHkiLCBzaWdtYS5saW5rID0gImlkZW50aXR5IiksIGRhdGEgPSBlYl9jb21wbGV0ZSwgd2VpZ2h0cyA9IHdlaWdodHZlYykNCiAgDQogIGViX2xpc3RfaW50ZXJhY3Rpb25zXzE5ODZbW2ldXSA8LSBlYl9maXQNCn0gDQoNCnN1bW1hcnkoZWJfbGlzdF9pbnRlcmFjdGlvbnNfMTk4NltbMV1dKSANCnN1bW1hcnkoZWJfbGlzdF9pbnRlcmFjdGlvbnNfMTk4NltbMl1dKQ0KDQpzYXZlKGViX2xpc3RfaW50ZXJhY3Rpb25zXzE5ODYsIGZpbGU9Ii4vZGF0YS9maW5hbF9kYXRhL3JlZ3Jlc3Npb25fb3V0cHV0cy9lYl9saXN0X2ludGVyYWN0aW9uc18xOTg2X3dfbmV3LlJEYXRhIikNCmBgYA0KDQpgYGB7cn0NCiMgTm93IHdpdGggdGhlIGluZmx1ZW5jZSBvZiBlbnZpcm9ubWVudCBvbiBxdWFsaXR5IG9mIGxpZmUNCmViX2NvbXBsZXRlIDwtIGViX3RvdCAlPiUgZHBseXI6OnNlbGVjdChzdXJ2ZXl5ZWFyLCBlbnZfcXVhbGxpZmUsIHNleCwgaXNjZWQsIHVyYmFuLCBhZ2UsIHdlaWdodHZlYywgaXNjZWRfY2F0KQ0KIyBMcnBsYWNlIGFuZCBpbmNvbWUgYXJlIG5vdCBhc2tlZCBpbiBhbGwgd2F2ZXMNCmViX2NvbXBsZXRlIDwtIGViX2NvbXBsZXRlICU+JSBkcm9wX25hKCkNCmViX2NvbXBsZXRlJHRpbWUgPC0gZWJfY29tcGxldGUkc3VydmV5eWVhciAtIG1pbihlYl9jb21wbGV0ZSRzdXJ2ZXl5ZWFyKQ0KDQojIEZpcnN0IGVtcHR5IG1vZGVsIA0KcHJlZGljdG9ycyA8LSBjKCJ0aW1lIikNCmRlcHMgPC0gYygiZW52X3F1YWxsaWZlIikNCg0KZWJfbGlzdF9lbXB0eV9xdWFsbGlmZSA8LSBsaXN0KCkNCg0KIyBMb29wIHRocm91Z2ggZWFjaCBkZXBlbmRlbnQgdmFyaWFibGUNCiAgZm9yIChpIGluIDE6bGVuZ3RoKGRlcHMpKSB7DQogICMgU3BlY2lmeSB0aGUgc2lnbWEgZm9ybXVsYQ0KICBzaWdtYS5mb3JtdWxhIDwtIGFzLmZvcm11bGEocGFzdGUoIn4iLCBwYXN0ZShwcmVkaWN0b3JzLCBjb2xsYXBzZSA9ICIgKyAiKSkpDQogICMgUGVyZm9ybSB0aGUgbGluZWFyIHJlZ3Jlc3Npb24NCiAgZWJfZml0IDwtIGdhbWxzcyhhcy5mb3JtdWxhKHBhc3RlKGRlcHNbaV0sICJ+IiwgcGFzdGUocHJlZGljdG9ycywgY29sbGFwc2UgPSAiICsgIikpKSwgc2lnbWEuZm9ybXVsYSA9IHNpZ21hLmZvcm11bGEsIGZhbWlseT1OTyhtdS5saW5rID0gImlkZW50aXR5Iiwgc2lnbWEubGluayA9ICJpZGVudGl0eSIpLCBkYXRhID0gZWJfY29tcGxldGUsIHdlaWdodHMgPSB3ZWlnaHR2ZWMpDQogIA0KICBlYl9saXN0X2VtcHR5X3F1YWxsaWZlW1tpXV0gPC0gZWJfZml0DQp9IA0KDQpzdW1tYXJ5KGViX2xpc3RfZW1wdHlfcXVhbGxpZmVbWzFdXSkgDQoNCnNhdmUoZWJfbGlzdF9lbXB0eV9xdWFsbGlmZSwgZmlsZT0iLi9kYXRhL2ZpbmFsX2RhdGEvcmVncmVzc2lvbl9vdXRwdXRzL2ViX2xpc3RfZW1wdHlfcXVhbGxpZmVfdy5SRGF0YSIpDQoNCiMgTW9kZWwgd2l0aCBwcmVkaWN0b3JzDQpwcmVkaWN0b3JzIDwtIGMoInRpbWUiLCAic2V4IiwgImlzY2VkX2NhdCIsICJhZ2UiKQ0KZGVwcyA8LSBjKCJlbnZfcXVhbGxpZmUiKQ0KDQplYl9saXN0X3ByZWRzX3F1YWxsaWZlIDwtIGxpc3QoKQ0KDQojIExvb3AgdGhyb3VnaCBlYWNoIGRlcGVuZGVudCB2YXJpYWJsZQ0KICBmb3IgKGkgaW4gMTpsZW5ndGgoZGVwcykpIHsNCiAgIyBTcGVjaWZ5IHRoZSBzaWdtYSBmb3JtdWxhDQogIHNpZ21hLmZvcm11bGEgPC0gYXMuZm9ybXVsYShwYXN0ZSgifiIsIHBhc3RlKHByZWRpY3RvcnMsIGNvbGxhcHNlID0gIiArICIpKSkNCiAgIyBQZXJmb3JtIHRoZSBsaW5lYXIgcmVncmVzc2lvbg0KICBlYl9maXQgPC0gZ2FtbHNzKGFzLmZvcm11bGEocGFzdGUoZGVwc1tpXSwgIn4iLCBwYXN0ZShwcmVkaWN0b3JzLCBjb2xsYXBzZSA9ICIgKyAiKSkpLCBzaWdtYS5mb3JtdWxhID0gc2lnbWEuZm9ybXVsYSwNCiAgICAgICAgICAgICAgICAgICBmYW1pbHk9Tk8obXUubGluayA9ICJpZGVudGl0eSIsIHNpZ21hLmxpbmsgPSAiaWRlbnRpdHkiKSwgZGF0YSA9IGViX2NvbXBsZXRlLCB3ZWlnaHRzID0gd2VpZ2h0dmVjKQ0KICANCiAgZWJfbGlzdF9wcmVkc19xdWFsbGlmZVtbaV1dIDwtIGViX2ZpdA0KfSANCg0Kc3VtbWFyeShlYl9saXN0X3ByZWRzX3F1YWxsaWZlW1sxXV0pIA0KDQpzYXZlKGViX2xpc3RfcHJlZHNfcXVhbGxpZmUsIGZpbGU9Ii4vZGF0YS9maW5hbF9kYXRhL3JlZ3Jlc3Npb25fb3V0cHV0cy9lYl9saXN0X3ByZWRzX3F1YWxsaWZlX3dfbmV3LlJEYXRhIikNCg0KIyBBbmQgdGhlIG1vZGVsIHdpdGggaW50ZXJhY3Rpb25zDQplYl9jb21wbGV0ZSRhZ2VfdGltZSA8LSBlYl9jb21wbGV0ZSRhZ2UgKiBlYl9jb21wbGV0ZSR0aW1lDQplYl9jb21wbGV0ZSRzZXhfdGltZSA8LSBhcy5udW1lcmljKGViX2NvbXBsZXRlJHNleCkgKiBlYl9jb21wbGV0ZSR0aW1lDQplYl9jb21wbGV0ZSA8LSBmYXN0RHVtbWllczo6ZHVtbXlfY29scyhlYl9jb21wbGV0ZSwgc2VsZWN0X2NvbHVtbnMgPSAiaXNjZWRfY2F0IikNCmViX2NvbXBsZXRlJGlzY2VkX2Jhc2ljX3RpbWUgPC0gZWJfY29tcGxldGUkaXNjZWRfY2F0X0Jhc2ljICogZWJfY29tcGxldGUkdGltZQ0KZWJfY29tcGxldGUkaXNjZWRfaW50ZXJtZWRpYXRlX3RpbWUgPC0gZWJfY29tcGxldGUkaXNjZWRfY2F0X0ludGVybWVkaWF0ZSAqIGViX2NvbXBsZXRlJHRpbWUNCmViX2NvbXBsZXRlJGlzY2VkX2FkdmFuY2VkX3RpbWUgPC0gZWJfY29tcGxldGUkaXNjZWRfY2F0X0FkdmFuY2VkICogZWJfY29tcGxldGUkdGltZQ0KDQppbnRlcmFjdGlvbnMgPC0gYygiYWdlX3RpbWUiLCAic2V4X3RpbWUiLCAiaXNjZWRfaW50ZXJtZWRpYXRlX3RpbWUiLCAiaXNjZWRfYWR2YW5jZWRfdGltZSIpDQoNCmViX2xpc3RfaW50ZXJhY3Rpb25zX3F1YWxsaWZlIDwtIGxpc3QoKQ0KDQogZm9yIChpIGluIDE6bGVuZ3RoKGRlcHMpKSB7DQogICMgU3BlY2lmeSB0aGUgc2lnbWEgZm9ybXVsYQ0KICBzaWdtYS5mb3JtdWxhIDwtIGFzLmZvcm11bGEocGFzdGUoIn4iLCBwYXN0ZShwcmVkaWN0b3JzLCBjb2xsYXBzZSA9ICIgKyAiKSwgIiArICIsIHBhc3RlKGludGVyYWN0aW9ucywgY29sbGFwc2UgPSAiICsgIikpKQ0KICAjIFBlcmZvcm0gdGhlIGxpbmVhciByZWdyZXNzZWJuDQogIGViX2ZpdCA8LSBnYW1sc3MoYXMuZm9ybXVsYShwYXN0ZShkZXBzW2ldLCAifiIsIHBhc3RlKHByZWRpY3RvcnMsIGNvbGxhcHNlID0gIiArICIpLCAiICsgIiwgcGFzdGUoaW50ZXJhY3Rpb25zLCBjb2xsYXBzZSA9ICIrICIpKSksIHNpZ21hLmZvcm11bGEgPSBzaWdtYS5mb3JtdWxhLCIgKyAiLCBmYW1pbHk9Tk8obXUubGluayA9ICJpZGVudGl0eSIsIHNpZ21hLmxpbmsgPSAiaWRlbnRpdHkiKSwgZGF0YSA9IGViX2NvbXBsZXRlLCB3ZWlnaHRzID0gd2VpZ2h0dmVjKQ0KICANCiAgZWJfbGlzdF9pbnRlcmFjdGlvbnNfcXVhbGxpZmVbW2ldXSA8LSBlYl9maXQNCn0gDQoNCnN1bW1hcnkoZWJfbGlzdF9pbnRlcmFjdGlvbnNfcXVhbGxpZmVbWzFdXSkgDQoNCnNhdmUoZWJfbGlzdF9pbnRlcmFjdGlvbnNfcXVhbGxpZmUsIGZpbGU9Ii4vZGF0YS9maW5hbF9kYXRhL3JlZ3Jlc3Npb25fb3V0cHV0cy9lYl9saXN0X2ludGVyYWN0aW9uc19xdWFsbGlmZV93X25ldy5SRGF0YSIpDQpgYGANCg0KYGBge3J9DQojIE5vdyAyIHN0YXRlbWVudHMgdGhhdCBhcmUgYXNrZWQgNCB0aW1lcw0KZWJfY29tcGxldGUgPC0gZWJfdG90ICU+JSBkcGx5cjo6c2VsZWN0KHN1cnZleXllYXIsIHJvbGVfaW5kLCBiaWdfcG9sLCBzZXgsIGlzY2VkLCB1cmJhbiwgYWdlLCB3ZWlnaHR2ZWMsIGlzY2VkX2NhdCkNCiMgTHJwbGFjZSBhbmQgaW5jb21lIGFyZSBub3QgYXNrZWQgaW4gYWxsIHdhdmVzDQplYl9jb21wbGV0ZSA8LSBlYl9jb21wbGV0ZSAlPiUgZHJvcF9uYSgpDQplYl9jb21wbGV0ZSR0aW1lIDwtIGViX2NvbXBsZXRlJHN1cnZleXllYXIgLSBtaW4oZWJfY29tcGxldGUkc3VydmV5eWVhcikNCg0KIyBGaXJzdCBlbXB0eSBtb2RlbCANCnByZWRpY3RvcnMgPC0gYygidGltZSIpDQpkZXBzIDwtIGMoInJvbGVfaW5kIiwgImJpZ19wb2wiKQ0KDQplYl9saXN0X2VtcHR5XzIwMDcgPC0gbGlzdCgpDQoNCiMgTG9vcCB0aHJvdWdoIGVhY2ggZGVwZW5kZW50IHZhcmlhYmxlDQogIGZvciAoaSBpbiAxOmxlbmd0aChkZXBzKSkgew0KICAjIFNwZWNpZnkgdGhlIHNpZ21hIGZvcm11bGENCiAgc2lnbWEuZm9ybXVsYSA8LSBhcy5mb3JtdWxhKHBhc3RlKCJ+IiwgcGFzdGUocHJlZGljdG9ycywgY29sbGFwc2UgPSAiICsgIikpKQ0KICAjIFBlcmZvcm0gdGhlIGxpbmVhciByZWdyZXNzaW9uDQogIGViX2ZpdCA8LSBnYW1sc3MoYXMuZm9ybXVsYShwYXN0ZShkZXBzW2ldLCAifiIsIHBhc3RlKHByZWRpY3RvcnMsIGNvbGxhcHNlID0gIiArICIpKSksIHNpZ21hLmZvcm11bGEgPSBzaWdtYS5mb3JtdWxhLCBmYW1pbHk9Tk8obXUubGluayA9ICJpZGVudGl0eSIsIHNpZ21hLmxpbmsgPSAiaWRlbnRpdHkiKSwgZGF0YSA9IGViX2NvbXBsZXRlLCB3ZWlnaHRzID0gd2VpZ2h0dmVjKQ0KICANCiAgZWJfbGlzdF9lbXB0eV8yMDA3W1tpXV0gPC0gZWJfZml0DQp9IA0KDQpzdW1tYXJ5KGViX2xpc3RfZW1wdHlfMjAwN1tbMl1dKSANCg0Kc2F2ZShlYl9saXN0X2VtcHR5XzIwMDcsIGZpbGU9Ii4vZGF0YS9maW5hbF9kYXRhL3JlZ3Jlc3Npb25fb3V0cHV0cy9lYl9saXN0X2VtcHR5XzIwMDdfdy5SRGF0YSIpDQoNCiMgTW9kZWwgd2l0aCBwcmVkaWN0b3JzDQpwcmVkaWN0b3JzIDwtIGMoInRpbWUiLCAic2V4IiwgImlzY2VkX2NhdCIsICJhZ2UiKQ0KZGVwcyA8LSBjKCJyb2xlX2luZCIsICJiaWdfcG9sIikNCg0KZWJfbGlzdF9wcmVkc18yMDA3IDwtIGxpc3QoKQ0KDQojIExvb3AgdGhyb3VnaCBlYWNoIGRlcGVuZGVudCB2YXJpYWJsZQ0KICBmb3IgKGkgaW4gMTpsZW5ndGgoZGVwcykpIHsNCiAgIyBTcGVjaWZ5IHRoZSBzaWdtYSBmb3JtdWxhDQogIHNpZ21hLmZvcm11bGEgPC0gYXMuZm9ybXVsYShwYXN0ZSgifiIsIHBhc3RlKHByZWRpY3RvcnMsIGNvbGxhcHNlID0gIiArICIpKSkNCiAgIyBQZXJmb3JtIHRoZSBsaW5lYXIgcmVncmVzc2lvbg0KICBlYl9maXQgPC0gZ2FtbHNzKGFzLmZvcm11bGEocGFzdGUoZGVwc1tpXSwgIn4iLCBwYXN0ZShwcmVkaWN0b3JzLCBjb2xsYXBzZSA9ICIgKyAiKSkpLCBzaWdtYS5mb3JtdWxhID0gc2lnbWEuZm9ybXVsYSwgZmFtaWx5PU5PKG11LmxpbmsgPSAiaWRlbnRpdHkiLCBzaWdtYS5saW5rID0gImlkZW50aXR5IiksIGRhdGEgPSBlYl9jb21wbGV0ZSwgd2VpZ2h0cyA9IHdlaWdodHZlYykNCiAgDQogIGViX2xpc3RfcHJlZHNfMjAwN1tbaV1dIDwtIGViX2ZpdA0KfSANCg0Kc3VtbWFyeShlYl9saXN0X3ByZWRzXzIwMDdbWzFdXSkgDQoNCnNhdmUoZWJfbGlzdF9wcmVkc18yMDA3LCBmaWxlPSIuL2RhdGEvZmluYWxfZGF0YS9yZWdyZXNzaW9uX291dHB1dHMvZWJfbGlzdF9wcmVkc18yMDA3X3dfbmV3LlJEYXRhIikNCg0KIyBBbmQgdGhlIG1vZGVsIHdpdGggaW50ZXJhY3Rpb25zDQplYl9jb21wbGV0ZSRhZ2VfdGltZSA8LSBlYl9jb21wbGV0ZSRhZ2UgKiBlYl9jb21wbGV0ZSR0aW1lDQplYl9jb21wbGV0ZSRzZXhfdGltZSA8LSBhcy5udW1lcmljKGViX2NvbXBsZXRlJHNleCkgKiBlYl9jb21wbGV0ZSR0aW1lDQplYl9jb21wbGV0ZSA8LSBmYXN0RHVtbWllczo6ZHVtbXlfY29scyhlYl9jb21wbGV0ZSwgc2VsZWN0X2NvbHVtbnMgPSAiaXNjZWRfY2F0IikNCmViX2NvbXBsZXRlJGlzY2VkX2Jhc2ljX3RpbWUgPC0gZWJfY29tcGxldGUkaXNjZWRfY2F0X0Jhc2ljICogZWJfY29tcGxldGUkdGltZQ0KZWJfY29tcGxldGUkaXNjZWRfaW50ZXJtZWRpYXRlX3RpbWUgPC0gZWJfY29tcGxldGUkaXNjZWRfY2F0X0ludGVybWVkaWF0ZSAqIGViX2NvbXBsZXRlJHRpbWUNCmViX2NvbXBsZXRlJGlzY2VkX2FkdmFuY2VkX3RpbWUgPC0gZWJfY29tcGxldGUkaXNjZWRfY2F0X0FkdmFuY2VkICogZWJfY29tcGxldGUkdGltZQ0KDQppbnRlcmFjdGlvbnMgPC0gYygiYWdlX3RpbWUiLCAic2V4X3RpbWUiLCAiaXNjZWRfaW50ZXJtZWRpYXRlX3RpbWUiLCAiaXNjZWRfYWR2YW5jZWRfdGltZSIpDQoNCmViX2xpc3RfaW50ZXJhY3Rpb25zXzIwMDcgPC0gbGlzdCgpDQoNCiBmb3IgKGkgaW4gMTpsZW5ndGgoZGVwcykpIHsNCiAgIyBTcGVjaWZ5IHRoZSBzaWdtYSBmb3JtdWxhDQogIHNpZ21hLmZvcm11bGEgPC0gYXMuZm9ybXVsYShwYXN0ZSgifiIsIHBhc3RlKHByZWRpY3RvcnMsIGNvbGxhcHNlID0gIiArICIpLCAiICsgIiwgcGFzdGUoaW50ZXJhY3Rpb25zLCBjb2xsYXBzZSA9ICIgKyAiKSkpDQogICMgUGVyZm9ybSB0aGUgbGluZWFyIHJlZ3Jlc3NlYm4NCiAgZWJfZml0IDwtIGdhbWxzcyhhcy5mb3JtdWxhKHBhc3RlKGRlcHNbaV0sICJ+IiwgcGFzdGUocHJlZGljdG9ycywgY29sbGFwc2UgPSAiICsgIiksICIgKyAiLCBwYXN0ZShpbnRlcmFjdGlvbnMsIGNvbGxhcHNlID0gIisgIikpKSwgc2lnbWEuZm9ybXVsYSA9IHNpZ21hLmZvcm11bGEsIiArICIsIGZhbWlseT1OTyhtdS5saW5rID0gImlkZW50aXR5Iiwgc2lnbWEubGluayA9ICJpZGVudGl0eSIpLCBkYXRhID0gZWJfY29tcGxldGUsIHdlaWdodHMgPSB3ZWlnaHR2ZWMpDQogIA0KICBlYl9saXN0X2ludGVyYWN0aW9uc18yMDA3W1tpXV0gPC0gZWJfZml0DQp9IA0KDQpzdW1tYXJ5KGViX2xpc3RfaW50ZXJhY3Rpb25zXzIwMDdbWzFdXSkgDQoNCnNhdmUoZWJfbGlzdF9pbnRlcmFjdGlvbnNfMjAwNywgZmlsZT0iLi9kYXRhL2ZpbmFsX2RhdGEvcmVncmVzc2lvbl9vdXRwdXRzL2ViX2xpc3RfaW50ZXJhY3Rpb25zXzIwMDdfd19uZXcuUkRhdGEiKQ0KYGBgDQoNCmBgYHtyfQ0KIyBOb3cgMiBzdGF0ZW1lbnRzIHRoYXQgYXJlIGFza2VkIDQgdGltZXMNCmViX2NvbXBsZXRlIDwtIGViX3RvdCAlPiUgZHBseXI6OnNlbGVjdChzdXJ2ZXl5ZWFyLCBidXlwcm9kLCBzZXgsIGlzY2VkLCB1cmJhbiwgYWdlLCB3ZWlnaHR2ZWMsIGlzY2VkX2NhdCkNCmViX2NvbXBsZXRlIDwtIGViX2NvbXBsZXRlICU+JSBkcm9wX25hKCkNCmViX2NvbXBsZXRlJHRpbWUgPC0gZWJfY29tcGxldGUkc3VydmV5eWVhciAtIG1pbihlYl9jb21wbGV0ZSRzdXJ2ZXl5ZWFyKQ0KDQojIEZpcnN0IGVtcHR5IG1vZGVsIA0KcHJlZGljdG9ycyA8LSBjKCJ0aW1lIikNCmRlcHMgPC0gYygiYnV5cHJvZCIpDQoNCmViX2xpc3RfZW1wdHlfYnV5cHJvZCA8LSBsaXN0KCkNCg0KIyBMb29wIHRocm91Z2ggZWFjaCBkZXBlbmRlbnQgdmFyaWFibGUNCiAgZm9yIChpIGluIDE6bGVuZ3RoKGRlcHMpKSB7DQogICMgU3BlY2lmeSB0aGUgc2lnbWEgZm9ybXVsYQ0KICBzaWdtYS5mb3JtdWxhIDwtIGFzLmZvcm11bGEocGFzdGUoIn4iLCBwYXN0ZShwcmVkaWN0b3JzLCBjb2xsYXBzZSA9ICIgKyAiKSkpDQogICMgUGVyZm9ybSB0aGUgbGluZWFyIHJlZ3Jlc3Npb24NCiAgZWJfZml0IDwtIGdhbWxzcyhhcy5mb3JtdWxhKHBhc3RlKGRlcHNbaV0sICJ+IiwgcGFzdGUocHJlZGljdG9ycywgY29sbGFwc2UgPSAiICsgIikpKSwgc2lnbWEuZm9ybXVsYSA9IHNpZ21hLmZvcm11bGEsIGZhbWlseT1OTyhtdS5saW5rID0gImlkZW50aXR5Iiwgc2lnbWEubGluayA9ICJpZGVudGl0eSIpLCBkYXRhID0gZWJfY29tcGxldGUsIHdlaWdodHMgPSB3ZWlnaHR2ZWMpDQogIA0KICBlYl9saXN0X2VtcHR5X2J1eXByb2RbW2ldXSA8LSBlYl9maXQNCn0gDQoNCnN1bW1hcnkoZWJfbGlzdF9lbXB0eV9idXlwcm9kW1sxXV0pIA0KDQpzYXZlKGViX2xpc3RfZW1wdHlfYnV5cHJvZCwgZmlsZT0iLi9kYXRhL2ZpbmFsX2RhdGEvcmVncmVzc2lvbl9vdXRwdXRzL2ViX2xpc3RfZW1wdHlfYnV5cHJvZF93LlJEYXRhIikNCg0KIyBNb2RlbCB3aXRoIHByZWRpY3RvcnMNCnByZWRpY3RvcnMgPC0gYygidGltZSIsICJzZXgiLCAiaXNjZWRfY2F0IiwgImFnZSIpDQpkZXBzIDwtIGMoImJ1eXByb2QiKQ0KDQplYl9saXN0X3ByZWRzX2J1eXByb2QgPC0gbGlzdCgpDQoNCiMgTG9vcCB0aHJvdWdoIGVhY2ggZGVwZW5kZW50IHZhcmlhYmxlDQogIGZvciAoaSBpbiAxOmxlbmd0aChkZXBzKSkgew0KICAjIFNwZWNpZnkgdGhlIHNpZ21hIGZvcm11bGENCiAgc2lnbWEuZm9ybXVsYSA8LSBhcy5mb3JtdWxhKHBhc3RlKCJ+IiwgcGFzdGUocHJlZGljdG9ycywgY29sbGFwc2UgPSAiICsgIikpKQ0KICAjIFBlcmZvcm0gdGhlIGxpbmVhciByZWdyZXNzaW9uDQogIGViX2ZpdCA8LSBnYW1sc3MoYXMuZm9ybXVsYShwYXN0ZShkZXBzW2ldLCAifiIsIHBhc3RlKHByZWRpY3RvcnMsIGNvbGxhcHNlID0gIiArICIpKSksIHNpZ21hLmZvcm11bGEgPSBzaWdtYS5mb3JtdWxhLCBmYW1pbHk9Tk8obXUubGluayA9ICJpZGVudGl0eSIsIHNpZ21hLmxpbmsgPSAiaWRlbnRpdHkiKSwgZGF0YSA9IGViX2NvbXBsZXRlLCB3ZWlnaHRzID0gd2VpZ2h0dmVjKQ0KICANCiAgZWJfbGlzdF9wcmVkc19idXlwcm9kW1tpXV0gPC0gZWJfZml0DQp9IA0KDQpzdW1tYXJ5KGViX2xpc3RfcHJlZHNfYnV5cHJvZFtbMV1dKSANCg0Kc2F2ZShlYl9saXN0X3ByZWRzX2J1eXByb2QsIGZpbGU9Ii4vZGF0YS9maW5hbF9kYXRhL3JlZ3Jlc3Npb25fb3V0cHV0cy9lYl9saXN0X3ByZWRzX2J1eXByb2Rfd19uZXcuUkRhdGEiKQ0KDQojIEFuZCB0aGUgbW9kZWwgd2l0aCBpbnRlcmFjdGlvbnMNCmViX2NvbXBsZXRlJGFnZV90aW1lIDwtIGViX2NvbXBsZXRlJGFnZSAqIGViX2NvbXBsZXRlJHRpbWUNCmViX2NvbXBsZXRlJHNleF90aW1lIDwtIGFzLm51bWVyaWMoZWJfY29tcGxldGUkc2V4KSAqIGViX2NvbXBsZXRlJHRpbWUNCmViX2NvbXBsZXRlIDwtIGZhc3REdW1taWVzOjpkdW1teV9jb2xzKGViX2NvbXBsZXRlLCBzZWxlY3RfY29sdW1ucyA9ICJpc2NlZF9jYXQiKQ0KZWJfY29tcGxldGUkaXNjZWRfYmFzaWNfdGltZSA8LSBlYl9jb21wbGV0ZSRpc2NlZF9jYXRfQmFzaWMgKiBlYl9jb21wbGV0ZSR0aW1lDQplYl9jb21wbGV0ZSRpc2NlZF9pbnRlcm1lZGlhdGVfdGltZSA8LSBlYl9jb21wbGV0ZSRpc2NlZF9jYXRfSW50ZXJtZWRpYXRlICogZWJfY29tcGxldGUkdGltZQ0KZWJfY29tcGxldGUkaXNjZWRfYWR2YW5jZWRfdGltZSA8LSBlYl9jb21wbGV0ZSRpc2NlZF9jYXRfQWR2YW5jZWQgKiBlYl9jb21wbGV0ZSR0aW1lDQoNCmludGVyYWN0aW9ucyA8LSBjKCJhZ2VfdGltZSIsICJzZXhfdGltZSIsICJpc2NlZF9pbnRlcm1lZGlhdGVfdGltZSIsICJpc2NlZF9hZHZhbmNlZF90aW1lIikNCg0KZWJfbGlzdF9pbnRlcmFjdGlvbnNfYnV5cHJvZCA8LSBsaXN0KCkNCg0KIGZvciAoaSBpbiAxOmxlbmd0aChkZXBzKSkgew0KICAjIFNwZWNpZnkgdGhlIHNpZ21hIGZvcm11bGENCiAgc2lnbWEuZm9ybXVsYSA8LSBhcy5mb3JtdWxhKHBhc3RlKCJ+IiwgcGFzdGUocHJlZGljdG9ycywgY29sbGFwc2UgPSAiICsgIiksICIgKyAiLCBwYXN0ZShpbnRlcmFjdGlvbnMsIGNvbGxhcHNlID0gIiArICIpKSkNCiAgIyBQZXJmb3JtIHRoZSBsaW5lYXIgcmVncmVzc2lvbg0KICBlYl9maXQgPC0gZ2FtbHNzKGFzLmZvcm11bGEocGFzdGUoZGVwc1tpXSwgIn4iLCBwYXN0ZShwcmVkaWN0b3JzLCBjb2xsYXBzZSA9ICIgKyAiKSwgIiArICIsIHBhc3RlKGludGVyYWN0aW9ucywgY29sbGFwc2UgPSAiKyAiKSkpLCBzaWdtYS5mb3JtdWxhID0gc2lnbWEuZm9ybXVsYSwiICsgIiwgZmFtaWx5PU5PKG11LmxpbmsgPSAiaWRlbnRpdHkiLCBzaWdtYS5saW5rID0gImlkZW50aXR5IiksIGRhdGEgPSBlYl9jb21wbGV0ZSwgd2VpZ2h0cyA9IHdlaWdodHZlYykNCiAgDQogIGViX2xpc3RfaW50ZXJhY3Rpb25zX2J1eXByb2RbW2ldXSA8LSBlYl9maXQNCn0gDQoNCnN1bW1hcnkoZWJfbGlzdF9pbnRlcmFjdGlvbnNfYnV5cHJvZFtbMV1dKSANCg0Kc2F2ZShlYl9saXN0X2ludGVyYWN0aW9uc19idXlwcm9kLCBmaWxlPSIuL2RhdGEvZmluYWxfZGF0YS9yZWdyZXNzaW9uX291dHB1dHMvZWJfbGlzdF9pbnRlcmFjdGlvbnNfYnV5cHJvZF93X25ldy5SRGF0YSIpDQpgYGANCg0KYGBge3J9DQojIE5vdyAyIHN0YXRlbWVudHMgdGhhdCBhcmUgYXNrZWQgNCB0aW1lcw0KZWJfY29tcGxldGUgPC0gZWJfdG90ICU+JSBkcGx5cjo6c2VsZWN0KHN1cnZleXllYXIsIGVmZl9kYWlseSwgc2V4LCBpc2NlZCwgdXJiYW4sIGFnZSwgd2VpZ2h0dmVjLCBpc2NlZF9jYXQpDQplYl9jb21wbGV0ZSA8LSBlYl9jb21wbGV0ZSAlPiUgZHJvcF9uYSgpDQplYl9jb21wbGV0ZSR0aW1lIDwtIGViX2NvbXBsZXRlJHN1cnZleXllYXIgLSBtaW4oZWJfY29tcGxldGUkc3VydmV5eWVhcikNCg0KIyBGaXJzdCBlbXB0eSBtb2RlbCANCnByZWRpY3RvcnMgPC0gYygidGltZSIpDQpkZXBzIDwtIGMoImVmZl9kYWlseSIpDQoNCmViX2xpc3RfZW1wdHlfZWZmX2RhaWx5IDwtIGxpc3QoKQ0KDQojIExvb3AgdGhyb3VnaCBlYWNoIGRlcGVuZGVudCB2YXJpYWJsZQ0KICBmb3IgKGkgaW4gMTpsZW5ndGgoZGVwcykpIHsNCiAgIyBTcGVjaWZ5IHRoZSBzaWdtYSBmb3JtdWxhDQogIHNpZ21hLmZvcm11bGEgPC0gYXMuZm9ybXVsYShwYXN0ZSgifiIsIHBhc3RlKHByZWRpY3RvcnMsIGNvbGxhcHNlID0gIiArICIpKSkNCiAgIyBQZXJmb3JtIHRoZSBsaW5lYXIgcmVncmVzc2lvbg0KICBlYl9maXQgPC0gZ2FtbHNzKGFzLmZvcm11bGEocGFzdGUoZGVwc1tpXSwgIn4iLCBwYXN0ZShwcmVkaWN0b3JzLCBjb2xsYXBzZSA9ICIgKyAiKSkpLCBzaWdtYS5mb3JtdWxhID0gc2lnbWEuZm9ybXVsYSwgZmFtaWx5PU5PKG11LmxpbmsgPSAiaWRlbnRpdHkiLCBzaWdtYS5saW5rID0gImlkZW50aXR5IiksIGRhdGEgPSBlYl9jb21wbGV0ZSwgd2VpZ2h0cyA9IHdlaWdodHZlYykNCiAgDQogIGViX2xpc3RfZW1wdHlfZWZmX2RhaWx5W1tpXV0gPC0gZWJfZml0DQp9IA0KDQpzdW1tYXJ5KGViX2xpc3RfZW1wdHlfZWZmX2RhaWx5W1sxXV0pIA0KDQpzYXZlKGViX2xpc3RfZW1wdHlfZWZmX2RhaWx5LCBmaWxlPSIuL2RhdGEvZmluYWxfZGF0YS9yZWdyZXNzaW9uX291dHB1dHMvZWJfbGlzdF9lbXB0eV9lZmZfZGFpbHlfdy5SRGF0YSIpDQoNCiMgTW9kZWwgd2l0aCBwcmVkaWN0b3JzDQpwcmVkaWN0b3JzIDwtIGMoInRpbWUiLCAic2V4IiwgImlzY2VkX2NhdCIsICJhZ2UiKQ0KZGVwcyA8LSBjKCJlZmZfZGFpbHkiKQ0KDQplYl9saXN0X3ByZWRzX2VmZl9kYWlseSA8LSBsaXN0KCkNCg0KIyBMb29wIHRocm91Z2ggZWFjaCBkZXBlbmRlbnQgdmFyaWFibGUNCiAgZm9yIChpIGluIDE6bGVuZ3RoKGRlcHMpKSB7DQogICMgU3BlY2lmeSB0aGUgc2lnbWEgZm9ybXVsYQ0KICBzaWdtYS5mb3JtdWxhIDwtIGFzLmZvcm11bGEocGFzdGUoIn4iLCBwYXN0ZShwcmVkaWN0b3JzLCBjb2xsYXBzZSA9ICIgKyAiKSkpDQogICMgUGVyZm9ybSB0aGUgbGluZWFyIHJlZ3Jlc3Npb24NCiAgZWJfZml0IDwtIGdhbWxzcyhhcy5mb3JtdWxhKHBhc3RlKGRlcHNbaV0sICJ+IiwgcGFzdGUocHJlZGljdG9ycywgY29sbGFwc2UgPSAiICsgIikpKSwgc2lnbWEuZm9ybXVsYSA9IHNpZ21hLmZvcm11bGEsIGZhbWlseT1OTyhtdS5saW5rID0gImlkZW50aXR5Iiwgc2lnbWEubGluayA9ICJpZGVudGl0eSIpLCBkYXRhID0gZWJfY29tcGxldGUsIHdlaWdodHMgPSB3ZWlnaHR2ZWMpDQogIA0KICBlYl9saXN0X3ByZWRzX2VmZl9kYWlseVtbaV1dIDwtIGViX2ZpdA0KfSANCg0Kc3VtbWFyeShlYl9saXN0X3ByZWRzX2VmZl9kYWlseVtbMV1dKSANCg0Kc2F2ZShlYl9saXN0X3ByZWRzX2VmZl9kYWlseSwgZmlsZT0iLi9kYXRhL2ZpbmFsX2RhdGEvcmVncmVzc2lvbl9vdXRwdXRzL2ViX2xpc3RfcHJlZHNfZWZmX2RhaWx5X3dfbmV3LlJEYXRhIikNCg0KIyBBbmQgdGhlIG1vZGVsIHdpdGggaW50ZXJhY3Rpb25zDQplYl9jb21wbGV0ZSRhZ2VfdGltZSA8LSBlYl9jb21wbGV0ZSRhZ2UgKiBlYl9jb21wbGV0ZSR0aW1lDQplYl9jb21wbGV0ZSRzZXhfdGltZSA8LSBhcy5udW1lcmljKGViX2NvbXBsZXRlJHNleCkgKiBlYl9jb21wbGV0ZSR0aW1lDQplYl9jb21wbGV0ZSA8LSBmYXN0RHVtbWllczo6ZHVtbXlfY29scyhlYl9jb21wbGV0ZSwgc2VsZWN0X2NvbHVtbnMgPSAiaXNjZWRfY2F0IikNCmViX2NvbXBsZXRlJGlzY2VkX2Jhc2ljX3RpbWUgPC0gZWJfY29tcGxldGUkaXNjZWRfY2F0X0Jhc2ljICogZWJfY29tcGxldGUkdGltZQ0KZWJfY29tcGxldGUkaXNjZWRfaW50ZXJtZWRpYXRlX3RpbWUgPC0gZWJfY29tcGxldGUkaXNjZWRfY2F0X0ludGVybWVkaWF0ZSAqIGViX2NvbXBsZXRlJHRpbWUNCmViX2NvbXBsZXRlJGlzY2VkX2FkdmFuY2VkX3RpbWUgPC0gZWJfY29tcGxldGUkaXNjZWRfY2F0X0FkdmFuY2VkICogZWJfY29tcGxldGUkdGltZQ0KDQppbnRlcmFjdGlvbnMgPC0gYygiYWdlX3RpbWUiLCAic2V4X3RpbWUiLCAiaXNjZWRfaW50ZXJtZWRpYXRlX3RpbWUiLCAiaXNjZWRfYWR2YW5jZWRfdGltZSIpDQoNCmViX2xpc3RfaW50ZXJhY3Rpb25zX2VmZl9kYWlseSA8LSBsaXN0KCkNCg0KIGZvciAoaSBpbiAxOmxlbmd0aChkZXBzKSkgew0KICAjIFNwZWNpZnkgdGhlIHNpZ21hIGZvcm11bGENCiAgc2lnbWEuZm9ybXVsYSA8LSBhcy5mb3JtdWxhKHBhc3RlKCJ+IiwgcGFzdGUocHJlZGljdG9ycywgY29sbGFwc2UgPSAiICsgIiksICIgKyAiLCBwYXN0ZShpbnRlcmFjdGlvbnMsIGNvbGxhcHNlID0gIiArICIpKSkNCiAgIyBQZXJmb3JtIHRoZSBsaW5lYXIgcmVncmVzc2lvbg0KICBlYl9maXQgPC0gZ2FtbHNzKGFzLmZvcm11bGEocGFzdGUoZGVwc1tpXSwgIn4iLCBwYXN0ZShwcmVkaWN0b3JzLCBjb2xsYXBzZSA9ICIgKyAiKSwgIiArICIsIHBhc3RlKGludGVyYWN0aW9ucywgY29sbGFwc2UgPSAiKyAiKSkpLCBzaWdtYS5mb3JtdWxhID0gc2lnbWEuZm9ybXVsYSwiICsgIiwgZmFtaWx5PU5PKG11LmxpbmsgPSAiaWRlbnRpdHkiLCBzaWdtYS5saW5rID0gImlkZW50aXR5IiksIGRhdGEgPSBlYl9jb21wbGV0ZSwgd2VpZ2h0cyA9IHdlaWdodHZlYykNCiAgDQogIGViX2xpc3RfaW50ZXJhY3Rpb25zX2VmZl9kYWlseVtbaV1dIDwtIGViX2ZpdA0KfSANCg0Kc3VtbWFyeShlYl9saXN0X2ludGVyYWN0aW9uc19lZmZfZGFpbHlbWzFdXSkgDQoNCnNhdmUoZWJfbGlzdF9pbnRlcmFjdGlvbnNfZWZmX2RhaWx5LCBmaWxlPSIuL2RhdGEvZmluYWxfZGF0YS9yZWdyZXNzaW9uX291dHB1dHMvZWJfbGlzdF9pbnRlcmFjdGlvbnNfZWZmX2RhaWx5X3dfbmV3LlJEYXRhIikNCmBgYA0KDQpgYGB7cn0NCiMgTm93IDQgdmFycyB0aGF0IGFyZSBhc2tlZCAyIHdhdmVzDQplYl9jb21wbGV0ZSA8LSBlYl90b3QgJT4lIGRwbHlyOjpzZWxlY3Qoc3VydmV5eWVhciwgY2NfdW5zdG9wOmNjX3Byc2FjdCwgc2V4LCBpc2NlZCwgdXJiYW4sIGFnZSwgd2VpZ2h0dmVjLCBpc2NlZF9jYXQpDQplYl9jb21wbGV0ZSA8LSBlYl9jb21wbGV0ZSAlPiUgZHJvcF9uYSgpDQplYl9jb21wbGV0ZSR0aW1lIDwtIGViX2NvbXBsZXRlJHN1cnZleXllYXIgLSBtaW4oZWJfY29tcGxldGUkc3VydmV5eWVhcikNCg0KIyBGaXJzdCBlbXB0eSBtb2RlbCANCnByZWRpY3RvcnMgPC0gYygidGltZSIpDQpkZXBzIDwtIGMoImNjX3Vuc3RvcCIsICJjY19leGFnIiwgImNjX3Bvc2V1IiwgImNjX3Byc2FjdCIpDQoNCmViX2xpc3RfZW1wdHlfMjAwOCA8LSBsaXN0KCkNCg0KIyBMb29wIHRocm91Z2ggZWFjaCBkZXBlbmRlbnQgdmFyaWFibGUNCiAgZm9yIChpIGluIDE6bGVuZ3RoKGRlcHMpKSB7DQogICMgU3BlY2lmeSB0aGUgc2lnbWEgZm9ybXVsYQ0KICBzaWdtYS5mb3JtdWxhIDwtIGFzLmZvcm11bGEocGFzdGUoIn4iLCBwYXN0ZShwcmVkaWN0b3JzLCBjb2xsYXBzZSA9ICIgKyAiKSkpDQogICMgUGVyZm9ybSB0aGUgbGluZWFyIHJlZ3Jlc3Npb24NCiAgZWJfZml0IDwtIGdhbWxzcyhhcy5mb3JtdWxhKHBhc3RlKGRlcHNbaV0sICJ+IiwgcGFzdGUocHJlZGljdG9ycywgY29sbGFwc2UgPSAiICsgIikpKSwgc2lnbWEuZm9ybXVsYSA9IHNpZ21hLmZvcm11bGEsIGZhbWlseT1OTyhtdS5saW5rID0gImlkZW50aXR5Iiwgc2lnbWEubGluayA9ICJpZGVudGl0eSIpLCBkYXRhID0gZWJfY29tcGxldGUsIHdlaWdodHMgPSB3ZWlnaHR2ZWMpDQogIA0KICBlYl9saXN0X2VtcHR5XzIwMDhbW2ldXSA8LSBlYl9maXQNCn0gDQoNCnN1bW1hcnkoZWJfbGlzdF9lbXB0eV8yMDA4W1sxXV0pIA0KDQpzYXZlKGViX2xpc3RfZW1wdHlfMjAwOCwgZmlsZT0iLi9kYXRhL2ZpbmFsX2RhdGEvcmVncmVzc2lvbl9vdXRwdXRzL2ViX2xpc3RfZW1wdHlfMjAwOF93LlJEYXRhIikNCg0KIyBNb2RlbCB3aXRoIHByZWRpY3RvcnMNCnByZWRpY3RvcnMgPC0gYygidGltZSIsICJzZXgiLCAiaXNjZWRfY2F0IiwgImFnZSIpDQpkZXBzIDwtIGMoImNjX3Vuc3RvcCIsICJjY19leGFnIiwgImNjX3Bvc2V1IiwgImNjX3Byc2FjdCIpDQoNCmViX2xpc3RfcHJlZHNfMjAwOCA8LSBsaXN0KCkNCg0KIyBMb29wIHRocm91Z2ggZWFjaCBkZXBlbmRlbnQgdmFyaWFibGUNCiAgZm9yIChpIGluIDE6bGVuZ3RoKGRlcHMpKSB7DQogICMgU3BlY2lmeSB0aGUgc2lnbWEgZm9ybXVsYQ0KICBzaWdtYS5mb3JtdWxhIDwtIGFzLmZvcm11bGEocGFzdGUoIn4iLCBwYXN0ZShwcmVkaWN0b3JzLCBjb2xsYXBzZSA9ICIgKyAiKSkpDQogICMgUGVyZm9ybSB0aGUgbGluZWFyIHJlZ3Jlc3Npb24NCiAgZWJfZml0IDwtIGdhbWxzcyhhcy5mb3JtdWxhKHBhc3RlKGRlcHNbaV0sICJ+IiwgcGFzdGUocHJlZGljdG9ycywgY29sbGFwc2UgPSAiICsgIikpKSwgc2lnbWEuZm9ybXVsYSA9IHNpZ21hLmZvcm11bGEsIGZhbWlseT1OTyhtdS5saW5rID0gImlkZW50aXR5Iiwgc2lnbWEubGluayA9ICJpZGVudGl0eSIpLCBkYXRhID0gZWJfY29tcGxldGUsIHdlaWdodHMgPSB3ZWlnaHR2ZWMpDQogIA0KICBlYl9saXN0X3ByZWRzXzIwMDhbW2ldXSA8LSBlYl9maXQNCn0gDQoNCnN1bW1hcnkoZWJfbGlzdF9wcmVkc18yMDA4W1sxXV0pIA0KDQpzYXZlKGViX2xpc3RfcHJlZHNfMjAwOCwgZmlsZT0iLi9kYXRhL2ZpbmFsX2RhdGEvcmVncmVzc2lvbl9vdXRwdXRzL2ViX2xpc3RfcHJlZHNfMjAwOF93X25ldy5SRGF0YSIpDQoNCiMgQW5kIHRoZSBtb2RlbCB3aXRoIGludGVyYWN0aW9ucw0KZWJfY29tcGxldGUkYWdlX3RpbWUgPC0gZWJfY29tcGxldGUkYWdlICogZWJfY29tcGxldGUkdGltZQ0KZWJfY29tcGxldGUkc2V4X3RpbWUgPC0gYXMubnVtZXJpYyhlYl9jb21wbGV0ZSRzZXgpICogZWJfY29tcGxldGUkdGltZQ0KZWJfY29tcGxldGUgPC0gZmFzdER1bW1pZXM6OmR1bW15X2NvbHMoZWJfY29tcGxldGUsIHNlbGVjdF9jb2x1bW5zID0gImlzY2VkX2NhdCIpDQplYl9jb21wbGV0ZSRpc2NlZF9iYXNpY190aW1lIDwtIGViX2NvbXBsZXRlJGlzY2VkX2NhdF9CYXNpYyAqIGViX2NvbXBsZXRlJHRpbWUNCmViX2NvbXBsZXRlJGlzY2VkX2ludGVybWVkaWF0ZV90aW1lIDwtIGViX2NvbXBsZXRlJGlzY2VkX2NhdF9JbnRlcm1lZGlhdGUgKiBlYl9jb21wbGV0ZSR0aW1lDQplYl9jb21wbGV0ZSRpc2NlZF9hZHZhbmNlZF90aW1lIDwtIGViX2NvbXBsZXRlJGlzY2VkX2NhdF9BZHZhbmNlZCAqIGViX2NvbXBsZXRlJHRpbWUNCg0KaW50ZXJhY3Rpb25zIDwtIGMoImFnZV90aW1lIiwgInNleF90aW1lIiwgImlzY2VkX2ludGVybWVkaWF0ZV90aW1lIiwgImlzY2VkX2FkdmFuY2VkX3RpbWUiKQ0KDQplYl9saXN0X2ludGVyYWN0aW9uc18yMDA4IDwtIGxpc3QoKQ0KDQogZm9yIChpIGluIDE6bGVuZ3RoKGRlcHMpKSB7DQogICMgU3BlY2lmeSB0aGUgc2lnbWEgZm9ybXVsYQ0KICBzaWdtYS5mb3JtdWxhIDwtIGFzLmZvcm11bGEocGFzdGUoIn4iLCBwYXN0ZShwcmVkaWN0b3JzLCBjb2xsYXBzZSA9ICIgKyAiKSwgIiArICIsIHBhc3RlKGludGVyYWN0aW9ucywgY29sbGFwc2UgPSAiICsgIikpKQ0KICAjIFBlcmZvcm0gdGhlIGxpbmVhciByZWdyZXNzaW9uDQogIGViX2ZpdCA8LSBnYW1sc3MoYXMuZm9ybXVsYShwYXN0ZShkZXBzW2ldLCAifiIsIHBhc3RlKHByZWRpY3RvcnMsIGNvbGxhcHNlID0gIiArICIpLCAiICsgIiwgcGFzdGUoaW50ZXJhY3Rpb25zLCBjb2xsYXBzZSA9ICIrICIpKSksIHNpZ21hLmZvcm11bGEgPSBzaWdtYS5mb3JtdWxhLCIgKyAiLCBmYW1pbHk9Tk8obXUubGluayA9ICJpZGVudGl0eSIsIHNpZ21hLmxpbmsgPSAiaWRlbnRpdHkiKSwgZGF0YSA9IGViX2NvbXBsZXRlLCB3ZWlnaHRzID0gd2VpZ2h0dmVjKQ0KICANCiAgZWJfbGlzdF9pbnRlcmFjdGlvbnNfMjAwOFtbaV1dIDwtIGViX2ZpdA0KfSANCg0Kc3VtbWFyeShlYl9saXN0X2ludGVyYWN0aW9uc18yMDA4W1sxXV0pIA0KDQpzYXZlKGViX2xpc3RfaW50ZXJhY3Rpb25zXzIwMDgsIGZpbGU9Ii4vZGF0YS9maW5hbF9kYXRhL3JlZ3Jlc3Npb25fb3V0cHV0cy9lYl9saXN0X2ludGVyYWN0aW9uc18yMDA4X3dfbmV3LlJEYXRhIikNCmBgYA0KDQoNCmBgYHtyfQ0KIyBDbGltYXRlIGNoYW5nZSBwZXJjZXB0aW9uIGFza2VkIGluIHNpeCB3YXZlcw0KZWJfY29tcGxldGUgPC0gZWJfdG90ICU+JSBkcGx5cjo6c2VsZWN0KHN1cnZleXllYXIsIGNjcGVyY2VwdCwgY2NoYW5nZSwgc2V4LCBpc2NlZCwgdXJiYW4sIGFnZSwgd2VpZ2h0dmVjLCBpc2NlZF9jYXQpDQplYl9jb21wbGV0ZSA8LSBlYl9jb21wbGV0ZSAlPiUgZHJvcF9uYSgpDQplYl9jb21wbGV0ZSR0aW1lIDwtIGViX2NvbXBsZXRlJHN1cnZleXllYXIgLSBtaW4oZWJfY29tcGxldGUkc3VydmV5eWVhcikNCg0KIyBGaXJzdCBlbXB0eSBtb2RlbCANCnByZWRpY3RvcnMgPC0gYygidGltZSIpDQpkZXBzIDwtIGMoImNjcGVyY2VwdCIsICJjY2hhbmdlIikNCg0KZWJfbGlzdF9lbXB0eV8yMDA5IDwtIGxpc3QoKQ0KDQojIExvb3AgdGhyb3VnaCBlYWNoIGRlcGVuZGVudCB2YXJpYWJsZQ0KICBmb3IgKGkgaW4gMTpsZW5ndGgoZGVwcykpIHsNCiAgIyBTcGVjaWZ5IHRoZSBzaWdtYSBmb3JtdWxhDQogIHNpZ21hLmZvcm11bGEgPC0gYXMuZm9ybXVsYShwYXN0ZSgifiIsIHBhc3RlKHByZWRpY3RvcnMsIGNvbGxhcHNlID0gIiArICIpKSkNCiAgIyBQZXJmb3JtIHRoZSBsaW5lYXIgcmVncmVzc2lvbg0KICBlYl9maXQgPC0gZ2FtbHNzKGFzLmZvcm11bGEocGFzdGUoZGVwc1tpXSwgIn4iLCBwYXN0ZShwcmVkaWN0b3JzLCBjb2xsYXBzZSA9ICIgKyAiKSkpLCBzaWdtYS5mb3JtdWxhID0gc2lnbWEuZm9ybXVsYSwgZmFtaWx5PU5PKG11LmxpbmsgPSAiaWRlbnRpdHkiLCBzaWdtYS5saW5rID0gImlkZW50aXR5IiksIGRhdGEgPSBlYl9jb21wbGV0ZSwgd2VpZ2h0cyA9IHdlaWdodHZlYykNCiAgDQogIGViX2xpc3RfZW1wdHlfMjAwOVtbaV1dIDwtIGViX2ZpdA0KfSANCg0Kc3VtbWFyeShlYl9saXN0X2VtcHR5XzIwMDlbWzFdXSkgDQoNCnNhdmUoZWJfbGlzdF9lbXB0eV8yMDA5LCBmaWxlPSIuL2RhdGEvZmluYWxfZGF0YS9yZWdyZXNzaW9uX291dHB1dHMvZWJfbGlzdF9lbXB0eV8yMDA5X3cuUkRhdGEiKQ0KDQojIE1vZGVsIHdpdGggcHJlZGljdG9ycw0KcHJlZGljdG9ycyA8LSBjKCJ0aW1lIiwgInNleCIsICJpc2NlZF9jYXQiLCAiYWdlIikNCmRlcHMgPC0gYygiY2NwZXJjZXB0IiwgImNjaGFuZ2UiKQ0KDQplYl9saXN0X3ByZWRzXzIwMDkgPC0gbGlzdCgpDQoNCiMgTG9vcCB0aHJvdWdoIGVhY2ggZGVwZW5kZW50IHZhcmlhYmxlDQogIGZvciAoaSBpbiAxOmxlbmd0aChkZXBzKSkgew0KICAjIFNwZWNpZnkgdGhlIHNpZ21hIGZvcm11bGENCiAgc2lnbWEuZm9ybXVsYSA8LSBhcy5mb3JtdWxhKHBhc3RlKCJ+IiwgcGFzdGUocHJlZGljdG9ycywgY29sbGFwc2UgPSAiICsgIikpKQ0KICAjIFBlcmZvcm0gdGhlIGxpbmVhciByZWdyZXNzaW9uDQogIGViX2ZpdCA8LSBnYW1sc3MoYXMuZm9ybXVsYShwYXN0ZShkZXBzW2ldLCAifiIsIHBhc3RlKHByZWRpY3RvcnMsIGNvbGxhcHNlID0gIiArICIpKSksIHNpZ21hLmZvcm11bGEgPSBzaWdtYS5mb3JtdWxhLCBmYW1pbHk9Tk8obXUubGluayA9ICJpZGVudGl0eSIsIHNpZ21hLmxpbmsgPSAiaWRlbnRpdHkiKSwgZGF0YSA9IGViX2NvbXBsZXRlLCB3ZWlnaHRzID0gd2VpZ2h0dmVjKQ0KICANCiAgZWJfbGlzdF9wcmVkc18yMDA5W1tpXV0gPC0gZWJfZml0DQp9IA0KDQpzdW1tYXJ5KGViX2xpc3RfcHJlZHNfMjAwOVtbMV1dKSANCg0Kc2F2ZShlYl9saXN0X3ByZWRzXzIwMDksIGZpbGU9Ii4vZGF0YS9maW5hbF9kYXRhL3JlZ3Jlc3Npb25fb3V0cHV0cy9lYl9saXN0X3ByZWRzXzIwMDlfd19uZXcuUkRhdGEiKQ0KDQojIEFuZCB0aGUgbW9kZWwgd2l0aCBpbnRlcmFjdGlvbnMNCmViX2NvbXBsZXRlJGFnZV90aW1lIDwtIGViX2NvbXBsZXRlJGFnZSAqIGViX2NvbXBsZXRlJHRpbWUNCmViX2NvbXBsZXRlJHNleF90aW1lIDwtIGFzLm51bWVyaWMoZWJfY29tcGxldGUkc2V4KSAqIGViX2NvbXBsZXRlJHRpbWUNCmViX2NvbXBsZXRlIDwtIGZhc3REdW1taWVzOjpkdW1teV9jb2xzKGViX2NvbXBsZXRlLCBzZWxlY3RfY29sdW1ucyA9ICJpc2NlZF9jYXQiKQ0KZWJfY29tcGxldGUkaXNjZWRfYmFzaWNfdGltZSA8LSBlYl9jb21wbGV0ZSRpc2NlZF9jYXRfQmFzaWMgKiBlYl9jb21wbGV0ZSR0aW1lDQplYl9jb21wbGV0ZSRpc2NlZF9pbnRlcm1lZGlhdGVfdGltZSA8LSBlYl9jb21wbGV0ZSRpc2NlZF9jYXRfSW50ZXJtZWRpYXRlICogZWJfY29tcGxldGUkdGltZQ0KZWJfY29tcGxldGUkaXNjZWRfYWR2YW5jZWRfdGltZSA8LSBlYl9jb21wbGV0ZSRpc2NlZF9jYXRfQWR2YW5jZWQgKiBlYl9jb21wbGV0ZSR0aW1lDQoNCmludGVyYWN0aW9ucyA8LSBjKCJhZ2VfdGltZSIsICJzZXhfdGltZSIsICJpc2NlZF9pbnRlcm1lZGlhdGVfdGltZSIsICJpc2NlZF9hZHZhbmNlZF90aW1lIikNCg0KZWJfbGlzdF9pbnRlcmFjdGlvbnNfMjAwOSA8LSBsaXN0KCkNCg0KIGZvciAoaSBpbiAxOmxlbmd0aChkZXBzKSkgew0KICAjIFNwZWNpZnkgdGhlIHNpZ21hIGZvcm11bGENCiAgc2lnbWEuZm9ybXVsYSA8LSBhcy5mb3JtdWxhKHBhc3RlKCJ+IiwgcGFzdGUocHJlZGljdG9ycywgY29sbGFwc2UgPSAiICsgIiksICIgKyAiLCBwYXN0ZShpbnRlcmFjdGlvbnMsIGNvbGxhcHNlID0gIiArICIpKSkNCiAgIyBQZXJmb3JtIHRoZSBsaW5lYXIgcmVncmVzc2lvbg0KICBlYl9maXQgPC0gZ2FtbHNzKGFzLmZvcm11bGEocGFzdGUoZGVwc1tpXSwgIn4iLCBwYXN0ZShwcmVkaWN0b3JzLCBjb2xsYXBzZSA9ICIgKyAiKSwgIiArICIsIHBhc3RlKGludGVyYWN0aW9ucywgY29sbGFwc2UgPSAiKyAiKSkpLCBzaWdtYS5mb3JtdWxhID0gc2lnbWEuZm9ybXVsYSwiICsgIiwgZmFtaWx5PU5PKG11LmxpbmsgPSAiaWRlbnRpdHkiLCBzaWdtYS5saW5rID0gImlkZW50aXR5IiksIGRhdGEgPSBlYl9jb21wbGV0ZSwgd2VpZ2h0cyA9IHdlaWdodHZlYykNCiAgDQogIGViX2xpc3RfaW50ZXJhY3Rpb25zXzIwMDlbW2ldXSA8LSBlYl9maXQNCn0gDQoNCnN1bW1hcnkoZWJfbGlzdF9pbnRlcmFjdGlvbnNfMjAwOVtbMV1dKSANCg0Kc2F2ZShlYl9saXN0X2ludGVyYWN0aW9uc18yMDA5LCBmaWxlPSIuL2RhdGEvZmluYWxfZGF0YS9yZWdyZXNzaW9uX291dHB1dHMvZWJfbGlzdF9pbnRlcmFjdGlvbnNfMjAwOV93X25ldy5SRGF0YSIpDQpgYGANCg0KYGBge3J9DQojIFBlcnNvbmFsIGltcG9ydGFuY2UgYXNrZWQgaW4gMyB3YXZlcw0KZWJfY29tcGxldGUgPC0gZWJfdG90ICU+JSBkcGx5cjo6c2VsZWN0KHN1cnZleXllYXIsIHBlcnNfaW1wLCBzZXgsIGlzY2VkLCB1cmJhbiwgYWdlLCB3ZWlnaHR2ZWMsIGlzY2VkX2NhdCkNCmViX2NvbXBsZXRlIDwtIGViX2NvbXBsZXRlICU+JSBkcm9wX25hKCkNCmViX2NvbXBsZXRlJHRpbWUgPC0gZWJfY29tcGxldGUkc3VydmV5eWVhciAtIG1pbihlYl9jb21wbGV0ZSRzdXJ2ZXl5ZWFyKQ0KDQojIEZpcnN0IGVtcHR5IG1vZGVsIA0KcHJlZGljdG9ycyA8LSBjKCJ0aW1lIikNCmRlcHMgPC0gYygicGVyc19pbXAiKQ0KDQplYl9saXN0X2VtcHR5X3BlcnNfaW1wIDwtIGxpc3QoKQ0KDQojIExvb3AgdGhyb3VnaCBlYWNoIGRlcGVuZGVudCB2YXJpYWJsZQ0KICBmb3IgKGkgaW4gMTpsZW5ndGgoZGVwcykpIHsNCiAgIyBTcGVjaWZ5IHRoZSBzaWdtYSBmb3JtdWxhDQogIHNpZ21hLmZvcm11bGEgPC0gYXMuZm9ybXVsYShwYXN0ZSgifiIsIHBhc3RlKHByZWRpY3RvcnMsIGNvbGxhcHNlID0gIiArICIpKSkNCiAgIyBQZXJmb3JtIHRoZSBsaW5lYXIgcmVncmVzc2lvbg0KICBlYl9maXQgPC0gZ2FtbHNzKGFzLmZvcm11bGEocGFzdGUoZGVwc1tpXSwgIn4iLCBwYXN0ZShwcmVkaWN0b3JzLCBjb2xsYXBzZSA9ICIgKyAiKSkpLCBzaWdtYS5mb3JtdWxhID0gc2lnbWEuZm9ybXVsYSxmYW1pbHk9Tk8obXUubGluayA9ICJpZGVudGl0eSIsIHNpZ21hLmxpbmsgPSAiaWRlbnRpdHkiKSwgZGF0YSA9IGViX2NvbXBsZXRlLCB3ZWlnaHRzID0gd2VpZ2h0dmVjKQ0KICANCiAgZWJfbGlzdF9lbXB0eV9wZXJzX2ltcFtbaV1dIDwtIGViX2ZpdA0KfSANCg0Kc3VtbWFyeShlYl9saXN0X2VtcHR5X3BlcnNfaW1wW1sxXV0pIA0KDQpzYXZlKGViX2xpc3RfZW1wdHlfcGVyc19pbXAsIGZpbGU9Ii4vZGF0YS9maW5hbF9kYXRhL3JlZ3Jlc3Npb25fb3V0cHV0cy9lYl9saXN0X2VtcHR5X3BlcnNfaW1wX3cuUkRhdGEiKQ0KDQojIE1vZGVsIHdpdGggcHJlZGljdG9ycw0KcHJlZGljdG9ycyA8LSBjKCJ0aW1lIiwgInNleCIsICJpc2NlZF9jYXQiLCAiYWdlIikNCmRlcHMgPC0gYygicGVyc19pbXAiKQ0KDQplYl9saXN0X3ByZWRzX3BlcnNfaW1wIDwtIGxpc3QoKQ0KDQojIExvb3AgdGhyb3VnaCBlYWNoIGRlcGVuZGVudCB2YXJpYWJsZQ0KICBmb3IgKGkgaW4gMTpsZW5ndGgoZGVwcykpIHsNCiAgIyBTcGVjaWZ5IHRoZSBzaWdtYSBmb3JtdWxhDQogIHNpZ21hLmZvcm11bGEgPC0gYXMuZm9ybXVsYShwYXN0ZSgifiIsIHBhc3RlKHByZWRpY3RvcnMsIGNvbGxhcHNlID0gIiArICIpKSkNCiAgIyBQZXJmb3JtIHRoZSBsaW5lYXIgcmVncmVzc2lvbg0KICBlYl9maXQgPC0gZ2FtbHNzKGFzLmZvcm11bGEocGFzdGUoZGVwc1tpXSwgIn4iLCBwYXN0ZShwcmVkaWN0b3JzLCBjb2xsYXBzZSA9ICIgKyAiKSkpLCBzaWdtYS5mb3JtdWxhID0gc2lnbWEuZm9ybXVsYSwNCiAgICAgICAgICAgICAgICAgICBmYW1pbHk9Tk8obXUubGluayA9ICJpZGVudGl0eSIsIHNpZ21hLmxpbmsgPSAiaWRlbnRpdHkiKSwgZGF0YSA9IGViX2NvbXBsZXRlLCB3ZWlnaHRzID0gd2VpZ2h0dmVjKQ0KICANCiAgZWJfbGlzdF9wcmVkc19wZXJzX2ltcFtbaV1dIDwtIGViX2ZpdA0KfSANCg0Kc3VtbWFyeShlYl9saXN0X3ByZWRzX3BlcnNfaW1wW1sxXV0pIA0KDQpzYXZlKGViX2xpc3RfcHJlZHNfcGVyc19pbXAsIGZpbGU9Ii4vZGF0YS9maW5hbF9kYXRhL3JlZ3Jlc3Npb25fb3V0cHV0cy9lYl9saXN0X3ByZWRzX3BlcnNfaW1wX3dfbmV3LlJEYXRhIikNCg0KIyBBbmQgdGhlIG1vZGVsIHdpdGggaW50ZXJhY3Rpb25zDQplYl9jb21wbGV0ZSRhZ2VfdGltZSA8LSBlYl9jb21wbGV0ZSRhZ2UgKiBlYl9jb21wbGV0ZSR0aW1lDQplYl9jb21wbGV0ZSRzZXhfdGltZSA8LSBhcy5udW1lcmljKGViX2NvbXBsZXRlJHNleCkgKiBlYl9jb21wbGV0ZSR0aW1lDQplYl9jb21wbGV0ZSA8LSBmYXN0RHVtbWllczo6ZHVtbXlfY29scyhlYl9jb21wbGV0ZSwgc2VsZWN0X2NvbHVtbnMgPSAiaXNjZWRfY2F0IikNCmViX2NvbXBsZXRlJGlzY2VkX2Jhc2ljX3RpbWUgPC0gZWJfY29tcGxldGUkaXNjZWRfY2F0X0Jhc2ljICogZWJfY29tcGxldGUkdGltZQ0KZWJfY29tcGxldGUkaXNjZWRfaW50ZXJtZWRpYXRlX3RpbWUgPC0gZWJfY29tcGxldGUkaXNjZWRfY2F0X0ludGVybWVkaWF0ZSAqIGViX2NvbXBsZXRlJHRpbWUNCmViX2NvbXBsZXRlJGlzY2VkX2FkdmFuY2VkX3RpbWUgPC0gZWJfY29tcGxldGUkaXNjZWRfY2F0X0FkdmFuY2VkICogZWJfY29tcGxldGUkdGltZQ0KDQppbnRlcmFjdGlvbnMgPC0gYygiYWdlX3RpbWUiLCAic2V4X3RpbWUiLCAiaXNjZWRfaW50ZXJtZWRpYXRlX3RpbWUiLCAiaXNjZWRfYWR2YW5jZWRfdGltZSIpDQoNCmViX2xpc3RfaW50ZXJhY3Rpb25zX3BlcnNfaW1wIDwtIGxpc3QoKQ0KDQogZm9yIChpIGluIDE6bGVuZ3RoKGRlcHMpKSB7DQogICMgU3BlY2lmeSB0aGUgc2lnbWEgZm9ybXVsYQ0KICBzaWdtYS5mb3JtdWxhIDwtIGFzLmZvcm11bGEocGFzdGUoIn4iLCBwYXN0ZShwcmVkaWN0b3JzLCBjb2xsYXBzZSA9ICIgKyAiKSwgIiArICIsIHBhc3RlKGludGVyYWN0aW9ucywgY29sbGFwc2UgPSAiICsgIikpKQ0KICAjIFBlcmZvcm0gdGhlIGxpbmVhciByZWdyZXNzaW9uDQogIGViX2ZpdCA8LSBnYW1sc3MoYXMuZm9ybXVsYShwYXN0ZShkZXBzW2ldLCAifiIsIHBhc3RlKHByZWRpY3RvcnMsIGNvbGxhcHNlID0gIiArICIpLCAiICsgIiwgcGFzdGUoaW50ZXJhY3Rpb25zLCBjb2xsYXBzZSA9ICIrICIpKSksIHNpZ21hLmZvcm11bGEgPSBzaWdtYS5mb3JtdWxhLCIgKyAiLCBmYW1pbHk9Tk8obXUubGluayA9ICJpZGVudGl0eSIsIHNpZ21hLmxpbmsgPSAiaWRlbnRpdHkiKSwgZGF0YSA9IGViX2NvbXBsZXRlLCB3ZWlnaHRzID0gd2VpZ2h0dmVjKQ0KICANCiAgZWJfbGlzdF9pbnRlcmFjdGlvbnNfcGVyc19pbXBbW2ldXSA8LSBlYl9maXQNCn0gDQoNCnN1bW1hcnkoZWJfbGlzdF9pbnRlcmFjdGlvbnNfcGVyc19pbXBbWzFdXSkgDQoNCnNhdmUoZWJfbGlzdF9pbnRlcmFjdGlvbnNfcGVyc19pbXAsIGZpbGU9Ii4vZGF0YS9maW5hbF9kYXRhL3JlZ3Jlc3Npb25fb3V0cHV0cy9lYl9saXN0X2ludGVyYWN0aW9uc19wZXJzX2ltcF93X25ldy5SRGF0YSIpDQpgYGANCg0KYGBge3J9DQojIFF1ZXN0aW9ucyBhYm91dCB3aG8gZG9lcyBlbm91Z2ggYXNrZWQgaW4gMyB3YXZlcw0KZWJfY29tcGxldGUgPC0gZWJfdG90ICU+JSBkcGx5cjo6c2VsZWN0KHN1cnZleXllYXIsIGRvcHJvdF9uYXRnb3Y6ZG9wcm90X2NpdGl6LCBzZXgsIGlzY2VkLCB1cmJhbiwgYWdlLCB3ZWlnaHR2ZWMsIGlzY2VkX2NhdCkNCmViX2NvbXBsZXRlIDwtIGViX2NvbXBsZXRlICU+JSBkcm9wX25hKCkNCmViX2NvbXBsZXRlJHRpbWUgPC0gZWJfY29tcGxldGUkc3VydmV5eWVhciAtIG1pbihlYl9jb21wbGV0ZSRzdXJ2ZXl5ZWFyKQ0KDQojIEZpcnN0IGVtcHR5IG1vZGVsIA0KcHJlZGljdG9ycyA8LSBjKCJ0aW1lIikNCmRlcHMgPC0gYygiZG9wcm90X25hdGdvdiIsICJkb3Byb3RfZXUiLCAiZG9wcm90X3JlZ2lvbiIsICJkb3Byb3RfY29tcCIsICJkb3Byb3RfY2l0aXoiKQ0KDQplYl9saXN0X2VtcHR5X2RvcHJvdCA8LSBsaXN0KCkNCg0KIyBMb29wIHRocm91Z2ggZWFjaCBkZXBlbmRlbnQgdmFyaWFibGUNCiAgZm9yIChpIGluIDE6bGVuZ3RoKGRlcHMpKSB7DQogICMgU3BlY2lmeSB0aGUgc2lnbWEgZm9ybXVsYQ0KICBzaWdtYS5mb3JtdWxhIDwtIGFzLmZvcm11bGEocGFzdGUoIn4iLCBwYXN0ZShwcmVkaWN0b3JzLCBjb2xsYXBzZSA9ICIgKyAiKSkpDQogICMgUGVyZm9ybSB0aGUgbGluZWFyIHJlZ3Jlc3Npb24NCiAgZWJfZml0IDwtIGdhbWxzcyhhcy5mb3JtdWxhKHBhc3RlKGRlcHNbaV0sICJ+IiwgcGFzdGUocHJlZGljdG9ycywgY29sbGFwc2UgPSAiICsgIikpKSwgc2lnbWEuZm9ybXVsYSA9IHNpZ21hLmZvcm11bGEsIGZhbWlseT1OTyhtdS5saW5rID0gImlkZW50aXR5Iiwgc2lnbWEubGluayA9ICJpZGVudGl0eSIpLCBkYXRhID0gZWJfY29tcGxldGUsIHdlaWdodHMgPSB3ZWlnaHR2ZWMpDQogIA0KICBlYl9saXN0X2VtcHR5X2RvcHJvdFtbaV1dIDwtIGViX2ZpdA0KfSANCg0Kc3VtbWFyeShlYl9saXN0X2VtcHR5X2RvcHJvdFtbMV1dKSANCg0Kc2F2ZShlYl9saXN0X2VtcHR5X2RvcHJvdCwgZmlsZT0iLi9kYXRhL2ZpbmFsX2RhdGEvcmVncmVzc2lvbl9vdXRwdXRzL2ViX2xpc3RfZW1wdHlfZG9wcm90X3cuUkRhdGEiKQ0KDQojIE1vZGVsIHdpdGggcHJlZGljdG9ycw0KcHJlZGljdG9ycyA8LSBjKCJ0aW1lIiwgInNleCIsICJpc2NlZF9jYXQiLCAiYWdlIikNCmRlcHMgPC0gYygiZG9wcm90X25hdGdvdiIsICJkb3Byb3RfZXUiLCAiZG9wcm90X3JlZ2lvbiIsICJkb3Byb3RfY29tcCIsICJkb3Byb3RfY2l0aXoiKQ0KDQplYl9saXN0X3ByZWRzX2RvcHJvdCA8LSBsaXN0KCkNCg0KIyBMb29wIHRocm91Z2ggZWFjaCBkZXBlbmRlbnQgdmFyaWFibGUNCiAgZm9yIChpIGluIDE6bGVuZ3RoKGRlcHMpKSB7DQogICMgU3BlY2lmeSB0aGUgc2lnbWEgZm9ybXVsYQ0KICBzaWdtYS5mb3JtdWxhIDwtIGFzLmZvcm11bGEocGFzdGUoIn4iLCBwYXN0ZShwcmVkaWN0b3JzLCBjb2xsYXBzZSA9ICIgKyAiKSkpDQogICMgUGVyZm9ybSB0aGUgbGluZWFyIHJlZ3Jlc3Npb24NCiAgZWJfZml0IDwtIGdhbWxzcyhhcy5mb3JtdWxhKHBhc3RlKGRlcHNbaV0sICJ+IiwgcGFzdGUocHJlZGljdG9ycywgY29sbGFwc2UgPSAiICsgIikpKSwgc2lnbWEuZm9ybXVsYSA9IHNpZ21hLmZvcm11bGEsIGZhbWlseT1OTyhtdS5saW5rID0gImlkZW50aXR5Iiwgc2lnbWEubGluayA9ICJpZGVudGl0eSIpLCBkYXRhID0gZWJfY29tcGxldGUsIHdlaWdodHMgPSB3ZWlnaHR2ZWMpDQogIA0KICBlYl9saXN0X3ByZWRzX2RvcHJvdFtbaV1dIDwtIGViX2ZpdA0KfSANCg0Kc3VtbWFyeShlYl9saXN0X3ByZWRzX2RvcHJvdFtbMV1dKSANCg0Kc2F2ZShlYl9saXN0X3ByZWRzX2RvcHJvdCwgZmlsZT0iLi9kYXRhL2ZpbmFsX2RhdGEvcmVncmVzc2lvbl9vdXRwdXRzL2ViX2xpc3RfcHJlZHNfZG9wcm90X3dfbmV3LlJEYXRhIikNCg0KIyBBbmQgdGhlIG1vZGVsIHdpdGggaW50ZXJhY3Rpb25zDQplYl9jb21wbGV0ZSRhZ2VfdGltZSA8LSBlYl9jb21wbGV0ZSRhZ2UgKiBlYl9jb21wbGV0ZSR0aW1lDQplYl9jb21wbGV0ZSRzZXhfdGltZSA8LSBhcy5udW1lcmljKGViX2NvbXBsZXRlJHNleCkgKiBlYl9jb21wbGV0ZSR0aW1lDQplYl9jb21wbGV0ZSA8LSBmYXN0RHVtbWllczo6ZHVtbXlfY29scyhlYl9jb21wbGV0ZSwgc2VsZWN0X2NvbHVtbnMgPSAiaXNjZWRfY2F0IikNCmViX2NvbXBsZXRlJGlzY2VkX2Jhc2ljX3RpbWUgPC0gZWJfY29tcGxldGUkaXNjZWRfY2F0X0Jhc2ljICogZWJfY29tcGxldGUkdGltZQ0KZWJfY29tcGxldGUkaXNjZWRfaW50ZXJtZWRpYXRlX3RpbWUgPC0gZWJfY29tcGxldGUkaXNjZWRfY2F0X0ludGVybWVkaWF0ZSAqIGViX2NvbXBsZXRlJHRpbWUNCmViX2NvbXBsZXRlJGlzY2VkX2FkdmFuY2VkX3RpbWUgPC0gZWJfY29tcGxldGUkaXNjZWRfY2F0X0FkdmFuY2VkICogZWJfY29tcGxldGUkdGltZQ0KDQppbnRlcmFjdGlvbnMgPC0gYygiYWdlX3RpbWUiLCAic2V4X3RpbWUiLCAiaXNjZWRfaW50ZXJtZWRpYXRlX3RpbWUiLCAiaXNjZWRfYWR2YW5jZWRfdGltZSIpDQoNCmViX2xpc3RfaW50ZXJhY3Rpb25zX2RvcHJvdCA8LSBsaXN0KCkNCg0KIGZvciAoaSBpbiAxOmxlbmd0aChkZXBzKSkgew0KICAjIFNwZWNpZnkgdGhlIHNpZ21hIGZvcm11bGENCiAgc2lnbWEuZm9ybXVsYSA8LSBhcy5mb3JtdWxhKHBhc3RlKCJ+IiwgcGFzdGUocHJlZGljdG9ycywgY29sbGFwc2UgPSAiICsgIiksICIgKyAiLCBwYXN0ZShpbnRlcmFjdGlvbnMsIGNvbGxhcHNlID0gIiArICIpKSkNCiAgIyBQZXJmb3JtIHRoZSBsaW5lYXIgcmVncmVzc2lvbg0KICBlYl9maXQgPC0gZ2FtbHNzKGFzLmZvcm11bGEocGFzdGUoZGVwc1tpXSwgIn4iLCBwYXN0ZShwcmVkaWN0b3JzLCBjb2xsYXBzZSA9ICIgKyAiKSwgIiArICIsIHBhc3RlKGludGVyYWN0aW9ucywgY29sbGFwc2UgPSAiKyAiKSkpLCBzaWdtYS5mb3JtdWxhID0gc2lnbWEuZm9ybXVsYSwiICsgIiwgZmFtaWx5PU5PKG11LmxpbmsgPSAiaWRlbnRpdHkiLCBzaWdtYS5saW5rID0gImlkZW50aXR5IiksIGRhdGEgPSBlYl9jb21wbGV0ZSwgd2VpZ2h0cyA9IHdlaWdodHZlYykNCiAgDQogIGViX2xpc3RfaW50ZXJhY3Rpb25zX2RvcHJvdFtbaV1dIDwtIGViX2ZpdA0KfSANCg0Kc3VtbWFyeShlYl9saXN0X2ludGVyYWN0aW9uc19kb3Byb3RbWzFdXSkgDQoNCnNhdmUoZWJfbGlzdF9pbnRlcmFjdGlvbnNfZG9wcm90LCBmaWxlPSIuL2RhdGEvZmluYWxfZGF0YS9yZWdyZXNzaW9uX291dHB1dHMvZWJfbGlzdF9pbnRlcmFjdGlvbnNfZG9wcm90X3dfbmV3LlJEYXRhIikNCmBgYA0KDQpgYGB7cn0NCiMgUXVlc3Rpb25zIGFib3V0IGVudmlyb25tZW50IGFza2VkIGluIDIgd2F2ZXMNCmViX2NvbXBsZXRlIDwtIGViX3RvdCAlPiUgZHBseXI6OnNlbGVjdChzdXJ2ZXl5ZWFyLCBlbnZwX2VnLCBlZmZyX2VnLCBzZXgsIGlzY2VkLCB1cmJhbiwgYWdlLCB3ZWlnaHR2ZWMsIGlzY2VkX2NhdCkNCmViX2NvbXBsZXRlIDwtIGViX2NvbXBsZXRlICU+JSBkcm9wX25hKCkNCmViX2NvbXBsZXRlJHRpbWUgPC0gZWJfY29tcGxldGUkc3VydmV5eWVhciAtIG1pbihlYl9jb21wbGV0ZSRzdXJ2ZXl5ZWFyKQ0KDQojIEZpcnN0IGVtcHR5IG1vZGVsIA0KcHJlZGljdG9ycyA8LSBjKCJ0aW1lIikNCmRlcHMgPC0gYygiZW52cF9lZyIsICJlZmZyX2VnIikNCg0KZWJfbGlzdF9lbXB0eV8yMDExIDwtIGxpc3QoKQ0KDQojIExvb3AgdGhyb3VnaCBlYWNoIGRlcGVuZGVudCB2YXJpYWJsZQ0KICBmb3IgKGkgaW4gMTpsZW5ndGgoZGVwcykpIHsNCiAgIyBTcGVjaWZ5IHRoZSBzaWdtYSBmb3JtdWxhDQogIHNpZ21hLmZvcm11bGEgPC0gYXMuZm9ybXVsYShwYXN0ZSgifiIsIHBhc3RlKHByZWRpY3RvcnMsIGNvbGxhcHNlID0gIiArICIpKSkNCiAgIyBQZXJmb3JtIHRoZSBsaW5lYXIgcmVncmVzc2lvbg0KICBlYl9maXQgPC0gZ2FtbHNzKGFzLmZvcm11bGEocGFzdGUoZGVwc1tpXSwgIn4iLCBwYXN0ZShwcmVkaWN0b3JzLCBjb2xsYXBzZSA9ICIgKyAiKSkpLCBzaWdtYS5mb3JtdWxhID0gc2lnbWEuZm9ybXVsYSwgZmFtaWx5PU5PKG11LmxpbmsgPSAiaWRlbnRpdHkiLCBzaWdtYS5saW5rID0gImlkZW50aXR5IiksIGRhdGEgPSBlYl9jb21wbGV0ZSwgd2VpZ2h0cyA9IHdlaWdodHZlYykNCiAgDQogIGViX2xpc3RfZW1wdHlfMjAxMVtbaV1dIDwtIGViX2ZpdA0KfSANCg0Kc3VtbWFyeShlYl9saXN0X2VtcHR5XzIwMTFbWzFdXSkgDQoNCnNhdmUoZWJfbGlzdF9lbXB0eV8yMDExLCBmaWxlPSIuL2RhdGEvZmluYWxfZGF0YS9yZWdyZXNzaW9uX291dHB1dHMvZWJfbGlzdF9lbXB0eV8yMDExX3cuUkRhdGEiKQ0KDQojIE1vZGVsIHdpdGggcHJlZGljdG9ycw0KcHJlZGljdG9ycyA8LSBjKCJ0aW1lIiwgInNleCIsICJpc2NlZF9jYXQiLCAiYWdlIikNCmRlcHMgPC0gYygiZW52cF9lZyIsICJlZmZyX2VnIikNCg0KZWJfbGlzdF9wcmVkc18yMDExIDwtIGxpc3QoKQ0KDQojIExvb3AgdGhyb3VnaCBlYWNoIGRlcGVuZGVudCB2YXJpYWJsZQ0KICBmb3IgKGkgaW4gMTpsZW5ndGgoZGVwcykpIHsNCiAgIyBTcGVjaWZ5IHRoZSBzaWdtYSBmb3JtdWxhDQogIHNpZ21hLmZvcm11bGEgPC0gYXMuZm9ybXVsYShwYXN0ZSgifiIsIHBhc3RlKHByZWRpY3RvcnMsIGNvbGxhcHNlID0gIiArICIpKSkNCiAgIyBQZXJmb3JtIHRoZSBsaW5lYXIgcmVncmVzc2lvbg0KICBlYl9maXQgPC0gZ2FtbHNzKGFzLmZvcm11bGEocGFzdGUoZGVwc1tpXSwgIn4iLCBwYXN0ZShwcmVkaWN0b3JzLCBjb2xsYXBzZSA9ICIgKyAiKSkpLCBzaWdtYS5mb3JtdWxhID0gc2lnbWEuZm9ybXVsYSwgZmFtaWx5PU5PKG11LmxpbmsgPSAiaWRlbnRpdHkiLCBzaWdtYS5saW5rID0gImlkZW50aXR5IiksIGRhdGEgPSBlYl9jb21wbGV0ZSwgd2VpZ2h0cyA9IHdlaWdodHZlYykNCiAgDQogIGViX2xpc3RfcHJlZHNfMjAxMVtbaV1dIDwtIGViX2ZpdA0KfSANCg0Kc3VtbWFyeShlYl9saXN0X3ByZWRzXzIwMTFbWzFdXSkgDQoNCnNhdmUoZWJfbGlzdF9wcmVkc18yMDExLCBmaWxlPSIuL2RhdGEvZmluYWxfZGF0YS9yZWdyZXNzaW9uX291dHB1dHMvZWJfbGlzdF9wcmVkc18yMDExX3dfbmV3LlJEYXRhIikNCg0KIyBBbmQgdGhlIG1vZGVsIHdpdGggaW50ZXJhY3Rpb25zDQplYl9jb21wbGV0ZSRhZ2VfdGltZSA8LSBlYl9jb21wbGV0ZSRhZ2UgKiBlYl9jb21wbGV0ZSR0aW1lDQplYl9jb21wbGV0ZSRzZXhfdGltZSA8LSBhcy5udW1lcmljKGViX2NvbXBsZXRlJHNleCkgKiBlYl9jb21wbGV0ZSR0aW1lDQplYl9jb21wbGV0ZSA8LSBmYXN0RHVtbWllczo6ZHVtbXlfY29scyhlYl9jb21wbGV0ZSwgc2VsZWN0X2NvbHVtbnMgPSAiaXNjZWRfY2F0IikNCmViX2NvbXBsZXRlJGlzY2VkX2Jhc2ljX3RpbWUgPC0gZWJfY29tcGxldGUkaXNjZWRfY2F0X0Jhc2ljICogZWJfY29tcGxldGUkdGltZQ0KZWJfY29tcGxldGUkaXNjZWRfaW50ZXJtZWRpYXRlX3RpbWUgPC0gZWJfY29tcGxldGUkaXNjZWRfY2F0X0ludGVybWVkaWF0ZSAqIGViX2NvbXBsZXRlJHRpbWUNCmViX2NvbXBsZXRlJGlzY2VkX2FkdmFuY2VkX3RpbWUgPC0gZWJfY29tcGxldGUkaXNjZWRfY2F0X0FkdmFuY2VkICogZWJfY29tcGxldGUkdGltZQ0KDQppbnRlcmFjdGlvbnMgPC0gYygiYWdlX3RpbWUiLCAic2V4X3RpbWUiLCAiaXNjZWRfaW50ZXJtZWRpYXRlX3RpbWUiLCAiaXNjZWRfYWR2YW5jZWRfdGltZSIpDQoNCmViX2xpc3RfaW50ZXJhY3Rpb25zXzIwMTEgPC0gbGlzdCgpDQoNCiBmb3IgKGkgaW4gMTpsZW5ndGgoZGVwcykpIHsNCiAgIyBTcGVjaWZ5IHRoZSBzaWdtYSBmb3JtdWxhDQogIHNpZ21hLmZvcm11bGEgPC0gYXMuZm9ybXVsYShwYXN0ZSgifiIsIHBhc3RlKHByZWRpY3RvcnMsIGNvbGxhcHNlID0gIiArICIpLCAiICsgIiwgcGFzdGUoaW50ZXJhY3Rpb25zLCBjb2xsYXBzZSA9ICIgKyAiKSkpDQogICMgUGVyZm9ybSB0aGUgbGluZWFyIHJlZ3Jlc3Npb24NCiAgZWJfZml0IDwtIGdhbWxzcyhhcy5mb3JtdWxhKHBhc3RlKGRlcHNbaV0sICJ+IiwgcGFzdGUocHJlZGljdG9ycywgY29sbGFwc2UgPSAiICsgIiksICIgKyAiLCBwYXN0ZShpbnRlcmFjdGlvbnMsIGNvbGxhcHNlID0gIisgIikpKSwgc2lnbWEuZm9ybXVsYSA9IHNpZ21hLmZvcm11bGEsIiArICIsIGZhbWlseT1OTyhtdS5saW5rID0gImlkZW50aXR5Iiwgc2lnbWEubGluayA9ICJpZGVudGl0eSIpLCBkYXRhID0gZWJfY29tcGxldGUsIHdlaWdodHMgPSB3ZWlnaHR2ZWMpDQogIA0KICBlYl9saXN0X2ludGVyYWN0aW9uc18yMDExW1tpXV0gPC0gZWJfZml0DQp9IA0KDQpzdW1tYXJ5KGViX2xpc3RfaW50ZXJhY3Rpb25zXzIwMTFbWzFdXSkgDQoNCnNhdmUoZWJfbGlzdF9pbnRlcmFjdGlvbnNfMjAxMSwgZmlsZT0iLi9kYXRhL2ZpbmFsX2RhdGEvcmVncmVzc2lvbl9vdXRwdXRzL2ViX2xpc3RfaW50ZXJhY3Rpb25zXzIwMTFfd19uZXcuUkRhdGEiKQ0KYGBgDQoNCmBgYHtyfQ0KIyBRdWVzdGlvbnMgYWJvdXQgbmFtaW5nIGNsaW1hdGUgY2hhbmdlIGEgcHJvYmxlbQ0KZWJfY29tcGxldGUgPC0gZWJfdG90ICU+JSBkcGx5cjo6c2VsZWN0KHN1cnZleXllYXIsIGNjaGFuZ2UyLCBjY2hhbmdldG90LCBzZXgsIGlzY2VkLCB1cmJhbiwgYWdlLCB3ZWlnaHR2ZWMsIGlzY2VkX2NhdCkNCmViX2NvbXBsZXRlIDwtIGViX2NvbXBsZXRlICU+JSBkcm9wX25hKCkNCmViX2NvbXBsZXRlJHRpbWUgPC0gZWJfY29tcGxldGUkc3VydmV5eWVhciAtIG1pbihlYl9jb21wbGV0ZSRzdXJ2ZXl5ZWFyKQ0KDQojIEZpcnN0IGVtcHR5IG1vZGVsIA0KcHJlZGljdG9ycyA8LSBjKCJ0aW1lIikNCmRlcHMgPC0gYygiY2NoYW5nZTIiLCAiY2NoYW5nZXRvdCIpDQoNCmViX2xpc3RfZW1wdHlfY2NoYW5nZTIgPC0gbGlzdCgpDQoNCiMgTG9vcCB0aHJvdWdoIGVhY2ggZGVwZW5kZW50IHZhcmlhYmxlDQogIGZvciAoaSBpbiAxOmxlbmd0aChkZXBzKSkgew0KICAjIFNwZWNpZnkgdGhlIHNpZ21hIGZvcm11bGENCiAgc2lnbWEuZm9ybXVsYSA8LSBhcy5mb3JtdWxhKHBhc3RlKCJ+IiwgcGFzdGUocHJlZGljdG9ycywgY29sbGFwc2UgPSAiICsgIikpKQ0KICAjIFBlcmZvcm0gdGhlIGxpbmVhciByZWdyZXNzaW9uDQogIGViX2ZpdCA8LSBnYW1sc3MoYXMuZm9ybXVsYShwYXN0ZShkZXBzW2ldLCAifiIsIHBhc3RlKHByZWRpY3RvcnMsIGNvbGxhcHNlID0gIiArICIpKSksIHNpZ21hLmZvcm11bGEgPSBzaWdtYS5mb3JtdWxhLCBmYW1pbHk9Tk8obXUubGluayA9ICJpZGVudGl0eSIsIHNpZ21hLmxpbmsgPSAiaWRlbnRpdHkiKSwgZGF0YSA9IGViX2NvbXBsZXRlLCB3ZWlnaHRzID0gd2VpZ2h0dmVjKQ0KICANCiAgZWJfbGlzdF9lbXB0eV9jY2hhbmdlMltbaV1dIDwtIGViX2ZpdA0KfSANCg0Kc3VtbWFyeShlYl9saXN0X2VtcHR5X2NjaGFuZ2UyW1sxXV0pIA0KDQpzYXZlKGViX2xpc3RfZW1wdHlfY2NoYW5nZTIsIGZpbGU9Ii4vZGF0YS9maW5hbF9kYXRhL3JlZ3Jlc3Npb25fb3V0cHV0cy9lYl9saXN0X2VtcHR5X2NjaGFuZ2UyX3cuUkRhdGEiKQ0KDQojIE1vZGVsIHdpdGggcHJlZGljdG9ycw0KcHJlZGljdG9ycyA8LSBjKCJ0aW1lIiwgInNleCIsICJpc2NlZF9jYXQiLCAiYWdlIikNCmRlcHMgPC0gYygiY2NoYW5nZTIiLCAiY2NoYW5nZXRvdCIpDQoNCmViX2xpc3RfcHJlZHNfY2NoYW5nZTIgPC0gbGlzdCgpDQoNCiMgTG9vcCB0aHJvdWdoIGVhY2ggZGVwZW5kZW50IHZhcmlhYmxlDQogIGZvciAoaSBpbiAxOmxlbmd0aChkZXBzKSkgew0KICAjIFNwZWNpZnkgdGhlIHNpZ21hIGZvcm11bGENCiAgc2lnbWEuZm9ybXVsYSA8LSBhcy5mb3JtdWxhKHBhc3RlKCJ+IiwgcGFzdGUocHJlZGljdG9ycywgY29sbGFwc2UgPSAiICsgIikpKQ0KICAjIFBlcmZvcm0gdGhlIGxpbmVhciByZWdyZXNzaW9uDQogIGViX2ZpdCA8LSBnYW1sc3MoYXMuZm9ybXVsYShwYXN0ZShkZXBzW2ldLCAifiIsIHBhc3RlKHByZWRpY3RvcnMsIGNvbGxhcHNlID0gIiArICIpKSksIHNpZ21hLmZvcm11bGEgPSBzaWdtYS5mb3JtdWxhLA0KICAgICAgICAgICAgICAgICAgIGZhbWlseT1OTyhtdS5saW5rID0gImlkZW50aXR5Iiwgc2lnbWEubGluayA9ICJpZGVudGl0eSIpLCBkYXRhID0gZWJfY29tcGxldGUsIHdlaWdodHMgPSB3ZWlnaHR2ZWMpDQogIA0KICBlYl9saXN0X3ByZWRzX2NjaGFuZ2UyW1tpXV0gPC0gZWJfZml0DQp9IA0KDQpzdW1tYXJ5KGViX2xpc3RfcHJlZHNfY2NoYW5nZTJbWzFdXSkgDQoNCnNhdmUoZWJfbGlzdF9wcmVkc19jY2hhbmdlMiwgZmlsZT0iLi9kYXRhL2ZpbmFsX2RhdGEvcmVncmVzc2lvbl9vdXRwdXRzL2ViX2xpc3RfcHJlZHNfY2NoYW5nZTJfd19uZXcuUkRhdGEiKQ0KDQojIEFuZCB0aGUgbW9kZWwgd2l0aCBpbnRlcmFjdGlvbnMNCmViX2NvbXBsZXRlJGFnZV90aW1lIDwtIGViX2NvbXBsZXRlJGFnZSAqIGViX2NvbXBsZXRlJHRpbWUNCmViX2NvbXBsZXRlJHNleF90aW1lIDwtIGFzLm51bWVyaWMoZWJfY29tcGxldGUkc2V4KSAqIGViX2NvbXBsZXRlJHRpbWUNCmViX2NvbXBsZXRlIDwtIGZhc3REdW1taWVzOjpkdW1teV9jb2xzKGViX2NvbXBsZXRlLCBzZWxlY3RfY29sdW1ucyA9ICJpc2NlZF9jYXQiKQ0KZWJfY29tcGxldGUkaXNjZWRfYmFzaWNfdGltZSA8LSBlYl9jb21wbGV0ZSRpc2NlZF9jYXRfQmFzaWMgKiBlYl9jb21wbGV0ZSR0aW1lDQplYl9jb21wbGV0ZSRpc2NlZF9pbnRlcm1lZGlhdGVfdGltZSA8LSBlYl9jb21wbGV0ZSRpc2NlZF9jYXRfSW50ZXJtZWRpYXRlICogZWJfY29tcGxldGUkdGltZQ0KZWJfY29tcGxldGUkaXNjZWRfYWR2YW5jZWRfdGltZSA8LSBlYl9jb21wbGV0ZSRpc2NlZF9jYXRfQWR2YW5jZWQgKiBlYl9jb21wbGV0ZSR0aW1lDQoNCmludGVyYWN0aW9ucyA8LSBjKCJhZ2VfdGltZSIsICJzZXhfdGltZSIsICJpc2NlZF9pbnRlcm1lZGlhdGVfdGltZSIsICJpc2NlZF9hZHZhbmNlZF90aW1lIikNCg0KZWJfbGlzdF9pbnRlcmFjdGlvbnNfY2NoYW5nZTIgPC0gbGlzdCgpDQoNCiBmb3IgKGkgaW4gMTpsZW5ndGgoZGVwcykpIHsNCiAgIyBTcGVjaWZ5IHRoZSBzaWdtYSBmb3JtdWxhDQogIHNpZ21hLmZvcm11bGEgPC0gYXMuZm9ybXVsYShwYXN0ZSgifiIsIHBhc3RlKHByZWRpY3RvcnMsIGNvbGxhcHNlID0gIiArICIpLCAiICsgIiwgcGFzdGUoaW50ZXJhY3Rpb25zLCBjb2xsYXBzZSA9ICIgKyAiKSkpDQogICMgUGVyZm9ybSB0aGUgbGluZWFyIHJlZ3Jlc3Npb24NCiAgZWJfZml0IDwtIGdhbWxzcyhhcy5mb3JtdWxhKHBhc3RlKGRlcHNbaV0sICJ+IiwgcGFzdGUocHJlZGljdG9ycywgY29sbGFwc2UgPSAiICsgIiksICIgKyAiLCBwYXN0ZShpbnRlcmFjdGlvbnMsIGNvbGxhcHNlID0gIisgIikpKSwgc2lnbWEuZm9ybXVsYSA9IHNpZ21hLmZvcm11bGEsIiArICIsIGZhbWlseT1OTyhtdS5saW5rID0gImlkZW50aXR5Iiwgc2lnbWEubGluayA9ICJpZGVudGl0eSIpLCBkYXRhID0gZWJfY29tcGxldGUsIHdlaWdodHMgPSB3ZWlnaHR2ZWMpDQogIA0KICBlYl9saXN0X2ludGVyYWN0aW9uc19jY2hhbmdlMltbaV1dIDwtIGViX2ZpdA0KfSANCg0Kc3VtbWFyeShlYl9saXN0X2ludGVyYWN0aW9uc19jY2hhbmdlMltbMV1dKSANCg0Kc2F2ZShlYl9saXN0X2ludGVyYWN0aW9uc19jY2hhbmdlMiwgZmlsZT0iLi9kYXRhL2ZpbmFsX2RhdGEvcmVncmVzc2lvbl9vdXRwdXRzL2ViX2xpc3RfaW50ZXJhY3Rpb25zX2NjaGFuZ2UyX3dfbmV3LlJEYXRhIikNCmBgYA0KDQpgYGB7cn0NCiMgUXVlc3Rpb24gYWJvdXQgcGVyc29uYWwgYWN0aW9uIHRha2VuDQplYl9jb21wbGV0ZSA8LSBlYl90b3QgJT4lIGRwbHlyOjpzZWxlY3Qoc3VydmV5eWVhciwgcHJzYWN0aW9uLCBzZXgsIGlzY2VkLCB1cmJhbiwgYWdlLCB3ZWlnaHR2ZWMsIGlzY2VkX2NhdCkNCmViX2NvbXBsZXRlIDwtIGViX2NvbXBsZXRlICU+JSBkcm9wX25hKCkNCmViX2NvbXBsZXRlJHRpbWUgPC0gZWJfY29tcGxldGUkc3VydmV5eWVhciAtIG1pbihlYl9jb21wbGV0ZSRzdXJ2ZXl5ZWFyKQ0KDQojIEZpcnN0IGVtcHR5IG1vZGVsIA0KcHJlZGljdG9ycyA8LSBjKCJ0aW1lIikNCmRlcHMgPC0gYygicHJzYWN0aW9uIikNCg0KZWJfbGlzdF9lbXB0eV9wcnNhY3Rpb24gPC0gbGlzdCgpDQoNCiMgTG9vcCB0aHJvdWdoIGVhY2ggZGVwZW5kZW50IHZhcmlhYmxlDQogIGZvciAoaSBpbiAxOmxlbmd0aChkZXBzKSkgew0KICAjIFNwZWNpZnkgdGhlIHNpZ21hIGZvcm11bGENCiAgc2lnbWEuZm9ybXVsYSA8LSBhcy5mb3JtdWxhKHBhc3RlKCJ+IiwgcGFzdGUocHJlZGljdG9ycywgY29sbGFwc2UgPSAiICsgIikpKQ0KICAjIFBlcmZvcm0gdGhlIGxpbmVhciByZWdyZXNzaW9uDQogIGViX2ZpdCA8LSBnYW1sc3MoYXMuZm9ybXVsYShwYXN0ZShkZXBzW2ldLCAifiIsIHBhc3RlKHByZWRpY3RvcnMsIGNvbGxhcHNlID0gIiArICIpKSksIHNpZ21hLmZvcm11bGEgPSBzaWdtYS5mb3JtdWxhLCBmYW1pbHk9Tk8obXUubGluayA9ICJpZGVudGl0eSIsIHNpZ21hLmxpbmsgPSAiaWRlbnRpdHkiKSwgZGF0YSA9IGViX2NvbXBsZXRlLCB3ZWlnaHRzID0gd2VpZ2h0dmVjKQ0KICANCiAgZWJfbGlzdF9lbXB0eV9wcnNhY3Rpb25bW2ldXSA8LSBlYl9maXQNCn0gDQoNCnN1bW1hcnkoZWJfbGlzdF9lbXB0eV9wcnNhY3Rpb25bWzFdXSkgDQoNCnNhdmUoZWJfbGlzdF9lbXB0eV9wcnNhY3Rpb24sIGZpbGU9Ii4vZGF0YS9maW5hbF9kYXRhL3JlZ3Jlc3Npb25fb3V0cHV0cy9lYl9saXN0X2VtcHR5X3Byc2FjdGlvbl93LlJEYXRhIikNCg0KIyBNb2RlbCB3aXRoIHByZWRpY3RvcnMNCnByZWRpY3RvcnMgPC0gYygidGltZSIsICJzZXgiLCAiaXNjZWRfY2F0IiwgImFnZSIpDQpkZXBzIDwtIGMoInByc2FjdGlvbiIpDQoNCmViX2xpc3RfcHJlZHNfcHJzYWN0aW9uIDwtIGxpc3QoKQ0KDQojIExvb3AgdGhyb3VnaCBlYWNoIGRlcGVuZGVudCB2YXJpYWJsZQ0KICBmb3IgKGkgaW4gMTpsZW5ndGgoZGVwcykpIHsNCiAgIyBTcGVjaWZ5IHRoZSBzaWdtYSBmb3JtdWxhDQogIHNpZ21hLmZvcm11bGEgPC0gYXMuZm9ybXVsYShwYXN0ZSgifiIsIHBhc3RlKHByZWRpY3RvcnMsIGNvbGxhcHNlID0gIiArICIpKSkNCiAgIyBQZXJmb3JtIHRoZSBsaW5lYXIgcmVncmVzc2lvbg0KICBlYl9maXQgPC0gZ2FtbHNzKGFzLmZvcm11bGEocGFzdGUoZGVwc1tpXSwgIn4iLCBwYXN0ZShwcmVkaWN0b3JzLCBjb2xsYXBzZSA9ICIgKyAiKSkpLCBzaWdtYS5mb3JtdWxhID0gc2lnbWEuZm9ybXVsYSwgZmFtaWx5PU5PKG11LmxpbmsgPSAiaWRlbnRpdHkiLCBzaWdtYS5saW5rID0gImlkZW50aXR5IiksIGRhdGEgPSBlYl9jb21wbGV0ZSwgd2VpZ2h0cyA9IHdlaWdodHZlYykNCiAgDQogIGViX2xpc3RfcHJlZHNfcHJzYWN0aW9uW1tpXV0gPC0gZWJfZml0DQp9IA0KDQpzdW1tYXJ5KGViX2xpc3RfcHJlZHNfcHJzYWN0aW9uW1sxXV0pIA0KDQpzYXZlKGViX2xpc3RfcHJlZHNfcHJzYWN0aW9uLCBmaWxlPSIuL2RhdGEvZmluYWxfZGF0YS9yZWdyZXNzaW9uX291dHB1dHMvZWJfbGlzdF9wcmVkc19wcnNhY3Rpb25fd19uZXcuUkRhdGEiKQ0KDQojIEFuZCB0aGUgbW9kZWwgd2l0aCBpbnRlcmFjdGlvbnMNCmViX2NvbXBsZXRlJGFnZV90aW1lIDwtIGViX2NvbXBsZXRlJGFnZSAqIGViX2NvbXBsZXRlJHRpbWUNCmViX2NvbXBsZXRlJHNleF90aW1lIDwtIGFzLm51bWVyaWMoZWJfY29tcGxldGUkc2V4KSAqIGViX2NvbXBsZXRlJHRpbWUNCmViX2NvbXBsZXRlIDwtIGZhc3REdW1taWVzOjpkdW1teV9jb2xzKGViX2NvbXBsZXRlLCBzZWxlY3RfY29sdW1ucyA9ICJpc2NlZF9jYXQiKQ0KZWJfY29tcGxldGUkaXNjZWRfYmFzaWNfdGltZSA8LSBlYl9jb21wbGV0ZSRpc2NlZF9jYXRfQmFzaWMgKiBlYl9jb21wbGV0ZSR0aW1lDQplYl9jb21wbGV0ZSRpc2NlZF9pbnRlcm1lZGlhdGVfdGltZSA8LSBlYl9jb21wbGV0ZSRpc2NlZF9jYXRfSW50ZXJtZWRpYXRlICogZWJfY29tcGxldGUkdGltZQ0KZWJfY29tcGxldGUkaXNjZWRfYWR2YW5jZWRfdGltZSA8LSBlYl9jb21wbGV0ZSRpc2NlZF9jYXRfQWR2YW5jZWQgKiBlYl9jb21wbGV0ZSR0aW1lDQoNCmludGVyYWN0aW9ucyA8LSBjKCJhZ2VfdGltZSIsICJzZXhfdGltZSIsICJpc2NlZF9pbnRlcm1lZGlhdGVfdGltZSIsICJpc2NlZF9hZHZhbmNlZF90aW1lIikNCg0KZWJfbGlzdF9pbnRlcmFjdGlvbnNfcHJzYWN0aW9uIDwtIGxpc3QoKQ0KDQogZm9yIChpIGluIDE6bGVuZ3RoKGRlcHMpKSB7DQogICMgU3BlY2lmeSB0aGUgc2lnbWEgZm9ybXVsYQ0KICBzaWdtYS5mb3JtdWxhIDwtIGFzLmZvcm11bGEocGFzdGUoIn4iLCBwYXN0ZShwcmVkaWN0b3JzLCBjb2xsYXBzZSA9ICIgKyAiKSwgIiArICIsIHBhc3RlKGludGVyYWN0aW9ucywgY29sbGFwc2UgPSAiICsgIikpKQ0KICAjIFBlcmZvcm0gdGhlIGxpbmVhciByZWdyZXNzaW9uDQogIGViX2ZpdCA8LSBnYW1sc3MoYXMuZm9ybXVsYShwYXN0ZShkZXBzW2ldLCAifiIsIHBhc3RlKHByZWRpY3RvcnMsIGNvbGxhcHNlID0gIiArICIpLCAiICsgIiwgcGFzdGUoaW50ZXJhY3Rpb25zLCBjb2xsYXBzZSA9ICIrICIpKSksIHNpZ21hLmZvcm11bGEgPSBzaWdtYS5mb3JtdWxhLCIgKyAiLCBmYW1pbHk9Tk8obXUubGluayA9ICJpZGVudGl0eSIsIHNpZ21hLmxpbmsgPSAiaWRlbnRpdHkiKSwgZGF0YSA9IGViX2NvbXBsZXRlLCB3ZWlnaHRzID0gd2VpZ2h0dmVjKQ0KICANCiAgZWJfbGlzdF9pbnRlcmFjdGlvbnNfcHJzYWN0aW9uW1tpXV0gPC0gZWJfZml0DQp9IA0KDQpzdW1tYXJ5KGViX2xpc3RfaW50ZXJhY3Rpb25zX3Byc2FjdGlvbltbMV1dKSANCg0Kc2F2ZShlYl9saXN0X2ludGVyYWN0aW9uc19wcnNhY3Rpb24sIGZpbGU9Ii4vZGF0YS9maW5hbF9kYXRhL3JlZ3Jlc3Npb25fb3V0cHV0cy9lYl9saXN0X2ludGVyYWN0aW9uc19wcnNhY3Rpb25fd19uZXcuUkRhdGEiKQ0KYGBgDQoNCmBgYHtyfQ0KIyBMYXN0IGl0ZW0sIHdoZXRoZXIgdGhlIGNpdHkgdW5kZXJ0YWtlcyBlbm91Z2ggYWN0aW9uDQplYl9jb21wbGV0ZSA8LSBlYl90b3QgJT4lIGRwbHlyOjpzZWxlY3Qoc3VydmV5eWVhciwgZG9wcm90X2NpdHksIHNleCwgaXNjZWQsIHVyYmFuLCBhZ2UsIHdlaWdodHZlYywgaXNjZWRfY2F0KQ0KZWJfY29tcGxldGUgPC0gZWJfY29tcGxldGUgJT4lIGRyb3BfbmEoKQ0KZWJfY29tcGxldGUkdGltZSA8LSBlYl9jb21wbGV0ZSRzdXJ2ZXl5ZWFyIC0gbWluKGViX2NvbXBsZXRlJHN1cnZleXllYXIpDQoNCiMgRmlyc3QgZW1wdHkgbW9kZWwgDQpwcmVkaWN0b3JzIDwtIGMoInRpbWUiKQ0KZGVwcyA8LSBjKCJkb3Byb3RfY2l0eSIpDQoNCmViX2xpc3RfZW1wdHlfZG9wcm90X2NpdHkgPC0gbGlzdCgpDQoNCiMgTG9vcCB0aHJvdWdoIGVhY2ggZGVwZW5kZW50IHZhcmlhYmxlDQogIGZvciAoaSBpbiAxOmxlbmd0aChkZXBzKSkgew0KICAjIFNwZWNpZnkgdGhlIHNpZ21hIGZvcm11bGENCiAgc2lnbWEuZm9ybXVsYSA8LSBhcy5mb3JtdWxhKHBhc3RlKCJ+IiwgcGFzdGUocHJlZGljdG9ycywgY29sbGFwc2UgPSAiICsgIikpKQ0KICAjIFBlcmZvcm0gdGhlIGxpbmVhciByZWdyZXNzaW9uDQogIGViX2ZpdCA8LSBnYW1sc3MoYXMuZm9ybXVsYShwYXN0ZShkZXBzW2ldLCAifiIsIHBhc3RlKHByZWRpY3RvcnMsIGNvbGxhcHNlID0gIiArICIpKSksIHNpZ21hLmZvcm11bGEgPSBzaWdtYS5mb3JtdWxhLCBmYW1pbHk9Tk8obXUubGluayA9ICJpZGVudGl0eSIsIHNpZ21hLmxpbmsgPSAiaWRlbnRpdHkiKSwgZGF0YSA9IGViX2NvbXBsZXRlLCB3ZWlnaHRzID0gd2VpZ2h0dmVjKQ0KICANCiAgZWJfbGlzdF9lbXB0eV9kb3Byb3RfY2l0eVtbaV1dIDwtIGViX2ZpdA0KfSANCg0Kc3VtbWFyeShlYl9saXN0X2VtcHR5X2RvcHJvdF9jaXR5W1sxXV0pIA0KDQpzYXZlKGViX2xpc3RfZW1wdHlfZG9wcm90X2NpdHksIGZpbGU9Ii4vZGF0YS9maW5hbF9kYXRhL3JlZ3Jlc3Npb25fb3V0cHV0cy9lYl9saXN0X2VtcHR5X2RvcHJvdF9jaXR5X3cuUkRhdGEiKQ0KDQojIE1vZGVsIHdpdGggcHJlZGljdG9ycw0KcHJlZGljdG9ycyA8LSBjKCJ0aW1lIiwgInNleCIsICJpc2NlZF9jYXQiLCAiYWdlIikNCmRlcHMgPC0gYygiZG9wcm90X2NpdHkiKQ0KDQplYl9saXN0X3ByZWRzX2RvcHJvdF9jaXR5IDwtIGxpc3QoKQ0KDQojIExvb3AgdGhyb3VnaCBlYWNoIGRlcGVuZGVudCB2YXJpYWJsZQ0KICBmb3IgKGkgaW4gMTpsZW5ndGgoZGVwcykpIHsNCiAgIyBTcGVjaWZ5IHRoZSBzaWdtYSBmb3JtdWxhDQogIHNpZ21hLmZvcm11bGEgPC0gYXMuZm9ybXVsYShwYXN0ZSgifiIsIHBhc3RlKHByZWRpY3RvcnMsIGNvbGxhcHNlID0gIiArICIpKSkNCiAgIyBQZXJmb3JtIHRoZSBsaW5lYXIgcmVncmVzc2lvbg0KICBlYl9maXQgPC0gZ2FtbHNzKGFzLmZvcm11bGEocGFzdGUoZGVwc1tpXSwgIn4iLCBwYXN0ZShwcmVkaWN0b3JzLCBjb2xsYXBzZSA9ICIgKyAiKSkpLCBzaWdtYS5mb3JtdWxhID0gc2lnbWEuZm9ybXVsYSwgZmFtaWx5PU5PKG11LmxpbmsgPSAiaWRlbnRpdHkiLCBzaWdtYS5saW5rID0gImlkZW50aXR5IiksIGRhdGEgPSBlYl9jb21wbGV0ZSwgd2VpZ2h0cyA9IHdlaWdodHZlYykNCiAgDQogIGViX2xpc3RfcHJlZHNfZG9wcm90X2NpdHlbW2ldXSA8LSBlYl9maXQNCn0gDQoNCnN1bW1hcnkoZWJfbGlzdF9wcmVkc19kb3Byb3RfY2l0eVtbMV1dKSANCg0Kc2F2ZShlYl9saXN0X3ByZWRzX2RvcHJvdF9jaXR5LCBmaWxlPSIuL2RhdGEvZmluYWxfZGF0YS9yZWdyZXNzaW9uX291dHB1dHMvZWJfbGlzdF9wcmVkc19kb3Byb3RfY2l0eV93X25ldy5SRGF0YSIpDQoNCiMgQW5kIHRoZSBtb2RlbCB3aXRoIGludGVyYWN0aW9ucw0KZWJfY29tcGxldGUkYWdlX3RpbWUgPC0gZWJfY29tcGxldGUkYWdlICogZWJfY29tcGxldGUkdGltZQ0KZWJfY29tcGxldGUkc2V4X3RpbWUgPC0gYXMubnVtZXJpYyhlYl9jb21wbGV0ZSRzZXgpICogZWJfY29tcGxldGUkdGltZQ0KZWJfY29tcGxldGUgPC0gZmFzdER1bW1pZXM6OmR1bW15X2NvbHMoZWJfY29tcGxldGUsIHNlbGVjdF9jb2x1bW5zID0gImlzY2VkX2NhdCIpDQplYl9jb21wbGV0ZSRpc2NlZF9iYXNpY190aW1lIDwtIGViX2NvbXBsZXRlJGlzY2VkX2NhdF9CYXNpYyAqIGViX2NvbXBsZXRlJHRpbWUNCmViX2NvbXBsZXRlJGlzY2VkX2ludGVybWVkaWF0ZV90aW1lIDwtIGViX2NvbXBsZXRlJGlzY2VkX2NhdF9JbnRlcm1lZGlhdGUgKiBlYl9jb21wbGV0ZSR0aW1lDQplYl9jb21wbGV0ZSRpc2NlZF9hZHZhbmNlZF90aW1lIDwtIGViX2NvbXBsZXRlJGlzY2VkX2NhdF9BZHZhbmNlZCAqIGViX2NvbXBsZXRlJHRpbWUNCg0KaW50ZXJhY3Rpb25zIDwtIGMoImFnZV90aW1lIiwgInNleF90aW1lIiwgImlzY2VkX2ludGVybWVkaWF0ZV90aW1lIiwgImlzY2VkX2FkdmFuY2VkX3RpbWUiKQ0KDQplYl9saXN0X2ludGVyYWN0aW9uc19kb3Byb3RfY2l0eSA8LSBsaXN0KCkNCg0KIGZvciAoaSBpbiAxOmxlbmd0aChkZXBzKSkgew0KICAjIFNwZWNpZnkgdGhlIHNpZ21hIGZvcm11bGENCiAgc2lnbWEuZm9ybXVsYSA8LSBhcy5mb3JtdWxhKHBhc3RlKCJ+IiwgcGFzdGUocHJlZGljdG9ycywgY29sbGFwc2UgPSAiICsgIiksICIgKyAiLCBwYXN0ZShpbnRlcmFjdGlvbnMsIGNvbGxhcHNlID0gIiArICIpKSkNCiAgIyBQZXJmb3JtIHRoZSBsaW5lYXIgcmVncmVzc2lvbg0KICBlYl9maXQgPC0gZ2FtbHNzKGFzLmZvcm11bGEocGFzdGUoZGVwc1tpXSwgIn4iLCBwYXN0ZShwcmVkaWN0b3JzLCBjb2xsYXBzZSA9ICIgKyAiKSwgIiArICIsIHBhc3RlKGludGVyYWN0aW9ucywgY29sbGFwc2UgPSAiKyAiKSkpLCBzaWdtYS5mb3JtdWxhID0gc2lnbWEuZm9ybXVsYSwiICsgIiwgZmFtaWx5PU5PKG11LmxpbmsgPSAiaWRlbnRpdHkiLCBzaWdtYS5saW5rID0gImlkZW50aXR5IiksIGRhdGEgPSBlYl9jb21wbGV0ZSwgd2VpZ2h0cyA9IHdlaWdodHZlYykNCiAgDQogIGViX2xpc3RfaW50ZXJhY3Rpb25zX2RvcHJvdF9jaXR5W1tpXV0gPC0gZWJfZml0DQp9IA0KDQpzdW1tYXJ5KGViX2xpc3RfaW50ZXJhY3Rpb25zX2RvcHJvdF9jaXR5W1sxXV0pIA0KDQpzYXZlKGViX2xpc3RfaW50ZXJhY3Rpb25zX2RvcHJvdF9jaXR5LCBmaWxlPSIuL2RhdGEvZmluYWxfZGF0YS9yZWdyZXNzaW9uX291dHB1dHMvZWJfbGlzdF9pbnRlcmFjdGlvbnNfZG9wcm90X2NpdHlfd19uZXcuUkRhdGEiKQ0KYGBgDQoNCg0KIyMgTW90aXZhY3Rpb24gey19DQpgYGB7cn0NCmxvYWQoIi4vZGF0YS9maW5hbF9kYXRhL21vdHRvdGFsLlJEYXRhIikNCg0KIyBHYW1sc3MgY2Fubm90IGhhbmRsZSBOQXMsIHNvIEkgaGF2ZSB0byBsaXN0d2lzZSBkZWxldGUgYWxsIG9mIHRoZW0NCm1vdF9jb21wbGV0ZSA8LSBtb3R0b3RhbCAlPiUgZHJvcF9uYSgpDQptb3RfY29tcGxldGUkdGltZSA8LSBtb3RfY29tcGxldGUkc3VydmV5eWVhciAtIG1pbihtb3RfY29tcGxldGUkc3VydmV5eWVhcikNCg0KIyBJIHdhbnQgdG8gYnVpbGQgbW9kZWxzLiBJbiB0aGUgZW1wdHkgbW9kZWwsIEkgb25seSB3YW50IHRvIGluY2x1ZGUgdGltZS4gDQpwcmVkaWN0b3JzIDwtIGMoInRpbWUiKQ0KZGVwcyA8LSBjKCJjY2hhbmdlX21vdCIsICJ3b3JyaWVkX21vdCIsICJmdXR1cmVnZW4iLCAibm93b3IiLCAib250aW1lIiwgImdvdiIsICJyZXNwX2dvdiIsICJyZXNwX2NvbXAiLCAicmVzcF9ta2IiLCAicmVzcF9jaXRpel9tb3QiLCAicmVzcF95b3UiLCAicGVyc19yZXNwX21vdCIsICJzdXN0X2Nob2ljZSIsICJjb250ciIsICJlbmVyZ3kiLCAibm9pZGVhIiwgIm1vdGl2IikNCg0KbW90X2xpc3RfZW1wdHkgPC0gbGlzdCgpDQoNCiMgTG9vcCB0aHJvdWdoIGVhY2ggZGVwZW5kZW50IHZhcmlhYmxlDQogIGZvciAoaSBpbiAxOmxlbmd0aChkZXBzKSkgew0KICAjIFNwZWNpZnkgdGhlIHNpZ21hIGZvcm11bGENCiAgc2lnbWEuZm9ybXVsYSA8LSBhcy5mb3JtdWxhKHBhc3RlKCJ+IiwgcGFzdGUocHJlZGljdG9ycywgY29sbGFwc2UgPSAiICsgIikpKQ0KICAjIFBlcmZvcm0gdGhlIGxpbmVhciByZWdyZXNzaW9uLiBUaGUgc2lnbWEgZm9ybXVsYSBwYXN0ZXMgZXZlcnkgdmFyaWFibGUgb25lIGJ5IG9uZSBhbmQgY2FsY3VsYXRlcyB2YXJpYW5jZSwgdGhlIG90aGVyIGZvcm11bGEgc2hvd3MgdGhlIG1lYW4gYXR0aXR1ZGVzIGVmZmVjdHMNCiAgbW90X2ZpdCA8LSBnYW1sc3MoYXMuZm9ybXVsYShwYXN0ZShkZXBzW2ldLCAifiIsIHBhc3RlKHByZWRpY3RvcnMsIGNvbGxhcHNlID0gIiArICIpKSksIHNpZ21hLmZvcm11bGEgPSBzaWdtYS5mb3JtdWxhLCBmYW1pbHk9Tk8obXUubGluayA9ICJpZGVudGl0eSIsIHNpZ21hLmxpbmsgPSAiaWRlbnRpdHkiKSwgZGF0YSA9IG1vdF9jb21wbGV0ZSwgd2VpZ2h0cyA9IHdlaWdodHZlYykNCiAgDQogIG1vdF9saXN0X2VtcHR5W1tpXV0gPC0gbW90X2ZpdA0KfSANCg0Kc3VtbWFyeShtb3RfbGlzdF9lbXB0eVtbOF1dKSANCg0Kc2F2ZShtb3RfbGlzdF9lbXB0eSwgZmlsZT0iLi9kYXRhL2ZpbmFsX2RhdGEvcmVncmVzc2lvbl9vdXRwdXRzL21vdF9saXN0X2VtcHR5X3cuUkRhdGEiKQ0KDQojRXN0aW1hdGUgYSBzZWNvbmQgbW9kZWwgd2l0aCB0aGUgaW5kaWNhdG9ycyArIHRpbWUNCnByZWRpY3RvcnMgPC0gYygidGltZSIsICJzZXgiLCAiaXNjZWRfY2F0IiwgImFnZSIpDQpkZXBzIDwtIGMoImNjaGFuZ2VfbW90IiwgIndvcnJpZWRfbW90IiwgImZ1dHVyZWdlbiIsICJub3dvciIsICJvbnRpbWUiLCAiZ292IiwgInJlc3BfZ292IiwgInJlc3BfY29tcCIsICJyZXNwX21rYiIsICJyZXNwX2NpdGl6X21vdCIsICJyZXNwX3lvdSIsICJwZXJzX3Jlc3BfbW90IiwgInN1c3RfY2hvaWNlIiwgImNvbnRyIiwgImVuZXJneSIsICJub2lkZWEiLCAibW90aXYiKQ0KDQptb3RfbGlzdF9wcmVkcyA8LSBsaXN0KCkNCg0KIyBMb29wIHRocm91Z2ggZWFjaCBkZXBlbmRlbnQgdmFyaWFibGUNCiAgZm9yIChpIGluIDE6bGVuZ3RoKGRlcHMpKSB7DQogICMgU3BlY2lmeSB0aGUgc2lnbWEgZm9ybXVsYQ0KICBzaWdtYS5mb3JtdWxhIDwtIGFzLmZvcm11bGEocGFzdGUoIn4iLCBwYXN0ZShwcmVkaWN0b3JzLCBjb2xsYXBzZSA9ICIgKyAiKSkpDQogICMgUGVyZm9ybSB0aGUgbGluZWFyIHJlZ3Jtb3Rpb24NCiAgbW90X2ZpdCA8LSBnYW1sc3MoYXMuZm9ybXVsYShwYXN0ZShkZXBzW2ldLCAifiIsIHBhc3RlKHByZWRpY3RvcnMsIGNvbGxhcHNlID0gIiArICIpKSksIHNpZ21hLmZvcm11bGEgPSBzaWdtYS5mb3JtdWxhLCBmYW1pbHk9Tk8obXUubGluayA9ICJpZGVudGl0eSIsIHNpZ21hLmxpbmsgPSAiaWRlbnRpdHkiKSwgZGF0YSA9IG1vdF9jb21wbGV0ZSwgd2VpZ2h0cyA9IHdlaWdodHZlYykNCiAgDQogIG1vdF9saXN0X3ByZWRzW1tpXV0gPC0gbW90X2ZpdA0KfSANCg0Kc3VtbWFyeShtb3RfbGlzdF9wcmVkc1tbMV1dKSANCg0Kc2F2ZShtb3RfbGlzdF9wcmVkcywgZmlsZT0iLi9kYXRhL2ZpbmFsX2RhdGEvcmVncmVzc2lvbl9vdXRwdXRzL21vdF9saXN0X3ByZWRzX3dfbmV3LlJEYXRhIikNCg0KI05vdyB0aGUgbGFzdCBtb2RlbCB3aXRoIGludGVyYWN0aW9uIG9mIHRpbWUgb24gcHJlZGljdG9yIHZhcmlhYmxlcw0KbW90X2NvbXBsZXRlJGFnZV90aW1lIDwtIG1vdF9jb21wbGV0ZSRhZ2UgKiBtb3RfY29tcGxldGUkdGltZQ0KbW90X2NvbXBsZXRlJHNleF90aW1lIDwtIGFzLm51bWVyaWMobW90X2NvbXBsZXRlJHNleCkgKiBtb3RfY29tcGxldGUkdGltZQ0KbW90X2NvbXBsZXRlIDwtIGZhc3REdW1taWVzOjpkdW1teV9jb2xzKG1vdF9jb21wbGV0ZSwgc2VsZWN0X2NvbHVtbnMgPSAiaXNjZWRfY2F0IikNCm1vdF9jb21wbGV0ZSRpc2NlZF9iYXNpY190aW1lIDwtIG1vdF9jb21wbGV0ZSRpc2NlZF9jYXRfQmFzaWMgKiBtb3RfY29tcGxldGUkdGltZQ0KbW90X2NvbXBsZXRlJGlzY2VkX2ludGVybWVkaWF0ZV90aW1lIDwtIG1vdF9jb21wbGV0ZSRpc2NlZF9jYXRfSW50ZXJtZWRpYXRlICogbW90X2NvbXBsZXRlJHRpbWUNCm1vdF9jb21wbGV0ZSRpc2NlZF9hZHZhbmNlZF90aW1lIDwtIG1vdF9jb21wbGV0ZSRpc2NlZF9jYXRfQWR2YW5jZWQgKiBtb3RfY29tcGxldGUkdGltZQ0KDQppbnRlcmFjdGlvbnMgPC0gYygiYWdlX3RpbWUiLCAic2V4X3RpbWUiLCAiaXNjZWRfaW50ZXJtZWRpYXRlX3RpbWUiLCAiaXNjZWRfYWR2YW5jZWRfdGltZSIpDQoNCg0KbW90X2xpc3RfaW50ZXJhY3Rpb25zIDwtIGxpc3QoKQ0KDQogZm9yIChpIGluIDE6bGVuZ3RoKGRlcHMpKSB7DQogICMgU3BlY2lmeSB0aGUgc2lnbWEgZm9ybXVsYQ0KICBzaWdtYS5mb3JtdWxhIDwtIGFzLmZvcm11bGEocGFzdGUoIn4iLCBwYXN0ZShwcmVkaWN0b3JzLCBjb2xsYXBzZSA9ICIgKyAiKSwgIiArICIsIHBhc3RlKGludGVyYWN0aW9ucywgY29sbGFwc2UgPSAiICsgIikpKQ0KICAjIFBlcmZvcm0gdGhlIGxpbmVhciByZWdybW90aW9uDQogIG1vdF9maXQgPC0gZ2FtbHNzKGFzLmZvcm11bGEocGFzdGUoZGVwc1tpXSwgIn4iLCBwYXN0ZShwcmVkaWN0b3JzLCBjb2xsYXBzZSA9ICIgKyAiKSwgIiArICIsIHBhc3RlKGludGVyYWN0aW9ucywgY29sbGFwc2UgPSAiKyAiKSkpLCBzaWdtYS5mb3JtdWxhID0gc2lnbWEuZm9ybXVsYSwiICsgIiwgZmFtaWx5PU5PKG11LmxpbmsgPSAiaWRlbnRpdHkiLCBzaWdtYS5saW5rID0gImlkZW50aXR5IiksIGRhdGEgPSBtb3RfY29tcGxldGUsIHdlaWdodHMgPSB3ZWlnaHR2ZWMpDQogIA0KICBtb3RfbGlzdF9pbnRlcmFjdGlvbnNbW2ldXSA8LSBtb3RfZml0DQp9IA0KDQoNCnN1bW1hcnkobW90X2xpc3RfaW50ZXJhY3Rpb25zW1sxXV0pIA0KDQpzYXZlKG1vdF9saXN0X2ludGVyYWN0aW9ucywgZmlsZT0iLi9kYXRhL2ZpbmFsX2RhdGEvcmVncmVzc2lvbl9vdXRwdXRzL21vdF9saXN0X2ludGVyYWN0aW9uc193X25ldy5SRGF0YSIpDQoNCmBgYA0KDQojIyBMSVNTIHstfQ0KYGBge3J9DQpybShsaXN0PWxzKCkpDQpsb2FkKCIuL2RhdGEvZmluYWxfZGF0YS9saXNzdG90YWwuUkRhdGEiKQ0KDQojIEdhbWxzcyBjYW5ub3QgaGFuZGxlIE5Bcywgc28gSSBoYXZlIHRvIGxpc3R3aXNlIGRlbGV0ZSBhbGwgb2YgdGhlbQ0KbGlzc19jb21wbGV0ZSA8LSBsaXNzdG90YWwgJT4lIGRyb3BfbmEoKQ0KbGlzc19jb21wbGV0ZSR0aW1lIDwtIGxpc3NfY29tcGxldGUkc3VydmV5eWVhciAtIG1pbihsaXNzX2NvbXBsZXRlJHN1cnZleXllYXIpDQoNCiMgSSB3YW50IHRvIGJ1aWxkIG1vZGVscy4gSW4gdGhlIGVtcHR5IG1vZGVsLCBJIG9ubHkgd2FudCB0byBpbmNsdWRlIHRpbWUuIA0KcHJlZGljdG9ycyA8LSBjKCJ0aW1lIikNCmRlcHMgPC0gYygibGlmZXN0eWxlIikNCg0KbGlzc19saXN0X2VtcHR5IDwtIGxpc3QoKQ0KDQojIExvb3AgdGhyb3VnaCBlYWNoIGRlcGVuZGVudCB2YXJpYWJsZQ0KICBmb3IgKGkgaW4gMTpsZW5ndGgoZGVwcykpIHsNCiAgIyBTcGVjaWZ5IHRoZSBzaWdtYSBmb3JtdWxhDQogIHNpZ21hLmZvcm11bGEgPC0gYXMuZm9ybXVsYShwYXN0ZSgifiIsIHBhc3RlKHByZWRpY3RvcnMsIGNvbGxhcHNlID0gIiArICIpKSkNCiAgIyBQZXJmb3JtIHRoZSBsaW5lYXIgcmVncmVzc2lvbi4gVGhlIHNpZ21hIGZvcm11bGEgcGFzdGVzIGV2ZXJ5IHZhcmlhYmxlIG9uZSBieSBvbmUgYW5kIGNhbGN1bGF0ZXMgdmFyaWFuY2UsIHRoZSBvdGhlciBmb3JtdWxhIHNob3dzIHRoZSBtZWFuIGF0dGl0dWRlcyBlZmZlY3RzDQogIGxpc3NfZml0IDwtIGdhbWxzcyhhcy5mb3JtdWxhKHBhc3RlKGRlcHNbaV0sICJ+IiwgcGFzdGUocHJlZGljdG9ycywgY29sbGFwc2UgPSAiICsgIikpKSwgc2lnbWEuZm9ybXVsYSA9IHNpZ21hLmZvcm11bGEsIGZhbWlseT1OTyhtdS5saW5rID0gImlkZW50aXR5Iiwgc2lnbWEubGluayA9ICJpZGVudGl0eSIpLCBkYXRhID0gbGlzc19jb21wbGV0ZSwgd2VpZ2h0cyA9IHdlaWdodHZlYykNCiAgDQogIGxpc3NfbGlzdF9lbXB0eVtbaV1dIDwtIGxpc3NfZml0DQp9IA0KDQpzdW1tYXJ5KGxpc3NfbGlzdF9lbXB0eVtbMV1dKSANCg0Kc2F2ZShsaXNzX2xpc3RfZW1wdHksIGZpbGU9Ii4vZGF0YS9maW5hbF9kYXRhL3JlZ3Jlc3Npb25fb3V0cHV0cy9saXNzX2xpc3RfZW1wdHlfdy5SRGF0YSIpDQoNCiNFc3RpbWF0ZSBhIHNlY29uZCBtb2RlbCB3aXRoIHRoZSBpbmRpY2F0b3JzICsgdGltZQ0KcHJlZGljdG9ycyA8LSBjKCJ0aW1lIiwgInNleCIsICJpc2NlZF9jYXQiLCAiYWdlIikNCmRlcHMgPC0gYygibGlmZXN0eWxlIikNCg0KDQpsaXNzX2xpc3RfcHJlZHMgPC0gbGlzdCgpDQoNCiMgTG9vcCB0aHJvdWdoIGVhY2ggZGVwZW5kZW50IHZhcmlhYmxlDQogIGZvciAoaSBpbiAxOmxlbmd0aChkZXBzKSkgew0KICAjIFNwZWNpZnkgdGhlIHNpZ21hIGZvcm11bGENCiAgc2lnbWEuZm9ybXVsYSA8LSBhcy5mb3JtdWxhKHBhc3RlKCJ+IiwgcGFzdGUocHJlZGljdG9ycywgY29sbGFwc2UgPSAiICsgIikpKQ0KICAjIFBlcmZvcm0gdGhlIGxpbmVhciByZWdybGlzc2lvbg0KICBsaXNzX2ZpdCA8LSBnYW1sc3MoYXMuZm9ybXVsYShwYXN0ZShkZXBzW2ldLCAifiIsIHBhc3RlKHByZWRpY3RvcnMsIGNvbGxhcHNlID0gIiArICIpKSksIHNpZ21hLmZvcm11bGEgPSBzaWdtYS5mb3JtdWxhLCBmYW1pbHk9Tk8obXUubGluayA9ICJpZGVudGl0eSIsIHNpZ21hLmxpbmsgPSAiaWRlbnRpdHkiKSwgZGF0YSA9IGxpc3NfY29tcGxldGUsIHdlaWdodHMgPSB3ZWlnaHR2ZWMpDQogIA0KICBsaXNzX2xpc3RfcHJlZHNbW2ldXSA8LSBsaXNzX2ZpdA0KfSANCg0Kc3VtbWFyeShsaXNzX2xpc3RfcHJlZHNbWzFdXSkgDQoNCnNhdmUobGlzc19saXN0X3ByZWRzLCBmaWxlPSIuL2RhdGEvZmluYWxfZGF0YS9yZWdyZXNzaW9uX291dHB1dHMvbGlzc19saXN0X3ByZWRzX3dfbmV3LlJEYXRhIikNCg0KDQoNCiNOb3cgdGhlIGxhc3QgbW9kZWwgd2l0aCBpbnRlcmFjdGlvbiBvZiB0aW1lIG9uIHByZWRpY3RvciB2YXJpYWJsZXMNCmxpc3NfY29tcGxldGUkYWdlX3RpbWUgPC0gbGlzc19jb21wbGV0ZSRhZ2UgKiBsaXNzX2NvbXBsZXRlJHRpbWUNCmxpc3NfY29tcGxldGUkc2V4X3RpbWUgPC0gYXMubnVtZXJpYyhsaXNzX2NvbXBsZXRlJHNleCkgKiBsaXNzX2NvbXBsZXRlJHRpbWUNCmxpc3NfY29tcGxldGUgPC0gZmFzdER1bW1pZXM6OmR1bW15X2NvbHMobGlzc19jb21wbGV0ZSwgc2VsZWN0X2NvbHVtbnMgPSAiaXNjZWRfY2F0IikNCmxpc3NfY29tcGxldGUkaXNjZWRfYmFzaWNfdGltZSA8LSBsaXNzX2NvbXBsZXRlJGlzY2VkX2NhdF9CYXNpYyAqIGxpc3NfY29tcGxldGUkdGltZQ0KbGlzc19jb21wbGV0ZSRpc2NlZF9pbnRlcm1lZGlhdGVfdGltZSA8LSBsaXNzX2NvbXBsZXRlJGlzY2VkX2NhdF9JbnRlcm1lZGlhdGUgKiBsaXNzX2NvbXBsZXRlJHRpbWUNCmxpc3NfY29tcGxldGUkaXNjZWRfYWR2YW5jZWRfdGltZSA8LSBsaXNzX2NvbXBsZXRlJGlzY2VkX2NhdF9BZHZhbmNlZCAqIGxpc3NfY29tcGxldGUkdGltZQ0KDQppbnRlcmFjdGlvbnMgPC0gYygiYWdlX3RpbWUiLCAic2V4X3RpbWUiLCAiaXNjZWRfaW50ZXJtZWRpYXRlX3RpbWUiLCAiaXNjZWRfYWR2YW5jZWRfdGltZSIpDQoNCmxpc3NfbGlzdF9pbnRlcmFjdGlvbnMgPC0gbGlzdCgpDQoNCiBmb3IgKGkgaW4gMTpsZW5ndGgoZGVwcykpIHsNCiAgIyBTcGVjaWZ5IHRoZSBzaWdtYSBmb3JtdWxhDQogIHNpZ21hLmZvcm11bGEgPC0gYXMuZm9ybXVsYShwYXN0ZSgifiIsIHBhc3RlKHByZWRpY3RvcnMsIGNvbGxhcHNlID0gIiArICIpLCAiICsgIiwgcGFzdGUoaW50ZXJhY3Rpb25zLCBjb2xsYXBzZSA9ICIgKyAiKSkpDQogICMgUGVyZm9ybSB0aGUgbGluZWFyIHJlZ3Jlc3Npb24NCiAgbGlzc19maXQgPC0gZ2FtbHNzKGFzLmZvcm11bGEocGFzdGUoZGVwc1tpXSwgIn4iLCBwYXN0ZShwcmVkaWN0b3JzLCBjb2xsYXBzZSA9ICIgKyAiKSwgIiArICIsIHBhc3RlKGludGVyYWN0aW9ucywgY29sbGFwc2UgPSAiKyAiKSkpLCBzaWdtYS5mb3JtdWxhID0gc2lnbWEuZm9ybXVsYSwiICsgIiwgZmFtaWx5PU5PKG11LmxpbmsgPSAiaWRlbnRpdHkiLCBzaWdtYS5saW5rID0gImlkZW50aXR5IiksIGRhdGEgPSBsaXNzX2NvbXBsZXRlLCB3ZWlnaHRzID0gd2VpZ2h0dmVjKQ0KICANCiAgbGlzc19saXN0X2ludGVyYWN0aW9uc1tbaV1dIDwtIGxpc3NfZml0DQp9IA0KDQoNCnN1bW1hcnkobGlzc19saXN0X2ludGVyYWN0aW9uc1tbMV1dKSANCg0Kc2F2ZShsaXNzX2xpc3RfaW50ZXJhY3Rpb25zLCBmaWxlPSIuL2RhdGEvZmluYWxfZGF0YS9yZWdyZXNzaW9uX291dHB1dHMvbGlzc19saXN0X2ludGVyYWN0aW9uc193X25ldy5SRGF0YSIpDQoNCg0KDQpgYGANCg0KIyMgU09DT04gey19DQpgYGB7cn0NCnJtKGxpc3Q9bHMoKSkNCmxvYWQoIi4vZGF0YS9maW5hbF9kYXRhL3NvY29udG90YWwuUkRhdGEiKQ0KDQojIEdhbWxzcyBjYW5ub3QgaGFuZGxlIE5Bcywgc28gSSBoYXZlIHRvIGxpc3R3aXNlIGRlbGV0ZSBhbGwgb2YgdGhlbQ0Kc29jb25fY29tcGxldGUgPC0gc29jb250b3RhbCAlPiUgZHJvcF9uYSgpDQpzb2Nvbl9jb21wbGV0ZSR0aW1lIDwtIHNvY29uX2NvbXBsZXRlJHN1cnZleXllYXIgLSBtaW4oc29jb25fY29tcGxldGUkc3VydmV5eWVhcikNCg0KIyBJIHdhbnQgdG8gYnVpbGQgbW9kZWxzLiBJbiB0aGUgZW1wdHkgbW9kZWwsIEkgb25seSB3YW50IHRvIGluY2x1ZGUgdGltZS4gDQpwcmVkaWN0b3JzIDwtIGMoInRpbWUiKQ0KZGVwcyA8LSBjKCJmdXRfZ2VuX3NvY29uIikNCg0KDQpzb2Nvbl9saXN0X2VtcHR5IDwtIGxpc3QoKQ0KDQojIExvb3AgdGhyb3VnaCBlYWNoIGRlcGVuZGVudCB2YXJpYWJsZQ0KICBmb3IgKGkgaW4gMTpsZW5ndGgoZGVwcykpIHsNCiAgIyBTcGVjaWZ5IHRoZSBzaWdtYSBmb3JtdWxhDQogIHNpZ21hLmZvcm11bGEgPC0gYXMuZm9ybXVsYShwYXN0ZSgifiIsIHBhc3RlKHByZWRpY3RvcnMsIGNvbGxhcHNlID0gIiArICIpKSkNCiAgIyBQZXJmb3JtIHRoZSBsaW5lYXIgcmVncmVzc2lvbi4gVGhlIHNpZ21hIGZvcm11bGEgcGFzdGVzIGV2ZXJ5IHZhcmlhYmxlIG9uZSBieSBvbmUgYW5kIGNhbGN1bGF0ZXMgdmFyaWFuY2UsIHRoZSBvdGhlciBmb3JtdWxhIHNob3dzIHRoZSBtZWFuIGF0dGl0dWRlcyBlZmZlY3RzDQogIHNvY29uX2ZpdCA8LSBnYW1sc3MoYXMuZm9ybXVsYShwYXN0ZShkZXBzW2ldLCAifiIsIHBhc3RlKHByZWRpY3RvcnMsIGNvbGxhcHNlID0gIiArICIpKSksIHNpZ21hLmZvcm11bGEgPSBzaWdtYS5mb3JtdWxhLCBmYW1pbHk9Tk8obXUubGluayA9ICJpZGVudGl0eSIsIHNpZ21hLmxpbmsgPSAiaWRlbnRpdHkiKSwgZGF0YSA9IHNvY29uX2NvbXBsZXRlLCB3ZWlnaHRzID0gd2VpZ2h0dmVjKQ0KICANCiAgc29jb25fbGlzdF9lbXB0eVtbaV1dIDwtIHNvY29uX2ZpdA0KfSANCg0Kc3VtbWFyeShzb2Nvbl9saXN0X2VtcHR5W1sxXV0pIA0KDQpzYXZlKHNvY29uX2xpc3RfZW1wdHksIGZpbGU9Ii4vZGF0YS9maW5hbF9kYXRhL3JlZ3Jlc3Npb25fb3V0cHV0cy9zb2Nvbl9saXN0X2VtcHR5X3cuUkRhdGEiKQ0KDQojRXN0aW1hdGUgYSBzZWNvbmQgbW9kZWwgd2l0aCB0aGUgaW5kaWNhdG9ycyArIHRpbWUNCnByZWRpY3RvcnMgPC0gYygidGltZSIsICJzZXgiLCAiaXNjZWRfY2F0IiwgImFnZSIpDQpkZXBzIDwtIGMoImZ1dF9nZW5fc29jb24iKQ0KDQoNCnNvY29uX2xpc3RfcHJlZHMgPC0gbGlzdCgpDQoNCiMgTG9vcCB0aHJvdWdoIGVhY2ggZGVwZW5kZW50IHZhcmlhYmxlDQogIGZvciAoaSBpbiAxOmxlbmd0aChkZXBzKSkgew0KICAjIFNwZWNpZnkgdGhlIHNpZ21hIGZvcm11bGENCiAgc2lnbWEuZm9ybXVsYSA8LSBhcy5mb3JtdWxhKHBhc3RlKCJ+IiwgcGFzdGUocHJlZGljdG9ycywgY29sbGFwc2UgPSAiICsgIikpKQ0KICAjIFBlcmZvcm0gdGhlIGxpbmVhciByZWdyZXNzaW9uDQogIHNvY29uX2ZpdCA8LSBnYW1sc3MoYXMuZm9ybXVsYShwYXN0ZShkZXBzW2ldLCAifiIsIHBhc3RlKHByZWRpY3RvcnMsIGNvbGxhcHNlID0gIiArICIpKSksIHNpZ21hLmZvcm11bGEgPSBzaWdtYS5mb3JtdWxhLCBmYW1pbHk9Tk8obXUubGluayA9ICJpZGVudGl0eSIsIHNpZ21hLmxpbmsgPSAiaWRlbnRpdHkiKSwgZGF0YSA9IHNvY29uX2NvbXBsZXRlLCB3ZWlnaHRzID0gd2VpZ2h0dmVjKQ0KICANCiAgc29jb25fbGlzdF9wcmVkc1tbaV1dIDwtIHNvY29uX2ZpdA0KfSANCg0Kc3VtbWFyeShzb2Nvbl9saXN0X3ByZWRzW1sxXV0pIA0KDQpzYXZlKHNvY29uX2xpc3RfcHJlZHMsIGZpbGU9Ii4vZGF0YS9maW5hbF9kYXRhL3JlZ3Jlc3Npb25fb3V0cHV0cy9zb2Nvbl9saXN0X3ByZWRzX3dfbmV3LlJEYXRhIikNCg0KI05vdyB0aGUgbGFzdCBtb2RlbCB3aXRoIGludGVyYWN0aW9uIG9mIHRpbWUgb24gcHJlZGljdG9yIHZhcmlhYmxlcw0Kc29jb25fY29tcGxldGUkYWdlX3RpbWUgPC0gc29jb25fY29tcGxldGUkYWdlICogc29jb25fY29tcGxldGUkdGltZQ0Kc29jb25fY29tcGxldGUkc2V4X3RpbWUgPC0gYXMubnVtZXJpYyhzb2Nvbl9jb21wbGV0ZSRzZXgpICogc29jb25fY29tcGxldGUkdGltZQ0Kc29jb25fY29tcGxldGUgPC0gZmFzdER1bW1pZXM6OmR1bW15X2NvbHMoc29jb25fY29tcGxldGUsIHNlbGVjdF9jb2x1bW5zID0gImlzY2VkX2NhdCIpDQpzb2Nvbl9jb21wbGV0ZSRpc2NlZF9iYXNpY190aW1lIDwtIHNvY29uX2NvbXBsZXRlJGlzY2VkX2NhdF9CYXNpYyAqIHNvY29uX2NvbXBsZXRlJHRpbWUNCnNvY29uX2NvbXBsZXRlJGlzY2VkX2ludGVybWVkaWF0ZV90aW1lIDwtIHNvY29uX2NvbXBsZXRlJGlzY2VkX2NhdF9JbnRlcm1lZGlhdGUgKiBzb2Nvbl9jb21wbGV0ZSR0aW1lDQpzb2Nvbl9jb21wbGV0ZSRpc2NlZF9hZHZhbmNlZF90aW1lIDwtIHNvY29uX2NvbXBsZXRlJGlzY2VkX2NhdF9BZHZhbmNlZCAqIHNvY29uX2NvbXBsZXRlJHRpbWUNCg0KaW50ZXJhY3Rpb25zIDwtIGMoImFnZV90aW1lIiwgInNleF90aW1lIiwgImlzY2VkX2ludGVybWVkaWF0ZV90aW1lIiwgImlzY2VkX2FkdmFuY2VkX3RpbWUiKQ0KDQoNCnNvY29uX2xpc3RfaW50ZXJhY3Rpb25zIDwtIGxpc3QoKQ0KDQogZm9yIChpIGluIDE6bGVuZ3RoKGRlcHMpKSB7DQogICMgU3BlY2lmeSB0aGUgc2lnbWEgZm9ybXVsYQ0KICBzaWdtYS5mb3JtdWxhIDwtIGFzLmZvcm11bGEocGFzdGUoIn4iLCBwYXN0ZShwcmVkaWN0b3JzLCBjb2xsYXBzZSA9ICIgKyAiKSwgIiArICIsIHBhc3RlKGludGVyYWN0aW9ucywgY29sbGFwc2UgPSAiICsgIikpKQ0KICAjIFBlcmZvcm0gdGhlIGxpbmVhciByZWdyZXNzaW9uDQogIHNvY29uX2ZpdCA8LSBnYW1sc3MoYXMuZm9ybXVsYShwYXN0ZShkZXBzW2ldLCAifiIsIHBhc3RlKHByZWRpY3RvcnMsIGNvbGxhcHNlID0gIiArICIpLCAiICsgIiwgcGFzdGUoaW50ZXJhY3Rpb25zLCBjb2xsYXBzZSA9ICIrICIpKSksIHNpZ21hLmZvcm11bGEgPSBzaWdtYS5mb3JtdWxhLCIgKyAiLCBmYW1pbHk9Tk8obXUubGluayA9ICJpZGVudGl0eSIsIHNpZ21hLmxpbmsgPSAiaWRlbnRpdHkiKSwgZGF0YSA9IHNvY29uX2NvbXBsZXRlLCB3ZWlnaHRzID0gd2VpZ2h0dmVjKQ0KICANCiAgc29jb25fbGlzdF9pbnRlcmFjdGlvbnNbW2ldXSA8LSBzb2Nvbl9maXQNCn0gDQoNCg0Kc3VtbWFyeShzb2Nvbl9saXN0X2ludGVyYWN0aW9uc1tbMV1dKSANCg0Kc2F2ZShzb2Nvbl9saXN0X2ludGVyYWN0aW9ucywgZmlsZT0iLi9kYXRhL2ZpbmFsX2RhdGEvcmVncmVzc2lvbl9vdXRwdXRzL3NvY29uX2xpc3RfaW50ZXJhY3Rpb25zX3dfbmV3LlJEYXRhIikNCg0KYGBgDQoNCg0K