# Home-runs so far
HR_before <- c(11, 13, 12)
# Average Number of Home-runs per season wanted
wanted_HR <- 20
# Number of seasons
n_seasons <- 4
# Needed Home-runs on season 4
x_4 <- n_seasons*wanted_HR - sum(HR_before)
# Minimum number of Home-runs needed by Robert
x_4
[1] 44
According to the calculations above, Robert must hit 44 home-runs or
better on this season to get an average number of home-runs per season
of at least 20.
We could confirm this, by using the function mean() in R
# Robert's performance
Robert_HRs <- c(11, 13, 12,44)
# Find mean
mean(Robert_HRs)
[1] 20
# Find standard deviation
sd(Robert_HRs)
[1] 16.02082
# Find the maximum number of home-runs during the four seasons period
max(Robert_HRs)
[1] 44
# Find the minimum number of home-runs during the four seasons period
min(Robert_HRs)
[1] 11
We can also use the summary() function to find basic statistics,
including the median!
summary(Robert_HRs)
Min. 1st Qu. Median Mean 3rd Qu. Max.
11.00 11.75 12.50 20.00 20.75 44.00
Question 1 Now, you must complete the problem below which represents
a similar case scenario. You may use the steps that we executed in
Case-scenario 1 as a template for your solution.
This is the sixth season of outfielder Juan Soto in the majors. If
during the first five seasons he received 79, 108,41,145, and 135 walks,
how many does he need on this season for his overall number of walks per
season to be at least 100?
# Walks so far
W_before <- c(79,108,41,145,135)
# Average Number of Walks per season wanted
wanted_W <- 100
# Number of seasons
n_seasons <- 6
# Needed Walks in season 6
x_6 <- n_seasons*wanted_W - sum(W_before)
# Minimum number of Walks needed by Robert
x_6
[1] 92
Case-scenario 2 The average salary of 10 baseball players is 72,000
dollars a week and the average salary of 4 soccer players is 84,000.
Find the mean salary of all 14 professional players.
mean_salary<- ((10*72000)+(4*84000))/14
mean_salary
[1] 75428.57
n_1 <- 10
n_2 <- 4
y_1 <- 72000
y_2 <- 84000
# Mean salary overall
salary_ave <- (n_1*y_1 + n_2*y_2)/(n_1+n_2)
salary_ave
[1] 75428.57
Question 2 The average salary of 7 basketball players is 102,000
dollars a week and the average salary of 9 NFL players is 91,000. Find
the mean salary of all 16 professional players.
n_1 <- 7
n_2 <- 9
y_1 <- 102000
y_2 <- 91000
# Mean salary overall
salary_ave1 <- (n_1*y_1 + n_2*y_2)/(n_1+n_2)
salary_ave1
[1] 95812.5
getwd
function ()
.Internal(getwd())
<bytecode: 0x5d82c680d9a0>
<environment: namespace:base>
Case-scenario 3
The frequency distribution below lists the number of active players
in the Barclays Premier League and the time left in their contract.
Find the mean,the median and the standard deviation.
What percentage of the data lies within one standard deviation of the
mean?
What percentage of the data lies within two standard deviations of
the mean?
What percent of the data lies within three standard deviations of the
mean?
Draw a histogram to illustrate the data.
Solution: Upload the allcontracts.csv file to the server.
The allcontracts.csv file contains all the players’ contracts length.
We can read this file in R using the read.csv() function.
The first line reads the entire CSV file into a data frame called
contract_length. The second line extracts just the years column and
stores it in the variable contract_years for easier analysis.
contract_length <- read.table("allcontracts.csv", header = TRUE, sep = ",")
contract_years <- contract_length$years
To find the mean and the standard deviation
# Mean
contracts_mean <- mean(contract_years)
contracts_mean
[1] 3.458918
# Median
contracts_median <- median(contract_years)
contracts_median
[1] 3
# Find number of observations
contracts_n <- length(contract_years)
# Find standard deviation
contracts_sd <- sd(contract_years)
contracts_n
[1] 499
contracts_sd
[1] 1.69686
What percentage of the data lies within one standard deviation of the
mean? Based on the Emperical Rule, almost all data, 99.7%, falls within
three standard deviations of the mean.
contracts_w1sd <- sum((contract_years - contracts_mean)/contracts_sd < 1)/ contracts_n
# Percentage of observation within one standard deviation of the mean
contracts_w1sd
[1] 0.8416834
## Difference from empirical
contracts_w1sd - 0.68
[1] 0.1616834
What percentage of the data lies within two standard deviations of
the mean? I changed it to reflect the percentage*
## Within 2 sd
contracts_w2sd <- sum((contract_years - contracts_mean)/ contracts_sd < 2)/contracts_n
contracts_w2sd*100
[1] 100
## Difference from empirical
contracts_w2sd - 0.95
[1] 0.05
What percent of the data lies within three standard deviations of the
mean?
## Within 3 sd
contracts_w3sd <- sum((contract_years - contracts_mean)/ contracts_sd < 3)/contracts_n
contracts_w3sd
[1] 1
## Difference from empirical
contracts_w3sd - 0.9973
[1] 0.0027
Draw a histogram
# Create histogram
hist(contract_years,xlab = "Years Left in Contract",col = "green",border = "blue", xlim = c(0,8), ylim = c(0,225),
breaks = 5)

# Create histogram
hist(contract_years,xlab = "Years Left in Contract",col = "green",border = "red", xlim = c(0,6), ylim = c(0,250),
breaks = 3)

Question 3 Use the skills learned in case scenario number 3 on one
the following data sets. You may choose only one dataset. They are both
available in Canvas.
The frequency distribution below lists the number of triples hit as
recorded in the CVS file triples_hit.
Find the mean,the median and the standard deviation.
What percentage of the data lies within one standard deviation of the
mean?
What percentage of the data lies within two standard deviations of
the mean?
What percent of the data lies within three standard deviations of the
mean?
Draw a histogram to illustrate the data.
Solution: Upload the triples_hit.csv file to the server.
The triples_hit.csv file contains 100 records of triplets hit. We can
read this file in R using the read.csv() function.
triplesnumber <- read.table("triples_hit.csv", header = TRUE, sep = ",")
tripleshits <- triplesnumber$triples_hit
# Mean
triplesnumber_mean <- mean(tripleshits)
triplesnumber_mean
[1] 4.96
# Median
triplesnumber_median <- median(tripleshits)
triplesnumber_median
[1] 5
# Find number of observations
triples_n <- length(tripleshits)
# Find standard deviation
triples_sd <- sd(tripleshits)
triples_n
[1] 100
triples_sd
[1] 2.884721
What percentage of the data lies within one standard deviation of the
mean?
triples_w1sd <- sum((tripleshits - triplesnumber_mean)/triples_sd < 1)/ triples_n
# Percentage of observation within one standard deviation of the mean
triples_w1sd*100
[1] 88
## Difference from empirical
triples_w1sd - 0.68
[1] 0.2
What percentage of the data lies within two standard deviations of
the mean?
## Within 2 sd
triples_w2sd <- sum((tripleshits - triplesnumber_mean)/triples_sd < 2)/ triples_n
# Percentage of observation within one standard deviation of the mean
triples_w2sd*100
[1] 93
## Difference from empirical
triples_w2sd - 0.95
[1] -0.02
What percent of the data lies within three standard deviations of the
mean?
## Within 3 sd
triples_w3sd <- sum((tripleshits - triplesnumber_mean)/triples_sd < 3)/ triples_n
# Percentage of observation within one standard deviation of the mean
triples_w3sd*100
[1] 98
## Difference from empirical
triples_w3sd - 0.9973
[1] -0.0173
The data is close to the Empirical standard for the
distribution within 2 and three standard deviations. The slight
difference may be due to a slightly skewed distribution. The difference
seems negligible.
Draw a Histogram
# Create histogram
hist(tripleshits,xlab = "Triples",col = "yellow",border = "black", xlim = c(1,14), ylim = c(0,40),
breaks = 7)

The histogram shows that the distribution of triples hit
is right-skewed (positively skewed). The vast majority of observations
are between 1 and 6 triples, with the highest frequency around 4 to 6
triples. There is a big drop-off in frequency beyond 6 triples. There
are very few players with very high numbers of triples (>=12);
possible outliers. The Histogram reflects the earlier Empirical
difference findings.
LS0tCnRpdGxlOiAiSW5fQ2xhc3MgQWN0aXZpdHkgLSBDaGFybGVuZSBUaG9tYXMiCm91dHB1dDogaHRtbF9ub3RlYm9vawotLS0KCmBgYHtyfQojIEhvbWUtcnVucyBzbyBmYXIKSFJfYmVmb3JlIDwtIGMoMTEsIDEzLCAxMikKIyBBdmVyYWdlIE51bWJlciBvZiBIb21lLXJ1bnMgcGVyIHNlYXNvbiB3YW50ZWQKd2FudGVkX0hSIDwtIDIwCiMgTnVtYmVyIG9mIHNlYXNvbnMKbl9zZWFzb25zIDwtIDQKIyBOZWVkZWQgSG9tZS1ydW5zIG9uIHNlYXNvbiA0CnhfNCA8LSBuX3NlYXNvbnMqd2FudGVkX0hSIC0gc3VtKEhSX2JlZm9yZSkKIyBNaW5pbXVtIG51bWJlciBvZiBIb21lLXJ1bnMgbmVlZGVkIGJ5IFJvYmVydAp4XzQKYGBgCgpBY2NvcmRpbmcgdG8gdGhlIGNhbGN1bGF0aW9ucyBhYm92ZSwgUm9iZXJ0IG11c3QgaGl0IDQ0IGhvbWUtcnVucyBvciBiZXR0ZXIgb24gdGhpcyBzZWFzb24gdG8gZ2V0IGFuIGF2ZXJhZ2UgbnVtYmVyIG9mIGhvbWUtcnVucyBwZXIgc2Vhc29uIG9mIGF0IGxlYXN0IDIwLgoKV2UgY291bGQgY29uZmlybSB0aGlzLCBieSB1c2luZyB0aGUgZnVuY3Rpb24gbWVhbigpIGluIFIKCmBgYHtyfQojIFJvYmVydCdzIHBlcmZvcm1hbmNlClJvYmVydF9IUnMgPC0gYygxMSwgMTMsIDEyLDQ0KQojIEZpbmQgbWVhbgptZWFuKFJvYmVydF9IUnMpCmBgYApgYGB7cn0KIyBGaW5kIHN0YW5kYXJkIGRldmlhdGlvbgpzZChSb2JlcnRfSFJzKQpgYGAKCmBgYHtyfQojIEZpbmQgdGhlIG1heGltdW0gbnVtYmVyIG9mIGhvbWUtcnVucyBkdXJpbmcgdGhlIGZvdXIgc2Vhc29ucyBwZXJpb2QKbWF4KFJvYmVydF9IUnMpCmBgYAoKYGBge3J9CiMgRmluZCB0aGUgbWluaW11bSBudW1iZXIgb2YgaG9tZS1ydW5zIGR1cmluZyB0aGUgZm91ciBzZWFzb25zIHBlcmlvZAptaW4oUm9iZXJ0X0hScykKYGBgCldlIGNhbiBhbHNvIHVzZSB0aGUgc3VtbWFyeSgpIGZ1bmN0aW9uIHRvIGZpbmQgYmFzaWMgc3RhdGlzdGljcywgaW5jbHVkaW5nIHRoZSBtZWRpYW4hCgpgYGB7cn0Kc3VtbWFyeShSb2JlcnRfSFJzKQpgYGAKClF1ZXN0aW9uIDEKTm93LCB5b3UgbXVzdCBjb21wbGV0ZSB0aGUgcHJvYmxlbSBiZWxvdyB3aGljaCByZXByZXNlbnRzIGEgc2ltaWxhciBjYXNlIHNjZW5hcmlvLiBZb3UgbWF5IHVzZSB0aGUgc3RlcHMgdGhhdCB3ZSBleGVjdXRlZCBpbiBDYXNlLXNjZW5hcmlvIDEgYXMgYSB0ZW1wbGF0ZSBmb3IgeW91ciBzb2x1dGlvbi4KClRoaXMgaXMgdGhlIHNpeHRoIHNlYXNvbiBvZiBvdXRmaWVsZGVyIEp1YW4gU290byBpbiB0aGUgbWFqb3JzLiBJZiBkdXJpbmcgdGhlIGZpcnN0IGZpdmUgc2Vhc29ucyBoZSByZWNlaXZlZCA3OSwgMTA4LDQxLDE0NSwgYW5kIDEzNSB3YWxrcywgaG93IG1hbnkgZG9lcyBoZSBuZWVkIG9uIHRoaXMgc2Vhc29uIGZvciBoaXMgb3ZlcmFsbCBudW1iZXIgb2Ygd2Fsa3MgcGVyIHNlYXNvbiB0byBiZSBhdCBsZWFzdCAxMDA/CgpgYGB7cn0KIyBXYWxrcyBzbyBmYXIKV19iZWZvcmUgPC0gYyg3OSwxMDgsNDEsMTQ1LDEzNSkKIyBBdmVyYWdlIE51bWJlciBvZiBXYWxrcyBwZXIgc2Vhc29uIHdhbnRlZAp3YW50ZWRfVyA8LSAxMDAKIyBOdW1iZXIgb2Ygc2Vhc29ucwpuX3NlYXNvbnMgPC0gNgojIE5lZWRlZCBXYWxrcyBpbiBzZWFzb24gNgp4XzYgPC0gbl9zZWFzb25zKndhbnRlZF9XIC0gc3VtKFdfYmVmb3JlKQojIE1pbmltdW0gbnVtYmVyIG9mIFdhbGtzIG5lZWRlZCBieSBSb2JlcnQKeF82CmBgYAoKQ2FzZS1zY2VuYXJpbyAyClRoZSBhdmVyYWdlIHNhbGFyeSBvZiAxMCBiYXNlYmFsbCBwbGF5ZXJzIGlzIDcyLDAwMCBkb2xsYXJzIGEgd2VlayBhbmQgdGhlIGF2ZXJhZ2Ugc2FsYXJ5IG9mIDQgc29jY2VyIHBsYXllcnMgaXMgODQsMDAwLiBGaW5kIHRoZSBtZWFuIHNhbGFyeSBvZiBhbGwgMTQgcHJvZmVzc2lvbmFsIHBsYXllcnMuCgpgYGB7cn0KbWVhbl9zYWxhcnk8LSAoKDEwKjcyMDAwKSsoNCo4NDAwMCkpLzE0Cm1lYW5fc2FsYXJ5CmBgYAoKYGBge3J9Cm5fMSA8LSAxMApuXzIgPC0gNAp5XzEgPC0gNzIwMDAKeV8yIDwtIDg0MDAwCiMgTWVhbiBzYWxhcnkgb3ZlcmFsbApzYWxhcnlfYXZlIDwtICAobl8xKnlfMSArIG5fMip5XzIpLyhuXzErbl8yKQpzYWxhcnlfYXZlCmBgYAoKUXVlc3Rpb24gMgpUaGUgYXZlcmFnZSBzYWxhcnkgb2YgNyBiYXNrZXRiYWxsIHBsYXllcnMgaXMgMTAyLDAwMCBkb2xsYXJzIGEgd2VlayBhbmQgdGhlIGF2ZXJhZ2Ugc2FsYXJ5IG9mIDkgTkZMIHBsYXllcnMgaXMgOTEsMDAwLiBGaW5kIHRoZSBtZWFuIHNhbGFyeSBvZiBhbGwgMTYgcHJvZmVzc2lvbmFsIHBsYXllcnMuCgpgYGB7cn0Kbl8xIDwtIDcKbl8yIDwtIDkKeV8xIDwtIDEwMjAwMAp5XzIgPC0gOTEwMDAKIyBNZWFuIHNhbGFyeSBvdmVyYWxsCnNhbGFyeV9hdmUxIDwtICAobl8xKnlfMSArIG5fMip5XzIpLyhuXzErbl8yKQpzYWxhcnlfYXZlMQpgYGAKCmBgYHtyfQpnZXR3ZAoKYGBgCgpDYXNlLXNjZW5hcmlvIDMKClRoZSBmcmVxdWVuY3kgZGlzdHJpYnV0aW9uIGJlbG93IGxpc3RzIHRoZSBudW1iZXIgb2YgYWN0aXZlIHBsYXllcnMgaW4gdGhlIEJhcmNsYXlzIFByZW1pZXIgTGVhZ3VlIGFuZCB0aGUgdGltZSBsZWZ0IGluIHRoZWlyIGNvbnRyYWN0LgoKRmluZCB0aGUgbWVhbix0aGUgbWVkaWFuIGFuZCB0aGUgc3RhbmRhcmQgZGV2aWF0aW9uLgoKV2hhdCBwZXJjZW50YWdlIG9mIHRoZSBkYXRhIGxpZXMgd2l0aGluIG9uZSBzdGFuZGFyZCBkZXZpYXRpb24gb2YgdGhlIG1lYW4/CgpXaGF0IHBlcmNlbnRhZ2Ugb2YgdGhlIGRhdGEgbGllcyB3aXRoaW4gdHdvIHN0YW5kYXJkIGRldmlhdGlvbnMgb2YgdGhlIG1lYW4/CgpXaGF0IHBlcmNlbnQgb2YgdGhlIGRhdGEgbGllcyB3aXRoaW4gdGhyZWUgc3RhbmRhcmQgZGV2aWF0aW9ucyBvZiB0aGUgbWVhbj8KCkRyYXcgYSBoaXN0b2dyYW0gdG8gaWxsdXN0cmF0ZSB0aGUgZGF0YS4KCgpTb2x1dGlvbjogVXBsb2FkIHRoZSBhbGxjb250cmFjdHMuY3N2IGZpbGUgdG8gdGhlIHNlcnZlci4KClRoZSBhbGxjb250cmFjdHMuY3N2IGZpbGUgY29udGFpbnMgYWxsIHRoZSBwbGF5ZXJz4oCZIGNvbnRyYWN0cyBsZW5ndGguIFdlIGNhbiByZWFkIHRoaXMgZmlsZSBpbiBSIHVzaW5nIHRoZSByZWFkLmNzdigpIGZ1bmN0aW9uLgoKVGhlIGZpcnN0IGxpbmUgcmVhZHMgdGhlIGVudGlyZSBDU1YgZmlsZSBpbnRvIGEgZGF0YSBmcmFtZSBjYWxsZWQgY29udHJhY3RfbGVuZ3RoLgpUaGUgc2Vjb25kIGxpbmUgZXh0cmFjdHMganVzdCB0aGUgeWVhcnMgY29sdW1uIGFuZCBzdG9yZXMgaXQgaW4gdGhlIHZhcmlhYmxlIGNvbnRyYWN0X3llYXJzIGZvciBlYXNpZXIgYW5hbHlzaXMuCgpgYGB7cn0KY29udHJhY3RfbGVuZ3RoIDwtIHJlYWQudGFibGUoImFsbGNvbnRyYWN0cy5jc3YiLCBoZWFkZXIgPSBUUlVFLCBzZXAgPSAiLCIpCmNvbnRyYWN0X3llYXJzIDwtIGNvbnRyYWN0X2xlbmd0aCR5ZWFycwpgYGAKClRvIGZpbmQgdGhlIG1lYW4gYW5kIHRoZSBzdGFuZGFyZCBkZXZpYXRpb24KCmBgYHtyfQojIE1lYW4gCmNvbnRyYWN0c19tZWFuICA8LSBtZWFuKGNvbnRyYWN0X3llYXJzKQpjb250cmFjdHNfbWVhbgpgYGAKCmBgYHtyfQojIE1lZGlhbgpjb250cmFjdHNfbWVkaWFuIDwtIG1lZGlhbihjb250cmFjdF95ZWFycykKY29udHJhY3RzX21lZGlhbgpgYGAKCmBgYHtyfQojIEZpbmQgbnVtYmVyIG9mIG9ic2VydmF0aW9ucwpjb250cmFjdHNfbiA8LSBsZW5ndGgoY29udHJhY3RfeWVhcnMpCiMgRmluZCBzdGFuZGFyZCBkZXZpYXRpb24KY29udHJhY3RzX3NkIDwtIHNkKGNvbnRyYWN0X3llYXJzKQpjb250cmFjdHNfbgpjb250cmFjdHNfc2QgCmBgYAoKV2hhdCBwZXJjZW50YWdlIG9mIHRoZSBkYXRhIGxpZXMgd2l0aGluIG9uZSBzdGFuZGFyZCBkZXZpYXRpb24gb2YgdGhlIG1lYW4/ICBCYXNlZCBvbiB0aGUgRW1wZXJpY2FsIFJ1bGUsIGFsbW9zdCBhbGwgZGF0YSwgOTkuNyUsIGZhbGxzIHdpdGhpbiB0aHJlZSBzdGFuZGFyZCBkZXZpYXRpb25zIG9mIHRoZSBtZWFuLgoKYGBge3J9CmNvbnRyYWN0c193MXNkIDwtIHN1bSgoY29udHJhY3RfeWVhcnMgLSBjb250cmFjdHNfbWVhbikvY29udHJhY3RzX3NkIDwgMSkvIGNvbnRyYWN0c19uCiMgUGVyY2VudGFnZSBvZiBvYnNlcnZhdGlvbiB3aXRoaW4gb25lIHN0YW5kYXJkIGRldmlhdGlvbiBvZiB0aGUgbWVhbgpjb250cmFjdHNfdzFzZApgYGAKCmBgYHtyfQojIyBEaWZmZXJlbmNlIGZyb20gZW1waXJpY2FsIApjb250cmFjdHNfdzFzZCAtIDAuNjgKCmBgYAoKV2hhdCBwZXJjZW50YWdlIG9mIHRoZSBkYXRhIGxpZXMgd2l0aGluIHR3byBzdGFuZGFyZCBkZXZpYXRpb25zIG9mIHRoZSBtZWFuPwoqKkkgY2hhbmdlZCBpdCB0byByZWZsZWN0IHRoZSBwZXJjZW50YWdlKioqCgpgYGB7cn0KIyMgV2l0aGluIDIgc2QKY29udHJhY3RzX3cyc2QgPC0gc3VtKChjb250cmFjdF95ZWFycyAtIGNvbnRyYWN0c19tZWFuKS8gY29udHJhY3RzX3NkIDwgMikvY29udHJhY3RzX24KY29udHJhY3RzX3cyc2QqMTAwCmBgYAoKYGBge3J9CiMjIERpZmZlcmVuY2UgZnJvbSBlbXBpcmljYWwgCmNvbnRyYWN0c193MnNkIC0gMC45NQpgYGAKCldoYXQgcGVyY2VudCBvZiB0aGUgZGF0YSBsaWVzIHdpdGhpbiB0aHJlZSBzdGFuZGFyZCBkZXZpYXRpb25zIG9mIHRoZSBtZWFuPwoKYGBge3J9CiMjIFdpdGhpbiAzIHNkIApjb250cmFjdHNfdzNzZCA8LSBzdW0oKGNvbnRyYWN0X3llYXJzIC0gY29udHJhY3RzX21lYW4pLyBjb250cmFjdHNfc2QgPCAzKS9jb250cmFjdHNfbgpjb250cmFjdHNfdzNzZApgYGAKCmBgYHtyfQojIyBEaWZmZXJlbmNlIGZyb20gZW1waXJpY2FsIApjb250cmFjdHNfdzNzZCAtIDAuOTk3MwpgYGAKCkRyYXcgYSBoaXN0b2dyYW0KCmBgYHtyfQojIENyZWF0ZSBoaXN0b2dyYW0KaGlzdChjb250cmFjdF95ZWFycyx4bGFiID0gIlllYXJzIExlZnQgaW4gQ29udHJhY3QiLGNvbCA9ICJncmVlbiIsYm9yZGVyID0gImJsdWUiLCB4bGltID0gYygwLDgpLCB5bGltID0gYygwLDIyNSksCiAgIGJyZWFrcyA9IDUpCmBgYApgYGB7cn0KIyBDcmVhdGUgaGlzdG9ncmFtCmhpc3QoY29udHJhY3RfeWVhcnMseGxhYiA9ICJZZWFycyBMZWZ0IGluIENvbnRyYWN0Iixjb2wgPSAiZ3JlZW4iLGJvcmRlciA9ICJyZWQiLCB4bGltID0gYygwLDYpLCB5bGltID0gYygwLDI1MCksCiAgIGJyZWFrcyA9IDMpCmBgYAoKClF1ZXN0aW9uIDMKVXNlIHRoZSBza2lsbHMgbGVhcm5lZCBpbiBjYXNlIHNjZW5hcmlvIG51bWJlciAzIG9uIG9uZSB0aGUgZm9sbG93aW5nIGRhdGEgc2V0cy4gWW91IG1heSBjaG9vc2Ugb25seSBvbmUgZGF0YXNldC4gVGhleSBhcmUgYm90aCBhdmFpbGFibGUgaW4gQ2FudmFzLgoKVGhlIGZyZXF1ZW5jeSBkaXN0cmlidXRpb24gYmVsb3cgbGlzdHMgdGhlIG51bWJlciBvZiB0cmlwbGVzIGhpdCBhcyByZWNvcmRlZCBpbiB0aGUgQ1ZTIGZpbGUgdHJpcGxlc19oaXQuCgpGaW5kIHRoZSBtZWFuLHRoZSBtZWRpYW4gYW5kIHRoZSBzdGFuZGFyZCBkZXZpYXRpb24uCgpXaGF0IHBlcmNlbnRhZ2Ugb2YgdGhlIGRhdGEgbGllcyB3aXRoaW4gb25lIHN0YW5kYXJkIGRldmlhdGlvbiBvZiB0aGUgbWVhbj8KCldoYXQgcGVyY2VudGFnZSBvZiB0aGUgZGF0YSBsaWVzIHdpdGhpbiB0d28gc3RhbmRhcmQgZGV2aWF0aW9ucyBvZiB0aGUgbWVhbj8KCldoYXQgcGVyY2VudCBvZiB0aGUgZGF0YSBsaWVzIHdpdGhpbiB0aHJlZSBzdGFuZGFyZCBkZXZpYXRpb25zIG9mIHRoZSBtZWFuPwoKRHJhdyBhIGhpc3RvZ3JhbSB0byBpbGx1c3RyYXRlIHRoZSBkYXRhLgoKClNvbHV0aW9uOiBVcGxvYWQgdGhlIHRyaXBsZXNfaGl0LmNzdiBmaWxlIHRvIHRoZSBzZXJ2ZXIuCgpUaGUgdHJpcGxlc19oaXQuY3N2IGZpbGUgY29udGFpbnMgMTAwIHJlY29yZHMgb2YgdHJpcGxldHMgaGl0LiBXZSBjYW4gcmVhZCB0aGlzIGZpbGUgaW4gUiB1c2luZyB0aGUgcmVhZC5jc3YoKSBmdW5jdGlvbi4KCmBgYHtyfQp0cmlwbGVzbnVtYmVyIDwtIHJlYWQudGFibGUoInRyaXBsZXNfaGl0LmNzdiIsIGhlYWRlciA9IFRSVUUsIHNlcCA9ICIsIikKdHJpcGxlc2hpdHMgPC0gdHJpcGxlc251bWJlciR0cmlwbGVzX2hpdApgYGAKCmBgYHtyfQojIE1lYW4gCnRyaXBsZXNudW1iZXJfbWVhbiAgPC0gbWVhbih0cmlwbGVzaGl0cykKdHJpcGxlc251bWJlcl9tZWFuIApgYGAKCmBgYHtyfQogIyBNZWRpYW4KdHJpcGxlc251bWJlcl9tZWRpYW4gIDwtIG1lZGlhbih0cmlwbGVzaGl0cykKdHJpcGxlc251bWJlcl9tZWRpYW4gCmBgYAoKYGBge3J9CiMgRmluZCBudW1iZXIgb2Ygb2JzZXJ2YXRpb25zCnRyaXBsZXNfbiA8LSBsZW5ndGgodHJpcGxlc2hpdHMpCiMgRmluZCBzdGFuZGFyZCBkZXZpYXRpb24KdHJpcGxlc19zZCA8LSBzZCh0cmlwbGVzaGl0cykKdHJpcGxlc19uCnRyaXBsZXNfc2QgCmBgYAoKV2hhdCBwZXJjZW50YWdlIG9mIHRoZSBkYXRhIGxpZXMgd2l0aGluIG9uZSBzdGFuZGFyZCBkZXZpYXRpb24gb2YgdGhlIG1lYW4/CmBgYHtyfQp0cmlwbGVzX3cxc2QgPC0gc3VtKCh0cmlwbGVzaGl0cyAtIHRyaXBsZXNudW1iZXJfbWVhbikvdHJpcGxlc19zZCA8IDEpLyB0cmlwbGVzX24KIyBQZXJjZW50YWdlIG9mIG9ic2VydmF0aW9uIHdpdGhpbiBvbmUgc3RhbmRhcmQgZGV2aWF0aW9uIG9mIHRoZSBtZWFuCnRyaXBsZXNfdzFzZCoxMDAKYGBgCgpgYGB7cn0KIyMgRGlmZmVyZW5jZSBmcm9tIGVtcGlyaWNhbCAKdHJpcGxlc193MXNkIC0gMC42OApgYGAKCldoYXQgcGVyY2VudGFnZSBvZiB0aGUgZGF0YSBsaWVzIHdpdGhpbiB0d28gc3RhbmRhcmQgZGV2aWF0aW9ucyBvZiB0aGUgbWVhbj8KCmBgYHtyfQojIyBXaXRoaW4gMiBzZAp0cmlwbGVzX3cyc2QgPC0gc3VtKCh0cmlwbGVzaGl0cyAtIHRyaXBsZXNudW1iZXJfbWVhbikvdHJpcGxlc19zZCA8IDIpLyB0cmlwbGVzX24KIyBQZXJjZW50YWdlIG9mIG9ic2VydmF0aW9uIHdpdGhpbiBvbmUgc3RhbmRhcmQgZGV2aWF0aW9uIG9mIHRoZSBtZWFuCnRyaXBsZXNfdzJzZCoxMDAKYGBgCgpgYGB7cn0KIyMgRGlmZmVyZW5jZSBmcm9tIGVtcGlyaWNhbCAKdHJpcGxlc193MnNkIC0gMC45NQpgYGAKCldoYXQgcGVyY2VudCBvZiB0aGUgZGF0YSBsaWVzIHdpdGhpbiB0aHJlZSBzdGFuZGFyZCBkZXZpYXRpb25zIG9mIHRoZSBtZWFuPwoKYGBge3J9CiMjIFdpdGhpbiAzIHNkCnRyaXBsZXNfdzNzZCA8LSBzdW0oKHRyaXBsZXNoaXRzIC0gdHJpcGxlc251bWJlcl9tZWFuKS90cmlwbGVzX3NkIDwgMykvIHRyaXBsZXNfbgojIFBlcmNlbnRhZ2Ugb2Ygb2JzZXJ2YXRpb24gd2l0aGluIG9uZSBzdGFuZGFyZCBkZXZpYXRpb24gb2YgdGhlIG1lYW4KdHJpcGxlc193M3NkKjEwMApgYGAKCmBgYHtyfQojIyBEaWZmZXJlbmNlIGZyb20gZW1waXJpY2FsIAp0cmlwbGVzX3czc2QgLSAwLjk5NzMKYGBgCgoqKlRoZSBkYXRhIGlzIGNsb3NlIHRvIHRoZSBFbXBpcmljYWwgc3RhbmRhcmQgZm9yIHRoZSBkaXN0cmlidXRpb24gd2l0aGluIDIgYW5kIHRocmVlIHN0YW5kYXJkIGRldmlhdGlvbnMuICBUaGUgc2xpZ2h0IGRpZmZlcmVuY2UgbWF5IGJlIGR1ZSB0byBhIHNsaWdodGx5IHNrZXdlZCBkaXN0cmlidXRpb24uICBUaGUgZGlmZmVyZW5jZSBzZWVtcyBuZWdsaWdpYmxlLioqCgpEcmF3IGEgSGlzdG9ncmFtCmBgYHtyfQojIENyZWF0ZSBoaXN0b2dyYW0KaGlzdCh0cmlwbGVzaGl0cyx4bGFiID0gIlRyaXBsZXMiLGNvbCA9ICJ5ZWxsb3ciLGJvcmRlciA9ICJibGFjayIsIHhsaW0gPSBjKDEsMTQpLCB5bGltID0gYygwLDQwKSwKICAgYnJlYWtzID0gNykKYGBgCgoqKipUaGUgaGlzdG9ncmFtIHNob3dzIHRoYXQgdGhlIGRpc3RyaWJ1dGlvbiBvZiB0cmlwbGVzIGhpdCBpcyByaWdodC1za2V3ZWQgKHBvc2l0aXZlbHkgc2tld2VkKS4gVGhlIHZhc3QgbWFqb3JpdHkgb2Ygb2JzZXJ2YXRpb25zIGFyZSBiZXR3ZWVuIDEgYW5kIDYgdHJpcGxlcywgd2l0aCB0aGUgaGlnaGVzdCBmcmVxdWVuY3kgYXJvdW5kIDQgdG8gNiB0cmlwbGVzLiBUaGVyZSBpcyBhIGJpZyBkcm9wLW9mZiBpbiBmcmVxdWVuY3kgYmV5b25kIDYgdHJpcGxlcy4gIFRoZXJlIGFyZSB2ZXJ5IGZldyBwbGF5ZXJzIHdpdGggdmVyeSBoaWdoIG51bWJlcnMgIG9mIHRyaXBsZXMgKD49MTIpOyBwb3NzaWJsZSBvdXRsaWVycy4gVGhlIEhpc3RvZ3JhbSByZWZsZWN0cyB0aGUgZWFybGllciBFbXBpcmljYWwgZGlmZmVyZW5jZSBmaW5kaW5ncy4qKiogIA==