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.
Essay:
A sampling distribution describes how a statistic such as
the sample mean \(\bar{X}\) or sample
variance \(S^2\) would vary across
repeated samples of size \(n\) from the
same population. There are two main approaches to obtaining sampling
distributions: asymptotic methods and bootstrap methods.
Bootstrap Sampling Plan and Bootstrap Sampling
Distribution
The bootstrap is a Monte Carlo simulation method that replaces the
unknown population distribution \(F\)
with the empirical distribution function \(\hat{F}_n\). The EDF assigns equal
probability \(1/n\) to each observed
data point and serves as a nonparametric estimate of \(F\).
The bootstrap procedure works as follows:
- Start with the observed i.i.d. sample \(x_1, \ldots, x_n\).
- Treat this sample as an approximation of the population.
- Draw a new sample of size \(n\)
with replacement from the observed data.
- Compute the statistic of interest from this resample.
- Repeat the process \(B\)
times.
The collection of replicated statistics forms the bootstrap
sampling distribution. This simulated distribution can be used
to estimate the standard error of a statistic, examine its variability,
and support inference without relying on strong distributional
assumptions.
The bootstrap requires:
- The original data are independent and identically distributed \(i.i.d.\).
- The sample reasonably represents the population.
- The sample size is preserved in each resample to maintain the
correct level of variability.
Because the bootstrap samples from the empirical distribution rather
than assuming a specific parametric form, it is considered a
nonparametric method.
Asymptotic Sampling Distribution
Asymptotic sampling distributions come from large-sample theory. When
the sample size increases, many statistics converge in distribution to a
Normal distribution after appropriate centering and scaling. This idea
is rooted in the Central Limit Theorem.
For example, if the observations are i.i.d. with finite variance, the
sample mean becomes approximately Normally distributed as \(n\) grows. Similarly, under suitable moment
conditions, the sample variance also has an approximate Normal
distribution for large \(n\). These
results allow us to use Normal approximations to perform inference.
Asymptotic methods require: 1. Independent and identically
distributed observations. 2. Finite variance. 3. A sufficiently large
sample size.
When to Use Each Method
Asymptotic methods are efficient when sample size is large and
assumptions are satisfied. Bootstrap methods are useful when the
sampling distribution is difficult to derive or when avoiding parametric
assumptions.
In summary, asymptotic methods depend on theoretical convergence
results, while bootstrap methods approximate the sampling distribution
through repeated resampling from the empirical distribution.
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.
- 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.
# Coffee sales data
x <- 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(x)
xbar <- mean(x)
s <- sd(x)
data.frame(n = n, mean = xbar, sd = s)
n mean sd
1 55 5250 2242.952
# Visual check on raw data distribution
par(mfrow = c(1,2))
hist(x,
probability = TRUE,
breaks = 15,
main = "Histogram of Coffee Sales",
xlab = "Daily Sales (mL)")
lines(density(x), col = "blue", lwd = 2)
qqnorm(x, main = "Normal Q-Q Plot")
qqline(x, col = "red", lwd = 2)

par(mfrow = c(1,1))
Answer: Yes, the Central Limit Theorem can be
applied here. Although the histogram shows two clusters (likely
representing the two cafe locations), the CLT does not require the
population to be normally distributed. It only requires that the
observations are independent and have finite variance. Since the sample
size is larger than 50, the sampling distribution of the sample mean can
be approximated by
\[
\bar{X} \approx N\left(\mu, \frac{\sigma^2}{n}\right)
\] Therefore, it is reasonable to use the asymptotic normal
approximation for inference about the population mean.
- 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.
# Number of bootstrap replications
B <- 1000
# Store bootstrap sample means
boot.mean <- NULL
# Bootstrap loop
for(i in 1:B){
# Resample WITH replacement
boot.sample <- sample(x,size = n, replace = TRUE)
# Compute mean of bootstrap sample
boot.mean[i] <- mean(boot.sample)
}
hist(boot.mean,
probability = TRUE,
breaks = 20,
main = "Bootstrap Sampling Distribution of Sample Mean",
xlab = "Bootstrap Sample Means")
lines(density(boot.mean), col = "blue", lwd = 2)

Answer: The bootstrap sampling distribution of \(\bar{X}\) was generated by repeatedly
resampling the data with replacement and computing the mean each time.
The histogram and kernel density curve of the bootstrap means are
approximately symmetric and bell-shaped, which supports the CLT-based
conclusion in part (a) that the sampling distribution of the sample mean
is reasonably approximated by a Normal distribution.
- Repeat the analysis in parts (a) and (b) for the sample
variance.
Part a
s2 <- var(x)
mu4_hat <- mean((x - mean(x))^4)
asym.sd.var <- sqrt((mu4_hat - s2^2) / n)
data.frame(sample_variance = s2,
asymptotic_sd = asym.sd.var)
sample_variance asymptotic_sd
1 5030833 496426.1
Answer:Under large sample theory, when the fourth
moment is finite, the sample variance has an approximate Normal
distribution:
\[
s^2 \to N\left(\sigma^2, \frac{\mu_4-\sigma^4}{n} \right)
\] Since the sample size is greater than 50 and the data have
finite variability, the asymptotic Normal approximation can be
considered. However, the accuracy may be affected by the shape of the
distribution.
Part b
B <- 1000
boot.var <- NULL
for(i in 1:B){
boot.sample <- sample(x,
size = n,
replace = TRUE)
boot.var[i] <- var(boot.sample)
}
hist(boot.var,
probability = TRUE,
breaks = 20,
main = "Bootstrap Sampling Distribution of Sample Variance",
xlab = "Bootstrap Sample Variances")
lines(density(boot.var), col = "blue", lwd = 2)

Answer for Validation :The bootstrap distribution of
the sample variance appears slightly skewed rather than perfectly
symmetric. This suggests that the Normal approximation for the variance
may be less accurate than for the mean. Therefore, while the asymptotic
approximation can be used, the bootstrap distribution provides a more
data-driven assessment of variability for the sample variance.
LS0tDQp0aXRsZTogIkFzc2lnbm1lbnQgMzogRUNERiBhbmQgQm9vdHN0cmFwIFNhbXBsaW5nIGFuZCBBcHBsaWNhdGlvbnMiDQphdXRob3I6ICJYaWFveWluZyBNYSAiDQpkYXRlOiAiIER1ZTogMDIvMTcvMjAyNiAiDQpvdXRwdXQ6DQogIGh0bWxfZG9jdW1lbnQ6IA0KICAgIHRvYzogeWVzDQogICAgdG9jX2RlcHRoOiA0DQogICAgdG9jX2Zsb2F0OiB5ZXMNCiAgICBudW1iZXJfc2VjdGlvbnM6IG5vDQogICAgdG9jX2NvbGxhcHNlZDogeWVzDQogICAgY29kZV9mb2xkaW5nOiBoaWRlDQogICAgY29kZV9kb3dubG9hZDogeWVzDQogICAgc21vb3RoX3Njcm9sbDogeWVzDQogICAgdGhlbWU6IGx1bWVuDQogIHBkZl9kb2N1bWVudDogDQogICAgdG9jOiB5ZXMNCiAgICB0b2NfZGVwdGg6IDQNCiAgICBmaWdfY2FwdGlvbjogeWVzDQogICAgbnVtYmVyX3NlY3Rpb25zOiB5ZXMNCiAgICBmaWdfd2lkdGg6IDMNCiAgICBmaWdfaGVpZ2h0OiAzDQogIHdvcmRfZG9jdW1lbnQ6IA0KICAgIHRvYzogeWVzDQogICAgdG9jX2RlcHRoOiA0DQogICAgZmlnX2NhcHRpb246IHllcw0KICAgIGtlZXBfbWQ6IHllcw0KZWRpdG9yX29wdGlvbnM6IA0KICBjaHVua19vdXRwdXRfdHlwZTogaW5saW5lDQotLS0NCg0KYGBge2NzcywgZWNobyA9IEZBTFNFfQ0KI1RPQzo6YmVmb3JlIHsNCiAgY29udGVudDogIlRhYmxlIG9mIENvbnRlbnRzIjsNCiAgZm9udC13ZWlnaHQ6IGJvbGQ7DQogIGZvbnQtc2l6ZTogMS4yZW07DQogIGRpc3BsYXk6IGJsb2NrOw0KICBjb2xvcjogbmF2eTsNCiAgbWFyZ2luLWJvdHRvbTogMTBweDsNCn0NCg0KDQpkaXYjVE9DIGxpIHsgICAgIC8qIHRhYmxlIG9mIGNvbnRlbnQgICovDQogICAgbGlzdC1zdHlsZTp1cHBlci1yb21hbjsNCiAgICBiYWNrZ3JvdW5kLWltYWdlOm5vbmU7DQogICAgYmFja2dyb3VuZC1yZXBlYXQ6bm9uZTsNCiAgICBiYWNrZ3JvdW5kLXBvc2l0aW9uOjA7DQp9DQoNCmgxLnRpdGxlIHsgICAgLyogbGV2ZWwgMSBoZWFkZXIgb2YgdGl0bGUgICovDQogIGZvbnQtc2l6ZTogMjJweDsNCiAgZm9udC13ZWlnaHQ6IGJvbGQ7DQogIGNvbG9yOiBEYXJrUmVkOw0KICB0ZXh0LWFsaWduOiBjZW50ZXI7DQogIGZvbnQtZmFtaWx5OiAiR2lsbCBTYW5zIiwgc2Fucy1zZXJpZjsNCn0NCg0KaDQuYXV0aG9yIHsgLyogSGVhZGVyIDQgLSBhbmQgdGhlIGF1dGhvciBhbmQgZGF0YSBoZWFkZXJzIHVzZSB0aGlzIHRvbyAgKi8NCiAgZm9udC1zaXplOiAxNXB4Ow0KICBmb250LXdlaWdodDogYm9sZDsNCiAgZm9udC1mYW1pbHk6IHN5c3RlbS11aTsNCiAgY29sb3I6IG5hdnk7DQogIHRleHQtYWxpZ246IGNlbnRlcjsNCn0NCg0KaDQuZGF0ZSB7IC8qIEhlYWRlciA0IC0gYW5kIHRoZSBhdXRob3IgYW5kIGRhdGEgaGVhZGVycyB1c2UgdGhpcyB0b28gICovDQogIGZvbnQtc2l6ZTogMThweDsNCiAgZm9udC13ZWlnaHQ6IGJvbGQ7DQogIGZvbnQtZmFtaWx5OiAiR2lsbCBTYW5zIiwgc2Fucy1zZXJpZjsNCiAgY29sb3I6IERhcmtCbHVlOw0KICB0ZXh0LWFsaWduOiBjZW50ZXI7DQp9DQoNCmgxIHsgLyogSGVhZGVyIDEgLSBhbmQgdGhlIGF1dGhvciBhbmQgZGF0YSBoZWFkZXJzIHVzZSB0aGlzIHRvbyAgKi8NCiAgICBmb250LXNpemU6IDIwcHg7DQogICAgZm9udC13ZWlnaHQ6IGJvbGQ7DQogICAgZm9udC1mYW1pbHk6ICJUaW1lcyBOZXcgUm9tYW4iLCBUaW1lcywgc2VyaWY7DQogICAgY29sb3I6IGRhcmtyZWQ7DQogICAgdGV4dC1hbGlnbjogY2VudGVyOw0KfQ0KDQpoMiB7IC8qIEhlYWRlciAyIC0gYW5kIHRoZSBhdXRob3IgYW5kIGRhdGEgaGVhZGVycyB1c2UgdGhpcyB0b28gICovDQogICAgZm9udC1zaXplOiAxOHB4Ow0KICAgIGZvbnQtd2VpZ2h0OiBib2xkOw0KICAgIGZvbnQtZmFtaWx5OiAiVGltZXMgTmV3IFJvbWFuIiwgVGltZXMsIHNlcmlmOw0KICAgIGNvbG9yOiBuYXZ5Ow0KICAgIHRleHQtYWxpZ246IGxlZnQ7DQp9DQoNCmgzIHsgLyogSGVhZGVyIDMgLSBhbmQgdGhlIGF1dGhvciBhbmQgZGF0YSBoZWFkZXJzIHVzZSB0aGlzIHRvbyAgKi8NCiAgICBmb250LXNpemU6IDE2cHg7DQogICAgZm9udC13ZWlnaHQ6IGJvbGQ7DQogICAgZm9udC1mYW1pbHk6ICJUaW1lcyBOZXcgUm9tYW4iLCBUaW1lcywgc2VyaWY7DQogICAgY29sb3I6IG5hdnk7DQogICAgdGV4dC1hbGlnbjogbGVmdDsNCn0NCg0KaDQgeyAvKiBIZWFkZXIgNCAtIGFuZCB0aGUgYXV0aG9yIGFuZCBkYXRhIGhlYWRlcnMgdXNlIHRoaXMgdG9vICAqLw0KICAgIGZvbnQtc2l6ZTogMTRweDsNCiAgZm9udC13ZWlnaHQ6IGJvbGQ7DQogICAgZm9udC1mYW1pbHk6ICJUaW1lcyBOZXcgUm9tYW4iLCBUaW1lcywgc2VyaWY7DQogICAgY29sb3I6IGRhcmtyZWQ7DQogICAgdGV4dC1hbGlnbjogbGVmdDsNCn0NCg0KLyogQWRkIGRvdHMgYWZ0ZXIgbnVtYmVyZWQgaGVhZGVycyAqLw0KLmhlYWRlci1zZWN0aW9uLW51bWJlcjo6YWZ0ZXIgew0KICBjb250ZW50OiAiLiI7DQoNCmJvZHkgeyBiYWNrZ3JvdW5kLWNvbG9yOndoaXRlOyB9DQoNCi5oaWdobGlnaHRtZSB7IGJhY2tncm91bmQtY29sb3I6eWVsbG93OyB9DQoNCnAgeyBiYWNrZ3JvdW5kLWNvbG9yOndoaXRlOyB9DQoNCn0NCmBgYA0KDQpgYGB7ciBzZXR1cCwgaW5jbHVkZT1GQUxTRX0NCiMgY29kZSBjaHVuayBzcGVjaWZpZXMgd2hldGhlciB0aGUgUiBjb2RlLCB3YXJuaW5ncywgYW5kIG91dHB1dCANCiMgd2lsbCBiZSBpbmNsdWRlZCBpbiB0aGUgb3V0cHV0IGZpbGVzLg0KaWYgKCFyZXF1aXJlKCJrbml0ciIpKSB7DQogICBpbnN0YWxsLnBhY2thZ2VzKCJrbml0ciIpDQogICBsaWJyYXJ5KGtuaXRyKQ0KfQ0KaWYgKCFyZXF1aXJlKCJwYW5kZXIiKSkgew0KICAgaW5zdGFsbC5wYWNrYWdlcygicGFuZGVyIikNCiAgIGxpYnJhcnkocGFuZGVyKQ0KfQ0KaWYgKCFyZXF1aXJlKCJnZ3Bsb3QyIikpIHsNCiAgaW5zdGFsbC5wYWNrYWdlcygiZ2dwbG90MiIpDQogIGxpYnJhcnkoZ2dwbG90MikNCn0NCmlmICghcmVxdWlyZSgidGlkeXZlcnNlIikpIHsNCiAgaW5zdGFsbC5wYWNrYWdlcygidGlkeXZlcnNlIikNCiAgbGlicmFyeSh0aWR5dmVyc2UpDQp9DQoNCmlmICghcmVxdWlyZSgicGxvdGx5IikpIHsNCiAgaW5zdGFsbC5wYWNrYWdlcygicGxvdGx5IikNCiAgbGlicmFyeShwbG90bHkpDQp9DQojIyMjDQprbml0cjo6b3B0c19jaHVuayRzZXQoZWNobyA9IFRSVUUsICAgICAgICMgaW5jbHVkZSBjb2RlIGNodW5rIGluIHRoZSBvdXRwdXQgZmlsZQ0KICAgICAgICAgICAgICAgICAgICAgIHdhcm5pbmcgPSBGQUxTRSwgICAjIHNvbWV0aW1lcywgeW91IGNvZGUgbWF5IHByb2R1Y2Ugd2FybmluZyBtZXNzYWdlcywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyB5b3UgY2FuIGNob29zZSB0byBpbmNsdWRlIHRoZSB3YXJuaW5nIG1lc3NhZ2VzIGluDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgdGhlIG91dHB1dCBmaWxlLiANCiAgICAgICAgICAgICAgICAgICAgICByZXN1bHRzID0gVFJVRSwgICAgIyB5b3UgY2FuIGFsc28gZGVjaWRlIHdoZXRoZXIgdG8gaW5jbHVkZSB0aGUgb3V0cHV0DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgaW4gdGhlIG91dHB1dCBmaWxlLg0KICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSBGQUxTRSwNCiAgICAgICAgICAgICAgICAgICAgICBjb21tZW50ID0gTkENCiAgICAgICAgICAgICAgICAgICAgICApICANCmBgYA0KIA0KDQpcDQoNCioqQXN5bXB0b3RpYyBEaXN0cmlidXRpb24gb2YgU2FtcGxlIFZhcmlhbmNlKioNCg0KQXNzdW1lIHRoYXQgJFx7IHhfMSwgeF8yLCBcY2RvdHMsIHhfbiBcfSBcdG8gRih4KSQgd2l0aCAkXG11ID0gRVtYXSQgYW5kICRcc2lnbWFeMiA9IFx0ZXh0e3Zhcn0oWCkkLiBEZW5vdGUgDQoNCiQkDQpzXjIgPSBcZnJhY3sxfXtuLTF9XHN1bV97aT0xfV5uICh4X2kgLSBcbXUpXjINCiQkDQoNCklmICRuJCBpcyBsYXJnZSwgDQoNCiQkDQpDc14yIFx0byBOXGxlZnQoXHNpZ21hXjIsICBcZnJhY3tcbXVfNC1cc2lnbWFeNH17bn0gXHJpZ2h0KQ0KJCQNCg0Kd2hlcmUgJFxtdV80ID0gRVsoWF9pIC0gXG11KV40XSQgaXMgdGplIDR0aCBjZW50cmFsIG1vbWVudCB3aGljaCBjYW4gYmUgZXN0aW1hdGVkIGJ5DQoNCiQkDQpcaGF0e1xtdX1fNCA9IFxmcmFjezF9e259XHN1bV97aT0xfV5uKHhfaS1cYmFye3h9KV40Lg0KJCQNCg0KKipOb3RlKio6IFRoaXMgZGVzY3JpYmVzIHRoZSBhc3ltcHRvdGljIGNvbnZlcmdlbmNlIG9mIHRoZSBzYW1wbGUgdmFyaWFuY2UsIGZvbGxvd2luZyBmcm9tIHRoZSBjZW50cmFsIGxpbWl0IHRoZW9yZW0gKENMVCkuIFRoZSBzYW1wbGUgc2l6ZSByZXF1aXJlZCBmb3IgdGhpcyBhcHByb3hpbWF0aW9uIHRvIGhvbGQgaXMgc2l0dWF0aW9uLWRlcGVuZGVudC4NCg0KDQpcDQoNCiMjICoqUXVlc3Rpb24gMTogQXN5bXB0b3RpYyB2cyBCb290c3RyYXAgU2FtcGxpbmcgRGlzdHJpYnV0aW9ucyoqDQoNCldyaXRlIGFuIGVzc2F5IHN1bW1hcml6aW5nIHRoZSBjb25jZXB0cyBvZiBBc3ltcHRvdGljIGFuZCBCb290c3RyYXAgU2FtcGxpbmcgRGlzdHJpYnV0aW9ucywgYWxvbmcgd2l0aCB0aGVpciBrZXkgYXBwbGljYXRpb25zLiBZb3VyIGRpc2N1c3Npb24gc2hvdWxkIGJlIGdyb3VuZGVkIGluIHlvdXIgcGVyc29uYWwgdW5kZXJzdGFuZGluZyBvZiB0aGUgbWF0ZXJpYWwuIEFueSBleHRlcm5hbCBzb3VyY2VzIGluY2x1ZGluZyBBSSB0b29scyBjb25zdWx0ZWQgbXVzdCBiZSBjbGVhcmx5IGNpdGVkLiANCg0KDQoqKkVzc2F5IFByb21wdCoqOiBEaXNjdXNzIHRoZSBjb25jZXB0cyBvZiB0aGUgYm9vdHN0cmFwIHNhbXBsaW5nIHBsYW4sIHRoZSBib290c3RyYXAgc2FtcGxpbmcgZGlzdHJpYnV0aW9uLCBhbmQgdGhlIGFzeW1wdG90aWMgc2FtcGxpbmcgZGlzdHJpYnV0aW9uIGluIHRoZSBjb250ZXh0IG9mIHN0YXRpc3RpY3MgKGUuZy4sIHNhbXBsZSBtZWFuIGFuZCB2YXJpYW5jZSkgY29tcHV0ZWQgZnJvbSBhbiBpbmRlcGVuZGVudCBhbmQgaWRlbnRpY2FsbHkgZGlzdHJpYnV0ZWQgKGkuaS5kLikgc2FtcGxlLiBZb3VyIGRpc2N1c3Npb24gc2hvdWxkOg0KDQoqIENsZWFybHkgb3V0bGluZSB0aGUga2V5IGFzc3VtcHRpb25zIHJlcXVpcmVkIGZvciBlYWNoIG1ldGhvZC4NCg0KKiBFeHBsYWluIHRoZSBwcmFjdGljYWwgYXBwbGljYXRpb24gb2YgZWFjaCBkaXN0cmlidXRpb24uDQoNCiogUHJvdmlkZSBndWlkYW5jZSBvbiB3aGVuIGFuZCB3aHkgb25lIHNob3VsZCBiZSBwcmVmZXJyZWQgb3ZlciB0aGUgb3RoZXIgaW4gc3RhdGlzdGljYWwgaW5mZXJlbmNlLg0KDQoqKkVzc2F5OioqDQoNCkEgKnNhbXBsaW5nIGRpc3RyaWJ1dGlvbiogZGVzY3JpYmVzIGhvdyBhIHN0YXRpc3RpYyBzdWNoIGFzIHRoZSBzYW1wbGUgbWVhbiBcKFxiYXJ7WH1cKSBvciBzYW1wbGUgdmFyaWFuY2UgXChTXjJcKSB3b3VsZCB2YXJ5IGFjcm9zcyByZXBlYXRlZCBzYW1wbGVzIG9mIHNpemUgXChuXCkgZnJvbSB0aGUgc2FtZSBwb3B1bGF0aW9uLiBUaGVyZSBhcmUgdHdvIG1haW4gYXBwcm9hY2hlcyB0byBvYnRhaW5pbmcgc2FtcGxpbmcgZGlzdHJpYnV0aW9uczogYXN5bXB0b3RpYyBtZXRob2RzIGFuZCBib290c3RyYXAgbWV0aG9kcy4NCg0KKipCb290c3RyYXAgU2FtcGxpbmcgUGxhbiBhbmQgQm9vdHN0cmFwIFNhbXBsaW5nIERpc3RyaWJ1dGlvbioqDQoNClRoZSBib290c3RyYXAgaXMgYSBNb250ZSBDYXJsbyBzaW11bGF0aW9uIG1ldGhvZCB0aGF0IHJlcGxhY2VzIHRoZSB1bmtub3duIHBvcHVsYXRpb24gZGlzdHJpYnV0aW9uIFwoRlwpIHdpdGggdGhlIGVtcGlyaWNhbCBkaXN0cmlidXRpb24gZnVuY3Rpb24gXChcaGF0e0Z9X25cKS4gVGhlIEVERiBhc3NpZ25zIGVxdWFsIHByb2JhYmlsaXR5IFwoMS9uXCkgdG8gZWFjaCBvYnNlcnZlZCBkYXRhIHBvaW50IGFuZCBzZXJ2ZXMgYXMgYSBub25wYXJhbWV0cmljIGVzdGltYXRlIG9mIFwoRlwpLg0KDQpUaGUgYm9vdHN0cmFwIHByb2NlZHVyZSB3b3JrcyBhcyBmb2xsb3dzOg0KDQoxLiBTdGFydCB3aXRoIHRoZSBvYnNlcnZlZCBpLmkuZC4gc2FtcGxlIFwoeF8xLCBcbGRvdHMsIHhfblwpLg0KMi4gVHJlYXQgdGhpcyBzYW1wbGUgYXMgYW4gYXBwcm94aW1hdGlvbiBvZiB0aGUgcG9wdWxhdGlvbi4NCjMuIERyYXcgYSBuZXcgc2FtcGxlIG9mIHNpemUgXChuXCkgKip3aXRoIHJlcGxhY2VtZW50KiogZnJvbSB0aGUgb2JzZXJ2ZWQgZGF0YS4NCjQuIENvbXB1dGUgdGhlIHN0YXRpc3RpYyBvZiBpbnRlcmVzdCBmcm9tIHRoaXMgcmVzYW1wbGUuDQo1LiBSZXBlYXQgdGhlIHByb2Nlc3MgIFwoQlwpIHRpbWVzLg0KDQpUaGUgY29sbGVjdGlvbiBvZiByZXBsaWNhdGVkIHN0YXRpc3RpY3MgZm9ybXMgdGhlICoqYm9vdHN0cmFwIHNhbXBsaW5nIGRpc3RyaWJ1dGlvbioqLiBUaGlzIHNpbXVsYXRlZCBkaXN0cmlidXRpb24gY2FuIGJlIHVzZWQgdG8gZXN0aW1hdGUgdGhlIHN0YW5kYXJkIGVycm9yIG9mIGEgc3RhdGlzdGljLCBleGFtaW5lIGl0cyB2YXJpYWJpbGl0eSwgYW5kIHN1cHBvcnQgaW5mZXJlbmNlIHdpdGhvdXQgcmVseWluZyBvbiBzdHJvbmcgZGlzdHJpYnV0aW9uYWwgYXNzdW1wdGlvbnMuDQoNClRoZSBib290c3RyYXAgcmVxdWlyZXM6DQoNCjEuIFRoZSBvcmlnaW5hbCBkYXRhIGFyZSBpbmRlcGVuZGVudCBhbmQgaWRlbnRpY2FsbHkgZGlzdHJpYnV0ZWQgXChpLmkuZC5cKS4NCjIuIFRoZSBzYW1wbGUgcmVhc29uYWJseSByZXByZXNlbnRzIHRoZSBwb3B1bGF0aW9uLg0KMy4gVGhlIHNhbXBsZSBzaXplIGlzIHByZXNlcnZlZCBpbiBlYWNoIHJlc2FtcGxlIHRvIG1haW50YWluIHRoZSBjb3JyZWN0IGxldmVsIG9mIHZhcmlhYmlsaXR5Lg0KDQpCZWNhdXNlIHRoZSBib290c3RyYXAgc2FtcGxlcyBmcm9tIHRoZSBlbXBpcmljYWwgZGlzdHJpYnV0aW9uIHJhdGhlciB0aGFuIGFzc3VtaW5nIGEgc3BlY2lmaWMgcGFyYW1ldHJpYyBmb3JtLCBpdCBpcyBjb25zaWRlcmVkIGEgbm9ucGFyYW1ldHJpYyBtZXRob2QuDQoNCioqQXN5bXB0b3RpYyBTYW1wbGluZyBEaXN0cmlidXRpb24qKg0KDQpBc3ltcHRvdGljIHNhbXBsaW5nIGRpc3RyaWJ1dGlvbnMgY29tZSBmcm9tIGxhcmdlLXNhbXBsZSB0aGVvcnkuIFdoZW4gdGhlIHNhbXBsZSBzaXplIGluY3JlYXNlcywgbWFueSBzdGF0aXN0aWNzIGNvbnZlcmdlIGluIGRpc3RyaWJ1dGlvbiB0byBhIE5vcm1hbCBkaXN0cmlidXRpb24gYWZ0ZXIgYXBwcm9wcmlhdGUgY2VudGVyaW5nIGFuZCBzY2FsaW5nLiBUaGlzIGlkZWEgaXMgcm9vdGVkIGluIHRoZSBDZW50cmFsIExpbWl0IFRoZW9yZW0uDQoNCkZvciBleGFtcGxlLCBpZiB0aGUgb2JzZXJ2YXRpb25zIGFyZSBpLmkuZC4gd2l0aCBmaW5pdGUgdmFyaWFuY2UsIHRoZSBzYW1wbGUgbWVhbiBiZWNvbWVzIGFwcHJveGltYXRlbHkgTm9ybWFsbHkgZGlzdHJpYnV0ZWQgYXMgXChuXCkgZ3Jvd3MuIFNpbWlsYXJseSwgdW5kZXIgc3VpdGFibGUgbW9tZW50IGNvbmRpdGlvbnMsIHRoZSBzYW1wbGUgdmFyaWFuY2UgYWxzbyBoYXMgYW4gYXBwcm94aW1hdGUgTm9ybWFsIGRpc3RyaWJ1dGlvbiBmb3IgbGFyZ2UgXChuXCkuIFRoZXNlIHJlc3VsdHMgYWxsb3cgdXMgdG8gdXNlIE5vcm1hbCBhcHByb3hpbWF0aW9ucyB0byBwZXJmb3JtIGluZmVyZW5jZS4NCg0KQXN5bXB0b3RpYyBtZXRob2RzIHJlcXVpcmU6DQoxLiBJbmRlcGVuZGVudCBhbmQgaWRlbnRpY2FsbHkgZGlzdHJpYnV0ZWQgb2JzZXJ2YXRpb25zLg0KMi4gRmluaXRlIHZhcmlhbmNlLg0KMy4gQSBzdWZmaWNpZW50bHkgbGFyZ2Ugc2FtcGxlIHNpemUuDQoNCioqV2hlbiB0byBVc2UgRWFjaCBNZXRob2QqKg0KDQpBc3ltcHRvdGljIG1ldGhvZHMgYXJlIGVmZmljaWVudCB3aGVuIHNhbXBsZSBzaXplIGlzIGxhcmdlIGFuZCBhc3N1bXB0aW9ucyBhcmUgc2F0aXNmaWVkLiBCb290c3RyYXAgbWV0aG9kcyBhcmUgdXNlZnVsIHdoZW4gdGhlIHNhbXBsaW5nIGRpc3RyaWJ1dGlvbiBpcyBkaWZmaWN1bHQgdG8gZGVyaXZlIG9yIHdoZW4gYXZvaWRpbmcgcGFyYW1ldHJpYyBhc3N1bXB0aW9ucy4gDQoNCkluIHN1bW1hcnksIGFzeW1wdG90aWMgbWV0aG9kcyBkZXBlbmQgb24gdGhlb3JldGljYWwgY29udmVyZ2VuY2UgcmVzdWx0cywgd2hpbGUgYm9vdHN0cmFwIG1ldGhvZHMgYXBwcm94aW1hdGUgdGhlIHNhbXBsaW5nIGRpc3RyaWJ1dGlvbiB0aHJvdWdoIHJlcGVhdGVkIHJlc2FtcGxpbmcgZnJvbSB0aGUgZW1waXJpY2FsIGRpc3RyaWJ1dGlvbi4NCg0KXA0KDQojIyAqKlF1ZXN0aW9uIDI6IERhaWx5IENvZmZlZSBTYWxlcyAoaW4gbUwpIGF0IFR3byBEaWZmZXJlbnQgQ2FmZSBMb2NhdGlvbnMqKg0KDQpUaGlzIGRhdGEgc2V0IHJlcHJlc2VudHMgdGhlIHZvbHVtZSBvZiByZWd1bGFyIGJyZXdlZCBjb2ZmZWUgc29sZCBwZXIgZGF5IChpbiBtaWxsaWxpdGVycykgYXQgdHdvIGRpZmZlcmVudCBjYWZlIGxvY2F0aW9ucyBvdmVyIGEgcGVyaW9kIG9mIDUwIGRheXMuIA0KDQpgYGANCjI4NTAsIDMyMDAsIDI5MDAsIDMxMDAsIDI5NTAsIDc4MDAsIDgxMDAsIDc5MDAsIDMzMDAsIDMwNTAsIDQwMDAsIDQyMDAsIDMxNTAsIDM0MDAsIDc3MDAsIDgyMDAsIA0KMzI1MCwgNDQwMCwgMzEwMCwgNDIwMCwgNDUwMCwgNDgwMCwgNDMwMCwgODUwMCwgODIwMCwgODkwMCwgODcwMCwgMzI1MCwgMzAwMCwgNDYwMCwgNDEwMCwgODQwMCwgDQo4ODAwLCAzMzUwLCA0NzAwLCAzMTAwLCA4MTAwLCAzMDUwLCA4MzAwLCA0MTAwLCAzMTAwLCA4MzAwLCA4OTAwLCA4MjAwLCA0NDAwLCA0NTAwLCAzMjUwLCA0NjAwLCANCjg0MDAsIDMzMDAsIDQyMDAsIDQ1MDAsIDQ4MDAsIDQzMDAsIDg1MDANCmBgYA0KV2UgYXJlIGludGVyZXN0ZWQgaW4gZmluZGluZyB0aGUgc2FtcGxpbmcgZGlzdHJpYnV0aW9uIG9mIHNhbXBsZSBtZWFucyB0aGF0IHdpbGwgYmUgdXNlZCBmb3IgdmFyaW91cyBpbmZlcmVuY2VzIGFib3V0IHRoZSB1bmRlcmx5aW5nIHBvcHVsYXRpb24gbWVhbi4NCg0KYSkgQmFzZWQgb24gdGhlIGdpdmVuIGRhdGEsIGNhbiB0aGUgQ2VudHJhbCBMaW1pdCBUaGVvcmVtIGJlIHVzZWQgdG8gZGVyaXZlIHRoZSBhc3ltcHRvdGljIHNhbXBsaW5nIGRpc3RyaWJ1dGlvbiBvZiB0aGUgc2FtcGxlIG1lYW4/IEp1c3RpZnkgeW91ciBhbnN3ZXIuDQoNCmBgYHtyfQ0KIyBDb2ZmZWUgc2FsZXMgZGF0YSANCnggPC0gYygNCiAgMjg1MCwgMzIwMCwgMjkwMCwgMzEwMCwgMjk1MCwgNzgwMCwgODEwMCwgNzkwMCwgMzMwMCwgMzA1MCwgNDAwMCwgNDIwMCwNCiAgMzE1MCwgMzQwMCwgNzcwMCwgODIwMCwgMzI1MCwgNDQwMCwgMzEwMCwgNDIwMCwgNDUwMCwgNDgwMCwgNDMwMCwgODUwMCwNCiAgODIwMCwgODkwMCwgODcwMCwgMzI1MCwgMzAwMCwgNDYwMCwgNDEwMCwgODQwMCwgODgwMCwgMzM1MCwgNDcwMCwgMzEwMCwNCiAgODEwMCwgMzA1MCwgODMwMCwgNDEwMCwgMzEwMCwgODMwMCwgODkwMCwgODIwMCwgNDQwMCwgNDUwMCwgMzI1MCwgNDYwMCwNCiAgODQwMCwgMzMwMCwgNDIwMCwgNDUwMCwgNDgwMCwgNDMwMCwgODUwMA0KKQ0KDQpuIDwtIGxlbmd0aCh4KQ0KeGJhciA8LSBtZWFuKHgpDQpzIDwtIHNkKHgpDQoNCmRhdGEuZnJhbWUobiA9IG4sIG1lYW4gPSB4YmFyLCBzZCA9IHMpDQoNCiMgVmlzdWFsIGNoZWNrIG9uIHJhdyBkYXRhIGRpc3RyaWJ1dGlvbiANCg0KcGFyKG1mcm93ID0gYygxLDIpKQ0KDQoNCmhpc3QoeCwNCiAgICAgcHJvYmFiaWxpdHkgPSBUUlVFLA0KICAgICBicmVha3MgPSAxNSwNCiAgICAgbWFpbiA9ICJIaXN0b2dyYW0gb2YgQ29mZmVlIFNhbGVzIiwNCiAgICAgeGxhYiA9ICJEYWlseSBTYWxlcyAobUwpIikNCg0KbGluZXMoZGVuc2l0eSh4KSwgY29sID0gImJsdWUiLCBsd2QgPSAyKQ0KDQoNCnFxbm9ybSh4LCBtYWluID0gIk5vcm1hbCBRLVEgUGxvdCIpDQpxcWxpbmUoeCwgY29sID0gInJlZCIsIGx3ZCA9IDIpDQoNCnBhcihtZnJvdyA9IGMoMSwxKSkNCg0KYGBgDQoqKkFuc3dlcioqOiBZZXMsIHRoZSBDZW50cmFsIExpbWl0IFRoZW9yZW0gY2FuIGJlIGFwcGxpZWQgaGVyZS4gQWx0aG91Z2ggdGhlIGhpc3RvZ3JhbSBzaG93cyB0d28gY2x1c3RlcnMgKGxpa2VseSByZXByZXNlbnRpbmcgdGhlIHR3byBjYWZlIGxvY2F0aW9ucyksIHRoZSBDTFQgZG9lcyBub3QgcmVxdWlyZSB0aGUgcG9wdWxhdGlvbiB0byBiZSBub3JtYWxseSBkaXN0cmlidXRlZC4gSXQgb25seSByZXF1aXJlcyB0aGF0IHRoZSBvYnNlcnZhdGlvbnMgYXJlIGluZGVwZW5kZW50IGFuZCBoYXZlIGZpbml0ZSB2YXJpYW5jZS4gU2luY2UgdGhlIHNhbXBsZSBzaXplIGlzIGxhcmdlciB0aGFuIDUwLCB0aGUgc2FtcGxpbmcgZGlzdHJpYnV0aW9uIG9mIHRoZSBzYW1wbGUgbWVhbiBjYW4gYmUgYXBwcm94aW1hdGVkIGJ5DQoNCiQkDQpcYmFye1h9IFxhcHByb3ggTlxsZWZ0KFxtdSwgXGZyYWN7XHNpZ21hXjJ9e259XHJpZ2h0KQ0KJCQNClRoZXJlZm9yZSwgaXQgaXMgcmVhc29uYWJsZSB0byB1c2UgdGhlIGFzeW1wdG90aWMgbm9ybWFsIGFwcHJveGltYXRpb24gZm9yIGluZmVyZW5jZSBhYm91dCB0aGUgcG9wdWxhdGlvbiBtZWFuLg0KDQoNCg0KYikgQXBwbHkgdGhlIGJvb3RzdHJhcCBtZXRob2QgdG8gZXN0aW1hdGUgdGhlIHNhbXBsaW5nIGRpc3RyaWJ1dGlvbiAob2Z0ZW4gY2FsbGVkIHRoZSBib290c3RyYXAgc2FtcGxpbmcgZGlzdHJpYnV0aW9uKSBvZiB0aGUgc2FtcGxlIG1lYW4uIEdlbmVyYXRlIGEga2VybmVsIGRlbnNpdHkgZXN0aW1hdGUgZnJvbSB0aGUgYm9vdHN0cmFwIHNhbXBsZSBtZWFucyBhbmQgcGxvdCBpdC4gVGhlbiwgdXNlIHRoaXMgYm9vdHN0cmFwIGRpc3RyaWJ1dGlvbiB0byB2YWxpZGF0ZSB5b3VyIGNvbmNsdXNpb24gZnJvbSBwYXJ0IChhKS4gTWFrZSBzdXJlIHlvdXIgdmlzdWFscyBhcmUgZWZmZWN0aXZlIGluIGVuaGFuY2luZyB0aGUgcHJlc2VudGF0aW9uIG9mIHRoZXNlIHJlc3VsdHMuDQoNCmBgYHtyfQ0KIyBOdW1iZXIgb2YgYm9vdHN0cmFwIHJlcGxpY2F0aW9ucw0KQiA8LSAxMDAwDQoNCiMgU3RvcmUgYm9vdHN0cmFwIHNhbXBsZSBtZWFucw0KYm9vdC5tZWFuIDwtIE5VTEwNCg0KIyBCb290c3RyYXAgbG9vcA0KZm9yKGkgaW4gMTpCKXsNCiAgDQogICMgUmVzYW1wbGUgV0lUSCByZXBsYWNlbWVudA0KICBib290LnNhbXBsZSA8LSBzYW1wbGUoeCxzaXplID0gbiwgcmVwbGFjZSA9IFRSVUUpDQogIA0KICAjIENvbXB1dGUgbWVhbiBvZiBib290c3RyYXAgc2FtcGxlDQogIGJvb3QubWVhbltpXSA8LSBtZWFuKGJvb3Quc2FtcGxlKQ0KfQ0KDQoNCmhpc3QoYm9vdC5tZWFuLA0KICAgICBwcm9iYWJpbGl0eSA9IFRSVUUsDQogICAgIGJyZWFrcyA9IDIwLA0KICAgICBtYWluID0gIkJvb3RzdHJhcCBTYW1wbGluZyBEaXN0cmlidXRpb24gb2YgU2FtcGxlIE1lYW4iLA0KICAgICB4bGFiID0gIkJvb3RzdHJhcCBTYW1wbGUgTWVhbnMiKQ0KDQpsaW5lcyhkZW5zaXR5KGJvb3QubWVhbiksIGNvbCA9ICJibHVlIiwgbHdkID0gMikNCmBgYA0KDQoqKkFuc3dlcioqOg0KVGhlIGJvb3RzdHJhcCBzYW1wbGluZyBkaXN0cmlidXRpb24gb2YgXChcYmFye1h9XCkgd2FzIGdlbmVyYXRlZCBieSByZXBlYXRlZGx5IHJlc2FtcGxpbmcgdGhlIGRhdGEgd2l0aCByZXBsYWNlbWVudCBhbmQgY29tcHV0aW5nIHRoZSBtZWFuIGVhY2ggdGltZS4gVGhlIGhpc3RvZ3JhbSBhbmQga2VybmVsIGRlbnNpdHkgY3VydmUgb2YgdGhlIGJvb3RzdHJhcCBtZWFucyBhcmUgYXBwcm94aW1hdGVseSBzeW1tZXRyaWMgYW5kIGJlbGwtc2hhcGVkLCB3aGljaCBzdXBwb3J0cyB0aGUgQ0xULWJhc2VkIGNvbmNsdXNpb24gaW4gcGFydCAoYSkgdGhhdCB0aGUgc2FtcGxpbmcgZGlzdHJpYnV0aW9uIG9mIHRoZSBzYW1wbGUgbWVhbiBpcyByZWFzb25hYmx5IGFwcHJveGltYXRlZCBieSBhIE5vcm1hbCBkaXN0cmlidXRpb24uDQoNCg0KYykgUmVwZWF0IHRoZSBhbmFseXNpcyBpbiBwYXJ0cyAoYSkgYW5kIChiKSBmb3IgdGhlIHNhbXBsZSB2YXJpYW5jZS4NCg0KKipQYXJ0IGEqKg0KYGBge3J9DQoNCnMyIDwtIHZhcih4KQ0KDQptdTRfaGF0IDwtIG1lYW4oKHggLSBtZWFuKHgpKV40KQ0KDQphc3ltLnNkLnZhciA8LSBzcXJ0KChtdTRfaGF0IC0gczJeMikgLyBuKQ0KDQpkYXRhLmZyYW1lKHNhbXBsZV92YXJpYW5jZSA9IHMyLA0KICAgICAgICAgICBhc3ltcHRvdGljX3NkID0gYXN5bS5zZC52YXIpDQoNCmBgYA0KDQoqKkFuc3dlcioqOlVuZGVyIGxhcmdlIHNhbXBsZSB0aGVvcnksIHdoZW4gdGhlIGZvdXJ0aCBtb21lbnQgaXMgZmluaXRlLCB0aGUgc2FtcGxlIHZhcmlhbmNlIGhhcyBhbiBhcHByb3hpbWF0ZSBOb3JtYWwgZGlzdHJpYnV0aW9uOg0KDQokJA0Kc14yIFx0byBOXGxlZnQoXHNpZ21hXjIsICBcZnJhY3tcbXVfNC1cc2lnbWFeNH17bn0gXHJpZ2h0KQ0KJCQNClNpbmNlIHRoZSBzYW1wbGUgc2l6ZSBpcyBncmVhdGVyIHRoYW4gNTAgYW5kIHRoZSBkYXRhIGhhdmUgZmluaXRlIHZhcmlhYmlsaXR5LCB0aGUgYXN5bXB0b3RpYyBOb3JtYWwgYXBwcm94aW1hdGlvbiBjYW4gYmUgY29uc2lkZXJlZC4gSG93ZXZlciwgdGhlIGFjY3VyYWN5IG1heSBiZSBhZmZlY3RlZCBieSB0aGUgc2hhcGUgb2YgdGhlIGRpc3RyaWJ1dGlvbi4NCg0KKipQYXJ0IGIqKg0KDQpgYGB7cn0NCg0KQiA8LSAxMDAwDQoNCmJvb3QudmFyIDwtIE5VTEwNCg0KZm9yKGkgaW4gMTpCKXsNCiAgDQogIGJvb3Quc2FtcGxlIDwtIHNhbXBsZSh4LA0KICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSA9IG4sDQogICAgICAgICAgICAgICAgICAgICAgICByZXBsYWNlID0gVFJVRSkNCiAgDQogIGJvb3QudmFyW2ldIDwtIHZhcihib290LnNhbXBsZSkNCn0NCg0KaGlzdChib290LnZhciwNCiAgICAgcHJvYmFiaWxpdHkgPSBUUlVFLA0KICAgICBicmVha3MgPSAyMCwNCiAgICAgbWFpbiA9ICJCb290c3RyYXAgU2FtcGxpbmcgRGlzdHJpYnV0aW9uIG9mIFNhbXBsZSBWYXJpYW5jZSIsDQogICAgIHhsYWIgPSAiQm9vdHN0cmFwIFNhbXBsZSBWYXJpYW5jZXMiKQ0KDQpsaW5lcyhkZW5zaXR5KGJvb3QudmFyKSwgY29sID0gImJsdWUiLCBsd2QgPSAyKQ0KDQpgYGANCg0KKipBbnN3ZXIgZm9yIFZhbGlkYXRpb24gKio6VGhlIGJvb3RzdHJhcCBkaXN0cmlidXRpb24gb2YgdGhlIHNhbXBsZSB2YXJpYW5jZSBhcHBlYXJzIHNsaWdodGx5IHNrZXdlZCByYXRoZXIgdGhhbiBwZXJmZWN0bHkgc3ltbWV0cmljLiBUaGlzIHN1Z2dlc3RzIHRoYXQgdGhlIE5vcm1hbCBhcHByb3hpbWF0aW9uIGZvciB0aGUgdmFyaWFuY2UgbWF5IGJlIGxlc3MgYWNjdXJhdGUgdGhhbiBmb3IgdGhlIG1lYW4uIFRoZXJlZm9yZSwgd2hpbGUgdGhlIGFzeW1wdG90aWMgYXBwcm94aW1hdGlvbiBjYW4gYmUgdXNlZCwgdGhlIGJvb3RzdHJhcCBkaXN0cmlidXRpb24gcHJvdmlkZXMgYSBtb3JlIGRhdGEtZHJpdmVuIGFzc2Vzc21lbnQgb2YgdmFyaWFiaWxpdHkgZm9yIHRoZSBzYW1wbGUgdmFyaWFuY2UuDQoNCg==