Questions 7, 8, 9, 10.
Transportation behavior.

Q7. What types of public transportation do you regularly use?

# subset question data, rename columns, gather into single column
q7_df <- df %>%
  select(CaseID, PPGENDER, PPAGE, ppagecat, PPETHM, PPINCIMP, PPEDUC, PPEDUCAT,
         work, PPWORK, marital, PPMARIT, PPMSACAT, ppreg9, PPSTATEN, PPHOUSE, PPRENT, PPNET,
         Q7_1:Q7_7, Q7_otherText, weight) %>%
  rename(Bus = Q7_1, Carpool = Q7_2, Subway = Q7_3, Train = Q7_4,
         Taxi = Q7_5, Airplane = Q7_6, Other = Q7_7) %>%
  gather(Q7_q, Q7_r, Bus:Other, na.rm = T) %>%
  mutate(Q7_q = as.factor(Q7_q))
# select only Yes responses
q7_df <- q7_df[(q7_df$Q7_r)=='Yes', ]
# survey design
options(digits = 4)
options(survey.lonely.psu = "adjust")
des7 <- svydesign(ids = ~1, weights = ~weight, data = q7_df[is.na(q7_df$weight)==F, ])

Gender, age, ethnicity, income, education, work

# weighted data frame
q7 <- data.frame(svytable(~Q7_q + Q7_r + PPGENDER + ppagecat + PPETHM + PPINCIMP +
                            PPEDUC + PPEDUCAT + work + PPWORK, des7, round = T))
# plot templates
title <- ggtitle("What types of public transportation do you regularly use?")
## main plot
p <- ggplot(q7, aes(Q7_q, weight = Freq)) + ptext
p + geom_bar() + title

## plot2: exclude 'Other' column
p2 <- ggplot(q7[!(q7$Q7_q)=='Other', ], aes(Q7_q, weight = Freq)) + ptext
# by gender
#p2 + geom_bar() + aes(PPGENDER, fill = PPGENDER) + facet_wrap(~Q7_q) + ggtitle("By gender")
# age boxplot
svyboxplot(PPAGE~Q7_q, des7, main = "Age boxplot per response")

# by age group
p2 + geom_bar() + aes(ppagecat, fill = ppagecat) + facet_wrap(~Q7_q) + ggtitle("Public transportation by age group")

p2 + geom_bar(position = "fill") + aes(ppagecat, fill = Q7_q) + ggtitle("Public transportation by age group")

# by ethnic group
svytable(~PPETHM + Q7_q, des7, round = T)
                        Q7_q
PPETHM                   Airplane Bus Carpool Other Subway Taxi Train
  White, Non-Hispanic          10  59       4    10     24    9    24
  Black, Non-Hispanic           0  46       1     5     13    5    12
  Hispanic                      1  32       9     0     13    7    15
  Other, Non-Hispanic           2  13       0     0     10    2     9
  2+ Races, Non-Hispanic        1   6       0     1      2    2     1
p + geom_bar() + aes(PPETHM, fill = PPETHM) + facet_wrap(~Q7_q) + ggtitle("Types of public trans. used by ethnic group") + ptext2

p + geom_bar(position = "fill") + aes(PPETHM, fill = Q7_q) + ggtitle("% transportation type per ethnic group")

p + geom_bar() + aes(fill = Q7_q) + facet_wrap(~PPETHM) + ggtitle("Public trans. within each ethnic group")

p + geom_bar(position = "fill") + aes(fill = PPETHM) + ggtitle("% ethnicity using type of public trans.")

# by income
p + geom_bar() + aes(PPINCIMP, fill = PPINCIMP) + facet_wrap(~Q7_q) + ggtitle("Transportation by income") + ptext2

p + geom_bar(position = "fill") + aes(PPINCIMP, fill = Q7_q) + ggtitle("% transport. type per income group")

# by education
p + geom_bar(position = "dodge") + aes(fill = PPEDUCAT) + ggtitle("By education")

p + geom_bar(position = "fill") + aes(fill = PPEDUCAT) + ggtitle("By education")

p + geom_bar() + aes(fill = Q7_q) + facet_wrap(~PPEDUCAT) + ggtitle("By education")

# by work status
p + geom_bar(position = "dodge") + aes(fill = work) + ggtitle("By employment status")

p + geom_bar(position = "fill") + aes(fill = PPWORK) + ggtitle("By employment status")

p + geom_bar() + aes(PPWORK, fill = PPWORK) + facet_wrap(~Q7_q) + ggtitle("By employment status") + ptext2

p + geom_bar(position = "fill") + aes(PPWORK, fill = Q7_q) + ggtitle("By employment status")

Marital status, metro status, region, state of residency, house type, housing status, internet availability

# update weighted data frame
q7.2 <- data.frame(svytable(~Q7_q + Q7_r + marital + PPMARIT + PPMSACAT + ppreg9 +
                              PPSTATEN + PPHOUSE + PPRENT + PPNET, des7, round = T))
# restate plots
p3 <- ggplot(q7.2, aes(Q7_q, weight = Freq)) + ptext
p4 <- ggplot(q7.2[!(q7.2$Q7_q)=='Other', ], aes(Q7_q, weight = Freq)) + ptext
# by marital status
p3 + geom_bar() + aes(marital, fill = marital) + facet_wrap(~Q7_q) + ggtitle("By marital status")

p3 + geom_bar() + aes(PPMARIT, fill = Q7_q) + ggtitle("By marital status")

p3 + geom_bar(position = "fill") + aes(PPMARIT, fill = Q7_q) + ggtitle("By marital status")

p3 + geom_bar(position = "fill") + aes(fill = PPMARIT) + ggtitle("By marital status")

p3 + geom_bar() + aes(PPMARIT, fill = PPMARIT) + facet_wrap(~Q7_q) + ggtitle("By marital status")

# by metro status
p3 + geom_bar() + aes(fill = PPMSACAT) + facet_wrap(~PPMSACAT) + ggtitle("By metro status")

# by region
p3 + geom_bar(position = 'fill') + aes(fill = ppreg9) + ggtitle("Public trans. type by US region")

p3 + geom_bar(position = 'stack') + aes(ppreg9, fill = Q7_q) + ggtitle("US regions by public trans. type")

p3 + geom_bar(position = 'fill') + aes(ppreg9, fill = Q7_q) + ggtitle("US regions by public trans. type")

# by state
p3 + geom_bar() + aes(PPSTATEN, fill = Q7_q) + coord_flip() + ggtitle("Transportation by state")

# by house type
p3 + geom_bar(position = "dodge") + aes(PPHOUSE, fill = Q7_q) + ggtitle("By house type")

p3 + geom_bar(position = "fill") + aes(fill = PPHOUSE) + ggtitle("By house type")

# by housing status
p3 + geom_bar(position = "dodge") + aes(PPRENT, fill = Q7_q) + ggtitle("By housing status")

p3 + geom_bar(position = "fill") + aes(fill = PPRENT) + ggtitle("By housing status")

# by internet availability
p3 + geom_bar(position = "fill") + aes(fill = PPNET) + ggtitle("Internet status")

p3 + geom_bar(position = "dodge") + aes(PPNET, fill = Q7_q) + ggtitle("Internet status")

Q8. For what types of activities do you regularly use public transportation?

# subset question data, rename columns, gather into single column
q8_df <- df %>%
  select(CaseID, PPGENDER, PPAGE, ppagecat, PPETHM, PPINCIMP, PPEDUC, PPEDUCAT,
         work, PPWORK, marital, PPMARIT, PPMSACAT, ppreg9, PPSTATEN, PPHOUSE, PPRENT, PPNET,
         Q8_1:Q8_6, weight) %>%
  rename(Work = Q8_1, School = Q8_2, Shopping = Q8_3, Visiting_people = Q8_4,
         Recreation = Q8_5, Other = Q8_6) %>%
  gather(Q8_q, Q8_r, Work:Other, na.rm = T) %>%
  mutate(Q8_q = as.factor(Q8_q))
# select only Yes responses
q8_df <- q8_df[q8_df$Q8_r == 'Yes', ]
# survey design
options(digits = 4)
options(survey.lonely.psu = "adjust")
des8 <- svydesign(ids = ~1, weights = ~weight, data = q8_df[is.na(q8_df$weight)==F, ])

Gender, age, ethnicity, income, education

# weighted data frame
q8 <- data.frame(svytable(~Q8_q + Q8_r + PPGENDER + ppagecat + PPETHM + PPINCIMP + 
                            PPEDUC + PPEDUCAT + work + PPWORK, des8, round = T))
# plot templates
title <- ggtitle("For what types of activities do you regularly use public transportation?")
## main plot
p <- ggplot(q8, aes(Q8_q, weight = Freq)) + ptext
p + geom_bar() + title

## plot2: exclude 'Other' column
p2 <- ggplot(q8[!(q8$Q8_q)=='Other', ], aes(Q8_q, weight = Freq)) + ptext
# by gender
p2 + geom_bar() + aes(PPGENDER, fill = PPGENDER) + facet_wrap(~Q8_q) + ggtitle("By gender")

# age boxplot
svyboxplot(PPAGE~Q8_q, des8, main = "Age boxplot per response")

# by age group
p2 + geom_bar() + aes(ppagecat, fill = ppagecat) + facet_wrap(~Q8_q) + ggtitle("By age group")

p2 + geom_bar(position = "fill") + aes(ppagecat, fill = Q8_q)

# by ethnic group
p + geom_bar() + aes(PPETHM, fill = PPETHM) + facet_wrap(~Q8_q) + ggtitle("By ethnic group") +
  ptext2

p + geom_bar(position = "fill") + aes(PPETHM, fill = Q8_q)

p + geom_bar() + aes(fill = Q8_q) + facet_wrap(~PPETHM) + ggtitle("By ethnic group")

p + geom_bar(position = "fill") + aes(fill = PPETHM)

# by income
p + geom_bar() + aes(PPINCIMP, fill = PPINCIMP) + facet_wrap(~Q8_q) + ggtitle("By income") + 
  ptext2

p + geom_bar(position = "fill") + aes(PPINCIMP, fill = Q8_q)

# by education
p + geom_bar() + aes(PPEDUCAT, fill = PPEDUCAT) + facet_wrap(~Q8_q) + ggtitle("By education")

p + geom_bar(position = "fill") + aes(PPEDUCAT, fill = Q8_q)

p + geom_bar(position = "fill") + aes(PPEDUC, fill = Q8_q)

p + geom_bar() + aes(fill = Q8_q) + facet_wrap(~PPEDUCAT) + ggtitle("By education")

p + geom_bar(position = "fill") + aes(fill = PPEDUCAT)

# by work status
p + geom_bar() + aes(work, fill = work) + facet_wrap(~Q8_q) + ggtitle("By employment status")

p + geom_bar(position = "fill") + aes(PPWORK, fill = Q8_q) + ggtitle("By employment status")

Marital status, metro status, region, state of residency, house type, housing status, internet availability

# weighted data frame
q8.2 <- data.frame(svytable(~Q8_q + Q8_r + work + marital + PPMARIT + PPMSACAT + ppreg9 +
                              PPSTATEN + PPHOUSE + PPRENT + PPNET, des8, round = T))
# restate plots
p3 <- ggplot(q8.2, aes(Q8_q, weight = Freq)) + ptext
p4 <- ggplot(q8.2[!(q8.2$Q8_q)=='Other', ], aes(Q8_q, weight = Freq)) + ptext
# by marital status
p3 + geom_bar() + aes(marital, fill = marital) + facet_wrap(~Q8_q) + ggtitle("By marital status")

p3 + geom_bar(position = "fill") + aes(marital, fill = Q8_q)

p3 + geom_bar() + aes(PPMARIT, fill = PPMARIT) + facet_wrap(~Q8_q)

p3 + geom_bar() + aes(PPMARIT, fill = Q8_q) + ggtitle("By marital status")

# by metro status
p3 + geom_bar() + aes(PPMSACAT, fill = PPMSACAT) + facet_wrap(~Q8_q) + ggtitle("By metro status")

p3 + geom_bar(position = "stack") + aes(fill = PPMSACAT)

p3 + geom_bar() + aes(fill = PPMSACAT) + facet_wrap(~PPMSACAT)

# by region
p3 + geom_bar(position = 'fill') + aes(fill = ppreg9) + ggtitle("Responses by US region")

p3 + geom_bar(position = 'fill') + aes(ppreg9, fill = Q8_q) + ggtitle("US regions by response")

# by state
p3 + geom_bar() + aes(PPSTATEN, fill = Q8_q) + coord_flip() + ggtitle("By state")

p3 + geom_bar(position = 'fill') + aes(PPSTATEN, fill = Q8_q) + coord_flip() + ggtitle("By state")

# by house type
p3 + geom_bar() + aes(fill = PPHOUSE) + ggtitle("By house type")

p3 + geom_bar(position = 'fill') + aes(fill = PPHOUSE)

p3 + geom_bar() + aes(PPHOUSE, fill = PPHOUSE) + facet_wrap(~Q8_q) + ptext2

# by housing status
# by internet availability
p3 + geom_bar(position = "fill") + aes(fill = PPNET) + ggtitle("Internet status")

p3 + geom_bar(position = 'fill') + aes(PPNET, fill = Q8_q) + ggtitle("Internet status")

Q9. Do other members of your household regularly use public transportation?

Ethnicity, income, metro status, region, state, house type, housing status

# weighted data frame
q9 <- data.frame(svytable(~Q9 + PPETHM + PPINCIMP + PPMSACAT + ppreg9 + 
                            PPSTATEN + PPHOUSE + PPRENT, des, round = T))
# plot templates
title <- ggtitle("Do other members of your household regularly use public transportation?")
## main plot
p <- ggplot(q9, aes(Q9, weight = Freq)) + ptext
p + geom_bar() + title

## plot2: exclude 'Don_t know' column
p2 <- ggplot(q9[!(q9$Q9)=='Don_t know', ], aes(Q9, weight = Freq)) + ptext
# by ethnic group
p2 + geom_bar() + aes(fill = PPETHM) + ggtitle("By ethnic group") + ptext2

p2 + geom_bar(position = "fill") + aes(PPETHM, fill = Q9)

p2 + geom_bar() + aes(fill = Q9) + facet_wrap(~PPETHM) + ggtitle("By ethnic group")

p2 + geom_bar(position = "fill") + aes(fill = PPETHM)

# by income
p2 + geom_bar() + aes(fill = PPINCIMP) + ggtitle("By income") + ptext2

p2 + geom_bar(position = "fill") + aes(PPINCIMP, fill = Q9)

# by metro status
p2 + geom_bar() + aes(fill = PPMSACAT) + ggtitle("By metro status")

p2 + geom_bar(position = "stack") + aes(PPMSACAT, fill = Q9)

# by region
p2 + geom_bar(position = 'fill') + aes(fill = ppreg9) + ggtitle("Responses by US region")

p2 + geom_bar(position = 'fill') + aes(ppreg9, fill = Q9) + ggtitle("US regions by response")

# by state
p2 + geom_bar() + aes(PPSTATEN, fill = Q9) + coord_flip() + ggtitle("By state")

p2 + geom_bar(position = 'fill') + aes(PPSTATEN, fill = Q9) + coord_flip() + ggtitle("By state")

# by house type
p2 + geom_bar() + aes(fill = PPHOUSE) + ggtitle("By housing")

p2 + geom_bar(position = 'fill') + aes(fill = PPHOUSE)

p2 + geom_bar() + aes(PPHOUSE, fill = Q9) + ptext2

# by housing status

Q10. What types of public transportation do other members of your household regularly use?

# subset question data, rename columns, gather into single column
q10_df <- df %>%
  select(CaseID, PPGENDER, PPAGE, ppagecat, PPETHM, PPINCIMP, PPEDUC, PPEDUCAT,
         work, PPWORK, marital, PPMARIT, PPMSACAT, ppreg9, PPSTATEN, PPHOUSE, PPRENT, PPNET,
       Q10_1:Q10_8, weight) %>%
  rename(Bus = Q10_1, Carpool = Q10_2, Subway = Q10_3, Train = Q10_4,
         Taxi = Q10_5, Airplane = Q10_6, Don_t_know = Q10_7, Other = Q10_8) %>%
  gather(Q10_q, Q10_r, Bus:Other, na.rm = T) %>%
  mutate(Q10_q = as.factor(Q10_q))
# select only Yes responses
q10_df <- q10_df[q10_df$Q10_r == 'Yes', ]
# survey design
options(digits = 4)
options(survey.lonely.psu = "adjust")
des10 <- svydesign(ids = ~1, weights = ~weight, data = q10_df[is.na(q10_df$weight)==F, ])

Gender, age, ethnicity, income, education, work

# weighted data frame
q10 <- data.frame(svytable(~Q10_q + Q10_r + PPGENDER + ppagecat + PPETHM + PPINCIMP +
                            PPEDUC + PPEDUCAT + work + PPWORK, des10, round = T))
# plot templates
title <- ggtitle("What types of public transportation do other members of your household regularly use?")
## main plot
p <- ggplot(q10, aes(Q10_q, weight = Freq)) + ptext
p + geom_bar() + title

## plot2: exclude 'Don_t know' column
p2 <- ggplot(q10[!(q10$Q10_q)=='Don_t_know', ], aes(Q10_q, weight = Freq)) + ptext
# by gender
p2 + geom_bar() + aes(PPGENDER, fill = PPGENDER) + facet_wrap(~Q10_q) + ggtitle("By gender")

# by age group
p2 + geom_bar() + aes(ppagecat, fill = ppagecat) + facet_wrap(~Q10_q) + ggtitle("By age group")

p2 + geom_bar(position = "fill") + aes(ppagecat, fill = Q10_q)

# by ethnic group
p + geom_bar() + aes(PPETHM, fill = PPETHM) + facet_wrap(~Q10_q) + ggtitle("By ethnic group") +
  ptext2

p + geom_bar(position = "fill") + aes(PPETHM, fill = Q10_q)

p + geom_bar() + aes(fill = Q10_q) + facet_wrap(~PPETHM) + ggtitle("By ethnic group")

p + geom_bar(position = "fill") + aes(fill = PPETHM)

# by income
p + geom_bar() + aes(PPINCIMP, fill = PPINCIMP) + facet_wrap(~Q10_q) + ggtitle("By income") + 
  ptext2

p + geom_bar(position = "fill") + aes(PPINCIMP, fill = Q10_q)

# by education
p + geom_bar() + aes(PPEDUCAT, fill = PPEDUCAT) + facet_wrap(~Q10_q) + ggtitle("By education")

p + geom_bar(position = "fill") + aes(PPEDUCAT, fill = Q10_q)

p + geom_bar(position = "fill") + aes(PPEDUC, fill = Q10_q)

p + geom_bar() + aes(fill = Q10_q) + facet_wrap(~PPEDUCAT) + ggtitle("By education")

p + geom_bar(position = "fill") + aes(fill = PPEDUCAT)

# by work status
p + geom_bar() + aes(work, fill = work) + facet_wrap(~Q10_q) + ggtitle("By employment status")

p + geom_bar(position = "fill") + aes(PPWORK, fill = Q10_q) + ggtitle("By employment status")

Marital status, metro status, region, state of residency, house type, housing status, internet availability

# update weighted data frame
q10.2 <- data.frame(svytable(~Q10_q + Q10_r + marital + PPMARIT + PPMSACAT + ppreg9 +
                              PPSTATEN + PPHOUSE + PPRENT + PPNET, des10, round = T))
# restate plots
p3 <- ggplot(q10.2, aes(Q10_q, weight = Freq)) + ptext
p4 <- ggplot(q10.2[!(q10.2$Q10_q)=='Don_t_know', ], aes(Q10_q, weight = Freq)) + ptext
# by marital status
p3 + geom_bar() + aes(marital, fill = marital) + facet_wrap(~Q10_q) + ggtitle("By marital status")

p3 + geom_bar(position = 'fill') + aes(marital, fill = Q10_q)

p3 + geom_bar() + aes(PPMARIT, fill = PPMARIT) + facet_wrap(~Q10_q)

p3 + geom_bar() + aes(PPMARIT, fill = Q10_q) + ggtitle("By marital status")

# by metro status
p3 + geom_bar() + aes(PPMSACAT, fill = PPMSACAT) + facet_wrap(~Q10_q) + ggtitle("By metro status")

p3 + geom_bar(position = 'stack') + aes(fill = PPMSACAT)

p3 + geom_bar() + aes(fill = PPMSACAT) + facet_wrap(~PPMSACAT)

# by region
p3 + geom_bar(position = 'fill') + aes(fill = ppreg9) + ggtitle("Responses by US region")

p3 + geom_bar(position = 'fill') + aes(ppreg9, fill = Q10_q) + ggtitle("US regions by response")

# by state
p3 + geom_bar() + aes(PPSTATEN, fill = Q10_q) + coord_flip() + ggtitle("By state")

p3 + geom_bar(position = 'fill') + aes(PPSTATEN, fill = Q10_q) + coord_flip() + ggtitle("By state")

# by house type
p3 + geom_bar() + aes(fill = PPHOUSE) + ggtitle("By housing")

p3 + geom_bar(position = 'fill') + aes(fill = PPHOUSE)

p3 + geom_bar() + aes(PPHOUSE, fill = PPHOUSE) + facet_wrap(~Q10_q) + ptext2

# by housing status
# by internet availability
p3 + geom_bar(position = 'fill') + aes(fill = PPNET) + ggtitle("Internet status")

p3 + geom_bar(position = 'fill') + aes(PPNET, fill = Q10_q) + ggtitle("Internet status")

LS0tCnRpdGxlOiAnQmVoYXZpb3IgcGFydCAxOiBUcmFuc3BvcnRhdGlvbicKb3V0cHV0OgogIGh0bWxfbm90ZWJvb2s6CiAgICB0aGVtZTogcGFwZXIKICAgIHRvYzogeWVzCiAgICB0b2NfZGVwdGg6IDIKICBodG1sX2RvY3VtZW50OgogICAgZmlnX2hlaWdodDogNAogICAgZmlnX3dpZHRoOiA2CiAgICBrZWVwX21kOiB5ZXMKICAgIHRoZW1lOiBwYXBlcgogICAgdG9jOiB5ZXMKICAgIHRvY19kZXB0aDogMgotLS0KClF1ZXN0aW9ucyA3LCA4LCA5LCAxMC4gIApUcmFuc3BvcnRhdGlvbiBiZWhhdmlvci4KCmBgYHtyIHNldHVwLCBpbmNsdWRlPUZBTFNFfQojIyBTZXR1cC4Ka25pdHI6Om9wdHNfY2h1bmskc2V0KGVjaG8gPSBULCBjYWNoZSA9IFQsIGNhY2hlLmNvbW1lbnRzID0gRiwgd2FybmluZyA9IEYsIG1lc3NhZ2UgPSBGLCBzaXplID0gInNtYWxsIikKcm0obGlzdCA9IGxzKGFsbC5uYW1lcyA9IFQpKQpsaWJyYXJ5KHJtYXJrZG93bik7IGxpYnJhcnkoa25pdHIpOyBsaWJyYXJ5KGdyaWRFeHRyYSkKbGlicmFyeSh0aWR5cik7IGxpYnJhcnkoZHBseXIpOyBsaWJyYXJ5KGdncGxvdDIpOyBsaWJyYXJ5KHN1cnZleSkKYGBgCgpgYGB7ciBsb2FkLWRhdGEsIGluY2x1ZGU9Rn0KIyMgTG9hZCBkYXRhLgpsb2FkKCJ+L2dpdC9mbHUtc3VydmV5L2RhdGEvY2xlYW5pbmcyLlJEYXRhIikKbG9hZCgifi9naXQvZmx1LXN1cnZleS9kYXRhL3JlY29kaW5nLlJEYXRhIikgICMgbG9hZCBkYXRhcgpkZiA8LSBkYXRhciAgIyByZWNvZGVkIHZhcmlhYmxlcwpgYGAKCmBgYHtyIGdyb3VwLWRhdGEsIGluY2x1ZGU9Rn0KIyMgUmVncm91cCB2YXJpYWJsZXMuCiMgaW5jb21lCmluY29tZS5tYXAgPC0gYyhyZXAoInVuZGVyICQxMGsiLCAzKSwgcmVwKCIkMTBrIHRvICQyNWsiLCA0KSwKICAgICAgICAgICAgICAgIHJlcCgiJDI1ayB0byAkNTBrIiwgNCksIHJlcCgiJDUwayB0byAkNzVrIiwgMiksCiAgICAgICAgICAgICAgICByZXAoIiQ3NWsgdG8gJDEwMGsiLCAyKSwgcmVwKCIkMTAwayB0byAkMTUwayIsIDIpLAogICAgICAgICAgICAgICAgcmVwKCJvdmVyICQxNTBrIiwgMikpCmRmJGluY29tZSA8LSBjb2RlKGRhdGFyJFBQSU5DSU1QLCBpbmNvbWUubWFwLCAidW5kZXIgJDEwayIpCmluY29tZS5sYWIgPC0gYygidW5kZXIgJDEwayIsICIkMTBrIHRvICQyNWsiLCAiJDI1ayB0byAkNTBrIiwKICAgICAgICAgICAgICAgICIkNTBrIHRvICQ3NWsiLCAiJDc1ayB0byAkMTAwayIsICIkMTAwayB0byAkMTUwayIsCiAgICAgICAgICAgICAgICAib3ZlciAkMTUwayIpCmRmJGluY29tZSA8LSBmYWN0b3IoZGYkaW5jb21lLCBsZXZlbHMgPSBpbmNvbWUubGFiKQoKIyBtYXJpdGFsIHN0YXVzCm1hcml0YWwubWFwIDwtIGMoInNpbmdsZSIsICJwYXJ0bmVyZWQiLCAicGFydG5lcmVkIiwgInNpbmdsZSIsICJzaW5nbGUiLCAic2luZ2xlIikKZGYkbWFyaXRhbCA8LSBjb2RlKGRhdGFmJFBQTUFSSVQsIG1hcml0YWwubWFwLCAic2luZ2xlIikKCiMgd29yayBzdGF0dXMKd29yay5tYXAgPC0gYyhyZXAoInVuZW1wbG95ZWQiLCA1KSwKICAgICAgICAgICAgICByZXAoImVtcGxveWVkIiwgMikpCmRmJHdvcmsgPC0gY29kZShkYXRhZiRQUFdPUkssIHdvcmsubWFwLCAidW5lbXBsb3llZCIpCmBgYAoKYGBge3IgZGVzLXN1cnZleSwgaW5jbHVkZT1GQUxTRX0KIyMgQ3JlYXRlIHN1cnZleSBvYmplY3QuCm9wdGlvbnMoZGlnaXRzID0gNCkKb3B0aW9ucyhzdXJ2ZXkubG9uZWx5LnBzdSA9ICJhZGp1c3QiKQoKZGVzIDwtIHN2eWRlc2lnbihpZHMgPSB+MSwgd2VpZ2h0cyA9IH53ZWlnaHQsIGRhdGEgPSBkZltpcy5uYShkZiR3ZWlnaHQpPT1GLCBdKQpgYGAKCmBgYHtyIHBsb3QtdGVtcCwgaW5jbHVkZT1GfQojIyBDcmVhdGUgZ2dwbG90IHRlbXBsYXRlcy4KcHRleHQgPC0gdGhlbWUoYXhpcy50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSByZWwoMC45KSksCiAgICAgICAgICAgICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNDUsIGhqdXN0ID0gMSkpCnB0ZXh0MiA8LSBwdGV4dCArIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF9ibGFuaygpKQpgYGAKCgoKIyMgUTcuIFdoYXQgdHlwZXMgb2YgcHVibGljIHRyYW5zcG9ydGF0aW9uIGRvIHlvdSByZWd1bGFybHkgdXNlPwoKYGBge3IgcTctZGF0YX0KIyBzdWJzZXQgcXVlc3Rpb24gZGF0YSwgcmVuYW1lIGNvbHVtbnMsIGdhdGhlciBpbnRvIHNpbmdsZSBjb2x1bW4KcTdfZGYgPC0gZGYgJT4lCiAgc2VsZWN0KENhc2VJRCwgUFBHRU5ERVIsIFBQQUdFLCBwcGFnZWNhdCwgUFBFVEhNLCBQUElOQ0lNUCwgUFBFRFVDLCBQUEVEVUNBVCwKICAgICAgICAgd29yaywgUFBXT1JLLCBtYXJpdGFsLCBQUE1BUklULCBQUE1TQUNBVCwgcHByZWc5LCBQUFNUQVRFTiwgUFBIT1VTRSwgUFBSRU5ULCBQUE5FVCwKICAgICAgICAgUTdfMTpRN183LCBRN19vdGhlclRleHQsIHdlaWdodCkgJT4lCiAgcmVuYW1lKEJ1cyA9IFE3XzEsIENhcnBvb2wgPSBRN18yLCBTdWJ3YXkgPSBRN18zLCBUcmFpbiA9IFE3XzQsCiAgICAgICAgIFRheGkgPSBRN181LCBBaXJwbGFuZSA9IFE3XzYsIE90aGVyID0gUTdfNykgJT4lCiAgZ2F0aGVyKFE3X3EsIFE3X3IsIEJ1czpPdGhlciwgbmEucm0gPSBUKSAlPiUKICBtdXRhdGUoUTdfcSA9IGFzLmZhY3RvcihRN19xKSkKCiMgc2VsZWN0IG9ubHkgWWVzIHJlc3BvbnNlcwpxN19kZiA8LSBxN19kZlsocTdfZGYkUTdfcik9PSdZZXMnLCBdCgojIHN1cnZleSBkZXNpZ24Kb3B0aW9ucyhkaWdpdHMgPSA0KQpvcHRpb25zKHN1cnZleS5sb25lbHkucHN1ID0gImFkanVzdCIpCmRlczcgPC0gc3Z5ZGVzaWduKGlkcyA9IH4xLCB3ZWlnaHRzID0gfndlaWdodCwgZGF0YSA9IHE3X2RmW2lzLm5hKHE3X2RmJHdlaWdodCk9PUYsIF0pCgpgYGAKCiMjIyBHZW5kZXIsIGFnZSwgZXRobmljaXR5LCBpbmNvbWUsIGVkdWNhdGlvbiwgd29yawoKYGBge3IgcTctcGxvdC0xfQojIHdlaWdodGVkIGRhdGEgZnJhbWUKcTcgPC0gZGF0YS5mcmFtZShzdnl0YWJsZSh+UTdfcSArIFE3X3IgKyBQUEdFTkRFUiArIHBwYWdlY2F0ICsgUFBFVEhNICsgUFBJTkNJTVAgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgUFBFRFVDICsgUFBFRFVDQVQgKyB3b3JrICsgUFBXT1JLLCBkZXM3LCByb3VuZCA9IFQpKQojIHBsb3QgdGVtcGxhdGVzCnRpdGxlIDwtIGdndGl0bGUoIldoYXQgdHlwZXMgb2YgcHVibGljIHRyYW5zcG9ydGF0aW9uIGRvIHlvdSByZWd1bGFybHkgdXNlPyIpCgojIyBtYWluIHBsb3QKcCA8LSBnZ3Bsb3QocTcsIGFlcyhRN19xLCB3ZWlnaHQgPSBGcmVxKSkgKyBwdGV4dApwICsgZ2VvbV9iYXIoKSArIHRpdGxlCgpgYGAKCmBgYHtyIHE3LXBsb3QtMWJ9CiMjIHBsb3QyOiBleGNsdWRlICdPdGhlcicgY29sdW1uCnAyIDwtIGdncGxvdChxN1shKHE3JFE3X3EpPT0nT3RoZXInLCBdLCBhZXMoUTdfcSwgd2VpZ2h0ID0gRnJlcSkpICsgcHRleHQKCiMgYnkgZ2VuZGVyCiNwMiArIGdlb21fYmFyKCkgKyBhZXMoUFBHRU5ERVIsIGZpbGwgPSBQUEdFTkRFUikgKyBmYWNldF93cmFwKH5RN19xKSArIGdndGl0bGUoIkJ5IGdlbmRlciIpCgojIGFnZSBib3hwbG90CnN2eWJveHBsb3QoUFBBR0V+UTdfcSwgZGVzNywgbWFpbiA9ICJBZ2UgYm94cGxvdCBwZXIgcmVzcG9uc2UiKQoKIyBieSBhZ2UgZ3JvdXAKcDIgKyBnZW9tX2JhcigpICsgYWVzKHBwYWdlY2F0LCBmaWxsID0gcHBhZ2VjYXQpICsgZmFjZXRfd3JhcCh+UTdfcSkgKyBnZ3RpdGxlKCJQdWJsaWMgdHJhbnNwb3J0YXRpb24gYnkgYWdlIGdyb3VwIikKcDIgKyBnZW9tX2Jhcihwb3NpdGlvbiA9ICJmaWxsIikgKyBhZXMocHBhZ2VjYXQsIGZpbGwgPSBRN19xKSArIGdndGl0bGUoIlB1YmxpYyB0cmFuc3BvcnRhdGlvbiBieSBhZ2UgZ3JvdXAiKQoKIyBieSBldGhuaWMgZ3JvdXAKc3Z5dGFibGUoflBQRVRITSArIFE3X3EsIGRlczcsIHJvdW5kID0gVCkKcCArIGdlb21fYmFyKCkgKyBhZXMoUFBFVEhNLCBmaWxsID0gUFBFVEhNKSArIGZhY2V0X3dyYXAoflE3X3EpICsgZ2d0aXRsZSgiVHlwZXMgb2YgcHVibGljIHRyYW5zLiB1c2VkIGJ5IGV0aG5pYyBncm91cCIpICsgcHRleHQyCnAgKyBnZW9tX2Jhcihwb3NpdGlvbiA9ICJmaWxsIikgKyBhZXMoUFBFVEhNLCBmaWxsID0gUTdfcSkgKyBnZ3RpdGxlKCIlIHRyYW5zcG9ydGF0aW9uIHR5cGUgcGVyIGV0aG5pYyBncm91cCIpCnAgKyBnZW9tX2JhcigpICsgYWVzKGZpbGwgPSBRN19xKSArIGZhY2V0X3dyYXAoflBQRVRITSkgKyBnZ3RpdGxlKCJQdWJsaWMgdHJhbnMuIHdpdGhpbiBlYWNoIGV0aG5pYyBncm91cCIpCnAgKyBnZW9tX2Jhcihwb3NpdGlvbiA9ICJmaWxsIikgKyBhZXMoZmlsbCA9IFBQRVRITSkgKyBnZ3RpdGxlKCIlIGV0aG5pY2l0eSB1c2luZyB0eXBlIG9mIHB1YmxpYyB0cmFucy4iKQoKIyBieSBpbmNvbWUKcCArIGdlb21fYmFyKCkgKyBhZXMoUFBJTkNJTVAsIGZpbGwgPSBQUElOQ0lNUCkgKyBmYWNldF93cmFwKH5RN19xKSArIGdndGl0bGUoIlRyYW5zcG9ydGF0aW9uIGJ5IGluY29tZSIpICsgcHRleHQyCnAgKyBnZW9tX2Jhcihwb3NpdGlvbiA9ICJmaWxsIikgKyBhZXMoUFBJTkNJTVAsIGZpbGwgPSBRN19xKSArIGdndGl0bGUoIiUgdHJhbnNwb3J0LiB0eXBlIHBlciBpbmNvbWUgZ3JvdXAiKQoKIyBieSBlZHVjYXRpb24KcCArIGdlb21fYmFyKHBvc2l0aW9uID0gImRvZGdlIikgKyBhZXMoZmlsbCA9IFBQRURVQ0FUKSArIGdndGl0bGUoIkJ5IGVkdWNhdGlvbiIpCnAgKyBnZW9tX2Jhcihwb3NpdGlvbiA9ICJmaWxsIikgKyBhZXMoZmlsbCA9IFBQRURVQ0FUKSArIGdndGl0bGUoIkJ5IGVkdWNhdGlvbiIpCnAgKyBnZW9tX2JhcigpICsgYWVzKGZpbGwgPSBRN19xKSArIGZhY2V0X3dyYXAoflBQRURVQ0FUKSArIGdndGl0bGUoIkJ5IGVkdWNhdGlvbiIpCgojIGJ5IHdvcmsgc3RhdHVzCnAgKyBnZW9tX2Jhcihwb3NpdGlvbiA9ICJkb2RnZSIpICsgYWVzKGZpbGwgPSB3b3JrKSArIGdndGl0bGUoIkJ5IGVtcGxveW1lbnQgc3RhdHVzIikKcCArIGdlb21fYmFyKHBvc2l0aW9uID0gImZpbGwiKSArIGFlcyhmaWxsID0gUFBXT1JLKSArIGdndGl0bGUoIkJ5IGVtcGxveW1lbnQgc3RhdHVzIikKcCArIGdlb21fYmFyKCkgKyBhZXMoUFBXT1JLLCBmaWxsID0gUFBXT1JLKSArIGZhY2V0X3dyYXAoflE3X3EpICsgZ2d0aXRsZSgiQnkgZW1wbG95bWVudCBzdGF0dXMiKSArIHB0ZXh0MgpwICsgZ2VvbV9iYXIocG9zaXRpb24gPSAiZmlsbCIpICsgYWVzKFBQV09SSywgZmlsbCA9IFE3X3EpICsgZ2d0aXRsZSgiQnkgZW1wbG95bWVudCBzdGF0dXMiKQoKYGBgCgojIyMgTWFyaXRhbCBzdGF0dXMsIG1ldHJvIHN0YXR1cywgcmVnaW9uLCBzdGF0ZSBvZiByZXNpZGVuY3ksIGhvdXNlIHR5cGUsIGhvdXNpbmcgc3RhdHVzLCBpbnRlcm5ldCBhdmFpbGFiaWxpdHkKCmBgYHtyIHE3LXBsb3QtMn0KIyB1cGRhdGUgd2VpZ2h0ZWQgZGF0YSBmcmFtZQpxNy4yIDwtIGRhdGEuZnJhbWUoc3Z5dGFibGUoflE3X3EgKyBRN19yICsgbWFyaXRhbCArIFBQTUFSSVQgKyBQUE1TQUNBVCArIHBwcmVnOSArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBQU1RBVEVOICsgUFBIT1VTRSArIFBQUkVOVCArIFBQTkVULCBkZXM3LCByb3VuZCA9IFQpKQojIHJlc3RhdGUgcGxvdHMKcDMgPC0gZ2dwbG90KHE3LjIsIGFlcyhRN19xLCB3ZWlnaHQgPSBGcmVxKSkgKyBwdGV4dApwNCA8LSBnZ3Bsb3QocTcuMlshKHE3LjIkUTdfcSk9PSdPdGhlcicsIF0sIGFlcyhRN19xLCB3ZWlnaHQgPSBGcmVxKSkgKyBwdGV4dApgYGAKCmBgYHtyIHE3LXBsb3QtMmJ9CiMgYnkgbWFyaXRhbCBzdGF0dXMKcDMgKyBnZW9tX2JhcigpICsgYWVzKG1hcml0YWwsIGZpbGwgPSBtYXJpdGFsKSArIGZhY2V0X3dyYXAoflE3X3EpICsgZ2d0aXRsZSgiQnkgbWFyaXRhbCBzdGF0dXMiKQpwMyArIGdlb21fYmFyKCkgKyBhZXMoUFBNQVJJVCwgZmlsbCA9IFE3X3EpICsgZ2d0aXRsZSgiQnkgbWFyaXRhbCBzdGF0dXMiKQpwMyArIGdlb21fYmFyKHBvc2l0aW9uID0gImZpbGwiKSArIGFlcyhQUE1BUklULCBmaWxsID0gUTdfcSkgKyBnZ3RpdGxlKCJCeSBtYXJpdGFsIHN0YXR1cyIpCnAzICsgZ2VvbV9iYXIocG9zaXRpb24gPSAiZmlsbCIpICsgYWVzKGZpbGwgPSBQUE1BUklUKSArIGdndGl0bGUoIkJ5IG1hcml0YWwgc3RhdHVzIikKcDMgKyBnZW9tX2JhcigpICsgYWVzKFBQTUFSSVQsIGZpbGwgPSBQUE1BUklUKSArIGZhY2V0X3dyYXAoflE3X3EpICsgZ2d0aXRsZSgiQnkgbWFyaXRhbCBzdGF0dXMiKQoKIyBieSBtZXRybyBzdGF0dXMKcDMgKyBnZW9tX2JhcigpICsgYWVzKGZpbGwgPSBQUE1TQUNBVCkgKyBmYWNldF93cmFwKH5QUE1TQUNBVCkgKyBnZ3RpdGxlKCJCeSBtZXRybyBzdGF0dXMiKQoKIyBieSByZWdpb24KcDMgKyBnZW9tX2Jhcihwb3NpdGlvbiA9ICdmaWxsJykgKyBhZXMoZmlsbCA9IHBwcmVnOSkgKyBnZ3RpdGxlKCJQdWJsaWMgdHJhbnMuIHR5cGUgYnkgVVMgcmVnaW9uIikKcDMgKyBnZW9tX2Jhcihwb3NpdGlvbiA9ICdzdGFjaycpICsgYWVzKHBwcmVnOSwgZmlsbCA9IFE3X3EpICsgZ2d0aXRsZSgiVVMgcmVnaW9ucyBieSBwdWJsaWMgdHJhbnMuIHR5cGUiKQpwMyArIGdlb21fYmFyKHBvc2l0aW9uID0gJ2ZpbGwnKSArIGFlcyhwcHJlZzksIGZpbGwgPSBRN19xKSArIGdndGl0bGUoIlVTIHJlZ2lvbnMgYnkgcHVibGljIHRyYW5zLiB0eXBlIikKCiMgYnkgc3RhdGUKcDMgKyBnZW9tX2JhcigpICsgYWVzKFBQU1RBVEVOLCBmaWxsID0gUTdfcSkgKyBjb29yZF9mbGlwKCkgKyBnZ3RpdGxlKCJUcmFuc3BvcnRhdGlvbiBieSBzdGF0ZSIpCgojIGJ5IGhvdXNlIHR5cGUKcDMgKyBnZW9tX2Jhcihwb3NpdGlvbiA9ICJkb2RnZSIpICsgYWVzKFBQSE9VU0UsIGZpbGwgPSBRN19xKSArIGdndGl0bGUoIkJ5IGhvdXNlIHR5cGUiKQpwMyArIGdlb21fYmFyKHBvc2l0aW9uID0gImZpbGwiKSArIGFlcyhmaWxsID0gUFBIT1VTRSkgKyBnZ3RpdGxlKCJCeSBob3VzZSB0eXBlIikKCiMgYnkgaG91c2luZyBzdGF0dXMKcDMgKyBnZW9tX2Jhcihwb3NpdGlvbiA9ICJkb2RnZSIpICsgYWVzKFBQUkVOVCwgZmlsbCA9IFE3X3EpICsgZ2d0aXRsZSgiQnkgaG91c2luZyBzdGF0dXMiKQpwMyArIGdlb21fYmFyKHBvc2l0aW9uID0gImZpbGwiKSArIGFlcyhmaWxsID0gUFBSRU5UKSArIGdndGl0bGUoIkJ5IGhvdXNpbmcgc3RhdHVzIikKCiMgYnkgaW50ZXJuZXQgYXZhaWxhYmlsaXR5CnAzICsgZ2VvbV9iYXIocG9zaXRpb24gPSAiZmlsbCIpICsgYWVzKGZpbGwgPSBQUE5FVCkgKyBnZ3RpdGxlKCJJbnRlcm5ldCBzdGF0dXMiKQpwMyArIGdlb21fYmFyKHBvc2l0aW9uID0gImRvZGdlIikgKyBhZXMoUFBORVQsIGZpbGwgPSBRN19xKSArIGdndGl0bGUoIkludGVybmV0IHN0YXR1cyIpCgpgYGAKCgoKIyMgUTguIEZvciB3aGF0IHR5cGVzIG9mIGFjdGl2aXRpZXMgZG8geW91IHJlZ3VsYXJseSB1c2UgcHVibGljIHRyYW5zcG9ydGF0aW9uPwoKYGBge3IgcTgtZGF0YX0KIyBzdWJzZXQgcXVlc3Rpb24gZGF0YSwgcmVuYW1lIGNvbHVtbnMsIGdhdGhlciBpbnRvIHNpbmdsZSBjb2x1bW4KcThfZGYgPC0gZGYgJT4lCiAgc2VsZWN0KENhc2VJRCwgUFBHRU5ERVIsIFBQQUdFLCBwcGFnZWNhdCwgUFBFVEhNLCBQUElOQ0lNUCwgUFBFRFVDLCBQUEVEVUNBVCwKICAgICAgICAgd29yaywgUFBXT1JLLCBtYXJpdGFsLCBQUE1BUklULCBQUE1TQUNBVCwgcHByZWc5LCBQUFNUQVRFTiwgUFBIT1VTRSwgUFBSRU5ULCBQUE5FVCwKICAgICAgICAgUThfMTpROF82LCB3ZWlnaHQpICU+JQogIHJlbmFtZShXb3JrID0gUThfMSwgU2Nob29sID0gUThfMiwgU2hvcHBpbmcgPSBROF8zLCBWaXNpdGluZ19wZW9wbGUgPSBROF80LAogICAgICAgICBSZWNyZWF0aW9uID0gUThfNSwgT3RoZXIgPSBROF82KSAlPiUKICBnYXRoZXIoUThfcSwgUThfciwgV29yazpPdGhlciwgbmEucm0gPSBUKSAlPiUKICBtdXRhdGUoUThfcSA9IGFzLmZhY3RvcihROF9xKSkKCiMgc2VsZWN0IG9ubHkgWWVzIHJlc3BvbnNlcwpxOF9kZiA8LSBxOF9kZltxOF9kZiRROF9yID09ICdZZXMnLCBdCgojIHN1cnZleSBkZXNpZ24Kb3B0aW9ucyhkaWdpdHMgPSA0KQpvcHRpb25zKHN1cnZleS5sb25lbHkucHN1ID0gImFkanVzdCIpCmRlczggPC0gc3Z5ZGVzaWduKGlkcyA9IH4xLCB3ZWlnaHRzID0gfndlaWdodCwgZGF0YSA9IHE4X2RmW2lzLm5hKHE4X2RmJHdlaWdodCk9PUYsIF0pCgpgYGAKCiMjIyBHZW5kZXIsIGFnZSwgZXRobmljaXR5LCBpbmNvbWUsIGVkdWNhdGlvbgoKYGBge3IgcTgtcGxvdC0xfQojIHdlaWdodGVkIGRhdGEgZnJhbWUKcTggPC0gZGF0YS5mcmFtZShzdnl0YWJsZSh+UThfcSArIFE4X3IgKyBQUEdFTkRFUiArIHBwYWdlY2F0ICsgUFBFVEhNICsgUFBJTkNJTVAgKyAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBQRURVQyArIFBQRURVQ0FUICsgd29yayArIFBQV09SSywgZGVzOCwgcm91bmQgPSBUKSkKIyBwbG90IHRlbXBsYXRlcwp0aXRsZSA8LSBnZ3RpdGxlKCJGb3Igd2hhdCB0eXBlcyBvZiBhY3Rpdml0aWVzIGRvIHlvdSByZWd1bGFybHkgdXNlIHB1YmxpYyB0cmFuc3BvcnRhdGlvbj8iKQoKIyMgbWFpbiBwbG90CnAgPC0gZ2dwbG90KHE4LCBhZXMoUThfcSwgd2VpZ2h0ID0gRnJlcSkpICsgcHRleHQKcCArIGdlb21fYmFyKCkgKyB0aXRsZQoKYGBgCgpgYGB7ciBxOC1wbG90LTFifQojIyBwbG90MjogZXhjbHVkZSAnT3RoZXInIGNvbHVtbgpwMiA8LSBnZ3Bsb3QocThbIShxOCRROF9xKT09J090aGVyJywgXSwgYWVzKFE4X3EsIHdlaWdodCA9IEZyZXEpKSArIHB0ZXh0CgojIGJ5IGdlbmRlcgpwMiArIGdlb21fYmFyKCkgKyBhZXMoUFBHRU5ERVIsIGZpbGwgPSBQUEdFTkRFUikgKyBmYWNldF93cmFwKH5ROF9xKSArIGdndGl0bGUoIkJ5IGdlbmRlciIpCgojIGFnZSBib3hwbG90CnN2eWJveHBsb3QoUFBBR0V+UThfcSwgZGVzOCwgbWFpbiA9ICJBZ2UgYm94cGxvdCBwZXIgcmVzcG9uc2UiKQoKIyBieSBhZ2UgZ3JvdXAKcDIgKyBnZW9tX2JhcigpICsgYWVzKHBwYWdlY2F0LCBmaWxsID0gcHBhZ2VjYXQpICsgZmFjZXRfd3JhcCh+UThfcSkgKyBnZ3RpdGxlKCJCeSBhZ2UgZ3JvdXAiKQpwMiArIGdlb21fYmFyKHBvc2l0aW9uID0gImZpbGwiKSArIGFlcyhwcGFnZWNhdCwgZmlsbCA9IFE4X3EpCgojIGJ5IGV0aG5pYyBncm91cApwICsgZ2VvbV9iYXIoKSArIGFlcyhQUEVUSE0sIGZpbGwgPSBQUEVUSE0pICsgZmFjZXRfd3JhcCh+UThfcSkgKyBnZ3RpdGxlKCJCeSBldGhuaWMgZ3JvdXAiKSArCiAgcHRleHQyCnAgKyBnZW9tX2Jhcihwb3NpdGlvbiA9ICJmaWxsIikgKyBhZXMoUFBFVEhNLCBmaWxsID0gUThfcSkKcCArIGdlb21fYmFyKCkgKyBhZXMoZmlsbCA9IFE4X3EpICsgZmFjZXRfd3JhcCh+UFBFVEhNKSArIGdndGl0bGUoIkJ5IGV0aG5pYyBncm91cCIpCnAgKyBnZW9tX2Jhcihwb3NpdGlvbiA9ICJmaWxsIikgKyBhZXMoZmlsbCA9IFBQRVRITSkKCiMgYnkgaW5jb21lCnAgKyBnZW9tX2JhcigpICsgYWVzKFBQSU5DSU1QLCBmaWxsID0gUFBJTkNJTVApICsgZmFjZXRfd3JhcCh+UThfcSkgKyBnZ3RpdGxlKCJCeSBpbmNvbWUiKSArIAogIHB0ZXh0MgpwICsgZ2VvbV9iYXIocG9zaXRpb24gPSAiZmlsbCIpICsgYWVzKFBQSU5DSU1QLCBmaWxsID0gUThfcSkKCiMgYnkgZWR1Y2F0aW9uCnAgKyBnZW9tX2JhcigpICsgYWVzKFBQRURVQ0FULCBmaWxsID0gUFBFRFVDQVQpICsgZmFjZXRfd3JhcCh+UThfcSkgKyBnZ3RpdGxlKCJCeSBlZHVjYXRpb24iKQpwICsgZ2VvbV9iYXIocG9zaXRpb24gPSAiZmlsbCIpICsgYWVzKFBQRURVQ0FULCBmaWxsID0gUThfcSkKcCArIGdlb21fYmFyKHBvc2l0aW9uID0gImZpbGwiKSArIGFlcyhQUEVEVUMsIGZpbGwgPSBROF9xKQpwICsgZ2VvbV9iYXIoKSArIGFlcyhmaWxsID0gUThfcSkgKyBmYWNldF93cmFwKH5QUEVEVUNBVCkgKyBnZ3RpdGxlKCJCeSBlZHVjYXRpb24iKQpwICsgZ2VvbV9iYXIocG9zaXRpb24gPSAiZmlsbCIpICsgYWVzKGZpbGwgPSBQUEVEVUNBVCkKCiMgYnkgd29yayBzdGF0dXMKcCArIGdlb21fYmFyKCkgKyBhZXMod29yaywgZmlsbCA9IHdvcmspICsgZmFjZXRfd3JhcCh+UThfcSkgKyBnZ3RpdGxlKCJCeSBlbXBsb3ltZW50IHN0YXR1cyIpCnAgKyBnZW9tX2Jhcihwb3NpdGlvbiA9ICJmaWxsIikgKyBhZXMoUFBXT1JLLCBmaWxsID0gUThfcSkgKyBnZ3RpdGxlKCJCeSBlbXBsb3ltZW50IHN0YXR1cyIpCmBgYAoKIyMjIE1hcml0YWwgc3RhdHVzLCBtZXRybyBzdGF0dXMsIHJlZ2lvbiwgc3RhdGUgb2YgcmVzaWRlbmN5LCBob3VzZSB0eXBlLCBob3VzaW5nIHN0YXR1cywgaW50ZXJuZXQgYXZhaWxhYmlsaXR5CgpgYGB7ciBxOC1wbG90LTJ9CiMgd2VpZ2h0ZWQgZGF0YSBmcmFtZQpxOC4yIDwtIGRhdGEuZnJhbWUoc3Z5dGFibGUoflE4X3EgKyBROF9yICsgd29yayArIG1hcml0YWwgKyBQUE1BUklUICsgUFBNU0FDQVQgKyBwcHJlZzkgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQUFNUQVRFTiArIFBQSE9VU0UgKyBQUFJFTlQgKyBQUE5FVCwgZGVzOCwgcm91bmQgPSBUKSkKIyByZXN0YXRlIHBsb3RzCnAzIDwtIGdncGxvdChxOC4yLCBhZXMoUThfcSwgd2VpZ2h0ID0gRnJlcSkpICsgcHRleHQKcDQgPC0gZ2dwbG90KHE4LjJbIShxOC4yJFE4X3EpPT0nT3RoZXInLCBdLCBhZXMoUThfcSwgd2VpZ2h0ID0gRnJlcSkpICsgcHRleHQKCmBgYAoKYGBge3IgcTgtcGxvdC0yYn0KIyBieSBtYXJpdGFsIHN0YXR1cwpwMyArIGdlb21fYmFyKCkgKyBhZXMobWFyaXRhbCwgZmlsbCA9IG1hcml0YWwpICsgZmFjZXRfd3JhcCh+UThfcSkgKyBnZ3RpdGxlKCJCeSBtYXJpdGFsIHN0YXR1cyIpCnAzICsgZ2VvbV9iYXIocG9zaXRpb24gPSAiZmlsbCIpICsgYWVzKG1hcml0YWwsIGZpbGwgPSBROF9xKQpwMyArIGdlb21fYmFyKCkgKyBhZXMoUFBNQVJJVCwgZmlsbCA9IFBQTUFSSVQpICsgZmFjZXRfd3JhcCh+UThfcSkKcDMgKyBnZW9tX2JhcigpICsgYWVzKFBQTUFSSVQsIGZpbGwgPSBROF9xKSArIGdndGl0bGUoIkJ5IG1hcml0YWwgc3RhdHVzIikKCiMgYnkgbWV0cm8gc3RhdHVzCnAzICsgZ2VvbV9iYXIoKSArIGFlcyhQUE1TQUNBVCwgZmlsbCA9IFBQTVNBQ0FUKSArIGZhY2V0X3dyYXAoflE4X3EpICsgZ2d0aXRsZSgiQnkgbWV0cm8gc3RhdHVzIikKcDMgKyBnZW9tX2Jhcihwb3NpdGlvbiA9ICJzdGFjayIpICsgYWVzKGZpbGwgPSBQUE1TQUNBVCkKcDMgKyBnZW9tX2JhcigpICsgYWVzKGZpbGwgPSBQUE1TQUNBVCkgKyBmYWNldF93cmFwKH5QUE1TQUNBVCkKCiMgYnkgcmVnaW9uCnAzICsgZ2VvbV9iYXIocG9zaXRpb24gPSAnZmlsbCcpICsgYWVzKGZpbGwgPSBwcHJlZzkpICsgZ2d0aXRsZSgiUmVzcG9uc2VzIGJ5IFVTIHJlZ2lvbiIpCnAzICsgZ2VvbV9iYXIocG9zaXRpb24gPSAnZmlsbCcpICsgYWVzKHBwcmVnOSwgZmlsbCA9IFE4X3EpICsgZ2d0aXRsZSgiVVMgcmVnaW9ucyBieSByZXNwb25zZSIpCgojIGJ5IHN0YXRlCnAzICsgZ2VvbV9iYXIoKSArIGFlcyhQUFNUQVRFTiwgZmlsbCA9IFE4X3EpICsgY29vcmRfZmxpcCgpICsgZ2d0aXRsZSgiQnkgc3RhdGUiKQpwMyArIGdlb21fYmFyKHBvc2l0aW9uID0gJ2ZpbGwnKSArIGFlcyhQUFNUQVRFTiwgZmlsbCA9IFE4X3EpICsgY29vcmRfZmxpcCgpICsgZ2d0aXRsZSgiQnkgc3RhdGUiKQoKIyBieSBob3VzZSB0eXBlCnAzICsgZ2VvbV9iYXIoKSArIGFlcyhmaWxsID0gUFBIT1VTRSkgKyBnZ3RpdGxlKCJCeSBob3VzZSB0eXBlIikKcDMgKyBnZW9tX2Jhcihwb3NpdGlvbiA9ICdmaWxsJykgKyBhZXMoZmlsbCA9IFBQSE9VU0UpCnAzICsgZ2VvbV9iYXIoKSArIGFlcyhQUEhPVVNFLCBmaWxsID0gUFBIT1VTRSkgKyBmYWNldF93cmFwKH5ROF9xKSArIHB0ZXh0MgoKIyBieSBob3VzaW5nIHN0YXR1cwoKIyBieSBpbnRlcm5ldCBhdmFpbGFiaWxpdHkKcDMgKyBnZW9tX2Jhcihwb3NpdGlvbiA9ICJmaWxsIikgKyBhZXMoZmlsbCA9IFBQTkVUKSArIGdndGl0bGUoIkludGVybmV0IHN0YXR1cyIpCnAzICsgZ2VvbV9iYXIocG9zaXRpb24gPSAnZmlsbCcpICsgYWVzKFBQTkVULCBmaWxsID0gUThfcSkgKyBnZ3RpdGxlKCJJbnRlcm5ldCBzdGF0dXMiKQpgYGAKCgoKIyMgUTkuIERvIG90aGVyIG1lbWJlcnMgb2YgeW91ciBob3VzZWhvbGQgcmVndWxhcmx5IHVzZSBwdWJsaWMgdHJhbnNwb3J0YXRpb24/CgojIyMgRXRobmljaXR5LCBpbmNvbWUsIG1ldHJvIHN0YXR1cywgcmVnaW9uLCBzdGF0ZSwgaG91c2UgdHlwZSwgaG91c2luZyBzdGF0dXMKCmBgYHtyIHE5LXBsb3QtMX0KIyB3ZWlnaHRlZCBkYXRhIGZyYW1lCnE5IDwtIGRhdGEuZnJhbWUoc3Z5dGFibGUoflE5ICsgUFBFVEhNICsgUFBJTkNJTVAgKyBQUE1TQUNBVCArIHBwcmVnOSArIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgUFBTVEFURU4gKyBQUEhPVVNFICsgUFBSRU5ULCBkZXMsIHJvdW5kID0gVCkpCiMgcGxvdCB0ZW1wbGF0ZXMKdGl0bGUgPC0gZ2d0aXRsZSgiRG8gb3RoZXIgbWVtYmVycyBvZiB5b3VyIGhvdXNlaG9sZCByZWd1bGFybHkgdXNlIHB1YmxpYyB0cmFuc3BvcnRhdGlvbj8iKQoKIyMgbWFpbiBwbG90CnAgPC0gZ2dwbG90KHE5LCBhZXMoUTksIHdlaWdodCA9IEZyZXEpKSArIHB0ZXh0CnAgKyBnZW9tX2JhcigpICsgdGl0bGUKYGBgCgpgYGB7ciBxOS1wbG90LTFifQojIyBwbG90MjogZXhjbHVkZSAnRG9uX3Qga25vdycgY29sdW1uCnAyIDwtIGdncGxvdChxOVshKHE5JFE5KT09J0Rvbl90IGtub3cnLCBdLCBhZXMoUTksIHdlaWdodCA9IEZyZXEpKSArIHB0ZXh0CgojIGJ5IGV0aG5pYyBncm91cApwMiArIGdlb21fYmFyKCkgKyBhZXMoZmlsbCA9IFBQRVRITSkgKyBnZ3RpdGxlKCJCeSBldGhuaWMgZ3JvdXAiKSArIHB0ZXh0MgpwMiArIGdlb21fYmFyKHBvc2l0aW9uID0gImZpbGwiKSArIGFlcyhQUEVUSE0sIGZpbGwgPSBROSkKcDIgKyBnZW9tX2JhcigpICsgYWVzKGZpbGwgPSBROSkgKyBmYWNldF93cmFwKH5QUEVUSE0pICsgZ2d0aXRsZSgiQnkgZXRobmljIGdyb3VwIikKcDIgKyBnZW9tX2Jhcihwb3NpdGlvbiA9ICJmaWxsIikgKyBhZXMoZmlsbCA9IFBQRVRITSkKCiMgYnkgaW5jb21lCnAyICsgZ2VvbV9iYXIoKSArIGFlcyhmaWxsID0gUFBJTkNJTVApICsgZ2d0aXRsZSgiQnkgaW5jb21lIikgKyBwdGV4dDIKcDIgKyBnZW9tX2Jhcihwb3NpdGlvbiA9ICJmaWxsIikgKyBhZXMoUFBJTkNJTVAsIGZpbGwgPSBROSkKCiMgYnkgbWV0cm8gc3RhdHVzCnAyICsgZ2VvbV9iYXIoKSArIGFlcyhmaWxsID0gUFBNU0FDQVQpICsgZ2d0aXRsZSgiQnkgbWV0cm8gc3RhdHVzIikKcDIgKyBnZW9tX2Jhcihwb3NpdGlvbiA9ICJzdGFjayIpICsgYWVzKFBQTVNBQ0FULCBmaWxsID0gUTkpCgojIGJ5IHJlZ2lvbgpwMiArIGdlb21fYmFyKHBvc2l0aW9uID0gJ2ZpbGwnKSArIGFlcyhmaWxsID0gcHByZWc5KSArIGdndGl0bGUoIlJlc3BvbnNlcyBieSBVUyByZWdpb24iKQpwMiArIGdlb21fYmFyKHBvc2l0aW9uID0gJ2ZpbGwnKSArIGFlcyhwcHJlZzksIGZpbGwgPSBROSkgKyBnZ3RpdGxlKCJVUyByZWdpb25zIGJ5IHJlc3BvbnNlIikKCiMgYnkgc3RhdGUKcDIgKyBnZW9tX2JhcigpICsgYWVzKFBQU1RBVEVOLCBmaWxsID0gUTkpICsgY29vcmRfZmxpcCgpICsgZ2d0aXRsZSgiQnkgc3RhdGUiKQpwMiArIGdlb21fYmFyKHBvc2l0aW9uID0gJ2ZpbGwnKSArIGFlcyhQUFNUQVRFTiwgZmlsbCA9IFE5KSArIGNvb3JkX2ZsaXAoKSArIGdndGl0bGUoIkJ5IHN0YXRlIikKCiMgYnkgaG91c2UgdHlwZQpwMiArIGdlb21fYmFyKCkgKyBhZXMoZmlsbCA9IFBQSE9VU0UpICsgZ2d0aXRsZSgiQnkgaG91c2luZyIpCnAyICsgZ2VvbV9iYXIocG9zaXRpb24gPSAnZmlsbCcpICsgYWVzKGZpbGwgPSBQUEhPVVNFKQpwMiArIGdlb21fYmFyKCkgKyBhZXMoUFBIT1VTRSwgZmlsbCA9IFE5KSArIHB0ZXh0MgoKIyBieSBob3VzaW5nIHN0YXR1cwoKYGBgCgoKCiMjIFExMC4gV2hhdCB0eXBlcyBvZiBwdWJsaWMgdHJhbnNwb3J0YXRpb24gZG8gb3RoZXIgbWVtYmVycyBvZiB5b3VyIGhvdXNlaG9sZCByZWd1bGFybHkgdXNlPwoKYGBge3IgcTEwLWRhdGF9CiMgc3Vic2V0IHF1ZXN0aW9uIGRhdGEsIHJlbmFtZSBjb2x1bW5zLCBnYXRoZXIgaW50byBzaW5nbGUgY29sdW1uCnExMF9kZiA8LSBkZiAlPiUKICBzZWxlY3QoQ2FzZUlELCBQUEdFTkRFUiwgUFBBR0UsIHBwYWdlY2F0LCBQUEVUSE0sIFBQSU5DSU1QLCBQUEVEVUMsIFBQRURVQ0FULAogICAgICAgICB3b3JrLCBQUFdPUkssIG1hcml0YWwsIFBQTUFSSVQsIFBQTVNBQ0FULCBwcHJlZzksIFBQU1RBVEVOLCBQUEhPVVNFLCBQUFJFTlQsIFBQTkVULAogICAgICAgUTEwXzE6UTEwXzgsIHdlaWdodCkgJT4lCiAgcmVuYW1lKEJ1cyA9IFExMF8xLCBDYXJwb29sID0gUTEwXzIsIFN1YndheSA9IFExMF8zLCBUcmFpbiA9IFExMF80LAogICAgICAgICBUYXhpID0gUTEwXzUsIEFpcnBsYW5lID0gUTEwXzYsIERvbl90X2tub3cgPSBRMTBfNywgT3RoZXIgPSBRMTBfOCkgJT4lCiAgZ2F0aGVyKFExMF9xLCBRMTBfciwgQnVzOk90aGVyLCBuYS5ybSA9IFQpICU+JQogIG11dGF0ZShRMTBfcSA9IGFzLmZhY3RvcihRMTBfcSkpCgojIHNlbGVjdCBvbmx5IFllcyByZXNwb25zZXMKcTEwX2RmIDwtIHExMF9kZltxMTBfZGYkUTEwX3IgPT0gJ1llcycsIF0KCiMgc3VydmV5IGRlc2lnbgpvcHRpb25zKGRpZ2l0cyA9IDQpCm9wdGlvbnMoc3VydmV5LmxvbmVseS5wc3UgPSAiYWRqdXN0IikKZGVzMTAgPC0gc3Z5ZGVzaWduKGlkcyA9IH4xLCB3ZWlnaHRzID0gfndlaWdodCwgZGF0YSA9IHExMF9kZltpcy5uYShxMTBfZGYkd2VpZ2h0KT09RiwgXSkKYGBgCgojIyMgR2VuZGVyLCBhZ2UsIGV0aG5pY2l0eSwgaW5jb21lLCBlZHVjYXRpb24sIHdvcmsKCmBgYHtyIHExMC1wbG90LTF9CiMgd2VpZ2h0ZWQgZGF0YSBmcmFtZQpxMTAgPC0gZGF0YS5mcmFtZShzdnl0YWJsZSh+UTEwX3EgKyBRMTBfciArIFBQR0VOREVSICsgcHBhZ2VjYXQgKyBQUEVUSE0gKyBQUElOQ0lNUCArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBQUEVEVUMgKyBQUEVEVUNBVCArIHdvcmsgKyBQUFdPUkssIGRlczEwLCByb3VuZCA9IFQpKQojIHBsb3QgdGVtcGxhdGVzCnRpdGxlIDwtIGdndGl0bGUoIldoYXQgdHlwZXMgb2YgcHVibGljIHRyYW5zcG9ydGF0aW9uIGRvIG90aGVyIG1lbWJlcnMgb2YgeW91ciBob3VzZWhvbGQgcmVndWxhcmx5IHVzZT8iKQoKIyMgbWFpbiBwbG90CnAgPC0gZ2dwbG90KHExMCwgYWVzKFExMF9xLCB3ZWlnaHQgPSBGcmVxKSkgKyBwdGV4dApwICsgZ2VvbV9iYXIoKSArIHRpdGxlCmBgYAoKYGBge3IgcTEwLXBsb3QtMWJ9CiMjIHBsb3QyOiBleGNsdWRlICdEb25fdCBrbm93JyBjb2x1bW4KcDIgPC0gZ2dwbG90KHExMFshKHExMCRRMTBfcSk9PSdEb25fdF9rbm93JywgXSwgYWVzKFExMF9xLCB3ZWlnaHQgPSBGcmVxKSkgKyBwdGV4dAoKIyBieSBnZW5kZXIKcDIgKyBnZW9tX2JhcigpICsgYWVzKFBQR0VOREVSLCBmaWxsID0gUFBHRU5ERVIpICsgZmFjZXRfd3JhcCh+UTEwX3EpICsgZ2d0aXRsZSgiQnkgZ2VuZGVyIikKCiMgYnkgYWdlIGdyb3VwCnAyICsgZ2VvbV9iYXIoKSArIGFlcyhwcGFnZWNhdCwgZmlsbCA9IHBwYWdlY2F0KSArIGZhY2V0X3dyYXAoflExMF9xKSArIGdndGl0bGUoIkJ5IGFnZSBncm91cCIpCnAyICsgZ2VvbV9iYXIocG9zaXRpb24gPSAiZmlsbCIpICsgYWVzKHBwYWdlY2F0LCBmaWxsID0gUTEwX3EpCgojIGJ5IGV0aG5pYyBncm91cApwICsgZ2VvbV9iYXIoKSArIGFlcyhQUEVUSE0sIGZpbGwgPSBQUEVUSE0pICsgZmFjZXRfd3JhcCh+UTEwX3EpICsgZ2d0aXRsZSgiQnkgZXRobmljIGdyb3VwIikgKwogIHB0ZXh0MgpwICsgZ2VvbV9iYXIocG9zaXRpb24gPSAiZmlsbCIpICsgYWVzKFBQRVRITSwgZmlsbCA9IFExMF9xKQpwICsgZ2VvbV9iYXIoKSArIGFlcyhmaWxsID0gUTEwX3EpICsgZmFjZXRfd3JhcCh+UFBFVEhNKSArIGdndGl0bGUoIkJ5IGV0aG5pYyBncm91cCIpCnAgKyBnZW9tX2Jhcihwb3NpdGlvbiA9ICJmaWxsIikgKyBhZXMoZmlsbCA9IFBQRVRITSkKCiMgYnkgaW5jb21lCnAgKyBnZW9tX2JhcigpICsgYWVzKFBQSU5DSU1QLCBmaWxsID0gUFBJTkNJTVApICsgZmFjZXRfd3JhcCh+UTEwX3EpICsgZ2d0aXRsZSgiQnkgaW5jb21lIikgKyAKICBwdGV4dDIKcCArIGdlb21fYmFyKHBvc2l0aW9uID0gImZpbGwiKSArIGFlcyhQUElOQ0lNUCwgZmlsbCA9IFExMF9xKQoKIyBieSBlZHVjYXRpb24KcCArIGdlb21fYmFyKCkgKyBhZXMoUFBFRFVDQVQsIGZpbGwgPSBQUEVEVUNBVCkgKyBmYWNldF93cmFwKH5RMTBfcSkgKyBnZ3RpdGxlKCJCeSBlZHVjYXRpb24iKQpwICsgZ2VvbV9iYXIocG9zaXRpb24gPSAiZmlsbCIpICsgYWVzKFBQRURVQ0FULCBmaWxsID0gUTEwX3EpCnAgKyBnZW9tX2Jhcihwb3NpdGlvbiA9ICJmaWxsIikgKyBhZXMoUFBFRFVDLCBmaWxsID0gUTEwX3EpCnAgKyBnZW9tX2JhcigpICsgYWVzKGZpbGwgPSBRMTBfcSkgKyBmYWNldF93cmFwKH5QUEVEVUNBVCkgKyBnZ3RpdGxlKCJCeSBlZHVjYXRpb24iKQpwICsgZ2VvbV9iYXIocG9zaXRpb24gPSAiZmlsbCIpICsgYWVzKGZpbGwgPSBQUEVEVUNBVCkKCiMgYnkgd29yayBzdGF0dXMKcCArIGdlb21fYmFyKCkgKyBhZXMod29yaywgZmlsbCA9IHdvcmspICsgZmFjZXRfd3JhcCh+UTEwX3EpICsgZ2d0aXRsZSgiQnkgZW1wbG95bWVudCBzdGF0dXMiKQpwICsgZ2VvbV9iYXIocG9zaXRpb24gPSAiZmlsbCIpICsgYWVzKFBQV09SSywgZmlsbCA9IFExMF9xKSArIGdndGl0bGUoIkJ5IGVtcGxveW1lbnQgc3RhdHVzIikKYGBgCgojIyMgTWFyaXRhbCBzdGF0dXMsIG1ldHJvIHN0YXR1cywgcmVnaW9uLCBzdGF0ZSBvZiByZXNpZGVuY3ksIGhvdXNlIHR5cGUsIGhvdXNpbmcgc3RhdHVzLCBpbnRlcm5ldCBhdmFpbGFiaWxpdHkKCmBgYHtyIHExMC1wbG90LTJ9CiMgdXBkYXRlIHdlaWdodGVkIGRhdGEgZnJhbWUKcTEwLjIgPC0gZGF0YS5mcmFtZShzdnl0YWJsZSh+UTEwX3EgKyBRMTBfciArIG1hcml0YWwgKyBQUE1BUklUICsgUFBNU0FDQVQgKyBwcHJlZzkgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQUFNUQVRFTiArIFBQSE9VU0UgKyBQUFJFTlQgKyBQUE5FVCwgZGVzMTAsIHJvdW5kID0gVCkpCiMgcmVzdGF0ZSBwbG90cwpwMyA8LSBnZ3Bsb3QocTEwLjIsIGFlcyhRMTBfcSwgd2VpZ2h0ID0gRnJlcSkpICsgcHRleHQKcDQgPC0gZ2dwbG90KHExMC4yWyEocTEwLjIkUTEwX3EpPT0nRG9uX3Rfa25vdycsIF0sIGFlcyhRMTBfcSwgd2VpZ2h0ID0gRnJlcSkpICsgcHRleHQKYGBgCgpgYGB7ciBxMTAtcGxvdC0yYn0KIyBieSBtYXJpdGFsIHN0YXR1cwpwMyArIGdlb21fYmFyKCkgKyBhZXMobWFyaXRhbCwgZmlsbCA9IG1hcml0YWwpICsgZmFjZXRfd3JhcCh+UTEwX3EpICsgZ2d0aXRsZSgiQnkgbWFyaXRhbCBzdGF0dXMiKQpwMyArIGdlb21fYmFyKHBvc2l0aW9uID0gJ2ZpbGwnKSArIGFlcyhtYXJpdGFsLCBmaWxsID0gUTEwX3EpCnAzICsgZ2VvbV9iYXIoKSArIGFlcyhQUE1BUklULCBmaWxsID0gUFBNQVJJVCkgKyBmYWNldF93cmFwKH5RMTBfcSkKcDMgKyBnZW9tX2JhcigpICsgYWVzKFBQTUFSSVQsIGZpbGwgPSBRMTBfcSkgKyBnZ3RpdGxlKCJCeSBtYXJpdGFsIHN0YXR1cyIpCgojIGJ5IG1ldHJvIHN0YXR1cwpwMyArIGdlb21fYmFyKCkgKyBhZXMoUFBNU0FDQVQsIGZpbGwgPSBQUE1TQUNBVCkgKyBmYWNldF93cmFwKH5RMTBfcSkgKyBnZ3RpdGxlKCJCeSBtZXRybyBzdGF0dXMiKQpwMyArIGdlb21fYmFyKHBvc2l0aW9uID0gJ3N0YWNrJykgKyBhZXMoZmlsbCA9IFBQTVNBQ0FUKQpwMyArIGdlb21fYmFyKCkgKyBhZXMoZmlsbCA9IFBQTVNBQ0FUKSArIGZhY2V0X3dyYXAoflBQTVNBQ0FUKQoKIyBieSByZWdpb24KcDMgKyBnZW9tX2Jhcihwb3NpdGlvbiA9ICdmaWxsJykgKyBhZXMoZmlsbCA9IHBwcmVnOSkgKyBnZ3RpdGxlKCJSZXNwb25zZXMgYnkgVVMgcmVnaW9uIikKcDMgKyBnZW9tX2Jhcihwb3NpdGlvbiA9ICdmaWxsJykgKyBhZXMocHByZWc5LCBmaWxsID0gUTEwX3EpICsgZ2d0aXRsZSgiVVMgcmVnaW9ucyBieSByZXNwb25zZSIpCgojIGJ5IHN0YXRlCnAzICsgZ2VvbV9iYXIoKSArIGFlcyhQUFNUQVRFTiwgZmlsbCA9IFExMF9xKSArIGNvb3JkX2ZsaXAoKSArIGdndGl0bGUoIkJ5IHN0YXRlIikKcDMgKyBnZW9tX2Jhcihwb3NpdGlvbiA9ICdmaWxsJykgKyBhZXMoUFBTVEFURU4sIGZpbGwgPSBRMTBfcSkgKyBjb29yZF9mbGlwKCkgKyBnZ3RpdGxlKCJCeSBzdGF0ZSIpCgojIGJ5IGhvdXNlIHR5cGUKcDMgKyBnZW9tX2JhcigpICsgYWVzKGZpbGwgPSBQUEhPVVNFKSArIGdndGl0bGUoIkJ5IGhvdXNpbmciKQpwMyArIGdlb21fYmFyKHBvc2l0aW9uID0gJ2ZpbGwnKSArIGFlcyhmaWxsID0gUFBIT1VTRSkKcDMgKyBnZW9tX2JhcigpICsgYWVzKFBQSE9VU0UsIGZpbGwgPSBQUEhPVVNFKSArIGZhY2V0X3dyYXAoflExMF9xKSArIHB0ZXh0MgoKIyBieSBob3VzaW5nIHN0YXR1cwoKIyBieSBpbnRlcm5ldCBhdmFpbGFiaWxpdHkKcDMgKyBnZW9tX2Jhcihwb3NpdGlvbiA9ICdmaWxsJykgKyBhZXMoZmlsbCA9IFBQTkVUKSArIGdndGl0bGUoIkludGVybmV0IHN0YXR1cyIpCnAzICsgZ2VvbV9iYXIocG9zaXRpb24gPSAnZmlsbCcpICsgYWVzKFBQTkVULCBmaWxsID0gUTEwX3EpICsgZ2d0aXRsZSgiSW50ZXJuZXQgc3RhdHVzIikKYGBgCgoKCg==