Gabriela Ochoa

Instructions

The project consists of two parts:

You will create a report to answer the questions. Given the nature of the series, ideally you'll use knitr to create the reports and convert to a pdf. (I will post a very simple introduction to knitr).
However, feel free to use whatever software that you would like to create your pdf.

Each pdf report should be no more than 3 pages with 3 pages of supporting appendix material if needed (code, figures, etcetera).

Review criteria

Part 1: Simulation Exercise instructions

In this project you will investigate the exponential distribution in R and compare it with the Central Limit Theorem. The exponential distribution can be simulated in R with rexp(n, lambda) where lambda is the rate parameter. The mean of exponential distribution is 1/lambda and the standard deviation is also 1/lambda. Set lambda = 0.2 for all of the simulations. You will investigate the distribution of averages of 40 exponentials. Note that you will need to do a thousand simulations.

Illustrate via simulation and associated explanatory text the properties of the distribution of the mean of 40 exponentials. You should

  1. Show the sample mean and compare it to the theoretical mean of the distribution.
  2. Show how variable the sample is (via variance) and compare it to the theoretical variance of the distribution.
  3. Show that the distribution is approximately normal.

In point 3, focus on the difference between the distribution of a large collection of random exponentials and the distribution of a large collection of averages of 40 exponentials.

As a motivating example, compare the distribution of 1000 random uniforms

and the distribution of 1000 averages of 40 random uniforms

mns = NULL
for (i in 1 : 1000) mns = c(mns, mean(runif(40)))
hist(mns)

This distribution looks far more Gaussian than the original uniform distribution!

This exercise is asking you to use your knowledge of the theory given in class to relate the two distributions.

Sample Project Report Structure

Of course, there are multiple ways one could structure a report to address the requirements above. However, the more clearly you pose and answer each question, the easier it will be for reviewers to clearly identify and evaluate your work.

A sample set of headings that could be used to guide the creation of your report might be:

  • Title (give an appropriate title) and Author Name
  • Overview: In a few (2-3) sentences explain what is going to be reported on.
  • Simulations: Include English explanations of the simulations you ran, with the accompanying R code. Your explanations should make clear what the R code accomplishes.
  • Sample Mean versus Theoretical Mean: Include figures with titles. In the figures, highlight the means you are comparing. Include text that explains the figures and what is shown on them, and provides appropriate numbers.
  • Sample Variance versus Theoretical Variance: Include figures (output from R) with titles. Highlight the variances you are comparing. Include text that explains your understanding of the differences of the variances.
  • Distribution: Via figures and text, explain how one can tell the distribution is approximately normal.

Part 2: Basic Inferential Data Analysis Instructions

Now in the second portion of the project, we're going to analyze the ToothGrowth data in the R datasets package.

  1. Load the ToothGrowth data and perform some basic exploratory data analyses
  2. Provide a basic summary of the data.
  3. Use confidence intervals and/or hypothesis tests to compare tooth growth by supp and dose. (Only use the techniques from class, even if there's other approaches worth considering)
  4. State your conclusions and the assumptions needed for your conclusions.

Resolution Part 1

We start by running a 1000 simulations of 40 exponentials.

## Required libraries
library(ggplot2)
library(knitr)
## setting seed
set.seed(1)
#No. of values (n) = 40, lambda = 0.2, No.of iterations, at least 1000, numsim=2000,Theoretical mean =1 / lambda or 1 / 0.2 
lambda <- 0.2 
nosim <- 1:1000 # Number of Simulations/rows
n <- 40 

Generating data using rexp

Use the rexp function to develop a dataset with the mean and lambda specified above.

#sd(apply(matrix(rnorm(nosim*n), nosim), 1, mean))
#Create a matrix of simulated values:
e_matrix <- data.frame(x = sapply(nosim, function(x) {mean(rexp(n, lambda))}))
head(e_matrix)

1. Show where the distribution is centered at and compare it to the theoretical center of the distribution.

sim_mean <- apply(e_matrix, 2, mean)
sim_mean
       x 
5.047502 

Which is very close to the expected theoretical center of the distribution:

th_mean <- 1/lambda
th_mean
[1] 5

2.Show how variable it is and compare it to the theoretical variance of the distribution. .

sim_SD <- sd((e_matrix$x)) 
sim_SD
[1] 0.7960988
sim_Var <- var(e_matrix$x)
sim_Var
[1] 0.6337733

Let's compare, the expected theretical SD and Variance are:

th_SD <- (1/lambda)/sqrt(n)
th_SD
[1] 0.7905694
th_Var <- th_SD^2
th_Var
[1] 0.625

Comparing Theoretical and actual Values of mean,Standard deviation and variance Table

Variable Theoretical val Actual Val
Mean 5 5.048
SD 0.791 0.796
Var 0.625 0.634

We can verify that the differences are minimal, as expected.

3. Show that the distribution is approximately normal.

plot <- ggplot(data = e_matrix, aes(x = x)) + 
    geom_histogram(aes(y=..density..), binwidth = 0.20, fill="slategray3", col="black")
plot <- plot + labs(title="Density of 40 Numbers from Exponential Distribution", x="Mean of 40 Selections", y="Density")
plot <- plot + geom_vline(xintercept=sim_mean,size=1.0, color="black")
plot <- plot + stat_function(fun=dnorm,args=list(mean=sim_mean, sd=sim_SD),color = "dodgerblue4", size = 1.0)
plot <- plot+ geom_vline(xintercept=th_mean,size=1.0,color="indianred4",linetype = "longdash")
plot <- plot + stat_function(fun=dnorm,args=list(mean=th_mean, sd=th_SD),color = "darkmagenta", size = 1.0)
plot

we conclude that the function appears to aproximate to nearly Normal.

Resolution Part 2

1. We load the ToothGrowth data in the R datasets package and perform some basic exploratory data analyses

library(datasets)
data(ToothGrowth)
head(ToothGrowth)

EDA

Data: The Effect of Vitamin C on Tooth Growth in Guinea Pigs

Description:

The response is the length of odontoblasts (cells responsible for tooth growth) in 60 guinea pigs. Each animal received one of three dose levels of vitamin C (0.5, 1, and 2 mg/day) by one of two delivery methods, orange juice or ascorbic acid (a form of vitamin C and coded as VC).

Format

A data frame with 60 observations on 3 variables.

[,1] len numeric Tooth length
[,2] supp factor Supplement type (VC or OJ)
[,3] dose numeric Dose in milligrams/day

We can visualize the dataset easily with a boxplot and coplot:

boxplot(len ~ supp * dose, data=ToothGrowth, ylab="Tooth Length", main="Comparing Tooth Growth between different supplements and different dosis", col=c("brown4", "cornflowerblue", "brown4", "cornflowerblue", "brown4", "cornflowerblue"))

require(graphics)
coplot(len ~ dose | supp, data = ToothGrowth, panel = panel.smooth,xlab = "Comparing Tooth Growth between different supplements and different dosis", col=c("royalblue4"), pch=21)

2. Provide a basic summary of the data.

As we can see in the plots, the average of the tooth length seems to increase with the supplement dosis. this can mean that it might be a relationship between applying a supplement dosis and the tooth growth.

Further data summaries:

# basic info
head(ToothGrowth)
nrow(ToothGrowth)
[1] 60
summary(ToothGrowth)
      len        supp         dose      
 Min.   : 4.20   OJ:30   Min.   :0.500  
 1st Qu.:13.07   VC:30   1st Qu.:0.500  
 Median :19.25           Median :1.000  
 Mean   :18.81           Mean   :1.167  
 3rd Qu.:25.27           3rd Qu.:2.000  
 Max.   :33.90           Max.   :2.000  
table(ToothGrowth$supp,ToothGrowth$dose)
    
     0.5  1  2
  OJ  10 10 10
  VC  10 10 10

3. Use confidence intervals and/or hypothesis tests to compare tooth growth by supp and dose. (Only use the techniques from class, even if there's other approaches worth considering)

Sample size is not too big, we suggest T distribution

t.test(len ~ supp, data = ToothGrowth)

    Welch Two Sample t-test

data:  len by supp
t = 1.9153, df = 55.309, p-value = 0.06063
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
 -0.1710156  7.5710156
sample estimates:
mean in group OJ mean in group VC 
        20.66333         16.96333 

Comparing the difference between the two supplements shows no strong evidence to reject the null hypothesis, since the p-value is bigger than the 5% significance level.

However, for this dataset it is important to also compare the differences between the the different dosis level, since bigger dosis may yield contradicting evidence.

t.test(ToothGrowth$len, ToothGrowth$dose)

    Welch Two Sample t-test

data:  ToothGrowth$len and ToothGrowth$dose
t = 17.81, df = 59.798, p-value < 2.2e-16
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
 15.66453 19.62881
sample estimates:
mean of x mean of y 
18.813333  1.166667 

Comparing the difference between the two supplements shows enough evidence to reject the null hypothesis, since the p-value aproximates to 0.

4. State your conclusions and the assumptions needed for your conclusions.

As already stated, there is no convincing evidence that there is a difference between the two type of supplements based on the existing datasets and T statistics. meaning we fail to reject the Null hypothesis (H0).

However, there is convincing evidence that there is a difference between the dosis level, and the growth. meaning we reject the Null hypothesis (H0) in favour of the alternative hypothesis (Ha).

LS0tDQp0aXRsZTogIlBlZXItZ3JhZGVkIEFzc2lnbm1lbnQ6IFN0YXRpc3RpY2FsIEluZmVyZW5jZSBDb3Vyc2UgUHJvamVjdCINCm91dHB1dDoNCiAgcGRmX2RvY3VtZW50OiBkZWZhdWx0DQogIGh0bWxfbm90ZWJvb2s6IGRlZmF1bHQNCi0tLQ0KIyMjIyBHYWJyaWVsYSBPY2hvYQ0KIyAqKkluc3RydWN0aW9ucyoqDQoNClRoZSBwcm9qZWN0IGNvbnNpc3RzIG9mIHR3byBwYXJ0czoNCg0KLSBBIHNpbXVsYXRpb24gZXhlcmNpc2UuDQotIEJhc2ljIGluZmVyZW50aWFsIGRhdGEgYW5hbHlzaXMuDQoNCllvdSB3aWxsIGNyZWF0ZSBhIHJlcG9ydCB0byBhbnN3ZXIgdGhlIHF1ZXN0aW9ucy4gR2l2ZW4gdGhlIG5hdHVyZSBvZiB0aGUgc2VyaWVzLCBpZGVhbGx5IHlvdSdsbCB1c2Uga25pdHIgdG8gY3JlYXRlIHRoZSByZXBvcnRzIGFuZCBjb252ZXJ0IHRvIGEgcGRmLiAoSSB3aWxsIHBvc3QgYSB2ZXJ5IHNpbXBsZSBpbnRyb2R1Y3Rpb24gdG8ga25pdHIpLiAgDQoqKkhvd2V2ZXIsIGZlZWwgZnJlZSB0byB1c2Ugd2hhdGV2ZXIgc29mdHdhcmUgdGhhdCB5b3Ugd291bGQgbGlrZSB0byBjcmVhdGUgeW91ciBwZGYuKioNCg0KKipFYWNoIHBkZiByZXBvcnQgc2hvdWxkIGJlIG5vIG1vcmUgdGhhbiAzIHBhZ2VzIHdpdGggMyBwYWdlcyBvZiBzdXBwb3J0aW5nIGFwcGVuZGl4IG1hdGVyaWFsIGlmIG5lZWRlZCAoY29kZSwgZmlndXJlcywgZXRjZXRlcmEpLioqDQoNCg0KDQojICoqUmV2aWV3IGNyaXRlcmlhKioNCg0KLSBEaWQgeW91IHNob3cgd2hlcmUgdGhlIGRpc3RyaWJ1dGlvbiBpcyBjZW50ZXJlZCBhdCBhbmQgY29tcGFyZSBpdCB0byB0aGUgdGhlb3JldGljYWwgY2VudGVyIG9mIHRoZSBkaXN0cmlidXRpb24/DQotIERpZCB5b3Ugc2hvdyBob3cgdmFyaWFibGUgaXQgaXMgYW5kIGNvbXBhcmUgaXQgdG8gdGhlIHRoZW9yZXRpY2FsIHZhcmlhbmNlIG9mIHRoZSBkaXN0cmlidXRpb24/DQotIERpZCB5b3UgcGVyZm9ybSBhbiBleHBsb3JhdG9yeSBkYXRhIGFuYWx5c2lzIG9mIGF0IGxlYXN0IGEgc2luZ2xlIHBsb3Qgb3IgdGFibGUgaGlnaGxpZ2h0aW5nIGJhc2ljIGZlYXR1cmVzIG9mIHRoZSBkYXRhPw0KLSBEaWQgdGhlIHN0dWRlbnQgcGVyZm9ybSBzb21lIHJlbGV2YW50IGNvbmZpZGVuY2UgaW50ZXJ2YWxzIGFuZC9vciB0ZXN0cz8NCi0gV2VyZSB0aGUgcmVzdWx0cyBvZiB0aGUgdGVzdHMgYW5kL29yIGludGVydmFscyBpbnRlcnByZXRlZCBpbiB0aGUgY29udGV4dCBvZiB0aGUgcHJvYmxlbSBjb3JyZWN0bHk/DQotIERpZCB0aGUgc3R1ZGVudCBkZXNjcmliZSB0aGUgYXNzdW1wdGlvbnMgbmVlZGVkIGZvciB0aGVpciBjb25jbHVzaW9ucz8NCiAgICANCiMjICoqUGFydCAxOiBTaW11bGF0aW9uIEV4ZXJjaXNlIGluc3RydWN0aW9ucyoqDQpJbiB0aGlzIHByb2plY3QgeW91IHdpbGwgaW52ZXN0aWdhdGUgdGhlIGV4cG9uZW50aWFsIGRpc3RyaWJ1dGlvbiBpbiBSIGFuZCBjb21wYXJlIGl0IHdpdGggdGhlIENlbnRyYWwgTGltaXQgVGhlb3JlbS4gVGhlIGV4cG9uZW50aWFsIGRpc3RyaWJ1dGlvbiBjYW4gYmUgc2ltdWxhdGVkIGluIFIgd2l0aCByZXhwKG4sIGxhbWJkYSkgd2hlcmUgbGFtYmRhIGlzIHRoZSByYXRlIHBhcmFtZXRlci4gVGhlIG1lYW4gb2YgZXhwb25lbnRpYWwgZGlzdHJpYnV0aW9uIGlzIDEvbGFtYmRhIGFuZCB0aGUgc3RhbmRhcmQgZGV2aWF0aW9uIGlzIGFsc28gMS9sYW1iZGEuIFNldCBsYW1iZGEgPSAwLjIgZm9yIGFsbCBvZiB0aGUgc2ltdWxhdGlvbnMuIFlvdSB3aWxsIGludmVzdGlnYXRlIHRoZSBkaXN0cmlidXRpb24gb2YgYXZlcmFnZXMgb2YgNDAgZXhwb25lbnRpYWxzLiBOb3RlIHRoYXQgeW91IHdpbGwgbmVlZCB0byBkbyBhIHRob3VzYW5kIHNpbXVsYXRpb25zLg0KDQpJbGx1c3RyYXRlIHZpYSBzaW11bGF0aW9uIGFuZCBhc3NvY2lhdGVkIGV4cGxhbmF0b3J5IHRleHQgdGhlIHByb3BlcnRpZXMgb2YgdGhlIGRpc3RyaWJ1dGlvbiBvZiB0aGUgbWVhbiBvZiA0MCBleHBvbmVudGlhbHMuIFlvdSBzaG91bGQNCg0KMS4gU2hvdyB0aGUgc2FtcGxlIG1lYW4gYW5kIGNvbXBhcmUgaXQgdG8gdGhlIHRoZW9yZXRpY2FsIG1lYW4gb2YgdGhlIGRpc3RyaWJ1dGlvbi4NCiAyLiBTaG93IGhvdyB2YXJpYWJsZSB0aGUgc2FtcGxlIGlzICh2aWEgdmFyaWFuY2UpIGFuZCBjb21wYXJlIGl0IHRvIHRoZSB0aGVvcmV0aWNhbCB2YXJpYW5jZSBvZiB0aGUgZGlzdHJpYnV0aW9uLg0KMy4gU2hvdyB0aGF0IHRoZSBkaXN0cmlidXRpb24gaXMgYXBwcm94aW1hdGVseSBub3JtYWwuDQoNCkluIHBvaW50IDMsIGZvY3VzIG9uIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIGRpc3RyaWJ1dGlvbiBvZiBhIGxhcmdlIGNvbGxlY3Rpb24gb2YgcmFuZG9tIGV4cG9uZW50aWFscyBhbmQgdGhlIGRpc3RyaWJ1dGlvbiBvZiBhIGxhcmdlIGNvbGxlY3Rpb24gb2YgYXZlcmFnZXMgb2YgNDAgZXhwb25lbnRpYWxzLg0KDQpBcyBhIG1vdGl2YXRpbmcgZXhhbXBsZSwgY29tcGFyZSB0aGUgZGlzdHJpYnV0aW9uIG9mIDEwMDAgcmFuZG9tIHVuaWZvcm1zDQogICAgDQoNCg0KYGBge3J9DQpoaXN0KHJ1bmlmKDEwMDApKQ0KYGBgDQoNCmFuZCB0aGUgZGlzdHJpYnV0aW9uIG9mIDEwMDAgYXZlcmFnZXMgb2YgNDAgcmFuZG9tIHVuaWZvcm1zDQoNCmBgYHtyfQ0KbW5zID0gTlVMTA0KZm9yIChpIGluIDEgOiAxMDAwKSBtbnMgPSBjKG1ucywgbWVhbihydW5pZig0MCkpKQ0KaGlzdChtbnMpDQpgYGANClRoaXMgZGlzdHJpYnV0aW9uIGxvb2tzIGZhciBtb3JlIEdhdXNzaWFuIHRoYW4gdGhlIG9yaWdpbmFsIHVuaWZvcm0gZGlzdHJpYnV0aW9uIQ0KDQpUaGlzIGV4ZXJjaXNlIGlzIGFza2luZyB5b3UgdG8gdXNlIHlvdXIga25vd2xlZGdlIG9mIHRoZSB0aGVvcnkgZ2l2ZW4gaW4gY2xhc3MgdG8gcmVsYXRlIHRoZSB0d28gZGlzdHJpYnV0aW9ucy4NCg0KIyMjICoqU2FtcGxlIFByb2plY3QgUmVwb3J0IFN0cnVjdHVyZSoqDQpPZiBjb3Vyc2UsIHRoZXJlIGFyZSBtdWx0aXBsZSB3YXlzIG9uZSBjb3VsZCBzdHJ1Y3R1cmUgYSByZXBvcnQgdG8gYWRkcmVzcyB0aGUgcmVxdWlyZW1lbnRzIGFib3ZlLiBIb3dldmVyLCB0aGUgbW9yZSBjbGVhcmx5IHlvdSBwb3NlIGFuZCBhbnN3ZXIgZWFjaCBxdWVzdGlvbiwgdGhlIGVhc2llciBpdCB3aWxsIGJlIGZvciByZXZpZXdlcnMgdG8gY2xlYXJseSBpZGVudGlmeSBhbmQgZXZhbHVhdGUgeW91ciB3b3JrLg0KDQpBIHNhbXBsZSBzZXQgb2YgaGVhZGluZ3MgdGhhdCBjb3VsZCBiZSB1c2VkIHRvIGd1aWRlIHRoZSBjcmVhdGlvbiBvZiB5b3VyIHJlcG9ydCBtaWdodCBiZToNCg0KLSBUaXRsZSAoZ2l2ZSBhbiBhcHByb3ByaWF0ZSB0aXRsZSkgYW5kIEF1dGhvciBOYW1lDQotIE92ZXJ2aWV3OiBJbiBhIGZldyAoMi0zKSBzZW50ZW5jZXMgZXhwbGFpbiB3aGF0IGlzIGdvaW5nIHRvIGJlIHJlcG9ydGVkIG9uLg0KLSBTaW11bGF0aW9uczogSW5jbHVkZSBFbmdsaXNoIGV4cGxhbmF0aW9ucyBvZiB0aGUgc2ltdWxhdGlvbnMgeW91IHJhbiwgd2l0aCB0aGUgYWNjb21wYW55aW5nIFIgY29kZS4gWW91ciBleHBsYW5hdGlvbnMgc2hvdWxkIG1ha2UgY2xlYXIgd2hhdCB0aGUgUiBjb2RlIGFjY29tcGxpc2hlcy4NCi0gU2FtcGxlIE1lYW4gdmVyc3VzIFRoZW9yZXRpY2FsIE1lYW46IEluY2x1ZGUgZmlndXJlcyB3aXRoIHRpdGxlcy4gSW4gdGhlIGZpZ3VyZXMsIGhpZ2hsaWdodCB0aGUgbWVhbnMgeW91IGFyZSBjb21wYXJpbmcuIEluY2x1ZGUgdGV4dCB0aGF0IGV4cGxhaW5zIHRoZSBmaWd1cmVzIGFuZCB3aGF0IGlzIHNob3duIG9uIHRoZW0sIGFuZCBwcm92aWRlcyBhcHByb3ByaWF0ZSBudW1iZXJzLg0KLSBTYW1wbGUgVmFyaWFuY2UgdmVyc3VzIFRoZW9yZXRpY2FsIFZhcmlhbmNlOiBJbmNsdWRlIGZpZ3VyZXMgKG91dHB1dCBmcm9tIFIpIHdpdGggdGl0bGVzLiBIaWdobGlnaHQgdGhlIHZhcmlhbmNlcyB5b3UgYXJlIGNvbXBhcmluZy4gSW5jbHVkZSB0ZXh0IHRoYXQgZXhwbGFpbnMgeW91ciB1bmRlcnN0YW5kaW5nIG9mIHRoZSBkaWZmZXJlbmNlcyBvZiB0aGUgdmFyaWFuY2VzLg0KLSBEaXN0cmlidXRpb246IFZpYSBmaWd1cmVzIGFuZCB0ZXh0LCBleHBsYWluIGhvdyBvbmUgY2FuIHRlbGwgdGhlIGRpc3RyaWJ1dGlvbiBpcyBhcHByb3hpbWF0ZWx5IG5vcm1hbC4NCg0KIyMjICoqUGFydCAyOiBCYXNpYyBJbmZlcmVudGlhbCBEYXRhIEFuYWx5c2lzIEluc3RydWN0aW9ucyoqIA0KDQpOb3cgaW4gdGhlIHNlY29uZCBwb3J0aW9uIG9mIHRoZSBwcm9qZWN0LCB3ZSdyZSBnb2luZyB0byBhbmFseXplIHRoZSBUb290aEdyb3d0aCBkYXRhIGluIHRoZSBSIGRhdGFzZXRzIHBhY2thZ2UuDQoNCjEuIExvYWQgdGhlIFRvb3RoR3Jvd3RoIGRhdGEgYW5kIHBlcmZvcm0gc29tZSBiYXNpYyBleHBsb3JhdG9yeSBkYXRhIGFuYWx5c2VzDQoyLiBQcm92aWRlIGEgYmFzaWMgc3VtbWFyeSBvZiB0aGUgZGF0YS4NCjMuIFVzZSBjb25maWRlbmNlIGludGVydmFscyBhbmQvb3IgaHlwb3RoZXNpcyB0ZXN0cyB0byBjb21wYXJlIHRvb3RoIGdyb3d0aCBieSBzdXBwIGFuZCBkb3NlLiAoT25seSB1c2UgdGhlIHRlY2huaXF1ZXMgZnJvbSBjbGFzcywgZXZlbiBpZiB0aGVyZSdzIG90aGVyIGFwcHJvYWNoZXMgd29ydGggY29uc2lkZXJpbmcpDQo0LiBTdGF0ZSB5b3VyIGNvbmNsdXNpb25zIGFuZCB0aGUgYXNzdW1wdGlvbnMgbmVlZGVkIGZvciB5b3VyIGNvbmNsdXNpb25zLg0KDQojIyAqKlJlc29sdXRpb24gUGFydCAxKioNCldlIHN0YXJ0IGJ5IHJ1bm5pbmcgYSAxMDAwIHNpbXVsYXRpb25zIG9mIDQwIGV4cG9uZW50aWFscy4NCg0KYGBge3J9DQojIyBSZXF1aXJlZCBsaWJyYXJpZXMNCmxpYnJhcnkoZ2dwbG90MikNCmxpYnJhcnkoa25pdHIpDQojIyBzZXR0aW5nIHNlZWQNCnNldC5zZWVkKDEpDQpgYGANCg0KYGBge3J9DQojTm8uIG9mIHZhbHVlcyAobikgPSA0MCwgbGFtYmRhID0gMC4yLCBOby5vZiBpdGVyYXRpb25zLCBhdCBsZWFzdCAxMDAwLCBudW1zaW09MjAwMCxUaGVvcmV0aWNhbCBtZWFuID0xIC8gbGFtYmRhIG9yIDEgLyAwLjIgDQpsYW1iZGEgPC0gMC4yIA0Kbm9zaW0gPC0gMToxMDAwICMgTnVtYmVyIG9mIFNpbXVsYXRpb25zL3Jvd3MNCm4gPC0gNDAgDQpgYGANCg0KIyMjIEdlbmVyYXRpbmcgZGF0YSB1c2luZyByZXhwDQoNClVzZSB0aGUgcmV4cCBmdW5jdGlvbiB0byBkZXZlbG9wIGEgZGF0YXNldCB3aXRoIHRoZSBtZWFuIGFuZCBsYW1iZGEgc3BlY2lmaWVkIGFib3ZlLg0KDQpgYGB7cn0NCiNzZChhcHBseShtYXRyaXgocm5vcm0obm9zaW0qbiksIG5vc2ltKSwgMSwgbWVhbikpDQoNCiNDcmVhdGUgYSBtYXRyaXggb2Ygc2ltdWxhdGVkIHZhbHVlczoNCmVfbWF0cml4IDwtIGRhdGEuZnJhbWUoeCA9IHNhcHBseShub3NpbSwgZnVuY3Rpb24oeCkge21lYW4ocmV4cChuLCBsYW1iZGEpKX0pKQ0KDQpoZWFkKGVfbWF0cml4KQ0KYGBgDQoNCioqMS4qKiBTaG93IHdoZXJlIHRoZSBkaXN0cmlidXRpb24gaXMgY2VudGVyZWQgYXQgYW5kIGNvbXBhcmUgaXQgdG8gdGhlIHRoZW9yZXRpY2FsIGNlbnRlciBvZiB0aGUgZGlzdHJpYnV0aW9uLg0KDQoNCmBgYHtyfQ0Kc2ltX21lYW4gPC0gYXBwbHkoZV9tYXRyaXgsIDIsIG1lYW4pDQpzaW1fbWVhbg0KYGBgDQpXaGljaCBpcyB2ZXJ5IGNsb3NlIHRvIHRoZSBleHBlY3RlZCB0aGVvcmV0aWNhbCBjZW50ZXIgb2YgdGhlIGRpc3RyaWJ1dGlvbjogDQpgYGB7cn0NCnRoX21lYW4gPC0gMS9sYW1iZGENCnRoX21lYW4NCmBgYA0KDQoqKjIuKipTaG93IGhvdyB2YXJpYWJsZSBpdCBpcyBhbmQgY29tcGFyZSBpdCB0byB0aGUgdGhlb3JldGljYWwgdmFyaWFuY2Ugb2YgdGhlIGRpc3RyaWJ1dGlvbi4gLiANCmBgYHtyfQ0Kc2ltX1NEIDwtIHNkKChlX21hdHJpeCR4KSkgDQpzaW1fU0QNCmBgYA0KDQpgYGB7cn0NCnNpbV9WYXIgPC0gdmFyKGVfbWF0cml4JHgpDQpzaW1fVmFyDQpgYGANCkxldCdzIGNvbXBhcmUsIHRoZSBleHBlY3RlZCB0aGVyZXRpY2FsIFNEIGFuZCBWYXJpYW5jZSBhcmU6DQpgYGB7cn0NCnRoX1NEIDwtICgxL2xhbWJkYSkvc3FydChuKQ0KdGhfU0QNCmBgYA0KDQpgYGB7cn0NCnRoX1ZhciA8LSB0aF9TRF4yDQp0aF9WYXINCmBgYA0KQ29tcGFyaW5nIFRoZW9yZXRpY2FsIGFuZCBhY3R1YWwgVmFsdWVzIG9mIG1lYW4sU3RhbmRhcmQgZGV2aWF0aW9uIGFuZCB2YXJpYW5jZSBUYWJsZSAgDQoNCnwgIFZhcmlhYmxlfCBUaGVvcmV0aWNhbCB2YWx8IEFjdHVhbCBWYWx8DQp8LS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tfA0KfE1lYW58IDUgIHwgNS4wNDh8DQp8U0QgIHwgMC43OTF8MC43OTZ8IA0KfFZhciB8MC42MjV8IDAuNjM0fCANCg0KV2UgY2FuICB2ZXJpZnkgdGhhdCB0aGUgZGlmZmVyZW5jZXMgYXJlIG1pbmltYWwsIGFzIGV4cGVjdGVkLg0KDQoNCioqMy4qKiBTaG93IHRoYXQgdGhlIGRpc3RyaWJ1dGlvbiBpcyBhcHByb3hpbWF0ZWx5IG5vcm1hbC4NCg0KYGBge3J9DQpwbG90IDwtIGdncGxvdChkYXRhID0gZV9tYXRyaXgsIGFlcyh4ID0geCkpICsgDQogICAgZ2VvbV9oaXN0b2dyYW0oYWVzKHk9Li5kZW5zaXR5Li4pLCBiaW53aWR0aCA9IDAuMjAsIGZpbGw9InNsYXRlZ3JheTMiLCBjb2w9ImJsYWNrIikNCnBsb3QgPC0gcGxvdCArIGxhYnModGl0bGU9IkRlbnNpdHkgb2YgNDAgTnVtYmVycyBmcm9tIEV4cG9uZW50aWFsIERpc3RyaWJ1dGlvbiIsIHg9Ik1lYW4gb2YgNDAgU2VsZWN0aW9ucyIsIHk9IkRlbnNpdHkiKQ0KcGxvdCA8LSBwbG90ICsgZ2VvbV92bGluZSh4aW50ZXJjZXB0PXNpbV9tZWFuLHNpemU9MS4wLCBjb2xvcj0iYmxhY2siKQ0KcGxvdCA8LSBwbG90ICsgc3RhdF9mdW5jdGlvbihmdW49ZG5vcm0sYXJncz1saXN0KG1lYW49c2ltX21lYW4sIHNkPXNpbV9TRCksY29sb3IgPSAiZG9kZ2VyYmx1ZTQiLCBzaXplID0gMS4wKQ0KcGxvdCA8LSBwbG90KyBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQ9dGhfbWVhbixzaXplPTEuMCxjb2xvcj0iaW5kaWFucmVkNCIsbGluZXR5cGUgPSAibG9uZ2Rhc2giKQ0KcGxvdCA8LSBwbG90ICsgc3RhdF9mdW5jdGlvbihmdW49ZG5vcm0sYXJncz1saXN0KG1lYW49dGhfbWVhbiwgc2Q9dGhfU0QpLGNvbG9yID0gImRhcmttYWdlbnRhIiwgc2l6ZSA9IDEuMCkNCnBsb3QNCmBgYA0KDQp3ZSBjb25jbHVkZSB0aGF0IHRoZSBmdW5jdGlvbiBhcHBlYXJzIHRvIGFwcm94aW1hdGUgdG8gbmVhcmx5IE5vcm1hbC4NCg0KIyMgKipSZXNvbHV0aW9uIFBhcnQgMioqDQoqMS4qIFdlIGxvYWQgdGhlIFRvb3RoR3Jvd3RoIGRhdGEgaW4gdGhlIFIgZGF0YXNldHMgcGFja2FnZSBhbmQgcGVyZm9ybSBzb21lIGJhc2ljIGV4cGxvcmF0b3J5IGRhdGEgYW5hbHlzZXMNCmBgYHtyfQ0KbGlicmFyeShkYXRhc2V0cykNCmRhdGEoVG9vdGhHcm93dGgpDQpoZWFkKFRvb3RoR3Jvd3RoKQ0KYGBgDQojIyMgKipFREEqKg0KDQpEYXRhOiBfVGhlIEVmZmVjdCBvZiBWaXRhbWluIEMgb24gVG9vdGggR3Jvd3RoIGluIEd1aW5lYSBQaWdzXw0KDQpEZXNjcmlwdGlvbjoNCg0KVGhlIHJlc3BvbnNlIGlzIHRoZSBsZW5ndGggb2Ygb2RvbnRvYmxhc3RzIChjZWxscyByZXNwb25zaWJsZSBmb3IgdG9vdGggZ3Jvd3RoKSBpbiA2MCBndWluZWEgcGlncy4gRWFjaCBhbmltYWwgcmVjZWl2ZWQgb25lIG9mIHRocmVlIGRvc2UgbGV2ZWxzIG9mIHZpdGFtaW4gQyAoMC41LCAxLCBhbmQgMiBtZy9kYXkpIGJ5IG9uZSBvZiB0d28gZGVsaXZlcnkgbWV0aG9kcywgb3JhbmdlIGp1aWNlIG9yIGFzY29yYmljIGFjaWQgKGEgZm9ybSBvZiB2aXRhbWluIEMgYW5kIGNvZGVkIGFzIFZDKS4NCg0KX0Zvcm1hdF8NCg0KQSBkYXRhIGZyYW1lIHdpdGggNjAgb2JzZXJ2YXRpb25zIG9uIDMgdmFyaWFibGVzLg0KDQp8IHwgfCB8IHwNCnwtLXwtLXwtLXwtLXwNCnxbLDFdfGxlbnxudW1lcmljfFRvb3RoIGxlbmd0aHwNCnxbLDJdfHN1cHB8ZmFjdG9yfFN1cHBsZW1lbnQgdHlwZSAoVkMgb3IgT0opIHwNCnxbLDNdfGRvc2V8bnVtZXJpY3xEb3NlIGluIG1pbGxpZ3JhbXMvZGF5ICB8DQoNCg0KV2UgY2FuIHZpc3VhbGl6ZSB0aGUgZGF0YXNldCBlYXNpbHkgd2l0aCBhIGJveHBsb3QgYW5kIGNvcGxvdDoNCmBgYHtyfQ0KYm94cGxvdChsZW4gfiBzdXBwICogZG9zZSwgZGF0YT1Ub290aEdyb3d0aCwgeWxhYj0iVG9vdGggTGVuZ3RoIiwgbWFpbj0iQ29tcGFyaW5nIFRvb3RoIEdyb3d0aCBiZXR3ZWVuIGRpZmZlcmVudCBzdXBwbGVtZW50cyBhbmQgZGlmZmVyZW50IGRvc2lzIiwgY29sPWMoImJyb3duNCIsICJjb3JuZmxvd2VyYmx1ZSIsICJicm93bjQiLCAiY29ybmZsb3dlcmJsdWUiLCAiYnJvd240IiwgImNvcm5mbG93ZXJibHVlIikpDQpgYGANCg0KYGBge3J9DQpyZXF1aXJlKGdyYXBoaWNzKQ0KY29wbG90KGxlbiB+IGRvc2UgfCBzdXBwLCBkYXRhID0gVG9vdGhHcm93dGgsIHBhbmVsID0gcGFuZWwuc21vb3RoLHhsYWIgPSAiQ29tcGFyaW5nIFRvb3RoIEdyb3d0aCBiZXR3ZWVuIGRpZmZlcmVudCBzdXBwbGVtZW50cyBhbmQgZGlmZmVyZW50IGRvc2lzIiwgY29sPWMoInJveWFsYmx1ZTQiKSwgcGNoPTIxKQ0KYGBgDQoqMi4qIFByb3ZpZGUgYSBiYXNpYyBzdW1tYXJ5IG9mIHRoZSBkYXRhLg0KDQpBcyB3ZSBjYW4gc2VlIGluIHRoZSBwbG90cywgdGhlIGF2ZXJhZ2Ugb2YgdGhlIHRvb3RoIGxlbmd0aCBzZWVtcyB0byBpbmNyZWFzZSB3aXRoIHRoZSBzdXBwbGVtZW50IGRvc2lzLiANCnRoaXMgY2FuIG1lYW4gdGhhdCBpdCBtaWdodCBiZSBhIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIGFwcGx5aW5nIGEgc3VwcGxlbWVudCBkb3NpcyBhbmQgdGhlIHRvb3RoIGdyb3d0aC4gDQoNCkZ1cnRoZXIgZGF0YSBzdW1tYXJpZXM6DQpgYGB7cn0NCiMgYmFzaWMgaW5mbw0KaGVhZChUb290aEdyb3d0aCkNCm5yb3coVG9vdGhHcm93dGgpDQpzdW1tYXJ5KFRvb3RoR3Jvd3RoKQ0KYGBgDQoNCmBgYHtyfQ0KdGFibGUoVG9vdGhHcm93dGgkc3VwcCxUb290aEdyb3d0aCRkb3NlKQ0KYGBgDQoqMy4qIFVzZSBjb25maWRlbmNlIGludGVydmFscyBhbmQvb3IgaHlwb3RoZXNpcyB0ZXN0cyB0byBjb21wYXJlIHRvb3RoIGdyb3d0aCBieSBzdXBwIGFuZCBkb3NlLiAoT25seSB1c2UgdGhlIHRlY2huaXF1ZXMgZnJvbSBjbGFzcywgZXZlbiBpZiB0aGVyZSdzIG90aGVyIGFwcHJvYWNoZXMgd29ydGggY29uc2lkZXJpbmcpDQoNClNhbXBsZSBzaXplIGlzIG5vdCB0b28gYmlnLCB3ZSBzdWdnZXN0IFQgZGlzdHJpYnV0aW9uDQoNCmBgYHtyfQ0KdC50ZXN0KGxlbiB+IHN1cHAsIGRhdGEgPSBUb290aEdyb3d0aCkNCmBgYA0KDQoNCg0KQ29tcGFyaW5nIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIHR3byBzdXBwbGVtZW50cyBzaG93cyBubyBzdHJvbmcgZXZpZGVuY2UgdG8gcmVqZWN0IHRoZSBudWxsIGh5cG90aGVzaXMsIHNpbmNlIHRoZSBwLXZhbHVlIGlzIGJpZ2dlciB0aGFuIHRoZSA1JSBzaWduaWZpY2FuY2UgbGV2ZWwuDQoNCkhvd2V2ZXIsIGZvciB0aGlzIGRhdGFzZXQgaXQgaXMgaW1wb3J0YW50IHRvIGFsc28gY29tcGFyZSB0aGUgZGlmZmVyZW5jZXMgYmV0d2VlbiB0aGUgdGhlIGRpZmZlcmVudCBkb3NpcyBsZXZlbCwgc2luY2UgYmlnZ2VyIGRvc2lzIG1heSB5aWVsZCBjb250cmFkaWN0aW5nIGV2aWRlbmNlLg0KYGBge3J9DQp0LnRlc3QoVG9vdGhHcm93dGgkbGVuLCBUb290aEdyb3d0aCRkb3NlKQ0KYGBgDQoNCkNvbXBhcmluZyB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSB0d28gc3VwcGxlbWVudHMgc2hvd3MgZW5vdWdoIGV2aWRlbmNlIHRvIHJlamVjdCB0aGUgbnVsbCBoeXBvdGhlc2lzLCBzaW5jZSB0aGUgcC12YWx1ZSBhcHJveGltYXRlcyB0byAwLg0KDQoqKjQuKiogU3RhdGUgeW91ciBjb25jbHVzaW9ucyBhbmQgdGhlIGFzc3VtcHRpb25zIG5lZWRlZCBmb3IgeW91ciBjb25jbHVzaW9ucy4NCg0KQXMgYWxyZWFkeSBzdGF0ZWQsIHRoZXJlIGlzIG5vIGNvbnZpbmNpbmcgZXZpZGVuY2UgdGhhdCB0aGVyZSBpcyBhIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgdHdvIHR5cGUgb2Ygc3VwcGxlbWVudHMgYmFzZWQgb24gdGhlIGV4aXN0aW5nIGRhdGFzZXRzIGFuZCBUIHN0YXRpc3RpY3MuIG1lYW5pbmcgKip3ZSBmYWlsIHRvIHJlamVjdCB0aGUgX051bGwgaHlwb3RoZXNpc18gKEgwKS4qKg0KDQpIb3dldmVyLCB0aGVyZSBpcyBjb252aW5jaW5nIGV2aWRlbmNlIHRoYXQgdGhlcmUgaXMgYSBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIGRvc2lzIGxldmVsLCBhbmQgdGhlIGdyb3d0aC4gbWVhbmluZyAqKndlIHJlamVjdCB0aGUgX051bGwgaHlwb3RoZXNpc18gKEgwKSBpbiBmYXZvdXIgb2YgdGhlIGFsdGVybmF0aXZlIGh5cG90aGVzaXMgKEhhKS4qKg==