Education
datajt %>%
filter(leeftijd>24 & !is.na(opl4)) %>%
group_by(survey_wave, opl4) %>%
summarise(N = n(),
cdn_educ_EIM = mean(educ_EI, na.rm=T),
sd = sd(educ_EI, na.rm=T),
cdn_educ_EIM_w = wtd.mean(educ_EI, cdn_size, normwt = FALSE, na.rm = TRUE), #perhaps better to set normwt to TRUE
sd_w = sqrt(wtd.var(educ_EI, cdn_size, normwt = FALSE, na.rm = TRUE))) %>%
mutate(
conf.interval = .95,
se = sd / sqrt(N) ,
ci = se * qt(conf.interval/2 + .5, N-1),
se_w = sd_w / sqrt(N) , #is this correct??
ci_w = se_w * qt(conf.interval/2 + .5, N-1)) %>%
na.omit() -> tgc
datajt_nk %>%
filter(leeftijd>24) %>%
group_by(survey_wave, opl4) %>%
summarise(N = n(),
cdn_educ_EIM = mean(educ_EI, na.rm=T),
sd = sd(educ_EI, na.rm=T)) %>%
mutate(
se = sd / sqrt(N) ,
conf.interval = .95,
ci = se * qt(conf.interval/2 + .5, N-1)) %>%
na.omit() -> tgc_nk
tgc$period <- as.numeric(tgc$survey_wave) + 2007
tgc$homogeneity <- round(tgc$cdn_educ_EIM, 2)
tgc$education <- as.factor(tgc$opl4)
levels(tgc$education) <- c("primary + vmbo", "havo/vwo/mbo", "hbo", "university")
tgc_nk$period <- as.numeric(tgc_nk$survey_wave) + 2007
tgc_nk$homogeneity <- round(tgc_nk$cdn_educ_EIM, 2)
tgc_nk$education <- as.factor(tgc_nk$opl4)
levels(tgc_nk$education) <- c("primary + vmbo", "havo/vwo/mbo", "hbo", "university")
datajt %>%
filter(leeftijd>24 & !is.na(opl4)) %>%
group_by(survey_wave, opl4) %>%
summarise(N = n(),
cdn_educ_sim = mean(educ_sim, na.rm=T),
sd = sd(educ_EI, na.rm=T),
cdn_educ_sim_w = wtd.mean(educ_sim, cdn_size_educ, normwt = FALSE, na.rm = TRUE), #perhaps better to set normwt to TRUE
sd_w = sqrt(wtd.var(educ_EI, cdn_size_educ, normwt = FALSE, na.rm = TRUE))) %>%
mutate(
conf.interval = .95,
se = sd / sqrt(N) ,
ci = se * qt(conf.interval/2 + .5, N-1),
se_w = sd_w / sqrt(N) , #is this correct??
ci_w = se_w * qt(conf.interval/2 + .5, N-1)) %>%
na.omit() -> tgc_op2
datajt_nk %>%
filter(leeftijd>24 & !is.na(opl4)) %>%
group_by(survey_wave, opl4) %>%
summarise(N = n(),
cdn_educ_sim = mean(educ_sim, na.rm=T),
sd = sd(educ_EI, na.rm=T),
cdn_educ_sim_w = wtd.mean(educ_sim, cdn_size_educ, normwt = FALSE, na.rm = TRUE), #perhaps better to set normwt to TRUE
sd_w = sqrt(wtd.var(educ_EI, cdn_size_educ, normwt = FALSE, na.rm = TRUE))) %>%
mutate(
conf.interval = .95,
se = sd / sqrt(N) ,
ci = se * qt(conf.interval/2 + .5, N-1),
se_w = sd_w / sqrt(N) , #is this correct??
ci_w = se_w * qt(conf.interval/2 + .5, N-1)) %>%
na.omit() -> tgc_nk_op2
tgc$period <- as.numeric(tgc$survey_wave) + 2007
tgc$homogeneity <- round(tgc$cdn_educ_EIM, 2)
tgc$education <- as.factor(tgc$opl4)
levels(tgc$education) <- c("primary + vmbo", "havo/vwo/mbo", "hbo", "university")
tgc_op2$period <- as.numeric(tgc_op2$survey_wave) + 2007
tgc_op2$homogeneity <- round(tgc_op2$cdn_educ_sim, 2)
tgc_op2$education <- as.factor(tgc_op2$opl4)
levels(tgc_op2$education) <- c("primary + vmbo", "havo/vwo/mbo", "hbo", "university")
tgc_nk$period <- as.numeric(tgc_nk$survey_wave) + 2007
tgc_nk$homogeneity <- round(tgc_nk$cdn_educ_EIM, 2)
tgc_nk$education <- as.factor(tgc_nk$opl4)
levels(tgc_nk$education) <- c("primary + vmbo", "havo/vwo/mbo", "hbo", "university")
tgc_nk_op2$period <- as.numeric(tgc_nk_op2$survey_wave) + 2007
tgc_nk_op2$homogeneity <- round(tgc_nk_op2$cdn_educ_sim, 2)
tgc_nk_op2$education <- as.factor(tgc_nk_op2$opl4)
levels(tgc_nk_op2$education) <- c("primary + vmbo", "havo/vwo/mbo", "hbo", "university")
all
plot <- ggplot(tgc, aes(x=period, y=homogeneity, colour=education)) +
geom_line(position=position_dodge(0.1)) +
geom_errorbar(aes(ymin=homogeneity-ci, ymax=homogeneity+ci), width=.6, position=position_dodge(0.1)) +
geom_point(position=position_dodge(0.1)) +
scale_x_continuous(breaks = 2008:2021, limits = c(2007, 2022), labels = as.character(c(2008:2021))) +
scale_y_continuous(breaks = c(-1, -0.75, -.5, -.25, 0, .25, .5, .75, 1), limits = c(-1,1)) +
labs(title = "Educational homogeneity in CDN", caption = "Note: 95% CI \n Source: CentERdata 2021",
y = "EI-index", x="period") +
scale_colour_hue(name="education ego", # Legend label, use darker colors
#breaks=c("1", "2", "3", "4"),
#labels=c("primary + vmbo", "havo/vwo/mbo", "hbo", "university"),
l=40) + # Use darker colors, lightness=40
theme(axis.text.x = element_text(angle=45),
legend.justification=c(1,0),
legend.position="right")
#plot
ggplotly(plot) %>%
layout(margin = list(b=100), annotations = list(x=2021, y = -1.1, showarrow = F, font = list(size=10), text="\n \n \n \n \n \n \n \n \n Note: 95% CI \n Source: CentERdata 2021"))
Significance of trend:
- negative trend of ‘primary + vmbo’ and ‘havo/vwo/mbo’
- positive trend of ‘university’
datajt %>%
filter(leeftijd > 24 & !is.na(opl4)) %>%
with(lm(educ_EI ~ as.factor(opl4) + as.numeric(survey_wave):as.factor(opl4))) %>%
summary()
#>
#> Call:
#> lm(formula = educ_EI ~ as.factor(opl4) + as.numeric(survey_wave):as.factor(opl4))
#>
#> Residuals:
#> Min 1Q Median 3Q Max
#> -1.3460 -0.3151 -0.1239 0.3933 1.8851
#>
#> Coefficients:
#> Estimate Std. Error t value Pr(>|t|)
#> (Intercept) -0.843033 0.009573 -88.059 < 2e-16 ***
#> as.factor(opl4)2 1.197284 0.013012 92.016 < 2e-16 ***
#> as.factor(opl4)3 0.654055 0.013693 47.767 < 2e-16 ***
#> as.factor(opl4)4 0.632496 0.018762 33.712 < 2e-16 ***
#> as.factor(opl4)1:as.numeric(survey_wave) -0.003002 0.001246 -2.409 0.0160 *
#> as.factor(opl4)2:as.numeric(survey_wave) -0.008217 0.001067 -7.704 1.34e-14 ***
#> as.factor(opl4)3:as.numeric(survey_wave) 0.002036 0.001156 1.762 0.0781 .
#> as.factor(opl4)4:as.numeric(survey_wave) 0.008592 0.001793 4.791 1.66e-06 ***
#> ---
#> Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
#>
#> Residual standard error: 0.6061 on 58226 degrees of freedom
#> (28918 observations deleted due to missingness)
#> Multiple R-squared: 0.3506, Adjusted R-squared: 0.3505
#> F-statistic: 4490 on 7 and 58226 DF, p-value: < 2.2e-16
no kin
plot <- ggplot(tgc_nk, aes(x=period, y=homogeneity, colour=education)) +
geom_line(position=position_dodge(0.1)) +
geom_errorbar(aes(ymin=homogeneity-ci, ymax=homogeneity+ci), width=.6, position=position_dodge(0.1)) +
geom_point(position=position_dodge(0.1)) +
scale_x_continuous(breaks = 2008:2021, limits = c(2007, 2022), labels = as.character(c(2008:2021))) +
scale_y_continuous(breaks = c(-1, -0.75, -.5, -.25, 0, .25, .5, .75, 1), limits = c(-1,1)) +
labs(title = "Educational homogeneity in CDN", caption = "Note: 95% CI \n Source: CentERdata 2021",
y = "EI-index", x="period") +
scale_colour_hue(name="education ego", # Legend label, use darker colors
#breaks=c("1", "2", "3", "4"),
#labels=c("primary + vmbo", "havo/vwo/mbo", "hbo", "university"),
l=40) + # Use darker colors, lightness=40
theme(axis.text.x = element_text(angle=45),
legend.justification=c(1,0),
legend.position="right")
#plot
#plot
ggplotly(plot) %>%
layout(margin = list(b=100), annotations = list(x=2021, y = -1.1, showarrow = F, font = list(size=10), text="\n \n \n \n \n \n \n \n \n Note: 95% CI \n Source: CentERdata 2021"))
all (similarity)
#hist(datajt$educ_sim)
plot <- ggplot(tgc_op2, aes(x=period, y=homogeneity, colour=education)) +
geom_line(position=position_dodge(0.1)) +
geom_errorbar(aes(ymin=homogeneity-ci, ymax=homogeneity+ci), width=.6, position=position_dodge(0.1)) +
geom_point(position=position_dodge(0.1)) +
scale_x_continuous(breaks = 2008:2021, limits = c(2007, 2022), labels = as.character(c(2008:2021))) +
scale_y_continuous(breaks = c(-1, -0.75, -.5, -.25, 0, .25, .5, .75, 1), limits = c(-1,1)) +
labs(title = "Educational homogeneity in CDN", caption = "Note: 95% CI \n Source: CentERdata 2021",
y = "S-index", x="period") +
scale_colour_hue(name="education ego", # Legend label, use darker colors
#breaks=c("1", "2", "3", "4"),
#labels=c("primary + vmbo", "havo/vwo/mbo", "hbo", "university"),
l=40) + # Use darker colors, lightness=40
theme(axis.text.x = element_text(angle=45),
legend.justification=c(1,0),
legend.position="right")
#plot
ggplotly(plot) %>%
layout(margin = list(b=100), annotations = list(x=2021, y = -1.1, showarrow = F, font = list(size=10), text="\n \n \n \n \n \n \n \n \n Note: 95% CI \n Source: CentERdata 2021"))
no kin (similarity)
plot <- ggplot(tgc_nk_op2, aes(x=period, y=homogeneity, colour=education)) +
geom_line(position=position_dodge(0.1)) +
geom_errorbar(aes(ymin=homogeneity-ci, ymax=homogeneity+ci), width=.6, position=position_dodge(0.1)) +
geom_point(position=position_dodge(0.1)) +
scale_x_continuous(breaks = 2008:2021, limits = c(2007, 2022), labels = as.character(c(2008:2021))) +
scale_y_continuous(breaks = c(-1, -0.75, -.5, -.25, 0, .25, .5, .75, 1), limits = c(-1,1)) +
labs(title = "Educational homogeneity in CDN", caption = "Note: 95% CI \n Source: CentERdata 2021",
y = "S-index", x="period") +
scale_colour_hue(name="education ego", # Legend label, use darker colors
#breaks=c("1", "2", "3", "4"),
#labels=c("primary + vmbo", "havo/vwo/mbo", "hbo", "university"),
l=40) + # Use darker colors, lightness=40
theme(axis.text.x = element_text(angle=45),
legend.justification=c(1,0),
legend.position="right")
#plot
ggplotly(plot) %>%
layout(margin = list(b=100), annotations = list(x=2021, y = -1.1, showarrow = F, font = list(size=10), text="\n \n \n \n \n \n \n \n \n Note: 95% CI \n Source: CentERdata 2021"))
Gender
datajt %>%
filter(cdn_size > 0 & !is.na(geslacht)) %>%
group_by(survey_wave, geslacht) %>%
summarise(N = n(), gender_EI_mean = mean(gender_EI, na.rm = T), sd = sd(gender_EI, na.rm = T)) %>%
mutate(se = sd/sqrt(N), conf.interval = 0.95, ci = se * qt(conf.interval/2 + 0.5, N - 1)) -> tgc
tgc$period <- as.numeric(tgc$survey_wave) + 2007
tgc$homogeneity <- round(tgc$gender_EI_mean, 2)
tgc$gender <- as.factor(tgc$geslacht)
levels(tgc$gender) <- c("male", "female")
datajt_nk %>%
filter(cdn_size > 0 & !is.na(geslacht)) %>%
group_by(survey_wave, geslacht) %>%
summarise(N = n(), gender_EI_mean = mean(gender_EI, na.rm = T), sd = sd(gender_EI, na.rm = T)) %>%
mutate(se = sd/sqrt(N), conf.interval = 0.95, ci = se * qt(conf.interval/2 + 0.5, N - 1)) -> tgc_nk
tgc_nk$period <- as.numeric(tgc_nk$survey_wave) + 2007
tgc_nk$homogeneity <- round(tgc_nk$gender_EI_mean, 2)
tgc_nk$gender <- as.factor(tgc_nk$geslacht)
levels(tgc_nk$gender) <- c("male", "female")
all
plot <- ggplot(tgc, aes(x=period, y=homogeneity, colour=gender)) +
geom_line(position=position_dodge(0.1)) +
geom_errorbar(aes(ymin=homogeneity-ci, ymax=homogeneity+ci), width=.6, position=position_dodge(0.1)) +
geom_point(position=position_dodge(0.1)) +
scale_x_continuous(breaks = 2008:2021, limits = c(2007,2022), labels = as.character(c(2008:2021))) +
scale_y_continuous(breaks = c(-1, -0.75, -.5, -.25, 0, .25, .5, .75, 1), limits = c(-1,1)) +
labs(title = "Gender homogeneity in CDN", caption = "Note: 95% CI \n Source: CentERdata 2021",
y = "EI-index", x="period") +
scale_colour_hue(name="gender ego", # Legend label, use darker colors
#breaks=c("2", "1"),
#labels=c("female", "male"),
l=40) + # Use darker colors, lightness=40
theme(axis.text.x = element_text(angle=45),
legend.justification=c(1,0),
legend.position="right")
ggplotly(plot) %>%
layout(margin = list(b=100), annotations = list(x=2021, y = -1, showarrow = F, font = list(size=10), text="\n \n \n \n \n \n \n \n \n \n \n Note: 95% CI \n Source: CentERdata 2021"))
no kin
plot <- ggplot(tgc_nk, aes(x=period, y=homogeneity, colour=gender)) +
geom_line(position=position_dodge(0.1)) +
geom_errorbar(aes(ymin=homogeneity-ci, ymax=homogeneity+ci), width=.6, position=position_dodge(0.1)) +
geom_point(position=position_dodge(0.1)) +
scale_x_continuous(breaks = 2008:2021, limits = c(2007,2022), labels = as.character(c(2008:2021))) +
scale_y_continuous(breaks = c(-1, -0.75, -.5, -.25, 0, .25, .5, .75, 1), limits = c(-1,1)) +
labs(title = "Gender homogeneity in CDN", caption = "Note: 95% CI \n Source: CentERdata 2021",
y = "EI-index", x="period") +
scale_colour_hue(name="gender ego", # Legend label, use darker colors
#breaks=c("2", "1"),
#labels=c("female", "male"),
l=40) + # Use darker colors, lightness=40
theme(axis.text.x = element_text(angle=45),
legend.justification=c(1,0),
legend.position="right")
ggplotly(plot) %>%
layout(margin = list(b=100), annotations = list(x=2021, y = -1, showarrow = F, font = list(size=10), text="\n \n \n \n \n \n \n \n \n \n \n Note: 95% CI \n Source: CentERdata 2021"))
Age
datajt %>%
filter(!is.na(leeftijd) & leeftijd>15) %>%
group_by(survey_wave, leeftijd_cat13) %>%
summarise(N = n(),
cdn_leeftijd_EIM = mean(leeftijd_EI, na.rm=T),
sd = sd(leeftijd_EI, na.rm=T),
cdn_leeftijd_EIM_w = wtd.mean(leeftijd_EI, cdn_size_age, normwt = FALSE, na.rm = TRUE), #perhaps better to set normwt to TRUE
sd_w = sqrt(wtd.var(leeftijd_EI, cdn_size_age, normwt = FALSE, na.rm = TRUE))) %>%
mutate(
conf.interval = .95,
se = sd / sqrt(N) ,
ci = se * qt(conf.interval/2 + .5, N-1),
se_w = sd_w / sqrt(N) , #is this correct??
ci_w = se_w * qt(conf.interval/2 + .5, N-1)) %>%
na.omit() -> tgc
datajt_nk %>%
filter(!is.na(leeftijd) & leeftijd>15) %>%
group_by(survey_wave, leeftijd_cat13) %>%
summarise(N = n(),
cdn_leeftijd_EIM = mean(leeftijd_EI, na.rm=T),
sd = sd(leeftijd_EI, na.rm=T),
cdn_leeftijd_EIM_w = wtd.mean(leeftijd_EI, cdn_size, normwt = FALSE, na.rm = TRUE), #perhaps better to set normwt to TRUE
sd_w = sqrt(wtd.var(leeftijd_EI, cdn_size, normwt = FALSE, na.rm = TRUE))) %>%
mutate(
conf.interval = .95,
se = sd / sqrt(N) ,
ci = se * qt(conf.interval/2 + .5, N-1),
se_w = sd_w / sqrt(N) , #is this correct??
ci_w = se_w * qt(conf.interval/2 + .5, N-1)) %>%
na.omit() -> tgc_nk
test <- cut(as.numeric(datajt$leeftijd),breaks = c(-Inf, 15, 20, 25, 30, 35, 40,45,50,55,60,65,70, Inf))
#levels(test)
tgc$period <- as.numeric(tgc$survey_wave) + 2007
tgc$homogeneity <- round(tgc$cdn_leeftijd_EIM, 2)
tgc$age <- as.factor(tgc$leeftijd_cat13)
levels(tgc$age) <- levels(test)[-1]
tgc_nk$period <- as.numeric(tgc_nk$survey_wave) + 2007
tgc_nk$homogeneity <- round(tgc_nk$cdn_leeftijd_EIM, 2)
tgc_nk$age <- as.factor(tgc_nk$leeftijd_cat13)
levels(tgc_nk$age) <- levels(test)[-1]
datajt %>%
filter(!is.na(leeftijd) & leeftijd>15) %>%
group_by(survey_wave, leeftijd_cat13) %>%
summarise(N = n(),
cdn_leeftijd_EIM = mean(leeftijd_sim, na.rm=T),
sd = sd(leeftijd_sim, na.rm=T),
cdn_leeftijd_EIM_w = wtd.mean(leeftijd_sim, cdn_size_age, normwt = FALSE, na.rm = TRUE), #perhaps better to set normwt to TRUE
sd_w = sqrt(wtd.var(leeftijd_sim, cdn_size_age, normwt = FALSE, na.rm = TRUE))) %>%
mutate(
conf.interval = .95,
se = sd / sqrt(N) ,
ci = se * qt(conf.interval/2 + .5, N-1),
se_w = sd_w / sqrt(N) , #is this correct??
ci_w = se_w * qt(conf.interval/2 + .5, N-1)) %>%
na.omit() -> tgc_op2
datajt_nk %>%
filter(!is.na(leeftijd) & leeftijd>15) %>%
group_by(survey_wave, leeftijd_cat13) %>%
summarise(N = n(),
cdn_leeftijd_EIM = mean(leeftijd_sim, na.rm=T),
sd = sd(leeftijd_sim, na.rm=T),
cdn_leeftijd_EIM_w = wtd.mean(leeftijd_sim, cdn_size_age, normwt = FALSE, na.rm = TRUE), #perhaps better to set normwt to TRUE
sd_w = sqrt(wtd.var(leeftijd_sim, cdn_size_age, normwt = FALSE, na.rm = TRUE))) %>%
mutate(
conf.interval = .95,
se = sd / sqrt(N) ,
ci = se * qt(conf.interval/2 + .5, N-1),
se_w = sd_w / sqrt(N) , #is this correct??
ci_w = se_w * qt(conf.interval/2 + .5, N-1)) %>%
na.omit() -> tgc_nk_op2
test <- cut(as.numeric(datajt$leeftijd),breaks = c(-Inf, 15, 20, 25, 30, 35, 40,45,50,55,60,65,70, Inf))
#levels(test)
tgc_op2$period <- as.numeric(tgc_op2$survey_wave) + 2007
tgc_op2$homogeneity <- round(tgc_op2$cdn_leeftijd_EIM, 2)
tgc_op2$age <- as.factor(tgc_op2$leeftijd_cat13)
levels(tgc_op2$age) <- levels(test)[-1]
tgc_nk_op2$period <- as.numeric(tgc_nk_op2$survey_wave) + 2007
tgc_nk_op2$homogeneity <- round(tgc_nk_op2$cdn_leeftijd_EIM, 2)
tgc_nk_op2$age <- as.factor(tgc_nk_op2$leeftijd_cat13)
levels(tgc_nk_op2$age) <- levels(test)[-1]
all
plot <- ggplot(tgc, aes(x=period, y=homogeneity, colour=age)) +
geom_line(position=position_dodge(0.1)) +
geom_errorbar(aes(ymin=homogeneity-ci, ymax=homogeneity+ci), width=.6, position=position_dodge(0.1)) +
geom_point(position=position_dodge(0.1)) +
scale_x_continuous(breaks = 2008:2021, limits = c(2007,2022), labels = as.character(c(2008:2021))) +
scale_y_continuous(breaks = c(-1, -0.75, -.5, -.25, 0, .25, .5, .75, 1), limits = c(-1,1)) +
labs(title = "Age homogeneity", caption = "Note: 95% CI \n Source: CentERdata 2021",
y = "EI-index", x="period") +
scale_colour_hue(name="age ego", # Legend label, use darker colors
#breaks=c("1", "2"),
#labels=levels(test),
l=40) + # Use darker colors, lightness=40
theme(axis.text.x = element_text(angle=45),
legend.justification=c(1,0),
legend.position="right")
ggplotly(plot) %>%
layout(margin = list(b=100), annotations = list(x=2021, y = -1, showarrow = F, font = list(size=10), text="\n \n \n \n \n \n \n \n \n \n \n Note: 95% CI \n Source: CentERdata 2021"))
no kin
plot <- ggplot(tgc_nk, aes(x=period, y=homogeneity, colour=age)) +
geom_line(position=position_dodge(0.1)) +
geom_errorbar(aes(ymin=homogeneity-ci, ymax=homogeneity+ci), width=.6, position=position_dodge(0.1)) +
geom_point(position=position_dodge(0.1)) +
scale_x_continuous(breaks = 2008:2021, limits = c(2007,2022), labels = as.character(c(2008:2021))) +
scale_y_continuous(breaks = c(-1, -0.75, -.5, -.25, 0, .25, .5, .75, 1), limits = c(-1,1)) +
labs(title = "Age homogeneity", caption = "Note: 95% CI \n Source: CentERdata 2021",
y = "EI-index", x="period") +
scale_colour_hue(name="age ego", # Legend label, use darker colors
#breaks=c("1", "2"),
#labels=levels(test),
l=40) + # Use darker colors, lightness=40
theme(axis.text.x = element_text(angle=45),
legend.justification=c(1,0),
legend.position="right")
#plot
ggplotly(plot) %>%
layout(margin = list(b=100), annotations = list(x=2021, y = -1, showarrow = F, font = list(size=10), text="\n \n \n \n \n \n \n \n \n \n \n Note: 95% CI \n Source: CentERdata 2021"))
all (similarity)
plot <- ggplot(tgc_op2, aes(x=period, y=homogeneity, colour=age)) +
geom_line(position=position_dodge(0.1)) +
geom_errorbar(aes(ymin=homogeneity-ci, ymax=homogeneity+ci), width=.6, position=position_dodge(0.1)) +
geom_point(position=position_dodge(0.1)) +
scale_x_continuous(breaks = 2008:2021, limits = c(2007,2022), labels = as.character(c(2008:2021))) +
scale_y_continuous(breaks = c(-1, -0.75, -.5, -.25, 0, .25, .5, .75, 1), limits = c(-1,1))+
labs(title = "Age homogeneity", caption = "Note: 95% CI \n Source: CentERdata 2021",
y = "S-index", x="period") +
scale_colour_hue(name="age ego", # Legend label, use darker colors
#breaks=c("1", "2"),
#labels=levels(test),
l=40) + # Use darker colors, lightness=40
theme(axis.text.x = element_text(angle=45),
legend.justification=c(1,0),
legend.position="right")
ggplotly(plot) %>%
layout(margin = list(b=100), annotations = list(x=2021, y = -1, showarrow = F, font = list(size=10), text="\n \n \n \n \n \n \n \n \n \n \n Note: 95% CI \n Source: CentERdata 2021"))
no kin (similarity)
plot <- ggplot(tgc_nk_op2, aes(x=period, y=homogeneity, colour=age)) +
geom_line(position=position_dodge(0.1)) +
geom_errorbar(aes(ymin=homogeneity-ci, ymax=homogeneity+ci), width=.6, position=position_dodge(0.1)) +
geom_point(position=position_dodge(0.1)) +
scale_x_continuous(breaks = 2008:2021, limits = c(2007,2022), labels = as.character(c(2008:2021))) +
scale_y_continuous(breaks = c(-1, -0.75, -.5, -.25, 0, .25, .5, .75, 1), limits = c(-1,1)) +
labs(title = "Age homogeneity", caption = "Note: 95% CI \n Source: CentERdata 2021",
y = "S-index", x="period") +
scale_colour_hue(name="age ego", # Legend label, use darker colors
#breaks=c("1", "2"),
#labels=levels(test),
l=40) + # Use darker colors, lightness=40
theme(axis.text.x = element_text(angle=45),
legend.justification=c(1,0),
legend.position="right")
ggplotly(plot) %>%
layout(margin = list(b=100), annotations = list(x=2021, y = -1, showarrow = F, font = list(size=10), text="\n \n \n \n \n \n \n \n \n \n \n Note: 95% CI \n Source: CentERdata 2021"))
Ethnicity
datajt %>%
filter(!is.na(etni3)) %>%
group_by(survey_wave, etni3) %>%
summarise(N = n(),
cdn_etni_EIM = mean(etni_EI, na.rm=T),
sd = sd(etni_EI, na.rm=T),
cdn_etni_EIM_w = wtd.mean(etni_EI, cdn_size, normwt = FALSE, na.rm = TRUE), #perhaps better to set normwt to TRUE
sd_w = sqrt(wtd.var(etni_EI, cdn_size, normwt = FALSE, na.rm = TRUE))) %>%
mutate(
conf.interval = .95,
se = sd / sqrt(N) ,
ci = se * qt(conf.interval/2 + .5, N-1),
se_w = sd_w / sqrt(N) , #is this correct??
ci_w = se_w * qt(conf.interval/2 + .5, N-1)) %>%
na.omit() -> tgc
datajt_nk %>%
filter(!is.na(etni3)) %>%
group_by(survey_wave, etni3) %>%
summarise(N = n(),
cdn_etni_EIM = mean(etni_EI, na.rm=T),
sd = sd(etni_EI, na.rm=T),
cdn_etni_EIM_w = wtd.mean(etni_EI, cdn_size, normwt = FALSE, na.rm = TRUE), #perhaps better to set normwt to TRUE
sd_w = sqrt(wtd.var(etni_EI, cdn_size, normwt = FALSE, na.rm = TRUE))) %>%
mutate(
conf.interval = .95,
se = sd / sqrt(N) ,
ci = se * qt(conf.interval/2 + .5, N-1),
se_w = sd_w / sqrt(N) , #is this correct??
ci_w = se_w * qt(conf.interval/2 + .5, N-1)) %>%
na.omit() -> tgc_nk
tgc$period <- as.numeric(tgc$survey_wave) + 2007
tgc$homogeneity <- round(tgc$cdn_etni_EIM, 2)
tgc$ethnicity <- as.factor(tgc$etni3)
levels(tgc$ethnicity) <- c("Dutch", "Western", "non-Western")
tgc_nk$period <- as.numeric(tgc_nk$survey_wave) + 2007
tgc_nk$homogeneity <- round(tgc_nk$cdn_etni_EIM, 2)
tgc_nk$ethnicity <- as.factor(tgc_nk$etni3)
levels(tgc_nk$ethnicity) <- c("Dutch", "Western", "non-Western")
all
plot <- ggplot(tgc, aes(x=period, y=homogeneity, colour=ethnicity)) +
geom_line(position=position_dodge(0.1)) +
geom_errorbar(aes(ymin=homogeneity-ci, ymax=homogeneity+ci), width=.6, position=position_dodge(0.1)) +
geom_point(position=position_dodge(0.1)) +
scale_x_continuous(breaks = 2011:2021, limits = c(2010,2022), labels = as.character(c(2011:2021))) +
scale_y_continuous(breaks = c(-1, -0.75, -.5, -.25, 0, .25, .5, .75, 1), limits = c(-1,1)) +
labs(title = "Ethnic homogeneity", caption = "Note: 95% CI \n Source: CentERdata 2021",
y = "EI-index", x="period") +
scale_colour_hue(name="ethnicity ego", # Legend label, use darker colors
#breaks=c("1", "2"),
#labels=c("D", "W", "NW"),
l=40) + # Use darker colors, lightness=40
theme(axis.text.x = element_text(angle=45),
legend.justification=c(1,0),
legend.position="right")
ggplotly(plot) %>%
layout(margin = list(b=100), annotations = list(x=2021, y = -1, showarrow = F, font = list(size=10), text="\n \n \n \n \n \n \n \n \n \n \n Note: 95% CI \n Source: CentERdata 2021"))
no kin
plot <- ggplot(tgc_nk, aes(x=period, y=homogeneity, colour=ethnicity)) +
geom_line(position=position_dodge(0.1)) +
geom_errorbar(aes(ymin=homogeneity-ci, ymax=homogeneity+ci), width=.6, position=position_dodge(0.1)) +
geom_point(position=position_dodge(0.1)) +
scale_x_continuous(breaks = 2011:2021, limits = c(2010,2022), labels = as.character(c(2011:2021))) +
scale_y_continuous(breaks = c(-1, -0.75, -.5, -.25, 0, .25, .5, .75, 1), limits = c(-1,1)) +
labs(title = "Ethnic homogeneity", caption = "Note: 95% CI \n Source: CentERdata 2021",
y = "EI-index", x="period") +
scale_colour_hue(name="ethnicity ego", # Legend label, use darker colors
#breaks=c("1", "2"),
#labels=c("D", "W", "NW"),
l=40) + # Use darker colors, lightness=40
theme(axis.text.x = element_text(angle=45),
legend.justification=c(1,0),
legend.position="right")
ggplotly(plot) %>%
layout(margin = list(b=100), annotations = list(x=2021, y = -1, showarrow = F, font = list(size=10), text="\n \n \n \n \n \n \n \n \n \n \n Note: 95% CI \n Source: CentERdata 2021"))
LS0tDQp0aXRsZTogIlNvY2lhbCBzZWdyZWdhdGlvbiBpbiBDb3JlIERpc2N1c3Npb24gTmV0d29ya3MiDQpiaWJsaW9ncmFwaHk6IHJlZmVyZW5jZXMuYmliDQotLS0NCg0KYGBge3IgZ2xvYmFsc2V0dGluZ3MsIGVjaG89RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQpsaWJyYXJ5KGtuaXRyKQ0Kb3B0c19jaHVuayRzZXQodGlkeS5vcHRzPWxpc3Qod2lkdGguY3V0b2ZmPTEwMCksdGlkeT1UUlVFLCB3YXJuaW5nID0gRkFMU0UsIG1lc3NhZ2UgPSBGQUxTRSxjb21tZW50ID0gIiM+IiwgY2FjaGU9VFJVRSwgZWNobz1UUlVFLCBjbGFzcy5zb3VyY2U9YygidGVzdCIpLCBjbGFzcy5vdXRwdXQ9YygidGVzdDIiKSkNCm9wdGlvbnMod2lkdGggPSAxMDApDQpyZ2w6OnNldHVwS25pdHIoKQ0KYGBgDQoNCmBgYHtyIGNvbG9yaXplLCBlY2hvPUZBTFNFfQ0KY29sb3JpemUgPC0gZnVuY3Rpb24oeCwgY29sb3IpIHsNCiAgaWYgKGtuaXRyOjppc19sYXRleF9vdXRwdXQoKSkgew0KICAgIHNwcmludGYoIlxcdGV4dGNvbG9yeyVzfXslc30iLCBjb2xvciwgeCkNCiAgfSBlbHNlIGlmIChrbml0cjo6aXNfaHRtbF9vdXRwdXQoKSkgew0KICAgIHNwcmludGYoIjxzcGFuIHN0eWxlPSdjb2xvcjogJXM7Jz4lczwvc3Bhbj4iLCBjb2xvciwgDQogICAgICAgICAgICB4KQ0KICB9IGVsc2UgeA0KfQ0KDQpgYGANCg0KYGBge2NzcyBzdHlsZSBzZXR0aW5ncywgZWNobyA9IEZBTFNFfQ0KYmxvY2txdW90ZSB7DQogICAgcGFkZGluZzogMTBweCAyMHB4Ow0KICAgIG1hcmdpbjogMCAwIDIwcHg7DQogICAgZm9udC1zaXplOiAxNHB4Ow0KICAgIGJvcmRlci1sZWZ0OiA1cHggc29saWQgI2VlZTsNCiAgICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2IoMjU1LDI1NSwyMjQsMSk7DQp9DQoNCi50ZXN0IHsNCiAgbWF4LWhlaWdodDogMzAwcHg7DQogIG92ZXJmbG93LXk6IGF1dG87DQogIG92ZXJmbG93LXg6IGF1dG87DQogIG1hcmdpbjogMHB4Ow0KfQ0KDQoudGVzdDIgew0KICBtYXgtaGVpZ2h0OiAzMDBweDsNCiAgb3ZlcmZsb3cteTogYXV0bzsNCiAgb3ZlcmZsb3cteDogYXV0bzsNCiAgbWFyZ2luOiAwcHg7DQogIGJhY2tncm91bmQtY29sb3I6IHdoaXRlOw0KICBjb2xvcjogcmdiKDIwMSwgNzYsIDc2KTsNCn0NCg0KDQpoMSwgLmgxLCBoMiwgLmgyLCBoMywgLmgzIHsNCiAgbWFyZ2luLXRvcDogMjRweDsNCn0NCg0KDQpgYGANCg0KYGBge3Iga2xpcHB5LCBlY2hvPUZBTFNFLCBpbmNsdWRlPVRSVUV9DQprbGlwcHk6OmtsaXBweShwb3NpdGlvbiA9IGMoJ3RvcCcsICdyaWdodCcpKQ0KI2tsaXBweTo6a2xpcHB5KGNvbG9yID0gJ2RhcmtyZWQnKQ0KI2tsaXBweTo6a2xpcHB5KHRvb2x0aXBfbWVzc2FnZSA9ICdDbGljayB0byBjb3B5JywgdG9vbHRpcF9zdWNjZXNzID0gJ0RvbmUnKQ0KYGBgDQoNCg0KLS0tDQoNCg0KIyBDdXN0b20gZnVuY3Rpb25zDQoNCi0gYHBhY2FnZS5jaGVja2A6IENoZWNrIGlmIHBhY2thZ2VzIGFyZSBpbnN0YWxsZWQgKGFuZCBpbnN0YWxsIGlmIG5vdCkgaW4gUiAoW3NvdXJjZV0oaHR0cHM6Ly92YmFsaWdhLmdpdGh1Yi5pby92ZXJpZnktdGhhdC1yLXBhY2thZ2VzLWFyZS1pbnN0YWxsZWQtYW5kLWxvYWRlZC8pKS4gDQoNCg0KDQpgYGB7ciwgcmVzdWx0cz0naGlkZSd9DQpmcGFja2FnZS5jaGVjayA8LSBmdW5jdGlvbihwYWNrYWdlcykgew0KICBsYXBwbHkocGFja2FnZXMsIEZVTiA9IGZ1bmN0aW9uKHgpIHsNCiAgICBpZiAoIXJlcXVpcmUoeCwgY2hhcmFjdGVyLm9ubHkgPSBUUlVFKSkgew0KICAgICAgaW5zdGFsbC5wYWNrYWdlcyh4LCBkZXBlbmRlbmNpZXMgPSBUUlVFKQ0KICAgICAgbGlicmFyeSh4LCBjaGFyYWN0ZXIub25seSA9IFRSVUUpDQogICAgfQ0KICB9KQ0KfQ0KDQoNCmBgYA0KDQotLS0gIA0KDQojIFBhY2thZ2VzDQoNCg0KLSBgdGlkeXZlcnNlYDogaWYgeW91IGNhbid0IGJhc2UgdGhlbSwgam9pbiB0aGVtICANCi0gYGhhdmVuYDogYmVjYXVzZSB3ZSBoYXZlIGhhdmVuIGxhYmVsbGVkIHZhcnMgaW4gdGhlIGRhdGFzZXQuICANCi0gYEhtaXNjYDogZm9yIHdlaWdodGVkIG1lYW4vc2QgIA0KLSBgcGxvdGx5YDogZm9yIGludGVyYWN0aXZlIHBsb3RzDQoNCg0KDQpgYGB7ciwgcmVzdWx0cz0naGlkZSd9DQpwYWNrYWdlcyA9IGMoInRpZHl2ZXJzZSIsICJoYXZlbiIsICJIbWlzYyIsICJwbG90bHkiKQ0KDQpmcGFja2FnZS5jaGVjayhwYWNrYWdlcykNCg0KYGBgDQoNCi0tLSANCg0KIyBEYXRhc2V0DQoNCmBgYHtyfQ0KbG9hZChmaWxlPSIuL2RhdGEvZGF0YWp0LnJkYSIpDQpsb2FkKGZpbGU9Ii4vZGF0YS9kYXRhanRfbmsucmRhIikNCmBgYA0KDQotLS0gIA0KDQojIEVkdWNhdGlvbiB7LnRhYnNldCAudGFic2V0LWZhZGV9DQoNCmBgYHtyLCBlY2hvPVRSVUV9DQpkYXRhanQgJT4lIA0KICBmaWx0ZXIobGVlZnRpamQ+MjQgJiAhaXMubmEob3BsNCkpICU+JQ0KICBncm91cF9ieShzdXJ2ZXlfd2F2ZSwgb3BsNCkgJT4lDQogIHN1bW1hcmlzZShOID0gbigpLA0KICAgICAgICAgICAgY2RuX2VkdWNfRUlNID0gbWVhbihlZHVjX0VJLCBuYS5ybT1UKSwNCiAgICAgICAgICAgIHNkID0gc2QoZWR1Y19FSSwgbmEucm09VCksDQogICAgICAgICAgICBjZG5fZWR1Y19FSU1fdyA9IHd0ZC5tZWFuKGVkdWNfRUksIGNkbl9zaXplLCBub3Jtd3QgPSBGQUxTRSwgbmEucm0gPSBUUlVFKSwgI3BlcmhhcHMgYmV0dGVyIHRvIHNldCBub3Jtd3QgdG8gVFJVRQ0KICAgICAgICAgICAgc2RfdyA9IHNxcnQod3RkLnZhcihlZHVjX0VJLCBjZG5fc2l6ZSwgbm9ybXd0ID0gRkFMU0UsIG5hLnJtID0gVFJVRSkpKSAlPiUNCiAgbXV0YXRlKA0KICAgIGNvbmYuaW50ZXJ2YWwgPSAuOTUsDQogICAgc2UgPSBzZCAvIHNxcnQoTikgLA0KICAgIGNpID0gc2UgKiBxdChjb25mLmludGVydmFsLzIgKyAuNSwgTi0xKSwNCiAgICBzZV93ID0gc2RfdyAvIHNxcnQoTikgLCAjaXMgdGhpcyBjb3JyZWN0Pz8NCiAgICBjaV93ID0gc2VfdyAqIHF0KGNvbmYuaW50ZXJ2YWwvMiArIC41LCBOLTEpKSAlPiUgICANCiAgbmEub21pdCgpIC0+IHRnYw0KDQoNCmRhdGFqdF9uayAlPiUgDQogIGZpbHRlcihsZWVmdGlqZD4yNCkgJT4lDQogIGdyb3VwX2J5KHN1cnZleV93YXZlLCBvcGw0KSAlPiUNCiAgc3VtbWFyaXNlKE4gPSBuKCksDQogICAgICAgICAgICBjZG5fZWR1Y19FSU0gPSBtZWFuKGVkdWNfRUksIG5hLnJtPVQpLA0KICAgICAgICAgICAgc2QgPSBzZChlZHVjX0VJLCBuYS5ybT1UKSkgJT4lDQogIG11dGF0ZSgNCiAgICBzZSA9IHNkIC8gc3FydChOKSAsDQogICAgY29uZi5pbnRlcnZhbCA9IC45NSwNCiAgICBjaSA9IHNlICogcXQoY29uZi5pbnRlcnZhbC8yICsgLjUsIE4tMSkpICU+JSANCiAgbmEub21pdCgpIC0+IHRnY19uaw0KDQoNCnRnYyRwZXJpb2QgPC0gYXMubnVtZXJpYyh0Z2Mkc3VydmV5X3dhdmUpICsgMjAwNw0KdGdjJGhvbW9nZW5laXR5IDwtIHJvdW5kKHRnYyRjZG5fZWR1Y19FSU0sIDIpDQp0Z2MkZWR1Y2F0aW9uIDwtIGFzLmZhY3Rvcih0Z2Mkb3BsNCkNCmxldmVscyh0Z2MkZWR1Y2F0aW9uKSA8LSBjKCJwcmltYXJ5ICsgdm1ibyIsICJoYXZvL3Z3by9tYm8iLCAiaGJvIiwgInVuaXZlcnNpdHkiKQ0KDQp0Z2NfbmskcGVyaW9kIDwtIGFzLm51bWVyaWModGdjX25rJHN1cnZleV93YXZlKSArIDIwMDcNCnRnY19uayRob21vZ2VuZWl0eSA8LSByb3VuZCh0Z2NfbmskY2RuX2VkdWNfRUlNLCAyKQ0KdGdjX25rJGVkdWNhdGlvbiA8LSBhcy5mYWN0b3IodGdjX25rJG9wbDQpDQpsZXZlbHModGdjX25rJGVkdWNhdGlvbikgPC0gYygicHJpbWFyeSArIHZtYm8iLCAiaGF2by92d28vbWJvIiwgImhibyIsICJ1bml2ZXJzaXR5IikNCg0KDQpkYXRhanQgJT4lIA0KICBmaWx0ZXIobGVlZnRpamQ+MjQgJiAhaXMubmEob3BsNCkpICU+JQ0KICBncm91cF9ieShzdXJ2ZXlfd2F2ZSwgb3BsNCkgJT4lDQogIHN1bW1hcmlzZShOID0gbigpLA0KICAgICAgICAgICAgY2RuX2VkdWNfc2ltID0gbWVhbihlZHVjX3NpbSwgbmEucm09VCksDQogICAgICAgICAgICBzZCA9IHNkKGVkdWNfRUksIG5hLnJtPVQpLA0KICAgICAgICAgICAgY2RuX2VkdWNfc2ltX3cgPSB3dGQubWVhbihlZHVjX3NpbSwgY2RuX3NpemVfZWR1Yywgbm9ybXd0ID0gRkFMU0UsIG5hLnJtID0gVFJVRSksICNwZXJoYXBzIGJldHRlciB0byBzZXQgbm9ybXd0IHRvIFRSVUUNCiAgICAgICAgICAgIHNkX3cgPSBzcXJ0KHd0ZC52YXIoZWR1Y19FSSwgY2RuX3NpemVfZWR1Yywgbm9ybXd0ID0gRkFMU0UsIG5hLnJtID0gVFJVRSkpKSAlPiUNCiAgbXV0YXRlKA0KICAgIGNvbmYuaW50ZXJ2YWwgPSAuOTUsDQogICAgc2UgPSBzZCAvIHNxcnQoTikgLA0KICAgIGNpID0gc2UgKiBxdChjb25mLmludGVydmFsLzIgKyAuNSwgTi0xKSwNCiAgICBzZV93ID0gc2RfdyAvIHNxcnQoTikgLCAjaXMgdGhpcyBjb3JyZWN0Pz8NCiAgICBjaV93ID0gc2VfdyAqIHF0KGNvbmYuaW50ZXJ2YWwvMiArIC41LCBOLTEpKSAlPiUgICANCiAgbmEub21pdCgpIC0+IHRnY19vcDINCg0KDQpkYXRhanRfbmsgJT4lIA0KICAgZmlsdGVyKGxlZWZ0aWpkPjI0ICYgIWlzLm5hKG9wbDQpKSAlPiUNCiAgZ3JvdXBfYnkoc3VydmV5X3dhdmUsIG9wbDQpICU+JQ0KICBzdW1tYXJpc2UoTiA9IG4oKSwNCiAgICAgICAgICAgIGNkbl9lZHVjX3NpbSA9IG1lYW4oZWR1Y19zaW0sIG5hLnJtPVQpLA0KICAgICAgICAgICAgc2QgPSBzZChlZHVjX0VJLCBuYS5ybT1UKSwNCiAgICAgICAgICAgIGNkbl9lZHVjX3NpbV93ID0gd3RkLm1lYW4oZWR1Y19zaW0sIGNkbl9zaXplX2VkdWMsIG5vcm13dCA9IEZBTFNFLCBuYS5ybSA9IFRSVUUpLCAjcGVyaGFwcyBiZXR0ZXIgdG8gc2V0IG5vcm13dCB0byBUUlVFDQogICAgICAgICAgICBzZF93ID0gc3FydCh3dGQudmFyKGVkdWNfRUksIGNkbl9zaXplX2VkdWMsIG5vcm13dCA9IEZBTFNFLCBuYS5ybSA9IFRSVUUpKSkgJT4lDQogIG11dGF0ZSgNCiAgICBjb25mLmludGVydmFsID0gLjk1LA0KICAgIHNlID0gc2QgLyBzcXJ0KE4pICwNCiAgICBjaSA9IHNlICogcXQoY29uZi5pbnRlcnZhbC8yICsgLjUsIE4tMSksDQogICAgc2VfdyA9IHNkX3cgLyBzcXJ0KE4pICwgI2lzIHRoaXMgY29ycmVjdD8/DQogICAgY2lfdyA9IHNlX3cgKiBxdChjb25mLmludGVydmFsLzIgKyAuNSwgTi0xKSkgJT4lICAgDQogIG5hLm9taXQoKSAtPiB0Z2Nfbmtfb3AyDQoNCg0KdGdjJHBlcmlvZCA8LSBhcy5udW1lcmljKHRnYyRzdXJ2ZXlfd2F2ZSkgKyAyMDA3DQp0Z2MkaG9tb2dlbmVpdHkgPC0gcm91bmQodGdjJGNkbl9lZHVjX0VJTSwgMikNCnRnYyRlZHVjYXRpb24gPC0gYXMuZmFjdG9yKHRnYyRvcGw0KQ0KbGV2ZWxzKHRnYyRlZHVjYXRpb24pIDwtIGMoInByaW1hcnkgKyB2bWJvIiwgImhhdm8vdndvL21ibyIsICJoYm8iLCAidW5pdmVyc2l0eSIpDQoNCnRnY19vcDIkcGVyaW9kIDwtIGFzLm51bWVyaWModGdjX29wMiRzdXJ2ZXlfd2F2ZSkgKyAyMDA3DQp0Z2Nfb3AyJGhvbW9nZW5laXR5IDwtIHJvdW5kKHRnY19vcDIkY2RuX2VkdWNfc2ltLCAyKQ0KdGdjX29wMiRlZHVjYXRpb24gPC0gYXMuZmFjdG9yKHRnY19vcDIkb3BsNCkNCmxldmVscyh0Z2Nfb3AyJGVkdWNhdGlvbikgPC0gYygicHJpbWFyeSArIHZtYm8iLCAiaGF2by92d28vbWJvIiwgImhibyIsICJ1bml2ZXJzaXR5IikNCg0KdGdjX25rJHBlcmlvZCA8LSBhcy5udW1lcmljKHRnY19uayRzdXJ2ZXlfd2F2ZSkgKyAyMDA3DQp0Z2NfbmskaG9tb2dlbmVpdHkgPC0gcm91bmQodGdjX25rJGNkbl9lZHVjX0VJTSwgMikNCnRnY19uayRlZHVjYXRpb24gPC0gYXMuZmFjdG9yKHRnY19uayRvcGw0KQ0KbGV2ZWxzKHRnY19uayRlZHVjYXRpb24pIDwtIGMoInByaW1hcnkgKyB2bWJvIiwgImhhdm8vdndvL21ibyIsICJoYm8iLCAidW5pdmVyc2l0eSIpDQoNCnRnY19ua19vcDIkcGVyaW9kIDwtIGFzLm51bWVyaWModGdjX25rX29wMiRzdXJ2ZXlfd2F2ZSkgKyAyMDA3DQp0Z2Nfbmtfb3AyJGhvbW9nZW5laXR5IDwtIHJvdW5kKHRnY19ua19vcDIkY2RuX2VkdWNfc2ltLCAyKQ0KdGdjX25rX29wMiRlZHVjYXRpb24gPC0gYXMuZmFjdG9yKHRnY19ua19vcDIkb3BsNCkNCmxldmVscyh0Z2Nfbmtfb3AyJGVkdWNhdGlvbikgPC0gYygicHJpbWFyeSArIHZtYm8iLCAiaGF2by92d28vbWJvIiwgImhibyIsICJ1bml2ZXJzaXR5IikNCg0KDQoNCmBgYCANCg0KIyMgYWxsDQoNCg0KYGBge3J9DQoNCnBsb3QgPC0gZ2dwbG90KHRnYywgYWVzKHg9cGVyaW9kLCB5PWhvbW9nZW5laXR5LCBjb2xvdXI9ZWR1Y2F0aW9uKSkgKyANCiAgZ2VvbV9saW5lKHBvc2l0aW9uPXBvc2l0aW9uX2RvZGdlKDAuMSkpICsNCiAgZ2VvbV9lcnJvcmJhcihhZXMoeW1pbj1ob21vZ2VuZWl0eS1jaSwgeW1heD1ob21vZ2VuZWl0eStjaSksIHdpZHRoPS42LCBwb3NpdGlvbj1wb3NpdGlvbl9kb2RnZSgwLjEpKSArDQogIGdlb21fcG9pbnQocG9zaXRpb249cG9zaXRpb25fZG9kZ2UoMC4xKSkgKyANCiAgc2NhbGVfeF9jb250aW51b3VzKGJyZWFrcyA9IDIwMDg6MjAyMSwgbGltaXRzID0gYygyMDA3LCAyMDIyKSwgbGFiZWxzID0gYXMuY2hhcmFjdGVyKGMoMjAwODoyMDIxKSkpICsNCiAgc2NhbGVfeV9jb250aW51b3VzKGJyZWFrcyA9IGMoLTEsIC0wLjc1LCAtLjUsIC0uMjUsIDAsIC4yNSwgLjUsIC43NSwgMSksIGxpbWl0cyA9IGMoLTEsMSkpICsgDQogIGxhYnModGl0bGUgPSAiRWR1Y2F0aW9uYWwgaG9tb2dlbmVpdHkgaW4gQ0ROIiwgY2FwdGlvbiA9ICJOb3RlOiA5NSUgQ0kgXG4gU291cmNlOiBDZW50RVJkYXRhIDIwMjEiLCANCiAgICAgICB5ID0gIkVJLWluZGV4IiwgeD0icGVyaW9kIikgKyANCiAgc2NhbGVfY29sb3VyX2h1ZShuYW1lPSJlZHVjYXRpb24gZWdvIiwgICAgIyBMZWdlbmQgbGFiZWwsIHVzZSBkYXJrZXIgY29sb3JzDQogICAgICAgICAgICAgICAgICAgI2JyZWFrcz1jKCIxIiwgIjIiLCAiMyIsICI0IiksDQogICAgICAgICAgICAgICAgICAgI2xhYmVscz1jKCJwcmltYXJ5ICsgdm1ibyIsICJoYXZvL3Z3by9tYm8iLCAiaGJvIiwgInVuaXZlcnNpdHkiKSwNCiAgICAgICAgICAgICAgICAgICBsPTQwKSAgICAgICArICAgICAgICAgICAgICAjIFVzZSBkYXJrZXIgY29sb3JzLCBsaWdodG5lc3M9NDANCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGU9NDUpLA0KICAgICAgICBsZWdlbmQuanVzdGlmaWNhdGlvbj1jKDEsMCksDQogICAgICAgIGxlZ2VuZC5wb3NpdGlvbj0icmlnaHQiKSAgDQoNCg0KDQojcGxvdA0KZ2dwbG90bHkocGxvdCkgJT4lDQogIGxheW91dChtYXJnaW4gPSBsaXN0KGI9MTAwKSwgYW5ub3RhdGlvbnMgPSBsaXN0KHg9MjAyMSwgeSA9IC0xLjEsIHNob3dhcnJvdyA9IEYsIGZvbnQgPSBsaXN0KHNpemU9MTApLCB0ZXh0PSJcbiBcbiAgXG4gIFxuIFxuIFxuIFxuIFxuIFxuIE5vdGU6IDk1JSBDSSBcbiBTb3VyY2U6IENlbnRFUmRhdGEgMjAyMSIpKQ0KDQoNCg0KYGBgDQo8YnI+IA0KDQpTaWduaWZpY2FuY2Ugb2YgdHJlbmQ6IA0KDQotIG5lZ2F0aXZlIHRyZW5kIG9mICdwcmltYXJ5ICsgdm1ibycgYW5kICdoYXZvL3Z3by9tYm8nICANCi0gcG9zaXRpdmUgdHJlbmQgb2YgJ3VuaXZlcnNpdHknIA0KDQoNCmBgYHtyfQ0KZGF0YWp0ICU+JSANCiAgZmlsdGVyKGxlZWZ0aWpkPjI0ICYgIWlzLm5hKG9wbDQpKSAlPiUNCiAgd2l0aChsbShlZHVjX0VJIH4gYXMuZmFjdG9yKG9wbDQpICsgYXMubnVtZXJpYyhzdXJ2ZXlfd2F2ZSk6YXMuZmFjdG9yKG9wbDQpICkpICU+JSANCiAgc3VtbWFyeSgpDQoNCmBgYA0KDQotLS0gDQoNCiMjIG5vIGtpbiANCg0KDQpgYGB7cn0NCg0KcGxvdCA8LSBnZ3Bsb3QodGdjX25rLCBhZXMoeD1wZXJpb2QsIHk9aG9tb2dlbmVpdHksIGNvbG91cj1lZHVjYXRpb24pKSArIA0KICBnZW9tX2xpbmUocG9zaXRpb249cG9zaXRpb25fZG9kZ2UoMC4xKSkgKw0KICBnZW9tX2Vycm9yYmFyKGFlcyh5bWluPWhvbW9nZW5laXR5LWNpLCB5bWF4PWhvbW9nZW5laXR5K2NpKSwgd2lkdGg9LjYsIHBvc2l0aW9uPXBvc2l0aW9uX2RvZGdlKDAuMSkpICsNCiAgZ2VvbV9wb2ludChwb3NpdGlvbj1wb3NpdGlvbl9kb2RnZSgwLjEpKSArIA0KICBzY2FsZV94X2NvbnRpbnVvdXMoYnJlYWtzID0gMjAwODoyMDIxLCBsaW1pdHMgPSBjKDIwMDcsIDIwMjIpLCBsYWJlbHMgPSBhcy5jaGFyYWN0ZXIoYygyMDA4OjIwMjEpKSkgKw0KICBzY2FsZV95X2NvbnRpbnVvdXMoYnJlYWtzID0gYygtMSwgLTAuNzUsIC0uNSwgLS4yNSwgMCwgLjI1LCAuNSwgLjc1LCAxKSwgbGltaXRzID0gYygtMSwxKSkgKyANCiAgbGFicyh0aXRsZSA9ICJFZHVjYXRpb25hbCBob21vZ2VuZWl0eSBpbiBDRE4iLCBjYXB0aW9uID0gIk5vdGU6IDk1JSBDSSBcbiBTb3VyY2U6IENlbnRFUmRhdGEgMjAyMSIsIA0KICAgICAgIHkgPSAiRUktaW5kZXgiLCB4PSJwZXJpb2QiKSArIA0KICBzY2FsZV9jb2xvdXJfaHVlKG5hbWU9ImVkdWNhdGlvbiBlZ28iLCAgICAjIExlZ2VuZCBsYWJlbCwgdXNlIGRhcmtlciBjb2xvcnMNCiAgICAgICAgICAgICAgICAgICAjYnJlYWtzPWMoIjEiLCAiMiIsICIzIiwgIjQiKSwNCiAgICAgICAgICAgICAgICAgICAjbGFiZWxzPWMoInByaW1hcnkgKyB2bWJvIiwgImhhdm8vdndvL21ibyIsICJoYm8iLCAidW5pdmVyc2l0eSIpLA0KICAgICAgICAgICAgICAgICAgIGw9NDApICAgICAgICsgICAgICAgICAgICAgICMgVXNlIGRhcmtlciBjb2xvcnMsIGxpZ2h0bmVzcz00MA0KICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZT00NSksDQogICAgICAgIGxlZ2VuZC5qdXN0aWZpY2F0aW9uPWMoMSwwKSwNCiAgICAgICAgbGVnZW5kLnBvc2l0aW9uPSJyaWdodCIpICANCg0KDQojcGxvdA0KI3Bsb3QNCmdncGxvdGx5KHBsb3QpICU+JQ0KICBsYXlvdXQobWFyZ2luID0gbGlzdChiPTEwMCksIGFubm90YXRpb25zID0gbGlzdCh4PTIwMjEsIHkgPSAtMS4xLCBzaG93YXJyb3cgPSBGLCBmb250ID0gbGlzdChzaXplPTEwKSwgdGV4dD0iXG4gXG4gIFxuICBcbiAgXG4gXG4gXG4gXG4gXG4gTm90ZTogOTUlIENJIFxuIFNvdXJjZTogQ2VudEVSZGF0YSAyMDIxIikpDQoNCg0KDQpgYGANCg0KLS0tICANCg0KDQojIyBhbGwgKHNpbWlsYXJpdHkpDQoNCg0KYGBge3J9DQojaGlzdChkYXRhanQkZWR1Y19zaW0pDQoNCg0KcGxvdCA8LSBnZ3Bsb3QodGdjX29wMiwgYWVzKHg9cGVyaW9kLCB5PWhvbW9nZW5laXR5LCBjb2xvdXI9ZWR1Y2F0aW9uKSkgKyANCiAgZ2VvbV9saW5lKHBvc2l0aW9uPXBvc2l0aW9uX2RvZGdlKDAuMSkpICsNCiAgZ2VvbV9lcnJvcmJhcihhZXMoeW1pbj1ob21vZ2VuZWl0eS1jaSwgeW1heD1ob21vZ2VuZWl0eStjaSksIHdpZHRoPS42LCBwb3NpdGlvbj1wb3NpdGlvbl9kb2RnZSgwLjEpKSArDQogIGdlb21fcG9pbnQocG9zaXRpb249cG9zaXRpb25fZG9kZ2UoMC4xKSkgKyANCiAgc2NhbGVfeF9jb250aW51b3VzKGJyZWFrcyA9IDIwMDg6MjAyMSwgbGltaXRzID0gYygyMDA3LCAyMDIyKSwgbGFiZWxzID0gYXMuY2hhcmFjdGVyKGMoMjAwODoyMDIxKSkpICsNCiAgc2NhbGVfeV9jb250aW51b3VzKGJyZWFrcyA9IGMoLTEsIC0wLjc1LCAtLjUsIC0uMjUsIDAsIC4yNSwgLjUsIC43NSwgMSksIGxpbWl0cyA9IGMoLTEsMSkpICsgDQogIGxhYnModGl0bGUgPSAiRWR1Y2F0aW9uYWwgaG9tb2dlbmVpdHkgaW4gQ0ROIiwgY2FwdGlvbiA9ICJOb3RlOiA5NSUgQ0kgXG4gU291cmNlOiBDZW50RVJkYXRhIDIwMjEiLCANCiAgICAgICB5ID0gIlMtaW5kZXgiLCB4PSJwZXJpb2QiKSArIA0KICBzY2FsZV9jb2xvdXJfaHVlKG5hbWU9ImVkdWNhdGlvbiBlZ28iLCAgICAjIExlZ2VuZCBsYWJlbCwgdXNlIGRhcmtlciBjb2xvcnMNCiAgICAgICAgICAgICAgICAgICAjYnJlYWtzPWMoIjEiLCAiMiIsICIzIiwgIjQiKSwNCiAgICAgICAgICAgICAgICAgICAjbGFiZWxzPWMoInByaW1hcnkgKyB2bWJvIiwgImhhdm8vdndvL21ibyIsICJoYm8iLCAidW5pdmVyc2l0eSIpLA0KICAgICAgICAgICAgICAgICAgIGw9NDApICAgICAgICsgICAgICAgICAgICAgICMgVXNlIGRhcmtlciBjb2xvcnMsIGxpZ2h0bmVzcz00MA0KICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZT00NSksDQogICAgICAgIGxlZ2VuZC5qdXN0aWZpY2F0aW9uPWMoMSwwKSwNCiAgICAgICAgbGVnZW5kLnBvc2l0aW9uPSJyaWdodCIpICANCg0KDQoNCiNwbG90DQpnZ3Bsb3RseShwbG90KSAlPiUNCiAgbGF5b3V0KG1hcmdpbiA9IGxpc3QoYj0xMDApLCBhbm5vdGF0aW9ucyA9IGxpc3QoeD0yMDIxLCB5ID0gLTEuMSwgc2hvd2Fycm93ID0gRiwgZm9udCA9IGxpc3Qoc2l6ZT0xMCksIHRleHQ9IlxuIFxuICBcbiBcbiBcbiBcbiBcbiBcbiBcbiBOb3RlOiA5NSUgQ0kgXG4gU291cmNlOiBDZW50RVJkYXRhIDIwMjEiKSkNCg0KDQoNCmBgYA0KDQotLS0NCg0KIyMgbm8ga2luIChzaW1pbGFyaXR5KQ0KDQoNCmBgYHtyfQ0KDQoNCg0KcGxvdCA8LSBnZ3Bsb3QodGdjX25rX29wMiwgYWVzKHg9cGVyaW9kLCB5PWhvbW9nZW5laXR5LCBjb2xvdXI9ZWR1Y2F0aW9uKSkgKyANCiAgZ2VvbV9saW5lKHBvc2l0aW9uPXBvc2l0aW9uX2RvZGdlKDAuMSkpICsNCiAgZ2VvbV9lcnJvcmJhcihhZXMoeW1pbj1ob21vZ2VuZWl0eS1jaSwgeW1heD1ob21vZ2VuZWl0eStjaSksIHdpZHRoPS42LCBwb3NpdGlvbj1wb3NpdGlvbl9kb2RnZSgwLjEpKSArDQogIGdlb21fcG9pbnQocG9zaXRpb249cG9zaXRpb25fZG9kZ2UoMC4xKSkgKyANCiAgc2NhbGVfeF9jb250aW51b3VzKGJyZWFrcyA9IDIwMDg6MjAyMSwgbGltaXRzID0gYygyMDA3LCAyMDIyKSwgbGFiZWxzID0gYXMuY2hhcmFjdGVyKGMoMjAwODoyMDIxKSkpICsNCiAgc2NhbGVfeV9jb250aW51b3VzKGJyZWFrcyA9IGMoLTEsIC0wLjc1LCAtLjUsIC0uMjUsIDAsIC4yNSwgLjUsIC43NSwgMSksIGxpbWl0cyA9IGMoLTEsMSkpICsgDQogIGxhYnModGl0bGUgPSAiRWR1Y2F0aW9uYWwgaG9tb2dlbmVpdHkgaW4gQ0ROIiwgY2FwdGlvbiA9ICJOb3RlOiA5NSUgQ0kgXG4gU291cmNlOiBDZW50RVJkYXRhIDIwMjEiLCANCiAgICAgICB5ID0gIlMtaW5kZXgiLCB4PSJwZXJpb2QiKSArIA0KICBzY2FsZV9jb2xvdXJfaHVlKG5hbWU9ImVkdWNhdGlvbiBlZ28iLCAgICAjIExlZ2VuZCBsYWJlbCwgdXNlIGRhcmtlciBjb2xvcnMNCiAgICAgICAgICAgICAgICAgICAjYnJlYWtzPWMoIjEiLCAiMiIsICIzIiwgIjQiKSwNCiAgICAgICAgICAgICAgICAgICAjbGFiZWxzPWMoInByaW1hcnkgKyB2bWJvIiwgImhhdm8vdndvL21ibyIsICJoYm8iLCAidW5pdmVyc2l0eSIpLA0KICAgICAgICAgICAgICAgICAgIGw9NDApICAgICAgICsgICAgICAgICAgICAgICMgVXNlIGRhcmtlciBjb2xvcnMsIGxpZ2h0bmVzcz00MA0KICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZT00NSksDQogICAgICAgIGxlZ2VuZC5qdXN0aWZpY2F0aW9uPWMoMSwwKSwNCiAgICAgICAgbGVnZW5kLnBvc2l0aW9uPSJyaWdodCIpICANCg0KDQoNCiNwbG90DQpnZ3Bsb3RseShwbG90KSAlPiUNCiAgbGF5b3V0KG1hcmdpbiA9IGxpc3QoYj0xMDApLCBhbm5vdGF0aW9ucyA9IGxpc3QoeD0yMDIxLCB5ID0gLTEuMSwgc2hvd2Fycm93ID0gRiwgZm9udCA9IGxpc3Qoc2l6ZT0xMCksIHRleHQ9IlxuIFxuICBcbiAgXG4gXG4gXG4gXG4gXG4gXG4gTm90ZTogOTUlIENJIFxuIFNvdXJjZTogQ2VudEVSZGF0YSAyMDIxIikpDQoNCg0KDQpgYGANCg0KLS0tICANCg0KDQoNCiMgR2VuZGVyIHsudGFic2V0IC50YWJzZXQtZmFkZX0NCg0KDQpgYGB7ciwgZWNobz1UUlVFfQ0KZGF0YWp0ICU+JSANCiAgZmlsdGVyKGNkbl9zaXplPjAgJiAhaXMubmEoZ2VzbGFjaHQpKSAlPiUNCiAgZ3JvdXBfYnkoc3VydmV5X3dhdmUsIGdlc2xhY2h0KSAlPiUNCiAgc3VtbWFyaXNlKE4gPSBuKCksDQogICAgICAgICAgICBnZW5kZXJfRUlfbWVhbiA9IG1lYW4oZ2VuZGVyX0VJLCBuYS5ybT1UKSwNCiAgICAgICAgICAgIHNkID0gc2QoZ2VuZGVyX0VJLCBuYS5ybT1UKSkgJT4lDQogIG11dGF0ZSgNCiAgICBzZSA9IHNkIC8gc3FydChOKSAsDQogICAgY29uZi5pbnRlcnZhbCA9IC45NSwNCiAgICBjaSA9IHNlICogcXQoY29uZi5pbnRlcnZhbC8yICsgLjUsIE4tMSkpIC0+IHRnYw0KDQp0Z2MkcGVyaW9kIDwtIGFzLm51bWVyaWModGdjJHN1cnZleV93YXZlKSArIDIwMDcNCnRnYyRob21vZ2VuZWl0eSA8LSByb3VuZCh0Z2MkZ2VuZGVyX0VJX21lYW4sIDIpDQp0Z2MkZ2VuZGVyIDwtIGFzLmZhY3Rvcih0Z2MkZ2VzbGFjaHQpDQpsZXZlbHModGdjJGdlbmRlcikgPC0gYygibWFsZSIsICJmZW1hbGUiKQ0KDQpkYXRhanRfbmsgJT4lIA0KICBmaWx0ZXIoY2RuX3NpemU+MCAmICFpcy5uYShnZXNsYWNodCkpICU+JQ0KICBncm91cF9ieShzdXJ2ZXlfd2F2ZSwgZ2VzbGFjaHQpICU+JQ0KICBzdW1tYXJpc2UoTiA9IG4oKSwNCiAgICAgICAgICAgIGdlbmRlcl9FSV9tZWFuID0gbWVhbihnZW5kZXJfRUksIG5hLnJtPVQpLA0KICAgICAgICAgICAgc2QgPSBzZChnZW5kZXJfRUksIG5hLnJtPVQpKSAlPiUNCiAgbXV0YXRlKA0KICAgIHNlID0gc2QgLyBzcXJ0KE4pICwNCiAgICBjb25mLmludGVydmFsID0gLjk1LA0KICAgIGNpID0gc2UgKiBxdChjb25mLmludGVydmFsLzIgKyAuNSwgTi0xKSkgLT4gdGdjX25rDQoNCnRnY19uayRwZXJpb2QgPC0gYXMubnVtZXJpYyh0Z2Nfbmskc3VydmV5X3dhdmUpICsgMjAwNw0KdGdjX25rJGhvbW9nZW5laXR5IDwtIHJvdW5kKHRnY19uayRnZW5kZXJfRUlfbWVhbiwgMikNCnRnY19uayRnZW5kZXIgPC0gYXMuZmFjdG9yKHRnY19uayRnZXNsYWNodCkNCmxldmVscyh0Z2NfbmskZ2VuZGVyKSA8LSBjKCJtYWxlIiwgImZlbWFsZSIpDQoNCg0KDQpgYGANCg0KDQojIyBhbGwNCmBgYHtyfQ0KDQpwbG90IDwtIGdncGxvdCh0Z2MsIGFlcyh4PXBlcmlvZCwgeT1ob21vZ2VuZWl0eSwgY29sb3VyPWdlbmRlcikpICsgDQogIGdlb21fbGluZShwb3NpdGlvbj1wb3NpdGlvbl9kb2RnZSgwLjEpKSArDQogIGdlb21fZXJyb3JiYXIoYWVzKHltaW49aG9tb2dlbmVpdHktY2ksIHltYXg9aG9tb2dlbmVpdHkrY2kpLCB3aWR0aD0uNiwgcG9zaXRpb249cG9zaXRpb25fZG9kZ2UoMC4xKSkgKw0KICBnZW9tX3BvaW50KHBvc2l0aW9uPXBvc2l0aW9uX2RvZGdlKDAuMSkpICsgDQogIHNjYWxlX3hfY29udGludW91cyhicmVha3MgPSAyMDA4OjIwMjEsIGxpbWl0cyA9IGMoMjAwNywyMDIyKSwgbGFiZWxzID0gYXMuY2hhcmFjdGVyKGMoMjAwODoyMDIxKSkpICsNCiAgc2NhbGVfeV9jb250aW51b3VzKGJyZWFrcyA9IGMoLTEsIC0wLjc1LCAtLjUsIC0uMjUsIDAsIC4yNSwgLjUsIC43NSwgMSksIGxpbWl0cyA9IGMoLTEsMSkpICsgDQogIGxhYnModGl0bGUgPSAiR2VuZGVyIGhvbW9nZW5laXR5IGluIENETiIsIGNhcHRpb24gPSAiTm90ZTogOTUlIENJIFxuIFNvdXJjZTogQ2VudEVSZGF0YSAyMDIxIiwgDQogICAgICAgeSA9ICJFSS1pbmRleCIsIHg9InBlcmlvZCIpICsgDQogIHNjYWxlX2NvbG91cl9odWUobmFtZT0iZ2VuZGVyIGVnbyIsICAgICMgTGVnZW5kIGxhYmVsLCB1c2UgZGFya2VyIGNvbG9ycw0KICAgICAgICAgICAgICAgICAgICNicmVha3M9YygiMiIsICIxIiksDQogICAgICAgICAgICAgICAgICAgI2xhYmVscz1jKCJmZW1hbGUiLCAibWFsZSIpLA0KICAgICAgICAgICAgICAgICAgIGw9NDApICAgICAgICsgICAgICAgICAgICAgICMgVXNlIGRhcmtlciBjb2xvcnMsIGxpZ2h0bmVzcz00MA0KICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZT00NSksDQogICAgICAgIGxlZ2VuZC5qdXN0aWZpY2F0aW9uPWMoMSwwKSwNCiAgICAgICAgbGVnZW5kLnBvc2l0aW9uPSJyaWdodCIpICANCg0KZ2dwbG90bHkocGxvdCkgJT4lDQogIGxheW91dChtYXJnaW4gPSBsaXN0KGI9MTAwKSwgYW5ub3RhdGlvbnMgPSBsaXN0KHg9MjAyMSwgeSA9IC0xLCBzaG93YXJyb3cgPSBGLCBmb250ID0gbGlzdChzaXplPTEwKSwgdGV4dD0iXG4gXG4gXG4gXG4gXG4gIFxuICBcbiBcbiBcbiBcbiBcbiBOb3RlOiA5NSUgQ0kgXG4gU291cmNlOiBDZW50RVJkYXRhIDIwMjEiKSkNCg0KYGBgDQoNCi0tLSAgDQoNCg0KIyMgbm8ga2luDQpgYGB7cn0NCg0KcGxvdCA8LSBnZ3Bsb3QodGdjX25rLCBhZXMoeD1wZXJpb2QsIHk9aG9tb2dlbmVpdHksIGNvbG91cj1nZW5kZXIpKSArIA0KICBnZW9tX2xpbmUocG9zaXRpb249cG9zaXRpb25fZG9kZ2UoMC4xKSkgKw0KICBnZW9tX2Vycm9yYmFyKGFlcyh5bWluPWhvbW9nZW5laXR5LWNpLCB5bWF4PWhvbW9nZW5laXR5K2NpKSwgd2lkdGg9LjYsIHBvc2l0aW9uPXBvc2l0aW9uX2RvZGdlKDAuMSkpICsNCiAgZ2VvbV9wb2ludChwb3NpdGlvbj1wb3NpdGlvbl9kb2RnZSgwLjEpKSArIA0KICBzY2FsZV94X2NvbnRpbnVvdXMoYnJlYWtzID0gMjAwODoyMDIxLCBsaW1pdHMgPSBjKDIwMDcsMjAyMiksIGxhYmVscyA9IGFzLmNoYXJhY3RlcihjKDIwMDg6MjAyMSkpKSArDQogIHNjYWxlX3lfY29udGludW91cyhicmVha3MgPSBjKC0xLCAtMC43NSwgLS41LCAtLjI1LCAwLCAuMjUsIC41LCAuNzUsIDEpLCBsaW1pdHMgPSBjKC0xLDEpKSArIA0KICBsYWJzKHRpdGxlID0gIkdlbmRlciBob21vZ2VuZWl0eSBpbiBDRE4iLCBjYXB0aW9uID0gIk5vdGU6IDk1JSBDSSBcbiBTb3VyY2U6IENlbnRFUmRhdGEgMjAyMSIsIA0KICAgICAgIHkgPSAiRUktaW5kZXgiLCB4PSJwZXJpb2QiKSArIA0KICBzY2FsZV9jb2xvdXJfaHVlKG5hbWU9ImdlbmRlciBlZ28iLCAgICAjIExlZ2VuZCBsYWJlbCwgdXNlIGRhcmtlciBjb2xvcnMNCiAgICAgICAgICAgICAgICAgICAjYnJlYWtzPWMoIjIiLCAiMSIpLA0KICAgICAgICAgICAgICAgICAgICNsYWJlbHM9YygiZmVtYWxlIiwgIm1hbGUiKSwNCiAgICAgICAgICAgICAgICAgICBsPTQwKSAgICAgICArICAgICAgICAgICAgICAjIFVzZSBkYXJrZXIgY29sb3JzLCBsaWdodG5lc3M9NDANCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGU9NDUpLA0KICAgICAgICBsZWdlbmQuanVzdGlmaWNhdGlvbj1jKDEsMCksDQogICAgICAgIGxlZ2VuZC5wb3NpdGlvbj0icmlnaHQiKSAgDQoNCmdncGxvdGx5KHBsb3QpICU+JQ0KICBsYXlvdXQobWFyZ2luID0gbGlzdChiPTEwMCksIGFubm90YXRpb25zID0gbGlzdCh4PTIwMjEsIHkgPSAtMSwgc2hvd2Fycm93ID0gRiwgZm9udCA9IGxpc3Qoc2l6ZT0xMCksIHRleHQ9IlxuIFxuIFxuIFxuICBcbiBcbiBcbiBcbiBcbiBcbiBcbiBOb3RlOiA5NSUgQ0kgXG4gU291cmNlOiBDZW50RVJkYXRhIDIwMjEiKSkNCg0KYGBgDQo8YnI+DQoNCi0tLSAgIA0KDQoNCg0KIyBBZ2Ugey50YWJzZXQgLnRhYnNldC1mYWRlfQ0KDQoNCmBgYHtyfQ0KDQpkYXRhanQgJT4lIA0KICBmaWx0ZXIoIWlzLm5hKGxlZWZ0aWpkKSAmIGxlZWZ0aWpkPjE1KSAlPiUNCiAgZ3JvdXBfYnkoc3VydmV5X3dhdmUsIGxlZWZ0aWpkX2NhdDEzKSAlPiUNCiAgc3VtbWFyaXNlKE4gPSBuKCksDQogICAgICAgICAgICBjZG5fbGVlZnRpamRfRUlNID0gbWVhbihsZWVmdGlqZF9FSSwgbmEucm09VCksDQogICAgICAgICAgICBzZCA9IHNkKGxlZWZ0aWpkX0VJLCBuYS5ybT1UKSwNCiAgICAgICAgICAgIGNkbl9sZWVmdGlqZF9FSU1fdyA9IHd0ZC5tZWFuKGxlZWZ0aWpkX0VJLCBjZG5fc2l6ZV9hZ2UsIG5vcm13dCA9IEZBTFNFLCBuYS5ybSA9IFRSVUUpLCAjcGVyaGFwcyBiZXR0ZXIgdG8gc2V0IG5vcm13dCB0byBUUlVFDQogICAgICAgICAgICBzZF93ID0gc3FydCh3dGQudmFyKGxlZWZ0aWpkX0VJLCBjZG5fc2l6ZV9hZ2UsIG5vcm13dCA9IEZBTFNFLCBuYS5ybSA9IFRSVUUpKSkgJT4lDQogIG11dGF0ZSgNCiAgICBjb25mLmludGVydmFsID0gLjk1LA0KICAgIHNlID0gc2QgLyBzcXJ0KE4pICwNCiAgICBjaSA9IHNlICogcXQoY29uZi5pbnRlcnZhbC8yICsgLjUsIE4tMSksDQogICAgc2VfdyA9IHNkX3cgLyBzcXJ0KE4pICwgI2lzIHRoaXMgY29ycmVjdD8/DQogICAgY2lfdyA9IHNlX3cgKiBxdChjb25mLmludGVydmFsLzIgKyAuNSwgTi0xKSkgJT4lICAgDQogIG5hLm9taXQoKSAtPiB0Z2MNCg0KDQoNCmRhdGFqdF9uayAlPiUgDQogIGZpbHRlcighaXMubmEobGVlZnRpamQpICYgbGVlZnRpamQ+MTUpICU+JQ0KICBncm91cF9ieShzdXJ2ZXlfd2F2ZSwgbGVlZnRpamRfY2F0MTMpICU+JQ0KICBzdW1tYXJpc2UoTiA9IG4oKSwNCiAgICAgICAgICAgIGNkbl9sZWVmdGlqZF9FSU0gPSBtZWFuKGxlZWZ0aWpkX0VJLCBuYS5ybT1UKSwNCiAgICAgICAgICAgIHNkID0gc2QobGVlZnRpamRfRUksIG5hLnJtPVQpLA0KICAgICAgICAgICAgY2RuX2xlZWZ0aWpkX0VJTV93ID0gd3RkLm1lYW4obGVlZnRpamRfRUksIGNkbl9zaXplLCBub3Jtd3QgPSBGQUxTRSwgbmEucm0gPSBUUlVFKSwgI3BlcmhhcHMgYmV0dGVyIHRvIHNldCBub3Jtd3QgdG8gVFJVRQ0KICAgICAgICAgICAgc2RfdyA9IHNxcnQod3RkLnZhcihsZWVmdGlqZF9FSSwgY2RuX3NpemUsIG5vcm13dCA9IEZBTFNFLCBuYS5ybSA9IFRSVUUpKSkgJT4lDQogIG11dGF0ZSgNCiAgICBjb25mLmludGVydmFsID0gLjk1LA0KICAgIHNlID0gc2QgLyBzcXJ0KE4pICwNCiAgICBjaSA9IHNlICogcXQoY29uZi5pbnRlcnZhbC8yICsgLjUsIE4tMSksDQogICAgc2VfdyA9IHNkX3cgLyBzcXJ0KE4pICwgI2lzIHRoaXMgY29ycmVjdD8/DQogICAgY2lfdyA9IHNlX3cgKiBxdChjb25mLmludGVydmFsLzIgKyAuNSwgTi0xKSkgJT4lICAgDQogIG5hLm9taXQoKSAtPiB0Z2NfbmsNCg0KDQp0ZXN0IDwtIGN1dChhcy5udW1lcmljKGRhdGFqdCRsZWVmdGlqZCksYnJlYWtzID0gYygtSW5mLCAxNSwgMjAsIDI1LCAzMCwgMzUsIDQwLDQ1LDUwLDU1LDYwLDY1LDcwLCBJbmYpKQ0KI2xldmVscyh0ZXN0KQ0KDQoNCnRnYyRwZXJpb2QgPC0gYXMubnVtZXJpYyh0Z2Mkc3VydmV5X3dhdmUpICsgMjAwNw0KdGdjJGhvbW9nZW5laXR5IDwtIHJvdW5kKHRnYyRjZG5fbGVlZnRpamRfRUlNLCAyKQ0KdGdjJGFnZSA8LSBhcy5mYWN0b3IodGdjJGxlZWZ0aWpkX2NhdDEzKQ0KbGV2ZWxzKHRnYyRhZ2UpIDwtIGxldmVscyh0ZXN0KVstMV0NCg0KDQp0Z2NfbmskcGVyaW9kIDwtIGFzLm51bWVyaWModGdjX25rJHN1cnZleV93YXZlKSArIDIwMDcNCnRnY19uayRob21vZ2VuZWl0eSA8LSByb3VuZCh0Z2NfbmskY2RuX2xlZWZ0aWpkX0VJTSwgMikNCnRnY19uayRhZ2UgPC0gYXMuZmFjdG9yKHRnY19uayRsZWVmdGlqZF9jYXQxMykNCmxldmVscyh0Z2NfbmskYWdlKSA8LSBsZXZlbHModGVzdClbLTFdDQoNCmRhdGFqdCAlPiUgDQogIGZpbHRlcighaXMubmEobGVlZnRpamQpICYgbGVlZnRpamQ+MTUpICU+JQ0KICBncm91cF9ieShzdXJ2ZXlfd2F2ZSwgbGVlZnRpamRfY2F0MTMpICU+JQ0KICBzdW1tYXJpc2UoTiA9IG4oKSwNCiAgICAgICAgICAgIGNkbl9sZWVmdGlqZF9FSU0gPSBtZWFuKGxlZWZ0aWpkX3NpbSwgbmEucm09VCksDQogICAgICAgICAgICBzZCA9IHNkKGxlZWZ0aWpkX3NpbSwgbmEucm09VCksDQogICAgICAgICAgICBjZG5fbGVlZnRpamRfRUlNX3cgPSB3dGQubWVhbihsZWVmdGlqZF9zaW0sIGNkbl9zaXplX2FnZSwgbm9ybXd0ID0gRkFMU0UsIG5hLnJtID0gVFJVRSksICNwZXJoYXBzIGJldHRlciB0byBzZXQgbm9ybXd0IHRvIFRSVUUNCiAgICAgICAgICAgIHNkX3cgPSBzcXJ0KHd0ZC52YXIobGVlZnRpamRfc2ltLCBjZG5fc2l6ZV9hZ2UsIG5vcm13dCA9IEZBTFNFLCBuYS5ybSA9IFRSVUUpKSkgJT4lDQogIG11dGF0ZSgNCiAgICBjb25mLmludGVydmFsID0gLjk1LA0KICAgIHNlID0gc2QgLyBzcXJ0KE4pICwNCiAgICBjaSA9IHNlICogcXQoY29uZi5pbnRlcnZhbC8yICsgLjUsIE4tMSksDQogICAgc2VfdyA9IHNkX3cgLyBzcXJ0KE4pICwgI2lzIHRoaXMgY29ycmVjdD8/DQogICAgY2lfdyA9IHNlX3cgKiBxdChjb25mLmludGVydmFsLzIgKyAuNSwgTi0xKSkgJT4lICAgDQogIG5hLm9taXQoKSAtPiB0Z2Nfb3AyDQoNCg0KDQpkYXRhanRfbmsgJT4lIA0KICBmaWx0ZXIoIWlzLm5hKGxlZWZ0aWpkKSAmIGxlZWZ0aWpkPjE1KSAlPiUNCiAgZ3JvdXBfYnkoc3VydmV5X3dhdmUsIGxlZWZ0aWpkX2NhdDEzKSAlPiUNCiAgc3VtbWFyaXNlKE4gPSBuKCksDQogICAgICAgICAgICBjZG5fbGVlZnRpamRfRUlNID0gbWVhbihsZWVmdGlqZF9zaW0sIG5hLnJtPVQpLA0KICAgICAgICAgICAgc2QgPSBzZChsZWVmdGlqZF9zaW0sIG5hLnJtPVQpLA0KICAgICAgICAgICAgY2RuX2xlZWZ0aWpkX0VJTV93ID0gd3RkLm1lYW4obGVlZnRpamRfc2ltLCBjZG5fc2l6ZV9hZ2UsIG5vcm13dCA9IEZBTFNFLCBuYS5ybSA9IFRSVUUpLCAjcGVyaGFwcyBiZXR0ZXIgdG8gc2V0IG5vcm13dCB0byBUUlVFDQogICAgICAgICAgICBzZF93ID0gc3FydCh3dGQudmFyKGxlZWZ0aWpkX3NpbSwgY2RuX3NpemVfYWdlLCBub3Jtd3QgPSBGQUxTRSwgbmEucm0gPSBUUlVFKSkpICU+JQ0KICBtdXRhdGUoDQogICAgY29uZi5pbnRlcnZhbCA9IC45NSwNCiAgICBzZSA9IHNkIC8gc3FydChOKSAsDQogICAgY2kgPSBzZSAqIHF0KGNvbmYuaW50ZXJ2YWwvMiArIC41LCBOLTEpLA0KICAgIHNlX3cgPSBzZF93IC8gc3FydChOKSAsICNpcyB0aGlzIGNvcnJlY3Q/Pw0KICAgIGNpX3cgPSBzZV93ICogcXQoY29uZi5pbnRlcnZhbC8yICsgLjUsIE4tMSkpICU+JSAgIA0KICBuYS5vbWl0KCkgLT4gdGdjX25rX29wMg0KDQoNCnRlc3QgPC0gY3V0KGFzLm51bWVyaWMoZGF0YWp0JGxlZWZ0aWpkKSxicmVha3MgPSBjKC1JbmYsIDE1LCAyMCwgMjUsIDMwLCAzNSwgNDAsNDUsNTAsNTUsNjAsNjUsNzAsIEluZikpDQojbGV2ZWxzKHRlc3QpDQoNCg0KdGdjX29wMiRwZXJpb2QgPC0gYXMubnVtZXJpYyh0Z2Nfb3AyJHN1cnZleV93YXZlKSArIDIwMDcNCnRnY19vcDIkaG9tb2dlbmVpdHkgPC0gcm91bmQodGdjX29wMiRjZG5fbGVlZnRpamRfRUlNLCAyKQ0KdGdjX29wMiRhZ2UgPC0gYXMuZmFjdG9yKHRnY19vcDIkbGVlZnRpamRfY2F0MTMpDQpsZXZlbHModGdjX29wMiRhZ2UpIDwtIGxldmVscyh0ZXN0KVstMV0NCg0KDQp0Z2Nfbmtfb3AyJHBlcmlvZCA8LSBhcy5udW1lcmljKHRnY19ua19vcDIkc3VydmV5X3dhdmUpICsgMjAwNw0KdGdjX25rX29wMiRob21vZ2VuZWl0eSA8LSByb3VuZCh0Z2Nfbmtfb3AyJGNkbl9sZWVmdGlqZF9FSU0sIDIpDQp0Z2Nfbmtfb3AyJGFnZSA8LSBhcy5mYWN0b3IodGdjX25rX29wMiRsZWVmdGlqZF9jYXQxMykNCmxldmVscyh0Z2Nfbmtfb3AyJGFnZSkgPC0gbGV2ZWxzKHRlc3QpWy0xXQ0KDQoNCg0KDQoNCmBgYA0KDQojIyBhbGwNCmBgYHtyfQ0KDQoNCnBsb3QgPC0gZ2dwbG90KHRnYywgYWVzKHg9cGVyaW9kLCB5PWhvbW9nZW5laXR5LCBjb2xvdXI9YWdlKSkgKyANCiAgZ2VvbV9saW5lKHBvc2l0aW9uPXBvc2l0aW9uX2RvZGdlKDAuMSkpICsNCiAgZ2VvbV9lcnJvcmJhcihhZXMoeW1pbj1ob21vZ2VuZWl0eS1jaSwgeW1heD1ob21vZ2VuZWl0eStjaSksIHdpZHRoPS42LCBwb3NpdGlvbj1wb3NpdGlvbl9kb2RnZSgwLjEpKSArDQogIGdlb21fcG9pbnQocG9zaXRpb249cG9zaXRpb25fZG9kZ2UoMC4xKSkgKyANCiAgc2NhbGVfeF9jb250aW51b3VzKGJyZWFrcyA9IDIwMDg6MjAyMSwgbGltaXRzID0gYygyMDA3LDIwMjIpLCBsYWJlbHMgPSBhcy5jaGFyYWN0ZXIoYygyMDA4OjIwMjEpKSkgKw0KICBzY2FsZV95X2NvbnRpbnVvdXMoYnJlYWtzID0gYygtMSwgLTAuNzUsIC0uNSwgLS4yNSwgMCwgLjI1LCAuNSwgLjc1LCAxKSwgbGltaXRzID0gYygtMSwxKSkgKyANCiAgbGFicyh0aXRsZSA9ICJBZ2UgaG9tb2dlbmVpdHkiLCBjYXB0aW9uID0gIk5vdGU6IDk1JSBDSSBcbiBTb3VyY2U6IENlbnRFUmRhdGEgMjAyMSIsIA0KICAgICAgIHkgPSAiRUktaW5kZXgiLCB4PSJwZXJpb2QiKSArIA0KICBzY2FsZV9jb2xvdXJfaHVlKG5hbWU9ImFnZSBlZ28iLCAgICAjIExlZ2VuZCBsYWJlbCwgdXNlIGRhcmtlciBjb2xvcnMNCiAgICAgICAgICAgICAgICAgICAjYnJlYWtzPWMoIjEiLCAiMiIpLA0KICAgICAgICAgICAgICAgICAgICNsYWJlbHM9bGV2ZWxzKHRlc3QpLA0KICAgICAgICAgICAgICAgICAgIGw9NDApICAgICAgICsgICAgICAgICAgICAgICMgVXNlIGRhcmtlciBjb2xvcnMsIGxpZ2h0bmVzcz00MA0KICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZT00NSksDQogICAgICAgIGxlZ2VuZC5qdXN0aWZpY2F0aW9uPWMoMSwwKSwNCiAgICAgICAgbGVnZW5kLnBvc2l0aW9uPSJyaWdodCIpICANCg0KZ2dwbG90bHkocGxvdCkgJT4lDQogIGxheW91dChtYXJnaW4gPSBsaXN0KGI9MTAwKSwgYW5ub3RhdGlvbnMgPSBsaXN0KHg9MjAyMSwgeSA9IC0xLCBzaG93YXJyb3cgPSBGLCBmb250ID0gbGlzdChzaXplPTEwKSwgdGV4dD0iXG4gXG4gXG4gXG4gIFxuIFxuICBcbiBcbiBcbiBcbiBcbiBOb3RlOiA5NSUgQ0kgXG4gU291cmNlOiBDZW50RVJkYXRhIDIwMjEiKSkNCmBgYA0KPGJyPg0KDQotLS0gIA0KDQojIyBubyBraW4gDQoNCmBgYHtyfQ0KDQoNCnBsb3QgPC0gZ2dwbG90KHRnY19uaywgYWVzKHg9cGVyaW9kLCB5PWhvbW9nZW5laXR5LCBjb2xvdXI9YWdlKSkgKyANCiAgZ2VvbV9saW5lKHBvc2l0aW9uPXBvc2l0aW9uX2RvZGdlKDAuMSkpICsNCiAgZ2VvbV9lcnJvcmJhcihhZXMoeW1pbj1ob21vZ2VuZWl0eS1jaSwgeW1heD1ob21vZ2VuZWl0eStjaSksIHdpZHRoPS42LCBwb3NpdGlvbj1wb3NpdGlvbl9kb2RnZSgwLjEpKSArDQogIGdlb21fcG9pbnQocG9zaXRpb249cG9zaXRpb25fZG9kZ2UoMC4xKSkgKyANCiAgc2NhbGVfeF9jb250aW51b3VzKGJyZWFrcyA9IDIwMDg6MjAyMSwgbGltaXRzID0gYygyMDA3LDIwMjIpLCBsYWJlbHMgPSBhcy5jaGFyYWN0ZXIoYygyMDA4OjIwMjEpKSkgKw0KICBzY2FsZV95X2NvbnRpbnVvdXMoYnJlYWtzID0gYygtMSwgLTAuNzUsIC0uNSwgLS4yNSwgMCwgLjI1LCAuNSwgLjc1LCAxKSwgbGltaXRzID0gYygtMSwxKSkgKyANCiAgbGFicyh0aXRsZSA9ICJBZ2UgaG9tb2dlbmVpdHkiLCBjYXB0aW9uID0gIk5vdGU6IDk1JSBDSSBcbiBTb3VyY2U6IENlbnRFUmRhdGEgMjAyMSIsIA0KICAgICAgIHkgPSAiRUktaW5kZXgiLCB4PSJwZXJpb2QiKSArIA0KICBzY2FsZV9jb2xvdXJfaHVlKG5hbWU9ImFnZSBlZ28iLCAgICAjIExlZ2VuZCBsYWJlbCwgdXNlIGRhcmtlciBjb2xvcnMNCiAgICAgICAgICAgICAgICAgICAjYnJlYWtzPWMoIjEiLCAiMiIpLA0KICAgICAgICAgICAgICAgICAgICNsYWJlbHM9bGV2ZWxzKHRlc3QpLA0KICAgICAgICAgICAgICAgICAgIGw9NDApICAgICAgICsgICAgICAgICAgICAgICMgVXNlIGRhcmtlciBjb2xvcnMsIGxpZ2h0bmVzcz00MA0KICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZT00NSksDQogICAgICAgIGxlZ2VuZC5qdXN0aWZpY2F0aW9uPWMoMSwwKSwNCiAgICAgICAgbGVnZW5kLnBvc2l0aW9uPSJyaWdodCIpICANCiNwbG90DQpnZ3Bsb3RseShwbG90KSAlPiUNCiAgbGF5b3V0KG1hcmdpbiA9IGxpc3QoYj0xMDApLCBhbm5vdGF0aW9ucyA9IGxpc3QoeD0yMDIxLCB5ID0gLTEsIHNob3dhcnJvdyA9IEYsIGZvbnQgPSBsaXN0KHNpemU9MTApLCB0ZXh0PSJcbiBcbiBcbiBcbiAgXG4gIFxuIFxuIFxuIFxuIFxuIFxuIE5vdGU6IDk1JSBDSSBcbiBTb3VyY2U6IENlbnRFUmRhdGEgMjAyMSIpKQ0KYGBgDQo8YnI+IA0KDQotLS0gIA0KDQojIyBhbGwgKHNpbWlsYXJpdHkpDQpgYGB7cn0NCg0KDQpwbG90IDwtIGdncGxvdCh0Z2Nfb3AyLCBhZXMoeD1wZXJpb2QsIHk9aG9tb2dlbmVpdHksIGNvbG91cj1hZ2UpKSArIA0KICBnZW9tX2xpbmUocG9zaXRpb249cG9zaXRpb25fZG9kZ2UoMC4xKSkgKw0KICBnZW9tX2Vycm9yYmFyKGFlcyh5bWluPWhvbW9nZW5laXR5LWNpLCB5bWF4PWhvbW9nZW5laXR5K2NpKSwgd2lkdGg9LjYsIHBvc2l0aW9uPXBvc2l0aW9uX2RvZGdlKDAuMSkpICsNCiAgZ2VvbV9wb2ludChwb3NpdGlvbj1wb3NpdGlvbl9kb2RnZSgwLjEpKSArIA0KICBzY2FsZV94X2NvbnRpbnVvdXMoYnJlYWtzID0gMjAwODoyMDIxLCBsaW1pdHMgPSBjKDIwMDcsMjAyMiksIGxhYmVscyA9IGFzLmNoYXJhY3RlcihjKDIwMDg6MjAyMSkpKSArDQogIHNjYWxlX3lfY29udGludW91cyhicmVha3MgPSBjKC0xLCAtMC43NSwgLS41LCAtLjI1LCAwLCAuMjUsIC41LCAuNzUsIDEpLCBsaW1pdHMgPSBjKC0xLDEpKSsgDQogIGxhYnModGl0bGUgPSAiQWdlIGhvbW9nZW5laXR5IiwgY2FwdGlvbiA9ICJOb3RlOiA5NSUgQ0kgXG4gU291cmNlOiBDZW50RVJkYXRhIDIwMjEiLCANCiAgICAgICB5ID0gIlMtaW5kZXgiLCB4PSJwZXJpb2QiKSArIA0KICBzY2FsZV9jb2xvdXJfaHVlKG5hbWU9ImFnZSBlZ28iLCAgICAjIExlZ2VuZCBsYWJlbCwgdXNlIGRhcmtlciBjb2xvcnMNCiAgICAgICAgICAgICAgICAgICAjYnJlYWtzPWMoIjEiLCAiMiIpLA0KICAgICAgICAgICAgICAgICAgICNsYWJlbHM9bGV2ZWxzKHRlc3QpLA0KICAgICAgICAgICAgICAgICAgIGw9NDApICAgICAgICsgICAgICAgICAgICAgICMgVXNlIGRhcmtlciBjb2xvcnMsIGxpZ2h0bmVzcz00MA0KICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZT00NSksDQogICAgICAgIGxlZ2VuZC5qdXN0aWZpY2F0aW9uPWMoMSwwKSwNCiAgICAgICAgbGVnZW5kLnBvc2l0aW9uPSJyaWdodCIpICANCg0KZ2dwbG90bHkocGxvdCkgJT4lDQogIGxheW91dChtYXJnaW4gPSBsaXN0KGI9MTAwKSwgYW5ub3RhdGlvbnMgPSBsaXN0KHg9MjAyMSwgeSA9IC0xLCBzaG93YXJyb3cgPSBGLCBmb250ID0gbGlzdChzaXplPTEwKSwgdGV4dD0iXG4gXG4gXG4gXG4gIFxuICBcbiBcbiBcbiBcbiBcbiBcbiBOb3RlOiA5NSUgQ0kgXG4gU291cmNlOiBDZW50RVJkYXRhIDIwMjEiKSkNCmBgYA0KPGJyPg0KDQotLS0gIA0KDQojIyBubyBraW4gKHNpbWlsYXJpdHkpDQpgYGB7cn0NCg0KDQpwbG90IDwtIGdncGxvdCh0Z2Nfbmtfb3AyLCBhZXMoeD1wZXJpb2QsIHk9aG9tb2dlbmVpdHksIGNvbG91cj1hZ2UpKSArIA0KICBnZW9tX2xpbmUocG9zaXRpb249cG9zaXRpb25fZG9kZ2UoMC4xKSkgKw0KICBnZW9tX2Vycm9yYmFyKGFlcyh5bWluPWhvbW9nZW5laXR5LWNpLCB5bWF4PWhvbW9nZW5laXR5K2NpKSwgd2lkdGg9LjYsIHBvc2l0aW9uPXBvc2l0aW9uX2RvZGdlKDAuMSkpICsNCiAgZ2VvbV9wb2ludChwb3NpdGlvbj1wb3NpdGlvbl9kb2RnZSgwLjEpKSArIA0KICBzY2FsZV94X2NvbnRpbnVvdXMoYnJlYWtzID0gMjAwODoyMDIxLCBsaW1pdHMgPSBjKDIwMDcsMjAyMiksIGxhYmVscyA9IGFzLmNoYXJhY3RlcihjKDIwMDg6MjAyMSkpKSArDQogIHNjYWxlX3lfY29udGludW91cyhicmVha3MgPSBjKC0xLCAtMC43NSwgLS41LCAtLjI1LCAwLCAuMjUsIC41LCAuNzUsIDEpLCBsaW1pdHMgPSBjKC0xLDEpKSArIA0KICBsYWJzKHRpdGxlID0gIkFnZSBob21vZ2VuZWl0eSIsIGNhcHRpb24gPSAiTm90ZTogOTUlIENJIFxuIFNvdXJjZTogQ2VudEVSZGF0YSAyMDIxIiwgDQogICAgICAgeSA9ICJTLWluZGV4IiwgeD0icGVyaW9kIikgKyANCiAgc2NhbGVfY29sb3VyX2h1ZShuYW1lPSJhZ2UgZWdvIiwgICAgIyBMZWdlbmQgbGFiZWwsIHVzZSBkYXJrZXIgY29sb3JzDQogICAgICAgICAgICAgICAgICAgI2JyZWFrcz1jKCIxIiwgIjIiKSwNCiAgICAgICAgICAgICAgICAgICAjbGFiZWxzPWxldmVscyh0ZXN0KSwNCiAgICAgICAgICAgICAgICAgICBsPTQwKSAgICAgICArICAgICAgICAgICAgICAjIFVzZSBkYXJrZXIgY29sb3JzLCBsaWdodG5lc3M9NDANCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGU9NDUpLA0KICAgICAgICBsZWdlbmQuanVzdGlmaWNhdGlvbj1jKDEsMCksDQogICAgICAgIGxlZ2VuZC5wb3NpdGlvbj0icmlnaHQiKSAgDQoNCmdncGxvdGx5KHBsb3QpICU+JQ0KICBsYXlvdXQobWFyZ2luID0gbGlzdChiPTEwMCksIGFubm90YXRpb25zID0gbGlzdCh4PTIwMjEsIHkgPSAtMSwgc2hvd2Fycm93ID0gRiwgZm9udCA9IGxpc3Qoc2l6ZT0xMCksIHRleHQ9IlxuIFxuIFxuIFxuICBcbiBcbiAgXG4gXG4gXG4gXG4gXG4gTm90ZTogOTUlIENJIFxuIFNvdXJjZTogQ2VudEVSZGF0YSAyMDIxIikpDQpgYGANCjxicj4gDQoNCi0tLSANCg0KIyBFdGhuaWNpdHkgey50YWJzZXQgLnRhYnNldC1mYWRlfQ0KDQoNCmBgYHtyfQ0KDQpkYXRhanQgJT4lIA0KICBmaWx0ZXIoIWlzLm5hKGV0bmkzKSkgJT4lDQogIGdyb3VwX2J5KHN1cnZleV93YXZlLCBldG5pMykgJT4lDQogIHN1bW1hcmlzZShOID0gbigpLA0KICAgICAgICAgICAgY2RuX2V0bmlfRUlNID0gbWVhbihldG5pX0VJLCBuYS5ybT1UKSwNCiAgICAgICAgICAgIHNkID0gc2QoZXRuaV9FSSwgbmEucm09VCksDQogICAgICAgICAgICBjZG5fZXRuaV9FSU1fdyA9IHd0ZC5tZWFuKGV0bmlfRUksIGNkbl9zaXplLCBub3Jtd3QgPSBGQUxTRSwgbmEucm0gPSBUUlVFKSwgI3BlcmhhcHMgYmV0dGVyIHRvIHNldCBub3Jtd3QgdG8gVFJVRQ0KICAgICAgICAgICAgc2RfdyA9IHNxcnQod3RkLnZhcihldG5pX0VJLCBjZG5fc2l6ZSwgbm9ybXd0ID0gRkFMU0UsIG5hLnJtID0gVFJVRSkpKSAlPiUNCiAgbXV0YXRlKA0KICAgIGNvbmYuaW50ZXJ2YWwgPSAuOTUsDQogICAgc2UgPSBzZCAvIHNxcnQoTikgLA0KICAgIGNpID0gc2UgKiBxdChjb25mLmludGVydmFsLzIgKyAuNSwgTi0xKSwNCiAgICBzZV93ID0gc2RfdyAvIHNxcnQoTikgLCAjaXMgdGhpcyBjb3JyZWN0Pz8NCiAgICBjaV93ID0gc2VfdyAqIHF0KGNvbmYuaW50ZXJ2YWwvMiArIC41LCBOLTEpKSAlPiUgICANCiAgbmEub21pdCgpIC0+IHRnYw0KDQpkYXRhanRfbmsgJT4lIA0KICBmaWx0ZXIoIWlzLm5hKGV0bmkzKSkgJT4lDQogIGdyb3VwX2J5KHN1cnZleV93YXZlLCBldG5pMykgJT4lDQogIHN1bW1hcmlzZShOID0gbigpLA0KICAgICAgICAgICAgY2RuX2V0bmlfRUlNID0gbWVhbihldG5pX0VJLCBuYS5ybT1UKSwNCiAgICAgICAgICAgIHNkID0gc2QoZXRuaV9FSSwgbmEucm09VCksDQogICAgICAgICAgICBjZG5fZXRuaV9FSU1fdyA9IHd0ZC5tZWFuKGV0bmlfRUksIGNkbl9zaXplLCBub3Jtd3QgPSBGQUxTRSwgbmEucm0gPSBUUlVFKSwgI3BlcmhhcHMgYmV0dGVyIHRvIHNldCBub3Jtd3QgdG8gVFJVRQ0KICAgICAgICAgICAgc2RfdyA9IHNxcnQod3RkLnZhcihldG5pX0VJLCBjZG5fc2l6ZSwgbm9ybXd0ID0gRkFMU0UsIG5hLnJtID0gVFJVRSkpKSAlPiUNCiAgbXV0YXRlKA0KICAgIGNvbmYuaW50ZXJ2YWwgPSAuOTUsDQogICAgc2UgPSBzZCAvIHNxcnQoTikgLA0KICAgIGNpID0gc2UgKiBxdChjb25mLmludGVydmFsLzIgKyAuNSwgTi0xKSwNCiAgICBzZV93ID0gc2RfdyAvIHNxcnQoTikgLCAjaXMgdGhpcyBjb3JyZWN0Pz8NCiAgICBjaV93ID0gc2VfdyAqIHF0KGNvbmYuaW50ZXJ2YWwvMiArIC41LCBOLTEpKSAlPiUgICANCiAgbmEub21pdCgpIC0+IHRnY19uaw0KDQoNCg0KDQp0Z2MkcGVyaW9kIDwtIGFzLm51bWVyaWModGdjJHN1cnZleV93YXZlKSArIDIwMDcNCnRnYyRob21vZ2VuZWl0eSA8LSByb3VuZCh0Z2MkY2RuX2V0bmlfRUlNLCAyKQ0KdGdjJGV0aG5pY2l0eSA8LSBhcy5mYWN0b3IodGdjJGV0bmkzKQ0KbGV2ZWxzKHRnYyRldGhuaWNpdHkpIDwtIGMoIkR1dGNoIiwgIldlc3Rlcm4iLCAibm9uLVdlc3Rlcm4iKQ0KDQp0Z2NfbmskcGVyaW9kIDwtIGFzLm51bWVyaWModGdjX25rJHN1cnZleV93YXZlKSArIDIwMDcNCnRnY19uayRob21vZ2VuZWl0eSA8LSByb3VuZCh0Z2NfbmskY2RuX2V0bmlfRUlNLCAyKQ0KdGdjX25rJGV0aG5pY2l0eSA8LSBhcy5mYWN0b3IodGdjX25rJGV0bmkzKQ0KbGV2ZWxzKHRnY19uayRldGhuaWNpdHkpIDwtIGMoIkR1dGNoIiwgIldlc3Rlcm4iLCAibm9uLVdlc3Rlcm4iKQ0KDQpgYGANCg0KIyMgYWxsDQoNCmBgYHtyfQ0KcGxvdCA8LSBnZ3Bsb3QodGdjLCBhZXMoeD1wZXJpb2QsIHk9aG9tb2dlbmVpdHksIGNvbG91cj1ldGhuaWNpdHkpKSArIA0KICBnZW9tX2xpbmUocG9zaXRpb249cG9zaXRpb25fZG9kZ2UoMC4xKSkgKw0KICBnZW9tX2Vycm9yYmFyKGFlcyh5bWluPWhvbW9nZW5laXR5LWNpLCB5bWF4PWhvbW9nZW5laXR5K2NpKSwgd2lkdGg9LjYsIHBvc2l0aW9uPXBvc2l0aW9uX2RvZGdlKDAuMSkpICsNCiAgZ2VvbV9wb2ludChwb3NpdGlvbj1wb3NpdGlvbl9kb2RnZSgwLjEpKSArIA0KICBzY2FsZV94X2NvbnRpbnVvdXMoYnJlYWtzID0gMjAxMToyMDIxLCBsaW1pdHMgPSBjKDIwMTAsMjAyMiksIGxhYmVscyA9IGFzLmNoYXJhY3RlcihjKDIwMTE6MjAyMSkpKSArDQogIHNjYWxlX3lfY29udGludW91cyhicmVha3MgPSBjKC0xLCAtMC43NSwgLS41LCAtLjI1LCAwLCAuMjUsIC41LCAuNzUsIDEpLCBsaW1pdHMgPSBjKC0xLDEpKSArIA0KICBsYWJzKHRpdGxlID0gIkV0aG5pYyBob21vZ2VuZWl0eSIsIGNhcHRpb24gPSAiTm90ZTogOTUlIENJIFxuIFNvdXJjZTogQ2VudEVSZGF0YSAyMDIxIiwgDQogICAgICAgeSA9ICJFSS1pbmRleCIsIHg9InBlcmlvZCIpICsgDQogIHNjYWxlX2NvbG91cl9odWUobmFtZT0iZXRobmljaXR5IGVnbyIsICAgICMgTGVnZW5kIGxhYmVsLCB1c2UgZGFya2VyIGNvbG9ycw0KICAgICAgICAgICAgICAgICAgICNicmVha3M9YygiMSIsICIyIiksDQogICAgICAgICAgICAgICAgICAgI2xhYmVscz1jKCJEIiwgIlciLCAiTlciKSwNCiAgICAgICAgICAgICAgICAgICBsPTQwKSAgICAgICArICAgICAgICAgICAgICAjIFVzZSBkYXJrZXIgY29sb3JzLCBsaWdodG5lc3M9NDANCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGU9NDUpLA0KICAgICAgICBsZWdlbmQuanVzdGlmaWNhdGlvbj1jKDEsMCksDQogICAgICAgIGxlZ2VuZC5wb3NpdGlvbj0icmlnaHQiKSAgDQoNCmdncGxvdGx5KHBsb3QpICU+JQ0KICBsYXlvdXQobWFyZ2luID0gbGlzdChiPTEwMCksIGFubm90YXRpb25zID0gbGlzdCh4PTIwMjEsIHkgPSAtMSwgc2hvd2Fycm93ID0gRiwgZm9udCA9IGxpc3Qoc2l6ZT0xMCksIHRleHQ9IlxuIFxuIFxuIFxuICBcbiAgXG4gXG4gXG4gXG4gXG4gXG4gTm90ZTogOTUlIENJIFxuIFNvdXJjZTogQ2VudEVSZGF0YSAyMDIxIikpDQpgYGANCg0KPGJyPiANCg0KLS0tICANCg0KIyMgbm8ga2luDQoNCmBgYHtyfQ0KcGxvdCA8LSBnZ3Bsb3QodGdjX25rLCBhZXMoeD1wZXJpb2QsIHk9aG9tb2dlbmVpdHksIGNvbG91cj1ldGhuaWNpdHkpKSArIA0KICBnZW9tX2xpbmUocG9zaXRpb249cG9zaXRpb25fZG9kZ2UoMC4xKSkgKw0KICBnZW9tX2Vycm9yYmFyKGFlcyh5bWluPWhvbW9nZW5laXR5LWNpLCB5bWF4PWhvbW9nZW5laXR5K2NpKSwgd2lkdGg9LjYsIHBvc2l0aW9uPXBvc2l0aW9uX2RvZGdlKDAuMSkpICsNCiAgZ2VvbV9wb2ludChwb3NpdGlvbj1wb3NpdGlvbl9kb2RnZSgwLjEpKSArIA0KICBzY2FsZV94X2NvbnRpbnVvdXMoYnJlYWtzID0gMjAxMToyMDIxLCBsaW1pdHMgPSBjKDIwMTAsMjAyMiksIGxhYmVscyA9IGFzLmNoYXJhY3RlcihjKDIwMTE6MjAyMSkpKSArDQogIHNjYWxlX3lfY29udGludW91cyhicmVha3MgPSBjKC0xLCAtMC43NSwgLS41LCAtLjI1LCAwLCAuMjUsIC41LCAuNzUsIDEpLCBsaW1pdHMgPSBjKC0xLDEpKSArIA0KICBsYWJzKHRpdGxlID0gIkV0aG5pYyBob21vZ2VuZWl0eSIsIGNhcHRpb24gPSAiTm90ZTogOTUlIENJIFxuIFNvdXJjZTogQ2VudEVSZGF0YSAyMDIxIiwgDQogICAgICAgeSA9ICJFSS1pbmRleCIsIHg9InBlcmlvZCIpICsgDQogIHNjYWxlX2NvbG91cl9odWUobmFtZT0iZXRobmljaXR5IGVnbyIsICAgICMgTGVnZW5kIGxhYmVsLCB1c2UgZGFya2VyIGNvbG9ycw0KICAgICAgICAgICAgICAgICAgICNicmVha3M9YygiMSIsICIyIiksDQogICAgICAgICAgICAgICAgICAgI2xhYmVscz1jKCJEIiwgIlciLCAiTlciKSwNCiAgICAgICAgICAgICAgICAgICBsPTQwKSAgICAgICArICAgICAgICAgICAgICAjIFVzZSBkYXJrZXIgY29sb3JzLCBsaWdodG5lc3M9NDANCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGU9NDUpLA0KICAgICAgICBsZWdlbmQuanVzdGlmaWNhdGlvbj1jKDEsMCksDQogICAgICAgIGxlZ2VuZC5wb3NpdGlvbj0icmlnaHQiKSAgDQoNCmdncGxvdGx5KHBsb3QpICU+JQ0KICBsYXlvdXQobWFyZ2luID0gbGlzdChiPTEwMCksIGFubm90YXRpb25zID0gbGlzdCh4PTIwMjEsIHkgPSAtMSwgc2hvd2Fycm93ID0gRiwgZm9udCA9IGxpc3Qoc2l6ZT0xMCksIHRleHQ9IlxuIFxuIFxuIFxuICBcbiBcbiBcbiBcbiBcbiBcbiBcbiBOb3RlOiA5NSUgQ0kgXG4gU291cmNlOiBDZW50RVJkYXRhIDIwMjEiKSkNCmBgYA0KDQo8YnI+IA0KDQotLS0gIA0KDQoNCg0KIyBUYWtlIEhvbWUgTWVzc2FnZSAgDQoNCi0gUHJvbm91bmNlZCBzZWdyZWdhdGlvbiBpbiBhbGwgc29jaWFsIGRpbWVuc2lvbnMuICANCi0gT3ZlcmFsbCwgc2VncmVnYXRpb24gaW4gc29jaWFsIG5ldHdvcmtzIGlzIHF1aXRlIGNvbnN0YW50IG92ZXIgdGltZSAgDQotIEFnZSBzZWdyZWdhdGlvbiBpcyBpbmNyZWFzaW5nIChmb3IgdGhlIGVsZGVybHkpICANCi0gRWR1Y2F0aW9uYWwgc2VncmVnYXRpb24gaXMgaW5jcmVhc2luZyAoZm9yIHRoZSBoaWdoZXIgZWR1Y2F0ZWQpICANCg0KDQotLS0gIA0KDQo=