rm(list=ls())

library(tmap)
library(sf)
library(ggplot2)
library(ggmap)
library(ggthemes)
library(dplyr)

url <- "https://geodata.ucdavis.edu/gadm/gadm4.0/shp/gadm40_BGR_shp.zip"

Cleared the environment for better organization and then downloaded the libraries necessary to create the maps.


download.file(url, "./bul.zip")
trying URL 'https://geodata.ucdavis.edu/gadm/gadm4.0/shp/gadm40_BGR_shp.zip'
Content type 'application/zip' length 1602712 bytes (1.5 MB)
==================================================
downloaded 1.5 MB

Downloaded the files.

unzip("./bul.zip", exdir = "bul")

Unzipped the files.

bul <- st_read("./bul/gadm40_BGR_2.shp")
Reading layer `gadm40_BGR_2' from data source 
  `/Users/sadieriggs/Downloads/DIDA 325/send 2/bul/gadm40_BGR_2.shp' 
  using driver `ESRI Shapefile'
Simple feature collection with 263 features and 12 fields
Geometry type: MULTIPOLYGON
Dimension:     XY
Bounding box:  xmin: 22.34375 ymin: 41.23481 xmax: 28.60903 ymax: 44.21268
Geodetic CRS:  WGS 84

Read the files.

map <- tm_shape(bul) + tm_fill("NAME_1") + tm_borders()

Generating a base map to get an idea of what it should look like.


print(map)

Printed the base map.

codes <- read.csv("simplecodes.csv")
mortalities <- read.csv("Bulgaria_Mortality_Rates_Municipalities_Mortality.csv")

newcodes_data <- merge(bul, codes, by = "ID_2", all.x = TRUE)

I made the .csv files containing the data for Bulgaria into data frames. I then merged together the two Bulgaria data sets which contain codes for different regions.

mortalities <-  mortalities %>%  mutate(Region.en=if_else(Region.en=="Sofia (capital)", "Grad Sofiya", Region.en))

mortalities <- mortalities %>% mutate(Region.en = if_else(Region.en=="Kurdzhali","Kardzhali",Region.en) )

mortalities <- mortalities %>%  mutate(key=tolower(Region.en))

Fixed the alternative spelling issue that comes from disparities in the names of locations.


merged_data <- merge(newcodes_data, mortalities, by= "key", all.y = TRUE)

#merged_data <- merge(bul, mortalities, by.x = "NAME_1", by.y = "Region.en", all.x = TRUE)

bul_list <- unique(bul$NAME_2)
mort_list <- unique(mortalities$Region.en)
merged_list <- unique(merged_data$region)

Merged the data containing the codes for regions and the mortality data, then looked at all the unique values present in the dataframes.

merged_data2 <- merged_data

max(merged_data2$X2019, na.rm=TRUE)
[1] 15635
min(merged_data2$X2019, na.rm=TRUE)
[1] 7
high_outliers <- merged_data2 %>% filter(X2019 > 4000)

Created a new data frame that will later be altered, and looking at the minimum and maximum values to pinpoint outliers and remove them.



ggplot()+
  geom_sf(bul, mapping = aes(), fill = "gray80")+
  geom_sf(merged_data2, mapping = aes( fill = X2019))+
  theme_minimal()+
  labs(fill = "Mortality Rates", title = "Adult Mortality Rates in Bulgaria")+
  theme(plot.title = element_text(hjust = 0.5))

Plotted a reference map that does not separate the mortality rates by gender.


missing <- merged_data2 %>% filter(NAME_1.x == "Kardzhali")

Creates a new data frame containing only the data for the region called Kardzhali. I was unfortunately missing data for this area, noted by the grey areas on the map.

For the following graphs: I filtered the data so that the data for female and male are put into separate data frames. I plotted the graphs for 2019, 2020, and 2021 by gender for every year, changing the color of the graphs to create more distinction. I also transformed the data into a logarithmic scale to show differences through the scale, since the mortality differences between regions were not very apparent.

library(ggplot2)
library(viridis)
filtered_data_female <- merged_data2 %>%
  filter(Sex == "Female")

ggplot()+
  geom_sf(bul, mapping = aes(), fill = "gray80")+
  geom_sf(filtered_data_female, mapping = aes( fill = X2019))+
  scale_fill_gradientn(colours=rev(magma(6)),
                         name="Mortality Rates",
                         na.value = "grey100", 
                         trans = "log")+
  theme_minimal()+
  labs(fill = "Mortality Rates", title = "Adult Female Mortality Rates in Bulgaria (2019)")+
  theme(plot.title = element_text(hjust = 0.5))

library(ggplot2)
library(viridis)
filtered_data_male <- merged_data2 %>%
  filter(Sex == "Male")

ggplot()+
  geom_sf(bul, mapping = aes(), fill = "gray80")+
  geom_sf(filtered_data_male, mapping = aes( fill = X2019))+
  scale_fill_gradientn(colours=rev(magma(6)),
                         name="Mortality Rates",
                         na.value = "grey100", 
                         trans = "log")+
  theme_minimal()+
  labs(fill = "Mortality Rates", title = "Adult Male Mortality Rates in Bulgaria (2019)")+
  theme(plot.title = element_text(hjust = 0.5))

library(ggplot2)
library(viridis)
filtered_data_female <- merged_data2 %>%
  filter(Sex == "Female")

ggplot()+
  geom_sf(bul, mapping = aes(), fill = "gray80")+
  geom_sf(filtered_data_female, mapping = aes( fill = X2020))+
  scale_fill_gradientn(colours=rev(magma(6)),
                         name="Mortality Rates",
                         na.value = "grey100", 
                         trans = "log")+
  theme_minimal()+
  labs(fill = "Mortality Rates", title = "Adult Female Mortality Rates in Bulgaria (2020)")+
  theme(plot.title = element_text(hjust = 0.5))

library(ggplot2)
library(viridis)
filtered_data_male <- merged_data2 %>%
  filter(Sex == "Male")

ggplot()+
  geom_sf(bul, mapping = aes(), fill = "gray80")+
  geom_sf(filtered_data_male, mapping = aes( fill = X2020))+
  scale_fill_gradientn(colours=rev(magma(6)),
                         name="Mortality Rates",
                         na.value = "grey100", 
                         trans = "log")+
  theme_minimal()+
  labs(fill = "Mortality Rates", title = "Adult Male Mortality Rates in Bulgaria (2020)")+
  theme(plot.title = element_text(hjust = 0.5))

library(ggplot2)
library(viridis)
filtered_data_female <- merged_data2 %>%
  filter(Sex == "Female")

ggplot()+
  geom_sf(bul, mapping = aes(), fill = "gray80")+
  geom_sf(filtered_data_female, mapping = aes( fill = X2021))+
  scale_fill_gradientn(colours=rev(magma(6)),
                         name="Mortality Rates",
                         na.value = "grey100", 
                         trans = "log")+
  theme_minimal()+
  labs(fill = "Mortality Rates", title = "Adult Female Mortality Rates in Bulgaria (2021)")+
  theme(plot.title = element_text(hjust = 0.5))

library(viridis)
filtered_data_male <- merged_data2 %>%
  filter(Sex == "Male")

ggplot()+
  geom_sf(bul, mapping = aes(), fill = "gray80")+
  geom_sf(filtered_data_male, mapping = aes( fill = X2021))+
  scale_fill_gradientn(colours=rev(magma(6)),
                         name="Mortality Rates",
                         na.value = "grey100", 
                         trans = "log")+
  theme_minimal()+
  labs(fill = "Mortality Rates", title = "Adult Male Mortality Rates in Bulgaria (2021)")+
  theme(plot.title = element_text(hjust = 0.5))

This was the start of an idea I had to create a bar graph that took the mean of the mortality rates in 2019, 2020, and 2021, across both genders in order to show a visual comparison between them This would have been carried out had there been extra time to work on the project

filtered_data_male <- filtered_data_male %>%
  mutate(mean_male_2019 = mean(X2019, na.rm = TRUE),
         mean_male_2020 = mean(X2020, na.rm = TRUE),
         mean_male_2021 = mean(X2021, na.rm = TRUE))
filtered_data_female <- filtered_data_female %>%
  mutate(mean_female_2019 = mean(X2019, na.rm = TRUE),
         mean_female_2020 = mean(X2020, na.rm = TRUE),
         mean_female_2021 = mean(X2021, na.rm = TRUE))
LS0tCnRpdGxlOiAiTW9ydGFsaXR5IFJhdGVzIGluIEJ1bGdhcmlhIGZyb20gMjAxOS0yMDIxIGJ5IEdlbmRlciIKb3V0cHV0OiBodG1sX25vdGVib29rCi0tLQoKYGBge3J9CnJtKGxpc3Q9bHMoKSkKCmxpYnJhcnkodG1hcCkKbGlicmFyeShzZikKbGlicmFyeShnZ3Bsb3QyKQpsaWJyYXJ5KGdnbWFwKQpsaWJyYXJ5KGdndGhlbWVzKQpsaWJyYXJ5KGRwbHlyKQoKdXJsIDwtICJodHRwczovL2dlb2RhdGEudWNkYXZpcy5lZHUvZ2FkbS9nYWRtNC4wL3NocC9nYWRtNDBfQkdSX3NocC56aXAiCmBgYApDbGVhcmVkIHRoZSBlbnZpcm9ubWVudCBmb3IgYmV0dGVyIG9yZ2FuaXphdGlvbiBhbmQgdGhlbiBkb3dubG9hZGVkIHRoZSBsaWJyYXJpZXMgbmVjZXNzYXJ5IHRvIGNyZWF0ZSB0aGUgbWFwcy4KCgpgYGB7cn0KCmRvd25sb2FkLmZpbGUodXJsLCAiLi9idWwuemlwIikKCgpgYGAKRG93bmxvYWRlZCB0aGUgZmlsZXMuCgpgYGB7cn0KdW56aXAoIi4vYnVsLnppcCIsIGV4ZGlyID0gImJ1bCIpCgoKYGBgClVuemlwcGVkIHRoZSBmaWxlcy4KCgpgYGB7cn0KYnVsIDwtIHN0X3JlYWQoIi4vYnVsL2dhZG00MF9CR1JfMi5zaHAiKQoKYGBgClJlYWQgdGhlIGZpbGVzLgoKYGBge3J9Cm1hcCA8LSB0bV9zaGFwZShidWwpICsgdG1fZmlsbCgiTkFNRV8xIikgKyB0bV9ib3JkZXJzKCkKCmBgYApHZW5lcmF0aW5nIGEgYmFzZSBtYXAgdG8gZ2V0IGFuIGlkZWEgb2Ygd2hhdCBpdCBzaG91bGQgbG9vayBsaWtlLgoKCmBgYHtyfQoKcHJpbnQobWFwKQpgYGAKUHJpbnRlZCB0aGUgYmFzZSBtYXAuCgoKYGBge3J9CmNvZGVzIDwtIHJlYWQuY3N2KCJzaW1wbGVjb2Rlcy5jc3YiKQptb3J0YWxpdGllcyA8LSByZWFkLmNzdigiQnVsZ2FyaWFfTW9ydGFsaXR5X1JhdGVzX011bmljaXBhbGl0aWVzX01vcnRhbGl0eS5jc3YiKQoKbmV3Y29kZXNfZGF0YSA8LSBtZXJnZShidWwsIGNvZGVzLCBieSA9ICJJRF8yIiwgYWxsLnggPSBUUlVFKQoKYGBgCkkgbWFkZSB0aGUgLmNzdiBmaWxlcyBjb250YWluaW5nIHRoZSBkYXRhIGZvciBCdWxnYXJpYSBpbnRvIGRhdGEgZnJhbWVzLiBJIHRoZW4KbWVyZ2VkIHRvZ2V0aGVyIHRoZSB0d28gQnVsZ2FyaWEgZGF0YSBzZXRzIHdoaWNoIGNvbnRhaW4gY29kZXMgZm9yIGRpZmZlcmVudCByZWdpb25zLgoKCmBgYHtyfQptb3J0YWxpdGllcyA8LSAgbW9ydGFsaXRpZXMgJT4lICBtdXRhdGUoUmVnaW9uLmVuPWlmX2Vsc2UoUmVnaW9uLmVuPT0iU29maWEgKGNhcGl0YWwpIiwgIkdyYWQgU29maXlhIiwgUmVnaW9uLmVuKSkKCm1vcnRhbGl0aWVzIDwtIG1vcnRhbGl0aWVzICU+JSBtdXRhdGUoUmVnaW9uLmVuID0gaWZfZWxzZShSZWdpb24uZW49PSJLdXJkemhhbGkiLCJLYXJkemhhbGkiLFJlZ2lvbi5lbikgKQoKbW9ydGFsaXRpZXMgPC0gbW9ydGFsaXRpZXMgJT4lICBtdXRhdGUoa2V5PXRvbG93ZXIoUmVnaW9uLmVuKSkKYGBgCkZpeGVkIHRoZSBhbHRlcm5hdGl2ZSBzcGVsbGluZyBpc3N1ZSB0aGF0IGNvbWVzIGZyb20gZGlzcGFyaXRpZXMgaW4gdGhlIG5hbWVzIG9mIGxvY2F0aW9ucy4KCgoKYGBge3J9CgptZXJnZWRfZGF0YSA8LSBtZXJnZShuZXdjb2Rlc19kYXRhLCBtb3J0YWxpdGllcywgYnk9ICJrZXkiLCBhbGwueSA9IFRSVUUpCgojbWVyZ2VkX2RhdGEgPC0gbWVyZ2UoYnVsLCBtb3J0YWxpdGllcywgYnkueCA9ICJOQU1FXzEiLCBieS55ID0gIlJlZ2lvbi5lbiIsIGFsbC54ID0gVFJVRSkKCmJ1bF9saXN0IDwtIHVuaXF1ZShidWwkTkFNRV8yKQptb3J0X2xpc3QgPC0gdW5pcXVlKG1vcnRhbGl0aWVzJFJlZ2lvbi5lbikKbWVyZ2VkX2xpc3QgPC0gdW5pcXVlKG1lcmdlZF9kYXRhJHJlZ2lvbikKCmBgYApNZXJnZWQgdGhlIGRhdGEgY29udGFpbmluZyB0aGUgY29kZXMgZm9yIHJlZ2lvbnMgYW5kIHRoZSBtb3J0YWxpdHkgZGF0YSwgdGhlbiBsb29rZWQgYXQgYWxsIHRoZSB1bmlxdWUgdmFsdWVzIHByZXNlbnQgaW4gdGhlIGRhdGFmcmFtZXMuCgoKCmBgYHtyfQptZXJnZWRfZGF0YTIgPC0gbWVyZ2VkX2RhdGEKCm1heChtZXJnZWRfZGF0YTIkWDIwMTksIG5hLnJtPVRSVUUpCm1pbihtZXJnZWRfZGF0YTIkWDIwMTksIG5hLnJtPVRSVUUpCmhpZ2hfb3V0bGllcnMgPC0gbWVyZ2VkX2RhdGEyICU+JSBmaWx0ZXIoWDIwMTkgPiA0MDAwKQpgYGAKQ3JlYXRlZCBhIG5ldyBkYXRhIGZyYW1lIHRoYXQgd2lsbCBsYXRlciBiZSBhbHRlcmVkLCBhbmQgbG9va2luZyBhdCB0aGUgbWluaW11bSBhbmQgbWF4aW11bSB2YWx1ZXMgdG8gcGlucG9pbnQgb3V0bGllcnMgYW5kIHJlbW92ZSB0aGVtLgoKCmBgYHtyfQpnZ3Bsb3QoKSsKICBnZW9tX3NmKGJ1bCwgbWFwcGluZyA9IGFlcygpLCBmaWxsID0gImdyYXk4MCIpKwogIGdlb21fc2YobWVyZ2VkX2RhdGEyLCBtYXBwaW5nID0gYWVzKCBmaWxsID0gWDIwMTkpKSsKICB0aGVtZV9taW5pbWFsKCkrCiAgbGFicyhmaWxsID0gIk1vcnRhbGl0eSBSYXRlcyIsIHRpdGxlID0gIkFkdWx0IE1vcnRhbGl0eSBSYXRlcyBpbiBCdWxnYXJpYSIpKwogIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUpKQpgYGAKUGxvdHRlZCBhIHJlZmVyZW5jZSBtYXAgdGhhdCBkb2VzIG5vdCBzZXBhcmF0ZSB0aGUgbW9ydGFsaXR5IHJhdGVzIGJ5IGdlbmRlci4KCmBgYHtyfQptaXNzaW5nIDwtIG1lcmdlZF9kYXRhMiAlPiUgZmlsdGVyKE5BTUVfMS54ID09ICJLYXJkemhhbGkiKQpgYGAKQ3JlYXRlcyBhIG5ldyBkYXRhIGZyYW1lIGNvbnRhaW5pbmcgb25seSB0aGUgZGF0YSBmb3IgdGhlIHJlZ2lvbiBjYWxsZWQgS2FyZHpoYWxpLiBJIHdhcyB1bmZvcnR1bmF0ZWx5IG1pc3NpbmcgZGF0YSBmb3IgdGhpcyBhcmVhLCBub3RlZCBieSB0aGUgZ3JleSBhcmVhcyBvbiB0aGUgbWFwLgoKCgoKRm9yIHRoZSBmb2xsb3dpbmcgZ3JhcGhzOgpJIGZpbHRlcmVkIHRoZSBkYXRhIHNvIHRoYXQgdGhlIGRhdGEgZm9yIGZlbWFsZSBhbmQgbWFsZSBhcmUgcHV0IGludG8gc2VwYXJhdGUgZGF0YSBmcmFtZXMuIEkgcGxvdHRlZCB0aGUgZ3JhcGhzIGZvciAyMDE5LCAyMDIwLCBhbmQgMjAyMSBieSBnZW5kZXIgZm9yIGV2ZXJ5IHllYXIsIGNoYW5naW5nIHRoZSBjb2xvciBvZiB0aGUgZ3JhcGhzIHRvIGNyZWF0ZSBtb3JlIGRpc3RpbmN0aW9uLiBJIGFsc28gdHJhbnNmb3JtZWQgdGhlIGRhdGEgaW50byBhIGxvZ2FyaXRobWljIHNjYWxlIHRvIHNob3cgZGlmZmVyZW5jZXMgdGhyb3VnaCB0aGUgc2NhbGUsIHNpbmNlIHRoZSBtb3J0YWxpdHkgZGlmZmVyZW5jZXMgYmV0d2VlbiByZWdpb25zIHdlcmUgbm90IHZlcnkgYXBwYXJlbnQuCmBgYHtyfQpsaWJyYXJ5KGdncGxvdDIpCmxpYnJhcnkodmlyaWRpcykKZmlsdGVyZWRfZGF0YV9mZW1hbGUgPC0gbWVyZ2VkX2RhdGEyICU+JQogIGZpbHRlcihTZXggPT0gIkZlbWFsZSIpCgpnZ3Bsb3QoKSsKICBnZW9tX3NmKGJ1bCwgbWFwcGluZyA9IGFlcygpLCBmaWxsID0gImdyYXk4MCIpKwogIGdlb21fc2YoZmlsdGVyZWRfZGF0YV9mZW1hbGUsIG1hcHBpbmcgPSBhZXMoIGZpbGwgPSBYMjAxOSkpKwogIHNjYWxlX2ZpbGxfZ3JhZGllbnRuKGNvbG91cnM9cmV2KG1hZ21hKDYpKSwKICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9Ik1vcnRhbGl0eSBSYXRlcyIsCiAgICAgICAgICAgICAgICAgICAgICAgICBuYS52YWx1ZSA9ICJncmV5MTAwIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICB0cmFucyA9ICJsb2ciKSsKICB0aGVtZV9taW5pbWFsKCkrCiAgbGFicyhmaWxsID0gIk1vcnRhbGl0eSBSYXRlcyIsIHRpdGxlID0gIkFkdWx0IEZlbWFsZSBNb3J0YWxpdHkgUmF0ZXMgaW4gQnVsZ2FyaWEgKDIwMTkpIikrCiAgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSkpCmBgYAoKYGBge3J9CmxpYnJhcnkoZ2dwbG90MikKbGlicmFyeSh2aXJpZGlzKQpmaWx0ZXJlZF9kYXRhX21hbGUgPC0gbWVyZ2VkX2RhdGEyICU+JQogIGZpbHRlcihTZXggPT0gIk1hbGUiKQoKZ2dwbG90KCkrCiAgZ2VvbV9zZihidWwsIG1hcHBpbmcgPSBhZXMoKSwgZmlsbCA9ICJncmF5ODAiKSsKICBnZW9tX3NmKGZpbHRlcmVkX2RhdGFfbWFsZSwgbWFwcGluZyA9IGFlcyggZmlsbCA9IFgyMDE5KSkrCiAgc2NhbGVfZmlsbF9ncmFkaWVudG4oY29sb3Vycz1yZXYobWFnbWEoNikpLAogICAgICAgICAgICAgICAgICAgICAgICAgbmFtZT0iTW9ydGFsaXR5IFJhdGVzIiwKICAgICAgICAgICAgICAgICAgICAgICAgIG5hLnZhbHVlID0gImdyZXkxMDAiLCAKICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zID0gImxvZyIpKwogIHRoZW1lX21pbmltYWwoKSsKICBsYWJzKGZpbGwgPSAiTW9ydGFsaXR5IFJhdGVzIiwgdGl0bGUgPSAiQWR1bHQgTWFsZSBNb3J0YWxpdHkgUmF0ZXMgaW4gQnVsZ2FyaWEgKDIwMTkpIikrCiAgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSkpCmBgYApgYGB7cn0KbGlicmFyeShnZ3Bsb3QyKQpsaWJyYXJ5KHZpcmlkaXMpCmZpbHRlcmVkX2RhdGFfZmVtYWxlIDwtIG1lcmdlZF9kYXRhMiAlPiUKICBmaWx0ZXIoU2V4ID09ICJGZW1hbGUiKQoKZ2dwbG90KCkrCiAgZ2VvbV9zZihidWwsIG1hcHBpbmcgPSBhZXMoKSwgZmlsbCA9ICJncmF5ODAiKSsKICBnZW9tX3NmKGZpbHRlcmVkX2RhdGFfZmVtYWxlLCBtYXBwaW5nID0gYWVzKCBmaWxsID0gWDIwMjApKSsKICBzY2FsZV9maWxsX2dyYWRpZW50bihjb2xvdXJzPXJldihtYWdtYSg2KSksCiAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lPSJNb3J0YWxpdHkgUmF0ZXMiLAogICAgICAgICAgICAgICAgICAgICAgICAgbmEudmFsdWUgPSAiZ3JleTEwMCIsIAogICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnMgPSAibG9nIikrCiAgdGhlbWVfbWluaW1hbCgpKwogIGxhYnMoZmlsbCA9ICJNb3J0YWxpdHkgUmF0ZXMiLCB0aXRsZSA9ICJBZHVsdCBGZW1hbGUgTW9ydGFsaXR5IFJhdGVzIGluIEJ1bGdhcmlhICgyMDIwKSIpKwogIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUpKQpgYGAKCmBgYHtyfQpsaWJyYXJ5KGdncGxvdDIpCmxpYnJhcnkodmlyaWRpcykKZmlsdGVyZWRfZGF0YV9tYWxlIDwtIG1lcmdlZF9kYXRhMiAlPiUKICBmaWx0ZXIoU2V4ID09ICJNYWxlIikKCmdncGxvdCgpKwogIGdlb21fc2YoYnVsLCBtYXBwaW5nID0gYWVzKCksIGZpbGwgPSAiZ3JheTgwIikrCiAgZ2VvbV9zZihmaWx0ZXJlZF9kYXRhX21hbGUsIG1hcHBpbmcgPSBhZXMoIGZpbGwgPSBYMjAyMCkpKwogIHNjYWxlX2ZpbGxfZ3JhZGllbnRuKGNvbG91cnM9cmV2KG1hZ21hKDYpKSwKICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9Ik1vcnRhbGl0eSBSYXRlcyIsCiAgICAgICAgICAgICAgICAgICAgICAgICBuYS52YWx1ZSA9ICJncmV5MTAwIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICB0cmFucyA9ICJsb2ciKSsKICB0aGVtZV9taW5pbWFsKCkrCiAgbGFicyhmaWxsID0gIk1vcnRhbGl0eSBSYXRlcyIsIHRpdGxlID0gIkFkdWx0IE1hbGUgTW9ydGFsaXR5IFJhdGVzIGluIEJ1bGdhcmlhICgyMDIwKSIpKwogIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUpKQpgYGAKCmBgYHtyfQpsaWJyYXJ5KGdncGxvdDIpCmxpYnJhcnkodmlyaWRpcykKZmlsdGVyZWRfZGF0YV9mZW1hbGUgPC0gbWVyZ2VkX2RhdGEyICU+JQogIGZpbHRlcihTZXggPT0gIkZlbWFsZSIpCgpnZ3Bsb3QoKSsKICBnZW9tX3NmKGJ1bCwgbWFwcGluZyA9IGFlcygpLCBmaWxsID0gImdyYXk4MCIpKwogIGdlb21fc2YoZmlsdGVyZWRfZGF0YV9mZW1hbGUsIG1hcHBpbmcgPSBhZXMoIGZpbGwgPSBYMjAyMSkpKwogIHNjYWxlX2ZpbGxfZ3JhZGllbnRuKGNvbG91cnM9cmV2KG1hZ21hKDYpKSwKICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9Ik1vcnRhbGl0eSBSYXRlcyIsCiAgICAgICAgICAgICAgICAgICAgICAgICBuYS52YWx1ZSA9ICJncmV5MTAwIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICB0cmFucyA9ICJsb2ciKSsKICB0aGVtZV9taW5pbWFsKCkrCiAgbGFicyhmaWxsID0gIk1vcnRhbGl0eSBSYXRlcyIsIHRpdGxlID0gIkFkdWx0IEZlbWFsZSBNb3J0YWxpdHkgUmF0ZXMgaW4gQnVsZ2FyaWEgKDIwMjEpIikrCiAgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSkpCmBgYAoKYGBge3J9CmxpYnJhcnkodmlyaWRpcykKZmlsdGVyZWRfZGF0YV9tYWxlIDwtIG1lcmdlZF9kYXRhMiAlPiUKICBmaWx0ZXIoU2V4ID09ICJNYWxlIikKCmdncGxvdCgpKwogIGdlb21fc2YoYnVsLCBtYXBwaW5nID0gYWVzKCksIGZpbGwgPSAiZ3JheTgwIikrCiAgZ2VvbV9zZihmaWx0ZXJlZF9kYXRhX21hbGUsIG1hcHBpbmcgPSBhZXMoIGZpbGwgPSBYMjAyMSkpKwogIHNjYWxlX2ZpbGxfZ3JhZGllbnRuKGNvbG91cnM9cmV2KG1hZ21hKDYpKSwKICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9Ik1vcnRhbGl0eSBSYXRlcyIsCiAgICAgICAgICAgICAgICAgICAgICAgICBuYS52YWx1ZSA9ICJncmV5MTAwIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICB0cmFucyA9ICJsb2ciKSsKICB0aGVtZV9taW5pbWFsKCkrCiAgbGFicyhmaWxsID0gIk1vcnRhbGl0eSBSYXRlcyIsIHRpdGxlID0gIkFkdWx0IE1hbGUgTW9ydGFsaXR5IFJhdGVzIGluIEJ1bGdhcmlhICgyMDIxKSIpKwogIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUpKQpgYGAKCgpUaGlzIHdhcyB0aGUgc3RhcnQgb2YgYW4gaWRlYSBJIGhhZCB0byBjcmVhdGUgYSBiYXIgZ3JhcGggdGhhdCB0b29rIHRoZSBtZWFuIG9mIHRoZSBtb3J0YWxpdHkgcmF0ZXMgaW4gMjAxOSwgMjAyMCwgYW5kIDIwMjEsIGFjcm9zcyBib3RoIGdlbmRlcnMgaW4gb3JkZXIgdG8gc2hvdyBhIHZpc3VhbCBjb21wYXJpc29uIGJldHdlZW4gdGhlbQpUaGlzIHdvdWxkIGhhdmUgYmVlbiBjYXJyaWVkIG91dCBoYWQgdGhlcmUgYmVlbiBleHRyYSB0aW1lIHRvIHdvcmsgb24gdGhlIHByb2plY3QKYGBge3J9CmZpbHRlcmVkX2RhdGFfbWFsZSA8LSBmaWx0ZXJlZF9kYXRhX21hbGUgJT4lCiAgbXV0YXRlKG1lYW5fbWFsZV8yMDE5ID0gbWVhbihYMjAxOSwgbmEucm0gPSBUUlVFKSwKICAgICAgICAgbWVhbl9tYWxlXzIwMjAgPSBtZWFuKFgyMDIwLCBuYS5ybSA9IFRSVUUpLAogICAgICAgICBtZWFuX21hbGVfMjAyMSA9IG1lYW4oWDIwMjEsIG5hLnJtID0gVFJVRSkpCmZpbHRlcmVkX2RhdGFfZmVtYWxlIDwtIGZpbHRlcmVkX2RhdGFfZmVtYWxlICU+JQogIG11dGF0ZShtZWFuX2ZlbWFsZV8yMDE5ID0gbWVhbihYMjAxOSwgbmEucm0gPSBUUlVFKSwKICAgICAgICAgbWVhbl9mZW1hbGVfMjAyMCA9IG1lYW4oWDIwMjAsIG5hLnJtID0gVFJVRSksCiAgICAgICAgIG1lYW5fZmVtYWxlXzIwMjEgPSBtZWFuKFgyMDIxLCBuYS5ybSA9IFRSVUUpKQpgYGAKCgoKCgo=