Note: This file contains supplementary information that highlights the overall data analysis in R code. Although the accompanying text here is mostly the same as in the accompanying paper for illustrative purposes, you should refer to the final, peer-reviewed paper for citations. You can click on the Code button in the upper right of this file to download its *.Rmd version.

Landslide inventories have become cornerstones for estimating the relationship between the frequency and size of slope failures, thus informing appraisals of hillslope stability, erosion, and commensurate hazard. Numerous studies have reported how larger landslides are systematically rarer than smaller ones, drawing on probability distributions fitted to mapped landslide areas or volumes. In these models, much uncertainty concerns the larger landslides (defined here as affecting >0.1 km2) that are rarely sampled, and often projected by extrapolating beyond the observed size range in a given study area. Relying instead on size-scaling estimates from other inventories is problematic because landslide detection and mapping, data quality, resolution, sample size, model choice, and fitting method can vary. To overcome these constraints, we employ a Bayesian multi-level model with a Generalised Pareto likelihood that provides a single, objective, and consistent comparison grounded in extreme-value theory. We explore whether and how scaling parameters vary between 37 inventories that, although incomplete, bring together 8627 large landslides. Despite the broad range of mapping protocols and lengths of record, and differing topographic, geological, and climatic settings, the posterior power-law scaling exponents remain indistinguishable between most inventories. Likewise, the scaling statistics fail to separate known earthquake from rainfall triggers, and event-based from multi-temporal catalogues. Instead, our model identifies several inventories with outlier scaling statistics that reflect intentional censoring during mapping. Our results thus caution against a universal or solely mechanistic interpretation of the scaling parameters, at least in the context of large landslides.

1 Introduction

Keeping records of the size and frequency of landslides is key to estimate rates of erosion, geomorphic work, and hillslope evolution (Dente et al. 2023; Saito et al. 2014; Marc et al. 2019); infer material strength and weathering of hillslopes (G. K. Li and Moon 2021; Alberti et al. 2022); and inform hazard appraisals of slope instability (Guzzetti et al. 2012), particularly in response to contemporary climate change (Smith et al. 2023). A popular way to characterise the relative frequency of landslide-affected areas or volumes is to fit probability distributions to size data compiled in inventories (Malamud et al. 2004). These catalogues contain locations and geometries of individual footprint areas mapped largely from air photos or satellite images. The choice of probability distribution (or “scaling laws”) has favoured the inverse power-law or Pareto, the inverse gamma, or the lognormal distributions (Tebbens 2020), or combinations thereof (Jain, Khosa, and Gosain 2022). All these distributions are skewed, often heavy-tailed, and capture the widespread observation that larger landslides are systematically rarer than smaller ones.

Reported values of the parameters that define these distributions have seemingly narrow numerical ranges (Tebbens 2020). This similarity among model fits has led to a lively discussion about whether these parameters reflect generic geometric or mechanistic properties of landslides or the hillslopes that they occur on (Bellugi et al. 2021; Bernard, Lague, and Steer 2021). For example, physical interpretations of the “roll-over” that marks the lower bound of inverse power-law distributions include that of a hillslope length scale that is susceptible to failure, or the cohesive strength of failure planes (Tebbens 2020). While landslide size distributions may reflect the nature and spatial intensity of a common trigger such as a strong earthquake (Valagussa et al. 2019), the average landslide size may contain information about both cohesive strength of slope material and hillslope relief (Medwedeff et al. 2020). Some of these physical interpretations are backed by, or derived from, numerical simulations of slope instability (Frattini and Crosta 2013). Yet, a different line of arguments proposed that the roll-over is a statistical artefact of landslide detection and mapping, approximately marking the smallest discernible landslide in a given study area (Tebbens 2020). Either way, this discussion has questioned whether these scaling laws are universally applicable to landslides irrespective of environmental setting, mapping methods, and trigger mechanisms (Malamud et al. 2004; Tanyaş et al. 2019). Many of these interpretations have relied on the direct comparison of reported parameter values, and scrutiny concerning possible effects of data sources and quality, mapping method, and statistical errors of the fitted models has increased in more recent work (Bellugi et al. 2021).

Still, most uncertainty remains about the large landslides that are rarely sampled naturally. Hence, the bulk of studies on landslide size has disclosed little about these large landslides, let alone their prediction as first-time failures (Fan et al. 2019). One reason for this knowledge gap is that large landslides are often elusive in catalogues compiled shortly after a landslide-triggering earthquake or rainstorm (Hao et al. 2020; Abancó et al. 2021; Santangelo et al. 2023). Sample sizes often involve only a handful to several dozen large landslides, and thus often remain too small for robust statistics in a given study area. Hence, inference is mostly based on the simple extrapolation of model fits beyond the observed size range. Yet, large landslides may often re-shape hillslope geometry and dominate erosion (Korup et al. 2007; Marc et al. 2019), but may involve phases of creep motion, and respond differently to triggering conditions than smaller failures because of a longer and more complex slope history of accumulated stress and strain (Lacroix, Handwerger, and Bièvre 2020).

In general, the statistics of landslides are derived from a sequence of detection, mapping, and statistical inference (Fig. 1). Uncertainties that propagate throughout each step can affect the outcome in terms of landslide scaling statistics.

Landslide scaling statistics rely on accurate detection, mapping, and statistical inference. These three (colour-coded) steps are prone to a number of uncertainties that may propagate as errors into the derived landslide statistics. Boxes with black outline are most likely directly tied to physical processes of landsliding.
Landslide scaling statistics rely on accurate detection, mapping, and statistical inference. These three (colour-coded) steps are prone to a number of uncertainties that may propagate as errors into the derived landslide statistics. Boxes with black outline are most likely directly tied to physical processes of landsliding.


At the level of the input data, both landslide detection and mapping face several constraints. The mapping objective can dictate whether to focus on landslides attributed to a single trigger such as a strong earthquake (Meunier, Uchida, and Hovius 2013; Gorum et al. 2014; Tanyaş et al. 2017; Lombardo et al. 2019), a rainstorm (Abancó et al. 2021; Hao et al. 2020; Emberson et al. 2022; Santangelo et al. 2023), or instead to compile landslide traces that have accumulated over years to millennia (LaHusen et al. 2016; Luetzenburg et al. 2022; Fusco et al. 2023; Pánek et al. 2016). Some of the most comprehensive catalogues today feature thousands to hundreds of thousands of slope failures across entire nations or beyond (Luetzenburg et al. 2022; Fusco et al. 2023). The methods to detect, map, and compile landslides have become more diverse and elaborate beyond traditional mapping from air photos, optical satellite data or historical records (Y. Xu et al. 2020; Casagli et al. 2023). Newer catalogues derive from laser scanning (Bernard, Lague, and Steer 2021), radar imagery (Song et al. 2022), object-based image analysis (Milledge et al. 2022), deep neural networks (Schönfeldt et al. 2022; Bhuyan et al. 2023), text mining (Franceschini et al. 2022), and seismology (Hibert et al. 2019). Most methods require specific mapping protocols adjusted to the effective resolution of imagery that may be compromised by vegetation, land cover, cloud, and shadow (Brardinoni, Slaymaker, and Hassan 2003; Burrows, Marc, and Remy 2022). Varying image quality, resolution, and coverage also affect landslide size estimates, as does the experience of mapping operators (Van Den Eeckhaut et al. 2005). The mapping outcome may depend on whether a single person or a team is at work, and the attention to detail in delineating source, deposit, or total affected areas. Overlapping landslide source areas or bodies can obscure the dimensions of slope failure (Marc and Hovius 2015). Debris- flows and snow-avalanche tracks, moraines, and wind-throw gaps in forests can be mistaken for landslide evidence. Experience and training aid detection and mapping, but also introduce bias, for example favouring fresh landslides, certain types of failure, or a size range that is easiest to recognise. Hence, the size range of a given inventory is bounded by the smallest mappable, and the largest recognisable, landslide (Barlow et al. 2012). Thus, without any standard mapping protocol in place, landslide researchers have to deal with catalogues of varying coverage, detail, and quality for the same task of obtaining traits of landslide size.

At the model level, estimates of size scaling hinge on the choice of probability distribution to characterise the mapped landslides (Brink et al. 2009). These estimates also depend on sample size, data pre-processing, fitting method, residuals, and cross-validation. Numerical experiments show that small sample sizes yield volatile estimates of scaling parameters for inverse power-law distributions in particular (Korup, Görüm, and Hayakawa 2012). Most estimation methods involve either regression of log-binned - and thus smoothed - landslide frequencies versus size (Gilham, Barlow, and Moore 2018), or maximum likelihood estimates (Clauset, Shalizi, and Newman 2009); various biases apply to both methods. However, reports of confidence intervals or goodness of fit, and hence ways to assess overfitting remain rare. Still, the basis for statistical inference of landslide size distributions varies at the level of the individual inventory, each of which embodies the methods of detection and mapping used, and the biases they may induce. In the light of these constraints, a direct comparison of landslide scaling estimates between different inventories may be misleading.

We propose a compact solution to compare more fairly the landslide-size distributions from diverse inventories by estimating scaling parameters with a single, probabilistically consistent model. We apply this model to large landslides that affect a total area of >0.1 km2, and address the problem of small sample size by using Bayesian inference in a multi-level model that uses data from multiple inventories to estimate the variance of scaling parameters within and across these catalogues (Luna and Korup 2022). The multi-level approach acknowledges structure in landslide size data in a consistent way. One natural grouping of data is by inventory, and reflects the diversity in data input quality reviewed above. Our focus on large landslides makes the Generalised Pareto Distribution (GPD) a natural model choice, because extreme-value theory predicts that data above a high threshold are approximately GP distributed (Castro-Camilo, Huser, and Rue 2022). Another advantage of this distribution is that its parameters can be translated directly into those used most widely in studies of landslide size scaling.

2 Data and Methods

We consider data on total landslide-affected areas from several dozen published landslide inventories with open access. We excluded many other detailed catalogues that had no records of landslides meeting our size threshold of 0.1 km2. Besides information about their size, many databases have landslide types and triggers reported, and many data were recorded following recent (i.e. post-1900) major earthquakes and rainstorms with the intention to characterise the impact of these events. We also included catalogues spanning time intervals of several years to millennia, featuring mostly undated large landslides with unknown triggers to test whether these cumulative inventories have size distributions that differ from those of event-based inventories.

# Read data file on landslide inventories
zz <- read_csv("lsinventory_scaling_master.csv")

# Order by target variable
zz <- zz %>% arrange(xx)

# Create any subsets if needed
zz <- zz %>% filter(!is.na(Inventory))

# Add synthetic noise to break ties in ranks for exceedance probabilities
zz$xx <- zz$xx + runif(length(zz$xx))

The choice of probability distribution to model landslide area often rests on implicit assumptions. For example, the inverse power law draws on considerations of physical sand-pile models and the concept of self-organised criticality (Hergarten and Neugebauer 1998), whereas the lognormal distribution arises naturally from multiplicative effects of random variables (Brink et al. 2009). Here we model the reported sizes of large landslides with the Generalized Pareto Distribution (GPD). The GPD is rooted in extreme-value theory and approximates the distribution of a continuous random variable \(x\) above a high threshold (or location parameter) \(\mu\). The GPD thus captures what we would expect theoretically from a sample consisting of observations filtered above a minimum value (Katz, Parlange, and Naveau 2002). Any physical interpretation of the GPD parameters may need to account, or correct, for this statistical expectation first. The probability density function of the GPD is:

\[ \mathrm{GPD}(x|\mu,\sigma,k) = \frac{1}{\sigma} \left( 1 + \frac{k \left( x - \mu \right)}{\sigma} \right) ^ {-1/k - 1}, \]

where \(x >= \mu\), \(\sigma > 0\) is a scale parameter, and \(k \geq 0\) is a shape parameter. The scale parameter \(\sigma\) is somewhat comparable to the “roll-over” in studies using an inverse power-law model for estimating landslide size scaling. This roll-over marks the lowest landslide size above which power-law scaling is assumed. The GPD shape parameter is the inverse of the “scaling exponent” of the power-law tail \(\alpha\), such that \(k = 1 / \alpha\).

Here, the location parameter \(\mu\) sets the minimum landslide size for data to be admitted to the GPD. This is known as a peak-over-threshold approach in extreme-value statistics (Katz, Parlange, and Naveau 2002). For large landslides, we let \(\mu\) = 0.1 km2. Empirical relationships between landslide volume and total affected area across a wide range of environmental settings show that an area of 0.1 km2 corresponds to an average volume of roughly 106 m3 (Larsen, Montgomery, and Korup 2010), which is the suggested lower threshold for large landslides (McColl and Cook 2024). This particular choice of \(\mu\) is a compromise, because fewer samples and landslide inventories are available for higher values of \(\mu\), whereas the GPD becomes a less and less valid approximation to the data for lower values of \(\mu\).

# Consider only POT data, i.e. those xx >= min_size
zz$xx <- zz$xx / 1e6 # convert to [km ^ 2]

# Record minimum landslide area in full inventory
zz <- zz %>% 
  group_by(Inventory) %>% 
  mutate(minArea = min(xx))

# Set minimum size mu (location parameter)
min_size <- 0.1 # [km ^ 2]

# Record number of landslides below mu
zz <- zz %>% 
  group_by(Inventory) %>% 
  mutate(n_below_mu = sum(xx < min_size))

# Record total landslide area
tot_A <- sum(zz$xx)

# Filter for POT data
zz <- zz %>% filter(xx >= min_size)

Fitting the GPD to data can involve maximum likelihood estimates or, in case of few samples (\(n\) < 30), probability-weighted (L-)moments to avoid volatile parameter estimates (Katz, Parlange, and Naveau 2002). We use Bayesian inference to learn the GPD parameters from the data, acknowledging explicitly that these are derived from different inventories that reflect different environmental conditions across study areas, and landslides likely detected at varying resolution and mapped with different techniques. A Bayesian treatment of this fitting problem seeks a compromise between a likelihood function and a probability distribution of prior knowledge about the model parameters. This approach also obviates the need for binned landslide-size data to use frequency density (e.g. Malamud et al. 2004). Instead, we work with the joint probability that is the numerator of Bayes’ Rule:

\[ p(\theta|\mathcal{D}) = \frac{p(\mathcal{D}|\theta) p(\theta)}{p(\mathcal{D})}, \]

where \(\theta\) is the vector of model parameters that we wish to update from both the landslide data \(\mathcal{D}\) and prior knowledge. We use the GPD as the likelihood function \(p(\mathcal{D}|\theta)\) and choose (hyper-)prior distributions \(p(\theta)\) to approximate what we know about landslide size distributions so far and irrespective of the data \(\mathcal{D}\) studied here.

Our model uses a multi-level setup, in which \(i \in \{1,\dots,n\}\) indexes each landslide observation \(x_i\) from a sample of size \(n\), and \(j \in \{1,\dots,J\}\) indexes each of \(J\) different landslide inventories. The idea of the multi-level model is that the size distribution in each landslide inventory \(j\) is characterised by an individual set of GPD parameters \(\sigma_j\) and \(k_j\). We further assume that the values of each of these inventory-specific parameter pairs are drawn from the same two probability distributions:

\[ x_i \sim \mathrm{GPD}(\mu, \sigma_{j[i]}, k_{j[i]}) \]

\[ \sigma_j \sim \mathrm{Gamma}(\alpha_\sigma, \beta_{\sigma}) \] \[ k_j \sim \mathrm{Gamma}(\alpha_k, \beta_{k}) \]

Here we choose independent Gamma distributions for both \(\sigma_j\) and \(k_j\) to ensure that the parameters are positive and uncorrelated. The multi-level model thus learns the parameters for each catalogue informed by both its data, the overarching Gamma distributions, and prior knowledge. While the model allows \(\sigma_j\) and \(k_j\) to vary between landslide inventories, it also draws on information from the full data set via this multi-level structure.

Bayesian reasoning requires that we specify our prior knowledge explicitly. We do this by choosing the hyper-parameters of the two Gamma distributions of \(\sigma_j\) and \(k_j\). These hyper-parameters describe the distribution of landslide scaling parameters across all inventories and offer a global summary from all data. We draw on the growing literature of landslide scaling. Recent reviews have summarised that the power-law scaling exponent \(\alpha\) for landslide inventories is most often reported in the range of 1 < \(\alpha\) < 3 (Tebbens 2020). Recalling that the GPD shape parameter \(k = 1 / \alpha\), we can use this information to constrain our (hyper-)prior distributions accordingly. Hence we choose these hyper-parameter values such that they contain findings from landslide scaling studies based on data other than the ones used here. The exact shape of these distributions may matter little in the light of the large sample size that informs our likelihood function. We disregard any correlation between the hyper-parameters and simplistically assume independent distributions:

\[ \alpha_\sigma \sim \mathcal{N}(1, 0.25) \] \[ \beta_{\sigma} \sim \mathcal{N}(5, 5) \] \[ \alpha_k \sim \mathcal{N}(6, 1) \] \[ \beta_{k} \sim \mathcal{N}(9, 1) \]

where \(\alpha_\sigma\) and \(\alpha_k\) are the corresponding shape parameters, and \(\beta_{\sigma}\) and \(\beta_{k}\) are the inverse scale (or rate) parameters. We assume independent Gaussian prior distributions for these hyperparameters and choose the prior means and standard deviations informed by previous research on landslide scaling properties (Tebbens 2020).

# Set minimum samples per inventory
min_grp_size <- 25

To avoid having too many inventories with only a handful of large landslides, we consider only those data collections with at least 25 landslides that exceed the threshold size \(\mu\).

# Filter for minimum samples per group
min_grp <- zz %>% 
  group_by(Inventory) %>% 
  summarise(count = n()) %>% 
  filter(count <= min_grp_size)
zz <- zz %>% filter(!(Inventory %in% min_grp$Inventory))
# Compute empirical exceedance probabilities per group
zz <- zz %>% 
  group_by(Inventory) %>% 
  arrange(xx, .by_group = TRUE) %>% 
  mutate(p = seq(n(), 1, -1) / n())

The data that we need for a numerical approximation of the posterior distribution of the parameters of the GPD consist of the individual landslide areas and labels of the inventories they belong to.

# Prepare data input for STAN (custom)
stan_d <- list(
  ymin = min_size,
  N = length(zz$xx),
  y = zz$xx,
  L = length(unique(zz$Inventory)),
  ll = as.numeric(factor(zz$Inventory)),
  ymax = aggregate(zz$xx, by = list(zz$Inventory), max)$x,
  #yt = 10 ^ seq(2.9, 5, 0.01),   # testing data
  #Nt = 211
  yt = zz$xx,   # testing data
  Nt = length(zz$xx),
  lltt = as.numeric(factor(zz$Inventory))
)
# Data overview
(mydat <- zz %>%
  group_by(Inventory) %>%
  summarise(Samples = n(),
            `Max. area (km^2)` = max(xx) %>% round(1),
            `Min. area (km^2)` = min(minArea) %>% round(4),
            `n < threshold` = max(n_below_mu),
            Trigger = first(Trigger),
            Reference = first(group)))

The size threshold \(\mu\) means that we had to discard many published landslide inventories that only contain smaller slope failures. Our data thus consists of 8627 large landslides filtered from 37 different inventories. Together, these large slope failures affected an area of 6407 km2, or 59% of the total landslide-affected area recorded in these catalogues. The largest landslide is unnamed and extends over 201 km2 in the Caspian Sea basin (Pánek et al. 2016). Our data thus span more than three orders of magnitude in landslide area; the largest mapped landslide areas per inventory differ by up two orders of magnitude.

We note that 19 (or 51%) of our selected landslide inventories were compiled following an earthquake, including several versions that were mapped by different research teams. Only 3 catalogues (8%) are attributed to a rainfall trigger, while 15 catalogues (41%) contain information about landslides that accumulated over many years and thus likely reflect various triggers.

We use the probabilistic programming language STAN (Carpenter et al. 2017) to code our model and call it via the statistical programming environment R. We ran four independent Hamiltonian Monte Carlo chains to explore the model parameter space with the No U-Turn (NUTS) sampler coded in STAN and verified that the numerical solutions converged. Unless stated otherwise, we use medians and 95% highest density intervals (HDIs) to summarise all posterior distributions. A 95% HDI means that there is a 95% probability for a given parameter to be in the specified interval.

# We extract the posterior into a more amenable format:
posterior <- rstan::extract(mfit)
rm(mfit)

# Obtain posterior predictions
mypred <- data.frame(A = stan_d$yt,
                          lo = apply(posterior$predccdf, 2,
                                     HDIofMCMC)[1, ],
                          md = apply(posterior$predccdf, 2,
                                     median),
                          hi = apply(posterior$predccdf, 2,
                                     HDIofMCMC)[2, ])

# Combine with data
zz <- cbind(zz, mypred)

# Collect hyperparameters
post_hyper <- as.data.frame(cbind(posterior$alpha_k, 
                                  posterior$beta_k,
                                  posterior$a_sigma,
                                  posterior$b_sigma,
                                  posterior$lp__))
names(post_hyper) <- c("alpha_k", "beta_k", "a_sigma", "b_sigma", "logposterior")

3 Results

3.1 Model fits and residuals

We express the size distributions of large landslides in cumulative form using the exceedance probability \(p\) for a given landslide area.

ggplot(zz, aes(x = xx,
               y = md,
               col = factor(Inventory))) +
  geom_line() +
  geom_ribbon(aes(ymin = hi, ymax = lo, fill = factor(Inventory)), 
              alpha = 0.35, linewidth = 0) +
  scale_color_viridis_d(begin = 1, end = 0) +
  geom_point(data = zz, aes(x = xx, y = p), alpha = 2/3) +
  labs(x = expression(paste("Landslide area (", km^2, ")")), 
       y = "Empirical exceedance probability") +
  scale_x_log10(breaks = trans_breaks("log10", function(x) 10 ^ x, n = 3),
                labels = trans_format("log10", math_format(10 ^ .x))) +
  scale_y_log10(breaks = trans_breaks("log10", function(x) 10 ^ x, n = 3),
                labels = trans_format("log10", math_format(10 ^ .x))) +
  theme_bw() +
  theme(aspect.ratio = 0.6, 
        legend.position = "none") +
  facet_wrap( ~ Inventory, ncol = 5)

To express how well the GPD model fits the data, we compute the residuals in terms of the log-odds ratios between the empirical exceedance probabilities (\(p\)) and the predicted averages (\(\hat p\)) for each inventory. The log-odds ratio is \(\log \frac{\hat p(1 - p)}{p (1-\hat p)}\), conditioned on each observed landslide. A positive (negative) log-odds ratio means that the model overestimates (underestimates) the empirical exceedance probability of a given landslide area.

# Plot residuals in exceedance probability
ggplot(zz %>% filter(p < 1), 
       aes(x = xx,
           y = -log((p / (1 - p)) / (md / (1 - md))),
           col = factor(Inventory))) +
  geom_ribbon(aes(ymin = -log((p / (1 - p)) / (hi / (1 - hi))), 
                  ymax = -log((p / (1 - p)) / (lo / (1 - lo))), 
                  fill = factor(Inventory)), 
              alpha = 0.35, lwd = 0) +
  scale_color_viridis_d() +
  geom_abline(slope = 0, intercept = 0, lty = 2) +
  geom_point(alpha = 2/3) +
  labs(x = expression(paste("Landslide area (", km^2, ")")), 
       y = "Log-odds ratio") +
  scale_x_log10(breaks = trans_breaks("log10", function(x) 10 ^ x, n = 3),
                labels = trans_format("log10", math_format(10 ^ .x))) +
  ylim(-2, 2) +
  theme_bw() +
  theme(aspect.ratio = 0.6, legend.position = "none") +
  facet_wrap( ~ Inventory, ncol = 5)


# Save posterior log-odds ratios
post_logodds <- zz %>% 
  group_by(Inventory) %>% 
  summarise(lo_logodds = HDIofMCMC(log((p / (1 - p)) / (md / (1 - md))))[1],
            hi_logodds = HDIofMCMC(log((p / (1 - p)) / (md / (1 - md))))[2],
            HDI_logodds = hi_logodds - lo_logodds)

We find that the log-odds ratios reveal most mismatches at either extreme end of the size range, though without any consistency across the inventories. For example, the model underestimates the execeedance probabilities of landslide areas <0.8 km2 in catalogues M9.1 Tohoku JPN 2 (Tanyaş et al. 2017) and Owyhee USA (Safran et al. 2011), while overestimating the execeedance probabilities of landslide areas >1.7 km2 in catalogue Dauna Apennines ITA (Ardizzone et al. 2023).

3.2 Effects of different landslide inventories

# Extract and plot estimates of shape parameter k
post_k <- posterior$k
colnames(post_k) <- unique(zz$Inventory)
post_k <- melt(post_k, value.name = "k")
colnames(post_k) <- c("iterations", "Inventory", "k")

post_k %>% 
  group_by(Inventory) %>% 
  mutate(md_grp_k = median(k)) %>% 
  ggplot(aes(x = k, 
             y = fct_reorder(Inventory, md_grp_k), 
             fill = fct_reorder(Inventory, md_grp_k))) +
  geom_vline(xintercept = median(post_hyper$alpha_k / post_hyper$beta_k), 
             color = "darkgrey") +
  geom_vline(xintercept = HDIofMCMC(post_hyper$alpha_k / post_hyper$beta_k), 
             linetype = "dashed", color = "darkgrey") +
  stat_halfeye(
               interval_size = 0.5, 
               shape = 21,
               point_color = "red",
               point_fill = "white",
               point_size = 1.5,
               show.legend = FALSE
               ) +
  scale_fill_viridis_d() +
  xlim(0, 1.25) +
  labs(x = expression(k[j]), y = NULL) +
  theme_bw() +
  theme(aspect.ratio = 4)

# Group summary of posterior k
post_k_grp <- post_k %>%
  group_by(Inventory) %>%
  summarise(md_grp_k = median(k),
            hdi_lo_grp_k = HDIofMCMC(k)[1],
            hdi_hi_grp_k = HDIofMCMC(k)[2],
            whdi_grp_k = HDIofMCMC(k)[2] - HDIofMCMC(k)[1])

# Group summary of posterior alpha = 1 / k
post_alpha_grp <- post_k %>%
  group_by(Inventory) %>%
  summarise(md_grp_alpha = median(1 / k),
            hdi_lo_grp_alpha = HDIofMCMC(1 / k)[1],
            hdi_hi_grp_alpha = HDIofMCMC(1 / k)[2],
            whdi_grp_alpha = HDIofMCMC(1 / k)[2] - HDIofMCMC(1 / k)[1])

Our model estimates shape parameters \(k_j\) that vary across the landslide inventories with posterior medians ranging from \(\tilde{k}_j\) = 0.21 in catalogue M8 Haiyuan CHN (Y. Xu et al. 2020) to \(\tilde{k}_j\) = 0.92 in catalogue M7.9 Alaska USA 1 (Gorum et al. 2014). Narrower posterior distributions mean less uncertainty, mainly owing to more large landslides that inform the model in the relevant catalogue. For example, the Campania ITA inventory (Fusco et al. 2023) contains most, i.e. 1854, large landslides, and its 95% HDI is narrowest (0.57 < \(k_j\) < 0.72). In contrast, the M6.2 Aisen CHL 1 (Gorum et al. 2014) catalogue has the fewest, i.e. 29, large landslides; its broad posterior distribution is thus informed more by the pooled estimate from all inventories together.

The mean of the Gamma prior distribution is \(\bar{k} = \alpha_k / \beta_{k}\) by definition, and we derive the power-law exponent \(\alpha\) from the identity \(\alpha = 1 / k\). Similarly, we obtain the mean pooled posterior \(\bar{\sigma} = \alpha_\sigma / \beta_{\sigma}\) from the sampled hyperparameters. We find that most of the 95% credible intervals of \(k_j\) overlap with that of the mean \(\bar{k}\) learned from the pooled model (grey vertical line, flanked by dashed lines marking its 95% HDI). Only two inventories, i.e. one on historic rock avalanches in the St. Elias mountains of Alaska, United States (St. Elias USA, Bessette-Kirton and Coe 2020), and one on landslides triggered by the 1920 Haiyuan earthquake, China (Y. Xu et al. 2020), stand out with a \(k_j\) that is credibly below that of the population average.

Estimates of \(k_j\) can differ credibly between inventories in the same geographic region such as western Canada and Alaska, for example when comparing St. Elias USA (Bessette-Kirton and Coe 2020); Kluane, CAN-USA (W. Smith, pers. comm.); and M7.9 Alaska USA (Gorum et al. 2014). On the contrary, inventories covering very different geographic regions and time spans can have largely overlapping, and thus statistically indifferent, posterior distributions of \(k_j\). This is the case, for example, for a catalogue of landslides triggered by the M7.6 Kashmir earthquake in 2005 (M7.6 PAK 3, Basharat et al. 2016), and one on mostly Quaternary landslides in the Caspian Sea basin (Caspian Sea KAZ, Pánek et al. 2016). Similarly, the inventory of rainfall-triggered landslides in far western Nepal covering 79 time steps between 2002 and 2018 (Far Western NPL, Muñoz-Torrero 2020), and the one on landslides following the 2018 M7.5 Porgera earthquake in Papua New Guinea, a database fully compiled by a deep learning algorithm (Porgera* PNG, Bhuyan et al. 2023), have indistinguishable posterior distributions of \(k_j\).

# Plot estimates of scale parameter sigma 
post_sig <- posterior$sigma
colnames(post_sig) <- unique(zz$Inventory)
post_sig <- melt(post_sig, value.name = "sig")
colnames(post_sig) <- c("iterations", "Inventory", "sig")

post_sig %>% 
  group_by(Inventory) %>% 
  mutate(md_grp_sig = median(sig)) %>% 
  ggplot(aes(x = sig, 
             y = fct_reorder(Inventory, md_grp_sig), 
             fill = fct_reorder(Inventory, md_grp_sig))) +
  geom_vline(xintercept =  median(post_hyper$a_sigma / post_hyper$b_sigma), 
             color = "darkgrey") +
  geom_vline(xintercept = HDIofMCMC(post_hyper$a_sigma / post_hyper$b_sigma),
             linetype = "dashed", color = "darkgrey") +
  geom_vline(xintercept = min_size, 
             linetype = "dashed", color = "red") +
  stat_halfeye(
    interval_size = 0.5, 
    shape = 21,
    point_color = "red",
    point_fill = "white",
    point_size = 1.5,
    show.legend = FALSE
  ) +
  scale_fill_viridis_d() +
  scale_x_log10(expression(paste(sigma[j], " (", km^2, ")")),
        breaks = trans_breaks("log10", function(x) 10 ^ x),
        labels = trans_format("log10", math_format(10 ^ .x))) +
  labs(y = NULL) +
  theme_bw() +
  theme(aspect.ratio = 4)

# Group summary of posterior sigma
post_sig_grp <- post_sig %>%
  group_by(Inventory) %>%
  summarise(md_grp_sig = median(sig),
            hdi_lo_grp_sig = HDIofMCMC(sig)[1],
            hdi_hi_grp_sig = HDIofMCMC(sig)[2],
            whdi_grp_sig = HDIofMCMC(sig)[2] - HDIofMCMC(sig)[1])

The spread of the posterior scale parameter \(\sigma_j\) is more pronounced across the inventories such that the pooled estimate overlaps with those of seven inventories only. Inventory-specific medians range over two orders of magnitude from \(\tilde{\sigma}_j\) = 0.04 km2 in the M7.9 Sichuan CHN 1 catalogue (C. Xu et al. 2014) to \(\tilde{\sigma}_j\) = 2.56 km2 in the Caspian Sea KAZ catalogue (Pánek et al. 2016). Again, inventories with different environmental settings and landslide triggers have very similar posterior distributions of \(\sigma_j\), such as the one on landslides triggered during Typhoon Morakot, Taiwan, in 2009 (TC Morakot TWN, Emberson et al. 2022), and the one on landslides triggered by the M7.6 Kashmir earthquake in 2005 (M7.6 PAK 3, Basharat et al. 2016). This also holds for different inventories addressing the same triggering event, such as the 2008 Wenchuan earthquake, for example M7.9 Sichuan CHN 1 (C. Xu et al. 2014) and M7.9 Sichuan CHN 2 (G. Li et al. 2014). Higher values of \(\tilde{\sigma}_j\) especially identify inventories with a less pronounced, or more limited range of, power-law scaling for the large landslides recorded. Examples include many of the inventories containing Quaternary landslides such as those of the Caspian Sea (Caspian Sea KAZ, Pánek et al. 2016) or the Columbia River basins (Owyhee USA, Safran et al. 2011), but also the above-mentioned inventories of rock avalanches that happened in the past few decades (St. Elias USA and Kluane CAN-USA).

3.3 Pooled estimates of landslide scaling

The pooled estimates in our multi-level model express the variance of the learned parameters across all inventories. The sampled hyperparameters of \(k_j\) that describe the shape \(\alpha_k\) and rate (or inverse scale) \(\beta_{k}\) of the Gamma-distributed parameter \(k_j\) are positively correlated; the same applies for the hyperparameters \(\alpha_{\sigma}\) and \(\beta_{\sigma}\).

# Plot hyperparameter estimates of k
p_hyp_k <- ggplot(post_hyper, aes(x = alpha_k, y = beta_k)) + 
  scale_fill_gradient(low = "purple", high = "orange") +
  labs(fill = expression(n[s]),
       x = expression(alpha[k]),
       y = expression(beta[k])) +
  geom_hex(alpha = 0.8) +
  theme_bw() +
  theme(aspect.ratio = 1,
        legend.key.size = unit(0.1, "cm"),
        legend.key.height = unit(0.1, "cm"),
        legend.key.width = unit(0.4, "cm"),
        legend.position = "top")

# Plot hyperparameter estimates of sigma
p_hyp_sig <- ggplot(post_hyper, aes(x = a_sigma, y = b_sigma)) + 
  scale_fill_gradient(low = "purple", high = "orange") +
  labs(fill = expression(n[s]),
       x = expression(alpha[sigma]),
       y = expression(beta[sigma])) +
  geom_hex(alpha = 0.8) +
  theme_bw() +
  theme(aspect.ratio = 1,
        legend.key.size = unit(0.1, "cm"),
        legend.key.height = unit(0.1, "cm"),
        legend.key.width = unit(0.4, "cm"),
        legend.position = "top")

plot_grid(p_hyp_k, p_hyp_sig, align = "h",
          labels = c("a", "b"))

# Posterior mean of k
p_pool_k <- ggplot(post_hyper %>% 
    mutate(
      a_k_prior = abs(rnorm(nrow(post_hyper), 6, 1)), # Gaussian hyperprior
      b_k_prior = abs(rnorm(nrow(post_hyper), 9, 1)), # Gaussian hyperprior
      a_prior = 1 / (a_k_prior / b_k_prior),
      a_post = 1 / (alpha_k / beta_k))
    ) +
    # prior
    stat_slab(aes(x = a_prior),
               slab_fill = "grey",
               slab_alpha = 0.75,
               show.legend = FALSE,
               normalize = "none"
               ) +
    # posterior
    stat_halfeye(aes(x = a_post),
               interval_size = 0.5,
               shape = 21,
               point_color = "red",
               point_fill = "white",
               point_size = 1.5,
               slab_fill = "orchid",
               slab_alpha = 0.75,
               show.legend = FALSE,
               normalize = "none"
               ) +
  xlim(0.75, 3) +
  ylim(0, 3.25) +
  annotate("text", x = 1, y = 0.9, label = "Prior", color = "grey") +
  annotate("text", x = 2, y = 1.5, label = "Posterior", color = "orchid") +
  labs(x = expression(paste("Mean pooled scaling exponent ", 
                            alpha)), 
       y = expression(paste("p(", alpha, ")"))) +
  theme_bw() +
  theme(aspect.ratio = 1/4)

# Posterior mean of sigma
p_pool_sig <- ggplot(post_hyper %>% 
    mutate(
      a_sig_prior = abs(rnorm(nrow(post_hyper), 1, 0.25)), # Gaussian hyperprior
      b_sig_prior = abs(rnorm(nrow(post_hyper), 5, 5)),  # Gaussian hyperprior
      sig_prior = a_sig_prior / b_sig_prior,
      sig_post = a_sigma / b_sigma)
    ) +
    # prior
    stat_slab(aes(x = sig_prior),
               slab_fill = "grey",
               slab_alpha = 0.75,
               show.legend = FALSE,
               normalize = "none"
               ) +
    # posterior
    stat_halfeye(aes(x = sig_post),
               interval_size = 0.5,
               shape = 21,
               point_color = "red",
               point_fill = "white",
               point_size = 1.5,
               slab_fill = "darkorange",
               slab_alpha = 0.75,
               show.legend = FALSE,
               normalize = "none"
               ) +
  xlim(0, 0.75) +
  ylim(0, 10) +
  annotate("text", x = 0.1, y = 6, label = "Prior", color = "grey") +
  annotate("text", x = 0.275, y = 9, label = "Posterior", color = "darkorange") +
  labs(x = expression(paste("Mean pooled scale parameter ", 
                            sigma, " (", km^2, ")")),
       y = expression(paste("p (", sigma, ") (", km^-2, ")"))) +
  theme_bw() +
  theme(aspect.ratio = 1/4)

plot_grid(p_pool_k, p_pool_sig, align = "v", ncol = 1,
          labels = c("a", "b"))

We find that the numerical approximation of the joint posterior distribution has a distinct maximum. We obtain a mean power-law exponent of 1.35 < \(\bar{\alpha}\) < 1.83 across all inventories with 95% probability; the posterior median of \(\bar{\alpha}\) is 1.6. Compared to the prior distribution based on published values of the scaling parameter, our model has gained more certainty from the data considered in this study, yielding a much narrower posterior. The mean scaling parameter is 0.18 < \(\bar{\sigma}\) < 0.37 km2 across all inventories with 95% probability; the posterior median of \(\bar{\sigma}\) is 0.27 km2. This posterior shifted up from the prior distribution that we centered on our arbitrary size threshold for large landslides. Our model has learned much from the inventory data compared to the priors, especially concerning the high variance of \(\sigma_j\) across the individual landslide catalogues.

3.4 Comparison with maximum likelihood estimate

To assess the sensitivity of our model results to our choice of inference, we compare our results to maximum likelihood estimates (MLE) of the exponent \(\alpha_j\) of the inverse power-law distribution, based on the Hill estimator (Clauset, Shalizi, and Newman 2009). By definition, the MLE standard error for each inventory decays with the inverse square root of sample size, whereas the Bayesian estimates are informed by all data via the multi-level model structure. Hence we do not expect a 1:1 correspondence from this comparison. Instead, it underlines how variable and uncertain landslide scaling estimates can be for different inventories, regardless of method.

# MLE estimate for power-law alpha 
# Equation 3.1 in Clauset et al. (2009)
MLE_alpha <- zz %>% 
  group_by(Inventory) %>% 
  summarise(n = n(),
            MLE = 1 + n / sum(log(xx / min_size)),
            MLE_sd = (MLE - 1) / sqrt(n)) # Appendix B in Clauset et al.

# Posterior medians of k
posterior_k <- post_k %>% 
  group_by(Inventory) %>% 
  summarise(md_grp_alpha = median(1 / k),
            lo_grp_alpha = HDIofMCMC(1 / k)[1],
            hi_grp_alpha = HDIofMCMC(1 / k)[2])

# Posterior medians of sigma
posterior_sig <- post_sig %>% 
  group_by(Inventory) %>% 
  summarise(md_grp_sig = median(sig),
            lo_grp_sig = HDIofMCMC(sig)[1],
            hi_grp_sig = HDIofMCMC(sig)[2])

modcomp <- merge(mydat, MLE_alpha)
modcomp <- merge(modcomp, posterior_k)
modcomp <- merge(modcomp, posterior_sig)
modcomp <- merge(modcomp, post_logodds)

ggplot(modcomp, aes(y = MLE - 1, # Offset due to definition in Clauset et al.
                    x = md_grp_alpha, 
                    size = n,
                    col = `n < threshold` / (n + `n < threshold`))) +
  geom_errorbar(aes(ymax = MLE - 1 + 2 * MLE_sd, 
                     ymin = MLE - 1 - 2 * MLE_sd),
                 col = "grey", linewidth = 0.5) + 
  geom_errorbarh(aes(xmax = hi_grp_alpha, 
                    xmin = lo_grp_alpha),
                col = "grey", linewidth = 0.5) + 
  geom_point() +
  geom_point(pch = 21, color = "black") +
  scale_color_viridis_c(begin = 0.95, end = 0.15) +
  geom_abline(intercept =  0, slope = 1, linetype = "dashed") +
  geom_text_repel(aes(label = ifelse(md_grp_alpha > 3, 
                               Inventory, ""),
                      bg.color = "white", bg.r = 0.2), 
            hjust = -0.1, vjust = -0.5, col = "black") +
  labs(y = expression(paste("MLE of ", alpha)), 
       x = expression(paste("Posterior ", alpha[j])),
       size = "Large\nlandslides\nin inventory",
       col = expression(paste("Fraction of\nlandslides < ", mu))) +
  # xlim(0, 5) +
  # ylim(0, 5) +
  scale_x_continuous(breaks = seq(0, 8, 1)) +
  coord_fixed() +
  theme_bw() +
  theme(legend.position = "top")

We obtain inventory-specific MLEs of 0.33 < \(\hat\alpha_j\) < 2.39. This spread encompasses most reported values in the literature (Tebbens 2020). In contrast, the posterior medians of \(\alpha_j = 1/k_j\) occupy a seemingly broader range (1.09 < \(\tilde\alpha\) < 4.82), though nominally similar to that of the MLE method for most inventories within the respective errors. However, the coefficient of variation is narrower for the Bayesian median estimates. Two inventories stand out with very high scaling exponents, e.g. M8 Haiyuan CHN and St. Elias USA. Both inventories have only few landslides that we censored because they were below the size threshold \(\mu\) = 0.1 km2; in other words, these catalogues contained mostly large landslides originally.

4 Discussion

4.1 Implications

Our results show that posterior shape parameters \(k_j = 1/\alpha_j\) of landslide-size distributions may vary despite being informed by thousands of data points and previous research. The narrowest 95% HDI of \(\alpha_j\), and thus the best we can constrain this parameter, is that of the Campania ITA catalogue with 1.37 < \(\alpha_j\) < 1.74. This numerical range has much overlap with that of previously reported scaling exponents that were obtained for mostly smaller landslides, however (Tebbens 2020). Still, the nearly triangular posterior distribution has much of its probability mass near its peak, and the same goes for the pooled estimate. Except for a few inventories, the corresponding posterior distributions for other landslide inventories also remain largely indistinguishable from the pooled estimate. This low variance of \(\alpha_j\) across inventories is striking if we consider the diverse mapping techniques, levels of data quality, coverage, environmental setting, and landslide triggers. The inventories we selected cover several climatic zones with different vegetation and land cover characteristics that likely affect the detection and mapping or large landslides. Some inventories were generated from deep learning algorithms (Bhuyan et al. 2023), whereas most others were mapped manually. While many posterior \(\sigma_j\) have values close to our arbitrary size threshold for large landslides of 0.1 km2, the variance in this parameter is high compared to the pooled estimates. Overall, the median estimates of both \(\alpha_j\) and \(\sigma_j\) are unaffected by the number of large landslides reported in a given inventory.

Our model highlights several inventories with scaling statistics that stand out. The M8 Haiyuan CHN and St. Elias USA catalogues have high estimates of \(\alpha_j\), whereas Caspian Sea KAZ, M9.1 Tohoku JPN 2, and Owyhee USA have high estimates of \(\sigma_j\). These inventories consist almost exclusively of large landslides and feature very few other data below the size threshold \(\mu\). In contrast, we observe that inventories with most landslides falling below \(\mu\) have low values of \(\sigma_j\) consistently. We infer that landslide catalogues that were focused on compiling information about larger landslides tend to have elevated values of \(\sigma_j\). In this context, our selection of inventories is nearly balanced: twenty of them have less than 10% large landslides, whereas seventeen of them have more than 50%.

ggplot(modcomp, 
       aes(x = md_grp_alpha,
           y = md_grp_sig, 
           size = n,
           col = `n < threshold` / (n + `n < threshold`),
           #col = `Min. size (sqkm)`,
           label = Inventory)) +
  geom_errorbarh(aes(xmax = hi_grp_alpha, 
                    xmin = lo_grp_alpha),
                col = "grey", linewidth = 0.5) +
  geom_errorbar(aes(ymax = hi_grp_sig, 
                    ymin = lo_grp_sig),
                col = "grey", linewidth = 0.5) +
  scale_color_viridis_c(begin = 0.95, end = 0.15) +
  labs(x = expression(paste("Posterior ", alpha[j])),
       size = "Large\nlandslides",
       col = expression(paste("Fraction of\nlandslides < ", mu))) +
  geom_point() +
  geom_point(pch = 21, color = "black") +
  geom_text_repel(aes(label = ifelse(md_grp_alpha > 3 | md_grp_sig > 1, 
                               Inventory, ""),
                      bg.color = "white", bg.r = 0.2), 
            hjust = -0.1, vjust = -0.5, col = "black") +
  scale_x_continuous(breaks = seq(0, 8, 1)) +
  scale_y_log10(expression(paste("Posterior ", 
                                 sigma[j], " (", km^2, ")")),
        breaks = trans_breaks("log10", function(y) 10 ^ y),
        labels = trans_format("log10", math_format(10 ^ .x))) +
  theme_bw() +
  theme(aspect.ratio = 1)

One possible explanation for these outlying landslide-size statistics is that the GPD is a poor fit to inventories that mainly feature large landslides, at least for the chosen threshold \(\mu\). The residuals for most of these inventories show pronounced underestimates for the smallest landslide range, except for the South Central CHL and Caspian Sea KAZ catalogues. Yet, other inventories with similar residuals (e.g. Glacier Bay N.P. CAN) hardly stand out compared to the pooled estimates. Clearly, extrapolating the model across the full size range, for example to infer the number of seemingly missing, underreported, or overlooked landslides (Tanyaş et al. 2019) can be misleading in these cases. Another explanation for the high estimates of \(k_j\) and \(\sigma_j\) is that the original mapping was focused on landslides well beyond the size threshold we chose, so that slope failures close to this cutoff might be undersampled. Some of these inventories also contain partly overlapping slope-failure deposits of multiple ages, marking several phases of reactivation. Such overlaps may cause more landslides to surpass the size threshold. Hence, the mapping objective would partly bias estimates of \(\sigma_j\) for a size threshold that is too low.

ggplot(modcomp, 
       aes(x = md_grp_alpha,
           y = md_grp_sig, 
           size = n,
           fill = Trigger,
           label = Inventory)) +
  geom_errorbarh(aes(xmax = hi_grp_alpha, 
                    xmin = lo_grp_alpha),
                col = "grey", linewidth = 0.5) +
  geom_errorbar(aes(ymax = hi_grp_sig, 
                    ymin = lo_grp_sig),
                col = "grey", linewidth = 0.5) +
  scale_fill_brewer(palette = "PuOr") +
  labs(x = expression(paste("Posterior ", alpha[j])),
       size = "Large\nlandslides",
       bg = "Landslide\ntrigger") +
  geom_point() +
  geom_point(pch = 21, color = "black") +
  geom_text_repel(aes(label = ifelse(md_grp_alpha > 3 | md_grp_sig > 1, 
                               Inventory, ""),
                bg.color = "white", bg.r = 0.2), 
            hjust = -0.1, vjust = -0.5) +
  scale_x_continuous(breaks = seq(0, 8, 1)) +
  scale_y_log10(expression(paste("Posterior ", 
                                 sigma[j], " (", km^2, ")")),
        breaks = trans_breaks("log10", function(y) 10 ^ y),
        labels = trans_format("log10", math_format(10 ^ .x))) +
  theme_bw() +
  theme(aspect.ratio = 1)

We also find that the 95% credible intervals of both GDP parameters overlap for landslide inventories regardless of whether they are attributed to recent earthquakes and rainstorms, or whether they integrate landslide observations, and thus likely various triggers, over many years. We infer that the scaling statistics disclose very little about the type of landslide trigger. In this context, our findings caution against a mechanistic interpretation of the scaling parameters.

4.2 Role of size threshold and sample size

The heavy-tailed distribution of landslides means that we discarded many samples for small increases in \(\mu\). To test the sensitivity of our results to the choice of size threshold \(\mu\), we replicated our analyses, and recorded the variation of the pooled estimates \(\bar{k}\) and \(\bar{\sigma}\) as a function of both \(\mu\) and the minimum number of large landslides that an inventory needs to have to be considered in our analysis.

mingrp_labeller <- as_labeller(
  c(`5` = "n > 5",
    `10` = "n > 10",
    `25` = "n > 25",
    `50` = "n > 50",
    `100` = "n > 100")
)

p_sens1 <- ggplot(hyparam, aes(x = 1 / a_post, y = as.factor(mu))) +
  labs(x = expression(paste("Pooled ", alpha)),
       y = expression(paste(mu, " (", km^2, ")"))) +
  stat_halfeye(interval_size = 0.5,
               shape = 21,
               point_color = "red",
               point_fill = "white",
               point_size = 1.5,
               slab_fill = "orchid",
               slab_alpha = 0.75,
               normalize = "panels",
               show.legend = FALSE) + 
  xlim(1, 2.25) +
  scale_y_discrete(breaks = seq(0.1, 0.3, 0.1)) +
  theme_bw() +
  theme(aspect.ratio = 1, legend.position = "none") +
  facet_wrap( ~ grpsize, ncol = 5, labeller = mingrp_labeller)

p_sens2 <- ggplot(hyparam, aes(x = sigma_post, y = as.factor(mu))) +
  labs(x = expression(paste("Pooled ", sigma, " (", km^2, ")")),
       y = expression(paste(mu, " (", km^2, ")"))) +
  stat_halfeye(interval_size = 0.5,
               shape = 21,
               point_color = "red",
               point_fill = "white",
               point_size = 1.5,
               slab_fill = "darkorange",
               slab_alpha = 0.75,
               normalize = "panels",
               show.legend = FALSE) + 
  xlim(0.1, 1.5) +
  scale_y_discrete(breaks = seq(0.1, 0.3, 0.1)) +
  theme_bw() +
  theme(aspect.ratio = 1, legend.position = "none") +
  facet_wrap( ~ grpsize, ncol = 5, labeller = mingrp_labeller)

plot_grid(p_sens1, p_sens2, align = "v", ncol = 1,
          labels = c("a", "b"))

We find that varying the size threshold such that 0.075 km2 < \(\mu\) < 0.3 km2 returns posterior pooled values of \(\alpha\) that decrease slightly with increasing \(\mu\) and the minimum number of samples per inventory, though with much overlap. Overall, 1.23 \(<\bar{\alpha}<\) 1.9 with 95% probability regardless of the threshold or sample size that we pick. Estimates of \(\bar{\sigma}\) increase sightly with \(\mu\), but also with some overlap. Preferring larger inventories for a given size threshold reduces the total sample size such that the pooled posterior distributions of \(\sigma\) get broader.

We infer that the choice of \(\mu\), and hence the definition of “large” landslides (McColl and Cook 2024), has limited influence on the scaling statistics, and especially \(\bar{\alpha}\). Values of \(\mu\) below the range that we tested violate the assumption of a high threshold such that a GPD would be inappropriate, whereas values above this range suffer from too small sample sizes. The pooled scale parameter \(\bar{\sigma}\) shows less variation with \(\mu\) and has largely overlapping posteriors. Hence, the choice of the minimum number of large landslides per inventory (\(n_{\mathrm{min}}\) = 25) limits both the number of levels in our model and the overall sample size. Admitting more inventories that contain fewer large landslides changes the posterior \(\bar{k}\) and \(\bar{\sigma}\) only slightly, but does narrow the uncertainties, especially for higher thresholds \(\mu\).

4.3 Advantages

Our Bayesian multi-level approach expands on previous, though largely separate, efforts of comparing landslide size statistics across different inventories. We offer here a single, consistent model that has several advantages:

First, the Bayesian setup can handle the small sample problem of large landslides. Scaling parameters for large landslides from a single landslide inventory are commonly estimated from extrapolating model fits that largely draw on more numerous, smaller landslides. Yet, even simulated power-law distributed data have natural scatter in the largest of observations (Clauset, Shalizi, and Newman 2009), making it difficult to validate extrapolations and leading to over-confident parameter estimates. Using data from other landslide inventories to validate these estimates often tacitly assumes that the scaling parameters agree or differ within error, but offers no way of determining of whether this assumption is at all valid. The multi-level model instead draws on the larger sample size from all inventories, and explicitly refines this shared knowledge in dedicated posterior distributions for each catalogue. In general, group-level parameter estimates tend to be closer to the pooled mean than those derived for separate models using fewer data from each group alone. This effect is known as parameter shrinkage and guards against overfitting, especially for inventories with fewer data.

Second, the Bayesian treatment documents explicitly all parameter uncertainties, and especially those that capture previous knowledge about reported parameters that characterise landslide size distributions. We can thus quantify how much we have learned from the data by comparing the posterior and prior distributions. By design, a Bayesian model seeks a compromise between these previous findings and the data considered here in a probabilistically consistent way. To this end, we made sure to include mostly recently published landslide inventories or those that had not been considered in scaling studies before. Posterior parameter estimates for catalogues with few large landslides are broader compared to those with many large landslides.

Third, the multi-level model structure enables direct comparison of parameter estimates across and between landslide inventories. Any differences in the underlying workflows of detecting and mapping landslides and the commensurate sample sizes are being accounted for by separate posterior distributions and their deviation from the pooled estimates. Our model measures objectively how similar landslide inventories are in terms of the scaling parameters that jointly, instead of separately, define the size distributions of large landslides.

Fourth, the peak-over-threshold approach that defines the GPD is rooted in extreme-value theory and thus expresses naturally what we expect statistically in the size distribution of large landslides. The parameters of the GPD contain information about the “roll-over” location and power-law scaling, and translate readily into parameters of other distributions used to characterise the size scaling of landslides.

4.4 Further applications

We can flexibly modify our multi-level model in several ways. One option is to group the data in other ways than by inventories. For example, we can specify the group levels such that they represent the type of inventory (event-based versus integrating over a period of time); triggering mechanism (earthquake, rainstorm, snowmelt, etc.); soil or rock type; or any other characteristic that may have been collected during the process of compiling the landslide inventory. We recall that the GPD is by definition “blind” to data below the threshold \(\mu\) in that it truncates all observations below the threshold. One alternative to improve the parameter estimates would be to use a censored GPD model that acknowledges the presence of smaller landslides, though without knowing their reported sizes.

5 Conclusions

  • We propose a multi-level model as common ground for consistently estimating and comparing size distributions of large slope failures across different inventories. In choosing a peak-over-threshold approach the Generalised Pareto distribution (GPD) reflects what we would expect statistically from a given landslide size distribution. The multi-level setup remediates the problem of low sample size by making use of all available data for estimating scaling parameters while acknowledging inherent differences across inventories.

  • Our model results based on 37 inventories with 8627 large landslides (\(>\) 0.1 km2) show that the power-law exponent for each inventory \(k_j = 1 / \alpha_j\) discloses little about the different underlying landslide trigger(s), geographic region, or time span concerning a given inventory, i.e. whether it is event-based or compiles landslides of many different ages. Inventories of mostly undated, prehistoric landslides have scaling exponents \(\alpha_j\) that hardly differ from those of historic, event-based catalogues.

  • Despite thousands of large landslides to learn from, the uncertainty about \(\alpha_j\) spans several decimal points. If taking all inventories together, the pooled \(\alpha\) captures most of this variance. The location parameter \(\sigma\) has more spread across inventories and is affected especially by those with with few or no landslides below our size threshold. We infer that \(\sigma\) is sensitive to the desired landslide size range and likely reflects the influence of mapping choices.

  • While several numerical modelling studies have attributed a physical meaning to scaling statistics of landslide size, we argue that some of this meaning might get diluted or even lost in empirical data that may combine confounding controls. We surmise that landslide inventories record these physical processes, though in a mixed way that could admit, for example, different failure types, rock and soil types, and groundwater conditions. We suspect that most landslide inventories may have mixed size distributions. For example, mixing data from inventories with differing size thresholds could add variance to \(\sigma\). Hence, the resulting scaling statistics would at best reflect bulk physical characteristics instead of clearly representing parameters of a single, well-constrained physical model of slope stability.

  • Our model measures objectively by how much scaling statistics differ across inventories within estimation error. Such differences can be vital if using scaling statistics for predicting future landslide hazard in terms of size and frequency (Hergarten 2023).

6 Acknowledgements

We used the statistical programming environment R (https://cran.r-project.org) with RStudio (https://posit.co/) as a frontend for all data analysis, and coded the Bayesian GPD in the probabilistic language STAN (https://mc-stan.org/); all are freely available. The landslide inventories studied here have either been published as indicated or are available directly from the original contributors. Will Smith and Stuart Dunning kindly shared data on landslides in Kluane National Park. Part of this research was funded by the German Research Foundation via the Research Training Group NatRiskChange (DFG GRK 2043, https://www.uni-potsdam.de/en/natriskchange/).

7 References

Abancó, C., G. L. Bennett, A. J. Matthews, M. A. M. Matera, and F. J. Tan. 2021. The role of geomorphology, rainfall and soil moisture in the occurrence of landslides triggered by 2018 Typhoon Mangkhut in the Philippines.” Natural Hazards and Earth System Sciences 21 (5): 1531–50. https://doi.org/10.5194/nhess-21-1531-2021.
Alberti, Stefano, Ben Leshchinsky, Josh Roering, Jonathan Perkins, and Michael J. Olsen. 2022. “Inversions of Landslide Strength as a Proxy for Subsurface Weathering.” Nature Communications 13 (1): 6049. https://doi.org/10.1038/s41467-022-33798-5.
Antinao, Jose Luis, and John Gosse. 2009. Large rockslides in the Southern Central Andes of Chile (32–34.5\(\,^{\circ}\)S): Tectonic control and significance for Quaternary landscape evolution.” Geomorphology 104 (3): 117–33. https://doi.org/10.1016/j.geomorph.2008.08.008.
Ardizzone, F., F. Bucci, M. Cardinali, F. Fiorucci, L. Pisano, M. Santangelo, and V. Zumpano. 2023. Geomorphological landslide inventory map of the Daunia Apennines, southern Italy.” Earth System Science Data 15 (2): 753–67. https://doi.org/10.5194/essd-15-753-2023.
Barlow, John, Michael Lim, Nick Rosser, David Petley, Matthew Brain, Emma Norman, and Melanie Geer. 2012. “Modeling Cliff Erosion Using Negative Power Law Scaling of Rockfalls.” Geomorphology 139-140: 416–24. https://doi.org/10.1016/j.geomorph.2011.11.006.
Basharat, Muhammad, Abid Ali, Ishtiaq A. K. Jadoon, and Joachim Rohn. 2016. Using PCA in evaluating event-controlling attributes of landsliding in the 2005 Kashmir earthquake region, NW Himalayas, Pakistan.” Natural Hazards 81 (3): 1999–2017. https://doi.org/10.1007/s11069-016-2172-9.
Basharat, Muhammad, Joachim Rohn, Mirza Shahid Baig, and Muhammad Rustam Khan. 2014. Spatial distribution analysis of mass movements triggered by the 2005 Kashmir earthquake in the Northeast Himalayas of Pakistan.” Geomorphology 206: 203–14. https://doi.org/10.1016/j.geomorph.2013.09.025.
Behling, Robert, Sigrid Roessner, Darya Golovko, and Birgit Kleinschmit. 2016. Derivation of long-term spatiotemporal landslide activity—A multi-sensor time series approach.” Remote Sensing of Environment 186: 88–104. https://doi.org/10.1016/j.rse.2016.07.017.
Belair, G. M., E. S. Jones, S. L. Slaughter, and B. B. Mirus. 2022. Landslide Inventories across the United States version 2.” U.S. Geological Survey. https://doi.org/10.5066/P9FZUX6N.
Bellugi, Dino G., David Graham Milledge, Kurt M. Cuffey, William E. Jr. Dietrich, and Laurel G. Larsen. 2021. Controls on the size distributions of shallow landslides.” Proceedings of the National Academy of Sciences 118 (9): e2021855118. https://doi.org/10.1073/pnas.2021855118.
Bernard, T. G., D. Lague, and P. Steer. 2021. Beyond 2D landslide inventories and their rollover: synoptic 3D inventories and volume from repeat lidar data.” Earth Surface Dynamics 9 (4): 1013–44. https://doi.org/10.5194/esurf-9-1013-2021.
Bessette-Kirton, Erin K., and Jeffrey A. Coe. 2020. A 36-Year Record of Rock Avalanches in the Saint Elias Mountains of Alaska, With Implications for Future Hazards.” Frontiers in Earth Science 8. https://doi.org/10.3389/feart.2020.00293.
Bhuyan, Kushanav, Hakan Tanyaş, Lorenzo Nava, Silvia Puliero, Sansar Raj Meena, Mario Floris, Cees van Westen, and Filippo Catani. 2023. “Generating Multi-Temporal Landslide Inventories Through a General Deep Transfer Learning Strategy Using HR EO Data.” Scientific Reports 13 (1): 162. https://doi.org/10.1038/s41598-022-27352-y.
Brardinoni, Francesco, Olav Slaymaker, and Marwan A Hassan. 2003. “Landslide Inventory in a Rugged Forested Watershed: A Comparison Between Air-Photo and Field Survey Data.” Geomorphology 54 (3): 179–96. https://doi.org/10.1016/S0169-555X(02)00355-0.
Brink, U. S. ten, R. Barkan, B. D. Andrews, and J. D. Chaytor. 2009. “Size Distributions and Failure Initiation of Submarine and Subaerial Landslides.” Earth and Planetary Science Letters 287 (1): 31–42. https://doi.org/10.1016/j.epsl.2009.07.031.
Burrows, K., O. Marc, and D. Remy. 2022. Using Sentinel-1 radar amplitude time series to constrain the timings of individual landslides: a step towards understanding the controls on monsoon-triggered landsliding.” Natural Hazards and Earth System Sciences 22 (8): 2637–53. https://doi.org/10.5194/nhess-22-2637-2022.
Carpenter, Bob, Andrew Gelman, Matthew D. Hoffman, Daniel Lee, Ben Goodrich, Michael Betancourt, Marcus Brubaker, Jiqiang Guo, Peter Li, and Allen Riddell. 2017. “Stan: A Probabilistic Programming Language.” Journal of Statistical Software 76 (1): 1–32. https://doi.org/10.18637/jss.v076.i01.
Casagli, Nicola, Emanuele Intrieri, Veronica Tofani, Giovanni Gigli, and Federico Raspini. 2023. “Landslide Detection, Monitoring and Prediction with Remote-Sensing Techniques.” Nature Reviews Earth & Environment 4 (1): 51–64. https://doi.org/10.1038/s43017-022-00373-x.
Castro-Camilo, Daniela, Raphaël Huser, and Håvard Rue. 2022. “Practical Strategies for Generalized Extreme Value-Based Regression Models for Extremes.” Environmetrics 33 (6). https://doi.org/10.1002/env.2742.
Clauset, Aaron, Cosma Rohilla Shalizi, and M E J Newman. 2009. Power-Law Distributions in Empirical Data.” SIAM Review 51 (4): 661–703. https://doi.org/10.1137/070710111.
Dente, E., O. Katz, O. Crouvi, and A. Mushkin. 2023. The Geomorphic Effectiveness of Landslides.” Journal of Geophysical Research: Earth Surface 128 (12): e2023JF007191. https://doi.org/10.1029/2023JF007191.
Domènech, Guillem, Fan Yang, Xiaojun Guo, Xuanmei Fan, Gianvito Scaringi, Lanxin Dai, Chaoyang He, Qiang Xu, and Runqiu Huang. 2018. Two multi-temporal datasets to track the enhanced landsliding after the 2008 Wenchuan earthquake.” https://doi.org/10.5281/zenodo.1484667.
Emberson, R., D. B. Kirschbaum, P. Amatya, H. Tanyas, and O. Marc. 2022. “Insights from the Topographic Characteristics of a Large Global Catalog of Rainfall-Induced Landslide Event Inventories.” Natural Hazards and Earth System Sciences 22 (3): 1129–49. https://doi.org/10.5194/nhess-22-1129-2022.
Fan, Xuanmei, Gianvito Scaringi, Oliver Korup, A. Joshua West, Cees J. van Westen, Hakan Tanyas, Niels Hovius, et al. 2019. Earthquake-Induced Chains of Geologic Hazards: Patterns, Mechanisms, and Impacts.” Reviews of Geophysics 57 (2): 421–503. https://doi.org/10.1029/2018RG000626.
Franceschini, Rachele, Ascanio Rosi, Filippo Catani, and Nicola Casagli. 2022. Exploring a landslide inventory created by automated web data mining: the case of Italy.” Landslides 19 (4): 841–53. https://doi.org/10.1007/s10346-021-01799-y.
Frattini, Paolo, and Giovanni B. Crosta. 2013. “The Role of Material Properties and Landscape Morphology on Landslide Size Distributions.” Earth and Planetary Science Letters 361: 310–19. https://doi.org/https://doi.org/10.1016/j.epsl.2012.10.029.
Fusco, Francesco, Rita Tufano, Pantaleone De Vita, Diego Di Martire, Mariano Di Napoli, Luigi Guerriero, Florindo Antonio Mileti, Fabio Terribile, and Domenico Calcaterra. 2023. A revised landslide inventory of the Campania region (Italy).” Scientific Data 10 (1): 355. https://doi.org/10.1038/s41597-023-02155-6.
Gilham, Jamie, John Barlow, and Roger Moore. 2018. Marine control over negative power law scaling of mass wasting events in chalk sea cliffs with implications for future recession under the UKCP09 medium emission scenario.” Earth Surface Processes and Landforms 43 (10): 2136–46. https://doi.org/10.1002/esp.4379.
Gorum, Tolga, Oliver Korup, Cees J. van Westen, Mark van der Meijde, Chong Xu, and Freek D. van der Meer. 2014. Why so few? Landslides triggered by the 2002 Denali earthquake, Alaska.” Quaternary Science Reviews 95: 80–94. https://doi.org/10.1016/j.quascirev.2014.04.032.
Guzzetti, Fausto, Alessandro Cesare Mondini, Mauro Cardinali, Federica Fiorucci, Michele Santangelo, and Kang-Tsung Chang. 2012. Landslide inventory maps: New tools for an old problem.” Earth-Science Reviews 112 (1): 42–66. https://doi.org/10.1016/j.earscirev.2012.02.001.
Hao, L., Rajaneesh A., C. van Westen, Sajinkumar K. S., T. R. Martha, P. Jaiswal, and B. G. McAdoo. 2020. Constructing a complete landslide inventory dataset for the 2018 monsoon disaster in Kerala, India, for land use change analysis.” Earth System Science Data 12 (4): 2899–2918. https://doi.org/10.5194/essd-12-2899-2020.
Harp, Edwin L., Raymond C. Wilson, and Gerald F. Wieczorek. 1981. Landslides from the February 4, 1976, Guatemala earthquake.” Professional Paper 1204-A. Professional Paper. U.S. Geological Survey. https://doi.org/10.3133/pp1204A.
Hergarten, S. 2023. The concept of event-size-dependent exhaustion and its application to paraglacial rockslides.” Natural Hazards and Earth System Sciences 23 (9): 3051–63. https://doi.org/10.5194/nhess-23-3051-2023.
Hergarten, S., and H. J. Neugebauer. 1998. “Self-Organized Criticality in a Landslide Model.” Geophysical Research Letters 25 (6): 801–4. https://doi.org/10.1029/98GL50419.
Hibert, C, D Michéa, F Provost, J-P Malet, and M Geertsema. 2019. Exploration of continuous seismic recordings with a machine learning approach to document 20 yr of landslide activity in Alaska.” Geophysical Journal International 219 (2): 1138–47. https://doi.org/10.1093/gji/ggz354.
Hu, Kaiheng, Xiaopeng Zhang, Yong You, Xudong Hu, Weiming Liu, and Yong Li. 2019. Landslides and dammed lakes triggered by the 2017 Ms6.9 Milin earthquake in the Tsangpo gorge.” Landslides 16 (5): 993–1001. https://doi.org/10.1007/s10346-019-01168-w.
Jain, Saloni, Rakesh Khosa, and A. K. Gosain. 2022. Impact of landslide size and settings on landslide scaling relationship: a study from the Himalayan regions of India.” Landslides 19 (2): 373–85. https://doi.org/10.1007/s10346-021-01794-3.
Jones, J. N., S. J. Boulton, G. L. Bennett, M. Stokes, and M. R. Z. Whitworth. 2021. Temporal Variations in Landslide Distributions Following Extreme Events: Implications for Landslide Susceptibility Modeling.” Journal of Geophysical Research: Earth Surface 126 (7): e2021JF006067. https://doi.org/10.1029/2021JF006067.
Karakas, Gizem, Hakan A. Nefeslioglu, Sultan Kocaman, Mehmet Buyukdemircioglu, Tekin Yurur, and Candan Gokceoglu. 2021. Derivation of earthquake-induced landslide distribution using aerial photogrammetry: the January 24, 2020, Elazig (Turkey) earthquake.” Landslides 18 (6): 2193–2209. https://doi.org/10.1007/s10346-021-01660-2.
Katz, Richard W, Marc B Parlange, and Philippe Naveau. 2002. “Statistics of Extremes in Hydrology.” Advances in Water Resources 25 (8): 1287–1304. https://doi.org/10.1016/S0309-1708(02)00056-8.
Kim, Jinwoo, Jeffrey A. Coe, Zhong Lu, Nikita N. Avdievitch, and Chad P. Hults. 2022. Spaceborne InSAR mapping of landslides and subsidence in rapidly deglaciating terrain, Glacier Bay National Park and Preserve and vicinity, Alaska and British Columbia.” Remote Sensing of Environment 281: 113231. https://doi.org/10.1016/j.rse.2022.113231.
Korup, Oliver, John J. Clague, Reginald L. Hermanns, Kenneth Hewitt, Alexander L. Strom, and Johannes T. Weidinger. 2007. “Giant Landslides, Topography, and Erosion.” Earth and Planetary Science Letters 261 (3): 578–89. https://doi.org/10.1016/j.epsl.2007.07.025.
Korup, Oliver, Tolga Görüm, and Yuichi Hayakawa. 2012. “Without Power? Landslide Inventories in the Face of Climate Change.” Earth Surface Processes and Landforms 37 (1): 92–99. https://doi.org/10.1002/esp.2248.
Lacroix, Pascal, Alexander L. Handwerger, and Grégory Bièvre. 2020. “Life and Death of Slow-Moving Landslides.” Nature Reviews Earth & Environment 1 (8): 404–19. https://doi.org/10.1038/s43017-020-0072-8.
LaHusen, Sean R., Alison R. Duvall, Adam M. Booth, and David R. Montgomery. 2016. “Surface Roughness Dating of Long-Runout Landslides Near Oso, Washington (USA), Reveals Persistent Postglacial Hillslope Instability.” Geology 44 (2): 111–14. https://doi.org/10.1130/G37267.1.
Larsen, Isaac J., David R. Montgomery, and Oliver Korup. 2010. “Landslide Erosion Controlled by Hillslope Material.” Nature Geoscience 3 (4): 247–51. https://doi.org/10.1038/ngeo776.
Li, Gen K., and Seulgi Moon. 2021. “Topographic Stress Control on Bedrock Landslide Size.” Nature Geoscience 14 (5): 307–13. https://doi.org/10.1038/s41561-021-00739-8.
Li, Gen, A. Joshua West, Alexander L. Densmore, Zhangdong Jin, Robert N. Parker, and Robert G. Hilton. 2014. Seismic mountain building: Landslides associated with the 2008 Wenchuan earthquake in the context of a generalized model for earthquake volume balance.” Geochemistry, Geophysics, Geosystems 15 (4): 833–44. https://doi.org/10.1002/2013GC005067.
Liu, Jia, Yuming Wu, and Xing Gao. 2021. Increase in occurrence of large glacier-related landslides in the high mountains of Asia.” Scientific Reports 11 (1): 1635. https://doi.org/10.1038/s41598-021-81212-9.
Lombardo, Luigi, Haakon Bakka, Hakan Tanyas, Cees van Westen, P. Martin Mai, and Raphaël Huser. 2019. Geostatistical Modeling to Capture Seismic-Shaking Patterns From Earthquake-Induced Landslides.” Journal of Geophysical Research: Earth Surface 124 (7): 1958–80. https://doi.org/10.1029/2019JF005056.
Luetzenburg, G., K. Svennevig, A. A. Bjørk, M. Keiding, and A. Kroon. 2022. A national landslide inventory for Denmark.” Earth System Science Data 14 (7): 3157–65. https://doi.org/10.5194/essd-14-3157-2022.
Luna, L. V., and O. Korup. 2022. Seasonal Landslide Activity Lags Annual Precipitation Pattern in the Pacific Northwest.” Geophysical Research Letters 49 (18): e2022GL098506. https://doi.org/10.1029/2022GL098506.
Malamud, Bruce D., Donald L. Turcotte, Fausto Guzzetti, and Paola Reichenbach. 2004. Landslide inventories and their statistical properties.” Earth Surface Processes and Landforms 29 (6): 687–711. https://doi.org/10.1002/esp.1064.
Marc, O., R. Behling, C. Andermann, J. M. Turowski, L. Illien, S. Roessner, and N. Hovius. 2019. Long-term erosion of the Nepal Himalayas by bedrock landsliding: the role of monsoons, earthquakes and giant landslides.” Earth Surface Dynamics 7 (1): 107–28. https://doi.org/10.5194/esurf-7-107-2019.
Marc, O., and N. Hovius. 2015. “Amalgamation in Landslide Maps: Effects and Automatic Detection.” Natural Hazards and Earth System Sciences 15 (4): 723–33. https://doi.org/10.5194/nhess-15-723-2015.
McColl, S. T., and S. J. Cook. 2024. “A Universal Size Classification System for Landslides.” Landslides 21 (1): 111–20. https://doi.org/10.1007/s10346-023-02131-6.
Medwedeff, William G., Marin K. Clark, Dimitrios Zekkos, and A. Joshua West. 2020. “Characteristic Landslide Distributions: An Investigation of Landscape Controls on Landslide Size.” Earth and Planetary Science Letters 539: 116203. https://doi.org/10.1016/j.epsl.2020.116203.
Meunier, Patrick, Taro Uchida, and Niels Hovius. 2013. “Landslide Patterns Reveal the Sources of Large Earthquakes.” Earth and Planetary Science Letters 363: 27–33. https://doi.org/10.1016/j.epsl.2012.12.018.
Milledge, David G., Dino G. Bellugi, Jack Watt, and Alexander L. Densmore. 2022. “Automated Determination of Landslide Locations After Large Trigger Events: Advantages and Disadvantages Compared to Manual Mapping.” Natural Hazards and Earth System Sciences 22 (2): 481–508. https://doi.org/10.5194/nhess-22-481-2022.
Muñoz-Torrero, Alberto. 2020. Multi-temporal Landslide Inventory for the Far- Western region of Nepal.” Zenodo. https://doi.org/10.5281/zenodo.4290100.
Pánek, Tomáš, Oliver Korup, Jozef Minár, and Jan Hradecký. 2016. Giant landslides and highstands of the Caspian Sea.” Geology 44 (11): 939–42. https://doi.org/10.1130/G38259.1.
Roback, Kevin, Marin K. Clark, A. Joshua West, Dimitrios Zekkos, Gen Li, Sean F. Gallen, Deepak Chamlagain, and Jonathan W. Godt. 2018. The size, distribution, and mobility of landslides caused by the 2015 Mw7.8 Gorkha earthquake, Nepal.” Geomorphology 301: 121–38. https://doi.org/10.1016/j.geomorph.2017.01.030.
Safran, EB, SW Anderson, M Mills-Novoa, PK House, and L Ely. 2011. Controls on large landslide distribution and implications for the geomorphic evolution of the southern interior Columbia River basin.” Geological Society of America Bulletin 123 (9-10): 1851–62. https://doi.org/10.1130/B30061.1.
Saito, H., O. Korup, T. Uchida, S. Hayashi, and T. Oguchi. 2014. Rainfall conditions, typhoon frequency, and contemporary landslide erosion in Japan.” Geology 42 (11): 999–1002. https://doi.org/10.1130/G35680.1.
Santangelo, M., O. Althuwaynee, M. Alvioli, F. Ardizzone, C. Bianchi, T. Bornaetxea, M. T. Brunetti, et al. 2023. Inventory of landslides triggered by an extreme rainfall event in Marche-Umbria, Italy, on 15 September 2022.” Scientific Data 10 (1): 427. https://doi.org/10.1038/s41597-023-02336-3.
Schönfeldt, Elisabeth, Diego Winocur, Tomáš Pánek, and Oliver Korup. 2022. Deep learning reveals one of Earth’s largest landslide terrain in Patagonia.” Earth and Planetary Science Letters 593: 117642. https://doi.org/10.1016/j.epsl.2022.117642.
Sepúlveda, Sergio A., Alejandra Serey, Marisol Lara, Andrés Pavez, and Sofı́a Rebolledo. 2010. Landslides induced by the April 2007 Aysén Fjord earthquake, Chilean Patagonia.” Landslides 7 (4): 483–92. https://doi.org/10.1007/s10346-010-0203-2.
Smith, William D., Stuart A. Dunning, Neil Ross, Jon Telling, Erin K. Jensen, Dan H. Shugar, Jeffrey A. Coe, and Marten Geertsema. 2023. Revising supraglacial rock avalanche magnitudes and frequencies in Glacier Bay National Park, Alaska.” Geomorphology 425: 108591. https://doi.org/10.1016/j.geomorph.2023.108591.
Song, Chuang, Chen Yu, Zhenhong Li, Stefano Utili, Paolo Frattini, Giovanni Crosta, and Jianbing Peng. 2022. Triggering and recovery of earthquake accelerated landslides in Central Italy revealed by satellite radar observations.” Nature Communications 13 (1): 7278. https://doi.org/10.1038/s41467-022-35035-5.
Tanyaş, Hakan, Tolga Görüm, Islam Fadel, Cengiz Yıldırım, and Luigi Lombardo. 2022. An open dataset for landslides triggered by the 2016 Mw 7.8 Kaikōura earthquake, New Zealand.” Landslides 19 (6): 1405–20. https://doi.org/10.1007/s10346-022-01869-9.
Tanyaş, Hakan, Kevin Hill, Luke Mahoney, Islam Fadel, and Luigi Lombardo. 2022. The world’s second-largest, recorded landslide event: Lessons learnt from the landslides triggered during and after the 2018 Mw 7.5 Papua New Guinea earthquake.” Engineering Geology 297: 106504. https://doi.org/10.1016/j.enggeo.2021.106504.
Tanyaş, Hakan, Cees J. van Westen, Kate E. Allstadt, M. Anna Nowicki Jessee, Tolga Görüm, Randall W. Jibson, Jonathan W. Godt, et al. 2017. “Presentation and Analysis of a Worldwide Database of Earthquake-Induced Landslide Inventories.” Journal of Geophysical Research: Earth Surface 122 (10): 1991–2015. https://doi.org/10.1002/2017JF004236.
Tanyaş, Hakan, Cees J. van Westen, Kate E. Allstadt, and Randall W. Jibson. 2019. Factors controlling landslide frequency–area distributions.” Earth Surface Processes and Landforms 44 (4): 900–917. https://doi.org/10.1002/esp.4543.
Tebbens, S. F. 2020. Landslide Scaling: A Review.” Earth and Space Science 7 (1): e2019EA000662. https://doi.org/https://doi.org/10.1029/2019EA000662.
Valagussa, A., P. Frattini, E. Valbuzzi, and G. B. Crosta. 2021. Role of landslides on the volume balance of the Nepal 2015 earthquake sequence.” Scientific Reports 11 (1): 3434. https://doi.org/10.1038/s41598-021-83037-y.
Valagussa, A., O. Marc, P. Frattini, and G. B. Crosta. 2019. “Seismic and Geological Controls on Earthquake-Induced Landslide Size.” Earth and Planetary Science Letters 506: 268–81. https://doi.org/10.1016/j.epsl.2018.11.005.
Van Den Eeckhaut, M., J. Poesen, G. Verstraeten, V. Vanacker, J. Moeyersons, J. Nyssen, and L. P. H. van Beek. 2005. “The Effectiveness of Hillshade Maps and Expert Knowledge in Mapping Old Deep-Seated Landslides.” Geomorphology 67 (3): 351–63. https://doi.org/10.1016/j.geomorph.2004.11.001.
Xu, Chong, Xiwei Xu, Xin Yao, and Fuchu Dai. 2014. Three (nearly) complete inventories of landslides triggered by the May 12, 2008 Wenchuan Mw 7.9 earthquake of China and their spatial distribution statistical analysis.” Landslides 11 (3): 441–61. https://doi.org/10.1007/s10346-013-0404-6.
Xu, Yueren, Mark B. Allen, Weiheng Zhang, Wenqiao Li, and Honglin He. 2020. Landslide characteristics in the Loess Plateau, northern China.” Geomorphology 359: 107150. https://doi.org/10.1016/j.geomorph.2020.107150.
Zhao, Bo, Weile Li, Yunsheng Wang, Jiayan Lu, and Xiang Li. 2019. Landslides triggered by the Ms 6.9 Nyingchi earthquake, China (18 November 2017): analysis of the spatial distribution and occurrence factors.” Landslides 16 (4): 765–76. https://doi.org/10.1007/s10346-019-01146-2.

  1. Institute of Environmental Sciences and Geography, Institute of Geosciences, University of Potsdam↩︎

  2. Institute of Environmental Sciences and Geography, University of Potsdam; Potsdam Institute for Climate Impact Research PIK↩︎

  3. Institute of Environmental Sciences and Geography, University of Potsdam↩︎

LS0tCnRpdGxlOiAiU2l6ZSBzY2FsaW5nIG9mIGxhcmdlIGxhbmRzbGlkZXMgZnJvbSBpbmNvbXBsZXRlIGludmVudG9yaWVzIgphdXRob3I6IAogIC0gT2xpdmVyIEtvcnVwXltJbnN0aXR1dGUgb2YgRW52aXJvbm1lbnRhbCBTY2llbmNlcyBhbmQgR2VvZ3JhcGh5LCBJbnN0aXR1dGUgb2YgR2Vvc2NpZW5jZXMsIFVuaXZlcnNpdHkgb2YgUG90c2RhbV0KICAtIEpvYXF1aW4gRmVycmVyXltJbnN0aXR1dGUgb2YgRW52aXJvbm1lbnRhbCBTY2llbmNlcyBhbmQgR2VvZ3JhcGh5LCBVbml2ZXJzaXR5IG9mIFBvdHNkYW07IFBvdHNkYW0gSW5zdGl0dXRlIGZvciBDbGltYXRlIEltcGFjdCBSZXNlYXJjaCBQSUtdCiAgLSBMaXNhIEx1bmFeW0luc3RpdHV0ZSBvZiBFbnZpcm9ubWVudGFsIFNjaWVuY2VzIGFuZCBHZW9ncmFwaHksIFVuaXZlcnNpdHkgb2YgUG90c2RhbV0KZGF0ZTogIjIwIFNlcHRlbWJlciAyMDI0IgpvdXRwdXQ6CiAgaHRtbF9ub3RlYm9vazoKICAgIHRoZW1lOiBjb3NtbwogICAgdG9jOiB0cnVlCiAgICB0b2NfZmxvYXQ6IHRydWUKICAgIGZpZ19jYXB0aW9uOiB0cnVlCiAgICBudW1iZXJfc2VjdGlvbnM6IHRydWUKICBodG1sX2RvY3VtZW50OgogICAgdGhlbWU6IGNvc21vCiAgICB0b2M6IHRydWUKICAgIHRvY19mbG9hdDogdHJ1ZQogIHdvcmRfZG9jdW1lbnQ6CiAgICB0b2M6IHRydWUKICBwZGZfZG9jdW1lbnQ6CiAgICBrZWVwX3RleDogdHJ1ZQogICAgbGF0ZXhfZW5naW5lOiB4ZWxhdGV4CmJpYmxpb2dyYXBoeTogZ3BhcmV0b19tdWx0aWxldmVsX2ludmVudG9yaWVzX3JlZmVyZW5jZXMuYmliCiNjc2w6ICJnZW9waHlzaWNhbC1yZXNlYXJjaC1sZXR0ZXJzLmNzbCIKbm9jaXRlOiB8CiAgQEFudGluYW86MjAwOWFhLCBAZXNzZC0xNS03NTMtMjAyMywgQEJhc2hhcmF0OjIwMTRhYSwgQEJlaGxpbmc6MjAxNmFhLCBAZG9tZW5lY2gsIEBIYXJwOjE5ODFhYSwgQEh1OjIwMTlhYSwgQEpvbmVzOjIwMjFhYSwgQEthcmFrYXM6MjAyMWFhLCBAS2ltOjIwMjJhYSwgQExpdToyMDIxYWEsIEBlc3VyZi03LTEwNy0yMDE5LCBAUm9iYWNrOjIwMThhYSwgQFNlcHVsdmVkYToyMDEwYWEsIEBUYW55YXM6MjAyMmFhLCBAVGFueWFzOjIwMjJhYiwgQHVzZ3Nfd2xjLCBAVmFsYWd1c3NhOjIwMjFhYSwgQFpoYW86MjAxOWFhCmZvbnRzaXplOiAxMnB0Ci0tLQoKTm90ZTogVGhpcyBmaWxlIGNvbnRhaW5zIHN1cHBsZW1lbnRhcnkgaW5mb3JtYXRpb24gdGhhdCBoaWdobGlnaHRzIHRoZSBvdmVyYWxsIGRhdGEgYW5hbHlzaXMgaW4gX19SX18gY29kZS4gQWx0aG91Z2ggdGhlIGFjY29tcGFueWluZyB0ZXh0IGhlcmUgaXMgbW9zdGx5IHRoZSBzYW1lIGFzIGluIHRoZSBhY2NvbXBhbnlpbmcgcGFwZXIgZm9yIGlsbHVzdHJhdGl2ZSBwdXJwb3NlcywgeW91IHNob3VsZCByZWZlciB0byB0aGUgZmluYWwsIHBlZXItcmV2aWV3ZWQgcGFwZXIgZm9yIGNpdGF0aW9ucy4gWW91IGNhbiBjbGljayBvbiB0aGUgX19Db2RlX18gYnV0dG9uIGluIHRoZSB1cHBlciByaWdodCBvZiB0aGlzIGZpbGUgdG8gZG93bmxvYWQgaXRzICouUm1kIHZlcnNpb24uCgpfX0xhbmRzbGlkZSBpbnZlbnRvcmllcyBoYXZlIGJlY29tZSBjb3JuZXJzdG9uZXMgZm9yIGVzdGltYXRpbmcgdGhlIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIHRoZSBmcmVxdWVuY3kgYW5kIHNpemUgb2Ygc2xvcGUgZmFpbHVyZXMsIHRodXMgaW5mb3JtaW5nIGFwcHJhaXNhbHMgb2YgaGlsbHNsb3BlIHN0YWJpbGl0eSwgZXJvc2lvbiwgYW5kIGNvbW1lbnN1cmF0ZSBoYXphcmQuIE51bWVyb3VzIHN0dWRpZXMgaGF2ZSByZXBvcnRlZCBob3cgbGFyZ2VyIGxhbmRzbGlkZXMgYXJlIHN5c3RlbWF0aWNhbGx5IHJhcmVyIHRoYW4gc21hbGxlciBvbmVzLCBkcmF3aW5nIG9uIHByb2JhYmlsaXR5IGRpc3RyaWJ1dGlvbnMgZml0dGVkIHRvIG1hcHBlZCBsYW5kc2xpZGUgYXJlYXMgb3Igdm9sdW1lcy4gSW4gdGhlc2UgbW9kZWxzLCBtdWNoIHVuY2VydGFpbnR5IGNvbmNlcm5zIHRoZSBsYXJnZXIgbGFuZHNsaWRlcyAoZGVmaW5lZCBoZXJlIGFzIGFmZmVjdGluZyA+MC4xIGttXjJeKSB0aGF0IGFyZSByYXJlbHkgc2FtcGxlZCwgYW5kIG9mdGVuIHByb2plY3RlZCBieSBleHRyYXBvbGF0aW5nIGJleW9uZCB0aGUgb2JzZXJ2ZWQgc2l6ZSByYW5nZSBpbiBhIGdpdmVuIHN0dWR5IGFyZWEuIFJlbHlpbmcgaW5zdGVhZCBvbiBzaXplLXNjYWxpbmcgZXN0aW1hdGVzIGZyb20gb3RoZXIgaW52ZW50b3JpZXMgaXMgcHJvYmxlbWF0aWMgYmVjYXVzZSBsYW5kc2xpZGUgZGV0ZWN0aW9uIGFuZCBtYXBwaW5nLCBkYXRhIHF1YWxpdHksIHJlc29sdXRpb24sIHNhbXBsZSBzaXplLCBtb2RlbCBjaG9pY2UsIGFuZCBmaXR0aW5nIG1ldGhvZCBjYW4gdmFyeS4gVG8gb3ZlcmNvbWUgdGhlc2UgY29uc3RyYWludHMsIHdlIGVtcGxveSBhIEJheWVzaWFuIG11bHRpLWxldmVsIG1vZGVsIHdpdGggYSBHZW5lcmFsaXNlZCBQYXJldG8gbGlrZWxpaG9vZCB0aGF0IHByb3ZpZGVzIGEgc2luZ2xlLCBvYmplY3RpdmUsIGFuZCBjb25zaXN0ZW50IGNvbXBhcmlzb24gZ3JvdW5kZWQgaW4gZXh0cmVtZS12YWx1ZSB0aGVvcnkuIFdlIGV4cGxvcmUgd2hldGhlciBhbmQgaG93IHNjYWxpbmcgcGFyYW1ldGVycyB2YXJ5IGJldHdlZW4gMzcgaW52ZW50b3JpZXMgdGhhdCwgYWx0aG91Z2ggaW5jb21wbGV0ZSwgYnJpbmcgdG9nZXRoZXIgODYyNyBsYXJnZSBsYW5kc2xpZGVzLiBEZXNwaXRlIHRoZSBicm9hZCByYW5nZSBvZiBtYXBwaW5nIHByb3RvY29scyBhbmQgbGVuZ3RocyBvZiByZWNvcmQsIGFuZCBkaWZmZXJpbmcgdG9wb2dyYXBoaWMsIGdlb2xvZ2ljYWwsIGFuZCBjbGltYXRpYyBzZXR0aW5ncywgdGhlIHBvc3RlcmlvciBwb3dlci1sYXcgc2NhbGluZyBleHBvbmVudHMgcmVtYWluIGluZGlzdGluZ3Vpc2hhYmxlIGJldHdlZW4gbW9zdCBpbnZlbnRvcmllcy4gTGlrZXdpc2UsIHRoZSBzY2FsaW5nIHN0YXRpc3RpY3MgZmFpbCB0byBzZXBhcmF0ZSBrbm93biBlYXJ0aHF1YWtlIGZyb20gcmFpbmZhbGwgdHJpZ2dlcnMsIGFuZCBldmVudC1iYXNlZCBmcm9tIG11bHRpLXRlbXBvcmFsIGNhdGFsb2d1ZXMuIEluc3RlYWQsIG91ciBtb2RlbCBpZGVudGlmaWVzIHNldmVyYWwgaW52ZW50b3JpZXMgd2l0aCBvdXRsaWVyIHNjYWxpbmcgc3RhdGlzdGljcyB0aGF0IHJlZmxlY3QgaW50ZW50aW9uYWwgY2Vuc29yaW5nIGR1cmluZyBtYXBwaW5nLiBPdXIgcmVzdWx0cyB0aHVzIGNhdXRpb24gYWdhaW5zdCBhIHVuaXZlcnNhbCBvciBzb2xlbHkgbWVjaGFuaXN0aWMgaW50ZXJwcmV0YXRpb24gb2YgdGhlIHNjYWxpbmcgcGFyYW1ldGVycywgYXQgbGVhc3QgaW4gdGhlIGNvbnRleHQgb2YgbGFyZ2UgbGFuZHNsaWRlcy5fXwoKCiMgSW50cm9kdWN0aW9uCgpLZWVwaW5nIHJlY29yZHMgb2YgdGhlIHNpemUgYW5kIGZyZXF1ZW5jeSBvZiBsYW5kc2xpZGVzIGlzIGtleSB0byBlc3RpbWF0ZSByYXRlcyBvZiBlcm9zaW9uLCBnZW9tb3JwaGljIHdvcmssIGFuZCBoaWxsc2xvcGUgZXZvbHV0aW9uIFtARGVudGU6MjAyM2FhO0BTYWl0bzoyMDE0YWE7QGVzdXJmLTctMTA3LTIwMTldOyBpbmZlciBtYXRlcmlhbCBzdHJlbmd0aCBhbmQgd2VhdGhlcmluZyBvZiBoaWxsc2xvcGVzIFtATGk6MjAyMWFhOyBAQWxiZXJ0aToyMDIyYWFdOyBhbmQgaW5mb3JtIGhhemFyZCBhcHByYWlzYWxzIG9mIHNsb3BlIGluc3RhYmlsaXR5IFtAR3V6emV0dGk6MjAxMmFhXSwgcGFydGljdWxhcmx5IGluIHJlc3BvbnNlIHRvIGNvbnRlbXBvcmFyeSBjbGltYXRlIGNoYW5nZSBbQFNNSVRIMjAyMzEwODU5MV0uIEEgcG9wdWxhciB3YXkgdG8gY2hhcmFjdGVyaXNlIHRoZSByZWxhdGl2ZSBmcmVxdWVuY3kgb2YgbGFuZHNsaWRlLWFmZmVjdGVkIGFyZWFzIG9yIHZvbHVtZXMgaXMgdG8gZml0IHByb2JhYmlsaXR5IGRpc3RyaWJ1dGlvbnMgdG8gc2l6ZSBkYXRhIGNvbXBpbGVkIGluIGludmVudG9yaWVzIFtATWFsYW11ZDoyMDA0YWFdLiBUaGVzZSBjYXRhbG9ndWVzIGNvbnRhaW4gbG9jYXRpb25zIGFuZCBnZW9tZXRyaWVzIG9mIGluZGl2aWR1YWwgZm9vdHByaW50IGFyZWFzIG1hcHBlZCBsYXJnZWx5IGZyb20gYWlyIHBob3RvcyBvciBzYXRlbGxpdGUgaW1hZ2VzLiBUaGUgY2hvaWNlIG9mIHByb2JhYmlsaXR5IGRpc3RyaWJ1dGlvbiAob3IgInNjYWxpbmcgbGF3cyIpIGhhcyBmYXZvdXJlZCB0aGUgaW52ZXJzZSBwb3dlci1sYXcgb3IgUGFyZXRvLCB0aGUgaW52ZXJzZSBnYW1tYSwgb3IgdGhlIGxvZ25vcm1hbCBkaXN0cmlidXRpb25zIFtAaHR0cHM6Ly9kb2kub3JnLzEwLjEwMjkvMjAxOUVBMDAwNjYyXSwgb3IgY29tYmluYXRpb25zIHRoZXJlb2YgW0BKYWluOjIwMjJhYV0uIEFsbCB0aGVzZSBkaXN0cmlidXRpb25zIGFyZSBza2V3ZWQsIG9mdGVuIGhlYXZ5LXRhaWxlZCwgYW5kIGNhcHR1cmUgdGhlIHdpZGVzcHJlYWQgb2JzZXJ2YXRpb24gdGhhdCBsYXJnZXIgbGFuZHNsaWRlcyBhcmUgc3lzdGVtYXRpY2FsbHkgcmFyZXIgdGhhbiBzbWFsbGVyIG9uZXMuCgpSZXBvcnRlZCB2YWx1ZXMgb2YgdGhlIHBhcmFtZXRlcnMgdGhhdCBkZWZpbmUgdGhlc2UgZGlzdHJpYnV0aW9ucyBoYXZlIHNlZW1pbmdseSBuYXJyb3cgbnVtZXJpY2FsIHJhbmdlcyBbQGh0dHBzOi8vZG9pLm9yZy8xMC4xMDI5LzIwMTlFQTAwMDY2Ml0uIFRoaXMgc2ltaWxhcml0eSBhbW9uZyBtb2RlbCBmaXRzIGhhcyBsZWQgdG8gYSBsaXZlbHkgZGlzY3Vzc2lvbiBhYm91dCB3aGV0aGVyIHRoZXNlIHBhcmFtZXRlcnMgcmVmbGVjdCBnZW5lcmljIGdlb21ldHJpYyBvciBtZWNoYW5pc3RpYyBwcm9wZXJ0aWVzIG9mIGxhbmRzbGlkZXMgb3IgdGhlIGhpbGxzbG9wZXMgdGhhdCB0aGV5IG9jY3VyIG9uIFtAQmVsbHVnaTIwMjFDb250cm9sc09UOyBAZXN1cmYtOS0xMDEzLTIwMjFdLiBGb3IgZXhhbXBsZSwgcGh5c2ljYWwgaW50ZXJwcmV0YXRpb25zIG9mIHRoZSAicm9sbC1vdmVyIiB0aGF0IG1hcmtzIHRoZSBsb3dlciBib3VuZCBvZiBpbnZlcnNlIHBvd2VyLWxhdyBkaXN0cmlidXRpb25zIGluY2x1ZGUgdGhhdCBvZiBhIGhpbGxzbG9wZSBsZW5ndGggc2NhbGUgdGhhdCBpcyBzdXNjZXB0aWJsZSB0byBmYWlsdXJlLCBvciB0aGUgY29oZXNpdmUgc3RyZW5ndGggb2YgZmFpbHVyZSBwbGFuZXMgW0BodHRwczovL2RvaS5vcmcvMTAuMTAyOS8yMDE5RUEwMDA2NjJdLiBXaGlsZSBsYW5kc2xpZGUgc2l6ZSBkaXN0cmlidXRpb25zIG1heSByZWZsZWN0IHRoZSBuYXR1cmUgYW5kIHNwYXRpYWwgaW50ZW5zaXR5IG9mIGEgY29tbW9uIHRyaWdnZXIgc3VjaCBhcyBhIHN0cm9uZyBlYXJ0aHF1YWtlIFtAVkFMQUdVU1NBMjAxOTI2OF0sIHRoZSBhdmVyYWdlIGxhbmRzbGlkZSBzaXplIG1heSBjb250YWluIGluZm9ybWF0aW9uIGFib3V0IGJvdGggY29oZXNpdmUgc3RyZW5ndGggb2Ygc2xvcGUgbWF0ZXJpYWwgYW5kIGhpbGxzbG9wZSByZWxpZWYgW0BNZWR3ZWRlZmY6MjAyMGFhXS4gU29tZSBvZiB0aGVzZSBwaHlzaWNhbCBpbnRlcnByZXRhdGlvbnMgYXJlIGJhY2tlZCBieSwgb3IgZGVyaXZlZCBmcm9tLCBudW1lcmljYWwgc2ltdWxhdGlvbnMgb2Ygc2xvcGUgaW5zdGFiaWxpdHkgW0BGUkFUVElOSTIwMTMzMTBdLiBZZXQsIGEgZGlmZmVyZW50IGxpbmUgb2YgYXJndW1lbnRzIHByb3Bvc2VkIHRoYXQgdGhlIHJvbGwtb3ZlciBpcyBhIHN0YXRpc3RpY2FsIGFydGVmYWN0IG9mIGxhbmRzbGlkZSBkZXRlY3Rpb24gYW5kIG1hcHBpbmcsIGFwcHJveGltYXRlbHkgbWFya2luZyB0aGUgc21hbGxlc3QgZGlzY2VybmlibGUgbGFuZHNsaWRlIGluIGEgZ2l2ZW4gc3R1ZHkgYXJlYSBbQGh0dHBzOi8vZG9pLm9yZy8xMC4xMDI5LzIwMTlFQTAwMDY2Ml0uIEVpdGhlciB3YXksIHRoaXMgZGlzY3Vzc2lvbiBoYXMgcXVlc3Rpb25lZCB3aGV0aGVyIHRoZXNlIHNjYWxpbmcgbGF3cyBhcmUgdW5pdmVyc2FsbHkgYXBwbGljYWJsZSB0byBsYW5kc2xpZGVzIGlycmVzcGVjdGl2ZSBvZiBlbnZpcm9ubWVudGFsIHNldHRpbmcsIG1hcHBpbmcgbWV0aG9kcywgYW5kIHRyaWdnZXIgbWVjaGFuaXNtcyBbQE1hbGFtdWQ6MjAwNGFhOyBAVGFueWFzOjIwMTlhYV0uIE1hbnkgb2YgdGhlc2UgaW50ZXJwcmV0YXRpb25zIGhhdmUgcmVsaWVkIG9uIHRoZSBkaXJlY3QgY29tcGFyaXNvbiBvZiByZXBvcnRlZCBwYXJhbWV0ZXIgdmFsdWVzLCBhbmQgc2NydXRpbnkgY29uY2VybmluZyBwb3NzaWJsZSBlZmZlY3RzIG9mIGRhdGEgc291cmNlcyBhbmQgcXVhbGl0eSwgbWFwcGluZyBtZXRob2QsIGFuZCBzdGF0aXN0aWNhbCBlcnJvcnMgb2YgdGhlIGZpdHRlZCBtb2RlbHMgaGFzIGluY3JlYXNlZCBpbiBtb3JlIHJlY2VudCB3b3JrIFtAQmVsbHVnaTIwMjFDb250cm9sc09UXS4KClN0aWxsLCBtb3N0IHVuY2VydGFpbnR5IHJlbWFpbnMgYWJvdXQgdGhlIGxhcmdlIGxhbmRzbGlkZXMgdGhhdCBhcmUgcmFyZWx5IHNhbXBsZWQgbmF0dXJhbGx5LiBIZW5jZSwgdGhlIGJ1bGsgb2Ygc3R1ZGllcyBvbiBsYW5kc2xpZGUgc2l6ZSBoYXMgZGlzY2xvc2VkIGxpdHRsZSBhYm91dCB0aGVzZSBsYXJnZSBsYW5kc2xpZGVzLCBsZXQgYWxvbmUgdGhlaXIgcHJlZGljdGlvbiBhcyBmaXJzdC10aW1lIGZhaWx1cmVzIFtAaHR0cHM6Ly9kb2kub3JnLzEwLjEwMjkvMjAxOFJHMDAwNjI2XS4gT25lIHJlYXNvbiBmb3IgdGhpcyBrbm93bGVkZ2UgZ2FwIGlzIHRoYXQgbGFyZ2UgbGFuZHNsaWRlcyBhcmUgb2Z0ZW4gZWx1c2l2ZSBpbiBjYXRhbG9ndWVzIGNvbXBpbGVkIHNob3J0bHkgYWZ0ZXIgYSBsYW5kc2xpZGUtdHJpZ2dlcmluZyBlYXJ0aHF1YWtlIG9yIHJhaW5zdG9ybSBbQGVzc2QtMTItMjg5OS0yMDIwOyBAbmhlc3MtMjEtMTUzMS0yMDIxOyBAU2FudGFuZ2VsbzoyMDIzYWFdLiBTYW1wbGUgc2l6ZXMgb2Z0ZW4gaW52b2x2ZSBvbmx5IGEgaGFuZGZ1bCB0byBzZXZlcmFsIGRvemVuIGxhcmdlIGxhbmRzbGlkZXMsIGFuZCB0aHVzIG9mdGVuIHJlbWFpbiB0b28gc21hbGwgZm9yIHJvYnVzdCBzdGF0aXN0aWNzIGluIGEgZ2l2ZW4gc3R1ZHkgYXJlYS4gSGVuY2UsIGluZmVyZW5jZSBpcyBtb3N0bHkgYmFzZWQgb24gdGhlIHNpbXBsZSBleHRyYXBvbGF0aW9uIG9mIG1vZGVsIGZpdHMgYmV5b25kIHRoZSBvYnNlcnZlZCBzaXplIHJhbmdlLiBZZXQsIGxhcmdlIGxhbmRzbGlkZXMgbWF5IG9mdGVuIHJlLXNoYXBlIGhpbGxzbG9wZSBnZW9tZXRyeSBhbmQgZG9taW5hdGUgZXJvc2lvbiBbQEtvcnVwOjIwMDdhYTtAZXN1cmYtNy0xMDctMjAxOV0sIGJ1dCBtYXkgaW52b2x2ZSBwaGFzZXMgb2YgY3JlZXAgbW90aW9uLCBhbmQgcmVzcG9uZCBkaWZmZXJlbnRseSB0byB0cmlnZ2VyaW5nIGNvbmRpdGlvbnMgdGhhbiBzbWFsbGVyIGZhaWx1cmVzIGJlY2F1c2Ugb2YgYSBsb25nZXIgYW5kIG1vcmUgY29tcGxleCBzbG9wZSBoaXN0b3J5IG9mIGFjY3VtdWxhdGVkIHN0cmVzcyBhbmQgc3RyYWluIFtATGFjcm9peDoyMDIwYWFdLgoKSW4gZ2VuZXJhbCwgdGhlIHN0YXRpc3RpY3Mgb2YgbGFuZHNsaWRlcyBhcmUgZGVyaXZlZCBmcm9tIGEgc2VxdWVuY2Ugb2YgZGV0ZWN0aW9uLCBtYXBwaW5nLCBhbmQgc3RhdGlzdGljYWwgaW5mZXJlbmNlIChGaWcuIDEpLiBVbmNlcnRhaW50aWVzIHRoYXQgcHJvcGFnYXRlIHRocm91Z2hvdXQgZWFjaCBzdGVwIGNhbiBhZmZlY3QgdGhlIG91dGNvbWUgaW4gdGVybXMgb2YgbGFuZHNsaWRlIHNjYWxpbmcgc3RhdGlzdGljcy4KCiFbTGFuZHNsaWRlIHNjYWxpbmcgc3RhdGlzdGljcyByZWx5IG9uIGFjY3VyYXRlIGRldGVjdGlvbiwgbWFwcGluZywgYW5kIHN0YXRpc3RpY2FsIGluZmVyZW5jZS4gVGhlc2UgdGhyZWUgKGNvbG91ci1jb2RlZCkgc3RlcHMgYXJlIHByb25lIHRvIGEgbnVtYmVyIG9mIHVuY2VydGFpbnRpZXMgdGhhdCBtYXkgcHJvcGFnYXRlIGFzIGVycm9ycyBpbnRvIHRoZSBkZXJpdmVkIGxhbmRzbGlkZSBzdGF0aXN0aWNzLiBCb3hlcyB3aXRoIGJsYWNrIG91dGxpbmUgYXJlIG1vc3QgbGlrZWx5IGRpcmVjdGx5IHRpZWQgdG8gcGh5c2ljYWwgcHJvY2Vzc2VzIG9mIGxhbmRzbGlkaW5nLl0obHNfc3RhdHNfc2NoZW1hdGljLnBuZyl7aGVpZ2h0PTM1MHB4fQoKXAoKQXQgdGhlIGxldmVsIG9mIHRoZSBpbnB1dCBkYXRhLCBib3RoIGxhbmRzbGlkZSBkZXRlY3Rpb24gYW5kIG1hcHBpbmcgZmFjZSBzZXZlcmFsIGNvbnN0cmFpbnRzLiBUaGUgbWFwcGluZyBvYmplY3RpdmUgY2FuIGRpY3RhdGUgd2hldGhlciB0byBmb2N1cyBvbiBsYW5kc2xpZGVzIGF0dHJpYnV0ZWQgdG8gYSBzaW5nbGUgdHJpZ2dlciBzdWNoIGFzIGEgc3Ryb25nIGVhcnRocXVha2UgW0BNZXVuaWVyOjIwMTNhYTsgQEdvcnVtOjIwMTRhYTtAdGFueWFzX3ByZXNlbnRhdGlvbl8yMDE3O0BMb21iYXJkbzoyMDE5YWFdLCBhIHJhaW5zdG9ybSBbQG5oZXNzLTIxLTE1MzEtMjAyMTsgQGVzc2QtMTItMjg5OS0yMDIwO0BlbWJlcnNvbl9pbnNpZ2h0c18yMDIyO0BTYW50YW5nZWxvOjIwMjNhYV0sIG9yIGluc3RlYWQgdG8gY29tcGlsZSBsYW5kc2xpZGUgdHJhY2VzIHRoYXQgaGF2ZSBhY2N1bXVsYXRlZCBvdmVyIHllYXJzIHRvIG1pbGxlbm5pYSBbQGxhaHVzZW5fc3VyZmFjZV8yMDE2O0Blc3NkLTE0LTMxNTctMjAyMjsgQEZ1c2NvOjIwMjNhYTsgQDEwLjExMzAvRzM4MjU5LjFdLiBTb21lIG9mIHRoZSBtb3N0IGNvbXByZWhlbnNpdmUgY2F0YWxvZ3VlcyB0b2RheSBmZWF0dXJlIHRob3VzYW5kcyB0byBodW5kcmVkcyBvZiB0aG91c2FuZHMgb2Ygc2xvcGUgZmFpbHVyZXMgYWNyb3NzIGVudGlyZSBuYXRpb25zIG9yIGJleW9uZCBbQGVzc2QtMTQtMzE1Ny0yMDIyOyBARnVzY286MjAyM2FhXS4gVGhlIG1ldGhvZHMgdG8gZGV0ZWN0LCBtYXAsIGFuZCBjb21waWxlIGxhbmRzbGlkZXMgaGF2ZSBiZWNvbWUgbW9yZSBkaXZlcnNlIGFuZCBlbGFib3JhdGUgYmV5b25kIHRyYWRpdGlvbmFsIG1hcHBpbmcgZnJvbSBhaXIgcGhvdG9zLCBvcHRpY2FsIHNhdGVsbGl0ZSBkYXRhIG9yIGhpc3RvcmljYWwgcmVjb3JkcyBbQFh1OjIwMjBhYTtAQ2FzYWdsaToyMDIzYWFdLiBOZXdlciBjYXRhbG9ndWVzIGRlcml2ZSBmcm9tIGxhc2VyIHNjYW5uaW5nIFtAZXN1cmYtOS0xMDEzLTIwMjFdLCByYWRhciBpbWFnZXJ5IFtAU29uZzoyMDIyYWFdLCBvYmplY3QtYmFzZWQgaW1hZ2UgYW5hbHlzaXMgW0BtaWxsZWRnZV9hdXRvbWF0ZWRfMjAyMl0sIGRlZXAgbmV1cmFsIG5ldHdvcmtzIFtAU2Nob25mZWxkdDoyMDIyYWE7IEBCaHV5YW46MjAyM2FhXSwgdGV4dCBtaW5pbmcgW0BGcmFuY2VzY2hpbmk6MjAyMmFhXSwgYW5kIHNlaXNtb2xvZ3kgW0BIaWJlcnQ6MjAxOWFhXS4gTW9zdCBtZXRob2RzIHJlcXVpcmUgc3BlY2lmaWMgbWFwcGluZyBwcm90b2NvbHMgYWRqdXN0ZWQgdG8gdGhlIGVmZmVjdGl2ZSByZXNvbHV0aW9uIG9mIGltYWdlcnkgdGhhdCBtYXkgYmUgY29tcHJvbWlzZWQgYnkgdmVnZXRhdGlvbiwgbGFuZCBjb3ZlciwgY2xvdWQsIGFuZCBzaGFkb3cgW0BCcmFyZGlub25pOjIwMDNhYTtAbmhlc3MtMjItMjYzNy0yMDIyXS4gVmFyeWluZyBpbWFnZSBxdWFsaXR5LCByZXNvbHV0aW9uLCBhbmQgY292ZXJhZ2UgYWxzbyBhZmZlY3QgbGFuZHNsaWRlIHNpemUgZXN0aW1hdGVzLCBhcyBkb2VzIHRoZSBleHBlcmllbmNlIG9mIG1hcHBpbmcgb3BlcmF0b3JzIFtAVmFuLURlbi1FZWNraGF1dDoyMDA1YWFdLiBUaGUgbWFwcGluZyBvdXRjb21lIG1heSBkZXBlbmQgb24gd2hldGhlciBhIHNpbmdsZSBwZXJzb24gb3IgYSB0ZWFtIGlzIGF0IHdvcmssIGFuZCB0aGUgYXR0ZW50aW9uIHRvIGRldGFpbCBpbiBkZWxpbmVhdGluZyBzb3VyY2UsIGRlcG9zaXQsIG9yIHRvdGFsIGFmZmVjdGVkIGFyZWFzLiBPdmVybGFwcGluZyBsYW5kc2xpZGUgc291cmNlIGFyZWFzIG9yIGJvZGllcyBjYW4gb2JzY3VyZSB0aGUgZGltZW5zaW9ucyBvZiBzbG9wZSBmYWlsdXJlIFtAbmhlc3MtMTUtNzIzLTIwMTVdLiBEZWJyaXMtIGZsb3dzIGFuZCBzbm93LWF2YWxhbmNoZSB0cmFja3MsIG1vcmFpbmVzLCBhbmQgd2luZC10aHJvdyBnYXBzIGluIGZvcmVzdHMgY2FuIGJlIG1pc3Rha2VuIGZvciBsYW5kc2xpZGUgZXZpZGVuY2UuIEV4cGVyaWVuY2UgYW5kIHRyYWluaW5nIGFpZCBkZXRlY3Rpb24gYW5kIG1hcHBpbmcsIGJ1dCBhbHNvIGludHJvZHVjZSBiaWFzLCBmb3IgZXhhbXBsZSBmYXZvdXJpbmcgZnJlc2ggbGFuZHNsaWRlcywgY2VydGFpbiB0eXBlcyBvZiBmYWlsdXJlLCBvciBhIHNpemUgcmFuZ2UgdGhhdCBpcyBlYXNpZXN0IHRvIHJlY29nbmlzZS4gSGVuY2UsIHRoZSBzaXplIHJhbmdlIG9mIGEgZ2l2ZW4gaW52ZW50b3J5IGlzIGJvdW5kZWQgYnkgdGhlIHNtYWxsZXN0IG1hcHBhYmxlLCBhbmQgdGhlIGxhcmdlc3QgcmVjb2duaXNhYmxlLCBsYW5kc2xpZGUgW0BCYXJsb3c6MjAxMmFhXS4gVGh1cywgd2l0aG91dCBhbnkgc3RhbmRhcmQgbWFwcGluZyBwcm90b2NvbCBpbiBwbGFjZSwgbGFuZHNsaWRlIHJlc2VhcmNoZXJzIGhhdmUgdG8gZGVhbCB3aXRoIGNhdGFsb2d1ZXMgb2YgdmFyeWluZyBjb3ZlcmFnZSwgZGV0YWlsLCBhbmQgcXVhbGl0eSBmb3IgdGhlIHNhbWUgdGFzayBvZiBvYnRhaW5pbmcgdHJhaXRzIG9mIGxhbmRzbGlkZSBzaXplLgoKQXQgdGhlIG1vZGVsIGxldmVsLCBlc3RpbWF0ZXMgb2Ygc2l6ZSBzY2FsaW5nIGhpbmdlIG9uIHRoZSBjaG9pY2Ugb2YgcHJvYmFiaWxpdHkgZGlzdHJpYnV0aW9uIHRvIGNoYXJhY3RlcmlzZSB0aGUgbWFwcGVkIGxhbmRzbGlkZXMgW0BCcmluazoyMDA5YWFdLiBUaGVzZSBlc3RpbWF0ZXMgYWxzbyBkZXBlbmQgb24gc2FtcGxlIHNpemUsIGRhdGEgcHJlLXByb2Nlc3NpbmcsIGZpdHRpbmcgbWV0aG9kLCByZXNpZHVhbHMsIGFuZCBjcm9zcy12YWxpZGF0aW9uLiBOdW1lcmljYWwgZXhwZXJpbWVudHMgc2hvdyB0aGF0IHNtYWxsIHNhbXBsZSBzaXplcyB5aWVsZCB2b2xhdGlsZSBlc3RpbWF0ZXMgb2Ygc2NhbGluZyBwYXJhbWV0ZXJzIGZvciBpbnZlcnNlIHBvd2VyLWxhdyBkaXN0cmlidXRpb25zIGluIHBhcnRpY3VsYXIgW0BodHRwczovL2RvaS5vcmcvMTAuMTAwMi9lc3AuMjI0OF0uIE1vc3QgZXN0aW1hdGlvbiBtZXRob2RzIGludm9sdmUgZWl0aGVyIHJlZ3Jlc3Npb24gb2YgbG9nLWJpbm5lZCAtIGFuZCB0aHVzIHNtb290aGVkIC0gbGFuZHNsaWRlIGZyZXF1ZW5jaWVzIHZlcnN1cyBzaXplIFtAaHR0cHM6Ly9kb2kub3JnLzEwLjEwMDIvZXNwLjQzNzldLCBvciBtYXhpbXVtIGxpa2VsaWhvb2QgZXN0aW1hdGVzIFtAQ2xhdXNldDoyMDA5aXldOyB2YXJpb3VzIGJpYXNlcyBhcHBseSB0byBib3RoIG1ldGhvZHMuIEhvd2V2ZXIsIHJlcG9ydHMgb2YgY29uZmlkZW5jZSBpbnRlcnZhbHMgb3IgZ29vZG5lc3Mgb2YgZml0LCBhbmQgaGVuY2Ugd2F5cyB0byBhc3Nlc3Mgb3ZlcmZpdHRpbmcgcmVtYWluIHJhcmUuIFN0aWxsLCB0aGUgYmFzaXMgZm9yIHN0YXRpc3RpY2FsIGluZmVyZW5jZSBvZiBsYW5kc2xpZGUgc2l6ZSBkaXN0cmlidXRpb25zIHZhcmllcyBhdCB0aGUgbGV2ZWwgb2YgdGhlIGluZGl2aWR1YWwgaW52ZW50b3J5LCBlYWNoIG9mIHdoaWNoIGVtYm9kaWVzIHRoZSBtZXRob2RzIG9mIGRldGVjdGlvbiBhbmQgbWFwcGluZyB1c2VkLCBhbmQgdGhlIGJpYXNlcyB0aGV5IG1heSBpbmR1Y2UuIEluIHRoZSBsaWdodCBvZiB0aGVzZSBjb25zdHJhaW50cywgYSBkaXJlY3QgY29tcGFyaXNvbiBvZiBsYW5kc2xpZGUgc2NhbGluZyBlc3RpbWF0ZXMgYmV0d2VlbiBkaWZmZXJlbnQgaW52ZW50b3JpZXMgbWF5IGJlIG1pc2xlYWRpbmcuCgpXZSBwcm9wb3NlIGEgY29tcGFjdCBzb2x1dGlvbiB0byBjb21wYXJlIG1vcmUgZmFpcmx5IHRoZSBsYW5kc2xpZGUtc2l6ZSBkaXN0cmlidXRpb25zIGZyb20gZGl2ZXJzZSBpbnZlbnRvcmllcyBieSBlc3RpbWF0aW5nIHNjYWxpbmcgcGFyYW1ldGVycyB3aXRoIGEgc2luZ2xlLCBwcm9iYWJpbGlzdGljYWxseSBjb25zaXN0ZW50IG1vZGVsLiBXZSBhcHBseSB0aGlzIG1vZGVsIHRvIGxhcmdlIGxhbmRzbGlkZXMgdGhhdCBhZmZlY3QgYSB0b3RhbCBhcmVhIG9mIFw+MC4xIGttXjJeLCBhbmQgYWRkcmVzcyB0aGUgcHJvYmxlbSBvZiBzbWFsbCBzYW1wbGUgc2l6ZSBieSB1c2luZyBCYXllc2lhbiBpbmZlcmVuY2UgaW4gYSBtdWx0aS1sZXZlbCBtb2RlbCB0aGF0IHVzZXMgZGF0YSBmcm9tIG11bHRpcGxlIGludmVudG9yaWVzIHRvIGVzdGltYXRlIHRoZSB2YXJpYW5jZSBvZiBzY2FsaW5nIHBhcmFtZXRlcnMgd2l0aGluIGFuZCBhY3Jvc3MgdGhlc2UgY2F0YWxvZ3VlcyAgW0BodHRwczovL2RvaS5vcmcvMTAuMTAyOS8yMDIyR0wwOTg1MDZdLiBUaGUgbXVsdGktbGV2ZWwgYXBwcm9hY2ggYWNrbm93bGVkZ2VzIHN0cnVjdHVyZSBpbiBsYW5kc2xpZGUgc2l6ZSBkYXRhIGluIGEgY29uc2lzdGVudCB3YXkuIE9uZSBuYXR1cmFsIGdyb3VwaW5nIG9mIGRhdGEgaXMgYnkgaW52ZW50b3J5LCBhbmQgcmVmbGVjdHMgdGhlIGRpdmVyc2l0eSBpbiBkYXRhIGlucHV0IHF1YWxpdHkgcmV2aWV3ZWQgYWJvdmUuIE91ciBmb2N1cyBvbiBsYXJnZSBsYW5kc2xpZGVzIG1ha2VzIHRoZSBHZW5lcmFsaXNlZCBQYXJldG8gRGlzdHJpYnV0aW9uIChHUEQpIGEgbmF0dXJhbCBtb2RlbCBjaG9pY2UsIGJlY2F1c2UgZXh0cmVtZS12YWx1ZSB0aGVvcnkgcHJlZGljdHMgdGhhdCBkYXRhIGFib3ZlIGEgaGlnaCB0aHJlc2hvbGQgYXJlIGFwcHJveGltYXRlbHkgR1AgZGlzdHJpYnV0ZWQgW0BDYXN0cm9fQ2FtaWxvXzIwMjJdLiBBbm90aGVyIGFkdmFudGFnZSBvZiB0aGlzIGRpc3RyaWJ1dGlvbiBpcyB0aGF0IGl0cyBwYXJhbWV0ZXJzIGNhbiBiZSB0cmFuc2xhdGVkIGRpcmVjdGx5IGludG8gdGhvc2UgdXNlZCBtb3N0IHdpZGVseSBpbiBzdHVkaWVzIG9mIGxhbmRzbGlkZSBzaXplIHNjYWxpbmcuCgpgYGB7ciBtZXNzYWdlID0gRkFMU0UsIHdhcm5pbmcgPSBGQUxTRSwgaW5jbHVkZSA9IEZBTFNFfQojIENsZWFuCmdyYXBoaWNzLm9mZigpCnJtKGxpc3QgPSBscyhhbGwgPSBUUlVFKSkKCiMgU2V0IHdvcmtpbmcgZGlyZWN0b3J5IGFzIGdsb2JhbCBkb2N1bWVudCBvcHRpb24Ka25pdHI6Om9wdHNfY2h1bmskc2V0KHJvb3QuZGlyID0gIn4vSU5WSSIsIGVjaG8gPSBUUlVFKQoKc2V0d2QoIn4vSU5WSSIpCgojIExvYWQgbGlicmFyaWVzCnJlcXVpcmUoYnJtcykKcmVxdWlyZShyc3RhbikKcmVxdWlyZShyZWFkeGwpCnJlcXVpcmUoZ2dwbG90MikKcmVxdWlyZShzY2FsZXMpCnJlcXVpcmUobWFncml0dHIpCnJlcXVpcmUoZHBseXIpCnJlcXVpcmUocmVzaGFwZTIpCnJlcXVpcmUoQUVSKQpyZXF1aXJlKFJDb2xvckJyZXdlcikKcmVxdWlyZShnZ0V4dHJhKQpyZXF1aXJlKGdncHVicikKcmVxdWlyZShjb3dwbG90KQpyZXF1aXJlKGdncmlkZ2VzKQpyZXF1aXJlKHRpZHliYXllcykKcmVxdWlyZShmb3JjYXRzKQpyZXF1aXJlKHNmKQpyZXF1aXJlKHJlYWRyKQpyZXF1aXJlKHN0cmluZ3IpCnJlcXVpcmUoZ2dyZXBlbCkKcmVxdWlyZShydGljbGVzKQoKIyBTZWxlY3QgbXVsdGlwbGUgY29yZXMgYXMgc3VnZ2VzdGVkIGJ5IFNUQU4gbWFudWFsCnJzdGFuX29wdGlvbnMoYXV0b193cml0ZSA9IFRSVUUpCm9wdGlvbnMobWMuY29yZXMgPSBwYXJhbGxlbDo6ZGV0ZWN0Q29yZXMoKSkKCiMgTG9hZCBIREkgc2NyaXB0IAojIChjb3VydGVzeSBvZiBKLiBLcnVzY2hrZSwgRG9pbmcgQmF5ZXNpYW4gRGF0YSBBbmFseXNpcyAybmQgZWQuKQojIChodHRwczovL2pra3dlYi5zaXRlaG9zdC5pdS5lZHUvRG9pbmdCYXllc2lhbkRhdGFBbmFseXNpcy8pCnNvdXJjZSgiSERJb2ZNQ01DLnIiKQpgYGAKCiMgRGF0YSBhbmQgTWV0aG9kcwoKV2UgY29uc2lkZXIgZGF0YSBvbiB0b3RhbCBsYW5kc2xpZGUtYWZmZWN0ZWQgYXJlYXMgZnJvbSBzZXZlcmFsIGRvemVuIHB1Ymxpc2hlZCBsYW5kc2xpZGUgaW52ZW50b3JpZXMgd2l0aCBvcGVuIGFjY2Vzcy4gV2UgZXhjbHVkZWQgbWFueSBvdGhlciBkZXRhaWxlZCBjYXRhbG9ndWVzIHRoYXQgaGFkIG5vIHJlY29yZHMgb2YgbGFuZHNsaWRlcyBtZWV0aW5nIG91ciBzaXplIHRocmVzaG9sZCBvZiAwLjEga21eMl4uIEJlc2lkZXMgaW5mb3JtYXRpb24gYWJvdXQgdGhlaXIgc2l6ZSwgbWFueSBkYXRhYmFzZXMgaGF2ZSBsYW5kc2xpZGUgdHlwZXMgYW5kIHRyaWdnZXJzIHJlcG9ydGVkLCBhbmQgbWFueSBkYXRhIHdlcmUgcmVjb3JkZWQgZm9sbG93aW5nIHJlY2VudCAoaS5lLiBwb3N0LTE5MDApIG1ham9yIGVhcnRocXVha2VzIGFuZCByYWluc3Rvcm1zIHdpdGggdGhlIGludGVudGlvbiB0byBjaGFyYWN0ZXJpc2UgdGhlIGltcGFjdCBvZiB0aGVzZSBldmVudHMuIFdlIGFsc28gaW5jbHVkZWQgY2F0YWxvZ3VlcyBzcGFubmluZyB0aW1lIGludGVydmFscyBvZiBzZXZlcmFsIHllYXJzIHRvIG1pbGxlbm5pYSwgZmVhdHVyaW5nIG1vc3RseSB1bmRhdGVkIGxhcmdlIGxhbmRzbGlkZXMgd2l0aCB1bmtub3duIHRyaWdnZXJzIHRvIHRlc3Qgd2hldGhlciB0aGVzZSBjdW11bGF0aXZlIGludmVudG9yaWVzIGhhdmUgc2l6ZSBkaXN0cmlidXRpb25zIHRoYXQgZGlmZmVyIGZyb20gdGhvc2Ugb2YgZXZlbnQtYmFzZWQgaW52ZW50b3JpZXMuCgoKYGBge3IsIG1lc3NhZ2UgPSBGQUxTRX0KIyBSZWFkIGRhdGEgZmlsZSBvbiBsYW5kc2xpZGUgaW52ZW50b3JpZXMKenogPC0gcmVhZF9jc3YoImxzaW52ZW50b3J5X3NjYWxpbmdfbWFzdGVyLmNzdiIpCgojIE9yZGVyIGJ5IHRhcmdldCB2YXJpYWJsZQp6eiA8LSB6eiAlPiUgYXJyYW5nZSh4eCkKCiMgQ3JlYXRlIGFueSBzdWJzZXRzIGlmIG5lZWRlZAp6eiA8LSB6eiAlPiUgZmlsdGVyKCFpcy5uYShJbnZlbnRvcnkpKQoKIyBBZGQgc3ludGhldGljIG5vaXNlIHRvIGJyZWFrIHRpZXMgaW4gcmFua3MgZm9yIGV4Y2VlZGFuY2UgcHJvYmFiaWxpdGllcwp6eiR4eCA8LSB6eiR4eCArIHJ1bmlmKGxlbmd0aCh6eiR4eCkpCmBgYAoKVGhlIGNob2ljZSBvZiBwcm9iYWJpbGl0eSBkaXN0cmlidXRpb24gdG8gbW9kZWwgbGFuZHNsaWRlIGFyZWEgb2Z0ZW4gcmVzdHMgb24gaW1wbGljaXQgYXNzdW1wdGlvbnMuIEZvciBleGFtcGxlLCB0aGUgaW52ZXJzZSBwb3dlciBsYXcgZHJhd3Mgb24gY29uc2lkZXJhdGlvbnMgb2YgcGh5c2ljYWwgc2FuZC1waWxlIG1vZGVscyBhbmQgdGhlIGNvbmNlcHQgb2Ygc2VsZi1vcmdhbmlzZWQgY3JpdGljYWxpdHkgW0BodHRwczovL2RvaS5vcmcvMTAuMTAyOS85OEdMNTA0MTldLCB3aGVyZWFzIHRoZSBsb2dub3JtYWwgZGlzdHJpYnV0aW9uIGFyaXNlcyBuYXR1cmFsbHkgZnJvbSBtdWx0aXBsaWNhdGl2ZSBlZmZlY3RzIG9mIHJhbmRvbSB2YXJpYWJsZXMgW0BCcmluazoyMDA5YWFdLiBIZXJlIHdlIG1vZGVsIHRoZSByZXBvcnRlZCBzaXplcyBvZiBsYXJnZSBsYW5kc2xpZGVzIHdpdGggdGhlIEdlbmVyYWxpemVkIFBhcmV0byBEaXN0cmlidXRpb24gKEdQRCkuIFRoZSBHUEQgaXMgcm9vdGVkIGluIGV4dHJlbWUtdmFsdWUgdGhlb3J5IGFuZCBhcHByb3hpbWF0ZXMgdGhlIGRpc3RyaWJ1dGlvbiBvZiBhIGNvbnRpbnVvdXMgcmFuZG9tIHZhcmlhYmxlICR4JCBhYm92ZSBhIGhpZ2ggdGhyZXNob2xkIChvciBsb2NhdGlvbiBwYXJhbWV0ZXIpICRcbXUkLiBUaGUgR1BEIHRodXMgY2FwdHVyZXMgd2hhdCB3ZSB3b3VsZCBleHBlY3QgdGhlb3JldGljYWxseSBmcm9tIGEgc2FtcGxlIGNvbnNpc3Rpbmcgb2Ygb2JzZXJ2YXRpb25zIGZpbHRlcmVkIGFib3ZlIGEgbWluaW11bSB2YWx1ZSBbQEthdHo6MjAwMmFhXS4gQW55IHBoeXNpY2FsIGludGVycHJldGF0aW9uIG9mIHRoZSBHUEQgcGFyYW1ldGVycyBtYXkgbmVlZCB0byBhY2NvdW50LCBvciBjb3JyZWN0LCBmb3IgdGhpcyBzdGF0aXN0aWNhbCBleHBlY3RhdGlvbiBmaXJzdC4gVGhlIHByb2JhYmlsaXR5IGRlbnNpdHkgZnVuY3Rpb24gb2YgdGhlIEdQRCBpczoKCiQkClxtYXRocm17R1BEfSh4fFxtdSxcc2lnbWEsaykgPSBcZnJhY3sxfXtcc2lnbWF9IApcbGVmdCggIDEgKyBcZnJhY3trIFxsZWZ0KCB4IC0gXG11IFxyaWdodCl9e1xzaWdtYX0gXHJpZ2h0KSBeIHstMS9rIC0gMX0sCiQkIAoKd2hlcmUgJHggPj0gXG11JCwgJFxzaWdtYSA+IDAkIGlzIGEgc2NhbGUgcGFyYW1ldGVyLCBhbmQgJGsgXGdlcSAwJCBpcyBhIHNoYXBlIHBhcmFtZXRlci4gVGhlIHNjYWxlIHBhcmFtZXRlciAkXHNpZ21hJCBpcyBzb21ld2hhdCBjb21wYXJhYmxlIHRvIHRoZSAicm9sbC1vdmVyIiBpbiBzdHVkaWVzIHVzaW5nIGFuIGludmVyc2UgcG93ZXItbGF3IG1vZGVsIGZvciBlc3RpbWF0aW5nIGxhbmRzbGlkZSBzaXplIHNjYWxpbmcuIFRoaXMgcm9sbC1vdmVyIG1hcmtzIHRoZSBsb3dlc3QgbGFuZHNsaWRlIHNpemUgYWJvdmUgd2hpY2ggcG93ZXItbGF3IHNjYWxpbmcgaXMgYXNzdW1lZC4gVGhlIEdQRCBzaGFwZSBwYXJhbWV0ZXIgaXMgdGhlIGludmVyc2Ugb2YgdGhlICJzY2FsaW5nIGV4cG9uZW50IiBvZiB0aGUgcG93ZXItbGF3IHRhaWwgJFxhbHBoYSQsIHN1Y2ggdGhhdCAkayA9IDEgLyBcYWxwaGEkLgoKSGVyZSwgdGhlIGxvY2F0aW9uIHBhcmFtZXRlciAkXG11JCBzZXRzIHRoZSBtaW5pbXVtIGxhbmRzbGlkZSBzaXplIGZvciBkYXRhIHRvIGJlIGFkbWl0dGVkIHRvIHRoZSBHUEQuIFRoaXMgaXMga25vd24gYXMgYSBwZWFrLW92ZXItdGhyZXNob2xkIGFwcHJvYWNoIGluIGV4dHJlbWUtdmFsdWUgc3RhdGlzdGljcyBbQEthdHo6MjAwMmFhXS4gRm9yIGxhcmdlIGxhbmRzbGlkZXMsIHdlIGxldCAkXG11JCA9IDAuMSBrbV4yXi4gRW1waXJpY2FsIHJlbGF0aW9uc2hpcHMgYmV0d2VlbiBsYW5kc2xpZGUgdm9sdW1lIGFuZCB0b3RhbCBhZmZlY3RlZCBhcmVhIGFjcm9zcyBhIHdpZGUgcmFuZ2Ugb2YgZW52aXJvbm1lbnRhbCBzZXR0aW5ncyBzaG93IHRoYXQgYW4gYXJlYSBvZiAwLjEga21eMl4gY29ycmVzcG9uZHMgdG8gYW4gYXZlcmFnZSB2b2x1bWUgb2Ygcm91Z2hseSAxMF42XiBtXjNeIFtATGFyc2VuOjIwMTBhYV0sIHdoaWNoIGlzIHRoZSBzdWdnZXN0ZWQgbG93ZXIgdGhyZXNob2xkIGZvciBsYXJnZSBsYW5kc2xpZGVzIFtATWNDb2xsOjIwMjRhYV0uIFRoaXMgcGFydGljdWxhciBjaG9pY2Ugb2YgJFxtdSQgaXMgYSBjb21wcm9taXNlLCBiZWNhdXNlIGZld2VyIHNhbXBsZXMgYW5kIGxhbmRzbGlkZSBpbnZlbnRvcmllcyBhcmUgYXZhaWxhYmxlIGZvciBoaWdoZXIgdmFsdWVzIG9mICRcbXUkLCB3aGVyZWFzIHRoZSBHUEQgYmVjb21lcyBhIGxlc3MgYW5kIGxlc3MgdmFsaWQgYXBwcm94aW1hdGlvbiB0byB0aGUgZGF0YSBmb3IgbG93ZXIgdmFsdWVzIG9mICRcbXUkLgoKYGBge3J9CiMgQ29uc2lkZXIgb25seSBQT1QgZGF0YSwgaS5lLiB0aG9zZSB4eCA+PSBtaW5fc2l6ZQp6eiR4eCA8LSB6eiR4eCAvIDFlNiAjIGNvbnZlcnQgdG8gW2ttIF4gMl0KCiMgUmVjb3JkIG1pbmltdW0gbGFuZHNsaWRlIGFyZWEgaW4gZnVsbCBpbnZlbnRvcnkKenogPC0genogJT4lIAogIGdyb3VwX2J5KEludmVudG9yeSkgJT4lIAogIG11dGF0ZShtaW5BcmVhID0gbWluKHh4KSkKCiMgU2V0IG1pbmltdW0gc2l6ZSBtdSAobG9jYXRpb24gcGFyYW1ldGVyKQptaW5fc2l6ZSA8LSAwLjEgIyBba20gXiAyXQoKIyBSZWNvcmQgbnVtYmVyIG9mIGxhbmRzbGlkZXMgYmVsb3cgbXUKenogPC0genogJT4lIAogIGdyb3VwX2J5KEludmVudG9yeSkgJT4lIAogIG11dGF0ZShuX2JlbG93X211ID0gc3VtKHh4IDwgbWluX3NpemUpKQoKIyBSZWNvcmQgdG90YWwgbGFuZHNsaWRlIGFyZWEKdG90X0EgPC0gc3VtKHp6JHh4KQoKIyBGaWx0ZXIgZm9yIFBPVCBkYXRhCnp6IDwtIHp6ICU+JSBmaWx0ZXIoeHggPj0gbWluX3NpemUpCmBgYAoKRml0dGluZyB0aGUgR1BEIHRvIGRhdGEgY2FuIGludm9sdmUgbWF4aW11bSBsaWtlbGlob29kIGVzdGltYXRlcyBvciwgaW4gY2FzZSBvZiBmZXcgc2FtcGxlcyAoJG4kIDwgMzApLCBwcm9iYWJpbGl0eS13ZWlnaHRlZCAoTC0pbW9tZW50cyB0byBhdm9pZCB2b2xhdGlsZSBwYXJhbWV0ZXIgZXN0aW1hdGVzIFtAS2F0ejoyMDAyYWFdLiBXZSB1c2UgQmF5ZXNpYW4gaW5mZXJlbmNlIHRvIGxlYXJuIHRoZSBHUEQgcGFyYW1ldGVycyBmcm9tIHRoZSBkYXRhLCBhY2tub3dsZWRnaW5nIGV4cGxpY2l0bHkgdGhhdCB0aGVzZSBhcmUgZGVyaXZlZCBmcm9tIGRpZmZlcmVudCBpbnZlbnRvcmllcyB0aGF0IHJlZmxlY3QgZGlmZmVyZW50IGVudmlyb25tZW50YWwgY29uZGl0aW9ucyBhY3Jvc3Mgc3R1ZHkgYXJlYXMsIGFuZCBsYW5kc2xpZGVzIGxpa2VseSBkZXRlY3RlZCBhdCB2YXJ5aW5nIHJlc29sdXRpb24gYW5kIG1hcHBlZCB3aXRoIGRpZmZlcmVudCB0ZWNobmlxdWVzLiBBIEJheWVzaWFuIHRyZWF0bWVudCBvZiB0aGlzIGZpdHRpbmcgcHJvYmxlbSBzZWVrcyBhIGNvbXByb21pc2UgYmV0d2VlbiBhIGxpa2VsaWhvb2QgZnVuY3Rpb24gYW5kIGEgcHJvYmFiaWxpdHkgZGlzdHJpYnV0aW9uIG9mIHByaW9yIGtub3dsZWRnZSBhYm91dCB0aGUgbW9kZWwgcGFyYW1ldGVycy4gVGhpcyBhcHByb2FjaCBhbHNvIG9idmlhdGVzIHRoZSBuZWVkIGZvciBiaW5uZWQgbGFuZHNsaWRlLXNpemUgZGF0YSB0byB1c2UgZnJlcXVlbmN5IGRlbnNpdHkgW2UuZy4gQE1hbGFtdWQ6MjAwNGFhXS4gSW5zdGVhZCwgd2Ugd29yayB3aXRoIHRoZSBqb2ludCBwcm9iYWJpbGl0eSB0aGF0IGlzIHRoZSBudW1lcmF0b3Igb2YgQmF5ZXMnIFJ1bGU6CgokJCBwKFx0aGV0YXxcbWF0aGNhbHtEfSkgPSBcZnJhY3twKFxtYXRoY2Fse0R9fFx0aGV0YSkgcChcdGhldGEpfXtwKFxtYXRoY2Fse0R9KX0sICQkIAoKd2hlcmUgJFx0aGV0YSQgaXMgdGhlIHZlY3RvciBvZiBtb2RlbCBwYXJhbWV0ZXJzIHRoYXQgd2Ugd2lzaCB0byB1cGRhdGUgZnJvbSBib3RoIHRoZSBsYW5kc2xpZGUgZGF0YSAkXG1hdGhjYWx7RH0kIGFuZCBwcmlvciBrbm93bGVkZ2UuIFdlIHVzZSB0aGUgR1BEIGFzIHRoZSBsaWtlbGlob29kIGZ1bmN0aW9uICRwKFxtYXRoY2Fse0R9fFx0aGV0YSkkIGFuZCBjaG9vc2UgKGh5cGVyLSlwcmlvciBkaXN0cmlidXRpb25zICRwKFx0aGV0YSkkIHRvIGFwcHJveGltYXRlIHdoYXQgd2Uga25vdyBhYm91dCBsYW5kc2xpZGUgc2l6ZSBkaXN0cmlidXRpb25zIHNvIGZhciBhbmQgaXJyZXNwZWN0aXZlIG9mIHRoZSBkYXRhICRcbWF0aGNhbHtEfSQgc3R1ZGllZCBoZXJlLgoKT3VyIG1vZGVsIHVzZXMgYSBtdWx0aS1sZXZlbCBzZXR1cCwgaW4gd2hpY2ggJGkgXGluIFx7MSxcZG90cyxuXH0kIGluZGV4ZXMgZWFjaCBsYW5kc2xpZGUgb2JzZXJ2YXRpb24gJHhfaSQgZnJvbSBhIHNhbXBsZSBvZiBzaXplICRuJCwgYW5kICRqIFxpbiBcezEsXGRvdHMsSlx9JCBpbmRleGVzIGVhY2ggb2YgJEokIGRpZmZlcmVudCBsYW5kc2xpZGUgaW52ZW50b3JpZXMuIFRoZSBpZGVhIG9mIHRoZSBtdWx0aS1sZXZlbCBtb2RlbCBpcyB0aGF0IHRoZSBzaXplIGRpc3RyaWJ1dGlvbiBpbiBlYWNoIGxhbmRzbGlkZSBpbnZlbnRvcnkgJGokIGlzIGNoYXJhY3RlcmlzZWQgYnkgYW4gaW5kaXZpZHVhbCBzZXQgb2YgR1BEIHBhcmFtZXRlcnMgJFxzaWdtYV9qJCBhbmQgJGtfaiQuIFdlIGZ1cnRoZXIgYXNzdW1lIHRoYXQgdGhlIHZhbHVlcyBvZiBlYWNoIG9mIHRoZXNlIGludmVudG9yeS1zcGVjaWZpYyBwYXJhbWV0ZXIgcGFpcnMgYXJlIGRyYXduIGZyb20gdGhlIHNhbWUgdHdvIHByb2JhYmlsaXR5IGRpc3RyaWJ1dGlvbnM6CgokJCB4X2kgXHNpbSBcbWF0aHJte0dQRH0oXG11LCBcc2lnbWFfe2pbaV19LCBrX3tqW2ldfSkgJCQKCiQkIFxzaWdtYV9qIFxzaW0gXG1hdGhybXtHYW1tYX0oXGFscGhhX1xzaWdtYSwgXGJldGFfe1xzaWdtYX0pICQkCiQkIGtfaiBcc2ltIFxtYXRocm17R2FtbWF9KFxhbHBoYV9rLCBcYmV0YV97a30pICQkIAoKSGVyZSB3ZSBjaG9vc2UgaW5kZXBlbmRlbnQgR2FtbWEgZGlzdHJpYnV0aW9ucyBmb3IgYm90aCAkXHNpZ21hX2okIGFuZCAka19qJCB0byBlbnN1cmUgdGhhdCB0aGUgcGFyYW1ldGVycyBhcmUgcG9zaXRpdmUgYW5kIHVuY29ycmVsYXRlZC4gVGhlIG11bHRpLWxldmVsIG1vZGVsIHRodXMgbGVhcm5zIHRoZSBwYXJhbWV0ZXJzIGZvciBlYWNoIGNhdGFsb2d1ZSBpbmZvcm1lZCBieSBib3RoIGl0cyBkYXRhLCB0aGUgb3ZlcmFyY2hpbmcgR2FtbWEgZGlzdHJpYnV0aW9ucywgYW5kIHByaW9yIGtub3dsZWRnZS4gV2hpbGUgdGhlIG1vZGVsIGFsbG93cyAkXHNpZ21hX2okIGFuZCAka19qJCB0byB2YXJ5IGJldHdlZW4gbGFuZHNsaWRlIGludmVudG9yaWVzLCBpdCBhbHNvIGRyYXdzIG9uIGluZm9ybWF0aW9uIGZyb20gdGhlIGZ1bGwgZGF0YSBzZXQgdmlhIHRoaXMgbXVsdGktbGV2ZWwgc3RydWN0dXJlLgoKQmF5ZXNpYW4gcmVhc29uaW5nIHJlcXVpcmVzIHRoYXQgd2Ugc3BlY2lmeSBvdXIgcHJpb3Iga25vd2xlZGdlIGV4cGxpY2l0bHkuIFdlIGRvIHRoaXMgYnkgY2hvb3NpbmcgdGhlIGh5cGVyLXBhcmFtZXRlcnMgb2YgdGhlIHR3byBHYW1tYSBkaXN0cmlidXRpb25zIG9mICRcc2lnbWFfaiQgYW5kICRrX2okLiBUaGVzZSBoeXBlci1wYXJhbWV0ZXJzIGRlc2NyaWJlIHRoZSBkaXN0cmlidXRpb24gb2YgbGFuZHNsaWRlIHNjYWxpbmcgcGFyYW1ldGVycyBhY3Jvc3MgYWxsIGludmVudG9yaWVzIGFuZCBvZmZlciBhIGdsb2JhbCBzdW1tYXJ5IGZyb20gYWxsIGRhdGEuIFdlIGRyYXcgb24gdGhlIGdyb3dpbmcgbGl0ZXJhdHVyZSBvZiBsYW5kc2xpZGUgc2NhbGluZy4gUmVjZW50IHJldmlld3MgaGF2ZSBzdW1tYXJpc2VkIHRoYXQgdGhlIHBvd2VyLWxhdyBzY2FsaW5nIGV4cG9uZW50ICRcYWxwaGEkIGZvciBsYW5kc2xpZGUgaW52ZW50b3JpZXMgaXMgbW9zdCBvZnRlbiByZXBvcnRlZCBpbiB0aGUgcmFuZ2Ugb2YgMSBcPCAkXGFscGhhJCBcPCAzIFtAaHR0cHM6Ly9kb2kub3JnLzEwLjEwMjkvMjAxOUVBMDAwNjYyXS4gUmVjYWxsaW5nIHRoYXQgdGhlIEdQRCBzaGFwZSBwYXJhbWV0ZXIgJGsgPSAxIC8gXGFscGhhJCwgd2UgY2FuIHVzZSB0aGlzIGluZm9ybWF0aW9uIHRvIGNvbnN0cmFpbiBvdXIgKGh5cGVyLSlwcmlvciBkaXN0cmlidXRpb25zIGFjY29yZGluZ2x5LiBIZW5jZSB3ZSBjaG9vc2UgdGhlc2UgaHlwZXItcGFyYW1ldGVyIHZhbHVlcyBzdWNoIHRoYXQgdGhleSBjb250YWluIGZpbmRpbmdzIGZyb20gbGFuZHNsaWRlIHNjYWxpbmcgc3R1ZGllcyBiYXNlZCBvbiBkYXRhIG90aGVyIHRoYW4gdGhlIG9uZXMgdXNlZCBoZXJlLiBUaGUgZXhhY3Qgc2hhcGUgb2YgdGhlc2UgZGlzdHJpYnV0aW9ucyBtYXkgbWF0dGVyIGxpdHRsZSBpbiB0aGUgbGlnaHQgb2YgdGhlIGxhcmdlIHNhbXBsZSBzaXplIHRoYXQgaW5mb3JtcyBvdXIgbGlrZWxpaG9vZCBmdW5jdGlvbi4gV2UgZGlzcmVnYXJkIGFueSBjb3JyZWxhdGlvbiBiZXR3ZWVuIHRoZSBoeXBlci1wYXJhbWV0ZXJzIGFuZCBzaW1wbGlzdGljYWxseSBhc3N1bWUgaW5kZXBlbmRlbnQgZGlzdHJpYnV0aW9uczoKCiQkIFxhbHBoYV9cc2lnbWEgXHNpbSBcbWF0aGNhbHtOfSgxLCAwLjI1KSAkJAokJCBcYmV0YV97XHNpZ21hfSBcc2ltIFxtYXRoY2Fse059KDUsIDUpICQkCiQkIFxhbHBoYV9rIFxzaW0gXG1hdGhjYWx7Tn0oNiwgMSkgJCQKJCQgXGJldGFfe2t9IFxzaW0gXG1hdGhjYWx7Tn0oOSwgMSkgJCQKCndoZXJlICRcYWxwaGFfXHNpZ21hJCBhbmQgJFxhbHBoYV9rJCBhcmUgdGhlIGNvcnJlc3BvbmRpbmcgc2hhcGUgcGFyYW1ldGVycywgYW5kICRcYmV0YV97XHNpZ21hfSQgYW5kICRcYmV0YV97a30kIGFyZSB0aGUgaW52ZXJzZSBzY2FsZSAob3IgcmF0ZSkgcGFyYW1ldGVycy4gV2UgYXNzdW1lIGluZGVwZW5kZW50IEdhdXNzaWFuIHByaW9yIGRpc3RyaWJ1dGlvbnMgZm9yIHRoZXNlIGh5cGVycGFyYW1ldGVycyBhbmQgY2hvb3NlIHRoZSBwcmlvciBtZWFucyBhbmQgc3RhbmRhcmQgZGV2aWF0aW9ucyBpbmZvcm1lZCBieSBwcmV2aW91cyByZXNlYXJjaCBvbiBsYW5kc2xpZGUgc2NhbGluZyBwcm9wZXJ0aWVzIFtAaHR0cHM6Ly9kb2kub3JnLzEwLjEwMjkvMjAxOUVBMDAwNjYyXS4KCmBgYHtyfQojIFNldCBtaW5pbXVtIHNhbXBsZXMgcGVyIGludmVudG9yeQptaW5fZ3JwX3NpemUgPC0gMjUKYGBgCgpUbyBhdm9pZCBoYXZpbmcgdG9vIG1hbnkgaW52ZW50b3JpZXMgd2l0aCBvbmx5IGEgaGFuZGZ1bCBvZiBsYXJnZSBsYW5kc2xpZGVzLCB3ZSBjb25zaWRlciBvbmx5IHRob3NlIGRhdGEgY29sbGVjdGlvbnMgd2l0aCBhdCBsZWFzdCBgciBtaW5fZ3JwX3NpemVgIGxhbmRzbGlkZXMgdGhhdCBleGNlZWQgdGhlIHRocmVzaG9sZCBzaXplICRcbXUkLgoKYGBge3J9CiMgRmlsdGVyIGZvciBtaW5pbXVtIHNhbXBsZXMgcGVyIGdyb3VwCm1pbl9ncnAgPC0genogJT4lIAogIGdyb3VwX2J5KEludmVudG9yeSkgJT4lIAogIHN1bW1hcmlzZShjb3VudCA9IG4oKSkgJT4lIAogIGZpbHRlcihjb3VudCA8PSBtaW5fZ3JwX3NpemUpCnp6IDwtIHp6ICU+JSBmaWx0ZXIoIShJbnZlbnRvcnkgJWluJSBtaW5fZ3JwJEludmVudG9yeSkpCmBgYAoKYGBge3J9CiMgQ29tcHV0ZSBlbXBpcmljYWwgZXhjZWVkYW5jZSBwcm9iYWJpbGl0aWVzIHBlciBncm91cAp6eiA8LSB6eiAlPiUgCiAgZ3JvdXBfYnkoSW52ZW50b3J5KSAlPiUgCiAgYXJyYW5nZSh4eCwgLmJ5X2dyb3VwID0gVFJVRSkgJT4lIAogIG11dGF0ZShwID0gc2VxKG4oKSwgMSwgLTEpIC8gbigpKQpgYGAKCgpUaGUgZGF0YSB0aGF0IHdlIG5lZWQgZm9yIGEgbnVtZXJpY2FsIGFwcHJveGltYXRpb24gb2YgdGhlIHBvc3RlcmlvciBkaXN0cmlidXRpb24gb2YgdGhlIHBhcmFtZXRlcnMgb2YgdGhlIEdQRCBjb25zaXN0IG9mIHRoZSBpbmRpdmlkdWFsIGxhbmRzbGlkZSBhcmVhcyBhbmQgbGFiZWxzIG9mIHRoZSBpbnZlbnRvcmllcyB0aGV5IGJlbG9uZyB0by4KCmBgYHtyfQojIFByZXBhcmUgZGF0YSBpbnB1dCBmb3IgU1RBTiAoY3VzdG9tKQpzdGFuX2QgPC0gbGlzdCgKICB5bWluID0gbWluX3NpemUsCiAgTiA9IGxlbmd0aCh6eiR4eCksCiAgeSA9IHp6JHh4LAogIEwgPSBsZW5ndGgodW5pcXVlKHp6JEludmVudG9yeSkpLAogIGxsID0gYXMubnVtZXJpYyhmYWN0b3IoenokSW52ZW50b3J5KSksCiAgeW1heCA9IGFnZ3JlZ2F0ZSh6eiR4eCwgYnkgPSBsaXN0KHp6JEludmVudG9yeSksIG1heCkkeCwKICAjeXQgPSAxMCBeIHNlcSgyLjksIDUsIDAuMDEpLCAgICMgdGVzdGluZyBkYXRhCiAgI050ID0gMjExCiAgeXQgPSB6eiR4eCwgICAjIHRlc3RpbmcgZGF0YQogIE50ID0gbGVuZ3RoKHp6JHh4KSwKICBsbHR0ID0gYXMubnVtZXJpYyhmYWN0b3IoenokSW52ZW50b3J5KSkKKQpgYGAKCmBgYHtyIFN1bW1hcnlfVGFibGUsIGZpZy5jYXAgPSAnU3VtbWFyeSBvZiBsYW5kc2xpZGUgaW52ZW50b3JpZXMgbGlzdGluZyBzdHVkeSBhcmVhLCBzYW1wbGUgc2l6ZSBvZiBsYXJnZSBsYW5kc2xpZGVzLCB0aGUgc21hbGxlc3QgbGFuZHNsaWRlIGRldGVjdGVkLCBudW1iZXIgb2YgbGFuZHNsaWRlcyBiZWxvdyBzaXplIHRocmVzaG9sZCwgYW5kIHRyaWdnZXIuICpEZXJpdmVkIGZyb20gZGVlcCBuZXVyYWwgbmV0d29ya3MuJ30KIyBEYXRhIG92ZXJ2aWV3CihteWRhdCA8LSB6eiAlPiUKICBncm91cF9ieShJbnZlbnRvcnkpICU+JQogIHN1bW1hcmlzZShTYW1wbGVzID0gbigpLAogICAgICAgICAgICBgTWF4LiBhcmVhIChrbV4yKWAgPSBtYXgoeHgpICU+JSByb3VuZCgxKSwKICAgICAgICAgICAgYE1pbi4gYXJlYSAoa21eMilgID0gbWluKG1pbkFyZWEpICU+JSByb3VuZCg0KSwKICAgICAgICAgICAgYG4gPCB0aHJlc2hvbGRgID0gbWF4KG5fYmVsb3dfbXUpLAogICAgICAgICAgICBUcmlnZ2VyID0gZmlyc3QoVHJpZ2dlciksCiAgICAgICAgICAgIFJlZmVyZW5jZSA9IGZpcnN0KGdyb3VwKSkpCmBgYAoKVGhlIHNpemUgdGhyZXNob2xkICRcbXUkIG1lYW5zIHRoYXQgd2UgaGFkIHRvIGRpc2NhcmQgbWFueSBwdWJsaXNoZWQgbGFuZHNsaWRlIGludmVudG9yaWVzIHRoYXQgb25seSBjb250YWluIHNtYWxsZXIgc2xvcGUgZmFpbHVyZXMuIE91ciBkYXRhIHRodXMgY29uc2lzdHMgb2YgYHIgbnJvdyh6eilgIGxhcmdlIGxhbmRzbGlkZXMgZmlsdGVyZWQgZnJvbSBgciBsZW5ndGgodW5pcXVlKHp6JEludmVudG9yeSkpYCBkaWZmZXJlbnQgaW52ZW50b3JpZXMuIFRvZ2V0aGVyLCB0aGVzZSBsYXJnZSBzbG9wZSBmYWlsdXJlcyBhZmZlY3RlZCBhbiBhcmVhIG9mIGByIHJvdW5kKHN1bSh6eiR4eCkpYCBrbV4yXiwgb3IgYHIgcm91bmQoc3VtKHp6JHh4KSAvIHRvdF9BLCAyKSAqIDEwMGAlIG9mIHRoZSB0b3RhbCBsYW5kc2xpZGUtYWZmZWN0ZWQgYXJlYSByZWNvcmRlZCBpbiB0aGVzZSBjYXRhbG9ndWVzLiBUaGUgbGFyZ2VzdCBsYW5kc2xpZGUgaXMgdW5uYW1lZCBhbmQgZXh0ZW5kcyBvdmVyIGByIHJvdW5kKG1heCh6eiR4eCkpYCBrbV4yXiBpbiB0aGUgQ2FzcGlhbiBTZWEgYmFzaW4gW0AxMC4xMTMwL0czODI1OS4xXS4gT3VyIGRhdGEgdGh1cyBzcGFuIG1vcmUgdGhhbiB0aHJlZSBvcmRlcnMgb2YgbWFnbml0dWRlIGluIGxhbmRzbGlkZSBhcmVhOyB0aGUgbGFyZ2VzdCBtYXBwZWQgbGFuZHNsaWRlIGFyZWFzIHBlciBpbnZlbnRvcnkgZGlmZmVyIGJ5IHVwIHR3byBvcmRlcnMgb2YgbWFnbml0dWRlLgoKV2Ugbm90ZSB0aGF0IGByIHN1bShteWRhdCRUcmlnZ2VyID09ICJFYXJ0aHF1YWtlIilgIChvciBgciByb3VuZChzdW0obXlkYXQkVHJpZ2dlciA9PSAiRWFydGhxdWFrZSIpICogMTAwIC8gbnJvdyhteWRhdCkpYCUpIG9mIG91ciBzZWxlY3RlZCBsYW5kc2xpZGUgaW52ZW50b3JpZXMgd2VyZSBjb21waWxlZCBmb2xsb3dpbmcgYW4gZWFydGhxdWFrZSwgaW5jbHVkaW5nIHNldmVyYWwgdmVyc2lvbnMgdGhhdCB3ZXJlIG1hcHBlZCBieSBkaWZmZXJlbnQgcmVzZWFyY2ggdGVhbXMuIE9ubHkgYHIgc3VtKG15ZGF0JFRyaWdnZXIgPT0gIlJhaW5mYWxsIilgIGNhdGFsb2d1ZXMgKGByIHJvdW5kKHN1bShteWRhdCRUcmlnZ2VyID09ICJSYWluZmFsbCIpICogMTAwIC8gbnJvdyhteWRhdCkpYCUpIGFyZSBhdHRyaWJ1dGVkIHRvIGEgcmFpbmZhbGwgdHJpZ2dlciwgd2hpbGUgYHIgc3VtKG15ZGF0JFRyaWdnZXIgPT0gIlZhcmlvdXMiKWAgY2F0YWxvZ3VlcyAoYHIgcm91bmQoc3VtKG15ZGF0JFRyaWdnZXIgPT0gIlZhcmlvdXMiKSAqIDEwMCAvIG5yb3cobXlkYXQpKWAlKSBjb250YWluIGluZm9ybWF0aW9uIGFib3V0IGxhbmRzbGlkZXMgdGhhdCBhY2N1bXVsYXRlZCBvdmVyIG1hbnkgeWVhcnMgYW5kIHRodXMgbGlrZWx5IHJlZmxlY3QgdmFyaW91cyB0cmlnZ2Vycy4KCmBgYHtyIGluY2x1ZGU9RkFMU0V9CiMgRml0IHdpdGggU1RBTi0tLS0tLS0tLS0tLS0tCm1maXQgPC0gc3RhbigiZ3BhcmV0b19maXRfbXVsdGlsZXZlbC1pbnZlbnRvcmllcy5zdGFuIiwKICAgICAgICAgICAgIHdhcm11cCA9IDUwMCwKICAgICAgICAgICAgIGl0ZXIgPSAyMDAwLAogICAgICAgICAgICAgZGF0YSA9IHN0YW5fZCwKICAgICAgICAgICAgIGNoYWlucyA9IDQsCiAgICAgICAgICAgICBjb3JlcyA9IDQpCmBgYAoKCldlIHVzZSB0aGUgcHJvYmFiaWxpc3RpYyBwcm9ncmFtbWluZyBsYW5ndWFnZSBTVEFOIFtAQ2FycGVudGVyOjIwMTdhYV0gdG8gY29kZSBvdXIgbW9kZWwgYW5kIGNhbGwgaXQgdmlhIHRoZSBzdGF0aXN0aWNhbCBwcm9ncmFtbWluZyBlbnZpcm9ubWVudCAqKlIqKi4gV2UgcmFuIGZvdXIgaW5kZXBlbmRlbnQgSGFtaWx0b25pYW4gTW9udGUgQ2FybG8gY2hhaW5zIHRvIGV4cGxvcmUgdGhlIG1vZGVsIHBhcmFtZXRlciBzcGFjZSB3aXRoIHRoZSBObyBVLVR1cm4gKE5VVFMpIHNhbXBsZXIgY29kZWQgaW4gU1RBTiBhbmQgdmVyaWZpZWQgdGhhdCB0aGUgbnVtZXJpY2FsIHNvbHV0aW9ucyBjb252ZXJnZWQuIFVubGVzcyBzdGF0ZWQgb3RoZXJ3aXNlLCB3ZSB1c2UgbWVkaWFucyBhbmQgOTUlIGhpZ2hlc3QgZGVuc2l0eSBpbnRlcnZhbHMgKEhESXMpIHRvIHN1bW1hcmlzZSBhbGwgcG9zdGVyaW9yIGRpc3RyaWJ1dGlvbnMuIEEgOTUlIEhESSBtZWFucyB0aGF0IHRoZXJlIGlzIGEgOTUlIHByb2JhYmlsaXR5IGZvciBhIGdpdmVuIHBhcmFtZXRlciB0byBiZSBpbiB0aGUgc3BlY2lmaWVkIGludGVydmFsLgoKYGBge3IgaW5jbHVkZT1GQUxTRX0KIyMgTW9kZWwgZGlhZ25vc3RpY3MKY2hlY2tfZGl2ZXJnZW5jZXMobWZpdCkKY2hlY2tfZW5lcmd5KG1maXQpCmNoZWNrX2htY19kaWFnbm9zdGljcyhtZml0KQpjaGVja190cmVlZGVwdGgobWZpdCkKbG9vKG1maXQpCmBgYAoKYGBge3J9CiMgV2UgZXh0cmFjdCB0aGUgcG9zdGVyaW9yIGludG8gYSBtb3JlIGFtZW5hYmxlIGZvcm1hdDoKcG9zdGVyaW9yIDwtIHJzdGFuOjpleHRyYWN0KG1maXQpCnJtKG1maXQpCgojIE9idGFpbiBwb3N0ZXJpb3IgcHJlZGljdGlvbnMKbXlwcmVkIDwtIGRhdGEuZnJhbWUoQSA9IHN0YW5fZCR5dCwKICAgICAgICAgICAgICAgICAgICAgICAgICBsbyA9IGFwcGx5KHBvc3RlcmlvciRwcmVkY2NkZiwgMiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhESW9mTUNNQylbMSwgXSwKICAgICAgICAgICAgICAgICAgICAgICAgICBtZCA9IGFwcGx5KHBvc3RlcmlvciRwcmVkY2NkZiwgMiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhbiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgaGkgPSBhcHBseShwb3N0ZXJpb3IkcHJlZGNjZGYsIDIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIRElvZk1DTUMpWzIsIF0pCgojIENvbWJpbmUgd2l0aCBkYXRhCnp6IDwtIGNiaW5kKHp6LCBteXByZWQpCgojIENvbGxlY3QgaHlwZXJwYXJhbWV0ZXJzCnBvc3RfaHlwZXIgPC0gYXMuZGF0YS5mcmFtZShjYmluZChwb3N0ZXJpb3IkYWxwaGFfaywgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3N0ZXJpb3IkYmV0YV9rLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zdGVyaW9yJGFfc2lnbWEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3N0ZXJpb3IkYl9zaWdtYSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvc3RlcmlvciRscF9fKSkKbmFtZXMocG9zdF9oeXBlcikgPC0gYygiYWxwaGFfayIsICJiZXRhX2siLCAiYV9zaWdtYSIsICJiX3NpZ21hIiwgImxvZ3Bvc3RlcmlvciIpCmBgYAoKIyBSZXN1bHRzCgojIyBNb2RlbCBmaXRzIGFuZCByZXNpZHVhbHMKCldlIGV4cHJlc3MgdGhlIHNpemUgZGlzdHJpYnV0aW9ucyBvZiBsYXJnZSBsYW5kc2xpZGVzIGluIGN1bXVsYXRpdmUgZm9ybSB1c2luZyB0aGUgZXhjZWVkYW5jZSBwcm9iYWJpbGl0eSAkcCQgZm9yIGEgZ2l2ZW4gbGFuZHNsaWRlIGFyZWEuCgpgYGB7ciBHUEQtbW9kZWxmaXQsIGZpZy5oZWlnaHQgPSAxMCwgZmlnLndpZHRoID0gMTAsIGZpZy5jYXAgPSAnU2l6ZSBhbmQgZnJlcXVlbmN5IG9mIGxhcmdlIGxhbmRzbGlkZXMgZnJvbSBpbnZlbnRvcmllcyB0aGF0IHJlcG9ydGVkIGF0IGxlYXN0IDI1IHNsb3BlIGZhaWx1cmVzIGFmZmVjdGluZyA+MC4xIGttXjJeIGVhY2guIENpcmNsZXMgYXJlIG9ic2VydmVkIGRhdGEgcmFua2VkIGJ5IHRoZWlyIGVtcGlyaWNhbCBleGNlZWRhbmNlIHByb2JhYmlsaXRpZXMsIGFuZCBsaW5lcyBhcmUgcG9zdGVyaW9yIG1lZGlhbnMgb2YgYSBmaXR0ZWQgbXVsdGktbGV2ZWwgR2VuZXJhbGlzZWQgUGFyZXRvIGRpc3RyaWJ1dGlvbiAoR1BEKSB3aXRoIHNoYWRlZCA5NSUgaGlnaGVzdCBkZW5zaXR5IGludGVydmFscyAoSERJcykuJ30KZ2dwbG90KHp6LCBhZXMoeCA9IHh4LAogICAgICAgICAgICAgICB5ID0gbWQsCiAgICAgICAgICAgICAgIGNvbCA9IGZhY3RvcihJbnZlbnRvcnkpKSkgKwogIGdlb21fbGluZSgpICsKICBnZW9tX3JpYmJvbihhZXMoeW1pbiA9IGhpLCB5bWF4ID0gbG8sIGZpbGwgPSBmYWN0b3IoSW52ZW50b3J5KSksIAogICAgICAgICAgICAgIGFscGhhID0gMC4zNSwgbGluZXdpZHRoID0gMCkgKwogIHNjYWxlX2NvbG9yX3ZpcmlkaXNfZChiZWdpbiA9IDEsIGVuZCA9IDApICsKICBnZW9tX3BvaW50KGRhdGEgPSB6eiwgYWVzKHggPSB4eCwgeSA9IHApLCBhbHBoYSA9IDIvMykgKwogIGxhYnMoeCA9IGV4cHJlc3Npb24ocGFzdGUoIkxhbmRzbGlkZSBhcmVhICgiLCBrbV4yLCAiKSIpKSwgCiAgICAgICB5ID0gIkVtcGlyaWNhbCBleGNlZWRhbmNlIHByb2JhYmlsaXR5IikgKwogIHNjYWxlX3hfbG9nMTAoYnJlYWtzID0gdHJhbnNfYnJlYWtzKCJsb2cxMCIsIGZ1bmN0aW9uKHgpIDEwIF4geCwgbiA9IDMpLAogICAgICAgICAgICAgICAgbGFiZWxzID0gdHJhbnNfZm9ybWF0KCJsb2cxMCIsIG1hdGhfZm9ybWF0KDEwIF4gLngpKSkgKwogIHNjYWxlX3lfbG9nMTAoYnJlYWtzID0gdHJhbnNfYnJlYWtzKCJsb2cxMCIsIGZ1bmN0aW9uKHgpIDEwIF4geCwgbiA9IDMpLAogICAgICAgICAgICAgICAgbGFiZWxzID0gdHJhbnNfZm9ybWF0KCJsb2cxMCIsIG1hdGhfZm9ybWF0KDEwIF4gLngpKSkgKwogIHRoZW1lX2J3KCkgKwogIHRoZW1lKGFzcGVjdC5yYXRpbyA9IDAuNiwgCiAgICAgICAgbGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKSArCiAgZmFjZXRfd3JhcCggfiBJbnZlbnRvcnksIG5jb2wgPSA1KQpgYGAKClRvIGV4cHJlc3MgaG93IHdlbGwgdGhlIEdQRCBtb2RlbCBmaXRzIHRoZSBkYXRhLCB3ZSBjb21wdXRlIHRoZSByZXNpZHVhbHMgaW4gdGVybXMgb2YgdGhlIGxvZy1vZGRzIHJhdGlvcyBiZXR3ZWVuIHRoZSBlbXBpcmljYWwgZXhjZWVkYW5jZSBwcm9iYWJpbGl0aWVzICgkcCQpIGFuZCB0aGUgcHJlZGljdGVkIGF2ZXJhZ2VzICgkXGhhdCBwJCkgZm9yIGVhY2ggaW52ZW50b3J5LiBUaGUgbG9nLW9kZHMgcmF0aW8gaXMgJFxsb2cgXGZyYWN7XGhhdCBwKDEgLSBwKX17cCAoMS1caGF0IHApfSQsIGNvbmRpdGlvbmVkIG9uIGVhY2ggb2JzZXJ2ZWQgbGFuZHNsaWRlLiBBIHBvc2l0aXZlIChuZWdhdGl2ZSkgbG9nLW9kZHMgcmF0aW8gbWVhbnMgdGhhdCB0aGUgbW9kZWwgb3ZlcmVzdGltYXRlcyAodW5kZXJlc3RpbWF0ZXMpIHRoZSBlbXBpcmljYWwgZXhjZWVkYW5jZSBwcm9iYWJpbGl0eSBvZiBhIGdpdmVuIGxhbmRzbGlkZSBhcmVhLgoKYGBge3IgR1BELXJlc2lkdWFscywgd2FybmluZyA9IEZBTFNFLCBmaWcuaGVpZ2h0ID0gMTAsIGZpZy53aWR0aCA9IDEwLCBmaWcuY2FwID0gJ1Jlc2lkdWFscyBvZiBtdWx0aS1sZXZlbCBHUEQgZml0IHRvIGxhcmdlIGxhbmRzbGlkZSBzaXplIGRpc3RyaWJ1dGlvbnM7IHJlc2lkdWFscyBhcmUgZXhwcmVzc2VkIGFzIGFuIGxvZy1vZGRzIHJhdGlvIG9mIG9ic2VydmVkIHZlcnN1cyBwcmVkaWN0ZWQgdmFsdWVzLiBEYXNoZWQgaG9yaXpvbnRhbCBsaW5lIG1hcmtzIHBlcmZlY3QgZml0OyBwb3NpdGl2ZSAobmVnYXRpdmUpIHJhdGlvcyBpbmRpY2F0ZSBvdmVyLSh1bmRlci0pIGVzdGltYXRlZCBleGNlZWRhbmNlIHByb2JhYmlsaXRpZXMuIFNoYWRlZCBhcmVhcyBhcmUgcG9pbnQtd2lzZSA5NSUgSERJcyBlc3RpbWF0ZWQgYXQgZWFjaCBsYW5kc2xpZGUgb2JzZXJ2YXRpb24uJ30KIyBQbG90IHJlc2lkdWFscyBpbiBleGNlZWRhbmNlIHByb2JhYmlsaXR5CmdncGxvdCh6eiAlPiUgZmlsdGVyKHAgPCAxKSwgCiAgICAgICBhZXMoeCA9IHh4LAogICAgICAgICAgIHkgPSAtbG9nKChwIC8gKDEgLSBwKSkgLyAobWQgLyAoMSAtIG1kKSkpLAogICAgICAgICAgIGNvbCA9IGZhY3RvcihJbnZlbnRvcnkpKSkgKwogIGdlb21fcmliYm9uKGFlcyh5bWluID0gLWxvZygocCAvICgxIC0gcCkpIC8gKGhpIC8gKDEgLSBoaSkpKSwgCiAgICAgICAgICAgICAgICAgIHltYXggPSAtbG9nKChwIC8gKDEgLSBwKSkgLyAobG8gLyAoMSAtIGxvKSkpLCAKICAgICAgICAgICAgICAgICAgZmlsbCA9IGZhY3RvcihJbnZlbnRvcnkpKSwgCiAgICAgICAgICAgICAgYWxwaGEgPSAwLjM1LCBsd2QgPSAwKSArCiAgc2NhbGVfY29sb3JfdmlyaWRpc19kKCkgKwogIGdlb21fYWJsaW5lKHNsb3BlID0gMCwgaW50ZXJjZXB0ID0gMCwgbHR5ID0gMikgKwogIGdlb21fcG9pbnQoYWxwaGEgPSAyLzMpICsKICBsYWJzKHggPSBleHByZXNzaW9uKHBhc3RlKCJMYW5kc2xpZGUgYXJlYSAoIiwga21eMiwgIikiKSksIAogICAgICAgeSA9ICJMb2ctb2RkcyByYXRpbyIpICsKICBzY2FsZV94X2xvZzEwKGJyZWFrcyA9IHRyYW5zX2JyZWFrcygibG9nMTAiLCBmdW5jdGlvbih4KSAxMCBeIHgsIG4gPSAzKSwKICAgICAgICAgICAgICAgIGxhYmVscyA9IHRyYW5zX2Zvcm1hdCgibG9nMTAiLCBtYXRoX2Zvcm1hdCgxMCBeIC54KSkpICsKICB5bGltKC0yLCAyKSArCiAgdGhlbWVfYncoKSArCiAgdGhlbWUoYXNwZWN0LnJhdGlvID0gMC42LCBsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpICsKICBmYWNldF93cmFwKCB+IEludmVudG9yeSwgbmNvbCA9IDUpCgojIFNhdmUgcG9zdGVyaW9yIGxvZy1vZGRzIHJhdGlvcwpwb3N0X2xvZ29kZHMgPC0genogJT4lIAogIGdyb3VwX2J5KEludmVudG9yeSkgJT4lIAogIHN1bW1hcmlzZShsb19sb2dvZGRzID0gSERJb2ZNQ01DKGxvZygocCAvICgxIC0gcCkpIC8gKG1kIC8gKDEgLSBtZCkpKSlbMV0sCiAgICAgICAgICAgIGhpX2xvZ29kZHMgPSBIRElvZk1DTUMobG9nKChwIC8gKDEgLSBwKSkgLyAobWQgLyAoMSAtIG1kKSkpKVsyXSwKICAgICAgICAgICAgSERJX2xvZ29kZHMgPSBoaV9sb2dvZGRzIC0gbG9fbG9nb2RkcykKYGBgCldlIGZpbmQgdGhhdCB0aGUgbG9nLW9kZHMgcmF0aW9zIHJldmVhbCBtb3N0IG1pc21hdGNoZXMgYXQgZWl0aGVyIGV4dHJlbWUgZW5kIG9mIHRoZSBzaXplIHJhbmdlLCB0aG91Z2ggd2l0aG91dCBhbnkgY29uc2lzdGVuY3kgYWNyb3NzIHRoZSBpbnZlbnRvcmllcy4gRm9yIGV4YW1wbGUsIHRoZSBtb2RlbCB1bmRlcmVzdGltYXRlcyB0aGUgZXhlY2VlZGFuY2UgcHJvYmFiaWxpdGllcyBvZiBsYW5kc2xpZGUgYXJlYXMgPDAuOCBrbV4yXiBpbiBjYXRhbG9ndWVzIGByIHp6ICU+JSBmaWx0ZXIocCA8IDEpICU+JSBtdXRhdGUobG8gPSAoKHAgLyAoMSAtIHApKSAvIChtZCAvICgxIC0gbWQpKSkpICU+JSBncm91cF9ieShJbnZlbnRvcnkpICU+JSBzdW1tYXJpc2UocWxvID0gcXVhbnRpbGUobG8sIDAuNzUpKSAlPiUgYXJyYW5nZShxbG8pICU+JSBsYXN0KCkgJT4lIHNlbGVjdChJbnZlbnRvcnkpICU+JSBhcy5jaGFyYWN0ZXIoKWAgW0B0YW55YXNfcHJlc2VudGF0aW9uXzIwMTddIGFuZCBPd3loZWUgVVNBIFtAU2FmcmFuOjIwMTFhYV0sIHdoaWxlIG92ZXJlc3RpbWF0aW5nIHRoZSBleGVjZWVkYW5jZSBwcm9iYWJpbGl0aWVzIG9mIGxhbmRzbGlkZSBhcmVhcyA+MS43IGttXjJeIGluIGNhdGFsb2d1ZSBEYXVuYSBBcGVubmluZXMgSVRBIFtAZXNzZC0xNS03NTMtMjAyM10uCgoKIyMgRWZmZWN0cyBvZiBkaWZmZXJlbnQgbGFuZHNsaWRlIGludmVudG9yaWVzCgpgYGB7ciBQb3N0ZXJpb3JfaywgZmlnLmhlaWdodCA9IDgsIGZpZy53aWR0aCA9IDYsIHdhcm5pbmcgPSBGQUxTRSwgZmlnLmNhcCA9ICdQb3N0ZXJpb3Igc2hhcGUgcGFyYW1ldGVyICRrJCBvZiB0aGUgR1BEOyB0aGlzIHBhcmFtZXRlciBpcyB0aGUgaW52ZXJzZSBvZiB0aGUgc2NhbGluZyBleHBvbmVudCBpbiBwb3dlci1sYXcgZGlzdHJpYnV0aW9ucy4gV2hpdGUgY2lyY2xlcyBhcmUgdGhlIG1lZGlhbnMgcGVyIGludmVudG9yeSwgYW5kIGJsYWNrIGhvcml6b250YWwgbGluZXMgYXJlIDk1JSBIRElzOyB2ZXJ0aWNhbCBncmV5IGxpbmUgaXMgdGhlIHBvc3RlcmlvciBtZWRpYW4gb2YgdGhlIHBvb2xlZCBtb2RlbCwgYW5kIGRhc2hlZCBsaW5lcyBkZWxpbWl0IHRoZSA5NSUgSERJcy4nfQojIEV4dHJhY3QgYW5kIHBsb3QgZXN0aW1hdGVzIG9mIHNoYXBlIHBhcmFtZXRlciBrCnBvc3RfayA8LSBwb3N0ZXJpb3Ikawpjb2xuYW1lcyhwb3N0X2spIDwtIHVuaXF1ZSh6eiRJbnZlbnRvcnkpCnBvc3RfayA8LSBtZWx0KHBvc3RfaywgdmFsdWUubmFtZSA9ICJrIikKY29sbmFtZXMocG9zdF9rKSA8LSBjKCJpdGVyYXRpb25zIiwgIkludmVudG9yeSIsICJrIikKCnBvc3RfayAlPiUgCiAgZ3JvdXBfYnkoSW52ZW50b3J5KSAlPiUgCiAgbXV0YXRlKG1kX2dycF9rID0gbWVkaWFuKGspKSAlPiUgCiAgZ2dwbG90KGFlcyh4ID0gaywgCiAgICAgICAgICAgICB5ID0gZmN0X3Jlb3JkZXIoSW52ZW50b3J5LCBtZF9ncnBfayksIAogICAgICAgICAgICAgZmlsbCA9IGZjdF9yZW9yZGVyKEludmVudG9yeSwgbWRfZ3JwX2spKSkgKwogIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IG1lZGlhbihwb3N0X2h5cGVyJGFscGhhX2sgLyBwb3N0X2h5cGVyJGJldGFfayksIAogICAgICAgICAgICAgY29sb3IgPSAiZGFya2dyZXkiKSArCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gSERJb2ZNQ01DKHBvc3RfaHlwZXIkYWxwaGFfayAvIHBvc3RfaHlwZXIkYmV0YV9rKSwgCiAgICAgICAgICAgICBsaW5ldHlwZSA9ICJkYXNoZWQiLCBjb2xvciA9ICJkYXJrZ3JleSIpICsKICBzdGF0X2hhbGZleWUoCiAgICAgICAgICAgICAgIGludGVydmFsX3NpemUgPSAwLjUsIAogICAgICAgICAgICAgICBzaGFwZSA9IDIxLAogICAgICAgICAgICAgICBwb2ludF9jb2xvciA9ICJyZWQiLAogICAgICAgICAgICAgICBwb2ludF9maWxsID0gIndoaXRlIiwKICAgICAgICAgICAgICAgcG9pbnRfc2l6ZSA9IDEuNSwKICAgICAgICAgICAgICAgc2hvdy5sZWdlbmQgPSBGQUxTRQogICAgICAgICAgICAgICApICsKICBzY2FsZV9maWxsX3ZpcmlkaXNfZCgpICsKICB4bGltKDAsIDEuMjUpICsKICBsYWJzKHggPSBleHByZXNzaW9uKGtbal0pLCB5ID0gTlVMTCkgKwogIHRoZW1lX2J3KCkgKwogIHRoZW1lKGFzcGVjdC5yYXRpbyA9IDQpCmBgYAoKYGBge3J9CiMgR3JvdXAgc3VtbWFyeSBvZiBwb3N0ZXJpb3Igawpwb3N0X2tfZ3JwIDwtIHBvc3RfayAlPiUKICBncm91cF9ieShJbnZlbnRvcnkpICU+JQogIHN1bW1hcmlzZShtZF9ncnBfayA9IG1lZGlhbihrKSwKICAgICAgICAgICAgaGRpX2xvX2dycF9rID0gSERJb2ZNQ01DKGspWzFdLAogICAgICAgICAgICBoZGlfaGlfZ3JwX2sgPSBIRElvZk1DTUMoaylbMl0sCiAgICAgICAgICAgIHdoZGlfZ3JwX2sgPSBIRElvZk1DTUMoaylbMl0gLSBIRElvZk1DTUMoaylbMV0pCgojIEdyb3VwIHN1bW1hcnkgb2YgcG9zdGVyaW9yIGFscGhhID0gMSAvIGsKcG9zdF9hbHBoYV9ncnAgPC0gcG9zdF9rICU+JQogIGdyb3VwX2J5KEludmVudG9yeSkgJT4lCiAgc3VtbWFyaXNlKG1kX2dycF9hbHBoYSA9IG1lZGlhbigxIC8gayksCiAgICAgICAgICAgIGhkaV9sb19ncnBfYWxwaGEgPSBIRElvZk1DTUMoMSAvIGspWzFdLAogICAgICAgICAgICBoZGlfaGlfZ3JwX2FscGhhID0gSERJb2ZNQ01DKDEgLyBrKVsyXSwKICAgICAgICAgICAgd2hkaV9ncnBfYWxwaGEgPSBIRElvZk1DTUMoMSAvIGspWzJdIC0gSERJb2ZNQ01DKDEgLyBrKVsxXSkKYGBgCgpPdXIgbW9kZWwgZXN0aW1hdGVzIHNoYXBlIHBhcmFtZXRlcnMgJGtfaiQgdGhhdCB2YXJ5IGFjcm9zcyB0aGUgbGFuZHNsaWRlIGludmVudG9yaWVzIHdpdGggcG9zdGVyaW9yIG1lZGlhbnMgcmFuZ2luZyBmcm9tICRcdGlsZGV7a31faiQgPSBgciBwb3N0X2tfZ3JwICU+JSBhcnJhbmdlKG1kX2dycF9rKSAlPiUgZmlyc3QoKSAlPiUgZHBseXI6OnNlbGVjdChtZF9ncnBfaykgJT4lIGFzLm51bWVyaWMoKSAlPiUgcm91bmQoMilgIGluIGNhdGFsb2d1ZSBgciBwb3N0X2tfZ3JwICU+JSBhcnJhbmdlKG1kX2dycF9rKSAlPiUgZmlyc3QoKSAlPiUgZHBseXI6OnNlbGVjdChJbnZlbnRvcnkpICU+JSB1bmxpc3QoKSAlPiUgYXMuY2hhcmFjdGVyKClgIFtAWHU6MjAyMGFhXSB0byAkXHRpbGRle2t9X2okID0gYHIgcG9zdF9rX2dycCAlPiUgYXJyYW5nZShtZF9ncnBfaykgJT4lIGxhc3QoKSAlPiUgZHBseXI6OnNlbGVjdChtZF9ncnBfaykgJT4lIGFzLm51bWVyaWMoKSAlPiUgcm91bmQoMilgIGluIGNhdGFsb2d1ZSBgciBwb3N0X2tfZ3JwICU+JSBhcnJhbmdlKG1kX2dycF9rKSAlPiUgbGFzdCgpICU+JSBkcGx5cjo6c2VsZWN0KEludmVudG9yeSkgJT4lIHVubGlzdCgpICU+JSBhcy5jaGFyYWN0ZXIoKWAgW0BHb3J1bToyMDE0YWFdLiBOYXJyb3dlciBwb3N0ZXJpb3IgZGlzdHJpYnV0aW9ucyBtZWFuIGxlc3MgdW5jZXJ0YWludHksIG1haW5seSBvd2luZyB0byBtb3JlIGxhcmdlIGxhbmRzbGlkZXMgdGhhdCBpbmZvcm0gdGhlIG1vZGVsIGluIHRoZSByZWxldmFudCBjYXRhbG9ndWUuIEZvciBleGFtcGxlLCB0aGUgYHIgenogJT4lIGdyb3VwX2J5KEludmVudG9yeSkgJT4lIHN1bW1hcmlzZShuID0gbigpKSAlPiUgYXJyYW5nZShkZXNjKG4pKSAlPiUgZmlyc3QoKSAlPiUgZHBseXI6OnNlbGVjdChJbnZlbnRvcnkpICU+JSBhcy5jaGFyYWN0ZXIoKWAgaW52ZW50b3J5IFtARnVzY286MjAyM2FhXSBjb250YWlucyBtb3N0LCBpLmUuIGByIHp6ICU+JSBncm91cF9ieShJbnZlbnRvcnkpICU+JSBzdW1tYXJpc2UobiA9IG4oKSkgJT4lIGFycmFuZ2UoZGVzYyhuKSkgJT4lIGZpcnN0KCkgJT4lIGRwbHlyOjpzZWxlY3QobikgJT4lIGFzLm51bWVyaWMoKWAsIGxhcmdlIGxhbmRzbGlkZXMsIGFuZCBpdHMgOTUlIEhESSBpcyBuYXJyb3dlc3QgKGByIHBvc3Rfa19ncnAgJT4lIGFycmFuZ2Uod2hkaV9ncnBfaykgJT4lIGZpcnN0KCkgJT4lIGRwbHlyOjpzZWxlY3QoaGRpX2xvX2dycF9rKSAlPiUgYXMubnVtZXJpYygpICU+JSByb3VuZCgyKWAgXDwgJGtfaiQgXDwgYHIgcG9zdF9rX2dycCAlPiUgYXJyYW5nZSh3aGRpX2dycF9rKSAlPiUgZmlyc3QoKSAlPiUgZHBseXI6OnNlbGVjdChoZGlfaGlfZ3JwX2spICU+JSBhcy5udW1lcmljKCkgJT4lIHJvdW5kKDIpYCkuIEluIGNvbnRyYXN0LCB0aGUgYHIgenogJT4lIGdyb3VwX2J5KEludmVudG9yeSkgJT4lIHN1bW1hcmlzZShuID0gbigpKSAlPiUgYXJyYW5nZShuKSAlPiUgZmlyc3QoKSAlPiUgZHBseXI6OnNlbGVjdChJbnZlbnRvcnkpICU+JSBhcy5jaGFyYWN0ZXIoKWAgW0BHb3J1bToyMDE0YWFdIGNhdGFsb2d1ZSBoYXMgdGhlIGZld2VzdCwgaS5lLiBgciB6eiAlPiUgZ3JvdXBfYnkoSW52ZW50b3J5KSAlPiUgc3VtbWFyaXNlKG4gPSBuKCkpICU+JSBhcnJhbmdlKG4pICU+JSBmaXJzdCgpICU+JSBkcGx5cjo6c2VsZWN0KG4pICU+JSBhcy5udW1lcmljKClgLCBsYXJnZSBsYW5kc2xpZGVzOyBpdHMgYnJvYWQgcG9zdGVyaW9yIGRpc3RyaWJ1dGlvbiBpcyB0aHVzIGluZm9ybWVkIG1vcmUgYnkgdGhlIHBvb2xlZCBlc3RpbWF0ZSBmcm9tIGFsbCBpbnZlbnRvcmllcyB0b2dldGhlci4KClRoZSBtZWFuIG9mIHRoZSBHYW1tYSBwcmlvciBkaXN0cmlidXRpb24gaXMgJFxiYXJ7a30gPSBcYWxwaGFfayAvIFxiZXRhX3trfSQgYnkgZGVmaW5pdGlvbiwgYW5kIHdlIGRlcml2ZSB0aGUgcG93ZXItbGF3IGV4cG9uZW50ICRcYWxwaGEkIGZyb20gdGhlIGlkZW50aXR5ICRcYWxwaGEgPSAxIC8gayQuIFNpbWlsYXJseSwgd2Ugb2J0YWluIHRoZSBtZWFuIHBvb2xlZCBwb3N0ZXJpb3IgJFxiYXJ7XHNpZ21hfSA9IFxhbHBoYV9cc2lnbWEgLyBcYmV0YV97XHNpZ21hfSQgZnJvbSB0aGUgc2FtcGxlZCBoeXBlcnBhcmFtZXRlcnMuIFdlIGZpbmQgdGhhdCBtb3N0IG9mIHRoZSA5NSUgY3JlZGlibGUgaW50ZXJ2YWxzIG9mICRrX2okIG92ZXJsYXAgd2l0aCB0aGF0IG9mIHRoZSBtZWFuICRcYmFye2t9JCBsZWFybmVkIGZyb20gdGhlIHBvb2xlZCBtb2RlbCAoZ3JleSB2ZXJ0aWNhbCBsaW5lLCBmbGFua2VkIGJ5IGRhc2hlZCBsaW5lcyBtYXJraW5nIGl0cyA5NSUgSERJKS4gT25seSB0d28gaW52ZW50b3JpZXMsIGkuZS4gb25lIG9uIGhpc3RvcmljIHJvY2sgYXZhbGFuY2hlcyBpbiB0aGUgU3QuIEVsaWFzIG1vdW50YWlucyBvZiBBbGFza2EsIFVuaXRlZCBTdGF0ZXMgW1N0LiBFbGlhcyBVU0EsIEAxMC4zMzg5L2ZlYXJ0LjIwMjAuMDAyOTNdLCBhbmQgb25lIG9uIGxhbmRzbGlkZXMgdHJpZ2dlcmVkIGJ5IHRoZSAxOTIwIEhhaXl1YW4gZWFydGhxdWFrZSwgQ2hpbmEgW0BYdToyMDIwYWFdLCBzdGFuZCBvdXQgd2l0aCBhICRrX2okIHRoYXQgaXMgY3JlZGlibHkgYmVsb3cgdGhhdCBvZiB0aGUgcG9wdWxhdGlvbiBhdmVyYWdlLiAKCkVzdGltYXRlcyBvZiAka19qJCBjYW4gZGlmZmVyIGNyZWRpYmx5IGJldHdlZW4gaW52ZW50b3JpZXMgaW4gdGhlIHNhbWUgZ2VvZ3JhcGhpYyByZWdpb24gc3VjaCBhcyB3ZXN0ZXJuIENhbmFkYSBhbmQgQWxhc2thLCBmb3IgZXhhbXBsZSB3aGVuIGNvbXBhcmluZyBTdC4gRWxpYXMgVVNBIFtAMTAuMzM4OS9mZWFydC4yMDIwLjAwMjkzXTsgS2x1YW5lLCBDQU4tVVNBIChXLiBTbWl0aCwgcGVycy4gY29tbS4pOyBhbmQgTTcuOSBBbGFza2EgVVNBIFtAR29ydW06MjAxNGFhXS4gT24gdGhlIGNvbnRyYXJ5LCBpbnZlbnRvcmllcyBjb3ZlcmluZyB2ZXJ5IGRpZmZlcmVudCBnZW9ncmFwaGljIHJlZ2lvbnMgYW5kIHRpbWUgc3BhbnMgY2FuIGhhdmUgbGFyZ2VseSBvdmVybGFwcGluZywgYW5kIHRodXMgc3RhdGlzdGljYWxseSBpbmRpZmZlcmVudCwgcG9zdGVyaW9yIGRpc3RyaWJ1dGlvbnMgb2YgJGtfaiQuIFRoaXMgaXMgdGhlIGNhc2UsIGZvciBleGFtcGxlLCBmb3IgYSBjYXRhbG9ndWUgb2YgbGFuZHNsaWRlcyB0cmlnZ2VyZWQgYnkgdGhlIE03LjYgS2FzaG1pciBlYXJ0aHF1YWtlIGluIDIwMDUgW003LjYgUEFLIDMsIEBCYXNoYXJhdDoyMDE2YWFdLCBhbmQgb25lIG9uIG1vc3RseSBRdWF0ZXJuYXJ5IGxhbmRzbGlkZXMgaW4gdGhlIENhc3BpYW4gU2VhIGJhc2luIFtDYXNwaWFuIFNlYSBLQVosIEAxMC4xMTMwL0czODI1OS4xXS4gU2ltaWxhcmx5LCB0aGUgaW52ZW50b3J5IG9mIHJhaW5mYWxsLXRyaWdnZXJlZCBsYW5kc2xpZGVzIGluIGZhciB3ZXN0ZXJuIE5lcGFsIGNvdmVyaW5nIDc5IHRpbWUgc3RlcHMgYmV0d2VlbiAyMDAyIGFuZCAyMDE4IFtGYXIgV2VzdGVybiBOUEwsIEBhbGJlcnRvX211bm96X3RvcnJlcm9fbWFuY2hhZG9fMjAyMF80MjkwMTAwXSwgYW5kIHRoZSBvbmUgb24gbGFuZHNsaWRlcyBmb2xsb3dpbmcgdGhlIDIwMTggTTcuNSBQb3JnZXJhIGVhcnRocXVha2UgaW4gUGFwdWEgTmV3IEd1aW5lYSwgYSBkYXRhYmFzZSBmdWxseSBjb21waWxlZCBieSBhIGRlZXAgbGVhcm5pbmcgYWxnb3JpdGhtIFtQb3JnZXJhKiBQTkcsIEBCaHV5YW46MjAyM2FhXSwgaGF2ZSBpbmRpc3Rpbmd1aXNoYWJsZSBwb3N0ZXJpb3IgZGlzdHJpYnV0aW9ucyBvZiAka19qJC4KCmBgYHtyIFBvc3Rlcmlvcl9zaWcsIGZpZy5oZWlnaHQgPSA4LCBmaWcud2lkdGggPSA2LCB3YXJuaW5nID0gRkFMU0UsIGZpZy5jYXAgPSAiUG9zdGVyaW9yIHJvbGwtb3ZlciBpbiB0ZXJtcyBvZiB0aGUgR1BEIHNjYWxlIHBhcmFtZXRlci4gV2hpdGUgY2lyY2xlcyBhcmUgdGhlIG1lZGlhbnMgcGVyIGludmVudG9yeSwgYW5kIGJsYWNrIGhvcml6b250YWwgbGluZXMgYXJlIDk1JSBIRElzOyB2ZXJ0aWNhbCBncmV5IGxpbmUgaXMgdGhlIHBvc3RlcmlvciBtZWRpYW4gb2YgdGhlIHBvb2xlZCBtb2RlbCwgYW5kIGRhc2hlZCBsaW5lcyBkZWxpbWl0IHRoZSA5NSUgSERJcy4gUmVkIHZlcnRpY2FsIGRhc2hlZCBsaW5lIGlzIHRoZSBsYW5kc2xpZGUgc2l6ZSB0aHJlc2hvbGQgb2YgMC4xIGttJF4yJC4ifQojIFBsb3QgZXN0aW1hdGVzIG9mIHNjYWxlIHBhcmFtZXRlciBzaWdtYSAKcG9zdF9zaWcgPC0gcG9zdGVyaW9yJHNpZ21hCmNvbG5hbWVzKHBvc3Rfc2lnKSA8LSB1bmlxdWUoenokSW52ZW50b3J5KQpwb3N0X3NpZyA8LSBtZWx0KHBvc3Rfc2lnLCB2YWx1ZS5uYW1lID0gInNpZyIpCmNvbG5hbWVzKHBvc3Rfc2lnKSA8LSBjKCJpdGVyYXRpb25zIiwgIkludmVudG9yeSIsICJzaWciKQoKcG9zdF9zaWcgJT4lIAogIGdyb3VwX2J5KEludmVudG9yeSkgJT4lIAogIG11dGF0ZShtZF9ncnBfc2lnID0gbWVkaWFuKHNpZykpICU+JSAKICBnZ3Bsb3QoYWVzKHggPSBzaWcsIAogICAgICAgICAgICAgeSA9IGZjdF9yZW9yZGVyKEludmVudG9yeSwgbWRfZ3JwX3NpZyksIAogICAgICAgICAgICAgZmlsbCA9IGZjdF9yZW9yZGVyKEludmVudG9yeSwgbWRfZ3JwX3NpZykpKSArCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gIG1lZGlhbihwb3N0X2h5cGVyJGFfc2lnbWEgLyBwb3N0X2h5cGVyJGJfc2lnbWEpLCAKICAgICAgICAgICAgIGNvbG9yID0gImRhcmtncmV5IikgKwogIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IEhESW9mTUNNQyhwb3N0X2h5cGVyJGFfc2lnbWEgLyBwb3N0X2h5cGVyJGJfc2lnbWEpLAogICAgICAgICAgICAgbGluZXR5cGUgPSAiZGFzaGVkIiwgY29sb3IgPSAiZGFya2dyZXkiKSArCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gbWluX3NpemUsIAogICAgICAgICAgICAgbGluZXR5cGUgPSAiZGFzaGVkIiwgY29sb3IgPSAicmVkIikgKwogIHN0YXRfaGFsZmV5ZSgKICAgIGludGVydmFsX3NpemUgPSAwLjUsIAogICAgc2hhcGUgPSAyMSwKICAgIHBvaW50X2NvbG9yID0gInJlZCIsCiAgICBwb2ludF9maWxsID0gIndoaXRlIiwKICAgIHBvaW50X3NpemUgPSAxLjUsCiAgICBzaG93LmxlZ2VuZCA9IEZBTFNFCiAgKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzX2QoKSArCiAgc2NhbGVfeF9sb2cxMChleHByZXNzaW9uKHBhc3RlKHNpZ21hW2pdLCAiICgiLCBrbV4yLCAiKSIpKSwKICAgICAgICBicmVha3MgPSB0cmFuc19icmVha3MoImxvZzEwIiwgZnVuY3Rpb24oeCkgMTAgXiB4KSwKICAgICAgICBsYWJlbHMgPSB0cmFuc19mb3JtYXQoImxvZzEwIiwgbWF0aF9mb3JtYXQoMTAgXiAueCkpKSArCiAgbGFicyh5ID0gTlVMTCkgKwogIHRoZW1lX2J3KCkgKwogIHRoZW1lKGFzcGVjdC5yYXRpbyA9IDQpCmBgYAoKYGBge3J9CiMgR3JvdXAgc3VtbWFyeSBvZiBwb3N0ZXJpb3Igc2lnbWEKcG9zdF9zaWdfZ3JwIDwtIHBvc3Rfc2lnICU+JQogIGdyb3VwX2J5KEludmVudG9yeSkgJT4lCiAgc3VtbWFyaXNlKG1kX2dycF9zaWcgPSBtZWRpYW4oc2lnKSwKICAgICAgICAgICAgaGRpX2xvX2dycF9zaWcgPSBIRElvZk1DTUMoc2lnKVsxXSwKICAgICAgICAgICAgaGRpX2hpX2dycF9zaWcgPSBIRElvZk1DTUMoc2lnKVsyXSwKICAgICAgICAgICAgd2hkaV9ncnBfc2lnID0gSERJb2ZNQ01DKHNpZylbMl0gLSBIRElvZk1DTUMoc2lnKVsxXSkKYGBgCgpUaGUgc3ByZWFkIG9mIHRoZSBwb3N0ZXJpb3Igc2NhbGUgcGFyYW1ldGVyICRcc2lnbWFfaiQgaXMgbW9yZSBwcm9ub3VuY2VkIGFjcm9zcyB0aGUgaW52ZW50b3JpZXMgc3VjaCB0aGF0IHRoZSBwb29sZWQgZXN0aW1hdGUgb3ZlcmxhcHMgd2l0aCB0aG9zZSBvZiBzZXZlbiBpbnZlbnRvcmllcyBvbmx5LiBJbnZlbnRvcnktc3BlY2lmaWMgbWVkaWFucyByYW5nZSBvdmVyIHR3byBvcmRlcnMgb2YgbWFnbml0dWRlIGZyb20gJFx0aWxkZXtcc2lnbWF9X2okID0gYHIgcG9zdF9zaWdfZ3JwICU+JSBhcnJhbmdlKG1kX2dycF9zaWcpICU+JSBmaXJzdCgpICU+JSBkcGx5cjo6c2VsZWN0KG1kX2dycF9zaWcpICU+JSBhcy5udW1lcmljKCkgJT4lIHJvdW5kKDIpYCBrbV4yXiBpbiB0aGUgYHIgcG9zdF9zaWdfZ3JwICU+JSBhcnJhbmdlKG1kX2dycF9zaWcpICU+JSBmaXJzdCgpICU+JSBkcGx5cjo6c2VsZWN0KEludmVudG9yeSkgJT4lIHVubGlzdCgpICU+JSBhcy5jaGFyYWN0ZXIoKWAgY2F0YWxvZ3VlIFtAWHU6MjAxNGFhXSB0byAkXHRpbGRle1xzaWdtYX1faiQgPSBgciBwb3N0X3NpZ19ncnAgJT4lIGFycmFuZ2UobWRfZ3JwX3NpZykgJT4lIGxhc3QoKSAlPiUgZHBseXI6OnNlbGVjdChtZF9ncnBfc2lnKSAlPiUgYXMubnVtZXJpYygpICU+JSByb3VuZCgyKWAga21eMl4gaW4gdGhlIGByIHBvc3Rfc2lnX2dycCAlPiUgYXJyYW5nZShtZF9ncnBfc2lnKSAlPiUgbGFzdCgpICU+JSBkcGx5cjo6c2VsZWN0KEludmVudG9yeSkgJT4lIHVubGlzdCgpICU+JSBhcy5jaGFyYWN0ZXIoKWAgY2F0YWxvZ3VlIFtAMTAuMTEzMC9HMzgyNTkuMV0uIEFnYWluLCBpbnZlbnRvcmllcyB3aXRoIGRpZmZlcmVudCBlbnZpcm9ubWVudGFsIHNldHRpbmdzIGFuZCBsYW5kc2xpZGUgdHJpZ2dlcnMgaGF2ZSB2ZXJ5IHNpbWlsYXIgcG9zdGVyaW9yIGRpc3RyaWJ1dGlvbnMgb2YgJFxzaWdtYV9qJCwgc3VjaCBhcyB0aGUgb25lIG9uIGxhbmRzbGlkZXMgdHJpZ2dlcmVkIGR1cmluZyBUeXBob29uIE1vcmFrb3QsIFRhaXdhbiwgaW4gMjAwOSBbVEMgTW9yYWtvdCBUV04sIEBlbWJlcnNvbl9pbnNpZ2h0c18yMDIyXSwgYW5kIHRoZSBvbmUgb24gbGFuZHNsaWRlcyB0cmlnZ2VyZWQgYnkgdGhlIE03LjYgS2FzaG1pciBlYXJ0aHF1YWtlIGluIDIwMDUgW003LjYgUEFLIDMsIEBCYXNoYXJhdDoyMDE2YWFdLiBUaGlzIGFsc28gaG9sZHMgZm9yIGRpZmZlcmVudCBpbnZlbnRvcmllcyBhZGRyZXNzaW5nIHRoZSBzYW1lIHRyaWdnZXJpbmcgZXZlbnQsIHN1Y2ggYXMgdGhlIDIwMDggV2VuY2h1YW4gZWFydGhxdWFrZSwgZm9yIGV4YW1wbGUgTTcuOSBTaWNodWFuIENITiAxIFtAWHU6MjAxNGFhXSBhbmQgTTcuOSBTaWNodWFuIENITiAyIFtAaHR0cHM6Ly9kb2kub3JnLzEwLjEwMDIvMjAxM0dDMDA1MDY3XS4gSGlnaGVyIHZhbHVlcyBvZiAkXHRpbGRle1xzaWdtYX1faiQgZXNwZWNpYWxseSBpZGVudGlmeSBpbnZlbnRvcmllcyB3aXRoIGEgbGVzcyBwcm9ub3VuY2VkLCBvciBtb3JlIGxpbWl0ZWQgcmFuZ2Ugb2YsIHBvd2VyLWxhdyBzY2FsaW5nIGZvciB0aGUgbGFyZ2UgbGFuZHNsaWRlcyByZWNvcmRlZC4gRXhhbXBsZXMgaW5jbHVkZSBtYW55IG9mIHRoZSBpbnZlbnRvcmllcyBjb250YWluaW5nIFF1YXRlcm5hcnkgbGFuZHNsaWRlcyBzdWNoIGFzIHRob3NlIG9mIHRoZSBDYXNwaWFuIFNlYSBbQ2FzcGlhbiBTZWEgS0FaLCBAMTAuMTEzMC9HMzgyNTkuMV0gb3IgdGhlIENvbHVtYmlhIFJpdmVyIGJhc2lucyBbT3d5aGVlIFVTQSwgQFNhZnJhbjoyMDExYWFdLCBidXQgYWxzbyB0aGUgYWJvdmUtbWVudGlvbmVkIGludmVudG9yaWVzIG9mIHJvY2sgYXZhbGFuY2hlcyB0aGF0IGhhcHBlbmVkIGluIHRoZSBwYXN0IGZldyBkZWNhZGVzIChTdC4gRWxpYXMgVVNBIGFuZCBLbHVhbmUgQ0FOLVVTQSkuCgojIyBQb29sZWQgZXN0aW1hdGVzIG9mIGxhbmRzbGlkZSBzY2FsaW5nCgpUaGUgcG9vbGVkIGVzdGltYXRlcyBpbiBvdXIgbXVsdGktbGV2ZWwgbW9kZWwgZXhwcmVzcyB0aGUgdmFyaWFuY2Ugb2YgdGhlIGxlYXJuZWQgcGFyYW1ldGVycyBhY3Jvc3MgYWxsIGludmVudG9yaWVzLiBUaGUgc2FtcGxlZCBoeXBlcnBhcmFtZXRlcnMgb2YgJGtfaiQgdGhhdCBkZXNjcmliZSB0aGUgc2hhcGUgJFxhbHBoYV9rJCBhbmQgcmF0ZSAob3IgaW52ZXJzZSBzY2FsZSkgJFxiZXRhX3trfSQgb2YgdGhlIEdhbW1hLWRpc3RyaWJ1dGVkIHBhcmFtZXRlciAka19qJCBhcmUgcG9zaXRpdmVseSBjb3JyZWxhdGVkOyB0aGUgc2FtZSBhcHBsaWVzIGZvciB0aGUgaHlwZXJwYXJhbWV0ZXJzICRcYWxwaGFfe1xzaWdtYX0kIGFuZCAkXGJldGFfe1xzaWdtYX0kLgoKYGBge3IgSHlwZXJfaywgZmlnLmhlaWdodCA9IDIsIGZpZy53aWR0aCA9IDMuNSwgZmlnLmNhcCA9ICdhLiBQb3N0ZXJpb3IgZGlzdHJpYnV0aW9uIG9mIHRoZSBoeXBlcnBhcmFtZXRlcnMgb2YgdGhlIEdhbW1hIGRpc3RyaWJ1dGlvbiBmcm9tIHdoaWNoIHRoZSBpbnZlbnRvcnktc3BlY2lmaWMgcG9zdGVyaW9yICRrX2okIGFyZSBkcmF3bi4gYi4gUG9zdGVyaW9yIGRpc3RyaWJ1dGlvbiBvZiB0aGUgaHlwZXJwYXJhbWV0ZXJzIG9mIHRoZSBHYW1tYSBkaXN0cmlidXRpb24gZnJvbSB3aGljaCB0aGUgaW52ZW50b3J5LXNwZWNpZmljIHBvc3RlcmlvciBvZiB0aGUgcm9sbC1vdmVyIGFyZSBkcmF3bi4nfQojIFBsb3QgaHlwZXJwYXJhbWV0ZXIgZXN0aW1hdGVzIG9mIGsKcF9oeXBfayA8LSBnZ3Bsb3QocG9zdF9oeXBlciwgYWVzKHggPSBhbHBoYV9rLCB5ID0gYmV0YV9rKSkgKyAKICBzY2FsZV9maWxsX2dyYWRpZW50KGxvdyA9ICJwdXJwbGUiLCBoaWdoID0gIm9yYW5nZSIpICsKICBsYWJzKGZpbGwgPSBleHByZXNzaW9uKG5bc10pLAogICAgICAgeCA9IGV4cHJlc3Npb24oYWxwaGFba10pLAogICAgICAgeSA9IGV4cHJlc3Npb24oYmV0YVtrXSkpICsKICBnZW9tX2hleChhbHBoYSA9IDAuOCkgKwogIHRoZW1lX2J3KCkgKwogIHRoZW1lKGFzcGVjdC5yYXRpbyA9IDEsCiAgICAgICAgbGVnZW5kLmtleS5zaXplID0gdW5pdCgwLjEsICJjbSIpLAogICAgICAgIGxlZ2VuZC5rZXkuaGVpZ2h0ID0gdW5pdCgwLjEsICJjbSIpLAogICAgICAgIGxlZ2VuZC5rZXkud2lkdGggPSB1bml0KDAuNCwgImNtIiksCiAgICAgICAgbGVnZW5kLnBvc2l0aW9uID0gInRvcCIpCgojIFBsb3QgaHlwZXJwYXJhbWV0ZXIgZXN0aW1hdGVzIG9mIHNpZ21hCnBfaHlwX3NpZyA8LSBnZ3Bsb3QocG9zdF9oeXBlciwgYWVzKHggPSBhX3NpZ21hLCB5ID0gYl9zaWdtYSkpICsgCiAgc2NhbGVfZmlsbF9ncmFkaWVudChsb3cgPSAicHVycGxlIiwgaGlnaCA9ICJvcmFuZ2UiKSArCiAgbGFicyhmaWxsID0gZXhwcmVzc2lvbihuW3NdKSwKICAgICAgIHggPSBleHByZXNzaW9uKGFscGhhW3NpZ21hXSksCiAgICAgICB5ID0gZXhwcmVzc2lvbihiZXRhW3NpZ21hXSkpICsKICBnZW9tX2hleChhbHBoYSA9IDAuOCkgKwogIHRoZW1lX2J3KCkgKwogIHRoZW1lKGFzcGVjdC5yYXRpbyA9IDEsCiAgICAgICAgbGVnZW5kLmtleS5zaXplID0gdW5pdCgwLjEsICJjbSIpLAogICAgICAgIGxlZ2VuZC5rZXkuaGVpZ2h0ID0gdW5pdCgwLjEsICJjbSIpLAogICAgICAgIGxlZ2VuZC5rZXkud2lkdGggPSB1bml0KDAuNCwgImNtIiksCiAgICAgICAgbGVnZW5kLnBvc2l0aW9uID0gInRvcCIpCgpwbG90X2dyaWQocF9oeXBfaywgcF9oeXBfc2lnLCBhbGlnbiA9ICJoIiwKICAgICAgICAgIGxhYmVscyA9IGMoImEiLCAiYiIpKQpgYGAKCmBgYHtyIFBvb2xlZF9rLCB3YXJuaW5nID0gRkFMU0UsIGZpZy5jYXAgPSAnYS4gUHJpb3IgYW5kIHBvc3RlcmlvciBkaXN0cmlidXRpb25zIG9mIHBvd2VyLWxhdyBzY2FsaW5nIGV4cG9uZW50IGZvciB0aGUgcG9vbGVkIGludmVudG9yeSBkYXRhLiBXaGl0ZSBjaXJjbGUgaXMgcG9vbGVkIHBvc3RlcmlvciBtZWRpYW4gYW5kIGJsYWNrIGhvcml6b250YWwgbGluZSBpcyA5NSUgSERJLiBiLiBQcmlvciBhbmQgcG9zdGVyaW9yIGRpc3RyaWJ1dGlvbnMgb2Ygcm9sbC1vdmVyIGZvciB0aGUgcG9vbGVkIGludmVudG9yeSBkYXRhLiBXaGl0ZSBjaXJjbGUgaXMgcG9vbGVkIHBvc3RlcmlvciBtZWRpYW4gYW5kIGJsYWNrIGhvcml6b250YWwgbGluZSBpcyA5NSUgSERJLid9CiMgUG9zdGVyaW9yIG1lYW4gb2YgawpwX3Bvb2xfayA8LSBnZ3Bsb3QocG9zdF9oeXBlciAlPiUgCiAgICBtdXRhdGUoCiAgICAgIGFfa19wcmlvciA9IGFicyhybm9ybShucm93KHBvc3RfaHlwZXIpLCA2LCAxKSksICMgR2F1c3NpYW4gaHlwZXJwcmlvcgogICAgICBiX2tfcHJpb3IgPSBhYnMocm5vcm0obnJvdyhwb3N0X2h5cGVyKSwgOSwgMSkpLCAjIEdhdXNzaWFuIGh5cGVycHJpb3IKICAgICAgYV9wcmlvciA9IDEgLyAoYV9rX3ByaW9yIC8gYl9rX3ByaW9yKSwKICAgICAgYV9wb3N0ID0gMSAvIChhbHBoYV9rIC8gYmV0YV9rKSkKICAgICkgKwogICAgIyBwcmlvcgogICAgc3RhdF9zbGFiKGFlcyh4ID0gYV9wcmlvciksCiAgICAgICAgICAgICAgIHNsYWJfZmlsbCA9ICJncmV5IiwKICAgICAgICAgICAgICAgc2xhYl9hbHBoYSA9IDAuNzUsCiAgICAgICAgICAgICAgIHNob3cubGVnZW5kID0gRkFMU0UsCiAgICAgICAgICAgICAgIG5vcm1hbGl6ZSA9ICJub25lIgogICAgICAgICAgICAgICApICsKICAgICMgcG9zdGVyaW9yCiAgICBzdGF0X2hhbGZleWUoYWVzKHggPSBhX3Bvc3QpLAogICAgICAgICAgICAgICBpbnRlcnZhbF9zaXplID0gMC41LAogICAgICAgICAgICAgICBzaGFwZSA9IDIxLAogICAgICAgICAgICAgICBwb2ludF9jb2xvciA9ICJyZWQiLAogICAgICAgICAgICAgICBwb2ludF9maWxsID0gIndoaXRlIiwKICAgICAgICAgICAgICAgcG9pbnRfc2l6ZSA9IDEuNSwKICAgICAgICAgICAgICAgc2xhYl9maWxsID0gIm9yY2hpZCIsCiAgICAgICAgICAgICAgIHNsYWJfYWxwaGEgPSAwLjc1LAogICAgICAgICAgICAgICBzaG93LmxlZ2VuZCA9IEZBTFNFLAogICAgICAgICAgICAgICBub3JtYWxpemUgPSAibm9uZSIKICAgICAgICAgICAgICAgKSArCiAgeGxpbSgwLjc1LCAzKSArCiAgeWxpbSgwLCAzLjI1KSArCiAgYW5ub3RhdGUoInRleHQiLCB4ID0gMSwgeSA9IDAuOSwgbGFiZWwgPSAiUHJpb3IiLCBjb2xvciA9ICJncmV5IikgKwogIGFubm90YXRlKCJ0ZXh0IiwgeCA9IDIsIHkgPSAxLjUsIGxhYmVsID0gIlBvc3RlcmlvciIsIGNvbG9yID0gIm9yY2hpZCIpICsKICBsYWJzKHggPSBleHByZXNzaW9uKHBhc3RlKCJNZWFuIHBvb2xlZCBzY2FsaW5nIGV4cG9uZW50ICIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxwaGEpKSwgCiAgICAgICB5ID0gZXhwcmVzc2lvbihwYXN0ZSgicCgiLCBhbHBoYSwgIikiKSkpICsKICB0aGVtZV9idygpICsKICB0aGVtZShhc3BlY3QucmF0aW8gPSAxLzQpCgojIFBvc3RlcmlvciBtZWFuIG9mIHNpZ21hCnBfcG9vbF9zaWcgPC0gZ2dwbG90KHBvc3RfaHlwZXIgJT4lIAogICAgbXV0YXRlKAogICAgICBhX3NpZ19wcmlvciA9IGFicyhybm9ybShucm93KHBvc3RfaHlwZXIpLCAxLCAwLjI1KSksICMgR2F1c3NpYW4gaHlwZXJwcmlvcgogICAgICBiX3NpZ19wcmlvciA9IGFicyhybm9ybShucm93KHBvc3RfaHlwZXIpLCA1LCA1KSksICAjIEdhdXNzaWFuIGh5cGVycHJpb3IKICAgICAgc2lnX3ByaW9yID0gYV9zaWdfcHJpb3IgLyBiX3NpZ19wcmlvciwKICAgICAgc2lnX3Bvc3QgPSBhX3NpZ21hIC8gYl9zaWdtYSkKICAgICkgKwogICAgIyBwcmlvcgogICAgc3RhdF9zbGFiKGFlcyh4ID0gc2lnX3ByaW9yKSwKICAgICAgICAgICAgICAgc2xhYl9maWxsID0gImdyZXkiLAogICAgICAgICAgICAgICBzbGFiX2FscGhhID0gMC43NSwKICAgICAgICAgICAgICAgc2hvdy5sZWdlbmQgPSBGQUxTRSwKICAgICAgICAgICAgICAgbm9ybWFsaXplID0gIm5vbmUiCiAgICAgICAgICAgICAgICkgKwogICAgIyBwb3N0ZXJpb3IKICAgIHN0YXRfaGFsZmV5ZShhZXMoeCA9IHNpZ19wb3N0KSwKICAgICAgICAgICAgICAgaW50ZXJ2YWxfc2l6ZSA9IDAuNSwKICAgICAgICAgICAgICAgc2hhcGUgPSAyMSwKICAgICAgICAgICAgICAgcG9pbnRfY29sb3IgPSAicmVkIiwKICAgICAgICAgICAgICAgcG9pbnRfZmlsbCA9ICJ3aGl0ZSIsCiAgICAgICAgICAgICAgIHBvaW50X3NpemUgPSAxLjUsCiAgICAgICAgICAgICAgIHNsYWJfZmlsbCA9ICJkYXJrb3JhbmdlIiwKICAgICAgICAgICAgICAgc2xhYl9hbHBoYSA9IDAuNzUsCiAgICAgICAgICAgICAgIHNob3cubGVnZW5kID0gRkFMU0UsCiAgICAgICAgICAgICAgIG5vcm1hbGl6ZSA9ICJub25lIgogICAgICAgICAgICAgICApICsKICB4bGltKDAsIDAuNzUpICsKICB5bGltKDAsIDEwKSArCiAgYW5ub3RhdGUoInRleHQiLCB4ID0gMC4xLCB5ID0gNiwgbGFiZWwgPSAiUHJpb3IiLCBjb2xvciA9ICJncmV5IikgKwogIGFubm90YXRlKCJ0ZXh0IiwgeCA9IDAuMjc1LCB5ID0gOSwgbGFiZWwgPSAiUG9zdGVyaW9yIiwgY29sb3IgPSAiZGFya29yYW5nZSIpICsKICBsYWJzKHggPSBleHByZXNzaW9uKHBhc3RlKCJNZWFuIHBvb2xlZCBzY2FsZSBwYXJhbWV0ZXIgIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaWdtYSwgIiAoIiwga21eMiwgIikiKSksCiAgICAgICB5ID0gZXhwcmVzc2lvbihwYXN0ZSgicCAoIiwgc2lnbWEsICIpICgiLCBrbV4tMiwgIikiKSkpICsKICB0aGVtZV9idygpICsKICB0aGVtZShhc3BlY3QucmF0aW8gPSAxLzQpCgpwbG90X2dyaWQocF9wb29sX2ssIHBfcG9vbF9zaWcsIGFsaWduID0gInYiLCBuY29sID0gMSwKICAgICAgICAgIGxhYmVscyA9IGMoImEiLCAiYiIpKQpgYGAKCldlIGZpbmQgdGhhdCB0aGUgbnVtZXJpY2FsIGFwcHJveGltYXRpb24gb2YgdGhlIGpvaW50IHBvc3RlcmlvciBkaXN0cmlidXRpb24gaGFzIGEgZGlzdGluY3QgbWF4aW11bS4gV2Ugb2J0YWluIGEgbWVhbiBwb3dlci1sYXcgZXhwb25lbnQgb2YgYHIgcm91bmQoSERJb2ZNQ01DKDEgLyAocG9zdF9oeXBlciRhbHBoYV9rIC8gcG9zdF9oeXBlciRiZXRhX2spKVsxXSwgMilgIFw8ICRcYmFye1xhbHBoYX0kIFw8IGByIHJvdW5kKEhESW9mTUNNQygxIC8gKHBvc3RfaHlwZXIkYWxwaGFfayAvIHBvc3RfaHlwZXIkYmV0YV9rKSlbMl0sIDIpYCBhY3Jvc3MgYWxsIGludmVudG9yaWVzIHdpdGggOTUlIHByb2JhYmlsaXR5OyB0aGUgcG9zdGVyaW9yIG1lZGlhbiBvZiAkXGJhcntcYWxwaGF9JCBpcyBgciByb3VuZChtZWRpYW4oMSAvIChwb3N0X2h5cGVyJGFscGhhX2sgLyBwb3N0X2h5cGVyJGJldGFfaykpLCAyKWAuIENvbXBhcmVkIHRvIHRoZSBwcmlvciBkaXN0cmlidXRpb24gYmFzZWQgb24gcHVibGlzaGVkIHZhbHVlcyBvZiB0aGUgc2NhbGluZyBwYXJhbWV0ZXIsIG91ciBtb2RlbCBoYXMgZ2FpbmVkIG1vcmUgY2VydGFpbnR5IGZyb20gdGhlIGRhdGEgY29uc2lkZXJlZCBpbiB0aGlzIHN0dWR5LCB5aWVsZGluZyBhIG11Y2ggbmFycm93ZXIgcG9zdGVyaW9yLiBUaGUgbWVhbiBzY2FsaW5nIHBhcmFtZXRlciBpcyBgciByb3VuZChIRElvZk1DTUMocG9zdF9oeXBlciRhX3NpZ21hIC8gcG9zdF9oeXBlciRiX3NpZ21hKVsxXSwgMilgIFw8ICRcYmFye1xzaWdtYX0kIFw8IGByIHJvdW5kKEhESW9mTUNNQyhwb3N0X2h5cGVyJGFfc2lnbWEgLyBwb3N0X2h5cGVyJGJfc2lnbWEpWzJdLCAyKWAga21eMl4gYWNyb3NzIGFsbCBpbnZlbnRvcmllcyB3aXRoIDk1JSBwcm9iYWJpbGl0eTsgdGhlIHBvc3RlcmlvciBtZWRpYW4gb2YgJFxiYXJ7XHNpZ21hfSQgaXMgYHIgcm91bmQobWVkaWFuKHBvc3RfaHlwZXIkYV9zaWdtYSAvIHBvc3RfaHlwZXIkYl9zaWdtYSksIDIpYCBrbV4yXi4gVGhpcyBwb3N0ZXJpb3Igc2hpZnRlZCB1cCBmcm9tIHRoZSBwcmlvciBkaXN0cmlidXRpb24gdGhhdCB3ZSBjZW50ZXJlZCBvbiBvdXIgYXJiaXRyYXJ5IHNpemUgdGhyZXNob2xkIGZvciBsYXJnZSBsYW5kc2xpZGVzLiBPdXIgbW9kZWwgaGFzIGxlYXJuZWQgbXVjaCBmcm9tIHRoZSBpbnZlbnRvcnkgZGF0YSBjb21wYXJlZCB0byB0aGUgcHJpb3JzLCBlc3BlY2lhbGx5IGNvbmNlcm5pbmcgdGhlIGhpZ2ggdmFyaWFuY2Ugb2YgJFxzaWdtYV9qJCBhY3Jvc3MgdGhlIGluZGl2aWR1YWwgbGFuZHNsaWRlIGNhdGFsb2d1ZXMuCgojIyBDb21wYXJpc29uIHdpdGggbWF4aW11bSBsaWtlbGlob29kIGVzdGltYXRlCgpUbyBhc3Nlc3MgdGhlIHNlbnNpdGl2aXR5IG9mIG91ciBtb2RlbCByZXN1bHRzIHRvIG91ciBjaG9pY2Ugb2YgaW5mZXJlbmNlLCB3ZSBjb21wYXJlIG91ciByZXN1bHRzIHRvIG1heGltdW0gbGlrZWxpaG9vZCBlc3RpbWF0ZXMgKE1MRSkgb2YgdGhlIGV4cG9uZW50ICRcYWxwaGFfaiQgb2YgdGhlIGludmVyc2UgcG93ZXItbGF3IGRpc3RyaWJ1dGlvbiwgYmFzZWQgb24gdGhlIEhpbGwgZXN0aW1hdG9yIFtAQ2xhdXNldDoyMDA5aXldLiBCeSBkZWZpbml0aW9uLCB0aGUgTUxFIHN0YW5kYXJkIGVycm9yIGZvciBlYWNoIGludmVudG9yeSBkZWNheXMgd2l0aCB0aGUgaW52ZXJzZSBzcXVhcmUgcm9vdCBvZiBzYW1wbGUgc2l6ZSwgd2hlcmVhcyB0aGUgQmF5ZXNpYW4gZXN0aW1hdGVzIGFyZSBpbmZvcm1lZCBieSBhbGwgZGF0YSB2aWEgdGhlIG11bHRpLWxldmVsIG1vZGVsIHN0cnVjdHVyZS4gSGVuY2Ugd2UgZG8gbm90IGV4cGVjdCBhIDE6MSBjb3JyZXNwb25kZW5jZSBmcm9tIHRoaXMgY29tcGFyaXNvbi4gSW5zdGVhZCwgaXQgdW5kZXJsaW5lcyBob3cgdmFyaWFibGUgYW5kIHVuY2VydGFpbiBsYW5kc2xpZGUgc2NhbGluZyBlc3RpbWF0ZXMgY2FuIGJlIGZvciBkaWZmZXJlbnQgaW52ZW50b3JpZXMsIHJlZ2FyZGxlc3Mgb2YgbWV0aG9kLgoKYGBge3IgQmF5ZXNfTUxFLCB3YXJuaW5nID0gRkFMU0UsIGZpZy5jYXAgPSAnQ29tcGFyaXNvbiBiZXR3ZWVuIHBvc3RlcmlvciBHUEQgZXN0aW1hdGVzIGFuZCB0aGUgbWF4aW11bSBsaWtlbGlob29kIGVzdGltYXRvciAoTUxFKSBvZiB0aGUgc2NhbGluZyBleHBvbmVudCBmb3IgZWFjaCBpbnZlbnRvcnkuIERhc2hlZCAxOjEgbGluZSBhaWRzIHZpc3VhbCBjb21wYXJpc29uLiBDb2xvciBzY2FsZSBjb2RlZCB0byB0aGUgZnJhY3Rpb24gb2YgKGRpc2NhcmRlZCkgbGFuZHNsaWRlcyBiZWxvdyB0aGUgc2l6ZSB0aHJlc2hvbGQgaW4gZWFjaCBpbnZlbnRvcnk7IGJ1YmJsZXMgYXJlIHNjYWxlZCB0byBzYW1wbGUgc2l6ZSBvZiBsYXJnZSBsYW5kc2xpZGVzIHVzZWQgZm9yIHBhcmFtZXRlciBlc3RpbWF0aW9uLiBHcmV5IHZlcnRpY2FsIGJhcnMgc3BhbiB0d28gc3RhbmRhcmQgZGV2aWF0aW9ucyBhYm91dCB0aGUgbWVhbjsgZ3JleSBob3Jpem9udGFsIGJhcnMgZW5jb21wYXNzIHRoZSA5NSUgSERJLiBBeGVzIGFyZSBzY2FsZWQgZXF1YWxseS4nfQojIE1MRSBlc3RpbWF0ZSBmb3IgcG93ZXItbGF3IGFscGhhIAojIEVxdWF0aW9uIDMuMSBpbiBDbGF1c2V0IGV0IGFsLiAoMjAwOSkKTUxFX2FscGhhIDwtIHp6ICU+JSAKICBncm91cF9ieShJbnZlbnRvcnkpICU+JSAKICBzdW1tYXJpc2UobiA9IG4oKSwKICAgICAgICAgICAgTUxFID0gMSArIG4gLyBzdW0obG9nKHh4IC8gbWluX3NpemUpKSwKICAgICAgICAgICAgTUxFX3NkID0gKE1MRSAtIDEpIC8gc3FydChuKSkgIyBBcHBlbmRpeCBCIGluIENsYXVzZXQgZXQgYWwuCgojIFBvc3RlcmlvciBtZWRpYW5zIG9mIGsKcG9zdGVyaW9yX2sgPC0gcG9zdF9rICU+JSAKICBncm91cF9ieShJbnZlbnRvcnkpICU+JSAKICBzdW1tYXJpc2UobWRfZ3JwX2FscGhhID0gbWVkaWFuKDEgLyBrKSwKICAgICAgICAgICAgbG9fZ3JwX2FscGhhID0gSERJb2ZNQ01DKDEgLyBrKVsxXSwKICAgICAgICAgICAgaGlfZ3JwX2FscGhhID0gSERJb2ZNQ01DKDEgLyBrKVsyXSkKCiMgUG9zdGVyaW9yIG1lZGlhbnMgb2Ygc2lnbWEKcG9zdGVyaW9yX3NpZyA8LSBwb3N0X3NpZyAlPiUgCiAgZ3JvdXBfYnkoSW52ZW50b3J5KSAlPiUgCiAgc3VtbWFyaXNlKG1kX2dycF9zaWcgPSBtZWRpYW4oc2lnKSwKICAgICAgICAgICAgbG9fZ3JwX3NpZyA9IEhESW9mTUNNQyhzaWcpWzFdLAogICAgICAgICAgICBoaV9ncnBfc2lnID0gSERJb2ZNQ01DKHNpZylbMl0pCgptb2Rjb21wIDwtIG1lcmdlKG15ZGF0LCBNTEVfYWxwaGEpCm1vZGNvbXAgPC0gbWVyZ2UobW9kY29tcCwgcG9zdGVyaW9yX2spCm1vZGNvbXAgPC0gbWVyZ2UobW9kY29tcCwgcG9zdGVyaW9yX3NpZykKbW9kY29tcCA8LSBtZXJnZShtb2Rjb21wLCBwb3N0X2xvZ29kZHMpCgpnZ3Bsb3QobW9kY29tcCwgYWVzKHkgPSBNTEUgLSAxLCAjIE9mZnNldCBkdWUgdG8gZGVmaW5pdGlvbiBpbiBDbGF1c2V0IGV0IGFsLgogICAgICAgICAgICAgICAgICAgIHggPSBtZF9ncnBfYWxwaGEsIAogICAgICAgICAgICAgICAgICAgIHNpemUgPSBuLAogICAgICAgICAgICAgICAgICAgIGNvbCA9IGBuIDwgdGhyZXNob2xkYCAvIChuICsgYG4gPCB0aHJlc2hvbGRgKSkpICsKICBnZW9tX2Vycm9yYmFyKGFlcyh5bWF4ID0gTUxFIC0gMSArIDIgKiBNTEVfc2QsIAogICAgICAgICAgICAgICAgICAgICB5bWluID0gTUxFIC0gMSAtIDIgKiBNTEVfc2QpLAogICAgICAgICAgICAgICAgIGNvbCA9ICJncmV5IiwgbGluZXdpZHRoID0gMC41KSArIAogIGdlb21fZXJyb3JiYXJoKGFlcyh4bWF4ID0gaGlfZ3JwX2FscGhhLCAKICAgICAgICAgICAgICAgICAgICB4bWluID0gbG9fZ3JwX2FscGhhKSwKICAgICAgICAgICAgICAgIGNvbCA9ICJncmV5IiwgbGluZXdpZHRoID0gMC41KSArIAogIGdlb21fcG9pbnQoKSArCiAgZ2VvbV9wb2ludChwY2ggPSAyMSwgY29sb3IgPSAiYmxhY2siKSArCiAgc2NhbGVfY29sb3JfdmlyaWRpc19jKGJlZ2luID0gMC45NSwgZW5kID0gMC4xNSkgKwogIGdlb21fYWJsaW5lKGludGVyY2VwdCA9ICAwLCBzbG9wZSA9IDEsIGxpbmV0eXBlID0gImRhc2hlZCIpICsKICBnZW9tX3RleHRfcmVwZWwoYWVzKGxhYmVsID0gaWZlbHNlKG1kX2dycF9hbHBoYSA+IDMsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW52ZW50b3J5LCAiIiksCiAgICAgICAgICAgICAgICAgICAgICBiZy5jb2xvciA9ICJ3aGl0ZSIsIGJnLnIgPSAwLjIpLCAKICAgICAgICAgICAgaGp1c3QgPSAtMC4xLCB2anVzdCA9IC0wLjUsIGNvbCA9ICJibGFjayIpICsKICBsYWJzKHkgPSBleHByZXNzaW9uKHBhc3RlKCJNTEUgb2YgIiwgYWxwaGEpKSwgCiAgICAgICB4ID0gZXhwcmVzc2lvbihwYXN0ZSgiUG9zdGVyaW9yICIsIGFscGhhW2pdKSksCiAgICAgICBzaXplID0gIkxhcmdlXG5sYW5kc2xpZGVzXG5pbiBpbnZlbnRvcnkiLAogICAgICAgY29sID0gZXhwcmVzc2lvbihwYXN0ZSgiRnJhY3Rpb24gb2ZcbmxhbmRzbGlkZXMgPCAiLCBtdSkpKSArCiAgIyB4bGltKDAsIDUpICsKICAjIHlsaW0oMCwgNSkgKwogIHNjYWxlX3hfY29udGludW91cyhicmVha3MgPSBzZXEoMCwgOCwgMSkpICsKICBjb29yZF9maXhlZCgpICsKICB0aGVtZV9idygpICsKICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAidG9wIikKYGBgCgpXZSBvYnRhaW4gaW52ZW50b3J5LXNwZWNpZmljIE1MRXMgb2YgYHIgcm91bmQobWluKG1vZGNvbXAkTUxFIC0gMSksIDIpYCBcPCAkXGhhdFxhbHBoYV9qJCBcPCBgciByb3VuZChtYXgobW9kY29tcCRNTEUgLSAxKSwgMilgLiBUaGlzIHNwcmVhZCBlbmNvbXBhc3NlcyBtb3N0IHJlcG9ydGVkIHZhbHVlcyBpbiB0aGUgbGl0ZXJhdHVyZSBbQGh0dHBzOi8vZG9pLm9yZy8xMC4xMDI5LzIwMTlFQTAwMDY2Ml0uIEluIGNvbnRyYXN0LCB0aGUgcG9zdGVyaW9yIG1lZGlhbnMgb2YgJFxhbHBoYV9qID0gMS9rX2okIG9jY3VweSBhIHNlZW1pbmdseSBicm9hZGVyIHJhbmdlIChgciByb3VuZChtaW4obW9kY29tcCRtZF9ncnBfYWxwaGEpLCAyKWAgXDwgJFx0aWxkZVxhbHBoYSQgXDwgYHIgcm91bmQobWF4KG1vZGNvbXAkbWRfZ3JwX2FscGhhKSwgMilgKSwgdGhvdWdoIG5vbWluYWxseSBzaW1pbGFyIHRvIHRoYXQgb2YgdGhlIE1MRSBtZXRob2QgZm9yIG1vc3QgaW52ZW50b3JpZXMgd2l0aGluIHRoZSByZXNwZWN0aXZlIGVycm9ycy4gSG93ZXZlciwgdGhlIGNvZWZmaWNpZW50IG9mIHZhcmlhdGlvbiBpcyBuYXJyb3dlciBmb3IgdGhlIEJheWVzaWFuIG1lZGlhbiBlc3RpbWF0ZXMuIFR3byBpbnZlbnRvcmllcyBzdGFuZCBvdXQgd2l0aCB2ZXJ5IGhpZ2ggc2NhbGluZyBleHBvbmVudHMsIGUuZy4gYHIgcG9zdF9rICU+JSBncm91cF9ieShJbnZlbnRvcnkpICU+JSBzdW1tYXJpc2UobWRfZ3JwX2sgPSBtZWRpYW4oaykpICU+JSBhcnJhbmdlKG1kX2dycF9rKSAlPiUgc2VsZWN0KEludmVudG9yeSkgJT4lIGZpcnN0KCkgJT4lIHB1bGwoKSAlPiUgYXMuY2hhcmFjdGVyKClgIGFuZCBgciBwb3N0X2sgJT4lIGdyb3VwX2J5KEludmVudG9yeSkgJT4lIHN1bW1hcmlzZShtZF9ncnBfayA9IG1lZGlhbihrKSkgJT4lIGFycmFuZ2UobWRfZ3JwX2spICU+JSBzZWxlY3QoSW52ZW50b3J5KSAlPiUgbnRoKDIpICU+JSBwdWxsKCkgJT4lIGFzLmNoYXJhY3RlcigpYC4gQm90aCBpbnZlbnRvcmllcyBoYXZlIG9ubHkgZmV3IGxhbmRzbGlkZXMgdGhhdCB3ZSBjZW5zb3JlZCBiZWNhdXNlIHRoZXkgd2VyZSBiZWxvdyB0aGUgc2l6ZSB0aHJlc2hvbGQgJFxtdSQgPSAwLjEga21eMl47IGluIG90aGVyIHdvcmRzLCB0aGVzZSBjYXRhbG9ndWVzIGNvbnRhaW5lZCBtb3N0bHkgbGFyZ2UgbGFuZHNsaWRlcyBvcmlnaW5hbGx5LgoKCiMgRGlzY3Vzc2lvbgoKIyMgSW1wbGljYXRpb25zCgpPdXIgcmVzdWx0cyBzaG93IHRoYXQgcG9zdGVyaW9yIHNoYXBlIHBhcmFtZXRlcnMgJGtfaiA9IDEvXGFscGhhX2okIG9mIGxhbmRzbGlkZS1zaXplIGRpc3RyaWJ1dGlvbnMgbWF5IHZhcnkgZGVzcGl0ZSBiZWluZyBpbmZvcm1lZCBieSB0aG91c2FuZHMgb2YgZGF0YSBwb2ludHMgYW5kIHByZXZpb3VzIHJlc2VhcmNoLiBUaGUgbmFycm93ZXN0IDk1JSBIREkgb2YgJFxhbHBoYV9qJCwgYW5kIHRodXMgdGhlIGJlc3Qgd2UgY2FuIGNvbnN0cmFpbiB0aGlzIHBhcmFtZXRlciwgaXMgdGhhdCBvZiB0aGUgYHIgcG9zdF9hbHBoYV9ncnAgJT4lIGFycmFuZ2Uod2hkaV9ncnBfYWxwaGEpICU+JSBmaXJzdCgpICU+JSBzZWxlY3QoSW52ZW50b3J5KSAlPiUgdW5saXN0KCkgJT4lIGFzLmNoYXJhY3RlcigpYCBjYXRhbG9ndWUgd2l0aCBgciBwb3N0X2FscGhhX2dycCAlPiUgYXJyYW5nZSh3aGRpX2dycF9hbHBoYSkgJT4lIGZpcnN0KCkgJT4lIHNlbGVjdChoZGlfbG9fZ3JwX2FscGhhKSAlPiUgYXMubnVtZXJpYygpICU+JSByb3VuZCgyKWAgXDwgJFxhbHBoYV9qJCBcPCBgciBwb3N0X2FscGhhX2dycCAlPiUgYXJyYW5nZSh3aGRpX2dycF9hbHBoYSkgJT4lIGZpcnN0KCkgJT4lIHNlbGVjdChoZGlfaGlfZ3JwX2FscGhhKSAlPiUgYXMubnVtZXJpYygpICU+JSByb3VuZCgyKWAuIFRoaXMgbnVtZXJpY2FsIHJhbmdlIGhhcyBtdWNoIG92ZXJsYXAgd2l0aCB0aGF0IG9mIHByZXZpb3VzbHkgcmVwb3J0ZWQgc2NhbGluZyBleHBvbmVudHMgdGhhdCB3ZXJlIG9idGFpbmVkIGZvciBtb3N0bHkgc21hbGxlciBsYW5kc2xpZGVzLCBob3dldmVyIFtAaHR0cHM6Ly9kb2kub3JnLzEwLjEwMjkvMjAxOUVBMDAwNjYyXS4gU3RpbGwsIHRoZSBuZWFybHkgdHJpYW5ndWxhciBwb3N0ZXJpb3IgZGlzdHJpYnV0aW9uIGhhcyBtdWNoIG9mIGl0cyBwcm9iYWJpbGl0eSBtYXNzIG5lYXIgaXRzIHBlYWssIGFuZCB0aGUgc2FtZSBnb2VzIGZvciB0aGUgcG9vbGVkIGVzdGltYXRlLiBFeGNlcHQgZm9yIGEgZmV3IGludmVudG9yaWVzLCB0aGUgY29ycmVzcG9uZGluZyBwb3N0ZXJpb3IgZGlzdHJpYnV0aW9ucyBmb3Igb3RoZXIgbGFuZHNsaWRlIGludmVudG9yaWVzIGFsc28gcmVtYWluIGxhcmdlbHkgaW5kaXN0aW5ndWlzaGFibGUgZnJvbSB0aGUgcG9vbGVkIGVzdGltYXRlLiBUaGlzIGxvdyB2YXJpYW5jZSBvZiAkXGFscGhhX2okIGFjcm9zcyBpbnZlbnRvcmllcyBpcyBzdHJpa2luZyBpZiB3ZSBjb25zaWRlciB0aGUgZGl2ZXJzZSBtYXBwaW5nIHRlY2huaXF1ZXMsIGxldmVscyBvZiBkYXRhIHF1YWxpdHksIGNvdmVyYWdlLCBlbnZpcm9ubWVudGFsIHNldHRpbmcsIGFuZCBsYW5kc2xpZGUgdHJpZ2dlcnMuIFRoZSBpbnZlbnRvcmllcyB3ZSBzZWxlY3RlZCBjb3ZlciBzZXZlcmFsIGNsaW1hdGljIHpvbmVzIHdpdGggZGlmZmVyZW50IHZlZ2V0YXRpb24gYW5kIGxhbmQgY292ZXIgY2hhcmFjdGVyaXN0aWNzIHRoYXQgbGlrZWx5IGFmZmVjdCB0aGUgZGV0ZWN0aW9uIGFuZCBtYXBwaW5nIG9yIGxhcmdlIGxhbmRzbGlkZXMuIFNvbWUgaW52ZW50b3JpZXMgd2VyZSBnZW5lcmF0ZWQgZnJvbSBkZWVwIGxlYXJuaW5nIGFsZ29yaXRobXMgW0BCaHV5YW46MjAyM2FhXSwgd2hlcmVhcyBtb3N0IG90aGVycyB3ZXJlIG1hcHBlZCBtYW51YWxseS4gV2hpbGUgbWFueSBwb3N0ZXJpb3IgJFxzaWdtYV9qJCBoYXZlIHZhbHVlcyBjbG9zZSB0byBvdXIgYXJiaXRyYXJ5IHNpemUgdGhyZXNob2xkIGZvciBsYXJnZSBsYW5kc2xpZGVzIG9mIDAuMSBrbV4yXiwgdGhlIHZhcmlhbmNlIGluIHRoaXMgcGFyYW1ldGVyIGlzIGhpZ2ggY29tcGFyZWQgdG8gdGhlIHBvb2xlZCBlc3RpbWF0ZXMuIE92ZXJhbGwsIHRoZSBtZWRpYW4gZXN0aW1hdGVzIG9mIGJvdGggJFxhbHBoYV9qJCBhbmQgJFxzaWdtYV9qJCBhcmUgdW5hZmZlY3RlZCBieSB0aGUgbnVtYmVyIG9mIGxhcmdlIGxhbmRzbGlkZXMgcmVwb3J0ZWQgaW4gYSBnaXZlbiBpbnZlbnRvcnkuCgpPdXIgbW9kZWwgaGlnaGxpZ2h0cyBzZXZlcmFsIGludmVudG9yaWVzIHdpdGggc2NhbGluZyBzdGF0aXN0aWNzIHRoYXQgc3RhbmQgb3V0LiBUaGUgYHIgbW9kY29tcCAlPiUgZmlsdGVyKG1kX2dycF9hbHBoYSA+IDMpICU+JSBzZWxlY3QoSW52ZW50b3J5KSAlPiUgLlsxLCBdYCBhbmQgYHIgbW9kY29tcCAlPiUgZmlsdGVyKG1kX2dycF9hbHBoYSA+IDMpICU+JSBzZWxlY3QoSW52ZW50b3J5KSAlPiUgLlsyLCBdYCBjYXRhbG9ndWVzIGhhdmUgaGlnaCBlc3RpbWF0ZXMgb2YgJFxhbHBoYV9qJCwgd2hlcmVhcyBgciBtb2Rjb21wICU+JSBmaWx0ZXIobWRfZ3JwX3NpZyA+IDEpICU+JSBzZWxlY3QoSW52ZW50b3J5KSAlPiUgLlsxLCBdYCwgYHIgbW9kY29tcCAlPiUgZmlsdGVyKG1kX2dycF9zaWcgPiAxKSAlPiUgc2VsZWN0KEludmVudG9yeSkgJT4lIC5bMiwgXWAsIGFuZCBgciBtb2Rjb21wICU+JSBmaWx0ZXIobWRfZ3JwX3NpZyA+IDEpICU+JSBzZWxlY3QoSW52ZW50b3J5KSAlPiUgLlszLCBdYCBoYXZlIGhpZ2ggZXN0aW1hdGVzIG9mICRcc2lnbWFfaiQuIFRoZXNlIGludmVudG9yaWVzIGNvbnNpc3QgYWxtb3N0IGV4Y2x1c2l2ZWx5IG9mIGxhcmdlIGxhbmRzbGlkZXMgYW5kIGZlYXR1cmUgdmVyeSBmZXcgb3RoZXIgZGF0YSBiZWxvdyB0aGUgc2l6ZSB0aHJlc2hvbGQgJFxtdSQuIEluIGNvbnRyYXN0LCB3ZSBvYnNlcnZlIHRoYXQgaW52ZW50b3JpZXMgd2l0aCBtb3N0IGxhbmRzbGlkZXMgZmFsbGluZyBiZWxvdyAkXG11JCBoYXZlIGxvdyB2YWx1ZXMgb2YgJFxzaWdtYV9qJCBjb25zaXN0ZW50bHkuIFdlIGluZmVyIHRoYXQgbGFuZHNsaWRlIGNhdGFsb2d1ZXMgdGhhdCB3ZXJlIGZvY3VzZWQgb24gY29tcGlsaW5nIGluZm9ybWF0aW9uIGFib3V0IGxhcmdlciBsYW5kc2xpZGVzIHRlbmQgdG8gaGF2ZSBlbGV2YXRlZCB2YWx1ZXMgb2YgJFxzaWdtYV9qJC4gSW4gdGhpcyBjb250ZXh0LCBvdXIgc2VsZWN0aW9uIG9mIGludmVudG9yaWVzIGlzIG5lYXJseSBiYWxhbmNlZDogdHdlbnR5IG9mIHRoZW0gaGF2ZSBsZXNzIHRoYW4gMTAlIGxhcmdlIGxhbmRzbGlkZXMsIHdoZXJlYXMgc2V2ZW50ZWVuIG9mIHRoZW0gaGF2ZSBtb3JlIHRoYW4gNTAlLiAKCmBgYHtyIEludmVudG9yeV90eXBlLCB3YXJuaW5nID0gRkFMU0UsIGZpZy5jYXAgPSAnTWVkaWFuIHBvc3RlcmlvciBwYXJhbWV0ZXIgZXN0aW1hdGVzIGFzIGEgZnVuY3Rpb24gb2YgdGhlIG51bWJlciBvZiBsYXJnZSBsYW5kc2xpZGVzIHBlciBpbnZlbnRvcnkgYW5kIHRoZSBmcmFjdGlvbiBvZiAoZGlzY2FyZGVkKSBsYW5kc2xpZGVzIGJlbG93IHRoZSBzaXplIHRocmVzaG9sZC4nfQpnZ3Bsb3QobW9kY29tcCwgCiAgICAgICBhZXMoeCA9IG1kX2dycF9hbHBoYSwKICAgICAgICAgICB5ID0gbWRfZ3JwX3NpZywgCiAgICAgICAgICAgc2l6ZSA9IG4sCiAgICAgICAgICAgY29sID0gYG4gPCB0aHJlc2hvbGRgIC8gKG4gKyBgbiA8IHRocmVzaG9sZGApLAogICAgICAgICAgICNjb2wgPSBgTWluLiBzaXplIChzcWttKWAsCiAgICAgICAgICAgbGFiZWwgPSBJbnZlbnRvcnkpKSArCiAgZ2VvbV9lcnJvcmJhcmgoYWVzKHhtYXggPSBoaV9ncnBfYWxwaGEsIAogICAgICAgICAgICAgICAgICAgIHhtaW4gPSBsb19ncnBfYWxwaGEpLAogICAgICAgICAgICAgICAgY29sID0gImdyZXkiLCBsaW5ld2lkdGggPSAwLjUpICsKICBnZW9tX2Vycm9yYmFyKGFlcyh5bWF4ID0gaGlfZ3JwX3NpZywgCiAgICAgICAgICAgICAgICAgICAgeW1pbiA9IGxvX2dycF9zaWcpLAogICAgICAgICAgICAgICAgY29sID0gImdyZXkiLCBsaW5ld2lkdGggPSAwLjUpICsKICBzY2FsZV9jb2xvcl92aXJpZGlzX2MoYmVnaW4gPSAwLjk1LCBlbmQgPSAwLjE1KSArCiAgbGFicyh4ID0gZXhwcmVzc2lvbihwYXN0ZSgiUG9zdGVyaW9yICIsIGFscGhhW2pdKSksCiAgICAgICBzaXplID0gIkxhcmdlXG5sYW5kc2xpZGVzIiwKICAgICAgIGNvbCA9IGV4cHJlc3Npb24ocGFzdGUoIkZyYWN0aW9uIG9mXG5sYW5kc2xpZGVzIDwgIiwgbXUpKSkgKwogIGdlb21fcG9pbnQoKSArCiAgZ2VvbV9wb2ludChwY2ggPSAyMSwgY29sb3IgPSAiYmxhY2siKSArCiAgZ2VvbV90ZXh0X3JlcGVsKGFlcyhsYWJlbCA9IGlmZWxzZShtZF9ncnBfYWxwaGEgPiAzIHwgbWRfZ3JwX3NpZyA+IDEsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW52ZW50b3J5LCAiIiksCiAgICAgICAgICAgICAgICAgICAgICBiZy5jb2xvciA9ICJ3aGl0ZSIsIGJnLnIgPSAwLjIpLCAKICAgICAgICAgICAgaGp1c3QgPSAtMC4xLCB2anVzdCA9IC0wLjUsIGNvbCA9ICJibGFjayIpICsKICBzY2FsZV94X2NvbnRpbnVvdXMoYnJlYWtzID0gc2VxKDAsIDgsIDEpKSArCiAgc2NhbGVfeV9sb2cxMChleHByZXNzaW9uKHBhc3RlKCJQb3N0ZXJpb3IgIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpZ21hW2pdLCAiICgiLCBrbV4yLCAiKSIpKSwKICAgICAgICBicmVha3MgPSB0cmFuc19icmVha3MoImxvZzEwIiwgZnVuY3Rpb24oeSkgMTAgXiB5KSwKICAgICAgICBsYWJlbHMgPSB0cmFuc19mb3JtYXQoImxvZzEwIiwgbWF0aF9mb3JtYXQoMTAgXiAueCkpKSArCiAgdGhlbWVfYncoKSArCiAgdGhlbWUoYXNwZWN0LnJhdGlvID0gMSkKYGBgCgpPbmUgcG9zc2libGUgZXhwbGFuYXRpb24gZm9yIHRoZXNlIG91dGx5aW5nIGxhbmRzbGlkZS1zaXplIHN0YXRpc3RpY3MgaXMgdGhhdCB0aGUgR1BEIGlzIGEgcG9vciBmaXQgdG8gaW52ZW50b3JpZXMgdGhhdCBtYWlubHkgZmVhdHVyZSBsYXJnZSBsYW5kc2xpZGVzLCBhdCBsZWFzdCBmb3IgdGhlIGNob3NlbiB0aHJlc2hvbGQgJFxtdSQuIFRoZSByZXNpZHVhbHMgZm9yIG1vc3Qgb2YgdGhlc2UgaW52ZW50b3JpZXMgc2hvdyBwcm9ub3VuY2VkIHVuZGVyZXN0aW1hdGVzIGZvciB0aGUgc21hbGxlc3QgbGFuZHNsaWRlIHJhbmdlLCBleGNlcHQgZm9yIHRoZSBTb3V0aCBDZW50cmFsIENITCBhbmQgQ2FzcGlhbiBTZWEgS0FaIGNhdGFsb2d1ZXMuIFlldCwgb3RoZXIgaW52ZW50b3JpZXMgd2l0aCBzaW1pbGFyIHJlc2lkdWFscyAoZS5nLiBHbGFjaWVyIEJheSBOLlAuIENBTikgaGFyZGx5IHN0YW5kIG91dCBjb21wYXJlZCB0byB0aGUgcG9vbGVkIGVzdGltYXRlcy4gQ2xlYXJseSwgZXh0cmFwb2xhdGluZyB0aGUgbW9kZWwgYWNyb3NzIHRoZSBmdWxsIHNpemUgcmFuZ2UsIGZvciBleGFtcGxlIHRvIGluZmVyIHRoZSBudW1iZXIgb2Ygc2VlbWluZ2x5IG1pc3NpbmcsIHVuZGVycmVwb3J0ZWQsIG9yIG92ZXJsb29rZWQgbGFuZHNsaWRlcyBbQFRhbnlhczoyMDE5YWFdIGNhbiBiZSBtaXNsZWFkaW5nIGluIHRoZXNlIGNhc2VzLiBBbm90aGVyIGV4cGxhbmF0aW9uIGZvciB0aGUgaGlnaCBlc3RpbWF0ZXMgb2YgJGtfaiQgYW5kICRcc2lnbWFfaiQgaXMgdGhhdCB0aGUgb3JpZ2luYWwgbWFwcGluZyB3YXMgZm9jdXNlZCBvbiBsYW5kc2xpZGVzIHdlbGwgYmV5b25kIHRoZSBzaXplIHRocmVzaG9sZCB3ZSBjaG9zZSwgc28gdGhhdCBzbG9wZSBmYWlsdXJlcyBjbG9zZSB0byB0aGlzIGN1dG9mZiBtaWdodCBiZSB1bmRlcnNhbXBsZWQuIFNvbWUgb2YgdGhlc2UgaW52ZW50b3JpZXMgYWxzbyBjb250YWluIHBhcnRseSBvdmVybGFwcGluZyBzbG9wZS1mYWlsdXJlIGRlcG9zaXRzIG9mIG11bHRpcGxlIGFnZXMsIG1hcmtpbmcgc2V2ZXJhbCBwaGFzZXMgb2YgcmVhY3RpdmF0aW9uLiBTdWNoIG92ZXJsYXBzIG1heSBjYXVzZSBtb3JlIGxhbmRzbGlkZXMgdG8gc3VycGFzcyB0aGUgc2l6ZSB0aHJlc2hvbGQuIEhlbmNlLCB0aGUgbWFwcGluZyBvYmplY3RpdmUgd291bGQgcGFydGx5IGJpYXMgZXN0aW1hdGVzIG9mICRcc2lnbWFfaiQgZm9yIGEgc2l6ZSB0aHJlc2hvbGQgdGhhdCBpcyB0b28gbG93LgoKYGBge3IgVHJpZ2dlcl90eXBlLCBmaWcuY2FwID0gJ01lZGlhbiBwb3N0ZXJpb3IgcGFyYW1ldGVyIGVzdGltYXRlcyBhcyBhIGZ1bmN0aW9uIG9mIGludmVudG9yeSBzaXplIGFuZCB0eXBlIG9mIHRyaWdnZXIuJ30KZ2dwbG90KG1vZGNvbXAsIAogICAgICAgYWVzKHggPSBtZF9ncnBfYWxwaGEsCiAgICAgICAgICAgeSA9IG1kX2dycF9zaWcsIAogICAgICAgICAgIHNpemUgPSBuLAogICAgICAgICAgIGZpbGwgPSBUcmlnZ2VyLAogICAgICAgICAgIGxhYmVsID0gSW52ZW50b3J5KSkgKwogIGdlb21fZXJyb3JiYXJoKGFlcyh4bWF4ID0gaGlfZ3JwX2FscGhhLCAKICAgICAgICAgICAgICAgICAgICB4bWluID0gbG9fZ3JwX2FscGhhKSwKICAgICAgICAgICAgICAgIGNvbCA9ICJncmV5IiwgbGluZXdpZHRoID0gMC41KSArCiAgZ2VvbV9lcnJvcmJhcihhZXMoeW1heCA9IGhpX2dycF9zaWcsIAogICAgICAgICAgICAgICAgICAgIHltaW4gPSBsb19ncnBfc2lnKSwKICAgICAgICAgICAgICAgIGNvbCA9ICJncmV5IiwgbGluZXdpZHRoID0gMC41KSArCiAgc2NhbGVfZmlsbF9icmV3ZXIocGFsZXR0ZSA9ICJQdU9yIikgKwogIGxhYnMoeCA9IGV4cHJlc3Npb24ocGFzdGUoIlBvc3RlcmlvciAiLCBhbHBoYVtqXSkpLAogICAgICAgc2l6ZSA9ICJMYXJnZVxubGFuZHNsaWRlcyIsCiAgICAgICBiZyA9ICJMYW5kc2xpZGVcbnRyaWdnZXIiKSArCiAgZ2VvbV9wb2ludCgpICsKICBnZW9tX3BvaW50KHBjaCA9IDIxLCBjb2xvciA9ICJibGFjayIpICsKICBnZW9tX3RleHRfcmVwZWwoYWVzKGxhYmVsID0gaWZlbHNlKG1kX2dycF9hbHBoYSA+IDMgfCBtZF9ncnBfc2lnID4gMSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnZlbnRvcnksICIiKSwKICAgICAgICAgICAgICAgIGJnLmNvbG9yID0gIndoaXRlIiwgYmcuciA9IDAuMiksIAogICAgICAgICAgICBoanVzdCA9IC0wLjEsIHZqdXN0ID0gLTAuNSkgKwogIHNjYWxlX3hfY29udGludW91cyhicmVha3MgPSBzZXEoMCwgOCwgMSkpICsKICBzY2FsZV95X2xvZzEwKGV4cHJlc3Npb24ocGFzdGUoIlBvc3RlcmlvciAiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2lnbWFbal0sICIgKCIsIGttXjIsICIpIikpLAogICAgICAgIGJyZWFrcyA9IHRyYW5zX2JyZWFrcygibG9nMTAiLCBmdW5jdGlvbih5KSAxMCBeIHkpLAogICAgICAgIGxhYmVscyA9IHRyYW5zX2Zvcm1hdCgibG9nMTAiLCBtYXRoX2Zvcm1hdCgxMCBeIC54KSkpICsKICB0aGVtZV9idygpICsKICB0aGVtZShhc3BlY3QucmF0aW8gPSAxKQpgYGAKCldlIGFsc28gZmluZCB0aGF0IHRoZSA5NSUgY3JlZGlibGUgaW50ZXJ2YWxzIG9mIGJvdGggR0RQIHBhcmFtZXRlcnMgb3ZlcmxhcCBmb3IgbGFuZHNsaWRlIGludmVudG9yaWVzIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciB0aGV5IGFyZSBhdHRyaWJ1dGVkIHRvIHJlY2VudCBlYXJ0aHF1YWtlcyBhbmQgcmFpbnN0b3Jtcywgb3Igd2hldGhlciB0aGV5IGludGVncmF0ZSBsYW5kc2xpZGUgb2JzZXJ2YXRpb25zLCBhbmQgdGh1cyBsaWtlbHkgdmFyaW91cyB0cmlnZ2Vycywgb3ZlciBtYW55IHllYXJzLiBXZSBpbmZlciB0aGF0IHRoZSBzY2FsaW5nIHN0YXRpc3RpY3MgZGlzY2xvc2UgdmVyeSBsaXR0bGUgYWJvdXQgdGhlIHR5cGUgb2YgbGFuZHNsaWRlIHRyaWdnZXIuIEluIHRoaXMgY29udGV4dCwgb3VyIGZpbmRpbmdzIGNhdXRpb24gYWdhaW5zdCBhIG1lY2hhbmlzdGljIGludGVycHJldGF0aW9uIG9mIHRoZSBzY2FsaW5nIHBhcmFtZXRlcnMuIAoKCiMjIFJvbGUgb2Ygc2l6ZSB0aHJlc2hvbGQgYW5kIHNhbXBsZSBzaXplCgpUaGUgaGVhdnktdGFpbGVkIGRpc3RyaWJ1dGlvbiBvZiBsYW5kc2xpZGVzIG1lYW5zIHRoYXQgd2UgZGlzY2FyZGVkIG1hbnkgc2FtcGxlcyBmb3Igc21hbGwgaW5jcmVhc2VzIGluICRcbXUkLiBUbyB0ZXN0IHRoZSBzZW5zaXRpdml0eSBvZiBvdXIgcmVzdWx0cyB0byB0aGUgY2hvaWNlIG9mIHNpemUgdGhyZXNob2xkICRcbXUkLCB3ZSByZXBsaWNhdGVkIG91ciBhbmFseXNlcywgYW5kIHJlY29yZGVkIHRoZSB2YXJpYXRpb24gb2YgdGhlIHBvb2xlZCBlc3RpbWF0ZXMgJFxiYXJ7a30kIGFuZCAkXGJhcntcc2lnbWF9JCBhcyBhIGZ1bmN0aW9uIG9mIGJvdGggJFxtdSQgYW5kIHRoZSBtaW5pbXVtIG51bWJlciBvZiBsYXJnZSBsYW5kc2xpZGVzIHRoYXQgYW4gaW52ZW50b3J5IG5lZWRzIHRvIGhhdmUgdG8gYmUgY29uc2lkZXJlZCBpbiBvdXIgYW5hbHlzaXMuCgpgYGB7ciBpbmNsdWRlPUZBTFNFfQojIEltcG9ydCBwb3N0ZXJpb3IgaHlwZXJwYXJhbWV0ZXIgZXN0aW1hdGVzCmh5cGFyYW0gPC0gcmVhZF9jc3YoImxzaW52X2h5cGFyYW0uY3N2IikKaHlwYXJhbSA8LSBoeXBhcmFtICU+JSAKICBncm91cF9ieShtdSwgZ3Jwc2l6ZSkgJT4lCiAgbXV0YXRlKG1vZGVsX2lkID0gY3VyX2dyb3VwX2lkKCkpCmBgYAoKYGBge3IsIHdhcm5pbmcgPSBGQUxTRSwgZmlnLmNhcCA9ICdFZmZlY3Qgb2YgYXJiaXRyYXJpbHkgZml4ZWQgc2l6ZSB0aHJlc2hvbGQgYW5kIG1pbmltdW0gc2FtcGxlIHNpemUgJG4kIG9uIHBvc3RlcmlvciBlc3RpbWF0ZXMgb2YgdGhlIHNjYWxpbmcgZXhwb25lbnQgYW5kIHRoZSByb2xsLW92ZXIuJ30KbWluZ3JwX2xhYmVsbGVyIDwtIGFzX2xhYmVsbGVyKAogIGMoYDVgID0gIm4gPiA1IiwKICAgIGAxMGAgPSAibiA+IDEwIiwKICAgIGAyNWAgPSAibiA+IDI1IiwKICAgIGA1MGAgPSAibiA+IDUwIiwKICAgIGAxMDBgID0gIm4gPiAxMDAiKQopCgpwX3NlbnMxIDwtIGdncGxvdChoeXBhcmFtLCBhZXMoeCA9IDEgLyBhX3Bvc3QsIHkgPSBhcy5mYWN0b3IobXUpKSkgKwogIGxhYnMoeCA9IGV4cHJlc3Npb24ocGFzdGUoIlBvb2xlZCAiLCBhbHBoYSkpLAogICAgICAgeSA9IGV4cHJlc3Npb24ocGFzdGUobXUsICIgKCIsIGttXjIsICIpIikpKSArCiAgc3RhdF9oYWxmZXllKGludGVydmFsX3NpemUgPSAwLjUsCiAgICAgICAgICAgICAgIHNoYXBlID0gMjEsCiAgICAgICAgICAgICAgIHBvaW50X2NvbG9yID0gInJlZCIsCiAgICAgICAgICAgICAgIHBvaW50X2ZpbGwgPSAid2hpdGUiLAogICAgICAgICAgICAgICBwb2ludF9zaXplID0gMS41LAogICAgICAgICAgICAgICBzbGFiX2ZpbGwgPSAib3JjaGlkIiwKICAgICAgICAgICAgICAgc2xhYl9hbHBoYSA9IDAuNzUsCiAgICAgICAgICAgICAgIG5vcm1hbGl6ZSA9ICJwYW5lbHMiLAogICAgICAgICAgICAgICBzaG93LmxlZ2VuZCA9IEZBTFNFKSArIAogIHhsaW0oMSwgMi4yNSkgKwogIHNjYWxlX3lfZGlzY3JldGUoYnJlYWtzID0gc2VxKDAuMSwgMC4zLCAwLjEpKSArCiAgdGhlbWVfYncoKSArCiAgdGhlbWUoYXNwZWN0LnJhdGlvID0gMSwgbGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKSArCiAgZmFjZXRfd3JhcCggfiBncnBzaXplLCBuY29sID0gNSwgbGFiZWxsZXIgPSBtaW5ncnBfbGFiZWxsZXIpCgpwX3NlbnMyIDwtIGdncGxvdChoeXBhcmFtLCBhZXMoeCA9IHNpZ21hX3Bvc3QsIHkgPSBhcy5mYWN0b3IobXUpKSkgKwogIGxhYnMoeCA9IGV4cHJlc3Npb24ocGFzdGUoIlBvb2xlZCAiLCBzaWdtYSwgIiAoIiwga21eMiwgIikiKSksCiAgICAgICB5ID0gZXhwcmVzc2lvbihwYXN0ZShtdSwgIiAoIiwga21eMiwgIikiKSkpICsKICBzdGF0X2hhbGZleWUoaW50ZXJ2YWxfc2l6ZSA9IDAuNSwKICAgICAgICAgICAgICAgc2hhcGUgPSAyMSwKICAgICAgICAgICAgICAgcG9pbnRfY29sb3IgPSAicmVkIiwKICAgICAgICAgICAgICAgcG9pbnRfZmlsbCA9ICJ3aGl0ZSIsCiAgICAgICAgICAgICAgIHBvaW50X3NpemUgPSAxLjUsCiAgICAgICAgICAgICAgIHNsYWJfZmlsbCA9ICJkYXJrb3JhbmdlIiwKICAgICAgICAgICAgICAgc2xhYl9hbHBoYSA9IDAuNzUsCiAgICAgICAgICAgICAgIG5vcm1hbGl6ZSA9ICJwYW5lbHMiLAogICAgICAgICAgICAgICBzaG93LmxlZ2VuZCA9IEZBTFNFKSArIAogIHhsaW0oMC4xLCAxLjUpICsKICBzY2FsZV95X2Rpc2NyZXRlKGJyZWFrcyA9IHNlcSgwLjEsIDAuMywgMC4xKSkgKwogIHRoZW1lX2J3KCkgKwogIHRoZW1lKGFzcGVjdC5yYXRpbyA9IDEsIGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIikgKwogIGZhY2V0X3dyYXAoIH4gZ3Jwc2l6ZSwgbmNvbCA9IDUsIGxhYmVsbGVyID0gbWluZ3JwX2xhYmVsbGVyKQoKcGxvdF9ncmlkKHBfc2VuczEsIHBfc2VuczIsIGFsaWduID0gInYiLCBuY29sID0gMSwKICAgICAgICAgIGxhYmVscyA9IGMoImEiLCAiYiIpKQpgYGAKCldlIGZpbmQgdGhhdCB2YXJ5aW5nIHRoZSBzaXplIHRocmVzaG9sZCBzdWNoIHRoYXQgMC4wNzUga21eMl4gPCAkXG11JCA8IDAuMyBrbV4yXiByZXR1cm5zIHBvc3RlcmlvciBwb29sZWQgdmFsdWVzIG9mICRcYWxwaGEkIHRoYXQgZGVjcmVhc2Ugc2xpZ2h0bHkgd2l0aCBpbmNyZWFzaW5nICRcbXUkIGFuZCB0aGUgbWluaW11bSBudW1iZXIgb2Ygc2FtcGxlcyBwZXIgaW52ZW50b3J5LCB0aG91Z2ggd2l0aCBtdWNoIG92ZXJsYXAuIE92ZXJhbGwsIGByIHJvdW5kKEhESW9mTUNNQygxIC8gaHlwYXJhbSRhX3Bvc3QpWzFdLCAyKWAgJDxcYmFye1xhbHBoYX08JCBgciByb3VuZChIRElvZk1DTUMoMSAvIGh5cGFyYW0kYV9wb3N0KVsyXSwgMilgIHdpdGggOTUlIHByb2JhYmlsaXR5IHJlZ2FyZGxlc3Mgb2YgdGhlIHRocmVzaG9sZCBvciBzYW1wbGUgc2l6ZSB0aGF0IHdlIHBpY2suIEVzdGltYXRlcyBvZiAkXGJhcntcc2lnbWF9JCBpbmNyZWFzZSBzaWdodGx5IHdpdGggJFxtdSQsIGJ1dCBhbHNvIHdpdGggc29tZSBvdmVybGFwLiBQcmVmZXJyaW5nIGxhcmdlciBpbnZlbnRvcmllcyBmb3IgYSBnaXZlbiBzaXplIHRocmVzaG9sZCByZWR1Y2VzIHRoZSB0b3RhbCBzYW1wbGUgc2l6ZSBzdWNoIHRoYXQgdGhlIHBvb2xlZCBwb3N0ZXJpb3IgZGlzdHJpYnV0aW9ucyBvZiAkXHNpZ21hJCBnZXQgYnJvYWRlci4gCgpXZSBpbmZlciB0aGF0IHRoZSBjaG9pY2Ugb2YgJFxtdSQsIGFuZCBoZW5jZSB0aGUgZGVmaW5pdGlvbiBvZiAibGFyZ2UiIGxhbmRzbGlkZXMgW0BNY0NvbGw6MjAyNGFhXSwgaGFzIGxpbWl0ZWQgaW5mbHVlbmNlIG9uIHRoZSBzY2FsaW5nIHN0YXRpc3RpY3MsIGFuZCBlc3BlY2lhbGx5ICRcYmFye1xhbHBoYX0kLiBWYWx1ZXMgb2YgJFxtdSQgYmVsb3cgdGhlIHJhbmdlIHRoYXQgd2UgdGVzdGVkIHZpb2xhdGUgdGhlIGFzc3VtcHRpb24gb2YgYSBoaWdoIHRocmVzaG9sZCBzdWNoIHRoYXQgYSBHUEQgd291bGQgYmUgaW5hcHByb3ByaWF0ZSwgd2hlcmVhcyB2YWx1ZXMgYWJvdmUgdGhpcyByYW5nZSBzdWZmZXIgZnJvbSB0b28gc21hbGwgc2FtcGxlIHNpemVzLiBUaGUgcG9vbGVkIHNjYWxlIHBhcmFtZXRlciAkXGJhcntcc2lnbWF9JCBzaG93cyBsZXNzIHZhcmlhdGlvbiB3aXRoICRcbXUkIGFuZCBoYXMgbGFyZ2VseSBvdmVybGFwcGluZyBwb3N0ZXJpb3JzLiBIZW5jZSwgdGhlIGNob2ljZSBvZiB0aGUgbWluaW11bSBudW1iZXIgb2YgbGFyZ2UgbGFuZHNsaWRlcyBwZXIgaW52ZW50b3J5ICgkbl97XG1hdGhybXttaW59fSQgPSBgciBtaW5fZ3JwX3NpemVgKSBsaW1pdHMgYm90aCB0aGUgbnVtYmVyIG9mIGxldmVscyBpbiBvdXIgbW9kZWwgYW5kIHRoZSBvdmVyYWxsIHNhbXBsZSBzaXplLiBBZG1pdHRpbmcgbW9yZSBpbnZlbnRvcmllcyB0aGF0IGNvbnRhaW4gZmV3ZXIgbGFyZ2UgbGFuZHNsaWRlcyBjaGFuZ2VzIHRoZSBwb3N0ZXJpb3IgJFxiYXJ7a30kIGFuZCAkXGJhcntcc2lnbWF9JCBvbmx5IHNsaWdodGx5LCBidXQgZG9lcyBuYXJyb3cgdGhlIHVuY2VydGFpbnRpZXMsIGVzcGVjaWFsbHkgZm9yIGhpZ2hlciB0aHJlc2hvbGRzICRcbXUkLgoKCiMjIEFkdmFudGFnZXMKCk91ciBCYXllc2lhbiBtdWx0aS1sZXZlbCBhcHByb2FjaCBleHBhbmRzIG9uIHByZXZpb3VzLCB0aG91Z2ggbGFyZ2VseSBzZXBhcmF0ZSwgZWZmb3J0cyBvZiBjb21wYXJpbmcgbGFuZHNsaWRlIHNpemUgc3RhdGlzdGljcyBhY3Jvc3MgZGlmZmVyZW50IGludmVudG9yaWVzLiBXZSBvZmZlciBoZXJlIGEgc2luZ2xlLCBjb25zaXN0ZW50IG1vZGVsIHRoYXQgaGFzIHNldmVyYWwgYWR2YW50YWdlczoKCkZpcnN0LCB0aGUgQmF5ZXNpYW4gc2V0dXAgY2FuIGhhbmRsZSB0aGUgc21hbGwgc2FtcGxlIHByb2JsZW0gb2YgbGFyZ2UgbGFuZHNsaWRlcy4gU2NhbGluZyBwYXJhbWV0ZXJzIGZvciBsYXJnZSBsYW5kc2xpZGVzIGZyb20gYSBzaW5nbGUgbGFuZHNsaWRlIGludmVudG9yeSBhcmUgY29tbW9ubHkgZXN0aW1hdGVkIGZyb20gZXh0cmFwb2xhdGluZyBtb2RlbCBmaXRzIHRoYXQgbGFyZ2VseSBkcmF3IG9uIG1vcmUgbnVtZXJvdXMsIHNtYWxsZXIgbGFuZHNsaWRlcy4gWWV0LCBldmVuIHNpbXVsYXRlZCBwb3dlci1sYXcgZGlzdHJpYnV0ZWQgZGF0YSBoYXZlIG5hdHVyYWwgc2NhdHRlciBpbiB0aGUgbGFyZ2VzdCBvZiBvYnNlcnZhdGlvbnMgW0BDbGF1c2V0OjIwMDlpeV0sIG1ha2luZyBpdCBkaWZmaWN1bHQgdG8gdmFsaWRhdGUgZXh0cmFwb2xhdGlvbnMgYW5kIGxlYWRpbmcgdG8gb3Zlci1jb25maWRlbnQgcGFyYW1ldGVyIGVzdGltYXRlcy4gVXNpbmcgZGF0YSBmcm9tIG90aGVyIGxhbmRzbGlkZSBpbnZlbnRvcmllcyB0byB2YWxpZGF0ZSB0aGVzZSBlc3RpbWF0ZXMgb2Z0ZW4gdGFjaXRseSBhc3N1bWVzIHRoYXQgdGhlIHNjYWxpbmcgcGFyYW1ldGVycyBhZ3JlZSBvciBkaWZmZXIgd2l0aGluIGVycm9yLCBidXQgb2ZmZXJzIG5vIHdheSBvZiBkZXRlcm1pbmluZyBvZiB3aGV0aGVyIHRoaXMgYXNzdW1wdGlvbiBpcyBhdCBhbGwgdmFsaWQuIFRoZSBtdWx0aS1sZXZlbCBtb2RlbCBpbnN0ZWFkIGRyYXdzIG9uIHRoZSBsYXJnZXIgc2FtcGxlIHNpemUgZnJvbSBhbGwgaW52ZW50b3JpZXMsIGFuZCBleHBsaWNpdGx5IHJlZmluZXMgdGhpcyBzaGFyZWQga25vd2xlZGdlIGluIGRlZGljYXRlZCBwb3N0ZXJpb3IgZGlzdHJpYnV0aW9ucyBmb3IgZWFjaCBjYXRhbG9ndWUuIEluIGdlbmVyYWwsIGdyb3VwLWxldmVsIHBhcmFtZXRlciBlc3RpbWF0ZXMgdGVuZCB0byBiZSBjbG9zZXIgdG8gdGhlIHBvb2xlZCBtZWFuIHRoYW4gdGhvc2UgZGVyaXZlZCBmb3Igc2VwYXJhdGUgbW9kZWxzIHVzaW5nIGZld2VyIGRhdGEgZnJvbSBlYWNoIGdyb3VwIGFsb25lLiBUaGlzIGVmZmVjdCBpcyBrbm93biBhcyBwYXJhbWV0ZXIgc2hyaW5rYWdlIGFuZCBndWFyZHMgYWdhaW5zdCBvdmVyZml0dGluZywgZXNwZWNpYWxseSBmb3IgaW52ZW50b3JpZXMgd2l0aCBmZXdlciBkYXRhLgoKU2Vjb25kLCB0aGUgQmF5ZXNpYW4gdHJlYXRtZW50IGRvY3VtZW50cyBleHBsaWNpdGx5IGFsbCBwYXJhbWV0ZXIgdW5jZXJ0YWludGllcywgYW5kIGVzcGVjaWFsbHkgdGhvc2UgdGhhdCBjYXB0dXJlIHByZXZpb3VzIGtub3dsZWRnZSBhYm91dCByZXBvcnRlZCBwYXJhbWV0ZXJzIHRoYXQgY2hhcmFjdGVyaXNlIGxhbmRzbGlkZSBzaXplIGRpc3RyaWJ1dGlvbnMuIFdlIGNhbiB0aHVzIHF1YW50aWZ5IGhvdyBtdWNoIHdlIGhhdmUgbGVhcm5lZCBmcm9tIHRoZSBkYXRhIGJ5IGNvbXBhcmluZyB0aGUgcG9zdGVyaW9yIGFuZCBwcmlvciBkaXN0cmlidXRpb25zLiBCeSBkZXNpZ24sIGEgQmF5ZXNpYW4gbW9kZWwgc2Vla3MgYSBjb21wcm9taXNlIGJldHdlZW4gdGhlc2UgcHJldmlvdXMgZmluZGluZ3MgYW5kIHRoZSBkYXRhIGNvbnNpZGVyZWQgaGVyZSBpbiBhIHByb2JhYmlsaXN0aWNhbGx5IGNvbnNpc3RlbnQgd2F5LiBUbyB0aGlzIGVuZCwgd2UgbWFkZSBzdXJlIHRvIGluY2x1ZGUgbW9zdGx5IHJlY2VudGx5IHB1Ymxpc2hlZCBsYW5kc2xpZGUgaW52ZW50b3JpZXMgb3IgdGhvc2UgdGhhdCBoYWQgbm90IGJlZW4gY29uc2lkZXJlZCBpbiBzY2FsaW5nIHN0dWRpZXMgYmVmb3JlLiBQb3N0ZXJpb3IgcGFyYW1ldGVyIGVzdGltYXRlcyBmb3IgY2F0YWxvZ3VlcyB3aXRoIGZldyBsYXJnZSBsYW5kc2xpZGVzIGFyZSBicm9hZGVyIGNvbXBhcmVkIHRvIHRob3NlIHdpdGggbWFueSBsYXJnZSBsYW5kc2xpZGVzLgoKVGhpcmQsIHRoZSBtdWx0aS1sZXZlbCBtb2RlbCBzdHJ1Y3R1cmUgZW5hYmxlcyBkaXJlY3QgY29tcGFyaXNvbiBvZiBwYXJhbWV0ZXIgZXN0aW1hdGVzIGFjcm9zcyBhbmQgYmV0d2VlbiBsYW5kc2xpZGUgaW52ZW50b3JpZXMuIEFueSBkaWZmZXJlbmNlcyBpbiB0aGUgdW5kZXJseWluZyB3b3JrZmxvd3Mgb2YgZGV0ZWN0aW5nIGFuZCBtYXBwaW5nIGxhbmRzbGlkZXMgYW5kIHRoZSBjb21tZW5zdXJhdGUgc2FtcGxlIHNpemVzIGFyZSBiZWluZyBhY2NvdW50ZWQgZm9yIGJ5IHNlcGFyYXRlIHBvc3RlcmlvciBkaXN0cmlidXRpb25zIGFuZCB0aGVpciBkZXZpYXRpb24gZnJvbSB0aGUgcG9vbGVkIGVzdGltYXRlcy4gT3VyIG1vZGVsIG1lYXN1cmVzIG9iamVjdGl2ZWx5IGhvdyBzaW1pbGFyIGxhbmRzbGlkZSBpbnZlbnRvcmllcyBhcmUgaW4gdGVybXMgb2YgdGhlIHNjYWxpbmcgcGFyYW1ldGVycyB0aGF0IGpvaW50bHksIGluc3RlYWQgb2Ygc2VwYXJhdGVseSwgZGVmaW5lIHRoZSBzaXplIGRpc3RyaWJ1dGlvbnMgb2YgbGFyZ2UgbGFuZHNsaWRlcy4KCkZvdXJ0aCwgdGhlIHBlYWstb3Zlci10aHJlc2hvbGQgYXBwcm9hY2ggdGhhdCBkZWZpbmVzIHRoZSBHUEQgaXMgcm9vdGVkIGluIGV4dHJlbWUtdmFsdWUgdGhlb3J5IGFuZCB0aHVzIGV4cHJlc3NlcyBuYXR1cmFsbHkgd2hhdCB3ZSBleHBlY3Qgc3RhdGlzdGljYWxseSBpbiB0aGUgc2l6ZSBkaXN0cmlidXRpb24gb2YgbGFyZ2UgbGFuZHNsaWRlcy4gVGhlIHBhcmFtZXRlcnMgb2YgdGhlIEdQRCBjb250YWluIGluZm9ybWF0aW9uIGFib3V0IHRoZSAicm9sbC1vdmVyIiBsb2NhdGlvbiBhbmQgcG93ZXItbGF3IHNjYWxpbmcsIGFuZCB0cmFuc2xhdGUgcmVhZGlseSBpbnRvIHBhcmFtZXRlcnMgb2Ygb3RoZXIgZGlzdHJpYnV0aW9ucyB1c2VkIHRvIGNoYXJhY3RlcmlzZSB0aGUgc2l6ZSBzY2FsaW5nIG9mIGxhbmRzbGlkZXMuCgoKIyMgRnVydGhlciBhcHBsaWNhdGlvbnMKCldlIGNhbiBmbGV4aWJseSBtb2RpZnkgb3VyIG11bHRpLWxldmVsIG1vZGVsIGluIHNldmVyYWwgd2F5cy4gT25lIG9wdGlvbiBpcyB0byBncm91cCB0aGUgZGF0YSBpbiBvdGhlciB3YXlzIHRoYW4gYnkgaW52ZW50b3JpZXMuIEZvciBleGFtcGxlLCB3ZSBjYW4gc3BlY2lmeSB0aGUgZ3JvdXAgbGV2ZWxzIHN1Y2ggdGhhdCB0aGV5IHJlcHJlc2VudCB0aGUgdHlwZSBvZiBpbnZlbnRvcnkgKGV2ZW50LWJhc2VkIHZlcnN1cyBpbnRlZ3JhdGluZyBvdmVyIGEgcGVyaW9kIG9mIHRpbWUpOyB0cmlnZ2VyaW5nIG1lY2hhbmlzbSAoZWFydGhxdWFrZSwgcmFpbnN0b3JtLCBzbm93bWVsdCwgZXRjLik7IHNvaWwgb3Igcm9jayB0eXBlOyBvciBhbnkgb3RoZXIgY2hhcmFjdGVyaXN0aWMgdGhhdCBtYXkgaGF2ZSBiZWVuIGNvbGxlY3RlZCBkdXJpbmcgdGhlIHByb2Nlc3Mgb2YgY29tcGlsaW5nIHRoZSBsYW5kc2xpZGUgaW52ZW50b3J5LiBXZSByZWNhbGwgdGhhdCB0aGUgR1BEIGlzIGJ5IGRlZmluaXRpb24gImJsaW5kIiB0byBkYXRhIGJlbG93IHRoZSB0aHJlc2hvbGQgJFxtdSQgaW4gdGhhdCBpdCB0cnVuY2F0ZXMgYWxsIG9ic2VydmF0aW9ucyBiZWxvdyB0aGUgdGhyZXNob2xkLiBPbmUgYWx0ZXJuYXRpdmUgdG8gaW1wcm92ZSB0aGUgcGFyYW1ldGVyIGVzdGltYXRlcyB3b3VsZCBiZSB0byB1c2UgYSBjZW5zb3JlZCBHUEQgbW9kZWwgdGhhdCBhY2tub3dsZWRnZXMgdGhlIHByZXNlbmNlIG9mIHNtYWxsZXIgbGFuZHNsaWRlcywgdGhvdWdoIHdpdGhvdXQga25vd2luZyB0aGVpciByZXBvcnRlZCBzaXplcy4KCgojIENvbmNsdXNpb25zCgotIFdlIHByb3Bvc2UgYSBtdWx0aS1sZXZlbCBtb2RlbCBhcyBjb21tb24gZ3JvdW5kIGZvciBjb25zaXN0ZW50bHkgZXN0aW1hdGluZyBhbmQgY29tcGFyaW5nIHNpemUgZGlzdHJpYnV0aW9ucyBvZiBsYXJnZSBzbG9wZSBmYWlsdXJlcyBhY3Jvc3MgZGlmZmVyZW50IGludmVudG9yaWVzLiBJbiBjaG9vc2luZyBhIHBlYWstb3Zlci10aHJlc2hvbGQgYXBwcm9hY2ggdGhlIEdlbmVyYWxpc2VkIFBhcmV0byBkaXN0cmlidXRpb24gKEdQRCkgcmVmbGVjdHMgd2hhdCB3ZSB3b3VsZCBleHBlY3Qgc3RhdGlzdGljYWxseSBmcm9tIGEgZ2l2ZW4gbGFuZHNsaWRlIHNpemUgZGlzdHJpYnV0aW9uLiBUaGUgbXVsdGktbGV2ZWwgc2V0dXAgcmVtZWRpYXRlcyB0aGUgcHJvYmxlbSBvZiBsb3cgc2FtcGxlIHNpemUgYnkgbWFraW5nIHVzZSBvZiBhbGwgYXZhaWxhYmxlIGRhdGEgZm9yIGVzdGltYXRpbmcgc2NhbGluZyBwYXJhbWV0ZXJzIHdoaWxlIGFja25vd2xlZGdpbmcgaW5oZXJlbnQgZGlmZmVyZW5jZXMgYWNyb3NzIGludmVudG9yaWVzLgoKLSBPdXIgbW9kZWwgcmVzdWx0cyBiYXNlZCBvbiBgciBzdGFuX2QkTGAgaW52ZW50b3JpZXMgd2l0aCBgciBzdGFuX2QkTmAgbGFyZ2UgbGFuZHNsaWRlcyAoJD4kIDAuMSBrbV4yXikgc2hvdyB0aGF0IHRoZSBwb3dlci1sYXcgZXhwb25lbnQgZm9yIGVhY2ggaW52ZW50b3J5ICRrX2ogPSAxIC8gXGFscGhhX2okIGRpc2Nsb3NlcyBsaXR0bGUgYWJvdXQgdGhlIGRpZmZlcmVudCB1bmRlcmx5aW5nIGxhbmRzbGlkZSB0cmlnZ2VyKHMpLCBnZW9ncmFwaGljIHJlZ2lvbiwgb3IgdGltZSBzcGFuIGNvbmNlcm5pbmcgYSBnaXZlbiBpbnZlbnRvcnksIGkuZS4gd2hldGhlciBpdCBpcyBldmVudC1iYXNlZCBvciBjb21waWxlcyBsYW5kc2xpZGVzIG9mIG1hbnkgZGlmZmVyZW50IGFnZXMuIEludmVudG9yaWVzIG9mIG1vc3RseSB1bmRhdGVkLCBwcmVoaXN0b3JpYyBsYW5kc2xpZGVzIGhhdmUgc2NhbGluZyBleHBvbmVudHMgJFxhbHBoYV9qJCB0aGF0IGhhcmRseSBkaWZmZXIgZnJvbSB0aG9zZSBvZiBoaXN0b3JpYywgZXZlbnQtYmFzZWQgY2F0YWxvZ3Vlcy4KCi0gRGVzcGl0ZSB0aG91c2FuZHMgb2YgbGFyZ2UgbGFuZHNsaWRlcyB0byBsZWFybiBmcm9tLCB0aGUgdW5jZXJ0YWludHkgYWJvdXQgJFxhbHBoYV9qJCBzcGFucyBzZXZlcmFsIGRlY2ltYWwgcG9pbnRzLiBJZiB0YWtpbmcgYWxsIGludmVudG9yaWVzIHRvZ2V0aGVyLCB0aGUgcG9vbGVkICRcYWxwaGEkIGNhcHR1cmVzIG1vc3Qgb2YgdGhpcyB2YXJpYW5jZS4gVGhlIGxvY2F0aW9uIHBhcmFtZXRlciAkXHNpZ21hJCBoYXMgbW9yZSBzcHJlYWQgYWNyb3NzIGludmVudG9yaWVzIGFuZCBpcyBhZmZlY3RlZCBlc3BlY2lhbGx5IGJ5IHRob3NlIHdpdGggd2l0aCBmZXcgb3Igbm8gbGFuZHNsaWRlcyBiZWxvdyBvdXIgc2l6ZSB0aHJlc2hvbGQuIFdlIGluZmVyIHRoYXQgJFxzaWdtYSQgaXMgc2Vuc2l0aXZlIHRvIHRoZSBkZXNpcmVkIGxhbmRzbGlkZSBzaXplIHJhbmdlIGFuZCBsaWtlbHkgcmVmbGVjdHMgdGhlIGluZmx1ZW5jZSBvZiBtYXBwaW5nIGNob2ljZXMuIAotIFdoaWxlIHNldmVyYWwgbnVtZXJpY2FsIG1vZGVsbGluZyBzdHVkaWVzIGhhdmUgYXR0cmlidXRlZCBhIHBoeXNpY2FsIG1lYW5pbmcgdG8gc2NhbGluZyBzdGF0aXN0aWNzIG9mIGxhbmRzbGlkZSBzaXplLCB3ZSBhcmd1ZSB0aGF0IHNvbWUgb2YgdGhpcyBtZWFuaW5nIG1pZ2h0IGdldCBkaWx1dGVkIG9yIGV2ZW4gbG9zdCBpbiBlbXBpcmljYWwgZGF0YSB0aGF0IG1heSBjb21iaW5lIGNvbmZvdW5kaW5nIGNvbnRyb2xzLiBXZSBzdXJtaXNlIHRoYXQgbGFuZHNsaWRlIGludmVudG9yaWVzIHJlY29yZCB0aGVzZSBwaHlzaWNhbCBwcm9jZXNzZXMsIHRob3VnaCBpbiBhIG1peGVkIHdheSB0aGF0IGNvdWxkIGFkbWl0LCBmb3IgZXhhbXBsZSwgZGlmZmVyZW50IGZhaWx1cmUgdHlwZXMsIHJvY2sgYW5kIHNvaWwgdHlwZXMsIGFuZCBncm91bmR3YXRlciBjb25kaXRpb25zLiBXZSBzdXNwZWN0IHRoYXQgbW9zdCBsYW5kc2xpZGUgaW52ZW50b3JpZXMgbWF5IGhhdmUgbWl4ZWQgc2l6ZSBkaXN0cmlidXRpb25zLiBGb3IgZXhhbXBsZSwgbWl4aW5nIGRhdGEgZnJvbSBpbnZlbnRvcmllcyB3aXRoIGRpZmZlcmluZyBzaXplIHRocmVzaG9sZHMgY291bGQgYWRkIHZhcmlhbmNlIHRvICRcc2lnbWEkLiBIZW5jZSwgdGhlIHJlc3VsdGluZyBzY2FsaW5nIHN0YXRpc3RpY3Mgd291bGQgYXQgYmVzdCByZWZsZWN0IGJ1bGsgcGh5c2ljYWwgY2hhcmFjdGVyaXN0aWNzIGluc3RlYWQgb2YgY2xlYXJseSByZXByZXNlbnRpbmcgcGFyYW1ldGVycyBvZiBhIHNpbmdsZSwgd2VsbC1jb25zdHJhaW5lZCBwaHlzaWNhbCBtb2RlbCBvZiBzbG9wZSBzdGFiaWxpdHkuCgotIE91ciBtb2RlbCBtZWFzdXJlcyBvYmplY3RpdmVseSBieSBob3cgbXVjaCBzY2FsaW5nIHN0YXRpc3RpY3MgZGlmZmVyIGFjcm9zcyBpbnZlbnRvcmllcyB3aXRoaW4gZXN0aW1hdGlvbiBlcnJvci4gU3VjaCBkaWZmZXJlbmNlcyBjYW4gYmUgdml0YWwgaWYgdXNpbmcgc2NhbGluZyBzdGF0aXN0aWNzIGZvciBwcmVkaWN0aW5nIGZ1dHVyZSBsYW5kc2xpZGUgaGF6YXJkIGluIHRlcm1zIG9mIHNpemUgYW5kIGZyZXF1ZW5jeSBbQG5oZXNzLTIzLTMwNTEtMjAyM10uCgojIEFja25vd2xlZGdlbWVudHMKCldlIHVzZWQgdGhlIHN0YXRpc3RpY2FsIHByb2dyYW1taW5nIGVudmlyb25tZW50IF9fUl9fICg8aHR0cHM6Ly9jcmFuLnItcHJvamVjdC5vcmc+KSB3aXRoIF9SU3R1ZGlvXyAoPGh0dHBzOi8vcG9zaXQuY28vPikgYXMgYSBmcm9udGVuZCBmb3IgYWxsIGRhdGEgYW5hbHlzaXMsIGFuZCBjb2RlZCB0aGUgQmF5ZXNpYW4gR1BEIGluIHRoZSBwcm9iYWJpbGlzdGljIGxhbmd1YWdlIFNUQU4gKDxodHRwczovL21jLXN0YW4ub3JnLz4pOyBhbGwgYXJlIGZyZWVseSBhdmFpbGFibGUuIFRoZSBsYW5kc2xpZGUgaW52ZW50b3JpZXMgc3R1ZGllZCBoZXJlIGhhdmUgZWl0aGVyIGJlZW4gcHVibGlzaGVkIGFzIGluZGljYXRlZCBvciBhcmUgYXZhaWxhYmxlIGRpcmVjdGx5IGZyb20gdGhlIG9yaWdpbmFsIGNvbnRyaWJ1dG9ycy4gV2lsbCBTbWl0aCBhbmQgU3R1YXJ0IER1bm5pbmcga2luZGx5IHNoYXJlZCBkYXRhIG9uIGxhbmRzbGlkZXMgaW4gS2x1YW5lIE5hdGlvbmFsIFBhcmsuIFBhcnQgb2YgdGhpcyByZXNlYXJjaCB3YXMgZnVuZGVkIGJ5IHRoZSBHZXJtYW4gUmVzZWFyY2ggRm91bmRhdGlvbiB2aWEgdGhlIFJlc2VhcmNoIFRyYWluaW5nIEdyb3VwIF9OYXRSaXNrQ2hhbmdlXyAoREZHIEdSSyAyMDQzLCA8aHR0cHM6Ly93d3cudW5pLXBvdHNkYW0uZGUvZW4vbmF0cmlza2NoYW5nZS8+KS4KCiMgUmVmZXJlbmNlcw==