Domestic Market Share

#====================================
# Worst Airlines for Flight Delays
#====================================
rm(list = ls())
library(tidyverse)
library(hrbrthemes)
# Reference: https://news.zing.vn/jetstar-vietjet-giu-ky-luc-cham-chuyen-trong-quy-dau-nam-2018-post833416.html?fbclid=IwAR3AZ8QDDxcCAT3GYkptDo_z1eN9x470oth5_Pyxm2gf3EWjXqiq6oO9GEc
df_raw <- data.frame(carrier = rep(c("Vietjet", "Vietnam Airline", "Jetstar", "Vasco"), each = 2, times = 1),
type = rep(c("On_Time", "Delay"), each = 1, times = 2),
n_flight = c(24417, 4844, 29321, 3183, 7087, 1898, 3336, 79))
# Colors selected:
my_colors <- c("#8C3F4D", "#3E606F")
# Prepare data for visualization:
df_raw %>%
spread(key = "type", value = "n_flight") %>%
mutate(total = On_Time + Delay, on_time_rate = On_Time / total, delay_rate = 1 - on_time_rate) %>%
arrange(delay_rate) %>%
mutate(carrier = factor(carrier, levels = carrier)) -> df_for_plots
full_join(df_raw, df_for_plots %>% select(carrier, delay_rate)) -> df1
# Graph 1:
df1 %>%
mutate(per = round(100*delay_rate, 2)) %>%
mutate(per = paste0(per, "%")) %>%
mutate(carrier = paste(carrier, paste0("(", per, ")")), sep = " ") %>%
arrange(delay_rate) %>%
mutate(carrier = factor(carrier, levels = carrier %>% unique())) %>%
ggplot(aes(carrier, n_flight, fill = type)) +
geom_col(position = "fill", width = 0.7) +
coord_flip() +
scale_fill_manual(values = my_colors, name = "", labels = c("Delay", "On-Time")) +
theme_modern_rc(plot_title_size = 22, caption_size = 10,
axis_text_size = 16, axis_title_size = 12) +
scale_y_continuous(labels = scales::percent) +
theme(panel.grid.major.y = element_blank()) +
theme(panel.grid.minor.x = element_blank()) +
labs(title = "The On-Time Performance of Domestic Flights Operated\nby Four Vietnam Air Carriers",
x = NULL, y = "Percent of On-Time/Delay",
caption = "Data Source: Civil Aviation Authority of Viet Nam",
subtitle = "Jetstar and Vietjet are worst airlines by delay flights/cancellations with\n delay/cancellation rates are 21.12% and 16.55% respectively.")
# Graph 2:
df_for_plots %>%
mutate(per = total / sum(total)) %>%
mutate(per = round(100*per, 2)) %>%
mutate(per = paste0(per, "%")) %>%
mutate(carrier = paste(carrier, paste0("(", per, ")")), sep = " ") %>%
arrange(total) %>%
mutate(carrier = factor(carrier, levels = carrier)) %>%
ggplot(aes(carrier, total)) +
geom_col(fill = my_colors[2], width = 0.7) +
# geom_text(aes(label = total), hjust = 1.1, color = "white", size = 6) +
coord_flip() +
theme_modern_rc(plot_title_size = 22, caption_size = 10,
axis_text_size = 16, axis_title_size = 12) +
theme(panel.grid.major.y = element_blank()) +
theme(panel.grid.minor.x = element_blank()) +
labs(title = "Domestic Market Share of Four Airline Carriers in Vietnam",
x = NULL, y = "Number of Flights",
caption = "Data Source: Civil Aviation Authority of Viet Nam",
subtitle = "In the domestic market, the Vietnam Airlines holds a 43.83% share. Note that Jetstar and\nregional subsidiary VASCO are excluded.")
Compare with US Airlines
Xem ra hãng hà ng không tốt nhất nước MÄ© - Hawaiian Airlines vá»›i tỉ lệ cháºm / há»§y chuyến thấp nhất (20.18%) cÅ©ng chỉ bằng hãng hà ng không có tỉ lệ há»§y chuyến cao nhất cá»§a Việt Nam là Jetstar (21.12%):

# Data for US Airlines:
library(nycflights13)
data("flights")
flights %>%
filter(!is.na(dep_delay) & !is.na(carrier)) %>%
mutate(dep_delay_status = case_when(dep_delay > 0 ~ "Delay", TRUE ~ "On-Time")) %>%
group_by(carrier, dep_delay_status) %>%
count() %>%
ungroup() -> df
# Calculate delay rate:
df %>%
spread(key = "dep_delay_status", value = "n") %>%
mutate(total = `On-Time` + Delay, on_time_rate = `On-Time` / total, delay_rate = 1 - on_time_rate) %>%
arrange(delay_rate) %>%
mutate(carrier = factor(carrier, levels = carrier)) -> df_delay
# Collect US Airline names:
library(rvest)
my_link <- "http://listofairlinesintheworld.com/"
my_link %>%
read_html() %>%
html_table(fill = TRUE) -> airline_names
do.call("rbind", airline_names) %>%
select(2:6) %>%
filter(Country == "United States") %>%
rename(carrier = IATA) %>%
select(Airline, carrier) -> df_abbr
df_names <- df_abbr %>%
filter(carrier %in% df$carrier, Airline != "USAir")
# Join two data frames:
full_join(df, df_names, by = c("carrier")) %>%
full_join(df_delay, by = c("carrier")) %>%
select(-carrier) %>%
rename(carrier = Airline, n_flight = n, type = dep_delay_status) -> df_for_plot_us
df_for_plot_us %>%
mutate(per = round(100*delay_rate, 2)) %>%
mutate(per = paste0(per, "%")) %>%
mutate(carrier = paste(carrier, paste0("(", per, ")")), sep = " ") %>%
arrange(delay_rate) %>%
mutate(carrier = factor(carrier, levels = carrier %>% unique())) %>%
ggplot(aes(carrier, n_flight, fill = type)) +
geom_col(position = "fill", width = 0.7) +
coord_flip() +
scale_fill_manual(values = my_colors, name = "", labels = c("Delay", "On-Time")) +
theme_modern_rc(plot_title_size = 22, caption_size = 10,
axis_text_size = 14, axis_title_size = 12) +
scale_y_continuous(labels = scales::percent) +
theme(panel.grid.major.y = element_blank()) +
theme(panel.grid.minor.x = element_blank()) +
labs(title = "The On-Time Performance of Domestic Flights Operated\nfor 16 US Air Carriers",
x = NULL, y = "Percent of On-Time/Delay",
caption = "Data Source: Bureau of Transportation Statistics",
subtitle = "Southwest Airlines and AirTran Airways are worst airlines by delay flights/cancellations\nwith delay/cancellation rates are 54.27% and 51.90% respectively.")
LS0tDQp0aXRsZTogIldvcnN0IEFpcmxpbmVzIGJ5IEZsaWdodCBEZWxheXMvQ2FuY2VsbGF0aW9ucyBpbiBWaWV0bmFtIiANCnN1YnRpdGxlOiAiUiBmb3IgUGxlYXN1cmUiDQphdXRob3I6ICJOZ3V5ZW4gQ2hpIER1bmciDQpvdXRwdXQ6DQogIGh0bWxfZG9jdW1lbnQ6IA0KICAgIGNvZGVfZG93bmxvYWQ6IHRydWUNCiAgICBjb2RlX2ZvbGRpbmc6IGhpZGUNCiAgICBoaWdobGlnaHQ6IHplbmJ1cm4NCiAgICAjIG51bWJlcl9zZWN0aW9uczogeWVzDQogICAgdGhlbWU6ICJmbGF0bHkiDQogICAgdG9jOiBUUlVFDQogICAgdG9jX2Zsb2F0OiBUUlVFDQotLS0NCg0KYGBge3Igc2V0dXAsaW5jbHVkZT1GQUxTRX0NCmtuaXRyOjpvcHRzX2NodW5rJHNldChlY2hvID0gVFJVRSwgd2FybmluZyA9IEZBTFNFLCBtZXNzYWdlID0gRkFMU0UsIGZpZy5yZXRpbmE9MikNCmBgYA0KDQojIFRoZSBPbi1UaW1lIFBlcmZvcm1hbmNlIG9mIERvbWVzdGljIEZsaWdodHMNCg0KDQohW10oQzpcXFVzZXJzXFxaYm9va1xEZXNrdG9wXFxwaWNcXHAxLmpwZykNCg0KIyBEb21lc3RpYyBNYXJrZXQgU2hhcmUNCg0KIVtdKEM6XFxVc2Vyc1xcWmJvb2tcRGVza3RvcFxccGljXFxwMi5qcGcpDQoNCg0KYGBge3IsIGV2YWw9RkFMU0V9DQoNCiM9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCiMgIFdvcnN0IEFpcmxpbmVzIGZvciBGbGlnaHQgRGVsYXlzDQojPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQoNCnJtKGxpc3QgPSBscygpKQ0KDQpsaWJyYXJ5KHRpZHl2ZXJzZSkNCmxpYnJhcnkoaHJicnRoZW1lcykNCg0KDQojIFJlZmVyZW5jZTogaHR0cHM6Ly9uZXdzLnppbmcudm4vamV0c3Rhci12aWV0amV0LWdpdS1reS1sdWMtY2hhbS1jaHV5ZW4tdHJvbmctcXV5LWRhdS1uYW0tMjAxOC1wb3N0ODMzNDE2Lmh0bWw/ZmJjbGlkPUl3QVIzQVo4UUREeGNDQVQzR1lrcHREb196MWVOOXg0NzBvdGg1X1B5eG0yZ2YzRVdqWHFpcTZvTzlHRWMNCg0KDQoNCmRmX3JhdyA8LSBkYXRhLmZyYW1lKGNhcnJpZXIgPSByZXAoYygiVmlldGpldCIsICJWaWV0bmFtIEFpcmxpbmUiLCAiSmV0c3RhciIsICJWYXNjbyIpLCBlYWNoID0gMiwgdGltZXMgPSAxKSwgDQogICAgICAgICAgICAgICAgICAgICB0eXBlID0gcmVwKGMoIk9uX1RpbWUiLCAiRGVsYXkiKSwgZWFjaCA9IDEsIHRpbWVzID0gMiksIA0KICAgICAgICAgICAgICAgICAgICAgbl9mbGlnaHQgPSBjKDI0NDE3LCA0ODQ0LCAyOTMyMSwgMzE4MywgNzA4NywgMTg5OCwgMzMzNiwgNzkpKQ0KDQojIENvbG9ycyBzZWxlY3RlZDogDQpteV9jb2xvcnMgPC0gYygiIzhDM0Y0RCIsICIjM0U2MDZGIikNCg0KDQojIFByZXBhcmUgZGF0YSBmb3IgdmlzdWFsaXphdGlvbjogDQpkZl9yYXcgJT4lIA0KICBzcHJlYWQoa2V5ID0gInR5cGUiLCB2YWx1ZSA9ICJuX2ZsaWdodCIpICU+JSANCiAgbXV0YXRlKHRvdGFsID0gT25fVGltZSArIERlbGF5LCBvbl90aW1lX3JhdGUgPSBPbl9UaW1lIC8gdG90YWwsIGRlbGF5X3JhdGUgPSAxIC0gb25fdGltZV9yYXRlKSAlPiUgDQogIGFycmFuZ2UoZGVsYXlfcmF0ZSkgJT4lIA0KICBtdXRhdGUoY2FycmllciA9IGZhY3RvcihjYXJyaWVyLCBsZXZlbHMgPSBjYXJyaWVyKSkgLT4gZGZfZm9yX3Bsb3RzDQoNCmZ1bGxfam9pbihkZl9yYXcsIGRmX2Zvcl9wbG90cyAlPiUgc2VsZWN0KGNhcnJpZXIsIGRlbGF5X3JhdGUpKSAtPiBkZjENCg0KDQoNCg0KIyBHcmFwaCAxOiANCg0KZGYxICU+JSANCiAgbXV0YXRlKHBlciA9IHJvdW5kKDEwMCpkZWxheV9yYXRlLCAyKSkgJT4lIA0KICBtdXRhdGUocGVyID0gcGFzdGUwKHBlciwgIiUiKSkgJT4lIA0KICBtdXRhdGUoY2FycmllciA9IHBhc3RlKGNhcnJpZXIsIHBhc3RlMCgiKCIsIHBlciwgIikiKSksIHNlcCA9ICIgIikgJT4lIA0KICBhcnJhbmdlKGRlbGF5X3JhdGUpICU+JSANCiAgbXV0YXRlKGNhcnJpZXIgPSBmYWN0b3IoY2FycmllciwgbGV2ZWxzID0gY2FycmllciAlPiUgdW5pcXVlKCkpKSAlPiUgDQogIGdncGxvdChhZXMoY2Fycmllciwgbl9mbGlnaHQsIGZpbGwgPSB0eXBlKSkgKyANCiAgZ2VvbV9jb2wocG9zaXRpb24gPSAiZmlsbCIsIHdpZHRoID0gMC43KSArDQogIGNvb3JkX2ZsaXAoKSArIA0KICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBteV9jb2xvcnMsIG5hbWUgPSAiIiwgbGFiZWxzID0gYygiRGVsYXkiLCAiT24tVGltZSIpKSArIA0KICB0aGVtZV9tb2Rlcm5fcmMocGxvdF90aXRsZV9zaXplID0gMjIsIGNhcHRpb25fc2l6ZSA9IDEwLCANCiAgICAgICAgICAgICAgICAgIGF4aXNfdGV4dF9zaXplID0gMTYsIGF4aXNfdGl0bGVfc2l6ZSA9IDEyKSArDQogIHNjYWxlX3lfY29udGludW91cyhsYWJlbHMgPSBzY2FsZXM6OnBlcmNlbnQpICsgDQogIHRoZW1lKHBhbmVsLmdyaWQubWFqb3IueSA9IGVsZW1lbnRfYmxhbmsoKSkgKyANCiAgdGhlbWUocGFuZWwuZ3JpZC5taW5vci54ID0gZWxlbWVudF9ibGFuaygpKSArIA0KICBsYWJzKHRpdGxlID0gIlRoZSBPbi1UaW1lIFBlcmZvcm1hbmNlIG9mIERvbWVzdGljIEZsaWdodHMgT3BlcmF0ZWRcbmJ5IEZvdXIgVmlldG5hbSBBaXIgQ2FycmllcnMiLCANCiAgICAgICB4ID0gTlVMTCwgeSA9ICJQZXJjZW50IG9mIE9uLVRpbWUvRGVsYXkiLCANCiAgICAgICBjYXB0aW9uID0gIkRhdGEgU291cmNlOiBDaXZpbCBBdmlhdGlvbiBBdXRob3JpdHkgb2YgVmlldCBOYW0iLCANCiAgICAgICBzdWJ0aXRsZSA9ICJKZXRzdGFyIGFuZCBWaWV0amV0IGFyZSB3b3JzdCBhaXJsaW5lcyBieSBkZWxheSBmbGlnaHRzL2NhbmNlbGxhdGlvbnMgd2l0aFxuIGRlbGF5L2NhbmNlbGxhdGlvbiByYXRlcyBhcmUgMjEuMTIlIGFuZCAxNi41NSUgcmVzcGVjdGl2ZWx5LiIpDQoNCg0KIyBHcmFwaCAyOiANCg0KZGZfZm9yX3Bsb3RzICU+JSANCiAgbXV0YXRlKHBlciA9IHRvdGFsIC8gc3VtKHRvdGFsKSkgJT4lIA0KICBtdXRhdGUocGVyID0gcm91bmQoMTAwKnBlciwgMikpICU+JSANCiAgbXV0YXRlKHBlciA9IHBhc3RlMChwZXIsICIlIikpICU+JSANCiAgbXV0YXRlKGNhcnJpZXIgPSBwYXN0ZShjYXJyaWVyLCBwYXN0ZTAoIigiLCBwZXIsICIpIikpLCBzZXAgPSAiICIpICU+JSANCiAgYXJyYW5nZSh0b3RhbCkgJT4lIA0KICBtdXRhdGUoY2FycmllciA9IGZhY3RvcihjYXJyaWVyLCBsZXZlbHMgPSBjYXJyaWVyKSkgJT4lDQogIGdncGxvdChhZXMoY2FycmllciwgdG90YWwpKSArIA0KICBnZW9tX2NvbChmaWxsID0gbXlfY29sb3JzWzJdLCB3aWR0aCA9IDAuNykgKyANCiAgIyBnZW9tX3RleHQoYWVzKGxhYmVsID0gdG90YWwpLCBoanVzdCA9IDEuMSwgY29sb3IgPSAid2hpdGUiLCBzaXplID0gNikgKyANCiAgY29vcmRfZmxpcCgpICsgDQogIHRoZW1lX21vZGVybl9yYyhwbG90X3RpdGxlX3NpemUgPSAyMiwgY2FwdGlvbl9zaXplID0gMTAsDQogICAgICAgICAgICAgICAgICBheGlzX3RleHRfc2l6ZSA9IDE2LCBheGlzX3RpdGxlX3NpemUgPSAxMikgKw0KICB0aGVtZShwYW5lbC5ncmlkLm1ham9yLnkgPSBlbGVtZW50X2JsYW5rKCkpICsgDQogIHRoZW1lKHBhbmVsLmdyaWQubWlub3IueCA9IGVsZW1lbnRfYmxhbmsoKSkgKyANCiAgbGFicyh0aXRsZSA9ICJEb21lc3RpYyBNYXJrZXQgU2hhcmUgb2YgRm91ciBBaXJsaW5lIENhcnJpZXJzIGluIFZpZXRuYW0iLCANCiAgICAgICB4ID0gTlVMTCwgeSA9ICJOdW1iZXIgb2YgRmxpZ2h0cyIsIA0KICAgICAgIGNhcHRpb24gPSAiRGF0YSBTb3VyY2U6IENpdmlsIEF2aWF0aW9uIEF1dGhvcml0eSBvZiBWaWV0IE5hbSIsIA0KICAgICAgIHN1YnRpdGxlID0gIkluIHRoZSBkb21lc3RpYyBtYXJrZXQsIHRoZSBWaWV0bmFtIEFpcmxpbmVzIGhvbGRzIGEgNDMuODMlIHNoYXJlLiBOb3RlIHRoYXQgSmV0c3RhciBhbmRcbnJlZ2lvbmFsIHN1YnNpZGlhcnkgVkFTQ08gYXJlIGV4Y2x1ZGVkLiIpDQoNCg0KYGBgDQoNCiMgQ29tcGFyZSB3aXRoIFVTIEFpcmxpbmVzDQoNClhlbSByYSBow6NuZyBow6BuZyBraMO0bmcgdOG7kXQgbmjhuqV0IG7GsOG7m2MgTcSpIC0gSGF3YWlpYW4gQWlybGluZXMgduG7m2kgdOG7iSBs4buHIGNo4bqtbSAvIGjhu6d5IGNodXnhur9uIHRo4bqlcCBuaOG6pXQgKDIwLjE4JSkgY8WpbmcgY2jhu4kgYuG6sW5nIGjDo25nIGjDoG5nIGtow7RuZyBjw7MgdOG7iSBs4buHIGjhu6d5IGNodXnhur9uIGNhbyBuaOG6pXQgY+G7p2EgVmnhu4d0IE5hbSBsw6AgSmV0c3RhciAoMjEuMTIlKTogDQoNCiFbXShDOlxcVXNlcnNcXFpib29rXERlc2t0b3BcXHBpY1xccDMuanBnKQ0KDQpgYGB7ciwgZXZhbD1GQUxTRX0NCiMgRGF0YSBmb3IgVVMgQWlybGluZXM6IA0KbGlicmFyeShueWNmbGlnaHRzMTMpDQpkYXRhKCJmbGlnaHRzIikNCg0KDQpmbGlnaHRzICU+JSANCiAgZmlsdGVyKCFpcy5uYShkZXBfZGVsYXkpICYgIWlzLm5hKGNhcnJpZXIpKSAlPiUgDQogIG11dGF0ZShkZXBfZGVsYXlfc3RhdHVzID0gY2FzZV93aGVuKGRlcF9kZWxheSA+IDAgfiAiRGVsYXkiLCBUUlVFIH4gIk9uLVRpbWUiKSkgJT4lIA0KICBncm91cF9ieShjYXJyaWVyLCBkZXBfZGVsYXlfc3RhdHVzKSAlPiUgDQogIGNvdW50KCkgJT4lIA0KICB1bmdyb3VwKCkgLT4gZGYNCg0KIyBDYWxjdWxhdGUgZGVsYXkgcmF0ZTogDQoNCmRmICU+JSANCiAgc3ByZWFkKGtleSA9ICJkZXBfZGVsYXlfc3RhdHVzIiwgdmFsdWUgPSAibiIpICU+JSANCiAgbXV0YXRlKHRvdGFsID0gYE9uLVRpbWVgICsgRGVsYXksIG9uX3RpbWVfcmF0ZSA9IGBPbi1UaW1lYCAvIHRvdGFsLCBkZWxheV9yYXRlID0gMSAtIG9uX3RpbWVfcmF0ZSkgJT4lIA0KICBhcnJhbmdlKGRlbGF5X3JhdGUpICU+JSANCiAgbXV0YXRlKGNhcnJpZXIgPSBmYWN0b3IoY2FycmllciwgbGV2ZWxzID0gY2FycmllcikpIC0+IGRmX2RlbGF5DQoNCiMgQ29sbGVjdCBVUyBBaXJsaW5lIG5hbWVzOiANCg0KbGlicmFyeShydmVzdCkNCg0KbXlfbGluayA8LSAiaHR0cDovL2xpc3RvZmFpcmxpbmVzaW50aGV3b3JsZC5jb20vIg0KDQpteV9saW5rICU+JSANCiAgcmVhZF9odG1sKCkgJT4lIA0KICBodG1sX3RhYmxlKGZpbGwgPSBUUlVFKSAtPiBhaXJsaW5lX25hbWVzDQoNCmRvLmNhbGwoInJiaW5kIiwgYWlybGluZV9uYW1lcykgJT4lIA0KICBzZWxlY3QoMjo2KSAlPiUgDQogIGZpbHRlcihDb3VudHJ5ID09ICJVbml0ZWQgU3RhdGVzIikgJT4lIA0KICByZW5hbWUoY2FycmllciA9IElBVEEpICU+JSANCiAgc2VsZWN0KEFpcmxpbmUsIGNhcnJpZXIpIC0+IGRmX2FiYnINCg0KDQpkZl9uYW1lcyA8LSBkZl9hYmJyICU+JSANCiAgZmlsdGVyKGNhcnJpZXIgJWluJSBkZiRjYXJyaWVyLCBBaXJsaW5lICE9ICJVU0FpciIpDQoNCiMgSm9pbiB0d28gZGF0YSBmcmFtZXM6IA0KZnVsbF9qb2luKGRmLCBkZl9uYW1lcywgYnkgPSBjKCJjYXJyaWVyIikpICU+JSANCiAgZnVsbF9qb2luKGRmX2RlbGF5LCBieSA9IGMoImNhcnJpZXIiKSkgJT4lDQogIHNlbGVjdCgtY2FycmllcikgJT4lIA0KICByZW5hbWUoY2FycmllciA9IEFpcmxpbmUsIG5fZmxpZ2h0ID0gbiwgdHlwZSA9IGRlcF9kZWxheV9zdGF0dXMpIC0+IGRmX2Zvcl9wbG90X3VzDQoNCmRmX2Zvcl9wbG90X3VzICU+JSANCiAgbXV0YXRlKHBlciA9IHJvdW5kKDEwMCpkZWxheV9yYXRlLCAyKSkgJT4lIA0KICBtdXRhdGUocGVyID0gcGFzdGUwKHBlciwgIiUiKSkgJT4lIA0KICBtdXRhdGUoY2FycmllciA9IHBhc3RlKGNhcnJpZXIsIHBhc3RlMCgiKCIsIHBlciwgIikiKSksIHNlcCA9ICIgIikgJT4lIA0KICBhcnJhbmdlKGRlbGF5X3JhdGUpICU+JSANCiAgbXV0YXRlKGNhcnJpZXIgPSBmYWN0b3IoY2FycmllciwgbGV2ZWxzID0gY2FycmllciAlPiUgdW5pcXVlKCkpKSAlPiUgDQogIGdncGxvdChhZXMoY2Fycmllciwgbl9mbGlnaHQsIGZpbGwgPSB0eXBlKSkgKyANCiAgZ2VvbV9jb2wocG9zaXRpb24gPSAiZmlsbCIsIHdpZHRoID0gMC43KSArDQogIGNvb3JkX2ZsaXAoKSArIA0KICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBteV9jb2xvcnMsIG5hbWUgPSAiIiwgbGFiZWxzID0gYygiRGVsYXkiLCAiT24tVGltZSIpKSArIA0KICB0aGVtZV9tb2Rlcm5fcmMocGxvdF90aXRsZV9zaXplID0gMjIsIGNhcHRpb25fc2l6ZSA9IDEwLCANCiAgICAgICAgICAgICAgICAgIGF4aXNfdGV4dF9zaXplID0gMTQsIGF4aXNfdGl0bGVfc2l6ZSA9IDEyKSArDQogIHNjYWxlX3lfY29udGludW91cyhsYWJlbHMgPSBzY2FsZXM6OnBlcmNlbnQpICsgDQogIHRoZW1lKHBhbmVsLmdyaWQubWFqb3IueSA9IGVsZW1lbnRfYmxhbmsoKSkgKyANCiAgdGhlbWUocGFuZWwuZ3JpZC5taW5vci54ID0gZWxlbWVudF9ibGFuaygpKSArIA0KICBsYWJzKHRpdGxlID0gIlRoZSBPbi1UaW1lIFBlcmZvcm1hbmNlIG9mIERvbWVzdGljIEZsaWdodHMgT3BlcmF0ZWRcbmZvciAxNiBVUyBBaXIgQ2FycmllcnMiLCANCiAgICAgICB4ID0gTlVMTCwgeSA9ICJQZXJjZW50IG9mIE9uLVRpbWUvRGVsYXkiLCANCiAgICAgICBjYXB0aW9uID0gIkRhdGEgU291cmNlOiBCdXJlYXUgb2YgVHJhbnNwb3J0YXRpb24gU3RhdGlzdGljcyIsIA0KICAgICAgIHN1YnRpdGxlID0gIlNvdXRod2VzdCBBaXJsaW5lcyBhbmQgQWlyVHJhbiBBaXJ3YXlzIGFyZSB3b3JzdCBhaXJsaW5lcyBieSBkZWxheSBmbGlnaHRzL2NhbmNlbGxhdGlvbnNcbndpdGggZGVsYXkvY2FuY2VsbGF0aW9uIHJhdGVzIGFyZSA1NC4yNyUgYW5kIDUxLjkwJSByZXNwZWN0aXZlbHkuIikNCg0KYGBgDQoNCg==