Assignment Objectives

  • Understand the theoretical basis of Bootstrap sampling methods for approximating sampling distributions.

  • Assess the performance of Bootstrap sampling distributions against exact and asymptotic sampling distributions.

  • Implement Bootstrap sampling algorithm and construct sampling distributions using R.


Use of AI Tools

Policy on AI Tool Use: Students must adhere to the AI tool policy specified in the course syllabus. The direct copying of AI-generated content is strictly prohibited. All submitted work must reflect your own understanding; where external tools are consulted, content must be thoroughly rephrased and synthesized in your own words.

Code Inclusion Requirement: Any code included in your essay must be properly commented to explain the purpose and/or expected output of key code lines. Submitting AI-generated code without meaningful, student-added comments will not be accepted.


Asymptotic Distribution of Sample Variance

Assume that \(\{ x_1, x_2, \cdots, x_n \} \to F(x)\) with \(\mu = E[X]\) and \(\sigma^2 = \text{var}(X)\). Denote

\[ s^2 = \frac{1}{n-1}\sum_{i=1}^n (x_i - \mu)^2 \]

If \(n\) is large,

\[ s^2 \to N\left(\sigma^2, \frac{\mu_4-\sigma^4}{n} \right) \]

where \(\mu_4 = E[(X_i - \mu)^4]\) is tje 4th central moment which can be estimated by

\[ \hat{\mu}_4 = \frac{1}{n}\sum_{i=1}^n(x_i-\bar{x})^4. \]

Note: This describes the asymptotic convergence of the sample variance, following from the central limit theorem (CLT). The sample size required for this approximation to hold is situation-dependent.


Question 1: Asymptotic vs Bootstrap Sampling Distributions

Write an essay summarizing the concepts of Asymptotic and Bootstrap Sampling Distributions, along with their key applications. Your discussion should be grounded in your personal understanding of the material. Any external sources including AI tools consulted must be clearly cited.

Essay Prompt: Discuss the concepts of the bootstrap sampling plan, the bootstrap sampling distribution, and the asymptotic sampling distribution in the context of statistics (e.g., sample mean and variance) computed from an independent and identically distributed (i.i.d.) sample. Your discussion should:

  • Clearly outline the key assumptions required for each method.

  • Explain the practical application of each distribution.

  • Provide guidance on when and why one should be preferred over the other in statistical inference.

In statistical inference having the understanding of the sampling distribution of an estimator such as the sample mean or sample variance is very fundamental in the world of statistics. Two approaches to approximating sampling distributions are the asymptotic approach and the bootstrap approach. Although both approaches describe how an estimator varies across repeated samples, they rely differently with it’s principles and assumptions.

The asymptotic sampling distribution is established from the probability theory, with most notably the Central Limit Theorem coming into mind. Suppose we observe an independent and identically distributed sample (X_1, X_2, , X_n) from a population with a limited mean and variance. The CLT highlights that as the sample size (n) becomes large, the sampling distribution of the sample mean becomes normal, regardless of the shape of the underlying population distribution. Specifically, the sample mean is approximately normally distributed with mean equal to the population mean and variance equal to the population variance divided by (n). The key assumptions for asymptotic results are independence, identical distribution, and finite varaince. The practical advantage of the asymptotic approach is that is simple because once the standard error is estimated, inference can proceed using normal approximations. These approximations rely on large sample sizes and would perform poorly when the sample is relatively small or the data is highly skewed.

In contrast, the bootstrap sampling distribution is a computational method that approximates the true sampling distribution directly from the observed data and instead of relying on theoretical limit results, the bootstrap treats the empirical distribution of the sample as an estimate of the whole population distribution. From the original i.i.d. sample, many new samples of size are drawn with replacement and the statistic of interest (sample mean or variance) is computed for each resample. The distribution of these bootstrap replicates forms what is known as the bootstrap sampling distribution. The primary assumption underlying the bootstrap is that the original sample is representative of the population and that observations are independent and identically distributed. No assumption of normality is required and the bootstrap is particularly useful when the sampling distribution of a statistic is complicated, unknown, or difficult to derive. It is perferably advantageous when using small to moderate samples or when the population distribution is skewed.

The choice between asymptotic and bootstrap methods depends on the context and practicality of the situation. When the sample size is large and theoretical conditions are clear and satisfied, asymptotic approximations are more efficent, interpretable, and simple to compute. They are often preferred for standard statistics like the sample mean when data behaves well. However, when sample sizes are limited, distributions are non-normal, or the statistic is complex, the bootstrap often provides a more accurate approximation of the sampling distribution.

In summary, asymptotic sampling distributions rely on theoretical large-sample results and provide formula-based inferencing under clear assumptions. Bootstrap sampling distributions rely on resampling from the observed data to approximate the estimator’s variability with fewer distributional assumptions. Both approaches are grounded in the idea of repeated sampling, but they differ on whether such repetition is supported by analysis or by computational simulation.

Reference List: Efron, B. “Bootstrap Methods: Another Look at the Jackknife .” Https://Www.Jstor.Org/, Institute of Mathematical Statistics, 5 Apr. 2007, sites.stat.washington.edu/courses/stat527/s14/readings/ann_stat1979.pdf.


Question 2: Daily Coffee Sales (in mL) at Two Different Cafe Locations

This data set represents the volume of regular brewed coffee sold per day (in milliliters) at two different cafe locations over a period of 50 days.

2850, 3200, 2900, 3100, 2950, 7800, 8100, 7900, 3300, 3050, 4000, 4200, 3150, 3400, 7700, 8200, 
3250, 4400, 3100, 4200, 4500, 4800, 4300, 8500, 8200, 8900, 8700, 3250, 3000, 4600, 4100, 8400, 
8800, 3350, 4700, 3100, 8100, 3050, 8300, 4100, 3100, 8300, 8900, 8200, 4400, 4500, 3250, 4600, 
8400, 3300, 4200, 4500, 4800, 4300, 8500

We are interested in finding the sampling distribution of sample means that will be used for various inferences about the underlying population mean.

  1. Based on the given data, can the Central Limit Theorem be used to derive the asymptotic sampling distribution of the sample mean? Justify your answer.
# Data
coffee <- c(
  2850, 3200, 2900, 3100, 2950, 7800, 8100, 7900, 3300, 3050,
  4000, 4200, 3150, 3400, 7700, 8200, 3250, 4400, 3100, 4200,
  4500, 4800, 4300, 8500, 8200, 8900, 8700, 3250, 3000, 4600,
  4100, 8400, 8800, 3350, 4700, 3100, 8100, 3050, 8300, 4100,
  3100, 8300, 8900, 8200, 4400, 4500, 3250, 4600, 8400, 3300,
  4200, 4500, 4800, 4300, 8500
)

n <- length(coffee)

# Sample Mean and Standard Error
sample_mean <- mean(coffee)
sample_sd   <- sd(coffee)
se_mean     <- sample_sd / sqrt(n)
se_asymp <- sample_sd / sqrt(n)

sample_mean
[1] 5250
se_mean
[1] 302.4396

Yes, since there are 55 samples, n ≈ 50 the Central Limit Theorem applies and the sampling distribution of the mean ≈ Normal.

  1. Apply the bootstrap method to estimate the sampling distribution (often called the bootstrap sampling distribution) of the sample mean. Generate a kernel density estimate from the bootstrap sample means and plot it. Then, use this bootstrap distribution to validate your conclusion from part (a). Make sure your visuals are effective in enhancing the presentation of these results.
# Bootstrap Procedure


set.seed(123)
B <- 10000   # number of bootstrap samples

boot_means <- replicate(B, mean(sample(coffee, n, replace = TRUE)))

boot_se_mean <- sd(boot_means)
boot_se_mean
[1] 297.3615
# Plot Bootstrap Sampling Distribution


plot(density(boot_means),
     main = "Bootstrap Sampling Distribution of the Sample Mean",
     xlab = "Bootstrap Sample Means",
     lwd = 2)

# Add vertical line for observed sample mean
abline(v = sample_mean, col = "red", lwd = 2, lty = 2)

# Overlay asymptotic normal approximation
curve(dnorm(x, mean = sample_mean, sd = se_asymp),
      lwd = 2,
      lty = 3,
      add = TRUE)

legend("topright",
       legend = c("Bootstrap KDE",
                  "Observed Sample Mean",
                  "Asymptotic Normal Approximation"),
       lwd = c(2,2,2),
       lty = c(1,2,3))

  1. Repeat the analysis in parts (a) and (b) for the sample variance.
# Sample Variance


sample_var <- var(coffee)
sample_var
[1] 5030833
# Bootstrap for Variance


boot_vars <- replicate(B, var(sample(coffee, n, replace = TRUE)))

boot_se_var <- sd(boot_vars)
boot_se_var
[1] 529733.8
plot(density(boot_vars),
     main = "Bootstrap Sampling Distribution of the Variance",
     xlab = "Bootstrap Sample Variances",
     lwd = 2)

abline(v = sample_var, col = "red", lwd = 2)

# Asymptotic normal approximation (normal case approximation)
asymp_sd_var <- sqrt(2 * sample_var^2 / (n - 1))

curve(dnorm(x, mean = sample_var, sd = asymp_sd_var),
      lwd = 2,
      lty = 3,
      add = TRUE)

legend("topright",
       legend = c("Bootstrap KDE",
                  "Observed Sample Variance",
                  "Asymptotic Normal"),
       lwd = c(2,2,2),
       lty = c(1,2,3))

LS0tDQp0aXRsZTogIkFzc2lnbm1lbnQgMzogRUNERiBhbmQgQm9vdHN0cmFwIFNhbXBsaW5nIGFuZCBBcHBsaWNhdGlvbnMiDQphdXRob3I6ICJLaWVyYW4gSGVmZmVyYW4gIg0KZGF0ZTogIiBEdWU6IDIvMTcvMjYgIg0Kb3V0cHV0Og0KICBodG1sX2RvY3VtZW50OiANCiAgICB0b2M6IHllcw0KICAgIHRvY19kZXB0aDogNA0KICAgIHRvY19mbG9hdDogeWVzDQogICAgbnVtYmVyX3NlY3Rpb25zOiBubw0KICAgIHRvY19jb2xsYXBzZWQ6IHllcw0KICAgIGNvZGVfZm9sZGluZzogaGlkZQ0KICAgIGNvZGVfZG93bmxvYWQ6IHllcw0KICAgIHNtb290aF9zY3JvbGw6IHllcw0KICAgIHRoZW1lOiBsdW1lbg0KICBwZGZfZG9jdW1lbnQ6IA0KICAgIHRvYzogeWVzDQogICAgdG9jX2RlcHRoOiA0DQogICAgZmlnX2NhcHRpb246IHllcw0KICAgIG51bWJlcl9zZWN0aW9uczogeWVzDQogICAgZmlnX3dpZHRoOiAzDQogICAgZmlnX2hlaWdodDogMw0KICB3b3JkX2RvY3VtZW50OiANCiAgICB0b2M6IHllcw0KICAgIHRvY19kZXB0aDogNA0KICAgIGZpZ19jYXB0aW9uOiB5ZXMNCiAgICBrZWVwX21kOiB5ZXMNCmVkaXRvcl9vcHRpb25zOiANCiAgY2h1bmtfb3V0cHV0X3R5cGU6IGlubGluZQ0KLS0tDQoNCmBgYHtjc3MsIGVjaG8gPSBGQUxTRX0NCiNUT0M6OmJlZm9yZSB7DQogIGNvbnRlbnQ6ICJUYWJsZSBvZiBDb250ZW50cyI7DQogIGZvbnQtd2VpZ2h0OiBib2xkOw0KICBmb250LXNpemU6IDEuMmVtOw0KICBkaXNwbGF5OiBibG9jazsNCiAgY29sb3I6IG5hdnk7DQogIG1hcmdpbi1ib3R0b206IDEwcHg7DQp9DQoNCg0KZGl2I1RPQyBsaSB7ICAgICAvKiB0YWJsZSBvZiBjb250ZW50ICAqLw0KICAgIGxpc3Qtc3R5bGU6dXBwZXItcm9tYW47DQogICAgYmFja2dyb3VuZC1pbWFnZTpub25lOw0KICAgIGJhY2tncm91bmQtcmVwZWF0Om5vbmU7DQogICAgYmFja2dyb3VuZC1wb3NpdGlvbjowOw0KfQ0KDQpoMS50aXRsZSB7ICAgIC8qIGxldmVsIDEgaGVhZGVyIG9mIHRpdGxlICAqLw0KICBmb250LXNpemU6IDIycHg7DQogIGZvbnQtd2VpZ2h0OiBib2xkOw0KICBjb2xvcjogRGFya1JlZDsNCiAgdGV4dC1hbGlnbjogY2VudGVyOw0KICBmb250LWZhbWlseTogIkdpbGwgU2FucyIsIHNhbnMtc2VyaWY7DQp9DQoNCmg0LmF1dGhvciB7IC8qIEhlYWRlciA0IC0gYW5kIHRoZSBhdXRob3IgYW5kIGRhdGEgaGVhZGVycyB1c2UgdGhpcyB0b28gICovDQogIGZvbnQtc2l6ZTogMTVweDsNCiAgZm9udC13ZWlnaHQ6IGJvbGQ7DQogIGZvbnQtZmFtaWx5OiBzeXN0ZW0tdWk7DQogIGNvbG9yOiBuYXZ5Ow0KICB0ZXh0LWFsaWduOiBjZW50ZXI7DQp9DQoNCmg0LmRhdGUgeyAvKiBIZWFkZXIgNCAtIGFuZCB0aGUgYXV0aG9yIGFuZCBkYXRhIGhlYWRlcnMgdXNlIHRoaXMgdG9vICAqLw0KICBmb250LXNpemU6IDE4cHg7DQogIGZvbnQtd2VpZ2h0OiBib2xkOw0KICBmb250LWZhbWlseTogIkdpbGwgU2FucyIsIHNhbnMtc2VyaWY7DQogIGNvbG9yOiBEYXJrQmx1ZTsNCiAgdGV4dC1hbGlnbjogY2VudGVyOw0KfQ0KDQpoMSB7IC8qIEhlYWRlciAxIC0gYW5kIHRoZSBhdXRob3IgYW5kIGRhdGEgaGVhZGVycyB1c2UgdGhpcyB0b28gICovDQogICAgZm9udC1zaXplOiAyMHB4Ow0KICAgIGZvbnQtd2VpZ2h0OiBib2xkOw0KICAgIGZvbnQtZmFtaWx5OiAiVGltZXMgTmV3IFJvbWFuIiwgVGltZXMsIHNlcmlmOw0KICAgIGNvbG9yOiBkYXJrcmVkOw0KICAgIHRleHQtYWxpZ246IGNlbnRlcjsNCn0NCg0KaDIgeyAvKiBIZWFkZXIgMiAtIGFuZCB0aGUgYXV0aG9yIGFuZCBkYXRhIGhlYWRlcnMgdXNlIHRoaXMgdG9vICAqLw0KICAgIGZvbnQtc2l6ZTogMThweDsNCiAgICBmb250LXdlaWdodDogYm9sZDsNCiAgICBmb250LWZhbWlseTogIlRpbWVzIE5ldyBSb21hbiIsIFRpbWVzLCBzZXJpZjsNCiAgICBjb2xvcjogbmF2eTsNCiAgICB0ZXh0LWFsaWduOiBsZWZ0Ow0KfQ0KDQpoMyB7IC8qIEhlYWRlciAzIC0gYW5kIHRoZSBhdXRob3IgYW5kIGRhdGEgaGVhZGVycyB1c2UgdGhpcyB0b28gICovDQogICAgZm9udC1zaXplOiAxNnB4Ow0KICAgIGZvbnQtd2VpZ2h0OiBib2xkOw0KICAgIGZvbnQtZmFtaWx5OiAiVGltZXMgTmV3IFJvbWFuIiwgVGltZXMsIHNlcmlmOw0KICAgIGNvbG9yOiBuYXZ5Ow0KICAgIHRleHQtYWxpZ246IGxlZnQ7DQp9DQoNCmg0IHsgLyogSGVhZGVyIDQgLSBhbmQgdGhlIGF1dGhvciBhbmQgZGF0YSBoZWFkZXJzIHVzZSB0aGlzIHRvbyAgKi8NCiAgICBmb250LXNpemU6IDE0cHg7DQogIGZvbnQtd2VpZ2h0OiBib2xkOw0KICAgIGZvbnQtZmFtaWx5OiAiVGltZXMgTmV3IFJvbWFuIiwgVGltZXMsIHNlcmlmOw0KICAgIGNvbG9yOiBkYXJrcmVkOw0KICAgIHRleHQtYWxpZ246IGxlZnQ7DQp9DQoNCi8qIEFkZCBkb3RzIGFmdGVyIG51bWJlcmVkIGhlYWRlcnMgKi8NCi5oZWFkZXItc2VjdGlvbi1udW1iZXI6OmFmdGVyIHsNCiAgY29udGVudDogIi4iOw0KDQpib2R5IHsgYmFja2dyb3VuZC1jb2xvcjp3aGl0ZTsgfQ0KDQouaGlnaGxpZ2h0bWUgeyBiYWNrZ3JvdW5kLWNvbG9yOnllbGxvdzsgfQ0KDQpwIHsgYmFja2dyb3VuZC1jb2xvcjp3aGl0ZTsgfQ0KDQp9DQpgYGANCg0KYGBge3Igc2V0dXAsIGluY2x1ZGU9RkFMU0V9DQojIGNvZGUgY2h1bmsgc3BlY2lmaWVzIHdoZXRoZXIgdGhlIFIgY29kZSwgd2FybmluZ3MsIGFuZCBvdXRwdXQgDQojIHdpbGwgYmUgaW5jbHVkZWQgaW4gdGhlIG91dHB1dCBmaWxlcy4NCmlmICghcmVxdWlyZSgia25pdHIiKSkgew0KICAgaW5zdGFsbC5wYWNrYWdlcygia25pdHIiKQ0KICAgbGlicmFyeShrbml0cikNCn0NCmlmICghcmVxdWlyZSgicGFuZGVyIikpIHsNCiAgIGluc3RhbGwucGFja2FnZXMoInBhbmRlciIpDQogICBsaWJyYXJ5KHBhbmRlcikNCn0NCmlmICghcmVxdWlyZSgiZ2dwbG90MiIpKSB7DQogIGluc3RhbGwucGFja2FnZXMoImdncGxvdDIiKQ0KICBsaWJyYXJ5KGdncGxvdDIpDQp9DQppZiAoIXJlcXVpcmUoInRpZHl2ZXJzZSIpKSB7DQogIGluc3RhbGwucGFja2FnZXMoInRpZHl2ZXJzZSIpDQogIGxpYnJhcnkodGlkeXZlcnNlKQ0KfQ0KDQppZiAoIXJlcXVpcmUoInBsb3RseSIpKSB7DQogIGluc3RhbGwucGFja2FnZXMoInBsb3RseSIpDQogIGxpYnJhcnkocGxvdGx5KQ0KfQ0KIyMjIw0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KGVjaG8gPSBUUlVFLCAgICAgICAjIGluY2x1ZGUgY29kZSBjaHVuayBpbiB0aGUgb3V0cHV0IGZpbGUNCiAgICAgICAgICAgICAgICAgICAgICB3YXJuaW5nID0gRkFMU0UsICAgIyBzb21ldGltZXMsIHlvdSBjb2RlIG1heSBwcm9kdWNlIHdhcm5pbmcgbWVzc2FnZXMsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgeW91IGNhbiBjaG9vc2UgdG8gaW5jbHVkZSB0aGUgd2FybmluZyBtZXNzYWdlcyBpbg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIHRoZSBvdXRwdXQgZmlsZS4gDQogICAgICAgICAgICAgICAgICAgICAgcmVzdWx0cyA9IFRSVUUsICAgICMgeW91IGNhbiBhbHNvIGRlY2lkZSB3aGV0aGVyIHRvIGluY2x1ZGUgdGhlIG91dHB1dA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGluIHRoZSBvdXRwdXQgZmlsZS4NCiAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlID0gRkFMU0UsDQogICAgICAgICAgICAgICAgICAgICAgY29tbWVudCA9IE5BDQogICAgICAgICAgICAgICAgICAgICAgKSAgDQpgYGANCiANCiBcDQogDQojIyAqKkFzc2lnbm1lbnQgT2JqZWN0aXZlcyoqIA0KDQoqIFVuZGVyc3RhbmQgdGhlIHRoZW9yZXRpY2FsIGJhc2lzIG9mIEJvb3RzdHJhcCBzYW1wbGluZyBtZXRob2RzIGZvciBhcHByb3hpbWF0aW5nIHNhbXBsaW5nIGRpc3RyaWJ1dGlvbnMuDQoNCiogQXNzZXNzIHRoZSBwZXJmb3JtYW5jZSBvZiBCb290c3RyYXAgc2FtcGxpbmcgZGlzdHJpYnV0aW9ucyBhZ2FpbnN0IGV4YWN0IGFuZCBhc3ltcHRvdGljIHNhbXBsaW5nIGRpc3RyaWJ1dGlvbnMuDQoNCiogSW1wbGVtZW50IEJvb3RzdHJhcCBzYW1wbGluZyBhbGdvcml0aG0gYW5kIGNvbnN0cnVjdCBzYW1wbGluZyBkaXN0cmlidXRpb25zIHVzaW5nIFIuDQoNClwNCg0KKipVc2Ugb2YgQUkgVG9vbHMqKg0KDQoqKlBvbGljeSBvbiBBSSBUb29sIFVzZSoqOiBTdHVkZW50cyBtdXN0IGFkaGVyZSB0byB0aGUgQUkgdG9vbCBwb2xpY3kgc3BlY2lmaWVkIGluIHRoZSBjb3Vyc2Ugc3lsbGFidXMuIFRoZSBkaXJlY3QgY29weWluZyBvZiBBSS1nZW5lcmF0ZWQgY29udGVudCBpcyBzdHJpY3RseSBwcm9oaWJpdGVkLiBBbGwgc3VibWl0dGVkIHdvcmsgbXVzdCByZWZsZWN0IHlvdXIgb3duIHVuZGVyc3RhbmRpbmc7IHdoZXJlIGV4dGVybmFsIHRvb2xzIGFyZSBjb25zdWx0ZWQsIGNvbnRlbnQgbXVzdCBiZSB0aG9yb3VnaGx5IHJlcGhyYXNlZCBhbmQgc3ludGhlc2l6ZWQgaW4geW91ciBvd24gd29yZHMuDQoNCioqQ29kZSBJbmNsdXNpb24gUmVxdWlyZW1lbnQqKjogQW55IGNvZGUgaW5jbHVkZWQgaW4geW91ciBlc3NheSBtdXN0IGJlIHByb3Blcmx5IGNvbW1lbnRlZCB0byBleHBsYWluIHRoZSBwdXJwb3NlIGFuZC9vciBleHBlY3RlZCBvdXRwdXQgb2Yga2V5IGNvZGUgbGluZXMuIFN1Ym1pdHRpbmcgQUktZ2VuZXJhdGVkIGNvZGUgd2l0aG91dCBtZWFuaW5nZnVsLCBzdHVkZW50LWFkZGVkIGNvbW1lbnRzIHdpbGwgbm90IGJlIGFjY2VwdGVkLg0KDQpcDQoNCioqQXN5bXB0b3RpYyBEaXN0cmlidXRpb24gb2YgU2FtcGxlIFZhcmlhbmNlKioNCg0KQXNzdW1lIHRoYXQgJFx7IHhfMSwgeF8yLCBcY2RvdHMsIHhfbiBcfSBcdG8gRih4KSQgd2l0aCAkXG11ID0gRVtYXSQgYW5kICRcc2lnbWFeMiA9IFx0ZXh0e3Zhcn0oWCkkLiBEZW5vdGUgDQoNCiQkDQpzXjIgPSBcZnJhY3sxfXtuLTF9XHN1bV97aT0xfV5uICh4X2kgLSBcbXUpXjINCiQkDQoNCklmICRuJCBpcyBsYXJnZSwgDQoNCiQkDQpzXjIgXHRvIE5cbGVmdChcc2lnbWFeMiwgIFxmcmFje1xtdV80LVxzaWdtYV40fXtufSBccmlnaHQpDQokJA0KDQp3aGVyZSAkXG11XzQgPSBFWyhYX2kgLSBcbXUpXjRdJCBpcyB0amUgNHRoIGNlbnRyYWwgbW9tZW50IHdoaWNoIGNhbiBiZSBlc3RpbWF0ZWQgYnkNCg0KJCQNClxoYXR7XG11fV80ID0gXGZyYWN7MX17bn1cc3VtX3tpPTF9Xm4oeF9pLVxiYXJ7eH0pXjQuDQokJA0KDQoqKk5vdGUqKjogVGhpcyBkZXNjcmliZXMgdGhlIGFzeW1wdG90aWMgY29udmVyZ2VuY2Ugb2YgdGhlIHNhbXBsZSB2YXJpYW5jZSwgZm9sbG93aW5nIGZyb20gdGhlIGNlbnRyYWwgbGltaXQgdGhlb3JlbSAoQ0xUKS4gVGhlIHNhbXBsZSBzaXplIHJlcXVpcmVkIGZvciB0aGlzIGFwcHJveGltYXRpb24gdG8gaG9sZCBpcyBzaXR1YXRpb24tZGVwZW5kZW50Lg0KDQoNClwNCg0KIyMgKipRdWVzdGlvbiAxOiBBc3ltcHRvdGljIHZzIEJvb3RzdHJhcCBTYW1wbGluZyBEaXN0cmlidXRpb25zKioNCg0KV3JpdGUgYW4gZXNzYXkgc3VtbWFyaXppbmcgdGhlIGNvbmNlcHRzIG9mIEFzeW1wdG90aWMgYW5kIEJvb3RzdHJhcCBTYW1wbGluZyBEaXN0cmlidXRpb25zLCBhbG9uZyB3aXRoIHRoZWlyIGtleSBhcHBsaWNhdGlvbnMuIFlvdXIgZGlzY3Vzc2lvbiBzaG91bGQgYmUgZ3JvdW5kZWQgaW4geW91ciBwZXJzb25hbCB1bmRlcnN0YW5kaW5nIG9mIHRoZSBtYXRlcmlhbC4gQW55IGV4dGVybmFsIHNvdXJjZXMgaW5jbHVkaW5nIEFJIHRvb2xzIGNvbnN1bHRlZCBtdXN0IGJlIGNsZWFybHkgY2l0ZWQuIA0KDQoNCioqRXNzYXkgUHJvbXB0Kio6IERpc2N1c3MgdGhlIGNvbmNlcHRzIG9mIHRoZSBib290c3RyYXAgc2FtcGxpbmcgcGxhbiwgdGhlIGJvb3RzdHJhcCBzYW1wbGluZyBkaXN0cmlidXRpb24sIGFuZCB0aGUgYXN5bXB0b3RpYyBzYW1wbGluZyBkaXN0cmlidXRpb24gaW4gdGhlIGNvbnRleHQgb2Ygc3RhdGlzdGljcyAoZS5nLiwgc2FtcGxlIG1lYW4gYW5kIHZhcmlhbmNlKSBjb21wdXRlZCBmcm9tIGFuIGluZGVwZW5kZW50IGFuZCBpZGVudGljYWxseSBkaXN0cmlidXRlZCAoaS5pLmQuKSBzYW1wbGUuIFlvdXIgZGlzY3Vzc2lvbiBzaG91bGQ6DQoNCiogQ2xlYXJseSBvdXRsaW5lIHRoZSBrZXkgYXNzdW1wdGlvbnMgcmVxdWlyZWQgZm9yIGVhY2ggbWV0aG9kLg0KDQoqIEV4cGxhaW4gdGhlIHByYWN0aWNhbCBhcHBsaWNhdGlvbiBvZiBlYWNoIGRpc3RyaWJ1dGlvbi4NCg0KKiBQcm92aWRlIGd1aWRhbmNlIG9uIHdoZW4gYW5kIHdoeSBvbmUgc2hvdWxkIGJlIHByZWZlcnJlZCBvdmVyIHRoZSBvdGhlciBpbiBzdGF0aXN0aWNhbCBpbmZlcmVuY2UuDQoNCg0KKipJbiBzdGF0aXN0aWNhbCBpbmZlcmVuY2UgaGF2aW5nIHRoZSB1bmRlcnN0YW5kaW5nIG9mIHRoZSBzYW1wbGluZyBkaXN0cmlidXRpb24gb2YgYW4gZXN0aW1hdG9yIHN1Y2ggYXMgdGhlIHNhbXBsZSBtZWFuIG9yIHNhbXBsZSB2YXJpYW5jZSBpcyB2ZXJ5IGZ1bmRhbWVudGFsIGluIHRoZSB3b3JsZCBvZiBzdGF0aXN0aWNzLiBUd28gYXBwcm9hY2hlcyB0byBhcHByb3hpbWF0aW5nIHNhbXBsaW5nIGRpc3RyaWJ1dGlvbnMgYXJlIHRoZSBhc3ltcHRvdGljIGFwcHJvYWNoIGFuZCB0aGUgYm9vdHN0cmFwIGFwcHJvYWNoLiBBbHRob3VnaCBib3RoIGFwcHJvYWNoZXMgZGVzY3JpYmUgaG93IGFuIGVzdGltYXRvciB2YXJpZXMgYWNyb3NzIHJlcGVhdGVkIHNhbXBsZXMsIHRoZXkgcmVseSBkaWZmZXJlbnRseSB3aXRoIGl0J3MgcHJpbmNpcGxlcyBhbmQgYXNzdW1wdGlvbnMuKioNCg0KKipUaGUgYXN5bXB0b3RpYyBzYW1wbGluZyBkaXN0cmlidXRpb24gaXMgZXN0YWJsaXNoZWQgZnJvbSB0aGUgcHJvYmFiaWxpdHkgdGhlb3J5LCB3aXRoIG1vc3Qgbm90YWJseSB0aGUgQ2VudHJhbCBMaW1pdCBUaGVvcmVtIGNvbWluZyBpbnRvIG1pbmQuIFN1cHBvc2Ugd2Ugb2JzZXJ2ZSBhbiBpbmRlcGVuZGVudCBhbmQgaWRlbnRpY2FsbHkgZGlzdHJpYnV0ZWQgc2FtcGxlIChYXzEsIFhfMiwgXGRvdHMsIFhfbikgZnJvbSBhIHBvcHVsYXRpb24gd2l0aCBhIGxpbWl0ZWQgbWVhbiBhbmQgdmFyaWFuY2UuIFRoZSBDTFQgaGlnaGxpZ2h0cyB0aGF0IGFzIHRoZSBzYW1wbGUgc2l6ZSAobikgYmVjb21lcyBsYXJnZSwgdGhlIHNhbXBsaW5nIGRpc3RyaWJ1dGlvbiBvZiB0aGUgc2FtcGxlIG1lYW4gYmVjb21lcyBub3JtYWwsIHJlZ2FyZGxlc3Mgb2YgdGhlIHNoYXBlIG9mIHRoZSB1bmRlcmx5aW5nIHBvcHVsYXRpb24gZGlzdHJpYnV0aW9uLiBTcGVjaWZpY2FsbHksIHRoZSBzYW1wbGUgbWVhbiBpcyBhcHByb3hpbWF0ZWx5IG5vcm1hbGx5IGRpc3RyaWJ1dGVkIHdpdGggbWVhbiBlcXVhbCB0byB0aGUgcG9wdWxhdGlvbiBtZWFuIGFuZCB2YXJpYW5jZSBlcXVhbCB0byB0aGUgcG9wdWxhdGlvbiB2YXJpYW5jZSBkaXZpZGVkIGJ5IChuKS4gVGhlIGtleSBhc3N1bXB0aW9ucyBmb3IgYXN5bXB0b3RpYyByZXN1bHRzIGFyZSBpbmRlcGVuZGVuY2UsIGlkZW50aWNhbCBkaXN0cmlidXRpb24sIGFuZCBmaW5pdGUgdmFyYWluY2UuIFRoZSBwcmFjdGljYWwgYWR2YW50YWdlIG9mIHRoZSBhc3ltcHRvdGljIGFwcHJvYWNoIGlzIHRoYXQgaXMgc2ltcGxlIGJlY2F1c2Ugb25jZSB0aGUgc3RhbmRhcmQgZXJyb3IgaXMgZXN0aW1hdGVkLCBpbmZlcmVuY2UgY2FuIHByb2NlZWQgdXNpbmcgbm9ybWFsIGFwcHJveGltYXRpb25zLiBUaGVzZSBhcHByb3hpbWF0aW9ucyByZWx5IG9uIGxhcmdlIHNhbXBsZSBzaXplcyBhbmQgd291bGQgcGVyZm9ybSBwb29ybHkgd2hlbiB0aGUgc2FtcGxlIGlzIHJlbGF0aXZlbHkgc21hbGwgb3IgdGhlIGRhdGEgaXMgaGlnaGx5IHNrZXdlZC4qKg0KDQoqKkluIGNvbnRyYXN0LCB0aGUgYm9vdHN0cmFwIHNhbXBsaW5nIGRpc3RyaWJ1dGlvbiBpcyBhIGNvbXB1dGF0aW9uYWwgbWV0aG9kIHRoYXQgYXBwcm94aW1hdGVzIHRoZSB0cnVlIHNhbXBsaW5nIGRpc3RyaWJ1dGlvbiBkaXJlY3RseSBmcm9tIHRoZSBvYnNlcnZlZCBkYXRhIGFuZCBpbnN0ZWFkIG9mIHJlbHlpbmcgb24gdGhlb3JldGljYWwgbGltaXQgcmVzdWx0cywgdGhlIGJvb3RzdHJhcCB0cmVhdHMgdGhlIGVtcGlyaWNhbCBkaXN0cmlidXRpb24gb2YgdGhlIHNhbXBsZSBhcyBhbiBlc3RpbWF0ZSBvZiB0aGUgd2hvbGUgcG9wdWxhdGlvbiBkaXN0cmlidXRpb24uIEZyb20gdGhlIG9yaWdpbmFsIGkuaS5kLiBzYW1wbGUsIG1hbnkgbmV3IHNhbXBsZXMgb2Ygc2l6ZSBhcmUgZHJhd24gd2l0aCByZXBsYWNlbWVudCBhbmQgdGhlIHN0YXRpc3RpYyBvZiBpbnRlcmVzdCAoc2FtcGxlIG1lYW4gb3IgdmFyaWFuY2UpIGlzIGNvbXB1dGVkIGZvciBlYWNoIHJlc2FtcGxlLiBUaGUgZGlzdHJpYnV0aW9uIG9mIHRoZXNlIGJvb3RzdHJhcCByZXBsaWNhdGVzIGZvcm1zIHdoYXQgaXMga25vd24gYXMgdGhlIGJvb3RzdHJhcCBzYW1wbGluZyBkaXN0cmlidXRpb24uIFRoZSBwcmltYXJ5IGFzc3VtcHRpb24gdW5kZXJseWluZyB0aGUgYm9vdHN0cmFwIGlzIHRoYXQgdGhlIG9yaWdpbmFsIHNhbXBsZSBpcyByZXByZXNlbnRhdGl2ZSBvZiB0aGUgcG9wdWxhdGlvbiBhbmQgdGhhdCBvYnNlcnZhdGlvbnMgYXJlIGluZGVwZW5kZW50IGFuZCBpZGVudGljYWxseSBkaXN0cmlidXRlZC4gTm8gYXNzdW1wdGlvbiBvZiBub3JtYWxpdHkgaXMgcmVxdWlyZWQgYW5kIHRoZSBib290c3RyYXAgaXMgcGFydGljdWxhcmx5IHVzZWZ1bCB3aGVuIHRoZSBzYW1wbGluZyBkaXN0cmlidXRpb24gb2YgYSBzdGF0aXN0aWMgaXMgY29tcGxpY2F0ZWQsIHVua25vd24sIG9yIGRpZmZpY3VsdCB0byBkZXJpdmUuIEl0IGlzIHBlcmZlcmFibHkgYWR2YW50YWdlb3VzIHdoZW4gdXNpbmcgc21hbGwgdG8gbW9kZXJhdGUgc2FtcGxlcyBvciB3aGVuIHRoZSBwb3B1bGF0aW9uIGRpc3RyaWJ1dGlvbiBpcyBza2V3ZWQuKioNCg0KKipUaGUgY2hvaWNlIGJldHdlZW4gYXN5bXB0b3RpYyBhbmQgYm9vdHN0cmFwIG1ldGhvZHMgZGVwZW5kcyBvbiB0aGUgY29udGV4dCBhbmQgcHJhY3RpY2FsaXR5IG9mIHRoZSBzaXR1YXRpb24uIFdoZW4gdGhlIHNhbXBsZSBzaXplIGlzIGxhcmdlIGFuZCB0aGVvcmV0aWNhbCBjb25kaXRpb25zIGFyZSBjbGVhciBhbmQgc2F0aXNmaWVkLCBhc3ltcHRvdGljIGFwcHJveGltYXRpb25zIGFyZSBtb3JlIGVmZmljZW50LCBpbnRlcnByZXRhYmxlLCBhbmQgc2ltcGxlIHRvIGNvbXB1dGUuIFRoZXkgYXJlIG9mdGVuIHByZWZlcnJlZCBmb3Igc3RhbmRhcmQgc3RhdGlzdGljcyBsaWtlIHRoZSBzYW1wbGUgbWVhbiB3aGVuIGRhdGEgYmVoYXZlcyB3ZWxsLiBIb3dldmVyLCB3aGVuIHNhbXBsZSBzaXplcyBhcmUgbGltaXRlZCwgZGlzdHJpYnV0aW9ucyBhcmUgbm9uLW5vcm1hbCwgb3IgdGhlIHN0YXRpc3RpYyBpcyBjb21wbGV4LCB0aGUgYm9vdHN0cmFwIG9mdGVuIHByb3ZpZGVzIGEgbW9yZSBhY2N1cmF0ZSBhcHByb3hpbWF0aW9uIG9mIHRoZSBzYW1wbGluZyBkaXN0cmlidXRpb24uKioNCg0KKipJbiBzdW1tYXJ5LCBhc3ltcHRvdGljIHNhbXBsaW5nIGRpc3RyaWJ1dGlvbnMgcmVseSBvbiB0aGVvcmV0aWNhbCBsYXJnZS1zYW1wbGUgcmVzdWx0cyBhbmQgcHJvdmlkZSBmb3JtdWxhLWJhc2VkIGluZmVyZW5jaW5nIHVuZGVyIGNsZWFyIGFzc3VtcHRpb25zLiBCb290c3RyYXAgc2FtcGxpbmcgZGlzdHJpYnV0aW9ucyByZWx5IG9uIHJlc2FtcGxpbmcgZnJvbSB0aGUgb2JzZXJ2ZWQgZGF0YSB0byBhcHByb3hpbWF0ZSB0aGUgZXN0aW1hdG9y4oCZcyB2YXJpYWJpbGl0eSB3aXRoIGZld2VyIGRpc3RyaWJ1dGlvbmFsIGFzc3VtcHRpb25zLiBCb3RoIGFwcHJvYWNoZXMgYXJlIGdyb3VuZGVkIGluIHRoZSBpZGVhIG9mIHJlcGVhdGVkIHNhbXBsaW5nLCBidXQgdGhleSBkaWZmZXIgb24gd2hldGhlciBzdWNoIHJlcGV0aXRpb24gaXMgc3VwcG9ydGVkIGJ5IGFuYWx5c2lzIG9yIGJ5IGNvbXB1dGF0aW9uYWwgc2ltdWxhdGlvbi4gKioNCg0KKipSZWZlcmVuY2UgTGlzdDoqKg0KRWZyb24sIEIuIOKAnEJvb3RzdHJhcCBNZXRob2RzOiBBbm90aGVyIExvb2sgYXQgdGhlIEphY2trbmlmZSAu4oCdIEh0dHBzOi8vV3d3LkpzdG9yLk9yZy8sIEluc3RpdHV0ZSBvZiBNYXRoZW1hdGljYWwgU3RhdGlzdGljcywgNSBBcHIuIDIwMDcsIHNpdGVzLnN0YXQud2FzaGluZ3Rvbi5lZHUvY291cnNlcy9zdGF0NTI3L3MxNC9yZWFkaW5ncy9hbm5fc3RhdDE5NzkucGRmLiANCg0KXA0KDQojIyAqKlF1ZXN0aW9uIDI6IERhaWx5IENvZmZlZSBTYWxlcyAoaW4gbUwpIGF0IFR3byBEaWZmZXJlbnQgQ2FmZSBMb2NhdGlvbnMqKg0KDQpUaGlzIGRhdGEgc2V0IHJlcHJlc2VudHMgdGhlIHZvbHVtZSBvZiByZWd1bGFyIGJyZXdlZCBjb2ZmZWUgc29sZCBwZXIgZGF5IChpbiBtaWxsaWxpdGVycykgYXQgdHdvIGRpZmZlcmVudCBjYWZlIGxvY2F0aW9ucyBvdmVyIGEgcGVyaW9kIG9mIDUwIGRheXMuDQoNCmBgYA0KMjg1MCwgMzIwMCwgMjkwMCwgMzEwMCwgMjk1MCwgNzgwMCwgODEwMCwgNzkwMCwgMzMwMCwgMzA1MCwgNDAwMCwgNDIwMCwgMzE1MCwgMzQwMCwgNzcwMCwgODIwMCwgDQozMjUwLCA0NDAwLCAzMTAwLCA0MjAwLCA0NTAwLCA0ODAwLCA0MzAwLCA4NTAwLCA4MjAwLCA4OTAwLCA4NzAwLCAzMjUwLCAzMDAwLCA0NjAwLCA0MTAwLCA4NDAwLCANCjg4MDAsIDMzNTAsIDQ3MDAsIDMxMDAsIDgxMDAsIDMwNTAsIDgzMDAsIDQxMDAsIDMxMDAsIDgzMDAsIDg5MDAsIDgyMDAsIDQ0MDAsIDQ1MDAsIDMyNTAsIDQ2MDAsIA0KODQwMCwgMzMwMCwgNDIwMCwgNDUwMCwgNDgwMCwgNDMwMCwgODUwMA0KYGBgDQpXZSBhcmUgaW50ZXJlc3RlZCBpbiBmaW5kaW5nIHRoZSBzYW1wbGluZyBkaXN0cmlidXRpb24gb2Ygc2FtcGxlIG1lYW5zIHRoYXQgd2lsbCBiZSB1c2VkIGZvciB2YXJpb3VzIGluZmVyZW5jZXMgYWJvdXQgdGhlIHVuZGVybHlpbmcgcG9wdWxhdGlvbiBtZWFuLg0KDQphKSBCYXNlZCBvbiB0aGUgZ2l2ZW4gZGF0YSwgY2FuIHRoZSBDZW50cmFsIExpbWl0IFRoZW9yZW0gYmUgdXNlZCB0byBkZXJpdmUgdGhlIGFzeW1wdG90aWMgc2FtcGxpbmcgZGlzdHJpYnV0aW9uIG9mIHRoZSBzYW1wbGUgbWVhbj8gSnVzdGlmeSB5b3VyIGFuc3dlci4NCg0KYGBge3J9DQojIERhdGENCmNvZmZlZSA8LSBjKA0KICAyODUwLCAzMjAwLCAyOTAwLCAzMTAwLCAyOTUwLCA3ODAwLCA4MTAwLCA3OTAwLCAzMzAwLCAzMDUwLA0KICA0MDAwLCA0MjAwLCAzMTUwLCAzNDAwLCA3NzAwLCA4MjAwLCAzMjUwLCA0NDAwLCAzMTAwLCA0MjAwLA0KICA0NTAwLCA0ODAwLCA0MzAwLCA4NTAwLCA4MjAwLCA4OTAwLCA4NzAwLCAzMjUwLCAzMDAwLCA0NjAwLA0KICA0MTAwLCA4NDAwLCA4ODAwLCAzMzUwLCA0NzAwLCAzMTAwLCA4MTAwLCAzMDUwLCA4MzAwLCA0MTAwLA0KICAzMTAwLCA4MzAwLCA4OTAwLCA4MjAwLCA0NDAwLCA0NTAwLCAzMjUwLCA0NjAwLCA4NDAwLCAzMzAwLA0KICA0MjAwLCA0NTAwLCA0ODAwLCA0MzAwLCA4NTAwDQopDQoNCm4gPC0gbGVuZ3RoKGNvZmZlZSkNCg0KIyBTYW1wbGUgTWVhbiBhbmQgU3RhbmRhcmQgRXJyb3INCnNhbXBsZV9tZWFuIDwtIG1lYW4oY29mZmVlKQ0Kc2FtcGxlX3NkICAgPC0gc2QoY29mZmVlKQ0Kc2VfbWVhbiAgICAgPC0gc2FtcGxlX3NkIC8gc3FydChuKQ0Kc2VfYXN5bXAgPC0gc2FtcGxlX3NkIC8gc3FydChuKQ0KDQpzYW1wbGVfbWVhbg0Kc2VfbWVhbg0KYGBgDQoqKlllcywgc2luY2UgdGhlcmUgYXJlIDU1IHNhbXBsZXMsIG4g4omIIDUwIHRoZSBDZW50cmFsIExpbWl0IFRoZW9yZW0gYXBwbGllcyBhbmQgdGhlIHNhbXBsaW5nIGRpc3RyaWJ1dGlvbiBvZiB0aGUgbWVhbiDiiYggTm9ybWFsLioqDQoNCmIpIEFwcGx5IHRoZSBib290c3RyYXAgbWV0aG9kIHRvIGVzdGltYXRlIHRoZSBzYW1wbGluZyBkaXN0cmlidXRpb24gKG9mdGVuIGNhbGxlZCB0aGUgYm9vdHN0cmFwIHNhbXBsaW5nIGRpc3RyaWJ1dGlvbikgb2YgdGhlIHNhbXBsZSBtZWFuLiBHZW5lcmF0ZSBhIGtlcm5lbCBkZW5zaXR5IGVzdGltYXRlIGZyb20gdGhlIGJvb3RzdHJhcCBzYW1wbGUgbWVhbnMgYW5kIHBsb3QgaXQuIFRoZW4sIHVzZSB0aGlzIGJvb3RzdHJhcCBkaXN0cmlidXRpb24gdG8gdmFsaWRhdGUgeW91ciBjb25jbHVzaW9uIGZyb20gcGFydCAoYSkuIE1ha2Ugc3VyZSB5b3VyIHZpc3VhbHMgYXJlIGVmZmVjdGl2ZSBpbiBlbmhhbmNpbmcgdGhlIHByZXNlbnRhdGlvbiBvZiB0aGVzZSByZXN1bHRzLg0KDQpgYGB7cn0NCg0KIyBCb290c3RyYXAgUHJvY2VkdXJlDQoNCg0Kc2V0LnNlZWQoMTIzKQ0KQiA8LSAxMDAwMCAgICMgbnVtYmVyIG9mIGJvb3RzdHJhcCBzYW1wbGVzDQoNCmJvb3RfbWVhbnMgPC0gcmVwbGljYXRlKEIsIG1lYW4oc2FtcGxlKGNvZmZlZSwgbiwgcmVwbGFjZSA9IFRSVUUpKSkNCg0KYm9vdF9zZV9tZWFuIDwtIHNkKGJvb3RfbWVhbnMpDQpib290X3NlX21lYW4NCg0KDQojIFBsb3QgQm9vdHN0cmFwIFNhbXBsaW5nIERpc3RyaWJ1dGlvbg0KDQoNCnBsb3QoZGVuc2l0eShib290X21lYW5zKSwNCiAgICAgbWFpbiA9ICJCb290c3RyYXAgU2FtcGxpbmcgRGlzdHJpYnV0aW9uIG9mIHRoZSBTYW1wbGUgTWVhbiIsDQogICAgIHhsYWIgPSAiQm9vdHN0cmFwIFNhbXBsZSBNZWFucyIsDQogICAgIGx3ZCA9IDIpDQoNCiMgQWRkIHZlcnRpY2FsIGxpbmUgZm9yIG9ic2VydmVkIHNhbXBsZSBtZWFuDQphYmxpbmUodiA9IHNhbXBsZV9tZWFuLCBjb2wgPSAicmVkIiwgbHdkID0gMiwgbHR5ID0gMikNCg0KIyBPdmVybGF5IGFzeW1wdG90aWMgbm9ybWFsIGFwcHJveGltYXRpb24NCmN1cnZlKGRub3JtKHgsIG1lYW4gPSBzYW1wbGVfbWVhbiwgc2QgPSBzZV9hc3ltcCksDQogICAgICBsd2QgPSAyLA0KICAgICAgbHR5ID0gMywNCiAgICAgIGFkZCA9IFRSVUUpDQoNCmxlZ2VuZCgidG9wcmlnaHQiLA0KICAgICAgIGxlZ2VuZCA9IGMoIkJvb3RzdHJhcCBLREUiLA0KICAgICAgICAgICAgICAgICAgIk9ic2VydmVkIFNhbXBsZSBNZWFuIiwNCiAgICAgICAgICAgICAgICAgICJBc3ltcHRvdGljIE5vcm1hbCBBcHByb3hpbWF0aW9uIiksDQogICAgICAgbHdkID0gYygyLDIsMiksDQogICAgICAgbHR5ID0gYygxLDIsMykpDQoNCmBgYA0KDQpjKSBSZXBlYXQgdGhlIGFuYWx5c2lzIGluIHBhcnRzIChhKSBhbmQgKGIpIGZvciB0aGUgc2FtcGxlIHZhcmlhbmNlLg0KDQpgYGB7cn0NCg0KIyBTYW1wbGUgVmFyaWFuY2UNCg0KDQpzYW1wbGVfdmFyIDwtIHZhcihjb2ZmZWUpDQpzYW1wbGVfdmFyDQoNCg0KIyBCb290c3RyYXAgZm9yIFZhcmlhbmNlDQoNCg0KYm9vdF92YXJzIDwtIHJlcGxpY2F0ZShCLCB2YXIoc2FtcGxlKGNvZmZlZSwgbiwgcmVwbGFjZSA9IFRSVUUpKSkNCg0KYm9vdF9zZV92YXIgPC0gc2QoYm9vdF92YXJzKQ0KYm9vdF9zZV92YXINCg0KDQpwbG90KGRlbnNpdHkoYm9vdF92YXJzKSwNCiAgICAgbWFpbiA9ICJCb290c3RyYXAgU2FtcGxpbmcgRGlzdHJpYnV0aW9uIG9mIHRoZSBWYXJpYW5jZSIsDQogICAgIHhsYWIgPSAiQm9vdHN0cmFwIFNhbXBsZSBWYXJpYW5jZXMiLA0KICAgICBsd2QgPSAyKQ0KDQphYmxpbmUodiA9IHNhbXBsZV92YXIsIGNvbCA9ICJyZWQiLCBsd2QgPSAyKQ0KDQojIEFzeW1wdG90aWMgbm9ybWFsIGFwcHJveGltYXRpb24gKG5vcm1hbCBjYXNlIGFwcHJveGltYXRpb24pDQphc3ltcF9zZF92YXIgPC0gc3FydCgyICogc2FtcGxlX3Zhcl4yIC8gKG4gLSAxKSkNCg0KY3VydmUoZG5vcm0oeCwgbWVhbiA9IHNhbXBsZV92YXIsIHNkID0gYXN5bXBfc2RfdmFyKSwNCiAgICAgIGx3ZCA9IDIsDQogICAgICBsdHkgPSAzLA0KICAgICAgYWRkID0gVFJVRSkNCg0KbGVnZW5kKCJ0b3ByaWdodCIsDQogICAgICAgbGVnZW5kID0gYygiQm9vdHN0cmFwIEtERSIsDQogICAgICAgICAgICAgICAgICAiT2JzZXJ2ZWQgU2FtcGxlIFZhcmlhbmNlIiwNCiAgICAgICAgICAgICAgICAgICJBc3ltcHRvdGljIE5vcm1hbCIpLA0KICAgICAgIGx3ZCA9IGMoMiwyLDIpLA0KICAgICAgIGx0eSA9IGMoMSwyLDMpKQ0KDQpgYGANCg==