First Steps

require(readxl) # may be unneccessary as I'm saving to .csv
#require(dplyr)
#require(tidyr)
require(tidyverse) # i think this gives me dplyr and tidyr
require(janitor) # clean names
require(ggplot2) # data viz
require(ggcorrplot) #cor matrix and plots
require(ivreg) # two stage least squares regression
require(kableExtra) # tables

Data Guide

GuideDF <- read_excel("DataGuide.xlsx") 
GuideDF
NA

Second Steps

Data Exploration

A Table of summary statistics of variables to include: * mean * sd * min-max * dot plots

Iteration 1: X1.csv cleaned data of 13 columns, 357 observations. Create DF with clean names

X1 <- read.csv("X1.csv") %>% 
           clean_names() #piping prevents an umlaut over the i
X1 # output be visible in R notebook; no need to View()
NA

Statistical Summary Table

Now, we make a statistical summary table. Instrumented variables are rounded in the table for mean, min and max. Perhaps they should be rounded in the DF itself.

Descriptive1 <- matrix( 
  round(
    c(
      mean(X1$hur),sd(X1$hur),min(X1$hur),max(X1$hur),
      
      mean(X1$taxcorp),  sd(X1$taxcorp), min(X1$taxcorp),max(X1$taxcorp),
      
      mean(X1$ud), sd(X1$ud),min(X1$ud),max(X1$ud),
      
      mean(X1$pslm),sd(X1$pslm),min(X1$pslm),max(X1$pslm),
      
      round(mean(X1$epl),0), sd(X1$epl), round(min(X1$epl),0),round(max(X1$epl),0),
      
      round(mean(X1$wsc),0), sd(X1$wsc), round(min(X1$wsc),0),round(max(X1$wsc),0),
      
      mean(X1$cbc), sd(X1$cbc),min(X1$cbc),max(X1$cbc),
      
      mean(X1$brr1y), sd(X1$brr1y), min(X1$brr1y),max(X1$brr1y),
      
      mean(X1$ttr), sd(X1$ttr),min(X1$ttr),max(X1$ttr),
      
      mean(X1$inf_gdpd),sd(X1$inf_gdpd),min(X1$inf_gdpd),max(X1$inf_gdpd)
       ), 2),
  ncol = 4, byrow = T)

colnames(Descriptive1) <- c("Mean", "SD","Min","Max")
rownames(Descriptive1) <- c("UR","TAXCORP","UD","PSLM","EPL","WSC","CBC","BRR1Y","TTR","Delta_i")

kbl(Descriptive1, caption = "Table 2: Variable Summary Statistics, All Observations") %>% 
  kable_styling(bootstrap_options = c("striped", "hover","condensed")) %>% 
  column_spec(1, bold = T)

Now, we need to break down summary statistics by year. We will do this by creating a filtered df per year. These can come in handy in the future as well. This is going to be a fat chunk of code as I’m not going to take the time to learn how to automate. Code is in notebook but echo is false annual_data.R

Table 2.1: Annual Variable Summary Statistics - 2001
Mean SD Min Max
UR 7.17 4.17 3.08 19.46
TAXCORP 2.78 0.91 0.58 3.90
UD 29.58 17.16 12.90 73.90
PSLM 1.65 1.18 0.41 4.02
EPL 2.00 1.02 0.00 4.00
WSC 2.00 1.56 1.00 5.00
CBC 51.37 28.71 14.70 96.00
BRR1Y 48.62 23.42 9.00 86.00
TTR 34.40 5.65 25.53 45.92
Delta_i 3.38 2.86 -1.08 11.05
Table 2.2: Annual Variable Summary Statistics - 2002
Mean SD Min Max
UR 7.45 3.59 3.67 18.81
TAXCORP 3.00 1.00 0.99 4.95
UD 34.63 22.54 12.80 78.00
PSLM 1.79 1.15 0.42 4.05
EPL 2.00 1.14 0.00 5.00
WSC 3.00 1.53 1.00 5.00
CBC 59.66 29.70 14.50 96.00
BRR1Y 54.25 23.03 9.00 86.00
TTR 34.67 6.51 24.50 45.41
Delta_i 2.05 1.53 -1.39 4.19
Table 2.3: Annual Variable Summary Statistics - 2003
Mean SD Min Max
UR 7.08 2.08 4.78 11.49
TAXCORP 2.88 0.89 1.23 4.51
UD 28.58 17.48 12.40 72.40
PSLM 1.85 1.34 0.46 4.30
EPL 2.00 1.24 0.00 4.00
WSC 3.00 1.60 1.00 5.00
CBC 54.07 30.07 14.30 96.00
BRR1Y 52.42 24.92 9.00 86.00
TTR 33.50 6.36 24.14 45.58
Delta_i 1.83 1.38 -1.61 3.93
Table 2.4: Annual Variable Summary Statistics - 2004
Mean SD Min Max
UR 7.81 3.29 4.28 18.36
TAXCORP 3.42 1.78 1.51 9.69
UD 30.68 19.22 10.50 73.50
PSLM 1.74 1.24 0.36 4.23
EPL 2.00 1.06 0.00 4.00
WSC 3.00 1.37 1.00 5.00
CBC 63.09 28.53 13.80 100.00
BRR1Y 47.83 26.67 0.00 86.00
TTR 35.36 6.21 24.76 46.39
Delta_i 2.67 1.79 -1.12 5.84
Table 2.5: Annual Variable Summary Statistics - 2005
Mean SD Min Max
UR 6.55 2.03 3.83 11.28
TAXCORP 3.77 2.23 1.75 11.53
UD 32.84 19.23 12.00 75.70
PSLM 1.60 1.10 0.35 3.81
EPL 2.00 0.91 0.00 4.00
WSC 3.00 1.50 1.00 5.00
CBC 59.44 31.18 13.70 100.00
BRR1Y 46.94 25.95 0.00 86.00
TTR 36.48 6.46 25.83 48.00
Delta_i 2.34 2.12 -1.19 8.75
Table 2.6: Annual Variable Summary Statistics - 2006
Mean SD Min Max
UR 7.03 2.45 3.91 13.47
TAXCORP 3.50 0.98 2.10 6.28
UD 32.84 20.92 11.50 74.30
PSLM 1.57 0.99 0.33 3.26
EPL 2.00 1.08 0.00 4.00
WSC 3.00 1.42 1.00 5.00
CBC 63.69 29.07 13.10 100.00
BRR1Y 48.41 27.29 0.00 85.00
TTR 35.80 6.36 26.62 46.46
Delta_i 2.11 1.43 -0.86 5.12
Table 2.7: Annual Variable Summary Statistics - 2007
Mean SD Min Max
UR 6.27 2.20 3.58 11.23
TAXCORP 3.41 0.81 2.19 4.80
UD 29.56 18.57 11.60 70.80
PSLM 1.30 0.86 0.31 2.73
EPL 2.00 0.93 0.00 3.00
WSC 3.00 1.49 1.00 5.00
CBC 56.04 32.63 13.30 100.00
BRR1Y 43.81 26.13 0.00 84.00
TTR 35.96 5.97 26.73 46.42
Delta_i 2.27 1.61 -1.36 5.34
Table 2.8: Annual Variable Summary Statistics - 2008
Mean SD Min Max
UR 6.02 2.11 2.72 11.27
TAXCORP 3.52 2.02 1.69 11.99
UD 29.46 18.86 10.20 69.90
PSLM 1.28 0.76 0.32 2.66
EPL 2.00 0.92 0.00 4.00
WSC 3.00 1.27 1.00 5.00
CBC 61.02 29.65 13.10 100.00
BRR1Y 49.88 23.92 0.00 83.00
TTR 35.48 6.28 23.58 44.76
Delta_i 3.21 2.14 -0.91 10.41
Table 2.9: Annual Variable Summary Statistics - 2009
Mean SD Min Max
UR 8.57 3.41 3.63 17.87
TAXCORP 2.30 0.60 1.33 3.37
UD 30.63 20.13 7.60 72.50
PSLM 1.88 0.99 0.64 3.78
EPL 2.00 0.98 0.00 4.00
WSC 3.00 1.36 1.00 5.00
CBC 59.03 30.16 12.70 100.00
BRR1Y 46.90 24.73 0.00 83.00
TTR 34.14 6.95 22.56 44.96
Delta_i 0.75 1.95 -4.62 3.61
Table 2.10: Annual Variable Summary Statistics - 2010
Mean SD Min Max
UR 8.24 3.71 3.71 19.88
TAXCORP 2.67 0.99 1.31 5.75
UD 28.04 18.75 8.20 71.40
PSLM 1.71 1.01 0.54 3.99
EPL 2.00 0.87 0.00 4.00
WSC 3.00 1.21 1.00 5.00
CBC 57.42 31.56 12.20 100.00
BRR1Y 50.38 23.68 0.00 84.00
TTR 34.04 6.71 22.38 44.76
Delta_i 1.15 1.49 -1.88 4.65
Table 2.11: Annual Variable Summary Statistics - 2011
Mean SD Min Max
UR 8.37 3.97 3.41 21.41
TAXCORP 2.71 1.01 1.21 4.98
UD 26.50 17.27 7.00 68.70
PSLM 1.41 1.01 0.30 3.79
EPL 2.00 0.85 0.00 4.00
WSC 3.00 1.33 1.00 5.00
CBC 52.15 32.17 12.60 100.00
BRR1Y 46.23 25.11 0.00 83.00
TTR 33.46 6.54 21.12 44.79
Delta_i 1.61 1.55 -1.62 5.47
Table 2.12: Annual Variable Summary Statistics - 2012
Mean SD Min Max
UR 8.13 4.45 3.22 24.79
TAXCORP 2.92 1.92 1.23 10.33
UD 27.32 19.61 6.00 69.20
PSLM 1.39 1.00 0.33 3.81
EPL 2.00 0.77 0.00 3.00
WSC 3.00 1.41 1.00 5.00
CBC 53.26 31.56 12.50 100.00
BRR1Y 45.33 23.29 0.00 84.00
TTR 34.11 7.22 21.33 45.51
Delta_i 1.78 1.21 -0.76 4.07
Table 2.13: Annual Variable Summary Statistics - 2013
Mean SD Min Max
UR 8.26 5.05 3.10 26.12
TAXCORP 2.93 1.51 1.19 8.26
UD 27.18 18.99 10.10 68.80
PSLM 1.58 1.11 0.35 3.56
EPL 2.00 0.86 0.00 3.00
WSC 3.00 1.36 1.00 5.00
CBC 59.32 33.28 12.40 100.00
BRR1Y 48.53 24.95 0.00 84.00
TTR 34.99 8.08 19.86 45.89
Delta_i 1.24 0.71 -0.35 2.56
Table 2.14: Annual Variable Summary Statistics - 2014
Mean SD Min Max
UR 8.21 4.27 3.49 24.45
TAXCORP 2.79 1.20 1.37 6.64
UD 26.35 19.34 5.30 68.50
PSLM 1.41 0.98 0.28 3.43
EPL 2.00 0.76 0.00 3.00
WSC 3.00 1.33 1.00 5.00
CBC 52.70 31.08 8.70 100.00
BRR1Y 42.77 24.88 0.00 84.00
TTR 34.27 7.35 19.61 48.53
Delta_i 1.49 1.40 -0.59 5.91
Table 2.15: Annual Variable Summary Statistics - 2015
Mean SD Min Max
UR 8.15 4.07 3.38 22.08
TAXCORP 2.73 0.89 1.46 4.41
UD 25.16 20.00 4.50 68.20
PSLM 1.35 0.96 0.28 3.31
EPL 2.00 0.81 0.00 3.00
WSC 3.00 1.37 1.00 5.00
CBC 50.94 34.44 8.50 100.00
BRR1Y 43.95 22.39 9.00 84.00
TTR 34.79 7.00 20.39 46.06
Delta_i 1.30 1.24 -0.88 4.95
Table 2.16: Annual Variable Summary Statistics - 2016
Mean SD Min Max
UR 7.12 3.69 3.12 19.65
TAXCORP 3.00 0.91 1.61 4.88
UD 23.84 18.34 7.70 67.40
PSLM 1.28 0.79 0.26 3.14
EPL 2.00 0.83 0.00 3.00
WSC 3.00 1.37 1.00 5.00
CBC 51.90 32.09 8.30 100.00
BRR1Y 44.36 24.45 9.00 85.00
TTR 34.85 6.29 24.75 45.49
Delta_i 0.86 1.00 -1.47 2.48
Table 2.17: Annual Variable Summary Statistics - 2017
Mean SD Min Max
UR 6.40 3.43 2.81 17.23
TAXCORP 3.16 1.10 1.49 5.11
UD 27.45 18.34 7.70 66.10
PSLM 1.28 0.76 0.24 2.55
EPL 2.00 0.84 0.00 3.00
WSC 3.00 1.36 1.00 5.00
CBC 54.26 33.50 8.30 100.00
BRR1Y 47.33 22.43 8.00 84.00
TTR 35.26 6.54 22.58 44.09
Delta_i 1.85 1.15 -0.07 4.24
Table 2.18: Annual Variable Summary Statistics - 2018
Mean SD Min Max
UR 5.34 2.67 2.27 15.27
TAXCORP 3.18 1.45 1.05 6.32
UD 22.02 18.21 5.90 67.50
PSLM 1.17 0.73 0.25 2.87
EPL 2.00 0.81 0.00 3.00
WSC 2.00 1.40 1.00 5.00
CBC 47.20 31.07 6.10 98.00
BRR1Y 43.95 25.10 8.00 84.00
TTR 34.79 6.00 24.89 44.17
Delta_i 2.09 1.24 0.00 4.85
Table 2.19: Annual Variable Summary Statistics - 2019
Mean SD Min Max
UR 4.67 1.34 2.35 6.28
TAXCORP 2.99 1.14 1.34 4.16
UD 21.57 14.13 7.40 49.10
PSLM 1.19 0.71 0.31 2.01
EPL 2.00 1.17 0.00 4.00
WSC 3.00 1.77 1.00 5.00
CBC 48.01 40.39 7.90 98.00
BRR1Y 41.57 24.99 8.00 77.00
TTR 35.17 6.96 24.97 43.87
Delta_i 1.85 0.79 0.64 3.03

We will now create data visualizations to inform our expected specification. Hex codes below for copypasta.

Color HEX Compliment
Blue #320EF1 #CDF10E
Red #F10E5B #0EF1A4
Lt. Green #CDF10E #320EF1
Green #0EF1A4 #F10E5B
# overall hur vs taxcorp, averages
Trend1 <- read.csv("X1.csv") %>% 
  clean_names()
Trend1 <- Trend1 %>% select(i_time1, location1, hur, taxcorp) %>% 
  group_by(i_time1) %>% 
  drop_na() %>% 
  summarize(mean_ur=mean(hur), mean_taxcorp = mean(taxcorp))
#View(Trend1)
colors <- c("Unemployment Rate" = "#F10E5B", "Corporate Tax Revenue" = "#0EF1A4")
ggplot(Trend1, aes(x=i_time1))+
  geom_line(aes(y=mean_ur,color = "Unemployment Rate"))+
  geom_line(aes(y=mean_taxcorp,color ="Corporate Tax Revenue"))+
  labs(x="Year", y="Mean %", color = "Legend",
       title = "Figure 1: Means by Year, Overall",
       subtitle = "32 OECD Countries from 2001-2019 N=357", caption = "Chart by Josiah Nelson, Data: OECD 2022a, OECD 2022b")+
  scale_color_manual(values = colors)+
  ylim(0,10)
### faceted plots for assignment
#hur vs taxcorp by year
ggplot(data=X1)+
  geom_point(mapping=aes(x=taxcorp,y=hur), color = "#CDF10E" ) + geom_smooth(mapping=aes(x=taxcorp,y=hur), method = lm, se=F, color = "#320EF1")+
  facet_wrap(~i_time1) + labs(x = "TAXCORP", y="UR", title = "Figure 1.1: Unemployment Rate vs Corporate Tax Revenue, By Year")
`geom_smooth()` using formula 'y ~ x'

#hur vs ud
ggplot(data=X1)+
  geom_point(mapping=aes(x=ud,y=hur, color = "#320EF1"))+ geom_smooth(mapping=aes(x=ud,y=hur), method = lm, se=F, color = "#CDF10E")+
  facet_wrap(~i_time1)+ labs(x = "UD", y="UR", title = "Figure 1.2: Unemployment Rate vs Union Density")
`geom_smooth()` using formula 'y ~ x'

#hur vs pslm
ggplot(data=X1)+
  geom_point(mapping=aes(x=pslm,y=hur), color = "#320EF1")+geom_smooth(mapping=aes(x=pslm,y=hur), method = lm, se=F, color = "#CDF10E")+
  facet_wrap(~i_time1)+ labs(x = "PSLM", y="UR", title = "Figure 1.3: Unemployment Rate vs Public Spending on Labor Markets")
`geom_smooth()` using formula 'y ~ x'

#hur vs epl
ggplot(data=X1)+
  geom_point(mapping=aes(x=epl,y=hur), color = "#320EF1")+geom_smooth(mapping=aes(x=epl,y=hur), method = lm, se=F, color = "#CDF10E")+
  facet_wrap(~i_time1)+ labs(x = "EPL", y="UR", title = "Figure 1.4: Unemployment Rate vs Employment Protection Legislation")
`geom_smooth()` using formula 'y ~ x'

#hur vs wsc
ggplot(data=X1)+
  geom_point(mapping=aes(x=wsc,y=hur), color = "#320EF1")+geom_smooth(mapping=aes(x=wsc,y=hur), method = lm, se=F, color = "#CDF10E")+
  facet_wrap(~i_time1)+ labs(x = "WSC", y="UR", title = "Figure 1.5: Unemployment Rate vs Wage Setting Coordination")
`geom_smooth()` using formula 'y ~ x'

#hur vs cbc
ggplot(data=X1)+
  geom_point(mapping=aes(x=cbc,y=hur), color = "#320EF1")+geom_smooth(mapping=aes(x=cbc,y=hur), method = lm, se=F, color = "#CDF10E")+
  facet_wrap(~i_time1)+ labs(x = "CBC", y="UR", title = "Figure 1.6: Unemployment Rate vs Collective Bargaining Coverage")
`geom_smooth()` using formula 'y ~ x'

#hur vs brr
ggplot(data=X1)+
  geom_point(mapping=aes(x=brr1y,y=hur), color = "#320EF1")+geom_smooth(mapping=aes(x=brr1y,y=hur), method = lm, se=F, color = "#CDF10E")+
  facet_wrap(~i_time1)+ labs(x = "BRR", y="UR", title = "Figure 1.7: Unemployment Rate vs Benefit Replacement Rate (1yr)")
`geom_smooth()` using formula 'y ~ x'

#hur vs ttr
ggplot(data=X1)+
  geom_point(mapping=aes(x=ttr,y=hur), color = "#320EF1")+geom_smooth(mapping=aes(x=ttr,y=hur), method = lm, se=F, color = "#CDF10E")+
  facet_wrap(~i_time1)+ labs(x = "TTR", y="UR", title = "Figure 1.8: Unemployment Rate vs Total Tax Rate")
`geom_smooth()` using formula 'y ~ x'

#hur vs delta_i
ggplot(data=X1)+
  geom_point(mapping=aes(x=inf_gdpd,y=hur), color = "#320EF1")+geom_smooth(mapping=aes(x=inf_gdpd,y=hur), method = lm, se=F, color = "#CDF10E")+
  facet_wrap(~i_time1)+ labs(x = "delta_i", y="UR", title = "Unemployment Rate vs Change in Inflation")
`geom_smooth()` using formula 'y ~ x'

#hur vs l1_delta_i; lag for science
ggplot(data=X1)+
  geom_point(mapping=aes(x=l1_inf_gdpd,y=hur), color = "#320EF1")+geom_smooth(mapping=aes(x=l1_inf_gdpd,y=hur), method = lm, se=F, color = "#CDF10E")+
  facet_wrap(~i_time1)+ labs(x = "delta_i", y="UR", title = "Unemployment Rate vs Change in Inflation, t-1")
`geom_smooth()` using formula 'y ~ x'

Infographics!

Try to make a heat map in ggplot choropleth map of averages. If all else fails, there is always datawrapper \(\rightarrow\) world map

Correlation Matrix; Visual

CorData = subset(X1, select = -c(i_time1, location1, l1_inf_gdpd))
ggcorrplot(cor(CorData), type = "upper", method = c("circle"),
           colors = c("#320EF1", "white", "#F10E5B")) + 
  labs(title = "Figure 2: Correlation Matrix Infographic")
Warning: `guides(<scale> = FALSE)` is deprecated. Please use `guides(<scale> = "none")` instead.

Regression Analysis

print("Coming Soon")

Clean Environment

rm(list=ls())
LS0tDQp0aXRsZTogIkVDT04gMTQ1IERhdGEgUHJvamVjdCBOb3RlcyINCm91dHB1dDoNCiAgaHRtbF9ub3RlYm9vazogZGVmYXVsdA0KICBhbHdheXNfYWxsb3dfaHRtbDogdHJ1ZQ0KLS0tDQoNCg0KIyMgRmlyc3QgU3RlcHMNCiogcmVxdWlyZWQgcGFja2FnZXMgDQpgYGB7cn0NCnJlcXVpcmUocmVhZHhsKSAjIG1heSBiZSB1bm5lY2Nlc3NhcnkgYXMgSSdtIHNhdmluZyB0byAuY3N2DQojcmVxdWlyZShkcGx5cikNCiNyZXF1aXJlKHRpZHlyKQ0KcmVxdWlyZSh0aWR5dmVyc2UpICMgaSB0aGluayB0aGlzIGdpdmVzIG1lIGRwbHlyIGFuZCB0aWR5cg0KcmVxdWlyZShqYW5pdG9yKSAjIGNsZWFuIG5hbWVzDQpyZXF1aXJlKGdncGxvdDIpICMgZGF0YSB2aXoNCnJlcXVpcmUoZ2djb3JycGxvdCkgI2NvciBtYXRyaXggYW5kIHBsb3RzDQpyZXF1aXJlKGl2cmVnKSAjIHR3byBzdGFnZSBsZWFzdCBzcXVhcmVzIHJlZ3Jlc3Npb24NCnJlcXVpcmUoa2FibGVFeHRyYSkgIyB0YWJsZXMNCmBgYA0KDQoqIGF0dGVtcHQgdG8gY2xlYW4gZGF0YSB1c2luZyBSIChJdCdzIG5vdCB3b3JraW5nIG91dCBzbyB3ZWxsKTsgSSBkaWQgaXQgaW4gRXhjZWwgKE1hciAxMikNCiogdGFrZSB2YXJpYWJsZXMgKlRPQ1AqIGFuZCAqVVJfYiogZnJvbSBhcHByb3ByaWF0ZSBmaWxlcyBhbmQgbWFrZSBhIGRvdCBwbG90IHRvIHNob3cgY29ycmVsYXRpb24NCg0KIyMjIERhdGEgR3VpZGUNCmBgYHtyIEd1aWRlIFRhYmxlfQ0KR3VpZGVERiA8LSByZWFkX2V4Y2VsKCJEYXRhR3VpZGUueGxzeCIpIA0KR3VpZGVERg0KDQpgYGANCiMjIFNlY29uZCBTdGVwcw0KIyMjIERhdGEgRXhwbG9yYXRpb24NCkEgVGFibGUgb2Ygc3VtbWFyeSBzdGF0aXN0aWNzIG9mIHZhcmlhYmxlcyB0byBpbmNsdWRlOg0KKiBtZWFuDQoqIHNkDQoqIG1pbi1tYXgNCiogZG90IHBsb3RzIA0KDQojIyMjIEl0ZXJhdGlvbiAxOiBYMS5jc3YgY2xlYW5lZCBkYXRhIG9mIDEzIGNvbHVtbnMsIDM1NyBvYnNlcnZhdGlvbnMuIENyZWF0ZSBERiB3aXRoIGNsZWFuIG5hbWVzDQpgYGB7ciBSZWFkIEludG8gUn0NClgxIDwtIHJlYWQuY3N2KCJYMS5jc3YiKSAlPiUgDQogICAgICAgICAgIGNsZWFuX25hbWVzKCkgI3BpcGluZyBwcmV2ZW50cyBhbiB1bWxhdXQgb3ZlciB0aGUgaQ0KWDEgIyBvdXRwdXQgYmUgdmlzaWJsZSBpbiBSIG5vdGVib29rOyBubyBuZWVkIHRvIFZpZXcoKQ0KDQpgYGANCiMjIyMgU3RhdGlzdGljYWwgU3VtbWFyeSBUYWJsZQ0KTm93LCB3ZSBtYWtlIGEgc3RhdGlzdGljYWwgc3VtbWFyeSB0YWJsZS4gSW5zdHJ1bWVudGVkIHZhcmlhYmxlcyBhcmUgcm91bmRlZCBpbiB0aGUgdGFibGUgZm9yIG1lYW4sIG1pbiBhbmQgbWF4LiBQZXJoYXBzIHRoZXkgc2hvdWxkIGJlIHJvdW5kZWQgaW4gdGhlIERGIGl0c2VsZi4NCmBgYHtyIFRhYmxlIDJ9DQpEZXNjcmlwdGl2ZTEgPC0gbWF0cml4KCANCiAgcm91bmQoDQogICAgYygNCiAgICAgIG1lYW4oWDEkaHVyKSxzZChYMSRodXIpLG1pbihYMSRodXIpLG1heChYMSRodXIpLA0KICAgICAgDQogICAgICBtZWFuKFgxJHRheGNvcnApLCAgc2QoWDEkdGF4Y29ycCksIG1pbihYMSR0YXhjb3JwKSxtYXgoWDEkdGF4Y29ycCksDQogICAgICANCiAgICAgIG1lYW4oWDEkdWQpLCBzZChYMSR1ZCksbWluKFgxJHVkKSxtYXgoWDEkdWQpLA0KICAgICAgDQogICAgICBtZWFuKFgxJHBzbG0pLHNkKFgxJHBzbG0pLG1pbihYMSRwc2xtKSxtYXgoWDEkcHNsbSksDQogICAgICANCiAgICAgIHJvdW5kKG1lYW4oWDEkZXBsKSwwKSwgc2QoWDEkZXBsKSwgcm91bmQobWluKFgxJGVwbCksMCkscm91bmQobWF4KFgxJGVwbCksMCksDQogICAgICANCiAgICAgIHJvdW5kKG1lYW4oWDEkd3NjKSwwKSwgc2QoWDEkd3NjKSwgcm91bmQobWluKFgxJHdzYyksMCkscm91bmQobWF4KFgxJHdzYyksMCksDQogICAgICANCiAgICAgIG1lYW4oWDEkY2JjKSwgc2QoWDEkY2JjKSxtaW4oWDEkY2JjKSxtYXgoWDEkY2JjKSwNCiAgICAgIA0KICAgICAgbWVhbihYMSRicnIxeSksIHNkKFgxJGJycjF5KSwgbWluKFgxJGJycjF5KSxtYXgoWDEkYnJyMXkpLA0KICAgICAgDQogICAgICBtZWFuKFgxJHR0ciksIHNkKFgxJHR0ciksbWluKFgxJHR0ciksbWF4KFgxJHR0ciksDQogICAgICANCiAgICAgIG1lYW4oWDEkaW5mX2dkcGQpLHNkKFgxJGluZl9nZHBkKSxtaW4oWDEkaW5mX2dkcGQpLG1heChYMSRpbmZfZ2RwZCkNCiAgICAgICApLCAyKSwNCiAgbmNvbCA9IDQsIGJ5cm93ID0gVCkNCg0KY29sbmFtZXMoRGVzY3JpcHRpdmUxKSA8LSBjKCJNZWFuIiwgIlNEIiwiTWluIiwiTWF4IikNCnJvd25hbWVzKERlc2NyaXB0aXZlMSkgPC0gYygiVVIiLCJUQVhDT1JQIiwiVUQiLCJQU0xNIiwiRVBMIiwiV1NDIiwiQ0JDIiwiQlJSMVkiLCJUVFIiLCJEZWx0YV9pIikNCg0Ka2JsKERlc2NyaXB0aXZlMSwgY2FwdGlvbiA9ICJUYWJsZSAyOiBWYXJpYWJsZSBTdW1tYXJ5IFN0YXRpc3RpY3MsIEFsbCBPYnNlcnZhdGlvbnMiKSAlPiUgDQogIGthYmxlX3N0eWxpbmcoYm9vdHN0cmFwX29wdGlvbnMgPSBjKCJzdHJpcGVkIiwgImhvdmVyIiwiY29uZGVuc2VkIikpICU+JSANCiAgY29sdW1uX3NwZWMoMSwgYm9sZCA9IFQpDQpgYGANCk5vdywgd2UgbmVlZCB0byBicmVhayBkb3duIHN1bW1hcnkgc3RhdGlzdGljcyBieSB5ZWFyLiBXZSB3aWxsIGRvIHRoaXMgYnkgY3JlYXRpbmcgYSBmaWx0ZXJlZCBkZiBwZXIgeWVhci4gVGhlc2UgY2FuIGNvbWUgaW4gaGFuZHkgaW4gdGhlIGZ1dHVyZSBhcyB3ZWxsLiBUaGlzIGlzIGdvaW5nIHRvIGJlIGEgZmF0IGNodW5rIG9mIGNvZGUgYXMgSSdtIG5vdCBnb2luZyB0byB0YWtlIHRoZSB0aW1lIHRvIGxlYXJuIGhvdyB0byBhdXRvbWF0ZS4gQ29kZSBpcyBpbiBub3RlYm9vayBidXQgZWNobyBpcyBmYWxzZSAqKmFubnVhbF9kYXRhLlIqKg0KYGBge3IgVGFibGUgMi5YWCwgZWNobz1GQUxTRX0NCiNtYWtlIHN1cmUgYWxsIHByZS1yZXFzIGFyZSBsb2FkZWQNCkYyMDAxWDEgPC0gZmlsdGVyKFgxLCBpX3RpbWUxPT0yMDAxKTsgRjIwMDJYMSA8LSBmaWx0ZXIoWDEsIGlfdGltZTE9PTIwMDIpDQpGMjAwM1gxIDwtIGZpbHRlcihYMSwgaV90aW1lMT09MjAwMyk7IEYyMDA0WDEgPC0gZmlsdGVyKFgxLCBpX3RpbWUxPT0yMDA0KQ0KRjIwMDVYMSA8LSBmaWx0ZXIoWDEsIGlfdGltZTE9PTIwMDUpOyBGMjAwNlgxIDwtIGZpbHRlcihYMSwgaV90aW1lMT09MjAwNikNCkYyMDA3WDEgPC0gZmlsdGVyKFgxLCBpX3RpbWUxPT0yMDA3KTsgRjIwMDhYMSA8LSBmaWx0ZXIoWDEsIGlfdGltZTE9PTIwMDgpDQpGMjAwOVgxIDwtIGZpbHRlcihYMSwgaV90aW1lMT09MjAwOSk7IEYyMDEwWDEgPC0gZmlsdGVyKFgxLCBpX3RpbWUxPT0yMDEwKQ0KRjIwMTFYMSA8LSBmaWx0ZXIoWDEsIGlfdGltZTE9PTIwMTEpOyBGMjAxMlgxIDwtIGZpbHRlcihYMSwgaV90aW1lMT09MjAxMikNCkYyMDEzWDEgPC0gZmlsdGVyKFgxLCBpX3RpbWUxPT0yMDEzKTsgRjIwMTRYMSA8LSBmaWx0ZXIoWDEsIGlfdGltZTE9PTIwMTQpDQpGMjAxNVgxIDwtIGZpbHRlcihYMSwgaV90aW1lMT09MjAxNSk7IEYyMDE2WDEgPC0gZmlsdGVyKFgxLCBpX3RpbWUxPT0yMDE2KQ0KRjIwMTdYMSA8LSBmaWx0ZXIoWDEsIGlfdGltZTE9PTIwMTcpOyBGMjAxOFgxIDwtIGZpbHRlcihYMSwgaV90aW1lMT09MjAxOCkNCkYyMDE5WDEgPC0gZmlsdGVyKFgxLCBpX3RpbWUxPT0yMDE5KQ0KIyAyMDAxDQpEZXNjcmlwdGl2ZTIwMDEgPC0gbWF0cml4KCANCiAgcm91bmQoDQogICAgYygNCiAgICAgIG1lYW4oRjIwMDFYMSRodXIpLHNkKEYyMDAxWDEkaHVyKSxtaW4oRjIwMDFYMSRodXIpLG1heChGMjAwMVgxJGh1ciksDQogICAgICANCiAgICAgIG1lYW4oRjIwMDFYMSR0YXhjb3JwKSwgIHNkKEYyMDAxWDEkdGF4Y29ycCksIG1pbihGMjAwMVgxJHRheGNvcnApLG1heChGMjAwMVgxJHRheGNvcnApLA0KICAgICAgDQogICAgICBtZWFuKEYyMDAxWDEkdWQpLCBzZChGMjAwMVgxJHVkKSxtaW4oRjIwMDFYMSR1ZCksbWF4KEYyMDAxWDEkdWQpLA0KICAgICAgDQogICAgICBtZWFuKEYyMDAxWDEkcHNsbSksc2QoRjIwMDFYMSRwc2xtKSxtaW4oRjIwMDFYMSRwc2xtKSxtYXgoRjIwMDFYMSRwc2xtKSwNCiAgICAgIA0KICAgICAgcm91bmQobWVhbihGMjAwMVgxJGVwbCksMCksIHNkKEYyMDAxWDEkZXBsKSwgcm91bmQobWluKEYyMDAxWDEkZXBsKSwwKSxyb3VuZChtYXgoRjIwMDFYMSRlcGwpLDApLA0KICAgICAgDQogICAgICByb3VuZChtZWFuKEYyMDAxWDEkd3NjKSwwKSwgc2QoRjIwMDFYMSR3c2MpLCByb3VuZChtaW4oRjIwMDFYMSR3c2MpLDApLHJvdW5kKG1heChGMjAwMVgxJHdzYyksMCksDQogICAgICANCiAgICAgIG1lYW4oRjIwMDFYMSRjYmMpLCBzZChGMjAwMVgxJGNiYyksbWluKEYyMDAxWDEkY2JjKSxtYXgoRjIwMDFYMSRjYmMpLA0KICAgICAgDQogICAgICBtZWFuKEYyMDAxWDEkYnJyMXkpLCBzZChGMjAwMVgxJGJycjF5KSwgbWluKEYyMDAxWDEkYnJyMXkpLG1heChGMjAwMVgxJGJycjF5KSwNCiAgICAgIA0KICAgICAgbWVhbihGMjAwMVgxJHR0ciksIHNkKEYyMDAxWDEkdHRyKSxtaW4oRjIwMDFYMSR0dHIpLG1heChGMjAwMVgxJHR0ciksDQogICAgICANCiAgICAgIG1lYW4oRjIwMDFYMSRpbmZfZ2RwZCksc2QoRjIwMDFYMSRpbmZfZ2RwZCksbWluKEYyMDAxWDEkaW5mX2dkcGQpLG1heChGMjAwMVgxJGluZl9nZHBkKQ0KICAgICksIDIpLA0KICBuY29sID0gNCwgYnlyb3cgPSBUKQ0KDQpjb2xuYW1lcyhEZXNjcmlwdGl2ZTIwMDEpIDwtIGMoIk1lYW4iLCAiU0QiLCJNaW4iLCJNYXgiKQ0Kcm93bmFtZXMoRGVzY3JpcHRpdmUyMDAxKSA8LSBjKCJVUiIsIlRBWENPUlAiLCJVRCIsIlBTTE0iLCJFUEwiLCJXU0MiLCJDQkMiLCJCUlIxWSIsIlRUUiIsIkRlbHRhX2kiKQ0KDQprYmwoRGVzY3JpcHRpdmUyMDAxLCBjYXB0aW9uID0gIlRhYmxlIDIuMTogQW5udWFsIFZhcmlhYmxlIFN1bW1hcnkgU3RhdGlzdGljcyAtIDIwMDEiKSAlPiUgDQogIGthYmxlX3N0eWxpbmcoYm9vdHN0cmFwX29wdGlvbnMgPSBjKCJzdHJpcGVkIiwgImhvdmVyIiwiY29uZGVuc2VkIikpICU+JSANCiAgY29sdW1uX3NwZWMoMSwgYm9sZCA9IFQpDQoNCiMgMjAwMg0KRGVzY3JpcHRpdmUyMDAyIDwtIG1hdHJpeCggDQogIHJvdW5kKA0KICAgIGMoDQogICAgICBtZWFuKEYyMDAyWDEkaHVyKSxzZChGMjAwMlgxJGh1ciksbWluKEYyMDAyWDEkaHVyKSxtYXgoRjIwMDJYMSRodXIpLA0KICAgICAgDQogICAgICBtZWFuKEYyMDAyWDEkdGF4Y29ycCksICBzZChGMjAwMlgxJHRheGNvcnApLCBtaW4oRjIwMDJYMSR0YXhjb3JwKSxtYXgoRjIwMDJYMSR0YXhjb3JwKSwNCiAgICAgIA0KICAgICAgbWVhbihGMjAwMlgxJHVkKSwgc2QoRjIwMDJYMSR1ZCksbWluKEYyMDAyWDEkdWQpLG1heChGMjAwMlgxJHVkKSwNCiAgICAgIA0KICAgICAgbWVhbihGMjAwMlgxJHBzbG0pLHNkKEYyMDAyWDEkcHNsbSksbWluKEYyMDAyWDEkcHNsbSksbWF4KEYyMDAyWDEkcHNsbSksDQogICAgICANCiAgICAgIHJvdW5kKG1lYW4oRjIwMDJYMSRlcGwpLDApLCBzZChGMjAwMlgxJGVwbCksIHJvdW5kKG1pbihGMjAwMlgxJGVwbCksMCkscm91bmQobWF4KEYyMDAyWDEkZXBsKSwwKSwNCiAgICAgIA0KICAgICAgcm91bmQobWVhbihGMjAwMlgxJHdzYyksMCksIHNkKEYyMDAyWDEkd3NjKSwgcm91bmQobWluKEYyMDAyWDEkd3NjKSwwKSxyb3VuZChtYXgoRjIwMDJYMSR3c2MpLDApLA0KICAgICAgDQogICAgICBtZWFuKEYyMDAyWDEkY2JjKSwgc2QoRjIwMDJYMSRjYmMpLG1pbihGMjAwMlgxJGNiYyksbWF4KEYyMDAyWDEkY2JjKSwNCiAgICAgIA0KICAgICAgbWVhbihGMjAwMlgxJGJycjF5KSwgc2QoRjIwMDJYMSRicnIxeSksIG1pbihGMjAwMlgxJGJycjF5KSxtYXgoRjIwMDJYMSRicnIxeSksDQogICAgICANCiAgICAgIG1lYW4oRjIwMDJYMSR0dHIpLCBzZChGMjAwMlgxJHR0ciksbWluKEYyMDAyWDEkdHRyKSxtYXgoRjIwMDJYMSR0dHIpLA0KICAgICAgDQogICAgICBtZWFuKEYyMDAyWDEkaW5mX2dkcGQpLHNkKEYyMDAyWDEkaW5mX2dkcGQpLG1pbihGMjAwMlgxJGluZl9nZHBkKSxtYXgoRjIwMDJYMSRpbmZfZ2RwZCkNCiAgICApLCAyKSwNCiAgbmNvbCA9IDQsIGJ5cm93ID0gVCkNCg0KY29sbmFtZXMoRGVzY3JpcHRpdmUyMDAyKSA8LSBjKCJNZWFuIiwgIlNEIiwiTWluIiwiTWF4IikNCnJvd25hbWVzKERlc2NyaXB0aXZlMjAwMikgPC0gYygiVVIiLCJUQVhDT1JQIiwiVUQiLCJQU0xNIiwiRVBMIiwiV1NDIiwiQ0JDIiwiQlJSMVkiLCJUVFIiLCJEZWx0YV9pIikNCg0Ka2JsKERlc2NyaXB0aXZlMjAwMiwgY2FwdGlvbiA9ICJUYWJsZSAyLjI6IEFubnVhbCBWYXJpYWJsZSBTdW1tYXJ5IFN0YXRpc3RpY3MgLSAyMDAyIikgJT4lIA0KICBrYWJsZV9zdHlsaW5nKGJvb3RzdHJhcF9vcHRpb25zID0gYygic3RyaXBlZCIsICJob3ZlciIsImNvbmRlbnNlZCIpKSAlPiUgDQogIGNvbHVtbl9zcGVjKDEsIGJvbGQgPSBUKQ0KDQojMjAwMw0KRGVzY3JpcHRpdmUyMDAzIDwtIG1hdHJpeCggDQogIHJvdW5kKA0KICAgIGMoDQogICAgICBtZWFuKEYyMDAzWDEkaHVyKSxzZChGMjAwM1gxJGh1ciksbWluKEYyMDAzWDEkaHVyKSxtYXgoRjIwMDNYMSRodXIpLA0KICAgICAgDQogICAgICBtZWFuKEYyMDAzWDEkdGF4Y29ycCksICBzZChGMjAwM1gxJHRheGNvcnApLCBtaW4oRjIwMDNYMSR0YXhjb3JwKSxtYXgoRjIwMDNYMSR0YXhjb3JwKSwNCiAgICAgIA0KICAgICAgbWVhbihGMjAwM1gxJHVkKSwgc2QoRjIwMDNYMSR1ZCksbWluKEYyMDAzWDEkdWQpLG1heChGMjAwM1gxJHVkKSwNCiAgICAgIA0KICAgICAgbWVhbihGMjAwM1gxJHBzbG0pLHNkKEYyMDAzWDEkcHNsbSksbWluKEYyMDAzWDEkcHNsbSksbWF4KEYyMDAzWDEkcHNsbSksDQogICAgICANCiAgICAgIHJvdW5kKG1lYW4oRjIwMDNYMSRlcGwpLDApLCBzZChGMjAwM1gxJGVwbCksIHJvdW5kKG1pbihGMjAwM1gxJGVwbCksMCkscm91bmQobWF4KEYyMDAzWDEkZXBsKSwwKSwNCiAgICAgIA0KICAgICAgcm91bmQobWVhbihGMjAwM1gxJHdzYyksMCksIHNkKEYyMDAzWDEkd3NjKSwgcm91bmQobWluKEYyMDAzWDEkd3NjKSwwKSxyb3VuZChtYXgoRjIwMDNYMSR3c2MpLDApLA0KICAgICAgDQogICAgICBtZWFuKEYyMDAzWDEkY2JjKSwgc2QoRjIwMDNYMSRjYmMpLG1pbihGMjAwM1gxJGNiYyksbWF4KEYyMDAzWDEkY2JjKSwNCiAgICAgIA0KICAgICAgbWVhbihGMjAwM1gxJGJycjF5KSwgc2QoRjIwMDNYMSRicnIxeSksIG1pbihGMjAwM1gxJGJycjF5KSxtYXgoRjIwMDNYMSRicnIxeSksDQogICAgICANCiAgICAgIG1lYW4oRjIwMDNYMSR0dHIpLCBzZChGMjAwM1gxJHR0ciksbWluKEYyMDAzWDEkdHRyKSxtYXgoRjIwMDNYMSR0dHIpLA0KICAgICAgDQogICAgICBtZWFuKEYyMDAzWDEkaW5mX2dkcGQpLHNkKEYyMDAzWDEkaW5mX2dkcGQpLG1pbihGMjAwM1gxJGluZl9nZHBkKSxtYXgoRjIwMDNYMSRpbmZfZ2RwZCkNCiAgICApLCAyKSwNCiAgbmNvbCA9IDQsIGJ5cm93ID0gVCkNCg0KY29sbmFtZXMoRGVzY3JpcHRpdmUyMDAzKSA8LSBjKCJNZWFuIiwgIlNEIiwiTWluIiwiTWF4IikNCnJvd25hbWVzKERlc2NyaXB0aXZlMjAwMykgPC0gYygiVVIiLCJUQVhDT1JQIiwiVUQiLCJQU0xNIiwiRVBMIiwiV1NDIiwiQ0JDIiwiQlJSMVkiLCJUVFIiLCJEZWx0YV9pIikNCmtibChEZXNjcmlwdGl2ZTIwMDMsIGNhcHRpb24gPSAiVGFibGUgMi4zOiBBbm51YWwgVmFyaWFibGUgU3VtbWFyeSBTdGF0aXN0aWNzIC0gMjAwMyIpICU+JSANCiAga2FibGVfc3R5bGluZyhib290c3RyYXBfb3B0aW9ucyA9IGMoInN0cmlwZWQiLCAiaG92ZXIiLCJjb25kZW5zZWQiKSkgJT4lIA0KICBjb2x1bW5fc3BlYygxLCBib2xkID0gVCkNCiMyMDA0DQpEZXNjcmlwdGl2ZTIwMDQgPC0gbWF0cml4KCANCiAgcm91bmQoDQogICAgYygNCiAgICAgIG1lYW4oRjIwMDRYMSRodXIpLHNkKEYyMDA0WDEkaHVyKSxtaW4oRjIwMDRYMSRodXIpLG1heChGMjAwNFgxJGh1ciksDQogICAgICANCiAgICAgIG1lYW4oRjIwMDRYMSR0YXhjb3JwKSwgIHNkKEYyMDA0WDEkdGF4Y29ycCksIG1pbihGMjAwNFgxJHRheGNvcnApLG1heChGMjAwNFgxJHRheGNvcnApLA0KICAgICAgDQogICAgICBtZWFuKEYyMDA0WDEkdWQpLCBzZChGMjAwNFgxJHVkKSxtaW4oRjIwMDRYMSR1ZCksbWF4KEYyMDA0WDEkdWQpLA0KICAgICAgDQogICAgICBtZWFuKEYyMDA0WDEkcHNsbSksc2QoRjIwMDRYMSRwc2xtKSxtaW4oRjIwMDRYMSRwc2xtKSxtYXgoRjIwMDRYMSRwc2xtKSwNCiAgICAgIA0KICAgICAgcm91bmQobWVhbihGMjAwNFgxJGVwbCksMCksIHNkKEYyMDA0WDEkZXBsKSwgcm91bmQobWluKEYyMDA0WDEkZXBsKSwwKSxyb3VuZChtYXgoRjIwMDRYMSRlcGwpLDApLA0KICAgICAgDQogICAgICByb3VuZChtZWFuKEYyMDA0WDEkd3NjKSwwKSwgc2QoRjIwMDRYMSR3c2MpLCByb3VuZChtaW4oRjIwMDRYMSR3c2MpLDApLHJvdW5kKG1heChGMjAwNFgxJHdzYyksMCksDQogICAgICANCiAgICAgIG1lYW4oRjIwMDRYMSRjYmMpLCBzZChGMjAwNFgxJGNiYyksbWluKEYyMDA0WDEkY2JjKSxtYXgoRjIwMDRYMSRjYmMpLA0KICAgICAgDQogICAgICBtZWFuKEYyMDA0WDEkYnJyMXkpLCBzZChGMjAwNFgxJGJycjF5KSwgbWluKEYyMDA0WDEkYnJyMXkpLG1heChGMjAwNFgxJGJycjF5KSwNCiAgICAgIA0KICAgICAgbWVhbihGMjAwNFgxJHR0ciksIHNkKEYyMDA0WDEkdHRyKSxtaW4oRjIwMDRYMSR0dHIpLG1heChGMjAwNFgxJHR0ciksDQogICAgICANCiAgICAgIG1lYW4oRjIwMDRYMSRpbmZfZ2RwZCksc2QoRjIwMDRYMSRpbmZfZ2RwZCksbWluKEYyMDA0WDEkaW5mX2dkcGQpLG1heChGMjAwNFgxJGluZl9nZHBkKQ0KICAgICksIDIpLA0KICBuY29sID0gNCwgYnlyb3cgPSBUKQ0KDQpjb2xuYW1lcyhEZXNjcmlwdGl2ZTIwMDQpIDwtIGMoIk1lYW4iLCAiU0QiLCJNaW4iLCJNYXgiKQ0Kcm93bmFtZXMoRGVzY3JpcHRpdmUyMDA0KSA8LSBjKCJVUiIsIlRBWENPUlAiLCJVRCIsIlBTTE0iLCJFUEwiLCJXU0MiLCJDQkMiLCJCUlIxWSIsIlRUUiIsIkRlbHRhX2kiKQ0KDQprYmwoRGVzY3JpcHRpdmUyMDA0LCBjYXB0aW9uID0gIlRhYmxlIDIuNDogQW5udWFsIFZhcmlhYmxlIFN1bW1hcnkgU3RhdGlzdGljcyAtIDIwMDQiKSAlPiUgDQogIGthYmxlX3N0eWxpbmcoYm9vdHN0cmFwX29wdGlvbnMgPSBjKCJzdHJpcGVkIiwgImhvdmVyIiwiY29uZGVuc2VkIikpICU+JSANCiAgY29sdW1uX3NwZWMoMSwgYm9sZCA9IFQpDQoNCiMyMDA1DQpEZXNjcmlwdGl2ZTIwMDUgPC0gbWF0cml4KCANCiAgcm91bmQoDQogICAgYygNCiAgICAgIG1lYW4oRjIwMDVYMSRodXIpLHNkKEYyMDA1WDEkaHVyKSxtaW4oRjIwMDVYMSRodXIpLG1heChGMjAwNVgxJGh1ciksDQogICAgICANCiAgICAgIG1lYW4oRjIwMDVYMSR0YXhjb3JwKSwgIHNkKEYyMDA1WDEkdGF4Y29ycCksIG1pbihGMjAwNVgxJHRheGNvcnApLG1heChGMjAwNVgxJHRheGNvcnApLA0KICAgICAgDQogICAgICBtZWFuKEYyMDA1WDEkdWQpLCBzZChGMjAwNVgxJHVkKSxtaW4oRjIwMDVYMSR1ZCksbWF4KEYyMDA1WDEkdWQpLA0KICAgICAgDQogICAgICBtZWFuKEYyMDA1WDEkcHNsbSksc2QoRjIwMDVYMSRwc2xtKSxtaW4oRjIwMDVYMSRwc2xtKSxtYXgoRjIwMDVYMSRwc2xtKSwNCiAgICAgIA0KICAgICAgcm91bmQobWVhbihGMjAwNVgxJGVwbCksMCksIHNkKEYyMDA1WDEkZXBsKSwgcm91bmQobWluKEYyMDA1WDEkZXBsKSwwKSxyb3VuZChtYXgoRjIwMDVYMSRlcGwpLDApLA0KICAgICAgDQogICAgICByb3VuZChtZWFuKEYyMDA1WDEkd3NjKSwwKSwgc2QoRjIwMDVYMSR3c2MpLCByb3VuZChtaW4oRjIwMDVYMSR3c2MpLDApLHJvdW5kKG1heChGMjAwNVgxJHdzYyksMCksDQogICAgICANCiAgICAgIG1lYW4oRjIwMDVYMSRjYmMpLCBzZChGMjAwNVgxJGNiYyksbWluKEYyMDA1WDEkY2JjKSxtYXgoRjIwMDVYMSRjYmMpLA0KICAgICAgDQogICAgICBtZWFuKEYyMDA1WDEkYnJyMXkpLCBzZChGMjAwNVgxJGJycjF5KSwgbWluKEYyMDA1WDEkYnJyMXkpLG1heChGMjAwNVgxJGJycjF5KSwNCiAgICAgIA0KICAgICAgbWVhbihGMjAwNVgxJHR0ciksIHNkKEYyMDA1WDEkdHRyKSxtaW4oRjIwMDVYMSR0dHIpLG1heChGMjAwNVgxJHR0ciksDQogICAgICANCiAgICAgIG1lYW4oRjIwMDVYMSRpbmZfZ2RwZCksc2QoRjIwMDVYMSRpbmZfZ2RwZCksbWluKEYyMDA1WDEkaW5mX2dkcGQpLG1heChGMjAwNVgxJGluZl9nZHBkKQ0KICAgICksIDIpLA0KICBuY29sID0gNCwgYnlyb3cgPSBUKQ0KDQpjb2xuYW1lcyhEZXNjcmlwdGl2ZTIwMDUpIDwtIGMoIk1lYW4iLCAiU0QiLCJNaW4iLCJNYXgiKQ0Kcm93bmFtZXMoRGVzY3JpcHRpdmUyMDA1KSA8LSBjKCJVUiIsIlRBWENPUlAiLCJVRCIsIlBTTE0iLCJFUEwiLCJXU0MiLCJDQkMiLCJCUlIxWSIsIlRUUiIsIkRlbHRhX2kiKQ0KDQprYmwoRGVzY3JpcHRpdmUyMDA1LCBjYXB0aW9uID0gIlRhYmxlIDIuNTogQW5udWFsIFZhcmlhYmxlIFN1bW1hcnkgU3RhdGlzdGljcyAtIDIwMDUiKSAlPiUgDQogIGthYmxlX3N0eWxpbmcoYm9vdHN0cmFwX29wdGlvbnMgPSBjKCJzdHJpcGVkIiwgImhvdmVyIiwiY29uZGVuc2VkIikpICU+JSANCiAgY29sdW1uX3NwZWMoMSwgYm9sZCA9IFQpDQoNCiMyMDA2DQpEZXNjcmlwdGl2ZTIwMDYgPC0gbWF0cml4KCANCiAgcm91bmQoDQogICAgYygNCiAgICAgIG1lYW4oRjIwMDZYMSRodXIpLHNkKEYyMDA2WDEkaHVyKSxtaW4oRjIwMDZYMSRodXIpLG1heChGMjAwNlgxJGh1ciksDQogICAgICANCiAgICAgIG1lYW4oRjIwMDZYMSR0YXhjb3JwKSwgIHNkKEYyMDA2WDEkdGF4Y29ycCksIG1pbihGMjAwNlgxJHRheGNvcnApLG1heChGMjAwNlgxJHRheGNvcnApLA0KICAgICAgDQogICAgICBtZWFuKEYyMDA2WDEkdWQpLCBzZChGMjAwNlgxJHVkKSxtaW4oRjIwMDZYMSR1ZCksbWF4KEYyMDA2WDEkdWQpLA0KICAgICAgDQogICAgICBtZWFuKEYyMDA2WDEkcHNsbSksc2QoRjIwMDZYMSRwc2xtKSxtaW4oRjIwMDZYMSRwc2xtKSxtYXgoRjIwMDZYMSRwc2xtKSwNCiAgICAgIA0KICAgICAgcm91bmQobWVhbihGMjAwNlgxJGVwbCksMCksIHNkKEYyMDA2WDEkZXBsKSwgcm91bmQobWluKEYyMDA2WDEkZXBsKSwwKSxyb3VuZChtYXgoRjIwMDZYMSRlcGwpLDApLA0KICAgICAgDQogICAgICByb3VuZChtZWFuKEYyMDA2WDEkd3NjKSwwKSwgc2QoRjIwMDZYMSR3c2MpLCByb3VuZChtaW4oRjIwMDZYMSR3c2MpLDApLHJvdW5kKG1heChGMjAwNlgxJHdzYyksMCksDQogICAgICANCiAgICAgIG1lYW4oRjIwMDZYMSRjYmMpLCBzZChGMjAwNlgxJGNiYyksbWluKEYyMDA2WDEkY2JjKSxtYXgoRjIwMDZYMSRjYmMpLA0KICAgICAgDQogICAgICBtZWFuKEYyMDA2WDEkYnJyMXkpLCBzZChGMjAwNlgxJGJycjF5KSwgbWluKEYyMDA2WDEkYnJyMXkpLG1heChGMjAwNlgxJGJycjF5KSwNCiAgICAgIA0KICAgICAgbWVhbihGMjAwNlgxJHR0ciksIHNkKEYyMDA2WDEkdHRyKSxtaW4oRjIwMDZYMSR0dHIpLG1heChGMjAwNlgxJHR0ciksDQogICAgICANCiAgICAgIG1lYW4oRjIwMDZYMSRpbmZfZ2RwZCksc2QoRjIwMDZYMSRpbmZfZ2RwZCksbWluKEYyMDA2WDEkaW5mX2dkcGQpLG1heChGMjAwNlgxJGluZl9nZHBkKQ0KICAgICksIDIpLA0KICBuY29sID0gNCwgYnlyb3cgPSBUKQ0KDQpjb2xuYW1lcyhEZXNjcmlwdGl2ZTIwMDYpIDwtIGMoIk1lYW4iLCAiU0QiLCJNaW4iLCJNYXgiKQ0Kcm93bmFtZXMoRGVzY3JpcHRpdmUyMDA2KSA8LSBjKCJVUiIsIlRBWENPUlAiLCJVRCIsIlBTTE0iLCJFUEwiLCJXU0MiLCJDQkMiLCJCUlIxWSIsIlRUUiIsIkRlbHRhX2kiKQ0KDQprYmwoRGVzY3JpcHRpdmUyMDA2LCBjYXB0aW9uID0gIlRhYmxlIDIuNjogQW5udWFsIFZhcmlhYmxlIFN1bW1hcnkgU3RhdGlzdGljcyAtIDIwMDYiKSAlPiUgDQogIGthYmxlX3N0eWxpbmcoYm9vdHN0cmFwX29wdGlvbnMgPSBjKCJzdHJpcGVkIiwgImhvdmVyIiwiY29uZGVuc2VkIikpICU+JSANCiAgY29sdW1uX3NwZWMoMSwgYm9sZCA9IFQpDQoNCiMyMDA3DQpEZXNjcmlwdGl2ZTIwMDcgPC0gbWF0cml4KCANCiAgcm91bmQoDQogICAgYygNCiAgICAgIG1lYW4oRjIwMDdYMSRodXIpLHNkKEYyMDA3WDEkaHVyKSxtaW4oRjIwMDdYMSRodXIpLG1heChGMjAwN1gxJGh1ciksDQogICAgICANCiAgICAgIG1lYW4oRjIwMDdYMSR0YXhjb3JwKSwgIHNkKEYyMDA3WDEkdGF4Y29ycCksIG1pbihGMjAwN1gxJHRheGNvcnApLG1heChGMjAwN1gxJHRheGNvcnApLA0KICAgICAgDQogICAgICBtZWFuKEYyMDA3WDEkdWQpLCBzZChGMjAwN1gxJHVkKSxtaW4oRjIwMDdYMSR1ZCksbWF4KEYyMDA3WDEkdWQpLA0KICAgICAgDQogICAgICBtZWFuKEYyMDA3WDEkcHNsbSksc2QoRjIwMDdYMSRwc2xtKSxtaW4oRjIwMDdYMSRwc2xtKSxtYXgoRjIwMDdYMSRwc2xtKSwNCiAgICAgIA0KICAgICAgcm91bmQobWVhbihGMjAwN1gxJGVwbCksMCksIHNkKEYyMDA3WDEkZXBsKSwgcm91bmQobWluKEYyMDA3WDEkZXBsKSwwKSxyb3VuZChtYXgoRjIwMDdYMSRlcGwpLDApLA0KICAgICAgDQogICAgICByb3VuZChtZWFuKEYyMDA3WDEkd3NjKSwwKSwgc2QoRjIwMDdYMSR3c2MpLCByb3VuZChtaW4oRjIwMDdYMSR3c2MpLDApLHJvdW5kKG1heChGMjAwN1gxJHdzYyksMCksDQogICAgICANCiAgICAgIG1lYW4oRjIwMDdYMSRjYmMpLCBzZChGMjAwN1gxJGNiYyksbWluKEYyMDA3WDEkY2JjKSxtYXgoRjIwMDdYMSRjYmMpLA0KICAgICAgDQogICAgICBtZWFuKEYyMDA3WDEkYnJyMXkpLCBzZChGMjAwN1gxJGJycjF5KSwgbWluKEYyMDA3WDEkYnJyMXkpLG1heChGMjAwN1gxJGJycjF5KSwNCiAgICAgIA0KICAgICAgbWVhbihGMjAwN1gxJHR0ciksIHNkKEYyMDA3WDEkdHRyKSxtaW4oRjIwMDdYMSR0dHIpLG1heChGMjAwN1gxJHR0ciksDQogICAgICANCiAgICAgIG1lYW4oRjIwMDdYMSRpbmZfZ2RwZCksc2QoRjIwMDdYMSRpbmZfZ2RwZCksbWluKEYyMDA3WDEkaW5mX2dkcGQpLG1heChGMjAwN1gxJGluZl9nZHBkKQ0KICAgICksIDIpLA0KICBuY29sID0gNCwgYnlyb3cgPSBUKQ0KDQpjb2xuYW1lcyhEZXNjcmlwdGl2ZTIwMDcpIDwtIGMoIk1lYW4iLCAiU0QiLCJNaW4iLCJNYXgiKQ0Kcm93bmFtZXMoRGVzY3JpcHRpdmUyMDA3KSA8LSBjKCJVUiIsIlRBWENPUlAiLCJVRCIsIlBTTE0iLCJFUEwiLCJXU0MiLCJDQkMiLCJCUlIxWSIsIlRUUiIsIkRlbHRhX2kiKQ0KDQprYmwoRGVzY3JpcHRpdmUyMDA3LCBjYXB0aW9uID0gIlRhYmxlIDIuNzogQW5udWFsIFZhcmlhYmxlIFN1bW1hcnkgU3RhdGlzdGljcyAtIDIwMDciKSAlPiUgDQogIGthYmxlX3N0eWxpbmcoYm9vdHN0cmFwX29wdGlvbnMgPSBjKCJzdHJpcGVkIiwgImhvdmVyIiwiY29uZGVuc2VkIikpICU+JSANCiAgY29sdW1uX3NwZWMoMSwgYm9sZCA9IFQpDQoNCiMyMDA4DQpEZXNjcmlwdGl2ZTIwMDggPC0gbWF0cml4KCANCiAgcm91bmQoDQogICAgYygNCiAgICAgIG1lYW4oRjIwMDhYMSRodXIpLHNkKEYyMDA4WDEkaHVyKSxtaW4oRjIwMDhYMSRodXIpLG1heChGMjAwOFgxJGh1ciksDQogICAgICANCiAgICAgIG1lYW4oRjIwMDhYMSR0YXhjb3JwKSwgIHNkKEYyMDA4WDEkdGF4Y29ycCksIG1pbihGMjAwOFgxJHRheGNvcnApLG1heChGMjAwOFgxJHRheGNvcnApLA0KICAgICAgDQogICAgICBtZWFuKEYyMDA4WDEkdWQpLCBzZChGMjAwOFgxJHVkKSxtaW4oRjIwMDhYMSR1ZCksbWF4KEYyMDA4WDEkdWQpLA0KICAgICAgDQogICAgICBtZWFuKEYyMDA4WDEkcHNsbSksc2QoRjIwMDhYMSRwc2xtKSxtaW4oRjIwMDhYMSRwc2xtKSxtYXgoRjIwMDhYMSRwc2xtKSwNCiAgICAgIA0KICAgICAgcm91bmQobWVhbihGMjAwOFgxJGVwbCksMCksIHNkKEYyMDA4WDEkZXBsKSwgcm91bmQobWluKEYyMDA4WDEkZXBsKSwwKSxyb3VuZChtYXgoRjIwMDhYMSRlcGwpLDApLA0KICAgICAgDQogICAgICByb3VuZChtZWFuKEYyMDA4WDEkd3NjKSwwKSwgc2QoRjIwMDhYMSR3c2MpLCByb3VuZChtaW4oRjIwMDhYMSR3c2MpLDApLHJvdW5kKG1heChGMjAwOFgxJHdzYyksMCksDQogICAgICANCiAgICAgIG1lYW4oRjIwMDhYMSRjYmMpLCBzZChGMjAwOFgxJGNiYyksbWluKEYyMDA4WDEkY2JjKSxtYXgoRjIwMDhYMSRjYmMpLA0KICAgICAgDQogICAgICBtZWFuKEYyMDA4WDEkYnJyMXkpLCBzZChGMjAwOFgxJGJycjF5KSwgbWluKEYyMDA4WDEkYnJyMXkpLG1heChGMjAwOFgxJGJycjF5KSwNCiAgICAgIA0KICAgICAgbWVhbihGMjAwOFgxJHR0ciksIHNkKEYyMDA4WDEkdHRyKSxtaW4oRjIwMDhYMSR0dHIpLG1heChGMjAwOFgxJHR0ciksDQogICAgICANCiAgICAgIG1lYW4oRjIwMDhYMSRpbmZfZ2RwZCksc2QoRjIwMDhYMSRpbmZfZ2RwZCksbWluKEYyMDA4WDEkaW5mX2dkcGQpLG1heChGMjAwOFgxJGluZl9nZHBkKQ0KICAgICksIDIpLA0KICBuY29sID0gNCwgYnlyb3cgPSBUKQ0KDQpjb2xuYW1lcyhEZXNjcmlwdGl2ZTIwMDgpIDwtIGMoIk1lYW4iLCAiU0QiLCJNaW4iLCJNYXgiKQ0Kcm93bmFtZXMoRGVzY3JpcHRpdmUyMDA4KSA8LSBjKCJVUiIsIlRBWENPUlAiLCJVRCIsIlBTTE0iLCJFUEwiLCJXU0MiLCJDQkMiLCJCUlIxWSIsIlRUUiIsIkRlbHRhX2kiKQ0KDQprYmwoRGVzY3JpcHRpdmUyMDA4LCBjYXB0aW9uID0gIlRhYmxlIDIuODogQW5udWFsIFZhcmlhYmxlIFN1bW1hcnkgU3RhdGlzdGljcyAtIDIwMDgiKSAlPiUgDQogIGthYmxlX3N0eWxpbmcoYm9vdHN0cmFwX29wdGlvbnMgPSBjKCJzdHJpcGVkIiwgImhvdmVyIiwiY29uZGVuc2VkIikpICU+JSANCiAgY29sdW1uX3NwZWMoMSwgYm9sZCA9IFQpDQoNCiMyMDA5DQpEZXNjcmlwdGl2ZTIwMDkgPC0gbWF0cml4KCANCiAgcm91bmQoDQogICAgYygNCiAgICAgIG1lYW4oRjIwMDlYMSRodXIpLHNkKEYyMDA5WDEkaHVyKSxtaW4oRjIwMDlYMSRodXIpLG1heChGMjAwOVgxJGh1ciksDQogICAgICANCiAgICAgIG1lYW4oRjIwMDlYMSR0YXhjb3JwKSwgIHNkKEYyMDA5WDEkdGF4Y29ycCksIG1pbihGMjAwOVgxJHRheGNvcnApLG1heChGMjAwOVgxJHRheGNvcnApLA0KICAgICAgDQogICAgICBtZWFuKEYyMDA5WDEkdWQpLCBzZChGMjAwOVgxJHVkKSxtaW4oRjIwMDlYMSR1ZCksbWF4KEYyMDA5WDEkdWQpLA0KICAgICAgDQogICAgICBtZWFuKEYyMDA5WDEkcHNsbSksc2QoRjIwMDlYMSRwc2xtKSxtaW4oRjIwMDlYMSRwc2xtKSxtYXgoRjIwMDlYMSRwc2xtKSwNCiAgICAgIA0KICAgICAgcm91bmQobWVhbihGMjAwOVgxJGVwbCksMCksIHNkKEYyMDA5WDEkZXBsKSwgcm91bmQobWluKEYyMDA5WDEkZXBsKSwwKSxyb3VuZChtYXgoRjIwMDlYMSRlcGwpLDApLA0KICAgICAgDQogICAgICByb3VuZChtZWFuKEYyMDA5WDEkd3NjKSwwKSwgc2QoRjIwMDlYMSR3c2MpLCByb3VuZChtaW4oRjIwMDlYMSR3c2MpLDApLHJvdW5kKG1heChGMjAwOVgxJHdzYyksMCksDQogICAgICANCiAgICAgIG1lYW4oRjIwMDlYMSRjYmMpLCBzZChGMjAwOVgxJGNiYyksbWluKEYyMDA5WDEkY2JjKSxtYXgoRjIwMDlYMSRjYmMpLA0KICAgICAgDQogICAgICBtZWFuKEYyMDA5WDEkYnJyMXkpLCBzZChGMjAwOVgxJGJycjF5KSwgbWluKEYyMDA5WDEkYnJyMXkpLG1heChGMjAwOVgxJGJycjF5KSwNCiAgICAgIA0KICAgICAgbWVhbihGMjAwOVgxJHR0ciksIHNkKEYyMDA5WDEkdHRyKSxtaW4oRjIwMDlYMSR0dHIpLG1heChGMjAwOVgxJHR0ciksDQogICAgICANCiAgICAgIG1lYW4oRjIwMDlYMSRpbmZfZ2RwZCksc2QoRjIwMDlYMSRpbmZfZ2RwZCksbWluKEYyMDA5WDEkaW5mX2dkcGQpLG1heChGMjAwOVgxJGluZl9nZHBkKQ0KICAgICksIDIpLA0KICBuY29sID0gNCwgYnlyb3cgPSBUKQ0KDQpjb2xuYW1lcyhEZXNjcmlwdGl2ZTIwMDkpIDwtIGMoIk1lYW4iLCAiU0QiLCJNaW4iLCJNYXgiKQ0Kcm93bmFtZXMoRGVzY3JpcHRpdmUyMDA5KSA8LSBjKCJVUiIsIlRBWENPUlAiLCJVRCIsIlBTTE0iLCJFUEwiLCJXU0MiLCJDQkMiLCJCUlIxWSIsIlRUUiIsIkRlbHRhX2kiKQ0KDQprYmwoRGVzY3JpcHRpdmUyMDA5LCBjYXB0aW9uID0gIlRhYmxlIDIuOTogQW5udWFsIFZhcmlhYmxlIFN1bW1hcnkgU3RhdGlzdGljcyAtIDIwMDkiKSAlPiUgDQogIGthYmxlX3N0eWxpbmcoYm9vdHN0cmFwX29wdGlvbnMgPSBjKCJzdHJpcGVkIiwgImhvdmVyIiwiY29uZGVuc2VkIikpICU+JSANCiAgY29sdW1uX3NwZWMoMSwgYm9sZCA9IFQpDQoNCiMyMDEwDQpEZXNjcmlwdGl2ZTIwMTAgPC0gbWF0cml4KCANCiAgcm91bmQoDQogICAgYygNCiAgICAgIG1lYW4oRjIwMTBYMSRodXIpLHNkKEYyMDEwWDEkaHVyKSxtaW4oRjIwMTBYMSRodXIpLG1heChGMjAxMFgxJGh1ciksDQogICAgICANCiAgICAgIG1lYW4oRjIwMTBYMSR0YXhjb3JwKSwgIHNkKEYyMDEwWDEkdGF4Y29ycCksIG1pbihGMjAxMFgxJHRheGNvcnApLG1heChGMjAxMFgxJHRheGNvcnApLA0KICAgICAgDQogICAgICBtZWFuKEYyMDEwWDEkdWQpLCBzZChGMjAxMFgxJHVkKSxtaW4oRjIwMTBYMSR1ZCksbWF4KEYyMDEwWDEkdWQpLA0KICAgICAgDQogICAgICBtZWFuKEYyMDEwWDEkcHNsbSksc2QoRjIwMTBYMSRwc2xtKSxtaW4oRjIwMTBYMSRwc2xtKSxtYXgoRjIwMTBYMSRwc2xtKSwNCiAgICAgIA0KICAgICAgcm91bmQobWVhbihGMjAxMFgxJGVwbCksMCksIHNkKEYyMDEwWDEkZXBsKSwgcm91bmQobWluKEYyMDEwWDEkZXBsKSwwKSxyb3VuZChtYXgoRjIwMTBYMSRlcGwpLDApLA0KICAgICAgDQogICAgICByb3VuZChtZWFuKEYyMDEwWDEkd3NjKSwwKSwgc2QoRjIwMTBYMSR3c2MpLCByb3VuZChtaW4oRjIwMTBYMSR3c2MpLDApLHJvdW5kKG1heChGMjAxMFgxJHdzYyksMCksDQogICAgICANCiAgICAgIG1lYW4oRjIwMTBYMSRjYmMpLCBzZChGMjAxMFgxJGNiYyksbWluKEYyMDEwWDEkY2JjKSxtYXgoRjIwMTBYMSRjYmMpLA0KICAgICAgDQogICAgICBtZWFuKEYyMDEwWDEkYnJyMXkpLCBzZChGMjAxMFgxJGJycjF5KSwgbWluKEYyMDEwWDEkYnJyMXkpLG1heChGMjAxMFgxJGJycjF5KSwNCiAgICAgIA0KICAgICAgbWVhbihGMjAxMFgxJHR0ciksIHNkKEYyMDEwWDEkdHRyKSxtaW4oRjIwMTBYMSR0dHIpLG1heChGMjAxMFgxJHR0ciksDQogICAgICANCiAgICAgIG1lYW4oRjIwMTBYMSRpbmZfZ2RwZCksc2QoRjIwMTBYMSRpbmZfZ2RwZCksbWluKEYyMDEwWDEkaW5mX2dkcGQpLG1heChGMjAxMFgxJGluZl9nZHBkKQ0KICAgICksIDIpLA0KICBuY29sID0gNCwgYnlyb3cgPSBUKQ0KDQpjb2xuYW1lcyhEZXNjcmlwdGl2ZTIwMTApIDwtIGMoIk1lYW4iLCAiU0QiLCJNaW4iLCJNYXgiKQ0Kcm93bmFtZXMoRGVzY3JpcHRpdmUyMDEwKSA8LSBjKCJVUiIsIlRBWENPUlAiLCJVRCIsIlBTTE0iLCJFUEwiLCJXU0MiLCJDQkMiLCJCUlIxWSIsIlRUUiIsIkRlbHRhX2kiKQ0KDQprYmwoRGVzY3JpcHRpdmUyMDEwLCBjYXB0aW9uID0gIlRhYmxlIDIuMTA6IEFubnVhbCBWYXJpYWJsZSBTdW1tYXJ5IFN0YXRpc3RpY3MgLSAyMDEwIikgJT4lIA0KICBrYWJsZV9zdHlsaW5nKGJvb3RzdHJhcF9vcHRpb25zID0gYygic3RyaXBlZCIsICJob3ZlciIsImNvbmRlbnNlZCIpKSAlPiUgDQogIGNvbHVtbl9zcGVjKDEsIGJvbGQgPSBUKQ0KDQojMjAxMQ0KRGVzY3JpcHRpdmUyMDExIDwtIG1hdHJpeCggDQogIHJvdW5kKA0KICAgIGMoDQogICAgICBtZWFuKEYyMDExWDEkaHVyKSxzZChGMjAxMVgxJGh1ciksbWluKEYyMDExWDEkaHVyKSxtYXgoRjIwMTFYMSRodXIpLA0KICAgICAgDQogICAgICBtZWFuKEYyMDExWDEkdGF4Y29ycCksICBzZChGMjAxMVgxJHRheGNvcnApLCBtaW4oRjIwMTFYMSR0YXhjb3JwKSxtYXgoRjIwMTFYMSR0YXhjb3JwKSwNCiAgICAgIA0KICAgICAgbWVhbihGMjAxMVgxJHVkKSwgc2QoRjIwMTFYMSR1ZCksbWluKEYyMDExWDEkdWQpLG1heChGMjAxMVgxJHVkKSwNCiAgICAgIA0KICAgICAgbWVhbihGMjAxMVgxJHBzbG0pLHNkKEYyMDExWDEkcHNsbSksbWluKEYyMDExWDEkcHNsbSksbWF4KEYyMDExWDEkcHNsbSksDQogICAgICANCiAgICAgIHJvdW5kKG1lYW4oRjIwMTFYMSRlcGwpLDApLCBzZChGMjAxMVgxJGVwbCksIHJvdW5kKG1pbihGMjAxMVgxJGVwbCksMCkscm91bmQobWF4KEYyMDExWDEkZXBsKSwwKSwNCiAgICAgIA0KICAgICAgcm91bmQobWVhbihGMjAxMVgxJHdzYyksMCksIHNkKEYyMDExWDEkd3NjKSwgcm91bmQobWluKEYyMDExWDEkd3NjKSwwKSxyb3VuZChtYXgoRjIwMTFYMSR3c2MpLDApLA0KICAgICAgDQogICAgICBtZWFuKEYyMDExWDEkY2JjKSwgc2QoRjIwMTFYMSRjYmMpLG1pbihGMjAxMVgxJGNiYyksbWF4KEYyMDExWDEkY2JjKSwNCiAgICAgIA0KICAgICAgbWVhbihGMjAxMVgxJGJycjF5KSwgc2QoRjIwMTFYMSRicnIxeSksIG1pbihGMjAxMVgxJGJycjF5KSxtYXgoRjIwMTFYMSRicnIxeSksDQogICAgICANCiAgICAgIG1lYW4oRjIwMTFYMSR0dHIpLCBzZChGMjAxMVgxJHR0ciksbWluKEYyMDExWDEkdHRyKSxtYXgoRjIwMTFYMSR0dHIpLA0KICAgICAgDQogICAgICBtZWFuKEYyMDExWDEkaW5mX2dkcGQpLHNkKEYyMDExWDEkaW5mX2dkcGQpLG1pbihGMjAxMVgxJGluZl9nZHBkKSxtYXgoRjIwMTFYMSRpbmZfZ2RwZCkNCiAgICApLCAyKSwNCiAgbmNvbCA9IDQsIGJ5cm93ID0gVCkNCg0KY29sbmFtZXMoRGVzY3JpcHRpdmUyMDExKSA8LSBjKCJNZWFuIiwgIlNEIiwiTWluIiwiTWF4IikNCnJvd25hbWVzKERlc2NyaXB0aXZlMjAxMSkgPC0gYygiVVIiLCJUQVhDT1JQIiwiVUQiLCJQU0xNIiwiRVBMIiwiV1NDIiwiQ0JDIiwiQlJSMVkiLCJUVFIiLCJEZWx0YV9pIikNCg0Ka2JsKERlc2NyaXB0aXZlMjAxMSwgY2FwdGlvbiA9ICJUYWJsZSAyLjExOiBBbm51YWwgVmFyaWFibGUgU3VtbWFyeSBTdGF0aXN0aWNzIC0gMjAxMSIpICU+JSANCiAga2FibGVfc3R5bGluZyhib290c3RyYXBfb3B0aW9ucyA9IGMoInN0cmlwZWQiLCAiaG92ZXIiLCJjb25kZW5zZWQiKSkgJT4lIA0KICBjb2x1bW5fc3BlYygxLCBib2xkID0gVCkNCg0KIzIwMTINCkRlc2NyaXB0aXZlMjAxMiA8LSBtYXRyaXgoIA0KICByb3VuZCgNCiAgICBjKA0KICAgICAgbWVhbihGMjAxMlgxJGh1ciksc2QoRjIwMTJYMSRodXIpLG1pbihGMjAxMlgxJGh1ciksbWF4KEYyMDEyWDEkaHVyKSwNCiAgICAgIA0KICAgICAgbWVhbihGMjAxMlgxJHRheGNvcnApLCAgc2QoRjIwMTJYMSR0YXhjb3JwKSwgbWluKEYyMDEyWDEkdGF4Y29ycCksbWF4KEYyMDEyWDEkdGF4Y29ycCksDQogICAgICANCiAgICAgIG1lYW4oRjIwMTJYMSR1ZCksIHNkKEYyMDEyWDEkdWQpLG1pbihGMjAxMlgxJHVkKSxtYXgoRjIwMTJYMSR1ZCksDQogICAgICANCiAgICAgIG1lYW4oRjIwMTJYMSRwc2xtKSxzZChGMjAxMlgxJHBzbG0pLG1pbihGMjAxMlgxJHBzbG0pLG1heChGMjAxMlgxJHBzbG0pLA0KICAgICAgDQogICAgICByb3VuZChtZWFuKEYyMDEyWDEkZXBsKSwwKSwgc2QoRjIwMTJYMSRlcGwpLCByb3VuZChtaW4oRjIwMTJYMSRlcGwpLDApLHJvdW5kKG1heChGMjAxMlgxJGVwbCksMCksDQogICAgICANCiAgICAgIHJvdW5kKG1lYW4oRjIwMTJYMSR3c2MpLDApLCBzZChGMjAxMlgxJHdzYyksIHJvdW5kKG1pbihGMjAxMlgxJHdzYyksMCkscm91bmQobWF4KEYyMDEyWDEkd3NjKSwwKSwNCiAgICAgIA0KICAgICAgbWVhbihGMjAxMlgxJGNiYyksIHNkKEYyMDEyWDEkY2JjKSxtaW4oRjIwMTJYMSRjYmMpLG1heChGMjAxMlgxJGNiYyksDQogICAgICANCiAgICAgIG1lYW4oRjIwMTJYMSRicnIxeSksIHNkKEYyMDEyWDEkYnJyMXkpLCBtaW4oRjIwMTJYMSRicnIxeSksbWF4KEYyMDEyWDEkYnJyMXkpLA0KICAgICAgDQogICAgICBtZWFuKEYyMDEyWDEkdHRyKSwgc2QoRjIwMTJYMSR0dHIpLG1pbihGMjAxMlgxJHR0ciksbWF4KEYyMDEyWDEkdHRyKSwNCiAgICAgIA0KICAgICAgbWVhbihGMjAxMlgxJGluZl9nZHBkKSxzZChGMjAxMlgxJGluZl9nZHBkKSxtaW4oRjIwMTJYMSRpbmZfZ2RwZCksbWF4KEYyMDEyWDEkaW5mX2dkcGQpDQogICAgKSwgMiksDQogIG5jb2wgPSA0LCBieXJvdyA9IFQpDQoNCmNvbG5hbWVzKERlc2NyaXB0aXZlMjAxMikgPC0gYygiTWVhbiIsICJTRCIsIk1pbiIsIk1heCIpDQpyb3duYW1lcyhEZXNjcmlwdGl2ZTIwMTIpIDwtIGMoIlVSIiwiVEFYQ09SUCIsIlVEIiwiUFNMTSIsIkVQTCIsIldTQyIsIkNCQyIsIkJSUjFZIiwiVFRSIiwiRGVsdGFfaSIpDQoNCmtibChEZXNjcmlwdGl2ZTIwMTIsIGNhcHRpb24gPSAiVGFibGUgMi4xMjogQW5udWFsIFZhcmlhYmxlIFN1bW1hcnkgU3RhdGlzdGljcyAtIDIwMTIiKSAlPiUgDQogIGthYmxlX3N0eWxpbmcoYm9vdHN0cmFwX29wdGlvbnMgPSBjKCJzdHJpcGVkIiwgImhvdmVyIiwiY29uZGVuc2VkIikpICU+JSANCiAgY29sdW1uX3NwZWMoMSwgYm9sZCA9IFQpDQoNCiMyMDEzDQpEZXNjcmlwdGl2ZTIwMTMgPC0gbWF0cml4KCANCiAgcm91bmQoDQogICAgYygNCiAgICAgIG1lYW4oRjIwMTNYMSRodXIpLHNkKEYyMDEzWDEkaHVyKSxtaW4oRjIwMTNYMSRodXIpLG1heChGMjAxM1gxJGh1ciksDQogICAgICANCiAgICAgIG1lYW4oRjIwMTNYMSR0YXhjb3JwKSwgIHNkKEYyMDEzWDEkdGF4Y29ycCksIG1pbihGMjAxM1gxJHRheGNvcnApLG1heChGMjAxM1gxJHRheGNvcnApLA0KICAgICAgDQogICAgICBtZWFuKEYyMDEzWDEkdWQpLCBzZChGMjAxM1gxJHVkKSxtaW4oRjIwMTNYMSR1ZCksbWF4KEYyMDEzWDEkdWQpLA0KICAgICAgDQogICAgICBtZWFuKEYyMDEzWDEkcHNsbSksc2QoRjIwMTNYMSRwc2xtKSxtaW4oRjIwMTNYMSRwc2xtKSxtYXgoRjIwMTNYMSRwc2xtKSwNCiAgICAgIA0KICAgICAgcm91bmQobWVhbihGMjAxM1gxJGVwbCksMCksIHNkKEYyMDEzWDEkZXBsKSwgcm91bmQobWluKEYyMDEzWDEkZXBsKSwwKSxyb3VuZChtYXgoRjIwMTNYMSRlcGwpLDApLA0KICAgICAgDQogICAgICByb3VuZChtZWFuKEYyMDEzWDEkd3NjKSwwKSwgc2QoRjIwMTNYMSR3c2MpLCByb3VuZChtaW4oRjIwMTNYMSR3c2MpLDApLHJvdW5kKG1heChGMjAxM1gxJHdzYyksMCksDQogICAgICANCiAgICAgIG1lYW4oRjIwMTNYMSRjYmMpLCBzZChGMjAxM1gxJGNiYyksbWluKEYyMDEzWDEkY2JjKSxtYXgoRjIwMTNYMSRjYmMpLA0KICAgICAgDQogICAgICBtZWFuKEYyMDEzWDEkYnJyMXkpLCBzZChGMjAxM1gxJGJycjF5KSwgbWluKEYyMDEzWDEkYnJyMXkpLG1heChGMjAxM1gxJGJycjF5KSwNCiAgICAgIA0KICAgICAgbWVhbihGMjAxM1gxJHR0ciksIHNkKEYyMDEzWDEkdHRyKSxtaW4oRjIwMTNYMSR0dHIpLG1heChGMjAxM1gxJHR0ciksDQogICAgICANCiAgICAgIG1lYW4oRjIwMTNYMSRpbmZfZ2RwZCksc2QoRjIwMTNYMSRpbmZfZ2RwZCksbWluKEYyMDEzWDEkaW5mX2dkcGQpLG1heChGMjAxM1gxJGluZl9nZHBkKQ0KICAgICksIDIpLA0KICBuY29sID0gNCwgYnlyb3cgPSBUKQ0KDQpjb2xuYW1lcyhEZXNjcmlwdGl2ZTIwMTMpIDwtIGMoIk1lYW4iLCAiU0QiLCJNaW4iLCJNYXgiKQ0Kcm93bmFtZXMoRGVzY3JpcHRpdmUyMDEzKSA8LSBjKCJVUiIsIlRBWENPUlAiLCJVRCIsIlBTTE0iLCJFUEwiLCJXU0MiLCJDQkMiLCJCUlIxWSIsIlRUUiIsIkRlbHRhX2kiKQ0KDQprYmwoRGVzY3JpcHRpdmUyMDEzLCBjYXB0aW9uID0gIlRhYmxlIDIuMTM6IEFubnVhbCBWYXJpYWJsZSBTdW1tYXJ5IFN0YXRpc3RpY3MgLSAyMDEzIikgJT4lIA0KICBrYWJsZV9zdHlsaW5nKGJvb3RzdHJhcF9vcHRpb25zID0gYygic3RyaXBlZCIsICJob3ZlciIsImNvbmRlbnNlZCIpKSAlPiUgDQogIGNvbHVtbl9zcGVjKDEsIGJvbGQgPSBUKQ0KIzIwMTQNCkRlc2NyaXB0aXZlMjAxNCA8LSBtYXRyaXgoIA0KICByb3VuZCgNCiAgICBjKA0KICAgICAgbWVhbihGMjAxNFgxJGh1ciksc2QoRjIwMTRYMSRodXIpLG1pbihGMjAxNFgxJGh1ciksbWF4KEYyMDE0WDEkaHVyKSwNCiAgICAgIA0KICAgICAgbWVhbihGMjAxNFgxJHRheGNvcnApLCAgc2QoRjIwMTRYMSR0YXhjb3JwKSwgbWluKEYyMDE0WDEkdGF4Y29ycCksbWF4KEYyMDE0WDEkdGF4Y29ycCksDQogICAgICANCiAgICAgIG1lYW4oRjIwMTRYMSR1ZCksIHNkKEYyMDE0WDEkdWQpLG1pbihGMjAxNFgxJHVkKSxtYXgoRjIwMTRYMSR1ZCksDQogICAgICANCiAgICAgIG1lYW4oRjIwMTRYMSRwc2xtKSxzZChGMjAxNFgxJHBzbG0pLG1pbihGMjAxNFgxJHBzbG0pLG1heChGMjAxNFgxJHBzbG0pLA0KICAgICAgDQogICAgICByb3VuZChtZWFuKEYyMDE0WDEkZXBsKSwwKSwgc2QoRjIwMTRYMSRlcGwpLCByb3VuZChtaW4oRjIwMTRYMSRlcGwpLDApLHJvdW5kKG1heChGMjAxNFgxJGVwbCksMCksDQogICAgICANCiAgICAgIHJvdW5kKG1lYW4oRjIwMTRYMSR3c2MpLDApLCBzZChGMjAxNFgxJHdzYyksIHJvdW5kKG1pbihGMjAxNFgxJHdzYyksMCkscm91bmQobWF4KEYyMDE0WDEkd3NjKSwwKSwNCiAgICAgIA0KICAgICAgbWVhbihGMjAxNFgxJGNiYyksIHNkKEYyMDE0WDEkY2JjKSxtaW4oRjIwMTRYMSRjYmMpLG1heChGMjAxNFgxJGNiYyksDQogICAgICANCiAgICAgIG1lYW4oRjIwMTRYMSRicnIxeSksIHNkKEYyMDE0WDEkYnJyMXkpLCBtaW4oRjIwMTRYMSRicnIxeSksbWF4KEYyMDE0WDEkYnJyMXkpLA0KICAgICAgDQogICAgICBtZWFuKEYyMDE0WDEkdHRyKSwgc2QoRjIwMTRYMSR0dHIpLG1pbihGMjAxNFgxJHR0ciksbWF4KEYyMDE0WDEkdHRyKSwNCiAgICAgIA0KICAgICAgbWVhbihGMjAxNFgxJGluZl9nZHBkKSxzZChGMjAxNFgxJGluZl9nZHBkKSxtaW4oRjIwMTRYMSRpbmZfZ2RwZCksbWF4KEYyMDE0WDEkaW5mX2dkcGQpDQogICAgKSwgMiksDQogIG5jb2wgPSA0LCBieXJvdyA9IFQpDQoNCmNvbG5hbWVzKERlc2NyaXB0aXZlMjAxNCkgPC0gYygiTWVhbiIsICJTRCIsIk1pbiIsIk1heCIpDQpyb3duYW1lcyhEZXNjcmlwdGl2ZTIwMTQpIDwtIGMoIlVSIiwiVEFYQ09SUCIsIlVEIiwiUFNMTSIsIkVQTCIsIldTQyIsIkNCQyIsIkJSUjFZIiwiVFRSIiwiRGVsdGFfaSIpDQoNCmtibChEZXNjcmlwdGl2ZTIwMTQsIGNhcHRpb24gPSAiVGFibGUgMi4xNDogQW5udWFsIFZhcmlhYmxlIFN1bW1hcnkgU3RhdGlzdGljcyAtIDIwMTQiKSAlPiUgDQogIGthYmxlX3N0eWxpbmcoYm9vdHN0cmFwX29wdGlvbnMgPSBjKCJzdHJpcGVkIiwgImhvdmVyIiwiY29uZGVuc2VkIikpICU+JSANCiAgY29sdW1uX3NwZWMoMSwgYm9sZCA9IFQpDQoNCiMyMDE1DQpEZXNjcmlwdGl2ZTIwMTUgPC0gbWF0cml4KCANCiAgcm91bmQoDQogICAgYygNCiAgICAgIG1lYW4oRjIwMTVYMSRodXIpLHNkKEYyMDE1WDEkaHVyKSxtaW4oRjIwMTVYMSRodXIpLG1heChGMjAxNVgxJGh1ciksDQogICAgICANCiAgICAgIG1lYW4oRjIwMTVYMSR0YXhjb3JwKSwgIHNkKEYyMDE1WDEkdGF4Y29ycCksIG1pbihGMjAxNVgxJHRheGNvcnApLG1heChGMjAxNVgxJHRheGNvcnApLA0KICAgICAgDQogICAgICBtZWFuKEYyMDE1WDEkdWQpLCBzZChGMjAxNVgxJHVkKSxtaW4oRjIwMTVYMSR1ZCksbWF4KEYyMDE1WDEkdWQpLA0KICAgICAgDQogICAgICBtZWFuKEYyMDE1WDEkcHNsbSksc2QoRjIwMTVYMSRwc2xtKSxtaW4oRjIwMTVYMSRwc2xtKSxtYXgoRjIwMTVYMSRwc2xtKSwNCiAgICAgIA0KICAgICAgcm91bmQobWVhbihGMjAxNVgxJGVwbCksMCksIHNkKEYyMDE1WDEkZXBsKSwgcm91bmQobWluKEYyMDE1WDEkZXBsKSwwKSxyb3VuZChtYXgoRjIwMTVYMSRlcGwpLDApLA0KICAgICAgDQogICAgICByb3VuZChtZWFuKEYyMDE1WDEkd3NjKSwwKSwgc2QoRjIwMTVYMSR3c2MpLCByb3VuZChtaW4oRjIwMTVYMSR3c2MpLDApLHJvdW5kKG1heChGMjAxNVgxJHdzYyksMCksDQogICAgICANCiAgICAgIG1lYW4oRjIwMTVYMSRjYmMpLCBzZChGMjAxNVgxJGNiYyksbWluKEYyMDE1WDEkY2JjKSxtYXgoRjIwMTVYMSRjYmMpLA0KICAgICAgDQogICAgICBtZWFuKEYyMDE1WDEkYnJyMXkpLCBzZChGMjAxNVgxJGJycjF5KSwgbWluKEYyMDE1WDEkYnJyMXkpLG1heChGMjAxNVgxJGJycjF5KSwNCiAgICAgIA0KICAgICAgbWVhbihGMjAxNVgxJHR0ciksIHNkKEYyMDE1WDEkdHRyKSxtaW4oRjIwMTVYMSR0dHIpLG1heChGMjAxNVgxJHR0ciksDQogICAgICANCiAgICAgIG1lYW4oRjIwMTVYMSRpbmZfZ2RwZCksc2QoRjIwMTVYMSRpbmZfZ2RwZCksbWluKEYyMDE1WDEkaW5mX2dkcGQpLG1heChGMjAxNVgxJGluZl9nZHBkKQ0KICAgICksIDIpLA0KICBuY29sID0gNCwgYnlyb3cgPSBUKQ0KDQpjb2xuYW1lcyhEZXNjcmlwdGl2ZTIwMTUpIDwtIGMoIk1lYW4iLCAiU0QiLCJNaW4iLCJNYXgiKQ0Kcm93bmFtZXMoRGVzY3JpcHRpdmUyMDE1KSA8LSBjKCJVUiIsIlRBWENPUlAiLCJVRCIsIlBTTE0iLCJFUEwiLCJXU0MiLCJDQkMiLCJCUlIxWSIsIlRUUiIsIkRlbHRhX2kiKQ0KDQprYmwoRGVzY3JpcHRpdmUyMDE1LCBjYXB0aW9uID0gIlRhYmxlIDIuMTU6IEFubnVhbCBWYXJpYWJsZSBTdW1tYXJ5IFN0YXRpc3RpY3MgLSAyMDE1IikgJT4lIA0KICBrYWJsZV9zdHlsaW5nKGJvb3RzdHJhcF9vcHRpb25zID0gYygic3RyaXBlZCIsICJob3ZlciIsImNvbmRlbnNlZCIpKSAlPiUgDQogIGNvbHVtbl9zcGVjKDEsIGJvbGQgPSBUKQ0KDQojMjAxNg0KRGVzY3JpcHRpdmUyMDE2IDwtIG1hdHJpeCggDQogIHJvdW5kKA0KICAgIGMoDQogICAgICBtZWFuKEYyMDE2WDEkaHVyKSxzZChGMjAxNlgxJGh1ciksbWluKEYyMDE2WDEkaHVyKSxtYXgoRjIwMTZYMSRodXIpLA0KICAgICAgDQogICAgICBtZWFuKEYyMDE2WDEkdGF4Y29ycCksICBzZChGMjAxNlgxJHRheGNvcnApLCBtaW4oRjIwMTZYMSR0YXhjb3JwKSxtYXgoRjIwMTZYMSR0YXhjb3JwKSwNCiAgICAgIA0KICAgICAgbWVhbihGMjAxNlgxJHVkKSwgc2QoRjIwMTZYMSR1ZCksbWluKEYyMDE2WDEkdWQpLG1heChGMjAxNlgxJHVkKSwNCiAgICAgIA0KICAgICAgbWVhbihGMjAxNlgxJHBzbG0pLHNkKEYyMDE2WDEkcHNsbSksbWluKEYyMDE2WDEkcHNsbSksbWF4KEYyMDE2WDEkcHNsbSksDQogICAgICANCiAgICAgIHJvdW5kKG1lYW4oRjIwMTZYMSRlcGwpLDApLCBzZChGMjAxNlgxJGVwbCksIHJvdW5kKG1pbihGMjAxNlgxJGVwbCksMCkscm91bmQobWF4KEYyMDE2WDEkZXBsKSwwKSwNCiAgICAgIA0KICAgICAgcm91bmQobWVhbihGMjAxNlgxJHdzYyksMCksIHNkKEYyMDE2WDEkd3NjKSwgcm91bmQobWluKEYyMDE2WDEkd3NjKSwwKSxyb3VuZChtYXgoRjIwMTZYMSR3c2MpLDApLA0KICAgICAgDQogICAgICBtZWFuKEYyMDE2WDEkY2JjKSwgc2QoRjIwMTZYMSRjYmMpLG1pbihGMjAxNlgxJGNiYyksbWF4KEYyMDE2WDEkY2JjKSwNCiAgICAgIA0KICAgICAgbWVhbihGMjAxNlgxJGJycjF5KSwgc2QoRjIwMTZYMSRicnIxeSksIG1pbihGMjAxNlgxJGJycjF5KSxtYXgoRjIwMTZYMSRicnIxeSksDQogICAgICANCiAgICAgIG1lYW4oRjIwMTZYMSR0dHIpLCBzZChGMjAxNlgxJHR0ciksbWluKEYyMDE2WDEkdHRyKSxtYXgoRjIwMTZYMSR0dHIpLA0KICAgICAgDQogICAgICBtZWFuKEYyMDE2WDEkaW5mX2dkcGQpLHNkKEYyMDE2WDEkaW5mX2dkcGQpLG1pbihGMjAxNlgxJGluZl9nZHBkKSxtYXgoRjIwMTZYMSRpbmZfZ2RwZCkNCiAgICApLCAyKSwNCiAgbmNvbCA9IDQsIGJ5cm93ID0gVCkNCg0KY29sbmFtZXMoRGVzY3JpcHRpdmUyMDE2KSA8LSBjKCJNZWFuIiwgIlNEIiwiTWluIiwiTWF4IikNCnJvd25hbWVzKERlc2NyaXB0aXZlMjAxNikgPC0gYygiVVIiLCJUQVhDT1JQIiwiVUQiLCJQU0xNIiwiRVBMIiwiV1NDIiwiQ0JDIiwiQlJSMVkiLCJUVFIiLCJEZWx0YV9pIikNCg0Ka2JsKERlc2NyaXB0aXZlMjAxNiwgY2FwdGlvbiA9ICJUYWJsZSAyLjE2OiBBbm51YWwgVmFyaWFibGUgU3VtbWFyeSBTdGF0aXN0aWNzIC0gMjAxNiIpICU+JSANCiAga2FibGVfc3R5bGluZyhib290c3RyYXBfb3B0aW9ucyA9IGMoInN0cmlwZWQiLCAiaG92ZXIiLCJjb25kZW5zZWQiKSkgJT4lIA0KICBjb2x1bW5fc3BlYygxLCBib2xkID0gVCkNCg0KIzIwMTcNCkRlc2NyaXB0aXZlMjAxNyA8LSBtYXRyaXgoIA0KICByb3VuZCgNCiAgICBjKA0KICAgICAgbWVhbihGMjAxN1gxJGh1ciksc2QoRjIwMTdYMSRodXIpLG1pbihGMjAxN1gxJGh1ciksbWF4KEYyMDE3WDEkaHVyKSwNCiAgICAgIA0KICAgICAgbWVhbihGMjAxN1gxJHRheGNvcnApLCAgc2QoRjIwMTdYMSR0YXhjb3JwKSwgbWluKEYyMDE3WDEkdGF4Y29ycCksbWF4KEYyMDE3WDEkdGF4Y29ycCksDQogICAgICANCiAgICAgIG1lYW4oRjIwMTdYMSR1ZCksIHNkKEYyMDE3WDEkdWQpLG1pbihGMjAxN1gxJHVkKSxtYXgoRjIwMTdYMSR1ZCksDQogICAgICANCiAgICAgIG1lYW4oRjIwMTdYMSRwc2xtKSxzZChGMjAxN1gxJHBzbG0pLG1pbihGMjAxN1gxJHBzbG0pLG1heChGMjAxN1gxJHBzbG0pLA0KICAgICAgDQogICAgICByb3VuZChtZWFuKEYyMDE3WDEkZXBsKSwwKSwgc2QoRjIwMTdYMSRlcGwpLCByb3VuZChtaW4oRjIwMTdYMSRlcGwpLDApLHJvdW5kKG1heChGMjAxN1gxJGVwbCksMCksDQogICAgICANCiAgICAgIHJvdW5kKG1lYW4oRjIwMTdYMSR3c2MpLDApLCBzZChGMjAxN1gxJHdzYyksIHJvdW5kKG1pbihGMjAxN1gxJHdzYyksMCkscm91bmQobWF4KEYyMDE3WDEkd3NjKSwwKSwNCiAgICAgIA0KICAgICAgbWVhbihGMjAxN1gxJGNiYyksIHNkKEYyMDE3WDEkY2JjKSxtaW4oRjIwMTdYMSRjYmMpLG1heChGMjAxN1gxJGNiYyksDQogICAgICANCiAgICAgIG1lYW4oRjIwMTdYMSRicnIxeSksIHNkKEYyMDE3WDEkYnJyMXkpLCBtaW4oRjIwMTdYMSRicnIxeSksbWF4KEYyMDE3WDEkYnJyMXkpLA0KICAgICAgDQogICAgICBtZWFuKEYyMDE3WDEkdHRyKSwgc2QoRjIwMTdYMSR0dHIpLG1pbihGMjAxN1gxJHR0ciksbWF4KEYyMDE3WDEkdHRyKSwNCiAgICAgIA0KICAgICAgbWVhbihGMjAxN1gxJGluZl9nZHBkKSxzZChGMjAxN1gxJGluZl9nZHBkKSxtaW4oRjIwMTdYMSRpbmZfZ2RwZCksbWF4KEYyMDE3WDEkaW5mX2dkcGQpDQogICAgKSwgMiksDQogIG5jb2wgPSA0LCBieXJvdyA9IFQpDQoNCmNvbG5hbWVzKERlc2NyaXB0aXZlMjAxNykgPC0gYygiTWVhbiIsICJTRCIsIk1pbiIsIk1heCIpDQpyb3duYW1lcyhEZXNjcmlwdGl2ZTIwMTcpIDwtIGMoIlVSIiwiVEFYQ09SUCIsIlVEIiwiUFNMTSIsIkVQTCIsIldTQyIsIkNCQyIsIkJSUjFZIiwiVFRSIiwiRGVsdGFfaSIpDQoNCmtibChEZXNjcmlwdGl2ZTIwMTcsIGNhcHRpb24gPSAiVGFibGUgMi4xNzogQW5udWFsIFZhcmlhYmxlIFN1bW1hcnkgU3RhdGlzdGljcyAtIDIwMTciKSAlPiUgDQogIGthYmxlX3N0eWxpbmcoYm9vdHN0cmFwX29wdGlvbnMgPSBjKCJzdHJpcGVkIiwgImhvdmVyIiwiY29uZGVuc2VkIikpICU+JSANCiAgY29sdW1uX3NwZWMoMSwgYm9sZCA9IFQpDQoNCiMyMDE4DQpEZXNjcmlwdGl2ZTIwMTggPC0gbWF0cml4KCANCiAgcm91bmQoDQogICAgYygNCiAgICAgIG1lYW4oRjIwMThYMSRodXIpLHNkKEYyMDE4WDEkaHVyKSxtaW4oRjIwMThYMSRodXIpLG1heChGMjAxOFgxJGh1ciksDQogICAgICANCiAgICAgIG1lYW4oRjIwMThYMSR0YXhjb3JwKSwgIHNkKEYyMDE4WDEkdGF4Y29ycCksIG1pbihGMjAxOFgxJHRheGNvcnApLG1heChGMjAxOFgxJHRheGNvcnApLA0KICAgICAgDQogICAgICBtZWFuKEYyMDE4WDEkdWQpLCBzZChGMjAxOFgxJHVkKSxtaW4oRjIwMThYMSR1ZCksbWF4KEYyMDE4WDEkdWQpLA0KICAgICAgDQogICAgICBtZWFuKEYyMDE4WDEkcHNsbSksc2QoRjIwMThYMSRwc2xtKSxtaW4oRjIwMThYMSRwc2xtKSxtYXgoRjIwMThYMSRwc2xtKSwNCiAgICAgIA0KICAgICAgcm91bmQobWVhbihGMjAxOFgxJGVwbCksMCksIHNkKEYyMDE4WDEkZXBsKSwgcm91bmQobWluKEYyMDE4WDEkZXBsKSwwKSxyb3VuZChtYXgoRjIwMThYMSRlcGwpLDApLA0KICAgICAgDQogICAgICByb3VuZChtZWFuKEYyMDE4WDEkd3NjKSwwKSwgc2QoRjIwMThYMSR3c2MpLCByb3VuZChtaW4oRjIwMThYMSR3c2MpLDApLHJvdW5kKG1heChGMjAxOFgxJHdzYyksMCksDQogICAgICANCiAgICAgIG1lYW4oRjIwMThYMSRjYmMpLCBzZChGMjAxOFgxJGNiYyksbWluKEYyMDE4WDEkY2JjKSxtYXgoRjIwMThYMSRjYmMpLA0KICAgICAgDQogICAgICBtZWFuKEYyMDE4WDEkYnJyMXkpLCBzZChGMjAxOFgxJGJycjF5KSwgbWluKEYyMDE4WDEkYnJyMXkpLG1heChGMjAxOFgxJGJycjF5KSwNCiAgICAgIA0KICAgICAgbWVhbihGMjAxOFgxJHR0ciksIHNkKEYyMDE4WDEkdHRyKSxtaW4oRjIwMThYMSR0dHIpLG1heChGMjAxOFgxJHR0ciksDQogICAgICANCiAgICAgIG1lYW4oRjIwMThYMSRpbmZfZ2RwZCksc2QoRjIwMThYMSRpbmZfZ2RwZCksbWluKEYyMDE4WDEkaW5mX2dkcGQpLG1heChGMjAxOFgxJGluZl9nZHBkKQ0KICAgICksIDIpLA0KICBuY29sID0gNCwgYnlyb3cgPSBUKQ0KDQpjb2xuYW1lcyhEZXNjcmlwdGl2ZTIwMTgpIDwtIGMoIk1lYW4iLCAiU0QiLCJNaW4iLCJNYXgiKQ0Kcm93bmFtZXMoRGVzY3JpcHRpdmUyMDE4KSA8LSBjKCJVUiIsIlRBWENPUlAiLCJVRCIsIlBTTE0iLCJFUEwiLCJXU0MiLCJDQkMiLCJCUlIxWSIsIlRUUiIsIkRlbHRhX2kiKQ0KDQprYmwoRGVzY3JpcHRpdmUyMDE4LCBjYXB0aW9uID0gIlRhYmxlIDIuMTg6IEFubnVhbCBWYXJpYWJsZSBTdW1tYXJ5IFN0YXRpc3RpY3MgLSAyMDE4IikgJT4lIA0KICBrYWJsZV9zdHlsaW5nKGJvb3RzdHJhcF9vcHRpb25zID0gYygic3RyaXBlZCIsICJob3ZlciIsImNvbmRlbnNlZCIpKSAlPiUgDQogIGNvbHVtbl9zcGVjKDEsIGJvbGQgPSBUKQ0KDQojMjAxOQ0KRGVzY3JpcHRpdmUyMDE5IDwtIG1hdHJpeCggDQogIHJvdW5kKA0KICAgIGMoDQogICAgICBtZWFuKEYyMDE5WDEkaHVyKSxzZChGMjAxOVgxJGh1ciksbWluKEYyMDE5WDEkaHVyKSxtYXgoRjIwMTlYMSRodXIpLA0KICAgICAgDQogICAgICBtZWFuKEYyMDE5WDEkdGF4Y29ycCksICBzZChGMjAxOVgxJHRheGNvcnApLCBtaW4oRjIwMTlYMSR0YXhjb3JwKSxtYXgoRjIwMTlYMSR0YXhjb3JwKSwNCiAgICAgIA0KICAgICAgbWVhbihGMjAxOVgxJHVkKSwgc2QoRjIwMTlYMSR1ZCksbWluKEYyMDE5WDEkdWQpLG1heChGMjAxOVgxJHVkKSwNCiAgICAgIA0KICAgICAgbWVhbihGMjAxOVgxJHBzbG0pLHNkKEYyMDE5WDEkcHNsbSksbWluKEYyMDE5WDEkcHNsbSksbWF4KEYyMDE5WDEkcHNsbSksDQogICAgICANCiAgICAgIHJvdW5kKG1lYW4oRjIwMTlYMSRlcGwpLDApLCBzZChGMjAxOVgxJGVwbCksIHJvdW5kKG1pbihGMjAxOVgxJGVwbCksMCkscm91bmQobWF4KEYyMDE5WDEkZXBsKSwwKSwNCiAgICAgIA0KICAgICAgcm91bmQobWVhbihGMjAxOVgxJHdzYyksMCksIHNkKEYyMDE5WDEkd3NjKSwgcm91bmQobWluKEYyMDE5WDEkd3NjKSwwKSxyb3VuZChtYXgoRjIwMTlYMSR3c2MpLDApLA0KICAgICAgDQogICAgICBtZWFuKEYyMDE5WDEkY2JjKSwgc2QoRjIwMTlYMSRjYmMpLG1pbihGMjAxOVgxJGNiYyksbWF4KEYyMDE5WDEkY2JjKSwNCiAgICAgIA0KICAgICAgbWVhbihGMjAxOVgxJGJycjF5KSwgc2QoRjIwMTlYMSRicnIxeSksIG1pbihGMjAxOVgxJGJycjF5KSxtYXgoRjIwMTlYMSRicnIxeSksDQogICAgICANCiAgICAgIG1lYW4oRjIwMTlYMSR0dHIpLCBzZChGMjAxOVgxJHR0ciksbWluKEYyMDE5WDEkdHRyKSxtYXgoRjIwMTlYMSR0dHIpLA0KICAgICAgDQogICAgICBtZWFuKEYyMDE5WDEkaW5mX2dkcGQpLHNkKEYyMDE5WDEkaW5mX2dkcGQpLG1pbihGMjAxOVgxJGluZl9nZHBkKSxtYXgoRjIwMTlYMSRpbmZfZ2RwZCkNCiAgICApLCAyKSwNCiAgbmNvbCA9IDQsIGJ5cm93ID0gVCkNCg0KY29sbmFtZXMoRGVzY3JpcHRpdmUyMDE5KSA8LSBjKCJNZWFuIiwgIlNEIiwiTWluIiwiTWF4IikNCnJvd25hbWVzKERlc2NyaXB0aXZlMjAxOSkgPC0gYygiVVIiLCJUQVhDT1JQIiwiVUQiLCJQU0xNIiwiRVBMIiwiV1NDIiwiQ0JDIiwiQlJSMVkiLCJUVFIiLCJEZWx0YV9pIikNCg0Ka2JsKERlc2NyaXB0aXZlMjAxOSwgY2FwdGlvbiA9ICJUYWJsZSAyLjE5OiBBbm51YWwgVmFyaWFibGUgU3VtbWFyeSBTdGF0aXN0aWNzIC0gMjAxOSIpICU+JSANCiAga2FibGVfc3R5bGluZyhib290c3RyYXBfb3B0aW9ucyA9IGMoInN0cmlwZWQiLCAiaG92ZXIiLCJjb25kZW5zZWQiKSkgJT4lIA0KICBjb2x1bW5fc3BlYygxLCBib2xkID0gVCkNCmBgYA0KDQoNCldlIHdpbGwgbm93IGNyZWF0ZSBkYXRhIHZpc3VhbGl6YXRpb25zIHRvIGluZm9ybSBvdXIgZXhwZWN0ZWQgc3BlY2lmaWNhdGlvbi4gSGV4IGNvZGVzIGJlbG93IGZvciBjb3B5cGFzdGEuDQpgYGB7ciBDb2xvciBUYWJsZSwgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZ3M9RkFMU0UsIHJlc3VsdHM9J2FzaXMnfQ0KQ29sVGFibGUgPC0gIg0KQ29sb3IgICAgIHwgSEVYICAgICB8IENvbXBsaW1lbnQgfA0KLS0tLS0tLS0tLXw6LS0tLS0tLTp8LS0tLS0tLS0tLS06fA0KQmx1ZSAgICAgIHwgIzMyMEVGMSB8ICNDREYxMEUgICAgfA0KUmVkICAgICAgIHwgI0YxMEU1QiB8ICMwRUYxQTQgICAgfA0KTHQuIEdyZWVuIHwgI0NERjEwRSB8ICMzMjBFRjEgICAgfA0KR3JlZW4gICAgIHwgIzBFRjFBNCB8ICNGMTBFNUIgICAgfA0KDQoiDQpjYXQoQ29sVGFibGUpICMgb3V0cHV0IHRoZSB0YWJsZSBpbiBhIGZvcm1hdCBnb29kIGZvciBIVE1ML1BERi9kb2N4IGNvbnZlcnNpb24NCmBgYA0KYGBge3IgRmlndXJlIDF9DQojIG92ZXJhbGwgaHVyIHZzIHRheGNvcnAsIGF2ZXJhZ2VzDQpUcmVuZDEgPC0gcmVhZC5jc3YoIlgxLmNzdiIpICU+JSANCiAgY2xlYW5fbmFtZXMoKQ0KVHJlbmQxIDwtIFRyZW5kMSAlPiUgc2VsZWN0KGlfdGltZTEsIGxvY2F0aW9uMSwgaHVyLCB0YXhjb3JwKSAlPiUgDQogIGdyb3VwX2J5KGlfdGltZTEpICU+JSANCiAgZHJvcF9uYSgpICU+JSANCiAgc3VtbWFyaXplKG1lYW5fdXI9bWVhbihodXIpLCBtZWFuX3RheGNvcnAgPSBtZWFuKHRheGNvcnApKQ0KI1ZpZXcoVHJlbmQxKQ0KY29sb3JzIDwtIGMoIlVuZW1wbG95bWVudCBSYXRlIiA9ICIjRjEwRTVCIiwgIkNvcnBvcmF0ZSBUYXggUmV2ZW51ZSIgPSAiIzBFRjFBNCIpDQpnZ3Bsb3QoVHJlbmQxLCBhZXMoeD1pX3RpbWUxKSkrDQogIGdlb21fbGluZShhZXMoeT1tZWFuX3VyLGNvbG9yID0gIlVuZW1wbG95bWVudCBSYXRlIikpKw0KICBnZW9tX2xpbmUoYWVzKHk9bWVhbl90YXhjb3JwLGNvbG9yID0iQ29ycG9yYXRlIFRheCBSZXZlbnVlIikpKw0KICBsYWJzKHg9IlllYXIiLCB5PSJNZWFuICUiLCBjb2xvciA9ICJMZWdlbmQiLA0KICAgICAgIHRpdGxlID0gIkZpZ3VyZSAxOiBNZWFucyBieSBZZWFyLCBPdmVyYWxsIiwNCiAgICAgICBzdWJ0aXRsZSA9ICIzMiBPRUNEIENvdW50cmllcyBmcm9tIDIwMDEtMjAxOSBOPTM1NyIsIGNhcHRpb24gPSAiQ2hhcnQgYnkgSm9zaWFoIE5lbHNvbiwgRGF0YTogT0VDRCAyMDIyYSwgT0VDRCAyMDIyYiIpKw0KICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gY29sb3JzKSsNCiAgeWxpbSgwLDEwKQ0KYGBgDQpgYGB7cn0NCiMjIyBmYWNldGVkIHBsb3RzIGZvciBhc3NpZ25tZW50DQojaHVyIHZzIHRheGNvcnAgYnkgeWVhcg0KZ2dwbG90KGRhdGE9WDEpKw0KICBnZW9tX3BvaW50KG1hcHBpbmc9YWVzKHg9dGF4Y29ycCx5PWh1ciksIGNvbG9yID0gIiNDREYxMEUiICkgKyBnZW9tX3Ntb290aChtYXBwaW5nPWFlcyh4PXRheGNvcnAseT1odXIpLCBtZXRob2QgPSBsbSwgc2U9RiwgY29sb3IgPSAiIzMyMEVGMSIpKw0KICBmYWNldF93cmFwKH5pX3RpbWUxKSArIGxhYnMoeCA9ICJUQVhDT1JQIiwgeT0iVVIiLCB0aXRsZSA9ICJGaWd1cmUgMS4xOiBVbmVtcGxveW1lbnQgUmF0ZSB2cyBDb3Jwb3JhdGUgVGF4IFJldmVudWUsIEJ5IFllYXIiKQ0KYGBgDQpgYGB7ciBGaWd1cmUgMS5YWH0NCiNodXIgdnMgdWQNCmdncGxvdChkYXRhPVgxKSsNCiAgZ2VvbV9wb2ludChtYXBwaW5nPWFlcyh4PXVkLHk9aHVyLCBjb2xvciA9ICIjMzIwRUYxIikpKyBnZW9tX3Ntb290aChtYXBwaW5nPWFlcyh4PXVkLHk9aHVyKSwgbWV0aG9kID0gbG0sIHNlPUYsIGNvbG9yID0gIiNDREYxMEUiKSsNCiAgZmFjZXRfd3JhcCh+aV90aW1lMSkrIGxhYnMoeCA9ICJVRCIsIHk9IlVSIiwgdGl0bGUgPSAiRmlndXJlIDEuMjogVW5lbXBsb3ltZW50IFJhdGUgdnMgVW5pb24gRGVuc2l0eSIpDQojaHVyIHZzIHBzbG0NCmdncGxvdChkYXRhPVgxKSsNCiAgZ2VvbV9wb2ludChtYXBwaW5nPWFlcyh4PXBzbG0seT1odXIpLCBjb2xvciA9ICIjMzIwRUYxIikrZ2VvbV9zbW9vdGgobWFwcGluZz1hZXMoeD1wc2xtLHk9aHVyKSwgbWV0aG9kID0gbG0sIHNlPUYsIGNvbG9yID0gIiNDREYxMEUiKSsNCiAgZmFjZXRfd3JhcCh+aV90aW1lMSkrIGxhYnMoeCA9ICJQU0xNIiwgeT0iVVIiLCB0aXRsZSA9ICJGaWd1cmUgMS4zOiBVbmVtcGxveW1lbnQgUmF0ZSB2cyBQdWJsaWMgU3BlbmRpbmcgb24gTGFib3IgTWFya2V0cyIpDQojaHVyIHZzIGVwbA0KZ2dwbG90KGRhdGE9WDEpKw0KICBnZW9tX3BvaW50KG1hcHBpbmc9YWVzKHg9ZXBsLHk9aHVyKSwgY29sb3IgPSAiIzMyMEVGMSIpK2dlb21fc21vb3RoKG1hcHBpbmc9YWVzKHg9ZXBsLHk9aHVyKSwgbWV0aG9kID0gbG0sIHNlPUYsIGNvbG9yID0gIiNDREYxMEUiKSsNCiAgZmFjZXRfd3JhcCh+aV90aW1lMSkrIGxhYnMoeCA9ICJFUEwiLCB5PSJVUiIsIHRpdGxlID0gIkZpZ3VyZSAxLjQ6IFVuZW1wbG95bWVudCBSYXRlIHZzIEVtcGxveW1lbnQgUHJvdGVjdGlvbiBMZWdpc2xhdGlvbiIpDQojaHVyIHZzIHdzYw0KZ2dwbG90KGRhdGE9WDEpKw0KICBnZW9tX3BvaW50KG1hcHBpbmc9YWVzKHg9d3NjLHk9aHVyKSwgY29sb3IgPSAiIzMyMEVGMSIpK2dlb21fc21vb3RoKG1hcHBpbmc9YWVzKHg9d3NjLHk9aHVyKSwgbWV0aG9kID0gbG0sIHNlPUYsIGNvbG9yID0gIiNDREYxMEUiKSsNCiAgZmFjZXRfd3JhcCh+aV90aW1lMSkrIGxhYnMoeCA9ICJXU0MiLCB5PSJVUiIsIHRpdGxlID0gIkZpZ3VyZSAxLjU6IFVuZW1wbG95bWVudCBSYXRlIHZzIFdhZ2UgU2V0dGluZyBDb29yZGluYXRpb24iKQ0KI2h1ciB2cyBjYmMNCmdncGxvdChkYXRhPVgxKSsNCiAgZ2VvbV9wb2ludChtYXBwaW5nPWFlcyh4PWNiYyx5PWh1ciksIGNvbG9yID0gIiMzMjBFRjEiKStnZW9tX3Ntb290aChtYXBwaW5nPWFlcyh4PWNiYyx5PWh1ciksIG1ldGhvZCA9IGxtLCBzZT1GLCBjb2xvciA9ICIjQ0RGMTBFIikrDQogIGZhY2V0X3dyYXAofmlfdGltZTEpKyBsYWJzKHggPSAiQ0JDIiwgeT0iVVIiLCB0aXRsZSA9ICJGaWd1cmUgMS42OiBVbmVtcGxveW1lbnQgUmF0ZSB2cyBDb2xsZWN0aXZlIEJhcmdhaW5pbmcgQ292ZXJhZ2UiKQ0KI2h1ciB2cyBicnINCmdncGxvdChkYXRhPVgxKSsNCiAgZ2VvbV9wb2ludChtYXBwaW5nPWFlcyh4PWJycjF5LHk9aHVyKSwgY29sb3IgPSAiIzMyMEVGMSIpK2dlb21fc21vb3RoKG1hcHBpbmc9YWVzKHg9YnJyMXkseT1odXIpLCBtZXRob2QgPSBsbSwgc2U9RiwgY29sb3IgPSAiI0NERjEwRSIpKw0KICBmYWNldF93cmFwKH5pX3RpbWUxKSsgbGFicyh4ID0gIkJSUiIsIHk9IlVSIiwgdGl0bGUgPSAiRmlndXJlIDEuNzogVW5lbXBsb3ltZW50IFJhdGUgdnMgQmVuZWZpdCBSZXBsYWNlbWVudCBSYXRlICgxeXIpIikNCiNodXIgdnMgdHRyDQpnZ3Bsb3QoZGF0YT1YMSkrDQogIGdlb21fcG9pbnQobWFwcGluZz1hZXMoeD10dHIseT1odXIpLCBjb2xvciA9ICIjMzIwRUYxIikrZ2VvbV9zbW9vdGgobWFwcGluZz1hZXMoeD10dHIseT1odXIpLCBtZXRob2QgPSBsbSwgc2U9RiwgY29sb3IgPSAiI0NERjEwRSIpKw0KICBmYWNldF93cmFwKH5pX3RpbWUxKSsgbGFicyh4ID0gIlRUUiIsIHk9IlVSIiwgdGl0bGUgPSAiRmlndXJlIDEuODogVW5lbXBsb3ltZW50IFJhdGUgdnMgVG90YWwgVGF4IFJhdGUiKQ0KI2h1ciB2cyBkZWx0YV9pDQpnZ3Bsb3QoZGF0YT1YMSkrDQogIGdlb21fcG9pbnQobWFwcGluZz1hZXMoeD1pbmZfZ2RwZCx5PWh1ciksIGNvbG9yID0gIiMzMjBFRjEiKStnZW9tX3Ntb290aChtYXBwaW5nPWFlcyh4PWluZl9nZHBkLHk9aHVyKSwgbWV0aG9kID0gbG0sIHNlPUYsIGNvbG9yID0gIiNDREYxMEUiKSsNCiAgZmFjZXRfd3JhcCh+aV90aW1lMSkrIGxhYnMoeCA9ICJkZWx0YV9pIiwgeT0iVVIiLCB0aXRsZSA9ICJVbmVtcGxveW1lbnQgUmF0ZSB2cyBDaGFuZ2UgaW4gSW5mbGF0aW9uIikNCiNodXIgdnMgbDFfZGVsdGFfaTsgbGFnIGZvciBzY2llbmNlDQpnZ3Bsb3QoZGF0YT1YMSkrDQogIGdlb21fcG9pbnQobWFwcGluZz1hZXMoeD1sMV9pbmZfZ2RwZCx5PWh1ciksIGNvbG9yID0gIiMzMjBFRjEiKStnZW9tX3Ntb290aChtYXBwaW5nPWFlcyh4PWwxX2luZl9nZHBkLHk9aHVyKSwgbWV0aG9kID0gbG0sIHNlPUYsIGNvbG9yID0gIiNDREYxMEUiKSsNCiAgZmFjZXRfd3JhcCh+aV90aW1lMSkrIGxhYnMoeCA9ICJkZWx0YV9pIiwgeT0iVVIiLCB0aXRsZSA9ICJVbmVtcGxveW1lbnQgUmF0ZSB2cyBDaGFuZ2UgaW4gSW5mbGF0aW9uLCB0LTEiKQ0KYGBgDQoNCiMjIyBJbmZvZ3JhcGhpY3MhDQpUcnkgdG8gbWFrZSBhIH5+aGVhdCBtYXAgaW4gZ2dwbG90fn4gY2hvcm9wbGV0aCBtYXAgb2YgYXZlcmFnZXMuIElmIGFsbCBlbHNlIGZhaWxzLCB0aGVyZSBpcyBhbHdheXMgZGF0YXdyYXBwZXIgJFxyaWdodGFycm93JCBbd29ybGQgbWFwXShodHRwczovL2RhdGF3cmFwcGVyLmR3Y2RuLm5ldC8yTGVoNS8xLykNCg0KIyMjIyBDb3JyZWxhdGlvbiBNYXRyaXg7IFZpc3VhbA0KYGBge3IgRmlndXJlIDJ9DQpDb3JEYXRhID0gc3Vic2V0KFgxLCBzZWxlY3QgPSAtYyhpX3RpbWUxLCBsb2NhdGlvbjEsIGwxX2luZl9nZHBkKSkNCmdnY29ycnBsb3QoY29yKENvckRhdGEpLCB0eXBlID0gInVwcGVyIiwgbWV0aG9kID0gYygiY2lyY2xlIiksDQogICAgICAgICAgIGNvbG9ycyA9IGMoIiMzMjBFRjEiLCAid2hpdGUiLCAiI0YxMEU1QiIpKSArIA0KICBsYWJzKHRpdGxlID0gIkZpZ3VyZSAyOiBDb3JyZWxhdGlvbiBNYXRyaXggSW5mb2dyYXBoaWMiKQ0KYGBgDQoNCiMjIFJlZ3Jlc3Npb24gQW5hbHlzaXMNCiogVHdvIFN0YWdlIGxlYXN0IHNxdWFyZXMgcmVncmVzc2lvbiBpcyBpbiB0aGUgKippdmVyZWcqKiBwYWNrYWdlLiBBbiBvdmVydmlldyBjYW4gYmUgZm91bmQgW2hlcmVdKGh0dHBzOi8vY3Jhbi5yLXByb2plY3Qub3JnL3dlYi9wYWNrYWdlcy9pdnJlZy92aWduZXR0ZXMvaXZyZWcuaHRtbCkuDQpgYGB7cn0NCnByaW50KCJDb21pbmcgU29vbiIpDQpgYGANCg0KDQojIyMgQ2xlYW4gRW52aXJvbm1lbnQNCmBgYHtyfQ0Kcm0obGlzdD1scygpKQ0KYGBgDQoNCg==