Description of the
Variable
In this assignment, I study the variable
AnimalProducts, which represents the percentage
of protein intake obtained from animal-based food sources for
each country in the dataset.
The goal is to estimate the population mean of this
variable and construct confidence intervals using:
- A classical t-based confidence interval learned in prior statistics
courses, and
- A bootstrap confidence interval constructed using resampling methods
introduced this week.
Data Import and
Exploration
data_path <- "C:\\Users\\rg03\\Downloads\\w02-Protein_Supply_Quantity_Data.csv"
data <- read.csv(data_path)
x <- data$AnimalProducts
x <- na.omit(x)
length(x)
## [1] 170
summary(x)
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 4.456 14.461 21.853 21.232 28.299 35.786
Interpretation (numeric).
After removing missing values, the sample contains n = 170
countries. The sample mean of AnimalProducts is
21.232%, and the median is 21.853%,
which are close and suggest the distribution is roughly symmetric. The
variability across countries is large: values range from
4.456% to 35.786%. The middle 50% of
countries fall between 14.461% (1st quartile) and
28.299% (3rd quartile). This substantial spread
motivates constructing confidence intervals to quantify uncertainty in
the population mean.
Classical Confidence
Interval for the Mean
Rationale
To estimate the population mean \(\mu\) of AnimalProducts, we
construct a 95% confidence interval using a t-based
interval:
\[
\bar{x} \pm t_{\alpha/2,\,n-1}\frac{s}{\sqrt{n}}
\]
n <- length(x)
xbar <- mean(x)
s <- sd(x)
alpha <- 0.05
t_crit <- qt(1 - alpha/2, df = n - 1)
ci_lower <- xbar - t_crit * s / sqrt(n)
ci_upper <- xbar + t_crit * s / sqrt(n)
c(n = n, xbar = xbar, s = s)
## n xbar s
## 170.000000 21.232152 7.921757
c(Lower = ci_lower, Upper = ci_upper)
## Lower Upper
## 20.03275 22.43156
Interpretation
The sample mean is \(\bar{x} =
21.232\%\). The 95% classical t-based confidence
interval for the population mean is:
\[
(20.033\%,\; 22.432\%).
\]
This means the true population mean percentage of protein intake from
animal products is plausibly between about 20.0% and
22.4%. The interval width is about 2.40 percentage
points, which is fairly narrow due to the large sample size
(n = 170). Under repeated sampling, about 95% of
intervals constructed using this method would contain the true mean.
Bootstrap Confidence
Interval for the Mean
Rationale
The bootstrap method estimates the sampling distribution of the
sample mean by repeatedly resampling the observed data with
replacement. Each bootstrap resample has the same
sample size n, and a sample mean is computed for each resample.
This provides an empirical approximation to the sampling distribution of
\(\bar{x}\) without relying strongly on
normality assumptions.
B <- 10000
boot_means <- numeric(B)
for (b in 1:B) {
boot_sample <- sample(x, size = n, replace = TRUE)
boot_means[b] <- mean(boot_sample)
}
Interpretation
We generated B = 10,000 bootstrap resamples, each
consisting of n = 170 observations drawn with
replacement from the original sample. For each resample we computed the
sample mean. The resulting set of 10,000 bootstrap means forms an
empirical sampling distribution for the mean.
Bootstrap Sampling
Distribution of the Sample Mean
hist(
boot_means,
breaks = 40,
main = "Bootstrap Sampling Distribution of the Sample Mean",
xlab = "Bootstrap Sample Means",
col = "lightblue",
border = "white"
)
abline(v = xbar, col = "red", lwd = 2)

Interpretation
The bootstrap sampling distribution is centered near the observed sample
mean (21.232%), shown by the red vertical line. The
distribution is approximately symmetric and bell-shaped, suggesting the
sampling distribution of the mean is close to normal. This supports the
idea that the classical t-based confidence interval is reasonable here
while still allowing the bootstrap method to confirm inference without
heavy parametric assumptions.
Bootstrap Percentile
Confidence Interval
We construct a 95% bootstrap percentile confidence interval using the
2.5th and 97.5th percentiles of the bootstrap means.
boot_ci <- quantile(boot_means, probs = c(0.025, 0.975))
boot_ci
## 2.5% 97.5%
## 20.05465 22.39994
Interpretation
The 95% bootstrap percentile confidence interval
is:
\[
(20.055\%,\; 22.400\%).
\]
This interval contains the middle 95% of the bootstrap sampling
distribution of the mean. Its width is approximately 2.35
percentage points, which is extremely close to the classical
interval width.
Comparison of the Two
Confidence Intervals
ci_table <- rbind(
Classical_CI = c(ci_lower, ci_upper),
Bootstrap_CI = as.numeric(boot_ci)
)
colnames(ci_table) <- c("Lower", "Upper")
ci_table
## Lower Upper
## Classical_CI 20.03275 22.43156
## Bootstrap_CI 20.05465 22.39994
Interpretation
The two confidence intervals are nearly identical:
- Classical 95% CI: \((20.033\%, 22.432\%)\)
- Bootstrap 95% CI: \((20.055\%, 22.400\%)\)
Both intervals are centered around the same mean (about
21.23%) and have almost the same width. This close
agreement suggests that the t-based method performs well for this
dataset and that the bootstrap procedure confirms the stability of the
mean estimate and its uncertainty.
Conclusion
Using AnimalProducts from n = 170
countries, the estimated mean percentage of protein intake from
animal-based food sources is 21.232%.
- The classical 95% t-based confidence interval is
\((20.033\%, 22.432\%)\).
- The bootstrap 95% percentile confidence interval is
\((20.055\%, 22.400\%)\).
Because these two intervals are extremely similar, they lead to the
same substantive conclusion: the population mean percentage of protein
intake from animal products across countries is likely between about
20% and 22.5%, and the estimate is stable under both
classical and bootstrap inference methods.
LS0tDQp0aXRsZTogIkFuYWx5emluZyBBbmltYWwgUHJvZHVjdHMgd2l0aCBCb290c3RyYXBwaW5nIg0KYXV0aG9yOiAiUnlhbiBHb3JtYW4iDQpkYXRlOiAiMjAyNS0wOS0wMiINCm91dHB1dDoNCiAgaHRtbF9kb2N1bWVudDoNCiAgICB0b2M6IHRydWUNCiAgICB0b2NfZGVwdGg6IDMNCiAgICBudW1iZXJfc2VjdGlvbnM6IHRydWUNCiAgICBkZl9wcmludDogcGFnZWQNCiAgICBjb2RlX2ZvbGRpbmc6IGhpZGUNCiAgICBjb2RlX2Rvd25sb2FkOiB0cnVlDQogICAgc2VsZl9jb250YWluZWQ6IHRydWUNCiAgICB0b2NfZmxvYXQ6IHRydWUNCiAgd29yZF9kb2N1bWVudDoNCiAgICB0b2M6IHRydWUNCiAgICB0b2NfZGVwdGg6IDMNCi0tLQ0KDQpgYGB7PWh0bWx9DQo8c3R5bGUgdHlwZT0idGV4dC9jc3MiPg0KaDEudGl0bGUgeyBmb250LXNpemU6IDI0cHg7IGZvbnQtd2VpZ2h0OiBib2xkOyBjb2xvcjogRGFya1JlZDsgdGV4dC1hbGlnbjogY2VudGVyOyBmb250LWZhbWlseTogIkdpbGwgU2FucyIsIHNhbnMtc2VyaWY7IH0NCmg0LmF1dGhvciB7IGZvbnQtc2l6ZTogMjBweDsgZm9udC13ZWlnaHQ6IGJvbGQ7IGNvbG9yOiBEYXJrUmVkOyB0ZXh0LWFsaWduOiBjZW50ZXI7IH0NCmg0LmRhdGUgeyBmb250LXNpemU6IDE4cHg7IGZvbnQtd2VpZ2h0OiBib2xkOyBjb2xvcjogRGFya0JsdWU7IHRleHQtYWxpZ246IGNlbnRlcjsgfQ0KDQpoMSB7IGZvbnQtc2l6ZTogMjJweDsgZm9udC13ZWlnaHQ6IGJvbGQ7IGNvbG9yOiBuYXZ5OyB0ZXh0LWFsaWduOiBsZWZ0OyB9DQpoMiB7IGZvbnQtc2l6ZTogMjBweDsgZm9udC13ZWlnaHQ6IGJvbGQ7IGNvbG9yOiBuYXZ5OyB0ZXh0LWFsaWduOiBsZWZ0OyB9DQpoMyB7IGZvbnQtc2l6ZTogMThweDsgZm9udC13ZWlnaHQ6IGJvbGQ7IGNvbG9yOiBuYXZ5OyB0ZXh0LWFsaWduOiBsZWZ0OyB9DQpoNCB7IGZvbnQtc2l6ZTogMThweDsgZm9udC13ZWlnaHQ6IGJvbGQ7IGNvbG9yOiBkYXJrcmVkOyB0ZXh0LWFsaWduOiBsZWZ0OyB9DQoNCmJvZHkgeyBiYWNrZ3JvdW5kLWNvbG9yOndoaXRlOyB9DQpwIHsgYmFja2dyb3VuZC1jb2xvcjp3aGl0ZTsgfQ0KLmhpZ2hsaWdodG1lIHsgYmFja2dyb3VuZC1jb2xvcjp5ZWxsb3c7IH0NCjwvc3R5bGU+DQpgYGANCg0KYGBge3Igc2V0dXAsIGluY2x1ZGU9RkFMU0V9DQoNCm5lZWRlZCA8LSBjKCJrbml0ciIpDQoNCmZvciAocCBpbiBuZWVkZWQpIHsNCiAgaWYgKCFyZXF1aXJlKHAsIGNoYXJhY3Rlci5vbmx5ID0gVFJVRSkpIHsNCiAgICBpbnN0YWxsLnBhY2thZ2VzKHAsIHJlcG9zID0gImh0dHBzOi8vY2xvdWQuci1wcm9qZWN0Lm9yZyIpDQogICAgbGlicmFyeShwLCBjaGFyYWN0ZXIub25seSA9IFRSVUUpDQogIH0NCn0NCg0Kc2V0LnNlZWQoMzIxKQ0KDQprbml0cjo6b3B0c19jaHVuayRzZXQoDQogIGVjaG8gICAgPSBUUlVFLA0KICB3YXJuaW5nID0gRkFMU0UsDQogIG1lc3NhZ2UgPSBGQUxTRSwNCiAgZmlnLmFsaWduID0gImNlbnRlciIsDQogIGZpZy5wb3MgID0gImh0Ig0KKQ0KYGBgDQoNCiMgIERlc2NyaXB0aW9uIG9mIHRoZSBWYXJpYWJsZQ0KDQpJbiB0aGlzIGFzc2lnbm1lbnQsIEkgc3R1ZHkgdGhlIHZhcmlhYmxlICoqQW5pbWFsUHJvZHVjdHMqKiwgd2hpY2ggcmVwcmVzZW50cyB0aGUgKipwZXJjZW50YWdlIG9mIHByb3RlaW4gaW50YWtlIG9idGFpbmVkIGZyb20gYW5pbWFsLWJhc2VkIGZvb2Qgc291cmNlcyoqIGZvciBlYWNoIGNvdW50cnkgaW4gdGhlIGRhdGFzZXQuDQoNClRoZSBnb2FsIGlzIHRvIGVzdGltYXRlIHRoZSAqKnBvcHVsYXRpb24gbWVhbioqIG9mIHRoaXMgdmFyaWFibGUgYW5kIGNvbnN0cnVjdCBjb25maWRlbmNlIGludGVydmFscyB1c2luZzoNCg0KMS4gQSBjbGFzc2ljYWwgdC1iYXNlZCBjb25maWRlbmNlIGludGVydmFsIGxlYXJuZWQgaW4gcHJpb3Igc3RhdGlzdGljcyBjb3Vyc2VzLCBhbmQgIA0KMi4gQSBib290c3RyYXAgY29uZmlkZW5jZSBpbnRlcnZhbCBjb25zdHJ1Y3RlZCB1c2luZyByZXNhbXBsaW5nIG1ldGhvZHMgaW50cm9kdWNlZCB0aGlzIHdlZWsuDQoNCiMgIERhdGEgSW1wb3J0IGFuZCBFeHBsb3JhdGlvbg0KDQpgYGB7ciBkYXRhLWltcG9ydH0NCmRhdGFfcGF0aCA8LSAiQzpcXFVzZXJzXFxyZzAzXFxEb3dubG9hZHNcXHcwMi1Qcm90ZWluX1N1cHBseV9RdWFudGl0eV9EYXRhLmNzdiINCmRhdGEgPC0gcmVhZC5jc3YoZGF0YV9wYXRoKQ0KDQp4IDwtIGRhdGEkQW5pbWFsUHJvZHVjdHMNCnggPC0gbmEub21pdCh4KQ0KDQpsZW5ndGgoeCkNCnN1bW1hcnkoeCkNCmBgYA0KDQoqKkludGVycHJldGF0aW9uIChudW1lcmljKS4qKiAgDQpBZnRlciByZW1vdmluZyBtaXNzaW5nIHZhbHVlcywgdGhlIHNhbXBsZSBjb250YWlucyAqKm4gPSAxNzAgY291bnRyaWVzKiouIFRoZSBzYW1wbGUgbWVhbiBvZiBgQW5pbWFsUHJvZHVjdHNgIGlzICoqMjEuMjMyJSoqLCBhbmQgdGhlIG1lZGlhbiBpcyAqKjIxLjg1MyUqKiwgd2hpY2ggYXJlIGNsb3NlIGFuZCBzdWdnZXN0IHRoZSBkaXN0cmlidXRpb24gaXMgcm91Z2hseSBzeW1tZXRyaWMuIFRoZSB2YXJpYWJpbGl0eSBhY3Jvc3MgY291bnRyaWVzIGlzIGxhcmdlOiB2YWx1ZXMgcmFuZ2UgZnJvbSAqKjQuNDU2JSoqIHRvICoqMzUuNzg2JSoqLiBUaGUgbWlkZGxlIDUwJSBvZiBjb3VudHJpZXMgZmFsbCBiZXR3ZWVuICoqMTQuNDYxJSoqICgxc3QgcXVhcnRpbGUpIGFuZCAqKjI4LjI5OSUqKiAoM3JkIHF1YXJ0aWxlKS4gVGhpcyBzdWJzdGFudGlhbCBzcHJlYWQgbW90aXZhdGVzIGNvbnN0cnVjdGluZyBjb25maWRlbmNlIGludGVydmFscyB0byBxdWFudGlmeSB1bmNlcnRhaW50eSBpbiB0aGUgcG9wdWxhdGlvbiBtZWFuLg0KDQojICBDbGFzc2ljYWwgQ29uZmlkZW5jZSBJbnRlcnZhbCBmb3IgdGhlIE1lYW4NCg0KIyMgIFJhdGlvbmFsZQ0KDQpUbyBlc3RpbWF0ZSB0aGUgcG9wdWxhdGlvbiBtZWFuIFwoXG11XCkgb2YgYEFuaW1hbFByb2R1Y3RzYCwgd2UgY29uc3RydWN0IGEgOTUlIGNvbmZpZGVuY2UgaW50ZXJ2YWwgdXNpbmcgYSAqKnQtYmFzZWQgaW50ZXJ2YWwqKjoNCg0KXFsNClxiYXJ7eH0gXHBtIHRfe1xhbHBoYS8yLFwsbi0xfVxmcmFje3N9e1xzcXJ0e259fQ0KXF0NCg0KYGBge3IgY2xhc3NpY2FsLWNpfQ0KbiA8LSBsZW5ndGgoeCkNCnhiYXIgPC0gbWVhbih4KQ0KcyA8LSBzZCh4KQ0KDQphbHBoYSA8LSAwLjA1DQp0X2NyaXQgPC0gcXQoMSAtIGFscGhhLzIsIGRmID0gbiAtIDEpDQoNCmNpX2xvd2VyIDwtIHhiYXIgLSB0X2NyaXQgKiBzIC8gc3FydChuKQ0KY2lfdXBwZXIgPC0geGJhciArIHRfY3JpdCAqIHMgLyBzcXJ0KG4pDQoNCmMobiA9IG4sIHhiYXIgPSB4YmFyLCBzID0gcykNCmMoTG93ZXIgPSBjaV9sb3dlciwgVXBwZXIgPSBjaV91cHBlcikNCmBgYA0KDQoqKkludGVycHJldGF0aW9uKiogIA0KVGhlIHNhbXBsZSBtZWFuIGlzICoqXChcYmFye3h9ID0gMjEuMjMyXCVcKSoqLiBUaGUgKio5NSUgY2xhc3NpY2FsIHQtYmFzZWQgY29uZmlkZW5jZSBpbnRlcnZhbCoqIGZvciB0aGUgcG9wdWxhdGlvbiBtZWFuIGlzOg0KDQpcWw0KKDIwLjAzM1wlLFw7IDIyLjQzMlwlKS4NClxdDQoNClRoaXMgbWVhbnMgdGhlIHRydWUgcG9wdWxhdGlvbiBtZWFuIHBlcmNlbnRhZ2Ugb2YgcHJvdGVpbiBpbnRha2UgZnJvbSBhbmltYWwgcHJvZHVjdHMgaXMgcGxhdXNpYmx5IGJldHdlZW4gYWJvdXQgKioyMC4wJSBhbmQgMjIuNCUqKi4gVGhlIGludGVydmFsIHdpZHRoIGlzIGFib3V0ICoqMi40MCBwZXJjZW50YWdlIHBvaW50cyoqLCB3aGljaCBpcyBmYWlybHkgbmFycm93IGR1ZSB0byB0aGUgbGFyZ2Ugc2FtcGxlIHNpemUgKCoqbiA9IDE3MCoqKS4gVW5kZXIgcmVwZWF0ZWQgc2FtcGxpbmcsIGFib3V0IDk1JSBvZiBpbnRlcnZhbHMgY29uc3RydWN0ZWQgdXNpbmcgdGhpcyBtZXRob2Qgd291bGQgY29udGFpbiB0aGUgdHJ1ZSBtZWFuLg0KDQojICBCb290c3RyYXAgQ29uZmlkZW5jZSBJbnRlcnZhbCBmb3IgdGhlIE1lYW4NCg0KIyMgIFJhdGlvbmFsZQ0KDQpUaGUgYm9vdHN0cmFwIG1ldGhvZCBlc3RpbWF0ZXMgdGhlIHNhbXBsaW5nIGRpc3RyaWJ1dGlvbiBvZiB0aGUgc2FtcGxlIG1lYW4gYnkgcmVwZWF0ZWRseSByZXNhbXBsaW5nIHRoZSBvYnNlcnZlZCBkYXRhICoqd2l0aCByZXBsYWNlbWVudCoqLiBFYWNoIGJvb3RzdHJhcCByZXNhbXBsZSBoYXMgdGhlICoqc2FtZSBzYW1wbGUgc2l6ZSBuKiosIGFuZCBhIHNhbXBsZSBtZWFuIGlzIGNvbXB1dGVkIGZvciBlYWNoIHJlc2FtcGxlLiBUaGlzIHByb3ZpZGVzIGFuIGVtcGlyaWNhbCBhcHByb3hpbWF0aW9uIHRvIHRoZSBzYW1wbGluZyBkaXN0cmlidXRpb24gb2YgXChcYmFye3h9XCkgd2l0aG91dCByZWx5aW5nIHN0cm9uZ2x5IG9uIG5vcm1hbGl0eSBhc3N1bXB0aW9ucy4NCg0KYGBge3IgYm9vdHN0cmFwfQ0KQiA8LSAxMDAwMA0KYm9vdF9tZWFucyA8LSBudW1lcmljKEIpDQoNCmZvciAoYiBpbiAxOkIpIHsNCiAgYm9vdF9zYW1wbGUgPC0gc2FtcGxlKHgsIHNpemUgPSBuLCByZXBsYWNlID0gVFJVRSkNCiAgYm9vdF9tZWFuc1tiXSA8LSBtZWFuKGJvb3Rfc2FtcGxlKQ0KfQ0KYGBgDQoNCioqSW50ZXJwcmV0YXRpb24qKiAgDQpXZSBnZW5lcmF0ZWQgKipCID0gMTAsMDAwIGJvb3RzdHJhcCByZXNhbXBsZXMqKiwgZWFjaCBjb25zaXN0aW5nIG9mICoqbiA9IDE3MCoqIG9ic2VydmF0aW9ucyBkcmF3biB3aXRoIHJlcGxhY2VtZW50IGZyb20gdGhlIG9yaWdpbmFsIHNhbXBsZS4gRm9yIGVhY2ggcmVzYW1wbGUgd2UgY29tcHV0ZWQgdGhlIHNhbXBsZSBtZWFuLiBUaGUgcmVzdWx0aW5nIHNldCBvZiAxMCwwMDAgYm9vdHN0cmFwIG1lYW5zIGZvcm1zIGFuIGVtcGlyaWNhbCBzYW1wbGluZyBkaXN0cmlidXRpb24gZm9yIHRoZSBtZWFuLg0KDQojIyAgQm9vdHN0cmFwIFNhbXBsaW5nIERpc3RyaWJ1dGlvbiBvZiB0aGUgU2FtcGxlIE1lYW4NCg0KYGBge3IgYm9vdHN0cmFwLXBsb3R9DQpoaXN0KA0KICBib290X21lYW5zLA0KICBicmVha3MgPSA0MCwNCiAgbWFpbiA9ICJCb290c3RyYXAgU2FtcGxpbmcgRGlzdHJpYnV0aW9uIG9mIHRoZSBTYW1wbGUgTWVhbiIsDQogIHhsYWIgPSAiQm9vdHN0cmFwIFNhbXBsZSBNZWFucyIsDQogIGNvbCA9ICJsaWdodGJsdWUiLA0KICBib3JkZXIgPSAid2hpdGUiDQopDQoNCmFibGluZSh2ID0geGJhciwgY29sID0gInJlZCIsIGx3ZCA9IDIpDQpgYGANCg0KKipJbnRlcnByZXRhdGlvbioqICANClRoZSBib290c3RyYXAgc2FtcGxpbmcgZGlzdHJpYnV0aW9uIGlzIGNlbnRlcmVkIG5lYXIgdGhlIG9ic2VydmVkIHNhbXBsZSBtZWFuICgqKjIxLjIzMiUqKiksIHNob3duIGJ5IHRoZSByZWQgdmVydGljYWwgbGluZS4gVGhlIGRpc3RyaWJ1dGlvbiBpcyBhcHByb3hpbWF0ZWx5IHN5bW1ldHJpYyBhbmQgYmVsbC1zaGFwZWQsIHN1Z2dlc3RpbmcgdGhlIHNhbXBsaW5nIGRpc3RyaWJ1dGlvbiBvZiB0aGUgbWVhbiBpcyBjbG9zZSB0byBub3JtYWwuIFRoaXMgc3VwcG9ydHMgdGhlIGlkZWEgdGhhdCB0aGUgY2xhc3NpY2FsIHQtYmFzZWQgY29uZmlkZW5jZSBpbnRlcnZhbCBpcyByZWFzb25hYmxlIGhlcmUgd2hpbGUgc3RpbGwgYWxsb3dpbmcgdGhlIGJvb3RzdHJhcCBtZXRob2QgdG8gY29uZmlybSBpbmZlcmVuY2Ugd2l0aG91dCBoZWF2eSBwYXJhbWV0cmljIGFzc3VtcHRpb25zLg0KDQojIyAgQm9vdHN0cmFwIFBlcmNlbnRpbGUgQ29uZmlkZW5jZSBJbnRlcnZhbA0KDQpXZSBjb25zdHJ1Y3QgYSA5NSUgYm9vdHN0cmFwIHBlcmNlbnRpbGUgY29uZmlkZW5jZSBpbnRlcnZhbCB1c2luZyB0aGUgMi41dGggYW5kIDk3LjV0aCBwZXJjZW50aWxlcyBvZiB0aGUgYm9vdHN0cmFwIG1lYW5zLg0KDQpgYGB7ciBib290c3RyYXAtY2l9DQpib290X2NpIDwtIHF1YW50aWxlKGJvb3RfbWVhbnMsIHByb2JzID0gYygwLjAyNSwgMC45NzUpKQ0KYm9vdF9jaQ0KYGBgDQoNCioqSW50ZXJwcmV0YXRpb24qKiAgDQpUaGUgKio5NSUgYm9vdHN0cmFwIHBlcmNlbnRpbGUgY29uZmlkZW5jZSBpbnRlcnZhbCoqIGlzOg0KDQpcWw0KKDIwLjA1NVwlLFw7IDIyLjQwMFwlKS4NClxdDQoNClRoaXMgaW50ZXJ2YWwgY29udGFpbnMgdGhlIG1pZGRsZSA5NSUgb2YgdGhlIGJvb3RzdHJhcCBzYW1wbGluZyBkaXN0cmlidXRpb24gb2YgdGhlIG1lYW4uIEl0cyB3aWR0aCBpcyBhcHByb3hpbWF0ZWx5ICoqMi4zNSBwZXJjZW50YWdlIHBvaW50cyoqLCB3aGljaCBpcyBleHRyZW1lbHkgY2xvc2UgdG8gdGhlIGNsYXNzaWNhbCBpbnRlcnZhbCB3aWR0aC4NCg0KIyAgQ29tcGFyaXNvbiBvZiB0aGUgVHdvIENvbmZpZGVuY2UgSW50ZXJ2YWxzDQoNCmBgYHtyIGNvbXBhcmV9DQpjaV90YWJsZSA8LSByYmluZCgNCiAgQ2xhc3NpY2FsX0NJID0gYyhjaV9sb3dlciwgY2lfdXBwZXIpLA0KICBCb290c3RyYXBfQ0kgPSBhcy5udW1lcmljKGJvb3RfY2kpDQopDQpjb2xuYW1lcyhjaV90YWJsZSkgPC0gYygiTG93ZXIiLCAiVXBwZXIiKQ0KY2lfdGFibGUNCmBgYA0KDQoqKkludGVycHJldGF0aW9uKiogIA0KVGhlIHR3byBjb25maWRlbmNlIGludGVydmFscyBhcmUgbmVhcmx5IGlkZW50aWNhbDoNCg0KLSAqKkNsYXNzaWNhbCA5NSUgQ0k6KiogXCgoMjAuMDMzXCUsIDIyLjQzMlwlKVwpICANCi0gKipCb290c3RyYXAgOTUlIENJOioqIFwoKDIwLjA1NVwlLCAyMi40MDBcJSlcKQ0KDQpCb3RoIGludGVydmFscyBhcmUgY2VudGVyZWQgYXJvdW5kIHRoZSBzYW1lIG1lYW4gKGFib3V0ICoqMjEuMjMlKiopIGFuZCBoYXZlIGFsbW9zdCB0aGUgc2FtZSB3aWR0aC4gVGhpcyBjbG9zZSBhZ3JlZW1lbnQgc3VnZ2VzdHMgdGhhdCB0aGUgdC1iYXNlZCBtZXRob2QgcGVyZm9ybXMgd2VsbCBmb3IgdGhpcyBkYXRhc2V0IGFuZCB0aGF0IHRoZSBib290c3RyYXAgcHJvY2VkdXJlIGNvbmZpcm1zIHRoZSBzdGFiaWxpdHkgb2YgdGhlIG1lYW4gZXN0aW1hdGUgYW5kIGl0cyB1bmNlcnRhaW50eS4NCg0KIyAgQ29uY2x1c2lvbg0KDQpVc2luZyBgQW5pbWFsUHJvZHVjdHNgIGZyb20gKipuID0gMTcwIGNvdW50cmllcyoqLCB0aGUgZXN0aW1hdGVkIG1lYW4gcGVyY2VudGFnZSBvZiBwcm90ZWluIGludGFrZSBmcm9tIGFuaW1hbC1iYXNlZCBmb29kIHNvdXJjZXMgaXMgKioyMS4yMzIlKiouDQoNCi0gVGhlICoqY2xhc3NpY2FsIDk1JSB0LWJhc2VkIGNvbmZpZGVuY2UgaW50ZXJ2YWwqKiBpcyBcKCgyMC4wMzNcJSwgMjIuNDMyXCUpXCkuICANCi0gVGhlICoqYm9vdHN0cmFwIDk1JSBwZXJjZW50aWxlIGNvbmZpZGVuY2UgaW50ZXJ2YWwqKiBpcyBcKCgyMC4wNTVcJSwgMjIuNDAwXCUpXCkuDQoNCkJlY2F1c2UgdGhlc2UgdHdvIGludGVydmFscyBhcmUgZXh0cmVtZWx5IHNpbWlsYXIsIHRoZXkgbGVhZCB0byB0aGUgc2FtZSBzdWJzdGFudGl2ZSBjb25jbHVzaW9uOiB0aGUgcG9wdWxhdGlvbiBtZWFuIHBlcmNlbnRhZ2Ugb2YgcHJvdGVpbiBpbnRha2UgZnJvbSBhbmltYWwgcHJvZHVjdHMgYWNyb3NzIGNvdW50cmllcyBpcyBsaWtlbHkgYmV0d2VlbiBhYm91dCAqKjIwJSBhbmQgMjIuNSUqKiwgYW5kIHRoZSBlc3RpbWF0ZSBpcyBzdGFibGUgdW5kZXIgYm90aCBjbGFzc2ljYWwgYW5kIGJvb3RzdHJhcCBpbmZlcmVuY2UgbWV0aG9kcy4NCg0KDQo=