About
Overview
This ADA uses data from the project “The effect of intranasal oxytocin on neural functioning in widow(er)s” (#1503744420, PI: Mary-Frances O’Connor, Co-PI: Brian Arizmendi). It was a double-blind randomized crossover study, designed to address conflicting accounts of motivated behavior in complicated grief using a novel approach-avoidance task variant (grief AAT; gAAT) that allows for comparison between participant-provided photos and nomothetic grief stimuli. Participants were 40 bereaved adults ages 55-80, who experienced the death of a spouse or long-term romantic partner between six months and three years prior to their participation.
Task
Participants attended two identical experimental sessions, at which they received one of two intranasal sprays (treatment A/B) and then took part in an fMRI scan, which involved a structural sequence, the gAAT, and a resting state sequence.
For the gAAT, five stimulus categories were presented: (1) deceased spouse, (2) living loved one [another attachment figure], (3) stranger, (4) generic grief-related scenes, and (5) neutral scenes. Photos provided by the participant were scanned and resized to a standard 750-pixel height and width, and framed in colored frames to match the stimuli used for non-idiographic categories (i.e., stranger, grief-related, neutral). Photos of the stranger were sex-matched to the participant’s partner.
During the task, participants were instructed to follow rules based on an irrelevant characteristic of the stimuli, namely, the color of the frame around the photo (e.g., “push the joystick when the frame is blue, pull when the frame is yellow”). The task was completed in two runs of approximately seven minutes each. In the second run, the instructions were reversed (e.g. “now pull the joystick for blue framed photos”). Order of instructions was counterbalanced across participants. Stimuli were presented via Inquisit 4 (2014), in a pseudorandomized order determined by genetic algorithm to optimize statistical power and psychological validity (Wager & Nichols, 2003). Each trial last 3000ms, with 2500 ms allowed for response. Intertrial interval was 500ms.
Participants completed the task using an MRI-compatible joystick. The stimuli were animated so that a joystick push would make the image smaller (as if they were pushing it away from them) and a joystick pull would make the image larger (as if they were bringing it nearer to them).
Variables
The primary dependent variable of interest for the present analysis is reaction time bias, computed as RTpush-RTpull. Negative bias scores (faster to push than pull) indicate relative avoidance bias, while positive scores (faster to pull than to push) indicate relative approach bias. Because the two runs were identical in every way except for the instruction provided, each trial had both a push RT and a pull RT (e.g., run1 trial1 was push, run2 trial1 was pull, so subtract RT on run2 trial 1 from run1 trial1 to get the difference - this is further elaborated in the data cleaning script below), unless they failed to reverse the instructions.
Main predictors of interest included trial number (in order to establish whether peoples’ response bias changed over the 7-minute run), stimulus (neutral, spouse, stranger, living loved one, death), and condition (treatment A/B - oxytocin or placebo [I’m still blinded]).
Participants also completed a number of self-report measures (state and trait) and provided biological samples for OXTR genotyping and cortisol assay, some of which were used as predictors.
Analyses (NHST)
Remember, the effect of time refers to trialnumber (this is NOT the time variable; time refers to time of day when task was run.)
The dependent variable, bias_t, is the measure of relative behavioral approach/avoidance bias, based on reaction time to push or pull a joystick in response to various images. We transformed it because it was not normally distributed, and use the transformed variable for all analyses.
Unconditional means model
The overall mean bias score (transformed) is about -0.002, with a standard deviation of 0.023.
ICC is about 1.6% of the variance. This means that 1.6% of the variance in bias is explained by people being different from one another, while the remainder is explained by…something else.
Add fixed and random intercept and slope of time
The average bias at trial number = 0 is -0.016 and gets increasingly approach-biased by a nonsignificant fraction of a percent with each unit of time. There is no significant effect of trial number (time) on RT bias score, t = 0.74, p = 0.457.
99.99% of variance in bias is due to the between-person variance, after controlling for time. This is consistent with the lack of a significant effect of time.
Adding stimulus as a fixed effect
There were 5 different types of stimuli, presented in a randomized order (consistent across participants/sessions) determined by genetic algorithm. Everyone saw the same stimuli in the same order, so it is a fixed effect. The different categories of images were: Death (generic), Deceased (personal photo), Other living loved one (personal photo), Stranger (sex-matched to spouse), and Neutral (objects). The factor stim was created such that Neutral was the reference level.
NO effect of time. There is a significant fixed effect of spouse, t = 3.55, p = .0004. There is also a non-significant effect of stranger, t = -1.73, p = .084. This indicates that people tended to show more approach bias to photos of their spouse (across conditions). The parameter estimate is 0.12 with an SE of 0.03. They also tended to show greater more avoidance bias to photos of the sex-matched stranger.
95% CIs don’t cross zero for spouse, but do for all other stimulus types. This supports the significant effect of spouse stimuli on reaction time bias.
The ICC is identical to that in model 2.
Comparing the model with the fixed effect of stimulus (m3) to the model without (m2), m3 is better (p < .0001) as evidenced by lower AIC, BIC, and lL values.
Take out fixed and random effect of time
Because there’s no significant effect of time, makes sense to drop it from the model. Now we’re basically doing regression but accounting for whatever interdependence exists. Note that these results will NOT match the results of the regressions, because the regressions are based on bias score medians as the DV, rather than means.
Fixed effects are still more or less the same - significant for spouse, marginal for stranger - although the parameter estimates and test statistics are slightly different.
As above, spouse is the only stimulus category whose 95 CIs don’t cross zero, supporting a significant effect of spouse on bias - in this case, viewing spouse images was associated with a relative approach bias.
Is m4 any better than m3?
Nope. Models do not significantly differ (p = 0.851), though the AIC and BIC values are a little smaller for m4 than m3. So let’s forget time and go with m4…
Adding condition as a fixed effect
Participants completed the task at two different sessions, where they were randomized to receive treatment A at one and treatment B at the other (order counterbalanced across participants). The two treatments are oxytocin vs. placebo.
The fixed effect of condition B is not significant, t = 0.15, p = 0.884.
The two models are not significantly different, but the one with the fixed effect of condition (m5) has slightly higher AIC/BIC. Not compelling enough to select that model over m4, though.
Adding the stimulus*condition interaction
We might expect that peoples’ tendency to approach or avoid might differ depending on which treatment they got, but only for certain stimuli.
Interesting. With the interaction in the model, there is a significant effect of death and stranger but not spouse. 95% CIs indicate that viewing the generic death and stranger stimuli are both associated with greater relative avoidance bias.
The model with the interaction in it is not significantly better than either the one with just the fixed effect of condition or with no effect of condition at all, so makes sense to go with the simplest model which only includes stimulus as a fixed effect.
Adding other plausible predictors
There are a few other variables that we might expect to impact approach/avoidance bias, namely grief severity, OXTR genotype, time since death, and attachment style (avoidant, anxious).
None of the added fixed effects are significant in the new model, and the AIC/BIC values are higher, so take ’em out.
Final model
A case of significant, but not meaningful: The R2 for the entire model is .02, indicating that 2% of the variance in bias is explained by the model. So this model is not very good at predicting approach/avoidance bias from the fixed effect of stimulus within person. Oh well.
Check final model assumptions
Checking normality of the residuals
The QQ plot looks pretty okay, albeit a few outliers. D113 is the person who most falls off the line, and does so at both ends. The residuals are also pretty evenly distributed across time, though many fall outside of the +/- 2 range.
Getting an error here for the random slopes Error in [.data.frame(ranef(m4), 72) : undefined columns selected. I think this may be because I don’t have any random slopes, since I took time out of the model. Indeed, when I go into m4, it doesn’t look like a second element for the slopes exists. Let’s test this…
My suspicion was correct: the error message above is because there are no random slopes for my final model.
Checking homoscedasticity
Note that again there are a lot of residuals falling outside of the +/-2 range.
Also, there’s something weird about the L2 plot. Not sure why it shows only 3 of 5 stimulus types.
Analyses (Bayesian)
Unconditional means model
First step is to look at the unconditional means model. We know from the exploratory stuff in previous sections that bias_t is normally distributed, so we can tell brms to use normal likelihood (Gaussian).
library(brms)
# b1N <- brm(bias_t ~ 1 + (1|ID), data=data, family=gaussian())
# saveRDS(b1N, "mlm_ada1_b1N.rds")
summary(b1N)
Family: gaussian
Links: mu = identity; sigma = identity
Formula: bias_t ~ 1 + (1 | ID)
Data: data (Number of observations: 9289)
Samples: 4 chains, each with iter = 2000; warmup = 1000; thin = 1;
total post-warmup samples = 4000
Group-Level Effects:
~ID (Number of levels: 35)
Estimate Est.Error l-95% CI u-95% CI Eff.Sample Rhat
sd(Intercept) 0.13 0.02 0.10 0.17 1184 1.00
Population-Level Effects:
Estimate Est.Error l-95% CI u-95% CI Eff.Sample Rhat
Intercept -0.00 0.02 -0.05 0.05 1712 1.00
Family Specific Parameters:
Estimate Est.Error l-95% CI u-95% CI Eff.Sample Rhat
sigma 0.99 0.01 0.98 1.01 4000 1.00
Samples were drawn using sampling(NUTS). For each parameter, Eff.Sample
is a crude measure of effective sample size, and Rhat is the potential
scale reduction factor on split chains (at convergence, Rhat = 1).
Rhat = 1 across the board, so that’s good.
plot(b1N) # check trace plots


I think these plots look okay? b_Intercept and SD_ID__Intercept plots are not exactly on top of each other, but do have a lot of overlap in their distributions.
pp_check(b1N, nsamples=20) # posterior predictive check using normal likelihood

pp_check(b1N, type="error_hist", nsamples=20, binwidth=1) # error histogram (histogram of prediction residuals)

The observed distribution is a very good fit to the predicted data (based on the normal distribution). The error histogram also shows that residuals are normally distributed around 0. See this page for some helpful documentation.
# check ICC to get sense of how variance is distributed between- and within- people
iSd <- as.numeric(summary(b1N)$random$ID[1,1]) # finds 1st row, 1st column of random effects inside the summary of b1N
iVar <- iSd^2
residSd <- as.numeric(summary(b1N)$spec_pars[[1,1]])
residVar <- residSd^2
icc1 <- iVar/(iVar+residVar)
icc1 # this is the unconditional growth model - just happens in this dataset that it's a nuisance model
[1] 0.01749842
For the unconditional growth model, the ICC is 0.017, meaning that only about 2% of the variance in bias is because people on average perform differently from each other on the task.
Time as fixed and random effect
## check whether we need time as a control variable
# b2 <- brm(bias_t ~ 1 + trialnum + (1 + trialnum|ID), data=data, family=skew_normal(), control=list(adapt_delta = .95))
# saveRDS(b2, "mlm_ada1_b2.rds")
summary(b2)
Family: skew_normal
Links: mu = identity; sigma = identity; alpha = identity
Formula: bias_t ~ 1 + trialnum + (1 + trialnum | ID)
Data: data (Number of observations: 9289)
Samples: 4 chains, each with iter = 2000; warmup = 1000; thin = 1;
total post-warmup samples = 4000
Group-Level Effects:
~ID (Number of levels: 35)
Estimate Est.Error l-95% CI u-95% CI Eff.Sample Rhat
sd(Intercept) 0.12 0.03 0.07 0.17 1651 1.00
sd(trialnum) 0.00 0.00 0.00 0.00 510 1.01
cor(Intercept,trialnum) 0.22 0.47 -0.75 0.95 2352 1.00
Population-Level Effects:
Estimate Est.Error l-95% CI u-95% CI Eff.Sample Rhat
Intercept -0.02 0.03 -0.07 0.04 1819 1.00
trialnum 0.00 0.00 -0.00 0.00 4000 1.00
Family Specific Parameters:
Estimate Est.Error l-95% CI u-95% CI Eff.Sample Rhat
sigma 0.99 0.01 0.98 1.01 4000 1.00
alpha -0.02 0.35 -0.64 0.60 4000 1.00
Samples were drawn using sampling(NUTS). For each parameter, Eff.Sample
is a crude measure of effective sample size, and Rhat is the potential
scale reduction factor on split chains (at convergence, Rhat = 1).
Note: Estimate = mean of posterior distribution for each of the parameters.
Group-level effects: When trialnum is 0, the standard deviation of the intercepts is 0.12. There is no random effect of time: the slopes are not at all variable (people are not different from each other). Zero is a credible value for the correlation, because the 95% CIs (credible intervals) cross zero.
Note that Rhat for sd(trialnum) in the random effects is 1.01. Per the brms documentation, this does not seem to indicate a convergence issue due to lack of error messages and the fact that the Rhat for the group-level effect in their example is 1.01: “If ‘Rhat’ is considerably greater than 1, the algorithm has not yet converged and it is necessary to run more iterations and / or set stronger priors.” However, it does indicate that I would probably want to run it again with a higher number of iterations or stronger priors.
Population-level effects: There is no fixed effect of time, either, given that the upper and lower CI limits are -0.0, 0.0.
plot(b2)



SD_ID__trialnum and cor_ID__Intercept__trialnum are totally skewed.
pp_check(b2, nsamples=20)

pp_check(b2, type="error_hist", nsamples=20, binwidth=1)

Again, the trace plot shows that the observed distribution is a very good fit to the predicted data based on the normal distribution. The error histogram also shows that residuals are normally distributed around 0.
SKIPPING THE CHUNK BELOW… I can’t get sjstats to install (issue with the specific TMB package version- freaking dependencies are the bane of my existence with all these different packages), and no point in running cross validation on a model that we’re going to drop anyway due to lack of both fixed/random effects of time.
# install.packages("sjstats")
# library(sjstats)
# equi_test(b2) # is there a fixed effect?
# waic(b1N, b2) # does WAIC think we should keep time? If so, given there is no fixed effect, this is due to the random effect accounting for variance.
# b1 <- add_ic(b1, ic="R2")
# b2 <- add_ic(b2, ic="R2")
# mean(b1$R2)
# mean(b2$R2) # does R2 thinks we should keep time?
# kfold(b1SN, b2, K=10) # use CV to check for over-fitting
# this takes too long, so reduce n(folds) or only perform for final model
Fixed effect of stimulus
# b3 <- brm(bias_t ~ 1 + stim + (1 |ID), data=data, family=skew_normal(), control=list(adapt_delta = .95))
# saveRDS(b3, "mlm_ada1_b3.rds")
summary(b3)
Family: skew_normal
Links: mu = identity; sigma = identity; alpha = identity
Formula: bias_t ~ 1 + stim + (1 | ID)
Data: data (Number of observations: 9289)
Samples: 4 chains, each with iter = 2000; warmup = 1000; thin = 1;
total post-warmup samples = 4000
Group-Level Effects:
~ID (Number of levels: 35)
Estimate Est.Error l-95% CI u-95% CI Eff.Sample Rhat
sd(Intercept) 0.13 0.02 0.10 0.17 981 1.00
Population-Level Effects:
Estimate Est.Error l-95% CI u-95% CI Eff.Sample Rhat
Intercept -0.01 0.03 -0.07 0.05 1156 1.00
stimdeath -0.05 0.03 -0.12 0.01 2955 1.00
stimliving 0.04 0.03 -0.02 0.11 2423 1.00
stimspouse 0.12 0.03 0.05 0.18 2704 1.00
stimstranger -0.06 0.03 -0.12 0.01 2560 1.00
Family Specific Parameters:
Estimate Est.Error l-95% CI u-95% CI Eff.Sample Rhat
sigma 0.99 0.01 0.98 1.00 4000 1.00
alpha -0.04 0.35 -0.65 0.58 3285 1.00
Samples were drawn using sampling(NUTS). For each parameter, Eff.Sample
is a crude measure of effective sample size, and Rhat is the potential
scale reduction factor on split chains (at convergence, Rhat = 1).
Similar to the results of the NHST analysis, there is a notable fixed effect of spouse (estimate = 0.12, est. error = 0.03, 95% CI[0.05,0.18]) on bias, such that people show more approach bias on trials where the stimulus is their spouse.
plot(b3)



marginal_effects(b3)

The high density intervals illustrate the positive effect of spouse on bias, which we also see in the marginal effects plot. In the analysis above, the 95% CI for death and stranger stimuli barely crossed zero, which corresponds with what we see in the marginal effects plot, where the upper limit of the error bar is very close to zero (or below). This also corresponds with the effects we saw in NHST, where there were significant or marginally significant effects of death and stranger in addition to spouse.
pp_check(b3, nsamples=20)

pp_check(b3, type="error_hist", nsamples=20, binwidth=1) # looks like we have improved the residuals; if we rerun this random sampling at least some of the time we no longer see the lower end outliers

# equi_test(b3) # TRY THIS CODE WHEN I GET SJTOOLS TO INSTALL (what does ROPE tells us about the size of effect?)
# waic(b2, b3) # TRY THIS CODE WHEN I GET SJTOOLS TO INSTALL
b2 <- add_ic(b2, ic="R2")
b3 <- add_ic(b3, ic="R2")
round(mean(b2$R2), digits=3)
[1] 0.017
round(mean(b3$R2), digits=3)
[1] 0.02
In both models, we have explained about 2 percent of the variance (1.7% vs. 2.0%).
Adding the stimulus*condition interaction (no time)
One of the original study hypotheses was that there would be an interaction (actually, a 3-way interaction with group, but not going to go there for ADA #1; also we may be underpowered for that) between stimulus and condition, such that people might display different response biases for different stimulus categories in condition A vs. B, or vice versa.
# b4 <- brm(bias_t ~ 1 + stim*cond + (1|ID), data=data, family=skew_normal(), control=list(adapt_delta = .95))
# saveRDS(b4, "mlm_ada1_b4.rds")
summary(b4)
Family: skew_normal
Links: mu = identity; sigma = identity; alpha = identity
Formula: bias_t ~ 1 + stim * cond + (1 | ID)
Data: data (Number of observations: 9289)
Samples: 4 chains, each with iter = 2000; warmup = 1000; thin = 1;
total post-warmup samples = 4000
Group-Level Effects:
~ID (Number of levels: 35)
Estimate Est.Error l-95% CI u-95% CI Eff.Sample Rhat
sd(Intercept) 0.13 0.02 0.10 0.17 1088 1.00
Population-Level Effects:
Estimate Est.Error l-95% CI u-95% CI Eff.Sample Rhat
Intercept 0.02 0.04 -0.06 0.10 1357 1.00
stimdeath -0.11 0.05 -0.20 -0.02 1815 1.00
stimliving 0.04 0.05 -0.05 0.13 1791 1.00
stimspouse 0.06 0.05 -0.03 0.16 2030 1.00
stimstranger -0.09 0.05 -0.18 -0.00 2068 1.00
condB -0.05 0.05 -0.15 0.04 1546 1.00
stimdeath:condB 0.11 0.07 -0.02 0.24 1760 1.00
stimliving:condB 0.01 0.06 -0.12 0.13 1959 1.00
stimspouse:condB 0.11 0.07 -0.02 0.24 2012 1.00
stimstranger:condB 0.07 0.06 -0.06 0.20 2009 1.00
Family Specific Parameters:
Estimate Est.Error l-95% CI u-95% CI Eff.Sample Rhat
sigma 0.99 0.01 0.98 1.00 4000 1.00
alpha -0.05 0.35 -0.64 0.58 3415 1.00
Samples were drawn using sampling(NUTS). For each parameter, Eff.Sample
is a crude measure of effective sample size, and Rhat is the potential
scale reduction factor on split chains (at convergence, Rhat = 1).
# b4 <- readRDS("mlm_ada1_b4.rds")
Got some warnings while running:
Rejecting initial value: Gradient evaluated at the initial value is not finite. Stan can't start sampling from this initial value. Rejecting initial value: Log probability evaluates to log(0), i.e. negative infinity. Stan can't start sampling from this initial value.
Apparently setting priors may help with this.
Here, we see notable effects of death and stranger stimuli, but not condition nor its interaction with stimulus type.
plot(b4)




marginal_effects(b4)



pp_check(b4, nsamples=20)

pp_check(b4, type="error_hist", nsamples=20, binwidth=1) # residuals seem about the same

# equi_test(b4)
Nothing terribly new here, except for the marginal effects. Looking at the plot for stim, the distributions for spouse and stranger and spouse and death don’t seem to overlap, and living loved one and death just barely overlap. Unsurprisingly, people tend to show more approach bias for spouse and living loved one photos compared to death and stranger photos. The third marginal effects plot illustrates the lack of condition or stimulus*condition interaction effects.
The variance accounted for shows a negligable increase with the stimulus*condition interaction in the model (goes from 0.020 to 0.022). The negligable effect is shown in the plot - note no real differences
Using priors
# First find out what default priors are.
get_prior(bias_t ~ 1 + stim*cond + (1|ID), data=data, family=skew_normal())
brms has set some weakly informative default priors on some of the special parameters. The default for the random coefficients is a half student-t with 3 degrees of freedom.
Let’s assume some weak prior knowledge from previous research. It would actually be somewhat difficult to get solid priors from previous research on this task, given that no previous work has used this specific variant in this population with this specific manipulation (i.e., oxytocin vs. placebo) so I’m making these numbers up.
Based on the error message here (The following priors do not correspond to any model parameter…), I clearly have no idea what I’m doing and need to go back to that lesson (get_prior was not helpful to me, but thanks anyway, brms).
LS0tCnRpdGxlOiAiTUxNIEFEQSAjMSB2MiIKYXV0aG9yOiAiU2FyZW4gU2VlbGV5IgpkYXRlOiAiMTAtMjItMjAxOCIKb3V0cHV0OgogIGh0bWxfbm90ZWJvb2s6CiAgICBudW1iZXJfc2VjdGlvbnM6IG5vCiAgICB0aGVtZTogcGFwZXIKICAgIHRvYzogeWVzCiAgICB0b2NfZmxvYXQ6IHllcwogIGh0bWxfZG9jdW1lbnQ6CiAgICBkZl9wcmludDogcGFnZWQKICAgIHRvYzogeWVzCi0tLQojIyBBYm91dAojIyMgT3ZlcnZpZXcKVGhpcyBBREEgdXNlcyBkYXRhIGZyb20gdGhlIHByb2plY3Qg4oCcVGhlIGVmZmVjdCBvZiBpbnRyYW5hc2FsIG94eXRvY2luIG9uIG5ldXJhbCBmdW5jdGlvbmluZyBpbiB3aWRvdyhlcilz4oCdICgjMTUwMzc0NDQyMCwgUEk6IE1hcnktRnJhbmNlcyBPJ0Nvbm5vciwgQ28tUEk6IEJyaWFuIEFyaXptZW5kaSkuIEl0IHdhcyBhIGRvdWJsZS1ibGluZCByYW5kb21pemVkIGNyb3Nzb3ZlciBzdHVkeSwgZGVzaWduZWQgdG8gYWRkcmVzcyBjb25mbGljdGluZyBhY2NvdW50cyBvZiBtb3RpdmF0ZWQgYmVoYXZpb3IgaW4gY29tcGxpY2F0ZWQgZ3JpZWYgdXNpbmcgYSBub3ZlbCBhcHByb2FjaC1hdm9pZGFuY2UgdGFzayB2YXJpYW50IChncmllZiBBQVQ7IGdBQVQpIHRoYXQgYWxsb3dzIGZvciBjb21wYXJpc29uIGJldHdlZW4gcGFydGljaXBhbnQtcHJvdmlkZWQgcGhvdG9zIGFuZCBub21vdGhldGljIGdyaWVmIHN0aW11bGkuIFBhcnRpY2lwYW50cyB3ZXJlIDQwIGJlcmVhdmVkIGFkdWx0cyBhZ2VzIDU1LTgwLCB3aG8gZXhwZXJpZW5jZWQgdGhlIGRlYXRoIG9mIGEgc3BvdXNlIG9yIGxvbmctdGVybSByb21hbnRpYyBwYXJ0bmVyIGJldHdlZW4gc2l4IG1vbnRocyBhbmQgdGhyZWUgeWVhcnMgcHJpb3IgdG8gdGhlaXIgcGFydGljaXBhdGlvbi4gCgojIyMgVGFzawpQYXJ0aWNpcGFudHMgYXR0ZW5kZWQgdHdvIGlkZW50aWNhbCBleHBlcmltZW50YWwgc2Vzc2lvbnMsIGF0IHdoaWNoIHRoZXkgcmVjZWl2ZWQgb25lIG9mIHR3byBpbnRyYW5hc2FsIHNwcmF5cyAodHJlYXRtZW50IEEvQikgYW5kIHRoZW4gdG9vayBwYXJ0IGluIGFuIGZNUkkgc2Nhbiwgd2hpY2ggaW52b2x2ZWQgYSBzdHJ1Y3R1cmFsIHNlcXVlbmNlLCB0aGUgZ0FBVCwgYW5kIGEgcmVzdGluZyBzdGF0ZSBzZXF1ZW5jZS4KCkZvciB0aGUgZ0FBVCwgZml2ZSBzdGltdWx1cyBjYXRlZ29yaWVzIHdlcmUgcHJlc2VudGVkOiAoMSkgZGVjZWFzZWQgc3BvdXNlLCAoMikgbGl2aW5nIGxvdmVkIG9uZSBbYW5vdGhlciBhdHRhY2htZW50IGZpZ3VyZV0sICgzKSBzdHJhbmdlciwgKDQpIGdlbmVyaWMgZ3JpZWYtcmVsYXRlZCBzY2VuZXMsIGFuZCAoNSkgbmV1dHJhbCBzY2VuZXMuIFBob3RvcyBwcm92aWRlZCBieSB0aGUgcGFydGljaXBhbnQgd2VyZSBzY2FubmVkIGFuZCByZXNpemVkIHRvIGEgc3RhbmRhcmQgNzUwLXBpeGVsIGhlaWdodCBhbmQgd2lkdGgsIGFuZCBmcmFtZWQgaW4gY29sb3JlZCBmcmFtZXMgdG8gbWF0Y2ggdGhlIHN0aW11bGkgdXNlZCBmb3Igbm9uLWlkaW9ncmFwaGljIGNhdGVnb3JpZXMgKGkuZS4sIHN0cmFuZ2VyLCBncmllZi1yZWxhdGVkLCBuZXV0cmFsKS4gUGhvdG9zIG9mIHRoZSBzdHJhbmdlciB3ZXJlIHNleC1tYXRjaGVkIHRvIHRoZSBwYXJ0aWNpcGFudCdzIHBhcnRuZXIuIAoKRHVyaW5nIHRoZSB0YXNrLCBwYXJ0aWNpcGFudHMgd2VyZSBpbnN0cnVjdGVkIHRvIGZvbGxvdyBydWxlcyBiYXNlZCBvbiBhbiBpcnJlbGV2YW50IGNoYXJhY3RlcmlzdGljIG9mIHRoZSBzdGltdWxpLCBuYW1lbHksIHRoZSBjb2xvciBvZiB0aGUgZnJhbWUgYXJvdW5kIHRoZSBwaG90byAoZS5nLiwgXyJwdXNoIHRoZSBqb3lzdGljayB3aGVuIHRoZSBmcmFtZSBpcyBibHVlLCBwdWxsIHdoZW4gdGhlIGZyYW1lIGlzIHllbGxvdyJfKS4gVGhlIHRhc2sgd2FzIGNvbXBsZXRlZCBpbiB0d28gcnVucyBvZiBhcHByb3hpbWF0ZWx5IHNldmVuIG1pbnV0ZXMgZWFjaC4gSW4gdGhlIHNlY29uZCBydW4sIHRoZSBpbnN0cnVjdGlvbnMgd2VyZSByZXZlcnNlZCAoZS5nLiBfIm5vdyBwdWxsIHRoZSBqb3lzdGljayBmb3IgYmx1ZSBmcmFtZWQgcGhvdG9zIl8pLiBPcmRlciBvZiBpbnN0cnVjdGlvbnMgd2FzIGNvdW50ZXJiYWxhbmNlZCBhY3Jvc3MgcGFydGljaXBhbnRzLiBTdGltdWxpIHdlcmUgcHJlc2VudGVkIHZpYSBJbnF1aXNpdCA0ICgyMDE0KSwgaW4gYSBwc2V1ZG9yYW5kb21pemVkIG9yZGVyIGRldGVybWluZWQgYnkgZ2VuZXRpYyBhbGdvcml0aG0gdG8gb3B0aW1pemUgc3RhdGlzdGljYWwgcG93ZXIgYW5kIHBzeWNob2xvZ2ljYWwgdmFsaWRpdHkgKFdhZ2VyICYgTmljaG9scywgMjAwMykuIEVhY2ggdHJpYWwgbGFzdCAzMDAwbXMsIHdpdGggMjUwMCBtcyBhbGxvd2VkIGZvciByZXNwb25zZS4gSW50ZXJ0cmlhbCBpbnRlcnZhbCB3YXMgNTAwbXMuCgpQYXJ0aWNpcGFudHMgY29tcGxldGVkIHRoZSB0YXNrIHVzaW5nIGFuIE1SSS1jb21wYXRpYmxlIGpveXN0aWNrLiBUaGUgc3RpbXVsaSB3ZXJlIGFuaW1hdGVkIHNvIHRoYXQgYSBqb3lzdGljayBwdXNoIHdvdWxkIG1ha2UgdGhlIGltYWdlIHNtYWxsZXIgKGFzIGlmIHRoZXkgd2VyZSBwdXNoaW5nIGl0IGF3YXkgZnJvbSB0aGVtKSBhbmQgYSBqb3lzdGljayBwdWxsIHdvdWxkIG1ha2UgdGhlIGltYWdlIGxhcmdlciAoYXMgaWYgdGhleSB3ZXJlIGJyaW5naW5nIGl0IG5lYXJlciB0byB0aGVtKS4KCiMjIyBWYXJpYWJsZXMKVGhlIHByaW1hcnkgZGVwZW5kZW50IHZhcmlhYmxlIG9mIGludGVyZXN0IGZvciB0aGUgcHJlc2VudCBhbmFseXNpcyBpcyAqKnJlYWN0aW9uIHRpbWUgYmlhcyoqLCBjb21wdXRlZCBhcyBSVDxzdWI+cHVzaDwvc3ViPi1SVDxzdWI+cHVsbDwvc3ViPi4gTmVnYXRpdmUgYmlhcyBzY29yZXMgKGZhc3RlciB0byBwdXNoIHRoYW4gcHVsbCkgaW5kaWNhdGUgcmVsYXRpdmUgYXZvaWRhbmNlIGJpYXMsIHdoaWxlIHBvc2l0aXZlIHNjb3JlcyAoZmFzdGVyIHRvIHB1bGwgdGhhbiB0byBwdXNoKSBpbmRpY2F0ZSByZWxhdGl2ZSBhcHByb2FjaCBiaWFzLiBCZWNhdXNlIHRoZSB0d28gcnVucyB3ZXJlIGlkZW50aWNhbCBpbiBldmVyeSB3YXkgZXhjZXB0IGZvciB0aGUgaW5zdHJ1Y3Rpb24gcHJvdmlkZWQsIGVhY2ggdHJpYWwgaGFkIGJvdGggYSBwdXNoIFJUIGFuZCBhIHB1bGwgUlQgKGUuZy4sIHJ1bjEgdHJpYWwxIHdhcyBwdXNoLCBydW4yIHRyaWFsMSB3YXMgcHVsbCwgc28gc3VidHJhY3QgUlQgb24gcnVuMiB0cmlhbCAxIGZyb20gcnVuMSB0cmlhbDEgdG8gZ2V0IHRoZSBkaWZmZXJlbmNlIC0gdGhpcyBpcyBmdXJ0aGVyIGVsYWJvcmF0ZWQgaW4gdGhlIGRhdGEgY2xlYW5pbmcgc2NyaXB0IGJlbG93KSwgdW5sZXNzIHRoZXkgZmFpbGVkIHRvIHJldmVyc2UgdGhlIGluc3RydWN0aW9ucy4KCk1haW4gcHJlZGljdG9ycyBvZiBpbnRlcmVzdCBpbmNsdWRlZCAqKnRyaWFsIG51bWJlcioqIChpbiBvcmRlciB0byBlc3RhYmxpc2ggd2hldGhlciBwZW9wbGVzJyByZXNwb25zZSBiaWFzIGNoYW5nZWQgb3ZlciB0aGUgNy1taW51dGUgcnVuKSwgKipzdGltdWx1cyoqIChuZXV0cmFsLCBzcG91c2UsIHN0cmFuZ2VyLCBsaXZpbmcgbG92ZWQgb25lLCBkZWF0aCksIGFuZCAqKmNvbmRpdGlvbioqICh0cmVhdG1lbnQgQS9CIC0gb3h5dG9jaW4gb3IgcGxhY2VibyBbSSdtIHN0aWxsIGJsaW5kZWRdKS4gCgpQYXJ0aWNpcGFudHMgYWxzbyBjb21wbGV0ZWQgYSBudW1iZXIgb2Ygc2VsZi1yZXBvcnQgbWVhc3VyZXMgKHN0YXRlIGFuZCB0cmFpdCkgYW5kIHByb3ZpZGVkIGJpb2xvZ2ljYWwgc2FtcGxlcyBmb3IgT1hUUiBnZW5vdHlwaW5nIGFuZCBjb3J0aXNvbCBhc3NheSwgc29tZSBvZiB3aGljaCB3ZXJlIHVzZWQgYXMgcHJlZGljdG9ycy4KCiMjIEVxdWF0aW9ucwojIyMjIExldmVsIDE6CldlIGZpcnN0IHBlcmZvcm1lZCBNTE0gdG8gZXN0aW1hdGUgdGhlIGVmZmVjdCBvZiB0cmlhbCBudW1iZXIgKGkuZS4sIHRoZSByYW5kb20gZWZmZWN0IG9mIHRpbWUpIG9uIHJlc3BvbnNlIGJpYXMgKHB1c2ggUlQtcHVsbCBSVCkgb24gYSBnaXZlbiB0cmlhbC4gVGhlIGxldmVsLTEgbW9kZWwgZXN0aW1hdGVkLCBmb3IgZWFjaCBwYXJ0aWNpcGFudCBfal8gKF9qXyA9IDHigJMzNSksIGEgcmVncmVzc2lvbiBsaW5lIHRoYXQgcHJlZGljdGVkIGVhY2ggcGFydGljaXBhbnTigJlzIHJlc3BvbnNlIGJpYXMgaW4gbWlsbGlzZWNvbmRzIG9uIGVhY2ggdHJpYWwgX2lfIGZyb20gdGhlIHRyaWFsIG51bWJlci4gVGhpcyBtb2RlbCB3YXMgcmVwcmVzZW50ZWQgYXMgZm9sbG93czogCjxibG9ja3F1b3RlPjxjZW50ZXI+PGZvbnQgc2l6ZT00PgpbYmlhczxpPjxzdWI+aTwvc3ViPjwvaT5dPHN1Yj5qPC9zdWI+ID0gPGk+YjwvaT48c3ViPjA8aT48c3ViPmo8L3N1Yj48L2k+PC9zdWI+ICsgPGk+YjwvaT48c3ViPjE8aT48c3ViPmo8L3N1Yj48L2k+PC9zdWI+IFt0cmlhbG51bWJlcjxpPjxzdWI+aTwvc3ViPjwvaT5dICsgPGk+cjxzdWI+aWo8L3N1Yj48L2k+CjwvZm9udD48L2NlbnRlcj4KPC9ibG9ja3F1b3RlPgoKd2hlcmUgPGk+YjwvaT48c3ViPjA8aT48c3ViPmo8L3N1Yj48L2k+PC9zdWI+LCB0aGUgaW50ZXJjZXB0LCBpcyBpbnRlcnByZXRlZCBhcyBwYXJ0aWNpcGFudCBfal/igJlzIG1lYW4gcmVzcG9uc2UgYmlhcyBmb3IgYSBnaXZlbiB0cmlhbDsgPGk+YjwvaT48c3ViPjE8aT48c3ViPmo8L3N1Yj48L2k+PC9zdWI+LCB0aGUgc2xvcGUsIHJlcHJlc2VudHMgdGhlIGVmZmVjdCBvZiB0cmlhbCBudW1iZXIgb24gcmVzcG9uc2UgYmlhcyBmb3IgZWFjaCBwYXJ0aWNpcGFudCBfal8gKHBvc2l0aXZlIGNvZWZmaWNpZW50cyByZXByZXNlbnQgdGhlIHByZWRpY3RpdmUgbWFnbml0dWRlIG9mIHRyaWFsIG51bWJlciBvbiByZXNwb25zZSBiaWFzIGZvciBhIGdpdmVuIHBhcnRpY2lwYW50KTsgYW5kIDxpPnI8c3ViPmlqPC9zdWI+PC9pPiBpcyB0aGUgcmVzaWR1YWwgZXJyb3IgdGVybS4KCiMjIyMgTGV2ZWwgMjoKVGhlIGxldmVsLTIgbW9kZWxzIGVzdGltYXRlZCB0aGUgYXZlcmFnZSBlZmZlY3RzIGZvciB0aGUgZW50aXJlIHNhbXBsZS4gVGhlIG1vZGVscyB3ZXJlIHJlcHJlc2VudGVkIGFzIGZvbGxvd3M6IAoKPGJsb2NrcXVvdGU+PGNlbnRlcj48Zm9udCBzaXplPTQ+CjxpPmI8L2k+PHN1Yj4wPC9zdWI+PHN1Yj5qPC9zdWI+ID0gzrM8c3ViPjAwPC9zdWI+ICsgzrw8c3ViPjA8c3ViPmo8L3N1Yj48L3N1Yj4KPHA+CjxpPmI8L2k+PHN1Yj4xPHN1Yj48aT5qPC9pPjwvc3ViPjwvc3ViPiA9IM6zPHN1Yj4xMDwvc3ViPiArICDOvDxzdWI+MTxzdWI+ajwvc3ViPjwvc3ViPgo8L2ZvbnQ+PC9jZW50ZXI+PC9ibG9ja3F1b3RlPgoKd2hlcmUgdGhlIGludGVyY2VwdCwgzrM8c3ViPjAwPC9zdWI+LCBpcyBpbnRlcnByZXRlZCBhcyB0aGUgYXZlcmFnZSByZXNwb25zZSBiaWFzIGZvciB0aGUgZW50aXJlIHNhbXBsZTsgzrM8c3ViPjEwPC9zdWI+IGlzIHRoZSBhdmVyYWdlIGVmZmVjdCBvZiByZXByZXNlbnRzIHRoZSBlZmZlY3Qgb2YgdHJpYWwgbnVtYmVyIG9uIHJlc3BvbnNlIGJpYXMgZm9yIGVhY2ggcGFydGljaXBhbnQgX2pfIChwb3NpdGl2ZSBjb2VmZmljaWVudHMgcmVwcmVzZW50IHRoZSBwcmVkaWN0aXZlIG1hZ25pdHVkZSBvZiB0cmlhbCBudW1iZXIgb24gcmVzcG9uc2UgYmlhcyBmb3IgdGhlIHNhbXBsZSBhcyBhIHdob2xlKSwgYW5kIHRodXMsIHRoZSBwcmltYXJ5IGVzdGltYXRlIG9mIGludGVyZXN0OyBhbmQgzrw8c3ViPjA8c3ViPmo8L3N1Yj48L3N1Yj4gYW5kIM68PHN1Yj4xPHN1Yj5qPC9zdWI+PC9zdWI+IGFyZSB0aGUgcmVzaWR1YWwgZXJyb3IgdGVybXMuIAoKQWRkaW5nIHRoZSBmaXhlZCBlZmZlY3Qgb2Ygc3RpbXVsdXMgdHlwZSByZXN1bHRlZCBpbiB0aGUgZm9sbG93aW5nIG1vZGVsOgoKPGJsb2NrcXVvdGU+PGNlbnRlcj48Zm9udCBzaXplPTQ+CjxpPmI8L2k+PHN1Yj4wPC9zdWI+PHN1Yj5qPC9zdWI+ID0gzrM8c3ViPjAwPC9zdWI+ICsgzrM8c3ViPjAxPC9zdWI+KHN0aW11bHVzPHN1Yj5pPC9zdWI+KSArIM68PHN1Yj4wPHN1Yj5qPC9zdWI+PC9zdWI+CjxwPgo8aT5iPC9pPjxzdWI+MTxzdWI+PGk+ajwvaT48L3N1Yj48L3N1Yj4gPSDOszxzdWI+MTA8L3N1Yj4gKyDOszxzdWI+MTE8L3N1Yj4oc3RpbXVsdXM8c3ViPmk8L3N1Yj4pICsgzrw8c3ViPjE8c3ViPmo8L3N1Yj48L3N1Yj48L2ZvbnQ+PC9jZW50ZXI+PC9ibG9ja3F1b3RlPgoKCiMjIERhdGEgY2xlYW5pbmcKPGk+Tm90ZTogV2VudCBiYWNrIHRvIHRoZSByYXcgZGF0YSBkdWUgdG8gc29tZSBpbmNvbnNpc3RlbmNpZXMgaW4gdGhlIGBPVF9BREFBX09tbmlidXMueGxzeGAgZmlsZSBmcm9tIEJBIHRoYXQgSSBmb3VuZC48L2k+Cgo8Yj5QcmUtUiBzdGVwczwvYj46CgoxLiBSZW1vdmVkIGFsbCAuaXFkYXQgZmlsZXMgdW5kZXIgMjVLQiBvciBzbyBpbiBvcmRlciB0byBmaWx0ZXIgb3V0IHBpbG90IGRhdGEgYW5kIGZhbHNlIHN0YXJ0cy48YnI+CjIuIFJlbW92ZWQgbm9uLXN0dWR5IGRhdGEgKGkuZS4sIHRlc3RzIGFuZCBPVCB1bmRlcmdyYWQgZmlsZXMpLiA8YnI+CjMuIE9yZ2FuaXplZCByYXcgLmlxZGF0IGZpbGVzIGZvciBlYWNoIHZpc2l0IGJ5IHJ1biAxL3J1biAyICh0d28gc2VwYXJhdGUgZm9sZGVycykgYmFzZWQgb24gZGF0ZS90aW1lIHN0YW1wLiA8cD4KPGk+SW4gVGVybWluYWwsIHdpdGhpbiBlYWNoIG9mIHRoZSBmb2xkZXJzIGluIHR1cm4uLi48L2k+PHA+CjQuIENoYW5nZWQgZmlsZSBleHRlbnNpb25zIHRvIC50c3YgKHRhYi1zZXBhcmF0ZWQpIGZyb20gLmlxZGF0OiBgZmluZCAuIC1pbmFtZSAiKi5pcWRhdCIgLWV4ZWMgYmFzaCAtYyAnbXYgIiQwIiAiJHswJVwuaXFkYXR9LnRzdiInIHt9IFw7YDxicj4KNS4gTWVyZ2VkIHRoZSBmaWxlczogYGNhdCAqLnRzdiA+IE9UX2dBQVRfcnVuLTEudHN2YCAob3IgYE9UX2dBQVRfcnVuLTIudHN2YCkKPHN0cmlrZT41LiBNZXJnZWQgdGhlIGZpbGVzOiBgbWxyIC0tdHN2bGl0ZSBjYXQgKi50c3YgPiBPVF9nQUFUX3J1bi0xLnRzdmAgKG9yIGBPVF9nQUFUX3J1bi0yLnRzdmApCjx1bD41YS4gYG1sciAtLXRzdmxpdGVgIGRyb3BzIHRoZSBoZWFkZXIgZnJvbSBhbGwgYnV0IHRoZSBmaXJzdCBmaWxlLCBzbyBjb2x1bW4gbmFtZXMgYXJlIG5vdCByZXBlYXRlZCB0aHJvdWdob3V0IHRoZSBkYXRhc2V0LjwvdWw+Cjx1bD41Yi4gVGhpcyByZXF1aXJlcyBNaWxsZXIsIHdoaWNoIGNhbiBiZSBpbnN0YWxsZWQgdmlhIEhvbWVicmV3IG9uIE9TWCAoaHR0cDovL2pvaG5rZXJsLm9yZy9taWxsZXIvZG9jL2J1aWxkLmh0bWwpPC9zdHJpa2U+IDxpPnRyaWVkIHRvIG1ha2UgdGhpcyB3b3JrIGJ1dCBubyBsdWNrPC9pPjwvdWw+Cgo8aT5Ob3Rlczo8YnI+Cjx1bD48bGk+RDExNzogSGFkIDMgdmlzaXRzIGR1ZSB0byBzY2FubmVyIHRlY2huaWNhbCBpc3N1ZXMuIFVzZSAiX2IiIGFuZCAiX2MiIGFzIHZpc2l0IDEgYW5kIHZpc2l0IDIgcmVzcGVjdGl2ZWx5LjwvbGk+CjxsaT5EMTE0OiBIYXMgbXVsdGlwbGUgZmlsZXMgZnJvbSB2aXNpdCAyLiBVc2UgdGhlIGxhc3QgdHdvLjwvbGk+CjxsaT5EMTM1OiBVc2UgZmlsZXMgZnJvbSA2LzA2LzE2IGFuZCA2LzE3LzE4IChzY2FubmVyIGlzc3VlcyBvbiAwNi8xMy8xNikuIFVzZSAiX2IiIGFuZCAiX2MiIGFzIHZpc2l0IDEgYW5kIHZpc2l0IDIgcmVzcGVjdGl2ZWx5LjwvbGk+CjxsaT5EMTQ3OiBWaXNpdCAxIHJ1biAyIGlzIHBhcnRpYWwgZGF0YSBmb3Igc29tZSByZWFzb24gKEkgZG8gaGF2ZSBub3RlcyB0aGF0IHNoZSBzd2l0Y2hlZCBiYWNrIHRvIDxpPlBVU0gtWUVMTE9XPC9pPiBkdXJpbmcgcnVuIDIsIGJ1dCBkaWQgbm90IHJlLXJ1biBiZWNhdXNlIHJ1bm5pbmcgd2F5IG92ZXIgdGltZS4pPC9saT48L3VsPjwvaT4KCiMjIENyZWF0aW5nIHRoZSBNTE0gZGF0YXNldAojIyMgSW1wb3J0IGRhdGEKYGBge3J9CmxpYnJhcnkodGlkeXZlcnNlKQpmaWx0ZXIgPC0gZHBseXI6OmZpbHRlcgpzZWxlY3QgPC0gZHBseXI6OnNlbGVjdAoKIyByZWFkIGluIHRoZSBkYXRhIChvbmx5IGltcG9ydGluZyBhIHN1YnNldCBvZiBjb2x1bW5zKQpyYXdfcjEgPC0gZGF0YS5mcmFtZShyZWFkX3Rzdigifi9EZXNrdG9wL09ULWdBQVRfTUxNLWRhdGEvUnVuMV90c3YvT1RfZ0FBVF9ydW4tMS50c3YiLCBjb2xfdHlwZXM9Y29sc19vbmx5KAogIGRhdGUgPSBjb2xfaW50ZWdlcigpLAogIHRpbWUgPSBjb2xfY2hhcmFjdGVyKCksCiAgc3ViamVjdCA9IGNvbF9jaGFyYWN0ZXIoKSwKICBibG9ja2NvZGUgPSBjb2xfY2hhcmFjdGVyKCksCiAgYmxvY2tudW0gPSBjb2xfY2hhcmFjdGVyKCksCiAgdHJpYWxjb2RlID0gY29sX2NoYXJhY3RlcigpLAogIHZhbHVlcy50cmlhbGNvZGUgPSBjb2xfY2hhcmFjdGVyKCksCiAgdmFsdWVzLnN0aW11bHVzID0gY29sX2NoYXJhY3RlcigpLAogIHZhbHVlcy5pbml0aWFscmVzcG9uc2UgPSBjb2xfY2hhcmFjdGVyKCksCiAgdmFsdWVzLlJUID0gY29sX251bWJlcigpCikpKQoKcmF3X3IyIDwtIGRhdGEuZnJhbWUocmVhZF90c3YoIn4vRGVza3RvcC9PVC1nQUFUX01MTS1kYXRhL1J1bjJfdHN2L09UX2dBQVRfcnVuLTIudHN2IiwgY29sX3R5cGVzPWNvbHNfb25seSgKICBkYXRlID0gY29sX2ludGVnZXIoKSwKICB0aW1lID0gY29sX2NoYXJhY3RlcigpLAogIHN1YmplY3QgPSBjb2xfY2hhcmFjdGVyKCksCiAgYmxvY2tjb2RlID0gY29sX2NoYXJhY3RlcigpLAogIGJsb2NrbnVtID0gY29sX2NoYXJhY3RlcigpLAogIHRyaWFsY29kZSA9IGNvbF9jaGFyYWN0ZXIoKSwKICB2YWx1ZXMudHJpYWxjb2RlID0gY29sX2NoYXJhY3RlcigpLAogIHZhbHVlcy5zdGltdWx1cyA9IGNvbF9jaGFyYWN0ZXIoKSwKICB2YWx1ZXMuaW5pdGlhbHJlc3BvbnNlID0gY29sX2NoYXJhY3RlcigpLAogIHZhbHVlcy5SVCA9IGNvbF9udW1iZXIoKQopKSkKCiMgaGVhZGVyIGxpbmUgcmVwZWF0cyB3aGVuIEkgdXNlZCBgY2F0YCB0byBtZXJnZSwgc28gZ2V0IHRob3NlIG91dCBvZiB0aGVyZQpyYXdfcjEgPC0gcmF3X3IxICU+JSBmaWx0ZXIoIWlzLm5hKGRhdGUpKQpyYXdfcjIgPC0gcmF3X3IyICU+JSBmaWx0ZXIoIWlzLm5hKGRhdGUpKQoKdW5pcXVlKHJhd19yMSRzdWJqZWN0KQojIEQxMTggaXMgc2hvd2luZyB1cCBhcyAidGVzdCIgZm9yIHNvbWUgcmVhc29uIChjaGVja2VkIGFnYWluc3QgdGhlIC5pcWRhdCBmaWxlKSwgYW5kIEQxMzBfYiBpcyBtaXNzaW5nCiMgYm90aCBvZiBEMTMwJ3MgYW5kIEQxNDIncyB2aXNpdHMgd2VyZSBlbnRlcmVkIGFzICJEMTMwIi8iRDE0MiIsIHNvIGNoYW5nZSB0aGUgc3ViamVjdCBJRCBmb3IgdGhlIHZpc2l0IG9uIDA1MjQxNiB0byBEMTMwX2IgYW5kIG9uIApyYXdfcjEkc3ViamVjdFtyYXdfcjEkZGF0ZSA9PSAwMjA5MTZdIDwtICJEMTE4IgpyYXdfcjEkc3ViamVjdFtyYXdfcjEkZGF0ZSA9PSAwNTI0MTZdIDwtICJEMTMwX2IiCnJhd19yMSRzdWJqZWN0W3Jhd19yMSRkYXRlID09IDExMTUxNl0gPC0gIkQxNDJfYiIKCiMgZml4aW5nIHNvbWUgb3RoZXIgc3R1ZmYgaW4gYSBzaW1pbGFyIHZlaW4KcmF3X3IxJHN1YmplY3RbcmF3X3IxJHN1YmplY3QgPT0gIkQxMDFfMiJdIDwtICJEMTAxX2IiCnJhd19yMSRzdWJqZWN0W3Jhd19yMSRzdWJqZWN0ID09ICJEMTAyX0IiXSA8LSAiRDEwMl9iIgpyYXdfcjEkc3ViamVjdFtyYXdfcjEkc3ViamVjdCA9PSAiRDExN19iIl0gPC0gIkQxMTciCnJhd19yMSRzdWJqZWN0W3Jhd19yMSRzdWJqZWN0ID09ICJEMTE3X2MiXSA8LSAiRDExN19iIgpyYXdfcjEkc3ViamVjdFtyYXdfcjEkc3ViamVjdCA9PSAiRDEzNV9jIl0gPC0gIkQxMzVfYiIKCnVuaXF1ZShyYXdfcjEkc3ViamVjdCkgIyA3OCB1bmlxdWUgLSB0aGF0IGlzIGNvcnJlY3QKCnVuaXF1ZShyYXdfcjIkc3ViamVjdCkKIyBzb21lIHNpbWlsYXIgaXNzdWVzIHRvIGZpeApyYXdfcjIkc3ViamVjdFtyYXdfcjIkc3ViamVjdCA9PSAiRDEwMV8yWSJdIDwtICJEMTAxX2IiCnJhd19yMiRzdWJqZWN0W3Jhd19yMiRzdWJqZWN0ID09ICJEMTAyX0IiXSA8LSAiRDEwMl9iIgpyYXdfcjIkc3ViamVjdFtyYXdfcjIkc3ViamVjdCA9PSAiRDEwN19CXzIiXSA8LSAiRDEwN19iIgpyYXdfcjIkc3ViamVjdFtyYXdfcjIkc3ViamVjdCA9PSAiRDExN19iIl0gPC0gIkQxMTciCnJhd19yMiRzdWJqZWN0W3Jhd19yMiRzdWJqZWN0ID09ICJEMTE3X2MiXSA8LSAiRDExN19iIgpyYXdfcjIkc3ViamVjdFtyYXdfcjIkc3ViamVjdCA9PSAiRDEyNl9CIl0gPC0gIkQxMjZfYiIKcmF3X3IyJHN1YmplY3RbcmF3X3IyJHN1YmplY3QgPT0gIkQxMzVfYyJdIDwtICJEMTM1X2IiCnJhd19yMiRzdWJqZWN0W3Jhd19yMiRkYXRlID09IDExMTUxNl0gPC0gIkQxNDJfYiIKCgp1bmlxdWUocmF3X3IyJHN1YmplY3QpICMgNzggdW5pcXVlIC0gdGhhdCBpcyBjb3JyZWN0CgpzdHIocmF3X3IxKQpzdHIocmF3X3IyKQpgYGAKCmBgYHtyfQojIHRha2Ugb3V0IElUSXMgKGludGVyLXRyaWFsIGludGVydmFscykKdW5pcXVlKHJhd19yMSR0cmlhbGNvZGUpCm1sbV9yMSA8LSBmaWx0ZXIocmF3X3IxLCBncmVwbCgiXkEiLHRyaWFsY29kZSkpCnVuaXF1ZShtbG1fcjEkdHJpYWxjb2RlKQoKdW5pcXVlKHJhd19yMiR0cmlhbGNvZGUpCm1sbV9yMiA8LSBmaWx0ZXIocmF3X3IyLCBncmVwbCgiXkEiLHRyaWFsY29kZSkpCnVuaXF1ZShtbG1fcjIkdHJpYWxjb2RlKQoKIyBhZGQgYSAidHJpYWxudW0iIHZhcmlhYmxlLCBncm91cGVkIGJ5IElECm1sbV9yMSA8LSBtbG1fcjEgJT4lIGdyb3VwX2J5KHN1YmplY3QpICU+JSBtdXRhdGUodHJpYWxudW0gPSByb3dfbnVtYmVyKCkpClZpZXcobWxtX3IyKQptbG1fcjIgPC0gbWxtX3IyICU+JSBncm91cF9ieShzdWJqZWN0KSAlPiUgbXV0YXRlKHRyaWFsbnVtID0gcm93X251bWJlcigpKQpWaWV3KG1sbV9yMikKCm1sbV9yMSAlPiUgZ3JvdXBfYnkodHJpYWxudW0pICU+JSBjb3VudCh0cmlhbG51bSkgIyBldmVyeW9uZSBoYXMgMTQ0IHRyaWFscywgaG9vcmF5IQptbG1fcjIgJT4lIGdyb3VwX2J5KHRyaWFsbnVtKSAlPiUgY291bnQodHJpYWxudW0pICMgZXZlcnlvbmUgaGFzIDE0NCB0cmlhbHMsIG9uZSBwZXJzb24gaGFzIDE3NwptbG1fcjIgJT4lIGdyb3VwX2J5KHN1YmplY3QpICU+JSBjb3VudCgpICMgdGhhdCBwZXJzb24gaXMgRDEyMl9iCmBgYApJIGRvIHJlY2FsbCBvbmUgc2NhbiBzZXNzaW9uIHdoZXJlIElucXVpc2l0IGhhZCBzb21lIGtpbmQgb2YgaGljY3VwIGFuZCB0aGUgdGFzayBrZXB0IGdvaW5nIGJleW9uZCB0aGUgZW5kIG9mIHRoZSBmTVJJIHNlcXVlbmNlIHNvIHdlIGhhZCB0byBmb3JjZS1xdWl0IGl0LiBEMTIyIGhhcyBjb21wbGV0ZSBkYXRhIGZyb20gdGhlIGZpcnN0IDE0NCB0cmlhbHMsIHNvIHdlIGNhbiBqdXN0IGRyb3AgdGhlIGV4dHJhIG9uZXMuCmBgYHtyfQptbG1fcjIgPC0gZmlsdGVyKG1sbV9yMiwgdHJpYWxudW0gPD0xNDQpICMgcmVtb3ZlIHRyaWFscyAxNDUtMTc3IGZvciBEMTIyX2IKbWxtX3IyICU+JSBncm91cF9ieSh0cmlhbG51bSkgJT4lIGNvdW50KHRyaWFsbnVtKQojIG5vdyBldmVyeW9uZSBoYXMgMTQ0IHRyaWFscwoKIyBhZGQgYSBjb2x1bW4gZm9yICJydW4iCm1sbV9yMSRydW4gPC0gIjEiCm1sbV9yMiRydW4gPC0gIjIiCgojIGFkZCBhIGNvbHVtbiBmb3IgInZpc2l0IgptbG1fcjEkdmlzaXQgPC0gYXMuZmFjdG9yKGlmZWxzZShncmVwbCgiKl9iIiwgbWxtX3IxJHN1YmplY3QpLCAiMiIsICIxIikpCm1sbV9yMiR2aXNpdCA8LSBhcy5mYWN0b3IoaWZlbHNlKGdyZXBsKCIqX2IiLCBtbG1fcjIkc3ViamVjdCksICIyIiwgIjEiKSkKCm1sbV9yMSAlPiUgZ3JvdXBfYnkoc3ViamVjdCkgJT4lIGNvdW50KHZpc2l0KSAjIGFsbCBsb29rcyBnb29kCm1sbV9yMiAlPiUgZ3JvdXBfYnkoc3ViamVjdCkgJT4lIGNvdW50KHZpc2l0KSAjIGFsbCBsb29rcyBnb29kCgojIG5vdyByZW1vdmUgdGhlICJfYiIgZnJvbSB2aXNpdCAyIElEcwptbG1fcjEgPC0gbWxtX3IxICU+JSB1bmdyb3VwKCkgJT4lCiAgbXV0YXRlKHN1YmplY3QgPSBzdHJfcmVwbGFjZShzdWJqZWN0LCAiX2IiLCAiIikpCnVuaXF1ZShtbG1fcjEkc3ViamVjdCkKCm1sbV9yMiA8LSBtbG1fcjIgJT4lIHVuZ3JvdXAoKSAlPiUKICBtdXRhdGUoc3ViamVjdCA9IHN0cl9yZXBsYWNlKHN1YmplY3QsICJfYiIsICIiKSkKdW5pcXVlKG1sbV9yMiRzdWJqZWN0KQoKIyBtZXJnZSBkYXRhIGZyb20gdGhlIDIgcnVucyAKbWxtX2J4IDwtIGJpbmRfcm93cyhtbG1fcjEsIG1sbV9yMikKCiMgc3BsaXQgdXAgYnkgdmlzaXQKbWxtX3YxIDwtIG1sbV9ieCAlPiUgZmlsdGVyKHZpc2l0ID09ICIxIikKbWxtX3YyIDwtIG1sbV9ieCAlPiUgZmlsdGVyKHZpc2l0ID09ICIyIikKCm1sbV92MSAlPiUgZ3JvdXBfYnkodHJpYWxudW0pICU+JSBjb3VudCh0cmlhbG51bSkgIyBldmVyeW9uZSBoYXMgMTQ0IHRyaWFscywgaG9vcmF5IQptbG1fdjIgJT4lIGdyb3VwX2J5KHRyaWFsbnVtKSAlPiUgY291bnQodHJpYWxudW0pICMgZXZlcnlvbmUgaGFzIDE0NCB0cmlhbHMsIGhvb3JheSEKYGBgCgpgYGB7cn0KIyBhZGQgY29sdW1ucyBmb3IgImNvbmQiIGF0IHZpc2l0IDEgYW5kIHZpc2l0IDIgW2NvbmRpdGlvbjogQSBvciBCXQojIGxvYWQgaW4gdGhlIHJhbmRvbWl6YXRpb24gZGF0YQpyYW5kb21pemUgPC0gcmVhZFJEUygifi9Ecm9wYm94L0dMQVNTIExhYi9PVCBTdHVkeS9kYXRhL2NsZWFuZWQtZGF0YS9yYW5kb21pemF0aW9uX2NsZWFuLnJkcyIpCmhlYWQocmFuZG9taXplKQoKbWxtX3YxIDwtIG1sbV92MSAlPiUKICByZW5hbWUoIklEIiA9IHN1YmplY3QpCgptbG1fdjIgPC0gbWxtX3YyICU+JQogIHJlbmFtZSgiSUQiID0gc3ViamVjdCkKCiMgZ2V0IHRoZSBJRHMgZm9yIGV2ZXJ5b25lIHdobyBnb3QgdHJlYXRtZW50IEEgYXQgdmlzaXQgMSAKSURzX3YxX3R4QSA8LSByYW5kb21pemUgJT4lIGZpbHRlcih0eF92MSA9PSAiQSIpClZpZXcoSURzX3YxX3R4QSkKCiMgaWZlbHNlIHN0YXRlbWVudDogaWYgSUQgPSBhbnkgb2YgdGhvc2UgbGlzdGVkIGluIHR4QV9saXN0LCBtYWtlIGNvbmRfdjEgPSAiQSIsIGVsc2UgbWFrZSBpdCAiQiIKbWxtX3YxIDwtIG1sbV92MSAlPiUKICBtdXRhdGUoY29uZF92MSA9IGFzLmZhY3RvcihpZmVsc2UoSUQgPT0gIkQxMDEiIHwgSUQgPT0gIkQxMDUiIHwgSUQgPT0gIkQxMDkiIHwgSUQgPT0gIkQxMTAiIHwgSUQgPT0gIkQxMTQiIHwgSUQgPT0gIkQxMTUiIHwgSUQgPT0gIkQxMTYiIHwgSUQgPT0gIkQxMTgiIHwgSUQgPT0gIkQxMTkiIHwgSUQgPT0gIkQxMjAiIHwgSUQgPT0gIkQxMjMiIHwgSUQgPT0gIkQxMjQiIHwgSUQgPT0gIkQxMjYiIHwgSUQgPT0gIkQxMjgiIHwgSUQgPT0gIkQxMzIiIHwgSUQgPT0gIkQxMzUiIHwgSUQgPT0gIkQxMzYiIHwgSUQgPT0gIkQxMzciIHwgSUQgPT0gIkQxMzgiIHwgSUQgPT0gIkQxNDAiIHwgSUQgPT0gIkQxNDEiIHwgSUQgPT0gIkQxNDUiIHwgSUQgPT0gIkQxNDgiIHwgSUQgPT0gIkQxNDkiIHwgSUQgPT0gIkQxMTciLCAiQSIsICJCIikpLCBjb25kX3YyID0gYXMuZmFjdG9yKGlmZWxzZShJRCA9PSAiRDEwMSIgfCBJRCA9PSAiRDEwNSIgfCBJRCA9PSAiRDEwOSIgfCBJRCA9PSAiRDExMCIgfCBJRCA9PSAiRDExNCIgfCBJRCA9PSAiRDExNSIgfCBJRCA9PSAiRDExNiIgfCBJRCA9PSAiRDExOCIgfCBJRCA9PSAiRDExOSIgfCBJRCA9PSAiRDEyMCIgfCBJRCA9PSAiRDEyMyIgfCBJRCA9PSAiRDEyNCIgfCBJRCA9PSAiRDEyNiIgfCBJRCA9PSAiRDEyOCIgfCBJRCA9PSAiRDEzMiIgfCBJRCA9PSAiRDEzNSIgfCBJRCA9PSAiRDEzNiIgfCBJRCA9PSAiRDEzNyIgfCBJRCA9PSAiRDEzOCIgfCBJRCA9PSAiRDE0MCIgfCBJRCA9PSAiRDE0MSIgfCBJRCA9PSAiRDE0NSIgfCBJRCA9PSAiRDE0OCIgfCBJRCA9PSAiRDE0OSIgfCBJRCA9PSAiRDExNyIsICJCIiwgIkEiKSkpCmhlYWQobWxtX3YxKQoKIyBpZmVsc2Ugc3RhdGVtZW50OiBpZiBJRCA9IGFueSBvZiB0aG9zZSBsaXN0ZWQgaW4gdHhBX2xpc3QsIG1ha2UgY29uZF92MiA9ICJCIiwgZWxzZSBtYWtlIGl0ICJBIiAocGVvcGxlIHdobyB3ZXJlIEEgYXQgdmlzaXQgMSBzaG91bGQgYmUgQiBmb3IgdmlzaXQgMiwgYW5kIHZpY2UgdmVyc2EpCm1sbV92MiA8LSBtbG1fdjIgJT4lCiAgbXV0YXRlKGNvbmRfdjIgPSBhcy5mYWN0b3IoaWZlbHNlKElEID09ICJEMTAxIiB8IElEID09ICJEMTA1IiB8IElEID09ICJEMTA5IiB8IElEID09ICJEMTEwIiB8IElEID09ICJEMTE0IiB8IElEID09ICJEMTE1IiB8IElEID09ICJEMTE2IiB8IElEID09ICJEMTE4IiB8IElEID09ICJEMTE5IiB8IElEID09ICJEMTIwIiB8IElEID09ICJEMTIzIiB8IElEID09ICJEMTI0IiB8IElEID09ICJEMTI2IiB8IElEID09ICJEMTI4IiB8IElEID09ICJEMTMyIiB8IElEID09ICJEMTM1IiB8IElEID09ICJEMTM2IiB8IElEID09ICJEMTM3IiB8IElEID09ICJEMTM4IiB8IElEID09ICJEMTQwIiB8IElEID09ICJEMTQxIiB8IElEID09ICJEMTQ1IiB8IElEID09ICJEMTQ4IiB8IElEID09ICJEMTQ5IiB8IElEID09ICJEMTE3IiwgIkIiLCAiQSIpKSwgY29uZF92MSA9IGFzLmZhY3RvcihpZmVsc2UoSUQgPT0gIkQxMDEiIHwgSUQgPT0gIkQxMDUiIHwgSUQgPT0gIkQxMDkiIHwgSUQgPT0gIkQxMTAiIHwgSUQgPT0gIkQxMTQiIHwgSUQgPT0gIkQxMTUiIHwgSUQgPT0gIkQxMTYiIHwgSUQgPT0gIkQxMTgiIHwgSUQgPT0gIkQxMTkiIHwgSUQgPT0gIkQxMjAiIHwgSUQgPT0gIkQxMjMiIHwgSUQgPT0gIkQxMjQiIHwgSUQgPT0gIkQxMjYiIHwgSUQgPT0gIkQxMjgiIHwgSUQgPT0gIkQxMzIiIHwgSUQgPT0gIkQxMzUiIHwgSUQgPT0gIkQxMzYiIHwgSUQgPT0gIkQxMzciIHwgSUQgPT0gIkQxMzgiIHwgSUQgPT0gIkQxNDAiIHwgSUQgPT0gIkQxNDEiIHwgSUQgPT0gIkQxNDUiIHwgSUQgPT0gIkQxNDgiIHwgSUQgPT0gIkQxNDkiIHwgSUQgPT0gIkQxMTciLCAiQSIsICJCIikpKQoKbGV2ZWxzKG1sbV92MSRjb25kX3YxKQpsZXZlbHMobWxtX3YyJGNvbmRfdjIpCgpoZWFkKG1sbV92MSkKICAKSURzX3YxX3R4QSRJRAptbG1fdjEgJT4lIGdyb3VwX2J5KGNvbmRfdjEpICU+JSBjb3VudChJRCkgIyBJRHMgYW5kIGNvbmQgbWF0Y2ggdHhBX2xpc3QKbWxtX3YyICU+JSBncm91cF9ieShjb25kX3YyKSAlPiUgY291bnQoSUQpICMgSURzIGFuZCBjb25kIG1hdGNoIHR4QV9saXN0CgptbG1fYnggPC0gYmluZF9yb3dzKG1sbV92MSxtbG1fdjIpClZpZXcobWxtX2J4KQoKIyBzYXZlIGl0CnNhdmVSRFMobWxtX2J4LCAifi9Ecm9wYm94LzIwMThGYWxsL0ZTSEQ2MTdDL21sbV9ieC5yZHMiKQpgYGAKCmBgYHtyfQojIHJlbmFtZSBzb21lIHZhcmlhYmxlcwpjb2xuYW1lcyhtbG1fYngpCm1sbV9ieCA8LSBtbG1fYnggJT4lIHJlbmFtZSgicHVzaF9wdWxsIiA9IHZhbHVlcy5pbml0aWFscmVzcG9uc2UsCiAgICAgICAgICAgICAgICAgICJnQUFUX1JUIiA9IHZhbHVlcy5SVCkKaGVhZChtbG1fYngpCgojIGFkZCBhIG5ldyB2YXJpYWJsZSBmb3IgY29uZGl0aW9uCm1sbV9ieDEgPC0gbWxtX2J4ICU+JSBtdXRhdGUoY29uZCA9IGFzLmZhY3RvcihpZmVsc2UoY29uZF92MSA9PSAiQSIgJiB2aXNpdCA9PSAiMSIsICJBIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGNvbmRfdjIgPT0gIkEiICYgdmlzaXQgPT0gIjIiLCAiQSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShjb25kX3YxID09ICJCIiAmIHZpc2l0ID09ICIxIiwgIkIiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGNvbmRfdjIgPT0gIkIiICYgdmlzaXQgPT0gIjIiLCAiQiIsIE5BKSkpKSkpCgpWaWV3KG1sbV9ieDEpICMgY2hlY2sgdGhhdCBpdCBjb2RlZCB0aGUgImNvbmQiIGNvbHVtbiBjb3JyZWN0bHkgICAgICAKCiMgYWRkIGEgbmV3IHZhcmlhYmxlIGZvciBzdGltdWx1cyBjYXRlZ29yeQojIGluIHZhbHVlcy5zdGltdWx1czoKIyAxID0gc3BvdXNlLCAyID0gbGl2aW5nIGxvdmVkIG9uZS9XSE9UTywgMyA9IHN0cmFuZ2VyLCA0ID0gbm9tb3RoZXRpYyBkZWF0aC1yZWxhdGVkLCA1ID0gbmV1dHJhbCBpbWFnZXMKCnNvcnQodW5pcXVlKG1sbV9ieDEkdmFsdWVzLnN0aW11bHVzKSkKCm1sbV9ieDIgPC0gbWxtX2J4MSAlPiUKICBtdXRhdGUoc3RpbSA9IGFzLmZhY3RvcihpZmVsc2UodmFsdWVzLnN0aW11bHVzID09ICIxQl8xLmpwZyJ8dmFsdWVzLnN0aW11bHVzID09ICIxQl8yLmpwZyJ8dmFsdWVzLnN0aW11bHVzID09ICIxQl8zLmpwZyJ8dmFsdWVzLnN0aW11bHVzID09ICIxWV8xLmpwZyJ8dmFsdWVzLnN0aW11bHVzID09ICIxWV8yLmpwZyJ8dmFsdWVzLnN0aW11bHVzID09ICIxWV8zLmpwZyIsICJzcG91c2UiLCAKICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UodmFsdWVzLnN0aW11bHVzID09ICIyQl8xLmpwZyJ8dmFsdWVzLnN0aW11bHVzID09ICIyQl8yLmpwZyJ8dmFsdWVzLnN0aW11bHVzID09ICIyQl8zLmpwZyJ8dmFsdWVzLnN0aW11bHVzID09ICIyWV8xLmpwZyJ8dmFsdWVzLnN0aW11bHVzID09ICIyWV8yLmpwZyJ8dmFsdWVzLnN0aW11bHVzID09ICIyWV8zLmpwZyIsICJsaXZpbmciLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UodmFsdWVzLnN0aW11bHVzID09ICIzQl8xLmpwZyJ8dmFsdWVzLnN0aW11bHVzID09ICIzQl8yLmpwZyJ8dmFsdWVzLnN0aW11bHVzID09ICIzQl8zLmpwZyJ8dmFsdWVzLnN0aW11bHVzID09ICIzWV8xLmpwZyJ8dmFsdWVzLnN0aW11bHVzID09ICIzWV8yLmpwZyJ8dmFsdWVzLnN0aW11bHVzID09ICIzWV8zLmpwZyIsICJzdHJhbmdlciIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UodmFsdWVzLnN0aW11bHVzID09ICI0Ql8xLmpwZyJ8dmFsdWVzLnN0aW11bHVzID09ICI0Ql8yLmpwZyJ8dmFsdWVzLnN0aW11bHVzID09ICI0Ql8zLmpwZyJ8dmFsdWVzLnN0aW11bHVzID09ICI0WV8xLmpwZyJ8dmFsdWVzLnN0aW11bHVzID09ICI0WV8yLmpwZyJ8dmFsdWVzLnN0aW11bHVzID09ICI0WV8zLmpwZyIsICJkZWF0aCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKHZhbHVlcy5zdGltdWx1cyA9PSAiNUJfMS5qcGcifHZhbHVlcy5zdGltdWx1cyA9PSAiNUJfMi5qcGcifHZhbHVlcy5zdGltdWx1cyA9PSAiNUJfMy5qcGcifHZhbHVlcy5zdGltdWx1cyA9PSAiNVlfMS5qcGcifHZhbHVlcy5zdGltdWx1cyA9PSAiNVlfMi5qcGcifHZhbHVlcy5zdGltdWx1cyA9PSAiNVlfMy5qcGciLCAibmV1dHJhbCIsIE5BKSkpKSkpKQoKbGV2ZWxzKG1sbV9ieDIkc3RpbSkKbWxtX2J4MiRzdGltIDwtIHJlbGV2ZWwobWxtX2J4MiRzdGltLCByZWYgPSAibmV1dHJhbCIpICMgbWFrZSBuZXV0cmFsIHRoZSByZWZlcmVuY2UgbGV2ZWwKICAgICAgICAgICAgICAgICAgICAgICAKIyBzYXZlIGl0CnNhdmVSRFMobWxtX2J4MiwgIn4vRHJvcGJveC8yMDE4RmFsbC9GU0hENjE3Qy9tbG1fYngyLnJkcyIpCmBgYAoKIyMjIEJpYXMgc2NvcmVzClNlcGFyYXRlIG91dCBwdXNoIG1pbnVzIHB1bGwsIHRoZW4gc3VidHJhY3QgcnVuMSBmcm9tIHJ1bjIgdG8gZ2VuZXJhdGUgYSBzY29yZSBxdWFudGlmeWluZyByZWxhdGl2ZSBhcHByb2FjaCBvciBhdm9pZGFuY2UgYmlhcy4KVGhlIHRvcCBhbmQgYm90dG9tIDElIG9mIHJlYWN0aW9uIHRpbWVzIChSVHMpIHdpbGwgYmUgcmVtb3ZlZCBhcyBwYXJ0IG9mIGNvbnZlbnRpb25hbCBkYXRhIGNsZWFuaW5nIGZvciB0aGlzIHRhc2suCmBgYHtyfQoKbWxtX3IxLjEgPC0gbWxtX2J4MiAlPiUgZmlsdGVyKHJ1biA9PSAiMSIpCnRhaWwobWxtX3IxLjEpICMgZG9lcyBpdCBsaW5lIHVwPwptbG1fcjIuMSA8LSBtbG1fYngyICU+JSBmaWx0ZXIocnVuID09ICIyIikKdGFpbChtbG1fcjIuMSkgCgpwOTlyMSA8LSBxdWFudGlsZShtbG1fcjEuMSRnQUFUX1JULCAwLjk5KSAKcDAxcjEgPC0gcXVhbnRpbGUobWxtX3IxLjEkZ0FBVF9SVCwgMC4wMSkgCnA5OXIxICMgOTl0aCBwZXJjZW50aWxlIFJUcyA+PSAxNzEzLjQ4bXMgCnAwMXIxICMgMXN0IHBlcmNlbnRpbGUgUlRzIDw9IDQ3Mm1zCgpwOTlyMiA8LSBxdWFudGlsZShtbG1fcjIuMSRnQUFUX1JULCAwLjk5KSAKcDAxcjIgPC0gcXVhbnRpbGUobWxtX3IyLjEkZ0FBVF9SVCwgMC4wMSkgIyAxc3QgcGVyY2VudGlsZSBSVHMgPD0gNDYzbXMKcDk5cjIgIyA5OXRoIHBlcmNlbnRpbGUgUlRzID49IDE3MTIuNDVtcyAKcDAxcjIgIyAxc3QgcGVyY2VudGlsZSBSVHMgPD0gNDYzbXMKCm1sbV9yMS4yIDwtIG1sbV9yMS4xICU+JQogIG11dGF0ZShvdXRsaWVyX1JUID0gaWZlbHNlKGdBQVRfUlQgPD0gcDAxcjEgfCBnQUFUX1JUID49IHA5OXIxLCAxLCAwKSkKdGFibGUobWxtX3IxLjIkb3V0bGllcl9SVCkgCjIyNy8xMTAwNSAjIDIyNyB0cmlhbHMgd2lsbCBiZSBkcm9wcGVkIHdoZW4gd2UgcmVtb3ZlIHRoZSB0b3AgYW5kIGJvdHRvbSAxJSwgYW5kIDExMDA1IHdpbGwgYmUgcmV0YWluZWQuCgptbG1fcjIuMiA8LSBtbG1fcjIuMSAlPiUKICBtdXRhdGUob3V0bGllcl9SVCA9IGlmZWxzZShnQUFUX1JUIDw9IHAwMXIyIHwgZ0FBVF9SVCA+PSBwOTlyMiwgMSwgMCkpCnRhYmxlKG1sbV9yMi4yJG91dGxpZXJfUlQpIAoyMzAvMTEwMDIgIyAyMzAgdHJpYWxzIHdpbGwgYmUgZHJvcHBlZCB3aGVuIHdlIHJlbW92ZSB0aGUgdG9wIGFuZCBib3R0b20gMSUsIGFuZCAxMTAwMiB3aWxsIGJlIHJldGFpbmVkLgoKbWxtX3IxcjIgPC0gYmluZF9jb2xzKG1sbV9yMS4yLCBtbG1fcjIuMikgIyAxMTIzMiB0cmlhbHMgdG90YWwuCmhlYWQobWxtX3IxcjIpICMgbWFrZSBzdXJlIHRoYXQgdHJpYWxzIGluIHRoZSB0d28gcnVucyBsaW5lIHVwIHBvc3QtbWVyZ2UKdGFpbChtbG1fcjFyMikgIyBtYWtlIHN1cmUgdGhhdCB0cmlhbHMgaW4gdGhlIHR3byBydW5zIGxpbmUgdXAgcG9zdC1tZXJnZQoKIyBnZXQgcmlkIG9mIGFueSB0cmlhbHMgd2l0aCBvdXRsaWVycyBpbiBlaXRoZXIgcnVuMSBvciBydW4yIAojIChuZWVkIHJ1bjEvcnVuMiB0byBiZSB0aGUgc2FtZSBsZW5ndGggc28gdGhhdCB0aGUgdHJpYWxzIGFsaWduIGJldHdlZW4gdGhlIHJ1bnMpCm1sbV9yMXIyLjEgPC0gbWxtX3IxcjIgJT4lIGZpbHRlcihvdXRsaWVyX1JUID09ICIwIiAmIG91dGxpZXJfUlQxID09ICIwIikgCmNvdW50KG1sbV9yMXIyLjEpICMgMTA3OTAgb2JzLgoxMDc5MC8xMTIzMiAjIDk2JSBvZiB0cmlhbHMgcmV0YWluZWQgPSA0JSBvZiB0cmlhbHMgZHJvcHBlZCA9IDw1JSB0cmlhbHMgZHJvcHBlZCAoaW4gZWZmZWN0LCA8NSUgIm1pc3NpbmcgZGF0YSIpLgoKIyBjYWxjdWxhdGUgdGhlIGJpYXMgbWV0cmljCnB1c2hfcHVsbCA8LSBtbG1fcjFyMi4xICU+JSBmaWx0ZXIocHVzaF9wdWxsID09ICJQVVNIIiAmIHB1c2hfcHVsbDEgPT0gIlBVTEwiKSAlPiUgbXV0YXRlKGJpYXMgPSAoZ0FBVF9SVC1nQUFUX1JUMSkpCnB1bGxfcHVzaCA8LSBtbG1fcjFyMi4xICU+JSBmaWx0ZXIocHVzaF9wdWxsID09ICJQVUxMIiAmIHB1c2hfcHVsbDEgPT0gIlBVU0giKSAlPiUgbXV0YXRlKGJpYXMgPSAoZ0FBVF9SVDEtZ0FBVF9SVCkpCgojIG1lcmdlIHB1c2hfcHVsbCBhbmQgcHVsbF9wdXNoIHRvZ2V0aGVyCm1sbV9wcCA8LSBiaW5kX3Jvd3MocHVzaF9wdWxsLHB1bGxfcHVzaCkKClZpZXcobWxtX3BwKQpgYGAKCiMjIyBUcmFuc2Zvcm1hdGlvbnMKYGBge3J9CmxpYnJhcnkocHN5Y2gpCmRlc2NyaWJlKG1sbV9wcCRiaWFzKSAjIHNrZXduZXNzIGlzIDAuMSwga3VydG9zaXMgaXMgMS42OQpoaXN0KG1sbV9wcCRiaWFzKQpxcW5vcm0obWxtX3BwJGJpYXMpCmdncGxvdChtbG1fcHAsIGFlcyhzYW1wbGU9YmlhcykpK3N0YXRfcXEoKStzdGF0X3FxX2xpbmUoKSAjIG5vdCBhIGdvb2QgbG9vayBhdCBhbGwuLi4KCiMgaW5zdGFsbC5wYWNrYWdlcygiYmVzdE5vcm1hbGl6ZSIpCiMgYmVzdE5vcm1hbGl6ZSBpZGVudGlmaWVzIHRoZSB0cmFuc2Zvcm1hdGlvbiB0aGF0IG5vcm1hbGl6ZXMgeW91ciBkYXRhIHRoZSBiZXN0CmxpYnJhcnkoYmVzdE5vcm1hbGl6ZSkKCm9yZGVyTm9ybV9iaWFzIDwtIGJlc3ROb3JtYWxpemUobWxtX3BwJGJpYXMpICMgdGhlICJvcmRlck5vcm0iIHRyYW5zZm9ybSBnZXRzIHRoZSBkYXRhIHRoZSBjbG9zZXN0IHRvIG5vcm1hbGx5IGRpc3RyaWJ1dGVkLCBjb21wYXJlZCB0byBvdGhlciBtZXRob2RzCm1sbV9wcCRiaWFzX3QgPC0gb3JkZXJOb3JtX2JpYXMkeC50ICMgcHVsbCB4LnQgZnJvbSBvcmRlck5vcm1fYmlhcyBhbmQgYXNzaWduIGl0IGJhY2sgaW50byBkYXRhc2V0CiMgeC50IGNvbnRhaW5zIHRoZSB0cmFuc2Zvcm1lZCB2YWx1ZXMgb2YgeCwgdXNpbmcgdGhlIHRyYW5zZm9ybSBpZGVudGlmaWVkIGJ5IGJlc3ROb3JtYWxpemUgYXMgYmVpbmcgc3VwZXJpb3IKCmRlc2NyaWJlKG1sbV9wcCRiaWFzX3QpCmhpc3QobWxtX3BwJGJpYXNfdCkKcXFub3JtKG1sbV9wcCRiaWFzX3QpCmdncGxvdChtbG1fcHAsIGFlcyhzYW1wbGU9Ymlhc190KSkrc3RhdF9xcSgpK3N0YXRfcXFfbGluZSgpICMgc28gbXVjaCBiZXR0ZXIhCgojIGJhY2stdHJhbnNmb3JtYXRpb24sIGp1c3QgdG8gc2hvdyBob3cgdG8gZG8gaXQ6CnAgPC0gcHJlZGljdChvcmRlck5vcm1fYmlhcykKICAgIHgyIDwtIHByZWRpY3Qob3JkZXJOb3JtX2JpYXMsIG5ld2RhdGEgPSBwLCBpbnZlcnNlID0gVFJVRSkgIyB4MiBpcyB0aGUgYmFjay10cmFuc2Zvcm1lZCBkYXRhCiAgICBhbGwuZXF1YWwoeDIsIG1sbV9wcCRiaWFzX3QpIAoKbWxtX2J4MyA8LSBtbG1fcHAKc2F2ZVJEUyhtbG1fYngzLCAifi9Ecm9wYm94LzIwMThGYWxsL0ZTSEQ2MTdDL21sbV9ieDMucmRzIikKYGBgCkJlY2F1c2UgYGJpYXNgIGlzIHF1aXRlIG5vbi1ub3JtYWwsIGxvb2tpbmcgYXQgdGhlIHBsb3RzIGFib3ZlLCBhbmFseXNlcyB3aWxsIHVzZSB0aGUgdHJhbnNmb3JtZWQgYmlhcyBzY29yZSAoYGJpYXNfdGApIGluc3RlYWQuCgojIyMgQ2hlY2tpbmcgdGhlIGRhdGEKYGBge3J9CnRhYmxlIDwtIG1sbV9ieDMgJT4lIGdyb3VwX2J5KElEKSAlPiUgZ3JvdXBfYnkoY29uZCkgJT4lIGNvdW50KElEKSAKdGFibGUKIyBtaXNzaW5nIGRhdGEuLi4KIyBjb25kIEEgbG93IHRyaWFsIGNvdW50czogRDEwMSAoMyB0cmlhbHMpLCBEMTQxICgxOCB0cmlhbHMpLCBEMTQ4ICgxOSB0cmlhbHMpCiMgY29uZCBCIGxvdyB0cmlhbCBjb3VudHM6ICBEMTQ3ICgxIHRyaWFsKQoKZGVzY3JpYmUodGFibGUkbikKZ2dwbG90KHRhYmxlLCBhZXMoc2FtcGxlPW4pKStzdGF0X3FxKCkrc3RhdF9xcV9saW5lKCkgIyBjYW4gc2VlIHRob3NlIDQgb24gdGhlIFFRIHBsb3QKCiMgd2hlcmUgYXJlIHRoZSB0cmlhbHMgZ2V0dGluZyBkcm9wcGVkPwptbG1fcjFyMiAlPiUgZ3JvdXBfYnkoSUQpICU+JSBncm91cF9ieShjb25kKSAlPiUgY291bnQoSUQpICMgZXZlcnlvbmUgaGFzIDE0NCBoZXJlCm1sbV9yMXIyLjEgJT4lIGdyb3VwX2J5KElEKSAlPiUgZ3JvdXBfYnkoY29uZCkgJT4lIGNvdW50KElEKSAKIyBhZnRlciBnZXR0aW5nIHJpZCBvZiBvdXRsaWVycywgbW9zdCBwZW9wbGUgbWlzc2luZyBhIGZldyB0cmlhbHMgKEQxMDcgY29uZCBBL0IgYW5kIEQxMTMgY29uZCBBIG1pc3NpbmcgPjIwKQoKbWxtX3IxcjIuMSAlPiUgZmlsdGVyKElEPT0iRDEwMSIgJiBjb25kPT0iQSIpCm1sbV9yMXIyLjEgJT4lIGZpbHRlcihJRD09IkQxNDEiICYgY29uZD09IkEiKQptbG1fcjFyMi4xICU+JSBmaWx0ZXIoSUQ9PSJEMTQ4IiAmIGNvbmQ9PSJBIikKbWxtX3IxcjIuMSAlPiUgZmlsdGVyKElEPT0iRDE0NyIgJiBjb25kPT0iQiIpCiMgc28gdHJpYWxzIGFyZSBnZXR0aW5nIGRyb3BwZWQgYmVjYXVzZSB0aGV5IGRpZG4ndCBlZmZlY3RpdmVseSByZXZlcnNlIHRoZSBpbnN0cnVjdGlvbnMgb3IgdGhleSByZXZlcnRlZCB0byB0aGUgb2xkIGluc3RydWN0aW9ucwojIGluIGVzc2VuY2UsIHRoaXMgcmVtb3ZlcyBlcnJvciB0cmlhbHMKCiMgY3JlYXRlIGEgbmV3IHZhcmlhYmxlIHRvIGluZGljYXRlIHRoZSA0IHBhcnRpY2lwYW50cyB3aXRoIGxvdyB0cmlhbCBjb3VudHMgKGkuZS4sIHBlb3BsZSB3aG8gaGF2ZSBhIGJpYXMgc2NvcmUgb24gPDE0JSBvZiB0cmlhbHMpCm1sbV9ieDMgPC0gbWxtX2J4MyAlPiUgbXV0YXRlKGxvd19uX3RyaWFscyA9IGlmZWxzZShJRCA9PSAiRDEwMSIgfCBJRCA9PSAiRDE0MSIgfCBJRCA9PSAiRDE0NyIgfCBJRCA9PSAiRDE0OCIsIDEsIDApKQoKIyBjaGVjayB3aGV0aGVyIHRoZSByb3dzIGxpbmUgdXAgYnkgbG9va2luZyBmb3Igcm93cyB3aGVyZSB2YXIgYW5kIHZhcjEgZG9uJ3QgbWF0Y2gKbm90bGluZWR1cCA8LSBtbG1fYngzICU+JSBmaWx0ZXIoc3RpbSAhPSBzdGltMSkKbm90bGluZWR1cCAjIDAgcm93cyByZXR1cm5lZDsgYWxsIHRoZSByb3dzIG1hdGNoCm5vdGxpbmVkdXAgPC0gbWxtX2J4MyAlPiUgZmlsdGVyKHRyaWFsY29kZSAhPSB0cmlhbGNvZGUxKQpub3RsaW5lZHVwICMgMCByb3dzIHJldHVybmVkOyBhbGwgdGhlIHJvd3MgbWF0Y2gKbm90bGluZWR1cCA8LSBtbG1fYngzICU+JSBmaWx0ZXIodHJpYWxudW0gIT0gdHJpYWxudW0xKQpub3RsaW5lZHVwICMgMCByb3dzIHJldHVybmVkOyBhbGwgdGhlIHJvd3MgbWF0Y2gKCmhlYWQobWxtX2J4MykKc2F2ZVJEUyhtbG1fYngzLCAifi9Ecm9wYm94LzIwMThGYWxsL0ZTSEQ2MTdDL21sbV9ieDMucmRzIikKYGBgCgojIyMgQWRkIHRpbWUtaW52YXJpYW50IHZhcmlhYmxlcwpOZXh0IHN0ZXAgaXMgdG8gYWRkIGRlbW9ncmFwaGljcyBhbmQgb3RoZXIgc2VsZi1yZXBvcnRlZCBhbmQgZ2VuZXRpYyBkYXRhIHZhcmlhYmxlcyB0aGF0IHdlIG1pZ2h0IHBvdGVudGlhbGx5IHdhbnQgdG8gaW5jbHVkZSBpbiB0aGUgbW9kZWwgYnV0IHRoYXQgZG8gbm90IGNoYW5nZSBvdmVyIHRpbWUuIExvb2tpbmcgYXQgdGhlIGNvZGVib29rIGZvciB0aGUgbWFzdGVyIGRhdGFzZXQsIHRoZXNlIGluY2x1ZGU6CgpEZW1vZ3JhcGhpY3M6CgoqIGBhZ2VgCiogYGFnZV95cnNgCiogYHNleF9tYAoqIGBldGhuaWNpdHlfaGlzcGAKKiBgcmFjZWAKKiBgdGltZXNpbmNlZGVhdGhgCgpHZW5ldGljIHZhcmlhYmxlczoKCiogYHJzMjI1NDI5OGAKKiBgcnMyMjY4NDk4YAoqIGByczUzNTc2YAoqIGByczIyNTQyOThfQS5jYXJyaWVyYAoqIGByczIyNjg0OThfQy5jYXJyaWVyYAoqIGByczUzNTc2X0EuY2FycmllcmAKClNlbGYtcmVwb3J0IG1lYXN1cmVzOgoKKiBgdG90X2ljZ2AgW2dyaWVmXQoqIGB0b3RfYmRpYCBbZGVwcmVzc2lvbl0KKiBgdG90X2JncWAgW2JyaWVmIGdyaWVmIHF1ZXN0aW9ubmFpcmUgd2l0aCBpbXBhaXJtZW50IGl0ZW1dCiogYHRvdF9lY3Jyc19nbG9iYWxfYW54YCBbYW54aW91cyBhdHRhY2htZW50IC0gZ2xvYmFsXQoqIGB0b3RfZWNycnNfZ2xvYmFsX2F2b2lkYCBbYXZvaWRhbnQgYXR0YWNobWVudCAtIGdsb2JhbF0KKiBgdG90X2VjcnJzX3Nwb3VzZV9hbnhgIFthbnhpb3VzIGF0dGFjaG1lbnQgLSBzcG91c2VdCiogYHRvdF9lY3Jyc19zcG91c2VfYXZvaWRgIFthdm9pZGFudCBhdHRhY2htZW50IC0gc3BvdXNlXQoqIGB0b3RfeXNsYCBbeWVhcm5pbmcgZm9yIHRoZSBkZWNlYXNlZF0KCgpgYGB7cn0KIyBsb2FkIGluIG1hc3RlciBkYXRhc2V0Cm1hc3RlciA8LSByZWFkUkRTKCJ+L0Ryb3Bib3gvR0xBU1MgTGFiL09UIFN0dWR5L2RhdGEvY2xlYW5lZC1kYXRhL3NlbGZyZXBvcnRzX294dHJfY29ydGlzb2xfcmFuZG9tX0FCX2J4X2NsZWFuLnJkcyIpIAoKIyBzdWJzZXQgdGhlIHNlbGVjdGVkIHZhcmlhYmxlcwptbG1fYWRkIDwtIHN1YnNldChtYXN0ZXIsIHNlbGVjdD1jKElELGFnZSwgYWdlX3lycywgc2V4X20sIGV0aG5pY2l0eV9oaXNwLCByYWNlLCB0aW1lc2luY2VkZWF0aCwgcnMyMjU0Mjk4LCByczIyNjg0OTgsIHJzNTM1NzYsIHJzMjI1NDI5OF9BLmNhcnJpZXIsIHJzMjI2ODQ5OF9DLmNhcnJpZXIsIHJzNTM1NzZfQS5jYXJyaWVyLCB0b3RfYmRpLCB0b3RfYmdxLCB0b3RfZWNycnNfZ2xvYmFsX2FueCx0b3RfZWNycnNfZ2xvYmFsX2F2b2lkLCB0b3RfZWNycnNfc3BvdXNlX2FueCwgdG90X2VjcnJzX3Nwb3VzZV9hdm9pZCwgdG90X3lzbCwgdG90X2ljZykpCmhlYWQobWxtX2FkZCkKCiMgbWVyZ2UgaW50byB0aGUgYmVoYXZpb3JhbCBkYXRhc2V0Cm1sbV9ieDQgPC0gbGVmdF9qb2luKG1sbV9ieDMsIG1sbV9hZGQsIGJ5PSJJRCIpCmhlYWQobWxtX2J4NCkKbGlicmFyeShwc3ljaCkKCiMgc2F2ZSBpdApzYXZlUkRTKG1sbV9ieDQsICJ+L0Ryb3Bib3gvMjAxOEZhbGwvRlNIRDYxN0MvbWxtX2J4NC5yZHMiKQpgYGAKCgojIyBFeHBsb3JhdG9yeSBhbmFseXNpcyBhbmQgY2hlY2tpbmcgYXNzdW1wdGlvbnMKCkZpcnN0IHN0ZXAgaXMgdG8gb3ZlcnZpZXcgdGhlIGVudGlyZSBkYXRhc2V0IHVzaW5nIGBzdW1tYXJ5dG9vbHNgLiAKYGBge3J9CmxpYnJhcnkoc3VtbWFyeXRvb2xzKQoKIyBvdmVydmlldyB0aGUgZW50aXJlIGRhdGFzZXQKZGZTdW1tYXJ5KG1sbV9ieDQpICMgdGhpcyB3aWxsIGxvb2sgbGlrZSBUT1RBTCBjcmFwIGluIHRoZSBjb25zb2xlIChub3RlYm9vayBvdXRwdXQpCiMgdXNlIHZpZXcoZGZTdW1tYXJ5KG1sbV9ieDQpKSBmcm9tIHRoZSBjb25zb2xlIHRvIHNlZSBhIG11Y2ggbW9yZSByZWFkYWJsZSBhbmQgYXR0cmFjdGl2ZSBvdXRwdXQKYGBgCk5vbmUgb2YgdGhlIHZhcmlhYmxlcyBoYXZlIGFueSBtaXNzaW5nIGRhdGEsIGFwYXJ0IGZyb20gYHJzMjI1NDI5OGAgYW5kIGByczIyNTQyOThfQS5jYXJyaWVyYCwgYW5kIEknbSBhd2FyZSBmcm9tIHRoZSBkYXRhIGNsZWFuaW5nIHRoYXQgSSBkaWQgZm9yIHRoZSBtYXN0ZXIgZGF0YXNldCB0aGF0IG9uZSBwYXJ0aWNpcGFudCdzIGdlbm90eXBlIGZvciB0aGF0IFNOUCB3YXMgdW5hYmxlIHRvIGJlIGlkZW50aWZpZWQuCgojIyMgRGVzY3JpcHRpdmVzCmBgYHtyfQpsaWJyYXJ5KHBzeWNoKQpsaWJyYXJ5KHN0YXJnYXplcikKbGlicmFyeShzdW1tYXJ5dG9vbHMpCgojIGRlc2NyaXB0aXZlcyBmb3IgdGhlIHRpbWUtaW52YXJpYW50IHZhcmlhYmxlcyBhcmUgZ29pbmcgdG8gYmUgd3JvbmcgaWYgd2UgdXNlIG1sbV9ieDQgKHNpbmNlIG9ic2VydmF0aW9ucyBhcmUgZHVwbGljYXRlZCkKIyBzbyBnb2luZyBiYWNrIHRvIHRoZSBtbG1fYWRkIG9iamVjdC4uLgojIG5vdGUgdGhhdCBuID0gNDAsIGJ1dCBuID0gMzkgd2l0aCBSVCBkYXRhCiMgRDE0OSdzIGJlaGF2aW9yYWwgZGF0YSB3YXMgZHJvcHBlZCAocmFuIG91dHNpZGUgb2Ygc2Nhbm5lciksIHNvIGRyb3AgaGlzIGNhc2UKCm1sbV9hZGQgPC0gZmlsdGVyKG1sbV9hZGQsICFncmVwbCgiRDE0OSIsSUQpKQp1bmlxdWUobWxtX2FkZCRJRCkgIyBpdCB3b3JrZWQKbnVtcyA8LSBzZWxlY3RfaWYobWxtX2FkZCwgaXMubnVtZXJpYykgIyBqdXN0IGdldCB0aGUgbnVtZXJpYyB2YXJpYWJsZXMKdmlldyhkZlN1bW1hcnkobnVtcykpIApzdGFyZ2F6ZXIobnVtcywgdHlwZT0idGV4dCIsIHRpdGxlPSJEZXNjcmlwdGl2ZXMiLCBkaWdpdHM9Miwgb3V0PSJ0YWJsZTEudHh0Iiwgbm90ZXMgPSAiTm90ZTogJ3N0YXJnYXplcicgbWFrZXMgbmljZXIgbG9va2luZyB0YWJsZXMsIGJ1dCBkb2Vzbid0IHByb3ZpZGUgc2tld25lc3Mgb3Iga3VydG9zaXMgc3RhdGlzdGljcywgc28gd2UnbGwgdXNlICdwc3ljaCcgZm9yIHRoYXQuIikgCgpkZXNjcmliZShudW1zKQpgYGAKCiMjIyBGcmVxdWVuY2llcwpgYGB7cn0KIyB3aGljaCB2YXJpYWJsZXMgYXJlIGZhY3RvcnM/Cm1sbV9hZGQgJT4lIHNlbGVjdF9pZihpcy5mYWN0b3IpICU+JSBjb2xuYW1lcygpCgojIGhtbSwgcnMyMjY4NDk4IGFuZCByczUzNTc2IHNob3VsZCBhbHNvIGJlIGZhY3RvcnMsIHNvIGZpeCB0aGF0IG5vdwptbG1fYWRkIDwtIG1sbV9hZGQgJT4lIG11dGF0ZShyczIyNjg0OTggPSByZWNvZGVfZmFjdG9yKHJzMjI2ODQ5OCwgIkMvVCIgPSAiQy9UIiwgIkNDIiA9ICJDQyIsICJUVCIgPSAiVFQiKSwgcnM1MzU3NiA9IHJlY29kZV9mYWN0b3IocnM1MzU3NiwgIkEvRyIgPSAiQS9HIiwgIkFBIiA9ICJBQSIsICJHRyIgPSAiR0ciKSkKbWxtX2FkZCAlPiUgc2VsZWN0X2lmKGlzLmZhY3RvcikgJT4lIGNvbG5hbWVzKCkKCiMgZnVuY3Rpb24gdG8gY291bnQgZnJlcXVlbmNpZXMgZm9yIHZhcmlhYmxlcyB0aGF0IGFyZSBmYWN0b3JzLi4udGhpcyBpc24ndCB3b3JraW5nCiMgY291bnRBbGwgPC0gZnVuY3Rpb24oYmFzZWRhdGEpCiMgewojCWZhY3MgPC0gc2FwcGx5KGJhc2VkYXRhLCBpcy5mYWN0b3IpCiMJZmFjZGF0YSA8LSBiYXNlZGF0YVsgLGZhY3NdCiMJZm9yKGkgaW4gMTpsZW5ndGgoZmFjZGF0YSkpCiMJewojCQljb3VudChmYWNkYXRhKQojCSB9CiMgfQojIGNvdW50QWxsKG1sbV9ieDQpCgptbG1fYWRkICU+JSBjb3VudChzZXhfbSkgIyAyOCBmZW1hbGVzLCAxMSBtYWxlcwptbG1fYWRkICU+JSBjb3VudChyYWNlKSAjIDM4IHdoaXRlLCAxIGFub3RoZXIgcmFjZSBub3QgbGlzdGVkCm1sbV9hZGQgJT4lIGNvdW50KGV0aG5pY2l0eV9oaXNwKSAjIDM3IG5vbi1IaXNwYW5pYy9MYXRpbm8sIDIgSGlzcGFuaWMvTGF0aW5vCm1sbV9hZGQgJT4lIGNvdW50KHJzMjI1NDI5OCkgIyAyMiBHRywgMTAgQS9HLCAxIE5BL21pc3NpbmcgKDAgQUEpCm1sbV9hZGQgJT4lIGNvdW50KHJzMjI2ODQ5OCkgIyAxNyBDL1QsIDEwIENDLCAxMiBUVAptbG1fYWRkICU+JSBjb3VudChyczUzNTc2KSAjIDIxIEEvRywgMTggR0cgKDAgQUEpCm1sbV9hZGQgJT4lIGNvdW50KHJzMjI1NDI5OF9BLmNhcnJpZXIpICMgeWVzID0gMTAsIG5vID0gMjgsIE5BID0gMQptbG1fYWRkICU+JSBjb3VudChyczIyNjg0OThfQy5jYXJyaWVyKSAjIHllcyA9IDI3LCBubyA9IDEyCm1sbV9hZGQgJT4lIGNvdW50KHJzNTM1NzZfQS5jYXJyaWVyKSAjIHllcyA9IDIxLCBubyA9IDE4CmBgYAoKIyMjIENoZWNraW5nIGRpc3RyaWJ1dGlvbiBzaGFwZXMgYW5kIG5vcm1hbGl0eQpHb3QgYSBwcmV2aWV3IG9mIHRoaXMgYWJvdmUgd2hlbiB3ZSB1c2VkIGBzdW1tYXJ5dG9vbHNgLCBidXQgaGVyZSdzIGEgY2xvc2VyIGxvb2sgYXQgc29tZSBoaXN0b2dyYW1zIGFuZCBRUSBwbG90cy4KYGBge3J9CiMgYSBmdW5jdGlvbiB0byBwcm9kdWNlIGhpc3RvZ3JhbXMgZm9yIGFsbCBudW1lcmljIHZhcmlhYmxlcyBpbiBhIGRhdGFmcmFtZQpoaXN0QWxsIDwtIGZ1bmN0aW9uKGJhc2VkYXRhKQp7CgludW1zIDwtIHNhcHBseSgoYmFzZWRhdGEpLCBpcy5udW1lcmljKQoJbnVtZGF0YSA8LSBiYXNlZGF0YVsgLG51bXNdCglwYXIobWZyb3c9YygyLDIpKQoJZm9yKGkgaW4gMTpsZW5ndGgobnVtZGF0YSkpCgl7CgkJaGlzdChudW1kYXRhWyxpXSwgeGxhYj1OVUxMLCBtYWluPW5hbWVzKG51bWRhdGFbaV0pKQoJfQp9CgpoaXN0QWxsKGFzLmRhdGEuZnJhbWUobWxtX2J4NCkpCgpxcUFsbCA8LSBmdW5jdGlvbihiYXNlZGF0YSkKewoJbnVtcyA8LSBzYXBwbHkoKGJhc2VkYXRhKSwgaXMubnVtZXJpYykKCW51bWRhdGEgPC0gYmFzZWRhdGFbICxudW1zXQoJcGFyKG1mcm93PWMoMiwyKSkKCWZvcihpIGluIDE6bGVuZ3RoKG51bWRhdGEpKQoJewoJCXFxbm9ybShudW1kYXRhWyxpXSwgeGxhYj1OVUxMLCBtYWluPW5hbWVzKG51bWRhdGFbaV0pKQoJfQp9CgpxcUFsbChhcy5kYXRhLmZyYW1lKG1sbV9ieDQpKQoKYGBgClRoZSBtb3N0IHByb2JsZW1hdGljIG9mIHRoZXNlIGFwcGVhciB0byBiZSBhbnhpb3VzL2F2b2lkYW50IGF0dGFjaG1lbnQgc3R5bGUgZm9yIHRoZSBzcG91c2UgKGB0b3RfZWNycnNfc3BvdXNlX2FueGAgYW5kIGB0b3RfZWNycnNfc3BvdXNlX2F2b2lkYCksIGdsb2JhbCBhbnhpb3VzIGF0dGFjaG1lbnQgc3R5bGUgKGB0b3RfZWNycnNfZ2xvYmFsX2FueGApLCBkZXByZXNzaXZlIHN5bXB0b21zIChgdG90X2JkaWApLCBhbmQgdGltZSBzaW5jZSBzcG91c2UncyBkZWF0aCAoYHRpbWVzaW5jZWRlYXRoYCAtIGluIGRheXMpLgoKIyMjIENlbnRlcmluZyBMMiBwcmVkaWN0b3JzCgpgYGB7cn0KIyBwdWxsIG91dCBvbmx5IHRoZSB0b3RhbCBzY29yZSB2YXJpYWJsZXMsIGFnZSwgdGltZXNpbmNlZGVhdGgKZ2N2YXJzIDwtIGFzLmRhdGEuZnJhbWUobWxtX2J4NFssIGdyZXAoJ150b3R8YWdlfHRpbWVzaW5jZWRlYXRofElEJywgbmFtZXMobWxtX2J4NCkpXSkKZ2N2YXJzMSA8LSBnY3ZhcnNbIWR1cGxpY2F0ZWQoZ2N2YXJzJElEKSwgXQpzdGFyZ2F6ZXIoZ2N2YXJzMSwgdHlwZT0idGV4dCIsIG1lZGlhbiA9IFQsIGRpZ2l0cz0zKQoKZ21lYW5fYWdlIDwtIG1lYW4oZ2N2YXJzMSRhZ2UpCmdtZWFuX2FnZV95cnMgPC0gbWVhbihnY3ZhcnMxJGFnZV95cnMpCmdtZWFuX3RpbWUgPC0gbWVhbihnY3ZhcnMxJHRpbWVzaW5jZWRlYXRoKQpnbWVhbl9iZGkgPC0gbWVhbihnY3ZhcnMxJHRvdF9iZGkpCmdtZWFuX2JncSA8LSBtZWFuKGdjdmFyczEkdG90X2JncSkKZ21lYW5fZWNycnNfZ19hbnggPC0gbWVhbihnY3ZhcnMxJHRvdF9lY3Jyc19nbG9iYWxfYW54KQpnbWVhbl9lY3Jyc19nX2F2IDwtIG1lYW4oZ2N2YXJzMSR0b3RfZWNycnNfZ2xvYmFsX2F2b2lkKQpnbWVhbl9lY3Jyc19zX2FueCA8LSBtZWFuKGdjdmFyczEkdG90X2VjcnJzX3Nwb3VzZV9hbngpCmdtZWFuX2VjcnJzX3NfYXYgPC0gbWVhbihnY3ZhcnMxJHRvdF9lY3Jyc19zcG91c2VfYXZvaWQpCmdtZWFuX2ljZyA8LSBtZWFuKGdjdmFyczEkdG90X2ljZykKZ21lYW5feXNsIDwtIG1lYW4oZ2N2YXJzMSR0b3RfeXNsKQoKbWxtX2J4NSA8LSBtbG1fYng0ICU+JSBtdXRhdGUoZ21lYW5fYWdlID0gYWdlLWdtZWFuX2FnZSwgZ21lYW5fYWdlX3lycyA9IGFnZV95cnMtZ21lYW5fYWdlX3lycywgZ21lYW5fdGltZXNpbmNlZGVhdGggPSB0aW1lc2luY2VkZWF0aC1nbWVhbl90aW1lLCBnbWVhbl9iZGkgPSB0b3RfYmRpLWdtZWFuX2JkaSwgZ21lYW5fYmdxID0gdG90X2JncS1nbWVhbl9iZ3EsIGdtZWFuX2VjcnJzX2dsb2JhbF9hbnggPSB0b3RfZWNycnNfZ2xvYmFsX2FueC1nbWVhbl9lY3Jyc19nX2FueCwgZ21lYW5fZWNycnNfZ2xvYmFsX2F2b2lkID0gdG90X2VjcnJzX2dsb2JhbF9hdm9pZC1nbWVhbl9lY3Jyc19nX2F2LCBnbWVhbl9lY3Jyc19zcG91c2VfYW54ID0gdG90X2VjcnJzX3Nwb3VzZV9hbngtZ21lYW5fZWNycnNfc19hbngsIGdtZWFuX2VjcnJzX3Nwb3VzZV9hdm9pZCA9IHRvdF9lY3Jyc19zcG91c2VfYXZvaWQtZ21lYW5fZWNycnNfc19hdiwgZ21lYW5feXNsID0gdG90X3lzbC1nbWVhbl95c2wsIGdtZWFuX2ljZyA9IHRvdF9pY2ctZ21lYW5faWNnKQpzdGFyZ2F6ZXIoYXMuZGF0YS5mcmFtZShtbG1fYng1KSwgdHlwZT0idGV4dCIpICMgbm90ZSB0aGF0IG1lYW5zIG9mIHRoZSBncm91cC1tZWFuIGNlbnRlcmVkIHZhcmlhYmxlcyBpbiB0aGUgbG9uZyBkYXRhc2V0IGFyZSBub3QgemVybyAtIEkgdGhpbmsgdGhpcyBpcyBiZWNhdXNlIHNvbWUgcGVvcGxlIGhhZCBtb3JlIHRyaWFscyB0aGFuIG90aGVycwoKIyB0ZXN0IHRoYXQgaHlwb3RoZXNpcyB3aXRoIHRoZSBub24tZHVwbGljYXRlZCBkYXRhCmdjdmFyczIgPC0gZ2N2YXJzMSAlPiUgbXV0YXRlKGdtZWFuX2FnZSA9IGFnZS1nbWVhbl9hZ2UsIGdtZWFuX2FnZV95cnMgPSBhZ2VfeXJzLWdtZWFuX2FnZV95cnMsIGdtZWFuX3RpbWVzaW5jZWRlYXRoID0gdGltZXNpbmNlZGVhdGgtZ21lYW5fdGltZSwgZ21lYW5fYmRpID0gdG90X2JkaS1nbWVhbl9iZGksIGdtZWFuX2JncSA9IHRvdF9iZ3EtZ21lYW5fYmdxLCBnbWVhbl9lY3Jyc19nbG9iYWxfYW54ID0gdG90X2VjcnJzX2dsb2JhbF9hbngtZ21lYW5fZWNycnNfZ19hbngsIGdtZWFuX2VjcnJzX2dsb2JhbF9hdm9pZCA9IHRvdF9lY3Jyc19nbG9iYWxfYXZvaWQtZ21lYW5fZWNycnNfZ19hdiwgZ21lYW5fZWNycnNfc3BvdXNlX2FueCA9IHRvdF9lY3Jyc19zcG91c2VfYW54LWdtZWFuX2VjcnJzX3NfYW54LCBnbWVhbl9lY3Jyc19zcG91c2VfYXZvaWQgPSB0b3RfZWNycnNfc3BvdXNlX2F2b2lkLWdtZWFuX2VjcnJzX3NfYXYsIGdtZWFuX3lzbCA9IHRvdF95c2wtZ21lYW5feXNsLCBnbWVhbl9pY2cgPSB0b3RfaWNnLWdtZWFuX2ljZykKc3RhcmdhemVyKGFzLmRhdGEuZnJhbWUoZ2N2YXJzMiksIHR5cGU9InRleHQiKSAjIHllcywgbm93IHRoZSBtZWFucyBhcmUgemVybyB3aGVuIGVhY2ggcGVyc29uIGNvbnRyaWJ1dGVzIG9ubHkgb25lIG9ic2VydmF0aW9uCgpzYXZlUkRTKG1sbV9ieDUsICJ+L0Ryb3Bib3gvMjAxOEZhbGwvRlNIRDYxN0MvbWxtX2J4NS5yZHMiKQpgYGAKCiMjIyBFdmFsdWF0ZSBtaXNzaW5nIGRhdGEgCmBgYHtyfQptbG1fYng1ICU+JSAKICBzZWxlY3RfaWYoZnVuY3Rpb24oeCkgYW55KGlzLm5hKHgpKSkgJT4lIAogIHN1bW1hcmlzZV9hbGwoZnVucyhtZWFuKGlzLm5hKC4pKSkpIC0+IG1sbV9ieDVfTkFzICMgb3IgdXNlIHN1bSgpIGluc3RlYWQgb2YgbWVhbigpIHRvIGZpbmQgbiBtaXNzaW5nIHZhbHVlcwoKbWxtX2J4NV9OQXMgPC0gZ2F0aGVyKG1sbV9ieDVfTkFzKSAjIGNyZWF0ZSBsb25nIGRhdGEgdGhhdCBsaXN0cyB2YXJpYWJsZXMgd2l0aCBhbnkgTkFzLCBhbmQgJSBvZiBkYXRhIG1pc3NpbmcKbWxtX2J4NV9OQXMgIyB0aGlzIGRvZXMgYmFzaWNhbGx5IHRoZSBzYW1lIHRoaW5nIGFzIHRoZSBwcm9wbWlzcyBmdW5jdGlvbiBmcm9tIEhPOCwgYnV0IGl0IG9ubHkgc2hvd3MgdmFyaWFibGVzIHdoZXJlIHRoZXJlIGlzIG1pc3NpbmcgZGF0YQoKIyMgcmV2aXNlZCB0aGlzIGZvciB2MiB0byB1c2UgVklNCiMgaW5zdGFsbC5wYWNrYWdlcygiVklNIikKbGlicmFyeShtaWNlKQpsaWJyYXJ5KFZJTSkKYWdnciA9IGFnZ3IobWxtX2J4NSwgY29sPW1kYygxOjIpLCBudW1iZXJzPVRSVUUsIHNvcnRWYXJzPVRSVUUsIGxhYmVscz1uYW1lcyhtbG1fYng1KSwgY2V4LmF4aXM9LjcsIGdhcD0zLCB5bGFiPWMoIlByb3BvcnRpb24gb2YgbWlzc2luZ25lc3MiLCJNaXNzaW5nbmVzcyBQYXR0ZXJuIikpCmBgYApPbmUgcGVyc29uIGlzIG1pc3NpbmcgcnMyMjU0Mjk4IGdlbm90eXBlIChgcnMyMjU0Mjk4YCBhbmQgYHJzMjI1NDI5OF9BLmNhcnJpZXJgKSwgd2hpY2ggd2UgYWxyZWFkeSBrbmV3IGFib3V0LiBObyBvbmUgZWxzZSBpcyBtaXNzaW5nIGRhdGEgb24gYW55IHZhcmlhYmxlLgoKIyMjIFNjYWxlIHJlbGlhYmlsaXRpZXMKVGhpcyBkYXRhc2V0IGRvZXMgbm90IGluY2x1ZGUgdGhlIGl0ZW0tbGV2ZWwgZGF0YSwgYnV0IHdlIGNhbiBnZXQgdGhhdCBmcm9tIHRoZSBtYXN0ZXIgZGF0YXNldCB3ZSBsb2FkZWQgaW4gZWFybGllci4KYGBge3J9CmxpYnJhcnkocHN5Y2gpCm1sbV9zY2FsZXMgPC0gZmlsdGVyKG1hc3RlciwgIWdyZXBsKCJEMTQ5IixJRCkpCgojIyBCREkKbWxtX3RvdF9iZGkgPC0gc3Vic2V0KG1sbV9zY2FsZXMsIHNlbGVjdD1jKGJkaV8xYzpiZGlfMjFjKSkgIApwc3ljaDo6YWxwaGEobWxtX3RvdF9iZGkpICMgdXNlIHBzeWNoOjphbHBoYSBzbyBpdCBkb2Vzbid0IGNvbmZsaWN0IHcvZ2dwbG90J3MgYWxwaGEKCiMjIEJHUQptbG1fdG90X2JncSA8LSBzdWJzZXQobWxtX3NjYWxlcywgc2VsZWN0PWMoYmdxXzE6YmdxXzUpKQpwc3ljaDo6YWxwaGEobWxtX3RvdF9iZ3EpCgojIyBJQ0cKbWxtX3RvdF9pY2cgPC0gc3Vic2V0KG1sbV9zY2FsZXMsIHNlbGVjdD1jKGljZ18xOmljZ18xOSkpCnBzeWNoOjphbHBoYShtbG1fdG90X2ljZykKCiMjIFlTTAptbG1fdG90X3lzbCA8LSBzdWJzZXQobWxtX3NjYWxlcywgc2VsZWN0PWMoeXNsXzE6eXNsXzIxKSkKcHN5Y2g6OmFscGhhKG1sbV90b3RfeXNsKQoKIyMgRUNSUlMtZ2xvYmFsIGFueGlldHkKbWxtX3RvdF9lY3Jyc19nbG9iYWxfYW54IDwtIHN1YnNldChtbG1fc2NhbGVzLCAgc2VsZWN0PWMoZWNycnNfZ2xvYmFsXzdjOmVjcnJzX2dsb2JhbF85YykpCnBzeWNoOjphbHBoYShtbG1fdG90X2VjcnJzX2dsb2JhbF9hbngpCgojIyBFQ1JSUy1nbG9iYWwgYXZvaWQKbWxtX3RvdF9lY3Jyc19nbG9iYWxfYXZvaWQgPC0gc3Vic2V0KG1sbV9zY2FsZXMsICBzZWxlY3Q9YyhlY3Jyc19nbG9iYWxfMXI6ZWNycnNfZ2xvYmFsXzRyLCBlY3Jyc19nbG9iYWxfNWMsIGVjcnJzX2dsb2JhbF82YykpCnBzeWNoOjphbHBoYShtbG1fdG90X2VjcnJzX2dsb2JhbF9hdm9pZCkKCiMjIEVDUlJTLXNwb3VzZSBhbnhpZXR5Cm1sbV90b3RfZWNycnNfc3BvdXNlX2FueCA8LSBzdWJzZXQobWxtX3NjYWxlcywgIHNlbGVjdD1jKGVjcnJzX3Nwb3VzZV83YzplY3Jyc19zcG91c2VfOWMpKQpwc3ljaDo6YWxwaGEobWxtX3RvdF9lY3Jyc19zcG91c2VfYW54KQoKIyMgRUNSUlMtc3BvdXNlIGF2b2lkCm1sbV90b3RfZWNycnNfc3BvdXNlX2F2b2lkIDwtIHN1YnNldChtbG1fc2NhbGVzLCAgc2VsZWN0PWMoZWNycnNfc3BvdXNlXzFyOmVjcnJzX3Nwb3VzZV80ciwgZWNycnNfc3BvdXNlXzVjLCBlY3Jyc19zcG91c2VfNmMpKQpwc3ljaDo6YWxwaGEobWxtX3RvdF9lY3Jyc19zcG91c2VfYXZvaWQpCgpgYGAKQWxsIHJlbGlhYmlsaXRpZXMgbG9vayBnb29kIG9yIGV4Y2VsbGVudCAoYSA+PS44NikgZXhjZXB0IGZvciB0aGUgQnJpZWYgR3JpZWYgUXVlc3Rpb25uYWlyZSwgd2hlcmUgYSA9IC43Mi4gSXQncyBhIHNob3J0IHNjcmVlbmluZyBtZWFzdXJlIHdpdGggb25seSA3IGl0ZW1zLCBzbyBtYWtlcyBzZW5zZSB0aGF0IGl0cyByZWxpYWJpbGl0eSB3b3VsZCBiZSBsb3dlci4KCiMjIyBEcm9wIHRoZSA0IHBlb3BsZSB3aXRoIGxvdyB0cmlhbCBjb3VudHMKUmVjYWxsIHRoYXQgdGhlc2UgcGFydGljaXBhbnRzIGhhZCBiaWFzIHNjb3JlcyBvbiA8MTQlIG9mIHRyaWFscywgbGlrZWx5IGR1ZSB0byBmYWlsaW5nIHRvIHJldmVyc2UgdGhlIGluc3RydWN0aW9ucyBvbiBydW4gMi4KYGBge3J9CmRhdGEgPC0gZmlsdGVyKG1sbV9ieDUsICFncmVwbCgiRDEwMXxEMTQxfEQxNDd8RDE0OCIsSUQpKQp1bmlxdWUoZGF0YSRJRCkgIyBjaGVja2luZyB0aGF0IGl0IHdvcmtlZApgYGAKCiMjIE9MUyBlc3RpbWF0ZXMgZm9yIGV4cGxvcmF0b3J5IHB1cnBvc2VzCgpgYGB7cn0KIyBnZXR0aW5nIHJlZ3VsYXIgcmVncmVzc2lvbiBlc3RpbWF0ZXMgb25lIHBlcnNvbiBhdCBhIHRpbWUgZm9yIGV4cGxvcmF0b3J5IHB1cnBvc2VzOgpsbUVzdCA8LSBieShkYXRhLCBkYXRhJElELCBmdW5jdGlvbih4KSBzdW1tYXJ5KGxtKGJpYXNfdCB+IHRyaWFsbnVtLCBkYXRhPXgpKSkKbG1Fc3QKYGBgClBlb3BsZXMnIGludGVyY2VwdHMgZG8gbG9vayBmYWlybHkgZGlmZmVyZW50IGZyb20gZWFjaCBvdGhlci4uLgoKIyMjIFN0ZW0gcGxvdCBmb3IgdGhlIGludGVyY2VwdHMgYmFzZWQgb24gdGhlIE9MUyBlc3RpbWF0ZXMKYGBge3J9CmludCA8LSBieShkYXRhLCBkYXRhJElELCBmdW5jdGlvbih4KSBjb2VmZmljaWVudHMobG0oYmlhc190IH4gdHJpYWxudW0sIGRhdGE9eCkpW1sxXV0pCmludAoKc3VtbWFyeShpbnQpCnN0ZW0oaW50LCBzY2FsZT0yKQpoaXN0KGludCkKYGBgCiMjIyBTdGVtIHBsb3QgZm9yIHRoZSBzbG9wZXMgYmFzZWQgb24gdGhlIE9MUyBlc3RpbWF0ZXMKYGBge3J9CnNsb3BlIDwtIGJ5KGRhdGEsIGRhdGEkSUQsIGZ1bmN0aW9uKHgpIGNvZWZmaWNpZW50cyhsbShiaWFzX3QgfiB0cmlhbG51bSwgZGF0YT14KSlbWzJdXSkKc2xvcGUKCnN1bW1hcnkoc2xvcGUpCnN0ZW0oc2xvcGUsIHNjYWxlPTIpCmhpc3Qoc2xvcGUpCmBgYApOb3RlIHRoYXQgdGhlc2UgYXJlIGFsbCBleHRyZW1lbHkgY2xvc2UgdG8gemVybyAtIHByb2JhYmx5IGJlY2F1c2Ugb2YgdGhlIGxhY2sgb2YgdGltZSBlZmZlY3QuCgojIyMgUi1zcXVhcmUgZm9yIE9MUyBtb2RlbHMKYGBge3J9Cgpyc3EgPC0gYnkoZGF0YSwgZGF0YSRJRCwgZnVuY3Rpb24oeCkgc3VtbWFyeShsbShiaWFzX3QgfiB0cmlhbG51bSwgZGF0YT14KSkkci5zcXVhcmVkKQpzdW1tYXJ5KHJzcSkKc3RlbShyc3EsIHNjYWxlPTIpCgpjb3IoaW50LCBzbG9wZSkKYGBgClRoZSBjb3JyZWxhdGlvbiBiZXR3ZWVuIGludGVyY2VwdHMgYW5kIHNsb3BlcyBpcyAtMC40NzUsIHNvIHBlb3BsZSB3aG8gc2hvdyBsZXNzIGF2b2lkYW5jZSBiaWFzIG92ZXJhbGwgY2hhbmdlIGxlc3Mgb3ZlciB0aGUgY291cnNlIG9mIHRoZSB0YXNrLgogCiMjIEdyYXBoaW5nIG11bHRpbGV2ZWwgZGF0YSBmb3IgZXhwbG9yYXRvcnkgcHVycG9zZXMKYGBge3J9CmxpYnJhcnkobGF0dGljZSkKeHlwbG90KGJpYXNfdCB+IHRyaWFsbnVtIHwgSUQsIGRhdGEgPSBkYXRhLCBhcy50YWJsZT1UKSAjIHRvbyBtYW55IHBlb3BsZS9oYXJkIHRvIHNlZSwgdHJ5IHJhbmRvbSBzdWJzZXQKCmlkcyA8LSBzYW1wbGUodW5pcXVlKGRhdGEkSUQpLCAxMikKaWRzCnRlbXAgPC0gZGF0YVtkYXRhJElEICVpbiUgaWRzLCBdCnh5cGxvdChiaWFzX3QgfiB0cmlhbG51bSB8IElELCBkYXRhID0gdGVtcCwgYXMudGFibGU9VCkgCgojIGFkZCBmaXQgbGluZShzKQp4eXBsb3QoYmlhc190IH4gdHJpYWxudW0gfCBJRCwgZGF0YSA9IHRlbXAsIHR5cGU9YygicCIsInIiKSkgIyBsaW5lYXIgZml0Cnh5cGxvdChiaWFzX3QgfiB0cmlhbG51bSB8IElELCBkYXRhID0gdGVtcCwgdHlwZT1jKCJwIiwic21vb3RoIikpICMgY3VydmlsaW5lYXIgZml0CgojIGdyYXBoIG9mIHRoZSByYXcgZGF0YSBmb3IgZWFjaCBwZXJzb24KaW50ZXJhY3Rpb24ucGxvdChkYXRhJHRyaWFsbnVtLCBkYXRhJElELCBkYXRhJGJpYXNfdCkKCiMgZ2VuZXJhdGUgbGluZWFyIGZpdHRlZCB2YWx1ZXMgZm9yIGVhY2ggcGVyc29uIGFuZCB0aGVuIHBsb3QgYWxsIHRvZ2V0aGVyIGluIG9uZSBwbG90CmZpdCA8LSBieShkYXRhLCBkYXRhJElELCBmdW5jdGlvbih4KSBmaXR0ZWQudmFsdWVzKGxtKGJpYXNfdCB+IHRyaWFsbnVtLCBkYXRhPXgpKSkKZml0MiA8LSB1bmxpc3QoZml0KQppbnRlcmFjdGlvbi5wbG90KGRhdGEkdHJpYWxudW0sIGRhdGEkSUQsIGZpdDIsIHhsYWI9InRyaWFsIG51bWJlciIsIHlsYWI9IlJUIGJpYXMgKHRyYW5zZm9ybWVkKSIpCmBgYApUaGVyZSBkb2VzIG5vdCBzZWVtIHRvIGJlIGVpdGhlciBhIGxpbmVhciBvciBjdXJ2aWxpbmVhciBlZmZlY3Qgb2YgdHJpYWwgbnVtYmVyIChpLmUuLCB0aW1lKSBvbiBSVCBiaWFzIGluIHRoZSB0YXNrLgoKCiMjIEFuYWx5c2VzIChOSFNUKQo8Y2VudGVyPjxpPlJlbWVtYmVyLCB0aGUgZWZmZWN0IG9mIHRpbWUgcmVmZXJzIHRvIGB0cmlhbG51bWJlcmAgKHRoaXMgaXMgTk9UIHRoZSBgdGltZWAgdmFyaWFibGU7IGB0aW1lYCByZWZlcnMgdG8gdGltZSBvZiBkYXkgd2hlbiB0YXNrIHdhcyBydW4uKTwvaT48L2NlbnRlcj4KClRoZSBkZXBlbmRlbnQgdmFyaWFibGUsIGBiaWFzX3RgLCBpcyB0aGUgbWVhc3VyZSBvZiByZWxhdGl2ZSBiZWhhdmlvcmFsIGFwcHJvYWNoL2F2b2lkYW5jZSBiaWFzLCBiYXNlZCBvbiByZWFjdGlvbiB0aW1lIHRvIHB1c2ggb3IgcHVsbCBhIGpveXN0aWNrIGluIHJlc3BvbnNlIHRvIHZhcmlvdXMgaW1hZ2VzLiBXZSB0cmFuc2Zvcm1lZCBpdCBiZWNhdXNlIGl0IHdhcyBub3Qgbm9ybWFsbHkgZGlzdHJpYnV0ZWQsIGFuZCB1c2UgdGhlIHRyYW5zZm9ybWVkIHZhcmlhYmxlIGZvciBhbGwgYW5hbHlzZXMuCgojIyMgVW5jb25kaXRpb25hbCBtZWFucyBtb2RlbApgYGB7cn0KbGlicmFyeShubG1lKQoKIyB1bmNvbmRpdGlvbmFsIG1lYW5zIG1vZGVsCm0xIDwtIGxtZShiaWFzX3QgfiAxLCByYW5kb20gPSB+IDEgfCBJRCwgZGF0YT1kYXRhLCBtZXRob2Q9Ik1MIikKc3VtbWFyeShtMSkKCiMgSUNDCmlWYXIgPC0gYXMubnVtZXJpYyhWYXJDb3JyKG0xKVsxLDFdKQpyZXNpZFZhciA8LSBhcy5udW1lcmljKFZhckNvcnIobTEpWzIsMV0pCmljYzEgPC0gaVZhci8oaVZhcityZXNpZFZhcikgCmljYzEKYGBgClRoZSBvdmVyYWxsIG1lYW4gYmlhcyBzY29yZSAodHJhbnNmb3JtZWQpIGlzIGFib3V0IC0wLjAwMiwgd2l0aCBhIHN0YW5kYXJkIGRldmlhdGlvbiBvZiAwLjAyMy4KCklDQyBpcyBhYm91dCAxLjYlIG9mIHRoZSB2YXJpYW5jZS4gVGhpcyBtZWFucyB0aGF0IDEuNiUgb2YgdGhlIHZhcmlhbmNlIGluIGJpYXMgaXMgZXhwbGFpbmVkIGJ5IHBlb3BsZSBiZWluZyBkaWZmZXJlbnQgZnJvbSBvbmUgYW5vdGhlciwgd2hpbGUgdGhlIHJlbWFpbmRlciBpcyBleHBsYWluZWQgYnkuLi5zb21ldGhpbmcgZWxzZS4KCiMjIyBBZGQgZml4ZWQgYW5kIHJhbmRvbSBpbnRlcmNlcHQgYW5kIHNsb3BlIG9mIHRpbWUKYGBge3J9CiMgbW9kZWwgd2l0aCBmaXhlZCBhbmQgcmFuZG9tIGludGVyY2VwdCBhbmQgc2xvcGUgb2YgdGltZSAoaW50ZXJjZXB0cyBpbXBsaWVkKQptMiA8LSBsbWUoYmlhc190IH4gdHJpYWxudW0sIGRhdGEgPSBkYXRhLCByYW5kb20gPSB+IHRyaWFsbnVtIHwgSUQsIG1ldGhvZD0iTUwiKQpzdW1tYXJ5KG0yKSAKYW5vdmEobTIpCmBgYApUaGUgYXZlcmFnZSBiaWFzIGF0IHRyaWFsIG51bWJlciA9IDAgaXMgLTAuMDE2IGFuZCBnZXRzIGluY3JlYXNpbmdseSBhcHByb2FjaC1iaWFzZWQgYnkgYSBub25zaWduaWZpY2FudCBmcmFjdGlvbiBvZiBhIHBlcmNlbnQgd2l0aCBlYWNoIHVuaXQgb2YgdGltZS4gVGhlcmUgaXMgbm8gc2lnbmlmaWNhbnQgZWZmZWN0IG9mIHRyaWFsIG51bWJlciAodGltZSkgb24gUlQgYmlhcyBzY29yZSwgX3RfID0gMC43NCwgX3BfID0gMC40NTcuIAoKYGBge3J9CiMgSUNDCmlWYXIgPC0gYXMubnVtZXJpYyhWYXJDb3JyKG0yKVsxLDFdKQpyZXNpZFZhciA8LSBhcy5udW1lcmljKFZhckNvcnIobTIpWzIsMV0pCmljYzIgPC0gaVZhci8oaVZhcityZXNpZFZhcikKaWNjMgpgYGAKOTkuOTklIG9mIHZhcmlhbmNlIGluIGJpYXMgaXMgZHVlIHRvIHRoZSBiZXR3ZWVuLXBlcnNvbiB2YXJpYW5jZSwgYWZ0ZXIgY29udHJvbGxpbmcgZm9yIHRpbWUuIFRoaXMgaXMgY29uc2lzdGVudCB3aXRoIHRoZSBsYWNrIG9mIGEgc2lnbmlmaWNhbnQgZWZmZWN0IG9mIHRpbWUuIAoKIyMjIEFkZGluZyBzdGltdWx1cyBhcyBhIGZpeGVkIGVmZmVjdApUaGVyZSB3ZXJlIDUgZGlmZmVyZW50IHR5cGVzIG9mIHN0aW11bGksIHByZXNlbnRlZCBpbiBhIHJhbmRvbWl6ZWQgb3JkZXIgKGNvbnNpc3RlbnQgYWNyb3NzIHBhcnRpY2lwYW50cy9zZXNzaW9ucykgZGV0ZXJtaW5lZCBieSBnZW5ldGljIGFsZ29yaXRobS4gRXZlcnlvbmUgc2F3IHRoZSBzYW1lIHN0aW11bGkgaW4gdGhlIHNhbWUgb3JkZXIsIHNvIGl0IGlzIGEgZml4ZWQgZWZmZWN0LiBUaGUgZGlmZmVyZW50IGNhdGVnb3JpZXMgb2YgaW1hZ2VzIHdlcmU6IERlYXRoIChnZW5lcmljKSwgRGVjZWFzZWQgKHBlcnNvbmFsIHBob3RvKSwgT3RoZXIgbGl2aW5nIGxvdmVkIG9uZSAocGVyc29uYWwgcGhvdG8pLCBTdHJhbmdlciAoc2V4LW1hdGNoZWQgdG8gc3BvdXNlKSwgYW5kIE5ldXRyYWwgKG9iamVjdHMpLiBUaGUgZmFjdG9yIGBzdGltYCB3YXMgY3JlYXRlZCBzdWNoIHRoYXQgTmV1dHJhbCB3YXMgdGhlIHJlZmVyZW5jZSBsZXZlbC4KCmBgYHtyfQojIGFkZCB0aGUgZml4ZWQgZWZmZWN0IG9mIHN0aW0gYW5kIGNvbXBhcmUgaXRzIGZpdCB0byBtMiBieSBpbnNwZWN0aW5nIHRoZSB0IGFuZCBmIHRlc3RzCm0zIDwtIGxtZShiaWFzX3QgfiB0cmlhbG51bSArIHN0aW0sIGRhdGEgPSBkYXRhLCByYW5kb20gPSB+IHRyaWFsbnVtIHwgSUQsIG1ldGhvZD0iTUwiKQpzdW1tYXJ5KG0zKQpgYGAKTk8gZWZmZWN0IG9mIHRpbWUuIFRoZXJlIGlzIGEgc2lnbmlmaWNhbnQgZml4ZWQgZWZmZWN0IG9mIHNwb3VzZSwgX3RfID0gMy41NSwgX3BfID0gLjAwMDQuIFRoZXJlIGlzIGFsc28gYSBub24tc2lnbmlmaWNhbnQgZWZmZWN0IG9mIHN0cmFuZ2VyLCBfdF8gPSAtMS43MywgX3BfID0gLjA4NC4gVGhpcyBpbmRpY2F0ZXMgdGhhdCBwZW9wbGUgdGVuZGVkIHRvIHNob3cgbW9yZSBhcHByb2FjaCBiaWFzIHRvIHBob3RvcyBvZiB0aGVpciBzcG91c2UgKGFjcm9zcyBjb25kaXRpb25zKS4gVGhlIHBhcmFtZXRlciBlc3RpbWF0ZSBpcyAwLjEyIHdpdGggYW4gX1NFXyBvZiAwLjAzLiBUaGV5IGFsc28gdGVuZGVkIHRvIHNob3cgZ3JlYXRlciBtb3JlIGF2b2lkYW5jZSBiaWFzIHRvIHBob3RvcyBvZiB0aGUgc2V4LW1hdGNoZWQgc3RyYW5nZXIuCgpgYGB7cn0KaW50ZXJ2YWxzKG0zLCB3aGljaD0iZml4ZWQiKQpgYGAKOTUlIENJcyBkb24ndCBjcm9zcyB6ZXJvIGZvciBzcG91c2UsIGJ1dCBkbyBmb3IgYWxsIG90aGVyIHN0aW11bHVzIHR5cGVzLiBUaGlzIHN1cHBvcnRzIHRoZSBzaWduaWZpY2FudCBlZmZlY3Qgb2Ygc3BvdXNlIHN0aW11bGkgb24gcmVhY3Rpb24gdGltZSBiaWFzLgoKYGBge3J9CmlWYXIgPC0gYXMubnVtZXJpYyhWYXJDb3JyKG0zKVsxLDFdKQpyZXNpZFZhciA8LSBhcy5udW1lcmljKFZhckNvcnIobTMpWzIsMV0pCmljYzMgPC0gaVZhci8oaVZhcityZXNpZFZhcikKaWNjMyAjIFNhbWUgSUNDIGFzIG0yCmBgYApUaGUgSUNDIGlzIGlkZW50aWNhbCB0byB0aGF0IGluIG1vZGVsIDIuIAoKYGBge3J9CmFub3ZhKG0yLCBtMykgIyBjb21wYXJlIHRoaXMgbW9kZWwgd2l0aCB0aGUgZmlyc3Qgb25lCmBgYApDb21wYXJpbmcgdGhlIG1vZGVsIHdpdGggdGhlIGZpeGVkIGVmZmVjdCBvZiBzdGltdWx1cyAobTMpIHRvIHRoZSBtb2RlbCB3aXRob3V0IChtMiksIG0zIGlzIGJldHRlciAoX3BfIDwgLjAwMDEpIGFzIGV2aWRlbmNlZCBieSBsb3dlciBBSUMsIEJJQywgYW5kIGxMIHZhbHVlcy4KCiMjIyBUYWtlIG91dCBmaXhlZCBhbmQgcmFuZG9tIGVmZmVjdCBvZiB0aW1lCkJlY2F1c2UgdGhlcmUncyBubyBzaWduaWZpY2FudCBlZmZlY3Qgb2YgdGltZSwgbWFrZXMgc2Vuc2UgdG8gZHJvcCBpdCBmcm9tIHRoZSBtb2RlbC4gTm93IHdlJ3JlIGJhc2ljYWxseSBkb2luZyByZWdyZXNzaW9uIGJ1dCBhY2NvdW50aW5nIGZvciB3aGF0ZXZlciBpbnRlcmRlcGVuZGVuY2UgZXhpc3RzLiA8Zm9udCBjb2xvcj0icmVkIj5Ob3RlIHRoYXQgdGhlc2UgcmVzdWx0cyB3aWxsIF9OT1RfIG1hdGNoIHRoZSByZXN1bHRzIG9mIHRoZSByZWdyZXNzaW9ucywgYmVjYXVzZSB0aGUgcmVncmVzc2lvbnMgYXJlIGJhc2VkIG9uIGJpYXMgc2NvcmUgPHU+bWVkaWFuczwvdT4gYXMgdGhlIERWLCByYXRoZXIgdGhhbiBtZWFucy48L2ZvbnQ+CgpgYGB7cn0KIyB3aXRob3V0IGZpeGVkIG9yIHJhbmRvbSBlZmZlY3Qgb2YgdGltZSwgb25seSBmaXhlZCBlZmZlY3Qgb2Ygc3RpbXVsdXMKbTQgPC0gbG1lKGJpYXNfdCB+IHN0aW0sIGRhdGEgPSBkYXRhLCByYW5kb20gPSB+IDEgfCBJRCwgbWV0aG9kPSJNTCIpCnN1bW1hcnkobTQpCmBgYApGaXhlZCBlZmZlY3RzIGFyZSBzdGlsbCBtb3JlIG9yIGxlc3MgdGhlIHNhbWUgLSBzaWduaWZpY2FudCBmb3Igc3BvdXNlLCBtYXJnaW5hbCBmb3Igc3RyYW5nZXIgLSBhbHRob3VnaCB0aGUgcGFyYW1ldGVyIGVzdGltYXRlcyBhbmQgdGVzdCBzdGF0aXN0aWNzIGFyZSBzbGlnaHRseSBkaWZmZXJlbnQuCgpgYGB7cn0KaW50ZXJ2YWxzKG00LCB3aGljaD0iZml4ZWQiKQpgYGAKQXMgYWJvdmUsIHNwb3VzZSBpcyB0aGUgb25seSBzdGltdWx1cyBjYXRlZ29yeSB3aG9zZSA5NSBDSXMgZG9uJ3QgY3Jvc3MgemVybywgc3VwcG9ydGluZyBhIHNpZ25pZmljYW50IGVmZmVjdCBvZiBzcG91c2Ugb24gYmlhcyAtIGluIHRoaXMgY2FzZSwgdmlld2luZyBzcG91c2UgaW1hZ2VzIHdhcyBhc3NvY2lhdGVkIHdpdGggYSByZWxhdGl2ZSBhcHByb2FjaCBiaWFzLgoKSXMgbTQgYW55IGJldHRlciB0aGFuIG0zPwpgYGB7cn0KYW5vdmEobTMsbTQpCmBgYApOb3BlLiBNb2RlbHMgZG8gbm90IHNpZ25pZmljYW50bHkgZGlmZmVyIChfcF8gPSAwLjg1MSksIHRob3VnaCB0aGUgQUlDIGFuZCBCSUMgdmFsdWVzIGFyZSBhIGxpdHRsZSBzbWFsbGVyIGZvciBtNCB0aGFuIG0zLiBTbyBsZXQncyBmb3JnZXQgdGltZSBhbmQgZ28gd2l0aCBtNC4uLgoKIyMjIEFkZGluZyBjb25kaXRpb24gYXMgYSBmaXhlZCBlZmZlY3QKUGFydGljaXBhbnRzIGNvbXBsZXRlZCB0aGUgdGFzayBhdCB0d28gZGlmZmVyZW50IHNlc3Npb25zLCB3aGVyZSB0aGV5IHdlcmUgcmFuZG9taXplZCB0byByZWNlaXZlIHRyZWF0bWVudCBBIGF0IG9uZSBhbmQgdHJlYXRtZW50IEIgYXQgdGhlIG90aGVyIChvcmRlciBjb3VudGVyYmFsYW5jZWQgYWNyb3NzIHBhcnRpY2lwYW50cykuIFRoZSB0d28gdHJlYXRtZW50cyBhcmUgb3h5dG9jaW4gdnMuIHBsYWNlYm8uIApgYGB7cn0KIyBhZGQgdGhlIGludGVyYWN0aW9uIG9mIHN0aW0gYW5kIGNoZWNrIGl0cyBmaXQgYnkgaW5zcGVjdGluZyB0IGFuZCBmIHRlc3RzLiAKbTUgPC0gbG1lKGJpYXNfdCB+IHN0aW0gKyBjb25kLCBkYXRhID0gZGF0YSwgcmFuZG9tID0gfiAxIHwgSUQsIG1ldGhvZD0iTUwiKQpzdW1tYXJ5KG01KQpgYGAKVGhlIGZpeGVkIGVmZmVjdCBvZiBjb25kaXRpb24gQiBpcyBub3Qgc2lnbmlmaWNhbnQsIF90XyA9IDAuMTUsIF9wXyA9IDAuODg0LgoKYGBge3J9CmFub3ZhKG00LCBtNSkKYGBgClRoZSB0d28gbW9kZWxzIGFyZSBub3Qgc2lnbmlmaWNhbnRseSBkaWZmZXJlbnQsIGJ1dCB0aGUgb25lIHdpdGggdGhlIGZpeGVkIGVmZmVjdCBvZiBjb25kaXRpb24gKG01KSBoYXMgc2xpZ2h0bHkgaGlnaGVyIEFJQy9CSUMuIE5vdCBjb21wZWxsaW5nIGVub3VnaCB0byBzZWxlY3QgdGhhdCBtb2RlbCBvdmVyIG00LCB0aG91Z2guCgojIyMgQWRkaW5nIHRoZSBzdGltdWx1cypjb25kaXRpb24gaW50ZXJhY3Rpb24KCldlIG1pZ2h0IGV4cGVjdCB0aGF0IHBlb3BsZXMnIHRlbmRlbmN5IHRvIGFwcHJvYWNoIG9yIGF2b2lkIG1pZ2h0IGRpZmZlciBkZXBlbmRpbmcgb24gd2hpY2ggdHJlYXRtZW50IHRoZXkgZ290LCBidXQgb25seSBmb3IgY2VydGFpbiBzdGltdWxpLgpgYGB7cn0KIyBhZGQgdGhlIGludGVyYWN0aW9uIG9mIHN0aW0gYW5kIGNoZWNrIGl0cyBmaXQgYnkgaW5zcGVjdGluZyB0IGFuZCBmIHRlc3RzLiAKbTYgPC0gbG1lKGJpYXNfdCB+IHN0aW0qY29uZCwgZGF0YSA9IGRhdGEsIHJhbmRvbSA9IH4gMSB8IElELCBtZXRob2Q9Ik1MIikKc3VtbWFyeShtNikKaW50ZXJ2YWxzKG02KQpgYGAKSW50ZXJlc3RpbmcuIFdpdGggdGhlIGludGVyYWN0aW9uIGluIHRoZSBtb2RlbCwgdGhlcmUgaXMgYSBzaWduaWZpY2FudCBlZmZlY3Qgb2YgZGVhdGggYW5kIHN0cmFuZ2VyIGJ1dCBub3Qgc3BvdXNlLiA5NSUgQ0lzIGluZGljYXRlIHRoYXQgdmlld2luZyB0aGUgZ2VuZXJpYyBkZWF0aCBhbmQgc3RyYW5nZXIgc3RpbXVsaSBhcmUgYm90aCBhc3NvY2lhdGVkIHdpdGggZ3JlYXRlciByZWxhdGl2ZSBhdm9pZGFuY2UgYmlhcy4gCgpgYGB7cn0KYW5vdmEobTYsbTQsbTUpCmBgYApUaGUgbW9kZWwgd2l0aCB0aGUgaW50ZXJhY3Rpb24gaW4gaXQgaXMgbm90IHNpZ25pZmljYW50bHkgYmV0dGVyIHRoYW4gZWl0aGVyIHRoZSBvbmUgd2l0aCBqdXN0IHRoZSBmaXhlZCBlZmZlY3Qgb2YgY29uZGl0aW9uIG9yIHdpdGggbm8gZWZmZWN0IG9mIGNvbmRpdGlvbiBhdCBhbGwsIHNvIG1ha2VzIHNlbnNlIHRvIGdvIHdpdGggdGhlIHNpbXBsZXN0IG1vZGVsIHdoaWNoIG9ubHkgaW5jbHVkZXMgc3RpbXVsdXMgYXMgYSBmaXhlZCBlZmZlY3QuCgojIyMgQWRkaW5nIG90aGVyIHBsYXVzaWJsZSBwcmVkaWN0b3JzClRoZXJlIGFyZSBhIGZldyBvdGhlciB2YXJpYWJsZXMgdGhhdCB3ZSBtaWdodCBleHBlY3QgdG8gaW1wYWN0IGFwcHJvYWNoL2F2b2lkYW5jZSBiaWFzLCBuYW1lbHkgZ3JpZWYgc2V2ZXJpdHksIE9YVFIgZ2Vub3R5cGUsIHRpbWUgc2luY2UgZGVhdGgsIGFuZCBhdHRhY2htZW50IHN0eWxlIChhdm9pZGFudCwgYW54aW91cykuIApgYGB7cn0KIyB1c2VkIGdyb3VwIG1lYW4gY2VudGVyZWQgc2NvcmVzIGZvciB0aGUgYWRkaXRpb25hbCB2YXJpYWJsZXMgZm9yIGludGVycHJldGFiaWxpdHkKbTcgPC0gbG1lKGJpYXNfdCB+IHN0aW0gKyByczUzNTc2X0EuY2FycmllciArIHJzMjI2ODQ5OF9DLmNhcnJpZXIgKyBnbWVhbl9lY3Jyc19zcG91c2VfYW54ICsgZ21lYW5fZWNycnNfc3BvdXNlX2F2b2lkICsgZ21lYW5fYWdlICsgZ21lYW5faWNnICsgZ21lYW5fdGltZXNpbmNlZGVhdGgsIGRhdGEgPSBkYXRhLCByYW5kb20gPSB+IDEgfCBJRCwgbWV0aG9kPSJNTCIpCnN1bW1hcnkobTcpCmFub3ZhKG00LG03KQpgYGAKTm9uZSBvZiB0aGUgYWRkZWQgZml4ZWQgZWZmZWN0cyBhcmUgc2lnbmlmaWNhbnQgaW4gdGhlIG5ldyBtb2RlbCwgYW5kIHRoZSBBSUMvQklDIHZhbHVlcyBhcmUgaGlnaGVyLCBzbyB0YWtlICdlbSBvdXQuIAoKIyMjIEZpbmFsIG1vZGVsCgpgYGB7cn0KIyB2YXJpYW5jZSBleHBsYWluZWQgYnkgdGhlIGVudGlyZSBtb2RlbCAKZml0dGVkIDwtIGZpdHRlZChtNCkKZGF0YSRmaXR0ZWQgPC0gYXMudmVjdG9yKGZpdHRlZCkKcnNxIDwtIGxtKGJpYXMgfiBmaXR0ZWQsIGRhdGE9ZGF0YSkgCnN1bW1hcnkocnNxKQpgYGAKQSBjYXNlIG9mIHNpZ25pZmljYW50LCBidXQgbm90IG1lYW5pbmdmdWw6IFRoZSBSPHN1cD4yPC9zdXA+IGZvciB0aGUgZW50aXJlIG1vZGVsIGlzIC4wMiwgaW5kaWNhdGluZyB0aGF0IDIlIG9mIHRoZSB2YXJpYW5jZSBpbiBiaWFzIGlzIGV4cGxhaW5lZCBieSB0aGUgbW9kZWwuIFNvIHRoaXMgbW9kZWwgaXMgbm90IHZlcnkgZ29vZCBhdCBwcmVkaWN0aW5nIGFwcHJvYWNoL2F2b2lkYW5jZSBiaWFzIGZyb20gdGhlIGZpeGVkIGVmZmVjdCBvZiBzdGltdWx1cyB3aXRoaW4gcGVyc29uLiBPaCB3ZWxsLgoKIyMjIENoZWNrIGZpbmFsIG1vZGVsIGFzc3VtcHRpb25zCgojIyMjQ2hlY2tpbmcgbm9ybWFsaXR5IG9mIHRoZSByZXNpZHVhbHMKYGBge3J9CiMgY2hlY2tpbmcgbm9ybWFsaXR5IG9mIHJlc2lkdWFscwoKIyBsZXZlbCAxOgpxcW5vcm0obTQsIH5yZXNpZCguKSwgaWQ9MC4wMDA3NSkKcGxvdChtNCwgcmVzaWQoLiwgdHlwZT0icCIpIH4gdHJpYWxudW0sIGlkPTAuMDAyNSkKYGBgClRoZSBRUSBwbG90IGxvb2tzIHByZXR0eSBva2F5LCBhbGJlaXQgYSBmZXcgb3V0bGllcnMuIEQxMTMgaXMgdGhlIHBlcnNvbiB3aG8gbW9zdCBmYWxscyBvZmYgdGhlIGxpbmUsIGFuZCBkb2VzIHNvIGF0IGJvdGggZW5kcy4gVGhlIHJlc2lkdWFscyBhcmUgYWxzbyBwcmV0dHkgZXZlbmx5IGRpc3RyaWJ1dGVkIGFjcm9zcyB0aW1lLCB0aG91Z2ggbWFueSBmYWxsIG91dHNpZGUgb2YgdGhlICsvLSAyIHJhbmdlLgoKYGBge3J9CiMgdGhlIGZvbGxvd2luZyBiaXQgd2FudHMgSURzIHRvIGJlIG51bWVyaWMsIHNvIHRha2Ugb3V0IHRoZSAiRCIgZnJvbSBlYWNoIElECmRhdGEgPC0gZGF0YSAlPiUgbXV0YXRlKG51bUlEID0gYXMubnVtZXJpYyhzdHJfcmVwbGFjZShJRCwgIkQiLCAiIikpKQoKIyBsZXZlbCAyOgpxcW5vcm0obTQsIH5yYW5lZiguKSwgaWQ9MC4yNSkKcmFuSW50IDwtIHJhbmVmKG00KVsxXSAjIGNyZWF0ZSBvYmplY3Qgd2l0aCB0aGUgcmFuZG9tIGludGVyY2VwdCBlc3RpbWF0ZXMKcmFuSW50IDwtIHVubGlzdChyYW5JbnQpIApuYW1lcyhyYW5JbnQpIDwtIE5VTEwgCklEIDwtIHVubGlzdChzdWJzZXQoZGF0YSwgIWR1cGxpY2F0ZWQoZGF0YSRudW1JRCksIHNlbGVjdD0ibnVtSUQiKSkgIyBjcmVhdGUgYW4gSUQgdmFyaWFibGUKcGxvdChyYW5JbnQgfiBJRCkKCiMgcmFuU2xvcGUgPC0gcmFuZWYobTQpWzJdICMgY3JlYXRlIGFuIG9iamVjdCB3aXRoIHRoZSByYW5kb20gc2xvcGVzCiMgcmFuU2xvcGU8LSB1bmxpc3QocmFuU2xvcGUpIAojIG5hbWVzKHJhblNsb3BlKSA8LSBOVUxMIAojIHBsb3QocmFuU2xvcGUgfiBJRCkKCmBgYApHZXR0aW5nIGFuIGVycm9yIGhlcmUgZm9yIHRoZSByYW5kb20gc2xvcGVzIDxmb250IGNvbG9yPSJyZWQiPmBFcnJvciBpbiBbLmRhdGEuZnJhbWUocmFuZWYobTQpLCA3MikgOiB1bmRlZmluZWQgY29sdW1ucyBzZWxlY3RlZGA8L2ZvbnQ+LiBJIHRoaW5rIHRoaXMgbWF5IGJlIGJlY2F1c2UgSSBkb24ndCBoYXZlIGFueSByYW5kb20gc2xvcGVzLCBzaW5jZSBJIHRvb2sgdGltZSBvdXQgb2YgdGhlIG1vZGVsLiBJbmRlZWQsIHdoZW4gSSBnbyBpbnRvIGBtNGAsIGl0IGRvZXNuJ3QgbG9vayBsaWtlIGEgc2Vjb25kIGVsZW1lbnQgZm9yIHRoZSBzbG9wZXMgZXhpc3RzLiBMZXQncyB0ZXN0IHRoaXMuLi4KCmBgYHtyfQojIHRlc3QgbXkgaHlwb3RoZXNpcywgdXNpbmcgbTMgKHdoZXJlIHRpbWUgd2FzIGluY2x1ZGVkIGFzIGEgcmFuZG9tIGVmZmVjdCkKcmFuSW50MSA8LSByYW5lZihtMylbMV0gIyBjcmVhdGUgb2JqZWN0IHdpdGggdGhlIHJhbmRvbSBpbnRlcmNlcHQgZXN0aW1hdGVzCnJhbkludDEgPC0gdW5saXN0KHJhbkludDEpIApuYW1lcyhyYW5JbnQxKSA8LSBOVUxMIApJRCA8LSB1bmxpc3Qoc3Vic2V0KGRhdGEsICFkdXBsaWNhdGVkKGRhdGEkbnVtSUQpLCBzZWxlY3Q9Im51bUlEIikpICMgY3JlYXRlIGFuIElEIHZhcmlhYmxlCnBsb3QocmFuSW50MSB+IElEKQoKcmFuU2xvcGUxIDwtIHJhbmVmKG0zKVsyXSAjIGNyZWF0ZSBhbiBvYmplY3Qgd2l0aCB0aGUgcmFuZG9tIHNsb3BlcwpyYW5TbG9wZTE8LSB1bmxpc3QocmFuU2xvcGUxKSAKbmFtZXMocmFuU2xvcGUxKSA8LSBOVUxMIApwbG90KHJhblNsb3BlMSB+IElEKQoKYGBgCk15IHN1c3BpY2lvbiB3YXMgY29ycmVjdDogdGhlIGVycm9yIG1lc3NhZ2UgYWJvdmUgaXMgYmVjYXVzZSB0aGVyZSBhcmUgbm8gcmFuZG9tIHNsb3BlcyBmb3IgbXkgZmluYWwgbW9kZWwuCgojIyMjIENoZWNraW5nIGhvbW9zY2VkYXN0aWNpdHkKYGBge3J9CiMgY2hlY2tpbmcgaG9tb3NjZWRhc3RpY2l0eQoKIyBsZXZlbCAxOgpkYXRhJHJlc2lkIDwtIGFzLm51bWVyaWMocmVzaWR1YWxzKG00KSkgIyBjcmVhdGUgYW4gb2JqZWN0IHdpdGggdGhlIExldmVsLTEgcmVzaWR1YWxzCnBsb3QoZGF0YSRyZXNpZCB+IGRhdGEkc3RpbSkKCiMgbGV2ZWwgMjoKbGlicmFyeShsYXR0aWNlKQpzdGltIDwtIHVubGlzdChzdWJzZXQoZGF0YSwgIWR1cGxpY2F0ZWQoZGF0YSRudW1JRCksIHNlbGVjdD0ic3RpbSIpKQp4eXBsb3QocmFuSW50IH4gc3RpbSkKIyB4eXBsb3QocmFuU2xvcGUgfiBzdGltKSAtIG5vIHJhbmRvbSBzbG9wZXMgc28gZG9uJ3QgcnVuIHRoaXMKYGBgCk5vdGUgdGhhdCBhZ2FpbiB0aGVyZSBhcmUgYSBsb3Qgb2YgcmVzaWR1YWxzIGZhbGxpbmcgb3V0c2lkZSBvZiB0aGUgKy8tMiByYW5nZS4KCkFsc28sIHRoZXJlJ3Mgc29tZXRoaW5nIHdlaXJkIGFib3V0IHRoZSBMMiBwbG90LiBOb3Qgc3VyZSB3aHkgaXQgc2hvd3Mgb25seSAzIG9mIDUgc3RpbXVsdXMgdHlwZXMuCgojIyBBbmFseXNlcyAoQmF5ZXNpYW4pCgojIyNVbmNvbmRpdGlvbmFsIG1lYW5zIG1vZGVsCkZpcnN0IHN0ZXAgaXMgdG8gbG9vayBhdCB0aGUgdW5jb25kaXRpb25hbCBtZWFucyBtb2RlbC4gV2Uga25vdyBmcm9tIHRoZSBleHBsb3JhdG9yeSBzdHVmZiBpbiBwcmV2aW91cyBzZWN0aW9ucyB0aGF0IGBiaWFzX3RgIGlzIG5vcm1hbGx5IGRpc3RyaWJ1dGVkLCBzbyB3ZSBjYW4gdGVsbCBgYnJtc2AgdG8gdXNlIG5vcm1hbCBsaWtlbGlob29kIChHYXVzc2lhbikuCgpgYGB7cn0KbGlicmFyeShicm1zKQpzZXR3ZCgiL1VzZXJzL3NhcmVuc2VlbGV5L0Ryb3Bib3gvMjAxOEZhbGwvRlNIRDYxN0MiKQojIGIxTiA8LSBicm0oYmlhc190IH4gMSArICgxfElEKSwgZGF0YT1kYXRhLCBmYW1pbHk9Z2F1c3NpYW4oKSkgCiMgc2F2ZVJEUyhiMU4sICJ+L0Ryb3Bib3gvMjAxOEZhbGwvRlNIRDYxN0MvbWxtX2FkYTFfYjFOLnJkcyIpCmIxTiA8LSByZWFkUkRTKCJtbG1fYWRhMV9iMU4ucmRzIikKc3VtbWFyeShiMU4pCgpgYGAKUmhhdCA9IDEgYWNyb3NzIHRoZSBib2FyZCwgc28gdGhhdCdzIGdvb2QuCgpgYGB7cn0KcGxvdChiMU4pICMgY2hlY2sgdHJhY2UgcGxvdHMKYGBgCkkgdGhpbmsgdGhlc2UgcGxvdHMgbG9vayBva2F5PyBiX0ludGVyY2VwdCBhbmQgU0RfSURfX0ludGVyY2VwdCBwbG90cyBhcmUgbm90IGV4YWN0bHkgb24gdG9wIG9mIGVhY2ggb3RoZXIsIGJ1dCBkbyBoYXZlIGEgbG90IG9mIG92ZXJsYXAgaW4gdGhlaXIgZGlzdHJpYnV0aW9ucy4KCmBgYHtyfQpwcF9jaGVjayhiMU4sIG5zYW1wbGVzPTIwKSAgIyBwb3N0ZXJpb3IgcHJlZGljdGl2ZSBjaGVjayB1c2luZyBub3JtYWwgbGlrZWxpaG9vZApwcF9jaGVjayhiMU4sIHR5cGU9ImVycm9yX2hpc3QiLCBuc2FtcGxlcz0yMCwgYmlud2lkdGg9MSkgIyBlcnJvciBoaXN0b2dyYW0gKGhpc3RvZ3JhbSBvZiBwcmVkaWN0aW9uIHJlc2lkdWFscykKYGBgClRoZSBvYnNlcnZlZCBkaXN0cmlidXRpb24gaXMgYSB2ZXJ5IGdvb2QgZml0IHRvIHRoZSBwcmVkaWN0ZWQgZGF0YSAoYmFzZWQgb24gdGhlIG5vcm1hbCBkaXN0cmlidXRpb24pLgpUaGUgZXJyb3IgaGlzdG9ncmFtIGFsc28gc2hvd3MgdGhhdCByZXNpZHVhbHMgYXJlIG5vcm1hbGx5IGRpc3RyaWJ1dGVkIGFyb3VuZCAwLiBTZWUgW3RoaXMgcGFnZV0oaHR0cHM6Ly9jcmFuLnItcHJvamVjdC5vcmcvd2ViL3BhY2thZ2VzL2JheWVzcGxvdC92aWduZXR0ZXMvZ3JhcGhpY2FsLXBwY3MuaHRtbCkgZm9yIHNvbWUgaGVscGZ1bCBkb2N1bWVudGF0aW9uLgoKYGBge3J9CiMgY2hlY2sgSUNDIHRvIGdldCBzZW5zZSBvZiBob3cgdmFyaWFuY2UgaXMgZGlzdHJpYnV0ZWQgYmV0d2Vlbi0gYW5kIHdpdGhpbi0gcGVvcGxlCmlTZCA8LSBhcy5udW1lcmljKHN1bW1hcnkoYjFOKSRyYW5kb20kSURbMSwxXSkgIyBmaW5kcyAxc3Qgcm93LCAxc3QgY29sdW1uIG9mIHJhbmRvbSBlZmZlY3RzIGluc2lkZSB0aGUgc3VtbWFyeSBvZiBiMU4KaVZhciA8LSBpU2ReMgpyZXNpZFNkIDwtIGFzLm51bWVyaWMoc3VtbWFyeShiMU4pJHNwZWNfcGFyc1tbMSwxXV0pCnJlc2lkVmFyIDwtIHJlc2lkU2ReMgppY2MxIDwtIGlWYXIvKGlWYXIrcmVzaWRWYXIpIAppY2MxICMgdGhpcyBpcyB0aGUgdW5jb25kaXRpb25hbCBncm93dGggbW9kZWwgLSBqdXN0IGhhcHBlbnMgaW4gdGhpcyBkYXRhc2V0IHRoYXQgaXQncyBhIG51aXNhbmNlIG1vZGVsCmBgYApGb3IgdGhlIHVuY29uZGl0aW9uYWwgZ3Jvd3RoIG1vZGVsLCB0aGUgSUNDIGlzIDAuMDE3LCBtZWFuaW5nIHRoYXQgb25seSBhYm91dCAyJSBvZiB0aGUgdmFyaWFuY2UgaW4gYmlhcyBpcyBiZWNhdXNlIHBlb3BsZSBvbiBhdmVyYWdlIHBlcmZvcm0gZGlmZmVyZW50bHkgZnJvbSBlYWNoIG90aGVyIG9uIHRoZSB0YXNrLgoKIyMjIFRpbWUgYXMgZml4ZWQgYW5kIHJhbmRvbSBlZmZlY3QKYGBge3J9CiMjIGNoZWNrIHdoZXRoZXIgd2UgbmVlZCB0aW1lIGFzIGEgY29udHJvbCB2YXJpYWJsZQojIGIyIDwtIGJybShiaWFzX3QgfiAxICsgdHJpYWxudW0gKyAoMSArIHRyaWFsbnVtfElEKSwgZGF0YT1kYXRhLCBmYW1pbHk9c2tld19ub3JtYWwoKSwgY29udHJvbD1saXN0KGFkYXB0X2RlbHRhID0gLjk1KSkKIyBzYXZlUkRTKGIyLCAibWxtX2FkYTFfYjIucmRzIikKYjIgPC0gcmVhZFJEUygibWxtX2FkYTFfYjIucmRzIikKc3VtbWFyeShiMikgCmBgYAo8aT5Ob3RlOiBFc3RpbWF0ZSA9IG1lYW4gb2YgcG9zdGVyaW9yIGRpc3RyaWJ1dGlvbiBmb3IgZWFjaCBvZiB0aGUgcGFyYW1ldGVycy48L2k+CgoqKkdyb3VwLWxldmVsIGVmZmVjdHMqKjoKV2hlbiB0cmlhbG51bSBpcyAwLCB0aGUgc3RhbmRhcmQgZGV2aWF0aW9uIG9mIHRoZSBpbnRlcmNlcHRzIGlzIDAuMTIuClRoZXJlIGlzIG5vIHJhbmRvbSBlZmZlY3Qgb2YgdGltZTogdGhlIHNsb3BlcyBhcmUgbm90IGF0IGFsbCB2YXJpYWJsZSAocGVvcGxlIGFyZSBub3QgZGlmZmVyZW50IGZyb20gZWFjaCBvdGhlcikuClplcm8gaXMgYSBjcmVkaWJsZSB2YWx1ZSBmb3IgdGhlIGNvcnJlbGF0aW9uLCBiZWNhdXNlIHRoZSA5NSUgQ0lzIChjcmVkaWJsZSBpbnRlcnZhbHMpIGNyb3NzIHplcm8uCgpOb3RlIHRoYXQgUmhhdCBmb3Igc2QodHJpYWxudW0pIGluIHRoZSByYW5kb20gZWZmZWN0cyBpcyAxLjAxLiBQZXIgdGhlIFticm1zIGRvY3VtZW50YXRpb25dKGh0dHBzOi8vZ2l0aHViLmNvbS9wYXVsLWJ1ZXJrbmVyL2JybXMpLCB0aGlzIGRvZXMgbm90IHNlZW0gdG8gaW5kaWNhdGUgYSBjb252ZXJnZW5jZSBpc3N1ZSBkdWUgdG8gbGFjayBvZiBlcnJvciBtZXNzYWdlcyBhbmQgdGhlIGZhY3QgdGhhdCB0aGUgUmhhdCBmb3IgdGhlIGdyb3VwLWxldmVsIGVmZmVjdCBpbiB0aGVpciBleGFtcGxlIGlzIDEuMDE6IDxpPiJJZiAnUmhhdCcgaXMgY29uc2lkZXJhYmx5IGdyZWF0ZXIgdGhhbiAxLCB0aGUgYWxnb3JpdGhtIGhhcyBub3QgeWV0IGNvbnZlcmdlZCBhbmQgaXQgaXMgbmVjZXNzYXJ5IHRvIHJ1biBtb3JlIGl0ZXJhdGlvbnMgYW5kIC8gb3Igc2V0IHN0cm9uZ2VyIHByaW9ycy48L2k+IiBIb3dldmVyLCBpdCBkb2VzIGluZGljYXRlIHRoYXQgSSB3b3VsZCBwcm9iYWJseSB3YW50IHRvIHJ1biBpdCBhZ2FpbiB3aXRoIGEgaGlnaGVyIG51bWJlciBvZiBpdGVyYXRpb25zIG9yIHN0cm9uZ2VyIHByaW9ycy4KCioqUG9wdWxhdGlvbi1sZXZlbCBlZmZlY3RzKio6ClRoZXJlIGlzIG5vIGZpeGVkIGVmZmVjdCBvZiB0aW1lLCBlaXRoZXIsIGdpdmVuIHRoYXQgdGhlIHVwcGVyIGFuZCBsb3dlciBDSSBsaW1pdHMgYXJlIC0wLjAsIDAuMC4KCmBgYHtyfQpwbG90KGIyKQpgYGAKU0RfSURfX3RyaWFsbnVtIGFuZCBjb3JfSURfX0ludGVyY2VwdF9fdHJpYWxudW0gYXJlIHRvdGFsbHkgc2tld2VkLgpgYGB7cn0KcHBfY2hlY2soYjIsIG5zYW1wbGVzPTIwKQpwcF9jaGVjayhiMiwgdHlwZT0iZXJyb3JfaGlzdCIsIG5zYW1wbGVzPTIwLCBiaW53aWR0aD0xKSAKYGBgCkFnYWluLCB0aGUgdHJhY2UgcGxvdCBzaG93cyB0aGF0IHRoZSBvYnNlcnZlZCBkaXN0cmlidXRpb24gaXMgYSB2ZXJ5IGdvb2QgZml0IHRvIHRoZSBwcmVkaWN0ZWQgZGF0YSBiYXNlZCBvbiB0aGUgbm9ybWFsIGRpc3RyaWJ1dGlvbi4KVGhlIGVycm9yIGhpc3RvZ3JhbSBhbHNvIHNob3dzIHRoYXQgcmVzaWR1YWxzIGFyZSBub3JtYWxseSBkaXN0cmlidXRlZCBhcm91bmQgMC4gCgpgYGB7cn0KIyBpZiB5b3UgZ2V0IHRoZSBlcnJvciBtZXNzYWdlCiMjIEVycm9yIGluIChmdW5jdGlvbiAod2hpY2ggPSBkZXYuY3VyKCkpICA6IAojIyAgIGNhbm5vdCBzaHV0IGRvd24gZGV2aWNlIDEgKHRoZSBudWxsIGRldmljZSkKCiMgcnVuIGRldi5zZXQoZGV2Lm5leHQoKSkgYSBmZXcgdGltZXMgdW50aWwgaXQgcmV0dXJucyBzb21ldGhpbmcgbGlrZQojIyA+IGRldi5zZXQoZGV2Lm5leHQoKSkKIyMgcXVhcnR6X29mZl9zY3JlZW4gCiMjICAgICAgICAgICAgICAgIDQgCmBgYAoKX1NLSVBQSU5HIFRIRSBDSFVOSyBCRUxPVy4uLl8KSSBjYW4ndCBnZXQgc2pzdGF0cyB0byBpbnN0YWxsIChpc3N1ZSB3aXRoIHRoZSBzcGVjaWZpYyBUTUIgcGFja2FnZSB2ZXJzaW9uLSBmcmVha2luZyBkZXBlbmRlbmNpZXMgYXJlIHRoZSBiYW5lIG9mIG15IGV4aXN0ZW5jZSB3aXRoIGFsbCB0aGVzZSBkaWZmZXJlbnQgcGFja2FnZXMpLCBhbmQgbm8gcG9pbnQgaW4gcnVubmluZyBjcm9zcyB2YWxpZGF0aW9uIG9uIGEgbW9kZWwgdGhhdCB3ZSdyZSBnb2luZyB0byBkcm9wIGFueXdheSBkdWUgdG8gbGFjayBvZiBib3RoIGZpeGVkL3JhbmRvbSBlZmZlY3RzIG9mIHRpbWUuCgpgYGB7cn0KIyBpbnN0YWxsLnBhY2thZ2VzKCJzanN0YXRzIikKIyBsaWJyYXJ5KHNqc3RhdHMpCiMgZXF1aV90ZXN0KGIyKSAjIGlzIHRoZXJlIGEgZml4ZWQgZWZmZWN0PwojIHdhaWMoYjFOLCBiMikgIyBkb2VzIFdBSUMgdGhpbmsgd2Ugc2hvdWxkIGtlZXAgdGltZT8gSWYgc28sIGdpdmVuIHRoZXJlIGlzIG5vIGZpeGVkIGVmZmVjdCwgdGhpcyBpcyBkdWUgdG8gdGhlIHJhbmRvbSBlZmZlY3QgYWNjb3VudGluZyBmb3IgdmFyaWFuY2UuCgojIGIxIDwtIGFkZF9pYyhiMSwgaWM9IlIyIikKIyBiMiA8LSBhZGRfaWMoYjIsIGljPSJSMiIpIAojIG1lYW4oYjEkUjIpCiMgbWVhbihiMiRSMikgIyBkb2VzIFIyIHRoaW5rcyB3ZSBzaG91bGQga2VlcCB0aW1lPyAKCiMga2ZvbGQoYjFTTiwgYjIsIEs9MTApICMgdXNlIENWIHRvIGNoZWNrIGZvciBvdmVyLWZpdHRpbmcKIyB0aGlzIHRha2VzIHRvbyBsb25nLCBzbyByZWR1Y2Ugbihmb2xkcykgb3Igb25seSBwZXJmb3JtIGZvciBmaW5hbCBtb2RlbApgYGAKCiMjIyBGaXhlZCBlZmZlY3Qgb2Ygc3RpbXVsdXMKYGBge3J9CiMgYjMgPC0gYnJtKGJpYXNfdCB+IDEgKyBzdGltICsgKDEgfElEKSwgZGF0YT1kYXRhLCBmYW1pbHk9c2tld19ub3JtYWwoKSwgY29udHJvbD1saXN0KGFkYXB0X2RlbHRhID0gLjk1KSkKIyBzYXZlUkRTKGIzLCAibWxtX2FkYTFfYjMucmRzIikKYjMgPC0gcmVhZFJEUygibWxtX2FkYTFfYjMucmRzIikKc3VtbWFyeShiMykgCmBgYApTaW1pbGFyIHRvIHRoZSByZXN1bHRzIG9mIHRoZSBOSFNUIGFuYWx5c2lzLCB0aGVyZSBpcyBhIG5vdGFibGUgZml4ZWQgZWZmZWN0IG9mIHNwb3VzZSAoZXN0aW1hdGUgPSAwLjEyLCBlc3QuIGVycm9yID0gMC4wMywgOTUlIENJWzAuMDUsMC4xOF0pIG9uIGJpYXMsIHN1Y2ggdGhhdCBwZW9wbGUgc2hvdyBtb3JlIGFwcHJvYWNoIGJpYXMgb24gdHJpYWxzIHdoZXJlIHRoZSBzdGltdWx1cyBpcyB0aGVpciBzcG91c2UuCgpgYGB7cn0KcGxvdChiMykKbWFyZ2luYWxfZWZmZWN0cyhiMykKYGBgClRoZSBoaWdoIGRlbnNpdHkgaW50ZXJ2YWxzIGlsbHVzdHJhdGUgdGhlIHBvc2l0aXZlIGVmZmVjdCBvZiBzcG91c2Ugb24gYmlhcywgd2hpY2ggd2UgYWxzbyBzZWUgaW4gdGhlIG1hcmdpbmFsIGVmZmVjdHMgcGxvdC4gSW4gdGhlIGFuYWx5c2lzIGFib3ZlLCB0aGUgOTUlIENJIGZvciBkZWF0aCBhbmQgc3RyYW5nZXIgc3RpbXVsaSBiYXJlbHkgY3Jvc3NlZCB6ZXJvLCB3aGljaCBjb3JyZXNwb25kcyB3aXRoIHdoYXQgd2Ugc2VlIGluIHRoZSBtYXJnaW5hbCBlZmZlY3RzIHBsb3QsIHdoZXJlIHRoZSB1cHBlciBsaW1pdCBvZiB0aGUgZXJyb3IgYmFyIGlzIHZlcnkgY2xvc2UgdG8gemVybyAob3IgYmVsb3cpLiBUaGlzIGFsc28gY29ycmVzcG9uZHMgd2l0aCB0aGUgZWZmZWN0cyB3ZSBzYXcgaW4gTkhTVCwgd2hlcmUgdGhlcmUgd2VyZSBzaWduaWZpY2FudCBvciBtYXJnaW5hbGx5IHNpZ25pZmljYW50IGVmZmVjdHMgb2YgZGVhdGggYW5kIHN0cmFuZ2VyIGluIGFkZGl0aW9uIHRvIHNwb3VzZS4KCmBgYHtyfQpwcF9jaGVjayhiMywgbnNhbXBsZXM9MjApCnBwX2NoZWNrKGIzLCB0eXBlPSJlcnJvcl9oaXN0IiwgbnNhbXBsZXM9MjAsIGJpbndpZHRoPTEpICMgbG9va3MgbGlrZSB3ZSBoYXZlIGltcHJvdmVkIHRoZSByZXNpZHVhbHM7IGlmIHdlIHJlcnVuIHRoaXMgcmFuZG9tIHNhbXBsaW5nIGF0IGxlYXN0IHNvbWUgb2YgdGhlIHRpbWUgd2Ugbm8gbG9uZ2VyIHNlZSB0aGUgbG93ZXIgZW5kIG91dGxpZXJzCiMgZXF1aV90ZXN0KGIzKSAjIFRSWSBUSElTIENPREUgV0hFTiBJIEdFVCBTSlRPT0xTIFRPIElOU1RBTEwgKHdoYXQgZG9lcyBST1BFIHRlbGxzIHVzIGFib3V0IHRoZSBzaXplIG9mIGVmZmVjdD8pCiMgd2FpYyhiMiwgYjMpICMgVFJZIFRISVMgQ09ERSBXSEVOIEkgR0VUIFNKVE9PTFMgVE8gSU5TVEFMTApgYGAKCmBgYHtyfQpiMiA8LSBhZGRfaWMoYjIsIGljPSJSMiIpIApiMyA8LSBhZGRfaWMoYjMsIGljPSJSMiIpIApyb3VuZChtZWFuKGIyJFIyKSwgZGlnaXRzPTMpCnJvdW5kKG1lYW4oYjMkUjIpLCBkaWdpdHM9MykKYGBgCkluIGJvdGggbW9kZWxzLCB3ZSBoYXZlIGV4cGxhaW5lZCBhYm91dCAyIHBlcmNlbnQgb2YgdGhlIHZhcmlhbmNlICgxLjclIHZzLiAyLjAlKS4KCiMjIyBBZGRpbmcgdGhlIHN0aW11bHVzKmNvbmRpdGlvbiBpbnRlcmFjdGlvbiAobm8gdGltZSkKCk9uZSBvZiB0aGUgb3JpZ2luYWwgc3R1ZHkgaHlwb3RoZXNlcyB3YXMgdGhhdCB0aGVyZSB3b3VsZCBiZSBhbiBpbnRlcmFjdGlvbiAoYWN0dWFsbHksIGEgMy13YXkgaW50ZXJhY3Rpb24gd2l0aCBncm91cCwgYnV0IG5vdCBnb2luZyB0byBnbyB0aGVyZSBmb3IgQURBICMxOyBhbHNvIHdlIG1heSBiZSB1bmRlcnBvd2VyZWQgZm9yIHRoYXQpIGJldHdlZW4gc3RpbXVsdXMgYW5kIGNvbmRpdGlvbiwgc3VjaCB0aGF0IHBlb3BsZSBtaWdodCBkaXNwbGF5IGRpZmZlcmVudCByZXNwb25zZSBiaWFzZXMgZm9yIGRpZmZlcmVudCBzdGltdWx1cyBjYXRlZ29yaWVzIGluIGNvbmRpdGlvbiBBIHZzLiBCLCBvciB2aWNlIHZlcnNhLgoKYGBge3J9CiMgYjQgPC0gYnJtKGJpYXNfdCB+IDEgKyBzdGltKmNvbmQgKyAoMXxJRCksIGRhdGE9ZGF0YSwgZmFtaWx5PXNrZXdfbm9ybWFsKCksIGNvbnRyb2w9bGlzdChhZGFwdF9kZWx0YSA9IC45NSkpCiMgc2F2ZVJEUyhiNCwgIm1sbV9hZGExX2I0LnJkcyIpCmI0IDwtIHJlYWRSRFMoIm1sbV9hZGExX2I0LnJkcyIpCnN1bW1hcnkoYjQpIApgYGAKR290IHNvbWUgd2FybmluZ3Mgd2hpbGUgcnVubmluZzoKCmBSZWplY3RpbmcgaW5pdGlhbCB2YWx1ZTpgCiAgYEdyYWRpZW50IGV2YWx1YXRlZCBhdCB0aGUgaW5pdGlhbCB2YWx1ZSBpcyBub3QgZmluaXRlLmAKICBgU3RhbiBjYW4ndCBzdGFydCBzYW1wbGluZyBmcm9tIHRoaXMgaW5pdGlhbCB2YWx1ZS5gCmBSZWplY3RpbmcgaW5pdGlhbCB2YWx1ZTpgCiAgYExvZyBwcm9iYWJpbGl0eSBldmFsdWF0ZXMgdG8gbG9nKDApLCBpLmUuIG5lZ2F0aXZlIGluZmluaXR5LmAKICBgU3RhbiBjYW4ndCBzdGFydCBzYW1wbGluZyBmcm9tIHRoaXMgaW5pdGlhbCB2YWx1ZS5gCiAgCkFwcGFyZW50bHkgc2V0dGluZyBwcmlvcnMgbWF5IGhlbHAgd2l0aCB0aGlzLgoKSGVyZSwgd2Ugc2VlIG5vdGFibGUgZWZmZWN0cyBvZiBkZWF0aCBhbmQgc3RyYW5nZXIgc3RpbXVsaSwgYnV0IG5vdCBjb25kaXRpb24gbm9yIGl0cyBpbnRlcmFjdGlvbiB3aXRoIHN0aW11bHVzIHR5cGUuCiAgCmBgYHtyfQpwbG90KGI0KQptYXJnaW5hbF9lZmZlY3RzKGI0KSAKCnBwX2NoZWNrKGI0LCBuc2FtcGxlcz0yMCkKcHBfY2hlY2soYjQsIHR5cGU9ImVycm9yX2hpc3QiLCBuc2FtcGxlcz0yMCwgYmlud2lkdGg9MSkgIyByZXNpZHVhbHMgc2VlbSBhYm91dCB0aGUgc2FtZQojIGVxdWlfdGVzdChiNCkgCmBgYApOb3RoaW5nIHRlcnJpYmx5IG5ldyBoZXJlLCBleGNlcHQgZm9yIHRoZSBtYXJnaW5hbCBlZmZlY3RzLiBMb29raW5nIGF0IHRoZSBwbG90IGZvciBgc3RpbWAsIHRoZSBkaXN0cmlidXRpb25zIGZvciBzcG91c2UgYW5kIHN0cmFuZ2VyIGFuZCBzcG91c2UgYW5kIGRlYXRoIGRvbid0IHNlZW0gdG8gb3ZlcmxhcCwgYW5kIGxpdmluZyBsb3ZlZCBvbmUgYW5kIGRlYXRoIGp1c3QgYmFyZWx5IG92ZXJsYXAuIFVuc3VycHJpc2luZ2x5LCBwZW9wbGUgdGVuZCB0byBzaG93IG1vcmUgYXBwcm9hY2ggYmlhcyBmb3Igc3BvdXNlIGFuZCBsaXZpbmcgbG92ZWQgb25lIHBob3RvcyBjb21wYXJlZCB0byBkZWF0aCBhbmQgc3RyYW5nZXIgcGhvdG9zLiBUaGUgdGhpcmQgbWFyZ2luYWwgZWZmZWN0cyBwbG90IGlsbHVzdHJhdGVzIHRoZSBsYWNrIG9mIGNvbmRpdGlvbiBvciBzdGltdWx1cypjb25kaXRpb24gaW50ZXJhY3Rpb24gZWZmZWN0cy4KYGBge3J9CmI0IDwtIGFkZF9pYyhiNCwgaWM9IlIyIikgCnJvdW5kKG1lYW4oYjMkUjIpLCBkaWdpdHM9MykKcm91bmQobWVhbihiNCRSMiksIGRpZ2l0cz0zKQpgYGAKVGhlIHZhcmlhbmNlIGFjY291bnRlZCBmb3Igc2hvd3MgYSBuZWdsaWdhYmxlIGluY3JlYXNlIHdpdGggdGhlIHN0aW11bHVzKmNvbmRpdGlvbiBpbnRlcmFjdGlvbiBpbiB0aGUgbW9kZWwgKGdvZXMgZnJvbSAwLjAyMCB0byAwLjAyMikuIFRoZSBuZWdsaWdhYmxlIGVmZmVjdCBpcyBzaG93biBpbiB0aGUgcGxvdCAtIG5vdGUgbm8gcmVhbCBkaWZmZXJlbmNlcwoKIyMjIFVzaW5nIHByaW9ycwpgYGB7cn0KIyBGaXJzdCBmaW5kIG91dCB3aGF0IGRlZmF1bHQgcHJpb3JzIGFyZS4gCmRhdGEgPC0gZmlsdGVyKG1sbV9ieDUsICFncmVwbCgiRDEwMXxEMTQxfEQxNDd8RDE0OCIsSUQpKQpnZXRfcHJpb3IoYmlhc190IH4gMSArIHN0aW0qY29uZCArICgxfElEKSwgZGF0YT1kYXRhLCBmYW1pbHk9c2tld19ub3JtYWwoKSkKYGBgCmBicm1zYCBoYXMgc2V0IHNvbWUgd2Vha2x5IGluZm9ybWF0aXZlIGRlZmF1bHQgcHJpb3JzIG9uIHNvbWUgb2YgdGhlIHNwZWNpYWwgcGFyYW1ldGVycy4gVGhlIGRlZmF1bHQgZm9yIHRoZSByYW5kb20gY29lZmZpY2llbnRzIGlzIGEgaGFsZiBzdHVkZW50LXQgd2l0aCAzIGRlZ3JlZXMgb2YgZnJlZWRvbS4KCkxldCdzIGFzc3VtZSBzb21lIHdlYWsgcHJpb3Iga25vd2xlZGdlIGZyb20gcHJldmlvdXMgcmVzZWFyY2guIEl0IHdvdWxkIGFjdHVhbGx5IGJlIHNvbWV3aGF0IGRpZmZpY3VsdCB0byBnZXQgc29saWQgcHJpb3JzIGZyb20gcHJldmlvdXMgcmVzZWFyY2ggb24gdGhpcyB0YXNrLCBnaXZlbiB0aGF0IG5vIHByZXZpb3VzIHdvcmsgaGFzIHVzZWQgdGhpcyBzcGVjaWZpYyB2YXJpYW50IGluIHRoaXMgcG9wdWxhdGlvbiB3aXRoIHRoaXMgc3BlY2lmaWMgbWFuaXB1bGF0aW9uIChpLmUuLCBveHl0b2NpbiB2cy4gcGxhY2Vibykgc28gSSdtIG1ha2luZyB0aGVzZSBudW1iZXJzIHVwLgpgYGB7cn0KIyBMZXQncyBhc3N1bWUgcHJpb3Igc3R1ZGllcyBoYXZlIGZvdW5kIHRoZSBmb2xsb3dpbmcgc2xvcGUgZXN0aW1hdGVzOgojIHN0aW11bHVzIH4gLjAzICguMDEpCiMgY29uZGl0aW9uIH4gLS4wMyAoLjAxKQoKIyBmb3Igd2Vhaywgd2UgdXNlIG5vcm1hbHMgd2l0aCBtZWFucyBmcm9tIHByaW9yIHdvcmsgYW5kIFNEcyBjaG9zZW4gdG8gY3JlYXRlIGEgd2VhayBwZWFrIChJIGdvdCB0aGVzZSBieSBwbGF5aW5nIHdpdGggdmlzdWFsaXphdGlvbnMgLSB0aGV5IGFsbCBhcmUgc2ltaWxhciBnaXZlbiB0aGUgZXN0aW1hdGVzIGZyb20gcHJpb3Igd29yayAtIGUuZy4sIGFsbCBlZmZlY3RzIHdlcmUgc21hbGxlciB0aGFuIG9uZSB3aXRoIFNEcyBjaXJjYSAuMDEtLjE1KQoKIyB2aXN1YWxpemluZyB0byBnZXQgYXBwcm9wcmlhdGUgd2VhayBhbmQgc3Ryb25nIFNEcwp4IDwtIHNlcSgtMSwgMSwgLjEpICMgY3JlYXRlIHNlcXVlbmNlIGZvciB4LWF4aXMgCnBsb3QoeCwgZG5vcm0oeCwgbWVhbj0gLjIwLCBzZD0uNyksIHR5cGU9ImwiLCB5bGltPWMoMCwxKSkgCgpwV2VhayA8LSBjKHNldF9wcmlvcigibm9ybWFsKC4wMywgLjcpIiwgY2xhc3M9ImIiLCBjb2VmPSJzdGltIiksCgkJCXNldF9wcmlvcigibm9ybWFsKC0uMDMsIC43KSIsIGNsYXNzPSJiIiwgY29lZj0iY29uZCIpKQoKIyBiNSA8LSBicm0oYmlhc190IH4gMSArIHN0aW0qY29uZCArICgxfElEKSwgZGF0YT1kYXRhLCBmYW1pbHk9c2tld19ub3JtYWwoKSwgcHJpb3IgPSBwV2VhaywgY29udHJvbD1saXN0KGFkYXB0X2RlbHRhID0gLjk1KSkKIyBzYXZlUkRTKGI1LCAibWxtX2FkYTFfYjUucmRzIikKIyBiNSA8LSByZWFkUkRTKCJtbG1fYWRhMV9iNS5yZHMiKQojc3VtbWFyeShiNSkKI3Bsb3QoYjUpCiNtYXJnaW5hbF9lZmZlY3RzKGI1KQpgYGAKQmFzZWQgb24gdGhlIGVycm9yIG1lc3NhZ2UgaGVyZSAoPGZvbnQgY29sb3I9InJlZCI+VGhlIGZvbGxvd2luZyBwcmlvcnMgZG8gbm90IGNvcnJlc3BvbmQgdG8gYW55IG1vZGVsIHBhcmFtZXRlci4uLjwvZm9udD4pLCBJIGNsZWFybHkgaGF2ZSBubyBpZGVhIHdoYXQgSSdtIGRvaW5nIGFuZCBuZWVkIHRvIGdvIGJhY2sgdG8gdGhhdCBsZXNzb24gKGBnZXRfcHJpb3JgIHdhcyBub3QgaGVscGZ1bCB0byBtZSwgYnV0IHRoYW5rcyBhbnl3YXksIGJybXMpLg==