1 Introduction

For this assignment, we will be using various statistical methods to compare two drugs and their effects on Low-Density Lipoprotein (LDL): the current standard drug, which lowers LDL by 25 mg/dL with a standard deviation of 15 mg/dL, and a drug a pharmeceutical company develops called “CholestFix,” which a 3 month clinical trial of 5 participants determined that this drug lowers LDL by 29 mg/dL on average. We will assume that this drug also has a standard deviation of 15 mg/dL, and that both LDL changes follow a normal distribution.

2 Part A

Based on the results of the clinical trial, researchers believe that CholestFix is the more effective drug. For this part, we will formally test that hypothesis with a z-test. The reason we use a z-test is because our data follows a normal distribution and our “population” (the standard drug effect) standard deviation is known. The z-test will be conducted at significance level \(\alpha\) = 0.05.

The null hypothesis, \(H_0\), is that the mean LDL decrease from the two drugs is equal. In other words, there is no difference in the two drugs’ effects. the alternative hypothesis, \(H_a\), is that there is a difference in the two drugs effects, and that CholestFix is the more effective drug. In other words, the average LDL decrease from CholestFix is greater than the LDL decrease from the standard drug. To put into symbols, we have:

\[H_0:\mu_C = \mu_S\] \[H_a: \mu_C \gt \mu_S\]

Another way we can write the hypotheses:

\[H_0: \mu_C - \mu_S = 0\] \[H_a: \mu_C - \mu_S \gt 0\]

Since we have a directional hypothesis and our test uses the normal distribution, our test will be a one-tailed test using the right tail. The test statistic formula will be:

\[z = \frac{\bar{x} - \mu_0}{\sigma / \sqrt{n}}\]

Our test is as follows:

## Perform Z-Test
mu_c <- 29 # mean of CholestFix
mu_s <- 25 # mean of standard drug 
sd <- 15 # standard deviation of both drugs
n <- 5 # number of participants in clinical trial


z <- (mu_c - mu_s)/(sd/sqrt(n))

pval <- 1 - pnorm(z) # Probability in right tail

test <- c(z, pval) # Z score and p-value
test
[1] 0.5962848 0.2754925

The z score for the test is 0.5962 and our p-value is 0.2755. Since our p-value is greater than 0.05, we will fail to reject our null hypothesis, and we can conclude that there is not enough evidence to suggest that there is a difference between the effectiveness of the standard drug and the effectiveness of CholestFix, and we can attribute our results to randomness.

3 Part B

For this part, we are interested in calculating the probability of a true improvement given some new numbers. We are now interested in seeing if we can get a true improvement given a new sample size of 50 and an effect size of \(\delta\) = 4 mg/dL. We are assuming no changes to either drug for this part.

It looks like we’re interested in calculating the post-hoc power of the test. To do so, we will need several things: first is the noncentrality parameter, \(\lambda\). The non-centrality parameter is: \[\lambda = \frac{\mu - \mu_0}{\sigma / \sqrt{n}}\] which equals: \[\lambda = \frac{\delta}{\sigma / \sqrt{n}}\]

Pluggin in what we want, we get:

\[\lambda = \frac{4}{15 / \sqrt{50}}\] which gives us \[\lambda = 1.8856 \ldots\].

delta <- 4 # Effect Size
sd <- 15 # Standard Deviation
n <- 50 # New Sample Size

lambda <- delta/(sd/sqrt(n))
lambda
[1] 1.885618

Then we need our critical value corresponding to the significance level:

crit.alpha <- qnorm(0.95, 0, 1) # Crit Value of 95% of Normal Distribution
crit.alpha
[1] 1.644854

Now we can use the formula to find the power of the test:

## Calculating Power for Effect Size of 4 mg/dL

# Power calculation
power <- 1 - pnorm(crit.alpha - lambda)
power
[1] 0.5951312

The probability that we detect a true improvement, or the power of our test, is 0.5951. This means that we can correctly reject the null hypothesis when the mean is 29 mg/dL about 59.51% of the time.

4 Part C

For this part, we are interested in calculating the a-priori minimum sample size to detect an effect size of \(\delta\) = 4 mg/dL, with power of 0.8 and significance level of 0.05.

The formula for estimating minimal sample size is \[n \approx \left( \frac{(z_{1-\alpha} + z_{1-\beta}) \cdot \sigma}{\delta} \right)^2\]

We already have our z score for 1 - \(\alpha\), which is 1.645. Now we must get our z score corresponding to 1-\(\beta\):

beta <- 0.2 # 1 - 0.8

crit.beta <- qnorm(1 - beta) # crit z value for 1 - Beta
crit.beta
[1] 0.8416212

Plugging in what we have now, we can estimate our necessary sample size:

## Estimating Sample Size for Certain Conditions

# Sample Size Estimate Formula
sample.size <- (((crit.alpha + crit.beta)*sd)/delta)^2 
sample.size
[1] 86.94221

Our estimated a-priori minimum sample size to achieve an effect size of 4 mg/dL with power of 0.8 and significance level 0.05 is 87.

What’s interesting is how small the original sample size and the new theoretical sample size is compared to the minimum sample size needed for to get the power we desire. If we use the original sample size of 5, the power is only 0.1472. It seems that increasing sample size increases the power.

4.1 Part D

For this part, we will examine how power changes as our sample size changes. To do this, we will create a function that uses different values of the sample size and calculates the corresponding power. We will then plot those values and see what happens. We will use the same standard deviation, significance level, and effect size from before.

## Check Various Sample Sizes and Power

sd <- 15
delta <- 4
alpha = 0.05

# Crit Value: Same as Before
crit.alpha <- qnorm(1- alpha)

# Sequence of Sample Sizes
samp.sizes <- seq(5, 200, by = 5)

# Function to Compute Power
val.power <- sapply(samp.sizes, function(n) {
  lambda <- delta/(sd / sqrt(n))  # non-centrality parameter
  1 - pnorm(crit.alpha - lambda) # calculating power
})

# Plot Power vs Sample Size
plot(samp.sizes, val.power, type = "l", ylim = c(0,1), main = "Plot of Power vs Sample Size for Effect Size of 4 mg/dL", xlab = "Sample Size", ylab = "Power")

# Plot Reference Line for Power = 0.8
abline(h = 0.8, lty = 2)

We can see that we have a somewhat steady increase in power until about 150 or so, when the increase starts to level off. We can also see that our sample size calculation from part C holds up, as the graph crosses the 0.8 mark when the sample size is around at around 85-87.

LS0tDQp0aXRsZTogIlNUQSA1MDYgQXNzaWdubWVudCA5OiBGdW5kYW1lbnRhbHMgb2YgSHlwb3RoZXNpcyBUZXN0aW5nIGFuZCBQb3dlciBBbmFseXNpcyINCmF1dGhvcjogIklhbiBWYW5XcmlnaHQiDQpkYXRlOiAiMDQvMDcvMjAyNiINCm91dHB1dDoNCiAgaHRtbF9kb2N1bWVudDogDQogICAgdG9jOiB5ZXMNCiAgICB0b2NfZGVwdGg6IDQNCiAgICB0b2NfZmxvYXQ6IHllcw0KICAgIG51bWJlcl9zZWN0aW9uczogeWVzDQogICAgdG9jX2NvbGxhcHNlZDogeWVzDQogICAgY29kZV9mb2xkaW5nOiBzaG93DQogICAgY29kZV9kb3dubG9hZDogeWVzDQogICAgc21vb3RoX3Njcm9sbDogeWVzDQogICAgdGhlbWU6IGx1bWVuDQogIHBkZl9kb2N1bWVudDogDQogICAgdG9jOiB5ZXMNCiAgICB0b2NfZGVwdGg6IDQNCiAgICBmaWdfY2FwdGlvbjogeWVzDQogICAgbnVtYmVyX3NlY3Rpb25zOiB5ZXMNCiAgICBmaWdfd2lkdGg6IDMNCiAgICBmaWdfaGVpZ2h0OiAzDQogIHdvcmRfZG9jdW1lbnQ6IA0KICAgIHRvYzogeWVzDQogICAgdG9jX2RlcHRoOiA0DQogICAgZmlnX2NhcHRpb246IHllcw0KICAgIGtlZXBfbWQ6IHllcw0KZWRpdG9yX29wdGlvbnM6IA0KICBjaHVua19vdXRwdXRfdHlwZTogaW5saW5lDQotLS0NCg0KYGBge2NzcywgZWNobyA9IEZBTFNFfQ0KI1RPQzo6YmVmb3JlIHsNCiAgY29udGVudDogIlRhYmxlIG9mIENvbnRlbnRzIjsNCiAgZm9udC13ZWlnaHQ6IGJvbGQ7DQogIGZvbnQtc2l6ZTogMS4yZW07DQogIGRpc3BsYXk6IGJsb2NrOw0KICBjb2xvcjogbmF2eTsNCiAgbWFyZ2luLWJvdHRvbTogMTBweDsNCn0NCg0KDQpkaXYjVE9DIGxpIHsgICAgIC8qIHRhYmxlIG9mIGNvbnRlbnQgICovDQogICAgbGlzdC1zdHlsZTp1cHBlci1yb21hbjsNCiAgICBiYWNrZ3JvdW5kLWltYWdlOm5vbmU7DQogICAgYmFja2dyb3VuZC1yZXBlYXQ6bm9uZTsNCiAgICBiYWNrZ3JvdW5kLXBvc2l0aW9uOjA7DQp9DQoNCmgxLnRpdGxlIHsgICAgLyogbGV2ZWwgMSBoZWFkZXIgb2YgdGl0bGUgICovDQogIGZvbnQtc2l6ZTogMjJweDsNCiAgZm9udC13ZWlnaHQ6IGJvbGQ7DQogIGNvbG9yOiBEYXJrUmVkOw0KICB0ZXh0LWFsaWduOiBjZW50ZXI7DQogIGZvbnQtZmFtaWx5OiAiR2lsbCBTYW5zIiwgc2Fucy1zZXJpZjsNCn0NCg0KaDQuYXV0aG9yIHsgLyogSGVhZGVyIDQgLSBhbmQgdGhlIGF1dGhvciBhbmQgZGF0YSBoZWFkZXJzIHVzZSB0aGlzIHRvbyAgKi8NCiAgZm9udC1zaXplOiAxNXB4Ow0KICBmb250LXdlaWdodDogYm9sZDsNCiAgZm9udC1mYW1pbHk6IHN5c3RlbS11aTsNCiAgY29sb3I6IG5hdnk7DQogIHRleHQtYWxpZ246IGNlbnRlcjsNCn0NCg0KaDQuZGF0ZSB7IC8qIEhlYWRlciA0IC0gYW5kIHRoZSBhdXRob3IgYW5kIGRhdGEgaGVhZGVycyB1c2UgdGhpcyB0b28gICovDQogIGZvbnQtc2l6ZTogMThweDsNCiAgZm9udC13ZWlnaHQ6IGJvbGQ7DQogIGZvbnQtZmFtaWx5OiAiR2lsbCBTYW5zIiwgc2Fucy1zZXJpZjsNCiAgY29sb3I6IERhcmtCbHVlOw0KICB0ZXh0LWFsaWduOiBjZW50ZXI7DQp9DQoNCmgxIHsgLyogSGVhZGVyIDEgLSBhbmQgdGhlIGF1dGhvciBhbmQgZGF0YSBoZWFkZXJzIHVzZSB0aGlzIHRvbyAgKi8NCiAgICBmb250LXNpemU6IDIwcHg7DQogICAgZm9udC13ZWlnaHQ6IGJvbGQ7DQogICAgZm9udC1mYW1pbHk6ICJUaW1lcyBOZXcgUm9tYW4iLCBUaW1lcywgc2VyaWY7DQogICAgY29sb3I6IGRhcmtyZWQ7DQogICAgdGV4dC1hbGlnbjogY2VudGVyOw0KfQ0KDQpoMiB7IC8qIEhlYWRlciAyIC0gYW5kIHRoZSBhdXRob3IgYW5kIGRhdGEgaGVhZGVycyB1c2UgdGhpcyB0b28gICovDQogICAgZm9udC1zaXplOiAxOHB4Ow0KICAgIGZvbnQtd2VpZ2h0OiBib2xkOw0KICAgIGZvbnQtZmFtaWx5OiAiVGltZXMgTmV3IFJvbWFuIiwgVGltZXMsIHNlcmlmOw0KICAgIGNvbG9yOiBuYXZ5Ow0KICAgIHRleHQtYWxpZ246IGxlZnQ7DQp9DQoNCmgzIHsgLyogSGVhZGVyIDMgLSBhbmQgdGhlIGF1dGhvciBhbmQgZGF0YSBoZWFkZXJzIHVzZSB0aGlzIHRvbyAgKi8NCiAgICBmb250LXNpemU6IDE2cHg7DQogICAgZm9udC13ZWlnaHQ6IGJvbGQ7DQogICAgZm9udC1mYW1pbHk6ICJUaW1lcyBOZXcgUm9tYW4iLCBUaW1lcywgc2VyaWY7DQogICAgY29sb3I6IG5hdnk7DQogICAgdGV4dC1hbGlnbjogbGVmdDsNCn0NCg0KaDQgeyAvKiBIZWFkZXIgNCAtIGFuZCB0aGUgYXV0aG9yIGFuZCBkYXRhIGhlYWRlcnMgdXNlIHRoaXMgdG9vICAqLw0KICAgIGZvbnQtc2l6ZTogMTRweDsNCiAgZm9udC13ZWlnaHQ6IGJvbGQ7DQogICAgZm9udC1mYW1pbHk6ICJUaW1lcyBOZXcgUm9tYW4iLCBUaW1lcywgc2VyaWY7DQogICAgY29sb3I6IGRhcmtyZWQ7DQogICAgdGV4dC1hbGlnbjogbGVmdDsNCn0NCg0KLyogQWRkIGRvdHMgYWZ0ZXIgbnVtYmVyZWQgaGVhZGVycyAqLw0KLmhlYWRlci1zZWN0aW9uLW51bWJlcjo6YWZ0ZXIgew0KICBjb250ZW50OiAiLiI7DQoNCmJvZHkge2JhY2tncm91bmQtY29sb3I6ICNmZmZmZmY7DQogICAgICBjb2xvcjogIzAwMDAwMDsNCiAgICAgIGZvbnQtZmFtaWx5OiBBcmlhbCwgc2Fucy1zZXJpZjsNCiAgICAgIGZvbnQtc2l6ZTogMXJlbTsNCiAgICAgIGxpbmUtaGVpZ2h0OiAxLjY7DQogICAgICB9DQoNCi5oaWdobGlnaHRtZSB7IGJhY2tncm91bmQtY29sb3I6eWVsbG93OyB9DQoNCnAgeyBiYWNrZ3JvdW5kLWNvbG9yOndoaXRlOyB9DQoNCn0NCmBgYA0KDQpgYGB7ciBzZXR1cCwgaW5jbHVkZT1GQUxTRX0NCiMgY29kZSBjaHVuayBzcGVjaWZpZXMgd2hldGhlciB0aGUgUiBjb2RlLCB3YXJuaW5ncywgYW5kIG91dHB1dCANCiMgd2lsbCBiZSBpbmNsdWRlZCBpbiB0aGUgb3V0cHV0IGZpbGVzLg0KaWYgKCFyZXF1aXJlKCJrbml0ciIpKSB7DQogICBpbnN0YWxsLnBhY2thZ2VzKCJrbml0ciIpDQogICBsaWJyYXJ5KGtuaXRyKQ0KfQ0KaWYgKCFyZXF1aXJlKCJwYW5kZXIiKSkgew0KICAgaW5zdGFsbC5wYWNrYWdlcygicGFuZGVyIikNCiAgIGxpYnJhcnkocGFuZGVyKQ0KfQ0KaWYgKCFyZXF1aXJlKCJwc3ljaCIpKSB7DQogIGluc3RhbGwucGFja2FnZXMoInBzeWNoIikNCiAgbGlicmFyeShwc3ljaCkNCn0NCmlmICghcmVxdWlyZSgiUkNvbG9yQnJld2VyIikpIHsNCiAgaW5zdGFsbC5wYWNrYWdlcygiUkNvbG9yQnJld2VyIikNCiAgbGlicmFyeShSQ29sb3JCcmV3ZXIpDQp9DQoNCmlmICghcmVxdWlyZSgiYm9vdCIpKSB7DQogIGluc3RhbGwucGFja2FnZXMoImJvb3QiKQ0KICBsaWJyYXJ5KGJvb3QpDQp9DQppZiAoIXJlcXVpcmUoImVmZnNpemUiKSkgew0KICBpbnN0YWxsLnBhY2thZ2VzKCJlZmZzaXplIikNCiAgbGlicmFyeShlZmZzaXplKQ0KfQ0KaWYgKCFyZXF1aXJlKCJhc2JpbyIpKSB7DQogIGluc3RhbGwucGFja2FnZXMoImFzYmlvIikNCiAgbGlicmFyeShhc2JpbykNCn0NCmlmICghcmVxdWlyZSgicHdyc3MiKSkgew0KICBpbnN0YWxsLnBhY2thZ2VzKCJwd3JzcyIpDQogIGxpYnJhcnkocHdyc3MpDQp9DQogIA0KIyMgbGlicmFyeShlZmZzaXplKQ0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KGVjaG8gPSBUUlVFLCAgICAgICAjIGluY2x1ZGUgY29kZSBjaHVuayBpbiB0aGUgb3V0cHV0IGZpbGUNCiAgICAgICAgICAgICAgICAgICAgICB3YXJuaW5nID0gRkFMU0UsICAgIyBzb21ldGltZXMsIHlvdSBjb2RlIG1heSBwcm9kdWNlIHdhcm5pbmcgbWVzc2FnZXMsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgeW91IGNhbiBjaG9vc2UgdG8gaW5jbHVkZSB0aGUgd2FybmluZyBtZXNzYWdlcyBpbg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIHRoZSBvdXRwdXQgZmlsZS4gDQogICAgICAgICAgICAgICAgICAgICAgcmVzdWx0cyA9IFRSVUUsICAgICMgeW91IGNhbiBhbHNvIGRlY2lkZSB3aGV0aGVyIHRvIGluY2x1ZGUgdGhlIG91dHB1dA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGluIHRoZSBvdXRwdXQgZmlsZS4NCiAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlID0gRkFMU0UsDQogICAgICAgICAgICAgICAgICAgICAgY29tbWVudCA9IE5BDQogICAgICAgICAgICAgICAgICAgICAgKSAgDQpgYGANCg0KDQojIEludHJvZHVjdGlvbg0KRm9yIHRoaXMgYXNzaWdubWVudCwgd2Ugd2lsbCBiZSB1c2luZyB2YXJpb3VzIHN0YXRpc3RpY2FsIG1ldGhvZHMgdG8gY29tcGFyZSB0d28gZHJ1Z3MgYW5kIHRoZWlyIGVmZmVjdHMgb24gTG93LURlbnNpdHkgTGlwb3Byb3RlaW4gKExETCk6IHRoZSBjdXJyZW50IHN0YW5kYXJkIGRydWcsIHdoaWNoIGxvd2VycyBMREwgYnkgMjUgbWcvZEwgd2l0aCBhIHN0YW5kYXJkIGRldmlhdGlvbiBvZiAxNSBtZy9kTCwgYW5kIGEgZHJ1ZyBhIHBoYXJtZWNldXRpY2FsIGNvbXBhbnkgZGV2ZWxvcHMgY2FsbGVkICJDaG9sZXN0Rml4LCIgd2hpY2ggYSAzIG1vbnRoIGNsaW5pY2FsIHRyaWFsIG9mIDUgcGFydGljaXBhbnRzIGRldGVybWluZWQgdGhhdCB0aGlzIGRydWcgbG93ZXJzIExETCBieSAyOSBtZy9kTCBvbiBhdmVyYWdlLiBXZSB3aWxsIGFzc3VtZSB0aGF0IHRoaXMgZHJ1ZyBhbHNvIGhhcyBhIHN0YW5kYXJkIGRldmlhdGlvbiBvZiAxNSBtZy9kTCwgYW5kIHRoYXQgYm90aCBMREwgY2hhbmdlcyBmb2xsb3cgYSBub3JtYWwgZGlzdHJpYnV0aW9uLiANCg0KIyBQYXJ0IEENCkJhc2VkIG9uIHRoZSByZXN1bHRzIG9mIHRoZSBjbGluaWNhbCB0cmlhbCwgcmVzZWFyY2hlcnMgYmVsaWV2ZSB0aGF0IENob2xlc3RGaXggaXMgdGhlIG1vcmUgZWZmZWN0aXZlIGRydWcuIEZvciB0aGlzIHBhcnQsIHdlIHdpbGwgZm9ybWFsbHkgdGVzdCB0aGF0IGh5cG90aGVzaXMgd2l0aCBhIHotdGVzdC4gVGhlIHJlYXNvbiB3ZSB1c2UgYSB6LXRlc3QgaXMgYmVjYXVzZSBvdXIgZGF0YSBmb2xsb3dzIGEgbm9ybWFsIGRpc3RyaWJ1dGlvbiBhbmQgb3VyICJwb3B1bGF0aW9uIiAodGhlIHN0YW5kYXJkIGRydWcgZWZmZWN0KSBzdGFuZGFyZCBkZXZpYXRpb24gaXMga25vd24uIFRoZSB6LXRlc3Qgd2lsbCBiZSBjb25kdWN0ZWQgYXQgc2lnbmlmaWNhbmNlIGxldmVsICRcYWxwaGEkID0gMC4wNS4NCg0KVGhlIG51bGwgaHlwb3RoZXNpcywgJEhfMCQsIGlzIHRoYXQgdGhlIG1lYW4gTERMIGRlY3JlYXNlIGZyb20gdGhlIHR3byBkcnVncyBpcyBlcXVhbC4gSW4gb3RoZXIgd29yZHMsIHRoZXJlIGlzIG5vIGRpZmZlcmVuY2UgaW4gdGhlIHR3byBkcnVncycgZWZmZWN0cy4gdGhlIGFsdGVybmF0aXZlIGh5cG90aGVzaXMsICRIX2EkLCBpcyB0aGF0IHRoZXJlIGlzIGEgZGlmZmVyZW5jZSBpbiB0aGUgdHdvIGRydWdzIGVmZmVjdHMsIGFuZCB0aGF0IENob2xlc3RGaXggaXMgdGhlIG1vcmUgZWZmZWN0aXZlIGRydWcuIEluIG90aGVyIHdvcmRzLCB0aGUgYXZlcmFnZSBMREwgZGVjcmVhc2UgZnJvbSBDaG9sZXN0Rml4IGlzIGdyZWF0ZXIgdGhhbiB0aGUgTERMIGRlY3JlYXNlIGZyb20gdGhlIHN0YW5kYXJkIGRydWcuIFRvIHB1dCBpbnRvIHN5bWJvbHMsIHdlIGhhdmU6DQoNCiQkSF8wOlxtdV9DID0gXG11X1MkJCAkJEhfYTogXG11X0MgXGd0IFxtdV9TJCQgDQoNCkFub3RoZXIgd2F5IHdlIGNhbiB3cml0ZSB0aGUgaHlwb3RoZXNlczoNCg0KJCRIXzA6IFxtdV9DIC0gXG11X1MgPSAwJCQgJCRIX2E6IFxtdV9DIC0gXG11X1MgXGd0IDAkJA0KDQpTaW5jZSB3ZSBoYXZlIGEgZGlyZWN0aW9uYWwgaHlwb3RoZXNpcyBhbmQgb3VyIHRlc3QgdXNlcyB0aGUgbm9ybWFsIGRpc3RyaWJ1dGlvbiwgb3VyIHRlc3Qgd2lsbCBiZSBhIG9uZS10YWlsZWQgdGVzdCB1c2luZyB0aGUgcmlnaHQgdGFpbC4gVGhlIHRlc3Qgc3RhdGlzdGljIGZvcm11bGEgd2lsbCBiZToNCg0KJCR6ID0gXGZyYWN7XGJhcnt4fSAtIFxtdV8wfXtcc2lnbWEgLyBcc3FydHtufX0kJA0KDQpPdXIgdGVzdCBpcyBhcyBmb2xsb3dzOg0KYGBge3J9DQojIyBQZXJmb3JtIFotVGVzdA0KbXVfYyA8LSAyOSAjIG1lYW4gb2YgQ2hvbGVzdEZpeA0KbXVfcyA8LSAyNSAjIG1lYW4gb2Ygc3RhbmRhcmQgZHJ1ZyANCnNkIDwtIDE1ICMgc3RhbmRhcmQgZGV2aWF0aW9uIG9mIGJvdGggZHJ1Z3MNCm4gPC0gNSAjIG51bWJlciBvZiBwYXJ0aWNpcGFudHMgaW4gY2xpbmljYWwgdHJpYWwNCg0KDQp6IDwtIChtdV9jIC0gbXVfcykvKHNkL3NxcnQobikpDQoNCnB2YWwgPC0gMSAtIHBub3JtKHopICMgUHJvYmFiaWxpdHkgaW4gcmlnaHQgdGFpbA0KDQp0ZXN0IDwtIGMoeiwgcHZhbCkgIyBaIHNjb3JlIGFuZCBwLXZhbHVlDQp0ZXN0DQpgYGANClRoZSB6IHNjb3JlIGZvciB0aGUgdGVzdCBpcyAwLjU5NjIgYW5kIG91ciBwLXZhbHVlIGlzIDAuMjc1NS4gU2luY2Ugb3VyIHAtdmFsdWUgaXMgZ3JlYXRlciB0aGFuIDAuMDUsIHdlIHdpbGwgZmFpbCB0byByZWplY3Qgb3VyIG51bGwgaHlwb3RoZXNpcywgYW5kIHdlIGNhbiBjb25jbHVkZSB0aGF0IHRoZXJlIGlzIG5vdCBlbm91Z2ggZXZpZGVuY2UgdG8gc3VnZ2VzdCB0aGF0IHRoZXJlIGlzIGEgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSBlZmZlY3RpdmVuZXNzIG9mIHRoZSBzdGFuZGFyZCBkcnVnIGFuZCB0aGUgZWZmZWN0aXZlbmVzcyBvZiBDaG9sZXN0Rml4LCBhbmQgd2UgY2FuIGF0dHJpYnV0ZSBvdXIgcmVzdWx0cyB0byByYW5kb21uZXNzLg0KDQojIFBhcnQgQg0KRm9yIHRoaXMgcGFydCwgd2UgYXJlIGludGVyZXN0ZWQgaW4gY2FsY3VsYXRpbmcgdGhlIHByb2JhYmlsaXR5IG9mIGEgdHJ1ZSBpbXByb3ZlbWVudCBnaXZlbiBzb21lIG5ldyBudW1iZXJzLiBXZSBhcmUgbm93IGludGVyZXN0ZWQgaW4gc2VlaW5nIGlmIHdlIGNhbiBnZXQgYSB0cnVlIGltcHJvdmVtZW50IGdpdmVuIGEgbmV3IHNhbXBsZSBzaXplIG9mIDUwIGFuZCBhbiBlZmZlY3Qgc2l6ZSBvZiAkXGRlbHRhJCA9IDQgbWcvZEwuIFdlIGFyZSBhc3N1bWluZyBubyBjaGFuZ2VzIHRvIGVpdGhlciBkcnVnIGZvciB0aGlzIHBhcnQuDQoNCkl0IGxvb2tzIGxpa2Ugd2UncmUgaW50ZXJlc3RlZCBpbiBjYWxjdWxhdGluZyB0aGUgcG9zdC1ob2MgcG93ZXIgb2YgdGhlIHRlc3QuIFRvIGRvIHNvLCB3ZSB3aWxsIG5lZWQgc2V2ZXJhbCB0aGluZ3M6IGZpcnN0IGlzIHRoZSBub25jZW50cmFsaXR5IHBhcmFtZXRlciwgJFxsYW1iZGEkLiBUaGUgbm9uLWNlbnRyYWxpdHkgcGFyYW1ldGVyIGlzOiAkJFxsYW1iZGEgPSBcZnJhY3tcbXUgLSBcbXVfMH17XHNpZ21hIC8gXHNxcnR7bn19JCQgd2hpY2ggZXF1YWxzOiAkJFxsYW1iZGEgPSBcZnJhY3tcZGVsdGF9e1xzaWdtYSAvIFxzcXJ0e259fSQkDQoNClBsdWdnaW4gaW4gd2hhdCB3ZSB3YW50LCB3ZSBnZXQ6DQoNCiQkXGxhbWJkYSA9IFxmcmFjezR9ezE1IC8gXHNxcnR7NTB9fSQkIHdoaWNoIGdpdmVzIHVzICQkXGxhbWJkYSA9IDEuODg1NiBcbGRvdHMkJC4NCmBgYHtyfQ0KZGVsdGEgPC0gNCAjIEVmZmVjdCBTaXplDQpzZCA8LSAxNSAjIFN0YW5kYXJkIERldmlhdGlvbg0KbiA8LSA1MCAjIE5ldyBTYW1wbGUgU2l6ZQ0KDQpsYW1iZGEgPC0gZGVsdGEvKHNkL3NxcnQobikpDQpsYW1iZGENCmBgYA0KDQpUaGVuIHdlIG5lZWQgb3VyIGNyaXRpY2FsIHZhbHVlIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHNpZ25pZmljYW5jZSBsZXZlbDoNCg0KYGBge3J9DQpjcml0LmFscGhhIDwtIHFub3JtKDAuOTUsIDAsIDEpICMgQ3JpdCBWYWx1ZSBvZiA5NSUgb2YgTm9ybWFsIERpc3RyaWJ1dGlvbg0KY3JpdC5hbHBoYQ0KYGBgDQpOb3cgd2UgY2FuIHVzZSB0aGUgZm9ybXVsYSB0byBmaW5kIHRoZSBwb3dlciBvZiB0aGUgdGVzdDoNCmBgYHtyfQ0KIyMgQ2FsY3VsYXRpbmcgUG93ZXIgZm9yIEVmZmVjdCBTaXplIG9mIDQgbWcvZEwNCg0KIyBQb3dlciBjYWxjdWxhdGlvbg0KcG93ZXIgPC0gMSAtIHBub3JtKGNyaXQuYWxwaGEgLSBsYW1iZGEpDQpwb3dlcg0KYGBgDQpUaGUgcHJvYmFiaWxpdHkgdGhhdCB3ZSBkZXRlY3QgYSB0cnVlIGltcHJvdmVtZW50LCBvciB0aGUgcG93ZXIgb2Ygb3VyIHRlc3QsIGlzIDAuNTk1MS4gVGhpcyBtZWFucyB0aGF0IHdlIGNhbiBjb3JyZWN0bHkgcmVqZWN0IHRoZSBudWxsIGh5cG90aGVzaXMgd2hlbiB0aGUgbWVhbiBpcyAyOSBtZy9kTCBhYm91dCA1OS41MSUgb2YgdGhlIHRpbWUuDQoNCiMgUGFydCBDDQpGb3IgdGhpcyBwYXJ0LCB3ZSBhcmUgaW50ZXJlc3RlZCBpbiBjYWxjdWxhdGluZyB0aGUgYS1wcmlvcmkgbWluaW11bSBzYW1wbGUgc2l6ZSB0byBkZXRlY3QgYW4gZWZmZWN0IHNpemUgb2YgJFxkZWx0YSQgPSA0IG1nL2RMLCB3aXRoIHBvd2VyIG9mIDAuOCBhbmQgc2lnbmlmaWNhbmNlIGxldmVsIG9mIDAuMDUuIA0KDQpUaGUgZm9ybXVsYSBmb3IgZXN0aW1hdGluZyBtaW5pbWFsIHNhbXBsZSBzaXplIGlzDQokJG4gXGFwcHJveCBcbGVmdCggXGZyYWN7KHpfezEtXGFscGhhfSArIHpfezEtXGJldGF9KSBcY2RvdCBcc2lnbWF9e1xkZWx0YX0gXHJpZ2h0KV4yJCQNCg0KV2UgYWxyZWFkeSBoYXZlIG91ciB6IHNjb3JlIGZvciAxIC0gJFxhbHBoYSQsIHdoaWNoIGlzIDEuNjQ1LiBOb3cgd2UgbXVzdCBnZXQgb3VyIHogc2NvcmUgY29ycmVzcG9uZGluZyB0byAxLSRcYmV0YSQ6DQpgYGB7cn0NCmJldGEgPC0gMC4yICMgMSAtIDAuOA0KDQpjcml0LmJldGEgPC0gcW5vcm0oMSAtIGJldGEpICMgY3JpdCB6IHZhbHVlIGZvciAxIC0gQmV0YQ0KY3JpdC5iZXRhDQpgYGANCg0KUGx1Z2dpbmcgaW4gd2hhdCB3ZSBoYXZlIG5vdywgd2UgY2FuIGVzdGltYXRlIG91ciBuZWNlc3Nhcnkgc2FtcGxlIHNpemU6DQpgYGB7cn0NCiMjIEVzdGltYXRpbmcgU2FtcGxlIFNpemUgZm9yIENlcnRhaW4gQ29uZGl0aW9ucw0KDQojIFNhbXBsZSBTaXplIEVzdGltYXRlIEZvcm11bGENCnNhbXBsZS5zaXplIDwtICgoKGNyaXQuYWxwaGEgKyBjcml0LmJldGEpKnNkKS9kZWx0YSleMiANCnNhbXBsZS5zaXplDQpgYGANCg0KT3VyIGVzdGltYXRlZCBhLXByaW9yaSBtaW5pbXVtIHNhbXBsZSBzaXplIHRvIGFjaGlldmUgYW4gZWZmZWN0IHNpemUgb2YgNCBtZy9kTCB3aXRoIHBvd2VyIG9mIDAuOCBhbmQgc2lnbmlmaWNhbmNlIGxldmVsIDAuMDUgaXMgODcuDQoNCldoYXQncyBpbnRlcmVzdGluZyBpcyBob3cgc21hbGwgdGhlIG9yaWdpbmFsIHNhbXBsZSBzaXplIGFuZCB0aGUgbmV3IHRoZW9yZXRpY2FsIHNhbXBsZSBzaXplIGlzIGNvbXBhcmVkIHRvIHRoZSBtaW5pbXVtIHNhbXBsZSBzaXplIG5lZWRlZCBmb3IgdG8gZ2V0IHRoZSBwb3dlciB3ZSBkZXNpcmUuIElmIHdlIHVzZSB0aGUgb3JpZ2luYWwgc2FtcGxlIHNpemUgb2YgNSwgdGhlIHBvd2VyIGlzIG9ubHkgMC4xNDcyLiBJdCBzZWVtcyB0aGF0IGluY3JlYXNpbmcgc2FtcGxlIHNpemUgaW5jcmVhc2VzIHRoZSBwb3dlci4NCg0KDQojIyBQYXJ0IEQNCkZvciB0aGlzIHBhcnQsIHdlIHdpbGwgZXhhbWluZSBob3cgcG93ZXIgY2hhbmdlcyBhcyBvdXIgc2FtcGxlIHNpemUgY2hhbmdlcy4gVG8gZG8gdGhpcywgd2Ugd2lsbCBjcmVhdGUgYSBmdW5jdGlvbiB0aGF0IHVzZXMgZGlmZmVyZW50IHZhbHVlcyBvZiB0aGUgc2FtcGxlIHNpemUgYW5kIGNhbGN1bGF0ZXMgdGhlIGNvcnJlc3BvbmRpbmcgcG93ZXIuIFdlIHdpbGwgdGhlbiBwbG90IHRob3NlIHZhbHVlcyBhbmQgc2VlIHdoYXQgaGFwcGVucy4gV2Ugd2lsbCB1c2UgdGhlIHNhbWUgc3RhbmRhcmQgZGV2aWF0aW9uLCBzaWduaWZpY2FuY2UgbGV2ZWwsIGFuZCBlZmZlY3Qgc2l6ZSBmcm9tIGJlZm9yZS4NCg0KYGBge3J9IA0KIyMgQ2hlY2sgVmFyaW91cyBTYW1wbGUgU2l6ZXMgYW5kIFBvd2VyDQoNCnNkIDwtIDE1DQpkZWx0YSA8LSA0DQphbHBoYSA9IDAuMDUNCg0KIyBDcml0IFZhbHVlOiBTYW1lIGFzIEJlZm9yZQ0KY3JpdC5hbHBoYSA8LSBxbm9ybSgxLSBhbHBoYSkNCg0KIyBTZXF1ZW5jZSBvZiBTYW1wbGUgU2l6ZXMNCnNhbXAuc2l6ZXMgPC0gc2VxKDUsIDIwMCwgYnkgPSA1KQ0KDQojIEZ1bmN0aW9uIHRvIENvbXB1dGUgUG93ZXINCnZhbC5wb3dlciA8LSBzYXBwbHkoc2FtcC5zaXplcywgZnVuY3Rpb24obikgew0KICBsYW1iZGEgPC0gZGVsdGEvKHNkIC8gc3FydChuKSkgICMgbm9uLWNlbnRyYWxpdHkgcGFyYW1ldGVyDQogIDEgLSBwbm9ybShjcml0LmFscGhhIC0gbGFtYmRhKSAjIGNhbGN1bGF0aW5nIHBvd2VyDQp9KQ0KDQojIFBsb3QgUG93ZXIgdnMgU2FtcGxlIFNpemUNCnBsb3Qoc2FtcC5zaXplcywgdmFsLnBvd2VyLCB0eXBlID0gImwiLCB5bGltID0gYygwLDEpLCBtYWluID0gIlBsb3Qgb2YgUG93ZXIgdnMgU2FtcGxlIFNpemUgZm9yIEVmZmVjdCBTaXplIG9mIDQgbWcvZEwiLCB4bGFiID0gIlNhbXBsZSBTaXplIiwgeWxhYiA9ICJQb3dlciIpDQoNCiMgUGxvdCBSZWZlcmVuY2UgTGluZSBmb3IgUG93ZXIgPSAwLjgNCmFibGluZShoID0gMC44LCBsdHkgPSAyKQ0KYGBgDQoNCldlIGNhbiBzZWUgdGhhdCB3ZSBoYXZlIGEgc29tZXdoYXQgc3RlYWR5IGluY3JlYXNlIGluIHBvd2VyIHVudGlsIGFib3V0IDE1MCBvciBzbywgd2hlbiB0aGUgaW5jcmVhc2Ugc3RhcnRzIHRvIGxldmVsIG9mZi4gV2UgY2FuIGFsc28gc2VlIHRoYXQgb3VyIHNhbXBsZSBzaXplIGNhbGN1bGF0aW9uIGZyb20gcGFydCBDIGhvbGRzIHVwLCBhcyB0aGUgZ3JhcGggY3Jvc3NlcyB0aGUgMC44IG1hcmsgd2hlbiB0aGUgc2FtcGxlIHNpemUgaXMgYXJvdW5kIGF0IGFyb3VuZCA4NS04Ny4NCg==