Data Manipulations

# Get county socio-economic variables from Area resource file 2019-2020
arf2020<-import("ahrf2020.sas7bdat") 
 arf2020<-arf2020%>%
   filter(f00011=="48") %>% 
  mutate(cofips=as.factor(f00004), 
         coname=f00010,
         state = f00011,
         medhouvl=f1461314,
         pctcrpop= round(100*(f1492010/f0453010),2),
         medhinc= f1434514,
         pctctyunemp=round(100*(f1451214/f1451014),2),
         ctypopdes= (f0453010/f1387410),  
         rucc= as.numeric(f0002013),
         pctperpov= f1332118,
         obgyn10_pc= 1000*(f1168410/ f0453010) )%>%
  dplyr::select(medhouvl, pctcrpop,medhinc, pctctyunemp,state, cofips, coname, ctypopdes, rucc, obgyn10_pc,pctperpov)%>%
    mutate(rurality= car::Recode(rucc, recodes ="1:3 ='Urban';4:9='Rural'"))%>%
 filter(complete.cases(.))
  
#load and calculate maternal mortality rates for counties in Texas for  a 5year period (2015-2019)
alldat<-readRDS("~/OneDrive - University of Texas at San Antonio/maternalmortality/aggregate/alldat.rds") %>% 
  filter(State=="TX")

countyMMR <-  alldat %>% 
  group_by(cofips)%>%
  summarise(nbir=sum(nbirths, na.rm = T), ndea = sum(ndeaths, na.rm = T))  %>% 
  mutate(mmrate =100000*(ndea/nbir))


#Merge the socioeconomic variables with Texas counties maternal mortality rates for a 5- years period(2015-2019)
Txmmr<- merge(countyMMR, arf2020, by= "cofips", all.x =TRUE, sort = FALSE) %>% 
  rename(GEOID=cofips) %>% 
  mutate(rmmrate=ifelse(mmrate>=1,mmrate,NA))
# Get Texas boundary data from tigris
txcounty<-counties(year=2018, state = "tx", refresh=T, cb = T, progress_bar=FALSE)

# Geo join the boundary data with Texas maternal mortality rate dataset to give it geometries for map making
Txmmrg<-geo_join(txcounty, Txmmr, by_sp="GEOID", by_df="GEOID",how="left" )

# Assign CRS  to the dataset for proper map projection,
Txcountymmr<- st_transform(Txmmrg, 3083)

# Make Texas county Maternal Mortality Rate Map
Texasmmr <- Txcountymmr%>%
  mutate(MMR_group = cut(rmmrate, breaks=quantile(rmmrate, na.rm=TRUE), include.lowest=T ))%>%
  ggplot()+
  geom_sf(aes(fill=MMR_group))+
  scale_fill_brewer(name="Maternal Mortality Rate", palette = "YlGn"
                    )+
  ggtitle("Texas Counties Maternal Mortality Rate Per 100,000, 2015-2019")+
  theme(plot.title = element_text(size=10, hjust = 0.2)) +
  theme(
        legend.key.width = unit(0.25, "in"),
        legend.key.height = unit(0.2, "in"),
        legend.text = element_text(size=8),
        axis.text.x = element_blank(),
        axis.text.y = element_blank(),
        axis.ticks = element_blank(),
        panel.background = element_rect(fill = "white", color = NA))

Descriptive Map

Defining Outcome and Predictor Variables

The dependent variable in this analysis is maternal mortality rates in Texas counties. Predictors for this analysis include; percentage of county population that is rural; county unemployment rate; the median household income in the county; the county’s median house value; the population density setsquare mile in the county. The percentage of persons in the county living in poverty; per capital number of OB-GYN in the county. All variables were Z scored

## 
## Call:
## lm(formula = mmratez ~ medhincz + medhouvlz + pctcrpopz + pctperpovz + 
##     rurality + ctypopdesz + obgyn10_pcz + pctctyunempz + ruccz, 
##     data = Txcountymmr2)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -1.1981 -0.4875 -0.2702  0.1226  6.5594 
## 
## Coefficients:
##                Estimate Std. Error t value Pr(>|t|)  
## (Intercept)    0.095528   0.120261   0.794   0.4278  
## medhincz      -0.038526   0.116312  -0.331   0.7408  
## medhouvlz     -0.210752   0.102760  -2.051   0.0413 *
## pctcrpopz      0.126033   0.085952   1.466   0.1439  
## pctperpovz    -0.017231   0.108777  -0.158   0.8743  
## ruralityUrban -0.288965   0.317924  -0.909   0.3643  
## ctypopdesz     0.002196   0.074147   0.030   0.9764  
## obgyn10_pcz    0.001540   0.072187   0.021   0.9830  
## pctctyunempz   0.077940   0.070414   1.107   0.2694  
## ruccz         -0.373528   0.165277  -2.260   0.0247 *
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 0.9863 on 243 degrees of freedom
## Multiple R-squared:  0.06484,    Adjusted R-squared:  0.03021 
## F-statistic: 1.872 on 9 and 243 DF,  p-value: 0.05674

Form Neighbors and Weight Matrix

#Creating a good representative set of neighbor types and spatial weights
Txcty.nb6<-knearneigh(st_centroid(Txcountymmr2), k=6)
Txcty.nb6<-knn2nb(Txcty.nb6)
Txcty.wt6<-nb2listw(Txcty.nb6, style="W")

Txcty.nb5<-knearneigh(st_centroid(Txcountymmr2), k=5)
Txcty.nb5<-knn2nb(Txcty.nb5)
Txcty.wt5<-nb2listw(Txcty.nb5, style="W")

Txcty.nb4<-knearneigh(st_centroid(Txcountymmr2), k=4)
Txcty.nb4<-knn2nb(Txcty.nb4)
Txcty.wt4<-nb2listw(Txcty.nb4, style="W")

Txcty.nb3<-knearneigh(st_centroid(Txcountymmr2), k=3)
Txcty.nb3<-knn2nb(Txcty.nb3)
Txcty.wt3<-nb2listw(Txcty.nb3,style="W")

Txcty.nb2<-knearneigh(st_centroid(Txcountymmr2) , k=2)
Txcty.nb2<-knn2nb(Txcty.nb2)
Txcty.wt2<-nb2listw(Txcty.nb2,style="W")

Txcty.nbr<-poly2nb(Txcountymmr2, queen=F)
Txcty.wtr<-nb2listw(Txcty.nbr, zero.policy=T)

Txcty.nbq<-poly2nb(Txcountymmr2, queen=T)
Txcty.wtq<-nb2listw(Txcty.nbr, style="W", zero.policy=T)

Testing for Autocorrelation

## 
##  Global Moran I for regression residuals
## 
## data:  
## model: lm(formula = mmratez ~ medhincz + medhouvlz + pctcrpopz +
## pctperpovz + rurality + ctypopdesz + obgyn10_pcz + pctctyunempz +
## ruccz, data = Txcountymmr2)
## weights: Txcty.wt2
## 
## Moran I statistic standard deviate = -0.36792, p-value = 0.7129
## alternative hypothesis: two.sided
## sample estimates:
## Observed Moran I      Expectation         Variance 
##     -0.034003530     -0.012765477      0.003332139

Examining Alternative SAR Models

## 
##  Lagrange multiplier diagnostics for spatial dependence
## 
## data:  
## model: lm(formula = mmratez ~ medhincz + medhouvlz + pctcrpopz +
## pctperpovz + rurality + ctypopdesz + obgyn10_pcz + pctctyunempz +
## ruccz, data = Txcountymmr2)
## weights: Txcty.wt3
## 
## LMerr = 0.026624, df = 1, p-value = 0.8704
## 
## 
##  Lagrange multiplier diagnostics for spatial dependence
## 
## data:  
## model: lm(formula = mmratez ~ medhincz + medhouvlz + pctcrpopz +
## pctperpovz + rurality + ctypopdesz + obgyn10_pcz + pctctyunempz +
## ruccz, data = Txcountymmr2)
## weights: Txcty.wt3
## 
## LMlag = 0.0034126, df = 1, p-value = 0.9534
## 
## 
##  Lagrange multiplier diagnostics for spatial dependence
## 
## data:  
## model: lm(formula = mmratez ~ medhincz + medhouvlz + pctcrpopz +
## pctperpovz + rurality + ctypopdesz + obgyn10_pcz + pctctyunempz +
## ruccz, data = Txcountymmr2)
## weights: Txcty.wt3
## 
## RLMerr = 0.29358, df = 1, p-value = 0.5879
## 
## 
##  Lagrange multiplier diagnostics for spatial dependence
## 
## data:  
## model: lm(formula = mmratez ~ medhincz + medhouvlz + pctcrpopz +
## pctperpovz + rurality + ctypopdesz + obgyn10_pcz + pctctyunempz +
## ruccz, data = Txcountymmr2)
## weights: Txcty.wt3
## 
## RLMlag = 0.27037, df = 1, p-value = 0.6031

Fitting SAR Specification

## 
## Call:errorsarlm(formula = mmratez ~ medhincz + medhouvlz + pctcrpopz + 
##     pctperpovz + rurality + ctypopdesz + obgyn10_pcz + pctctyunempz + 
##     ruccz, data = Txcountymmr2, listw = Txcty.wt3, method = "MC")
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -1.19385 -0.49303 -0.27493  0.11954  6.55218 
## 
## Type: error 
## Coefficients: (asymptotic standard errors) 
##                 Estimate Std. Error z value Pr(>|z|)
## (Intercept)    0.0966394  0.1185304  0.8153  0.41489
## medhincz      -0.0372954  0.1144553 -0.3259  0.74454
## medhouvlz     -0.2109170  0.1013703 -2.0807  0.03747
## pctcrpopz      0.1255281  0.0843860  1.4875  0.13687
## pctperpovz    -0.0146040  0.1069107 -0.1366  0.89135
## ruralityUrban -0.2924009  0.3122494 -0.9364  0.34905
## ctypopdesz     0.0012247  0.0728440  0.0168  0.98659
## obgyn10_pcz    0.0019413  0.0707090  0.0275  0.97810
## pctctyunempz   0.0767349  0.0690879  1.1107  0.26670
## ruccz         -0.3758847  0.1624592 -2.3137  0.02068
## 
## Lambda: 0.015192, LR test value: 0.030791, p-value: 0.86071
## Asymptotic standard error: 0.08042
##     z-value: 0.18891, p-value: 0.85016
## Wald statistic: 0.035688, p-value: 0.85016
## 
## Log likelihood: -350.3832 for error model
## ML residual variance (sigma squared): 0.93415, (sigma: 0.96652)
## Nagelkerke pseudo-R-squared: 0.064954 
## Number of observations: 253 
## Number of parameters estimated: 12 
## AIC: 724.77, (AIC for lm: 722.8)
## 
## t test of coefficients:
## 
##                                               Estimate Std. Error t value
## fit.err$tarXI(x - lambda * WX)(Intercept)    0.0966394  0.1039002  0.9301
## fit.err$tarXI(x - lambda * WX)medhincz      -0.0372954  0.1226169 -0.3042
## fit.err$tarXI(x - lambda * WX)medhouvlz     -0.2109170  0.0850499 -2.4799
## fit.err$tarXI(x - lambda * WX)pctcrpopz      0.1255281  0.0764051  1.6429
## fit.err$tarXI(x - lambda * WX)pctperpovz    -0.0146040  0.1022612 -0.1428
## fit.err$tarXI(x - lambda * WX)ruralityUrban -0.2924009  0.2618163 -1.1168
## fit.err$tarXI(x - lambda * WX)ctypopdesz     0.0012247  0.0262940  0.0466
## fit.err$tarXI(x - lambda * WX)obgyn10_pcz    0.0019413  0.0410905  0.0472
## fit.err$tarXI(x - lambda * WX)pctctyunempz   0.0767349  0.0653500  1.1742
## fit.err$tarXI(x - lambda * WX)ruccz         -0.3758847  0.1638886 -2.2935
##                                             Pr(>|t|)  
## fit.err$tarXI(x - lambda * WX)(Intercept)    0.35323  
## fit.err$tarXI(x - lambda * WX)medhincz       0.76126  
## fit.err$tarXI(x - lambda * WX)medhouvlz      0.01382 *
## fit.err$tarXI(x - lambda * WX)pctcrpopz      0.10169  
## fit.err$tarXI(x - lambda * WX)pctperpovz     0.88656  
## fit.err$tarXI(x - lambda * WX)ruralityUrban  0.26518  
## fit.err$tarXI(x - lambda * WX)ctypopdesz     0.96289  
## fit.err$tarXI(x - lambda * WX)obgyn10_pcz    0.96236  
## fit.err$tarXI(x - lambda * WX)pctctyunempz   0.24146  
## fit.err$tarXI(x - lambda * WX)ruccz          0.02267 *
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Call:lagsarlm(formula = mmratez ~ medhincz + medhouvlz + pctcrpopz + 
##     pctperpovz + rurality + ctypopdesz + obgyn10_pcz + pctctyunempz + 
##     ruccz, data = Txcountymmr2, listw = Txcty.wt3, type = "lag", 
##     method = "MC")
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -1.19547 -0.48774 -0.27078  0.12384  6.55628 
## 
## Type: lag 
## Coefficients: (asymptotic standard errors) 
##                 Estimate Std. Error z value Pr(>|z|)
## (Intercept)    0.0957590  0.1178595  0.8125  0.41651
## medhincz      -0.0383548  0.1139955 -0.3365  0.73652
## medhouvlz     -0.2105432  0.1008469 -2.0878  0.03682
## pctcrpopz      0.1257854  0.0842394  1.4932  0.13539
## pctperpovz    -0.0171720  0.1067105 -0.1609  0.87216
## ruralityUrban -0.2896759  0.3115752 -0.9297  0.35252
## ctypopdesz     0.0020609  0.0726665  0.0284  0.97737
## obgyn10_pcz    0.0015454  0.0707509  0.0218  0.98257
## pctctyunempz   0.0776983  0.0690106  1.1259  0.26021
## ruccz         -0.3736710  0.1620066 -2.3065  0.02108
## 
## Rho: 0.0050412, LR test value: 0.0037281, p-value: 0.95131
## Asymptotic standard error: 0.078961
##     z-value: 0.063845, p-value: 0.94909
## Wald statistic: 0.0040762, p-value: 0.94909
## 
## Log likelihood: -350.3967 for lag model
## ML residual variance (sigma squared): 0.93431, (sigma: 0.9666)
## Nagelkerke pseudo-R-squared: 0.064854 
## Number of observations: 253 
## Number of parameters estimated: 12 
## AIC: 724.79, (AIC for lm: 722.8)
## LM test for residual autocorrelation
## test value: 0.3285, p-value: 0.56654
## 
## t test of coefficients:
## 
##                              Estimate Std. Error t value Pr(>|t|)  
## fit.lag$tarXx(Intercept)    0.0957590  0.1030938  0.9289  0.35389  
## fit.lag$tarXxmedhincz      -0.0383548  0.1221992 -0.3139  0.75389  
## fit.lag$tarXxmedhouvlz     -0.2105432  0.0843444 -2.4962  0.01322 *
## fit.lag$tarXxpctcrpopz      0.1257854  0.0762133  1.6504  0.10014  
## fit.lag$tarXxpctperpovz    -0.0171720  0.1020966 -0.1682  0.86657  
## fit.lag$tarXxruralityUrban -0.2896759  0.2615221 -1.1077  0.26911  
## fit.lag$tarXxctypopdesz     0.0020609  0.0264533  0.0779  0.93797  
## fit.lag$tarXxobgyn10_pcz    0.0015454  0.0412509  0.0375  0.97015  
## fit.lag$tarXxpctctyunempz   0.0776983  0.0654956  1.1863  0.23666  
## fit.lag$tarXxruccz         -0.3736710  0.1627800 -2.2956  0.02255 *
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Fitting Best Model

## 
## Call:errorsarlm(formula = mmratez ~ medhincz + medhouvlz + pctcrpopz + 
##     pctperpovz + rurality + ctypopdesz + obgyn10_pcz + pctctyunempz + 
##     ruccz, data = Txcountymmr2, listw = Txcty.wt3)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -1.19384 -0.49307 -0.27490  0.11953  6.55217 
## 
## Type: error 
## Coefficients: (asymptotic standard errors) 
##                 Estimate Std. Error z value Pr(>|z|)
## (Intercept)    0.0966421  0.1185320  0.8153  0.41489
## medhincz      -0.0372924  0.1144564 -0.3258  0.74456
## medhouvlz     -0.2109174  0.1013719 -2.0806  0.03747
## pctcrpopz      0.1255269  0.0843864  1.4875  0.13688
## pctperpovz    -0.0145975  0.1069114 -0.1365  0.89140
## ruralityUrban -0.2924093  0.3122510 -0.9365  0.34904
## ctypopdesz     0.0012224  0.0728445  0.0168  0.98661
## obgyn10_pcz    0.0019423  0.0707089  0.0275  0.97809
## pctctyunempz   0.0767320  0.0690881  1.1106  0.26672
## ruccz         -0.3758905  0.1624604 -2.3137  0.02068
## 
## Lambda: 0.01523, LR test value: 0.030864, p-value: 0.86054
## Asymptotic standard error: 0.08042
##     z-value: 0.18937, p-value: 0.8498
## Wald statistic: 0.035863, p-value: 0.8498
## 
## Log likelihood: -350.3831 for error model
## ML residual variance (sigma squared): 0.93415, (sigma: 0.96652)
## Nagelkerke pseudo-R-squared: 0.064955 
## Number of observations: 253 
## Number of parameters estimated: 12 
## AIC: 724.77, (AIC for lm: 722.8)

After fitting the OLS model and checking for autocorrelation in the residuals, i observed that the model has no auto correlation. However, to fulfill the requirements of the assignment , I did the SAR specification, the AICs from the model show that the OLS best fit the model.

LS0tCnRpdGxlOiAiU3BhdGlhbCBEZW1vZ3JhcGh5IC0gSG9tZXdrIDIgLUF1dG9yZWdyZXNzaXZlIE1vZGVscyIKYXV0aG9yOiAiU2Ftc29uIEEuIE9sb3dvbGFqdSwgTVBIIgpkYXRlOiAiYHIgZm9ybWF0KFN5cy50aW1lKCksICclZCAlQiwgJVknKWAiCm91dHB1dDoKICAgaHRtbF9kb2N1bWVudDoKICAgIGRmX3ByaW50OiBwYWdlZAogICAgZmlnX2hlaWdodDogNwogICAgZmlnX3dpZHRoOiA3CiAgICB0b2M6IHllcwogICAgdG9jX2Zsb2F0OiB5ZXMKICAgIGNvZGVfZG93bmxvYWQ6IHRydWUKLS0tCgoKYGBge3IgbG9hZGxpYnMsIHdhcm5pbmc9RkFMU0UsIG1lc3NhZ2U9RkFMU0UsZWNobz1GQUxTRX0KbGlicmFyeShub3J0ZXN0KQpsaWJyYXJ5KGNhcikKbGlicmFyeShsbXRlc3QpCmxpYnJhcnkoY2xhc3NJbnQpCmxpYnJhcnkoc2FuZHdpY2gpCmxpYnJhcnkodGlkeXZlcnNlKQpsaWJyYXJ5KHNwZGVwKQpsaWJyYXJ5KHJpbykKbGlicmFyeSh0aWR5Y2Vuc3VzKQpsaWJyYXJ5KHNmKQpsaWJyYXJ5KHRpZ3JpcykKbGlicmFyeShzcGF0aWFscmVnKQpgYGAKCiMjIyBEYXRhIE1hbmlwdWxhdGlvbnMKYGBge3IsfQojIEdldCBjb3VudHkgc29jaW8tZWNvbm9taWMgdmFyaWFibGVzIGZyb20gQXJlYSByZXNvdXJjZSBmaWxlIDIwMTktMjAyMAphcmYyMDIwPC1pbXBvcnQoImFocmYyMDIwLnNhczdiZGF0IikgCiBhcmYyMDIwPC1hcmYyMDIwJT4lCiAgIGZpbHRlcihmMDAwMTE9PSI0OCIpICU+JSAKICBtdXRhdGUoY29maXBzPWFzLmZhY3RvcihmMDAwMDQpLCAKICAgICAgICAgY29uYW1lPWYwMDAxMCwKICAgICAgICAgc3RhdGUgPSBmMDAwMTEsCiAgICAgICAgIG1lZGhvdXZsPWYxNDYxMzE0LAogICAgICAgICBwY3RjcnBvcD0gcm91bmQoMTAwKihmMTQ5MjAxMC9mMDQ1MzAxMCksMiksCiAgICAgICAgIG1lZGhpbmM9IGYxNDM0NTE0LAogICAgICAgICBwY3RjdHl1bmVtcD1yb3VuZCgxMDAqKGYxNDUxMjE0L2YxNDUxMDE0KSwyKSwKICAgICAgICAgY3R5cG9wZGVzPSAoZjA0NTMwMTAvZjEzODc0MTApLCAgCiAgICAgICAgIHJ1Y2M9IGFzLm51bWVyaWMoZjAwMDIwMTMpLAogICAgICAgICBwY3RwZXJwb3Y9IGYxMzMyMTE4LAogICAgICAgICBvYmd5bjEwX3BjPSAxMDAwKihmMTE2ODQxMC8gZjA0NTMwMTApICklPiUKICBkcGx5cjo6c2VsZWN0KG1lZGhvdXZsLCBwY3RjcnBvcCxtZWRoaW5jLCBwY3RjdHl1bmVtcCxzdGF0ZSwgY29maXBzLCBjb25hbWUsIGN0eXBvcGRlcywgcnVjYywgb2JneW4xMF9wYyxwY3RwZXJwb3YpJT4lCiAgICBtdXRhdGUocnVyYWxpdHk9IGNhcjo6UmVjb2RlKHJ1Y2MsIHJlY29kZXMgPSIxOjMgPSdVcmJhbic7NDo5PSdSdXJhbCciKSklPiUKIGZpbHRlcihjb21wbGV0ZS5jYXNlcyguKSkKICAKI2xvYWQgYW5kIGNhbGN1bGF0ZSBtYXRlcm5hbCBtb3J0YWxpdHkgcmF0ZXMgZm9yIGNvdW50aWVzIGluIFRleGFzIGZvciAgYSA1eWVhciBwZXJpb2QgKDIwMTUtMjAxOSkKYWxsZGF0PC1yZWFkUkRTKCJ+L09uZURyaXZlIC0gVW5pdmVyc2l0eSBvZiBUZXhhcyBhdCBTYW4gQW50b25pby9tYXRlcm5hbG1vcnRhbGl0eS9hZ2dyZWdhdGUvYWxsZGF0LnJkcyIpICU+JSAKICBmaWx0ZXIoU3RhdGU9PSJUWCIpCgpjb3VudHlNTVIgPC0gIGFsbGRhdCAlPiUgCiAgZ3JvdXBfYnkoY29maXBzKSU+JQogIHN1bW1hcmlzZShuYmlyPXN1bShuYmlydGhzLCBuYS5ybSA9IFQpLCBuZGVhID0gc3VtKG5kZWF0aHMsIG5hLnJtID0gVCkpICAlPiUgCiAgbXV0YXRlKG1tcmF0ZSA9MTAwMDAwKihuZGVhL25iaXIpKQoKCiNNZXJnZSB0aGUgc29jaW9lY29ub21pYyB2YXJpYWJsZXMgd2l0aCBUZXhhcyBjb3VudGllcyBtYXRlcm5hbCBtb3J0YWxpdHkgcmF0ZXMgZm9yIGEgNS0geWVhcnMgcGVyaW9kKDIwMTUtMjAxOSkKVHhtbXI8LSBtZXJnZShjb3VudHlNTVIsIGFyZjIwMjAsIGJ5PSAiY29maXBzIiwgYWxsLnggPVRSVUUsIHNvcnQgPSBGQUxTRSkgJT4lIAogIHJlbmFtZShHRU9JRD1jb2ZpcHMpICU+JSAKICBtdXRhdGUocm1tcmF0ZT1pZmVsc2UobW1yYXRlPj0xLG1tcmF0ZSxOQSkpCiAgCmBgYAoKCmBgYHtyLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQojIEdldCBUZXhhcyBib3VuZGFyeSBkYXRhIGZyb20gdGlncmlzCnR4Y291bnR5PC1jb3VudGllcyh5ZWFyPTIwMTgsIHN0YXRlID0gInR4IiwgcmVmcmVzaD1ULCBjYiA9IFQsIHByb2dyZXNzX2Jhcj1GQUxTRSkKCiMgR2VvIGpvaW4gdGhlIGJvdW5kYXJ5IGRhdGEgd2l0aCBUZXhhcyBtYXRlcm5hbCBtb3J0YWxpdHkgcmF0ZSBkYXRhc2V0IHRvIGdpdmUgaXQgZ2VvbWV0cmllcyBmb3IgbWFwIG1ha2luZwpUeG1tcmc8LWdlb19qb2luKHR4Y291bnR5LCBUeG1tciwgYnlfc3A9IkdFT0lEIiwgYnlfZGY9IkdFT0lEIixob3c9ImxlZnQiICkKCiMgQXNzaWduIENSUyAgdG8gdGhlIGRhdGFzZXQgZm9yIHByb3BlciBtYXAgcHJvamVjdGlvbiwKVHhjb3VudHltbXI8LSBzdF90cmFuc2Zvcm0oVHhtbXJnLCAzMDgzKQoKIyBNYWtlIFRleGFzIGNvdW50eSBNYXRlcm5hbCBNb3J0YWxpdHkgUmF0ZSBNYXAKVGV4YXNtbXIgPC0gVHhjb3VudHltbXIlPiUKICBtdXRhdGUoTU1SX2dyb3VwID0gY3V0KHJtbXJhdGUsIGJyZWFrcz1xdWFudGlsZShybW1yYXRlLCBuYS5ybT1UUlVFKSwgaW5jbHVkZS5sb3dlc3Q9VCApKSU+JQogIGdncGxvdCgpKwogIGdlb21fc2YoYWVzKGZpbGw9TU1SX2dyb3VwKSkrCiAgc2NhbGVfZmlsbF9icmV3ZXIobmFtZT0iTWF0ZXJuYWwgTW9ydGFsaXR5IFJhdGUiLCBwYWxldHRlID0gIllsR24iCiAgICAgICAgICAgICAgICAgICAgKSsKICBnZ3RpdGxlKCJUZXhhcyBDb3VudGllcyBNYXRlcm5hbCBNb3J0YWxpdHkgUmF0ZSBQZXIgMTAwLDAwMCwgMjAxNS0yMDE5IikrCiAgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplPTEwLCBoanVzdCA9IDAuMikpICsKICB0aGVtZSgKICAgICAgICBsZWdlbmQua2V5LndpZHRoID0gdW5pdCgwLjI1LCAiaW4iKSwKICAgICAgICBsZWdlbmQua2V5LmhlaWdodCA9IHVuaXQoMC4yLCAiaW4iKSwKICAgICAgICBsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplPTgpLAogICAgICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgIGF4aXMudGV4dC55ID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgIGF4aXMudGlja3MgPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgcGFuZWwuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gIndoaXRlIiwgY29sb3IgPSBOQSkpCgpgYGAKCiMjIyBEZXNjcmlwdGl2ZSBNYXAKYGBge3IsIGVjaG89RkFMU0V9ClRleGFzbW1yCmBgYAoKCiMjIyBEZWZpbmluZyBPdXRjb21lIGFuZCBQcmVkaWN0b3IgVmFyaWFibGVzClRoZSBkZXBlbmRlbnQgdmFyaWFibGUgaW4gdGhpcyBhbmFseXNpcyBpcyBtYXRlcm5hbCBtb3J0YWxpdHkgcmF0ZXMgaW4gVGV4YXMgY291bnRpZXMuIFByZWRpY3RvcnMgZm9yIHRoaXMgYW5hbHlzaXMgaW5jbHVkZTsgCnBlcmNlbnRhZ2Ugb2YgY291bnR5IHBvcHVsYXRpb24gdGhhdCBpcyBydXJhbDsgY291bnR5IHVuZW1wbG95bWVudCByYXRlOyB0aGUgbWVkaWFuIGhvdXNlaG9sZCBpbmNvbWUgaW4gdGhlIGNvdW50eTsgdGhlIGNvdW50eeKAmXMgbWVkaWFuIGhvdXNlIHZhbHVlOyB0aGUgcG9wdWxhdGlvbiBkZW5zaXR5IHNldHNxdWFyZSBtaWxlIGluIHRoZSBjb3VudHkuIFRoZSBwZXJjZW50YWdlIG9mIHBlcnNvbnMgaW4gdGhlIGNvdW50eSBsaXZpbmcgaW4gcG92ZXJ0eTsgcGVyIGNhcGl0YWwgbnVtYmVyIG9mIE9CLUdZTiBpbiB0aGUgY291bnR5LiBBbGwgdmFyaWFibGVzIHdlcmUgWiBzY29yZWQgCgpgYGB7cix3YXJuaW5nPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCBlY2hvPUZBTFNFfQojIFogc2NvcmUgYWxsIHZhcmlhYmxlcyAKVHhjb3VudHltbXIkbW1yYXRlejwtYXMubnVtZXJpYyhzY2FsZShUeGNvdW50eW1tciRtbXJhdGUsIGNlbnRlcj1ULCBzY2FsZT1UKSkKVHhjb3VudHltbXIkbWVkaGluY3o8LWFzLm51bWVyaWMoc2NhbGUoVHhjb3VudHltbXIkbWVkaGluYywgY2VudGVyPVQsIHNjYWxlPVQpKQpUeGNvdW50eW1tciRtZWRob3V2bHo8LWFzLm51bWVyaWMoc2NhbGUoVHhjb3VudHltbXIkbWVkaG91dmwsIGNlbnRlcj1ULCBzY2FsZT1UKSkKVHhjb3VudHltbXIkcGN0Y3Jwb3B6PC1hcy5udW1lcmljKHNjYWxlKFR4Y291bnR5bW1yJHBjdGNycG9wLCBjZW50ZXI9VCwgc2NhbGU9VCkpClR4Y291bnR5bW1yJHBjdHBlcnBvdno8LWFzLm51bWVyaWMoc2NhbGUoVHhjb3VudHltbXIkcGN0cGVycG92LCBjZW50ZXI9VCwgc2NhbGU9VCkpClR4Y291bnR5bW1yJGN0eXBvcGRlc3o8LWFzLm51bWVyaWMoc2NhbGUoVHhjb3VudHltbXIkY3R5cG9wZGVzLCBjZW50ZXI9VCwgc2NhbGU9VCkpClR4Y291bnR5bW1yJG9iZ3luMTBfcGN6PC1hcy5udW1lcmljKHNjYWxlKFR4Y291bnR5bW1yJG9iZ3luMTBfcGMsIGNlbnRlcj1ULCBzY2FsZT1UKSkKVHhjb3VudHltbXIkcGN0Y3R5dW5lbXB6PC1hcy5udW1lcmljKHNjYWxlKFR4Y291bnR5bW1yJHBjdGN0eXVuZW1wLCBjZW50ZXI9VCwgc2NhbGU9VCkpClR4Y291bnR5bW1yJHJ1Y2N6PC1hcy5udW1lcmljKHNjYWxlKFR4Y291bnR5bW1yJHJ1Y2MsIGNlbnRlcj1ULCBzY2FsZT1UKSkKClR4Y291bnR5bW1yMiA8LSBUeGNvdW50eW1tciAlPiUgCiAgZmlsdGVyKCFpcy5uYSggbWVkaG91dmx6KSkKCiNmaXQgdGhlIE9MUyBtb2RlbCAKZml0Lm9scyA8LSBsbSggbW1yYXRleiB+IG1lZGhpbmN6ICsgbWVkaG91dmx6KyBwY3RjcnBvcHogKyBwY3RwZXJwb3Z6ICsgcnVyYWxpdHkgKyBjdHlwb3BkZXN6ICsgb2JneW4xMF9wY3ogKyBwY3RjdHl1bmVtcHorcnVjY3osCiAgICAgICAgICAgZGF0YT1UeGNvdW50eW1tcjIpCnN1bW1hcnkoZml0Lm9scykKYGBgCgojIyMgRm9ybSBOZWlnaGJvcnMgYW5kIFdlaWdodCBNYXRyaXgKYGBge3IsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CiNDcmVhdGluZyBhIGdvb2QgcmVwcmVzZW50YXRpdmUgc2V0IG9mIG5laWdoYm9yIHR5cGVzIGFuZCBzcGF0aWFsIHdlaWdodHMKVHhjdHkubmI2PC1rbmVhcm5laWdoKHN0X2NlbnRyb2lkKFR4Y291bnR5bW1yMiksIGs9NikKVHhjdHkubmI2PC1rbm4ybmIoVHhjdHkubmI2KQpUeGN0eS53dDY8LW5iMmxpc3R3KFR4Y3R5Lm5iNiwgc3R5bGU9IlciKQoKVHhjdHkubmI1PC1rbmVhcm5laWdoKHN0X2NlbnRyb2lkKFR4Y291bnR5bW1yMiksIGs9NSkKVHhjdHkubmI1PC1rbm4ybmIoVHhjdHkubmI1KQpUeGN0eS53dDU8LW5iMmxpc3R3KFR4Y3R5Lm5iNSwgc3R5bGU9IlciKQoKVHhjdHkubmI0PC1rbmVhcm5laWdoKHN0X2NlbnRyb2lkKFR4Y291bnR5bW1yMiksIGs9NCkKVHhjdHkubmI0PC1rbm4ybmIoVHhjdHkubmI0KQpUeGN0eS53dDQ8LW5iMmxpc3R3KFR4Y3R5Lm5iNCwgc3R5bGU9IlciKQoKVHhjdHkubmIzPC1rbmVhcm5laWdoKHN0X2NlbnRyb2lkKFR4Y291bnR5bW1yMiksIGs9MykKVHhjdHkubmIzPC1rbm4ybmIoVHhjdHkubmIzKQpUeGN0eS53dDM8LW5iMmxpc3R3KFR4Y3R5Lm5iMyxzdHlsZT0iVyIpCgpUeGN0eS5uYjI8LWtuZWFybmVpZ2goc3RfY2VudHJvaWQoVHhjb3VudHltbXIyKSAsIGs9MikKVHhjdHkubmIyPC1rbm4ybmIoVHhjdHkubmIyKQpUeGN0eS53dDI8LW5iMmxpc3R3KFR4Y3R5Lm5iMixzdHlsZT0iVyIpCgpUeGN0eS5uYnI8LXBvbHkybmIoVHhjb3VudHltbXIyLCBxdWVlbj1GKQpUeGN0eS53dHI8LW5iMmxpc3R3KFR4Y3R5Lm5iciwgemVyby5wb2xpY3k9VCkKClR4Y3R5Lm5icTwtcG9seTJuYihUeGNvdW50eW1tcjIsIHF1ZWVuPVQpClR4Y3R5Lnd0cTwtbmIybGlzdHcoVHhjdHkubmJyLCBzdHlsZT0iVyIsIHplcm8ucG9saWN5PVQpCmBgYAoKCiMjIyBUZXN0aW5nIGZvciBBdXRvY29ycmVsYXRpb24KYGBge3IsZWNobz1GQUxTRX0KbG0ubW9yYW50ZXN0KGZpdC5vbHMsIFR4Y3R5Lnd0MiwgYWx0ZXJuYXRpdmU9InR3by5zaWRlZCIpCgoKcmVzaTwtYyhsbS5tb3JhbnRlc3QoZml0Lm9scywgbGlzdHc9VHhjdHkud3QyKSRlc3RpbWF0ZVsxXSwKICAgICAgICBsbS5tb3JhbnRlc3QoZml0Lm9scywgbGlzdHc9VHhjdHkud3QzKSRlc3RpbWF0ZVsxXSwKICAgICAgICBsbS5tb3JhbnRlc3QoZml0Lm9scywgbGlzdHc9VHhjdHkud3Q0KSRlc3RpbWF0ZVsxXSwKICAgICAgICBsbS5tb3JhbnRlc3QoZml0Lm9scywgbGlzdHc9VHhjdHkud3Q1KSRlc3RpbWF0ZVsxXSwKICAgICAgICBsbS5tb3JhbnRlc3QoZml0Lm9scywgbGlzdHc9VHhjdHkud3Q2KSRlc3RpbWF0ZVsxXSwKICAgICAgICBsbS5tb3JhbnRlc3QoZml0Lm9scywgbGlzdHc9VHhjdHkud3RxLHplcm8ucG9saWN5PVQpJGVzdGltYXRlWzFdLAogICAgICAgIGxtLm1vcmFudGVzdChmaXQub2xzLCBsaXN0dz1UeGN0eS53dHIsemVyby5wb2xpY3k9VCkkZXN0aW1hdGVbMV0pCgpwbG90KHJlc2ksIHR5cGU9ImwiKQoKIyBjcmVhdGluZyB0aGUgc3R1ZGVudGl6ZWQgcmVzaWR1YWxzIGZyb20gdGhlIG1vZGVsIGZpdCAKVHhjb3VudHltbXIyJG9sc3Jlc2lkPC1yc3R1ZGVudChmaXQub2xzKQoKIyBjcmVhdGluZyBhIG1hcCBvZiBzdHVkZW50aXplZCByZXNpZHVhbHMgZnJvbSB0aGUgbW9kZWwgZml0IApUeGNvdW50eW1tcjI8LXN0X2FzX3NmKFR4Y291bnR5bW1yMikKVHhjb3VudHltbXIyJT4lCiAgbXV0YXRlKHJxdWFudD1jdXQob2xzcmVzaWQsCiAgICAgICAgICAgICAgICAgICAgYnJlYWtzID0gcXVhbnRpbGUoVHhjb3VudHltbXIyJG9sc3Jlc2lkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHA9c2VxKDAsMSxsZW5ndGgub3V0ID0gOCkpLAogICAgICAgICAgICAgICAgICAgIGluY2x1ZGUubG93ZXN0ID0gVCkpJT4lCiAgZ2dwbG90KCkrCiAgZ2VvbV9zZihhZXMoZmlsbD1ycXVhbnQpKSsKICBzY2FsZV9maWxsX2JyZXdlcihuYW1lPSJSZXNpZHVhbHMiLCBwYWxldHRlID0gIllsR24iCiAgICAgICAgICAgICAgICAgICAgKSsKICBnZ3RpdGxlKCJPTFMgTW9kZWwgU3R1ZGVudGl6ZWQgUmVzaWR1YWxzIikrCiAgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplPTEwLCBoanVzdCA9IDAuMikpICsKICB0aGVtZSgKICAgICAgICBsZWdlbmQua2V5LndpZHRoID0gdW5pdCgwLjI1LCAiaW4iKSwKICAgICAgICBsZWdlbmQua2V5LmhlaWdodCA9IHVuaXQoMC4yLCAiaW4iKSwKICAgICAgICBsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplPTgpLAogICAgICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgIGF4aXMudGV4dC55ID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgIGF4aXMudGlja3MgPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgcGFuZWwuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gIndoaXRlIiwgY29sb3IgPSBOQSkpCgoKYGBgCgoKYGBge3IsIGVjaG89RkFMU0UsIHdhcm5pbmc9RkFMU0V9Cgpsb2NhbGk8LWxvY2FsbW9yYW4oVHhjb3VudHltbXIyJG1tcmF0ZSwgCiAgICAgICAgICAgbGlzdHc9VHhjdHkud3QzLCBhbHRlcm5hdGl2ZSA9ICJ0d28uc2lkZWQiICkKVHhjb3VudHltbXIyJGxvY2FsaTwtbG9jYWxpWywxXQpUeGNvdW50eW1tcjIkbG9jYWxsPC1sb2NhbGlbLDVdCgpUeGNvdW50eW1tcjIkc3JyPC1zY2FsZShUeGNvdW50eW1tcjIkbW1yYXRlKQpUeGNvdW50eW1tcjIkbGFnX3JyPC1sYWcubGlzdHcodmFyPVR4Y291bnR5bW1yMiRzcnIsIHggPSBUeGN0eS53dDMpClR4Y291bnR5bW1yMiRxdWFkX3NpZyA8LSBOQQpUeGNvdW50eW1tcjIkcXVhZF9zaWdbKFR4Y291bnR5bW1yMiRzcnIgPj0gMCAmIFR4Y291bnR5bW1yMiRsYWdfcnIgPj0gMCkgJiAoVHhjb3VudHltbXIyJGxvY2FsbCA8PSAwLjA1KV0gPC0gIkgtSCIgI2hpZ2ggaGlnaApUeGNvdW50eW1tcjIkcXVhZF9zaWdbKFR4Y291bnR5bW1yMiRzcnIgPD0gMCAmIFR4Y291bnR5bW1yMiRsYWdfcnIgPD0gMCkgJiAoVHhjb3VudHltbXIyJGxvY2FsbCA8PSAwLjA1KV0gPC0gIkwtTCIgI2xvdyBsb3cKVHhjb3VudHltbXIyJHF1YWRfc2lnWyhUeGNvdW50eW1tcjIkc3JyID49IDAgJiBUeGNvdW50eW1tcjIkbGFnX3JyIDw9IDApICYgKFR4Y291bnR5bW1yMiRsb2NhbGwgPD0gMC4wNSldIDwtICJILUwiICNoaWdoIGxvdwpUeGNvdW50eW1tcjIkcXVhZF9zaWdbKFR4Y291bnR5bW1yMiRzcnIgPD0gMCAmIFR4Y291bnR5bW1yMiRsYWdfcnIgPj0gMCkgJiAoVHhjb3VudHltbXIyJGxvY2FsbCA8PSAwLjA1KV0gPC0gIkwtSCIgI2xvdyBoaWdoCgojV0UgQVNTSUdOIEEgIyBTZXQgdGhlIGJyZWFrcyBmb3IgdGhlIHRoZW1hdGljIG1hcCBjbGFzc2VzCmJyZWFrcyA8LSBzZXEoMSwgNSwgMSkKCiMgU2V0IHRoZSBjb3JyZXNwb25kaW5nIGxhYmVscyBmb3IgdGhlIHRoZW1hdGljIG1hcCBjbGFzc2VzCmxhYmVscyA8LSBjKCJIaWdoLUhpZ2giLCAiTG93LUxvdyIsICJIaWdoLUxvdyIsICJMb3ctSGlnaCIsICJOb3QgQ2x1c3RlcmVkIikKCiMgZmluZCBpbnRlcnZhbCAtIFRoaXMgaXMgbmVjZXNzYXJ5IGZvciBtYWtpbmcgYSBtYXAKbnAgPC0gZmluZEludGVydmFsKFR4Y291bnR5bW1yMiRxdWFkX3NpZywgYnJlYWtzKQoKIyBBc3NpZ24gY29sb3JzIHRvIGVhY2ggbWFwIGNsYXNzCmNvbG9ycyA8LSBjKCJyZWQiLCAiYmx1ZSIsICJsaWdodHBpbmsiLCAic2t5Ymx1ZTIiLCAid2hpdGUiKQoKY2x1c3Rlcm1hcCA8LSBUeGNvdW50eW1tcjIlPiUKICBmaWx0ZXIoY29tcGxldGUuY2FzZXMobW1yYXRlKSkgJT4lIAogIGdncGxvdCgpKwogIGdlb21fc2YoYWVzKGZpbGwgPSBxdWFkX3NpZykpKwogIHNjYWxlX2ZpbGxfYnJld2VyKG5hbWU9IkNsdXN0ZXJzIiwgcGFsZXR0ZSA9ICJZbEduIgogICAgICAgICAgICAgICAgICAgICkrCiAgZ2d0aXRsZSgiTW9yYW4gQ2x1c3RlciBNYXAgLVxuVGV4YXMgQ291bnRpZXMgTWF0ZXJuYWwgTW9ydGFsaXR5IFJhdGUgUGVyIDEwMCwwMDAiKSsKICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemU9MTAsIGhqdXN0ID0gMC4yKSkgKwogIHRoZW1lKAogICAgICAgIGxlZ2VuZC5rZXkud2lkdGggPSB1bml0KDAuMjUsICJpbiIpLAogICAgICAgIGxlZ2VuZC5rZXkuaGVpZ2h0ID0gdW5pdCgwLjIsICJpbiIpLAogICAgICAgIGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemU9OCksCiAgICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgYXhpcy50ZXh0LnkgPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgYXhpcy50aWNrcyA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICBwYW5lbC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSAid2hpdGUiLCBjb2xvciA9IE5BKSkKY2x1c3Rlcm1hcApgYGAKCiMjIwlFeGFtaW5pbmcgQWx0ZXJuYXRpdmUgU0FSIE1vZGVscyAKYGBge3IsIGVjaG89RkFMU0V9CmxtLkxNdGVzdHMobW9kZWwgPSBmaXQub2xzLAogICAgICAgICAgIGxpc3R3PVR4Y3R5Lnd0MywKICAgICAgICAgICB0ZXN0ID0gYygiTE1lcnIiLCAiTE1sYWciLCAiUkxNZXJyIiwgIlJMTWxhZyIpKQpgYGAKCiMjIyBGaXR0aW5nIFNBUiBTcGVjaWZpY2F0aW9uCmBgYHtyLCBlY2hvPUZBTFNFfQojU3BhdGlhbCBsYWcgYW5kIGVycm9yIG1vZGVscwpmaXQuZXJyPC1lcnJvcnNhcmxtKG1tcmF0ZXogfiBtZWRoaW5jeiArIG1lZGhvdXZseisgcGN0Y3Jwb3B6ICsgcGN0cGVycG92eiArIHJ1cmFsaXR5ICsgY3R5cG9wZGVzeiArIG9iZ3luMTBfcGN6ICsgcGN0Y3R5dW5lbXB6K3J1Y2N6LAogICAgICAgICAgICAgICAgICAgIGRhdGE9VHhjb3VudHltbXIyLAogICAgICAgICAgICAgICAgICAgIGxpc3R3PVR4Y3R5Lnd0MywKICAgICAgICAgICAgICAgICAgICBtZXRob2QgPSAiTUMiKQoKc3VtbWFyeShmaXQuZXJyLAogICAgICAgIE5hZ2Vsa2Vya2U9VCkKCiNSb2J1c3QgU0UncwpsbS50YXJnZXQuVHgxIDwtIGxtKGZpdC5lcnIkdGFyeSB+IGZpdC5lcnIkdGFyWCAtIDEpCgpsbXRlc3Q6OmNvZWZ0ZXN0KGxtLnRhcmdldC5UeDEsCiAgICAgICAgICAgICAgICAgdmNvdi49dmNvdkhDKGxtLnRhcmdldC5UeDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9IkhDMCIpKQoKCmZpdC5sYWc8LWxhZ3NhcmxtKG1tcmF0ZXogfiBtZWRoaW5jeiArIG1lZGhvdXZseisgcGN0Y3Jwb3B6ICsgcGN0cGVycG92eiArIHJ1cmFsaXR5ICsgY3R5cG9wZGVzeiArIG9iZ3luMTBfcGN6ICsgcGN0Y3R5dW5lbXB6K3J1Y2N6LAogICAgICAgICAgICAgICAgICAgIGRhdGE9VHhjb3VudHltbXIyLAogICAgICAgICAgICAgICAgICAgIGxpc3R3PVR4Y3R5Lnd0MywKICAgICAgICAgICAgICAgICAgdHlwZT0ibGFnIiwKICAgICAgICAgICAgICAgICAgbWV0aG9kID0gIk1DIikKCnN1bW1hcnkoZml0LmxhZywgTmFnZWxrZXJrZT1UKQoKI1JvYnVzdCBTRSdzCmxtLnRhcmdldC5UeDIgPC0gbG0oZml0LmxhZyR0YXJ5IH4gZml0LmxhZyR0YXJYIC0gMSkKCmxtdGVzdDo6Y29lZnRlc3QobG0udGFyZ2V0LlR4MiwgCiAgICAgICAgICAgICAgICAgdmNvdi49dmNvdkhDKGxtLnRhcmdldC5UeDIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9IkhDMCIpKQpgYGAKIyMjIEZpdHRpbmcgQmVzdCBNb2RlbCAKYGBge3IsIGVjaG89RkFMU0V9CmZpdC5lcnI8LWVycm9yc2FybG0obW1yYXRleiB+IG1lZGhpbmN6ICsgbWVkaG91dmx6KyBwY3RjcnBvcHogKyBwY3RwZXJwb3Z6ICsgcnVyYWxpdHkgKyBjdHlwb3BkZXN6ICsgb2JneW4xMF9wY3ogKyBwY3RjdHl1bmVtcHorcnVjY3osCiAgICAgICAgICAgICAgICAgICAgZGF0YT1UeGNvdW50eW1tcjIsCiAgICAgICAgICAgICAgICAgICAgbGlzdHc9VHhjdHkud3QzLAogICAgICAgICAgICAgICAgICAgICkKCnN1bW1hcnkoZml0LmVyciwKICAgICAgICBOYWdlbGtlcmtlPVQpCgoKYGBgCgpBZnRlciBmaXR0aW5nIHRoZSBPTFMgbW9kZWwgYW5kIGNoZWNraW5nIGZvciBhdXRvY29ycmVsYXRpb24gaW4gdGhlIHJlc2lkdWFscywgaSBvYnNlcnZlZCB0aGF0IHRoZSBtb2RlbCBoYXMgbm8gYXV0byBjb3JyZWxhdGlvbi4gSG93ZXZlciwgdG8gZnVsZmlsbCB0aGUgcmVxdWlyZW1lbnRzIG9mIHRoZSBhc3NpZ25tZW50ICwgSSBkaWQgdGhlIFNBUiBzcGVjaWZpY2F0aW9uLCB0aGUgQUlDcyBmcm9tIHRoZSBtb2RlbCBzaG93IHRoYXQgdGhlIE9MUyBiZXN0IGZpdCB0aGUgbW9kZWwuICAK