Problem 1
Simulate the Monty Hall game in R using the sample() function. Play the game 10,000 times never switching and record how often you win. Then play the game another 10,000 times always switching and record how often you win. Which strategy is better?
doors = 3
games = 10000
# Simulating the random door that the car is behind.
montyHall = sample(doors, games, replace = TRUE)
# Simulating the random player choice.
choice = sample(doors, games, replace = TRUE)
# This is the strategy of picking a door and not switching, as it just checks
# to see if the player's choice matches the door that the car is behind.
winA = 0 #Number of wins for this strategy, in this simulation.
for (i1 in 1:games)
{
if (montyHall[i1] == choice[i1])
{
winA = winA + 1
}
}
# This is the strategy of picking a door and switching,
winB = 0 #Number of wins for this strategy, in this simulation.
for (j1 in 1:games)
{
doorA = 0
doorB = 0
doorC = 0
# Determining which doors can be duds (goats)
if (montyHall[j1] == 1) # If car is behind door 1...
{
if (choice[j1] == 2){ # If car is behind door 1, and player chose door 2,
doorC = 1 # Door 3 must be the dud
}
else if (choice[j1] == 3){ # If car is behind door 1, and player chose door 3,
doorB = 1 # Door 2 must be the dud
}
else{ # If car is behind door 1, and player chose door 1,
doorB = 0.5 # Simulate a 50/50 to show a dud door
doorC = 0.5
}
}
else if (montyHall[j1] == 2) # If car is behind door 2...
{
if (choice[j1] == 1){
doorC = 1
}
else if (choice[j1] == 3){
doorA = 1
}
else{
doorA = 0.5
doorC = 0.5
}
}
else # If car is behind door 3...
{
if (choice[j1] == 1){
doorB = 1
}
else if (choice[j1] == 2){
doorA = 1
}
else{
doorA = 0.5
doorB = 0.5
}
}
# Selecting the guaranteed goat (built for 3 doors only)
goat = sample(doors, 1, prob = c(doorA, doorB, doorC))
# Formula for deciding which door to switch to (bulit for 3 doors only)
# Takes away the player's choice and the guaranteed goat from the sum of all doors, leaving the door to swap to
newDoor = 6 - goat - choice[j1]
if (montyHall[j1] == newDoor)
{
winB = winB + 1
}
}
print(winA)
[1] 3352
print(winB)
[1] 6648
The second (switching) strategy wins about twice as much as the first (staying) strategy.
Problem 2
NO FORECAST:
u <- function(a,x){return ((-5*(a-x)*(x<=a)) + (-35*(x-a)*(x>a)))}
p <- c(4,15,35,5,5,5,5,20,3,3)/100
milksum = 0
for(ordered in 1:10)
{
for (used in 1:10)
{
milksum = milksum + p[used] * u(ordered, used)
}
print(paste(c(ordered, "ordered gallons: Expected Utility =", milksum), collapse = " "))
milksum = 0
}
[1] "1 ordered gallons: Expected Utility = -128.1"
[1] "2 ordered gallons: Expected Utility = -94.7"
[1] "3 ordered gallons: Expected Utility = -67.3"
[1] "4 ordered gallons: Expected Utility = -53.9"
[1] "5 ordered gallons: Expected Utility = -42.5"
[1] "6 ordered gallons: Expected Utility = -33.1"
[1] "7 ordered gallons: Expected Utility = -25.7"
[1] "8 ordered gallons: Expected Utility = -20.3"
[1] "9 ordered gallons: Expected Utility = -22.9"
[1] "10 ordered gallons: Expected Utility = -26.7"
RAINY FORECAST:
p2 <- c(0,0,0,0,0,1,2,15,1,1)/20
milksum2 = 0
for(ordered2 in 1:10)
{
for (used2 in 1:10)
{
milksum2 = milksum2 + p2[used2] * u(ordered2, used2)
}
print(paste(c(ordered2, "ordered gallons: Expected Utility =", milksum2), collapse = " "))
milksum2 = 0
}
[1] "1 ordered gallons: Expected Utility = -243.25"
[1] "2 ordered gallons: Expected Utility = -208.25"
[1] "3 ordered gallons: Expected Utility = -173.25"
[1] "4 ordered gallons: Expected Utility = -138.25"
[1] "5 ordered gallons: Expected Utility = -103.25"
[1] "6 ordered gallons: Expected Utility = -68.25"
[1] "7 ordered gallons: Expected Utility = -35.25"
[1] "8 ordered gallons: Expected Utility = -6.25"
[1] "9 ordered gallons: Expected Utility = -7.25"
[1] "10 ordered gallons: Expected Utility = -10.25"
Ordering 8 gallons is optimal for both forecasted rainy days and days where the weather is unknown. However, the best expected utility is much more concentrated around 8 on rainy days, rather than unknown days where it would be similar to order 7 or 9 gallons.
Problem 3
Answer the following statements TRUE or FALSE, providing a succinct explanation of your reasoning.
- You roll two fair three-sided dice. The probability the two dice show the same number is 1/3.
TRUE
P(dice show same number) = 3 different numbers * P(any individual number is shown on both dice)
P(dice show same number) = 3 * 1/9 = 3/9 = 1/3
- If events A and B are independent and P(A) > 0 and P(B) > 0, then P(A and B) > 0.
TRUE
Since A and B are independent, P(A and B) = P(A)P(B)
P(A)P(B) > 0, therefore P(A and B) > 0
- If two events A and B are independent and P(A) > 0 and P(B) > 0, then A and B cannot be mutually exclusive.
TRUE
If two events are independent, they cannot be mutually exclusive. Mutually exclusive means the events cannot happen at the same time–that would make the events dependent.
- If P(A and B) ≥ 0.4, then P(A) ≤ 0.40.
FALSE
The contrapositive can be disproven by a counterexample. The contrapositive is: “If P(A) > 0.40, then P(A and B) < .4”. Say that P(A) = .41 > .40, and P(B) = 1. Assuming the events are independent, P(A and B) = P(A)P(B) = .41, which is not < .4. Since the contrapositive is disproven, the statement is also disproven.
Problem 4

Problem 5

Problem 6

Problem 7

Problem 8

Problem 9

Problem 10

Problem 11

Problem 12
- Find the mean payoffs of the two different drilling strategies.
Standard: .2(20) + .5(30) + .3(50) = 4 + 15 + 15 = $34 million
Horizontal: .2(-20) + .5(40) + .3(90) = -4 + 20 + 27 = $43 million
- Find the variance in payoffs of each strategy.
Var(X) = E(X^2) - (E(X))^2
Standard: E(X^2) = .2(400) + .5(900) + .3(2500) = 80 + 450 + 750 = 1280
V(Standard) = 1280 - (34)^2 = 124 million dollars^2
Horizontal: E(X^2) = .2(400) + .5(1600) + .3(8100) = 80 + 800 + 2430 = 3310
V(Horizontal) = 3310 - (43)^2 = 1,461 million dollars^2
- Which strategy would you advocate for and why?
I would advocate for Standard Drilling, as the variance for Horizontal Drilling is way too high. The units of measurement are millions of dollars, which means that a much higher variance is just way too costly if drilling were to go poorly.
- How much are you willing to pay for a geological evaluation that would determine with certainty the quantity of oil at the site prior to drilling?
Maximum you would pay is $4.5 million, as that is the difference in expected values of the two different types of drilling, divided by the number of types of drilling, 2. However, then you would be expected to make no profit, so you should pay slightly less, such as $4 million.
Problem 13

Problem 14
- Find the probability of a miscarriage, given that you are a low risk individual. To figure this out, write the overall probability of miscarriage using the law of total probability; then solve for P(M | L).
P(M) = P(M | L) * P(L) + P(M | not-L) * P(not-L)
.15 = P(M | L) * (.98) + .80(.02)
P(M | L) = (.15 - .016)/.98
P(M | L) ≈ .1367 = 13.67%
- Use Bayes rule to calculate the probability of being a high risk individual, given that you had a first miscarriage.
P(not-L | M) = (P(M | not-L) * P(not-L))/P(M)
P(not-L | M) = (.80*.02)/.15
P(not-L | M) ≈ .1067 = 10.67%
- Now that you know P(not-L | M) (from above), apply the law of total probability again to determine the probability of a second miscarriage. You may assume that, conditional on mother type (high or low risk), subsequent miscarriages are independent.
P(M2) = P(M | L) * P(L) * P(L | M) + P(M | not-L) * P(not-L) * P(not-L | M)
P(M2) ≈ .1367 * .98 * .8933 + .80 * .02 * .1067
P(M2) ≈ .1197 + .0017 =
.1214 = 12.14%
Problem 15
A friend claims she can tell the difference between Evian and Dasani bottled water brands. To test her, you give her a blind taste test at lunch seven days in a row, where you randomly pick a bottle and have her try it blindfolded and she attempts to identify the brand. She gets a correct classification on five of the seven days.
- To evaluate the strength of this evidence towards proving her claim, assume to the contrary that the probability of her getting a correct classification is p = 1/2. What is the probability of her getting five correct in seven tries under this assumption?
Binomial Distribution: P(5 of 7) = (7 choose 5) * (1/2)^5 * (1/2)^2 = 21 * (1/128) ≈ .1641
The probability is about 16.41%
- What is the probability of getting five or more classifications correct, again under the assumption that she really is unable to tell the difference (p = 1/2)?
print(1 - pbinom(4,7,.5))
[1] 0.2265625
The probability is about 22.66%
- Now, suppose you run the experiment an additional three weeks, for a total of 28 tests. Suppose she gets a total of 20 out of 28 correct. Again assuming p = 1/2, what is the probability of getting this many or more classifications correct? (You can use the R command pbinom(y,n,p) to compute your answer, where n is the number of trials, y is the number of successes in n trials with success probability p.)
print(1 - pbinom(19,28,.5))
[1] 0.01784907
The probability is about 01.78%
- Explain in words why the answer to the previous two questions are different, even though in both cases your friend gets 5/7 = 20/28 ≈ 71.4% of her guesses correct. What probability idea does this illustrate?
As the number of trials increases, the experimental probability should trend towards reflecting the true probability. The variance should decrease, but the mean should stay the same. This reflects the Law of Large Numbers
Problem 16
Problem 17
85%. The student should not fall victim to the Gambler’s Paradox, and their expected score should not change.
Problem 18
- What is the probability I make my first three putts but miss my fourth?
P(WWWL) = (.7)^3 * (.3) = .1029 = 10.29%
- What is the probability I make exactly three putts in my first four attempts? Why is this answer different from the previous one?
P(X = 3) = (4 3) * ((P(W))^3) * (1 - P(W))^1 = .4116 = 41.16%
The probability is exactly 4 times larger because the one miss can happen in any of the four putts instead of just the last one.
- What is the probability that my brother makes more than half of his first four putts?
P(Y > 2) = (4 3) * ((P(W))^3) * (1 - P(W))^1 + (4 4) * ((P(W))^4) = 4 * (.8)^3 * (.2) + (.8)^4
P(Y > 2) = .4096 + .4096 = .8192 = 81.92%
- The game calls for us to each attempt 100 putts, after which we settle up at the price of $5 per putt. What is the expected amount I will owe my brother?
For: 100 putts,
E(Y - X) = E(Y) - E(X) = 100(.8) - 100(.7) = 10
On average, he will make 10 more puts per 100 than you, and you will owe him $50.
- Use the normal approximation to the binomial distribution (applied twice), as well as the fact that linear combinations of normal distributions are again normally distributed, to find the probability that I will win. Determine the answer approximately using the “empirical rule”; compare this to the exact answer found using the pnorm(y,mu,sigma) command in R.
Problem 19

Problem 20
The p-value is small, coming in at <.00001. This was based on a one-sided interval, as the shift in headache timing was not trying to get in a certain range of acceptable times. Rather, it was just testing a one-sided shift from placebo.
As long as my previous answer was correct, the new drug is statistically significantly better than placebo , since p < .00001, which is < .05.
I would recommend collecting more data to test the drug’s efficacy. A sample size of 100 is too small to judge the efficacy (and also the safety!) of a drug that may be given to millions of patients or over-the-counter customers. The same study needs to be performed with a much larger group.
I would NOT proceed with the development of the drug, as stated in the previous answer. Additional tests must be done with more people, perhaps more than once, which should reduce the variability of the experiment.
Problem 21
The scientists are misusing the idea of statistical significance to claim that jelly beans are linked to acne. While almost all of the test variables concluded that there was no link, they used one statistically significant factor to prove a potentially false hypothesis that they had.
Problem 22

Problem 23
Problem 24
Problem 25
Problem 26
Problem 27
Problem 28
library(glmnet)
data(iris)
x = as.matrix(iris[,-5])
y = iris[,5] == "versicolor"
cvob1 = cv.glmnet(x,y,family = "binomial", type.measure = "class", alpha = 1, nfolds = 5)
plot(cvob1)

y = iris[,5] == "setosa"
cvob1 = cv.glmnet(x,y,family = "binomial", type.measure = "class", alpha = 1, nfolds = 5)
plot(cvob1)

y = iris[,5] == "virginica"
cvob1 = cv.glmnet(x,y,family = "binomial", type.measure = "class", alpha = 1, nfolds = 5)
plot(cvob1)

LS0tDQp0aXRsZTogIkRBVCA0MDEgUHJvYmxlbSBTZXQiDQphdXRob3I6ICJDb25ub3IgR3JlaWciDQpkYXRlOiAiRmFsbCAyMDIxIg0Kb3V0cHV0OiBodG1sX25vdGVib29rDQotLS0NCg0KIyBQcm9ibGVtIDENClNpbXVsYXRlIHRoZSBNb250eSBIYWxsIGdhbWUgaW4gUiB1c2luZyB0aGUgc2FtcGxlKCkgZnVuY3Rpb24uIFBsYXkgdGhlIGdhbWUgMTAsMDAwIA0KdGltZXMgbmV2ZXIgc3dpdGNoaW5nIGFuZCByZWNvcmQgaG93IG9mdGVuIHlvdSB3aW4uIFRoZW4gcGxheSB0aGUgZ2FtZSBhbm90aGVyIDEwLDAwMA0KdGltZXMgYWx3YXlzIHN3aXRjaGluZyBhbmQgcmVjb3JkIGhvdyBvZnRlbiB5b3Ugd2luLiBXaGljaCBzdHJhdGVneSBpcyBiZXR0ZXI/DQoNCmBgYHtyfQ0KZG9vcnMgPSAzDQpnYW1lcyA9IDEwMDAwDQoNCiMgU2ltdWxhdGluZyB0aGUgcmFuZG9tIGRvb3IgdGhhdCB0aGUgY2FyIGlzIGJlaGluZC4NCm1vbnR5SGFsbCA9IHNhbXBsZShkb29ycywgZ2FtZXMsIHJlcGxhY2UgPSBUUlVFKQ0KDQojIFNpbXVsYXRpbmcgdGhlIHJhbmRvbSBwbGF5ZXIgY2hvaWNlLg0KY2hvaWNlID0gc2FtcGxlKGRvb3JzLCBnYW1lcywgcmVwbGFjZSA9IFRSVUUpDQoNCg0KIyBUaGlzIGlzIHRoZSBzdHJhdGVneSBvZiBwaWNraW5nIGEgZG9vciBhbmQgbm90IHN3aXRjaGluZywgYXMgaXQganVzdCBjaGVja3MgDQojIHRvIHNlZSBpZiB0aGUgcGxheWVyJ3MgY2hvaWNlIG1hdGNoZXMgdGhlIGRvb3IgdGhhdCB0aGUgY2FyIGlzIGJlaGluZC4NCndpbkEgPSAwICAgICAgICAgICAgICAgICAgICAgICAgICAjTnVtYmVyIG9mIHdpbnMgZm9yIHRoaXMgc3RyYXRlZ3ksIGluIHRoaXMgc2ltdWxhdGlvbi4NCmZvciAoaTEgaW4gMTpnYW1lcykNCnsNCiAgaWYgKG1vbnR5SGFsbFtpMV0gPT0gY2hvaWNlW2kxXSkNCiAgew0KICAgICAgd2luQSA9IHdpbkEgKyAxDQogIH0NCn0NCg0KDQojIFRoaXMgaXMgdGhlIHN0cmF0ZWd5IG9mIHBpY2tpbmcgYSBkb29yIGFuZCBzd2l0Y2hpbmcsDQp3aW5CID0gMCAgICAgICAgICAgICAgICAgICAgICAgICAgI051bWJlciBvZiB3aW5zIGZvciB0aGlzIHN0cmF0ZWd5LCBpbiB0aGlzIHNpbXVsYXRpb24uDQpmb3IgKGoxIGluIDE6Z2FtZXMpDQp7DQogIGRvb3JBID0gMA0KICBkb29yQiA9IDANCiAgZG9vckMgPSAwDQogIA0KICAjIERldGVybWluaW5nIHdoaWNoIGRvb3JzIGNhbiBiZSBkdWRzIChnb2F0cykNCiAgaWYgKG1vbnR5SGFsbFtqMV0gPT0gMSkgICAgICAgICAjIElmIGNhciBpcyBiZWhpbmQgZG9vciAxLi4uDQogIHsNCiAgICBpZiAoY2hvaWNlW2oxXSA9PSAyKXsgICAgICAgICAjIElmIGNhciBpcyBiZWhpbmQgZG9vciAxLCBhbmQgcGxheWVyIGNob3NlIGRvb3IgMiwNCiAgICAgIGRvb3JDID0gMSAgICAgICAgICAgICAgICAgICAjIERvb3IgMyBtdXN0IGJlIHRoZSBkdWQNCiAgICB9DQogICAgZWxzZSBpZiAoY2hvaWNlW2oxXSA9PSAzKXsgICAgIyBJZiBjYXIgaXMgYmVoaW5kIGRvb3IgMSwgYW5kIHBsYXllciBjaG9zZSBkb29yIDMsDQogICAgICBkb29yQiA9IDEgICAgICAgICAgICAgICAgICAgIyBEb29yIDIgbXVzdCBiZSB0aGUgZHVkDQogICAgfQ0KICAgIGVsc2V7ICAgICAgICAgICAgICAgICAgICAgICAgICMgSWYgY2FyIGlzIGJlaGluZCBkb29yIDEsIGFuZCBwbGF5ZXIgY2hvc2UgZG9vciAxLA0KICAgICAgZG9vckIgPSAwLjUgICAgICAgICAgICAgICAgICMgU2ltdWxhdGUgYSA1MC81MCB0byBzaG93IGEgZHVkIGRvb3INCiAgICAgIGRvb3JDID0gMC41ICAgICAgICAgICAgICAgICAgICAgICAgICANCiAgICB9DQogIH0NCiAgDQogIGVsc2UgaWYgKG1vbnR5SGFsbFtqMV0gPT0gMikgICAgIyBJZiBjYXIgaXMgYmVoaW5kIGRvb3IgMi4uLg0KICB7DQogICAgaWYgKGNob2ljZVtqMV0gPT0gMSl7DQogICAgICBkb29yQyA9IDENCiAgICB9DQogICAgZWxzZSBpZiAoY2hvaWNlW2oxXSA9PSAzKXsNCiAgICAgIGRvb3JBID0gMQ0KICAgIH0NCiAgICBlbHNlew0KICAgICAgZG9vckEgPSAwLjUNCiAgICAgIGRvb3JDID0gMC41DQogICAgfQ0KICB9DQogIA0KICBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgSWYgY2FyIGlzIGJlaGluZCBkb29yIDMuLi4NCiAgew0KICAgIGlmIChjaG9pY2VbajFdID09IDEpew0KICAgICAgZG9vckIgPSAxDQogICAgfQ0KICAgIGVsc2UgaWYgKGNob2ljZVtqMV0gPT0gMil7DQogICAgICBkb29yQSA9IDENCiAgICB9DQogICAgZWxzZXsNCiAgICAgIGRvb3JBID0gMC41DQogICAgICBkb29yQiA9IDAuNQ0KICAgIH0NCiAgfQ0KICANCiAgIyBTZWxlY3RpbmcgdGhlIGd1YXJhbnRlZWQgZ29hdCAoYnVpbHQgZm9yIDMgZG9vcnMgb25seSkNCiAgZ29hdCA9IHNhbXBsZShkb29ycywgMSwgcHJvYiA9IGMoZG9vckEsIGRvb3JCLCBkb29yQykpDQogICMgRm9ybXVsYSBmb3IgZGVjaWRpbmcgd2hpY2ggZG9vciB0byBzd2l0Y2ggdG8gKGJ1bGl0IGZvciAzIGRvb3JzIG9ubHkpDQogICMgVGFrZXMgYXdheSB0aGUgcGxheWVyJ3MgY2hvaWNlIGFuZCB0aGUgZ3VhcmFudGVlZCBnb2F0IGZyb20gdGhlIHN1bSBvZiBhbGwgZG9vcnMsIGxlYXZpbmcgdGhlIGRvb3IgdG8gc3dhcCB0bw0KICBuZXdEb29yID0gNiAtIGdvYXQgLSBjaG9pY2VbajFdDQogIGlmIChtb250eUhhbGxbajFdID09IG5ld0Rvb3IpDQogIHsNCiAgICAgIHdpbkIgPSB3aW5CICsgMQ0KICB9DQp9DQoNCg0KcHJpbnQod2luQSkNCnByaW50KHdpbkIpDQpgYGANCg0KPGI+VGhlIHNlY29uZCAoc3dpdGNoaW5nKSBzdHJhdGVneSB3aW5zIGFib3V0IHR3aWNlIGFzIG11Y2ggYXMgdGhlIGZpcnN0IChzdGF5aW5nKSBzdHJhdGVneS48Yj4NCg0KDQojIFByb2JsZW0gMg0KDQo8Yj5OTyBGT1JFQ0FTVDo8Yj4NCmBgYHtyfQ0KdSA8LSBmdW5jdGlvbihhLHgpe3JldHVybiAoKC01KihhLXgpKih4PD1hKSkgKyAoLTM1Kih4LWEpKih4PmEpKSl9DQoNCnAgPC0gYyg0LDE1LDM1LDUsNSw1LDUsMjAsMywzKS8xMDANCg0KbWlsa3N1bSA9IDANCg0KZm9yKG9yZGVyZWQgaW4gMToxMCkNCnsNCiAgZm9yICh1c2VkIGluIDE6MTApDQogIHsNCiAgICBtaWxrc3VtID0gbWlsa3N1bSArIHBbdXNlZF0gKiB1KG9yZGVyZWQsIHVzZWQpDQogIH0NCiAgcHJpbnQocGFzdGUoYyhvcmRlcmVkLCAib3JkZXJlZCBnYWxsb25zOiBFeHBlY3RlZCBVdGlsaXR5ID0iLCBtaWxrc3VtKSwgY29sbGFwc2UgPSAiICIpKQ0KICBtaWxrc3VtID0gMA0KfQ0KYGBgDQo8Yj5SQUlOWSBGT1JFQ0FTVDo8Yj4NCg0KYGBge3J9DQpwMiA8LSBjKDAsMCwwLDAsMCwxLDIsMTUsMSwxKS8yMA0KDQptaWxrc3VtMiA9IDANCg0KZm9yKG9yZGVyZWQyIGluIDE6MTApDQp7DQogIGZvciAodXNlZDIgaW4gMToxMCkNCiAgew0KICAgIG1pbGtzdW0yID0gbWlsa3N1bTIgKyBwMlt1c2VkMl0gKiB1KG9yZGVyZWQyLCB1c2VkMikNCiAgfQ0KICBwcmludChwYXN0ZShjKG9yZGVyZWQyLCAib3JkZXJlZCBnYWxsb25zOiBFeHBlY3RlZCBVdGlsaXR5ID0iLCBtaWxrc3VtMiksIGNvbGxhcHNlID0gIiAiKSkNCiAgbWlsa3N1bTIgPSAwDQp9DQpgYGANCjxiPk9yZGVyaW5nIDggZ2FsbG9ucyBpcyBvcHRpbWFsIGZvciBib3RoIGZvcmVjYXN0ZWQgcmFpbnkgZGF5cyBhbmQgZGF5cyB3aGVyZSB0aGUgd2VhdGhlciBpcyB1bmtub3duLiBIb3dldmVyLCB0aGUgYmVzdCBleHBlY3RlZCB1dGlsaXR5IGlzIG11Y2ggbW9yZSBjb25jZW50cmF0ZWQgYXJvdW5kIDggb24gcmFpbnkgZGF5cywgcmF0aGVyIHRoYW4gdW5rbm93biBkYXlzIHdoZXJlIGl0IHdvdWxkIGJlIHNpbWlsYXIgdG8gb3JkZXIgNyBvciA5IGdhbGxvbnMuPGI+DQoNCiMgUHJvYmxlbSAzDQoNCkFuc3dlciB0aGUgZm9sbG93aW5nIHN0YXRlbWVudHMgVFJVRSBvciBGQUxTRSwgcHJvdmlkaW5nIGEgc3VjY2luY3QgZXhwbGFuYXRpb24NCm9mIHlvdXIgcmVhc29uaW5nLg0KDQogIChhKSBZb3Ugcm9sbCB0d28gZmFpciB0aHJlZS1zaWRlZCBkaWNlLiBUaGUgcHJvYmFiaWxpdHkgdGhlIHR3byBkaWNlIHNob3cgdGhlIHNhbWUNCiAgbnVtYmVyIGlzIDEvMy4NCiAgDQogICoqVFJVRSoqPGJyPg0KICAqKlAoZGljZSBzaG93IHNhbWUgbnVtYmVyKSA9IDMgZGlmZmVyZW50IG51bWJlcnMgKiBQKGFueSBpbmRpdmlkdWFsIG51bWJlciBpcyBzaG93biBvbiBib3RoIGRpY2UpKio8YnI+DQogICoqUChkaWNlIHNob3cgc2FtZSBudW1iZXIpID0gMyAqIDEvOSA9IDMvOSA9IDEvMyoqDQogIA0KICAoYikgSWYgZXZlbnRzIEEgYW5kIEIgYXJlIGluZGVwZW5kZW50IGFuZCBQKEEpID4gMCBhbmQgUChCKSA+IDAsIHRoZW4gUChBIGFuZCBCKSA+IDAuDQogIA0KICAqKlRSVUUqKjxicj4NCiAgKipTaW5jZSBBIGFuZCBCIGFyZSBpbmRlcGVuZGVudCwgUChBIGFuZCBCKSA9IFAoQSlQKEIpKio8YnI+DQogICoqUChBKVAoQikgPiAwLCB0aGVyZWZvcmUgUChBIGFuZCBCKSA+IDAqKg0KICANCiAgKGMpIElmIHR3byBldmVudHMgQSBhbmQgQiBhcmUgaW5kZXBlbmRlbnQgYW5kIFAoQSkgPiAwIGFuZCBQKEIpID4gMCwgdGhlbiBBIGFuZCBCIGNhbm5vdCBiZSBtdXR1YWxseSBleGNsdXNpdmUuDQogIA0KICAqKlRSVUUqKjxicj4NCiAgKipJZiB0d28gZXZlbnRzIGFyZSBpbmRlcGVuZGVudCwgdGhleSBjYW5ub3QgYmUgbXV0dWFsbHkgZXhjbHVzaXZlLiBNdXR1YWxseSBleGNsdXNpdmUgbWVhbnMgdGhlIGV2ZW50cyBjYW5ub3QgICAgaGFwcGVuIGF0IHRoZSBzYW1lIHRpbWUtLXRoYXQgd291bGQgbWFrZSB0aGUgZXZlbnRzIGRlcGVuZGVudC4qKg0KICANCiAgKGQpIElmIFAoQSBhbmQgQikg4omlIDAuNCwgdGhlbiBQKEEpIOKJpCAwLjQwLg0KICANCiAgKipGQUxTRSoqPGJyPg0KICAqKlRoZSBjb250cmFwb3NpdGl2ZSBjYW4gYmUgZGlzcHJvdmVuIGJ5IGEgY291bnRlcmV4YW1wbGUuIFRoZSBjb250cmFwb3NpdGl2ZSBpczogIklmIFAoQSkgPiAwLjQwLCB0aGVuIFAoQSBhbmQgICBCKSA8IC40Ii4gU2F5IHRoYXQgUChBKSA9IC40MSA+IC40MCwgYW5kIFAoQikgPSAxLiBBc3N1bWluZyB0aGUgZXZlbnRzIGFyZSBpbmRlcGVuZGVudCwgUChBIGFuZCBCKSA9IFAoQSlQKEIpID0gICAgIC40MSwgd2hpY2ggaXMgbm90IDwgLjQuIFNpbmNlIHRoZSBjb250cmFwb3NpdGl2ZSBpcyBkaXNwcm92ZW4sIHRoZSBzdGF0ZW1lbnQgaXMgYWxzbyBkaXNwcm92ZW4uKioNCiAgDQojIFByb2JsZW0gNA0KDQohW10ocHJvYmxlbVNldC9pbWFnZXMvcHJvYmxlbTQucG5nKQ0KDQojIFByb2JsZW0gNQ0KDQohW10ocHJvYmxlbVNldC9pbWFnZXMvcHJvYmxlbTUucG5nKQ0KDQojIFByb2JsZW0gNg0KDQohW10ocHJvYmxlbVNldC9pbWFnZXMvcHJvYmxlbTYucG5nKQ0KDQojIFByb2JsZW0gNw0KDQohW10ocHJvYmxlbVNldC9pbWFnZXMvcHJvYmxlbTcucG5nKQ0KDQojIFByb2JsZW0gOA0KDQohW10ocHJvYmxlbVNldC9pbWFnZXMvcHJvYmxlbTgucG5nKQ0KDQojIFByb2JsZW0gOQ0KDQohW10ocHJvYmxlbVNldC9pbWFnZXMvcHJvYmxlbTkucG5nKQ0KDQojIFByb2JsZW0gMTANCg0KIVtdKHByb2JsZW1TZXQvaW1hZ2VzL3Byb2JsZW0xMC5wbmcpDQoNCiMgUHJvYmxlbSAxMQ0KDQohW10ocHJvYmxlbVNldC9pbWFnZXMvcHJvYmxlbTExLnBuZykNCg0KIyBQcm9ibGVtIDEyDQoNCiAgKGEpIEZpbmQgdGhlIG1lYW4gcGF5b2ZmcyBvZiB0aGUgdHdvIGRpZmZlcmVudCBkcmlsbGluZyBzdHJhdGVnaWVzLg0KICANCiAgKipTdGFuZGFyZDogLjIoMjApICsgLjUoMzApICsgLjMoNTApID0gNCArIDE1ICsgMTUgPSAkMzQgbWlsbGlvbioqPGJyPg0KICAqKkhvcml6b250YWw6IC4yKC0yMCkgKyAuNSg0MCkgKyAuMyg5MCkgPSAtNCArIDIwICsgMjcgPSAkNDMgbWlsbGlvbioqDQogIA0KICAoYikgRmluZCB0aGUgdmFyaWFuY2UgaW4gcGF5b2ZmcyBvZiBlYWNoIHN0cmF0ZWd5Lg0KDQogICoqVmFyKFgpID0gRShYXjIpIC0gKEUoWCkpXjIqKjxicj4NCiAgKipTdGFuZGFyZDogRShYXjIpID0gLjIoNDAwKSArIC41KDkwMCkgKyAuMygyNTAwKSA9IDgwICsgNDUwICsgNzUwID0gMTI4MCoqPGJyPg0KICAgICoqVihTdGFuZGFyZCkgPSAxMjgwIC0gKDM0KV4yID0gMTI0IG1pbGxpb24gZG9sbGFyc14yKio8YnI+DQogICAgDQogICoqSG9yaXpvbnRhbDogRShYXjIpID0gLjIoNDAwKSArIC41KDE2MDApICsgLjMoODEwMCkgPSA4MCArIDgwMCArIDI0MzAgPSAzMzEwKio8YnI+DQogICAgKipWKEhvcml6b250YWwpID0gMzMxMCAtICg0MyleMiA9IDEsNDYxIG1pbGxpb24gZG9sbGFyc14yKio8YnI+DQogIA0KICAoYykgV2hpY2ggc3RyYXRlZ3kgd291bGQgeW91IGFkdm9jYXRlIGZvciBhbmQgd2h5Pw0KDQogICoqSSB3b3VsZCBhZHZvY2F0ZSBmb3IgU3RhbmRhcmQgRHJpbGxpbmcsIGFzIHRoZSB2YXJpYW5jZSBmb3IgSG9yaXpvbnRhbCBEcmlsbGluZyBpcyB3YXkgdG9vIGhpZ2guIFRoZSB1bml0cyAgICAgb2YgbWVhc3VyZW1lbnQgYXJlIG1pbGxpb25zIG9mIGRvbGxhcnMsIHdoaWNoIG1lYW5zIHRoYXQgYSBtdWNoIGhpZ2hlciB2YXJpYW5jZSBpcyBqdXN0IHdheSB0b28gY29zdGx5IGlmICAgICAgICBkcmlsbGluZyB3ZXJlIHRvIGdvIHBvb3JseS4qKg0KICANCiAgKGQpIEhvdyBtdWNoIGFyZSB5b3Ugd2lsbGluZyB0byBwYXkgZm9yIGEgZ2VvbG9naWNhbCBldmFsdWF0aW9uIHRoYXQgd291bGQgZGV0ZXJtaW5lDQogIHdpdGggY2VydGFpbnR5IHRoZSBxdWFudGl0eSBvZiBvaWwgYXQgdGhlIHNpdGUgcHJpb3IgdG8gZHJpbGxpbmc/DQogIA0KICAqKk1heGltdW0geW91IHdvdWxkIHBheSBpcyAkNC41IG1pbGxpb24sIGFzIHRoYXQgaXMgdGhlIGRpZmZlcmVuY2UgaW4gZXhwZWN0ZWQgdmFsdWVzIG9mIHRoZSB0d28gZGlmZmVyZW50IHR5cGVzIG9mIGRyaWxsaW5nLCBkaXZpZGVkIGJ5IHRoZSBudW1iZXIgb2YgdHlwZXMgb2YgZHJpbGxpbmcsIDIuIEhvd2V2ZXIsIHRoZW4geW91IHdvdWxkIGJlIGV4cGVjdGVkIHRvIG1ha2Ugbm8gcHJvZml0LCBzbyB5b3Ugc2hvdWxkIHBheSBzbGlnaHRseSBsZXNzLCBzdWNoIGFzICQ0IG1pbGxpb24uKioNCg0KIyBQcm9ibGVtIDEzDQoNCiFbXShwcm9ibGVtU2V0L2ltYWdlcy9wcm9ibGVtMTMucG5nKQ0KDQojIFByb2JsZW0gMTQNCg0KDQooYSkgRmluZCB0aGUgcHJvYmFiaWxpdHkgb2YgYSBtaXNjYXJyaWFnZSwgZ2l2ZW4gdGhhdCB5b3UgYXJlIGEgbG93IHJpc2sgaW5kaXZpZHVhbC4gVG8NCmZpZ3VyZSB0aGlzIG91dCwgd3JpdGUgdGhlIG92ZXJhbGwgcHJvYmFiaWxpdHkgb2YgbWlzY2FycmlhZ2UgdXNpbmcgdGhlIGxhdyBvZiB0b3RhbA0KcHJvYmFiaWxpdHk7IHRoZW4gc29sdmUgZm9yIFAoTSB8IEwpLg0KDQo8Yj5QKE0pID0gUChNIHwgTCkgKiBQKEwpICsgUChNIHwgbm90LUwpICogUChub3QtTCk8YnI+DQouMTUgPSBQKE0gfCBMKSAqICguOTgpICsgLjgwKC4wMik8YnI+DQpQKE0gfCBMKSA9ICguMTUgLSAuMDE2KS8uOTg8YnI+DQpQKE0gfCBMKSDiiYggLjEzNjcgPSAxMy42NyU8L2I+DQoNCihiKSBVc2UgQmF5ZXMgcnVsZSB0byBjYWxjdWxhdGUgdGhlIHByb2JhYmlsaXR5IG9mIGJlaW5nIGEgaGlnaCByaXNrIGluZGl2aWR1YWwsIGdpdmVuDQp0aGF0IHlvdSBoYWQgYSBmaXJzdCBtaXNjYXJyaWFnZS4NCg0KPGI+UChub3QtTCB8IE0pID0gKFAoTSB8IG5vdC1MKSAqIFAobm90LUwpKS9QKE0pPGJyPg0KUChub3QtTCB8IE0pID0gKC44MCouMDIpLy4xNTxicj4NClAobm90LUwgfCBNKSDiiYggLjEwNjcgPSAxMC42NyU8L2I+DQoNCg0KKGMpIE5vdyB0aGF0IHlvdSBrbm93IFAobm90LUwgfCBNKSAoZnJvbSBhYm92ZSksIGFwcGx5IHRoZSBsYXcgb2YgdG90YWwgcHJvYmFiaWxpdHkNCmFnYWluIHRvIGRldGVybWluZSB0aGUgcHJvYmFiaWxpdHkgb2YgYSBzZWNvbmQgbWlzY2FycmlhZ2UuIFlvdSBtYXkgYXNzdW1lDQp0aGF0LCBjb25kaXRpb25hbCBvbiBtb3RoZXIgdHlwZSAoaGlnaCBvciBsb3cgcmlzayksIHN1YnNlcXVlbnQgbWlzY2FycmlhZ2VzIGFyZQ0KaW5kZXBlbmRlbnQuDQoNCjxiPlAoTTIpID0gUChNIHwgTCkgKiBQKEwpICogUChMIHwgTSkgKyBQKE0gfCBub3QtTCkgKiBQKG5vdC1MKSAqIFAobm90LUwgfCBNKTxicj4NClAoTTIpIOKJiCAgICAgIC4xMzY3ICAqIC45OCAgKiAgIC44OTMzICArICAgICAuODAgICAgICAqIC4wMiAgICAgICogICAgIC4xMDY3ICAgPGJyPg0KUChNMikg4omIICAgICAgICAgICAgICAuMTE5NyAgICAgICAgICAgICsgICAgICAgICAgICAgLjAwMTcgPTxicj4NCi4xMjE0ID0gMTIuMTQlPC9iPiANCg0KIyBQcm9ibGVtIDE1DQogIA0KQSBmcmllbmQgY2xhaW1zIHNoZSBjYW4gdGVsbCB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIEV2aWFuIGFuZCBEYXNhbmkgYm90dGxlZCB3YXRlcg0KYnJhbmRzLiBUbyB0ZXN0IGhlciwgeW91IGdpdmUgaGVyIGEgYmxpbmQgdGFzdGUgdGVzdCBhdCBsdW5jaCBzZXZlbiBkYXlzIGluIGEgcm93LCB3aGVyZQ0KeW91IHJhbmRvbWx5IHBpY2sgYSBib3R0bGUgYW5kIGhhdmUgaGVyIHRyeSBpdCBibGluZGZvbGRlZCBhbmQgc2hlIGF0dGVtcHRzIHRvIGlkZW50aWZ5DQp0aGUgYnJhbmQuIFNoZSBnZXRzIGEgY29ycmVjdCBjbGFzc2lmaWNhdGlvbiBvbiBmaXZlIG9mIHRoZSBzZXZlbiBkYXlzLiAgDQogIA0KICAoYSkgVG8gZXZhbHVhdGUgdGhlIHN0cmVuZ3RoIG9mIHRoaXMgZXZpZGVuY2UgdG93YXJkcyBwcm92aW5nIGhlciBjbGFpbSwgYXNzdW1lIHRvDQogIHRoZSBjb250cmFyeSB0aGF0IHRoZSBwcm9iYWJpbGl0eSBvZiBoZXIgZ2V0dGluZyBhIGNvcnJlY3QgY2xhc3NpZmljYXRpb24gaXMgcCA9DQogIDEvMi4gV2hhdCBpcyB0aGUgcHJvYmFiaWxpdHkgb2YgaGVyIGdldHRpbmcgZml2ZSBjb3JyZWN0IGluIHNldmVuIHRyaWVzIHVuZGVyIHRoaXMNCiAgYXNzdW1wdGlvbj8NCiAgDQogICoqQmlub21pYWwgRGlzdHJpYnV0aW9uOiBQKDUgb2YgNykgPSAoNyBjaG9vc2UgNSkgKiAoMS8yKV41ICogKDEvMileMiA9IDIxICogKDEvMTI4KSDiiYggLjE2NDEqKjxicj4NCiAgKipUaGUgcHJvYmFiaWxpdHkgaXMgYWJvdXQgMTYuNDElKioNCg0KICAoYikgV2hhdCBpcyB0aGUgcHJvYmFiaWxpdHkgb2YgZ2V0dGluZyBmaXZlIG9yIG1vcmUgY2xhc3NpZmljYXRpb25zIGNvcnJlY3QsIGFnYWluIHVuZGVyDQogIHRoZSBhc3N1bXB0aW9uIHRoYXQgc2hlIHJlYWxseSBpcyB1bmFibGUgdG8gdGVsbCB0aGUgZGlmZmVyZW5jZSAocCA9IDEvMik/DQoNCmBgYHtyfQ0KcHJpbnQoMSAtIHBiaW5vbSg0LDcsLjUpKQ0KYGBgDQogICoqVGhlIHByb2JhYmlsaXR5IGlzIGFib3V0IDIyLjY2JSoqDQoNCiAgKGMpIE5vdywgc3VwcG9zZSB5b3UgcnVuIHRoZSBleHBlcmltZW50IGFuIGFkZGl0aW9uYWwgdGhyZWUgd2Vla3MsIGZvciBhIHRvdGFsIG9mIDI4DQogIHRlc3RzLiBTdXBwb3NlIHNoZSBnZXRzIGEgdG90YWwgb2YgMjAgb3V0IG9mIDI4IGNvcnJlY3QuIEFnYWluIGFzc3VtaW5nIHAgPSAxLzIsDQogIHdoYXQgaXMgdGhlIHByb2JhYmlsaXR5IG9mIGdldHRpbmcgdGhpcyBtYW55IG9yIG1vcmUgY2xhc3NpZmljYXRpb25zIGNvcnJlY3Q/IChZb3UNCiAgY2FuIHVzZSB0aGUgUiBjb21tYW5kIHBiaW5vbSh5LG4scCkgdG8gY29tcHV0ZSB5b3VyIGFuc3dlciwgd2hlcmUgbiBpcyB0aGUNCiAgbnVtYmVyIG9mIHRyaWFscywgeSBpcyB0aGUgbnVtYmVyIG9mIHN1Y2Nlc3NlcyBpbiBuIHRyaWFscyB3aXRoIHN1Y2Nlc3MgcHJvYmFiaWxpdHkNCiAgcC4pDQoNCmBgYHtyfQ0KcHJpbnQoMSAtIHBiaW5vbSgxOSwyOCwuNSkpDQpgYGANCiAgKipUaGUgcHJvYmFiaWxpdHkgaXMgYWJvdXQgMDEuNzglKioNCg0KICAoZCkgRXhwbGFpbiBpbiB3b3JkcyB3aHkgdGhlIGFuc3dlciB0byB0aGUgcHJldmlvdXMgdHdvIHF1ZXN0aW9ucyBhcmUgZGlmZmVyZW50LCBldmVuDQogIHRob3VnaCBpbiBib3RoIGNhc2VzIHlvdXIgZnJpZW5kIGdldHMgNS83ID0gMjAvMjgg4omIIDcxLjQlIG9mIGhlciBndWVzc2VzIGNvcnJlY3QuDQogIFdoYXQgcHJvYmFiaWxpdHkgaWRlYSBkb2VzIHRoaXMgaWxsdXN0cmF0ZT8NCiAgDQogICoqQXMgdGhlIG51bWJlciBvZiB0cmlhbHMgaW5jcmVhc2VzLCB0aGUgZXhwZXJpbWVudGFsIHByb2JhYmlsaXR5IHNob3VsZCB0cmVuZCB0b3dhcmRzIHJlZmxlY3RpbmcgdGhlIHRydWUgICAgICAgICBwcm9iYWJpbGl0eS4gVGhlIHZhcmlhbmNlIHNob3VsZCBkZWNyZWFzZSwgYnV0IHRoZSBtZWFuIHNob3VsZCBzdGF5IHRoZSBzYW1lLiBUaGlzIHJlZmxlY3RzIHRoZSBMYXcgb2YgTGFyZ2UgICAgIE51bWJlcnMqKg0KICANCiMgUHJvYmxlbSAxNiAgDQoNCiMgUHJvYmxlbSAxNw0KDQo8Yj44NSUuIFRoZSBzdHVkZW50IHNob3VsZCBub3QgZmFsbCB2aWN0aW0gdG8gdGhlIEdhbWJsZXIncyBQYXJhZG94LCBhbmQgdGhlaXIgZXhwZWN0ZWQgc2NvcmUgc2hvdWxkIG5vdCBjaGFuZ2UuPC9iPg0KDQojIFByb2JsZW0gMTgNCg0KKGEpIFdoYXQgaXMgdGhlIHByb2JhYmlsaXR5IEkgbWFrZSBteSBmaXJzdCB0aHJlZSBwdXR0cyBidXQgbWlzcyBteSBmb3VydGg/DQoNCjxiPlAoV1dXTCkgPSAoLjcpXjMgKiAoLjMpID0gLjEwMjkgPSAxMC4yOSU8L2I+DQoNCihiKSBXaGF0IGlzIHRoZSBwcm9iYWJpbGl0eSBJIG1ha2UgZXhhY3RseSB0aHJlZSBwdXR0cyBpbiBteSBmaXJzdCBmb3VyIGF0dGVtcHRzPw0KV2h5IGlzIHRoaXMgYW5zd2VyIGRpZmZlcmVudCBmcm9tIHRoZSBwcmV2aW91cyBvbmU/DQoNCjxiPlAoWCA9IDMpID0gKDQgMykgKiAoKFAoVykpXjMpICogKDEgLSBQKFcpKV4xID0gLjQxMTYgPSA0MS4xNiU8YnI+DQpUaGUgcHJvYmFiaWxpdHkgaXMgZXhhY3RseSA0IHRpbWVzIGxhcmdlciBiZWNhdXNlIHRoZSBvbmUgbWlzcyBjYW4gaGFwcGVuIGluIGFueSBvZiB0aGUgZm91ciBwdXR0cyBpbnN0ZWFkIG9mIGp1c3QgdGhlIGxhc3Qgb25lLjwvYj4NCg0KKGMpIFdoYXQgaXMgdGhlIHByb2JhYmlsaXR5IHRoYXQgbXkgYnJvdGhlciBtYWtlcyBtb3JlIHRoYW4gaGFsZiBvZiBoaXMgZmlyc3QgZm91cg0KcHV0dHM/DQoNCjxiPlAoWSA+IDIpID0gKDQgMykgKiAoKFAoVykpXjMpICogKDEgLSBQKFcpKV4xICsgKDQgNCkgKiAoKFAoVykpXjQpID0gNCAqICguOCleMyAqICguMikgKyAoLjgpXjQ8YnI+DQpQKFkgPiAyKSA9IC40MDk2ICsgLjQwOTYgPSAuODE5MiA9IDgxLjkyJTwvYj4NCg0KKGQpIFRoZSBnYW1lIGNhbGxzIGZvciB1cyB0byBlYWNoIGF0dGVtcHQgMTAwIHB1dHRzLCBhZnRlciB3aGljaCB3ZSBzZXR0bGUgdXAgYXQgdGhlDQpwcmljZSBvZiAkNSBwZXIgcHV0dC4gV2hhdCBpcyB0aGUgZXhwZWN0ZWQgYW1vdW50IEkgd2lsbCBvd2UgbXkgYnJvdGhlcj8NCg0KPGI+Rm9yOiAxMDAgcHV0dHMsPGJyPg0KRShZIC0gWCkgPSBFKFkpIC0gRShYKSA9IDEwMCguOCkgLSAxMDAoLjcpID0gMTA8YnI+DQpPbiBhdmVyYWdlLCBoZSB3aWxsIG1ha2UgMTAgbW9yZSBwdXRzIHBlciAxMDAgdGhhbiB5b3UsIGFuZCB5b3Ugd2lsbCBvd2UgaGltICQ1MC48L2I+DQoNCihlKSBVc2UgdGhlIG5vcm1hbCBhcHByb3hpbWF0aW9uIHRvIHRoZSBiaW5vbWlhbCBkaXN0cmlidXRpb24gKGFwcGxpZWQgdHdpY2UpLCBhcw0Kd2VsbCBhcyB0aGUgZmFjdCB0aGF0IGxpbmVhciBjb21iaW5hdGlvbnMgb2Ygbm9ybWFsIGRpc3RyaWJ1dGlvbnMgYXJlIGFnYWluIG5vcm1hbGx5IGRpc3RyaWJ1dGVkLCB0byBmaW5kIHRoZSBwcm9iYWJpbGl0eSB0aGF0IEkgd2lsbCB3aW4uIERldGVybWluZSB0aGUgYW5zd2VyIGFwcHJveGltYXRlbHkgdXNpbmcgdGhlICJlbXBpcmljYWwgcnVsZSI7IGNvbXBhcmUgdGhpcyB0byB0aGUgZXhhY3QgYW5zd2VyIGZvdW5kIHVzaW5nIHRoZSBwbm9ybSh5LG11LHNpZ21hKSBjb21tYW5kIGluIFIuDQoNCiMgUHJvYmxlbSAxOQ0KDQohW10ocHJvYmxlbVNldC9pbWFnZXMvcHJvYmxlbTE5LnBuZykNCg0KIyBQcm9ibGVtIDIwIA0KDQooYSkNCjxiPlRoZSBwLXZhbHVlIGlzIHNtYWxsLCBjb21pbmcgaW4gYXQgPC4wMDAwMS4gVGhpcyB3YXMgYmFzZWQgb24gYSBvbmUtc2lkZWQgaW50ZXJ2YWwsIGFzIHRoZSBzaGlmdCBpbiBoZWFkYWNoZSB0aW1pbmcgd2FzIG5vdCB0cnlpbmcgdG8gZ2V0IGluIGEgY2VydGFpbiByYW5nZSBvZiBhY2NlcHRhYmxlIHRpbWVzLiBSYXRoZXIsIGl0IHdhcyBqdXN0IHRlc3RpbmcgYSBvbmUtc2lkZWQgc2hpZnQgZnJvbSBwbGFjZWJvLjxiPg0KDQooYikNCjxiPiBBcyBsb25nIGFzIG15IHByZXZpb3VzIGFuc3dlciB3YXMgY29ycmVjdCwgdGhlIG5ldyBkcnVnIGlzIHN0YXRpc3RpY2FsbHkgc2lnbmlmaWNhbnRseSBiZXR0ZXIgdGhhbiBwbGFjZWJvICwgc2luY2UgcCA8IC4wMDAwMSwgd2hpY2ggaXMgPCAuMDUuPGI+DQoNCihjKQ0KPGI+SSB3b3VsZCByZWNvbW1lbmQgY29sbGVjdGluZyBtb3JlIGRhdGEgdG8gdGVzdCB0aGUgZHJ1ZydzIGVmZmljYWN5LiBBIHNhbXBsZSBzaXplIG9mIDEwMCBpcyB0b28gc21hbGwgdG8ganVkZ2UgdGhlIGVmZmljYWN5IChhbmQgYWxzbyB0aGUgc2FmZXR5ISkgb2YgYSBkcnVnIHRoYXQgbWF5IGJlIGdpdmVuIHRvIG1pbGxpb25zIG9mIHBhdGllbnRzIG9yIG92ZXItdGhlLWNvdW50ZXIgY3VzdG9tZXJzLiBUaGUgc2FtZSBzdHVkeSBuZWVkcyB0byBiZSBwZXJmb3JtZWQgd2l0aCBhIG11Y2ggbGFyZ2VyIGdyb3VwLjxiPg0KDQooZCkNCjxiPkkgd291bGQgTk9UIHByb2NlZWQgd2l0aCB0aGUgZGV2ZWxvcG1lbnQgb2YgdGhlIGRydWcsIGFzIHN0YXRlZCBpbiB0aGUgcHJldmlvdXMgYW5zd2VyLiBBZGRpdGlvbmFsIHRlc3RzIG11c3QgYmUgZG9uZSB3aXRoIG1vcmUgcGVvcGxlLCBwZXJoYXBzIG1vcmUgdGhhbiBvbmNlLCB3aGljaCBzaG91bGQgcmVkdWNlIHRoZSB2YXJpYWJpbGl0eSBvZiB0aGUgZXhwZXJpbWVudC48Yj4NCg0KIyBQcm9ibGVtIDIxDQoNCjxiPlRoZSBzY2llbnRpc3RzIGFyZSBtaXN1c2luZyB0aGUgaWRlYSBvZiBzdGF0aXN0aWNhbCBzaWduaWZpY2FuY2UgdG8gY2xhaW0gdGhhdCBqZWxseSBiZWFucyBhcmUgbGlua2VkIHRvIGFjbmUuIFdoaWxlIGFsbW9zdCBhbGwgb2YgdGhlIHRlc3QgdmFyaWFibGVzIGNvbmNsdWRlZCB0aGF0IHRoZXJlIHdhcyBubyBsaW5rLCB0aGV5IHVzZWQgb25lIHN0YXRpc3RpY2FsbHkgc2lnbmlmaWNhbnQgZmFjdG9yIHRvIHByb3ZlIGEgcG90ZW50aWFsbHkgZmFsc2UgaHlwb3RoZXNpcyB0aGF0IHRoZXkgaGFkLjxiPg0KDQojIFByb2JsZW0gMjINCg0KIVtdKHByb2JsZW1TZXQvaW1hZ2VzL3Byb2JsZW0yMi5wbmcpDQoNCiMgUHJvYmxlbSAyMyANCg0KIyBQcm9ibGVtIDI0IA0KDQojIFByb2JsZW0gMjUgDQoNCiMgUHJvYmxlbSAyNiANCg0KIyBQcm9ibGVtIDI3IA0KDQojIFByb2JsZW0gMjgNCg0KYGBge3J9DQpsaWJyYXJ5KGdsbW5ldCkNCmRhdGEoaXJpcykNCg0KeCA9IGFzLm1hdHJpeChpcmlzWywtNV0pDQp5ID0gaXJpc1ssNV0gPT0gInZlcnNpY29sb3IiDQoNCmN2b2IxID0gY3YuZ2xtbmV0KHgseSxmYW1pbHkgPSAiYmlub21pYWwiLCB0eXBlLm1lYXN1cmUgPSAiY2xhc3MiLCBhbHBoYSA9IDEsIG5mb2xkcyA9IDUpDQpwbG90KGN2b2IxKQ0KDQp5ID0gaXJpc1ssNV0gPT0gInNldG9zYSINCg0KY3ZvYjEgPSBjdi5nbG1uZXQoeCx5LGZhbWlseSA9ICJiaW5vbWlhbCIsIHR5cGUubWVhc3VyZSA9ICJjbGFzcyIsIGFscGhhID0gMSwgbmZvbGRzID0gNSkNCnBsb3QoY3ZvYjEpDQoNCnkgPSBpcmlzWyw1XSA9PSAidmlyZ2luaWNhIg0KDQpjdm9iMSA9IGN2LmdsbW5ldCh4LHksZmFtaWx5ID0gImJpbm9taWFsIiwgdHlwZS5tZWFzdXJlID0gImNsYXNzIiwgYWxwaGEgPSAxLCBuZm9sZHMgPSA1KQ0KcGxvdChjdm9iMSkNCg0KYGBgDQoNCg==