Data Analysis
1. load raw data
Show the raw trial structure:
glimpse(rawdata)
In the raw trials, there are several important columns which are
relevant for further analyses.
Duration
: The test durations generated by computer.
‘pdur’ is the actual presented durations by the computer. There were
some fluctuations, but within 5 ms (within 1 refresh frame).
sub
, group
, sequence
are
anonymized subject number, group and the duration sequence used in the
experiment.
Reproduction
, rep_err
: the reproduced
durations and the reproduction errors compared to the given
duration.
itd
, preDuration
: the inter-trial
difference in a given trial, and the duration used in the previous
trial. These were used in the sequential effect analysis.
Participants
# Total participants
print(length (unique(rawdata$sub)))
# total sequences (pairs)
print(length(unique(rawdata$sequence)))
The sampled durations and sequences
Let’s first illustrate the sequence and the distribution of the
sample durations.
# ---- illustrate one sequence -----
fig11 = ggplot(rawdata, aes(Duration)) + geom_histogram(binwidth = 0.1, fill = I("white"), col = I('black')) +
theme_classic() + xlab('Duration (secs)')
# a typical sequence
sub1 = rawdata %>% filter(sub == 'ara27')
fig12 = ggplot(sub1, aes(trlNo, Duration, color = Volatility)) + geom_line() +
xlab("Trial Sequence") + theme_classic()+
theme(legend.position = 'top')
# histogram of the typical sequence
fig13 = ggplot(sub1, aes(y=Duration, color = Volatility)) + geom_density() + theme_classic() + theme(legend.position = 'top')
fig13
fig1 = plot_grid(fig12,fig13, rel_widths =c(3,1))
fig1
if (saveFig){
ggsave("figures/fig_sequence.png", fig1, width=4, height=3.5)
ggsave("figures/fig_sequence.pdf", fig1, width=4, height=3.5)
}
Explorative data analysis and outlier detection
We first estimate two key signatures - the central tendency index
(ci) and the sequential dependence index (si).
# using error for regression, -slope is the central tendency index.
ct_model <- function(df){
lm(rep_err ~ Duration, data = df)
}
# sequential effect using the duration from the previous trial
seq_model <- function(df){
lm(rep_err ~ preDuration, data = df)
}
# exclude extreme trials (beyond [1/3D, 3D])
vdata = rawdata %>%
filter(Reproduction > Duration/3, Reproduction < 3*Duration)
# calculate slope for the central tendency as well as the sequential dependence.
slopes_ct <- vdata %>% group_by(sub, sequence, Volatility, group, Order) %>%
nest() %>% # nested data
mutate(model = map(data, ct_model)) %>% # linear regression
mutate(slope = map(model, broom::tidy)) %>% # get estimates out
unnest(slope, .drop = TRUE) %>% # remove raw data
select(-std.error,-statistic, -p.value) %>% # remove unnecessary columns
spread(term, estimate) %>% # spread estimates
rename(intercept_ct = `(Intercept)`, slope = Duration) %>%
select(-data, -model)
#sequential effect
slopes_seq <- vdata %>% filter(!is.na(preDuration)) %>%
group_by(sub, sequence, Volatility, group, Order) %>%
nest() %>% # nested data
mutate(model = map(data, seq_model)) %>% # linear regression
mutate(slope = map(model, broom::tidy)) %>% # get estimates out
unnest(slope, .drop = TRUE) %>% # remove raw data
select(-std.error,-statistic, -p.value) %>% # remove unnecessary columns
spread(term, estimate) %>% # spread estimates
rename(intercept_seq = `(Intercept)`, seq_slope = preDuration) %>%
select(-data, -model)
# merge two tables together
slopes_all = left_join(slopes_ct, slopes_seq,
by = c("sub", "sequence", "Volatility","group","Order")) %>%
mutate(ci = -slope, si = seq_slope) #central tendency index
# estimated general biases (over-/under-estimates)
# individual mean interval (middle point): most of them were around 1 by design
mInterval = vdata %>% group_by(sub) %>% summarise(mDur = mean(Duration))
# join the mean interval, and estimate the general bias
slopes = slopes_all %>% left_join(., mInterval, by = c('sub')) %>%
mutate(gBias = (intercept_ct + slope * mDur)*1000)
# change factor order for plotting
slopes$Volatility = factor(slopes$Volatility)
slopes$Order = factor(slopes$Order)
slopes$group = factor(slopes$group)
head(slopes)
Let’s plot the histograms of the central tendency index and the
sequential dependence index, which show some outliers. We visualize the
outliers using 3-sigma rule. The 3-sigma rule only rule out 0.3% of the
population if we assume the population is normal.
ci_3sig = mean(slopes$ci) + c(-1,1)*3*sd(slopes$ci)
si_3sig = mean(slopes$si) + c(-1,1)*3*sd(slopes$si)
hist1 = ggplot(slopes, aes(x = ci, y = ..density..)) +
geom_histogram(colour = 1, fill = 'white', bins = 20) +
geom_vline(xintercept = ci_3sig, linetype = 'dashed', color = 'red') +
theme_classic() + xlab('Central Tendency Index')
hist2 = ggplot(slopes, aes(x = si, y = ..density..)) +
geom_histogram(colour = 1, fill = 'white', bins = 20) +
geom_vline(xintercept = ci_3sig, linetype = 'dashed', color = 'red') +
theme_classic() + xlab('Sequential Dependence Index')
hist_fig = plot_grid(hist1,hist2, nrow = 2)
hist_fig
if (saveFig){
ggsave("figures/hist_fig.png", hist_fig, width=4, height=3.5)
ggsave("figures/hist_fig.pdf", fig1, width=4, height=3.5)
}
Note, the above outlier detection method is agnostic to the groups
and conditions!
Let’s find out those outliers and exclude by sequences for further
analyses (given that ASD and TD groups were paired).
slopes %>% ungroup() %>% filter(ci > ci_3sig[2] | ci < ci_3sig[1] | si > si_3sig[2] | si < si_3sig[1]) %>% select(sequence) -> outlier_seq
outlier_seq$sequence
Now let’s visualize the outliers together with their matched
pairs.
# ---- plot outliers ----
fig_outlier = rawdata %>% ungroup() %>% filter(sequence %in% outlier_seq$sequence) %>%
filter(Reproduction > Duration/3, Reproduction < 3*Duration) %>%
group_by(sub, group,sequence, Volatility, Duration) %>%
summarise(mRep = mean(Reproduction), sdr=sd(Reproduction), n = n(),
se = sd(Reproduction)/sqrt(n-1)) %>% filter(n>5) %>% #approx. for linear regression without averaging first
ggplot(aes(Duration, mRep, color = group,
group = interaction(group, Volatility),
shape = Volatility, linetype = Volatility)) +
geom_point() + geom_smooth(method = 'lm', se = FALSE) +
facet_wrap(~sequence, ncol = 4) +
theme_classic() + theme(legend.pos = 'bottom') +
geom_abline(slope = 1, linetype = 3) +
xlab('Duration (Secs)') + ylab(' Reproduction (Secs)') +
theme(strip.background = element_blank(), strip.text.x = element_blank())
fig_outlier
if (saveFig){
ggsave("figures/fig_outlier.png", fig_outlier, width=5, height=5)
ggsave("figures/fig_outlier.pdf", fig_outlier, width=5, height=5)
}
Mean slopes and related statistics:
slopes %>% filter(sequence %in% outlier_seq$sequence) %>% arrange(group, Volatility)
vslopes = slopes %>% filter(!(sequence %in% outlier_seq$sequence))
# outliers
oslopes = slopes %>% filter(sequence %in% outlier_seq$sequence)
# ANOVA
ezANOVA(data = oslopes, dv = ci,
wid = sub,
within = Volatility,
between = group)
Outliers and sequential dependence
Visualize the strong sequential dependence.
fig_sdep31 = rawdata %>% filter(sequence %in% c(31) ) %>% # the extreme sequential dependence pair
mutate_at("preDuration", round, 1) %>%
group_by(sequence, group, preDuration) %>%
summarise(rep_err = mean(rep_err)) %>%
ggplot(aes(preDuration, rep_err, color = group) ) +
geom_point() + geom_smooth(method = 'lm') + theme_classic() +
geom_abline(slope = 0, linetype = 2) +
# facet_wrap(~sequence) +
xlab('Duration trial n-1') + ylab('Repr. Error (Secs)') +
theme(strip.background = element_blank(), strip.text.x = element_blank(), legend.position = 'bottom')
fig_sdep31
fig_o = plot_grid(fig_outlier, fig_sdep31, nrow = 1, labels = c('a','b'), rel_widths = c(2.4,1))
if (saveFig){
ggsave("figures/fig_o.png", fig_o, width=7, height=3)
ggsave("figures/fig_o.pdf", fig_o, width=7, height=3)
}
Typical reproduction performance
And here are the two typical participants produced errors from
sequence 12:
# ---- reproduction figure - an example -----
# mean analysis
mrep = rawdata %>% ungroup() %>% filter(!(sequence %in% outlier_seq$sequence)) %>%
filter(Reproduction > Duration/3, Reproduction < 3*Duration) %>%
group_by(sub, group,Order, sequence, Volatility, Duration) %>%
summarise(mRep = mean(Reproduction), sdr=sd(Reproduction), n = n(),
se = sd(Reproduction)/sqrt(n-1)) %>% filter(n>3)
# individual examples
# asd
fig_asd = mrep%>%
filter( sequence == '11', group == 'ASD') %>%
ggplot(aes(Duration, mRep, color = Volatility, group = Volatility, shape = Volatility)) +
geom_point(size = 2) +
#geom_line(aes(linetype = Volatility)) +
geom_smooth(method = 'lm', aes(fill = Volatility), se = FALSE) +
geom_errorbar(aes(ymin = mRep - se, ymax = mRep +se), width = 0.05) +
theme_classic() + theme(strip.background = element_blank()) +
geom_abline(slope = 1, linetype = 2) +
theme(legend.position = 'none', plot.margin = unit(c(0,0,0,0),'cm')) +
ylab('') + xlab('')
#td
fig_td = mrep%>%
filter( sequence == '11', group == 'TD') %>%
ggplot(aes(Duration, mRep, color = Volatility, group = Volatility, shape = Volatility)) +
geom_point(size = 2) +
geom_smooth(method = 'lm', aes(fill = Volatility), se = FALSE) +
geom_errorbar(aes(ymin = mRep - se, ymax = mRep +se), width = 0.05) +
theme_classic() + theme(strip.background = element_blank()) +
geom_abline(slope = 1, linetype = 2) +
theme(legend.position = 'none', plot.margin = unit(c(0,0,0,0),'cm')) +
ylab('') + xlab('')
# group mean reproductions
fig_repd_gr = mrep%>%
ggplot(aes(Duration, mRep, color = Volatility, group = Volatility, shape = Volatility)) +
geom_point(alpha = 0.2) +
geom_smooth(method = 'lm', se = FALSE, aes(fill = Volatility)) +
theme_classic() + theme(strip.background = element_blank()) +
geom_abline(slope = 1, linetype = 2) +
facet_wrap(~group) + theme(legend.position = c(0.1,0.85)) +
xlab('Duration (Secs)') + ylab('Reproduction (Secs)')
# plot individual example as inset.
fig_mrep = ggdraw() + draw_plot(fig_repd_gr) +
draw_plot(fig_asd, x = 0.3, y = 0.13, width = .2, height = .3) +
draw_plot(fig_td, x = 0.75, y = 0.13, width = .2, height = .3)
fig_mrep
if(saveFig){
ggsave("figures/fig_reproduction.png", fig_mrep, width=7, height=3.5)
ggsave("figures/fig_reproduction.pdf", fig_mrep, width=7, height=3.5)
}
As we can see from the patterns above. The ASD participant produced
relative flat errors, while the TD participant showed a strong central
tendency effect (shorts being overestimated and longs being
underestimated).
Visulize CTE and sequential dependence
Let’s visualize the biases (central tendency and serial dependence)
for two groups (ASD vs. TD)
pd = position_dodge(width = 0.05)
# plot CTI and SI together
fig_biases = vslopes%>%
group_by(group, Volatility, Order) %>%
summarise(msi = mean(si), n = n(), se_si = sd(si)/sqrt(n),
mci = mean(ci), se_ci = sd(ci)/sqrt(n)) %>%
ggplot(aes(msi, mci, color = group, shape = Volatility,
group=interaction(Order, group))) +
geom_hline(yintercept = 0, color = 'gray', linetype = 'dashed') +
geom_vline(xintercept = 0, color = 'gray', linetype = 'dashed') +
geom_point(size = 2) +
geom_line(aes(linetype = Order)) +
geom_errorbar(aes(ymin = mci - se_ci, ymax = mci + se_ci), width = 0.01 ) +
geom_errorbarh(aes(xmin = msi - se_si, xmax = msi + se_si), height = 0.01) +
xlab('Serial Dependence') + ylab('Central Tendency') +
scale_y_continuous(labels = scales::percent) +
scale_x_continuous(labels = scales::percent) +
guides(color = guide_legend(title = 'Group'),
linetype = guide_legend(title = 'Volatility Order'),
) +
theme_classic() +
theme(legend.position = 'bottom')
fig_biases
if (saveFig){
ggsave("figures/fig_biases.png", fig_biases, width=5, height=4)
ggsave("figures/fig_biases.pdf", fig_biases, width=5, height=4)
}
By visual inspection, individuals with ASD exhibited less central
tendency relative to their matched TD controls (the red lines below the
cyan lines in the above figure), while the local serial dependence was
relatively comparable between two groups except in the low volatility
condition when that condition started first. Interestingly, the central
tendency and serial dependence were similar for both groups when the
high-volatility session started first (the solid lines), while they
differed when the low-volatility session started first (the dashed
lines).
Given that the main difference was shown in CTE. We further plot the
mean CTEs.
#pd = position_dodge(width = 0.5)
# separate plots for appendix
fig_cti = vslopes %>%
group_by(group, Volatility, Order) %>%
summarise(mci = mean(ci), n = n(), se = sd(ci)/sqrt(n)) %>%
ggplot(aes(Volatility, mci, shape = Order, color = Order, group = Order)) +
geom_line() + geom_point(size= 2) +
#geom_bar(stat = 'identity', position = pd, width = 0.5) +
facet_wrap(~group)+
geom_errorbar(aes(ymin = mci - se, ymax = mci + se), width = 0.2) +
theme_classic() + theme(legend.position = 'bottom', strip.background = element_blank()) +
xlab('Volatility') + ylab('CTI') +
scale_y_continuous(labels = scales::percent) +
guides(color = guide_legend(title = 'Order'), fill = guide_legend(title = 'Order'))
fig_cti
Let’s do the sequential dependence as well.
pd = position_dodge(width = 0.5)
# separate plots for appendix
fig_sdi = vslopes %>%
group_by(group, Volatility, Order) %>%
summarise(msi = mean(si), n = n(), se = sd(si)/sqrt(n)) %>%
ggplot(aes(Volatility, msi, shape = Order, color = Order, group = Order)) +
geom_line() + geom_point(size = 2) +
#geom_bar(stat = 'identity', position = pd, width = 0.5) +
facet_wrap(~group)+
geom_errorbar(aes(ymin = msi - se, ymax = msi + se), width = 0.2) +
theme_classic() + theme(legend.position = 'bottom', strip.background = element_blank()) +
xlab('Volatility') + ylab('SDI') +
scale_y_continuous(labels = scales::percent) +
guides(color = guide_legend(title = 'Order'), fill = guide_legend(title = 'Order'))
fig_sdi
fig3 = plot_grid(fig_cti, fig_sdi, nrow = 1, labels = c("a","b"))
fig3
if (saveFig){
ggsave('figures/fig3.pdf',fig3, width = 7, height = 3.5)
ggsave('figures/fig3.png',fig3, width = 7, height = 3.5)
}
Statistics
- Central tendency effect
Average CTIs
vslopes %>% group_by(group) %>% summarise(mcti = mean(ci))
vslopes %>% group_by(Volatility) %>% summarise(mcti = mean(ci))
vslopes %>% group_by(Order) %>% summarise(mcti = mean(ci))
# calculate mean elevated CTIs between HV First vs. LV First
vslopes %>% group_by(group, Volatility, Order) %>% summarise(mcti = mean(ci)) %>%
pivot_wider(names_from = Order, values_from = mcti) %>%
mutate(dCTI = `HV First` - `LV First`) %>%
group_by(group) %>% summarise(md = mean(dCTI))
vslopes = as.data.frame(vslopes) # required by rstatix
# ---- central tendency index----
# repeated measures ANOVA on central tendency index
anova1 = anova_test(data = vslopes, dv = ci,
wid = sub,
within = Volatility,
between = c(group, Order))
anova1
## separate for Volatility order
anova1a = anova_test(data = vslopes %>% filter(group == 'ASD'),
dv = ci,
wid = sub,
within = Volatility,
between = Order)
anova1a
anova1b = anova_test(data = vslopes %>% filter(group == 'TD'),
dv = ci,
wid = sub,
within = Volatility,
between = Order)
anova1b
- Bayes factor analysis for pair-wise comparison
The above analysis showed that the main difference came from the
central tendency. Here we further get the central tendency bias and
Bayes factor analyses:
# --- Bayes t-tests
bftest = function(df){
df = as.data.frame(df)
# get the means
rdf = df%>% summarise(mci = mean(ci),
se_ci = sd(ci)/sqrt(n()),
msi = mean(si),
se_si = sd(si)/sqrt(n()))
rdf$ci_bf = ttestBF(df$ci, mu = 0) %>% extractBF() %>% .$bf
rdf$si_bf = ttestBF(df$si, mu = 0) %>% extractBF() %>% .$bf
return(rdf)
}
vslopes %>% group_by(group, Volatility, Order) %>% nest() %>%
mutate(bf = map(data, bftest)) %>% unnest(bf, .drop = TRUE)
# group comparison for the low-vol-first, high-vol session
vslopes %>% filter(Volatility == 'High Vola.', Order == 'LV First') %>% as.data.frame() ->v11
t_test(data = v11, formula = ci ~ group)
ttestBF(data = v11, formula = ci ~ group)
vslopes %>% filter(Volatility == 'Low Vola.', Order == 'LV First') %>% as.data.frame() ->v12
t_test(data = v12, formula = ci ~ group)
ttestBF(data = v12, formula = ci ~ group)
- ANOVA analyses for the serial dependence indices:
# ---- Serial dependence index----
anova2 = ezANOVA(data = vslopes, dv = si,
wid = sub,
within = .(Volatility),
between = .(group, Order))
anova2$ANOVA
# Bayes factors
bf = anovaBF(si ~ Volatility + group + Order, data = vslopes, whichRandom = "sub")
bayesfactor_inclusion(bf) #bayes inclusion values
## separate for session order
anova2a = ezANOVA(data = vslopes %>% filter(Order == 'LV First'),
dv = si,
wid = sub,
within = .(Volatility),
between = .(group))
anova2a$ANOVA
anova2b = ezANOVA(data = vslopes %>% filter(Order == 'HV First'),
dv = si,
wid = sub,
within = .(Volatility),
between = .(group))
anova2b$ANOVA
- General biases
Additionally we examined the general biases:
# ---- descriptive of general bias ----
vslopes %>% group_by(group) %>% summarise(mg = mean(gBias), se = sd(gBias)/sqrt(n()))
# ANOVA shows no differences
anova2 = ezANOVA(data = vslopes, dv = gBias,
wid = sub,
within = .(Volatility),
between = .(group, Order))
anova2$ANOVA
bf = anovaBF(gBias ~ group + Volatility + Order,
data = as.data.frame(vslopes), whichRandom = "sub")
bayesfactor_inclusion(bf) #bayes inclusion values
We then visualize the general biases
# --- general bias
fig_bias = vslopes %>% group_by(group, Volatility, Order) %>%
summarise(mbias = mean(gBias), n = n(), se = sd(gBias)/sqrt(n)) %>%
ggplot(aes(Volatility, mbias, color = Order,linetype = group, group = interaction(Order, group), shape = group)) +
geom_point(size = 3, position = pd) +
geom_line(position = pd) +
geom_errorbar(aes(ymin = mbias - se, ymax = mbias + se), width = 0.2, position = pd) +
theme_classic() + theme(legend.position = 'bottom') + xlab('Volatility') +
ylab('Mean overestimation (ms)')
fig_bias
There was no difference in two groups in general biases, although
both groups were positive overestimated.
Next we examined the reproduced variability:
# ---- Reproduction variability -----
msds_r <- mrep %>%
filter(n>5) %>%
group_by(group, Order, Volatility, sub) %>%
summarise(msd = mean(sdr), n=n(), msd_se = sd(sdr)/sqrt(n))
sd_ANOVA <- ezANOVA(msds_r, dv=msd, wid=sub, between=.(group,Order), within=Volatility)
sd_ANOVA$ANOVA
mmsds_r <- msds_r %>% summarize(mmsd=mean(msd*1000), n = n(), se = sd(msd*1000)/sqrt(n))
pd = position_dodge(width = 0.5)
fig_sd <- ggplot(mmsds_r, aes(Volatility, mmsd, shape = Order, color = Order, group = Order)) +
geom_line() + geom_point() +
#geom_bar(stat = 'identity', position = pd, width = 0.5) +
geom_errorbar(aes(ymin = mmsd - se, ymax = mmsd + se), width = 0.3) +
facet_wrap(~group) +
ylab('Mean Standard Deviation (ms)') + xlab('Volatility') + theme_classic()
# coord_cartesian(ylim = c(140, 200))
fig_sd
if(saveFig){
ggsave('figures/fig_sd.png', fig_sd, width=5, height=4)
ggsave('figures/fig_sd.pdf', fig_sd, width=5, height=4)
}
Correlation analysis
Next we import individual participant ratings and do correlation
analyses.
pinfo = read.csv('data/parinfo.csv')
# join with ctis, sdis
res = left_join(vslopes, pinfo, by = c('group','sequence'))
res$group = as.factor(res$group)
# scatter plot to see any relations
fig_corr = ggduo(res, c('AQ','EQ','BDI'), c('ci','si'), mapping = aes(color = group, shape = Order),
types = list(continuous = 'smooth_lm', se = FALSE),
showStrips = FALSE, legend = 3,
columnLabelsY = c('CTI','SDI')) +
theme_classic() + theme(legend.position = 'bottom', strip.background = element_blank())
if(saveFig){
ggsave('figures/fig_corr.png', fig_corr, width=5, height=4)
ggsave('figures/fig_corr.pdf', fig_corr, width=5, height=4)
}
fig_corr
Get linear regression out
ci_AQ <- function(df){
lm(ci ~ AQ, data = df)
}
ci_EQ <- function(df){
lm(ci ~ EQ, data = df)
}
ci_BDI <- function(df){
lm(ci ~ BDI, data = df)
}
si_AQ <- function(df){
lm(si ~ AQ, data = df)
}
si_EQ <- function(df){
lm(si ~ EQ, data = df)
}
si_BDI <- function(df){
lm(si ~ BDI, data = df)
}
# regression
reg_res <- res %>% group_by(Volatility, group, Order) %>%
nest() %>% # nested data
mutate(ci_AQ = map(data, ci_AQ), ci_EQ = map(data, ci_EQ),
ci_BDI = map(data, ci_BDI),
si_AQ = map(data, si_AQ), si_EQ = map(data, si_EQ),
si_BDI = map(data, si_BDI)) %>%
mutate(mci_AQ = map(ci_AQ, broom::tidy),
mci_EQ = map(ci_EQ, broom::tidy),
mci_BDI = map(ci_BDI, broom::tidy),
msi_AQ = map(si_AQ, broom::tidy),
msi_EQ = map(si_EQ, broom::tidy),
msi_BDI = map(si_BDI, broom::tidy) ) %>%
unnest(cols = c(mci_AQ, mci_EQ, mci_BDI, msi_AQ, msi_EQ, msi_BDI), names_repair = 'unique' , .drop = TRUE) %>%
select(-ci_AQ, -ci_BDI, -ci_EQ, -si_AQ, -si_EQ, -si_BDI, -data,
-starts_with('st')) %>%
filter(term == 'AQ') # remove intercept
Given there is no significant of slopes (after correction), but some
difference in intercepts, we do general linear regression, without
separating groups.
reg_res2 <- res %>% ungroup() %>% group_by(Order, Volatility) %>%
nest() %>% # nested data
mutate(ci_AQ = map(data, ci_AQ), ci_EQ = map(data, ci_EQ),
ci_BDI = map(data, ci_BDI),
si_AQ = map(data, si_AQ), si_EQ = map(data, si_EQ),
si_BDI = map(data, si_BDI)) %>%
mutate(mci_AQ = map(ci_AQ, broom::tidy),
mci_EQ = map(ci_EQ, broom::tidy),
mci_BDI = map(ci_BDI, broom::tidy),
msi_AQ = map(si_AQ, broom::tidy),
msi_EQ = map(si_EQ, broom::tidy),
msi_BDI = map(si_BDI, broom::tidy) ) %>%
unnest(cols = c(mci_AQ, mci_EQ, mci_BDI, msi_AQ, msi_EQ, msi_BDI), names_repair = 'unique' , .drop = TRUE) %>%
select(-ci_AQ, -ci_BDI, -ci_EQ, -si_AQ, -si_EQ, -si_BDI, -data,
-starts_with('st')) %>%
filter(term == 'AQ') # remove intercept
Again, there is no significant of slopes.
LS0tCnRpdGxlOiAiRGF0YSBBbmFseXNpcyBvZiBQcmVkaWN0aXZlIGNvZGluZyBpbiBBU0QiCmF1dGhvcjogIlouIFNoaSwgTC4gVGhlaXNpbmdlciwgRi4gQWxsZW5tYXJrLCBSLiBQaXN0b3JpdXMsIEguIE3DvGxsZXIsIEMuIEZhbHRlci1XYWduZXIiCm91dHB1dDogaHRtbF9ub3RlYm9vawotLS0KCiMgRGF0YSBTdHJ1Y3R1cmUKCjEuIGAvZXhwZXJpbWVudHNgOiBFeHBlcmltZW50YWwgY29kZXMgYW5kIGluc3RydWN0aW9ucwoKVGhpcyBzdWItZm9sZGVyIGNvbnRhaW5zIE1hdGxhYiBjb2RlcyBhbmQgaW5zdHJ1Y3Rpb25zIGZvciB0aGUgZHVyYXRpb24gcmVwcm9kdWN0aW9uIHRhc2suIFRoZSBzZXF1ZW5jZXMgb2YgdGhlIGR1cmF0aW9uIHJlcHJvZHVjdGlvbnMgYXJlIHN0b3JlZCBpbiB0aGUgc3ViLWZvbGRlciBgL2V4cGVyaW1lbnRzL3NlcXNgLiBUaG9zZSBzZXF1ZW5jZXMgd2VyZSB1c2VkIGZvciBtYXRjaGVkIHBhcnRpY2lwYW50cy4gCgoyLiBgL2RhdGFgOiByYXcgZGF0YSBmaWxlcwoKLSBgcmF3ZGF0YS5jc3ZgOiBSYXcgcmVwcm9kdWN0aW9uIHRyaWFscwotIGBvdXRsaWVycy5jc3ZgOiB0aG9zZSBwcm9kdWNlZCBhbG1vc3QgZmxhdCByZXByb2R1Y3Rpb24KCjMuIGAvZmlndXJlc2A6IHN0b3JlIGZpZ3VyZXMgdXNlZCBpbiB0aGUgcGFwZXIuIAoKIyBEYXRhIEFuYWx5c2lzCgojIyAxLiBsb2FkIHJhdyBkYXRhCmBgYHtyIHBhY2thZ2VzLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBpbmNsdWRlPUZBTFNFfQojIGxvYWQgcGFja2FnZXMKbGlicmFyeSh0aWR5dmVyc2UpCmxpYnJhcnkoZXopCmxpYnJhcnkoY293cGxvdCkKbGlicmFyeShCYXllc0ZhY3RvcikgIyBpbiBjYXNlIG5lZWQgQmF5ZXMgZmFjdG9yIGFuYWx5c2lzCmxpYnJhcnkoYmF5ZXN0ZXN0UikKbGlicmFyeShyc3RhdGl4KSAjIHVzaW5nIHRpZHl2ZXJzZSBmcmllbmRseSBzdGF0aXN0aWNzCmxpYnJhcnkoR0dhbGx5KQoKIyAtLS0tIHJlYWQgZGF0YSBhbmQgcHJlcGFyYXRpb24gLS0tLS0KcmF3ZGF0YSA9IHJlYWRfY3N2KCcuL2RhdGEvcmF3ZGF0YS5jc3YnKSAKcmF3ZGF0YSRncm91cCA9IHRvdXBwZXIocmF3ZGF0YSRncm91cCkKIyBmbGFnCnNhdmVGaWcgPSBGQUxTRQpgYGAKClNob3cgdGhlIHJhdyB0cmlhbCBzdHJ1Y3R1cmU6IApgYGB7ciByYXcgdHJpYWwgc3RydWN0dXJlfQpnbGltcHNlKHJhd2RhdGEpCgpgYGAKSW4gdGhlIHJhdyB0cmlhbHMsIHRoZXJlIGFyZSBzZXZlcmFsIGltcG9ydGFudCBjb2x1bW5zIHdoaWNoIGFyZSByZWxldmFudCBmb3IgIGZ1cnRoZXIgYW5hbHlzZXMuIAoKLSBgRHVyYXRpb25gOiBUaGUgdGVzdCBkdXJhdGlvbnMgZ2VuZXJhdGVkIGJ5IGNvbXB1dGVyLiAncGR1cicgaXMgdGhlIGFjdHVhbCBwcmVzZW50ZWQgZHVyYXRpb25zIGJ5IHRoZSBjb21wdXRlci4gVGhlcmUgd2VyZSBzb21lIGZsdWN0dWF0aW9ucywgYnV0IHdpdGhpbiA1IG1zICh3aXRoaW4gMSByZWZyZXNoIGZyYW1lKS4gCi0gYHN1YmAsIGBncm91cGAsIGBzZXF1ZW5jZWAgYXJlIGFub255bWl6ZWQgc3ViamVjdCBudW1iZXIsIGdyb3VwIGFuZCB0aGUgZHVyYXRpb24gc2VxdWVuY2UgdXNlZCBpbiB0aGUgZXhwZXJpbWVudC4gCi0gYFJlcHJvZHVjdGlvbmAsIGByZXBfZXJyYDogdGhlIHJlcHJvZHVjZWQgZHVyYXRpb25zIGFuZCB0aGUgcmVwcm9kdWN0aW9uIGVycm9ycyBjb21wYXJlZCB0byB0aGUgZ2l2ZW4gZHVyYXRpb24uIAotIGBpdGRgLCBgcHJlRHVyYXRpb25gOiB0aGUgaW50ZXItdHJpYWwgZGlmZmVyZW5jZSBpbiAgYSBnaXZlbiB0cmlhbCwgYW5kIHRoZSBkdXJhdGlvbiB1c2VkIGluIHRoZSBwcmV2aW91cyB0cmlhbC4gVGhlc2Ugd2VyZSB1c2VkIGluIHRoZSBzZXF1ZW50aWFsIGVmZmVjdCBhbmFseXNpcy4gCgojIyMgUGFydGljaXBhbnRzCgpgYGB7ciBwYXJ0aWNpcGFudHN9CiMgVG90YWwgcGFydGljaXBhbnRzCnByaW50KGxlbmd0aCAodW5pcXVlKHJhd2RhdGEkc3ViKSkpCiMgdG90YWwgc2VxdWVuY2VzIChwYWlycykKcHJpbnQobGVuZ3RoKHVuaXF1ZShyYXdkYXRhJHNlcXVlbmNlKSkpCmBgYAoKIyMgVGhlIHNhbXBsZWQgZHVyYXRpb25zIGFuZCBzZXF1ZW5jZXMKCkxldCdzIGZpcnN0IGlsbHVzdHJhdGUgdGhlIHNlcXVlbmNlIGFuZCB0aGUgZGlzdHJpYnV0aW9uIG9mIHRoZSBzYW1wbGUgZHVyYXRpb25zLiAKCmBgYHtyIHNlcXVlbmNlfQojIC0tLS0gaWxsdXN0cmF0ZSBvbmUgc2VxdWVuY2UgLS0tLS0KZmlnMTEgPSBnZ3Bsb3QocmF3ZGF0YSwgYWVzKER1cmF0aW9uKSkgKyBnZW9tX2hpc3RvZ3JhbShiaW53aWR0aCA9IDAuMSwgZmlsbCA9IEkoIndoaXRlIiksIGNvbCA9IEkoJ2JsYWNrJykpICsgCiAgdGhlbWVfY2xhc3NpYygpICsgeGxhYignRHVyYXRpb24gKHNlY3MpJykKCiMgYSB0eXBpY2FsIHNlcXVlbmNlCnN1YjEgPSByYXdkYXRhICU+JSBmaWx0ZXIoc3ViID09ICdhcmEyNycpCmZpZzEyID0gZ2dwbG90KHN1YjEsIGFlcyh0cmxObywgRHVyYXRpb24sIGNvbG9yID0gVm9sYXRpbGl0eSkpICsgZ2VvbV9saW5lKCkgKyAKICB4bGFiKCJUcmlhbCBTZXF1ZW5jZSIpICsgdGhlbWVfY2xhc3NpYygpKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICd0b3AnKQoKIyBoaXN0b2dyYW0gb2YgdGhlIHR5cGljYWwgc2VxdWVuY2UKCmZpZzEzID0gZ2dwbG90KHN1YjEsIGFlcyh5PUR1cmF0aW9uLCBjb2xvciA9IFZvbGF0aWxpdHkpKSArIGdlb21fZGVuc2l0eSgpICsgdGhlbWVfY2xhc3NpYygpICsgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gJ3RvcCcpCmZpZzEzCgpmaWcxID0gcGxvdF9ncmlkKGZpZzEyLGZpZzEzLCByZWxfd2lkdGhzID1jKDMsMSkpCmZpZzEgCmlmIChzYXZlRmlnKXsKICBnZ3NhdmUoImZpZ3VyZXMvZmlnX3NlcXVlbmNlLnBuZyIsIGZpZzEsIHdpZHRoPTQsIGhlaWdodD0zLjUpCiAgZ2dzYXZlKCJmaWd1cmVzL2ZpZ19zZXF1ZW5jZS5wZGYiLCBmaWcxLCB3aWR0aD00LCBoZWlnaHQ9My41KQp9CmBgYAoKCiMjIEV4cGxvcmF0aXZlIGRhdGEgYW5hbHlzaXMgYW5kIG91dGxpZXIgZGV0ZWN0aW9uCgpXZSBmaXJzdCBlc3RpbWF0ZSB0d28ga2V5IHNpZ25hdHVyZXMgLSB0aGUgY2VudHJhbCB0ZW5kZW5jeSBpbmRleCAoY2kpIGFuZCB0aGUgc2VxdWVudGlhbCBkZXBlbmRlbmNlIGluZGV4IChzaSkuIAoKYGBge3IgbGluZWFyX21vZGVsc30KIyB1c2luZyBlcnJvciBmb3IgcmVncmVzc2lvbiwgLXNsb3BlIGlzIHRoZSBjZW50cmFsIHRlbmRlbmN5IGluZGV4LiAKY3RfbW9kZWwgPC0gZnVuY3Rpb24oZGYpewogIGxtKHJlcF9lcnIgfiBEdXJhdGlvbiwgZGF0YSA9IGRmKQp9CgojIHNlcXVlbnRpYWwgZWZmZWN0IHVzaW5nIHRoZSBkdXJhdGlvbiBmcm9tIHRoZSBwcmV2aW91cyB0cmlhbApzZXFfbW9kZWwgPC0gZnVuY3Rpb24oZGYpewogIGxtKHJlcF9lcnIgfiBwcmVEdXJhdGlvbiwgZGF0YSA9IGRmKQp9CgojIGV4Y2x1ZGUgZXh0cmVtZSB0cmlhbHMgKGJleW9uZCBbMS8zRCwgM0RdKQp2ZGF0YSA9IHJhd2RhdGEgJT4lIAogIGZpbHRlcihSZXByb2R1Y3Rpb24gPiBEdXJhdGlvbi8zLCBSZXByb2R1Y3Rpb24gPCAzKkR1cmF0aW9uKSAKCiMgY2FsY3VsYXRlIHNsb3BlIGZvciB0aGUgY2VudHJhbCB0ZW5kZW5jeSBhcyB3ZWxsIGFzIHRoZSBzZXF1ZW50aWFsIGRlcGVuZGVuY2UuIApzbG9wZXNfY3QgPC0gdmRhdGEgJT4lIGdyb3VwX2J5KHN1Yiwgc2VxdWVuY2UsIFZvbGF0aWxpdHksIGdyb3VwLCBPcmRlcikgJT4lCiAgbmVzdCgpICAlPiUgICMgbmVzdGVkIGRhdGEKICBtdXRhdGUobW9kZWwgPSBtYXAoZGF0YSwgY3RfbW9kZWwpKSAlPiUgICMgbGluZWFyIHJlZ3Jlc3Npb24KICBtdXRhdGUoc2xvcGUgPSBtYXAobW9kZWwsIGJyb29tOjp0aWR5KSkgJT4lICAjIGdldCBlc3RpbWF0ZXMgb3V0CiAgdW5uZXN0KHNsb3BlLCAuZHJvcCA9IFRSVUUpICU+JSAjIHJlbW92ZSByYXcgZGF0YQogIHNlbGVjdCgtc3RkLmVycm9yLC1zdGF0aXN0aWMsIC1wLnZhbHVlKSAlPiUgICMgcmVtb3ZlIHVubmVjZXNzYXJ5IGNvbHVtbnMKICBzcHJlYWQodGVybSwgZXN0aW1hdGUpICU+JSAgICMgc3ByZWFkIGVzdGltYXRlcwogIHJlbmFtZShpbnRlcmNlcHRfY3QgPSBgKEludGVyY2VwdClgLCBzbG9wZSA9IER1cmF0aW9uKSAlPiUKICBzZWxlY3QoLWRhdGEsIC1tb2RlbCkKCiNzZXF1ZW50aWFsIGVmZmVjdApzbG9wZXNfc2VxIDwtIHZkYXRhICU+JSBmaWx0ZXIoIWlzLm5hKHByZUR1cmF0aW9uKSkgJT4lCiAgZ3JvdXBfYnkoc3ViLCBzZXF1ZW5jZSwgVm9sYXRpbGl0eSwgZ3JvdXAsIE9yZGVyKSAlPiUKICBuZXN0KCkgICU+JSAgIyBuZXN0ZWQgZGF0YQogIG11dGF0ZShtb2RlbCA9IG1hcChkYXRhLCBzZXFfbW9kZWwpKSAlPiUgICMgbGluZWFyIHJlZ3Jlc3Npb24KICBtdXRhdGUoc2xvcGUgPSBtYXAobW9kZWwsIGJyb29tOjp0aWR5KSkgJT4lICAjIGdldCBlc3RpbWF0ZXMgb3V0CiAgdW5uZXN0KHNsb3BlLCAuZHJvcCA9IFRSVUUpICU+JSAjIHJlbW92ZSByYXcgZGF0YQogIHNlbGVjdCgtc3RkLmVycm9yLC1zdGF0aXN0aWMsIC1wLnZhbHVlKSAlPiUgICMgcmVtb3ZlIHVubmVjZXNzYXJ5IGNvbHVtbnMKICBzcHJlYWQodGVybSwgZXN0aW1hdGUpICU+JSAgICMgc3ByZWFkIGVzdGltYXRlcwogIHJlbmFtZShpbnRlcmNlcHRfc2VxID0gYChJbnRlcmNlcHQpYCwgc2VxX3Nsb3BlID0gcHJlRHVyYXRpb24pICU+JSAKICBzZWxlY3QoLWRhdGEsIC1tb2RlbCkKCiMgbWVyZ2UgdHdvIHRhYmxlcyB0b2dldGhlcgpzbG9wZXNfYWxsID0gbGVmdF9qb2luKHNsb3Blc19jdCwgc2xvcGVzX3NlcSwgCiAgICAgICAgICAgICAgICAgICAgICAgYnkgPSBjKCJzdWIiLCAic2VxdWVuY2UiLCAiVm9sYXRpbGl0eSIsImdyb3VwIiwiT3JkZXIiKSkgJT4lIAogIG11dGF0ZShjaSA9IC1zbG9wZSwgc2kgPSBzZXFfc2xvcGUpICAjY2VudHJhbCB0ZW5kZW5jeSBpbmRleAoKIyBlc3RpbWF0ZWQgZ2VuZXJhbCBiaWFzZXMgKG92ZXItL3VuZGVyLWVzdGltYXRlcykKCiMgaW5kaXZpZHVhbCBtZWFuIGludGVydmFsIChtaWRkbGUgcG9pbnQpOiBtb3N0IG9mIHRoZW0gd2VyZSBhcm91bmQgMSBieSBkZXNpZ24KbUludGVydmFsICA9IHZkYXRhICU+JSBncm91cF9ieShzdWIpICU+JSAgc3VtbWFyaXNlKG1EdXIgPSBtZWFuKER1cmF0aW9uKSkKCiMgam9pbiB0aGUgbWVhbiBpbnRlcnZhbCwgYW5kIGVzdGltYXRlIHRoZSBnZW5lcmFsIGJpYXMKc2xvcGVzID0gc2xvcGVzX2FsbCAlPiUgbGVmdF9qb2luKC4sIG1JbnRlcnZhbCwgYnkgPSBjKCdzdWInKSkgJT4lIAogIG11dGF0ZShnQmlhcyA9IChpbnRlcmNlcHRfY3QgKyBzbG9wZSAqIG1EdXIpKjEwMDApCgojIGNoYW5nZSBmYWN0b3Igb3JkZXIgZm9yIHBsb3R0aW5nCnNsb3BlcyRWb2xhdGlsaXR5ID0gZmFjdG9yKHNsb3BlcyRWb2xhdGlsaXR5KQpzbG9wZXMkT3JkZXIgPSBmYWN0b3Ioc2xvcGVzJE9yZGVyKQpzbG9wZXMkZ3JvdXAgPSBmYWN0b3Ioc2xvcGVzJGdyb3VwKQoKaGVhZChzbG9wZXMpCmBgYAoKTGV0J3MgcGxvdCB0aGUgaGlzdG9ncmFtcyBvZiB0aGUgY2VudHJhbCB0ZW5kZW5jeSBpbmRleCBhbmQgdGhlIHNlcXVlbnRpYWwgZGVwZW5kZW5jZSBpbmRleCwgd2hpY2ggc2hvdyBzb21lIG91dGxpZXJzLiBXZSB2aXN1YWxpemUgdGhlIG91dGxpZXJzIHVzaW5nIDMtc2lnbWEgcnVsZS4gVGhlIDMtc2lnbWEgcnVsZSBvbmx5IHJ1bGUgb3V0IDAuMyUgb2YgdGhlIHBvcHVsYXRpb24gaWYgd2UgYXNzdW1lIHRoZSBwb3B1bGF0aW9uIGlzIG5vcm1hbC4gCgpgYGB7cn0KY2lfM3NpZyA9IG1lYW4oc2xvcGVzJGNpKSArIGMoLTEsMSkqMypzZChzbG9wZXMkY2kpCnNpXzNzaWcgPSBtZWFuKHNsb3BlcyRzaSkgKyBjKC0xLDEpKjMqc2Qoc2xvcGVzJHNpKQoKaGlzdDEgPSBnZ3Bsb3Qoc2xvcGVzLCBhZXMoeCA9IGNpLCB5ID0gLi5kZW5zaXR5Li4pKSArIAogIGdlb21faGlzdG9ncmFtKGNvbG91ciA9IDEsIGZpbGwgPSAnd2hpdGUnLCBiaW5zID0gMjApICArIAogIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IGNpXzNzaWcsIGxpbmV0eXBlID0gJ2Rhc2hlZCcsIGNvbG9yID0gJ3JlZCcpICsKICB0aGVtZV9jbGFzc2ljKCkgKyB4bGFiKCdDZW50cmFsIFRlbmRlbmN5IEluZGV4JykKaGlzdDIgPSBnZ3Bsb3Qoc2xvcGVzLCBhZXMoeCA9IHNpLCB5ID0gLi5kZW5zaXR5Li4pKSArIAogIGdlb21faGlzdG9ncmFtKGNvbG91ciA9IDEsIGZpbGwgPSAnd2hpdGUnLCBiaW5zID0gMjApICArIAogICAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gY2lfM3NpZywgbGluZXR5cGUgPSAnZGFzaGVkJywgY29sb3IgPSAncmVkJykgKwogIHRoZW1lX2NsYXNzaWMoKSArIHhsYWIoJ1NlcXVlbnRpYWwgRGVwZW5kZW5jZSBJbmRleCcpCgpoaXN0X2ZpZyA9IHBsb3RfZ3JpZChoaXN0MSxoaXN0MiwgbnJvdyA9IDIpCmhpc3RfZmlnCmlmIChzYXZlRmlnKXsKICBnZ3NhdmUoImZpZ3VyZXMvaGlzdF9maWcucG5nIiwgaGlzdF9maWcsIHdpZHRoPTQsIGhlaWdodD0zLjUpCiAgZ2dzYXZlKCJmaWd1cmVzL2hpc3RfZmlnLnBkZiIsIGZpZzEsIHdpZHRoPTQsIGhlaWdodD0zLjUpCn0KCmBgYAoKTm90ZSwgdGhlIGFib3ZlIG91dGxpZXIgZGV0ZWN0aW9uIG1ldGhvZCBpcyBhZ25vc3RpYyB0byB0aGUgZ3JvdXBzIGFuZCBjb25kaXRpb25zIQoKTGV0J3MgZmluZCBvdXQgdGhvc2Ugb3V0bGllcnMgYW5kIGV4Y2x1ZGUgYnkgc2VxdWVuY2VzIGZvciBmdXJ0aGVyIGFuYWx5c2VzIChnaXZlbiB0aGF0IEFTRCBhbmQgVEQgZ3JvdXBzIHdlcmUgcGFpcmVkKS4gCgpgYGB7cn0Kc2xvcGVzICU+JSB1bmdyb3VwKCkgJT4lIGZpbHRlcihjaSA+IGNpXzNzaWdbMl0gfCBjaSA8IGNpXzNzaWdbMV0gfCBzaSA+IHNpXzNzaWdbMl0gfCBzaSA8IHNpXzNzaWdbMV0pICU+JSBzZWxlY3Qoc2VxdWVuY2UpIC0+IG91dGxpZXJfc2VxCm91dGxpZXJfc2VxJHNlcXVlbmNlCmBgYAoKTm93IGxldCdzIHZpc3VhbGl6ZSB0aGUgb3V0bGllcnMgdG9nZXRoZXIgd2l0aCB0aGVpciBtYXRjaGVkIHBhaXJzLiAKCmBgYHtyIG91dGxpZXJzfQojIC0tLS0gcGxvdCAgb3V0bGllcnMgIC0tLS0KZmlnX291dGxpZXIgPSByYXdkYXRhICU+JSB1bmdyb3VwKCkgJT4lIGZpbHRlcihzZXF1ZW5jZSAlaW4lIG91dGxpZXJfc2VxJHNlcXVlbmNlKSAlPiUgCiAgZmlsdGVyKFJlcHJvZHVjdGlvbiA+IER1cmF0aW9uLzMsIFJlcHJvZHVjdGlvbiA8IDMqRHVyYXRpb24pICU+JSAKICBncm91cF9ieShzdWIsIGdyb3VwLHNlcXVlbmNlLCBWb2xhdGlsaXR5LCBEdXJhdGlvbikgJT4lCiAgc3VtbWFyaXNlKG1SZXAgPSBtZWFuKFJlcHJvZHVjdGlvbiksIHNkcj1zZChSZXByb2R1Y3Rpb24pLCBuID0gbigpLCAKICAgICAgICAgICAgc2UgPSBzZChSZXByb2R1Y3Rpb24pL3NxcnQobi0xKSkgJT4lIGZpbHRlcihuPjUpICU+JSAjYXBwcm94LiBmb3IgbGluZWFyIHJlZ3Jlc3Npb24gd2l0aG91dCBhdmVyYWdpbmcgZmlyc3QKICBnZ3Bsb3QoYWVzKER1cmF0aW9uLCBtUmVwLCBjb2xvciA9IGdyb3VwLCAKICAgICAgICAgICAgIGdyb3VwID0gaW50ZXJhY3Rpb24oZ3JvdXAsIFZvbGF0aWxpdHkpLCAKICAgICAgICAgICAgIHNoYXBlID0gVm9sYXRpbGl0eSwgbGluZXR5cGUgPSBWb2xhdGlsaXR5KSkgKyAKICBnZW9tX3BvaW50KCkgICsgZ2VvbV9zbW9vdGgobWV0aG9kID0gJ2xtJywgc2UgPSBGQUxTRSkgKyAKICBmYWNldF93cmFwKH5zZXF1ZW5jZSwgbmNvbCA9IDQpICsKICB0aGVtZV9jbGFzc2ljKCkgKyB0aGVtZShsZWdlbmQucG9zID0gJ2JvdHRvbScpICsKICBnZW9tX2FibGluZShzbG9wZSA9IDEsIGxpbmV0eXBlID0gMykgKyAKICB4bGFiKCdEdXJhdGlvbiAoU2VjcyknKSArIHlsYWIoJyBSZXByb2R1Y3Rpb24gKFNlY3MpJykgKyAKICB0aGVtZShzdHJpcC5iYWNrZ3JvdW5kID0gZWxlbWVudF9ibGFuaygpLCBzdHJpcC50ZXh0LnggPSBlbGVtZW50X2JsYW5rKCkpCmZpZ19vdXRsaWVyCmlmIChzYXZlRmlnKXsKICBnZ3NhdmUoImZpZ3VyZXMvZmlnX291dGxpZXIucG5nIiwgZmlnX291dGxpZXIsIHdpZHRoPTUsIGhlaWdodD01KQogIGdnc2F2ZSgiZmlndXJlcy9maWdfb3V0bGllci5wZGYiLCBmaWdfb3V0bGllciwgd2lkdGg9NSwgaGVpZ2h0PTUpCn0KYGBgCk1lYW4gc2xvcGVzIGFuZCByZWxhdGVkIHN0YXRpc3RpY3M6CgpgYGB7cn0Kc2xvcGVzICU+JSBmaWx0ZXIoc2VxdWVuY2UgJWluJSBvdXRsaWVyX3NlcSRzZXF1ZW5jZSkgJT4lIGFycmFuZ2UoZ3JvdXAsIFZvbGF0aWxpdHkpCnZzbG9wZXMgPSBzbG9wZXMgJT4lIGZpbHRlcighKHNlcXVlbmNlICVpbiUgb3V0bGllcl9zZXEkc2VxdWVuY2UpKQoKIyBvdXRsaWVycwpvc2xvcGVzID0gc2xvcGVzICU+JSBmaWx0ZXIoc2VxdWVuY2UgJWluJSBvdXRsaWVyX3NlcSRzZXF1ZW5jZSkKCiMgQU5PVkEKZXpBTk9WQShkYXRhID0gb3Nsb3BlcywgZHYgPSBjaSwgCiAgICAgICAgICAgICAgICAgd2lkID0gc3ViLCAKICAgICAgICAgICAgICAgICB3aXRoaW4gPSBWb2xhdGlsaXR5LAogICAgICAgICAgICAgICAgIGJldHdlZW4gPSBncm91cCkKCmBgYAojIyMgT3V0bGllcnMgYW5kIHNlcXVlbnRpYWwgZGVwZW5kZW5jZQoKVmlzdWFsaXplIHRoZSBzdHJvbmcgc2VxdWVudGlhbCBkZXBlbmRlbmNlLiAKCmBgYHtyfQpmaWdfc2RlcDMxID0gcmF3ZGF0YSAlPiUgZmlsdGVyKHNlcXVlbmNlICVpbiUgYygzMSkgKSAlPiUgIyB0aGUgZXh0cmVtZSBzZXF1ZW50aWFsIGRlcGVuZGVuY2UgcGFpcgogIG11dGF0ZV9hdCgicHJlRHVyYXRpb24iLCByb3VuZCwgMSkgJT4lCiAgZ3JvdXBfYnkoc2VxdWVuY2UsIGdyb3VwLCBwcmVEdXJhdGlvbikgJT4lIAogIHN1bW1hcmlzZShyZXBfZXJyID0gbWVhbihyZXBfZXJyKSkgJT4lIAogIGdncGxvdChhZXMocHJlRHVyYXRpb24sIHJlcF9lcnIsIGNvbG9yID0gZ3JvdXApICkgKyAKICAgIGdlb21fcG9pbnQoKSArIGdlb21fc21vb3RoKG1ldGhvZCA9ICdsbScpICsgdGhlbWVfY2xhc3NpYygpICsgCiAgICBnZW9tX2FibGluZShzbG9wZSA9IDAsIGxpbmV0eXBlID0gMikgKyAKIyAgZmFjZXRfd3JhcCh+c2VxdWVuY2UpICsKICAgIHhsYWIoJ0R1cmF0aW9uIHRyaWFsIG4tMScpICsgeWxhYignUmVwci4gRXJyb3IgKFNlY3MpJykgKyAKICB0aGVtZShzdHJpcC5iYWNrZ3JvdW5kID0gZWxlbWVudF9ibGFuaygpLCBzdHJpcC50ZXh0LnggPSBlbGVtZW50X2JsYW5rKCksIGxlZ2VuZC5wb3NpdGlvbiA9ICdib3R0b20nKSAKZmlnX3NkZXAzMQoKZmlnX28gPSBwbG90X2dyaWQoZmlnX291dGxpZXIsIGZpZ19zZGVwMzEsIG5yb3cgPSAxLCBsYWJlbHMgPSBjKCdhJywnYicpLCByZWxfd2lkdGhzID0gYygyLjQsMSkpCmlmIChzYXZlRmlnKXsKICBnZ3NhdmUoImZpZ3VyZXMvZmlnX28ucG5nIiwgZmlnX28sIHdpZHRoPTcsIGhlaWdodD0zKQogIGdnc2F2ZSgiZmlndXJlcy9maWdfby5wZGYiLCBmaWdfbywgd2lkdGg9NywgaGVpZ2h0PTMpCiAgCn0KCgpgYGAKCiMjIFR5cGljYWwgcmVwcm9kdWN0aW9uIHBlcmZvcm1hbmNlIAoKQW5kIGhlcmUgYXJlIHRoZSB0d28gdHlwaWNhbCBwYXJ0aWNpcGFudHMgcHJvZHVjZWQgZXJyb3JzIGZyb20gc2VxdWVuY2UgMTI6CmBgYHtyIHR5cGljYWwgcGFydGljaXBhbnRzfQojIC0tLS0gcmVwcm9kdWN0aW9uIGZpZ3VyZSAtIGFuIGV4YW1wbGUgLS0tLS0KIyBtZWFuIGFuYWx5c2lzCm1yZXAgPSByYXdkYXRhICU+JSB1bmdyb3VwKCkgJT4lIGZpbHRlcighKHNlcXVlbmNlICVpbiUgb3V0bGllcl9zZXEkc2VxdWVuY2UpKSAlPiUgCiAgZmlsdGVyKFJlcHJvZHVjdGlvbiA+IER1cmF0aW9uLzMsIFJlcHJvZHVjdGlvbiA8IDMqRHVyYXRpb24pICU+JSAKICBncm91cF9ieShzdWIsIGdyb3VwLE9yZGVyLCBzZXF1ZW5jZSwgVm9sYXRpbGl0eSwgRHVyYXRpb24pICU+JQogIHN1bW1hcmlzZShtUmVwID0gbWVhbihSZXByb2R1Y3Rpb24pLCBzZHI9c2QoUmVwcm9kdWN0aW9uKSwgbiA9IG4oKSwgCiAgICAgICAgICAgIHNlID0gc2QoUmVwcm9kdWN0aW9uKS9zcXJ0KG4tMSkpICU+JSBmaWx0ZXIobj4zKQoKIyBpbmRpdmlkdWFsIGV4YW1wbGVzCiMgYXNkCmZpZ19hc2QgPSBtcmVwJT4lIAogIGZpbHRlciggc2VxdWVuY2UgPT0gJzExJywgZ3JvdXAgPT0gJ0FTRCcpICU+JSAKICBnZ3Bsb3QoYWVzKER1cmF0aW9uLCBtUmVwLCBjb2xvciA9IFZvbGF0aWxpdHksIGdyb3VwID0gVm9sYXRpbGl0eSwgc2hhcGUgPSBWb2xhdGlsaXR5KSkgKyAKICBnZW9tX3BvaW50KHNpemUgPSAyKSArIAogICNnZW9tX2xpbmUoYWVzKGxpbmV0eXBlID0gVm9sYXRpbGl0eSkpICsgCiAgZ2VvbV9zbW9vdGgobWV0aG9kID0gJ2xtJywgYWVzKGZpbGwgPSBWb2xhdGlsaXR5KSwgc2UgPSBGQUxTRSkgKwogIGdlb21fZXJyb3JiYXIoYWVzKHltaW4gPSBtUmVwIC0gc2UsIHltYXggPSBtUmVwICtzZSksIHdpZHRoID0gMC4wNSkgKyAKICB0aGVtZV9jbGFzc2ljKCkgKyB0aGVtZShzdHJpcC5iYWNrZ3JvdW5kID0gZWxlbWVudF9ibGFuaygpKSArCiAgZ2VvbV9hYmxpbmUoc2xvcGUgPSAxLCBsaW5ldHlwZSA9IDIpICsgCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gJ25vbmUnLCBwbG90Lm1hcmdpbiA9IHVuaXQoYygwLDAsMCwwKSwnY20nKSkgKwogIHlsYWIoJycpICsgeGxhYignJykKCiN0ZApmaWdfdGQgPSBtcmVwJT4lIAogIGZpbHRlciggc2VxdWVuY2UgPT0gJzExJywgZ3JvdXAgPT0gJ1REJykgJT4lIAogIGdncGxvdChhZXMoRHVyYXRpb24sIG1SZXAsIGNvbG9yID0gVm9sYXRpbGl0eSwgZ3JvdXAgPSBWb2xhdGlsaXR5LCBzaGFwZSA9IFZvbGF0aWxpdHkpKSArIAogIGdlb21fcG9pbnQoc2l6ZSA9IDIpICsgCiAgZ2VvbV9zbW9vdGgobWV0aG9kID0gJ2xtJywgYWVzKGZpbGwgPSBWb2xhdGlsaXR5KSwgc2UgPSBGQUxTRSkgKwogIGdlb21fZXJyb3JiYXIoYWVzKHltaW4gPSBtUmVwIC0gc2UsIHltYXggPSBtUmVwICtzZSksIHdpZHRoID0gMC4wNSkgKyAKICB0aGVtZV9jbGFzc2ljKCkgKyB0aGVtZShzdHJpcC5iYWNrZ3JvdW5kID0gZWxlbWVudF9ibGFuaygpKSArCiAgZ2VvbV9hYmxpbmUoc2xvcGUgPSAxLCBsaW5ldHlwZSA9IDIpICsgCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gJ25vbmUnLCBwbG90Lm1hcmdpbiA9IHVuaXQoYygwLDAsMCwwKSwnY20nKSkgKwogIHlsYWIoJycpICsgeGxhYignJykKCiMgZ3JvdXAgbWVhbiByZXByb2R1Y3Rpb25zCgpmaWdfcmVwZF9nciA9IG1yZXAlPiUgCiAgZ2dwbG90KGFlcyhEdXJhdGlvbiwgbVJlcCwgY29sb3IgPSBWb2xhdGlsaXR5LCBncm91cCA9IFZvbGF0aWxpdHksIHNoYXBlID0gVm9sYXRpbGl0eSkpICsgCiAgZ2VvbV9wb2ludChhbHBoYSA9IDAuMikgKyAKICBnZW9tX3Ntb290aChtZXRob2QgPSAnbG0nLCBzZSA9IEZBTFNFLCBhZXMoZmlsbCA9IFZvbGF0aWxpdHkpKSArCiAgdGhlbWVfY2xhc3NpYygpICsgdGhlbWUoc3RyaXAuYmFja2dyb3VuZCA9IGVsZW1lbnRfYmxhbmsoKSkgKwogIGdlb21fYWJsaW5lKHNsb3BlID0gMSwgbGluZXR5cGUgPSAyKSArIAogIGZhY2V0X3dyYXAofmdyb3VwKSArIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9IGMoMC4xLDAuODUpKSArCiAgeGxhYignRHVyYXRpb24gKFNlY3MpJykgKyB5bGFiKCdSZXByb2R1Y3Rpb24gKFNlY3MpJykKCiMgcGxvdCBpbmRpdmlkdWFsIGV4YW1wbGUgYXMgaW5zZXQuIAoKZmlnX21yZXAgPSBnZ2RyYXcoKSArIGRyYXdfcGxvdChmaWdfcmVwZF9ncikgKyAKICBkcmF3X3Bsb3QoZmlnX2FzZCwgeCA9IDAuMywgeSA9IDAuMTMsIHdpZHRoICA9IC4yLCBoZWlnaHQgPSAuMykgKyAKICBkcmF3X3Bsb3QoZmlnX3RkLCB4ID0gMC43NSwgeSA9IDAuMTMsIHdpZHRoICA9IC4yLCBoZWlnaHQgPSAuMykgCiAgCmZpZ19tcmVwCmlmKHNhdmVGaWcpewogIGdnc2F2ZSgiZmlndXJlcy9maWdfcmVwcm9kdWN0aW9uLnBuZyIsIGZpZ19tcmVwLCB3aWR0aD03LCBoZWlnaHQ9My41KQogIGdnc2F2ZSgiZmlndXJlcy9maWdfcmVwcm9kdWN0aW9uLnBkZiIsIGZpZ19tcmVwLCB3aWR0aD03LCBoZWlnaHQ9My41KQp9CmBgYAoKQXMgd2UgY2FuIHNlZSBmcm9tIHRoZSBwYXR0ZXJucyBhYm92ZS4gVGhlIEFTRCBwYXJ0aWNpcGFudCBwcm9kdWNlZCByZWxhdGl2ZSBmbGF0IGVycm9ycywgd2hpbGUgdGhlIFREIHBhcnRpY2lwYW50IHNob3dlZCBhIHN0cm9uZyBjZW50cmFsIHRlbmRlbmN5IGVmZmVjdCAoc2hvcnRzIGJlaW5nIG92ZXJlc3RpbWF0ZWQgYW5kIGxvbmdzIGJlaW5nIHVuZGVyZXN0aW1hdGVkKS4gCgoKIyMjIFZpc3VsaXplIENURSBhbmQgc2VxdWVudGlhbCBkZXBlbmRlbmNlCgpMZXQncyB2aXN1YWxpemUgdGhlIGJpYXNlcyAoY2VudHJhbCB0ZW5kZW5jeSBhbmQgc2VyaWFsIGRlcGVuZGVuY2UpIGZvciB0d28gZ3JvdXBzIChBU0QgdnMuIFREKQoKYGBge3IgcGxvdF9iaWFzZXN9CnBkID0gcG9zaXRpb25fZG9kZ2Uod2lkdGggPSAwLjA1KQoKIyBwbG90IENUSSBhbmQgU0kgdG9nZXRoZXIKZmlnX2JpYXNlcyA9IHZzbG9wZXMlPiUgCiAgZ3JvdXBfYnkoZ3JvdXAsIFZvbGF0aWxpdHksIE9yZGVyKSAlPiUgCiAgc3VtbWFyaXNlKG1zaSA9IG1lYW4oc2kpLCBuID0gbigpLCBzZV9zaSA9IHNkKHNpKS9zcXJ0KG4pLAogICAgICAgICAgICBtY2kgPSBtZWFuKGNpKSwgc2VfY2kgPSBzZChjaSkvc3FydChuKSkgJT4lCiAgZ2dwbG90KGFlcyhtc2ksIG1jaSwgY29sb3IgPSBncm91cCwgc2hhcGUgPSBWb2xhdGlsaXR5LCAKICAgICAgICAgICAgICBncm91cD1pbnRlcmFjdGlvbihPcmRlciwgZ3JvdXApKSkgKyAKICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwLCBjb2xvciA9ICdncmF5JywgbGluZXR5cGUgPSAnZGFzaGVkJykgKyAKICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAwLCBjb2xvciA9ICdncmF5JywgbGluZXR5cGUgPSAnZGFzaGVkJykgKyAKICBnZW9tX3BvaW50KHNpemUgPSAyKSArIAogIGdlb21fbGluZShhZXMobGluZXR5cGUgPSBPcmRlcikpICsgCiAgZ2VvbV9lcnJvcmJhcihhZXMoeW1pbiA9IG1jaSAtIHNlX2NpLCB5bWF4ID0gbWNpICsgc2VfY2kpLCB3aWR0aCA9IDAuMDEgKSArIAogIGdlb21fZXJyb3JiYXJoKGFlcyh4bWluID0gbXNpIC0gc2Vfc2ksIHhtYXggPSBtc2kgKyBzZV9zaSksIGhlaWdodCA9IDAuMDEpICsgCiAgeGxhYignU2VyaWFsIERlcGVuZGVuY2UnKSArIHlsYWIoJ0NlbnRyYWwgVGVuZGVuY3knKSArIAogIHNjYWxlX3lfY29udGludW91cyhsYWJlbHMgPSBzY2FsZXM6OnBlcmNlbnQpICsgCiAgc2NhbGVfeF9jb250aW51b3VzKGxhYmVscyA9IHNjYWxlczo6cGVyY2VudCkgKyAKICBndWlkZXMoY29sb3IgPSBndWlkZV9sZWdlbmQodGl0bGUgPSAnR3JvdXAnKSwgCiAgICAgICAgIGxpbmV0eXBlID0gZ3VpZGVfbGVnZW5kKHRpdGxlID0gJ1ZvbGF0aWxpdHkgT3JkZXInKSwKICAgICAgICAgKSArCiAgdGhlbWVfY2xhc3NpYygpICsKICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAnYm90dG9tJykKZmlnX2JpYXNlcwppZiAoc2F2ZUZpZyl7CiAgZ2dzYXZlKCJmaWd1cmVzL2ZpZ19iaWFzZXMucG5nIiwgZmlnX2JpYXNlcywgd2lkdGg9NSwgaGVpZ2h0PTQpCiAgZ2dzYXZlKCJmaWd1cmVzL2ZpZ19iaWFzZXMucGRmIiwgZmlnX2JpYXNlcywgd2lkdGg9NSwgaGVpZ2h0PTQpCn0KCgpgYGAKCkJ5IHZpc3VhbCBpbnNwZWN0aW9uLCBpbmRpdmlkdWFscyB3aXRoIEFTRCBleGhpYml0ZWQgbGVzcyBjZW50cmFsIHRlbmRlbmN5IHJlbGF0aXZlIHRvIHRoZWlyIG1hdGNoZWQgVEQgY29udHJvbHMgKHRoZSByZWQgbGluZXMgYmVsb3cgdGhlIGN5YW4gbGluZXMgaW4gdGhlIGFib3ZlIGZpZ3VyZSksIHdoaWxlIHRoZSBsb2NhbCBzZXJpYWwgZGVwZW5kZW5jZSB3YXMgcmVsYXRpdmVseSBjb21wYXJhYmxlIGJldHdlZW4gdHdvIGdyb3VwcyBleGNlcHQgaW4gdGhlIGxvdyB2b2xhdGlsaXR5IGNvbmRpdGlvbiB3aGVuIHRoYXQgY29uZGl0aW9uIHN0YXJ0ZWQgZmlyc3QuIEludGVyZXN0aW5nbHksIHRoZSBjZW50cmFsIHRlbmRlbmN5IGFuZCBzZXJpYWwgZGVwZW5kZW5jZSB3ZXJlIHNpbWlsYXIgZm9yIGJvdGggZ3JvdXBzIHdoZW4gdGhlIGhpZ2gtdm9sYXRpbGl0eSBzZXNzaW9uIHN0YXJ0ZWQgZmlyc3QgKHRoZSBzb2xpZCBsaW5lcyksIHdoaWxlIHRoZXkgZGlmZmVyZWQgd2hlbiB0aGUgbG93LXZvbGF0aWxpdHkgc2Vzc2lvbiBzdGFydGVkIGZpcnN0ICh0aGUgZGFzaGVkIGxpbmVzKS4gCgpHaXZlbiB0aGF0IHRoZSBtYWluIGRpZmZlcmVuY2Ugd2FzIHNob3duIGluIENURS4gV2UgZnVydGhlciBwbG90IHRoZSBtZWFuIENURXMuIAoKYGBge3J9CiNwZCA9IHBvc2l0aW9uX2RvZGdlKHdpZHRoID0gMC41KQojIHNlcGFyYXRlIHBsb3RzIGZvciBhcHBlbmRpeApmaWdfY3RpID0gdnNsb3BlcyAlPiUgCiAgZ3JvdXBfYnkoZ3JvdXAsIFZvbGF0aWxpdHksIE9yZGVyKSAlPiUgCiAgc3VtbWFyaXNlKG1jaSA9IG1lYW4oY2kpLCBuID0gbigpLCBzZSA9IHNkKGNpKS9zcXJ0KG4pKSAlPiUKICBnZ3Bsb3QoYWVzKFZvbGF0aWxpdHksIG1jaSwgc2hhcGUgPSBPcmRlciwgY29sb3IgPSBPcmRlciwgZ3JvdXAgPSBPcmRlcikpICsgCiAgZ2VvbV9saW5lKCkgKyBnZW9tX3BvaW50KHNpemU9IDIpICsgCiAgI2dlb21fYmFyKHN0YXQgPSAnaWRlbnRpdHknLCBwb3NpdGlvbiA9IHBkLCB3aWR0aCA9IDAuNSkgKyAKICBmYWNldF93cmFwKH5ncm91cCkrCiAgZ2VvbV9lcnJvcmJhcihhZXMoeW1pbiA9IG1jaSAtIHNlLCB5bWF4ID0gbWNpICsgc2UpLCB3aWR0aCA9IDAuMikgKyAKICB0aGVtZV9jbGFzc2ljKCkgKyB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAnYm90dG9tJywgc3RyaXAuYmFja2dyb3VuZCA9IGVsZW1lbnRfYmxhbmsoKSkgKwogIHhsYWIoJ1ZvbGF0aWxpdHknKSArIHlsYWIoJ0NUSScpICsgCiAgc2NhbGVfeV9jb250aW51b3VzKGxhYmVscyA9IHNjYWxlczo6cGVyY2VudCkgKyAKICBndWlkZXMoY29sb3IgPSBndWlkZV9sZWdlbmQodGl0bGUgPSAnT3JkZXInKSwgZmlsbCA9IGd1aWRlX2xlZ2VuZCh0aXRsZSA9ICdPcmRlcicpKQpmaWdfY3RpCgpgYGAKTGV0J3MgZG8gdGhlIHNlcXVlbnRpYWwgZGVwZW5kZW5jZSBhcyB3ZWxsLiAKCmBgYHtyfQpwZCA9IHBvc2l0aW9uX2RvZGdlKHdpZHRoID0gMC41KQojIHNlcGFyYXRlIHBsb3RzIGZvciBhcHBlbmRpeApmaWdfc2RpID0gdnNsb3BlcyAlPiUgCiAgZ3JvdXBfYnkoZ3JvdXAsIFZvbGF0aWxpdHksIE9yZGVyKSAlPiUgCiAgc3VtbWFyaXNlKG1zaSA9IG1lYW4oc2kpLCBuID0gbigpLCBzZSA9IHNkKHNpKS9zcXJ0KG4pKSAlPiUKICBnZ3Bsb3QoYWVzKFZvbGF0aWxpdHksIG1zaSwgc2hhcGUgPSBPcmRlciwgY29sb3IgPSBPcmRlciwgZ3JvdXAgPSBPcmRlcikpICsgCiAgZ2VvbV9saW5lKCkgKyBnZW9tX3BvaW50KHNpemUgPSAyKSArCiAgI2dlb21fYmFyKHN0YXQgPSAnaWRlbnRpdHknLCBwb3NpdGlvbiA9IHBkLCB3aWR0aCA9IDAuNSkgKyAKICBmYWNldF93cmFwKH5ncm91cCkrCiAgZ2VvbV9lcnJvcmJhcihhZXMoeW1pbiA9IG1zaSAtIHNlLCB5bWF4ID0gbXNpICsgc2UpLCB3aWR0aCA9IDAuMikgKyAKICB0aGVtZV9jbGFzc2ljKCkgKyB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAnYm90dG9tJywgc3RyaXAuYmFja2dyb3VuZCA9IGVsZW1lbnRfYmxhbmsoKSkgKwogIHhsYWIoJ1ZvbGF0aWxpdHknKSArIHlsYWIoJ1NESScpICsgCiAgc2NhbGVfeV9jb250aW51b3VzKGxhYmVscyA9IHNjYWxlczo6cGVyY2VudCkgKyAKICBndWlkZXMoY29sb3IgPSBndWlkZV9sZWdlbmQodGl0bGUgPSAnT3JkZXInKSwgZmlsbCA9IGd1aWRlX2xlZ2VuZCh0aXRsZSA9ICdPcmRlcicpKQpmaWdfc2RpCmZpZzMgPSBwbG90X2dyaWQoZmlnX2N0aSwgZmlnX3NkaSwgbnJvdyA9IDEsIGxhYmVscyA9IGMoImEiLCJiIikpCmZpZzMKaWYgKHNhdmVGaWcpewogIGdnc2F2ZSgnZmlndXJlcy9maWczLnBkZicsZmlnMywgd2lkdGggPSA3LCBoZWlnaHQgPSAzLjUpCiAgZ2dzYXZlKCdmaWd1cmVzL2ZpZzMucG5nJyxmaWczLCB3aWR0aCA9IDcsIGhlaWdodCA9IDMuNSkKfQoKYGBgCgojIyMgU3RhdGlzdGljcwoKMS4gQ2VudHJhbCB0ZW5kZW5jeSBlZmZlY3QKCkF2ZXJhZ2UgQ1RJcwpgYGB7cn0KdnNsb3BlcyAlPiUgZ3JvdXBfYnkoZ3JvdXApICU+JSBzdW1tYXJpc2UobWN0aSA9IG1lYW4oY2kpKQp2c2xvcGVzICU+JSBncm91cF9ieShWb2xhdGlsaXR5KSAlPiUgc3VtbWFyaXNlKG1jdGkgPSBtZWFuKGNpKSkKdnNsb3BlcyAlPiUgZ3JvdXBfYnkoT3JkZXIpICU+JSBzdW1tYXJpc2UobWN0aSA9IG1lYW4oY2kpKQojIGNhbGN1bGF0ZSBtZWFuIGVsZXZhdGVkIENUSXMgYmV0d2VlbiBIViBGaXJzdCB2cy4gTFYgRmlyc3QKdnNsb3BlcyAlPiUgZ3JvdXBfYnkoZ3JvdXAsIFZvbGF0aWxpdHksIE9yZGVyKSAlPiUgc3VtbWFyaXNlKG1jdGkgPSBtZWFuKGNpKSkgJT4lCiAgcGl2b3Rfd2lkZXIobmFtZXNfZnJvbSA9IE9yZGVyLCB2YWx1ZXNfZnJvbSA9IG1jdGkpICU+JSAKICBtdXRhdGUoZENUSSA9IGBIViBGaXJzdGAgLSBgTFYgRmlyc3RgKSAlPiUgCiAgZ3JvdXBfYnkoZ3JvdXApICU+JSBzdW1tYXJpc2UobWQgPSBtZWFuKGRDVEkpKQpgYGAKCgpgYGB7ciBBTk9WQXNfY3RpfQp2c2xvcGVzID0gYXMuZGF0YS5mcmFtZSh2c2xvcGVzKSAjIHJlcXVpcmVkIGJ5IHJzdGF0aXgKIyAtLS0tIGNlbnRyYWwgdGVuZGVuY3kgaW5kZXgtLS0tCiMgcmVwZWF0ZWQgbWVhc3VyZXMgQU5PVkEgb24gY2VudHJhbCB0ZW5kZW5jeSBpbmRleAphbm92YTEgPSBhbm92YV90ZXN0KGRhdGEgPSB2c2xvcGVzLCBkdiA9IGNpLCAKICAgICAgICAgICAgICAgICB3aWQgPSBzdWIsIAogICAgICAgICAgICAgICAgIHdpdGhpbiA9IFZvbGF0aWxpdHksCiAgICAgICAgICAgICAgICAgYmV0d2VlbiA9IGMoZ3JvdXAsIE9yZGVyKSkKYW5vdmExCgojIyBzZXBhcmF0ZSBmb3IgVm9sYXRpbGl0eSBvcmRlcgphbm92YTFhID0gYW5vdmFfdGVzdChkYXRhID0gdnNsb3BlcyAlPiUgZmlsdGVyKGdyb3VwID09ICdBU0QnKSwgCiAgICAgICAgICAgICAgICAgIGR2ID0gY2ksIAogICAgICAgICAgICAgICAgICB3aWQgPSBzdWIsIAogICAgICAgICAgICAgICAgICB3aXRoaW4gPSBWb2xhdGlsaXR5LAogICAgICAgICAgICAgICAgICBiZXR3ZWVuID0gT3JkZXIpCmFub3ZhMWEKCmFub3ZhMWIgPSBhbm92YV90ZXN0KGRhdGEgPSB2c2xvcGVzICAlPiUgZmlsdGVyKGdyb3VwID09ICdURCcpLCAKICAgICAgICAgICAgICAgICAgZHYgPSBjaSwgCiAgICAgICAgICAgICAgICAgIHdpZCA9IHN1YiwgCiAgICAgICAgICAgICAgICAgIHdpdGhpbiA9IFZvbGF0aWxpdHksCiAgICAgICAgICAgICAgICAgIGJldHdlZW4gPSBPcmRlcikKYW5vdmExYgoKYGBgCgoKCjIuIEJheWVzIGZhY3RvciBhbmFseXNpcyBmb3IgcGFpci13aXNlIGNvbXBhcmlzb24KClRoZSBhYm92ZSBhbmFseXNpcyBzaG93ZWQgdGhhdCB0aGUgbWFpbiBkaWZmZXJlbmNlIGNhbWUgZnJvbSB0aGUgY2VudHJhbCB0ZW5kZW5jeS4gSGVyZSB3ZSBmdXJ0aGVyIGdldCB0aGUgY2VudHJhbCB0ZW5kZW5jeSBiaWFzIGFuZCBCYXllcyBmYWN0b3IgYW5hbHlzZXM6CmBgYHtyIGN0aV9iYXllc30KCiMgLS0tIEJheWVzIHQtdGVzdHMKYmZ0ZXN0ID0gZnVuY3Rpb24oZGYpewogIGRmID0gYXMuZGF0YS5mcmFtZShkZikKICAjIGdldCB0aGUgbWVhbnMKICByZGYgPSBkZiU+JSBzdW1tYXJpc2UobWNpID0gbWVhbihjaSksIAogICAgICAgICAgICAgICAgICAgICAgICBzZV9jaSA9IHNkKGNpKS9zcXJ0KG4oKSksCiAgICAgICAgICAgICAgICAgICAgICAgIG1zaSA9IG1lYW4oc2kpLCAKICAgICAgICAgICAgICAgICAgICAgICAgc2Vfc2kgPSBzZChzaSkvc3FydChuKCkpKQogIHJkZiRjaV9iZiA9IHR0ZXN0QkYoZGYkY2ksIG11ID0gMCkgJT4lIGV4dHJhY3RCRigpICU+JSAuJGJmCiAgcmRmJHNpX2JmID0gdHRlc3RCRihkZiRzaSwgbXUgPSAwKSAlPiUgZXh0cmFjdEJGKCkgJT4lIC4kYmYKICByZXR1cm4ocmRmKQp9Cgp2c2xvcGVzICU+JSBncm91cF9ieShncm91cCwgVm9sYXRpbGl0eSwgT3JkZXIpICU+JSBuZXN0KCkgJT4lCiAgbXV0YXRlKGJmID0gbWFwKGRhdGEsIGJmdGVzdCkpICU+JSB1bm5lc3QoYmYsIC5kcm9wID0gVFJVRSkKCiMgZ3JvdXAgY29tcGFyaXNvbiBmb3IgdGhlIGxvdy12b2wtZmlyc3QsIGhpZ2gtdm9sIHNlc3Npb24KdnNsb3BlcyAlPiUgZmlsdGVyKFZvbGF0aWxpdHkgPT0gJ0hpZ2ggVm9sYS4nLCBPcmRlciA9PSAnTFYgRmlyc3QnKSAlPiUgYXMuZGF0YS5mcmFtZSgpIC0+djExCnRfdGVzdChkYXRhID0gdjExLCBmb3JtdWxhID0gY2kgfiBncm91cCkgCnR0ZXN0QkYoZGF0YSA9IHYxMSwgZm9ybXVsYSA9IGNpIH4gZ3JvdXApCgp2c2xvcGVzICU+JSBmaWx0ZXIoVm9sYXRpbGl0eSA9PSAnTG93IFZvbGEuJywgT3JkZXIgPT0gJ0xWIEZpcnN0JykgJT4lIGFzLmRhdGEuZnJhbWUoKSAtPnYxMgp0X3Rlc3QoZGF0YSA9IHYxMiwgZm9ybXVsYSA9IGNpIH4gZ3JvdXApIAp0dGVzdEJGKGRhdGEgPSB2MTIsIGZvcm11bGEgPSBjaSB+IGdyb3VwKQpgYGAKCgozLiBBTk9WQSBhbmFseXNlcyBmb3IgdGhlIHNlcmlhbCBkZXBlbmRlbmNlIGluZGljZXM6CgpgYGB7ciBBTk9WQXNfc2RpfQojIC0tLS0gU2VyaWFsIGRlcGVuZGVuY2UgaW5kZXgtLS0tCmFub3ZhMiA9IGV6QU5PVkEoZGF0YSA9IHZzbG9wZXMsIGR2ID0gc2ksIAogICAgICAgICAgICAgICAgIHdpZCA9IHN1YiwgCiAgICAgICAgICAgICAgICAgd2l0aGluID0gLihWb2xhdGlsaXR5KSwKICAgICAgICAgICAgICAgICBiZXR3ZWVuID0gLihncm91cCwgT3JkZXIpKQphbm92YTIkQU5PVkEKCiMgQmF5ZXMgZmFjdG9ycwpiZiA9IGFub3ZhQkYoc2kgfiBWb2xhdGlsaXR5ICsgZ3JvdXAgKyBPcmRlciwgZGF0YSA9IHZzbG9wZXMsIHdoaWNoUmFuZG9tID0gInN1YiIpCmJheWVzZmFjdG9yX2luY2x1c2lvbihiZikgI2JheWVzIGluY2x1c2lvbiB2YWx1ZXMKCiMjIHNlcGFyYXRlIGZvciBzZXNzaW9uIG9yZGVyCmFub3ZhMmEgPSBlekFOT1ZBKGRhdGEgPSB2c2xvcGVzICU+JSBmaWx0ZXIoT3JkZXIgPT0gJ0xWIEZpcnN0JyksIAogICAgICAgICAgICAgICAgICBkdiA9IHNpLCAKICAgICAgICAgICAgICAgICAgd2lkID0gc3ViLCAKICAgICAgICAgICAgICAgICAgd2l0aGluID0gLihWb2xhdGlsaXR5KSwKICAgICAgICAgICAgICAgICAgYmV0d2VlbiA9IC4oZ3JvdXApKQphbm92YTJhJEFOT1ZBCgphbm92YTJiID0gZXpBTk9WQShkYXRhID0gdnNsb3BlcyAlPiUgZmlsdGVyKE9yZGVyID09ICdIViBGaXJzdCcpLCAKICAgICAgICAgICAgICAgICAgZHYgPSBzaSwgCiAgICAgICAgICAgICAgICAgIHdpZCA9IHN1YiwgCiAgICAgICAgICAgICAgICAgIHdpdGhpbiA9IC4oVm9sYXRpbGl0eSksCiAgICAgICAgICAgICAgICAgIGJldHdlZW4gPSAuKGdyb3VwKSkKYW5vdmEyYiRBTk9WQQoKYGBgCgoKCjQuIEdlbmVyYWwgYmlhc2VzCgpBZGRpdGlvbmFsbHkgd2UgZXhhbWluZWQgdGhlIGdlbmVyYWwgYmlhc2VzOgpgYGB7ciBnQmlhc30KIyAtLS0tIGRlc2NyaXB0aXZlIG9mIGdlbmVyYWwgYmlhcyAtLS0tCnZzbG9wZXMgJT4lIGdyb3VwX2J5KGdyb3VwKSAlPiUgc3VtbWFyaXNlKG1nID0gbWVhbihnQmlhcyksIHNlID0gc2QoZ0JpYXMpL3NxcnQobigpKSkgCgojIEFOT1ZBIHNob3dzIG5vIGRpZmZlcmVuY2VzCmFub3ZhMiA9IGV6QU5PVkEoZGF0YSA9IHZzbG9wZXMsIGR2ID0gZ0JpYXMsIAogICAgICAgICAgICAgICAgIHdpZCA9IHN1YiwgCiAgICAgICAgICAgICAgICAgd2l0aGluID0gLihWb2xhdGlsaXR5KSwKICAgICAgICAgICAgICAgICBiZXR3ZWVuID0gLihncm91cCwgT3JkZXIpKQphbm92YTIkQU5PVkEKCmJmID0gYW5vdmFCRihnQmlhcyB+ICBncm91cCArIFZvbGF0aWxpdHkgKyBPcmRlciwgCiAgICAgICAgICAgICBkYXRhID0gYXMuZGF0YS5mcmFtZSh2c2xvcGVzKSwgd2hpY2hSYW5kb20gPSAic3ViIikKYmF5ZXNmYWN0b3JfaW5jbHVzaW9uKGJmKSAjYmF5ZXMgaW5jbHVzaW9uIHZhbHVlcwoKCmBgYApXZSB0aGVuIHZpc3VhbGl6ZSB0aGUgZ2VuZXJhbCBiaWFzZXMKYGBge3IgcGxvdGdCaWFzfQojIC0tLSBnZW5lcmFsIGJpYXMKZmlnX2JpYXMgPSB2c2xvcGVzICU+JSBncm91cF9ieShncm91cCwgVm9sYXRpbGl0eSwgT3JkZXIpICU+JQogIHN1bW1hcmlzZShtYmlhcyA9IG1lYW4oZ0JpYXMpLCBuID0gbigpLCBzZSA9IHNkKGdCaWFzKS9zcXJ0KG4pKSAlPiUKICBnZ3Bsb3QoYWVzKFZvbGF0aWxpdHksIG1iaWFzLCBjb2xvciA9IE9yZGVyLGxpbmV0eXBlID0gZ3JvdXAsIGdyb3VwID0gaW50ZXJhY3Rpb24oT3JkZXIsIGdyb3VwKSwgc2hhcGUgPSBncm91cCkpICsgCiAgZ2VvbV9wb2ludChzaXplID0gMywgcG9zaXRpb24gPSBwZCkgKyAKICBnZW9tX2xpbmUocG9zaXRpb24gPSBwZCkgKwogIGdlb21fZXJyb3JiYXIoYWVzKHltaW4gPSBtYmlhcyAtIHNlLCB5bWF4ID0gbWJpYXMgKyBzZSksIHdpZHRoID0gMC4yLCBwb3NpdGlvbiA9IHBkKSArIAogIHRoZW1lX2NsYXNzaWMoKSAgKyB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAnYm90dG9tJykgKyB4bGFiKCdWb2xhdGlsaXR5JykgKyAKICB5bGFiKCdNZWFuIG92ZXJlc3RpbWF0aW9uIChtcyknKSAKZmlnX2JpYXMKYGBgCgpUaGVyZSB3YXMgbm8gZGlmZmVyZW5jZSBpbiB0d28gZ3JvdXBzIGluIGdlbmVyYWwgYmlhc2VzLCBhbHRob3VnaCBib3RoIGdyb3VwcyB3ZXJlIHBvc2l0aXZlIG92ZXJlc3RpbWF0ZWQuIAoKTmV4dCB3ZSBleGFtaW5lZCB0aGUgcmVwcm9kdWNlZCB2YXJpYWJpbGl0eToKYGBge3IgcmVwX3Zhcn0KIyAtLS0tIFJlcHJvZHVjdGlvbiB2YXJpYWJpbGl0eSAtLS0tLQptc2RzX3IgPC0gbXJlcCAgJT4lIAogIGZpbHRlcihuPjUpICU+JSAKICBncm91cF9ieShncm91cCwgT3JkZXIsIFZvbGF0aWxpdHksICBzdWIpICU+JQogIHN1bW1hcmlzZShtc2QgPSBtZWFuKHNkciksIG49bigpLCBtc2Rfc2UgPSBzZChzZHIpL3NxcnQobikpCiAgCgpzZF9BTk9WQSA8LSBlekFOT1ZBKG1zZHNfciwgZHY9bXNkLCB3aWQ9c3ViLCBiZXR3ZWVuPS4oZ3JvdXAsT3JkZXIpLCB3aXRoaW49Vm9sYXRpbGl0eSkKc2RfQU5PVkEkQU5PVkEKCm1tc2RzX3IgPC0gbXNkc19yICU+JSBzdW1tYXJpemUobW1zZD1tZWFuKG1zZCoxMDAwKSwgbiA9IG4oKSwgc2UgPSBzZChtc2QqMTAwMCkvc3FydChuKSkKCnBkID0gcG9zaXRpb25fZG9kZ2Uod2lkdGggPSAwLjUpCmZpZ19zZCA8LSBnZ3Bsb3QobW1zZHNfciwgYWVzKFZvbGF0aWxpdHksIG1tc2QsIHNoYXBlID0gT3JkZXIsIGNvbG9yID0gT3JkZXIsIGdyb3VwID0gT3JkZXIpKSArIAogIGdlb21fbGluZSgpICsgZ2VvbV9wb2ludCgpICsgCiAgI2dlb21fYmFyKHN0YXQgPSAnaWRlbnRpdHknLCBwb3NpdGlvbiA9IHBkLCB3aWR0aCA9IDAuNSkgKyAKICBnZW9tX2Vycm9yYmFyKGFlcyh5bWluID0gbW1zZCAtIHNlLCB5bWF4ID0gbW1zZCArIHNlKSwgd2lkdGggPSAwLjMpICsKICBmYWNldF93cmFwKH5ncm91cCkgKwogIHlsYWIoJ01lYW4gU3RhbmRhcmQgRGV2aWF0aW9uIChtcyknKSArIHhsYWIoJ1ZvbGF0aWxpdHknKSArIHRoZW1lX2NsYXNzaWMoKSAgCiMgIGNvb3JkX2NhcnRlc2lhbih5bGltID0gYygxNDAsIDIwMCkpIApmaWdfc2QKCmlmKHNhdmVGaWcpewogIGdnc2F2ZSgnZmlndXJlcy9maWdfc2QucG5nJywgZmlnX3NkLCB3aWR0aD01LCBoZWlnaHQ9NCkKICBnZ3NhdmUoJ2ZpZ3VyZXMvZmlnX3NkLnBkZicsIGZpZ19zZCwgd2lkdGg9NSwgaGVpZ2h0PTQpCn0KCgoKYGBgCgojIyBDb3JyZWxhdGlvbiBhbmFseXNpcwoKTmV4dCB3ZSBpbXBvcnQgaW5kaXZpZHVhbCBwYXJ0aWNpcGFudCByYXRpbmdzIGFuZCBkbyBjb3JyZWxhdGlvbiBhbmFseXNlcy4gCgpgYGB7ciBwYXJpbmZvfQpwaW5mbyA9IHJlYWQuY3N2KCdkYXRhL3BhcmluZm8uY3N2JykKCiMgam9pbiB3aXRoIGN0aXMsIHNkaXMKcmVzID0gbGVmdF9qb2luKHZzbG9wZXMsIHBpbmZvLCBieSA9IGMoJ2dyb3VwJywnc2VxdWVuY2UnKSkKcmVzJGdyb3VwID0gYXMuZmFjdG9yKHJlcyRncm91cCkKCiMgc2NhdHRlciBwbG90IHRvIHNlZSBhbnkgcmVsYXRpb25zCmZpZ19jb3JyID0gZ2dkdW8ocmVzLCBjKCdBUScsJ0VRJywnQkRJJyksIGMoJ2NpJywnc2knKSwgbWFwcGluZyA9IGFlcyhjb2xvciA9IGdyb3VwLCBzaGFwZSA9IE9yZGVyKSwKICAgICAgdHlwZXMgPSBsaXN0KGNvbnRpbnVvdXMgPSAnc21vb3RoX2xtJywgc2UgPSBGQUxTRSksIAogICAgICBzaG93U3RyaXBzID0gRkFMU0UsIGxlZ2VuZCA9IDMsCiAgICAgIGNvbHVtbkxhYmVsc1kgPSBjKCdDVEknLCdTREknKSkgKyAKICB0aGVtZV9jbGFzc2ljKCkgKyB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAnYm90dG9tJywgc3RyaXAuYmFja2dyb3VuZCA9IGVsZW1lbnRfYmxhbmsoKSkgCmlmKHNhdmVGaWcpewogIGdnc2F2ZSgnZmlndXJlcy9maWdfY29yci5wbmcnLCBmaWdfY29yciwgd2lkdGg9NSwgaGVpZ2h0PTQpCiAgZ2dzYXZlKCdmaWd1cmVzL2ZpZ19jb3JyLnBkZicsIGZpZ19jb3JyLCB3aWR0aD01LCBoZWlnaHQ9NCkKfQoKZmlnX2NvcnIKYGBgCiBHZXQgbGluZWFyIHJlZ3Jlc3Npb24gb3V0CiAKYGBge3J9CmNpX0FRIDwtIGZ1bmN0aW9uKGRmKXsKICBsbShjaSB+IEFRLCBkYXRhID0gZGYpCn0KY2lfRVEgPC0gZnVuY3Rpb24oZGYpewogIGxtKGNpIH4gRVEsIGRhdGEgPSBkZikKfQpjaV9CREkgPC0gZnVuY3Rpb24oZGYpewogIGxtKGNpIH4gQkRJLCBkYXRhID0gZGYpCn0KCnNpX0FRIDwtIGZ1bmN0aW9uKGRmKXsKICBsbShzaSB+IEFRLCBkYXRhID0gZGYpCn0Kc2lfRVEgPC0gZnVuY3Rpb24oZGYpewogIGxtKHNpIH4gRVEsIGRhdGEgPSBkZikKfQpzaV9CREkgPC0gZnVuY3Rpb24oZGYpewogIGxtKHNpIH4gQkRJLCBkYXRhID0gZGYpCn0KCiMgcmVncmVzc2lvbgpyZWdfcmVzIDwtIHJlcyAlPiUgZ3JvdXBfYnkoVm9sYXRpbGl0eSwgZ3JvdXAsIE9yZGVyKSAlPiUKICBuZXN0KCkgICU+JSAgIyBuZXN0ZWQgZGF0YQogIG11dGF0ZShjaV9BUSA9IG1hcChkYXRhLCBjaV9BUSksIGNpX0VRID0gbWFwKGRhdGEsIGNpX0VRKSwKICAgICAgICAgY2lfQkRJID0gbWFwKGRhdGEsIGNpX0JESSksIAogICAgICAgICBzaV9BUSA9IG1hcChkYXRhLCBzaV9BUSksIHNpX0VRID0gbWFwKGRhdGEsIHNpX0VRKSwKICAgICAgICAgc2lfQkRJID0gbWFwKGRhdGEsIHNpX0JESSkpICU+JQogIG11dGF0ZShtY2lfQVEgPSBtYXAoY2lfQVEsIGJyb29tOjp0aWR5KSwgCiAgICAgICAgIG1jaV9FUSA9IG1hcChjaV9FUSwgYnJvb206OnRpZHkpLAogICAgICAgICBtY2lfQkRJID0gbWFwKGNpX0JESSwgYnJvb206OnRpZHkpLAogICAgICAgICBtc2lfQVEgPSBtYXAoc2lfQVEsIGJyb29tOjp0aWR5KSwKICAgICAgICAgbXNpX0VRID0gbWFwKHNpX0VRLCBicm9vbTo6dGlkeSksCiAgICAgICAgIG1zaV9CREkgPSBtYXAoc2lfQkRJLCBicm9vbTo6dGlkeSkgICkgJT4lCiAgdW5uZXN0KGNvbHMgPSBjKG1jaV9BUSwgbWNpX0VRLCBtY2lfQkRJLCBtc2lfQVEsIG1zaV9FUSwgbXNpX0JESSksIG5hbWVzX3JlcGFpciA9ICd1bmlxdWUnICwgLmRyb3AgPSBUUlVFKSAlPiUKICBzZWxlY3QoLWNpX0FRLCAtY2lfQkRJLCAtY2lfRVEsIC1zaV9BUSwgLXNpX0VRLCAtc2lfQkRJLCAtZGF0YSwgCiAgICAgICAgIC1zdGFydHNfd2l0aCgnc3QnKSkgJT4lIAogIGZpbHRlcih0ZXJtID09ICdBUScpICMgcmVtb3ZlIGludGVyY2VwdAoKYGBgCgpHaXZlbiB0aGVyZSBpcyBubyBzaWduaWZpY2FudCBvZiBzbG9wZXMgKGFmdGVyIGNvcnJlY3Rpb24pLCBidXQgc29tZSBkaWZmZXJlbmNlIGluIGludGVyY2VwdHMsIHdlIGRvIGdlbmVyYWwgbGluZWFyIHJlZ3Jlc3Npb24sIHdpdGhvdXQgc2VwYXJhdGluZyBncm91cHMuIAoKYGBge3J9CnJlZ19yZXMyIDwtIHJlcyAlPiUgdW5ncm91cCgpICU+JSBncm91cF9ieShPcmRlciwgVm9sYXRpbGl0eSkgJT4lCiAgbmVzdCgpICAlPiUgICMgbmVzdGVkIGRhdGEKICBtdXRhdGUoY2lfQVEgPSBtYXAoZGF0YSwgY2lfQVEpLCBjaV9FUSA9IG1hcChkYXRhLCBjaV9FUSksCiAgICAgICAgIGNpX0JESSA9IG1hcChkYXRhLCBjaV9CREkpLCAKICAgICAgICAgc2lfQVEgPSBtYXAoZGF0YSwgc2lfQVEpLCBzaV9FUSA9IG1hcChkYXRhLCBzaV9FUSksCiAgICAgICAgIHNpX0JESSA9IG1hcChkYXRhLCBzaV9CREkpKSAlPiUKICBtdXRhdGUobWNpX0FRID0gbWFwKGNpX0FRLCBicm9vbTo6dGlkeSksIAogICAgICAgICBtY2lfRVEgPSBtYXAoY2lfRVEsIGJyb29tOjp0aWR5KSwKICAgICAgICAgbWNpX0JESSA9IG1hcChjaV9CREksIGJyb29tOjp0aWR5KSwKICAgICAgICAgbXNpX0FRID0gbWFwKHNpX0FRLCBicm9vbTo6dGlkeSksCiAgICAgICAgIG1zaV9FUSA9IG1hcChzaV9FUSwgYnJvb206OnRpZHkpLAogICAgICAgICBtc2lfQkRJID0gbWFwKHNpX0JESSwgYnJvb206OnRpZHkpICApICU+JQogIHVubmVzdChjb2xzID0gYyhtY2lfQVEsIG1jaV9FUSwgbWNpX0JESSwgbXNpX0FRLCBtc2lfRVEsIG1zaV9CREkpLCBuYW1lc19yZXBhaXIgPSAndW5pcXVlJyAsIC5kcm9wID0gVFJVRSkgJT4lCiAgc2VsZWN0KC1jaV9BUSwgLWNpX0JESSwgLWNpX0VRLCAtc2lfQVEsIC1zaV9FUSwgLXNpX0JESSwgLWRhdGEsIAogICAgICAgICAtc3RhcnRzX3dpdGgoJ3N0JykpICU+JSAKICBmaWx0ZXIodGVybSA9PSAnQVEnKSAjIHJlbW92ZSBpbnRlcmNlcHQKYGBgCkFnYWluLCB0aGVyZSBpcyBubyBzaWduaWZpY2FudCBvZiBzbG9wZXMuIAoKCgo=