1. Data Processing
1.1 Downloading and reading
The data is retrieved from the U.S. National Oceanic and Atmospheric Administration’s (NOAA) storm database and is read into R with the read.csv
function. The coming analyses take into account the complete dataset.
# data loading into R from the raw CSV file
# Download file
if (!file.exists( "./data" )) {
dir.create( "./data" )
}
Warning messages:
1: Unknown or uninitialised column: 'PROPDMGEXPfactor'.
2: Unknown or uninitialised column: 'PROPDMGEXPfactor'.
3: Unknown or uninitialised column: 'PROPDMGEXPfactor'.
4: Unknown or uninitialised column: 'CROPDMGEXPfactor'.
5: Unknown or uninitialised column: 'CROPDMGEXPfactor'.
6: Unknown or uninitialised column: 'CROPDMGEXPfactor'.
file = "./data/repdata_data_StormData.csv.bz2"
fileUrl1 = "https://d396qusza40orc.cloudfront.net/repdata%2Fdata%2FStormData.csv.bz2"
if ( !file.exists( file ) ) {
download.file( fileUrl1 , destfile = file)
}
# Read file
if ( !exists ( 'StormData.csv' ) ) {
StormData.csv = read.csv( file )
}
1.2 Fatalities summary
For the number of fatalities analysis, two columns were extracted of the original data:
EVTYPE |
Has the type of weather event |
FATALITIES |
Has the number of fatalities of each record |
The number of fatalities is calculated across each type of weather event and the ten with more fatalities are presented.
library( dplyr )
fatalities =
StormData.csv %>%
filter( FATALITIES > 0 ) %>%
select( EVTYPE, FATALITIES ) %>%
group_by( EVTYPE ) %>%
summarise( TotalFatalities = sum(FATALITIES) ) %>%
top_n( 10, TotalFatalities ) %>%
mutate( EVTYPE = as.character( EVTYPE ) ) %>%
arrange( desc(TotalFatalities) ) %>%
mutate( EVTYPE = factor( EVTYPE, levels = EVTYPE ) )
1.3 Injuries summary
For the number of injuries analysis, two columns were extracted of the original data:
EVTYPE |
Has the type of weather event |
INJURIES |
Has the number of injuries of each record |
The number of injuries is calculated across each type of weather event and the ten with more injuries are presented.
injuries =
StormData.csv %>%
filter( INJURIES > 0 ) %>%
select( EVTYPE, INJURIES ) %>%
group_by( EVTYPE ) %>%
summarise( TotalInjuries = sum(INJURIES) ) %>%
ungroup() %>%
top_n( 10, TotalInjuries ) %>%
mutate( EVTYPE = as.character( EVTYPE ) ) %>%
arrange( desc(TotalInjuries) ) %>%
mutate( EVTYPE = factor( EVTYPE, levels = EVTYPE ) )
1.4 Economical damage summary
According to the chapter 2.7 of the National Weather Service Storm Data Documentation, there is four columns relevant to the quantification of economic losses:
PROPDMG |
Property damage |
PROPDMGEXP |
Property damage factor: K= thousands, M= millions, B= billions |
CROPDMG |
Crop damage |
CROPDMGEXP |
Crop damage factor: K= thousands, M= millions, B= billions |
For this analysis the economic damage, in USD, is calculated this way:
\[DamageCost ~ = ~ PROPDMG ~ * ~ PROPDMGEXP ~ + ~ CROPDMG ~ * ~ CROPDMGEXP\]
The economical damage, in USD Billions is calculated across each type of weather event and the ten more expensive are presented.
expenses =
StormData.csv %>%
filter( (PROPDMG + CROPDMG) > 0 ) %>%
select( EVTYPE, starts_with( 'PROP'), starts_with( 'CROP' ) )
expenses$PROPDMGEXPfactor = 1
expenses$PROPDMGEXPfactor[ expenses$PROPDMGEXP %in%
c( 'K', 'k' ) ] = 1000
expenses$PROPDMGEXPfactor[ expenses$PROPDMGEXP %in%
c( 'm', 'M' ) ] = 1000000
expenses$PROPDMGEXPfactor[ expenses$PROPDMGEXP %in%
c( 'B', 'b' ) ] = 1000000000
expenses$CROPDMGEXPfactor = 1
expenses$CROPDMGEXPfactor[ expenses$CROPDMGEXP %in%
c( 'K', 'k' ) ] = 1000
expenses$CROPDMGEXPfactor[ expenses$CROPDMGEXP %in%
c( 'm', 'M' ) ] = 1000000
expenses$CROPDMGEXPfactor[ expenses$CROPDMGEXP %in%
c( 'B', 'b' ) ] = 1000000000
expenses =
expenses %>%
mutate( losses = PROPDMG * PROPDMGEXPfactor +
CROPDMG * CROPDMGEXPfactor ) %>%
group_by( EVTYPE ) %>%
summarise( EconomicLosses = sum(losses) ) %>%
ungroup() %>%
top_n( 10, EconomicLosses ) %>%
mutate( EVTYPE = as.character( EVTYPE ),
EconomicLosses = EconomicLosses / 1000000000 ) %>%
arrange( desc(EconomicLosses) ) %>%
mutate( EVTYPE = factor( EVTYPE, levels = EVTYPE ) )
2. Results
2.1 - Weather events that causes more fatalities
In the next plot, it is shown the ten weather events that have caused more fatalities across the USA.
library( ggplot2 )
# barplot( fatalities$TotalFatalities,
# legend.text = fatalities$EVTYPE )
ggplot( fatalities, aes( EVTYPE, TotalFatalities) ) +
geom_col( ) +
theme(axis.text.x = element_text(angle = 30, hjust = 1)) +
labs( title = "2.1 - Weather events with more fatalities in USA" ,
x = '' )

2.2 - Weather events that causes more injuries
In the next plot, it is shown the ten weather events that have caused more injuries across the USA.
# barplot( injuries$TotalInjuries,
# legend.text = injuries$EVTYPE )
ggplot( injuries, aes( EVTYPE, TotalInjuries) ) +
geom_col( ) +
theme(axis.text.x = element_text(angle = 30, hjust = 1)) +
labs( title = "2.2 - Weather events with more injuries in USA" ,
x = '' )

2.3 - Weather events that causes more economical expenses
In the next plot, it is shown the ten weather events that have caused the greatest economic losses across the USA.
# barplot( expenses$EconomicLosses,
# legend.text = expenses$EVTYPE )
ggplot( expenses, aes( EVTYPE, EconomicLosses) ) +
geom_col( ) +
theme(axis.text.x = element_text(angle = 30, hjust = 1)) +
labs( title = "2.3 - Weather events more expensive in USA" ,
x = '', y = 'Economic damage (USD Billions)' )

LS0tDQp0aXRsZTogIldvcnN0IGhlYWx0aCBhbmQgZWNvbm9taWMgaGFybWZ1bCB3ZWF0aGVyIGV2ZW50cyBpbiB0aGUgVVNBIg0Kb3V0cHV0Og0KICBwZGZfZG9jdW1lbnQ6IGRlZmF1bHQNCiAgaHRtbF9ub3RlYm9vazoNCiAgICBmaWdfaGVpZ2h0OiA3DQogICAgZmlnX3dpZHRoOiA5DQotLS0NCg0KLS0tDQoNCiMgV29yc3QgaGVhbHRoIGFuZCBlY29ub21pYyBoYXJtZnVsIHdlYXRoZXIgZXZlbnRzIGluIHRoZSBVU0ENCg0KKioqU3lub3BzaXMqKio6IA0KKlRoaXMgYnJpZWYgYW5hbHlzaXMgZXhwbG9yZXMgdGhlIGRhdGEgZnJvbSB0aGUgVS5TLiBOYXRpb25hbCBPY2VhbmljIGFuZCBBdG1vc3BoZXJpYyBBZG1pbmlzdHJhdGlvbidzIChOT0FBKSBzdG9ybSBbZGF0YWJhc2VdKGh0dHBzOi8vZDM5NnF1c3phNDBvcmMuY2xvdWRmcm9udC5uZXQvcmVwZGF0YSUyRmRhdGElMkZTdG9ybURhdGEuY3N2LmJ6MiksIGFuZCB0cmllcyB0byBhbnN3ZXIgdGhyZWUgc2ltcGxlIHF1ZXN0aW9uczoqDQoNCi0gKldoaWNoIHR5cGVzIG9mIHdlYXRoZXIgZXZlbnRzIGNhdXNlIG1vcmUgZmF0YWxpdGllcyB0byB0aGUgVVNBIHBvcHVsYXRpb24/Kg0KLSAqV2hpY2ggdHlwZXMgb2Ygd2VhdGhlciBldmVudHMgY2F1c2VzIG1vcmUgaW5qdXJpZXMgdG8gdGhlIFVTQSBwb3B1bGF0aW9uPyoNCi0gKldoaWNoIHR5cGVzIG9mIHdlYXRoZXIgZXZlbnRzIGFyZSB0aGUgbW9zdCBleHBlbnNpdmUgdG8gVVNBPyoNCg0KLS0tDQoNCiMgMS4gRGF0YSBQcm9jZXNzaW5nDQoNCiMjIDEuMSBEb3dubG9hZGluZyBhbmQgcmVhZGluZw0KDQpUaGUgZGF0YSBpcyByZXRyaWV2ZWQgZnJvbSB0aGUgVS5TLiBOYXRpb25hbCBPY2VhbmljIGFuZCBBdG1vc3BoZXJpYyBBZG1pbmlzdHJhdGlvbidzIChOT0FBKSBzdG9ybSBbZGF0YWJhc2VdKGh0dHBzOi8vZDM5NnF1c3phNDBvcmMuY2xvdWRmcm9udC5uZXQvcmVwZGF0YSUyRmRhdGElMkZTdG9ybURhdGEuY3N2LmJ6MikgYW5kIGlzIHJlYWQgaW50byBSIHdpdGggdGhlICoqYHJlYWQuY3N2YCoqIGZ1bmN0aW9uLiBUaGUgY29taW5nIGFuYWx5c2VzIHRha2UgaW50byBhY2NvdW50IHRoZSBjb21wbGV0ZSBkYXRhc2V0Lg0KDQoNCmBgYHtyIERhdGFQcm9jZXNzaW5nLCBjYWNoZT1UUlVFfQ0KDQojIGRhdGEgbG9hZGluZyBpbnRvIFIgZnJvbSB0aGUgcmF3IENTViBmaWxlDQoNCiMgRG93bmxvYWQgZmlsZQ0KDQppZiAoIWZpbGUuZXhpc3RzKCAiLi9kYXRhIiApKSB7IA0KICAgIGRpci5jcmVhdGUoICIuL2RhdGEiICkgDQp9DQoNCmZpbGUgPSAiLi9kYXRhL3JlcGRhdGFfZGF0YV9TdG9ybURhdGEuY3N2LmJ6MiINCmZpbGVVcmwxID0gImh0dHBzOi8vZDM5NnF1c3phNDBvcmMuY2xvdWRmcm9udC5uZXQvcmVwZGF0YSUyRmRhdGElMkZTdG9ybURhdGEuY3N2LmJ6MiINCg0KaWYgKCAhZmlsZS5leGlzdHMoIGZpbGUgKSApIHsNCiAgICBkb3dubG9hZC5maWxlKCBmaWxlVXJsMSAsIGRlc3RmaWxlID0gZmlsZSkNCn0gICANCg0KIyBSZWFkIGZpbGUNCmlmICggIWV4aXN0cyAoICdTdG9ybURhdGEuY3N2JyApICkgew0KICAgIFN0b3JtRGF0YS5jc3YgPSByZWFkLmNzdiggZmlsZSAgKQ0KfSAgIA0KDQoNCmBgYA0KDQojIyAxLjIgRmF0YWxpdGllcyBzdW1tYXJ5DQoNCkZvciB0aGUgbnVtYmVyIG9mIGZhdGFsaXRpZXMgYW5hbHlzaXMsIHR3byBjb2x1bW5zIHdlcmUgZXh0cmFjdGVkIG9mIHRoZSBvcmlnaW5hbCBkYXRhOg0KDQpDb2x1bW4gfCBEZXNjcmlwdGlvbg0KLS0tfC0tLQ0KRVZUWVBFIHwgSGFzIHRoZSB0eXBlIG9mIHdlYXRoZXIgZXZlbnQNCkZBVEFMSVRJRVMgfCBIYXMgdGhlIG51bWJlciBvZiBmYXRhbGl0aWVzIG9mIGVhY2ggcmVjb3JkDQoNCg0KVGhlIG51bWJlciBvZiBmYXRhbGl0aWVzIGlzIGNhbGN1bGF0ZWQgYWNyb3NzIGVhY2ggdHlwZSBvZiB3ZWF0aGVyIGV2ZW50IGFuZCB0aGUgdGVuIHdpdGggbW9yZSBmYXRhbGl0aWVzIGFyZSBwcmVzZW50ZWQuIA0KDQoNCmBgYHtyIGZhdGFsaXRpZXN9DQoNCmxpYnJhcnkoIGRwbHlyICkNCmZhdGFsaXRpZXMgPSANCiAgICBTdG9ybURhdGEuY3N2ICU+JQ0KICAgIGZpbHRlciggRkFUQUxJVElFUyA+IDAgKSAlPiUNCiAgICBzZWxlY3QoIEVWVFlQRSwgRkFUQUxJVElFUyApICU+JQ0KICAgIGdyb3VwX2J5KCBFVlRZUEUgKSAlPiUNCiAgICBzdW1tYXJpc2UoIFRvdGFsRmF0YWxpdGllcyA9IHN1bShGQVRBTElUSUVTKSApICU+JQ0KICAgIHRvcF9uKCAxMCwgVG90YWxGYXRhbGl0aWVzICkgICU+JQ0KICAgIG11dGF0ZSggRVZUWVBFID0gYXMuY2hhcmFjdGVyKCBFVlRZUEUgKSApICU+JQ0KICAgIGFycmFuZ2UoIGRlc2MoVG90YWxGYXRhbGl0aWVzKSApICU+JQ0KICAgIG11dGF0ZSggRVZUWVBFID0gZmFjdG9yKCBFVlRZUEUsIGxldmVscyA9IEVWVFlQRSApICkgIA0KICAgIA0KDQpgYGANCg0KDQojIyAxLjMgSW5qdXJpZXMgc3VtbWFyeQ0KDQpGb3IgdGhlIG51bWJlciBvZiBpbmp1cmllcyBhbmFseXNpcywgdHdvIGNvbHVtbnMgd2VyZSBleHRyYWN0ZWQgb2YgdGhlIG9yaWdpbmFsIGRhdGE6DQoNCkNvbHVtbiB8IERlc2NyaXB0aW9uDQotLS18LS0tDQpFVlRZUEUgfCBIYXMgdGhlIHR5cGUgb2Ygd2VhdGhlciBldmVudA0KSU5KVVJJRVMgfCBIYXMgdGhlIG51bWJlciBvZiBpbmp1cmllcyBvZiBlYWNoIHJlY29yZA0KDQoNClRoZSBudW1iZXIgb2YgaW5qdXJpZXMgaXMgY2FsY3VsYXRlZCBhY3Jvc3MgZWFjaCB0eXBlIG9mIHdlYXRoZXIgZXZlbnQgYW5kIHRoZSB0ZW4gd2l0aCBtb3JlIGluanVyaWVzIGFyZSBwcmVzZW50ZWQuDQoNCg0KYGBge3IgaW5qdXJpZXN9DQoNCg0KaW5qdXJpZXMgPSANCiAgICBTdG9ybURhdGEuY3N2ICU+JQ0KICAgIGZpbHRlciggSU5KVVJJRVMgPiAwICkgJT4lDQogICAgc2VsZWN0KCBFVlRZUEUsIElOSlVSSUVTICkgJT4lDQogICAgZ3JvdXBfYnkoIEVWVFlQRSApICU+JQ0KICAgIHN1bW1hcmlzZSggVG90YWxJbmp1cmllcyA9IHN1bShJTkpVUklFUykgKSAlPiUNCiAgICB1bmdyb3VwKCkgJT4lDQogICAgdG9wX24oIDEwLCBUb3RhbEluanVyaWVzICkgICU+JQ0KICAgIG11dGF0ZSggRVZUWVBFID0gYXMuY2hhcmFjdGVyKCBFVlRZUEUgKSApICU+JQ0KICAgIGFycmFuZ2UoIGRlc2MoVG90YWxJbmp1cmllcykgKSAlPiUNCiAgICBtdXRhdGUoIEVWVFlQRSA9IGZhY3RvciggRVZUWVBFLCBsZXZlbHMgPSBFVlRZUEUgKSApICANCg0KYGBgDQoNCg0KIyMgMS40IEVjb25vbWljYWwgZGFtYWdlIHN1bW1hcnkNCg0KQWNjb3JkaW5nIHRvIHRoZSBjaGFwdGVyIDIuNyBvZiB0aGUgTmF0aW9uYWwgV2VhdGhlciBTZXJ2aWNlIFtTdG9ybSBEYXRhIERvY3VtZW50YXRpb25dKGh0dHBzOi8vZDM5NnF1c3phNDBvcmMuY2xvdWRmcm9udC5uZXQvcmVwZGF0YSUyRnBlZXIyX2RvYyUyRnBkMDEwMTYwMDVjdXJyLnBkZiksIHRoZXJlIGlzIGZvdXIgY29sdW1ucyByZWxldmFudCB0byB0aGUgcXVhbnRpZmljYXRpb24gb2YgZWNvbm9taWMgbG9zc2VzOg0KDQpDb2x1bW4gfCBEZXNjcmlwdGlvbg0KLS0tfC0tLQ0KUFJPUERNRyB8IFByb3BlcnR5IGRhbWFnZQ0KUFJPUERNR0VYUCB8IFByb3BlcnR5IGRhbWFnZSBmYWN0b3I6IEs9IHRob3VzYW5kcywgTT0gbWlsbGlvbnMsIEI9IGJpbGxpb25zDQpDUk9QRE1HIHwgQ3JvcCBkYW1hZ2UNCkNST1BETUdFWFAgfCBDcm9wIGRhbWFnZSBmYWN0b3I6IEs9IHRob3VzYW5kcywgTT0gbWlsbGlvbnMsIEI9IGJpbGxpb25zDQoNCkZvciB0aGlzIGFuYWx5c2lzIHRoZSBlY29ub21pYyBkYW1hZ2UsIGluIFVTRCwgaXMgY2FsY3VsYXRlZCB0aGlzIHdheToNCg0KJCREYW1hZ2VDb3N0IH4gPSB+IFBST1BETUcgfiAqIH4gUFJPUERNR0VYUCB+ICsgfiBDUk9QRE1HIH4gKiB+IENST1BETUdFWFAkJA0KDQpUaGUgZWNvbm9taWNhbCBkYW1hZ2UsIGluIFVTRCBCaWxsaW9ucyBpcyBjYWxjdWxhdGVkIGFjcm9zcyBlYWNoIHR5cGUgb2Ygd2VhdGhlciBldmVudCBhbmQgdGhlIHRlbiBtb3JlIGV4cGVuc2l2ZSBhcmUgcHJlc2VudGVkLiANCg0KDQpgYGB7ciBlY29ub21pY19sb3NzZXN9DQoNCg0KZXhwZW5zZXMgPSANCiAgICBTdG9ybURhdGEuY3N2ICU+JQ0KICAgIGZpbHRlciggKFBST1BETUcgKyBDUk9QRE1HKSA+IDAgKSAlPiUNCiAgICBzZWxlY3QoIEVWVFlQRSwgc3RhcnRzX3dpdGgoICdQUk9QJyksIHN0YXJ0c193aXRoKCAnQ1JPUCcgKSApDQoNCmV4cGVuc2VzJFBST1BETUdFWFBmYWN0b3IgPSAxDQpleHBlbnNlcyRQUk9QRE1HRVhQZmFjdG9yWyBleHBlbnNlcyRQUk9QRE1HRVhQICVpbiUgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjKCAnSycsICdrJyApIF0gPSAxMDAwDQpleHBlbnNlcyRQUk9QRE1HRVhQZmFjdG9yWyBleHBlbnNlcyRQUk9QRE1HRVhQICVpbiUgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjKCAnbScsICdNJyApIF0gPSAxMDAwMDAwDQpleHBlbnNlcyRQUk9QRE1HRVhQZmFjdG9yWyBleHBlbnNlcyRQUk9QRE1HRVhQICVpbiUgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjKCAnQicsICdiJyApIF0gPSAxMDAwMDAwMDAwDQoNCmV4cGVuc2VzJENST1BETUdFWFBmYWN0b3IgPSAxDQpleHBlbnNlcyRDUk9QRE1HRVhQZmFjdG9yWyBleHBlbnNlcyRDUk9QRE1HRVhQICVpbiUgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjKCAnSycsICdrJyApIF0gPSAxMDAwDQpleHBlbnNlcyRDUk9QRE1HRVhQZmFjdG9yWyBleHBlbnNlcyRDUk9QRE1HRVhQICVpbiUgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjKCAnbScsICdNJyApIF0gPSAxMDAwMDAwDQpleHBlbnNlcyRDUk9QRE1HRVhQZmFjdG9yWyBleHBlbnNlcyRDUk9QRE1HRVhQICVpbiUgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjKCAnQicsICdiJyApIF0gPSAxMDAwMDAwMDAwDQoNCmV4cGVuc2VzID0NCiAgICBleHBlbnNlcyAgJT4lDQogICAgbXV0YXRlKCBsb3NzZXMgPSBQUk9QRE1HICogUFJPUERNR0VYUGZhY3RvciArDQogICAgICAgICAgICAgICAgQ1JPUERNRyAqIENST1BETUdFWFBmYWN0b3IgKSAlPiUNCiAgICBncm91cF9ieSggRVZUWVBFICkgJT4lDQogICAgc3VtbWFyaXNlKCBFY29ub21pY0xvc3NlcyA9IHN1bShsb3NzZXMpICkgJT4lDQogICAgdW5ncm91cCgpICU+JQ0KICAgIHRvcF9uKCAxMCwgRWNvbm9taWNMb3NzZXMgKSAgJT4lDQogICAgbXV0YXRlKCBFVlRZUEUgPSBhcy5jaGFyYWN0ZXIoIEVWVFlQRSApLCANCiAgICAgICAgICAgIEVjb25vbWljTG9zc2VzID0gRWNvbm9taWNMb3NzZXMgLyAxMDAwMDAwMDAwICkgJT4lDQogICAgYXJyYW5nZSggZGVzYyhFY29ub21pY0xvc3NlcykgKSAlPiUNCiAgICBtdXRhdGUoIEVWVFlQRSA9IGZhY3RvciggRVZUWVBFLCBsZXZlbHMgPSBFVlRZUEUgKSApDQoNCg0KYGBgDQoNCg0KLS0tDQoNCiMgMi4gUmVzdWx0cw0KDQojIyAyLjEgLSBXZWF0aGVyIGV2ZW50cyB0aGF0IGNhdXNlcyBtb3JlIGZhdGFsaXRpZXMNCg0KSW4gdGhlIG5leHQgcGxvdCwgaXQgaXMgc2hvd24gdGhlIHRlbiB3ZWF0aGVyIGV2ZW50cyB0aGF0IGhhdmUgY2F1c2VkIG1vcmUgZmF0YWxpdGllcyBhY3Jvc3MgdGhlIFVTQS4NCg0KDQpgYGB7ciBwbG90MX0NCg0KbGlicmFyeSggZ2dwbG90MiApDQoNCiMgYmFycGxvdCggZmF0YWxpdGllcyRUb3RhbEZhdGFsaXRpZXMsIA0KIyAgICAgICAgICBsZWdlbmQudGV4dCA9IGZhdGFsaXRpZXMkRVZUWVBFICkNCg0KZ2dwbG90KCBmYXRhbGl0aWVzLCBhZXMoIEVWVFlQRSwgVG90YWxGYXRhbGl0aWVzKSApICsNCiAgICBnZW9tX2NvbCggKSArIA0KICAgIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gMzAsIGhqdXN0ID0gMSkpICsNCiAgICBsYWJzKCB0aXRsZSA9ICIyLjEgLSBXZWF0aGVyIGV2ZW50cyB3aXRoIG1vcmUgZmF0YWxpdGllcyBpbiBVU0EiICwgDQogICAgICAgICAgeCA9ICcnICkNCg0KDQpgYGANCg0KDQotLS0NCg0KIyMgMi4yIC0gV2VhdGhlciBldmVudHMgdGhhdCBjYXVzZXMgbW9yZSBpbmp1cmllcw0KDQpJbiB0aGUgbmV4dCBwbG90LCBpdCBpcyBzaG93biB0aGUgdGVuIHdlYXRoZXIgZXZlbnRzIHRoYXQgaGF2ZSBjYXVzZWQgbW9yZSBpbmp1cmllcyBhY3Jvc3MgdGhlIFVTQS4NCg0KDQpgYGB7ciBwbG90Mn0NCg0KDQojIGJhcnBsb3QoIGluanVyaWVzJFRvdGFsSW5qdXJpZXMsIA0KIyAgICAgICAgICBsZWdlbmQudGV4dCA9IGluanVyaWVzJEVWVFlQRSApDQoNCmdncGxvdCggaW5qdXJpZXMsIGFlcyggRVZUWVBFLCBUb3RhbEluanVyaWVzKSApICsNCiAgICBnZW9tX2NvbCggKSArIA0KICAgIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gMzAsIGhqdXN0ID0gMSkpICsNCiAgICBsYWJzKCB0aXRsZSA9ICIyLjIgLSBXZWF0aGVyIGV2ZW50cyB3aXRoIG1vcmUgaW5qdXJpZXMgaW4gVVNBIiAsIA0KICAgICAgICAgIHggPSAnJyApDQoNCg0KYGBgDQoNCg0KLS0tDQoNCiMjIDIuMyAtIFdlYXRoZXIgZXZlbnRzIHRoYXQgY2F1c2VzIG1vcmUgZWNvbm9taWNhbCBleHBlbnNlcw0KDQoNCg0KSW4gdGhlIG5leHQgcGxvdCwgaXQgaXMgc2hvd24gdGhlIHRlbiB3ZWF0aGVyIGV2ZW50cyB0aGF0IGhhdmUgY2F1c2VkIHRoZSBncmVhdGVzdCBlY29ub21pYyBsb3NzZXMgYWNyb3NzIHRoZSBVU0EuDQoNCg0KYGBge3IgcGxvdDN9DQoNCiMgYmFycGxvdCggZXhwZW5zZXMkRWNvbm9taWNMb3NzZXMsIA0KIyAgICAgICAgICBsZWdlbmQudGV4dCA9IGV4cGVuc2VzJEVWVFlQRSApDQoNCmdncGxvdCggZXhwZW5zZXMsIGFlcyggRVZUWVBFLCBFY29ub21pY0xvc3NlcykgKSArDQogICAgZ2VvbV9jb2woICkgKyANCiAgICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDMwLCBoanVzdCA9IDEpKSArDQogICAgbGFicyggdGl0bGUgPSAiMi4zIC0gV2VhdGhlciBldmVudHMgbW9yZSBleHBlbnNpdmUgaW4gVVNBIiAsIA0KICAgICAgICAgIHggPSAnJywgeSA9ICdFY29ub21pYyBkYW1hZ2UgKFVTRCBCaWxsaW9ucyknICkNCg0KDQpgYGANCg0KDQotLS0NCg0K