Loading In the Data
emdat <- read_csv(here("full_emdat_geocoded_finally.csv"))
Warning: One or more parsing issues, call `problems()` on your data frame for details, e.g.:
dat <- vroom(...)
problems(dat)Rows: 74035 Columns: 51── Column specification ──────────────────────────────────────────────────────────────────────
Delimiter: ","
chr (27): Dis No, Seq, Disaster Group, Disaster Subgroup, Disaster Type, Disaster Subtype...
dbl (18): Year, Dis Mag Value, Start Year, Start Month, Start Day, End Year, End Month, E...
lgl (5): Glide, Aid Contribution, Reconstruction Costs ('000 US$), Admin1 Code, uncertai...
time (1): Local Time
ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
ENSO data
emdat_hydrological_enso %>%
filter(!is.na(enso_Value)) %>%
filter(!is.na(wet)) %>%
mutate(enso_positive = (enso_Value > 0)) %>%
group_by(`Dis No`) %>%
summarize(enso_pos = any(enso_positive),enso_val = mean(enso_Value), is_wet = any(wet)) %>%
ggplot(mapping = aes(x = enso_val, fill = is_wet)) +
geom_histogram(stat = "density") +
facet_grid(~is_wet) +
ggtitle("Counts of Disasters compared to value of ONI with wet disasters in Blue and Dry in Red")
Warning: Ignoring unknown parameters: `binwidth`, `bins`, and `pad`







resy <- 4
emdat_hydrological_enso %>%
left_join(event_num_months, by = c("Event")) %>%
filter(!is.na(enso_Value)) %>%
filter(!is.na(wet)) %>%
filter(!is.na(lat)) %>%
mutate(wet_factor = as_factor(wet)) %>%
mutate(Event_factor = fct_recode(as_factor(Event), no_event = "N", negative = "-", positive = "+")) %>%
mutate(wet_string = fct_recode(wet_factor, wet_disasters = "TRUE", dry_disasters = "FALSE")) %>%
mutate(lat_box = (as.integer(lat) %/% resy) * resy , lng_box = (as.integer(lng) %/% resy) * resy) %>%
mutate(dis_no_factor = as_factor(`Dis No`)) %>%
group_by(lat_box, lng_box, Event_factor, wet_string, dis_no_factor) %>%
summarize(num_months = first(num_months), num_disaster_month = mean(num_months_disaster)) %>%
group_by(lat_box, lng_box, Event_factor, wet_string) %>%
summarize(num_months = first(num_months), num_disaster_months = sum(num_disaster_month)) %>%
mutate(disaster_rate = num_disaster_months / num_months) %>%
pivot_wider(id_cols = c(lat_box, lng_box), names_from = c(Event_factor, wet_string), values_from = c(disaster_rate), values_fill = 0) %>%
mutate(positive_wet_relative_risk = positive_wet_disasters / no_event_wet_disasters,
negative_wet_relative_risk = negative_wet_disasters / no_event_wet_disasters,
positive_dry_relative_risk = positive_dry_disasters / no_event_dry_disasters,
negative_dry_relative_risk = negative_dry_disasters / no_event_dry_disasters) %>%
select(lat_box, lng_box, positive_wet_relative_risk, negative_wet_relative_risk, positive_dry_relative_risk, negative_dry_relative_risk) %>%
pivot_longer(cols = c(positive_wet_relative_risk, negative_wet_relative_risk, positive_dry_relative_risk, negative_dry_relative_risk), names_to = 'risk', values_to = 'value') %>%
mutate(risk_factor = as_factor(risk), values_cleaned = if_else(is.infinite(value), 18, value)) %>%
mutate(relative_risk_cleaned = if_else(is.nan(values_cleaned), 0, values_cleaned)) %>%
mutate(relative_risk_cleaned2 = if_else((relative_risk_cleaned) > 2, 2, relative_risk_cleaned)) %>%
ggplot() +
geom_sf(data = world_map) +
geom_tile(mapping = aes(x = lng_box, y = lat_box, fill = relative_risk_cleaned2, width = resy)) +
scale_fill_gradient2(midpoint = 1, limits = c(0, 2), low = 'cyan', high = 'red') +
facet_grid(rows = vars(risk_factor))+
ggtitle("Relative risk plot using calculations of the form [{num_disasters_positive_wet / num_months_positive} / {num_disasters_no_event_wet / num_months_no_event}]")
`summarise()` has grouped output by 'lat_box', 'lng_box', 'Event_factor', 'wet_string'. You can override using the `.groups` argument.`summarise()` has grouped output by 'lat_box', 'lng_box', 'Event_factor'. You can override using the `.groups` argument.

resy <- 4
emdat_hydrological_enso %>%
left_join(event_num_months, by = c("Event")) %>%
filter(!is.na(enso_Value)) %>%
filter(!is.na(wet)) %>%
filter(!is.na(lat)) %>%
mutate(wet_factor = as_factor(wet)) %>%
mutate(Event_factor = fct_recode(as_factor(Event), no_event = "N", negative = "-", positive = "+")) %>%
mutate(wet_string = fct_recode(wet_factor, wet_disasters = "TRUE", dry_disasters = "FALSE")) %>%
mutate(lat_box = (as.integer(lat) %/% resy) * resy , lng_box = (as.integer(lng) %/% resy) * resy) %>%
mutate(dis_no_factor = as_factor(`Dis No`)) %>%
group_by(lat_box, lng_box, Event_factor, wet_string, dis_no_factor) %>%
summarize(num_months = first(num_months), num_disaster_month = mean(num_months_disaster)) %>%
group_by(lat_box, lng_box, Event_factor, wet_string) %>%
summarize(num_months = first(num_months), num_disaster_months = sum(num_disaster_month)) %>%
mutate(disaster_rate = num_disaster_months / num_months) %>%
pivot_wider(id_cols = c(lat_box, lng_box), names_from = c(Event_factor, wet_string), values_from = c(disaster_rate), values_fill = 0) %>%
mutate(positive_wet_percent = positive_wet_disasters / (no_event_wet_disasters + positive_wet_disasters + negative_wet_disasters) ,
negative_wet_percent = negative_wet_disasters / (no_event_wet_disasters + positive_wet_disasters + negative_wet_disasters),
positive_dry_percent = positive_dry_disasters / (no_event_dry_disasters + positive_dry_disasters + negative_dry_disasters),
negative_dry_percent = negative_dry_disasters / (no_event_dry_disasters + positive_dry_disasters + negative_dry_disasters)
) %>%
select(lat_box, lng_box, positive_wet_percent, negative_wet_percent, positive_dry_percent, negative_dry_percent) %>%
pivot_longer(cols = c(positive_wet_percent, negative_wet_percent, positive_dry_percent, negative_dry_percent), names_to = 'typey', values_to = 'value') %>%
mutate(type_factor = as_factor(typey), values = if_else(is.nan(value), 0, value)) %>%
ggplot() +
geom_sf(data = world_map) +
geom_tile(mapping = aes(x = lng_box, y = lat_box, fill = values, width = resy)) +
scale_fill_gradient(low = 'white', high = 'red') +
facet_grid(rows = vars(type_factor))+
ggtitle("Disaster Percent plot using calculations of the form [positive_wet / all_wet]")
`summarise()` has grouped output by 'lat_box', 'lng_box', 'Event_factor', 'wet_string'. You can override using the `.groups` argument.`summarise()` has grouped output by 'lat_box', 'lng_box', 'Event_factor'. You can override using the `.groups` argument.

LS0tCnRpdGxlOiAiRU5TTyBhbmFseXNpcyBuZXciCm91dHB1dDogaHRtbF9ub3RlYm9vawotLS0KCmBgYHtyIHNldHVwLCBpbmNsdWRlPUZBTFNFfQprbml0cjo6b3B0c19jaHVuayRzZXQoZWNobyA9IFRSVUUpCmBgYAoKIyMgUGFja2FnZXMKCmBgYHtyfQpsaWJyYXJ5KHRpZHl2ZXJzZSkKbGlicmFyeShzZikKbGlicmFyeShoZXJlKQpsaWJyYXJ5KHdlZWQpCmxpYnJhcnkocm5hdHVyYWxlYXJ0aCkKbGlicmFyeShybmF0dXJhbGVhcnRoZGF0YSkKYGBgCgojIyBMb2FkaW5nIEluIHRoZSBEYXRhCgpgYGB7cn0KZW1kYXQgPC0gcmVhZF9jc3YoaGVyZSgiZnVsbF9lbWRhdF9nZW9jb2RlZF9maW5hbGx5LmNzdiIpKQpgYGAKIyBIb3cgbWFueSBkaXNhc3RlcnMgd2VyZSBsb2NhdGVkPwoKYGBge3J9CmVtZGF0ICU+JQogIHBlcmNlbnRfbG9jYXRlZF9kaXNhc3RlcnMocGxvdF9yZXN1bHQ9RkFMU0UpCmBgYAoKIyBIb3cgbWFueSBsb2NhdGlvbnMgd2VyZSBsb2NhdGVkPwoKYGBge3J9CmVtZGF0ICU+JQogIHBlcmNlbnRfbG9jYXRlZF9sb2NhdGlvbnMocGxvdF9yZXN1bHQ9RkFMU0UpCmBgYAojIEFsbCB0eXBlcyBvZiBkaXNhc3RlcnMKCmBgYHtyfQplbWRhdCAlPiUKICBncm91cF9ieShgRGlzYXN0ZXIgVHlwZWApICU+JQogIGNvdW50KCkKYGBgCgojIFJlc3RyaWN0IHRvIGRyeSBhbmQgd2V0IGh5ZHJvbG9naWNhbCBkaXNhc3RlcnMKCmBgYHtyfQpkcnlfbGlzdCA8LSBjKCJEcm91Z2h0IiwgIkV4dHJlbWUgdGVtcGVyYXR1cmUiLCAiV2lsZGZpcmUiKQp3ZXRfbGlzdCA8LSBjKCJGbG9vZCIsICJMYW5kc2xpZGUiLCAiU3Rvcm0iKQoKZW1kYXRfaHlkcm9sb2dpY2FsIDwtIGVtZGF0ICU+JQogIGZpbHRlcihgRGlzYXN0ZXIgVHlwZWAgJWluJSBjKGRyeV9saXN0LCB3ZXRfbGlzdCkpICU+JQogIG11dGF0ZShkcnkgPSAoYERpc2FzdGVyIFR5cGVgICVpbiUgZHJ5X2xpc3QpLCB3ZXQgPSAoYERpc2FzdGVyIFR5cGVgICVpbiUgd2V0X2xpc3QpKQpgYGAKCmBgYHtyfQplbWRhdF9oeWRyb2xvZ2ljYWwgJT4lCiAgZ3JvdXBfYnkoYERpc2FzdGVyIFR5cGVgKSAlPiUKICBjb3VudCgpCmBgYAoKIyBFTlNPIGRhdGEKCmBgYHtyfQplbnNvX2RhdGEgPC0gcmVhZF9jc3YoaGVyZSgiZGF0YSIsImVuc29fZGF0YV9jb3B5Mi5jc3YiKSkKZW5zb19kYXRhICU+JQogIGdyb3VwX2J5KEV2ZW50KSAlPiUKICBjb3VudCgpCmBgYAoKYGBge3J9CmVtZGF0X2h5ZHJvbG9naWNhbF9lbnNvIDwtIGVtZGF0X2h5ZHJvbG9naWNhbCAlPiUKICBmdWxsX2pvaW4oZW5zb19kYXRhLCBieSA9IGMoIlllYXIiID0gIlllYXIiLCAiU3RhcnQgTW9udGgiID0gIk1vbnRoTnVtIikpICU+JQogIHJlbmFtZSgiZW5zb19WYWx1ZSIgPSAiVmFsdWUiKSAlPiUKICBmaWx0ZXIoIWlzLm5hKGBTdGFydCBNb250aGApKSAlPiUKICBtdXRhdGUoc3RhcnRfeWVhciA9IGlmX2Vsc2UoaXMubmEoYFN0YXJ0IFllYXJgKSwgWWVhciwgYFN0YXJ0IFllYXJgKSkgJT4lCiAgbXV0YXRlKGVuZF95ZWFyID0gaWZfZWxzZShpcy5uYShgRW5kIFllYXJgKSwgc3RhcnRfeWVhciwgYEVuZCBZZWFyYCkpICU+JQogIG11dGF0ZShlbmRfbW9udGggPSBpZl9lbHNlKGlzLm5hKGBFbmQgTW9udGhgKSwgYFN0YXJ0IE1vbnRoYCwgYEVuZCBNb250aGApKSAlPiUKICBtdXRhdGUobnVtX21vbnRoc19kaXNhc3RlciA9IChlbmRfbW9udGggLSBgU3RhcnQgTW9udGhgICsgMSkgKyAxMiAqIChlbmRfeWVhciAtIHN0YXJ0X3llYXIpKSAlPiUKICBmaWx0ZXIobnVtX21vbnRoc19kaXNhc3RlciA+IDApCgplbWRhdF9oeWRyb2xvZ2ljYWxfZW5zbyAlPiUKICBncm91cF9ieShudW1fbW9udGhzX2Rpc2FzdGVyKSAlPiUKICBzdW1tYXJpemUoY291bnRfZGlzYXN0ZXJzID0gbl9kaXN0aW5jdChgRGlzIE5vYCkpCmBgYAoKYGBge3J9CmVtZGF0X2h5ZHJvbG9naWNhbF9lbnNvICU+JQogIGZpbHRlcighaXMubmEoZW5zb19WYWx1ZSkpICU+JQogIGZpbHRlcighaXMubmEod2V0KSkgJT4lCiAgbXV0YXRlKGVuc29fcG9zaXRpdmUgPSAoZW5zb19WYWx1ZSA+IDApKSAlPiUKICBncm91cF9ieShgRGlzIE5vYCkgJT4lCiAgc3VtbWFyaXplKGVuc29fcG9zID0gYW55KGVuc29fcG9zaXRpdmUpLGVuc29fdmFsID0gbWVhbihlbnNvX1ZhbHVlKSwgaXNfd2V0ID0gYW55KHdldCkpICU+JQogIGdncGxvdChtYXBwaW5nID0gYWVzKHggPSBlbnNvX3ZhbCwgZmlsbCA9IGlzX3dldCkpICsKICAgIGdlb21faGlzdG9ncmFtKHN0YXQgPSAiZGVuc2l0eSIpICsKICAgIGZhY2V0X2dyaWQofmlzX3dldCkgKwogIGdndGl0bGUoIkNvdW50cyBvZiBEaXNhc3RlcnMgY29tcGFyZWQgdG8gdmFsdWUgb2YgT05JIHdpdGggd2V0IGRpc2FzdGVycyBpbiBCbHVlIGFuZCBEcnkgaW4gUmVkIikKYGBgCmBgYHtyfQplbWRhdF9oeWRyb2xvZ2ljYWxfZW5zbyAlPiUKICBmaWx0ZXIoIWlzLm5hKGVuc29fVmFsdWUpKSAlPiUKICBmaWx0ZXIoIWlzLm5hKHdldCkpICU+JQogICNtdXRhdGUoZW5zb19wb3NpdGl2ZSA9IChlbnNvX1ZhbHVlID4gMCkpICU+JQogIGdyb3VwX2J5KGBEaXMgTm9gKSAlPiUKICBzdW1tYXJpemUoZW5zb19ldmVudCA9IGZpcnN0KEV2ZW50KSxlbnNvX3ZhbCA9IG1lYW4oZW5zb19WYWx1ZSksIGlzX3dldCA9IGFueSh3ZXQpLCBpc19kcnkgPSBhbnkoZHJ5KSkgJT4lCiAgbXV0YXRlKGlzX3dldF9udW0gPSBhcy5udW1lcmljKGlzX3dldCksIGlzX2RyeV9udW0gPSBhcy5udW1lcmljKGlzX2RyeSkpICU+JQogIGdyb3VwX2J5KGVuc29fZXZlbnQpICU+JQogIHN1bW1hcml6ZShudW1fZGlzYXN0ZXJzX3dldCA9IHN1bShpc193ZXRfbnVtKSwgbnVtX2Rpc2FzdGVyc19kcnkgPSBzdW0oaXNfZHJ5X251bSkpCmBgYApgYGB7cn0Kd29ybGRfbWFwIDwtIHJuYXR1cmFsZWFydGg6Om5lX2NvdW50cmllcyhzY2FsZSA9ICJtZWRpdW0iLCByZXR1cm5jbGFzcyA9ICJzZiIpCgplbWRhdF9oeWRyb2xvZ2ljYWxfZW5zbyAlPiUKICBmaWx0ZXIoIWlzLm5hKGVuc29fVmFsdWUpKSAlPiUKICBmaWx0ZXIoIWlzLm5hKHdldCkpICU+JQogIGZpbHRlcighaXMubmEobGF0KSkgJT4lCiAgbXV0YXRlKGVuc29fcG9zaXRpdmUgPSAoZW5zb19WYWx1ZSA+IDApKSAlPiUKICBtdXRhdGUod2V0X2ZhY3RvciA9IGFzX2ZhY3Rvcih3ZXQpKSAlPiUKICBtdXRhdGUod2V0X3N0cmluZyA9IGZjdF9yZWNvZGUod2V0X2ZhY3Rvciwgd2V0X2Rpc2FzdGVycyA9ICJUUlVFIiwgZHJ5X2Rpc2FzdGVycyA9ICJGQUxTRSIpKSAlPiUKICBzZWxlY3QobG5nLCBsYXQsIGVuc29fVmFsdWUsIHdldF9zdHJpbmcpICU+JQogICNoZWFkKG4gPSA1MEwpICU+JQogIGdncGxvdCgpICsKICBnZW9tX3NmKGRhdGEgPSB3b3JsZF9tYXApICsKICBnZW9tX3RpbGUobWFwcGluZyA9IGFlcyh4ID0gbG5nLCB5ID0gbGF0LCBmaWxsID0gZW5zb19WYWx1ZSwgd2lkdGggPSAyLCBoZWlnaHQgPSAyKSkgKwogIHNjYWxlX2ZpbGxfZ3JhZGllbnQyKGxvdz0iYmx1ZSIsIG1pZCA9ICJ3aGl0ZSIsIGhpZ2ggPSAicmVkIikgKwogIGZhY2V0X2dyaWQofndldF9zdHJpbmcpCiAgCgpgYGAKYGBge3J9CgplbWRhdF9oeWRyb2xvZ2ljYWxfZW5zbyAlPiUKICBmaWx0ZXIoIWlzLm5hKGVuc29fVmFsdWUpKSAlPiUKICBmaWx0ZXIoIWlzLm5hKHdldCkpICU+JQogIGZpbHRlcighaXMubmEobGF0KSkgJT4lCiAgbXV0YXRlKHdldF9mYWN0b3IgPSBhc19mYWN0b3Iod2V0KSkgJT4lCiAgbXV0YXRlKEV2ZW50X2ZhY3RvciA9IGZjdF9yZWNvZGUoYXNfZmFjdG9yKEV2ZW50KSwgbm9fZXZlbnQgPSAiTiIsIG5lZ2F0aXZlID0gIi0iLCBwb3NpdGl2ZSA9ICIrIikpICU+JQogIG11dGF0ZSh3ZXRfc3RyaW5nID0gZmN0X3JlY29kZSh3ZXRfZmFjdG9yLCB3ZXRfZGlzYXN0ZXJzID0gIlRSVUUiLCBkcnlfZGlzYXN0ZXJzID0gIkZBTFNFIikpICU+JQogIHNlbGVjdChsbmcsIGxhdCwgRXZlbnRfZmFjdG9yLCB3ZXRfc3RyaW5nLCB3ZXQpICU+JQogIGdncGxvdCgpICsKICBnZW9tX3NmKGRhdGEgPSB3b3JsZF9tYXApICsKICBnZW9tX3RpbGUobWFwcGluZyA9IGFlcyh4ID0gbG5nLCB5ID0gbGF0LCB3aWR0aCA9IDIsIGhlaWdodCA9IDIsIGZpbGwgPSAxLCBhbHBoYSA9IDAuMDAxKSkgKwogIGZhY2V0X2dyaWQoY29scyA9IHZhcnMod2V0X3N0cmluZyksIHJvd3MgPSB2YXJzKEV2ZW50X2ZhY3RvcikpCgpgYGAKYGBge3J9CgpldmVudF9udW1fbW9udGhzIDwtIGVuc29fZGF0YSAlPiUKICBncm91cF9ieShFdmVudCkgJT4lCiAgc3VtbWFyaXplKG51bV9tb250aHMgPSBuKCkpCgplbWRhdF9oeWRyb2xvZ2ljYWxfZW5zbyAlPiUKICBsZWZ0X2pvaW4oZXZlbnRfbnVtX21vbnRocywgYnkgPSBjKCJFdmVudCIpKSAlPiUKICBmaWx0ZXIoIWlzLm5hKGVuc29fVmFsdWUpKSAlPiUKICBmaWx0ZXIoIWlzLm5hKHdldCkpICU+JQogIGZpbHRlcighaXMubmEobGF0KSkgJT4lCiAgbXV0YXRlKHdldF9mYWN0b3IgPSBhc19mYWN0b3Iod2V0KSkgJT4lCiAgbXV0YXRlKEV2ZW50X2ZhY3RvciA9IGZjdF9yZWNvZGUoYXNfZmFjdG9yKEV2ZW50KSwgbm9fZXZlbnQgPSAiTiIsIG5lZ2F0aXZlID0gIi0iLCBwb3NpdGl2ZSA9ICIrIikpICU+JQogIG11dGF0ZSh3ZXRfc3RyaW5nID0gZmN0X3JlY29kZSh3ZXRfZmFjdG9yLCB3ZXRfZGlzYXN0ZXJzID0gIlRSVUUiLCBkcnlfZGlzYXN0ZXJzID0gIkZBTFNFIikpICU+JQogIHNlbGVjdChsbmcsIGxhdCwgRXZlbnRfZmFjdG9yLCB3ZXRfc3RyaW5nLCBudW1fbW9udGhzLCBudW1fbW9udGhzX2Rpc2FzdGVyKSAlPiUKICBhZGRfcm93KGxuZyA9IDEsIGxhdCA9IDEsIEV2ZW50X2ZhY3RvciA9ICdub19ldmVudCcsIHdldF9zdHJpbmcgPSAnZHJ5X2Rpc2FzdGVycycsIG51bV9tb250aHMgPSAxKSAlPiUKICBnZ3Bsb3QoKSArCiAgZ2VvbV9zZihkYXRhID0gd29ybGRfbWFwKSArCiAgZ2VvbV90aWxlKG1hcHBpbmcgPSBhZXMoeCA9IGxuZywgeSA9IGxhdCwgd2lkdGggPSAyLCBoZWlnaHQgPSAyLCBhbHBoYSA9IG51bV9tb250aHNfZGlzYXN0ZXIvbnVtX21vbnRocywgZmlsbCA9ICdyZWQnKSkgKwogIGZhY2V0X2dyaWQoY29scyA9IHZhcnMod2V0X3N0cmluZyksIHJvd3MgPSB2YXJzKEV2ZW50X2ZhY3RvcikpICsKICBnZ3RpdGxlKCJTYW1lIHBsb3QgYXMgYWJvdmUgYnV0IHNjYWxlZCBieSBudW0gbW9udGhzIikKCmBgYAoKYGBge3J9CmVtZGF0X2h5ZHJvbG9naWNhbF9lbnNvICU+JQogIGxlZnRfam9pbihldmVudF9udW1fbW9udGhzLCBieSA9IGMoIkV2ZW50IikpICU+JQogIGZpbHRlcighaXMubmEoZW5zb19WYWx1ZSkpICU+JQogIGZpbHRlcighaXMubmEod2V0KSkgJT4lCiAgZmlsdGVyKCFpcy5uYShsYXQpKSAlPiUKICBtdXRhdGUod2V0X2ZhY3RvciA9IGFzX2ZhY3Rvcih3ZXQpKSAlPiUKICBtdXRhdGUoRXZlbnRfZmFjdG9yID0gZmN0X3JlY29kZShhc19mYWN0b3IoRXZlbnQpLCBub19ldmVudCA9ICJOIiwgbmVnYXRpdmUgPSAiLSIsIHBvc2l0aXZlID0gIisiKSkgJT4lCiAgbXV0YXRlKHdldF9zdHJpbmcgPSBmY3RfcmVjb2RlKHdldF9mYWN0b3IsIHdldF9kaXNhc3RlcnMgPSAiVFJVRSIsIGRyeV9kaXNhc3RlcnMgPSAiRkFMU0UiKSkgJT4lCiAgc2VsZWN0KGxuZywgbGF0LCBFdmVudF9mYWN0b3IsIHdldF9zdHJpbmcsIG51bV9tb250aHMpICU+JQogIGdncGxvdCgpICsKICBnZW9tX3NmKGRhdGEgPSB3b3JsZF9tYXApICsKICBzdGF0X2Jpbl8yZChtYXBwaW5nID0gYWVzKHggPSBsbmcsIHkgPSBsYXQpLCBiaW53aWR0aCA9IGMoMiwyKSkgKwogIHNjYWxlX2ZpbGxfZ3JhZGllbnQodHJhbnMgPSAnbG9nJywgbG93ID0gJ3doaXRlJywgaGlnaCA9ICdyZWQnKSArIAogIGZhY2V0X2dyaWQoY29scyA9IHZhcnMod2V0X3N0cmluZyksIHJvd3MgPSB2YXJzKEV2ZW50X2ZhY3RvcikpICsKICBnZ3RpdGxlKCIyRCBIaXN0b2dyYW0gQ291bnRzICIpCgpgYGAKYGBge3J9CgplbWRhdF9oeWRyb2xvZ2ljYWxfZW5zbyAlPiUKICBsZWZ0X2pvaW4oZXZlbnRfbnVtX21vbnRocywgYnkgPSBjKCJFdmVudCIpKSAlPiUKICBmaWx0ZXIoIWlzLm5hKGVuc29fVmFsdWUpKSAlPiUKICBmaWx0ZXIoIWlzLm5hKHdldCkpICU+JQogIGZpbHRlcighaXMubmEobGF0KSkgJT4lCiAgbXV0YXRlKHdldF9mYWN0b3IgPSBhc19mYWN0b3Iod2V0KSkgJT4lCiAgbXV0YXRlKEV2ZW50X2ZhY3RvciA9IGZjdF9yZWNvZGUoYXNfZmFjdG9yKEV2ZW50KSwgbm9fZXZlbnQgPSAiTiIsIG5lZ2F0aXZlID0gIi0iLCBwb3NpdGl2ZSA9ICIrIikpICU+JQogIG11dGF0ZSh3ZXRfc3RyaW5nID0gZmN0X3JlY29kZSh3ZXRfZmFjdG9yLCB3ZXRfZGlzYXN0ZXJzID0gIlRSVUUiLCBkcnlfZGlzYXN0ZXJzID0gIkZBTFNFIikpICU+JQogIHNlbGVjdChsbmcsIGxhdCwgRXZlbnRfZmFjdG9yLCB3ZXRfc3RyaW5nLCBudW1fbW9udGhzKSAlPiUKICBnZ3Bsb3QoKSArCiAgZ2VvbV9zZihkYXRhID0gd29ybGRfbWFwKSArCiAgc3RhdF9iaW5fMmQobWFwcGluZyA9IGFlcyh4ID0gbG5nLCB5ID0gbGF0LCBmaWxsID0gLi5kZW5zaXR5Li4pLCBiaW53aWR0aCA9IGMoMiwyKSkgKwogIHNjYWxlX2ZpbGxfZ3JhZGllbnQodHJhbnMgPSAnbG9nJywgbG93ID0gJ3doaXRlJywgaGlnaCA9ICdyZWQnKSArIAogIGZhY2V0X2dyaWQoY29scyA9IHZhcnMod2V0X3N0cmluZyksIHJvd3MgPSB2YXJzKEV2ZW50X2ZhY3RvcikpICsKICBnZ3RpdGxlKCIyRCBIaXN0b2dyYW0gRGVuc2l0eSIpCgpgYGAKCmBgYHtyfQoKZW1kYXRfaHlkcm9sb2dpY2FsX2Vuc28gJT4lCiAgbGVmdF9qb2luKGV2ZW50X251bV9tb250aHMsIGJ5ID0gYygiRXZlbnQiKSkgJT4lCiAgZmlsdGVyKCFpcy5uYShlbnNvX1ZhbHVlKSkgJT4lCiAgZmlsdGVyKCFpcy5uYSh3ZXQpKSAlPiUKICBmaWx0ZXIoIWlzLm5hKGxhdCkpICU+JQogIG11dGF0ZSh3ZXRfZmFjdG9yID0gYXNfZmFjdG9yKHdldCkpICU+JQogIG11dGF0ZShFdmVudF9mYWN0b3IgPSBmY3RfcmVjb2RlKGFzX2ZhY3RvcihFdmVudCksIG5vX2V2ZW50ID0gIk4iLCBuZWdhdGl2ZSA9ICItIiwgcG9zaXRpdmUgPSAiKyIpKSAlPiUKICBtdXRhdGUod2V0X3N0cmluZyA9IGZjdF9yZWNvZGUod2V0X2ZhY3Rvciwgd2V0X2Rpc2FzdGVycyA9ICJUUlVFIiwgZHJ5X2Rpc2FzdGVycyA9ICJGQUxTRSIpKSAlPiUKICBzZWxlY3QobG5nLCBsYXQsIEV2ZW50X2ZhY3Rvciwgd2V0X3N0cmluZywgbnVtX21vbnRocywgbnVtX21vbnRoc19kaXNhc3RlcikgJT4lCiAgZ2dwbG90KCkgKwogIGdlb21fc2YoZGF0YSA9IHdvcmxkX21hcCkgKwogIHN0YXRfYmluXzJkKG1hcHBpbmcgPSBhZXMoeCA9IGxuZywgeSA9IGxhdCwgd2VpZ2h0ID0gbnVtX21vbnRoc19kaXNhc3Rlci9udW1fbW9udGhzKSwgYmlud2lkdGggPSBjKDIsMikpICsKICBzY2FsZV9maWxsX2dyYWRpZW50KHRyYW5zID0gJ2xvZycsIGxvdyA9ICd3aGl0ZScsIGhpZ2ggPSAncmVkJykgKyAKICBmYWNldF9ncmlkKGNvbHMgPSB2YXJzKHdldF9zdHJpbmcpLCByb3dzID0gdmFycyhFdmVudF9mYWN0b3IpKSArCiAgZ2d0aXRsZSgiMkQgSGlzdG9ncmFtIEludmVyc2UgV2VpZ2h0ZWQgYnkgTnVtIE1vbnRocyIpCgpgYGAKYGBge3J9CiMjIGNhbGN1bGF0ZSByZWxhdGl2ZSByaXNrIHdpdGhpbiBlYWNoIGJveAojIyMgY3JlYXRlIGJveGVzIGFjYyB0byByZXN5IFggcmVzeQoKcmVzeSA8LSA0CgplbWRhdF9oeWRyb2xvZ2ljYWxfZW5zbyAlPiUKICBsZWZ0X2pvaW4oZXZlbnRfbnVtX21vbnRocywgYnkgPSBjKCJFdmVudCIpKSAlPiUKICBmaWx0ZXIoIWlzLm5hKGVuc29fVmFsdWUpKSAlPiUKICBmaWx0ZXIoIWlzLm5hKHdldCkpICU+JQogIGZpbHRlcighaXMubmEobGF0KSkgJT4lCiAgbXV0YXRlKHdldF9mYWN0b3IgPSBhc19mYWN0b3Iod2V0KSkgJT4lCiAgbXV0YXRlKEV2ZW50X2ZhY3RvciA9IGZjdF9yZWNvZGUoYXNfZmFjdG9yKEV2ZW50KSwgbm9fZXZlbnQgPSAiTiIsIG5lZ2F0aXZlID0gIi0iLCBwb3NpdGl2ZSA9ICIrIikpICU+JQogIG11dGF0ZSh3ZXRfc3RyaW5nID0gZmN0X3JlY29kZSh3ZXRfZmFjdG9yLCB3ZXRfZGlzYXN0ZXJzID0gIlRSVUUiLCBkcnlfZGlzYXN0ZXJzID0gIkZBTFNFIikpICU+JQogIG11dGF0ZShsYXRfYm94ID0gKGFzLmludGVnZXIobGF0KSAlLyUgcmVzeSkgKiByZXN5ICwgbG5nX2JveCA9IChhcy5pbnRlZ2VyKGxuZykgJS8lIHJlc3kpICogcmVzeSkgJT4lCiAgbXV0YXRlKGRpc19ub19mYWN0b3IgPSBhc19mYWN0b3IoYERpcyBOb2ApKSAlPiUKICBncm91cF9ieShsYXRfYm94LCBsbmdfYm94LCBFdmVudF9mYWN0b3IsIHdldF9zdHJpbmcsIGRpc19ub19mYWN0b3IpICU+JQogIHN1bW1hcml6ZShudW1fbW9udGhzID0gZmlyc3QobnVtX21vbnRocyksIG51bV9kaXNhc3Rlcl9tb250aCA9IG1lYW4obnVtX21vbnRoc19kaXNhc3RlcikpICU+JQogIGdyb3VwX2J5KGxhdF9ib3gsIGxuZ19ib3gsIEV2ZW50X2ZhY3Rvciwgd2V0X3N0cmluZykgJT4lCiAgc3VtbWFyaXplKG51bV9tb250aHMgPSBmaXJzdChudW1fbW9udGhzKSwgbnVtX2Rpc2FzdGVyX21vbnRocyA9IHN1bShudW1fZGlzYXN0ZXJfbW9udGgpKSAlPiUKICBtdXRhdGUoZGlzYXN0ZXJfcmF0ZSA9IG51bV9kaXNhc3Rlcl9tb250aHMgLyBudW1fbW9udGhzKSAlPiUKICBwaXZvdF93aWRlcihpZF9jb2xzID0gYyhsYXRfYm94LCBsbmdfYm94KSwgbmFtZXNfZnJvbSA9IGMoRXZlbnRfZmFjdG9yLCB3ZXRfc3RyaW5nKSwgdmFsdWVzX2Zyb20gPSBjKGRpc2FzdGVyX3JhdGUpLCB2YWx1ZXNfZmlsbCA9IDApICU+JQogIG11dGF0ZShwb3NpdGl2ZV93ZXRfcmVsYXRpdmVfcmlzayA9IHBvc2l0aXZlX3dldF9kaXNhc3RlcnMgLyBub19ldmVudF93ZXRfZGlzYXN0ZXJzLCAKICAgICAgICAgbmVnYXRpdmVfd2V0X3JlbGF0aXZlX3Jpc2sgPSBuZWdhdGl2ZV93ZXRfZGlzYXN0ZXJzIC8gbm9fZXZlbnRfd2V0X2Rpc2FzdGVycywgCiAgICAgICAgIHBvc2l0aXZlX2RyeV9yZWxhdGl2ZV9yaXNrID0gIHBvc2l0aXZlX2RyeV9kaXNhc3RlcnMgLyBub19ldmVudF9kcnlfZGlzYXN0ZXJzLAogICAgICAgICBuZWdhdGl2ZV9kcnlfcmVsYXRpdmVfcmlzayA9IG5lZ2F0aXZlX2RyeV9kaXNhc3RlcnMgLyBub19ldmVudF9kcnlfZGlzYXN0ZXJzKSAlPiUKICBzZWxlY3QobGF0X2JveCwgbG5nX2JveCwgcG9zaXRpdmVfd2V0X3JlbGF0aXZlX3Jpc2ssIG5lZ2F0aXZlX3dldF9yZWxhdGl2ZV9yaXNrLCBwb3NpdGl2ZV9kcnlfcmVsYXRpdmVfcmlzaywgbmVnYXRpdmVfZHJ5X3JlbGF0aXZlX3Jpc2spICU+JQogIHBpdm90X2xvbmdlcihjb2xzID0gYyhwb3NpdGl2ZV93ZXRfcmVsYXRpdmVfcmlzaywgbmVnYXRpdmVfd2V0X3JlbGF0aXZlX3Jpc2ssIHBvc2l0aXZlX2RyeV9yZWxhdGl2ZV9yaXNrLCBuZWdhdGl2ZV9kcnlfcmVsYXRpdmVfcmlzayksIG5hbWVzX3RvID0gJ3Jpc2snLCB2YWx1ZXNfdG8gPSAndmFsdWUnKSAlPiUKICBtdXRhdGUocmlza19mYWN0b3IgPSBhc19mYWN0b3IocmlzayksIHZhbHVlc19jbGVhbmVkID0gaWZfZWxzZShpcy5pbmZpbml0ZSh2YWx1ZSksIDE4LCB2YWx1ZSkpICU+JQogIG11dGF0ZShyZWxhdGl2ZV9yaXNrX2NsZWFuZWQgPSBpZl9lbHNlKGlzLm5hbih2YWx1ZXNfY2xlYW5lZCksIDAsIHZhbHVlc19jbGVhbmVkKSkgJT4lCiAgbXV0YXRlKHJlbGF0aXZlX3Jpc2tfY2xlYW5lZDIgPSBpZl9lbHNlKChyZWxhdGl2ZV9yaXNrX2NsZWFuZWQpID4gMiwgMiwgcmVsYXRpdmVfcmlza19jbGVhbmVkKSkgJT4lCiAgZ2dwbG90KCkgKwogIGdlb21fc2YoZGF0YSA9IHdvcmxkX21hcCkgKwogIGdlb21fdGlsZShtYXBwaW5nID0gYWVzKHggPSBsbmdfYm94LCB5ID0gbGF0X2JveCwgZmlsbCA9IHJlbGF0aXZlX3Jpc2tfY2xlYW5lZDIsIHdpZHRoID0gcmVzeSkpICsKICBzY2FsZV9maWxsX2dyYWRpZW50MihtaWRwb2ludCA9IDEsIGxpbWl0cyA9IGMoMCwgMiksIGxvdyA9ICdjeWFuJywgaGlnaCA9ICdyZWQnKSArCiAgZmFjZXRfZ3JpZChyb3dzID0gdmFycyhyaXNrX2ZhY3RvcikpKwogIGdndGl0bGUoIlJlbGF0aXZlIHJpc2sgcGxvdCB1c2luZyBjYWxjdWxhdGlvbnMgb2YgdGhlIGZvcm0gW3tudW1fZGlzYXN0ZXJzX3Bvc2l0aXZlX3dldCAvIG51bV9tb250aHNfcG9zaXRpdmV9IC8ge251bV9kaXNhc3RlcnNfbm9fZXZlbnRfd2V0IC8gbnVtX21vbnRoc19ub19ldmVudH1dIikKICAKICAKCmBgYAoKYGBge3J9CiMjIGNhbGN1bGF0ZSBwZXJjZW50IG9mIHRvdGFsIGRpc2FzdGVycyB3aXRoaW4gZWFjaCBib3gKIyMjIGNyZWF0ZSBib3hlcyAyeDIKCnJlc3kgPC0gNAoKZW1kYXRfaHlkcm9sb2dpY2FsX2Vuc28gJT4lCiAgbGVmdF9qb2luKGV2ZW50X251bV9tb250aHMsIGJ5ID0gYygiRXZlbnQiKSkgJT4lCiAgZmlsdGVyKCFpcy5uYShlbnNvX1ZhbHVlKSkgJT4lCiAgZmlsdGVyKCFpcy5uYSh3ZXQpKSAlPiUKICBmaWx0ZXIoIWlzLm5hKGxhdCkpICU+JQogIG11dGF0ZSh3ZXRfZmFjdG9yID0gYXNfZmFjdG9yKHdldCkpICU+JQogIG11dGF0ZShFdmVudF9mYWN0b3IgPSBmY3RfcmVjb2RlKGFzX2ZhY3RvcihFdmVudCksIG5vX2V2ZW50ID0gIk4iLCBuZWdhdGl2ZSA9ICItIiwgcG9zaXRpdmUgPSAiKyIpKSAlPiUKICBtdXRhdGUod2V0X3N0cmluZyA9IGZjdF9yZWNvZGUod2V0X2ZhY3Rvciwgd2V0X2Rpc2FzdGVycyA9ICJUUlVFIiwgZHJ5X2Rpc2FzdGVycyA9ICJGQUxTRSIpKSAlPiUKICBtdXRhdGUobGF0X2JveCA9IChhcy5pbnRlZ2VyKGxhdCkgJS8lIHJlc3kpICogcmVzeSAsIGxuZ19ib3ggPSAoYXMuaW50ZWdlcihsbmcpICUvJSByZXN5KSAqIHJlc3kpICU+JQogIG11dGF0ZShkaXNfbm9fZmFjdG9yID0gYXNfZmFjdG9yKGBEaXMgTm9gKSkgJT4lCiAgZ3JvdXBfYnkobGF0X2JveCwgbG5nX2JveCwgRXZlbnRfZmFjdG9yLCB3ZXRfc3RyaW5nLCBkaXNfbm9fZmFjdG9yKSAlPiUKICBzdW1tYXJpemUobnVtX21vbnRocyA9IGZpcnN0KG51bV9tb250aHMpLCBudW1fZGlzYXN0ZXJfbW9udGggPSBtZWFuKG51bV9tb250aHNfZGlzYXN0ZXIpKSAlPiUKICBncm91cF9ieShsYXRfYm94LCBsbmdfYm94LCBFdmVudF9mYWN0b3IsIHdldF9zdHJpbmcpICU+JQogIHN1bW1hcml6ZShudW1fbW9udGhzID0gZmlyc3QobnVtX21vbnRocyksIG51bV9kaXNhc3Rlcl9tb250aHMgPSBzdW0obnVtX2Rpc2FzdGVyX21vbnRoKSkgJT4lCiAgbXV0YXRlKGRpc2FzdGVyX3JhdGUgPSBudW1fZGlzYXN0ZXJfbW9udGhzIC8gbnVtX21vbnRocykgJT4lCiAgcGl2b3Rfd2lkZXIoaWRfY29scyA9IGMobGF0X2JveCwgbG5nX2JveCksIG5hbWVzX2Zyb20gPSBjKEV2ZW50X2ZhY3Rvciwgd2V0X3N0cmluZyksIHZhbHVlc19mcm9tID0gYyhkaXNhc3Rlcl9yYXRlKSwgdmFsdWVzX2ZpbGwgPSAwKSAlPiUKICBtdXRhdGUocG9zaXRpdmVfd2V0X3BlcmNlbnQgPSBwb3NpdGl2ZV93ZXRfZGlzYXN0ZXJzIC8gKG5vX2V2ZW50X3dldF9kaXNhc3RlcnMgKyBwb3NpdGl2ZV93ZXRfZGlzYXN0ZXJzICsgbmVnYXRpdmVfd2V0X2Rpc2FzdGVycykgLCAKICAgICAgICAgbmVnYXRpdmVfd2V0X3BlcmNlbnQgPSBuZWdhdGl2ZV93ZXRfZGlzYXN0ZXJzIC8gKG5vX2V2ZW50X3dldF9kaXNhc3RlcnMgKyBwb3NpdGl2ZV93ZXRfZGlzYXN0ZXJzICsgbmVnYXRpdmVfd2V0X2Rpc2FzdGVycyksIAogICAgICAgICBwb3NpdGl2ZV9kcnlfcGVyY2VudCA9ICBwb3NpdGl2ZV9kcnlfZGlzYXN0ZXJzIC8gKG5vX2V2ZW50X2RyeV9kaXNhc3RlcnMgKyBwb3NpdGl2ZV9kcnlfZGlzYXN0ZXJzICsgbmVnYXRpdmVfZHJ5X2Rpc2FzdGVycyksCiAgICAgICAgIG5lZ2F0aXZlX2RyeV9wZXJjZW50ID0gIG5lZ2F0aXZlX2RyeV9kaXNhc3RlcnMgLyAobm9fZXZlbnRfZHJ5X2Rpc2FzdGVycyArIHBvc2l0aXZlX2RyeV9kaXNhc3RlcnMgKyBuZWdhdGl2ZV9kcnlfZGlzYXN0ZXJzKQogICAgICAgICApICU+JQogIHNlbGVjdChsYXRfYm94LCBsbmdfYm94LCBwb3NpdGl2ZV93ZXRfcGVyY2VudCwgbmVnYXRpdmVfd2V0X3BlcmNlbnQsIHBvc2l0aXZlX2RyeV9wZXJjZW50LCBuZWdhdGl2ZV9kcnlfcGVyY2VudCkgJT4lCiAgcGl2b3RfbG9uZ2VyKGNvbHMgPSBjKHBvc2l0aXZlX3dldF9wZXJjZW50LCBuZWdhdGl2ZV93ZXRfcGVyY2VudCwgcG9zaXRpdmVfZHJ5X3BlcmNlbnQsIG5lZ2F0aXZlX2RyeV9wZXJjZW50KSwgbmFtZXNfdG8gPSAndHlwZXknLCB2YWx1ZXNfdG8gPSAndmFsdWUnKSAlPiUKICBtdXRhdGUodHlwZV9mYWN0b3IgPSBhc19mYWN0b3IodHlwZXkpLCB2YWx1ZXMgPSBpZl9lbHNlKGlzLm5hbih2YWx1ZSksIDAsIHZhbHVlKSkgJT4lCiAgZ2dwbG90KCkgKwogIGdlb21fc2YoZGF0YSA9IHdvcmxkX21hcCkgKwogIGdlb21fdGlsZShtYXBwaW5nID0gYWVzKHggPSBsbmdfYm94LCB5ID0gbGF0X2JveCwgZmlsbCA9IHZhbHVlcywgd2lkdGggPSByZXN5KSkgKwogIHNjYWxlX2ZpbGxfZ3JhZGllbnQobG93ID0gJ3doaXRlJywgaGlnaCA9ICdyZWQnKSArCiAgZmFjZXRfZ3JpZChyb3dzID0gdmFycyh0eXBlX2ZhY3RvcikpKwogIGdndGl0bGUoIkRpc2FzdGVyIFBlcmNlbnQgcGxvdCB1c2luZyBjYWxjdWxhdGlvbnMgb2YgdGhlIGZvcm0gW3Bvc2l0aXZlX3dldCAvIGFsbF93ZXRdIikKICAKICAKCmBgYA==