Notes

Methods and materials

Radiocarbon corrections

Although differences were small, radiocarbon data for archived samples were first corrected for decay since the year of collection before assessing treatment effects.

Decay correction formula: \[1000 \cdot \left( (FM \cdot e^{\frac{-year_{sampled} + 1950}{8267}}) - 1 \right)\]

where FM is the fraction modern, and 8267 is the inverse of the product of the natural log of two and the true half life of 14C (5730 y).

Results

Respiration rates

note that the text below was left because statistics were calculated on the fly

Experiment 1 (air-dry + storage treatment)

Among the air-dry + storage samples, respiration rates were more than twice as high in grassland soils than in forest soils, reaching a maximum of 3.8 mg CO2 g soil C-1 d-1 after 92 h, followed by a sharp decline. Mean respiration rates in forest sites peaked at 1.5 mg CO2 g soil C-1 d-1 after 166 h, followed by a much more gradual decline than in grassland sites. Control samples responded more weakly and more gradually to rewetting, although as in the treatment samples respiration was greater in grassland soils than in forest soils. Peak respiration rates for control incubations were 1.9 and 0.6 mg CO2 g soil C-1 d-1 after 115 h for grassland and forest soils, respectively.

Experiment 2 (air-dry treatment, 2019 samples)

Peak respiration rates were not significantly different (p > 0.05) between forest and grassland soils in Experiment 2, peaking at 3.0 and 3.3 mg CO2 g soil C-1 d-1 after 95 h for grassland and forest soils, respectively (Fig. 1).

Fig. 1. Respiration rates for Experiment 1 (air-dry + storage treatment, 2011) and Experiment 2 (air-dry only treatment, 2019)

Caption: Top panel shows data from samples collected in 2011 for Experiment 1 (air-dry + storage treatment), bottom panel shows data from samples collected in 2019 for Experiment 2 (air-dry only treatment). Vertical gray line at day 4 demarcates the end of the pre-incubation period and the start of the equilibrium respiration period. Points show measurements and lines show trends in mean respiration rate. Shaded ribbons represent one standard error. The final measurement points for a few samples which took >18 days to reach CO2 targets are excluded for display reasons; respiration rates for those samples remained flat. Note that headspace CO2 concentrations for Experiment 1 control samples were only measured once during the pre-incubation period (day 4) in contrast to daily measurements for all other samples. Consequently the respiration rate for those samples is the cumulative average rate over the first 4 d.

Supplemental respiration rates figures:

Experiment 3 (storage duration)

Grassland soils from the storage duration treatment group responded rapidly to rewetting and reached target CO2 levels after just 72 h of incubation. Only a single observation was made for the grassland treament samples due to the rapid respiration rates, which peaked at 5.6 mg CO2 g soil C-1 d-1. The mean peak respiration rate for forest treatment samples was lower and lagged in comparison to the grassland soils, reaching 2.2 mg CO2 g soil C-1 d-1 after 97 h.

Control-3 respiration rates peaked after the pre-incubation period (115 h), at 2.3 mg CO2 g soil C-1 d-1. Forest control samples were pre-incubated under various conditions, but respiration rates were only measured during the pre-incubation period for two samples from the Sierra Nevada mountains (USA). In general, respiration rates for forest control samples in Experiment 3 were much lower than in the treatment incubations, peaking at 0.6 mg CO2 g soil C-1 d-1 after 120 h.

Supplemental Fig 1. Respiration rates for Experiment 3

Caption: Experiment 3 storage duration treatment samples were only incubated for a single enclosure period, as the results of Experiment 1 and Experiment 2 showed no significant difference in \(\Delta\)14C-CO2 between the rewetting pulse CO2 released during the pre-incubation period and the CO2 respired during the equilibrium respiration period. The grassland storage duration treatment samples (blue dashed line) respired an equivalent amount of CO2 in just 3 d as the corresponding control-3 samples respired during the pre-incubation period and the equilibrium respiration period combined. Consequently those incubations were stopped after the first CO2 measurement point. Control-3 samples did undergo pre-incubation, but as the CO2 release was not measured nor was \(\Delta\)14C-CO2 for the majority of the samples, all data were averaged by day of measurement.

Preincubation headspace CO2 concentations were only measured once for the control-1 samples, at the end of the four=day preincubation period. In order to compare the control-1 respiration rates more easily with the air-dry + storage treatment samples, Supplemental Figure 2 shows the air-dry + storage pre-incubation respiration rates plotted as a cumulative average for the preincubation period. However, as can be seen in Figure 1, headspace CO2 concentration was measured daily for the air-dry + storage samples.

Supplemental Fig 2. Respiration rates for Experiment 1 and Experiment 2 shown with all pre-incubation data calculated as cumulative averages

Caption: CO2 concentrations for Experiment 1 control samples were only measured once during the pre-incubation period, in contrast to daily measurements for all other samples. Pre-incubation respiration rates are shown here calculated as cumulative averages for the purpose of fair comparison across all treatments.

Radiocarbon data

Pre-incubation versus equilibrium respiration 14C-CO2

Fig. 2. \(\Delta\)14C-CO2 of the rewetting pulse and the equilibrium respiration period

Caption: Points are means of laboratory duplicates and error bars are the min and max (except for Experiment 1 control samples, which were not replicated). Note that rewetting pulse \(\Delta\)14C was not measured for control-1 samples; additionally samples from three of the forest plots of the air-dry + storage samples from Experiment 1 failed to accumulate enough CO2 during the pre-incubation period to measure \(\Delta\)14C. The outlier point with the substantially depleted pre-incubation \(\Delta\)14C is from Experiment 2 (control).

Treatment effects on observed equilibrium period 14C-CO2

Treatment effect on \(\Delta\)14C-CO2 for all samples (Experiments 1, 2, and 3)

Fig. 3. Overall treatment effect on \(\Delta\)14C-CO2

Caption: Points show data from Experiments 1 and 3 (air-dry + storage treatment) and Experiment 2 (air-dry only treatment). Points are the mean of laboratory replicates (for replicated samples); error bars are 2x standard error. Solid line is 1:1. For context, the dashed and dotted lines show differences of ±20‰ and ±$40‰, equivalent to the decline in \(\Delta\)14C in atmospheric CO2 over 4 and 8 y respectively, during the period of 2000 to 2020 (Graven et al. 2017).

Storage duration effect on 14C-CO2 (Experiment 3)

Fig. 4. Change in 14C-CO2 in relation to storage duration

Caption: Data are from both Experiment 1 (in black) and Experiment 3 (all other points), averaged by site and ecosystem type. Points are the mean, error bars are 2x standard error. For context, the dashed and dotted lines are the same is in Fig. 4 and show a difference of 20‰ and 40‰, equivalent to the decline in \(\Delta\)14C in atmospheric CO2 over 4 and 8 y respectively, during the period of 2000 to 2020 (Graven et al. 2017). Position of points jittered to avoid overplotting; storage duration has been rounded down to the nearest whole year.

Fig 5. Time series of control and treatment \(\Delta\)14C-CO2 (Experiments 1 and 2)

Caption: Filled circles show \(\Delta\)14C-CO2 observed for both control-1 and control-2 samples (2011 and 2019 points, respectively). Open symbols show \(\Delta\)14C-CO2 observed for treament samples: open squares = air-dry + storage treatment, Experiment 1; open circles = air-dry only treatment, Experiment 2. Arrows show the direction of change in \(\Delta\)14C-CO2 relative to the controls. Points are means and error bars show 2x standard error. The gray line shows \(\Delta\)14C of the atmosphere.

The absolute mean difference in 14C-CO2 between control and treatment samples was greater in grassland samples (21.4‰) than in forest samples (12.1‰) for both Experiment 1 and Experiment 2.

\(\delta\)13C

Supplemental Fig 3. Time series of control and treatment \(\delta\)13C-CO2 (Experiments 1 and 2)

Caption: Filled circles show \(\delta\)13C-CO2 observed for control samples, while open symbols show \(\delta\)13C-CO2 observed for treament samples (open squares = air-dry + storage treatment, Experiment 1, 2011; open circles = air-dry only treatment, Experiment 2, 2019). Points are means and error bars show 2x standard error.

Effect of cumulative respired carbon on 14C-CO2

We looked at the possible effect of the difference in the amount of carbon respired (mg CO2-C g soil C-1) on the differences between control and treatment 14C-CO2 using a linear regression model, but it was not significant overall. When data from Experiment 1 and Experiment 2 were considered separately, we observed a slight positive trend between the difference in respired carbon and the difference in 14C-CO2 within Experiment 2, but it was only marginally significant (p = 0.063).

Supplementary Fig. 4. Change in 14C-CO2 in relation to cumulative soil carbon respired

Caption: Note that pre-incubation \(\Delta\)14C was not measured for the control-1 samples in 2011. Limits exclude outlier point (HEW22 control-2, pre-incubation) for improved legibility. Points are means, error bars show min and max of duplicate samples.

Discussion

Fig 6a. Modeled trajectories of \(\Delta\)14C over time for a hypothetical 2-pool soil carbon model in relationship to observed atmospheric \(\Delta\)14C

Caption: Modeled curves derived from a hypothetical two-pool parallel model system in which inputs are partitioned between a fast cycling soil carbon pool (k = 1/6) and a more slowly cycling pool (k = 1/100) without any tranfers between the pools. Carbon stocks and pool sizes are based on density fraction data for the Hainich-Dün forest site (Schrumpf et al. 2013); decomposition rates are chosen to be realistic but are arbitrary. Atmospheric \(\Delta\)14C data up to the year 2015 are from Graven et al. (2017), while data points beyond 2015 use the extrapolation method from Sierra (2018). All atmospheric radiocarbon data is for the northern hemisphere (zone 2).

Fig 6b. Potential shifts in \(\Delta\)14C of respired CO2 in response to treatment

Caption: Blue and magenta lines show modeled trajectories of \(\Delta\)14C in fast and slow cycling soil carbon pools (same model as Fig 6a), while \(\Delta\)14C of respired CO2 is shown in yellow. Filled circles show hypothetical observations of \(\Delta\)14C-CO2 from control incubations, while the open symbols represent two possible scenarios in which an air-drying and rewetting treatment leads to a shift in \(\Delta\)14C-CO2. In the first scenario (open squares), an increased contribution from the slow pool shifts \(\Delta\)14C-CO2 toward the slow pool curve (blue line), while in the second scenario (open circles), an increased contribution from the fast pool shifts \(\Delta\)14C-CO2 toward the fast pool curve (magenta line). Due to the crossing of the slow and fast pool curves in 2009, an increased contribution of the slow pool to respiration following treatment leads to relative depletion of \(\Delta\)14C-CO2 in 1991, but relative enrichment of \(\Delta\)14C-CO2 in 2019, while the opposite is observed for the increased fast pool contribution scenario.

Change in soil moisture content with moisture adjustment

Supplemental Fig 5. Change in \(\Delta\)14C-CO2 (control - treatment) relative to field moisture

Caption: Data are from Experiment 1 (“arc”) and Experiment 2 (“rewet”). All samples were moisture-adjusted prior to incubation, but control samples were adjusted from field moisture, “whcFresh” (percent of WHC), whereas treatment samples were moisture adjusted after air-drying, i.e. at approximately 0% of WHC.

LS0tCnRpdGxlOiAiQXJjaGl2ZWQgU29pbCBJbmN1YmF0aW9ucyBNYW51c2NyaXB0IEZpZ3VyZXMiCmF1dGhvcjogIkouIEJlZW0tTWlsbGVyIgpkYXRlOiAiMDggT2N0IDIwMjAiCm91dHB1dDoKICBodG1sX2RvY3VtZW50OgogICAgZGZfcHJpbnQ6IHBhZ2VkCiAgICB0b2M6IHllcwogICAgdG9jX2RlcHRoOiAnMicKICBodG1sX25vdGVib29rOgogICAgY3NzOiAiY3VzdG9tLmNzcyIKICAgIHRvYzogeWVzCiAgICB0b2NfZGVwdGg6IDIKICBwZGZfZG9jdW1lbnQ6CiAgICBsYXRleF9lbmdpbmU6IHhlbGF0ZXgKaGVhZGVyX2luY2x1ZGVzOgotIFx1c2VwYWNrYWdlW3V0Zjhde2lucHV0ZW5jfQotIFx1c2VwYWNrYWdle2Zsb2F0fQotLS0KYGBge3IgZ2xvYmFsX29wdGlvbnMsIGluY2x1ZGUgPSBGQUxTRX0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KGVjaG8gPSBGQUxTRSwgd2FybmluZyA9IEZBTFNFLCBtZXNzYWdlID0gRkFMU0UsCiAgICAgICAgICAgICAgICAgICAgICBmaWcuYWxpZ24gPSAnY2VudGVyJywgZGV2ID0gYygnY2Fpcm9fcGRmJywgJ3BuZycpLCBmaWcud2lkdGggPSA2LjUpCmBgYAoKYGBge3Igc2V0dXAsIGluY2x1ZGUgPSBGQUxTRX0KbGlicmFyeShnZ3Bsb3QyKQpsaWJyYXJ5KGRwbHlyKQpsaWJyYXJ5KHRpZHlyKQpsaWJyYXJ5KFNvaWxSKQpsaWJyYXJ5KGNvcnJwbG90KQpsaWJyYXJ5KG9wZW54bHN4KQpsaWJyYXJ5KElTUmFEKQpgYGAKIyMgTm90ZXMKKiBUaGlzIHdvcmtib29rIGlzIGludGVuZGVkIHRvIGxvYWQgYW5kIHByZXBhcmUgdGhlIGtleSBkYXRhIGZvciBhbmFseXNpcyBmb3IgdGhlIGFyY2hpdmUgaW5jdWJhdGlvbiBwcm9qZWN0LgoqIFRoaXMgaXMgYW4gdXBkYXRlZCB2ZXJzaW9uIG9mIFJNRCBmaWxlICIuL3NyYy9hcmNfaW5jX2RhdGEtd3JhbmdsaW5nXzIwMjAtMDQtMjAuUm1kIiB3aXRoIHRoZSBleHBsYW5hdG9yeSB0ZXh0IHJlbW92ZWQKKiBhbGwgY29kZSBjaHVuayBvcHRpb25zIGFyZSBzZXQgdG8gImVjaG8gPSBGQUxTRSI7IHNlZSByYXcgLlJtZCBmaWxlIGZvciBkYXRhIHdyYW5nbGluZyBjb2RlLgoKIyBNZXRob2RzIGFuZCBtYXRlcmlhbHMKCipSYWRpb2NhcmJvbiBjb3JyZWN0aW9ucyoKCkFsdGhvdWdoIGRpZmZlcmVuY2VzIHdlcmUgc21hbGwsIHJhZGlvY2FyYm9uIGRhdGEgZm9yIGFyY2hpdmVkIHNhbXBsZXMgd2VyZSBmaXJzdCBjb3JyZWN0ZWQgZm9yIGRlY2F5IHNpbmNlIHRoZSB5ZWFyIG9mIGNvbGxlY3Rpb24gYmVmb3JlIGFzc2Vzc2luZyB0cmVhdG1lbnQgZWZmZWN0cy4KCkRlY2F5IGNvcnJlY3Rpb24gZm9ybXVsYToKJCQxMDAwIFxjZG90IFxsZWZ0KCAoRk0gXGNkb3QgZV57XGZyYWN7LXllYXJfe3NhbXBsZWR9ICsgMTk1MH17ODI2N319KSAtIDEgXHJpZ2h0KSQkCgp3aGVyZSBGTSBpcyB0aGUgZnJhY3Rpb24gbW9kZXJuLCBhbmQgODI2NyBpcyB0aGUgaW52ZXJzZSBvZiB0aGUgcHJvZHVjdCBvZiB0aGUgbmF0dXJhbCBsb2cgb2YgdHdvIGFuZCB0aGUgdHJ1ZSBoYWxmIGxpZmUgb2YgXjE0XkMgKDU3MzAgeSkuCgpgYGB7ciAxNEMgaGVscGVyIGZ4c30KIyA1LiBDcmVhdGUgaGVscGVyIGZ1bmN0aW9ucwojIGRlY2F5IGNvcnJlY3Rpb24gZnVuY3Rpb24gIApkZWNheS5jb3JyLmZ4IDwtIGZ1bmN0aW9uKHllYXJfc2FtcGxlZCwgZnJhY3Rpb25fbW9kZXJuKSB7CiAgaWZlbHNlKGlzLm5hKGZyYWN0aW9uX21vZGVybiksIE5BLCAxMDAwKigoZnJhY3Rpb25fbW9kZXJuKmV4cCgoLXllYXJfc2FtcGxlZCArIDE5NTApLzgyNjcpKS0xKSkKfQoKIyBkMTRDIHRvIGZyYWN0aW9uIG1vZGVybiBmdW5jdGlvbgpkMTRjLmZtLmZ4IDwtIGZ1bmN0aW9uKHllYXJfc2FtcGxlZCwgZDE0YykgewogICgoZDE0YyAvIDEwMDApICsgMSkgLyBleHAoMC4wMDAxMjA5NyAqICgxOTUwIC0geWVhcl9zYW1wbGVkKSkKICB9CgojIGRlZmluZSBoZWxwZXIgZnVuY3Rpb24gZm9yIHN0cmlwcGluZyBvdXQgIk5BIiBhbmQgbm9uLUV4cGxvcmF0b3JpZXMgZGF0YQpleHRyYS5jbGVhbi5meCA8LSBmdW5jdGlvbihkZikgewogIGRmIDwtIGRmW3doaWNoKGdyZXBsKCJIRUciLCBkZiRQcm9iZSkgfAogICAgICAgICAgICAgICAgICAgZ3JlcGwoIkhFVyIsIGRmJFByb2JlKSB8CiAgICAgICAgICAgICAgICAgICBncmVwbCgiU0VHIiwgZGYkUHJvYmUpIHwKICAgICAgICAgICAgICAgICAgIGdyZXBsKCJTRVciLCBkZiRQcm9iZSkpLCBdCiAgaWYobGVuZ3RoKGdyZXAoIkV4cGVyaW1lbnQiLCBuYW1lcyhkZikpKSA+IDApIHsKICAgICBkZiA8LSBkZlt3aGljaChkZiRFeHBlcmltZW50ICE9ICJ0bWUiKSwgXSAKICB9CiAgaXggPC0gd2hpY2goaXMubmEoZGYkRjE0QykgJiBpcy5uYShkZiRgWC4xNEMuLi4uYCkpCiAgaWYobGVuZ3RoKGl4KSA+IDEpIHsKICAgIGRmIDwtIGRmWy1peCwgXQogIH0KICByZXR1cm4oZGYpCn0KCiMgZXh0cmFjdCBzdG9yYWdlIGR1cmF0aW9uIGRhdGEgc2VwYXJhdGVseQp0bWUuMTRjLmZ4IDwtIGZ1bmN0aW9uKGRmKSB7CiAgZGYkU2FtcGxlTmFtZSA8LSBkZiRQcm9iZQogIGRmJFBlcmlvZCA8LSAiaW5jIgogIGlmKGxlbmd0aChncmVwKCJFeHBlcmltZW50IiwgbmFtZXMoZGYpKSkgPiAwKSB7CiAgICAgZGYgPC0gZGZbd2hpY2goZGYkRXhwZXJpbWVudCA9PSAidG1lIiksIF0gCiAgfQogIHJldHVybihkZikKfQpgYGAKCgpgYGB7ciByZWFkIHdpZGUgdHMgZGF0YX0KIyAxLiBMb2FkIGZsdXggZGF0YSBmcm9tIGFpci1kcnkgKyBzdG9yYWdlIChleHBlcmltZW50IDEpIGFuZCBzdG9yYWdlIGR1cmF0aW9uIChleHBlcmltZW50IDMpIGNvbnRyb2wgc2FtcGxlcywgYW5kIGNvbnZlcnQgZnJvbSAid2lkZSIgdG8gImxvbmciIGZvcm1hdCBzbyBhcyB0byBtYXRjaCBvdGhlciBkYXRhLiAKIyBSZWFkIGFpci1kcnkgKyBzdG9yYWdlIHJlc3BpcmF0aW9uIGNvbnRyb2wgZGF0YQphcmNoaXZlLmN0bC50cy53aWRlIDwtIHJlYWQuY3N2KCIuLi9kYXRhL2Rlcml2ZWQvYXJjLXN0b3JhZ2UtdDEtZmx1eC9hcmMtaW5jX3hwbHJfYXJjLXN0b3JhZ2UtdDEtZmx1eF8yMDIwLTA3LTAzLmNzdiIpCgojIENvbnZlcnQgdGltZSBkYXRhIGZyb20gd2lkZSB0byBsb25nCmFyY2hpdmUuY3RsLnRzLmQgPC0gc2VsZWN0KGFyY2hpdmUuY3RsLnRzLndpZGUsIHN0YXJ0c193aXRoKCJpbmNfdGltZV9kIikpICU+JQogIHBpdm90X2xvbmdlcihldmVyeXRoaW5nKCksCiAgICAgICAgICAgICAgIG5hbWVzX3RvID0gInRpbWVwb2ludF9jbXR2IiwKICAgICAgICAgICAgICAgbmFtZXNfcHJlZml4ID0gImluY190aW1lX2RfIiwKICAgICAgICAgICAgICAgdmFsdWVzX3RvID0gInRpbWVfZCIpCiMgc29ydCBieSB0aW1lcG9pbnRfY210dgphcmNoaXZlLmN0bC50cy5kIDwtIGRhdGEuZnJhbWUoYXJjaGl2ZS5jdGwudHMuZFtvcmRlcihhcmNoaXZlLmN0bC50cy5kJHRpbWVwb2ludF9jbXR2KSxdKQoKIyBDb252ZXJ0IG1nQ08yIGRhdGEgZnJvbSB3aWRlIHRvIGxvbmcKYXJjaGl2ZS5jdGwudHMuY28yIDwtIHNlbGVjdChhcmNoaXZlLmN0bC50cy53aWRlLCBzdGFydHNfd2l0aCgiaW5jX21nQ08yX2phcl8iKSkgJT4lCiAgcGl2b3RfbG9uZ2VyKGV2ZXJ5dGhpbmcoKSwKICAgICAgICAgICAgICAgbmFtZXNfdG8gPSAidGltZXBvaW50X2NtdHYiLAogICAgICAgICAgICAgICBuYW1lc19wcmVmaXggPSAiaW5jX21nQ08yX2phcl8iLAogICAgICAgICAgICAgICB2YWx1ZXNfdG8gPSAibWdDTzJfamFyIikKIyBzb3J0IGJ5IHRpbWVwb2ludF9jbXR2CmFyY2hpdmUuY3RsLnRzLmNvMiA8LSBhcmNoaXZlLmN0bC50cy5jbzJbb3JkZXIoYXJjaGl2ZS5jdGwudHMuY28yJHRpbWVwb2ludF9jbXR2KSxdCgojIGFzc2VtYmxlIGluIGxvbmcgZGF0YWZyYW1lIAphcmNoaXZlLmN0bC50cyA8LSBkYXRhLmZyYW1lKElEID0gcmVwKHVuaXF1ZShhcmNoaXZlLmN0bC50cy53aWRlJElEKSwgNCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGVyaW9kID0gImluYyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZXBvaW50X2NtdHYgPSByZXAoc2VxKGZyb20gPSAyLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gPSA1KSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWFjaCA9IGxlbmd0aChhcmNoaXZlLmN0bC50cy53aWRlJElEKSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZV9kID0gYXJjaGl2ZS5jdGwudHMuZCR0aW1lX2QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWdDTzJfamFyID0gYXJjaGl2ZS5jdGwudHMuY28yJG1nQ08yX2phcikKCiMgYWRkIHByZWluY3ViYXRpb24gZGF0YQphcmNoaXZlLmN0bC50cy5wcmUgPC0gYXJjaGl2ZS5jdGwudHMud2lkZVsxOmxlbmd0aCh1bmlxdWUoYXJjaGl2ZS5jdGwudHMud2lkZSRJRCkpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjKCJJRCIsICJwcmVpbmNfdGltZV9kIiwgInByZWluY19tZ0NPMl9qYXIiKV0KYXJjaGl2ZS5jdGwudHMucHJlIDwtIHJlbmFtZShhcmNoaXZlLmN0bC50cy5wcmUsIHRpbWVfZCA9IHByZWluY190aW1lX2QsIG1nQ08yX2phciA9IHByZWluY19tZ0NPMl9qYXIpCmFyY2hpdmUuY3RsLnRzLnByZSR0aW1lcG9pbnRfY210diA8LSAxCmFyY2hpdmUuY3RsLnRzLnByZSRQZXJpb2QgPC0gInByZSIKYXJjaGl2ZS5jdGwudHMucHJlJHRpbWVfZF9jbXR2IDwtIGFyY2hpdmUuY3RsLnRzLnByZSR0aW1lX2QKICAKIyBDYWxjdWxhdGUgdGltZV9kX2NtdHYKYXJjaGl2ZS5jdGwudHMgPC0gYmluZF9yb3dzKAogIGxhcHBseSgKICAgIHNwbGl0KGFyY2hpdmUuY3RsLnRzLCBhcmNoaXZlLmN0bC50cyR0aW1lcG9pbnRfY210diksCiAgICBmdW5jdGlvbih4KSB7CiAgICAgIHgkdGltZV9kX2NtdHYgPC0geCR0aW1lX2QgKyAKICAgICAgICBhcmNoaXZlLmN0bC50cy5wcmVbbWF0Y2goeCRJRCwgYXJjaGl2ZS5jdGwudHMucHJlJElEKSwgInRpbWVfZCJdCiAgICAgIHJldHVybih4KQogICAgfQogICAgKQogICkKCiMgcmJpbmQgcHJlaW5jIGFuZCBpbmMgZGF0YQphcmNoaXZlLmN0bC50cyA8LSByYmluZChhcmNoaXZlLmN0bC50cy5wcmUsIGFyY2hpdmUuY3RsLnRzKQoKIyBhZGQgU2FtcGxlTmFtZSBjb2x1bW4gYW5kIHJlc3RvcmUgRXhwZXJpbWVudCBjb2x1bW4KYXJjaGl2ZS5jdGwudHMkU2FtcGxlTmFtZSA8LSBhcmNoaXZlLmN0bC50cyRJRAphcmNoaXZlLmN0bC50cyRFeHBlcmltZW50IDwtIGFyY2hpdmUuY3RsLnRzLndpZGVbbWF0Y2goYXJjaGl2ZS5jdGwudHMkSUQsIGFyY2hpdmUuY3RsLnRzLndpZGUkSUQpLCAiRXhwZXJpbWVudCJdCgojIHJlbW92ZSBpbnRlcm1lZGlhdGUgZmlsZXMKcm0oYXJjaGl2ZS5jdGwudHMuZCwgYXJjaGl2ZS5jdGwudHMuY28yLCBhcmNoaXZlLmN0bC50cy5wcmUpCmBgYAoKYGBge3IgcmVhZC1sb25nLXRzLWRhdGF9CiMgMi4gTG9hZCBmbHV4IGRhdGEgZnJvbSBhaXItZHJ5ICsgc3RvcmFnZSBzYW1wbGVzIGFuZCBmcm9tIGFpci1kcnkgZXhwZXJpbWVudCAoY3RsICYgdHJlYXRtZW50KSwgQyAmIE4gZGF0YSBmb3IgYWxsIHRoZSBFeHBsb3JhdG9yaWVzIHNhbXBsZXMgKG1lYXN1cmVkIGluIDIwMTEpLCBhbmQgc29pbCBtYXNzIGFuZCBtb2lzdHVyZSBkYXRhIGZvciBhbGwgZXhwZXJpbWVudHMuCiMgUmVhZCBYcGxyIEMgYW5kIE4gZGF0YQp4cGxyLmNuIDwtIHJlYWQuY3N2KCIuLi9kYXRhL2V4dGVybmFsL2V4cGxvcmF0b3JpZXNfaXNjaG9lbmluZ19zb2lsY25fMjAxMS8xNzA0MDdfQ05fY29uY2VudHJhdGlvbnNfRXhwbG9yYXRvcmllc19FUF9QbG90c18yMDExLmNzdiIpCgojIFJlYWQgWHBsciAxNEMgZGF0YSBmb3IgY29udHJvbCBzYW1wbGVzICgidG1lIiBhbmQgImFyYyIgRXhwZXJpbWVudHMpCnhwbHIuY3RsLmlzbyA8LSByZWFkLnhsc3goIi4uL2RhdGEvZXh0ZXJuYWwvZXhwbG9yYXRvcmllc19pc2Nob2VuaW5nXzE0Yy1jbzJfMjAxMS8xNzAyMjhfMTRDX1Jlc3BpcmF0aW9uLnhsc3giKQoKIyBSZWFkIHNvaWwgbWFzcyBhbmQgbW9pc3R1cmUgaW5mbyBmb3IgYWlyLWRyeSArIHN0b3JhZ2UgdHJlYXRtZW50IHNhbXBsZXMKamFyaW5mby5hcmMgPC0gcmVhZC5jc3YoIi4uL2RhdGEvZGVyaXZlZC9hcmMtc3RvcmFnZS10Mi1qYXJJbmZvL2phcl9pbmZvcm1hdGlvbi5jc3YiKQoKIyBSZWFkIHNvaWwgbWFzcyBhbmQgbW9pc3R1cmUgaW5mbyBmb3IgYWlyLWRyeSBkYXRhCmphcmluZm8ucmV3ZXQgPC0gcmVhZC5jc3YoIi4uL2RhdGEvZGVyaXZlZC9haXItZHJ5LTIwMTktd2hjL2Fpci1kcnktMjAxOS13aGNfMjAyMC0wNy0wMy5jc3YiKQoKIyBSZWFkIHNvaWwgbWFzcyBhbmQgbW9pc3R1cmUgaW5mbyBmb3Igc3RvcmFnZSBkdXJhdGlvbiB0cmVhdG1lbnQgc2FtcGxlcwojIHJlbW92ZSB1bml0IHJvdyBhbmQgY29udmVydCB0byBhcHByb3ByaWF0ZSB0eXBlcwpqYXJpbmZvLnRtZSA8LSB0eXBlLmNvbnZlcnQocmVhZC54bHN4KCIuLi9kYXRhL3Jhdy9sYWJfamVuYV9yZXN1bHRzLWNvMl8yMDE4LTA3LTMwL0FyY0luY19JbmNEYXRhXzIwMTgueGxzeCIsIHNoZWV0ID0gMSlbLTEsIF0pCgojIFJlYWQgRHVrZSBpc28gYW5kIGZsdXggZGF0YQp0bWUuY3RsLmR1ayA8LSByZWFkLmNzdigiLi4vZGF0YS9kZXJpdmVkL2FyYy10bWUtZHVrZS9hcmMtdG1lLWR1a2VfMjAyMC0wNC0yOS5jc3YiKQoKIyBSZWFkIFNpZXJyYSBOZXZhZGEgKEp1bidzKSBzb2lsIGRhdGEKdG1lLmN0bC5zb2lsLnNyYSA8LSByZWFkLmNzdigiLi4vZGF0YS9kZXJpdmVkL2FyYy10bWUtc2llcnJhL2FyYy10bWUtc2llcnJhLXNvaWxfMjAyMC0wNC0yOS5jc3YiKQoKIyBSZWFkIE9hayBSaWRnZSBDIGRhdGEKdG1lLmN0bC5vcm5sIDwtIHJlYWQuY3N2KCIuLi9kYXRhL2Rlcml2ZWQvYXJjLXRtZS1vcm5sL2FyYy10bWUtb3JubF8yMDIwLTA0LTMwLmNzdiIpCgojIFJlYWQgYWlyLWRyeSArIHN0b3JhZ2UgcmVzcGlyYXRpb24gZGF0YQphcmNoaXZlLmFyYy50cyA8LSByZWFkLmNzdigiLi4vZGF0YS9kZXJpdmVkL2FyYy1zdG9yYWdlLXQyLWZsdXgvYXJjaGl2ZS1mbHV4LXQyXzIwMjAtMDQtMjQuY3N2IikKCiMgUmVhZCBjb250cm9sIHJlc3BpcmF0aW9uIGRhdGEgZnJvbSAyMDE5IGFpci1kcnkgZXhwZXJpbWVudApyZXdldC5jdGwudHMgPC0gcmVhZC5jc3YoIi4uL2RhdGEvZGVyaXZlZC9mcmVzaC0yMDE5LWZsdXgvZnJlc2gtMjAxOS1mbHV4XzIwMjAtMDQtMjQuY3N2IikKCiMgUmVhZCB0cmVhdG1lbnQgcmVzcGlyYXRpb24gZGF0YSBmcm9tIDIwMTkgYWlyLWRyeSBleHBlcmltZW50CnJld2V0LmRyeS50cyA8LSByZWFkLmNzdigiLi4vZGF0YS9kZXJpdmVkL2RyaWVkLTIwMTktZmx1eC9kcmllZC0yMDE5LWZsdXhfMjAyMC0wNC0yNC5jc3YiKQoKIyBSZWFkIFNpZXJyYSBOZXZhZGEgKEp1bidzKSBmbHV4IGRhdGEKdG1lLmN0bC5mbHguc3JhIDwtIHJlYWQuY3N2KCIuLi9kYXRhL2Rlcml2ZWQvYXJjLXRtZS1zaWVycmEvYXJjLXRtZS1zaWVycmEtZmx1eF8yMDIwLTA3LTMwLmNzdiIpCgojIFJlYWQgc3RvcmFnZSBkdXJhdGlvbiByZXNwaXJhdGlvbiBkYXRhCnRtZS50cnQudHMgPC0gcmJpbmQocmVhZC5jc3YoIi4uL2RhdGEvZGVyaXZlZC9hcmMtdG1lLXQyLWZsdXgvYXJjLXRtZS10Mi1mbHV4LTFfMjAyMC0wNC0yNy5jc3YiLCBzdHJpbmdzQXNGYWN0b3JzID0gRkFMU0UpLAogICAgICAgICAgICAgICAgICAgICAgICByZWFkLmNzdigiLi4vZGF0YS9kZXJpdmVkL2FyYy10bWUtdDItZmx1eC9hcmMtdG1lLXQyLWZsdXgtMl8yMDIwLTA0LTI3LmNzdiIsIHN0cmluZ3NBc0ZhY3RvcnMgPSBGQUxTRSkpCgojIFJlYWQgbWlzY2VsbGFuZW91cyBzdG9yYWdlIHRyZWF0bWVudCBkYXRhCnRtZS5taXNjIDwtIHJlYWQuY3N2KCIuLi9kYXRhL2Rlcml2ZWQvYXJjLXRtZS1taXNjL2FyYy10bWUtbWlzYy1pc29fMjAyMC0wNC0yOS5jc3YiKQpgYGAKCmBgYHtyIHN1bW1hcml6ZSBkYXRhLCBpbmNsdWRlID0gRkFMU0V9CiMgMy4gQ29tYmluZSBhbmQgc3VtbWFyaXplIGRhdGEgaW4gbG9uZyBmb3JtYXQgdG8gY2FsY3VsYXRlIHJlc3BpcmF0aW9uIHJhdGVzIGFuZCBwbG90IG92ZXIgdGltZQojIE5COiBzZXQgImluY2x1ZGUiIHRvIGZhbHNlIHRvIHN1cHByZXNzIGJpbmRfcm93cyB3YXJuaW5nIGFib3V0IGNvZXJjaW5nIGZhY3RvciB0byBjaGFyCiMgcmVtb3ZlIGZvcm11bGFfY2hlY2sgY29sdW1ucwppbnZpc2libGUobGlzdDJlbnYobGFwcGx5KGxpc3QoYXJjaGl2ZS5hcmMudHMgPSBhcmNoaXZlLmFyYy50cywgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXdldC5jdGwudHMgPSByZXdldC5jdGwudHMsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV3ZXQuZHJ5LnRzID0gcmV3ZXQuZHJ5LnRzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG1lLnRydC50cyA9IHRtZS50cnQudHMpLAogICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uKHgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHgkZm9ybXVsYV9jaGVjayA8LSBOVUxMCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4oeCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLAogICAgICAgICAgICAgICAgICAgZW52aXIgPSAuR2xvYmFsRW52KQogICAgICAgICAgKQoKIyBBZGQgVHJlYXRtZW50IGNvbHVtbnMgdG8gZWFjaCBkYXRhc2V0CmFyY2hpdmUuYXJjLnRzJFRyZWF0bWVudCA8LSAiYWlyLWRyeSArIHN0b3JhZ2UiCmFyY2hpdmUuY3RsLnRzJFRyZWF0bWVudCA8LSAiY29udHJvbCIKdG1lLnRydC50cyRUcmVhdG1lbnQgPC0gInN0b3JhZ2UgZHVyYXRpb24iCnJld2V0LmN0bC50cyRUcmVhdG1lbnQgPC0gImNvbnRyb2wiCnJld2V0LmRyeS50cyRUcmVhdG1lbnQgPC0gImFpci1kcnkiCgojIGNvbWJpbmUgcmV3ZXQgZGF0YQpyZXdldC50cyA8LSByYmluZChyZXdldC5jdGwudHMsIHJld2V0LmRyeS50cykKcmV3ZXQudHMkRXhwZXJpbWVudCA8LSAicmV3ZXQiCgojIGFkZCBzb2lsIGRyeSB3dCBkYXRhCmFyY2hpdmUuYXJjLnRzJGR3X2cgPC0gamFyaW5mby5hcmNbbWF0Y2goYXJjaGl2ZS5hcmMudHMkU2FtcGxlTmFtZSwgamFyaW5mby5hcmMkU2FtcGxlKSwgIlNvaWwuZHJ5LndlaWdodF8uZy4iXQphcmNoaXZlLmN0bC50cyRkd19nIDwtIGFyY2hpdmUuY3RsLnRzLndpZGVbbWF0Y2goYXJjaGl2ZS5jdGwudHMkSUQsIGFyY2hpdmUuY3RsLnRzLndpZGUkSUQpLCAiZHJ5X3NvaWxfd3RfY29ycmVjdGVkX2ciXQpyZXdldC50cyA8LSBtZXJnZShyZXdldC50cywgamFyaW5mby5yZXdldFsgLCBjKCJJRCIsICJUcmVhdG1lbnQiLCAiZHdfZyIpXSwgYnkgPSBjKCJJRCIsICJUcmVhdG1lbnQiKSkKdG1lLnRydC50cyA8LSBtZXJnZSh0bWUudHJ0LnRzLCBqYXJpbmZvLnRtZVsgLCBjKCJOci4iLCAiZHJ5LnNvaWwiKV0sIGJ5LnggPSAiU2FtcGxlTmFtZSIsIGJ5LnkgPSAiTnIuIikKY29sbmFtZXModG1lLnRydC50cylbd2hpY2gobmFtZXModG1lLnRydC50cykgPT0gImRyeS5zb2lsIildIDwtICJkd19nIgoKIyBhZGQgZXhwZXJpbWVudCBjb2wgdG8gYXJjaGl2ZS5hcmMudHMsIHN0b3JhZ2UudHJ0LnRzCmFyY2hpdmUuYXJjLnRzJEV4cGVyaW1lbnQgPC0gImFyYyIKdG1lLnRydC50cyRFeHBlcmltZW50IDwtICJ0bWUiCgojIGNvbWJpbmUgYXJjaGl2ZSBkYXRhIGFuZCBFeHBsb3JhdG9yaWVzIHN0b3JhZ2UgZHVyYXRpb24gZGF0YQphcmNoaXZlLnRzIDwtIHJiaW5kKGFyY2hpdmUuY3RsLnRzW3doaWNoKGFyY2hpdmUuY3RsLnRzJEV4cGVyaW1lbnQgIT0gInRtZSIpLCBdLCAKICAgICAgICAgICAgICAgICAgICBhcmNoaXZlLmFyYy50c1sgLCBuYW1lcyhhcmNoaXZlLmN0bC50cyldKQp0bWUudHMgPC0gcmJpbmQoYXJjaGl2ZS5jdGwudHNbd2hpY2goYXJjaGl2ZS5jdGwudHMkRXhwZXJpbWVudCA9PSAidG1lIiksIF0sCiAgICAgICAgICAgICAgICB0bWUudHJ0LnRzWyAsIG5hbWVzKGFyY2hpdmUuY3RsLnRzKV0pCgojIGJpbmQgdG1lLmN0bC5mbHguc3JhIGRhdGEgdG8gdG1lLnRzCiMgYWxsIG90aGVyIHRtZS5mbHggZGF0YSBpcyBhbHJlYWR5IHN1bW1hcml6ZWQKdG1lLmN0bC5mbHguc3JhJEV4cGVyaW1lbnQgPC0gInRtZSIKdG1lLmN0bC5mbHguc3JhJFRyZWF0bWVudCA8LSAiY29udHJvbCIKdG1lLmN0bC5mbHguc3JhJGR3X2cgPC0gdG1lLmN0bC5zb2lsLnNyYVttYXRjaCh0bWUuY3RsLmZseC5zcmEkSmFyX0lELCB0bWUuY3RsLnNvaWwuc3JhJEphcl9JRCksICJkd19nIl0KdG1lLnRzIDwtIHJiaW5kKHRtZS50cywgdG1lLmN0bC5mbHguc3JhWyAsIG5hbWVzKHRtZS50cyldKQoKIyBUZXN0IHRoYXQgcmVxdWlyZWQgbmFtZXMgYXJlIHByZXNlbnQKbm1zIDwtIGMoIlNhbXBsZU5hbWUiLCAiSUQiLCAiRXhwZXJpbWVudCIsICJUcmVhdG1lbnQiLCAiUGVyaW9kIiwgInRpbWVwb2ludF9jbXR2IiwgICJ0aW1lX2QiLCAidGltZV9kX2NtdHYiLCAibWdDTzJfamFyIiwgImR3X2ciKQppbnZpc2libGUobGFwcGx5KGxpc3QoYXJjaGl2ZS50cyA9IGFyY2hpdmUudHMsCiAgICAgICAgICAgICAgICAgICAgICByZXdldC50cyA9IHJld2V0LnRzLAogICAgICAgICAgICAgICAgICAgICAgdG1lLnRzKSwKICAgICAgIGZ1bmN0aW9uKHgpIHsKICAgICAgICAgaWZlbHNlKCFpcy5uYShtYXRjaChubXMsIG5hbWVzKHgpKSksICJ5ZXMiLCAibm8iKQogICAgICAgfQogICAgICAgKSkKCiMgY29tYmluZSBhbGwgZGF0YSBhbmQgcmVtb3ZlIHRpbWUgcG9pbnRzIHdpdGhvdXQgQ08yIG1lYXN1cmVtZW50cwp0cyA8LSBiaW5kX3Jvd3MoYXJjaGl2ZS50c1sgLCBubXNdLCByZXdldC50c1sgLCBubXNdLCB0bWUudHNbICwgbm1zXSkKaWYobGVuZ3RoKHdoaWNoKGlzLm5hKHRzJG1nQ08yX2phcikpKSA+IDApIHsKICB0cyA8LSB0c1std2hpY2goaXMubmEodHMkbWdDTzJfamFyKSksIF0KfQoKIyBhZGQgQyBjb250ZW50CiMgeHBscgp0cyRnQ19nUyA8LSB4cGxyLmNuW21hdGNoKHRzJElELCB4cGxyLmNuJEVQX1Bsb3RpZCksICJUb3RhbF9DIl0qMTBeLTMKIyBkdWtlCnRzW3doaWNoKGlzLm5hKHRzJGdDX2dTKSksICJnQ19nUyJdIDwtIHRtZS5jdGwuZHVrW21hdGNoKHRzW3doaWNoKGlzLm5hKHRzJGdDX2dTKSksICJJRCJdLCB0bWUuY3RsLmR1ayRJRCksICJDX2dfa2ciXSoxMF4tMwojIHNpZXJyYXMKdHNbd2hpY2goaXMubmEodHMkZ0NfZ1MpKSwgImdDX2dTIl0gPC0gdG1lLmN0bC5zb2lsLnNyYVttYXRjaCh0c1t3aGljaChpcy5uYSh0cyRnQ19nUykpLCAiSUQiXSwgdG1lLmN0bC5zb2lsLnNyYSRJRCksICJnQ19rZ1MiXSoxMF4tMwojIG9hayByaWRnZQp0c1t3aGljaChpcy5uYSh0cyRnQ19nUykpLCAiZ0NfZ1MiXSA8LSB0bWUuY3RsLm9ybmxbbWF0Y2godHNbd2hpY2goaXMubmEodHMkZ0NfZ1MpKSwgIklEIl0sIHRtZS5jdGwub3JubCRJRCksICJDX2dfa2ciXSoxMF4tMwoKIyBhZGQgVHlwZQp0cyRUeXBlIDwtIGlmZWxzZShncmVwbCgiRyIsIHRzJElEKSwgIkciLCAiRiIpCgojIGNhbGN1bGF0ZSBDTzIgcmVzcGlyYXRpb24gaW4gbWdDTzItQyBwZXIgZyBzb2lsIEMKIyBOQjogMTIvNDQgPSBtYXNzIHJhdGlvIG9mIEMgaW4gQ08yCnRzJG1nQ08yLkNfZ0MgPC0gKHRzJG1nQ08yX2phciooMTIvNDQpKS8odHMkZHdfZyp0cyRnQ19nUykKdHMkbWdDTzIuQ19nQ19kIDwtIHRzJG1nQ08yLkNfZ0MvdHMkdGltZV9kCgojIHN1bW1hcml6ZSBDTzIgcmVsZWFzZSBkYXRhIGZvciBlYWNoIHRpbWVwb2ludCwgYnkgZXhwZXJpbWVudCwgdHJlYXRtZW50LCBhbmQgdHlwZQp0cy5hdmcgPC0gZGF0YS5mcmFtZShuYS5vbWl0KHRzKSAlPiUKICBzZWxlY3QoRXhwZXJpbWVudCwgVHJlYXRtZW50LCBUeXBlLCB0aW1lcG9pbnRfY210diwgbWdDTzIuQ19nQ19kLCB0aW1lX2RfY210dikgICU+JQogIGdyb3VwX2J5KEV4cGVyaW1lbnQsIFRyZWF0bWVudCwgVHlwZSwgdGltZXBvaW50X2NtdHYpICU+JQogIGFkZF90YWxseSgpICU+JQogIHN1bW1hcmlzZV9hbGwobGlzdChtZWFuID0gbWVhbiwgc2QgPSBzZCksIG5hLnJtID0gVFJVRSkgJT4lCiAgbXV0YXRlKHNlX3Nsb3BlID0gbWdDTzIuQ19nQ19kX3NkL3NxcnQobl9tZWFuKSwKICAgICAgICAgc2Vfc2xvcGVfbCA9IG1nQ08yLkNfZ0NfZF9tZWFuIC0gc2Vfc2xvcGUsCiAgICAgICAgIHNlX3Nsb3BlX3UgPSBtZ0NPMi5DX2dDX2RfbWVhbiArIHNlX3Nsb3BlKSkKCiMgYWRkIHRpbWVwb2ludCB6ZXJvIGRhdGEKdHAwLmYgPC0gZnVuY3Rpb24oZGYpIHsKICB0cDAgPC0gZGZbMSwgXQogIHRwMFsgLCAtd2hpY2gobmFtZXModHAwKSA9PSAiRXhwZXJpbWVudCIgfCBuYW1lcyh0cDApID09ICJUcmVhdG1lbnQiIHwgbmFtZXModHAwKSA9PSAiVHlwZSIgfCBuYW1lcyh0cDApID09ICJuIildIDwtIDAKICByYmluZCh0cDAsIGRmKQp9CnRzLmF2ZyR0cmVhdC5FeHAgPC0gcGFzdGUodHMuYXZnJFRyZWF0bWVudCwgdHMuYXZnJEV4cGVyaW1lbnQpCnRzLmF2ZyA8LSBsYXBwbHkoc3BsaXQodHMuYXZnLCB0cy5hdmckdHJlYXQuRXhwKSwgZnVuY3Rpb24oeCkgewogIGxhcHBseShzcGxpdCh4LCB4JFR5cGUpLCB0cDAuZikKICB9KQp0cy5hdmcgPC0gYmluZF9yb3dzKGxhcHBseSh0cy5hdmcsIGJpbmRfcm93cykpCgojIHJlc3RvcmUgY2xhc3Nlcwp0cy5hdmcgPC0gYXMuZGF0YS5mcmFtZShsYXBwbHkodHMuYXZnLCB0eXBlLmNvbnZlcnQpKQoKIyBzYXZlIG9iamVjdApzYXZlKHRzLmF2ZywgZmlsZSA9ICIuL3RzLmF2Zy5SRGF0YSIpCgojIGF2ZXJhZ2UKdHMucHJlIDwtIHRzW3RzJFBlcmlvZCA9PSAicHJlIiwgXQp0cy5wcmUuYXZnIDwtIHRzLnByZSAlPiUKICBmaWx0ZXIodGltZV9kX2NtdHYgPiAzLjUpICU+JQogIHNlbGVjdChFeHBlcmltZW50LCBUcmVhdG1lbnQsIFR5cGUsIHRpbWVwb2ludF9jbXR2LCBTYW1wbGVOYW1lLCBtZ0NPMi5DX2dDLCB0aW1lX2RfY210dikgICU+JQogIGdyb3VwX2J5KEV4cGVyaW1lbnQsIFRyZWF0bWVudCwgVHlwZSwgdGltZXBvaW50X2NtdHYsIFNhbXBsZU5hbWUpICU+JQogIHN1bW1hcmlzZV9hbGwobGlzdChtZWFuID0gbWVhbiksIG5hLnJtID0gVFJVRSkgJT4lCiAgbXV0YXRlKG1nQ08yLkNfZ0NfZCA9IG1nQ08yLkNfZ0NfbWVhbi90aW1lX2RfY210dl9tZWFuKSAlPiUKICBzZWxlY3QoLVNhbXBsZU5hbWUsIC1tZ0NPMi5DX2dDX21lYW4sIEV4cGVyaW1lbnQsIFRyZWF0bWVudCwgVHlwZSwgbWdDTzIuQ19nQ19kLCB0aW1lX2RfY210dl9tZWFuKSAlPiUKICBncm91cF9ieShFeHBlcmltZW50LCBUcmVhdG1lbnQsIFR5cGUpICU+JQogIGFkZF90YWxseSgpICU+JQogIHN1bW1hcmlzZV9hbGwobGlzdChtZWFuID0gbWVhbiwgc2QgPSBzZCksIG5hLnJtID0gVFJVRSkgJT4lCiAgbXV0YXRlKHNlX3Nsb3BlID0gbWdDTzIuQ19nQ19kX3NkL3NxcnQobl9tZWFuKSwKICAgICAgICAgc2Vfc2xvcGVfbCA9IG1nQ08yLkNfZ0NfZF9tZWFuIC0gc2Vfc2xvcGUsCiAgICAgICAgIHNlX3Nsb3BlX3UgPSBtZ0NPMi5DX2dDX2RfbWVhbiArIHNlX3Nsb3BlKQoKdHMuaW5jLmF2ZyA8LSB0cyAlPiUKICBmaWx0ZXIoUGVyaW9kID09ICJpbmMiKSAlPiUKICBzZWxlY3QoRXhwZXJpbWVudCwgVHJlYXRtZW50LCBUeXBlLCB0aW1lcG9pbnRfY210diwgbWdDTzIuQ19nQ19kLCB0aW1lX2RfY210dikgICU+JQogIGdyb3VwX2J5KEV4cGVyaW1lbnQsIFRyZWF0bWVudCwgVHlwZSwgdGltZXBvaW50X2NtdHYpICU+JQogIGFkZF90YWxseSgpICU+JQogIHN1bW1hcmlzZV9hbGwobGlzdChtZWFuID0gbWVhbiwgc2QgPSBzZCksIG5hLnJtID0gVFJVRSkgJT4lCiAgbXV0YXRlKHNlX3Nsb3BlID0gbWdDTzIuQ19nQ19kX3NkL3NxcnQobl9tZWFuKSwKICAgICAgICAgc2Vfc2xvcGVfbCA9IG1nQ08yLkNfZ0NfZF9tZWFuIC0gc2Vfc2xvcGUsCiAgICAgICAgIHNlX3Nsb3BlX3UgPSBtZ0NPMi5DX2dDX2RfbWVhbiArIHNlX3Nsb3BlKQoKY29sbmFtZXModHMucHJlLmF2Zylbd2hpY2gobmFtZXModHMucHJlLmF2ZykgJWluJSBjKCJ0aW1lcG9pbnRfY210dl9tZWFuIiwKICAgICAgICAgICAgICAgICAgICAgICAidGltZV9kX2NtdHZfbWVhbl9tZWFuIiwKICAgICAgICAgICAgICAgICAgICAgICAidGltZV9kX2NtdHZfbWVhbl9zZCIpKV0gPC0gYygidGltZXBvaW50X2NtdHYiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRpbWVfZF9jbXR2X21lYW4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRpbWVfZF9jbXR2X3NkIikKCnRzLnByZS5hdmcgPC0gdHMucHJlLmF2Z1sgLCAtd2hpY2goIW5hbWVzKHRzLnByZS5hdmcpICVpbiUgbmFtZXModHMuaW5jLmF2ZykpXQoKdHMuYXZnMiA8LSBkYXRhLmZyYW1lKHJiaW5kKHRzLnByZS5hdmcsIHRzLmluYy5hdmcpKQp0cy5hdmcyIDwtIHRzLmF2ZzJbY29tcGxldGUuY2FzZXModHMuYXZnMiksIF0KCiMgYWRkIHRpbWVwb2ludCB6ZXJvIGRhdGEKdHMuYXZnMiR0cmVhdC5FeHAgPC0gcGFzdGUodHMuYXZnMiRUcmVhdG1lbnQsIHRzLmF2ZzIkRXhwZXJpbWVudCkKdHMuYXZnMiA8LSBsYXBwbHkoc3BsaXQodHMuYXZnMiwgdHMuYXZnMiR0cmVhdC5FeHApLCBmdW5jdGlvbih4KSB7CiAgbGFwcGx5KHNwbGl0KHgsIHgkVHlwZSksIHRwMC5mKQogIH0pCnRzLmF2ZzIgPC0gYmluZF9yb3dzKGxhcHBseSh0cy5hdmcyLCBiaW5kX3Jvd3MpKQoKIyByZXN0b3JlIGNsYXNzZXMKdHMuYXZnMiA8LSBhcy5kYXRhLmZyYW1lKGxhcHBseSh0cy5hdmcyLCB0eXBlLmNvbnZlcnQpKQpgYGAKCiMgUmVzdWx0cwojIyBSZXNwaXJhdGlvbiByYXRlcwoKKm5vdGUgdGhhdCB0aGUgdGV4dCBiZWxvdyB3YXMgbGVmdCBiZWNhdXNlIHN0YXRpc3RpY3Mgd2VyZSBjYWxjdWxhdGVkIG9uIHRoZSBmbHkqCgpgYGB7ciByZXNwLXJhdGUtc3RhdHMsIGluY2x1ZGUgPSBGQUxTRX0KIyByZXdldCBtYXggcmVzcCByYXRlcwp0LnRlc3QoCiAgdGFwcGx5KHRzW3RzJEV4cGVyaW1lbnQgPT0gInJld2V0IiAmIHRzJFRyZWF0bWVudCA9PSAiYWlyLWRyeSIgJiB0cyRQZXJpb2QgPT0gInByZSIgJiB0cyRUeXBlID09ICJHIiwgIm1nQ08yLkNfZ0NfZCJdLHRzW3RzJEV4cGVyaW1lbnQgPT0gInJld2V0IiAmIHRzJFRyZWF0bWVudCA9PSAiYWlyLWRyeSIgJiB0cyRQZXJpb2QgPT0gInByZSIgJiB0cyRUeXBlID09ICJHIiwgIlNhbXBsZU5hbWUiXSwgbWF4LCBuYS5ybSA9IFRSVUUpLAogIHRhcHBseSh0c1t0cyRFeHBlcmltZW50ID09ICJyZXdldCIgJiB0cyRUcmVhdG1lbnQgPT0gImFpci1kcnkiICYgdHMkUGVyaW9kID09ICJwcmUiICYgdHMkVHlwZSA9PSAiRiIsICJtZ0NPMi5DX2dDX2QiXSx0c1t0cyRFeHBlcmltZW50ID09ICJyZXdldCIgJiB0cyRUcmVhdG1lbnQgPT0gImFpci1kcnkiICYgdHMkUGVyaW9kID09ICJwcmUiICYgdHMkVHlwZSA9PSAiRiIsICJTYW1wbGVOYW1lIl0sIG1heCwgbmEucm0gPSBUUlVFKSkKYGBgCgoqRXhwZXJpbWVudCAxIChhaXItZHJ5ICsgc3RvcmFnZSB0cmVhdG1lbnQpKgoKQW1vbmcgdGhlIGFpci1kcnkgKyBzdG9yYWdlIHNhbXBsZXMsIHJlc3BpcmF0aW9uIHJhdGVzIHdlcmUgbW9yZSB0aGFuIHR3aWNlIGFzIGhpZ2ggaW4gZ3Jhc3NsYW5kIHNvaWxzIHRoYW4gaW4gZm9yZXN0IHNvaWxzLCByZWFjaGluZyBhIG1heGltdW0gb2YgYHIge3JvdW5kKG1heCh0cy5hdmcyW3RzLmF2ZzIkRXhwZXJpbWVudCA9PSAiYXJjIiAmIHRzLmF2ZzIkVHJlYXRtZW50ID09ICJhaXItZHJ5ICsgc3RvcmFnZSIgJiB0cy5hdmcyJFR5cGUgPT0gIkciLCAibWdDTzIuQ19nQ19kX21lYW4iXSksMSl9YCBtZyBDT34yfiBnIHNvaWwgQ14tMV4gZF4tMV4gYWZ0ZXIgYHIge3JvdW5kKHRzLmF2ZzJbd2hpY2godHMuYXZnMiRtZ0NPMi5DX2dDX2RfbWVhbiA9PSBtYXgodHMuYXZnMlt0cy5hdmcyJEV4cGVyaW1lbnQgPT0gImFyYyIgJiB0cy5hdmcyJFRyZWF0bWVudCA9PSAiYWlyLWRyeSArIHN0b3JhZ2UiICYgdHMuYXZnMiRUeXBlID09ICJHIiwgIm1nQ08yLkNfZ0NfZF9tZWFuIl0pKSwgInRpbWVfZF9jbXR2X21lYW4iXSoyNCwwKX1gIGgsIGZvbGxvd2VkIGJ5IGEgc2hhcnAgZGVjbGluZS4gTWVhbiByZXNwaXJhdGlvbiByYXRlcyBpbiBmb3Jlc3Qgc2l0ZXMgcGVha2VkIGF0IGByIHtyb3VuZChtYXgodHMuYXZnMlt0cy5hdmcyJEV4cGVyaW1lbnQgPT0gImFyYyIgJiB0cy5hdmcyJFRyZWF0bWVudCA9PSAiYWlyLWRyeSArIHN0b3JhZ2UiICYgdHMuYXZnMiRUeXBlID09ICJGIiwgIm1nQ08yLkNfZ0NfZF9tZWFuIl0pLDEpfWAgbWcgQ09+Mn4gZyBzb2lsIENeLTFeIGReLTFeIGFmdGVyIGByIHtyb3VuZCh0cy5hdmcyW3doaWNoKHRzLmF2ZzIkbWdDTzIuQ19nQ19kX21lYW4gPT0gbWF4KHRzLmF2ZzJbdHMuYXZnMiRFeHBlcmltZW50ID09ICJhcmMiICYgdHMuYXZnMiRUcmVhdG1lbnQgPT0gImFpci1kcnkgKyBzdG9yYWdlIiAmIHRzLmF2ZzIkVHlwZSA9PSAiRiIsICJtZ0NPMi5DX2dDX2RfbWVhbiJdKSksICJ0aW1lX2RfY210dl9tZWFuIl0qMjQsMCl9YCBoLCBmb2xsb3dlZCBieSBhIG11Y2ggbW9yZSBncmFkdWFsIGRlY2xpbmUgdGhhbiBpbiBncmFzc2xhbmQgc2l0ZXMuIENvbnRyb2wgc2FtcGxlcyByZXNwb25kZWQgbW9yZSB3ZWFrbHkgYW5kIG1vcmUgZ3JhZHVhbGx5IHRvIHJld2V0dGluZywgYWx0aG91Z2ggYXMgaW4gdGhlIHRyZWF0bWVudCBzYW1wbGVzIHJlc3BpcmF0aW9uIHdhcyBncmVhdGVyIGluIGdyYXNzbGFuZCBzb2lscyB0aGFuIGluIGZvcmVzdCBzb2lscy4gUGVhayByZXNwaXJhdGlvbiByYXRlcyBmb3IgY29udHJvbCBpbmN1YmF0aW9ucyB3ZXJlIGByIHtyb3VuZChtYXgodHMuYXZnMlt0cy5hdmcyJEV4cGVyaW1lbnQgPT0gImFyYyIgJiB0cy5hdmcyJFRyZWF0bWVudCA9PSAiY29udHJvbCIgJiB0cy5hdmcyJFR5cGUgPT0gIkciLCAibWdDTzIuQ19nQ19kX21lYW4iXSksMSl9YCBhbmQgYHIge3JvdW5kKG1heCh0cy5hdmcyW3RzLmF2ZzIkRXhwZXJpbWVudCA9PSAiYXJjIiAmIHRzLmF2ZzIkVHJlYXRtZW50ID09ICJjb250cm9sIiAmIHRzLmF2ZzIkVHlwZSA9PSAiRiIsICJtZ0NPMi5DX2dDX2RfbWVhbiJdKSwxKX1gIG1nIENPfjJ+IGcgc29pbCBDXi0xXiBkXi0xXiBhZnRlciBgciB7cm91bmQodHMuYXZnMlt3aGljaCh0cy5hdmcyJG1nQ08yLkNfZ0NfZF9tZWFuID09IG1heCh0cy5hdmcyW3RzLmF2ZzIkRXhwZXJpbWVudCA9PSAiYXJjIiAmIHRzLmF2ZzIkVHJlYXRtZW50ID09ICJjb250cm9sIiAmIHRzLmF2ZzIkVHlwZSA9PSAiRiIsICJtZ0NPMi5DX2dDX2RfbWVhbiJdKSksICJ0aW1lX2RfY210dl9tZWFuIl0qMjQsMCl9YCBoIGZvciBncmFzc2xhbmQgYW5kIGZvcmVzdCBzb2lscywgcmVzcGVjdGl2ZWx5LgoKKkV4cGVyaW1lbnQgMiAoYWlyLWRyeSB0cmVhdG1lbnQsIDIwMTkgc2FtcGxlcykqCgpQZWFrIHJlc3BpcmF0aW9uIHJhdGVzIHdlcmUgbm90IHNpZ25pZmljYW50bHkgZGlmZmVyZW50IChwID4gMC4wNSkgYmV0d2VlbiBmb3Jlc3QgYW5kIGdyYXNzbGFuZCBzb2lscyBpbiBFeHBlcmltZW50IDIsIHBlYWtpbmcgYXQgYHIge3JvdW5kKG1heCh0cy5hdmcyW3RzLmF2ZzIkRXhwZXJpbWVudCA9PSAicmV3ZXQiICYgdHMuYXZnMiRUcmVhdG1lbnQgPT0gImFpci1kcnkiICYgdHMuYXZnMiRUeXBlID09ICJHIiwgIm1nQ08yLkNfZ0NfZF9tZWFuIl0pLDEpfWAuMCBhbmQgYHIge3JvdW5kKG1heCh0cy5hdmcyW3RzLmF2ZzIkRXhwZXJpbWVudCA9PSAicmV3ZXQiICYgdHMuYXZnMiRUcmVhdG1lbnQgPT0gImFpci1kcnkiICYgdHMuYXZnMiRUeXBlID09ICJGIiwgIm1nQ08yLkNfZ0NfZF9tZWFuIl0pLDEpfWAgbWcgQ09+Mn4gZyBzb2lsIENeLTFeIGReLTFeIGFmdGVyIGByIHtyb3VuZCh0cy5hdmcyW3doaWNoKHRzLmF2ZzIkbWdDTzIuQ19nQ19kX21lYW4gPT0gbWF4KHRzLmF2ZzJbdHMuYXZnMiRFeHBlcmltZW50ID09ICJyZXdldCIgJiB0cy5hdmcyJFRyZWF0bWVudCA9PSAiYWlyLWRyeSIgJiB0cy5hdmcyJFR5cGUgPT0gIkYiLCAibWdDTzIuQ19nQ19kX21lYW4iXSkpLCAidGltZV9kX2NtdHZfbWVhbiJdKjI0LDApfWAgaCBmb3IgZ3Jhc3NsYW5kIGFuZCBmb3Jlc3Qgc29pbHMsIHJlc3BlY3RpdmVseSAqKihGaWcuIDEpKiouCgpgYGB7ciBDTzItcmVzcC1yYXRlcywgZmlnLmhlaWdodD00fQojIHBsb3R0ZWQgYXMgbWVhc3VyZWQKdHMuYXZnICU+JQogIGZpbHRlcihFeHBlcmltZW50ICE9ICJ0bWUiKSAlPiUKICBnZ3Bsb3QoLiwgYWVzKHRpbWVfZF9jbXR2X21lYW4sIG1nQ08yLkNfZ0NfZF9tZWFuKSkgKwogIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IDQsIGNvbG9yPSJncmF5IikgKwogIGdlb21fcmliYm9uKGFlcyh5bWluID0gc2Vfc2xvcGVfbCwgeW1heCA9IHNlX3Nsb3BlX3UsIGZpbGwgPSBUeXBlLCBsaW5ldHlwZSA9IFRyZWF0bWVudCwgYWxwaGEgPSBUcmVhdG1lbnQpLCBzaG93LmxlZ2VuZCA9IEZBTFNFKSArCiAgZ2VvbV9wb2ludChhZXMoY29sb3IgPSBUeXBlLCBzaGFwZSA9IFRyZWF0bWVudCksIHNpemUgPSAyKSArCiAgZ2VvbV9saW5lKGFlcyhjb2xvciA9IFR5cGUsIGxpbmV0eXBlID0gVHJlYXRtZW50KSkgKwogIGZhY2V0X2dyaWQocm93cyA9IHZhcnMoRXhwZXJpbWVudCksCiAgICAgICAgICAgICBsYWJlbGxlciA9IGxhYmVsbGVyKEV4cGVyaW1lbnQgPSBjKCJhcmMiID0gIjIwMTEiLCAicmV3ZXQiID0gIjIwMTkiKSkpICsKICBzY2FsZV94X2NvbnRpbnVvdXMobGltaXRzID0gYygwLDE4KSkgKwogIHNjYWxlX2NvbG9yX21hbnVhbChuYW1lID0gJ0Vjb3N5c3RlbScsCiAgICAgICAgICAgICAgICAgICAgIHZhbHVlcyA9YygnRic9JyNhMzU1MTMnLCdHJz0nIzEzNjFhMycpLAogICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBjKCdGb3Jlc3QnLCdHcmFzc2xhbmQnKSkgKwogIHNjYWxlX2ZpbGxfbWFudWFsKG5hbWUgPSAnU3RhbmRhcmQgZXJyb3InLAogICAgICAgICAgICAgICAgICAgIHZhbHVlcyA9YygnRic9JyNhMzU1MTMnLCdHJz0nIzEzNjFhMycpLAogICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGMoJ0ZvcmVzdCcsJ0dyYXNzbGFuZCcpKSArCiAgc2NhbGVfYWxwaGFfbWFudWFsKG5hbWUgPSAnVHJlYXRtZW50JywKICAgICAgICAgICAgICAgICAgICAgdmFsdWVzID0gYygiYWlyLWRyeSArIHN0b3JhZ2UiID0gLjIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvbnRyb2wiID0gLjQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFpci1kcnkiID0gLjIpKSArCiAgc2NhbGVfbGluZXR5cGVfbWFudWFsKG5hbWUgPSAnVHJlYXRtZW50JywKICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVzID0gYygiYWlyLWRyeSArIHN0b3JhZ2UiID0gJ2Rhc2hlZCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvbnRyb2wiID0nc29saWQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhaXItZHJ5IiA9ICJkb3R0ZWQiKSwKICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYygiYWlyLWRyeSIgPSAiYWlyLWRyeS9yZXdldCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFpci1kcnkgKyBzdG9yYWdlIiA9ICJhaXItZHJ5L3Jld2V0ICsgc3RvcmFnZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvbnRyb2wiID0gImNvbnRyb2wtMSAoMjAxMSlcbmNvbnRyb2wtMiAoMjAxOSkiKSkgKwogIHNjYWxlX3NoYXBlX21hbnVhbChuYW1lID0gJ1RyZWF0bWVudCcsCiAgICAgICAgICAgICAgICAgICAgIHZhbHVlcyA9IGMoImFpci1kcnkgKyBzdG9yYWdlIiA9IDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvbnRyb2wiID0gMTYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFpci1kcnkiID0gMSkpICsKICB5bGFiKGV4cHJlc3Npb24oJ1Jlc3BpcmF0aW9uIFJhdGUgKG1nQ08nWzJdKictQyBnQydeLTEqJ2QnXi0xKicpJykpICsKICB4bGFiKCJUaW1lIChkYXlzKSIpICsKICBndWlkZXMoY29sb3IgPSBndWlkZV9sZWdlbmQob3JkZXIgPSAxKSwKICAgICAgICAgc2hhcGUgPSBndWlkZV9sZWdlbmQob3JkZXIgPSAzKSkgKwogIHRoZW1lX2J3KCkgKwogIHRoZW1lKHBhbmVsLmdyaWQgPSBlbGVtZW50X2JsYW5rKCkpCmBgYAoKPioqRmlnLiBgciB7KGZpZy5uIDwtIDEpfWAuIFJlc3BpcmF0aW9uIHJhdGVzIGZvciBFeHBlcmltZW50IDEgKGFpci1kcnkgKyBzdG9yYWdlIHRyZWF0bWVudCwgMjAxMSkgYW5kIEV4cGVyaW1lbnQgMiAoYWlyLWRyeSBvbmx5IHRyZWF0bWVudCwgMjAxOSkqKgoKPipDYXB0aW9uOiogVG9wIHBhbmVsIHNob3dzIGRhdGEgZnJvbSBzYW1wbGVzIGNvbGxlY3RlZCBpbiAyMDExIGZvciBFeHBlcmltZW50IDEgKGFpci1kcnkgKyBzdG9yYWdlIHRyZWF0bWVudCksIGJvdHRvbSBwYW5lbCBzaG93cyBkYXRhIGZyb20gc2FtcGxlcyBjb2xsZWN0ZWQgaW4gMjAxOSBmb3IgRXhwZXJpbWVudCAyIChhaXItZHJ5IG9ubHkgdHJlYXRtZW50KS4gVmVydGljYWwgZ3JheSBsaW5lIGF0IGRheSA0IGRlbWFyY2F0ZXMgdGhlIGVuZCBvZiB0aGUgcHJlLWluY3ViYXRpb24gcGVyaW9kIGFuZCB0aGUgc3RhcnQgb2YgdGhlIGVxdWlsaWJyaXVtIHJlc3BpcmF0aW9uIHBlcmlvZC4gUG9pbnRzIHNob3cgbWVhc3VyZW1lbnRzIGFuZCBsaW5lcyBzaG93IHRyZW5kcyBpbiBtZWFuIHJlc3BpcmF0aW9uIHJhdGUuIFNoYWRlZCByaWJib25zIHJlcHJlc2VudCBvbmUgc3RhbmRhcmQgZXJyb3IuIFRoZSBmaW5hbCBtZWFzdXJlbWVudCBwb2ludHMgZm9yIGEgZmV3IHNhbXBsZXMgd2hpY2ggdG9vayA+MTggZGF5cyB0byByZWFjaCBDT34yfiB0YXJnZXRzIGFyZSBleGNsdWRlZCBmb3IgZGlzcGxheSByZWFzb25zOyByZXNwaXJhdGlvbiByYXRlcyBmb3IgdGhvc2Ugc2FtcGxlcyByZW1haW5lZCBmbGF0LiBOb3RlIHRoYXQgaGVhZHNwYWNlIENPfjJ+IGNvbmNlbnRyYXRpb25zIGZvciBFeHBlcmltZW50IDEgY29udHJvbCBzYW1wbGVzIHdlcmUgb25seSBtZWFzdXJlZCBvbmNlIGR1cmluZyB0aGUgcHJlLWluY3ViYXRpb24gcGVyaW9kIChkYXkgNCkgaW4gY29udHJhc3QgdG8gZGFpbHkgbWVhc3VyZW1lbnRzIGZvciBhbGwgb3RoZXIgc2FtcGxlcy4gQ29uc2VxdWVudGx5IHRoZSByZXNwaXJhdGlvbiByYXRlIGZvciB0aG9zZSBzYW1wbGVzIGlzIHRoZSBjdW11bGF0aXZlIGF2ZXJhZ2UgcmF0ZSBvdmVyIHRoZSBmaXJzdCA0IGQuCgoKKlN1cHBsZW1lbnRhbCByZXNwaXJhdGlvbiByYXRlcyBmaWd1cmVzOioKCipFeHBlcmltZW50IDMgKHN0b3JhZ2UgZHVyYXRpb24pKgoKR3Jhc3NsYW5kIHNvaWxzIGZyb20gdGhlIHN0b3JhZ2UgZHVyYXRpb24gdHJlYXRtZW50IGdyb3VwIHJlc3BvbmRlZCByYXBpZGx5IHRvIHJld2V0dGluZyBhbmQgcmVhY2hlZCB0YXJnZXQgQ09+Mn4gbGV2ZWxzIGFmdGVyIGp1c3QgYHIge3JvdW5kKHRzLmF2ZzJbd2hpY2godHMuYXZnMiRtZ0NPMi5DX2dDX2RfbWVhbiA9PSBtYXgodHMuYXZnMlt0cy5hdmcyJEV4cGVyaW1lbnQgPT0gInRtZSIgJiB0cy5hdmcyJFRyZWF0bWVudCA9PSAic3RvcmFnZSBkdXJhdGlvbiIgJiB0cy5hdmcyJFR5cGUgPT0gIkciLCAibWdDTzIuQ19nQ19kX21lYW4iXSkpLCAidGltZV9kX2NtdHZfbWVhbiJdKjI0LDApfWAgaCBvZiBpbmN1YmF0aW9uLiBPbmx5IGEgc2luZ2xlIG9ic2VydmF0aW9uIHdhcyBtYWRlIGZvciB0aGUgZ3Jhc3NsYW5kIHRyZWFtZW50IHNhbXBsZXMgZHVlIHRvIHRoZSByYXBpZCByZXNwaXJhdGlvbiByYXRlcywgd2hpY2ggcGVha2VkIGF0IGByIHtyb3VuZChtYXgodHMuYXZnMlt0cy5hdmcyJEV4cGVyaW1lbnQgPT0gInRtZSIgJiB0cy5hdmcyJFRyZWF0bWVudCA9PSAic3RvcmFnZSBkdXJhdGlvbiIgJiB0cy5hdmcyJFR5cGUgPT0gIkciLCAibWdDTzIuQ19nQ19kX21lYW4iXSksMSl9YCBtZyBDT34yfiBnIHNvaWwgQ14tMV4gZF4tMV4uIFRoZSBtZWFuIHBlYWsgcmVzcGlyYXRpb24gcmF0ZSBmb3IgZm9yZXN0IHRyZWF0bWVudCBzYW1wbGVzIHdhcyBsb3dlciBhbmQgbGFnZ2VkIGluIGNvbXBhcmlzb24gdG8gdGhlIGdyYXNzbGFuZCBzb2lscywgcmVhY2hpbmcgYHIge3JvdW5kKG1heCh0cy5hdmcyW3RzLmF2ZzIkRXhwZXJpbWVudCA9PSAidG1lIiAmIHRzLmF2ZzIkVHJlYXRtZW50ID09ICJzdG9yYWdlIGR1cmF0aW9uIiAmIHRzLmF2ZzIkVHlwZSA9PSAiRiIsICJtZ0NPMi5DX2dDX2RfbWVhbiJdKSwxKX1gIG1nIENPfjJ+IGcgc29pbCBDXi0xXiBkXi0xXiBhZnRlciBgciB7cm91bmQodHMuYXZnMlt3aGljaCh0cy5hdmcyJG1nQ08yLkNfZ0NfZF9tZWFuID09IG1heCh0cy5hdmcyW3RzLmF2ZzIkRXhwZXJpbWVudCA9PSAidG1lIiAmIHRzLmF2ZzIkVHJlYXRtZW50ID09ICJzdG9yYWdlIGR1cmF0aW9uIiAmIHRzLmF2ZzIkVHlwZSA9PSAiRiIsICJtZ0NPMi5DX2dDX2RfbWVhbiJdKSksICJ0aW1lX2RfY210dl9tZWFuIl0qMjQsMCl9YCBoLgoKQ29udHJvbC0zIHJlc3BpcmF0aW9uIHJhdGVzIHBlYWtlZCBhZnRlciB0aGUgcHJlLWluY3ViYXRpb24gcGVyaW9kIChgciB7cm91bmQodHMuYXZnMlt3aGljaCh0cy5hdmcyJG1nQ08yLkNfZ0NfZF9tZWFuID09IG1heCh0cy5hdmcyW3RzLmF2ZzIkRXhwZXJpbWVudCA9PSAidG1lIiAmIHRzLmF2ZzIkVHJlYXRtZW50ID09ICJjb250cm9sIiAmIHRzLmF2ZzIkVHlwZSA9PSAiRyIsICJtZ0NPMi5DX2dDX2RfbWVhbiJdKSksICJ0aW1lX2RfY210dl9tZWFuIl0qMjQsMCl9YCBoKSwgYXQgYHIge3JvdW5kKG1heCh0cy5hdmcyW3RzLmF2ZzIkRXhwZXJpbWVudCA9PSAidG1lIiAmIHRzLmF2ZzIkVHJlYXRtZW50ID09ICJjb250cm9sIiAmIHRzLmF2ZzIkVHlwZSA9PSAiRyIsICJtZ0NPMi5DX2dDX2RfbWVhbiJdKSwxKX1gIG1nIENPfjJ+IGcgc29pbCBDXi0xXiBkXi0xXi4gRm9yZXN0IGNvbnRyb2wgc2FtcGxlcyB3ZXJlIHByZS1pbmN1YmF0ZWQgdW5kZXIgdmFyaW91cyBjb25kaXRpb25zLCBidXQgcmVzcGlyYXRpb24gcmF0ZXMgd2VyZSBvbmx5IG1lYXN1cmVkIGR1cmluZyB0aGUgcHJlLWluY3ViYXRpb24gcGVyaW9kIGZvciB0d28gc2FtcGxlcyBmcm9tIHRoZSBTaWVycmEgTmV2YWRhIG1vdW50YWlucyAoVVNBKS4gSW4gZ2VuZXJhbCwgcmVzcGlyYXRpb24gcmF0ZXMgZm9yIGZvcmVzdCBjb250cm9sIHNhbXBsZXMgaW4gRXhwZXJpbWVudCAzIHdlcmUgbXVjaCBsb3dlciB0aGFuIGluIHRoZSB0cmVhdG1lbnQgaW5jdWJhdGlvbnMsIHBlYWtpbmcgYXQgYHIge3JvdW5kKG1heCh0cy5hdmcyW3RzLmF2ZzIkRXhwZXJpbWVudCA9PSAidG1lIiAmIHRzLmF2ZzIkVHJlYXRtZW50ID09ICJjb250cm9sIiAmIHRzLmF2ZzIkVHlwZSA9PSAiRiIsICJtZ0NPMi5DX2dDX2RfbWVhbiJdKSwxKX1gIG1nIENPfjJ+IGcgc29pbCBDXi0xXiBkXi0xXiBhZnRlciBgciB7cm91bmQodHMuYXZnMlt3aGljaCh0cy5hdmcyJG1nQ08yLkNfZ0NfZF9tZWFuID09IG1heCh0cy5hdmcyW3RzLmF2ZzIkRXhwZXJpbWVudCA9PSAidG1lIiAmIHRzLmF2ZzIkVHJlYXRtZW50ID09ICJjb250cm9sIiAmIHRzLmF2ZzIkVHlwZSA9PSAiRiIsICJtZ0NPMi5DX2dDX2RfbWVhbiJdKSksICJ0aW1lX2RfY210dl9tZWFuIl0qMjQsMCl9YCBoLgoKYGBge3IgQ08yLWZsdXgtcGxvdHMtU0ktMX0KIyByZXNwaXJhdGlvbiByYXRlcyBmb3IgZXhwZXJpbWVudCAzCnRzLmF2ZyAlPiUKICBmaWx0ZXIoRXhwZXJpbWVudCA9PSAidG1lIikgJT4lCiAgZ2dwbG90KC4sIGFlcyh0aW1lX2RfY210dl9tZWFuLCBtZ0NPMi5DX2dDX2RfbWVhbikpICsKICBnZW9tX3JpYmJvbihhZXMoeW1pbiA9IHNlX3Nsb3BlX2wsIHltYXggPSBzZV9zbG9wZV91LCBmaWxsID0gVHlwZSwgbGluZXR5cGUgPSBUcmVhdG1lbnQsIGFscGhhID0gVHJlYXRtZW50KSkgKwogIGdlb21fcG9pbnQoYWVzKGNvbG9yID0gVHlwZSwgc2hhcGUgPSBUcmVhdG1lbnQpKSArCiAgZ2VvbV9saW5lKGFlcyhjb2xvciA9IFR5cGUsIGxpbmV0eXBlID0gVHJlYXRtZW50KSkgKwogIGZhY2V0X2dyaWQocm93cyA9IHZhcnMoRXhwZXJpbWVudCkpICsKICBzY2FsZV94X2NvbnRpbnVvdXMobGltaXRzID0gYygwLDE4KSkgKwogIHNjYWxlX2NvbG9yX21hbnVhbChuYW1lID0gJ0Vjb3N5c3RlbScsCiAgICAgICAgICAgICAgICAgICAgIHZhbHVlcyA9YygnRic9JyNhMzU1MTMnLCdHJz0nIzEzNjFhMycpLAogICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBjKCdGb3Jlc3QnLCdHcmFzc2xhbmQnKSkgKwogIHNjYWxlX2ZpbGxfbWFudWFsKG5hbWUgPSAnU3RkLiBFcnIuJywKICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgPWMoJ0YnPScjYTM1NTEzJywnRyc9JyMxMzYxYTMnKSwKICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBjKCdGb3Jlc3QnLCdHcmFzc2xhbmQnKSkgKwogIHNjYWxlX2FscGhhX21hbnVhbChuYW1lID0gJ1RyZWF0bWVudCcsCiAgICAgICAgICAgICAgICAgICAgIHZhbHVlcyA9IGMoImFpci1kcnkgKyBzdG9yYWdlIiA9IC4yLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjb250cm9sIiA9IC40LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhaXItZHJ5IiA9IC4yLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzdG9yYWdlIGR1cmF0aW9uIiA9IC4yKSkgKwogIHNjYWxlX2xpbmV0eXBlX21hbnVhbChuYW1lID0gJ1RyZWF0bWVudCcsCiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlcyA9IGMoImFpci1kcnkgKyBzdG9yYWdlIiA9ICdkYXNoZWQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjb250cm9sIiA9J3NvbGlkJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYWlyLWRyeSIgPSAiZG90dGVkIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic3RvcmFnZSBkdXJhdGlvbiIgPSAiZGFzaGVkIikpICsKICBzY2FsZV9zaGFwZV9tYW51YWwobmFtZSA9ICdUcmVhdG1lbnQnLAogICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgPSBjKCJhaXItZHJ5ICsgc3RvcmFnZSIgPSAxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjb250cm9sIiA9IDE2LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhaXItZHJ5IiA9IDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInN0b3JhZ2UgZHVyYXRpb24iID0gMSkpICsKICB5bGFiKGV4cHJlc3Npb24oJ1Jlc3BpcmF0aW9uIFJhdGUgKG1nQ08nWzJdKictQyBnQydeLTEqJ2QnXi0xKicpJykpICsKICB4bGFiKCJUaW1lIChkYXlzKSIpICsKICB0aGVtZV9idygpICsKICB0aGVtZShwYW5lbC5ncmlkID0gZWxlbWVudF9ibGFuaygpKQpgYGAKPioqU3VwcGxlbWVudGFsIEZpZyBgciB7KHNmaWcubiA8LSAxKX1gLiBSZXNwaXJhdGlvbiByYXRlcyBmb3IgRXhwZXJpbWVudCAzKioKCj4qQ2FwdGlvbjoqIEV4cGVyaW1lbnQgMyBzdG9yYWdlIGR1cmF0aW9uIHRyZWF0bWVudCBzYW1wbGVzIHdlcmUgb25seSBpbmN1YmF0ZWQgZm9yIGEgc2luZ2xlIGVuY2xvc3VyZSBwZXJpb2QsIGFzIHRoZSByZXN1bHRzIG9mIEV4cGVyaW1lbnQgMSBhbmQgRXhwZXJpbWVudCAyIHNob3dlZCBubyBzaWduaWZpY2FudCBkaWZmZXJlbmNlIGluICRcRGVsdGEkXjE0XkMtQ09+Mn4gYmV0d2VlbiB0aGUgcmV3ZXR0aW5nIHB1bHNlIENPfjJ+IHJlbGVhc2VkIGR1cmluZyB0aGUgcHJlLWluY3ViYXRpb24gcGVyaW9kIGFuZCB0aGUgQ09+Mn4gcmVzcGlyZWQgZHVyaW5nIHRoZSBlcXVpbGlicml1bSByZXNwaXJhdGlvbiBwZXJpb2QuIFRoZSBncmFzc2xhbmQgc3RvcmFnZSBkdXJhdGlvbiB0cmVhdG1lbnQgc2FtcGxlcyAoYmx1ZSBkYXNoZWQgbGluZSkgcmVzcGlyZWQgYW4gZXF1aXZhbGVudCBhbW91bnQgb2YgQ09+Mn4gaW4ganVzdCAzIGQgYXMgdGhlIGNvcnJlc3BvbmRpbmcgY29udHJvbC0zIHNhbXBsZXMgcmVzcGlyZWQgZHVyaW5nIHRoZSBwcmUtaW5jdWJhdGlvbiBwZXJpb2QgYW5kIHRoZSBlcXVpbGlicml1bSByZXNwaXJhdGlvbiBwZXJpb2QgY29tYmluZWQuIENvbnNlcXVlbnRseSB0aG9zZSBpbmN1YmF0aW9ucyB3ZXJlIHN0b3BwZWQgYWZ0ZXIgdGhlIGZpcnN0IENPfjJ+IG1lYXN1cmVtZW50IHBvaW50LiBDb250cm9sLTMgc2FtcGxlcyBkaWQgdW5kZXJnbyBwcmUtaW5jdWJhdGlvbiwgYnV0IGFzIHRoZSBDT34yfiByZWxlYXNlIHdhcyBub3QgbWVhc3VyZWQgbm9yIHdhcyAkXERlbHRhJF4xNF5DLUNPfjJ+IGZvciB0aGUgbWFqb3JpdHkgb2YgdGhlIHNhbXBsZXMsIGFsbCBkYXRhIHdlcmUgYXZlcmFnZWQgYnkgZGF5IG9mIG1lYXN1cmVtZW50LiAKClByZWluY3ViYXRpb24gaGVhZHNwYWNlIENPfjJ+IGNvbmNlbnRhdGlvbnMgd2VyZSBvbmx5IG1lYXN1cmVkIG9uY2UgZm9yIHRoZSBjb250cm9sLTEgc2FtcGxlcywgYXQgdGhlIGVuZCBvZiB0aGUgZm91cj1kYXkgcHJlaW5jdWJhdGlvbiBwZXJpb2QuIEluIG9yZGVyIHRvIGNvbXBhcmUgdGhlIGNvbnRyb2wtMSByZXNwaXJhdGlvbiByYXRlcyBtb3JlIGVhc2lseSB3aXRoIHRoZSBhaXItZHJ5ICsgc3RvcmFnZSB0cmVhdG1lbnQgc2FtcGxlcywgU3VwcGxlbWVudGFsIEZpZ3VyZSAyIHNob3dzIHRoZSBhaXItZHJ5ICsgc3RvcmFnZSBwcmUtaW5jdWJhdGlvbiByZXNwaXJhdGlvbiByYXRlcyBwbG90dGVkIGFzIGEgY3VtdWxhdGl2ZSBhdmVyYWdlIGZvciB0aGUgcHJlaW5jdWJhdGlvbiBwZXJpb2QuIEhvd2V2ZXIsIGFzIGNhbiBiZSBzZWVuIGluIEZpZ3VyZSAxLCBoZWFkc3BhY2UgQ09+Mn4gY29uY2VudHJhdGlvbiB3YXMgbWVhc3VyZWQgZGFpbHkgZm9yIHRoZSBhaXItZHJ5ICsgc3RvcmFnZSBzYW1wbGVzLgoKYGBge3IgQ08yLWZsdXgtcGxvdHMtU0ktMn0KIyBOb3RlOiB0aGlzIGNvZGUgcGxvdHMgZGF0YSB3aXRoIHByZS1pbmN1YmF0aW9uIG9ic2VydmF0aW9ucyBhdmVyYWdlZAojIFBsb3QgcmVzcCByYXRlcyBvdmVyIHRpbWUKdHMuYXZnMiAlPiUKICBmaWx0ZXIoRXhwZXJpbWVudCAhPSAidG1lIikgJT4lCiAgZ2dwbG90KC4sIGFlcyh0aW1lX2RfY210dl9tZWFuLCBtZ0NPMi5DX2dDX2RfbWVhbikpICsKICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSA0LCBjb2xvcj0iZ3JheSIpICsKICBnZW9tX3JpYmJvbihhZXMoeW1pbiA9IHNlX3Nsb3BlX2wsIHltYXggPSBzZV9zbG9wZV91LCBmaWxsID0gVHlwZSwgbGluZXR5cGUgPSBUcmVhdG1lbnQsIGFscGhhID0gVHJlYXRtZW50KSkgKwogIGdlb21fcG9pbnQoYWVzKGNvbG9yID0gVHlwZSwgc2hhcGUgPSBUcmVhdG1lbnQpKSArCiAgZ2VvbV9saW5lKGFlcyhjb2xvciA9IFR5cGUsIGxpbmV0eXBlID0gVHJlYXRtZW50KSkgKwogIGZhY2V0X2dyaWQocm93cyA9IHZhcnMoRXhwZXJpbWVudCksCiAgICAgICAgICAgICBsYWJlbGxlciA9IGxhYmVsbGVyKEV4cGVyaW1lbnQgPSBjKCJhcmMiID0gIjIwMTEiLCAicmV3ZXQiID0gIjIwMTkiKSkpICsKICBzY2FsZV94X2NvbnRpbnVvdXMobGltaXRzID0gYygwLDE4KSkgKwogIHNjYWxlX2NvbG9yX21hbnVhbChuYW1lID0gJ0Vjb3N5c3RlbScsCiAgICAgICAgICAgICAgICAgICAgIHZhbHVlcyA9YygnRic9JyNhMzU1MTMnLCdHJz0nIzEzNjFhMycpLAogICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBjKCdGb3Jlc3QnLCdHcmFzc2xhbmQnKSkgKwogIHNjYWxlX2ZpbGxfbWFudWFsKG5hbWUgPSAnU3RkLiBFcnIuJywKICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgPWMoJ0YnPScjYTM1NTEzJywnRyc9JyMxMzYxYTMnKSwKICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBjKCdGb3Jlc3QnLCdHcmFzc2xhbmQnKSkgKwogIHNjYWxlX2FscGhhX21hbnVhbChuYW1lID0gJ1RyZWF0bWVudCcsCiAgICAgICAgICAgICAgICAgICAgIHZhbHVlcyA9IGMoImFpci1kcnkgKyBzdG9yYWdlIiA9IC4yLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjb250cm9sIiA9IC40LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhaXItZHJ5IiA9IC4yKSkgKwogIHNjYWxlX2xpbmV0eXBlX21hbnVhbChuYW1lID0gJ1RyZWF0bWVudCcsCiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlcyA9IGMoImFpci1kcnkgKyBzdG9yYWdlIiA9ICdkYXNoZWQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjb250cm9sIiA9J3NvbGlkJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYWlyLWRyeSIgPSAiZG90dGVkIikpICsKICBzY2FsZV9zaGFwZV9tYW51YWwobmFtZSA9ICdUcmVhdG1lbnQnLAogICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgPSBjKCJhaXItZHJ5ICsgc3RvcmFnZSIgPSAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjb250cm9sIiA9IDE2LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhaXItZHJ5IiA9IDEpKSArCiAgeWxhYihleHByZXNzaW9uKCdSZXNwaXJhdGlvbiBSYXRlIChtZ0NPJ1syXSonLUMgZ0MnXi0xKidkJ14tMSonKScpKSArCiAgeGxhYigiVGltZSAoZGF5cykiKSArCiAgdGhlbWVfYncoKSArCiAgdGhlbWUocGFuZWwuZ3JpZCA9IGVsZW1lbnRfYmxhbmsoKSkKYGBgCj4qKlN1cHBsZW1lbnRhbCBGaWcgYHIgeyhzZmlnLm4gKyAxKX1gLiBSZXNwaXJhdGlvbiByYXRlcyBmb3IgRXhwZXJpbWVudCAxIGFuZCBFeHBlcmltZW50IDIgc2hvd24gd2l0aCBhbGwgcHJlLWluY3ViYXRpb24gZGF0YSBjYWxjdWxhdGVkIGFzIGN1bXVsYXRpdmUgYXZlcmFnZXMqKgoKPipDYXB0aW9uOiogQ09+Mn4gY29uY2VudHJhdGlvbnMgZm9yIEV4cGVyaW1lbnQgMSBjb250cm9sIHNhbXBsZXMgd2VyZSBvbmx5IG1lYXN1cmVkIG9uY2UgZHVyaW5nIHRoZSBwcmUtaW5jdWJhdGlvbiBwZXJpb2QsIGluIGNvbnRyYXN0IHRvIGRhaWx5IG1lYXN1cmVtZW50cyBmb3IgYWxsIG90aGVyIHNhbXBsZXMuIFByZS1pbmN1YmF0aW9uIHJlc3BpcmF0aW9uIHJhdGVzIGFyZSBzaG93biBoZXJlIGNhbGN1bGF0ZWQgYXMgY3VtdWxhdGl2ZSBhdmVyYWdlcyBmb3IgdGhlIHB1cnBvc2Ugb2YgZmFpciBjb21wYXJpc29uIGFjcm9zcyBhbGwgdHJlYXRtZW50cy4KCiMjIFJhZGlvY2FyYm9uIGRhdGEKCmBgYHtyIGxvYWQgYW1zLWplbmEtaW5nZXN0IGZ4fQojIDEuIFJlYWQgaW4gaXNvdG9wZSBkYXRhIGZyb20gdmFyaW91cyBzb3VyY2VzCiMgRmlyc3QgbG9hZCBoZWxwZXIgZnVuY3Rpb25zICdyZWFkX2plbmFfYW1zX3Jlc3VsdHMuUicsICdyZWFkX2plbmFfaXNvX3Jlc3VsdHMuUicgCnNvdXJjZSgiLi91dGlsaXRpZXMvamVuYV9hbXNfaW5nZXN0LlIiKQpzb3VyY2UoIi4vdXRpbGl0aWVzL2plbmFfaXNvX2luZ2VzdC5SIikKYGBgCgpgYGB7ciByZWFkIGlzbyBkYXRhLCBpbmNsdWRlID0gRkFMU0V9CiMgMi4gTmV4dCByZWFkIGluIGRhdGEgZnJvbSB0aGUgYXBwcm9wcmlhdGUgZGlyZWN0b3JpZXMgaW4gJ2RhdGEvcmF3JwojIDE0QwojIGlkZW50aWZ5IHN1YmRpcmVjdG9yaWVzIGluICdyYXcnIGRpcmVjdG9yeSB3aXRoICJhbXNfamVuYSIgaW4gbmFtZQphbXNfamVuYV9yZXN1bHRzX2RpcnMgPC0gbGlzdC5maWxlcygiLi4vZGF0YS9yYXciLCBwYXR0ZXJuID0gImFtc19qZW5hX3Jlc3VsdHMiLCBmdWxsLm5hbWVzID0gVFJVRSkKYW1zX3Jlc3VsdHNfbHMgPC0gbGFwcGx5KHNlcV9hbG9uZyhhbXNfamVuYV9yZXN1bHRzX2RpcnMpLCBmdW5jdGlvbihpKSB7CiAgcmVhZF9qZW5hX2Ftc19yZXN1bHRzKGFtc19qZW5hX3Jlc3VsdHNfZGlyc1tpXSkKfSkKbmFtZXMoYW1zX3Jlc3VsdHNfbHMpIDwtIGxpc3QuZmlsZXMoIi4uL2RhdGEvcmF3IiwgcGF0dGVybiA9ICJhbXNfamVuYV9yZXN1bHRzIikKCiMgMTNDCiMgaWRlbnRpZnkgc3ViZGlyZWN0b3JpZXMgaW4gJ3JhdycgZGlyZWN0b3J5IHdpdGggImlzb19qZW5hIiBpbiBuYW1lCmlzb19qZW5hX3Jlc3VsdHNfZGlycyA8LSBsaXN0LmZpbGVzKCIuLi9kYXRhL3JhdyIsIHBhdHRlcm4gPSAiaXNvX2plbmFfcmVzdWx0cyIsIGZ1bGwubmFtZXMgPSBUUlVFKQppc29fcmVzdWx0c19scyA8LSBsYXBwbHkoc2VxX2Fsb25nKGlzb19qZW5hX3Jlc3VsdHNfZGlycyksIGZ1bmN0aW9uKGkpIHsKICByZWFkX2plbmFfaXNvX3Jlc3VsdHMoaXNvX2plbmFfcmVzdWx0c19kaXJzW2ldKQp9KQpuYW1lcyhpc29fcmVzdWx0c19scykgPC0gbGlzdC5maWxlcygiLi4vZGF0YS9yYXciLCBwYXR0ZXJuID0gImlzb19qZW5hX3Jlc3VsdHMiKQpgYGAKCmBgYHtyIGFyYyBhbmQgcmV3ZXQgZXhwZXJpbWVudCB0ZW1wbGF0ZX0KIyAzLiBDcmVhdGUgYSAidGlkeSIgc3R5bGUgdGVtcGxhdGUgZm9yIHRoZSBkYXRhLCBpLmUuIHZhcmlhYmxlcyBpbiBjb2x1bW5zLiAKIyBLZXkgdmFyaWFibGVzIGFyZSBhcyBmb2xsb3dzOgojICAgKiBTYW1wbGVOYW1lIChpbmNvcnBvcmF0ZXMgbGFiIHJlcCBhbmQgdHJlYXRtZW50LCBlLmcuICJIRUcxMC0xX2RyeSIpCiMgICAqIElEIChwbG90IElEcywgZS5nLiBmb3IgIkhFRzEwIiBmb3IgRXhwbG9yYXRvcnkgc2FtcGxlcykKIyAgICogVHJlYXRtZW50ICgzIHRyZWF0bWVudHM6IGFpci1kcnksIGFpci1kcnkgKyBzdG9yYWdlLCBzdG9yYWdlIGR1cmF0aW9uOyArIGNvbnRyb2xzKQojICAgKiBUeXBlICgyIGxldmVsczogRiA9IGZvcmVzdCwgRyA9IGdyYXNzbGFuZCkKIyAgICogUGVyaW9kIChpbmN1YmF0aW9uIHBlcmlvZCwgMiBsZXZlbHM6IHByZSA9IHByZWluY3ViYXRpb24sIGluYyA9IGVxdWlsaWJyaXVtIGluY3ViYXRpb24pCiMgICAqIEV4cGVyaW1lbnQgKDMgbGV2ZWxzOiBhcmMgPSBhaXItZHJ5ICsgc3RvcmFnZSwgcmV3ZXQgPSBhaXItZHJ5L3Jld2V0LCB0aW1lID0gc3RvcmFnZSBkdXJhdGlvbikKIyAKIyAqIE9ic2VydmF0aW9uYWwgY29sdW1ucyBpbmNsdWRlOgojICAgKiBkMTRjICgkXERlbHRhJF4xNF5DLUNPfjJ+KQojICAgKiBkMTNjICgkXGRlbHRhJF4xM15DLUNPfjJ+KQojICAgKiBDX2dfa2cgKEMgY29udGVudCkKIyAgICogZHdfZyAoZHJ5IHdlaWdodCkKIyAgICogbWdDTzIuQ19nUyAobWcgQ09+Mn4tQyByZXNwaXJlZCBnXi0xXiBzb2lsIFBlcmlvZF4tMV4pCiMgICAqIHRpbWVfZCAoZGF5cyBpbiBpbmN1YmF0aW9uIHBlcmlvZCBwcmlvciB0byBtZWFzdXJlbWVudCkKIyAgICogZEgyT19ncmF2IChwZXJjZW50IGNoYW5nZSBpbiBncmF2aW1ldHJpYyB3YXRlciBjb250ZW50IGR1ZSB0byBsYWJvcmF0b3J5IG1vaXN0dXJlIGFkanVzdG1lbnQpCiMgICAqIGRIMk9fd2hjIChwZXJjZW50IGNoYW5nZSBpbiB3YXRlciBob2xkaW5nIGNhcGFjaXR5IGR1ZSB0byBsYWJvcmF0b3J5IG1vaXN0dXJlIGFkanVzdG1lbnQpCnVuaXF1ZS5pZC5uIDwtIGMobGVuZ3RoKHVuaXF1ZShhcmNoaXZlLnRzW2FyY2hpdmUudHMkVHJlYXRtZW50ID09ICJjb250cm9sIiwgIlNhbXBsZU5hbWUiXSkpLAogICAgICAgICAgICAgICAgIGxlbmd0aCh1bmlxdWUoYXJjaGl2ZS50c1thcmNoaXZlLnRzJFRyZWF0bWVudCA9PSAiYWlyLWRyeSArIHN0b3JhZ2UiLCAiU2FtcGxlTmFtZSJdKSksCiAgICAgICAgICAgICAgICAgbGVuZ3RoKHVuaXF1ZShyZXdldC5jdGwudHMkU2FtcGxlTmFtZSkpLAogICAgICAgICAgICAgICAgIGxlbmd0aCh1bmlxdWUocmV3ZXQuZHJ5LnRzJFNhbXBsZU5hbWUpKSkKcHJlLjE0YyA8LSBkYXRhLmZyYW1lKFNhbXBsZU5hbWUgPSBjKGFzLmNoYXJhY3Rlcih1bmlxdWUoYXJjaGl2ZS50c1thcmNoaXZlLnRzJFRyZWF0bWVudCA9PSAiY29udHJvbCIsICJTYW1wbGVOYW1lIl0pKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzLmNoYXJhY3Rlcih1bmlxdWUoYXJjaGl2ZS50c1thcmNoaXZlLnRzJFRyZWF0bWVudCA9PSAiYWlyLWRyeSArIHN0b3JhZ2UiLCAiU2FtcGxlTmFtZSJdKSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcy5jaGFyYWN0ZXIodW5pcXVlKHJld2V0LmN0bC50cyRTYW1wbGVOYW1lKSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcy5jaGFyYWN0ZXIodW5pcXVlKHJld2V0LmRyeS50cyRTYW1wbGVOYW1lKSkpKQpwcmUuMTRjJElEIDwtIHN1YnN0cihwcmUuMTRjJFNhbXBsZU5hbWUsIDEsIDUpCnByZS4xNGMkVHlwZSA8LSBpZmVsc2UoZ3JlcGwoIkciLCBwcmUuMTRjJElEKSwgIkciLCAiRiIpCnByZS4xNGMkRXhwZXJpbWVudCA8LSBjKHJlcCgiYXJjIiwgdW5pcXVlLmlkLm5bMV0gKyB1bmlxdWUuaWQublsyXSksCiAgICAgICAgICAgICAgICAgICAgICAgcmVwKCJyZXdldCIsIHVuaXF1ZS5pZC5uWzNdICsgdW5pcXVlLmlkLm5bNF0pKQpwcmUuMTRjJFRyZWF0bWVudCA8LSBjKHJlcCgiY29udHJvbCIsIHVuaXF1ZS5pZC5uWzFdKSwKICAgICAgICAgICAgICAgICAgICAgICByZXAoImFpci1kcnkgKyBzdG9yYWdlIiwgdW5pcXVlLmlkLm5bMl0pLAogICAgICAgICAgICAgICAgICAgICAgIHJlcCgiY29udHJvbCIsIHVuaXF1ZS5pZC5uWzNdKSwKICAgICAgICAgICAgICAgICAgICAgICByZXAoImFpci1kcnkiLCB1bmlxdWUuaWQubls0XSkpCnByZS4xNGMkUGVyaW9kIDwtICJwcmUiCgojIGNyZWF0ZSBpbmMgcGVyaW9kIGRmIGFzIGR1cGxpY2F0ZSBvZiBwcmUtaW5jIGRmLCBidXQgdGVzdCB0aGF0IGl0IGlzIHRoZSByaWdodCBzaGFwZSBmaXJzdAppZihucm93KHByZS4xNGMpID09IHN1bSh1bmlxdWUuaWQubikgJiBuY29sKHByZS4xNGMpID09IDYpIHsKICBpbmMuMTRjIDwtIHByZS4xNGMKICBpbmMuMTRjJFBlcmlvZCA8LSAiaW5jIgp9IGVsc2UgewogICJwcmUuMTRjIGRhdGEgZnJhbWUgbWFsZm9ybWVkIgp9CmFsbC4xNGMudGVtcGxhdGUgPC0gcmJpbmQocHJlLjE0YywgaW5jLjE0YykKYGBgCgpgYGB7ciB0bWUgZXhwZXJpbWVudCB0ZW1wbGF0ZX0KdW5pcXVlLmlkLnRtZS5uIDwtIGMobGVuZ3RoKHVuaXF1ZSh0bWUuY3RsLmR1ayRTYW1wbGVOYW1lKSksCiAgICAgICAgICAgICAgICAgICAgIGxlbmd0aCh1bmlxdWUodG1lLmN0bC5vcm5sJFNhbXBsZU5hbWUpKSwKICAgICAgICAgICAgICAgICAgICAgbGVuZ3RoKHVuaXF1ZSh0bWUuY3RsLmZseC5zcmEkU2FtcGxlTmFtZSkpLAogICAgICAgICAgICAgICAgICAgICBsZW5ndGgodW5pcXVlKHRtZS5taXNjJFNhbXBsZU5hbWUpKSwKICAgICAgICAgICAgICAgICAgICAgbGVuZ3RoKHVuaXF1ZShhcmNoaXZlLmN0bC50cy53aWRlW2FyY2hpdmUuY3RsLnRzLndpZGUkRXhwZXJpbWVudCA9PSAidG1lIiwgIklEIl0pKSwKICAgICAgICAgICAgICAgICAgICAgbGVuZ3RoKHVuaXF1ZSh0bWUudHJ0LnRzJFNhbXBsZU5hbWUpKSkKcHJlLnRtZS5jdGwgPC0gZGF0YS5mcmFtZShTYW1wbGVOYW1lID0gYyhhcy5jaGFyYWN0ZXIodW5pcXVlKHRtZS5jdGwuZHVrJFNhbXBsZU5hbWUpKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcy5jaGFyYWN0ZXIodW5pcXVlKHRtZS5jdGwub3JubCRTYW1wbGVOYW1lKSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXMuY2hhcmFjdGVyKHVuaXF1ZSh0bWUuY3RsLmZseC5zcmEkU2FtcGxlTmFtZSkpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzLmNoYXJhY3Rlcih1bmlxdWUodG1lLm1pc2MkU2FtcGxlTmFtZSkpLCAgIGFzLmNoYXJhY3Rlcih1bmlxdWUoYXJjaGl2ZS5jdGwudHMud2lkZVthcmNoaXZlLmN0bC50cy53aWRlJEV4cGVyaW1lbnQgPT0gInRtZSIsICJJRCJdKSkpKQpwcmUudG1lLmN0bCRTaXRlIDwtIGMocmVwKCJEdWtlIiwgdW5pcXVlLmlkLnRtZS5uWzFdKSwKICAgICAgICAgICAgICAgICAgICAgIHJlcCgiT1JOTCIsIHVuaXF1ZS5pZC50bWUublsyXSksCiAgICAgICAgICAgICAgICAgICAgICByZXAoIlNpZXJyYSIsIHVuaXF1ZS5pZC50bWUublszXSksCiAgICAgICAgICAgICAgICAgICAgICByZXAoIm1pc2MiLCB1bmlxdWUuaWQudG1lLm5bNF0pLAogICAgICAgICAgICAgICAgICAgICAgcmVwKCJIYWluaWNoIiwgdW5pcXVlLmlkLnRtZS5uWzVdKSkKCgojIER1a2UsIE9STkwsIG1pc2MsIGFuZCBYcGxyIElEcwpwcmUudG1lLmN0bFtwcmUudG1lLmN0bCRTaXRlID09ICJEdWtlIiB8IAogICAgICAgICAgICBwcmUudG1lLmN0bCRTaXRlID09ICJPUk5MIiB8CiAgICAgICAgICAgIHByZS50bWUuY3RsJFNpdGUgPT0gIm1pc2MiIHwKICAgICAgICAgICAgcHJlLnRtZS5jdGwkU2l0ZSA9PSAiSGFpbmljaCIsICJJRCJdIDwtIGFzLmNoYXJhY3RlcihwcmUudG1lLmN0bFtwcmUudG1lLmN0bCRTaXRlID09ICJEdWtlIiB8CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmUudG1lLmN0bCRTaXRlID09ICJPUk5MIiB8CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmUudG1lLmN0bCRTaXRlID09ICJtaXNjIiB8CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmUudG1lLmN0bCRTaXRlID09ICJIYWluaWNoIiwgIlNhbXBsZU5hbWUiXSkKCiMgU2llcnJhIElEcwpwcmUudG1lLmN0bFtwcmUudG1lLmN0bCRTaXRlID09ICJTaWVycmEiLCAiSUQiXSA8LQogIHN1YnN0cihwcmUudG1lLmN0bFtwcmUudG1lLmN0bCRTaXRlID09ICJTaWVycmEiLCAiU2FtcGxlTmFtZSJdLCAxMCwgMTEpCgojIHN1YmRpdmlkZSBPUk5MIGludG8gV0IgYW5kIFRWQQpwcmUudG1lLmN0bFtwcmUudG1lLmN0bCRTaXRlID09ICJPUk5MIiwgIlNpdGUiXSA8LSBpZmVsc2UoZ3JlcGwoIlRWQSIsIHByZS50bWUuY3RsW3ByZS50bWUuY3RsJFNpdGUgPT0gIk9STkwiLCAiSUQiXSksICJUZW5uZXNzZWUgVmFsbGV5IiwgIldhbGtlciBCcmFuY2giKQoKIyBzdWJkaXZpZGUgU2llcnJhIGludG8gTXVzaWNrIGFuZCBTaGF2ZXIKcHJlLnRtZS5jdGxbcHJlLnRtZS5jdGwkU2l0ZSA9PSAiU2llcnJhIiwgIlNpdGUiXSA8LSBpZmVsc2UoZ3JlcGwoIk0iLCBwcmUudG1lLmN0bFtwcmUudG1lLmN0bCRTaXRlID09ICJTaWVycmEiLCAiSUQiXSksICJNdXNpY2siLCAiU2hhdmVyIikKCiMgYWRkIHRyZWF0bWVudCBjb2wKcHJlLnRtZS5jdGwkVHJlYXRtZW50IDwtICJjb250cm9sIgoKcHJlLnRtZS50cnQgPC0gZGF0YS5mcmFtZShTYW1wbGVOYW1lID0gdW5pcXVlKHRtZS50cnQudHMkU2FtcGxlTmFtZSkpCnByZS50bWUudHJ0JElEIDwtIHN1YnN0cihwcmUudG1lLnRydCRTYW1wbGVOYW1lLCAxLCBuY2hhcihhcy5jaGFyYWN0ZXIocHJlLnRtZS50cnQkU2FtcGxlTmFtZSkpLTIpCnByZS50bWUudHJ0IDwtIHJiaW5kKHByZS50bWUudHJ0LCBwcmUudG1lLmN0bFtwcmUudG1lLmN0bCRTaXRlID09ICJtaXNjIiwgYygiSUQiLCAiU2FtcGxlTmFtZSIpXSkKcHJlLnRtZS50cnQkVHJlYXRtZW50IDwtICJzdG9yYWdlIGR1cmF0aW9uIgpwcmUudG1lLnRydCRTaXRlIDwtIHByZS50bWUuY3RsW21hdGNoKHByZS50bWUudHJ0JElELCBwcmUudG1lLmN0bCRJRCksICJTaXRlIl0KCnByZS50bWUuMTRjIDwtIHJiaW5kKHByZS50bWUuY3RsLCBwcmUudG1lLnRydCkKcHJlLnRtZS4xNGMkVHlwZSA8LSBpZmVsc2UoZ3JlcGwoIkciLCBwcmUudG1lLjE0YyRTYW1wbGVOYW1lKSwgIkciLCAiRiIpCnByZS50bWUuMTRjJFBlcmlvZCA8LSAicHJlIgpwcmUudG1lLjE0YyRFeHBlcmltZW50IDwtICJ0bWUiCgojIGNyZWF0ZSBpbmMgcGVyaW9kIGRmCmluYy50bWUuMTRjIDwtIHByZS50bWUuMTRjCmluYy50bWUuMTRjJFBlcmlvZCA8LSAiaW5jIgp0bWUuMTRjLnRlbXBsYXRlIDwtIHJiaW5kKHByZS50bWUuMTRjLCBpbmMudG1lLjE0YykKYGBgCgpgYGB7ciBjb21iaW5lIHNvaWwgb2JzIGRhdGF9CiMgNC4gU3VtbWFyaXplIG9ic2VydmF0aW9uYWwgZGF0YSBmcm9tIHRpbWVzZXJpZXMgZGF0YSBieSB1bmlxdWUgSURzIChTYW1wbGVOYW1lKQojIHN1bW1hcml6ZSB0aW1lIGFuZCBjbzIgZGF0YSBieSBleHBlcmltZW50LCBwZXJpb2QsIHRyZWF0bWVudCwgYW5kIHNhbXBsZSBuYW1lCnRzLmVwc24uYXZnIDwtIHRzICU+JQogIHNlbGVjdChFeHBlcmltZW50LCBJRCwgUGVyaW9kLCBUcmVhdG1lbnQsIFNhbXBsZU5hbWUsIGdDX2dTLCBkd19nLCBtZ0NPMi5DX2dDLCB0aW1lX2QsIHRpbWVfZF9jbXR2KSAgJT4lCiAgZ3JvdXBfYnkoRXhwZXJpbWVudCwgSUQsIFBlcmlvZCwgVHJlYXRtZW50LCBTYW1wbGVOYW1lKSAlPiUKICBzdW1tYXJpc2VfYWxsKGxpc3QobWF4ID0gbWF4KSwgbmEucm0gPSBUUlVFKQp0cy5lcHNuLmF2ZyA8LSByZW5hbWVfYXQodHMuZXBzbi5hdmcsIHZhcnMoY29udGFpbnMoJ21heCcpKSwgbGlzdCh+c3ViKCJfbWF4IiwgIiIsIC4pKSkKYGBgCgpgYGB7ciBjbGVhbiB1cCAxNEMgZGF0YX0KIyA2LiBDbGVhbiB1cCBeMTReQyBkYXRhIGFuZCBhZGQgZXh0ZXJuYWwgZGF0YSBwb2ludHMgKHRtZSBleHBlcmltZW50LCBYcGxyIGNvbnRyb2wgc2FtcGxlcykKIyBOZWVkIHRvIGFkZCBTYW1wbGVOYW1lIGNvbCBhbmQgdmFyaWFibGUgY29sdW1ucyBUcmVhdG1lbnQsIFBlcmlvZCwgYW5kIEV4cGVyaW1lbnQgdG8gYWxsIGRhdGEgZnJhbWVzIGluIGFtc19yZXN1bHRzX2xzIAoKIyBGaXJzdCBhZGQgMTRDIGFuZCAxM0MgZGF0YSBmcm9tIEV4cGxvcmF0b3JpZXMgY29udHJvbCBzYW1wbGVzIHRvIGFtc19yZXN1bHRzX2xzCiMgbm90ZSB0aGF0IG5laXRoZXIgMTNDIG5vciAxNEMgd2FzIG1lYXN1cmVkIGZvciB0aGUgcHJlLWluY3ViYXRpb24gcGVyaW9kIGZvciB0aGVzZSBzYW1wbGVzCiMgZ2V0IG5hbWVzIGZvciBhbXNfcmVzdWx0cyBkYXRhIGZyYW1lcwpyZXN1bHRzLjE0Yy5ubXMgPC0gbmFtZXMoYW1zX3Jlc3VsdHNfbHMkYGFtc19qZW5hX3Jlc3VsdHMtY28yXzIwMTktMDEtMjhgJGBCZWVtLU1pbGxlcl85Lnhsc3hgKQojIGdldCBuYW1lcyBmb3IgcmVsZXZhbnQgRXhwZXJpbWVudC9UcmVhdG1lbnQvUGVyaW9kIGNvbWJpbmF0aW9uCmFyY19jdGxfaW5jX1NOIDwtIGFzLmNoYXJhY3RlcihhbGwuMTRjLnRlbXBsYXRlW2FsbC4xNGMudGVtcGxhdGUkRXhwZXJpbWVudCA9PSAiYXJjIiAmIGFsbC4xNGMudGVtcGxhdGUkVHJlYXRtZW50ID09ICJjb250cm9sIiAmIGFsbC4xNGMudGVtcGxhdGUkUGVyaW9kID09ICJpbmMiLCAiU2FtcGxlTmFtZSJdKQp0bWVfY3RsX2luY194cGxyX1NOIDwtIHVubGlzdChsYXBwbHkoYW1zX3Jlc3VsdHNfbHNbMToyXSwgZnVuY3Rpb24oeCkgdW5saXN0KGxhcHBseSh4LCAiW1siLCAiUHJvYmUiKSkpKQp0bWVfY3RsX2luY194cGxyX1NOIDwtIHRtZV9jdGxfaW5jX3hwbHJfU05bZ3JlcCgiSEUiLCB0bWVfY3RsX2luY194cGxyX1NOKV0KaWYobGVuZ3RoKHRtZV9jdGxfaW5jX3hwbHJfU04pID09IDE0KSB7CiAgdG1lX2N0bF9pbmNfeHBscl9TTiA8LSB1bmlxdWUoc3Vic3RyKHRtZV9jdGxfaW5jX3hwbHJfU04sIDEsIG5jaGFyKHRtZV9jdGxfaW5jX3hwbHJfU04pLTIpKQp9CgojIGFkZCBzdWJsaXN0IGZvciBFeHBsb3JhdG9yaWVzIDIwMTEgKGNvbnRyb2wpIGRhdGEgYW5kIGRhdGEgZnJhbWVzIGZvciBhYm92ZSBzdWJzZXRzCmFtc19yZXN1bHRzX2xzJGV4cGxvcmF0b3JpZXNfaXNjaG9lbmluZ18xNGMuY28yXzIwMTEkYXJjX2N0bF9pbmMgPC0gZGF0YS5mcmFtZShtYXRyaXgobnJvdyA9IGxlbmd0aChhcmNfY3RsX2luY19TTiksIG5jb2wgPSBsZW5ndGgocmVzdWx0cy4xNGMubm1zKSkpCmFtc19yZXN1bHRzX2xzJGV4cGxvcmF0b3JpZXNfaXNjaG9lbmluZ18xNGMuY28yXzIwMTEkdG1lX2N0bF9pbmNfeHBsciA8LSBkYXRhLmZyYW1lKG1hdHJpeChucm93ID0gbGVuZ3RoKHRtZV9jdGxfaW5jX3hwbHJfU04pLCBuY29sID0gbGVuZ3RoKHJlc3VsdHMuMTRjLm5tcykpKQoKIyBhZGQgbmFtZXMgYW5kIGZpbGwgU2FtcGxlTmFtZXMgZm9yIG5ldyBkYXRhIGZyYW1lcwphbXNfcmVzdWx0c19scyRleHBsb3JhdG9yaWVzX2lzY2hvZW5pbmdfMTRjLmNvMl8yMDExIDwtIGxhcHBseSgKICBhbXNfcmVzdWx0c19scyRleHBsb3JhdG9yaWVzX2lzY2hvZW5pbmdfMTRjLmNvMl8yMDExLCBmdW5jdGlvbihkZikgewogICAgbmFtZXMoZGYpIDwtIHJlc3VsdHMuMTRjLm5tcwogICAgZGYgPC0gZGF0YS5mcmFtZSgKICAgICAgbWFwcGx5KEZVTiA9IGFzLAogICAgICAgICAgICAgZGYsIAogICAgICAgICAgICAgc2FwcGx5KGFtc19yZXN1bHRzX2xzJGBhbXNfamVuYV9yZXN1bHRzLWNvMl8yMDE5LTAxLTI4YCRgQmVlbS1NaWxsZXJfOS54bHN4YCwgY2xhc3MpLAogICAgICAgICAgICAgU0lNUExJRlkgPSBGQUxTRSksCiAgICAgIHN0cmluZ3NBc0ZhY3RvcnMgPSBGQUxTRSkKICByZXR1cm4oZGYpCn0pCgphbXNfcmVzdWx0c19scyRleHBsb3JhdG9yaWVzX2lzY2hvZW5pbmdfMTRjLmNvMl8yMDExJGFyY19jdGxfaW5jWyAsIGMoIlNhbXBsZU5hbWUiLCJQcm9iZSIpXSA8LSBhcmNfY3RsX2luY19TTgphbXNfcmVzdWx0c19scyRleHBsb3JhdG9yaWVzX2lzY2hvZW5pbmdfMTRjLmNvMl8yMDExJHRtZV9jdGxfaW5jX3hwbHJbICwgYygiU2FtcGxlTmFtZSIsIlByb2JlIildIDwtIHRtZV9jdGxfaW5jX3hwbHJfU04KCiMgZmlsbCAxNEMgZGF0YQphbXNfcmVzdWx0c19scyRleHBsb3JhdG9yaWVzX2lzY2hvZW5pbmdfMTRjLmNvMl8yMDExIDwtIGxhcHBseShhbXNfcmVzdWx0c19scyRleHBsb3JhdG9yaWVzX2lzY2hvZW5pbmdfMTRjLmNvMl8yMDExLCBmdW5jdGlvbihkZikgewogIGRmJGBYLjE0Qy4uLi5gIDwtIHhwbHIuY3RsLmlzb1ttYXRjaChkZiRQcm9iZSwgeHBsci5jdGwuaXNvJEVQX1Bsb3RpZCksICIxNGNfQ08yIl0KICBkZiRUcmVhdG1lbnQgPC0gImNvbnRyb2wiCiAgZGYkUGVyaW9kIDwtICJpbmMiCiAgcmV0dXJuKGRmKQp9KQoKIyBhZGQgRXhwZXJpbWVudAphbXNfcmVzdWx0c19scyRleHBsb3JhdG9yaWVzX2lzY2hvZW5pbmdfMTRjLmNvMl8yMDExJGFyY19jdGxfaW5jJEV4cGVyaW1lbnQgPC0gImFyYyIKYW1zX3Jlc3VsdHNfbHMkZXhwbG9yYXRvcmllc19pc2Nob2VuaW5nXzE0Yy5jbzJfMjAxMSR0bWVfY3RsX2luY194cGxyJEV4cGVyaW1lbnQgPC0gInRtZSIKCgojIGBhbXNfamVuYV9yZXN1bHRzLWNvMl8yMDE4LTEwLTEyYCBhbmQgYGFtc19qZW5hX3Jlc3VsdHMtY28yXzIwMTgtMTEtMDlgCiMgYEJlZW0tTWlsbGVyXzQueGxzeGAsIGBCZWVtLU1pbGxlcl81Lnhsc3hgOyBgQmVlbS1NaWxsZXJfNi54bHN4YCwgYEJlZW0tTWlsbGVyXzcueGxzeGAKIyBBZGQgdHJlYXRtZW50LCBleHBlcmltZW50LCBwZXJpb2QgY29scwojIEV4cGVyaW1lbnQgPSB0bWUKIyBUcmVhdG1lbnQgPSBzdG9yYWdlIGR1cmF0aW9uCiMgUGVyaW9kID0gaW5jCmFtc19yZXN1bHRzX2xzWzE6Ml0gPC0gbGFwcGx5KGFtc19yZXN1bHRzX2xzWzE6Ml0sIGZ1bmN0aW9uKGxzKSBsYXBwbHkobHMsIGZ1bmN0aW9uKGRmKSB7CiAgZGYkRXhwZXJpbWVudCA8LSAidG1lIgogIGRmJFRyZWF0bWVudCA8LSAic3RvcmFnZSBkdXJhdGlvbiIKICBkZiRQZXJpb2QgPC0gImluYyIKICByZXR1cm4oZGYpCiAgfSkKKQoKIyBgYW1zX2plbmFfcmVzdWx0cy1jbzJfMjAxOS0wMS0yOGAKIyBgQmVlbS1NaWxsZXJfOS54bHN4YAojIEV4cGVyaW1lbnQgPSBhcmMKIyBUcmVhdG1lbnQgPSBhaXItZHJ5ICsgc3RvcmFnZQojIFBlcmlvZCA9IHByZQphbXNfcmVzdWx0c19scyRgYW1zX2plbmFfcmVzdWx0cy1jbzJfMjAxOS0wMS0yOGAkYEJlZW0tTWlsbGVyXzkueGxzeGAkU2FtcGxlTmFtZSA8LSBhbXNfcmVzdWx0c19scyRgYW1zX2plbmFfcmVzdWx0cy1jbzJfMjAxOS0wMS0yOGAkYEJlZW0tTWlsbGVyXzkueGxzeGAkUHJvYmUKYW1zX3Jlc3VsdHNfbHMkYGFtc19qZW5hX3Jlc3VsdHMtY28yXzIwMTktMDEtMjhgJGBCZWVtLU1pbGxlcl85Lnhsc3hgJFRyZWF0bWVudCA8LSAiYWlyLWRyeSArIHN0b3JhZ2UiCmFtc19yZXN1bHRzX2xzJGBhbXNfamVuYV9yZXN1bHRzLWNvMl8yMDE5LTAxLTI4YCRgQmVlbS1NaWxsZXJfOS54bHN4YCRQZXJpb2QgPC0gInByZSIKYW1zX3Jlc3VsdHNfbHMkYGFtc19qZW5hX3Jlc3VsdHMtY28yXzIwMTktMDEtMjhgJGBCZWVtLU1pbGxlcl85Lnhsc3hgJEV4cGVyaW1lbnQgPC0gImFyYyIKCiMgYW1zX3Jlc3VsdHNfbHMkYGFtc19qZW5hX3Jlc3VsdHMtY28yXzIwMTktMDItMjVgJAojIEFyY2hpdmVkX0luY3ViYXRpb25zXzMwLnhsc3gKIyBFeHBlcmltZW50ID0gYXJjCiMgVHJlYXRtZW50ID0gYWlyLWRyeSArIHN0b3JhZ2UKIyBQZXJpb2QgPSBpbmMKYW1zX3Jlc3VsdHNfbHMkYGFtc19qZW5hX3Jlc3VsdHMtY28yXzIwMTktMDItMjVgJEFyY2hpdmVkX0luY3ViYXRpb25zXzMwLnhsc3gkU2FtcGxlTmFtZSA8LSBzdWJzdHIoYW1zX3Jlc3VsdHNfbHMkYGFtc19qZW5hX3Jlc3VsdHMtY28yXzIwMTktMDItMjVgJEFyY2hpdmVkX0luY3ViYXRpb25zXzMwLnhsc3gkUHJvYmUsIDEsIDkpCmFtc19yZXN1bHRzX2xzJGBhbXNfamVuYV9yZXN1bHRzLWNvMl8yMDE5LTAyLTI1YCRBcmNoaXZlZF9JbmN1YmF0aW9uc18zMC54bHN4JFRyZWF0bWVudCA8LSAiYWlyLWRyeSArIHN0b3JhZ2UiCmFtc19yZXN1bHRzX2xzJGBhbXNfamVuYV9yZXN1bHRzLWNvMl8yMDE5LTAyLTI1YCRBcmNoaXZlZF9JbmN1YmF0aW9uc18zMC54bHN4JFBlcmlvZCA8LSAiaW5jIgphbXNfcmVzdWx0c19scyRgYW1zX2plbmFfcmVzdWx0cy1jbzJfMjAxOS0wMi0yNWAkQXJjaGl2ZWRfSW5jdWJhdGlvbnNfMzAueGxzeCRFeHBlcmltZW50IDwtICJhcmMiCgojIGFtc19yZXN1bHRzX2xzJGBhbXNfamVuYV9yZXN1bHRzLWNvMl8yMDE5LTA0LTMwYAojIGBSb3N0XzMxLTIueGxzeGAKIyBFeHBlcmltZW50ID0gYXJjCiMgVHJlYXRtZW50ID0gYWlyLWRyeSArIHN0b3JhZ2UKIyBQZXJpb2QgPSBpbmMsIHByZSAoU0VXMTEtMi0yKQphbXNfcmVzdWx0c19scyRgYW1zX2plbmFfcmVzdWx0cy1jbzJfMjAxOS0wNC0zMGAkYFJvc3RfMzEtMi54bHN4YCRTYW1wbGVOYW1lIDwtIHN1YnN0cihhbXNfcmVzdWx0c19scyRgYW1zX2plbmFfcmVzdWx0cy1jbzJfMjAxOS0wNC0zMGAkYFJvc3RfMzEtMi54bHN4YCRQcm9iZSwgMSwgOSkKYW1zX3Jlc3VsdHNfbHMkYGFtc19qZW5hX3Jlc3VsdHMtY28yXzIwMTktMDQtMzBgJGBSb3N0XzMxLTIueGxzeGAkVHJlYXRtZW50IDwtICJhaXItZHJ5ICsgc3RvcmFnZSIKYW1zX3Jlc3VsdHNfbHMkYGFtc19qZW5hX3Jlc3VsdHMtY28yXzIwMTktMDQtMzBgJGBSb3N0XzMxLTIueGxzeGAkRXhwZXJpbWVudCA8LSAiYXJjIgphbXNfcmVzdWx0c19scyRgYW1zX2plbmFfcmVzdWx0cy1jbzJfMjAxOS0wNC0zMGAkYFJvc3RfMzEtMi54bHN4YFsyOjksICJQZXJpb2QiXSA8LSAiaW5jIgphbXNfcmVzdWx0c19scyRgYW1zX2plbmFfcmVzdWx0cy1jbzJfMjAxOS0wNC0zMGAkYFJvc3RfMzEtMi54bHN4YFsxMCwgIlBlcmlvZCJdIDwtICJwcmUiCgojIGFtc19yZXN1bHRzX2xzJGBhbXNfamVuYV9yZXN1bHRzLWNvMl8yMDIwLTAyLTEzYAojIFJvc3RfNDcueGxzeCAKIyBFeHBlcmltZW50ID0gcmV3ZXQKIyBUcmVhdG1lbnQgPSBjb250cm9sCiMgUGVyaW9kID0gcHJlCmFtc19yZXN1bHRzX2xzJGBhbXNfamVuYV9yZXN1bHRzLWNvMl8yMDIwLTAyLTEzYCRSb3N0XzQ3Lnhsc3gkU2FtcGxlTmFtZSA8LSBzdWJzdHIoYW1zX3Jlc3VsdHNfbHMkYGFtc19qZW5hX3Jlc3VsdHMtY28yXzIwMjAtMDItMTNgJFJvc3RfNDcueGxzeCRQcm9iZSwgMSwgNykKYW1zX3Jlc3VsdHNfbHMkYGFtc19qZW5hX3Jlc3VsdHMtY28yXzIwMjAtMDItMTNgJFJvc3RfNDcueGxzeCRUcmVhdG1lbnQgPC0gImNvbnRyb2wiCmFtc19yZXN1bHRzX2xzJGBhbXNfamVuYV9yZXN1bHRzLWNvMl8yMDIwLTAyLTEzYCRSb3N0XzQ3Lnhsc3gkRXhwZXJpbWVudCA8LSAicmV3ZXQiCmFtc19yZXN1bHRzX2xzJGBhbXNfamVuYV9yZXN1bHRzLWNvMl8yMDIwLTAyLTEzYCRSb3N0XzQ3Lnhsc3gkUGVyaW9kIDwtICJwcmUiCiMgUm9zdF81MC54bHN4CiMgRXhwZXJpbWVudCA9IHJld2V0CiMgVHJlYXRtZW50ID0gY29udHJvbAojIFBlcmlvZCA9IGluYwphbXNfcmVzdWx0c19scyRgYW1zX2plbmFfcmVzdWx0cy1jbzJfMjAyMC0wMi0xM2AkUm9zdF81MC54bHN4JFNhbXBsZU5hbWUgPC0gc3Vic3RyKGFtc19yZXN1bHRzX2xzJGBhbXNfamVuYV9yZXN1bHRzLWNvMl8yMDIwLTAyLTEzYCRSb3N0XzUwLnhsc3gkUHJvYmUsIDEsIDcpCmFtc19yZXN1bHRzX2xzJGBhbXNfamVuYV9yZXN1bHRzLWNvMl8yMDIwLTAyLTEzYCRSb3N0XzUwLnhsc3gkVHJlYXRtZW50IDwtICJjb250cm9sIgphbXNfcmVzdWx0c19scyRgYW1zX2plbmFfcmVzdWx0cy1jbzJfMjAyMC0wMi0xM2AkUm9zdF81MC54bHN4JEV4cGVyaW1lbnQgPC0gInJld2V0IgphbXNfcmVzdWx0c19scyRgYW1zX2plbmFfcmVzdWx0cy1jbzJfMjAyMC0wMi0xM2AkUm9zdF81MC54bHN4JFBlcmlvZCA8LSAiaW5jIgojIFJvc3RfNTIueGxzeAojIEV4cGVyaW1lbnQgPSByZXdldAojIFRyZWF0bWVudCA9IGFpci1kcnkKIyBQZXJpb2QgPSBwcmUsIGluYwphbXNfcmVzdWx0c19scyRgYW1zX2plbmFfcmVzdWx0cy1jbzJfMjAyMC0wMi0xM2AkUm9zdF81Mi54bHN4JFNhbXBsZU5hbWUgPC0gc3Vic3RyKGFtc19yZXN1bHRzX2xzJGBhbXNfamVuYV9yZXN1bHRzLWNvMl8yMDIwLTAyLTEzYCRSb3N0XzUyLnhsc3gkUHJvYmUsIDEsIDExKQpwcmUuaXggPC0gd2hpY2goZ3JlcGwoIlBSRSIsIGFtc19yZXN1bHRzX2xzJGBhbXNfamVuYV9yZXN1bHRzLWNvMl8yMDIwLTAyLTEzYCRSb3N0XzUyLnhsc3gkUHJvYmUpKQphbXNfcmVzdWx0c19scyRgYW1zX2plbmFfcmVzdWx0cy1jbzJfMjAyMC0wMi0xM2AkUm9zdF81Mi54bHN4JFRyZWF0bWVudCA8LSAiYWlyLWRyeSIKYW1zX3Jlc3VsdHNfbHMkYGFtc19qZW5hX3Jlc3VsdHMtY28yXzIwMjAtMDItMTNgJFJvc3RfNTIueGxzeCRFeHBlcmltZW50IDwtICJyZXdldCIKYW1zX3Jlc3VsdHNfbHMkYGFtc19qZW5hX3Jlc3VsdHMtY28yXzIwMjAtMDItMTNgJFJvc3RfNTIueGxzeFtwcmUuaXgsICJQZXJpb2QiXSA8LSAicHJlIgphbXNfcmVzdWx0c19scyRgYW1zX2plbmFfcmVzdWx0cy1jbzJfMjAyMC0wMi0xM2AkUm9zdF81Mi54bHN4Wy1wcmUuaXgsICJQZXJpb2QiXSA8LSAiaW5jIgpgYGAKCmBgYHtyIGNvbWJpbmUgMTRDIHNvaWwgb2JzIGRhdGF9CiMgNy4gQ29tYmluZSBkYXRhLgojIGZsYXR0ZW4gbGlzdCBhbmQgcmVtb3ZlIEFNUyBibGFua3MsIE5BIHNhbXBsZXMsIGFuZCBub24tRXhwbG9yYXRvcnkgZGF0YQphbXNfcmVzdWx0c19hcmNfcmV3ZXQgPC0gbGFwcGx5KGFtc19yZXN1bHRzX2xzWzM6N10sIGZ1bmN0aW9uKHgpIGJpbmRfcm93cyh4KSkKYW1zX3Jlc3VsdHNfYXJjX3Jld2V0LmRmIDwtIGJpbmRfcm93cyhsYXBwbHkoYW1zX3Jlc3VsdHNfYXJjX3Jld2V0LCBmdW5jdGlvbih4KSBleHRyYS5jbGVhbi5meCh4KSkpCgojIGZsYXR0ZW4gZXh0ZXJuYWwgZGF0YSBsaXN0CmFtc19yZXN1bHRzX3RtZSA8LSBsYXBwbHkoYW1zX3Jlc3VsdHNfbHNbYygxOjIsNyldLCBmdW5jdGlvbih4KSBsYXBwbHkoeCwgdG1lLjE0Yy5meCkpCmFtc19yZXN1bHRzX3RtZS5kZiA8LSBiaW5kX3Jvd3MobGFwcGx5KGFtc19yZXN1bHRzX3RtZSwgZnVuY3Rpb24oeCkgYmluZF9yb3dzKHgpKSkKCiMgY3V0IG91dCBub24tcmVsZXZhbnQgQU1TIHJlc3VsdHMgY29sdW1ucwpubXMuYW1zLnZhcnMgPC0gYygiRjE0QyIsICJlcnIiLCAiWC4xNEMuLi4uIiwgImVyci4uLi4iLAogICAgICAgICAgICAgICAgICJTYW1wbGVOYW1lIiwgIlRyZWF0bWVudCIsICJQZXJpb2QiLCAiRXhwZXJpbWVudCIpCmFtc19yZXN1bHRzX2FyY19yZXdldC5kZiA8LSBhbXNfcmVzdWx0c19hcmNfcmV3ZXQuZGZbICwgbm1zLmFtcy52YXJzXQpjb2xuYW1lcyhhbXNfcmVzdWx0c19hcmNfcmV3ZXQuZGYpIDwtIGMoImZtIiwgImZtX2VyciIsICJkMTRjIiwgImQxNGNfZXJyIiwgbm1zLmFtcy52YXJzWzU6OF0pCgphbXNfcmVzdWx0c190bWUuZGYgPC0gYW1zX3Jlc3VsdHNfdG1lLmRmWyAsIG5tcy5hbXMudmFyc10KY29sbmFtZXMoYW1zX3Jlc3VsdHNfdG1lLmRmKSA8LSBjKCJmbSIsICJmbV9lcnIiLCAiZDE0YyIsICJkMTRjX2VyciIsIG5tcy5hbXMudmFyc1s1OjhdKQogICAgIAojIGNvbXBsaWNhdGVkLCBidXQgdGhlIGZvbGxvd2luZyBjaGVja3MgdG8gc2VlIGlmOgojIDEpIFRoZSBlbmQgb2YgdGhlIHNhbXBsZSBuYW1lIHN0cmluZyBpcyAiLW4iIHdoZXJlICJuIiBpcyBhIG51bWJlcgojIDIpIGlmIHRydWUsIHRoZSBmaW5hbCB0d28gY2hhcmFjdGVycyBhcmUgdHJpbW1lZAojIDMpIGlmIGZhbHNlLCB0aGUgbmFtZSBpcyByZXRhaW5lZCBhcyBpcyAoZS5nLiBmb3IgdG1lIGN0bCBzYW1wbGVzKQphbXNfcmVzdWx0c190bWUuZGYkSUQgPC0gaWZlbHNlKHN1YnN0cihzdWJzdHIoYW1zX3Jlc3VsdHNfdG1lLmRmJFNhbXBsZU5hbWUsIDEsIG5jaGFyKGFtc19yZXN1bHRzX3RtZS5kZiRTYW1wbGVOYW1lKS0xKSwKICAgICAgICAgICAgICBuY2hhcihzdWJzdHIoYW1zX3Jlc3VsdHNfdG1lLmRmJFNhbXBsZU5hbWUsIDEsIG5jaGFyKGFtc19yZXN1bHRzX3RtZS5kZiRTYW1wbGVOYW1lKS0xKSksCiAgICAgICAgICAgICAgbmNoYXIoc3Vic3RyKGFtc19yZXN1bHRzX3RtZS5kZiRTYW1wbGVOYW1lLCAxLCBuY2hhcihhbXNfcmVzdWx0c190bWUuZGYkU2FtcGxlTmFtZSktMSkpKSA9PSAiLSIsCiAgICAgICBzdWJzdHIoYW1zX3Jlc3VsdHNfdG1lLmRmJFNhbXBsZU5hbWUsIDEsIG5jaGFyKGFtc19yZXN1bHRzX3RtZS5kZiRTYW1wbGVOYW1lKS0yKSwKICAgICAgIGFtc19yZXN1bHRzX3RtZS5kZiRTYW1wbGVOYW1lKQphbXNfcmVzdWx0c190bWUuZGYkVHlwZSA8LSBpZmVsc2UoZ3JlcGwoIkciLCBhbXNfcmVzdWx0c190bWUuZGYkSUQpLCAiRyIsICJGIikKCiMgbWVyZ2UgYXJjIGFuZCByZXdldCAxNEMgZGF0YSB3aXRoIHRlbXBsYXRlCmlmKG5yb3cobWVyZ2UoYWxsLjE0Yy50ZW1wbGF0ZSwgYW1zX3Jlc3VsdHNfYXJjX3Jld2V0LmRmLCBhbGwueCA9IFRSVUUpKSA9PSBucm93KGFsbC4xNGMudGVtcGxhdGUpKSB7CiAgYWxsLjE0YyA8LSBtZXJnZShhbGwuMTRjLnRlbXBsYXRlLCBhbXNfcmVzdWx0c19hcmNfcmV3ZXQuZGYsIGFsbC54ID0gVFJVRSkKfSBlbHNlIHsKICBjYXQoImR1cGxpY2F0ZSBzYW1wbGUgbWVyZ2UgZXJyb3IiKQp9CgojIG1lcmdlIHNvaWwgb2JzIGRhdGEgd2l0aCAxNGMgZGF0YQppZihucm93KG1lcmdlKGFsbC4xNGMsIHRzLmVwc24uYXZnLCBieSA9IGMoIlNhbXBsZU5hbWUiLCAiUGVyaW9kIikpKSA9PSBucm93KGFsbC4xNGMpKSB7CiAgYWxsLjE0YyA8LSBtZXJnZShhbGwuMTRjLCB0cy5lcHNuLmF2ZywgYWxsLnggPSBUUlVFKQp9IGVsc2UgewogIGNhdCgiZHVwbGljYXRlIHNhbXBsZSBtZXJnZSBlcnJvciIpCn0KCiMgbWVyZ2UgdG1lIDE0QyBkYXRhIHdpdGggdGVtcGxhdGUgYW5kIHRzLmVwc24uYXZnCnRtZS4xNGMgPC0gbWVyZ2UodG1lLjE0Yy50ZW1wbGF0ZSwgYW1zX3Jlc3VsdHNfdG1lLmRmLCBhbGwueCA9IFRSVUUpCgojIGFkZCBjdGwgc2FtcGxlIDE0QyBkYXRhIHRvIHRtZS4xNGMKIyBmaXJzdCByZW1vdmUgTkEgdmFsdWVzCnRtZS4xNGMuY2xlYW4gPC0gdG1lLjE0Y1t3aGljaCghaXMubmEodG1lLjE0YyRkMTRjKSB8ICFpcy5uYSh0bWUuMTRjJGZtKSksIF0KIyBkZWZpbmUgbWVyZ2UgZngKdG1lLm1yZy5meCA8LSBmdW5jdGlvbih4LCB5KSB7CiAgbXJnLm5tcyA8LSBjKCJTYW1wbGVOYW1lIiwgIklEIiwgIlRyZWF0bWVudCIsICJQZXJpb2QiKQogIHZhci5ubXMgPC0gYygiWWVhclNhbXBsZWQiLCAiU2l0ZSIsICJIb3Jpem9uIiwgICJkMTRjIiwgImZtIikKICBpZihsZW5ndGgoZ3JlcCgiZm0iLCBuYW1lcyh5KSkpID4gMCkgewogICAgZGYgPC0gbWVyZ2UoeFsgLCBtcmcubm1zXSwgeVsgLCBjKG1yZy5ubXMsIHZhci5ubXMpXSkKICB9IGVsc2UgewogICAgZGYgPC0gbWVyZ2UoeFsgLCBtcmcubm1zXSwgeVsgLCBjKG1yZy5ubXMsIHZhci5ubXNbMTo0XSldKQogICAgZGYkZm0gPC0gTkEKICB9CiAgcmV0dXJuKGRmKQp9Cgp0bWUuMTRjLmRmIDwtIHN1cHByZXNzTWVzc2FnZXMoYmluZF9yb3dzKGxhcHBseShsaXN0KHRtZS5jdGwuZHVrLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRtZS5jdGwuZmx4LnNyYVt3aGljaCghaXMubmEodG1lLmN0bC5mbHguc3JhJGQxNGMpKSwgXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bWUuY3RsLm9ybmwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG1lLm1pc2MpLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24oaSkgdG1lLm1yZy5meCh0bWUuMTRjLCBpKSkpKQoKIyBhZGQgc3RvcmFnZSBkdXJhdGlvbiBkYXRhIGZvciB0cmVhdG1lbnQgc2FtcGxlcyBhbmFseXplZCBleHRlcm5hbGx5CnRtZS4xNGMuZGYkVHlwZSA8LSAiRiIKCiMgYWRkIFllYXJTYW1wbGVkIGZvciB0bWUuMTRjLmNsZWFuIHNhbXBsZXMKZm9yKGkgaW4gMTpucm93KHRtZS4xNGMuY2xlYW4pKSB7CiAgaWYodG1lLjE0Yy5jbGVhbltpLCAiU2l0ZSJdID09ICJEdWtlIikgewogICAgdG1lLjE0Yy5jbGVhbltpLCAiWWVhclNhbXBsZWQiXSA8LSAyMDA4CiAgfSBlbHNlIGlmKHRtZS4xNGMuY2xlYW5baSwgIlNpdGUiXSA9PSAiSGFpbmljaCIpIHsKICAgIHRtZS4xNGMuY2xlYW5baSwgIlllYXJTYW1wbGVkIl0gPC0gMjAxMQogIH0gZWxzZSBpZih0bWUuMTRjLmNsZWFuW2ksICJTaXRlIl0gPT0gIlNpZXJyYSIpIHsKICAgIHRtZS4xNGMuY2xlYW5baSwgIlllYXJTYW1wbGVkIl0gPC0gMjAwOQogIH0gZWxzZSB7CiAgICB0bWUuMTRjLmNsZWFuW2ksICJZZWFyU2FtcGxlZCJdIDwtIDIwMDQKICB9Cn0KCiMgQWRkIEhvcml6b24gdG8gdG1lLjE0Yy5jbGVhbgp0bWUuMTRjLmNsZWFuJEhvcml6b24gPC0gaWZlbHNlKHRtZS4xNGMuY2xlYW4kSUQgPT0gIk1CIiB8IHRtZS4xNGMuY2xlYW4kSUQgPT0gIlNCIiwgIkIiLCAiQSIpCgojIGNvbWJpbmUgdG1lIGRhdGEKdG1lLjE0YyA8LSBiaW5kX3Jvd3ModG1lLjE0Yy5jbGVhblsgLCBuYW1lcyh0bWUuMTRjLmRmKV0sIHRtZS4xNGMuZGYpCnRtZS4xNGMkRXhwZXJpbWVudCA8LSAidG1lIgoKIyByZW1vdmUgb3V0bGllciAoTUEtMSkKIyAqKiogTmVlZCB0byBjbGFyaWZ5IG1ldGhvZCBmb3IgZGV0ZXJtaW5pbmcgdGhhdCB0aGlzIGlzIGFuIG91dGxpZXIgKioqIAp0bWUuMTRjIDwtIHRtZS4xNGNbLXdoaWNoKHRtZS4xNGMkU2FtcGxlTmFtZSA9PSAiTUEtMSIgfCB0bWUuMTRjJFNhbXBsZU5hbWUgPT0gIkhFVzQ5LTEiIHwgdG1lLjE0YyRTYW1wbGVOYW1lID09ICJIRVcyNi0xIiksIF0KCgojIEFkZCBtaXNzaW5nIHZhcmlhYmxlIGNvbHVtbnMgdG8gYWxsLjE0YwojIGFkZCBZZWFyU2FtcGxlZCBjb2x1bW4KYWxsLjE0YyRZZWFyU2FtcGxlZCA8LSBpZmVsc2UoYWxsLjE0YyRFeHBlcmltZW50ID09ICJhcmMiLCAyMDExLCAyMDE5KQoKIyBhZGQgU2l0ZSBhbmQgSG9yaXpvbiBjb2x1bW5zCmFsbC4xNGMkU2l0ZSA8LSBpZmVsc2UoZ3JlcGwoIkhFIiwgYWxsLjE0YyRJRCksICJIYWluaWNoIiwgIlNjaG9yZmhlaWRlIikKYWxsLjE0YyRIb3Jpem9uIDwtICJBIgoKCiMgY29tYmluZSB0bWUuMTRjIGFuZCBhbGwuMTRjIGludG8gYSBsaXN0IGFuZCBjYWxjdWxhdGUgZnJhY3Rpb24gbW9kZXJuIGZyb20gZDE0QyBhcyBuZWVkZWQKYWxsLjE0Yy5scyA8LSBsYXBwbHkobGlzdCh0bWUuMTRjLCBhbGwuMTRjKSwgZnVuY3Rpb24oZGYpIHsKICBkZiRmbSA8LSBpZmVsc2UoaXMubmEoZGYkZm0pLAogICAgICAgICAgICAgICAgICBkMTRjLmZtLmZ4KGRmJFllYXJTYW1wbGVkLCBkZiRkMTRjKSwKICAgICAgICAgICAgICAgICAgZGYkZm0pCiAgZGYkZDE0Y19jb3JyIDwtIGRlY2F5LmNvcnIuZngoZGYkWWVhclNhbXBsZWQsIGRmJGZtKQogIHJldHVybihkZikKfSkKCmFsbC4xNGMuc3VtIDwtIGxhcHBseShhbGwuMTRjLmxzLCBmdW5jdGlvbihkZikgewogIGRmLnN1bSA8LSBzZWxlY3QoZGYsIC1TYW1wbGVOYW1lKSAlPiUKICAgIGdyb3VwX2J5KElELCBUeXBlLCBQZXJpb2QsIFRyZWF0bWVudCwgRXhwZXJpbWVudCwgU2l0ZSwgSG9yaXpvbiwgWWVhclNhbXBsZWQpICU+JQogICAgc3VtbWFyaXNlX2FsbChsaXN0KG1lYW4gPSBtZWFuLCBtYXggPSBtYXgsIG1pbiA9IG1pbiksIG5hLnJtID0gVFJVRSkKICBkZi5zdW1bbWFwcGx5KGlzLmluZmluaXRlLCBkZi5zdW0pXSA8LSBOQQogIHJldHVybihkZi5zdW0pCn0pCmFsbC4xNGMuc3VtIDwtIHJhcHBseShhbGwuMTRjLnN1bSwgZiA9IGZ1bmN0aW9uKHgpIGlmZWxzZShpcy5uYW4oeCksIE5BICwgeCksIGhvdyA9ICJyZXBsYWNlIikKYWxsLjE0Yy5zdW0uZGYgPC0gc3VwcHJlc3NNZXNzYWdlcyhiaW5kX3Jvd3MoYWxsLjE0Yy5zdW0pKQpgYGAKCmBgYHtyIHJlYWQtY2FsYy0xM2N9CiMgQ2xlYW4gdXAgMTNDIGRhdGEKIyBOb3RlIHRoYXQgaXNvIGRhdGEgSURzIHNob3VsZCBiZSBzdG9yZWQgYXMgdGhlICJwcmVwYXJhdGlvbiIgdmFyaWFibGUKCiMgZmlyc3QgY3JlYXRlIGEgbGlicmFyeSBvZiBwb3NzaWJsZSBJRHMKYWxsLmlkcyA8LSB1bmlxdWUoYyhhbGwuMTRjLnRlbXBsYXRlJElELCB0bWUuMTRjLnRlbXBsYXRlJElEKSkKCiMgZnVuY3Rpb24gdG8gc3RyaXAgb3V0IGFsbCB2YWx1ZXMgbm90IGNvcnJlc3BvbmRpbmcgdG8ga25vd24gSURzIGFuZCByZXR1cm4gbWVhbiBvZiBkdXBsaWNhdGVzCmNsZWFuLmlzbyA8LSBmdW5jdGlvbihkZikgewogIAogICMgc3RyaXAgb3V0IG5vbiBhcmMtaW5jIGRhdGEKICBpeCA8LSB2ZWN0b3IobW9kZSA9ICJsaXN0IiwgbGVuZ3RoID0gbGVuZ3RoKGFsbC5pZHMpKQogIGZvcihpIGluIHNlcV9hbG9uZyhhbGwuaWRzKSkgewogICAgaWYoYW55KGdyZXBsKGFsbC5pZHNbaV0sIGRmJHByZXBhcmF0aW9uKSkpIHsKICAgICAgaXhbW2ldXSA8LSB3aGljaChncmVwbChhbGwuaWRzW2ldLCBkZiRwcmVwYXJhdGlvbikpCiAgICB9IAogIH0KICAKICBpeCA8LSB1bmxpc3QoaXgpCiAgCiAgIyBjb252ZXJ0IDEzQyBjb2wgdG8gbnVtZXJpYwogIGRmIDwtIGRhdGEuZnJhbWUoZGZbaXgsIF0pCiAgZGYkb2Zmc2V0LmNvcnIuc2FtcGxlIDwtIGFzLm51bWVyaWMoZGYkb2Zmc2V0LmNvcnIuc2FtcGxlKQogIAogICMgY29udmVydCB0byBkYXRhIGZyYW1lIGZyb20gdGliYmxlCiAgZGYgPC0gZGF0YS5mcmFtZShkZikKICAKICAjIGF2ZXJhZ2UgZHVwbGljYXRlcwogIGQxM2MgPC0gdmVjdG9yKCkKICBmb3IoaSBpbiBzZXFfYWxvbmcoZGYkcHJlcGFyYXRpb24pKSB7CiAgICAgICAgaWYoaSAhPSBucm93KGRmKSkgewogICAgICAgICAgZDEzY1tpXSA8LSBpZmVsc2UoZGZbaSwgInByZXBhcmF0aW9uIl0gPT0gZGZbaSArIDEsICJwcmVwYXJhdGlvbiJdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVhbihkZltpLCAib2Zmc2V0LmNvcnIuc2FtcGxlIl0sIGRmW2krMSwgIm9mZnNldC5jb3JyLnNhbXBsZSJdLCBuYS5ybSA9IFRSVUUpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgTkEpCiAgICAgIH0KICB9CiAgZGYgPC0gZGZbY29tcGxldGUuY2FzZXMoZGYkb2Zmc2V0LmNvcnIuc2FtcGxlKSwgXQogIHJldHVybihkYXRhLmZyYW1lKFNhbXBsZU5hbWUgPSB1bmlxdWUoZGYkcHJlcGFyYXRpb24pLAogICAgICAgICAgICAgICAgICAgIGQxM2MgPSBkMTNjW2NvbXBsZXRlLmNhc2VzKGQxM2MpXSkpCn0KCmlzb19yZXN1bHRzX2xzX2NsZWFuIDwtIGxhcHBseShpc29fcmVzdWx0c19scywgZnVuY3Rpb24oZGYpIHsKICBsYXBwbHkoZGYsIGNsZWFuLmlzbykKfSkKCiMgYWRkIGluIEV4cGVyaW1lbnQsIHRyZWF0bWVudCwgcGVyaW9kLCBldGMuCiMgMS4gaXNvX2plbmFfcmVzdWx0cy1jbzJfMjAxOS0wMS0yMgojIyAxM0NfYXJjaGl2ZWNJbmNfUHJlXzIwMTgxMjA3LTE0MTY5MS0xNDE3NTEueGxzCmlzb19yZXN1bHRzX2xzX2NsZWFuW1sxXV1bWzFdXVsiUGVyaW9kIl0gPC0gInByZSIKaXNvX3Jlc3VsdHNfbHNfY2xlYW5bWzFdXVtbMV1dWyJFeHBlcmltZW50Il0gPC0gImFyYyIKaXNvX3Jlc3VsdHNfbHNfY2xlYW5bWzFdXVtbMV1dWyJUcmVhdG1lbnQiXSA8LSAiYWlyLWRyeSArIHN0b3JhZ2UiCgojIyAxM0NfYXJjaGl2ZWRJbmNfMjAxOTAxMTYtMTQyMDEyLTE0MjA3Mi54bHMKaXNvX3Jlc3VsdHNfbHNfY2xlYW5bWzFdXVtbMl1dWyJQZXJpb2QiXSA8LSAiaW5jIgppc29fcmVzdWx0c19sc19jbGVhbltbMV1dW1syXV1bIkV4cGVyaW1lbnQiXSA8LSAiYXJjIgppc29fcmVzdWx0c19sc19jbGVhbltbMV1dW1syXV1bIlRyZWF0bWVudCJdIDwtICJhaXItZHJ5ICsgc3RvcmFnZSIKCiMgMi4gaXNvX2plbmFfcmVzdWx0cy1jbzJfMjAxOS0wMS0yMwojIyAyMDE5MDEyMi1NYW51ZWxSb3N0LTE0MjA4Mi0xNDE1NTMueGxzYAppc29fcmVzdWx0c19sc19jbGVhbltbMl1dW1sxXV1bIlBlcmlvZCJdIDwtICJpbmMiCmlzb19yZXN1bHRzX2xzX2NsZWFuW1syXV1bWzFdXVsiRXhwZXJpbWVudCJdIDwtICJhcmMiCmlzb19yZXN1bHRzX2xzX2NsZWFuW1syXV1bWzFdXVsiVHJlYXRtZW50Il0gPC0gImFpci1kcnkgKyBzdG9yYWdlIgoKIyAzLiBpc29famVuYV9yZXN1bHRzLWNvMl8yMDE5LTA5LTEwCiMjIDIwMTkwOTA5LTJXaC1KZWZmcmV5X0JlZW0tTWlsbGVyLTEzNjEzLTEzNjU4Lnhscwppc29fcmVzdWx0c19sc19jbGVhbltbM11dW1sxXV1bIlBlcmlvZCJdIDwtICJwcmUiCmlzb19yZXN1bHRzX2xzX2NsZWFuW1szXV1bWzFdXVsiRXhwZXJpbWVudCJdIDwtICJyZXdldCIKaXNvX3Jlc3VsdHNfbHNfY2xlYW5bWzNdXVtbMV1dWyJUcmVhdG1lbnQiXSA8LSAiY29udHJvbCIKCiMgNC4gaXNvX2plbmFfcmVzdWx0cy1jbzJfMjAxOS0wOS0xMQojIyAyMDE5MDkxMC1KZWZmcmV5X0JlZW0tTWlsbGVyLTEzNjY0LTEzNzAyLnhscwppc29fcmVzdWx0c19sc19jbGVhbltbNF1dW1sxXV1bIlBlcmlvZCJdIDwtICJpbmMiCmlzb19yZXN1bHRzX2xzX2NsZWFuW1s0XV1bWzFdXVsiRXhwZXJpbWVudCJdIDwtICJyZXdldCIKaXNvX3Jlc3VsdHNfbHNfY2xlYW5bWzRdXVtbMV1dWyJUcmVhdG1lbnQiXSA8LSAiY29udHJvbCIKCiMgNS4gaXNvX2plbmFfcmVzdWx0cy1jbzJfMjAxOS0xMi0wNAojIyAyMDE5MTEyNi1NUm9zdC1CZWVtTWlsbGVyLTE3NTA5LTE3NTU1Lnhscwppc29fcmVzdWx0c19sc19jbGVhbltbNV1dW1sxXV1bIlBlcmlvZCJdIDwtICJpbmMiCmlzb19yZXN1bHRzX2xzX2NsZWFuW1s1XV1bWzFdXVsiRXhwZXJpbWVudCJdIDwtICJyZXdldCIKaXNvX3Jlc3VsdHNfbHNfY2xlYW5bWzVdXVtbMV1dWyJUcmVhdG1lbnQiXSA8LSAiYWlyLWRyeSIKCiMgNi4gaXNvX2plbmFfcmVzdWx0cy1jbzJfMjAxOS0xMi0yMQojIyAyMDE5MDIxMy1NYW51ZWxSb3N0LTE0MzE5Mi0xNDMyOTQueGxzCmlzb19yZXN1bHRzX2xzX2NsZWFuW1s2XV1bWzFdXVsiUGVyaW9kIl0gPC0gImluYyIKaXNvX3Jlc3VsdHNfbHNfY2xlYW5bWzZdXVtbMV1dWyJFeHBlcmltZW50Il0gPC0gImFyYyIKaXNvX3Jlc3VsdHNfbHNfY2xlYW5bWzZdXVtbMV1dWyJUcmVhdG1lbnQiXSA8LSAiYWlyLWRyeSArIHN0b3JhZ2UiCgojIyAyMDE5MTEwNi1NUm9zdC0xNjkyNS0xNjk1Mi54bHMKaXNvX3Jlc3VsdHNfbHNfY2xlYW5bWzZdXVtbMl1dWyJQZXJpb2QiXSA8LSAiaW5jIgppc29fcmVzdWx0c19sc19jbGVhbltbNl1dW1syXV1bIkV4cGVyaW1lbnQiXSA8LSAicmV3ZXQiCmlzb19yZXN1bHRzX2xzX2NsZWFuW1s2XV1bWzJdXVsiVHJlYXRtZW50Il0gPC0gImNvbnRyb2wiCgojIyBBcmNJbmNfZHJ5XzEzQy54bHMKaXNvX3Jlc3VsdHNfbHNfY2xlYW5bWzZdXVtbM11dWyJQZXJpb2QiXSA8LSAicHJlIgppc29fcmVzdWx0c19sc19jbGVhbltbNl1dW1szXV1bIkV4cGVyaW1lbnQiXSA8LSAicmV3ZXQiCmlzb19yZXN1bHRzX2xzX2NsZWFuW1s2XV1bWzNdXVsiVHJlYXRtZW50Il0gPC0gImFpci1kcnkiCgojIEZsYXR0ZW4gbGlzdAppc29fZGYgPC0gc3VwcHJlc3NXYXJuaW5ncyhiaW5kX3Jvd3ModW5saXN0KGlzb19yZXN1bHRzX2xzX2NsZWFuLCByZWN1cnNpdmUgPSBGQUxTRSkpKQoKIyBleHRyYWN0IG9yaWdpbmFsIElEcwpvZy5zbiA8LSB2ZWN0b3IoKQpmb3IoaSBpbiBzZXFfYWxvbmcoaXNvX2RmJFNhbXBsZU5hbWUpKSB7CiAgb2cuc25baV0gPC0gaWZlbHNlKGdyZXBsKCJIRSIsIGlzb19kZiRTYW1wbGVOYW1lW2ldKSwKICAgICAgICAgICAgICAgICAgICAgc3Vic3RyKGlzb19kZiRTYW1wbGVOYW1lW2ldLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0ID0gdW5saXN0KGdyZWdleHByKCJIRSIsIGlzb19kZiRTYW1wbGVOYW1lW2ldKSksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RvcCA9IHVubGlzdChncmVnZXhwcigiSEUiLCBpc29fZGYkU2FtcGxlTmFtZVtpXSkpICsgNCksCiAgICAgICAgICAgICAgICAgICAgIHN1YnN0cihpc29fZGYkU2FtcGxlTmFtZVtpXSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydCA9IHVubGlzdChncmVnZXhwcigiU0UiLCBpc29fZGYkU2FtcGxlTmFtZVtpXSkpLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0b3AgPSB1bmxpc3QoZ3JlZ2V4cHIoIlNFIiwgaXNvX2RmJFNhbXBsZU5hbWVbaV0pKSArIDQpKQp9Cmlzb19kZiRJRCA8LSBvZy5zbgppc29fZGYkVHlwZSA8LSBpZmVsc2UoZ3JlcGwoIkciLCBpc29fZGYkSUQpLCAiRyIsICJGIikKCiMgYWRkIGNvbnRyb2wgc2FtcGxlIDEzQyBmb3IgYXJjIGV4cGVyaW1lbnQKYXJjLmN0bC5pbmMuSURzIDwtIHVuaXF1ZShpc29fZGZbaXNvX2RmJEV4cGVyaW1lbnQgPT0gImFyYyIgJiBpc29fZGYkUGVyaW9kID09ICJpbmMiLCAiSUQiXSkKYXJjLmN0bC5pbmMuMTNjIDwtIGRhdGEuZnJhbWUoSUQgPSBhcmMuY3RsLmluYy5JRHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNhbXBsZU5hbWUgPSBhcmMuY3RsLmluYy5JRHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQxM2MgPSB4cGxyLmN0bC5pc29bd2hpY2goIWlzLm5hKG1hdGNoKHhwbHIuY3RsLmlzbyRFUF9QbG90aWQsIGFyYy5jdGwuaW5jLklEcykpKSwgIjEzY19DTzIiXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXhwZXJpbWVudCA9ICJhcmMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQZXJpb2QgPSAiaW5jIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHJlYXRtZW50ID0gImNvbnRyb2wiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUeXBlID0gaWZlbHNlKGdyZXBsKCJHIiwgYXJjLmN0bC5pbmMuSURzKSwgIkciLCAiRiIpKQppc29fZGYgPC0gcmJpbmQoaXNvX2RmLCBhcmMuY3RsLmluYy4xM2MpCiMgZ2dwbG90KGlzb19kZiwgYWVzKElELCBkMTNjLCBjb2xvciA9IFRyZWF0bWVudCwgc2hhcGUgPSBQZXJpb2QpKSArCiMgICAgIGdlb21fcG9pbnQoc2l6ZSA9IDMpICsKIyAgICAgZmFjZXRfZ3JpZChyb3dzID0gdmFycyhFeHBlcmltZW50KSkgKwojICAgICB0aGVtZV9idygpCmBgYAoKCmBgYHtyIGNvdW50cyBmb3IgY2hlY2tpbmcgcGxvdHMsIGluY2x1ZGUgPSBGQUxTRX0KIyA4LiBDb3VudCBudW1iZXIgb2YgXjE0XkMgb2JzZXJ2YXRpb25zIGZvciBjaGVja2luZyBwbG90cy4KIyBjb3VudCAhaXMubmEoMTRDKSBjYXNlcyBieSBTYW1wbGVOYW1lCmFsbC4xNGNbLXdoaWNoKGlzLm5hKGFsbC4xNGMkZDE0Y19jb3JyKSksXSAlPiUKICBncm91cF9ieShFeHBlcmltZW50LCBUcmVhdG1lbnQsIFBlcmlvZCwgVHlwZSkgJT4lCiAgY291bnQoKQojIGJ5IElECmFsbC4xNGNbLXdoaWNoKGlzLm5hKGFsbC4xNGMkZDE0Y19jb3JyKSksXSAlPiUKICBncm91cF9ieShFeHBlcmltZW50LCBUcmVhdG1lbnQsIFBlcmlvZCwgVHlwZSkgJT4lCiAgZGlzdGluY3QoSUQpICU+JQogIGNvdW50KCkKYGBgCgoqUHJlLWluY3ViYXRpb24gdmVyc3VzIGVxdWlsaWJyaXVtIHJlc3BpcmF0aW9uIF4xNF5DLUNPfjJ+KgoKYGBge3IgcHJlLWluYy0xNGMtcGxvdH0KYWxsLjE0Yy5wcmUuaW5jIDwtIG1lcmdlKGFsbC4xNGMuc3VtLmRmW2FsbC4xNGMuc3VtLmRmJFBlcmlvZCA9PSAicHJlIiwgYygiSUQiLCAiRXhwZXJpbWVudCIsICJUeXBlIiwgIlRyZWF0bWVudCIsICJkMTRjX2NvcnJfbWVhbiIsICJkMTRjX2NvcnJfbWluIiwgImQxNGNfY29ycl9tYXgiKV0sCiAgICAgICAgICAgICAgICAgICAgICAgICBhbGwuMTRjLnN1bS5kZlthbGwuMTRjLnN1bS5kZiRQZXJpb2QgPT0gImluYyIsIGMoIklEIiwgIkV4cGVyaW1lbnQiLCAiVHlwZSIsICJUcmVhdG1lbnQiLCAiZDE0Y19jb3JyX21lYW4iLCAiZDE0Y19jb3JyX21pbiIsICJkMTRjX2NvcnJfbWF4IildLAogICAgICAgICAgICAgICAgICAgICAgICAgYnkgPSBjKCJJRCIsICJFeHBlcmltZW50IiwgIlR5cGUiLCAiVHJlYXRtZW50IiksCiAgICAgICAgICAgICAgICAgICAgICAgICBzdWZmaXhlcyA9IGMoIl9wcmUiLCAiX2luYyIpKQphbGwuMTRjLnByZS5pbmMkdHJlYXQuYmkgPC0gaWZlbHNlKGFsbC4xNGMucHJlLmluYyRUcmVhdG1lbnQgPT0gImNvbnRyb2wiLCAiY29udHJvbCIsICJ0cmVhdG1lbnQiKQoKIyBzYXZlCnNhdmUoYWxsLjE0Yy5wcmUuaW5jLCBmaWxlID0gIi4vYWxsLjE0Yy5wcmUuaW5jLlJEYXRhIikKCmFsbC4xNGMucHJlLmluYyAlPiUKICBmaWx0ZXIoRXhwZXJpbWVudCAhPSAidG1lIikgJT4lCiAgZ2dwbG90KC4sIGFlcyhkMTRjX2NvcnJfbWVhbl9wcmUsIGQxNGNfY29ycl9tZWFuX2luYywgY29sb3IgPSBUeXBlLCBzaGFwZSA9IFRyZWF0bWVudCkpICsKICBnZW9tX2FibGluZShzbG9wZSA9IDEsIGludGVyY2VwdCA9IDApICsKICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAwLCBjb2xvciA9ICJncmF5IikgKwogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDAsIGNvbG9yID0gImdyYXkiKSArCiAgZ2VvbV9wb2ludChzaXplID0gMykgKwogIGdlb21fZXJyb3JiYXIoCiAgICBhZXMoeW1pbiA9IGQxNGNfY29ycl9taW5faW5jLCAKICAgICAgICB5bWF4ID0gZDE0Y19jb3JyX21heF9pbmMsIAogICAgICAgIGNvbG9yID0gVHlwZSksIAogICAgd2lkdGggPSAuMjUpICsKICBnZW9tX2Vycm9yYmFyaCgKICAgIGFlcyh4bWluID0gZDE0Y19jb3JyX21pbl9wcmUsIAogICAgICAgIHhtYXggPSBkMTRjX2NvcnJfbWF4X3ByZSwgCiAgICAgICAgY29sb3IgPSBUeXBlKSwgCiAgICBoZWlnaHQgPSAuOSkgKwogIHNjYWxlX2NvbG9yX21hbnVhbChuYW1lID0gJ0Vjb3N5c3RlbScsCiAgICAgICAgICAgICAgICAgICAgIHZhbHVlcyA9YygnRic9JyNhMzU1MTMnLCdHJz0nIzEzNjFhMycpLAogICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBjKCdGb3Jlc3QnLCdHcmFzc2xhbmQnKSkgKwogIHNjYWxlX3NoYXBlX21hbnVhbChuYW1lID0gJ1RyZWF0bWVudCcsCiAgICAgICAgICAgICAgICAgICAgIHZhbHVlcyA9IGMoImNvbnRyb2wiID0gMTYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFpci1kcnkiID0gMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYWlyLWRyeSArIHN0b3JhZ2UiID0gMCksCiAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGMoImNvbnRyb2wiID0gImNvbnRyb2wtMiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFpci1kcnkiID0gImFpci1kcnkvcmV3ZXQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhaXItZHJ5ICsgc3RvcmFnZSIgPSAiYWlyLWRyeS9yZXdldCArIHN0b3JhZ2UiKSkgKwogIHNjYWxlX3hfY29udGludW91cyhsaW1pdHMgPSBjKC02MCwgMTE1KSkgKwogIHNjYWxlX3lfY29udGludW91cyhsaW1pdHMgPSBjKC02MCwgMTE1KSkgKwogIHhsYWIoZXhwcmVzc2lvbignUmV3ZXR0aW5nIHB1bHNlICcqRGVsdGEqJydeMTQqJ0MtQ08nWzJdKicgKOKAsCknKSkgKwogIHlsYWIoZXhwcmVzc2lvbignRXF1aWxpYnJpdW0gcmVzcGlyYXRpb24gJypEZWx0YSonJ14xNConQy1DTydbMl0qJyAo4oCwKScpKSArCiAgdGhlbWVfYncoKSArCiAgdGhlbWUocGFuZWwuZ3JpZCA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICBsZWdlbmQua2V5LmhlaWdodD11bml0KC44LCAiY20iKSwKICAgICAgICBhc3BlY3QucmF0aW8gPSAxKQpgYGAKPioqRmlnLiBgciB7ZmlnLm4gKyAxfWAuICRcRGVsdGEkXjE0XkMtQ09+Mn4gb2YgdGhlIHJld2V0dGluZyBwdWxzZSBhbmQgdGhlIGVxdWlsaWJyaXVtIHJlc3BpcmF0aW9uIHBlcmlvZCoqCgo+KkNhcHRpb246KiBQb2ludHMgYXJlIG1lYW5zIG9mIGxhYm9yYXRvcnkgZHVwbGljYXRlcyBhbmQgZXJyb3IgYmFycyBhcmUgdGhlIG1pbiBhbmQgbWF4IChleGNlcHQgZm9yIEV4cGVyaW1lbnQgMSBjb250cm9sIHNhbXBsZXMsIHdoaWNoIHdlcmUgbm90IHJlcGxpY2F0ZWQpLiBOb3RlIHRoYXQgcmV3ZXR0aW5nIHB1bHNlICRcRGVsdGEkXjE0XkMgd2FzIG5vdCBtZWFzdXJlZCBmb3IgY29udHJvbC0xIHNhbXBsZXM7IGFkZGl0aW9uYWxseSBzYW1wbGVzIGZyb20gdGhyZWUgb2YgdGhlIGZvcmVzdCBwbG90cyBvZiB0aGUgYWlyLWRyeSArIHN0b3JhZ2Ugc2FtcGxlcyBmcm9tIEV4cGVyaW1lbnQgMSBmYWlsZWQgdG8gYWNjdW11bGF0ZSBlbm91Z2ggQ09+Mn4gZHVyaW5nIHRoZSBwcmUtaW5jdWJhdGlvbiBwZXJpb2QgdG8gbWVhc3VyZSAkXERlbHRhJF4xNF5DLiBUaGUgb3V0bGllciBwb2ludCB3aXRoIHRoZSBzdWJzdGFudGlhbGx5IGRlcGxldGVkIHByZS1pbmN1YmF0aW9uICRcRGVsdGEkXjE0XkMgaXMgZnJvbSBFeHBlcmltZW50IDIgKGNvbnRyb2wpLgoKYGBge3IgcHJlLWluYy0xM2MtcGxvdCwgaW5jbHVkZSA9IEZBTFNFfQppc28uMTIuYXZnIDwtIGlzb19kZiAlPiUKICBzZWxlY3QoSUQsIEV4cGVyaW1lbnQsIFBlcmlvZCwgVHJlYXRtZW50LCBkMTNjKSAlPiUKICBncm91cF9ieShJRCwgRXhwZXJpbWVudCwgUGVyaW9kLCBUcmVhdG1lbnQpICU+JQogIGFkZF9jb3VudCgpICU+JQogIHN1bW1hcml6ZV9hbGwobGlzdChtZWFuID0gbWVhbiwgc2QgPSBzZCksIG5hLnJtID0gVFJVRSkgJT4lCiAgbXV0YXRlKGQxM2Nfc2UgPSBkMTNjX3NkL25fbWVhbiwKICAgICAgICAgIGQxM2NfdSA9IGQxM2NfbWVhbiArIGQxM2Nfc2UqMiwKICAgICAgICAgIGQxM2NfbCA9IGQxM2NfbWVhbiAtIGQxM2Nfc2UqMikKCmlzby4xMi5hdmckVHlwZSA8LSBpZmVsc2UoZ3JlcGwoIkciLCBpc28uMTIuYXZnJElEKSwgIkciLCAiRiIpCmlzby4xMi5hdmcgPC0gZGF0YS5mcmFtZShpc28uMTIuYXZnKQoKIyBzdGF0cwojIGFpci1kcnkgKyBzdG9yYWdlCiMgZm9yZXN0CnQudGVzdChpc28uMTIuYXZnW2lzby4xMi5hdmckUGVyaW9kID09ICJpbmMiICYgaXNvLjEyLmF2ZyRUcmVhdG1lbnQgPT0gImFpci1kcnkgKyBzdG9yYWdlIiAmIGlzby4xMi5hdmckVHlwZSA9PSAiRiIsICJkMTNjX21lYW4iXSwKICAgICAgIGlzby4xMi5hdmdbaXNvLjEyLmF2ZyRQZXJpb2QgPT0gImluYyIgJiBpc28uMTIuYXZnJEV4cGVyaW1lbnQgPT0gImFyYyIgJiBpc28uMTIuYXZnJFRyZWF0bWVudCA9PSAiY29udHJvbCIgJiBpc28uMTIuYXZnJFR5cGUgPT0gIkYiLCAiZDEzY19tZWFuIl0sIAogICAgICAgdGFpbHMgPSAyLCBwYWlyZWQgPSBUUlVFKQoKIyBncmFzc2xhbmQKdC50ZXN0KGlzby4xMi5hdmdbaXNvLjEyLmF2ZyRQZXJpb2QgPT0gImluYyIgJiBpc28uMTIuYXZnJFRyZWF0bWVudCA9PSAiYWlyLWRyeSArIHN0b3JhZ2UiICYgaXNvLjEyLmF2ZyRUeXBlID09ICJHIiwgImQxM2NfbWVhbiJdLAogICAgICAgaXNvLjEyLmF2Z1tpc28uMTIuYXZnJFBlcmlvZCA9PSAiaW5jIiAmIGlzby4xMi5hdmckRXhwZXJpbWVudCA9PSAiYXJjIiAmIGlzby4xMi5hdmckVHJlYXRtZW50ID09ICJjb250cm9sIiAmIGlzby4xMi5hdmckVHlwZSA9PSAiRyIsICJkMTNjX21lYW4iXSwKICAgICAgIHRhaWxzID0gMiwgcGFpcmVkID0gVFJVRSkKCiMgYWlyLWRyeSBvbmx5CiMgZm9yZXN0CnQudGVzdChpc28uMTIuYXZnW2lzby4xMi5hdmckUGVyaW9kID09ICJpbmMiICYgaXNvLjEyLmF2ZyRUcmVhdG1lbnQgPT0gImFpci1kcnkiICYgaXNvLjEyLmF2ZyRUeXBlID09ICJGIiwgImQxM2NfbWVhbiJdLAogICAgICAgaXNvLjEyLmF2Z1tpc28uMTIuYXZnJFBlcmlvZCA9PSAiaW5jIiAmIGlzby4xMi5hdmckRXhwZXJpbWVudCA9PSAicmV3ZXQiICYgaXNvLjEyLmF2ZyRUcmVhdG1lbnQgPT0gImNvbnRyb2wiICYgaXNvLjEyLmF2ZyRUeXBlID09ICJGIiwgImQxM2NfbWVhbiJdLAogICAgICAgdGFpbHMgPSAyLCBwYWlyZWQgPSBUUlVFKQoKIyBncmFzc2xhbmQKdC50ZXN0KGlzby4xMi5hdmdbaXNvLjEyLmF2ZyRQZXJpb2QgPT0gImluYyIgJiBpc28uMTIuYXZnJFRyZWF0bWVudCA9PSAiYWlyLWRyeSIgJiBpc28uMTIuYXZnJFR5cGUgPT0gIkciLCAiZDEzY19tZWFuIl0sCiAgICAgICBpc28uMTIuYXZnW2lzby4xMi5hdmckUGVyaW9kID09ICJpbmMiICYgaXNvLjEyLmF2ZyRFeHBlcmltZW50ID09ICJyZXdldCIgJiBpc28uMTIuYXZnJFRyZWF0bWVudCA9PSAiY29udHJvbCIgJiBpc28uMTIuYXZnJFR5cGUgPT0gIkciLCAiZDEzY19tZWFuIl0sIAogICAgICAgdGFpbHMgPSAyLCBwYWlyZWQgPSBUUlVFKQoKaXNvLjEyLnByZS5pbmMgPC0gbWVyZ2UoaXNvLjEyLmF2Z1tpc28uMTIuYXZnJFBlcmlvZCA9PSAicHJlIiwgYygiSUQiLCAiRXhwZXJpbWVudCIsICJUeXBlIiwgIlRyZWF0bWVudCIsICJkMTNjX21lYW4iLCAiZDEzY191IiwgImQxM2NfbCIpXSwKICAgICAgICAgICAgICAgICAgICAgICAgaXNvLjEyLmF2Z1tpc28uMTIuYXZnJFBlcmlvZCA9PSAiaW5jIiwgYygiSUQiLCAiRXhwZXJpbWVudCIsICJUeXBlIiwgIlRyZWF0bWVudCIsICJkMTNjX21lYW4iLCAiZDEzY191IiwgImQxM2NfbCIpXSwKICAgICAgICAgICAgICAgICAgICAgICAgIGJ5ID0gYygiSUQiLCAiRXhwZXJpbWVudCIsICJUeXBlIiwgIlRyZWF0bWVudCIpLAogICAgICAgICAgICAgICAgICAgICAgICAgc3VmZml4ZXMgPSBjKCJfcHJlIiwgIl9pbmMiKSkKaXNvLjEyLnByZS5pbmMkdHJlYXQuYmkgPC0gaWZlbHNlKGlzby4xMi5wcmUuaW5jJFRyZWF0bWVudCA9PSAiY29udHJvbCIsICJjb250cm9sIiwgInRyZWF0bWVudCIpCgojIHJhbmdlKGMoaXNvLjEyLnByZS5pbmMkZDEzY19sX3ByZSwgaXNvLjEyLnByZS5pbmMkZDEzY19sX2luYywgaXNvLjEyLnByZS5pbmMkZDEzY191X2luYywgaXNvLjEyLnByZS5pbmMkZDEzY19sX2luYyksIG5hLnJtID0gVFJVRSkKaXNvLjEyLnByZS5pbmMgJT4lCiAgZ2dwbG90KC4sIGFlcyhkMTNjX21lYW5fcHJlLCBkMTNjX21lYW5faW5jLCBjb2xvciA9IFR5cGUsIHNoYXBlID0gVHJlYXRtZW50KSkgKwogIGdlb21fYWJsaW5lKHNsb3BlID0gMSwgaW50ZXJjZXB0ID0gMCkgKwogIGdlb21fcG9pbnQoc2l6ZSA9IDMpICsKICBnZW9tX2Vycm9yYmFyKAogICAgYWVzKHltaW4gPSBkMTNjX2xfaW5jLCAKICAgICAgICB5bWF4ID0gZDEzY191X2luYywgCiAgICAgICAgY29sb3IgPSBUeXBlKSwgCiAgICB3aWR0aCA9IC4yNSkgKwogIGdlb21fZXJyb3JiYXJoKAogICAgYWVzKHhtaW4gPSBkMTNjX2xfcHJlLCAKICAgICAgICB4bWF4ID0gZDEzY191X3ByZSwKICAgICAgICBjb2xvciA9IFR5cGUpLCAKICAgIGhlaWdodCA9IC4yNSkgKwogIHNjYWxlX2NvbG9yX21hbnVhbChuYW1lID0gJ0Vjb3N5c3RlbScsCiAgICAgICAgICAgICAgICAgICAgIHZhbHVlcyA9YygnRic9JyNhMzU1MTMnLCdHJz0nIzEzNjFhMycpLAogICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBjKCdGb3Jlc3QnLCdHcmFzc2xhbmQnKSkgKwogIHNjYWxlX3NoYXBlX21hbnVhbChuYW1lID0gJ1RyZWF0bWVudCcsCiAgICAgICAgICAgICAgICAgICAgIHZhbHVlcyA9IGMoImNvbnRyb2wiID0gMTYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFpci1kcnkiID0gMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYWlyLWRyeSArIHN0b3JhZ2UiID0gMCksCiAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGMoImNvbnRyb2wiID0gImNvbnRyb2wtMSAoMjAxMSlcbmNvbnRyb2wtMiAoMjAxOSkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhaXItZHJ5IiA9ICJhaXItZHJ5IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYWlyLWRyeSArIHN0b3JhZ2UiID0gImFpci1kcnkgKyBzdG9yYWdlIikpICsKICBzY2FsZV94X2NvbnRpbnVvdXMobGltaXRzID0gYygtMjkuMSwgLTIyLjI1KSkgKwogIHNjYWxlX3lfY29udGludW91cyhsaW1pdHMgPSBjKC0yOS4xLCAtMjIuMjUpKSArCiAgeGxhYihleHByZXNzaW9uKCdQcmUtaW5jdWJhdGlvbiAnKmRlbHRhKicnXjEzKidDICjigLApJykpICsKICB5bGFiKGV4cHJlc3Npb24oJ0VxdWlsaWJyaXVtIHJlc3BpcmF0aW9uICcqZGVsdGEqJydeMTMqJ0MgKOKAsCknKSkgKwogIHRoZW1lX2J3KCkgKwogIHRoZW1lKHBhbmVsLmdyaWQgPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgbGVnZW5kLmtleS5oZWlnaHQ9dW5pdCguOCwgImNtIiksCiAgICAgICAgYXNwZWN0LnJhdGlvID0gMSkKYGBgCgpgYGB7ciBwcmUtZXF1LTE0Yy1zdGF0cywgaW5jbHVkZSA9IEZBTFNFfQojIGdhdGhlciBwcmUgYW5kIGluYyBkYXRhIGZyb20gYWxsIHJlcHMsIGFyYyBhbmQgcmV3ZXQgZXhwIG9ubHkKai52YXJzIDwtIGMoIlNhbXBsZU5hbWUiLCAiSUQiLCAiRXhwZXJpbWVudCIsICJUcmVhdG1lbnQiLCAiVHlwZSIsICJkMTRjX2NvcnIiLCAibWdDTzIuQ19nQyIpCmFyYy5yZXdldC5wcmUuMTRjIDwtIGJpbmRfcm93cyhsYXBwbHkoYWxsLjE0Yy5scywgZnVuY3Rpb24oZGYpIHsKICBpZighaXMubnVsbChkZiRtZ0NPMi5DX2dDKSkgewogICAgICBkZiA8LSBkZlt3aGljaChkZiRQZXJpb2QgPT0gInByZSIgJiBkZiRFeHBlcmltZW50ICE9ICJ0bWUiKSwgai52YXJzXQogIHJldHVybihkZikKICB9Cn0pKQphcmMucmV3ZXQuaW5jLjE0YyA8LSBiaW5kX3Jvd3MobGFwcGx5KGFsbC4xNGMubHMsIGZ1bmN0aW9uKGRmKSB7CiAgaWYoIWlzLm51bGwoZGYkbWdDTzIuQ19nQykpIHsKICBkZiA8LSBkZlt3aGljaChkZiRQZXJpb2QgPT0gImluYyIgJiBkZiRFeHBlcmltZW50ICE9ICJ0bWUiKSwgai52YXJzXQogIHJldHVybihkZikKICB9Cn0pKQphcmMucmV3ZXQuMTRjIDwtIG1lcmdlKGFyYy5yZXdldC5wcmUuMTRjLCBhcmMucmV3ZXQuaW5jLjE0YywgYnkgPSBqLnZhcnNbMTo1XSwgc3VmZml4ZXMgPSBjKCJfcHJlIiwgIl9pbmMiKSkKCmFyYy5yZXdldC4xNGMkdHJlYXQuYmkgPC0gaWZlbHNlKGFyYy5yZXdldC4xNGMkVHJlYXRtZW50ID09ICJjb250cm9sIiwgImNvbnRyb2wiLCAidHJlYXRtZW50IikKCiMjIGxvb2sgYXQgaW50ZXJhY3Rpb25zCiMgRXhwZXJpbWVudCAxCiMgaW50ZXJhY3Rpb24gd2l0aCBUeXBlIG5zCnN1bW1hcnkobG0oZDE0Y19jb3JyX2luYyB+IGQxNGNfY29ycl9wcmUgKiBUeXBlLCBhcmMucmV3ZXQuMTRjW2FyYy5yZXdldC4xNGMkRXhwZXJpbWVudCA9PSAiYXJjIiwgXSkpCgojIEV4cGVyaW1lbnQgMgojIGludGVyYWN0aW9uIHdpdGggVHlwZSAqIFRyZWF0bWVudCBzaWduaWZpY2FudCBkdWUgdG8gb3V0bGllcgpzdW1tYXJ5KGxtKGQxNGNfY29ycl9pbmMgfiBkMTRjX2NvcnJfcHJlICogVHlwZSAqIFRyZWF0bWVudCwgYXJjLnJld2V0LjE0Y1thcmMucmV3ZXQuMTRjJEV4cGVyaW1lbnQgPT0gInJld2V0IiwgXSkpCiMgYnV0IGRpc2FwcGVhcnMgd2hlbiBleGNsdWRlZApzdW1tYXJ5KGxtKGQxNGNfY29ycl9pbmMgfiBkMTRjX2NvcnJfcHJlICogVHlwZSAqIFRyZWF0bWVudCwgYXJjLnJld2V0LjE0Y1t3aGljaChhcmMucmV3ZXQuMTRjJEV4cGVyaW1lbnQgPT0gInJld2V0IiAmIGFyYy5yZXdldC4xNGMkSUQgIT0gIkhFVzIyIiksIF0pKQoKIyBjb21iaW5lZApzdW1tYXJ5KGxtKGQxNGNfY29ycl9pbmMgfiBkMTRjX2NvcnJfcHJlICogRXhwZXJpbWVudCAqIFR5cGUgKiB0cmVhdC5iaSwgYXJjLnJld2V0LjE0YykpICMgb3V0bGllcgpzdW1tYXJ5KGxtKGQxNGNfY29ycl9pbmMgfiBkMTRjX2NvcnJfcHJlICogRXhwZXJpbWVudCAqIFR5cGUgKiB0cmVhdC5iaSwgCiAgICAgICAgICAgYXJjLnJld2V0LjE0Y1std2hpY2goYXJjLnJld2V0LjE0YyRJRCA9PSAiSEVXMjIiKSwgXSkpICMgdy9vIEhFVzIyCgojIHQudGVzdAp0LnRlc3QoYXJjLnJld2V0LjE0YyRkMTRjX2NvcnJfcHJlLCBhcmMucmV3ZXQuMTRjJGQxNGNfY29ycl9pbmMpICMgdy8gSEVXMjIKdC50ZXN0KGFyYy5yZXdldC4xNGNbLXdoaWNoKGFyYy5yZXdldC4xNGMkSUQgPT0gIkhFVzIyIiksICJkMTRjX2NvcnJfcHJlIl0sIAogICAgICAgYXJjLnJld2V0LjE0Y1std2hpY2goYXJjLnJld2V0LjE0YyRJRCA9PSAiSEVXMjIiKSwgImQxNGNfY29ycl9pbmMiXSkgIyB3L28gSEVXMjIKCgpgYGAKCmBgYHtyIHByZS1lcXUtMTNjLXN0YXRzLCBpbmNsdWRlID0gRkFMU0V9CiMgZ2F0aGVyIHByZSBhbmQgaW5jIGRhdGEgZnJvbSBhbGwgcmVwcywgYXJjIGFuZCByZXdldCBleHAgb25seQpqLnZhcnMgPC0gYygiU2FtcGxlTmFtZSIsICJJRCIsICJFeHBlcmltZW50IiwgIlRyZWF0bWVudCIsICJUeXBlIiwgImQxNGNfY29yciIsICJtZ0NPMi5DX2dDIikKYXJjLnJld2V0LnByZS4xNGMgPC0gYmluZF9yb3dzKGxhcHBseShhbGwuMTRjLmxzLCBmdW5jdGlvbihkZikgewogIGlmKCFpcy5udWxsKGRmJG1nQ08yLkNfZ0MpKSB7CiAgICAgIGRmIDwtIGRmW3doaWNoKGRmJFBlcmlvZCA9PSAicHJlIiAmIGRmJEV4cGVyaW1lbnQgIT0gInRtZSIpLCBqLnZhcnNdCiAgcmV0dXJuKGRmKQogIH0KfSkpCmFyYy5yZXdldC5pbmMuMTRjIDwtIGJpbmRfcm93cyhsYXBwbHkoYWxsLjE0Yy5scywgZnVuY3Rpb24oZGYpIHsKICBpZighaXMubnVsbChkZiRtZ0NPMi5DX2dDKSkgewogIGRmIDwtIGRmW3doaWNoKGRmJFBlcmlvZCA9PSAiaW5jIiAmIGRmJEV4cGVyaW1lbnQgIT0gInRtZSIpLCBqLnZhcnNdCiAgcmV0dXJuKGRmKQogIH0KfSkpCmFyYy5yZXdldC4xNGMgPC0gbWVyZ2UoYXJjLnJld2V0LnByZS4xNGMsIGFyYy5yZXdldC5pbmMuMTRjLCBieSA9IGoudmFyc1sxOjVdLCBzdWZmaXhlcyA9IGMoIl9wcmUiLCAiX2luYyIpKQoKYXJjLnJld2V0LjE0YyR0cmVhdC5iaSA8LSBpZmVsc2UoYXJjLnJld2V0LjE0YyRUcmVhdG1lbnQgPT0gImNvbnRyb2wiLCAiY29udHJvbCIsICJ0cmVhdG1lbnQiKQoKIyMgbG9vayBhdCBpbnRlcmFjdGlvbnMKIyBFeHBlcmltZW50IDEKIyBpbnRlcmFjdGlvbiB3aXRoIFR5cGUgbnMKc3VtbWFyeShsbShkMTRjX2NvcnJfaW5jIH4gZDE0Y19jb3JyX3ByZSAqIFR5cGUsIGFyYy5yZXdldC4xNGNbYXJjLnJld2V0LjE0YyRFeHBlcmltZW50ID09ICJhcmMiLCBdKSkKCiMgRXhwZXJpbWVudCAyCiMgaW50ZXJhY3Rpb24gd2l0aCBUeXBlICogVHJlYXRtZW50IHNpZ25pZmljYW50IGR1ZSB0byBvdXRsaWVyCnN1bW1hcnkobG0oZDE0Y19jb3JyX2luYyB+IGQxNGNfY29ycl9wcmUgKiBUeXBlICogVHJlYXRtZW50LCBhcmMucmV3ZXQuMTRjW2FyYy5yZXdldC4xNGMkRXhwZXJpbWVudCA9PSAicmV3ZXQiLCBdKSkKIyBidXQgZGlzYXBwZWFycyB3aGVuIGV4Y2x1ZGVkCnN1bW1hcnkobG0oZDE0Y19jb3JyX2luYyB+IGQxNGNfY29ycl9wcmUgKiBUeXBlICogVHJlYXRtZW50LCBhcmMucmV3ZXQuMTRjW3doaWNoKGFyYy5yZXdldC4xNGMkRXhwZXJpbWVudCA9PSAicmV3ZXQiICYgYXJjLnJld2V0LjE0YyRJRCAhPSAiSEVXMjIiKSwgXSkpCgojIGNvbWJpbmVkCnN1bW1hcnkobG0oZDE0Y19jb3JyX2luYyB+IGQxNGNfY29ycl9wcmUgKiBFeHBlcmltZW50ICogVHlwZSAqIHRyZWF0LmJpLCBhcmMucmV3ZXQuMTRjKSkgIyBvdXRsaWVyCnN1bW1hcnkobG0oZDE0Y19jb3JyX2luYyB+IGQxNGNfY29ycl9wcmUgKiBFeHBlcmltZW50ICogVHlwZSAqIHRyZWF0LmJpLCAKICAgICAgICAgICBhcmMucmV3ZXQuMTRjWy13aGljaChhcmMucmV3ZXQuMTRjJElEID09ICJIRVcyMiIpLCBdKSkgIyB3L28gSEVXMjIKCiMgdC50ZXN0CnQudGVzdChhcmMucmV3ZXQuMTRjJGQxNGNfY29ycl9wcmUsIGFyYy5yZXdldC4xNGMkZDE0Y19jb3JyX2luYykgIyB3LyBIRVcyMgp0LnRlc3QoYXJjLnJld2V0LjE0Y1std2hpY2goYXJjLnJld2V0LjE0YyRJRCA9PSAiSEVXMjIiKSwgImQxNGNfY29ycl9wcmUiXSwgCiAgICAgICBhcmMucmV3ZXQuMTRjWy13aGljaChhcmMucmV3ZXQuMTRjJElEID09ICJIRVcyMiIpLCAiZDE0Y19jb3JyX2luYyJdKSAjIHcvbyBIRVcyMgpybShqLnZhcnMpCmBgYAoKKlRyZWF0bWVudCBlZmZlY3RzIG9uIG9ic2VydmVkIGVxdWlsaWJyaXVtIHBlcmlvZCBeMTReQy1DT34yfioKCmBgYHtyIGN0bC10cnQtZGlmcywgaW5jbHVkZSA9IEZBTFNFfQojIGF2ZXJhZ2UgY29udHJvbCBhbmQgdHJlYXRtZW50IGRhdGEKIyByZW1vdmUgSEVXMjIgY29udHJvbCBwcmUKIyBub3RlIHRoYXQgdXBwZXIvbG93ZXIgbGltaXRzID0gMnhTRQphbGwuMTRjLnN1bTIgPC0gYWxsLjE0Yy5sc1tbMl1dICU+JQogIG11dGF0ZShJRC50cmVhdC5QZXJpb2QgPSBwYXN0ZShJRCwgVHJlYXRtZW50LCBQZXJpb2QpKSAlPiUKICBmaWx0ZXIoSUQudHJlYXQuUGVyaW9kICE9ICJIRVcyMiBjb250cm9sIHByZSIpICU+JQogIHNlbGVjdChUeXBlLCBQZXJpb2QsIFRyZWF0bWVudCwgRXhwZXJpbWVudCwgWWVhclNhbXBsZWQsIGQxNGNfY29yciwgbWdDTzIuQ19nQykgJT4lCiAgZ3JvdXBfYnkoVHlwZSwgUGVyaW9kLCBUcmVhdG1lbnQsIEV4cGVyaW1lbnQsIFllYXJTYW1wbGVkKSAlPiUKICBhZGRfY291bnQoKSAlPiUKICBzdW1tYXJpemVfYWxsKGxpc3QobWVhbiA9IG1lYW4sIHNkID0gc2QpLCBuYS5ybSA9IFRSVUUpICU+JQogIG11dGF0ZShkMTRjX2NvcnJfc2UgPSBkMTRjX2NvcnJfc2Qvbl9tZWFuLAogICAgICAgICBkMTRjX2NvcnJfdSA9IGQxNGNfY29ycl9tZWFuICsgZDE0Y19jb3JyX3NlKjIsCiAgICAgICAgIGQxNGNfY29ycl9sID0gZDE0Y19jb3JyX21lYW4gLSBkMTRjX2NvcnJfc2UqMiwKICAgICAgICAgbWdDTzIuQ19nQ19zZSA9IG1nQ08yLkNfZ0Nfc2Qvbl9tZWFuLAogICAgICAgICBtZ0NPMi5DX2dDX3UgPSBtZ0NPMi5DX2dDX21lYW4gKyBtZ0NPMi5DX2dDX3NlKjIsCiAgICAgICAgIG1nQ08yLkNfZ0NfbCA9IG1nQ08yLkNfZ0NfbWVhbiAtIG1nQ08yLkNfZ0Nfc2UqMikgCgojIHN1bW1hcml6ZSBieSBJRCAoY29tYmluZSByZXBzKQphbGwuMTRjLnN1bTMgPC0gYWxsLjE0Yy5sc1tbMl1dICU+JQogIG11dGF0ZShJRC50cmVhdC5QZXJpb2QgPSBwYXN0ZShJRCwgVHJlYXRtZW50LCBQZXJpb2QpKSAlPiUKICBmaWx0ZXIoSUQudHJlYXQuUGVyaW9kICE9ICJIRVcyMiBjb250cm9sIHByZSIpICU+JQogIHNlbGVjdChJRCwgUGVyaW9kLCBUeXBlLCBUcmVhdG1lbnQsIEV4cGVyaW1lbnQsIGQxNGNfY29yciwgbWdDTzIuQ19nQykgJT4lCiAgZ3JvdXBfYnkoSUQsIFBlcmlvZCwgVHlwZSwgVHJlYXRtZW50LCBFeHBlcmltZW50KSAlPiUKICBhZGRfY291bnQoKSAlPiUKICBzdW1tYXJpemVfYWxsKGxpc3QobWVhbiA9IG1lYW4sIHNkID0gc2QpLCBuYS5ybSA9IFRSVUUpCgojIGNhbGN1bGF0ZSBtZWFuIGRpZmZlcmVuY2VzIApjdGwudHJ0LjE0Yy5kaWYgPC0gbWVyZ2UoCiAgYWxsLjE0Yy5zdW0zW2FsbC4xNGMuc3VtMyRQZXJpb2QgPT0gImluYyIgJiBhbGwuMTRjLnN1bTMkVHJlYXRtZW50ID09ICJjb250cm9sIiwgXSwKICBhbGwuMTRjLnN1bTNbYWxsLjE0Yy5zdW0zJFBlcmlvZCA9PSAiaW5jIiAmIGFsbC4xNGMuc3VtMyRUcmVhdG1lbnQgIT0gImNvbnRyb2wiLCBdLAogIGJ5ID0gYygiSUQiLCAiRXhwZXJpbWVudCIsICJUeXBlIiksCiAgc3VmZml4ZXMgPSBjKCIuY3RsIiwgIi50cnQiKSkKY3RsLnRydC4xNGMuZGlmIDwtIGN0bC50cnQuMTRjLmRpZlsgLCBjKCJJRCIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkV4cGVyaW1lbnQiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJUeXBlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkMTRjX2NvcnJfbWVhbi5jdGwiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkMTRjX2NvcnJfbWVhbi50cnQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImQxNGNfY29ycl9zZC5jdGwiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImQxNGNfY29ycl9zZC50cnQiKV0KIyByZXBsYWNlIE5BIHNkIHcvIDAKY3RsLnRydC4xNGMuZGlmJGQxNGNfY29ycl9zZC5jdGwgPC0gaWZlbHNlKGlzLm5hKGN0bC50cnQuMTRjLmRpZiRkMTRjX2NvcnJfc2QuY3RsKSwgMCwgY3RsLnRydC4xNGMuZGlmJGQxNGNfY29ycl9zZC5jdGwpCmN0bC50cnQuMTRjLmRpZiRkMTRjX2NvcnJfc2QudHJ0IDwtIGlmZWxzZShpcy5uYShjdGwudHJ0LjE0Yy5kaWYkZDE0Y19jb3JyX3NkLnRydCksIDAsIGN0bC50cnQuMTRjLmRpZiRkMTRjX2NvcnJfc2QudHJ0KQojIGNhbGMgZGlmcwpkaWYuZi5hIDwtIG1lYW4oY3RsLnRydC4xNGMuZGlmW2N0bC50cnQuMTRjLmRpZiRFeHBlcmltZW50ID09ICJhcmMiICYKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN0bC50cnQuMTRjLmRpZiRUeXBlID09ICJGIiwgImQxNGNfY29ycl9tZWFuLnRydCJdIC0KICAgICAgICAgICAgICAgICAgY3RsLnRydC4xNGMuZGlmW2N0bC50cnQuMTRjLmRpZiRFeHBlcmltZW50ID09ICJhcmMiICYgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN0bC50cnQuMTRjLmRpZiRUeXBlID09ICJGIiwgImQxNGNfY29ycl9tZWFuLmN0bCJdKQpkaWYuZy5hIDwtIG1lYW4oY3RsLnRydC4xNGMuZGlmW2N0bC50cnQuMTRjLmRpZiRFeHBlcmltZW50ID09ICJhcmMiICYKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN0bC50cnQuMTRjLmRpZiRUeXBlID09ICJHIiwgImQxNGNfY29ycl9tZWFuLnRydCJdIC0KICAgICAgICAgICAgICAgICAgY3RsLnRydC4xNGMuZGlmW2N0bC50cnQuMTRjLmRpZiRFeHBlcmltZW50ID09ICJhcmMiICYgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN0bC50cnQuMTRjLmRpZiRUeXBlID09ICJHIiwgImQxNGNfY29ycl9tZWFuLmN0bCJdKQpkaWYuZi5yIDwtIG1lYW4oY3RsLnRydC4xNGMuZGlmW2N0bC50cnQuMTRjLmRpZiRFeHBlcmltZW50ID09ICJyZXdldCIgJgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3RsLnRydC4xNGMuZGlmJFR5cGUgPT0gIkYiLCAiZDE0Y19jb3JyX21lYW4udHJ0Il0gLQogICAgICAgICAgICAgICAgICBjdGwudHJ0LjE0Yy5kaWZbY3RsLnRydC4xNGMuZGlmJEV4cGVyaW1lbnQgPT0gInJld2V0IiAmIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdGwudHJ0LjE0Yy5kaWYkVHlwZSA9PSAiRiIsICJkMTRjX2NvcnJfbWVhbi5jdGwiXSkKZGlmLmcuciA8LSBtZWFuKGN0bC50cnQuMTRjLmRpZltjdGwudHJ0LjE0Yy5kaWYkRXhwZXJpbWVudCA9PSAicmV3ZXQiICYKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN0bC50cnQuMTRjLmRpZiRUeXBlID09ICJHIiwgImQxNGNfY29ycl9tZWFuLnRydCJdIC0KICAgICAgICAgICAgICAgICAgY3RsLnRydC4xNGMuZGlmW2N0bC50cnQuMTRjLmRpZiRFeHBlcmltZW50ID09ICJyZXdldCIgJiAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3RsLnRydC4xNGMuZGlmJFR5cGUgPT0gIkciLCAiZDE0Y19jb3JyX21lYW4uY3RsIl0pCiMgc2Qgb2YgZGlmIChvciBTRS85NSUgQ0kgKQpkaWYuZi5hLnNlIDwtIHNxcnQoc3VtKGN0bC50cnQuMTRjLmRpZltjdGwudHJ0LjE0Yy5kaWYkRXhwZXJpbWVudCA9PSAiYXJjIiAmIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN0bC50cnQuMTRjLmRpZiRUeXBlID09ICJGIiwgImQxNGNfY29ycl9zZC50cnQiXS8yKSkqMS45NgpkaWYuZy5hLnNlIDwtIHNxcnQoc3VtKGN0bC50cnQuMTRjLmRpZltjdGwudHJ0LjE0Yy5kaWYkRXhwZXJpbWVudCA9PSAiYXJjIiAmIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN0bC50cnQuMTRjLmRpZiRUeXBlID09ICJHIiwgImQxNGNfY29ycl9zZC50cnQiXS8yKSkqMS45NgpkaWYuZi5yLnNlIDwtIHNxcnQoc3VtKGN0bC50cnQuMTRjLmRpZltjdGwudHJ0LjE0Yy5kaWYkRXhwZXJpbWVudCA9PSAicmV3ZXQiICYgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3RsLnRydC4xNGMuZGlmJFR5cGUgPT0gIkYiLCAiZDE0Y19jb3JyX3NkLnRydCJdLzIsCiAgICAgICAgICAgICAgICAgICAgICAgY3RsLnRydC4xNGMuZGlmW2N0bC50cnQuMTRjLmRpZiRFeHBlcmltZW50ID09ICJyZXdldCIgJiAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdGwudHJ0LjE0Yy5kaWYkVHlwZSA9PSAiRiIsICJkMTRjX2NvcnJfc2QuY3RsIl0vMikpKjEuOTYKZGlmLmcuci5zZSA8LSBzcXJ0KHN1bShjdGwudHJ0LjE0Yy5kaWZbY3RsLnRydC4xNGMuZGlmJEV4cGVyaW1lbnQgPT0gInJld2V0IiAmIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN0bC50cnQuMTRjLmRpZiRUeXBlID09ICJGIiwgImQxNGNfY29ycl9zZC50cnQiXS8yLAogICAgICAgICAgICAgICAgICAgICAgIGN0bC50cnQuMTRjLmRpZltjdGwudHJ0LjE0Yy5kaWYkRXhwZXJpbWVudCA9PSAicmV3ZXQiICYgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3RsLnRydC4xNGMuZGlmJFR5cGUgPT0gIkYiLCAiZDE0Y19jb3JyX3NkLmN0bCJdLzIpKSoxLjk2CgojIENJOTUKYyhkaWYuZi5hIC0gZGlmLmYuYS5zZSwgZGlmLmYuYSArIGRpZi5mLmEuc2UpIApjKGRpZi5nLmEgLSBkaWYuZy5hLnNlLCBkaWYuZy5hICsgZGlmLmcuYS5zZSkgCmMoZGlmLmYuciAtIGRpZi5mLnIuc2UsIGRpZi5mLnIgKyBkaWYuZi5yLnNlKSAKYyhkaWYuZy5yIC0gZGlmLmcuci5zZSwgZGlmLmcuciArIGRpZi5nLnIuc2UpIAoKYWxsLjE0Yy5zdW0yJHRyZWF0LmJpIDwtIGlmZWxzZShhbGwuMTRjLnN1bTIkVHJlYXRtZW50ID09ICJjb250cm9sIiwgImNvbnRyb2wiLCJ0cmVhdG1lbnQiKQoKIyBhdmVyYWdlIDEzQyBkYXRhIGFuZCBhZGQgdG8gYWxsLjE0Yy5zdW0yCmlzby4xMi5hdmcyIDwtIGlzb19kZiAlPiUKICBtdXRhdGUoVHlwZSA9IGlmZWxzZShncmVwbCgiRyIsIGlzb19kZiRJRCksICJHIiwgIkYiKSkgJT4lCiAgc2VsZWN0KFR5cGUsIFBlcmlvZCwgVHJlYXRtZW50LCBFeHBlcmltZW50LCBkMTNjKSAlPiUKICBncm91cF9ieShUeXBlLCBQZXJpb2QsIFRyZWF0bWVudCwgRXhwZXJpbWVudCkgJT4lCiAgYWRkX2NvdW50KCkgJT4lCiAgc3VtbWFyaXplX2FsbChsaXN0KG1lYW4gPSBtZWFuLCBzZCA9IHNkKSwgbmEucm0gPSBUUlVFKSAlPiUKICBtdXRhdGUoZDEzY19zZSA9IGQxM2Nfc2Qvbl9tZWFuLAogICAgICAgICBkMTNjX3UgPSBkMTNjX21lYW4gKyBkMTNjX3NlKjIsCiAgICAgICAgIGQxM2NfbCA9IGQxM2NfbWVhbiAtIGQxM2Nfc2UqMikgCgphbGwuMTRjLnN1bTIgPC0gbWVyZ2UoYWxsLjE0Yy5zdW0yLCBpc28uMTIuYXZnMlsgLCBjKCJFeHBlcmltZW50IiwgIlR5cGUiLCAiVHJlYXRtZW50IiwgIlBlcmlvZCIsICJkMTNjX21lYW4iLCAiZDEzY19zZCIsICJkMTNjX3NlIiwgImQxM2NfdSIsICJkMTNjX2wiKV0sIAogICAgICAgICAgICAgIGJ5ID0gYygiRXhwZXJpbWVudCIsICJUeXBlIiwgIlRyZWF0bWVudCIsICJQZXJpb2QiKSwgYWxsLnggPSBUUlVFKQoKIyBzdW1tYXJpemUKdHJ0LmN0bC5kZiA8LSBtZXJnZSgKICBhbGwuMTRjLnN1bTJbd2hpY2goYWxsLjE0Yy5zdW0yJHRyZWF0LmJpID09ICJjb250cm9sIiAmIGFsbC4xNGMuc3VtMiRQZXJpb2QgPT0gImluYyIpLCBjKCJUeXBlIiwgIkV4cGVyaW1lbnQiLCAiZDE0Y19jb3JyX21lYW4iLCAiZDE0Y19jb3JyX3NkIiwgIm5fbWVhbiIsICJkMTNjX21lYW4iLCAiZDEzY19zZCIpXSwKICBhbGwuMTRjLnN1bTJbd2hpY2goYWxsLjE0Yy5zdW0yJHRyZWF0LmJpICE9ICJjb250cm9sIiAmIGFsbC4xNGMuc3VtMiRQZXJpb2QgPT0gImluYyIpLCBjKCJUeXBlIiwgIkV4cGVyaW1lbnQiLCAiZDE0Y19jb3JyX21lYW4iLCAiZDE0Y19jb3JyX3NkIiwgIm5fbWVhbiIsICJkMTNjX21lYW4iLCAiZDEzY19zZCIpXSwKICBieSA9IGMoIlR5cGUiLCAiRXhwZXJpbWVudCIpLAogIHN1ZmZpeGVzID0gYygiLmN0bCIsICIudHJ0IikpCiMgMTRDIGRpZnMKdHJ0LmN0bC5kZiRkaWYgPC0gdHJ0LmN0bC5kZiRkMTRjX2NvcnJfbWVhbi50cnQgLSB0cnQuY3RsLmRmJGQxNGNfY29ycl9tZWFuLmN0bAp0cnQuY3RsLmRmJGRpZi5zZSA8LSBzYXBwbHkoc3BsaXQodHJ0LmN0bC5kZiwgMTpucm93KHRydC5jdGwuZGYpKSwgZnVuY3Rpb24oeCkgewogIHNxcnQoc3VtKCh4JGQxNGNfY29ycl9zZC5jdGwpXjIvc3FydCh4JG5fbWVhbi5jdGwpLAogICAgICAoeCRkMTRjX2NvcnJfc2QudHJ0KV4yL3NxcnQoeCRuX21lYW4udHJ0KSkpCiAgfSkKdHJ0LmN0bC5kZiRkaWYuc2QgPC0gc2FwcGx5KHNwbGl0KHRydC5jdGwuZGYsIDE6bnJvdyh0cnQuY3RsLmRmKSksIGZ1bmN0aW9uKHgpIHsKICBzcXJ0KHN1bSh4JGQxNGNfY29ycl9zZC5jdGxeMi94JG5fbWVhbi5jdGwsCiAgICAgICAgICAgeCRkMTRjX2NvcnJfc2QudHJ0XjIveCRuX21lYW4udHJ0KSkKICB9KQoKIyAxM0MgZGlmcwp0cnQuY3RsLmRmJGRpZi4xM2MgPC0gdHJ0LmN0bC5kZiRkMTNjX21lYW4udHJ0IC0gdHJ0LmN0bC5kZiRkMTNjX21lYW4uY3RsCnRydC5jdGwuZGYkZGlmLnNlLjEzYyA8LSBzYXBwbHkoc3BsaXQodHJ0LmN0bC5kZiwgMTpucm93KHRydC5jdGwuZGYpKSwgZnVuY3Rpb24oeCkgewogIHNxcnQoc3VtKCh4JGQxM2Nfc2QuY3RsKV4yL3NxcnQoeCRuX21lYW4uY3RsKSwKICAgICAgKHgkZDEzY19zZC50cnQpXjIvc3FydCh4JG5fbWVhbi50cnQpKSkKICB9KQp0cnQuY3RsLmRmJGRpZi5zZC4xM2MgPC0gc2FwcGx5KHNwbGl0KHRydC5jdGwuZGYsIDE6bnJvdyh0cnQuY3RsLmRmKSksIGZ1bmN0aW9uKHgpIHsKICBzcXJ0KHN1bSh4JGQxM2Nfc2QuY3RsXjIveCRuX21lYW4uY3RsLAogICAgICAgICAgIHgkZDEzY19zZC50cnReMi94JG5fbWVhbi50cnQpKQogIH0pCgoKIyAjIG1lYW4gZGlmCiMgbWVhbihhYnModHJ0LmN0bC5kZlt0cnQuY3RsLmRmJFR5cGUgPT0gIkYiLCAiZGlmIl0pKQojIHNxcnQoc3VtKHRydC5jdGwuZGZbdHJ0LmN0bC5kZiRUeXBlID09ICJGIiwgImRpZi5zZCJdXjIvdHJ0LmN0bC5kZlt0cnQuY3RsLmRmJFR5cGUgPT0gIkYiLCAibl9tZWFuLnRydCJdKSkKCiMgY2FsY3VsYXRlIGRpZmZlcmVuY2VzIHdpdGhpbiB0cmVhdG1lbnQgZ3JvdXBzLCBpLmUuIGN0bCAyMDExIC0gY3RsIDIwMTksIGV0Yy4KIyBmb3Jlc3RzCiMgY29udHJvbApmLmN0bC5kaWYgPC0gdHJ0LmN0bC5kZlt0cnQuY3RsLmRmJEV4cGVyaW1lbnQgPT0gImFyYyIgJiB0cnQuY3RsLmRmJFR5cGUgPT0gIkYiLCAiZDE0Y19jb3JyX21lYW4uY3RsIl0gLSB0cnQuY3RsLmRmW3RydC5jdGwuZGYkRXhwZXJpbWVudCA9PSAicmV3ZXQiICYgdHJ0LmN0bC5kZiRUeXBlID09ICJGIiwgImQxNGNfY29ycl9tZWFuLmN0bCJdCgpmLmN0bC5kaWYuc2QgPC0gc3FydCh0cnQuY3RsLmRmW3RydC5jdGwuZGYkRXhwZXJpbWVudCA9PSAiYXJjIiAmIHRydC5jdGwuZGYkVHlwZSA9PSAiRiIsICJkMTRjX2NvcnJfc2QuY3RsIl1eMi90cnQuY3RsLmRmW3RydC5jdGwuZGYkRXhwZXJpbWVudCA9PSAiYXJjIiAmIHRydC5jdGwuZGYkVHlwZSA9PSAiRiIsICJuX21lYW4uY3RsIl0gKyB0cnQuY3RsLmRmW3RydC5jdGwuZGYkRXhwZXJpbWVudCA9PSAicmV3ZXQiICYgdHJ0LmN0bC5kZiRUeXBlID09ICJGIiwgImQxNGNfY29ycl9zZC5jdGwiXV4yL3RydC5jdGwuZGZbdHJ0LmN0bC5kZiRFeHBlcmltZW50ID09ICJyZXdldCIgJiB0cnQuY3RsLmRmJFR5cGUgPT0gIkYiLCAibl9tZWFuLmN0bCJdKQoKIyB0cmVhdG1lbnQKZi50cnQuZGlmIDwtIHRydC5jdGwuZGZbdHJ0LmN0bC5kZiRFeHBlcmltZW50ID09ICJhcmMiICYgdHJ0LmN0bC5kZiRUeXBlID09ICJGIiwgImQxNGNfY29ycl9tZWFuLnRydCJdIC0gdHJ0LmN0bC5kZlt0cnQuY3RsLmRmJEV4cGVyaW1lbnQgPT0gInJld2V0IiAmIHRydC5jdGwuZGYkVHlwZSA9PSAiRiIsICJkMTRjX2NvcnJfbWVhbi50cnQiXQoKZi50cnQuZGlmLnNkIDwtIHNxcnQodHJ0LmN0bC5kZlt0cnQuY3RsLmRmJEV4cGVyaW1lbnQgPT0gImFyYyIgJiB0cnQuY3RsLmRmJFR5cGUgPT0gIkYiLCAiZDE0Y19jb3JyX3NkLnRydCJdXjIvdHJ0LmN0bC5kZlt0cnQuY3RsLmRmJEV4cGVyaW1lbnQgPT0gImFyYyIgJiB0cnQuY3RsLmRmJFR5cGUgPT0gIkYiLCAibl9tZWFuLnRydCJdICsgdHJ0LmN0bC5kZlt0cnQuY3RsLmRmJEV4cGVyaW1lbnQgPT0gInJld2V0IiAmIHRydC5jdGwuZGYkVHlwZSA9PSAiRiIsICJkMTRjX2NvcnJfc2QudHJ0Il1eMi90cnQuY3RsLmRmW3RydC5jdGwuZGYkRXhwZXJpbWVudCA9PSAicmV3ZXQiICYgdHJ0LmN0bC5kZiRUeXBlID09ICJGIiwgIm5fbWVhbi50cnQiXSkKCgojIGdyYXNzbGFuZHMKIyBjb250cm9sCmcuY3RsLmRpZiA8LSB0cnQuY3RsLmRmW3RydC5jdGwuZGYkRXhwZXJpbWVudCA9PSAiYXJjIiAmIHRydC5jdGwuZGYkVHlwZSA9PSAiRyIsICJkMTRjX2NvcnJfbWVhbi5jdGwiXSAtIHRydC5jdGwuZGZbdHJ0LmN0bC5kZiRFeHBlcmltZW50ID09ICJyZXdldCIgJiB0cnQuY3RsLmRmJFR5cGUgPT0gIkciLCAiZDE0Y19jb3JyX21lYW4uY3RsIl0KCmcuY3RsLmRpZi5zZCA8LSBzcXJ0KHRydC5jdGwuZGZbdHJ0LmN0bC5kZiRFeHBlcmltZW50ID09ICJhcmMiICYgdHJ0LmN0bC5kZiRUeXBlID09ICJHIiwgImQxNGNfY29ycl9zZC5jdGwiXV4yL3RydC5jdGwuZGZbdHJ0LmN0bC5kZiRFeHBlcmltZW50ID09ICJhcmMiICYgdHJ0LmN0bC5kZiRUeXBlID09ICJHIiwgIm5fbWVhbi5jdGwiXSArIHRydC5jdGwuZGZbdHJ0LmN0bC5kZiRFeHBlcmltZW50ID09ICJyZXdldCIgJiB0cnQuY3RsLmRmJFR5cGUgPT0gIkciLCAiZDE0Y19jb3JyX3NkLmN0bCJdXjIvdHJ0LmN0bC5kZlt0cnQuY3RsLmRmJEV4cGVyaW1lbnQgPT0gInJld2V0IiAmIHRydC5jdGwuZGYkVHlwZSA9PSAiRyIsICJuX21lYW4uY3RsIl0pCgojIHRyZWF0bWVudApnLnRydC5kaWYgPC0gdHJ0LmN0bC5kZlt0cnQuY3RsLmRmJEV4cGVyaW1lbnQgPT0gImFyYyIgJiB0cnQuY3RsLmRmJFR5cGUgPT0gIkciLCAiZDE0Y19jb3JyX21lYW4udHJ0Il0gLSB0cnQuY3RsLmRmW3RydC5jdGwuZGYkRXhwZXJpbWVudCA9PSAicmV3ZXQiICYgdHJ0LmN0bC5kZiRUeXBlID09ICJHIiwgImQxNGNfY29ycl9tZWFuLnRydCJdCgpnLnRydC5kaWYuc2QgPC0gc3FydCh0cnQuY3RsLmRmW3RydC5jdGwuZGYkRXhwZXJpbWVudCA9PSAiYXJjIiAmIHRydC5jdGwuZGYkVHlwZSA9PSAiRyIsICJkMTRjX2NvcnJfc2QudHJ0Il1eMi90cnQuY3RsLmRmW3RydC5jdGwuZGYkRXhwZXJpbWVudCA9PSAiYXJjIiAmIHRydC5jdGwuZGYkVHlwZSA9PSAiRyIsICJuX21lYW4udHJ0Il0gKyB0cnQuY3RsLmRmW3RydC5jdGwuZGYkRXhwZXJpbWVudCA9PSAicmV3ZXQiICYgdHJ0LmN0bC5kZiRUeXBlID09ICJHIiwgImQxNGNfY29ycl9zZC50cnQiXV4yL3RydC5jdGwuZGZbdHJ0LmN0bC5kZiRFeHBlcmltZW50ID09ICJyZXdldCIgJiB0cnQuY3RsLmRmJFR5cGUgPT0gIkciLCAibl9tZWFuLnRydCJdKQoKIyBhdG0KIyBsb2FkIGF0bW9zcGhlcmljIGRhdGEgZnJvbSBJU1JhRCBhbmQgYmluZCBmdXR1cmUgcHJvamVjdGlvbgpEYXRtIDwtIHJiaW5kKGdyYXZlbiwgZnV0dXJlMTRDKQpEYXRtIDwtIERhdG1bRGF0bSREYXRlID4gMTkwMCwgYygiRGF0ZSIsICJOSGMxNCIpXQphdG0uZGlmIDwtIERhdG1bRGF0bSREYXRlID09IDIwMTEuNSwgIk5IYzE0Il0gLSBEYXRtW0RhdG0kRGF0ZSA9PSAyMDE5LjUsICJOSGMxNCJdCgpkaWYudGltZS5kZiA8LSBkYXRhLmZyYW1lKGRpZiA9IGMoZi5jdGwuZGlmLCBmLnRydC5kaWYsIGcuY3RsLmRpZiwgZy50cnQuZGlmLCBhdG0uZGlmKSwKICAgICAgICAgICAgICAgICAgICAgICAgICBzZCA9IGMoZi5jdGwuZGlmLnNkLCBmLnRydC5kaWYuc2QsIGcuY3RsLmRpZi5zZCwgZy50cnQuZGlmLnNkLCBOQSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgVHlwZSA9IGMocmVwKGMoIkYiLCJHIiksIGVhY2ggPSAyKSwgImF0bSIpLAogICAgICAgICAgICAgICAgICAgICAgICAgIFRyZWF0bWVudCA9IGMocmVwKGMoIkN0bCIsIlRydCIpLCAyKSwgIk5BIikpCmBgYAoKIyMgVHJlYXRtZW50IGVmZmVjdCBvbiAkXERlbHRhJF4xNF5DLUNPfjJ+IGZvciBhbGwgc2FtcGxlcyAoRXhwZXJpbWVudHMgMSwgMiwgYW5kIDMpCgpgYGB7ciAxNGMtdHJ0LWRpZnN9CiMgRmlsdGVyIGRhdGEgdG8gImluYyIsIHNwbGl0IGJ5IGJpbmFyeSB0cmVhdG1lbnQgdmFyaWFibGUsIHRoZW4gbWVyZ2UKIyBjb2xsYXBzZSB0cmVhdG1lbnQgdmFyaWFibGUgaW50byBiaW5hcnkgY29udHJvbC90cmVhdG1lbnQKYWxsLjE0Yy5zdW0uZGYkdHJlYXQuYmkgPC0gaWZlbHNlKGFsbC4xNGMuc3VtLmRmJFRyZWF0bWVudCA9PSAiY29udHJvbCIsICJjb250cm9sIiwgInRyZWF0bWVudCIpCgphbGwuMTRjLmN0bCA8LSBhbGwuMTRjLnN1bS5kZlthbGwuMTRjLnN1bS5kZiR0cmVhdC5iaSA9PSAiY29udHJvbCIgJiBhbGwuMTRjLnN1bS5kZiRQZXJpb2QgPT0gImluYyIsIF0KYWxsLjE0Yy5jdGwgPC0gcmVuYW1lX2F0KGFsbC4xNGMuY3RsLCB2YXJzKGNvbnRhaW5zKCdkMTRjJykpLCBsaXN0KH5wYXN0ZTAoLiwgIl9jdGwiKSkpCmFsbC4xNGMudHJ0IDwtIGFsbC4xNGMuc3VtLmRmW2FsbC4xNGMuc3VtLmRmJHRyZWF0LmJpID09ICJ0cmVhdG1lbnQiICYgYWxsLjE0Yy5zdW0uZGYkUGVyaW9kID09ICJpbmMiLCBdCmFsbC4xNGMudHJ0IDwtIHJlbmFtZV9hdChhbGwuMTRjLnRydCwgdmFycyhjb250YWlucygnZDE0YycpKSwgbGlzdCh+cGFzdGUwKC4sICJfdHJ0IikpKQphbGwuMTRjLmN0bC50cnQgPC0gaW5uZXJfam9pbihkYXRhLmZyYW1lKGFsbC4xNGMuY3RsKSAlPiUgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0KElELCBFeHBlcmltZW50LCBUeXBlLCBTaXRlLCBIb3Jpem9uLCBjb250YWlucygiZDE0Y19jb3JyIikpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLmZyYW1lKGFsbC4xNGMudHJ0KSAlPiUgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0KElELCBFeHBlcmltZW50LCBUeXBlLCBTaXRlLCBIb3Jpem9uLCBjb250YWlucygiZDE0Y19jb3JyIikpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBieSA9IGMoIklEIiwgIkV4cGVyaW1lbnQiLCAiVHlwZSIsICJTaXRlIiwgIkhvcml6b24iKSkKCiMgRmlyc3QgYWRkIFllYXJTYW1wbGVkIGFuZCBZZWFyTWVhc3VyZWQgY29sdW1ucwphbGwuMTRjLmN0bC50cnQkWWVhclNhbXBsZWQgPC0gdW5saXN0KGFsbC4xNGMuc3VtLmRmW21hdGNoKGFsbC4xNGMuY3RsLnRydCRJRCwgYWxsLjE0Yy5zdW0uZGYkSUQpLCAiWWVhclNhbXBsZWQiXSkKIyBjb3JyZWN0IGFyY2hpdmUgc2FtcGxlIFllYXJTYW1wbGVkCmFsbC4xNGMuY3RsLnRydFthbGwuMTRjLmN0bC50cnQkRXhwZXJpbWVudCA9PSAiYXJjIiAmIGFsbC4xNGMuY3RsLnRydCRTaXRlID09ICJIYWluaWNoIiwgIlllYXJTYW1wbGVkIl0gPC0gMjAxMQoKIyBhZGQgeWVhciBtZWFzdXJlZCBjb2x1bW4sIG1vZGlmeSBmb3IgdG1lLm1pc2Mgc2FtcGxlcywgcmV3ZXQgc2FtcGxlcwphbGwuMTRjLmN0bC50cnQkWWVhck1lYXN1cmVkIDwtIDIwMTgKYWxsLjE0Yy5jdGwudHJ0W2FsbC4xNGMuY3RsLnRydCRFeHBlcmltZW50ID09ICJyZXdldCIsICJZZWFyTWVhc3VyZWQiXSA8LSAyMDE5CmFsbC4xNGMuY3RsLnRydFt3aGljaChhbGwuMTRjLmN0bC50cnQkSUQgJWluJSB0bWUubWlzYyRJRCksICJZZWFyTWVhc3VyZWQiXSA8LSAyMDA5CgojIGNhbGN1bGF0ZSBzdG9yYWdlIGR1cmF0aW9uIG51bWVyaWNhbGx5IGFuZCBhcyBmYWN0b3IKYWxsLjE0Yy5jdGwudHJ0JHRtZSA8LSB1bmxpc3QoYWxsLjE0Yy5jdGwudHJ0JFllYXJNZWFzdXJlZCAtIGFsbC4xNGMuY3RsLnRydCRZZWFyU2FtcGxlZCkKYWxsLjE0Yy5jdGwudHJ0JHRtZS5mIDwtIGZhY3RvcihhbGwuMTRjLmN0bC50cnQkdG1lKQoKIyBhZGQgZGlmZmVyZW5jZSBjb2x1bW4KIyAoZXhwcmVzc2VkIGFzIGRpZmZlcmVuY2Ugb2YgbWVhbnMpCmFsbC4xNGMuY3RsLnRydCRjdGwudHJ0LmQxNCA8LSBhbGwuMTRjLmN0bC50cnQkZDE0Y19jb3JyX21lYW5fY3RsIC0gYWxsLjE0Yy5jdGwudHJ0JGQxNGNfY29ycl9tZWFuX3RydAojIHRydC1jdGwgbWFrZXMgRmlnLiA0ICgxOjEgbGluZSkgYW5kIEZpZy4gNSAoc3RvcmFnZSBkdXJhdGlvbikgbW9yZSBjb21wYXRpYmxlCmFsbC4xNGMuY3RsLnRydCR0cnQuY3RsLmQxNCA8LSBhbGwuMTRjLmN0bC50cnQkZDE0Y19jb3JyX21lYW5fdHJ0IC0gYWxsLjE0Yy5jdGwudHJ0JGQxNGNfY29ycl9tZWFuX2N0bAoKIyBhZGQgYXRtIDE0QyBmb3IgeWVhciBzYW1wbGVkIGFuZCBjYWxjdWxhdGUgZGVsdGEtZGVsdGEKYWxsLjE0Yy5jdGwudHJ0JGF0bS55ci5zYW1wbGVkIDwtIERhdG1bbWF0Y2goYWxsLjE0Yy5jdGwudHJ0JFllYXJTYW1wbGVkLCBmbG9vcihEYXRtJERhdGUpKSwgIk5IYzE0Il0KYWxsLjE0Yy5jdGwudHJ0JGRkLmN0bCA8LSBhbGwuMTRjLmN0bC50cnQkZDE0Y19jb3JyX21lYW5fY3RsIC0gYWxsLjE0Yy5jdGwudHJ0JGF0bS55ci5zYW1wbGVkCmFsbC4xNGMuY3RsLnRydCRkZC50cnQgPC0gYWxsLjE0Yy5jdGwudHJ0JGQxNGNfY29ycl9tZWFuX3RydCAtIGFsbC4xNGMuY3RsLnRydCRhdG0ueXIuc2FtcGxlZAphbGwuMTRjLmN0bC50cnQkY3RsLnRydC5kZDE0IDwtIGFsbC4xNGMuY3RsLnRydCRkZC5jdGwgLSBhbGwuMTRjLmN0bC50cnQkZGQudHJ0CgojIFN0YXRzCmUxMi4xNGMuY3RsLnRydC5zdW0gPC0gYWxsLjE0Yy5jdGwudHJ0ICU+JQogIGZpbHRlcihFeHBlcmltZW50ICE9ICJ0bWUiKSAlPiUKICBzZWxlY3QoRXhwZXJpbWVudCwgVHlwZSwgZDE0Y19jb3JyX21lYW5fY3RsLCBkMTRjX2NvcnJfbWVhbl90cnQsIHRydC5jdGwuZDE0LCBkZC5jdGwsIGRkLnRydCwgY3RsLnRydC5kZDE0KSAlPiUKICBncm91cF9ieShFeHBlcmltZW50LCBUeXBlKSAlPiUKICBhZGRfdGFsbHkoKSAlPiUKICBzdW1tYXJpemVfYWxsKGxpc3QobWVhbiA9IG1lYW4sIHNkID0gc2QpLCBuYS5ybSA9IFRSVUUpCmUxMi4xNGMuY3RsLnRydC5zdW0kdHJ0LmN0bC5kMTRfc2QgPC0gc3FydChlMTIuMTRjLmN0bC50cnQuc3VtJGQxNGNfY29ycl9tZWFuX2N0bF9zZF4yL2UxMi4xNGMuY3RsLnRydC5zdW0kbl9tZWFuICsgZTEyLjE0Yy5jdGwudHJ0LnN1bSRkMTRjX2NvcnJfbWVhbl90cnRfc2ReMi9lMTIuMTRjLmN0bC50cnQuc3VtJG5fbWVhbikKYGBgCgpgYGB7ciBwbG90LTE0Yy1hbGwtY3RsLXRydH0KIyBsaXN0IG9mIGxvY2F0aW9ucyBmb3IgcmVjb2RpbmcKbG9jIDwtIGxpc3QoCiAgICAiRHVrZSIgPSAiRHVrZSBGQUNFIGNvbnRyb2wiLAogICAgIkhvd2xhbmQiID0gIkhvd2xhbmQiLAogICAgIkhhcnZhcmQiID0gIkhhcnZhcmQgRm9yZXN0IiwKICAgICJIYWluaWNoIiA9ICJDZW50cmFsIEdlcm1hbnkiLAogICAgIlNjaG9yZmhlaWRlIiA9ICJDZW50cmFsIEdlcm1hbnkiLAogICAgIk11c2ljayIgPSAiU2llcnJhIE5ldmFkYSwgQ0EiLAogICAgIlNoYXZlciIgPSAiU2llcnJhIE5ldmFkYSwgQ0EiLAogICAgIldhbGtlciBCcmFuY2giID0gIk9hayBSaWRnZSIsCiAgICAiVGVubmVzc2VlIFZhbGxleSIgPSAiT2FrIFJpZGdlIikKCiMgUGxvdCBvbiAxOjEgbGluZSB3LyBkaWFnb25hbCBsaW5lcyBzaG93aW5nIOKAsCBvZmZzZXRzCiMgZmlyc3QgY29sbGFwc2Ugc2l0ZXMgZm9yIGJldHRlciB2aXN1YWxzCmFsbC4xNGMuY3RsLnRydCAlPiUKICBmaWx0ZXIoSG9yaXpvbiA9PSAiQSIpICU+JQogIG11dGF0ZShMb2NhdGlvbiA9IHJlY29kZShTaXRlLCAhISFsb2MpKSAlPiUKICBnZ3Bsb3QoLiwgYWVzKGQxNGNfY29ycl9tZWFuX2N0bCwgZDE0Y19jb3JyX21lYW5fdHJ0LCBjb2xvciA9IExvY2F0aW9uLCBzaGFwZSA9IFR5cGUpKSArCiAgZ2VvbV9hYmxpbmUoc2xvcGUgPSAxLCBpbnRlcmNlcHQgPSAwKSArCiAgZ2VvbV9hYmxpbmUoc2xvcGUgPSAxLCBpbnRlcmNlcHQgPSAtMjAsIGxpbmV0eXBlID0gImRhc2hlZCIpICsKICBnZW9tX2FibGluZShzbG9wZSA9IDEsIGludGVyY2VwdCA9IDIwLCBsaW5ldHlwZSA9ICJkYXNoZWQiKSArCiAgZ2VvbV9hYmxpbmUoc2xvcGUgPSAxLCBpbnRlcmNlcHQgPSAtNDAsIGxpbmV0eXBlID0gImRvdHRlZCIpICsKICBnZW9tX2FibGluZShzbG9wZSA9IDEsIGludGVyY2VwdCA9IDQwLCBsaW5ldHlwZSA9ICJkb3R0ZWQiKSArCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gMCwgY29sb3IgPSAiZ3JheSIpICsKICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwLCBjb2xvciA9ICJncmF5IikgKwogIGdlb21fcG9pbnQoc2l6ZSA9IDMpICsKICBnZW9tX2Vycm9yYmFyKAogICAgYWVzKHltaW4gPSBkMTRjX2NvcnJfbWluX3RydCwgCiAgICAgICAgeW1heCA9IGQxNGNfY29ycl9tYXhfdHJ0LCAKICAgICAgICBjb2xvciA9IExvY2F0aW9uKSwgCiAgICB3aWR0aCA9IC4yNSkgKwogIGdlb21fZXJyb3JiYXJoKAogICAgYWVzKHhtaW4gPSBkMTRjX2NvcnJfbWluX2N0bCwgCiAgICAgICAgeG1heCA9IGQxNGNfY29ycl9tYXhfY3RsLCAKICAgICAgICBjb2xvciA9IExvY2F0aW9uKSwgCiAgICBoZWlnaHQgPSAuOSkgKwogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBjKCdEdWtlIEZBQ0UgY29udHJvbCcgPSAnIzAxQkI5NycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1NpZXJyYSBOZXZhZGEsIENBJyA9ICcjRkZDMTA3JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnQ2VudHJhbCBHZXJtYW55JyA9ICdibGFjaycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0hhcnZhcmQgRm9yZXN0JyA9ICcjMUU4OEU1JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnT2FrIFJpZGdlJyA9ICcjRDgxQjYwJykpICsKICBzY2FsZV9zaGFwZV9tYW51YWwobmFtZSA9ICdFY29zeXN0ZW0nLAogICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgPSBjKCdGJz0gMTcsJ0cnID0gMTYpLAogICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBjKCdGb3Jlc3QnLCdHcmFzc2xhbmQnKSkgKwogIHhsYWIoZXhwcmVzc2lvbignQ29udHJvbCAnKkRlbHRhKicnXjE0KidDICjigLApJykpICsKICB5bGFiKGV4cHJlc3Npb24oJ1RyZWF0bWVudCAnKkRlbHRhKicnXjE0KidDICjigLApJykpICsKICB0aGVtZV9idygpICsKICB0aGVtZShwYW5lbC5ncmlkID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgIGxlZ2VuZC5rZXkuaGVpZ2h0PXVuaXQoLjgsICJjbSIpLAogICAgICAgIGFzcGVjdC5yYXRpbyA9IDEpCgojIGZvciBwbG90dGluZyB3aXRoIGNvbG9yID0gVHlwZSAoY3VycmVudGx5IHN1cHByZXNzZWQpCiMgYWxsLjE0Yy5jdGwudHJ0ICU+JQojICAgZmlsdGVyKEhvcml6b24gPT0gIkEiKSAlPiUKIyAgIG11dGF0ZShMb2NhdGlvbiA9IGZhY3RvcihyZWNvZGUoU2l0ZSwgISEhbG9jKSwgZXhjbHVkZSA9IFRSVUUpKSAlPiUKIyAgIGdncGxvdCguLCBhZXMoZDE0Y19jb3JyX21lYW5fY3RsLCBkMTRjX2NvcnJfbWVhbl90cnQsIGNvbG9yID0gVHlwZSwgc2hhcGUgPSBMb2NhdGlvbikpICsKIyAgIGdlb21fYWJsaW5lKHNsb3BlID0gMSwgaW50ZXJjZXB0ID0gMCkgKwojICAgZ2VvbV9hYmxpbmUoc2xvcGUgPSAxLCBpbnRlcmNlcHQgPSAtMjAsIGxpbmV0eXBlID0gImRhc2hlZCIpICsKIyAgIGdlb21fYWJsaW5lKHNsb3BlID0gMSwgaW50ZXJjZXB0ID0gMjAsIGxpbmV0eXBlID0gImRhc2hlZCIpICsKIyAgIGdlb21fYWJsaW5lKHNsb3BlID0gMSwgaW50ZXJjZXB0ID0gLTQwLCBsaW5ldHlwZSA9ICJkb3RkYXNoIikgKwojICAgZ2VvbV9hYmxpbmUoc2xvcGUgPSAxLCBpbnRlcmNlcHQgPSA0MCwgbGluZXR5cGUgPSAiZG90ZGFzaCIpICsKIyAgIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IDAsIGNvbG9yID0gImdyYXkiKSArCiMgICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwLCBjb2xvciA9ICJncmF5IikgKwojICAgZ2VvbV9wb2ludChzaXplID0gMykgKwojICAgZ2VvbV9lcnJvcmJhcigKIyAgICAgYWVzKHltaW4gPSBkMTRjX2NvcnJfbWluX3RydCwgCiMgICAgICAgICB5bWF4ID0gZDE0Y19jb3JyX21heF90cnQsIAojICAgICAgICAgY29sb3IgPSBUeXBlKSwgCiMgICAgIHdpZHRoID0gLjI1KSArCiMgICBnZW9tX2Vycm9yYmFyaCgKIyAgICAgYWVzKHhtaW4gPSBkMTRjX2NvcnJfbWluX2N0bCwgCiMgICAgICAgICB4bWF4ID0gZDE0Y19jb3JyX21heF9jdGwsIAojICAgICAgICAgY29sb3IgPSBUeXBlKSwgCiMgICAgIGhlaWdodCA9IC45KSArCiMgICBzY2FsZV9jb2xvcl9tYW51YWwobmFtZSA9ICdFY29zeXN0ZW0nLAojICAgICAgICAgICAgICAgICAgICAgIHZhbHVlcyA9YygnRic9JyNhMzU1MTMnLCdHJz0nIzEzNjFhMycpLAojICAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGMoJ0ZvcmVzdCcsJ0dyYXNzbGFuZCcpKSArCiMgICB4bGFiKGV4cHJlc3Npb24oJ0NvbnRyb2wgJypEZWx0YSonJ14xNConQyAo4oCwKScpKSArCiMgICB5bGFiKGV4cHJlc3Npb24oJ1RyZWF0bWVudCAnKkRlbHRhKicnXjE0KidDICjigLApJykpICsKIyAgIHRoZW1lX2J3KCkgKwojICAgdGhlbWUocGFuZWwuZ3JpZCA9IGVsZW1lbnRfYmxhbmsoKSwKIyAgICAgICAgIGxlZ2VuZC5rZXkuaGVpZ2h0PXVuaXQoLjgsICJjbSIpLAojICAgICAgICAgYXNwZWN0LnJhdGlvID0gMSkKYGBgCj4qKkZpZy4gYHIge2ZpZy5uICsgMn1gLiBPdmVyYWxsIHRyZWF0bWVudCBlZmZlY3Qgb24gJFxEZWx0YSReMTReQy1DT34yfioqCgo+KkNhcHRpb246KiBQb2ludHMgc2hvdyBkYXRhIGZyb20gRXhwZXJpbWVudHMgMSBhbmQgMyAoYWlyLWRyeSArIHN0b3JhZ2UgdHJlYXRtZW50KSBhbmQgRXhwZXJpbWVudCAyIChhaXItZHJ5IG9ubHkgdHJlYXRtZW50KS4gUG9pbnRzIGFyZSB0aGUgbWVhbiBvZiBsYWJvcmF0b3J5IHJlcGxpY2F0ZXMgKGZvciByZXBsaWNhdGVkIHNhbXBsZXMpOyBlcnJvciBiYXJzIGFyZSAyeCBzdGFuZGFyZCBlcnJvci4gU29saWQgbGluZSBpcyAxOjEuIEZvciBjb250ZXh0LCB0aGUgZGFzaGVkIGFuZCBkb3R0ZWQgbGluZXMgc2hvdyBkaWZmZXJlbmNlcyBvZiDCsTIw4oCwIGFuZCDCsSQ0MOKAsCwgZXF1aXZhbGVudCB0byB0aGUgZGVjbGluZSBpbiAkXERlbHRhJF4xNF5DIGluIGF0bW9zcGhlcmljIENPfjJ+IG92ZXIgNCBhbmQgOCB5IHJlc3BlY3RpdmVseSwgZHVyaW5nIHRoZSBwZXJpb2Qgb2YgMjAwMCB0byAyMDIwIChHcmF2ZW4gZXQgYWwuIDIwMTcpLgoKIyMgU3RvcmFnZSBkdXJhdGlvbiBlZmZlY3Qgb24gXjE0XkMtQ09+Mn4gKEV4cGVyaW1lbnQgMykKCmBgYHtyIHBsb3QtZHVyLXN0b3IsIGZpZy5oZWlnaHQ9NH0KIyBQbG90IHN0b3JhZ2UgZHVyYXRpb24Kc3VwcHJlc3NXYXJuaW5ncygKICBhbGwuMTRjLmN0bC50cnQgJT4lCiAgZmlsdGVyKEhvcml6b24gPT0gIkEiKSAlPiUKICBmaWx0ZXIoRXhwZXJpbWVudCAhPSAicmV3ZXQiKSAlPiUKICBzZWxlY3QoVHlwZSwgdG1lLmYsIFNpdGUsIHRydC5jdGwuZDE0LCB0bWUpICU+JQogIGdyb3VwX2J5KFR5cGUsIHRtZS5mLCBTaXRlKSAlPiUKICBhZGRfdGFsbHkoKSAlPiUKICBzdW1tYXJpc2VfYWxsKGxpc3QobWVhbiA9IG1lYW4sIHNkID0gc2QpLCBuYS5ybSA9IFRSVUUpICU+JQogIG11dGF0ZShkaWZfc2UgPSB0cnQuY3RsLmQxNF9zZC9uX21lYW4sCiAgICAgICAgIGRpZl91ID0gdHJ0LmN0bC5kMTRfbWVhbiArIGRpZl9zZSoyLAogICAgICAgICBkaWZfbCA9IHRydC5jdGwuZDE0X21lYW4gLSBkaWZfc2UqMikgJT4lCiAgbXV0YXRlKExvY2F0aW9uID0gZmFjdG9yKHJlY29kZShTaXRlLCAhISFsb2MpLCBleGNsdWRlID0gVFJVRSkpICU+JQogIGdncGxvdCguLCBhZXModG1lX21lYW4sIHRydC5jdGwuZDE0X21lYW4sIGNvbG9yID0gTG9jYXRpb24sIHNoYXBlID0gVHlwZSkpICsKICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwKSArCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gLTIwLCBsaW5ldHlwZSA9ICJkYXNoZWQiKSArCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMjAsIGxpbmV0eXBlID0gImRhc2hlZCIpICsKICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSA0MCwgbGluZXR5cGUgPSAiZG90dGVkIikgKwogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IC00MCwgbGluZXR5cGUgPSAiZG90dGVkIikgKwogIGdlb21fcG9pbnQoc2l6ZSA9IDMsIHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2UyKHdpZHRoID0gLjcsIHByZXNlcnZlID0gInNpbmdsZSIpKSArCiAgZ2VvbV9lcnJvcmJhcigKICAgIGFlcyh5bWluID0gZGlmX2wsCiAgICAgICAgeW1heCA9IGRpZl91LCAKICAgICAgICBjb2xvciA9IExvY2F0aW9uKSwKICAgIHdpZHRoID0gLjcsCiAgICBwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlMih3aWR0aCA9IC43LCBwcmVzZXJ2ZSA9ICJzaW5nbGUiKSkgKwogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBjKCdEdWtlIEZBQ0UgY29udHJvbCcgPSAnIzAxQkI5NycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1NpZXJyYSBOZXZhZGEsIENBJyA9ICcjRkZDMTA3JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnQ2VudHJhbCBHZXJtYW55JyA9ICdibGFjaycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0hhcnZhcmQgRm9yZXN0JyA9ICcjMUU4OEU1JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnT2FrIFJpZGdlJyA9ICcjRDgxQjYwJykpICsKICBzY2FsZV9zaGFwZV9tYW51YWwobmFtZSA9ICdFY29zeXN0ZW0nLAogICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgPSBjKCdGJz0gMTcsJ0cnID0gMTYpLAogICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBjKCdGb3Jlc3QnLCdHcmFzc2xhbmQnKSkgKwogIHNjYWxlX3hfY29udGludW91cyhicmVha3MgPSBzZXEoNSwxMywyKSkgKwogIHlsYWIoZXhwcmVzc2lvbignVHJlYXRtZW50IC0gQ29udHJvbCAnKkRlbHRhKicnXjE0KidDICjigLApJykpICsKICB4bGFiKCJTdG9yYWdlIGR1cmF0aW9uICh5ZWFycykiKSArCiAgdGhlbWVfYncoKSArCiAgdGhlbWUocGFuZWwuZ3JpZCA9IGVsZW1lbnRfYmxhbmsoKSkKICApCmBgYAoKPioqRmlnLiBgciB7ZmlnLm4gKyAzfWAuIENoYW5nZSBpbiBeMTReQy1DT34yfiBpbiByZWxhdGlvbiB0byBzdG9yYWdlIGR1cmF0aW9uKioKCj4qQ2FwdGlvbjoqIERhdGEgYXJlIGZyb20gYm90aCBFeHBlcmltZW50IDEgKGluIGJsYWNrKSBhbmQgRXhwZXJpbWVudCAzIChhbGwgb3RoZXIgcG9pbnRzKSwgYXZlcmFnZWQgYnkgc2l0ZSBhbmQgZWNvc3lzdGVtIHR5cGUuIFBvaW50cyBhcmUgdGhlIG1lYW4sIGVycm9yIGJhcnMgYXJlIDJ4IHN0YW5kYXJkIGVycm9yLiBGb3IgY29udGV4dCwgdGhlIGRhc2hlZCBhbmQgZG90dGVkIGxpbmVzIGFyZSB0aGUgc2FtZSBpcyBpbiBGaWcuIGByIHtmaWcubiArIDN9YCBhbmQgc2hvdyBhIGRpZmZlcmVuY2Ugb2YgMjDigLAgYW5kIDQw4oCwLCBlcXVpdmFsZW50IHRvIHRoZSBkZWNsaW5lIGluICRcRGVsdGEkXjE0XkMgaW4gYXRtb3NwaGVyaWMgQ09+Mn4gb3ZlciA0IGFuZCA4IHkgcmVzcGVjdGl2ZWx5LCBkdXJpbmcgdGhlIHBlcmlvZCBvZiAyMDAwIHRvIDIwMjAgKEdyYXZlbiBldCBhbC4gMjAxNykuIFBvc2l0aW9uIG9mIHBvaW50cyBqaXR0ZXJlZCB0byBhdm9pZCBvdmVycGxvdHRpbmc7IHN0b3JhZ2UgZHVyYXRpb24gaGFzIGJlZW4gcm91bmRlZCBkb3duIHRvIHRoZSBuZWFyZXN0IHdob2xlIHllYXIuCgpgYGB7ciB0cmVhdG1lbnQgZWZmZWN0cyBieSB0aW1lLCBmaWcuaGVpZ2h0PTR9CiMgIyBjb2RlIGZvciBwbG90dGluZyBkYXRhIGJ5IElECiMgYWxsLjE0Yy5zdW0gJT4lCiMgICBmaWx0ZXIoUGVyaW9kID09ICJpbmMiKSAlPiUKIyAgIGZpbHRlcighZ3JlcGwoIlMiLCBJRCkpICU+JQojICAgbXV0YXRlKHllYXIuSUQgPSBwYXN0ZShZZWFyU2FtcGxlZCwgSUQpKSAlPiUKIyAgIGdncGxvdCguLCBhZXMoWWVhclNhbXBsZWQsIGQxNGNfY29ycl9tZWFuLCBjb2xvciA9IFR5cGUpKSArCiMgICBnZW9tX3BvaW50KGFlcyhzaGFwZSA9IFRyZWF0bWVudCksIHNpemUgPSAzKSArCiMgICBnZW9tX3BhdGgoYWVzKGdyb3VwID0geWVhci5JRCksIAojICAgICAgICAgICAgIGFycm93ID0gYXJyb3codHlwZSA9ICJvcGVuIiwgbGVuZ3RoID0gdW5pdCguMSwgImluY2hlcyIpLCBlbmRzID0gImxhc3QiKSwKIyAgICAgICAgICAgICBzaG93LmxlZ2VuZCA9IEZBTFNFKSArCiMgICBnZW9tX3BhdGgoZGF0YSA9IERhdG0sIGFlcyhEYXRlLCBOSGMxNCksIGNvbG9yID0gImRhcmtncmF5IikgKwojICAgc2NhbGVfY29sb3JfbWFudWFsKG5hbWUgPSAnRWNvc3lzdGVtJywKIyAgICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgPWMoJ0YnPScjYTM1NTEzJywnRyc9JyMxMzYxYTMnKSwKIyAgICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBjKCdGb3Jlc3QnLCdHcmFzc2xhbmQnKSkgKwojICAgc2NhbGVfc2hhcGVfbWFudWFsKG5hbWUgPSAnVHJlYXRtZW50JywKIyAgICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgPSBjKCJhaXItZHJ5IiA9IDEsIAojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFpci1kcnkgKyBzdG9yYWdlIiA9IDAsCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29udHJvbCIgPSAxNikpICsKIyAgIHNjYWxlX3hfY29udGludW91cyhsaW1pdHMgPSBjKDIwMTAsIDIwMjApLCBicmVha3MgPSBjKDIwMTMsIDIwMTYsIDIwMTkpKSArCiMgICBzY2FsZV95X2NvbnRpbnVvdXMobGltaXRzID0gYygtMTUsIDEwMCkpICsKIyAgIHhsYWIoJ1llYXIgc2FtcGxlZCcpICsKIyAgIHlsYWIoZXhwcmVzc2lvbignbWVhbiAnKkRlbHRhKicnXjE0KidDICjigLApJykpICsKIyAgIGZhY2V0X3dyYXAofiBJRCwgbmNvbCA9IDMpICsKIyAgIHRoZW1lX2J3KCkgKwojICAgdGhlbWUocGFuZWwuZ3JpZCA9IGVsZW1lbnRfYmxhbmsoKSkKCiMgQWRkICJUeXBlIiB0byBEYXRtIHRvIGRpc3BsYXkgbGVnZW5kCkRhdG0kQXRtb3NwaGVyZSA8LSAiYXRtb3NwaGVyZSIKCiMgcGxvdCBvdmVyIHRpbWUsIGF2ZXJhZ2VkIGJ5IFR5cGUKYWxsLjE0Yy5zdW0yICU+JQogIGZpbHRlcihQZXJpb2QgPT0gImluYyIpICU+JQogIG11dGF0ZSh5ZWFyLlR5cGUgPSBwYXN0ZShZZWFyU2FtcGxlZCwgVHlwZSksCiAgICAgICAgIEVjbyA9IGlmZWxzZShUeXBlID09ICJGIiwgIkZvcmVzdCIsICJHcmFzc2xhbmQiKSkgJT4lCiAgZ2dwbG90KC4sIGFlcyhZZWFyU2FtcGxlZCwgZDE0Y19jb3JyX21lYW4sIGNvbG9yID0gVHlwZSkpICsKICBnZW9tX3BvaW50KGFlcyhzaGFwZSA9IFRyZWF0bWVudCksIHNpemUgPSAzLCBzdHJva2UgPSAxLjUpICsKICBnZW9tX3BhdGgoYWVzKGdyb3VwID0geWVhci5UeXBlKSwgCiAgICAgICAgICAgIGFycm93ID0gYXJyb3codHlwZSA9ICJvcGVuIiwgbGVuZ3RoID0gdW5pdCguMSwgImluY2hlcyIpLCBlbmRzID0gImZpcnN0IiksCiAgICAgICAgICAgIHNob3cubGVnZW5kID0gRkFMU0UsCiAgICAgICAgICAgIHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2Uod2lkdGggPSAyLCBwcmVzZXJ2ZSA9ICJzaW5nbGUiKSwKICAgICAgICAgICAgc2l6ZSA9IDEuMikgKwogIGdlb21fcGF0aChkYXRhID0gRGF0bSwgYWVzKERhdGUsIE5IYzE0LCBsaW5ldHlwZSA9IEF0bW9zcGhlcmUpLCBjb2xvciA9ICJkYXJrZ3JheSIpICsKICBnZW9tX2Vycm9yYmFyKAogICAgYWVzKHltaW4gPSBkMTRjX2NvcnJfbCwgCiAgICAgICAgeW1heCA9IGQxNGNfY29ycl91LCAKICAgICAgICBjb2xvciA9IFR5cGUpLCAKICAgIHdpZHRoID0gLjUsCiAgICBhbHBoYSA9IC4zKSArCiAgc2NhbGVfY29sb3JfbWFudWFsKG5hbWUgPSAnRWNvc3lzdGVtJywKICAgICAgICAgICAgICAgICAgICAgdmFsdWVzID0gYygnRic9JyNhMzU1MTMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdHJz0nIzEzNjFhMycpLAogICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBjKCdGb3Jlc3QnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdHcmFzc2xhbmQnKSkgKwogIHNjYWxlX3NoYXBlX21hbnVhbChuYW1lID0gJ1RyZWF0bWVudCcsCiAgICAgICAgICAgICAgICAgICAgIHZhbHVlcyA9IGMoImFpci1kcnkiID0gMSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFpci1kcnkgKyBzdG9yYWdlIiA9IDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvbnRyb2wiID0gMTYpLAogICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBjKCJhaXItZHJ5IiA9ICJhaXItZHJ5IiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFpci1kcnkgKyBzdG9yYWdlIiA9ICJhaXItZHJ5ICsgc3RvcmFnZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvbnRyb2wiID0gImNvbnRyb2wtMSAoMjAxMSlcbmNvbnRyb2wtMiAoMjAxOSkiKSkgKwogIGd1aWRlcyhsaW5ldHlwZSA9IGd1aWRlX2xlZ2VuZCh0aXRsZSA9IE5VTEwpKSArCiAgc2NhbGVfeF9jb250aW51b3VzKGxpbWl0cyA9IGMoMjAxMCwgMjAyMCksIGJyZWFrcyA9IGMoMjAxMywgMjAxNiwgMjAxOSkpICsKICBzY2FsZV95X2NvbnRpbnVvdXMobGltaXRzID0gYygtMTUsIDEwMCkpICsKICB4bGFiKCdZZWFyIHNhbXBsZWQnKSArCiAgeWxhYihleHByZXNzaW9uKCdtZWFuICcqRGVsdGEqJydeMTQqJ0MgKOKAsCknKSkgKwogIGZhY2V0X2dyaWQoY29scyA9IHZhcnMoRWNvKSkgKwogIHRoZW1lX2J3KCkgKwogIHRoZW1lKHBhbmVsLmdyaWQgPSBlbGVtZW50X2JsYW5rKCkpCmBgYAo+KipGaWcgYHIge2ZpZy5uICsgNH1gLiBUaW1lIHNlcmllcyBvZiBjb250cm9sIGFuZCB0cmVhdG1lbnQgJFxEZWx0YSReMTReQy1DT34yfiAoRXhwZXJpbWVudHMgMSBhbmQgMikqKgoKPipDYXB0aW9uOiogRmlsbGVkIGNpcmNsZXMgc2hvdyAkXERlbHRhJF4xNF5DLUNPfjJ+IG9ic2VydmVkIGZvciBib3RoIGNvbnRyb2wtMSBhbmQgY29udHJvbC0yIHNhbXBsZXMgKDIwMTEgYW5kIDIwMTkgcG9pbnRzLCByZXNwZWN0aXZlbHkpLiBPcGVuIHN5bWJvbHMgc2hvdyAkXERlbHRhJF4xNF5DLUNPfjJ+IG9ic2VydmVkIGZvciB0cmVhbWVudCBzYW1wbGVzOiBvcGVuIHNxdWFyZXMgPSBhaXItZHJ5ICsgc3RvcmFnZSB0cmVhdG1lbnQsIEV4cGVyaW1lbnQgMTsgb3BlbiBjaXJjbGVzID0gYWlyLWRyeSBvbmx5IHRyZWF0bWVudCwgRXhwZXJpbWVudCAyLiBBcnJvd3Mgc2hvdyB0aGUgZGlyZWN0aW9uIG9mIGNoYW5nZSBpbiAkXERlbHRhJF4xNF5DLUNPfjJ+IHJlbGF0aXZlIHRvIHRoZSBjb250cm9scy4gUG9pbnRzIGFyZSBtZWFucyBhbmQgZXJyb3IgYmFycyBzaG93IDJ4IHN0YW5kYXJkIGVycm9yLiBUaGUgZ3JheSBsaW5lIHNob3dzICRcRGVsdGEkXjE0XkMgb2YgdGhlIGF0bW9zcGhlcmUuCgpUaGUgYWJzb2x1dGUgbWVhbiBkaWZmZXJlbmNlIGluIF4xNF5DLUNPfjJ+IGJldHdlZW4gY29udHJvbCBhbmQgdHJlYXRtZW50IHNhbXBsZXMgd2FzIGdyZWF0ZXIgaW4gZ3Jhc3NsYW5kIHNhbXBsZXMgKGByIHtyb3VuZChtZWFuKGFicyh0cnQuY3RsLmRmW3RydC5jdGwuZGYkVHlwZSA9PSAiRyIsICJkMTRjX2NvcnJfbWVhbi5jdGwiXSAtIHRydC5jdGwuZGZbdHJ0LmN0bC5kZiRUeXBlID09ICJHIiwgImQxNGNfY29ycl9tZWFuLnRydCJdKSksIDEpfWDigLApIHRoYW4gaW4gZm9yZXN0IHNhbXBsZXMgKGByIHtyb3VuZChtZWFuKGFicyh0cnQuY3RsLmRmW3RydC5jdGwuZGYkVHlwZSA9PSAiRiIsICJkMTRjX2NvcnJfbWVhbi5jdGwiXSAtIHRydC5jdGwuZGZbdHJ0LmN0bC5kZiRUeXBlID09ICJGIiwgImQxNGNfY29ycl9tZWFuLnRydCJdKSksIDEpfWDigLApIGZvciBib3RoIEV4cGVyaW1lbnQgMSBhbmQgRXhwZXJpbWVudCAyLiAKCmBgYHtyIHNpZGUtYnktc2lkZSBwbG90LCBpbmNsdWRlID0gRkFMU0V9CiMgcGxvdCBhcyBzaWRlLWJ5LXNpZGUgbWVhbnMgdy8gMnhTRQojIHdpbGwgY2hhbmdlIHRvIDk1JUNJcyBhdCBzb21lIHBvaW50LCBidXQgbmVlZCB0byBjYWxjdWxhdGUgdGVzdCBzdGF0aXN0aWMgd2l0aCBhcHByb3ByaWF0ZSBkZgphbGwuMTRjLnN1bTIgJT4lCiAgZmlsdGVyKFBlcmlvZCA9PSAiaW5jIikgJT4lCiAgZ2dwbG90KC4sIGFlcyh0cmVhdC5iaSwgZDE0Y19jb3JyX21lYW4sIGNvbG9yID0gVHlwZSkpICsKICBnZW9tX3BvaW50KGFlcyhzaGFwZSA9IFRyZWF0bWVudCksIHNpemUgPSAzKSArCiAgZ2VvbV9lcnJvcmJhcigKICAgIGFlcyh5bWluID0gZDE0Y19jb3JyX3UsIAogICAgICAgIHltYXggPSBkMTRjX2NvcnJfbCwgCiAgICAgICAgY29sb3IgPSBUeXBlKSwgCiAgICB3aWR0aCA9IC4xKSArCiAgc2NhbGVfY29sb3JfbWFudWFsKG5hbWUgPSAnRWNvc3lzdGVtJywKICAgICAgICAgICAgICAgICAgICAgdmFsdWVzID1jKCdGJz0nI2EzNTUxMycsJ0cnPScjMTM2MWEzJyksCiAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGMoJ2ZvcmVzdCcsJ2dyYXNzbGFuZCcpKSArCiAgc2NhbGVfc2hhcGVfbWFudWFsKG5hbWUgPSAnVHJlYXRtZW50JywKICAgICAgICAgICAgICAgICAgICAgdmFsdWVzID0gYygiYWlyLWRyeSIgPSAxLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYWlyLWRyeSArIHN0b3JhZ2UiID0gMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29udHJvbCIgPSAxNikpICsKICB5bGFiKGV4cHJlc3Npb24oJ21lYW4gJypEZWx0YSonJ14xNConQyAo4oCwKScpKSArCiAgZmFjZXRfZ3JpZChjb2xzID0gdmFycyhUeXBlKSwgcm93cyA9IHZhcnMoWWVhclNhbXBsZWQpKSArCiAgdGhlbWVfYncoKSArCiAgdGhlbWUocGFuZWwuZ3JpZCA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICBheGlzLnRpdGxlLnggPSBlbGVtZW50X2JsYW5rKCkpCgpgYGAKCiMjICRcZGVsdGEkXjEzXkMKYGBge3IgY3RsLXRydC1kaWZzLTEzY30KIyBhdmVyYWdlIGNvbnRyb2wgYW5kIHRyZWF0bWVudCBkYXRhCiMgbm90ZSB0aGF0IHVwcGVyL2xvd2VyIGxpbWl0cyA9IDJ4U0UKCiMgUGxvdCBzaWRlLWJ5LXNpZGUgdy8gMnhTRQppc28uMTIuYXZnMiAlPiUKICBmaWx0ZXIoUGVyaW9kID09ICJpbmMiKSAlPiUKICBtdXRhdGUoWWVhclNhbXBsZWQgPSBpZmVsc2UoRXhwZXJpbWVudCA9PSAiYXJjIiwgIjIwMTEiLCAiMjAxOSIpKSAlPiUKICBtdXRhdGUoRWNvID0gaWZlbHNlKFR5cGUgPT0gIkYiLCAiRm9yZXN0IiwgIkdyYXNzbGFuZCIpKSAlPiUKICBnZ3Bsb3QoLiwgYWVzKFllYXJTYW1wbGVkLCBkMTNjX21lYW4sIGNvbG9yID0gVHlwZSkpICsKICBnZW9tX3BvaW50KGFlcyhzaGFwZSA9IFRyZWF0bWVudCksIHNpemUgPSAzKSArCiAgZ2VvbV9lcnJvcmJhcigKICAgIGFlcyh5bWluID0gZDEzY191LCAKICAgICAgICB5bWF4ID0gZDEzY19sLCAKICAgICAgICBjb2xvciA9IFR5cGUpLCAKICAgIHdpZHRoID0gLjEpICsKICBzY2FsZV9jb2xvcl9tYW51YWwobmFtZSA9ICdFY29zeXN0ZW0nLAogICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgPSBjKCdGJz0nI2EzNTUxMycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0cnPScjMTM2MWEzJyksCiAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGMoJ2ZvcmVzdCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2dyYXNzbGFuZCcpKSArCiAgc2NhbGVfc2hhcGVfbWFudWFsKG5hbWUgPSAnVHJlYXRtZW50JywKICAgICAgICAgICAgICAgICAgICAgdmFsdWVzID0gYygiYWlyLWRyeSIgPSAxLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYWlyLWRyeSArIHN0b3JhZ2UiID0gMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29udHJvbCIgPSAxNiksCiAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGMoImFpci1kcnkiID0gImFpci1kcnkiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYWlyLWRyeSArIHN0b3JhZ2UiID0gImFpci1kcnkgKyBzdG9yYWdlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29udHJvbCIgPSAiY29udHJvbC0xICgyMDExKVxuIGNvbnRyb2wtMiAoMjAxOSkiKSkgKwogIHlsYWIoZXhwcmVzc2lvbignbWVhbiAnKmRlbHRhKicnXjEzKidDICjigLApJykpICsKICBmYWNldF9ncmlkKGNvbHMgPSB2YXJzKEVjbykpICsKICB0aGVtZV9idygpICsKICB0aGVtZShwYW5lbC5ncmlkID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgIGF4aXMudGl0bGUueCA9IGVsZW1lbnRfYmxhbmsoKSkKCiMgaXNvLjEyLmF2ZzIgJT4lCiMgICBtdXRhdGUoWWVhclNhbXBsZWQgPSBpZmVsc2UoRXhwZXJpbWVudCA9PSAiYXJjIiwgIjIwMTEiLCAiMjAxOSIpLAojICAgICAgICAgIHRyZWF0LnBlcmlvZCA9IHBhc3RlKFRyZWF0bWVudCwgUGVyaW9kLCBzZXAgPSAiLiIpLAojICAgICAgICAgIEVjbyA9IGlmZWxzZShUeXBlID09ICJGIiwgIkZvcmVzdCIsICJHcmFzc2xhbmQiKSkgJT4lCiMgICBnZ3Bsb3QoLiwgYWVzKFllYXJTYW1wbGVkLCBkMTNjX21lYW4sIGNvbG9yID0gVHlwZSkpICsKIyAgIGdlb21fcG9pbnQoYWVzKHNoYXBlID0gdHJlYXQucGVyaW9kKSwgc2l6ZSA9IDMpICsKIyAgIGdlb21fZXJyb3JiYXIoCiMgICAgIGFlcyh5bWluID0gZDEzY191LAojICAgICAgICAgeW1heCA9IGQxM2NfbCwKIyAgICAgICAgIGNvbG9yID0gVHlwZSksCiMgICAgIHdpZHRoID0gLjEpICsKIyAgIHNjYWxlX2NvbG9yX21hbnVhbChuYW1lID0gJ0Vjb3N5c3RlbScsCiMgICAgICAgICAgICAgICAgICAgICAgdmFsdWVzID0gYygnRic9JyNhMzU1MTMnLCdHJz0nIzEzNjFhMycpKSArCiMgICBzY2FsZV9zaGFwZV9tYW51YWwobmFtZSA9ICdUcmVhdG1lbnQnLAojICAgICAgICAgICAgICAgICAgICAgIHZhbHVlcyA9IGMoImFpci1kcnkucHJlIiA9IDIsCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYWlyLWRyeS5pbmMiID0gMSwKIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhaXItZHJ5ICsgc3RvcmFnZS5pbmMiID0gMCwKIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhaXItZHJ5ICsgc3RvcmFnZS5wcmUiID0gNiwKIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjb250cm9sLmluYyIgPSAxNiwKIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjb250cm9sLnByZSIgPSAxNykpICsKIyAgIHlsYWIoZXhwcmVzc2lvbignbWVhbiAnKmRlbHRhKicnXjEzKidDICjigLApJykpICsKIyAgIGZhY2V0X2dyaWQoY29scyA9IHZhcnMoRWNvKSkgKwojICAgdGhlbWVfYncoKSArCiMgICB0aGVtZShwYW5lbC5ncmlkID0gZWxlbWVudF9ibGFuaygpLAojICAgICAgICAgYXhpcy50aXRsZS54ID0gZWxlbWVudF9ibGFuaygpKQpgYGAKPioqU3VwcGxlbWVudGFsIEZpZyBgciB7c2ZpZy5uICsgMn1gLiBUaW1lIHNlcmllcyBvZiBjb250cm9sIGFuZCB0cmVhdG1lbnQgJFxkZWx0YSReMTNeQy1DT34yfiAoRXhwZXJpbWVudHMgMSBhbmQgMikqKgoKPipDYXB0aW9uOiogRmlsbGVkIGNpcmNsZXMgc2hvdyAkXGRlbHRhJF4xM15DLUNPfjJ+IG9ic2VydmVkIGZvciBjb250cm9sIHNhbXBsZXMsIHdoaWxlIG9wZW4gc3ltYm9scyBzaG93ICRcZGVsdGEkXjEzXkMtQ09+Mn4gb2JzZXJ2ZWQgZm9yIHRyZWFtZW50IHNhbXBsZXMgKG9wZW4gc3F1YXJlcyA9IGFpci1kcnkgKyBzdG9yYWdlIHRyZWF0bWVudCwgRXhwZXJpbWVudCAxLCAyMDExOyBvcGVuIGNpcmNsZXMgPSBhaXItZHJ5IG9ubHkgdHJlYXRtZW50LCBFeHBlcmltZW50IDIsIDIwMTkpLiBQb2ludHMgYXJlIG1lYW5zIGFuZCBlcnJvciBiYXJzIHNob3cgMnggc3RhbmRhcmQgZXJyb3IuIAoKKkVmZmVjdCBvZiBjdW11bGF0aXZlIHJlc3BpcmVkIGNhcmJvbiBvbiBeMTReQy1DT34yfioKCmBgYHtyIGN0bC10cnQtc3RhdHMsIGluY2x1ZGUgPSBGQUxTRX0KIyBjYWxjdWxhdGUgZGlmcyBjdGwtdHJ0LCBsb29rIGF0IGVmZmVjdCBvZiBDIHJlc3AKYXJjLnJld2V0LmluYy4xNGMkdHJlYXQuYmkgPC0gaWZlbHNlKGFyYy5yZXdldC5pbmMuMTRjJFRyZWF0bWVudCA9PSAiY29udHJvbCIsICJjb250cm9sIiwgInRyZWF0bWVudCIpCmFyYy5yZXdldC5pbmMuMTRjLnN1bSA8LSBhcmMucmV3ZXQuaW5jLjE0YyAlPiUKICBncm91cF9ieShJRCwgRXhwZXJpbWVudCwgVHlwZSwgdHJlYXQuYmkpICU+JQogIGFkZF9jb3VudCgpICU+JQogIHN1bW1hcmlzZV9pZigucHJlZGljYXRlID0gZnVuY3Rpb24oeCkgaXMubnVtZXJpYyh4KSwKICAgICAgICAgICAgICAgLmZ1bnMgPSBsaXN0KG1lYW4gPSAibWVhbiIsIHNkID0gInNkIikpCiAgCmFyYy5yZXdldC5pbmMuMTRjLnN1bSRuX3NkIDwtIE5VTEwKCmoudmFycyA8LSBjKCJJRCIsICJFeHBlcmltZW50IiwgIlR5cGUiLCAiZDE0Y19jb3JyX21lYW4iLCAibWdDTzIuQ19nQ19tZWFuIiwgImQxNGNfY29ycl9zZCIsICJtZ0NPMi5DX2dDX3NkIikKYXJjLnJld2V0LjE0Yy5jdGwudHJ0IDwtIGxlZnRfam9pbigKICBhcmMucmV3ZXQuaW5jLjE0Yy5zdW1bYXJjLnJld2V0LmluYy4xNGMuc3VtJHRyZWF0LmJpID09ICJjb250cm9sIiwgai52YXJzXSwKICBhcmMucmV3ZXQuaW5jLjE0Yy5zdW1bYXJjLnJld2V0LmluYy4xNGMuc3VtJHRyZWF0LmJpICE9ICJjb250cm9sIiwgai52YXJzXSwKICBieSA9IGMoai52YXJzWzE6M10pLAogIHN1ZmZpeCA9IGMoIi5jdGwiLCAiLnRydCIpKQoKCmFyYy5yZXdldC4xNGMuY3RsLnRydCRkMTRjX2RpZiA8LSBhcmMucmV3ZXQuMTRjLmN0bC50cnQkZDE0Y19jb3JyX21lYW4uY3RsIC0gYXJjLnJld2V0LjE0Yy5jdGwudHJ0JGQxNGNfY29ycl9tZWFuLnRydAphcmMucmV3ZXQuMTRjLmN0bC50cnQkY19kaWYgPC0gYXJjLnJld2V0LjE0Yy5jdGwudHJ0JG1nQ08yLkNfZ0NfbWVhbi5jdGwgLSBhcmMucmV3ZXQuMTRjLmN0bC50cnQkbWdDTzIuQ19nQ19tZWFuLnRydAoKIyMgTG9vayBhdCBlZmZlY3Qgb2YgY19kaWYgYnkgZXhwZXJpbWVudCBhbmQgaW50ZXJhY3Rpb24gd2l0aCB0eXBlCiMgYWlyLWRyeSArIHN0b3JhZ2UKc3VtbWFyeShsbShkMTRjX2RpZiB+IGNfZGlmICogVHlwZSwgYXJjLnJld2V0LjE0Yy5jdGwudHJ0W2FyYy5yZXdldC4xNGMuY3RsLnRydCRFeHBlcmltZW50ID09ICJhcmMiLCBdKSkKIyBlZmZlY3Qgb2YgY19kaWYgb24gZDE0Y19kaWYgbnM7IGludGVyYWN0aW9uIGFsc28gbnMKCiMgcmV3ZXQKc3VtbWFyeShsbShkMTRjX2RpZiB+IGNfZGlmICogVHlwZSwgYXJjLnJld2V0LjE0Yy5jdGwudHJ0W2FyYy5yZXdldC4xNGMuY3RsLnRydCRFeHBlcmltZW50ID09ICJyZXdldCIsIF0pKQojIGVmZmVjdCBvZiBjX2RpZiBtYXJnaW5hbGx5IHNpZ25pZmljYW50IChwID0gMC4wNjMyKQoKIyBMb29rIGF0IGVmZmVjdCBvZiBjX2RpZiBhbmQgaW50ZXJhY3Rpb24gd2l0aCB0eXBlIG92ZXJhbGwKc3VtbWFyeShsbShkMTRjX2RpZiB+IFR5cGUgKiBjX2RpZiAqIEV4cGVyaW1lbnQsIGFyYy5yZXdldC4xNGMuY3RsLnRydCkpCiMgbm8gc2lnbmlmaWNhbmNlIG9mIGNfZGlmIG92ZXJhbGwKcm0oai52YXJzKQpgYGAKCmBgYHtyIGQxNGMtc3RhdHMsIGluY2x1ZGUgPSBGQUxTRX0KIyBhdmVyYWdlIGR1cGxpY2F0ZXMgYW5kIGdldCB2ZWN0b3JzIG9mIGV4cGVyaW1lbnQvdHlwZS90cmVhdG1lbnQKYXJjLnJld2V0LjE0Yy5zdW0yIDwtIGFsbC4xNGMubHNbWzJdXSAlPiUKICBmaWx0ZXIoUGVyaW9kID09ICJpbmMiKSAlPiUKICBzZWxlY3QoSUQsIFR5cGUsIFRyZWF0bWVudCwgRXhwZXJpbWVudCwgZDE0Y19jb3JyKSAlPiUKICBncm91cF9ieShJRCwgVHlwZSwgVHJlYXRtZW50LCBFeHBlcmltZW50KSAlPiUKICBzdW1tYXJpemVfYWxsKGxpc3QobWVhbiA9IG1lYW4sIHNkID0gc2QpLCBuYS5ybSA9IFRSVUUpCmFyYy5yZXdldC4xNGMuc3VtMiA8LSBkYXRhLmZyYW1lKGFyYy5yZXdldC4xNGMuc3VtMikKCgojIHN0YXRzCiMgYWlyLWRyeSArIHN0b3JhZ2UKIyBmb3Jlc3QKdC50ZXN0KGFyYy5yZXdldC4xNGMuc3VtMlthcmMucmV3ZXQuMTRjLnN1bTIkRXhwZXJpbWVudCA9PSAiYXJjIiAmIGFyYy5yZXdldC4xNGMuc3VtMiRUcmVhdG1lbnQgPT0gImNvbnRyb2wiICYgYXJjLnJld2V0LjE0Yy5zdW0yJFR5cGUgPT0gIkYiLCAibWVhbiJdLCAKICAgICAgIGFyYy5yZXdldC4xNGMuc3VtMlthcmMucmV3ZXQuMTRjLnN1bTIkRXhwZXJpbWVudCA9PSAiYXJjIiAmIGFyYy5yZXdldC4xNGMuc3VtMiRUcmVhdG1lbnQgPT0gImFpci1kcnkgKyBzdG9yYWdlIiAmIGFyYy5yZXdldC4xNGMuc3VtMiRUeXBlID09ICJGIiwgIm1lYW4iXSwgdGFpbHMgPSAyLCBwYWlyZWQgPSBUUlVFKQoKIyBncmFzc2xhbmQKdC50ZXN0KGFyYy5yZXdldC4xNGMuc3VtMlthcmMucmV3ZXQuMTRjLnN1bTIkRXhwZXJpbWVudCA9PSAiYXJjIiAmIGFyYy5yZXdldC4xNGMuc3VtMiRUcmVhdG1lbnQgPT0gImNvbnRyb2wiICYgYXJjLnJld2V0LjE0Yy5zdW0yJFR5cGUgPT0gIkciLCAibWVhbiJdLCAKICAgICAgIGFyYy5yZXdldC4xNGMuc3VtMlthcmMucmV3ZXQuMTRjLnN1bTIkRXhwZXJpbWVudCA9PSAiYXJjIiAmIGFyYy5yZXdldC4xNGMuc3VtMiRUcmVhdG1lbnQgPT0gImFpci1kcnkgKyBzdG9yYWdlIiAmIGFyYy5yZXdldC4xNGMuc3VtMiRUeXBlID09ICJHIiwgIm1lYW4iXSwgdGFpbHMgPSAyLCBwYWlyZWQgPSBUUlVFKQoKIyBhaXItZHJ5IG9ubHkKIyBmb3Jlc3QKdC50ZXN0KGFyYy5yZXdldC4xNGMuc3VtMlthcmMucmV3ZXQuMTRjLnN1bTIkRXhwZXJpbWVudCA9PSAicmV3ZXQiICYgYXJjLnJld2V0LjE0Yy5zdW0yJFRyZWF0bWVudCA9PSAiY29udHJvbCIgJiBhcmMucmV3ZXQuMTRjLnN1bTIkVHlwZSA9PSAiRiIsICJtZWFuIl0sIAogICAgICAgYXJjLnJld2V0LjE0Yy5zdW0yW2FyYy5yZXdldC4xNGMuc3VtMiRFeHBlcmltZW50ID09ICJyZXdldCIgJiBhcmMucmV3ZXQuMTRjLnN1bTIkVHJlYXRtZW50ID09ICJhaXItZHJ5IiAmIGFyYy5yZXdldC4xNGMuc3VtMiRUeXBlID09ICJGIiwgIm1lYW4iXSwgdGFpbHMgPSAyLCBwYWlyZWQgPSBUUlVFKQoKIyBncmFzc2xhbmQKdC50ZXN0KGFyYy5yZXdldC4xNGMuc3VtMlthcmMucmV3ZXQuMTRjLnN1bTIkRXhwZXJpbWVudCA9PSAicmV3ZXQiICYgYXJjLnJld2V0LjE0Yy5zdW0yJFRyZWF0bWVudCA9PSAiY29udHJvbCIgJiBhcmMucmV3ZXQuMTRjLnN1bTIkVHlwZSA9PSAiRyIsICJtZWFuIl0sIAogICAgICAgYXJjLnJld2V0LjE0Yy5zdW0yW2FyYy5yZXdldC4xNGMuc3VtMiRFeHBlcmltZW50ID09ICJyZXdldCIgJiBhcmMucmV3ZXQuMTRjLnN1bTIkVHJlYXRtZW50ID09ICJhaXItZHJ5IiAmIGFyYy5yZXdldC4xNGMuc3VtMiRUeXBlID09ICJHIiwgIm1lYW4iXSwgdGFpbHMgPSAyLCBwYWlyZWQgPSBUUlVFKQpgYGAKCgpgYGB7ciBwbG90LWNkaWYtZDE0YywgaW5jbHVkZSA9IEZBTFNFfQpnZ3Bsb3QoYXJjLnJld2V0LjE0Yy5jdGwudHJ0LCBhZXMoY19kaWYsIGQxNGNfZGlmLCBjb2xvciA9IFR5cGUsIHNoYXBlID0gRXhwZXJpbWVudCkpICsKICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAwKSArCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCkgKwogIGdlb21fcG9pbnQoc2l6ZSA9IDMpICsKICBzY2FsZV9jb2xvcl9tYW51YWwobmFtZSA9ICdFY29zeXN0ZW0nLAogICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgPWMoJ0YnPScjYTM1NTEzJywnRyc9JyMxMzYxYTMnKSwKICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYygnRm9yZXN0JywnR3Jhc3NsYW5kJykpICsKICB0aGVtZV9idygpICsKICB0aGVtZShwYW5lbC5ncmlkID0gZWxlbWVudF9ibGFuaygpKQpgYGAKCgpXZSBsb29rZWQgYXQgdGhlIHBvc3NpYmxlIGVmZmVjdCBvZiB0aGUgZGlmZmVyZW5jZSBpbiB0aGUgYW1vdW50IG9mIGNhcmJvbiByZXNwaXJlZCAobWcgQ09+Mn4tQyBnIHNvaWwgQ14tMV4pIG9uIHRoZSBkaWZmZXJlbmNlcyBiZXR3ZWVuIGNvbnRyb2wgYW5kIHRyZWF0bWVudCBeMTReQy1DT34yfiB1c2luZyBhIGxpbmVhciByZWdyZXNzaW9uIG1vZGVsLCBidXQgaXQgd2FzIG5vdCBzaWduaWZpY2FudCBvdmVyYWxsLiBXaGVuIGRhdGEgZnJvbSBFeHBlcmltZW50IDEgYW5kIEV4cGVyaW1lbnQgMiB3ZXJlIGNvbnNpZGVyZWQgc2VwYXJhdGVseSwgd2Ugb2JzZXJ2ZWQgYSBzbGlnaHQgcG9zaXRpdmUgdHJlbmQgYmV0d2VlbiB0aGUgZGlmZmVyZW5jZSBpbiByZXNwaXJlZCBjYXJib24gYW5kIHRoZSBkaWZmZXJlbmNlIGluIF4xNF5DLUNPfjJ+IHdpdGhpbiBFeHBlcmltZW50IDIsIGJ1dCBpdCB3YXMgb25seSBtYXJnaW5hbGx5IHNpZ25pZmljYW50IChwID0gYHIge3JvdW5kKHN1bW1hcnkobG0oZDE0Y19kaWYgfiBjX2RpZiAqIFR5cGUsIGFyYy5yZXdldC4xNGMuY3RsLnRydFthcmMucmV3ZXQuMTRjLmN0bC50cnQkRXhwZXJpbWVudCA9PSAicmV3ZXQiLCBdKSkkY29lZlsyLDRdLDMpfWApLiAKCmBgYHtyIHBsb3QtMTRjLWJ5LWMtcmVzcH0KIyAxMC4gUGxvdCAkXERlbHRhJF4xNF5DIGFnYWluc3QgcHJvcG9ydGlvbiBvZiBzb2lsIEMgcmVzcGlyZWQgYnkgZXhwZXJpbWVudCwgbGFuZCBjb3ZlciwgYW5kIHNhbXBsaW5nIHBlcmlvZC4KCiMgSEVXMjIgY29udHJvbCBwcmUgcG9pbnQgZXhjbHVkZWQgdG8gbWFrZSBmaWd1cmUgbW9yZSByZWFkYWJsZSAKYWxsLjE0Yy5zdW0uZGYgJT4lCiAgZmlsdGVyKEV4cGVyaW1lbnQgIT0gInRtZSIpICU+JQogIG11dGF0ZShJRC50cmVhdCA9IHBhc3RlKElELCBUcmVhdG1lbnQpKSAlPiUKICBtdXRhdGUoSUQudHJlYXQuUGVyaW9kID0gcGFzdGUoSUQudHJlYXQsIFBlcmlvZCkpICU+JQogIGZpbHRlcihJRC50cmVhdC5QZXJpb2QgIT0gIkhFVzIyIGNvbnRyb2wgcHJlIikgJT4lCiAgbXV0YXRlKHRyZWF0LlBlcmlvZCA9IHBhc3RlKHRyZWF0LmJpLCBQZXJpb2QpLAogICAgICAgICBFY28gPSBpZmVsc2UoVHlwZSA9PSAiRiIsICJGb3Jlc3QiLCAiR3Jhc3NsYW5kIikpICU+JQogIGdncGxvdCguLCBhZXMobWdDTzIuQ19nQ19tZWFuLCBkMTRjX2NvcnJfbWVhbiwgY29sb3IgPSBUeXBlLCBzaGFwZSA9IHRyZWF0LlBlcmlvZCkpICsKICBnZW9tX3BvaW50KHNpemUgPSAzKSArCiAgZ2VvbV9wYXRoKGFlcyhncm91cCA9IElELnRyZWF0KSkgKwogIGdlb21fZXJyb3JiYXIoCiAgICBhZXMoeW1pbiA9IGQxNGNfY29ycl9taW4sIAogICAgICAgIHltYXggPSBkMTRjX2NvcnJfbWF4LCAKICAgICAgICBjb2xvciA9IFR5cGUpLCAKICAgIHdpZHRoID0gLjI1KSArCiAgZ2VvbV9lcnJvcmJhcmgoCiAgICBhZXMoeG1pbiA9IG1nQ08yLkNfZ0NfbWluLCAKICAgICAgICB4bWF4ID0gbWdDTzIuQ19nQ19tYXgsIAogICAgICAgIGNvbG9yID0gVHlwZSksIAogICAgaGVpZ2h0ID0gLjkpICsKICBzY2FsZV9jb2xvcl9tYW51YWwobmFtZSA9ICdFY29zeXN0ZW0nLAogICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgPWMoJ0YnPScjYTM1NTEzJywnRyc9JyMxMzYxYTMnKSwKICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYygnRm9yZXN0JywnR3Jhc3NsYW5kJykpICsKICBzY2FsZV9zaGFwZV9tYW51YWwobmFtZSA9ICdTYW1wbGluZyBwZXJpb2QgKHRyZWF0bWVudCknLAogICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgPWMoMTYsIDE3LCAxLCAyKSwKICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYygiY29udHJvbCBwcmUiID0gJ3ByZS1pbmN1YmF0aW9uXG4oY29udHJvbCknLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29udHJvbCBpbmMiID0gJ2VxdWlsaWJyaXVtIHJlc3BpcmF0aW9uXG4oY29udHJvbCknLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0cmVhdG1lbnQgcHJlIiA9ICdwcmUtaW5jdWJhdGlvblxuKGFpci1kcnkvYWlyLWRyeSArIHN0b3JhZ2UpJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHJlYXRtZW50IGluYyIgPSAnZXF1aWxpYnJpdW0gcmVzcGlyYXRpb25cbihhaXItZHJ5L2Fpci1kcnkgKyBzdG9yYWdlKScpKSArCiAgZmFjZXRfZ3JpZChjb2xzID0gdmFycyhFY28pLCByb3dzID0gdmFycyhZZWFyU2FtcGxlZCkpICsKICB4bGFiKGV4cHJlc3Npb24oJ1Jlc3BpcmVkIEMgKG1nIENPJ1syXSonLUMnKicgZyBzb2lsIEMnXi0xKicpJykpICsKICB5bGFiKGV4cHJlc3Npb24oJ21lYW4gJypEZWx0YSonJ14xNConQyAo4oCwKScpKSArCiAgdGhlbWVfYncoKSArCiAgdGhlbWUocGFuZWwuZ3JpZCA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICBsZWdlbmQua2V5LmhlaWdodD11bml0KC44LCAiY20iKSkKYGBgCgo+KipTdXBwbGVtZW50YXJ5IEZpZy4gYHIge3NmaWcubiArIDN9YC4gQ2hhbmdlIGluIF4xNF5DLUNPfjJ+IGluIHJlbGF0aW9uIHRvIGN1bXVsYXRpdmUgc29pbCBjYXJib24gcmVzcGlyZWQqKgoKPipDYXB0aW9uOiogTm90ZSB0aGF0IHByZS1pbmN1YmF0aW9uICRcRGVsdGEkXjE0XkMgd2FzIG5vdCBtZWFzdXJlZCBmb3IgdGhlIGNvbnRyb2wtMSBzYW1wbGVzIGluIDIwMTEuIExpbWl0cyBleGNsdWRlIG91dGxpZXIgcG9pbnQgKEhFVzIyIGNvbnRyb2wtMiwgcHJlLWluY3ViYXRpb24pIGZvciBpbXByb3ZlZCBsZWdpYmlsaXR5LiBQb2ludHMgYXJlIG1lYW5zLCBlcnJvciBiYXJzIHNob3cgbWluIGFuZCBtYXggb2YgZHVwbGljYXRlIHNhbXBsZXMuCgpgYGB7ciBwbG90IEMgcmVzcCB2cyAxNEMgYXZlcmFnZWQgYnkgRWNvc3lzdGVtIGFuZCB0cmVhdG1lbnQsIGluY2x1ZGUgPSBGQUxTRX0KIyBBbHRlcm5hdGUgQy1yZXNwIHggMTRjIGZpZzogZGF0YSBhdmVyYWdlZCBieSBFY29zeXN0ZW0gYW5kIHRyZWF0bWVudCB3aXRoaW4gc2FtcGxpbmcgcGVyaW9kcwphbGwuMTRjLnN1bTIgJT4lCiAgbXV0YXRlKHRyZWF0LlBlcmlvZCA9IHBhc3RlKHRyZWF0LmJpLCBQZXJpb2QpKSAlPiUKICBnZ3Bsb3QoLiwgYWVzKG1nQ08yLkNfZ0NfbWVhbiwgZDE0Y19jb3JyX21lYW4sIGNvbG9yID0gVHlwZSwgc2hhcGUgPSB0cmVhdC5QZXJpb2QpKSArCiAgZ2VvbV9wb2ludChzaXplID0gMykgKwogIGdlb21fcGF0aChhZXMoZ3JvdXAgPSBUcmVhdG1lbnQpKSArCiAgZ2VvbV9lcnJvcmJhcigKICAgIGFlcyh5bWluID0gZDE0Y19jb3JyX3UsIAogICAgICAgIHltYXggPSBkMTRjX2NvcnJfbCwgCiAgICAgICAgY29sb3IgPSBUeXBlKSwgCiAgICB3aWR0aCA9IC4yNSkgKwogIGdlb21fZXJyb3JiYXJoKAogICAgYWVzKHhtaW4gPSBtZ0NPMi5DX2dDX3UsIAogICAgICAgIHhtYXggPSBtZ0NPMi5DX2dDX2wsIAogICAgICAgIGNvbG9yID0gVHlwZSksIAogICAgaGVpZ2h0ID0gLjkpICsKICBzY2FsZV9jb2xvcl9tYW51YWwobmFtZSA9ICdFY29zeXN0ZW0nLAogICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgPWMoJ0YnPScjYTM1NTEzJywnRyc9JyMxMzYxYTMnKSwKICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYygnRm9yZXN0JywnR3Jhc3NsYW5kJykpICsKICBzY2FsZV9zaGFwZV9tYW51YWwobmFtZSA9ICdTYW1wbGluZyBwZXJpb2QgKHRyZWF0bWVudCknLAogICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgPWMoMTYsIDE3LCAxLCAyKSwKICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYygiY29udHJvbCBwcmUiID0gJ3ByZS1pbmN1YmF0aW9uXG4oY29udHJvbCknLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29udHJvbCBpbmMiID0gJ2VxdWlsaWJyaXVtIHJlc3BpcmF0aW9uXG4oY29udHJvbCknLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0cmVhdG1lbnQgcHJlIiA9ICdwcmUtaW5jdWJhdGlvblxuKGFpci1kcnkvYWlyLWRyeSArIHN0b3JhZ2UpJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHJlYXRtZW50IGluYyIgPSAnZXF1aWxpYnJpdW0gcmVzcGlyYXRpb25cbihhaXItZHJ5L2Fpci1kcnkgKyBzdG9yYWdlKScpKSArCiAgZmFjZXRfZ3JpZChjb2xzID0gdmFycyhUeXBlKSwgcm93cyA9IHZhcnMoWWVhclNhbXBsZWQpKSArCiAgeGxhYihleHByZXNzaW9uKCdSZXNwaXJlZCBDIChtZ0NPJ1syXSonLUMnKicgZyBzb2lsIEMnXi0xKicpJykpICsKICB5bGFiKGV4cHJlc3Npb24oJ21lYW4gJypEZWx0YSonJ14xNConQyAo4oCwKScpKSArCiAgdGhlbWVfYncoKSArCiAgdGhlbWUocGFuZWwuZ3JpZCA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICBsZWdlbmQua2V5LmhlaWdodD11bml0KC44LCAiY20iKSkKYGBgCgpgYGB7ciBwbG90IDE0YyBieSBjIHJlc3Agd2l0aCBvdXRsaWVyLCBpbmNsdWRlID0gRkFMU0V9CiMgQ29kZSBmb3IgYSB0aGlyZCBwbG90IHdpdGggb3V0bGllciBkYXRhCiMgYXZlcmFnZSBjb250cm9sIGFuZCB0cmVhdG1lbnQgZGF0YQphbGwuMTRjLnN1bTMgPC0gc2VsZWN0KGFsbC4xNGMubHNbWzJdXSwgVHlwZSwgUGVyaW9kLCBUcmVhdG1lbnQsIEV4cGVyaW1lbnQsIFllYXJTYW1wbGVkLCBkMTRjX2NvcnIsIG1nQ08yLkNfZ0MpICU+JQogIGdyb3VwX2J5KFR5cGUsIFBlcmlvZCwgVHJlYXRtZW50LCBFeHBlcmltZW50LCBZZWFyU2FtcGxlZCkgJT4lCiAgYWRkX2NvdW50KCkgJT4lCiAgc3VtbWFyaXplX2FsbChsaXN0KG1lYW4gPSBtZWFuLCBzZCA9IHNkKSwgbmEucm0gPSBUUlVFKSAlPiUKICBtdXRhdGUoZDE0Y19jb3JyX3NlID0gZDE0Y19jb3JyX3NkL25fbWVhbiwKICAgICAgICAgZDE0Y19jb3JyX3UgPSBkMTRjX2NvcnJfbWVhbiArIGQxNGNfY29ycl9zZSoyLAogICAgICAgICBkMTRjX2NvcnJfbCA9IGQxNGNfY29ycl9tZWFuIC0gZDE0Y19jb3JyX3NlKjIsCiAgICAgICAgIG1nQ08yLkNfZ0Nfc2UgPSBtZ0NPMi5DX2dDX3NkL25fbWVhbiwKICAgICAgICAgbWdDTzIuQ19nQ191ID0gbWdDTzIuQ19nQ19tZWFuICsgbWdDTzIuQ19nQ19zZSoyLAogICAgICAgICBtZ0NPMi5DX2dDX2wgPSBtZ0NPMi5DX2dDX21lYW4gLSBtZ0NPMi5DX2dDX3NlKjIpIAoKYWxsLjE0Yy5zdW0zJHRyZWF0LmJpIDwtIGlmZWxzZShhbGwuMTRjLnN1bTMkVHJlYXRtZW50ID09ICJjb250cm9sIiwgImNvbnRyb2wiLCJ0cmVhdG1lbnQiKQphbGwuMTRjLnN1bTMgJT4lCiAgbXV0YXRlKHRyZWF0LlBlcmlvZCA9IHBhc3RlKHRyZWF0LmJpLCBQZXJpb2QpKSAlPiUKICBnZ3Bsb3QoLiwgYWVzKG1nQ08yLkNfZ0NfbWVhbiwgZDE0Y19jb3JyX21lYW4sIGNvbG9yID0gVHlwZSwgc2hhcGUgPSB0cmVhdC5QZXJpb2QpKSArCiAgZ2VvbV9wb2ludChzaXplID0gMykgKwogIGdlb21fcGF0aChhZXMoZ3JvdXAgPSBUcmVhdG1lbnQpKSArCiAgZ2VvbV9lcnJvcmJhcigKICAgIGFlcyh5bWluID0gZDE0Y19jb3JyX3UsIAogICAgICAgIHltYXggPSBkMTRjX2NvcnJfbCwgCiAgICAgICAgY29sb3IgPSBUeXBlKSwgCiAgICB3aWR0aCA9IC4yNSkgKwogIGdlb21fZXJyb3JiYXJoKAogICAgYWVzKHhtaW4gPSBtZ0NPMi5DX2dDX3UsIAogICAgICAgIHhtYXggPSBtZ0NPMi5DX2dDX2wsIAogICAgICAgIGNvbG9yID0gVHlwZSksIAogICAgaGVpZ2h0ID0gLjkpICsKICBzY2FsZV9jb2xvcl9tYW51YWwobmFtZSA9ICdFY29zeXN0ZW0nLAogICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgPWMoJ0YnPScjYTM1NTEzJywnRyc9JyMxMzYxYTMnKSwKICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYygnRm9yZXN0JywnR3Jhc3NsYW5kJykpICsKICBzY2FsZV9zaGFwZV9tYW51YWwobmFtZSA9ICdTYW1wbGluZyBwZXJpb2QgKHRyZWF0bWVudCknLAogICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgPWMoMTYsIDE3LCAxLCAyKSwKICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYygiY29udHJvbCBwcmUiID0gJ3ByZS1pbmN1YmF0aW9uXG4oY29udHJvbCknLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29udHJvbCBpbmMiID0gJ2VxdWlsaWJyaXVtIHJlc3BpcmF0aW9uXG4oY29udHJvbCknLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0cmVhdG1lbnQgcHJlIiA9ICdwcmUtaW5jdWJhdGlvblxuKGFpci1kcnkvYWlyLWRyeSArIHN0b3JhZ2UpJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHJlYXRtZW50IGluYyIgPSAnZXF1aWxpYnJpdW0gcmVzcGlyYXRpb25cbihhaXItZHJ5L2Fpci1kcnkgKyBzdG9yYWdlKScpKSArCiAgZmFjZXRfZ3JpZChjb2xzID0gdmFycyhUeXBlKSwgcm93cyA9IHZhcnMoWWVhclNhbXBsZWQpKSArCiAgeGxhYihleHByZXNzaW9uKCdSZXNwaXJlZCBDIChtZ0NPJ1syXSonLUMnKicgZyBzb2lsIEMnXi0xKicpJykpICsKICB5bGFiKGV4cHJlc3Npb24oJ21lYW4gJypEZWx0YSonJ14xNConQyAo4oCwKScpKSArCiAgdGhlbWVfYncoKSArCiAgdGhlbWUocGFuZWwuZ3JpZCA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICBsZWdlbmQua2V5LmhlaWdodD11bml0KC44LCAiY20iKSkKYGBgCgojIERpc2N1c3Npb24KCmBgYHtyIGNvbmNlcHR1YWwtbW9kZWwtY2FsY3MsIGluY2x1ZGUgPSBGQUxTRX0KIyBpbml0aWFsIHBhcmFtZXRlciBzZXQKRGF0bSA8LSByYmluZChncmF2ZW4sIGZ1dHVyZTE0QykKRGF0bSA8LSBEYXRtW0RhdG0kRGF0ZSA+IDE5MDAsIGMoIkRhdGUiLCAiTkhjMTQiKV0KeXJzIDwtIERhdG0kRGF0ZQoKIyBoZWxwZXIgZnhzCmxhbWJkYSA8LSAoMS84MjY3KQoKayA8LSBmdW5jdGlvbihGbSkgewogIChGbSpsYW1iZGEpLygxLUZtKQp9CmZtIDwtIGZ1bmN0aW9uKGspewogIGsvKGsrbGFtYmRhKQp9CmZtXzE0YyA8LSBmdW5jdGlvbihmbSwgZGF0ZSkgewogIChmbSpleHAobGFtYmRhKigxOTUwIC0gZGF0ZSkpIC0gMSkqMTAwMAp9CgojIGZvcmVzdHMKZi5jIDwtIDM4Ljk2MTA0ICMgZm9yZXN0IEMgcG9vbCwgdG90YWwgKG1lYW4gSGFpbmljaCBmb3Jlc3QgQyAgPSAyNCBnIGtnXi0xKTsgbmIgQCBzcyA9IHN1bSgtMSpzb2x2ZShBKSUqJWMoZi5pbipmLmdhbSwgZi5pbiooMS1mLmdhbSkpKQpmLmluIDwtIDEgIyBpbnB1dHMgKDEyLjU9bWVhbiBlcXVpbGlicml1bSBDIGZsdXgsIGFubnVhbCBleHRyYXBvbGF0aW9uLCBnQyB5ci0xLCAyMDExIGluY3ViYXRpb24gZGF0YSk7IHRyeSBtdWNoIGxlc3MuLi4KZi5mcmMgPC0gLjEgIyBDLXN0b2NrIHBhcnRpdGlvbmluZyBjb2VmZmljaWVudCAoZnJvbSBTY2hydW1wZiAyMDEzLCBIYWluaWNoIDAtNSwgZnJlZSBsaWdodCkKZi5DZmFzdCA8LSBmLmZyYypmLmMKZi5Dc2xvdyA8LSBmLmMtZi5DZmFzdApmLmtmYXN0IDwtIDEvNiAjIHVua25vd24KZi5rc2xvdyA8LSAxLzEwMCAjIHVua25vd24KZi5mYXN0LmZtIDwtIGZtKGYua2Zhc3QpCmYuc2xvdy5mbSA8LSBmbShmLmtzbG93KQpmLkYwX0RlbHRhMTRDIDwtIGZtXzE0YyhjKGYuZmFzdC5mbSwgZi5zbG93LmZtKSwgZGF0ZSA9IGMoMTkwMCwgMTkwMCkpCmYuZ2FtIDwtIChmLmMqZi5DZmFzdCpmLmtmYXN0KS8oZi5jKmYuQ2Zhc3QqZi5rZmFzdCtmLmMqZi5Dc2xvdypmLmtzbG93KSAjIGlucHV0IHBhcnRpdGlvbmluZyBjb2VmZmljaWVudCAocHJvcG9ydGlvbiB0byBmYXN0IHBvb2wsIGZ1bmN0aW9uIG9mIGtzKQogIAojICMgZ3Jhc3NsYW5kcwojIGcuYyA8LSA0MiAjIEMgcG9vbCwgdG90YWwgKG1lYW4gSGFpbmljaCBncmFzc2xhbmQgQyBnIGtnXi0xKQojIGcuaW4gPC0gNjMuNCAjIGlucHV0cyAobWVhbiBlcXVpbGlicml1bSBDIGZsdXgsIGFubnVhbCBleHRyYXBvbGF0aW9uLCAyMDExIGluY3ViYXRpb24gZGF0YSkKIyBnLmZyYyA8LSAuMyAjIEMtc3RvY2sgcGFydGl0aW9uaW5nIGNvZWZmaWNpZW50IChmcm9tIFNjaHJ1bXBmIDIwMTMsIGF2ZXJhZ2Ugb2YgTGFjcXVldmlsbGUsIEVhc3RlciBCdXNoLCBCdWdhYywgMC01LCBmcmVlIGxpZ2h0KQojIGcuQ2Zhc3QgPC0gZy5mcmMqZy5jCiMgZy5Dc2xvdyA8LSBnLmMtZy5DZmFzdAojIGcua2Zhc3QgPC0gMS8xMCAjIHVua25vd24KIyBnLmtzbG93IDwtIDEvMTAwICMgdW5rbm93bgojIGcuZmFzdC5mbSA8LSBmbShnLmtmYXN0KQojIGcuc2xvdy5mbSA8LSBmbShnLmtzbG93KQojIGcuRjBfRGVsdGExNEMgPC0gZm1fMTRjKGMoZy5mYXN0LmZtLCBnLnNsb3cuZm0pLCBkYXRlID0gYygxOTAwLCAxOTAwKSkKIyBnLmdhbSA8LSAoZy5jKmcuQ2Zhc3QqZy5rZmFzdCkvKGcuYypnLkNmYXN0Kmcua2Zhc3QrZy5jKmcuQ3Nsb3cqZy5rc2xvdykgIyBpbnB1dCBwYXJ0aXRpb25pbmcgY29lZmZpY2llbnQgKHByb3BvcnRpb24gdG8gZmFzdCBwb29sLCBmdW5jdGlvbiBvZiBrcykKCiMgMnBvb2wgcGFyYWxsZWwgbW9kZWwsIGZvcmVzdHMKZi4ycCA8LSBUd29wUGFyYWxsZWxNb2RlbDE0KHQgPSB5cnMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBrcyA9IGMoZi5rZmFzdCwgZi5rc2xvdyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMCA9IGMoZi5DZmFzdCwgZi5Dc2xvdyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBGMF9EZWx0YTE0QyA9IGYuRjBfRGVsdGExNEMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbiA9IGYuaW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBnYW0gPSBmLmdhbSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0RmMgPSBEYXRtKQoKZi4ycC5DMTQgPC0gZ2V0RjE0KGYuMnApCmYuMnAuSFIgPC0gZ2V0RjE0UihmLjJwKQpmLjJwLkN0b3QgPC0gZ2V0QyhmLjJwKQoKIyBzb2x2ZSBmb3Igc3RlYWR5LXN0YXRlIEMgc3RvY2tzCkEgPC0gLTEqZGlhZyhjKGYua2Zhc3QsIGYua3Nsb3cpKQpzdW0oLTEqc29sdmUoQSklKiVjKGYuaW4qZi5nYW0sIGYuaW4qKDEtZi5nYW0pKSkKCmYuMnAuQzE0LmRmIDwtIGRhdGEuZnJhbWUoCiAgeWVhcnMgPSByZXAoRGF0bSREYXRlLCA0KSwKICBkMTRDID0gYyhmLjJwLkMxNFssMV0sIGYuMnAuQzE0WywyXSwgZi4ycC5IUiwgRGF0bSROSGMxNCksCiAgcG9vbCA9IHJlcChjKCJmYXN0IiwgInNsb3ciLCAicmVzcGlyYXRpb24iLCAiYXRtIiksIGVhY2ggPSBucm93KGYuMnAuQzE0KSkKICApCgojIHNhdmUKc2F2ZShmLjJwLkMxNC5kZiwgZmlsZSA9ICIuL2YuMnAuQzE0LmRmLlJEYXRhIikKCiMgIyBQbG90IEMgc3RvY2tzIHRvIGNvbmZpcm0gZmxhdAojIHBsb3QoeXJzLCB4bGltID0gYygxOTAwLDIwMjIpLCB5bGltID0gYygwLDYwKSkKIyBsaW5lcyh5cnMsIGYuMnAuQ3RvdFssIDFdLCBjb2wgPSAyKQojIGxpbmVzKHlycywgZi4ycC5DdG90WywgMl0sIGNvbCA9IDQpCgojIGNhbGN1bGF0ZSByZXNwIGZsdXggcG9pbnRzIGF0IDE5OTEgYW5kIDIwMTkgYW5kIHB1dCBpbiBkYXRhIGZyYW1lCm9icy5wdHMgPC0gZGF0YS5mcmFtZShwb29sID0gcmVwKCJyZXNwaXJhdGlvbiIsIDYpLAogICAgICAgICAgICAgICAgICAgICAgeWVhcnMgPSByZXAoYygxOTkxLDIwMTkpLDMpLAogICAgICAgICAgICAgICAgICAgICAgZDE0YyA9IGMobWVhbihmLjJwLkMxNC5kZltmLjJwLkMxNC5kZiR5ZWFycyA+IDE5OTAgJiBmLjJwLkMxNC5kZiR5ZWFycyA8IDE5OTIgJiBmLjJwLkMxNC5kZiRwb29sID09ICJyZXNwaXJhdGlvbiIsICJkMTRDIl0pLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVhbihmLjJwLkMxNC5kZltmLjJwLkMxNC5kZiR5ZWFycyA+IDIwMTggJiBmLjJwLkMxNC5kZiR5ZWFycyA8IDIwMjAgJiBmLjJwLkMxNC5kZiRwb29sID09ICJyZXNwaXJhdGlvbiIsICJkMTRDIl0pLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTUwLCA2MCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE5MCwgMzApLAogICAgICAgICAgICAgICAgICAgICAgT2JzZXJ2YXRpb24gPSByZXAoYygiY29udHJvbCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbmNyZWFzZWQgc2xvdyBwb29sIGNvbnRyaWJ1dGlvbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbmNyZWFzZWQgZmFzdCBwb29sIGNvbnRyaWJ1dGlvbiIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWFjaCA9IDIpKQpvYnMucHRzLnIgPC0gb2JzLnB0c1tvYnMucHRzJE9ic2VydmF0aW9uID09ICJjb250cm9sIiwgXQpgYGAKCmBgYHtyIGNvbmNlcHR1YWwtbW9kZWwtZmlnMSwgZmlnLmhlaWdodD0zLjUsIGZpZy53aWR0aD02fQpnZ3Bsb3QoZi4ycC5DMTQuZGYsIGFlcyh5ZWFycywgZDE0QywgY29sb3IgPSBwb29sKSkgKwogIGdlb21fcGF0aCgpICsKICBzY2FsZV9jb2xvcl9tYW51YWwoCiAgICBuYW1lID0gIlBvb2wiLAogICAgdmFsdWVzID0gYygiYXRtIiA9IDgsCiAgICAgICAgICAgICAgICJmYXN0IiA9ICIjRDgxQjYwIiwgCiAgICAgICAgICAgICAgICJyZXNwaXJhdGlvbiIgPSAiI0ZGQzEwNyIsIAogICAgICAgICAgICAgICAic2xvdyIgPSAiIzFFODhFNSIpLAogICAgbGFiZWxzID0gYygiYXRtIiA9ICJhdG1vc3BoZXJlIiwKICAgICAgICAgICAgICAgImZhc3QiID0gImZhc3QiLAogICAgICAgICAgICAgICAic2xvdyIgPSAic2xvdyIpKSArCiAgc2NhbGVfeF9jb250aW51b3VzKGxpbWl0cyA9IGMoMTk1MCwgMjAyMikpICsKICB4bGFiKCJZZWFyIikgKwogIHlsYWIoZXhwcmVzc2lvbignJypEZWx0YSonJ14xNConQyAo4oCwKScpKSArCiAgdGhlbWVfYncoKSArCiAgdGhlbWUocGFuZWwuZ3JpZCA9IGVsZW1lbnRfYmxhbmsoKSkKYGBgCgo+KipGaWcgYHIgeyhmaWcubiArIDUpfWBhLiBNb2RlbGVkIHRyYWplY3RvcmllcyBvZiAkXERlbHRhJF4xNF5DIG92ZXIgdGltZSBmb3IgYSBoeXBvdGhldGljYWwgMi1wb29sIHNvaWwgY2FyYm9uIG1vZGVsIGluIHJlbGF0aW9uc2hpcCB0byBvYnNlcnZlZCBhdG1vc3BoZXJpYyAkXERlbHRhJF4xNF5DKioKCj4qQ2FwdGlvbjoqIE1vZGVsZWQgY3VydmVzIGRlcml2ZWQgZnJvbSBhIGh5cG90aGV0aWNhbCB0d28tcG9vbCBwYXJhbGxlbCBtb2RlbCBzeXN0ZW0gaW4gd2hpY2ggaW5wdXRzIGFyZSBwYXJ0aXRpb25lZCBiZXR3ZWVuIGEgZmFzdCBjeWNsaW5nIHNvaWwgY2FyYm9uIHBvb2wgKCprKiA9IDEvNikgYW5kIGEgbW9yZSBzbG93bHkgY3ljbGluZyBwb29sICgqayogPSAxLzEwMCkgd2l0aG91dCBhbnkgdHJhbmZlcnMgYmV0d2VlbiB0aGUgcG9vbHMuIENhcmJvbiBzdG9ja3MgYW5kIHBvb2wgc2l6ZXMgYXJlIGJhc2VkIG9uIGRlbnNpdHkgZnJhY3Rpb24gZGF0YSBmb3IgdGhlIEhhaW5pY2gtRMO8biBmb3Jlc3Qgc2l0ZSAoU2NocnVtcGYgZXQgYWwuIDIwMTMpOyBkZWNvbXBvc2l0aW9uIHJhdGVzIGFyZSBjaG9zZW4gdG8gYmUgcmVhbGlzdGljIGJ1dCBhcmUgYXJiaXRyYXJ5LiBBdG1vc3BoZXJpYyAkXERlbHRhJF4xNF5DIGRhdGEgdXAgdG8gdGhlIHllYXIgMjAxNSBhcmUgZnJvbSBHcmF2ZW4gZXQgYWwuICgyMDE3KSwgd2hpbGUgZGF0YSBwb2ludHMgYmV5b25kIDIwMTUgdXNlIHRoZSBleHRyYXBvbGF0aW9uIG1ldGhvZCBmcm9tIFNpZXJyYSAoMjAxOCkuIEFsbCBhdG1vc3BoZXJpYyByYWRpb2NhcmJvbiBkYXRhIGlzIGZvciB0aGUgbm9ydGhlcm4gaGVtaXNwaGVyZSAoem9uZSAyKS4KCmBgYHtyIGNvbmNlcHR1YWwtbW9kZWwtZmlnMWIsIGZpZy5oZWlnaHQ9My41LCBmaWcud2lkdGg9Nn0KIyB6b29tICh3LyBhdG0sIHRvIDIwMjIpCmYuMnAuQzE0LmRmICU+JSAKICBmaWx0ZXIoeWVhcnMgPiAxOTg3KSAlPiUKICBnZ3Bsb3QoLiwgYWVzKHllYXJzLCBkMTRDKSkgKwogIGdlb21fcGF0aChhZXMoY29sb3IgPSBwb29sKSkgKwogIGdlb21fcG9pbnQoZGF0YSA9IG9icy5wdHMsIGFlcyh5ZWFycywgZDE0Yywgc2hhcGUgPSBPYnNlcnZhdGlvbiksIGNvbG9yID0gIiNGRkMxMDciLCBzdHJva2UgPSAxLCBzaXplID0gMykgKwogIHNjYWxlX2NvbG9yX21hbnVhbCgKICAgIG5hbWUgPSAiUG9vbCIsCiAgICB2YWx1ZXMgPSBjKCJhdG0iID0gOCwKICAgICAgICAgICAgICAgImZhc3QiID0gIiNEODFCNjAiLCAKICAgICAgICAgICAgICAgInJlc3BpcmF0aW9uIiA9ICIjRkZDMTA3IiwgCiAgICAgICAgICAgICAgICJzbG93IiA9ICIjMUU4OEU1IiksCiAgICBsYWJlbHMgPSBjKCJhdG0iID0gImF0bW9zcGhlcmUiLAogICAgICAgICAgICAgICAiZmFzdCIgPSAiZmFzdCIsCiAgICAgICAgICAgICAgICJzbG93IiA9ICJzbG93IikpICsKICBzY2FsZV9zaGFwZV9tYW51YWwoCiAgICBuYW1lID0gIk9ic2VydmVkIHJlc3BpcmF0aW9uIiwKICAgIHZhbHVlcyA9IGMoImNvbnRyb2wiID0gMTYsCiAgICAgICAgICAgICAgICJpbmNyZWFzZWQgc2xvdyBwb29sIGNvbnRyaWJ1dGlvbiIgPSAwLAogICAgICAgICAgICAgICAiaW5jcmVhc2VkIGZhc3QgcG9vbCBjb250cmlidXRpb24iID0gMSkpICsKICBzY2FsZV95X2NvbnRpbnVvdXMobGltaXRzID0gYygtMjUsIDI2NSkpICsKICB4bGFiKCJZZWFyIikgKwogIHlsYWIoZXhwcmVzc2lvbignJypEZWx0YSonJ14xNConQyAo4oCwKScpKSArCiAgdGhlbWVfYncoKSArCiAgdGhlbWUocGFuZWwuZ3JpZCA9IGVsZW1lbnRfYmxhbmsoKSkKYGBgCgo+KipGaWcgYHIgeyhmaWcubiArIDUpfWBiLiBQb3RlbnRpYWwgc2hpZnRzIGluICRcRGVsdGEkXjE0XkMgb2YgcmVzcGlyZWQgQ09+Mn4gaW4gcmVzcG9uc2UgdG8gdHJlYXRtZW50KioKCj4qQ2FwdGlvbjoqIEJsdWUgYW5kIG1hZ2VudGEgbGluZXMgc2hvdyBtb2RlbGVkIHRyYWplY3RvcmllcyBvZiAkXERlbHRhJF4xNF5DIGluIGZhc3QgYW5kIHNsb3cgY3ljbGluZyBzb2lsIGNhcmJvbiBwb29scyAoc2FtZSBtb2RlbCBhcyBGaWcgYHIgeyhmaWcubiArIDUpfWBhKSwgd2hpbGUgJFxEZWx0YSReMTReQyBvZiByZXNwaXJlZCBDT34yfiBpcyBzaG93biBpbiB5ZWxsb3cuIEZpbGxlZCBjaXJjbGVzIHNob3cgaHlwb3RoZXRpY2FsIG9ic2VydmF0aW9ucyBvZiAkXERlbHRhJF4xNF5DLUNPfjJ+IGZyb20gY29udHJvbCBpbmN1YmF0aW9ucywgd2hpbGUgdGhlIG9wZW4gc3ltYm9scyByZXByZXNlbnQgdHdvIHBvc3NpYmxlIHNjZW5hcmlvcyBpbiB3aGljaCBhbiBhaXItZHJ5aW5nIGFuZCByZXdldHRpbmcgdHJlYXRtZW50IGxlYWRzIHRvIGEgc2hpZnQgaW4gJFxEZWx0YSReMTReQy1DT34yfi4gSW4gdGhlIGZpcnN0IHNjZW5hcmlvIChvcGVuIHNxdWFyZXMpLCBhbiBpbmNyZWFzZWQgY29udHJpYnV0aW9uIGZyb20gdGhlIHNsb3cgcG9vbCBzaGlmdHMgJFxEZWx0YSReMTReQy1DT34yfiB0b3dhcmQgdGhlIHNsb3cgcG9vbCBjdXJ2ZSAoYmx1ZSBsaW5lKSwgd2hpbGUgaW4gdGhlIHNlY29uZCBzY2VuYXJpbyAob3BlbiBjaXJjbGVzKSwgYW4gaW5jcmVhc2VkIGNvbnRyaWJ1dGlvbiBmcm9tIHRoZSBmYXN0IHBvb2wgc2hpZnRzICRcRGVsdGEkXjE0XkMtQ09+Mn4gdG93YXJkIHRoZSBmYXN0IHBvb2wgY3VydmUgKG1hZ2VudGEgbGluZSkuIER1ZSB0byB0aGUgY3Jvc3Npbmcgb2YgdGhlIHNsb3cgYW5kIGZhc3QgcG9vbCBjdXJ2ZXMgaW4gMjAwOSwgYW4gaW5jcmVhc2VkIGNvbnRyaWJ1dGlvbiBvZiB0aGUgc2xvdyBwb29sIHRvIHJlc3BpcmF0aW9uIGZvbGxvd2luZyB0cmVhdG1lbnQgbGVhZHMgdG8gcmVsYXRpdmUgZGVwbGV0aW9uIG9mICRcRGVsdGEkXjE0XkMtQ09+Mn4gaW4gMTk5MSwgYnV0IHJlbGF0aXZlIGVucmljaG1lbnQgb2YgJFxEZWx0YSReMTReQy1DT34yfiBpbiAyMDE5LCB3aGlsZSB0aGUgb3Bwb3NpdGUgaXMgb2JzZXJ2ZWQgZm9yIHRoZSBpbmNyZWFzZWQgZmFzdCBwb29sIGNvbnRyaWJ1dGlvbiBzY2VuYXJpby4KCgpgYGB7ciByZXAtdmFyfQojIGNhbGN1bGF0ZSB2YXJpYWJpbGl0eSBiZXR3ZWVuIHJlcHMKIyBjYWxjIGRpZmZlcmVuY2UgYmV0d2VlbiByZXBzIGFuZCBjb21wYXJlIHRvIGRpZiBiZXR3ZWVuIGN0bCBhbmQgdHJlYXQKZTEyLmQxNCA8LSBhbGwuMTRjLmxzW1syXV0KZTEyLmQxNC5pbmMgPC0gZTEyLmQxNFtlMTIuZDE0JFBlcmlvZCA9PSAiaW5jIiwgXQoKIyBzcGxpdCBieSBFeHBlcmltZW50IGFuZCBUeXBlIHRvIGNvbXBhcmUgd2l0aCBjdGwtdHJ0IGRpZnMKZTEyLmQxNC5pbmMubHMgPC0gbGFwcGx5KHNwbGl0KGUxMi5kMTQuaW5jLCBlMTIuZDE0LmluYyRFeHBlcmltZW50KSwgZnVuY3Rpb24oeCkgewogICAgbGFwcGx5KHNwbGl0KHgsIHgkVHlwZSksIGZ1bmN0aW9uKHkpIHsKICAgICAgeSA8LSBsYXBwbHkoc3BsaXQoeSwgeSRUcmVhdG1lbnQpLCBmdW5jdGlvbih6KSB7CiAgICAgICAgeiA8LSBsYXBwbHkoc3BsaXQoeiwgeiRJRCksIGZ1bmN0aW9uKG0pIHsKICAgICAgICAgIGlmKG5yb3cobSkgPiAxKSB7CiAgICAgICAgICAgIG0gPC0gYWJzKG1bMiwgImQxNGMiXSAtIG1bMSwgImQxNGMiXSkKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIG0gPC0gTkEKICAgICAgICAgIH0KICAgICAgICB9KQogICAgICAgIG1lYW4gPC0gbWVhbih1bmxpc3QoeikpCiAgICAgICAgc2QgPC0gc2QodW5saXN0KHopKQogICAgICAgIHZhciA8LSB2YXIodW5saXN0KHopKQogICAgICAgIG4gPC0gbGVuZ3RoKHopCiAgICAgICAgei5scyA8LSBsaXN0KG1lYW4gPSBtZWFuLAogICAgICAgICAgICAgICAgICAgICBzZCA9IHNkLAogICAgICAgICAgICAgICAgICAgICB2YXIgPSB2YXIsCiAgICAgICAgICAgICAgICAgICAgIG4gPSBuLAogICAgICAgICAgICAgICAgICAgICBzZSA9IHNkL3NxcnQobikpCiAgICAgICAgfSkKICB9KQp9KQoKIyByZWR1Y2UgbGlzdAp2YXIubmFtZXMgPC0gYygiRXhwZXJpbWVudCIsICJUeXBlIiwgIlRyZWF0bWVudCIsICJkaXNwZXJzaW9uIikKdmFsdWVzIDwtIHVubGlzdChlMTIuZDE0LmluYy5scykKZTEyLmQxNC5zZGlmLm1hdCA8LSBtYXRyaXgobmNvbCA9IGxlbmd0aCh2YXIubmFtZXMpICsgMSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgIG5yb3cgPSBsZW5ndGgodmFsdWVzKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgZGltbmFtZXMgPSBsaXN0KE5VTEwsIGModmFyLm5hbWVzLCAidmFsdWUiKSkpCmZvcihpIGluIHNlcV9hbG9uZyh2YXIubmFtZXMpKSB7CiAgZTEyLmQxNC5zZGlmLm1hdFssIGldIDwtIHVubGlzdChsYXBwbHkoc3Ryc3BsaXQobmFtZXModmFsdWVzKSwgIlxcLiIpLCAiW1siLCBpKSkKfQoKZTEyLmQxNC5zZGlmIDwtIGRhdGEuZnJhbWUoZTEyLmQxNC5zZGlmLm1hdCkKZTEyLmQxNC5zZGlmJHZhbHVlIDwtIHZhbHVlcwogCiMgd2lkZW4gYW5kIHJlbW92ZSBOQXMKZTEyLmQxNC5zZGlmIDwtIHBpdm90X3dpZGVyKGUxMi5kMTQuc2RpZiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVzX2Zyb20gPSAiZGlzcGVyc2lvbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZXNfZnJvbSA9ICJ2YWx1ZSIpCmUxMi5kMTQuc2RpZiA8LSBlMTIuZDE0LnNkaWZbIWlzLm5hKGUxMi5kMTQuc2RpZiRtZWFuKSwgXQoKIyBtYWtlIGZ1cnRoZXIgcmVkdWNlZCBkZiAoY29sbGFwc2UgdHJlYXRtZW50KQplMTIuZDE0LnNkaWYyIDwtIGRhdGEuZnJhbWUoRXhwZXJpbWVudCA9IHJlcChjKCJhcmMiLCAicmV3ZXQiKSwgZWFjaCA9IDIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgVHlwZSA9IHJlcChjKCJGIiwgIkciKSwgMikpCmUxMi5kMTQuc2RpZjIkbWVhbiA8LSB1bmxpc3QoYyhlMTIuZDE0LnNkaWZbZTEyLmQxNC5zZGlmJEV4cGVyaW1lbnQgPT0gImFyYyIgJmUxMi5kMTQuc2RpZiRUeXBlID09ICJGIiwgIm1lYW4iXSwKICAgICAgICAgICAgICAgICAgICAgICAgZTEyLmQxNC5zZGlmW2UxMi5kMTQuc2RpZiRFeHBlcmltZW50ID09ICJhcmMiICZlMTIuZDE0LnNkaWYkVHlwZSA9PSAiRyIsICJtZWFuIl0sCiAgICAgICAgICAgICAgICAgICAgICAgIG1lYW4odW5saXN0KGUxMi5kMTQuc2RpZltlMTIuZDE0LnNkaWYkRXhwZXJpbWVudCA9PSAicmV3ZXQiICZlMTIuZDE0LnNkaWYkVHlwZSA9PSAiRiIsICJtZWFuIl0pKSwKICAgICAgICAgICAgICAgICAgICAgICAgbWVhbih1bmxpc3QoZTEyLmQxNC5zZGlmW2UxMi5kMTQuc2RpZiRFeHBlcmltZW50ID09ICJyZXdldCIgJmUxMi5kMTQuc2RpZiRUeXBlID09ICJHIiwgIm1lYW4iXSkpKSkKCiMgZnVuY3Rpb24gZm9yIGNhbGN1bGF0aW5nIHN0ZCBlcnIgb2YgZGlmcwpzdGQuZXJyLmRpZiA8LSBmdW5jdGlvbihzZHMsIG5zKSB7c3FydChzZHNbMV1eMi9uc1sxXSArIHNkc1syXV4yL25zWzJdKX0KIyBmdW5jdGlvbiBmb3IgY2FsY3VsYXRpbmcgbWVhbiBzdGQgZGV2CnN0ZC5kZXYubWVhbiA8LSBmdW5jdGlvbih2YXJzKSB7c3FydChtZWFuKHZhcnMpKX0KCmUxMi5kMTQuc2RpZjIkc2UgPC0gdW5saXN0KGMoZTEyLmQxNC5zZGlmW2UxMi5kMTQuc2RpZiRFeHBlcmltZW50ID09ICJhcmMiICZlMTIuZDE0LnNkaWYkVHlwZSA9PSAiRiIsICJzZSJdLAogICAgICAgICAgICAgICAgICAgICAgICBlMTIuZDE0LnNkaWZbZTEyLmQxNC5zZGlmJEV4cGVyaW1lbnQgPT0gImFyYyIgJmUxMi5kMTQuc2RpZiRUeXBlID09ICJHIiwgInNlIl0sCiAgICAgICAgICAgICAgICAgICAgICBzdGQuZXJyLmRpZih1bmxpc3QoZTEyLmQxNC5zZGlmW2UxMi5kMTQuc2RpZiRFeHBlcmltZW50ID09ICJyZXdldCIgJmUxMi5kMTQuc2RpZiRUeXBlID09ICJGIiwgInNkIl0pLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5saXN0KGUxMi5kMTQuc2RpZltlMTIuZDE0LnNkaWYkRXhwZXJpbWVudCA9PSAicmV3ZXQiICZlMTIuZDE0LnNkaWYkVHlwZSA9PSAiRiIsICJuIl0pKSwKICAgICAgICAgICAgICAgICAgICAgIHN0ZC5lcnIuZGlmKHVubGlzdChlMTIuZDE0LnNkaWZbZTEyLmQxNC5zZGlmJEV4cGVyaW1lbnQgPT0gInJld2V0IiAmZTEyLmQxNC5zZGlmJFR5cGUgPT0gIkciLCAic2QiXSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmxpc3QoZTEyLmQxNC5zZGlmW2UxMi5kMTQuc2RpZiRFeHBlcmltZW50ID09ICJyZXdldCIgJmUxMi5kMTQuc2RpZiRUeXBlID09ICJHIiwgIm4iXSkpKSkKCiMgY2FsYyBtZWFuIHZhcmlhbmNlCmUxMi5kMTQuc2RpZjIkdmFyIDwtIHVubGlzdChjKGUxMi5kMTQuc2RpZltlMTIuZDE0LnNkaWYkRXhwZXJpbWVudCA9PSAiYXJjIiAmZTEyLmQxNC5zZGlmJFR5cGUgPT0gIkYiLCAidmFyIl0sCiAgICAgICAgICAgICAgICAgICAgICAgIGUxMi5kMTQuc2RpZltlMTIuZDE0LnNkaWYkRXhwZXJpbWVudCA9PSAiYXJjIiAmZTEyLmQxNC5zZGlmJFR5cGUgPT0gIkciLCAidmFyIl0sCiAgICAgICAgICAgICAgICAgICAgICBtZWFuKHVubGlzdChlMTIuZDE0LnNkaWZbZTEyLmQxNC5zZGlmJEV4cGVyaW1lbnQgPT0gInJld2V0IiAmZTEyLmQxNC5zZGlmJFR5cGUgPT0gIkYiLCAidmFyIl0pKSwKICAgICAgICAgICAgICAgICAgICAgIG1lYW4odW5saXN0KGUxMi5kMTQuc2RpZltlMTIuZDE0LnNkaWYkRXhwZXJpbWVudCA9PSAicmV3ZXQiICZlMTIuZDE0LnNkaWYkVHlwZSA9PSAiRyIsICJ2YXIiXSkpKSkKCiMgIyBtZWFuIHN0ZCBkZXYgZm9yIGZvcmVzdHMKIyBzdGQuZGV2Lm1lYW4oYyhlMTIuZDE0LnNkaWYyW2UxMi5kMTQuc2RpZjIkVHlwZSA9PSAiRiIsICJ2YXIiXSkpCiMgIyBtZWFuIHN0ZCBkZXYgZm9yIGdyYXNzbGFuZHMKIyBzdGQuZGV2Lm1lYW4oYyhlMTIuZDE0LnNkaWYyW2UxMi5kMTQuc2RpZjIkVHlwZSA9PSAiRyIsICJ2YXIiXSkpCgojIGNvbXBhcmUgdG8gY3RsIHRyZWF0IGRpZgplMTIuMTRjLmN0bC50cnQgPC0gYWxsLjE0Yy5jdGwudHJ0ICU+JQogIHNlbGVjdChFeHBlcmltZW50LCBUeXBlLCBjdGwudHJ0LmQxNCkgJT4lCiAgZ3JvdXBfYnkoRXhwZXJpbWVudCwgVHlwZSkgJT4lCiAgYWRkX3RhbGx5KCkgJT4lCiAgc3VtbWFyaXplX2FsbChsaXN0KG1lYW4gPSBtZWFuLCBzZCA9IHNkLCB2YXIgPSB2YXIpLCBuYS5ybSA9IFRSVUUpICU+JQogIG11dGF0ZShjdGwudHJ0LnNlID0gY3RsLnRydC5kMTRfc2Qvbl9tZWFuKQoKIyBjb21iaW5lCnZhci5jZiA8LSBjYmluZC5kYXRhLmZyYW1lKGUxMi4xNGMuY3RsLnRydFsxOjQsIF0sIGUxMi5kMTQuc2RpZjJbICwgYygibWVhbiIsICJzZSIpXSkKIyBrbml0cjo6a2FibGUodmFyLmNmWywgYygiRXhwZXJpbWVudCIsICJUeXBlIiwgImN0bC50cnQuZDE0X21lYW4iLCAiY3RsLnRydC5zZSIsICJtZWFuIiwgInNlIildLAojICAgICAgICAgICAgICBjb2wubmFtZXMgPSBjKCJFeHBlcmltZW50IiwgIlR5cGUiLCAiQ3RsLVRydCBtZWFuIGRpZiIsICJDdGwtVHJ0IFNFIiwgIlJlcGxpY2F0ZSBtZWFuIGRpZiIsICJSZXBsaWNhdGUgU0UiKSwKIyAgICAgICAgICAgICAgY2FwdGlvbiA9ICJDb21wYXJpc29uIG9mIHRyZWF0bWVudCBkaWZmZXJlbmNlcyB2ZXJzdXMgdmFyaWFiaWxpdHkgYW1vbmcgcmVwbGljYXRlcyIsCiMgICAgICAgICAgICAgIGFsaWduID0gImMiLAojICAgICAgICAgICAgICBkaWdpdHMgPSAxKQpgYGAKCmBgYHtyIGRlbHRhLWRlbHRhLXBsb3QsIGluY2x1ZGUgPSBGQUxTRX0KIyBjYWxjdWxhdGUgZGQxNGMKZGQxNGMuc3VtIDwtIGUxMi5kMTQuaW5jCmRkMTRjLnN1bSRhdG0xNGMgPC0gaWZlbHNlKGRkMTRjLnN1bSRZZWFyU2FtcGxlZCA9PSAyMDExLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIERhdG1bd2hpY2goRGF0bSREYXRlID09IDIwMTEuNSksICJOSGMxNCJdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIERhdG1bd2hpY2goRGF0bSREYXRlID09IDIwMTkuNSksICJOSGMxNCJdKQpkZDE0Yy5zdW0kZGQxNGMgPC0gZGQxNGMuc3VtJGQxNGNfY29yciAtIGRkMTRjLnN1bSRhdG0xNGMKZGQxNGMuc3VtIDwtIGRkMTRjLnN1bSAlPiUgCiAgc2VsZWN0KEV4cGVyaW1lbnQsIFRyZWF0bWVudCwgVHlwZSwgZGQxNGMpICU+JQogIGdyb3VwX2J5KEV4cGVyaW1lbnQsIFRyZWF0bWVudCwgVHlwZSkgJT4lCiAgYWRkX3RhbGx5KCkgJT4lCiAgc3VtbWFyaXplX2FsbChsaXN0KG1lYW4gPSBtZWFuLCBzZCA9IHNkKSwgbmEucm0gPSBUUlVFKSAlPiUKICBtdXRhdGUoZGQxNGNfc2UgPSBkZDE0Y19zZC9uX21lYW4pCgpkZDE0Yy5zdW0gJT4lCiAgbXV0YXRlKHRyZWF0LmJpID0gaWZlbHNlKFRyZWF0bWVudCAhPSAiY29udHJvbCIsICJ0cmVhdG1lbnQiLCAiY29udHJvbCIpLAogICAgICAgICBkZDE0Y19taW4gPSBkZDE0Y19tZWFuIC0gZGQxNGNfc2UqMiwKICAgICAgICAgZGQxNGNfbWF4ID0gZGQxNGNfbWVhbiArIGRkMTRjX3NlKjIpICU+JQogIGdncGxvdCguLCBhZXModHJlYXQuYmksIGRkMTRjX21lYW4sIGNvbG9yID0gVHlwZSkpICsKICBnZW9tX3BvaW50KHNpemUgPSAzKSArCiAgZ2VvbV9lcnJvcmJhcigKICAgIGFlcyh5bWluID0gZGQxNGNfbWluLCAKICAgICAgICB5bWF4ID0gZGQxNGNfbWF4LCAKICAgICAgICBjb2xvciA9IFR5cGUpLCAKICAgIHdpZHRoID0gLjEpICsKICBzY2FsZV9jb2xvcl9tYW51YWwobmFtZSA9ICdFY29zeXN0ZW0nLAogICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgPWMoJ0YnPScjYTM1NTEzJywnRyc9JyMxMzYxYTMnKSwKICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYygnRm9yZXN0JywnR3Jhc3NsYW5kJykpICsKICBmYWNldF9ncmlkKGNvbHMgPSB2YXJzKEV4cGVyaW1lbnQpKSArIAogIHRoZW1lX2J3KCkgKwogIHRoZW1lKHBhbmVsLmdyaWQubWlub3IgPSBlbGVtZW50X2JsYW5rKCkpCmBgYAoKCiMgQ2hhbmdlIGluIHNvaWwgbW9pc3R1cmUgY29udGVudCB3aXRoIG1vaXN0dXJlIGFkanVzdG1lbnQKCmBgYHtyIGRlbHRhLW1vaXN0dXJlLWNhbGN9CiMgY29tcGFyZSB0aGUgY2hhbmdlIGluIG1vaXN0dXJlIHdpdGggY29udHJvbCBzYW1wbGVzIHZlcnN1cyB0cmVhdG1lbnQgc2FtcGxlcwp3aGNGcmVzaCA8LSBtZXJnZShhcmNoaXZlLmN0bC50cy53aWRlW2FyY2hpdmUuY3RsLnRzLndpZGUkRXhwZXJpbWVudCA9PSAiYXJjIiwgYygiSUQiLCAid2hjRnJlc2giKV0sCiAgICAgICAgICAgICAgICAgIGphcmluZm8ucmV3ZXRbamFyaW5mby5yZXdldCRUcmVhdG1lbnQgPT0gImNvbnRyb2wiLCBjKCJJRCIsICJ3aGNGcmVzaCIpXSwKICAgICAgICAgICAgICAgICAgYnkgPSAiSUQiLAogICAgICAgICAgICAgICAgICBhbGwueCA9IFRSVUUsCiAgICAgICAgICAgICAgICAgIHN1ZmZpeGVzID0gYygiXzIwMTEiLCAiXzIwMTkiKSkKd2hjRnJlc2gkZGVsdGFXSENfMjAxMSA8LSAuNi13aGNGcmVzaCR3aGNGcmVzaF8yMDExCndoY0ZyZXNoJGRlbHRhV0hDXzIwMTkgPC0gLjYtd2hjRnJlc2gkd2hjRnJlc2hfMjAxOQp3aGNGcmVzaCRUeXBlIDwtIGlmZWxzZShncmVwbCgiRyIsIHdoY0ZyZXNoJElEKSwgIkciLCAiRiIpCgojIHN1bWFtcml6ZQp3aGNGcmVzaF9zdW0gPC0gd2hjRnJlc2ggJT4lCiAgc2VsZWN0KFR5cGUsIGRlbHRhV0hDXzIwMTEsIGRlbHRhV0hDXzIwMTksIHdoY0ZyZXNoXzIwMTEsIHdoY0ZyZXNoXzIwMTkpICU+JQogIGdyb3VwX2J5KFR5cGUpICU+JQogIGFkZF90YWxseSgpICU+JQogIHN1bW1hcml6ZV9hbGwobGlzdChtZWFuID0gbWVhbiwgc2QgPSBzZCksIG5hLnJtID0gVFJVRSkgJT4lCiAgbXV0YXRlKGRlbHRhX3NlXzExID0gZGVsdGFXSENfMjAxMV9zZC9uX21lYW4sCiAgICAgICAgIGRlbHRhX3NlXzE5ID0gZGVsdGFXSENfMjAxOV9zZC9uX21lYW4sCiAgICAgICAgIGZyZXNoX3NlXzExID0gd2hjRnJlc2hfMjAxMV9zZC9uX21lYW4sCiAgICAgICAgIGZyZXNoX3NlXzE5ID0gd2hjRnJlc2hfMjAxOV9zZC9uX21lYW4pCgojIHN3aXRjaCB3aGNGcmVzaCB0byBsb25nCndoY0ZyZXNoLjIwMTEgPC0gd2hjRnJlc2hbICwgYygiSUQiLCAid2hjRnJlc2hfMjAxMSIsICJkZWx0YVdIQ18yMDExIildCm5hbWVzKHdoY0ZyZXNoLjIwMTEpIDwtIGMoIklEIiwgIndoY0ZyZXNoIiwgImRlbHRhV0hDIikKd2hjRnJlc2guMjAxMSRFeHBlcmltZW50IDwtICJhcmMiCndoY0ZyZXNoLjIwMTkgPC0gd2hjRnJlc2hbICwgYygiSUQiLCAid2hjRnJlc2hfMjAxOSIsICJkZWx0YVdIQ18yMDE5IildCm5hbWVzKHdoY0ZyZXNoLjIwMTkpIDwtIGMoIklEIiwgIndoY0ZyZXNoIiwgImRlbHRhV0hDIikKd2hjRnJlc2guMjAxOSRFeHBlcmltZW50IDwtICJyZXdldCIKd2hjRnJlc2guMjAxOSA8LSB3aGNGcmVzaC4yMDE5W3doaWNoKGNvbXBsZXRlLmNhc2VzKHdoY0ZyZXNoLjIwMTkpKSwgXQp3aGNGcmVzaC5sb25nIDwtIHJiaW5kKHdoY0ZyZXNoLjIwMTEsIHdoY0ZyZXNoLjIwMTkpCgojIHN0YXRzCndoYy5jdGwudHJ0IDwtIG1lcmdlKGFyYy5yZXdldC4xNGMuY3RsLnRydCwgd2hjRnJlc2gubG9uZywgYnkgPSBjKCJJRCIsICJFeHBlcmltZW50IikpCmdncGxvdCh3aGMuY3RsLnRydCwgYWVzKHdoY0ZyZXNoLCBkMTRjX2RpZiwgY29sb3IgPSBUeXBlLCBzaGFwZSA9IEV4cGVyaW1lbnQpKSArCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCkgKwogIGdlb21fcG9pbnQoc2l6ZSA9IDMpICsKICBzY2FsZV9jb2xvcl9tYW51YWwobmFtZSA9ICdFY29zeXN0ZW0nLAogICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgPWMoJ0YnPScjYTM1NTEzJywnRyc9JyMxMzYxYTMnKSwKICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYygnRm9yZXN0JywnR3Jhc3NsYW5kJykpICsKICB0aGVtZV9idygpICsKICB0aGVtZShwYW5lbC5ncmlkID0gZWxlbWVudF9ibGFuaygpKQoKIyBzdW1tYXJ5KGxtKGQxNGNfZGlmIH4gd2hjRnJlc2ggKiBUeXBlLCB3aGMuY3RsLnRydCkpCgojICMgY2FsY3VsYXRlIGF0bSAxNEMgY2hhbmdlCiMgc2xvcGVzIDwtIGRhdGEuZnJhbWUoRGF0bVtEYXRtJERhdGUgPiAyMDAwICYgRGF0bSREYXRlIDwgMjAxNiwgXSwKIyAgICAgICAgICAgICAgICAgICAgICBzbG9wZSA9IE5BKQojIGZvcihpIGluIHNlcV9hbG9uZyhEYXRtW0RhdG0kRGF0ZSA+IDIwMDAgJiBEYXRtJERhdGUgPCAyMDE2LCAiRGF0ZSJdKSkgewojICAgaWYoaSAhPSBucm93KHNsb3BlcykpIHsKIyAgICAgc2xvcGVzJHNsb3BlW2ldIDwtIChEYXRtW0RhdG0kRGF0ZSA+IDIwMDAsICJOSGMxNCJdW2krMV0tRGF0bVtEYXRtJERhdGUgPiAyMDAwLCAiTkhjMTQiXVtpXSkvKERhdG1bRGF0bSREYXRlID4gMjAwMCwgIkRhdGUiXVtpKzFdLURhdG1bRGF0bSREYXRlID4gMjAwMCwgIkRhdGUiXVtpXSkKIyAgIH0KIyB9CiMgbWVhbihzbG9wZXMkc2xvcGUsIG5hLnJtID0gVCkKYGBgCgo+KipTdXBwbGVtZW50YWwgRmlnIGByIHsoc2ZpZy5uICsgNCl9YC4gQ2hhbmdlIGluICRcRGVsdGEkXjE0XkMtQ09+Mn4gKGNvbnRyb2wgLSB0cmVhdG1lbnQpIHJlbGF0aXZlIHRvIGZpZWxkIG1vaXN0dXJlKioKCj4qQ2FwdGlvbjoqIERhdGEgYXJlIGZyb20gRXhwZXJpbWVudCAxICgiYXJjIikgYW5kIEV4cGVyaW1lbnQgMiAoInJld2V0IikuIEFsbCBzYW1wbGVzIHdlcmUgbW9pc3R1cmUtYWRqdXN0ZWQgcHJpb3IgdG8gaW5jdWJhdGlvbiwgYnV0IGNvbnRyb2wgc2FtcGxlcyB3ZXJlIGFkanVzdGVkIGZyb20gZmllbGQgbW9pc3R1cmUsICJ3aGNGcmVzaCIgKHBlcmNlbnQgb2YgV0hDKSwgd2hlcmVhcyB0cmVhdG1lbnQgc2FtcGxlcyB3ZXJlIG1vaXN0dXJlIGFkanVzdGVkIGFmdGVyIGFpci1kcnlpbmcsIGkuZS4gYXQgYXBwcm94aW1hdGVseSAwJSBvZiBXSEMu