# 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.
# Robert's performance
Robert_HRs <- c(11, 13, 12,44)
# Find mean
mean(Robert_HRs)
[1] 20
Robert 44 home runs in the fourth season results in an overall
average of 20 home runs per season.
# Robert's actual performance
Robert_HR <-c(11, 13, 12, 38)
mean(Roberts_HR)
[1] 18.5
Robert average 18.5 per season.
sd(Robert_HR)
[1] 13.02562
Robert’s home runs have a standard deviation of approximately 13.35
home runs.
max(Robert_HR)
[1] 38
Robert’s highest number of home runs in a single season was 38.
# Find the minimum number of home-runs during the four seasons period
min(Robert_HR)
[1] 11
This means Robert’s lowest number of home runs in a single season was
11.
summary(Robert_HR)
Min. 1st Qu. Median Mean 3rd Qu. Max.
11.00 11.75 12.50 18.50 19.25 38.00
Robert’s actual four-season performance ranges from 11 to 38 home
runs, with an average of 18.5 home runs per season.
# Walks so far
Walks_before <- c(79, 108, 41, 145, 135)
# Average Number of Walks per season wanted
wanted_Walks <- 100
# Number of seasons
n_seasons <- 6
# Needed Walks on season 6
x_6 <- n_seasons*wanted_Walks - sum(Walks_before)
# Minimum number of Walks needed by Soto
x_6
[1] 92
Question 1 Juan Soto needs 92 walks in his sixth season to have an
overall average of 100 walks per season.
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 overall average salary is approximately $75,428.57.
n_1 <- 7
n_2 <- 9
y_1 <- 102000
y_2 <- 91000
salary_ave <- (n_1*y_1 + n_2*y_2)/(n_1+n_2)
salary_ave
[1] 95812.5
Question 2 The mean salary of all 16 professional players is
$95,812.50 per week.
contract_length <- read.table("allcontracts.csv", header = TRUE, sep = ",")
contract_years <- contract_length$years
Importing the contract data and extracting the years column.
# Mean
contracts_mean <- mean(contract_years)
contracts_mean
[1] 3.458918
The mean average contract length from the contract_years.
# Median
contracts_median <- median(contract_years)
contracts_median
[1] 3
The median contract length from the contract_years data.
# Find number of observations
contracts_n <- length(contract_years)
# Find standard deviation
contracts_sd <- sd(contract_years)
Finds two important descriptive statistics for the contract data
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
Calculates the percentage of contract observations within one
standard deviation below the mean.
## Within 2 sd
contracts_w2sd <- sum((contract_years - contracts_mean)/ contracts_sd < 2)/contracts_n
contracts_w2sd
[1] 1
This follows the empirical rule, where about 95% of observations in a
normal distribution fall within 2 standard deviations of the mean.
## Difference from empirical
contracts_w2sd - 0.95
[1] 0.05
Calculates the difference between your actual percentage within 2
standard deviations and the Empirical Rule expectation.
## Within 3 sd
contracts_w3sd <- sum((contract_years - contracts_mean)/ contracts_sd < 3)/contracts_n
contracts_w3sd
[1] 1
Code calculates the proportion of contract observations within 3
standard deviations below the mean. The data is 5 percentage points
below the empirical rule expectation.
## Difference from empirical
contracts_w3sd - 0.9973
[1] 0.0027
The data is 1.73 percentage points below the empirical rule
expectation.
# Create histogram
hist(contract_years,xlab = "Years Left in Contract",col = "green",border = "red", xlim = c(0,8), ylim = c(0,225),
breaks = 3)

The histogram shows contract years are distributed fairly evenly from
0 to 6 years: 0-2 years: about 165 observations 2-4 years: about 175
observations, the most common range 4-6 years: about 155 observations,
the least common range There is no strong skew or dominant peak.
However, with only three wide bins, the chart hides finer patterns.
Using narrower bins, such as one-year intervals, would provide a more
informative view of the distribution.
Answers to question 3
doubles <- read.table("doubles_hit.csv", header = TRUE, sep = ",")
doublesnumber <- doubles$doubles_hit
Imports the data set and extracts the doubles number column.
# Mean
doublesnumber_mean <- mean(doublesnumber)
doublesnumber_mean
[1] 23.55
Calculates the mean (average) number of doubles hit.
# Median
contracts_median <- median(doublesnumber)
contracts_median
[1] 23.5
Calculates the median (middle value) of the doublesnumber data.
# Find number of observations
doubles_n <- length(doublesnumber)
# Find standard deviation
players_sd <- sd(doublesnumber)
Finds the number of observations and the standard deviation for the
doublesnumber data.
doublesnumber_w1sd <- sum((doublesnumber - doublesnumber_mean) / players_sd < 1) / doubles_n
# Percentage of observation within one standard deviation of the mean
doublesnumber_w1sd
[1] 0.79
Calculates the proportion (or percentage) of observations whose
z-score is less than 1.
## Difference from empirical
doublesnumber_w1sd - 0.68
[1] 0.11
Calculates how far your dataset is from the Empirical Rule for 1
standard deviation.
doublesnumber_w1sd <- sum((doublesnumber - doublesnumber_mean) / players_sd < 2) / doubles_n
# Percentage of observation within one standard deviation of the mean
doublesnumber_w1sd
[1] 1
Calculates the percentage (proportion) of players whose doubles hit
values are less than 2 standard deviations above the mean.
## Within 2 sd
doublesnumber_w2sd <- sum((doublesnumber - doublesnumber_mean) / players_sd < 2) / doubles_n
# Percentage of observation within one standard deviation of the mea
doublesnumber_w2sd
[1] 1
Calculates the proportion (percentage) of players whose doubles hit
values are less than 2 standard deviations above the mean.
## Difference from empirical
doublesnumber_w2sd - 0.95
[1] 0.05
Calculates the difference between your actual data result and the
Empirical Rule expectation for 2 standard deviations.
doublesnumber_w3sd <- sum((doublesnumber - doublesnumber_mean) / players_sd < 3) / doubles_n
# Percentage of observation within one standard deviation of the mean
doublesnumber_w3sd
[1] 1
` Calculates the proportion (percentage) of observations that are
less than 3 standard deviations above the mean.
## Difference from empirical
contracts_w3sd - 0.9973
[1] 0.0027
Calculates the difference between your actual percentage within 3
standard deviations and the Empirical Rule expectation. Doubles dataset,
revise the code by replacing contracts_w3sd with doublesnumber_w3sd.
# Create histogram
hist(doublesnumber,xlab = "Number of Doubles",col = "green",border = "red", xlim = c(0,4), ylim = c(0,100),
breaks = 5)

The histogram shows the distribution of the number of doubles hit by
players. The values range approximately from 1 to 4 doubles. The highest
frequency occurs between 1 and 2 doubles, indicating that this range
contains the largest number of observations. The remaining groups (2–3
and 3–4 doubles) also have relatively high frequencies, showing that the
data is fairly evenly distributed across the range. The distribution
appears to be approximately symmetric, with no major outliers visible.
Overall, the histogram suggests that players’ doubles hit values have
moderate variation, with most players falling between 1 and 4
doubles.
LS0tCnRpdGxlOiAiSW50cm8gdG8gUiBQYXJ0IDIiCm91dHB1dDogaHRtbF9ub3RlYm9vawotLS0KCgpgYGB7cn0KIyBIb21lLXJ1bnMgc28gZmFyCkhSX2JlZm9yZSA8LSBjKDExLCAxMywgMTIpCiMgQXZlcmFnZSBOdW1iZXIgb2YgSG9tZS1ydW5zIHBlciBzZWFzb24gd2FudGVkCndhbnRlZF9IUiA8LSAyMAojIE51bWJlciBvZiBzZWFzb25zCm5fc2Vhc29ucyA8LSA0CiMgTmVlZGVkIEhvbWUtcnVucyBvbiBzZWFzb24gNAp4XzQgPC0gbl9zZWFzb25zKndhbnRlZF9IUiAtIHN1bShIUl9iZWZvcmUpCiMgTWluaW11bSBudW1iZXIgb2YgSG9tZS1ydW5zIG5lZWRlZCBieSBSb2JlcnQKeF80CmBgYAoKCkFjY29yZGluZyB0byB0aGUgY2FsY3VsYXRpb25zIGFib3ZlLCBSb2JlcnQgbXVzdCBoaXQgNDQgaG9tZS1ydW5zIG9yIGJldHRlciBvbiB0aGlzIHNlYXNvbiB0byBnZXQgYW4gYXZlcmFnZSBudW1iZXIgb2YgaG9tZS1ydW5zIHBlciBzZWFzb24gb2YgYXQgbGVhc3QgMjAuCgoKCmBgYHtyfQojIFJvYmVydCdzIHBlcmZvcm1hbmNlClJvYmVydF9IUnMgPC0gYygxMSwgMTMsIDEyLDQ0KQojIEZpbmQgbWVhbgptZWFuKFJvYmVydF9IUnMpCmBgYAoKUm9iZXJ0IDQ0IGhvbWUgcnVucyBpbiB0aGUgZm91cnRoIHNlYXNvbiByZXN1bHRzIGluIGFuIG92ZXJhbGwgYXZlcmFnZSBvZiAyMCBob21lIHJ1bnMgcGVyIHNlYXNvbi4KCgpgYGB7cn0KIyBSb2JlcnQncyBhY3R1YWwgcGVyZm9ybWFuY2UKUm9iZXJ0X0hSIDwtYygxMSwgMTMsIDEyLCAzOCkKbWVhbihSb2JlcnRzX0hSKQpgYGAKCgpSb2JlcnQgYXZlcmFnZSAxOC41IHBlciBzZWFzb24uCgoKYGBge3J9CnNkKFJvYmVydF9IUikKYGBgCgoKUm9iZXJ0J3MgaG9tZSBydW5zIGhhdmUgYSBzdGFuZGFyZCBkZXZpYXRpb24gb2YgYXBwcm94aW1hdGVseSAxMy4zNSBob21lIHJ1bnMuCgoKYGBge3J9Cm1heChSb2JlcnRfSFIpCmBgYAoKClJvYmVydCdzIGhpZ2hlc3QgbnVtYmVyIG9mIGhvbWUgcnVucyBpbiBhIHNpbmdsZSBzZWFzb24gd2FzIDM4LgoKCmBgYHtyfQojIEZpbmQgdGhlIG1pbmltdW0gbnVtYmVyIG9mIGhvbWUtcnVucyBkdXJpbmcgdGhlIGZvdXIgc2Vhc29ucyBwZXJpb2QKbWluKFJvYmVydF9IUikKYGBgCgoKVGhpcyBtZWFucyBSb2JlcnQncyBsb3dlc3QgbnVtYmVyIG9mIGhvbWUgcnVucyBpbiBhIHNpbmdsZSBzZWFzb24gd2FzIDExLgoKCgpgYGB7cn0Kc3VtbWFyeShSb2JlcnRfSFIpCmBgYAoKClJvYmVydCdzIGFjdHVhbCBmb3VyLXNlYXNvbiBwZXJmb3JtYW5jZSByYW5nZXMgZnJvbSAxMSB0byAzOCBob21lIHJ1bnMsIHdpdGggYW4gYXZlcmFnZSBvZiAxOC41IGhvbWUgcnVucyBwZXIgc2Vhc29uLgoKCmBgYHtyfQojIFdhbGtzIHNvIGZhcgpXYWxrc19iZWZvcmUgPC0gYyg3OSwgMTA4LCA0MSwgMTQ1LCAxMzUpCgojIEF2ZXJhZ2UgTnVtYmVyIG9mIFdhbGtzIHBlciBzZWFzb24gd2FudGVkCndhbnRlZF9XYWxrcyA8LSAxMDAKCiMgTnVtYmVyIG9mIHNlYXNvbnMKbl9zZWFzb25zIDwtIDYKCiMgTmVlZGVkIFdhbGtzIG9uIHNlYXNvbiA2CnhfNiA8LSBuX3NlYXNvbnMqd2FudGVkX1dhbGtzIC0gc3VtKFdhbGtzX2JlZm9yZSkKCiMgTWluaW11bSBudW1iZXIgb2YgV2Fsa3MgbmVlZGVkIGJ5IFNvdG8KeF82CmBgYAoKUXVlc3Rpb24gMQpKdWFuIFNvdG8gbmVlZHMgOTIgd2Fsa3MgaW4gaGlzIHNpeHRoIHNlYXNvbiB0byBoYXZlIGFuIG92ZXJhbGwgYXZlcmFnZSBvZiAxMDAgd2Fsa3MgcGVyIHNlYXNvbi4KCgpgYGB7cn0Kbl8xIDwtIDEwCm5fMiA8LSA0CnlfMSA8LSA3MjAwMAp5XzIgPC0gODQwMDAKIyBNZWFuIHNhbGFyeSBvdmVyYWxsCnNhbGFyeV9hdmUgPC0gIChuXzEqeV8xICsgbl8yKnlfMikvKG5fMStuXzIpCnNhbGFyeV9hdmUKYGBgCgpUaGUgb3ZlcmFsbCBhdmVyYWdlIHNhbGFyeSBpcyBhcHByb3hpbWF0ZWx5ICQ3NSw0MjguNTcuCgoKCmBgYHtyfQpuXzEgPC0gNwpuXzIgPC0gOQoKeV8xIDwtIDEwMjAwMAp5XzIgPC0gOTEwMDAKCnNhbGFyeV9hdmUgPC0gKG5fMSp5XzEgKyBuXzIqeV8yKS8obl8xK25fMikKCnNhbGFyeV9hdmUKYGBgCgpRdWVzdGlvbiAyClRoZSBtZWFuIHNhbGFyeSBvZiBhbGwgMTYgcHJvZmVzc2lvbmFsIHBsYXllcnMgaXMgJDk1LDgxMi41MCBwZXIgd2Vlay4KCgpgYGB7cn0KY29udHJhY3RfbGVuZ3RoIDwtIHJlYWQudGFibGUoImFsbGNvbnRyYWN0cy5jc3YiLCBoZWFkZXIgPSBUUlVFLCBzZXAgPSAiLCIpCmNvbnRyYWN0X3llYXJzIDwtIGNvbnRyYWN0X2xlbmd0aCR5ZWFycwpgYGAKCkltcG9ydGluZyB0aGUgY29udHJhY3QgZGF0YSBhbmQgZXh0cmFjdGluZyB0aGUgeWVhcnMgY29sdW1uLgoKCgpgYGB7cn0KIyBNZWFuIApjb250cmFjdHNfbWVhbiAgPC0gbWVhbihjb250cmFjdF95ZWFycykKY29udHJhY3RzX21lYW4KYGBgCgpUaGUgbWVhbiBhdmVyYWdlIGNvbnRyYWN0IGxlbmd0aCBmcm9tIHRoZSBjb250cmFjdF95ZWFycy4KCgoKYGBge3J9CiMgTWVkaWFuCmNvbnRyYWN0c19tZWRpYW4gPC0gbWVkaWFuKGNvbnRyYWN0X3llYXJzKQpjb250cmFjdHNfbWVkaWFuCmBgYAoKVGhlIG1lZGlhbiBjb250cmFjdCBsZW5ndGggZnJvbSB0aGUgY29udHJhY3RfeWVhcnMgZGF0YS4KCgpgYGB7cn0KIyBGaW5kIG51bWJlciBvZiBvYnNlcnZhdGlvbnMKY29udHJhY3RzX24gPC0gbGVuZ3RoKGNvbnRyYWN0X3llYXJzKQojIEZpbmQgc3RhbmRhcmQgZGV2aWF0aW9uCmNvbnRyYWN0c19zZCA8LSBzZChjb250cmFjdF95ZWFycykKYGBgCgpGaW5kcyB0d28gaW1wb3J0YW50IGRlc2NyaXB0aXZlIHN0YXRpc3RpY3MgZm9yIHRoZSBjb250cmFjdCBkYXRhCgoKCmBgYHtyfQpjb250cmFjdHNfdzFzZCA8LSBzdW0oKGNvbnRyYWN0X3llYXJzIC0gY29udHJhY3RzX21lYW4pL2NvbnRyYWN0c19zZCA8IDEpLyBjb250cmFjdHNfbgojIFBlcmNlbnRhZ2Ugb2Ygb2JzZXJ2YXRpb24gd2l0aGluIG9uZSBzdGFuZGFyZCBkZXZpYXRpb24gb2YgdGhlIG1lYW4KY29udHJhY3RzX3cxc2QKYGBgCgpDYWxjdWxhdGVzIHRoZSBwZXJjZW50YWdlIG9mIGNvbnRyYWN0IG9ic2VydmF0aW9ucyB3aXRoaW4gb25lIHN0YW5kYXJkIGRldmlhdGlvbiBiZWxvdyB0aGUgbWVhbi4KCgpgYGB7cn0KIyMgV2l0aGluIDIgc2QKY29udHJhY3RzX3cyc2QgPC0gc3VtKChjb250cmFjdF95ZWFycyAtIGNvbnRyYWN0c19tZWFuKS8gY29udHJhY3RzX3NkIDwgMikvY29udHJhY3RzX24KY29udHJhY3RzX3cyc2QKYGBgCgpUaGlzIGZvbGxvd3MgdGhlIGVtcGlyaWNhbCBydWxlLCB3aGVyZSBhYm91dCA5NSUgb2Ygb2JzZXJ2YXRpb25zIGluIGEgbm9ybWFsIGRpc3RyaWJ1dGlvbiBmYWxsIHdpdGhpbiAyIHN0YW5kYXJkIGRldmlhdGlvbnMgb2YgdGhlIG1lYW4uCgoKYGBge3J9CiMjIERpZmZlcmVuY2UgZnJvbSBlbXBpcmljYWwgCmNvbnRyYWN0c193MnNkIC0gMC45NQpgYGAKCgpDYWxjdWxhdGVzIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4geW91ciBhY3R1YWwgcGVyY2VudGFnZSB3aXRoaW4gMiBzdGFuZGFyZCBkZXZpYXRpb25zIGFuZCB0aGUgRW1waXJpY2FsIFJ1bGUgZXhwZWN0YXRpb24uCgoKCmBgYHtyfQojIyBXaXRoaW4gMyBzZCAKY29udHJhY3RzX3czc2QgPC0gc3VtKChjb250cmFjdF95ZWFycyAtIGNvbnRyYWN0c19tZWFuKS8gY29udHJhY3RzX3NkIDwgMykvY29udHJhY3RzX24KY29udHJhY3RzX3czc2QKYGBgCgoKQ29kZSBjYWxjdWxhdGVzIHRoZSBwcm9wb3J0aW9uIG9mIGNvbnRyYWN0IG9ic2VydmF0aW9ucyB3aXRoaW4gMyBzdGFuZGFyZCBkZXZpYXRpb25zIGJlbG93IHRoZSBtZWFuLgpUaGUgZGF0YSBpcyA1IHBlcmNlbnRhZ2UgcG9pbnRzIGJlbG93IHRoZSBlbXBpcmljYWwgcnVsZSBleHBlY3RhdGlvbi4KCgoKCmBgYHtyfQojIyBEaWZmZXJlbmNlIGZyb20gZW1waXJpY2FsIApjb250cmFjdHNfdzNzZCAtIDAuOTk3MwpgYGAKClRoZSBkYXRhIGlzIDEuNzMgcGVyY2VudGFnZSBwb2ludHMgYmVsb3cgdGhlIGVtcGlyaWNhbCBydWxlIGV4cGVjdGF0aW9uLgoKCgpgYGB7cn0KIyBDcmVhdGUgaGlzdG9ncmFtCmhpc3QoY29udHJhY3RfeWVhcnMseGxhYiA9ICJZZWFycyBMZWZ0IGluIENvbnRyYWN0Iixjb2wgPSAiZ3JlZW4iLGJvcmRlciA9ICJyZWQiLCB4bGltID0gYygwLDgpLCB5bGltID0gYygwLDIyNSksCiAgIGJyZWFrcyA9IDMpCmBgYAogCgpUaGUgaGlzdG9ncmFtIHNob3dzIGNvbnRyYWN0IHllYXJzIGFyZSBkaXN0cmlidXRlZCBmYWlybHkgZXZlbmx5IGZyb20gMCB0byA2IHllYXJzOgowLTIgeWVhcnM6IGFib3V0IDE2NSBvYnNlcnZhdGlvbnMKMi00IHllYXJzOiBhYm91dCAxNzUgb2JzZXJ2YXRpb25zLCB0aGUgbW9zdCBjb21tb24gcmFuZ2UKNC02IHllYXJzOiBhYm91dCAxNTUgb2JzZXJ2YXRpb25zLCB0aGUgbGVhc3QgY29tbW9uIHJhbmdlClRoZXJlIGlzIG5vIHN0cm9uZyBza2V3IG9yIGRvbWluYW50IHBlYWsuIEhvd2V2ZXIsIHdpdGggb25seSB0aHJlZSB3aWRlIGJpbnMsIHRoZSBjaGFydCBoaWRlcyBmaW5lciBwYXR0ZXJucy4gVXNpbmcgbmFycm93ZXIgYmlucywgc3VjaCBhcyBvbmUteWVhciBpbnRlcnZhbHMsIHdvdWxkIHByb3ZpZGUgYSBtb3JlIGluZm9ybWF0aXZlIHZpZXcgb2YgdGhlIGRpc3RyaWJ1dGlvbi4KCgoKKipBbnN3ZXJzIHRvIHF1ZXN0aW9uIDMqKgoKCmBgYHtyfQpkb3VibGVzIDwtIHJlYWQudGFibGUoImRvdWJsZXNfaGl0LmNzdiIsIGhlYWRlciA9IFRSVUUsIHNlcCA9ICIsIikKZG91Ymxlc251bWJlciA8LSBkb3VibGVzJGRvdWJsZXNfaGl0CmBgYAoKCkltcG9ydHMgdGhlIGRhdGEgc2V0IGFuZCBleHRyYWN0cyB0aGUgZG91YmxlcyBudW1iZXIgY29sdW1uLgoKCgpgYGB7cn0KIyBNZWFuIApkb3VibGVzbnVtYmVyX21lYW4gIDwtIG1lYW4oZG91Ymxlc251bWJlcikKZG91Ymxlc251bWJlcl9tZWFuCmBgYAoKCkNhbGN1bGF0ZXMgdGhlIG1lYW4gKGF2ZXJhZ2UpIG51bWJlciBvZiBkb3VibGVzIGhpdC4KCgpgYGB7cn0KIyBNZWRpYW4KY29udHJhY3RzX21lZGlhbiA8LSBtZWRpYW4oZG91Ymxlc251bWJlcikKY29udHJhY3RzX21lZGlhbgpgYGAKCgpDYWxjdWxhdGVzIHRoZSBtZWRpYW4gKG1pZGRsZSB2YWx1ZSkgb2YgdGhlIGRvdWJsZXNudW1iZXIgZGF0YS4KCgpgYGB7cn0KIyBGaW5kIG51bWJlciBvZiBvYnNlcnZhdGlvbnMKZG91Ymxlc19uIDwtIGxlbmd0aChkb3VibGVzbnVtYmVyKQojIEZpbmQgc3RhbmRhcmQgZGV2aWF0aW9uCnBsYXllcnNfc2QgPC0gc2QoZG91Ymxlc251bWJlcikKYGBgCgoKRmluZHMgdGhlIG51bWJlciBvZiBvYnNlcnZhdGlvbnMgYW5kIHRoZSBzdGFuZGFyZCBkZXZpYXRpb24gZm9yIHRoZSBkb3VibGVzbnVtYmVyIGRhdGEuCgoKCmBgYHtyfQpkb3VibGVzbnVtYmVyX3cxc2QgPC0gc3VtKChkb3VibGVzbnVtYmVyIC0gZG91Ymxlc251bWJlcl9tZWFuKSAvIHBsYXllcnNfc2QgPCAxKSAvIGRvdWJsZXNfbgojIFBlcmNlbnRhZ2Ugb2Ygb2JzZXJ2YXRpb24gd2l0aGluIG9uZSBzdGFuZGFyZCBkZXZpYXRpb24gb2YgdGhlIG1lYW4KZG91Ymxlc251bWJlcl93MXNkCmBgYAoKCkNhbGN1bGF0ZXMgdGhlIHByb3BvcnRpb24gKG9yIHBlcmNlbnRhZ2UpIG9mIG9ic2VydmF0aW9ucyB3aG9zZSB6LXNjb3JlIGlzIGxlc3MgdGhhbiAxLgoKCmBgYHtyfQojIyBEaWZmZXJlbmNlIGZyb20gZW1waXJpY2FsIApkb3VibGVzbnVtYmVyX3cxc2QgLSAwLjY4CmBgYAoKCkNhbGN1bGF0ZXMgaG93IGZhciB5b3VyIGRhdGFzZXQgaXMgZnJvbSB0aGUgRW1waXJpY2FsIFJ1bGUgZm9yIDEgc3RhbmRhcmQgZGV2aWF0aW9uLgoKCmBgYHtyfQpkb3VibGVzbnVtYmVyX3cxc2QgPC0gc3VtKChkb3VibGVzbnVtYmVyIC0gZG91Ymxlc251bWJlcl9tZWFuKSAvIHBsYXllcnNfc2QgPCAyKSAvIGRvdWJsZXNfbgojIFBlcmNlbnRhZ2Ugb2Ygb2JzZXJ2YXRpb24gd2l0aGluIG9uZSBzdGFuZGFyZCBkZXZpYXRpb24gb2YgdGhlIG1lYW4KZG91Ymxlc251bWJlcl93MXNkCmBgYAoKCkNhbGN1bGF0ZXMgdGhlIHBlcmNlbnRhZ2UgKHByb3BvcnRpb24pIG9mIHBsYXllcnMgd2hvc2UgZG91YmxlcyBoaXQgdmFsdWVzIGFyZSBsZXNzIHRoYW4gMiBzdGFuZGFyZCBkZXZpYXRpb25zIGFib3ZlIHRoZSBtZWFuLgoKCgpgYGB7cn0KIyMgV2l0aGluIDIgc2QKZG91Ymxlc251bWJlcl93MnNkIDwtIHN1bSgoZG91Ymxlc251bWJlciAtIGRvdWJsZXNudW1iZXJfbWVhbikgLyBwbGF5ZXJzX3NkIDwgMikgLyBkb3VibGVzX24KIyBQZXJjZW50YWdlIG9mIG9ic2VydmF0aW9uIHdpdGhpbiBvbmUgc3RhbmRhcmQgZGV2aWF0aW9uIG9mIHRoZSBtZWEKZG91Ymxlc251bWJlcl93MnNkCmBgYAoKCkNhbGN1bGF0ZXMgdGhlIHByb3BvcnRpb24gKHBlcmNlbnRhZ2UpIG9mIHBsYXllcnMgd2hvc2UgZG91YmxlcyBoaXQgdmFsdWVzIGFyZSBsZXNzIHRoYW4gMiBzdGFuZGFyZCBkZXZpYXRpb25zIGFib3ZlIHRoZSBtZWFuLgoKCmBgYHtyfQojIyBEaWZmZXJlbmNlIGZyb20gZW1waXJpY2FsCmRvdWJsZXNudW1iZXJfdzJzZCAtIDAuOTUKYGBgCgoKCkNhbGN1bGF0ZXMgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB5b3VyIGFjdHVhbCBkYXRhIHJlc3VsdCBhbmQgdGhlIEVtcGlyaWNhbCBSdWxlIGV4cGVjdGF0aW9uIGZvciAyIHN0YW5kYXJkIGRldmlhdGlvbnMuCgpgYGB7cn0KZG91Ymxlc251bWJlcl93M3NkIDwtIHN1bSgoZG91Ymxlc251bWJlciAtIGRvdWJsZXNudW1iZXJfbWVhbikgLyBwbGF5ZXJzX3NkIDwgMykgLyBkb3VibGVzX24KIyBQZXJjZW50YWdlIG9mIG9ic2VydmF0aW9uIHdpdGhpbiBvbmUgc3RhbmRhcmQgZGV2aWF0aW9uIG9mIHRoZSBtZWFuCmRvdWJsZXNudW1iZXJfdzNzZApgYGAKCmAKQ2FsY3VsYXRlcyB0aGUgcHJvcG9ydGlvbiAocGVyY2VudGFnZSkgb2Ygb2JzZXJ2YXRpb25zIHRoYXQgYXJlIGxlc3MgdGhhbiAzIHN0YW5kYXJkIGRldmlhdGlvbnMgYWJvdmUgdGhlIG1lYW4uCgoKYGBge3J9CiMjIERpZmZlcmVuY2UgZnJvbSBlbXBpcmljYWwgCmNvbnRyYWN0c193M3NkIC0gMC45OTczCmBgYAoKCkNhbGN1bGF0ZXMgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB5b3VyIGFjdHVhbCBwZXJjZW50YWdlIHdpdGhpbiAzIHN0YW5kYXJkIGRldmlhdGlvbnMgYW5kIHRoZSBFbXBpcmljYWwgUnVsZSBleHBlY3RhdGlvbi4KRG91YmxlcyBkYXRhc2V0LCByZXZpc2UgdGhlIGNvZGUgYnkgcmVwbGFjaW5nIGNvbnRyYWN0c193M3NkIHdpdGggZG91Ymxlc251bWJlcl93M3NkLgoKYGBge3J9CiMgQ3JlYXRlIGhpc3RvZ3JhbQpoaXN0KGRvdWJsZXNudW1iZXIseGxhYiA9ICJOdW1iZXIgb2YgRG91YmxlcyIsY29sID0gImdyZWVuIixib3JkZXIgPSAicmVkIiwgeGxpbSA9IGMoMCw0KSwgeWxpbSA9IGMoMCwxMDApLAogICBicmVha3MgPSA1KQoKYGBgCgoKClRoZSBoaXN0b2dyYW0gc2hvd3MgdGhlIGRpc3RyaWJ1dGlvbiBvZiB0aGUgbnVtYmVyIG9mIGRvdWJsZXMgaGl0IGJ5IHBsYXllcnMuIFRoZSB2YWx1ZXMgcmFuZ2UgYXBwcm94aW1hdGVseSBmcm9tIDEgdG8gNCBkb3VibGVzLiBUaGUgaGlnaGVzdCBmcmVxdWVuY3kgb2NjdXJzIGJldHdlZW4gMSBhbmQgMiBkb3VibGVzLCBpbmRpY2F0aW5nIHRoYXQgdGhpcyByYW5nZSBjb250YWlucyB0aGUgbGFyZ2VzdCBudW1iZXIgb2Ygb2JzZXJ2YXRpb25zLiBUaGUgcmVtYWluaW5nIGdyb3VwcyAoMuKAkzMgYW5kIDPigJM0IGRvdWJsZXMpIGFsc28gaGF2ZSByZWxhdGl2ZWx5IGhpZ2ggZnJlcXVlbmNpZXMsIHNob3dpbmcgdGhhdCB0aGUgZGF0YSBpcyBmYWlybHkgZXZlbmx5IGRpc3RyaWJ1dGVkIGFjcm9zcyB0aGUgcmFuZ2UuIFRoZSBkaXN0cmlidXRpb24gYXBwZWFycyB0byBiZSBhcHByb3hpbWF0ZWx5IHN5bW1ldHJpYywgd2l0aCBubyBtYWpvciBvdXRsaWVycyB2aXNpYmxlLiBPdmVyYWxsLCB0aGUgaGlzdG9ncmFtIHN1Z2dlc3RzIHRoYXQgcGxheWVycycgZG91YmxlcyBoaXQgdmFsdWVzIGhhdmUgbW9kZXJhdGUgdmFyaWF0aW9uLCB3aXRoIG1vc3QgcGxheWVycyBmYWxsaW5nIGJldHdlZW4gMSBhbmQgNCBkb3VibGVzLgo=