Introduction

Overview

Storms and other weather events can cause both public health and economic problems for communities and municipalities. Many severe events can result in fatalities, injuries, and property damage, and preventing such outcomes to the extent possible is a key concern.

NOAA Storm Data

In this report, the major weather events from around the US are investigated. The events in the database start in the year 1950 and end in November 2011. In the earlier years of the database there are generally fewer events recorded, most likely due to a lack of good records. More recent years should be considered more complete.

Information about the Storm Data can be found from the following links:

National Weather Service Storm Data Documentation, and

National Climatic Data Center Storm Events FAQ

Key Concerns

The first part of the study focuses on the number of human fatalities and the number of human injuries that were consequences of weather events. The second part of the analysis investigates the economic impact that weather events have on property and crops.

Data Processing

Obtaining the data

Storm data is contained in a bz2 file in cloudfront, after downloading the bz2 file, the contents are stored in a data frame called “raw_data”.

if( nrow(subset(as.data.frame(installed.packages() ), Package == 'dplyr')) ){
    #do nothing
 } else{
     install.packages('dplyr')
}
NULL
if( nrow(subset(as.data.frame(installed.packages() ), Package == 'ggplot2')) ){
    #do nothing
 } else{
     install.packages('ggplot2')
}
NULL
if( nrow(subset(as.data.frame(installed.packages() ), Package == 'gganimate')) ){
    #do nothing
 } else{
     devtools::install_github('thomasp85/gganimate')
}
NULL
library('dplyr')

Attaching package: 㤼㸱dplyr㤼㸲

The following objects are masked from 㤼㸱package:stats㤼㸲:

    filter, lag

The following objects are masked from 㤼㸱package:base㤼㸲:

    intersect, setdiff, setequal, union
library('ggplot2')
Need help? Try Stackoverflow: https://stackoverflow.com/tags/ggplot2.
library('gganimate')

if(!file.exists('repdata_data_StormData.csv.bz2')){
    download.file(url='https://d396qusza40orc.cloudfront.net/repdata%2Fdata%2FStormData.csv.bz2', 
                destfile = 'repdata_data_StormData.csv.bz2')
}

raw_data<- read.table(file='repdata_data_StormData.csv.bz2', sep=',', header=TRUE, stringsAsFactors = FALSE, na.strings = 'NA')
str(raw_data)
'data.frame':   902297 obs. of  37 variables:
 $ STATE__   : num  1 1 1 1 1 1 1 1 1 1 ...
 $ BGN_DATE  : chr  "4/18/1950 0:00:00" "4/18/1950 0:00:00" "2/20/1951 0:00:00" "6/8/1951 0:00:00" ...
 $ BGN_TIME  : chr  "0130" "0145" "1600" "0900" ...
 $ TIME_ZONE : chr  "CST" "CST" "CST" "CST" ...
 $ COUNTY    : num  97 3 57 89 43 77 9 123 125 57 ...
 $ COUNTYNAME: chr  "MOBILE" "BALDWIN" "FAYETTE" "MADISON" ...
 $ STATE     : chr  "AL" "AL" "AL" "AL" ...
 $ EVTYPE    : chr  "TORNADO" "TORNADO" "TORNADO" "TORNADO" ...
 $ BGN_RANGE : num  0 0 0 0 0 0 0 0 0 0 ...
 $ BGN_AZI   : chr  "" "" "" "" ...
 $ BGN_LOCATI: chr  "" "" "" "" ...
 $ END_DATE  : chr  "" "" "" "" ...
 $ END_TIME  : chr  "" "" "" "" ...
 $ COUNTY_END: num  0 0 0 0 0 0 0 0 0 0 ...
 $ COUNTYENDN: logi  NA NA NA NA NA NA ...
 $ END_RANGE : num  0 0 0 0 0 0 0 0 0 0 ...
 $ END_AZI   : chr  "" "" "" "" ...
 $ END_LOCATI: chr  "" "" "" "" ...
 $ LENGTH    : num  14 2 0.1 0 0 1.5 1.5 0 3.3 2.3 ...
 $ WIDTH     : num  100 150 123 100 150 177 33 33 100 100 ...
 $ F         : int  3 2 2 2 2 2 2 1 3 3 ...
 $ MAG       : num  0 0 0 0 0 0 0 0 0 0 ...
 $ FATALITIES: num  0 0 0 0 0 0 0 0 1 0 ...
 $ INJURIES  : num  15 0 2 2 2 6 1 0 14 0 ...
 $ PROPDMG   : num  25 2.5 25 2.5 2.5 2.5 2.5 2.5 25 25 ...
 $ PROPDMGEXP: chr  "K" "K" "K" "K" ...
 $ CROPDMG   : num  0 0 0 0 0 0 0 0 0 0 ...
 $ CROPDMGEXP: chr  "" "" "" "" ...
 $ WFO       : chr  "" "" "" "" ...
 $ STATEOFFIC: chr  "" "" "" "" ...
 $ ZONENAMES : chr  "" "" "" "" ...
 $ LATITUDE  : num  3040 3042 3340 3458 3412 ...
 $ LONGITUDE : num  8812 8755 8742 8626 8642 ...
 $ LATITUDE_E: num  3051 0 0 0 0 ...
 $ LONGITUDE_: num  8806 0 0 0 0 ...
 $ REMARKS   : chr  "" "" "" "" ...
 $ REFNUM    : num  1 2 3 4 5 6 7 8 9 10 ...

Exploring the data

dim(raw_data)
[1] 902297     37

The dataset have 902297 rows and 37 columns. Let’s see the structure:

str(raw_data)
'data.frame':   902297 obs. of  37 variables:
 $ STATE__   : num  1 1 1 1 1 1 1 1 1 1 ...
 $ BGN_DATE  : chr  "4/18/1950 0:00:00" "4/18/1950 0:00:00" "2/20/1951 0:00:00" "6/8/1951 0:00:00" ...
 $ BGN_TIME  : chr  "0130" "0145" "1600" "0900" ...
 $ TIME_ZONE : chr  "CST" "CST" "CST" "CST" ...
 $ COUNTY    : num  97 3 57 89 43 77 9 123 125 57 ...
 $ COUNTYNAME: chr  "MOBILE" "BALDWIN" "FAYETTE" "MADISON" ...
 $ STATE     : chr  "AL" "AL" "AL" "AL" ...
 $ EVTYPE    : chr  "TORNADO" "TORNADO" "TORNADO" "TORNADO" ...
 $ BGN_RANGE : num  0 0 0 0 0 0 0 0 0 0 ...
 $ BGN_AZI   : chr  "" "" "" "" ...
 $ BGN_LOCATI: chr  "" "" "" "" ...
 $ END_DATE  : chr  "" "" "" "" ...
 $ END_TIME  : chr  "" "" "" "" ...
 $ COUNTY_END: num  0 0 0 0 0 0 0 0 0 0 ...
 $ COUNTYENDN: logi  NA NA NA NA NA NA ...
 $ END_RANGE : num  0 0 0 0 0 0 0 0 0 0 ...
 $ END_AZI   : chr  "" "" "" "" ...
 $ END_LOCATI: chr  "" "" "" "" ...
 $ LENGTH    : num  14 2 0.1 0 0 1.5 1.5 0 3.3 2.3 ...
 $ WIDTH     : num  100 150 123 100 150 177 33 33 100 100 ...
 $ F         : int  3 2 2 2 2 2 2 1 3 3 ...
 $ MAG       : num  0 0 0 0 0 0 0 0 0 0 ...
 $ FATALITIES: num  0 0 0 0 0 0 0 0 1 0 ...
 $ INJURIES  : num  15 0 2 2 2 6 1 0 14 0 ...
 $ PROPDMG   : num  25 2.5 25 2.5 2.5 2.5 2.5 2.5 25 25 ...
 $ PROPDMGEXP: chr  "K" "K" "K" "K" ...
 $ CROPDMG   : num  0 0 0 0 0 0 0 0 0 0 ...
 $ CROPDMGEXP: chr  "" "" "" "" ...
 $ WFO       : chr  "" "" "" "" ...
 $ STATEOFFIC: chr  "" "" "" "" ...
 $ ZONENAMES : chr  "" "" "" "" ...
 $ LATITUDE  : num  3040 3042 3340 3458 3412 ...
 $ LONGITUDE : num  8812 8755 8742 8626 8642 ...
 $ LATITUDE_E: num  3051 0 0 0 0 ...
 $ LONGITUDE_: num  8806 0 0 0 0 ...
 $ REMARKS   : chr  "" "" "" "" ...
 $ REFNUM    : num  1 2 3 4 5 6 7 8 9 10 ...

Our data of interest are:

  • BGN_DATE: The date of the event
  • EVTYPE: The event type
  • FATALITIES: The number of deads
  • INJURIES: The number of injuries people
  • PROPDMG: Property damage
  • PROPDMGEXP: Alphabetical characters used to signify magnitude for property damage. Include “K” for thousands, “M” for millions, and “B” for billions.
  • CROPDMG: Crop damage
  • CROPDMGEXP: Alphabetical characters used to signify magnitude for crop damage

Let’s explore EVTYPE, PROPDMGEXP and CROPDMGEXP

columns<- c('BGN_DATE','EVTYPE','FATALITIES','INJURIES','PROPDMG','PROPDMGEXP','CROPDMG','CROPDMGEXP')

processed_data <- raw_data %>% 
                    select( columns ) %>%
                    mutate(
                            YEAR=as.numeric(substring(as.Date(BGN_DATE, format='%m/%d/%Y'), 1, 4) ) 
                           )

#Event types
group_evtype <- processed_data %>% 
                        group_by(EVTYPE) %>%
                        summarise(
                                    count=n(),
                                    total_fatalities=sum(FATALITIES),
                                    total_injuries=sum(INJURIES)
                                )

#Property damage
group_year_propdmgexp <- processed_data %>% 
                        group_by(YEAR, PROPDMGEXP) %>%
                        summarise(count=n()  )

#Crop damage
group_year_cropdmgexp <- processed_data %>% 
                        group_by(YEAR, CROPDMGEXP) %>%
                        summarise(count=n()  )

#Let's show the different event types and their associated occurrences
sort( unique( with( group_evtype, paste( EVTYPE, count ) ) ) )
  [1] "   HIGH SURF ADVISORY 1"           " COASTAL FLOOD 1"                 
  [3] " FLASH FLOOD 1"                    " LIGHTNING 1"                     
  [5] " TSTM WIND (G45) 1"                " TSTM WIND 4"                     
  [7] " WATERSPOUT 1"                     " WIND 1"                          
  [9] "? 1"                               "ABNORMAL WARMTH 4"                
 [11] "ABNORMALLY DRY 2"                  "ABNORMALLY WET 1"                 
 [13] "ACCUMULATED SNOWFALL 4"            "AGRICULTURAL FREEZE 6"            
 [15] "APACHE COUNTY 1"                   "ASTRONOMICAL HIGH TIDE 103"       
 [17] "ASTRONOMICAL LOW TIDE 174"         "AVALANCE 1"                       
 [19] "AVALANCHE 386"                     "BEACH EROSIN 1"                   
 [21] "Beach Erosion 1"                   "BEACH EROSION 3"                  
 [23] "BEACH EROSION/COASTAL FLOOD 1"     "BEACH FLOOD 2"                    
 [25] "BELOW NORMAL PRECIPITATION 2"      "BITTER WIND CHILL 1"              
 [27] "BITTER WIND CHILL TEMPERATURES 3"  "BLACK ICE 14"                     
 [29] "Black Ice 3"                       "BLIZZARD 2719"                    
 [31] "BLIZZARD AND EXTREME WIND CHIL 2"  "BLIZZARD AND HEAVY SNOW 1"        
 [33] "Blizzard Summary 1"                "BLIZZARD WEATHER 1"               
 [35] "BLIZZARD/FREEZING RAIN 1"          "BLIZZARD/HEAVY SNOW 2"            
 [37] "BLIZZARD/HIGH WIND 1"              "BLIZZARD/WINTER STORM 1"          
 [39] "BLOW-OUT TIDE 1"                   "BLOW-OUT TIDES 1"                 
 [41] "BLOWING DUST 4"                    "BLOWING SNOW- EXTREME WIND CHI 1" 
 [43] "BLOWING SNOW & EXTREME WIND CH 2"  "BLOWING SNOW 12"                  
 [45] "blowing snow 2"                    "Blowing Snow 3"                   
 [47] "BLOWING SNOW/EXTREME WIND CHIL 1"  "BREAKUP FLOODING 1"               
 [49] "BRUSH FIRE 3"                      "BRUSH FIRES 1"                    
 [51] "COASTAL  FLOODING/EROSION 1"       "COASTAL EROSION 1"                
 [53] "Coastal Flood 6"                   "COASTAL FLOOD 650"                
 [55] "COASTAL FLOODING 143"              "coastal flooding 2"               
 [57] "Coastal Flooding 38"               "COASTAL FLOODING/EROSION 5"       
 [59] "Coastal Storm 2"                   "COASTAL STORM 8"                  
 [61] "COASTAL SURGE 2"                   "COASTAL/TIDAL FLOOD 2"            
 [63] "COASTALFLOOD 1"                    "COASTALSTORM 1"                   
 [65] "Cold 10"                           "COLD 72"                          
 [67] "COLD AIR FUNNEL 4"                 "COLD AIR FUNNELS 2"               
 [69] "COLD AIR TORNADO 1"                "COLD AND FROST 1"                 
 [71] "Cold and Frost 6"                  "COLD AND SNOW 1"                  
 [73] "COLD AND WET CONDITIONS 1"         "Cold Temperature 2"               
 [75] "COLD TEMPERATURES 4"               "COLD WAVE 3"                      
 [77] "COLD WEATHER 4"                    "COLD WIND CHILL TEMPERATURES 6"   
 [79] "COLD/WIND CHILL 539"               "COLD/WINDS 1"                     
 [81] "COOL AND WET 1"                    "COOL SPELL 1"                     
 [83] "CSTL FLOODING/EROSION 2"           "DAM BREAK 4"                      
 [85] "DAM FAILURE 1"                     "Damaging Freeze 2"                
 [87] "DAMAGING FREEZE 6"                 "DEEP HAIL 1"                      
 [89] "DENSE FOG 1293"                    "DENSE SMOKE 10"                   
 [91] "DOWNBURST 2"                       "DOWNBURST WINDS 2"                
 [93] "DRIEST MONTH 1"                    "Drifting Snow 1"                  
 [95] "DROUGHT 2488"                      "DROUGHT/EXCESSIVE HEAT 13"        
 [97] "DROWNING 1"                        "DRY 9"                            
 [99] "DRY CONDITIONS 6"                  "DRY HOT WEATHER 1"                
[101] "DRY MICROBURST 186"                "DRY MICROBURST 50 1"              
[103] "DRY MICROBURST 53 1"               "DRY MICROBURST 58 2"              
[105] "DRY MICROBURST 61 1"               "DRY MICROBURST 84 1"              
[107] "DRY MICROBURST WINDS 5"            "DRY MIRCOBURST WINDS 1"           
[109] "DRY PATTERN 1"                     "DRY SPELL 4"                      
[111] "DRY WEATHER 4"                     "DRYNESS 1"                        
[113] "DUST DEVEL 1"                      "DUST DEVIL 141"                   
[115] "Dust Devil 8"                      "DUST DEVIL WATERSPOUT 1"          
[117] "DUST STORM 427"                    "DUST STORM/HIGH WINDS 1"          
[119] "DUSTSTORM 1"                       "EARLY FREEZE 1"                   
[121] "Early Frost 1"                     "EARLY FROST 1"                    
[123] "EARLY RAIN 1"                      "EARLY SNOW 3"                     
[125] "Early snowfall 2"                  "EARLY SNOWFALL 5"                 
[127] "Erosion/Cstl Flood 2"              "EXCESSIVE 1"                      
[129] "Excessive Cold 2"                  "EXCESSIVE HEAT 1678"              
[131] "EXCESSIVE HEAT/DROUGHT 1"          "EXCESSIVE PRECIPITATION 1"        
[133] "EXCESSIVE RAIN 5"                  "EXCESSIVE RAINFALL 4"             
[135] "EXCESSIVE SNOW 25"                 "EXCESSIVE WETNESS 1"              
[137] "EXCESSIVELY DRY 1"                 "Extended Cold 1"                  
[139] "Extreme Cold 2"                    "EXTREME COLD 655"                 
[141] "EXTREME COLD/WIND CHILL 1002"      "EXTREME HEAT 22"                  
[143] "EXTREME WIND CHILL 6"              "EXTREME WIND CHILL/BLOWING SNO 1" 
[145] "EXTREME WIND CHILLS 1"             "EXTREME WINDCHILL 204"            
[147] "EXTREME WINDCHILL TEMPERATURES 19" "EXTREME/RECORD COLD 4"            
[149] "EXTREMELY WET 1"                   "FALLING SNOW/ICE 2"               
[151] "FIRST FROST 1"                     "FIRST SNOW 9"                     
[153] "FLASH FLOOD - HEAVY RAIN 2"        "FLASH FLOOD 54277"                
[155] "FLASH FLOOD FROM ICE JAMS 5"       "FLASH FLOOD LANDSLIDES 1"         
[157] "FLASH FLOOD WINDS 1"               "FLASH FLOOD/ 1"                   
[159] "FLASH FLOOD/ FLOOD 2"              "FLASH FLOOD/ STREET 1"            
[161] "FLASH FLOOD/FLOOD 22"              "FLASH FLOOD/HEAVY RAIN 1"         
[163] "FLASH FLOOD/LANDSLIDE 1"           "FLASH FLOODING 682"               
[165] "FLASH FLOODING/FLOOD 8"            "FLASH FLOODING/THUNDERSTORM WI 1" 
[167] "FLASH FLOODS 32"                   "FLASH FLOOODING 1"                
[169] "FLOOD & HEAVY RAIN 2"              "Flood 1"                          
[171] "FLOOD 25326"                       "FLOOD FLASH 3"                    
[173] "FLOOD FLOOD/FLASH 1"               "FLOOD WATCH/ 1"                   
[175] "FLOOD/FLASH 2"                     "Flood/Flash Flood 1"              
[177] "FLOOD/FLASH FLOOD 624"             "FLOOD/FLASH FLOODING 2"           
[179] "FLOOD/FLASH/FLOOD 1"               "FLOOD/FLASHFLOOD 1"               
[181] "FLOOD/RAIN/WIND 1"                 "FLOOD/RAIN/WINDS 6"               
[183] "FLOOD/RIVER FLOOD 1"               "Flood/Strong Wind 1"              
[185] "FLOODING 120"                      "FLOODING/HEAVY RAIN 1"            
[187] "FLOODS 3"                          "FOG 538"                          
[189] "FOG AND COLD TEMPERATURES 1"       "FOREST FIRES 1"                   
[191] "Freeze 2"                          "FREEZE 74"                        
[193] "Freezing drizzle 1"                "FREEZING DRIZZLE 20"              
[195] "Freezing Drizzle 3"                "FREEZING DRIZZLE AND FREEZING 1"  
[197] "Freezing Fog 1"                    "FREEZING FOG 45"                  
[199] "FREEZING RAIN 250"                 "Freezing rain 3"                  
[201] "Freezing Rain 7"                   "FREEZING RAIN AND SLEET 6"        
[203] "FREEZING RAIN AND SNOW 1"          "FREEZING RAIN SLEET AND 1"        
[205] "FREEZING RAIN SLEET AND LIGHT 1"   "FREEZING RAIN/SLEET 9"            
[207] "FREEZING RAIN/SNOW 4"              "Freezing Spray 1"                 
[209] "Frost 4"                           "FROST 53"                         
[211] "Frost/Freeze 1"                    "FROST/FREEZE 1342"                
[213] "FROST\\FREEZE 1"                   "FUNNEL 46"                        
[215] "Funnel Cloud 5"                    "FUNNEL CLOUD 6839"                
[217] "FUNNEL CLOUD. 1"                   "FUNNEL CLOUD/HAIL 1"              
[219] "FUNNEL CLOUDS 87"                  "FUNNELS 1"                        
[221] "Glaze 11"                          "GLAZE 32"                         
[223] "GLAZE ICE 2"                       "GLAZE/ICE STORM 1"                
[225] "gradient wind 2"                   "GRADIENT WIND 3"                  
[227] "Gradient wind 4"                   "GRADIENT WINDS 8"                 
[229] "GRASS FIRES 1"                     "GROUND BLIZZARD 2"                
[231] "GUSTNADO 6"                        "GUSTNADO AND 1"                   
[233] "GUSTY LAKE WIND 1"                 "GUSTY THUNDERSTORM WIND 3"        
[235] "GUSTY THUNDERSTORM WINDS 5"        "Gusty Wind 1"                     
[237] "GUSTY WIND 23"                     "GUSTY WIND/HAIL 1"                
[239] "GUSTY WIND/HVY RAIN 1"             "Gusty wind/rain 1"                
[241] "Gusty Winds 10"                    "Gusty winds 2"                    
[243] "GUSTY WINDS 53"                    "HAIL 0.75 18"                     
[245] "HAIL 0.88 1"                       "HAIL 075 1"                       
[247] "HAIL 088 1"                        "HAIL 1.00 6"                      
[249] "HAIL 1.75 4"                       "HAIL 1.75) 1"                     
[251] "HAIL 100 13"                       "HAIL 125 1"                       
[253] "HAIL 150 2"                        "HAIL 175 13"                      
[255] "HAIL 200 1"                        "HAIL 225 1"                       
[257] "HAIL 275 3"                        "HAIL 288661"                      
[259] "HAIL 450 1"                        "HAIL 75 29"                       
[261] "HAIL 80 2"                         "HAIL 88 1"                        
[263] "HAIL ALOFT 1"                      "HAIL DAMAGE 2"                    
[265] "HAIL FLOODING 1"                   "HAIL STORM 1"                     
[267] "Hail(0.75) 1"                      "HAIL/ICY ROADS 1"                 
[269] "HAIL/WIND 3"                       "HAIL/WINDS 2"                     
[271] "HAILSTORM 3"                       "HAILSTORMS 1"                     
[273] "HARD FREEZE 7"                     "HAZARDOUS SURF 1"                 
[275] "HEAT 767"                          "HEAT DROUGHT 1"                   
[277] "Heat Wave 1"                       "HEAT WAVE 74"                     
[279] "HEAT WAVE DROUGHT 1"               "HEAT WAVES 2"                     
[281] "HEAT/DROUGHT 1"                    "Heatburst 1"                      
[283] "HEAVY LAKE SNOW 25"                "HEAVY MIX 8"                      
[285] "HEAVY PRECIPATATION 1"             "HEAVY PRECIPITATION 1"            
[287] "Heavy Precipitation 2"             "HEAVY RAIN 11723"                 
[289] "Heavy Rain 16"                     "Heavy rain 3"                     
[291] "HEAVY RAIN AND FLOOD 1"            "Heavy Rain and Wind 4"            
[293] "HEAVY RAIN EFFECTS 1"              "HEAVY RAIN/FLOODING 2"            
[295] "Heavy Rain/High Surf 1"            "HEAVY RAIN/LIGHTNING 1"           
[297] "HEAVY RAIN/MUDSLIDES/FLOOD 1"      "HEAVY RAIN/SEVERE WEATHER 2"      
[299] "HEAVY RAIN/SMALL STREAM URBAN 1"   "HEAVY RAIN/SNOW 1"                
[301] "HEAVY RAIN/URBAN FLOOD 1"          "HEAVY RAIN/WIND 4"                
[303] "HEAVY RAIN; URBAN FLOOD WINDS; 1"  "HEAVY RAINFALL 3"                 
[305] "HEAVY RAINS 26"                    "HEAVY RAINS/FLOODING 9"           
[307] "HEAVY SEAS 2"                      "HEAVY SHOWER 2"                   
[309] "HEAVY SHOWERS 1"                   "HEAVY SNOW-SQUALLS 15"            
[311] "HEAVY SNOW   FREEZING RAIN 1"      "HEAVY SNOW & ICE 1"               
[313] "HEAVY SNOW 15708"                  "HEAVY SNOW AND 1"                 
[315] "HEAVY SNOW AND HIGH WINDS 2"       "HEAVY SNOW AND ICE 2"             
[317] "HEAVY SNOW AND ICE STORM 2"        "HEAVY SNOW AND STRONG WINDS 1"    
[319] "HEAVY SNOW ANDBLOWING SNOW 1"      "Heavy snow shower 1"              
[321] "HEAVY SNOW SQUALLS 32"             "HEAVY SNOW/BLIZZARD 3"            
[323] "HEAVY SNOW/BLIZZARD/AVALANCHE 1"   "HEAVY SNOW/BLOWING SNOW 1"        
[325] "HEAVY SNOW/FREEZING RAIN 2"        "HEAVY SNOW/HIGH 1"                
[327] "HEAVY SNOW/HIGH WIND 1"            "HEAVY SNOW/HIGH WINDS & FLOOD 1"  
[329] "HEAVY SNOW/HIGH WINDS 1"           "HEAVY SNOW/HIGH WINDS/FREEZING 1" 
[331] "HEAVY SNOW/ICE 5"                  "HEAVY SNOW/ICE STORM 2"           
[333] "HEAVY SNOW/SLEET 1"                "HEAVY SNOW/SQUALLS 2"             
[335] "HEAVY SNOW/WIND 1"                 "HEAVY SNOW/WINTER STORM 1"        
[337] "HEAVY SNOWPACK 1"                  "Heavy Surf 3"                     
[339] "HEAVY SURF 84"                     "Heavy surf and wind 1"            
[341] "HEAVY SURF COASTAL FLOODING 1"     "HEAVY SURF/HIGH SURF 228"         
[343] "HEAVY SWELLS 1"                    "HEAVY WET SNOW 1"                 
[345] "HIGH  SWELLS 1"                    "HIGH  WINDS 1"                    
[347] "HIGH 1"                            "HIGH SEAS 8"                      
[349] "HIGH SURF 725"                     "High Surf 9"                      
[351] "HIGH SURF ADVISORIES 1"            "HIGH SURF ADVISORY 4"             
[353] "HIGH SWELLS 5"                     "HIGH TEMPERATURE RECORD 3"        
[355] "HIGH TIDES 2"                      "HIGH WATER 6"                     
[357] "HIGH WAVES 3"                      "HIGH WIND (G40) 2"                
[359] "High Wind 2"                       "HIGH WIND 20212"                  
[361] "HIGH WIND 48 1"                    "HIGH WIND 63 1"                   
[363] "HIGH WIND 70 1"                    "HIGH WIND AND HEAVY SNOW 1"       
[365] "HIGH WIND AND HIGH TIDES 2"        "HIGH WIND AND SEAS 1"             
[367] "HIGH WIND DAMAGE 2"                "HIGH WIND/ BLIZZARD 1"            
[369] "HIGH WIND/BLIZZARD 6"              "HIGH WIND/BLIZZARD/FREEZING RA 1" 
[371] "HIGH WIND/HEAVY SNOW 3"            "HIGH WIND/LOW WIND CHILL 1"       
[373] "HIGH WIND/SEAS 1"                  "HIGH WIND/WIND CHILL 1"           
[375] "HIGH WIND/WIND CHILL/BLIZZARD 1"   "HIGH WINDS 1533"                  
[377] "HIGH WINDS 55 1"                   "HIGH WINDS 57 1"                  
[379] "HIGH WINDS 58 1"                   "HIGH WINDS 63 2"                  
[381] "HIGH WINDS 66 2"                   "HIGH WINDS 67 1"                  
[383] "HIGH WINDS 73 1"                   "HIGH WINDS 76 1"                  
[385] "HIGH WINDS 80 2"                   "HIGH WINDS 82 1"                  
[387] "HIGH WINDS AND WIND CHILL 1"       "HIGH WINDS DUST STORM 1"          
[389] "HIGH WINDS HEAVY RAINS 1"          "HIGH WINDS/ 1"                    
[391] "HIGH WINDS/COASTAL FLOOD 1"        "HIGH WINDS/COLD 5"                
[393] "HIGH WINDS/FLOODING 1"             "HIGH WINDS/HEAVY RAIN 1"          
[395] "HIGH WINDS/SNOW 3"                 "HIGHWAY FLOODING 1"               
[397] "Hot and Dry 2"                     "HOT PATTERN 1"                    
[399] "HOT SPELL 2"                       "HOT WEATHER 1"                    
[401] "HOT/DRY PATTERN 1"                 "HURRICANE-GENERATED SWELLS 3"     
[403] "HURRICANE 174"                     "Hurricane Edouard 2"              
[405] "HURRICANE EMILY 1"                 "HURRICANE ERIN 7"                 
[407] "HURRICANE FELIX 2"                 "HURRICANE GORDON 1"               
[409] "HURRICANE OPAL 9"                  "HURRICANE OPAL/HIGH WINDS 1"      
[411] "HURRICANE/TYPHOON 88"              "HVY RAIN 2"                       
[413] "HYPERTHERMIA/EXPOSURE 1"           "HYPOTHERMIA 1"                    
[415] "Hypothermia/Exposure 3"            "HYPOTHERMIA/EXPOSURE 3"           
[417] "ICE 61"                            "ICE AND SNOW 1"                   
[419] "ICE FLOES 2"                       "Ice Fog 2"                        
[421] "ICE JAM 4"                         "Ice jam flood (minor 1"           
[423] "ICE JAM FLOODING 5"                "ICE ON ROAD 1"                    
[425] "ICE PELLETS 1"                     "ICE ROADS 1"                      
[427] "ICE STORM 2006"                    "ICE STORM AND SNOW 1"             
[429] "ICE STORM/FLASH FLOOD 1"           "Ice/Snow 2"                       
[431] "ICE/SNOW 3"                        "ICE/STRONG WINDS 1"               
[433] "Icestorm/Blizzard 1"               "ICY ROADS 28"                     
[435] "Icy Roads 4"                       "LACK OF SNOW 1"                   
[437] "LAKE-EFFECT SNOW 636"              "Lake Effect Snow 2"               
[439] "LAKE EFFECT SNOW 21"               "LAKE FLOOD 1"                     
[441] "LAKESHORE FLOOD 23"                "LANDSLIDE 600"                    
[443] "LANDSLIDE/URBAN FLOOD 1"           "LANDSLIDES 8"                     
[445] "Landslump 1"                       "LANDSLUMP 1"                      
[447] "LANDSPOUT 2"                       "LARGE WALL CLOUD 1"               
[449] "Late-season Snowfall 1"            "LATE FREEZE 1"                    
[451] "LATE SEASON HAIL 1"                "LATE SEASON SNOW 1"               
[453] "Late Season Snowfall 2"            "LATE SNOW 2"                      
[455] "LIGHT FREEZING RAIN 23"            "Light snow 1"                     
[457] "LIGHT SNOW 154"                    "Light Snow 21"                    
[459] "LIGHT SNOW AND SLEET 2"            "Light Snow/Flurries 3"            
[461] "LIGHT SNOW/FREEZING PRECIP 1"      "Light Snowfall 1"                 
[463] "LIGHTING 3"                        "LIGHTNING  WAUSEON 1"             
[465] "LIGHTNING 15754"                   "LIGHTNING AND HEAVY RAIN 1"       
[467] "LIGHTNING AND THUNDERSTORM WIN 1"  "LIGHTNING AND WINDS 1"            
[469] "LIGHTNING DAMAGE 1"                "LIGHTNING FIRE 1"                 
[471] "LIGHTNING INJURY 1"                "LIGHTNING THUNDERSTORM WINDS 1"   
[473] "LIGHTNING THUNDERSTORM WINDSS 1"   "LIGHTNING. 1"                     
[475] "LIGHTNING/HEAVY RAIN 1"            "LIGNTNING 1"                      
[477] "LOCAL FLASH FLOOD 1"               "LOCAL FLOOD 1"                    
[479] "LOCALLY HEAVY RAIN 1"              "LOW TEMPERATURE 7"                
[481] "LOW TEMPERATURE RECORD 1"          "LOW WIND CHILL 1"                 
[483] "MAJOR FLOOD 3"                     "Marine Accident 1"                
[485] "MARINE HAIL 442"                   "MARINE HIGH WIND 135"             
[487] "MARINE MISHAP 2"                   "MARINE STRONG WIND 48"            
[489] "MARINE THUNDERSTORM WIND 5812"     "MARINE TSTM WIND 6175"            
[491] "Metro Storm, May 26 1"             "Microburst 4"                     
[493] "MICROBURST 5"                      "MICROBURST WINDS 5"               
[495] "Mild and Dry Pattern 1"            "MILD PATTERN 1"                   
[497] "MILD/DRY PATTERN 1"                "MINOR FLOOD 1"                    
[499] "Minor Flooding 1"                  "MINOR FLOODING 3"                 
[501] "MIXED PRECIP 10"                   "Mixed Precipitation 3"            
[503] "MIXED PRECIPITATION 34"            "MODERATE SNOW 1"                  
[505] "MODERATE SNOWFALL 101"             "MONTHLY PRECIPITATION 36"         
[507] "MONTHLY RAINFALL 11"               "Monthly Rainfall 2"               
[509] "Monthly Snowfall 1"                "MONTHLY SNOWFALL 1"               
[511] "MONTHLY TEMPERATURE 4"             "Mountain Snows 1"                 
[513] "MUD SLIDE 7"                       "MUD SLIDES 1"                     
[515] "MUD SLIDES URBAN FLOODING 1"       "MUD/ROCK SLIDE 1"                 
[517] "Mudslide 8"                        "MUDSLIDE 9"                       
[519] "MUDSLIDE/LANDSLIDE 1"              "MUDSLIDES 4"                      
[521] "Mudslides 5"                       "NEAR RECORD SNOW 1"               
[523] "No Severe Weather 1"               "NON-SEVERE WIND DAMAGE 1"         
[525] "NON-TSTM WIND 1"                   "NON SEVERE HAIL 7"                
[527] "NON TSTM WIND 2"                   "NONE 2"                           
[529] "NORMAL PRECIPITATION 3"            "NORTHERN LIGHTS 1"                
[531] "Other 4"                           "OTHER 48"                         
[533] "PATCHY DENSE FOG 3"                "PATCHY ICE 1"                     
[535] "PROLONG COLD 17"                   "Prolong Cold 5"                   
[537] "PROLONG COLD/SNOW 1"               "PROLONG WARMTH 4"                 
[539] "PROLONGED RAIN 4"                  "RAIN (HEAVY) 1"                   
[541] "RAIN 16"                           "RAIN AND WIND 1"                  
[543] "Rain Damage 1"                     "RAIN/SNOW 5"                      
[545] "RAIN/WIND 1"                       "RAINSTORM 1"                      
[547] "RAPIDLY RISING WATER 1"            "RECORD  COLD 1"                   
[549] "Record Cold 3"                     "RECORD COLD 64"                   
[551] "RECORD COLD AND HIGH WIND 1"       "RECORD COLD/FROST 2"              
[553] "RECORD COOL 5"                     "Record dry month 1"               
[555] "RECORD DRYNESS 2"                  "Record Heat 1"                    
[557] "RECORD HEAT 81"                    "RECORD HEAT WAVE 1"               
[559] "Record High 2"                     "RECORD HIGH 5"                    
[561] "RECORD HIGH TEMPERATURE 3"         "RECORD HIGH TEMPERATURES 1"       
[563] "RECORD LOW 4"                      "RECORD LOW RAINFALL 2"            
[565] "Record May Snow 1"                 "RECORD PRECIPITATION 1"           
[567] "RECORD RAINFALL 14"                "RECORD SNOW 8"                    
[569] "RECORD SNOW/COLD 1"                "RECORD SNOWFALL 6"                
[571] "Record temperature 11"             "RECORD TEMPERATURE 5"             
[573] "Record Temperatures 2"             "RECORD TEMPERATURES 3"            
[575] "RECORD WARM 1"                     "RECORD WARM TEMPS. 1"             
[577] "RECORD WARMTH 146"                 "Record Warmth 8"                  
[579] "Record Winter Snow 3"              "RECORD/EXCESSIVE HEAT 3"          
[581] "RECORD/EXCESSIVE RAINFALL 1"       "RED FLAG CRITERIA 2"              
[583] "RED FLAG FIRE WX 2"                "REMNANTS OF FLOYD 2"              
[585] "RIP CURRENT 470"                   "RIP CURRENTS 304"                 
[587] "RIP CURRENTS HEAVY SURF 1"         "RIP CURRENTS/HEAVY SURF 2"        
[589] "RIVER AND STREAM FLOOD 2"          "RIVER FLOOD 173"                  
[591] "RIVER FLOODING 24"                 "River Flooding 5"                 
[593] "ROCK SLIDE 2"                      "ROGUE WAVE 1"                     
[595] "ROTATING WALL CLOUD 5"             "ROUGH SEAS 3"                     
[597] "ROUGH SURF 4"                      "RURAL FLOOD 2"                    
[599] "Saharan Dust 2"                    "SAHARAN DUST 2"                   
[601] "Seasonal Snowfall 1"               "SEICHE 21"                        
[603] "SEVERE COLD 1"                     "SEVERE THUNDERSTORM 13"           
[605] "SEVERE THUNDERSTORM WINDS 5"       "SEVERE THUNDERSTORMS 23"          
[607] "SEVERE TURBULENCE 1"               "SLEET & FREEZING RAIN 1"          
[609] "SLEET 59"                          "SLEET STORM 12"                   
[611] "SLEET/FREEZING RAIN 2"             "SLEET/ICE STORM 1"                
[613] "SLEET/RAIN/SNOW 1"                 "SLEET/SNOW 2"                     
[615] "Small Hail 1"                      "SMALL HAIL 47"                    
[617] "small hail 5"                      "SMALL STREAM 1"                   
[619] "SMALL STREAM AND 1"                "SMALL STREAM AND URBAN FLOOD 2"   
[621] "SMALL STREAM AND URBAN FLOODIN 1"  "SMALL STREAM FLOOD 7"             
[623] "SMALL STREAM FLOODING 4"           "SMALL STREAM URBAN FLOOD 1"       
[625] "SMALL STREAM/URBAN FLOOD 5"        "Sml Stream Fld 2"                 
[627] "SMOKE 11"                          "SNOW- HIGH WIND- WIND CHILL 1"    
[629] "Snow 30"                           "SNOW 587"                         
[631] "Snow Accumulation 1"               "SNOW ACCUMULATION 1"              
[633] "SNOW ADVISORY 1"                   "SNOW AND COLD 2"                  
[635] "SNOW AND HEAVY SNOW 2"             "Snow and Ice 1"                   
[637] "SNOW AND ICE 33"                   "SNOW AND ICE STORM 1"             
[639] "Snow and sleet 1"                  "SNOW AND SLEET 4"                 
[641] "SNOW AND WIND 1"                   "SNOW DROUGHT 7"                   
[643] "SNOW FREEZING RAIN 11"             "SNOW SHOWERS 6"                   
[645] "SNOW SLEET 1"                      "SNOW SQUALL 19"                   
[647] "Snow squalls 1"                    "SNOW SQUALLS 17"                  
[649] "Snow Squalls 4"                    "SNOW/ BITTER COLD 1"              
[651] "SNOW/ ICE 1"                       "SNOW/BLOWING SNOW 7"              
[653] "SNOW/COLD 2"                       "SNOW/FREEZING RAIN 6"             
[655] "SNOW/HEAVY SNOW 1"                 "SNOW/HIGH WINDS 2"                
[657] "SNOW/ICE 7"                        "SNOW/ICE STORM 17"                
[659] "SNOW/RAIN 1"                       "SNOW/RAIN/SLEET 1"                
[661] "SNOW/SLEET 10"                     "SNOW/SLEET/FREEZING RAIN 6"       
[663] "SNOW/SLEET/RAIN 1"                 "SNOW\\COLD 1"                     
[665] "SNOWFALL RECORD 1"                 "SNOWMELT FLOODING 5"              
[667] "SNOWSTORM 1"                       "SOUTHEAST 1"                      
[669] "STORM FORCE WINDS 1"               "STORM SURGE 261"                  
[671] "STORM SURGE/TIDE 148"              "STREAM FLOODING 1"                
[673] "STREET FLOOD 3"                    "STREET FLOODING 3"                
[675] "Strong Wind 3"                     "STRONG WIND 3566"                 
[677] "STRONG WIND GUST 2"                "Strong winds 1"                   
[679] "STRONG WINDS 196"                  "Strong Winds 7"                   
[681] "Summary August 10 2"               "Summary August 11 2"              
[683] "Summary August 17 1"               "Summary August 2-3 1"             
[685] "Summary August 21 1"               "Summary August 28 1"              
[687] "Summary August 4 1"                "Summary August 7 1"               
[689] "Summary August 9 1"                "Summary Jan 17 1"                 
[691] "Summary July 23-24 1"              "Summary June 18-19 1"             
[693] "Summary June 5-6 1"                "Summary June 6 1"                 
[695] "Summary of April 12 2"             "Summary of April 13 1"            
[697] "Summary of April 21 2"             "Summary of April 27 1"            
[699] "Summary of April 3rd 1"            "Summary of August 1 1"            
[701] "Summary of July 11 1"              "Summary of July 2 1"              
[703] "Summary of July 22 1"              "Summary of July 26 1"             
[705] "Summary of July 29 1"              "Summary of July 3 1"              
[707] "Summary of June 10 1"              "Summary of June 11 1"             
[709] "Summary of June 12 1"              "Summary of June 13 2"             
[711] "Summary of June 15 1"              "Summary of June 16 1"             
[713] "Summary of June 18 1"              "Summary of June 23 1"             
[715] "Summary of June 24 1"              "Summary of June 3 2"              
[717] "Summary of June 30 1"              "Summary of June 4 1"              
[719] "Summary of June 6 1"               "Summary of March 14 1"            
[721] "Summary of March 23 2"             "SUMMARY OF MARCH 24-25 1"         
[723] "Summary of March 24 1"             "SUMMARY OF MARCH 27 1"            
[725] "SUMMARY OF MARCH 29 1"             "Summary of May 10 1"              
[727] "Summary of May 13 1"               "Summary of May 14 1"              
[729] "Summary of May 22 1"               "Summary of May 22 am 1"           
[731] "Summary of May 22 pm 1"            "Summary of May 26 am 1"           
[733] "Summary of May 26 pm 1"            "Summary of May 31 am 1"           
[735] "Summary of May 31 pm 1"            "Summary of May 9-10 1"            
[737] "Summary Sept. 25-26 1"             "Summary September 20 1"           
[739] "Summary September 23 2"            "Summary September 3 1"            
[741] "Summary September 4 1"             "Summary: Nov. 16 2"               
[743] "Summary: Nov. 6-7 1"               "Summary: Oct. 20-21 1"            
[745] "Summary: October 31 1"             "Summary: Sept. 18 1"              
[747] "Temperature record 43"             "THUDERSTORM WINDS 2"              
[749] "THUNDEERSTORM WINDS 2"             "THUNDERESTORM WINDS 1"            
[751] "THUNDERSNOW 1"                     "Thundersnow shower 1"             
[753] "THUNDERSTORM  WINDS 7"             "THUNDERSTORM 45"                  
[755] "THUNDERSTORM DAMAGE 2"             "THUNDERSTORM DAMAGE TO 1"         
[757] "THUNDERSTORM HAIL 1"               "THUNDERSTORM W INDS 1"            
[759] "THUNDERSTORM WIND (G40) 1"         "Thunderstorm Wind 1"              
[761] "THUNDERSTORM WIND 50 2"            "THUNDERSTORM WIND 52 1"           
[763] "THUNDERSTORM WIND 56 1"            "THUNDERSTORM WIND 59 1"           
[765] "THUNDERSTORM WIND 59 MPH 1"        "THUNDERSTORM WIND 59 MPH. 1"      
[767] "THUNDERSTORM WIND 60 MPH 4"        "THUNDERSTORM WIND 65 MPH 1"       
[769] "THUNDERSTORM WIND 65MPH 1"         "THUNDERSTORM WIND 69 1"           
[771] "THUNDERSTORM WIND 82563"           "THUNDERSTORM WIND 98 MPH 1"       
[773] "THUNDERSTORM WIND G50 4"           "THUNDERSTORM WIND G51 1"          
[775] "THUNDERSTORM WIND G52 2"           "THUNDERSTORM WIND G55 1"          
[777] "THUNDERSTORM WIND G60 2"           "THUNDERSTORM WIND G61 1"          
[779] "THUNDERSTORM WIND TREES 1"         "THUNDERSTORM WIND. 1"             
[781] "THUNDERSTORM WIND/ TREE 1"         "THUNDERSTORM WIND/ TREES 4"       
[783] "THUNDERSTORM WIND/AWNING 1"        "THUNDERSTORM WIND/HAIL 1"         
[785] "THUNDERSTORM WIND/LIGHTNING 1"     "THUNDERSTORM WINDS      LE CEN 1" 
[787] "THUNDERSTORM WINDS 13 1"           "THUNDERSTORM WINDS 2 1"           
[789] "THUNDERSTORM WINDS 20843"          "THUNDERSTORM WINDS 50 1"          
[791] "THUNDERSTORM WINDS 52 1"           "THUNDERSTORM WINDS 53 1"          
[793] "THUNDERSTORM WINDS 60 1"           "THUNDERSTORM WINDS 61 1"          
[795] "THUNDERSTORM WINDS 62 1"           "THUNDERSTORM WINDS 63 MPH 1"      
[797] "THUNDERSTORM WINDS AND 2"          "THUNDERSTORM WINDS FUNNEL CLOU 2" 
[799] "THUNDERSTORM WINDS G 2"            "THUNDERSTORM WINDS G60 1"         
[801] "THUNDERSTORM WINDS HAIL 61"        "THUNDERSTORM WINDS HEAVY RAIN 1"  
[803] "THUNDERSTORM WINDS LIGHTNING 7"    "THUNDERSTORM WINDS SMALL STREA 1" 
[805] "THUNDERSTORM WINDS URBAN FLOOD 1"  "THUNDERSTORM WINDS. 3"            
[807] "THUNDERSTORM WINDS/ FLOOD 2"       "THUNDERSTORM WINDS/ HAIL 1"       
[809] "THUNDERSTORM WINDS/FLASH FLOOD 1"  "THUNDERSTORM WINDS/FLOODING 1"    
[811] "THUNDERSTORM WINDS/FUNNEL CLOU 1"  "THUNDERSTORM WINDS/HAIL 24"       
[813] "THUNDERSTORM WINDS/HEAVY RAIN 1"   "THUNDERSTORM WINDS53 1"           
[815] "THUNDERSTORM WINDSHAIL 1"          "THUNDERSTORM WINDSS 51"           
[817] "THUNDERSTORM WINS 1"               "THUNDERSTORMS 4"                  
[819] "THUNDERSTORMS WIND 6"              "THUNDERSTORMS WINDS 14"           
[821] "THUNDERSTORMW 1"                   "THUNDERSTORMW 50 1"               
[823] "THUNDERSTORMW WINDS 3"             "THUNDERSTORMWINDS 1"              
[825] "THUNDERSTROM WIND 1"               "THUNDERSTROM WINDS 2"             
[827] "THUNDERTORM WINDS 3"               "THUNDERTSORM WIND 1"              
[829] "THUNDESTORM WINDS 2"               "THUNERSTORM WINDS 1"              
[831] "TIDAL FLOOD 1"                     "TIDAL FLOODING 20"                
[833] "Tidal Flooding 5"                  "TORNADO 60652"                    
[835] "TORNADO DEBRIS 1"                  "TORNADO F0 19"                    
[837] "TORNADO F1 4"                      "TORNADO F2 3"                     
[839] "TORNADO F3 2"                      "TORNADO/WATERSPOUT 1"             
[841] "TORNADOES 2"                       "TORNADOES, TSTM WIND, HAIL 1"     
[843] "TORNADOS 1"                        "TORNDAO 1"                        
[845] "TORRENTIAL RAIN 1"                 "Torrential Rainfall 1"            
[847] "TROPICAL DEPRESSION 60"            "TROPICAL STORM 690"               
[849] "TROPICAL STORM ALBERTO 1"          "TROPICAL STORM DEAN 2"            
[851] "TROPICAL STORM GORDON 1"           "TROPICAL STORM JERRY 3"           
[853] "TSTM 1"                            "TSTM HEAVY RAIN 3"                
[855] "TSTM WIND  (G45) 1"                "TSTM WIND (41) 1"                 
[857] "TSTM WIND (G35) 1"                 "TSTM WIND (G40) 10"               
[859] "TSTM WIND (G45) 39"                "Tstm Wind 2"                      
[861] "TSTM WIND 219940"                  "TSTM WIND 40 1"                   
[863] "TSTM WIND 45 1"                    "TSTM WIND 50 1"                   
[865] "TSTM WIND 51 2"                    "TSTM WIND 52 5"                   
[867] "TSTM WIND 55 3"                    "TSTM WIND 65) 1"                  
[869] "TSTM WIND AND LIGHTNING 1"         "TSTM WIND DAMAGE 1"               
[871] "TSTM WIND G45 1"                   "TSTM WIND G58 1"                  
[873] "TSTM WIND/HAIL 1028"               "TSTM WINDS 6"                     
[875] "TSTM WND 1"                        "TSTMW 1"                          
[877] "TSUNAMI 20"                        "TUNDERSTORM WIND 1"               
[879] "TYPHOON 11"                        "Unseasonable Cold 1"              
[881] "UNSEASONABLY COLD 23"              "UNSEASONABLY COOL & WET 2"        
[883] "UNSEASONABLY COOL 12"              "UNSEASONABLY DRY 56"              
[885] "UNSEASONABLY HOT 10"               "UNSEASONABLY WARM & WET 1"        
[887] "UNSEASONABLY WARM 126"             "UNSEASONABLY WARM AND DRY 13"     
[889] "UNSEASONABLY WARM YEAR 2"          "UNSEASONABLY WARM/WET 2"          
[891] "UNSEASONABLY WET 19"               "UNSEASONAL LOW TEMP 2"            
[893] "UNSEASONAL RAIN 2"                 "UNUSUAL WARMTH 10"                
[895] "UNUSUAL/RECORD WARMTH 2"           "UNUSUALLY COLD 8"                 
[897] "UNUSUALLY LATE SNOW 1"             "UNUSUALLY WARM 4"                 
[899] "URBAN AND SMALL 2"                 "URBAN AND SMALL STREAM 3"         
[901] "URBAN AND SMALL STREAM FLOOD 3"    "URBAN AND SMALL STREAM FLOODIN 6" 
[903] "Urban flood 1"                     "Urban Flood 1"                    
[905] "URBAN FLOOD 249"                   "URBAN FLOOD LANDSLIDE 1"          
[907] "Urban Flooding 1"                  "URBAN FLOODING 98"                
[909] "URBAN FLOODS 3"                    "URBAN SMALL 1"                    
[911] "URBAN SMALL STREAM FLOOD 2"        "URBAN/SMALL 2"                    
[913] "URBAN/SMALL FLOODING 1"            "URBAN/SMALL STREAM  FLOOD 2"      
[915] "URBAN/SMALL STREAM 8"              "URBAN/SMALL STREAM FLOOD 30"      
[917] "URBAN/SMALL STREAM FLOODING 4"     "URBAN/SMALL STRM FLDG 1"          
[919] "URBAN/SML STREAM FLD 3392"         "URBAN/SML STREAM FLDG 1"          
[921] "URBAN/STREET FLOODING 3"           "VERY DRY 2"                       
[923] "VERY WARM 1"                       "VOG 1"                            
[925] "Volcanic Ash 1"                    "VOLCANIC ASH 22"                  
[927] "Volcanic Ash Plume 1"              "VOLCANIC ASHFALL 3"               
[929] "VOLCANIC ERUPTION 2"               "WAKE LOW WIND 2"                  
[931] "WALL CLOUD 5"                      "WALL CLOUD/FUNNEL CLOUD 1"        
[933] "WARM DRY CONDITIONS 1"             "WARM WEATHER 1"                   
[935] "WATER SPOUT 1"                     "WATERSPOUT- 10"                   
[937] "WATERSPOUT-TORNADO 2"              "WATERSPOUT 3796"                  
[939] "WATERSPOUT FUNNEL CLOUD 1"         "WATERSPOUT TORNADO 1"             
[941] "WATERSPOUT/ 1"                     "WATERSPOUT/ TORNADO 2"            
[943] "WATERSPOUT/TORNADO 8"              "WATERSPOUTS 37"                   
[945] "WAYTERSPOUT 1"                     "wet micoburst 1"                  
[947] "WET MICROBURST 6"                  "Wet Month 4"                      
[949] "WET SNOW 1"                        "WET WEATHER 1"                    
[951] "Wet Year 4"                        "WHIRLWIND 1"                      
[953] "Whirlwind 2"                       "WILD FIRES 4"                     
[955] "WILD/FOREST FIRE 1457"             "WILD/FOREST FIRES 1"              
[957] "WILDFIRE 2761"                     "WILDFIRES 8"                      
[959] "WIND 340"                          "Wind 6"                           
[961] "WIND ADVISORY 12"                  "WIND AND WAVE 1"                  
[963] "WIND CHILL 18"                     "WIND CHILL/HIGH WIND 1"           
[965] "WIND DAMAGE 27"                    "Wind Damage 4"                    
[967] "WIND GUSTS 3"                      "WIND STORM 1"                     
[969] "WIND/HAIL 1"                       "WINDS 36"                         
[971] "WINTER MIX 3"                      "WINTER STORM 11433"               
[973] "WINTER STORM HIGH WINDS 1"         "WINTER STORM/HIGH WIND 1"         
[975] "WINTER STORM/HIGH WINDS 1"         "WINTER STORMS 3"                  
[977] "Winter Weather 19"                 "WINTER WEATHER 7026"              
[979] "WINTER WEATHER MIX 6"              "WINTER WEATHER/MIX 1104"          
[981] "WINTERY MIX 2"                     "Wintry Mix 1"                     
[983] "Wintry mix 3"                      "WINTRY MIX 90"                    
[985] "WND 1"                            

As the data shows, there is a “?” event we can choose to filter it out or include it in the report. We decided to include it since there is just one ocurrence. Let’s take a look at the PROPDMGEXP and PROPDMGEXP

ggplot(data=group_year_propdmgexp, aes(x=PROPDMGEXP, y=YEAR, size=count, color=count, alpha=0.7)) +
        geom_point()+
        scale_color_viridis_c( option='C', aesthetics = 'color')+
        scale_size_continuous( range = c(0, 20) )+
        ggtitle('YEAR Vs PROPDMGEXP')

ggplot(data=group_year_cropdmgexp, aes(x=CROPDMGEXP, y=YEAR, size=count, color=count, alpha=0.7)) +
        geom_point()+
        scale_color_viridis_c( option='C', aesthetics = 'color')+
        scale_size_continuous( range = c(0, 20) )+
        ggtitle('YEAR Vs CROPDMGEXP')

As shown in the graphs, there are years in which the magnitudes were registered with invalid characters. This affects the calculation of the damages. We will only consider ‘H’, ‘K’, ‘M’ ‘B’ as valid characters.

Results

Across the United States, which types of events (as indicated in the EVTYPE variable) are most harmful with respect to population health?

In order to answer this question, we need to calculate the total number of fatalities and injuries per year and event. Given that there is a lot of data, we take a top 100 for fatalities and another top 100 for injuries

nframes and fps adjusted to match transition

Frame 1 (1%)
Frame 2 (3%)
Frame 3 (5%)
Frame 4 (7%)
Frame 5 (9%)
Frame 6 (11%)
Frame 7 (13%)
Frame 8 (15%)
Frame 9 (17%)
Frame 10 (19%)
Frame 11 (21%)
Frame 12 (23%)
Frame 13 (25%)
Frame 14 (27%)
Frame 15 (29%)
Frame 16 (31%)
Frame 17 (33%)
Frame 18 (35%)
Frame 19 (37%)
Frame 20 (39%)
Frame 21 (41%)
Frame 22 (43%)
Frame 23 (45%)
Frame 24 (47%)
Frame 25 (49%)
Frame 26 (50%)
Frame 27 (52%)
Frame 28 (54%)
Frame 29 (56%)
Frame 30 (58%)
Frame 31 (60%)
Frame 32 (62%)
Frame 33 (64%)
Frame 34 (66%)
Frame 35 (68%)
Frame 36 (70%)
Frame 37 (72%)
Frame 38 (74%)
Frame 39 (76%)
Frame 40 (78%)
Frame 41 (80%)
Frame 42 (82%)
Frame 43 (84%)
Frame 44 (86%)
Frame 45 (88%)
Frame 46 (90%)
Frame 47 (92%)
Frame 48 (94%)
Frame 49 (96%)
Frame 50 (98%)
Frame 51 (100%)
Finalizing encoding... done!

Frame 1 (1%)
Frame 2 (3%)
Frame 3 (4%)
Frame 4 (6%)
Frame 5 (8%)
Frame 6 (9%)
Frame 7 (11%)
Frame 8 (12%)
Frame 9 (14%)
Frame 10 (16%)
Frame 11 (17%)
Frame 12 (19%)
Frame 13 (20%)
Frame 14 (22%)
Frame 15 (24%)
Frame 16 (25%)
Frame 17 (27%)
Frame 18 (29%)
Frame 19 (30%)
Frame 20 (32%)
Frame 21 (33%)
Frame 22 (35%)
Frame 23 (37%)
Frame 24 (38%)
Frame 25 (40%)
Frame 26 (41%)
Frame 27 (43%)
Frame 28 (45%)
Frame 29 (46%)
Frame 30 (48%)
Frame 31 (50%)
Frame 32 (51%)
Frame 33 (53%)
Frame 34 (54%)
Frame 35 (56%)
Frame 36 (58%)
Frame 37 (59%)
Frame 38 (61%)
Frame 39 (62%)
Frame 40 (64%)
Frame 41 (66%)
Frame 42 (67%)
Frame 43 (69%)
Frame 44 (70%)
Frame 45 (72%)
Frame 46 (74%)
Frame 47 (75%)
Frame 48 (77%)
Frame 49 (79%)
Frame 50 (80%)
Frame 51 (82%)
Frame 52 (83%)
Frame 53 (85%)
Frame 54 (87%)
Frame 55 (88%)
Frame 56 (90%)
Frame 57 (91%)
Frame 58 (93%)
Frame 59 (95%)
Frame 60 (96%)
Frame 61 (98%)
Frame 62 (100%)
Finalizing encoding... done!

Let’s see the graphs:

Data source: Top 100 most harmful events with respect to population health by fatalities

Data source: Top 100 most harmful events with respect to population health by fatalities

As the graph shows, the most harmful events by fatalities are tornadoes, heat and excessive heat. The next table shows these events at the top:

print(tbl_fatalities)
Data source: Top 100 most harmful events with respect to population health by injuries

Data source: Top 100 most harmful events with respect to population health by injuries

As the graph shows, the most harmful events by injuries are tornadoes, flood and ice storm. The next table shows these events at the top:

print(tbl_injuries)

Across the United States, which types of events have the greatest economic consequences?

Let’s calculate the damages first. As we said earlier we will only consider ‘H’, ‘K’, ‘M’ ‘B’ as valid characters:

processed_data <- processed_data %>% mutate( PROPDMGEXP = toupper( PROPDMGEXP ),
                                             CROPDMGEXP = toupper( CROPDMGEXP )
                                        )
processed_data <- processed_data %>%
                    mutate(
                            PROPDMG_AMOUNT = if_else(processed_data$PROPDMGEXP=='H', PROPDMG * 100,
                                                if_else(processed_data$PROPDMGEXP=='K', PROPDMG * 1000,
                                                    if_else(processed_data$PROPDMGEXP=='M', PROPDMG * 1000000,
                                                        if_else(processed_data$PROPDMGEXP=='B', PROPDMG * 1000000000, 0))))

                            ,CROPDMG_AMOUNT = if_else(processed_data$PROPDMGEXP=='H', CROPDMG * 100,
                                                if_else(processed_data$PROPDMGEXP=='K', CROPDMG * 1000,
                                                    if_else(processed_data$PROPDMGEXP=='M', CROPDMG * 1000000,
                                                        if_else(processed_data$PROPDMGEXP=='B', CROPDMG * 1000000000, 0))))
                    )

group_damages <- processed_data %>% 
                    group_by(YEAR, EVTYPE) %>%
                    summarise(
                                count=n(), 
                                property_damage=sum( PROPDMG_AMOUNT ), 
                                crop_damage=sum( CROPDMG_AMOUNT )  
                            )
#Top 100 Events by property damage
top_100_property_damages<-top_n(as.data.frame(group_damages), 100,property_damage)

g<-ggplot(
            data=top_100_property_damages, 
            aes(x=EVTYPE, y=YEAR, size=property_damage, color=property_damage, alpha=0.7)
          ) +
        geom_point()+
        scale_size_continuous( range = c(0, 20) )+
        theme(axis.text.x = element_text(angle = 90)) +
        scale_color_viridis_c( option='C', aesthetics = 'color')+
        labs(title = "Year Vs Events",
             subtitle ="Year: {current_frame}"
             ) +
        transition_manual(frames=YEAR, cumulative=TRUE)+
        ease_aes('exponential -out')

g
nframes and fps adjusted to match transition

Frame 1 (2%)
Frame 2 (5%)
Frame 3 (7%)
Frame 4 (10%)
Frame 5 (12%)
Frame 6 (15%)
Frame 7 (17%)
Frame 8 (20%)
Frame 9 (22%)
Frame 10 (25%)
Frame 11 (27%)
Frame 12 (30%)
Frame 13 (32%)
Frame 14 (35%)
Frame 15 (37%)
Frame 16 (40%)
Frame 17 (42%)
Frame 18 (45%)
Frame 19 (47%)
Frame 20 (50%)
Frame 21 (52%)
Frame 22 (55%)
Frame 23 (57%)
Frame 24 (60%)
Frame 25 (62%)
Frame 26 (65%)
Frame 27 (67%)
Frame 28 (70%)
Frame 29 (72%)
Frame 30 (75%)
Frame 31 (77%)
Frame 32 (80%)
Frame 33 (82%)
Frame 34 (85%)
Frame 35 (87%)
Frame 36 (90%)
Frame 37 (92%)
Frame 38 (95%)
Frame 39 (97%)
Frame 40 (100%)
Finalizing encoding... done!
anim_save('property_damage.gif')

tbl_property_damage<-top_100_property_damages %>% 
    select('YEAR','EVTYPE','count','property_damage') %>% 
    arrange( desc(property_damage) )


#Top 100 Events by crop damage
top_100_crop_damages<-top_n(as.data.frame(group_damages), 100, crop_damage)

g<-ggplot(
            data=top_100_crop_damages, 
            aes(x=EVTYPE, y=YEAR, size=crop_damage, color=crop_damage, alpha=0.7)
          ) +
        geom_point()+
        scale_size_continuous( range = c(0, 20) )+
        theme(axis.text.x = element_text(angle = 90) ) +
        scale_color_viridis_c( option='C', aesthetics = 'color')+
        labs(title = "Year Vs Events",
             subtitle ="Year: {current_frame}"
             ) +
        transition_manual(frames=YEAR, cumulative=TRUE)+
        ease_aes('exponential -out')

g

Frame 1 (5%)
Frame 2 (10%)
Frame 3 (15%)
Frame 4 (21%)
Frame 5 (26%)
Frame 6 (31%)
Frame 7 (36%)
Frame 8 (42%)
Frame 9 (47%)
Frame 10 (52%)
Frame 11 (57%)
Frame 12 (63%)
Frame 13 (68%)
Frame 14 (73%)
Frame 15 (78%)
Frame 16 (84%)
Frame 17 (89%)
Frame 18 (94%)
Frame 19 (100%)
Finalizing encoding... done!
anim_save('crop_damage.gif')

tbl_crop_damage<-top_100_crop_damages %>% 
    select('YEAR','EVTYPE','count','crop_damage') %>% 
    arrange( desc(crop_damage) )
Data source: Top 100 events which causes the greatest property damage

Data source: Top 100 events which causes the greatest property damage

As the graph shows, the events with most greatest economic consequences for property are flood, hurricane/typhoon and storm surge. The next table shows these events at the top:

print(tbl_property_damage)
Data source: Top 100 events which causes the greatest crop damage

Data source: Top 100 events which causes the greatest crop damage

As the graph shows, the events with most greatest economic consequences for crops are hurricane, hurricane/typhoon and storm surge. The next table shows these events at the top:

print(tbl_crop_damage)
LS0tDQp0aXRsZTogVS5TLiBOYXRpb25hbCBPY2VhbmljIGFuZCBBdG1vc3BoZXJpYyBBZG1pbmlzdHJhdGlvbuKAmXMgKE5PQUEpIHN0b3JtIGRhdGFiYXNlDQogIGFuYWx5c2lzLg0Kb3V0cHV0Og0KICBodG1sX25vdGVib29rOiBkZWZhdWx0DQogIHBkZl9kb2N1bWVudDogZGVmYXVsdA0KLS0tDQoNCiMjIEludHJvZHVjdGlvbg0KDQojIyMgT3ZlcnZpZXcNCg0KU3Rvcm1zIGFuZCBvdGhlciB3ZWF0aGVyIGV2ZW50cyBjYW4gY2F1c2UgYm90aCBwdWJsaWMgaGVhbHRoIGFuZCBlY29ub21pYyBwcm9ibGVtcyBmb3IgY29tbXVuaXRpZXMgYW5kIG11bmljaXBhbGl0aWVzLiBNYW55IHNldmVyZSBldmVudHMgY2FuIHJlc3VsdCBpbiBmYXRhbGl0aWVzLCBpbmp1cmllcywgYW5kIHByb3BlcnR5IGRhbWFnZSwgYW5kIHByZXZlbnRpbmcgc3VjaCBvdXRjb21lcyB0byB0aGUgZXh0ZW50IHBvc3NpYmxlIGlzIGEga2V5IGNvbmNlcm4uDQoNCiMjIyBOT0FBIFN0b3JtIERhdGENCg0KSW4gdGhpcyByZXBvcnQsIHRoZSBtYWpvciB3ZWF0aGVyIGV2ZW50cyBmcm9tIGFyb3VuZCB0aGUgVVMgYXJlIGludmVzdGlnYXRlZC4gDQpUaGUgZXZlbnRzIGluIHRoZSBkYXRhYmFzZSBzdGFydCBpbiB0aGUgeWVhciAxOTUwIGFuZCBlbmQgaW4gTm92ZW1iZXIgMjAxMS4gSW4gdGhlIGVhcmxpZXIgeWVhcnMgb2YgdGhlIGRhdGFiYXNlIHRoZXJlIGFyZSBnZW5lcmFsbHkgZmV3ZXIgZXZlbnRzIHJlY29yZGVkLCBtb3N0IGxpa2VseSBkdWUgdG8gYSBsYWNrIG9mIGdvb2QgcmVjb3Jkcy4gTW9yZSByZWNlbnQgeWVhcnMgc2hvdWxkIGJlIGNvbnNpZGVyZWQgbW9yZSBjb21wbGV0ZS4NCg0KSW5mb3JtYXRpb24gYWJvdXQgdGhlIFN0b3JtIERhdGEgY2FuIGJlIGZvdW5kIGZyb20gdGhlIGZvbGxvd2luZyBsaW5rczoNCg0KW05hdGlvbmFsIFdlYXRoZXIgU2VydmljZSBTdG9ybSBEYXRhIERvY3VtZW50YXRpb25dKGh0dHBzOi8vZDM5NnF1c3phNDBvcmMuY2xvdWRmcm9udC5uZXQvcmVwZGF0YSUyRnBlZXIyX2RvYyUyRnBkMDEwMTYwMDVjdXJyLnBkZiksIGFuZA0KDQpbTmF0aW9uYWwgQ2xpbWF0aWMgRGF0YSBDZW50ZXIgU3Rvcm0gRXZlbnRzIEZBUV0oaHR0cHM6Ly9kMzk2cXVzemE0MG9yYy5jbG91ZGZyb250Lm5ldC9yZXBkYXRhJTJGcGVlcjJfZG9jJTJGTkNEQyUyMFN0b3JtJTIwRXZlbnRzLUZBUSUyMFBhZ2UucGRmKQ0KDQoNCiMjIyBLZXkgQ29uY2VybnMNCg0KVGhlIGZpcnN0IHBhcnQgb2YgdGhlIHN0dWR5IGZvY3VzZXMgb24gdGhlIG51bWJlciBvZiBodW1hbiBmYXRhbGl0aWVzIGFuZCB0aGUgbnVtYmVyIG9mIGh1bWFuIGluanVyaWVzIHRoYXQgd2VyZSBjb25zZXF1ZW5jZXMgb2Ygd2VhdGhlciBldmVudHMuIFRoZSBzZWNvbmQgcGFydCBvZiB0aGUgYW5hbHlzaXMgaW52ZXN0aWdhdGVzIHRoZSBlY29ub21pYyBpbXBhY3QgdGhhdCB3ZWF0aGVyIGV2ZW50cyBoYXZlIG9uIHByb3BlcnR5IGFuZCBjcm9wcy4gDQoNCg0KIyMgRGF0YSBQcm9jZXNzaW5nDQoNCiMjIyBPYnRhaW5pbmcgdGhlIGRhdGENCg0KU3Rvcm0gZGF0YSBpcyBjb250YWluZWQgaW4gYSBiejIgZmlsZSBpbiBbY2xvdWRmcm9udF0oaHR0cHM6Ly9kMzk2cXVzemE0MG9yYy5jbG91ZGZyb250Lm5ldC9yZXBkYXRhJTJGZGF0YSUyRlN0b3JtRGF0YS5jc3YuYnoyKSwgYWZ0ZXIgZG93bmxvYWRpbmcgdGhlIGJ6MiBmaWxlLCB0aGUgY29udGVudHMgYXJlIHN0b3JlZCBpbiBhIGRhdGEgZnJhbWUgY2FsbGVkIOKAnHJhd19kYXRh4oCdLg0KDQpgYGB7ciBzZXR1cCwgaW5jbHVkZT1GQUxTRX0NCmtuaXRyOjpvcHRzX2NodW5rJHNldChlY2hvID0gVFJVRSwgZmlnLndpZHRoPTEyLCBmaWcuaGVpZ2h0ID0gMTIpDQpvcHRpb25zKHNjaXBlbj0xMDAwMCkNCmBgYA0KDQpgYGB7ciwgY2FjaGU9VFJVRX0NCmlmKCBucm93KHN1YnNldChhcy5kYXRhLmZyYW1lKGluc3RhbGxlZC5wYWNrYWdlcygpICksIFBhY2thZ2UgPT0gJ2RwbHlyJykpICl7DQogICAgI2RvIG5vdGhpbmcNCiB9IGVsc2V7DQogICAgIGluc3RhbGwucGFja2FnZXMoJ2RwbHlyJykNCn0NCmlmKCBucm93KHN1YnNldChhcy5kYXRhLmZyYW1lKGluc3RhbGxlZC5wYWNrYWdlcygpICksIFBhY2thZ2UgPT0gJ2dncGxvdDInKSkgKXsNCiAgICAjZG8gbm90aGluZw0KIH0gZWxzZXsNCiAgICAgaW5zdGFsbC5wYWNrYWdlcygnZ2dwbG90MicpDQp9DQppZiggbnJvdyhzdWJzZXQoYXMuZGF0YS5mcmFtZShpbnN0YWxsZWQucGFja2FnZXMoKSApLCBQYWNrYWdlID09ICdnZ2FuaW1hdGUnKSkgKXsNCiAgICAjZG8gbm90aGluZw0KIH0gZWxzZXsNCiAgICAgZGV2dG9vbHM6Omluc3RhbGxfZ2l0aHViKCd0aG9tYXNwODUvZ2dhbmltYXRlJykNCn0NCmxpYnJhcnkoJ2RwbHlyJykNCmxpYnJhcnkoJ2dncGxvdDInKQ0KbGlicmFyeSgnZ2dhbmltYXRlJykNCg0KaWYoIWZpbGUuZXhpc3RzKCdyZXBkYXRhX2RhdGFfU3Rvcm1EYXRhLmNzdi5iejInKSl7DQogICAgZG93bmxvYWQuZmlsZSh1cmw9J2h0dHBzOi8vZDM5NnF1c3phNDBvcmMuY2xvdWRmcm9udC5uZXQvcmVwZGF0YSUyRmRhdGElMkZTdG9ybURhdGEuY3N2LmJ6MicsIA0KICAgICAgICAgICAgICAgIGRlc3RmaWxlID0gJ3JlcGRhdGFfZGF0YV9TdG9ybURhdGEuY3N2LmJ6MicpDQp9DQoNCnJhd19kYXRhPC0gcmVhZC50YWJsZShmaWxlPSdyZXBkYXRhX2RhdGFfU3Rvcm1EYXRhLmNzdi5iejInLCBzZXA9JywnLCBoZWFkZXI9VFJVRSwgc3RyaW5nc0FzRmFjdG9ycyA9IEZBTFNFLCBuYS5zdHJpbmdzID0gJ05BJykNCnN0cihyYXdfZGF0YSkNCg0KYGBgDQoNCiMjIyBFeHBsb3JpbmcgdGhlIGRhdGENCg0KYGBge3J9DQpkaW0ocmF3X2RhdGEpDQpgYGANCg0KVGhlIGRhdGFzZXQgaGF2ZSA5MDIyOTcgcm93cyBhbmQgMzcgY29sdW1ucy4gTGV0J3Mgc2VlIHRoZSBzdHJ1Y3R1cmU6DQoNCmBgYHtyfQ0Kc3RyKHJhd19kYXRhKQ0KYGBgDQoNCk91ciBkYXRhIG9mIGludGVyZXN0IGFyZTogDQoNCi0gQkdOX0RBVEU6IFRoZSBkYXRlIG9mIHRoZSBldmVudA0KLSBFVlRZUEU6IFRoZSBldmVudCB0eXBlDQotIEZBVEFMSVRJRVM6IFRoZSBudW1iZXIgb2YgZGVhZHMNCi0gSU5KVVJJRVM6IFRoZSBudW1iZXIgb2YgaW5qdXJpZXMgcGVvcGxlDQotIFBST1BETUc6IFByb3BlcnR5IGRhbWFnZQ0KLSBQUk9QRE1HRVhQOiBBbHBoYWJldGljYWwgY2hhcmFjdGVycyB1c2VkIHRvIHNpZ25pZnkgbWFnbml0dWRlIGZvciBwcm9wZXJ0eSBkYW1hZ2UuIEluY2x1ZGUg4oCcS+KAnSBmb3IgdGhvdXNhbmRzLCDigJxN4oCdIGZvciBtaWxsaW9ucywgYW5kIOKAnELigJ0gZm9yIGJpbGxpb25zLiANCi0gQ1JPUERNRzogQ3JvcCBkYW1hZ2UNCi0gQ1JPUERNR0VYUDogQWxwaGFiZXRpY2FsIGNoYXJhY3RlcnMgdXNlZCB0byBzaWduaWZ5IG1hZ25pdHVkZSBmb3IgY3JvcCBkYW1hZ2UNCg0KTGV0J3MgZXhwbG9yZSBFVlRZUEUsIFBST1BETUdFWFAgYW5kIENST1BETUdFWFANCg0KYGBge3J9DQpjb2x1bW5zPC0gYygnQkdOX0RBVEUnLCdFVlRZUEUnLCdGQVRBTElUSUVTJywnSU5KVVJJRVMnLCdQUk9QRE1HJywnUFJPUERNR0VYUCcsJ0NST1BETUcnLCdDUk9QRE1HRVhQJykNCg0KcHJvY2Vzc2VkX2RhdGEgPC0gcmF3X2RhdGEgJT4lIA0KICAgICAgICAgICAgICAgICAgICBzZWxlY3QoIGNvbHVtbnMgKSAlPiUNCiAgICAgICAgICAgICAgICAgICAgbXV0YXRlKA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFlFQVI9YXMubnVtZXJpYyhzdWJzdHJpbmcoYXMuRGF0ZShCR05fREFURSwgZm9ybWF0PSclbS8lZC8lWScpLCAxLCA0KSApIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgKQ0KDQojRXZlbnQgdHlwZXMNCmdyb3VwX2V2dHlwZSA8LSBwcm9jZXNzZWRfZGF0YSAlPiUgDQogICAgICAgICAgICAgICAgICAgICAgICBncm91cF9ieShFVlRZUEUpICU+JQ0KICAgICAgICAgICAgICAgICAgICAgICAgc3VtbWFyaXNlKA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ9bigpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG90YWxfZmF0YWxpdGllcz1zdW0oRkFUQUxJVElFUyksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b3RhbF9pbmp1cmllcz1zdW0oSU5KVVJJRVMpDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkNCg0KI1Byb3BlcnR5IGRhbWFnZQ0KZ3JvdXBfeWVhcl9wcm9wZG1nZXhwIDwtIHByb2Nlc3NlZF9kYXRhICU+JSANCiAgICAgICAgICAgICAgICAgICAgICAgIGdyb3VwX2J5KFlFQVIsIFBST1BETUdFWFApICU+JQ0KICAgICAgICAgICAgICAgICAgICAgICAgc3VtbWFyaXNlKGNvdW50PW4oKSAgKQ0KDQojQ3JvcCBkYW1hZ2UNCmdyb3VwX3llYXJfY3JvcGRtZ2V4cCA8LSBwcm9jZXNzZWRfZGF0YSAlPiUgDQogICAgICAgICAgICAgICAgICAgICAgICBncm91cF9ieShZRUFSLCBDUk9QRE1HRVhQKSAlPiUNCiAgICAgICAgICAgICAgICAgICAgICAgIHN1bW1hcmlzZShjb3VudD1uKCkgICkNCg0KI0xldCdzIHNob3cgdGhlIGRpZmZlcmVudCBldmVudCB0eXBlcyBhbmQgdGhlaXIgYXNzb2NpYXRlZCBvY2N1cnJlbmNlcw0Kc29ydCggdW5pcXVlKCB3aXRoKCBncm91cF9ldnR5cGUsIHBhc3RlKCBFVlRZUEUsIGNvdW50ICkgKSApICkNCg0KYGBgDQoNCkFzIHRoZSBkYXRhIHNob3dzLCB0aGVyZSBpcyBhICI/IiBldmVudCB3ZSBjYW4gY2hvb3NlIHRvIGZpbHRlciBpdCBvdXQgb3IgaW5jbHVkZSBpdCBpbiB0aGUgcmVwb3J0LiBXZSBkZWNpZGVkIHRvIGluY2x1ZGUgaXQgc2luY2UgdGhlcmUgaXMganVzdCBvbmUgb2N1cnJlbmNlLiBMZXQncyB0YWtlIGEgbG9vayBhdCB0aGUgUFJPUERNR0VYUCBhbmQgUFJPUERNR0VYUA0KDQpgYGB7cn0NCmdncGxvdChkYXRhPWdyb3VwX3llYXJfcHJvcGRtZ2V4cCwgYWVzKHg9UFJPUERNR0VYUCwgeT1ZRUFSLCBzaXplPWNvdW50LCBjb2xvcj1jb3VudCwgYWxwaGE9MC43KSkgKw0KICAgICAgICBnZW9tX3BvaW50KCkrDQogICAgICAgIHNjYWxlX2NvbG9yX3ZpcmlkaXNfYyggb3B0aW9uPSdDJywgYWVzdGhldGljcyA9ICdjb2xvcicpKw0KICAgICAgICBzY2FsZV9zaXplX2NvbnRpbnVvdXMoIHJhbmdlID0gYygwLCAyMCkgKSsNCiAgICAgICAgZ2d0aXRsZSgnWUVBUiBWcyBQUk9QRE1HRVhQJykNCmBgYA0KDQpgYGB7cn0NCmdncGxvdChkYXRhPWdyb3VwX3llYXJfY3JvcGRtZ2V4cCwgYWVzKHg9Q1JPUERNR0VYUCwgeT1ZRUFSLCBzaXplPWNvdW50LCBjb2xvcj1jb3VudCwgYWxwaGE9MC43KSkgKw0KICAgICAgICBnZW9tX3BvaW50KCkrDQogICAgICAgIHNjYWxlX2NvbG9yX3ZpcmlkaXNfYyggb3B0aW9uPSdDJywgYWVzdGhldGljcyA9ICdjb2xvcicpKw0KICAgICAgICBzY2FsZV9zaXplX2NvbnRpbnVvdXMoIHJhbmdlID0gYygwLCAyMCkgKSsNCiAgICAgICAgZ2d0aXRsZSgnWUVBUiBWcyBDUk9QRE1HRVhQJykNCg0KYGBgDQoNCkFzIHNob3duIGluIHRoZSBncmFwaHMsIHRoZXJlIGFyZSB5ZWFycyBpbiB3aGljaCB0aGUgbWFnbml0dWRlcyB3ZXJlIHJlZ2lzdGVyZWQgd2l0aCBpbnZhbGlkIGNoYXJhY3RlcnMuIFRoaXMgYWZmZWN0cyB0aGUgY2FsY3VsYXRpb24gb2YgdGhlIGRhbWFnZXMuIFdlIHdpbGwgb25seSBjb25zaWRlciAnSCcsICdLJywgJ00nICdCJyBhcyB2YWxpZCBjaGFyYWN0ZXJzLg0KDQojIyBSZXN1bHRzDQoNCiMjIyBBY3Jvc3MgdGhlIFVuaXRlZCBTdGF0ZXMsIHdoaWNoIHR5cGVzIG9mIGV2ZW50cyAoYXMgaW5kaWNhdGVkIGluIHRoZSBFVlRZUEUgdmFyaWFibGUpIGFyZSBtb3N0IGhhcm1mdWwgd2l0aCByZXNwZWN0IHRvIHBvcHVsYXRpb24gaGVhbHRoPw0KDQpJbiBvcmRlciB0byBhbnN3ZXIgdGhpcyBxdWVzdGlvbiwgd2UgbmVlZCB0byBjYWxjdWxhdGUgdGhlIHRvdGFsIG51bWJlciBvZiBmYXRhbGl0aWVzIGFuZCBpbmp1cmllcyBwZXIgeWVhciBhbmQgZXZlbnQuIEdpdmVuIHRoYXQgdGhlcmUgaXMgYSBsb3Qgb2YgZGF0YSwgd2UgdGFrZSBhIHRvcCAxMDAgZm9yIGZhdGFsaXRpZXMgYW5kIGFub3RoZXIgdG9wIDEwMCBmb3IgaW5qdXJpZXMNCg0KYGBge3IsIGVjaG89RkFMU0V9DQojRXZlbnQgdHlwZXMNCmdyb3VwX3llYXJfZXZ0eXBlIDwtIHByb2Nlc3NlZF9kYXRhICU+JSANCiAgICAgICAgICAgICAgICAgICAgICAgIGdyb3VwX2J5KFlFQVIsIEVWVFlQRSkgJT4lDQogICAgICAgICAgICAgICAgICAgICAgICBzdW1tYXJpc2UoDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudD1uKCksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b3RhbF9mYXRhbGl0aWVzPXN1bShGQVRBTElUSUVTKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvdGFsX2luanVyaWVzPXN1bShJTkpVUklFUykgIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkNCg0KI1RvcCAxMDAgZXZlbnRzIGluIGFsbCBoaXN0b3J5IGJ5IGZhdGFsaXRpZXMNCnRvcF8xMDBfZmF0YWxpdGllczwtdG9wX24oYXMuZGF0YS5mcmFtZShncm91cF95ZWFyX2V2dHlwZSksIDEwMCx0b3RhbF9mYXRhbGl0aWVzKQ0KDQpnPC1nZ3Bsb3QoDQogICAgICAgICAgICBkYXRhPXRvcF8xMDBfZmF0YWxpdGllcywgDQogICAgICAgICAgICBhZXMoeD1FVlRZUEUsIHk9WUVBUiwgc2l6ZT10b3RhbF9mYXRhbGl0aWVzLCBjb2xvcj10b3RhbF9mYXRhbGl0aWVzLCBhbHBoYT0wLjcpDQogICAgICAgICAgKSArDQogICAgICAgIGdlb21fcG9pbnQoKSsNCiAgICAgICAgc2NhbGVfc2l6ZV9jb250aW51b3VzKCByYW5nZSA9IGMoMCwgMjApICkrDQogICAgICAgIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gOTApKSArDQogICAgICAgIHNjYWxlX2NvbG9yX3ZpcmlkaXNfYyggb3B0aW9uPSdDJywgYWVzdGhldGljcyA9ICdjb2xvcicpKw0KICAgICAgICBsYWJzKHRpdGxlID0gIlllYXIgVnMgRXZlbnRzIiwNCiAgICAgICAgICAgICBzdWJ0aXRsZSA9IlllYXI6IHtjdXJyZW50X2ZyYW1lfSINCiAgICAgICAgICAgICApICsNCiAgICAgICAgdHJhbnNpdGlvbl9tYW51YWwoZnJhbWVzPVlFQVIsIGN1bXVsYXRpdmU9VFJVRSkrDQogICAgICAgIGVhc2VfYWVzKCdleHBvbmVudGlhbCAtb3V0JykNCg0KZw0KYW5pbV9zYXZlKCdmYXRhbGl0aWVzLmdpZicpDQoNCnRibF9mYXRhbGl0aWVzPC10b3BfMTAwX2ZhdGFsaXRpZXMgJT4lIA0KICAgIHNlbGVjdCgnWUVBUicsJ0VWVFlQRScsJ2NvdW50JywndG90YWxfZmF0YWxpdGllcycpICU+JSANCiAgICBhcnJhbmdlKCBkZXNjKHRvdGFsX2ZhdGFsaXRpZXMpICkNCg0KDQojVG9wIDEwMCBldmVudHMgaW4gYWxsIGhpc3RvcnkgYnkgaW5qdXJpZXMNCnRvcF8xMDBfaW5qdXJpZXM8LXRvcF9uKGFzLmRhdGEuZnJhbWUoZ3JvdXBfeWVhcl9ldnR5cGUpLCAxMDAsdG90YWxfaW5qdXJpZXMpDQpnPC1nZ3Bsb3QoDQogICAgICAgICAgICBkYXRhPXRvcF8xMDBfaW5qdXJpZXMsIA0KICAgICAgICAgICAgYWVzKHg9RVZUWVBFLCB5PVlFQVIsIHNpemU9dG90YWxfaW5qdXJpZXMsIGNvbG9yPXRvdGFsX2luanVyaWVzLCBhbHBoYT0wLjcpDQogICAgICAgICAgKSArDQogICAgICAgIGdlb21fcG9pbnQoKSsNCiAgICAgICAgc2NhbGVfc2l6ZV9jb250aW51b3VzKCByYW5nZSA9IGMoMCwgMjApICkrDQogICAgICAgIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gOTApKSArDQogICAgICAgIHNjYWxlX2NvbG9yX3ZpcmlkaXNfYyggb3B0aW9uPSdDJywgYWVzdGhldGljcyA9ICdjb2xvcicpKw0KICAgICAgICBsYWJzKHRpdGxlID0gIlllYXIgVnMgRXZlbnRzIiwNCiAgICAgICAgICAgICBzdWJ0aXRsZSA9IlllYXI6IHtjdXJyZW50X2ZyYW1lfSINCiAgICAgICAgICAgICApICsNCiAgICAgICAgdHJhbnNpdGlvbl9tYW51YWwoZnJhbWVzPVlFQVIsIGN1bXVsYXRpdmU9VFJVRSkrDQogICAgICAgIGVhc2VfYWVzKCdleHBvbmVudGlhbCAtb3V0JykNCg0KZw0KYW5pbV9zYXZlKCdpbmp1cmllcy5naWYnKQ0KDQp0YmxfaW5qdXJpZXM8LXRvcF8xMDBfaW5qdXJpZXMgJT4lIA0KICAgIHNlbGVjdCgnWUVBUicsJ0VWVFlQRScsJ2NvdW50JywndG90YWxfaW5qdXJpZXMnKSAlPiUgDQogICAgYXJyYW5nZSggZGVzYyh0b3RhbF9pbmp1cmllcykgKQ0KDQpgYGANCg0KTGV0J3Mgc2VlIHRoZSBncmFwaHM6DQoNCiFbRGF0YSBzb3VyY2U6IFRvcCAxMDAgbW9zdCBoYXJtZnVsIGV2ZW50cyB3aXRoIHJlc3BlY3QgdG8gcG9wdWxhdGlvbiBoZWFsdGggYnkgZmF0YWxpdGllc10oZmF0YWxpdGllcy5naWYpDQoNCg0KQXMgdGhlIGdyYXBoIHNob3dzLCB0aGUgbW9zdCBoYXJtZnVsIGV2ZW50cyBieSBmYXRhbGl0aWVzIGFyZSB0b3JuYWRvZXMsIGhlYXQgYW5kIGV4Y2Vzc2l2ZSBoZWF0LiBUaGUgbmV4dCB0YWJsZSBzaG93cyB0aGVzZSBldmVudHMgYXQgdGhlIHRvcDoNCmBgYHtyfQ0KcHJpbnQodGJsX2ZhdGFsaXRpZXMpDQpgYGANCg0KIVtEYXRhIHNvdXJjZTogVG9wIDEwMCBtb3N0IGhhcm1mdWwgZXZlbnRzIHdpdGggcmVzcGVjdCB0byBwb3B1bGF0aW9uIGhlYWx0aCBieSBpbmp1cmllc10oaW5qdXJpZXMuZ2lmKQ0KDQpBcyB0aGUgZ3JhcGggc2hvd3MsIHRoZSBtb3N0IGhhcm1mdWwgZXZlbnRzIGJ5IGluanVyaWVzIGFyZSB0b3JuYWRvZXMsIGZsb29kIGFuZCBpY2Ugc3Rvcm0uIFRoZSBuZXh0IHRhYmxlIHNob3dzIHRoZXNlIGV2ZW50cyBhdCB0aGUgdG9wOg0KDQpgYGB7cn0NCnByaW50KHRibF9pbmp1cmllcykNCmBgYA0KDQojIyMgQWNyb3NzIHRoZSBVbml0ZWQgU3RhdGVzLCB3aGljaCB0eXBlcyBvZiBldmVudHMgaGF2ZSB0aGUgZ3JlYXRlc3QgZWNvbm9taWMgY29uc2VxdWVuY2VzPw0KDQpMZXQncyBjYWxjdWxhdGUgdGhlIGRhbWFnZXMgZmlyc3QuIEFzIHdlIHNhaWQgZWFybGllciB3ZSB3aWxsIG9ubHkgY29uc2lkZXIgJ0gnLCAnSycsICdNJyAnQicgYXMgdmFsaWQgY2hhcmFjdGVyczoNCg0KYGBge3J9DQpwcm9jZXNzZWRfZGF0YSA8LSBwcm9jZXNzZWRfZGF0YSAlPiUgbXV0YXRlKCBQUk9QRE1HRVhQID0gdG91cHBlciggUFJPUERNR0VYUCApLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1JPUERNR0VYUCA9IHRvdXBwZXIoIENST1BETUdFWFAgKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkNCnByb2Nlc3NlZF9kYXRhIDwtIHByb2Nlc3NlZF9kYXRhICU+JQ0KICAgICAgICAgICAgICAgICAgICBtdXRhdGUoDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgUFJPUERNR19BTU9VTlQgPSBpZl9lbHNlKHByb2Nlc3NlZF9kYXRhJFBST1BETUdFWFA9PSdIJywgUFJPUERNRyAqIDEwMCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmX2Vsc2UocHJvY2Vzc2VkX2RhdGEkUFJPUERNR0VYUD09J0snLCBQUk9QRE1HICogMTAwMCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZl9lbHNlKHByb2Nlc3NlZF9kYXRhJFBST1BETUdFWFA9PSdNJywgUFJPUERNRyAqIDEwMDAwMDAsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmX2Vsc2UocHJvY2Vzc2VkX2RhdGEkUFJPUERNR0VYUD09J0InLCBQUk9QRE1HICogMTAwMDAwMDAwMCwgMCkpKSkNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICxDUk9QRE1HX0FNT1VOVCA9IGlmX2Vsc2UocHJvY2Vzc2VkX2RhdGEkUFJPUERNR0VYUD09J0gnLCBDUk9QRE1HICogMTAwLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZfZWxzZShwcm9jZXNzZWRfZGF0YSRQUk9QRE1HRVhQPT0nSycsIENST1BETUcgKiAxMDAwLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmX2Vsc2UocHJvY2Vzc2VkX2RhdGEkUFJPUERNR0VYUD09J00nLCBDUk9QRE1HICogMTAwMDAwMCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZfZWxzZShwcm9jZXNzZWRfZGF0YSRQUk9QRE1HRVhQPT0nQicsIENST1BETUcgKiAxMDAwMDAwMDAwLCAwKSkpKQ0KICAgICAgICAgICAgICAgICAgICApDQoNCmdyb3VwX2RhbWFnZXMgPC0gcHJvY2Vzc2VkX2RhdGEgJT4lIA0KICAgICAgICAgICAgICAgICAgICBncm91cF9ieShZRUFSLCBFVlRZUEUpICU+JQ0KICAgICAgICAgICAgICAgICAgICBzdW1tYXJpc2UoDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50PW4oKSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnR5X2RhbWFnZT1zdW0oIFBST1BETUdfQU1PVU5UICksIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcm9wX2RhbWFnZT1zdW0oIENST1BETUdfQU1PVU5UICkgIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICkNCiNUb3AgMTAwIEV2ZW50cyBieSBwcm9wZXJ0eSBkYW1hZ2UNCnRvcF8xMDBfcHJvcGVydHlfZGFtYWdlczwtdG9wX24oYXMuZGF0YS5mcmFtZShncm91cF9kYW1hZ2VzKSwgMTAwLHByb3BlcnR5X2RhbWFnZSkNCg0KZzwtZ2dwbG90KA0KICAgICAgICAgICAgZGF0YT10b3BfMTAwX3Byb3BlcnR5X2RhbWFnZXMsIA0KICAgICAgICAgICAgYWVzKHg9RVZUWVBFLCB5PVlFQVIsIHNpemU9cHJvcGVydHlfZGFtYWdlLCBjb2xvcj1wcm9wZXJ0eV9kYW1hZ2UsIGFscGhhPTAuNykNCiAgICAgICAgICApICsNCiAgICAgICAgZ2VvbV9wb2ludCgpKw0KICAgICAgICBzY2FsZV9zaXplX2NvbnRpbnVvdXMoIHJhbmdlID0gYygwLCAyMCkgKSsNCiAgICAgICAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA5MCkpICsNCiAgICAgICAgc2NhbGVfY29sb3JfdmlyaWRpc19jKCBvcHRpb249J0MnLCBhZXN0aGV0aWNzID0gJ2NvbG9yJykrDQogICAgICAgIGxhYnModGl0bGUgPSAiWWVhciBWcyBFdmVudHMiLA0KICAgICAgICAgICAgIHN1YnRpdGxlID0iWWVhcjoge2N1cnJlbnRfZnJhbWV9Ig0KICAgICAgICAgICAgICkgKw0KICAgICAgICB0cmFuc2l0aW9uX21hbnVhbChmcmFtZXM9WUVBUiwgY3VtdWxhdGl2ZT1UUlVFKSsNCiAgICAgICAgZWFzZV9hZXMoJ2V4cG9uZW50aWFsIC1vdXQnKQ0KDQpnDQphbmltX3NhdmUoJ3Byb3BlcnR5X2RhbWFnZS5naWYnKQ0KDQp0YmxfcHJvcGVydHlfZGFtYWdlPC10b3BfMTAwX3Byb3BlcnR5X2RhbWFnZXMgJT4lIA0KICAgIHNlbGVjdCgnWUVBUicsJ0VWVFlQRScsJ2NvdW50JywncHJvcGVydHlfZGFtYWdlJykgJT4lIA0KICAgIGFycmFuZ2UoIGRlc2MocHJvcGVydHlfZGFtYWdlKSApDQoNCg0KI1RvcCAxMDAgRXZlbnRzIGJ5IGNyb3AgZGFtYWdlDQp0b3BfMTAwX2Nyb3BfZGFtYWdlczwtdG9wX24oYXMuZGF0YS5mcmFtZShncm91cF9kYW1hZ2VzKSwgMTAwLCBjcm9wX2RhbWFnZSkNCg0KZzwtZ2dwbG90KA0KICAgICAgICAgICAgZGF0YT10b3BfMTAwX2Nyb3BfZGFtYWdlcywgDQogICAgICAgICAgICBhZXMoeD1FVlRZUEUsIHk9WUVBUiwgc2l6ZT1jcm9wX2RhbWFnZSwgY29sb3I9Y3JvcF9kYW1hZ2UsIGFscGhhPTAuNykNCiAgICAgICAgICApICsNCiAgICAgICAgZ2VvbV9wb2ludCgpKw0KICAgICAgICBzY2FsZV9zaXplX2NvbnRpbnVvdXMoIHJhbmdlID0gYygwLCAyMCkgKSsNCiAgICAgICAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA5MCkgKSArDQogICAgICAgIHNjYWxlX2NvbG9yX3ZpcmlkaXNfYyggb3B0aW9uPSdDJywgYWVzdGhldGljcyA9ICdjb2xvcicpKw0KICAgICAgICBsYWJzKHRpdGxlID0gIlllYXIgVnMgRXZlbnRzIiwNCiAgICAgICAgICAgICBzdWJ0aXRsZSA9IlllYXI6IHtjdXJyZW50X2ZyYW1lfSINCiAgICAgICAgICAgICApICsNCiAgICAgICAgdHJhbnNpdGlvbl9tYW51YWwoZnJhbWVzPVlFQVIsIGN1bXVsYXRpdmU9VFJVRSkrDQogICAgICAgIGVhc2VfYWVzKCdleHBvbmVudGlhbCAtb3V0JykNCg0KZw0KYW5pbV9zYXZlKCdjcm9wX2RhbWFnZS5naWYnKQ0KDQp0YmxfY3JvcF9kYW1hZ2U8LXRvcF8xMDBfY3JvcF9kYW1hZ2VzICU+JSANCiAgICBzZWxlY3QoJ1lFQVInLCdFVlRZUEUnLCdjb3VudCcsJ2Nyb3BfZGFtYWdlJykgJT4lIA0KICAgIGFycmFuZ2UoIGRlc2MoY3JvcF9kYW1hZ2UpICkNCg0KYGBgDQoNCiFbRGF0YSBzb3VyY2U6IFRvcCAxMDAgZXZlbnRzIHdoaWNoIGNhdXNlcyB0aGUgZ3JlYXRlc3QgcHJvcGVydHkgZGFtYWdlXShwcm9wZXJ0eV9kYW1hZ2UuZ2lmKQ0KDQoNCkFzIHRoZSBncmFwaCBzaG93cywgdGhlIGV2ZW50cyB3aXRoIG1vc3QgZ3JlYXRlc3QgZWNvbm9taWMgY29uc2VxdWVuY2VzIGZvciBwcm9wZXJ0eSBhcmUgZmxvb2QsIGh1cnJpY2FuZS90eXBob29uIGFuZCBzdG9ybSBzdXJnZS4gVGhlIG5leHQgdGFibGUgc2hvd3MgdGhlc2UgZXZlbnRzIGF0IHRoZSB0b3A6DQpgYGB7cn0NCnByaW50KHRibF9wcm9wZXJ0eV9kYW1hZ2UpDQpgYGANCiFbRGF0YSBzb3VyY2U6IFRvcCAxMDAgZXZlbnRzIHdoaWNoIGNhdXNlcyB0aGUgZ3JlYXRlc3QgY3JvcCBkYW1hZ2VdKGNyb3BfZGFtYWdlLmdpZikNCg0KDQpBcyB0aGUgZ3JhcGggc2hvd3MsIHRoZSBldmVudHMgd2l0aCBtb3N0IGdyZWF0ZXN0IGVjb25vbWljIGNvbnNlcXVlbmNlcyBmb3IgY3JvcHMgYXJlIGh1cnJpY2FuZSwgaHVycmljYW5lL3R5cGhvb24gYW5kIHN0b3JtIHN1cmdlLiBUaGUgbmV4dCB0YWJsZSBzaG93cyB0aGVzZSBldmVudHMgYXQgdGhlIHRvcDoNCmBgYHtyfQ0KcHJpbnQodGJsX2Nyb3BfZGFtYWdlKQ0KYGBgDQoNCg==