1. Let’s say a random varible \(X\) follows a normal distribution of \(N(0, 1)\).

(a) Draw 5 samples of \(X\) and use \(\bar{x}\) to infer the true population mean using a confidence interval estimate with confidence level of 95%. Do a simulation of 10,000 times and find the probability of the estimated interval actually contains \(\mu = 0\).

# CI for normal mean
ci_mean <- function(x, conf = 0.95) {
  n <- length(x)
  m <- mean(x)
  s <- sd(x)
  error <- qt(1 - (1 - conf)/2, df = n - 1) * s / sqrt(n)
  c(lower = m - error, upper = m + error)
}

n_sim <- 10000
n_samp <- 5
mu <- 0

ci_contains_mu <- replicate(n_sim, {
  x <- rnorm(n_samp, mean = mu, sd = 1)
  ci <- ci_mean(x, conf = 0.95)
  mu >= ci[1] && mu <= ci[2]
})
prob_ci_contains_mu <- mean(ci_contains_mu)
cat("Probability CI contains mu:", prob_ci_contains_mu, "\n")
Probability CI contains mu: 0.9516 

(b) Do a hypothesis test for \(X\) with \(H_0: \mu = 0\) and \(H_a: \mu \neq 0\) with 10,000 simulations and \(\alpha = 0.05\). Find the probability of rejecting \(H_0\) by comparing the p-value and \(\alpha\).

reject_H0_twosided <- replicate(n_sim, {
  x <- rnorm(n_samp, mean = mu, sd = 1)
  t.test(x, mu = mu, alternative = "two.sided")$p.value < 0.05
})
prob_reject_H0_twosided <- mean(reject_H0_twosided)
cat("Probability of rejecting H0 (two-sided):", prob_reject_H0_twosided, "\n")
Probability of rejecting H0 (two-sided): 0.0509 

(c) Redo (b) with \(H_a: \mu > 0\).

reject_H0_greater <- replicate(n_sim, {
  x <- rnorm(n_samp, mean = mu, sd = 1)
  t.test(x, mu = mu, alternative = "greater")$p.value < 0.05
})
prob_reject_H0_greater <- mean(reject_H0_greater)
cat("Probability of rejecting H0 (greater):", prob_reject_H0_greater, "\n")
Probability of rejecting H0 (greater): 0.0494 

(d) Increase the number of samples to 100 and repeat (a)-(c).

n_samp_large <- 100

ci_contains_mu_large <- replicate(n_sim, {
  x <- rnorm(n_samp_large, mean = mu, sd = 1)
  ci <- ci_mean(x, conf = 0.95)
  mu >= ci[1] && mu <= ci[2]
})

prob_ci_contains_mu_large <- mean(ci_contains_mu_large)
cat("Probability CI contains mu (n=100):", prob_ci_contains_mu_large, "\n")
Probability CI contains mu (n=100): 0.952 
reject_H0_twosided_large <- replicate(n_sim, {
  x <- rnorm(n_samp_large, mean = mu, sd = 1)
  t.test(x, mu = mu, alternative = "two.sided")$p.value < 0.05
})
prob_reject_H0_twosided_large <- mean(reject_H0_twosided_large)
cat("Probability of rejecting H0 (two-sided, n=100):", prob_reject_H0_twosided_large, "\n")
Probability of rejecting H0 (two-sided, n=100): 0.0532 
reject_H0_greater_large <- replicate(n_sim, {
  x <- rnorm(n_samp_large, mean = mu, sd = 1)
  t.test(x, mu = mu, alternative = "greater")$p.value < 0.05
})
prob_reject_H0_greater_large <- mean(reject_H0_greater_large)
cat("Probability of rejecting H0 (greater, n=100):", prob_reject_H0_greater_large, "\n")
Probability of rejecting H0 (greater, n=100): 0.0489 

(e) How does this experiment verify the theory that we learn? Summarize your findings properly.

Answer: - For a 95% confidence interval, the empirical coverage is close to 0.95, confirming the theoretical expectation. - The probability of rejecting \(H_0\) is approximately 0.05, matching the significance level (\(\alpha = 0.05\)). - Increasing the sample size improves the accuracy of the confidence interval coverage, as predicted by the Central Limit Theorem.

2. Repeat all steps in problem 1 with \(X\) follows a uniform distribution \(\text{Unif}(0,1)\). How does the distribution of \(X\) affect the results?

# For Unif(0,1), true mean is 0.5
mu_unif <- 0.5

ci_contains_mu_unif <- replicate(n_sim, {
  x <- runif(n_samp, min = 0, max = 1)
  ci <- ci_mean(x, conf = 0.95)
  mu_unif >= ci[1] && mu_unif <= ci[2]
})
prob_ci_contains_mu_unif <- mean(ci_contains_mu_unif)
cat("Uniform: Probability CI contains mu:", prob_ci_contains_mu_unif, "\n")
Uniform: Probability CI contains mu: 0.9347 
reject_H0_twosided_unif <- replicate(n_sim, {
  x <- runif(n_samp, min = 0, max = 1)
  t.test(x, mu = mu_unif, alternative = "two.sided")$p.value < 0.05
})
prob_reject_H0_twosided_unif <- mean(reject_H0_twosided_unif)
cat("Uniform: Probability of rejecting H0 (two-sided):", prob_reject_H0_twosided_unif, "\n")
Uniform: Probability of rejecting H0 (two-sided): 0.0672 
reject_H0_greater_unif <- replicate(n_sim, {
  x <- runif(n_samp, min = 0, max = 1)
  t.test(x, mu = mu_unif, alternative = "greater")$p.value < 0.05
})
prob_reject_H0_greater_unif <- mean(reject_H0_greater_unif)
cat("Uniform: Probability of rejecting H0 (greater):", prob_reject_H0_greater_unif, "\n")
Uniform: Probability of rejecting H0 (greater): 0.0535 

Conclusion: The distribution of \(X\) affects the accuracy of statistical inference procedures. When \(X\) is normal, coverage and error rates match theoretical expectations. When \(X\) is non-normal, these procedures may be less reliable, especially with moderate sample sizes.

3. Now let’s simulate with \(X\) following a normal distribution of \(N(1,4)\) (variance of 4 and standard devivation of 2).

(a) With a sample size of 10, do a hypothesis test for \(X\) with \(H_0: \mu = 0\) and \(H_a: \mu > 0\) with 10,000 simulations and \(\alpha = 0.05\). Find the \(\beta\) from your simulation. What is the estimated power of the test?

mu_alt <- 1
sd_alt <- 2
n_samp_alt <- 10

reject_H0_alt <- replicate(n_sim, {
  x <- rnorm(n_samp_alt, mean = mu_alt, sd = sd_alt)
  t.test(x, mu = 0, alternative = "greater")$p.value < 0.05
})
power_est <- mean(reject_H0_alt)
beta_est <- 1 - power_est
cat("Power (n=10, alpha=0.05):", power_est, "Beta:", beta_est, "\n")
Power (n=10, alpha=0.05): 0.4263 Beta: 0.5737 

(b) Change \(\alpha\) to 0.01 in (a) and find \(\beta\) and the power of test again.

reject_H0_alt_01 <- replicate(n_sim, {
  x <- rnorm(n_samp_alt, mean = mu_alt, sd = sd_alt)
  t.test(x, mu = 0, alternative = "greater")$p.value < 0.01
})
power_est_01 <- mean(reject_H0_alt_01)
beta_est_01 <- 1 - power_est_01
cat("Power (n=10, alpha=0.01):", power_est_01, "Beta:", beta_est_01, "\n")
Power (n=10, alpha=0.01): 0.1618 Beta: 0.8382 

(c) Change the sample size to 1000 and redo (a) and (b) again.

n_samp_alt_large <- 1000

reject_H0_alt_large <- replicate(n_sim, {
  x <- rnorm(n_samp_alt_large, mean = mu_alt, sd = sd_alt)
  t.test(x, mu = 0, alternative = "greater")$p.value < 0.05
})
power_est_large <- mean(reject_H0_alt_large)
beta_est_large <- 1 - power_est_large
cat("Power (n=1000, alpha=0.05):", power_est_large, "Beta:", beta_est_large, "\n")
Power (n=1000, alpha=0.05): 1 Beta: 0 
reject_H0_alt_large_01 <- replicate(n_sim, {
  x <- rnorm(n_samp_alt_large, mean = mu_alt, sd = sd_alt)
  t.test(x, mu = 0, alternative = "greater")$p.value < 0.01
})
power_est_large_01 <- mean(reject_H0_alt_large_01)
beta_est_large_01 <- 1 - power_est_large_01
cat("Power (n=1000, alpha=0.01):", power_est_large_01, "Beta:", beta_est_large_01, "\n")
Power (n=1000, alpha=0.01): 1 Beta: 0 

(d) How does this experiment verify the theory that we learn? Summarize your findings properly.

Power increases with larger samples and higher significance levels, while Type II error decreases under the same conditions. This demonstrates the importance of adequate sample size and appropriate choice of \(\alpha\) in hypothesis testing.

LS0tCnRpdGxlOiAiTGFiIEhvbWV3b3JrIDUgLSBDb25maWRlbmNlIEludGVydmFsIGFuZCBIeXBvdGhlc2lzIFRlc3RzIgpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sKLS0tCgojIyMjIDEuIExldCdzIHNheSBhIHJhbmRvbSB2YXJpYmxlICRYJCBmb2xsb3dzIGEgbm9ybWFsIGRpc3RyaWJ1dGlvbiBvZiAkTigwLCAxKSQuCgojIyMjIChhKSBEcmF3IDUgc2FtcGxlcyBvZiAkWCQgYW5kIHVzZSAkXGJhcnt4fSQgdG8gaW5mZXIgdGhlIHRydWUgcG9wdWxhdGlvbiBtZWFuIHVzaW5nIGEgY29uZmlkZW5jZSBpbnRlcnZhbCBlc3RpbWF0ZSB3aXRoIGNvbmZpZGVuY2UgbGV2ZWwgb2YgOTVcJS4gRG8gYSBzaW11bGF0aW9uIG9mIDEwLDAwMCB0aW1lcyBhbmQgZmluZCB0aGUgcHJvYmFiaWxpdHkgb2YgdGhlIGVzdGltYXRlZCBpbnRlcnZhbCBhY3R1YWxseSBjb250YWlucyAkXG11ID0gMCQuCgpgYGB7cn0KIyBDSSBmb3Igbm9ybWFsIG1lYW4KY2lfbWVhbiA8LSBmdW5jdGlvbih4LCBjb25mID0gMC45NSkgewogIG4gPC0gbGVuZ3RoKHgpCiAgbSA8LSBtZWFuKHgpCiAgcyA8LSBzZCh4KQogIGVycm9yIDwtIHF0KDEgLSAoMSAtIGNvbmYpLzIsIGRmID0gbiAtIDEpICogcyAvIHNxcnQobikKICBjKGxvd2VyID0gbSAtIGVycm9yLCB1cHBlciA9IG0gKyBlcnJvcikKfQoKbl9zaW0gPC0gMTAwMDAKbl9zYW1wIDwtIDUKbXUgPC0gMAoKY2lfY29udGFpbnNfbXUgPC0gcmVwbGljYXRlKG5fc2ltLCB7CiAgeCA8LSBybm9ybShuX3NhbXAsIG1lYW4gPSBtdSwgc2QgPSAxKQogIGNpIDwtIGNpX21lYW4oeCwgY29uZiA9IDAuOTUpCiAgbXUgPj0gY2lbMV0gJiYgbXUgPD0gY2lbMl0KfSkKcHJvYl9jaV9jb250YWluc19tdSA8LSBtZWFuKGNpX2NvbnRhaW5zX211KQpjYXQoIlByb2JhYmlsaXR5IENJIGNvbnRhaW5zIG11OiIsIHByb2JfY2lfY29udGFpbnNfbXUsICJcbiIpCmBgYAoKIyMjIyAoYikgRG8gYSBoeXBvdGhlc2lzIHRlc3QgZm9yICRYJCB3aXRoICRIXzA6IFxtdSA9IDAkIGFuZCAkSF9hOiBcbXUgXG5lcSAwJCB3aXRoIDEwLDAwMCBzaW11bGF0aW9ucyBhbmQgJFxhbHBoYSA9IDAuMDUkLiBGaW5kIHRoZSBwcm9iYWJpbGl0eSBvZiByZWplY3RpbmcgJEhfMCQgYnkgY29tcGFyaW5nIHRoZSBwLXZhbHVlIGFuZCAkXGFscGhhJC4KCmBgYHtyfQpyZWplY3RfSDBfdHdvc2lkZWQgPC0gcmVwbGljYXRlKG5fc2ltLCB7CiAgeCA8LSBybm9ybShuX3NhbXAsIG1lYW4gPSBtdSwgc2QgPSAxKQogIHQudGVzdCh4LCBtdSA9IG11LCBhbHRlcm5hdGl2ZSA9ICJ0d28uc2lkZWQiKSRwLnZhbHVlIDwgMC4wNQp9KQpwcm9iX3JlamVjdF9IMF90d29zaWRlZCA8LSBtZWFuKHJlamVjdF9IMF90d29zaWRlZCkKY2F0KCJQcm9iYWJpbGl0eSBvZiByZWplY3RpbmcgSDAgKHR3by1zaWRlZCk6IiwgcHJvYl9yZWplY3RfSDBfdHdvc2lkZWQsICJcbiIpCmBgYAoKIyMjIyAoYykgUmVkbyAoYikgd2l0aCAkSF9hOiBcbXUgPiAwJC4KCmBgYHtyfQpyZWplY3RfSDBfZ3JlYXRlciA8LSByZXBsaWNhdGUobl9zaW0sIHsKICB4IDwtIHJub3JtKG5fc2FtcCwgbWVhbiA9IG11LCBzZCA9IDEpCiAgdC50ZXN0KHgsIG11ID0gbXUsIGFsdGVybmF0aXZlID0gImdyZWF0ZXIiKSRwLnZhbHVlIDwgMC4wNQp9KQpwcm9iX3JlamVjdF9IMF9ncmVhdGVyIDwtIG1lYW4ocmVqZWN0X0gwX2dyZWF0ZXIpCmNhdCgiUHJvYmFiaWxpdHkgb2YgcmVqZWN0aW5nIEgwIChncmVhdGVyKToiLCBwcm9iX3JlamVjdF9IMF9ncmVhdGVyLCAiXG4iKQpgYGAKCiMjIyMgKGQpIEluY3JlYXNlIHRoZSBudW1iZXIgb2Ygc2FtcGxlcyB0byAxMDAgYW5kIHJlcGVhdCAoYSktKGMpLgoKYGBge3J9Cm5fc2FtcF9sYXJnZSA8LSAxMDAKCmNpX2NvbnRhaW5zX211X2xhcmdlIDwtIHJlcGxpY2F0ZShuX3NpbSwgewogIHggPC0gcm5vcm0obl9zYW1wX2xhcmdlLCBtZWFuID0gbXUsIHNkID0gMSkKICBjaSA8LSBjaV9tZWFuKHgsIGNvbmYgPSAwLjk1KQogIG11ID49IGNpWzFdICYmIG11IDw9IGNpWzJdCn0pCgpwcm9iX2NpX2NvbnRhaW5zX211X2xhcmdlIDwtIG1lYW4oY2lfY29udGFpbnNfbXVfbGFyZ2UpCmNhdCgiUHJvYmFiaWxpdHkgQ0kgY29udGFpbnMgbXUgKG49MTAwKToiLCBwcm9iX2NpX2NvbnRhaW5zX211X2xhcmdlLCAiXG4iKQoKcmVqZWN0X0gwX3R3b3NpZGVkX2xhcmdlIDwtIHJlcGxpY2F0ZShuX3NpbSwgewogIHggPC0gcm5vcm0obl9zYW1wX2xhcmdlLCBtZWFuID0gbXUsIHNkID0gMSkKICB0LnRlc3QoeCwgbXUgPSBtdSwgYWx0ZXJuYXRpdmUgPSAidHdvLnNpZGVkIikkcC52YWx1ZSA8IDAuMDUKfSkKcHJvYl9yZWplY3RfSDBfdHdvc2lkZWRfbGFyZ2UgPC0gbWVhbihyZWplY3RfSDBfdHdvc2lkZWRfbGFyZ2UpCmNhdCgiUHJvYmFiaWxpdHkgb2YgcmVqZWN0aW5nIEgwICh0d28tc2lkZWQsIG49MTAwKToiLCBwcm9iX3JlamVjdF9IMF90d29zaWRlZF9sYXJnZSwgIlxuIikKCnJlamVjdF9IMF9ncmVhdGVyX2xhcmdlIDwtIHJlcGxpY2F0ZShuX3NpbSwgewogIHggPC0gcm5vcm0obl9zYW1wX2xhcmdlLCBtZWFuID0gbXUsIHNkID0gMSkKICB0LnRlc3QoeCwgbXUgPSBtdSwgYWx0ZXJuYXRpdmUgPSAiZ3JlYXRlciIpJHAudmFsdWUgPCAwLjA1Cn0pCnByb2JfcmVqZWN0X0gwX2dyZWF0ZXJfbGFyZ2UgPC0gbWVhbihyZWplY3RfSDBfZ3JlYXRlcl9sYXJnZSkKY2F0KCJQcm9iYWJpbGl0eSBvZiByZWplY3RpbmcgSDAgKGdyZWF0ZXIsIG49MTAwKToiLCBwcm9iX3JlamVjdF9IMF9ncmVhdGVyX2xhcmdlLCAiXG4iKQpgYGAKCiMjIyMgKGUpIEhvdyBkb2VzIHRoaXMgZXhwZXJpbWVudCB2ZXJpZnkgdGhlIHRoZW9yeSB0aGF0IHdlIGxlYXJuPyBTdW1tYXJpemUgeW91ciBmaW5kaW5ncyBwcm9wZXJseS4KKipBbnN3ZXI6KioKLSBGb3IgYSA5NSUgY29uZmlkZW5jZSBpbnRlcnZhbCwgdGhlIGVtcGlyaWNhbCBjb3ZlcmFnZSBpcyBjbG9zZSB0byAwLjk1LCBjb25maXJtaW5nIHRoZSB0aGVvcmV0aWNhbCBleHBlY3RhdGlvbi4KLSBUaGUgcHJvYmFiaWxpdHkgb2YgcmVqZWN0aW5nIFwoIEhfMCBcKSBpcyBhcHByb3hpbWF0ZWx5IDAuMDUsIG1hdGNoaW5nIHRoZSBzaWduaWZpY2FuY2UgbGV2ZWwgKFwoIFxhbHBoYSA9IDAuMDUgXCkpLgotIEluY3JlYXNpbmcgdGhlIHNhbXBsZSBzaXplIGltcHJvdmVzIHRoZSBhY2N1cmFjeSBvZiB0aGUgY29uZmlkZW5jZSBpbnRlcnZhbCBjb3ZlcmFnZSwgYXMgcHJlZGljdGVkIGJ5IHRoZSBDZW50cmFsIExpbWl0IFRoZW9yZW0uCgojIyMjIDIuIFJlcGVhdCBhbGwgc3RlcHMgaW4gcHJvYmxlbSAxIHdpdGggJFgkIGZvbGxvd3MgYSB1bmlmb3JtIGRpc3RyaWJ1dGlvbiAkXHRleHR7VW5pZn0oMCwxKSQuIEhvdyBkb2VzIHRoZSBkaXN0cmlidXRpb24gb2YgJFgkIGFmZmVjdCB0aGUgcmVzdWx0cz8KCmBgYHtyfQojIEZvciBVbmlmKDAsMSksIHRydWUgbWVhbiBpcyAwLjUKbXVfdW5pZiA8LSAwLjUKCmNpX2NvbnRhaW5zX211X3VuaWYgPC0gcmVwbGljYXRlKG5fc2ltLCB7CiAgeCA8LSBydW5pZihuX3NhbXAsIG1pbiA9IDAsIG1heCA9IDEpCiAgY2kgPC0gY2lfbWVhbih4LCBjb25mID0gMC45NSkKICBtdV91bmlmID49IGNpWzFdICYmIG11X3VuaWYgPD0gY2lbMl0KfSkKcHJvYl9jaV9jb250YWluc19tdV91bmlmIDwtIG1lYW4oY2lfY29udGFpbnNfbXVfdW5pZikKY2F0KCJVbmlmb3JtOiBQcm9iYWJpbGl0eSBDSSBjb250YWlucyBtdToiLCBwcm9iX2NpX2NvbnRhaW5zX211X3VuaWYsICJcbiIpCgpyZWplY3RfSDBfdHdvc2lkZWRfdW5pZiA8LSByZXBsaWNhdGUobl9zaW0sIHsKICB4IDwtIHJ1bmlmKG5fc2FtcCwgbWluID0gMCwgbWF4ID0gMSkKICB0LnRlc3QoeCwgbXUgPSBtdV91bmlmLCBhbHRlcm5hdGl2ZSA9ICJ0d28uc2lkZWQiKSRwLnZhbHVlIDwgMC4wNQp9KQpwcm9iX3JlamVjdF9IMF90d29zaWRlZF91bmlmIDwtIG1lYW4ocmVqZWN0X0gwX3R3b3NpZGVkX3VuaWYpCmNhdCgiVW5pZm9ybTogUHJvYmFiaWxpdHkgb2YgcmVqZWN0aW5nIEgwICh0d28tc2lkZWQpOiIsIHByb2JfcmVqZWN0X0gwX3R3b3NpZGVkX3VuaWYsICJcbiIpCgpyZWplY3RfSDBfZ3JlYXRlcl91bmlmIDwtIHJlcGxpY2F0ZShuX3NpbSwgewogIHggPC0gcnVuaWYobl9zYW1wLCBtaW4gPSAwLCBtYXggPSAxKQogIHQudGVzdCh4LCBtdSA9IG11X3VuaWYsIGFsdGVybmF0aXZlID0gImdyZWF0ZXIiKSRwLnZhbHVlIDwgMC4wNQp9KQpwcm9iX3JlamVjdF9IMF9ncmVhdGVyX3VuaWYgPC0gbWVhbihyZWplY3RfSDBfZ3JlYXRlcl91bmlmKQpjYXQoIlVuaWZvcm06IFByb2JhYmlsaXR5IG9mIHJlamVjdGluZyBIMCAoZ3JlYXRlcik6IiwgcHJvYl9yZWplY3RfSDBfZ3JlYXRlcl91bmlmLCAiXG4iKQoKYGBgCgoqKkNvbmNsdXNpb246KioKVGhlIGRpc3RyaWJ1dGlvbiBvZiBcKCBYIFwpIGFmZmVjdHMgdGhlIGFjY3VyYWN5IG9mIHN0YXRpc3RpY2FsIGluZmVyZW5jZSBwcm9jZWR1cmVzLiBXaGVuIFwoIFggXCkgaXMgbm9ybWFsLCBjb3ZlcmFnZSBhbmQgZXJyb3IgcmF0ZXMgbWF0Y2ggdGhlb3JldGljYWwgZXhwZWN0YXRpb25zLiBXaGVuIFwoIFggXCkgaXMgbm9uLW5vcm1hbCwgdGhlc2UgcHJvY2VkdXJlcyBtYXkgYmUgbGVzcyByZWxpYWJsZSwgZXNwZWNpYWxseSB3aXRoIG1vZGVyYXRlIHNhbXBsZSBzaXplcy4KCiMjIyMgMy4gTm93IGxldCdzIHNpbXVsYXRlIHdpdGggJFgkIGZvbGxvd2luZyBhIG5vcm1hbCBkaXN0cmlidXRpb24gb2YgJE4oMSw0KSQgKHZhcmlhbmNlIG9mIDQgYW5kIHN0YW5kYXJkIGRldml2YXRpb24gb2YgMikuCgojIyMjIChhKSBXaXRoIGEgc2FtcGxlIHNpemUgb2YgMTAsIGRvIGEgaHlwb3RoZXNpcyB0ZXN0IGZvciAkWCQgd2l0aCAkSF8wOiBcbXUgPSAwJCBhbmQgJEhfYTogXG11ID4gMCQgd2l0aCAxMCwwMDAgc2ltdWxhdGlvbnMgYW5kICRcYWxwaGEgPSAwLjA1JC4gRmluZCB0aGUgJFxiZXRhJCBmcm9tIHlvdXIgc2ltdWxhdGlvbi4gV2hhdCBpcyB0aGUgZXN0aW1hdGVkIHBvd2VyIG9mIHRoZSB0ZXN0PwoKYGBge3J9Cm11X2FsdCA8LSAxCnNkX2FsdCA8LSAyCm5fc2FtcF9hbHQgPC0gMTAKCnJlamVjdF9IMF9hbHQgPC0gcmVwbGljYXRlKG5fc2ltLCB7CiAgeCA8LSBybm9ybShuX3NhbXBfYWx0LCBtZWFuID0gbXVfYWx0LCBzZCA9IHNkX2FsdCkKICB0LnRlc3QoeCwgbXUgPSAwLCBhbHRlcm5hdGl2ZSA9ICJncmVhdGVyIikkcC52YWx1ZSA8IDAuMDUKfSkKcG93ZXJfZXN0IDwtIG1lYW4ocmVqZWN0X0gwX2FsdCkKYmV0YV9lc3QgPC0gMSAtIHBvd2VyX2VzdApjYXQoIlBvd2VyIChuPTEwLCBhbHBoYT0wLjA1KToiLCBwb3dlcl9lc3QsICJCZXRhOiIsIGJldGFfZXN0LCAiXG4iKQpgYGAKCiMjIyMgKGIpIENoYW5nZSAkXGFscGhhJCB0byAwLjAxIGluIChhKSBhbmQgZmluZCAkXGJldGEkIGFuZCB0aGUgcG93ZXIgb2YgdGVzdCBhZ2Fpbi4KCmBgYHtyfQpyZWplY3RfSDBfYWx0XzAxIDwtIHJlcGxpY2F0ZShuX3NpbSwgewogIHggPC0gcm5vcm0obl9zYW1wX2FsdCwgbWVhbiA9IG11X2FsdCwgc2QgPSBzZF9hbHQpCiAgdC50ZXN0KHgsIG11ID0gMCwgYWx0ZXJuYXRpdmUgPSAiZ3JlYXRlciIpJHAudmFsdWUgPCAwLjAxCn0pCnBvd2VyX2VzdF8wMSA8LSBtZWFuKHJlamVjdF9IMF9hbHRfMDEpCmJldGFfZXN0XzAxIDwtIDEgLSBwb3dlcl9lc3RfMDEKY2F0KCJQb3dlciAobj0xMCwgYWxwaGE9MC4wMSk6IiwgcG93ZXJfZXN0XzAxLCAiQmV0YToiLCBiZXRhX2VzdF8wMSwgIlxuIikKYGBgCgojIyMjIChjKSBDaGFuZ2UgdGhlIHNhbXBsZSBzaXplIHRvIDEwMDAgYW5kIHJlZG8gKGEpIGFuZCAoYikgYWdhaW4uCgpgYGB7cn0Kbl9zYW1wX2FsdF9sYXJnZSA8LSAxMDAwCgpyZWplY3RfSDBfYWx0X2xhcmdlIDwtIHJlcGxpY2F0ZShuX3NpbSwgewogIHggPC0gcm5vcm0obl9zYW1wX2FsdF9sYXJnZSwgbWVhbiA9IG11X2FsdCwgc2QgPSBzZF9hbHQpCiAgdC50ZXN0KHgsIG11ID0gMCwgYWx0ZXJuYXRpdmUgPSAiZ3JlYXRlciIpJHAudmFsdWUgPCAwLjA1Cn0pCnBvd2VyX2VzdF9sYXJnZSA8LSBtZWFuKHJlamVjdF9IMF9hbHRfbGFyZ2UpCmJldGFfZXN0X2xhcmdlIDwtIDEgLSBwb3dlcl9lc3RfbGFyZ2UKY2F0KCJQb3dlciAobj0xMDAwLCBhbHBoYT0wLjA1KToiLCBwb3dlcl9lc3RfbGFyZ2UsICJCZXRhOiIsIGJldGFfZXN0X2xhcmdlLCAiXG4iKQoKcmVqZWN0X0gwX2FsdF9sYXJnZV8wMSA8LSByZXBsaWNhdGUobl9zaW0sIHsKICB4IDwtIHJub3JtKG5fc2FtcF9hbHRfbGFyZ2UsIG1lYW4gPSBtdV9hbHQsIHNkID0gc2RfYWx0KQogIHQudGVzdCh4LCBtdSA9IDAsIGFsdGVybmF0aXZlID0gImdyZWF0ZXIiKSRwLnZhbHVlIDwgMC4wMQp9KQpwb3dlcl9lc3RfbGFyZ2VfMDEgPC0gbWVhbihyZWplY3RfSDBfYWx0X2xhcmdlXzAxKQpiZXRhX2VzdF9sYXJnZV8wMSA8LSAxIC0gcG93ZXJfZXN0X2xhcmdlXzAxCmNhdCgiUG93ZXIgKG49MTAwMCwgYWxwaGE9MC4wMSk6IiwgcG93ZXJfZXN0X2xhcmdlXzAxLCAiQmV0YToiLCBiZXRhX2VzdF9sYXJnZV8wMSwgIlxuIikKYGBgCgojIyMjIChkKSBIb3cgZG9lcyB0aGlzIGV4cGVyaW1lbnQgdmVyaWZ5IHRoZSB0aGVvcnkgdGhhdCB3ZSBsZWFybj8gU3VtbWFyaXplIHlvdXIgZmluZGluZ3MgcHJvcGVybHkuCgpQb3dlciBpbmNyZWFzZXMgd2l0aCBsYXJnZXIgc2FtcGxlcyBhbmQgaGlnaGVyIHNpZ25pZmljYW5jZSBsZXZlbHMsIHdoaWxlIFR5cGUgSUkgZXJyb3IgZGVjcmVhc2VzIHVuZGVyIHRoZSBzYW1lIGNvbmRpdGlvbnMuIFRoaXMgZGVtb25zdHJhdGVzIHRoZSBpbXBvcnRhbmNlIG9mIGFkZXF1YXRlIHNhbXBsZSBzaXplIGFuZCBhcHByb3ByaWF0ZSBjaG9pY2Ugb2YgXChcYWxwaGFcKSBpbiBoeXBvdGhlc2lzIHRlc3RpbmcuCgo=