upload data
library(readxl)
game_report <- read_excel("specific-user-all-game-report.xlsx",
col_types = c("text", "numeric", "date",
"date", "numeric"))
print(game_report)
library(haven)
phase_3 <- read_dta("FDIC HMSRU Phase 3_Final_10_14.dta")
View(phase_3)
add packages
library(psych)
library(tidyverse)
create variable to capture games completed at pre/post/follow
up
clean up game report data
game_report_2 <- game_report %>%
select(.,
RecipientEmail,
game_id,
complete_game_date)
# Transform data from long to wide
game_report_wide <- game_report_2 %>%
pivot_wider(names_from = game_id, values_from = complete_game_date)
# View the wide data
print(game_report_wide)
library(dplyr)
game_report_3 <- game_report_wide %>% rename(game_1_date = 3, game_2_date = 4, game_3_date = 5, game_4_date = 15, game_5_date = 6, game_6_date = 7, game_7_date = 8, game_8_date = 9, game_9_date = 10, game_10_date = 11, game_11_date = 2, game_12_date = 12, game_13_date = 13, game_14_date = 14)
game_report_3 <- game_report_3 %>%
select(.,
RecipientEmail,
game_1_date,
game_2_date,
game_3_date,
game_4_date,
game_5_date,
game_6_date,
game_7_date,
game_8_date,
game_9_date,
game_10_date,
game_11_date,
game_12_date,
game_13_date,
game_14_date)
merge the two datasets to capture a date for pre
phase_3_merge <- merge(phase_3, game_report_3, by = "RecipientEmail", all.x = TRUE)
phase_3_4 <- phase_3_merge %>%
rowwise() %>%
mutate(games_before_pretest = sum(c_across(starts_with("game_")) < RecordedDate, na.rm = TRUE))
post-test
phase_3_4 <- phase_3_4 %>%
rowwise() %>%
mutate(games_before_post_test = sum(c_across(starts_with("game_")) < RecordedDate_post, na.rm = TRUE))
follow up
phase_3_4 <- phase_3_4 %>%
rowwise() %>%
mutate(games_before_follow = sum(c_across(starts_with("game_")) < RecordedDate_follow, na.rm = TRUE))
Outcome: Self-Report Knowledge
phase_3_4$game_4_SelfTotalScore_Pre <- phase_3_4$financial_know_1_7 + phase_3_4$financial_know_1_8 + phase_3_4$financial_know_1_9
phase_3_4$game_4_SelfScaleScore_Pre <- ((phase_3_4$game_4_SelfTotalScore_Pre / 12)*4)
phase_3_4$game_10_SelfTotalScore_Pre <- phase_3_4$financial_know_1_4 + phase_3_4$financial_know_1_5 + phase_3_4$financial_know_1_6
phase_3_4$game_10_SelfScaleScore_Pre <- ((phase_3_4$game_10_SelfTotalScore_Pre / 12)*4)
phase_3_4$game_14_SelfTotalScore_Pre <- phase_3_4$financial_know_1_1 + phase_3_4$financial_know_1_2 + phase_3_4$financial_know_1_3
phase_3_4$game_14_SelfScaleScore_Pre <- ((phase_3_4$game_14_SelfTotalScore_Pre / 12)*4)
phase_3_4$game_4_SelfTotalScore_Post <- phase_3_4$financial_know_1_7_post + phase_3_4$financial_know_1_8_post + phase_3_4$financial_know_1_9_post
phase_3_4$game_4_SelfScaleScore_Post <- ((phase_3_4$game_4_SelfTotalScore_Post / 12)*4)
phase_3_4$game_10_SelfTotalScore_Post <- phase_3_4$financial_know_1_4 + phase_3_4$financial_know_1_5 + phase_3_4$financial_know_1_6
phase_3_4$game_10_SelfScaleScore_Post <- ((phase_3_4$game_10_SelfTotalScore_Post / 12)*4)
phase_3_4$game_14_SelfTotalScore_Post <- phase_3_4$financial_know_1_1 + phase_3_4$financial_know_1_2 + phase_3_4$financial_know_1_3
phase_3_4$game_14_SelfScaleScore_Post <- ((phase_3_4$game_14_SelfTotalScore_Post / 12)*4)
phase_3_4$game_4_SelfTotalScore_Follow <- phase_3_4$financial_know_1_7_follow + phase_3_4$financial_know_1_8_follow + phase_3_4$financial_know_1_9_follow
phase_3_4$game_4_SelfScaleScore_Follow <- ((phase_3_4$game_4_SelfTotalScore_Follow / 12)*4)
phase_3_4$game_10_SelfTotalScore_Follow <- phase_3_4$financial_know_1_4 + phase_3_4$financial_know_1_5 + phase_3_4$financial_know_1_6
phase_3_4$game_10_SelfScaleScore_Follow <- ((phase_3_4$game_10_SelfTotalScore_Follow / 12)*4)
phase_3_4$game_14_SelfTotalScore_Follow <- phase_3_4$financial_know_1_1 + phase_3_4$financial_know_1_2 + phase_3_4$financial_know_1_3
phase_3_4$game_14_SelfScaleScore_Follow <- ((phase_3_4$game_14_SelfTotalScore_Follow / 12)*4)
phase_3_all_outcomes<- phase_3_4
Outcome: Objective Knowledge
phase_3_all_outcomes$game_4_ObjTotalScore_Pre <- phase_3_all_outcomes$general_know_7 + phase_3_all_outcomes$general_know_8 + phase_3_all_outcomes$general_know_9
phase_3_all_outcomes$game_4_ObjScaleScore_Pre <- ((phase_3_all_outcomes$game_4_ObjTotalScore_Pre / 12)*4)
phase_3_all_outcomes$game_10_ObjTotalScore_Pre <- phase_3_all_outcomes$general_know_3 + phase_3_all_outcomes$general_know_4 + phase_3_all_outcomes$general_know_5 + phase_3_all_outcomes$general_know_6
phase_3_all_outcomes$game_10_ObjScaleScore_Pre <- ((phase_3_all_outcomes$game_10_ObjTotalScore_Pre / 12)*4)
phase_3_all_outcomes$game_14_ObjTotalScore_Pre <- phase_3_all_outcomes$general_know_1 + phase_3_all_outcomes$general_know_2
phase_3_all_outcomes$game_14_ObjScaleScore_Pre <- ((phase_3_all_outcomes$game_14_ObjTotalScore_Pre / 12)*4)
phase_3_all_outcomes$game_4_ObjTotalScore_Post <- phase_3_all_outcomes$general_know_7_post + phase_3_all_outcomes$general_know_8_post + phase_3_all_outcomes$general_know_9_post
phase_3_all_outcomes$game_4_ObjScaleScore_Post <- ((phase_3_all_outcomes$game_4_ObjTotalScore_Post / 12)*4)
phase_3_all_outcomes$game_10_ObjTotalScore_Post <- phase_3_all_outcomes$general_know_3_post + phase_3_all_outcomes$general_know_4_post + phase_3_all_outcomes$general_know_5_post + phase_3_all_outcomes$general_know_6_post
phase_3_all_outcomes$game_10_ObjScaleScore_Post <- ((phase_3_all_outcomes$game_10_ObjTotalScore_Post / 12)*4)
phase_3_all_outcomes$game_14_ObjTotalScore_Post <- phase_3_all_outcomes$general_know_1_post + phase_3_all_outcomes$general_know_2_post
phase_3_all_outcomes$game_14_ObjScaleScore_Post <- ((phase_3_all_outcomes$game_14_ObjTotalScore_Post / 12)*4)
phase_3_all_outcomes$game_4_ObjTotalScore_Follow <- phase_3_all_outcomes$general_know_7_follow + phase_3_all_outcomes$general_know_8_follow + phase_3_4$general_know_9_follow
phase_3_all_outcomes$game_4_ObjScaleScore_Follow <- ((phase_3_all_outcomes$game_4_ObjTotalScore_Follow / 12)*4)
phase_3_all_outcomes$game_10_ObjTotalScore_Follow <- phase_3_all_outcomes$general_know_3_follow + phase_3_all_outcomes$general_know_4_follow + phase_3_all_outcomes$general_know_5_follow + phase_3_all_outcomes$general_know_6_follow
phase_3_all_outcomes$game_10_ObjScaleScore_Follow <- ((phase_3_all_outcomes$game_10_ObjTotalScore_Follow / 12)*4)
phase_3_all_outcomes$game_14_ObjTotalScore_Follow <- phase_3_all_outcomes$general_know_1_follow + phase_3_all_outcomes$general_know_2_follow
phase_3_all_outcomes$game_14_ObjScaleScore_Follow <- ((phase_3_all_outcomes$game_14_ObjTotalScore_Follow / 12)*4)
library(Hmisc)
label(phase_3_4$game_4_SelfTotalScore_Pre) <- "Game 4 Self-Report Knowledge Total Score - Follow-up"
label(phase_3_4$game_10_SelfTotalScore_Pre) <- "Game 10 Self-Report Knowledge Total Score - Baseline"
label(phase_3_4$game_14_SelfTotalScore_Pre) <- "Game 14 Self-Report Knowledge Total Score - Baseline"
label(phase_3_4$game_4_SelfTotalScore_Post) <- "Game 4 Self-Report Knowledge Total Score - Post"
label(phase_3_4$game_10_SelfTotalScore_Post) <- "Game 10 Self-Report Knowledge Total Score - Post"
label(phase_3_4$game_14_SelfTotalScore_Post) <- "Game 14 Self-Report Knowledge Total Score - Post"
label(phase_3_4$game_4_SelfTotalScore_Follow) <- "Game 4 Self-Report Knowledge Total Score- Follow"
label(phase_3_4$game_10_SelfTotalScore_Follow) <- "Game 10 Self-Report Knowledge Total Score- Follow"
label(phase_3_4$game_14_SelfTotalScore_Follow) <- "Game 14 Self-Report Knowledge Total Score- Follow"
label(phase_3_all_outcomes$game_4_ObjTotalScore_Pre) <- "Game 4 Objective Knowledge Total Score - Baseline"
label(phase_3_all_outcomes$game_10_ObjTotalScore_Pre) <- "Game 10 Objective Knowledge Total Score - Baseline"
label(phase_3_all_outcomes$game_14_ObjTotalScore_Pre) <- "Game 14 Objective Knowledge Total Score - Baseline"
label(phase_3_all_outcomes$game_4_ObjTotalScore_Post) <- "Game 4 Objective Knowledge Total Score - Post"
label(phase_3_all_outcomes$game_10_ObjTotalScore_Post) <- "Game 10 Objective Knowledge Total Score - Post"
label(phase_3_all_outcomes$game_14_ObjTotalScore_Post) <- "Game 14 Objective Knowledge Total Score - Post"
label(phase_3_all_outcomes$game_4_ObjTotalScore_Follow) <- "Game 4 Objective Knowledge Total Score- Follow"
label(phase_3_all_outcomes$game_10_ObjTotalScore_Follow) <- "Game 10 Objective Knowledge Total Score- Follow"
label(phase_3_all_outcomes$game_14_ObjTotalScore_Follow) <- "Game 14 Objective Knowledge Total Score- Follow"
phase_3_4$SelfKnow_OverallScore_pre <- ((phase_3_4$game_4_SelfScaleScore_Pre + phase_3_4$game_10_SelfScaleScore_Pre + phase_3_4$game_14_SelfScaleScore_Pre) / 3)
phase_3_all_outcomes$Obj_OverallScore_pre <- ((phase_3_all_outcomes$game_4_ObjScaleScore_Pre + phase_3_all_outcomes$game_10_ObjScaleScore_Pre + phase_3_all_outcomes$game_14_ObjScaleScore_Pre))
describe(phase_3_all_outcomes$Obj_OverallScore_pre)
label(phase_3_4$SelfKnow_OverallScore_pre) <- "Self-Reported Knowledge Overall Score - Baseline"
label(phase_3_all_outcomes$Obj_OverallScore_pre) <- "Objective Knowledge Overall Score - Baseline"
phase_3_all_outcomes$SelfKnow_OverallScore_post <- ((phase_3_all_outcomes$game_4_SelfScaleScore_Post + phase_3_all_outcomes$game_10_SelfScaleScore_Post + phase_3_all_outcomes$game_14_SelfScaleScore_Post) / 3)
phase_3_all_outcomes$Obj_OverallScore_post <- ((phase_3_all_outcomes$game_4_ObjScaleScore_Post + phase_3_all_outcomes$game_10_ObjScaleScore_Post + phase_3_all_outcomes$game_14_ObjScaleScore_Post))
label(phase_3_4$SelfKnow_OverallScore_post) <- "Self-Reported Knowledge Overall Score - Post"
label(phase_3_all_outcomes$Obj_OverallScore_post) <- "Objective Knowledge Overall Score - Post"
phase_3_4$SelfKnow_OverallScore_follow <- (phase_3_4$game_4_SelfScaleScore_Follow + phase_3_4$game_10_SelfScaleScore_Follow + phase_3_4$game_14_SelfScaleScore_Follow) / 3
phase_3_all_outcomes$Obj_OverallScore_follow <- ((phase_3_all_outcomes$game_4_ObjScaleScore_Follow + phase_3_all_outcomes$game_10_ObjScaleScore_Follow + phase_3_all_outcomes$game_14_ObjScaleScore_Follow))
label(phase_3_4$SelfKnow_OverallScore_follow) <- "Self-Reported Knowledge Overall Score - Follow"
label(phase_3_all_outcomes$Obj_OverallScore_follow) <- "Objective Knowledge Overall Score - Follow"
phase_3_all_outcomes <- phase_3_all_outcomes %>% select(-'_merge')
phase_3_all_outcomes$SelfKnow_OverallScore_follow <- (phase_3_all_outcomes$game_4_SelfScaleScore_Follow + phase_3_all_outcomes$game_10_SelfScaleScore_Follow + phase_3_all_outcomes$game_14_SelfScaleScore_Follow) / 3
phase_3_all_outcomes$Obj_OverallScore_follow <- ((phase_3_all_outcomes$game_4_ObjScaleScore_Follow + phase_3_all_outcomes$game_10_ObjScaleScore_Follow + phase_3_all_outcomes$game_14_ObjScaleScore_Follow))
label(phase_3_all_outcomes$SelfKnow_OverallScore_follow) <- "Self-Reported Knowledge Overall Score - Follow"
label(phase_3_all_outcomes$Obj_OverallScore_follow) <- "Objective Knowledge Overall Score - Follow"
save as SPSS file and merge in STATA outcomes
write_sav(phase_3_all_outcomes, "phase_3_knowledge_outcome.sav")
library(haven)
phase_3_all_outcomes <- read_dta("phase_3_all_outcomes.dta")
print(phase_3_all_outcomes)
Clean variables
phase_3_all_outcomes$organizational_affiliation.fac <- factor(phase_3_4$Organization_Affiliation)
Make grouping variable dichotomous
phase_3_all_outcomes$participant_type.fac <- factor(phase_3_4$participant_type)
phase_3_all_outcomes <- phase_3_all_outcomes %>%
mutate(participant_type_2 = case_when(
participant_type.fac == "3" ~ "2",
TRUE ~ participant_type.fac
))
label(phase_3_all_outcomes$participant_type_2) <- "Combined Comparison Groups"
levels(phase_3_all_outcomes$participant_type.fac) <- c("Treatment", "Non-Completer Comparison Group", "WinCo Comparison Group")
phase_3_all_outcomes$participant_type_2 <- factor(phase_3_all_outcomes$participant_type_2,
levels = c("1", "2"),
labels = c("Treatment", "Control"))
age variable
phase_3_all_outcomes$age <- cut(phase_3_all_outcomes$demographics_1,
breaks = c(0, 24, 34, 44, 64, 1000), # Define the breaks
labels = c("24 and younger", "25-34", "35-44", "45-64", "65+"), # Define the labels
right = TRUE) # If TRUE, the right endpoint is included
organization variable
phase_3_all_outcomes$organization <- ifelse(phase_3_all_outcomes$organizational_affiliation.fac != "None", "Yes", "No")
outcome 3: attitudes toward banks
phase_3_all_outcomes$att_toward_banks_pre <- (phase_3_all_outcomes$financial_att_1_1 + phase_3_all_outcomes$financial_att_1_2 + phase_3_all_outcomes$financial_att_1_3 + phase_3_all_outcomes$financial_att_1_4 + phase_3_all_outcomes$financial_att_1_5) / 5
label(phase_3_all_outcomes$att_toward_banks_pre) <- "Attitudes toward Banks- Baseline"
phase_3_all_outcomes$att_toward_banks_post <- (phase_3_all_outcomes$financial_att_1_1_post + phase_3_all_outcomes$financial_att_1_2_post + phase_3_all_outcomes$financial_att_1_3_post + phase_3_all_outcomes$financial_att_1_4_post + phase_3_all_outcomes$financial_att_1_5_post) / 5
label(phase_3_all_outcomes$att_toward_banks_post) <- "Attitudes toward Banks- Post"
phase_3_all_outcomes$att_toward_banks_follow <- (phase_3_all_outcomes$financial_att_1_1_follow + phase_3_all_outcomes$financial_att_1_2_follow + phase_3_all_outcomes$financial_att_1_3_follow + phase_3_all_outcomes$financial_att_1_4_follow + phase_3_all_outcomes$financial_att_1_5_follow) / 5
label(phase_3_all_outcomes$financial_att_1_1) <- "I find dealing with banks to be stressful: Pre"
label(phase_3_all_outcomes$financial_att_1_1_post) <- "I find dealing with banks to be stressful: Post"
label(phase_3_all_outcomes$financial_att_1_1_follow) <- "I find dealing with banks to be stressful: Follow"
label(phase_3_all_outcomes$financial_att_1_2) <- "Banks make it easy for their customers to learn about the financial services they provide: Pre"
label(phase_3_all_outcomes$financial_att_1_2_post) <- "Banks make it easy for their customers to learn about the financial services they provide: Post"
label(phase_3_all_outcomes$financial_att_1_2_follow) <- "Banks make it easy for their customers to learn about the financial services they provide: Follow-up"
label(phase_3_all_outcomes$financial_att_1_3) <- "Banks protect the privacy and personal information of their customers: Pre"
label(phase_3_all_outcomes$financial_att_1_3_post) <- "Banks protect the privacy and personal information of their customers: Post"
label(phase_3_all_outcomes$financial_att_1_3_follow) <- "Banks protect the privacy and personal information of their customers: Follow-up"
label(phase_3_all_outcomes$financial_att_1_4) <- "Banks generally have their customers’ best interests in mind: Pre"
label(phase_3_all_outcomes$financial_att_1_4_post) <- "Banks generally have their customers’ best interests in mind: Post"
label(phase_3_all_outcomes$financial_att_1_4_follow) <- "Banks generally have their customers’ best interests in mind: Folow-up"
label(phase_3_all_outcomes$financial_att_1_5) <- "Banks offer accounts and other products that fit my needs well: Pre"
label(phase_3_all_outcomes$financial_att_1_5_post) <- "Banks offer accounts and other products that fit my needs well: Post"
label(phase_3_all_outcomes$financial_att_1_5_follow) <- "Banks offer accounts and other products that fit my needs well: Follow-up"
label(phase_3_all_outcomes$att_toward_banks_follow) <- "Attitudes toward Banks- Follow"
explore the data
install.packages("summarytools")
library(summarytools)
# Create a detailed descriptive table for the factor variable
freq(phase_3_all_outcomes$race)
class(phase_3_all_outcomes$race)
library(haven)
phase_3_all_outcomes$race <- as_factor(phase_3_all_outcomes$race)
class(phase_3_all_outcomes$demographics_4)
phase_3_all_outcomes$demographics_4 <- as_factor(phase_3_all_outcomes$demographics_4)
class(phase_3_all_outcomes$demographics_5)
phase_3_all_outcomes$demographics_5 <- as_factor(phase_3_all_outcomes$demographics_5)
3 Groups Demographics
library(table1)
table1(~ organization + race + age + demographics_4 + demographics_5|participant_type.fac, data=phase_3_all_outcomes)
2 Groups Demographics
table1(~ organization + race + age + demographics_4 + demographics_5|participant_type_2, data=phase_3_all_outcomes)
Outcome 1: Subject Financial Knowledge
My understanding is that this captures “Does using HMSRU have any
impact on participants’ financial knowledge?”
This covers Game 4 (Credit Reports and Scores): Q27, 28, 29, Game 10
(You Can Bank On It): Q24, 25, 26, and Game 14 (Your Spending and Saving
Plan): Q21, 22, 23
Baseline Equivalence
The WWC calculates effect sizes with Hedge’s G for continuous
variables
install.packages("effsize")
library(effsize)
library(boot)
library(table1)
library(MatchIt)
# Calculate means and standard deviations for each group
summary_stats_self_know_overall_pre <- phase_3_all_outcomes %>%
group_by(participant_type_2) %>%
summarise(
mean = mean(SelfKnow_OverallScore_pre, na.rm = TRUE),
sd = sd(SelfKnow_OverallScore_pre, na.rm = TRUE),
n = n()
)
# View the summary statistics
print(summary_stats_self_know_overall_pre)
library(effectsize)
Attaching package: ‘effectsize’
The following object is masked from ‘package:psych’:
phi
library(esvis)
hedg_g(phase_3_all_outcomes, SelfKnow_OverallScore_pre ~ participant_type_2)
cohensD(SelfKnow_OverallScore_pre ~ participant_type_2, data = phase_3_all_outcomes)
# Calculate means and standard deviations for each group
summary_stats_self_know_overall_pre_org <- phase_3_all_outcomes %>%
group_by(organization) %>%
summarise(
mean = mean(SelfKnow_OverallScore_pre, na.rm = TRUE),
sd = sd(SelfKnow_OverallScore_pre, na.rm = TRUE),
n = n()
)
# View the summary statistics
print(summary_stats_self_know_overall_pre_org)
library(lsr)
cohensD(SelfKnow_OverallScore_pre ~ organization, data = phase_3_all_outcomes)
hedg_g(phase_3_all_outcomes, SelfKnow_OverallScore_pre ~ organization)
# Calculate means and standard deviations for each group
summary_stats_self_know_overall_pre_race <- phase_3_all_outcomes %>%
group_by(race) %>%
summarise(
mean = mean(SelfKnow_OverallScore_pre, na.rm = TRUE),
sd = sd(SelfKnow_OverallScore_pre, na.rm = TRUE),
n = n()
)
# View the summary statistics
print(summary_stats_self_know_overall_pre_race)
# Calculate means and standard deviations for each group
summary_stats_obj_know_overall <- phase_3_all_outcomes %>%
group_by(participant_type_2) %>%
summarise(
mean = mean(Obj_OverallScore_pre, na.rm = TRUE),
sd = sd(Obj_OverallScore_pre, na.rm = TRUE),
n = n()
)
# View the summary statistics
print(summary_stats_obj_know_overall)
NA
library(lsr)
cohensD(Obj_OverallScore_pre ~ participant_type_2, data = phase_3_all_outcomes)
hedg_g(phase_3_all_outcomes, Obj_OverallScore_pre ~ participant_type_2)
hedg_g(phase_3_all_outcomes, SelfKnow_OverallScore_pre ~ organization)
# Calculate means and standard deviations for each group
summary_stats_att_overall <- phase_3_all_outcomes %>%
group_by(participant_type_2) %>%
summarise(
mean = mean(att_toward_banks_pre, na.rm = TRUE),
sd = sd(att_toward_banks_pre, na.rm = TRUE),
n = n()
)
# View the summary statistics
print(summary_stats_att_overall)
library(lsr)
cohensD(att_toward_banks_pre ~ participant_type_2, data = phase_3_all_outcomes)
[1] 0.1027145
hedg_g(phase_3_all_outcomes, att_toward_banks_pre ~ participant_type_2)
# Calculate means and standard deviations for each group
summary_stats_fs_overall <- phase_3_all_outcomes %>%
group_by(participant_type_2) %>%
summarise(
mean = mean(fs_pre, na.rm = TRUE),
sd = sd(fs_pre, na.rm = TRUE),
n = n()
)
# View the summary statistics
print(summary_stats_fs_overall)
library(lsr)
cohensD(fs_pre ~ participant_type_2, data = phase_3_all_outcomes)
[1] 0.1002707
hedg_g(phase_3_all_outcomes, fs_pre ~ participant_type_2)
# Calculate means and standard deviations for each group
summary_stats_fwb_overall <- phase_3_all_outcomes %>%
group_by(participant_type_2) %>%
summarise(
mean = mean(fwb_pre, na.rm = TRUE),
sd = sd(fwb_pre, na.rm = TRUE),
n = n()
)
# View the summary statistics
print(summary_stats_fwb_overall)
library(lsr)
cohensD(fwb_pre ~ participant_type_2, data = phase_3_all_outcomes)
[1] 0.1829208
hedg_g(phase_3_all_outcomes, fwb_pre ~ participant_type_2)
#Pre/Post/Follow up Exploration
Outcome 1
table1(~ SelfKnow_OverallScore_pre + SelfKnow_OverallScore_post * SelfKnow_OverallScore_follow|participant_type.fac, data=phase_3_all_outcomes)
install.packages("ggplot2") # Uncomment if you haven't installed ggplot2
install.packages("zoo")
library(zoo)
library(ggplot2)
# Create a data frame
self_know <- data.frame(
Group = rep(c("Treatment", "Non-Completer Comparison Group", "WinCo Comparison Group"), each = 3),
Timepoint = rep(c("1:Pre", "2:Post", "3: Follow-Up"), times = 3),
Score = c(2.98, 3.15, 3.12, 2.96, NA, 2.98, 3.10, NA, 3.12)
)
self_know <- self_know %>%
group_by(Group) %>%
mutate(Score = na.approx(Score, na.rm = FALSE)) %>%
ungroup()
# Create the plot
ggplot(self_know, aes(x = Timepoint, y = Score, group = Group, color = Group)) +
geom_line() +
geom_point(size = 4) +
labs(title = "Pre, Post, and Follow-Up Results",
x = "Timepoint",
y = "Score") +
theme_minimal()
Outcome 2
table1(~ Obj_OverallScore_pre + Obj_OverallScore_post + Obj_OverallScore_follow|participant_type.fac, data=phase_3_all_outcomes)
install.packages("ggplot2") # Uncomment if you haven't installed ggplot2
install.packages("zoo")
library(zoo)
library(ggplot2)
# Create a data frame
obj_know <- data.frame(
Group = rep(c("Treatment", "Non-Completer Comparison Group", "WinCo Comparison Group"), each = 3),
Timepoint = rep(c("1: Pre", "2: Post", "3: Follow-Up"), times = 3),
Score = c(7.21, 7.22, 7.18, 7.20, NA, 7.20, 7.23, NA, 7.21)
)
obj_know <- obj_know %>%
group_by(Group) %>%
mutate(Score = na.approx(Score, na.rm = FALSE)) %>%
ungroup()
# Create the plot
ggplot(obj_know, aes(x = Timepoint, y = Score, group = Group, color = Group)) +
geom_line() +
geom_point(size = 4) +
labs(title = "Pre, Post, and Follow-Up Results",
x = "Timepoint",
y = "Score") +
theme_minimal()
write_sav(phase_3_all_outcomes, "phase_3_final_10_16.sav")
Outcome 3: Atitudes Toward Banks
table1(~ financial_att_1_1 + financial_att_1_1_post + financial_att_1_1_follow + financial_att_1_2 + financial_att_1_2_post + financial_att_1_2_follow + financial_att_1_3 + financial_att_1_3_post + financial_att_1_3_follow + financial_att_1_4 + financial_att_1_4_post + financial_att_1_4_follow + financial_att_1_5 + financial_att_1_5_post + financial_att_1_5_follow + att_toward_banks_pre + att_toward_banks_post + att_toward_banks_follow|participant_type.fac, data=phase_3_all_outcomes)
library(zoo)
library(ggplot2)
# Create a data frame
att_banks <- data.frame(
Group = rep(c("Treatment", "Non-Completer Comparison Group", "WinCo Comparison Group"), each = 3),
Timepoint = rep(c("1: Pre", "2: Post", "3: Follow-Up"), times = 3),
Score = c(2.81, 2.88, 2.83, 2.77, NA, 2.77, 2.74, NA, 2.78)
)
att_banks <- att_banks %>%
group_by(Group) %>%
mutate(Score = na.approx(Score, na.rm = FALSE)) %>%
ungroup()
# Create the plot
ggplot(att_banks, aes(x = Timepoint, y = Score, group = Group, color = Group)) +
geom_line() +
geom_point(size = 4) +
labs(title = "Pre, Post, and Follow-Up Results: Attitudes Towards Banks",
x = "Timepoint",
y = "Score") +
theme_minimal()
Outcome 4: Finanical Skill
library(haven)
phase_3_all_outcomes$fs1_complexdecision_pre <- as.numeric(phase_3_all_outcomes$fs1_complexdecision_pre)
phase_3_all_outcomes$fs1_complexdecision_post <- as.numeric(phase_3_all_outcomes$fs1_complexdecision_post)
phase_3_all_outcomes$fs1_complexdecision_follow_fol <- as.numeric(phase_3_all_outcomes$fs1_complexdecision_follow_fol)
phase_3_all_outcomes$fs2_goodnewdecision_pre <- as.numeric(phase_3_all_outcomes$fs2_goodnewdecision_pre)
phase_3_all_outcomes$fs2_goodnewdecision_post <- as.numeric(phase_3_all_outcomes$fs2_goodnewdecision_post)
phase_3_all_outcomes$fs2_goodnewdecision_follow_fol <- as.numeric(phase_3_all_outcomes$fs2_goodnewdecision_follow_fol)
phase_3_all_outcomes$fs2_goodnewdecision_pre <- as.numeric(phase_3_all_outcomes$fs2_goodnewdecision_pre)
phase_3_all_outcomes$fs2_goodnewdecision_pre <- as.numeric(phase_3_all_outcomes$fs2_goodnewdecision_pre)
phase_3_all_outcomes$fs2_goodnewdecision_post <- as.numeric(phase_3_all_outcomes$fs2_goodnewdecision_post)
phase_3_all_outcomes$fs2_goodnewdecision_follow_fol <- as.numeric(phase_3_all_outcomes$fs2_goodnewdecision_follow_fol)
phase_3_all_outcomes$fs2_goodnewdecision_pre <- as.numeric(phase_3_all_outcomes$fs2_goodnewdecision_pre)
table1(~ fs1_complexdecision_pre + fs1_complexdecision_post + fs1_complexdecision_follow_fol + fs2_goodnewdecision_pre + fs2_goodnewdecision_post + fs2_goodnewdecision_follow_fol + fs3_followthrough_pre + fs3_followthrough_post + fs3_followthrough_follow_fol + fs4_recognizegoodinvestment_pre + fs4_recognizegoodinvestment_post + fs4_recognizegoodinvestment_fol + fs5_keepfromspending_pre + fs5_keepfromspending_post + fs5_keepfromspending_fol + fs6_howtosave_pre + fs6_howtosave_post + fs6_howtosave_fol + fs7_findadvice_pre + fs7_findadvice_post + fs7_findadvice_fol + fs8_notenoughinfo_pre + fs8_notenoughinfo_post + fs8_notenoughinfo_fol + fs9_whenadvice_pre + fs9_whenadvice_post + fs9_whenadvice_fol + fs10_struggleunderstand_pre + fs10_struggleunderstand_post + fs10_struggleunderstand_fol|participant_type.fac, data=phase_3_all_outcomes)
table1(~ fs_pre + fs_post + fs_fol|participant_type.fac, data=phase_3_all_outcomes)
library(zoo)
library(ggplot2)
# Create a data frame
fs <- data.frame(
Group = rep(c("Treatment", "Non-Completer Comparison Group", "WinCo Comparison Group"), each = 3),
Timepoint = rep(c("1: Pre", "2: Post", "3: Follow-Up"), times = 3),
Score = c(50.8, 53.9, 54.8, 49.8, NA, 49.8, 49.4, NA, 49.6)
)
fs <- fs %>%
group_by(Group) %>%
mutate(Score = na.approx(Score, na.rm = FALSE)) %>%
ungroup()
# Create the plot
ggplot(fs, aes(x = Timepoint, y = Score, group = Group, color = Group)) +
geom_line() +
geom_point(size = 4) +
labs(title = "Pre, Post, and Follow-Up Results: Financial Skill",
x = "Timepoint",
y = "Score") +
theme_minimal()
Outcome 5
label(phase_3_all_outcomes$financial_behave_1) <- "Do you have a spending and saving plan or budget that you use to help manage your finances?"
label(phase_3_all_outcomes$financial_behave_2) <- "How often do you check to see if you are following your spending and saving plan/budget?"
label(phase_3_all_outcomes$financial_behave_3) <- "How often do you review your spending and saving plan/budget to see if you need to make changes to it?"
label(phase_3_all_outcomes$financial_behave_1_post) <- "When you started to play the How Money Smart Are You games, did you have a spending and saving plan or budget that you used to help manage your finances?"
label(phase_3_all_outcomes$financial_behave_2_post) <- "Since starting to play the How Money Smart Are You games, have you reviewed your spending and saving plan/budget to see if you need to make changes to it?"
label(phase_3_all_outcomes$financial_behave_3_post) <- "Since starting to play the How Money Smart Are You games, have you created a spending and saving plan/budget?"
label(phase_3_all_outcomes$financial_behave_4_post) <- "How likely do you think it is that you will create a spending and saving plan or budget in the next 3 months?"
label(phase_3_all_outcomes$financial_behave_1_follow) <- "Do you have a spending and saving plan or budget that you use to help manage your finances?"
label(phase_3_all_outcomes$financial_behave_2_follow) <- "How often do you check to see if you are following your spending and saving plan/budget?"
label(phase_3_all_outcomes$financial_behave_3_follow) <- "How often do you review your spending and saving plan/budget to see if you need to make changes to it?"
table1(~ factor(financial_behave_1) + financial_behave_2 + financial_behave_3 + factor(financial_behave_1_post) + factor(financial_behave_2_post) + factor(financial_behave_3_post) + financial_behave_4_post + factor(financial_behave_1_follow) + financial_behave_2_follow + financial_behave_3_follow|participant_type.fac, data=phase_3_all_outcomes)
table1(~ factor(financial_behave_4) + factor(financial_behave_6) + factor(financial_behave_7) + factor(financial_behave_8) + factor(financial_behave_9) + factor(financial_behave_3_post) + factor(financial_behave_5_post) + factor(financial_behave_6_post) + factor(financial_behave_7_post) + factor(financial_behave_8_post) + factor(financial_behave_9_post) + factor(financial_behave_4_follow) + factor(financial_behave_6_follow) + factor(financial_behave_7_follow) + factor(financial_behave_8_follow) + factor(financial_behave_9_follow) |participant_type.fac, data=phase_3_all_outcomes)
Outcome 6
table1(~ fwb1_exp_pre + fwb3_secure_pre + fwb5_never_pre + fwb6_enjoy_pre + fwb2_getby_pre + fwb4_concern_pre + fwb9_strain_pre + fwb10_left_pre + fwb7_behind_pre + fwb8_control_pre + fwb1_exp_post + fwb3_secure_post + fwb5_never_post + fwb6_enjoy_post + fwb2_getby_post + fwb4_concern_post + fwb9_strain_post + fwb10_left_post + fwb7_behind_post + fwb8_control_post + fwb1_exp_follow + fwb3_secure_follow + fwb5_never_follow + fwb6_enjoy_follow + fwb2_getby_follow + fwb4_concern_follow + fwb9_strain_follow + fwb10_left_follow + fwb7_behind_follow + fwb8_control_follow|participant_type.fac, data=phase_3_all_outcomes)
table1(~ fwb_pre + fwb_post + fwb_follow|participant_type.fac, data=phase_3_all_outcomes)
library(zoo)
library(ggplot2)
# Create a data frame
fwb <- data.frame(
Group = rep(c("Treatment", "Non-Completer Comparison Group", "WinCo Comparison Group"), each = 3),
Timepoint = rep(c("1: Pre", "2: Post", "3: Follow-Up"), times = 3),
Score = c(53.0, 53.8, 55.4, 51.2, NA, 50.6, 50.4, NA, 51.0)
)
fwb <- fwb %>%
group_by(Group) %>%
mutate(Score = na.approx(Score, na.rm = FALSE)) %>%
ungroup()
# Create the plot
ggplot(fwb, aes(x = Timepoint, y = Score, group = Group, color = Group)) +
geom_line() +
geom_point(size = 4) +
labs(title = "Pre, Post, and Follow-Up Results: Financial Well-being",
x = "Timepoint",
y = "Score") +
theme_minimal()
table1(~ games_before_pretest + games_before_post_test + games_before_follow|participant_type.fac, data=phase_3_all_outcomes)
LS0tCnRpdGxlOiAiUiBOb3RlYm9vayIKb3V0cHV0OgogIGh0bWxfbm90ZWJvb2s6IGRlZmF1bHQKICB3b3JkX2RvY3VtZW50OiBkZWZhdWx0CiAgcGRmX2RvY3VtZW50OiBkZWZhdWx0Ci0tLQoKIyMgdXBsb2FkIGRhdGEgCmBgYHtyfQpsaWJyYXJ5KHJlYWR4bCkKZ2FtZV9yZXBvcnQgPC0gcmVhZF9leGNlbCgic3BlY2lmaWMtdXNlci1hbGwtZ2FtZS1yZXBvcnQueGxzeCIsIAogICAgY29sX3R5cGVzID0gYygidGV4dCIsICJudW1lcmljIiwgImRhdGUiLCAKICAgICAgICAiZGF0ZSIsICJudW1lcmljIikpCnByaW50KGdhbWVfcmVwb3J0KQpgYGAKCmBgYHtyfQpsaWJyYXJ5KGhhdmVuKQpwaGFzZV8zIDwtIHJlYWRfZHRhKCJGRElDIEhNU1JVIFBoYXNlIDNfRmluYWxfMTBfMTQuZHRhIikKcHJpbnQocGhhc2VfMykKYGBgCgoKIyMgYWRkIHBhY2thZ2VzCmBgYHtyfQpsaWJyYXJ5KHBzeWNoKQpsaWJyYXJ5KHRpZHl2ZXJzZSkKYGBgCgojIyBjcmVhdGUgdmFyaWFibGUgdG8gY2FwdHVyZSBnYW1lcyBjb21wbGV0ZWQgYXQgcHJlL3Bvc3QvZm9sbG93IHVwCgojIyMgY2xlYW4gdXAgZ2FtZSByZXBvcnQgZGF0YQoKYGBge3J9CmdhbWVfcmVwb3J0XzIgPC0gZ2FtZV9yZXBvcnQgJT4lCiAgc2VsZWN0KC4sCiAgICAgICAgIFJlY2lwaWVudEVtYWlsLAogICAgICAgICBnYW1lX2lkLAogICAgICAgICBjb21wbGV0ZV9nYW1lX2RhdGUpCmBgYAoKCmBgYHtyfQojIFRyYW5zZm9ybSBkYXRhIGZyb20gbG9uZyB0byB3aWRlCmdhbWVfcmVwb3J0X3dpZGUgPC0gZ2FtZV9yZXBvcnRfMiAlPiUKICBwaXZvdF93aWRlcihuYW1lc19mcm9tID0gZ2FtZV9pZCwgdmFsdWVzX2Zyb20gPSBjb21wbGV0ZV9nYW1lX2RhdGUpCgojIFZpZXcgdGhlIHdpZGUgZGF0YQpwcmludChnYW1lX3JlcG9ydF93aWRlKQpgYGAKCmBgYHtyfQpsaWJyYXJ5KGRwbHlyKQpnYW1lX3JlcG9ydF8zIDwtIGdhbWVfcmVwb3J0X3dpZGUgJT4lIHJlbmFtZShnYW1lXzFfZGF0ZSA9IDMsIGdhbWVfMl9kYXRlID0gNCwgZ2FtZV8zX2RhdGUgPSA1LCBnYW1lXzRfZGF0ZSA9IDE1LCBnYW1lXzVfZGF0ZSA9IDYsIGdhbWVfNl9kYXRlID0gNywgZ2FtZV83X2RhdGUgPSA4LCBnYW1lXzhfZGF0ZSA9IDksIGdhbWVfOV9kYXRlID0gMTAsIGdhbWVfMTBfZGF0ZSA9IDExLCBnYW1lXzExX2RhdGUgPSAyLCBnYW1lXzEyX2RhdGUgPSAxMiwgZ2FtZV8xM19kYXRlID0gMTMsIGdhbWVfMTRfZGF0ZSA9IDE0KQpgYGAKCmBgYHtyfQpnYW1lX3JlcG9ydF8zIDwtIGdhbWVfcmVwb3J0XzMgJT4lCnNlbGVjdCguLAogICAgICAgUmVjaXBpZW50RW1haWwsCiAgICAgICBnYW1lXzFfZGF0ZSwKICAgICAgIGdhbWVfMl9kYXRlLAogICAgICAgZ2FtZV8zX2RhdGUsCiAgICAgICBnYW1lXzRfZGF0ZSwKICAgICAgIGdhbWVfNV9kYXRlLAogICAgICAgZ2FtZV82X2RhdGUsCiAgICAgICBnYW1lXzdfZGF0ZSwKICAgICAgIGdhbWVfOF9kYXRlLAogICAgICAgZ2FtZV85X2RhdGUsCiAgICAgICBnYW1lXzEwX2RhdGUsCiAgICAgICBnYW1lXzExX2RhdGUsCiAgICAgICBnYW1lXzEyX2RhdGUsCiAgICAgICBnYW1lXzEzX2RhdGUsCiAgICAgICBnYW1lXzE0X2RhdGUpCmBgYAoKIyMjIG1lcmdlIHRoZSB0d28gZGF0YXNldHMgdG8gY2FwdHVyZSBhIGRhdGUgZm9yIHByZQpgYGB7cn0KcGhhc2VfM19tZXJnZSA8LSBtZXJnZShwaGFzZV8zLCBnYW1lX3JlcG9ydF8zLCBieSA9ICJSZWNpcGllbnRFbWFpbCIsIGFsbC54ID0gVFJVRSkKYGBgCgoKYGBge3J9CnBoYXNlXzNfNCA8LSBwaGFzZV8zX21lcmdlICU+JQogIHJvd3dpc2UoKSAlPiUKICBtdXRhdGUoZ2FtZXNfYmVmb3JlX3ByZXRlc3QgPSBzdW0oY19hY3Jvc3Moc3RhcnRzX3dpdGgoImdhbWVfIikpIDwgUmVjb3JkZWREYXRlLCBuYS5ybSA9IFRSVUUpKQpgYGAKCiMjIyBwb3N0LXRlc3QKYGBge3J9CnBoYXNlXzNfNCA8LSBwaGFzZV8zXzQgJT4lCiAgcm93d2lzZSgpICU+JQogIG11dGF0ZShnYW1lc19iZWZvcmVfcG9zdF90ZXN0ID0gc3VtKGNfYWNyb3NzKHN0YXJ0c193aXRoKCJnYW1lXyIpKSA8IFJlY29yZGVkRGF0ZV9wb3N0LCBuYS5ybSA9IFRSVUUpKQpgYGAKCiMjIyBmb2xsb3cgdXAKCmBgYHtyfQpwaGFzZV8zXzQgPC0gcGhhc2VfM180ICU+JQogIHJvd3dpc2UoKSAlPiUKICBtdXRhdGUoZ2FtZXNfYmVmb3JlX2ZvbGxvdyA9IHN1bShjX2Fjcm9zcyhzdGFydHNfd2l0aCgiZ2FtZV8iKSkgPCBSZWNvcmRlZERhdGVfZm9sbG93LCBuYS5ybSA9IFRSVUUpKQpgYGAKCiMjIE91dGNvbWU6IFNlbGYtUmVwb3J0IEtub3dsZWRnZQoKYGBge3J9CnBoYXNlXzNfNCRnYW1lXzRfU2VsZlRvdGFsU2NvcmVfUHJlIDwtIHBoYXNlXzNfNCRmaW5hbmNpYWxfa25vd18xXzcgKyBwaGFzZV8zXzQkZmluYW5jaWFsX2tub3dfMV84ICsgcGhhc2VfM180JGZpbmFuY2lhbF9rbm93XzFfOQoKCnBoYXNlXzNfNCRnYW1lXzRfU2VsZlNjYWxlU2NvcmVfUHJlIDwtICgocGhhc2VfM180JGdhbWVfNF9TZWxmVG90YWxTY29yZV9QcmUgLyAxMikqNCkKYGBgCgpgYGB7cn0KcGhhc2VfM180JGdhbWVfMTBfU2VsZlRvdGFsU2NvcmVfUHJlIDwtIHBoYXNlXzNfNCRmaW5hbmNpYWxfa25vd18xXzQgKyBwaGFzZV8zXzQkZmluYW5jaWFsX2tub3dfMV81ICsgcGhhc2VfM180JGZpbmFuY2lhbF9rbm93XzFfNgoKCnBoYXNlXzNfNCRnYW1lXzEwX1NlbGZTY2FsZVNjb3JlX1ByZSA8LSAoKHBoYXNlXzNfNCRnYW1lXzEwX1NlbGZUb3RhbFNjb3JlX1ByZSAvIDEyKSo0KQpgYGAKCmBgYHtyfQpwaGFzZV8zXzQkZ2FtZV8xNF9TZWxmVG90YWxTY29yZV9QcmUgPC0gcGhhc2VfM180JGZpbmFuY2lhbF9rbm93XzFfMSArIHBoYXNlXzNfNCRmaW5hbmNpYWxfa25vd18xXzIgKyBwaGFzZV8zXzQkZmluYW5jaWFsX2tub3dfMV8zCgoKcGhhc2VfM180JGdhbWVfMTRfU2VsZlNjYWxlU2NvcmVfUHJlIDwtICgocGhhc2VfM180JGdhbWVfMTRfU2VsZlRvdGFsU2NvcmVfUHJlIC8gMTIpKjQpCmBgYAoKCmBgYHtyfQpwaGFzZV8zXzQkZ2FtZV80X1NlbGZUb3RhbFNjb3JlX1Bvc3QgPC0gcGhhc2VfM180JGZpbmFuY2lhbF9rbm93XzFfN19wb3N0ICsgcGhhc2VfM180JGZpbmFuY2lhbF9rbm93XzFfOF9wb3N0ICsgcGhhc2VfM180JGZpbmFuY2lhbF9rbm93XzFfOV9wb3N0CgoKcGhhc2VfM180JGdhbWVfNF9TZWxmU2NhbGVTY29yZV9Qb3N0IDwtICgocGhhc2VfM180JGdhbWVfNF9TZWxmVG90YWxTY29yZV9Qb3N0IC8gMTIpKjQpCmBgYAoKYGBge3J9CnBoYXNlXzNfNCRnYW1lXzEwX1NlbGZUb3RhbFNjb3JlX1Bvc3QgPC0gcGhhc2VfM180JGZpbmFuY2lhbF9rbm93XzFfNCArIHBoYXNlXzNfNCRmaW5hbmNpYWxfa25vd18xXzUgKyBwaGFzZV8zXzQkZmluYW5jaWFsX2tub3dfMV82CgoKcGhhc2VfM180JGdhbWVfMTBfU2VsZlNjYWxlU2NvcmVfUG9zdCA8LSAoKHBoYXNlXzNfNCRnYW1lXzEwX1NlbGZUb3RhbFNjb3JlX1Bvc3QgLyAxMikqNCkKYGBgCgoKYGBge3J9CnBoYXNlXzNfNCRnYW1lXzE0X1NlbGZUb3RhbFNjb3JlX1Bvc3QgPC0gcGhhc2VfM180JGZpbmFuY2lhbF9rbm93XzFfMSArIHBoYXNlXzNfNCRmaW5hbmNpYWxfa25vd18xXzIgKyBwaGFzZV8zXzQkZmluYW5jaWFsX2tub3dfMV8zCgoKcGhhc2VfM180JGdhbWVfMTRfU2VsZlNjYWxlU2NvcmVfUG9zdCA8LSAoKHBoYXNlXzNfNCRnYW1lXzE0X1NlbGZUb3RhbFNjb3JlX1Bvc3QgLyAxMikqNCkKYGBgCgoKYGBge3J9CnBoYXNlXzNfNCRnYW1lXzRfU2VsZlRvdGFsU2NvcmVfRm9sbG93IDwtIHBoYXNlXzNfNCRmaW5hbmNpYWxfa25vd18xXzdfZm9sbG93ICsgcGhhc2VfM180JGZpbmFuY2lhbF9rbm93XzFfOF9mb2xsb3cgKyBwaGFzZV8zXzQkZmluYW5jaWFsX2tub3dfMV85X2ZvbGxvdwoKCnBoYXNlXzNfNCRnYW1lXzRfU2VsZlNjYWxlU2NvcmVfRm9sbG93IDwtICgocGhhc2VfM180JGdhbWVfNF9TZWxmVG90YWxTY29yZV9Gb2xsb3cgLyAxMikqNCkKYGBgCgpgYGB7cn0KcGhhc2VfM180JGdhbWVfMTBfU2VsZlRvdGFsU2NvcmVfRm9sbG93IDwtIHBoYXNlXzNfNCRmaW5hbmNpYWxfa25vd18xXzQgKyBwaGFzZV8zXzQkZmluYW5jaWFsX2tub3dfMV81ICsgcGhhc2VfM180JGZpbmFuY2lhbF9rbm93XzFfNgoKCnBoYXNlXzNfNCRnYW1lXzEwX1NlbGZTY2FsZVNjb3JlX0ZvbGxvdyA8LSAoKHBoYXNlXzNfNCRnYW1lXzEwX1NlbGZUb3RhbFNjb3JlX0ZvbGxvdyAvIDEyKSo0KQpgYGAKCmBgYHtyfQpwaGFzZV8zXzQkZ2FtZV8xNF9TZWxmVG90YWxTY29yZV9Gb2xsb3cgPC0gcGhhc2VfM180JGZpbmFuY2lhbF9rbm93XzFfMSArIHBoYXNlXzNfNCRmaW5hbmNpYWxfa25vd18xXzIgKyBwaGFzZV8zXzQkZmluYW5jaWFsX2tub3dfMV8zCgoKcGhhc2VfM180JGdhbWVfMTRfU2VsZlNjYWxlU2NvcmVfRm9sbG93IDwtICgocGhhc2VfM180JGdhbWVfMTRfU2VsZlRvdGFsU2NvcmVfRm9sbG93IC8gMTIpKjQpCmBgYAoKYGBge3J9CnBoYXNlXzNfYWxsX291dGNvbWVzPC0gcGhhc2VfM180CmBgYAoKIyMgT3V0Y29tZTogT2JqZWN0aXZlIEtub3dsZWRnZQoKYGBge3J9CnBoYXNlXzNfYWxsX291dGNvbWVzJGdhbWVfNF9PYmpUb3RhbFNjb3JlX1ByZSA8LSBwaGFzZV8zX2FsbF9vdXRjb21lcyRnZW5lcmFsX2tub3dfNyArIHBoYXNlXzNfYWxsX291dGNvbWVzJGdlbmVyYWxfa25vd184ICsgcGhhc2VfM19hbGxfb3V0Y29tZXMkZ2VuZXJhbF9rbm93XzkKCgpwaGFzZV8zX2FsbF9vdXRjb21lcyRnYW1lXzRfT2JqU2NhbGVTY29yZV9QcmUgPC0gKChwaGFzZV8zX2FsbF9vdXRjb21lcyRnYW1lXzRfT2JqVG90YWxTY29yZV9QcmUgLyAxMikqNCkKYGBgCgpgYGB7cn0KcGhhc2VfM19hbGxfb3V0Y29tZXMkZ2FtZV8xMF9PYmpUb3RhbFNjb3JlX1ByZSA8LSBwaGFzZV8zX2FsbF9vdXRjb21lcyRnZW5lcmFsX2tub3dfMyArIHBoYXNlXzNfYWxsX291dGNvbWVzJGdlbmVyYWxfa25vd180ICsgcGhhc2VfM19hbGxfb3V0Y29tZXMkZ2VuZXJhbF9rbm93XzUgKyBwaGFzZV8zX2FsbF9vdXRjb21lcyRnZW5lcmFsX2tub3dfNgoKCnBoYXNlXzNfYWxsX291dGNvbWVzJGdhbWVfMTBfT2JqU2NhbGVTY29yZV9QcmUgPC0gKChwaGFzZV8zX2FsbF9vdXRjb21lcyRnYW1lXzEwX09ialRvdGFsU2NvcmVfUHJlIC8gMTIpKjQpCmBgYAoKYGBge3J9CnBoYXNlXzNfYWxsX291dGNvbWVzJGdhbWVfMTRfT2JqVG90YWxTY29yZV9QcmUgPC0gcGhhc2VfM19hbGxfb3V0Y29tZXMkZ2VuZXJhbF9rbm93XzEgKyBwaGFzZV8zX2FsbF9vdXRjb21lcyRnZW5lcmFsX2tub3dfMgoKCnBoYXNlXzNfYWxsX291dGNvbWVzJGdhbWVfMTRfT2JqU2NhbGVTY29yZV9QcmUgPC0gKChwaGFzZV8zX2FsbF9vdXRjb21lcyRnYW1lXzE0X09ialRvdGFsU2NvcmVfUHJlIC8gMTIpKjQpCmBgYAoKYGBge3J9CnBoYXNlXzNfYWxsX291dGNvbWVzJGdhbWVfNF9PYmpUb3RhbFNjb3JlX1Bvc3QgPC0gcGhhc2VfM19hbGxfb3V0Y29tZXMkZ2VuZXJhbF9rbm93XzdfcG9zdCArIHBoYXNlXzNfYWxsX291dGNvbWVzJGdlbmVyYWxfa25vd184X3Bvc3QgKyBwaGFzZV8zX2FsbF9vdXRjb21lcyRnZW5lcmFsX2tub3dfOV9wb3N0CgoKcGhhc2VfM19hbGxfb3V0Y29tZXMkZ2FtZV80X09ialNjYWxlU2NvcmVfUG9zdCA8LSAoKHBoYXNlXzNfYWxsX291dGNvbWVzJGdhbWVfNF9PYmpUb3RhbFNjb3JlX1Bvc3QgLyAxMikqNCkKYGBgCgpgYGB7cn0KcGhhc2VfM19hbGxfb3V0Y29tZXMkZ2FtZV8xMF9PYmpUb3RhbFNjb3JlX1Bvc3QgPC0gcGhhc2VfM19hbGxfb3V0Y29tZXMkZ2VuZXJhbF9rbm93XzNfcG9zdCArIHBoYXNlXzNfYWxsX291dGNvbWVzJGdlbmVyYWxfa25vd180X3Bvc3QgKyBwaGFzZV8zX2FsbF9vdXRjb21lcyRnZW5lcmFsX2tub3dfNV9wb3N0ICsgcGhhc2VfM19hbGxfb3V0Y29tZXMkZ2VuZXJhbF9rbm93XzZfcG9zdAoKCnBoYXNlXzNfYWxsX291dGNvbWVzJGdhbWVfMTBfT2JqU2NhbGVTY29yZV9Qb3N0IDwtICgocGhhc2VfM19hbGxfb3V0Y29tZXMkZ2FtZV8xMF9PYmpUb3RhbFNjb3JlX1Bvc3QgLyAxMikqNCkKYGBgCgpgYGB7cn0KcGhhc2VfM19hbGxfb3V0Y29tZXMkZ2FtZV8xNF9PYmpUb3RhbFNjb3JlX1Bvc3QgPC0gcGhhc2VfM19hbGxfb3V0Y29tZXMkZ2VuZXJhbF9rbm93XzFfcG9zdCArIHBoYXNlXzNfYWxsX291dGNvbWVzJGdlbmVyYWxfa25vd18yX3Bvc3QKCgpwaGFzZV8zX2FsbF9vdXRjb21lcyRnYW1lXzE0X09ialNjYWxlU2NvcmVfUG9zdCA8LSAoKHBoYXNlXzNfYWxsX291dGNvbWVzJGdhbWVfMTRfT2JqVG90YWxTY29yZV9Qb3N0IC8gMTIpKjQpCmBgYAoKYGBge3J9CnBoYXNlXzNfYWxsX291dGNvbWVzJGdhbWVfNF9PYmpUb3RhbFNjb3JlX0ZvbGxvdyA8LSBwaGFzZV8zX2FsbF9vdXRjb21lcyRnZW5lcmFsX2tub3dfN19mb2xsb3cgKyBwaGFzZV8zX2FsbF9vdXRjb21lcyRnZW5lcmFsX2tub3dfOF9mb2xsb3cgKyBwaGFzZV8zXzQkZ2VuZXJhbF9rbm93XzlfZm9sbG93CgoKcGhhc2VfM19hbGxfb3V0Y29tZXMkZ2FtZV80X09ialNjYWxlU2NvcmVfRm9sbG93IDwtICgocGhhc2VfM19hbGxfb3V0Y29tZXMkZ2FtZV80X09ialRvdGFsU2NvcmVfRm9sbG93IC8gMTIpKjQpCmBgYAoKYGBge3J9CnBoYXNlXzNfYWxsX291dGNvbWVzJGdhbWVfMTBfT2JqVG90YWxTY29yZV9Gb2xsb3cgPC0gcGhhc2VfM19hbGxfb3V0Y29tZXMkZ2VuZXJhbF9rbm93XzNfZm9sbG93ICsgcGhhc2VfM19hbGxfb3V0Y29tZXMkZ2VuZXJhbF9rbm93XzRfZm9sbG93ICsgcGhhc2VfM19hbGxfb3V0Y29tZXMkZ2VuZXJhbF9rbm93XzVfZm9sbG93ICsgcGhhc2VfM19hbGxfb3V0Y29tZXMkZ2VuZXJhbF9rbm93XzZfZm9sbG93CgoKcGhhc2VfM19hbGxfb3V0Y29tZXMkZ2FtZV8xMF9PYmpTY2FsZVNjb3JlX0ZvbGxvdyA8LSAoKHBoYXNlXzNfYWxsX291dGNvbWVzJGdhbWVfMTBfT2JqVG90YWxTY29yZV9Gb2xsb3cgLyAxMikqNCkKYGBgCgpgYGB7cn0KcGhhc2VfM19hbGxfb3V0Y29tZXMkZ2FtZV8xNF9PYmpUb3RhbFNjb3JlX0ZvbGxvdyA8LSBwaGFzZV8zX2FsbF9vdXRjb21lcyRnZW5lcmFsX2tub3dfMV9mb2xsb3cgKyBwaGFzZV8zX2FsbF9vdXRjb21lcyRnZW5lcmFsX2tub3dfMl9mb2xsb3cKCgpwaGFzZV8zX2FsbF9vdXRjb21lcyRnYW1lXzE0X09ialNjYWxlU2NvcmVfRm9sbG93IDwtICgocGhhc2VfM19hbGxfb3V0Y29tZXMkZ2FtZV8xNF9PYmpUb3RhbFNjb3JlX0ZvbGxvdyAvIDEyKSo0KQpgYGAKCmBgYHtyfQpsaWJyYXJ5KEhtaXNjKQoKbGFiZWwocGhhc2VfM19hbGxfb3V0Y29tZXMkZ2FtZV80X1NlbGZUb3RhbFNjb3JlX1ByZSkgPC0gIkdhbWUgNCBTZWxmLVJlcG9ydCBLbm93bGVkZ2UgVG90YWwgU2NvcmUgLSBGb2xsb3ctdXAiCgpsYWJlbChwaGFzZV8zX2FsbF9vdXRjb21lcyRnYW1lXzEwX1NlbGZUb3RhbFNjb3JlX1ByZSkgPC0gIkdhbWUgMTAgU2VsZi1SZXBvcnQgS25vd2xlZGdlIFRvdGFsIFNjb3JlIC0gQmFzZWxpbmUiCgpsYWJlbChwaGFzZV8zX2FsbF9vdXRjb21lcyRnYW1lXzE0X1NlbGZUb3RhbFNjb3JlX1ByZSkgPC0gIkdhbWUgMTQgU2VsZi1SZXBvcnQgS25vd2xlZGdlIFRvdGFsIFNjb3JlIC0gQmFzZWxpbmUiCgpsYWJlbChwaGFzZV8zX2FsbF9vdXRjb21lcyRnYW1lXzRfU2VsZlRvdGFsU2NvcmVfUG9zdCkgPC0gIkdhbWUgNCBTZWxmLVJlcG9ydCBLbm93bGVkZ2UgVG90YWwgU2NvcmUgLSBQb3N0IgoKbGFiZWwocGhhc2VfM19hbGxfb3V0Y29tZXMkZ2FtZV8xMF9TZWxmVG90YWxTY29yZV9Qb3N0KSA8LSAiR2FtZSAxMCBTZWxmLVJlcG9ydCBLbm93bGVkZ2UgVG90YWwgU2NvcmUgLSBQb3N0IgoKbGFiZWwocGhhc2VfM19hbGxfb3V0Y29tZXMkZ2FtZV8xNF9TZWxmVG90YWxTY29yZV9Qb3N0KSA8LSAiR2FtZSAxNCBTZWxmLVJlcG9ydCBLbm93bGVkZ2UgVG90YWwgU2NvcmUgLSBQb3N0IgoKbGFiZWwocGhhc2VfM19hbGxfb3V0Y29tZXMkZ2FtZV80X1NlbGZUb3RhbFNjb3JlX0ZvbGxvdykgPC0gIkdhbWUgNCBTZWxmLVJlcG9ydCBLbm93bGVkZ2UgVG90YWwgU2NvcmUtIEZvbGxvdyIKCmxhYmVsKHBoYXNlXzNfYWxsX291dGNvbWVzJGdhbWVfMTBfU2VsZlRvdGFsU2NvcmVfRm9sbG93KSA8LSAiR2FtZSAxMCBTZWxmLVJlcG9ydCBLbm93bGVkZ2UgVG90YWwgU2NvcmUtIEZvbGxvdyIKCmxhYmVsKHBoYXNlXzNfYWxsX291dGNvbWVzJGdhbWVfMTRfU2VsZlRvdGFsU2NvcmVfRm9sbG93KSA8LSAiR2FtZSAxNCBTZWxmLVJlcG9ydCBLbm93bGVkZ2UgVG90YWwgU2NvcmUtIEZvbGxvdyIKCgpsYWJlbChwaGFzZV8zX2FsbF9vdXRjb21lcyRnYW1lXzRfT2JqVG90YWxTY29yZV9QcmUpIDwtICJHYW1lIDQgT2JqZWN0aXZlIEtub3dsZWRnZSBUb3RhbCBTY29yZSAtIEJhc2VsaW5lIgoKbGFiZWwocGhhc2VfM19hbGxfb3V0Y29tZXMkZ2FtZV8xMF9PYmpUb3RhbFNjb3JlX1ByZSkgPC0gIkdhbWUgMTAgT2JqZWN0aXZlIEtub3dsZWRnZSBUb3RhbCBTY29yZSAtIEJhc2VsaW5lIgoKbGFiZWwocGhhc2VfM19hbGxfb3V0Y29tZXMkZ2FtZV8xNF9PYmpUb3RhbFNjb3JlX1ByZSkgPC0gIkdhbWUgMTQgT2JqZWN0aXZlIEtub3dsZWRnZSBUb3RhbCBTY29yZSAtIEJhc2VsaW5lIgoKbGFiZWwocGhhc2VfM19hbGxfb3V0Y29tZXMkZ2FtZV80X09ialRvdGFsU2NvcmVfUG9zdCkgPC0gIkdhbWUgNCBPYmplY3RpdmUgS25vd2xlZGdlIFRvdGFsIFNjb3JlIC0gUG9zdCIKCmxhYmVsKHBoYXNlXzNfYWxsX291dGNvbWVzJGdhbWVfMTBfT2JqVG90YWxTY29yZV9Qb3N0KSA8LSAiR2FtZSAxMCBPYmplY3RpdmUgS25vd2xlZGdlIFRvdGFsIFNjb3JlIC0gUG9zdCIKCmxhYmVsKHBoYXNlXzNfYWxsX291dGNvbWVzJGdhbWVfMTRfT2JqVG90YWxTY29yZV9Qb3N0KSA8LSAiR2FtZSAxNCBPYmplY3RpdmUgS25vd2xlZGdlIFRvdGFsIFNjb3JlIC0gUG9zdCIKCmxhYmVsKHBoYXNlXzNfYWxsX291dGNvbWVzJGdhbWVfNF9PYmpUb3RhbFNjb3JlX0ZvbGxvdykgPC0gIkdhbWUgNCBPYmplY3RpdmUgS25vd2xlZGdlIFRvdGFsIFNjb3JlLSBGb2xsb3ciCgpsYWJlbChwaGFzZV8zX2FsbF9vdXRjb21lcyRnYW1lXzEwX09ialRvdGFsU2NvcmVfRm9sbG93KSA8LSAiR2FtZSAxMCBPYmplY3RpdmUgS25vd2xlZGdlIFRvdGFsIFNjb3JlLSBGb2xsb3ciCgpsYWJlbChwaGFzZV8zX2FsbF9vdXRjb21lcyRnYW1lXzE0X09ialRvdGFsU2NvcmVfRm9sbG93KSA8LSAiR2FtZSAxNCBPYmplY3RpdmUgS25vd2xlZGdlIFRvdGFsIFNjb3JlLSBGb2xsb3ciCgpgYGAKCmBgYHtyfQpwaGFzZV8zX2FsbF9vdXRjb21lcyRTZWxmS25vd19PdmVyYWxsU2NvcmVfcHJlIDwtICgocGhhc2VfM19hbGxfb3V0Y29tZXMkZ2FtZV80X1NlbGZTY2FsZVNjb3JlX1ByZSArIHBoYXNlXzNfYWxsX291dGNvbWVzJGdhbWVfMTBfU2VsZlNjYWxlU2NvcmVfUHJlICsgcGhhc2VfM180JGdhbWVfMTRfU2VsZlNjYWxlU2NvcmVfUHJlKSAvIDMpCmBgYAoKYGBge3J9CnBoYXNlXzNfYWxsX291dGNvbWVzJE9ial9PdmVyYWxsU2NvcmVfcHJlIDwtICgocGhhc2VfM19hbGxfb3V0Y29tZXMkZ2FtZV80X09ialNjYWxlU2NvcmVfUHJlICsgcGhhc2VfM19hbGxfb3V0Y29tZXMkZ2FtZV8xMF9PYmpTY2FsZVNjb3JlX1ByZSArIHBoYXNlXzNfYWxsX291dGNvbWVzJGdhbWVfMTRfT2JqU2NhbGVTY29yZV9QcmUpKQpgYGAKCmBgYHtyfQpkZXNjcmliZShwaGFzZV8zX2FsbF9vdXRjb21lcyRPYmpfT3ZlcmFsbFNjb3JlX3ByZSkKYGBgCgpgYGB7cn0KbGFiZWwocGhhc2VfM19hbGxfb3V0Y29tZXMkU2VsZktub3dfT3ZlcmFsbFNjb3JlX3ByZSkgPC0gIlNlbGYtUmVwb3J0ZWQgS25vd2xlZGdlIE92ZXJhbGwgU2NvcmUgLSBCYXNlbGluZSIKYGBgCgpgYGB7cn0KbGFiZWwocGhhc2VfM19hbGxfb3V0Y29tZXMkT2JqX092ZXJhbGxTY29yZV9wcmUpIDwtICJPYmplY3RpdmUgS25vd2xlZGdlIE92ZXJhbGwgU2NvcmUgLSBCYXNlbGluZSIKYGBgCgpgYGB7cn0KcGhhc2VfM19hbGxfb3V0Y29tZXMkU2VsZktub3dfT3ZlcmFsbFNjb3JlX3Bvc3QgPC0gKChwaGFzZV8zX2FsbF9vdXRjb21lcyRnYW1lXzRfU2VsZlNjYWxlU2NvcmVfUG9zdCArIHBoYXNlXzNfYWxsX291dGNvbWVzJGdhbWVfMTBfU2VsZlNjYWxlU2NvcmVfUG9zdCArIHBoYXNlXzNfYWxsX291dGNvbWVzJGdhbWVfMTRfU2VsZlNjYWxlU2NvcmVfUG9zdCkgLyAzKQpgYGAKCmBgYHtyfQpwaGFzZV8zX2FsbF9vdXRjb21lcyRPYmpfT3ZlcmFsbFNjb3JlX3Bvc3QgPC0gKChwaGFzZV8zX2FsbF9vdXRjb21lcyRnYW1lXzRfT2JqU2NhbGVTY29yZV9Qb3N0ICsgcGhhc2VfM19hbGxfb3V0Y29tZXMkZ2FtZV8xMF9PYmpTY2FsZVNjb3JlX1Bvc3QgKyBwaGFzZV8zX2FsbF9vdXRjb21lcyRnYW1lXzE0X09ialNjYWxlU2NvcmVfUG9zdCkpCmBgYAoKYGBge3J9CmxhYmVsKHBoYXNlXzNfYWxsX291dGNvbWVzJFNlbGZLbm93X092ZXJhbGxTY29yZV9wb3N0KSA8LSAiU2VsZi1SZXBvcnRlZCBLbm93bGVkZ2UgT3ZlcmFsbCBTY29yZSAtIFBvc3QiCmBgYAoKYGBge3J9CmxhYmVsKHBoYXNlXzNfYWxsX291dGNvbWVzJE9ial9PdmVyYWxsU2NvcmVfcG9zdCkgPC0gIk9iamVjdGl2ZSBLbm93bGVkZ2UgT3ZlcmFsbCBTY29yZSAtIFBvc3QiCmBgYAoKYGBge3J9CnBoYXNlXzNfYWxsX291dGNvbWVzJFNlbGZLbm93X092ZXJhbGxTY29yZV9mb2xsb3cgPC0gKHBoYXNlXzNfYWxsX291dGNvbWVzJGdhbWVfNF9TZWxmU2NhbGVTY29yZV9Gb2xsb3cgKyBwaGFzZV8zX2FsbF9vdXRjb21lcyRnYW1lXzEwX1NlbGZTY2FsZVNjb3JlX0ZvbGxvdyArIHBoYXNlXzNfYWxsX291dGNvbWVzJGdhbWVfMTRfU2VsZlNjYWxlU2NvcmVfRm9sbG93KSAvIDMKYGBgCgpgYGB7cn0KcGhhc2VfM19hbGxfb3V0Y29tZXMkT2JqX092ZXJhbGxTY29yZV9mb2xsb3cgPC0gKChwaGFzZV8zX2FsbF9vdXRjb21lcyRnYW1lXzRfT2JqU2NhbGVTY29yZV9Gb2xsb3cgKyBwaGFzZV8zX2FsbF9vdXRjb21lcyRnYW1lXzEwX09ialNjYWxlU2NvcmVfRm9sbG93ICsgcGhhc2VfM19hbGxfb3V0Y29tZXMkZ2FtZV8xNF9PYmpTY2FsZVNjb3JlX0ZvbGxvdykpCmBgYAoKYGBge3J9CmxhYmVsKHBoYXNlXzNfYWxsX291dGNvbWVzJFNlbGZLbm93X092ZXJhbGxTY29yZV9mb2xsb3cpIDwtICJTZWxmLVJlcG9ydGVkIEtub3dsZWRnZSBPdmVyYWxsIFNjb3JlIC0gRm9sbG93IgpgYGAKCmBgYHtyfQpsYWJlbChwaGFzZV8zX2FsbF9vdXRjb21lcyRPYmpfT3ZlcmFsbFNjb3JlX2ZvbGxvdykgPC0gIk9iamVjdGl2ZSBLbm93bGVkZ2UgT3ZlcmFsbCBTY29yZSAtIEZvbGxvdyIKYGBgCgpgYGB7cn0KcGhhc2VfM19hbGxfb3V0Y29tZXMgPC0gcGhhc2VfM19hbGxfb3V0Y29tZXMgJT4lIHNlbGVjdCgtJ19tZXJnZScpCmBgYAoKYGBge3J9CnBoYXNlXzNfYWxsX291dGNvbWVzJFNlbGZLbm93X092ZXJhbGxTY29yZV9mb2xsb3cgPC0gKHBoYXNlXzNfYWxsX291dGNvbWVzJGdhbWVfNF9TZWxmU2NhbGVTY29yZV9Gb2xsb3cgKyBwaGFzZV8zX2FsbF9vdXRjb21lcyRnYW1lXzEwX1NlbGZTY2FsZVNjb3JlX0ZvbGxvdyArIHBoYXNlXzNfYWxsX291dGNvbWVzJGdhbWVfMTRfU2VsZlNjYWxlU2NvcmVfRm9sbG93KSAvIDMKYGBgCgpgYGB7cn0KcGhhc2VfM19hbGxfb3V0Y29tZXMkT2JqX092ZXJhbGxTY29yZV9mb2xsb3cgPC0gKChwaGFzZV8zX2FsbF9vdXRjb21lcyRnYW1lXzRfT2JqU2NhbGVTY29yZV9Gb2xsb3cgKyBwaGFzZV8zX2FsbF9vdXRjb21lcyRnYW1lXzEwX09ialNjYWxlU2NvcmVfRm9sbG93ICsgcGhhc2VfM19hbGxfb3V0Y29tZXMkZ2FtZV8xNF9PYmpTY2FsZVNjb3JlX0ZvbGxvdykpCmBgYAoKYGBge3J9CmxhYmVsKHBoYXNlXzNfYWxsX291dGNvbWVzJFNlbGZLbm93X092ZXJhbGxTY29yZV9mb2xsb3cpIDwtICJTZWxmLVJlcG9ydGVkIEtub3dsZWRnZSBPdmVyYWxsIFNjb3JlIC0gRm9sbG93IgpgYGAKCmBgYHtyfQpsYWJlbChwaGFzZV8zX2FsbF9vdXRjb21lcyRPYmpfT3ZlcmFsbFNjb3JlX2ZvbGxvdykgPC0gIk9iamVjdGl2ZSBLbm93bGVkZ2UgT3ZlcmFsbCBTY29yZSAtIEZvbGxvdyIKYGBgCiMjIHNhdmUgYXMgU1BTUyBmaWxlIGFuZCBtZXJnZSBpbiBTVEFUQSBvdXRjb21lcwoKYGBge3J9CndyaXRlX3NhdihwaGFzZV8zX2FsbF9vdXRjb21lcywgInBoYXNlXzNfa25vd2xlZGdlX291dGNvbWUuc2F2IikKYGBgCgpgYGB7cn0KbGlicmFyeShoYXZlbikKcGhhc2VfM19hbGxfb3V0Y29tZXMgPC0gcmVhZF9kdGEoInBoYXNlXzNfYWxsX291dGNvbWVzLmR0YSIpCnByaW50KHBoYXNlXzNfYWxsX291dGNvbWVzKQpgYGAKCiMjIENsZWFuIHZhcmlhYmxlcwoKYGBge3J9CnBoYXNlXzNfYWxsX291dGNvbWVzJG9yZ2FuaXphdGlvbmFsX2FmZmlsaWF0aW9uLmZhYyA8LSBmYWN0b3IocGhhc2VfM180JE9yZ2FuaXphdGlvbl9BZmZpbGlhdGlvbikKYGBgCgoKIyMjIE1ha2UgZ3JvdXBpbmcgdmFyaWFibGUgZGljaG90b21vdXMKCmBgYHtyfQpwaGFzZV8zX2FsbF9vdXRjb21lcyRwYXJ0aWNpcGFudF90eXBlLmZhYyA8LSBmYWN0b3IocGhhc2VfM180JHBhcnRpY2lwYW50X3R5cGUpCmBgYAoKCmBgYHtyfQpwaGFzZV8zX2FsbF9vdXRjb21lcyA8LSBwaGFzZV8zX2FsbF9vdXRjb21lcyAlPiUKICBtdXRhdGUocGFydGljaXBhbnRfdHlwZV8yID0gY2FzZV93aGVuKAogICAgcGFydGljaXBhbnRfdHlwZS5mYWMgPT0gIjMiIH4gIjIiLAogICAgVFJVRSB+IHBhcnRpY2lwYW50X3R5cGUuZmFjCiAgKSkKCmBgYAoKYGBge3J9CmxhYmVsKHBoYXNlXzNfYWxsX291dGNvbWVzJHBhcnRpY2lwYW50X3R5cGVfMikgPC0gIkNvbWJpbmVkIENvbXBhcmlzb24gR3JvdXBzIgpsZXZlbHMocGhhc2VfM19hbGxfb3V0Y29tZXMkcGFydGljaXBhbnRfdHlwZS5mYWMpIDwtIGMoIlRyZWF0bWVudCIsICJOb24tQ29tcGxldGVyIENvbXBhcmlzb24gR3JvdXAiLCAiV2luQ28gQ29tcGFyaXNvbiBHcm91cCIpCnBoYXNlXzNfYWxsX291dGNvbWVzJHBhcnRpY2lwYW50X3R5cGVfMiA8LSBmYWN0b3IocGhhc2VfM19hbGxfb3V0Y29tZXMkcGFydGljaXBhbnRfdHlwZV8yLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWxzID0gYygiMSIsICIyIiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGMoIlRyZWF0bWVudCIsICJDb250cm9sIikpCgpgYGAKCiMjIyBhZ2UgdmFyaWFibGUKYGBge3J9CnBoYXNlXzNfYWxsX291dGNvbWVzJGFnZSA8LSBjdXQocGhhc2VfM19hbGxfb3V0Y29tZXMkZGVtb2dyYXBoaWNzXzEsCiAgICAgICAgICAgICAgICAgICAgYnJlYWtzID0gYygwLCAyNCwgMzQsIDQ0LCA2NCwgMTAwMCksICAjIERlZmluZSB0aGUgYnJlYWtzCiAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYygiMjQgYW5kIHlvdW5nZXIiLCAiMjUtMzQiLCAiMzUtNDQiLCAiNDUtNjQiLCAiNjUrIiksICAjIERlZmluZSB0aGUgbGFiZWxzCiAgICAgICAgICAgICAgICAgICAgcmlnaHQgPSBUUlVFKSAgIyBJZiBUUlVFLCB0aGUgcmlnaHQgZW5kcG9pbnQgaXMgaW5jbHVkZWQKYGBgCgojIyMgb3JnYW5pemF0aW9uIHZhcmlhYmxlCgpgYGB7cn0KcGhhc2VfM19hbGxfb3V0Y29tZXMkb3JnYW5pemF0aW9uIDwtIGlmZWxzZShwaGFzZV8zX2FsbF9vdXRjb21lcyRvcmdhbml6YXRpb25hbF9hZmZpbGlhdGlvbi5mYWMgIT0gIk5vbmUiLCAiWWVzIiwgIk5vIikKYGBgCgojIyBvdXRjb21lIDM6IGF0dGl0dWRlcyB0b3dhcmQgYmFua3MKYGBge3J9CnBoYXNlXzNfYWxsX291dGNvbWVzJGF0dF90b3dhcmRfYmFua3NfcHJlIDwtIChwaGFzZV8zX2FsbF9vdXRjb21lcyRmaW5hbmNpYWxfYXR0XzFfMSArIHBoYXNlXzNfYWxsX291dGNvbWVzJGZpbmFuY2lhbF9hdHRfMV8yICsgcGhhc2VfM19hbGxfb3V0Y29tZXMkZmluYW5jaWFsX2F0dF8xXzMgKyBwaGFzZV8zX2FsbF9vdXRjb21lcyRmaW5hbmNpYWxfYXR0XzFfNCArIHBoYXNlXzNfYWxsX291dGNvbWVzJGZpbmFuY2lhbF9hdHRfMV81KSAvIDUKYGBgCgoKYGBge3J9CmxhYmVsKHBoYXNlXzNfYWxsX291dGNvbWVzJGF0dF90b3dhcmRfYmFua3NfcHJlKSA8LSAiQXR0aXR1ZGVzIHRvd2FyZCBCYW5rcy0gQmFzZWxpbmUiCmBgYAoKYGBge3J9CnBoYXNlXzNfYWxsX291dGNvbWVzJGF0dF90b3dhcmRfYmFua3NfcG9zdCA8LSAocGhhc2VfM19hbGxfb3V0Y29tZXMkZmluYW5jaWFsX2F0dF8xXzFfcG9zdCArIHBoYXNlXzNfYWxsX291dGNvbWVzJGZpbmFuY2lhbF9hdHRfMV8yX3Bvc3QgKyBwaGFzZV8zX2FsbF9vdXRjb21lcyRmaW5hbmNpYWxfYXR0XzFfM19wb3N0ICsgcGhhc2VfM19hbGxfb3V0Y29tZXMkZmluYW5jaWFsX2F0dF8xXzRfcG9zdCArIHBoYXNlXzNfYWxsX291dGNvbWVzJGZpbmFuY2lhbF9hdHRfMV81X3Bvc3QpIC8gNQpgYGAKCgpgYGB7cn0KbGFiZWwocGhhc2VfM19hbGxfb3V0Y29tZXMkYXR0X3Rvd2FyZF9iYW5rc19wb3N0KSA8LSAiQXR0aXR1ZGVzIHRvd2FyZCBCYW5rcy0gUG9zdCIKYGBgCgpgYGB7cn0KcGhhc2VfM19hbGxfb3V0Y29tZXMkYXR0X3Rvd2FyZF9iYW5rc19mb2xsb3cgPC0gKHBoYXNlXzNfYWxsX291dGNvbWVzJGZpbmFuY2lhbF9hdHRfMV8xX2ZvbGxvdyArIHBoYXNlXzNfYWxsX291dGNvbWVzJGZpbmFuY2lhbF9hdHRfMV8yX2ZvbGxvdyArIHBoYXNlXzNfYWxsX291dGNvbWVzJGZpbmFuY2lhbF9hdHRfMV8zX2ZvbGxvdyArIHBoYXNlXzNfYWxsX291dGNvbWVzJGZpbmFuY2lhbF9hdHRfMV80X2ZvbGxvdyArIHBoYXNlXzNfYWxsX291dGNvbWVzJGZpbmFuY2lhbF9hdHRfMV81X2ZvbGxvdykgLyA1CmBgYAoKYGBge3J9CmxhYmVsKHBoYXNlXzNfYWxsX291dGNvbWVzJGZpbmFuY2lhbF9hdHRfMV8xKSA8LSAiSSBmaW5kIGRlYWxpbmcgd2l0aCBiYW5rcyB0byBiZSBzdHJlc3NmdWw6IFByZSIKbGFiZWwocGhhc2VfM19hbGxfb3V0Y29tZXMkZmluYW5jaWFsX2F0dF8xXzFfcG9zdCkgPC0gIkkgZmluZCBkZWFsaW5nIHdpdGggYmFua3MgdG8gYmUgc3RyZXNzZnVsOiBQb3N0IgpsYWJlbChwaGFzZV8zX2FsbF9vdXRjb21lcyRmaW5hbmNpYWxfYXR0XzFfMV9mb2xsb3cpIDwtICJJIGZpbmQgZGVhbGluZyB3aXRoIGJhbmtzIHRvIGJlIHN0cmVzc2Z1bDogRm9sbG93IgpsYWJlbChwaGFzZV8zX2FsbF9vdXRjb21lcyRmaW5hbmNpYWxfYXR0XzFfMikgPC0gIkJhbmtzIG1ha2UgaXQgZWFzeSBmb3IgdGhlaXIgY3VzdG9tZXJzIHRvIGxlYXJuIGFib3V0IHRoZSBmaW5hbmNpYWwgc2VydmljZXMgdGhleSBwcm92aWRlOiBQcmUiCmxhYmVsKHBoYXNlXzNfYWxsX291dGNvbWVzJGZpbmFuY2lhbF9hdHRfMV8yX3Bvc3QpIDwtICJCYW5rcyBtYWtlIGl0IGVhc3kgZm9yIHRoZWlyIGN1c3RvbWVycyB0byBsZWFybiBhYm91dCB0aGUgZmluYW5jaWFsIHNlcnZpY2VzIHRoZXkgcHJvdmlkZTogUG9zdCIKbGFiZWwocGhhc2VfM19hbGxfb3V0Y29tZXMkZmluYW5jaWFsX2F0dF8xXzJfZm9sbG93KSA8LSAiQmFua3MgbWFrZSBpdCBlYXN5IGZvciB0aGVpciBjdXN0b21lcnMgdG8gbGVhcm4gYWJvdXQgdGhlIGZpbmFuY2lhbCBzZXJ2aWNlcyB0aGV5IHByb3ZpZGU6IEZvbGxvdy11cCIKbGFiZWwocGhhc2VfM19hbGxfb3V0Y29tZXMkZmluYW5jaWFsX2F0dF8xXzMpIDwtICJCYW5rcyBwcm90ZWN0IHRoZSBwcml2YWN5IGFuZCBwZXJzb25hbCBpbmZvcm1hdGlvbiBvZiB0aGVpciBjdXN0b21lcnM6IFByZSIKbGFiZWwocGhhc2VfM19hbGxfb3V0Y29tZXMkZmluYW5jaWFsX2F0dF8xXzNfcG9zdCkgPC0gIkJhbmtzIHByb3RlY3QgdGhlIHByaXZhY3kgYW5kIHBlcnNvbmFsIGluZm9ybWF0aW9uIG9mIHRoZWlyIGN1c3RvbWVyczogUG9zdCIKbGFiZWwocGhhc2VfM19hbGxfb3V0Y29tZXMkZmluYW5jaWFsX2F0dF8xXzNfZm9sbG93KSA8LSAiQmFua3MgcHJvdGVjdCB0aGUgcHJpdmFjeSBhbmQgcGVyc29uYWwgaW5mb3JtYXRpb24gb2YgdGhlaXIgY3VzdG9tZXJzOiBGb2xsb3ctdXAiCmxhYmVsKHBoYXNlXzNfYWxsX291dGNvbWVzJGZpbmFuY2lhbF9hdHRfMV80KSA8LSAiQmFua3MgZ2VuZXJhbGx5IGhhdmUgdGhlaXIgY3VzdG9tZXJz4oCZIGJlc3QgaW50ZXJlc3RzIGluIG1pbmQ6IFByZSIKbGFiZWwocGhhc2VfM19hbGxfb3V0Y29tZXMkZmluYW5jaWFsX2F0dF8xXzRfcG9zdCkgPC0gIkJhbmtzIGdlbmVyYWxseSBoYXZlIHRoZWlyIGN1c3RvbWVyc+KAmSBiZXN0IGludGVyZXN0cyBpbiBtaW5kOiBQb3N0IgpsYWJlbChwaGFzZV8zX2FsbF9vdXRjb21lcyRmaW5hbmNpYWxfYXR0XzFfNF9mb2xsb3cpIDwtICJCYW5rcyBnZW5lcmFsbHkgaGF2ZSB0aGVpciBjdXN0b21lcnPigJkgYmVzdCBpbnRlcmVzdHMgaW4gbWluZDogRm9sb3ctdXAiCmxhYmVsKHBoYXNlXzNfYWxsX291dGNvbWVzJGZpbmFuY2lhbF9hdHRfMV81KSA8LSAiQmFua3Mgb2ZmZXIgYWNjb3VudHMgYW5kIG90aGVyIHByb2R1Y3RzIHRoYXQgZml0IG15IG5lZWRzIHdlbGw6IFByZSIKbGFiZWwocGhhc2VfM19hbGxfb3V0Y29tZXMkZmluYW5jaWFsX2F0dF8xXzVfcG9zdCkgPC0gIkJhbmtzIG9mZmVyIGFjY291bnRzIGFuZCBvdGhlciBwcm9kdWN0cyB0aGF0IGZpdCBteSBuZWVkcyB3ZWxsOiBQb3N0IgpsYWJlbChwaGFzZV8zX2FsbF9vdXRjb21lcyRmaW5hbmNpYWxfYXR0XzFfNV9mb2xsb3cpIDwtICJCYW5rcyBvZmZlciBhY2NvdW50cyBhbmQgb3RoZXIgcHJvZHVjdHMgdGhhdCBmaXQgbXkgbmVlZHMgd2VsbDogRm9sbG93LXVwIgpgYGAKCgoKYGBge3J9CmxhYmVsKHBoYXNlXzNfYWxsX291dGNvbWVzJGF0dF90b3dhcmRfYmFua3NfZm9sbG93KSA8LSAiQXR0aXR1ZGVzIHRvd2FyZCBCYW5rcy0gRm9sbG93IgpgYGAKCiMgZXhwbG9yZSB0aGUgZGF0YQoKYGBge3J9Cmluc3RhbGwucGFja2FnZXMoInN1bW1hcnl0b29scyIpCmxpYnJhcnkoc3VtbWFyeXRvb2xzKQoKIyBDcmVhdGUgYSBkZXRhaWxlZCBkZXNjcmlwdGl2ZSB0YWJsZSBmb3IgdGhlIGZhY3RvciB2YXJpYWJsZQpmcmVxKHBoYXNlXzNfYWxsX291dGNvbWVzJHJhY2UpCmBgYAoKYGBge3J9CmNsYXNzKHBoYXNlXzNfYWxsX291dGNvbWVzJHJhY2UpCmxpYnJhcnkoaGF2ZW4pCgpwaGFzZV8zX2FsbF9vdXRjb21lcyRyYWNlIDwtIGFzX2ZhY3RvcihwaGFzZV8zX2FsbF9vdXRjb21lcyRyYWNlKQpgYGAKCmBgYHtyfQpjbGFzcyhwaGFzZV8zX2FsbF9vdXRjb21lcyRkZW1vZ3JhcGhpY3NfNCkKCnBoYXNlXzNfYWxsX291dGNvbWVzJGRlbW9ncmFwaGljc180IDwtIGFzX2ZhY3RvcihwaGFzZV8zX2FsbF9vdXRjb21lcyRkZW1vZ3JhcGhpY3NfNCkKYGBgCgoKYGBge3J9CmNsYXNzKHBoYXNlXzNfYWxsX291dGNvbWVzJGRlbW9ncmFwaGljc181KQoKcGhhc2VfM19hbGxfb3V0Y29tZXMkZGVtb2dyYXBoaWNzXzUgPC0gYXNfZmFjdG9yKHBoYXNlXzNfYWxsX291dGNvbWVzJGRlbW9ncmFwaGljc181KQpgYGAKIyMjIDMgR3JvdXBzIERlbW9ncmFwaGljcwoKYGBge3J9CmxpYnJhcnkodGFibGUxKQp0YWJsZTEofiBvcmdhbml6YXRpb24gKyByYWNlICsgYWdlICsgZGVtb2dyYXBoaWNzXzQgKyBkZW1vZ3JhcGhpY3NfNXxwYXJ0aWNpcGFudF90eXBlLmZhYywgZGF0YT1waGFzZV8zX2FsbF9vdXRjb21lcykKYGBgCgojIyMgMiBHcm91cHMgRGVtb2dyYXBoaWNzCgpgYGB7cn0KdGFibGUxKH4gb3JnYW5pemF0aW9uICsgcmFjZSArIGFnZSArIGRlbW9ncmFwaGljc180ICsgZGVtb2dyYXBoaWNzXzV8cGFydGljaXBhbnRfdHlwZV8yLCBkYXRhPXBoYXNlXzNfYWxsX291dGNvbWVzKQoKYGBgCgoKIyMgT3V0Y29tZSAxOiBTdWJqZWN0IEZpbmFuY2lhbCBLbm93bGVkZ2UKCiMjIyBNeSB1bmRlcnN0YW5kaW5nIGlzIHRoYXQgdGhpcyBjYXB0dXJlcyAiRG9lcyB1c2luZyBITVNSVSBoYXZlIGFueSBpbXBhY3Qgb24gcGFydGljaXBhbnRz4oCZIGZpbmFuY2lhbCBrbm93bGVkZ2U/IgoKIyMjIFRoaXMgY292ZXJzIEdhbWUgNCAoQ3JlZGl0IFJlcG9ydHMgYW5kIFNjb3Jlcyk6IFEyNywgMjgsIDI5LCBHYW1lIDEwIChZb3UgQ2FuIEJhbmsgT24gSXQpOiBRMjQsIDI1LCAyNiwgYW5kIEdhbWUgMTQgKFlvdXIgU3BlbmRpbmcgYW5kIFNhdmluZyBQbGFuKTogUTIxLCAyMiwgMjMgCgoKCiMjIEJhc2VsaW5lIEVxdWl2YWxlbmNlCgojIyMgVGhlIFdXQyBjYWxjdWxhdGVzIGVmZmVjdCBzaXplcyB3aXRoIEhlZGdlJ3MgRyBmb3IgY29udGludW91cyB2YXJpYWJsZXMKCmBgYHtyfQppbnN0YWxsLnBhY2thZ2VzKCJlZmZzaXplIikKCmxpYnJhcnkoZWZmc2l6ZSkKCmxpYnJhcnkoYm9vdCkgCgpsaWJyYXJ5KHRhYmxlMSkKCmxpYnJhcnkoTWF0Y2hJdCkKYGBgCgpgYGB7cn0KIyBDYWxjdWxhdGUgbWVhbnMgYW5kIHN0YW5kYXJkIGRldmlhdGlvbnMgZm9yIGVhY2ggZ3JvdXAKc3VtbWFyeV9zdGF0c19zZWxmX2tub3dfb3ZlcmFsbF9wcmUgPC0gcGhhc2VfM19hbGxfb3V0Y29tZXMgJT4lCiAgZ3JvdXBfYnkocGFydGljaXBhbnRfdHlwZV8yKSAlPiUKICBzdW1tYXJpc2UoCiAgICBtZWFuID0gbWVhbihTZWxmS25vd19PdmVyYWxsU2NvcmVfcHJlLCBuYS5ybSA9IFRSVUUpLAogICAgc2QgPSBzZChTZWxmS25vd19PdmVyYWxsU2NvcmVfcHJlLCBuYS5ybSA9IFRSVUUpLAogICAgbiA9IG4oKQogICkKCiMgVmlldyB0aGUgc3VtbWFyeSBzdGF0aXN0aWNzCnByaW50KHN1bW1hcnlfc3RhdHNfc2VsZl9rbm93X292ZXJhbGxfcHJlKQoKYGBgCgoKYGBge3J9CmxpYnJhcnkoZWZmZWN0c2l6ZSkKbGlicmFyeShlc3ZpcykKbGlicmFyeShsc3IpCmhlZGdfZyhwaGFzZV8zX2FsbF9vdXRjb21lcywgU2VsZktub3dfT3ZlcmFsbFNjb3JlX3ByZSB+IHBhcnRpY2lwYW50X3R5cGVfMikgCmBgYAoKYGBge3J9CmNvaGVuc0QoU2VsZktub3dfT3ZlcmFsbFNjb3JlX3ByZSB+IHBhcnRpY2lwYW50X3R5cGVfMiwgZGF0YSA9IHBoYXNlXzNfYWxsX291dGNvbWVzKQpgYGAKCmBgYHtyfQojIENhbGN1bGF0ZSBtZWFucyBhbmQgc3RhbmRhcmQgZGV2aWF0aW9ucyBmb3IgZWFjaCBncm91cApzdW1tYXJ5X3N0YXRzX3NlbGZfa25vd19vdmVyYWxsX3ByZV9vcmcgPC0gcGhhc2VfM19hbGxfb3V0Y29tZXMgJT4lCiAgZ3JvdXBfYnkob3JnYW5pemF0aW9uKSAlPiUKICBzdW1tYXJpc2UoCiAgICBtZWFuID0gbWVhbihTZWxmS25vd19PdmVyYWxsU2NvcmVfcHJlLCBuYS5ybSA9IFRSVUUpLAogICAgc2QgPSBzZChTZWxmS25vd19PdmVyYWxsU2NvcmVfcHJlLCBuYS5ybSA9IFRSVUUpLAogICAgbiA9IG4oKQogICkKCiMgVmlldyB0aGUgc3VtbWFyeSBzdGF0aXN0aWNzCnByaW50KHN1bW1hcnlfc3RhdHNfc2VsZl9rbm93X292ZXJhbGxfcHJlX29yZykKCmBgYAoKYGBge3J9CmxpYnJhcnkobHNyKQoKY29oZW5zRChTZWxmS25vd19PdmVyYWxsU2NvcmVfcHJlIH4gb3JnYW5pemF0aW9uLCBkYXRhID0gcGhhc2VfM19hbGxfb3V0Y29tZXMpCmBgYAoKYGBge3J9CmhlZGdfZyhwaGFzZV8zX2FsbF9vdXRjb21lcywgU2VsZktub3dfT3ZlcmFsbFNjb3JlX3ByZSB+IG9yZ2FuaXphdGlvbikgCmBgYAoKCmBgYHtyfQojIENhbGN1bGF0ZSBtZWFucyBhbmQgc3RhbmRhcmQgZGV2aWF0aW9ucyBmb3IgZWFjaCBncm91cApzdW1tYXJ5X3N0YXRzX3NlbGZfa25vd19vdmVyYWxsX3ByZV9yYWNlIDwtIHBoYXNlXzNfYWxsX291dGNvbWVzICU+JQogIGdyb3VwX2J5KHJhY2UpICU+JQogIHN1bW1hcmlzZSgKICAgIG1lYW4gPSBtZWFuKFNlbGZLbm93X092ZXJhbGxTY29yZV9wcmUsIG5hLnJtID0gVFJVRSksCiAgICBzZCA9IHNkKFNlbGZLbm93X092ZXJhbGxTY29yZV9wcmUsIG5hLnJtID0gVFJVRSksCiAgICBuID0gbigpCiAgKQoKIyBWaWV3IHRoZSBzdW1tYXJ5IHN0YXRpc3RpY3MKcHJpbnQoc3VtbWFyeV9zdGF0c19zZWxmX2tub3dfb3ZlcmFsbF9wcmVfcmFjZSkKCmBgYAoKCmBgYHtyfQojIENhbGN1bGF0ZSBtZWFucyBhbmQgc3RhbmRhcmQgZGV2aWF0aW9ucyBmb3IgZWFjaCBncm91cApzdW1tYXJ5X3N0YXRzX29ial9rbm93X292ZXJhbGwgPC0gcGhhc2VfM19hbGxfb3V0Y29tZXMgJT4lCiAgZ3JvdXBfYnkocGFydGljaXBhbnRfdHlwZV8yKSAlPiUKICBzdW1tYXJpc2UoCiAgICBtZWFuID0gbWVhbihPYmpfT3ZlcmFsbFNjb3JlX3ByZSwgbmEucm0gPSBUUlVFKSwKICAgIHNkID0gc2QoT2JqX092ZXJhbGxTY29yZV9wcmUsIG5hLnJtID0gVFJVRSksCiAgICBuID0gbigpCiAgKQoKIyBWaWV3IHRoZSBzdW1tYXJ5IHN0YXRpc3RpY3MKcHJpbnQoc3VtbWFyeV9zdGF0c19vYmpfa25vd19vdmVyYWxsKQoKYGBgCgoKYGBge3J9CmxpYnJhcnkobHNyKQoKY29oZW5zRChPYmpfT3ZlcmFsbFNjb3JlX3ByZSB+IHBhcnRpY2lwYW50X3R5cGVfMiwgZGF0YSA9IHBoYXNlXzNfYWxsX291dGNvbWVzKQpgYGAKCmBgYHtyfQpoZWRnX2cocGhhc2VfM19hbGxfb3V0Y29tZXMsIE9ial9PdmVyYWxsU2NvcmVfcHJlIH4gcGFydGljaXBhbnRfdHlwZV8yKSAKYGBgCgoKYGBge3J9CmhlZGdfZyhwaGFzZV8zX2FsbF9vdXRjb21lcywgU2VsZktub3dfT3ZlcmFsbFNjb3JlX3ByZSB+IG9yZ2FuaXphdGlvbikgCmBgYAoKCmBgYHtyfQojIENhbGN1bGF0ZSBtZWFucyBhbmQgc3RhbmRhcmQgZGV2aWF0aW9ucyBmb3IgZWFjaCBncm91cApzdW1tYXJ5X3N0YXRzX2F0dF9vdmVyYWxsIDwtIHBoYXNlXzNfYWxsX291dGNvbWVzICU+JQogIGdyb3VwX2J5KHBhcnRpY2lwYW50X3R5cGVfMikgJT4lCiAgc3VtbWFyaXNlKAogICAgbWVhbiA9IG1lYW4oYXR0X3Rvd2FyZF9iYW5rc19wcmUsIG5hLnJtID0gVFJVRSksCiAgICBzZCA9IHNkKGF0dF90b3dhcmRfYmFua3NfcHJlLCBuYS5ybSA9IFRSVUUpLAogICAgbiA9IG4oKQogICkKCiMgVmlldyB0aGUgc3VtbWFyeSBzdGF0aXN0aWNzCnByaW50KHN1bW1hcnlfc3RhdHNfYXR0X292ZXJhbGwpCgpgYGAKCmBgYHtyfQpsaWJyYXJ5KGxzcikKCmNvaGVuc0QoYXR0X3Rvd2FyZF9iYW5rc19wcmUgfiBwYXJ0aWNpcGFudF90eXBlXzIsIGRhdGEgPSBwaGFzZV8zX2FsbF9vdXRjb21lcykKYGBgCgpgYGB7cn0KaGVkZ19nKHBoYXNlXzNfYWxsX291dGNvbWVzLCBhdHRfdG93YXJkX2JhbmtzX3ByZSB+IHBhcnRpY2lwYW50X3R5cGVfMikgCmBgYAoKCgpgYGB7cn0KIyBDYWxjdWxhdGUgbWVhbnMgYW5kIHN0YW5kYXJkIGRldmlhdGlvbnMgZm9yIGVhY2ggZ3JvdXAKc3VtbWFyeV9zdGF0c19mc19vdmVyYWxsIDwtIHBoYXNlXzNfYWxsX291dGNvbWVzICU+JQogIGdyb3VwX2J5KHBhcnRpY2lwYW50X3R5cGVfMikgJT4lCiAgc3VtbWFyaXNlKAogICAgbWVhbiA9IG1lYW4oZnNfcHJlLCBuYS5ybSA9IFRSVUUpLAogICAgc2QgPSBzZChmc19wcmUsIG5hLnJtID0gVFJVRSksCiAgICBuID0gbigpCiAgKQoKIyBWaWV3IHRoZSBzdW1tYXJ5IHN0YXRpc3RpY3MKcHJpbnQoc3VtbWFyeV9zdGF0c19mc19vdmVyYWxsKQoKYGBgCgpgYGB7cn0KbGlicmFyeShsc3IpCgpjb2hlbnNEKGZzX3ByZSB+IHBhcnRpY2lwYW50X3R5cGVfMiwgZGF0YSA9IHBoYXNlXzNfYWxsX291dGNvbWVzKQpgYGAKCmBgYHtyfQpoZWRnX2cocGhhc2VfM19hbGxfb3V0Y29tZXMsIGZzX3ByZSB+IHBhcnRpY2lwYW50X3R5cGVfMikgCmBgYAoKCmBgYHtyfQojIENhbGN1bGF0ZSBtZWFucyBhbmQgc3RhbmRhcmQgZGV2aWF0aW9ucyBmb3IgZWFjaCBncm91cApzdW1tYXJ5X3N0YXRzX2Z3Yl9vdmVyYWxsIDwtIHBoYXNlXzNfYWxsX291dGNvbWVzICU+JQogIGdyb3VwX2J5KHBhcnRpY2lwYW50X3R5cGVfMikgJT4lCiAgc3VtbWFyaXNlKAogICAgbWVhbiA9IG1lYW4oZndiX3ByZSwgbmEucm0gPSBUUlVFKSwKICAgIHNkID0gc2QoZndiX3ByZSwgbmEucm0gPSBUUlVFKSwKICAgIG4gPSBuKCkKICApCgojIFZpZXcgdGhlIHN1bW1hcnkgc3RhdGlzdGljcwpwcmludChzdW1tYXJ5X3N0YXRzX2Z3Yl9vdmVyYWxsKQoKYGBgCgpgYGB7cn0KbGlicmFyeShsc3IpCgpjb2hlbnNEKGZ3Yl9wcmUgfiBwYXJ0aWNpcGFudF90eXBlXzIsIGRhdGEgPSBwaGFzZV8zX2FsbF9vdXRjb21lcykKYGBgCgpgYGB7cn0KaGVkZ19nKHBoYXNlXzNfYWxsX291dGNvbWVzLCBmd2JfcHJlIH4gcGFydGljaXBhbnRfdHlwZV8yKSAKYGBgCgojUHJlL1Bvc3QvRm9sbG93IHVwIEV4cGxvcmF0aW9uCgojIE91dGNvbWUgMQoKYGBge3J9CnRhYmxlMSh+IFNlbGZLbm93X092ZXJhbGxTY29yZV9wcmUgKyBTZWxmS25vd19PdmVyYWxsU2NvcmVfcG9zdCAqIFNlbGZLbm93X092ZXJhbGxTY29yZV9mb2xsb3d8cGFydGljaXBhbnRfdHlwZS5mYWMsIGRhdGE9cGhhc2VfM19hbGxfb3V0Y29tZXMpCgpgYGAKCmBgYHtyfQppbnN0YWxsLnBhY2thZ2VzKCJnZ3Bsb3QyIikgICMgVW5jb21tZW50IGlmIHlvdSBoYXZlbid0IGluc3RhbGxlZCBnZ3Bsb3QyCmluc3RhbGwucGFja2FnZXMoInpvbyIpCmxpYnJhcnkoem9vKQpsaWJyYXJ5KGdncGxvdDIpCgojIENyZWF0ZSBhIGRhdGEgZnJhbWUKc2VsZl9rbm93IDwtIGRhdGEuZnJhbWUoCiAgR3JvdXAgPSByZXAoYygiVHJlYXRtZW50IiwgIk5vbi1Db21wbGV0ZXIgQ29tcGFyaXNvbiBHcm91cCIsICJXaW5DbyBDb21wYXJpc29uIEdyb3VwIiksIGVhY2ggPSAzKSwKICBUaW1lcG9pbnQgPSByZXAoYygiMTpQcmUiLCAiMjpQb3N0IiwgIjM6IEZvbGxvdy1VcCIpLCB0aW1lcyA9IDMpLAogIFNjb3JlID0gYygyLjk4LCAzLjE1LCAzLjEyLCAyLjk2LCBOQSwgMi45OCwgMy4xMCwgTkEsIDMuMTIpCikKc2VsZl9rbm93IDwtIHNlbGZfa25vdyAlPiUKICBncm91cF9ieShHcm91cCkgJT4lCiAgbXV0YXRlKFNjb3JlID0gbmEuYXBwcm94KFNjb3JlLCBuYS5ybSA9IEZBTFNFKSkgJT4lCiAgdW5ncm91cCgpCgojIENyZWF0ZSB0aGUgcGxvdApnZ3Bsb3Qoc2VsZl9rbm93LCBhZXMoeCA9IFRpbWVwb2ludCwgeSA9IFNjb3JlLCBncm91cCA9IEdyb3VwLCBjb2xvciA9IEdyb3VwKSkgKwogIGdlb21fbGluZSgpICsKICBnZW9tX3BvaW50KHNpemUgPSA0KSArCiAgbGFicyh0aXRsZSA9ICJQcmUsIFBvc3QsIGFuZCBGb2xsb3ctVXAgUmVzdWx0cyIsCiAgICAgICB4ID0gIlRpbWVwb2ludCIsCiAgICAgICB5ID0gIlNjb3JlIikgKwogIHRoZW1lX21pbmltYWwoKQpgYGAKIyMgT3V0Y29tZSAyCmBgYHtyfQp0YWJsZTEofiBPYmpfT3ZlcmFsbFNjb3JlX3ByZSArIE9ial9PdmVyYWxsU2NvcmVfcG9zdCArIE9ial9PdmVyYWxsU2NvcmVfZm9sbG93fHBhcnRpY2lwYW50X3R5cGUuZmFjLCBkYXRhPXBoYXNlXzNfYWxsX291dGNvbWVzKQoKYGBgCgpgYGB7cn0KaW5zdGFsbC5wYWNrYWdlcygiZ2dwbG90MiIpICAjIFVuY29tbWVudCBpZiB5b3UgaGF2ZW4ndCBpbnN0YWxsZWQgZ2dwbG90MgppbnN0YWxsLnBhY2thZ2VzKCJ6b28iKQpsaWJyYXJ5KHpvbykKbGlicmFyeShnZ3Bsb3QyKQoKIyBDcmVhdGUgYSBkYXRhIGZyYW1lCm9ial9rbm93IDwtIGRhdGEuZnJhbWUoCiAgR3JvdXAgPSByZXAoYygiVHJlYXRtZW50IiwgIk5vbi1Db21wbGV0ZXIgQ29tcGFyaXNvbiBHcm91cCIsICJXaW5DbyBDb21wYXJpc29uIEdyb3VwIiksIGVhY2ggPSAzKSwKICBUaW1lcG9pbnQgPSByZXAoYygiMTogUHJlIiwgIjI6IFBvc3QiLCAiMzogRm9sbG93LVVwIiksIHRpbWVzID0gMyksCiAgU2NvcmUgPSBjKDcuMjEsIDcuMjIsIDcuMTgsIDcuMjAsIE5BLCA3LjIwLCA3LjIzLCBOQSwgNy4yMSkKKQpvYmpfa25vdyA8LSBvYmpfa25vdyAlPiUKICBncm91cF9ieShHcm91cCkgJT4lCiAgbXV0YXRlKFNjb3JlID0gbmEuYXBwcm94KFNjb3JlLCBuYS5ybSA9IEZBTFNFKSkgJT4lCiAgdW5ncm91cCgpCgojIENyZWF0ZSB0aGUgcGxvdApnZ3Bsb3Qob2JqX2tub3csIGFlcyh4ID0gVGltZXBvaW50LCB5ID0gU2NvcmUsIGdyb3VwID0gR3JvdXAsIGNvbG9yID0gR3JvdXApKSArCiAgZ2VvbV9saW5lKCkgKwogIGdlb21fcG9pbnQoc2l6ZSA9IDQpICsKICBsYWJzKHRpdGxlID0gICJQcmUsIFBvc3QsIGFuZCBGb2xsb3ctVXAgUmVzdWx0cyIsCiAgICAgICB4ID0gIlRpbWVwb2ludCIsCiAgICAgICB5ID0gIlNjb3JlIikgKwogIHRoZW1lX21pbmltYWwoKQpgYGAKCgoKCmBgYHtyfQp3cml0ZV9zYXYocGhhc2VfM19hbGxfb3V0Y29tZXMsICJwaGFzZV8zX2ZpbmFsXzEwXzE2LnNhdiIpCmBgYAoKIyMgT3V0Y29tZSAzOiBBdGl0dWRlcyBUb3dhcmQgQmFua3MKCmBgYHtyfQp0YWJsZTEofiBmaW5hbmNpYWxfYXR0XzFfMSArIGZpbmFuY2lhbF9hdHRfMV8xX3Bvc3QgKyBmaW5hbmNpYWxfYXR0XzFfMV9mb2xsb3cgKyBmaW5hbmNpYWxfYXR0XzFfMiArIGZpbmFuY2lhbF9hdHRfMV8yX3Bvc3QgKyBmaW5hbmNpYWxfYXR0XzFfMl9mb2xsb3cgKyBmaW5hbmNpYWxfYXR0XzFfMyArIGZpbmFuY2lhbF9hdHRfMV8zX3Bvc3QgKyBmaW5hbmNpYWxfYXR0XzFfM19mb2xsb3cgKyBmaW5hbmNpYWxfYXR0XzFfNCArIGZpbmFuY2lhbF9hdHRfMV80X3Bvc3QgKyBmaW5hbmNpYWxfYXR0XzFfNF9mb2xsb3cgKyBmaW5hbmNpYWxfYXR0XzFfNSArIGZpbmFuY2lhbF9hdHRfMV81X3Bvc3QgKyBmaW5hbmNpYWxfYXR0XzFfNV9mb2xsb3cgKyBhdHRfdG93YXJkX2JhbmtzX3ByZSArIGF0dF90b3dhcmRfYmFua3NfcG9zdCArIGF0dF90b3dhcmRfYmFua3NfZm9sbG93fHBhcnRpY2lwYW50X3R5cGUuZmFjLCBkYXRhPXBoYXNlXzNfYWxsX291dGNvbWVzKQoKYGBgCgpgYGB7cn0KbGlicmFyeSh6b28pCmxpYnJhcnkoZ2dwbG90MikKCiMgQ3JlYXRlIGEgZGF0YSBmcmFtZQphdHRfYmFua3MgPC0gZGF0YS5mcmFtZSgKICBHcm91cCA9IHJlcChjKCJUcmVhdG1lbnQiLCAiTm9uLUNvbXBsZXRlciBDb21wYXJpc29uIEdyb3VwIiwgIldpbkNvIENvbXBhcmlzb24gR3JvdXAiKSwgZWFjaCA9IDMpLAogIFRpbWVwb2ludCA9IHJlcChjKCIxOiBQcmUiLCAiMjogUG9zdCIsICIzOiBGb2xsb3ctVXAiKSwgdGltZXMgPSAzKSwKICBTY29yZSA9IGMoMi44MSwgMi44OCwgMi44MywgMi43NywgTkEsIDIuNzcsIDIuNzQsIE5BLCAyLjc4KQopCmF0dF9iYW5rcyA8LSBhdHRfYmFua3MgJT4lCiAgZ3JvdXBfYnkoR3JvdXApICU+JQogIG11dGF0ZShTY29yZSA9IG5hLmFwcHJveChTY29yZSwgbmEucm0gPSBGQUxTRSkpICU+JQogIHVuZ3JvdXAoKQoKIyBDcmVhdGUgdGhlIHBsb3QKZ2dwbG90KGF0dF9iYW5rcywgYWVzKHggPSBUaW1lcG9pbnQsIHkgPSBTY29yZSwgZ3JvdXAgPSBHcm91cCwgY29sb3IgPSBHcm91cCkpICsKICBnZW9tX2xpbmUoKSArCiAgZ2VvbV9wb2ludChzaXplID0gNCkgKwogIGxhYnModGl0bGUgPSAgIlByZSwgUG9zdCwgYW5kIEZvbGxvdy1VcCBSZXN1bHRzOiBBdHRpdHVkZXMgVG93YXJkcyBCYW5rcyIsCiAgICAgICB4ID0gIlRpbWVwb2ludCIsCiAgICAgICB5ID0gIlNjb3JlIikgKwogIHRoZW1lX21pbmltYWwoKQpgYGAKCiMjIE91dGNvbWUgNDogRmluYW5pY2FsIFNraWxsCgpgYGB7cn0KbGlicmFyeShoYXZlbikKcGhhc2VfM19hbGxfb3V0Y29tZXMkZnMxX2NvbXBsZXhkZWNpc2lvbl9wcmUgPC0gYXMubnVtZXJpYyhwaGFzZV8zX2FsbF9vdXRjb21lcyRmczFfY29tcGxleGRlY2lzaW9uX3ByZSkKcGhhc2VfM19hbGxfb3V0Y29tZXMkZnMxX2NvbXBsZXhkZWNpc2lvbl9wb3N0IDwtIGFzLm51bWVyaWMocGhhc2VfM19hbGxfb3V0Y29tZXMkZnMxX2NvbXBsZXhkZWNpc2lvbl9wb3N0KQpwaGFzZV8zX2FsbF9vdXRjb21lcyRmczFfY29tcGxleGRlY2lzaW9uX2ZvbGxvd19mb2wgPC0gYXMubnVtZXJpYyhwaGFzZV8zX2FsbF9vdXRjb21lcyRmczFfY29tcGxleGRlY2lzaW9uX2ZvbGxvd19mb2wpCgpwaGFzZV8zX2FsbF9vdXRjb21lcyRmczJfZ29vZG5ld2RlY2lzaW9uX3ByZSA8LSBhcy5udW1lcmljKHBoYXNlXzNfYWxsX291dGNvbWVzJGZzMl9nb29kbmV3ZGVjaXNpb25fcHJlKQpwaGFzZV8zX2FsbF9vdXRjb21lcyRmczJfZ29vZG5ld2RlY2lzaW9uX3Bvc3QgPC0gYXMubnVtZXJpYyhwaGFzZV8zX2FsbF9vdXRjb21lcyRmczJfZ29vZG5ld2RlY2lzaW9uX3Bvc3QpCnBoYXNlXzNfYWxsX291dGNvbWVzJGZzMl9nb29kbmV3ZGVjaXNpb25fZm9sbG93X2ZvbCA8LSBhcy5udW1lcmljKHBoYXNlXzNfYWxsX291dGNvbWVzJGZzMl9nb29kbmV3ZGVjaXNpb25fZm9sbG93X2ZvbCkKcGhhc2VfM19hbGxfb3V0Y29tZXMkZnMyX2dvb2RuZXdkZWNpc2lvbl9wcmUgPC0gYXMubnVtZXJpYyhwaGFzZV8zX2FsbF9vdXRjb21lcyRmczJfZ29vZG5ld2RlY2lzaW9uX3ByZSkKCnBoYXNlXzNfYWxsX291dGNvbWVzJGZzMl9nb29kbmV3ZGVjaXNpb25fcHJlIDwtIGFzLm51bWVyaWMocGhhc2VfM19hbGxfb3V0Y29tZXMkZnMyX2dvb2RuZXdkZWNpc2lvbl9wcmUpCnBoYXNlXzNfYWxsX291dGNvbWVzJGZzMl9nb29kbmV3ZGVjaXNpb25fcG9zdCA8LSBhcy5udW1lcmljKHBoYXNlXzNfYWxsX291dGNvbWVzJGZzMl9nb29kbmV3ZGVjaXNpb25fcG9zdCkKcGhhc2VfM19hbGxfb3V0Y29tZXMkZnMyX2dvb2RuZXdkZWNpc2lvbl9mb2xsb3dfZm9sIDwtIGFzLm51bWVyaWMocGhhc2VfM19hbGxfb3V0Y29tZXMkZnMyX2dvb2RuZXdkZWNpc2lvbl9mb2xsb3dfZm9sKQpwaGFzZV8zX2FsbF9vdXRjb21lcyRmczJfZ29vZG5ld2RlY2lzaW9uX3ByZSA8LSBhcy5udW1lcmljKHBoYXNlXzNfYWxsX291dGNvbWVzJGZzMl9nb29kbmV3ZGVjaXNpb25fcHJlKQpgYGAKCmBgYHtyfQp0YWJsZTEofiBmczFfY29tcGxleGRlY2lzaW9uX3ByZSArIGZzMV9jb21wbGV4ZGVjaXNpb25fcG9zdCArIGZzMV9jb21wbGV4ZGVjaXNpb25fZm9sbG93X2ZvbCArIGZzMl9nb29kbmV3ZGVjaXNpb25fcHJlICsgZnMyX2dvb2RuZXdkZWNpc2lvbl9wb3N0ICsgZnMyX2dvb2RuZXdkZWNpc2lvbl9mb2xsb3dfZm9sICsgZnMzX2ZvbGxvd3Rocm91Z2hfcHJlICsgZnMzX2ZvbGxvd3Rocm91Z2hfcG9zdCArIGZzM19mb2xsb3d0aHJvdWdoX2ZvbGxvd19mb2wgKyBmczRfcmVjb2duaXplZ29vZGludmVzdG1lbnRfcHJlICsgZnM0X3JlY29nbml6ZWdvb2RpbnZlc3RtZW50X3Bvc3QgKyBmczRfcmVjb2duaXplZ29vZGludmVzdG1lbnRfZm9sICsgZnM1X2tlZXBmcm9tc3BlbmRpbmdfcHJlICArIGZzNV9rZWVwZnJvbXNwZW5kaW5nX3Bvc3QgICsgZnM1X2tlZXBmcm9tc3BlbmRpbmdfZm9sICsgZnM2X2hvd3Rvc2F2ZV9wcmUgKyBmczZfaG93dG9zYXZlX3Bvc3QgKyBmczZfaG93dG9zYXZlX2ZvbCArIGZzN19maW5kYWR2aWNlX3ByZSArIGZzN19maW5kYWR2aWNlX3Bvc3QgKyBmczdfZmluZGFkdmljZV9mb2wgKyBmczhfbm90ZW5vdWdoaW5mb19wcmUgKyBmczhfbm90ZW5vdWdoaW5mb19wb3N0ICsgZnM4X25vdGVub3VnaGluZm9fZm9sICsgZnM5X3doZW5hZHZpY2VfcHJlICsgZnM5X3doZW5hZHZpY2VfcG9zdCArIGZzOV93aGVuYWR2aWNlX2ZvbCArIGZzMTBfc3RydWdnbGV1bmRlcnN0YW5kX3ByZSArIGZzMTBfc3RydWdnbGV1bmRlcnN0YW5kX3Bvc3QgKyBmczEwX3N0cnVnZ2xldW5kZXJzdGFuZF9mb2x8cGFydGljaXBhbnRfdHlwZS5mYWMsIGRhdGE9cGhhc2VfM19hbGxfb3V0Y29tZXMpCgpgYGAKCmBgYHtyfQp0YWJsZTEofiBmc19wcmUgKyBmc19wb3N0ICsgZnNfZm9sfHBhcnRpY2lwYW50X3R5cGUuZmFjLCBkYXRhPXBoYXNlXzNfYWxsX291dGNvbWVzKQpgYGAKCmBgYHtyfQpsaWJyYXJ5KHpvbykKbGlicmFyeShnZ3Bsb3QyKQoKIyBDcmVhdGUgYSBkYXRhIGZyYW1lCmZzIDwtIGRhdGEuZnJhbWUoCiAgR3JvdXAgPSByZXAoYygiVHJlYXRtZW50IiwgIk5vbi1Db21wbGV0ZXIgQ29tcGFyaXNvbiBHcm91cCIsICJXaW5DbyBDb21wYXJpc29uIEdyb3VwIiksIGVhY2ggPSAzKSwKICBUaW1lcG9pbnQgPSByZXAoYygiMTogUHJlIiwgIjI6IFBvc3QiLCAiMzogRm9sbG93LVVwIiksIHRpbWVzID0gMyksCiAgU2NvcmUgPSBjKDUwLjgsIDUzLjksIDU0LjgsIDQ5LjgsIE5BLCA0OS44LCA0OS40LCBOQSwgNDkuNikKKQpmcyA8LSBmcyAlPiUKICBncm91cF9ieShHcm91cCkgJT4lCiAgbXV0YXRlKFNjb3JlID0gbmEuYXBwcm94KFNjb3JlLCBuYS5ybSA9IEZBTFNFKSkgJT4lCiAgdW5ncm91cCgpCgojIENyZWF0ZSB0aGUgcGxvdApnZ3Bsb3QoZnMsIGFlcyh4ID0gVGltZXBvaW50LCB5ID0gU2NvcmUsIGdyb3VwID0gR3JvdXAsIGNvbG9yID0gR3JvdXApKSArCiAgZ2VvbV9saW5lKCkgKwogIGdlb21fcG9pbnQoc2l6ZSA9IDQpICsKICBsYWJzKHRpdGxlID0gICJQcmUsIFBvc3QsIGFuZCBGb2xsb3ctVXAgUmVzdWx0czogRmluYW5jaWFsIFNraWxsIiwKICAgICAgIHggPSAiVGltZXBvaW50IiwKICAgICAgIHkgPSAiU2NvcmUiKSArCiAgdGhlbWVfbWluaW1hbCgpCmBgYAojIyBPdXRjb21lIDUKCmBgYHtyfQpsYWJlbChwaGFzZV8zX2FsbF9vdXRjb21lcyRmaW5hbmNpYWxfYmVoYXZlXzEpIDwtICJEbyB5b3UgaGF2ZSBhIHNwZW5kaW5nIGFuZCBzYXZpbmcgcGxhbiBvciBidWRnZXQgdGhhdCB5b3UgdXNlIHRvIGhlbHAgbWFuYWdlIHlvdXIgZmluYW5jZXM/IgpsYWJlbChwaGFzZV8zX2FsbF9vdXRjb21lcyRmaW5hbmNpYWxfYmVoYXZlXzIpIDwtICJIb3cgb2Z0ZW4gZG8geW91IGNoZWNrIHRvIHNlZSBpZiB5b3UgYXJlIGZvbGxvd2luZyB5b3VyIHNwZW5kaW5nIGFuZCBzYXZpbmcgcGxhbi9idWRnZXQ/IgpsYWJlbChwaGFzZV8zX2FsbF9vdXRjb21lcyRmaW5hbmNpYWxfYmVoYXZlXzMpIDwtICJIb3cgb2Z0ZW4gZG8geW91IHJldmlldyB5b3VyIHNwZW5kaW5nIGFuZCBzYXZpbmcgcGxhbi9idWRnZXQgdG8gc2VlIGlmIHlvdSBuZWVkIHRvIG1ha2UgY2hhbmdlcyB0byBpdD8iCmxhYmVsKHBoYXNlXzNfYWxsX291dGNvbWVzJGZpbmFuY2lhbF9iZWhhdmVfMV9wb3N0KSA8LSAiV2hlbiB5b3Ugc3RhcnRlZCB0byBwbGF5IHRoZSBIb3cgTW9uZXkgU21hcnQgQXJlIFlvdSBnYW1lcywgZGlkIHlvdSBoYXZlIGEgc3BlbmRpbmcgYW5kIHNhdmluZyBwbGFuIG9yIGJ1ZGdldCB0aGF0IHlvdSB1c2VkIHRvIGhlbHAgbWFuYWdlIHlvdXIgZmluYW5jZXM/IgpsYWJlbChwaGFzZV8zX2FsbF9vdXRjb21lcyRmaW5hbmNpYWxfYmVoYXZlXzJfcG9zdCkgPC0gIlNpbmNlIHN0YXJ0aW5nIHRvIHBsYXkgdGhlIEhvdyBNb25leSBTbWFydCBBcmUgWW91IGdhbWVzLCBoYXZlIHlvdSByZXZpZXdlZCB5b3VyIHNwZW5kaW5nIGFuZCBzYXZpbmcgcGxhbi9idWRnZXQgdG8gc2VlIGlmIHlvdSBuZWVkIHRvIG1ha2UgY2hhbmdlcyB0byBpdD8iCmxhYmVsKHBoYXNlXzNfYWxsX291dGNvbWVzJGZpbmFuY2lhbF9iZWhhdmVfM19wb3N0KSA8LSAiU2luY2Ugc3RhcnRpbmcgdG8gcGxheSB0aGUgSG93IE1vbmV5IFNtYXJ0IEFyZSBZb3UgZ2FtZXMsIGhhdmUgeW91IGNyZWF0ZWQgYSBzcGVuZGluZyBhbmQgc2F2aW5nIHBsYW4vYnVkZ2V0PyIKbGFiZWwocGhhc2VfM19hbGxfb3V0Y29tZXMkZmluYW5jaWFsX2JlaGF2ZV80X3Bvc3QpIDwtICJIb3cgbGlrZWx5IGRvIHlvdSB0aGluayBpdCBpcyB0aGF0IHlvdSB3aWxsIGNyZWF0ZSBhIHNwZW5kaW5nIGFuZCBzYXZpbmcgcGxhbiBvciBidWRnZXQgaW4gdGhlIG5leHQgMyBtb250aHM/IgpsYWJlbChwaGFzZV8zX2FsbF9vdXRjb21lcyRmaW5hbmNpYWxfYmVoYXZlXzFfZm9sbG93KSA8LSAiRG8geW91IGhhdmUgYSBzcGVuZGluZyBhbmQgc2F2aW5nIHBsYW4gb3IgYnVkZ2V0IHRoYXQgeW91IHVzZSB0byBoZWxwIG1hbmFnZSB5b3VyIGZpbmFuY2VzPyIKbGFiZWwocGhhc2VfM19hbGxfb3V0Y29tZXMkZmluYW5jaWFsX2JlaGF2ZV8yX2ZvbGxvdykgPC0gIkhvdyBvZnRlbiBkbyB5b3UgY2hlY2sgdG8gc2VlIGlmIHlvdSBhcmUgZm9sbG93aW5nIHlvdXIgc3BlbmRpbmcgYW5kIHNhdmluZyBwbGFuL2J1ZGdldD8iCmxhYmVsKHBoYXNlXzNfYWxsX291dGNvbWVzJGZpbmFuY2lhbF9iZWhhdmVfM19mb2xsb3cpIDwtICJIb3cgb2Z0ZW4gZG8geW91IHJldmlldyB5b3VyIHNwZW5kaW5nIGFuZCBzYXZpbmcgcGxhbi9idWRnZXQgdG8gc2VlIGlmIHlvdSBuZWVkIHRvIG1ha2UgY2hhbmdlcyB0byBpdD8iCgpgYGAKCmBgYHtyfQp0YWJsZTEofiBmYWN0b3IoZmluYW5jaWFsX2JlaGF2ZV8xKSArIGZpbmFuY2lhbF9iZWhhdmVfMiArIGZpbmFuY2lhbF9iZWhhdmVfMyArIGZhY3RvcihmaW5hbmNpYWxfYmVoYXZlXzFfcG9zdCkgKyBmYWN0b3IoZmluYW5jaWFsX2JlaGF2ZV8yX3Bvc3QpICsgZmFjdG9yKGZpbmFuY2lhbF9iZWhhdmVfM19wb3N0KSArIGZpbmFuY2lhbF9iZWhhdmVfNF9wb3N0ICsgZmFjdG9yKGZpbmFuY2lhbF9iZWhhdmVfMV9mb2xsb3cpICsgZmluYW5jaWFsX2JlaGF2ZV8yX2ZvbGxvdyArIGZpbmFuY2lhbF9iZWhhdmVfM19mb2xsb3d8cGFydGljaXBhbnRfdHlwZS5mYWMsIGRhdGE9cGhhc2VfM19hbGxfb3V0Y29tZXMpCmBgYAoKYGBge3J9CnRhYmxlMSh+IGZhY3RvcihmaW5hbmNpYWxfYmVoYXZlXzQpICsgZmFjdG9yKGZpbmFuY2lhbF9iZWhhdmVfNikgKyBmYWN0b3IoZmluYW5jaWFsX2JlaGF2ZV83KSArIGZhY3RvcihmaW5hbmNpYWxfYmVoYXZlXzgpICsgZmFjdG9yKGZpbmFuY2lhbF9iZWhhdmVfOSkgKyBmYWN0b3IoZmluYW5jaWFsX2JlaGF2ZV8zX3Bvc3QpICsgZmFjdG9yKGZpbmFuY2lhbF9iZWhhdmVfNV9wb3N0KSArIGZhY3RvcihmaW5hbmNpYWxfYmVoYXZlXzZfcG9zdCkgKyBmYWN0b3IoZmluYW5jaWFsX2JlaGF2ZV83X3Bvc3QpICsgZmFjdG9yKGZpbmFuY2lhbF9iZWhhdmVfOF9wb3N0KSArIGZhY3RvcihmaW5hbmNpYWxfYmVoYXZlXzlfcG9zdCkgKyBmYWN0b3IoZmluYW5jaWFsX2JlaGF2ZV80X2ZvbGxvdykgKyBmYWN0b3IoZmluYW5jaWFsX2JlaGF2ZV82X2ZvbGxvdykgKyBmYWN0b3IoZmluYW5jaWFsX2JlaGF2ZV83X2ZvbGxvdykgKyBmYWN0b3IoZmluYW5jaWFsX2JlaGF2ZV84X2ZvbGxvdykgKyBmYWN0b3IoZmluYW5jaWFsX2JlaGF2ZV85X2ZvbGxvdykgfHBhcnRpY2lwYW50X3R5cGUuZmFjLCBkYXRhPXBoYXNlXzNfYWxsX291dGNvbWVzKQpgYGAKCiMjIE91dGNvbWUgNgpgYGB7cn0KdGFibGUxKH4gZndiMV9leHBfcHJlICsgIGZ3YjNfc2VjdXJlX3ByZSArIGZ3YjVfbmV2ZXJfcHJlICsgZndiNl9lbmpveV9wcmUgKyBmd2IyX2dldGJ5X3ByZSArIGZ3YjRfY29uY2Vybl9wcmUgKyBmd2I5X3N0cmFpbl9wcmUgKyBmd2IxMF9sZWZ0X3ByZSArICBmd2I3X2JlaGluZF9wcmUgKyBmd2I4X2NvbnRyb2xfcHJlICsgZndiMV9leHBfcG9zdCArICBmd2IzX3NlY3VyZV9wb3N0ICsgZndiNV9uZXZlcl9wb3N0ICsgZndiNl9lbmpveV9wb3N0ICsgZndiMl9nZXRieV9wb3N0ICsgZndiNF9jb25jZXJuX3Bvc3QgKyBmd2I5X3N0cmFpbl9wb3N0ICsgZndiMTBfbGVmdF9wb3N0ICsgIGZ3YjdfYmVoaW5kX3Bvc3QgKyBmd2I4X2NvbnRyb2xfcG9zdCArIGZ3YjFfZXhwX2ZvbGxvdyArICBmd2IzX3NlY3VyZV9mb2xsb3cgKyBmd2I1X25ldmVyX2ZvbGxvdyArIGZ3YjZfZW5qb3lfZm9sbG93ICsgZndiMl9nZXRieV9mb2xsb3cgKyBmd2I0X2NvbmNlcm5fZm9sbG93ICsgZndiOV9zdHJhaW5fZm9sbG93ICsgZndiMTBfbGVmdF9mb2xsb3cgKyAgZndiN19iZWhpbmRfZm9sbG93ICsgZndiOF9jb250cm9sX2ZvbGxvd3xwYXJ0aWNpcGFudF90eXBlLmZhYywgZGF0YT1waGFzZV8zX2FsbF9vdXRjb21lcykKCmBgYAoKYGBge3J9CnRhYmxlMSh+IGZ3Yl9wcmUgKyBmd2JfcG9zdCArIGZ3Yl9mb2xsb3d8cGFydGljaXBhbnRfdHlwZS5mYWMsIGRhdGE9cGhhc2VfM19hbGxfb3V0Y29tZXMpCmBgYAoKYGBge3J9CmxpYnJhcnkoem9vKQpsaWJyYXJ5KGdncGxvdDIpCgojIENyZWF0ZSBhIGRhdGEgZnJhbWUKZndiIDwtIGRhdGEuZnJhbWUoCiAgR3JvdXAgPSByZXAoYygiVHJlYXRtZW50IiwgIk5vbi1Db21wbGV0ZXIgQ29tcGFyaXNvbiBHcm91cCIsICJXaW5DbyBDb21wYXJpc29uIEdyb3VwIiksIGVhY2ggPSAzKSwKICBUaW1lcG9pbnQgPSByZXAoYygiMTogUHJlIiwgIjI6IFBvc3QiLCAiMzogRm9sbG93LVVwIiksIHRpbWVzID0gMyksCiAgU2NvcmUgPSBjKDUzLjAsIDUzLjgsIDU1LjQsIDUxLjIsIE5BLCA1MC42LCA1MC40LCBOQSwgNTEuMCkKKQpmd2IgPC0gZndiICU+JQogIGdyb3VwX2J5KEdyb3VwKSAlPiUKICBtdXRhdGUoU2NvcmUgPSBuYS5hcHByb3goU2NvcmUsIG5hLnJtID0gRkFMU0UpKSAlPiUKICB1bmdyb3VwKCkKCiMgQ3JlYXRlIHRoZSBwbG90CmdncGxvdChmd2IsIGFlcyh4ID0gVGltZXBvaW50LCB5ID0gU2NvcmUsIGdyb3VwID0gR3JvdXAsIGNvbG9yID0gR3JvdXApKSArCiAgZ2VvbV9saW5lKCkgKwogIGdlb21fcG9pbnQoc2l6ZSA9IDQpICsKICBsYWJzKHRpdGxlID0gICJQcmUsIFBvc3QsIGFuZCBGb2xsb3ctVXAgUmVzdWx0czogRmluYW5jaWFsIFdlbGwtYmVpbmciLAogICAgICAgeCA9ICJUaW1lcG9pbnQiLAogICAgICAgeSA9ICJTY29yZSIpICsKICB0aGVtZV9taW5pbWFsKCkKYGBgCmBgYHtyfQp0YWJsZTEofiBnYW1lc19iZWZvcmVfcHJldGVzdCArIGdhbWVzX2JlZm9yZV9wb3N0X3Rlc3QgKyBnYW1lc19iZWZvcmVfZm9sbG93fHBhcnRpY2lwYW50X3R5cGUuZmFjLCBkYXRhPXBoYXNlXzNfYWxsX291dGNvbWVzKQoKYGBgCg==