# load data from earlier
setwd(dir = "D:/siobh/Documents/Uni/PhD/Y1/Clozapine Project/Git/clozapine-project/")

load("CLOZUK3.fbc.pk.Rdata")
load("CLOZUK3.fbc.pk.gen.Rdata")

# create age^2 variable
CLOZUK3.fbc.pk <- CLOZUK3.fbc.pk %>%
  mutate(std_age2 = as.vector(scale(age_at_assay,center = T, scale = F))^2) 

CLOZUK3.fbc.pk.gen <- CLOZUK3.fbc.pk.gen %>%
  mutate(std_age2 = as.vector(scale(age_at_assay,center = T, scale = F))^2) 

# get the lowest dose per participant (creating a cross-sectional dataset)
CLOZUK3.fbc.pk.min <- CLOZUK3.fbc.pk %>% 
  arrange(neut_num) %>% 
  distinct(LUIN, .keep_all = TRUE)

CLOZUK3.fbc.pk.gen.min <- CLOZUK3.fbc.pk.gen %>% 
  arrange(neut_num) %>% 
  distinct(LUIN, .keep_all = TRUE)


#standardise ur predictors (MIN)
CLOZUK3.fbc.pk.min.std <- datawizard::standardise(x = CLOZUK3.fbc.pk.min, select = c("dailydose", "age_at_assay", "std_age2", "TDS", "clozapine", "norclozapine", "ratio"))

CLOZUK3.fbc.pk.gen.min.std <- datawizard::standardise(x = CLOZUK3.fbc.pk.gen.min, select = c("dailydose", "age_at_assay", "std_age2", "TDS", "clozapine", "norclozapine", "c_PRS", "n_PRS", "est_score", "rs2472297_T", "rs61750900_T", "rs2011425_G", "rs1126545_T", "duffynull"))

#standardise ur predictors (LT/full data)

CLOZUK3.fbc.pk.std <- datawizard::standardise(x = CLOZUK3.fbc.pk, select = c("dailydose", "age_at_assay", "std_age2", "TDS", "clozapine", "norclozapine"))

CLOZUK3.fbc.pk.gen.std <- datawizard::standardise(x = CLOZUK3.fbc.pk.gen, select = c("dailydose", "age_at_assay", "std_age2", "TDS", "clozapine", "norclozapine", "c_PRS", "n_PRS", "est_score", "rs2472297_T", "rs61750900_T", "rs2011425_G", "rs1126545_T"))

Mediation and Longitudinal Analysis to interpret the association between clozapine pharmacokinetics, pharmacogenomics, and absolute neutrophil count.


Siobhan K. Lock, Sophie E. Legge, Djenifer B. Kappel, Isabella R. Willcocks, Marinka Helthuis, John Jansen, James T. R. Walters, Michael J. Owen, Michael C. O’Donovan, Antonio F Pardiñas


Clozapine is effective at reducing symptoms of treatment-resistant schizophrenia, but it can also induce several adverse outcomes including neutropenia and agranulocytosis. We used linear mixed-effect models and structural equation modelling to determine whether pharmacokinetic and genetic variables influence absolute neutrophil count in a longitudinal UK-based sample of clozapine users not currently experiencing neutropenia (N = 811). Increased daily clozapine dose was associated with elevated neutrophil count, amounting to a 133 cells/mm3 rise per standard deviation increase in clozapine dose. One-third of the total effect of clozapine dose was mediated by plasma clozapine and norclozapine levels, which themselves demonstrated opposing, independent associations with absolute neutrophil count. Finally, CYP1A2 pharmacogenomic activity score was associated with absolute neutrophil count, supporting lower neutrophil levels in CYP1A2 poor metabolisers during clozapine use. This information may facilitate identifying at-risk patients and then introducing preventative interventions or individualised pharmacovigilance procedures to help mitigate these adverse haematological reactions.




Introduction

Introduction

Antipsychotics are the primary pharmacological treatments for people with schizophrenia. Response to these drugs is highly variable, and approximately one-third of patients respond insufficiently after several prescriptions1. Formally, the term “treatment-resistant schizophrenia” applies to individuals who do not respond to at least two different antipsychotics taken at a therapeutic dose, for an appropriate length of time, and after having ruled out non-compliance2. Clozapine is the sole evidence-based pharmacotherapy for treatment-resistant schizophrenia, but some clinicians are hesitant to prescribe it due to a range of potential adverse drug reactions (ADRs). The best known of these involve a decline in absolute neutrophil count (ANC) that leads to neutropenia and ultimately agranulocytosis3. Agranulocytosis is a rare, severe, and potentially lethal clozapine-induced ADR that is currently unpredictable4. However, a less severe decline in ANC may also be problematic; it has been suggested that this can result in partial suppression of the immune system even before formal criteria for neutropenia are met, increasing vulnerability to infectious diseases5.

The mechanisms underlying clozapine-induced neutrophil loss are unknown, but it is thought to arise through processes involving clozapine metabolites. The CYP family of enzymes, notably CYP1A2, CYP2D6, and CYP3A4, are heavily involved with the biotransformation of clozapine through its metabolic pathway6, leading to norclozapine and clozapine-N-oxide as key products. However, the drug can also be oxidised to a nitrenium ion, a nitrogenous intermediate characterised by its high reactivity and ability to bind with cells7. The conversion of clozapine to the nitrenium ion is mediated by neutrophil action. Activated neutrophils combat infection by producing an antimicrobial agent, hypochlorous acid, via the enzyme myeloperoxidase. Both hypochlorous acid and myeloperoxidase may also react with clozapine to form the nitrenium ion8,9. It is thought that this reactive intermediate may harm neutrophils through two primary mechanisms: haptenation, in which the nitrenium ion binds irreversibly to neutrophil cell surface proteins, or through overactivation of the glutathione system which may be recruited to form conjugates with the nitrenium ion and detoxify it. Indeed, it is known that both these mechanisms can lead to neutrophil apoptosis10–12.

Regular blood monitoring is a requirement of clozapine prescription both in the UK and in many other countries to reduce the risks of progression from low neutrophil count to formal agranulocytosis13. Nevertheless, despite the superiority of clozapine for managing treatment-resistant schizophrenia in comparison to standard first-line antipsychotics, concerns about ADR risk and monitoring requirements are primary contributors to this drug being underutilised worldwide14. For this reason, identifying factors that are predictive of low neutrophil counts in an otherwise healthy sample of clozapine users could help clinicians to improve clozapine use while supporting patient safety and wellbeing. For example, if clozapine users susceptible to increased risk for infections could be identified, potential harm might be mitigated by prioritising them for seasonal vaccinations or making changes to their blood monitoring regime.

Past research15–17 explored associations between ANC and daily clozapine dose as well as plasma concentrations of clozapine and norclozapine. Generally, higher plasma clozapine concentration has been found to be associated with lower ANC, whereas higher plasma norclozapine concentration has been reported to be associated with higher neutrophil counts. However, as highlighted in a recent review18, there is inconsistency in the literature regarding both the direction and magnitude of effects observed. While this could be in part due to differences in statistical methodology and the use of small samples, it could equally reflect the idiosyncrasy of the ADR leading to ANC decline, alongside the challenges of disentangling the impact of clozapine and its related variables from genetic, demographic, or lifestyle factors that may also influence neutrophil counts.

The present research aims to replicate and extend these previous studies by exploring predictors of ANC in a large, UK-based sample of clozapine users with TRS in whom longitudinal measures were available for both pharmacokinetic variables and full blood counts. Linear mixed-effect models (LMMs) were used to explore associations between pharmacokinetic and pharmacogenomic variables and ANC, while accounting for between- and within-individual variability. Following this, a Structural Equation Modelling (SEM) framework was used to further disentangle the contributions of clozapine dose, from plasma clozapine and plasma norclozapine levels. Genetic predictors relating to clozapine and norclozapine metabolism, as well as baseline variation in ANC were also investigated to determine whether they influenced neutrophil counts in our sample.





Methods

Methods

Sample collection / Participants

We used Full Blood Counts (FBC) and pharmacokinetic assay data from the CLOZUK3 sample19, the most recent wave of the CLOZUK study20. All participants had a diagnosis of treatment-resistant schizophrenia and were prescribed clozapine. Samples were anonymously collected in the UK from the Zaponex Treatment Access System (ZTAS), a clozapine monitoring framework managed by Leyden Delta B.V. (Nijmegen, Netherlands). Sample collection and data extraction procedures for CLOZUK have been detailed previously20,21. The CLOZUK study received UK National Research Ethics Service approval (reference 10/WSE02/15), in accordance with the requirements of the UK Human Tissue Act 2004.


Inclusion / Exclusion Criteria

CLOZUK3 contains longitudinal assay data from participants older than 18 years of age who had not been previously included in prior waves of CLOZUK. We excluded data from assays with missing FBC or pharmacokinetic information or with clerical errors (e.g., several assays taken at the same date and time yielding different results) from further analyses. To retain only apparently healthy individuals, the FBC data were curated by removing any assay showing an ANC outside of the normal reference range (2000 – 7500 cells/mm3). Additionally, and as in previous research19, we removed pharmacokinetic assays (i) where the gap between clozapine intake and blood sampling was outside a 6-24 hour window; (ii) where clozapine and norclozapine plasma concentrations were below instrument detection levels (< 0.05 mg/L); (iii) showing a low daily clozapine dose (< 100mg, potentially indicative of drug titration) or (iv) where the metabolic ratio suggested non-adherence (< 0.5 or > 3.0).


Genetic Data

A subset of individuals (N = 523) in the sample had linked genetic data, based on genotypes from an Illumina Infinium Global Sequencing Array-24 (Illumina Inc, USA). Details regarding the curation and imputation of this genetic data have been described elsewhere19 and summarised in the Supplementary Note. Pharmacogenomic star alleles (i.e., genetic variants or combinations of variants constituting pharmacogenomic markers) for CYP1A2 were called using PyPGx v0.20.022 on the imputed array data. Enzyme activity scores inferred from these star alleles were included in LMMs to determine whether genetic predictors of CYP1A2 activity were associated with ANC. Other pharmacogenomic SNPs (Table 1) identified in a GWAS of clozapine metabolism23 and included in a previous analysis exploring predictors of ANC17 were also investigated.

Polygenic Scores (PGS) for clozapine and norclozapine metabolism were calculated via PRSice2 v2.3524 as part of a previous study21. These were included in secondary analyses. We also explored the impact of the Duffy-null genotype (rs2814778; C/C homozygote) as this has been associated with decreased ANC in clozapine users of African, Asian, and Middle Eastern ancestries25. Finally, the Human Leukocyte Antigen (HLA) system has long been understood as a crucial component of the immune system, with past work linking this genetic locus to agranulocytosis in clozapine users26. Therefore, we imputed HLA types using HIBAG v1.34.127 and incorporated these into LMMs to explore their impact on ANC. Detailed descriptions of CYP1A2 pharmacogenomic allele calling and HLA genotype imputation are found in the Supplementary note.

## Create Table 1

genes <- data.frame(SNP  = c('rs2011425', 'rs61750900', 'rs1126545', 'rs2472297', 'rs2814778'),
                    CHR = c('2', '4', '10', '15', '1' ),
                    Gene = c("UGT1A family", 'UGT2B10', 'CYP2C18', 'CYP1A1-CYP1A2', 'ACKR1' ),
                    Alt = c('G', 'T', 'T',  'T', 'C'),
                    Association = c("Alternative allele linked with decreased plasma norclozapine levels^23^.", "Alternative allele linked with decreased plasma norclozapine levels^23^", "Alternative allele linked with increased metabolic ratio ^23^.", "Alternative allele linked with decreased plasma clozapine levels^23^. ", "Alternative allele homozygosity (Duffy-Null genotype) linked with non-pathological baseline ANC^25^." )
                    )

kable(genes, caption = "Table 1 . SNPs included in regression analyses exploring the impact of pharmacogenomic variation neutrophil levels. SNP = Single Nucleotide Polymorphism; CHR = Chromosome; Alt = Alternative (or Minor) allele.", full_width = F, font_size = 16,
             digits = 2) %>% kable_classic
Table 1 . SNPs included in regression analyses exploring the impact of pharmacogenomic variation neutrophil levels. SNP = Single Nucleotide Polymorphism; CHR = Chromosome; Alt = Alternative (or Minor) allele.
SNP CHR Gene Alt Association
rs2011425 2 UGT1A family G Alternative allele linked with decreased plasma norclozapine levels23.
rs61750900 4 UGT2B10 T Alternative allele linked with decreased plasma norclozapine levels23
rs1126545 10 CYP2C18 T Alternative allele linked with increased metabolic ratio 23.
rs2472297 15 CYP1A1-CYP1A2 T Alternative allele linked with decreased plasma clozapine levels23.
rs2814778 1 ACKR1 C Alternative allele homozygosity (Duffy-Null genotype) linked with non-pathological baseline ANC25.


Statistical Analysis

A Directed Acyclic Graph (DAG) was first drawn to consider the possible causal structure of the clozapine dose – ANC relationship28. As previously recommended29, we explicitly report the rationale for included DAG nodes and relationships in Supplementary Table 3.

Data analyses were performed in R v4.1.1 using R Studio 2023.06.1+52430. The longitudinal dataset was analysed using LMMs in lme4 with ANC as the outcome variable. A baseline model, in line with previous work17, included three pharmacokinetic variables related to clozapine and its metabolism (i.e., daily clozapine dose, plasma clozapine concentration, and plasma norclozapine concentration) alongside covariates for age, age2, sex, and the time between the dose intake and blood sampling (TDS). Participant ID was included in these models as a random effect term. All predictor variables were standardised as described in the Supplementary Note, before fitting the regression model. Further analyses included pharmacogenomic variables (i.e., CYP1A2 activity scores, and the genotypes of pharmacogenomic SNPs outlined in Table 1).

Secondary analyses extended the LMMs by testing for associations between the additional genetic predictors (i.e., PGS for clozapine and norclozapine metabolism, the Duffy-null genotype, and HLA genotypes) with neutrophil counts.

Due to the difficulty of implementing and interpreting causal analyses on longitudinal datasets with irregular time points31, mediation models were fit using the lowest value of ANC reported for each individual as the outcome variable. SEM was conducted using lavaan32 including clozapine and norclozapine plasma concentrations as mediating variables, daily clozapine dose as the exposure, and lowest ANC as the outcome. Residualised versions of these variables were included in the model, as described in the Supplementary Note. Predictor variable residuals were standardised before inclusion in the model.

Further sensitivity analyses tested the robustness of these mediation models, assessing both the impact of using residualised variables and using cross-sectional, as opposed to longitudinal data. Single-mediator analyses were also implemented in the mediation R package33. While this approach can estimate direct and indirect effects in longitudinal datasets it can only accommodate a single mediator variable. Therefore, it was not appropriate for the primary analysis of the multiple mediation model that we defined and evaluated using SEM on cross-sectional data in lavaan. Finally, we attempted to formally replicate the analyses described in previous studies16,17 by implementing linear models, as reported in the Supplementary Note.





Main Results

Main Results

The final curated CLOZUK3 longitudinal dataset included 811 participants, with a total of 2,362 FBC and pharmacokinetic assays taken on the same day. Participants had a mean (SD) age of 40.1 (12.2) years; 28.9% were female (N = 234) and 71.1% were male (N = 577). Full descriptive statistics of the sample at the point of lowest ANC are given in Table 2. While the first occurrence of each individual on our ZTAS dataset is not necessarily the date they started clozapine, we note that about a third of the CLOZUK3 individuals with valid data (32.6%; 264/547) had records spanning at least a year of clozapine treatment.

The DAG (Supplementary Figure 2) displays the possible causal paths between ANC (the outcome), daily clozapine dose (the exposure variable), and plasma concentrations of clozapine and norclozapine (potential mediators between dose and ANC).

# get descriptive statistics for key variables
a <- describeBy(x = dplyr::select(CLOZUK3.fbc.pk.min, c("clozapine", "norclozapine", "dailydose", "TDS", "neut_num", "age_at_assay")), fast = TRUE, group = CLOZUK3.fbc.pk.min$SEX)

# split by sex
aF <- a$FEMALE
aM <- a$MALE

# key stats
Variable <- c('[Clozapine] (mg/L)', '[Norclozapine] (mg/L)', 'Daily dose (mg)', "TDS (hours)", "ANC (x10^9/L)", "Age")
Mean_M <- round(aM$mean, 3)
Mean_F <- round(aF$mean, 3)
SD_M <- round(aM$sd, 3)
SD_F <- round(aF$sd, 3)
Min_M <- round(aM$min, 3)
Min_F <- round(aF$min, 3)
Max_M <- round(aM$max, 3)
Max_F <- round(aF$max, 3)

Male <- cbind(Variable, Mean_M, SD_M, Min_M, Max_M)
Female <- cbind(Mean_F, SD_F, Min_F, Max_F)

table <- cbind(Male, Female)

kable(table, col.names = c("Variable", "Mean","SD","Min","Max", "Mean","SD","Min","Max"), caption = "Table 2. Summary of CLOZUK3 variables used in mediation analysis. Descriptive statistics presented for a ‘cross-sectional’ version of CLOZUK3 where only the entry associated with the lowest value of ANC per person is retained. TDS = Time between Dose and Sample; ANC = Absolute Neutrophil Count; [Clozapine] = Clozapine plasma concentration; [Norclozapine] = Norclozapine plasma concentration.  ") %>%
  kable_styling("none", full_width = T,
                position = "left", font_size = 16) %>%
  add_header_above(c(" " = 1, "Male" = 4, "Female" = 4)) %>% 
  kable_classic 
Table 2. Summary of CLOZUK3 variables used in mediation analysis. Descriptive statistics presented for a ‘cross-sectional’ version of CLOZUK3 where only the entry associated with the lowest value of ANC per person is retained. TDS = Time between Dose and Sample; ANC = Absolute Neutrophil Count; [Clozapine] = Clozapine plasma concentration; [Norclozapine] = Norclozapine plasma concentration.
Male
Female
Variable Mean SD Min Max Mean SD Min Max
[Clozapine] (mg/L) 0.467 0.256 0.052 1.799 0.556 0.322 0.053 1.84
[Norclozapine] (mg/L) 0.259 0.145 0.052 1.234 0.313 0.186 0.059 1.03
Daily dose (mg) 360.637 136.473 100 900 324.797 134.547 100 900
TDS (hours) 13.479 2.305 6.5 24 13.618 2.062 10 23.5
ANC (x10^9/L) 4.166 1.286 2.01 7.41 4.292 1.258 2.02 7.24
Age 39.099 11.863 18 68 42.406 12.804 19 84



Significant associations between pharmacokinetic and pharmacogenomic variables with ANC

# linear mixed effect regression models on longitudinal clozuk3 data
anc_dcnt <- lmer(neut_num~dailydose+clozapine+norclozapine+TDS+SEX+age_at_assay+std_age2 + (1|LUIN), data=CLOZUK3.fbc.pk.std) # base model 

coefs1 <- data.frame(coef(summary(anc_dcnt)))

# including genetic predictors too
anc_dcnt_1a2_snp_as <- lmer(neut_num~dailydose+clozapine+norclozapine+est_score+rs2472297_T+rs61750900_T+rs2011425_G+rs1126545_T+TDS+SEX+age_at_assay+std_age2 + (1|LUIN), data=CLOZUK3.fbc.pk.gen.std) # base model + PGx (SNPs and CYP1A2 Activity Score)

coefs1b <- data.frame(coef(summary(anc_dcnt_1a2_snp_as))) 

All pharmacokinetic variables were significantly associated with ANC (Table 3). ANC was inversely associated with clozapine plasma concentration (β = -0.166, p = 0.002 and positively associated with norclozapine plasma concentration (β = 0.219, p = 6^{-5}). In the original FBC scales, a reduction in ANC of 166 cells/mm3 was observed for every standard deviation increase in plasma clozapine concentration. Likewise, each standard deviation increase in plasma norclozapine concentration was accompanied by a 219 cells/mm3 increase in ANC. We note that daily clozapine dose was also associated with ANC in this model (β = 0.133, p = 1.1^{-4}), corresponding to an estimated rise of 133 cells/mm3 per standard deviation increase in the daily dose.

The pharmacokinetic variables dose, clozapine plasma concentration, and norclozapine plasma concentration remained significantly associated with ANC after incorporating pharmacogenomic predictors in the model for the subset of individuals with genetic data (Table 3). We found no evidence for association between ANC and any of the pharmacogenomic SNPs, PGS for clozapine and norclozapine, or variation in the HLA region (Supplementary Note).

We saw a significant, positive association between CYP1A2 activity score and ANC, in which increased CYP1A2 function (i.e., rapid CYP1A2 metabolism) was associated with increased neutrophil counts (β = 0.155, p = 0.006).As described in the Supplementary Note, this association was independent of rs2472297, a putative regulator of CYP1A2 activity and a genome-wide significant SNP in GWAS of clozapine pharmacokinetics23.

Finally, the presence of the Duffy-Null genotype, observed in just under 5% of the CLOZUK3 sample, was significantly associated with reduced ANC in our sample (β = -0.770; p = 0.002).

# create results table
tab_model(anc_dcnt, anc_dcnt_1a2_snp_as, show.est = TRUE, show.se = TRUE, show.ci = FALSE,
                     show.p = F, collapse.se =  TRUE, show.intercept = FALSE, emph.p = TRUE, digits = 3, digits.re = 3,
                     #order.terms = c(1, 2, 7, 3, 4, 5 ,6),
                     string.pred = "Predictor", string.est = "Estimate (SE)",
                     dv.labels = c("Base Model (Clozapine Dose + Levels)", "Base Model + PGx Predictors"),
                     pred.labels = all_labels,
                     CSS = list(css.table = '+font-family: Roboto; width: 100%;', css.depvarhead = '+font-style: normal; font-weight: normal; text-align = centre',
                                css.thead = 'border-top: blank; text-align = centre; padding: 0.5cm;', css.tdata = 'padding: 0.25cm; text-align = centre;',
                                css.randomparts = 'border-top:1px solid;', css.firsttablerow = 'border-bottom: blank',
                                css.firstsumrow = 'border-top: 1px solid', css.footnote = 'text-align: left;', 
                                css.summary = "padding-top:0.2cm; padding-bottom:0.2cm;"), 
                     title = "Table 3. Results of two Linear Mixed-Effect Models exploring predictors of Absolute Neutrophil Count (ANC). Standardised regression coefficients are reported alongside standard error and p values estimated using the lmerTest package. PGx = Pharmacogenomic; TDS = Time between Dose and Sample; [Clozapine] = Clozapine plasma concentration; [Norclozapine] = Norclozapine plasma concentration; LUIN = Participant Identifier used in CLOZUK3; σ^2^ = Residual Variance; ICC = Intraclass Correlation Coefficient; t~00~ = Random Intercept Variance; N~LUIN~ = Number of participants.",
                     p.style = "stars"
)
Table 3. Results of two Linear Mixed-Effect Models exploring predictors of Absolute Neutrophil Count (ANC). Standardised regression coefficients are reported alongside standard error and p values estimated using the lmerTest package. PGx = Pharmacogenomic; TDS = Time between Dose and Sample; [Clozapine] = Clozapine plasma concentration; [Norclozapine] = Norclozapine plasma concentration; LUIN = Participant Identifier used in CLOZUK3; s2 = Residual Variance; ICC = Intraclass Correlation Coefficient; t00 = Random Intercept Variance; NLUIN = Number of participants.
  Base Model (Clozapine Dose + Levels) Base Model + PGx Predictors
Predictor Estimate (SE) Estimate (SE)
Daily dose 0.133 ***
(0.034)
0.095 *
(0.043)
Clozapine -0.166 **
(0.054)
-0.158 *
(0.065)
Norclozapine 0.219 ***
(0.055)
0.225 ***
(0.065)
TDS 0.039
(0.023)
0.058 *
(0.029)
Sex (Male) -0.110
(0.089)
-0.078
(0.114)
Age 0.220 ***
(0.040)
0.213 ***
(0.051)
Age squared -0.067
(0.038)
-0.072
(0.048)
CYP1A2 Activity Score 0.155 **
(0.056)
rs2472297_T 0.008
(0.057)
rs61750900_T 0.043
(0.049)
rs2011425_G -0.008
(0.052)
rs1126545_T -0.020
(0.051)
Random Effects
σ2 0.748 0.713
τ00 0.883 LUIN 0.965 LUIN
ICC 0.541 0.575
N 811 LUIN 517 LUIN
Observations 2362 1563
Marginal R2 / Conditional R2 0.052 / 0.565 0.060 / 0.601
  • p<0.05   ** p<0.01   *** p<0.001



Plasma Clozapine and Norclozapine levels mediate the Dose – ANC association.

# create residualised versions of parent variables for inclusion in mediation analysis with SEM.
# this allows covariates to be controlled for without including too many variables in the analysis and complicating the model.
# the residualised variables were created by regressing each variable against the covariates sex, age, age^2, and time between dose and sample (TDS).

CLOZUK3.fbc.pk.min$log_dose = NA
CLOZUK3.fbc.pk.min$log_dose = log(CLOZUK3.fbc.pk.min$dailydose)

reg_dose_u <- lm(log_dose ~ TDS+SEX+age_at_assay+std_age2, data=CLOZUK3.fbc.pk.min)$residuals
reg_cloz_g <- glm(clozapine ~ TDS+SEX+age_at_assay+std_age2, data=CLOZUK3.fbc.pk.min, family = Gamma(link = log))$residuals
reg_nor_g <- glm(norclozapine ~ TDS+SEX+age_at_assay+std_age2, data=CLOZUK3.fbc.pk.min, family = Gamma(link = log))$residuals
reg_anc_u <- lm(neut_num ~ TDS+SEX+age_at_assay+std_age2, data=CLOZUK3.fbc.pk.min)$residuals

Dose <- reg_dose_u
Clozapine <- reg_cloz_g
ANC <- reg_anc_u
Norclozapine <- reg_nor_g

# creating new dataframe containing these residualised variables.
Data <- data.frame(Dose = Dose, ANC = ANC, Clozapine = Clozapine, Norclozapine = Norclozapine)

# Standardise variables prior to sem so equivalent to past regression analyses.
Data <- datawizard::standardise(x = Data, select = c("Dose", "Clozapine", "Norclozapine"))
Data_og <- Data
library(lavaan)

# creating mediation model with ANC as outcome, dose as exposure, clozapine as M1, and norclozapine as M2. 

multipleMediation <- '
ANC ~ b1 * Clozapine + b2 * Norclozapine + c * Dose
Clozapine ~ a1 * Dose
Norclozapine ~ d21 * Clozapine
indirect1 := a1 * b1
indirect2 := a1 * d21 * b2
total := c + (a1 * b1) + (a1 * d21 * b2)
Clozapine ~~ Norclozapine
'

# fit model with SEM in lavaan
fit3 <- sem(model = multipleMediation, data = Data)

The primary model (Figure 1) showed evidence of a significant direct effect of daily clozapine dose on ANC (β = 0.15, p = 9^{-4}). The indirect path via both clozapine and norclozapine plasma concentration was also significant (β = 0.057, p = 0.018). However, no indirect effect was observed when plasma clozapine concentration was considered as the sole mediator (β = -0.028, p = 0.116). Secondary analyses revealed that CYP1A2 activity scores appeared to account for part of these associations (Supplementary Note). However, as only some of the CLOZUK3 sample was genotyped (523/811), these models would have reduced statistical power in relation to our main analyses and their results should be considered with caution.

Sensitivity analyses were performed using non-residualised variables in the model, and also by testing single mediators in the longitudinal dataset. These were all consistent with the results of the primary analyses, suggesting that our models were not compromised through the covariates considered for residualisation, or the cross-sectional nature of our multiple mediation tests (Supplementary note).

knitr::include_graphics("Fig1.png")
Figure 1.  Path diagram showing association between Clozapine Dose and Lowest Absolute Neutrophil Count with Plasma Clozapine concentration and Plasma Norclozapine concentration as mediators. Plot edges are labelled with standardised regression coefficients. Variables included in Structural Equation Model are residualised versions of parent measures. Associations between model variables are shown in blue, whereas the overall direct and indirect paths are shown in black. M = Mediator. * p<0.05   ** p<0.01   *** p<0.001

Figure 1. Path diagram showing association between Clozapine Dose and Lowest Absolute Neutrophil Count with Plasma Clozapine concentration and Plasma Norclozapine concentration as mediators. Plot edges are labelled with standardised regression coefficients. Variables included in Structural Equation Model are residualised versions of parent measures. Associations between model variables are shown in blue, whereas the overall direct and indirect paths are shown in black. M = Mediator. * p<0.05 ** p<0.01 *** p<0.001





Discussion

Discussion

Key Findings

The results of the present study provide evidence for associations between both pharmacokinetic and genetic variables with neutrophil count in the CLOZUK3 sample. Daily clozapine dose was positively associated with ANC, and approximately a third of its overall impact was mediated by plasma clozapine and norclozapine levels. We also observed opposing effects of plasma clozapine and norclozapine concentrations on ANC, with plasma clozapine levels inversely associated, and plasma norclozapine levels positively associated with neutrophil counts. Finally, we found evidence that both CYP1A2 activity score and the Duffy-null genotype were associated with ANC.

The direct, positive association between clozapine dose and ANC across our analyses is both novel and unexpected, given that past research has found clozapine dose to be a poor predictor of ANC17,34. Furthermore, the direction of the effect is inconsistent with expectations, given that clozapine is believed to induce neutropenia or agranulocytosis35. This positive relationship could reflect an immune response to clozapine resulting in elevated neutrophil counts, as reported in rats36 and humans37. Further work has shown that an increase in immature neutrophils may occur as part of this immune response38, which could result in raised ANC. Alternatively, the positive association may represent reverse causation, through clinicians altering clozapine prescriptions in response to the full blood count results in ways that are not explicitly endorsed by treatment guidelines. For example, some clinicians might aim to counteract a patient’s low neutrophil levels by reducing daily clozapine dose in hopes of avoiding discontinuation. Alternatively, they might become reluctant to increase clozapine dose due to fear of prompting further neutrophil loss.

The associations between plasma clozapine and norclozapine levels with ANC are consistent with past research15–17. This work cannot firmly establish which aspect of clozapine use engenders neutrophil loss as we have not tested the full range of secondary and tertiary metabolites of this drug (such as N-oxide or N-glucuronides), some of which are known to have reactive properties39. However, taken together these results suggest that individuals with high clozapine levels may be prone to displaying low ANC, and that the plasma norclozapine concentration is unlikely to reflect the toxic component of this process.

The present study also explored the impact of a well-established pharmacogenomic variable, CYP1A2 enzyme activity as inferred from classic star allele calling. We observed a positive association between the CYP1A2 activity score and ANC, in which increased enzyme activity is associated with greater neutrophil counts or, conversely, poor metabolism is associated with lower ANC. This is consistent with current knowledge about clozapine’s metabolic pathway. Both CYP1A2 and CYP3A4 are involved in the metabolism of clozapine, either producing norclozapine or to a lesser extent, clozapine-N-oxide23. Therefore, increased CYP1A2 activity should result in the faster conversion of clozapine to norclozapine, reducing the potentially toxic impact of other metabolites (including clozapine itself) on neutrophil counts. Thus, we provide preliminary evidence that genetically-inferred enzyme activity may have utility for predicting neutrophil counts in a non-neutropenic, clozapine-using population. Future research should be performed across different samples to ascertain the robustness of these results, and following this, could be extended to explore other enzymes involved in clozapine metabolism. It would also be of interest to determine whether similar associations occur in patients with low neutrophil counts indicative of neutropenia and agranulocytosis.

In contrast to previous work17, none of the included pharmacogenomic SNPs were associated with ANC. While we caution this could be partly due to the limited size of the sample with genetic data (N = 523), it does reinforce the need for more genomic studies to better understand the possible impact of these variants on neutrophil counts in clozapine users. Furthermore, neither the PGS for clozapine and norclozapine metabolism nor the assessed HLA genotypes were significantly associated with ANC. However, before correction for multiple comparisons several HLA alleles (i.e., DRB1 16:01, DRB1 04:04, DRB1 01:03) were nominally significant. While increased frequency of HLA-DRB1 16:01 has been previously associated with clozapine-induced agranulocytosis cases40, it has not yet been linked to neutrophil levels in a non-neutropenic population. The other nominally associated alleles have not been implicated in clozapine-induced neutrophil loss but do provide direction for further work investigating the impact of this locus on neutrophil levels in clozapine users.

Finally, as expected from previous work25, a genetic predictor associated with lower non-pathological baseline neutrophil counts, the Duffy-Null genotype, was negatively associated with ANC. This is consistent with observations that the genotype is associated with reduced non-pathological neutrophil counts25. This genotype is most common in individuals of African ancestries but may also be present in those of Middle Eastern and Asian ancestries as it confers resistance to malaria41. However, our work confirms that the influence of this genotype on ANC is also apparent in a sample of people with primarily European ancestries. This supports the notion that testing patients for this genotype might be more helpful in interpreting their blood monitoring assays than simply considering ethnicity as a driver of differences in ANC42. Such genetic testing could increase clinician confidence when prescribing clozapine to people of ancestries where this genotype is common and thus help to combat disparities in clozapine use and prescription and widen access to this medication43.


Strengths and Weaknesses

In the context of research on the pharmacogenomics of treatment-resistant schizophrenia, CLOZUK3 is a relatively large sample linked to an extensive longitudinal blood monitoring dataset. It is therefore better powered than most previous studies to assess the relationships between clozapine dose and metabolites on ANC. Data availability also allowed us to merge and analyse FBC and pharmacokinetic assays taken on the same day, providing a precise relationship between neutrophil counts and plasma clozapine and norclozapine levels. To our knowledge, this is also the first work to establish associations between pharmacogenomics-inferred CYP1A2 activity with neutrophil counts in clozapine users.

A limitation of the present work is that the CLOZUK3 sample was not fully genotyped. Nevertheless, the key pharmacokinetic associations observed in the LMM remain when explored in the subset of the genomically informative sample (Supplementary Note). Furthermore, the participants in the CLOZUK3 dataset were primarily of European ancestry limiting the extent to which the findings can be generalised to other populations. Our findings therefore need to be tested in non-European individuals, as exemplified by the strength of known ancestry-specific genetic effects on ANC25.

We were unable to account for the effects of concomitant medication (e.g., oral contraceptives, some antidepressants), physiology (e.g. weight, BMI), or lifestyle factors (e.g., caffeine consumption, cigarette smoking) that can impact drug clearance44,45. For example, while there are currently no guidelines relating to clozapine dose and patient weight in the UK46, some have suggested that obesity should be considered during clozapine titration47 and that obese individuals might display slower clozapine clearance48,49. There is also some evidence that cigarette and caffeine consumption, habits that both influence and are influenced by CYP1A2 function, can be associated with white blood cell counts44,50–53. Unfortunately, information about these variables was not available in CLOZUK3. Therefore, our study needs replication in an independent sample where the potential of all these factors to either impact clozapine metabolism via phenoconversion or act as a confounder in our models can be explicitly tested.


Implications

Clozapine use is associated with decreased all-cause mortality compared to other commonly used antipsychotic drugs54; however unexpected deaths by various causes remain a rare and currently unpredictable feature of the medication55. While ANC is not necessarily related to mortality itself, a progressive depletion of immune cells has been argued to be a primary contributor to the susceptibility to infectious disease exhibited by clozapine users56,57. The present work found several associations between pharmacokinetic and genetic variables with ANC in a UK-based sample of clozapine users with no detectable immune-related ADRs. Our results could have clinical applicability from the perspective of treatment management, supporting the view that clozapine dose might become a modifiable risk factor in cases with abnormal neutrophil counts. While agranulocytosis and severe neutropenia are considered dose-independent, subclinical variation in ANC might respond to dose alterations. Clozapine metabolism is also a factor to consider as plasma clozapine and norclozapine levels were also significantly associated with ANC in our sample. However, large inter- and intra-individual differences in levels at fixed doses might make it complicated to influence these variables in practice58, though they still could find applicability for the identification of patients at risk of extreme ANCs.

This work adds to a body of research aiming towards a complete understanding of the factors that influence ANC in clozapine users, which could have value in improving access to this gold-standard medication. Currently, there is reluctance amongst some clinicians to prescribe clozapine to patients with schizophrenia. This is primarily due to the risk of neutropenia and agranulocytosis, and the accompanying need for therapeutic blood monitoring to ensure patient safety. While effective at reducing deaths from clozapine-induced agranulocytosis in the UK59, haematological monitoring is time-consuming both from the perspective of the patient, and the clinician. Appropriately interpreting the effects of pharmacokinetic and genetic variables that influence neutrophil loss might allow the design of stratification strategies for clozapine users based on their likelihood of immune-related ADRs, with appropriate adjustments of prescription and monitoring. This could also inform preventative interventions targeting those most likely to experience neutrophil loss, and subsequent immune decline, which may help to prevent serious illness over the duration of clozapine use. Some examples of this might include encouraging at-risk patients to take up offers of seasonal vaccinations, particularly given evidence of reduced vaccine uptake in people with psychiatric disorders60; testing markers of inflammation and adjusting treatment, or introducing further mitigations accordingly. Knowledge of these variables could act as an additional layer of information to guide clinical decision-making and ultimately help to widen access to clozapine via a two-pronged approach: enhancing safety for those at highest risk while reducing obstacles to treatment use for those at lowest risk.


Conclusions

Here, we show daily clozapine dose was positively associated with ANC, with clozapine pharmacokinetics (indexed by clozapine and norclozapine plasma levels) accounting for a third of the total effect. Our analysis of multiple pharmacokinetic and pharmacogenomic variables supports and expands on the results from past research, which for decades has suggested an opposing relationship between ANC and plasma clozapine and norclozapine levels. We build on this to show that these effects exist in a sample in which about a third of the individuals were taking clozapine for over a year, commonly considered to be at a lower risk of immune-related ADRs.

The pharmacokinetic analysis was supplemented by genetic covariates, notably a CYP1A2 activity score inferred from pharmacogenomic star alleles. CYP1A2 activity was positively associated with ANC; however, no associations were seen between neutrophil counts with pharmacogenomic SNPs previously associated with clozapine metabolism. Additional work in larger, more genetically diverse samples is required to clarify the role of pharmacogenomic variation in clozapine metabolism, and its capacity to influence neutrophil levels in clozapine users. In all, this work advances our understanding of the impacts of clozapine use on neutrophil counts, which in the future may help to improve access to clozapine via the development of targeted interventions and personalised drug monitoring schedules based on individual risk factors.





References

References


  1. Kane, J. M. et al. Clinical Guidance on the Identification and Management of Treatment-Resistant Schizophrenia. J Clin Psychiatry 80, 2783 (2019).

  2. Howes, O. D. et al. Treatment-Resistant Schizophrenia: Treatment Response and Resistance in Psychosis (TRRIP) Working Group Consensus Guidelines on Diagnosis and Terminology. AJP 174, 216–229 (2017).

  3. Wiciński, M. & Węclewicz, M. M. Clozapine-induced agranulocytosis/granulocytopenia: mechanisms and monitoring. Current Opinion in Hematology 25, 22–28 (2018).

  4. Taylor, D., Vallianatou, K., Whiskey, E., Dzahini, O. & MacCabe, J. Distinctive pattern of neutrophil count change in clozapine-associated, life-threatening agranulocytosis. Schizophr 8, 21 (2022).

  5. Ponsford, M. J. et al. Clinical and laboratory characteristics of clozapine-treated patients with schizophrenia referred to a national immunodeficiency clinic reveals a B-cell signature resembling common variable immunodeficiency (CVID). Journal of Clinical Pathology 73, 587–592 (2020).

  6. Thorn, C. F., Müller, D. J., Altman, R. B. & Klein, T. E. PharmGKB Summary: Clozapine Pathway, Pharmacokinetics. Pharmacogenet Genomics 28, 214–222 (2018).

  7. Rajagopal, S. Clozapine, agranulocytosis, and benign ethnic neutropenia. Postgraduate Medical Journal 81, 545–546 (2005).

  8. Mütze, S. et al. Myeloperoxidase-derived hypochlorous acid antagonizes the oxidative stress-mediated activation of iron regulatory protein 1. J Biol Chem 278, 40542–40549 (2003).

  9. Aratani, Y. Myeloperoxidase: Its role for host defense, inflammation, and neutrophil function. Archives of Biochemistry and Biophysics 640, 47–52 (2018).

  10. Uetrecht, J., Zahid, N., Tehim, A., Mim Fu, J. & Rakhit, S. Structural features associated with reactive metabolite formation in clozapine analogues. Chemico-Biological Interactions 104, 117–129 (1997).

  11. Franco, R. & Cidlowski, J. A. Apoptosis and glutathione: beyond an antioxidant. Cell Death Differ 16, 1303–1314 (2009).

  12. Ramli, F. F., Ali, A., Syed Hashim, S. A., Kamisah, Y. & Ibrahim, N. Reduction in Absolute Neutrophil Counts in Patient on Clozapine Infected with COVID-19. International Journal of Environmental Research and Public Health 18, 11289 (2021).

  13. Nielsen, J. et al. Worldwide Differences in Regulations of Clozapine Use. CNS Drugs 30, 149–161 (2016).

  14. Oloyede, E. et al. What are the barriers and facilitators of clozapine use in early psychosis? A survey of UK early intervention clinicians. Schizophr 9, 1–7 (2023).

  15. Smith, R. L. et al. Correlation Between Serum Concentrations of N-Desmethylclozapine and Granulocyte Levels in Patients with Schizophrenia: A Retrospective Observational Study. CNS Drugs 31, 991–997 (2017).

  16. Vaquero-Baez, M. et al. Clozapine and desmethylclozapine: correlation with neutrophils and leucocytes counting in Mexican patients with schizophrenia | BMC Psychiatry | Full Text. BMC Psychiatry 19, (2019).

  17. Willcocks, I. R. et al. Clozapine Metabolism is Associated With Absolute Neutrophil Count in Individuals With Treatment-Resistant Schizophrenia. Front Pharmacol 12, 658734 (2021).

  18. Tan, M. S. A. et al. A systematic review and meta-analysis of the association between clozapine and norclozapine serum levels and peripheral adverse drug reactions. Psychopharmacology 238, 615–637 (2021).

  19. Kappel, D. B. et al. Genomic Stratification of Clozapine Prescription Patterns Using Schizophrenia Polygenic Scores. Biological Psychiatry 93, 149–156 (2023).

  20. Pardiñas, A. F. et al. Common schizophrenia alleles are enriched in mutation-intolerant genes and in regions under strong background selection. Nat Genet 50, 381–389 (2018).

  21. Pardiñas, A. F. et al. Pharmacokinetics and pharmacogenomics of clozapine in an ancestrally diverse sample: a longitudinal analysis and genome-wide association study using UK clinical monitoring data. The Lancet Psychiatry 10, 209–219 (2023).

  22. Lee, S., Shin, J.-Y., Kwon, N.-J., Kim, C. & Seo, J.-S. ClinPharmSeq: A targeted sequencing panel for clinical pharmacogenetics implementation. PLOS ONE 17, e0272129 (2022).

  23. Pardiñas, A. F. et al. Pharmacogenomic Variants and Drug Interactions Identified Through the Genetic Analysis of Clozapine Metabolism. AJP 176, 477–486 (2019).

  24. Choi, S. W. & O’Reilly, P. F. PRSice-2: Polygenic Risk Score software for biobank-scale data. GigaScience 8, giz082 (2019).

  25. Legge, S. E. et al. A genome-wide association study in individuals of African ancestry reveals the importance of the Duffy-null genotype in the assessment of clozapine-related neutropenia. Mol Psychiatry 24, 328–337 (2019).

  26. Goldstein, J. I. et al. Clozapine-induced agranulocytosis is associated with rare HLA-DQB1 and HLA-B alleles. Nat Commun 5, 4757 (2014).

  27. Zheng, X. et al. HIBAG—HLA genotype imputation with attribute bagging. Pharmacogenomics J 14, 192–200 (2014).

  28. Rohrer, J. M. Thinking Clearly About Correlations and Causation: Graphical Causal Models for Observational Data. Advances in Methods and Practices in Psychological Science 1, 27–42 (2018).

  29. Ferguson, K. D. et al. Evidence synthesis for constructing directed acyclic graphs (ESC-DAGs): a novel and systematic method for building directed acyclic graphs. International Journal of Epidemiology 49, 322–329 (2020).

  30. R Core Team. R: A Language and Environment for Statistical Computing. (R Foundation for Statistical Computing, 2021).

  31. Zeng, S., Rosenbaum, S., Alberts, S. C., Archie, E. A. & Li, F. Causal mediation analysis for sparse and irregular longitudinal data. The Annals of Applied Statistics 15, 747–767 (2021).

  32. Rosseel, Y. lavaan: An R Package for Structural Equation Modeling. Journal of Statistical Software 48, 1–36 (2012).

  33. Tingley, D., Yamamoto, T., Hirose, K., Keele, L. & Imai, K. mediation: R Package for Causal Mediation Analysis. Journal of Statistical Software 59, 1–38 (2014).

  34. Oyewumi, L. K., Cernovsky, Z. Z., Freeman, D. J. & Streiner, D. L. Relation of Blood Counts during Clozapine Treatment to Serum Concentrations of Clozapine and Nor-Clozapine. Can J Psychiatry 47, 257–261 (2002).

  35. Mijovic, A. & MacCabe, J. H. Clozapine-induced agranulocytosis. Ann Hematol 99, 2477–2482 (2020).

  36. Lobach, A. R. & Uetrecht, J. Clozapine promotes the proliferation of granulocyte progenitors in the bone marrow leading to increased granulopoiesis and neutrophilia in rats. Chem Res Toxicol 27, 1109–1119 (2014).

  37. Pollmächer, T., Fenzel, T., Mullington, J. & Hinze-Selch, D. The Influence of Clozapine Treatment on Plasma Granulocyte Colony-Stimulating (G-CSF) Levels. Pharmacopsychiatry 30, 118–121 (1997).

  38. Ng, W., Kennar, R. & Uetrecht, J. Effect of clozapine and olanzapine on neutrophil kinetics: implications for drug-induced agranulocytosis. Chem Res Toxicol 27, 1104–1108 (2014).

  39. Geib, T., Thulasingam, M., Haeggström, J. Z. & Sleno, L. Investigation of Clozapine and Olanzapine Reactive Metabolite Formation and Protein Binding by Liquid Chromatography-Tandem Mass Spectrometry. Chem. Res. Toxicol. 33, 2420–2431 (2020).

  40. Yunis, J. J. et al. HLA associations in clozapine-induced agranulocytosis. Blood 86, 1177–1183 (1995).

  41. Atallah-Yunes, S. A., Ready, A. & Newburger, P. E. Benign ethnic neutropenia. Blood Reviews 37, 100586 (2019).

  42. Andreou, A., Jayaram, J., Walker, A., Tek, C. & Williams, J. C. Re-examining the utility and validity of benign ethnic neutropenia: A narrative literature review. Schizophrenia Research (2022) doi:10.1016/j.schres.2022.02.009.

  43. Williams, J. C., Harowitz, J., Glover, J., Tek, C. & Srihari, V. Systematic review of racial disparities in clozapine prescribing. Schizophrenia Research 224, 11–18 (2020).

  44. Hägg, S., Spigset, O., Mjörndal, T. & Dahlqvist, R. Effect of caffeine on clozapine pharmacokinetics in healthy volunteers. British Journal of Clinical Pharmacology 49, 59–63 (2000).

  45. Lesche, D., Mostafa, S., Everall, I., Pantelis, C. & Bousman, C. A. Impact of CYP1A2, CYP2C19, and CYP2D6 genotype- and phenoconversion-predicted enzyme activity on clozapine exposure and symptom severity. Pharmacogenomics J 20, 192–201 (2020).

  46. Joint Formulary Committee. British National Formulary [Internet]. (British Medical Association and Royal Pharmaceutical Society of Great Britain).

  47. de Leon, J., Ruan, C.-J., Schoretsanitis, G. & De las Cuevas, C. A Rational Use of Clozapine Based on Adverse Drug Reactions, Pharmacokinetics, and Clinical Pharmacopsychology. Psychother Psychosom 89, 200–214 (2020).

  48. Kuzin, M. et al. Body mass index as a determinant of clozapine plasma concentrations: A pharmacokinetic-based hypothesis. J Psychopharmacol 35, 273–278 (2021).

  49. Reeves, S. et al. A population pharmacokinetic model to guide clozapine dose selection, based on age, sex, ethnicity, body weight and smoking status. British Journal of Clinical Pharmacology doi:10.1111/bcp.15691.

  50. Tennent, R., Ali, A., Wham, C. & Rutherfurd-Markwick, K. Narrative Review: Impact of Genetic Variability of CYP1A2, ADORA2A, and AHR on Caffeine Consumption and Response. Journal of Caffeine and Adenosine Research 10, 125–134 (2020).

  51. Ramanaviciene, A., Acaite, J., Ramanavicius, A. & Ramanavicius, A. Chronic caffeine intake affects lysozyme activity and immune cells in mice. Journal of Pharmacy and Pharmacology 56, 671–676 (2004).

  52. Higuchi, T. et al. Current cigarette smoking is a reversible cause of elevated white blood cell count: Cross-sectional and longitudinal studies. Preventive Medicine Reports 4, 417–422 (2016).

  53. Zeng, L. et al. Cigarette smoking, coffee consumption, alcohol intake, and clozapine metabolism: A Mendelian randomization study. Frontiers in Psychiatry 13, (2022).

  54. Tiihonen, J. et al. 11-year follow-up of mortality in patients with schizophrenia: a population-based cohort study (FIN11 study). Lancet 374, 620–627 (2009).

  55. Rose, E. et al. Causes of death in clozapine-treated patients in a catchment area: a 10-year retrospective case-control study. European Neuropsychopharmacology 36, 160–166 (2020).

  56. Ponsford, M. et al. Clozapine is associated with secondary antibody deficiency. Br J Psychiatry 214, 1–7 (2018).

  57. Griffiths, K. et al. Changes in immunoglobulin levels during clozapine treatment in schizophrenia. 2022.05.18.22275238 Preprint at https://doi.org/10.1101/2022.05.18.22275238 (2022).

  58. Skokou, M. et al. Adverse Drug Reactions in Relation to Clozapine Plasma Levels: A Systematic Review. Pharmaceuticals (Basel) 15, 817 (2022).

  59. Oloyede, E. et al. There Is Life After the UK Clozapine Central Non-Rechallenge Database. Schizophr Bull 47, 1088–1098 (2021).

  60. Bonkat, N., Fellendorf, F. T., Dalkner, N. & Reininghaus, E. Z. Severe mental disorders and vaccinations – a systematic review. The World Journal of Biological Psychiatry 23, 501–516 (2022).





Supplementary Notes: Genetic Variables

Supplementary Notes: Genetic Variables

Quality Control of Genetic Data

A subset of the CLOZUK3 sample was genotyped using the Illumina Infinium Global Screening-24 (Illumina Inc., USA) at Icahn School of Medicine at Mount Sinai (New York City, USA). The “GenotypeQCtoHRC” module of the DRAGON-data pipeline was used to process the genotype data1. This includes quality control of calls, removing individuals with genotyping rates <0.95, and SNPs with call rates <0.95, minor allele frequency <0.01, and with Hardy-Weinberg Equilibrium mid-p < 10-6. Imputation and statistical phasing were carried out via the Michigan Imputation Server and minimac4 using the Haplotype Reference Consortium (HRC) panel2,3. Further quality control was performed on the imputed genotypes, described in previous work4. Genetic data, including Polygenic Scores (PGS) for clozapine and norclozapine metabolism, key pharmacogenomic SNPs, and CYP1A2 activity scores, were merged with the combined CLOZUK3 dataset containing FBC and PK information resulting in a dataset of 523 individuals and 1,586 assays.



Exploring the effects of CYP1A2 Pharmacogenomic Variation on Neutrophil Counts in Clozapine Users

CYP1A2 plays a key role in clozapine metabolism, therefore it is likely that effects of CYP1A2 pharmacogenomic variability might be observed on neutrophil counts. Pharmacogenomic star alleles for CYP1A2 were called using PyPGx v0.20.05 in Python v3.9.26. The imputed genotyping data for CLOZUK3 was passed through the run-chip-pipeline command to derive PGx star alleles for this pharmacogene.

As CPIC-validated information regarding CYP1A2 metabolism phenotypes and activity scores is currently not available, each haplotype was assigned an activity score in line with past work7,8 as described in Supplementary Table 1. These were summed to produce an overall activity score per participant, in which higher scores are reflective of increased enzyme function. Several participants were called with CYP1A2*1F/1C alleles in the same haplotype. These alleles have opposing functions, therefore in line with past work9, we have treated this haplotype as a normal function allele. Pharmacogenomic variation in CYP3A4 was not explored despite its key role in clozapine metabolism on account of the rarity of pharmacogenomic star alleles conferring non-normal function10, and likely difficulties that would arise when trying to fit models using such small sample sizes. Likewise, CYP2D6 variation was not explored as many of the increased function CYP2D6 pharmacogenomic alleles arise from structural copy number variation that cannot be reliably identified through genotyping arrays11.

#import supplementary table 1 from excel file. 

st1 <- readxl::read_xlsx(path = "Supplementary Tables.xlsx", sheet = 1, col_names = TRUE)
cap <- st1[7,1]
st1 <- head(st1, -3)

st1$`EUR Frequency 1` <- as.numeric(st1$`EUR Frequency 1`)
st1$`EUR ALFA Allele Frequency 2`<- as.numeric(st1$`EUR ALFA Allele Frequency 2`)

colnames(st1) <- c("CYP1A2 PGx Star Allele", "Activity Score", "Frequency (CLOZUK3)", "EUR Frequency^12^", "EUR ALFA Frequency^13^")

kable(st1,
      caption = cap, digits = 3) %>%
      kable_styling("none", full_width = T, position = "left", font_size = 16) %>%
      kable_classic()
Supplementary Table 1. CYP1A2 Pharmacogenomic (PGx) star allele activity identified in CLOZUK3. Table shows activity scores assigned to each allele, alongside a comparison of allele frequencies in samples from other populations of European ancestry (Neyshaburinezhad et al., 2021; Phan et al., 2020). PGx = Pharmacogenomic; EUR = European.
CYP1A2 PGx Star Allele Activity Score Frequency (CLOZUK3) EUR Frequency12 EUR ALFA Frequency13
*1A 1.0 0.290 0.298
*1C 0.5 0.000 0.013
*1F 1.5 0.670 0.699 0.704
1C1F 1.0 0.041



The distribution of activity scores is shown in Supplementary Figure 1 and observed allele frequencies compared to previous research in Supplementary Table 112,13. The estimated activity scores were included in a linear mixed-effect model alongside medication variables (i.e., daily dose, plasma clozapine and norclozapine concentration), pharmacogenomic SNPs, and other covariates (i.e., age, age2, sex, TDS) to determine their impact on ANC.

Finally, two further models were fit to compare the effect size of CYP1A2 activity score with, and without including the intergenic CYP1A1-CYP1A2 SNP, rs2472297, in the model. There is evidence that this SNP both regulates CYP1A2 activity14 and is in weak linkage disequilibrium with the *1F allele. Therefore, it was added as a covariate in a second model to determine whether its inclusion impacts any association between measures of CYP1A2 activity with ANC in our sample.


# make plot 

xlev <- c("Poor metaboliser", "Intermediate metaboliser", "Normal metaboliser", 
            "Rapid metaboliser", "Ultrarapid metaboliser", NA)
CLOZUK3.1a2$Pheno <- factor(CLOZUK3.1a2$est_pheno, levels = xlev)


ylev <- c( 2, 2.5, 3)
CLOZUK3.1a2$activity_score <- factor(CLOZUK3.1a2$est_score, levels = ylev)

CLOZUK3.fbc.pk.min.1a2 <- left_join(CLOZUK3.fbc.pk.min, CLOZUK3.1a2, by = "LUIN")
CLOZUK3.fbc.pk.min.1a2 <- na.omit(CLOZUK3.fbc.pk.min.1a2)

ggplot(CLOZUK3.fbc.pk.min.1a2, aes(x = activity_score )) +
  geom_bar(mapping = aes(fill = activity_score)) +
  geom_text(stat='count', aes(label=..count..), vjust=-1) +
  labs(title = "Activity Scores for CYP1A2 for CLOZUK3 Sample") +
  xlab("Activity Score") +
  ylab("Number of Participants") +
  scale_fill_manual(values = c("steelblue", "seagreen2", "mediumpurple1")) +
  theme_minimal() +
  theme(axis.text.x = element_text(angle = 45, vjust = 1, hjust = 1)) +
  guides(fill = FALSE)
Supplementary Figure 1. Distribution of pharmacogenomic allele derived CYP1A2 activity scores observed in the CLOZUK3 sample

Supplementary Figure 1. Distribution of pharmacogenomic allele derived CYP1A2 activity scores observed in the CLOZUK3 sample



Assessing the Impact of HLA Genotypes on Neutrophil Counts

Past research has observed associations between HLA genotypes with risk for clozapine-induced agranulocytosis15–17. Therefore, we explored whether these alleles were associated with ANC in the CLOZUK3 sample. Pre-imputation array data was restricted to chromosome 6 using PLINK v1.918,19. HIBAG v1.34.120 was used to derive HLA alleles, alongside the pre-built InfiniumGlobal-European-HLA4-hg19 prediction model, which best fits the CLOZUK3 data concerning both the genotyping platform and the sample ancestry. This allowed imputation of available HLA genes (-A, -B, -C, -DPB1, -DQA1, -DQB1, -DRB1) to four-digit alleles.

After imputation, alleles with a MAF > 1% were retained for further analysis (Supplementary Table 2), and linear mixed-effect models were used to explore their impact on ANC. Following Levin et al. (2015), genotypes were weighted by posterior imputation probabilities to derive their estimated allele dosage. These were merged with the FBC/PK dataset so that HLA genotypes were associated with the longitudinal assay data (N = 540; 1,627 assays). Each HLA allele was included as a covariate alongside daily clozapine dose, plasma clozapine and norclozapine concentrations, TDS, sex, age, and age2. Covariates were standardised and regressed against ANC, with participant ID included as a random intercept term. A total of 116 alleles across 7 HLA genes were included in the regression analyses. Correction for multiple comparisons was performed using the False Discovery Rate (FDR) and Bonferroni correction.

#import supplementary table 2 from excel file.

st2 <- readxl::read_xlsx(path = "Supplementary Tables.xlsx", sheet = 2, col_names = TRUE)
cap <- st2[nrow(st2),1]
st2 <- head(st2, -2)

kable(st2,
      caption = cap) %>%
      kable_styling("none", full_width = T, position = "left", font_size = 16) %>%
      kable_classic()
Supplementary Table 2. Number of HLA alleles identified in the CLOZUK3 sample, and those remaining after thresholding based on a Minor Allele Frequency of 1% (MAF=0.01).
Gene Total Alleles Identified in CLOZUK3 Number of Alleles included in Analysis (MAF > 1%) Excluded Alleles (MAF < 1%)
HLA-A 28 17 02:02, 02:06, 29:01, 30:04, 33:01, 34:02, 36:01, 66:01, 69:01, 74:01, 80:01
HLA-B 49 25 07:05, 15:02, 15:03, 15:10, 15:16, 15:17, 15:18, 27:02, 35:02, 35:08, 39:06, 40:02, 40:06, 41:01, 41:02, 42:01, 42:02, 44:05, 47:01, 56:01, 39:24, 48:01, 51:08, 81:01
HLA-C 26 17 02:10, 03:02, 08:01, 15:05, 16:02, 14:03, 15:04, 16:04, 18:01
HLA-DPB1 18 13 02:02, 09:01, 15:01, 16:01, 19:01
HLA-DQA1 14 11 03:02, 06:01, 05:09
HLA-DQB1 16 14 03:04, 05:04
HLA-DRB1 36 19 03:02, 04:02, 04:03, 04:05, 04:06, 04:08, 04:10, 08:03, 08:04, 09:01, 11:02, 11:04, 12:02, 14:04, 14:06, 15:03, 16:02





Supplementary Notes: Statistical Methodology

Supplementary Notes: Statistical Methodology

Exclusion of the Metabolic Ratio Variable

Previous work demonstrated that including the clozapine/norclozapine ratio (“metabolic ratio”) as a covariate in a regression model of ANC considerably attenuated the effect sizes of both clozapine and norclozapine plasma concentrations22. However, incorporating ratio variables in regression models has been criticised on the basis that they may result in deceptive statistical artifacts23. Equally, it is possible that the metabolic ratio acts as a collider variable (Supplementary Figure 2; Supplementary Table 3). Controlling for collider variables through their inclusion as covariates, may also introduce spurious associations as described in the causal inference literature24. Therefore, the decision was made to exclude metabolic ratio from the present analyses.

knitr::include_graphics("SFig2.png")
Supplementary Figure 2.  Variables included in DAG showing the possible causal associations between clozapine dose and absolute neutrophil count. Pink circles represent the exposure (Daily Clozapine Dose) and outcome (Absolute Neutrophil). Light green circles represent measured variables, whereas dark green diamonds represent latent variables. Dark grey arrows represent paths between observed variables, whereas light grey arrows represent any path in which one (or both) of the variables involved are unobserved. Black paths represent effects of interest in the main regression and mediation analyses (solid = direct effect; dotted = indirect effect via mediator 1; dashed = indirect effect via mediators 1 & 2; dot-dash = path shared by both indirect effects). TRS = Treatment Resistant Schizophrenia; PGS = Polygenic Score; PGx = Pharmacogenomic; TDS= Time between Dose and Sample.

Supplementary Figure 2. Variables included in DAG showing the possible causal associations between clozapine dose and absolute neutrophil count. Pink circles represent the exposure (Daily Clozapine Dose) and outcome (Absolute Neutrophil). Light green circles represent measured variables, whereas dark green diamonds represent latent variables. Dark grey arrows represent paths between observed variables, whereas light grey arrows represent any path in which one (or both) of the variables involved are unobserved. Black paths represent effects of interest in the main regression and mediation analyses (solid = direct effect; dotted = indirect effect via mediator 1; dashed = indirect effect via mediators 1 & 2; dot-dash = path shared by both indirect effects). TRS = Treatment Resistant Schizophrenia; PGS = Polygenic Score; PGx = Pharmacogenomic; TDS= Time between Dose and Sample.



#import supplementary table 3 from excel file. 
st3 <- readxl::read_xlsx(path = "Supplementary Tables.xlsx", sheet = 3, col_names = TRUE)
capa <- "Supplementary Table 3a. Variables Included in DAG showing the causal associations between clozapine dose and absolute neutrophil count in a sample of clozapine users not currently experiencing neutropenia.  Table 3a shows the included nodes and their properties."

capb <- "Supplementary Table 3b. Variables Included in DAG showing the causal associations between clozapine dose and absolute neutrophil count in a sample of clozapine users not currently experiencing neutropenia. Table 3b shows the paths included and their rationale."
st3 <- head(st3, -2)

# split table so its more legible

st3a <- st3[1:3] %>% na.exclude()
st3b <- st3[4:8] %>% na.exclude()

st3b$Summary <- substring(st3b$Summary,1, nchar(st3b$Summary)-2)


kable(st3a,
      caption = capa) %>%
      kable_styling("none", full_width = T, position = "left", font_size = 16) %>%
      kable_classic()
Supplementary Table 3a. Variables Included in DAG showing the causal associations between clozapine dose and absolute neutrophil count in a sample of clozapine users not currently experiencing neutropenia. Table 3a shows the included nodes and their properties.
# (Node) Nodes Characteristic
1 Absolute Neutrophil Count (ANC) Outcome
2 Age Measured
3 Caffeine Use Latent
4 Cigarette Use Latent
5 Clozapine Dose Exposure
6 Concommitant Medication Latent
7 CYP1A2 Activity Latent
8 Genetic Predictors of CYP1A2 Activity (CYP1A2 Activity Score) Measured
9 Duffy-Null Genotype Measured
10 Metabolic Ratio (Clozapine/Norclozapine) Measured
11 Nitrenium ion Latent
12 Pharmacogenomic (PGx) SNPs Measured
13 Plasma Clozapine Concentration ([Cloz]) Measured
14 Plasma Norclozapine Concentration ([Norcloz]) Measured
15 PRS for Clozapine Metabolism Measured
16 PRS for Norclozapine Metabolism Measured
17 Sex Measured
18 Time Between Dose and Sample (TDS) Measured
19 Treatment Resistant Schizophrenia (TRS) Diagnosis Measured
20 Treatment Resistant Schizophrenia (TRS) Latent
21 Obesity Latent
22 Weight Gain Latent
kable(st3b,
      caption = capb) %>%
      kable_styling("none", full_width = T, position = "left", font_size = 16) %>%
      kable_classic()
Supplementary Table 3b. Variables Included in DAG showing the causal associations between clozapine dose and absolute neutrophil count in a sample of clozapine users not currently experiencing neutropenia. Table 3b shows the paths included and their rationale.
# (Path) From To Summary Reference
1 Age Clozapine Dose Caution is advised when prescribing clozapine to elderly people due to increased likelihood of impaired renal function, resulting in slower titration and/or reduced doses. Kirrane, A., Majumdar, B. and Richman, A., 2018. Clozapine use in old age psychiatry. BJPsych Advances, 24(3), pp.204-211.
2 Age Plasma Clozapine Concentration ([Cloz]) Age is positively associated with plasma clozapine concentration. Lane, H.Y., Chang, Y.C., Chang, W.H., Lin, S.K., Tseng, Y.T. and Jann, M.W., 1999. Effects of gender and age on plasma levels of clozapine and its metabolites: analyzed by critical statistics. Journal of Clinical Psychiatry, 60(1), pp.36-40.
3 Age Plasma Norclozapine Concentration ([Norcloz]) Age is positively associated with plasma norclozapine concentration. Lane, H.Y., Chang, Y.C., Chang, W.H., Lin, S.K., Tseng, Y.T. and Jann, M.W., 1999. Effects of gender and age on plasma levels of clozapine and its metabolites: analyzed by critical statistics. Journal of Clinical Psychiatry, 60(1), pp.36-40.
4 Caffeine Use Absolute Neutrophil Count (ANC) Caffeine consumption was shown to increase white blood cell count in mice. Ramanaviciene, A., Acaite, J., Ramanavicius, A. and Ramanavicius, A., 2004. Chronic caffeine intake affects lysozyme activity and immune cells in mice. Journal of pharmacy and pharmacology, 56(5), pp.671-676.
5 Caffeine Use CYP1A2 Activity Caffeine consumption induces CYP1A2 activity. Tantcheva-Poór, I., Zaigler, M., Rietbrock, S. and Fuhr, U., 1999. Estimation of cytochrome P-450 CYP1A2 activity in 863 healthy Caucasians using a saliva-based caffeine test. Pharmacogenetics, 9(2), pp.131-144.
6 Cigarette Use Clozapine Dose Patient smoking status (and smoking cessation) is a key consideration during clozapine titration and dosing. Correll, C.U., Agid, O., Crespo-Facorro, B., de Bartolomeis, A., Fagiolini, A., Seppälä, N. and Howes, O.D., 2022. A guideline and checklist for initiating and managing clozapine treatment in patients with treatment-resistant schizophrenia. CNS drugs, 36(7), pp.659-679.
7 Cigarette Use Absolute Neutrophil Count (ANC) Cigarette smoking can result in changes to white blood cell count. Higuchi, T., Omata, F., Tsuchihashi, K., Higashioka, K., Koyamada, R. and Okada, S., 2016. Current cigarette smoking is a reversible cause of elevated white blood cell count: Cross-sectional and longitudinal studies. Preventive medicine reports, 4, pp.417-422.
8 Cigarette Use CYP1A2 Activity Cigarette smoking induces CYP1A2 activity. Hukkanen, J., Jacob III, P., Peng, M., Dempsey, D., & Benowitz, N. L. (2011). Effect of nicotine on cytochrome P450 1A2 activity. British journal of clinical pharmacology, 72(5), 836.
9 Clozapine Dose Absolute Neutrophil Count (ANC) Agranulocytosis and Neutropenia are some of the adverse drug reactions that may arise following clozapine use. Miller, D.D., 2000. Review and management of clozapine side effects. The Journal of clinical psychiatry, 61(suppl 8), p.18308.
10 Clozapine Dose Plasma Clozapine Concentration ([Cloz]) Increases in clozapine dose generally result in increased plasma clozapine levels. Rajkumar, A. P., Poonkuzhali, B., Kuruvilla, A., Jacob, M., & Jacob, K. S. (2013). Clinical predictors of serum clozapine levels in patients with treatment-resistant schizophrenia. International clinical psychopharmacology, 28(1), 50-56.
11 Clozapine Dose Weight Gain Clozapine use can result in weight gain as an adverse drug reaction; some research has shown that this weight gain also varies with respect to dose. de Leon, J., Diaz, F.J., Josiassen, R.C., Cooper, T.B. and Simpson, G.M., 2007. Weight gain during a double-blind multidosage clozapine study. Journal of Clinical Psychopharmacology, 27(1), pp.22-27.
12 Concomitant Medication Absolute Neutrophil Count (ANC) Many other medications, not just clozapine, may cause drug-induced neutropenia. Moore, D.C., 2016. Drug-induced neutropenia: a focus on rituximab-induced late-onset neutropenia. Pharmacy and therapeutics, 41(12), p.765.
13 Concomitant Medication CYP1A2 Activity Aside from caffeine and cigarette use, CYP1A2 activity may also be affected by other medications being taken. Guo, J., Zhu, X., Badawy, S., Ihsan, A., Liu, Z., Xie, C. and Wang, X., 2021. Metabolism and mechanism of human cytochrome P450 enzyme 1A2. Current Drug Metabolism, 22(1), pp.40-49.
14 CYP1A2 Activity Plasma Clozapine Concentration ([Cloz]) CYP1A2 is involved in the metabolism of clozapine to norclozapine, therefore increased activity results in faster clearance of clozapine, resulting in decreased levels. Alarcan, H., Cannet, P., Camus, V., Fond, G., Zendjidjian, X., Guilhaumou, R. and Quaranta, S., 2023. Correlation between assessment of cytochrome P450 1A2 activity and enzyme activity scores, and their relation to clozapine exposure. British Journal of Clinical Pharmacology.
15 Genetic Predictors of CYP1A2 Activity (CYP1A2 Activity Score) CYP1A2 Activity A pharmacogenomic activity score is a proxy of enzyme activity calculated on the basis of pharmacogenomic variants of known function in a given pharmacogene. While initially developed for CYP2D6, we have applied it to CYP1A2 on the basis of PharmGKB VIP information. Mukerjee, G., Huston, A., Kabakchiev, B., Piquette-Miller, M., van Schaik, R. and Dorfman, R., 2018. User considerations in assessing pharmacogenomic tests and their clinical support tools. NPJ genomic medicine, 3(1), p.26; Thorn, C.F., Aklillu, E., Klein, T.E. and Altman, R.B., 2012. PharmGKB summary: very important pharmacogene information for CYP1A2. Pharmacogenetics and genomics, 22(1), p.73.
16 Duffy-Null Genotype Absolute Neutrophil Count (ANC) The Duffy-Null Genotype is associated with decreased baseline absolute neutrophil count in carriers compared to non-carriers. Legge, S.E., Pardinas, A.F., Helthuis, M., Jansen, J.A., Jollie, K., Knapper, S., MacCabe, J.H., Rujescu, D., Collier, D.A., O’Donovan, M.C. and Owen, M.J., 2019. A genome-wide association study in individuals of African ancestry reveals the importance of the Duffy-null genotype in the assessment of clozapine-related neutropenia. Molecular psychiatry, 24(3), pp.328-337.
17 Metabolic Ratio (Clozapine/Norclozapine) Absolute Neutrophil Count (ANC) Increases in metabolic ratio (increased plasma clozapine with respect to plasma norclozapine) are associated with decreased ANC. Willcocks, I.R., Legge, S.E., Nalmpanti, M., Mazzeo, L., King, A., Jansen, J., Helthuis, M., Owen, M.J., O’Donovan, M.C., Walters, J.T. and Pardiñas, A.F., 2021. Clozapine metabolism is associated with absolute neutrophil count in individuals with treatment-resistant schizophrenia. Frontiers in Pharmacology, 12, p.658734.
18 Nitrenium ion Absolute Neutrophil Count (ANC) The nitrenium ion is thought to be a key instigator of neutrophil apoptosis in clozapine users. Williams, D.P., Pirmohamed, M., Naisbitt, D.J., Uetrecht, J.P. and Park, B.K., 2000. Induction of metabolism-dependent and-independent neutrophil apoptosis by clozapine. Molecular pharmacology, 58(1), pp.207-216.
19 Pharmacogenomic (PGx) SNPs Plasma Clozapine Concentration ([Cloz]) rs2472297_T was associated with decreased plasma clozapine levels. Pardiñas, A.F., Nalmpanti, M., Pocklington, A.J., Legge, S.E., Medway, C., King, A., Jansen, J., Helthuis, M., Zammit, S., MacCabe, J. and Owen, M.J., 2019. Pharmacogenomic variants and drug interactions identified through the genetic analysis of clozapine metabolism. American Journal of Psychiatry, 176(6), pp.477-486.
20 Pharmacogenomic (PGx) SNPs Plasma Norclozapine Concentration ([Norcloz]) rs2011425_G and rs61750900_T are both associated with decreased plasma norclozapine levels. Pardiñas, A.F., Nalmpanti, M., Pocklington, A.J., Legge, S.E., Medway, C., King, A., Jansen, J., Helthuis, M., Zammit, S., MacCabe, J. and Owen, M.J., 2019. Pharmacogenomic variants and drug interactions identified through the genetic analysis of clozapine metabolism. American Journal of Psychiatry, 176(6), pp.477-486.
21 Pharmacogenomic (PGx) SNPs Metabolic Ratio (Clozapine/Norclozapine) rs1126545_T was associated with increased metabolic ratio. Pardiñas, A.F., Nalmpanti, M., Pocklington, A.J., Legge, S.E., Medway, C., King, A., Jansen, J., Helthuis, M., Zammit, S., MacCabe, J. and Owen, M.J., 2019. Pharmacogenomic variants and drug interactions identified through the genetic analysis of clozapine metabolism. American Journal of Psychiatry, 176(6), pp.477-486.
22 Plasma Clozapine Concentration ([Cloz]) Absolute Neutrophil Count (ANC) Increases in plasma clozapine concentration are associated with decreased ANC. Willcocks, I.R., Legge, S.E., Nalmpanti, M., Mazzeo, L., King, A., Jansen, J., Helthuis, M., Owen, M.J., O’Donovan, M.C., Walters, J.T. and Pardiñas, A.F., 2021. Clozapine metabolism is associated with absolute neutrophil count in individuals with treatment-resistant schizophrenia. Frontiers in Pharmacology, 12, p.658734.
23 Plasma Clozapine Concentration ([Cloz]) Plasma Norclozapine Concentration ([Norcloz]) Norclozapine is the primary product of CYP-mediated clozapine metabolism. Pouget, J.G. and Müller, D.J., 2014. Pharmacogenetics of antipsychotic treatment in schizophrenia. Pharmacogenomics in Drug Discovery and Development, pp.557-587.
24 Plasma Clozapine Concentration ([Cloz]) Metabolic Ratio (Clozapine/Norclozapine) Plasma clozapine concentration is used alongside plasma norclozapine concentration to calculate metabolic ratio. Costa-Dookhan, K.A., Agarwal, S.M., Chintoh, A., Tran, V.N., Stogios, N., Ebdrup, B.H., Sockalingam, S., Rajji, T.K., Remington, G.J., Siskind, D. and Hahn, M.K., 2020. The clozapine to norclozapine ratio: a narrative review of the clinical utility to minimize metabolic risk and enhance clozapine efficacy. Expert opinion on drug safety, 19(1), pp.43-57.
25 Plasma Clozapine Concentration ([Cloz]) Nitrenium Ion Clozapine can be oxidised in the presence of hypochlorous acid and chloride to the nitrenium ion. Ramli, F.F., Ali, A., Syed Hashim, S.A., Kamisah, Y. and Ibrahim, N., 2021. Reduction in absolute neutrophil counts in patient on clozapine infected with COVID-19. International journal of environmental research and public health, 18(21), p.11289.
26 Plasma Norclozapine Concentration ([Norcloz]) Absolute Neutrophil Count (ANC) Increases in plasma norclozapine concentration are associated with increased ANC. Willcocks, I.R., Legge, S.E., Nalmpanti, M., Mazzeo, L., King, A., Jansen, J., Helthuis, M., Owen, M.J., O’Donovan, M.C., Walters, J.T. and Pardiñas, A.F., 2021. Clozapine metabolism is associated with absolute neutrophil count in individuals with treatment-resistant schizophrenia. Frontiers in Pharmacology, 12, p.658734.
27 Plasma Norclozapine Concentration ([Norcloz]) Metabolic Ratio (Clozapine/Norclozapine) Plasma norclozapine concentration is used alongside plasma clozapine concentration to calculate metabolic ratio. Costa-Dookhan, K.A., Agarwal, S.M., Chintoh, A., Tran, V.N., Stogios, N., Ebdrup, B.H., Sockalingam, S., Rajji, T.K., Remington, G.J., Siskind, D. and Hahn, M.K., 2020. The clozapine to norclozapine ratio: a narrative review of the clinical utility to minimize metabolic risk and enhance clozapine efficacy. Expert opinion on drug safety, 19(1), pp.43-57.
28 Plasma Norclozapine Concentration ([Norcloz]) Nitrenium Ion Norclozapine may also react to form a reactive nitrenium intermediate. Kyllesø, L., Smith, R.L., Wollmann, B.M., Karlstad, Ø., Andreassen, O.A. and Molden, E., 2022. Metabolite profiling of clozapine in patients switching versus maintaining treatment: A retrospective pilot study. Journal of Clinical Psychopharmacology, 42(5), p.470.
29 PRS for Clozapine Metabolism Plasma Clozapine Concentration ([Cloz]) PRS for clozapine metabolism was associated with plasma clozapine concentration. Pardiñas, A.F., Kappel, D.B., Roberts, M., Tipple, F., Shitomi-Jones, L.M., King, A., Jansen, J., Helthuis, M., Owen, M.J., O’Donovan, M.C. and Walters, J.T., 2023. Pharmacokinetics and pharmacogenomics of clozapine in an ancestrally diverse sample: a longitudinal analysis and genome-wide association study using UK clinical monitoring data. The Lancet Psychiatry, 10(3), pp.209-219.
30 PRS for Norclozapine Metabolism Plasma Norclozapine Concentration ([Norcloz]) PRS for norclozapine metabolism was associated with plasma norclozapine concentration. Pardiñas, A.F., Kappel, D.B., Roberts, M., Tipple, F., Shitomi-Jones, L.M., King, A., Jansen, J., Helthuis, M., Owen, M.J., O’Donovan, M.C. and Walters, J.T., 2023. Pharmacokinetics and pharmacogenomics of clozapine in an ancestrally diverse sample: a longitudinal analysis and genome-wide association study using UK clinical monitoring data. The Lancet Psychiatry, 10(3), pp.209-219.
31 Sex Treatment Resistant Schizophrenia (TRS) Men are more likely to develop treatment resistant schizophrenia than women. Siskind, D., Orr, S., Sinha, S., Yu, O., Brijball, B., Warren, N., MacCabe, J.H., Smart, S.E. and Kisely, S., 2022. Rates of treatment-resistant schizophrenia from first-episode cohorts: systematic review and meta-analysis. The British Journal of Psychiatry, 220(3), pp.115-120.
32 Sex Clozapine Dose Patient sex taken into consideration during clozapine titration. Correll, C.U., Agid, O., Crespo-Facorro, B., de Bartolomeis, A., Fagiolini, A., Seppälä, N. and Howes, O.D., 2022. A guideline and checklist for initiating and managing clozapine treatment in patients with treatment-resistant schizophrenia. CNS drugs, 36(7), pp.659-679.
33 Sex Plasma Clozapine Concentration ([Cloz]) Being female is associated with increased plasma clozapine concentration in comparison to males. Tang, Y.L., Mao, P., Li, F.M., Li, W., Chen, Q., Jiang, F., Cai, Z.J. and Mitchell, P.B., 2007. Gender, age, smoking behaviour and plasma clozapine concentrations in 193 Chinese inpatients with schizophrenia. British journal of clinical pharmacology, 64(1), pp.49-56; Anderson, S.G., Livingston, M., Couchman, L., Smith, D.J., Connolly, M., Miller, J., Flanagan, R.J. and Heald, A.H., 2015. Sex differences in plasma clozapine and norclozapine concentrations in clinical practice and in relation to body mass index and plasma glucose concentrations: a retrospective survey. Annals of general psychiatry, 14(1), pp.1-4;
34 Sex Absolute Neutrophil Count (ANC) Being female is associated with increased neutrophil counts in comparison to being male. Bain, B.J. and England, J.M., 1975. Normal haematological values: sex difference in neutrophil count. Br Med J, 1(5953), pp.306-309.
35 Time Between Dose and Sample (TDS) Plasma Clozapine Concentration ([Cloz]) Assays were restricted to when the sample was taken within 6 - 24 hours of the dose as plasma concentrations beyond this range might be confounded. Flanagan, R.J., 2010. A practical approach to clozapine therapeutic drug monitoring. CMHP Bulletin, 2, pp.4-5.
36 Time Between Dose and Sample (TDS) Plasma Norclozapine Concentration ([Norcloz]) Assays were restricted to when the sample was taken within 6 - 24 hours of the dose as plasma concentrations beyond this range might be confounded. Flanagan, R.J., 2010. A practical approach to clozapine therapeutic drug monitoring. CMHP Bulletin, 2, pp.4-5.
37 Treatment Resistant Schizophrenia (TRS) Diagnosis Clozapine Dose Clozapine is prescribed to individuals with a diagnosis of treatment resistant schizophrenia due to its effectiveness at dealing with refactory symptoms of schizophrenia. Meltzer, H.Y., 1997. Treatment-resistant schizophrenia-the role of clozapine. Current medical research and opinion, 14(1), pp.1-20.
38 Treatment Resistant Schizophrenia (TRS) Treatment Resistant Schizophrenia (TRS) Diagnosis People with schizophrenia who are not responsive to at least two types of antipsychotic medication, delivered at an appropriate dose, and for an appropriate length of time, and having ruled out non-adherance are diagnosed with Treatment Resistant Schizophrenia. Howes, O.D., McCutcheon, R., Agid, O., De Bartolomeis, A., Van Beveren, N.J., Birnbaum, M.L., Bloomfield, M.A., Bressan, R.A., Buchanan, R.W., Carpenter, W.T. and Castle, D.J., 2017. Treatment-resistant schizophrenia: treatment response and resistance in psychosis (TRRIP) working group consensus guidelines on diagnosis and terminology. American Journal of Psychiatry, 174(3), pp.216-229.
39 Weight Gain Absolute Neutrophil Count (ANC) Increased weight and obesity has been associated with elevated neutrophil counts. Sanchez-Pino, M.D., Richardson, W.S., Zabaleta, J., Puttalingaiah, R.T., Chapple, A.G., Liu, J., Kim, Y., Ponder, M., DeArmitt, R., Baiamonte, L.B. and Wyczechowska, D., 2022. Increased inflammatory low-density neutrophils in severe obesity and effect of bariatric surgery: Results from case-control and prospective cohort studies. EBioMedicine, 77; Uribe-Querol, E. and Rosales, C., 2022. Neutrophils actively contribute to obesity-associated inflammation and pathological complications. Cells, 11(12), p.1883.



R Packages

The full CLOZUK3 dataset was used for linear mixed-effect regression models and single-mediator analyses, benefitting from multiple FBC/pharmacokinetic measurements per patient over time. lme4 and lmerTest were used to fit the LMMs25,26. The mediation package27 was used to perform single-mediation analyses in the longitudinal data.

The CLOZUK3 dataset was transformed into cross-sectional data by taking the lowest observation of ANC for each participant. This reduced dataset was used for multiple-, and single-mediator analyses using Structural Equation Modelling (SEM) in lavaan28, and in replication analyses (i.e., Linear Models) of previous research22,29. Before inclusion in all regression and structural equation models, covariates were standardised (mean-centred and scaled) using the datawizard R package30.



Deriving Residuals for use in Structural Equation Modelling

To account for covariates in the mediation analysis, residualised variables were incorporated during SEM. Each variable was fit as an outcome in separate regression analyses, with the covariates, age, age2, sex, and TDS. ANC was included as the outcome in a linear model. Daily clozapine dose was log-transformed and included as an outcome variable in a linear model. Plasma Clozapine and Norclozapine levels were included in a generalised linear model using a gamma distribution and log link function. Linear models were fit using the lm() function, and generalised linear models were fit using the glm() function. The residuals of the predictors were standardised and then used in place of their parent measure across all mediation analyses unless otherwise specified. In a further model, the impact of CYP1A2 activity score was accounted for by including it alongside age, age2, sex, and TDS in the regression models to produce the residualised variables.





Supplementary Notes: Secondary Analysis

Supplementary Notes: Secondary Analysis

Extending the Linear Mixed Effect Model with Genetic Covariates

# additional lmm analysis with genetic covariates

anc_dcnt_1a2_asss <- lmer(neut_num~dailydose+clozapine+norclozapine+est_score+TDS+SEX+age_at_assay+std_age2 + (1|LUIN), data=CLOZUK3.fbc.pk.gen.std) # activity score + no SNPs

anc_dcnt_1a2_ass <- lmer(neut_num~dailydose+clozapine+norclozapine+est_score+rs2472297_T+TDS+SEX+age_at_assay+std_age2 + (1|LUIN), data=CLOZUK3.fbc.pk.gen.std) # activity score + SNP

anc_dcntdn <- lmer(neut_num~dailydose+clozapine+norclozapine+TDS++SEX+age_at_assay+std_age2+duffynull + (1|LUIN), data=CLOZUK3.fbc.pk.gen.std)  # duffy null added as covariate

anc_dcntprs <- lmer(neut_num~dailydose+clozapine+norclozapine+TDS+SEX+age_at_assay+std_age2+c_PRS+n_PRS+SEX+age_at_assay+std_age2 + (1|LUIN), data=CLOZUK3.fbc.pk.gen.std) # PRS for clozapine metabolism and norclozapine metabolism added as covariate.


coefs_nosnp <- data.frame(coef(summary(anc_dcnt_1a2_asss))) 
coefs_snp <- data.frame(coef(summary(anc_dcnt_1a2_ass))) 
coefs2 <- data.frame(coef(summary(anc_dcntdn))) 
coefs3 <- data.frame(coef(summary(anc_dcntprs)))

To assess the impact, if any, of rs2472297 on the association between CYP1A2 activity score with ANC (Supplementary Table 4), two linear mixed-effect models were fit with and without the SNP as an additional covariate in the model. CYP1A2 activity score was significantly associated with ANC (β = 0.145; p = 0.004). When the SNP was included as a covariate, there was negligible change in the effect size of CYP1A2 activity score (β = 0.142; p = 0.011), and as in the previous pharmacogenomic analysis (Table 3, Main Text), rs2472297 was not associated with ANC in this model (β = 0.004; p = 0.949). This indicates that the observed association between CYP1A2 activity score and ANC is likely not conflated with rs2472297.

#create table - cyp1a2 activity score with and without rs2472297
tab_model(anc_dcnt_1a2_asss, anc_dcnt_1a2_ass,  show.est = TRUE, show.se = TRUE, show.ci = FALSE,
                     show.p = F, collapse.se =  TRUE, show.intercept = FALSE, emph.p = TRUE, digits = 3, digits.re = 3,
                     #order.terms = c(1, 2, 7, 3, 4, 5 ,6),
                     string.pred = "Predictor", string.est = "Estimate (SE)",
                     pred.labels = all_labels,
                     dv.labels = c("Activity Score Alone", "Including rs2472297"),
                     CSS = list(css.table = '+font-family: Roboto; width: 100%;', css.depvarhead = '+font-style: normal; font-weight: normal; text-align = centre',
                                css.thead = 'border-top: blank; text-align = centre; padding: 0.5cm;', css.tdata = 'padding: 0.25cm; text-align = centre;',
                                css.randomparts = 'border-top:1px solid;', css.firsttablerow = 'border-bottom: blank',
                                css.firstsumrow = 'border-top: 1px solid', css.footnote = 'text-align: left;', 
                                css.summary = "padding-top:0.2cm; padding-bottom:0.2cm;"), 
                     title = "Supplementary Table 4. Results of two linear mixed effect models including genetic predictors of Absolute Neutrophil Count. Standardised regression coefficients reported alongside standard error and estimated p valued based on normal distribution. TDS = Time between Dose and Sample; ANC = Absolute Neutrophil Count; PGx = Pharmacogenomic; PRS = Polygenic Risk Scores; LUIN = Participant Identifier used in CLOZUK3; ICC = Intraclass Correlation Coefficient.",
                     p.style = "stars"
)
Supplementary Table 4. Results of two linear mixed effect models including genetic predictors of Absolute Neutrophil Count. Standardised regression coefficients reported alongside standard error and estimated p valued based on normal distribution. TDS = Time between Dose and Sample; ANC = Absolute Neutrophil Count; PGx = Pharmacogenomic; PRS = Polygenic Risk Scores; LUIN = Participant Identifier used in CLOZUK3; ICC = Intraclass Correlation Coefficient.
  Activity Score Alone Including rs2472297
Predictor Estimate (SE) Estimate (SE)
Daily dose 0.094 *
(0.043)
0.098 *
(0.043)
Clozapine -0.152 *
(0.063)
-0.151 *
(0.063)
Norclozapine 0.221 ***
(0.064)
0.219 ***
(0.064)
CYP1A2 Activity Score 0.145 **
(0.050)
0.142 *
(0.056)
TDS 0.054
(0.028)
0.056 *
(0.028)
Sex (Male) -0.090
(0.112)
-0.093
(0.113)
Age 0.213 ***
(0.051)
0.212 ***
(0.051)
Age squared -0.069
(0.048)
-0.069
(0.048)
rs2472297_T 0.004
(0.057)
Random Effects
σ2 0.714 0.711
τ00 0.962 LUIN 0.969 LUIN
ICC 0.574 0.577
N 523 LUIN 521 LUIN
Observations 1586 1580
Marginal R2 / Conditional R2 0.058 / 0.599 0.057 / 0.601
  • p<0.05   ** p<0.01   *** p<0.001



There was no evidence of associations between Polygenic Scores for neither clozapine association (β = 0.034; p = 0.532) or norclozapine metabolism association (β = -0.009; p = 0.863) with ANC. However, a strong negative association (β = -0.77; p = 0.002) between the Duffy-Null genotype and ANC was observed in the CLOZUK3 sample. The presence of the Duffy-Null genotype was linked with a decline in neutrophils of approximately 770 cells/mm3 in comparison to non-carriers. Full estimates from these additional genetic models are included in Supplementary Table 5.

# create table - duffy null and PRS
tab_model(anc_dcntdn, anc_dcntprs,  show.est = TRUE, show.se = TRUE, show.ci = FALSE,
                     show.p = F, collapse.se =  TRUE, show.intercept = FALSE, emph.p = TRUE, digits = 3, digits.re = 3,
                     #order.terms = c(1, 2, 7, 3, 4, 5 ,6),
                     string.pred = "Predictor", string.est = "Estimate (SE)",
                     pred.labels = all_labels,
                     dv.labels = c("Model + DN", "Model + PRS"),
                     CSS = list(css.table = '+font-family: Roboto; width: 100%;', css.depvarhead = '+font-style: normal; font-weight: normal; text-align = centre',
                                css.thead = 'border-top: blank; text-align = centre; padding: 0.5cm;', css.tdata = 'padding: 0.25cm; text-align = centre;',
                                css.randomparts = 'border-top:1px solid;', css.firsttablerow = 'border-bottom: blank',
                                css.firstsumrow = 'border-top: 1px solid', css.footnote = 'text-align: left;', 
                                css.summary = "padding-top:0.2cm; padding-bottom:0.2cm;"), 
                     title = "Supplementary Table 5. Results of two linear mixed effect models including genetic predictors of Absolute Neutrophil Count. Standardised regression coefficients reported alongside standard error and estimated p valued based on normal distribution. TDS = Time between Dose and Sample; ANC = Absolute Neutrophil Count; PGx = Pharmacogenomic; PGS = Polygenic Score; LUIN = Participant Identifier used in CLOZUK3; ICC = Intraclass Correlation Coefficient.",
                     p.style = "stars"
)
Supplementary Table 5. Results of two linear mixed effect models including genetic predictors of Absolute Neutrophil Count. Standardised regression coefficients reported alongside standard error and estimated p valued based on normal distribution. TDS = Time between Dose and Sample; ANC = Absolute Neutrophil Count; PGx = Pharmacogenomic; PGS = Polygenic Score; LUIN = Participant Identifier used in CLOZUK3; ICC = Intraclass Correlation Coefficient.
  Model + DN Model + PRS
Predictor Estimate (SE) Estimate (SE)
Daily dose 0.104 *
(0.043)
0.097 *
(0.043)
Clozapine -0.150 *
(0.063)
-0.151 *
(0.064)
Norclozapine 0.216 ***
(0.065)
0.226 ***
(0.065)
TDS 0.065 *
(0.029)
0.052
(0.029)
Sex (Male) -0.112
(0.114)
-0.094
(0.113)
Age 0.216 ***
(0.052)
0.213 ***
(0.052)
Age squared -0.100 *
(0.049)
-0.071
(0.049)
Duffy-Null (Present) -0.770 **
(0.251)
Clozapine Metabolism PGS 0.034
(0.055)
Norclozapine Metabolism
PGS
-0.009
(0.054)
Random Effects
σ2 0.713 0.715
τ00 0.943 LUIN 0.981 LUIN
ICC 0.569 0.578
N 496 LUIN 523 LUIN
Observations 1526 1586
Marginal R2 / Conditional R2 0.070 / 0.599 0.046 / 0.598
  • p<0.05   ** p<0.01   *** p<0.001



HLA genotypes were similarly included in linear mixed-effect models to explore whether variation in the HLA region influenced neutrophil levels in clozapine users. An overview of these findings is shown in Supplementary Table 6. After controlling for multiple comparisons, no HLA alleles were significantly associated with ANC in the CLOZUK3 sample; this suggests little influence of the HLA region on neutrophil counts in these participants. Prior to this correction, 3 HLA alleles demonstrated nominally significant associations. These included HLA-DRB1 16:01 (β = 0.087; p = 0.001) and HLA-DRB1 04:04 (β = 0.073; p = 0.011), which were positively associated with ANC, alongside HLA-DRB1 01:03 (β = -0.068; p = 0.016), which was inversely associated with ANC.

st6 <- readxl::read_xlsx(path = "Supplementary Tables.xlsx", sheet = 6, col_names = TRUE)
cap <- st6[nrow(st6),1]
st6 <- head(st6, -3)


DT::datatable(st6)

Supplementary Table 6. Condensed results of Linear Mixed Models exploring predictors of Absolute Neutrophil Count (ANC) in the CLOZUK3 sample. HLA genotype was included as a predictor alongside pharmacokinetic variables (i.e., daily clozapine dose, plasma clozapine and norclozapine concentration) and other covariates (i.e., TDS, sex, age, age2). Standardised regression coefficients for the effect of HLA genotype from each analysis alone are reported alongside standard error and p values estimated using lmerTest package. Bonferroni & FDR-adjusted p values are also reported. HLA = Human Leukocyte Antigen; FDR = False Discovery Rate.



Controlling for CYP1A2 Activity in the Mediation Analysis

Linear mixed-effect models revealed a significant association between CYP1A2 activity score and ANC in the CLOZUK3 sample. Thus, to account for the impact of this pharmacogenomic variation on clozapine metabolism, and potentially neutrophil levels, the activity score was residualised out of the included variables, as previously described. In this instance, both the association between dose and ANC (β = 0.1, p = 0.077), and the indirect effect via clozapine and norclozapine were weakened (β = 0.05, p = 0.077). While this attenuation of effects may be due to the inclusion of the CYP1A2 activity score, it could also arise because of the reduced sample size with complete genetic information. Therefore, the primary model was repeated on this subset of the CLOZUK3 sample, to determine how this smaller sample size affected the model output. This resulted in inflated estimates for the previously significant direct (β = 0.251, p = 0.077) and indirect effects (β = 0.125, p = 0.077). A comparison of the three models (Supplementary Figure 3) showed that using a reduced sample size results in larger confidence intervals indicative of a loss of statistical power. Interestingly, controlling for CYP1A2 activity score reduces this uncertainty, bringing the intervals in line with those seen in the primary model, albeit with slightly smaller effect sizes.


Supplementary Figure 3. Forest plot comparing effect estimates between the three Structural Equation Models. ‘Full data’ refers to the first model containing the full CLOZUK3 sample. ‘Genetic Only’ refers to the same model as in Full data, but performed on the subset of the sample for whom genetic data is available. The final model, ‘CYP1A2-controlled’, was performed on the genetic only sample but controls for CYP1A2 activity scores when creating the residualised variables. Effect estimates are standardised, and error bars show 95% confidence intervals.

Supplementary Figure 3. Forest plot comparing effect estimates between the three Structural Equation Models. ‘Full data’ refers to the first model containing the full CLOZUK3 sample. ‘Genetic Only’ refers to the same model as in Full data, but performed on the subset of the sample for whom genetic data is available. The final model, ‘CYP1A2-controlled’, was performed on the genetic only sample but controls for CYP1A2 activity scores when creating the residualised variables. Effect estimates are standardised, and error bars show 95% confidence intervals.



Non-Residualised SEM for Mediation Analysis

# make up data for sem
Dose <- CLOZUK3.fbc.pk.min.std$dailydose
Clozapine <- CLOZUK3.fbc.pk.min.std$clozapine
ANC <- CLOZUK3.fbc.pk.min.std$neut_num
Norclozapine <- CLOZUK3.fbc.pk.min.std$norclozapine
MR <- CLOZUK3.fbc.pk.min.std$ratio

Data_std <- data.frame(Dose = Dose, ANC = ANC, Clozapine = Clozapine, Norclozapine = Norclozapine, MR = MR)

multipleMediation <- '
ANC ~ b1 * Clozapine + b2 * Norclozapine + c * Dose
Clozapine ~ a1 * Dose
Norclozapine ~ d21 * Clozapine
indirect1 := a1 * b1
indirect2 := a1 * d21 * b2
total := c + (a1 * b1) + (a1 * d21 * b2)
Clozapine ~~ Norclozapine
'
# sem on non-residualised, standardised variables.
fit3_nonres <- sem(model = multipleMediation, data = Data_std)

SEM was also used on non-residualised versions of the variables (Supplementary Figure 4) to ensure that controlling for covariates in this way didn’t create spurious results. As in the residualised model, there was a significant positive effect of daily clozapine dose on lowest ANC (β = 0.11, p = 0.017). Equally, there was a significant indirect effect via both clozapine and norclozapine plasma concentrations (β= 0.054, p = 0.015) with no evidence for mediation by plasma clozapine concentration alone (β = -0.017, p = 0.254).

knitr::include_graphics("SFig4.png")
Supplementary Figure 4. Path diagram showing association between Dose and Lowest ANC with Clozapine and Norclozapine as mediators. Plot edges are labelled with standardised regression coefficients. Variables included in SEM are the parent, non-residualised variables. SEM = Structural Equation Modelling. * p<0.05   ** p<0.01   *** p<0.001

Supplementary Figure 4. Path diagram showing association between Dose and Lowest ANC with Clozapine and Norclozapine as mediators. Plot edges are labelled with standardised regression coefficients. Variables included in SEM are the parent, non-residualised variables. SEM = Structural Equation Modelling. * p<0.05 ** p<0.01 *** p<0.001



Single Variable Mediation Analysis

# comparison of mediation analysis in lavaan and mediation using one mediator (clozapine).
simpleMediation <- '
    ANC ~ b * Clozapine + c * Dose
    Clozapine ~ a * Dose
    indirect := a * b
    total    := c + (a * b)
'

fit1 <- sem(model = simpleMediation, data = Data_og)

detach_package(lmerTest) #lmerTest interferes with the mediation package so needs to be removed before hand.

library(mediation)
m_med1 <- lmer(clozapine~dailydose+TDS+SEX+age_at_assay+std_age2 + (1|LUIN), data=CLOZUK3.fbc.pk.std) 
m_dv1 <- lmer(neut_num~dailydose+clozapine+TDS+SEX+age_at_assay+std_age2 + (1|LUIN), data=CLOZUK3.fbc.pk.std) 
m_acme1 <- mediation::mediate(m_med1, m_dv1, sim = 1000, treat="dailydose", mediator="clozapine")


#this function extracts the key information from the output of mediation into a nice data frame. as obtained from:  https://stackoverflow.com/questions/41582486/how-to-convert-r-mediation-summary-to-data-frame

extract_mediation_summary <- function (x) { 

  clp <- 100 * x$conf.level
  isLinear.y <- ((class(x$model.y)[1] %in% c("lm", "rq")) || 
                   (inherits(x$model.y, "glm") && x$model.y$family$family == 
                      "gaussian" && x$model.y$family$link == "identity") || 
                   (inherits(x$model.y, "survreg") && x$model.y$dist == 
                      "gaussian"))

  printone <- !x$INT && isLinear.y

  if (printone) {

    smat <- c(x$d1, x$d1.ci, x$d1.p)
    smat <- rbind(smat, c(x$z0, x$z0.ci, x$z0.p))
    smat <- rbind(smat, c(x$tau.coef, x$tau.ci, x$tau.p))
    smat <- rbind(smat, c(x$n0, x$n0.ci, x$n0.p))

    rownames(smat) <- c("ACME", "ADE", "Total Effect", "Prop. Mediated")

  } else {
    smat <- c(x$d0, x$d0.ci, x$d0.p)
    smat <- rbind(smat, c(x$d1, x$d1.ci, x$d1.p))
    smat <- rbind(smat, c(x$z0, x$z0.ci, x$z0.p))
    smat <- rbind(smat, c(x$z1, x$z1.ci, x$z1.p))
    smat <- rbind(smat, c(x$tau.coef, x$tau.ci, x$tau.p))
    smat <- rbind(smat, c(x$n0, x$n0.ci, x$n0.p))
    smat <- rbind(smat, c(x$n1, x$n1.ci, x$n1.p))
    smat <- rbind(smat, c(x$d.avg, x$d.avg.ci, x$d.avg.p))
    smat <- rbind(smat, c(x$z.avg, x$z.avg.ci, x$z.avg.p))
    smat <- rbind(smat, c(x$n.avg, x$n.avg.ci, x$n.avg.p))

    rownames(smat) <- c("ACME (control)", "ACME (treated)", 
                        "ADE (control)", "ADE (treated)", "Total Effect", 
                        "Prop. Mediated (control)", "Prop. Mediated (treated)", 
                        "ACME (average)", "ADE (average)", "Prop. Mediated (average)")

  }

  colnames(smat) <- c("Estimate", paste(clp, "% CI Lower", sep = ""), 
                      paste(clp, "% CI Upper", sep = ""), "p-value")
  smat

}

out_1med <- extract_mediation_summary(summary(m_acme1))
out_1med <- as.data.frame(out_1med[c(8,9,5,10),]) %>%
  rownames_to_column(var = "Output")

simpleMediation <- '
    ANC ~ b * Norclozapine + c * Dose
    Norclozapine ~ a * Dose
    indirect := a * b
    total    := c + (a * b)
'

fit2 <- sem(model = simpleMediation, data = Data_og)

m_med4 <- lmer(norclozapine~dailydose+TDS+SEX+age_at_assay+std_age2 + (1|LUIN), data=CLOZUK3.fbc.pk.std) 
m_dv4 <- lmer(neut_num~dailydose+norclozapine+TDS+SEX+age_at_assay+std_age2 + (1|LUIN), data=CLOZUK3.fbc.pk.std) 
m_acme4 <- mediation::mediate(m_med4, m_dv4, sim = 1000, treat="dailydose", mediator="norclozapine")


out_4med <- extract_mediation_summary(summary(m_acme4))
out_4med <- as.data.frame(out_4med[c(8,9,5,10),]) %>%
  rownames_to_column(var = "Output")

SEM was performed with residualised plasma clozapine concentration as the lone mediator between dose and lowest ANC (Supplementary Table 7). As before, a significant effect of dose on lowest ANC was observed (β = 0.172, p = 1.1^{-4}), with no support for clozapine as a mediating variable (β = 0.008, p = 0.394). A secondary, causal mediation analysis was performed using the full CLOZUK3 dataset. These results are consistent with the findings derived from using SEM, showing a significant direct effect of daily clozapine dose (ADE = 0.155, p = <2e-16) and no indirect effect transmitted via clozapine plasma concentration (ADE = 0.006, p = 0.574) .

#get supplementary table 7 caption
st7 <- readxl::read_xlsx(path = "Supplementary Tables.xlsx", sheet = 7, col_names = TRUE, skip = 1)
cap <- st7[nrow(st7),1]

# get output from lavann (l) and mediation (m)
l_cloz <- parameterestimates(fit1)[c(7,2,8),]
l_cloz$effect <- c("Indirect", "Direct", "Total")
l_cloz <- dplyr::select(l_cloz, c("effect", "est", "ci.lower", "ci.upper", "pvalue"))
colnames(l_cloz) <- c("Output", "Estimate", "Lower 95% CI", "Upper 95% CI", "p-value")

m_cloz <- out_1med

kable(list(l_cloz, m_cloz), row.names = FALSE,
      caption = cap, digits = 3) %>%
      kable_styling("none", full_width = T, position = "left", font_size = 16) %>%
      add_header_above(c("in Lavaan()" = 1, "in Mediation()" = 1)) %>%
      kable_classic()
in Lavaan()
in Mediation()
Supplementary Table 7. Output from single-variable mediation analyses of dose on ANC (Absolute Neutrophil Count) via plasma clozapine concentration. Table shows estimates of average causal mediated effects (ACME; indirect effect), average direct effect (ADE; direct effect), total effect, and proportion mediated from the lavann (using cross sectional data) and meditation (using longitudinal data) packages.
Output Estimate Lower 95% CI Upper 95% CI p-value
Indirect 0.008 -0.010 0.026 0.394
Direct 0.172 0.085 0.259 0.000
Total 0.180 0.094 0.265 0.000
Output Estimate 95% CI Lower 95% CI Upper p-value
ACME (average) 0.006 -0.014 0.026 0.574
ADE (average) 0.155 0.093 0.222 0.000
Total Effect 0.161 0.099 0.226 0.000
Prop. Mediated (average) 0.033 -0.094 0.179 0.574


A complementary single-mediator SEM was performed with norclozapine as the sole mediating variable. A significant direct effect of daily clozapine dose on lowest ANC is observed (β = 0.154, p = 6.1^{-4}). Additionally, there is some evidence for a mediating effect when we consider norclozapine plasma concentration alone (β = 0.025, p = 0.048). When this analysis was replicated using the longitudinal sample, a significant direct effect was observed again (ADE = 0.133, p = <2e-16). Furthermore, a significant indirect effect via norclozapine was also observed (ACME= 0.029, p = 0.008), shown in Supplementary Table 8.

#get supplementary table 8 caption

st8 <- readxl::read_xlsx(path = "Supplementary Tables.xlsx", sheet = 8, col_names = TRUE, skip = 1)
cap <- st8[nrow(st8),1]

# get output from lavaan (l) and mediation (m)
l_nor <- parameterestimates(fit2)[c(7,2,8),]
l_nor$effect <- c("Indirect", "Direct", "Total")
l_nor <- dplyr::select(l_nor, c("effect", "est",  "ci.lower", "ci.upper", "pvalue"))
colnames(l_nor) <- c("Output", "Estimate", "Lower 95% CI", "Upper 95% CI", "p-value")

m_nor <- out_4med

kable(list(l_nor, m_nor), row.names = FALSE,
      caption = cap, digits = 3) %>%
      kable_styling("none", full_width = T, position = "left", font_size = 16) %>%
      add_header_above(c("in Lavaan()" = 1, "in Mediation()" = 1)) %>%
      kable_classic()
in Lavaan()
in Mediation()
Supplementary Table 8. Output from single-variable mediation analyses of dose on ANC (Absolute Neutrophil Count) via plasma norclozapine concentration. Table shows estimates of average causal mediated effects (ACME; indirect effect), average direct effect (ADE; direct effect), total effect, and proportion mediated from the lavann (using cross sectional data) and meditation (using longitudinal data) packages.
Output Estimate Lower 95% CI Upper 95% CI p-value
Indirect 0.025 0.000 0.050 0.049
Direct 0.154 0.066 0.243 0.001
Total 0.180 0.094 0.265 0.000
Output Estimate 95% CI Lower 95% CI Upper p-value
ACME (average) 0.029 0.007 0.053 0.008
ADE (average) 0.133 0.066 0.204 0.000
Total Effect 0.162 0.096 0.227 0.000
Prop. Mediated (average) 0.181 0.045 0.387 0.008



Replicating Past Studies with Linear Models

setwd(dir = "D:/siobh/Documents/Uni/PhD/Y1/Clozapine Project/Git/clozapine-project/Willcocks2021/")

# Regression ####
masterfile <- read_excel("clozuk.xlsx")
masterfile$dailydose <- as.numeric(masterfile$dailydose) # Format daily dose 
masterfile$daily_dose_c <- as.numeric(masterfile$dailydose_c) # Format standardised daily dose 
masterfile <- masterfile %>%
  dplyr::rename(
    gender = GENDER,
    tds = TDS,
    lowest_anc = LOWEST_ANC,
    lowest_anc_c = LOWEST_ANC_c,
    time_on_treatment = TIMEONTREATMENT,
    time_on_treatment_c = TIMEONTREATMENT_c
  ) # Curate variable names 

masterfile <- masterfile[!duplicated(masterfile$LUIN),] # remove duplicates 

masterfile <- masterfile %>% dplyr::select(c("LUIN", "dailydose", "lowest_anc", "clozapine", "norclozapine", "gender", "age", "agesquared", "tds", "daydiff", "time_on_treatment"))

colnames(masterfile) <- c("LUIN", "dailydose", "neut_num", "clozapine", "norclozapine", "SEX", "age_at_assay", "std_age2", "TDS", "daydiff", "timeontreatment")

# Compute Unstandardised model (The one in the paper)
lm1 <- lm(neut_num ~ clozapine + norclozapine + dailydose + SEX + age_at_assay + std_age2 + TDS + daydiff + timeontreatment , data = masterfile)

# create standardised version of the predictors
masterfiles <- datawizard::standardise(x = masterfile, select = c("dailydose", "age_at_assay", "std_age2", "TDS", "clozapine", "norclozapine", "SEX", "daydiff", "timeontreatment"))

# model for plot (Supplementary Figure 5) using standardised input
lm5 <- lm(neut_num ~ clozapine + norclozapine + dailydose + SEX + age_at_assay + std_age2 + TDS + daydiff + timeontreatment , data = masterfiles)

Three linear models were fit in-line with Willcocks et al., (2021), excluding the covariates Time on Treatment (absent in CLOZUK3) and Days between Assays (as FBC and pharmacokinetic assays were performed on the same day for all our data points), with results reported in Supplementary Table 9. A forest plot comparing standardised regression coefficients obtained from the CLOZUK3 and CLOZUK2 samples is shown in Supplementary Figure 5.

In the first model, daily dose (β = 0.126, p = 0.006) and norclozapine level (β = 0.208, p = 0.015) were both positively associated with ANC. Although not significant, clozapine was negatively associated with ANC (β = -0.121, p = 0.149). The addition of metabolic ratio in the second model, reduced effect sizes for both clozapine plasma concentration (β = -0.052, p = 0.729) and norclozapine plasma concentration (β = 0.139, p = 0.358). Daily clozapine dose was unaffected by this (β = 0.127, p = 0.006), and the metabolic ratio itself was not significantly associated with ANC (β = -0.045, p = 0.581). In the final model, no pharmacogenomic SNPs were associated with ANC. Furthermore, the previous association between daily dose and ANC became smaller and non-significant (β = 0.073, p = 0.215).

tab_model(model1, model2, model3, show.est = TRUE, show.se = TRUE, show.ci = FALSE,
          show.p = F, collapse.se =  TRUE, show.intercept = FALSE, emph.p = TRUE,
          digits = 3, digits.re = 3,
          string.pred = "Predictor", string.est = "Estimate (SE)",
          pred.labels = labels_rep,
          dv.labels = c("Base Model", "Including Metabolic Ratio", "Including Relevant SNPs"),
          CSS = list(css.table = '+font-family: Roboto; width: 100%;', css.depvarhead = '+font-style: normal; font-weight: normal; text-align = centre',
                     css.thead = 'border-top: blank; text-align = centre; padding: 0.5cm;', css.tdata = 'padding: 0.25cm; text-align = centre;',
                     css.randomparts = 'border-top:1px solid;', css.firsttablerow = 'border-bottom: blank',
                     css.firstsumrow = 'border-top: 1px solid', css.footnote = 'text-align: left;', 
                     css.summary = "padding-top:0.2cm; padding-bottom:0.2cm;"),
          title = "Supplementary Table 9. Replication Analysis: Predictors of Lowest Absolute Neutrophil Count. Unstandardised regression coefficients are reported alongside standard error and p value. TDS = Time between Dose and Sample; ANC = Absolute Neutrophil Count.",
          p.style = "stars"
)
Supplementary Table 9. Replication Analysis: Predictors of Lowest Absolute Neutrophil Count. Unstandardised regression coefficients are reported alongside standard error and p value. TDS = Time between Dose and Sample; ANC = Absolute Neutrophil Count.
  Base Model Including Metabolic Ratio Including Relevant SNPs
Predictor Estimate (SE) Estimate (SE) Estimate (SE)
Daily dose 0.126 **
(0.046)
0.127 **
(0.046)
0.073
(0.059)
Clozapine -0.121
(0.084)
-0.052
(0.150)
-0.131
(0.199)
Norclozapine 0.208 *
(0.085)
0.139
(0.151)
0.275
(0.200)
TDS -0.006
(0.044)
-0.008
(0.044)
0.013
(0.057)
Sex (Male) -0.066
(0.099)
-0.065
(0.099)
0.001
(0.124)
Age 0.270 ***
(0.047)
0.272 ***
(0.047)
0.270 ***
(0.059)
Age squared -0.062
(0.047)
-0.061
(0.047)
-0.086
(0.058)
Metabolic Ratio -0.045
(0.081)
0.033
(0.216)
rs2472297_T 0.023
(0.056)
rs61750900_T 0.067
(0.057)
rs2011425_G -0.068
(0.056)
rs1126545_T -0.007
(0.057)
Observations 811 811 517
R2 / R2 adjusted 0.066 / 0.058 0.067 / 0.057 0.071 / 0.049
  • p<0.05   ** p<0.01   *** p<0.001



Supplementary Figure 5. Forest plot comparing standardised regression coefficients from equivalent models between CLOZUK2 (Willcocks et al., 2021) and CLOZUK3 (present work) datasets. The CLOZUK2 and CLOZUK3 (replication) models explore the association between covariates and lowest value of ANC in cross-sectional samples. The CLOZUK3 (lmm) model utilises the available longitudinal data, incorporating a random effect variable for participant ID. Error bars show 95% Confidence Intervals. ANC = Absolute Neutrophil Count; TDS = Time Between Dose and Sample; lmm = Linear Mixed-Effect Model.

Supplementary Figure 5. Forest plot comparing standardised regression coefficients from equivalent models between CLOZUK2 (Willcocks et al., 2021) and CLOZUK3 (present work) datasets. The CLOZUK2 and CLOZUK3 (replication) models explore the association between covariates and lowest value of ANC in cross-sectional samples. The CLOZUK3 (lmm) model utilises the available longitudinal data, incorporating a random effect variable for participant ID. Error bars show 95% Confidence Intervals. ANC = Absolute Neutrophil Count; TDS = Time Between Dose and Sample; lmm = Linear Mixed-Effect Model.





Supplementary References

Supplementary References


  1. Lynham, A. J. et al. DRAGON-Data: a platform and protocol for integrating genomic and phenotypic data across large psychiatric cohorts. BJPsych Open 9, e32 (2023).

  2. Das, S. et al. Next-generation genotype imputation service and methods. Nat Genet 48, 1284–1287 (2016).

  3. McCarthy, S. et al. A reference panel of 64,976 haplotypes for genotype imputation. Nat Genet 48, 1279–1283 (2016).

  4. Pardiñas, A. F. et al. Pharmacokinetics and pharmacogenomics of clozapine in an ancestrally diverse sample: a longitudinal analysis and genome-wide association study using UK clinical monitoring data. The Lancet Psychiatry 10, 209–219 (2023).

  5. Lee, S., Shin, J.-Y., Kwon, N.-J., Kim, C. & Seo, J.-S. ClinPharmSeq: A targeted sequencing panel for clinical pharmacogenetics implementation. PLOS ONE 17, e0272129 (2022).

  6. Van Rossum, G. & Drake, F. L. Python 3 Reference Manual. (2009).

  7. Saiz-Rodríguez, M. et al. Polymorphisms in CYP1A2, CYP2C9 and ABCB1 affect agomelatine pharmacokinetics. J Psychopharmacol 33, 522–531 (2019).

  8. Lesche, D., Mostafa, S., Everall, I., Pantelis, C. & Bousman, C. A. Impact of CYP1A2, CYP2C19, and CYP2D6 genotype- and phenoconversion-predicted enzyme activity on clozapine exposure and symptom severity. Pharmacogenomics J 20, 192–201 (2020).

  9. Tian, D., Natesan, S., White, J. R. & Paine, M. F. Effects of Common CYP1A2 Genotypes and Other Key Factors on Intraindividual Variation in the Caffeine Metabolic Ratio: An Exploratory Analysis. Clin Transl Sci 12, 39–46 (2019).

  10. Werk, A. N. & Cascorbi, I. Functional Gene Variants of CYP3A4. Clinical Pharmacology & Therapeutics 96, 340–348 (2014).

  11. Reisberg, S. et al. Translating genotype data of 44,000 biobank participants into clinical pharmacogenetic recommendations: challenges and solutions. Genetics in Medicine 21, 1345–1354 (2019).

  12. Neyshaburinezhad, N., Ghasim, H., Rouini, M., Daali, Y. & Ardakani, Y. H. Frequency of Important CYP450 Enzyme Gene Polymorphisms in the Iranian Population in Comparison with Other Major Populations: A Comprehensive Review of the Human Data. Journal of Personalized Medicine 11, 804 (2021).

  13. Phan, L. et al. ALFA: allele frequency aggregator. National Center for Biotechnology Information, US National Library of Medicine 10, (2020).

  14. Pardiñas, A. F. et al. Pharmacogenomic Variants and Drug Interactions Identified Through the Genetic Analysis of Clozapine Metabolism. AJP 176, 477–486 (2019).

  15. Goldstein, J. I. et al. Clozapine-induced agranulocytosis is associated with rare HLA-DQB1 and HLA-B alleles. Nat Commun 5, 4757 (2014).

  16. Konte, B. et al. HLA-DQB1 6672G>C (rs113332494) is associated with clozapine-induced neutropenia and agranulocytosis in individuals of European ancestry. Transl Psychiatry 11, 214 (2021).

  17. Ninomiya, K., Saito, T., Ikeda, M., Iwata, N. & Girardin, F. R. Pharmacogenomic-guided clozapine administration based on HLA-DQB1, HLA-B and SLCO1B3-SLCO1B7 variants: an effectiveness and cost-effectiveness analysis. Frontiers in Pharmacology 13, (2022).

  18. Purcell, S. et al. PLINK: A Tool Set for Whole-Genome Association and Population-Based Linkage Analyses. The American Journal of Human Genetics 81, 559–575 (2007).

  19. Chang, C. C. et al. Second-generation PLINK: rising to the challenge of larger and richer datasets. GigaSci 4, 7 (2015).

  20. Zheng, X. et al. HIBAG—HLA genotype imputation with attribute bagging. Pharmacogenomics J 14, 192–200 (2014).

  21. Levin, A. M. et al. Association of HLA-DRB1 with Sarcoidosis Susceptibility and Progression in African Americans. Am J Respir Cell Mol Biol 53, 206–216 (2015).

  22. Willcocks, I. R. et al. Clozapine Metabolism is Associated With Absolute Neutrophil Count in Individuals With Treatment-Resistant Schizophrenia. Front Pharmacol 12, 658734 (2021).

  23. Kronmal, R. A. Spurious Correlation and the Fallacy of the Ratio Standard Revisited. Journal of the Royal Statistical Society. Series A (Statistics in Society) 156, 379–392 (1993).

  24. Rohrer, J. M. Thinking Clearly About Correlations and Causation: Graphical Causal Models for Observational Data. Advances in Methods and Practices in Psychological Science 1, 27–42 (2018).

  25. Bates, D., Mächler, M., Bolker, B. & Walker, S. Fitting Linear Mixed-Effects Models Using lme4. Journal of Statistical Software 67, 1–48 (2015).

  26. Kuznetsova, A., Brockhoff, P. B. & Christensen, R. H. B. lmerTest Package: Tests in Linear Mixed Effects Models. Journal of Statistical Software 82, 1–26 (2017).

  27. Tingley, D., Yamamoto, T., Hirose, K., Keele, L. & Imai, K. mediation: R Package for Causal Mediation Analysis. Journal of Statistical Software 59, 1–38 (2014).

  28. Rosseel, Y. lavaan: An R Package for Structural Equation Modeling. Journal of Statistical Software 48, 1–36 (2012).

  29. Vaquero-Baez, M. et al. Clozapine and desmethylclozapine: correlation with neutrophils and leucocytes counting in Mexican patients with schizophrenia | BMC Psychiatry | Full Text. BMC Psychiatry 19, (2019).

  30. Patil, I. et al. datawizard: An R Package for Easy Data Preparation and Statistical Transformations. Journal of Open Source Software 7, 4684 (2022).





Session Info

Session Info

sessionInfo()
## R version 4.1.1 (2021-08-10)
## Platform: x86_64-w64-mingw32/x64 (64-bit)
## Running under: Windows 10 x64 (build 19045)
## 
## Matrix products: default
## 
## locale:
## [1] LC_COLLATE=English_United Kingdom.1252 
## [2] LC_CTYPE=English_United Kingdom.1252   
## [3] LC_MONETARY=English_United Kingdom.1252
## [4] LC_NUMERIC=C                           
## [5] LC_TIME=English_United Kingdom.1252    
## 
## attached base packages:
## [1] stats     graphics  grDevices utils     datasets  methods   base     
## 
## other attached packages:
##  [1] lmerTest_3.1-3      arsenal_3.6.3       here_1.0.1         
##  [4] jtools_2.2.0        broom.mixed_0.2.9.4 lavaan_0.6-16      
##  [7] mediation_4.5.0     sandwich_3.0-2      mvtnorm_1.1-3      
## [10] MASS_7.3-58         readxl_1.3.1        sjPlot_2.8.14      
## [13] lme4_1.1-30         Matrix_1.5-4        psych_2.3.6        
## [16] kableExtra_1.3.4    lubridate_1.8.0     forcats_1.0.0      
## [19] stringr_1.5.0       dplyr_1.0.7         purrr_0.3.4        
## [22] tidyr_1.2.0         tibble_3.1.6        ggplot2_3.4.2      
## [25] tidyverse_1.3.1     readr_2.1.2         beepr_1.3          
## 
## loaded via a namespace (and not attached):
##   [1] backports_1.4.1     Hmisc_5.0-1         systemfonts_1.0.4  
##   [4] plyr_1.8.6          splines_4.1.1       crosstalk_1.2.0    
##   [7] listenv_0.9.0       TH.data_1.1-2       digest_0.6.28      
##  [10] htmltools_0.5.5     fansi_0.5.0         magrittr_2.0.1     
##  [13] checkmate_2.1.0     cluster_2.1.2       tzdb_0.2.0         
##  [16] globals_0.16.2      modelr_0.1.11       vroom_1.6.1        
##  [19] svglite_2.1.0       lpSolve_5.6.15      colorspace_2.0-2   
##  [22] rvest_1.0.3         haven_2.4.3         xfun_0.39          
##  [25] crayon_1.5.2        jsonlite_1.7.3      survival_3.2-13    
##  [28] zoo_1.8-9           glue_1.6.2          gtable_0.3.3       
##  [31] emmeans_1.8.7       webshot_0.5.5       sjstats_0.18.2     
##  [34] sjmisc_2.8.9        scales_1.2.1        DBI_1.1.3          
##  [37] ggeffects_1.2.3     Rcpp_1.0.8          viridisLite_0.4.2  
##  [40] xtable_1.8-4        performance_0.10.4  htmlTable_2.4.1    
##  [43] tmvnsim_1.0-2       ggstance_0.3.6      foreign_0.8-82     
##  [46] bit_4.0.5           Formula_1.2-5       DT_0.26            
##  [49] stats4_4.1.1        datawizard_0.8.0    htmlwidgets_1.6.2  
##  [52] httr_1.4.6          ellipsis_0.3.2      farver_2.1.1       
##  [55] pkgconfig_2.0.3     nnet_7.3-18         sass_0.4.2         
##  [58] dbplyr_2.1.1        utf8_1.2.2          labeling_0.4.2     
##  [61] effectsize_0.8.3    tidyselect_1.2.0    rlang_1.1.0        
##  [64] munsell_0.5.0       cellranger_1.1.0    tools_4.1.1        
##  [67] cachem_1.0.6        cli_3.1.1           generics_0.1.3     
##  [70] audio_0.1-10        sjlabelled_1.2.0    broom_1.0.5        
##  [73] evaluate_0.21       fastmap_1.1.0       yaml_2.2.2         
##  [76] knitr_1.40          bit64_4.0.5         fs_1.5.2           
##  [79] pander_0.6.5        future_1.33.0       nlme_3.1-162       
##  [82] xml2_1.3.3          compiler_4.1.1      rstudioapi_0.15.0  
##  [85] png_0.1-7           reprex_2.0.2        bslib_0.4.1        
##  [88] pbivnorm_0.6.0      stringi_1.7.6       highr_0.10         
##  [91] parameters_0.21.1   lattice_0.21-8      nloptr_2.0.0       
##  [94] vctrs_0.5.0         pillar_1.9.0        lifecycle_1.0.3    
##  [97] furrr_0.3.1         jquerylib_0.1.4     estimability_1.4.1 
## [100] data.table_1.14.4   insight_0.19.3      R6_2.5.1           
## [103] gridExtra_2.3       parallelly_1.36.0   codetools_0.2-19   
## [106] boot_1.3-28.1       assertthat_0.2.1    rprojroot_2.0.3    
## [109] withr_2.5.0         mnormt_2.0.2        multcomp_1.4-25    
## [112] bayestestR_0.13.1   parallel_4.1.1      hms_1.1.3          
## [115] quadprog_1.5-8      grid_4.1.1          rpart_4.1.19       
## [118] coda_0.19-4         minqa_1.2.4         rmarkdown_2.23     
## [121] numDeriv_2016.8-1.1 base64enc_0.1-3
LS0tDQp0aXRsZTogPGNlbnRlcj4gPHN0cm9uZz4gQ0xPWlVLMyBNZWRpYXRpb24gYW5kIExvbmdpdHVkaW5hbCBBbmFseXNpcyBDb21wYW5pb24gPC9zdHJvbmc+IDwvY2VudGVyPg0KYXV0aG9yOiA8Y2VudGVyPiA8c21hbGw+IFNpb2JoYW4gTG9jayAgPC9zbWFsbD4gPC9jZW50ZXI+DQpkYXRlOiA8Y2VudGVyPiA8c21hbGw+IGByIGZvcm1hdChTeXMuRGF0ZSgpLCBmb3JtYXQ9IiVCICVkICVZIilgIDwvc21hbGw+IDwvY2VudGVyPg0Kb3V0cHV0OiANCiAgaHRtbF9kb2N1bWVudDoNCiAgICBjc3M6ICJzdHlsZS5jc3MiICAgICAgICANCiAgICBjb2RlX2Rvd25sb2FkOiB0cnVlIA0KICAgIGNvZGVfZm9sZGluZzogJ2hpZGUnDQogICAgdGhlbWU6DQogICAgICBjb2xvci1jb250cmFzdC13YXJuaW5nczogZmFsc2UNCiAgICAgIGJnOiAiI0VGRUZFRiINCiAgICAgIGZnOiAiIzAwMCINCiAgICAgIHByaW1hcnk6ICIjMGQ3MDVlIg0KICAgICAgc2Vjb25kYXJ5OiAiIzM1Nzc4QyINCiAgICAgIGJhc2VfZm9udDoNCiAgICAgICAgZ29vZ2xlOiBNb250c2VycmF0DQogICAgICBoZWFkaW5nX2ZvbnQ6DQogICAgICAgIGdvb2dsZTogQnVuZ2VlDQogICAgICBjb2RlX2ZvbnQ6DQogICAgICAgIGdvb2dsZTogIlJvYm90byBNb25vIg0KICAgIGhpZ2hsaWdodDogcHlnbWVudHMNCiAgICANCg0KLS0tDQoNCjxzdHlsZT4gDQoNCg0KDQpib2R5IHsNCiAgbWF4LXdpZHRoOiAxOTIwcHg7DQogIG1hcmdpbi1sZWZ0OiAwOw0KICBtYXJnaW4tcmlnaHQ6IDA7DQp9DQoNCg0KI2hlYWRlciB7IA0KICAvKiBQZXJtYWxpbmsgLSB1c2UgdG8gZWRpdCBhbmQgc2hhcmUgdGhpcyBncmFkaWVudDogaHR0cHM6Ly9jb2xvcnppbGxhLmNvbS9ncmFkaWVudC1lZGl0b3IvI2UzYWRmZiswLDJhOWJkOCs0OCwwZDcwNWUrOTAgKi8NCiAgYmFja2dyb3VuZDogI2UzYWRmZjsgLyogT2xkIGJyb3dzZXJzICovDQogIGJhY2tncm91bmQ6IC1tb3otbGluZWFyLWdyYWRpZW50KGxlZnQsICAjZTNhZGZmIDAlLCAjMmE5YmQ4IDQ4JSwgIzBkNzA1ZSA5MCUpOyAvKiBGRjMuNi0xNSAqLw0KICBiYWNrZ3JvdW5kOiAtd2Via2l0LWxpbmVhci1ncmFkaWVudChsZWZ0LCAgI2UzYWRmZiAwJSwjMmE5YmQ4IDQ4JSwjMGQ3MDVlIDkwJSk7IC8qIENocm9tZTEwLTI1LFNhZmFyaTUuMS02ICovDQogIGJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudCh0byByaWdodCwgICNlM2FkZmYgMCUsIzJhOWJkOCA0OCUsIzBkNzA1ZSA5MCUpOyAvKiBXM0MsIElFMTArLCBGRjE2KywgQ2hyb21lMjYrLCBPcGVyYTEyKywgU2FmYXJpNysgKi8NCiAgZmlsdGVyOiBwcm9naWQ6RFhJbWFnZVRyYW5zZm9ybS5NaWNyb3NvZnQuZ3JhZGllbnQoIHN0YXJ0Q29sb3JzdHI9JyNlM2FkZmYnLCBlbmRDb2xvcnN0cj0nIzBkNzA1ZScsR3JhZGllbnRUeXBlPTEgKTsgLyogSUU2LTkgKi8NCiAgY29sb3I6ICNFRkVGRUY7DQogIGhlaWdodDogNDAwcHg7DQogIHBhZGRpbmc6IDE1cHg7DQogIH0NCg0KLm1haW4tY29udGFpbmVyIHsNCiAgbWF4LXdpZHRoOiAxMjAwcHg7DQogIG1hcmdpbi1sZWZ0OiBhdXRvOw0KICBtYXJnaW4tcmlnaHQ6IGF1dG87DQogIH0NCg0KZGl2LmJsdWUgeyBiYWNrZ3JvdW5kLWNvbG9yOiNFRkVGRUY7IGJvcmRlci1yYWRpdXM6IDIwcHg7IHBhZGRpbmc6IDIwcHg7fQ0KDQo8L3N0eWxlPg0KDQoNCg0KYGBge3Igc2V0IHVwLCBlY2hvID0gRiwgd2FybmluZz0gRkFMU0V9DQoNCmtuaXRyOjpvcHRzX2NodW5rJHNldCh3YXJuaW5nID0gRkFMU0UsIG1lc3NhZ2UgPSBGQUxTRSwgZWNobyA9IFRSVUUsIGZpZy5hbGlnbiA9ICJjZW50ZXIiLCBkZXYgPSAicG5nIiwgZGV2LmFyZ3M9bGlzdChiZz0idHJhbnNwYXJlbnQiKSkgDQpvcHRpb25zKGtuaXRyLmthYmxlLk5BID0gJycpDQpvcHRpb25zKHNjaXBlbiA9IDApDQpvcHRpb25zKGRpZ2l0cyA9IDMpDQoNCg0KbGlicmFyeShiZWVwcikNCg0Kb3B0aW9ucyhlcnJvciA9IGZ1bmN0aW9uKCl7ICAgICMgQmVlcCBvbiBlcnJvcg0KICBiZWVwcjo6YmVlcChzb3VuZCA9IDEwKQ0KICBTeXMuc2xlZXAodGltZSA9IDEpDQogIH0NCiApDQoNCi5MYXN0IDwtIGZ1bmN0aW9uKCkgeyAgICAgICAgICAjIEJlZXAgb24gZXhpdGluZyBzZXNzaW9uDQogIGJlZXByOjpiZWVwKHNvdW5kID0gNSkNCiAgU3lzLnNsZWVwKHRpbWUgPSAxKQ0KfQ0KDQoNCmRldGFjaF9wYWNrYWdlIDwtIGZ1bmN0aW9uKHBrZywgY2hhcmFjdGVyLm9ubHkgPSBGQUxTRSkNCnsNCiAgaWYoIWNoYXJhY3Rlci5vbmx5KQ0KICB7DQogICAgcGtnIDwtIGRlcGFyc2Uoc3Vic3RpdHV0ZShwa2cpKQ0KICB9DQogIHNlYXJjaF9pdGVtIDwtIHBhc3RlKCJwYWNrYWdlIiwgcGtnLCBzZXAgPSAiOiIpDQogIHdoaWxlKHNlYXJjaF9pdGVtICVpbiUgc2VhcmNoKCkpDQogIHsNCiAgICBkZXRhY2goc2VhcmNoX2l0ZW0sIHVubG9hZCA9IFRSVUUsIGNoYXJhY3Rlci5vbmx5ID0gVFJVRSkNCiAgfQ0KfQ0KDQpzZXQuc2VlZCg2NjYpDQpgYGANCg0KPGJyPg0KPGJyPg0KDQpgYGB7ciBsb2FkIHBhY2thZ2VzLCBpbmNsdWRlPUZBTFNFfQ0KbGlicmFyeShyZWFkcikNCmxpYnJhcnkodGlkeXZlcnNlKQ0KbGlicmFyeShkcGx5cikNCmxpYnJhcnkobHVicmlkYXRlKQ0KbGlicmFyeShrYWJsZUV4dHJhKQ0KbGlicmFyeShwc3ljaCkNCmxpYnJhcnkobG1lNCkNCmxpYnJhcnkoc2pQbG90KQ0KbGlicmFyeShsbWVyVGVzdCkNCmxpYnJhcnkocmVhZHhsKQ0KbGlicmFyeShtZWRpYXRpb24pDQpsaWJyYXJ5KGxhdmFhbikNCmxpYnJhcnkoYnJvb20ubWl4ZWQpDQpsaWJyYXJ5KGp0b29scykNCmBgYA0KDQoNCmBgYHtyIGdldCBkYXRhIC0gRkJDLCBpbmNsdWRlID0gRkFMU0V9DQoNCnNldHdkKGRpciA9ICJEOi9zaW9iaC9Eb2N1bWVudHMvVW5pL1BoRC9ZMS9DbG96YXBpbmUgUHJvamVjdC9HaXQvY2xvemFwaW5lLXByb2plY3QvIikNCg0KIyBsb2FkIGluIGZiYyBkYXRhDQpDTE9aVUszLmZiYyA8LSByZWFkX2RlbGltKCJGQkMvQ0xPWlVLM19GQkNkYXRhXzE0MDcyMS50eHQiLGRlbGltPSJcdCIpDQoNCiMgZGVhbCB3LyBkYXRlcyANCkNMT1pVSzMuZmJjIDwtIENMT1pVSzMuZmJjICU+JSBtdXRhdGUoQ0xPWlVLMy5mYmMsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZWRhdGU9ZG15KHNhbXBsZWRhdGUpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGV0aW1lPWhtcyhzYW1wbGV0aW1lKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxleWVhcj15ZWFyKHNhbXBsZWRhdGUpKQ0KIyB0YWtlIGEgbG9vayBhdCB0aGUgZGF0YQ0KQ0xPWlVLMy5mYmMgJT4lIGdyb3VwX2J5KFNFWCkgJT4lIHN1bW1hcmlzZSgiU2FtcGxlIFNpemUiPW5fZGlzdGluY3QoTFVJTikpDQoNCiMgY2FsY3VsYXRlIGFnZSBhdCBhc3NheQ0KQ0xPWlVLMy5mYmMkYWdlX2F0X2Fzc2F5IDwtIENMT1pVSzMuZmJjJHNhbXBsZXllYXIgLSBDTE9aVUszLmZiYyRZT0INCg0KIyBBcmUgdGhlcmUgYW55IGluZGl2aWR1YWxzIGJlbG93IDE4IHllYXJzIG9mIGFnZT8NCnUxOCA8LSB1bmlxdWUoQ0xPWlVLMy5mYmMkTFVJTltDTE9aVUszLmZiYyRhZ2VfYXRfYXNzYXkgPCAxOF0pICMgNiBJIHRoaW5rLCAxIDE2IHlvIGFuZCA1IDE3IHlvLg0KDQojIHJlbW92ZSB0aGVtIGZyb20gYW5hbHlzaXMNCkNMT1pVSzMuZmJjIDwtIGZpbHRlcihDTE9aVUszLmZiYywgIShMVUlOICVpbiUgdTE4KSkNCg0KIyBJcyBhbnkgaW5kaXZpZHVhbCBsaXN0ZWQgYXMgaGF2aW5nIG11bHRpcGxlIGFnZXMgb3Igc2V4ZXM/DQpjaGVja19zZXggPC0gQ0xPWlVLMy5mYmMlPiVncm91cF9ieShMVUlOKSU+JXN1bW1hcmlzZShzZXhlcz1sZW5ndGgodW5pcXVlKFNFWCkpKQ0KbWlzbWF0Y2hfc2V4IDwtIGNoZWNrX3NleCRMVUlOW2NoZWNrX3NleCRzZXhlcyA+PSAyXQ0KQ0xPWlVLMy5mYmMlPiVncm91cF9ieShMVUlOKSU+JXN1bW1hcmlzZShzZXhlcz1sZW5ndGgodW5pcXVlKFNFWCkpKSU+JWZpbHRlcihzZXhlcz09MikNCg0KIyBldmVyeW9uZSdzIHNleCBtYXRjaGVzDQpjaGVja195b2IgPC0gQ0xPWlVLMy5mYmMlPiVncm91cF9ieShMVUlOKSU+JXN1bW1hcmlzZSh5b2JzPWxlbmd0aCh1bmlxdWUoWU9CKSkpDQptaXNtYXRjaF95b2IgPC0gY2hlY2tfeW9iJExVSU5bY2hlY2tfeW9iJHlvYnMgPj0gMl0gDQpDTE9aVUszLmZiYyU+JWdyb3VwX2J5KExVSU4pJT4lc3VtbWFyaXNlKHlvYnM9bGVuZ3RoKHVuaXF1ZShZT0IpKSklPiVmaWx0ZXIoeW9icz09MikNCiMgZXZlcnlvbmUncyBhZ2UgYWxzbyBzZWVtcyB0byBtYXRjaA0KDQojIGRvZXMgYW55b25lIGhhdmUgbXVsdGlwbGUgYXNzYXlzIG9uIHNhbWUgZGF5DQpjaGVjayA8LSBDTE9aVUszLmZiY1tjKDEsNCldDQpvbmx5X29uY2UgPC0gY2hlY2tbIShkdXBsaWNhdGVkKGNoZWNrKSB8IGR1cGxpY2F0ZWQoY2hlY2ssIGZyb21MYXN0ID0gVFJVRSkpLCBdDQoNCiMgcmVtb3ZlIHRoZXNlIGluZGl2aWR1YWxzDQpDTE9aVUszLm5vZHVwIDwtIGxlZnRfam9pbihvbmx5X29uY2UsIENMT1pVSzMuZmJjLCBieSA9IGMoIkxVSU4iID0gIkxVSU4iLCAic2FtcGxlZGF0ZSIgPSAic2FtcGxlZGF0ZSIpKQ0KDQojIEhvdyBtYW55IGFzc2F5cyBhcmUgbWlzc2luZyBmdW5kYW1lbnRhbCB2YXJpYWJsZXM/IChMVUlOLCBzYW1wbGVkYXRlLCBzYW1wbGV0aW1lKQ0KY29sU3Vtcyhpcy5uYShDTE9aVUszLmZiYykpDQoNCiMgZXZlcnlvbmUgaGFzIGFuIElEIChMVUlOKQ0KIyA3NjAgaW5zdGFuY2VzIG9mIG1pc3Npbmcgc2FtcGxlIGRhdGUNCiMgNDM4MyBpbnN0YW5jZXMgb2YgbWlzc2luZyB0aW1lDQoNCiMgZHJvcCByb3dzIHdpdGggbWlzc2luZyBkYXRlIGFuZCB0aW1lIGluZm9ybWF0aW9uDQpDTE9aVUszLm5vbmEgPC0gQ0xPWlVLMy5ub2R1cFtjb21wbGV0ZS5jYXNlcyhDTE9aVUszLm5vZHVwWyxjKCJzYW1wbGVkYXRlIiwic2FtcGxldGltZSIpXSksXQ0KDQpgYGANCg0KYGBge3IgZ2V0IGRhdGEgLSBQSywgaW5jbHVkZSA9IEZBTFNFfQ0Kc2V0d2QoZGlyID0gIkQ6L3Npb2JoL0RvY3VtZW50cy9VbmkvUGhEL1kxL0Nsb3phcGluZSBQcm9qZWN0L0dpdC9jbG96YXBpbmUtcHJvamVjdC8iKQ0KDQoNCiMgbG9hZCBpbiBQSyBkYXRhICguUmRhdGEgZmlsZSBwcm9kdWNlIGJ5IEQuIEthcHBlbCBmb3IgdGhlIEthcHBlbCBldCBhbC4sIDIwMjMgcGFwZXIpDQpsb2FkKCJQSy9DTE9aVUszX1BLZGF0YV9jbGVhbl8wMy4xMS4yMDIyLlJkYXRhIikNCg0KQ0xPWlVLMy5QSyA8LSBDTE9aVUszX2NsZWFudXANCg0KQ0xPWlVLMy5QSyA8LSBDTE9aVUszLlBLICU+JSBtdXRhdGUoQ0xPWlVLMy5QSywgIyByZWZvcm1hdCBkYXRlcw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGVkYXRlPXltZChzYW1wbGVkYXRlKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxldGltZT1obXMoc2FtcGxldGltZSksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZXllYXI9eWVhcihzYW1wbGVkYXRlKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9zZWRhdGU9ZG15KGRvc2VkYXRlKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9zZXRpbWU9aG1zKGRvc2V0aW1lKSkNCg0KIyB0YWtlIGEgbG9vayBhdCB0aGUgZGF0YQ0KQ0xPWlVLMy5QSyAlPiUgZ3JvdXBfYnkoU0VYKSAlPiUgc3VtbWFyaXNlKCJTYW1wbGUgU2l6ZSI9bl9kaXN0aW5jdChMVUlOKSkNCg0KIyBBcmUgdGhlcmUgYW55IGluZGl2aWR1YWxzIGJlbG93IDE4IHllYXJzIG9mIGFnZT8gbm8hDQp1bmlxdWUoQ0xPWlVLMy5QSyRMVUlOW0NMT1pVSzMuUEskWU9TIDwgMThdKSANCg0KIyBJcyBhbnkgaW5kaXZpZHVhbCBsaXN0ZWQgYXMgaGF2aW5nIG11bHRpcGxlIGFnZXMgb3Igc2V4ZXM/DQpjaGVja19zZXggPC0gQ0xPWlVLMy5QSyU+JWdyb3VwX2J5KExVSU4pJT4lc3VtbWFyaXNlKHNleGVzPWxlbmd0aCh1bmlxdWUoU0VYKSkpDQptaXNtYXRjaF9zZXggPC0gY2hlY2tfc2V4JExVSU5bY2hlY2tfc2V4JHNleGVzID49IDJdDQpDTE9aVUszLlBLJT4lZ3JvdXBfYnkoTFVJTiklPiVzdW1tYXJpc2Uoc2V4ZXM9bGVuZ3RoKHVuaXF1ZShTRVgpKSklPiVmaWx0ZXIoc2V4ZXM9PTIpDQoNCiMgZXZlcnlvbmUncyBzZXggbWF0Y2hlcw0KY2hlY2tfeW9iIDwtIENMT1pVSzMuUEslPiVncm91cF9ieShMVUlOKSU+JXN1bW1hcmlzZSh5b2JzPWxlbmd0aCh1bmlxdWUoWU9CKSkpDQptaXNtYXRjaF95b2IgPC0gY2hlY2tfeW9iJExVSU5bY2hlY2tfeW9iJHlvYnMgPj0gMl0gDQpDTE9aVUszLlBLJT4lZ3JvdXBfYnkoTFVJTiklPiVzdW1tYXJpc2UoeW9icz1sZW5ndGgodW5pcXVlKFlPQikpKSU+JWZpbHRlcih5b2JzPT0yKQ0KDQojIEhvdyBtYW55IGFzc2F5cyBhcmUgbWlzc2luZyBmdW5kYW1lbnRhbCB2YXJpYWJsZXM/IChMVUlOLCBzYW1wbGVkYXRlLCBzYW1wbGV0aW1lKQ0KY29sU3Vtcyhpcy5uYShDTE9aVUszLlBLKSkNCiMgbm8gbWlzc2luZyBkYXRhIDotKQ0KDQp0YWJsZShDTE9aVUszLlBLJGhpZ2hfY2xvemFwaW5lX2xldmVsKQ0KdGFibGUoQ0xPWlVLMy5QSyRsb3dfZGFpbHlfY2xvemFwaW5lX2Rvc2UpDQp0YWJsZShDTE9aVUszLlBLJGJhZF9tZXRhYm9saWNfcmF0aW8pDQoNCkNMT1pVSzMuUEskTFVJTiA8LSBhcy5udW1lcmljKENMT1pVSzMuUEskTFVJTikNCg0KIyByZW1vdmUgdGVtcG9yYXJ5IHZhcmlhYmxlcw0Kcm0oY2hlY2spDQpybShjaGVja19zZXgpDQpybShjaGVja195b2IpDQpybShvbmx5X29uY2UpDQpybShDTE9aVUszX2NsZWFudXApDQpybShtaXNtYXRjaF9zZXgpDQpybShtaXNtYXRjaF95b2IpDQpgYGANCg0KYGBge3IgZ2V0IGRhdGEgLSBTTlBzLCBpbmNsdWRlID0gRkFMU0V9DQpzZXR3ZChkaXIgPSAiRDovc2lvYmgvRG9jdW1lbnRzL1VuaS9QaEQvWTEvQ2xvemFwaW5lIFByb2plY3QvR2l0L2Nsb3phcGluZS1wcm9qZWN0LyIpDQoNCiMgbG9hZCBpbiBnZW5ldGljIGRhdGENCg0KZG5fcnMyODE0Nzc4IDwtIHJlYWRfZGVsaW0oIkdlbmxvYy9DTE9aVUszLnJzMjgxNDc3OC5yYXciLGRlbGltPSJcdCIpICMgZHVmZnkgbnVsbA0Kc25wcyA8LSByZWFkX2RlbGltKCJHZW5sb2MvQ0xPWlVLMy5XaWxsY29ja3MyMDIxX3NucHMucmF3IixkZWxpbT0iXHQiKQ0KDQojIGZsaXAgYWxsZWxlIGNvdW50cyBzbyB0aGV5IHJlZmxlY3QgdGhlIG1pbm9yIGFsbGVsZSBpbiBsaW5lIHdpdGggV2lsbGNvY2tzIGV0IGFsLiwgKDIwMjEpDQpzbnBzJHJzMjQ3MjI5N19UID0gTkENCnNucHMkcnMyNDcyMjk3X1Rbc25wcyRyczI0NzIyOTdfQyA9PSAyXSA8LSAwDQpzbnBzJHJzMjQ3MjI5N19UW3NucHMkcnMyNDcyMjk3X0MgPT0gMF0gPC0gMg0Kc25wcyRyczI0NzIyOTdfVFtzbnBzJHJzMjQ3MjI5N19DID09IDFdIDwtIDENCg0Kc25wcyRyczYxNzUwOTAwX1QgPSBOQQ0Kc25wcyRyczYxNzUwOTAwX1Rbc25wcyRyczYxNzUwOTAwX0cgPT0gMl0gPC0gMA0Kc25wcyRyczYxNzUwOTAwX1Rbc25wcyRyczYxNzUwOTAwX0cgPT0gMF0gPC0gMg0Kc25wcyRyczYxNzUwOTAwX1Rbc25wcyRyczYxNzUwOTAwX0cgPT0gMV0gPC0gMQ0KDQpzbnBzJHJzMjAxMTQyNV9HID0gTkENCnNucHMkcnMyMDExNDI1X0dbc25wcyRyczIwMTE0MjVfVCA9PSAyXSA8LSAwDQpzbnBzJHJzMjAxMTQyNV9HW3NucHMkcnMyMDExNDI1X1QgPT0gMF0gPC0gMg0Kc25wcyRyczIwMTE0MjVfR1tzbnBzJHJzMjAxMTQyNV9UID09IDFdIDwtIDENCg0Kc25wcyRyczExMjY1NDVfVCA9IE5BDQpzbnBzJHJzMTEyNjU0NV9UW3NucHMkcnMxMTI2NTQ1X0MgPT0gMl0gPC0gMA0Kc25wcyRyczExMjY1NDVfVFtzbnBzJHJzMTEyNjU0NV9DID09IDBdIDwtIDINCnNucHMkcnMxMTI2NTQ1X1Rbc25wcyRyczExMjY1NDVfQyA9PSAxXSA8LSAxDQoNCmRuX3JzMjgxNDc3OCRyczI4MTQ3NzhfQyA9IE5BDQpkbl9yczI4MTQ3NzgkcnMyODE0Nzc4X0NbZG5fcnMyODE0Nzc4JHJzMjgxNDc3OF9UID09IDJdIDwtIDANCmRuX3JzMjgxNDc3OCRyczI4MTQ3NzhfQ1tkbl9yczI4MTQ3NzgkcnMyODE0Nzc4X1QgPT0gMF0gPC0gMg0KZG5fcnMyODE0Nzc4JHJzMjgxNDc3OF9DW2RuX3JzMjgxNDc3OCRyczI4MTQ3NzhfVCA9PSAxXSA8LSAxDQoNCiMgbm93IHRoZSBkdWZmeSBudWxscyBhcmUgY29kZWQgYnkgMiAoQykgYW5kIG5vbiBkdWZmeSBudWxscyBhcmUgMCAoQykgb3IgMShDKS4NCiMgY3JlYXRlIG5ldyBiaW5hcnkgdmFyaWFibGUgaW5kaWNhdGluZyBwcmVzZW5jZSAvIGFic2VuY2Ugb2YgZHVmZnktbnVsbCBnZW5vdHlwZQ0KDQp0YWJsZShkbl9yczI4MTQ3NzgkcnMyODE0Nzc4X0MpIA0KZG5fcnMyODE0Nzc4JGR1ZmZ5bnVsbCA9IE5BDQpkbl9yczI4MTQ3NzgkZHVmZnludWxsW2RuX3JzMjgxNDc3OCRyczI4MTQ3NzhfQyA9PSAyXSA8LSAiMSIgIyB5ZXMgZG4NCmRuX3JzMjgxNDc3OCRkdWZmeW51bGxbZG5fcnMyODE0Nzc4JHJzMjgxNDc3OF9DIDwgMV0gPC0gIjAiICMgbm8gZG4NCnRhYmxlKGRuX3JzMjgxNDc3OCRkdWZmeW51bGwpIA0KDQojIG1lcmdlIGdlbmV0aWMgaW5mbyANCmRuIDwtIGRuX3JzMjgxNDc3OFssYygiRklEIiwgInJzMjgxNDc3OF9DIiwgImR1ZmZ5bnVsbCIpXQ0KbmFtZXMoZG4pW25hbWVzKGRuKSA9PSAnRklEJ10gPC0gJ0xVSU4nDQoNCkNMT1pVSzMuZ2VuIDwtIGxlZnRfam9pbihzbnBzLCBkbiwgYnkgPSAiTFVJTiIpDQoNCkNMT1pVSzMuZ2VuIDwtIGRwbHlyOjpzZWxlY3QoQ0xPWlVLMy5nZW4sIGMoJ0xVSU4nLCAncnMyNDcyMjk3X1QnLCAncnM2MTc1MDkwMF9UJywgJ3JzMjAxMTQyNV9HJywgJ3JzMTEyNjU0NV9UJywgInJzMjgxNDc3OF9DIiwnZHVmZnludWxsJykpDQoNCiMgcmVtb3ZlIHRlbXBvcmFyeSB2YXJpYWJsZXMNCnJtKHNucHMpDQpybShkbikNCnJtKGRuX3JzMjgxNDc3OCkNCmBgYA0KDQpgYGB7ciBnZXQgZGF0YSAtIFBSUywgaW5jbHVkZSA9IEZBTFNFfQ0Kc2V0d2QoZGlyID0gIkQ6L3Npb2JoL0RvY3VtZW50cy9VbmkvUGhEL1kxL0Nsb3phcGluZSBQcm9qZWN0L0dpdC9jbG96YXBpbmUtcHJvamVjdC8iKQ0KIyBsb2FkIGluIFBSUyBmb3IgY2xvemFwaW5lIGFuZCBub3JjbG96YXBpbmUgbWV0YWJvbGlzbQ0KIyBQUlMgZ2VuZXJhdGVkIGJ5IEEuIFBhcmRpbmFzIGFuZCByZXBvcnRlZCBvbiBpbiBQYXJkacOxYXMgZXQgYWwuIDIwMjMNCmxpYnJhcnkoaGVyZSkNCkNMT1pVSzMuY2xvemFwaW5lIDwtIHJlYWRfdGFibGUoaGVyZSgiR2VubG9jIiwiQ0xPWlVLMy5jbG96YXBpbmUuYWxsX3Njb3JlIikpICU+JQ0KICAgICAgICAgICAgICAgICAgICAgc2V0X25hbWVzKHRpZHlfbmFtZXMoc3RyX3JlcGxhY2UobmFtZXMoLiksIlB0XyIsImNsb3phcGluZV8iKSxzeW50YWN0aWMgPSBUKSkgJT4lDQogICAgICAgICAgICAgICAgICAgICBkcGx5cjo6c2VsZWN0KElJRCwgY2xvemFwaW5lXzVlLjA4KSAjIHNlbGVjdCBnZW5vbWUgd2lkZSBzaWduaWZpY2FudCBsZXZlbA0KDQpjb2xuYW1lcyhDTE9aVUszLmNsb3phcGluZSkgPC0gYygiTFVJTiIsICJjX1BSUyIpICMgcmVuYW1lIGNvbHVtbnMNCg0KQ0xPWlVLMy5ub3JjbG96YXBpbmUgPC0gcmVhZF90YWJsZShoZXJlKCJHZW5sb2MiLCJDTE9aVUszLm5vcmNsb3phcGluZS5hbGxfc2NvcmUiKSkgJT4lICAgICAgICAgICAgICAgICAgICAgICAgc2V0X25hbWVzKHRpZHlfbmFtZXMoc3RyX3JlcGxhY2UobmFtZXMoLiksIlB0XyIsIm5vcmNsb3phcGluZV8iKSxzeW50YWN0aWMgPSBUKSkgJT4lDQogICAgICAgICAgICAgICAgICAgICAgICBkcGx5cjo6c2VsZWN0KElJRCwgbm9yY2xvemFwaW5lXzVlLjA4KSAjIHNlbGVjdCBnZW5vbWUgd2lkZSBzaWduaWZpY2FudCBsZXZlbA0KDQpjb2xuYW1lcyhDTE9aVUszLm5vcmNsb3phcGluZSkgPC0gYygiTFVJTiIsICJuX1BSUyIpICNyZW5hbWUgY29sdW1ucw0KDQpgYGANCg0KDQpgYGB7ciBnZXQgZGF0YSAtIHBneCwgaW5jbHVkZSA9IEZBTFNFfQ0Kc2V0d2QoZGlyID0gIkQ6L3Npb2JoL0RvY3VtZW50cy9VbmkvUGhEL1kxL0Nsb3phcGluZSBQcm9qZWN0L0dpdC9jbG96YXBpbmUtcHJvamVjdC8iKQ0KDQojIGxvYWQgcHlwZ3ggb3V0cHV0IGZvciBjeXAxYTINCkNMT1pVSzMuMWEyIDwtIHJlYWRfZGVsaW0oIlBHeC9vdXRwdXQvcmVzdWx0cy9jeXAxYTIudHN2IixkZWxpbT0iXHQiKSAlPiUNCiAgZHBseXI6OnNlbGVjdCgxOjUpDQpjb2xuYW1lcyhDTE9aVUszLjFhMikgPC0gYygiTFVJTiIsICJHZW5vdHlwZSIsICJQaGVub3R5cGUiLCAiSGFwbG90eXBlMSIsICJIYXBsb3R5cGUyIikgIyByZXRhaW4gcmVsZXZhbnQgY29sdW1ucw0KDQojIGNyZWF0ZSBjb2x1bW5zIGZvciBhMSBhbmQgY2xlYW4gaGFwbG90eXBlDQpDTE9aVUszLjFhMiRhbGxlbGUxID0gTkENCkNMT1pVSzMuMWEyJHNjb3JlMSA9IE5BDQpDTE9aVUszLjFhMiRIYXBsb3R5cGUxPC1nc3ViKCI7IiwiIixhcy5jaGFyYWN0ZXIoQ0xPWlVLMy4xYTIkSGFwbG90eXBlMSkpDQoNCiMgYXNzaWduIG1ldGFib2xpc20gcGhlbm90eXBlcyBhbmQgYWN0aXZ0eSBzY29yZXMgZm9yIGExDQpDTE9aVUszLjFhMiRhbGxlbGUxW0NMT1pVSzMuMWEyJEhhcGxvdHlwZTEgPT0iKjFBIl0gPC0gIk5vcm1hbCBGdW5jdGlvbiINCkNMT1pVSzMuMWEyJHNjb3JlMVtDTE9aVUszLjFhMiRIYXBsb3R5cGUxID09IioxQSJdIDwtIDENCg0KQ0xPWlVLMy4xYTIkYWxsZWxlMVtDTE9aVUszLjFhMiRIYXBsb3R5cGUxPT0iKjFGIl0gPC0gIkluY3JlYXNlZCBGdW5jdGlvbiINCkNMT1pVSzMuMWEyJHNjb3JlMVtDTE9aVUszLjFhMiRIYXBsb3R5cGUxPT0iKjFGIl0gPC0gMS41DQoNCkNMT1pVSzMuMWEyJGFsbGVsZTFbQ0xPWlVLMy4xYTIkSGFwbG90eXBlMT09IioxQyJdIDwtICJEZWNyZWFzZWQgRnVuY3Rpb24iDQpDTE9aVUszLjFhMiRzY29yZTFbQ0xPWlVLMy4xYTIkSGFwbG90eXBlMT09IioxQyJdIDwtIDAuNQ0KDQpDTE9aVUszLjFhMiRhbGxlbGUxW0NMT1pVSzMuMWEyJEhhcGxvdHlwZTE9PSIqMUMqMUYiXSA8LSAiTm9ybWFsIEZ1bmN0aW9uIg0KQ0xPWlVLMy4xYTIkc2NvcmUxW0NMT1pVSzMuMWEyJEhhcGxvdHlwZTE9PSIqMUMqMUYiXSA8LSAxDQoNCiMgY3JlYXRlIGNvbHVtbnMgZm9yIGEyIGFuZCBjbGVhbiBoYXBsb3R5cGUNCg0KQ0xPWlVLMy4xYTIkYWxsZWxlMiA9IE5BDQpDTE9aVUszLjFhMiRzY29yZTIgPSBOQQ0KQ0xPWlVLMy4xYTIkSGFwbG90eXBlMjwtZ3N1YigiOyIsIiIsYXMuY2hhcmFjdGVyKENMT1pVSzMuMWEyJEhhcGxvdHlwZTIpKQ0KDQojIGFzc2lnbiBtZXRhYm9saXNtIHBoZW5vdHlwZXMgYW5kIGFjdGl2aXR5IHNjb3JlcyBmb3IgYTINCg0KQ0xPWlVLMy4xYTIkYWxsZWxlMltDTE9aVUszLjFhMiRIYXBsb3R5cGUyID09IioxQSJdIDwtICJOb3JtYWwgRnVuY3Rpb24iDQpDTE9aVUszLjFhMiRzY29yZTJbQ0xPWlVLMy4xYTIkSGFwbG90eXBlMiA9PSIqMUEiXSA8LSAxDQoNCkNMT1pVSzMuMWEyJGFsbGVsZTJbQ0xPWlVLMy4xYTIkSGFwbG90eXBlMj09IioxRiJdIDwtICJJbmNyZWFzZWQgRnVuY3Rpb24iDQpDTE9aVUszLjFhMiRzY29yZTJbQ0xPWlVLMy4xYTIkSGFwbG90eXBlMj09IioxRiJdIDwtIDEuNQ0KDQpDTE9aVUszLjFhMiRhbGxlbGUyW0NMT1pVSzMuMWEyJEhhcGxvdHlwZTI9PSIqMUMiXSA8LSAiRGVjcmVhc2VkIEZ1bmN0aW9uIg0KQ0xPWlVLMy4xYTIkc2NvcmUyW0NMT1pVSzMuMWEyJEhhcGxvdHlwZTI9PSIqMUMiXSA8LSAwLjUNCg0KQ0xPWlVLMy4xYTIkYWxsZWxlMltDTE9aVUszLjFhMiRIYXBsb3R5cGUyPT0iKjFDKjFGIl0gPC0gIk5vcm1hbCBGdW5jdGlvbiINCkNMT1pVSzMuMWEyJHNjb3JlMltDTE9aVUszLjFhMiRIYXBsb3R5cGUyPT0iKjFDKjFGIl0gPC0gMQ0KDQojIGdpdmUgdG90YWwgYWN0aXZpdHkgc2NvcmVzIGFuZCBtZXRhYm9saXNtIHBoZW5vdHlwZSBmb3IgZGlwbG90eXBlIA0KDQpDTE9aVUszLjFhMiRlc3Rfc2NvcmUgPSBDTE9aVUszLjFhMiRzY29yZTEgKyBDTE9aVUszLjFhMiRzY29yZTINCkNMT1pVSzMuMWEyJGVzdF9waGVubyA9IE5BDQpDTE9aVUszLjFhMiRlc3RfcGhlbm9bQ0xPWlVLMy4xYTIkZXN0X3Njb3JlID09IDJdIDwtICJOb3JtYWwgbWV0YWJvbGlzZXIiDQpDTE9aVUszLjFhMiRlc3RfcGhlbm9bQ0xPWlVLMy4xYTIkZXN0X3Njb3JlID09IDIuNV0gPC0gIlJhcGlkIG1ldGFib2xpc2VyIg0KQ0xPWlVLMy4xYTIkZXN0X3BoZW5vW0NMT1pVSzMuMWEyJGVzdF9zY29yZSA9PSAzXSA8LSAiVWx0cmFyYXBpZCBtZXRhYm9saXNlciINCmBgYA0KDQoNCmBgYHtyIG1lcmdlIGRhdGEsIGluY2x1ZGU9RkFMU0V9DQoNCiMgbWVyZ2UgRkJDIGFuZCBQSyBkYXRhIGJhc2VkIG9uIGFzc2F5cyBjb2xsZWN0ZWQgb24gdGhlIHNhbWUgZGF0ZS4NCg0KQ0xPWlVLMy5pbnQgPC0gaW5uZXJfam9pbihDTE9aVUszLm5vbmEsIENMT1pVSzMuUEssIGJ5ID0gYygiTFVJTiIgPSAiTFVJTiIsICJzYW1wbGVkYXRlIiA9ICJzYW1wbGVkYXRlIiwgIlNFWCIgPSAiU0VYIiwgIllPQiIgPSAiWU9CIiwgInNhbXBsZXllYXIiID0gInNhbXBsZXllYXIiLCAiYWdlX2F0X2Fzc2F5IiA9ICJhZ2UiKSkNCg0KIyBmaWx0ZXIgYnkgY3JpdGVyaWENCkNMT1pVSzMuZmJjLnBrIDwtIENMT1pVSzMuaW50ICU+JSAgZmlsdGVyKG5ldXRfbnVtID49IDIgJiBuZXV0X251bSA8PSA3LjUpICU+JSAjIG5ldXRyb3BoaWxzIHdpdGhpbiAnaGVhbHRoeScgcmFuZ2UNCiAgZmlsdGVyKGJhZF9tZXRhYm9saWNfcmF0aW8gIT0gMSkgJT4lICMgbWV0YWJvbGljIHJhdGlvIGJldHdlZW4gMC41IGFuZCAzIChzbyBkb2VzIG5vdCBzdWdnZXN0IG5vbi1hZGhlcmFuY2UpDQogIGZpbHRlcihsb3dfZGFpbHlfY2xvemFwaW5lX2Rvc2UgIT0gMSkgIyBkYWlseSBjbG96YXBpbmUgZG9zZSBhYm92ZSAxMDAgbWcgKHNvIG5vdCBzdWdnZXN0aW5nIHRpdHJhdGlvbikNCg0KIyBzYXZlKENMT1pVSzMuZmJjLnBrLCBmaWxlID0gIkNMT1pVSzMuZmJjLnBrLlJEYXRhIikgIyBzYXZlIGNyZWF0ZWQgZGF0YWZyYW1lDQoNCg0KI21lcmdlIHBycyB3aXRoIHNucHMNCkNMT1pVSzMucHJzIDwtIGlubmVyX2pvaW4oQ0xPWlVLMy5jbG96YXBpbmUsIENMT1pVSzMubm9yY2xvemFwaW5lLCBieSA9ICJMVUlOIikNCkNMT1pVSzMucHJzLjFhMiA8LSBsZWZ0X2pvaW4oQ0xPWlVLMy5wcnMsIENMT1pVSzMuMWEyLCBieSA9ICJMVUlOIikNCkNMT1pVSzMucHJzLjFhMi5nZW4gPC0gaW5uZXJfam9pbihDTE9aVUszLnBycy4xYTIsIENMT1pVSzMuZ2VuLCBieSA9ICJMVUlOIikNCg0KIyBhbGwgdy8gZ2VuDQpDTE9aVUszLmZiYy5way5nZW4gPC0gaW5uZXJfam9pbihDTE9aVUszLmZiYy5waywgQ0xPWlVLMy5wcnMuMWEyLmdlbiwgYnkgPSAiTFVJTiIpDQoNCiMgc2F2ZShDTE9aVUszLmZiYy5way5nZW4sIGZpbGUgPSAiQ0xPWlVLMy5mYmMucGsuZ2VuLlJEYXRhIikgIyBzYXZlIGNyZWF0ZWQgZGF0YWZyYW1lDQoNCg0KI3JtKENMT1pVSzMuaW50KQ0KI3JtKENMT1pVSzMuZmJjKQ0KI3JtKENMT1pVSzMuZ2VuKQ0KI3JtKENMT1pVSzMuUEspDQojcm0ob25seV9vbmNlKQ0KI3JtKENMT1pVSzMubm9kdXApDQojcm0oQ0xPWlVLMy5ub25hKQ0KI3JtKHUxOCkNCmBgYA0KDQoNCmBgYHtyIGxvYWQgZGF0YX0NCiMgbG9hZCBkYXRhIGZyb20gZWFybGllcg0Kc2V0d2QoZGlyID0gIkQ6L3Npb2JoL0RvY3VtZW50cy9VbmkvUGhEL1kxL0Nsb3phcGluZSBQcm9qZWN0L0dpdC9jbG96YXBpbmUtcHJvamVjdC8iKQ0KDQpsb2FkKCJDTE9aVUszLmZiYy5way5SZGF0YSIpDQpsb2FkKCJDTE9aVUszLmZiYy5way5nZW4uUmRhdGEiKQ0KDQojIGNyZWF0ZSBhZ2VeMiB2YXJpYWJsZQ0KQ0xPWlVLMy5mYmMucGsgPC0gQ0xPWlVLMy5mYmMucGsgJT4lDQogIG11dGF0ZShzdGRfYWdlMiA9IGFzLnZlY3RvcihzY2FsZShhZ2VfYXRfYXNzYXksY2VudGVyID0gVCwgc2NhbGUgPSBGKSleMikgDQoNCkNMT1pVSzMuZmJjLnBrLmdlbiA8LSBDTE9aVUszLmZiYy5way5nZW4gJT4lDQogIG11dGF0ZShzdGRfYWdlMiA9IGFzLnZlY3RvcihzY2FsZShhZ2VfYXRfYXNzYXksY2VudGVyID0gVCwgc2NhbGUgPSBGKSleMikgDQoNCiMgZ2V0IHRoZSBsb3dlc3QgZG9zZSBwZXIgcGFydGljaXBhbnQgKGNyZWF0aW5nIGEgY3Jvc3Mtc2VjdGlvbmFsIGRhdGFzZXQpDQpDTE9aVUszLmZiYy5way5taW4gPC0gQ0xPWlVLMy5mYmMucGsgJT4lIA0KICBhcnJhbmdlKG5ldXRfbnVtKSAlPiUgDQogIGRpc3RpbmN0KExVSU4sIC5rZWVwX2FsbCA9IFRSVUUpDQoNCkNMT1pVSzMuZmJjLnBrLmdlbi5taW4gPC0gQ0xPWlVLMy5mYmMucGsuZ2VuICU+JSANCiAgYXJyYW5nZShuZXV0X251bSkgJT4lIA0KICBkaXN0aW5jdChMVUlOLCAua2VlcF9hbGwgPSBUUlVFKQ0KDQoNCiNzdGFuZGFyZGlzZSB1ciBwcmVkaWN0b3JzIChNSU4pDQpDTE9aVUszLmZiYy5way5taW4uc3RkIDwtIGRhdGF3aXphcmQ6OnN0YW5kYXJkaXNlKHggPSBDTE9aVUszLmZiYy5way5taW4sIHNlbGVjdCA9IGMoImRhaWx5ZG9zZSIsICJhZ2VfYXRfYXNzYXkiLCAic3RkX2FnZTIiLCAiVERTIiwgImNsb3phcGluZSIsICJub3JjbG96YXBpbmUiLCAicmF0aW8iKSkNCg0KQ0xPWlVLMy5mYmMucGsuZ2VuLm1pbi5zdGQgPC0gZGF0YXdpemFyZDo6c3RhbmRhcmRpc2UoeCA9IENMT1pVSzMuZmJjLnBrLmdlbi5taW4sIHNlbGVjdCA9IGMoImRhaWx5ZG9zZSIsICJhZ2VfYXRfYXNzYXkiLCAic3RkX2FnZTIiLCAiVERTIiwgImNsb3phcGluZSIsICJub3JjbG96YXBpbmUiLCAiY19QUlMiLCAibl9QUlMiLCAiZXN0X3Njb3JlIiwgInJzMjQ3MjI5N19UIiwgInJzNjE3NTA5MDBfVCIsICJyczIwMTE0MjVfRyIsICJyczExMjY1NDVfVCIsICJkdWZmeW51bGwiKSkNCg0KI3N0YW5kYXJkaXNlIHVyIHByZWRpY3RvcnMgKExUL2Z1bGwgZGF0YSkNCg0KQ0xPWlVLMy5mYmMucGsuc3RkIDwtIGRhdGF3aXphcmQ6OnN0YW5kYXJkaXNlKHggPSBDTE9aVUszLmZiYy5waywgc2VsZWN0ID0gYygiZGFpbHlkb3NlIiwgImFnZV9hdF9hc3NheSIsICJzdGRfYWdlMiIsICJURFMiLCAiY2xvemFwaW5lIiwgIm5vcmNsb3phcGluZSIpKQ0KDQpDTE9aVUszLmZiYy5way5nZW4uc3RkIDwtIGRhdGF3aXphcmQ6OnN0YW5kYXJkaXNlKHggPSBDTE9aVUszLmZiYy5way5nZW4sIHNlbGVjdCA9IGMoImRhaWx5ZG9zZSIsICJhZ2VfYXRfYXNzYXkiLCAic3RkX2FnZTIiLCAiVERTIiwgImNsb3phcGluZSIsICJub3JjbG96YXBpbmUiLCAiY19QUlMiLCAibl9QUlMiLCAiZXN0X3Njb3JlIiwgInJzMjQ3MjI5N19UIiwgInJzNjE3NTA5MDBfVCIsICJyczIwMTE0MjVfRyIsICJyczExMjY1NDVfVCIpKQ0KDQpgYGANCg0KDQojIE1lZGlhdGlvbiBhbmQgTG9uZ2l0dWRpbmFsIEFuYWx5c2lzIHRvIGludGVycHJldCB0aGUgYXNzb2NpYXRpb24gYmV0d2VlbiBjbG96YXBpbmUgcGhhcm1hY29raW5ldGljcywgcGhhcm1hY29nZW5vbWljcywgYW5kIGFic29sdXRlIG5ldXRyb3BoaWwgY291bnQuICB7LnRhYnNldH0NCjxicj4NCioqU2lvYmhhbiBLLiBMb2NrLCBTb3BoaWUgRS4gTGVnZ2UsIERqZW5pZmVyIEIuIEthcHBlbCwgSXNhYmVsbGEgUi4gV2lsbGNvY2tzLCBNYXJpbmthIEhlbHRodWlzLCBKb2huIEphbnNlbiwgSmFtZXMgVC4gUi4gV2FsdGVycywgTWljaGFlbCBKLiBPd2VuLCBNaWNoYWVsIEMuIE/igJlEb25vdmFuLCA8YSBocmVmID0gIm1haWx0bzogUGFyZGluYXNBQGNhcmRpZmYuYWMudWsiPiBBbnRvbmlvIEYgUGFyZGnDsWFzIDwvYT4qKg0KDQo8YnI+DQoNCkNsb3phcGluZSBpcyBlZmZlY3RpdmUgYXQgcmVkdWNpbmcgc3ltcHRvbXMgb2YgdHJlYXRtZW50LXJlc2lzdGFudCBzY2hpem9waHJlbmlhLCBidXQgaXQgY2FuIGFsc28gaW5kdWNlIHNldmVyYWwgYWR2ZXJzZSBvdXRjb21lcyBpbmNsdWRpbmcgbmV1dHJvcGVuaWEgYW5kIGFncmFudWxvY3l0b3Npcy4gV2UgdXNlZCBsaW5lYXIgbWl4ZWQtZWZmZWN0IG1vZGVscyBhbmQgc3RydWN0dXJhbCBlcXVhdGlvbiBtb2RlbGxpbmcgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgcGhhcm1hY29raW5ldGljIGFuZCBnZW5ldGljIHZhcmlhYmxlcyBpbmZsdWVuY2UgYWJzb2x1dGUgbmV1dHJvcGhpbCBjb3VudCBpbiBhIGxvbmdpdHVkaW5hbCBVSy1iYXNlZCBzYW1wbGUgb2YgY2xvemFwaW5lIHVzZXJzIG5vdCBjdXJyZW50bHkgZXhwZXJpZW5jaW5nIG5ldXRyb3BlbmlhIChOID0gODExKS4gSW5jcmVhc2VkIGRhaWx5IGNsb3phcGluZSBkb3NlIHdhcyBhc3NvY2lhdGVkIHdpdGggZWxldmF0ZWQgbmV1dHJvcGhpbCBjb3VudCwgYW1vdW50aW5nIHRvIGEgMTMzIGNlbGxzL21tXjNeIHJpc2UgcGVyIHN0YW5kYXJkIGRldmlhdGlvbiBpbmNyZWFzZSBpbiBjbG96YXBpbmUgZG9zZS4gT25lLXRoaXJkIG9mIHRoZSB0b3RhbCBlZmZlY3Qgb2YgY2xvemFwaW5lIGRvc2Ugd2FzIG1lZGlhdGVkIGJ5IHBsYXNtYSBjbG96YXBpbmUgYW5kIG5vcmNsb3phcGluZSBsZXZlbHMsIHdoaWNoIHRoZW1zZWx2ZXMgZGVtb25zdHJhdGVkIG9wcG9zaW5nLCBpbmRlcGVuZGVudCBhc3NvY2lhdGlvbnMgd2l0aCBhYnNvbHV0ZSBuZXV0cm9waGlsIGNvdW50LiBGaW5hbGx5LCBDWVAxQTIgcGhhcm1hY29nZW5vbWljIGFjdGl2aXR5IHNjb3JlIHdhcyBhc3NvY2lhdGVkIHdpdGggYWJzb2x1dGUgbmV1dHJvcGhpbCBjb3VudCwgc3VwcG9ydGluZyBsb3dlciBuZXV0cm9waGlsIGxldmVscyBpbiBDWVAxQTIgcG9vciBtZXRhYm9saXNlcnMgZHVyaW5nIGNsb3phcGluZSB1c2UuIFRoaXMgaW5mb3JtYXRpb24gbWF5IGZhY2lsaXRhdGUgaWRlbnRpZnlpbmcgYXQtcmlzayBwYXRpZW50cyBhbmQgdGhlbiBpbnRyb2R1Y2luZyBwcmV2ZW50YXRpdmUgaW50ZXJ2ZW50aW9ucyBvciBpbmRpdmlkdWFsaXNlZCBwaGFybWFjb3ZpZ2lsYW5jZSBwcm9jZWR1cmVzIHRvIGhlbHAgbWl0aWdhdGUgdGhlc2UgYWR2ZXJzZSBoYWVtYXRvbG9naWNhbCByZWFjdGlvbnMuDQoNCg0KPGJyPg0KPGJyPg0KPGJyPg0KDQoNCiMjIDxzdHJvbmc+IEludHJvZHVjdGlvbiA8L3N0cm9uZz4NCg0KDQojIyMgSW50cm9kdWN0aW9uDQoNCkFudGlwc3ljaG90aWNzIGFyZSB0aGUgcHJpbWFyeSBwaGFybWFjb2xvZ2ljYWwgdHJlYXRtZW50cyBmb3IgcGVvcGxlIHdpdGggc2NoaXpvcGhyZW5pYS4gUmVzcG9uc2UgdG8gdGhlc2UgZHJ1Z3MgaXMgaGlnaGx5IHZhcmlhYmxlLCBhbmQgYXBwcm94aW1hdGVseSBvbmUtdGhpcmQgb2YgcGF0aWVudHMgcmVzcG9uZCBpbnN1ZmZpY2llbnRseSBhZnRlciBzZXZlcmFsIHByZXNjcmlwdGlvbnNeMV4uIEZvcm1hbGx5LCB0aGUgdGVybSDigJx0cmVhdG1lbnQtcmVzaXN0YW50IHNjaGl6b3BocmVuaWHigJ0gYXBwbGllcyB0byBpbmRpdmlkdWFscyB3aG8gZG8gbm90IHJlc3BvbmQgdG8gYXQgbGVhc3QgdHdvIGRpZmZlcmVudCBhbnRpcHN5Y2hvdGljcyB0YWtlbiBhdCBhIHRoZXJhcGV1dGljIGRvc2UsIGZvciBhbiBhcHByb3ByaWF0ZSBsZW5ndGggb2YgdGltZSwgYW5kIGFmdGVyIGhhdmluZyBydWxlZCBvdXQgbm9uLWNvbXBsaWFuY2VeMl4uIENsb3phcGluZSBpcyB0aGUgc29sZSBldmlkZW5jZS1iYXNlZCBwaGFybWFjb3RoZXJhcHkgZm9yIHRyZWF0bWVudC1yZXNpc3RhbnQgc2NoaXpvcGhyZW5pYSwgYnV0IHNvbWUgY2xpbmljaWFucyBhcmUgaGVzaXRhbnQgdG8gcHJlc2NyaWJlIGl0IGR1ZSB0byBhIHJhbmdlIG9mIHBvdGVudGlhbCBhZHZlcnNlIGRydWcgcmVhY3Rpb25zIChBRFJzKS4gVGhlIGJlc3Qga25vd24gb2YgdGhlc2UgaW52b2x2ZSBhIGRlY2xpbmUgaW4gYWJzb2x1dGUgbmV1dHJvcGhpbCBjb3VudCAoQU5DKSB0aGF0IGxlYWRzIHRvIG5ldXRyb3BlbmlhIGFuZCB1bHRpbWF0ZWx5IGFncmFudWxvY3l0b3Npc14zXi4gQWdyYW51bG9jeXRvc2lzIGlzIGEgcmFyZSwgc2V2ZXJlLCBhbmQgcG90ZW50aWFsbHkgbGV0aGFsIGNsb3phcGluZS1pbmR1Y2VkIEFEUiB0aGF0IGlzIGN1cnJlbnRseSB1bnByZWRpY3RhYmxlXjReLiBIb3dldmVyLCBhIGxlc3Mgc2V2ZXJlIGRlY2xpbmUgaW4gQU5DIG1heSBhbHNvIGJlIHByb2JsZW1hdGljOyBpdCBoYXMgYmVlbiBzdWdnZXN0ZWQgdGhhdCB0aGlzIGNhbiByZXN1bHQgaW4gcGFydGlhbCBzdXBwcmVzc2lvbiBvZiB0aGUgaW1tdW5lIHN5c3RlbSBldmVuIGJlZm9yZSBmb3JtYWwgY3JpdGVyaWEgZm9yIG5ldXRyb3BlbmlhIGFyZSBtZXQsIGluY3JlYXNpbmcgdnVsbmVyYWJpbGl0eSB0byBpbmZlY3Rpb3VzIGRpc2Vhc2VzXjVeLiANCg0KVGhlIG1lY2hhbmlzbXMgdW5kZXJseWluZyBjbG96YXBpbmUtaW5kdWNlZCBuZXV0cm9waGlsIGxvc3MgYXJlIHVua25vd24sIGJ1dCBpdCBpcyB0aG91Z2h0IHRvIGFyaXNlIHRocm91Z2ggcHJvY2Vzc2VzIGludm9sdmluZyBjbG96YXBpbmUgbWV0YWJvbGl0ZXMuIFRoZSBDWVAgZmFtaWx5IG9mIGVuenltZXMsIG5vdGFibHkgQ1lQMUEyLCBDWVAyRDYsIGFuZCBDWVAzQTQsIGFyZSBoZWF2aWx5IGludm9sdmVkIHdpdGggdGhlIGJpb3RyYW5zZm9ybWF0aW9uIG9mIGNsb3phcGluZSB0aHJvdWdoIGl0cyBtZXRhYm9saWMgcGF0aHdheV42XiwgbGVhZGluZyB0byBub3JjbG96YXBpbmUgYW5kIGNsb3phcGluZS1OLW94aWRlIGFzIGtleSBwcm9kdWN0cy4gSG93ZXZlciwgdGhlIGRydWcgY2FuIGFsc28gYmUgb3hpZGlzZWQgdG8gYSBuaXRyZW5pdW0gaW9uLCBhIG5pdHJvZ2Vub3VzIGludGVybWVkaWF0ZSBjaGFyYWN0ZXJpc2VkIGJ5IGl0cyBoaWdoIHJlYWN0aXZpdHkgYW5kIGFiaWxpdHkgdG8gYmluZCB3aXRoIGNlbGxzXjdeLiBUaGUgY29udmVyc2lvbiBvZiBjbG96YXBpbmUgdG8gdGhlIG5pdHJlbml1bSBpb24gaXMgbWVkaWF0ZWQgYnkgbmV1dHJvcGhpbCBhY3Rpb24uIEFjdGl2YXRlZCBuZXV0cm9waGlscyBjb21iYXQgaW5mZWN0aW9uIGJ5IHByb2R1Y2luZyBhbiBhbnRpbWljcm9iaWFsIGFnZW50LCBoeXBvY2hsb3JvdXMgYWNpZCwgdmlhIHRoZSBlbnp5bWUgbXllbG9wZXJveGlkYXNlLiBCb3RoIGh5cG9jaGxvcm91cyBhY2lkIGFuZCBteWVsb3Blcm94aWRhc2UgbWF5IGFsc28gcmVhY3Qgd2l0aCBjbG96YXBpbmUgdG8gZm9ybSB0aGUgbml0cmVuaXVtIGlvbl44LDleLiBJdCBpcyB0aG91Z2h0IHRoYXQgdGhpcyByZWFjdGl2ZSBpbnRlcm1lZGlhdGUgbWF5IGhhcm0gbmV1dHJvcGhpbHMgdGhyb3VnaCB0d28gcHJpbWFyeSBtZWNoYW5pc21zOiBoYXB0ZW5hdGlvbiwgaW4gd2hpY2ggdGhlIG5pdHJlbml1bSBpb24gYmluZHMgaXJyZXZlcnNpYmx5IHRvIG5ldXRyb3BoaWwgY2VsbCBzdXJmYWNlIHByb3RlaW5zLCBvciB0aHJvdWdoIG92ZXJhY3RpdmF0aW9uIG9mIHRoZSBnbHV0YXRoaW9uZSBzeXN0ZW0gd2hpY2ggbWF5IGJlIHJlY3J1aXRlZCB0byBmb3JtIGNvbmp1Z2F0ZXMgd2l0aCB0aGUgbml0cmVuaXVtIGlvbiBhbmQgZGV0b3hpZnkgaXQuIEluZGVlZCwgaXQgaXMga25vd24gdGhhdCBib3RoIHRoZXNlIG1lY2hhbmlzbXMgY2FuIGxlYWQgdG8gbmV1dHJvcGhpbCBhcG9wdG9zaXNeMTDigJMxMl4uDQoNClJlZ3VsYXIgYmxvb2QgbW9uaXRvcmluZyBpcyBhIHJlcXVpcmVtZW50IG9mIGNsb3phcGluZSBwcmVzY3JpcHRpb24gYm90aCBpbiB0aGUgVUsgYW5kIGluIG1hbnkgb3RoZXIgY291bnRyaWVzIHRvIHJlZHVjZSB0aGUgcmlza3Mgb2YgcHJvZ3Jlc3Npb24gZnJvbSBsb3cgbmV1dHJvcGhpbCBjb3VudCB0byBmb3JtYWwgYWdyYW51bG9jeXRvc2lzXjEzXi4gTmV2ZXJ0aGVsZXNzLCBkZXNwaXRlIHRoZSBzdXBlcmlvcml0eSBvZiBjbG96YXBpbmUgZm9yIG1hbmFnaW5nIHRyZWF0bWVudC1yZXNpc3RhbnQgc2NoaXpvcGhyZW5pYSBpbiBjb21wYXJpc29uIHRvIHN0YW5kYXJkIGZpcnN0LWxpbmUgYW50aXBzeWNob3RpY3MsIGNvbmNlcm5zIGFib3V0IEFEUiByaXNrIGFuZCBtb25pdG9yaW5nIHJlcXVpcmVtZW50cyBhcmUgcHJpbWFyeSBjb250cmlidXRvcnMgdG8gdGhpcyBkcnVnIGJlaW5nIHVuZGVydXRpbGlzZWQgd29ybGR3aWRlXjE0Xi4gRm9yIHRoaXMgcmVhc29uLCBpZGVudGlmeWluZyBmYWN0b3JzIHRoYXQgYXJlIHByZWRpY3RpdmUgb2YgbG93IG5ldXRyb3BoaWwgY291bnRzIGluIGFuIG90aGVyd2lzZSBoZWFsdGh5IHNhbXBsZSBvZiBjbG96YXBpbmUgdXNlcnMgY291bGQgaGVscCBjbGluaWNpYW5zIHRvIGltcHJvdmUgY2xvemFwaW5lIHVzZSB3aGlsZSBzdXBwb3J0aW5nIHBhdGllbnQgc2FmZXR5IGFuZCB3ZWxsYmVpbmcuIEZvciBleGFtcGxlLCBpZiBjbG96YXBpbmUgdXNlcnMgc3VzY2VwdGlibGUgdG8gaW5jcmVhc2VkIHJpc2sgZm9yIGluZmVjdGlvbnMgY291bGQgYmUgaWRlbnRpZmllZCwgcG90ZW50aWFsIGhhcm0gbWlnaHQgYmUgbWl0aWdhdGVkIGJ5IHByaW9yaXRpc2luZyB0aGVtIGZvciBzZWFzb25hbCB2YWNjaW5hdGlvbnMgb3IgbWFraW5nIGNoYW5nZXMgdG8gdGhlaXIgYmxvb2QgbW9uaXRvcmluZyByZWdpbWUuIA0KDQpQYXN0IHJlc2VhcmNoXjE14oCTMTdeIGV4cGxvcmVkIGFzc29jaWF0aW9ucyBiZXR3ZWVuIEFOQyBhbmQgZGFpbHkgY2xvemFwaW5lIGRvc2UgYXMgd2VsbCBhcyBwbGFzbWEgY29uY2VudHJhdGlvbnMgb2YgY2xvemFwaW5lIGFuZCBub3JjbG96YXBpbmUuIEdlbmVyYWxseSwgaGlnaGVyIHBsYXNtYSBjbG96YXBpbmUgY29uY2VudHJhdGlvbiBoYXMgYmVlbiBmb3VuZCB0byBiZSBhc3NvY2lhdGVkIHdpdGggbG93ZXIgQU5DLCB3aGVyZWFzIGhpZ2hlciBwbGFzbWEgbm9yY2xvemFwaW5lIGNvbmNlbnRyYXRpb24gaGFzIGJlZW4gcmVwb3J0ZWQgdG8gYmUgYXNzb2NpYXRlZCB3aXRoIGhpZ2hlciBuZXV0cm9waGlsIGNvdW50cy4gSG93ZXZlciwgYXMgaGlnaGxpZ2h0ZWQgaW4gYSByZWNlbnQgcmV2aWV3XjE4XiwgdGhlcmUgaXMgaW5jb25zaXN0ZW5jeSBpbiB0aGUgbGl0ZXJhdHVyZSByZWdhcmRpbmcgYm90aCB0aGUgZGlyZWN0aW9uIGFuZCBtYWduaXR1ZGUgb2YgZWZmZWN0cyBvYnNlcnZlZC4gV2hpbGUgdGhpcyBjb3VsZCBiZSBpbiBwYXJ0IGR1ZSB0byBkaWZmZXJlbmNlcyBpbiBzdGF0aXN0aWNhbCBtZXRob2RvbG9neSBhbmQgdGhlIHVzZSBvZiBzbWFsbCBzYW1wbGVzLCBpdCBjb3VsZCBlcXVhbGx5IHJlZmxlY3QgdGhlIGlkaW9zeW5jcmFzeSBvZiB0aGUgQURSIGxlYWRpbmcgdG8gQU5DIGRlY2xpbmUsIGFsb25nc2lkZSB0aGUgY2hhbGxlbmdlcyBvZiBkaXNlbnRhbmdsaW5nIHRoZSBpbXBhY3Qgb2YgY2xvemFwaW5lIGFuZCBpdHMgcmVsYXRlZCB2YXJpYWJsZXMgZnJvbSBnZW5ldGljLCBkZW1vZ3JhcGhpYywgb3IgbGlmZXN0eWxlIGZhY3RvcnMgdGhhdCBtYXkgYWxzbyBpbmZsdWVuY2UgbmV1dHJvcGhpbCBjb3VudHMuDQoNClRoZSBwcmVzZW50IHJlc2VhcmNoIGFpbXMgdG8gcmVwbGljYXRlIGFuZCBleHRlbmQgdGhlc2UgcHJldmlvdXMgc3R1ZGllcyBieSBleHBsb3JpbmcgcHJlZGljdG9ycyBvZiBBTkMgaW4gYSBsYXJnZSwgVUstYmFzZWQgc2FtcGxlIG9mIGNsb3phcGluZSB1c2VycyB3aXRoIFRSUyBpbiB3aG9tIGxvbmdpdHVkaW5hbCBtZWFzdXJlcyB3ZXJlIGF2YWlsYWJsZSBmb3IgYm90aCBwaGFybWFjb2tpbmV0aWMgdmFyaWFibGVzIGFuZCBmdWxsIGJsb29kIGNvdW50cy4gIExpbmVhciBtaXhlZC1lZmZlY3QgbW9kZWxzIChMTU1zKSB3ZXJlIHVzZWQgdG8gZXhwbG9yZSBhc3NvY2lhdGlvbnMgYmV0d2VlbiBwaGFybWFjb2tpbmV0aWMgYW5kIHBoYXJtYWNvZ2Vub21pYyB2YXJpYWJsZXMgYW5kIEFOQywgd2hpbGUgYWNjb3VudGluZyBmb3IgYmV0d2Vlbi0gYW5kIHdpdGhpbi1pbmRpdmlkdWFsIHZhcmlhYmlsaXR5LiBGb2xsb3dpbmcgdGhpcywgYSBTdHJ1Y3R1cmFsIEVxdWF0aW9uIE1vZGVsbGluZyAoU0VNKSBmcmFtZXdvcmsgd2FzIHVzZWQgdG8gZnVydGhlciBkaXNlbnRhbmdsZSB0aGUgY29udHJpYnV0aW9ucyBvZiBjbG96YXBpbmUgZG9zZSwgZnJvbSBwbGFzbWEgY2xvemFwaW5lIGFuZCBwbGFzbWEgbm9yY2xvemFwaW5lIGxldmVscy4gR2VuZXRpYyBwcmVkaWN0b3JzIHJlbGF0aW5nIHRvIGNsb3phcGluZSBhbmQgbm9yY2xvemFwaW5lIG1ldGFib2xpc20sIGFzIHdlbGwgYXMgYmFzZWxpbmUgdmFyaWF0aW9uIGluIEFOQyB3ZXJlIGFsc28gaW52ZXN0aWdhdGVkIHRvIGRldGVybWluZSB3aGV0aGVyIHRoZXkgaW5mbHVlbmNlZCBuZXV0cm9waGlsIGNvdW50cyBpbiBvdXIgc2FtcGxlLg0KDQo8YnI+DQo8YnI+DQo8YnI+DQo8YnI+DQoNCiMjIDxzdHJvbmc+IE1ldGhvZHMgPC9zdHJvbmc+IA0KIyMjIE1ldGhvZHMNCg0KIyMjIyBTYW1wbGUgY29sbGVjdGlvbiAvIFBhcnRpY2lwYW50cw0KV2UgdXNlZCBGdWxsIEJsb29kIENvdW50cyAoRkJDKSBhbmQgcGhhcm1hY29raW5ldGljIGFzc2F5IGRhdGEgZnJvbSB0aGUgQ0xPWlVLMyBzYW1wbGVeMTleLCB0aGUgbW9zdCByZWNlbnQgd2F2ZSBvZiB0aGUgQ0xPWlVLIHN0dWR5XjIwXi4gQWxsIHBhcnRpY2lwYW50cyBoYWQgYSBkaWFnbm9zaXMgb2YgdHJlYXRtZW50LXJlc2lzdGFudCBzY2hpem9waHJlbmlhIGFuZCB3ZXJlIHByZXNjcmliZWQgY2xvemFwaW5lLiBTYW1wbGVzIHdlcmUgYW5vbnltb3VzbHkgY29sbGVjdGVkIGluIHRoZSBVSyBmcm9tIHRoZSBaYXBvbmV4IFRyZWF0bWVudCBBY2Nlc3MgU3lzdGVtIChaVEFTKSwgYSBjbG96YXBpbmUgbW9uaXRvcmluZyBmcmFtZXdvcmsgbWFuYWdlZCBieSBMZXlkZW4gRGVsdGEgQi5WLiAoTmlqbWVnZW4sIE5ldGhlcmxhbmRzKS4gU2FtcGxlIGNvbGxlY3Rpb24gYW5kIGRhdGEgZXh0cmFjdGlvbiBwcm9jZWR1cmVzIGZvciBDTE9aVUsgaGF2ZSBiZWVuIGRldGFpbGVkIHByZXZpb3VzbHleMjAsMjFeLiBUaGUgQ0xPWlVLIHN0dWR5IHJlY2VpdmVkIFVLIE5hdGlvbmFsIFJlc2VhcmNoIEV0aGljcyBTZXJ2aWNlIGFwcHJvdmFsIChyZWZlcmVuY2UgMTAvV1NFMDIvMTUpLCBpbiBhY2NvcmRhbmNlIHdpdGggdGhlIHJlcXVpcmVtZW50cyBvZiB0aGUgVUsgSHVtYW4gVGlzc3VlIEFjdCAyMDA0Lg0KDQo8YnI+DQoNCiMjIyMgSW5jbHVzaW9uIC8gRXhjbHVzaW9uIENyaXRlcmlhDQpDTE9aVUszIGNvbnRhaW5zIGxvbmdpdHVkaW5hbCBhc3NheSBkYXRhIGZyb20gcGFydGljaXBhbnRzIG9sZGVyIHRoYW4gMTggeWVhcnMgb2YgYWdlIHdobyBoYWQgbm90IGJlZW4gcHJldmlvdXNseSBpbmNsdWRlZCBpbiBwcmlvciB3YXZlcyBvZiBDTE9aVUsuIFdlIGV4Y2x1ZGVkIGRhdGEgZnJvbSBhc3NheXMgd2l0aCBtaXNzaW5nIEZCQyBvciBwaGFybWFjb2tpbmV0aWMgaW5mb3JtYXRpb24gb3Igd2l0aCBjbGVyaWNhbCBlcnJvcnMgKGUuZy4sIHNldmVyYWwgYXNzYXlzIHRha2VuIGF0IHRoZSBzYW1lIGRhdGUgYW5kIHRpbWUgeWllbGRpbmcgZGlmZmVyZW50IHJlc3VsdHMpIGZyb20gZnVydGhlciBhbmFseXNlcy4gVG8gcmV0YWluIG9ubHkgYXBwYXJlbnRseSBoZWFsdGh5IGluZGl2aWR1YWxzLCB0aGUgRkJDIGRhdGEgd2VyZSBjdXJhdGVkIGJ5IHJlbW92aW5nIGFueSBhc3NheSBzaG93aW5nIGFuIEFOQyBvdXRzaWRlIG9mIHRoZSBub3JtYWwgcmVmZXJlbmNlIHJhbmdlICgyMDAwIOKAkyA3NTAwIGNlbGxzL21tXjNeKS4gQWRkaXRpb25hbGx5LCBhbmQgYXMgaW4gcHJldmlvdXMgcmVzZWFyY2heMTleLCB3ZSByZW1vdmVkIHBoYXJtYWNva2luZXRpYyBhc3NheXMgKGkpIHdoZXJlIHRoZSBnYXAgYmV0d2VlbiBjbG96YXBpbmUgaW50YWtlIGFuZCBibG9vZCBzYW1wbGluZyB3YXMgb3V0c2lkZSBhIDYtMjQgaG91ciB3aW5kb3c7IChpaSkgd2hlcmUgY2xvemFwaW5lIGFuZCBub3JjbG96YXBpbmUgcGxhc21hIGNvbmNlbnRyYXRpb25zIHdlcmUgYmVsb3cgaW5zdHJ1bWVudCBkZXRlY3Rpb24gbGV2ZWxzICg8IDAuMDUgbWcvTCk7IChpaWkpIHNob3dpbmcgYSBsb3cgZGFpbHkgY2xvemFwaW5lIGRvc2UgKDwgMTAwbWcsIHBvdGVudGlhbGx5IGluZGljYXRpdmUgb2YgZHJ1ZyB0aXRyYXRpb24pIG9yIChpdikgd2hlcmUgdGhlIG1ldGFib2xpYyByYXRpbyBzdWdnZXN0ZWQgbm9uLWFkaGVyZW5jZSAoPCAwLjUgb3IgPiAzLjApLiANCg0KPGJyPg0KDQojIyMjIEdlbmV0aWMgRGF0YQ0KQSBzdWJzZXQgb2YgaW5kaXZpZHVhbHMgKE4gPSA1MjMpIGluIHRoZSBzYW1wbGUgaGFkIGxpbmtlZCBnZW5ldGljIGRhdGEsIGJhc2VkIG9uIGdlbm90eXBlcyBmcm9tIGFuIElsbHVtaW5hIEluZmluaXVtIEdsb2JhbCBTZXF1ZW5jaW5nIEFycmF5LTI0IChJbGx1bWluYSBJbmMsIFVTQSkuIERldGFpbHMgcmVnYXJkaW5nIHRoZSBjdXJhdGlvbiBhbmQgaW1wdXRhdGlvbiBvZiB0aGlzIGdlbmV0aWMgZGF0YSBoYXZlIGJlZW4gZGVzY3JpYmVkIGVsc2V3aGVyZV4xOV4gYW5kIHN1bW1hcmlzZWQgaW4gdGhlICoqU3VwcGxlbWVudGFyeSBOb3RlKiouIFBoYXJtYWNvZ2Vub21pYyBzdGFyIGFsbGVsZXMgKGkuZS4sIGdlbmV0aWMgdmFyaWFudHMgb3IgY29tYmluYXRpb25zIG9mIHZhcmlhbnRzIGNvbnN0aXR1dGluZyBwaGFybWFjb2dlbm9taWMgbWFya2VycykgZm9yIENZUDFBMiB3ZXJlIGNhbGxlZCB1c2luZyBQeVBHeCB2MC4yMC4wXjIyXiBvbiB0aGUgaW1wdXRlZCBhcnJheSBkYXRhLiBFbnp5bWUgYWN0aXZpdHkgc2NvcmVzIGluZmVycmVkIGZyb20gdGhlc2Ugc3RhciBhbGxlbGVzIHdlcmUgaW5jbHVkZWQgaW4gTE1NcyB0byBkZXRlcm1pbmUgd2hldGhlciBnZW5ldGljIHByZWRpY3RvcnMgb2YgQ1lQMUEyIGFjdGl2aXR5IHdlcmUgYXNzb2NpYXRlZCB3aXRoIEFOQy4gT3RoZXIgcGhhcm1hY29nZW5vbWljIFNOUHMgKFRhYmxlIDEpIGlkZW50aWZpZWQgaW4gYSBHV0FTIG9mIGNsb3phcGluZSBtZXRhYm9saXNtXjIzXiBhbmQgaW5jbHVkZWQgaW4gYSBwcmV2aW91cyBhbmFseXNpcyBleHBsb3JpbmcgcHJlZGljdG9ycyBvZiBBTkNeMTdeIHdlcmUgYWxzbyBpbnZlc3RpZ2F0ZWQuIA0KDQpQb2x5Z2VuaWMgIFNjb3JlcyAoUEdTKSBmb3IgY2xvemFwaW5lIGFuZCBub3JjbG96YXBpbmUgbWV0YWJvbGlzbSB3ZXJlIGNhbGN1bGF0ZWQgdmlhIFBSU2ljZTIgdjIuMzVeMjReIGFzIHBhcnQgb2YgYSBwcmV2aW91cyBzdHVkeV4yMV4uIFRoZXNlIHdlcmUgaW5jbHVkZWQgaW4gc2Vjb25kYXJ5IGFuYWx5c2VzLiBXZSBhbHNvIGV4cGxvcmVkIHRoZSBpbXBhY3Qgb2YgdGhlIER1ZmZ5LW51bGwgZ2Vub3R5cGUgKHJzMjgxNDc3ODsgQy9DIGhvbW96eWdvdGUpIGFzIHRoaXMgaGFzIGJlZW4gIGFzc29jaWF0ZWQgd2l0aCBkZWNyZWFzZWQgQU5DIGluIGNsb3phcGluZSB1c2VycyBvZiBBZnJpY2FuLCBBc2lhbiwgYW5kIE1pZGRsZSBFYXN0ZXJuIGFuY2VzdHJpZXNeMjVeLiBGaW5hbGx5LCB0aGUgSHVtYW4gTGV1a29jeXRlIEFudGlnZW4gKEhMQSkgc3lzdGVtIGhhcyBsb25nIGJlZW4gdW5kZXJzdG9vZCBhcyBhIGNydWNpYWwgY29tcG9uZW50IG9mIHRoZSBpbW11bmUgc3lzdGVtLCB3aXRoIHBhc3Qgd29yayBsaW5raW5nIHRoaXMgZ2VuZXRpYyBsb2N1cyB0byBhZ3JhbnVsb2N5dG9zaXMgaW4gY2xvemFwaW5lIHVzZXJzXjI2Xi4gVGhlcmVmb3JlLCB3ZSBpbXB1dGVkIEhMQSB0eXBlcyB1c2luZyBISUJBRyB2MS4zNC4xXjI3XiBhbmQgaW5jb3Jwb3JhdGVkIHRoZXNlIGludG8gTE1NcyB0byBleHBsb3JlIHRoZWlyIGltcGFjdCBvbiBBTkMuIERldGFpbGVkIGRlc2NyaXB0aW9ucyBvZiBDWVAxQTIgcGhhcm1hY29nZW5vbWljIGFsbGVsZSBjYWxsaW5nIGFuZCBITEEgZ2Vub3R5cGUgaW1wdXRhdGlvbiBhcmUgZm91bmQgaW4gdGhlICoqU3VwcGxlbWVudGFyeSBub3RlKiouIA0KDQoNCmBgYHtyIHRhYmxlIDEsIGZpZy5jYXA9IlRhYmxlIDEuIFNOUHMgaW5jbHVkZWQgaW4gcmVncmVzc2lvbiBhbmFseXNlcyBleHBsb3JpbmcgdGhlIGltcGFjdCBvZiBwaGFybWFjb2dlbm9taWMgdmFyaWF0aW9uIG9uIGNsb3phcGluZSBtZXRhYm9saXNtIGFuZCBuZXV0cm9waGlsIGxldmVscy4gU05QID0gU2luZ2xlIE51Y2xlb3RpZGUgUG9seW1vcnBoaXNtOyBDSFIgPSBDaHJvbW9zb21lOyBBbHQgPSBBbHRlcm5hdGl2ZSAob3IgTWlub3IpIGFsbGVsZS4ifQ0KDQojIyBDcmVhdGUgVGFibGUgMQ0KDQpnZW5lcyA8LSBkYXRhLmZyYW1lKFNOUCAgPSBjKCdyczIwMTE0MjUnLCAncnM2MTc1MDkwMCcsICdyczExMjY1NDUnLCAncnMyNDcyMjk3JywgJ3JzMjgxNDc3OCcpLA0KICAgICAgICAgICAgICAgICAgICBDSFIgPSBjKCcyJywgJzQnLCAnMTAnLCAnMTUnLCAnMScgKSwNCiAgICAgICAgICAgICAgICAgICAgR2VuZSA9IGMoIlVHVDFBIGZhbWlseSIsICdVR1QyQjEwJywgJ0NZUDJDMTgnLCAnQ1lQMUExLUNZUDFBMicsICdBQ0tSMScgKSwNCiAgICAgICAgICAgICAgICAgICAgQWx0ID0gYygnRycsICdUJywgJ1QnLCAgJ1QnLCAnQycpLA0KICAgICAgICAgICAgICAgICAgICBBc3NvY2lhdGlvbiA9IGMoIkFsdGVybmF0aXZlIGFsbGVsZSBsaW5rZWQgd2l0aCBkZWNyZWFzZWQgcGxhc21hIG5vcmNsb3phcGluZSBsZXZlbHNeMjNeLiIsICJBbHRlcm5hdGl2ZSBhbGxlbGUgbGlua2VkIHdpdGggZGVjcmVhc2VkIHBsYXNtYSBub3JjbG96YXBpbmUgbGV2ZWxzXjIzXiIsICJBbHRlcm5hdGl2ZSBhbGxlbGUgbGlua2VkIHdpdGggaW5jcmVhc2VkIG1ldGFib2xpYyByYXRpbyBeMjNeLiIsICJBbHRlcm5hdGl2ZSBhbGxlbGUgbGlua2VkIHdpdGggZGVjcmVhc2VkIHBsYXNtYSBjbG96YXBpbmUgbGV2ZWxzXjIzXi4gIiwgIkFsdGVybmF0aXZlIGFsbGVsZSBob21venlnb3NpdHkgKER1ZmZ5LU51bGwgZ2Vub3R5cGUpIGxpbmtlZCB3aXRoIG5vbi1wYXRob2xvZ2ljYWwgYmFzZWxpbmUgQU5DXjI1Xi4iICkNCiAgICAgICAgICAgICAgICAgICAgKQ0KDQprYWJsZShnZW5lcywgY2FwdGlvbiA9ICJUYWJsZSAxIC4gU05QcyBpbmNsdWRlZCBpbiByZWdyZXNzaW9uIGFuYWx5c2VzIGV4cGxvcmluZyB0aGUgaW1wYWN0IG9mIHBoYXJtYWNvZ2Vub21pYyB2YXJpYXRpb24gbmV1dHJvcGhpbCBsZXZlbHMuIFNOUCA9IFNpbmdsZSBOdWNsZW90aWRlIFBvbHltb3JwaGlzbTsgQ0hSID0gQ2hyb21vc29tZTsgQWx0ID0gQWx0ZXJuYXRpdmUgKG9yIE1pbm9yKSBhbGxlbGUuIiwgZnVsbF93aWR0aCA9IEYsIGZvbnRfc2l6ZSA9IDE2LA0KICAgICAgICAgICAgIGRpZ2l0cyA9IDIpICU+JSBrYWJsZV9jbGFzc2ljDQpgYGANCg0KDQo8YnI+DQoNCiMjIyMgU3RhdGlzdGljYWwgQW5hbHlzaXMNCg0KQSBEaXJlY3RlZCBBY3ljbGljIEdyYXBoIChEQUcpIHdhcyBmaXJzdCBkcmF3biB0byBjb25zaWRlciB0aGUgcG9zc2libGUgY2F1c2FsIHN0cnVjdHVyZSBvZiB0aGUgY2xvemFwaW5lIGRvc2Ug4oCTIEFOQyByZWxhdGlvbnNoaXBeMjheLiBBcyBwcmV2aW91c2x5IHJlY29tbWVuZGVkXjI5XiwgIHdlIGV4cGxpY2l0bHkgcmVwb3J0IHRoZSByYXRpb25hbGUgZm9yIGluY2x1ZGVkIERBRyBub2RlcyBhbmQgcmVsYXRpb25zaGlwcyBpbiBTdXBwbGVtZW50YXJ5IFRhYmxlIDMuIA0KDQpEYXRhIGFuYWx5c2VzIHdlcmUgcGVyZm9ybWVkIGluIFIgIHY0LjEuMSB1c2luZyBSIFN0dWRpbyAyMDIzLjA2LjErNTI0XjMwXi4gVGhlIGxvbmdpdHVkaW5hbCBkYXRhc2V0IHdhcyBhbmFseXNlZCB1c2luZyBMTU1zIGluICpsbWU0KiB3aXRoIEFOQyBhcyB0aGUgb3V0Y29tZSB2YXJpYWJsZS4gQSBiYXNlbGluZSBtb2RlbCwgaW4gbGluZSB3aXRoIHByZXZpb3VzIHdvcmteMTdeLCBpbmNsdWRlZCB0aHJlZSBwaGFybWFjb2tpbmV0aWMgdmFyaWFibGVzIHJlbGF0ZWQgdG8gY2xvemFwaW5lIGFuZCBpdHMgbWV0YWJvbGlzbSAoaS5lLiwgZGFpbHkgY2xvemFwaW5lIGRvc2UsIHBsYXNtYSBjbG96YXBpbmUgY29uY2VudHJhdGlvbiwgYW5kIHBsYXNtYSBub3JjbG96YXBpbmUgY29uY2VudHJhdGlvbikgYWxvbmdzaWRlIGNvdmFyaWF0ZXMgZm9yIGFnZSwgYWdlXjJeLCBzZXgsIGFuZCB0aGUgdGltZSBiZXR3ZWVuIHRoZSBkb3NlIGludGFrZSBhbmQgYmxvb2Qgc2FtcGxpbmcgKFREUykuIFBhcnRpY2lwYW50IElEIHdhcyBpbmNsdWRlZCBpbiB0aGVzZSBtb2RlbHMgYXMgYSByYW5kb20gZWZmZWN0IHRlcm0uIEFsbCBwcmVkaWN0b3IgdmFyaWFibGVzIHdlcmUgc3RhbmRhcmRpc2VkIGFzIGRlc2NyaWJlZCBpbiB0aGUgKipTdXBwbGVtZW50YXJ5IE5vdGUqKiwgYmVmb3JlIGZpdHRpbmcgdGhlIHJlZ3Jlc3Npb24gbW9kZWwuIEZ1cnRoZXIgYW5hbHlzZXMgaW5jbHVkZWQgcGhhcm1hY29nZW5vbWljIHZhcmlhYmxlcyAoaS5lLiwgQ1lQMUEyIGFjdGl2aXR5IHNjb3JlcywgYW5kIHRoZSBnZW5vdHlwZXMgb2YgcGhhcm1hY29nZW5vbWljIFNOUHMgb3V0bGluZWQgaW4gVGFibGUgMSkuIA0KDQpTZWNvbmRhcnkgYW5hbHlzZXMgZXh0ZW5kZWQgdGhlIExNTXMgYnkgdGVzdGluZyBmb3IgYXNzb2NpYXRpb25zIGJldHdlZW4gdGhlIGFkZGl0aW9uYWwgZ2VuZXRpYyBwcmVkaWN0b3JzIChpLmUuLCBQR1MgZm9yIGNsb3phcGluZSBhbmQgbm9yY2xvemFwaW5lIG1ldGFib2xpc20sIHRoZSBEdWZmeS1udWxsIGdlbm90eXBlLCBhbmQgSExBIGdlbm90eXBlcykgd2l0aCBuZXV0cm9waGlsIGNvdW50cy4NCg0KDQpEdWUgdG8gdGhlIGRpZmZpY3VsdHkgb2YgaW1wbGVtZW50aW5nIGFuZCBpbnRlcnByZXRpbmcgY2F1c2FsIGFuYWx5c2VzIG9uIGxvbmdpdHVkaW5hbCBkYXRhc2V0cyB3aXRoIGlycmVndWxhciB0aW1lIHBvaW50c14zMV4sIG1lZGlhdGlvbiBtb2RlbHMgd2VyZSBmaXQgdXNpbmcgdGhlIGxvd2VzdCB2YWx1ZSBvZiBBTkMgcmVwb3J0ZWQgZm9yIGVhY2ggaW5kaXZpZHVhbCBhcyB0aGUgb3V0Y29tZSB2YXJpYWJsZS4gU0VNIHdhcyBjb25kdWN0ZWQgdXNpbmcgKmxhdmFhbipeMzJeIGluY2x1ZGluZyBjbG96YXBpbmUgYW5kIG5vcmNsb3phcGluZSBwbGFzbWEgY29uY2VudHJhdGlvbnMgYXMgbWVkaWF0aW5nIHZhcmlhYmxlcywgZGFpbHkgY2xvemFwaW5lIGRvc2UgYXMgdGhlIGV4cG9zdXJlLCBhbmQgbG93ZXN0IEFOQyBhcyB0aGUgb3V0Y29tZS4gUmVzaWR1YWxpc2VkIHZlcnNpb25zIG9mIHRoZXNlIHZhcmlhYmxlcyB3ZXJlIGluY2x1ZGVkIGluIHRoZSBtb2RlbCwgYXMgZGVzY3JpYmVkIGluIHRoZSAqKlN1cHBsZW1lbnRhcnkgTm90ZSoqLiBQcmVkaWN0b3IgdmFyaWFibGUgcmVzaWR1YWxzIHdlcmUgc3RhbmRhcmRpc2VkIGJlZm9yZSBpbmNsdXNpb24gaW4gdGhlIG1vZGVsLiANCg0KRnVydGhlciBzZW5zaXRpdml0eSBhbmFseXNlcyB0ZXN0ZWQgdGhlIHJvYnVzdG5lc3Mgb2YgdGhlc2UgbWVkaWF0aW9uIG1vZGVscywgYXNzZXNzaW5nIGJvdGggdGhlIGltcGFjdCBvZiB1c2luZyByZXNpZHVhbGlzZWQgdmFyaWFibGVzIGFuZCB1c2luZyBjcm9zcy1zZWN0aW9uYWwsIGFzIG9wcG9zZWQgdG8gbG9uZ2l0dWRpbmFsIGRhdGEuIFNpbmdsZS1tZWRpYXRvciBhbmFseXNlcyB3ZXJlIGFsc28gaW1wbGVtZW50ZWQgaW4gdGhlICptZWRpYXRpb24qIFIgcGFja2FnZV4zM14uIFdoaWxlIHRoaXMgYXBwcm9hY2ggY2FuIGVzdGltYXRlIGRpcmVjdCBhbmQgaW5kaXJlY3QgZWZmZWN0cyBpbiBsb25naXR1ZGluYWwgZGF0YXNldHMgaXQgY2FuIG9ubHkgYWNjb21tb2RhdGUgYSBzaW5nbGUgbWVkaWF0b3IgdmFyaWFibGUuIFRoZXJlZm9yZSwgaXQgd2FzIG5vdCBhcHByb3ByaWF0ZSBmb3IgdGhlIHByaW1hcnkgYW5hbHlzaXMgb2YgdGhlIG11bHRpcGxlIG1lZGlhdGlvbiBtb2RlbCB0aGF0IHdlIGRlZmluZWQgYW5kIGV2YWx1YXRlZCB1c2luZyBTRU0gb24gY3Jvc3Mtc2VjdGlvbmFsIGRhdGEgaW4gKmxhdmFhbiouIEZpbmFsbHksIHdlIGF0dGVtcHRlZCB0byBmb3JtYWxseSByZXBsaWNhdGUgdGhlIGFuYWx5c2VzIGRlc2NyaWJlZCBpbiBwcmV2aW91cyBzdHVkaWVzXjE2LDE3XiBieSBpbXBsZW1lbnRpbmcgbGluZWFyIG1vZGVscywgYXMgcmVwb3J0ZWQgaW4gdGhlICoqU3VwcGxlbWVudGFyeSBOb3RlKiouIA0KDQo8YnI+DQo8YnI+DQo8YnI+DQo8YnI+DQoNCiMjIDxzdHJvbmc+IE1haW4gUmVzdWx0cyA8L3N0cm9uZz4gDQojIyMgTWFpbiBSZXN1bHRzIA0KYGBge3IgdGltZSBvbiB0cmVhdG1lbnQsIGluY2x1ZGUgPSBGQUxTRX0NCiMgZXN0aW1hdGUgdGhlIGxlbmd0aCBvZiB0aW1lIHBlb3BsZSBoYXZlIGJlZW4gb24gY2xvemFwaW5lIHRyZWF0bWVudCBmb3IuIA0KDQpsaWJyYXJ5KGFyc2VuYWwpDQoNCiMgZmluZCBlYXJsaWVzdCBhbmQgbGF0ZXN0IGFzc2F5IGRhdGUsIHRoZW4gZmluZCB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZW0uDQplYXJsaWVzdC5hc3NheSA8LSAgQ0xPWlVLMy5mYmMucGtbb3JkZXIoQ0xPWlVLMy5mYmMucGskc2FtcGxlZGF0ZSksXSAlPiUgDQogIGRpc3RpbmN0KExVSU4sIC5rZWVwX2FsbCA9IFRSVUUpDQoNCmNvbXBhcmVkZihlYXJsaWVzdC5hc3NheSwgZWFybGllc3QuYXNzYXkpDQoNCmxhdGVzdC5hc3NheSA8LSAgQ0xPWlVLMy5mYmMucGtbb3JkZXIoQ0xPWlVLMy5mYmMucGskc2FtcGxlZGF0ZSwgZGVjcmVhc2luZyA9IFRSVUUpLF0gJT4lIA0KICBkaXN0aW5jdChMVUlOLCAua2VlcF9hbGwgPSBUUlVFKQ0KDQp0ZXN0IDwtIGxlZnRfam9pbihlYXJsaWVzdC5hc3NheVsxOjJdLGxhdGVzdC5hc3NheVsxOjJdLCBieSA9ICdMVUlOJykNCg0KdGVzdCRkaWZmIDwtIHRlc3Qkc2FtcGxlZGF0ZS55IC0gdGVzdCRzYW1wbGVkYXRlLngNCg0KdGVzdCR3ZWVrcyA8LSBhcy5udW1lcmljKHRlc3QkZGlmZikvNw0KDQp0ZXN0JG92ZXIxW3Rlc3Qkd2Vla3MgPj0gNTJdIDwtICJZZXMiDQp0ZXN0JG92ZXIxW3Rlc3Qkd2Vla3MgPCA1Ml0gPC0gIk5vIg0KDQp0bXAgPC0gYXMuZGF0YS5mcmFtZSh0YWJsZSh0ZXN0JG92ZXIxKSkNCg0KYSA8LSAodG1wWzIuMl0vKHRtcFsxLDJdICsgdG1wWzIsMl0pKSAqIDEwMA0KYGBgDQoNClRoZSBmaW5hbCBjdXJhdGVkIENMT1pVSzMgbG9uZ2l0dWRpbmFsIGRhdGFzZXQgaW5jbHVkZWQgODExIHBhcnRpY2lwYW50cywgd2l0aCBhIHRvdGFsIG9mIDIsMzYyIEZCQyBhbmQgcGhhcm1hY29raW5ldGljIGFzc2F5cyB0YWtlbiBvbiB0aGUgc2FtZSBkYXkuIFBhcnRpY2lwYW50cyBoYWQgYSBtZWFuIChTRCkgYWdlIG9mIDQwLjEgKDEyLjIpIHllYXJzOyAyOC45JSB3ZXJlIGZlbWFsZSAoTiA9IDIzNCkgYW5kIDcxLjElIHdlcmUgbWFsZSAoTiA9IDU3NykuIEZ1bGwgZGVzY3JpcHRpdmUgc3RhdGlzdGljcyBvZiB0aGUgc2FtcGxlIGF0IHRoZSBwb2ludCBvZiBsb3dlc3QgQU5DIGFyZSBnaXZlbiBpbiBUYWJsZSAyLiBXaGlsZSB0aGUgZmlyc3Qgb2NjdXJyZW5jZSBvZiBlYWNoIGluZGl2aWR1YWwgb24gb3VyIFpUQVMgZGF0YXNldCBpcyBub3QgbmVjZXNzYXJpbHkgdGhlIGRhdGUgdGhleSBzdGFydGVkIGNsb3phcGluZSwgd2Ugbm90ZSB0aGF0IGFib3V0IGEgdGhpcmQgb2YgdGhlIENMT1pVSzMgaW5kaXZpZHVhbHMgd2l0aCB2YWxpZCBkYXRhIChgciByb3VuZChhWzIsXSwgZGlnaXRzID0gMSlgJTsgYHIgdG1wWzIsMl1gL2ByIHRtcFsxLDJdYCkgIGhhZCByZWNvcmRzIHNwYW5uaW5nIGF0IGxlYXN0IGEgeWVhciAgb2YgY2xvemFwaW5lIHRyZWF0bWVudC4NCg0KVGhlIERBRyAoU3VwcGxlbWVudGFyeSBGaWd1cmUgMikgZGlzcGxheXMgdGhlIHBvc3NpYmxlIGNhdXNhbCBwYXRocyBiZXR3ZWVuIEFOQyAodGhlIG91dGNvbWUpLCBkYWlseSBjbG96YXBpbmUgZG9zZSAodGhlIGV4cG9zdXJlIHZhcmlhYmxlKSwgYW5kIHBsYXNtYSBjb25jZW50cmF0aW9ucyBvZiBjbG96YXBpbmUgYW5kIG5vcmNsb3phcGluZSAocG90ZW50aWFsIG1lZGlhdG9ycyBiZXR3ZWVuIGRvc2UgYW5kIEFOQykuIA0KDQpgYGB7ciBUYWJsZSAyLCBmaWcuY2FwPSJUYWJsZSAyLiBTdW1tYXJ5IG9mIENMT1pVSzMgdmFyaWFibGVzIHVzZWQgaW4gbWVkaWF0aW9uIGFuYWx5c2lzLiBEZXNjcmlwdGl2ZSBzdGF0aXN0aWNzIHByZXNlbnRlZCBmb3IgYSDigJhjcm9zcy1zZWN0aW9uYWzigJkgdmVyc2lvbiBvZiBDTE9aVUszIHdoZXJlIHRoZSBhc3NheSB3aXRoIHRoZSBsb3dlc3QgdmFsdWUgb2YgQU5DIHBlciBwZXJzb24gaXMgcmV0YWluZWQuICBURFMgPSBUaW1lIGJldHdlZW4gRG9zZSBhbmQgU2FtcGxlOyBBTkMgPSBBYnNvbHV0ZSBOZXV0cm9waGlsIENvdW50LiJ9DQoNCiMgZ2V0IGRlc2NyaXB0aXZlIHN0YXRpc3RpY3MgZm9yIGtleSB2YXJpYWJsZXMNCmEgPC0gZGVzY3JpYmVCeSh4ID0gZHBseXI6OnNlbGVjdChDTE9aVUszLmZiYy5way5taW4sIGMoImNsb3phcGluZSIsICJub3JjbG96YXBpbmUiLCAiZGFpbHlkb3NlIiwgIlREUyIsICJuZXV0X251bSIsICJhZ2VfYXRfYXNzYXkiKSksIGZhc3QgPSBUUlVFLCBncm91cCA9IENMT1pVSzMuZmJjLnBrLm1pbiRTRVgpDQoNCiMgc3BsaXQgYnkgc2V4DQphRiA8LSBhJEZFTUFMRQ0KYU0gPC0gYSRNQUxFDQoNCiMga2V5IHN0YXRzDQpWYXJpYWJsZSA8LSBjKCdbQ2xvemFwaW5lXSAobWcvTCknLCAnW05vcmNsb3phcGluZV0gKG1nL0wpJywgJ0RhaWx5IGRvc2UgKG1nKScsICJURFMgKGhvdXJzKSIsICJBTkMgKHgxMF45L0wpIiwgIkFnZSIpDQpNZWFuX00gPC0gcm91bmQoYU0kbWVhbiwgMykNCk1lYW5fRiA8LSByb3VuZChhRiRtZWFuLCAzKQ0KU0RfTSA8LSByb3VuZChhTSRzZCwgMykNClNEX0YgPC0gcm91bmQoYUYkc2QsIDMpDQpNaW5fTSA8LSByb3VuZChhTSRtaW4sIDMpDQpNaW5fRiA8LSByb3VuZChhRiRtaW4sIDMpDQpNYXhfTSA8LSByb3VuZChhTSRtYXgsIDMpDQpNYXhfRiA8LSByb3VuZChhRiRtYXgsIDMpDQoNCk1hbGUgPC0gY2JpbmQoVmFyaWFibGUsIE1lYW5fTSwgU0RfTSwgTWluX00sIE1heF9NKQ0KRmVtYWxlIDwtIGNiaW5kKE1lYW5fRiwgU0RfRiwgTWluX0YsIE1heF9GKQ0KDQp0YWJsZSA8LSBjYmluZChNYWxlLCBGZW1hbGUpDQoNCmthYmxlKHRhYmxlLCBjb2wubmFtZXMgPSBjKCJWYXJpYWJsZSIsICJNZWFuIiwiU0QiLCJNaW4iLCJNYXgiLCAiTWVhbiIsIlNEIiwiTWluIiwiTWF4IiksIGNhcHRpb24gPSAiVGFibGUgMi4gU3VtbWFyeSBvZiBDTE9aVUszIHZhcmlhYmxlcyB1c2VkIGluIG1lZGlhdGlvbiBhbmFseXNpcy4gRGVzY3JpcHRpdmUgc3RhdGlzdGljcyBwcmVzZW50ZWQgZm9yIGEg4oCYY3Jvc3Mtc2VjdGlvbmFs4oCZIHZlcnNpb24gb2YgQ0xPWlVLMyB3aGVyZSBvbmx5IHRoZSBlbnRyeSBhc3NvY2lhdGVkIHdpdGggdGhlIGxvd2VzdCB2YWx1ZSBvZiBBTkMgcGVyIHBlcnNvbiBpcyByZXRhaW5lZC4gVERTID0gVGltZSBiZXR3ZWVuIERvc2UgYW5kIFNhbXBsZTsgQU5DID0gQWJzb2x1dGUgTmV1dHJvcGhpbCBDb3VudDsgW0Nsb3phcGluZV0gPSBDbG96YXBpbmUgcGxhc21hIGNvbmNlbnRyYXRpb247IFtOb3JjbG96YXBpbmVdID0gTm9yY2xvemFwaW5lIHBsYXNtYSBjb25jZW50cmF0aW9uLiAgIikgJT4lDQogIGthYmxlX3N0eWxpbmcoIm5vbmUiLCBmdWxsX3dpZHRoID0gVCwNCiAgICAgICAgICAgICAgICBwb3NpdGlvbiA9ICJsZWZ0IiwgZm9udF9zaXplID0gMTYpICU+JQ0KICBhZGRfaGVhZGVyX2Fib3ZlKGMoIiAiID0gMSwgIk1hbGUiID0gNCwgIkZlbWFsZSIgPSA0KSkgJT4lIA0KICBrYWJsZV9jbGFzc2ljIA0KDQpgYGANCg0KDQo8YnI+DQo8YnI+DQoNCiMjIyMgPHNtYWxsPiBTaWduaWZpY2FudCBhc3NvY2lhdGlvbnMgYmV0d2VlbiBwaGFybWFjb2tpbmV0aWMgYW5kIHBoYXJtYWNvZ2Vub21pYyB2YXJpYWJsZXMgd2l0aCBBTkMgPC9zbWFsbD4NCg0KYGBgIHtyIG1vZGVsIGxhYmVscywgaW5jbHVkZSA9IEZBTFNFfQ0KIyBsYWJlbHMgZm9yIHVzZSBpbiB0YWJfbW9kZWwgdG8gY3JlYXRlIHJlZ3Jlc3Npb24gdGFibGVzDQoNCmFsbF9sYWJlbHMgPC0gYygnSW50ZXJjZXB0JyA9ICJJbnRlcmNlcHQiLA0KICAgICAgICAgICAgICAnZGFpbHlkb3NlJyA9ICJEYWlseSBkb3NlIiwNCiAgICAgICAgICAgICAgJ2Nsb3phcGluZScgPSAiQ2xvemFwaW5lIiwNCiAgICAgICAgICAgICAgJ25vcmNsb3phcGluZScgPSAiTm9yY2xvemFwaW5lIiwNCiAgICAgICAgICAgICAgJ2VzdF9zY29yZScgPSAiQ1lQMUEyIEFjdGl2aXR5IFNjb3JlIiwNCiAgICAgICAgICAgICAgJ2VzdF9waGVub1JhcGlkIG1ldGFib2xpc2VyJyA9ICdSYXBpZCBtZXRhYm9saXNlciBQaGVub3R5cGUnLA0KICAgICAgICAgICAgICAnZXN0X3BoZW5vVWx0cmFyYXBpZCBtZXRhYm9saXNlcicgPSAnVWx0cmFyYXBpZCBtZXRhYm9saXNlciBQaGVub3R5cGUnLA0KICAgICAgICAgICAgICAnZXN0X3BoZW5vUG9vciBtZXRhYm9saXNlcicgPSAnUG9vciBtZXRhYm9saXNlciBQaGVub3R5cGUnLA0KICAgICAgICAgICAgICAnZXN0X3BoZW5vSW50ZXJtZWRpYXRlIG1ldGFib2xpc2VyJyA9ICdJbnRlcm1lZGlhdGUgbWV0YWJvbGlzZXIgUGhlbm90eXBlJywgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAnUGhlbm9Qb29yIG1ldGFib2xpc2VyJyA9ICdQb29yIG1ldGFib2xpc2VyIFBoZW5vdHlwZScsDQogICAgICAgICAgICAgICdQaGVub0ludGVybWVkaWF0ZSBtZXRhYm9saXNlcicgPSAnSW50ZXJtZWRpYXRlIG1ldGFib2xpc2VyIFBoZW5vdHlwZScsDQogICAgICAgICAgICAgICdURFMnID0gIlREUyIsDQogICAgICAgICAgICAgICJTRVhNQUxFIiA9ICdTZXggKE1hbGUpJywNCiAgICAgICAgICAgICAgImFnZV9hdF9hc3NheSIgPSAiQWdlIiwNCiAgICAgICAgICAgICAgInN0ZF9hZ2UyIiA9ICJBZ2Ugc3F1YXJlZCIsDQogICAgICAgICAgICAgICJkdWZmeW51bGwxIiA9ICJEdWZmeS1OdWxsIChQcmVzZW50KSIsDQogICAgICAgICAgICAgICJyczI0NzIyOTdfVCIgPSAicnMyNDcyMjk3X1QiLA0KICAgICAgICAgICAgICAicnM2MTc1MDkwMF9UIiA9ICJyczYxNzUwOTAwX1QiLA0KICAgICAgICAgICAgICAicnMyMDExNDI1X0ciID0gInJzMjAxMTQyNV9HIiwNCiAgICAgICAgICAgICAgInJzMTEyNjU0NV9UIiA9ICJyczExMjY1NDVfVCIsDQogICAgICAgICAgICAgICJjX1BSUyIgPSAiQ2xvemFwaW5lIE1ldGFib2xpc20gUEdTIiwNCiAgICAgICAgICAgICAgIm5fUFJTIiA9ICJOb3JjbG96YXBpbmUgTWV0YWJvbGlzbSBQR1MiKQ0KDQpsYWJlbHNfcmVwIDwtIGMoJ0ludGVyY2VwdCcgPSAiSW50ZXJjZXB0IiwNCiAgICAgICAgICAgICAgICAgJ2RhaWx5ZG9zZScgPSAiRGFpbHkgZG9zZSIsDQogICAgICAgICAgICAgICdjbG96YXBpbmUnID0gIkNsb3phcGluZSIsDQogICAgICAgICAgICAgICdub3JjbG96YXBpbmUnID0gIk5vcmNsb3phcGluZSIsDQogICAgICAgICAgICAgICJTRVhNQUxFIiA9ICdTZXggKE1hbGUpJywNCiAgICAgICAgICAgICAgImFnZV9hdF9hc3NheSIgPSAiQWdlIiwNCiAgICAgICAgICAgICAgInN0ZF9hZ2UyIiA9ICJBZ2Ugc3F1YXJlZCIsDQogICAgICAgICAgICAgICJURFMiID0gIlREUyIsDQogICAgICAgICAgICAgICJyYXRpbyIgPSAiTWV0YWJvbGljIFJhdGlvIiwNCiAgICAgICAgICAgICAgInJzMjQ3MjI5N19UIiA9ICJyczI0NzIyOTdfVCIsDQogICAgICAgICAgICAgICJyczYxNzUwOTAwX1QiID0gInJzNjE3NTA5MDBfVCIsDQogICAgICAgICAgICAgICJyczIwMTE0MjVfRyIgPSAicnMyMDExNDI1X0ciLA0KICAgICAgICAgICAgICAicnMxMTI2NTQ1X1QiID0gInJzMTEyNjU0NV9UIikNCmBgYA0KDQoNCmBgYHtyIG1haW4gbWl4ZWQgbW9kZWx9DQoNCiMgbGluZWFyIG1peGVkIGVmZmVjdCByZWdyZXNzaW9uIG1vZGVscyBvbiBsb25naXR1ZGluYWwgY2xvenVrMyBkYXRhDQphbmNfZGNudCA8LSBsbWVyKG5ldXRfbnVtfmRhaWx5ZG9zZStjbG96YXBpbmUrbm9yY2xvemFwaW5lK1REUytTRVgrYWdlX2F0X2Fzc2F5K3N0ZF9hZ2UyICsgKDF8TFVJTiksIGRhdGE9Q0xPWlVLMy5mYmMucGsuc3RkKSAjIGJhc2UgbW9kZWwgDQoNCmNvZWZzMSA8LSBkYXRhLmZyYW1lKGNvZWYoc3VtbWFyeShhbmNfZGNudCkpKQ0KDQojIGluY2x1ZGluZyBnZW5ldGljIHByZWRpY3RvcnMgdG9vDQphbmNfZGNudF8xYTJfc25wX2FzIDwtIGxtZXIobmV1dF9udW1+ZGFpbHlkb3NlK2Nsb3phcGluZStub3JjbG96YXBpbmUrZXN0X3Njb3JlK3JzMjQ3MjI5N19UK3JzNjE3NTA5MDBfVCtyczIwMTE0MjVfRytyczExMjY1NDVfVCtURFMrU0VYK2FnZV9hdF9hc3NheStzdGRfYWdlMiArICgxfExVSU4pLCBkYXRhPUNMT1pVSzMuZmJjLnBrLmdlbi5zdGQpICMgYmFzZSBtb2RlbCArIFBHeCAoU05QcyBhbmQgQ1lQMUEyIEFjdGl2aXR5IFNjb3JlKQ0KDQpjb2VmczFiIDwtIGRhdGEuZnJhbWUoY29lZihzdW1tYXJ5KGFuY19kY250XzFhMl9zbnBfYXMpKSkgDQoNCmBgYA0KDQpBbGwgcGhhcm1hY29raW5ldGljIHZhcmlhYmxlcyB3ZXJlIHNpZ25pZmljYW50bHkgYXNzb2NpYXRlZCB3aXRoIEFOQyAoVGFibGUgMykuIEFOQyB3YXMgaW52ZXJzZWx5IGFzc29jaWF0ZWQgd2l0aCBjbG96YXBpbmUgcGxhc21hIGNvbmNlbnRyYXRpb24gKM6yID0gYHIgcm91bmQoY29lZnMxWzMsMV0sIGRpZ2l0cyA9IDMpYCwgKnAqID0gYHIgcm91bmQoY29lZnMxWzMsNV0sIGRpZ2l0cyA9IDQpYCBhbmQgcG9zaXRpdmVseSBhc3NvY2lhdGVkIHdpdGggbm9yY2xvemFwaW5lIHBsYXNtYSBjb25jZW50cmF0aW9uICjOsiA9IGByIHJvdW5kKGNvZWZzMVs0LDFdLCBkaWdpdHMgPSAzKWAsICpwKiA9IGByIHJvdW5kKGNvZWZzMVs0LDVdLCBkaWdpdHMgPSA1KWApLiBJbiB0aGUgb3JpZ2luYWwgRkJDIHNjYWxlcywgYSByZWR1Y3Rpb24gaW4gQU5DIG9mIDE2NiBjZWxscy9tbV4zXiB3YXMgb2JzZXJ2ZWQgZm9yIGV2ZXJ5IHN0YW5kYXJkIGRldmlhdGlvbiBpbmNyZWFzZSBpbiBwbGFzbWEgY2xvemFwaW5lIGNvbmNlbnRyYXRpb24uIExpa2V3aXNlLCBlYWNoIHN0YW5kYXJkIGRldmlhdGlvbiBpbmNyZWFzZSBpbiBwbGFzbWEgbm9yY2xvemFwaW5lIGNvbmNlbnRyYXRpb24gd2FzIGFjY29tcGFuaWVkIGJ5IGEgMjE5IGNlbGxzL21tXjNeIGluY3JlYXNlIGluIEFOQy4gV2Ugbm90ZSB0aGF0IGRhaWx5IGNsb3phcGluZSBkb3NlIHdhcyBhbHNvIGFzc29jaWF0ZWQgd2l0aCBBTkMgaW4gdGhpcyBtb2RlbCAozrIgPSBgciByb3VuZChjb2VmczFbMiwxXSwgZGlnaXRzID0gMylgLCAqcCogPSBgciByb3VuZChjb2VmczFbMiw1XSwgZGlnaXRzID0gNSlgKSwgY29ycmVzcG9uZGluZyB0byBhbiBlc3RpbWF0ZWQgcmlzZSBvZiAxMzMgY2VsbHMvbW1eM14gcGVyIHN0YW5kYXJkIGRldmlhdGlvbiBpbmNyZWFzZSBpbiB0aGUgZGFpbHkgZG9zZS4NCg0KVGhlIHBoYXJtYWNva2luZXRpYyB2YXJpYWJsZXMgZG9zZSwgY2xvemFwaW5lIHBsYXNtYSBjb25jZW50cmF0aW9uLCBhbmQgbm9yY2xvemFwaW5lIHBsYXNtYSBjb25jZW50cmF0aW9uIHJlbWFpbmVkIHNpZ25pZmljYW50bHkgYXNzb2NpYXRlZCB3aXRoIEFOQyBhZnRlciBpbmNvcnBvcmF0aW5nIHBoYXJtYWNvZ2Vub21pYyBwcmVkaWN0b3JzIGluIHRoZSBtb2RlbCBmb3IgdGhlIHN1YnNldCBvZiBpbmRpdmlkdWFscyB3aXRoIGdlbmV0aWMgZGF0YSAoVGFibGUgMykuIFdlIGZvdW5kIG5vIGV2aWRlbmNlIGZvciBhc3NvY2lhdGlvbiBiZXR3ZWVuIEFOQyBhbmQgYW55IG9mIHRoZSBwaGFybWFjb2dlbm9taWMgU05QcywgUEdTIGZvciBjbG96YXBpbmUgYW5kIG5vcmNsb3phcGluZSwgb3IgdmFyaWF0aW9uIGluIHRoZSBITEEgcmVnaW9uICgqKlN1cHBsZW1lbnRhcnkgTm90ZSoqKS4gDQoNCldlIHNhdyBhIHNpZ25pZmljYW50LCBwb3NpdGl2ZSBhc3NvY2lhdGlvbiBiZXR3ZWVuIENZUDFBMiBhY3Rpdml0eSBzY29yZSBhbmQgQU5DLCBpbiB3aGljaCBpbmNyZWFzZWQgQ1lQMUEyIGZ1bmN0aW9uIChpLmUuLCByYXBpZCBDWVAxQTIgbWV0YWJvbGlzbSkgd2FzIGFzc29jaWF0ZWQgd2l0aCBpbmNyZWFzZWQgbmV1dHJvcGhpbCBjb3VudHMgKM6yID0gYHIgcm91bmQoY29lZnMxYls1LDFdLCBkaWdpdHMgPSAzKWAsICpwKiA9IGByIHJvdW5kKGNvZWZzMWJbNSw1XSwgZGlnaXRzID0gNClgKS5BcyBkZXNjcmliZWQgaW4gdGhlICoqU3VwcGxlbWVudGFyeSBOb3RlKiosIHRoaXMgYXNzb2NpYXRpb24gd2FzIGluZGVwZW5kZW50IG9mIHJzMjQ3MjI5NywgYSBwdXRhdGl2ZSByZWd1bGF0b3Igb2YgQ1lQMUEyIGFjdGl2aXR5IGFuZCBhIGdlbm9tZS13aWRlIHNpZ25pZmljYW50IFNOUCBpbiBHV0FTIG9mIGNsb3phcGluZSBwaGFybWFjb2tpbmV0aWNzXjIzXi4gIA0KDQpGaW5hbGx5LCB0aGUgcHJlc2VuY2Ugb2YgdGhlIER1ZmZ5LU51bGwgZ2Vub3R5cGUsIG9ic2VydmVkIGluIGp1c3QgdW5kZXIgNSUgb2YgdGhlIENMT1pVSzMgc2FtcGxlLCB3YXMgc2lnbmlmaWNhbnRseSBhc3NvY2lhdGVkIHdpdGggcmVkdWNlZCBBTkMgaW4gb3VyIHNhbXBsZSAozrIgPSAtMC43NzA7IHAgPSAwLjAwMikuDQoNCg0KYGBge3IgVGFibGUgM30NCiMgY3JlYXRlIHJlc3VsdHMgdGFibGUNCnRhYl9tb2RlbChhbmNfZGNudCwgYW5jX2RjbnRfMWEyX3NucF9hcywgc2hvdy5lc3QgPSBUUlVFLCBzaG93LnNlID0gVFJVRSwgc2hvdy5jaSA9IEZBTFNFLA0KICAgICAgICAgICAgICAgICAgICAgc2hvdy5wID0gRiwgY29sbGFwc2Uuc2UgPSAgVFJVRSwgc2hvdy5pbnRlcmNlcHQgPSBGQUxTRSwgZW1waC5wID0gVFJVRSwgZGlnaXRzID0gMywgZGlnaXRzLnJlID0gMywNCiAgICAgICAgICAgICAgICAgICAgICNvcmRlci50ZXJtcyA9IGMoMSwgMiwgNywgMywgNCwgNSAsNiksDQogICAgICAgICAgICAgICAgICAgICBzdHJpbmcucHJlZCA9ICJQcmVkaWN0b3IiLCBzdHJpbmcuZXN0ID0gIkVzdGltYXRlIChTRSkiLA0KICAgICAgICAgICAgICAgICAgICAgZHYubGFiZWxzID0gYygiQmFzZSBNb2RlbCAoQ2xvemFwaW5lIERvc2UgKyBMZXZlbHMpIiwgIkJhc2UgTW9kZWwgKyBQR3ggUHJlZGljdG9ycyIpLA0KICAgICAgICAgICAgICAgICAgICAgcHJlZC5sYWJlbHMgPSBhbGxfbGFiZWxzLA0KICAgICAgICAgICAgICAgICAgICAgQ1NTID0gbGlzdChjc3MudGFibGUgPSAnK2ZvbnQtZmFtaWx5OiBSb2JvdG87IHdpZHRoOiAxMDAlOycsIGNzcy5kZXB2YXJoZWFkID0gJytmb250LXN0eWxlOiBub3JtYWw7IGZvbnQtd2VpZ2h0OiBub3JtYWw7IHRleHQtYWxpZ24gPSBjZW50cmUnLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjc3MudGhlYWQgPSAnYm9yZGVyLXRvcDogYmxhbms7IHRleHQtYWxpZ24gPSBjZW50cmU7IHBhZGRpbmc6IDAuNWNtOycsIGNzcy50ZGF0YSA9ICdwYWRkaW5nOiAwLjI1Y207IHRleHQtYWxpZ24gPSBjZW50cmU7JywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3NzLnJhbmRvbXBhcnRzID0gJ2JvcmRlci10b3A6MXB4IHNvbGlkOycsIGNzcy5maXJzdHRhYmxlcm93ID0gJ2JvcmRlci1ib3R0b206IGJsYW5rJywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3NzLmZpcnN0c3Vtcm93ID0gJ2JvcmRlci10b3A6IDFweCBzb2xpZCcsIGNzcy5mb290bm90ZSA9ICd0ZXh0LWFsaWduOiBsZWZ0OycsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjc3Muc3VtbWFyeSA9ICJwYWRkaW5nLXRvcDowLjJjbTsgcGFkZGluZy1ib3R0b206MC4yY207IiksIA0KICAgICAgICAgICAgICAgICAgICAgdGl0bGUgPSAiVGFibGUgMy4gUmVzdWx0cyBvZiB0d28gTGluZWFyIE1peGVkLUVmZmVjdCBNb2RlbHMgZXhwbG9yaW5nIHByZWRpY3RvcnMgb2YgQWJzb2x1dGUgTmV1dHJvcGhpbCBDb3VudCAoQU5DKS4gU3RhbmRhcmRpc2VkIHJlZ3Jlc3Npb24gY29lZmZpY2llbnRzIGFyZSByZXBvcnRlZCBhbG9uZ3NpZGUgc3RhbmRhcmQgZXJyb3IgYW5kIHAgdmFsdWVzIGVzdGltYXRlZCB1c2luZyB0aGUgbG1lclRlc3QgcGFja2FnZS4gUEd4ID0gUGhhcm1hY29nZW5vbWljOyBURFMgPSBUaW1lIGJldHdlZW4gRG9zZSBhbmQgU2FtcGxlOyBbQ2xvemFwaW5lXSA9IENsb3phcGluZSBwbGFzbWEgY29uY2VudHJhdGlvbjsgW05vcmNsb3phcGluZV0gPSBOb3JjbG96YXBpbmUgcGxhc21hIGNvbmNlbnRyYXRpb247IExVSU4gPSBQYXJ0aWNpcGFudCBJZGVudGlmaWVyIHVzZWQgaW4gQ0xPWlVLMzsgz4NeMl4gPSBSZXNpZHVhbCBWYXJpYW5jZTsgSUNDID0gSW50cmFjbGFzcyBDb3JyZWxhdGlvbiBDb2VmZmljaWVudDsgdH4wMH4gPSBSYW5kb20gSW50ZXJjZXB0IFZhcmlhbmNlOyBOfkxVSU5+ID0gTnVtYmVyIG9mIHBhcnRpY2lwYW50cy4iLA0KICAgICAgICAgICAgICAgICAgICAgcC5zdHlsZSA9ICJzdGFycyINCikNCmBgYA0KDQo8YnI+DQo8YnI+DQoNCiMjIyMgPHNtYWxsPiBQbGFzbWEgQ2xvemFwaW5lIGFuZCBOb3JjbG96YXBpbmUgbGV2ZWxzIG1lZGlhdGUgdGhlIERvc2Ug4oCTIEFOQyBhc3NvY2lhdGlvbi4gPC9zbWFsbD4NCg0KYGBge3IgY3JlYXRlIHJlc2lkdWFsc30NCiMgY3JlYXRlIHJlc2lkdWFsaXNlZCB2ZXJzaW9ucyBvZiBwYXJlbnQgdmFyaWFibGVzIGZvciBpbmNsdXNpb24gaW4gbWVkaWF0aW9uIGFuYWx5c2lzIHdpdGggU0VNLg0KIyB0aGlzIGFsbG93cyBjb3ZhcmlhdGVzIHRvIGJlIGNvbnRyb2xsZWQgZm9yIHdpdGhvdXQgaW5jbHVkaW5nIHRvbyBtYW55IHZhcmlhYmxlcyBpbiB0aGUgYW5hbHlzaXMgYW5kIGNvbXBsaWNhdGluZyB0aGUgbW9kZWwuDQojIHRoZSByZXNpZHVhbGlzZWQgdmFyaWFibGVzIHdlcmUgY3JlYXRlZCBieSByZWdyZXNzaW5nIGVhY2ggdmFyaWFibGUgYWdhaW5zdCB0aGUgY292YXJpYXRlcyBzZXgsIGFnZSwgYWdlXjIsIGFuZCB0aW1lIGJldHdlZW4gZG9zZSBhbmQgc2FtcGxlIChURFMpLg0KDQpDTE9aVUszLmZiYy5way5taW4kbG9nX2Rvc2UgPSBOQQ0KQ0xPWlVLMy5mYmMucGsubWluJGxvZ19kb3NlID0gbG9nKENMT1pVSzMuZmJjLnBrLm1pbiRkYWlseWRvc2UpDQoNCnJlZ19kb3NlX3UgPC0gbG0obG9nX2Rvc2UgfiBURFMrU0VYK2FnZV9hdF9hc3NheStzdGRfYWdlMiwgZGF0YT1DTE9aVUszLmZiYy5way5taW4pJHJlc2lkdWFscw0KcmVnX2Nsb3pfZyA8LSBnbG0oY2xvemFwaW5lIH4gVERTK1NFWCthZ2VfYXRfYXNzYXkrc3RkX2FnZTIsIGRhdGE9Q0xPWlVLMy5mYmMucGsubWluLCBmYW1pbHkgPSBHYW1tYShsaW5rID0gbG9nKSkkcmVzaWR1YWxzDQpyZWdfbm9yX2cgPC0gZ2xtKG5vcmNsb3phcGluZSB+IFREUytTRVgrYWdlX2F0X2Fzc2F5K3N0ZF9hZ2UyLCBkYXRhPUNMT1pVSzMuZmJjLnBrLm1pbiwgZmFtaWx5ID0gR2FtbWEobGluayA9IGxvZykpJHJlc2lkdWFscw0KcmVnX2FuY191IDwtIGxtKG5ldXRfbnVtIH4gVERTK1NFWCthZ2VfYXRfYXNzYXkrc3RkX2FnZTIsIGRhdGE9Q0xPWlVLMy5mYmMucGsubWluKSRyZXNpZHVhbHMNCg0KRG9zZSA8LSByZWdfZG9zZV91DQpDbG96YXBpbmUgPC0gcmVnX2Nsb3pfZw0KQU5DIDwtIHJlZ19hbmNfdQ0KTm9yY2xvemFwaW5lIDwtIHJlZ19ub3JfZw0KDQojIGNyZWF0aW5nIG5ldyBkYXRhZnJhbWUgY29udGFpbmluZyB0aGVzZSByZXNpZHVhbGlzZWQgdmFyaWFibGVzLg0KRGF0YSA8LSBkYXRhLmZyYW1lKERvc2UgPSBEb3NlLCBBTkMgPSBBTkMsIENsb3phcGluZSA9IENsb3phcGluZSwgTm9yY2xvemFwaW5lID0gTm9yY2xvemFwaW5lKQ0KDQojIFN0YW5kYXJkaXNlIHZhcmlhYmxlcyBwcmlvciB0byBzZW0gc28gZXF1aXZhbGVudCB0byBwYXN0IHJlZ3Jlc3Npb24gYW5hbHlzZXMuDQpEYXRhIDwtIGRhdGF3aXphcmQ6OnN0YW5kYXJkaXNlKHggPSBEYXRhLCBzZWxlY3QgPSBjKCJEb3NlIiwgIkNsb3phcGluZSIsICJOb3JjbG96YXBpbmUiKSkNCkRhdGFfb2cgPC0gRGF0YQ0KDQpgYGANCg0KDQpgYGB7ciBTRU0gTWFpbiwgZGV2ID0gInBuZyIsIGRldi5hcmdzPWxpc3QoYmc9InRyYW5zcGFyZW50Iil9DQpsaWJyYXJ5KGxhdmFhbikNCg0KIyBjcmVhdGluZyBtZWRpYXRpb24gbW9kZWwgd2l0aCBBTkMgYXMgb3V0Y29tZSwgZG9zZSBhcyBleHBvc3VyZSwgY2xvemFwaW5lIGFzIE0xLCBhbmQgbm9yY2xvemFwaW5lIGFzIE0yLiANCg0KbXVsdGlwbGVNZWRpYXRpb24gPC0gJw0KQU5DIH4gYjEgKiBDbG96YXBpbmUgKyBiMiAqIE5vcmNsb3phcGluZSArIGMgKiBEb3NlDQpDbG96YXBpbmUgfiBhMSAqIERvc2UNCk5vcmNsb3phcGluZSB+IGQyMSAqIENsb3phcGluZQ0KaW5kaXJlY3QxIDo9IGExICogYjENCmluZGlyZWN0MiA6PSBhMSAqIGQyMSAqIGIyDQp0b3RhbCA6PSBjICsgKGExICogYjEpICsgKGExICogZDIxICogYjIpDQpDbG96YXBpbmUgfn4gTm9yY2xvemFwaW5lDQonDQoNCiMgZml0IG1vZGVsIHdpdGggU0VNIGluIGxhdmFhbg0KZml0MyA8LSBzZW0obW9kZWwgPSBtdWx0aXBsZU1lZGlhdGlvbiwgZGF0YSA9IERhdGEpDQoNCmBgYA0KDQpUaGUgcHJpbWFyeSBtb2RlbCAoRmlndXJlIDEpIHNob3dlZCBldmlkZW5jZSBvZiBhIHNpZ25pZmljYW50IGRpcmVjdCBlZmZlY3Qgb2YgZGFpbHkgY2xvemFwaW5lIGRvc2Ugb24gQU5DICjOsiA9IGByIHJvdW5kKHN1bW1hcnkoZml0MykkcGVbMyw2XSwgZGlnaXRzID0gMylgLCAqcCogPSBgciByb3VuZChzdW1tYXJ5KGZpdDMpJHBlWzMsOV0sIGRpZ2l0cyA9IDQpYCkuIFRoZSBpbmRpcmVjdCBwYXRoIHZpYSBib3RoIGNsb3phcGluZSBhbmQgbm9yY2xvemFwaW5lIHBsYXNtYSBjb25jZW50cmF0aW9uIHdhcyBhbHNvIHNpZ25pZmljYW50ICjOsiA9IGByIHJvdW5kKHN1bW1hcnkoZml0MykkcGVbMTIsNl0sIGRpZ2l0cyA9IDMpYCwgKnAqID0gYHIgcm91bmQoc3VtbWFyeShmaXQzKSRwZVsxMiw5XSwgZGlnaXRzID0gNClgKS4gSG93ZXZlciwgbm8gaW5kaXJlY3QgZWZmZWN0IHdhcyBvYnNlcnZlZCB3aGVuIHBsYXNtYSBjbG96YXBpbmUgY29uY2VudHJhdGlvbiB3YXMgY29uc2lkZXJlZCBhcyB0aGUgc29sZSBtZWRpYXRvciAozrIgPSBgciByb3VuZChzdW1tYXJ5KGZpdDMpJHBlWzExLDZdLCBkaWdpdHMgPSAzKWAsICpwKiA9IGByIHJvdW5kKHN1bW1hcnkoZml0MykkcGVbMTEsOV0sIGRpZ2l0cyA9IDMpYCkuIFNlY29uZGFyeSBhbmFseXNlcyByZXZlYWxlZCB0aGF0IENZUDFBMiBhY3Rpdml0eSBzY29yZXMgYXBwZWFyZWQgdG8gYWNjb3VudCBmb3IgcGFydCBvZiB0aGVzZSBhc3NvY2lhdGlvbnMgKiooU3VwcGxlbWVudGFyeSBOb3RlKSoqLiBIb3dldmVyLCBhcyBvbmx5IHNvbWUgb2YgdGhlIENMT1pVSzMgc2FtcGxlIHdhcyBnZW5vdHlwZWQgKDUyMy84MTEpLCB0aGVzZSBtb2RlbHMgd291bGQgaGF2ZSByZWR1Y2VkIHN0YXRpc3RpY2FsIHBvd2VyIGluIHJlbGF0aW9uIHRvIG91ciBtYWluIGFuYWx5c2VzIGFuZCB0aGVpciByZXN1bHRzIHNob3VsZCBiZSBjb25zaWRlcmVkIHdpdGggY2F1dGlvbi4gDQoNClNlbnNpdGl2aXR5IGFuYWx5c2VzIHdlcmUgcGVyZm9ybWVkIHVzaW5nIG5vbi1yZXNpZHVhbGlzZWQgdmFyaWFibGVzIGluIHRoZSBtb2RlbCwgYW5kIGFsc28gYnkgdGVzdGluZyBzaW5nbGUgbWVkaWF0b3JzIGluIHRoZSBsb25naXR1ZGluYWwgZGF0YXNldC4gVGhlc2Ugd2VyZSBhbGwgY29uc2lzdGVudCB3aXRoIHRoZSByZXN1bHRzIG9mIHRoZSBwcmltYXJ5IGFuYWx5c2VzLCBzdWdnZXN0aW5nIHRoYXQgb3VyIG1vZGVscyB3ZXJlIG5vdCBjb21wcm9taXNlZCB0aHJvdWdoIHRoZSBjb3ZhcmlhdGVzIGNvbnNpZGVyZWQgZm9yIHJlc2lkdWFsaXNhdGlvbiwgb3IgdGhlIGNyb3NzLXNlY3Rpb25hbCBuYXR1cmUgb2Ygb3VyIG11bHRpcGxlIG1lZGlhdGlvbiB0ZXN0cyAqKihTdXBwbGVtZW50YXJ5IG5vdGUpKiouICANCg0KDQpgYGB7ciBGaWcgMSwgZGV2ID0gInBuZyIsIGRldi5hcmdzPWxpc3QoYmc9InRyYW5zcGFyZW50IiksIGZpZy5jYXA9IkZpZ3VyZSAxLiAgUGF0aCBkaWFncmFtIHNob3dpbmcgYXNzb2NpYXRpb24gYmV0d2VlbiBDbG96YXBpbmUgRG9zZSBhbmQgTG93ZXN0IEFic29sdXRlIE5ldXRyb3BoaWwgQ291bnQgd2l0aCBQbGFzbWEgQ2xvemFwaW5lIGNvbmNlbnRyYXRpb24gYW5kIFBsYXNtYSBOb3JjbG96YXBpbmUgY29uY2VudHJhdGlvbiBhcyBtZWRpYXRvcnMuIFBsb3QgZWRnZXMgYXJlIGxhYmVsbGVkIHdpdGggc3RhbmRhcmRpc2VkIHJlZ3Jlc3Npb24gY29lZmZpY2llbnRzLiBWYXJpYWJsZXMgaW5jbHVkZWQgaW4gU3RydWN0dXJhbCBFcXVhdGlvbiBNb2RlbCBhcmUgcmVzaWR1YWxpc2VkIHZlcnNpb25zIG9mIHBhcmVudCBtZWFzdXJlcy4gQXNzb2NpYXRpb25zIGJldHdlZW4gbW9kZWwgdmFyaWFibGVzIGFyZSBzaG93biBpbiBibHVlLCB3aGVyZWFzIHRoZSBvdmVyYWxsIGRpcmVjdCBhbmQgaW5kaXJlY3QgcGF0aHMgYXJlIHNob3duIGluIGJsYWNrLiBNID0gTWVkaWF0b3IuICogcDwwLjA1ICAgKiogcDwwLjAxICAgKioqIHA8MC4wMDEifQ0Ka25pdHI6OmluY2x1ZGVfZ3JhcGhpY3MoIkZpZzEucG5nIikNCmBgYA0KDQo8YnI+DQo8YnI+DQo8YnI+DQo8YnI+DQoNCiMjIDxzdHJvbmc+IERpc2N1c3Npb24gPC9zdHJvbmc+DQoNCiMjIyBEaXNjdXNzaW9uDQoNCiMjIyMgS2V5IEZpbmRpbmdzDQpUaGUgcmVzdWx0cyBvZiB0aGUgcHJlc2VudCBzdHVkeSBwcm92aWRlIGV2aWRlbmNlIGZvciBhc3NvY2lhdGlvbnMgYmV0d2VlbiBib3RoIHBoYXJtYWNva2luZXRpYyBhbmQgZ2VuZXRpYyB2YXJpYWJsZXMgd2l0aCBuZXV0cm9waGlsIGNvdW50IGluIHRoZSBDTE9aVUszIHNhbXBsZS4gRGFpbHkgY2xvemFwaW5lIGRvc2Ugd2FzIHBvc2l0aXZlbHkgYXNzb2NpYXRlZCB3aXRoIEFOQywgYW5kIGFwcHJveGltYXRlbHkgYSB0aGlyZCBvZiBpdHMgb3ZlcmFsbCBpbXBhY3Qgd2FzIG1lZGlhdGVkIGJ5IHBsYXNtYSBjbG96YXBpbmUgYW5kIG5vcmNsb3phcGluZSBsZXZlbHMuIFdlIGFsc28gb2JzZXJ2ZWQgb3Bwb3NpbmcgZWZmZWN0cyBvZiBwbGFzbWEgY2xvemFwaW5lIGFuZCBub3JjbG96YXBpbmUgY29uY2VudHJhdGlvbnMgb24gQU5DLCB3aXRoIHBsYXNtYSBjbG96YXBpbmUgbGV2ZWxzIGludmVyc2VseSBhc3NvY2lhdGVkLCBhbmQgcGxhc21hIG5vcmNsb3phcGluZSBsZXZlbHMgcG9zaXRpdmVseSBhc3NvY2lhdGVkIHdpdGggbmV1dHJvcGhpbCBjb3VudHMuIEZpbmFsbHksIHdlIGZvdW5kIGV2aWRlbmNlIHRoYXQgYm90aCBDWVAxQTIgYWN0aXZpdHkgc2NvcmUgYW5kIHRoZSBEdWZmeS1udWxsIGdlbm90eXBlIHdlcmUgYXNzb2NpYXRlZCB3aXRoIEFOQy4NCg0KVGhlIGRpcmVjdCwgcG9zaXRpdmUgYXNzb2NpYXRpb24gYmV0d2VlbiBjbG96YXBpbmUgZG9zZSBhbmQgQU5DIGFjcm9zcyBvdXIgYW5hbHlzZXMgaXMgYm90aCBub3ZlbCBhbmQgdW5leHBlY3RlZCwgZ2l2ZW4gdGhhdCBwYXN0IHJlc2VhcmNoIGhhcyBmb3VuZCBjbG96YXBpbmUgZG9zZSB0byBiZSBhIHBvb3IgcHJlZGljdG9yIG9mIEFOQ14xNywzNF4uIEZ1cnRoZXJtb3JlLCB0aGUgZGlyZWN0aW9uIG9mIHRoZSBlZmZlY3QgaXMgaW5jb25zaXN0ZW50IHdpdGggZXhwZWN0YXRpb25zLCBnaXZlbiB0aGF0IGNsb3phcGluZSBpcyBiZWxpZXZlZCB0byBpbmR1Y2UgbmV1dHJvcGVuaWEgb3IgYWdyYW51bG9jeXRvc2lzXjM1Xi4gVGhpcyBwb3NpdGl2ZSByZWxhdGlvbnNoaXAgY291bGQgcmVmbGVjdCBhbiBpbW11bmUgcmVzcG9uc2UgdG8gY2xvemFwaW5lIHJlc3VsdGluZyBpbiBlbGV2YXRlZCBuZXV0cm9waGlsIGNvdW50cywgYXMgcmVwb3J0ZWQgaW4gcmF0c14zNl4gYW5kIGh1bWFuc14zN14uIEZ1cnRoZXIgd29yayBoYXMgc2hvd24gdGhhdCBhbiBpbmNyZWFzZSBpbiBpbW1hdHVyZSBuZXV0cm9waGlscyBtYXkgb2NjdXIgYXMgcGFydCBvZiB0aGlzIGltbXVuZSByZXNwb25zZV4zOF4sIHdoaWNoIGNvdWxkIHJlc3VsdCBpbiByYWlzZWQgQU5DLiBBbHRlcm5hdGl2ZWx5LCB0aGUgcG9zaXRpdmUgYXNzb2NpYXRpb24gbWF5IHJlcHJlc2VudCByZXZlcnNlIGNhdXNhdGlvbiwgdGhyb3VnaCBjbGluaWNpYW5zIGFsdGVyaW5nIGNsb3phcGluZSBwcmVzY3JpcHRpb25zIGluIHJlc3BvbnNlIHRvIHRoZSBmdWxsIGJsb29kIGNvdW50IHJlc3VsdHMgaW4gd2F5cyB0aGF0IGFyZSBub3QgZXhwbGljaXRseSBlbmRvcnNlZCBieSB0cmVhdG1lbnQgZ3VpZGVsaW5lcy4gRm9yIGV4YW1wbGUsIHNvbWUgY2xpbmljaWFucyBtaWdodCBhaW0gdG8gY291bnRlcmFjdCBhIHBhdGllbnTigJlzIGxvdyBuZXV0cm9waGlsIGxldmVscyBieSByZWR1Y2luZyBkYWlseSBjbG96YXBpbmUgZG9zZSBpbiBob3BlcyBvZiBhdm9pZGluZyBkaXNjb250aW51YXRpb24uIEFsdGVybmF0aXZlbHksIHRoZXkgbWlnaHQgYmVjb21lIHJlbHVjdGFudCB0byBpbmNyZWFzZSBjbG96YXBpbmUgZG9zZSBkdWUgdG8gZmVhciBvZiBwcm9tcHRpbmcgZnVydGhlciBuZXV0cm9waGlsIGxvc3MuIA0KDQpUaGUgYXNzb2NpYXRpb25zIGJldHdlZW4gcGxhc21hIGNsb3phcGluZSBhbmQgbm9yY2xvemFwaW5lIGxldmVscyB3aXRoIEFOQyBhcmUgY29uc2lzdGVudCB3aXRoIHBhc3QgcmVzZWFyY2heMTXigJMxN14uIFRoaXMgd29yayBjYW5ub3QgZmlybWx5IGVzdGFibGlzaCB3aGljaCBhc3BlY3Qgb2YgY2xvemFwaW5lIHVzZSBlbmdlbmRlcnMgbmV1dHJvcGhpbCBsb3NzIGFzIHdlIGhhdmUgbm90IHRlc3RlZCB0aGUgZnVsbCByYW5nZSBvZiBzZWNvbmRhcnkgYW5kIHRlcnRpYXJ5IG1ldGFib2xpdGVzIG9mIHRoaXMgZHJ1ZyAoc3VjaCBhcyBOLW94aWRlIG9yIE4tZ2x1Y3Vyb25pZGVzKSwgc29tZSBvZiB3aGljaCBhcmUga25vd24gdG8gaGF2ZSByZWFjdGl2ZSBwcm9wZXJ0aWVzXjM5Xi4gSG93ZXZlciwgdGFrZW4gdG9nZXRoZXIgdGhlc2UgcmVzdWx0cyBzdWdnZXN0IHRoYXQgaW5kaXZpZHVhbHMgd2l0aCBoaWdoIGNsb3phcGluZSBsZXZlbHMgbWF5IGJlIHByb25lIHRvIGRpc3BsYXlpbmcgbG93IEFOQywgYW5kIHRoYXQgdGhlIHBsYXNtYSBub3JjbG96YXBpbmUgY29uY2VudHJhdGlvbiBpcyB1bmxpa2VseSB0byByZWZsZWN0IHRoZSB0b3hpYyBjb21wb25lbnQgb2YgdGhpcyBwcm9jZXNzLg0KDQpUaGUgcHJlc2VudCBzdHVkeSBhbHNvIGV4cGxvcmVkIHRoZSBpbXBhY3Qgb2YgYSB3ZWxsLWVzdGFibGlzaGVkIHBoYXJtYWNvZ2Vub21pYyB2YXJpYWJsZSwgQ1lQMUEyIGVuenltZSBhY3Rpdml0eSBhcyBpbmZlcnJlZCBmcm9tIGNsYXNzaWMgc3RhciBhbGxlbGUgY2FsbGluZy4gV2Ugb2JzZXJ2ZWQgYSBwb3NpdGl2ZSBhc3NvY2lhdGlvbiBiZXR3ZWVuIHRoZSBDWVAxQTIgYWN0aXZpdHkgc2NvcmUgYW5kIEFOQywgaW4gd2hpY2ggaW5jcmVhc2VkIGVuenltZSBhY3Rpdml0eSBpcyBhc3NvY2lhdGVkIHdpdGggZ3JlYXRlciBuZXV0cm9waGlsIGNvdW50cyBvciwgY29udmVyc2VseSwgcG9vciBtZXRhYm9saXNtIGlzIGFzc29jaWF0ZWQgd2l0aCBsb3dlciBBTkMuIFRoaXMgaXMgY29uc2lzdGVudCB3aXRoIGN1cnJlbnQga25vd2xlZGdlIGFib3V0IGNsb3phcGluZeKAmXMgbWV0YWJvbGljIHBhdGh3YXkuIEJvdGggQ1lQMUEyIGFuZCBDWVAzQTQgYXJlIGludm9sdmVkIGluIHRoZSBtZXRhYm9saXNtIG9mIGNsb3phcGluZSwgZWl0aGVyIHByb2R1Y2luZyBub3JjbG96YXBpbmUgb3IgdG8gYSBsZXNzZXIgZXh0ZW50LCBjbG96YXBpbmUtTi1veGlkZV4yM14uIFRoZXJlZm9yZSwgaW5jcmVhc2VkIENZUDFBMiBhY3Rpdml0eSBzaG91bGQgcmVzdWx0IGluIHRoZSBmYXN0ZXIgY29udmVyc2lvbiBvZiBjbG96YXBpbmUgdG8gbm9yY2xvemFwaW5lLCByZWR1Y2luZyB0aGUgcG90ZW50aWFsbHkgdG94aWMgaW1wYWN0IG9mIG90aGVyIG1ldGFib2xpdGVzIChpbmNsdWRpbmcgY2xvemFwaW5lIGl0c2VsZikgb24gbmV1dHJvcGhpbCBjb3VudHMuIFRodXMsIHdlIHByb3ZpZGUgcHJlbGltaW5hcnkgZXZpZGVuY2UgdGhhdCBnZW5ldGljYWxseS1pbmZlcnJlZCBlbnp5bWUgYWN0aXZpdHkgbWF5IGhhdmUgdXRpbGl0eSBmb3IgcHJlZGljdGluZyBuZXV0cm9waGlsIGNvdW50cyBpbiBhIG5vbi1uZXV0cm9wZW5pYywgY2xvemFwaW5lLXVzaW5nIHBvcHVsYXRpb24uIEZ1dHVyZSByZXNlYXJjaCBzaG91bGQgYmUgcGVyZm9ybWVkIGFjcm9zcyBkaWZmZXJlbnQgc2FtcGxlcyB0byBhc2NlcnRhaW4gdGhlIHJvYnVzdG5lc3Mgb2YgdGhlc2UgcmVzdWx0cywgYW5kIGZvbGxvd2luZyB0aGlzLCBjb3VsZCBiZSBleHRlbmRlZCB0byBleHBsb3JlIG90aGVyIGVuenltZXMgaW52b2x2ZWQgaW4gY2xvemFwaW5lIG1ldGFib2xpc20uIEl0IHdvdWxkIGFsc28gYmUgb2YgaW50ZXJlc3QgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgc2ltaWxhciBhc3NvY2lhdGlvbnMgb2NjdXIgaW4gcGF0aWVudHMgd2l0aCBsb3cgbmV1dHJvcGhpbCBjb3VudHMgaW5kaWNhdGl2ZSBvZiBuZXV0cm9wZW5pYSBhbmQgYWdyYW51bG9jeXRvc2lzLiANCg0KSW4gY29udHJhc3QgdG8gcHJldmlvdXMgd29ya14xN14sIG5vbmUgb2YgdGhlIGluY2x1ZGVkIHBoYXJtYWNvZ2Vub21pYyBTTlBzIHdlcmUgYXNzb2NpYXRlZCB3aXRoIEFOQy4gV2hpbGUgd2UgY2F1dGlvbiB0aGlzIGNvdWxkIGJlIHBhcnRseSBkdWUgdG8gdGhlIGxpbWl0ZWQgc2l6ZSBvZiB0aGUgc2FtcGxlIHdpdGggZ2VuZXRpYyBkYXRhIChOID0gNTIzKSwgaXQgZG9lcyByZWluZm9yY2UgdGhlIG5lZWQgZm9yIG1vcmUgZ2Vub21pYyBzdHVkaWVzIHRvIGJldHRlciB1bmRlcnN0YW5kIHRoZSBwb3NzaWJsZSBpbXBhY3Qgb2YgdGhlc2UgdmFyaWFudHMgb24gbmV1dHJvcGhpbCBjb3VudHMgaW4gY2xvemFwaW5lIHVzZXJzLiBGdXJ0aGVybW9yZSwgbmVpdGhlciB0aGUgUEdTIGZvciBjbG96YXBpbmUgYW5kIG5vcmNsb3phcGluZSBtZXRhYm9saXNtIG5vciB0aGUgYXNzZXNzZWQgSExBIGdlbm90eXBlcyB3ZXJlIHNpZ25pZmljYW50bHkgYXNzb2NpYXRlZCB3aXRoIEFOQy4gSG93ZXZlciwgYmVmb3JlIGNvcnJlY3Rpb24gZm9yIG11bHRpcGxlIGNvbXBhcmlzb25zIHNldmVyYWwgSExBIGFsbGVsZXMgKGkuZS4sICpEUkIxIDE2OjAxKiwgKkRSQjEgMDQ6MDQqLCAqRFJCMSAwMTowMyopIHdlcmUgbm9taW5hbGx5IHNpZ25pZmljYW50LiBXaGlsZSBpbmNyZWFzZWQgZnJlcXVlbmN5IG9mICpITEEtRFJCMSAxNjowMSogaGFzIGJlZW4gcHJldmlvdXNseSBhc3NvY2lhdGVkIHdpdGggY2xvemFwaW5lLWluZHVjZWQgYWdyYW51bG9jeXRvc2lzIGNhc2VzXjQwXiwgaXQgaGFzIG5vdCB5ZXQgYmVlbiBsaW5rZWQgdG8gbmV1dHJvcGhpbCBsZXZlbHMgaW4gYSBub24tbmV1dHJvcGVuaWMgcG9wdWxhdGlvbi4gVGhlIG90aGVyIG5vbWluYWxseSBhc3NvY2lhdGVkIGFsbGVsZXMgaGF2ZSBub3QgYmVlbiBpbXBsaWNhdGVkIGluIGNsb3phcGluZS1pbmR1Y2VkIG5ldXRyb3BoaWwgbG9zcyBidXQgZG8gcHJvdmlkZSBkaXJlY3Rpb24gZm9yIGZ1cnRoZXIgd29yayBpbnZlc3RpZ2F0aW5nIHRoZSBpbXBhY3Qgb2YgdGhpcyBsb2N1cyBvbiBuZXV0cm9waGlsIGxldmVscyBpbiBjbG96YXBpbmUgdXNlcnMuIA0KDQpGaW5hbGx5LCBhcyBleHBlY3RlZCBmcm9tIHByZXZpb3VzIHdvcmteMjVeLCBhIGdlbmV0aWMgcHJlZGljdG9yIGFzc29jaWF0ZWQgd2l0aCBsb3dlciBub24tcGF0aG9sb2dpY2FsIGJhc2VsaW5lIG5ldXRyb3BoaWwgY291bnRzLCB0aGUgRHVmZnktTnVsbCBnZW5vdHlwZSwgd2FzIG5lZ2F0aXZlbHkgYXNzb2NpYXRlZCB3aXRoIEFOQy4gVGhpcyBpcyBjb25zaXN0ZW50IHdpdGggb2JzZXJ2YXRpb25zIHRoYXQgdGhlIGdlbm90eXBlIGlzIGFzc29jaWF0ZWQgd2l0aCByZWR1Y2VkIG5vbi1wYXRob2xvZ2ljYWwgbmV1dHJvcGhpbCBjb3VudHNeMjVeLiBUaGlzIGdlbm90eXBlIGlzIG1vc3QgY29tbW9uIGluIGluZGl2aWR1YWxzIG9mIEFmcmljYW4gYW5jZXN0cmllcyBidXQgbWF5IGFsc28gYmUgcHJlc2VudCBpbiB0aG9zZSBvZiBNaWRkbGUgRWFzdGVybiBhbmQgQXNpYW4gYW5jZXN0cmllcyBhcyBpdCBjb25mZXJzIHJlc2lzdGFuY2UgdG8gbWFsYXJpYV40MV4uIEhvd2V2ZXIsIG91ciB3b3JrIGNvbmZpcm1zIHRoYXQgdGhlIGluZmx1ZW5jZSBvZiB0aGlzIGdlbm90eXBlIG9uIEFOQyBpcyBhbHNvIGFwcGFyZW50IGluIGEgc2FtcGxlIG9mIHBlb3BsZSB3aXRoIHByaW1hcmlseSBFdXJvcGVhbiBhbmNlc3RyaWVzLiAgVGhpcyBzdXBwb3J0cyB0aGUgbm90aW9uIHRoYXQgdGVzdGluZyBwYXRpZW50cyBmb3IgdGhpcyBnZW5vdHlwZSBtaWdodCBiZSBtb3JlIGhlbHBmdWwgaW4gaW50ZXJwcmV0aW5nIHRoZWlyIGJsb29kIG1vbml0b3JpbmcgYXNzYXlzIHRoYW4gc2ltcGx5IGNvbnNpZGVyaW5nIGV0aG5pY2l0eSBhcyBhIGRyaXZlciBvZiBkaWZmZXJlbmNlcyBpbiBBTkNeNDJeLiBTdWNoIGdlbmV0aWMgdGVzdGluZyBjb3VsZCBpbmNyZWFzZSBjbGluaWNpYW4gY29uZmlkZW5jZSB3aGVuIHByZXNjcmliaW5nIGNsb3phcGluZSB0byBwZW9wbGUgb2YgYW5jZXN0cmllcyB3aGVyZSB0aGlzIGdlbm90eXBlIGlzIGNvbW1vbiBhbmQgdGh1cyBoZWxwIHRvIGNvbWJhdCAgZGlzcGFyaXRpZXMgaW4gY2xvemFwaW5lIHVzZSBhbmQgcHJlc2NyaXB0aW9uIGFuZCB3aWRlbiBhY2Nlc3MgdG8gdGhpcyBtZWRpY2F0aW9uXjQzXi4gDQoNCjxicj4NCg0KIyMjIyBTdHJlbmd0aHMgYW5kIFdlYWtuZXNzZXMNCg0KSW4gdGhlIGNvbnRleHQgb2YgcmVzZWFyY2ggb24gdGhlIHBoYXJtYWNvZ2Vub21pY3Mgb2YgdHJlYXRtZW50LXJlc2lzdGFudCBzY2hpem9waHJlbmlhLCBDTE9aVUszIGlzIGEgcmVsYXRpdmVseSBsYXJnZSBzYW1wbGUgbGlua2VkIHRvIGFuIGV4dGVuc2l2ZSBsb25naXR1ZGluYWwgYmxvb2QgbW9uaXRvcmluZyBkYXRhc2V0LiBJdCBpcyB0aGVyZWZvcmUgYmV0dGVyIHBvd2VyZWQgdGhhbiBtb3N0IHByZXZpb3VzIHN0dWRpZXMgdG8gYXNzZXNzIHRoZSByZWxhdGlvbnNoaXBzIGJldHdlZW4gY2xvemFwaW5lIGRvc2UgYW5kIG1ldGFib2xpdGVzIG9uIEFOQy4gRGF0YSBhdmFpbGFiaWxpdHkgYWxzbyBhbGxvd2VkIHVzIHRvIG1lcmdlIGFuZCBhbmFseXNlIEZCQyBhbmQgcGhhcm1hY29raW5ldGljIGFzc2F5cyB0YWtlbiBvbiB0aGUgc2FtZSBkYXksIHByb3ZpZGluZyBhIHByZWNpc2UgcmVsYXRpb25zaGlwIGJldHdlZW4gbmV1dHJvcGhpbCBjb3VudHMgYW5kIHBsYXNtYSBjbG96YXBpbmUgYW5kIG5vcmNsb3phcGluZSBsZXZlbHMuIFRvIG91ciBrbm93bGVkZ2UsIHRoaXMgaXMgYWxzbyB0aGUgZmlyc3Qgd29yayB0byBlc3RhYmxpc2ggYXNzb2NpYXRpb25zIGJldHdlZW4gcGhhcm1hY29nZW5vbWljcy1pbmZlcnJlZCBDWVAxQTIgYWN0aXZpdHkgd2l0aCBuZXV0cm9waGlsIGNvdW50cyBpbiBjbG96YXBpbmUgdXNlcnMuIA0KDQpBIGxpbWl0YXRpb24gb2YgdGhlIHByZXNlbnQgd29yayBpcyB0aGF0IHRoZSBDTE9aVUszIHNhbXBsZSB3YXMgbm90IGZ1bGx5IGdlbm90eXBlZC4gTmV2ZXJ0aGVsZXNzLCB0aGUga2V5IHBoYXJtYWNva2luZXRpYyBhc3NvY2lhdGlvbnMgb2JzZXJ2ZWQgaW4gdGhlIExNTSByZW1haW4gd2hlbiBleHBsb3JlZCBpbiB0aGUgc3Vic2V0IG9mIHRoZSBnZW5vbWljYWxseSBpbmZvcm1hdGl2ZSBzYW1wbGUgKCoqU3VwcGxlbWVudGFyeSBOb3RlKiopLiBGdXJ0aGVybW9yZSwgdGhlIHBhcnRpY2lwYW50cyBpbiB0aGUgQ0xPWlVLMyBkYXRhc2V0IHdlcmUgcHJpbWFyaWx5IG9mIEV1cm9wZWFuIGFuY2VzdHJ5IGxpbWl0aW5nIHRoZSBleHRlbnQgdG8gd2hpY2ggdGhlIGZpbmRpbmdzIGNhbiBiZSBnZW5lcmFsaXNlZCB0byBvdGhlciBwb3B1bGF0aW9ucy4gT3VyIGZpbmRpbmdzIHRoZXJlZm9yZSBuZWVkIHRvIGJlIHRlc3RlZCBpbiBub24tRXVyb3BlYW4gaW5kaXZpZHVhbHMsIGFzIGV4ZW1wbGlmaWVkIGJ5IHRoZSBzdHJlbmd0aCBvZiBrbm93biBhbmNlc3RyeS1zcGVjaWZpYyBnZW5ldGljIGVmZmVjdHMgb24gQU5DXjI1Xi4gDQoNCldlIHdlcmUgdW5hYmxlIHRvIGFjY291bnQgZm9yIHRoZSBlZmZlY3RzIG9mIGNvbmNvbWl0YW50IG1lZGljYXRpb24gKGUuZy4sIG9yYWwgY29udHJhY2VwdGl2ZXMsIHNvbWUgYW50aWRlcHJlc3NhbnRzKSwgcGh5c2lvbG9neSAoZS5nLiB3ZWlnaHQsIEJNSSksIG9yIGxpZmVzdHlsZSBmYWN0b3JzIChlLmcuLCBjYWZmZWluZSBjb25zdW1wdGlvbiwgY2lnYXJldHRlIHNtb2tpbmcpIHRoYXQgY2FuIGltcGFjdCBkcnVnIGNsZWFyYW5jZV40NCw0NV4uIEZvciBleGFtcGxlLCB3aGlsZSB0aGVyZSBhcmUgY3VycmVudGx5IG5vIGd1aWRlbGluZXMgcmVsYXRpbmcgdG8gY2xvemFwaW5lIGRvc2UgYW5kIHBhdGllbnQgd2VpZ2h0IGluIHRoZSBVS140Nl4sIHNvbWUgaGF2ZSBzdWdnZXN0ZWQgdGhhdCBvYmVzaXR5IHNob3VsZCBiZSBjb25zaWRlcmVkIGR1cmluZyBjbG96YXBpbmUgdGl0cmF0aW9uXjQ3XiBhbmQgdGhhdCBvYmVzZSBpbmRpdmlkdWFscyBtaWdodCBkaXNwbGF5IHNsb3dlciBjbG96YXBpbmUgY2xlYXJhbmNlXjQ4LDQ5Xi4gVGhlcmUgaXMgYWxzbyBzb21lIGV2aWRlbmNlIHRoYXQgY2lnYXJldHRlIGFuZCBjYWZmZWluZSBjb25zdW1wdGlvbiwgaGFiaXRzIHRoYXQgYm90aCBpbmZsdWVuY2UgYW5kIGFyZSBpbmZsdWVuY2VkIGJ5IENZUDFBMiBmdW5jdGlvbiwgY2FuIGJlIGFzc29jaWF0ZWQgd2l0aCB3aGl0ZSBibG9vZCBjZWxsIGNvdW50c140NCw1MOKAkzUzXi4gVW5mb3J0dW5hdGVseSwgaW5mb3JtYXRpb24gYWJvdXQgdGhlc2UgdmFyaWFibGVzIHdhcyBub3QgYXZhaWxhYmxlIGluIENMT1pVSzMuIFRoZXJlZm9yZSwgb3VyIHN0dWR5IG5lZWRzIHJlcGxpY2F0aW9uIGluIGFuIGluZGVwZW5kZW50IHNhbXBsZSB3aGVyZSB0aGUgcG90ZW50aWFsIG9mIGFsbCB0aGVzZSBmYWN0b3JzIHRvIGVpdGhlciBpbXBhY3QgY2xvemFwaW5lIG1ldGFib2xpc20gdmlhIHBoZW5vY29udmVyc2lvbiBvciBhY3QgYXMgYSBjb25mb3VuZGVyIGluIG91ciBtb2RlbHMgY2FuIGJlIGV4cGxpY2l0bHkgdGVzdGVkLiAgDQoNCg0KDQo8YnI+DQoNCiMjIyMgSW1wbGljYXRpb25zDQoNCkNsb3phcGluZSB1c2UgaXMgYXNzb2NpYXRlZCB3aXRoIGRlY3JlYXNlZCBhbGwtY2F1c2UgbW9ydGFsaXR5IGNvbXBhcmVkIHRvIG90aGVyIGNvbW1vbmx5IHVzZWQgYW50aXBzeWNob3RpYyBkcnVnc141NF47IGhvd2V2ZXIgdW5leHBlY3RlZCBkZWF0aHMgYnkgdmFyaW91cyBjYXVzZXMgcmVtYWluIGEgcmFyZSBhbmQgY3VycmVudGx5IHVucHJlZGljdGFibGUgZmVhdHVyZSBvZiB0aGUgbWVkaWNhdGlvbl41NV4uIFdoaWxlIEFOQyBpcyBub3QgbmVjZXNzYXJpbHkgcmVsYXRlZCB0byBtb3J0YWxpdHkgaXRzZWxmLCBhIHByb2dyZXNzaXZlIGRlcGxldGlvbiBvZiBpbW11bmUgY2VsbHMgaGFzIGJlZW4gYXJndWVkIHRvIGJlIGEgcHJpbWFyeSBjb250cmlidXRvciB0byB0aGUgc3VzY2VwdGliaWxpdHkgdG8gaW5mZWN0aW91cyBkaXNlYXNlIGV4aGliaXRlZCBieSBjbG96YXBpbmUgdXNlcnNeNTYsNTdeLiBUaGUgcHJlc2VudCB3b3JrIGZvdW5kIHNldmVyYWwgYXNzb2NpYXRpb25zIGJldHdlZW4gcGhhcm1hY29raW5ldGljIGFuZCBnZW5ldGljIHZhcmlhYmxlcyB3aXRoIEFOQyBpbiBhIFVLLWJhc2VkIHNhbXBsZSBvZiBjbG96YXBpbmUgdXNlcnMgd2l0aCBubyBkZXRlY3RhYmxlIGltbXVuZS1yZWxhdGVkIEFEUnMuIE91ciByZXN1bHRzIGNvdWxkIGhhdmUgY2xpbmljYWwgYXBwbGljYWJpbGl0eSBmcm9tIHRoZSBwZXJzcGVjdGl2ZSBvZiB0cmVhdG1lbnQgbWFuYWdlbWVudCwgc3VwcG9ydGluZyB0aGUgdmlldyB0aGF0IGNsb3phcGluZSBkb3NlIG1pZ2h0IGJlY29tZSBhIG1vZGlmaWFibGUgcmlzayBmYWN0b3IgaW4gY2FzZXMgd2l0aCBhYm5vcm1hbCBuZXV0cm9waGlsIGNvdW50cy4gV2hpbGUgYWdyYW51bG9jeXRvc2lzIGFuZCBzZXZlcmUgbmV1dHJvcGVuaWEgYXJlIGNvbnNpZGVyZWQgZG9zZS1pbmRlcGVuZGVudCwgc3ViY2xpbmljYWwgdmFyaWF0aW9uIGluIEFOQyBtaWdodCByZXNwb25kIHRvIGRvc2UgYWx0ZXJhdGlvbnMuIENsb3phcGluZSBtZXRhYm9saXNtIGlzIGFsc28gYSBmYWN0b3IgdG8gY29uc2lkZXIgYXMgcGxhc21hIGNsb3phcGluZSBhbmQgbm9yY2xvemFwaW5lIGxldmVscyB3ZXJlIGFsc28gc2lnbmlmaWNhbnRseSBhc3NvY2lhdGVkIHdpdGggQU5DIGluIG91ciBzYW1wbGUuIEhvd2V2ZXIsIGxhcmdlIGludGVyLSBhbmQgaW50cmEtaW5kaXZpZHVhbCBkaWZmZXJlbmNlcyBpbiBsZXZlbHMgYXQgZml4ZWQgZG9zZXMgbWlnaHQgbWFrZSBpdCBjb21wbGljYXRlZCB0byBpbmZsdWVuY2UgdGhlc2UgdmFyaWFibGVzIGluIHByYWN0aWNlXjU4XiwgdGhvdWdoIHRoZXkgc3RpbGwgY291bGQgZmluZCBhcHBsaWNhYmlsaXR5IGZvciB0aGUgaWRlbnRpZmljYXRpb24gb2YgcGF0aWVudHMgYXQgcmlzayBvZiBleHRyZW1lIEFOQ3MuIA0KDQpUaGlzIHdvcmsgYWRkcyB0byBhIGJvZHkgb2YgcmVzZWFyY2ggYWltaW5nIHRvd2FyZHMgYSBjb21wbGV0ZSB1bmRlcnN0YW5kaW5nIG9mIHRoZSBmYWN0b3JzIHRoYXQgaW5mbHVlbmNlIEFOQyBpbiBjbG96YXBpbmUgdXNlcnMsIHdoaWNoIGNvdWxkIGhhdmUgdmFsdWUgaW4gaW1wcm92aW5nIGFjY2VzcyB0byB0aGlzIGdvbGQtc3RhbmRhcmQgbWVkaWNhdGlvbi4gQ3VycmVudGx5LCB0aGVyZSBpcyByZWx1Y3RhbmNlIGFtb25nc3Qgc29tZSBjbGluaWNpYW5zIHRvIHByZXNjcmliZSBjbG96YXBpbmUgdG8gcGF0aWVudHMgd2l0aCBzY2hpem9waHJlbmlhLiBUaGlzIGlzIHByaW1hcmlseSBkdWUgdG8gdGhlIHJpc2sgb2YgbmV1dHJvcGVuaWEgYW5kIGFncmFudWxvY3l0b3NpcywgYW5kIHRoZSBhY2NvbXBhbnlpbmcgbmVlZCBmb3IgdGhlcmFwZXV0aWMgYmxvb2QgbW9uaXRvcmluZyB0byBlbnN1cmUgcGF0aWVudCBzYWZldHkuIFdoaWxlIGVmZmVjdGl2ZSBhdCByZWR1Y2luZyBkZWF0aHMgZnJvbSBjbG96YXBpbmUtaW5kdWNlZCBhZ3JhbnVsb2N5dG9zaXMgaW4gdGhlIFVLXjU5XiwgaGFlbWF0b2xvZ2ljYWwgbW9uaXRvcmluZyBpcyB0aW1lLWNvbnN1bWluZyBib3RoIGZyb20gdGhlIHBlcnNwZWN0aXZlIG9mIHRoZSBwYXRpZW50LCBhbmQgdGhlIGNsaW5pY2lhbi4gQXBwcm9wcmlhdGVseSBpbnRlcnByZXRpbmcgdGhlIGVmZmVjdHMgb2YgcGhhcm1hY29raW5ldGljIGFuZCBnZW5ldGljIHZhcmlhYmxlcyB0aGF0IGluZmx1ZW5jZSBuZXV0cm9waGlsIGxvc3MgbWlnaHQgYWxsb3cgdGhlIGRlc2lnbiBvZiBzdHJhdGlmaWNhdGlvbiBzdHJhdGVnaWVzIGZvciBjbG96YXBpbmUgdXNlcnMgYmFzZWQgb24gdGhlaXIgbGlrZWxpaG9vZCBvZiBpbW11bmUtcmVsYXRlZCBBRFJzLCB3aXRoIGFwcHJvcHJpYXRlIGFkanVzdG1lbnRzIG9mIHByZXNjcmlwdGlvbiBhbmQgbW9uaXRvcmluZy4gVGhpcyBjb3VsZCBhbHNvIGluZm9ybSBwcmV2ZW50YXRpdmUgaW50ZXJ2ZW50aW9ucyB0YXJnZXRpbmcgdGhvc2UgbW9zdCBsaWtlbHkgdG8gZXhwZXJpZW5jZSBuZXV0cm9waGlsIGxvc3MsIGFuZCBzdWJzZXF1ZW50IGltbXVuZSBkZWNsaW5lLCB3aGljaCBtYXkgaGVscCB0byBwcmV2ZW50IHNlcmlvdXMgaWxsbmVzcyBvdmVyIHRoZSBkdXJhdGlvbiBvZiBjbG96YXBpbmUgdXNlLiBTb21lIGV4YW1wbGVzIG9mIHRoaXMgbWlnaHQgaW5jbHVkZSBlbmNvdXJhZ2luZyBhdC1yaXNrIHBhdGllbnRzIHRvIHRha2UgdXAgb2ZmZXJzIG9mIHNlYXNvbmFsIHZhY2NpbmF0aW9ucywgcGFydGljdWxhcmx5IGdpdmVuIGV2aWRlbmNlIG9mIHJlZHVjZWQgdmFjY2luZSB1cHRha2UgaW4gcGVvcGxlIHdpdGggcHN5Y2hpYXRyaWMgZGlzb3JkZXJzXjYwXjsgdGVzdGluZyBtYXJrZXJzIG9mIGluZmxhbW1hdGlvbiBhbmQgYWRqdXN0aW5nIHRyZWF0bWVudCwgb3IgaW50cm9kdWNpbmcgZnVydGhlciBtaXRpZ2F0aW9ucyBhY2NvcmRpbmdseS4gS25vd2xlZGdlIG9mIHRoZXNlIHZhcmlhYmxlcyBjb3VsZCBhY3QgYXMgYW4gYWRkaXRpb25hbCBsYXllciBvZiBpbmZvcm1hdGlvbiB0byBndWlkZSBjbGluaWNhbCBkZWNpc2lvbi1tYWtpbmcgYW5kIHVsdGltYXRlbHkgaGVscCB0byB3aWRlbiBhY2Nlc3MgdG8gY2xvemFwaW5lIHZpYSBhIHR3by1wcm9uZ2VkIGFwcHJvYWNoOiBlbmhhbmNpbmcgc2FmZXR5IGZvciB0aG9zZSBhdCBoaWdoZXN0IHJpc2sgd2hpbGUgcmVkdWNpbmcgb2JzdGFjbGVzIHRvIHRyZWF0bWVudCB1c2UgZm9yIHRob3NlIGF0IGxvd2VzdCByaXNrLg0KDQo8YnI+DQoNCiMjIyMgQ29uY2x1c2lvbnMNCg0KSGVyZSwgd2Ugc2hvdyBkYWlseSBjbG96YXBpbmUgZG9zZSB3YXMgcG9zaXRpdmVseSBhc3NvY2lhdGVkIHdpdGggQU5DLCB3aXRoIGNsb3phcGluZSBwaGFybWFjb2tpbmV0aWNzIChpbmRleGVkIGJ5IGNsb3phcGluZSBhbmQgbm9yY2xvemFwaW5lIHBsYXNtYSBsZXZlbHMpIGFjY291bnRpbmcgZm9yIGEgdGhpcmQgb2YgdGhlIHRvdGFsIGVmZmVjdC4gT3VyIGFuYWx5c2lzIG9mIG11bHRpcGxlIHBoYXJtYWNva2luZXRpYyBhbmQgcGhhcm1hY29nZW5vbWljIHZhcmlhYmxlcyBzdXBwb3J0cyBhbmQgZXhwYW5kcyBvbiB0aGUgcmVzdWx0cyBmcm9tIHBhc3QgcmVzZWFyY2gsIHdoaWNoIGZvciBkZWNhZGVzIGhhcyBzdWdnZXN0ZWQgYW4gb3Bwb3NpbmcgcmVsYXRpb25zaGlwIGJldHdlZW4gQU5DIGFuZCBwbGFzbWEgY2xvemFwaW5lIGFuZCBub3JjbG96YXBpbmUgbGV2ZWxzLiBXZSBidWlsZCBvbiB0aGlzIHRvIHNob3cgdGhhdCB0aGVzZSBlZmZlY3RzIGV4aXN0IGluIGEgc2FtcGxlIGluIHdoaWNoIGFib3V0IGEgdGhpcmQgb2YgdGhlIGluZGl2aWR1YWxzIHdlcmUgdGFraW5nIGNsb3phcGluZSBmb3Igb3ZlciBhIHllYXIsIGNvbW1vbmx5IGNvbnNpZGVyZWQgdG8gYmUgYXQgYSBsb3dlciByaXNrIG9mIGltbXVuZS1yZWxhdGVkIEFEUnMuDQoNClRoZSBwaGFybWFjb2tpbmV0aWMgYW5hbHlzaXMgd2FzIHN1cHBsZW1lbnRlZCBieSBnZW5ldGljIGNvdmFyaWF0ZXMsIG5vdGFibHkgYSBDWVAxQTIgYWN0aXZpdHkgc2NvcmUgaW5mZXJyZWQgZnJvbSBwaGFybWFjb2dlbm9taWMgc3RhciBhbGxlbGVzLiBDWVAxQTIgYWN0aXZpdHkgd2FzIHBvc2l0aXZlbHkgYXNzb2NpYXRlZCB3aXRoIEFOQzsgaG93ZXZlciwgbm8gYXNzb2NpYXRpb25zIHdlcmUgc2VlbiBiZXR3ZWVuIG5ldXRyb3BoaWwgY291bnRzIHdpdGggcGhhcm1hY29nZW5vbWljIFNOUHMgcHJldmlvdXNseSBhc3NvY2lhdGVkIHdpdGggY2xvemFwaW5lIG1ldGFib2xpc20uIEFkZGl0aW9uYWwgd29yayBpbiBsYXJnZXIsIG1vcmUgZ2VuZXRpY2FsbHkgZGl2ZXJzZSBzYW1wbGVzIGlzIHJlcXVpcmVkIHRvIGNsYXJpZnkgdGhlIHJvbGUgb2YgcGhhcm1hY29nZW5vbWljIHZhcmlhdGlvbiBpbiBjbG96YXBpbmUgbWV0YWJvbGlzbSwgYW5kIGl0cyBjYXBhY2l0eSB0byBpbmZsdWVuY2UgbmV1dHJvcGhpbCBsZXZlbHMgaW4gY2xvemFwaW5lIHVzZXJzLiBJbiBhbGwsIHRoaXMgd29yayBhZHZhbmNlcyBvdXIgdW5kZXJzdGFuZGluZyBvZiB0aGUgaW1wYWN0cyBvZiBjbG96YXBpbmUgdXNlIG9uIG5ldXRyb3BoaWwgY291bnRzLCB3aGljaCBpbiB0aGUgZnV0dXJlIG1heSBoZWxwIHRvIGltcHJvdmUgYWNjZXNzIHRvIGNsb3phcGluZSB2aWEgdGhlIGRldmVsb3BtZW50IG9mIHRhcmdldGVkIGludGVydmVudGlvbnMgYW5kIHBlcnNvbmFsaXNlZCBkcnVnIG1vbml0b3Jpbmcgc2NoZWR1bGVzIGJhc2VkIG9uIGluZGl2aWR1YWwgcmlzayBmYWN0b3JzLg0KDQoNCg0KPGJyPg0KPGJyPg0KPGJyPg0KPGJyPg0KDQojIyA8c3Ryb25nPiBSZWZlcmVuY2VzIDwvc3Ryb25nPg0KIyMjIFJlZmVyZW5jZXMgDQoNCjxicj4NCg0KMS4JS2FuZSwgSi4gTS4gZXQgYWwuIENsaW5pY2FsIEd1aWRhbmNlIG9uIHRoZSBJZGVudGlmaWNhdGlvbiBhbmQgTWFuYWdlbWVudCBvZiBUcmVhdG1lbnQtUmVzaXN0YW50IFNjaGl6b3BocmVuaWEuIEogQ2xpbiBQc3ljaGlhdHJ5IDgwLCAyNzgzICgyMDE5KS4NCg0KMi4JSG93ZXMsIE8uIEQuIGV0IGFsLiBUcmVhdG1lbnQtUmVzaXN0YW50IFNjaGl6b3BocmVuaWE6IFRyZWF0bWVudCBSZXNwb25zZSBhbmQgUmVzaXN0YW5jZSBpbiBQc3ljaG9zaXMgKFRSUklQKSBXb3JraW5nIEdyb3VwIENvbnNlbnN1cyBHdWlkZWxpbmVzIG9uIERpYWdub3NpcyBhbmQgVGVybWlub2xvZ3kuIEFKUCAxNzQsIDIxNuKAkzIyOSAoMjAxNykuDQoNCjMuCVdpY2nFhHNraSwgTS4gJiBXxJljbGV3aWN6LCBNLiBNLiBDbG96YXBpbmUtaW5kdWNlZCBhZ3JhbnVsb2N5dG9zaXMvZ3JhbnVsb2N5dG9wZW5pYTogbWVjaGFuaXNtcyBhbmQgbW9uaXRvcmluZy4gQ3VycmVudCBPcGluaW9uIGluIEhlbWF0b2xvZ3kgMjUsIDIy4oCTMjggKDIwMTgpLg0KDQo0LglUYXlsb3IsIEQuLCBWYWxsaWFuYXRvdSwgSy4sIFdoaXNrZXksIEUuLCBEemFoaW5pLCBPLiAmIE1hY0NhYmUsIEouIERpc3RpbmN0aXZlIHBhdHRlcm4gb2YgbmV1dHJvcGhpbCBjb3VudCBjaGFuZ2UgaW4gY2xvemFwaW5lLWFzc29jaWF0ZWQsIGxpZmUtdGhyZWF0ZW5pbmcgYWdyYW51bG9jeXRvc2lzLiBTY2hpem9waHIgOCwgMjEgKDIwMjIpLg0KDQo1LglQb25zZm9yZCwgTS4gSi4gZXQgYWwuIENsaW5pY2FsIGFuZCBsYWJvcmF0b3J5IGNoYXJhY3RlcmlzdGljcyBvZiBjbG96YXBpbmUtdHJlYXRlZCBwYXRpZW50cyB3aXRoIHNjaGl6b3BocmVuaWEgcmVmZXJyZWQgdG8gYSBuYXRpb25hbCBpbW11bm9kZWZpY2llbmN5IGNsaW5pYyByZXZlYWxzIGEgQi1jZWxsIHNpZ25hdHVyZSByZXNlbWJsaW5nIGNvbW1vbiB2YXJpYWJsZSBpbW11bm9kZWZpY2llbmN5IChDVklEKS4gSm91cm5hbCBvZiBDbGluaWNhbCBQYXRob2xvZ3kgNzMsIDU4N+KAkzU5MiAoMjAyMCkuDQoNCjYuCVRob3JuLCBDLiBGLiwgTcO8bGxlciwgRC4gSi4sIEFsdG1hbiwgUi4gQi4gJiBLbGVpbiwgVC4gRS4gUGhhcm1HS0IgU3VtbWFyeTogQ2xvemFwaW5lIFBhdGh3YXksIFBoYXJtYWNva2luZXRpY3MuIFBoYXJtYWNvZ2VuZXQgR2Vub21pY3MgMjgsIDIxNOKAkzIyMiAoMjAxOCkuDQoNCjcuCVJhamFnb3BhbCwgUy4gQ2xvemFwaW5lLCBhZ3JhbnVsb2N5dG9zaXMsIGFuZCBiZW5pZ24gZXRobmljIG5ldXRyb3BlbmlhLiBQb3N0Z3JhZHVhdGUgTWVkaWNhbCBKb3VybmFsIDgxLCA1NDXigJM1NDYgKDIwMDUpLg0KDQo4LglNw7x0emUsIFMuIGV0IGFsLiBNeWVsb3Blcm94aWRhc2UtZGVyaXZlZCBoeXBvY2hsb3JvdXMgYWNpZCBhbnRhZ29uaXplcyB0aGUgb3hpZGF0aXZlIHN0cmVzcy1tZWRpYXRlZCBhY3RpdmF0aW9uIG9mIGlyb24gcmVndWxhdG9yeSBwcm90ZWluIDEuIEogQmlvbCBDaGVtIDI3OCwgNDA1NDLigJM0MDU0OSAoMjAwMykuDQoNCjkuCUFyYXRhbmksIFkuIE15ZWxvcGVyb3hpZGFzZTogSXRzIHJvbGUgZm9yIGhvc3QgZGVmZW5zZSwgaW5mbGFtbWF0aW9uLCBhbmQgbmV1dHJvcGhpbCBmdW5jdGlvbi4gQXJjaGl2ZXMgb2YgQmlvY2hlbWlzdHJ5IGFuZCBCaW9waHlzaWNzIDY0MCwgNDfigJM1MiAoMjAxOCkuDQoNCjEwLglVZXRyZWNodCwgSi4sIFphaGlkLCBOLiwgVGVoaW0sIEEuLCBNaW0gRnUsIEouICYgUmFraGl0LCBTLiBTdHJ1Y3R1cmFsIGZlYXR1cmVzIGFzc29jaWF0ZWQgd2l0aCByZWFjdGl2ZSBtZXRhYm9saXRlIGZvcm1hdGlvbiBpbiBjbG96YXBpbmUgYW5hbG9ndWVzLiBDaGVtaWNvLUJpb2xvZ2ljYWwgSW50ZXJhY3Rpb25zIDEwNCwgMTE34oCTMTI5ICgxOTk3KS4NCg0KMTEuCUZyYW5jbywgUi4gJiBDaWRsb3dza2ksIEouIEEuIEFwb3B0b3NpcyBhbmQgZ2x1dGF0aGlvbmU6IGJleW9uZCBhbiBhbnRpb3hpZGFudC4gQ2VsbCBEZWF0aCBEaWZmZXIgMTYsIDEzMDPigJMxMzE0ICgyMDA5KS4NCg0KMTIuCVJhbWxpLCBGLiBGLiwgQWxpLCBBLiwgU3llZCBIYXNoaW0sIFMuIEEuLCBLYW1pc2FoLCBZLiAmIElicmFoaW0sIE4uIFJlZHVjdGlvbiBpbiBBYnNvbHV0ZSBOZXV0cm9waGlsIENvdW50cyBpbiBQYXRpZW50IG9uIENsb3phcGluZSBJbmZlY3RlZCB3aXRoIENPVklELTE5LiBJbnRlcm5hdGlvbmFsIEpvdXJuYWwgb2YgRW52aXJvbm1lbnRhbCBSZXNlYXJjaCBhbmQgUHVibGljIEhlYWx0aCAxOCwgMTEyODkgKDIwMjEpLg0KDQoxMy4JTmllbHNlbiwgSi4gZXQgYWwuIFdvcmxkd2lkZSBEaWZmZXJlbmNlcyBpbiBSZWd1bGF0aW9ucyBvZiBDbG96YXBpbmUgVXNlLiBDTlMgRHJ1Z3MgMzAsIDE0OeKAkzE2MSAoMjAxNikuDQoNCjE0LglPbG95ZWRlLCBFLiBldCBhbC4gV2hhdCBhcmUgdGhlIGJhcnJpZXJzIGFuZCBmYWNpbGl0YXRvcnMgb2YgY2xvemFwaW5lIHVzZSBpbiBlYXJseSBwc3ljaG9zaXM/IEEgc3VydmV5IG9mIFVLIGVhcmx5IGludGVydmVudGlvbiBjbGluaWNpYW5zLiBTY2hpem9waHIgOSwgMeKAkzcgKDIwMjMpLg0KDQoxNS4JU21pdGgsIFIuIEwuIGV0IGFsLiBDb3JyZWxhdGlvbiBCZXR3ZWVuIFNlcnVtIENvbmNlbnRyYXRpb25zIG9mIE4tRGVzbWV0aHlsY2xvemFwaW5lIGFuZCBHcmFudWxvY3l0ZSBMZXZlbHMgaW4gUGF0aWVudHMgd2l0aCBTY2hpem9waHJlbmlhOiBBIFJldHJvc3BlY3RpdmUgT2JzZXJ2YXRpb25hbCBTdHVkeS4gQ05TIERydWdzIDMxLCA5OTHigJM5OTcgKDIwMTcpLg0KDQoxNi4JVmFxdWVyby1CYWV6LCBNLiBldCBhbC4gQ2xvemFwaW5lIGFuZCBkZXNtZXRoeWxjbG96YXBpbmU6IGNvcnJlbGF0aW9uIHdpdGggbmV1dHJvcGhpbHMgYW5kIGxldWNvY3l0ZXMgY291bnRpbmcgaW4gTWV4aWNhbiBwYXRpZW50cyB3aXRoIHNjaGl6b3BocmVuaWEgfCBCTUMgUHN5Y2hpYXRyeSB8IEZ1bGwgVGV4dC4gQk1DIFBzeWNoaWF0cnkgMTksICgyMDE5KS4NCg0KMTcuCVdpbGxjb2NrcywgSS4gUi4gZXQgYWwuIENsb3phcGluZSBNZXRhYm9saXNtIGlzIEFzc29jaWF0ZWQgV2l0aCBBYnNvbHV0ZSBOZXV0cm9waGlsIENvdW50IGluIEluZGl2aWR1YWxzIFdpdGggVHJlYXRtZW50LVJlc2lzdGFudCBTY2hpem9waHJlbmlhLiBGcm9udCBQaGFybWFjb2wgMTIsIDY1ODczNCAoMjAyMSkuDQoNCjE4LglUYW4sIE0uIFMuIEEuIGV0IGFsLiBBIHN5c3RlbWF0aWMgcmV2aWV3IGFuZCBtZXRhLWFuYWx5c2lzIG9mIHRoZSBhc3NvY2lhdGlvbiBiZXR3ZWVuIGNsb3phcGluZSBhbmQgbm9yY2xvemFwaW5lIHNlcnVtIGxldmVscyBhbmQgcGVyaXBoZXJhbCBhZHZlcnNlIGRydWcgcmVhY3Rpb25zLiBQc3ljaG9waGFybWFjb2xvZ3kgMjM4LCA2MTXigJM2MzcgKDIwMjEpLg0KDQoxOS4JS2FwcGVsLCBELiBCLiBldCBhbC4gR2Vub21pYyBTdHJhdGlmaWNhdGlvbiBvZiBDbG96YXBpbmUgUHJlc2NyaXB0aW9uIFBhdHRlcm5zIFVzaW5nIFNjaGl6b3BocmVuaWEgUG9seWdlbmljIFNjb3Jlcy4gQmlvbG9naWNhbCBQc3ljaGlhdHJ5IDkzLCAxNDnigJMxNTYgKDIwMjMpLg0KDQoyMC4JUGFyZGnDsWFzLCBBLiBGLiBldCBhbC4gQ29tbW9uIHNjaGl6b3BocmVuaWEgYWxsZWxlcyBhcmUgZW5yaWNoZWQgaW4gbXV0YXRpb24taW50b2xlcmFudCBnZW5lcyBhbmQgaW4gcmVnaW9ucyB1bmRlciBzdHJvbmcgYmFja2dyb3VuZCBzZWxlY3Rpb24uIE5hdCBHZW5ldCA1MCwgMzgx4oCTMzg5ICgyMDE4KS4NCg0KMjEuCVBhcmRpw7FhcywgQS4gRi4gZXQgYWwuIFBoYXJtYWNva2luZXRpY3MgYW5kIHBoYXJtYWNvZ2Vub21pY3Mgb2YgY2xvemFwaW5lIGluIGFuIGFuY2VzdHJhbGx5IGRpdmVyc2Ugc2FtcGxlOiBhIGxvbmdpdHVkaW5hbCBhbmFseXNpcyBhbmQgZ2Vub21lLXdpZGUgYXNzb2NpYXRpb24gc3R1ZHkgdXNpbmcgVUsgY2xpbmljYWwgbW9uaXRvcmluZyBkYXRhLiBUaGUgTGFuY2V0IFBzeWNoaWF0cnkgMTAsIDIwOeKAkzIxOSAoMjAyMykuDQoNCjIyLglMZWUsIFMuLCBTaGluLCBKLi1ZLiwgS3dvbiwgTi4tSi4sIEtpbSwgQy4gJiBTZW8sIEouLVMuIENsaW5QaGFybVNlcTogQSB0YXJnZXRlZCBzZXF1ZW5jaW5nIHBhbmVsIGZvciBjbGluaWNhbCBwaGFybWFjb2dlbmV0aWNzIGltcGxlbWVudGF0aW9uLiBQTE9TIE9ORSAxNywgZTAyNzIxMjkgKDIwMjIpLg0KDQoyMy4JUGFyZGnDsWFzLCBBLiBGLiBldCBhbC4gUGhhcm1hY29nZW5vbWljIFZhcmlhbnRzIGFuZCBEcnVnIEludGVyYWN0aW9ucyBJZGVudGlmaWVkIFRocm91Z2ggdGhlIEdlbmV0aWMgQW5hbHlzaXMgb2YgQ2xvemFwaW5lIE1ldGFib2xpc20uIEFKUCAxNzYsIDQ3N+KAkzQ4NiAoMjAxOSkuDQoNCjI0LglDaG9pLCBTLiBXLiAmIE/igJlSZWlsbHksIFAuIEYuIFBSU2ljZS0yOiBQb2x5Z2VuaWMgUmlzayBTY29yZSBzb2Z0d2FyZSBmb3IgYmlvYmFuay1zY2FsZSBkYXRhLiBHaWdhU2NpZW5jZSA4LCBnaXowODIgKDIwMTkpLg0KDQoyNS4JTGVnZ2UsIFMuIEUuIGV0IGFsLiBBIGdlbm9tZS13aWRlIGFzc29jaWF0aW9uIHN0dWR5IGluIGluZGl2aWR1YWxzIG9mIEFmcmljYW4gYW5jZXN0cnkgcmV2ZWFscyB0aGUgaW1wb3J0YW5jZSBvZiB0aGUgRHVmZnktbnVsbCBnZW5vdHlwZSBpbiB0aGUgYXNzZXNzbWVudCBvZiBjbG96YXBpbmUtcmVsYXRlZCBuZXV0cm9wZW5pYS4gTW9sIFBzeWNoaWF0cnkgMjQsIDMyOOKAkzMzNyAoMjAxOSkuDQoNCjI2LglHb2xkc3RlaW4sIEouIEkuIGV0IGFsLiBDbG96YXBpbmUtaW5kdWNlZCBhZ3JhbnVsb2N5dG9zaXMgaXMgYXNzb2NpYXRlZCB3aXRoIHJhcmUgSExBLURRQjEgYW5kIEhMQS1CIGFsbGVsZXMuIE5hdCBDb21tdW4gNSwgNDc1NyAoMjAxNCkuDQoNCjI3LglaaGVuZywgWC4gZXQgYWwuIEhJQkFH4oCUSExBIGdlbm90eXBlIGltcHV0YXRpb24gd2l0aCBhdHRyaWJ1dGUgYmFnZ2luZy4gUGhhcm1hY29nZW5vbWljcyBKIDE0LCAxOTLigJMyMDAgKDIwMTQpLg0KDQoyOC4JUm9ocmVyLCBKLiBNLiBUaGlua2luZyBDbGVhcmx5IEFib3V0IENvcnJlbGF0aW9ucyBhbmQgQ2F1c2F0aW9uOiBHcmFwaGljYWwgQ2F1c2FsIE1vZGVscyBmb3IgT2JzZXJ2YXRpb25hbCBEYXRhLiBBZHZhbmNlcyBpbiBNZXRob2RzIGFuZCBQcmFjdGljZXMgaW4gUHN5Y2hvbG9naWNhbCBTY2llbmNlIDEsIDI34oCTNDIgKDIwMTgpLg0KDQoyOS4JRmVyZ3Vzb24sIEsuIEQuIGV0IGFsLiBFdmlkZW5jZSBzeW50aGVzaXMgZm9yIGNvbnN0cnVjdGluZyBkaXJlY3RlZCBhY3ljbGljIGdyYXBocyAoRVNDLURBR3MpOiBhIG5vdmVsIGFuZCBzeXN0ZW1hdGljIG1ldGhvZCBmb3IgYnVpbGRpbmcgZGlyZWN0ZWQgYWN5Y2xpYyBncmFwaHMuIEludGVybmF0aW9uYWwgSm91cm5hbCBvZiBFcGlkZW1pb2xvZ3kgNDksIDMyMuKAkzMyOSAoMjAyMCkuDQoNCjMwLglSIENvcmUgVGVhbS4gUjogQSBMYW5ndWFnZSBhbmQgRW52aXJvbm1lbnQgZm9yIFN0YXRpc3RpY2FsIENvbXB1dGluZy4gKFIgRm91bmRhdGlvbiBmb3IgU3RhdGlzdGljYWwgQ29tcHV0aW5nLCAyMDIxKS4NCg0KMzEuCVplbmcsIFMuLCBSb3NlbmJhdW0sIFMuLCBBbGJlcnRzLCBTLiBDLiwgQXJjaGllLCBFLiBBLiAmIExpLCBGLiBDYXVzYWwgbWVkaWF0aW9uIGFuYWx5c2lzIGZvciBzcGFyc2UgYW5kIGlycmVndWxhciBsb25naXR1ZGluYWwgZGF0YS4gVGhlIEFubmFscyBvZiBBcHBsaWVkIFN0YXRpc3RpY3MgMTUsIDc0N+KAkzc2NyAoMjAyMSkuDQoNCjMyLglSb3NzZWVsLCBZLiBsYXZhYW46IEFuIFIgUGFja2FnZSBmb3IgU3RydWN0dXJhbCBFcXVhdGlvbiBNb2RlbGluZy4gSm91cm5hbCBvZiBTdGF0aXN0aWNhbCBTb2Z0d2FyZSA0OCwgMeKAkzM2ICgyMDEyKS4NCg0KMzMuCVRpbmdsZXksIEQuLCBZYW1hbW90bywgVC4sIEhpcm9zZSwgSy4sIEtlZWxlLCBMLiAmIEltYWksIEsuIG1lZGlhdGlvbjogUiBQYWNrYWdlIGZvciBDYXVzYWwgTWVkaWF0aW9uIEFuYWx5c2lzLiBKb3VybmFsIG9mIFN0YXRpc3RpY2FsIFNvZnR3YXJlIDU5LCAx4oCTMzggKDIwMTQpLg0KDQozNC4JT3lld3VtaSwgTC4gSy4sIENlcm5vdnNreSwgWi4gWi4sIEZyZWVtYW4sIEQuIEouICYgU3RyZWluZXIsIEQuIEwuIFJlbGF0aW9uIG9mIEJsb29kIENvdW50cyBkdXJpbmcgQ2xvemFwaW5lIFRyZWF0bWVudCB0byBTZXJ1bSBDb25jZW50cmF0aW9ucyBvZiBDbG96YXBpbmUgYW5kIE5vci1DbG96YXBpbmUuIENhbiBKIFBzeWNoaWF0cnkgNDcsIDI1N+KAkzI2MSAoMjAwMikuDQoNCjM1LglNaWpvdmljLCBBLiAmIE1hY0NhYmUsIEouIEguIENsb3phcGluZS1pbmR1Y2VkIGFncmFudWxvY3l0b3Npcy4gQW5uIEhlbWF0b2wgOTksIDI0NzfigJMyNDgyICgyMDIwKS4NCg0KMzYuCUxvYmFjaCwgQS4gUi4gJiBVZXRyZWNodCwgSi4gQ2xvemFwaW5lIHByb21vdGVzIHRoZSBwcm9saWZlcmF0aW9uIG9mIGdyYW51bG9jeXRlIHByb2dlbml0b3JzIGluIHRoZSBib25lIG1hcnJvdyBsZWFkaW5nIHRvIGluY3JlYXNlZCBncmFudWxvcG9pZXNpcyBhbmQgbmV1dHJvcGhpbGlhIGluIHJhdHMuIENoZW0gUmVzIFRveGljb2wgMjcsIDExMDnigJMxMTE5ICgyMDE0KS4NCg0KMzcuCVBvbGxtw6RjaGVyLCBULiwgRmVuemVsLCBULiwgTXVsbGluZ3RvbiwgSi4gJiBIaW56ZS1TZWxjaCwgRC4gVGhlIEluZmx1ZW5jZSBvZiBDbG96YXBpbmUgVHJlYXRtZW50IG9uIFBsYXNtYSBHcmFudWxvY3l0ZSBDb2xvbnktU3RpbXVsYXRpbmcgKEctQ1NGKSBMZXZlbHMuIFBoYXJtYWNvcHN5Y2hpYXRyeSAzMCwgMTE44oCTMTIxICgxOTk3KS4NCg0KMzguCU5nLCBXLiwgS2VubmFyLCBSLiAmIFVldHJlY2h0LCBKLiBFZmZlY3Qgb2YgY2xvemFwaW5lIGFuZCBvbGFuemFwaW5lIG9uIG5ldXRyb3BoaWwga2luZXRpY3M6IGltcGxpY2F0aW9ucyBmb3IgZHJ1Zy1pbmR1Y2VkIGFncmFudWxvY3l0b3Npcy4gQ2hlbSBSZXMgVG94aWNvbCAyNywgMTEwNOKAkzExMDggKDIwMTQpLg0KDQozOS4JR2VpYiwgVC4sIFRodWxhc2luZ2FtLCBNLiwgSGFlZ2dzdHLDtm0sIEouIFouICYgU2xlbm8sIEwuIEludmVzdGlnYXRpb24gb2YgQ2xvemFwaW5lIGFuZCBPbGFuemFwaW5lIFJlYWN0aXZlIE1ldGFib2xpdGUgRm9ybWF0aW9uIGFuZCBQcm90ZWluIEJpbmRpbmcgYnkgTGlxdWlkIENocm9tYXRvZ3JhcGh5LVRhbmRlbSBNYXNzIFNwZWN0cm9tZXRyeS4gQ2hlbS4gUmVzLiBUb3hpY29sLiAzMywgMjQyMOKAkzI0MzEgKDIwMjApLg0KDQo0MC4JWXVuaXMsIEouIEouIGV0IGFsLiBITEEgYXNzb2NpYXRpb25zIGluIGNsb3phcGluZS1pbmR1Y2VkIGFncmFudWxvY3l0b3Npcy4gQmxvb2QgODYsIDExNzfigJMxMTgzICgxOTk1KS4NCg0KNDEuCUF0YWxsYWgtWXVuZXMsIFMuIEEuLCBSZWFkeSwgQS4gJiBOZXdidXJnZXIsIFAuIEUuIEJlbmlnbiBldGhuaWMgbmV1dHJvcGVuaWEuIEJsb29kIFJldmlld3MgMzcsIDEwMDU4NiAoMjAxOSkuDQoNCjQyLglBbmRyZW91LCBBLiwgSmF5YXJhbSwgSi4sIFdhbGtlciwgQS4sIFRlaywgQy4gJiBXaWxsaWFtcywgSi4gQy4gUmUtZXhhbWluaW5nIHRoZSB1dGlsaXR5IGFuZCB2YWxpZGl0eSBvZiBiZW5pZ24gZXRobmljIG5ldXRyb3BlbmlhOiBBIG5hcnJhdGl2ZSBsaXRlcmF0dXJlIHJldmlldy4gU2NoaXpvcGhyZW5pYSBSZXNlYXJjaCAoMjAyMikgZG9pOjEwLjEwMTYvai5zY2hyZXMuMjAyMi4wMi4wMDkuDQoNCjQzLglXaWxsaWFtcywgSi4gQy4sIEhhcm93aXR6LCBKLiwgR2xvdmVyLCBKLiwgVGVrLCBDLiAmIFNyaWhhcmksIFYuIFN5c3RlbWF0aWMgcmV2aWV3IG9mIHJhY2lhbCBkaXNwYXJpdGllcyBpbiBjbG96YXBpbmUgcHJlc2NyaWJpbmcuIFNjaGl6b3BocmVuaWEgUmVzZWFyY2ggMjI0LCAxMeKAkzE4ICgyMDIwKS4NCg0KNDQuCUjDpGdnLCBTLiwgU3BpZ3NldCwgTy4sIE1qw7ZybmRhbCwgVC4gJiBEYWhscXZpc3QsIFIuIEVmZmVjdCBvZiBjYWZmZWluZSBvbiBjbG96YXBpbmUgcGhhcm1hY29raW5ldGljcyBpbiBoZWFsdGh5IHZvbHVudGVlcnMuIEJyaXRpc2ggSm91cm5hbCBvZiBDbGluaWNhbCBQaGFybWFjb2xvZ3kgNDksIDU54oCTNjMgKDIwMDApLg0KDQo0NS4JTGVzY2hlLCBELiwgTW9zdGFmYSwgUy4sIEV2ZXJhbGwsIEkuLCBQYW50ZWxpcywgQy4gJiBCb3VzbWFuLCBDLiBBLiBJbXBhY3Qgb2YgQ1lQMUEyLCBDWVAyQzE5LCBhbmQgQ1lQMkQ2IGdlbm90eXBlLSBhbmQgcGhlbm9jb252ZXJzaW9uLXByZWRpY3RlZCBlbnp5bWUgYWN0aXZpdHkgb24gY2xvemFwaW5lIGV4cG9zdXJlIGFuZCBzeW1wdG9tIHNldmVyaXR5LiBQaGFybWFjb2dlbm9taWNzIEogMjAsIDE5MuKAkzIwMSAoMjAyMCkuDQoNCjQ2LglKb2ludCBGb3JtdWxhcnkgQ29tbWl0dGVlLiBCcml0aXNoIE5hdGlvbmFsIEZvcm11bGFyeSBbSW50ZXJuZXRdLiAoQnJpdGlzaCBNZWRpY2FsIEFzc29jaWF0aW9uIGFuZCBSb3lhbCBQaGFybWFjZXV0aWNhbCBTb2NpZXR5IG9mIEdyZWF0IEJyaXRhaW4pLg0KDQo0Ny4JZGUgTGVvbiwgSi4sIFJ1YW4sIEMuLUouLCBTY2hvcmV0c2FuaXRpcywgRy4gJiBEZSBsYXMgQ3VldmFzLCBDLiBBIFJhdGlvbmFsIFVzZSBvZiBDbG96YXBpbmUgQmFzZWQgb24gQWR2ZXJzZSBEcnVnIFJlYWN0aW9ucywgUGhhcm1hY29raW5ldGljcywgYW5kIENsaW5pY2FsIFBoYXJtYWNvcHN5Y2hvbG9neS4gUHN5Y2hvdGhlciBQc3ljaG9zb20gODksIDIwMOKAkzIxNCAoMjAyMCkuDQoNCjQ4LglLdXppbiwgTS4gZXQgYWwuIEJvZHkgbWFzcyBpbmRleCBhcyBhIGRldGVybWluYW50IG9mIGNsb3phcGluZSBwbGFzbWEgY29uY2VudHJhdGlvbnM6IEEgcGhhcm1hY29raW5ldGljLWJhc2VkIGh5cG90aGVzaXMuIEogUHN5Y2hvcGhhcm1hY29sIDM1LCAyNzPigJMyNzggKDIwMjEpLg0KDQo0OS4JUmVldmVzLCBTLiBldCBhbC4gQSBwb3B1bGF0aW9uIHBoYXJtYWNva2luZXRpYyBtb2RlbCB0byBndWlkZSBjbG96YXBpbmUgZG9zZSBzZWxlY3Rpb24sIGJhc2VkIG9uIGFnZSwgc2V4LCBldGhuaWNpdHksIGJvZHkgd2VpZ2h0IGFuZCBzbW9raW5nIHN0YXR1cy4gQnJpdGlzaCBKb3VybmFsIG9mIENsaW5pY2FsIFBoYXJtYWNvbG9neSBkb2k6MTAuMTExMS9iY3AuMTU2OTEuDQoNCjUwLglUZW5uZW50LCBSLiwgQWxpLCBBLiwgV2hhbSwgQy4gJiBSdXRoZXJmdXJkLU1hcmt3aWNrLCBLLiBOYXJyYXRpdmUgUmV2aWV3OiBJbXBhY3Qgb2YgR2VuZXRpYyBWYXJpYWJpbGl0eSBvZiBDWVAxQTIsIEFET1JBMkEsIGFuZCBBSFIgb24gQ2FmZmVpbmUgQ29uc3VtcHRpb24gYW5kIFJlc3BvbnNlLiBKb3VybmFsIG9mIENhZmZlaW5lIGFuZCBBZGVub3NpbmUgUmVzZWFyY2ggMTAsIDEyNeKAkzEzNCAoMjAyMCkuDQoNCjUxLglSYW1hbmF2aWNpZW5lLCBBLiwgQWNhaXRlLCBKLiwgUmFtYW5hdmljaXVzLCBBLiAmIFJhbWFuYXZpY2l1cywgQS4gQ2hyb25pYyBjYWZmZWluZSBpbnRha2UgYWZmZWN0cyBseXNvenltZSBhY3Rpdml0eSBhbmQgaW1tdW5lIGNlbGxzIGluIG1pY2UuIEpvdXJuYWwgb2YgUGhhcm1hY3kgYW5kIFBoYXJtYWNvbG9neSA1NiwgNjcx4oCTNjc2ICgyMDA0KS4NCg0KNTIuCUhpZ3VjaGksIFQuIGV0IGFsLiBDdXJyZW50IGNpZ2FyZXR0ZSBzbW9raW5nIGlzIGEgcmV2ZXJzaWJsZSBjYXVzZSBvZiBlbGV2YXRlZCB3aGl0ZSBibG9vZCBjZWxsIGNvdW50OiBDcm9zcy1zZWN0aW9uYWwgYW5kIGxvbmdpdHVkaW5hbCBzdHVkaWVzLiBQcmV2ZW50aXZlIE1lZGljaW5lIFJlcG9ydHMgNCwgNDE34oCTNDIyICgyMDE2KS4NCg0KNTMuCVplbmcsIEwuIGV0IGFsLiBDaWdhcmV0dGUgc21va2luZywgY29mZmVlIGNvbnN1bXB0aW9uLCBhbGNvaG9sIGludGFrZSwgYW5kIGNsb3phcGluZSBtZXRhYm9saXNtOiBBIE1lbmRlbGlhbiByYW5kb21pemF0aW9uIHN0dWR5LiBGcm9udGllcnMgaW4gUHN5Y2hpYXRyeSAxMywgKDIwMjIpLg0KDQo1NC4JVGlpaG9uZW4sIEouIGV0IGFsLiAxMS15ZWFyIGZvbGxvdy11cCBvZiBtb3J0YWxpdHkgaW4gcGF0aWVudHMgd2l0aCBzY2hpem9waHJlbmlhOiBhIHBvcHVsYXRpb24tYmFzZWQgY29ob3J0IHN0dWR5IChGSU4xMSBzdHVkeSkuIExhbmNldCAzNzQsIDYyMOKAkzYyNyAoMjAwOSkuDQoNCjU1LglSb3NlLCBFLiBldCBhbC4gQ2F1c2VzIG9mIGRlYXRoIGluIGNsb3phcGluZS10cmVhdGVkIHBhdGllbnRzIGluIGEgY2F0Y2htZW50IGFyZWE6IGEgMTAteWVhciByZXRyb3NwZWN0aXZlIGNhc2UtY29udHJvbCBzdHVkeS4gRXVyb3BlYW4gTmV1cm9wc3ljaG9waGFybWFjb2xvZ3kgMzYsIDE2MOKAkzE2NiAoMjAyMCkuDQo1Ni4JUG9uc2ZvcmQsIE0uIGV0IGFsLiBDbG96YXBpbmUgaXMgYXNzb2NpYXRlZCB3aXRoIHNlY29uZGFyeSBhbnRpYm9keSBkZWZpY2llbmN5LiBCciBKIFBzeWNoaWF0cnkgMjE0LCAx4oCTNyAoMjAxOCkuDQoNCjU3LglHcmlmZml0aHMsIEsuIGV0IGFsLiBDaGFuZ2VzIGluIGltbXVub2dsb2J1bGluIGxldmVscyBkdXJpbmcgY2xvemFwaW5lIHRyZWF0bWVudCBpbiBzY2hpem9waHJlbmlhLiAyMDIyLjA1LjE4LjIyMjc1MjM4IFByZXByaW50IGF0IGh0dHBzOi8vZG9pLm9yZy8xMC4xMTAxLzIwMjIuMDUuMTguMjIyNzUyMzggKDIwMjIpLg0KDQo1OC4JU2tva291LCBNLiBldCBhbC4gQWR2ZXJzZSBEcnVnIFJlYWN0aW9ucyBpbiBSZWxhdGlvbiB0byBDbG96YXBpbmUgUGxhc21hIExldmVsczogQSBTeXN0ZW1hdGljIFJldmlldy4gUGhhcm1hY2V1dGljYWxzIChCYXNlbCkgMTUsIDgxNyAoMjAyMikuDQoNCjU5LglPbG95ZWRlLCBFLiBldCBhbC4gVGhlcmUgSXMgTGlmZSBBZnRlciB0aGUgVUsgQ2xvemFwaW5lIENlbnRyYWwgTm9uLVJlY2hhbGxlbmdlIERhdGFiYXNlLiBTY2hpem9waHIgQnVsbCA0NywgMTA4OOKAkzEwOTggKDIwMjEpLg0KDQo2MC4JQm9ua2F0LCBOLiwgRmVsbGVuZG9yZiwgRi4gVC4sIERhbGtuZXIsIE4uICYgUmVpbmluZ2hhdXMsIEUuIFouIFNldmVyZSBtZW50YWwgZGlzb3JkZXJzIGFuZCB2YWNjaW5hdGlvbnMg4oCTIGEgc3lzdGVtYXRpYyByZXZpZXcuIFRoZSBXb3JsZCBKb3VybmFsIG9mIEJpb2xvZ2ljYWwgUHN5Y2hpYXRyeSAyMywgNTAx4oCTNTE2ICgyMDIyKS4NCg0KDQo8YnI+DQo8YnI+DQo8YnI+DQo8YnI+DQoNCiMjIDxzdHJvbmc+IFN1cHBsZW1lbnRhcnkgTm90ZXM6IEdlbmV0aWMgVmFyaWFibGVzIDwvc3Ryb25nPiANCiMjIyBTdXBwbGVtZW50YXJ5IE5vdGVzOiBHZW5ldGljIFZhcmlhYmxlcw0KIyMjIyBRdWFsaXR5IENvbnRyb2wgb2YgR2VuZXRpYyBEYXRhIA0KDQpBIHN1YnNldCBvZiB0aGUgQ0xPWlVLMyBzYW1wbGUgd2FzIGdlbm90eXBlZCB1c2luZyB0aGUgSWxsdW1pbmEgSW5maW5pdW0gR2xvYmFsIFNjcmVlbmluZy0yNCAoSWxsdW1pbmEgSW5jLiwgVVNBKSBhdCBJY2FobiBTY2hvb2wgb2YgTWVkaWNpbmUgYXQgTW91bnQgU2luYWkgKE5ldyBZb3JrIENpdHksIFVTQSkuIFRoZSDigJxHZW5vdHlwZVFDdG9IUkPigJ0gbW9kdWxlIG9mIHRoZSBEUkFHT04tZGF0YSBwaXBlbGluZSB3YXMgdXNlZCB0byBwcm9jZXNzIHRoZSBnZW5vdHlwZSBkYXRhXjFeLiBUaGlzIGluY2x1ZGVzIHF1YWxpdHkgY29udHJvbCBvZiBjYWxscywgcmVtb3ZpbmcgaW5kaXZpZHVhbHMgd2l0aCBnZW5vdHlwaW5nIHJhdGVzIDwwLjk1LCBhbmQgU05QcyB3aXRoIGNhbGwgcmF0ZXMgPDAuOTUsIG1pbm9yIGFsbGVsZSBmcmVxdWVuY3kgPDAuMDEsIGFuZCB3aXRoIEhhcmR5LVdlaW5iZXJnIEVxdWlsaWJyaXVtIG1pZC1wIDwgMTBeLTZeLiBJbXB1dGF0aW9uIGFuZCBzdGF0aXN0aWNhbCBwaGFzaW5nIHdlcmUgY2FycmllZCBvdXQgdmlhIHRoZSBNaWNoaWdhbiBJbXB1dGF0aW9uIFNlcnZlciBhbmQgbWluaW1hYzQgdXNpbmcgdGhlIEhhcGxvdHlwZSBSZWZlcmVuY2UgQ29uc29ydGl1bSAoSFJDKSBwYW5lbF4yLDNeLiBGdXJ0aGVyIHF1YWxpdHkgY29udHJvbCB3YXMgcGVyZm9ybWVkIG9uIHRoZSBpbXB1dGVkIGdlbm90eXBlcywgZGVzY3JpYmVkIGluIHByZXZpb3VzIHdvcmteNF4uIEdlbmV0aWMgZGF0YSwgaW5jbHVkaW5nIFBvbHlnZW5pYyBTY29yZXMgKFBHUykgZm9yIGNsb3phcGluZSBhbmQgbm9yY2xvemFwaW5lIG1ldGFib2xpc20sIGtleSBwaGFybWFjb2dlbm9taWMgU05QcywgYW5kIENZUDFBMiBhY3Rpdml0eSBzY29yZXMsIHdlcmUgbWVyZ2VkIHdpdGggdGhlIGNvbWJpbmVkIENMT1pVSzMgZGF0YXNldCBjb250YWluaW5nIEZCQyBhbmQgUEsgaW5mb3JtYXRpb24gcmVzdWx0aW5nIGluIGEgZGF0YXNldCBvZiA1MjMgaW5kaXZpZHVhbHMgYW5kIDEsNTg2IGFzc2F5cy4NCg0KPGJyPg0KPGJyPg0KDQoNCiMjIyMgRXhwbG9yaW5nIHRoZSBlZmZlY3RzIG9mIENZUDFBMiBQaGFybWFjb2dlbm9taWMgVmFyaWF0aW9uIG9uIE5ldXRyb3BoaWwgQ291bnRzIGluIENsb3phcGluZSBVc2Vycw0KDQpDWVAxQTIgcGxheXMgYSBrZXkgcm9sZSBpbiBjbG96YXBpbmUgbWV0YWJvbGlzbSwgdGhlcmVmb3JlIGl0IGlzIGxpa2VseSB0aGF0IGVmZmVjdHMgb2YgQ1lQMUEyIHBoYXJtYWNvZ2Vub21pYyB2YXJpYWJpbGl0eSBtaWdodCBiZSBvYnNlcnZlZCBvbiBuZXV0cm9waGlsIGNvdW50cy4gUGhhcm1hY29nZW5vbWljIHN0YXIgYWxsZWxlcyBmb3IgQ1lQMUEyIHdlcmUgY2FsbGVkIHVzaW5nIFB5UEd4IHYwLjIwLjBeNV4gaW4gUHl0aG9uIHYzLjkuMl42Xi4gVGhlIGltcHV0ZWQgZ2Vub3R5cGluZyBkYXRhIGZvciBDTE9aVUszIHdhcyBwYXNzZWQgdGhyb3VnaCB0aGUgcnVuLWNoaXAtcGlwZWxpbmUgY29tbWFuZCB0byBkZXJpdmUgUEd4IHN0YXIgYWxsZWxlcyBmb3IgdGhpcyBwaGFybWFjb2dlbmUuIA0KDQpBcyBDUElDLXZhbGlkYXRlZCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgQ1lQMUEyIG1ldGFib2xpc20gcGhlbm90eXBlcyBhbmQgYWN0aXZpdHkgc2NvcmVzIGlzIGN1cnJlbnRseSBub3QgYXZhaWxhYmxlLCBlYWNoIGhhcGxvdHlwZSB3YXMgYXNzaWduZWQgYW4gYWN0aXZpdHkgc2NvcmUgaW4gbGluZSB3aXRoIHBhc3Qgd29ya143LDheIGFzIGRlc2NyaWJlZCBpbiBTdXBwbGVtZW50YXJ5IFRhYmxlIDEuIFRoZXNlIHdlcmUgc3VtbWVkIHRvIHByb2R1Y2UgYW4gb3ZlcmFsbCBhY3Rpdml0eSBzY29yZSBwZXIgcGFydGljaXBhbnQsIGluIHdoaWNoIGhpZ2hlciBzY29yZXMgYXJlIHJlZmxlY3RpdmUgb2YgaW5jcmVhc2VkIGVuenltZSBmdW5jdGlvbi4gU2V2ZXJhbCBwYXJ0aWNpcGFudHMgd2VyZSBjYWxsZWQgd2l0aCBDWVAxQTIqMUYvMUMgYWxsZWxlcyBpbiB0aGUgc2FtZSBoYXBsb3R5cGUuIFRoZXNlIGFsbGVsZXMgaGF2ZSBvcHBvc2luZyBmdW5jdGlvbnMsIHRoZXJlZm9yZSBpbiBsaW5lIHdpdGggcGFzdCB3b3JrXjleLCB3ZSBoYXZlIHRyZWF0ZWQgdGhpcyBoYXBsb3R5cGUgYXMgYSBub3JtYWwgZnVuY3Rpb24gYWxsZWxlLiBQaGFybWFjb2dlbm9taWMgdmFyaWF0aW9uIGluIENZUDNBNCB3YXMgbm90IGV4cGxvcmVkIGRlc3BpdGUgaXRzIGtleSByb2xlIGluIGNsb3phcGluZSBtZXRhYm9saXNtIG9uIGFjY291bnQgb2YgdGhlIHJhcml0eSBvZiBwaGFybWFjb2dlbm9taWMgc3RhciBhbGxlbGVzIGNvbmZlcnJpbmcgbm9uLW5vcm1hbCBmdW5jdGlvbl4xMF4sIGFuZCBsaWtlbHkgZGlmZmljdWx0aWVzIHRoYXQgd291bGQgYXJpc2Ugd2hlbiB0cnlpbmcgdG8gZml0IG1vZGVscyB1c2luZyBzdWNoIHNtYWxsIHNhbXBsZSBzaXplcy4gTGlrZXdpc2UsIENZUDJENiB2YXJpYXRpb24gd2FzIG5vdCBleHBsb3JlZCBhcyBtYW55IG9mIHRoZSBpbmNyZWFzZWQgZnVuY3Rpb24gQ1lQMkQ2IHBoYXJtYWNvZ2Vub21pYyBhbGxlbGVzIGFyaXNlIGZyb20gc3RydWN0dXJhbCBjb3B5IG51bWJlciB2YXJpYXRpb24gdGhhdCBjYW5ub3QgYmUgcmVsaWFibHkgaWRlbnRpZmllZCB0aHJvdWdoIGdlbm90eXBpbmcgYXJyYXlzXjExXi4gDQoNCmBgYHtyIFNUMX0NCiNpbXBvcnQgc3VwcGxlbWVudGFyeSB0YWJsZSAxIGZyb20gZXhjZWwgZmlsZS4gDQoNCnN0MSA8LSByZWFkeGw6OnJlYWRfeGxzeChwYXRoID0gIlN1cHBsZW1lbnRhcnkgVGFibGVzLnhsc3giLCBzaGVldCA9IDEsIGNvbF9uYW1lcyA9IFRSVUUpDQpjYXAgPC0gc3QxWzcsMV0NCnN0MSA8LSBoZWFkKHN0MSwgLTMpDQoNCnN0MSRgRVVSIEZyZXF1ZW5jeSAxYCA8LSBhcy5udW1lcmljKHN0MSRgRVVSIEZyZXF1ZW5jeSAxYCkNCnN0MSRgRVVSIEFMRkEgQWxsZWxlIEZyZXF1ZW5jeSAyYDwtIGFzLm51bWVyaWMoc3QxJGBFVVIgQUxGQSBBbGxlbGUgRnJlcXVlbmN5IDJgKQ0KDQpjb2xuYW1lcyhzdDEpIDwtIGMoIkNZUDFBMiBQR3ggU3RhciBBbGxlbGUiLCAiQWN0aXZpdHkgU2NvcmUiLCAiRnJlcXVlbmN5IChDTE9aVUszKSIsICJFVVIgRnJlcXVlbmN5XjEyXiIsICJFVVIgQUxGQSBGcmVxdWVuY3leMTNeIikNCg0Ka2FibGUoc3QxLA0KICAgICAgY2FwdGlvbiA9IGNhcCwgZGlnaXRzID0gMykgJT4lDQogICAgICBrYWJsZV9zdHlsaW5nKCJub25lIiwgZnVsbF93aWR0aCA9IFQsIHBvc2l0aW9uID0gImxlZnQiLCBmb250X3NpemUgPSAxNikgJT4lDQogICAgICBrYWJsZV9jbGFzc2ljKCkNCg0KYGBgDQoNCjxicj4NCjxicj4NCg0KVGhlIGRpc3RyaWJ1dGlvbiBvZiBhY3Rpdml0eSBzY29yZXMgaXMgc2hvd24gaW4gU3VwcGxlbWVudGFyeSBGaWd1cmUgMSBhbmQgb2JzZXJ2ZWQgYWxsZWxlIGZyZXF1ZW5jaWVzIGNvbXBhcmVkIHRvIHByZXZpb3VzIHJlc2VhcmNoIGluIFN1cHBsZW1lbnRhcnkgVGFibGUgMV4xMiwxM14uIFRoZSBlc3RpbWF0ZWQgYWN0aXZpdHkgc2NvcmVzIHdlcmUgaW5jbHVkZWQgaW4gYSBsaW5lYXIgbWl4ZWQtZWZmZWN0IG1vZGVsIGFsb25nc2lkZSBtZWRpY2F0aW9uIHZhcmlhYmxlcyAoaS5lLiwgZGFpbHkgZG9zZSwgcGxhc21hIGNsb3phcGluZSBhbmQgbm9yY2xvemFwaW5lIGNvbmNlbnRyYXRpb24pLCBwaGFybWFjb2dlbm9taWMgU05QcywgYW5kIG90aGVyIGNvdmFyaWF0ZXMgKGkuZS4sIGFnZSwgYWdlXjJeLCBzZXgsIFREUykgdG8gZGV0ZXJtaW5lIHRoZWlyIGltcGFjdCBvbiBBTkMuIA0KDQpGaW5hbGx5LCB0d28gZnVydGhlciBtb2RlbHMgd2VyZSBmaXQgdG8gY29tcGFyZSB0aGUgZWZmZWN0IHNpemUgb2YgQ1lQMUEyIGFjdGl2aXR5IHNjb3JlIHdpdGgsIGFuZCB3aXRob3V0IGluY2x1ZGluZyB0aGUgaW50ZXJnZW5pYyBDWVAxQTEtQ1lQMUEyIFNOUCwgcnMyNDcyMjk3LCBpbiB0aGUgbW9kZWwuIFRoZXJlIGlzIGV2aWRlbmNlIHRoYXQgdGhpcyBTTlAgYm90aCByZWd1bGF0ZXMgQ1lQMUEyIGFjdGl2aXR5XjE0XiBhbmQgaXMgaW4gd2VhayBsaW5rYWdlIGRpc2VxdWlsaWJyaXVtIHdpdGggdGhlICoxRiBhbGxlbGUuIFRoZXJlZm9yZSwgaXQgd2FzIGFkZGVkIGFzIGEgY292YXJpYXRlIGluIGEgc2Vjb25kIG1vZGVsIHRvIGRldGVybWluZSB3aGV0aGVyIGl0cyBpbmNsdXNpb24gaW1wYWN0cyBhbnkgYXNzb2NpYXRpb24gYmV0d2VlbiBtZWFzdXJlcyBvZiBDWVAxQTIgYWN0aXZpdHkgd2l0aCBBTkMgaW4gb3VyIHNhbXBsZS4gDQoNCg0KDQo8YnI+DQoNCmBgYHtyIFNGMSwgZmlnLmhlaWdodD03LCBmaWcud2lkdGg9OCwgZmlnLmFsaWduPSdjZW50ZXInLGZpZy5jYXA9IlN1cHBsZW1lbnRhcnkgRmlndXJlIDEuIERpc3RyaWJ1dGlvbiBvZiBwaGFybWFjb2dlbm9taWMgYWxsZWxlIGRlcml2ZWQgQ1lQMUEyIGFjdGl2aXR5IHNjb3JlcyBvYnNlcnZlZCBpbiB0aGUgQ0xPWlVLMyBzYW1wbGUifQ0KDQojIG1ha2UgcGxvdCANCg0KeGxldiA8LSBjKCJQb29yIG1ldGFib2xpc2VyIiwgIkludGVybWVkaWF0ZSBtZXRhYm9saXNlciIsICJOb3JtYWwgbWV0YWJvbGlzZXIiLCANCiAgICAgICAgICAgICJSYXBpZCBtZXRhYm9saXNlciIsICJVbHRyYXJhcGlkIG1ldGFib2xpc2VyIiwgTkEpDQpDTE9aVUszLjFhMiRQaGVubyA8LSBmYWN0b3IoQ0xPWlVLMy4xYTIkZXN0X3BoZW5vLCBsZXZlbHMgPSB4bGV2KQ0KDQoNCnlsZXYgPC0gYyggMiwgMi41LCAzKQ0KQ0xPWlVLMy4xYTIkYWN0aXZpdHlfc2NvcmUgPC0gZmFjdG9yKENMT1pVSzMuMWEyJGVzdF9zY29yZSwgbGV2ZWxzID0geWxldikNCg0KQ0xPWlVLMy5mYmMucGsubWluLjFhMiA8LSBsZWZ0X2pvaW4oQ0xPWlVLMy5mYmMucGsubWluLCBDTE9aVUszLjFhMiwgYnkgPSAiTFVJTiIpDQpDTE9aVUszLmZiYy5way5taW4uMWEyIDwtIG5hLm9taXQoQ0xPWlVLMy5mYmMucGsubWluLjFhMikNCg0KZ2dwbG90KENMT1pVSzMuZmJjLnBrLm1pbi4xYTIsIGFlcyh4ID0gYWN0aXZpdHlfc2NvcmUgKSkgKw0KICBnZW9tX2JhcihtYXBwaW5nID0gYWVzKGZpbGwgPSBhY3Rpdml0eV9zY29yZSkpICsNCiAgZ2VvbV90ZXh0KHN0YXQ9J2NvdW50JywgYWVzKGxhYmVsPS4uY291bnQuLiksIHZqdXN0PS0xKSArDQogIGxhYnModGl0bGUgPSAiQWN0aXZpdHkgU2NvcmVzIGZvciBDWVAxQTIgZm9yIENMT1pVSzMgU2FtcGxlIikgKw0KICB4bGFiKCJBY3Rpdml0eSBTY29yZSIpICsNCiAgeWxhYigiTnVtYmVyIG9mIFBhcnRpY2lwYW50cyIpICsNCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gYygic3RlZWxibHVlIiwgInNlYWdyZWVuMiIsICJtZWRpdW1wdXJwbGUxIikpICsNCiAgdGhlbWVfbWluaW1hbCgpICsNCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA0NSwgdmp1c3QgPSAxLCBoanVzdCA9IDEpKSArDQogIGd1aWRlcyhmaWxsID0gRkFMU0UpDQoNCg0KYGBgDQoNCjxicj4NCjxicj4NCg0KIyMjIyBBc3Nlc3NpbmcgdGhlIEltcGFjdCBvZiBITEEgR2Vub3R5cGVzIG9uIE5ldXRyb3BoaWwgQ291bnRzDQoNClBhc3QgcmVzZWFyY2ggaGFzIG9ic2VydmVkIGFzc29jaWF0aW9ucyBiZXR3ZWVuIEhMQSBnZW5vdHlwZXMgd2l0aCByaXNrIGZvciBjbG96YXBpbmUtaW5kdWNlZCBhZ3JhbnVsb2N5dG9zaXNeMTXigJMxN14uIFRoZXJlZm9yZSwgd2UgZXhwbG9yZWQgd2hldGhlciB0aGVzZSBhbGxlbGVzIHdlcmUgYXNzb2NpYXRlZCB3aXRoIEFOQyBpbiB0aGUgQ0xPWlVLMyBzYW1wbGUuIFByZS1pbXB1dGF0aW9uIGFycmF5IGRhdGEgd2FzIHJlc3RyaWN0ZWQgdG8gY2hyb21vc29tZSA2IHVzaW5nIFBMSU5LIHYxLjleMTgsMTleLiBISUJBRyB2MS4zNC4xXjIwXiB3YXMgdXNlZCB0byBkZXJpdmUgSExBIGFsbGVsZXMsIGFsb25nc2lkZSB0aGUgcHJlLWJ1aWx0IEluZmluaXVtR2xvYmFsLUV1cm9wZWFuLUhMQTQtaGcxOSBwcmVkaWN0aW9uIG1vZGVsLCB3aGljaCBiZXN0IGZpdHMgdGhlIENMT1pVSzMgZGF0YSBjb25jZXJuaW5nIGJvdGggdGhlIGdlbm90eXBpbmcgcGxhdGZvcm0gYW5kIHRoZSBzYW1wbGUgYW5jZXN0cnkuIFRoaXMgYWxsb3dlZCBpbXB1dGF0aW9uIG9mIGF2YWlsYWJsZSBITEEgZ2VuZXMgKC1BLCAtQiwgLUMsIC1EUEIxLCAtRFFBMSwgLURRQjEsIC1EUkIxKSB0byBmb3VyLWRpZ2l0IGFsbGVsZXMuIA0KDQpBZnRlciBpbXB1dGF0aW9uLCBhbGxlbGVzIHdpdGggYSBNQUYgPiAxJSB3ZXJlIHJldGFpbmVkIGZvciBmdXJ0aGVyIGFuYWx5c2lzIChTdXBwbGVtZW50YXJ5IFRhYmxlIDIpLCBhbmQgbGluZWFyIG1peGVkLWVmZmVjdCBtb2RlbHMgd2VyZSB1c2VkIHRvIGV4cGxvcmUgdGhlaXIgaW1wYWN0IG9uIEFOQy4gRm9sbG93aW5nIExldmluIGV0IGFsLiAoMjAxNSksIGdlbm90eXBlcyB3ZXJlIHdlaWdodGVkIGJ5IHBvc3RlcmlvciBpbXB1dGF0aW9uIHByb2JhYmlsaXRpZXMgdG8gZGVyaXZlIHRoZWlyIGVzdGltYXRlZCBhbGxlbGUgZG9zYWdlLiBUaGVzZSB3ZXJlIG1lcmdlZCB3aXRoIHRoZSBGQkMvUEsgZGF0YXNldCBzbyB0aGF0IEhMQSBnZW5vdHlwZXMgd2VyZSBhc3NvY2lhdGVkIHdpdGggdGhlIGxvbmdpdHVkaW5hbCBhc3NheSBkYXRhIChOID0gNTQwOyAxLDYyNyBhc3NheXMpLiBFYWNoIEhMQSBhbGxlbGUgd2FzIGluY2x1ZGVkIGFzIGEgY292YXJpYXRlIGFsb25nc2lkZSBkYWlseSBjbG96YXBpbmUgZG9zZSwgcGxhc21hIGNsb3phcGluZSBhbmQgbm9yY2xvemFwaW5lIGNvbmNlbnRyYXRpb25zLCBURFMsIHNleCwgYWdlLCBhbmQgYWdlXjJeLiBDb3ZhcmlhdGVzIHdlcmUgc3RhbmRhcmRpc2VkIGFuZCByZWdyZXNzZWQgYWdhaW5zdCBBTkMsIHdpdGggcGFydGljaXBhbnQgSUQgaW5jbHVkZWQgYXMgYSByYW5kb20gaW50ZXJjZXB0IHRlcm0uIEEgdG90YWwgb2YgMTE2IGFsbGVsZXMgYWNyb3NzIDcgSExBIGdlbmVzIHdlcmUgaW5jbHVkZWQgaW4gdGhlIHJlZ3Jlc3Npb24gYW5hbHlzZXMuIENvcnJlY3Rpb24gZm9yIG11bHRpcGxlIGNvbXBhcmlzb25zIHdhcyBwZXJmb3JtZWQgdXNpbmcgdGhlIEZhbHNlIERpc2NvdmVyeSBSYXRlIChGRFIpIGFuZCBCb25mZXJyb25pIGNvcnJlY3Rpb24uDQoNCg0KYGBge3IgU1QyfQ0KI2ltcG9ydCBzdXBwbGVtZW50YXJ5IHRhYmxlIDIgZnJvbSBleGNlbCBmaWxlLg0KDQpzdDIgPC0gcmVhZHhsOjpyZWFkX3hsc3gocGF0aCA9ICJTdXBwbGVtZW50YXJ5IFRhYmxlcy54bHN4Iiwgc2hlZXQgPSAyLCBjb2xfbmFtZXMgPSBUUlVFKQ0KY2FwIDwtIHN0Mltucm93KHN0MiksMV0NCnN0MiA8LSBoZWFkKHN0MiwgLTIpDQoNCmthYmxlKHN0MiwNCiAgICAgIGNhcHRpb24gPSBjYXApICU+JQ0KICAgICAga2FibGVfc3R5bGluZygibm9uZSIsIGZ1bGxfd2lkdGggPSBULCBwb3NpdGlvbiA9ICJsZWZ0IiwgZm9udF9zaXplID0gMTYpICU+JQ0KICAgICAga2FibGVfY2xhc3NpYygpDQpgYGANCg0KPGJyPg0KPGJyPg0KPGJyPg0KPGJyPg0KDQojIyA8c3Ryb25nPiBTdXBwbGVtZW50YXJ5IE5vdGVzOiBTdGF0aXN0aWNhbCBNZXRob2RvbG9neSA8L3N0cm9uZz4gDQojIyMgU3VwcGxlbWVudGFyeSBOb3RlczogU3RhdGlzdGljYWwgTWV0aG9kb2xvZ3kNCg0KIyMjIyBFeGNsdXNpb24gb2YgdGhlIE1ldGFib2xpYyBSYXRpbyBWYXJpYWJsZQ0KUHJldmlvdXMgd29yayBkZW1vbnN0cmF0ZWQgdGhhdCBpbmNsdWRpbmcgdGhlIGNsb3phcGluZS9ub3JjbG96YXBpbmUgcmF0aW8gKOKAnG1ldGFib2xpYyByYXRpb+KAnSkgYXMgYSBjb3ZhcmlhdGUgaW4gYSByZWdyZXNzaW9uIG1vZGVsIG9mIEFOQyBjb25zaWRlcmFibHkgYXR0ZW51YXRlZCB0aGUgZWZmZWN0IHNpemVzIG9mIGJvdGggY2xvemFwaW5lIGFuZCBub3JjbG96YXBpbmUgcGxhc21hIGNvbmNlbnRyYXRpb25zXjIyXi4gIEhvd2V2ZXIsIGluY29ycG9yYXRpbmcgcmF0aW8gdmFyaWFibGVzIGluIHJlZ3Jlc3Npb24gbW9kZWxzIGhhcyBiZWVuIGNyaXRpY2lzZWQgb24gdGhlIGJhc2lzIHRoYXQgdGhleSBtYXkgcmVzdWx0IGluIGRlY2VwdGl2ZSBzdGF0aXN0aWNhbCBhcnRpZmFjdHNeMjNeLiBFcXVhbGx5LCBpdCBpcyBwb3NzaWJsZSB0aGF0IHRoZSBtZXRhYm9saWMgcmF0aW8gYWN0cyBhcyBhIGNvbGxpZGVyIHZhcmlhYmxlIChTdXBwbGVtZW50YXJ5IEZpZ3VyZSAyOyBTdXBwbGVtZW50YXJ5IFRhYmxlIDMpLiBDb250cm9sbGluZyBmb3IgY29sbGlkZXIgdmFyaWFibGVzIHRocm91Z2ggdGhlaXIgaW5jbHVzaW9uIGFzIGNvdmFyaWF0ZXMsIG1heSBhbHNvIGludHJvZHVjZSBzcHVyaW91cyBhc3NvY2lhdGlvbnMgYXMgZGVzY3JpYmVkIGluIHRoZSBjYXVzYWwgaW5mZXJlbmNlIGxpdGVyYXR1cmVeMjReLiAgVGhlcmVmb3JlLCB0aGUgZGVjaXNpb24gd2FzIG1hZGUgdG8gZXhjbHVkZSBtZXRhYm9saWMgcmF0aW8gZnJvbSB0aGUgcHJlc2VudCBhbmFseXNlcy4NCg0KDQpgYGB7ciBTRiAyLCBmaWcuYWxpZ249J2NlbnRlcicsIG91dC53aWR0aD0iMTIwMHB4IiwgZmlnLmNhcD0iU3VwcGxlbWVudGFyeSBGaWd1cmUgMi4gIFZhcmlhYmxlcyBpbmNsdWRlZCBpbiBEQUcgc2hvd2luZyB0aGUgcG9zc2libGUgY2F1c2FsIGFzc29jaWF0aW9ucyBiZXR3ZWVuIGNsb3phcGluZSBkb3NlIGFuZCBhYnNvbHV0ZSBuZXV0cm9waGlsIGNvdW50LiBQaW5rIGNpcmNsZXMgcmVwcmVzZW50IHRoZSBleHBvc3VyZSAoRGFpbHkgQ2xvemFwaW5lIERvc2UpIGFuZCBvdXRjb21lIChBYnNvbHV0ZSBOZXV0cm9waGlsKS4gTGlnaHQgZ3JlZW4gY2lyY2xlcyByZXByZXNlbnQgbWVhc3VyZWQgdmFyaWFibGVzLCB3aGVyZWFzIGRhcmsgZ3JlZW4gZGlhbW9uZHMgcmVwcmVzZW50IGxhdGVudCB2YXJpYWJsZXMuIERhcmsgZ3JleSBhcnJvd3MgcmVwcmVzZW50IHBhdGhzIGJldHdlZW4gb2JzZXJ2ZWQgdmFyaWFibGVzLCB3aGVyZWFzIGxpZ2h0IGdyZXkgYXJyb3dzIHJlcHJlc2VudCBhbnkgcGF0aCBpbiB3aGljaCBvbmUgKG9yIGJvdGgpIG9mIHRoZSB2YXJpYWJsZXMgaW52b2x2ZWQgYXJlIHVub2JzZXJ2ZWQuIEJsYWNrIHBhdGhzIHJlcHJlc2VudCBlZmZlY3RzIG9mIGludGVyZXN0IGluIHRoZSBtYWluIHJlZ3Jlc3Npb24gYW5kIG1lZGlhdGlvbiBhbmFseXNlcyAoc29saWQgPSBkaXJlY3QgZWZmZWN0OyBkb3R0ZWQgPSBpbmRpcmVjdCBlZmZlY3QgdmlhIG1lZGlhdG9yIDE7IGRhc2hlZCA9IGluZGlyZWN0IGVmZmVjdCB2aWEgbWVkaWF0b3JzIDEgJiAyOyBkb3QtZGFzaCA9IHBhdGggc2hhcmVkIGJ5IGJvdGggaW5kaXJlY3QgZWZmZWN0cykuIFRSUyA9IFRyZWF0bWVudCBSZXNpc3RhbnQgU2NoaXpvcGhyZW5pYTsgUEdTID0gUG9seWdlbmljIFNjb3JlOyBQR3ggPSBQaGFybWFjb2dlbm9taWM7IFREUz0gVGltZSBiZXR3ZWVuIERvc2UgYW5kIFNhbXBsZS4iLCBkZXYgPSAicG5nIiwgZGV2LmFyZ3M9bGlzdChiZz0idHJhbnNwYXJlbnQiKX0NCmtuaXRyOjppbmNsdWRlX2dyYXBoaWNzKCJTRmlnMi5wbmciKQ0KYGBgDQoNCjxicj4NCjxicj4NCg0KYGBge3IgU1QzLCBmaWcud2lkdGg9MTB9DQoNCiNpbXBvcnQgc3VwcGxlbWVudGFyeSB0YWJsZSAzIGZyb20gZXhjZWwgZmlsZS4gDQpzdDMgPC0gcmVhZHhsOjpyZWFkX3hsc3gocGF0aCA9ICJTdXBwbGVtZW50YXJ5IFRhYmxlcy54bHN4Iiwgc2hlZXQgPSAzLCBjb2xfbmFtZXMgPSBUUlVFKQ0KY2FwYSA8LSAiU3VwcGxlbWVudGFyeSBUYWJsZSAzYS4gVmFyaWFibGVzIEluY2x1ZGVkIGluIERBRyBzaG93aW5nIHRoZSBjYXVzYWwgYXNzb2NpYXRpb25zIGJldHdlZW4gY2xvemFwaW5lIGRvc2UgYW5kIGFic29sdXRlIG5ldXRyb3BoaWwgY291bnQgaW4gYSBzYW1wbGUgb2YgY2xvemFwaW5lIHVzZXJzIG5vdCBjdXJyZW50bHkgZXhwZXJpZW5jaW5nIG5ldXRyb3BlbmlhLiAgVGFibGUgM2Egc2hvd3MgdGhlIGluY2x1ZGVkIG5vZGVzIGFuZCB0aGVpciBwcm9wZXJ0aWVzLiINCg0KY2FwYiA8LSAiU3VwcGxlbWVudGFyeSBUYWJsZSAzYi4gVmFyaWFibGVzIEluY2x1ZGVkIGluIERBRyBzaG93aW5nIHRoZSBjYXVzYWwgYXNzb2NpYXRpb25zIGJldHdlZW4gY2xvemFwaW5lIGRvc2UgYW5kIGFic29sdXRlIG5ldXRyb3BoaWwgY291bnQgaW4gYSBzYW1wbGUgb2YgY2xvemFwaW5lIHVzZXJzIG5vdCBjdXJyZW50bHkgZXhwZXJpZW5jaW5nIG5ldXRyb3BlbmlhLiBUYWJsZSAzYiBzaG93cyB0aGUgcGF0aHMgaW5jbHVkZWQgYW5kIHRoZWlyIHJhdGlvbmFsZS4iDQpzdDMgPC0gaGVhZChzdDMsIC0yKQ0KDQojIHNwbGl0IHRhYmxlIHNvIGl0cyBtb3JlIGxlZ2libGUNCg0Kc3QzYSA8LSBzdDNbMTozXSAlPiUgbmEuZXhjbHVkZSgpDQpzdDNiIDwtIHN0M1s0OjhdICU+JSBuYS5leGNsdWRlKCkNCg0Kc3QzYiRTdW1tYXJ5IDwtIHN1YnN0cmluZyhzdDNiJFN1bW1hcnksMSwgbmNoYXIoc3QzYiRTdW1tYXJ5KS0yKQ0KDQoNCmthYmxlKHN0M2EsDQogICAgICBjYXB0aW9uID0gY2FwYSkgJT4lDQogICAgICBrYWJsZV9zdHlsaW5nKCJub25lIiwgZnVsbF93aWR0aCA9IFQsIHBvc2l0aW9uID0gImxlZnQiLCBmb250X3NpemUgPSAxNikgJT4lDQogICAgICBrYWJsZV9jbGFzc2ljKCkNCg0Ka2FibGUoc3QzYiwNCiAgICAgIGNhcHRpb24gPSBjYXBiKSAlPiUNCiAgICAgIGthYmxlX3N0eWxpbmcoIm5vbmUiLCBmdWxsX3dpZHRoID0gVCwgcG9zaXRpb24gPSAibGVmdCIsIGZvbnRfc2l6ZSA9IDE2KSAlPiUNCiAgICAgIGthYmxlX2NsYXNzaWMoKQ0KYGBgDQoNCjxicj4NCjxicj4NCg0KIyMjIyBSIFBhY2thZ2VzDQpUaGUgZnVsbCBDTE9aVUszIGRhdGFzZXQgd2FzIHVzZWQgZm9yIGxpbmVhciBtaXhlZC1lZmZlY3QgcmVncmVzc2lvbiBtb2RlbHMgYW5kIHNpbmdsZS1tZWRpYXRvciBhbmFseXNlcywgYmVuZWZpdHRpbmcgZnJvbSBtdWx0aXBsZSBGQkMvcGhhcm1hY29raW5ldGljIG1lYXN1cmVtZW50cyBwZXIgcGF0aWVudCBvdmVyIHRpbWUuICpsbWU0KiBhbmQgKmxtZXJUZXN0KiB3ZXJlIHVzZWQgdG8gZml0IHRoZSBMTU1zXjI1LDI2Xi4gVGhlICptZWRpYXRpb24qIHBhY2thZ2VeMjdeIHdhcyB1c2VkIHRvIHBlcmZvcm0gc2luZ2xlLW1lZGlhdGlvbiBhbmFseXNlcyBpbiB0aGUgbG9uZ2l0dWRpbmFsIGRhdGEuIA0KDQpUaGUgQ0xPWlVLMyBkYXRhc2V0IHdhcyB0cmFuc2Zvcm1lZCBpbnRvIGNyb3NzLXNlY3Rpb25hbCBkYXRhIGJ5IHRha2luZyB0aGUgbG93ZXN0IG9ic2VydmF0aW9uIG9mIEFOQyBmb3IgZWFjaCBwYXJ0aWNpcGFudC4gVGhpcyByZWR1Y2VkIGRhdGFzZXQgd2FzIHVzZWQgZm9yIG11bHRpcGxlLSwgYW5kIHNpbmdsZS1tZWRpYXRvciBhbmFseXNlcyB1c2luZyBTdHJ1Y3R1cmFsIEVxdWF0aW9uIE1vZGVsbGluZyAoU0VNKSBpbiAqbGF2YWFuKl4yOF4sIGFuZCBpbiByZXBsaWNhdGlvbiBhbmFseXNlcyAoaS5lLiwgTGluZWFyIE1vZGVscykgb2YgcHJldmlvdXMgcmVzZWFyY2heMjIsMjleLiBCZWZvcmUgaW5jbHVzaW9uIGluIGFsbCByZWdyZXNzaW9uIGFuZCBzdHJ1Y3R1cmFsIGVxdWF0aW9uIG1vZGVscywgY292YXJpYXRlcyB3ZXJlIHN0YW5kYXJkaXNlZCAobWVhbi1jZW50cmVkIGFuZCBzY2FsZWQpIHVzaW5nIHRoZSAqZGF0YXdpemFyZCogUiBwYWNrYWdlXjMwXi4gDQoNCg0KPGJyPg0KPGJyPg0KDQojIyMjIERlcml2aW5nIFJlc2lkdWFscyBmb3IgdXNlIGluIFN0cnVjdHVyYWwgRXF1YXRpb24gTW9kZWxsaW5nDQpUbyBhY2NvdW50IGZvciBjb3ZhcmlhdGVzIGluIHRoZSBtZWRpYXRpb24gYW5hbHlzaXMsIHJlc2lkdWFsaXNlZCB2YXJpYWJsZXMgd2VyZSBpbmNvcnBvcmF0ZWQgZHVyaW5nIFNFTS4gRWFjaCB2YXJpYWJsZSB3YXMgZml0IGFzIGFuIG91dGNvbWUgaW4gc2VwYXJhdGUgcmVncmVzc2lvbiBhbmFseXNlcywgd2l0aCB0aGUgY292YXJpYXRlcywgYWdlLCBhZ2VeMl4sIHNleCwgYW5kIFREUy4gQU5DIHdhcyBpbmNsdWRlZCBhcyB0aGUgb3V0Y29tZSBpbiBhIGxpbmVhciBtb2RlbC4gRGFpbHkgY2xvemFwaW5lIGRvc2Ugd2FzIGxvZy10cmFuc2Zvcm1lZCBhbmQgaW5jbHVkZWQgYXMgYW4gb3V0Y29tZSB2YXJpYWJsZSBpbiBhIGxpbmVhciBtb2RlbC4gUGxhc21hIENsb3phcGluZSBhbmQgTm9yY2xvemFwaW5lIGxldmVscyB3ZXJlIGluY2x1ZGVkIGluIGEgZ2VuZXJhbGlzZWQgbGluZWFyIG1vZGVsIHVzaW5nIGEgZ2FtbWEgZGlzdHJpYnV0aW9uIGFuZCBsb2cgbGluayBmdW5jdGlvbi4gTGluZWFyIG1vZGVscyB3ZXJlIGZpdCB1c2luZyB0aGUgKmxtKCkqIGZ1bmN0aW9uLCBhbmQgZ2VuZXJhbGlzZWQgbGluZWFyIG1vZGVscyB3ZXJlIGZpdCB1c2luZyB0aGUgKmdsbSgpKiBmdW5jdGlvbi4gIFRoZSByZXNpZHVhbHMgb2YgdGhlIHByZWRpY3RvcnMgd2VyZSBzdGFuZGFyZGlzZWQgYW5kIHRoZW4gdXNlZCBpbiBwbGFjZSBvZiB0aGVpciBwYXJlbnQgbWVhc3VyZSBhY3Jvc3MgYWxsIG1lZGlhdGlvbiBhbmFseXNlcyB1bmxlc3Mgb3RoZXJ3aXNlIHNwZWNpZmllZC4gSW4gYSBmdXJ0aGVyIG1vZGVsLCB0aGUgaW1wYWN0IG9mIENZUDFBMiBhY3Rpdml0eSBzY29yZSB3YXMgYWNjb3VudGVkIGZvciBieSBpbmNsdWRpbmcgaXQgYWxvbmdzaWRlIGFnZSwgYWdlXjJeLCBzZXgsIGFuZCBURFMgaW4gdGhlIHJlZ3Jlc3Npb24gbW9kZWxzIHRvIHByb2R1Y2UgdGhlIHJlc2lkdWFsaXNlZCB2YXJpYWJsZXMuDQoNCjxicj4NCjxicj4NCjxicj4NCjxicj4NCiANCiMjIDxzdHJvbmc+IFN1cHBsZW1lbnRhcnkgTm90ZXM6IFNlY29uZGFyeSBBbmFseXNpcyA8L3N0cm9uZz4NCiMjIyBTdXBwbGVtZW50YXJ5IE5vdGVzOiBTZWNvbmRhcnkgQW5hbHlzaXMNCg0KIyMjIyBFeHRlbmRpbmcgdGhlIExpbmVhciBNaXhlZCBFZmZlY3QgTW9kZWwgd2l0aCAgR2VuZXRpYyBDb3ZhcmlhdGVzDQoNCmBgYHtyIGFkZGl0aW9uYWwgZ2VuZXRpYyBsbW19DQojIGFkZGl0aW9uYWwgbG1tIGFuYWx5c2lzIHdpdGggZ2VuZXRpYyBjb3ZhcmlhdGVzDQoNCmFuY19kY250XzFhMl9hc3NzIDwtIGxtZXIobmV1dF9udW1+ZGFpbHlkb3NlK2Nsb3phcGluZStub3JjbG96YXBpbmUrZXN0X3Njb3JlK1REUytTRVgrYWdlX2F0X2Fzc2F5K3N0ZF9hZ2UyICsgKDF8TFVJTiksIGRhdGE9Q0xPWlVLMy5mYmMucGsuZ2VuLnN0ZCkgIyBhY3Rpdml0eSBzY29yZSArIG5vIFNOUHMNCg0KYW5jX2RjbnRfMWEyX2FzcyA8LSBsbWVyKG5ldXRfbnVtfmRhaWx5ZG9zZStjbG96YXBpbmUrbm9yY2xvemFwaW5lK2VzdF9zY29yZStyczI0NzIyOTdfVCtURFMrU0VYK2FnZV9hdF9hc3NheStzdGRfYWdlMiArICgxfExVSU4pLCBkYXRhPUNMT1pVSzMuZmJjLnBrLmdlbi5zdGQpICMgYWN0aXZpdHkgc2NvcmUgKyBTTlANCg0KYW5jX2RjbnRkbiA8LSBsbWVyKG5ldXRfbnVtfmRhaWx5ZG9zZStjbG96YXBpbmUrbm9yY2xvemFwaW5lK1REUysrU0VYK2FnZV9hdF9hc3NheStzdGRfYWdlMitkdWZmeW51bGwgKyAoMXxMVUlOKSwgZGF0YT1DTE9aVUszLmZiYy5way5nZW4uc3RkKSAgIyBkdWZmeSBudWxsIGFkZGVkIGFzIGNvdmFyaWF0ZQ0KDQphbmNfZGNudHBycyA8LSBsbWVyKG5ldXRfbnVtfmRhaWx5ZG9zZStjbG96YXBpbmUrbm9yY2xvemFwaW5lK1REUytTRVgrYWdlX2F0X2Fzc2F5K3N0ZF9hZ2UyK2NfUFJTK25fUFJTK1NFWCthZ2VfYXRfYXNzYXkrc3RkX2FnZTIgKyAoMXxMVUlOKSwgZGF0YT1DTE9aVUszLmZiYy5way5nZW4uc3RkKSAjIFBSUyBmb3IgY2xvemFwaW5lIG1ldGFib2xpc20gYW5kIG5vcmNsb3phcGluZSBtZXRhYm9saXNtIGFkZGVkIGFzIGNvdmFyaWF0ZS4NCg0KDQpjb2Vmc19ub3NucCA8LSBkYXRhLmZyYW1lKGNvZWYoc3VtbWFyeShhbmNfZGNudF8xYTJfYXNzcykpKSANCmNvZWZzX3NucCA8LSBkYXRhLmZyYW1lKGNvZWYoc3VtbWFyeShhbmNfZGNudF8xYTJfYXNzKSkpIA0KY29lZnMyIDwtIGRhdGEuZnJhbWUoY29lZihzdW1tYXJ5KGFuY19kY250ZG4pKSkgDQpjb2VmczMgPC0gZGF0YS5mcmFtZShjb2VmKHN1bW1hcnkoYW5jX2RjbnRwcnMpKSkNCg0KYGBgDQoNClRvIGFzc2VzcyB0aGUgaW1wYWN0LCBpZiBhbnksIG9mIHJzMjQ3MjI5NyBvbiB0aGUgYXNzb2NpYXRpb24gYmV0d2VlbiBDWVAxQTIgYWN0aXZpdHkgc2NvcmUgd2l0aCBBTkMgKFN1cHBsZW1lbnRhcnkgVGFibGUgNCksIHR3byBsaW5lYXIgbWl4ZWQtZWZmZWN0IG1vZGVscyB3ZXJlIGZpdCB3aXRoIGFuZCB3aXRob3V0IHRoZSBTTlAgYXMgYW4gYWRkaXRpb25hbCBjb3ZhcmlhdGUgaW4gdGhlIG1vZGVsLiBDWVAxQTIgYWN0aXZpdHkgc2NvcmUgd2FzIHNpZ25pZmljYW50bHkgYXNzb2NpYXRlZCB3aXRoIEFOQyAozrIgPSBgciByb3VuZChjb2Vmc19ub3NucFs1LDFdLCBkaWdpdHMgPSAzKWA7ICpwKiA9IGByIHJvdW5kKGNvZWZzX25vc25wWzUsNV0sIGRpZ2l0cyA9IDMpYCkuIFdoZW4gdGhlIFNOUCB3YXMgaW5jbHVkZWQgYXMgYSBjb3ZhcmlhdGUsIHRoZXJlIHdhcyBuZWdsaWdpYmxlIGNoYW5nZSBpbiB0aGUgZWZmZWN0IHNpemUgb2YgQ1lQMUEyIGFjdGl2aXR5IHNjb3JlICjOsiA9IGByIHJvdW5kKGNvZWZzX3NucFs1LDFdLCBkaWdpdHMgPSAzKWA7ICpwKiA9IGByIHJvdW5kKGNvZWZzX3NucFs1LDVdLCBkaWdpdHMgPSAzKWApLCBhbmQgYXMgaW4gdGhlIHByZXZpb3VzIHBoYXJtYWNvZ2Vub21pYyBhbmFseXNpcyAoVGFibGUgMywgTWFpbiBUZXh0KSwgcnMyNDcyMjk3IHdhcyBub3QgYXNzb2NpYXRlZCB3aXRoIEFOQyBpbiB0aGlzIG1vZGVsICjOsiA9IGByIHJvdW5kKGNvZWZzX3NucFs2LDFdLCBkaWdpdHMgPSAzKWA7ICpwKiA9IGByIHJvdW5kKGNvZWZzX3NucFs2LDVdLCBkaWdpdHMgPSAzKWApLiBUaGlzIGluZGljYXRlcyB0aGF0IHRoZSBvYnNlcnZlZCBhc3NvY2lhdGlvbiBiZXR3ZWVuIENZUDFBMiBhY3Rpdml0eSBzY29yZSBhbmQgQU5DIGlzIGxpa2VseSBub3QgY29uZmxhdGVkIHdpdGggcnMyNDcyMjk3LiANCg0KDQpgYGB7ciBTVDR9DQojY3JlYXRlIHRhYmxlIC0gY3lwMWEyIGFjdGl2aXR5IHNjb3JlIHdpdGggYW5kIHdpdGhvdXQgcnMyNDcyMjk3DQp0YWJfbW9kZWwoYW5jX2RjbnRfMWEyX2Fzc3MsIGFuY19kY250XzFhMl9hc3MsICBzaG93LmVzdCA9IFRSVUUsIHNob3cuc2UgPSBUUlVFLCBzaG93LmNpID0gRkFMU0UsDQogICAgICAgICAgICAgICAgICAgICBzaG93LnAgPSBGLCBjb2xsYXBzZS5zZSA9ICBUUlVFLCBzaG93LmludGVyY2VwdCA9IEZBTFNFLCBlbXBoLnAgPSBUUlVFLCBkaWdpdHMgPSAzLCBkaWdpdHMucmUgPSAzLA0KICAgICAgICAgICAgICAgICAgICAgI29yZGVyLnRlcm1zID0gYygxLCAyLCA3LCAzLCA0LCA1ICw2KSwNCiAgICAgICAgICAgICAgICAgICAgIHN0cmluZy5wcmVkID0gIlByZWRpY3RvciIsIHN0cmluZy5lc3QgPSAiRXN0aW1hdGUgKFNFKSIsDQogICAgICAgICAgICAgICAgICAgICBwcmVkLmxhYmVscyA9IGFsbF9sYWJlbHMsDQogICAgICAgICAgICAgICAgICAgICBkdi5sYWJlbHMgPSBjKCJBY3Rpdml0eSBTY29yZSBBbG9uZSIsICJJbmNsdWRpbmcgcnMyNDcyMjk3IiksDQogICAgICAgICAgICAgICAgICAgICBDU1MgPSBsaXN0KGNzcy50YWJsZSA9ICcrZm9udC1mYW1pbHk6IFJvYm90bzsgd2lkdGg6IDEwMCU7JywgY3NzLmRlcHZhcmhlYWQgPSAnK2ZvbnQtc3R5bGU6IG5vcm1hbDsgZm9udC13ZWlnaHQ6IG5vcm1hbDsgdGV4dC1hbGlnbiA9IGNlbnRyZScsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNzcy50aGVhZCA9ICdib3JkZXItdG9wOiBibGFuazsgdGV4dC1hbGlnbiA9IGNlbnRyZTsgcGFkZGluZzogMC41Y207JywgY3NzLnRkYXRhID0gJ3BhZGRpbmc6IDAuMjVjbTsgdGV4dC1hbGlnbiA9IGNlbnRyZTsnLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjc3MucmFuZG9tcGFydHMgPSAnYm9yZGVyLXRvcDoxcHggc29saWQ7JywgY3NzLmZpcnN0dGFibGVyb3cgPSAnYm9yZGVyLWJvdHRvbTogYmxhbmsnLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjc3MuZmlyc3RzdW1yb3cgPSAnYm9yZGVyLXRvcDogMXB4IHNvbGlkJywgY3NzLmZvb3Rub3RlID0gJ3RleHQtYWxpZ246IGxlZnQ7JywgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNzcy5zdW1tYXJ5ID0gInBhZGRpbmctdG9wOjAuMmNtOyBwYWRkaW5nLWJvdHRvbTowLjJjbTsiKSwgDQogICAgICAgICAgICAgICAgICAgICB0aXRsZSA9ICJTdXBwbGVtZW50YXJ5IFRhYmxlIDQuIFJlc3VsdHMgb2YgdHdvIGxpbmVhciBtaXhlZCBlZmZlY3QgbW9kZWxzIGluY2x1ZGluZyBnZW5ldGljIHByZWRpY3RvcnMgb2YgQWJzb2x1dGUgTmV1dHJvcGhpbCBDb3VudC4gU3RhbmRhcmRpc2VkIHJlZ3Jlc3Npb24gY29lZmZpY2llbnRzIHJlcG9ydGVkIGFsb25nc2lkZSBzdGFuZGFyZCBlcnJvciBhbmQgZXN0aW1hdGVkIHAgdmFsdWVkIGJhc2VkIG9uIG5vcm1hbCBkaXN0cmlidXRpb24uIFREUyA9IFRpbWUgYmV0d2VlbiBEb3NlIGFuZCBTYW1wbGU7IEFOQyA9IEFic29sdXRlIE5ldXRyb3BoaWwgQ291bnQ7IFBHeCA9IFBoYXJtYWNvZ2Vub21pYzsgUFJTID0gUG9seWdlbmljIFJpc2sgU2NvcmVzOyBMVUlOID0gUGFydGljaXBhbnQgSWRlbnRpZmllciB1c2VkIGluIENMT1pVSzM7IElDQyA9IEludHJhY2xhc3MgQ29ycmVsYXRpb24gQ29lZmZpY2llbnQuIiwNCiAgICAgICAgICAgICAgICAgICAgIHAuc3R5bGUgPSAic3RhcnMiDQopDQoNCmBgYA0KDQo8YnI+DQo8YnI+DQoNClRoZXJlIHdhcyBubyBldmlkZW5jZSBvZiBhc3NvY2lhdGlvbnMgYmV0d2VlbiBQb2x5Z2VuaWMgU2NvcmVzIGZvciBuZWl0aGVyIGNsb3phcGluZSBhc3NvY2lhdGlvbiAozrIgPSBgciByb3VuZChjb2VmczNbOSwxXSwgZGlnaXRzID0gMylgOyAqcCogPSBgciByb3VuZChjb2VmczNbOSw1XSwgZGlnaXRzID0gMylgKSBvciBub3JjbG96YXBpbmUgbWV0YWJvbGlzbSBhc3NvY2lhdGlvbiAozrIgPSBgciByb3VuZChjb2VmczNbMTAsMV0sIGRpZ2l0cyA9IDMpYDsgKnAqID0gYHIgcm91bmQoY29lZnMzWzEwLDVdLCBkaWdpdHMgPSAzKWApIHdpdGggQU5DLiBIb3dldmVyLCBhIHN0cm9uZyBuZWdhdGl2ZSBhc3NvY2lhdGlvbiAozrIgPSBgciByb3VuZChjb2VmczJbOSwxXSwgZGlnaXRzID0gMylgOyAqcCogPSBgciByb3VuZChjb2VmczJbOSw1XSwgZGlnaXRzID0gMylgKSBiZXR3ZWVuIHRoZSBEdWZmeS1OdWxsIGdlbm90eXBlIGFuZCBBTkMgd2FzIG9ic2VydmVkIGluIHRoZSBDTE9aVUszIHNhbXBsZS4gVGhlIHByZXNlbmNlIG9mIHRoZSBEdWZmeS1OdWxsIGdlbm90eXBlIHdhcyBsaW5rZWQgd2l0aCBhIGRlY2xpbmUgaW4gbmV1dHJvcGhpbHMgb2YgYXBwcm94aW1hdGVseSA3NzAgY2VsbHMvbW1eM14gaW4gY29tcGFyaXNvbiB0byBub24tY2FycmllcnMuIEZ1bGwgZXN0aW1hdGVzIGZyb20gdGhlc2UgYWRkaXRpb25hbCBnZW5ldGljIG1vZGVscyBhcmUgaW5jbHVkZWQgaW4gU3VwcGxlbWVudGFyeSBUYWJsZSA1Lg0KDQpgYGB7ciBTVDV9DQojIGNyZWF0ZSB0YWJsZSAtIGR1ZmZ5IG51bGwgYW5kIFBSUw0KdGFiX21vZGVsKGFuY19kY250ZG4sIGFuY19kY250cHJzLCAgc2hvdy5lc3QgPSBUUlVFLCBzaG93LnNlID0gVFJVRSwgc2hvdy5jaSA9IEZBTFNFLA0KICAgICAgICAgICAgICAgICAgICAgc2hvdy5wID0gRiwgY29sbGFwc2Uuc2UgPSAgVFJVRSwgc2hvdy5pbnRlcmNlcHQgPSBGQUxTRSwgZW1waC5wID0gVFJVRSwgZGlnaXRzID0gMywgZGlnaXRzLnJlID0gMywNCiAgICAgICAgICAgICAgICAgICAgICNvcmRlci50ZXJtcyA9IGMoMSwgMiwgNywgMywgNCwgNSAsNiksDQogICAgICAgICAgICAgICAgICAgICBzdHJpbmcucHJlZCA9ICJQcmVkaWN0b3IiLCBzdHJpbmcuZXN0ID0gIkVzdGltYXRlIChTRSkiLA0KICAgICAgICAgICAgICAgICAgICAgcHJlZC5sYWJlbHMgPSBhbGxfbGFiZWxzLA0KICAgICAgICAgICAgICAgICAgICAgZHYubGFiZWxzID0gYygiTW9kZWwgKyBETiIsICJNb2RlbCArIFBSUyIpLA0KICAgICAgICAgICAgICAgICAgICAgQ1NTID0gbGlzdChjc3MudGFibGUgPSAnK2ZvbnQtZmFtaWx5OiBSb2JvdG87IHdpZHRoOiAxMDAlOycsIGNzcy5kZXB2YXJoZWFkID0gJytmb250LXN0eWxlOiBub3JtYWw7IGZvbnQtd2VpZ2h0OiBub3JtYWw7IHRleHQtYWxpZ24gPSBjZW50cmUnLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjc3MudGhlYWQgPSAnYm9yZGVyLXRvcDogYmxhbms7IHRleHQtYWxpZ24gPSBjZW50cmU7IHBhZGRpbmc6IDAuNWNtOycsIGNzcy50ZGF0YSA9ICdwYWRkaW5nOiAwLjI1Y207IHRleHQtYWxpZ24gPSBjZW50cmU7JywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3NzLnJhbmRvbXBhcnRzID0gJ2JvcmRlci10b3A6MXB4IHNvbGlkOycsIGNzcy5maXJzdHRhYmxlcm93ID0gJ2JvcmRlci1ib3R0b206IGJsYW5rJywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3NzLmZpcnN0c3Vtcm93ID0gJ2JvcmRlci10b3A6IDFweCBzb2xpZCcsIGNzcy5mb290bm90ZSA9ICd0ZXh0LWFsaWduOiBsZWZ0OycsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjc3Muc3VtbWFyeSA9ICJwYWRkaW5nLXRvcDowLjJjbTsgcGFkZGluZy1ib3R0b206MC4yY207IiksIA0KICAgICAgICAgICAgICAgICAgICAgdGl0bGUgPSAiU3VwcGxlbWVudGFyeSBUYWJsZSA1LiBSZXN1bHRzIG9mIHR3byBsaW5lYXIgbWl4ZWQgZWZmZWN0IG1vZGVscyBpbmNsdWRpbmcgZ2VuZXRpYyBwcmVkaWN0b3JzIG9mIEFic29sdXRlIE5ldXRyb3BoaWwgQ291bnQuIFN0YW5kYXJkaXNlZCByZWdyZXNzaW9uIGNvZWZmaWNpZW50cyByZXBvcnRlZCBhbG9uZ3NpZGUgc3RhbmRhcmQgZXJyb3IgYW5kIGVzdGltYXRlZCBwIHZhbHVlZCBiYXNlZCBvbiBub3JtYWwgZGlzdHJpYnV0aW9uLiBURFMgPSBUaW1lIGJldHdlZW4gRG9zZSBhbmQgU2FtcGxlOyBBTkMgPSBBYnNvbHV0ZSBOZXV0cm9waGlsIENvdW50OyBQR3ggPSBQaGFybWFjb2dlbm9taWM7IFBHUyA9IFBvbHlnZW5pYyBTY29yZTsgTFVJTiA9IFBhcnRpY2lwYW50IElkZW50aWZpZXIgdXNlZCBpbiBDTE9aVUszOyBJQ0MgPSBJbnRyYWNsYXNzIENvcnJlbGF0aW9uIENvZWZmaWNpZW50LiIsDQogICAgICAgICAgICAgICAgICAgICBwLnN0eWxlID0gInN0YXJzIg0KKQ0KYGBgDQoNCjxicj4NCjxicj4NCg0KSExBIGdlbm90eXBlcyB3ZXJlIHNpbWlsYXJseSBpbmNsdWRlZCBpbiBsaW5lYXIgbWl4ZWQtZWZmZWN0IG1vZGVscyB0byBleHBsb3JlIHdoZXRoZXIgdmFyaWF0aW9uIGluIHRoZSBITEEgcmVnaW9uIGluZmx1ZW5jZWQgbmV1dHJvcGhpbCBsZXZlbHMgaW4gY2xvemFwaW5lIHVzZXJzLiBBbiBvdmVydmlldyBvZiB0aGVzZSBmaW5kaW5ncyBpcyBzaG93biBpbiBTdXBwbGVtZW50YXJ5IFRhYmxlIDYuIEFmdGVyIGNvbnRyb2xsaW5nIGZvciBtdWx0aXBsZSBjb21wYXJpc29ucywgbm8gSExBIGFsbGVsZXMgd2VyZSBzaWduaWZpY2FudGx5IGFzc29jaWF0ZWQgd2l0aCBBTkMgaW4gdGhlIENMT1pVSzMgc2FtcGxlOyB0aGlzIHN1Z2dlc3RzIGxpdHRsZSBpbmZsdWVuY2Ugb2YgdGhlIEhMQSByZWdpb24gb24gbmV1dHJvcGhpbCBjb3VudHMgaW4gdGhlc2UgcGFydGljaXBhbnRzLiBQcmlvciB0byB0aGlzIGNvcnJlY3Rpb24sIDMgSExBIGFsbGVsZXMgZGVtb25zdHJhdGVkIG5vbWluYWxseSBzaWduaWZpY2FudCBhc3NvY2lhdGlvbnMuIFRoZXNlIGluY2x1ZGVkICpITEEtRFJCMSAxNjowMSogKM6yID0gMC4wODc7ICpwKiA9IDAuMDAxKSBhbmQgKkhMQS1EUkIxIDA0OjA0KiAozrIgPSAwLjA3MzsgKnAqID0gMC4wMTEpLCB3aGljaCB3ZXJlIHBvc2l0aXZlbHkgYXNzb2NpYXRlZCB3aXRoIEFOQywgYWxvbmdzaWRlICpITEEtRFJCMSAwMTowMyogKM6yID0gLTAuMDY4OyAqcCogPSAwLjAxNiksIHdoaWNoIHdhcyBpbnZlcnNlbHkgYXNzb2NpYXRlZCB3aXRoIEFOQy4gDQoNCg0KYGBge3IgU1Q2fQ0Kc3Q2IDwtIHJlYWR4bDo6cmVhZF94bHN4KHBhdGggPSAiU3VwcGxlbWVudGFyeSBUYWJsZXMueGxzeCIsIHNoZWV0ID0gNiwgY29sX25hbWVzID0gVFJVRSkNCmNhcCA8LSBzdDZbbnJvdyhzdDYpLDFdDQpzdDYgPC0gaGVhZChzdDYsIC0zKQ0KDQoNCkRUOjpkYXRhdGFibGUoc3Q2KQ0KDQoNCmBgYA0KDQoqKlN1cHBsZW1lbnRhcnkgVGFibGUgNi4gQ29uZGVuc2VkIHJlc3VsdHMgb2YgTGluZWFyIE1peGVkIE1vZGVscyBleHBsb3JpbmcgcHJlZGljdG9ycyBvZiBBYnNvbHV0ZSBOZXV0cm9waGlsIENvdW50IChBTkMpIGluIHRoZSBDTE9aVUszIHNhbXBsZS4gSExBIGdlbm90eXBlIHdhcyBpbmNsdWRlZCBhcyBhIHByZWRpY3RvciBhbG9uZ3NpZGUgcGhhcm1hY29raW5ldGljIHZhcmlhYmxlcyAoaS5lLiwgZGFpbHkgY2xvemFwaW5lIGRvc2UsIHBsYXNtYSBjbG96YXBpbmUgYW5kIG5vcmNsb3phcGluZSBjb25jZW50cmF0aW9uKSBhbmQgIG90aGVyIGNvdmFyaWF0ZXMgKGkuZS4sIFREUywgc2V4LCBhZ2UsIGFnZV4yXikuIFN0YW5kYXJkaXNlZCByZWdyZXNzaW9uIGNvZWZmaWNpZW50cyBmb3IgdGhlIGVmZmVjdCBvZiBITEEgZ2Vub3R5cGUgZnJvbSBlYWNoIGFuYWx5c2lzIGFsb25lIGFyZSByZXBvcnRlZCBhbG9uZ3NpZGUgc3RhbmRhcmQgZXJyb3IgYW5kIHAgdmFsdWVzIGVzdGltYXRlZCB1c2luZyAqbG1lclRlc3QqIHBhY2thZ2UuIEJvbmZlcnJvbmkgJiBGRFItYWRqdXN0ZWQgcCB2YWx1ZXMgYXJlIGFsc28gcmVwb3J0ZWQuIEhMQSA9IEh1bWFuIExldWtvY3l0ZSBBbnRpZ2VuOyBGRFIgPSBGYWxzZSBEaXNjb3ZlcnkgUmF0ZS4qKg0KDQo8YnI+DQo8YnI+DQoNCiMjIyMgQ29udHJvbGxpbmcgZm9yIENZUDFBMiBBY3Rpdml0eSBpbiB0aGUgTWVkaWF0aW9uIEFuYWx5c2lzDQoNCg0KYGBge3IgZ2VuZXRpYyBtZWRpYXRpb24gYW5hbHlzZXMsIGluY2x1ZGU9RkFMU0V9DQoNCiMgY3JlYXRlIHJlc2lkdWFscyBpbiB0aGUgc2FtZSB3YXkgYXMgYmVmb3JlIGJ1dCB0aGlzIHRpbWUgaW5jbHVkaW5nIGN5cDFhMiBhY3Rpdml0eSBzY29yZSBhIGNvdmFyaWF0ZS4NCkNMT1pVSzMuZmJjLnBrLmdlbi5taW4kbG9nX2Rvc2UgPSBOQQ0KQ0xPWlVLMy5mYmMucGsuZ2VuLm1pbiRsb2dfZG9zZSA9IGxvZyhDTE9aVUszLmZiYy5way5nZW4ubWluJGRhaWx5ZG9zZSkNCg0KcmVnX2Rvc2VfdSA8LSBsbShsb2dfZG9zZSB+IFREUytTRVgrYWdlX2F0X2Fzc2F5K3N0ZF9hZ2UyK2VzdF9zY29yZSwgZGF0YT1DTE9aVUszLmZiYy5way5nZW4ubWluKSRyZXNpZHVhbHMNCnJlZ19jbG96X2cgPC0gZ2xtKGNsb3phcGluZSB+IFREUytTRVgrYWdlX2F0X2Fzc2F5K3N0ZF9hZ2UyK2VzdF9zY29yZSwgZGF0YT1DTE9aVUszLmZiYy5way5nZW4ubWluLCBmYW1pbHkgPSBHYW1tYShsaW5rID0gbG9nKSkkcmVzaWR1YWxzDQpyZWdfbm9yX2cgPC0gZ2xtKG5vcmNsb3phcGluZSB+IFREUytTRVgrYWdlX2F0X2Fzc2F5K3N0ZF9hZ2UyK2VzdF9zY29yZSwgZGF0YT1DTE9aVUszLmZiYy5way5nZW4ubWluLCBmYW1pbHkgPSBHYW1tYShsaW5rID0gbG9nKSkkcmVzaWR1YWxzDQpyZWdfYW5jX3UgPC0gbG0obmV1dF9udW0gfiBURFMrU0VYK2FnZV9hdF9hc3NheStzdGRfYWdlMitlc3Rfc2NvcmUsIGRhdGE9Q0xPWlVLMy5mYmMucGsuZ2VuLm1pbikkcmVzaWR1YWxzDQoNCiMgZ2V0IHZhcmlhYmxlcyBhbmQgbWFrZSBkYXRhZnJhbWUNCkRvc2UgPC0gcmVnX2Rvc2VfdQ0KQ2xvemFwaW5lIDwtIHJlZ19jbG96X2cNCkFOQyA8LSByZWdfYW5jX3UNCk5vcmNsb3phcGluZSA8LSByZWdfbm9yX2cNCkRhdGEgPC0gZGF0YS5mcmFtZShEb3NlID0gRG9zZSwgQU5DID0gQU5DLCBDbG96YXBpbmUgPSBDbG96YXBpbmUsIE5vcmNsb3phcGluZSA9IE5vcmNsb3phcGluZSkNCg0KDQojIHN0YW5kYXJkaXNlIHByaW9yIHRvIHNlbSBzbyBlcXVpdmFsZW50IHRvIHBhc3Qgb25lcw0KRGF0YV9wZ3ggPC0gZGF0YXdpemFyZDo6c3RhbmRhcmRpc2UoeCA9IERhdGEsIHNlbGVjdCA9IGMoIkRvc2UiLCAiQ2xvemFwaW5lIiwgIk5vcmNsb3phcGluZSIpKQ0KDQojIG1lZGlhdGlvbiBhbmFseXNpcyB3aGVyZSBpbmNsdWRlZCB2YXJpYWJsZXMgaGF2ZSBoYWQgQ1lQMUEyIGFjdGl2aXR5IHNjb3JlIHJlc2lkdWFsaXNlZCBvdXQuIA0KbXVsdGlwbGVNZWRpYXRpb24gPC0gJw0KQU5DIH4gYjEgKiBDbG96YXBpbmUgKyBiMiAqIE5vcmNsb3phcGluZSArIGMgKiBEb3NlDQpDbG96YXBpbmUgfiBhMSAqIERvc2UNCk5vcmNsb3phcGluZSB+IGQyMSAqIENsb3phcGluZQ0KaW5kaXJlY3QxIDo9IGExICogYjENCmluZGlyZWN0MiA6PSBhMSAqIGQyMSAqIGIyDQp0b3RhbCA6PSBjICsgKGExICogYjEpICsgKGExICogZDIxICogYjIpDQpDbG96YXBpbmUgfn4gTm9yY2xvemFwaW5lDQonDQoNCg0KZml0M19wZ3ggPC0gc2VtKG1vZGVsID0gbXVsdGlwbGVNZWRpYXRpb24sIGRhdGEgPSBEYXRhX3BneCkNCiAgIA0KDQoNCiMgb3JpZ2luYWwgbWVkaWF0aW9uIGFuYWx5c2lzIChDWVAxQTIgdW5jb250cm9sbGVkKSBidXQgb24gc3Vic2V0IG9mIHRoZSBzYW1wbGUgZm9yIHdob20gd2UgaGF2ZSBnZW5ldGljIGRhdGEgYXZhaWxhYmxlLiANCkRhdGFfZ2VuX29ubHkgPC0gRGF0YV9vZ1tEYXRhX29nJExVSU4gJWluJSBEYXRhX3BneCRMVUlOLF0NCg0KbXVsdGlwbGVNZWRpYXRpb24gPC0gJw0KQU5DIH4gYjEgKiBDbG96YXBpbmUgKyBiMiAqIE5vcmNsb3phcGluZSArIGMgKiBEb3NlDQpDbG96YXBpbmUgfiBhMSAqIERvc2UNCk5vcmNsb3phcGluZSB+IGQyMSAqIENsb3phcGluZQ0KaW5kaXJlY3QxIDo9IGExICogYjENCmluZGlyZWN0MiA6PSBhMSAqIGQyMSAqIGIyDQp0b3RhbCA6PSBjICsgKGExICogYjEpICsgKGExICogZDIxICogYjIpDQpDbG96YXBpbmUgfn4gTm9yY2xvemFwaW5lDQonDQoNCg0KZml0M19yZWQgPC0gc2VtKG1vZGVsID0gbXVsdGlwbGVNZWRpYXRpb24sIGRhdGEgPSBEYXRhKQ0KICAgDQpgYGANCg0KDQpMaW5lYXIgbWl4ZWQtZWZmZWN0IG1vZGVscyByZXZlYWxlZCBhIHNpZ25pZmljYW50IGFzc29jaWF0aW9uIGJldHdlZW4gQ1lQMUEyIGFjdGl2aXR5IHNjb3JlIGFuZCBBTkMgaW4gdGhlIENMT1pVSzMgc2FtcGxlLiBUaHVzLCB0byBhY2NvdW50IGZvciB0aGUgaW1wYWN0IG9mIHRoaXMgcGhhcm1hY29nZW5vbWljIHZhcmlhdGlvbiBvbiBjbG96YXBpbmUgbWV0YWJvbGlzbSwgYW5kIHBvdGVudGlhbGx5IG5ldXRyb3BoaWwgbGV2ZWxzLCB0aGUgYWN0aXZpdHkgc2NvcmUgd2FzIHJlc2lkdWFsaXNlZCBvdXQgb2YgdGhlIGluY2x1ZGVkIHZhcmlhYmxlcywgYXMgcHJldmlvdXNseSBkZXNjcmliZWQuIEluIHRoaXMgaW5zdGFuY2UsIGJvdGggdGhlIGFzc29jaWF0aW9uIGJldHdlZW4gZG9zZSBhbmQgQU5DICjOsiA9IGByIHJvdW5kKHN1bW1hcnkoZml0M19wZ3gpJHBlWzMsNl0sIGRpZ2l0cyA9IDMpYCwgKnAqID0gYHIgcm91bmQoc3VtbWFyeShmaXQzX3BneCkkcGVbMyw5XSwgZGlnaXRzID0gMylgKSwgYW5kIHRoZSBpbmRpcmVjdCBlZmZlY3QgdmlhIGNsb3phcGluZSBhbmQgbm9yY2xvemFwaW5lIHdlcmUgd2Vha2VuZWQgKM6yID0gYHIgcm91bmQoc3VtbWFyeShmaXQzX3BneCkkcGVbMTIsNl0sIGRpZ2l0cyA9IDMpYCwgICpwKiA9IGByIHJvdW5kKHN1bW1hcnkoZml0M19wZ3gpJHBlWzEyLDldLCBkaWdpdHMgPSAzKWApLiBXaGlsZSB0aGlzIGF0dGVudWF0aW9uIG9mIGVmZmVjdHMgbWF5IGJlIGR1ZSB0byB0aGUgaW5jbHVzaW9uIG9mIHRoZSBDWVAxQTIgYWN0aXZpdHkgc2NvcmUsIGl0IGNvdWxkIGFsc28gYXJpc2UgYmVjYXVzZSBvZiB0aGUgcmVkdWNlZCBzYW1wbGUgc2l6ZSB3aXRoIGNvbXBsZXRlIGdlbmV0aWMgaW5mb3JtYXRpb24uIFRoZXJlZm9yZSwgdGhlIHByaW1hcnkgbW9kZWwgd2FzIHJlcGVhdGVkIG9uIHRoaXMgc3Vic2V0IG9mIHRoZSBDTE9aVUszIHNhbXBsZSwgdG8gZGV0ZXJtaW5lIGhvdyB0aGlzIHNtYWxsZXIgc2FtcGxlIHNpemUgYWZmZWN0ZWQgdGhlIG1vZGVsIG91dHB1dC4gVGhpcyByZXN1bHRlZCBpbiBpbmZsYXRlZCBlc3RpbWF0ZXMgZm9yIHRoZSBwcmV2aW91c2x5IHNpZ25pZmljYW50IGRpcmVjdCAozrIgPSBgciByb3VuZChzdW1tYXJ5KGZpdDNfcmVkKSRwZVszLDZdLCBkaWdpdHMgPSAzKWAsICpwKiA9IGByIHJvdW5kKHN1bW1hcnkoZml0M19yZWQpJHBlWzMsOV0sIGRpZ2l0cyA9IDMpYCkgYW5kIGluZGlyZWN0IGVmZmVjdHMgKM6yID0gYHIgcm91bmQoc3VtbWFyeShmaXQzX3JlZCkkcGVbMTIsNl0sIGRpZ2l0cyA9IDMpYCwgKnAqID0gYHIgcm91bmQoc3VtbWFyeShmaXQzX3JlZCkkcGVbMTIsOV0sIGRpZ2l0cyA9IDMpYCkuIEEgY29tcGFyaXNvbiBvZiB0aGUgdGhyZWUgbW9kZWxzIChTdXBwbGVtZW50YXJ5IEZpZ3VyZSAzKSBzaG93ZWQgdGhhdCB1c2luZyBhIHJlZHVjZWQgc2FtcGxlIHNpemUgcmVzdWx0cyBpbiBsYXJnZXIgY29uZmlkZW5jZSBpbnRlcnZhbHMgaW5kaWNhdGl2ZSBvZiBhIGxvc3Mgb2Ygc3RhdGlzdGljYWwgcG93ZXIuIEludGVyZXN0aW5nbHksIGNvbnRyb2xsaW5nIGZvciBDWVAxQTIgYWN0aXZpdHkgc2NvcmUgcmVkdWNlcyB0aGlzIHVuY2VydGFpbnR5LCBicmluZ2luZyB0aGUgaW50ZXJ2YWxzIGluIGxpbmUgd2l0aCB0aG9zZSBzZWVuIGluIHRoZSBwcmltYXJ5IG1vZGVsLCBhbGJlaXQgd2l0aCBzbGlnaHRseSBzbWFsbGVyIGVmZmVjdCBzaXplcy4gDQoNCjxicj4NCg0KYGBge3IgU0YzLCBlY2hvID0gRiwgZmlnLmNhcD0gIlN1cHBsZW1lbnRhcnkgRmlndXJlIDMuIEZvcmVzdCBwbG90IGNvbXBhcmluZyBlZmZlY3QgZXN0aW1hdGVzIGJldHdlZW4gdGhlIHRocmVlIFN0cnVjdHVyYWwgRXF1YXRpb24gTW9kZWxzLiDigJhGdWxsIGRhdGHigJkgcmVmZXJzIHRvIHRoZSBmaXJzdCBtb2RlbCBjb250YWluaW5nIHRoZSBmdWxsIENMT1pVSzMgc2FtcGxlLiDigJhHZW5ldGljIE9ubHnigJkgcmVmZXJzIHRvIHRoZSBzYW1lIG1vZGVsIGFzIGluIEZ1bGwgZGF0YSwgYnV0IHBlcmZvcm1lZCBvbiB0aGUgc3Vic2V0IG9mIHRoZSBzYW1wbGUgZm9yIHdob20gZ2VuZXRpYyBkYXRhIGlzIGF2YWlsYWJsZS4gVGhlIGZpbmFsIG1vZGVsLCDigJhDWVAxQTItY29udHJvbGxlZOKAmSwgd2FzIHBlcmZvcm1lZCBvbiB0aGUgZ2VuZXRpYyBvbmx5IHNhbXBsZSBidXQgY29udHJvbHMgZm9yIENZUDFBMiBhY3Rpdml0eSBzY29yZXMgd2hlbiBjcmVhdGluZyB0aGUgcmVzaWR1YWxpc2VkIHZhcmlhYmxlcy4gRWZmZWN0IGVzdGltYXRlcyBhcmUgc3RhbmRhcmRpc2VkLCBhbmQgZXJyb3IgYmFycyBzaG93IDk1JSBjb25maWRlbmNlIGludGVydmFscy4ifQ0KDQojIGdldCBrZXkgaW5mbyBmcm9tIHNlbSAoZXN0aW1hdGUsIGNpIGxvd2VyLCBhbmQgY2kgdXBwZXIpDQphbGxfc2VtIDwtIHBhcmFtZXRlcmVzdGltYXRlcyhmaXQzKVssYygxLDMsNSw5LDEwKV0NCnBneF9zZW0gPC0gcGFyYW1ldGVyZXN0aW1hdGVzKGZpdDNfcGd4KVssYygxLDMsNSw5LDEwKV0NCmdlbl9zZW0gPC0gcGFyYW1ldGVyZXN0aW1hdGVzKGZpdDNfcmVkKVssYygxLDMsNSw5LDEwKV0NCg0KDQoNCmFsbF9wbG90IDwtIGFsbF9zZW1bYygzLDExOjEzKSwzOjVdDQphbGxfcGxvdCRFZmZlY3QgPC0gYygiRGlyZWN0IiwiSW5kaXJlY3QgMSAoQ2xvemFwaW5lIEFsb25lKSIsICJJbmRpcmVjdCAyIChDbG96YXBpbmUgJiBOb3JjbG96YXBpbmUpIiwgICJUb3RhbCIpDQphbGxfcGxvdCRNb2RlbCA8LSBjKCJGdWxsIERhdGEiLCAiRnVsbCBEYXRhIiwgIkZ1bGwgRGF0YSIsICJGdWxsIERhdGEiKQ0KZ2VuX3Bsb3QgPC0gZ2VuX3NlbVtjKDMsMTE6MTMpLDM6NV0NCmdlbl9wbG90JEVmZmVjdCA8LSBjKCJEaXJlY3QiLCJJbmRpcmVjdCAxIChDbG96YXBpbmUgQWxvbmUpIiwgIkluZGlyZWN0IDIgKENsb3phcGluZSAmIE5vcmNsb3phcGluZSkiLCAiVG90YWwiKQ0KZ2VuX3Bsb3QkTW9kZWwgPC0gYygiR2VuZXRpYyBPbmx5IiwgIkdlbmV0aWMgT25seSIsICJHZW5ldGljIE9ubHkiLCAiR2VuZXRpYyBPbmx5IikNCnBneF9wbG90IDwtIHBneF9zZW1bYygzLDExOjEzKSwzOjVdDQpwZ3hfcGxvdCRFZmZlY3QgPC0gYygiRGlyZWN0IiwiSW5kaXJlY3QgMSAoQ2xvemFwaW5lIEFsb25lKSIsICJJbmRpcmVjdCAyIChDbG96YXBpbmUgJiBOb3JjbG96YXBpbmUpIiwgIlRvdGFsIikNCnBneF9wbG90JE1vZGVsIDwtIGMoIkNZUDFBMi1jb250cm9sbGVkIiwgIkNZUDFBMi1jb250cm9sbGVkIiwgIkNZUDFBMi1jb250cm9sbGVkIiwgIkNZUDFBMi1jb250cm9sbGVkIikNCg0KcGxvdF9jaXMgPC0gcmJpbmQoYWxsX3Bsb3QsIGdlbl9wbG90LCBwZ3hfcGxvdCkNCiAgDQojcGxvdF9jaXMkRWZmZWN0IDwtIGZhY3RvcihwbG90X2NpcyRFZmZlY3QsIGxldmVscz1yZXYoc29ydChwbG90X2NpcyRFZmZlY3QpKSkNCg0KYmFyQ09MUyA9IGMoInNlYWdyZWVuMiIsICJtZWRpdW1wdXJwbGUxIiwic3RlZWxibHVlIikNCg0KIyBjcmVhdGUgcGxvdA0KDQpnZ3Bsb3QoZGF0YSA9IHBsb3RfY2lzLCBhZXMoeD1FZmZlY3QsIHk9ZXN0LCB5bWluPWNpLmxvd2VyLCB5bWF4PWNpLnVwcGVyLGNvbD1Nb2RlbCxmaWxsPU1vZGVsKSkgKyANCiNzcGVjaWZ5IHBvc2l0aW9uIGhlcmUNCiAgI2dlb21fbGluZXJhbmdlKGxpbmV3aWR0aD01LCBwb3NpdGlvbj1wb3NpdGlvbl9kb2RnZSh3aWR0aCA9IDAuNSkpICsNCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0PTAsIGx0eT0yKSArDQojc3BlY2lmeSBwb3NpdGlvbiBoZXJlIHRvbw0KICBnZW9tX3BvaW50KHNpemU9Mywgc2hhcGU9MjEsIGNvbG91cj0id2hpdGUiLCBzdHJva2UgPSAwLjUsIHBvc2l0aW9uPXBvc2l0aW9uX2RvZGdlKHdpZHRoID0gLTAuNSkpICsNCiAgZ2VvbV9lcnJvcmJhcihhZXMod2lkdGg9MC41KSwgcG9zaXRpb249cG9zaXRpb25fZG9kZ2Uod2lkdGggPSAtMC41KSkgKw0KICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXM9YmFyQ09MUykrDQogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXM9YmFyQ09MUykrDQogIHNjYWxlX3lfY29udGludW91cyhuYW1lPSJFc3RpbWF0ZSIsIGxpbWl0cyA9IGMoLTAuNSwgMC43KSkgKw0KICAgIGxhYnModGl0bGU9J0VmZmVjdCBTaXplIGJ5IFNhbXBsZScpICsNCiAgc2NhbGVfeF9kaXNjcmV0ZShsaW1pdHMgPSBjKCJUb3RhbCIsICJJbmRpcmVjdCAyIChDbG96YXBpbmUgJiBOb3JjbG96YXBpbmUpIiwgIkluZGlyZWN0IDEgKENsb3phcGluZSBBbG9uZSkiLCAiRGlyZWN0IiApKSArDQogICNnZW9tX3RleHQoYWVzKGxhYmVsID0gbGFiZWwpLCBudWRnZV94ID0gMC4xNSwgc2hvdy5sZWdlbmQgPSBGQUxTRSkgKw0KICBjb29yZF9mbGlwKCkgKw0KICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAiYm90dG9tIikgKw0KICB0aGVtZV9taW5pbWFsKCkNCmBgYA0KDQo8YnI+DQo8YnI+DQoNCiMjIyMgTm9uLVJlc2lkdWFsaXNlZCBTRU0gZm9yIE1lZGlhdGlvbiBBbmFseXNpcw0KDQpgYGB7ciBub24tcmVzaWR1YWxpc2VkIG1lZGlhdGlvbiBpbiBsYXZhYW59DQojIG1ha2UgdXAgZGF0YSBmb3Igc2VtDQpEb3NlIDwtIENMT1pVSzMuZmJjLnBrLm1pbi5zdGQkZGFpbHlkb3NlDQpDbG96YXBpbmUgPC0gQ0xPWlVLMy5mYmMucGsubWluLnN0ZCRjbG96YXBpbmUNCkFOQyA8LSBDTE9aVUszLmZiYy5way5taW4uc3RkJG5ldXRfbnVtDQpOb3JjbG96YXBpbmUgPC0gQ0xPWlVLMy5mYmMucGsubWluLnN0ZCRub3JjbG96YXBpbmUNCk1SIDwtIENMT1pVSzMuZmJjLnBrLm1pbi5zdGQkcmF0aW8NCg0KRGF0YV9zdGQgPC0gZGF0YS5mcmFtZShEb3NlID0gRG9zZSwgQU5DID0gQU5DLCBDbG96YXBpbmUgPSBDbG96YXBpbmUsIE5vcmNsb3phcGluZSA9IE5vcmNsb3phcGluZSwgTVIgPSBNUikNCg0KbXVsdGlwbGVNZWRpYXRpb24gPC0gJw0KQU5DIH4gYjEgKiBDbG96YXBpbmUgKyBiMiAqIE5vcmNsb3phcGluZSArIGMgKiBEb3NlDQpDbG96YXBpbmUgfiBhMSAqIERvc2UNCk5vcmNsb3phcGluZSB+IGQyMSAqIENsb3phcGluZQ0KaW5kaXJlY3QxIDo9IGExICogYjENCmluZGlyZWN0MiA6PSBhMSAqIGQyMSAqIGIyDQp0b3RhbCA6PSBjICsgKGExICogYjEpICsgKGExICogZDIxICogYjIpDQpDbG96YXBpbmUgfn4gTm9yY2xvemFwaW5lDQonDQojIHNlbSBvbiBub24tcmVzaWR1YWxpc2VkLCBzdGFuZGFyZGlzZWQgdmFyaWFibGVzLg0KZml0M19ub25yZXMgPC0gc2VtKG1vZGVsID0gbXVsdGlwbGVNZWRpYXRpb24sIGRhdGEgPSBEYXRhX3N0ZCkNCg0KYGBgDQoNClNFTSB3YXMgYWxzbyB1c2VkIG9uIG5vbi1yZXNpZHVhbGlzZWQgdmVyc2lvbnMgb2YgdGhlIHZhcmlhYmxlcyAoU3VwcGxlbWVudGFyeSBGaWd1cmUgNCkgdG8gZW5zdXJlIHRoYXQgY29udHJvbGxpbmcgZm9yIGNvdmFyaWF0ZXMgaW4gdGhpcyB3YXkgZGlkbuKAmXQgY3JlYXRlIHNwdXJpb3VzIHJlc3VsdHMuIEFzIGluIHRoZSByZXNpZHVhbGlzZWQgbW9kZWwsIHRoZXJlIHdhcyBhIHNpZ25pZmljYW50IHBvc2l0aXZlIGVmZmVjdCBvZiBkYWlseSBjbG96YXBpbmUgZG9zZSBvbiBsb3dlc3QgQU5DICjOsiA9IGByIHJvdW5kKHN1bW1hcnkoZml0M19ub25yZXMpJHBlWzMsNl0sIGRpZ2l0cyA9IDMpYCwgKnAqID0gYHIgcm91bmQoc3VtbWFyeShmaXQzX25vbnJlcykkcGVbMyw5XSwgZGlnaXRzID0gMylgKS4gRXF1YWxseSwgdGhlcmUgd2FzIGEgc2lnbmlmaWNhbnQgaW5kaXJlY3QgZWZmZWN0IHZpYSBib3RoIGNsb3phcGluZSBhbmQgbm9yY2xvemFwaW5lIHBsYXNtYSBjb25jZW50cmF0aW9ucyAozrI9IGByIHJvdW5kKHN1bW1hcnkoZml0M19ub25yZXMpJHBlWzEyLDZdLCBkaWdpdHMgPSAzKWAsICpwKiA9IGByIHJvdW5kKHN1bW1hcnkoZml0M19ub25yZXMpJHBlWzEyLDldLCBkaWdpdHMgPSAzKWApIHdpdGggbm8gZXZpZGVuY2UgZm9yIG1lZGlhdGlvbiBieSBwbGFzbWEgY2xvemFwaW5lIGNvbmNlbnRyYXRpb24gYWxvbmUgKM6yID0gYHIgcm91bmQoc3VtbWFyeShmaXQzX25vbnJlcykkcGVbMTEsNl0sIGRpZ2l0cyA9IDMpYCwgKnAqID0gYHIgcm91bmQoc3VtbWFyeShmaXQzX25vbnJlcykkcGVbMTEsOV0sIGRpZ2l0cyA9IDMpYCkuDQoNCg0KYGBge3IgU0Y0LCBkZXYgPSAicG5nIiwgZGV2LmFyZ3M9bGlzdChiZz0idHJhbnNwYXJlbnQiKSwgZmlnLmNhcD0iU3VwcGxlbWVudGFyeSBGaWd1cmUgNC4gUGF0aCBkaWFncmFtIHNob3dpbmcgYXNzb2NpYXRpb24gYmV0d2VlbiBEb3NlIGFuZCBMb3dlc3QgQU5DIHdpdGggQ2xvemFwaW5lIGFuZCBOb3JjbG96YXBpbmUgYXMgbWVkaWF0b3JzLiBQbG90IGVkZ2VzIGFyZSBsYWJlbGxlZCB3aXRoIHN0YW5kYXJkaXNlZCByZWdyZXNzaW9uIGNvZWZmaWNpZW50cy4gVmFyaWFibGVzIGluY2x1ZGVkIGluIFNFTSBhcmUgdGhlIHBhcmVudCwgbm9uLXJlc2lkdWFsaXNlZCB2YXJpYWJsZXMuIFNFTSA9IFN0cnVjdHVyYWwgRXF1YXRpb24gTW9kZWxsaW5nLiAqIHA8MC4wNSAgICoqIHA8MC4wMSAgICoqKiBwPDAuMDAxIn0NCmtuaXRyOjppbmNsdWRlX2dyYXBoaWNzKCJTRmlnNC5wbmciKQ0KYGBgDQoNCg0KPGJyPg0KPGJyPg0KDQojIyMjIFNpbmdsZSBWYXJpYWJsZSBNZWRpYXRpb24gQW5hbHlzaXMNCg0KYGBge3IgTTEgQ2xvemFwaW5lfQ0KIyBjb21wYXJpc29uIG9mIG1lZGlhdGlvbiBhbmFseXNpcyBpbiBsYXZhYW4gYW5kIG1lZGlhdGlvbiB1c2luZyBvbmUgbWVkaWF0b3IgKGNsb3phcGluZSkuDQpzaW1wbGVNZWRpYXRpb24gPC0gJw0KICAgIEFOQyB+IGIgKiBDbG96YXBpbmUgKyBjICogRG9zZQ0KICAgIENsb3phcGluZSB+IGEgKiBEb3NlDQogICAgaW5kaXJlY3QgOj0gYSAqIGINCiAgICB0b3RhbCAgICA6PSBjICsgKGEgKiBiKQ0KJw0KDQpmaXQxIDwtIHNlbShtb2RlbCA9IHNpbXBsZU1lZGlhdGlvbiwgZGF0YSA9IERhdGFfb2cpDQoNCmRldGFjaF9wYWNrYWdlKGxtZXJUZXN0KSAjbG1lclRlc3QgaW50ZXJmZXJlcyB3aXRoIHRoZSBtZWRpYXRpb24gcGFja2FnZSBzbyBuZWVkcyB0byBiZSByZW1vdmVkIGJlZm9yZSBoYW5kLg0KDQpsaWJyYXJ5KG1lZGlhdGlvbikNCm1fbWVkMSA8LSBsbWVyKGNsb3phcGluZX5kYWlseWRvc2UrVERTK1NFWCthZ2VfYXRfYXNzYXkrc3RkX2FnZTIgKyAoMXxMVUlOKSwgZGF0YT1DTE9aVUszLmZiYy5way5zdGQpIA0KbV9kdjEgPC0gbG1lcihuZXV0X251bX5kYWlseWRvc2UrY2xvemFwaW5lK1REUytTRVgrYWdlX2F0X2Fzc2F5K3N0ZF9hZ2UyICsgKDF8TFVJTiksIGRhdGE9Q0xPWlVLMy5mYmMucGsuc3RkKSANCm1fYWNtZTEgPC0gbWVkaWF0aW9uOjptZWRpYXRlKG1fbWVkMSwgbV9kdjEsIHNpbSA9IDEwMDAsIHRyZWF0PSJkYWlseWRvc2UiLCBtZWRpYXRvcj0iY2xvemFwaW5lIikNCg0KDQojdGhpcyBmdW5jdGlvbiBleHRyYWN0cyB0aGUga2V5IGluZm9ybWF0aW9uIGZyb20gdGhlIG91dHB1dCBvZiBtZWRpYXRpb24gaW50byBhIG5pY2UgZGF0YSBmcmFtZS4gYXMgb2J0YWluZWQgZnJvbTogIGh0dHBzOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzQxNTgyNDg2L2hvdy10by1jb252ZXJ0LXItbWVkaWF0aW9uLXN1bW1hcnktdG8tZGF0YS1mcmFtZQ0KDQpleHRyYWN0X21lZGlhdGlvbl9zdW1tYXJ5IDwtIGZ1bmN0aW9uICh4KSB7IA0KDQogIGNscCA8LSAxMDAgKiB4JGNvbmYubGV2ZWwNCiAgaXNMaW5lYXIueSA8LSAoKGNsYXNzKHgkbW9kZWwueSlbMV0gJWluJSBjKCJsbSIsICJycSIpKSB8fCANCiAgICAgICAgICAgICAgICAgICAoaW5oZXJpdHMoeCRtb2RlbC55LCAiZ2xtIikgJiYgeCRtb2RlbC55JGZhbWlseSRmYW1pbHkgPT0gDQogICAgICAgICAgICAgICAgICAgICAgImdhdXNzaWFuIiAmJiB4JG1vZGVsLnkkZmFtaWx5JGxpbmsgPT0gImlkZW50aXR5IikgfHwgDQogICAgICAgICAgICAgICAgICAgKGluaGVyaXRzKHgkbW9kZWwueSwgInN1cnZyZWciKSAmJiB4JG1vZGVsLnkkZGlzdCA9PSANCiAgICAgICAgICAgICAgICAgICAgICAiZ2F1c3NpYW4iKSkNCg0KICBwcmludG9uZSA8LSAheCRJTlQgJiYgaXNMaW5lYXIueQ0KDQogIGlmIChwcmludG9uZSkgew0KDQogICAgc21hdCA8LSBjKHgkZDEsIHgkZDEuY2ksIHgkZDEucCkNCiAgICBzbWF0IDwtIHJiaW5kKHNtYXQsIGMoeCR6MCwgeCR6MC5jaSwgeCR6MC5wKSkNCiAgICBzbWF0IDwtIHJiaW5kKHNtYXQsIGMoeCR0YXUuY29lZiwgeCR0YXUuY2ksIHgkdGF1LnApKQ0KICAgIHNtYXQgPC0gcmJpbmQoc21hdCwgYyh4JG4wLCB4JG4wLmNpLCB4JG4wLnApKQ0KDQogICAgcm93bmFtZXMoc21hdCkgPC0gYygiQUNNRSIsICJBREUiLCAiVG90YWwgRWZmZWN0IiwgIlByb3AuIE1lZGlhdGVkIikNCg0KICB9IGVsc2Ugew0KICAgIHNtYXQgPC0gYyh4JGQwLCB4JGQwLmNpLCB4JGQwLnApDQogICAgc21hdCA8LSByYmluZChzbWF0LCBjKHgkZDEsIHgkZDEuY2ksIHgkZDEucCkpDQogICAgc21hdCA8LSByYmluZChzbWF0LCBjKHgkejAsIHgkejAuY2ksIHgkejAucCkpDQogICAgc21hdCA8LSByYmluZChzbWF0LCBjKHgkejEsIHgkejEuY2ksIHgkejEucCkpDQogICAgc21hdCA8LSByYmluZChzbWF0LCBjKHgkdGF1LmNvZWYsIHgkdGF1LmNpLCB4JHRhdS5wKSkNCiAgICBzbWF0IDwtIHJiaW5kKHNtYXQsIGMoeCRuMCwgeCRuMC5jaSwgeCRuMC5wKSkNCiAgICBzbWF0IDwtIHJiaW5kKHNtYXQsIGMoeCRuMSwgeCRuMS5jaSwgeCRuMS5wKSkNCiAgICBzbWF0IDwtIHJiaW5kKHNtYXQsIGMoeCRkLmF2ZywgeCRkLmF2Zy5jaSwgeCRkLmF2Zy5wKSkNCiAgICBzbWF0IDwtIHJiaW5kKHNtYXQsIGMoeCR6LmF2ZywgeCR6LmF2Zy5jaSwgeCR6LmF2Zy5wKSkNCiAgICBzbWF0IDwtIHJiaW5kKHNtYXQsIGMoeCRuLmF2ZywgeCRuLmF2Zy5jaSwgeCRuLmF2Zy5wKSkNCg0KICAgIHJvd25hbWVzKHNtYXQpIDwtIGMoIkFDTUUgKGNvbnRyb2wpIiwgIkFDTUUgKHRyZWF0ZWQpIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAiQURFIChjb250cm9sKSIsICJBREUgKHRyZWF0ZWQpIiwgIlRvdGFsIEVmZmVjdCIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgIlByb3AuIE1lZGlhdGVkIChjb250cm9sKSIsICJQcm9wLiBNZWRpYXRlZCAodHJlYXRlZCkiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICJBQ01FIChhdmVyYWdlKSIsICJBREUgKGF2ZXJhZ2UpIiwgIlByb3AuIE1lZGlhdGVkIChhdmVyYWdlKSIpDQoNCiAgfQ0KDQogIGNvbG5hbWVzKHNtYXQpIDwtIGMoIkVzdGltYXRlIiwgcGFzdGUoY2xwLCAiJSBDSSBMb3dlciIsIHNlcCA9ICIiKSwgDQogICAgICAgICAgICAgICAgICAgICAgcGFzdGUoY2xwLCAiJSBDSSBVcHBlciIsIHNlcCA9ICIiKSwgInAtdmFsdWUiKQ0KICBzbWF0DQoNCn0NCg0Kb3V0XzFtZWQgPC0gZXh0cmFjdF9tZWRpYXRpb25fc3VtbWFyeShzdW1tYXJ5KG1fYWNtZTEpKQ0Kb3V0XzFtZWQgPC0gYXMuZGF0YS5mcmFtZShvdXRfMW1lZFtjKDgsOSw1LDEwKSxdKSAlPiUNCiAgcm93bmFtZXNfdG9fY29sdW1uKHZhciA9ICJPdXRwdXQiKQ0KDQpzaW1wbGVNZWRpYXRpb24gPC0gJw0KICAgIEFOQyB+IGIgKiBOb3JjbG96YXBpbmUgKyBjICogRG9zZQ0KICAgIE5vcmNsb3phcGluZSB+IGEgKiBEb3NlDQogICAgaW5kaXJlY3QgOj0gYSAqIGINCiAgICB0b3RhbCAgICA6PSBjICsgKGEgKiBiKQ0KJw0KDQpmaXQyIDwtIHNlbShtb2RlbCA9IHNpbXBsZU1lZGlhdGlvbiwgZGF0YSA9IERhdGFfb2cpDQoNCm1fbWVkNCA8LSBsbWVyKG5vcmNsb3phcGluZX5kYWlseWRvc2UrVERTK1NFWCthZ2VfYXRfYXNzYXkrc3RkX2FnZTIgKyAoMXxMVUlOKSwgZGF0YT1DTE9aVUszLmZiYy5way5zdGQpIA0KbV9kdjQgPC0gbG1lcihuZXV0X251bX5kYWlseWRvc2Urbm9yY2xvemFwaW5lK1REUytTRVgrYWdlX2F0X2Fzc2F5K3N0ZF9hZ2UyICsgKDF8TFVJTiksIGRhdGE9Q0xPWlVLMy5mYmMucGsuc3RkKSANCm1fYWNtZTQgPC0gbWVkaWF0aW9uOjptZWRpYXRlKG1fbWVkNCwgbV9kdjQsIHNpbSA9IDEwMDAsIHRyZWF0PSJkYWlseWRvc2UiLCBtZWRpYXRvcj0ibm9yY2xvemFwaW5lIikNCg0KDQpvdXRfNG1lZCA8LSBleHRyYWN0X21lZGlhdGlvbl9zdW1tYXJ5KHN1bW1hcnkobV9hY21lNCkpDQpvdXRfNG1lZCA8LSBhcy5kYXRhLmZyYW1lKG91dF80bWVkW2MoOCw5LDUsMTApLF0pICU+JQ0KICByb3duYW1lc190b19jb2x1bW4odmFyID0gIk91dHB1dCIpDQoNCg0KYGBgDQoNClNFTSB3YXMgcGVyZm9ybWVkIHdpdGggcmVzaWR1YWxpc2VkIHBsYXNtYSBjbG96YXBpbmUgY29uY2VudHJhdGlvbiBhcyB0aGUgbG9uZSBtZWRpYXRvciBiZXR3ZWVuIGRvc2UgYW5kIGxvd2VzdCBBTkMgKFN1cHBsZW1lbnRhcnkgVGFibGUgNykuIEFzIGJlZm9yZSwgYSBzaWduaWZpY2FudCBlZmZlY3Qgb2YgZG9zZSBvbiBsb3dlc3QgQU5DIHdhcyBvYnNlcnZlZCAozrIgPSBgciByb3VuZChzdW1tYXJ5KGZpdDEpJHBlWzIsNl0sIGRpZ2l0cyA9IDMpYCwgKnAqID0gYHIgcm91bmQoc3VtbWFyeShmaXQxKSRwZVsyLDldLCBkaWdpdHMgPSA1KWApLCB3aXRoIG5vIHN1cHBvcnQgZm9yIGNsb3phcGluZSBhcyBhIG1lZGlhdGluZyB2YXJpYWJsZSAozrIgPSBgciByb3VuZChzdW1tYXJ5KGZpdDEpJHBlWzcsNl0sIGRpZ2l0cyA9IDMpYCwgKnAqID0gYHIgcm91bmQoc3VtbWFyeShmaXQxKSRwZVs3LDldLCBkaWdpdHMgPSAzKWApLiBBIHNlY29uZGFyeSwgY2F1c2FsIG1lZGlhdGlvbiBhbmFseXNpcyB3YXMgcGVyZm9ybWVkIHVzaW5nIHRoZSBmdWxsIENMT1pVSzMgZGF0YXNldC4gVGhlc2UgcmVzdWx0cyBhcmUgY29uc2lzdGVudCB3aXRoIHRoZSBmaW5kaW5ncyBkZXJpdmVkIGZyb20gdXNpbmcgU0VNLCBzaG93aW5nIGEgc2lnbmlmaWNhbnQgZGlyZWN0IGVmZmVjdCBvZiBkYWlseSBjbG96YXBpbmUgZG9zZSAoQURFID0gYHIgcm91bmQob3V0XzFtZWRbMiwyXSwgZGlnaXRzID0gMylgLCAqcCogPSA8MmUtMTYpICBhbmQgbm8gaW5kaXJlY3QgZWZmZWN0IHRyYW5zbWl0dGVkIHZpYSBjbG96YXBpbmUgcGxhc21hIGNvbmNlbnRyYXRpb24gKEFERSA9IGByIHJvdW5kKG91dF8xbWVkWzEsMl0sIGRpZ2l0cyA9IDMpYCwgKnAqID0gYHIgcm91bmQob3V0XzFtZWRbMSw1XSwgZGlnaXRzID0gMylgKSAuDQoNCg0KYGBge3IgU1Q3fQ0KDQojZ2V0IHN1cHBsZW1lbnRhcnkgdGFibGUgNyBjYXB0aW9uDQpzdDcgPC0gcmVhZHhsOjpyZWFkX3hsc3gocGF0aCA9ICJTdXBwbGVtZW50YXJ5IFRhYmxlcy54bHN4Iiwgc2hlZXQgPSA3LCBjb2xfbmFtZXMgPSBUUlVFLCBza2lwID0gMSkNCmNhcCA8LSBzdDdbbnJvdyhzdDcpLDFdDQoNCiMgZ2V0IG91dHB1dCBmcm9tIGxhdmFubiAobCkgYW5kIG1lZGlhdGlvbiAobSkNCmxfY2xveiA8LSBwYXJhbWV0ZXJlc3RpbWF0ZXMoZml0MSlbYyg3LDIsOCksXQ0KbF9jbG96JGVmZmVjdCA8LSBjKCJJbmRpcmVjdCIsICJEaXJlY3QiLCAiVG90YWwiKQ0KbF9jbG96IDwtIGRwbHlyOjpzZWxlY3QobF9jbG96LCBjKCJlZmZlY3QiLCAiZXN0IiwgImNpLmxvd2VyIiwgImNpLnVwcGVyIiwgInB2YWx1ZSIpKQ0KY29sbmFtZXMobF9jbG96KSA8LSBjKCJPdXRwdXQiLCAiRXN0aW1hdGUiLCAiTG93ZXIgOTUlIENJIiwgIlVwcGVyIDk1JSBDSSIsICJwLXZhbHVlIikNCg0KbV9jbG96IDwtIG91dF8xbWVkDQoNCmthYmxlKGxpc3QobF9jbG96LCBtX2Nsb3opLCByb3cubmFtZXMgPSBGQUxTRSwNCiAgICAgIGNhcHRpb24gPSBjYXAsIGRpZ2l0cyA9IDMpICU+JQ0KICAgICAga2FibGVfc3R5bGluZygibm9uZSIsIGZ1bGxfd2lkdGggPSBULCBwb3NpdGlvbiA9ICJsZWZ0IiwgZm9udF9zaXplID0gMTYpICU+JQ0KICAgICAgYWRkX2hlYWRlcl9hYm92ZShjKCJpbiBMYXZhYW4oKSIgPSAxLCAiaW4gTWVkaWF0aW9uKCkiID0gMSkpICU+JQ0KICAgICAga2FibGVfY2xhc3NpYygpDQpgYGANCg0KPGJyPg0KDQoNCkEgY29tcGxlbWVudGFyeSBzaW5nbGUtbWVkaWF0b3IgU0VNIHdhcyBwZXJmb3JtZWQgd2l0aCBub3JjbG96YXBpbmUgYXMgdGhlIHNvbGUgbWVkaWF0aW5nIHZhcmlhYmxlLiBBIHNpZ25pZmljYW50IGRpcmVjdCBlZmZlY3Qgb2YgZGFpbHkgY2xvemFwaW5lIGRvc2Ugb24gbG93ZXN0IEFOQyBpcyBvYnNlcnZlZCAozrIgPSBgciByb3VuZChzdW1tYXJ5KGZpdDIpJHBlWzIsNl0sIGRpZ2l0cyA9IDMpYCwgKnAqID0gYHIgcm91bmQoc3VtbWFyeShmaXQyKSRwZVsyLDldLCBkaWdpdHMgPSA1KWApLiAgIEFkZGl0aW9uYWxseSwgdGhlcmUgaXMgc29tZSBldmlkZW5jZSBmb3IgYSBtZWRpYXRpbmcgZWZmZWN0IHdoZW4gd2UgY29uc2lkZXIgbm9yY2xvemFwaW5lIHBsYXNtYSBjb25jZW50cmF0aW9uIGFsb25lICjOsiA9IGByIHJvdW5kKHN1bW1hcnkoZml0MikkcGVbNyw2XSwgZGlnaXRzID0gMylgLCAqcCogPSBgciByb3VuZChzdW1tYXJ5KGZpdDIpJHBlWzcsOV0sIGRpZ2l0cyA9IDQpYCkuIFdoZW4gdGhpcyBhbmFseXNpcyB3YXMgcmVwbGljYXRlZCB1c2luZyB0aGUgbG9uZ2l0dWRpbmFsIHNhbXBsZSwgYSBzaWduaWZpY2FudCBkaXJlY3QgZWZmZWN0IHdhcyBvYnNlcnZlZCBhZ2FpbiAoQURFID0gYHIgcm91bmQob3V0XzRtZWRbMiwyXSwgZGlnaXRzID0gMylgLCAqcCogPSA8MmUtMTYpLiBGdXJ0aGVybW9yZSwgYSBzaWduaWZpY2FudCBpbmRpcmVjdCBlZmZlY3QgdmlhIG5vcmNsb3phcGluZSB3YXMgYWxzbyBvYnNlcnZlZCAoQUNNRT0gYHIgcm91bmQob3V0XzRtZWRbMSwyXSwgZGlnaXRzID0gMylgLCAqcCogPSBgciByb3VuZChvdXRfNG1lZFsxLDVdLCBkaWdpdHMgPSAzKWApLCBzaG93biBpbiBTdXBwbGVtZW50YXJ5IFRhYmxlIDguIA0KDQpgYGB7ciBTVDh9DQoNCiNnZXQgc3VwcGxlbWVudGFyeSB0YWJsZSA4IGNhcHRpb24NCg0Kc3Q4IDwtIHJlYWR4bDo6cmVhZF94bHN4KHBhdGggPSAiU3VwcGxlbWVudGFyeSBUYWJsZXMueGxzeCIsIHNoZWV0ID0gOCwgY29sX25hbWVzID0gVFJVRSwgc2tpcCA9IDEpDQpjYXAgPC0gc3Q4W25yb3coc3Q4KSwxXQ0KDQojIGdldCBvdXRwdXQgZnJvbSBsYXZhYW4gKGwpIGFuZCBtZWRpYXRpb24gKG0pDQpsX25vciA8LSBwYXJhbWV0ZXJlc3RpbWF0ZXMoZml0MilbYyg3LDIsOCksXQ0KbF9ub3IkZWZmZWN0IDwtIGMoIkluZGlyZWN0IiwgIkRpcmVjdCIsICJUb3RhbCIpDQpsX25vciA8LSBkcGx5cjo6c2VsZWN0KGxfbm9yLCBjKCJlZmZlY3QiLCAiZXN0IiwgICJjaS5sb3dlciIsICJjaS51cHBlciIsICJwdmFsdWUiKSkNCmNvbG5hbWVzKGxfbm9yKSA8LSBjKCJPdXRwdXQiLCAiRXN0aW1hdGUiLCAiTG93ZXIgOTUlIENJIiwgIlVwcGVyIDk1JSBDSSIsICJwLXZhbHVlIikNCg0KbV9ub3IgPC0gb3V0XzRtZWQNCg0Ka2FibGUobGlzdChsX25vciwgbV9ub3IpLCByb3cubmFtZXMgPSBGQUxTRSwNCiAgICAgIGNhcHRpb24gPSBjYXAsIGRpZ2l0cyA9IDMpICU+JQ0KICAgICAga2FibGVfc3R5bGluZygibm9uZSIsIGZ1bGxfd2lkdGggPSBULCBwb3NpdGlvbiA9ICJsZWZ0IiwgZm9udF9zaXplID0gMTYpICU+JQ0KICAgICAgYWRkX2hlYWRlcl9hYm92ZShjKCJpbiBMYXZhYW4oKSIgPSAxLCAiaW4gTWVkaWF0aW9uKCkiID0gMSkpICU+JQ0KICAgICAga2FibGVfY2xhc3NpYygpDQpgYGANCg0KPGJyPg0KPGJyPg0KDQoNCiMjIyMgUmVwbGljYXRpbmcgUGFzdCBTdHVkaWVzIHdpdGggTGluZWFyIE1vZGVscw0KDQpgYGB7ciBXaWxsY29ja3MgZXQgYWwuLCAyMDIxIENMT1pVSzIgVXBkYXRlZH0NCnNldHdkKGRpciA9ICJEOi9zaW9iaC9Eb2N1bWVudHMvVW5pL1BoRC9ZMS9DbG96YXBpbmUgUHJvamVjdC9HaXQvY2xvemFwaW5lLXByb2plY3QvV2lsbGNvY2tzMjAyMS8iKQ0KDQojIFJlZ3Jlc3Npb24gIyMjIw0KbWFzdGVyZmlsZSA8LSByZWFkX2V4Y2VsKCJjbG96dWsueGxzeCIpDQptYXN0ZXJmaWxlJGRhaWx5ZG9zZSA8LSBhcy5udW1lcmljKG1hc3RlcmZpbGUkZGFpbHlkb3NlKSAjIEZvcm1hdCBkYWlseSBkb3NlIA0KbWFzdGVyZmlsZSRkYWlseV9kb3NlX2MgPC0gYXMubnVtZXJpYyhtYXN0ZXJmaWxlJGRhaWx5ZG9zZV9jKSAjIEZvcm1hdCBzdGFuZGFyZGlzZWQgZGFpbHkgZG9zZSANCm1hc3RlcmZpbGUgPC0gbWFzdGVyZmlsZSAlPiUNCiAgZHBseXI6OnJlbmFtZSgNCiAgICBnZW5kZXIgPSBHRU5ERVIsDQogICAgdGRzID0gVERTLA0KICAgIGxvd2VzdF9hbmMgPSBMT1dFU1RfQU5DLA0KICAgIGxvd2VzdF9hbmNfYyA9IExPV0VTVF9BTkNfYywNCiAgICB0aW1lX29uX3RyZWF0bWVudCA9IFRJTUVPTlRSRUFUTUVOVCwNCiAgICB0aW1lX29uX3RyZWF0bWVudF9jID0gVElNRU9OVFJFQVRNRU5UX2MNCiAgKSAjIEN1cmF0ZSB2YXJpYWJsZSBuYW1lcyANCg0KbWFzdGVyZmlsZSA8LSBtYXN0ZXJmaWxlWyFkdXBsaWNhdGVkKG1hc3RlcmZpbGUkTFVJTiksXSAjIHJlbW92ZSBkdXBsaWNhdGVzIA0KDQptYXN0ZXJmaWxlIDwtIG1hc3RlcmZpbGUgJT4lIGRwbHlyOjpzZWxlY3QoYygiTFVJTiIsICJkYWlseWRvc2UiLCAibG93ZXN0X2FuYyIsICJjbG96YXBpbmUiLCAibm9yY2xvemFwaW5lIiwgImdlbmRlciIsICJhZ2UiLCAiYWdlc3F1YXJlZCIsICJ0ZHMiLCAiZGF5ZGlmZiIsICJ0aW1lX29uX3RyZWF0bWVudCIpKQ0KDQpjb2xuYW1lcyhtYXN0ZXJmaWxlKSA8LSBjKCJMVUlOIiwgImRhaWx5ZG9zZSIsICJuZXV0X251bSIsICJjbG96YXBpbmUiLCAibm9yY2xvemFwaW5lIiwgIlNFWCIsICJhZ2VfYXRfYXNzYXkiLCAic3RkX2FnZTIiLCAiVERTIiwgImRheWRpZmYiLCAidGltZW9udHJlYXRtZW50IikNCg0KIyBDb21wdXRlIFVuc3RhbmRhcmRpc2VkIG1vZGVsIChUaGUgb25lIGluIHRoZSBwYXBlcikNCmxtMSA8LSBsbShuZXV0X251bSB+IGNsb3phcGluZSArIG5vcmNsb3phcGluZSArIGRhaWx5ZG9zZSArIFNFWCArIGFnZV9hdF9hc3NheSArIHN0ZF9hZ2UyICsgVERTICsgZGF5ZGlmZiArIHRpbWVvbnRyZWF0bWVudCAsIGRhdGEgPSBtYXN0ZXJmaWxlKQ0KDQojIGNyZWF0ZSBzdGFuZGFyZGlzZWQgdmVyc2lvbiBvZiB0aGUgcHJlZGljdG9ycw0KbWFzdGVyZmlsZXMgPC0gZGF0YXdpemFyZDo6c3RhbmRhcmRpc2UoeCA9IG1hc3RlcmZpbGUsIHNlbGVjdCA9IGMoImRhaWx5ZG9zZSIsICJhZ2VfYXRfYXNzYXkiLCAic3RkX2FnZTIiLCAiVERTIiwgImNsb3phcGluZSIsICJub3JjbG96YXBpbmUiLCAiU0VYIiwgImRheWRpZmYiLCAidGltZW9udHJlYXRtZW50IikpDQoNCiMgbW9kZWwgZm9yIHBsb3QgKFN1cHBsZW1lbnRhcnkgRmlndXJlIDUpIHVzaW5nIHN0YW5kYXJkaXNlZCBpbnB1dA0KbG01IDwtIGxtKG5ldXRfbnVtIH4gY2xvemFwaW5lICsgbm9yY2xvemFwaW5lICsgZGFpbHlkb3NlICsgU0VYICsgYWdlX2F0X2Fzc2F5ICsgc3RkX2FnZTIgKyBURFMgKyBkYXlkaWZmICsgdGltZW9udHJlYXRtZW50ICwgZGF0YSA9IG1hc3RlcmZpbGVzKQ0KYGBgDQoNCg0KYGBgIHtyIExvd2VzdCBBTkMgTE0sIGVjaG8gPSBGQUxTRX0NCg0KIyBtb2RlbHMNCm1vZGVsMSA8LSBsbShuZXV0X251bX5kYWlseWRvc2UrY2xvemFwaW5lK25vcmNsb3phcGluZStURFMrU0VYK2FnZV9hdF9hc3NheStzdGRfYWdlMixkYXRhPUNMT1pVSzMuZmJjLnBrLm1pbi5zdGQpICMgZXhjbHVkZWQgdGltZSBvbiB0cmVhdG1lbnQNCg0KDQptb2RlbDIgPC0gbG0obmV1dF9udW1+ZGFpbHlkb3NlK2Nsb3phcGluZStub3JjbG96YXBpbmUrVERTK1NFWCthZ2VfYXRfYXNzYXkrc3RkX2FnZTIrcmF0aW8sZGF0YT1DTE9aVUszLmZiYy5way5taW4uc3RkKSAjIGV4Y2x1ZGVkIHRpbWUgb24gdHJlYXRtZW50DQoNCg0KbW9kZWwzIDwtIGxtKG5ldXRfbnVtfmRhaWx5ZG9zZStjbG96YXBpbmUrbm9yY2xvemFwaW5lK1REUytTRVgrYWdlX2F0X2Fzc2F5K3N0ZF9hZ2UyK3JhdGlvK3JzMjQ3MjI5N19UK3JzNjE3NTA5MDBfVCtyczIwMTE0MjVfRytyczExMjY1NDVfVCxkYXRhPUNMT1pVSzMuZmJjLnBrLmdlbi5taW4uc3RkKQ0KDQpgYGANCg0KDQpUaHJlZSBsaW5lYXIgbW9kZWxzIHdlcmUgZml0IGluLWxpbmUgd2l0aCBXaWxsY29ja3MgZXQgYWwuLCAoMjAyMSksIGV4Y2x1ZGluZyB0aGUgY292YXJpYXRlcyBUaW1lIG9uIFRyZWF0bWVudCAoYWJzZW50IGluIENMT1pVSzMpIGFuZCBEYXlzIGJldHdlZW4gQXNzYXlzIChhcyBGQkMgYW5kIHBoYXJtYWNva2luZXRpYyBhc3NheXMgd2VyZSBwZXJmb3JtZWQgb24gdGhlIHNhbWUgZGF5IGZvciBhbGwgb3VyIGRhdGEgcG9pbnRzKSwgd2l0aCByZXN1bHRzIHJlcG9ydGVkIGluIFN1cHBsZW1lbnRhcnkgVGFibGUgOS4gQSBmb3Jlc3QgcGxvdCBjb21wYXJpbmcgc3RhbmRhcmRpc2VkIHJlZ3Jlc3Npb24gY29lZmZpY2llbnRzIG9idGFpbmVkIGZyb20gdGhlIENMT1pVSzMgYW5kIENMT1pVSzIgc2FtcGxlcyBpcyBzaG93biBpbiBTdXBwbGVtZW50YXJ5IEZpZ3VyZSA1Lg0KDQpJbiB0aGUgZmlyc3QgbW9kZWwsIGRhaWx5IGRvc2UgKM6yID0gYHIgcm91bmQoc3VtbWFyeShtb2RlbDEpJGNvZWZmaWNpZW50c1syLDFdLCBkaWdpdHMgPSAzKWAsICpwKiA9IGByIHJvdW5kKHN1bW1hcnkobW9kZWwxKSRjb2VmZmljaWVudHNbMiw0XSwgZGlnaXRzID0gMylgKSBhbmQgbm9yY2xvemFwaW5lIGxldmVsICjOsiA9IGByIHJvdW5kKHN1bW1hcnkobW9kZWwxKSRjb2VmZmljaWVudHNbNCwxXSwgZGlnaXRzID0gNClgLCAqcCogPSBgciByb3VuZChzdW1tYXJ5KG1vZGVsMSkkY29lZmZpY2llbnRzWzQsNF0sIGRpZ2l0cyA9IDMpYCkgd2VyZSBib3RoIHBvc2l0aXZlbHkgYXNzb2NpYXRlZCB3aXRoIEFOQy4gQWx0aG91Z2ggbm90IHNpZ25pZmljYW50LCBjbG96YXBpbmUgd2FzIG5lZ2F0aXZlbHkgYXNzb2NpYXRlZCB3aXRoIEFOQyAozrIgPSBgciByb3VuZChzdW1tYXJ5KG1vZGVsMSkkY29lZmZpY2llbnRzWzMsMV0sIGRpZ2l0cyA9IDMpYCwgKnAqID0gYHIgcm91bmQoc3VtbWFyeShtb2RlbDEpJGNvZWZmaWNpZW50c1szLDRdLCBkaWdpdHMgPSAzKWApLiAgVGhlIGFkZGl0aW9uIG9mIG1ldGFib2xpYyByYXRpbyBpbiB0aGUgc2Vjb25kIG1vZGVsLCByZWR1Y2VkIGVmZmVjdCBzaXplcyBmb3IgYm90aCBjbG96YXBpbmUgcGxhc21hIGNvbmNlbnRyYXRpb24gKM6yID0gYHIgcm91bmQoc3VtbWFyeShtb2RlbDIpJGNvZWZmaWNpZW50c1szLDFdLCBkaWdpdHMgPSAzKWAsICpwKiA9IGByIHJvdW5kKHN1bW1hcnkobW9kZWwyKSRjb2VmZmljaWVudHNbMyw0XSwgZGlnaXRzID0gMylgKSBhbmQgbm9yY2xvemFwaW5lIHBsYXNtYSBjb25jZW50cmF0aW9uICjOsiA9IGByIHJvdW5kKHN1bW1hcnkobW9kZWwyKSRjb2VmZmljaWVudHNbNCwxXSwgZGlnaXRzID0gMylgLCAqcCogPSBgciByb3VuZChzdW1tYXJ5KG1vZGVsMikkY29lZmZpY2llbnRzWzQsNF0sIGRpZ2l0cyA9IDMpYCkuIERhaWx5IGNsb3phcGluZSBkb3NlIHdhcyB1bmFmZmVjdGVkIGJ5IHRoaXMgKM6yID0gYHIgcm91bmQoc3VtbWFyeShtb2RlbDIpJGNvZWZmaWNpZW50c1syLDFdLCBkaWdpdHMgPSAzKWAsICpwKiA9IGByIHJvdW5kKHN1bW1hcnkobW9kZWwyKSRjb2VmZmljaWVudHNbMiw0XSwgZGlnaXRzID0gMylgKSwgYW5kIHRoZSBtZXRhYm9saWMgcmF0aW8gaXRzZWxmIHdhcyBub3Qgc2lnbmlmaWNhbnRseSBhc3NvY2lhdGVkIHdpdGggQU5DICjOsiA9IGByIHJvdW5kKHN1bW1hcnkobW9kZWwyKSRjb2VmZmljaWVudHNbOSwxXSwgZGlnaXRzID0gMylgLCAqcCogPSBgciByb3VuZChzdW1tYXJ5KG1vZGVsMikkY29lZmZpY2llbnRzWzksNF0sIGRpZ2l0cyA9IDMpYCkuIEluIHRoZSBmaW5hbCBtb2RlbCwgbm8gcGhhcm1hY29nZW5vbWljIFNOUHMgd2VyZSBhc3NvY2lhdGVkIHdpdGggQU5DLiBGdXJ0aGVybW9yZSwgdGhlIHByZXZpb3VzIGFzc29jaWF0aW9uIGJldHdlZW4gZGFpbHkgZG9zZSBhbmQgQU5DIGJlY2FtZSBzbWFsbGVyIGFuZCBub24tc2lnbmlmaWNhbnQgKM6yID0gYHIgcm91bmQoc3VtbWFyeShtb2RlbDMpJGNvZWZmaWNpZW50c1syLDFdLCBkaWdpdHMgPSAzKWAsICpwKiA9IGByIHJvdW5kKHN1bW1hcnkobW9kZWwzKSRjb2VmZmljaWVudHNbMiw0XSwgZGlnaXRzID0gMylgKS4NCg0KDQpgYGB7ciBTVDl9DQoNCnRhYl9tb2RlbChtb2RlbDEsIG1vZGVsMiwgbW9kZWwzLCBzaG93LmVzdCA9IFRSVUUsIHNob3cuc2UgPSBUUlVFLCBzaG93LmNpID0gRkFMU0UsDQogICAgICAgICAgc2hvdy5wID0gRiwgY29sbGFwc2Uuc2UgPSAgVFJVRSwgc2hvdy5pbnRlcmNlcHQgPSBGQUxTRSwgZW1waC5wID0gVFJVRSwNCiAgICAgICAgICBkaWdpdHMgPSAzLCBkaWdpdHMucmUgPSAzLA0KICAgICAgICAgIHN0cmluZy5wcmVkID0gIlByZWRpY3RvciIsIHN0cmluZy5lc3QgPSAiRXN0aW1hdGUgKFNFKSIsDQogICAgICAgICAgcHJlZC5sYWJlbHMgPSBsYWJlbHNfcmVwLA0KICAgICAgICAgIGR2LmxhYmVscyA9IGMoIkJhc2UgTW9kZWwiLCAiSW5jbHVkaW5nIE1ldGFib2xpYyBSYXRpbyIsICJJbmNsdWRpbmcgUmVsZXZhbnQgU05QcyIpLA0KICAgICAgICAgIENTUyA9IGxpc3QoY3NzLnRhYmxlID0gJytmb250LWZhbWlseTogUm9ib3RvOyB3aWR0aDogMTAwJTsnLCBjc3MuZGVwdmFyaGVhZCA9ICcrZm9udC1zdHlsZTogbm9ybWFsOyBmb250LXdlaWdodDogbm9ybWFsOyB0ZXh0LWFsaWduID0gY2VudHJlJywNCiAgICAgICAgICAgICAgICAgICAgIGNzcy50aGVhZCA9ICdib3JkZXItdG9wOiBibGFuazsgdGV4dC1hbGlnbiA9IGNlbnRyZTsgcGFkZGluZzogMC41Y207JywgY3NzLnRkYXRhID0gJ3BhZGRpbmc6IDAuMjVjbTsgdGV4dC1hbGlnbiA9IGNlbnRyZTsnLA0KICAgICAgICAgICAgICAgICAgICAgY3NzLnJhbmRvbXBhcnRzID0gJ2JvcmRlci10b3A6MXB4IHNvbGlkOycsIGNzcy5maXJzdHRhYmxlcm93ID0gJ2JvcmRlci1ib3R0b206IGJsYW5rJywNCiAgICAgICAgICAgICAgICAgICAgIGNzcy5maXJzdHN1bXJvdyA9ICdib3JkZXItdG9wOiAxcHggc29saWQnLCBjc3MuZm9vdG5vdGUgPSAndGV4dC1hbGlnbjogbGVmdDsnLCANCiAgICAgICAgICAgICAgICAgICAgIGNzcy5zdW1tYXJ5ID0gInBhZGRpbmctdG9wOjAuMmNtOyBwYWRkaW5nLWJvdHRvbTowLjJjbTsiKSwNCiAgICAgICAgICB0aXRsZSA9ICJTdXBwbGVtZW50YXJ5IFRhYmxlIDkuIFJlcGxpY2F0aW9uIEFuYWx5c2lzOiBQcmVkaWN0b3JzIG9mIExvd2VzdCBBYnNvbHV0ZSBOZXV0cm9waGlsIENvdW50LiBVbnN0YW5kYXJkaXNlZCByZWdyZXNzaW9uIGNvZWZmaWNpZW50cyBhcmUgcmVwb3J0ZWQgYWxvbmdzaWRlIHN0YW5kYXJkIGVycm9yIGFuZCBwIHZhbHVlLiBURFMgPSBUaW1lIGJldHdlZW4gRG9zZSBhbmQgU2FtcGxlOyBBTkMgPSBBYnNvbHV0ZSBOZXV0cm9waGlsIENvdW50LiIsDQogICAgICAgICAgcC5zdHlsZSA9ICJzdGFycyINCikNCg0KDQpgYGANCg0KPGJyPg0KPGJyPg0KDQoNCmBgYHtyIFNGNSwgaW5jbHVkZSA9IFRSVUUsIGVjaG8gPSBGQUxTRSwgZmlnLmNhcD0iU3VwcGxlbWVudGFyeSBGaWd1cmUgNS4gRm9yZXN0IHBsb3QgY29tcGFyaW5nIHN0YW5kYXJkaXNlZCByZWdyZXNzaW9uIGNvZWZmaWNpZW50cyBmcm9tIGVxdWl2YWxlbnQgbW9kZWxzIGJldHdlZW4gQ0xPWlVLMiAoV2lsbGNvY2tzIGV0IGFsLiwgMjAyMSkgYW5kIENMT1pVSzMgKHByZXNlbnQgd29yaykgZGF0YXNldHMuIFRoZSBDTE9aVUsyIGFuZCBDTE9aVUszIChyZXBsaWNhdGlvbikgbW9kZWxzIGV4cGxvcmUgdGhlIGFzc29jaWF0aW9uIGJldHdlZW4gY292YXJpYXRlcyBhbmQgbG93ZXN0IHZhbHVlIG9mIEFOQyBpbiBjcm9zcy1zZWN0aW9uYWwgc2FtcGxlcy4gVGhlIENMT1pVSzMgKGxtbSkgbW9kZWwgdXRpbGlzZXMgdGhlIGF2YWlsYWJsZSBsb25naXR1ZGluYWwgZGF0YSwgaW5jb3Jwb3JhdGluZyBhIHJhbmRvbSBlZmZlY3QgdmFyaWFibGUgZm9yIHBhcnRpY2lwYW50IElELiBFcnJvciBiYXJzIHNob3cgOTUlIENvbmZpZGVuY2UgSW50ZXJ2YWxzLiBBTkMgPSBBYnNvbHV0ZSBOZXV0cm9waGlsIENvdW50OyBURFMgPSBUaW1lIEJldHdlZW4gRG9zZSBhbmQgU2FtcGxlOyBsbW0gPSBMaW5lYXIgTWl4ZWQtRWZmZWN0IE1vZGVsLiJ9DQoNCm1vZGVsMXMgPC0gbG0obmV1dF9udW1+Y2xvemFwaW5lK25vcmNsb3phcGluZStkYWlseWRvc2UrU0VYK2FnZV9hdF9hc3NheStzdGRfYWdlMitURFMsZGF0YT1DTE9aVUszLmZiYy5way5taW4uc3RkKQ0KDQpwbG90X3N1bW1zKGxtNSwgbW9kZWwxcywgYW5jX2RjbnQsIGxlZ2VuZC50aXRsZSA9ICJEYXRhIiwgcG9pbnQuc2hhcGUgPSBjKCJjaXJjbGUiLCAidHJpYW5nbGUiLCAiZGlhbW9uZCIpICwgbW9kZWwubmFtZXMgPSBjKCJDTE9aVUsyIChXaWxsY29ja3MgZXQgYWwuLCAyMDIxKSIsICJDTE9aVUszIChyZXBsaWNhdGlvbikiLCAiQ0xPWlVLMyAobG1tKSIpLCBjb2xvcnMgPSBjKCAibWVkaXVtcHVycGxlMSIsICJzZWFncmVlbjIiLCAibGlnaHRzbGF0ZWJsdWUiKSwgY29lZnMgPSBjKCJEYWlseSBEb3NlIChtZykiID0gImRhaWx5ZG9zZSIsICJbQ2xvemFwaW5lXSIgPSAiY2xvemFwaW5lIiwgIltOb3JjbG96YXBpbmVdIiA9ICJub3JjbG96YXBpbmUiLCAiU2V4IChNYWxlKSIgPSAiU0VYTUFMRSIsICJBZ2UiID0gImFnZV9hdF9hc3NheSIsICJBZ2UgU3F1YXJlZCIgPSAic3RkYWdlXzIiLCJURFMiID0gIlREUyIsICJEYXlzIGJldHdlZW4gQXNzYXlzIiA9ICJkYXlkaWZmIiwgICJUaW1lIG9uIENsb3phcGluZSIgPSAidGltZW9udHJlYXRtZW50IikpICsNCiBnZ3RpdGxlKCJDb21wYXJpc29uIG9mIEJhc2UgTW9kZWxzIGFjcm9zcyBDTE9aVUsgQ29ob3J0cyIpDQpgYGANCg0KPGJyPg0KPGJyPg0KPGJyPg0KPGJyPg0KDQojIyA8c3Ryb25nPiBTdXBwbGVtZW50YXJ5IFJlZmVyZW5jZXMgPC9zdHJvbmc+DQojIyMgU3VwcGxlbWVudGFyeSBSZWZlcmVuY2VzIA0KDQo8YnI+DQoNCjEuCUx5bmhhbSwgQS4gSi4gZXQgYWwuIERSQUdPTi1EYXRhOiBhIHBsYXRmb3JtIGFuZCBwcm90b2NvbCBmb3IgaW50ZWdyYXRpbmcgZ2Vub21pYyBhbmQgcGhlbm90eXBpYyBkYXRhIGFjcm9zcyBsYXJnZSBwc3ljaGlhdHJpYyBjb2hvcnRzLiBCSlBzeWNoIE9wZW4gOSwgZTMyICgyMDIzKS4NCg0KMi4JRGFzLCBTLiBldCBhbC4gTmV4dC1nZW5lcmF0aW9uIGdlbm90eXBlIGltcHV0YXRpb24gc2VydmljZSBhbmQgbWV0aG9kcy4gTmF0IEdlbmV0IDQ4LCAxMjg04oCTMTI4NyAoMjAxNikuDQoNCjMuCU1jQ2FydGh5LCBTLiBldCBhbC4gQSByZWZlcmVuY2UgcGFuZWwgb2YgNjQsOTc2IGhhcGxvdHlwZXMgZm9yIGdlbm90eXBlIGltcHV0YXRpb24uIE5hdCBHZW5ldCA0OCwgMTI3OeKAkzEyODMgKDIwMTYpLg0KDQo0LglQYXJkacOxYXMsIEEuIEYuIGV0IGFsLiBQaGFybWFjb2tpbmV0aWNzIGFuZCBwaGFybWFjb2dlbm9taWNzIG9mIGNsb3phcGluZSBpbiBhbiBhbmNlc3RyYWxseSBkaXZlcnNlIHNhbXBsZTogYSBsb25naXR1ZGluYWwgYW5hbHlzaXMgYW5kIGdlbm9tZS13aWRlIGFzc29jaWF0aW9uIHN0dWR5IHVzaW5nIFVLIGNsaW5pY2FsIG1vbml0b3JpbmcgZGF0YS4gVGhlIExhbmNldCBQc3ljaGlhdHJ5IDEwLCAyMDnigJMyMTkgKDIwMjMpLg0KDQo1LglMZWUsIFMuLCBTaGluLCBKLi1ZLiwgS3dvbiwgTi4tSi4sIEtpbSwgQy4gJiBTZW8sIEouLVMuIENsaW5QaGFybVNlcTogQSB0YXJnZXRlZCBzZXF1ZW5jaW5nIHBhbmVsIGZvciBjbGluaWNhbCBwaGFybWFjb2dlbmV0aWNzIGltcGxlbWVudGF0aW9uLiBQTE9TIE9ORSAxNywgZTAyNzIxMjkgKDIwMjIpLg0KDQo2LglWYW4gUm9zc3VtLCBHLiAmIERyYWtlLCBGLiBMLiBQeXRob24gMyAgUmVmZXJlbmNlIE1hbnVhbC4gKDIwMDkpLg0KDQo3LglTYWl6LVJvZHLDrWd1ZXosIE0uIGV0IGFsLiBQb2x5bW9ycGhpc21zIGluIENZUDFBMiwgQ1lQMkM5IGFuZCBBQkNCMSBhZmZlY3QgYWdvbWVsYXRpbmUgcGhhcm1hY29raW5ldGljcy4gSiBQc3ljaG9waGFybWFjb2wgMzMsIDUyMuKAkzUzMSAoMjAxOSkuDQoNCjguCUxlc2NoZSwgRC4sIE1vc3RhZmEsIFMuLCBFdmVyYWxsLCBJLiwgUGFudGVsaXMsIEMuICYgQm91c21hbiwgQy4gQS4gSW1wYWN0IG9mIENZUDFBMiwgQ1lQMkMxOSwgYW5kIENZUDJENiBnZW5vdHlwZS0gYW5kIHBoZW5vY29udmVyc2lvbi1wcmVkaWN0ZWQgZW56eW1lIGFjdGl2aXR5IG9uIGNsb3phcGluZSBleHBvc3VyZSBhbmQgc3ltcHRvbSBzZXZlcml0eS4gUGhhcm1hY29nZW5vbWljcyBKIDIwLCAxOTLigJMyMDEgKDIwMjApLg0KDQo5LglUaWFuLCBELiwgTmF0ZXNhbiwgUy4sIFdoaXRlLCBKLiBSLiAmIFBhaW5lLCBNLiBGLiBFZmZlY3RzIG9mIENvbW1vbiBDWVAxQTIgR2Vub3R5cGVzIGFuZCBPdGhlciBLZXkgRmFjdG9ycyBvbiBJbnRyYWluZGl2aWR1YWwgVmFyaWF0aW9uIGluIHRoZSBDYWZmZWluZSBNZXRhYm9saWMgUmF0aW86IEFuIEV4cGxvcmF0b3J5IEFuYWx5c2lzLiBDbGluIFRyYW5zbCBTY2kgMTIsIDM54oCTNDYgKDIwMTkpLg0KDQoxMC4JV2VyaywgQS4gTi4gJiBDYXNjb3JiaSwgSS4gRnVuY3Rpb25hbCBHZW5lIFZhcmlhbnRzIG9mIENZUDNBNC4gQ2xpbmljYWwgUGhhcm1hY29sb2d5ICYgVGhlcmFwZXV0aWNzIDk2LCAzNDDigJMzNDggKDIwMTQpLg0KDQoxMS4JUmVpc2JlcmcsIFMuIGV0IGFsLiBUcmFuc2xhdGluZyBnZW5vdHlwZSBkYXRhIG9mIDQ0LDAwMCBiaW9iYW5rIHBhcnRpY2lwYW50cyBpbnRvIGNsaW5pY2FsIHBoYXJtYWNvZ2VuZXRpYyByZWNvbW1lbmRhdGlvbnM6IGNoYWxsZW5nZXMgYW5kIHNvbHV0aW9ucy4gR2VuZXRpY3MgaW4gTWVkaWNpbmUgMjEsIDEzNDXigJMxMzU0ICgyMDE5KS4NCg0KMTIuCU5leXNoYWJ1cmluZXpoYWQsIE4uLCBHaGFzaW0sIEguLCBSb3VpbmksIE0uLCBEYWFsaSwgWS4gJiBBcmRha2FuaSwgWS4gSC4gRnJlcXVlbmN5IG9mIEltcG9ydGFudCBDWVA0NTAgRW56eW1lIEdlbmUgUG9seW1vcnBoaXNtcyBpbiB0aGUgSXJhbmlhbiBQb3B1bGF0aW9uIGluIENvbXBhcmlzb24gd2l0aCBPdGhlciBNYWpvciBQb3B1bGF0aW9uczogQSBDb21wcmVoZW5zaXZlIFJldmlldyBvZiB0aGUgSHVtYW4gRGF0YS4gSm91cm5hbCBvZiBQZXJzb25hbGl6ZWQgTWVkaWNpbmUgMTEsIDgwNCAoMjAyMSkuDQoNCjEzLglQaGFuLCBMLiBldCBhbC4gQUxGQTogYWxsZWxlIGZyZXF1ZW5jeSBhZ2dyZWdhdG9yLiBOYXRpb25hbCBDZW50ZXIgZm9yIEJpb3RlY2hub2xvZ3kgSW5mb3JtYXRpb24sIFVTIE5hdGlvbmFsIExpYnJhcnkgb2YgTWVkaWNpbmUgMTAsICgyMDIwKS4NCg0KMTQuCVBhcmRpw7FhcywgQS4gRi4gZXQgYWwuIFBoYXJtYWNvZ2Vub21pYyBWYXJpYW50cyBhbmQgRHJ1ZyBJbnRlcmFjdGlvbnMgSWRlbnRpZmllZCBUaHJvdWdoIHRoZSBHZW5ldGljIEFuYWx5c2lzIG9mIENsb3phcGluZSBNZXRhYm9saXNtLiBBSlAgMTc2LCA0NzfigJM0ODYgKDIwMTkpLg0KDQoxNS4JR29sZHN0ZWluLCBKLiBJLiBldCBhbC4gQ2xvemFwaW5lLWluZHVjZWQgYWdyYW51bG9jeXRvc2lzIGlzIGFzc29jaWF0ZWQgd2l0aCByYXJlIEhMQS1EUUIxIGFuZCBITEEtQiBhbGxlbGVzLiBOYXQgQ29tbXVuIDUsIDQ3NTcgKDIwMTQpLg0KDQoxNi4JS29udGUsIEIuIGV0IGFsLiBITEEtRFFCMSA2NjcyRz5DIChyczExMzMzMjQ5NCkgaXMgYXNzb2NpYXRlZCB3aXRoIGNsb3phcGluZS1pbmR1Y2VkIG5ldXRyb3BlbmlhIGFuZCBhZ3JhbnVsb2N5dG9zaXMgaW4gaW5kaXZpZHVhbHMgb2YgRXVyb3BlYW4gYW5jZXN0cnkuIFRyYW5zbCBQc3ljaGlhdHJ5IDExLCAyMTQgKDIwMjEpLg0KDQoxNy4JTmlub21peWEsIEsuLCBTYWl0bywgVC4sIElrZWRhLCBNLiwgSXdhdGEsIE4uICYgR2lyYXJkaW4sIEYuIFIuIFBoYXJtYWNvZ2Vub21pYy1ndWlkZWQgY2xvemFwaW5lIGFkbWluaXN0cmF0aW9uIGJhc2VkIG9uIEhMQS1EUUIxLCBITEEtQiBhbmQgU0xDTzFCMy1TTENPMUI3IHZhcmlhbnRzOiBhbiBlZmZlY3RpdmVuZXNzIGFuZCBjb3N0LWVmZmVjdGl2ZW5lc3MgYW5hbHlzaXMuIEZyb250aWVycyBpbiBQaGFybWFjb2xvZ3kgMTMsICgyMDIyKS4NCg0KMTguCVB1cmNlbGwsIFMuIGV0IGFsLiBQTElOSzogQSBUb29sIFNldCBmb3IgV2hvbGUtR2Vub21lIEFzc29jaWF0aW9uIGFuZCBQb3B1bGF0aW9uLUJhc2VkIExpbmthZ2UgQW5hbHlzZXMuIFRoZSBBbWVyaWNhbiBKb3VybmFsIG9mIEh1bWFuIEdlbmV0aWNzIDgxLCA1NTnigJM1NzUgKDIwMDcpLg0KDQoxOS4JQ2hhbmcsIEMuIEMuIGV0IGFsLiBTZWNvbmQtZ2VuZXJhdGlvbiBQTElOSzogcmlzaW5nIHRvIHRoZSBjaGFsbGVuZ2Ugb2YgbGFyZ2VyIGFuZCByaWNoZXIgZGF0YXNldHMuIEdpZ2FTY2kgNCwgNyAoMjAxNSkuDQoNCjIwLglaaGVuZywgWC4gZXQgYWwuIEhJQkFH4oCUSExBIGdlbm90eXBlIGltcHV0YXRpb24gd2l0aCBhdHRyaWJ1dGUgYmFnZ2luZy4gUGhhcm1hY29nZW5vbWljcyBKIDE0LCAxOTLigJMyMDAgKDIwMTQpLg0KDQoyMS4JTGV2aW4sIEEuIE0uIGV0IGFsLiBBc3NvY2lhdGlvbiBvZiBITEEtRFJCMSB3aXRoIFNhcmNvaWRvc2lzIFN1c2NlcHRpYmlsaXR5IGFuZCBQcm9ncmVzc2lvbiBpbiBBZnJpY2FuIEFtZXJpY2Fucy4gQW0gSiBSZXNwaXIgQ2VsbCBNb2wgQmlvbCA1MywgMjA24oCTMjE2ICgyMDE1KS4NCg0KMjIuCVdpbGxjb2NrcywgSS4gUi4gZXQgYWwuIENsb3phcGluZSBNZXRhYm9saXNtIGlzIEFzc29jaWF0ZWQgV2l0aCBBYnNvbHV0ZSBOZXV0cm9waGlsIENvdW50IGluIEluZGl2aWR1YWxzIFdpdGggVHJlYXRtZW50LVJlc2lzdGFudCBTY2hpem9waHJlbmlhLiBGcm9udCBQaGFybWFjb2wgMTIsIDY1ODczNCAoMjAyMSkuDQoNCjIzLglLcm9ubWFsLCBSLiBBLiBTcHVyaW91cyBDb3JyZWxhdGlvbiBhbmQgdGhlIEZhbGxhY3kgb2YgdGhlIFJhdGlvIFN0YW5kYXJkIFJldmlzaXRlZC4gSm91cm5hbCBvZiB0aGUgUm95YWwgU3RhdGlzdGljYWwgU29jaWV0eS4gU2VyaWVzIEEgKFN0YXRpc3RpY3MgaW4gU29jaWV0eSkgMTU2LCAzNznigJMzOTIgKDE5OTMpLg0KDQoyNC4JUm9ocmVyLCBKLiBNLiBUaGlua2luZyBDbGVhcmx5IEFib3V0IENvcnJlbGF0aW9ucyBhbmQgQ2F1c2F0aW9uOiBHcmFwaGljYWwgQ2F1c2FsIE1vZGVscyBmb3IgT2JzZXJ2YXRpb25hbCBEYXRhLiBBZHZhbmNlcyBpbiBNZXRob2RzIGFuZCBQcmFjdGljZXMgaW4gUHN5Y2hvbG9naWNhbCBTY2llbmNlIDEsIDI34oCTNDIgKDIwMTgpLg0KDQoyNS4JQmF0ZXMsIEQuLCBNw6RjaGxlciwgTS4sIEJvbGtlciwgQi4gJiBXYWxrZXIsIFMuIEZpdHRpbmcgTGluZWFyIE1peGVkLUVmZmVjdHMgTW9kZWxzIFVzaW5nIGxtZTQuIEpvdXJuYWwgb2YgU3RhdGlzdGljYWwgU29mdHdhcmUgNjcsIDHigJM0OCAoMjAxNSkuDQoNCjI2LglLdXpuZXRzb3ZhLCBBLiwgQnJvY2tob2ZmLCBQLiBCLiAmIENocmlzdGVuc2VuLCBSLiBILiBCLiBsbWVyVGVzdCBQYWNrYWdlOiBUZXN0cyBpbiBMaW5lYXIgTWl4ZWQgRWZmZWN0cyBNb2RlbHMuIEpvdXJuYWwgb2YgU3RhdGlzdGljYWwgU29mdHdhcmUgODIsIDHigJMyNiAoMjAxNykuDQoNCjI3LglUaW5nbGV5LCBELiwgWWFtYW1vdG8sIFQuLCBIaXJvc2UsIEsuLCBLZWVsZSwgTC4gJiBJbWFpLCBLLiBtZWRpYXRpb246IFIgUGFja2FnZSBmb3IgQ2F1c2FsIE1lZGlhdGlvbiBBbmFseXNpcy4gSm91cm5hbCBvZiBTdGF0aXN0aWNhbCBTb2Z0d2FyZSA1OSwgMeKAkzM4ICgyMDE0KS4NCg0KMjguCVJvc3NlZWwsIFkuIGxhdmFhbjogQW4gUiBQYWNrYWdlIGZvciBTdHJ1Y3R1cmFsIEVxdWF0aW9uIE1vZGVsaW5nLiBKb3VybmFsIG9mIFN0YXRpc3RpY2FsIFNvZnR3YXJlIDQ4LCAx4oCTMzYgKDIwMTIpLg0KDQoyOS4JVmFxdWVyby1CYWV6LCBNLiBldCBhbC4gQ2xvemFwaW5lIGFuZCBkZXNtZXRoeWxjbG96YXBpbmU6IGNvcnJlbGF0aW9uIHdpdGggbmV1dHJvcGhpbHMgYW5kIGxldWNvY3l0ZXMgY291bnRpbmcgaW4gTWV4aWNhbiBwYXRpZW50cyB3aXRoIHNjaGl6b3BocmVuaWEgfCBCTUMgUHN5Y2hpYXRyeSB8IEZ1bGwgVGV4dC4gQk1DIFBzeWNoaWF0cnkgMTksICgyMDE5KS4NCg0KMzAuCVBhdGlsLCBJLiBldCBhbC4gZGF0YXdpemFyZDogQW4gUiBQYWNrYWdlIGZvciBFYXN5IERhdGEgUHJlcGFyYXRpb24gYW5kIFN0YXRpc3RpY2FsIFRyYW5zZm9ybWF0aW9ucy4gSm91cm5hbCBvZiBPcGVuIFNvdXJjZSBTb2Z0d2FyZSA3LCA0Njg0ICgyMDIyKS4NCg0KDQoNCg0KDQoNCjxicj4NCjxicj4NCjxicj4NCjxicj4NCg0KIyMgPHN0cm9uZz4gU2Vzc2lvbiBJbmZvIDwvc3Ryb25nPg0KIyMjIFNlc3Npb24gSW5mbw0KYGBge3Igc2Vzc2lvbiBpbmZvfQ0Kc2Vzc2lvbkluZm8oKQ0KYGBgDQoNCg==