Assignment Objectives
Enhance understanding the logic and procedure of hypothesis
testing .
Implement the procedures for power and sample size calculation
for basic hypothesis testing procedures using nuilt-in function and
manual calculation.
**Simple versus Composite Hypothesis*
Simple Hypothesis
Simple Hypothesis Test is a hypothesis that
completely specifies the population distribution. Mathematically, simple
hypothesis fixes all parameters to specific values. For example, The
simple hypotheses are: \(H_0: \mu = 5\)
(if \(\alpha\) is known), \(H_0: \mu = 100, \sigma^2 = 25\), and \(H_1: p = 0.7\) for a Bernoulli
distribution.
Example Scenario Test if a coin is
fair:
\[\begin{aligned}
H_0&: p = 0.5 \quad \text{(completely specified)} \\
H_1&: p = 0.6 \quad \text{(also completely specified)}
\end{aligned}\]
Both are simple hypotheses.
Composite Hypothesis
Composite Hypothesis is a hypothesis that does
not completely specify the distribution. Mathematically, it allows a
range of values for at least one parameter. For example, in one-sided:
\(\mu >5\); in two-sided: \(\mu \le 5\).
Example Scenarios
\[\begin{aligned}
&H_0: \mu = 5 && \text{(simple)} \\
&H_1: \mu > 5 && \text{(composite)}
\end{aligned}\]
\[\begin{aligned}
&H_0: \mu \leq 5 && \text{(composite)} \\
&H_1: \mu > 5 && \text{(composite)}
\end{aligned}\]
\[\begin{aligned}
&H_0: \text{data follows } N(\mu, 1), \mu = 0 &&
\text{(simple)} \\
&H_1: \text{data follows Poisson}(\lambda) &&
\text{(composite – different family)}
\end{aligned}\]
This assignment focuses on performing
performing a test of mean (\(\mu\)) a
normal population and calculating the power and sample size based on
various assumptions
Question: New Cholesterol Medication
A pharmaceutical company develops “CholestFix” to
reduce Low-Density Lipoprotein (LDL, fat carrier that’s low in
density) cholesterol. The current standard drug
lowers LDL by an average of 25 mg/dL with a standard deviation of 15
mg/dL. A clinical trial with 5 participants were recruited in the study
for three months. At the end of the study, the mean reduction is 29
mg/dL. Assume that the variance of LDL reduction of new drug is the same
as that of the standard drugs.
Based on the results in the clinical trial, researchers in the company
believe
CholestFix is more effective.
a). Perform a formal hypothesis test of the researchers’ belief
regarding LDL reduction, using a significance level of \(\alpha = 0.05\).
H0: mu = 25 (mean LDL reduction is the same as the standard
drug)
Ha: mu > 25 (mean LDL reduction is greater than the standard
drug)
# Given values
xbar <- 29
mu0 <- 25
sigma <- 15
n <- 5
# Test statistic
z <- (xbar - mu0) / (sigma / sqrt(n))
# Display labeled result
cat("Test statistic (z):", round(z, 3))
Test statistic (z): 0.596
# Critical value for right-tailed test
alpha <- 0.05
z_crit <- qnorm(1 - alpha)
cat("Critical value (z):", round(z_crit, 3))
Critical value (z): 1.645
# p-value for right-tailed test
p_value <- 1 - pnorm(z)
cat("p-value:", round(p_value, 4))
p-value: 0.2755
p-value and interpretation:
The p-value is 0.2755, which is greater than alpha = 0.05. This
indicates that the observed mean reduction of 29 mg/dL is not
significantly greater than 25 mg/dL and does not provide strong evidence
that CholestFix is more effective than the standard drug.
Decision in context
Since the p-value is greater than alpha = 0.05, we fail to reject H0.
There is not sufficient statistical evidence to support the claim that
CholestFix reduces LDL cholesterol more than the current standard
drug.
Summary
The sample mean LDL reduction observed in the clinical trial is 29
mg/dL, which is higher than the standard drug’s average reduction of 25
mg/dL. A one-sample z-test makes sense here because the population
standard deviation is known and we are testing the sample mean against a
specific value. Based on the results of the hypothesis test at the
significance level alpha = 0.05, the difference between the sample mean
and the standard value is not statistically significant. Therefore,
there is not sufficient statistical evidence to support the researchers’
claim that CholestFix reduces LDL cholesterol more than the current
standard drug.
b). Given \(n = 50, \sigma = 15, \alpha =
0.05\), and an effect size we wish to detect \(\delta = 4\) mg/dL (corresponding to a
reduction from 29 mg/dL to 25 mg/dL). What is the probability that we’d
detect a true improvement?
# Store given values for power calculation
n <- 50
sigma <- 15
delta <- 4
alpha <- 0.05
# Calculate probability of detecting true effect
power_result <- power.t.test(
n = n,
delta = delta,
sd = sigma,
sig.level = alpha,
type = "one.sample",
alternative = "one.sided"
)
# Display computed power
cat("Power:", round(power_result$power, 4))
Power: 0.585
Summary:
The power is about 0.585, which is not very high compared to the
usual 0.80 target. This means there is only about a 58.5% chance of
detecting a real improvement if it actually exists. The method used here
is appropriate since it uses the values given in the problem to
calculate the probability of detecting an effect. Since the power is
low, the study may not be strong enough and could fail to detect a true
improvement.
c). Determine the minimum sample size required to detect an effect
size of 4 mg/dL with a power of \(1 - \beta =
0.8\) and a significance level of \(\alpha = 0.05\). Assume the standard
deviation of LDL reduction is 15 mg/dL.
# Store given values for sample size calculation
delta <- 4
sigma <- 15
alpha <- 0.05
target_power <- 0.80
# Calculate required sample size
sample_size_result <- power.t.test(
power = target_power,
delta = delta,
sd = sigma,
sig.level = alpha,
type = "one.sample",
alternative = "one.sided"
)
# Display required sample size
cat("Required sample size:", ceiling(sample_size_result$n))
Required sample size: 89
Summary
The required sample size comes out to 89, which is a lot bigger than
what was used before. So this tells us that the earlier study was
probably too small to really detect the effect. The way this was done
makes sense because it uses the values given in the problem like the
effect size, standard deviation, alpha, and the target power. Since we
want power = 0.80, we need a larger sample to get there. Because of
that, using a smaller sample would likely not be enough to detect the
improvement even if it is actually there.
d).
Power curve: To assess the impact of sample size on
power, we can create a power function in terms of the sample size
\(n\) and use the remaining information from
part (b). Plot the power curve by selecting a sequence of sample sizes.
# Store fixed values from part (b)
delta <- 4
sigma <- 15
alpha <- 0.05
# Choose sample sizes to examine
n_seq <- seq(10, 120, by = 5)
# Compute power for each sample size
power_values <- sapply(n_seq, function(n) {
power.t.test(
n = n,
delta = delta,
sd = sigma,
sig.level = alpha,
type = "one.sample",
alternative = "one.sided"
)$power
})
# Plot power curve
plot(n_seq, power_values, type = "l", lwd = 2,
xlab = "Sample size (n)",
ylab = "Power",
main = "Power Curve for Detecting LDL Improvement")
# Add reference lines
abline(h = 0.80, lty = 2)
abline(v = 89, lty = 2)

Summary:
The graph shows that power increases as the sample size increases. At
smaller sample sizes, the power is pretty low, but it gets closer to
0.80 as n gets bigger. This makes sense here because it keeps the same
effect size, standard deviation, and significance level from part (b),
and only changes n to see how the power changes. Looking at the curve,
it is clear that we need a much larger sample to reach the desired power
of 0.80, which matches what we found in part (c).
Note: For each of the questions
above, write a short summary of what you observed, justify why your
analysis is valid, and interpret the results.
LS0tDQp0aXRsZTogIkFzc2lnbm1lbnQgOTogSHlwb3RoZXNpcyBUZXN0aW5nIGFuZCBQb3dlciBhbmQgU2FtcGxlIHNpemUgRGV0ZXJtaW5hdGlvbiINCmF1dGhvcjogIktheWxhIER5ZXIiDQpkYXRlOiAiIER1ZTogQXByaWwgNywgMjAyNiINCm91dHB1dDoNCiAgaHRtbF9kb2N1bWVudDogDQogICAgdG9jOiB5ZXMNCiAgICB0b2NfZGVwdGg6IDQNCiAgICB0b2NfZmxvYXQ6IHllcw0KICAgIG51bWJlcl9zZWN0aW9uczogbm8NCiAgICB0b2NfY29sbGFwc2VkOiB5ZXMNCiAgICBjb2RlX2ZvbGRpbmc6IGhpZGUNCiAgICBjb2RlX2Rvd25sb2FkOiB5ZXMNCiAgICBzbW9vdGhfc2Nyb2xsOiB5ZXMNCiAgICBoaWdobGlnaHQ6IG1vbm9jaHJvbWUNCiAgICB0aGVtZTogc3BhY2VsYWINCiAgd29yZF9kb2N1bWVudDogDQogICAgdG9jOiB5ZXMNCiAgICB0b2NfZGVwdGg6IDQNCiAgICBmaWdfY2FwdGlvbjogeWVzDQogICAga2VlcF9tZDogeWVzDQogIHBkZl9kb2N1bWVudDogDQogICAgdG9jOiB5ZXMNCiAgICB0b2NfZGVwdGg6IDQNCiAgICBmaWdfY2FwdGlvbjogeWVzDQogICAgbnVtYmVyX3NlY3Rpb25zOiB5ZXMNCiAgICBmaWdfd2lkdGg6IDMNCiAgICBmaWdfaGVpZ2h0OiAzDQplZGl0b3Jfb3B0aW9uczogDQogIGNodW5rX291dHB1dF90eXBlOiBpbmxpbmUNCi0tLQ0KDQpgYGB7Y3NzLCBlY2hvID0gRkFMU0V9DQojVE9DOjpiZWZvcmUgew0KICBjb250ZW50OiAiVGFibGUgb2YgQ29udGVudHMiOw0KICBmb250LXdlaWdodDogYm9sZDsNCiAgZm9udC1zaXplOiAxLjJlbTsNCiAgZGlzcGxheTogYmxvY2s7DQogIGNvbG9yOiBuYXZ5Ow0KICBtYXJnaW4tYm90dG9tOiAxMHB4Ow0KfQ0KDQoNCmRpdiNUT0MgbGkgeyAgICAgLyogdGFibGUgb2YgY29udGVudCAgKi8NCiAgICBsaXN0LXN0eWxlOnVwcGVyLXJvbWFuOw0KICAgIGJhY2tncm91bmQtaW1hZ2U6bm9uZTsNCiAgICBiYWNrZ3JvdW5kLXJlcGVhdDpub25lOw0KICAgIGJhY2tncm91bmQtcG9zaXRpb246MDsNCn0NCg0KaDEudGl0bGUgeyAgICAvKiBsZXZlbCAxIGhlYWRlciBvZiB0aXRsZSAgKi8NCiAgZm9udC1zaXplOiAyMnB4Ow0KICBmb250LXdlaWdodDogYm9sZDsNCiAgY29sb3I6IERhcmtSZWQ7DQogIHRleHQtYWxpZ246IGNlbnRlcjsNCiAgZm9udC1mYW1pbHk6ICJHaWxsIFNhbnMiLCBzYW5zLXNlcmlmOw0KfQ0KDQpoNC5hdXRob3IgeyAvKiBIZWFkZXIgNCAtIGFuZCB0aGUgYXV0aG9yIGFuZCBkYXRhIGhlYWRlcnMgdXNlIHRoaXMgdG9vICAqLw0KICBmb250LXNpemU6IDE1cHg7DQogIGZvbnQtd2VpZ2h0OiBib2xkOw0KICBmb250LWZhbWlseTogc3lzdGVtLXVpOw0KICBjb2xvcjogbmF2eTsNCiAgdGV4dC1hbGlnbjogY2VudGVyOw0KfQ0KDQpoNC5kYXRlIHsgLyogSGVhZGVyIDQgLSBhbmQgdGhlIGF1dGhvciBhbmQgZGF0YSBoZWFkZXJzIHVzZSB0aGlzIHRvbyAgKi8NCiAgZm9udC1zaXplOiAxOHB4Ow0KICBmb250LXdlaWdodDogYm9sZDsNCiAgZm9udC1mYW1pbHk6ICJHaWxsIFNhbnMiLCBzYW5zLXNlcmlmOw0KICBjb2xvcjogRGFya0JsdWU7DQogIHRleHQtYWxpZ246IGNlbnRlcjsNCn0NCg0KaDEgeyAvKiBIZWFkZXIgMSAtIGFuZCB0aGUgYXV0aG9yIGFuZCBkYXRhIGhlYWRlcnMgdXNlIHRoaXMgdG9vICAqLw0KICAgIGZvbnQtc2l6ZTogMjBweDsNCiAgICBmb250LXdlaWdodDogYm9sZDsNCiAgICBmb250LWZhbWlseTogIlRpbWVzIE5ldyBSb21hbiIsIFRpbWVzLCBzZXJpZjsNCiAgICBjb2xvcjogZGFya3JlZDsNCiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7DQp9DQoNCmgyIHsgLyogSGVhZGVyIDIgLSBhbmQgdGhlIGF1dGhvciBhbmQgZGF0YSBoZWFkZXJzIHVzZSB0aGlzIHRvbyAgKi8NCiAgICBmb250LXNpemU6IDE4cHg7DQogICAgZm9udC13ZWlnaHQ6IGJvbGQ7DQogICAgZm9udC1mYW1pbHk6ICJUaW1lcyBOZXcgUm9tYW4iLCBUaW1lcywgc2VyaWY7DQogICAgY29sb3I6IG5hdnk7DQogICAgdGV4dC1hbGlnbjogbGVmdDsNCn0NCg0KaDMgeyAvKiBIZWFkZXIgMyAtIGFuZCB0aGUgYXV0aG9yIGFuZCBkYXRhIGhlYWRlcnMgdXNlIHRoaXMgdG9vICAqLw0KICAgIGZvbnQtc2l6ZTogMTZweDsNCiAgICBmb250LXdlaWdodDogYm9sZDsNCiAgICBmb250LWZhbWlseTogIlRpbWVzIE5ldyBSb21hbiIsIFRpbWVzLCBzZXJpZjsNCiAgICBjb2xvcjogbmF2eTsNCiAgICB0ZXh0LWFsaWduOiBsZWZ0Ow0KfQ0KDQpoNCB7IC8qIEhlYWRlciA0IC0gYW5kIHRoZSBhdXRob3IgYW5kIGRhdGEgaGVhZGVycyB1c2UgdGhpcyB0b28gICovDQogICAgZm9udC1zaXplOiAxNHB4Ow0KICBmb250LXdlaWdodDogYm9sZDsNCiAgICBmb250LWZhbWlseTogIlRpbWVzIE5ldyBSb21hbiIsIFRpbWVzLCBzZXJpZjsNCiAgICBjb2xvcjogZGFya3JlZDsNCiAgICB0ZXh0LWFsaWduOiBsZWZ0Ow0KfQ0KDQovKiBBZGQgZG90cyBhZnRlciBudW1iZXJlZCBoZWFkZXJzICovDQouaGVhZGVyLXNlY3Rpb24tbnVtYmVyOjphZnRlciB7DQogIGNvbnRlbnQ6ICIuIjsNCg0KYm9keSB7YmFja2dyb3VuZC1jb2xvcjogI2ZmZmZmZjsNCiAgICAgIGNvbG9yOiAjMDAwMDAwOw0KICAgICAgZm9udC1mYW1pbHk6IEFyaWFsLCBzYW5zLXNlcmlmOw0KICAgICAgZm9udC1zaXplOiAxcmVtOw0KICAgICAgbGluZS1oZWlnaHQ6IDEuNjsNCiAgICAgIH0NCg0KLmhpZ2hsaWdodG1lIHsgYmFja2dyb3VuZC1jb2xvcjp5ZWxsb3c7IH0NCg0KcCB7IGJhY2tncm91bmQtY29sb3I6d2hpdGU7IH0NCg0KfQ0KYGBgDQoNCmBgYHtyIHNldHVwLCBpbmNsdWRlPUZBTFNFfQ0KIyBjb2RlIGNodW5rIHNwZWNpZmllcyB3aGV0aGVyIHRoZSBSIGNvZGUsIHdhcm5pbmdzLCBhbmQgb3V0cHV0IA0KIyB3aWxsIGJlIGluY2x1ZGVkIGluIHRoZSBvdXRwdXQgZmlsZXMuDQppZiAoIXJlcXVpcmUoImtuaXRyIikpIHsNCiAgIGluc3RhbGwucGFja2FnZXMoImtuaXRyIikNCiAgIGxpYnJhcnkoa25pdHIpDQp9DQppZiAoIXJlcXVpcmUoInBhbmRlciIpKSB7DQogICBpbnN0YWxsLnBhY2thZ2VzKCJwYW5kZXIiKQ0KICAgbGlicmFyeShwYW5kZXIpDQp9DQppZiAoIXJlcXVpcmUoImdncGxvdDIiKSkgew0KICBpbnN0YWxsLnBhY2thZ2VzKCJnZ3Bsb3QyIikNCiAgbGlicmFyeShnZ3Bsb3QyKQ0KfQ0KaWYgKCFyZXF1aXJlKCJ0aWR5dmVyc2UiKSkgew0KICBpbnN0YWxsLnBhY2thZ2VzKCJ0aWR5dmVyc2UiKQ0KICBsaWJyYXJ5KHRpZHl2ZXJzZSkNCn0NCg0KaWYgKCFyZXF1aXJlKCJwbG90bHkiKSkgew0KICBpbnN0YWxsLnBhY2thZ2VzKCJwbG90bHkiKQ0KICBsaWJyYXJ5KHBsb3RseSkNCn0NCg0KaWYgKCFyZXF1aXJlKCJWR0FNIikpIHsNCiAgaW5zdGFsbC5wYWNrYWdlcygiVkdBTSIpDQogIGxpYnJhcnkoVkdBTSkNCn0NCiMjIyMgVkdBTQ0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KGVjaG8gPSBUUlVFLCAgICAgICAjIGluY2x1ZGUgY29kZSBjaHVuayBpbiB0aGUgb3V0cHV0IGZpbGUNCiAgICAgICAgICAgICAgICAgICAgICB3YXJuaW5nID0gRkFMU0UsICAgIyBzb21ldGltZXMsIHlvdSBjb2RlIG1heSBwcm9kdWNlIHdhcm5pbmcgbWVzc2FnZXMsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgeW91IGNhbiBjaG9vc2UgdG8gaW5jbHVkZSB0aGUgd2FybmluZyBtZXNzYWdlcyBpbg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIHRoZSBvdXRwdXQgZmlsZS4gDQogICAgICAgICAgICAgICAgICAgICAgcmVzdWx0cyA9IFRSVUUsICAgICMgeW91IGNhbiBhbHNvIGRlY2lkZSB3aGV0aGVyIHRvIGluY2x1ZGUgdGhlIG91dHB1dA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGluIHRoZSBvdXRwdXQgZmlsZS4NCiAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlID0gRkFMU0UsDQogICAgICAgICAgICAgICAgICAgICAgY29tbWVudCA9IE5BDQogICAgICAgICAgICAgICAgICAgICAgKSAgDQpgYGANCiANCiBcDQogDQojIyAqKkFzc2lnbm1lbnQgT2JqZWN0aXZlcyoqIA0KDQo8cD4NCiogRW5oYW5jZSB1bmRlcnN0YW5kaW5nIHRoZSBsb2dpYyBhbmQgcHJvY2VkdXJlIG9mIGh5cG90aGVzaXMgdGVzdGluZyAuDQoNCiogSW1wbGVtZW50IHRoZSBwcm9jZWR1cmVzIGZvciBwb3dlciBhbmQgc2FtcGxlIHNpemUgY2FsY3VsYXRpb24gZm9yIGJhc2ljIGh5cG90aGVzaXMgdGVzdGluZyBwcm9jZWR1cmVzIHVzaW5nIG51aWx0LWluIGZ1bmN0aW9uIGFuZCBtYW51YWwgY2FsY3VsYXRpb24uDQo8L3A+DQoNCg0KIyMgKipQb2xpY2llcyBvZiBVc2luZyBBSSBUb29scyoqDQoNCjxwPg0KKipQb2xpY3kgb24gQUkgVG9vbCBVc2UqKjogUGxlYXNlIGFkaGVyZSB0byB0aGUgQUkgdG9vbCBwb2xpY3kgc3BlY2lmaWVkIGluIHRoZSBjb3Vyc2Ugc3lsbGFidXMuIFRoZSBkaXJlY3QgY29weWluZyBvZiBBSS1nZW5lcmF0ZWQgY29udGVudCBpcyBzdHJpY3RseSBwcm9oaWJpdGVkLiBBbGwgc3VibWl0dGVkIHdvcmsgbXVzdCByZWZsZWN0IHlvdXIgb3duIHVuZGVyc3RhbmRpbmc7IHdoZXJlIGV4dGVybmFsIHRvb2xzIGFyZSBjb25zdWx0ZWQsIGNvbnRlbnQgbXVzdCBiZSB0aG9yb3VnaGx5IHJlcGhyYXNlZCBhbmQgc3ludGhlc2l6ZWQgaW4geW91ciBvd24gd29yZHMuDQo8L3A+DQoNCjxwPg0KKipDb2RlIEluY2x1c2lvbiBSZXF1aXJlbWVudCoqOiBBbnkgY29kZSBpbmNsdWRlZCBpbiB5b3VyIGVzc2F5IG11c3QgYmUgcHJvcGVybHkgY29tbWVudGVkIHRvIGV4cGxhaW4gdGhlIHB1cnBvc2UgYW5kL29yIGV4cGVjdGVkIG91dHB1dCBvZiBrZXkgY29kZSBsaW5lcy4gU3VibWl0dGluZyBBSS1nZW5lcmF0ZWQgY29kZSB3aXRob3V0IG1lYW5pbmdmdWwsIHN0dWRlbnQtYWRkZWQgY29tbWVudHMgd2lsbCBub3QgYmUgYWNjZXB0ZWQuDQo8L3A+DQoNCg0KIyMgKipTaW1wbGUgdmVyc3VzIENvbXBvc2l0ZSBIeXBvdGhlc2lzKg0KDQoqKlNpbXBsZSBIeXBvdGhlc2lzKioNCg0KKiAqKlNpbXBsZSBIeXBvdGhlc2lzIFRlc3QqKiBpcyBhIGh5cG90aGVzaXMgdGhhdCBjb21wbGV0ZWx5IHNwZWNpZmllcyB0aGUgcG9wdWxhdGlvbiBkaXN0cmlidXRpb24uIE1hdGhlbWF0aWNhbGx5LCBzaW1wbGUgaHlwb3RoZXNpcyBmaXhlcyBhbGwgcGFyYW1ldGVycyB0byBzcGVjaWZpYyB2YWx1ZXMuIEZvciBleGFtcGxlLCBUaGUgc2ltcGxlIGh5cG90aGVzZXMgYXJlOiAkSF8wOiBcbXUgPSA1JCAoaWYgJFxhbHBoYSQgaXMga25vd24pLCAkSF8wOiBcbXUgPSAxMDAsIFxzaWdtYV4yID0gMjUkLCBhbmQgJEhfMTogcCA9IDAuNyQgZm9yIGEgQmVybm91bGxpIGRpc3RyaWJ1dGlvbi4NCg0KKiAqKkV4YW1wbGUgU2NlbmFyaW8qKiAgVGVzdCBpZiBhIGNvaW4gaXMgZmFpcjoNCg0KXGJlZ2lue2FsaWduZWR9DQpIXzAmOiBwID0gMC41IFxxdWFkIFx0ZXh0eyhjb21wbGV0ZWx5IHNwZWNpZmllZCl9IFxcDQpIXzEmOiBwID0gMC42IFxxdWFkIFx0ZXh0eyhhbHNvIGNvbXBsZXRlbHkgc3BlY2lmaWVkKX0NClxlbmR7YWxpZ25lZH0NCg0KQm90aCBhcmUgKipzaW1wbGUqKiBoeXBvdGhlc2VzLg0KDQoqKkNvbXBvc2l0ZSBIeXBvdGhlc2lzKioNCg0KKiAqKkNvbXBvc2l0ZSBIeXBvdGhlc2lzKiogaXMgYSBoeXBvdGhlc2lzIHRoYXQgZG9lcyBub3QgY29tcGxldGVseSBzcGVjaWZ5IHRoZSBkaXN0cmlidXRpb24uIE1hdGhlbWF0aWNhbGx5LCBpdCBhbGxvd3MgYSByYW5nZSBvZiB2YWx1ZXMgZm9yIGF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIuIEZvciBleGFtcGxlLCBpbiBvbmUtc2lkZWQ6ICRcbXUgPjUkOyBpbiB0d28tc2lkZWQ6ICRcbXUgXGxlIDUkLg0KDQoqICoqRXhhbXBsZSBTY2VuYXJpb3MqKiANCg0KDQpcYmVnaW57YWxpZ25lZH0NCiZIXzA6IFxtdSA9IDUgJiYgXHRleHR7KHNpbXBsZSl9IFxcDQomSF8xOiBcbXUgPiA1ICYmIFx0ZXh0eyhjb21wb3NpdGUpfQ0KXGVuZHthbGlnbmVkfQ0KDQoNCg0KXGJlZ2lue2FsaWduZWR9DQomSF8wOiBcbXUgXGxlcSA1ICYmIFx0ZXh0eyhjb21wb3NpdGUpfSBcXA0KJkhfMTogXG11ID4gNSAmJiBcdGV4dHsoY29tcG9zaXRlKX0NClxlbmR7YWxpZ25lZH0NCg0KDQpcYmVnaW57YWxpZ25lZH0NCiZIXzA6IFx0ZXh0e2RhdGEgZm9sbG93cyB9IE4oXG11LCAxKSwgXG11ID0gMCAmJiBcdGV4dHsoc2ltcGxlKX0gXFwNCiZIXzE6IFx0ZXh0e2RhdGEgZm9sbG93cyBQb2lzc29ufShcbGFtYmRhKSAmJiBcdGV4dHsoY29tcG9zaXRlIOKAkyBkaWZmZXJlbnQgZmFtaWx5KX0NClxlbmR7YWxpZ25lZH0NCg0KDQoNCjxwPjxmb250IGNvbG9yID0gImRhcmtyZWQiPioqVGhpcyBhc3NpZ25tZW50IGZvY3VzZXMgb24gcGVyZm9ybWluZyBwZXJmb3JtaW5nIGEgdGVzdCBvZiBtZWFuICgkXG11JCkgYSBub3JtYWwgcG9wdWxhdGlvbiBhbmQgY2FsY3VsYXRpbmcgdGhlIHBvd2VyIGFuZCBzYW1wbGUgc2l6ZSBiYXNlZCBvbiB2YXJpb3VzIGFzc3VtcHRpb25zKio8L2ZvbnQ+PC9wPg0KDQoNClwNCg0KIyMgKipRdWVzdGlvbjogTmV3IENob2xlc3Rlcm9sIE1lZGljYXRpb24qKg0KDQo8cD4NCkEgcGhhcm1hY2V1dGljYWwgY29tcGFueSBkZXZlbG9wcyAqKiJDaG9sZXN0Rml4IioqIHRvIHJlZHVjZSBMb3ctRGVuc2l0eSBMaXBvcHJvdGVpbiAoTERMLCAqZmF0IGNhcnJpZXIgdGhhdCdzIGxvdyBpbiBkZW5zaXR5KikgY2hvbGVzdGVyb2wuIFRoZSAqKmN1cnJlbnQgc3RhbmRhcmQgZHJ1ZyoqIGxvd2VycyBMREwgYnkgYW4gYXZlcmFnZSBvZiAyNSBtZy9kTCB3aXRoIGEgc3RhbmRhcmQgZGV2aWF0aW9uIG9mIDE1IG1nL2RMLiBBIGNsaW5pY2FsIHRyaWFsIHdpdGggNSBwYXJ0aWNpcGFudHMgd2VyZSByZWNydWl0ZWQgaW4gdGhlIHN0dWR5IGZvciB0aHJlZSBtb250aHMuIEF0IHRoZSBlbmQgb2YgdGhlIHN0dWR5LCB0aGUgbWVhbiByZWR1Y3Rpb24gaXMgMjkgbWcvZEwuIEFzc3VtZSB0aGF0IHRoZSB2YXJpYW5jZSBvZiBMREwgcmVkdWN0aW9uIG9mIG5ldyBkcnVnIGlzIHRoZSBzYW1lIGFzIHRoYXQgb2YgdGhlIHN0YW5kYXJkIGRydWdzLg0KDQpCYXNlZCBvbiB0aGUgcmVzdWx0cyBpbiB0aGUgY2xpbmljYWwgdHJpYWwsIHJlc2VhcmNoZXJzIGluIHRoZSBjb21wYW55IGJlbGlldmUgKipDaG9sZXN0Rml4KiogaXMgbW9yZSBlZmZlY3RpdmUuDQo8L3A+DQoNCg0KPHA+DQphKS4gUGVyZm9ybSBhIGZvcm1hbCBoeXBvdGhlc2lzIHRlc3Qgb2YgdGhlIHJlc2VhcmNoZXJz4oCZIGJlbGllZiByZWdhcmRpbmcgTERMIHJlZHVjdGlvbiwgdXNpbmcgYSBzaWduaWZpY2FuY2UgbGV2ZWwgb2YgJFxhbHBoYSA9IDAuMDUkLg0KDQojIEgwOiBtdSA9IDI1ICAobWVhbiBMREwgcmVkdWN0aW9uIGlzIHRoZSBzYW1lIGFzIHRoZSBzdGFuZGFyZCBkcnVnKQ0KIyBIYTogbXUgPiAyNSAgKG1lYW4gTERMIHJlZHVjdGlvbiBpcyBncmVhdGVyIHRoYW4gdGhlIHN0YW5kYXJkIGRydWcpDQoNCmBgYHtyfQ0KIyBHaXZlbiB2YWx1ZXMNCnhiYXIgPC0gMjkNCm11MCA8LSAyNQ0Kc2lnbWEgPC0gMTUNCm4gPC0gNQ0KDQojIFRlc3Qgc3RhdGlzdGljDQp6IDwtICh4YmFyIC0gbXUwKSAvIChzaWdtYSAvIHNxcnQobikpDQoNCiMgRGlzcGxheSBsYWJlbGVkIHJlc3VsdA0KY2F0KCJUZXN0IHN0YXRpc3RpYyAoeik6Iiwgcm91bmQoeiwgMykpDQpgYGANCg0KYGBge3J9DQojIENyaXRpY2FsIHZhbHVlIGZvciByaWdodC10YWlsZWQgdGVzdA0KYWxwaGEgPC0gMC4wNQ0KDQp6X2NyaXQgPC0gcW5vcm0oMSAtIGFscGhhKQ0KDQpjYXQoIkNyaXRpY2FsIHZhbHVlICh6KToiLCByb3VuZCh6X2NyaXQsIDMpKQ0KYGBgDQoNCmBgYHtyfQ0KIyBwLXZhbHVlIGZvciByaWdodC10YWlsZWQgdGVzdA0KcF92YWx1ZSA8LSAxIC0gcG5vcm0oeikNCmNhdCgicC12YWx1ZToiLCByb3VuZChwX3ZhbHVlLCA0KSkNCmBgYA0KDQojIHAtdmFsdWUgYW5kIGludGVycHJldGF0aW9uOg0KVGhlIHAtdmFsdWUgaXMgMC4yNzU1LCB3aGljaCBpcyBncmVhdGVyIHRoYW4gYWxwaGEgPSAwLjA1LiBUaGlzIGluZGljYXRlcyB0aGF0IHRoZSBvYnNlcnZlZCBtZWFuIHJlZHVjdGlvbiBvZiAyOSBtZy9kTCBpcyBub3Qgc2lnbmlmaWNhbnRseSBncmVhdGVyIHRoYW4gMjUgbWcvZEwgYW5kIGRvZXMgbm90IHByb3ZpZGUgc3Ryb25nIGV2aWRlbmNlIHRoYXQgQ2hvbGVzdEZpeCBpcyBtb3JlIGVmZmVjdGl2ZSB0aGFuIHRoZSBzdGFuZGFyZCBkcnVnLg0KDQojIERlY2lzaW9uIGluIGNvbnRleHQNClNpbmNlIHRoZSBwLXZhbHVlIGlzIGdyZWF0ZXIgdGhhbiBhbHBoYSA9IDAuMDUsIHdlIGZhaWwgdG8gcmVqZWN0IEgwLiBUaGVyZSBpcyBub3Qgc3VmZmljaWVudCBzdGF0aXN0aWNhbCBldmlkZW5jZSB0byBzdXBwb3J0IHRoZSBjbGFpbSB0aGF0IENob2xlc3RGaXggcmVkdWNlcyBMREwgY2hvbGVzdGVyb2wgbW9yZSB0aGFuIHRoZSBjdXJyZW50IHN0YW5kYXJkIGRydWcuDQoNCiMgU3VtbWFyeQ0KVGhlIHNhbXBsZSBtZWFuIExETCByZWR1Y3Rpb24gb2JzZXJ2ZWQgaW4gdGhlIGNsaW5pY2FsIHRyaWFsIGlzIDI5IG1nL2RMLCB3aGljaCBpcyBoaWdoZXIgdGhhbiB0aGUgc3RhbmRhcmQgZHJ1Z+KAmXMgYXZlcmFnZSByZWR1Y3Rpb24gb2YgMjUgbWcvZEwuIEEgb25lLXNhbXBsZSB6LXRlc3QgbWFrZXMgc2Vuc2UgaGVyZSBiZWNhdXNlIHRoZSBwb3B1bGF0aW9uIHN0YW5kYXJkIGRldmlhdGlvbiBpcyBrbm93biBhbmQgd2UgYXJlIHRlc3RpbmcgdGhlIHNhbXBsZSBtZWFuIGFnYWluc3QgYSBzcGVjaWZpYyB2YWx1ZS4gQmFzZWQgb24gdGhlIHJlc3VsdHMgb2YgdGhlIGh5cG90aGVzaXMgdGVzdCBhdCB0aGUgc2lnbmlmaWNhbmNlIGxldmVsIGFscGhhID0gMC4wNSwgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgc2FtcGxlIG1lYW4gYW5kIHRoZSBzdGFuZGFyZCB2YWx1ZSBpcyBub3Qgc3RhdGlzdGljYWxseSBzaWduaWZpY2FudC4gVGhlcmVmb3JlLCB0aGVyZSBpcyBub3Qgc3VmZmljaWVudCBzdGF0aXN0aWNhbCBldmlkZW5jZSB0byBzdXBwb3J0IHRoZSByZXNlYXJjaGVyc+KAmSBjbGFpbSB0aGF0IENob2xlc3RGaXggcmVkdWNlcyBMREwgY2hvbGVzdGVyb2wgbW9yZSB0aGFuIHRoZSBjdXJyZW50IHN0YW5kYXJkIGRydWcuDQoNCmIpLiBHaXZlbiAkbiA9IDUwLCBcc2lnbWEgPSAxNSwgXGFscGhhID0gMC4wNSQsIGFuZCBhbiBlZmZlY3Qgc2l6ZSB3ZSB3aXNoIHRvIGRldGVjdCAkXGRlbHRhID0gNCQgbWcvZEwgKGNvcnJlc3BvbmRpbmcgdG8gYSByZWR1Y3Rpb24gZnJvbSAyOSBtZy9kTCB0byAyNSBtZy9kTCkuICBXaGF0IGlzIHRoZSBwcm9iYWJpbGl0eSB0aGF0IHdlJ2QgZGV0ZWN0IGEgdHJ1ZSBpbXByb3ZlbWVudD8NCg0KYGBge3J9DQojIFN0b3JlIGdpdmVuIHZhbHVlcyBmb3IgcG93ZXIgY2FsY3VsYXRpb24NCm4gPC0gNTANCnNpZ21hIDwtIDE1DQpkZWx0YSA8LSA0DQphbHBoYSA8LSAwLjA1DQpgYGANCg0KYGBge3J9DQojIENhbGN1bGF0ZSBwcm9iYWJpbGl0eSBvZiBkZXRlY3RpbmcgdHJ1ZSBlZmZlY3QNCnBvd2VyX3Jlc3VsdCA8LSBwb3dlci50LnRlc3QoDQogIG4gPSBuLA0KICBkZWx0YSA9IGRlbHRhLA0KICBzZCA9IHNpZ21hLA0KICBzaWcubGV2ZWwgPSBhbHBoYSwNCiAgdHlwZSA9ICJvbmUuc2FtcGxlIiwNCiAgYWx0ZXJuYXRpdmUgPSAib25lLnNpZGVkIg0KKQ0KDQojIERpc3BsYXkgY29tcHV0ZWQgcG93ZXINCmNhdCgiUG93ZXI6Iiwgcm91bmQocG93ZXJfcmVzdWx0JHBvd2VyLCA0KSkNCmBgYA0KDQojIFN1bW1hcnk6DQpUaGUgcG93ZXIgaXMgYWJvdXQgMC41ODUsIHdoaWNoIGlzIG5vdCB2ZXJ5IGhpZ2ggY29tcGFyZWQgdG8gdGhlIHVzdWFsIDAuODAgdGFyZ2V0LiBUaGlzIG1lYW5zIHRoZXJlIGlzIG9ubHkgYWJvdXQgYSA1OC41JSBjaGFuY2Ugb2YgZGV0ZWN0aW5nIGEgcmVhbCBpbXByb3ZlbWVudCBpZiBpdCBhY3R1YWxseSBleGlzdHMuIFRoZSBtZXRob2QgdXNlZCBoZXJlIGlzIGFwcHJvcHJpYXRlIHNpbmNlIGl0IHVzZXMgdGhlIHZhbHVlcyBnaXZlbiBpbiB0aGUgcHJvYmxlbSB0byBjYWxjdWxhdGUgdGhlIHByb2JhYmlsaXR5IG9mIGRldGVjdGluZyBhbiBlZmZlY3QuIFNpbmNlIHRoZSBwb3dlciBpcyBsb3csIHRoZSBzdHVkeSBtYXkgbm90IGJlIHN0cm9uZyBlbm91Z2ggYW5kIGNvdWxkIGZhaWwgdG8gZGV0ZWN0IGEgdHJ1ZSBpbXByb3ZlbWVudC4NCg0KYykuIERldGVybWluZSB0aGUgbWluaW11bSBzYW1wbGUgc2l6ZSByZXF1aXJlZCB0byBkZXRlY3QgYW4gZWZmZWN0IHNpemUgb2YgNCBtZy9kTCB3aXRoIGEgcG93ZXIgb2YgJDEgLSBcYmV0YSA9IDAuOCQgIGFuZCBhIHNpZ25pZmljYW5jZSBsZXZlbCBvZiAkXGFscGhhID0gMC4wNSQuIEFzc3VtZSB0aGUgc3RhbmRhcmQgZGV2aWF0aW9uIG9mIExETCByZWR1Y3Rpb24gaXMgMTUgbWcvZEwuDQoNCmBgYHtyfQ0KIyBTdG9yZSBnaXZlbiB2YWx1ZXMgZm9yIHNhbXBsZSBzaXplIGNhbGN1bGF0aW9uDQpkZWx0YSA8LSA0DQpzaWdtYSA8LSAxNQ0KYWxwaGEgPC0gMC4wNQ0KdGFyZ2V0X3Bvd2VyIDwtIDAuODANCmBgYA0KDQpgYGB7cn0NCiMgQ2FsY3VsYXRlIHJlcXVpcmVkIHNhbXBsZSBzaXplDQpzYW1wbGVfc2l6ZV9yZXN1bHQgPC0gcG93ZXIudC50ZXN0KA0KICBwb3dlciA9IHRhcmdldF9wb3dlciwNCiAgZGVsdGEgPSBkZWx0YSwNCiAgc2QgPSBzaWdtYSwNCiAgc2lnLmxldmVsID0gYWxwaGEsDQogIHR5cGUgPSAib25lLnNhbXBsZSIsDQogIGFsdGVybmF0aXZlID0gIm9uZS5zaWRlZCINCikNCg0KIyBEaXNwbGF5IHJlcXVpcmVkIHNhbXBsZSBzaXplDQpjYXQoIlJlcXVpcmVkIHNhbXBsZSBzaXplOiIsIGNlaWxpbmcoc2FtcGxlX3NpemVfcmVzdWx0JG4pKQ0KYGBgDQoNCiMgU3VtbWFyeQ0KVGhlIHJlcXVpcmVkIHNhbXBsZSBzaXplIGNvbWVzIG91dCB0byA4OSwgd2hpY2ggaXMgYSBsb3QgYmlnZ2VyIHRoYW4gd2hhdCB3YXMgdXNlZCBiZWZvcmUuIFNvIHRoaXMgdGVsbHMgdXMgdGhhdCB0aGUgZWFybGllciBzdHVkeSB3YXMgcHJvYmFibHkgdG9vIHNtYWxsIHRvIHJlYWxseSBkZXRlY3QgdGhlIGVmZmVjdC4gVGhlIHdheSB0aGlzIHdhcyBkb25lIG1ha2VzIHNlbnNlIGJlY2F1c2UgaXQgdXNlcyB0aGUgdmFsdWVzIGdpdmVuIGluIHRoZSBwcm9ibGVtIGxpa2UgdGhlIGVmZmVjdCBzaXplLCBzdGFuZGFyZCBkZXZpYXRpb24sIGFscGhhLCBhbmQgdGhlIHRhcmdldCBwb3dlci4gU2luY2Ugd2Ugd2FudCBwb3dlciA9IDAuODAsIHdlIG5lZWQgYSBsYXJnZXIgc2FtcGxlIHRvIGdldCB0aGVyZS4gQmVjYXVzZSBvZiB0aGF0LCB1c2luZyBhIHNtYWxsZXIgc2FtcGxlIHdvdWxkIGxpa2VseSBub3QgYmUgZW5vdWdoIHRvIGRldGVjdCB0aGUgaW1wcm92ZW1lbnQgZXZlbiBpZiBpdCBpcyBhY3R1YWxseSB0aGVyZS4NCg0KZCkuICoqUG93ZXIgY3VydmUqKjogVG8gYXNzZXNzIHRoZSBpbXBhY3Qgb2Ygc2FtcGxlIHNpemUgb24gcG93ZXIsIHdlIGNhbiBjcmVhdGUgYSBwb3dlciBmdW5jdGlvbiBpbiB0ZXJtcyBvZiB0aGUgc2FtcGxlIHNpemUgJG4kIGFuZCB1c2UgdGhlIHJlbWFpbmluZyBpbmZvcm1hdGlvbiBmcm9tIHBhcnQgKGIpLiBQbG90IHRoZSBwb3dlciBjdXJ2ZSBieSBzZWxlY3RpbmcgYSBzZXF1ZW5jZSBvZiBzYW1wbGUgc2l6ZXMuDQo8L3A+DQoNCmBgYHtyfQ0KIyBTdG9yZSBmaXhlZCB2YWx1ZXMgZnJvbSBwYXJ0IChiKQ0KZGVsdGEgPC0gNA0Kc2lnbWEgPC0gMTUNCmFscGhhIDwtIDAuMDUNCg0KIyBDaG9vc2Ugc2FtcGxlIHNpemVzIHRvIGV4YW1pbmUNCm5fc2VxIDwtIHNlcSgxMCwgMTIwLCBieSA9IDUpDQoNCiMgQ29tcHV0ZSBwb3dlciBmb3IgZWFjaCBzYW1wbGUgc2l6ZQ0KcG93ZXJfdmFsdWVzIDwtIHNhcHBseShuX3NlcSwgZnVuY3Rpb24obikgew0KICBwb3dlci50LnRlc3QoDQogICAgbiA9IG4sDQogICAgZGVsdGEgPSBkZWx0YSwNCiAgICBzZCA9IHNpZ21hLA0KICAgIHNpZy5sZXZlbCA9IGFscGhhLA0KICAgIHR5cGUgPSAib25lLnNhbXBsZSIsDQogICAgYWx0ZXJuYXRpdmUgPSAib25lLnNpZGVkIg0KICApJHBvd2VyDQp9KQ0KYGBgDQoNCmBgYHtyfQ0KIyBQbG90IHBvd2VyIGN1cnZlDQpwbG90KG5fc2VxLCBwb3dlcl92YWx1ZXMsIHR5cGUgPSAibCIsIGx3ZCA9IDIsDQogICAgIHhsYWIgPSAiU2FtcGxlIHNpemUgKG4pIiwNCiAgICAgeWxhYiA9ICJQb3dlciIsDQogICAgIG1haW4gPSAiUG93ZXIgQ3VydmUgZm9yIERldGVjdGluZyBMREwgSW1wcm92ZW1lbnQiKQ0KDQojIEFkZCByZWZlcmVuY2UgbGluZXMNCmFibGluZShoID0gMC44MCwgbHR5ID0gMikNCmFibGluZSh2ID0gODksIGx0eSA9IDIpDQpgYGANCg0KIyBTdW1tYXJ5Og0KVGhlIGdyYXBoIHNob3dzIHRoYXQgcG93ZXIgaW5jcmVhc2VzIGFzIHRoZSBzYW1wbGUgc2l6ZSBpbmNyZWFzZXMuIEF0IHNtYWxsZXIgc2FtcGxlIHNpemVzLCB0aGUgcG93ZXIgaXMgcHJldHR5IGxvdywgYnV0IGl0IGdldHMgY2xvc2VyIHRvIDAuODAgYXMgbiBnZXRzIGJpZ2dlci4gVGhpcyBtYWtlcyBzZW5zZSBoZXJlIGJlY2F1c2UgaXQga2VlcHMgdGhlIHNhbWUgZWZmZWN0IHNpemUsIHN0YW5kYXJkIGRldmlhdGlvbiwgYW5kIHNpZ25pZmljYW5jZSBsZXZlbCBmcm9tIHBhcnQgKGIpLCBhbmQgb25seSBjaGFuZ2VzIG4gdG8gc2VlIGhvdyB0aGUgcG93ZXIgY2hhbmdlcy4gTG9va2luZyBhdCB0aGUgY3VydmUsIGl0IGlzIGNsZWFyIHRoYXQgd2UgbmVlZCBhIG11Y2ggbGFyZ2VyIHNhbXBsZSB0byByZWFjaCB0aGUgZGVzaXJlZCBwb3dlciBvZiAwLjgwLCB3aGljaCBtYXRjaGVzIHdoYXQgd2UgZm91bmQgaW4gcGFydCAoYykuDQoNCjxmb250IGNvbG9yID0gInJlZCI+KipOb3RlKio6IEZvciBlYWNoIG9mIHRoZSBxdWVzdGlvbnMgYWJvdmUsIHdyaXRlIGEgc2hvcnQgc3VtbWFyeSBvZiB3aGF0IHlvdSBvYnNlcnZlZCwganVzdGlmeSB3aHkgeW91ciBhbmFseXNpcyBpcyB2YWxpZCwgYW5kIGludGVycHJldCB0aGUgcmVzdWx0cy48L2ZvbnQ+DQoNCg==