Ernesto Gomez
October 23, 2017
This assignment will utilize data from The Stanford Mass Shootings in America (MSA), a non-exhaustive dataset of mass shootings from 1966-2016 compiled by The Stanford Geospatial Center.
The data will ultimately be used to conduct an analysis focused on the question of mental illness and number of guns used, in its relation to mass shootings, and whether mass shooters with a history of mental illness and access to multiple guns results in a higher incidence in the loss of life. To accomplish this, variables related to the number of fatalities from mass shootings (1966-2016), shooter’s history of mental illness, and total number of guns used by shooter will be used to perform a gamma regression to potentially bring clarity to the following hypotheses:
Hypotheses
- Mass shooters with a history of mental illness might increase the number of fatalities in a mass shooting.
- The more guns a mass shooter is equipped with the more lives they may ultimately take during a mass shooting.
Packages
library(tidyverse)
library(dplyr)
library(sjmisc)
library(ZeligChoice)
library(Zelig)
library(texreg)
library(visreg)
Variables & Data Management
- totalvictims - This variable will be the dependent variable, it is a measurement of the total number of fatalities for every incidence of a mass shooting.
- mentalhistory - This variable measures whether a mass shooter had a reported or confirmed history of mental illness, “Yes” for a history of mental illness and “No” for no history.
- mentalill - A recoded 1,0 variable of history of mental illness, 1 for “Yes” and 0 for “No”.
- totalguns - This variable is a measurement of the total number of guns used during a particular shooting.
- totalguns2 - A recoded variable of total number of guns, instead generated to be on a scale from 1 - 4+ (4 or more guns).
masshoot <- data.frame(read_csv("/Users/ernesto/Documents/Advanced Analytics/Data/MassShootings.csv")) %>%
rename("mentalhistory" = History.of.Mental.Illness...General,
"totalvictims" = Total.Number.of.Victims,
"totalguns" = Total.Number.of.Guns) %>%
select(totalvictims, mentalhistory, totalguns) %>%
filter(!is.na(totalvictims),
!is.na(mentalhistory),
!is.na(totalguns),
!totalvictims %in% c("Unknown"),
!mentalhistory %in% c("Unknown"),
!totalguns %in% c("Unknown")) %>%
mutate(mentalill=as.factor(ifelse(mentalhistory=="Yes", 1, 0)),
totalguns=as.numeric(totalguns),
totalguns2=as.factor(ifelse(totalguns<4, totalguns,
ifelse(totalguns>=4, "4+","na"))))
print(masshoot)
Preliminary Investigation - Data Overview
Mental Illness and its Relationship To Fatalities
shoot <- masshoot %>%
select (totalvictims, mentalill, totalguns) %>%
group_by(mentalill) %>%
summarise(mean = mean(totalvictims))
ggplot(data=shoot)+
geom_col(aes(x=mentalill, y=mean), fill="darkblue")+
xlab("Mentally Ill Shooters")+ylab("Average Fatalities")

The data here tells us that mass shooters with a history of mental illness (1) tend to kill more people, about 6 more victims, than those who had no prior history of mentall illness.
Total Number of Guns and its Relationship to Fatalities
shoot1 <- masshoot %>%
select (totalvictims, mentalill, totalguns2) %>%
group_by(totalguns2) %>%
summarise(mean = mean(totalvictims))
ggplot(data=shoot1)+
geom_col(aes(x=totalguns2, y=mean), fill="darkblue")+
xlab("Number of Guns Used")+ylab("Average Fatalities")

The data also reveals a steady increase in average number of deaths after a mass shooting as the number of guns used during the incident also increases. Number of fatalities steadily increases by 5 or so deaths for each additional gun used.
Why A Gamma Regression?
When plotting our dependent variable, total number of fatalities after a mass shooting, the reasoning for choosing to analyze with a gamma regression is verified. All values are always positive, never reach zero, and we see a clear dramatic increase, with most mass shootings resulting in 10 or less fatalities, and a sharp decrease in count shortly after as the total number of deaths increases. There is also no censoring because all values have occurred and are known and eventually come to an end.
ggplot(masshoot) + geom_histogram(aes(x=totalvictims), fill="darkblue")+
xlab("Total Deaths")

Gamma Regression Model
z.out <- zelig(totalvictims ~ mentalill + totalguns2, model="gamma", data=masshoot, cite=F)
options(scipen=999)
summary(z.out)
Model:
Call:
z5$zelig(formula = totalvictims ~ mentalill + totalguns2, data = masshoot)
Deviance Residuals:
Min 1Q Median 3Q Max
-1.3040 -0.5590 -0.2103 0.2011 2.0241
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 0.18270 0.01316 13.882 < 0.0000000000000002
mentalill1 -0.04772 0.01257 -3.796 0.000202
totalguns22 -0.05162 0.01473 -3.503 0.000582
totalguns23 -0.08276 0.01464 -5.654 0.0000000617990
totalguns24+ -0.09695 0.01387 -6.992 0.0000000000533
(Dispersion parameter for Gamma family taken to be 0.482606)
Null deviance: 106.597 on 181 degrees of freedom
Residual deviance: 65.706 on 177 degrees of freedom
AIC: 1062.2
Number of Fisher Scoring iterations: 6
Next step: Use 'setx' method
Counterfactuals and Simulations
Mentall Illness and Fatalities
The results clearly indicate that mass shooters with a history of mental illness tend to kill 2 more victims than those with no history. Ultimately, mass shooters with a history of mental illness are more likely to kill more people than shooters who have no prior history of mental illness.
x.noill <- setx(z.out, mentalill = 0)
x.yesill <- setx(z.out, mentalill = 1)
s.out <- sim(z.out, x=x.noill, x1=x.yesill)
summary(s.out)
sim x :
-----
ev
mean sd 50% 2.5% 97.5%
[1,] 5.503005 0.4074101 5.467089 4.78613 6.344042
pv
mean sd 50% 2.5% 97.5%
[1,] 5.406342 3.253059 4.746973 1.050867 13.32096
sim x1 :
-----
ev
mean sd 50% 2.5% 97.5%
[1,] 7.450188 0.6485373 7.413298 6.32694 8.799633
pv
mean sd 50% 2.5% 97.5%
[1,] 7.468257 4.335811 6.53564 1.644339 18.14772
fd
mean sd 50% 2.5% 97.5%
[1,] 1.947183 0.5781726 1.913859 0.9026206 3.176485
Plotting Mental Illness & Fatalities
plot(s.out)

Simulation, Total Number of Guns & Fatalities
The results of the simulation shows a significant difference in number of fatalities after a mass shooting, about 20 deaths, when the total number of guns used is 4 or more compared to 1. It seems that the more guns used by a shooter results in an increase in the number of victims killed.
x.logun <- setx(z.out, totalguns2 = 1)
x.higun <- setx(z.out, totalguns2 = "4+")
s <- sim(z.out, x=x.logun, x1=x.higun)
summary(s)
sim x :
-----
ev
mean sd 50% 2.5% 97.5%
[1,] 7.471921 0.6517387 7.421406 6.398625 8.90849
pv
mean sd 50% 2.5% 97.5%
[1,] 7.546276 4.731539 6.715934 1.304751 18.44208
sim x1 :
-----
ev
mean sd 50% 2.5% 97.5%
[1,] 28.20138 8.465211 26.45035 18.44825 46.87418
pv
mean sd 50% 2.5% 97.5%
[1,] 28.61508 20.23176 24.0973 5.72743 82.42928
fd
mean sd 50% 2.5% 97.5%
[1,] 20.72946 8.443953 19.04508 10.79592 39.75513
Plotting Total Number of Guns & Fatalities
plot(s)

Analysis
The modeled results confirm previous hypotheses. Indeed, the model and simulations show that:
- Mass shooters with a prior history of mental illness are more likely to commit slightly more fatalities than shooters with no history.
- The more guns used during a mass shooting the more likely it is that a higher incidence of fatalities will occur.
These findings are interesting, particularly because of what it suggests about mass shooters and mental health, as well as the dangers of lack of proper gun control.
LS0tCnRpdGxlOiAiSG9tZXdvcmsgNyAtIE1hc3MgU2hvb3RlcnMgJiBHYW1tYSBSZWdyZXNzaW9uIgpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sKLS0tCgojIyMjI0VybmVzdG8gR29tZXoKIyMjIyNPY3RvYmVyIDIzLCAyMDE3Cl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCgpUaGlzIGFzc2lnbm1lbnQgd2lsbCB1dGlsaXplIGRhdGEgZnJvbSBUaGUgU3RhbmZvcmQgTWFzcyBTaG9vdGluZ3MgaW4gQW1lcmljYSAoTVNBKSwgYSBub24tZXhoYXVzdGl2ZSBkYXRhc2V0IG9mIG1hc3Mgc2hvb3RpbmdzIGZyb20gMTk2Ni0yMDE2IGNvbXBpbGVkIGJ5IFRoZSBTdGFuZm9yZCBHZW9zcGF0aWFsIENlbnRlci4KClRoZSBkYXRhIHdpbGwgdWx0aW1hdGVseSBiZSB1c2VkIHRvIGNvbmR1Y3QgYW4gYW5hbHlzaXMgZm9jdXNlZCBvbiB0aGUgcXVlc3Rpb24gb2YgbWVudGFsIGlsbG5lc3MgYW5kIG51bWJlciBvZiBndW5zIHVzZWQsIGluIGl0cyByZWxhdGlvbiB0byBtYXNzIHNob290aW5ncywgYW5kIHdoZXRoZXIgbWFzcyBzaG9vdGVycyB3aXRoIGEgaGlzdG9yeSBvZiBtZW50YWwgaWxsbmVzcyBhbmQgYWNjZXNzIHRvIG11bHRpcGxlIGd1bnMgcmVzdWx0cyBpbiBhIGhpZ2hlciBpbmNpZGVuY2UgaW4gdGhlIGxvc3Mgb2YgbGlmZS4gVG8gYWNjb21wbGlzaCB0aGlzLCB2YXJpYWJsZXMgcmVsYXRlZCB0byB0aGUgbnVtYmVyIG9mIGZhdGFsaXRpZXMgZnJvbSBtYXNzIHNob290aW5ncyAoMTk2Ni0yMDE2KSwgc2hvb3RlcidzIGhpc3Rvcnkgb2YgbWVudGFsIGlsbG5lc3MsIGFuZCB0b3RhbCBudW1iZXIgb2YgZ3VucyB1c2VkIGJ5IHNob290ZXIgd2lsbCBiZSB1c2VkIHRvIHBlcmZvcm0gYSBnYW1tYSByZWdyZXNzaW9uIHRvIHBvdGVudGlhbGx5IGJyaW5nIGNsYXJpdHkgdG8gdGhlIGZvbGxvd2luZyBoeXBvdGhlc2VzOgoKIyMjI0h5cG90aGVzZXMgCjEpIE1hc3Mgc2hvb3RlcnMgd2l0aCBhIGhpc3Rvcnkgb2YgbWVudGFsIGlsbG5lc3MgbWlnaHQgaW5jcmVhc2UgdGhlIG51bWJlciBvZiBmYXRhbGl0aWVzIGluIGEgbWFzcyBzaG9vdGluZy4KMikgVGhlIG1vcmUgZ3VucyBhIG1hc3Mgc2hvb3RlciBpcyBlcXVpcHBlZCB3aXRoIHRoZSBtb3JlIGxpdmVzIHRoZXkgbWF5IHVsdGltYXRlbHkgdGFrZSBkdXJpbmcgYSBtYXNzIHNob290aW5nLgoKCiMjUGFja2FnZXMKYGBge3IsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CmxpYnJhcnkodGlkeXZlcnNlKQpsaWJyYXJ5KGRwbHlyKQpsaWJyYXJ5KHNqbWlzYykKbGlicmFyeShaZWxpZ0Nob2ljZSkKbGlicmFyeShaZWxpZykKbGlicmFyeSh0ZXhyZWcpCmxpYnJhcnkodmlzcmVnKQpgYGAKX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KIyNWYXJpYWJsZXMgJiBEYXRhIE1hbmFnZW1lbnQKCiogKip0b3RhbHZpY3RpbXMqKiAtIFRoaXMgdmFyaWFibGUgd2lsbCBiZSB0aGUgZGVwZW5kZW50IHZhcmlhYmxlLCBpdCBpcyBhIG1lYXN1cmVtZW50IG9mIHRoZSB0b3RhbCBudW1iZXIgb2YgZmF0YWxpdGllcyBmb3IgZXZlcnkgaW5jaWRlbmNlIG9mIGEgbWFzcyBzaG9vdGluZy4KKyAqKm1lbnRhbGhpc3RvcnkqKiAtIFRoaXMgdmFyaWFibGUgbWVhc3VyZXMgd2hldGhlciBhIG1hc3Mgc2hvb3RlciBoYWQgYSByZXBvcnRlZCBvciBjb25maXJtZWQgaGlzdG9yeSBvZiBtZW50YWwgaWxsbmVzcywgIlllcyIgZm9yIGEgaGlzdG9yeSBvZiBtZW50YWwgaWxsbmVzcyBhbmQgIk5vIiBmb3Igbm8gaGlzdG9yeS4KKyAqKm1lbnRhbGlsbCoqIC0gQSByZWNvZGVkIDEsMCB2YXJpYWJsZSBvZiBoaXN0b3J5IG9mIG1lbnRhbCBpbGxuZXNzLCAxIGZvciAiWWVzIiBhbmQgMCBmb3IgIk5vIi4KKyAqKnRvdGFsZ3VucyoqIC0gVGhpcyB2YXJpYWJsZSBpcyBhIG1lYXN1cmVtZW50IG9mIHRoZSB0b3RhbCBudW1iZXIgb2YgZ3VucyB1c2VkIGR1cmluZyBhIHBhcnRpY3VsYXIgc2hvb3RpbmcuCisgKip0b3RhbGd1bnMyKiogLSBBIHJlY29kZWQgdmFyaWFibGUgb2YgdG90YWwgbnVtYmVyIG9mIGd1bnMsIGluc3RlYWQgZ2VuZXJhdGVkIHRvIGJlIG9uIGEgc2NhbGUgZnJvbSAxIC0gNCsgKDQgb3IgbW9yZSBndW5zKS4KCmBgYHtyLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQptYXNzaG9vdCA8LSBkYXRhLmZyYW1lKHJlYWRfY3N2KCIvVXNlcnMvZXJuZXN0by9Eb2N1bWVudHMvQWR2YW5jZWQgQW5hbHl0aWNzL0RhdGEvTWFzc1Nob290aW5ncy5jc3YiKSkgJT4lCiAgcmVuYW1lKCJtZW50YWxoaXN0b3J5IiA9IEhpc3Rvcnkub2YuTWVudGFsLklsbG5lc3MuLi5HZW5lcmFsLAogICAgInRvdGFsdmljdGltcyIgPSBUb3RhbC5OdW1iZXIub2YuVmljdGltcywKICAgICAidG90YWxndW5zIiA9IFRvdGFsLk51bWJlci5vZi5HdW5zKSAlPiUKICBzZWxlY3QodG90YWx2aWN0aW1zLCBtZW50YWxoaXN0b3J5LCB0b3RhbGd1bnMpICU+JQogIGZpbHRlcighaXMubmEodG90YWx2aWN0aW1zKSwKICAgICAgICAgIWlzLm5hKG1lbnRhbGhpc3RvcnkpLAogICAgICAgICAhaXMubmEodG90YWxndW5zKSwgCiAgICAgICAgIXRvdGFsdmljdGltcyAlaW4lIGMoIlVua25vd24iKSwKICAgICAgICAhbWVudGFsaGlzdG9yeSAlaW4lIGMoIlVua25vd24iKSwKICAgICAgICAhdG90YWxndW5zICVpbiUgYygiVW5rbm93biIpKSAlPiUKICAgICAgIG11dGF0ZShtZW50YWxpbGw9YXMuZmFjdG9yKGlmZWxzZShtZW50YWxoaXN0b3J5PT0iWWVzIiwgMSwgMCkpLAogICAgICAgICAgICAgIHRvdGFsZ3Vucz1hcy5udW1lcmljKHRvdGFsZ3VucyksCiAgICAgICAgICAgICAgdG90YWxndW5zMj1hcy5mYWN0b3IoaWZlbHNlKHRvdGFsZ3Vuczw0LCB0b3RhbGd1bnMsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKHRvdGFsZ3Vucz49NCwgIjQrIiwibmEiKSkpKQogICAgICAgICAgICAgCnByaW50KG1hc3Nob290KQpgYGAKCl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCiMjUHJlbGltaW5hcnkgSW52ZXN0aWdhdGlvbiAtIERhdGEgT3ZlcnZpZXcKX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwojI01lbnRhbCBJbGxuZXNzIGFuZCBpdHMgUmVsYXRpb25zaGlwIFRvIEZhdGFsaXRpZXMKCmBgYHtyLCBmaWcuaGVpZ2h0PTEsIGZpZy53aWR0aD0xLjV9CnNob290IDwtIG1hc3Nob290ICU+JQpzZWxlY3QgKHRvdGFsdmljdGltcywgbWVudGFsaWxsLCB0b3RhbGd1bnMpICU+JQogIGdyb3VwX2J5KG1lbnRhbGlsbCkgJT4lCiAgc3VtbWFyaXNlKG1lYW4gPSBtZWFuKHRvdGFsdmljdGltcykpCgpnZ3Bsb3QoZGF0YT1zaG9vdCkrCiAgZ2VvbV9jb2woYWVzKHg9bWVudGFsaWxsLCB5PW1lYW4pLCBmaWxsPSJkYXJrYmx1ZSIpKwogIHhsYWIoIk1lbnRhbGx5IElsbCBTaG9vdGVycyIpK3lsYWIoIkF2ZXJhZ2UgRmF0YWxpdGllcyIpCmBgYAoKVGhlIGRhdGEgaGVyZSB0ZWxscyB1cyB0aGF0IG1hc3Mgc2hvb3RlcnMgd2l0aCBhIGhpc3Rvcnkgb2YgbWVudGFsIGlsbG5lc3MgKDEpIHRlbmQgdG8ga2lsbCBtb3JlIHBlb3BsZSwgYWJvdXQgNiBtb3JlIHZpY3RpbXMsIHRoYW4gdGhvc2Ugd2hvIGhhZCBubyBwcmlvciBoaXN0b3J5IG9mIG1lbnRhbGwgaWxsbmVzcy4KCl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KIyNUb3RhbCBOdW1iZXIgb2YgR3VucyBhbmQgaXRzIFJlbGF0aW9uc2hpcCB0byBGYXRhbGl0aWVzCmBgYHtyLCBmaWcuaGVpZ2h0PTEsIGZpZy53aWR0aD0xLjUsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CnNob290MSA8LSBtYXNzaG9vdCAlPiUKICBzZWxlY3QgKHRvdGFsdmljdGltcywgbWVudGFsaWxsLCB0b3RhbGd1bnMyKSAlPiUKICBncm91cF9ieSh0b3RhbGd1bnMyKSAlPiUKICBzdW1tYXJpc2UobWVhbiA9IG1lYW4odG90YWx2aWN0aW1zKSkKCmdncGxvdChkYXRhPXNob290MSkrCiAgZ2VvbV9jb2woYWVzKHg9dG90YWxndW5zMiwgeT1tZWFuKSwgZmlsbD0iZGFya2JsdWUiKSsKICB4bGFiKCJOdW1iZXIgb2YgR3VucyBVc2VkIikreWxhYigiQXZlcmFnZSBGYXRhbGl0aWVzIikKYGBgCgpUaGUgZGF0YSBhbHNvIHJldmVhbHMgYSBzdGVhZHkgaW5jcmVhc2UgaW4gYXZlcmFnZSBudW1iZXIgb2YgZGVhdGhzIGFmdGVyIGEgbWFzcyBzaG9vdGluZyBhcyB0aGUgbnVtYmVyIG9mIGd1bnMgdXNlZCBkdXJpbmcgdGhlIGluY2lkZW50IGFsc28gaW5jcmVhc2VzLiBOdW1iZXIgb2YgZmF0YWxpdGllcyBzdGVhZGlseSBpbmNyZWFzZXMgYnkgNSBvciBzbyBkZWF0aHMgZm9yIGVhY2ggYWRkaXRpb25hbCBndW4gdXNlZC4gCgoKX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwojIyNXaHkgQSBHYW1tYSBSZWdyZXNzaW9uPwoKV2hlbiBwbG90dGluZyBvdXIgZGVwZW5kZW50IHZhcmlhYmxlLCB0b3RhbCBudW1iZXIgb2YgZmF0YWxpdGllcyBhZnRlciBhIG1hc3Mgc2hvb3RpbmcsIHRoZSByZWFzb25pbmcgZm9yIGNob29zaW5nIHRvIGFuYWx5emUgd2l0aCBhIGdhbW1hIHJlZ3Jlc3Npb24gaXMgdmVyaWZpZWQuIEFsbCB2YWx1ZXMgYXJlIGFsd2F5cyBwb3NpdGl2ZSwgbmV2ZXIgcmVhY2ggemVybywgYW5kIHdlIHNlZSBhIGNsZWFyIGRyYW1hdGljIGluY3JlYXNlLCB3aXRoIG1vc3QgbWFzcyBzaG9vdGluZ3MgcmVzdWx0aW5nIGluIDEwIG9yIGxlc3MgZmF0YWxpdGllcywgYW5kIGEgc2hhcnAgZGVjcmVhc2UgaW4gY291bnQgc2hvcnRseSBhZnRlciBhcyB0aGUgdG90YWwgbnVtYmVyIG9mIGRlYXRocyBpbmNyZWFzZXMuIFRoZXJlIGlzIGFsc28gbm8gY2Vuc29yaW5nIGJlY2F1c2UgYWxsIHZhbHVlcyBoYXZlIG9jY3VycmVkIGFuZCBhcmUga25vd24gYW5kIGV2ZW50dWFsbHkgY29tZSB0byBhbiBlbmQuCgpgYGB7ciwgZmlnLmhlaWdodD0xLCBmaWcud2lkdGg9MS41LCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQpnZ3Bsb3QobWFzc2hvb3QpICsgZ2VvbV9oaXN0b2dyYW0oYWVzKHg9dG90YWx2aWN0aW1zKSwgZmlsbD0iZGFya2JsdWUiKSsKICB4bGFiKCJUb3RhbCBEZWF0aHMiKQpgYGAKX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwojI0dhbW1hIFJlZ3Jlc3Npb24gTW9kZWwKCmBgYHtyfQp6Lm91dCA8LSB6ZWxpZyh0b3RhbHZpY3RpbXMgfiBtZW50YWxpbGwgKyB0b3RhbGd1bnMyLCBtb2RlbD0iZ2FtbWEiLCBkYXRhPW1hc3Nob290LCBjaXRlPUYpCm9wdGlvbnMoc2NpcGVuPTk5OSkKc3VtbWFyeSh6Lm91dCkKYGBgCl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwojI0NvdW50ZXJmYWN0dWFscyBhbmQgU2ltdWxhdGlvbnMKCiMjI01lbnRhbGwgSWxsbmVzcyBhbmQgRmF0YWxpdGllcwoKVGhlIHJlc3VsdHMgY2xlYXJseSBpbmRpY2F0ZSB0aGF0IG1hc3Mgc2hvb3RlcnMgd2l0aCBhIGhpc3Rvcnkgb2YgbWVudGFsIGlsbG5lc3MgdGVuZCB0byBraWxsIDIgbW9yZSB2aWN0aW1zIHRoYW4gdGhvc2Ugd2l0aCBubyBoaXN0b3J5LiBVbHRpbWF0ZWx5LCBtYXNzIHNob290ZXJzIHdpdGggYSBoaXN0b3J5IG9mIG1lbnRhbCBpbGxuZXNzIGFyZSBtb3JlIGxpa2VseSB0byBraWxsIG1vcmUgcGVvcGxlIHRoYW4gc2hvb3RlcnMgd2hvIGhhdmUgbm8gcHJpb3IgaGlzdG9yeSBvZiBtZW50YWwgaWxsbmVzcy4KCmBgYHtyfQp4Lm5vaWxsIDwtIHNldHgoei5vdXQsIG1lbnRhbGlsbCA9IDApCngueWVzaWxsIDwtIHNldHgoei5vdXQsIG1lbnRhbGlsbCA9IDEpCnMub3V0IDwtIHNpbSh6Lm91dCwgeD14Lm5vaWxsLCB4MT14Lnllc2lsbCkKc3VtbWFyeShzLm91dCkKYGBgCl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCiMjUGxvdHRpbmcgTWVudGFsIElsbG5lc3MgJiBGYXRhbGl0aWVzCgpgYGB7ciwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0KcGxvdChzLm91dCkKYGBgCl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCiMjIFNpbXVsYXRpb24sIFRvdGFsIE51bWJlciBvZiBHdW5zICYgRmF0YWxpdGllcwoKVGhlIHJlc3VsdHMgb2YgdGhlIHNpbXVsYXRpb24gc2hvd3MgYSBzaWduaWZpY2FudCBkaWZmZXJlbmNlIGluIG51bWJlciBvZiBmYXRhbGl0aWVzIGFmdGVyIGEgbWFzcyBzaG9vdGluZywgYWJvdXQgMjAgZGVhdGhzLCB3aGVuIHRoZSB0b3RhbCBudW1iZXIgb2YgZ3VucyB1c2VkIGlzIDQgb3IgbW9yZSBjb21wYXJlZCB0byAxLiBJdCBzZWVtcyB0aGF0IHRoZSBtb3JlIGd1bnMgdXNlZCBieSBhIHNob290ZXIgcmVzdWx0cyBpbiBhbiBpbmNyZWFzZSBpbiB0aGUgbnVtYmVyIG9mIHZpY3RpbXMga2lsbGVkLgoKYGBge3IsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CngubG9ndW4gPC0gc2V0eCh6Lm91dCwgdG90YWxndW5zMiA9IDEpCnguaGlndW4gPC0gc2V0eCh6Lm91dCwgdG90YWxndW5zMiA9ICI0KyIpCnMgPC0gc2ltKHoub3V0LCB4PXgubG9ndW4sIHgxPXguaGlndW4pCnN1bW1hcnkocykKYGBgCl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KIyNQbG90dGluZyBUb3RhbCBOdW1iZXIgb2YgR3VucyAmIEZhdGFsaXRpZXMKYGBge3J9CnBsb3QocykKYGBgCl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KIyNBbmFseXNpcwoKVGhlIG1vZGVsZWQgcmVzdWx0cyBjb25maXJtIHByZXZpb3VzIGh5cG90aGVzZXMuIEluZGVlZCwgdGhlIG1vZGVsIGFuZCBzaW11bGF0aW9ucyBzaG93IHRoYXQ6CgoqIE1hc3Mgc2hvb3RlcnMgd2l0aCBhIHByaW9yIGhpc3Rvcnkgb2YgbWVudGFsIGlsbG5lc3MgYXJlIG1vcmUgbGlrZWx5IHRvIGNvbW1pdCBzbGlnaHRseSBtb3JlIGZhdGFsaXRpZXMgdGhhbiBzaG9vdGVycyB3aXRoIG5vIGhpc3RvcnkuCisgVGhlIG1vcmUgZ3VucyB1c2VkIGR1cmluZyBhIG1hc3Mgc2hvb3RpbmcgdGhlIG1vcmUgbGlrZWx5IGl0IGlzIHRoYXQgYSBoaWdoZXIgaW5jaWRlbmNlIG9mIGZhdGFsaXRpZXMgd2lsbCBvY2N1ci4KClRoZXNlIGZpbmRpbmdzIGFyZSBpbnRlcmVzdGluZywgcGFydGljdWxhcmx5IGJlY2F1c2Ugb2Ygd2hhdCBpdCBzdWdnZXN0cyBhYm91dCBtYXNzIHNob290ZXJzIGFuZCBtZW50YWwgaGVhbHRoLCBhcyB3ZWxsIGFzIHRoZSBkYW5nZXJzIG9mIGxhY2sgb2YgcHJvcGVyIGd1biBjb250cm9sLgoKCg==