An extensive amount of data management is obscured from this document, goal is to inform code writing, figure generation, and etc. not to evaluate these actual data.

library(knitr)
library(tidyverse)
library(readxl)
library(rio)
library(broom)
library(GGally)
library(ggridges)
library(lme4)
library(modelr)
library(nlme)
library(ggrepel)
library(broom.mixed)
library(ggrepel)
library(ggpubr)
library(drc)
library(mgcv)
library(purrr)
library(ggpmisc)
library(equatiomatic)
library(marginaleffects)
library(modelsummary)
library(sjPlot)
library(emmeans)
library(magic)
library(lemon)

###! Tread Carefully Here !##
options(dplyr.summarise.inform=F)
### This turns off the tidyverse summarize/summarise messages indicating default grouping patterns in resultant tibbles ##
### If you don't know what this means, check out https://stackoverflow.com/questions/62140483/how-to-interpret-dplyr-message-summarise-regrouping-output-by-x-override
### Implications of this being false are unknown errors and impacts in other activities in this R session!

summary plots

cbcolors <- c(
  "PFOS" = "#999999", 
  "PFOA" = "#E69F00", 
  "PFHxS" = "#56B4E9",
  "PFHxA" = "#999933",
  "PFNA" = "#F0E442",
  "PFBS" = "#0072B2",
  "6:2 FTS" = "#D55E00",
  "8:2 FTS" = "#CC79A7"
)

notsampleddf <- data.frame(
  treatment=c(rep("PFBS",3),rep("PFNA",3)),
  Tissue=c(rep(c("Brain","Kidney","Liver"),2)),
  COMPOUND=c("NA"),
  mean=c(rep(10,3),rep(10000,3)),
  label="NA",
  Sex="M"
)
reposition_legend(
  ggplot(data=bigplotstacker3|>filter(inmixture=="yes", singletoncompound=="yes"), aes(x=Tissue, y=Concentration, fill=Sex)) +
    geom_dotplot(binaxis="y",  stackdir="center")+
    facet_wrap(~fct_relevel(treatment, "PFOS","PFOA","PFHxS","PFNA","8:2 FTS","PFBS","PFHxA","6:2 FTS"), scales="free_y", axes="all") +
  geom_text(data=notsampleddf, aes(y=mean, label=label), color="black", show.legend=F)+
    scale_y_log10(labels=scales::label_comma())+
    theme_classic(base_size = 20) +
    labs(y="Wholebody, liver, brain, or kidney (ng/g); serum (ng/mL)", x=NULL)+
    theme(axis.text=element_text(color="black"), strip.background=element_rect(fill="white",color="white",linewidth=1), strip.text=element_text(face="bold"), legend.text=element_text(size=20), legend.title=element_text(size=20)) +
    guides(fill=guide_legend(override.aes=list(size=15))),
  position='center', panel='panel-3-3')

ggplot(data=bigplotstacker3|>filter(inmixture=="yes", singletoncompound=="no"), aes(x=Tissue, y=Concentration, fill=COMPOUND)) +
  geom_dotplot(binaxis="y",  stackdir="center", dotsize=1)+
  facet_wrap(~treatment, scales="free_y", axes="all") +
  scale_y_log10(labels=scales::label_comma())+
  theme_classic(base_size = 20) +
  labs(y="Wholebody, liver, brain, or kidney (ng/g); serum (ng/mL)", fill="", x=NULL) +
  guides(fill=guide_legend(title="PFAS"))+
  #scale_color_manual(values=cbcolors)+
  scale_fill_manual(values=cbcolors) +
  theme(axis.text=element_text(color="black"), strip.background=element_rect(fill="white",color="white",linewidth=1), strip.text=element_text(face="bold"), legend.text=element_text(size=14), legend.position="bottom") +
  guides(fill=guide_legend(override.aes=list(size=12), nrow=1))

cbcolors2 <- c(
  "PFOS" = "#999999", 
  "PFOA" = "#E69F00", 
  "PFHxS" = "#56B4E9",
  "PFHxA" = "#999933",
  "PFNA" = "#F0E442",
  "PFBS" = "#0072B2",
  "6:2 FTS" = "#D55E00",
  "8:2 FTS" = "#CC79A7",
  
  "PFPeA"="#AA0DFE",
  "PFPeS"="#3283FE",
  "PFTeDA"="#85660D",
  "PFTrDA"="#782AB6",
  "PFUnA"="#565656",
  "PFDS"="#1C8356",
  "PFDoA"="#16FF32",
  "PFDoS"="#F7E1A0",
  "PFHpA"="#E2E2E2",
  "PFHpS"="#1CBE4F",
  "PFMBA"="#C4451C",
  "PFNS"="#DEA0FD",
  "7:3 FTCA"="#FE00FA",
  "4:2 FTS"="#009e73",
  "EtFOSAA"="#325A9B",
  "MeFOSAA"="#FEAF16",
  "N-EtFOSE"="#F8A19F",
  "N-MeFOSE"="#90AD1C",
  "PFBA"="#F6222E",
  "PFDA"="#1CFFCE"
)



bigplotstacker3 <- bigplotstacker3 |>
  mutate(
    logConcentration=log(Concentration),
    logDose=log(dose)
  )


sumplot2 <- ggplot(data=bigplotstacker3, aes(x=dose, y=Concentration, color=COMPOUND)) +
  geom_point(size=3, alpha=0.25) +
  geom_smooth(method="lm", formula=y~x, se=F, linewidth=2) +
  facet_wrap(~Tissue) +
  scale_y_log10(labels=scales::label_comma())+
  scale_x_log10(labels=scales::label_comma())+
  theme_classic(base_size = 22) +
  labs(y="Wholebody, liver, brain, or kidney (ng/g); serum (ng/mL)", caption="", x="Dose (mg/kg-d)") +
  scale_color_manual(values=cbcolors2) +
  theme(strip.background=element_rect(fill="white",color="white",linewidth=1)) #+
  #scale_fill_manual(values=cbcolors2)

reposition_legend(sumplot2, 'center', panel='panel-3-2')

reposition_legend(
ggplot(data=bigplotstacker3, aes(x=dose, y=Concentration, color=COMPOUND)) +
  geom_point(size=3, alpha=0.25) +
  geom_smooth(method="lm", formula=y~x, se=F, linewidth=2) +
  facet_wrap(~Tissue*Sex) +
  scale_y_log10(labels=scales::label_comma())+
  scale_x_log10(labels=scales::label_comma())+
  theme_classic(base_size = 22) +
  labs(y="Wholebody, liver, brain, or kidney (ng/g); serum (ng/mL)", caption=NULL, color=NULL,x="Dose (mg/kg-d)") +
  scale_color_manual(values=cbcolors2) +
  theme(strip.background=element_rect(fill="white",color="white",linewidth=1)),
 'center', panel='panel-4-3')

all tissues all mixture using broom

fullmixedmodelsdosebased <- bigplotstacker3|>filter(!is.na(logDose)) |>
  nest(data=-Tissue) |>
  mutate(
    fit=map(data, ~ lmer(logConcentration ~logDose+Sex+(logDose|COMPOUND), data=.x)),
    tidied=map(fit, tidy),
    glanced=map(fit, glance),
    augmented=map(fit, augment)
  )
## boundary (singular) fit: see help('isSingular')
fullmixedmodelsdosebased |>
  unnest(tidied) 
fullmixedmodelsdosebased |>
  unnest(tidied) |>
  dplyr::select(Tissue, effect, term, estimate, std.error)|>
  group_by(Tissue, effect, term) |>
  summarize(`Mean, SE`=paste(round(estimate,3),", ",round(std.error,3))) |>
  pivot_wider(names_from=c(effect,term), values_from=`Mean, SE`) 
fullmixedmodelsdosebased |>
  unnest(glanced) 
#fullmixedmodelsdosebased|>
#  unnest(augmented)



ggplot(data=fullmixedmodelsdosebased|>unnest(augmented) , aes(x=logConcentration, y=.fitted, color=COMPOUND, shape=Sex))+
  geom_point() +
  geom_abline(slope=1)+
  geom_abline(slope=1, intercept=-1, linetype="dashed")+
  geom_abline(slope=1, intercept=1, linetype="dashed")+
  facet_wrap(~Tissue) +
  theme_classic(base_size=18) +
  labs(y="Predicted ln(Tissue (ng/g) or serum (ng/mL))", x="Observed ln(Tissue (ng/g) or serum (ng/mL))")+
  scale_color_manual(values=cbcolors2)

ggplot(data=fullmixedmodelsdosebased|>unnest(augmented) , aes(x=logConcentration, y=.fitted, color=COMPOUND, shape=Sex))+
  geom_point() +
  geom_abline(slope=1)+
  geom_abline(slope=1, intercept=-1, linetype="dashed")+
  geom_abline(slope=1, intercept=1, linetype="dashed")+
  facet_wrap(~Tissue*Sex) +
  theme_classic(base_size=18) +
  labs(y="Predicted ln(Tissue (ng/g) or serum (ng/mL))", x="Observed ln(Tissue (ng/g) or serum (ng/mL))")+
  scale_color_manual(values=cbcolors2)

all tissues all mixed to get random effect param values

Whole Body

mixallWB <- lmer(logConcentration ~logDose+Sex+(logDose|COMPOUND), data = bigplotstacker3|>filter(Tissue=="Wholebody",!is.na(logConcentration)), REML=T)
summary(mixallWB)
## Linear mixed model fit by REML ['lmerMod']
## Formula: logConcentration ~ logDose + Sex + (logDose | COMPOUND)
##    Data: 
## filter(bigplotstacker3, Tissue == "Wholebody", !is.na(logConcentration))
## 
## REML criterion at convergence: 1493.6
## 
## Scaled residuals: 
##     Min      1Q  Median      3Q     Max 
## -6.9700 -0.3582  0.0128  0.4269  4.0496 
## 
## Random effects:
##  Groups   Name        Variance Std.Dev. Corr
##  COMPOUND (Intercept) 7.99624  2.8278       
##           logDose     0.04017  0.2004   0.88
##  Residual             0.22966  0.4792       
## Number of obs: 1010, groups:  COMPOUND, 11
## 
## Fixed effects:
##             Estimate Std. Error t value
## (Intercept)  7.67585    0.86576   8.866
## logDose      0.83113    0.06435  12.916
## SexM         0.31552    0.03031  10.409
## 
## Correlation of Fixed Effects:
##         (Intr) logDos
## logDose  0.870       
## SexM    -0.015  0.011
fixef(mixallWB)
## (Intercept)     logDose        SexM 
##   7.6758520   0.8311269   0.3155191
ranef(mixallWB)
## $COMPOUND
##         (Intercept)     logDose
## 6:2 FTS  -0.5043785 -0.19609479
## 8:2 FTS   1.4884508  0.05694876
## PFBS     -3.6437169 -0.30698430
## PFHpS     2.4612902  0.26647197
## PFHxA    -6.0778594 -0.27626678
## PFHxS     1.6868963  0.13368940
## PFNA      1.3178685  0.01177662
## PFNS      1.5408796  0.06594370
## PFOA      1.7498237  0.13916327
## PFOS      2.0978518  0.16504180
## PFPeS    -2.1171061 -0.05968965
## 
## with conditional variances for "COMPOUND"
coef(mixallWB) 
## $COMPOUND
##         (Intercept)   logDose      SexM
## 6:2 FTS    7.171474 0.6350321 0.3155191
## 8:2 FTS    9.164303 0.8880757 0.3155191
## PFBS       4.032135 0.5241426 0.3155191
## PFHpS     10.137142 1.0975989 0.3155191
## PFHxA      1.597993 0.5548602 0.3155191
## PFHxS      9.362748 0.9648163 0.3155191
## PFNA       8.993721 0.8429035 0.3155191
## PFNS       9.216732 0.8970706 0.3155191
## PFOA       9.425676 0.9702902 0.3155191
## PFOS       9.773704 0.9961687 0.3155191
## PFPeS      5.558746 0.7714373 0.3155191
## 
## attr(,"class")
## [1] "coef.mer"
mixallWB |>
  tidy() |>
  #dplyr::select(effect, term, estimate, std.error)|>
  group_by(effect, term) |>
  summarize(`Mean, SE`=paste(round(estimate,3),", ",round(std.error,3))) |>
  pivot_wider(names_from=c(effect,term), values_from=`Mean, SE`) 
extract_eq(mixallWB, use_coefs=F, mean_separate=T,
           intercept="beta",
           swap_var_names=c(
             "logDose"="ln(Dose, mg/kg-d)",
             "logConcentration"="ln(Whole Body, ng/g)",
             "Sex"="Sex"),
           swap_subscript_names=c(
             "M"="Male"
           ))

\[ \begin{aligned} \operatorname{ln(Whole\ Body,\ ng/g)}_{i} &\sim N \left(\mu, \sigma^2 \right) \\ \mu &=\alpha_{j[i]} + \beta_{1j[i]}(\operatorname{ln(Dose,\ mg/kg-d)}) + \beta_{2}(\operatorname{Sex}_{\operatorname{Male}}) \\ \left( \begin{array}{c} \begin{aligned} &\alpha_{j} \\ &\beta_{1j} \end{aligned} \end{array} \right) &\sim N \left( \left( \begin{array}{c} \begin{aligned} &\mu_{\alpha_{j}} \\ &\mu_{\beta_{1j}} \end{aligned} \end{array} \right) , \left( \begin{array}{cc} \sigma^2_{\alpha_{j}} & \rho_{\alpha_{j}\beta_{1j}} \\ \rho_{\beta_{1j}\alpha_{j}} & \sigma^2_{\beta_{1j}} \end{array} \right) \right) \text{, for COMPOUND j = 1,} \dots \text{,J} \end{aligned} \]

extract_eq(mixallWB, use_coefs=T, mean_separate=T, index_factors=T,
           intercept="beta",
           swap_var_names=c(
             "logDose"="ln(Dose, mg/kg-d)",
             "logConcentration"="ln(Whole Body, ng/g)",
             "Sex"="Sex"),
           swap_subscript_names=c(
             "M"="Male"
           ))

\[ \begin{aligned} \operatorname{\widehat{ln(Whole\ Body,\ ng/g)}}_{i} &\sim N \left(\mu, \sigma^2 \right) \\ \mu &=7.68_{\alpha_{j[i]}} + 0.83_{\beta_{1j[i]}}(\operatorname{ln(Dose,\ mg/kg-d)}) + 0.32_{\beta_{2}}(\operatorname{Sex}_{\operatorname{Male}}) \\ \left( \begin{array}{c} \begin{aligned} &\alpha_{j} \\ &\beta_{1j} \end{aligned} \end{array} \right) &\sim N \left( \left( \begin{array}{c} \begin{aligned} &0 \\ &0 \end{aligned} \end{array} \right) , \left( \begin{array}{cc} 2.83 & 0.88 \\ 0.88 & 0.2 \end{array} \right) \right) \text{, for COMPOUND j = 1,} \dots \text{,J} \end{aligned} \]

tab_model(mixallWB)
  logConcentration
Predictors Estimates CI p
(Intercept) 7.68 5.98 – 9.37 <0.001
logDose 0.83 0.70 – 0.96 <0.001
Sex [M] 0.32 0.26 – 0.38 <0.001
Random Effects
σ2 0.23
τ00 COMPOUND 8.00
τ11 COMPOUND.logDose 0.04
ρ01 COMPOUND 0.88
ICC 0.96
N COMPOUND 11
Observations 1010
Marginal R2 / Conditional R2 0.460 / 0.979
modelsummary(dvnames(mixallWB), 
             estimate="{estimate} [{conf.low}, {conf.high}]", 
             statistic=NULL,
             coef_rename=coef_rename)
logConcentration
(Intercept) 7.676 [5.977, 9.375]
logDose 0.831 [0.705, 0.957]
SexM 0.316 [0.256, 0.375]
SD (Intercept COMPOUND) 2.828
SD (logDose COMPOUND) 0.200
Cor (Intercept~logDose COMPOUND) 0.881
SD (Observations) 0.479
Num.Obs. 1010
R2 Marg. 0.460
R2 Cond. 0.979
AIC 1507.6
BIC 1542.0
ICC 1.0
RMSE 0.47
plot_predictions(mixallWB, condition=list("logDose","COMPOUND")) +
  theme_classic() +
  labs(y="Estimated logConcentration")

plot_predictions(mixallWB, condition=list("logDose","COMPOUND")) +
  facet_wrap(~COMPOUND)+
  theme_classic() +
  labs(y="Estimated logConcentration")

all tissues no mixture using broom

nonemixedmodelsdosebased <- bigplotstacker3|>filter(!is.na(logDose)) |>
  nest(data=-Tissue) |>
  mutate(
    fit=map(data, ~ lmer(logConcentration ~logDose+Sex+(1|COMPOUND), data=.x)),
    tidied=map(fit, tidy),
    glanced=map(fit, glance),
    augmented=map(fit, augment)
  )

nonemixedmodelsdosebased |>
  unnest(tidied) 
nonemixedmodelsdosebased |>
  unnest(tidied) |>
  dplyr::select(Tissue, effect, term, estimate, std.error)|>
  group_by(Tissue, effect, term) |>
  summarize(`Mean, SE`=paste(round(estimate,3),", ",round(std.error,3))) |>
  pivot_wider(names_from=c(effect,term), values_from=`Mean, SE`) 
nonemixedmodelsdosebased |>
  unnest(glanced) 
#nonemixedmodelsdosebased|>
#  unnest(augmented)


ggplot(data=nonemixedmodelsdosebased|>unnest(augmented) , aes(x=logConcentration, y=.fitted, color=COMPOUND, shape=Sex))+
  geom_point() +
  geom_abline(slope=1)+
  geom_abline(slope=1, intercept=-1, linetype="dashed")+
  geom_abline(slope=1, intercept=1, linetype="dashed")+
  facet_wrap(~Tissue) +
  theme_classic(base_size=18) +
  labs(y="Predicted ln(Tissue (ng/g) or serum (ng/mL))", x="Observed ln(Tissue (ng/g) or serum (ng/mL))")+
  scale_color_manual(values=cbcolors2)

ggplot(data=nonemixedmodelsdosebased|>unnest(augmented) , aes(x=logConcentration, y=.fitted, color=COMPOUND, shape=Sex))+
  geom_point() +
  geom_abline(slope=1)+
  geom_abline(slope=1, intercept=-1, linetype="dashed")+
  geom_abline(slope=1, intercept=1, linetype="dashed")+
  facet_wrap(~Tissue*Sex) +
  theme_classic(base_size=18) +
  labs(y="Predicted ln(Tissue (ng/g) or serum (ng/mL))", x="Observed ln(Tissue (ng/g) or serum (ng/mL))")+
  scale_color_manual(values=cbcolors2)

all tissues no mixed to get random effect param values

Whole Body

nomixallWB <- lmer(logConcentration ~logDose+Sex+(1|COMPOUND), data = bigplotstacker3|>filter(Tissue=="Wholebody",!is.na(logConcentration)), REML=T)
summary(nomixallWB)
## Linear mixed model fit by REML ['lmerMod']
## Formula: logConcentration ~ logDose + Sex + (1 | COMPOUND)
##    Data: 
## filter(bigplotstacker3, Tissue == "Wholebody", !is.na(logConcentration))
## 
## REML criterion at convergence: 1763.2
## 
## Scaled residuals: 
##     Min      1Q  Median      3Q     Max 
## -6.5698 -0.3434  0.0374  0.4403  5.7816 
## 
## Random effects:
##  Groups   Name        Variance Std.Dev.
##  COMPOUND (Intercept) 6.5691   2.5630  
##  Residual             0.3071   0.5541  
## Number of obs: 1010, groups:  COMPOUND, 11
## 
## Fixed effects:
##             Estimate Std. Error t value
## (Intercept) 7.716252   0.773705   9.973
## logDose     0.908548   0.008793 103.323
## SexM        0.326414   0.035007   9.324
## 
## Correlation of Fixed Effects:
##         (Intr) logDos
## logDose  0.033       
## SexM    -0.022  0.037
fixef(nomixallWB)
## (Intercept)     logDose        SexM 
##   7.7162521   0.9085479   0.3264141
ranef(nomixallWB)
## $COMPOUND
##         (Intercept)
## 6:2 FTS  -0.1624136
## 8:2 FTS   1.4996219
## PFBS     -3.7808041
## PFHpS     1.5836937
## PFHxA    -5.6084134
## PFHxS     1.5314868
## PFNA      1.4245553
## PFNS      1.5908916
## PFOA      1.4490210
## PFOS      1.9662436
## PFPeS    -1.4938828
## 
## with conditional variances for "COMPOUND"
coef(nomixallWB) 
## $COMPOUND
##         (Intercept)   logDose      SexM
## 6:2 FTS    7.553839 0.9085479 0.3264141
## 8:2 FTS    9.215874 0.9085479 0.3264141
## PFBS       3.935448 0.9085479 0.3264141
## PFHpS      9.299946 0.9085479 0.3264141
## PFHxA      2.107839 0.9085479 0.3264141
## PFHxS      9.247739 0.9085479 0.3264141
## PFNA       9.140807 0.9085479 0.3264141
## PFNS       9.307144 0.9085479 0.3264141
## PFOA       9.165273 0.9085479 0.3264141
## PFOS       9.682496 0.9085479 0.3264141
## PFPeS      6.222369 0.9085479 0.3264141
## 
## attr(,"class")
## [1] "coef.mer"
nomixallWB |> glance()
nomixallWB |>
  tidy() |>
  #dplyr::select(effect, term, estimate, std.error)|>
  group_by(effect, term) |>
  summarize(`Mean, SE`=paste(round(estimate,3),", ",round(std.error,3))) |>
  pivot_wider(names_from=c(effect,term), values_from=`Mean, SE`) 
extract_eq(nomixallWB, use_coefs=F, mean_separate=T,
           intercept="beta",
           swap_var_names=c(
             "logDose"="ln(Dose, mg/kg-d)",
             "logConcentration"="ln(Whole Body, ng/g)",
             "Sex"="Sex"),
           swap_subscript_names=c(
             "M"="Male"
           ))

\[ \begin{aligned} \operatorname{ln(Whole\ Body,\ ng/g)}_{i} &\sim N \left(\mu, \sigma^2 \right) \\ \mu &=\alpha_{j[i]} + \beta_{1}(\operatorname{ln(Dose,\ mg/kg-d)}) + \beta_{2}(\operatorname{Sex}_{\operatorname{Male}}) \\ \alpha_{j} &\sim N \left(\mu_{\alpha_{j}}, \sigma^2_{\alpha_{j}} \right) \text{, for COMPOUND j = 1,} \dots \text{,J} \end{aligned} \]

extract_eq(nomixallWB, use_coefs=T, mean_separate=T, index_factors=T,
           intercept="beta",
           swap_var_names=c(
             "logDose"="ln(Dose, mg/kg-d)",
             "logConcentration"="ln(Whole Body, ng/g)",
             "Sex"="Sex"),
           swap_subscript_names=c(
             "M"="Male"
           ))

\[ \begin{aligned} \operatorname{\widehat{ln(Whole\ Body,\ ng/g)}}_{i} &\sim N \left(\mu, \sigma^2 \right) \\ \mu &=7.72_{\alpha_{j[i]}} + 0.91_{\beta_{1}}(\operatorname{ln(Dose,\ mg/kg-d)}) + 0.33_{\beta_{2}}(\operatorname{Sex}_{\operatorname{Male}}) \\ \alpha_{j} &\sim N \left(0, 2.56 \right) \text{, for COMPOUND j = 1,} \dots \text{,J} \end{aligned} \]

tab_model(nomixallWB)
  logConcentration
Predictors Estimates CI p
(Intercept) 7.72 6.20 – 9.23 <0.001
logDose 0.91 0.89 – 0.93 <0.001
Sex [M] 0.33 0.26 – 0.40 <0.001
Random Effects
σ2 0.31
τ00 COMPOUND 6.57
ICC 0.96
N COMPOUND 11
Observations 1010
Marginal R2 / Conditional R2 0.464 / 0.976
modelsummary(dvnames(nomixallWB), 
             estimate="{estimate} [{conf.low}, {conf.high}]", 
             statistic=NULL,
             coef_rename=coef_rename)
logConcentration
(Intercept) 7.716 [6.198, 9.235]
logDose 0.909 [0.891, 0.926]
SexM 0.326 [0.258, 0.395]
SD (Intercept COMPOUND) 2.563
SD (Observations) 0.554
Num.Obs. 1010
R2 Marg. 0.464
R2 Cond. 0.976
AIC 1773.2
BIC 1797.8
ICC 1.0
RMSE 0.55
plot_predictions(nomixallWB, condition=list("logDose","COMPOUND")) +
  theme_classic() +
  labs(y="Estimated logConcentration")

plot_predictions(nomixallWB, condition=list("logDose","COMPOUND")) +
  facet_wrap(~COMPOUND)+
  theme_classic() +
  labs(y="Estimated logConcentration")

matrix(c(rownames(as.data.frame(coef(nomixallWB)$COMPOUND)),
         rep(" & ", NROW(coef(nomixallWB)$COMPOUND)),
         round(as.data.frame(coef(nomixallWB)$COMPOUND),2)[,1],
         rep(" \\", NROW(coef(nomixallWB)$COMPOUND))), ncol=4)
##       [,1]      [,2]  [,3]   [,4] 
##  [1,] "6:2 FTS" " & " "7.55" " \\"
##  [2,] "8:2 FTS" " & " "9.22" " \\"
##  [3,] "PFBS"    " & " "3.94" " \\"
##  [4,] "PFHpS"   " & " "9.3"  " \\"
##  [5,] "PFHxA"   " & " "2.11" " \\"
##  [6,] "PFHxS"   " & " "9.25" " \\"
##  [7,] "PFNA"    " & " "9.14" " \\"
##  [8,] "PFNS"    " & " "9.31" " \\"
##  [9,] "PFOA"    " & " "9.17" " \\"
## [10,] "PFOS"    " & " "9.68" " \\"
## [11,] "PFPeS"   " & " "6.22" " \\"
bmatrix = function(x, digits=NULL, ...) {
  library(xtable)
  default_args = list(include.colnames=FALSE, only.contents=TRUE,
                      include.rownames=FALSE, hline.after=NULL, comment=FALSE,
                      print.results=FALSE)
  passed_args = list(...)
  calling_args = c(list(x=xtable(x, digits=digits)),
                   c(passed_args,
                     default_args[setdiff(names(default_args), names(passed_args))]))
  cat("\\begin{bmatrix}\n",
      do.call(print.xtable, calling_args),
      "\\end{bmatrix}\n")
}

bmatrix(matrix(c(rownames(as.data.frame(coef(nomixallWB)$COMPOUND)),
         round(as.data.frame(coef(nomixallWB)$COMPOUND),2)[,1]), ncol=2))
## \begin{bmatrix}
##   6:2 FTS & 7.55 \\ 
##   8:2 FTS & 9.22 \\ 
##   PFBS & 3.94 \\ 
##   PFHpS & 9.3 \\ 
##   PFHxA & 2.11 \\ 
##   PFHxS & 9.25 \\ 
##   PFNA & 9.14 \\ 
##   PFNS & 9.31 \\ 
##   PFOA & 9.17 \\ 
##   PFOS & 9.68 \\ 
##   PFPeS & 6.22 \\ 
##    \end{bmatrix}

\[ \widehat{ln(Whole\ Body,\ ng/g)} \sim N (\mu, 0.55) \\ \mu =\begin{bmatrix} 6:2 FTS & 7.55 \\ 8:2 FTS & 9.22 \\ PFBS & 3.94 \\ PFHpS & 9.3 \\ PFHxA & 2.11 \\ PFHxS & 9.25 \\ PFNA & 9.14 \\ PFNS & 9.31 \\ PFOA & 9.17 \\ PFOS & 9.68 \\ PFPeS & 6.22 \\ \end{bmatrix} + 0.91(ln(Dose, mg/kg))+ 0.33(Sex_{M=1;F=0}) \]

Comes from:

$$ 
\widehat{ln(Whole\ Body,\ ng/g)}  \sim N (\mu, `r round(as.data.frame(VarCorr(nomixallWB))[2,5],2)`) \\
\mu =\begin{bmatrix}
  6:2 FTS & 7.55 \\ 
  8:2 FTS & 9.22 \\ 
  PFBS & 3.94 \\ 
  PFHpS & 9.3 \\ 
  PFHxA & 2.11 \\ 
  PFHxS & 9.25 \\ 
  PFNA & 9.14 \\ 
  PFNS & 9.31 \\ 
  PFOA & 9.17 \\ 
  PFOS & 9.68 \\ 
  PFPeS & 6.22 \\ 
   \end{bmatrix} + `r round(fixef(nomixallWB),2)[[2]]`(ln(Dose, mg/kg))+ `r round(fixef(nomixallWB),2)[[3]]`(Sex_{M=1;F=0})
$$

written “in line” in the .Rmd file.

LS0tDQp0aXRsZTogIlByZWRpY3Rpb24gb2YgQWRkaXRpdmUgUEZBUyBFeHBvc3VyZSBpbiBNaWNlIEV4YW1wbGUiDQphdXRob3I6ICJBbmRyZXcgRWFzdCINCmRhdGU6ICJgciBTeXMuRGF0ZSgpYCINCm91dHB1dDogDQogIGh0bWxfZG9jdW1lbnQ6DQogICAgZGZfcHJpbnQ6IHBhZ2VkDQogICAgdG9jOiB5ZXMNCiAgICB0b2NfZmxvYXQ6IHllcw0KICAgIGNvZGVfZm9sZGluZzogaGlkZQ0KICAgIGNvZGVfZG93bmxvYWQ6IHllcw0KLS0tDQoNCkFuIGV4dGVuc2l2ZSBhbW91bnQgb2YgZGF0YSBtYW5hZ2VtZW50IGlzIG9ic2N1cmVkIGZyb20gdGhpcyBkb2N1bWVudCwgZ29hbCBpcyB0byBpbmZvcm0gY29kZSB3cml0aW5nLCBmaWd1cmUgZ2VuZXJhdGlvbiwgYW5kIGV0Yy4gbm90IHRvIGV2YWx1YXRlIHRoZXNlIGFjdHVhbCBkYXRhLiAgDQoNCg0KYGBge3IsIG1lc3NhZ2U9Riwgd2FybmluZz1GfQ0KDQpsaWJyYXJ5KGtuaXRyKQ0KbGlicmFyeSh0aWR5dmVyc2UpDQpsaWJyYXJ5KHJlYWR4bCkNCmxpYnJhcnkocmlvKQ0KbGlicmFyeShicm9vbSkNCmxpYnJhcnkoR0dhbGx5KQ0KbGlicmFyeShnZ3JpZGdlcykNCmxpYnJhcnkobG1lNCkNCmxpYnJhcnkobW9kZWxyKQ0KbGlicmFyeShubG1lKQ0KbGlicmFyeShnZ3JlcGVsKQ0KbGlicmFyeShicm9vbS5taXhlZCkNCmxpYnJhcnkoZ2dyZXBlbCkNCmxpYnJhcnkoZ2dwdWJyKQ0KbGlicmFyeShkcmMpDQpsaWJyYXJ5KG1nY3YpDQpsaWJyYXJ5KHB1cnJyKQ0KbGlicmFyeShnZ3BtaXNjKQ0KbGlicmFyeShlcXVhdGlvbWF0aWMpDQpsaWJyYXJ5KG1hcmdpbmFsZWZmZWN0cykNCmxpYnJhcnkobW9kZWxzdW1tYXJ5KQ0KbGlicmFyeShzalBsb3QpDQpsaWJyYXJ5KGVtbWVhbnMpDQpsaWJyYXJ5KG1hZ2ljKQ0KbGlicmFyeShsZW1vbikNCg0KIyMjISBUcmVhZCBDYXJlZnVsbHkgSGVyZSAhIyMNCm9wdGlvbnMoZHBseXIuc3VtbWFyaXNlLmluZm9ybT1GKQ0KIyMjIFRoaXMgdHVybnMgb2ZmIHRoZSB0aWR5dmVyc2Ugc3VtbWFyaXplL3N1bW1hcmlzZSBtZXNzYWdlcyBpbmRpY2F0aW5nIGRlZmF1bHQgZ3JvdXBpbmcgcGF0dGVybnMgaW4gcmVzdWx0YW50IHRpYmJsZXMgIyMNCiMjIyBJZiB5b3UgZG9uJ3Qga25vdyB3aGF0IHRoaXMgbWVhbnMsIGNoZWNrIG91dCBodHRwczovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy82MjE0MDQ4My9ob3ctdG8taW50ZXJwcmV0LWRwbHlyLW1lc3NhZ2Utc3VtbWFyaXNlLXJlZ3JvdXBpbmctb3V0cHV0LWJ5LXgtb3ZlcnJpZGUNCiMjIyBJbXBsaWNhdGlvbnMgb2YgdGhpcyBiZWluZyBmYWxzZSBhcmUgdW5rbm93biBlcnJvcnMgYW5kIGltcGFjdHMgaW4gb3RoZXIgYWN0aXZpdGllcyBpbiB0aGlzIFIgc2Vzc2lvbiENCg0KDQpgYGANCg0KDQoNCmBgYHtyLCB3YXJuaW5nPUZBTFNFLCBpbmNsdWRlPUZBTFNFfQ0KDQpTR1NmaWxlcyA8LSBsaXN0LmZpbGVzKHBhdGg9IkM6L1VzZXJzL2Vhc3RhL0Rlc2t0b3AvUEZBUyBhZGRpdGl2aXR5IGluIG1pY2UvQW5hbHlzaXMvdGlzc3Vlc19jb3B5cmF3ZGF0YSIsDQogICAgICAgICAgICAgICAgICAgICAgIHBhdHRlcm49IioueGxzeCIsDQogICAgICAgICAgICAgICAgICAgICAgIHJlY3Vyc2l2ZT1ULA0KICAgICAgICAgICAgICAgICAgICAgICBmdWxsLm5hbWVzPVQpDQoNCkRhdGExIDwtIGltcG9ydF9saXN0KFNHU2ZpbGVzLCByYmluZD1ULCByYmluZF9maWxsPVQsIHJiaW5kX2xhYmVsPSJmaWxlIiwgY29sX25hbWVzPVQsbmE9IiIpIHw+DQogIGRwbHlyOjpzZWxlY3QoU0FNUExFX05PLEFYWVNfSUQsTEFCX0ZMQUcsQ09NUE9VTkQsQ09OQ19GT1VORCxVTklULGZpbGUpIHw+DQogIG11dGF0ZShVTklUPWZhY3RvcihVTklUKSwNCiAgICAgICAgIENPTVBPVU5EPWZhY3RvcihDT01QT1VORCkpIHw+DQogIGZpbHRlcighVU5JVCVpbiVjKCIlIFJlY292ZXJ5IikmU0FNUExFX05PIT0iTGFiIEJsYW5rIikgfD4gICNpbnNlcnQgTEFCX0ZMQUcgY29kZSByZWplY3Rpb25zIGhlcmUNCiAgIyB0aGVzZWFyZWZvcnBkcml2ZWZpbGVzb25seSBmaWx0ZXIoZmlsZSE9IlA6L1RveC9TRVJEUC1mdW5kZWQgcHJvamVjdHMvUEZBUyBtaXh0dXJlcyBtaWNlIGtlc3RyZWxzL1NHUyBBWFlTL0RhdGEvRlRQX2JhY2t1cC9OZXcgZm9sZGVyL1NHU0F4eXNfdGlzc3Vlc195ZWFyMl9iYXRjaC80NzI4IERQV0c5MDcwNCBXRzg5MzIzIFBGQVMvVjg5MzIzUEZBU19EYXRhYmFzZV9MNDEyNDRfMS54bHN4IikgfD4NCiAgIyB0aGVzZWFyZWZvcnBkcml2ZWZpbGVzb25seSBmaWx0ZXIoZmlsZSE9IlA6L1RveC9TRVJEUC1mdW5kZWQgcHJvamVjdHMvUEZBUyBtaXh0dXJlcyBtaWNlIGtlc3RyZWxzL1NHUyBBWFlTL0RhdGEvRlRQX2JhY2t1cC9OZXcgZm9sZGVyL1NHU0F4eXNfdGlzc3Vlc195ZWFyMl9iYXRjaC80NzI4IERQV0c5MDgwNSBXRzg5MzIyIFBGQVMvVjg5MzIyUEZBU19EYXRhYmFzZV9MNDEyNDRfMS54bHN4IikgfD4NCiAgIyB0aGVzZWFyZWZvcnBkcml2ZWZpbGVzb25seSBmaWx0ZXIoZmlsZSE9IlA6L1RveC9TRVJEUC1mdW5kZWQgcHJvamVjdHMvUEZBUyBtaXh0dXJlcyBtaWNlIGtlc3RyZWxzL1NHUyBBWFlTL0RhdGEvRlRQX2JhY2t1cC9OZXcgZm9sZGVyL1NHU0F4eXNfdGlzc3Vlc195ZWFyMl9iYXRjaC80NzI4IERQV0c5MDY4NiBXRzg5MzI0IFBGQVMvVjg5MzI0UEZBU19EYXRhYmFzZV9MNDEyNDRfMS54bHN4IikgfD4NCiAgIyB0aGVzZWFyZWZvcnBkcml2ZWZpbGVzb25seSBmaWx0ZXIoZmlsZSE9IlA6L1RveC9TRVJEUC1mdW5kZWQgcHJvamVjdHMvUEZBUyBtaXh0dXJlcyBtaWNlIGtlc3RyZWxzL1NHUyBBWFlTL0RhdGEvRlRQX2JhY2t1cC9OZXcgZm9sZGVyL1NHU0F4eXNfdGlzc3Vlc195ZWFyMl9iYXRjaC80NzI4IERQV0c5MDY1MSBXRzg5Njk5IFBGQVMvV0c4OTY5OVBGQVNfRGF0YWJhc2VfMS54bHN4IikgfD4NCiAgZHJvcGxldmVscygpDQoNCmtleWZpbGUgPC0gcmVhZF9jc3YoIkM6L1VzZXJzL2Vhc3RhL0Rlc2t0b3AvUEZBUyBhZGRpdGl2aXR5IGluIG1pY2UvQW5hbHlzaXMvbW91c2VtaXh0dXJlc2RhdGFrZXlzL3Rpc3N1ZWFuaW1hbGtleS5jc3YiKSANCg0KRGF0YTEgPC0gbWVyZ2UoRGF0YTEsIGtleWZpbGV8PmRwbHlyOjpzZWxlY3QoQW5pbWFsSUQsIFNBTVBMRV9OTyxUcmVhdG1lbnQsIHNhbXBsZXR5cGUsIHN0dWR5LFBGQVMsU2V4LFRpc3N1ZSksIGJ5PSJTQU1QTEVfTk8iKXw+DQogIG11dGF0ZSh0cmVhdG1lbnQ9ZmFjdG9yKFRyZWF0bWVudCwgbGV2ZWxzPWMoIlBGT1MiLCJQRk9BIiwiUEZIeFMiLCJQRkh4QSIsIlBGTkEiLCJQRkJTIiwiNjoyIEZUUyIsIjg6MiBGVFMiLCJDNi04IExvdyIsIkM2LTggTWVkaXVtIiwiQzYtOCBIaWdoIiwiRlRTIExvdyIsIkZUUyBNZWRpdW0iLCJGVFMgSGlnaCIsIkNvbnRyb2wiKSksDQogICAgICAgICBzYW1wbGV0eXBlPWZhY3RvcihzYW1wbGV0eXBlKSwNCiAgICAgICAgIHN0dWR5PWZhY3RvcihzdHVkeSksDQogICAgICAgICBzaW5nbGV0b25jb21wb3VuZD1jYXNlX3doZW4oDQogICAgICAgICAgIGFzLmNoYXJhY3Rlcih0cmVhdG1lbnQpPT1hcy5jaGFyYWN0ZXIoQ09NUE9VTkQpIH4gInllcyIsDQogICAgICAgICAgIFR+Im5vIiksDQogICAgICAgICBpbm1peHR1cmU9Y2FzZV93aGVuKA0KICAgICAgICAgICBzdHJfZGV0ZWN0KFBGQVMsYXMuY2hhcmFjdGVyKENPTVBPVU5EKSkgfiAieWVzIiwNCiAgICAgICAgICAgVH4ibm8iDQogICAgICAgICApKSB8Pg0KICBtdXRhdGUodmFsX3F1YWw9DQogICAgICAgICAgIGNhc2Vfd2hlbigNCiAgICAgICAgICAgICBpcy5uYShMQUJfRkxBRykgfiAicXVhbCIsDQogICAgICAgICAgICAgTEFCX0ZMQUc9PSJKIiB+ICJ0cmFjZSIsDQogICAgICAgICAgICAgTEFCX0ZMQUc9PSJIIiB+ICJlc3RpbWF0ZWQsIGZvciBpbmZvIG9ubHkiLA0KICAgICAgICAgICAgIExBQl9GTEFHPT0iSyIgfiAiYmFkLCBtYXhpbXVtIHBvc3NpYmxlIHJlcG9ydGVkIiwNCiAgICAgICAgICAgICBMQUJfRkxBRz09IlUiIH4gIm5vbmRldGVjdCIsDQogICAgICAgICAgICAgTEFCX0ZMQUc9PSJEIiB+ICJxdWFsIHZpYSBkaWx1dGlvbiIsDQogICAgICAgICAgICAgTEFCX0ZMQUc9PSJYIiB+ICJpZ25vcmUiLA0KICAgICAgICAgICAgIExBQl9GTEFHPT0iRCBKIiB+ICJ0cmFjZSB2aWEgZGlsdXRpb24iLA0KICAgICAgICAgICAgIExBQl9GTEFHPT0iSyBKIiB+ICJtYXggcG9zc2libGUsIHRyYWNlIiwNCiAgICAgICAgICAgICBMQUJfRkxBRz09IksgRCBKIiB+ICJtYXggcG9zc2libGUsIHRyYWNlLCB2aWEgZGlsdXRpb24iLA0KICAgICAgICAgICAgIExBQl9GTEFHPT0iVSBEIiB+ICJub25kZXRlY3QgdmlhIGRpbHV0aW9uIiwNCiAgICAgICAgICAgICBMQUJfRkxBRz09IlUgRCBIIiB+ICJub25kZXRlY3QgdmlhIGRpbHV0aW9uLCBmb3IgaW5mbyBvbmx5IiwNCiAgICAgICAgICAgICBMQUJfRkxBRz09IlUgSCIgfiAibm9uIGRldGVjdCBmb3IgaW5mbyBvbmx5IiwNCiAgICAgICAgICAgICBMQUJfRkxBRz09IkQgSCIgfiAiZXN0aW1hdGVkLCBvdmVyIiwNCiAgICAgICAgICAgICBUIH4gIm90aGVyLCBub25xdWFsIg0KICAgICAgICAgICApDQogICkNCg0KDQpgYGANCg0KDQpgYGB7ciBpbmNsdWRlPUZBTFNFfQ0KDQpEYXRhMWIgPC0gaW1wb3J0X2xpc3QoU0dTZmlsZXMsIHJiaW5kPVQsIHJiaW5kX2ZpbGw9VCwgcmJpbmRfbGFiZWw9ImZpbGUiLCBjb2xfbmFtZXM9VCxuYT0iIikgfD4NCiAgZHBseXI6OnNlbGVjdChTQU1QTEVfTk8sQVhZU19JRCxMQUJfRkxBRyxDT01QT1VORCxDT05DX0ZPVU5ELERFVEVDVElPTl9MSU1JVCxVTklULGZpbGUpIHw+DQogIG11dGF0ZShVTklUPWZhY3RvcihVTklUKSwNCiAgICAgICAgIENPTVBPVU5EPWZhY3RvcihDT01QT1VORCkpIHw+DQogIGZpbHRlcighVU5JVCVpbiVjKCIlIFJlY292ZXJ5IikmU0FNUExFX05PIT0iTGFiIEJsYW5rIikgfD4gICNpbnNlcnQgTEFCX0ZMQUcgY29kZSByZWplY3Rpb25zIGhlcmUNCiAgIyB0aGVzZWFyZWZvcnBkcml2ZWZpbGVzb25seSBmaWx0ZXIoZmlsZSE9IlA6L1RveC9TRVJEUC1mdW5kZWQgcHJvamVjdHMvUEZBUyBtaXh0dXJlcyBtaWNlIGtlc3RyZWxzL1NHUyBBWFlTL0RhdGEvRlRQX2JhY2t1cC9OZXcgZm9sZGVyL1NHU0F4eXNfdGlzc3Vlc195ZWFyMl9iYXRjaC80NzI4IERQV0c5MDcwNCBXRzg5MzIzIFBGQVMvVjg5MzIzUEZBU19EYXRhYmFzZV9MNDEyNDRfMS54bHN4IikgfD4NCiAgIyB0aGVzZWFyZWZvcnBkcml2ZWZpbGVzb25seSBmaWx0ZXIoZmlsZSE9IlA6L1RveC9TRVJEUC1mdW5kZWQgcHJvamVjdHMvUEZBUyBtaXh0dXJlcyBtaWNlIGtlc3RyZWxzL1NHUyBBWFlTL0RhdGEvRlRQX2JhY2t1cC9OZXcgZm9sZGVyL1NHU0F4eXNfdGlzc3Vlc195ZWFyMl9iYXRjaC80NzI4IERQV0c5MDgwNSBXRzg5MzIyIFBGQVMvVjg5MzIyUEZBU19EYXRhYmFzZV9MNDEyNDRfMS54bHN4IikgfD4NCiAgIyB0aGVzZWFyZWZvcnBkcml2ZWZpbGVzb25seSBmaWx0ZXIoZmlsZSE9IlA6L1RveC9TRVJEUC1mdW5kZWQgcHJvamVjdHMvUEZBUyBtaXh0dXJlcyBtaWNlIGtlc3RyZWxzL1NHUyBBWFlTL0RhdGEvRlRQX2JhY2t1cC9OZXcgZm9sZGVyL1NHU0F4eXNfdGlzc3Vlc195ZWFyMl9iYXRjaC80NzI4IERQV0c5MDY4NiBXRzg5MzI0IFBGQVMvVjg5MzI0UEZBU19EYXRhYmFzZV9MNDEyNDRfMS54bHN4IikgfD4NCiAgIyB0aGVzZWFyZWZvcnBkcml2ZWZpbGVzb25seSBmaWx0ZXIoZmlsZSE9IlA6L1RveC9TRVJEUC1mdW5kZWQgcHJvamVjdHMvUEZBUyBtaXh0dXJlcyBtaWNlIGtlc3RyZWxzL1NHUyBBWFlTL0RhdGEvRlRQX2JhY2t1cC9OZXcgZm9sZGVyL1NHU0F4eXNfdGlzc3Vlc195ZWFyMl9iYXRjaC80NzI4IERQV0c5MDY1MSBXRzg5Njk5IFBGQVMvV0c4OTY5OVBGQVNfRGF0YWJhc2VfMS54bHN4IikgfD4NCiAgZHJvcGxldmVscygpDQoNCkRhdGExYiA8LSBtZXJnZShEYXRhMWIsIGtleWZpbGV8PmRwbHlyOjpzZWxlY3QoQW5pbWFsSUQsIFNBTVBMRV9OTyxUcmVhdG1lbnQsIHNhbXBsZXR5cGUsIHN0dWR5LFBGQVMsU2V4LFRpc3N1ZSksIGJ5PSJTQU1QTEVfTk8iKXw+DQogIG11dGF0ZSh0cmVhdG1lbnQ9ZmFjdG9yKFRyZWF0bWVudCwgbGV2ZWxzPWMoIlBGT1MiLCJQRk9BIiwiUEZIeFMiLCJQRkh4QSIsIlBGTkEiLCJQRkJTIiwiNjoyIEZUUyIsIjg6MiBGVFMiLCJDNi04IExvdyIsIkM2LTggTWVkaXVtIiwiQzYtOCBIaWdoIiwiRlRTIExvdyIsIkZUUyBNZWRpdW0iLCJGVFMgSGlnaCIsIkNvbnRyb2wiKSksDQogICAgICAgICBzYW1wbGV0eXBlPWZhY3RvcihzYW1wbGV0eXBlKSwNCiAgICAgICAgIHN0dWR5PWZhY3RvcihzdHVkeSksDQogICAgICAgICBzaW5nbGV0b25jb21wb3VuZD1jYXNlX3doZW4oDQogICAgICAgICAgIGFzLmNoYXJhY3Rlcih0cmVhdG1lbnQpPT1hcy5jaGFyYWN0ZXIoQ09NUE9VTkQpIH4gInllcyIsDQogICAgICAgICAgIFR+Im5vIiksDQogICAgICAgICBpbm1peHR1cmU9Y2FzZV93aGVuKA0KICAgICAgICAgICBzdHJfZGV0ZWN0KFBGQVMsYXMuY2hhcmFjdGVyKENPTVBPVU5EKSkgfiAieWVzIiwNCiAgICAgICAgICAgVH4ibm8iDQogICAgICAgICApKSB8Pg0KICBtdXRhdGUodmFsX3F1YWw9DQogICAgICAgICAgIGNhc2Vfd2hlbigNCiAgICAgICAgICAgICBpcy5uYShMQUJfRkxBRykgfiAicXVhbCIsDQogICAgICAgICAgICAgTEFCX0ZMQUc9PSJKIiB+ICJ0cmFjZSIsDQogICAgICAgICAgICAgTEFCX0ZMQUc9PSJIIiB+ICJlc3RpbWF0ZWQsIGZvciBpbmZvIG9ubHkiLA0KICAgICAgICAgICAgIExBQl9GTEFHPT0iSyIgfiAiYmFkLCBtYXhpbXVtIHBvc3NpYmxlIHJlcG9ydGVkIiwNCiAgICAgICAgICAgICBMQUJfRkxBRz09IlUiIH4gIm5vbmRldGVjdCIsDQogICAgICAgICAgICAgTEFCX0ZMQUc9PSJEIiB+ICJxdWFsIHZpYSBkaWx1dGlvbiIsDQogICAgICAgICAgICAgTEFCX0ZMQUc9PSJYIiB+ICJpZ25vcmUiLA0KICAgICAgICAgICAgIExBQl9GTEFHPT0iRCBKIiB+ICJ0cmFjZSB2aWEgZGlsdXRpb24iLA0KICAgICAgICAgICAgIExBQl9GTEFHPT0iSyBKIiB+ICJtYXggcG9zc2libGUsIHRyYWNlIiwNCiAgICAgICAgICAgICBMQUJfRkxBRz09IksgRCBKIiB+ICJtYXggcG9zc2libGUsIHRyYWNlLCB2aWEgZGlsdXRpb24iLA0KICAgICAgICAgICAgIExBQl9GTEFHPT0iVSBEIiB+ICJub25kZXRlY3QgdmlhIGRpbHV0aW9uIiwNCiAgICAgICAgICAgICBMQUJfRkxBRz09IlUgRCBIIiB+ICJub25kZXRlY3QgdmlhIGRpbHV0aW9uLCBmb3IgaW5mbyBvbmx5IiwNCiAgICAgICAgICAgICBMQUJfRkxBRz09IlUgSCIgfiAibm9uIGRldGVjdCBmb3IgaW5mbyBvbmx5IiwNCiAgICAgICAgICAgICBMQUJfRkxBRz09IkQgSCIgfiAiZXN0aW1hdGVkLCBvdmVyIiwNCiAgICAgICAgICAgICBUIH4gIm90aGVyLCBub25xdWFsIg0KICAgICAgICAgICApDQogICkNCg0KDQoNCg0KYGBgDQoNCg0KDQpgYGB7ciwgd2FybmluZz1GLCBpbmNsdWRlPUZ9DQoNClNHU2ZpbGVzMiA8LSBsaXN0LmZpbGVzKHBhdGg9IkM6L1VzZXJzL2Vhc3RhL0Rlc2t0b3AvUEZBUyBhZGRpdGl2aXR5IGluIG1pY2UvQW5hbHlzaXMvd2F0ZXJ3aG9sZWJvZHlzZXJ1bV9jb3B5cmF3ZGF0YSIsDQogICAgICAgICAgICAgICAgICAgICAgIHBhdHRlcm49IioueGxzeCIsDQogICAgICAgICAgICAgICAgICAgICAgIHJlY3Vyc2l2ZT1ULA0KICAgICAgICAgICAgICAgICAgICAgICBmdWxsLm5hbWVzPVQpDQoNCkRhdGExMiA8LSBpbXBvcnRfbGlzdChTR1NmaWxlczIsIHJiaW5kPVQsIHJiaW5kX2ZpbGw9VCwgcmJpbmRfbGFiZWw9ImZpbGUiLCBjb2xfbmFtZXM9VCxuYT0iIikgfD4NCiAgZHBseXI6OnNlbGVjdChTQU1QTEVfTk8sQVhZU19JRCxMQUJfRkxBRyxDT01QT1VORCxDT05DX0ZPVU5ELFVOSVQsZmlsZSkgfD4NCiAgYmluZF9yb3dzKCkgfD4NCiAgbXV0YXRlKFVOSVQ9ZmFjdG9yKFVOSVQpLA0KICAgICAgICAgQ09NUE9VTkQ9ZmFjdG9yKENPTVBPVU5EKSkgfD4NCiAgZmlsdGVyKCFVTklUJWluJWMoIiUgUmVjb3ZlcnkiKSZTQU1QTEVfTk8hPSJMYWIgQmxhbmsiKSB8PiAgI2luc2VydCBMQUJfRkxBRyBjb2RlIHJlamVjdGlvbnMgaGVyZQ0KICAjIHRoZXNlYXJlZm9ycGRyaXZlZmlsZXNvbmx5IGZpbHRlcihmaWxlIT0iUDovVG94L1NFUkRQLWZ1bmRlZCBwcm9qZWN0cy9QRkFTIG1peHR1cmVzIG1pY2Uga2VzdHJlbHMvU0dTIEFYWVMvRGF0YS9GVFBfYmFja3VwLzQ3MjggRFBXRzg3MDA0IFdHODUwOTYgUEZBUy9WODUwOTZQRkFTX0RhdGFiYXNlXzEueGxzeCIpIHw+DQogICMgdGhlc2VhcmVmb3JwZHJpdmVmaWxlc29ubHkgZmlsdGVyKGZpbGUhPSJQOi9Ub3gvU0VSRFAtZnVuZGVkIHByb2plY3RzL1BGQVMgbWl4dHVyZXMgbWljZSBrZXN0cmVscy9TR1MgQVhZUy9EYXRhL0ZUUF9iYWNrdXAvNDcyOCBEUFdHODY0NDYgV0c4NTE5OSBQRkFTIEVYVEQvVjg1MTk5UEZBUy1FWFREX0RhdGFiYXNlXzEueGxzeCIpIHw+DQogICMgdGhlc2VhcmVmb3JwZHJpdmVmaWxlc29ubHkgZmlsdGVyKGZpbGUhPSJQOi9Ub3gvU0VSRFAtZnVuZGVkIHByb2plY3RzL1BGQVMgbWl4dHVyZXMgbWljZSBrZXN0cmVscy9TR1MgQVhZUy9EYXRhL0ZUUF9iYWNrdXAvNDcyOCBEUFdHODY0NTIgV0c4NTIwMCBQRkFTIEVYVEQvVjg1MjAwUEZBUy1FWFREX0RhdGFiYXNlXzEueGxzeCIpIHw+DQogICMgdGhlc2VhcmVmb3JwZHJpdmVmaWxlc29ubHkgZmlsdGVyKGZpbGUhPSJQOi9Ub3gvU0VSRFAtZnVuZGVkIHByb2plY3RzL1BGQVMgbWl4dHVyZXMgbWljZSBrZXN0cmVscy9TR1MgQVhZUy9EYXRhL0ZUUF9iYWNrdXAvNDcyOCBEUFdHODY0NTUgV0c4NTIwMSBQRkFTIEVYVEQvVjg1MjAxUEZBUy1FWFREX0RhdGFiYXNlXzIueGxzeCIpIHw+DQogICMgdGhlc2VhcmVmb3JwZHJpdmVmaWxlc29ubHkgZmlsdGVyKGZpbGUhPSJQOi9Ub3gvU0VSRFAtZnVuZGVkIHByb2plY3RzL1BGQVMgbWl4dHVyZXMgbWljZSBrZXN0cmVscy9TR1MgQVhZUy9EYXRhL0ZUUF9iYWNrdXAvNDcyOCBEUFdHODY4ODUgV0c4NTA1MSBQRkFTL1Y4NTA1MVBGQVNfRGF0YWJhc2VfMS54bHN4IikgfD4NCiAgIyB0aGVzZWFyZWZvcnBkcml2ZWZpbGVzb25seSBmaWx0ZXIoZmlsZSE9IlA6L1RveC9TRVJEUC1mdW5kZWQgcHJvamVjdHMvUEZBUyBtaXh0dXJlcyBtaWNlIGtlc3RyZWxzL1NHUyBBWFlTL0RhdGEvRlRQX2JhY2t1cC80NzI4IERQV0c4Njk1MCBXRzg1MDUyIFBGQVMvVjg1MDUyUEZBU19EYXRhYmFzZV8xLnhsc3giKSB8Pg0KICAjIHRoZXNlYXJlZm9ycGRyaXZlZmlsZXNvbmx5IGZpbHRlcihmaWxlIT0iUDovVG94L1NFUkRQLWZ1bmRlZCBwcm9qZWN0cy9QRkFTIG1peHR1cmVzIG1pY2Uga2VzdHJlbHMvU0dTIEFYWVMvRGF0YS9GVFBfYmFja3VwLzQ3MjggRFBXRzg2ODc4IFdHODUwODMgUEZBUy9WODUwODNQRkFTX0RhdGFiYXNlXzEueGxzeCIpIHw+DQogIGRyb3BsZXZlbHMoKQ0KDQprZXlmaWxlMiA8LSByZWFkX2V4Y2VsKCJDOi9Vc2Vycy9lYXN0YS9EZXNrdG9wL1BGQVMgYWRkaXRpdml0eSBpbiBtaWNlL0FuYWx5c2lzL21vdXNlbWl4dHVyZXNkYXRha2V5cy9EYXRhX0tleS54bHN4Iiwgc2hlZXQ9IlNoZWV0MSIpIA0KDQpEYXRhMTIgPC0gbWVyZ2UoRGF0YTEyLCBrZXlmaWxlMnw+ZHBseXI6OnNlbGVjdChhbmltYWxudW1iZXJvbmx5LCBTQU1QTEVfTk8sdHJlYXRtZW50LCBzYW1wbGV0eXBlLCBzdHVkeSxQRkFTLHNleCksIGJ5PSJTQU1QTEVfTk8iKXw+DQogIG11dGF0ZSh0cmVhdG1lbnQ9ZmFjdG9yKHRyZWF0bWVudCwgbGV2ZWxzPWMoIlBGT1MiLCJQRk9BIiwiUEZIeFMiLCJQRkh4QSIsIlBGTkEiLCJQRkJTIiwiNjoyIEZUUyIsIjg6MiBGVFMiLCJDNjhMT1ciLCJDNjhNRUQiLCJDNjhISUdIIiwiRlRTTE9XIiwiRlRTTUVEIiwiRlRTSElHSCIsIkNvbnRyb2wiKSksDQogICAgICAgICBzYW1wbGV0eXBlPWZhY3RvcihzYW1wbGV0eXBlKSwNCiAgICAgICAgIHN0dWR5PWZhY3RvcihzdHVkeSksDQogICAgICAgICBzaW5nbGV0b25jb21wb3VuZD1jYXNlX3doZW4oDQogICAgICAgICAgIGFzLmNoYXJhY3Rlcih0cmVhdG1lbnQpPT1hcy5jaGFyYWN0ZXIoQ09NUE9VTkQpIH4gInllcyIsDQogICAgICAgICAgIFR+Im5vIiksDQogICAgICAgICBpbm1peHR1cmU9Y2FzZV93aGVuKA0KICAgICAgICAgICBzdHJfZGV0ZWN0KFBGQVMsYXMuY2hhcmFjdGVyKENPTVBPVU5EKSkgfiAieWVzIiwNCiAgICAgICAgICAgVH4ibm8iDQogICAgICAgICApKSB8Pg0KICBtdXRhdGUodmFsX3F1YWw9DQogICAgICAgICAgIGNhc2Vfd2hlbigNCiAgICAgICAgICAgICBpcy5uYShMQUJfRkxBRykgfiAicXVhbCIsDQogICAgICAgICAgICAgTEFCX0ZMQUc9PSJKIiB+ICJ0cmFjZSIsDQogICAgICAgICAgICAgTEFCX0ZMQUc9PSJIIiB+ICJlc3RpbWF0ZWQiLA0KICAgICAgICAgICAgIExBQl9GTEFHPT0iSyIgfiAiYmFkLCBtYXhpbXVtIHBvc3NpYmxlIHJlcG9ydGVkIiwNCiAgICAgICAgICAgICBMQUJfRkxBRz09IlUiIH4gIm5vbmRldGVjdCIsDQogICAgICAgICAgICAgTEFCX0ZMQUc9PSJEIiB+ICJxdWFsIHZpYSBkaWx1dGlvbiIsDQogICAgICAgICAgICAgTEFCX0ZMQUc9PSJYIiB+ICJpZ25vcmUiLA0KICAgICAgICAgICAgIExBQl9GTEFHPT0iRCBKIiB+ICJ0cmFjZSB2aWEgZGlsdXRpb24iLA0KICAgICAgICAgICAgIExBQl9GTEFHPT0iRCBIIiZzdHVkeSE9InNlcnVtIiZzYW1wbGV0eXBlIT0ic2VydW0iJnRyZWF0bWVudCE9IjY6MiBGVFMiJkNPTVBPVU5EIT0iNjoyIEZUUyIgfiAiZXN0aW1hdGVkLCBvdmVyIiwNCiAgICAgICAgICAgICBzdHVkeT09InNlcnVtIiZzYW1wbGV0eXBlPT0ic2VydW0iJnRyZWF0bWVudD09IkM2OE1FRCImQ09NUE9VTkQ9PSJQRkh4UyImTEFCX0ZMQUc9PSJEIEgiJnN0cl9kZXRlY3QoQVhZU19JRCwiMiQiKSB+ICJxdWFsLCBvdmVyIiwNCiAgICAgICAgICAgICBzdHVkeT09InNlcnVtIiZzYW1wbGV0eXBlPT0ic2VydW0iJnRyZWF0bWVudD09IkM2OE1FRCImQ09NUE9VTkQ9PSJQRkh4UyImTEFCX0ZMQUc9PSJEIEgiJiFzdHJfZGV0ZWN0KEFYWVNfSUQsIjIkIikgfiAiZXN0aW1hdGVkLCBvdmVyIiwNCiAgICAgICAgICAgICBzdHVkeT09InNlcnVtIiZzYW1wbGV0eXBlPT0ic2VydW0iJnRyZWF0bWVudD09IjY6MiBGVFMiJkNPTVBPVU5EPT0iNjoyIEZUUyImTEFCX0ZMQUc9PSJEIEgiIH4gInF1YWwsIG92ZXIiLA0KICAgICAgICAgICAgIFQgfiAib3RoZXIsIG5vbnF1YWwiDQogICAgICAgICAgICkNCiAgKQ0KDQoNCg0KRGF0YTEycXVhbGlzaCA8LSBEYXRhMTIgfD4NCiAgZmlsdGVyKHZhbF9xdWFsJWluJWMoInF1YWwiLCJ0cmFjZSIsInF1YWwgdmlhIGRpbHV0aW9uIiwidHJhY2UgdmlhIGRpbHV0aW9uIiwicXVhbCwgb3ZlciIpfA0KICAgICAgICAgICAodmFsX3F1YWw9PSJlc3RpbWF0ZWQiJnN0dWR5PT0id2hvbGVib2R5IiZzYW1wbGV0eXBlPT0id2hvbGVib2R5IiZ0cmVhdG1lbnQ9PSJQRk9BIiZDT01QT1VORD09IlBGT0EiKXwNCiAgICAgICAgICAgKHZhbF9xdWFsPT0iZXN0aW1hdGVkIiZzdHVkeT09InNlcnVtIiZzYW1wbGV0eXBlPT0ic2VydW0iJnRyZWF0bWVudD09IlBGSHhTIiZDT01QT1VORD09IlBGSHhTIil8DQogICAgICAgICAgICh2YWxfcXVhbD09ImVzdGltYXRlZCwgb3ZlciImc3R1ZHk9PSJ3aG9sZWJvZHkiJnNhbXBsZXR5cGU9PSJ3aG9sZWJvZHkiJnRyZWF0bWVudD09IlBGTkEiJkNPTVBPVU5EPT0iUEZOQSIpfA0KICAgICAgICAgICAodmFsX3F1YWw9PSJlc3RpbWF0ZWQsIG92ZXIiJnN0dWR5PT0id2hvbGVib2R5IiZzYW1wbGV0eXBlPT0id2hvbGVib2R5IiZ0cmVhdG1lbnQ9PSJQRk9TIiZDT01QT1VORD09IlBGT1MiKXwNCiAgICAgICAgICAgKHZhbF9xdWFsPT0iZXN0aW1hdGVkLCBvdmVyIiZzdHVkeT09InNlcnVtIiZzYW1wbGV0eXBlPT0ic2VydW0iJnRyZWF0bWVudD09IkM2OE1FRCImQ09NUE9VTkQ9PSJQRkh4UyImc3RyX2RldGVjdChBWFlTX0lELCIyJCIpKXwNCiAgICAgICAgICAgKHZhbF9xdWFsPT0iZXN0aW1hdGVkLCBvdmVyIiZzdHVkeT09Indob2xlYm9keSImc2FtcGxldHlwZT09Indob2xlYm9keSImdHJlYXRtZW50PT0iQzY4TUVEIiZDT01QT1VORD09IlBGSHhTIil8DQogICAgICAgICAgICh2YWxfcXVhbD09ImVzdGltYXRlZCwgb3ZlciImc3R1ZHk9PSJzZXJ1bSImc2FtcGxldHlwZT09InNlcnVtIiZ0cmVhdG1lbnQ9PSJDNjhNRUQiJkNPTVBPVU5EPT0iUEZPUyIpfA0KICAgICAgICAgICAodmFsX3F1YWw9PSJlc3RpbWF0ZWQsIG92ZXIiJnN0dWR5PT0id2hvbGVib2R5IiZzYW1wbGV0eXBlPT0id2hvbGVib2R5IiYodHJlYXRtZW50PT0iQzY4TE9XInx0cmVhdG1lbnQ9PSJDNjhNRUQifHRyZWF0bWVudD09IkM2OEhJR0gifHRyZWF0bWVudD09IkZUU0xPVyJ8dHJlYXRtZW50PT0iRlRTTUVEInx0cmVhdG1lbnQ9PSJGVFNISUdIIikmQ09NUE9VTkQ9PSJQRk9TIikNCiAgKQ0KDQojIyMjIyMjIyMjIG5ldyBzdHVmZiBvbiAxMkpVTDIwMjQNCg0Kc2VydW1kYXRhIDwtIERhdGExMnF1YWxpc2ggfD4NCiAgdW5ncm91cCgpIHw+DQogIGRyb3BsZXZlbHMoKSB8Pg0KICBmaWx0ZXIoc2FtcGxldHlwZT09InNlcnVtIikgfD4NCiAgI2ZpbHRlcihpbm1peHR1cmU9PSJ5ZXMifHRyZWF0bWVudD09IkNvbnRyb2wiKSB8Pg0KICBtdXRhdGUoDQogICAgdHJlYXRtZW50PWNhc2Vfd2hlbigNCiAgICB0cmVhdG1lbnQ9PSJDNjhMT1ciIH4gIkM2LTggTG93IiwNCiAgICB0cmVhdG1lbnQ9PSJDNjhNRUQiIH4gIkM2LTggTWVkaXVtIiwNCiAgICB0cmVhdG1lbnQ9PSJDNjhISUdIIiB+ICJDNi04IEhpZ2giLA0KICAgIHRyZWF0bWVudD09IkZUU0xPVyIgfiAiRlRTIExvdyIsDQogICAgdHJlYXRtZW50PT0iRlRTTUVEIiB+ICJGVFMgTWVkaXVtIiwNCiAgICB0cmVhdG1lbnQ9PSJGVFNISUdIIiB+ICJGVFMgSGlnaCIsDQogICAgVCB+IHRyZWF0bWVudA0KICApIA0KICApIHw+DQogIHJlbmFtZShBbmltYWxJRD1hbmltYWxudW1iZXJvbmx5KSB8Pg0KICBkcGx5cjo6c2VsZWN0KEFuaW1hbElELHNleCx0cmVhdG1lbnQsQ09NUE9VTkQsQ09OQ19GT1VORCxzYW1wbGV0eXBlLHNpbmdsZXRvbmNvbXBvdW5kLGlubWl4dHVyZSx2YWxfcXVhbCkgfD4gICMgaW5jbHVkZSBmbGFncyBpbiBzZWxlY3Q/DQogIG11dGF0ZShzYW1wbGV0eXBlPWFzLmNoYXJhY3RlcihzYW1wbGV0eXBlKSwNCiAgICAgICAgIENPTVBPVU5EPWFzLmNoYXJhY3RlcihDT01QT1VORCkpfD4NCiAgZHJvcGxldmVscygpIHw+DQogIHVuZ3JvdXAoKQ0KDQp3YXRlcmRhdGEgPC0gRGF0YTEycXVhbGlzaCB8Pg0KICAjZmlsdGVyKGlubWl4dHVyZT09InllcyJ8KHRyZWF0bWVudD09IkNvbnRyb2wiKSkgfD4NCiAgZHJvcGxldmVscygpIHw+DQogIGdyb3VwX2J5KHNhbXBsZXR5cGUsc3R1ZHksQ09NUE9VTkQsdHJlYXRtZW50KSB8Pg0KICBtdXRhdGUoQ09OQ19GT1VORD1jYXNlX3doZW4oDQogICAgc2FtcGxldHlwZT09IndhdGVyIn4obWVhbihDT05DX0ZPVU5ELCBuYS5ybT1UKS8xZTgpLA0KICAgIHNhbXBsZXR5cGU9PSJ3aG9sZWJvZHkifihtZWFuKENPTkNfRk9VTkQsIG5hLnJtPVQpKSwNCiAgICBUfm1lYW4oQ09OQ19GT1VORCwgbmEucm09VCkNCiAgKQ0KICApIHw+DQogIG11dGF0ZSgNCiAgICB0cmVhdG1lbnQ9Y2FzZV93aGVuKA0KICAgIHRyZWF0bWVudD09IkM2OExPVyIgfiAiQzYtOCBMb3ciLA0KICAgIHRyZWF0bWVudD09IkM2OE1FRCIgfiAiQzYtOCBNZWRpdW0iLA0KICAgIHRyZWF0bWVudD09IkM2OEhJR0giIH4gIkM2LTggSGlnaCIsDQogICAgdHJlYXRtZW50PT0iRlRTTE9XIiB+ICJGVFMgTG93IiwNCiAgICB0cmVhdG1lbnQ9PSJGVFNNRUQiIH4gIkZUUyBNZWRpdW0iLA0KICAgIHRyZWF0bWVudD09IkZUU0hJR0giIH4gIkZUUyBIaWdoIiwNCiAgICBUIH4gdHJlYXRtZW50DQogICkgDQogICkgfD4NCiAgc3VtbWFyaXplKG1lYW49bWVhbihDT05DX0ZPVU5ELCBuYS5ybT1UKSkgfD4NCiAgcGl2b3Rfd2lkZXIobmFtZXNfZnJvbT1jKHNhbXBsZXR5cGUsIHN0dWR5KSwgdmFsdWVzX2Zyb209bWVhbikgfD4NCiAgZHBseXI6OnNlbGVjdChjKENPTVBPVU5ELHRyZWF0bWVudCx3YXRlcl9zZXJ1bSkpIHw+DQogIHJlbmFtZShkb3NlPXdhdGVyX3NlcnVtKSB8Pg0KICBtdXRhdGUobG9nZG9zZT1sb2coZG9zZSkpDQoNCg0KDQp3YXRlcmRhdGFXQiA8LSBEYXRhMTJxdWFsaXNoIHw+DQogICNmaWx0ZXIoaW5taXh0dXJlPT0ieWVzInwodHJlYXRtZW50PT0iQ29udHJvbCIpKSB8Pg0KICBkcm9wbGV2ZWxzKCkgfD4NCiAgZ3JvdXBfYnkoc2FtcGxldHlwZSxzdHVkeSxDT01QT1VORCx0cmVhdG1lbnQpIHw+DQogIG11dGF0ZShDT05DX0ZPVU5EPWNhc2Vfd2hlbigNCiAgICBzYW1wbGV0eXBlPT0id2F0ZXIifihtZWFuKENPTkNfRk9VTkQsIG5hLnJtPVQpLzFlOCksDQogICAgc2FtcGxldHlwZT09Indob2xlYm9keSJ+KG1lYW4oQ09OQ19GT1VORCwgbmEucm09VCkpLA0KICAgIFR+bWVhbihDT05DX0ZPVU5ELCBuYS5ybT1UKQ0KICApDQogICkgfD4NCiAgbXV0YXRlKA0KICAgIHRyZWF0bWVudD1jYXNlX3doZW4oDQogICAgdHJlYXRtZW50PT0iQzY4TE9XIiB+ICJDNi04IExvdyIsDQogICAgdHJlYXRtZW50PT0iQzY4TUVEIiB+ICJDNi04IE1lZGl1bSIsDQogICAgdHJlYXRtZW50PT0iQzY4SElHSCIgfiAiQzYtOCBIaWdoIiwNCiAgICB0cmVhdG1lbnQ9PSJGVFNMT1ciIH4gIkZUUyBMb3ciLA0KICAgIHRyZWF0bWVudD09IkZUU01FRCIgfiAiRlRTIE1lZGl1bSIsDQogICAgdHJlYXRtZW50PT0iRlRTSElHSCIgfiAiRlRTIEhpZ2giLA0KICAgIFQgfiB0cmVhdG1lbnQNCiAgKSANCiAgKSB8Pg0KICBzdW1tYXJpemUobWVhbj1tZWFuKENPTkNfRk9VTkQsIG5hLnJtPVQpKSB8Pg0KICBwaXZvdF93aWRlcihuYW1lc19mcm9tPWMoc2FtcGxldHlwZSwgc3R1ZHkpLCB2YWx1ZXNfZnJvbT1tZWFuKSB8Pg0KICBkcGx5cjo6c2VsZWN0KGMoQ09NUE9VTkQsdHJlYXRtZW50LHdhdGVyX3dob2xlYm9keSkpIHw+DQogIHJlbmFtZShkb3NlPXdhdGVyX3dob2xlYm9keSkgfD4NCiAgbXV0YXRlKGxvZ2Rvc2U9bG9nKGRvc2UpKQ0KDQoNCg0Kd2hvbGVib2R5ZGF0YSA8LSBEYXRhMTJxdWFsaXNoIHw+DQogIHVuZ3JvdXAoKSB8Pg0KICBkcm9wbGV2ZWxzKCkgfD4NCiAgZmlsdGVyKHNhbXBsZXR5cGU9PSJ3aG9sZWJvZHkiKSB8Pg0KICAjZmlsdGVyKGlubWl4dHVyZT09InllcyJ8dHJlYXRtZW50PT0iQ29udHJvbCIpIHw+DQogIG11dGF0ZSgNCiAgICB0cmVhdG1lbnQ9Y2FzZV93aGVuKA0KICAgIHRyZWF0bWVudD09IkM2OExPVyIgfiAiQzYtOCBMb3ciLA0KICAgIHRyZWF0bWVudD09IkM2OE1FRCIgfiAiQzYtOCBNZWRpdW0iLA0KICAgIHRyZWF0bWVudD09IkM2OEhJR0giIH4gIkM2LTggSGlnaCIsDQogICAgdHJlYXRtZW50PT0iRlRTTE9XIiB+ICJGVFMgTG93IiwNCiAgICB0cmVhdG1lbnQ9PSJGVFNNRUQiIH4gIkZUUyBNZWRpdW0iLA0KICAgIHRyZWF0bWVudD09IkZUU0hJR0giIH4gIkZUUyBIaWdoIiwNCiAgICBUIH4gdHJlYXRtZW50DQogICkgDQogICkgfD4NCiAgcmVuYW1lKEFuaW1hbElEPWFuaW1hbG51bWJlcm9ubHkpIHw+DQogIGRwbHlyOjpzZWxlY3QoQW5pbWFsSUQsc2V4LHRyZWF0bWVudCxDT01QT1VORCxDT05DX0ZPVU5ELHNhbXBsZXR5cGUsc2luZ2xldG9uY29tcG91bmQsaW5taXh0dXJlLHZhbF9xdWFsKSB8PiAgIyBpbmNsdWRlIGZsYWdzIGluIHNlbGVjdD8NCiAgbXV0YXRlKHNhbXBsZXR5cGU9YXMuY2hhcmFjdGVyKHNhbXBsZXR5cGUpLA0KICAgICAgICAgQ09NUE9VTkQ9YXMuY2hhcmFjdGVyKENPTVBPVU5EKSl8Pg0KICBkcm9wbGV2ZWxzKCkgfD4NCiAgdW5ncm91cCgpDQoNCndob2xlYm9keWRhdGEgPC0gbWVyZ2Uod2hvbGVib2R5ZGF0YSwgd2F0ZXJkYXRhV0IsIGJ5PWMoInRyZWF0bWVudCIsIkNPTVBPVU5EIikpDQoNCndob2xlYm9keWRhdGEgPC0gd2hvbGVib2R5ZGF0YSB8Pg0KICBtdXRhdGUoV2hvbGVib2R5PUNPTkNfRk9VTkQsDQogICAgICAgICBsb2dXaG9sZWJvZHk9bG9nKFdob2xlYm9keSkpfD4NCiAgbXV0YXRlKA0KICAgIGxvZ2Rtdz1jYXNlX3doZW4oICMgc2VlIGh0dHBzOi8vYXBwcy5kdGljLm1pbC9zdGkvcGRmcy9BRDExMzQzNTUucGRmIHBhZ2UgOTIgb2YgMTIxIGluIHBkZg0KICAgICAgQ09NUE9VTkQ9PSJQRkJTIn4yLjYzLA0KICAgICAgQ09NUE9VTkQ9PSJQRk5BIn40LjA0LA0KICAgICAgQ09NUE9VTkQ9PSI2OjIgRlRTIn4wLjkyLA0KICAgICAgQ09NUE9VTkQ9PSI4OjIgRlRTIn4yLjI4LA0KICAgICAgQ09NUE9VTkQ9PSJQRk9TIn40Ljg4LA0KICAgICAgQ09NUE9VTkQ9PSJQRkh4UyJ+My44MiwNCiAgICAgIENPTVBPVU5EPT0iUEZPQSJ+My41MSwNCiAgICAgIENPTVBPVU5EPT0iUEZIeEEifjIuMzENCiAgICApDQogICkNCiAgDQoNCmBgYA0KDQoNCiANCg0KDQpgYGB7ciwgaW5jbHVkZT1GfQ0KDQpEYXRhMTJiIDwtIGltcG9ydF9saXN0KFNHU2ZpbGVzMiwgcmJpbmQ9VCwgcmJpbmRfZmlsbD1ULCByYmluZF9sYWJlbD0iZmlsZSIsIGNvbF9uYW1lcz1ULG5hPSIiKSB8Pg0KICBkcGx5cjo6c2VsZWN0KFNBTVBMRV9OTyxBWFlTX0lELExBQl9GTEFHLENPTVBPVU5ELENPTkNfRk9VTkQsREVURUNUSU9OX0xJTUlULFVOSVQsZmlsZSkgfD4NCiAgYmluZF9yb3dzKCkgfD4NCiAgbXV0YXRlKFVOSVQ9ZmFjdG9yKFVOSVQpLA0KICAgICAgICAgQ09NUE9VTkQ9ZmFjdG9yKENPTVBPVU5EKSkgfD4NCiAgZmlsdGVyKCFVTklUJWluJWMoIiUgUmVjb3ZlcnkiKSZTQU1QTEVfTk8hPSJMYWIgQmxhbmsiKSB8PiAgI2luc2VydCBMQUJfRkxBRyBjb2RlIHJlamVjdGlvbnMgaGVyZQ0KICAjIHRoZXNlYXJlZm9ycGRyaXZlZmlsZXNvbmx5IGZpbHRlcihmaWxlIT0iUDovVG94L1NFUkRQLWZ1bmRlZCBwcm9qZWN0cy9QRkFTIG1peHR1cmVzIG1pY2Uga2VzdHJlbHMvU0dTIEFYWVMvRGF0YS9GVFBfYmFja3VwLzQ3MjggRFBXRzg3MDA0IFdHODUwOTYgUEZBUy9WODUwOTZQRkFTX0RhdGFiYXNlXzEueGxzeCIpIHw+DQogICMgdGhlc2VhcmVmb3JwZHJpdmVmaWxlc29ubHkgZmlsdGVyKGZpbGUhPSJQOi9Ub3gvU0VSRFAtZnVuZGVkIHByb2plY3RzL1BGQVMgbWl4dHVyZXMgbWljZSBrZXN0cmVscy9TR1MgQVhZUy9EYXRhL0ZUUF9iYWNrdXAvNDcyOCBEUFdHODY0NDYgV0c4NTE5OSBQRkFTIEVYVEQvVjg1MTk5UEZBUy1FWFREX0RhdGFiYXNlXzEueGxzeCIpIHw+DQogICMgdGhlc2VhcmVmb3JwZHJpdmVmaWxlc29ubHkgZmlsdGVyKGZpbGUhPSJQOi9Ub3gvU0VSRFAtZnVuZGVkIHByb2plY3RzL1BGQVMgbWl4dHVyZXMgbWljZSBrZXN0cmVscy9TR1MgQVhZUy9EYXRhL0ZUUF9iYWNrdXAvNDcyOCBEUFdHODY0NTIgV0c4NTIwMCBQRkFTIEVYVEQvVjg1MjAwUEZBUy1FWFREX0RhdGFiYXNlXzEueGxzeCIpIHw+DQogICMgdGhlc2VhcmVmb3JwZHJpdmVmaWxlc29ubHkgZmlsdGVyKGZpbGUhPSJQOi9Ub3gvU0VSRFAtZnVuZGVkIHByb2plY3RzL1BGQVMgbWl4dHVyZXMgbWljZSBrZXN0cmVscy9TR1MgQVhZUy9EYXRhL0ZUUF9iYWNrdXAvNDcyOCBEUFdHODY0NTUgV0c4NTIwMSBQRkFTIEVYVEQvVjg1MjAxUEZBUy1FWFREX0RhdGFiYXNlXzIueGxzeCIpIHw+DQogICMgdGhlc2VhcmVmb3JwZHJpdmVmaWxlc29ubHkgZmlsdGVyKGZpbGUhPSJQOi9Ub3gvU0VSRFAtZnVuZGVkIHByb2plY3RzL1BGQVMgbWl4dHVyZXMgbWljZSBrZXN0cmVscy9TR1MgQVhZUy9EYXRhL0ZUUF9iYWNrdXAvNDcyOCBEUFdHODY4ODUgV0c4NTA1MSBQRkFTL1Y4NTA1MVBGQVNfRGF0YWJhc2VfMS54bHN4IikgfD4NCiAgIyB0aGVzZWFyZWZvcnBkcml2ZWZpbGVzb25seSBmaWx0ZXIoZmlsZSE9IlA6L1RveC9TRVJEUC1mdW5kZWQgcHJvamVjdHMvUEZBUyBtaXh0dXJlcyBtaWNlIGtlc3RyZWxzL1NHUyBBWFlTL0RhdGEvRlRQX2JhY2t1cC80NzI4IERQV0c4Njk1MCBXRzg1MDUyIFBGQVMvVjg1MDUyUEZBU19EYXRhYmFzZV8xLnhsc3giKSB8Pg0KICAjIHRoZXNlYXJlZm9ycGRyaXZlZmlsZXNvbmx5IGZpbHRlcihmaWxlIT0iUDovVG94L1NFUkRQLWZ1bmRlZCBwcm9qZWN0cy9QRkFTIG1peHR1cmVzIG1pY2Uga2VzdHJlbHMvU0dTIEFYWVMvRGF0YS9GVFBfYmFja3VwLzQ3MjggRFBXRzg2ODc4IFdHODUwODMgUEZBUy9WODUwODNQRkFTX0RhdGFiYXNlXzEueGxzeCIpIHw+DQogIGRyb3BsZXZlbHMoKQ0KDQoNCkRhdGExMmIgPC0gbWVyZ2UoRGF0YTEyYiwga2V5ZmlsZTJ8PmRwbHlyOjpzZWxlY3QoYW5pbWFsbnVtYmVyb25seSwgU0FNUExFX05PLHRyZWF0bWVudCwgc2FtcGxldHlwZSwgc3R1ZHksUEZBUyxzZXgpLCBieT0iU0FNUExFX05PIil8Pg0KICBtdXRhdGUodHJlYXRtZW50PWZhY3Rvcih0cmVhdG1lbnQsIGxldmVscz1jKCJQRk9TIiwiUEZPQSIsIlBGSHhTIiwiUEZIeEEiLCJQRk5BIiwiUEZCUyIsIjY6MiBGVFMiLCI4OjIgRlRTIiwiQzY4TE9XIiwiQzY4TUVEIiwiQzY4SElHSCIsIkZUU0xPVyIsIkZUU01FRCIsIkZUU0hJR0giLCJDb250cm9sIikpLA0KICAgICAgICAgc2FtcGxldHlwZT1mYWN0b3Ioc2FtcGxldHlwZSksDQogICAgICAgICBzdHVkeT1mYWN0b3Ioc3R1ZHkpLA0KICAgICAgICAgc2luZ2xldG9uY29tcG91bmQ9Y2FzZV93aGVuKA0KICAgICAgICAgICBhcy5jaGFyYWN0ZXIodHJlYXRtZW50KT09YXMuY2hhcmFjdGVyKENPTVBPVU5EKSB+ICJ5ZXMiLA0KICAgICAgICAgICBUfiJubyIpLA0KICAgICAgICAgaW5taXh0dXJlPWNhc2Vfd2hlbigNCiAgICAgICAgICAgc3RyX2RldGVjdChQRkFTLGFzLmNoYXJhY3RlcihDT01QT1VORCkpIH4gInllcyIsDQogICAgICAgICAgIFR+Im5vIg0KICAgICAgICAgKSkgfD4NCiAgbXV0YXRlKHZhbF9xdWFsPQ0KICAgICAgICAgICBjYXNlX3doZW4oDQogICAgICAgICAgICAgaXMubmEoTEFCX0ZMQUcpIH4gInF1YWwiLA0KICAgICAgICAgICAgIExBQl9GTEFHPT0iSiIgfiAidHJhY2UiLA0KICAgICAgICAgICAgIExBQl9GTEFHPT0iSCIgfiAiZXN0aW1hdGVkIiwNCiAgICAgICAgICAgICBMQUJfRkxBRz09IksiIH4gImJhZCwgbWF4aW11bSBwb3NzaWJsZSByZXBvcnRlZCIsDQogICAgICAgICAgICAgTEFCX0ZMQUc9PSJVIiB+ICJub25kZXRlY3QiLA0KICAgICAgICAgICAgIExBQl9GTEFHPT0iRCIgfiAicXVhbCB2aWEgZGlsdXRpb24iLA0KICAgICAgICAgICAgIExBQl9GTEFHPT0iWCIgfiAiaWdub3JlIiwNCiAgICAgICAgICAgICBMQUJfRkxBRz09IkQgSiIgfiAidHJhY2UgdmlhIGRpbHV0aW9uIiwNCiAgICAgICAgICAgICBMQUJfRkxBRz09IkQgSCImc3R1ZHkhPSJzZXJ1bSImc2FtcGxldHlwZSE9InNlcnVtIiZ0cmVhdG1lbnQhPSI2OjIgRlRTIiZDT01QT1VORCE9IjY6MiBGVFMiIH4gImVzdGltYXRlZCwgb3ZlciIsDQogICAgICAgICAgICAgc3R1ZHk9PSJzZXJ1bSImc2FtcGxldHlwZT09InNlcnVtIiZ0cmVhdG1lbnQ9PSJDNjhNRUQiJkNPTVBPVU5EPT0iUEZIeFMiJkxBQl9GTEFHPT0iRCBIIiZzdHJfZGV0ZWN0KEFYWVNfSUQsIjIkIikgfiAicXVhbCwgb3ZlciIsDQogICAgICAgICAgICAgc3R1ZHk9PSJzZXJ1bSImc2FtcGxldHlwZT09InNlcnVtIiZ0cmVhdG1lbnQ9PSJDNjhNRUQiJkNPTVBPVU5EPT0iUEZIeFMiJkxBQl9GTEFHPT0iRCBIIiYhc3RyX2RldGVjdChBWFlTX0lELCIyJCIpIH4gImVzdGltYXRlZCwgb3ZlciIsDQogICAgICAgICAgICAgc3R1ZHk9PSJzZXJ1bSImc2FtcGxldHlwZT09InNlcnVtIiZ0cmVhdG1lbnQ9PSI2OjIgRlRTIiZDT01QT1VORD09IjY6MiBGVFMiJkxBQl9GTEFHPT0iRCBIIiB+ICJxdWFsLCBvdmVyIiwNCiAgICAgICAgICAgICBUIH4gIm90aGVyLCBub25xdWFsIg0KICAgICAgICAgICApDQogICkNCg0KDQpgYGANCg0KDQoNCmBgYHtyLCBpbmNsdWRlPUZ9DQoNCg0KdGlzc3VlZGF0YW5vdE5BIDwtIERhdGExIHw+ICAgI2NoYW5nZSBEYXRhMSB0byBEYXRhMXF1YWxpc2ggb3IgaW5jbHVkZSBmbGFncyBpbiBzZWxlY3QNCiAgZmlsdGVyKCFpcy5uYShDT05DX0ZPVU5EKSl8Pg0KICAjZmlsdGVyKGlubWl4dHVyZT09InllcyJ8dHJlYXRtZW50PT0iQ29udHJvbCIpIHw+DQogIGRwbHlyOjpzZWxlY3QoQW5pbWFsSUQsU2V4LHRyZWF0bWVudCxDT01QT1VORCxDT05DX0ZPVU5ELFRpc3N1ZSxzaW5nbGV0b25jb21wb3VuZCxpbm1peHR1cmUsdmFsX3F1YWwpIHw+DQogIHJlbmFtZShzYW1wbGV0eXBlPVRpc3N1ZSwNCiAgICAgICAgIHNleD1TZXgpIHw+DQogIG11dGF0ZSh0cmVhdG1lbnQ9YXMuY2hhcmFjdGVyKHRyZWF0bWVudCksDQogICAgICAgICBDT01QT1VORD1hcy5jaGFyYWN0ZXIoQ09NUE9VTkQpKXw+DQogIGRyb3BsZXZlbHMoKSB8Pg0KICB1bmdyb3VwKCkNCiAgDQpkYXRhdGlzc3Vlc2VydW0gPC0gcmJpbmQoc2VydW1kYXRhLHRpc3N1ZWRhdGFub3ROQSkNCmRhdGF0aXNzdWVzZXJ1bXdpZGUgPC0gZGF0YXRpc3N1ZXNlcnVtIHw+DQogIHBpdm90X3dpZGVyKA0KICAgIGlkX2NvbHM9YygiQW5pbWFsSUQiLCJzZXgiLCJ0cmVhdG1lbnQiLCJDT01QT1VORCIsInNpbmdsZXRvbmNvbXBvdW5kIiwiaW5taXh0dXJlIiwidmFsX3F1YWwiKSwNCiAgICBuYW1lc19mcm9tPWMoInNhbXBsZXR5cGUiKSwNCiAgICB2YWx1ZXNfZnJvbT1jKCJDT05DX0ZPVU5EIikNCiAgKQ0KDQpkYXRhdGlzc3Vlc2VydW13aWRlJHRyZWF0bWVudCA8LSBmYWN0b3IoZGF0YXRpc3N1ZXNlcnVtd2lkZSR0cmVhdG1lbnQsIGxldmVscz1jKCJQRk9TIiwiUEZPQSIsIlBGSHhTIiwiUEZIeEEiLCJQRkJTIiwiUEZOQSIsIjY6MiBGVFMiLCI4OjIgRlRTIiwiQzYtOCBMb3ciLCJDNi04IE1lZGl1bSIsIkM2LTggSGlnaCIsIkZUUyBMb3ciLCJGVFMgTWVkaXVtIiwiRlRTIEhpZ2giLCJDb250cm9sIikpDQoNCiNkYXRhdGlzc3Vlc2VydW13aWRlJHdhdGVyMiA8LSBkYXRhdGlzc3Vlc2VydW13aWRlJHdhdGVyLzFlOA0KI2RhdGF0aXNzdWVzZXJ1bXdpZGUgPC0gZGF0YXRpc3N1ZXNlcnVtd2lkZSB8Pg0KIyAgcmVuYW1lKGRvc2U9d2F0ZXIyKSB8Pg0KIyAgbXV0YXRlKGxvZ2Rvc2U9bG9nKGRvc2UpKQ0KDQpgYGANCg0KDQoNCmBgYHtyLCBpbmNsdWRlPUZ9DQoNCmRhdGFsaXYgPC0gcmVhZF9leGNlbCgiQzovVXNlcnMvZWFzdGEvRGVza3RvcC9QRkFTIGFkZGl0aXZpdHkgaW4gbWljZS9BbmFseXNpcy9tb3VzZW1peHR1cmVzZGF0YWtleXMvUEZBU19taXh0dXJlc19jb21iaW5lZF9ib2R5d2VpZ2h0c19vcmdhbndlaWdodHNfTUFTVEVSLnhsc3giLCBjb2xfdHlwZXMgPSBjKCJ0ZXh0IiwgInRleHQiLCAibnVtZXJpYyIsICJ0ZXh0IiwgInRleHQiLCAidGV4dCIsICJkYXRlIiwgIm51bWVyaWMiLCAiZGF0ZSIsICJudW1lcmljIiwgImRhdGUiLCAibnVtZXJpYyIsICJkYXRlIiwgIm51bWVyaWMiLCAiZGF0ZSIsICJudW1lcmljIiwgIm51bWVyaWMiLCAibnVtZXJpYyIsICJudW1lcmljIiwgIm51bWVyaWMiLCAidGV4dCIpLCBuYSA9ICJOL0EiKQ0KDQoNCmRhdGFsaXYkcmVsbGl2IDwtIGRhdGFsaXYkbGl2ZXJfd2VpZ2h0LyhkYXRhbGl2JFNEMjhfd2VpZ2h0LWRhdGFsaXYkbGl2ZXJfd2VpZ2h0KQ0KZGF0YWxpdiRyZWxicmFpbiA8LSBkYXRhbGl2JGJyYWluX3dlaWdodC8oZGF0YWxpdiRTRDI4X3dlaWdodC1kYXRhbGl2JGJyYWluX3dlaWdodCkNCmRhdGFsaXYkcmVsa2lkIDwtIGRhdGFsaXYka2lkbmV5X3dlaWdodC8oZGF0YWxpdiRTRDI4X3dlaWdodC1kYXRhbGl2JGtpZG5leV93ZWlnaHQpDQoNCg0KI2JpZ3Bsb3RzdGFja2VyMyB8Pg0KIyAgZ3JvdXBfYnkoc2luZ2xldG9uY29tcG91bmQsIHRyZWF0bWVudCwgU2V4LCBUaXNzdWUsQ09NUE9VTkQpIHw+DQojICBkcGx5cjo6c3VtbWFyaXplKCJNZWFuIChTRCkiPXBhc3RlKHJvdW5kKG1lYW4oQ29uY2VudHJhdGlvbiwgbmEucm09VCksMiksIiwgKCIscm91bmQoc2QoQ29uY2VudHJhdGlvbiwgbmEucm09VCksMiksIiksIFsiLHN1bSghaXMubmEoQ29uY2VudHJhdGlvbikpLCJdIiwgc2VwPSIiKSkgfD4NCiMgIHBpdm90X3dpZGVyKG5hbWVzX2Zyb209YyhUaXNzdWUpLHZhbHVlc19mcm9tPSJNZWFuIChTRCkiKSB8Pg0KIyAgbXV0YXRlKGluZm89cGFzdGUoIm1lYW4sIChTRCksIFtuXSIpKSB8Pg0KIyAgd3JpdGVfY3N2KCJGSU5BTHN1bW1hcml6ZWRkYXRhLmNzdiIpDQoNCmRhdGFsaXZsb25nIDwtIGRhdGFsaXYgfD4NCiAgcGl2b3RfbG9uZ2VyKGNvbHM9YyhTRDBfd2VpZ2h0LFNEN193ZWlnaHQsU0QxNF93ZWlnaHQsU0QyMV93ZWlnaHQsU0QyOF93ZWlnaHQpLCB2YWx1ZXNfdG89IndlaWdodCIsIG5hbWVzX3RvPSJkYXkiKSB8Pg0KICBtdXRhdGUoZGF5PXBhcnNlX251bWJlcihkYXkpKQ0KDQojZ2dwbG90KCkrDQojICBnZW9tX3BvaW50KGRhdGE9ZGF0YWxpdmxvbmcsIGFlcyh4PWRheSwgeT13ZWlnaHQsIGNvbG9yPXRyZWF0bWVudCkpKw0KIyAgZ2VvbV9zbW9vdGgoZGF0YT1kYXRhbGl2bG9uZywgYWVzKHg9ZGF5LCB5PXdlaWdodCwgY29sb3I9dHJlYXRtZW50KSwgbWV0aG9kPSJsbSIsIGZvcm11bGE9eX54LCBzZT1GKSArDQojICBmYWNldF93cmFwKH5zZXgpDQojDQojZ2dwbG90KCkrDQojICBnZW9tX3BvaW50KGRhdGE9ZGF0YWxpdmxvbmcsIGFlcyh4PWRheSwgeT13ZWlnaHQsIGNvbG9yPXNleCkpKw0KIyAgZ2VvbV9zbW9vdGgoZGF0YT1kYXRhbGl2bG9uZywgYWVzKHg9ZGF5LCB5PXdlaWdodCwgY29sb3I9c2V4KSwgbWV0aG9kPSJsb2VzcyIsIGZvcm11bGE9eX54LCBzZT1GKSArDQojICBmYWNldF93cmFwKH50cmVhdG1lbnQpDQojDQojZ2dwbG90KCkrDQojICBnZW9tX3BvaW50KGRhdGE9ZGF0YWxpdmxvbmd8PmZpbHRlcih0cmVhdG1lbnQ9PSJQRk5BIiksIGFlcyh4PWRheSwgeT13ZWlnaHQsIGNvbG9yPXNleCkpKw0KIyAgZ2VvbV9zbW9vdGgoZGF0YT1kYXRhbGl2bG9uZ3w+ZmlsdGVyKHRyZWF0bWVudD09IlBGTkEiKSwgYWVzKHg9ZGF5LCB5PXdlaWdodCwgY29sb3I9c2V4KSwgbWV0aG9kPSJsb2VzcyIsIGZvcm11bGE9eX54LCBzZT1GKSANCg0KDQoNCg0KZGF0YWxpdmxvbmcyIDwtIGRhdGFsaXYgfD4NCiAgcGl2b3RfbG9uZ2VyKGNvbHM9YyhicmFpbl93ZWlnaHQsbGl2ZXJfd2VpZ2h0LGtpZG5leV93ZWlnaHQpLCB2YWx1ZXNfdG89IndlaWdodCIsIG5hbWVzX3RvPSJ0aXNzdWUiKSB8Pg0KICBtdXRhdGUodGlzc3VlPXN0cl9yZW1vdmUodGlzc3VlLCJfd2VpZ2h0IikpDQoNCg0KI2dncGxvdCgpICsgDQojICBnZW9tX2JveHBsb3QoZGF0YT1kYXRhbGl2bG9uZzJ8PmZpbHRlcihzdHVkeV9yb3VuZCE9Ildob2xlIEJvZHkiKSwgYWVzKHg9dHJlYXRtZW50LCB5PXdlaWdodCwgY29sb3I9c2V4KSkrDQojICBmYWNldF93cmFwKH50aXNzdWUsIHNjYWxlcz0iZnJlZV95IikNCiMNCg0KDQoNCiNkYXRhc3ViMiA8LSBtZXJnZSh4PXJhdGlvZGF0YSx5PWRhdGFzdWIsIGJ5Lng9InRyZWF0bWVudCIsIGJ5Lnk9InRyZWF0bWVudEYyIiwgYWxsPVQpDQoNCg0KZGF0YWxpdjIgPC0gZGF0YWxpdiB8Pg0KICBkcGx5cjo6c2VsZWN0KGFuaW1hbF9JRCxyZWxsaXYscmVsYnJhaW4scmVsa2lkLCBTRDI4X3dlaWdodCxsaXZlcl93ZWlnaHQsYnJhaW5fd2VpZ2h0LGtpZG5leV93ZWlnaHQpIHw+DQogIHJlbmFtZShBbmltYWxJRD1hbmltYWxfSUQpDQpgYGANCg0KDQoNCmBgYHtyLCBpbmNsdWRlPUZ9DQpkYXRhdGlzc3Vlc2VydW13aWRlIDwtIG1lcmdlKGRhdGF0aXNzdWVzZXJ1bXdpZGUsZGF0YWxpdjIsYnk9IkFuaW1hbElEIikNCg0KZGF0YXRpc3N1ZXNlcnVtd2lkZSA8LSBkYXRhdGlzc3Vlc2VydW13aWRlIHw+DQogIGdyb3VwX2J5KEFuaW1hbElELENPTVBPVU5EKSB8Pg0KICBtdXRhdGUoDQogICAgdG90YWxuZ2JvZHlidXJkZW4gPSBzdW0oKHNlcnVtKjAuMDM4NSpTRDI4X3dlaWdodCksKEtpZG5leSpTRDI4X3dlaWdodCksKEJyYWluKlNEMjhfd2VpZ2h0KSwoTGl2ZXIqU0QyOF93ZWlnaHQpLG5hLnJtPVQpLA0KICAgIGxvZ3RvdGFsbmdib2R5YnVyZGVuID0gbG9nKHRvdGFsbmdib2R5YnVyZGVuKSwNCiAgICB0b3RhbGJvZHljb25jbmdfZyA9IHRvdGFsbmdib2R5YnVyZGVuL1NEMjhfd2VpZ2h0LA0KICAgIHRvdGFsYm9keWNvbmNtZ19rZyA9IHRvdGFsYm9keWNvbmNuZ19nLzEwMDANCiAgKSB8Pg0KICB1bmdyb3VwKCkgfD4NCiAgZGF0YS5mcmFtZSgpDQoNCg0KZGF0YXRpc3N1ZXNlcnVtd2lkZSA8LSBkYXRhdGlzc3Vlc2VydW13aWRlIHw+DQogIG11dGF0ZSgNCiAgICBsb2dkbXc9Y2FzZV93aGVuKCAjIHNlZSBodHRwczovL2FwcHMuZHRpYy5taWwvc3RpL3BkZnMvQUQxMTM0MzU1LnBkZiBwYWdlIDkyIG9mIDEyMSBpbiBwZGYNCiAgICBDT01QT1VORD09IlBGQlMifjIuNjMsDQogICAgQ09NUE9VTkQ9PSJQRk5BIn40LjA0LA0KICAgIENPTVBPVU5EPT0iNjoyIEZUUyJ+MC45MiwNCiAgICBDT01QT1VORD09Ijg6MiBGVFMifjIuMjgsDQogICAgQ09NUE9VTkQ9PSJQRk9TIn40Ljg4LA0KICAgIENPTVBPVU5EPT0iUEZIeFMifjMuODIsDQogICAgQ09NUE9VTkQ9PSJQRk9BIn4zLjUxLA0KICAgIENPTVBPVU5EPT0iUEZIeEEifjIuMzENCiAgKQ0KICApDQoNCg0KDQoNCmBgYA0KDQoNCg0KYGBge3IsIGluY2x1ZGU9Rn0NCg0KZGF0YWNsaW5jaGVtIDwtIHJlYWRfY3N2KCJDOi9Vc2Vycy9lYXN0YS9EZXNrdG9wL1BGQVMgYWRkaXRpdml0eSBpbiBtaWNlL0FuYWx5c2lzL21vdXNlbWl4dHVyZXNkYXRha2V5cy9QRkFTX21peHR1cmVzX2NsaW5jaGVtZGF0YS5jc3YiLCANCiAgICBjb2xfdHlwZXMgPSBjb2xzKA0KICAgICAgICBBTEIgPSBjb2xfZG91YmxlKCksIEFMQl9kaXZfR0xPQiA9IGNvbF9kb3VibGUoKSwgDQogICAgICAgIEFMVCA9IGNvbF9kb3VibGUoKSwgQVNUID0gY29sX2RvdWJsZSgpLCANCiAgICAgICAgQlVOID0gY29sX2RvdWJsZSgpLCBCVU5fZGl2X0NSRUEgPSBjb2xfZG91YmxlKCksIA0KICAgICAgICBDSE9MID0gY29sX2RvdWJsZSgpLCBDUkVBID0gY29sX2RvdWJsZSgpLCANCiAgICAgICAgYEdMT0IgY2FsYy5gID0gY29sX2RvdWJsZSgpLCBHTFUgPSBjb2xfZG91YmxlKCksIA0KICAgICAgICBUUCA9IGNvbF9kb3VibGUoKSwgVFJJRyA9IGNvbF9kb3VibGUoKSkpDQoNCg0KDQpkYXRhY2xpbmNoZW1sb25nIDwtIGRhdGFjbGluY2hlbSB8Pg0KICBwaXZvdF9sb25nZXIoY29scz1jKEFMQixBTEJfZGl2X0dMT0IsQUxULEFTVCxCVU4sQlVOX2Rpdl9DUkVBLENIT0wsQ1JFQSxgR0xPQiBjYWxjLmAsR0xVLFRQLFRSSUcpLCB2YWx1ZXNfdG89InZhbHVlIiwgbmFtZXNfdG89IkNDcGFyYW0iKQ0KDQoNCmBgYA0KDQoNCg0KYGBge3IsIGluY2x1ZGU9Rn0NCg0KZGF0YWNsaW5jaGVtJEFuaW1hbElEIDwtIGRhdGFjbGluY2hlbSRhbmltYWxJRA0KDQp0ZXN0MiA8LSBtZXJnZShkYXRhdGlzc3Vlc2VydW13aWRlLCBkYXRhY2xpbmNoZW0sIGJ5PSJBbmltYWxJRCIpDQoNCnRlc3QyIDwtIG1lcmdlKHRlc3QyLHdhdGVyZGF0YSwgYnk9YygidHJlYXRtZW50IiwiQ09NUE9VTkQiKSkgI2NoZWNrIHRoaXMgaWYgcHJvYmxlbXMNCg0KDQoNCmBgYA0KDQoNCg0KYGBge3IsIGluY2x1ZGU9Rn0NCg0KYmlncGxvdHN0YWNrZXIgPC0gdGVzdDIgfD4NCiAgZHBseXI6OnNlbGVjdCh0cmVhdG1lbnQsIENPTVBPVU5ELCBBbmltYWxJRCwgc2V4LngsIHNpbmdsZXRvbmNvbXBvdW5kLCBpbm1peHR1cmUsdmFsX3F1YWwsIHNlcnVtLEtpZG5leSxCcmFpbixMaXZlcixkb3NlKSB8Pg0KICByZW5hbWUoU2VydW09c2VydW0pIHw+DQogIHBpdm90X2xvbmdlcihjKFNlcnVtLEtpZG5leSxCcmFpbixMaXZlciksIG5hbWVzX3RvPSJUaXNzdWUiLCB2YWx1ZXNfdG89IkNvbmNlbnRyYXRpb24iKSB8Pg0KICByZW5hbWUoU2V4PXNleC54KQ0KDQpiaWdwbG90c3RhY2tlcjIgPC0gd2hvbGVib2R5ZGF0YSB8Pg0KICBtdXRhdGUodHJlYXRtZW50PWZhY3Rvcih0cmVhdG1lbnQsIGxldmVscz1jKCJQRk9TIiwiUEZPQSIsIlBGSHhTIiwiUEZIeEEiLCJQRkJTIiwiUEZOQSIsIjY6MiBGVFMiLCI4OjIgRlRTIiwiQzYtOCBMb3ciLCJDNi04IE1lZGl1bSIsIkM2LTggSGlnaCIsIkZUUyBMb3ciLCJGVFMgTWVkaXVtIiwiRlRTIEhpZ2giLCJDb250cm9sIikpKSB8Pg0KICBkcGx5cjo6c2VsZWN0KHRyZWF0bWVudCwgQ09NUE9VTkQsIEFuaW1hbElELHNleCwgc2luZ2xldG9uY29tcG91bmQsIGlubWl4dHVyZSwgdmFsX3F1YWwsV2hvbGVib2R5LCBkb3NlKSB8Pg0KICBwaXZvdF9sb25nZXIoYyhXaG9sZWJvZHkpLCBuYW1lc190bz0iVGlzc3VlIiwgdmFsdWVzX3RvPSJDb25jZW50cmF0aW9uIil8Pg0KICByZW5hbWUoU2V4PXNleCkNCg0KYmlncGxvdHN0YWNrZXIzIDwtIHJiaW5kKGJpZ3Bsb3RzdGFja2VyLCBiaWdwbG90c3RhY2tlcjIpDQoNCg0KYmlncGxvdHN0YWNrZXIzIDwtIGJpZ3Bsb3RzdGFja2VyMyB8Pg0KICBtdXRhdGUoaW5jbHVkZT1jYXNlX3doZW4oDQogICAgKHN0cl9kZXRlY3QodmFsX3F1YWwsInRyYWNlfG5vbnF1YWx8YmFkIikmVGlzc3VlPT0iQnJhaW4iKX4ibm8iLA0KICAgIFR+InllcyIpKSB8Pg0KICBmaWx0ZXIoaW5jbHVkZT09InllcyIpIHw+DQogIGdyb3VwX2J5KEFuaW1hbElELCBDT01QT1VORCxUaXNzdWUpfD4NCiAgc3VtbWFyaXplX2FsbCh+Zmlyc3QobmEub21pdCguKSkpIHw+DQogIGRwbHlyOjpzZWxlY3QoLXZhbF9xdWFsKSB8Pg0KICB1bmdyb3VwKCkNCg0KDQpgYGANCg0KIyBzdW1tYXJ5IHBsb3RzDQoNCmBgYHtyLCBmaWcuaGVpZ2h0PTE1LGZpZy53aWR0aD0yMH0NCg0KDQpjYmNvbG9ycyA8LSBjKA0KICAiUEZPUyIgPSAiIzk5OTk5OSIsIA0KICAiUEZPQSIgPSAiI0U2OUYwMCIsIA0KICAiUEZIeFMiID0gIiM1NkI0RTkiLA0KICAiUEZIeEEiID0gIiM5OTk5MzMiLA0KICAiUEZOQSIgPSAiI0YwRTQ0MiIsDQogICJQRkJTIiA9ICIjMDA3MkIyIiwNCiAgIjY6MiBGVFMiID0gIiNENTVFMDAiLA0KICAiODoyIEZUUyIgPSAiI0NDNzlBNyINCikNCg0Kbm90c2FtcGxlZGRmIDwtIGRhdGEuZnJhbWUoDQogIHRyZWF0bWVudD1jKHJlcCgiUEZCUyIsMykscmVwKCJQRk5BIiwzKSksDQogIFRpc3N1ZT1jKHJlcChjKCJCcmFpbiIsIktpZG5leSIsIkxpdmVyIiksMikpLA0KICBDT01QT1VORD1jKCJOQSIpLA0KICBtZWFuPWMocmVwKDEwLDMpLHJlcCgxMDAwMCwzKSksDQogIGxhYmVsPSJOQSIsDQogIFNleD0iTSINCikNCg0KDQoNCg0KYGBgDQoNCmBgYHtyLCBmaWcuaGVpZ2h0PTEwLCBmaWcud2lkdGg9MTgsIG1lc3NhZ2U9Riwgd2FybmluZz1GfQ0KDQpyZXBvc2l0aW9uX2xlZ2VuZCgNCiAgZ2dwbG90KGRhdGE9YmlncGxvdHN0YWNrZXIzfD5maWx0ZXIoaW5taXh0dXJlPT0ieWVzIiwgc2luZ2xldG9uY29tcG91bmQ9PSJ5ZXMiKSwgYWVzKHg9VGlzc3VlLCB5PUNvbmNlbnRyYXRpb24sIGZpbGw9U2V4KSkgKw0KICAgIGdlb21fZG90cGxvdChiaW5heGlzPSJ5IiwgIHN0YWNrZGlyPSJjZW50ZXIiKSsNCiAgICBmYWNldF93cmFwKH5mY3RfcmVsZXZlbCh0cmVhdG1lbnQsICJQRk9TIiwiUEZPQSIsIlBGSHhTIiwiUEZOQSIsIjg6MiBGVFMiLCJQRkJTIiwiUEZIeEEiLCI2OjIgRlRTIiksIHNjYWxlcz0iZnJlZV95IiwgYXhlcz0iYWxsIikgKw0KICBnZW9tX3RleHQoZGF0YT1ub3RzYW1wbGVkZGYsIGFlcyh5PW1lYW4sIGxhYmVsPWxhYmVsKSwgY29sb3I9ImJsYWNrIiwgc2hvdy5sZWdlbmQ9RikrDQogICAgc2NhbGVfeV9sb2cxMChsYWJlbHM9c2NhbGVzOjpsYWJlbF9jb21tYSgpKSsNCiAgICB0aGVtZV9jbGFzc2ljKGJhc2Vfc2l6ZSA9IDIwKSArDQogICAgbGFicyh5PSJXaG9sZWJvZHksIGxpdmVyLCBicmFpbiwgb3Iga2lkbmV5IChuZy9nKTsgc2VydW0gKG5nL21MKSIsIHg9TlVMTCkrDQogICAgdGhlbWUoYXhpcy50ZXh0PWVsZW1lbnRfdGV4dChjb2xvcj0iYmxhY2siKSwgc3RyaXAuYmFja2dyb3VuZD1lbGVtZW50X3JlY3QoZmlsbD0id2hpdGUiLGNvbG9yPSJ3aGl0ZSIsbGluZXdpZHRoPTEpLCBzdHJpcC50ZXh0PWVsZW1lbnRfdGV4dChmYWNlPSJib2xkIiksIGxlZ2VuZC50ZXh0PWVsZW1lbnRfdGV4dChzaXplPTIwKSwgbGVnZW5kLnRpdGxlPWVsZW1lbnRfdGV4dChzaXplPTIwKSkgKw0KICAgIGd1aWRlcyhmaWxsPWd1aWRlX2xlZ2VuZChvdmVycmlkZS5hZXM9bGlzdChzaXplPTE1KSkpLA0KICBwb3NpdGlvbj0nY2VudGVyJywgcGFuZWw9J3BhbmVsLTMtMycpDQoNCmdncGxvdChkYXRhPWJpZ3Bsb3RzdGFja2VyM3w+ZmlsdGVyKGlubWl4dHVyZT09InllcyIsIHNpbmdsZXRvbmNvbXBvdW5kPT0ibm8iKSwgYWVzKHg9VGlzc3VlLCB5PUNvbmNlbnRyYXRpb24sIGZpbGw9Q09NUE9VTkQpKSArDQogIGdlb21fZG90cGxvdChiaW5heGlzPSJ5IiwgIHN0YWNrZGlyPSJjZW50ZXIiLCBkb3RzaXplPTEpKw0KICBmYWNldF93cmFwKH50cmVhdG1lbnQsIHNjYWxlcz0iZnJlZV95IiwgYXhlcz0iYWxsIikgKw0KICBzY2FsZV95X2xvZzEwKGxhYmVscz1zY2FsZXM6OmxhYmVsX2NvbW1hKCkpKw0KICB0aGVtZV9jbGFzc2ljKGJhc2Vfc2l6ZSA9IDIwKSArDQogIGxhYnMoeT0iV2hvbGVib2R5LCBsaXZlciwgYnJhaW4sIG9yIGtpZG5leSAobmcvZyk7IHNlcnVtIChuZy9tTCkiLCBmaWxsPSIiLCB4PU5VTEwpICsNCiAgZ3VpZGVzKGZpbGw9Z3VpZGVfbGVnZW5kKHRpdGxlPSJQRkFTIikpKw0KICAjc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcz1jYmNvbG9ycykrDQogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcz1jYmNvbG9ycykgKw0KICB0aGVtZShheGlzLnRleHQ9ZWxlbWVudF90ZXh0KGNvbG9yPSJibGFjayIpLCBzdHJpcC5iYWNrZ3JvdW5kPWVsZW1lbnRfcmVjdChmaWxsPSJ3aGl0ZSIsY29sb3I9IndoaXRlIixsaW5ld2lkdGg9MSksIHN0cmlwLnRleHQ9ZWxlbWVudF90ZXh0KGZhY2U9ImJvbGQiKSwgbGVnZW5kLnRleHQ9ZWxlbWVudF90ZXh0KHNpemU9MTQpLCBsZWdlbmQucG9zaXRpb249ImJvdHRvbSIpICsNCiAgZ3VpZGVzKGZpbGw9Z3VpZGVfbGVnZW5kKG92ZXJyaWRlLmFlcz1saXN0KHNpemU9MTIpLCBucm93PTEpKQ0KDQoNCg0KYGBgDQoNCg0KDQpgYGB7ciwgZmlnLmhlaWdodD0xMyxmaWcud2lkdGg9MjAsIG1lc3NhZ2U9Riwgd2FybmluZz1GfQ0KDQoNCmNiY29sb3JzMiA8LSBjKA0KICAiUEZPUyIgPSAiIzk5OTk5OSIsIA0KICAiUEZPQSIgPSAiI0U2OUYwMCIsIA0KICAiUEZIeFMiID0gIiM1NkI0RTkiLA0KICAiUEZIeEEiID0gIiM5OTk5MzMiLA0KICAiUEZOQSIgPSAiI0YwRTQ0MiIsDQogICJQRkJTIiA9ICIjMDA3MkIyIiwNCiAgIjY6MiBGVFMiID0gIiNENTVFMDAiLA0KICAiODoyIEZUUyIgPSAiI0NDNzlBNyIsDQogIA0KICAiUEZQZUEiPSIjQUEwREZFIiwNCiAgIlBGUGVTIj0iIzMyODNGRSIsDQogICJQRlRlREEiPSIjODU2NjBEIiwNCiAgIlBGVHJEQSI9IiM3ODJBQjYiLA0KICAiUEZVbkEiPSIjNTY1NjU2IiwNCiAgIlBGRFMiPSIjMUM4MzU2IiwNCiAgIlBGRG9BIj0iIzE2RkYzMiIsDQogICJQRkRvUyI9IiNGN0UxQTAiLA0KICAiUEZIcEEiPSIjRTJFMkUyIiwNCiAgIlBGSHBTIj0iIzFDQkU0RiIsDQogICJQRk1CQSI9IiNDNDQ1MUMiLA0KICAiUEZOUyI9IiNERUEwRkQiLA0KICAiNzozIEZUQ0EiPSIjRkUwMEZBIiwNCiAgIjQ6MiBGVFMiPSIjMDA5ZTczIiwNCiAgIkV0Rk9TQUEiPSIjMzI1QTlCIiwNCiAgIk1lRk9TQUEiPSIjRkVBRjE2IiwNCiAgIk4tRXRGT1NFIj0iI0Y4QTE5RiIsDQogICJOLU1lRk9TRSI9IiM5MEFEMUMiLA0KICAiUEZCQSI9IiNGNjIyMkUiLA0KICAiUEZEQSI9IiMxQ0ZGQ0UiDQopDQoNCg0KDQpiaWdwbG90c3RhY2tlcjMgPC0gYmlncGxvdHN0YWNrZXIzIHw+DQogIG11dGF0ZSgNCiAgICBsb2dDb25jZW50cmF0aW9uPWxvZyhDb25jZW50cmF0aW9uKSwNCiAgICBsb2dEb3NlPWxvZyhkb3NlKQ0KICApDQoNCg0Kc3VtcGxvdDIgPC0gZ2dwbG90KGRhdGE9YmlncGxvdHN0YWNrZXIzLCBhZXMoeD1kb3NlLCB5PUNvbmNlbnRyYXRpb24sIGNvbG9yPUNPTVBPVU5EKSkgKw0KICBnZW9tX3BvaW50KHNpemU9MywgYWxwaGE9MC4yNSkgKw0KICBnZW9tX3Ntb290aChtZXRob2Q9ImxtIiwgZm9ybXVsYT15fngsIHNlPUYsIGxpbmV3aWR0aD0yKSArDQogIGZhY2V0X3dyYXAoflRpc3N1ZSkgKw0KICBzY2FsZV95X2xvZzEwKGxhYmVscz1zY2FsZXM6OmxhYmVsX2NvbW1hKCkpKw0KICBzY2FsZV94X2xvZzEwKGxhYmVscz1zY2FsZXM6OmxhYmVsX2NvbW1hKCkpKw0KICB0aGVtZV9jbGFzc2ljKGJhc2Vfc2l6ZSA9IDIyKSArDQogIGxhYnMoeT0iV2hvbGVib2R5LCBsaXZlciwgYnJhaW4sIG9yIGtpZG5leSAobmcvZyk7IHNlcnVtIChuZy9tTCkiLCBjYXB0aW9uPSIiLCB4PSJEb3NlIChtZy9rZy1kKSIpICsNCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcz1jYmNvbG9yczIpICsNCiAgdGhlbWUoc3RyaXAuYmFja2dyb3VuZD1lbGVtZW50X3JlY3QoZmlsbD0id2hpdGUiLGNvbG9yPSJ3aGl0ZSIsbGluZXdpZHRoPTEpKSAjKw0KICAjc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzPWNiY29sb3JzMikNCg0KcmVwb3NpdGlvbl9sZWdlbmQoc3VtcGxvdDIsICdjZW50ZXInLCBwYW5lbD0ncGFuZWwtMy0yJykNCg0KDQpyZXBvc2l0aW9uX2xlZ2VuZCgNCmdncGxvdChkYXRhPWJpZ3Bsb3RzdGFja2VyMywgYWVzKHg9ZG9zZSwgeT1Db25jZW50cmF0aW9uLCBjb2xvcj1DT01QT1VORCkpICsNCiAgZ2VvbV9wb2ludChzaXplPTMsIGFscGhhPTAuMjUpICsNCiAgZ2VvbV9zbW9vdGgobWV0aG9kPSJsbSIsIGZvcm11bGE9eX54LCBzZT1GLCBsaW5ld2lkdGg9MikgKw0KICBmYWNldF93cmFwKH5UaXNzdWUqU2V4KSArDQogIHNjYWxlX3lfbG9nMTAobGFiZWxzPXNjYWxlczo6bGFiZWxfY29tbWEoKSkrDQogIHNjYWxlX3hfbG9nMTAobGFiZWxzPXNjYWxlczo6bGFiZWxfY29tbWEoKSkrDQogIHRoZW1lX2NsYXNzaWMoYmFzZV9zaXplID0gMjIpICsNCiAgbGFicyh5PSJXaG9sZWJvZHksIGxpdmVyLCBicmFpbiwgb3Iga2lkbmV5IChuZy9nKTsgc2VydW0gKG5nL21MKSIsIGNhcHRpb249TlVMTCwgY29sb3I9TlVMTCx4PSJEb3NlIChtZy9rZy1kKSIpICsNCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcz1jYmNvbG9yczIpICsNCiAgdGhlbWUoc3RyaXAuYmFja2dyb3VuZD1lbGVtZW50X3JlY3QoZmlsbD0id2hpdGUiLGNvbG9yPSJ3aGl0ZSIsbGluZXdpZHRoPTEpKSwNCiAnY2VudGVyJywgcGFuZWw9J3BhbmVsLTQtMycpDQoNCg0KYGBgDQoNCg0KDQpgYGB7ciwgZmlnLmhlaWdodD0xMyxmaWcud2lkdGg9MjAsIGluY2x1ZGU9Rn0NCg0Kbm90c2FtcGxlZGRmIDwtIGRhdGEuZnJhbWUoDQogIHRyZWF0bWVudD1jKHJlcCgiUEZCUyIsMykscmVwKCJQRk5BIiwzKSksDQogIFRpc3N1ZT1jKHJlcChjKCJCcmFpbiIsIktpZG5leSIsIkxpdmVyIiksMikpLA0KICBDT01QT1VORD1jKCJOQSIpLA0KICBtZWFuPTAuMSwNCiAgbGFiZWw9Ik5BIg0KKQ0KDQoNCmBgYA0KDQoNCg0KDQoNCiMgYWxsIHRpc3N1ZXMgYWxsIG1peHR1cmUgdXNpbmcgYnJvb20NCg0KYGBge3IsIGZpZy5oZWlnaHQ9OCwgZmlnLndpZHRoPTEyfQ0KDQpmdWxsbWl4ZWRtb2RlbHNkb3NlYmFzZWQgPC0gYmlncGxvdHN0YWNrZXIzfD5maWx0ZXIoIWlzLm5hKGxvZ0Rvc2UpKSB8Pg0KICBuZXN0KGRhdGE9LVRpc3N1ZSkgfD4NCiAgbXV0YXRlKA0KICAgIGZpdD1tYXAoZGF0YSwgfiBsbWVyKGxvZ0NvbmNlbnRyYXRpb24gfmxvZ0Rvc2UrU2V4Kyhsb2dEb3NlfENPTVBPVU5EKSwgZGF0YT0ueCkpLA0KICAgIHRpZGllZD1tYXAoZml0LCB0aWR5KSwNCiAgICBnbGFuY2VkPW1hcChmaXQsIGdsYW5jZSksDQogICAgYXVnbWVudGVkPW1hcChmaXQsIGF1Z21lbnQpDQogICkNCg0KZnVsbG1peGVkbW9kZWxzZG9zZWJhc2VkIHw+DQogIHVubmVzdCh0aWRpZWQpIA0KDQpmdWxsbWl4ZWRtb2RlbHNkb3NlYmFzZWQgfD4NCiAgdW5uZXN0KHRpZGllZCkgfD4NCiAgZHBseXI6OnNlbGVjdChUaXNzdWUsIGVmZmVjdCwgdGVybSwgZXN0aW1hdGUsIHN0ZC5lcnJvcil8Pg0KICBncm91cF9ieShUaXNzdWUsIGVmZmVjdCwgdGVybSkgfD4NCiAgc3VtbWFyaXplKGBNZWFuLCBTRWA9cGFzdGUocm91bmQoZXN0aW1hdGUsMyksIiwgIixyb3VuZChzdGQuZXJyb3IsMykpKSB8Pg0KICBwaXZvdF93aWRlcihuYW1lc19mcm9tPWMoZWZmZWN0LHRlcm0pLCB2YWx1ZXNfZnJvbT1gTWVhbiwgU0VgKSANCg0KDQpmdWxsbWl4ZWRtb2RlbHNkb3NlYmFzZWQgfD4NCiAgdW5uZXN0KGdsYW5jZWQpIA0KDQojZnVsbG1peGVkbW9kZWxzZG9zZWJhc2VkfD4NCiMgIHVubmVzdChhdWdtZW50ZWQpDQoNCg0KDQpnZ3Bsb3QoZGF0YT1mdWxsbWl4ZWRtb2RlbHNkb3NlYmFzZWR8PnVubmVzdChhdWdtZW50ZWQpICwgYWVzKHg9bG9nQ29uY2VudHJhdGlvbiwgeT0uZml0dGVkLCBjb2xvcj1DT01QT1VORCwgc2hhcGU9U2V4KSkrDQogIGdlb21fcG9pbnQoKSArDQogIGdlb21fYWJsaW5lKHNsb3BlPTEpKw0KICBnZW9tX2FibGluZShzbG9wZT0xLCBpbnRlcmNlcHQ9LTEsIGxpbmV0eXBlPSJkYXNoZWQiKSsNCiAgZ2VvbV9hYmxpbmUoc2xvcGU9MSwgaW50ZXJjZXB0PTEsIGxpbmV0eXBlPSJkYXNoZWQiKSsNCiAgZmFjZXRfd3JhcCh+VGlzc3VlKSArDQogIHRoZW1lX2NsYXNzaWMoYmFzZV9zaXplPTE4KSArDQogIGxhYnMoeT0iUHJlZGljdGVkIGxuKFRpc3N1ZSAobmcvZykgb3Igc2VydW0gKG5nL21MKSkiLCB4PSJPYnNlcnZlZCBsbihUaXNzdWUgKG5nL2cpIG9yIHNlcnVtIChuZy9tTCkpIikrDQogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXM9Y2Jjb2xvcnMyKQ0KDQpnZ3Bsb3QoZGF0YT1mdWxsbWl4ZWRtb2RlbHNkb3NlYmFzZWR8PnVubmVzdChhdWdtZW50ZWQpICwgYWVzKHg9bG9nQ29uY2VudHJhdGlvbiwgeT0uZml0dGVkLCBjb2xvcj1DT01QT1VORCwgc2hhcGU9U2V4KSkrDQogIGdlb21fcG9pbnQoKSArDQogIGdlb21fYWJsaW5lKHNsb3BlPTEpKw0KICBnZW9tX2FibGluZShzbG9wZT0xLCBpbnRlcmNlcHQ9LTEsIGxpbmV0eXBlPSJkYXNoZWQiKSsNCiAgZ2VvbV9hYmxpbmUoc2xvcGU9MSwgaW50ZXJjZXB0PTEsIGxpbmV0eXBlPSJkYXNoZWQiKSsNCiAgZmFjZXRfd3JhcCh+VGlzc3VlKlNleCkgKw0KICB0aGVtZV9jbGFzc2ljKGJhc2Vfc2l6ZT0xOCkgKw0KICBsYWJzKHk9IlByZWRpY3RlZCBsbihUaXNzdWUgKG5nL2cpIG9yIHNlcnVtIChuZy9tTCkpIiwgeD0iT2JzZXJ2ZWQgbG4oVGlzc3VlIChuZy9nKSBvciBzZXJ1bSAobmcvbUwpKSIpKw0KICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzPWNiY29sb3JzMikNCg0KYGBgDQoNCiMjIGFsbCB0aXNzdWVzIGFsbCBtaXhlZCB0byBnZXQgcmFuZG9tIGVmZmVjdCBwYXJhbSB2YWx1ZXMNCg0KIyMjIFdob2xlIEJvZHkNCg0KYGBge3J9DQoNCg0KbWl4YWxsV0IgPC0gbG1lcihsb2dDb25jZW50cmF0aW9uIH5sb2dEb3NlK1NleCsobG9nRG9zZXxDT01QT1VORCksIGRhdGEgPSBiaWdwbG90c3RhY2tlcjN8PmZpbHRlcihUaXNzdWU9PSJXaG9sZWJvZHkiLCFpcy5uYShsb2dDb25jZW50cmF0aW9uKSksIFJFTUw9VCkNCnN1bW1hcnkobWl4YWxsV0IpDQpmaXhlZihtaXhhbGxXQikNCnJhbmVmKG1peGFsbFdCKQ0KY29lZihtaXhhbGxXQikgDQoNCg0KbWl4YWxsV0IgfD4NCiAgdGlkeSgpIHw+DQogICNkcGx5cjo6c2VsZWN0KGVmZmVjdCwgdGVybSwgZXN0aW1hdGUsIHN0ZC5lcnJvcil8Pg0KICBncm91cF9ieShlZmZlY3QsIHRlcm0pIHw+DQogIHN1bW1hcml6ZShgTWVhbiwgU0VgPXBhc3RlKHJvdW5kKGVzdGltYXRlLDMpLCIsICIscm91bmQoc3RkLmVycm9yLDMpKSkgfD4NCiAgcGl2b3Rfd2lkZXIobmFtZXNfZnJvbT1jKGVmZmVjdCx0ZXJtKSwgdmFsdWVzX2Zyb209YE1lYW4sIFNFYCkgDQoNCmV4dHJhY3RfZXEobWl4YWxsV0IsIHVzZV9jb2Vmcz1GLCBtZWFuX3NlcGFyYXRlPVQsDQogICAgICAgICAgIGludGVyY2VwdD0iYmV0YSIsDQogICAgICAgICAgIHN3YXBfdmFyX25hbWVzPWMoDQogICAgICAgICAgICAgImxvZ0Rvc2UiPSJsbihEb3NlLCBtZy9rZy1kKSIsDQogICAgICAgICAgICAgImxvZ0NvbmNlbnRyYXRpb24iPSJsbihXaG9sZSBCb2R5LCBuZy9nKSIsDQogICAgICAgICAgICAgIlNleCI9IlNleCIpLA0KICAgICAgICAgICBzd2FwX3N1YnNjcmlwdF9uYW1lcz1jKA0KICAgICAgICAgICAgICJNIj0iTWFsZSINCiAgICAgICAgICAgKSkNCg0KZXh0cmFjdF9lcShtaXhhbGxXQiwgdXNlX2NvZWZzPVQsIG1lYW5fc2VwYXJhdGU9VCwgaW5kZXhfZmFjdG9ycz1ULA0KICAgICAgICAgICBpbnRlcmNlcHQ9ImJldGEiLA0KICAgICAgICAgICBzd2FwX3Zhcl9uYW1lcz1jKA0KICAgICAgICAgICAgICJsb2dEb3NlIj0ibG4oRG9zZSwgbWcva2ctZCkiLA0KICAgICAgICAgICAgICJsb2dDb25jZW50cmF0aW9uIj0ibG4oV2hvbGUgQm9keSwgbmcvZykiLA0KICAgICAgICAgICAgICJTZXgiPSJTZXgiKSwNCiAgICAgICAgICAgc3dhcF9zdWJzY3JpcHRfbmFtZXM9YygNCiAgICAgICAgICAgICAiTSI9Ik1hbGUiDQogICAgICAgICAgICkpDQoNCnRhYl9tb2RlbChtaXhhbGxXQikNCg0KbW9kZWxzdW1tYXJ5KGR2bmFtZXMobWl4YWxsV0IpLCANCiAgICAgICAgICAgICBlc3RpbWF0ZT0ie2VzdGltYXRlfSBbe2NvbmYubG93fSwge2NvbmYuaGlnaH1dIiwgDQogICAgICAgICAgICAgc3RhdGlzdGljPU5VTEwsDQogICAgICAgICAgICAgY29lZl9yZW5hbWU9Y29lZl9yZW5hbWUpDQoNCnBsb3RfcHJlZGljdGlvbnMobWl4YWxsV0IsIGNvbmRpdGlvbj1saXN0KCJsb2dEb3NlIiwiQ09NUE9VTkQiKSkgKw0KICB0aGVtZV9jbGFzc2ljKCkgKw0KICBsYWJzKHk9IkVzdGltYXRlZCBsb2dDb25jZW50cmF0aW9uIikNCg0KcGxvdF9wcmVkaWN0aW9ucyhtaXhhbGxXQiwgY29uZGl0aW9uPWxpc3QoImxvZ0Rvc2UiLCJDT01QT1VORCIpKSArDQogIGZhY2V0X3dyYXAofkNPTVBPVU5EKSsNCiAgdGhlbWVfY2xhc3NpYygpICsNCiAgbGFicyh5PSJFc3RpbWF0ZWQgbG9nQ29uY2VudHJhdGlvbiIpDQoNCmBgYA0KDQoNCg0KIyBhbGwgdGlzc3VlcyBubyBtaXh0dXJlIHVzaW5nIGJyb29tDQoNCmBgYHtyLCBmaWcuaGVpZ2h0PTgsIGZpZy53aWR0aD0xMn0NCg0Kbm9uZW1peGVkbW9kZWxzZG9zZWJhc2VkIDwtIGJpZ3Bsb3RzdGFja2VyM3w+ZmlsdGVyKCFpcy5uYShsb2dEb3NlKSkgfD4NCiAgbmVzdChkYXRhPS1UaXNzdWUpIHw+DQogIG11dGF0ZSgNCiAgICBmaXQ9bWFwKGRhdGEsIH4gbG1lcihsb2dDb25jZW50cmF0aW9uIH5sb2dEb3NlK1NleCsoMXxDT01QT1VORCksIGRhdGE9LngpKSwNCiAgICB0aWRpZWQ9bWFwKGZpdCwgdGlkeSksDQogICAgZ2xhbmNlZD1tYXAoZml0LCBnbGFuY2UpLA0KICAgIGF1Z21lbnRlZD1tYXAoZml0LCBhdWdtZW50KQ0KICApDQoNCm5vbmVtaXhlZG1vZGVsc2Rvc2ViYXNlZCB8Pg0KICB1bm5lc3QodGlkaWVkKSANCg0KDQpub25lbWl4ZWRtb2RlbHNkb3NlYmFzZWQgfD4NCiAgdW5uZXN0KHRpZGllZCkgfD4NCiAgZHBseXI6OnNlbGVjdChUaXNzdWUsIGVmZmVjdCwgdGVybSwgZXN0aW1hdGUsIHN0ZC5lcnJvcil8Pg0KICBncm91cF9ieShUaXNzdWUsIGVmZmVjdCwgdGVybSkgfD4NCiAgc3VtbWFyaXplKGBNZWFuLCBTRWA9cGFzdGUocm91bmQoZXN0aW1hdGUsMyksIiwgIixyb3VuZChzdGQuZXJyb3IsMykpKSB8Pg0KICBwaXZvdF93aWRlcihuYW1lc19mcm9tPWMoZWZmZWN0LHRlcm0pLCB2YWx1ZXNfZnJvbT1gTWVhbiwgU0VgKSANCg0KDQpub25lbWl4ZWRtb2RlbHNkb3NlYmFzZWQgfD4NCiAgdW5uZXN0KGdsYW5jZWQpIA0KDQojbm9uZW1peGVkbW9kZWxzZG9zZWJhc2VkfD4NCiMgIHVubmVzdChhdWdtZW50ZWQpDQoNCg0KZ2dwbG90KGRhdGE9bm9uZW1peGVkbW9kZWxzZG9zZWJhc2VkfD51bm5lc3QoYXVnbWVudGVkKSAsIGFlcyh4PWxvZ0NvbmNlbnRyYXRpb24sIHk9LmZpdHRlZCwgY29sb3I9Q09NUE9VTkQsIHNoYXBlPVNleCkpKw0KICBnZW9tX3BvaW50KCkgKw0KICBnZW9tX2FibGluZShzbG9wZT0xKSsNCiAgZ2VvbV9hYmxpbmUoc2xvcGU9MSwgaW50ZXJjZXB0PS0xLCBsaW5ldHlwZT0iZGFzaGVkIikrDQogIGdlb21fYWJsaW5lKHNsb3BlPTEsIGludGVyY2VwdD0xLCBsaW5ldHlwZT0iZGFzaGVkIikrDQogIGZhY2V0X3dyYXAoflRpc3N1ZSkgKw0KICB0aGVtZV9jbGFzc2ljKGJhc2Vfc2l6ZT0xOCkgKw0KICBsYWJzKHk9IlByZWRpY3RlZCBsbihUaXNzdWUgKG5nL2cpIG9yIHNlcnVtIChuZy9tTCkpIiwgeD0iT2JzZXJ2ZWQgbG4oVGlzc3VlIChuZy9nKSBvciBzZXJ1bSAobmcvbUwpKSIpKw0KICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzPWNiY29sb3JzMikNCg0KZ2dwbG90KGRhdGE9bm9uZW1peGVkbW9kZWxzZG9zZWJhc2VkfD51bm5lc3QoYXVnbWVudGVkKSAsIGFlcyh4PWxvZ0NvbmNlbnRyYXRpb24sIHk9LmZpdHRlZCwgY29sb3I9Q09NUE9VTkQsIHNoYXBlPVNleCkpKw0KICBnZW9tX3BvaW50KCkgKw0KICBnZW9tX2FibGluZShzbG9wZT0xKSsNCiAgZ2VvbV9hYmxpbmUoc2xvcGU9MSwgaW50ZXJjZXB0PS0xLCBsaW5ldHlwZT0iZGFzaGVkIikrDQogIGdlb21fYWJsaW5lKHNsb3BlPTEsIGludGVyY2VwdD0xLCBsaW5ldHlwZT0iZGFzaGVkIikrDQogIGZhY2V0X3dyYXAoflRpc3N1ZSpTZXgpICsNCiAgdGhlbWVfY2xhc3NpYyhiYXNlX3NpemU9MTgpICsNCiAgbGFicyh5PSJQcmVkaWN0ZWQgbG4oVGlzc3VlIChuZy9nKSBvciBzZXJ1bSAobmcvbUwpKSIsIHg9Ik9ic2VydmVkIGxuKFRpc3N1ZSAobmcvZykgb3Igc2VydW0gKG5nL21MKSkiKSsNCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcz1jYmNvbG9yczIpDQoNCg0KYGBgDQoNCiMjIGFsbCB0aXNzdWVzIG5vIG1peGVkIHRvIGdldCByYW5kb20gZWZmZWN0IHBhcmFtIHZhbHVlcw0KDQojIyMgV2hvbGUgQm9keQ0KDQpgYGB7cn0NCg0Kbm9taXhhbGxXQiA8LSBsbWVyKGxvZ0NvbmNlbnRyYXRpb24gfmxvZ0Rvc2UrU2V4KygxfENPTVBPVU5EKSwgZGF0YSA9IGJpZ3Bsb3RzdGFja2VyM3w+ZmlsdGVyKFRpc3N1ZT09Ildob2xlYm9keSIsIWlzLm5hKGxvZ0NvbmNlbnRyYXRpb24pKSwgUkVNTD1UKQ0Kc3VtbWFyeShub21peGFsbFdCKQ0KZml4ZWYobm9taXhhbGxXQikNCnJhbmVmKG5vbWl4YWxsV0IpDQpjb2VmKG5vbWl4YWxsV0IpIA0Kbm9taXhhbGxXQiB8PiBnbGFuY2UoKQ0KDQpub21peGFsbFdCIHw+DQogIHRpZHkoKSB8Pg0KICAjZHBseXI6OnNlbGVjdChlZmZlY3QsIHRlcm0sIGVzdGltYXRlLCBzdGQuZXJyb3IpfD4NCiAgZ3JvdXBfYnkoZWZmZWN0LCB0ZXJtKSB8Pg0KICBzdW1tYXJpemUoYE1lYW4sIFNFYD1wYXN0ZShyb3VuZChlc3RpbWF0ZSwzKSwiLCAiLHJvdW5kKHN0ZC5lcnJvciwzKSkpIHw+DQogIHBpdm90X3dpZGVyKG5hbWVzX2Zyb209YyhlZmZlY3QsdGVybSksIHZhbHVlc19mcm9tPWBNZWFuLCBTRWApIA0KDQpleHRyYWN0X2VxKG5vbWl4YWxsV0IsIHVzZV9jb2Vmcz1GLCBtZWFuX3NlcGFyYXRlPVQsDQogICAgICAgICAgIGludGVyY2VwdD0iYmV0YSIsDQogICAgICAgICAgIHN3YXBfdmFyX25hbWVzPWMoDQogICAgICAgICAgICAgImxvZ0Rvc2UiPSJsbihEb3NlLCBtZy9rZy1kKSIsDQogICAgICAgICAgICAgImxvZ0NvbmNlbnRyYXRpb24iPSJsbihXaG9sZSBCb2R5LCBuZy9nKSIsDQogICAgICAgICAgICAgIlNleCI9IlNleCIpLA0KICAgICAgICAgICBzd2FwX3N1YnNjcmlwdF9uYW1lcz1jKA0KICAgICAgICAgICAgICJNIj0iTWFsZSINCiAgICAgICAgICAgKSkNCg0KZXh0cmFjdF9lcShub21peGFsbFdCLCB1c2VfY29lZnM9VCwgbWVhbl9zZXBhcmF0ZT1ULCBpbmRleF9mYWN0b3JzPVQsDQogICAgICAgICAgIGludGVyY2VwdD0iYmV0YSIsDQogICAgICAgICAgIHN3YXBfdmFyX25hbWVzPWMoDQogICAgICAgICAgICAgImxvZ0Rvc2UiPSJsbihEb3NlLCBtZy9rZy1kKSIsDQogICAgICAgICAgICAgImxvZ0NvbmNlbnRyYXRpb24iPSJsbihXaG9sZSBCb2R5LCBuZy9nKSIsDQogICAgICAgICAgICAgIlNleCI9IlNleCIpLA0KICAgICAgICAgICBzd2FwX3N1YnNjcmlwdF9uYW1lcz1jKA0KICAgICAgICAgICAgICJNIj0iTWFsZSINCiAgICAgICAgICAgKSkNCg0KdGFiX21vZGVsKG5vbWl4YWxsV0IpDQoNCm1vZGVsc3VtbWFyeShkdm5hbWVzKG5vbWl4YWxsV0IpLCANCiAgICAgICAgICAgICBlc3RpbWF0ZT0ie2VzdGltYXRlfSBbe2NvbmYubG93fSwge2NvbmYuaGlnaH1dIiwgDQogICAgICAgICAgICAgc3RhdGlzdGljPU5VTEwsDQogICAgICAgICAgICAgY29lZl9yZW5hbWU9Y29lZl9yZW5hbWUpDQoNCnBsb3RfcHJlZGljdGlvbnMobm9taXhhbGxXQiwgY29uZGl0aW9uPWxpc3QoImxvZ0Rvc2UiLCJDT01QT1VORCIpKSArDQogIHRoZW1lX2NsYXNzaWMoKSArDQogIGxhYnMoeT0iRXN0aW1hdGVkIGxvZ0NvbmNlbnRyYXRpb24iKQ0KDQpwbG90X3ByZWRpY3Rpb25zKG5vbWl4YWxsV0IsIGNvbmRpdGlvbj1saXN0KCJsb2dEb3NlIiwiQ09NUE9VTkQiKSkgKw0KICBmYWNldF93cmFwKH5DT01QT1VORCkrDQogIHRoZW1lX2NsYXNzaWMoKSArDQogIGxhYnMoeT0iRXN0aW1hdGVkIGxvZ0NvbmNlbnRyYXRpb24iKQ0KDQoNCm1hdHJpeChjKHJvd25hbWVzKGFzLmRhdGEuZnJhbWUoY29lZihub21peGFsbFdCKSRDT01QT1VORCkpLA0KICAgICAgICAgcmVwKCIgJiAiLCBOUk9XKGNvZWYobm9taXhhbGxXQikkQ09NUE9VTkQpKSwNCiAgICAgICAgIHJvdW5kKGFzLmRhdGEuZnJhbWUoY29lZihub21peGFsbFdCKSRDT01QT1VORCksMilbLDFdLA0KICAgICAgICAgcmVwKCIgXFwiLCBOUk9XKGNvZWYobm9taXhhbGxXQikkQ09NUE9VTkQpKSksIG5jb2w9NCkNCg0KDQpibWF0cml4ID0gZnVuY3Rpb24oeCwgZGlnaXRzPU5VTEwsIC4uLikgew0KICBsaWJyYXJ5KHh0YWJsZSkNCiAgZGVmYXVsdF9hcmdzID0gbGlzdChpbmNsdWRlLmNvbG5hbWVzPUZBTFNFLCBvbmx5LmNvbnRlbnRzPVRSVUUsDQogICAgICAgICAgICAgICAgICAgICAgaW5jbHVkZS5yb3duYW1lcz1GQUxTRSwgaGxpbmUuYWZ0ZXI9TlVMTCwgY29tbWVudD1GQUxTRSwNCiAgICAgICAgICAgICAgICAgICAgICBwcmludC5yZXN1bHRzPUZBTFNFKQ0KICBwYXNzZWRfYXJncyA9IGxpc3QoLi4uKQ0KICBjYWxsaW5nX2FyZ3MgPSBjKGxpc3QoeD14dGFibGUoeCwgZGlnaXRzPWRpZ2l0cykpLA0KICAgICAgICAgICAgICAgICAgIGMocGFzc2VkX2FyZ3MsDQogICAgICAgICAgICAgICAgICAgICBkZWZhdWx0X2FyZ3Nbc2V0ZGlmZihuYW1lcyhkZWZhdWx0X2FyZ3MpLCBuYW1lcyhwYXNzZWRfYXJncykpXSkpDQogIGNhdCgiXFxiZWdpbntibWF0cml4fVxuIiwNCiAgICAgIGRvLmNhbGwocHJpbnQueHRhYmxlLCBjYWxsaW5nX2FyZ3MpLA0KICAgICAgIlxcZW5ke2JtYXRyaXh9XG4iKQ0KfQ0KDQpibWF0cml4KG1hdHJpeChjKHJvd25hbWVzKGFzLmRhdGEuZnJhbWUoY29lZihub21peGFsbFdCKSRDT01QT1VORCkpLA0KICAgICAgICAgcm91bmQoYXMuZGF0YS5mcmFtZShjb2VmKG5vbWl4YWxsV0IpJENPTVBPVU5EKSwyKVssMV0pLCBuY29sPTIpKQ0KDQpgYGANCg0KJCQgDQpcd2lkZWhhdHtsbihXaG9sZVwgQm9keSxcIG5nL2cpfSAgXHNpbSBOIChcbXUsIGByIHJvdW5kKGFzLmRhdGEuZnJhbWUoVmFyQ29ycihub21peGFsbFdCKSlbMiw1XSwyKWApIFxcDQpcbXUgPVxiZWdpbntibWF0cml4fQ0KICA2OjIgRlRTICYgNy41NSBcXCANCiAgODoyIEZUUyAmIDkuMjIgXFwgDQogIFBGQlMgJiAzLjk0IFxcIA0KICBQRkhwUyAmIDkuMyBcXCANCiAgUEZIeEEgJiAyLjExIFxcIA0KICBQRkh4UyAmIDkuMjUgXFwgDQogIFBGTkEgJiA5LjE0IFxcIA0KICBQRk5TICYgOS4zMSBcXCANCiAgUEZPQSAmIDkuMTcgXFwgDQogIFBGT1MgJiA5LjY4IFxcIA0KICBQRlBlUyAmIDYuMjIgXFwgDQogICBcZW5ke2JtYXRyaXh9ICsgYHIgcm91bmQoZml4ZWYobm9taXhhbGxXQiksMilbWzJdXWAobG4oRG9zZSwgbWcva2cpKSsgYHIgcm91bmQoZml4ZWYobm9taXhhbGxXQiksMilbWzNdXWAoU2V4X3tNPTE7Rj0wfSkNCiQkDQoNCg0KQ29tZXMgZnJvbTogIA0KYGBge3ZlcmJhdGltfQ0KJCQgDQpcd2lkZWhhdHtsbihXaG9sZVwgQm9keSxcIG5nL2cpfSAgXHNpbSBOIChcbXUsIGByIHJvdW5kKGFzLmRhdGEuZnJhbWUoVmFyQ29ycihub21peGFsbFdCKSlbMiw1XSwyKWApIFxcDQpcbXUgPVxiZWdpbntibWF0cml4fQ0KICA2OjIgRlRTICYgNy41NSBcXCANCiAgODoyIEZUUyAmIDkuMjIgXFwgDQogIFBGQlMgJiAzLjk0IFxcIA0KICBQRkhwUyAmIDkuMyBcXCANCiAgUEZIeEEgJiAyLjExIFxcIA0KICBQRkh4UyAmIDkuMjUgXFwgDQogIFBGTkEgJiA5LjE0IFxcIA0KICBQRk5TICYgOS4zMSBcXCANCiAgUEZPQSAmIDkuMTcgXFwgDQogIFBGT1MgJiA5LjY4IFxcIA0KICBQRlBlUyAmIDYuMjIgXFwgDQogICBcZW5ke2JtYXRyaXh9ICsgYHIgcm91bmQoZml4ZWYobm9taXhhbGxXQiksMilbWzJdXWAobG4oRG9zZSwgbWcva2cpKSsgYHIgcm91bmQoZml4ZWYobm9taXhhbGxXQiksMilbWzNdXWAoU2V4X3tNPTE7Rj0wfSkNCiQkDQpgYGANCndyaXR0ZW4gImluIGxpbmUiIGluIHRoZSAuUm1kIGZpbGUuDQoNCg==