4/2
[1] 2
#let us complete some basic operations using R
1+2
[1] 3
1-4
[1] -3
2+5
[1] 7
sqrt(9)
[1] 3
log(10)
[1] 2.302585
log(2,72)#Natural Log (Ln)
[1] 0.1620765
#Question_1: Compute the log base 5 of 10 and the log of 10.
# Log base 5 of 10
log_base5 <- log(10, base = 5)
cat("Log base 5 of 10:", log_base5, "\n")
Log base 5 of 10: 1.430677 
# Natural log (log base e) of 10
log_e <- log(10)
cat("Natural log (log base e) of 10:", log_e, "\n")
Natural log (log base e) of 10: 2.302585 
#addition
2-3
[1] -1
#Batting Average=(No. of Hits)/(No. of At Bats)
#What is the batting average of a player that bats 29 hits in 112 at bats?
BA=(29)/(112)
BA
[1] 0.2589286
Batting_Average=round(BA,digits = 3)
Batting_Average
[1] 0.259
# Calculate the batting average for the first player (42 hits in 212 at bats)
BA1 <- 42 / 212
BA1
[1] 0.1981132
#On Base Percentage
#OBP=(H+BB+HBP)/(At Bats+H+BB+HBP+SF)
#Let us compute the OBP for a player with the following general stats
#AB=515,H=172,BB=84,HBP=5,SF=6
OBP=(172+84+5)/(515+172+84+5+6)
OBP
[1] 0.3337596
On_Base_Percentage=round(OBP,digits = 3)
On_Base_Percentage
[1] 0.334
#Question_3:Compute the OBP for a player with the following general stats:
#AB=565,H=156,BB=65,HBP=3,SF=7
# Given stats
AB <- 565  
H <- 156   
BB <- 65   
HBP <- 3   
SF <- 7    

# Calculate OBP using the formula
OBP <- (H + BB + HBP) / (AB + BB + HBP + SF)

# Round the result to 3 decimal places
OBP_rounded <- round(OBP, digits = 3)

# Print the result
cat("On-Base Percentage (OBP):", OBP_rounded, "\n")
On-Base Percentage (OBP): 0.35 
3 == 8# Does 3 equals 8?
[1] FALSE
3 != 8# Is 3 different from 8?
[1] TRUE
3 <= 8# Is 3 less than or equal to 8?
[1] TRUE
3>4
[1] FALSE
# Logical Disjunction (or)
FALSE | FALSE # False OR False
[1] FALSE
# Logical Conjunction (and)
TRUE & FALSE #True AND False
[1] FALSE
# Negation
! FALSE # Not False
[1] TRUE
# Combination of statements
2 < 3 | 1 == 5 # 2<3 is True, 1==5 is False, True OR False is True
[1] TRUE
Total_Bases <- 6 + 5
Total_Bases*3
[1] 33
ls()
 [1] "A_complement"            "A_intersection_B"       
 [3] "A_union_B"               "AB"                     
 [5] "BA"                      "BA1"                    
 [7] "bar"                     "barsample"              
 [9] "Batting_Average"         "BB"                     
[11] "event_5_or_6"            "event_A"                
[13] "event_at_least_one_head" "event_B"                
[15] "event_even"              "event_greater_than_4"   
[17] "event_less_than_4"       "event_odd"              
[19] "first_hit"               "five_num_disp"          
[21] "getMode"                 "H"                      
[23] "HBP"                     "hits_per_9innings"      
[25] "independence_check"      "iqr_wt"                 
[27] "last_hit"                "log_base5"              
[29] "log_e"                   "mad_mpg"                
[31] "mad_qsec"                "mean_hp"                
[33] "mean_mpg"                "median_hp"              
[35] "median_qsec"             "mode_gear"              
[37] "mode_gear_value"         "mtcars"                 
[39] "n"                       "OBP"                    
[41] "OBP_rounded"             "On_Base_Percentage"     
[43] "outliers"                "P_A"                    
[45] "P_A_and_B"               "P_B"                    
[47] "P_Heart"                 "P_Red_and_Heart"        
[49] "P_Red_given_Heart"       "percentile_10_hp"       
[51] "percentile_50_hp"        "percentile_90_hp"       
[53] "pitches_by_innings"      "player_positions"       
[55] "prob_5_or_6"             "prob_at_least_one_head" 
[57] "prob_heart"              "prob_heart_and_spade"   
[59] "prob_less_than_4"        "prob_odd"               
[61] "prob_spade"              "prob_union"             
[63] "range_wt"                "ranks"                  
[65] "runs_per_9innings"       "sals"                   
[67] "sample_space_cards"      "sample_space_coin"      
[69] "sample_space_die"        "samplerows"             
[71] "sd_qsec"                 "SF"                     
[73] "std_dev_disp"            "strikes_by_innings"     
[75] "suits"                   "Total_Bases"            
[77] "total_cards"             "variance_disp"          
[79] "venn.plot"               "weighted_mean_mpg"      
[81] "x"                      
rm(Batting_Average)
pitches_by_innings <- c(12, 15, 10, 20, 10) 
pitches_by_innings
[1] 12 15 10 20 10
strikes_by_innings <- c(9, 12, 6, 14, 9)
strikes_by_innings
[1]  9 12  6 14  9
#Question_4: Define two vectors,runs_per_9innings and hits_per_9innings, each with five elements.
# Define the vectors
runs_per_9innings <- c(3.2, 4.5, 2.8, 5.1, 3.9)
runs_per_9innings
[1] 3.2 4.5 2.8 5.1 3.9
hits_per_9innings <- c(7.3, 8.1, 6.5, 7.0, 7.8)
hits_per_9innings
[1] 7.3 8.1 6.5 7.0 7.8
# replicate function
rep(2, 5)
[1] 2 2 2 2 2
rep(1,4)
[1] 1 1 1 1
# consecutive numbers
1:5
[1] 1 2 3 4 5
2:10
[1]  2  3  4  5  6  7  8  9 10
# sequence from 1 to 10 with a step of 2
seq(1, 10, by=2)
[1] 1 3 5 7 9
seq(2,13,by=3)
[1]  2  5  8 11
# add vectors
pitches_by_innings+strikes_by_innings
[1] 21 27 16 34 19
# compare vectors
pitches_by_innings == strikes_by_innings
[1] FALSE FALSE FALSE FALSE FALSE
# find length of vector
length(pitches_by_innings)
[1] 5
# find minimum value in vector
min(pitches_by_innings)
[1] 10
# find average value in vector
mean(pitches_by_innings)
[1] 13.4
pitches_by_innings
[1] 12 15 10 20 10
# If you want to get the first element:
pitches_by_innings[1]
[1] 12
#Question_5: Get the first element of hits_per_9innings.
# Get the first element of the hits_per_9innings vector
first_hit <- hits_per_9innings[1]

# Print the first element
first_hit
[1] 7.3
pitches_by_innings[length(pitches_by_innings)]
[1] 10
#Question_6: Get the last element of hits_per_9innings.
# Get the last element of the hits_per_9innings vector
last_hit <- hits_per_9innings[length(hits_per_9innings)]

# Print the last element
last_hit
[1] 7.8
pitches_by_innings[c(2, 3, 4)]
[1] 15 10 20
player_positions <- c("catcher", "pitcher", "infielders", "outfielders")
data.frame(bonus = c(2, 3, 1),#in millions 
           active_roster = c("yes", "no", "yes"), 
           salary = c(1.5, 2.5, 1))#in millions 
sample(1:10, size=5)
[1] 3 8 6 7 4
bar <- data.frame(var1 = LETTERS[1:10], var2 = 1:10)
# Check data frame
bar
n <- 5
samplerows <- sample(1:nrow(bar), size=n) 
# print sample rows
samplerows
[1] 2 8 7 1 3
# extract rows
barsample <- bar[samplerows, ]
# print sample
print(barsample)
bar[sample(1:nrow(bar), n), ]
x <- c("Yes","No","No","Yes","Yes") 
table(x)
x
 No Yes 
  2   3 
sals <- c(12, .4, 5, 2, 50, 8, 3, 1, 4, 0.25)
# the average
mean(sals) 
[1] 8.565
# the variance
var(sals)
[1] 225.5145
# the standard deviation
sd(sals)
[1] 15.01714
# the median
median(sals)
[1] 3.5
# Tukey's five number summary, usefull for boxplots
# five numbers: min, lower hinge, median, upper hinge, max
fivenum(sals)
[1]  0.25  1.00  3.50  8.00 50.00
# summary statistics
summary(sals)
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
  0.250   1.250   3.500   8.565   7.250  50.000 
# Function to find the mode, i.e. most frequent value
getMode <- function(x) {
     ux <- unique(x)
     ux[which.max(tabulate(match(x, ux)))]
 }
# Most frequent value in pitches_by_innings
getMode(pitches_by_innings)
[1] 10
#Question_7: Find the most frequent value of hits_per_9innings.
# Find the most frequent value (mode) of hits_per_9innings
hits_table <- table(hits_per_9innings)  # Create a frequency table

# Check if there's more than one occurrence of any value
if (any(hits_table > 1)) {
  most_frequent <- as.numeric(names(hits_table)[which.max(hits_table)])  # Get the value with the highest frequency
} else {
  most_frequent <- "No mode (all values are unique)"
}

# Print the most frequent value
most_frequent
[1] "No mode (all values are unique)"
#Question_8: Summarize the following survey with the `table()` command:
#What is your favorite day of the week to watch baseball? A total of 10 fans submitted this survey.
#Saturday, Saturday, Sunday, Monday, Saturday,Tuesday, Sunday, Friday, Friday, Monday
game_day<-c("Saturday", "Saturday", "Sunday", "Monday", "Saturday","Tuesday", "Sunday", "Friday", "Friday", "Monday")

# Survey data
game_day <- c("Saturday", "Saturday", "Sunday", "Monday", "Saturday", 
              "Tuesday", "Sunday", "Friday", "Friday", "Monday")

# Create a frequency table using table()
table(game_day)
game_day
  Friday   Monday Saturday   Sunday  Tuesday 
       2        2        3        2        1 
#Question_9: What is the most frequent answer recorded in the survey? Use the getMode function to compute results. 
# Define the getMode function
getMode <- function(v) {
  return(names(sort(table(v), decreasing = TRUE))[1])
}

# Find the most frequent day
getMode(game_day)
[1] "Saturday"
getMode(game_day)
[1] "Saturday"
LS0tCnRpdGxlOiAiSW4tY2xhc3MgYWN0aXZpdHkgIzEiCm91dHB1dDogaHRtbF9ub3RlYm9vawotLS0KCmBgYHtyfQo0LzIKYGBgCgoKYGBge3J9CiNsZXQgdXMgY29tcGxldGUgc29tZSBiYXNpYyBvcGVyYXRpb25zIHVzaW5nIFIKMSsyCjEtNAoyKzUKc3FydCg5KQpsb2coMTApCmxvZygyLDcyKSNOYXR1cmFsIExvZyAoTG4pCmBgYApgYGB7cn0KI1F1ZXN0aW9uXzE6IENvbXB1dGUgdGhlIGxvZyBiYXNlIDUgb2YgMTAgYW5kIHRoZSBsb2cgb2YgMTAuCiMgTG9nIGJhc2UgNSBvZiAxMApsb2dfYmFzZTUgPC0gbG9nKDEwLCBiYXNlID0gNSkKY2F0KCJMb2cgYmFzZSA1IG9mIDEwOiIsIGxvZ19iYXNlNSwgIlxuIikKCiMgTmF0dXJhbCBsb2cgKGxvZyBiYXNlIGUpIG9mIDEwCmxvZ19lIDwtIGxvZygxMCkKY2F0KCJOYXR1cmFsIGxvZyAobG9nIGJhc2UgZSkgb2YgMTA6IiwgbG9nX2UsICJcbiIpCgpgYGAKCmBgYHtyfQojYWRkaXRpb24KMi0zCmBgYApgYGB7cn0KI0JhdHRpbmcgQXZlcmFnZT0oTm8uIG9mIEhpdHMpLyhOby4gb2YgQXQgQmF0cykKI1doYXQgaXMgdGhlIGJhdHRpbmcgYXZlcmFnZSBvZiBhIHBsYXllciB0aGF0IGJhdHMgMjkgaGl0cyBpbiAxMTIgYXQgYmF0cz8KQkE9KDI5KS8oMTEyKQpCQQpgYGAKCmBgYHtyfQpCYXR0aW5nX0F2ZXJhZ2U9cm91bmQoQkEsZGlnaXRzID0gMykKQmF0dGluZ19BdmVyYWdlCmBgYApgYGB7cn0KIyBDYWxjdWxhdGUgdGhlIGJhdHRpbmcgYXZlcmFnZSBmb3IgdGhlIGZpcnN0IHBsYXllciAoNDIgaGl0cyBpbiAyMTIgYXQgYmF0cykKQkExIDwtIDQyIC8gMjEyCkJBMQpgYGAKYGBge3J9CiNPbiBCYXNlIFBlcmNlbnRhZ2UKI09CUD0oSCtCQitIQlApLyhBdCBCYXRzK0grQkIrSEJQK1NGKQojTGV0IHVzIGNvbXB1dGUgdGhlIE9CUCBmb3IgYSBwbGF5ZXIgd2l0aCB0aGUgZm9sbG93aW5nIGdlbmVyYWwgc3RhdHMKI0FCPTUxNSxIPTE3MixCQj04NCxIQlA9NSxTRj02Ck9CUD0oMTcyKzg0KzUpLyg1MTUrMTcyKzg0KzUrNikKT0JQCmBgYAoKYGBge3J9Ck9uX0Jhc2VfUGVyY2VudGFnZT1yb3VuZChPQlAsZGlnaXRzID0gMykKT25fQmFzZV9QZXJjZW50YWdlCmBgYAoKYGBge3J9CiNRdWVzdGlvbl8zOkNvbXB1dGUgdGhlIE9CUCBmb3IgYSBwbGF5ZXIgd2l0aCB0aGUgZm9sbG93aW5nIGdlbmVyYWwgc3RhdHM6CiNBQj01NjUsSD0xNTYsQkI9NjUsSEJQPTMsU0Y9NwojIEdpdmVuIHN0YXRzCkFCIDwtIDU2NSAgCkggPC0gMTU2ICAgCkJCIDwtIDY1ICAgCkhCUCA8LSAzICAgClNGIDwtIDcgICAgCgojIENhbGN1bGF0ZSBPQlAgdXNpbmcgdGhlIGZvcm11bGEKT0JQIDwtIChIICsgQkIgKyBIQlApIC8gKEFCICsgQkIgKyBIQlAgKyBTRikKCiMgUm91bmQgdGhlIHJlc3VsdCB0byAzIGRlY2ltYWwgcGxhY2VzCk9CUF9yb3VuZGVkIDwtIHJvdW5kKE9CUCwgZGlnaXRzID0gMykKCiMgUHJpbnQgdGhlIHJlc3VsdApjYXQoIk9uLUJhc2UgUGVyY2VudGFnZSAoT0JQKToiLCBPQlBfcm91bmRlZCwgIlxuIikKCmBgYApgYGB7cn0KMyA9PSA4IyBEb2VzIDMgZXF1YWxzIDg/CmBgYApgYGB7cn0KMyAhPSA4IyBJcyAzIGRpZmZlcmVudCBmcm9tIDg/CmBgYApgYGB7cn0KMyA8PSA4IyBJcyAzIGxlc3MgdGhhbiBvciBlcXVhbCB0byA4PwpgYGAKYGBge3J9CjM+NApgYGAKYGBge3J9CiMgTG9naWNhbCBEaXNqdW5jdGlvbiAob3IpCkZBTFNFIHwgRkFMU0UgIyBGYWxzZSBPUiBGYWxzZQpgYGAKYGBge3J9CiMgTG9naWNhbCBDb25qdW5jdGlvbiAoYW5kKQpUUlVFICYgRkFMU0UgI1RydWUgQU5EIEZhbHNlCmBgYApgYGB7cn0KIyBOZWdhdGlvbgpgYGAKCgpgYGB7cn0KISBGQUxTRSAjIE5vdCBGYWxzZQpgYGAKCmBgYHtyfQojIENvbWJpbmF0aW9uIG9mIHN0YXRlbWVudHMKMiA8IDMgfCAxID09IDUgIyAyPDMgaXMgVHJ1ZSwgMT09NSBpcyBGYWxzZSwgVHJ1ZSBPUiBGYWxzZSBpcyBUcnVlCmBgYApgYGB7cn0KVG90YWxfQmFzZXMgPC0gNiArIDUKVG90YWxfQmFzZXMqMwpgYGAKYGBge3J9CmxzKCkKYGBgCmBgYHtyfQpybShCYXR0aW5nX0F2ZXJhZ2UpCmBgYApgYGB7cn0KcGl0Y2hlc19ieV9pbm5pbmdzIDwtIGMoMTIsIDE1LCAxMCwgMjAsIDEwKSAKcGl0Y2hlc19ieV9pbm5pbmdzCmBgYApgYGB7cn0Kc3RyaWtlc19ieV9pbm5pbmdzIDwtIGMoOSwgMTIsIDYsIDE0LCA5KQpzdHJpa2VzX2J5X2lubmluZ3MKYGBgCmBgYHtyfQojUXVlc3Rpb25fNDogRGVmaW5lIHR3byB2ZWN0b3JzLHJ1bnNfcGVyXzlpbm5pbmdzIGFuZCBoaXRzX3Blcl85aW5uaW5ncywgZWFjaCB3aXRoIGZpdmUgZWxlbWVudHMuCiMgRGVmaW5lIHRoZSB2ZWN0b3JzCnJ1bnNfcGVyXzlpbm5pbmdzIDwtIGMoMy4yLCA0LjUsIDIuOCwgNS4xLCAzLjkpCnJ1bnNfcGVyXzlpbm5pbmdzCmhpdHNfcGVyXzlpbm5pbmdzIDwtIGMoNy4zLCA4LjEsIDYuNSwgNy4wLCA3LjgpCmhpdHNfcGVyXzlpbm5pbmdzCmBgYAoKYGBge3J9CiMgcmVwbGljYXRlIGZ1bmN0aW9uCnJlcCgyLCA1KQpgYGAKYGBge3J9CnJlcCgxLDQpCmBgYApgYGB7cn0KIyBjb25zZWN1dGl2ZSBudW1iZXJzCjE6NQpgYGAKYGBge3J9CjI6MTAKYGBgCmBgYHtyfQojIHNlcXVlbmNlIGZyb20gMSB0byAxMCB3aXRoIGEgc3RlcCBvZiAyCnNlcSgxLCAxMCwgYnk9MikKYGBgCmBgYHtyfQpzZXEoMiwxMyxieT0zKQpgYGAKYGBge3J9CiMgYWRkIHZlY3RvcnMKcGl0Y2hlc19ieV9pbm5pbmdzK3N0cmlrZXNfYnlfaW5uaW5ncwpgYGAKYGBge3J9CiMgY29tcGFyZSB2ZWN0b3JzCnBpdGNoZXNfYnlfaW5uaW5ncyA9PSBzdHJpa2VzX2J5X2lubmluZ3MKYGBgCgpgYGB7cn0KIyBmaW5kIGxlbmd0aCBvZiB2ZWN0b3IKbGVuZ3RoKHBpdGNoZXNfYnlfaW5uaW5ncykKYGBgCmBgYHtyfQojIGZpbmQgbWluaW11bSB2YWx1ZSBpbiB2ZWN0b3IKbWluKHBpdGNoZXNfYnlfaW5uaW5ncykKYGBgCmBgYHtyfQojIGZpbmQgYXZlcmFnZSB2YWx1ZSBpbiB2ZWN0b3IKbWVhbihwaXRjaGVzX2J5X2lubmluZ3MpCmBgYAoKYGBge3J9CnBpdGNoZXNfYnlfaW5uaW5ncwpgYGAKCmBgYHtyfQojIElmIHlvdSB3YW50IHRvIGdldCB0aGUgZmlyc3QgZWxlbWVudDoKcGl0Y2hlc19ieV9pbm5pbmdzWzFdCmBgYAoKYGBge3J9CiNRdWVzdGlvbl81OiBHZXQgdGhlIGZpcnN0IGVsZW1lbnQgb2YgaGl0c19wZXJfOWlubmluZ3MuCiMgR2V0IHRoZSBmaXJzdCBlbGVtZW50IG9mIHRoZSBoaXRzX3Blcl85aW5uaW5ncyB2ZWN0b3IKZmlyc3RfaGl0IDwtIGhpdHNfcGVyXzlpbm5pbmdzWzFdCgojIFByaW50IHRoZSBmaXJzdCBlbGVtZW50CmZpcnN0X2hpdApgYGAKYGBge3J9CnBpdGNoZXNfYnlfaW5uaW5nc1tsZW5ndGgocGl0Y2hlc19ieV9pbm5pbmdzKV0KYGBgCmBgYHtyfQojUXVlc3Rpb25fNjogR2V0IHRoZSBsYXN0IGVsZW1lbnQgb2YgaGl0c19wZXJfOWlubmluZ3MuCiMgR2V0IHRoZSBsYXN0IGVsZW1lbnQgb2YgdGhlIGhpdHNfcGVyXzlpbm5pbmdzIHZlY3RvcgpsYXN0X2hpdCA8LSBoaXRzX3Blcl85aW5uaW5nc1tsZW5ndGgoaGl0c19wZXJfOWlubmluZ3MpXQoKIyBQcmludCB0aGUgbGFzdCBlbGVtZW50Cmxhc3RfaGl0CgpgYGAKYGBge3J9CnBpdGNoZXNfYnlfaW5uaW5nc1tjKDIsIDMsIDQpXQpgYGAKYGBge3J9CnBsYXllcl9wb3NpdGlvbnMgPC0gYygiY2F0Y2hlciIsICJwaXRjaGVyIiwgImluZmllbGRlcnMiLCAib3V0ZmllbGRlcnMiKQpgYGAKCmBgYHtyfQpkYXRhLmZyYW1lKGJvbnVzID0gYygyLCAzLCAxKSwjaW4gbWlsbGlvbnMgCiAgICAgICAgICAgYWN0aXZlX3Jvc3RlciA9IGMoInllcyIsICJubyIsICJ5ZXMiKSwgCiAgICAgICAgICAgc2FsYXJ5ID0gYygxLjUsIDIuNSwgMSkpI2luIG1pbGxpb25zIApgYGAKYGBge3J9CnNhbXBsZSgxOjEwLCBzaXplPTUpCmBgYApgYGB7cn0KYmFyIDwtIGRhdGEuZnJhbWUodmFyMSA9IExFVFRFUlNbMToxMF0sIHZhcjIgPSAxOjEwKQojIENoZWNrIGRhdGEgZnJhbWUKYmFyCmBgYApgYGB7cn0KbiA8LSA1CmBgYAoKYGBge3J9CnNhbXBsZXJvd3MgPC0gc2FtcGxlKDE6bnJvdyhiYXIpLCBzaXplPW4pIAojIHByaW50IHNhbXBsZSByb3dzCnNhbXBsZXJvd3MKYGBgCmBgYHtyfQojIGV4dHJhY3Qgcm93cwpiYXJzYW1wbGUgPC0gYmFyW3NhbXBsZXJvd3MsIF0KIyBwcmludCBzYW1wbGUKcHJpbnQoYmFyc2FtcGxlKQpgYGAKYGBge3J9CmJhcltzYW1wbGUoMTpucm93KGJhciksIG4pLCBdCmBgYApgYGB7cn0KeCA8LSBjKCJZZXMiLCJObyIsIk5vIiwiWWVzIiwiWWVzIikgCnRhYmxlKHgpCmBgYAoKYGBge3J9CnNhbHMgPC0gYygxMiwgLjQsIDUsIDIsIDUwLCA4LCAzLCAxLCA0LCAwLjI1KQojIHRoZSBhdmVyYWdlCm1lYW4oc2FscykgCmBgYApgYGB7cn0KIyB0aGUgdmFyaWFuY2UKdmFyKHNhbHMpCmBgYApgYGB7cn0KIyB0aGUgc3RhbmRhcmQgZGV2aWF0aW9uCnNkKHNhbHMpCmBgYApgYGB7cn0KIyB0aGUgbWVkaWFuCm1lZGlhbihzYWxzKQpgYGAKYGBge3J9CiMgVHVrZXkncyBmaXZlIG51bWJlciBzdW1tYXJ5LCB1c2VmdWxsIGZvciBib3hwbG90cwojIGZpdmUgbnVtYmVyczogbWluLCBsb3dlciBoaW5nZSwgbWVkaWFuLCB1cHBlciBoaW5nZSwgbWF4CmZpdmVudW0oc2FscykKYGBgCmBgYHtyfQojIHN1bW1hcnkgc3RhdGlzdGljcwpzdW1tYXJ5KHNhbHMpCmBgYApgYGB7cn0KIyBGdW5jdGlvbiB0byBmaW5kIHRoZSBtb2RlLCBpLmUuIG1vc3QgZnJlcXVlbnQgdmFsdWUKZ2V0TW9kZSA8LSBmdW5jdGlvbih4KSB7CiAgICAgdXggPC0gdW5pcXVlKHgpCiAgICAgdXhbd2hpY2gubWF4KHRhYnVsYXRlKG1hdGNoKHgsIHV4KSkpXQogfQpgYGAKYGBge3J9CiMgTW9zdCBmcmVxdWVudCB2YWx1ZSBpbiBwaXRjaGVzX2J5X2lubmluZ3MKZ2V0TW9kZShwaXRjaGVzX2J5X2lubmluZ3MpCmBgYApgYGB7cn0KI1F1ZXN0aW9uXzc6IEZpbmQgdGhlIG1vc3QgZnJlcXVlbnQgdmFsdWUgb2YgaGl0c19wZXJfOWlubmluZ3MuCiMgRmluZCB0aGUgbW9zdCBmcmVxdWVudCB2YWx1ZSAobW9kZSkgb2YgaGl0c19wZXJfOWlubmluZ3MKaGl0c190YWJsZSA8LSB0YWJsZShoaXRzX3Blcl85aW5uaW5ncykgICMgQ3JlYXRlIGEgZnJlcXVlbmN5IHRhYmxlCgojIENoZWNrIGlmIHRoZXJlJ3MgbW9yZSB0aGFuIG9uZSBvY2N1cnJlbmNlIG9mIGFueSB2YWx1ZQppZiAoYW55KGhpdHNfdGFibGUgPiAxKSkgewogIG1vc3RfZnJlcXVlbnQgPC0gYXMubnVtZXJpYyhuYW1lcyhoaXRzX3RhYmxlKVt3aGljaC5tYXgoaGl0c190YWJsZSldKSAgIyBHZXQgdGhlIHZhbHVlIHdpdGggdGhlIGhpZ2hlc3QgZnJlcXVlbmN5Cn0gZWxzZSB7CiAgbW9zdF9mcmVxdWVudCA8LSAiTm8gbW9kZSAoYWxsIHZhbHVlcyBhcmUgdW5pcXVlKSIKfQoKIyBQcmludCB0aGUgbW9zdCBmcmVxdWVudCB2YWx1ZQptb3N0X2ZyZXF1ZW50CgpgYGAKYGBge3J9CiNRdWVzdGlvbl84OiBTdW1tYXJpemUgdGhlIGZvbGxvd2luZyBzdXJ2ZXkgd2l0aCB0aGUgYHRhYmxlKClgIGNvbW1hbmQ6CiNXaGF0IGlzIHlvdXIgZmF2b3JpdGUgZGF5IG9mIHRoZSB3ZWVrIHRvIHdhdGNoIGJhc2ViYWxsPyBBIHRvdGFsIG9mIDEwIGZhbnMgc3VibWl0dGVkIHRoaXMgc3VydmV5LgojU2F0dXJkYXksIFNhdHVyZGF5LCBTdW5kYXksIE1vbmRheSwgU2F0dXJkYXksVHVlc2RheSwgU3VuZGF5LCBGcmlkYXksIEZyaWRheSwgTW9uZGF5CmdhbWVfZGF5PC1jKCJTYXR1cmRheSIsICJTYXR1cmRheSIsICJTdW5kYXkiLCAiTW9uZGF5IiwgIlNhdHVyZGF5IiwiVHVlc2RheSIsICJTdW5kYXkiLCAiRnJpZGF5IiwgIkZyaWRheSIsICJNb25kYXkiKQoKIyBTdXJ2ZXkgZGF0YQpnYW1lX2RheSA8LSBjKCJTYXR1cmRheSIsICJTYXR1cmRheSIsICJTdW5kYXkiLCAiTW9uZGF5IiwgIlNhdHVyZGF5IiwgCiAgICAgICAgICAgICAgIlR1ZXNkYXkiLCAiU3VuZGF5IiwgIkZyaWRheSIsICJGcmlkYXkiLCAiTW9uZGF5IikKCiMgQ3JlYXRlIGEgZnJlcXVlbmN5IHRhYmxlIHVzaW5nIHRhYmxlKCkKdGFibGUoZ2FtZV9kYXkpCiNUaGUgYW5zd2VyIGlzIFNhdHVyZGF5CmBgYApgYGB7cn0KI1F1ZXN0aW9uXzk6IFdoYXQgaXMgdGhlIG1vc3QgZnJlcXVlbnQgYW5zd2VyIHJlY29yZGVkIGluIHRoZSBzdXJ2ZXk/IFVzZSB0aGUgZ2V0TW9kZSBmdW5jdGlvbiB0byBjb21wdXRlIHJlc3VsdHMuIAojIERlZmluZSB0aGUgZ2V0TW9kZSBmdW5jdGlvbgpnZXRNb2RlIDwtIGZ1bmN0aW9uKHYpIHsKICByZXR1cm4obmFtZXMoc29ydCh0YWJsZSh2KSwgZGVjcmVhc2luZyA9IFRSVUUpKVsxXSkKfQoKIyBGaW5kIHRoZSBtb3N0IGZyZXF1ZW50IGRheQpnZXRNb2RlKGdhbWVfZGF5KQoKYGBgCmBgYHtyfQpnZXRNb2RlKGdhbWVfZGF5KQpgYGAKCg==