rm(list = ls())

library(dplyr)
Warning: package ‘dplyr’ was built under R version 4.1.2

Attaching package: ‘dplyr’

The following objects are masked from ‘package:stats’:

    filter, lag

The following objects are masked from ‘package:base’:

    intersect, setdiff, setequal, union
library(ggplot2)
Warning: package ‘ggplot2’ was built under R version 4.1.2
library(tidyr)
library(ggpubr)
Registered S3 method overwritten by 'data.table':
  method           from
  print.data.table     
library(ggthemes)

filter <- dplyr::filter
select <- dplyr::select
rename <- dplyr::rename
dp<-read.csv("/Users/sarenseeley/Dropbox/Postdoc/nwtc_study/data/_cleaned/DotProbe_wide.csv")
cov<-read.csv("/Users/sarenseeley/Dropbox/Postdoc/nwtc_study/data/_cleaned/DotProbe_covars.csv") %>% filter(!record_id == "NWTC-032") %>% select(record_id,starts_with("dem")|starts_with("clin_")|starts_with("tot"),exposures_count) 
dp<-left_join(dp,cov,by="record_id")


dp<- dp %>% mutate(threat_bias = neutral_threat-threat_neutral,
                   ptsd = as.factor(if_else(group=="PTSD", "PTSD", "nonPTSD"))) # positive number = faster to respond to probe when it appears where the threat word was
# negative number = slower to respond to probe when it appears where the neutral probe was, ON trials where the other word is a threat word

# check out the data:
plot(dp$threat_bias,dp$overall_accuracy)


# remove low accuracy ppt:
dp <- dp %>% filter(overall_accuracy>=.5)

# so now we have removed 2 ppts for low accuracy, and 1 who was falling asleep and his data wasn't reliable (e.g., RT of 17 seconds)
plot(dp$threat_bias,dp$overall_accuracy)

# this looks better!

In total, we dropped data from 3 of 51 ppts (2 very low accuracy, 1 falling asleep with ridiculous RTs like 17 seconds), leaving n = 48.

Section A

Q1: Is there a difference in prevalence of PTSD in traditional vs. non-traditional responders?

Here is the breakdown of people in each of the 4 categories (trad vs. non-trad; PTSD vs. resilient):

tab1<-dp %>% select(ptsd,traditional_responder)  %>% table()
c1<-chisq.test(tab1, simulate.p.value = TRUE)
c1$observed
         traditional_responder
ptsd      Non-traditional Traditional (e.g., police, fire, EMS)
  nonPTSD               2                                    28
  PTSD                 11                                     7

We do a chi square test to see whether the actual number of people we have in each group differs significantly from what would be expected if there was no difference between groups:

c1

    Pearson's Chi-squared test with simulated p-value (based on 2000 replicates)

data:  tab1
X-squared = 16.886, df = NA, p-value = 0.0004998
c1$expected
         traditional_responder
ptsd      Non-traditional Traditional (e.g., police, fire, EMS)
  nonPTSD           8.125                                21.875
  PTSD              4.875                                13.125

We see that PTSD prevalence is higher in non-traditional responders, chi square X = 16.89, p <.001. Compared to the actual data, the chi square test would expect (1) more resilient people to be non-traditional responders and (2) more PTSD people to be traditional responders.

Q2: Is there a difference in perceived social support and social networks between PTSD and resilient groups?

We used independent samples T tests:


t.test(dp$tot_mos_overallSup ~ dp$ptsd, paired = FALSE )

    Welch Two Sample t-test

data:  dp$tot_mos_overallSup by dp$ptsd
t = 6.5063, df = 24.799, p-value = 8.489e-07
alternative hypothesis: true difference in means between group nonPTSD and group PTSD is not equal to 0
95 percent confidence interval:
 22.43777 43.23475
sample estimates:
mean in group nonPTSD    mean in group PTSD 
             88.02632              55.19006 

The groups ARE significantly different in terms of their overall perceived social support, T = 6.51, p < .001. The mean score for overall social support in the resilient group is 88.02 and the mean in the PTSD group is 55.20. This means the PTSD group perceives themselves to have less social support.

t.test(dp$tot_sni_netDiv ~ dp$ptsd, paired = FALSE )

    Welch Two Sample t-test

data:  dp$tot_sni_netDiv by dp$ptsd
t = 1.9844, df = 32.196, p-value = 0.05578
alternative hypothesis: true difference in means between group nonPTSD and group PTSD is not equal to 0
95 percent confidence interval:
 -0.02998941  2.31887830
sample estimates:
mean in group nonPTSD    mean in group PTSD 
             6.033333              4.888889 

The groups are different in terms of their social network diversity, T = 1.98, though p < .056 (so not quite statistically significant at a threshold of p <.05). The mean network diversity score was 6.03 in the resilient group and 4.89 in the PTSD group. This means the PTSD group has a less diverse social network.

t.test(dp$tot_sni_numPpl ~ dp$ptsd, paired = FALSE )

    Welch Two Sample t-test

data:  dp$tot_sni_numPpl by dp$ptsd
t = 1.7757, df = 25.476, p-value = 0.08773
alternative hypothesis: true difference in means between group nonPTSD and group PTSD is not equal to 0
95 percent confidence interval:
 -1.188949 16.166727
sample estimates:
mean in group nonPTSD    mean in group PTSD 
             21.76667              14.27778 

The groups ARE different in terms of the number of people in their social network, T = 1.78, though p < .088 (so not statistically significant at a threshold of p <.05). The mean number of people was 21.77 in the resilient group and 14.28 in the PTSD group. This means the PTSD group has a smaller social network.

Here’s what that looks like in a plot:


pl <- dp %>% select(ptsd,starts_with("tot_sni"), tot_mos_overallSup)  %>% pivot_longer(names_to = "measure", values_to = "social", cols=c(2,3,4)) 

ggplot(pl, aes(ptsd, social, fill=ptsd)) +
  stat_summary(geom = "col", fun = mean, position = "dodge", color="black") +
  stat_summary(geom = "errorbar", fun.data = mean_se, position=position_dodge(.9), width = 0.25, color="black") + labs(title="social support measures (MOS, SNI)")  + theme_clean(base_size = 16) + theme(legend.position = "none") +
  scale_fill_manual(values=c("#2eb4e7","#291d6d", "#d4148d" )) +  scale_color_manual(values=c("#2eb4e7", "#291d6d",  "#d4148d" )) + xlab("") + ylab("score") +
  scale_x_discrete(labels = c('Resilient', 'PTSD')) + facet_wrap(scales = "free_y", ~measure)

Q3: Is there a difference in personality traits between trad vs. non-trad responders?

Risk-taking & impulsivity

We chose these measures because we thought that perhaps people drawn to traditional responder careers might have more of an affinity for high-adrenaline situations, perceiving them as more exciting than threatening, and perhaps this might be why we see more PTSD in the non-traditional responders.

t.test(dp$tot_bis ~ dp$traditional_responder, paired = FALSE )

    Welch Two Sample t-test

data:  dp$tot_bis by dp$traditional_responder
t = 1.1243, df = 11.621, p-value = 0.2836
alternative hypothesis: true difference in means between group Non-traditional and group Traditional (e.g., police, fire, EMS) is not equal to 0
95 percent confidence interval:
 -2.519983  7.853316
sample estimates:
                      mean in group Non-traditional 
                                           66.33333 
mean in group Traditional (e.g., police, fire, EMS) 
                                           63.66667 
t.test(dp$tot_drs ~ dp$traditional_responder, paired = FALSE )

    Welch Two Sample t-test

data:  dp$tot_drs by dp$traditional_responder
t = -0.11384, df = 11.185, p-value = 0.9114
alternative hypothesis: true difference in means between group Non-traditional and group Traditional (e.g., police, fire, EMS) is not equal to 0
95 percent confidence interval:
 -15.10918  13.62029
sample estimates:
                      mean in group Non-traditional 
                                           88.22222 
mean in group Traditional (e.g., police, fire, EMS) 
                                           88.96667 

Contrary to our hypothesis, we did NOT see differences in traditional vs. non-traditional responders in terms of scores on the impulsivity and risk taking questionnaires.

pl1 <- dp %>% select(traditional_responder,tot_drs,tot_bis) %>% pivot_longer(names_to = "measure", values_to = "score", cols=c(2:3) )

ggplot(pl1, aes(traditional_responder, score, fill=traditional_responder)) +
  stat_summary(geom = "col", fun = mean, position = "dodge", color="black") +
  stat_summary(geom = "errorbar", fun.data = mean_se, position=position_dodge(.9), width = 0.25, color="black") + theme_clean(base_size = 16) + theme(legend.position = "none", axis.text.x = element_text(
    vjust = 0,
    hjust = 0,
    angle = -35)) + labs(title="Impulsivity and Risk-taking") +
  scale_fill_manual(values=c("#2dc8f8","#d4148d" )) + xlab("") + ylab("score") + facet_wrap(scales = "free_y", ~measure)
Warning: Removed 18 rows containing non-finite values (`stat_summary()`).
Warning: Removed 18 rows containing non-finite values (`stat_summary()`).

Positive and negative affect

We chose these measures because we thought that perhaps people drawn to traditional responder careers might have a greater tendency to be positive and less neurotic (i.e., prone to negative emotions) – and this could help them be resilient to PTSD.

t.test(dp$tot_panas_pos ~ dp$traditional_responder, paired = FALSE )

    Welch Two Sample t-test

data:  dp$tot_panas_pos by dp$traditional_responder
t = -3.0561, df = 24.762, p-value = 0.00531
alternative hypothesis: true difference in means between group Non-traditional and group Traditional (e.g., police, fire, EMS) is not equal to 0
95 percent confidence interval:
 -11.090403  -2.157948
sample estimates:
                      mean in group Non-traditional 
                                           29.46154 
mean in group Traditional (e.g., police, fire, EMS) 
                                           36.08571 
t.test(dp$tot_panas_neg ~ dp$traditional_responder, paired = FALSE )

    Welch Two Sample t-test

data:  dp$tot_panas_neg by dp$traditional_responder
t = 4.1237, df = 15.166, p-value = 0.0008828
alternative hypothesis: true difference in means between group Non-traditional and group Traditional (e.g., police, fire, EMS) is not equal to 0
95 percent confidence interval:
  5.069954 15.897079
sample estimates:
                      mean in group Non-traditional 
                                           24.76923 
mean in group Traditional (e.g., police, fire, EMS) 
                                           14.28571 

Yes, the traditional responders are, on average, higher in positive and lower in negative affectivity, vs. the non-traditional responders.

However, we noted that this result could be confounded by PTSD: with significantly more proportion of non-traditional responders having PTSD, we don’t know if being more negative/less positive is a consequence of having PTSD or were there prior to 9/11 attacks.


pl2 <- dp %>% select(traditional_responder,starts_with("tot_panas")) %>% pivot_longer(names_to = "measure", values_to = "score", cols=c(2:3) ) 

ggplot(pl2, aes(traditional_responder, score, fill=traditional_responder)) +
  stat_summary(geom = "col", fun = mean, position = "dodge", color="black") +
  stat_summary(geom = "errorbar", fun.data = mean_se, position=position_dodge(.9), width = 0.25, color="black") + labs(title="Positive and Negative Affect Scale")  + theme_clean(base_size = 16) + theme(legend.position = "none", axis.text.x = element_text(
    angle = -35,
    vjust = 0,
    hjust = 0)) + xlab("") +
   scale_fill_manual(values=c("#2dc8f8","#d4148d" )) + xlab("") + ylab("score") +
  facet_wrap(~measure)

Section B

Q1: Does attention bias (selective attention for threat) differ between PTSD and resilient groups?

Task Performance Overall


pl3 <- dp %>% select(record_id,ptsd,neutral_neutral,neutral_threat,threat_neutral) %>% pivot_longer(names_to = "condition", values_to = "mean_RT", cols=c(3:5) ) 

pl3 %>% group_by(ptsd,condition) %>% summarize(mean(mean_RT))
`summarise()` has grouped output by 'ptsd'. You can override using the `.groups` argument.

When both stimuli are neutral words, the mean reaction time in the PTSD group is 599 milliseconds and the mean reaction time in the resilient/non PTSD participants is 554 milliseconds.

When there is a both threat and neutral words and the probe appears in the place of the threat word, the mean reaction time in the PTSD group is 575 milliseconds and the mean reaction time in the resilient/non PTSD participants is 552 milliseconds.

When there is a both threat and neutral words and the probe appears in the place of the neutral word, the mean reaction time in the PTSD group is 571 milliseconds and the mean reaction time in the resilient/non PTSD participants is 554 milliseconds.


ggplot(pl3, aes(condition, mean_RT, fill=condition)) + 
  stat_summary(geom = "col", fun = mean, position = "dodge", color="black") +
  stat_summary(geom = "errorbar", fun.data = mean_se, position=position_dodge(.9), width = 0.25, color="black") + labs(title="Mean reaction time")  + theme_clean(base_size = 14) + theme(legend.position = "none", axis.text.x = element_text(
    angle = -45,
    vjust = 1,
    hjust = 0)) + xlab("") +
   scale_fill_manual(values=c("darkgrey","blue" ,"red")) + scale_x_discrete(labels=c("Both words \nNeutral","Threat \n(probe location)\n w/ Neutral","Neutral \n(probe location)\n w/ Threat")) + xlab("") + ylab("meanRT") +
  facet_wrap(~ptsd) 

Accuracy

t.test(dp$overall_accuracy ~ dp$ptsd, paired = FALSE )

    Welch Two Sample t-test

data:  dp$overall_accuracy by dp$ptsd
t = 2.7384, df = 24.168, p-value = 0.01141
alternative hypothesis: true difference in means between group nonPTSD and group PTSD is not equal to 0
95 percent confidence interval:
 0.005496675 0.039086659
sample estimates:
mean in group nonPTSD    mean in group PTSD 
            0.9535417             0.9312500 

Yes, the resilient group is more accurate than the PTSD group, overall, though the difference is not that large (95% vs. 93%)

ggplot(dp, aes(ptsd, overall_accuracy, fill=ptsd)) + 
  stat_summary(geom = "col", fun = mean, position = "dodge", color="black") +
  stat_summary(geom = "errorbar", fun.data = mean_se, position=position_dodge(.9), width = 0.25, color="black") + labs(title="Overall task accuracy") + theme_clean(base_size = 14) + theme(legend.position = "none", axis.text.x = element_text(
    angle = 0,
    vjust = 0,
    hjust = 0)) + xlab("")+ 
scale_fill_manual(values=c("#2eb4e7","#291d6d", "#d4148d")) + xlab("") + ylab("% correct responses") +scale_x_discrete(labels = c('Resilient', 'PTSD')) 

Threat Bias

We calculated threat bias by subtracting RTs in the “probe in threat location” condition from RTs in the “probe in neutral location (+ other word is threat)” condition: threat_bias = neutral_threat minus threat_neutral).

Positive numbers = selective attention for threat (threat bias; essentially, faster to threat than neutral). Negative numbers indicate threat avoidance bias (essentially, faster to neutral than threat).

t.test(dp$threat_bias ~ dp$ptsd, paired = FALSE )

    Welch Two Sample t-test

data:  dp$threat_bias by dp$ptsd
t = 0.6363, df = 26.458, p-value = 0.53
alternative hypothesis: true difference in means between group nonPTSD and group PTSD is not equal to 0
95 percent confidence interval:
 -11.47128  21.76988
sample estimates:
mean in group nonPTSD    mean in group PTSD 
             1.306432             -3.842869 
ggplot(dp, aes(ptsd, threat_bias, fill=ptsd)) + 
  stat_summary(geom = "col", fun = mean, position = "dodge", color="black") +
  stat_summary(geom = "errorbar", fun.data = mean_se, position=position_dodge(.9), width = 0.25, color="black") + labs(title="Threat Bias") + theme_clean(base_size = 16) + theme(legend.position = "none", axis.text.x = element_text(
    angle = 0,
    vjust = 0,
    hjust = 0)) + xlab("")+ 
scale_fill_manual(values=c("#2eb4e7","#291d6d", "#d4148d")) + xlab("") + ylab("RT difference") +scale_x_discrete(labels = c('Resilient', 'PTSD')) 

There is NOT a significant difference in threat bias between groups. Note that the Iacovelli paper you read similarly did not find a difference in threat bias, only threat bias variability.

So, what do we make of this?

LS0tCnRpdGxlOiAiU1BJQ0UgMjAyMyBkb3QgcHJvYmUgcHJvamVjdCIKYXV0aG9yOiAiVHZpc2hhIFZhbnRlcnUgJiBTYXJlbiBTZWVsZXkiCmRhdGU6ICJMYXN0IHVwZGF0ZWQgMDgtMTAtMjMiCm91dHB1dDoKICBodG1sX25vdGVib29rOgogICAgdG9jOiB5ZXMKLS0tCiAgCgpgYGB7ciBzZXR1cH0Kcm0obGlzdCA9IGxzKCkpCgpsaWJyYXJ5KGRwbHlyKQpsaWJyYXJ5KGdncGxvdDIpCmxpYnJhcnkodGlkeXIpCmxpYnJhcnkoZ2dwdWJyKQpsaWJyYXJ5KGdndGhlbWVzKQoKZmlsdGVyIDwtIGRwbHlyOjpmaWx0ZXIKc2VsZWN0IDwtIGRwbHlyOjpzZWxlY3QKcmVuYW1lIDwtIGRwbHlyOjpyZW5hbWUKYGBgCgpgYGB7cn0KZHA8LXJlYWQuY3N2KCIvVXNlcnMvc2FyZW5zZWVsZXkvRHJvcGJveC9Qb3N0ZG9jL253dGNfc3R1ZHkvZGF0YS9fY2xlYW5lZC9Eb3RQcm9iZV93aWRlLmNzdiIpCmNvdjwtcmVhZC5jc3YoIi9Vc2Vycy9zYXJlbnNlZWxleS9Ecm9wYm94L1Bvc3Rkb2Mvbnd0Y19zdHVkeS9kYXRhL19jbGVhbmVkL0RvdFByb2JlX2NvdmFycy5jc3YiKSAlPiUgZmlsdGVyKCFyZWNvcmRfaWQgPT0gIk5XVEMtMDMyIikgJT4lIHNlbGVjdChyZWNvcmRfaWQsc3RhcnRzX3dpdGgoImRlbSIpfHN0YXJ0c193aXRoKCJjbGluXyIpfHN0YXJ0c193aXRoKCJ0b3QiKSxleHBvc3VyZXNfY291bnQpIApkcDwtbGVmdF9qb2luKGRwLGNvdixieT0icmVjb3JkX2lkIikKCgpkcDwtIGRwICU+JSBtdXRhdGUodGhyZWF0X2JpYXMgPSBuZXV0cmFsX3RocmVhdC10aHJlYXRfbmV1dHJhbCwKICAgICAgICAgICAgICAgICAgIHB0c2QgPSBhcy5mYWN0b3IoaWZfZWxzZShncm91cD09IlBUU0QiLCAiUFRTRCIsICJub25QVFNEIikpKSAjIHBvc2l0aXZlIG51bWJlciA9IGZhc3RlciB0byByZXNwb25kIHRvIHByb2JlIHdoZW4gaXQgYXBwZWFycyB3aGVyZSB0aGUgdGhyZWF0IHdvcmQgd2FzCiMgbmVnYXRpdmUgbnVtYmVyID0gc2xvd2VyIHRvIHJlc3BvbmQgdG8gcHJvYmUgd2hlbiBpdCBhcHBlYXJzIHdoZXJlIHRoZSBuZXV0cmFsIHByb2JlIHdhcywgT04gdHJpYWxzIHdoZXJlIHRoZSBvdGhlciB3b3JkIGlzIGEgdGhyZWF0IHdvcmQKCiMgY2hlY2sgb3V0IHRoZSBkYXRhOgpwbG90KGRwJHRocmVhdF9iaWFzLGRwJG92ZXJhbGxfYWNjdXJhY3kpCgojIHJlbW92ZSBsb3cgYWNjdXJhY3kgcHB0OgpkcCA8LSBkcCAlPiUgZmlsdGVyKG92ZXJhbGxfYWNjdXJhY3k+PS41KQoKIyBzbyBub3cgd2UgaGF2ZSByZW1vdmVkIDIgcHB0cyBmb3IgbG93IGFjY3VyYWN5LCBhbmQgMSB3aG8gd2FzIGZhbGxpbmcgYXNsZWVwIGFuZCBoaXMgZGF0YSB3YXNuJ3QgcmVsaWFibGUgKGUuZy4sIFJUIG9mIDE3IHNlY29uZHMpCnBsb3QoZHAkdGhyZWF0X2JpYXMsZHAkb3ZlcmFsbF9hY2N1cmFjeSkKIyB0aGlzIGxvb2tzIGJldHRlciEKCmBgYAoKSW4gdG90YWwsIHdlIGRyb3BwZWQgZGF0YSBmcm9tIDMgb2YgNTEgcHB0cyAoMiB2ZXJ5IGxvdyBhY2N1cmFjeSwgMSBmYWxsaW5nIGFzbGVlcCB3aXRoIHJpZGljdWxvdXMgUlRzIGxpa2UgMTcgc2Vjb25kcyksIGxlYXZpbmcgbiA9IDQ4LiAKCgojIFNlY3Rpb24gQQojIyBRMTogSXMgdGhlcmUgYSBkaWZmZXJlbmNlIGluIHByZXZhbGVuY2Ugb2YgUFRTRCBpbiB0cmFkaXRpb25hbCB2cy4gbm9uLXRyYWRpdGlvbmFsIHJlc3BvbmRlcnM/CgpIZXJlIGlzIHRoZSBicmVha2Rvd24gb2YgcGVvcGxlIGluIGVhY2ggb2YgdGhlIDQgY2F0ZWdvcmllcyAodHJhZCB2cy4gbm9uLXRyYWQ7IFBUU0QgdnMuIHJlc2lsaWVudCk6CmBgYHtyfQp0YWIxPC1kcCAlPiUgc2VsZWN0KHB0c2QsdHJhZGl0aW9uYWxfcmVzcG9uZGVyKSAgJT4lIHRhYmxlKCkKYzE8LWNoaXNxLnRlc3QodGFiMSwgc2ltdWxhdGUucC52YWx1ZSA9IFRSVUUpCmMxJG9ic2VydmVkCmBgYAoKV2UgZG8gYSBjaGkgc3F1YXJlIHRlc3QgdG8gc2VlIHdoZXRoZXIgdGhlICphY3R1YWwqIG51bWJlciBvZiBwZW9wbGUgd2UgaGF2ZSBpbiBlYWNoIGdyb3VwIGRpZmZlcnMgc2lnbmlmaWNhbnRseSBmcm9tIHdoYXQgd291bGQgYmUgZXhwZWN0ZWQgaWYgdGhlcmUgd2FzIG5vIGRpZmZlcmVuY2UgYmV0d2VlbiBncm91cHM6CgpgYGB7cn0KYzEKYzEkZXhwZWN0ZWQKCmBgYAoKPldlIHNlZSB0aGF0IFBUU0QgcHJldmFsZW5jZSBpcyBoaWdoZXIgaW4gbm9uLXRyYWRpdGlvbmFsIHJlc3BvbmRlcnMsIGNoaSBzcXVhcmUgWCA9IDE2Ljg5LCBwIDwuMDAxLiBDb21wYXJlZCB0byB0aGUgYWN0dWFsIGRhdGEsIHRoZSBjaGkgc3F1YXJlIHRlc3Qgd291bGQgZXhwZWN0ICgxKSBtb3JlIHJlc2lsaWVudCBwZW9wbGUgdG8gYmUgbm9uLXRyYWRpdGlvbmFsIHJlc3BvbmRlcnMgYW5kICgyKSBtb3JlIFBUU0QgcGVvcGxlIHRvIGJlIHRyYWRpdGlvbmFsIHJlc3BvbmRlcnMuCgojIyBBcmUgdGhlIHNlbGYtcmVwb3J0cyBtZWFzdXJlcyB3ZSdyZSBsb29raW5nIGF0IHJlbGF0ZWQgdG8gZWFjaCBvdGhlcj8KCkNvcnJlbGF0aW9uIG1hdHJpeCBzaG93cyB0aGUgY29ycmVsYXRpb24gc3RhdGlzdGljcyBmb3IgYW55IHNpZ25pZmljYW50IHJlbGF0aW9uc2hpcHMgKHAgPCAuMDUpLgoKUmVkIHNxdWFyZXMgPSBpbnZlcnNlbHkgcmVsYXRlZCAoaS5lLiwgaGlnaGVyIHNjb3JlIG9uIG9uZSA9ICpsb3dlciogc2NvcmUgb24gdGhlIG90aGVyKQoKQmx1ZSBzcXVhcmVzID0gcG9zaXRpdmVseSByZWxhdGVkIChoaWdoZXIgc2NvcmUgb24gb25lID0gaGlnaGVyIHNjb3JlIG9uIHRoZSBvdGhlciwgdG9vKQoKYGBge3J9CnZhcnM8LSBjb3YgJT4lIHNlbGVjdCh0b3RfcGFuYXNfcG9zLHRvdF9wYW5hc19uZWcsdG90X2Rycyx0b3RfYmlzLGNsaW5fdG90X2NhcHM1X3BtLHRvdF9zbmlfbmV0RGl2LHRvdF9zbmlfbnVtUHBsLHRvdF9tb3Nfb3ZlcmFsbFN1cCkKY29yLm1hdCA8LSB2YXJzICU+JSByc3RhdGl4Ojpjb3JfbWF0KCkKY29yLm1hdCAlPiUKICByc3RhdGl4OjpwdWxsX2xvd2VyX3RyaWFuZ2xlKCkgJT4lCiAgcnN0YXRpeDo6Y29yX3Bsb3QobGFiZWwgPSBUUlVFLCBpbnNpZ25pZmljYW50ID0gImJsYW5rIiwgbWV0aG9kPSJjb2xvciIpIApgYGAKCj4gQXJlIHRoZSB0aGluZ3Mgd2UgZXhwZWN0IHRvIGJlIGNvcnJlbGF0ZWQgYWN0dWFsbHkgY29ycmVsYXRlZCAoYW5kIGluIHRoZSBkaXJlY3Rpb24gd2UgcHJlZGljdGVkKT8KCj4gQW55IGNvcnJlbGF0aW9ucyB3ZSBleHBlY3RlZCB0byBzZWUgdGhhdCB3ZXJlIE5PVCBzaWduaWZpY2FudD8KCiogYHRvdF9wYW5hc19wb3NgIGFuZCBgdG90X3BhbmFzX25lZ2AgPSBnZW5lcmFsIHBvc2l0aXZlL25lZ2F0aXZlIGFmZmVjdGl2aXR5IChhIHBlcnNvbidzIGdlbmVyYWwgdGVuZGVuY3kgdG8gZmVlbCBwb3NpdGl2ZSBlbW90aW9ucyBvciBuZWdhdGl2ZSBlbW90aW9ucykgfCAqUG9zaXRpdmUgYW5kIE5lZ2F0aXZlIEFmZmVjdCBTY2FsZSoKCiogYGNsaW5fdG90X2NhcHM1X3BtYCA9IFBUU0Qgc3ltcHRvbXMgaW4gcGFzdCBtb250aCB8ICpDbGluaWNhbCBBc3Nlc3NtZW50IG9mIERTTS01IFBUU0QgU3ltcHRvbXMqCgoqIGB0b3RfYmlzYCA9IHRvdGFsIHNlbGYtcmVwb3J0ZWQgaW1wdWxzaXZpdHkgfCAqQmFycmV0dCBJbXB1bHNpdmVseSBTY2FsZSoKCiogYHRvdF9kcnNgID0gdG90YWwgc2VsZi1yZXBvcnRlZCByaXNrLXRha2luZyB8ICpEb3NwZXJ0IFJpc2sgU2NhbGUqCgoqIGB0b3Rfc25pX25ldERpdmAgPSBzb2NpYWwgbmV0d29yayBkaXZlcnNpdHkgKGRvIHlvdSBrbm93IHBlb3BsZSBhY3Jvc3MgYSBsb3Qgb2YgZGlmZmVyZW50IGNvbnRleHRzL3JlbGF0aW9uc2hpcCB0eXBlcyBbaGlnaCBkaXZlcnNpdHldIG9yIG1vc3RseSB3aXRoaW4gYSBmZXcgdHlwZXMgb2YgcmVsYXRpb25zaGlwcyBbbG93IGRpdmVyc2l0eV0/KSB8ICpTb2NpYWwgTmV0d29yayBJbmRleCoKCiogYHRvdF9zbmlfbnVtUHBsYCA9IG51bWJlciBvZiBwZW9wbGUgdGhhdCB5b3UgdGFsayB0byBhdCBsZWFzdCBvbmNlIGV2ZXJ5IDIgd2Vla3MgfCAqU29jaWFsIE5ldHdvcmsgSW5kZXgqCgoqIGB0b3RfbW9zX292ZXJhbGxTdXBgID0gb3ZlcmFsbCBwZXJjZWl2ZWQgc3VwcG9ydCBmcm9tIHBlb3BsZSBpbiB5b3VyIGxpZmUgaW4gZ2VuZXJhbCB8ICpNT1MgU29jaWFsIFN1cHBvcnQgU3VydmV5KiAKCgoKCiMjIFEyOiBJcyB0aGVyZSBhIGRpZmZlcmVuY2UgaW4gcGVyY2VpdmVkIHNvY2lhbCBzdXBwb3J0IGFuZCBzb2NpYWwgbmV0d29ya3MgYmV0d2VlbiBQVFNEIGFuZCByZXNpbGllbnQgZ3JvdXBzPwoKV2UgdXNlZCBpbmRlcGVuZGVudCBzYW1wbGVzIFQgdGVzdHM6CgpgYGB7cn0KCnQudGVzdChkcCR0b3RfbW9zX292ZXJhbGxTdXAgfiBkcCRwdHNkLCBwYWlyZWQgPSBGQUxTRSApCmBgYAoKPlRoZSBncm91cHMgQVJFIHNpZ25pZmljYW50bHkgZGlmZmVyZW50IGluIHRlcm1zIG9mIHRoZWlyIG92ZXJhbGwgcGVyY2VpdmVkIHNvY2lhbCBzdXBwb3J0LCBUID0gNi41MSwgcCA8IC4wMDEuIFRoZSBtZWFuIHNjb3JlIGZvciBvdmVyYWxsIHNvY2lhbCBzdXBwb3J0ICBpbiB0aGUgcmVzaWxpZW50IGdyb3VwIGlzIDg4LjAyIGFuZCB0aGUgbWVhbiBpbiB0aGUgUFRTRCBncm91cCBpcyA1NS4yMC4gVGhpcyBtZWFucyB0aGUgUFRTRCBncm91cCBwZXJjZWl2ZXMgdGhlbXNlbHZlcyB0byBoYXZlICpsZXNzKiBzb2NpYWwgc3VwcG9ydC4KCmBgYHtyfQp0LnRlc3QoZHAkdG90X3NuaV9uZXREaXYgfiBkcCRwdHNkLCBwYWlyZWQgPSBGQUxTRSApCmBgYAo+VGhlIGdyb3VwcyBhcmUgZGlmZmVyZW50IGluIHRlcm1zIG9mIHRoZWlyIHNvY2lhbCBuZXR3b3JrIGRpdmVyc2l0eSwgVCA9IDEuOTgsIHRob3VnaCBwIDwgLjA1NiAoc28gbm90IHF1aXRlIHN0YXRpc3RpY2FsbHkgc2lnbmlmaWNhbnQgYXQgYSB0aHJlc2hvbGQgb2YgcCA8LjA1KS4gVGhlIG1lYW4gbmV0d29yayBkaXZlcnNpdHkgc2NvcmUgd2FzIDYuMDMgaW4gdGhlIHJlc2lsaWVudCBncm91cCBhbmQgNC44OSBpbiB0aGUgUFRTRCBncm91cC4gVGhpcyBtZWFucyB0aGUgUFRTRCBncm91cCBoYXMgYSBsZXNzIGRpdmVyc2Ugc29jaWFsIG5ldHdvcmsuCgpgYGB7cn0KdC50ZXN0KGRwJHRvdF9zbmlfbnVtUHBsIH4gZHAkcHRzZCwgcGFpcmVkID0gRkFMU0UgKQoKYGBgCj5UaGUgZ3JvdXBzIEFSRSBkaWZmZXJlbnQgaW4gdGVybXMgb2YgdGhlIG51bWJlciBvZiBwZW9wbGUgaW4gdGhlaXIgc29jaWFsIG5ldHdvcmssIFQgPSAxLjc4LCB0aG91Z2ggcCA8IC4wODggKHNvIG5vdCBzdGF0aXN0aWNhbGx5IHNpZ25pZmljYW50IGF0IGEgdGhyZXNob2xkIG9mIHAgPC4wNSkuIFRoZSBtZWFuIG51bWJlciBvZiBwZW9wbGUgd2FzIDIxLjc3IGluIHRoZSByZXNpbGllbnQgZ3JvdXAgYW5kIDE0LjI4IGluIHRoZSBQVFNEIGdyb3VwLiBUaGlzIG1lYW5zIHRoZSBQVFNEIGdyb3VwIGhhcyBhIHNtYWxsZXIgc29jaWFsIG5ldHdvcmsuCgpIZXJlJ3Mgd2hhdCB0aGF0IGxvb2tzIGxpa2UgaW4gYSBwbG90OgoKYGBge3J9CgpwbCA8LSBkcCAlPiUgc2VsZWN0KHB0c2Qsc3RhcnRzX3dpdGgoInRvdF9zbmkiKSwgdG90X21vc19vdmVyYWxsU3VwKSAgJT4lIHBpdm90X2xvbmdlcihuYW1lc190byA9ICJtZWFzdXJlIiwgdmFsdWVzX3RvID0gInNvY2lhbCIsIGNvbHM9YygyLDMsNCkpIAoKZ2dwbG90KHBsLCBhZXMocHRzZCwgc29jaWFsLCBmaWxsPXB0c2QpKSArCiAgc3RhdF9zdW1tYXJ5KGdlb20gPSAiY29sIiwgZnVuID0gbWVhbiwgcG9zaXRpb24gPSAiZG9kZ2UiLCBjb2xvcj0iYmxhY2siKSArCiAgc3RhdF9zdW1tYXJ5KGdlb20gPSAiZXJyb3JiYXIiLCBmdW4uZGF0YSA9IG1lYW5fc2UsIHBvc2l0aW9uPXBvc2l0aW9uX2RvZGdlKC45KSwgd2lkdGggPSAwLjI1LCBjb2xvcj0iYmxhY2siKSArIGxhYnModGl0bGU9InNvY2lhbCBzdXBwb3J0IG1lYXN1cmVzIChNT1MsIFNOSSkiKSAgKyB0aGVtZV9jbGVhbihiYXNlX3NpemUgPSAxNikgKyB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpICsKICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXM9YygiIzJlYjRlNyIsIiMyOTFkNmQiLCAiI2Q0MTQ4ZCIgKSkgKyAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcz1jKCIjMmViNGU3IiwgIiMyOTFkNmQiLCAgIiNkNDE0OGQiICkpICsgeGxhYigiIikgKyB5bGFiKCJzY29yZSIpICsKICBzY2FsZV94X2Rpc2NyZXRlKGxhYmVscyA9IGMoJ1Jlc2lsaWVudCcsICdQVFNEJykpICsgZmFjZXRfd3JhcChzY2FsZXMgPSAiZnJlZV95Iiwgfm1lYXN1cmUpCmBgYAoKIyMgUTM6IElzIHRoZXJlIGEgZGlmZmVyZW5jZSBpbiBwZXJzb25hbGl0eSB0cmFpdHMgYmV0d2VlbiB0cmFkIHZzLiBub24tdHJhZCByZXNwb25kZXJzPyAKCgojIyMgUmlzay10YWtpbmcgJiBpbXB1bHNpdml0eQoKV2UgY2hvc2UgdGhlc2UgbWVhc3VyZXMgYmVjYXVzZSB3ZSB0aG91Z2h0IHRoYXQgcGVyaGFwcyBwZW9wbGUgZHJhd24gdG8gdHJhZGl0aW9uYWwgcmVzcG9uZGVyIGNhcmVlcnMgbWlnaHQgaGF2ZSBtb3JlIG9mIGFuIGFmZmluaXR5IGZvciBoaWdoLWFkcmVuYWxpbmUgc2l0dWF0aW9ucywgcGVyY2VpdmluZyB0aGVtIGFzIG1vcmUgZXhjaXRpbmcgdGhhbiB0aHJlYXRlbmluZywgYW5kIHBlcmhhcHMgdGhpcyBtaWdodCBiZSB3aHkgd2Ugc2VlIG1vcmUgUFRTRCBpbiB0aGUgbm9uLXRyYWRpdGlvbmFsIHJlc3BvbmRlcnMuCmBgYHtyfQp0LnRlc3QoZHAkdG90X2JpcyB+IGRwJHRyYWRpdGlvbmFsX3Jlc3BvbmRlciwgcGFpcmVkID0gRkFMU0UgKQp0LnRlc3QoZHAkdG90X2RycyB+IGRwJHRyYWRpdGlvbmFsX3Jlc3BvbmRlciwgcGFpcmVkID0gRkFMU0UgKQoKYGBgCgo+Q29udHJhcnkgdG8gb3VyIGh5cG90aGVzaXMsIHdlIGRpZCBOT1Qgc2VlIGRpZmZlcmVuY2VzIGluIHRyYWRpdGlvbmFsIHZzLiBub24tdHJhZGl0aW9uYWwgcmVzcG9uZGVycyBpbiB0ZXJtcyBvZiBzY29yZXMgb24gdGhlIGltcHVsc2l2aXR5IGFuZCByaXNrIHRha2luZyBxdWVzdGlvbm5haXJlcy4KCmBgYHtyfQpwbDEgPC0gZHAgJT4lIHNlbGVjdCh0cmFkaXRpb25hbF9yZXNwb25kZXIsdG90X2Rycyx0b3RfYmlzKSAlPiUgcGl2b3RfbG9uZ2VyKG5hbWVzX3RvID0gIm1lYXN1cmUiLCB2YWx1ZXNfdG8gPSAic2NvcmUiLCBjb2xzPWMoMjozKSApCgpnZ3Bsb3QocGwxLCBhZXModHJhZGl0aW9uYWxfcmVzcG9uZGVyLCBzY29yZSwgZmlsbD10cmFkaXRpb25hbF9yZXNwb25kZXIpKSArCiAgc3RhdF9zdW1tYXJ5KGdlb20gPSAiY29sIiwgZnVuID0gbWVhbiwgcG9zaXRpb24gPSAiZG9kZ2UiLCBjb2xvcj0iYmxhY2siKSArCiAgc3RhdF9zdW1tYXJ5KGdlb20gPSAiZXJyb3JiYXIiLCBmdW4uZGF0YSA9IG1lYW5fc2UsIHBvc2l0aW9uPXBvc2l0aW9uX2RvZGdlKC45KSwgd2lkdGggPSAwLjI1LCBjb2xvcj0iYmxhY2siKSArIHRoZW1lX2NsZWFuKGJhc2Vfc2l6ZSA9IDE2KSArIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiwgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoCiAgICB2anVzdCA9IDAsCiAgICBoanVzdCA9IDAsCiAgICBhbmdsZSA9IC0zNSkpICsgbGFicyh0aXRsZT0iSW1wdWxzaXZpdHkgYW5kIFJpc2stdGFraW5nIikgKwogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcz1jKCIjMmRjOGY4IiwiI2Q0MTQ4ZCIgKSkgKyB4bGFiKCIiKSArIHlsYWIoInNjb3JlIikgKyBmYWNldF93cmFwKHNjYWxlcyA9ICJmcmVlX3kiLCB+bWVhc3VyZSkKCmBgYAoKIyMjIFBvc2l0aXZlIGFuZCBuZWdhdGl2ZSBhZmZlY3QKCldlIGNob3NlIHRoZXNlIG1lYXN1cmVzIGJlY2F1c2Ugd2UgdGhvdWdodCB0aGF0IHBlcmhhcHMgcGVvcGxlIGRyYXduIHRvIHRyYWRpdGlvbmFsIHJlc3BvbmRlciBjYXJlZXJzIG1pZ2h0IGhhdmUgYSBncmVhdGVyIHRlbmRlbmN5IHRvIGJlIHBvc2l0aXZlIGFuZCBsZXNzIG5ldXJvdGljIChpLmUuLCBwcm9uZSB0byBuZWdhdGl2ZSBlbW90aW9ucykgLS0gYW5kIHRoaXMgY291bGQgaGVscCB0aGVtIGJlIHJlc2lsaWVudCB0byBQVFNELiAKYGBge3J9CnQudGVzdChkcCR0b3RfcGFuYXNfcG9zIH4gZHAkdHJhZGl0aW9uYWxfcmVzcG9uZGVyLCBwYWlyZWQgPSBGQUxTRSApCnQudGVzdChkcCR0b3RfcGFuYXNfbmVnIH4gZHAkdHJhZGl0aW9uYWxfcmVzcG9uZGVyLCBwYWlyZWQgPSBGQUxTRSApCmBgYAoKCgoKPlllcywgdGhlIHRyYWRpdGlvbmFsIHJlc3BvbmRlcnMgYXJlLCBvbiBhdmVyYWdlLCBoaWdoZXIgaW4gcG9zaXRpdmUgYW5kIGxvd2VyIGluIG5lZ2F0aXZlIGFmZmVjdGl2aXR5LCB2cy4gdGhlIG5vbi10cmFkaXRpb25hbCByZXNwb25kZXJzLgoKSG93ZXZlciwgd2Ugbm90ZWQgdGhhdCB0aGlzIHJlc3VsdCBjb3VsZCBiZSBjb25mb3VuZGVkIGJ5IFBUU0Q6IHdpdGggc2lnbmlmaWNhbnRseSBtb3JlIHByb3BvcnRpb24gb2Ygbm9uLXRyYWRpdGlvbmFsIHJlc3BvbmRlcnMgaGF2aW5nIFBUU0QsIHdlIGRvbid0IGtub3cgaWYgYmVpbmcgbW9yZSBuZWdhdGl2ZS9sZXNzIHBvc2l0aXZlIGlzIGEgY29uc2VxdWVuY2Ugb2YgaGF2aW5nIFBUU0Qgb3Igd2VyZSB0aGVyZSBwcmlvciB0byA5LzExIGF0dGFja3MuCgpgYGB7cn0KCnBsMiA8LSBkcCAlPiUgc2VsZWN0KHRyYWRpdGlvbmFsX3Jlc3BvbmRlcixzdGFydHNfd2l0aCgidG90X3BhbmFzIikpICU+JSBwaXZvdF9sb25nZXIobmFtZXNfdG8gPSAibWVhc3VyZSIsIHZhbHVlc190byA9ICJzY29yZSIsIGNvbHM9YygyOjMpICkgCgpnZ3Bsb3QocGwyLCBhZXModHJhZGl0aW9uYWxfcmVzcG9uZGVyLCBzY29yZSwgZmlsbD10cmFkaXRpb25hbF9yZXNwb25kZXIpKSArCiAgc3RhdF9zdW1tYXJ5KGdlb20gPSAiY29sIiwgZnVuID0gbWVhbiwgcG9zaXRpb24gPSAiZG9kZ2UiLCBjb2xvcj0iYmxhY2siKSArCiAgc3RhdF9zdW1tYXJ5KGdlb20gPSAiZXJyb3JiYXIiLCBmdW4uZGF0YSA9IG1lYW5fc2UsIHBvc2l0aW9uPXBvc2l0aW9uX2RvZGdlKC45KSwgd2lkdGggPSAwLjI1LCBjb2xvcj0iYmxhY2siKSArIGxhYnModGl0bGU9IlBvc2l0aXZlIGFuZCBOZWdhdGl2ZSBBZmZlY3QgU2NhbGUiKSAgKyB0aGVtZV9jbGVhbihiYXNlX3NpemUgPSAxNikgKyB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIsIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KAogICAgYW5nbGUgPSAtMzUsCiAgICB2anVzdCA9IDAsCiAgICBoanVzdCA9IDApKSArIHhsYWIoIiIpICsKICAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzPWMoIiMyZGM4ZjgiLCIjZDQxNDhkIiApKSArIHhsYWIoIiIpICsgeWxhYigic2NvcmUiKSArCiAgZmFjZXRfd3JhcCh+bWVhc3VyZSkKYGBgCgojIFNlY3Rpb24gQgojIyBRMToJRG9lcyBhdHRlbnRpb24gYmlhcyAoc2VsZWN0aXZlIGF0dGVudGlvbiBmb3IgdGhyZWF0KSBkaWZmZXIgYmV0d2VlbiBQVFNEIGFuZCByZXNpbGllbnQgZ3JvdXBzPwoKCiMjIyBUYXNrIFBlcmZvcm1hbmNlIE92ZXJhbGwKYGBge3J9CgpwbDMgPC0gZHAgJT4lIHNlbGVjdChyZWNvcmRfaWQscHRzZCxuZXV0cmFsX25ldXRyYWwsbmV1dHJhbF90aHJlYXQsdGhyZWF0X25ldXRyYWwpICU+JSBwaXZvdF9sb25nZXIobmFtZXNfdG8gPSAiY29uZGl0aW9uIiwgdmFsdWVzX3RvID0gIm1lYW5fUlQiLCBjb2xzPWMoMzo1KSApIAoKcGwzICU+JSBncm91cF9ieShwdHNkLGNvbmRpdGlvbikgJT4lIHN1bW1hcml6ZShtZWFuKG1lYW5fUlQpKQpgYGAKCgo+IFdoZW4gYm90aCBzdGltdWxpIGFyZSBuZXV0cmFsIHdvcmRzLCB0aGUgbWVhbiByZWFjdGlvbiB0aW1lIGluIHRoZSBQVFNEIGdyb3VwIGlzIDU5OSBtaWxsaXNlY29uZHMgYW5kIHRoZSBtZWFuIHJlYWN0aW9uIHRpbWUgaW4gdGhlIHJlc2lsaWVudC9ub24gUFRTRCBwYXJ0aWNpcGFudHMgaXMgNTU0IG1pbGxpc2Vjb25kcy4KCj4gV2hlbiB0aGVyZSBpcyBhIGJvdGggdGhyZWF0IGFuZCBuZXV0cmFsIHdvcmRzICphbmQqIHRoZSBwcm9iZSBhcHBlYXJzIGluIHRoZSBwbGFjZSBvZiB0aGUgdGhyZWF0IHdvcmQsIHRoZSBtZWFuIHJlYWN0aW9uIHRpbWUgaW4gdGhlIFBUU0QgZ3JvdXAgaXMgNTc1IG1pbGxpc2Vjb25kcyBhbmQgdGhlIG1lYW4gcmVhY3Rpb24gdGltZSBpbiB0aGUgcmVzaWxpZW50L25vbiBQVFNEIHBhcnRpY2lwYW50cyBpcyA1NTIgbWlsbGlzZWNvbmRzLgoKPiBXaGVuIHRoZXJlIGlzIGEgYm90aCB0aHJlYXQgYW5kIG5ldXRyYWwgd29yZHMgKmFuZCogdGhlIHByb2JlIGFwcGVhcnMgaW4gdGhlIHBsYWNlIG9mIHRoZSBuZXV0cmFsIHdvcmQsIHRoZSBtZWFuIHJlYWN0aW9uIHRpbWUgaW4gdGhlIFBUU0QgZ3JvdXAgaXMgNTcxIG1pbGxpc2Vjb25kcyBhbmQgdGhlIG1lYW4gcmVhY3Rpb24gdGltZSBpbiB0aGUgcmVzaWxpZW50L25vbiBQVFNEIHBhcnRpY2lwYW50cyBpcyA1NTQgbWlsbGlzZWNvbmRzLgoKYGBge3J9CgpnZ3Bsb3QocGwzLCBhZXMoY29uZGl0aW9uLCBtZWFuX1JULCBmaWxsPWNvbmRpdGlvbikpICsgCiAgc3RhdF9zdW1tYXJ5KGdlb20gPSAiY29sIiwgZnVuID0gbWVhbiwgcG9zaXRpb24gPSAiZG9kZ2UiLCBjb2xvcj0iYmxhY2siKSArCiAgc3RhdF9zdW1tYXJ5KGdlb20gPSAiZXJyb3JiYXIiLCBmdW4uZGF0YSA9IG1lYW5fc2UsIHBvc2l0aW9uPXBvc2l0aW9uX2RvZGdlKC45KSwgd2lkdGggPSAwLjI1LCBjb2xvcj0iYmxhY2siKSArIGxhYnModGl0bGU9Ik1lYW4gcmVhY3Rpb24gdGltZSIpICArIHRoZW1lX2NsZWFuKGJhc2Vfc2l6ZSA9IDE0KSArIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiwgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoCiAgICBhbmdsZSA9IC00NSwKICAgIHZqdXN0ID0gMSwKICAgIGhqdXN0ID0gMCkpICsgeGxhYigiIikgKwogICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXM9YygiZGFya2dyZXkiLCJibHVlIiAsInJlZCIpKSArIHNjYWxlX3hfZGlzY3JldGUobGFiZWxzPWMoIkJvdGggd29yZHMgXG5OZXV0cmFsIiwiVGhyZWF0IFxuKHByb2JlIGxvY2F0aW9uKVxuIHcvIE5ldXRyYWwiLCJOZXV0cmFsIFxuKHByb2JlIGxvY2F0aW9uKVxuIHcvIFRocmVhdCIpKSArIHhsYWIoIiIpICsgeWxhYigibWVhblJUIikgKwogIGZhY2V0X3dyYXAofnB0c2QpIApgYGAKCiMjIyBBY2N1cmFjeQoKYGBge3J9CnQudGVzdChkcCRvdmVyYWxsX2FjY3VyYWN5IH4gZHAkcHRzZCwgcGFpcmVkID0gRkFMU0UgKQpgYGAKCj5ZZXMsIHRoZSByZXNpbGllbnQgZ3JvdXAgaXMgbW9yZSBhY2N1cmF0ZSB0aGFuIHRoZSBQVFNEIGdyb3VwLCBvdmVyYWxsLCB0aG91Z2ggdGhlIGRpZmZlcmVuY2UgaXMgbm90IHRoYXQgbGFyZ2UgKDk1JSB2cy4gOTMlKQoKYGBge3IsZXZhbD1GQUxTRX0KZ2dwbG90KGRwLCBhZXMocHRzZCwgb3ZlcmFsbF9hY2N1cmFjeSwgZmlsbD1wdHNkKSkgKyAKICBzdGF0X3N1bW1hcnkoZ2VvbSA9ICJjb2wiLCBmdW4gPSBtZWFuLCBwb3NpdGlvbiA9ICJkb2RnZSIsIGNvbG9yPSJibGFjayIpICsKICBzdGF0X3N1bW1hcnkoZ2VvbSA9ICJlcnJvcmJhciIsIGZ1bi5kYXRhID0gbWVhbl9zZSwgcG9zaXRpb249cG9zaXRpb25fZG9kZ2UoLjkpLCB3aWR0aCA9IDAuMjUsIGNvbG9yPSJibGFjayIpICsgbGFicyh0aXRsZT0iT3ZlcmFsbCB0YXNrIGFjY3VyYWN5IikgKyB0aGVtZV9jbGVhbihiYXNlX3NpemUgPSAxNCkgKyB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIsIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KAogICAgYW5nbGUgPSAwLAogICAgdmp1c3QgPSAwLAogICAgaGp1c3QgPSAwKSkgKyB4bGFiKCIiKSsgCnNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcz1jKCIjMmViNGU3IiwiIzI5MWQ2ZCIsICIjZDQxNDhkIikpICsgeGxhYigiIikgKyB5bGFiKCIlIGNvcnJlY3QgcmVzcG9uc2VzIikgK3NjYWxlX3hfZGlzY3JldGUobGFiZWxzID0gYygnUmVzaWxpZW50JywgJ1BUU0QnKSkgCmBgYAoKCgoKIyMjIFRocmVhdCBCaWFzCldlIGNhbGN1bGF0ZWQgdGhyZWF0IGJpYXMgYnkgc3VidHJhY3RpbmcgUlRzIGluIHRoZSAicHJvYmUgaW4gdGhyZWF0IGxvY2F0aW9uIiBjb25kaXRpb24gZnJvbSBSVHMgaW4gdGhlICJwcm9iZSBpbiBuZXV0cmFsIGxvY2F0aW9uICgrIG90aGVyIHdvcmQgaXMgdGhyZWF0KSIgY29uZGl0aW9uOiBgdGhyZWF0X2JpYXMgPSBuZXV0cmFsX3RocmVhdCBtaW51cyB0aHJlYXRfbmV1dHJhbGApLgoKUG9zaXRpdmUgbnVtYmVycyA9IHNlbGVjdGl2ZSBhdHRlbnRpb24gZm9yIHRocmVhdCAodGhyZWF0IGJpYXM7IGVzc2VudGlhbGx5LCBmYXN0ZXIgdG8gdGhyZWF0IHRoYW4gbmV1dHJhbCkuIE5lZ2F0aXZlIG51bWJlcnMgaW5kaWNhdGUgdGhyZWF0IGF2b2lkYW5jZSBiaWFzIChlc3NlbnRpYWxseSwgZmFzdGVyIHRvIG5ldXRyYWwgdGhhbiB0aHJlYXQpLgoKYGBge3J9CnQudGVzdChkcCR0aHJlYXRfYmlhcyB+IGRwJHB0c2QsIHBhaXJlZCA9IEZBTFNFICkKYGBgCgpgYGB7cn0KZ2dwbG90KGRwLCBhZXMocHRzZCwgdGhyZWF0X2JpYXMsIGZpbGw9cHRzZCkpICsgCiAgc3RhdF9zdW1tYXJ5KGdlb20gPSAiY29sIiwgZnVuID0gbWVhbiwgcG9zaXRpb24gPSAiZG9kZ2UiLCBjb2xvcj0iYmxhY2siKSArCiAgc3RhdF9zdW1tYXJ5KGdlb20gPSAiZXJyb3JiYXIiLCBmdW4uZGF0YSA9IG1lYW5fc2UsIHBvc2l0aW9uPXBvc2l0aW9uX2RvZGdlKC45KSwgd2lkdGggPSAwLjI1LCBjb2xvcj0iYmxhY2siKSArIGxhYnModGl0bGU9IlRocmVhdCBCaWFzIikgKyB0aGVtZV9jbGVhbihiYXNlX3NpemUgPSAxNikgKyB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIsIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KAogICAgYW5nbGUgPSAwLAogICAgdmp1c3QgPSAwLAogICAgaGp1c3QgPSAwKSkgKyB4bGFiKCIiKSsgCnNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcz1jKCIjMmViNGU3IiwiIzI5MWQ2ZCIsICIjZDQxNDhkIikpICsgeGxhYigiIikgKyB5bGFiKCJSVCBkaWZmZXJlbmNlIikgK3NjYWxlX3hfZGlzY3JldGUobGFiZWxzID0gYygnUmVzaWxpZW50JywgJ1BUU0QnKSkgCmBgYAoKPiBUaGVyZSBpcyBOT1QgYSBzaWduaWZpY2FudCBkaWZmZXJlbmNlIGluIHRocmVhdCBiaWFzIGJldHdlZW4gZ3JvdXBzLiBOb3RlIHRoYXQgdGhlIElhY292ZWxsaSBwYXBlciB5b3UgcmVhZCBzaW1pbGFybHkgZGlkIG5vdCBmaW5kIGEgZGlmZmVyZW5jZSBpbiB0aHJlYXQgYmlhcywgb25seSB0aHJlYXQgYmlhcyAqdmFyaWFiaWxpdHkqLgoKPiBTbywgd2hhdCBkbyB3ZSBtYWtlIG9mIHRoaXM/