In this story, I’ll use CDC API to retrieve firearm mortality data for each state per 100,000 persons. Then, after categorizing gun control laws per states, we’ll create a 5-point Likert scale categorizing gun control laws from most lax to strictest.

The goal of the story is to answer if stricter firearm control laws help reduce firearm mortality

Import libraries

library(tidyverse)
library(httr)
library(jsonlite)
library(ggplot2)
library(tidyr)
library(usmap)
library(gridExtra)
library(kableExtra)

Load the data

Let’s access the firearm mortality data from the CDC using an available API (https://open.cdc.gov/apis.html)

url <- "https://data.cdc.gov/resource/489q-934x.json"
response <- GET(url)
data <- content(response, as = "text")
df <- as.data.frame(fromJSON(data))

# View data
kable(head(df), "simple")
year_and_quarter time_period cause_of_death rate_type unit rate_overall rate_sex_female rate_sex_male rate_alaska rate_alabama rate_arkansas rate_arizona rate_california rate_colorado rate_connecticut rate_district_of_columbia rate_delaware rate_florida rate_georgia rate_hawaii rate_iowa rate_idaho rate_illinois rate_indiana rate_kansas rate_kentucky rate_louisiana rate_massachusetts rate_maryland rate_maine rate_michigan rate_minnesota rate_missouri rate_mississippi rate_montana rate_north_carolina rate_north_dakota rate_nebraska rate_new_hampshire rate_new_jersey rate_new_mexico rate_nevada rate_new_york rate_ohio rate_oklahoma rate_oregon rate_pennsylvania rate_rhode_island rate_south_carolina rate_south_dakota rate_tennessee rate_texas rate_utah rate_virginia rate_vermont rate_washington rate_wisconsin rate_west_virginia rate_wyoming rate_age_1_4 rate_age_5_14 rate_age_15_24 rate_age_25_34 rate_age_35_44 rate_age_45_54 rate_age_55_64 rate_65_74 rate_age_75_84 rate_age_85_plus
2021 Q1 12 months ending with quarter All causes Age-adjusted Deaths per 100,000 866.3 716.3 1040.4 779.2 1123.4 1043.1 853.2 767.7 760.9 784.3 904.8 866.2 757.3 957.4 585.9 848.3 789.6 861.5 981.8 901.2 1064.2 1080.3 768 847.9 785.3 911.2 737.8 956.2 1197 836.6 893.7 835.5 822.7 744.9 853.1 952.7 895.2 817.6 983.2 1063.5 751.4 895.1 828.9 981.9 882.7 1056.8 922 771.2 824.8 737.9 714.8 825.8 1096.9 854 NA NA NA NA NA NA NA NA NA NA
2021 Q1 12 months ending with quarter Alzheimer disease Age-adjusted Deaths per 100,000 32.1 36.8 24.8 28.2 51.2 44.1 31.3 41 36 20.6 11.1 35.4 19.7 45.9 22.4 29.7 37 28.3 32 24.2 31.7 45.3 17.8 16 27.6 36.3 32.9 33.9 58.3 22.6 36.8 37.6 32 25.8 22.2 25.9 27.5 14 37.5 36.6 36.4 23.5 32 40 37.4 42.8 44.9 41.1 28.3 34.3 42 31.7 35.2 32.1 NA NA NA NA NA NA NA NA NA NA
2021 Q1 12 months ending with quarter COVID-19 Age-adjusted Deaths per 100,000 120.7 94 153.9 44.4 160.2 130.6 142.1 128.5 83.6 138.9 148.6 106.8 80.6 130.5 20.7 119.9 79.2 121.3 132.8 121.8 109.6 146.7 126 111 36.1 101.7 85.1 113 171.5 91.8 99.3 132.8 101.3 60.9 172.6 144.1 133.4 174.2 122.2 157.8 37.1 123 138.4 126.6 145.8 122.5 162.3 68.7 92 21.5 46.5 86.1 94.2 84 NA NA NA NA NA NA NA NA NA NA
2021 Q1 12 months ending with quarter Cancer Age-adjusted Deaths per 100,000 142 122.8 167.7 143 160.5 160.7 125.5 128.5 123.4 132.1 136 149.1 134.4 145.8 124.1 145.4 135 148.2 160.6 148.1 177 158.1 132.8 139.5 157.5 155.5 136.4 157.4 172 136 146 136.7 143.3 143.8 129.8 130 143.1 125.7 157.6 167.7 146.9 150.8 141.3 150.5 147 161.9 137 116.2 144.3 151.9 139.8 146.9 176.3 138 NA NA NA NA NA NA NA NA NA NA
2021 Q1 12 months ending with quarter Chronic liver disease and cirrhosis Age-adjusted Deaths per 100,000 13.9 9.8 18.3 23.6 17.2 15.9 18.2 14.9 18.1 12.7 9 10.6 13.4 12.5 8.6 11.9 16 11.5 14.4 15.4 17.5 11.1 11.5 9.6 14.2 14.5 14 12.9 16.3 21.6 13.1 17.9 14 12.5 9.7 36.8 16.6 8.3 13.1 18.9 16.5 10.4 13.7 16.3 29 16.8 16.4 10.7 11.8 12 15 12.8 17.4 29.1 NA NA NA NA NA NA NA NA NA NA
2021 Q1 12 months ending with quarter Chronic lower respiratory diseases Age-adjusted Deaths per 100,000 33.8 30.9 37.5 28.4 50.4 57.5 34.5 26.3 36.6 22.5 18.9 32 31.2 39.5 16.9 35.9 36.8 31.3 49.5 40.9 52.7 38.9 25.2 25.3 36.8 38.5 28.3 43.4 56.7 38.8 35.4 32.1 40.2 30.5 22.8 38 40.6 22.9 40.4 56.3 32.4 30.2 24.1 41.9 33.6 47.6 34.3 30.2 29.9 33 27.5 32.4 56 51.2 NA NA NA NA NA NA NA NA NA NA

Data Tidying

Let’s filter the data to only include injury per firearm in 2023 Quarter 1, 12 months ending quarter, Age adjusted

# Apply the filter to the data
firearm_data <- df %>% 
    filter(cause_of_death == 'Firearm-related injury' &
         year_and_quarter == '2023 Q1' &
         time_period == '12 months ending with quarter' &
         rate_type == "Age-adjusted")

#Select only the states columns
firearm_df <- firearm_data[1, 9:59]

# Reformat the data
firearm_df <- firearm_df %>%
  gather(key = "state", value = "firearm_mortality_rate", starts_with("rate_")) %>%
  mutate(firearm_mortality_rate = as.numeric(firearm_mortality_rate),
         state = gsub("rate_", "", state)) %>% 
  filter(state != "district_of_columbia") %>% 
  arrange(state)

# View first 5 elements of the data
head(firearm_df)
##        state firearm_mortality_rate
## 1    alabama                   26.4
## 2     alaska                   21.4
## 3    arizona                   20.0
## 4   arkansas                   22.7
## 5 california                    8.6
## 6   colorado                   17.0

Now, let’s create a 5 point Likert scale categorizing gun control laws from loosest to strictest and assign each state to the most appropriate Likert bins

# Categories for  guns policies per states
likert_values <-c("Very loose", "Very loose","Very loose","Very loose","Very Strict",
                  "Strict","Very Strict","Strict","Moderate","Very loose",
                  "Very Strict","Very loose","Very Strict","Loose","Very loose",
                  "Very loose","Very loose","Very loose","Very loose","Very Strict",
                  "Very Strict","Moderate","Moderate","Very loose","Very loose","Very loose",
                  "Moderate","Moderate","Very loose","Very Strict","Moderate","Very Strict",
                  "Moderate","Very loose","Loose","Very loose","Strict","Strict",
                  "Strict","Very loose","Very loose","Very loose","Very loose",
                  "Very loose","Moderate","Strict","Strict","Very loose","Moderate","Very loose")

# Assuming your data frame is named df_ordered
firearm_df$gun_law <- likert_values

# Change the name of the column

firearm_df$state <- c("Alabama", "Alaska", "Arizona", "Arkansas", "California", 
            "Colorado", "Connecticut", "Delaware", "Florida", "Georgia", 
            "Hawaii", "Idaho", "Illinois", "Indiana", "Iowa", "Kansas", 
            "Kentucky", "Louisiana", "Maine", "Maryland", "Massachusetts", 
            "Michigan", "Minnesota", "Mississippi", "Missouri", "Montana", 
            "Nebraska", "Nevada", "New Hampshire", "New Jersey", "New Mexico", 
            "New York", "North Carolina", "North Dakota", "Ohio", "Oklahoma", 
            "Oregon", "Pennsylvania", "Rhode Island", "South Carolina", 
            "South Dakota", "Tennessee", "Texas", "Utah", "Vermont", "Virginia", 
            "Washington", "West Virginia", "Wisconsin", "Wyoming")

# Print the data 
head(firearm_df)
##        state firearm_mortality_rate     gun_law
## 1    Alabama                   26.4  Very loose
## 2     Alaska                   21.4  Very loose
## 3    Arizona                   20.0  Very loose
## 4   Arkansas                   22.7  Very loose
## 5 California                    8.6 Very Strict
## 6   Colorado                   17.0      Strict

Data Visualization

Correlation between firearm policy and mortality rate

Let’s calculate the correlation between strict firearm policy and the mortality rate.

# Calculate correlation coefficient
correlation <- cor(firearm_df$firearm_mortality_rate, as.numeric(factor(firearm_df$gun_law, levels = c("Very loose", "Loose", "Moderate", "Strict", "Very Strict"))))

correlation
## [1] -0.6656803

The correlation coefficient of -0.6656803 indicates a strong negative correlation between firearm mortality rates and the stringency of gun control laws. This suggests that as gun control laws become stricter, firearm mortality rates tend to decrease.

Create a heat map

Let’s visualize the relationship between gun control laws and firearm mortality rate

# Plot US map for firearm mortality rates
plot_firearm <- plot_usmap(data = firearm_df, values = "firearm_mortality_rate", color = "orange", labels = FALSE) + 
  scale_fill_continuous(low = "white", high = "orange", name = "Firearm Mortality Rate", label = scales::comma) + 
  theme(legend.position = "bottom", panel.background = element_rect(colour = "black")) + 
  labs(title = "Firearm Mortality Rate by State")

# Plot US map for gun control laws
plot_gun_law <- plot_usmap(data = firearm_df, values = "gun_law", color = "orange", labels = FALSE) + 
  scale_fill_manual(values = c("#F0F0F0", "#000000", "#404040", "#808080","#C0C0C0"),
                    name = "Gun Control",
                    breaks = unique(firearm_df$gun_law)) + 
  theme(legend.position = "bottom",
        panel.background = element_rect(colour = "black"),
        legend.key.size = unit(0.1, "cm")) + 
  labs(title = "Gun Control Laws by State")

# Arrange plots side by side
grid.arrange(plot_firearm, plot_gun_law, ncol = 2)

The heat map shows that the states with the most strictest guns laws have a lower mortality rates.

Conclusion

In this story, we aim to explore the impact of stricter firearm control laws on reduce firearm mortality rates. Through correlating the strictness of firearm control laws across states with their respective firearm mortality rates and visualizing the data via a heat map, we observe a notable trend: As gun control laws tighten, firearm mortality rates generally decreases.

# Calculate the average firearm mortality rate
average_rate <- mean(firearm_df$firearm_mortality_rate)


# Reorder the factor levels of gun_law
firearm_df$gun_law <- factor(firearm_df$gun_law, levels = c("Very Strict", "Strict", "Moderate", "Loose", "Very loose"))

# Create the scatter plot
ggplot(firearm_df, aes(x = gun_law, y = firearm_mortality_rate, label = state)) +
  geom_point(aes(color = ifelse(firearm_mortality_rate > average_rate,  "Above Average", "Below Average")), size = 1) +
  geom_text(size = 2, hjust = -0.5) +  
  scale_color_manual(values = c( "red", "grey")) +
  labs(x = "Gun Control Laws", y = "Firearm Mortality Rate", title = "Firearm Mortality Rate vs. Gun Control Laws") +
  geom_hline(yintercept = average_rate, linetype = "dotted") + 
  theme_minimal() +
  guides(color = guide_legend(title = "Mortality Rate", 
                              )) 

The national average for firearm mortality stands at 15.5 per 100,000 persons.

The above graph shows that:

  • States characterized by very strict gun control laws consistently have firearm mortality rates below the national average.

  • Conversely, over 70% of states categorized as having lenient gun control laws surpass the national average in firearm mortality rates.

  • Moreover, Off of the 21 states in the US that have firearm mortality rates above the national average, 16 states have very loose gun control laws.

Although it’s important to consider other factors that could contribute to lower mortality rates in these states, the data suggests that stricter gun control laws correspond to lower firearm mortality rates.


LS0tDQp0aXRsZTogIlN0b3J5IDMiDQphdXRob3I6ICJLb3NzaSBBa3BsYWthIg0KZGF0ZTogImByIFN5cy5EYXRlKClgIg0Kb3V0cHV0OiBvcGVuaW50cm86OmxhYl9yZXBvcnQNCi0tLQ0KDQpJbiB0aGlzIHN0b3J5LCBJJ2xsIHVzZSBDREMgQVBJIHRvIHJldHJpZXZlIGZpcmVhcm0gbW9ydGFsaXR5IGRhdGEgZm9yIGVhY2ggc3RhdGUgcGVyIDEwMCwwMDAgcGVyc29ucy4gVGhlbiwgYWZ0ZXIgY2F0ZWdvcml6aW5nIGd1biBjb250cm9sIGxhd3MgcGVyIHN0YXRlcywgd2UnbGwgY3JlYXRlIGEgNS1wb2ludCBMaWtlcnQgc2NhbGUgY2F0ZWdvcml6aW5nIGd1biBjb250cm9sIGxhd3MgZnJvbSBtb3N0IGxheCB0byBzdHJpY3Rlc3QuIA0KDQpUaGUgZ29hbCBvZiB0aGUgc3RvcnkgaXMgdG8gYW5zd2VyIGlmIHN0cmljdGVyIGZpcmVhcm0gY29udHJvbCBsYXdzIGhlbHAgcmVkdWNlIGZpcmVhcm0gbW9ydGFsaXR5DQoNCiMjIEltcG9ydCBsaWJyYXJpZXMNCg0KYGBge3IgbG9hZC1wYWNrYWdlcywgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCmxpYnJhcnkodGlkeXZlcnNlKQ0KbGlicmFyeShodHRyKQ0KbGlicmFyeShqc29ubGl0ZSkNCmxpYnJhcnkoZ2dwbG90MikNCmxpYnJhcnkodGlkeXIpDQpsaWJyYXJ5KHVzbWFwKQ0KbGlicmFyeShncmlkRXh0cmEpDQpsaWJyYXJ5KGthYmxlRXh0cmEpDQpgYGANCg0KIyMgTG9hZCB0aGUgZGF0YQ0KDQpMZXQncyBhY2Nlc3MgdGhlIGZpcmVhcm0gbW9ydGFsaXR5IGRhdGEgZnJvbSB0aGUgQ0RDIHVzaW5nIGFuIGF2YWlsYWJsZSBBUEkgKGh0dHBzOi8vb3Blbi5jZGMuZ292L2FwaXMuaHRtbCkNCg0KYGBge3J9DQp1cmwgPC0gImh0dHBzOi8vZGF0YS5jZGMuZ292L3Jlc291cmNlLzQ4OXEtOTM0eC5qc29uIg0KcmVzcG9uc2UgPC0gR0VUKHVybCkNCmRhdGEgPC0gY29udGVudChyZXNwb25zZSwgYXMgPSAidGV4dCIpDQpkZiA8LSBhcy5kYXRhLmZyYW1lKGZyb21KU09OKGRhdGEpKQ0KDQojIFZpZXcgZGF0YQ0Ka2FibGUoaGVhZChkZiksICJzaW1wbGUiKQ0KYGBgDQoNCiMjIERhdGEgVGlkeWluZyANCg0KTGV0J3MgZmlsdGVyIHRoZSBkYXRhIHRvIG9ubHkgaW5jbHVkZSBpbmp1cnkgcGVyIGZpcmVhcm0gaW4gMjAyMyBRdWFydGVyIDEsIDEyIG1vbnRocyBlbmRpbmcgcXVhcnRlciwgQWdlIGFkanVzdGVkDQoNCmBgYHtyfQ0KIyBBcHBseSB0aGUgZmlsdGVyIHRvIHRoZSBkYXRhDQpmaXJlYXJtX2RhdGEgPC0gZGYgJT4lIA0KICAgIGZpbHRlcihjYXVzZV9vZl9kZWF0aCA9PSAnRmlyZWFybS1yZWxhdGVkIGluanVyeScgJg0KICAgICAgICAgeWVhcl9hbmRfcXVhcnRlciA9PSAnMjAyMyBRMScgJg0KICAgICAgICAgdGltZV9wZXJpb2QgPT0gJzEyIG1vbnRocyBlbmRpbmcgd2l0aCBxdWFydGVyJyAmDQogICAgICAgICByYXRlX3R5cGUgPT0gIkFnZS1hZGp1c3RlZCIpDQoNCiNTZWxlY3Qgb25seSB0aGUgc3RhdGVzIGNvbHVtbnMNCmZpcmVhcm1fZGYgPC0gZmlyZWFybV9kYXRhWzEsIDk6NTldDQoNCiMgUmVmb3JtYXQgdGhlIGRhdGENCmZpcmVhcm1fZGYgPC0gZmlyZWFybV9kZiAlPiUNCiAgZ2F0aGVyKGtleSA9ICJzdGF0ZSIsIHZhbHVlID0gImZpcmVhcm1fbW9ydGFsaXR5X3JhdGUiLCBzdGFydHNfd2l0aCgicmF0ZV8iKSkgJT4lDQogIG11dGF0ZShmaXJlYXJtX21vcnRhbGl0eV9yYXRlID0gYXMubnVtZXJpYyhmaXJlYXJtX21vcnRhbGl0eV9yYXRlKSwNCiAgICAgICAgIHN0YXRlID0gZ3N1YigicmF0ZV8iLCAiIiwgc3RhdGUpKSAlPiUgDQogIGZpbHRlcihzdGF0ZSAhPSAiZGlzdHJpY3Rfb2ZfY29sdW1iaWEiKSAlPiUgDQogIGFycmFuZ2Uoc3RhdGUpDQoNCiMgVmlldyBmaXJzdCA1IGVsZW1lbnRzIG9mIHRoZSBkYXRhDQpoZWFkKGZpcmVhcm1fZGYpDQpgYGANCg0KTm93LCBsZXQncyBjcmVhdGUgYSA1IHBvaW50IExpa2VydCBzY2FsZSBjYXRlZ29yaXppbmcgZ3VuIGNvbnRyb2wgbGF3cyBmcm9tIGxvb3Nlc3QgdG8gc3RyaWN0ZXN0IGFuZCBhc3NpZ24gZWFjaCBzdGF0ZSB0byB0aGUgbW9zdCBhcHByb3ByaWF0ZSBMaWtlcnQgYmlucw0KDQotIFJlZmVyZW5jZTogImh0dHBzOi8vd2lzZXZvdGVyLmNvbS9zdGF0ZS1yYW5raW5ncy9zdGF0ZXMtd2l0aC1zdHJpY3Rlc3QtZ3VuLWxhd3MvIyINCg0KYGBge3J9DQojIENhdGVnb3JpZXMgZm9yICBndW5zIHBvbGljaWVzIHBlciBzdGF0ZXMNCmxpa2VydF92YWx1ZXMgPC1jKCJWZXJ5IGxvb3NlIiwgIlZlcnkgbG9vc2UiLCJWZXJ5IGxvb3NlIiwiVmVyeSBsb29zZSIsIlZlcnkgU3RyaWN0IiwNCiAgICAgICAgICAgICAgICAgICJTdHJpY3QiLCJWZXJ5IFN0cmljdCIsIlN0cmljdCIsIk1vZGVyYXRlIiwiVmVyeSBsb29zZSIsDQogICAgICAgICAgICAgICAgICAiVmVyeSBTdHJpY3QiLCJWZXJ5IGxvb3NlIiwiVmVyeSBTdHJpY3QiLCJMb29zZSIsIlZlcnkgbG9vc2UiLA0KICAgICAgICAgICAgICAgICAgIlZlcnkgbG9vc2UiLCJWZXJ5IGxvb3NlIiwiVmVyeSBsb29zZSIsIlZlcnkgbG9vc2UiLCJWZXJ5IFN0cmljdCIsDQogICAgICAgICAgICAgICAgICAiVmVyeSBTdHJpY3QiLCJNb2RlcmF0ZSIsIk1vZGVyYXRlIiwiVmVyeSBsb29zZSIsIlZlcnkgbG9vc2UiLCJWZXJ5IGxvb3NlIiwNCiAgICAgICAgICAgICAgICAgICJNb2RlcmF0ZSIsIk1vZGVyYXRlIiwiVmVyeSBsb29zZSIsIlZlcnkgU3RyaWN0IiwiTW9kZXJhdGUiLCJWZXJ5IFN0cmljdCIsDQogICAgICAgICAgICAgICAgICAiTW9kZXJhdGUiLCJWZXJ5IGxvb3NlIiwiTG9vc2UiLCJWZXJ5IGxvb3NlIiwiU3RyaWN0IiwiU3RyaWN0IiwNCiAgICAgICAgICAgICAgICAgICJTdHJpY3QiLCJWZXJ5IGxvb3NlIiwiVmVyeSBsb29zZSIsIlZlcnkgbG9vc2UiLCJWZXJ5IGxvb3NlIiwNCiAgICAgICAgICAgICAgICAgICJWZXJ5IGxvb3NlIiwiTW9kZXJhdGUiLCJTdHJpY3QiLCJTdHJpY3QiLCJWZXJ5IGxvb3NlIiwiTW9kZXJhdGUiLCJWZXJ5IGxvb3NlIikNCg0KIyBBc3N1bWluZyB5b3VyIGRhdGEgZnJhbWUgaXMgbmFtZWQgZGZfb3JkZXJlZA0KZmlyZWFybV9kZiRndW5fbGF3IDwtIGxpa2VydF92YWx1ZXMNCg0KIyBDaGFuZ2UgdGhlIG5hbWUgb2YgdGhlIGNvbHVtbg0KDQpmaXJlYXJtX2RmJHN0YXRlIDwtIGMoIkFsYWJhbWEiLCAiQWxhc2thIiwgIkFyaXpvbmEiLCAiQXJrYW5zYXMiLCAiQ2FsaWZvcm5pYSIsIA0KICAgICAgICAgICAgIkNvbG9yYWRvIiwgIkNvbm5lY3RpY3V0IiwgIkRlbGF3YXJlIiwgIkZsb3JpZGEiLCAiR2VvcmdpYSIsIA0KICAgICAgICAgICAgIkhhd2FpaSIsICJJZGFobyIsICJJbGxpbm9pcyIsICJJbmRpYW5hIiwgIklvd2EiLCAiS2Fuc2FzIiwgDQogICAgICAgICAgICAiS2VudHVja3kiLCAiTG91aXNpYW5hIiwgIk1haW5lIiwgIk1hcnlsYW5kIiwgIk1hc3NhY2h1c2V0dHMiLCANCiAgICAgICAgICAgICJNaWNoaWdhbiIsICJNaW5uZXNvdGEiLCAiTWlzc2lzc2lwcGkiLCAiTWlzc291cmkiLCAiTW9udGFuYSIsIA0KICAgICAgICAgICAgIk5lYnJhc2thIiwgIk5ldmFkYSIsICJOZXcgSGFtcHNoaXJlIiwgIk5ldyBKZXJzZXkiLCAiTmV3IE1leGljbyIsIA0KICAgICAgICAgICAgIk5ldyBZb3JrIiwgIk5vcnRoIENhcm9saW5hIiwgIk5vcnRoIERha290YSIsICJPaGlvIiwgIk9rbGFob21hIiwgDQogICAgICAgICAgICAiT3JlZ29uIiwgIlBlbm5zeWx2YW5pYSIsICJSaG9kZSBJc2xhbmQiLCAiU291dGggQ2Fyb2xpbmEiLCANCiAgICAgICAgICAgICJTb3V0aCBEYWtvdGEiLCAiVGVubmVzc2VlIiwgIlRleGFzIiwgIlV0YWgiLCAiVmVybW9udCIsICJWaXJnaW5pYSIsIA0KICAgICAgICAgICAgIldhc2hpbmd0b24iLCAiV2VzdCBWaXJnaW5pYSIsICJXaXNjb25zaW4iLCAiV3lvbWluZyIpDQoNCiMgUHJpbnQgdGhlIGRhdGEgDQpoZWFkKGZpcmVhcm1fZGYpDQoNCmBgYA0KDQojIyBEYXRhIFZpc3VhbGl6YXRpb24NCg0KIyMjIENvcnJlbGF0aW9uIGJldHdlZW4gZmlyZWFybSBwb2xpY3kgYW5kIG1vcnRhbGl0eSByYXRlDQoNCkxldCdzIGNhbGN1bGF0ZSB0aGUgY29ycmVsYXRpb24gYmV0d2VlbiBzdHJpY3QgZmlyZWFybSBwb2xpY3kgYW5kIHRoZSBtb3J0YWxpdHkgcmF0ZS4NCg0KYGBge3J9DQojIENhbGN1bGF0ZSBjb3JyZWxhdGlvbiBjb2VmZmljaWVudA0KY29ycmVsYXRpb24gPC0gY29yKGZpcmVhcm1fZGYkZmlyZWFybV9tb3J0YWxpdHlfcmF0ZSwgYXMubnVtZXJpYyhmYWN0b3IoZmlyZWFybV9kZiRndW5fbGF3LCBsZXZlbHMgPSBjKCJWZXJ5IGxvb3NlIiwgIkxvb3NlIiwgIk1vZGVyYXRlIiwgIlN0cmljdCIsICJWZXJ5IFN0cmljdCIpKSkpDQoNCmNvcnJlbGF0aW9uDQpgYGANCg0KVGhlIGNvcnJlbGF0aW9uIGNvZWZmaWNpZW50IG9mIC0wLjY2NTY4MDMgaW5kaWNhdGVzIGEgc3Ryb25nIG5lZ2F0aXZlIGNvcnJlbGF0aW9uIGJldHdlZW4gZmlyZWFybSBtb3J0YWxpdHkgcmF0ZXMgYW5kIHRoZSBzdHJpbmdlbmN5IG9mIGd1biBjb250cm9sIGxhd3MuIA0KVGhpcyBzdWdnZXN0cyB0aGF0IGFzIGd1biBjb250cm9sIGxhd3MgYmVjb21lIHN0cmljdGVyLCBmaXJlYXJtIG1vcnRhbGl0eSByYXRlcyB0ZW5kIHRvIGRlY3JlYXNlLiANCg0KDQojIyMgQ3JlYXRlIGEgaGVhdCBtYXAgDQoNCkxldCdzIHZpc3VhbGl6ZSB0aGUgcmVsYXRpb25zaGlwIGJldHdlZW4gZ3VuIGNvbnRyb2wgbGF3cyBhbmQgZmlyZWFybSBtb3J0YWxpdHkgcmF0ZQ0KDQpgYGB7cn0NCiMgUGxvdCBVUyBtYXAgZm9yIGZpcmVhcm0gbW9ydGFsaXR5IHJhdGVzDQpwbG90X2ZpcmVhcm0gPC0gcGxvdF91c21hcChkYXRhID0gZmlyZWFybV9kZiwgdmFsdWVzID0gImZpcmVhcm1fbW9ydGFsaXR5X3JhdGUiLCBjb2xvciA9ICJvcmFuZ2UiLCBsYWJlbHMgPSBGQUxTRSkgKyANCiAgc2NhbGVfZmlsbF9jb250aW51b3VzKGxvdyA9ICJ3aGl0ZSIsIGhpZ2ggPSAib3JhbmdlIiwgbmFtZSA9ICJGaXJlYXJtIE1vcnRhbGl0eSBSYXRlIiwgbGFiZWwgPSBzY2FsZXM6OmNvbW1hKSArIA0KICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAiYm90dG9tIiwgcGFuZWwuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChjb2xvdXIgPSAiYmxhY2siKSkgKyANCiAgbGFicyh0aXRsZSA9ICJGaXJlYXJtIE1vcnRhbGl0eSBSYXRlIGJ5IFN0YXRlIikNCg0KIyBQbG90IFVTIG1hcCBmb3IgZ3VuIGNvbnRyb2wgbGF3cw0KcGxvdF9ndW5fbGF3IDwtIHBsb3RfdXNtYXAoZGF0YSA9IGZpcmVhcm1fZGYsIHZhbHVlcyA9ICJndW5fbGF3IiwgY29sb3IgPSAib3JhbmdlIiwgbGFiZWxzID0gRkFMU0UpICsgDQogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IGMoIiNGMEYwRjAiLCAiIzAwMDAwMCIsICIjNDA0MDQwIiwgIiM4MDgwODAiLCIjQzBDMEMwIiksDQogICAgICAgICAgICAgICAgICAgIG5hbWUgPSAiR3VuIENvbnRyb2wiLA0KICAgICAgICAgICAgICAgICAgICBicmVha3MgPSB1bmlxdWUoZmlyZWFybV9kZiRndW5fbGF3KSkgKyANCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gImJvdHRvbSIsDQogICAgICAgIHBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoY29sb3VyID0gImJsYWNrIiksDQogICAgICAgIGxlZ2VuZC5rZXkuc2l6ZSA9IHVuaXQoMC4xLCAiY20iKSkgKyANCiAgbGFicyh0aXRsZSA9ICJHdW4gQ29udHJvbCBMYXdzIGJ5IFN0YXRlIikNCg0KIyBBcnJhbmdlIHBsb3RzIHNpZGUgYnkgc2lkZQ0KZ3JpZC5hcnJhbmdlKHBsb3RfZmlyZWFybSwgcGxvdF9ndW5fbGF3LCBuY29sID0gMikNCg0KYGBgDQoNClRoZSBoZWF0IG1hcCBzaG93cyB0aGF0IHRoZSBzdGF0ZXMgd2l0aCB0aGUgbW9zdCBzdHJpY3Rlc3QgZ3VucyBsYXdzIGhhdmUgYSBsb3dlciBtb3J0YWxpdHkgcmF0ZXMuDQoNCg0KIyMgQ29uY2x1c2lvbg0KDQpJbiB0aGlzIHN0b3J5LCB3ZSBhaW0gdG8gZXhwbG9yZSB0aGUgaW1wYWN0IG9mIHN0cmljdGVyIGZpcmVhcm0gY29udHJvbCBsYXdzIG9uIHJlZHVjZSBmaXJlYXJtIG1vcnRhbGl0eSByYXRlcy4gVGhyb3VnaCBjb3JyZWxhdGluZyB0aGUgc3RyaWN0bmVzcyBvZiBmaXJlYXJtIGNvbnRyb2wgbGF3cyBhY3Jvc3Mgc3RhdGVzIHdpdGggdGhlaXIgcmVzcGVjdGl2ZSBmaXJlYXJtIG1vcnRhbGl0eSByYXRlcyBhbmQgdmlzdWFsaXppbmcgdGhlIGRhdGEgdmlhIGEgaGVhdCBtYXAsIHdlIG9ic2VydmUgYSBub3RhYmxlIHRyZW5kOiBBcyBndW4gY29udHJvbCBsYXdzIHRpZ2h0ZW4sIGZpcmVhcm0gbW9ydGFsaXR5IHJhdGVzIGdlbmVyYWxseSBkZWNyZWFzZXMuDQoNCg0KYGBge3J9DQojIENhbGN1bGF0ZSB0aGUgYXZlcmFnZSBmaXJlYXJtIG1vcnRhbGl0eSByYXRlDQphdmVyYWdlX3JhdGUgPC0gbWVhbihmaXJlYXJtX2RmJGZpcmVhcm1fbW9ydGFsaXR5X3JhdGUpDQoNCg0KIyBSZW9yZGVyIHRoZSBmYWN0b3IgbGV2ZWxzIG9mIGd1bl9sYXcNCmZpcmVhcm1fZGYkZ3VuX2xhdyA8LSBmYWN0b3IoZmlyZWFybV9kZiRndW5fbGF3LCBsZXZlbHMgPSBjKCJWZXJ5IFN0cmljdCIsICJTdHJpY3QiLCAiTW9kZXJhdGUiLCAiTG9vc2UiLCAiVmVyeSBsb29zZSIpKQ0KDQojIENyZWF0ZSB0aGUgc2NhdHRlciBwbG90DQpnZ3Bsb3QoZmlyZWFybV9kZiwgYWVzKHggPSBndW5fbGF3LCB5ID0gZmlyZWFybV9tb3J0YWxpdHlfcmF0ZSwgbGFiZWwgPSBzdGF0ZSkpICsNCiAgZ2VvbV9wb2ludChhZXMoY29sb3IgPSBpZmVsc2UoZmlyZWFybV9tb3J0YWxpdHlfcmF0ZSA+IGF2ZXJhZ2VfcmF0ZSwgICJBYm92ZSBBdmVyYWdlIiwgIkJlbG93IEF2ZXJhZ2UiKSksIHNpemUgPSAxKSArDQogIGdlb21fdGV4dChzaXplID0gMiwgaGp1c3QgPSAtMC41KSArICANCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IGMoICJyZWQiLCAiZ3JleSIpKSArDQogIGxhYnMoeCA9ICJHdW4gQ29udHJvbCBMYXdzIiwgeSA9ICJGaXJlYXJtIE1vcnRhbGl0eSBSYXRlIiwgdGl0bGUgPSAiRmlyZWFybSBNb3J0YWxpdHkgUmF0ZSB2cy4gR3VuIENvbnRyb2wgTGF3cyIpICsNCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gYXZlcmFnZV9yYXRlLCBsaW5ldHlwZSA9ICJkb3R0ZWQiKSArIA0KICB0aGVtZV9taW5pbWFsKCkgKw0KICBndWlkZXMoY29sb3IgPSBndWlkZV9sZWdlbmQodGl0bGUgPSAiTW9ydGFsaXR5IFJhdGUiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkpIA0KYGBgDQoNClRoZSBuYXRpb25hbCBhdmVyYWdlIGZvciBmaXJlYXJtIG1vcnRhbGl0eSBzdGFuZHMgYXQgMTUuNSBwZXIgMTAwLDAwMCBwZXJzb25zLg0KDQpUaGUgYWJvdmUgZ3JhcGggc2hvd3MgdGhhdDoNCg0KLSBTdGF0ZXMgY2hhcmFjdGVyaXplZCBieSB2ZXJ5IHN0cmljdCBndW4gY29udHJvbCBsYXdzIGNvbnNpc3RlbnRseSBoYXZlIGZpcmVhcm0gbW9ydGFsaXR5IHJhdGVzIGJlbG93IHRoZSBuYXRpb25hbCBhdmVyYWdlLg0KDQotIENvbnZlcnNlbHksIG92ZXIgNzAlIG9mIHN0YXRlcyBjYXRlZ29yaXplZCBhcyBoYXZpbmcgbGVuaWVudCBndW4gY29udHJvbCBsYXdzIHN1cnBhc3MgdGhlIG5hdGlvbmFsIGF2ZXJhZ2UgaW4gZmlyZWFybSBtb3J0YWxpdHkgcmF0ZXMuIA0KDQotIE1vcmVvdmVyLCBPZmYgb2YgdGhlIDIxIHN0YXRlcyBpbiB0aGUgVVMgdGhhdCBoYXZlIGZpcmVhcm0gbW9ydGFsaXR5IHJhdGVzIGFib3ZlIHRoZSBuYXRpb25hbCBhdmVyYWdlLCAxNiBzdGF0ZXMgaGF2ZSB2ZXJ5IGxvb3NlIGd1biBjb250cm9sIGxhd3MuDQoNCkFsdGhvdWdoIGl0J3MgaW1wb3J0YW50IHRvIGNvbnNpZGVyIG90aGVyIGZhY3RvcnMgdGhhdCBjb3VsZCBjb250cmlidXRlIHRvIGxvd2VyIG1vcnRhbGl0eSByYXRlcyBpbiB0aGVzZSBzdGF0ZXMsIHRoZSBkYXRhIHN1Z2dlc3RzIHRoYXQgc3RyaWN0ZXIgZ3VuIGNvbnRyb2wgbGF3cyBjb3JyZXNwb25kIHRvIGxvd2VyIGZpcmVhcm0gbW9ydGFsaXR5IHJhdGVzLiANCg0KDQoNCi0tLQ==