Introduction

For this assignment, I had to create a CSV file that describes arrival delays for two airlines: ALASKA & AM WEST across five destination: Los Angeles, Phoenix, San Diego, San Francisco and Seattle. The main objective is to perform analysis to compare the arrival delays for the two airlines.

Load R Library packages

library(tidyverse)
library(openintro)

library(readr)
library(tidyr)
library(dplyr)
library(ggplot2)

Retrieve the untidy data from GitHub

Once I imported the libraries required, I retrieved the raw dataset from the URL of my GitHub profile in which I stored the dataset.

flights_data <- read.csv("https://raw.githubusercontent.com/pujaroy280/DATA607Week5/main/Flight_data.txt")
View(flights_data)
print(flights_data)
##         x       y Los.Angeles Phoenix San.Diego San.Francisco Seattle
## 1  ALASKA on time         497     221       212           503    1841
## 2         delayed          62      12        20           102     305
## 3                          NA      NA        NA            NA      NA
## 4 AM WEST on time         694    4840       383           320     201
## 5         delayed         117     415        65           129      61

Clean, Transform and Tidy the Data

Initially, the data was messy and difficult to interpret which is why I removed the NA values. I noticed that the Airline Names for the delayed portion of the data were missing which is why I filled in the missing values for row 2 and 4 of the first column in Air_Service. I also renamed the destination names to be more consistent.

# Remove rows with NA values
flights_data <- flights_data[complete.cases(flights_data), ]
# Fill in missing values in the first column
flights_data[2, "x"] <- "ALASKA"
flights_data[4, "x"] <- "AM WEST"
flights_data <- flights_data %>%
  rename(
    Air_Service="x",
    Travel_Status="y",
    Los_Angeles = "Los.Angeles",
    Phoenix = "Phoenix",
    San_Diego = "San.Diego",
    San_Francisco = "San.Francisco",
    Seattle = "Seattle"
  )
view(flights_data)
print(flights_data)
##   Air_Service Travel_Status Los_Angeles Phoenix San_Diego San_Francisco Seattle
## 1      ALASKA       on time         497     221       212           503    1841
## 2      ALASKA       delayed          62      12        20           102     305
## 4     AM WEST       on time         694    4840       383           320     201
## 5     AM WEST       delayed         117     415        65           129      61

After that, I reshaped the data to store the destination names into a column named City.

# Reshape data to long format
flights_data_long <- flights_data %>%
  pivot_longer(cols = -c(Air_Service, Travel_Status), names_to = "City", values_to = "Count")
print(flights_data_long)
## # A tibble: 20 × 4
##    Air_Service Travel_Status City          Count
##    <chr>       <chr>         <chr>         <int>
##  1 ALASKA      on time       Los_Angeles     497
##  2 ALASKA      on time       Phoenix         221
##  3 ALASKA      on time       San_Diego       212
##  4 ALASKA      on time       San_Francisco   503
##  5 ALASKA      on time       Seattle        1841
##  6 ALASKA      delayed       Los_Angeles      62
##  7 ALASKA      delayed       Phoenix          12
##  8 ALASKA      delayed       San_Diego        20
##  9 ALASKA      delayed       San_Francisco   102
## 10 ALASKA      delayed       Seattle         305
## 11 AM WEST     on time       Los_Angeles     694
## 12 AM WEST     on time       Phoenix        4840
## 13 AM WEST     on time       San_Diego       383
## 14 AM WEST     on time       San_Francisco   320
## 15 AM WEST     on time       Seattle         201
## 16 AM WEST     delayed       Los_Angeles     117
## 17 AM WEST     delayed       Phoenix         415
## 18 AM WEST     delayed       San_Diego        65
## 19 AM WEST     delayed       San_Francisco   129
## 20 AM WEST     delayed       Seattle          61

Since the data still looked messy, I decided to split the Travel_Status column into 2 columns that consisted of count values for the On_time and Delayed flights. This condensed the dataset from 20 observations to 10 observations of 4 variables.

# Reshape data to long format
New_flights_data_long <- flights_data %>%
  pivot_longer(cols = -c(Air_Service, Travel_Status), names_to = "City", values_to = "Count") %>%
  separate(Travel_Status, into = c("Status", "Delay_Status"), sep = " ") %>%
  mutate(Status = if_else(Status == "on", "On_time", "Delayed")) %>%
  select(-Delay_Status) %>%
  pivot_wider(names_from = Status, values_from = Count)
## Warning: Expected 2 pieces. Missing pieces filled with `NA` in 10 rows [6, 7, 8, 9, 10,
## 16, 17, 18, 19, 20].
# Print the first few rows of the resulting dataframe
print(New_flights_data_long)
## # A tibble: 10 × 4
##    Air_Service City          On_time Delayed
##    <chr>       <chr>           <int>   <int>
##  1 ALASKA      Los_Angeles       497      62
##  2 ALASKA      Phoenix           221      12
##  3 ALASKA      San_Diego         212      20
##  4 ALASKA      San_Francisco     503     102
##  5 ALASKA      Seattle          1841     305
##  6 AM WEST     Los_Angeles       694     117
##  7 AM WEST     Phoenix          4840     415
##  8 AM WEST     San_Diego         383      65
##  9 AM WEST     San_Francisco     320     129
## 10 AM WEST     Seattle           201      61

Visualize Delayed Flights

Since the data is now clean and easier to analyze, it’s time to visualize the number of delayed flights for each Airline. I utilized the RColorBrewer library to identify the type of color palette that I wanted to apply.

# Load necessary libraries
library(RColorBrewer)

# Define custom colors from the Paired palette
custom_colors <- brewer.pal(8, "Paired")[c(1, 2)] # Selecting the 1st and 2nd colors from the Paired Palette which consists of 8 colors

# Create the ggplot visualization
flight_data_viz <- ggplot(data = New_flights_data_long, aes(x = City, y = Delayed, fill = Air_Service)) +
  ggtitle('Delayed Flights') +
  theme(plot.title = element_text(hjust = 0.5)) +
  geom_text(aes(label = Delayed), vjust = -0.2, position = position_dodge(0.9), size = 3.5) +
  geom_bar(stat = "identity", position = position_dodge()) +
  scale_fill_manual(values = custom_colors)  # Set custom colors from the Paired palette

# Print the plot
print(flight_data_viz)

The Delayed Flights visualization displays that AM WEST had the highest number of delays at Phoenix and ALASKA had the highest number of delays at Seattle. On the other hand, AM WEST had the lowest number of delays at Seattle and ALASKA had the lowest number of delays at Phoenix.

Visualize On time Flights

I decided to explore and visualize the number of On time flights for each Airline.

# Load necessary libraries
library(RColorBrewer)

# Define custom colors from the Paired palette
custom_colors <- brewer.pal(8, "Paired")[c(3, 4)] # Selecting the 3rd and 4th colors from the Paired Palette which consists of 8 colors

# Create the ggplot visualization
flight_data_viz2 <- ggplot(data = New_flights_data_long, aes(x = City, y = On_time, fill = Air_Service)) +
  ggtitle('On Time Flights') +
  theme(plot.title = element_text(hjust = 0.5)) +
  geom_text(aes(label = On_time), vjust = -0.2, position = position_dodge(0.9), size = 3.5) +
  geom_bar(stat = "identity", position = position_dodge()) +
  scale_fill_manual(values = custom_colors)  # Set custom colors from the Paired palette

# Print the plot
print(flight_data_viz2)

ALASKA flights had the highest number of on time flights at Seattle, whereas AM WEST had the highest number of on time flights at Phoenix.

Calculate Delay Percentage

# Group by Air_Service and calculate delay percentage
Delay_percentage <- New_flights_data_long %>%
  group_by(Air_Service) %>%
  # Calculate percentage of delayed flights within each group
  mutate(percent = Delayed / sum(Delayed, On_time)) %>%
  # Summarize to get total delay percentage for each Air_Service
  summarise(delay_percentage = sum(percent))

print(Delay_percentage)
## # A tibble: 2 × 2
##   Air_Service delay_percentage
##   <chr>                  <dbl>
## 1 ALASKA                 0.133
## 2 AM WEST                0.109

Conclusion

Overall, the visualizations proved that the airline service AM WEST had more delays for each destination and had the lowest delays at Seattle. I calculated the delay percentage by grouping the Air_Service to obtain the total delay percentage for each Airline. ALASKA flights are delayed by 13% and AM WEST flights are delayed by 11%.

LS0tDQp0aXRsZTogIldlZWsgNSAtIFRpZHlpbmcgYW5kIFRyYW5zZm9ybWluZyBEYXRhIg0KYXV0aG9yOiAiUHVqYSBSb3kiDQpkYXRlOiAiYHIgU3lzLkRhdGUoKWAiDQpvdXRwdXQ6IG9wZW5pbnRybzo6bGFiX3JlcG9ydA0KLS0tDQoNCiMjIyBJbnRyb2R1Y3Rpb24NCkZvciB0aGlzIGFzc2lnbm1lbnQsIEkgaGFkIHRvIGNyZWF0ZSBhIENTViBmaWxlIHRoYXQgZGVzY3JpYmVzIGFycml2YWwgZGVsYXlzIGZvciB0d28gYWlybGluZXM6IEFMQVNLQSAmIEFNIFdFU1QgYWNyb3NzIGZpdmUgZGVzdGluYXRpb246IExvcyBBbmdlbGVzLCBQaG9lbml4LCBTYW4gRGllZ28sIFNhbiBGcmFuY2lzY28gYW5kIFNlYXR0bGUuIFRoZSBtYWluIG9iamVjdGl2ZSBpcyB0byBwZXJmb3JtIGFuYWx5c2lzIHRvIGNvbXBhcmUgdGhlIGFycml2YWwgZGVsYXlzIGZvciB0aGUgdHdvIGFpcmxpbmVzLg0KDQojIyMgTG9hZCBSIExpYnJhcnkgcGFja2FnZXMNCmBgYHtyIGxvYWQtcGFja2FnZXMsIG1lc3NhZ2U9RkFMU0V9DQpsaWJyYXJ5KHRpZHl2ZXJzZSkNCmxpYnJhcnkob3BlbmludHJvKQ0KDQpsaWJyYXJ5KHJlYWRyKQ0KbGlicmFyeSh0aWR5cikNCmxpYnJhcnkoZHBseXIpDQpsaWJyYXJ5KGdncGxvdDIpDQpgYGANCg0KIyMjIFJldHJpZXZlIHRoZSB1bnRpZHkgZGF0YSBmcm9tIEdpdEh1Yg0KDQpPbmNlIEkgaW1wb3J0ZWQgdGhlIGxpYnJhcmllcyByZXF1aXJlZCwgSSByZXRyaWV2ZWQgdGhlIHJhdyBkYXRhc2V0IGZyb20gdGhlIFVSTCBvZiBteSBHaXRIdWIgcHJvZmlsZSBpbiB3aGljaCBJIHN0b3JlZCB0aGUgZGF0YXNldC4NCmBgYHtyfQ0KZmxpZ2h0c19kYXRhIDwtIHJlYWQuY3N2KCJodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vcHVqYXJveTI4MC9EQVRBNjA3V2VlazUvbWFpbi9GbGlnaHRfZGF0YS50eHQiKQ0KVmlldyhmbGlnaHRzX2RhdGEpDQpwcmludChmbGlnaHRzX2RhdGEpDQpgYGANCiMjIyBDbGVhbiwgVHJhbnNmb3JtIGFuZCBUaWR5IHRoZSBEYXRhDQoNCkluaXRpYWxseSwgdGhlIGRhdGEgd2FzIG1lc3N5IGFuZCBkaWZmaWN1bHQgdG8gaW50ZXJwcmV0IHdoaWNoIGlzIHdoeSBJIHJlbW92ZWQgdGhlIE5BIHZhbHVlcy4gSSBub3RpY2VkIHRoYXQgdGhlIEFpcmxpbmUgTmFtZXMgZm9yIHRoZSBkZWxheWVkIHBvcnRpb24gb2YgdGhlIGRhdGEgd2VyZSBtaXNzaW5nIHdoaWNoIGlzIHdoeSBJIGZpbGxlZCBpbiB0aGUgbWlzc2luZyB2YWx1ZXMgZm9yIHJvdyAyIGFuZCA0IG9mIHRoZSBmaXJzdCBjb2x1bW4gaW4gQWlyX1NlcnZpY2UuIEkgYWxzbyByZW5hbWVkIHRoZSBkZXN0aW5hdGlvbiBuYW1lcyB0byBiZSBtb3JlIGNvbnNpc3RlbnQuDQpgYGB7cn0NCiMgUmVtb3ZlIHJvd3Mgd2l0aCBOQSB2YWx1ZXMNCmZsaWdodHNfZGF0YSA8LSBmbGlnaHRzX2RhdGFbY29tcGxldGUuY2FzZXMoZmxpZ2h0c19kYXRhKSwgXQ0KYGBgDQoNCmBgYHtyfQ0KIyBGaWxsIGluIG1pc3NpbmcgdmFsdWVzIGluIHRoZSBmaXJzdCBjb2x1bW4NCmZsaWdodHNfZGF0YVsyLCAieCJdIDwtICJBTEFTS0EiDQpmbGlnaHRzX2RhdGFbNCwgIngiXSA8LSAiQU0gV0VTVCINCmBgYA0KDQpgYGB7cn0NCmZsaWdodHNfZGF0YSA8LSBmbGlnaHRzX2RhdGEgJT4lDQogIHJlbmFtZSgNCiAgICBBaXJfU2VydmljZT0ieCIsDQogICAgVHJhdmVsX1N0YXR1cz0ieSIsDQogICAgTG9zX0FuZ2VsZXMgPSAiTG9zLkFuZ2VsZXMiLA0KICAgIFBob2VuaXggPSAiUGhvZW5peCIsDQogICAgU2FuX0RpZWdvID0gIlNhbi5EaWVnbyIsDQogICAgU2FuX0ZyYW5jaXNjbyA9ICJTYW4uRnJhbmNpc2NvIiwNCiAgICBTZWF0dGxlID0gIlNlYXR0bGUiDQogICkNCnZpZXcoZmxpZ2h0c19kYXRhKQ0KcHJpbnQoZmxpZ2h0c19kYXRhKQ0KYGBgDQoNCkFmdGVyIHRoYXQsIEkgcmVzaGFwZWQgdGhlIGRhdGEgdG8gc3RvcmUgdGhlIGRlc3RpbmF0aW9uIG5hbWVzIGludG8gYSBjb2x1bW4gbmFtZWQgQ2l0eS4NCmBgYHtyfQ0KIyBSZXNoYXBlIGRhdGEgdG8gbG9uZyBmb3JtYXQNCmZsaWdodHNfZGF0YV9sb25nIDwtIGZsaWdodHNfZGF0YSAlPiUNCiAgcGl2b3RfbG9uZ2VyKGNvbHMgPSAtYyhBaXJfU2VydmljZSwgVHJhdmVsX1N0YXR1cyksIG5hbWVzX3RvID0gIkNpdHkiLCB2YWx1ZXNfdG8gPSAiQ291bnQiKQ0KcHJpbnQoZmxpZ2h0c19kYXRhX2xvbmcpDQpgYGANClNpbmNlIHRoZSBkYXRhIHN0aWxsIGxvb2tlZCBtZXNzeSwgSSBkZWNpZGVkIHRvIHNwbGl0IHRoZSBUcmF2ZWxfU3RhdHVzIGNvbHVtbiBpbnRvIDIgY29sdW1ucyB0aGF0IGNvbnNpc3RlZCBvZiBjb3VudCB2YWx1ZXMgZm9yIHRoZSBPbl90aW1lIGFuZCBEZWxheWVkIGZsaWdodHMuIFRoaXMgY29uZGVuc2VkIHRoZSBkYXRhc2V0IGZyb20gMjAgb2JzZXJ2YXRpb25zIHRvIDEwIG9ic2VydmF0aW9ucyBvZiA0IHZhcmlhYmxlcy4gDQpgYGB7cn0NCiMgUmVzaGFwZSBkYXRhIHRvIGxvbmcgZm9ybWF0DQpOZXdfZmxpZ2h0c19kYXRhX2xvbmcgPC0gZmxpZ2h0c19kYXRhICU+JQ0KICBwaXZvdF9sb25nZXIoY29scyA9IC1jKEFpcl9TZXJ2aWNlLCBUcmF2ZWxfU3RhdHVzKSwgbmFtZXNfdG8gPSAiQ2l0eSIsIHZhbHVlc190byA9ICJDb3VudCIpICU+JQ0KICBzZXBhcmF0ZShUcmF2ZWxfU3RhdHVzLCBpbnRvID0gYygiU3RhdHVzIiwgIkRlbGF5X1N0YXR1cyIpLCBzZXAgPSAiICIpICU+JQ0KICBtdXRhdGUoU3RhdHVzID0gaWZfZWxzZShTdGF0dXMgPT0gIm9uIiwgIk9uX3RpbWUiLCAiRGVsYXllZCIpKSAlPiUNCiAgc2VsZWN0KC1EZWxheV9TdGF0dXMpICU+JQ0KICBwaXZvdF93aWRlcihuYW1lc19mcm9tID0gU3RhdHVzLCB2YWx1ZXNfZnJvbSA9IENvdW50KQ0KDQojIFByaW50IHRoZSBmaXJzdCBmZXcgcm93cyBvZiB0aGUgcmVzdWx0aW5nIGRhdGFmcmFtZQ0KcHJpbnQoTmV3X2ZsaWdodHNfZGF0YV9sb25nKQ0KDQpgYGANCiMjIyBWaXN1YWxpemUgRGVsYXllZCBGbGlnaHRzDQoNClNpbmNlIHRoZSBkYXRhIGlzIG5vdyBjbGVhbiBhbmQgZWFzaWVyIHRvIGFuYWx5emUsIGl0J3MgdGltZSB0byB2aXN1YWxpemUgdGhlIG51bWJlciBvZiBkZWxheWVkIGZsaWdodHMgZm9yIGVhY2ggQWlybGluZS4gSSB1dGlsaXplZCB0aGUgUkNvbG9yQnJld2VyIGxpYnJhcnkgdG8gaWRlbnRpZnkgdGhlIHR5cGUgb2YgY29sb3IgcGFsZXR0ZSB0aGF0IEkgd2FudGVkIHRvIGFwcGx5Lg0KYGBge3J9DQojIExvYWQgbmVjZXNzYXJ5IGxpYnJhcmllcw0KbGlicmFyeShSQ29sb3JCcmV3ZXIpDQoNCiMgRGVmaW5lIGN1c3RvbSBjb2xvcnMgZnJvbSB0aGUgUGFpcmVkIHBhbGV0dGUNCmN1c3RvbV9jb2xvcnMgPC0gYnJld2VyLnBhbCg4LCAiUGFpcmVkIilbYygxLCAyKV0gIyBTZWxlY3RpbmcgdGhlIDFzdCBhbmQgMm5kIGNvbG9ycyBmcm9tIHRoZSBQYWlyZWQgUGFsZXR0ZSB3aGljaCBjb25zaXN0cyBvZiA4IGNvbG9ycw0KDQojIENyZWF0ZSB0aGUgZ2dwbG90IHZpc3VhbGl6YXRpb24NCmZsaWdodF9kYXRhX3ZpeiA8LSBnZ3Bsb3QoZGF0YSA9IE5ld19mbGlnaHRzX2RhdGFfbG9uZywgYWVzKHggPSBDaXR5LCB5ID0gRGVsYXllZCwgZmlsbCA9IEFpcl9TZXJ2aWNlKSkgKw0KICBnZ3RpdGxlKCdEZWxheWVkIEZsaWdodHMnKSArDQogIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUpKSArDQogIGdlb21fdGV4dChhZXMobGFiZWwgPSBEZWxheWVkKSwgdmp1c3QgPSAtMC4yLCBwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlKDAuOSksIHNpemUgPSAzLjUpICsNCiAgZ2VvbV9iYXIoc3RhdCA9ICJpZGVudGl0eSIsIHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2UoKSkgKw0KICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBjdXN0b21fY29sb3JzKSAgIyBTZXQgY3VzdG9tIGNvbG9ycyBmcm9tIHRoZSBQYWlyZWQgcGFsZXR0ZQ0KDQojIFByaW50IHRoZSBwbG90DQpwcmludChmbGlnaHRfZGF0YV92aXopDQoNCmBgYA0KDQpUaGUgRGVsYXllZCBGbGlnaHRzIHZpc3VhbGl6YXRpb24gZGlzcGxheXMgdGhhdCBBTSBXRVNUIGhhZCB0aGUgaGlnaGVzdCBudW1iZXIgb2YgZGVsYXlzIGF0IFBob2VuaXggYW5kIEFMQVNLQSBoYWQgdGhlIGhpZ2hlc3QgbnVtYmVyIG9mIGRlbGF5cyBhdCBTZWF0dGxlLiBPbiB0aGUgb3RoZXIgaGFuZCwgQU0gV0VTVCBoYWQgdGhlIGxvd2VzdCBudW1iZXIgb2YgZGVsYXlzIGF0IFNlYXR0bGUgYW5kIEFMQVNLQSBoYWQgdGhlIGxvd2VzdCBudW1iZXIgb2YgZGVsYXlzIGF0IFBob2VuaXguDQoNCiMjIyBWaXN1YWxpemUgT24gdGltZSBGbGlnaHRzDQoNCkkgZGVjaWRlZCB0byBleHBsb3JlIGFuZCB2aXN1YWxpemUgdGhlIG51bWJlciBvZiBPbiB0aW1lIGZsaWdodHMgZm9yIGVhY2ggQWlybGluZS4NCmBgYHtyfQ0KIyBMb2FkIG5lY2Vzc2FyeSBsaWJyYXJpZXMNCmxpYnJhcnkoUkNvbG9yQnJld2VyKQ0KDQojIERlZmluZSBjdXN0b20gY29sb3JzIGZyb20gdGhlIFBhaXJlZCBwYWxldHRlDQpjdXN0b21fY29sb3JzIDwtIGJyZXdlci5wYWwoOCwgIlBhaXJlZCIpW2MoMywgNCldICMgU2VsZWN0aW5nIHRoZSAzcmQgYW5kIDR0aCBjb2xvcnMgZnJvbSB0aGUgUGFpcmVkIFBhbGV0dGUgd2hpY2ggY29uc2lzdHMgb2YgOCBjb2xvcnMNCg0KIyBDcmVhdGUgdGhlIGdncGxvdCB2aXN1YWxpemF0aW9uDQpmbGlnaHRfZGF0YV92aXoyIDwtIGdncGxvdChkYXRhID0gTmV3X2ZsaWdodHNfZGF0YV9sb25nLCBhZXMoeCA9IENpdHksIHkgPSBPbl90aW1lLCBmaWxsID0gQWlyX1NlcnZpY2UpKSArDQogIGdndGl0bGUoJ09uIFRpbWUgRmxpZ2h0cycpICsNCiAgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSkpICsNCiAgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IE9uX3RpbWUpLCB2anVzdCA9IC0wLjIsIHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2UoMC45KSwgc2l6ZSA9IDMuNSkgKw0KICBnZW9tX2JhcihzdGF0ID0gImlkZW50aXR5IiwgcG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSgpKSArDQogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IGN1c3RvbV9jb2xvcnMpICAjIFNldCBjdXN0b20gY29sb3JzIGZyb20gdGhlIFBhaXJlZCBwYWxldHRlDQoNCiMgUHJpbnQgdGhlIHBsb3QNCnByaW50KGZsaWdodF9kYXRhX3ZpejIpDQpgYGANCg0KQUxBU0tBIGZsaWdodHMgaGFkIHRoZSBoaWdoZXN0IG51bWJlciBvZiBvbiB0aW1lIGZsaWdodHMgYXQgU2VhdHRsZSwgd2hlcmVhcyBBTSBXRVNUIGhhZCB0aGUgaGlnaGVzdCBudW1iZXIgb2Ygb24gdGltZSBmbGlnaHRzIGF0IFBob2VuaXguDQoNCiMjIyBDYWxjdWxhdGUgRGVsYXkgUGVyY2VudGFnZQ0KYGBge3J9DQojIEdyb3VwIGJ5IEFpcl9TZXJ2aWNlIGFuZCBjYWxjdWxhdGUgZGVsYXkgcGVyY2VudGFnZQ0KRGVsYXlfcGVyY2VudGFnZSA8LSBOZXdfZmxpZ2h0c19kYXRhX2xvbmcgJT4lDQogIGdyb3VwX2J5KEFpcl9TZXJ2aWNlKSAlPiUNCiAgIyBDYWxjdWxhdGUgcGVyY2VudGFnZSBvZiBkZWxheWVkIGZsaWdodHMgd2l0aGluIGVhY2ggZ3JvdXANCiAgbXV0YXRlKHBlcmNlbnQgPSBEZWxheWVkIC8gc3VtKERlbGF5ZWQsIE9uX3RpbWUpKSAlPiUNCiAgIyBTdW1tYXJpemUgdG8gZ2V0IHRvdGFsIGRlbGF5IHBlcmNlbnRhZ2UgZm9yIGVhY2ggQWlyX1NlcnZpY2UNCiAgc3VtbWFyaXNlKGRlbGF5X3BlcmNlbnRhZ2UgPSBzdW0ocGVyY2VudCkpDQoNCnByaW50KERlbGF5X3BlcmNlbnRhZ2UpDQpgYGANCg0KIyMjIENvbmNsdXNpb24NCg0KT3ZlcmFsbCwgdGhlIHZpc3VhbGl6YXRpb25zIHByb3ZlZCB0aGF0IHRoZSBhaXJsaW5lIHNlcnZpY2UgQU0gV0VTVCBoYWQgbW9yZSBkZWxheXMgZm9yIGVhY2ggZGVzdGluYXRpb24gYW5kIGhhZCB0aGUgbG93ZXN0IGRlbGF5cyBhdCBTZWF0dGxlLiBJIGNhbGN1bGF0ZWQgdGhlIGRlbGF5IHBlcmNlbnRhZ2UgYnkgZ3JvdXBpbmcgdGhlIEFpcl9TZXJ2aWNlIHRvIG9idGFpbiB0aGUgdG90YWwgZGVsYXkgcGVyY2VudGFnZSBmb3IgZWFjaCBBaXJsaW5lLiBBTEFTS0EgZmxpZ2h0cyBhcmUgZGVsYXllZCBieSAxMyUgYW5kIEFNIFdFU1QgZmxpZ2h0cyBhcmUgZGVsYXllZCBieSAxMSUuDQoNCg0K