Part 1: Data Wrangling

1 and 2. Read Data and Add Team_Your_First_Name column

  • Read the data from all 6 of the CSV files into an R data frame. Add 3 unique rows at the top of the R data frame. These rows must be different for each student. Use appropriate values to avoid outliers.

  • Add a “Team_Your_First_Name” column to the data frame and populate it with the correct team for each player.

Reading available files

We need to set first our directory and then read all of the files inside that directory that are csv.

setwd("C:/Users/edwin/OneDrive/Escritorio/Personal files/Courses/Semester 2/Analytics Programming/Assignment/Assignment 2")
files <- list.files(pattern = "\\.csv$")
print(files)
[1] "BostonBruinsScoring-1960.csv"      "ChicagoBlackHawksScoring-1960.csv" "DetroitRedWingsScoring-1960.csv"  
[4] "montrealCanadiensScoring-1960.csv" "NewYorkRangersScoring-1960.csv"    "TorontoMapleLeafsScoring-1960.csv"

Reading each file and appending to get a new df

Based on that, we can read each of our files and put them in one unique dataframe called “df”. Also we will add a column to identify the team that belongs to.

df<-data.frame()
for (file in files) {
  ##read
  df_each <- read.csv(file)
  
  ##file name read
  name_parts <- strsplit(file, "-")[[1]]
  
  #getting team name
  team_name<-name_parts[1]
  
  df_each$Team_Edwin=team_name
  
  #getting year
  name_year <- strsplit(file, "-")[[1]]
  
  year_split<-name_year[2]
  
  year_split2 <- strsplit(year_split, ".csv")
  
  year<-year_split2[[1]]
  
  df_each$Year<-year
  
  ##appending
  
  df<-bind_rows(df,df_each)
  
  
}
head(df)

Let’s observe the basic statistics from our created dataframe.

summary(df)
    Player               Age            Pos                  GP             G                A        
 Length:153         Min.   :18.00   Length:153         Min.   : 1.0   Min.   : 0.000   Min.   : 0.00  
 Class :character   1st Qu.:23.00   Class :character   1st Qu.:22.0   1st Qu.: 1.000   1st Qu.: 2.00  
 Mode  :character   Median :25.00   Mode  :character   Median :54.0   Median : 5.000   Median :10.00  
                    Mean   :25.84                      Mean   :44.5   Mean   : 8.351   Mean   :13.91  
                    3rd Qu.:28.00                      3rd Qu.:67.0   3rd Qu.:14.000   3rd Qu.:21.00  
                    Max.   :36.00                      Max.   :70.0   Max.   :50.000   Max.   :58.00  
                    NA's   :2                          NA's   :2      NA's   :2        NA's   :2      
      X...               PIM               EV               PP              SH              GW               S         
 Min.   :-31.0000   Min.   :  0.00   Min.   : 0.000   Min.   : 0.00   Min.   :0.000   Min.   : 0.000   Min.   :  0.00  
 1st Qu.: -7.0000   1st Qu.:  4.00   1st Qu.: 1.000   1st Qu.: 0.00   1st Qu.:0.000   1st Qu.: 0.000   1st Qu.: 23.50  
 Median : -1.0000   Median : 18.00   Median : 4.000   Median : 0.00   Median :0.000   Median : 0.000   Median : 74.00  
 Mean   : -0.3245   Mean   : 31.11   Mean   : 6.596   Mean   : 1.51   Mean   :0.245   Mean   : 1.132   Mean   : 90.13  
 3rd Qu.:  3.0000   3rd Qu.: 48.00   3rd Qu.:11.000   3rd Qu.: 2.00   3rd Qu.:0.000   3rd Qu.: 2.000   3rd Qu.:132.50  
 Max.   : 31.0000   Max.   :169.00   Max.   :41.000   Max.   :16.00   Max.   :4.000   Max.   :12.000   Max.   :357.00  
 NA's   :2          NA's   :2        NA's   :2        NA's   :2       NA's   :2       NA's   :2        NA's   :3       
  Team_Edwin            Year          
 Length:153         Length:153        
 Class :character   Class :character  
 Mode  :character   Mode  :character  
                                      
                                      
                                      
                                      

Now we are ready to create our 3 new players and add it too our dataframe.

Creating 3 new players

Based on the available data, I am going to be creating 3 new players, considering that are not outliers.

players_df <- data.frame(
  Player = c("Edwin Santos", "Javier Masias", "Lucia Rosas"),
  Age = c(25, 27, 26), # Within 23 to 28
  Pos = c("RW", "C", "LW"), 
  GP = c(30, 60, 50), # Between 22 and 67
  G = c(5, 10, 7), # Between 1 and 14
  A = c(5, 15, 10), # Between 2 and 21
  X... = c(-3 , 1 , -2),
  PIM = c(10, 40, 30), # Between 4 and 48
  EV = c(3, 9, 5), # Between 1 and 11
  PP = c(1, 1, 2), # Between 0 and 2
  SH = c(0, 0, 0), 
  GW = c(1, 2, 1), # Between 0 and 2
  S = c(50, 100, 75), # Between 23.5 and 132.5
  Team_Edwin = c("montrealCanadiensScoring","montrealCanadiensScoring","montrealCanadiensScoring"),
  Year = c("1960","1960","1960")
)
print(players_df)

Now I am going to be adding to our main dataframe.

df<-bind_rows(players_df,df)
head(df)

We are ready to continue with the next steps.

3. Add a Pts_Your_Last_Name column

Using R, add a “Pts_Your_Last_Name” (Points) column for each player by adding the G (Goals) and A (assists) columns for each player.

This is something very straightforward. Just adding both goals and assists give us the column required.

df$PTS_Santos=df$G+df$A
head(df)

4. Add a column for shooting percentage

Add a column for shooting percentage for each player and name the column “ShPerc_Your_First_Name”. Hint: do math involving shots and goals to get the shooting percentage.

The shooting percentage is the division between goals and shots, which can be calculated by following this equation

Equation of shooting percentage: \(ShPerc_{Santos} = G/S\)

df$ShPerc_Santos=df$G/df$S
head(df)

Part 2: Graphs

1. Total goals per year

Create a bar graph displaying the total goals by team that year.

df=na.omit(df)
sum_goals_per_team <- df %>%
  group_by(Team_Edwin) %>%
  summarise(sumgoals = sum(G))
sum_goals_per_team$Team_Edwin <- reorder(sum_goals_per_team$Team_Edwin, -sum_goals_per_team$sumgoals)
ggplot(sum_goals_per_team, aes(x = Team_Edwin, y = sumgoals)) +
  geom_col() +
  geom_text(aes(label = sumgoals), vjust = 1.5, angle = 0, position = position_dodge(width = 0.9),color = "white")+
  labs(
       x = "Team Edwin",
       y = "Goals",
       caption = "Source: Your Source Here") + # Add a caption if needed
  theme(axis.text.x = element_text(angle = 45, hjust = 1),
        panel.grid.major = element_blank(), # Removes major grid lines
        panel.grid.minor = element_blank(), # Removes minor grid lines
        panel.background = element_blank()) # Removes background color/panel

2. Average age per team

Create a bar graph displaying the average age of each team.

average_age_per_team <- df %>%
  group_by(Team_Edwin) %>%
  summarise(AverageAge = round( mean(Age, na.rm = TRUE),2))
average_age_per_team$Team_Edwin <- reorder(average_age_per_team$Team_Edwin, -average_age_per_team$AverageAge)
ggplot(average_age_per_team, aes(x = Team_Edwin, y = AverageAge)) +
  geom_col() +
  geom_text(aes(label = AverageAge), vjust = 1.5, angle = 0, position = position_dodge(width = 0.9),color = "white")+
  theme(axis.text.x = element_text(angle = 45, hjust = 1)) +
  labs(title = "Average Age per Team",
       x = "Team",
       y = "Average Age")

3. Bar graph of number of players at each position

Create a bar graph displaying the number of players at each position in the league

count_players_pos <- df %>%
  group_by(Pos) %>%
  summarise(Count_Players = n(), .groups = 'drop')
count_players_pos$Pos <- reorder(count_players_pos$Pos, -count_players_pos$Count_Players)
ggplot(count_players_pos, aes(x = Pos, y = Count_Players)) +
  geom_col() +
  geom_text(aes(label = Count_Players), vjust = 1.5, angle = 0, position = position_dodge(width = 0.9),color = "white")+
  theme(axis.text.x = element_text(angle = 45, hjust = 1)) +
  labs(title = "Count Players per Position",
       x = "Position",
       y = "Count of Players")

LS0tDQp0aXRsZTogIkFzc2lnbm1lbnQgIzIiDQpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sNCi0tLQ0KDQoNCmBgYHtyLGVjaG89RkFMU0V9DQpsaWJyYXJ5KGRwbHlyKQ0KbGlicmFyeShnZ3Bsb3QyKQ0KYGBgDQoNCiMgUGFydCAxOiBEYXRhIFdyYW5nbGluZw0KDQojIyAxIGFuZCAyLiBSZWFkIERhdGEgYW5kIEFkZCBUZWFtX1lvdXJfRmlyc3RfTmFtZSBjb2x1bW4NCi0gUmVhZCB0aGUgZGF0YSBmcm9tIGFsbCA2IG9mIHRoZSBDU1YgZmlsZXMgaW50byBhbiBSIGRhdGEgZnJhbWUuIEFkZCAzIHVuaXF1ZSByb3dzIGF0IHRoZSB0b3Agb2YgdGhlIFIgZGF0YSBmcmFtZS4gVGhlc2Ugcm93cyBtdXN0IGJlIGRpZmZlcmVudCBmb3IgZWFjaCBzdHVkZW50LiBVc2UgYXBwcm9wcmlhdGUgdmFsdWVzIHRvIGF2b2lkIG91dGxpZXJzLg0KDQotIEFkZCBhICJUZWFtX1lvdXJfRmlyc3RfTmFtZSIgY29sdW1uIHRvIHRoZSBkYXRhIGZyYW1lIGFuZCBwb3B1bGF0ZSBpdCB3aXRoIHRoZSBjb3JyZWN0IHRlYW0gZm9yDQplYWNoIHBsYXllci4NCg0KIyMjIFJlYWRpbmcgYXZhaWxhYmxlIGZpbGVzDQoNCldlIG5lZWQgdG8gc2V0IGZpcnN0IG91ciBkaXJlY3RvcnkgYW5kIHRoZW4gcmVhZCBhbGwgb2YgdGhlIGZpbGVzIGluc2lkZSB0aGF0IGRpcmVjdG9yeSB0aGF0IGFyZSBjc3YuDQoNCmBgYHtyLCBlY2hvPVRSVUV9DQpzZXR3ZCgiQzovVXNlcnMvZWR3aW4vT25lRHJpdmUvRXNjcml0b3Jpby9QZXJzb25hbCBmaWxlcy9Db3Vyc2VzL1NlbWVzdGVyIDIvQW5hbHl0aWNzIFByb2dyYW1taW5nL0Fzc2lnbm1lbnQvQXNzaWdubWVudCAyIikNCg0KZmlsZXMgPC0gbGlzdC5maWxlcyhwYXR0ZXJuID0gIlxcLmNzdiQiKQ0KDQpwcmludChmaWxlcykNCg0KYGBgDQoNCiMjIyBSZWFkaW5nIGVhY2ggZmlsZSBhbmQgYXBwZW5kaW5nIHRvIGdldCBhIG5ldyBkZg0KDQpCYXNlZCBvbiB0aGF0LCB3ZSBjYW4gcmVhZCBlYWNoIG9mIG91ciBmaWxlcyBhbmQgcHV0IHRoZW0gaW4gb25lIHVuaXF1ZSBkYXRhZnJhbWUgY2FsbGVkICJkZiIuIEFsc28gd2Ugd2lsbCBhZGQgYSBjb2x1bW4gdG8gaWRlbnRpZnkgdGhlIHRlYW0gdGhhdCBiZWxvbmdzIHRvLg0KDQpgYGB7ciwgZWNobz1UUlVFfQ0KDQpkZjwtZGF0YS5mcmFtZSgpDQoNCmZvciAoZmlsZSBpbiBmaWxlcykgew0KICAjI3JlYWQNCiAgZGZfZWFjaCA8LSByZWFkLmNzdihmaWxlKQ0KICANCiAgIyNmaWxlIG5hbWUgcmVhZA0KICBuYW1lX3BhcnRzIDwtIHN0cnNwbGl0KGZpbGUsICItIilbWzFdXQ0KICANCiAgI2dldHRpbmcgdGVhbSBuYW1lDQogIHRlYW1fbmFtZTwtbmFtZV9wYXJ0c1sxXQ0KICANCiAgZGZfZWFjaCRUZWFtX0Vkd2luPXRlYW1fbmFtZQ0KICANCiAgI2dldHRpbmcgeWVhcg0KICBuYW1lX3llYXIgPC0gc3Ryc3BsaXQoZmlsZSwgIi0iKVtbMV1dDQogIA0KICB5ZWFyX3NwbGl0PC1uYW1lX3llYXJbMl0NCiAgDQogIHllYXJfc3BsaXQyIDwtIHN0cnNwbGl0KHllYXJfc3BsaXQsICIuY3N2IikNCiAgDQogIHllYXI8LXllYXJfc3BsaXQyW1sxXV0NCiAgDQogIGRmX2VhY2gkWWVhcjwteWVhcg0KICANCiAgIyNhcHBlbmRpbmcNCiAgDQogIGRmPC1iaW5kX3Jvd3MoZGYsZGZfZWFjaCkNCiAgDQogIA0KfQ0KDQpoZWFkKGRmKQ0KDQpgYGANCg0KTGV0J3Mgb2JzZXJ2ZSB0aGUgYmFzaWMgc3RhdGlzdGljcyBmcm9tIG91ciBjcmVhdGVkIGRhdGFmcmFtZS4NCg0KYGBge3IsZWNobz1UUlVFfQ0Kc3VtbWFyeShkZikNCmBgYA0KDQoNCk5vdyB3ZSBhcmUgcmVhZHkgdG8gY3JlYXRlIG91ciAzIG5ldyBwbGF5ZXJzIGFuZCBhZGQgaXQgdG9vIG91ciBkYXRhZnJhbWUuDQoNCiMjIyBDcmVhdGluZyAzIG5ldyBwbGF5ZXJzDQoNCkJhc2VkIG9uIHRoZSBhdmFpbGFibGUgZGF0YSwgSSBhbSBnb2luZyB0byBiZSBjcmVhdGluZyAzIG5ldyBwbGF5ZXJzLCBjb25zaWRlcmluZyB0aGF0IGFyZSBub3Qgb3V0bGllcnMuDQoNCmBgYHtyLGVjaG89VFJVRX0NCnBsYXllcnNfZGYgPC0gZGF0YS5mcmFtZSgNCiAgUGxheWVyID0gYygiRWR3aW4gU2FudG9zIiwgIkphdmllciBNYXNpYXMiLCAiTHVjaWEgUm9zYXMiKSwNCiAgQWdlID0gYygyNSwgMjcsIDI2KSwgIyBXaXRoaW4gMjMgdG8gMjgNCiAgUG9zID0gYygiUlciLCAiQyIsICJMVyIpLCANCiAgR1AgPSBjKDMwLCA2MCwgNTApLCAjIEJldHdlZW4gMjIgYW5kIDY3DQogIEcgPSBjKDUsIDEwLCA3KSwgIyBCZXR3ZWVuIDEgYW5kIDE0DQogIEEgPSBjKDUsIDE1LCAxMCksICMgQmV0d2VlbiAyIGFuZCAyMQ0KICBYLi4uID0gYygtMyAsIDEgLCAtMiksDQogIFBJTSA9IGMoMTAsIDQwLCAzMCksICMgQmV0d2VlbiA0IGFuZCA0OA0KICBFViA9IGMoMywgOSwgNSksICMgQmV0d2VlbiAxIGFuZCAxMQ0KICBQUCA9IGMoMSwgMSwgMiksICMgQmV0d2VlbiAwIGFuZCAyDQogIFNIID0gYygwLCAwLCAwKSwgDQogIEdXID0gYygxLCAyLCAxKSwgIyBCZXR3ZWVuIDAgYW5kIDINCiAgUyA9IGMoNTAsIDEwMCwgNzUpLCAjIEJldHdlZW4gMjMuNSBhbmQgMTMyLjUNCiAgVGVhbV9FZHdpbiA9IGMoIm1vbnRyZWFsQ2FuYWRpZW5zU2NvcmluZyIsIm1vbnRyZWFsQ2FuYWRpZW5zU2NvcmluZyIsIm1vbnRyZWFsQ2FuYWRpZW5zU2NvcmluZyIpLA0KICBZZWFyID0gYygiMTk2MCIsIjE5NjAiLCIxOTYwIikNCikNCnByaW50KHBsYXllcnNfZGYpDQpgYGANCg0KTm93IEkgYW0gZ29pbmcgdG8gYmUgYWRkaW5nIHRvIG91ciBtYWluIGRhdGFmcmFtZS4NCg0KYGBge3IsZWNobz1UUlVFfQ0KZGY8LWJpbmRfcm93cyhwbGF5ZXJzX2RmLGRmKQ0KaGVhZChkZikNCmBgYA0KDQpXZSBhcmUgcmVhZHkgdG8gY29udGludWUgd2l0aCB0aGUgbmV4dCBzdGVwcy4NCg0KDQojIyAzLiBBZGQgYSBQdHNfWW91cl9MYXN0X05hbWUgY29sdW1uDQoNClVzaW5nIFIsIGFkZCBhICJQdHNfWW91cl9MYXN0X05hbWUiIChQb2ludHMpIGNvbHVtbiBmb3IgZWFjaCBwbGF5ZXIgYnkgYWRkaW5nIHRoZSBHIChHb2FscykgYW5kIEEgKGFzc2lzdHMpIGNvbHVtbnMgZm9yIGVhY2ggcGxheWVyLg0KDQpUaGlzIGlzIHNvbWV0aGluZyB2ZXJ5IHN0cmFpZ2h0Zm9yd2FyZC4gSnVzdCBhZGRpbmcgYm90aCBnb2FscyBhbmQgYXNzaXN0cyBnaXZlIHVzIHRoZSBjb2x1bW4gcmVxdWlyZWQuDQoNCmBgYHtyLGVjaG89VFJVRX0NCmRmJFBUU19TYW50b3M9ZGYkRytkZiRBDQpoZWFkKGRmKQ0KYGBgDQoNCg0KIyMgNC4gQWRkIGEgY29sdW1uIGZvciBzaG9vdGluZyBwZXJjZW50YWdlIA0KDQpBZGQgYSBjb2x1bW4gZm9yIHNob290aW5nIHBlcmNlbnRhZ2UgZm9yIGVhY2ggcGxheWVyIGFuZCBuYW1lIHRoZSBjb2x1bW4gIlNoUGVyY19Zb3VyX0ZpcnN0X05hbWUiLiBIaW50OiBkbyBtYXRoIGludm9sdmluZyBzaG90cyBhbmQgZ29hbHMgdG8gZ2V0IHRoZSBzaG9vdGluZyBwZXJjZW50YWdlLg0KDQpUaGUgc2hvb3RpbmcgcGVyY2VudGFnZSBpcyB0aGUgZGl2aXNpb24gYmV0d2VlbiBnb2FscyBhbmQgc2hvdHMsIHdoaWNoIGNhbiBiZSBjYWxjdWxhdGVkIGJ5IGZvbGxvd2luZyB0aGlzIGVxdWF0aW9uDQoNCioqRXF1YXRpb24gb2Ygc2hvb3RpbmcgcGVyY2VudGFnZSoqOiAkU2hQZXJjX3tTYW50b3N9ID0gRy9TJA0KDQpgYGB7cixlY2hvPVRSVUV9DQpkZiRTaFBlcmNfU2FudG9zPWRmJEcvZGYkUw0KaGVhZChkZikNCmBgYA0KDQoNCiMgUGFydCAyOiBHcmFwaHMNCg0KIyMgMS4gVG90YWwgZ29hbHMgcGVyIHllYXINCg0KQ3JlYXRlIGEgYmFyIGdyYXBoIGRpc3BsYXlpbmcgdGhlIHRvdGFsIGdvYWxzIGJ5IHRlYW0gdGhhdCB5ZWFyLg0KDQpgYGB7cixlY2hvPVRSVUV9DQpkZj1uYS5vbWl0KGRmKQ0KDQpzdW1fZ29hbHNfcGVyX3RlYW0gPC0gZGYgJT4lDQogIGdyb3VwX2J5KFRlYW1fRWR3aW4pICU+JQ0KICBzdW1tYXJpc2Uoc3VtZ29hbHMgPSBzdW0oRykpDQoNCnN1bV9nb2Fsc19wZXJfdGVhbSRUZWFtX0Vkd2luIDwtIHJlb3JkZXIoc3VtX2dvYWxzX3Blcl90ZWFtJFRlYW1fRWR3aW4sIC1zdW1fZ29hbHNfcGVyX3RlYW0kc3VtZ29hbHMpDQoNCmdncGxvdChzdW1fZ29hbHNfcGVyX3RlYW0sIGFlcyh4ID0gVGVhbV9FZHdpbiwgeSA9IHN1bWdvYWxzKSkgKw0KICBnZW9tX2NvbCgpICsNCiAgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IHN1bWdvYWxzKSwgdmp1c3QgPSAxLjUsIGFuZ2xlID0gMCwgcG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSh3aWR0aCA9IDAuOSksY29sb3IgPSAid2hpdGUiKSsNCiAgbGFicygNCiAgICAgICB4ID0gIlRlYW0gRWR3aW4iLA0KICAgICAgIHkgPSAiR29hbHMiLA0KICAgICAgIGNhcHRpb24gPSAiU291cmNlOiBZb3VyIFNvdXJjZSBIZXJlIikgKyAjIEFkZCBhIGNhcHRpb24gaWYgbmVlZGVkDQogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNDUsIGhqdXN0ID0gMSksDQogICAgICAgIHBhbmVsLmdyaWQubWFqb3IgPSBlbGVtZW50X2JsYW5rKCksICMgUmVtb3ZlcyBtYWpvciBncmlkIGxpbmVzDQogICAgICAgIHBhbmVsLmdyaWQubWlub3IgPSBlbGVtZW50X2JsYW5rKCksICMgUmVtb3ZlcyBtaW5vciBncmlkIGxpbmVzDQogICAgICAgIHBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X2JsYW5rKCkpICMgUmVtb3ZlcyBiYWNrZ3JvdW5kIGNvbG9yL3BhbmVsDQoNCmBgYA0KDQoNCiMjIDIuIEF2ZXJhZ2UgYWdlIHBlciB0ZWFtDQpDcmVhdGUgYSBiYXIgZ3JhcGggZGlzcGxheWluZyB0aGUgYXZlcmFnZSBhZ2Ugb2YgZWFjaCB0ZWFtLg0KDQpgYGB7cixlY2hvPVRSVUV9DQphdmVyYWdlX2FnZV9wZXJfdGVhbSA8LSBkZiAlPiUNCiAgZ3JvdXBfYnkoVGVhbV9FZHdpbikgJT4lDQogIHN1bW1hcmlzZShBdmVyYWdlQWdlID0gcm91bmQoIG1lYW4oQWdlLCBuYS5ybSA9IFRSVUUpLDIpKQ0KDQoNCmF2ZXJhZ2VfYWdlX3Blcl90ZWFtJFRlYW1fRWR3aW4gPC0gcmVvcmRlcihhdmVyYWdlX2FnZV9wZXJfdGVhbSRUZWFtX0Vkd2luLCAtYXZlcmFnZV9hZ2VfcGVyX3RlYW0kQXZlcmFnZUFnZSkNCg0KZ2dwbG90KGF2ZXJhZ2VfYWdlX3Blcl90ZWFtLCBhZXMoeCA9IFRlYW1fRWR3aW4sIHkgPSBBdmVyYWdlQWdlKSkgKw0KICBnZW9tX2NvbCgpICsNCiAgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IEF2ZXJhZ2VBZ2UpLCB2anVzdCA9IDEuNSwgYW5nbGUgPSAwLCBwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlKHdpZHRoID0gMC45KSxjb2xvciA9ICJ3aGl0ZSIpKw0KICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LCBoanVzdCA9IDEpKSArDQogIGxhYnModGl0bGUgPSAiQXZlcmFnZSBBZ2UgcGVyIFRlYW0iLA0KICAgICAgIHggPSAiVGVhbSIsDQogICAgICAgeSA9ICJBdmVyYWdlIEFnZSIpDQoNCmBgYA0KDQojIyAzLiBCYXIgZ3JhcGggb2YgbnVtYmVyIG9mIHBsYXllcnMgYXQgZWFjaCBwb3NpdGlvbiANCg0KQ3JlYXRlIGEgYmFyIGdyYXBoIGRpc3BsYXlpbmcgdGhlIG51bWJlciBvZiBwbGF5ZXJzIGF0IGVhY2ggcG9zaXRpb24gaW4gdGhlIGxlYWd1ZSANCg0KDQpgYGB7cixlY2hvPVRSVUV9DQpjb3VudF9wbGF5ZXJzX3BvcyA8LSBkZiAlPiUNCiAgZ3JvdXBfYnkoUG9zKSAlPiUNCiAgc3VtbWFyaXNlKENvdW50X1BsYXllcnMgPSBuKCksIC5ncm91cHMgPSAnZHJvcCcpDQoNCg0KY291bnRfcGxheWVyc19wb3MkUG9zIDwtIHJlb3JkZXIoY291bnRfcGxheWVyc19wb3MkUG9zLCAtY291bnRfcGxheWVyc19wb3MkQ291bnRfUGxheWVycykNCg0KZ2dwbG90KGNvdW50X3BsYXllcnNfcG9zLCBhZXMoeCA9IFBvcywgeSA9IENvdW50X1BsYXllcnMpKSArDQogIGdlb21fY29sKCkgKw0KICBnZW9tX3RleHQoYWVzKGxhYmVsID0gQ291bnRfUGxheWVycyksIHZqdXN0ID0gMS41LCBhbmdsZSA9IDAsIHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2Uod2lkdGggPSAwLjkpLGNvbG9yID0gIndoaXRlIikrDQogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNDUsIGhqdXN0ID0gMSkpICsNCiAgbGFicyh0aXRsZSA9ICJDb3VudCBQbGF5ZXJzIHBlciBQb3NpdGlvbiIsDQogICAgICAgeCA9ICJQb3NpdGlvbiIsDQogICAgICAgeSA9ICJDb3VudCBvZiBQbGF5ZXJzIikNCmBgYA0K