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.

Years Number of players
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

Mean, median, and standard deviation

# Mean
contracts_mean <- mean(contract_years)
contracts_mean
[1] 3.61
# Median
contracts_median <- median(contract_years)
contracts_median
[1] 4
# Number of observations
contracts_n <- length(contract_years)
contracts_n
[1] 500
# Standard deviation
contracts_sd <- sd(contract_years)
contracts_sd
[1] 1.223476
# Summary statistics
summary(contract_years)
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
   1.00    3.00    4.00    3.61    4.00    6.00 

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

Mean, median, and standard deviation for the selected dataset

# Mean
doubles_mean <- mean(doubles_values, na.rm = TRUE)
doubles_mean
[1] 23.55
# Median
doubles_median <- median(doubles_values, na.rm = TRUE)
doubles_median
[1] 23.5
# Number of observations
doubles_n <- sum(!is.na(doubles_values))
doubles_n
[1] 100
# Standard deviation
doubles_sd <- sd(doubles_values, na.rm = TRUE)
doubles_sd
[1] 13.37371
# Summary statistics
summary(doubles_values)
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
   1.00   12.75   23.50   23.55   34.00   49.00 

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=