Case-scenario 1
This is the fourth season of outfielder Luis Robert with the Chicago
White Sox. If during the first three seasons he hit 11, 13, and 12 home
runs, how many does he need this season for his overall average to be at
least 20?
# 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 in 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 calculation above, Luis Robert must hit 44 home runs
or more this season to average at least 20 home runs per season.
We can confirm this using 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-season period
max(Robert_HRs)
[1] 44
# Find the minimum number of home-runs during the four-season period
min(Robert_HRs)
[1] 11
# Summary statistics
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
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 this season for his overall number of walks
per season to be at least 100?
# Walks so far
walks_before <- c(79, 108, 41, 145, 135)
# Average number of walks wanted
wanted_walks <- 100
# Number of seasons
n_seasons <- 6
# Needed walks in season 6
x_6 <- n_seasons * wanted_walks - sum(walks_before)
# Minimum number of walks needed by Juan Soto
x_6
[1] 92
Juan Soto needs 92 walks in his sixth season to average at least 100
walks per season.
We can confirm this using the mean() function.
# Soto's walks over six seasons
Soto_walks <- c(79, 108, 41, 145, 135, 92)
# Find mean
mean(Soto_walks)
[1] 100
# Find standard deviation
sd(Soto_walks)
[1] 38.20995
# Find maximum walks
max(Soto_walks)
[1] 145
# Find minimum walks
min(Soto_walks)
[1] 41
# Summary statistics
summary(Soto_walks)
Min. 1st Qu. Median Mean 3rd Qu. Max.
41.00 82.25 100.00 100.00 128.25 145.00
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 dollars a week.
Find the mean salary of all 14 professional players.
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
The mean salary of all 14 professional players is $75,428.57 per
week.
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 dollars a week. Find
the mean salary of all 16 professional players.
# Number of basketball players
n_1 <- 7
# Number of NFL players
n_2 <- 9
# Average basketball salary
y_1 <- 102000
# Average NFL salary
y_2 <- 91000
# Mean salary overall
salary_ave_q2 <- (n_1 * y_1 + n_2 * y_2) / (n_1 + n_2)
salary_ave_q2
[1] 95812.5
The mean salary of all 16 professional players is $95,812.50 per
week.
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.
| 6 |
28 |
| 5 |
72 |
| 4 |
201 |
| 3 |
109 |
| 2 |
56 |
| 1 |
34 |
Find the mean, the median, and the standard deviation.
Also answer:
- 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 percentage of the data lies within three standard deviations of
the mean?
- Draw a histogram to illustrate the data.
contract_length <- read.table("allcontracts.csv", header = TRUE, sep = ",")
contract_years <- contract_length$years
Percentage within one standard deviation of the mean
To correctly find the values within one standard deviation of the
mean, we check whether each value is between:
\[
\bar{x} - s
\]
and
\[
\bar{x} + s
\]
# Within 1 standard deviation
contracts_w1sd <- sum(abs(contract_years - contracts_mean) <= contracts_sd) / contracts_n
# Percentage within one standard deviation
contracts_w1sd
[1] 0.62
# As a percent
contracts_w1sd * 100
[1] 62
# Difference from empirical rule value of 68%
contracts_w1sd - 0.68
[1] -0.06
Percentage within two standard deviations of the mean
# Within 2 standard deviations
contracts_w2sd <- sum(abs(contract_years - contracts_mean) <= 2 * contracts_sd) / contracts_n
# Percentage within two standard deviations
contracts_w2sd
[1] 0.932
# As a percent
contracts_w2sd * 100
[1] 93.2
# Difference from empirical rule value of 95%
contracts_w2sd - 0.95
[1] -0.018
Percentage within three standard deviations of the mean
# Within 3 standard deviations
contracts_w3sd <- sum(abs(contract_years - contracts_mean) <= 3 * contracts_sd) / contracts_n
# Percentage within three standard deviations
contracts_w3sd
[1] 1
# As a percent
contracts_w3sd * 100
[1] 100
# Difference from empirical rule value of 99.73%
contracts_w3sd - 0.9973
[1] 0.0027
Histogram
# Create histogram
hist(
contract_years,
xlab = "Years Left in Contract",
main = "Histogram of Years Left in Contract",
col = "green",
border = "red",
xlim = c(0, 8),
ylim = c(0, 225),
breaks = 5
)

Question 3
Use the skills learned in Case-scenario 3 on one of the following
datasets. You may choose only one dataset. They are both available in
Canvas.
doubles_hit.csv
triples_hit.csv
chosen_file <- "doubles_hit.csv"
# Read the selected data file
doubles_data <- read.csv(chosen_file, header = TRUE)
# View the first few rows
head(doubles_data)
# Show the structure of the data
str(doubles_data)
'data.frame': 100 obs. of 1 variable:
$ doubles_hit: int 37 4 6 7 9 25 18 11 8 13 ...
# Select the first numeric column from the data
numeric_columns <- sapply(doubles_data, is.numeric)
doubles_values <- doubles_data[[which(numeric_columns)[1]]]
# Confirm selected values
head(doubles_values)
[1] 37 4 6 7 9 25
Percentage within one standard deviation of the mean
# Within 1 standard deviation
doubles_w1sd <- sum(abs(doubles_values - doubles_mean) <= doubles_sd, na.rm = TRUE) / doubles_n
# Percentage within one standard deviation
doubles_w1sd
[1] 0.58
# As a percent
doubles_w1sd * 100
[1] 58
# Difference from empirical rule value of 68%
doubles_w1sd - 0.68
[1] -0.1
Percentage within two standard deviations of the mean
# Within 2 standard deviations
doubles_w2sd <- sum(abs(doubles_values - doubles_mean) <= 2 * doubles_sd, na.rm = TRUE) / doubles_n
# Percentage within two standard deviations
doubles_w2sd
[1] 1
# As a percent
doubles_w2sd * 100
[1] 100
# Difference from empirical rule value of 95%
doubles_w2sd - 0.95
[1] 0.05
Percentage within three standard deviations of the mean
# Within 3 standard deviations
doubles_w3sd <- sum(abs(doubles_values - doubles_mean) <= 3 * doubles_sd, na.rm = TRUE) / doubles_n
# Percentage within three standard deviations
doubles_w3sd
[1] 1
# As a percent
doubles_w3sd * 100
[1] 100
# Difference from empirical rule value of 99.73%
doubles_w3sd - 0.9973
[1] 0.0027
Histogram for the selected dataset
# Create histogram
hist(
doubles_values,
xlab = "Doubles Hit",
main = "Histogram of Doubles Hit",
col = "green",
border = "red"
)

Written conclusion for Question 3
After placing doubles_hit.csv in the same folder as this
R Markdown file and knitting the document, the code will calculate the
mean, median, standard deviation, percentages within one, two, and three
standard deviations of the mean, and create a histogram.
This follows the same steps used in Case-scenario 3.
LS0tCnRpdGxlOiAiR2V0dGluZyBTdGFydGVkIHdpdGggUiwgUGFydCAyIgphdXRob3I6ICJKdWxpbyBIZXJuYW5kZXoiCm91dHB1dDoKICBodG1sX25vdGVib29rOgogICAgdG9jOiB0cnVlCiAgICB0b2NfZmxvYXQ6IHRydWUKLS0tCgoKLS0tCgojIENhc2Utc2NlbmFyaW8gMQoKVGhpcyBpcyB0aGUgZm91cnRoIHNlYXNvbiBvZiBvdXRmaWVsZGVyIEx1aXMgUm9iZXJ0IHdpdGggdGhlIENoaWNhZ28gV2hpdGUgU294LiBJZiBkdXJpbmcgdGhlIGZpcnN0IHRocmVlIHNlYXNvbnMgaGUgaGl0IDExLCAxMywgYW5kIDEyIGhvbWUgcnVucywgaG93IG1hbnkgZG9lcyBoZSBuZWVkIHRoaXMgc2Vhc29uIGZvciBoaXMgb3ZlcmFsbCBhdmVyYWdlIHRvIGJlIGF0IGxlYXN0IDIwPwoKYGBge3J9CiMgSG9tZS1ydW5zIHNvIGZhcgpIUl9iZWZvcmUgPC0gYygxMSwgMTMsIDEyKQoKIyBBdmVyYWdlIG51bWJlciBvZiBob21lLXJ1bnMgcGVyIHNlYXNvbiB3YW50ZWQKd2FudGVkX0hSIDwtIDIwCgojIE51bWJlciBvZiBzZWFzb25zCm5fc2Vhc29ucyA8LSA0CgojIE5lZWRlZCBob21lLXJ1bnMgaW4gc2Vhc29uIDQKeF80IDwtIG5fc2Vhc29ucyAqIHdhbnRlZF9IUiAtIHN1bShIUl9iZWZvcmUpCgojIE1pbmltdW0gbnVtYmVyIG9mIGhvbWUtcnVucyBuZWVkZWQgYnkgUm9iZXJ0CnhfNApgYGAKCkFjY29yZGluZyB0byB0aGUgY2FsY3VsYXRpb24gYWJvdmUsIEx1aXMgUm9iZXJ0IG11c3QgaGl0IDQ0IGhvbWUgcnVucyBvciBtb3JlIHRoaXMgc2Vhc29uIHRvIGF2ZXJhZ2UgYXQgbGVhc3QgMjAgaG9tZSBydW5zIHBlciBzZWFzb24uCgpXZSBjYW4gY29uZmlybSB0aGlzIHVzaW5nIGBtZWFuKClgIGluIFIuCgpgYGB7cn0KIyBSb2JlcnQncyBwZXJmb3JtYW5jZQpSb2JlcnRfSFJzIDwtIGMoMTEsIDEzLCAxMiwgNDQpCgojIEZpbmQgbWVhbgptZWFuKFJvYmVydF9IUnMpCgojIEZpbmQgc3RhbmRhcmQgZGV2aWF0aW9uCnNkKFJvYmVydF9IUnMpCgojIEZpbmQgdGhlIG1heGltdW0gbnVtYmVyIG9mIGhvbWUtcnVucyBkdXJpbmcgdGhlIGZvdXItc2Vhc29uIHBlcmlvZAptYXgoUm9iZXJ0X0hScykKCiMgRmluZCB0aGUgbWluaW11bSBudW1iZXIgb2YgaG9tZS1ydW5zIGR1cmluZyB0aGUgZm91ci1zZWFzb24gcGVyaW9kCm1pbihSb2JlcnRfSFJzKQoKIyBTdW1tYXJ5IHN0YXRpc3RpY3MKc3VtbWFyeShSb2JlcnRfSFJzKQpgYGAKCi0tLQoKIyBRdWVzdGlvbiAxCgpUaGlzIGlzIHRoZSBzaXh0aCBzZWFzb24gb2Ygb3V0ZmllbGRlciBKdWFuIFNvdG8gaW4gdGhlIG1ham9ycy4gSWYgZHVyaW5nIHRoZSBmaXJzdCBmaXZlIHNlYXNvbnMgaGUgcmVjZWl2ZWQgNzksIDEwOCwgNDEsIDE0NSwgYW5kIDEzNSB3YWxrcywgaG93IG1hbnkgZG9lcyBoZSBuZWVkIHRoaXMgc2Vhc29uIGZvciBoaXMgb3ZlcmFsbCBudW1iZXIgb2Ygd2Fsa3MgcGVyIHNlYXNvbiB0byBiZSBhdCBsZWFzdCAxMDA/CgpgYGB7cn0KIyBXYWxrcyBzbyBmYXIKd2Fsa3NfYmVmb3JlIDwtIGMoNzksIDEwOCwgNDEsIDE0NSwgMTM1KQoKIyBBdmVyYWdlIG51bWJlciBvZiB3YWxrcyB3YW50ZWQKd2FudGVkX3dhbGtzIDwtIDEwMAoKIyBOdW1iZXIgb2Ygc2Vhc29ucwpuX3NlYXNvbnMgPC0gNgoKIyBOZWVkZWQgd2Fsa3MgaW4gc2Vhc29uIDYKeF82IDwtIG5fc2Vhc29ucyAqIHdhbnRlZF93YWxrcyAtIHN1bSh3YWxrc19iZWZvcmUpCgojIE1pbmltdW0gbnVtYmVyIG9mIHdhbGtzIG5lZWRlZCBieSBKdWFuIFNvdG8KeF82CmBgYAoKSnVhbiBTb3RvIG5lZWRzIDkyIHdhbGtzIGluIGhpcyBzaXh0aCBzZWFzb24gdG8gYXZlcmFnZSBhdCBsZWFzdCAxMDAgd2Fsa3MgcGVyIHNlYXNvbi4KCldlIGNhbiBjb25maXJtIHRoaXMgdXNpbmcgdGhlIGBtZWFuKClgIGZ1bmN0aW9uLgoKYGBge3J9CiMgU290bydzIHdhbGtzIG92ZXIgc2l4IHNlYXNvbnMKU290b193YWxrcyA8LSBjKDc5LCAxMDgsIDQxLCAxNDUsIDEzNSwgOTIpCgojIEZpbmQgbWVhbgptZWFuKFNvdG9fd2Fsa3MpCgojIEZpbmQgc3RhbmRhcmQgZGV2aWF0aW9uCnNkKFNvdG9fd2Fsa3MpCgojIEZpbmQgbWF4aW11bSB3YWxrcwptYXgoU290b193YWxrcykKCiMgRmluZCBtaW5pbXVtIHdhbGtzCm1pbihTb3RvX3dhbGtzKQoKIyBTdW1tYXJ5IHN0YXRpc3RpY3MKc3VtbWFyeShTb3RvX3dhbGtzKQpgYGAKCi0tLQoKIyBDYXNlLXNjZW5hcmlvIDIKClRoZSBhdmVyYWdlIHNhbGFyeSBvZiAxMCBiYXNlYmFsbCBwbGF5ZXJzIGlzIDcyLDAwMCBkb2xsYXJzIGEgd2VlayBhbmQgdGhlIGF2ZXJhZ2Ugc2FsYXJ5IG9mIDQgc29jY2VyIHBsYXllcnMgaXMgODQsMDAwIGRvbGxhcnMgYSB3ZWVrLiBGaW5kIHRoZSBtZWFuIHNhbGFyeSBvZiBhbGwgMTQgcHJvZmVzc2lvbmFsIHBsYXllcnMuCgpgYGB7cn0Kbl8xIDwtIDEwCm5fMiA8LSA0CnlfMSA8LSA3MjAwMAp5XzIgPC0gODQwMDAKCiMgTWVhbiBzYWxhcnkgb3ZlcmFsbApzYWxhcnlfYXZlIDwtIChuXzEgKiB5XzEgKyBuXzIgKiB5XzIpIC8gKG5fMSArIG5fMikKCnNhbGFyeV9hdmUKYGBgCgpUaGUgbWVhbiBzYWxhcnkgb2YgYWxsIDE0IHByb2Zlc3Npb25hbCBwbGF5ZXJzIGlzICQ3NSw0MjguNTcgcGVyIHdlZWsuCgotLS0KCiMgUXVlc3Rpb24gMgoKVGhlIGF2ZXJhZ2Ugc2FsYXJ5IG9mIDcgYmFza2V0YmFsbCBwbGF5ZXJzIGlzIDEwMiwwMDAgZG9sbGFycyBhIHdlZWsgYW5kIHRoZSBhdmVyYWdlIHNhbGFyeSBvZiA5IE5GTCBwbGF5ZXJzIGlzIDkxLDAwMCBkb2xsYXJzIGEgd2Vlay4gRmluZCB0aGUgbWVhbiBzYWxhcnkgb2YgYWxsIDE2IHByb2Zlc3Npb25hbCBwbGF5ZXJzLgoKYGBge3J9CiMgTnVtYmVyIG9mIGJhc2tldGJhbGwgcGxheWVycwpuXzEgPC0gNwoKIyBOdW1iZXIgb2YgTkZMIHBsYXllcnMKbl8yIDwtIDkKCiMgQXZlcmFnZSBiYXNrZXRiYWxsIHNhbGFyeQp5XzEgPC0gMTAyMDAwCgojIEF2ZXJhZ2UgTkZMIHNhbGFyeQp5XzIgPC0gOTEwMDAKCiMgTWVhbiBzYWxhcnkgb3ZlcmFsbApzYWxhcnlfYXZlX3EyIDwtIChuXzEgKiB5XzEgKyBuXzIgKiB5XzIpIC8gKG5fMSArIG5fMikKCnNhbGFyeV9hdmVfcTIKYGBgCgpUaGUgbWVhbiBzYWxhcnkgb2YgYWxsIDE2IHByb2Zlc3Npb25hbCBwbGF5ZXJzIGlzICQ5NSw4MTIuNTAgcGVyIHdlZWsuCgotLS0KCiMgQ2FzZS1zY2VuYXJpbyAzCgpUaGUgZnJlcXVlbmN5IGRpc3RyaWJ1dGlvbiBiZWxvdyBsaXN0cyB0aGUgbnVtYmVyIG9mIGFjdGl2ZSBwbGF5ZXJzIGluIHRoZSBCYXJjbGF5cyBQcmVtaWVyIExlYWd1ZSBhbmQgdGhlIHRpbWUgbGVmdCBpbiB0aGVpciBjb250cmFjdC4KCnwgWWVhcnMgfCBOdW1iZXIgb2YgcGxheWVycyB8CnwtLS06fC0tLTp8CnwgNiB8IDI4IHwKfCA1IHwgNzIgfAp8IDQgfCAyMDEgfAp8IDMgfCAxMDkgfAp8IDIgfCA1NiB8CnwgMSB8IDM0IHwKCkZpbmQgdGhlIG1lYW4sIHRoZSBtZWRpYW4sIGFuZCB0aGUgc3RhbmRhcmQgZGV2aWF0aW9uLgoKQWxzbyBhbnN3ZXI6CgotIFdoYXQgcGVyY2VudGFnZSBvZiB0aGUgZGF0YSBsaWVzIHdpdGhpbiBvbmUgc3RhbmRhcmQgZGV2aWF0aW9uIG9mIHRoZSBtZWFuPwotIFdoYXQgcGVyY2VudGFnZSBvZiB0aGUgZGF0YSBsaWVzIHdpdGhpbiB0d28gc3RhbmRhcmQgZGV2aWF0aW9ucyBvZiB0aGUgbWVhbj8KLSBXaGF0IHBlcmNlbnRhZ2Ugb2YgdGhlIGRhdGEgbGllcyB3aXRoaW4gdGhyZWUgc3RhbmRhcmQgZGV2aWF0aW9ucyBvZiB0aGUgbWVhbj8KLSBEcmF3IGEgaGlzdG9ncmFtIHRvIGlsbHVzdHJhdGUgdGhlIGRhdGEuCgpgYGB7ciwgZXZhbD1GQUxTRX0KY29udHJhY3RfbGVuZ3RoIDwtIHJlYWQudGFibGUoImFsbGNvbnRyYWN0cy5jc3YiLCBoZWFkZXIgPSBUUlVFLCBzZXAgPSAiLCIpCmNvbnRyYWN0X3llYXJzIDwtIGNvbnRyYWN0X2xlbmd0aCR5ZWFycwpgYGAKCiMjIE1lYW4sIG1lZGlhbiwgYW5kIHN0YW5kYXJkIGRldmlhdGlvbgoKYGBge3J9CiMgTWVhbgpjb250cmFjdHNfbWVhbiA8LSBtZWFuKGNvbnRyYWN0X3llYXJzKQpjb250cmFjdHNfbWVhbgoKIyBNZWRpYW4KY29udHJhY3RzX21lZGlhbiA8LSBtZWRpYW4oY29udHJhY3RfeWVhcnMpCmNvbnRyYWN0c19tZWRpYW4KCiMgTnVtYmVyIG9mIG9ic2VydmF0aW9ucwpjb250cmFjdHNfbiA8LSBsZW5ndGgoY29udHJhY3RfeWVhcnMpCmNvbnRyYWN0c19uCgojIFN0YW5kYXJkIGRldmlhdGlvbgpjb250cmFjdHNfc2QgPC0gc2QoY29udHJhY3RfeWVhcnMpCmNvbnRyYWN0c19zZAoKIyBTdW1tYXJ5IHN0YXRpc3RpY3MKc3VtbWFyeShjb250cmFjdF95ZWFycykKYGBgCgojIyBQZXJjZW50YWdlIHdpdGhpbiBvbmUgc3RhbmRhcmQgZGV2aWF0aW9uIG9mIHRoZSBtZWFuCgpUbyBjb3JyZWN0bHkgZmluZCB0aGUgdmFsdWVzIHdpdGhpbiBvbmUgc3RhbmRhcmQgZGV2aWF0aW9uIG9mIHRoZSBtZWFuLCB3ZSBjaGVjayB3aGV0aGVyIGVhY2ggdmFsdWUgaXMgYmV0d2VlbjoKClxbClxiYXJ7eH0gLSBzClxdCgphbmQKClxbClxiYXJ7eH0gKyBzClxdCgpgYGB7cn0KIyBXaXRoaW4gMSBzdGFuZGFyZCBkZXZpYXRpb24KY29udHJhY3RzX3cxc2QgPC0gc3VtKGFicyhjb250cmFjdF95ZWFycyAtIGNvbnRyYWN0c19tZWFuKSA8PSBjb250cmFjdHNfc2QpIC8gY29udHJhY3RzX24KCiMgUGVyY2VudGFnZSB3aXRoaW4gb25lIHN0YW5kYXJkIGRldmlhdGlvbgpjb250cmFjdHNfdzFzZAoKIyBBcyBhIHBlcmNlbnQKY29udHJhY3RzX3cxc2QgKiAxMDAKCiMgRGlmZmVyZW5jZSBmcm9tIGVtcGlyaWNhbCBydWxlIHZhbHVlIG9mIDY4JQpjb250cmFjdHNfdzFzZCAtIDAuNjgKYGBgCgojIyBQZXJjZW50YWdlIHdpdGhpbiB0d28gc3RhbmRhcmQgZGV2aWF0aW9ucyBvZiB0aGUgbWVhbgoKYGBge3J9CiMgV2l0aGluIDIgc3RhbmRhcmQgZGV2aWF0aW9ucwpjb250cmFjdHNfdzJzZCA8LSBzdW0oYWJzKGNvbnRyYWN0X3llYXJzIC0gY29udHJhY3RzX21lYW4pIDw9IDIgKiBjb250cmFjdHNfc2QpIC8gY29udHJhY3RzX24KCiMgUGVyY2VudGFnZSB3aXRoaW4gdHdvIHN0YW5kYXJkIGRldmlhdGlvbnMKY29udHJhY3RzX3cyc2QKCiMgQXMgYSBwZXJjZW50CmNvbnRyYWN0c193MnNkICogMTAwCgojIERpZmZlcmVuY2UgZnJvbSBlbXBpcmljYWwgcnVsZSB2YWx1ZSBvZiA5NSUKY29udHJhY3RzX3cyc2QgLSAwLjk1CmBgYAoKIyMgUGVyY2VudGFnZSB3aXRoaW4gdGhyZWUgc3RhbmRhcmQgZGV2aWF0aW9ucyBvZiB0aGUgbWVhbgoKYGBge3J9CiMgV2l0aGluIDMgc3RhbmRhcmQgZGV2aWF0aW9ucwpjb250cmFjdHNfdzNzZCA8LSBzdW0oYWJzKGNvbnRyYWN0X3llYXJzIC0gY29udHJhY3RzX21lYW4pIDw9IDMgKiBjb250cmFjdHNfc2QpIC8gY29udHJhY3RzX24KCiMgUGVyY2VudGFnZSB3aXRoaW4gdGhyZWUgc3RhbmRhcmQgZGV2aWF0aW9ucwpjb250cmFjdHNfdzNzZAoKIyBBcyBhIHBlcmNlbnQKY29udHJhY3RzX3czc2QgKiAxMDAKCiMgRGlmZmVyZW5jZSBmcm9tIGVtcGlyaWNhbCBydWxlIHZhbHVlIG9mIDk5LjczJQpjb250cmFjdHNfdzNzZCAtIDAuOTk3MwpgYGAKCiMjIEhpc3RvZ3JhbQoKYGBge3J9CiMgQ3JlYXRlIGhpc3RvZ3JhbQpoaXN0KAogIGNvbnRyYWN0X3llYXJzLAogIHhsYWIgPSAiWWVhcnMgTGVmdCBpbiBDb250cmFjdCIsCiAgbWFpbiA9ICJIaXN0b2dyYW0gb2YgWWVhcnMgTGVmdCBpbiBDb250cmFjdCIsCiAgY29sID0gImdyZWVuIiwKICBib3JkZXIgPSAicmVkIiwKICB4bGltID0gYygwLCA4KSwKICB5bGltID0gYygwLCAyMjUpLAogIGJyZWFrcyA9IDUKKQpgYGAKCi0tLQoKIyBRdWVzdGlvbiAzCgpVc2UgdGhlIHNraWxscyBsZWFybmVkIGluIENhc2Utc2NlbmFyaW8gMyBvbiBvbmUgb2YgdGhlIGZvbGxvd2luZyBkYXRhc2V0cy4gWW91IG1heSBjaG9vc2Ugb25seSBvbmUgZGF0YXNldC4gVGhleSBhcmUgYm90aCBhdmFpbGFibGUgaW4gQ2FudmFzLgoKLSBgZG91Ymxlc19oaXQuY3N2YAotIGB0cmlwbGVzX2hpdC5jc3ZgCgpgYGB7cn0KY2hvc2VuX2ZpbGUgPC0gImRvdWJsZXNfaGl0LmNzdiIKCiMgUmVhZCB0aGUgc2VsZWN0ZWQgZGF0YSBmaWxlCmRvdWJsZXNfZGF0YSA8LSByZWFkLmNzdihjaG9zZW5fZmlsZSwgaGVhZGVyID0gVFJVRSkKCiMgVmlldyB0aGUgZmlyc3QgZmV3IHJvd3MKaGVhZChkb3VibGVzX2RhdGEpCgojIFNob3cgdGhlIHN0cnVjdHVyZSBvZiB0aGUgZGF0YQpzdHIoZG91Ymxlc19kYXRhKQoKIyBTZWxlY3QgdGhlIGZpcnN0IG51bWVyaWMgY29sdW1uIGZyb20gdGhlIGRhdGEKbnVtZXJpY19jb2x1bW5zIDwtIHNhcHBseShkb3VibGVzX2RhdGEsIGlzLm51bWVyaWMpCmRvdWJsZXNfdmFsdWVzIDwtIGRvdWJsZXNfZGF0YVtbd2hpY2gobnVtZXJpY19jb2x1bW5zKVsxXV1dCgojIENvbmZpcm0gc2VsZWN0ZWQgdmFsdWVzCmhlYWQoZG91Ymxlc192YWx1ZXMpCmBgYAoKIyMgTWVhbiwgbWVkaWFuLCBhbmQgc3RhbmRhcmQgZGV2aWF0aW9uIGZvciB0aGUgc2VsZWN0ZWQgZGF0YXNldAoKYGBge3J9CiMgTWVhbgpkb3VibGVzX21lYW4gPC0gbWVhbihkb3VibGVzX3ZhbHVlcywgbmEucm0gPSBUUlVFKQpkb3VibGVzX21lYW4KCiMgTWVkaWFuCmRvdWJsZXNfbWVkaWFuIDwtIG1lZGlhbihkb3VibGVzX3ZhbHVlcywgbmEucm0gPSBUUlVFKQpkb3VibGVzX21lZGlhbgoKIyBOdW1iZXIgb2Ygb2JzZXJ2YXRpb25zCmRvdWJsZXNfbiA8LSBzdW0oIWlzLm5hKGRvdWJsZXNfdmFsdWVzKSkKZG91Ymxlc19uCgojIFN0YW5kYXJkIGRldmlhdGlvbgpkb3VibGVzX3NkIDwtIHNkKGRvdWJsZXNfdmFsdWVzLCBuYS5ybSA9IFRSVUUpCmRvdWJsZXNfc2QKCiMgU3VtbWFyeSBzdGF0aXN0aWNzCnN1bW1hcnkoZG91Ymxlc192YWx1ZXMpCmBgYAoKIyMgUGVyY2VudGFnZSB3aXRoaW4gb25lIHN0YW5kYXJkIGRldmlhdGlvbiBvZiB0aGUgbWVhbgoKYGBge3J9CiMgV2l0aGluIDEgc3RhbmRhcmQgZGV2aWF0aW9uCmRvdWJsZXNfdzFzZCA8LSBzdW0oYWJzKGRvdWJsZXNfdmFsdWVzIC0gZG91Ymxlc19tZWFuKSA8PSBkb3VibGVzX3NkLCBuYS5ybSA9IFRSVUUpIC8gZG91Ymxlc19uCgojIFBlcmNlbnRhZ2Ugd2l0aGluIG9uZSBzdGFuZGFyZCBkZXZpYXRpb24KZG91Ymxlc193MXNkCgojIEFzIGEgcGVyY2VudApkb3VibGVzX3cxc2QgKiAxMDAKCiMgRGlmZmVyZW5jZSBmcm9tIGVtcGlyaWNhbCBydWxlIHZhbHVlIG9mIDY4JQpkb3VibGVzX3cxc2QgLSAwLjY4CmBgYAoKIyMgUGVyY2VudGFnZSB3aXRoaW4gdHdvIHN0YW5kYXJkIGRldmlhdGlvbnMgb2YgdGhlIG1lYW4KCmBgYHtyfQojIFdpdGhpbiAyIHN0YW5kYXJkIGRldmlhdGlvbnMKZG91Ymxlc193MnNkIDwtIHN1bShhYnMoZG91Ymxlc192YWx1ZXMgLSBkb3VibGVzX21lYW4pIDw9IDIgKiBkb3VibGVzX3NkLCBuYS5ybSA9IFRSVUUpIC8gZG91Ymxlc19uCgojIFBlcmNlbnRhZ2Ugd2l0aGluIHR3byBzdGFuZGFyZCBkZXZpYXRpb25zCmRvdWJsZXNfdzJzZAoKIyBBcyBhIHBlcmNlbnQKZG91Ymxlc193MnNkICogMTAwCgojIERpZmZlcmVuY2UgZnJvbSBlbXBpcmljYWwgcnVsZSB2YWx1ZSBvZiA5NSUKZG91Ymxlc193MnNkIC0gMC45NQpgYGAKCiMjIFBlcmNlbnRhZ2Ugd2l0aGluIHRocmVlIHN0YW5kYXJkIGRldmlhdGlvbnMgb2YgdGhlIG1lYW4KCmBgYHtyfQojIFdpdGhpbiAzIHN0YW5kYXJkIGRldmlhdGlvbnMKZG91Ymxlc193M3NkIDwtIHN1bShhYnMoZG91Ymxlc192YWx1ZXMgLSBkb3VibGVzX21lYW4pIDw9IDMgKiBkb3VibGVzX3NkLCBuYS5ybSA9IFRSVUUpIC8gZG91Ymxlc19uCgojIFBlcmNlbnRhZ2Ugd2l0aGluIHRocmVlIHN0YW5kYXJkIGRldmlhdGlvbnMKZG91Ymxlc193M3NkCgojIEFzIGEgcGVyY2VudApkb3VibGVzX3czc2QgKiAxMDAKCiMgRGlmZmVyZW5jZSBmcm9tIGVtcGlyaWNhbCBydWxlIHZhbHVlIG9mIDk5LjczJQpkb3VibGVzX3czc2QgLSAwLjk5NzMKYGBgCgojIyBIaXN0b2dyYW0gZm9yIHRoZSBzZWxlY3RlZCBkYXRhc2V0CgpgYGB7cn0KIyBDcmVhdGUgaGlzdG9ncmFtCmhpc3QoCiAgZG91Ymxlc192YWx1ZXMsCiAgeGxhYiA9ICJEb3VibGVzIEhpdCIsCiAgbWFpbiA9ICJIaXN0b2dyYW0gb2YgRG91YmxlcyBIaXQiLAogIGNvbCA9ICJncmVlbiIsCiAgYm9yZGVyID0gInJlZCIKKQpgYGAKCiMjIFdyaXR0ZW4gY29uY2x1c2lvbiBmb3IgUXVlc3Rpb24gMwoKQWZ0ZXIgcGxhY2luZyBgZG91Ymxlc19oaXQuY3N2YCBpbiB0aGUgc2FtZSBmb2xkZXIgYXMgdGhpcyBSIE1hcmtkb3duIGZpbGUgYW5kIGtuaXR0aW5nIHRoZSBkb2N1bWVudCwgdGhlIGNvZGUgd2lsbCBjYWxjdWxhdGUgdGhlIG1lYW4sIG1lZGlhbiwgc3RhbmRhcmQgZGV2aWF0aW9uLCBwZXJjZW50YWdlcyB3aXRoaW4gb25lLCB0d28sIGFuZCB0aHJlZSBzdGFuZGFyZCBkZXZpYXRpb25zIG9mIHRoZSBtZWFuLCBhbmQgY3JlYXRlIGEgaGlzdG9ncmFtLgoKVGhpcyBmb2xsb3dzIHRoZSBzYW1lIHN0ZXBzIHVzZWQgaW4gQ2FzZS1zY2VuYXJpbyAzLgo=