## Warning: package 'tidyverse' was built under R version 4.4.3
## Warning: package 'ggplot2' was built under R version 4.4.3
## Warning: package 'dplyr' was built under R version 4.4.3
## Warning: package 'openintro' was built under R version 4.4.3
##Introduction
In this vignette, we will use lubridate package from the Tidyverse to
parse and manipulate data that uses date and time. The data we will use
is flights dataset in nycflights13 package. We will calculate departure
delays and visualize the results.
###Load Data and Perform Analysis
First, lets install and load the necessary libraries.
Let’s load the flight dataset and get a glimpse of the dataset.
## Rows: 336,776
## Columns: 19
## $ year <int> 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2…
## $ month <int> 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1…
## $ day <int> 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1…
## $ dep_time <int> 517, 533, 542, 544, 554, 554, 555, 557, 557, 558, 558, …
## $ sched_dep_time <int> 515, 529, 540, 545, 600, 558, 600, 600, 600, 600, 600, …
## $ dep_delay <dbl> 2, 4, 2, -1, -6, -4, -5, -3, -3, -2, -2, -2, -2, -2, -1…
## $ arr_time <int> 830, 850, 923, 1004, 812, 740, 913, 709, 838, 753, 849,…
## $ sched_arr_time <int> 819, 830, 850, 1022, 837, 728, 854, 723, 846, 745, 851,…
## $ arr_delay <dbl> 11, 20, 33, -18, -25, 12, 19, -14, -8, 8, -2, -3, 7, -1…
## $ carrier <chr> "UA", "UA", "AA", "B6", "DL", "UA", "B6", "EV", "B6", "…
## $ flight <int> 1545, 1714, 1141, 725, 461, 1696, 507, 5708, 79, 301, 4…
## $ tailnum <chr> "N14228", "N24211", "N619AA", "N804JB", "N668DN", "N394…
## $ origin <chr> "EWR", "LGA", "JFK", "JFK", "LGA", "EWR", "EWR", "LGA",…
## $ dest <chr> "IAH", "IAH", "MIA", "BQN", "ATL", "ORD", "FLL", "IAD",…
## $ air_time <dbl> 227, 227, 160, 183, 116, 150, 158, 53, 140, 138, 149, 1…
## $ distance <dbl> 1400, 1416, 1089, 1576, 762, 719, 1065, 229, 944, 733, …
## $ hour <dbl> 5, 5, 5, 5, 6, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 5, 6, 6, 6…
## $ minute <dbl> 15, 29, 40, 45, 0, 58, 0, 0, 0, 0, 0, 0, 0, 0, 0, 59, 0…
## $ time_hour <dttm> 2013-01-01 05:00:00, 2013-01-01 05:00:00, 2013-01-01 0…
After the glimpse of the dataset, we will use functions in the
lubridate package to convert date and time columns into proper datetime
objects.
Step 1: Preprocess Arrival Times
With this, The date is combined into one column and the times are
combined into one column for easier readability and analysis.
## Rows: 336,776
## Columns: 23
## $ year <int> 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, …
## $ month <int> 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, …
## $ day <int> 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, …
## $ dep_time <int> 517, 533, 542, 544, 554, 554, 555, 557, 557, 558…
## $ sched_dep_time <int> 515, 529, 540, 545, 600, 558, 600, 600, 600, 600…
## $ dep_delay <dbl> 2, 4, 2, -1, -6, -4, -5, -3, -3, -2, -2, -2, -2,…
## $ arr_time <chr> "0830", "0850", "0923", "1004", "0812", "0740", …
## $ sched_arr_time <chr> "0819", "0830", "0850", "1022", "0837", "0728", …
## $ arr_delay <dbl> 11, 20, 33, -18, -25, 12, 19, -14, -8, 8, -2, -3…
## $ carrier <chr> "UA", "UA", "AA", "B6", "DL", "UA", "B6", "EV", …
## $ flight <int> 1545, 1714, 1141, 725, 461, 1696, 507, 5708, 79,…
## $ tailnum <chr> "N14228", "N24211", "N619AA", "N804JB", "N668DN"…
## $ origin <chr> "EWR", "LGA", "JFK", "JFK", "LGA", "EWR", "EWR",…
## $ dest <chr> "IAH", "IAH", "MIA", "BQN", "ATL", "ORD", "FLL",…
## $ air_time <dbl> 227, 227, 160, 183, 116, 150, 158, 53, 140, 138,…
## $ distance <dbl> 1400, 1416, 1089, 1576, 762, 719, 1065, 229, 944…
## $ hour <dbl> 5, 5, 5, 5, 6, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 5, …
## $ minute <dbl> 15, 29, 40, 45, 0, 58, 0, 0, 0, 0, 0, 0, 0, 0, 0…
## $ time_hour <dttm> 2013-01-01 05:00:00, 2013-01-01 05:00:00, 2013-…
## $ flight_date <date> 2013-01-01, 2013-01-01, 2013-01-01, 2013-01-01,…
## $ actual_arrival_time <time> 08:30:00, 08:50:00, 09:23:00, 10:04:00, 08:12:0…
## $ sched_arrival_time <time> 08:19:00, 08:30:00, 08:50:00, 10:22:00, 08:37:0…
## $ arrival_delay_minutes <dbl> 11, 20, 33, -18, -25, 12, 19, -14, -8, 8, -2, -3…
Next, we will convert the departure delay values into a numeric
format for easier analysis. Then we will summarize the average departure
delay for each day of the week and create a visualization to present the
findings.
We will use wday function from the lubridate package to figure out
what day of the week the date of departure fell on.
Analyze Delays by Carrier and Day of the Week

## Explore Delay Distribution by Origin Airport
## # A tibble: 1 × 3
## na_count nan_count inf_count
## <int> <int> <int>
## 1 8255 0 0
## Min. 1st Qu. Median Mean 3rd Qu. Max. NA's
## -43.00 -5.00 -2.00 12.64 11.00 1301.00 8255
## # A tibble: 1 × 2
## below_limit above_limit
## <int> <int>
## 1 41 13346

## [1] 5 6 7 8 18 9 10 11 12 13 14 15 16 17 19 20 21 22 23 1
Investigate Hourly Delay Patterns

To compare departure and arrival delays
## # A tibble: 673,552 × 3
## day_of_week delay_type delay_minutes
## <ord> <chr> <dbl>
## 1 Tue departure_delay_minutes 2
## 2 Tue arrival_delay_minutes 11
## 3 Tue departure_delay_minutes 4
## 4 Tue arrival_delay_minutes 20
## 5 Tue departure_delay_minutes 2
## 6 Tue arrival_delay_minutes 33
## 7 Tue departure_delay_minutes -1
## 8 Tue arrival_delay_minutes -18
## 9 Tue departure_delay_minutes -6
## 10 Tue arrival_delay_minutes -25
## # ℹ 673,542 more rows

##Conclusion In this analysis, we demonstrated how the Tidyverse,
particularly the lubridate, dplyr, and ggplot2 packages, can be used to
efficiently manipulate, clean, and visualize flight delay data. By
transforming raw date and time information into structured formats, we
were able to explore patterns in both departure and arrival delays
across different days of the week, airports, and hours of the day. Using
visualizations like bar charts, boxplots, and line graphs, we uncovered
meaningful trends — for example, average delays fluctuating by weekday
and departure hour.
This workflow highlights the power of tidy data principles: with a
consistent and organized dataset, we can gain valuable insights quickly
and clearly. The tools and techniques used here can be easily extended
to other real-world datasets involving dates, times, and delay
analysis.
LS0tDQp0aXRsZTogIlRhbnppbF9NUCB0aWR5dmVyc2UgZXh0ZW5kIg0KYXV0aG9yOiAiTWQuIFRhbnppbCBFaHNhbiINCmRhdGU6ICIwNC8yNy8yNSINCm91dHB1dDogb3BlbmludHJvOjpsYWJfcmVwb3J0DQotLS0NCg0KYGBge3IgbG9hZC1wYWNrYWdlcywgbWVzc2FnZT1GQUxTRX0NCmxpYnJhcnkodGlkeXZlcnNlKQ0KbGlicmFyeShvcGVuaW50cm8pDQpgYGANCg0KDQoNCmBgYHtyIHNldHVwLCBpbmNsdWRlPUZBTFNFfQ0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KGVjaG8gPSBGQUxTRSkNCmBgYA0KDQoNCg0KIyNJbnRyb2R1Y3Rpb24NCg0KSW4gdGhpcyB2aWduZXR0ZSwgd2Ugd2lsbCB1c2UgbHVicmlkYXRlIHBhY2thZ2UgZnJvbSB0aGUgVGlkeXZlcnNlIHRvIHBhcnNlIGFuZCBtYW5pcHVsYXRlIGRhdGEgdGhhdCB1c2VzIGRhdGUgYW5kIHRpbWUuIFRoZSBkYXRhIHdlIHdpbGwgdXNlIGlzIGZsaWdodHMgZGF0YXNldCBpbiBueWNmbGlnaHRzMTMgcGFja2FnZS4gV2Ugd2lsbCBjYWxjdWxhdGUgZGVwYXJ0dXJlIGRlbGF5cyBhbmQgdmlzdWFsaXplIHRoZSByZXN1bHRzLiANCg0KIyMjTG9hZCBEYXRhIGFuZCBQZXJmb3JtIEFuYWx5c2lzDQoNCkZpcnN0LCBsZXRzIGluc3RhbGwgYW5kIGxvYWQgdGhlIG5lY2Vzc2FyeSBsaWJyYXJpZXMuIA0KDQpgYGB7cn0NCmlmICghcmVxdWlyZU5hbWVzcGFjZSgidGlkeXZlcnNlIiwgcXVpZXRseSA9IFRSVUUpKSB7aW5zdGFsbC5wYWNrYWdlcygidGlkeXZlcnNlIil9DQppZiAoIXJlcXVpcmVOYW1lc3BhY2UoImx1YnJpZGF0ZSIsIHF1aWV0bHkgPSBUUlVFKSkge2luc3RhbGwucGFja2FnZXMoImx1YnJpZGF0ZSIpfQ0KDQojIEluc3RhbGwgbnljZmxpZ2h0czEzIGlmIG5vdCBhbHJlYWR5IGluc3RhbGxlZA0KaWYgKCFyZXF1aXJlTmFtZXNwYWNlKCJueWNmbGlnaHRzMTMiLCBxdWlldGx5ID0gVFJVRSkpIHsNCiAgaW5zdGFsbC5wYWNrYWdlcygibnljZmxpZ2h0czEzIikNCn0NCmBgYA0KDQpgYGB7cn0NCmxpYnJhcnkodGlkeXZlcnNlKQ0KbGlicmFyeShsdWJyaWRhdGUpDQpsaWJyYXJ5KG55Y2ZsaWdodHMxMykNCmxpYnJhcnkoZHBseXIpDQpsaWJyYXJ5KGx1YnJpZGF0ZSkNCmxpYnJhcnkoc3RyaW5ncikNCmBgYA0KDQpMZXQncyBsb2FkIHRoZSBmbGlnaHQgZGF0YXNldCBhbmQgZ2V0IGEgZ2xpbXBzZSBvZiB0aGUgZGF0YXNldC4gDQoNCmBgYHtyfQ0KZmxpZ2h0cyA8LSBueWNmbGlnaHRzMTM6OmZsaWdodHMNCmdsaW1wc2UoZmxpZ2h0cykNCmBgYA0KDQpBZnRlciB0aGUgZ2xpbXBzZSBvZiB0aGUgZGF0YXNldCwgd2Ugd2lsbCB1c2UgZnVuY3Rpb25zIGluIHRoZSBsdWJyaWRhdGUgcGFja2FnZSB0byBjb252ZXJ0IGRhdGUgYW5kIHRpbWUgY29sdW1ucyBpbnRvIHByb3BlciBkYXRldGltZSBvYmplY3RzLg0KDQoNCiMjIFN0ZXAgMTogUHJlcHJvY2VzcyBBcnJpdmFsIFRpbWVzDQoNCmBgYHtyfQ0KZmxpZ2h0cyA8LSBmbGlnaHRzICU+JQ0KICBtdXRhdGUoDQogICAgZmxpZ2h0X2RhdGUgPSBtYWtlX2RhdGUoeWVhciwgbW9udGgsIGRheSksDQogICAgIyBQYWQgYW5kIGNsZWFuIGFycl90aW1lIGFuZCBzY2hlZF9hcnJfdGltZQ0KICAgIGFycl90aW1lID0gc3RyX3BhZChhcnJfdGltZSwgNCwgcGFkID0gIjAiKSwNCiAgICBzY2hlZF9hcnJfdGltZSA9IHN0cl9wYWQoc2NoZWRfYXJyX3RpbWUsIDQsIHBhZCA9ICIwIiksDQogICAgIyBSZXBsYWNlICIyNDAwIiB3aXRoICIwMDAwIiBmb3IgdmFsaWQgcGFyc2luZw0KICAgIGFycl90aW1lID0gaWZfZWxzZShhcnJfdGltZSA9PSAiMjQwMCIsICIwMDAwIiwgYXJyX3RpbWUpLA0KICAgIHNjaGVkX2Fycl90aW1lID0gaWZfZWxzZShzY2hlZF9hcnJfdGltZSA9PSAiMjQwMCIsICIwMDAwIiwgc2NoZWRfYXJyX3RpbWUpLA0KICAgICMgUGFyc2UgdG8gdGltZSBvYmplY3RzDQogICAgYWN0dWFsX2Fycml2YWxfdGltZSA9IHBhcnNlX3RpbWUoYXMuY2hhcmFjdGVyKGFycl90aW1lKSwgZm9ybWF0ID0gIiVIJU0iKSwNCiAgICBzY2hlZF9hcnJpdmFsX3RpbWUgPSBwYXJzZV90aW1lKGFzLmNoYXJhY3RlcihzY2hlZF9hcnJfdGltZSksIGZvcm1hdCA9ICIlSCVNIiksDQogICAgIyBDb252ZXJ0IGFycl9kZWxheSB0byBudW1lcmljIChyZWR1bmRhbnQgYnV0IGZvciBjb25zaXN0ZW5jeSkNCiAgICBhcnJpdmFsX2RlbGF5X21pbnV0ZXMgPSBhcy5udW1lcmljKGFycl9kZWxheSkNCiAgKQ0KYGBgDQoNCg0KDQpXaXRoIHRoaXMsICBUaGUgZGF0ZSBpcyBjb21iaW5lZCBpbnRvIG9uZSBjb2x1bW4gYW5kIHRoZSB0aW1lcyBhcmUgY29tYmluZWQgaW50byBvbmUgY29sdW1uIGZvciBlYXNpZXIgcmVhZGFiaWxpdHkgYW5kIGFuYWx5c2lzLiANCmBgYHtyfQ0KI2NoZWNrIHRoZSBuZXcgZGF0YXNldA0KDQpnbGltcHNlKGZsaWdodHMpDQoNCmBgYA0KDQoNCg0KTmV4dCwgd2Ugd2lsbCBjb252ZXJ0IHRoZSBkZXBhcnR1cmUgZGVsYXkgdmFsdWVzIGludG8gYSBudW1lcmljIGZvcm1hdCBmb3IgZWFzaWVyIGFuYWx5c2lzLiBUaGVuIHdlIHdpbGwgc3VtbWFyaXplIHRoZSBhdmVyYWdlIGRlcGFydHVyZSBkZWxheSBmb3IgZWFjaCBkYXkgb2YgdGhlIHdlZWsgYW5kIGNyZWF0ZSBhIHZpc3VhbGl6YXRpb24gdG8gcHJlc2VudCB0aGUgZmluZGluZ3MuIA0KDQpXZSB3aWxsIHVzZSB3ZGF5IGZ1bmN0aW9uIGZyb20gdGhlIGx1YnJpZGF0ZSBwYWNrYWdlIHRvIGZpZ3VyZSBvdXQgd2hhdCBkYXkgb2YgdGhlIHdlZWsgdGhlIGRhdGUgb2YgZGVwYXJ0dXJlIGZlbGwgb24uIA0KDQpgYGB7cn0NCiNDYWxjdWxhdGUgZGVsYXkgaW4gbWludXRlcw0KZmxpZ2h0cyA8LSBmbGlnaHRzICU+JQ0KICBtdXRhdGUoZGVwYXJ0dXJlX2RlbGF5X21pbnV0ZXMgPSBhcy5udW1lcmljKGRlcF9kZWxheSkpDQoNCiNBZGQgYSBkYXkgb2YgdGhlIHdlZWsgY29sdW1uDQpmbGlnaHRzIDwtIGZsaWdodHMgJT4lDQogIG11dGF0ZShkYXlfb2Zfd2VlayA9IHdkYXkoZmxpZ2h0X2RhdGUsIGxhYmVsID0gVFJVRSkpDQpgYGANCg0KDQojIyBBbmFseXplIERlbGF5cyBieSBDYXJyaWVyIGFuZCBEYXkgb2YgdGhlIFdlZWsNCg0KYGBge3J9DQojU3VtbWFyaXplIGF2ZXJhZ2UgZGVsYXkgYnkgZGF5IG9mIHRoZSB3ZWVrIA0KYXZlcmFnZV9kZWxheSA8LSBmbGlnaHRzICU+JQ0KICBncm91cF9ieShkYXlfb2Zfd2VlaykgJT4lDQogIHN1bW1hcml6ZShhdmVyYWdlX2RlbGF5ID0gbWVhbihkZXBhcnR1cmVfZGVsYXlfbWludXRlcywgbmEucm0gPSBUUlVFKSkNCg0KI1Bsb3QgdGhlIHJlc3VsdHMNCmdncGxvdChhdmVyYWdlX2RlbGF5LCBhZXMoeCA9IGRheV9vZl93ZWVrLCB5ID0gYXZlcmFnZV9kZWxheSkpICsNCiAgZ2VvbV9iYXIoc3RhdCA9ICJpZGVudGl0eSIsZmlsbCA9J29yYW5nZScpICsNCiAgbGFicygNCiAgICB0aXRsZSA9ICJBdmVyYWdlIERlcGFydHVyZSBEZWxheSBieSBEYXkgb2YgdGhlIFdlZWsiLA0KICAgIHggPSAiRGF5IG9mIHRoZSBXZWVrIiwNCiAgICB5ID0gIkF2ZXJhZ2UgRGVwYXJ0dXJlIERlbGF5IChtaW51dGVzKSINCiAgKQ0KDQpgYGANCg0KYGBge3J9DQpnZ3Bsb3QoYXZlcmFnZV9kZWxheSwgYWVzKHggPSByZW9yZGVyKGRheV9vZl93ZWVrLCBhdmVyYWdlX2RlbGF5KSwgeSA9IGF2ZXJhZ2VfZGVsYXkpKSArDQogIGdlb21fYmFyKHN0YXQgPSAiaWRlbnRpdHkiLCBmaWxsID0gInNreWJsdWUiKSArDQogIGdlb21fdGV4dChhZXMobGFiZWwgPSByb3VuZChhdmVyYWdlX2RlbGF5LCAxKSksIHZqdXN0ID0gLTAuNSkgKw0KICBsYWJzKA0KICAgIHRpdGxlID0gIkF2ZXJhZ2UgRGVwYXJ0dXJlIERlbGF5IGJ5IERheSBvZiB0aGUgV2VlayIsDQogICAgeCA9ICJEYXkgb2YgdGhlIFdlZWsiLA0KICAgIHkgPSAiQXZlcmFnZSBEZXBhcnR1cmUgRGVsYXkgKG1pbnV0ZXMpIg0KICApICsNCiAgdGhlbWVfbWluaW1hbCgpDQpgYGANCiMjIEV4cGxvcmUgRGVsYXkgRGlzdHJpYnV0aW9uIGJ5IE9yaWdpbiBBaXJwb3J0DQoNCmBgYHtyfQ0KIyBDaGVjayBmb3Igbm9uLWZpbml0ZSB2YWx1ZXMgLWZpbml0ZSB2YWx1ZXMNCmZsaWdodHMgJT4lDQogIHN1bW1hcmlzZSgNCiAgICBuYV9jb3VudCA9IHN1bShpcy5uYShkZXBhcnR1cmVfZGVsYXlfbWludXRlcykpLA0KICAgIG5hbl9jb3VudCA9IHN1bShpcy5uYW4oZGVwYXJ0dXJlX2RlbGF5X21pbnV0ZXMpKSwNCiAgICBpbmZfY291bnQgPSBzdW0oaXMuaW5maW5pdGUoZGVwYXJ0dXJlX2RlbGF5X21pbnV0ZXMpKQ0KICApDQoNCiMgQ2hlY2sgcmFuZ2Ugb2YgZGVwYXJ0dXJlX2RlbGF5X21pbnV0ZXMNCnN1bW1hcnkoZmxpZ2h0cyRkZXBhcnR1cmVfZGVsYXlfbWludXRlcykNCg0KIyBDb3VudCByb3dzIG91dHNpZGUgeS1saW1pdA0KZmxpZ2h0cyAlPiUNCiAgc3VtbWFyaXNlKA0KICAgIGJlbG93X2xpbWl0ID0gc3VtKGRlcGFydHVyZV9kZWxheV9taW51dGVzIDwgLTIwLCBuYS5ybSA9IFRSVUUpLA0KICAgIGFib3ZlX2xpbWl0ID0gc3VtKGRlcGFydHVyZV9kZWxheV9taW51dGVzID4gMTAwLCBuYS5ybSA9IFRSVUUpDQogICkNCmBgYA0KYGBge3J9DQpsaWJyYXJ5KHRpZHl2ZXJzZSkNCg0KIyBCb3hwbG90IG9mIGRlcGFydHVyZSBkZWxheXMgYnkgb3JpZ2luIGFpcnBvcnQsIGV4Y2x1ZGluZyBub24tZmluaXRlIHZhbHVlcw0KZ2dwbG90KGZsaWdodHMgJT4lIGZpbHRlcighaXMubmEoZGVwYXJ0dXJlX2RlbGF5X21pbnV0ZXMpICYgaXMuZmluaXRlKGRlcGFydHVyZV9kZWxheV9taW51dGVzKSksIA0KICAgICAgIGFlcyh4ID0gb3JpZ2luLCB5ID0gZGVwYXJ0dXJlX2RlbGF5X21pbnV0ZXMpKSArDQogIGdlb21fYm94cGxvdChmaWxsID0gImxpZ2h0Z3JlZW4iLCBvdXRsaWVyLmNvbG9yID0gInJlZCIpICsNCiAgbGFicygNCiAgICB0aXRsZSA9ICJEaXN0cmlidXRpb24gb2YgRGVwYXJ0dXJlIERlbGF5cyBieSBPcmlnaW4gQWlycG9ydCIsDQogICAgc3VidGl0bGUgPSAiRXhjbHVkZXMgOCwyNTUgZmxpZ2h0cyB3aXRoIG1pc3Npbmcgb3IgaW52YWxpZCBkZWxheSBkYXRhIiwNCiAgICB4ID0gIk9yaWdpbiBBaXJwb3J0IiwNCiAgICB5ID0gIkRlcGFydHVyZSBEZWxheSAobWludXRlcykiDQogICkgKw0KICB0aGVtZV9taW5pbWFsKCkgKw0KICBjb29yZF9jYXJ0ZXNpYW4oeWxpbSA9IGMoLTIwLCAxMDApKSAjIExpbWl0IHktYXhpcyB0byBmb2N1cyBvbiB0eXBpY2FsIGRlbGF5cw0KYGBgDQoNCg0KYGBge3J9DQojIENoZWNrIHVuaXF1ZSBob3VyIHZhbHVlcyBpbiBmbGlnaHRzDQp1bmlxdWUoZmxpZ2h0cyRob3VyKQ0KYGBgDQojIyBJbnZlc3RpZ2F0ZSBIb3VybHkgRGVsYXkgUGF0dGVybnMNCmBgYHtyfQ0KDQojIENsZWFuIHRoZSBob3VyIGNvbHVtbiBpbiBmbGlnaHRzDQpmbGlnaHRzIDwtIGZsaWdodHMgJT4lDQogIG11dGF0ZShob3VyID0gaWZfZWxzZShob3VyID09IDI0LCAwLCBob3VyKSkNCg0KIyBTdW1tYXJpemUgYXZlcmFnZSBkZXBhcnR1cmUgZGVsYXkgYnkgaG91cg0KaG91cmx5X2RlbGF5IDwtIGZsaWdodHMgJT4lDQogIGdyb3VwX2J5KGhvdXIpICU+JQ0KICBzdW1tYXJpc2UoDQogICAgYXZnX2RlcF9kZWxheSA9IG1lYW4oZGVwYXJ0dXJlX2RlbGF5X21pbnV0ZXMsIG5hLnJtID0gVFJVRSksDQogICAgbl9mbGlnaHRzID0gbigpLA0KICAgIC5ncm91cHMgPSAiZHJvcCINCiAgKSAlPiUNCiAgIyBSZW1vdmUgYW55IHJvd3Mgd2l0aCBOQSBvciBpbnZhbGlkIHZhbHVlcw0KICBmaWx0ZXIoIWlzLm5hKGhvdXIpICYgIWlzLm5hKGF2Z19kZXBfZGVsYXkpICYgaXMuZmluaXRlKGF2Z19kZXBfZGVsYXkpKQ0KDQojIExpbmUgcGxvdCBvZiBhdmVyYWdlIGRlbGF5IGJ5IGhvdXINCmdncGxvdChob3VybHlfZGVsYXksIGFlcyh4ID0gaG91ciwgeSA9IGF2Z19kZXBfZGVsYXkpKSArDQogIGdlb21fbGluZShjb2xvciA9ICJibHVlIikgKw0KICBnZW9tX3BvaW50KGNvbG9yID0gImJsdWUiKSArDQogIGxhYnMoDQogICAgdGl0bGUgPSAiQXZlcmFnZSBEZXBhcnR1cmUgRGVsYXkgYnkgU2NoZWR1bGVkIERlcGFydHVyZSBIb3VyIiwNCiAgICB4ID0gIkhvdXIgb2YgRGF5IiwNCiAgICB5ID0gIkF2ZXJhZ2UgRGVwYXJ0dXJlIERlbGF5IChtaW51dGVzKSINCiAgKSArDQogIHRoZW1lX21pbmltYWwoKQ0KYGBgDQoNCiMjIFRvIGNvbXBhcmUgZGVwYXJ0dXJlIGFuZCBhcnJpdmFsIGRlbGF5cw0KYGBge3J9DQojIFBpdm90IGRlcGFydHVyZSBhbmQgYXJyaXZhbCBkZWxheXMgaW50byBhIGxvbmcgZm9ybWF0DQpkZWxheV90eXBlcyA8LSBmbGlnaHRzICU+JQ0KICBzZWxlY3QoZGF5X29mX3dlZWssIGRlcGFydHVyZV9kZWxheV9taW51dGVzLCBhcnJpdmFsX2RlbGF5X21pbnV0ZXMgKSAlPiUNCiAgcGl2b3RfbG9uZ2VyKA0KICAgIGNvbHMgPSBjKGRlcGFydHVyZV9kZWxheV9taW51dGVzLCBhcnJpdmFsX2RlbGF5X21pbnV0ZXMgKSwNCiAgICBuYW1lc190byA9ICJkZWxheV90eXBlIiwNCiAgICB2YWx1ZXNfdG8gPSAiZGVsYXlfbWludXRlcyINCiAgKQ0KDQojIFN1bW1hcml6ZSBhdmVyYWdlIGRlbGF5cyBieSBkYXkgb2YgdGhlIHdlZWsgYW5kIGRlbGF5IHR5cGUNCmRlbGF5X3R5cGVzX3N1bW1hcnkgPC0gZGVsYXlfdHlwZXMgJT4lDQogIGdyb3VwX2J5KGRheV9vZl93ZWVrLCBkZWxheV90eXBlKSAlPiUNCiAgc3VtbWFyaXNlKA0KICAgIGF2Z19kZWxheSA9IG1lYW4oZGVsYXlfbWludXRlcywgbmEucm0gPSBUUlVFKSwNCiAgICAuZ3JvdXBzID0gImRyb3AiDQogICkNCmBgYA0KDQpgYGB7cn0NCmRlbGF5X3R5cGVzIA0KDQpgYGANCg0KYGBge3J9DQojIEdyb3VwZWQgYmFyIHBsb3QgZm9yIGRlcGFydHVyZSB2cy4gYXJyaXZhbCBkZWxheXMNCmdncGxvdChkZWxheV90eXBlc19zdW1tYXJ5LCBhZXMoeCA9IGRheV9vZl93ZWVrLCB5ID0gYXZnX2RlbGF5LCBmaWxsID0gZGVsYXlfdHlwZSkpICsNCiAgZ2VvbV9iYXIoc3RhdCA9ICJpZGVudGl0eSIsIHBvc2l0aW9uID0gImRvZGdlIikgKw0KICBsYWJzKA0KICAgIHRpdGxlID0gIkF2ZXJhZ2UgRGVwYXJ0dXJlIHZzLiBBcnJpdmFsIERlbGF5cyBieSBEYXkgb2YgdGhlIFdlZWsiLA0KICAgIHggPSAiRGF5IG9mIHRoZSBXZWVrIiwNCiAgICB5ID0gIkF2ZXJhZ2UgRGVsYXkgKG1pbnV0ZXMpIiwNCiAgICBmaWxsID0gIkRlbGF5IFR5cGUiDQogICkgKw0KICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBjKCJkZXBhcnR1cmVfZGVsYXlfbWludXRlcyIgPSAib3JhbmdlIiwgImFycml2YWxfZGVsYXlfbWludXRlcyIgPSAicHVycGxlIikpICsNCiAgdGhlbWVfbWluaW1hbCgpDQpgYGANCg0KDQojI0NvbmNsdXNpb24gSW4gdGhpcyBhbmFseXNpcywgd2UgZGVtb25zdHJhdGVkIGhvdyB0aGUgVGlkeXZlcnNlLCBwYXJ0aWN1bGFybHkgdGhlIGx1YnJpZGF0ZSwgZHBseXIsIGFuZCBnZ3Bsb3QyIHBhY2thZ2VzLCBjYW4gYmUgdXNlZCB0byBlZmZpY2llbnRseSBtYW5pcHVsYXRlLCBjbGVhbiwgYW5kIHZpc3VhbGl6ZSBmbGlnaHQgZGVsYXkgZGF0YS4NCkJ5IHRyYW5zZm9ybWluZyByYXcgZGF0ZSBhbmQgdGltZSBpbmZvcm1hdGlvbiBpbnRvIHN0cnVjdHVyZWQgZm9ybWF0cywgd2Ugd2VyZSBhYmxlIHRvIGV4cGxvcmUgcGF0dGVybnMgaW4gYm90aCBkZXBhcnR1cmUgYW5kIGFycml2YWwgZGVsYXlzIGFjcm9zcyBkaWZmZXJlbnQgZGF5cyBvZiB0aGUgd2VlaywgYWlycG9ydHMsIGFuZCBob3VycyBvZiB0aGUgZGF5Lg0KVXNpbmcgdmlzdWFsaXphdGlvbnMgbGlrZSBiYXIgY2hhcnRzLCBib3hwbG90cywgYW5kIGxpbmUgZ3JhcGhzLCB3ZSB1bmNvdmVyZWQgbWVhbmluZ2Z1bCB0cmVuZHMg4oCUIGZvciBleGFtcGxlLCBhdmVyYWdlIGRlbGF5cyBmbHVjdHVhdGluZyBieSB3ZWVrZGF5IGFuZCBkZXBhcnR1cmUgaG91ci4NCg0KVGhpcyB3b3JrZmxvdyBoaWdobGlnaHRzIHRoZSBwb3dlciBvZiB0aWR5IGRhdGEgcHJpbmNpcGxlczogd2l0aCBhIGNvbnNpc3RlbnQgYW5kIG9yZ2FuaXplZCBkYXRhc2V0LCB3ZSBjYW4gZ2FpbiB2YWx1YWJsZSBpbnNpZ2h0cyBxdWlja2x5IGFuZCBjbGVhcmx5Lg0KVGhlIHRvb2xzIGFuZCB0ZWNobmlxdWVzIHVzZWQgaGVyZSBjYW4gYmUgZWFzaWx5IGV4dGVuZGVkIHRvIG90aGVyIHJlYWwtd29ybGQgZGF0YXNldHMgaW52b2x2aW5nIGRhdGVzLCB0aW1lcywgYW5kIGRlbGF5IGFuYWx5c2lzLg0KDQo=