Jennifer Ganeles
3/24/19

Part 1: Exploring the Zelig Package (Zelig 4 vs. Zelig 5 Syntax)

Using the Titanic dataset from the radiant.data package, I re-implemented the regression analyses conducted in class (slides 5.2-5.18) using the Zelig 5 syntax.

Preparing the Data: Recoding and Selecting Variables

library(radiant.data)
data(titanic)
titanic=titanic %>%
  mutate(surv = as.integer(survived)) %>% 
  mutate(survival = sjmisc::rec(surv, rec = "2=0; 1=1")) %>% 
  select(pclass, survived, survival, everything())
head(titanic)

Slide 5.2: Interaction Model

#Zelig 4: 
#z_tit <- zelig(survival ~ age + sex*pclass + fare, model = "logit", data = titanic, cite = F)
#Zelig 5:
z5_tit <- zlogit$new()
z5_tit$zelig(survival ~ age + sex*pclass + fare, data = titanic)
summary(z5_tit)
Model: 

Call:
z5_tit$zelig(formula = survival ~ age + sex * pclass + fare, 
    data = titanic)

Deviance Residuals: 
    Min       1Q   Median       3Q      Max  
-3.0634  -0.6641  -0.4943   0.4336   2.4941  

Coefficients:
                    Estimate Std. Error z value Pr(>|z|)
(Intercept)        4.8978215  0.6131092   7.988 1.37e-15
age               -0.0387245  0.0068044  -5.691 1.26e-08
sexmale           -3.8996177  0.5015659  -7.775 7.55e-15
pclass2nd         -1.5923247  0.6024844  -2.643  0.00822
pclass3rd         -4.1382715  0.5601819  -7.387 1.50e-13
fare              -0.0009058  0.0020509  -0.442  0.65874
sexmale:pclass2nd -0.0600076  0.6372949  -0.094  0.92498
sexmale:pclass3rd  2.5019110  0.5479901   4.566 4.98e-06

(Dispersion parameter for binomial family taken to be 1)

    Null deviance: 1409.99  on 1042  degrees of freedom
Residual deviance:  931.45  on 1035  degrees of freedom
AIC: 947.45

Number of Fisher Scoring iterations: 5

Next step: Use 'setx' method

Slides 5.3-5.4: Age Effect

library(Zelig)
#Zelig 4: 
#a.range = min(titanic$age):max(titanic$age)
#x <- setx(z_tit, age = a.range)
#s <- sim(z_tit, x = x)
#ci.plot(s)
#Zelig 5:
a.range=min(titanic$age):max(titanic$age)
z5_tit$setrange(age=a.range)
z5_tit$sim()
z5_tit$graph()

Looking at the full age range, we find that infants have a higher expected value of survivial (median~.35) than people who are older, but uncertainty is higher for infants than for those who are older (we are more certain in low survival rate when older)

Slides 5.5-5.6: Fare Effect

#Zelig 4:
#f.range = min(titanic$fare):max(titanic$fare)
#x <- setx(z_tit, fare = f.range)
#s <- sim(z_tit, x = x)
#ci.plot(s)
#Zelig 5:
f.range = min(titanic$fare):max(titanic$fare)
z5_tit$setrange(fare=f.range)
z5_tit$sim()
z5_tit$graph()

Looking at the full fare range, we find that the expected value of surviving is almost constant as fare increases (with a very minor decrease in survival and a large increase in uncertainty as fare increases). This suggests that fare does not really influence survival chance (after controlling for class).

Slides 5.7-5.9: Sex Difference

#Zelig 4:
#x <- setx(z_tit, sex = "male")
#x1 <- setx(z_tit, sex = "female")
#s <- sim(z_tit, x = x, x1 = x1)
#fd <- s$get_qi(xvalue="x1", qi="fd")
#summary(fd)
#plot(s)
#Zelig 5:
z5_tit$setx(sex="male")
z5_tit$setx1(sex="female")
z5_tit$sim()
fd<-z5_tit$get_qi(xvalue="x1", qi="fd")
summary(fd)
       V1        
 Min.   :0.1364  
 1st Qu.:0.2291  
 Median :0.2556  
 Mean   :0.2578  
 3rd Qu.:0.2859  
 Max.   :0.3928  

Looking at the simulated first difference between males and females in expected survival, we find that on average, females have a .26 higher chance of surviving than males (can be as low as .14 and as high as .39)

z5_tit$graph()

Slides 5.10-5.15: Class Variation in Sex Difference

#Zelig 4:
#c1x <- setx(z_tit, sex = "male", pclass = "1st")
#c1x1 <- setx(z_tit, sex = "female", pclass = "1st")
#c1s <- sim(z_tit, x = c1x, x1 = c1x1)
#Zelig 5:
z5.1 <- zlogit$new()
z5.1$zelig(survival ~ age +sex*pclass + fare, data=titanic)
z5.1$setx(sex="male", pclass="1st")
z5.1$setx1(sex="female", pclass="1st")
z5.1$sim()
z5.1$graph()

Slide 5.12:
For first class, the difference in expected value of survival between females and males is about .52, suggesting that first class females have a .52 higher chance of surviving than first class males.

#Zelig 4:
#c2x <- setx(z_tit, sex = "male", pclass = "2nd")
#c2x1 <- setx(z_tit, sex = "female", pclass = "2nd")
#c2s <- sim(z_tit, x = c2x, x1 = c2x1)
#Zelig 5:
z5.2 <- zlogit$new()
z5.2$zelig(survival ~ age +sex*pclass + fare, data=titanic)
z5.2$setx(sex="male", pclass="2nd")
z5.2$setx1(sex="female", pclass="2nd")
z5.2$sim()
z5.2$graph()

Slide 5.13:
For second class, the simulated first difference between male and female survival increases to about .75, suggesting that second class females have a .75 higher chance of survial than second class males.

#Zelig 4:
#c3x <- setx(z_tit, sex = "male", pclass = "3rd")
#c3x1 <- setx(z_tit, sex = "female", pclass = "3rd")
#c3s <- sim(z_tit, x = c3x, x1 = c3x1)
#Zelig 5:
z5.3 <- zlogit$new()
z5.3$zelig(survival ~ age +sex*pclass + fare, data=titanic)
z5.3$setx(sex="male", pclass="3rd")
z5.3$setx1(sex="female", pclass="3rd")
z5.3$sim()
z5.3$graph()

Slide 5.14:
For third class, the simulated first difference between female and male survival drops to about .26, suggesting that third class women have a .26 higher chance of survival than third class men. (As we move down the class ranks, women’s expected survival decreases.)

Slide 5.15: Putting Them in One Place

d1 <- z5.1$get_qi(xvalue="x1", qi="fd")
d2 <- z5.2$get_qi(xvalue="x1", qi="fd")
d3 <- z5.3$get_qi(xvalue="x1", qi="fd")
  
dfd <- as.data.frame(cbind(d1, d2, d3))
head(dfd)

Slide 5.16: Changing from Wide to Long Format

library(tidyr)
tidd <- dfd %>% 
  gather(class, simv, 1:3)
head(tidd)

Slide 5.17: Group by Class

library(dplyr)
tidd %>% 
  group_by(class) %>% 
  summarise(mean = mean(simv), sd = sd(simv))

Slide 5.18: Plotting

Looking at the expected first difference between female and male passengers across all 3 classes, we can see the first difference is highest in second class and lowest in third class. Male and female passengers have closer expected survival rates in third class.

library(ggplot2)
ggplot(tidd, aes(simv)) + geom_histogram() + facet_grid(~class)

Part 2: Exploring the Zelig Package Using My Own Dataset (Marvel Characters as Living or Deceased)

Using a FiveThirtyEight Comic Characters Dataset found on Kaggle, this week’s homework seeks to determine how variables such as alignment (good, bad, or neutral), gender (male or female), identity (public or secret), and number of appearances (as of 2014) explain the likelihood of whether a Marvel character would be alive in the comics or not. Since my dependent variable is dichotomous, I conducted a logit regression analysis.

Preparing the Data: Recoding and Selecting Variables

My dependent variable was recoded as binary (alive_binary), where 1=living and 0=deceased. My identity variable was also recoded so that “Public Identity”" included “No Dual Identity” and “Known to Authorities.” For my gender variable, “Agender” and “Genderfluid” characters were recoded as “Other.”

library(readr)
library(dplyr)
library(magrittr)
Marvel<-read_csv("/Users/jenniferganeles/Downloads/marvel-wikia-data.csv")
marvel_heroes<-
  mutate (Marvel, alive_binary=
           recode(ALIVE, "Living Characters"=1,"Deceased Characters"=0),
          Gender=
            recode(SEX, "Agender Characters"="Other", "Genderfluid Characters"="Other"),
          Identity=
            recode(ID, "No Dual Identity"="Public Identity", "Known to Authorities Identity"="Public Identity"),
          alignment = factor(ALIGN),
          gender = factor(Gender),
          identity=factor(Identity))%>%
    filter(!is.na(APPEARANCES),
           !is.na(alignment))%>%
  
  select(ALIVE, alive_binary, alignment, gender, identity, APPEARANCES)
head(marvel_heroes)

Running Three Regression Models and Determining the Best Model Fit

Both AIC and BIC agree that Model 2 is the best model, which contains all selected variables but without an interaction term.

M1<-zlogit$new()
M1$zelig(alive_binary~ identity+gender, data=marvel_heroes)
M2<-zlogit$new()
M2$zelig(alive_binary~ identity+gender+alignment+APPEARANCES, data=marvel_heroes)
M3<-zlogit$new()
M3$zelig(alive_binary~ identity+gender*APPEARANCES+alignment, data=marvel_heroes)
texreg::htmlreg(list(M1, M2, M3),doctype = FALSE)
Statistical models
Model 1 Model 2 Model 3
(Intercept) 1.38*** 0.94*** 0.94***
(0.05) (0.07) (0.07)
identitySecret Identity -0.13** -0.02 -0.02
(0.05) (0.05) (0.05)
genderMale Characters -0.37*** -0.23*** -0.23***
(0.06) (0.06) (0.06)
genderOther 0.54 0.69 0.42
(0.54) (0.54) (0.65)
alignmentGood Characters 0.63*** 0.63***
(0.05) (0.05)
alignmentNeutral Characters 0.31*** 0.31***
(0.07) (0.07)
APPEARANCES 0.00** 0.00
(0.00) (0.00)
genderMale Characters:APPEARANCES -0.00
(0.00)
genderOther:APPEARANCES 0.03
(0.06)
AIC 11511.20 11354.41 11357.65
BIC 11540.06 11404.92 11422.58
Log Likelihood -5751.60 -5670.21 -5669.82
Deviance 11503.20 11340.41 11339.65
Num. obs. 10047 10047 10047
p < 0.001, p < 0.01, p < 0.05

*The above table displays the regression results in terms of log odds, but I want to produce more understandable coefficients using simulation…

Bad vs. Good Characters:

Looking at the simulated first difference between bad and good characters, my analysis shows that on average, good characters have a .12 higher chance of being alive than bad characters (first difference can be as low as .09 and as high as .15).

M2$setx(alignment="Bad Characters")
M2$setx1(alignment="Good Characters")
M2$sim()
fd <- M2$get_qi(xvalue="x1", qi="fd")
summary(fd)
       V1         
 Min.   :0.08721  
 1st Qu.:0.11400  
 Median :0.12094  
 Mean   :0.12105  
 3rd Qu.:0.12795  
 Max.   :0.15065  
M2$graph()

Bad vs. Neutral Characters:

Looking at the simulated first difference between bad and neutral characters, my analysis shows that on average, neutral characters have a .06 higher chance of being alive than bad characters (first difference can be as low as .02 and as high as .10).

M2$setx(alignment="Bad Characters")
M2$setx1(alignment="Neutral Characters")
M2$sim()
fd <- M2$get_qi(xvalue="x1", qi="fd")
summary(fd)
       V1         
 Min.   :0.02291  
 1st Qu.:0.05597  
 Median :0.06499  
 Mean   :0.06473  
 3rd Qu.:0.07356  
 Max.   :0.10435  
M2$graph()

Male vs. Female Characters:

Looking at the first difference between male and female characters, my analysis shows that on average, female characters have a .05 higher chance of being alive than male characters (first difference can be as low as .01 and as high as .09).

M2$setx(gender="Male Characters")
M2$setx1(gender="Female Characters")
M2$sim()
fd <- M2$get_qi(xvalue="x1", qi="fd")
summary(fd)
       V1         
 Min.   :0.01015  
 1st Qu.:0.04152  
 Median :0.04910  
 Mean   :0.04912  
 3rd Qu.:0.05680  
 Max.   :0.08541  
M2$graph()

Secret vs. Public Identity:

Here, the analysis shows that on average, characters with public identities have a .004 higher chance of being alive than characters with secret identities. However, this difference is not significant (as the AIC/BIC table showed above) and the first difference can be as high as .036 and as low as -.029 (meaning, characters with public identities can also have a lower percentage of being alive). Therefore, whether a character’s identity is secret or public does not seem to have much influence on their chances of being alive.

M2$setx(identity="Secret Identity")
M2$setx1(identity="Public Identity")
M2$sim()
fd <- M2$get_qi(xvalue="x1", qi="fd")
summary(fd)
       V1           
 Min.   :-0.028765  
 1st Qu.:-0.002651  
 Median : 0.004200  
 Mean   : 0.004119  
 3rd Qu.: 0.011159  
 Max.   : 0.035572  
M2$graph()

Number of Appearances Effect:

Looking at a range between 0 and 1000 appearances, I found that the expected value of being alive increases as the number of appearances in the comic increases. This makes sense since characters would likely appear in the comics as living (rather than as deceased). However, the uncertainty of being alive also increases as number of appearances increase.

M2$setrange(APPEARANCES=0:1000)
M2$sim()

|================================================================|100% ~0 s remaining     
M2$graph()

Conclusion:

After running a logistic regression using Zelig, I was able to determine the chances of a Marvel character being alive or not by exploring independent variables such as alignemnt, gender, identity, and appearance number. I found that characters who are good or neutral are more likely to be alive in the comics than those who are bad, and characters who are female are more likely to be alive than those who are male. Whether a character’s identity is secret or public does not have much influence on whether he/she is alive in the comics. Lastly, characters have a higher chance of being alive as they appear more often in the comics; however, as number of appearances increases, the uncertainty of being alive increases as well.

LS0tCnRpdGxlOiAiU29jIDcxMjogSG9tZXdvcmsgNiIKb3V0cHV0OiBodG1sX25vdGVib29rCi0tLQoqSmVubmlmZXIgR2FuZWxlcyoKPGJyLz4qMy8yNC8xOSoKCiMjUGFydCAxOiBFeHBsb3JpbmcgdGhlIFplbGlnIFBhY2thZ2UgKFplbGlnIDQgdnMuIFplbGlnIDUgU3ludGF4KQpVc2luZyB0aGUgVGl0YW5pYyBkYXRhc2V0IGZyb20gdGhlIHJhZGlhbnQuZGF0YSBwYWNrYWdlLCBJIHJlLWltcGxlbWVudGVkIHRoZSByZWdyZXNzaW9uIGFuYWx5c2VzIGNvbmR1Y3RlZCBpbiBjbGFzcyAoc2xpZGVzIDUuMi01LjE4KSB1c2luZyB0aGUgWmVsaWcgNSBzeW50YXguCgojIyNQcmVwYXJpbmcgdGhlIERhdGE6IFJlY29kaW5nIGFuZCBTZWxlY3RpbmcgVmFyaWFibGVzCmBgYHtyfQpsaWJyYXJ5KHJhZGlhbnQuZGF0YSkKZGF0YSh0aXRhbmljKQp0aXRhbmljPXRpdGFuaWMgJT4lCiAgbXV0YXRlKHN1cnYgPSBhcy5pbnRlZ2VyKHN1cnZpdmVkKSkgJT4lIAogIG11dGF0ZShzdXJ2aXZhbCA9IHNqbWlzYzo6cmVjKHN1cnYsIHJlYyA9ICIyPTA7IDE9MSIpKSAlPiUgCiAgc2VsZWN0KHBjbGFzcywgc3Vydml2ZWQsIHN1cnZpdmFsLCBldmVyeXRoaW5nKCkpCmhlYWQodGl0YW5pYykKYGBgCgojIyNTbGlkZSA1LjI6IEludGVyYWN0aW9uIE1vZGVsCmBgYHtyfQojWmVsaWcgNDogCiN6X3RpdCA8LSB6ZWxpZyhzdXJ2aXZhbCB+IGFnZSArIHNleCpwY2xhc3MgKyBmYXJlLCBtb2RlbCA9ICJsb2dpdCIsIGRhdGEgPSB0aXRhbmljLCBjaXRlID0gRikKI1plbGlnIDU6Cno1X3RpdCA8LSB6bG9naXQkbmV3KCkKejVfdGl0JHplbGlnKHN1cnZpdmFsIH4gYWdlICsgc2V4KnBjbGFzcyArIGZhcmUsIGRhdGEgPSB0aXRhbmljKQpzdW1tYXJ5KHo1X3RpdCkKYGBgCgojIyMgU2xpZGVzIDUuMy01LjQ6IEFnZSBFZmZlY3QKCmBgYHtyfQpsaWJyYXJ5KFplbGlnKQoKI1plbGlnIDQ6IAojYS5yYW5nZSA9IG1pbih0aXRhbmljJGFnZSk6bWF4KHRpdGFuaWMkYWdlKQojeCA8LSBzZXR4KHpfdGl0LCBhZ2UgPSBhLnJhbmdlKQojcyA8LSBzaW0oel90aXQsIHggPSB4KQojY2kucGxvdChzKQoKI1plbGlnIDU6CmEucmFuZ2U9bWluKHRpdGFuaWMkYWdlKTptYXgodGl0YW5pYyRhZ2UpCno1X3RpdCRzZXRyYW5nZShhZ2U9YS5yYW5nZSkKejVfdGl0JHNpbSgpCno1X3RpdCRncmFwaCgpCgpgYGAKTG9va2luZyBhdCB0aGUgZnVsbCBhZ2UgcmFuZ2UsIHdlIGZpbmQgdGhhdCBpbmZhbnRzIGhhdmUgYSBoaWdoZXIgZXhwZWN0ZWQgdmFsdWUgb2Ygc3Vydml2aWFsIChtZWRpYW5+LjM1KSB0aGFuIHBlb3BsZSB3aG8gYXJlIG9sZGVyLCBidXQgdW5jZXJ0YWludHkgaXMgaGlnaGVyIGZvciBpbmZhbnRzIHRoYW4gZm9yIHRob3NlIHdobyBhcmUgb2xkZXIgKHdlIGFyZSBtb3JlIGNlcnRhaW4gaW4gbG93IHN1cnZpdmFsIHJhdGUgd2hlbiBvbGRlcikKCiMjI1NsaWRlcyA1LjUtNS42OiBGYXJlIEVmZmVjdAoKYGBge3J9CiNaZWxpZyA0OgojZi5yYW5nZSA9IG1pbih0aXRhbmljJGZhcmUpOm1heCh0aXRhbmljJGZhcmUpCiN4IDwtIHNldHgoel90aXQsIGZhcmUgPSBmLnJhbmdlKQojcyA8LSBzaW0oel90aXQsIHggPSB4KQojY2kucGxvdChzKQoKI1plbGlnIDU6CmYucmFuZ2UgPSBtaW4odGl0YW5pYyRmYXJlKTptYXgodGl0YW5pYyRmYXJlKQp6NV90aXQkc2V0cmFuZ2UoZmFyZT1mLnJhbmdlKQp6NV90aXQkc2ltKCkKejVfdGl0JGdyYXBoKCkKYGBgCkxvb2tpbmcgYXQgdGhlIGZ1bGwgZmFyZSByYW5nZSwgd2UgZmluZCB0aGF0IHRoZSBleHBlY3RlZCB2YWx1ZSBvZiBzdXJ2aXZpbmcgaXMgYWxtb3N0IGNvbnN0YW50IGFzIGZhcmUgaW5jcmVhc2VzICh3aXRoIGEgdmVyeSBtaW5vciBkZWNyZWFzZSBpbiBzdXJ2aXZhbCBhbmQgYSBsYXJnZSBpbmNyZWFzZSBpbiB1bmNlcnRhaW50eSBhcyBmYXJlIGluY3JlYXNlcykuIFRoaXMgc3VnZ2VzdHMgdGhhdCBmYXJlIGRvZXMgbm90IHJlYWxseSBpbmZsdWVuY2Ugc3Vydml2YWwgY2hhbmNlIChhZnRlciBjb250cm9sbGluZyBmb3IgY2xhc3MpLgoKIyMjU2xpZGVzIDUuNy01Ljk6IFNleCBEaWZmZXJlbmNlCgpgYGB7cn0KI1plbGlnIDQ6CiN4IDwtIHNldHgoel90aXQsIHNleCA9ICJtYWxlIikKI3gxIDwtIHNldHgoel90aXQsIHNleCA9ICJmZW1hbGUiKQojcyA8LSBzaW0oel90aXQsIHggPSB4LCB4MSA9IHgxKQojZmQgPC0gcyRnZXRfcWkoeHZhbHVlPSJ4MSIsIHFpPSJmZCIpCiNzdW1tYXJ5KGZkKQojcGxvdChzKQoKI1plbGlnIDU6Cno1X3RpdCRzZXR4KHNleD0ibWFsZSIpCno1X3RpdCRzZXR4MShzZXg9ImZlbWFsZSIpCno1X3RpdCRzaW0oKQpmZDwtejVfdGl0JGdldF9xaSh4dmFsdWU9IngxIiwgcWk9ImZkIikKc3VtbWFyeShmZCkKYGBgCkxvb2tpbmcgYXQgdGhlIHNpbXVsYXRlZCBmaXJzdCBkaWZmZXJlbmNlIGJldHdlZW4gbWFsZXMgYW5kIGZlbWFsZXMgaW4gZXhwZWN0ZWQgc3Vydml2YWwsIHdlIGZpbmQgdGhhdCBvbiBhdmVyYWdlLCBmZW1hbGVzIGhhdmUgYSAuMjYgaGlnaGVyIGNoYW5jZSBvZiBzdXJ2aXZpbmcgdGhhbiBtYWxlcyAoY2FuIGJlIGFzIGxvdyBhcyAuMTQgYW5kIGFzIGhpZ2ggYXMgLjM5KQpgYGB7cn0KejVfdGl0JGdyYXBoKCkKYGBgCgoKIyMjU2xpZGVzIDUuMTAtNS4xNTogQ2xhc3MgVmFyaWF0aW9uIGluIFNleCBEaWZmZXJlbmNlCgpgYGB7cn0KI1plbGlnIDQ6CiNjMXggPC0gc2V0eCh6X3RpdCwgc2V4ID0gIm1hbGUiLCBwY2xhc3MgPSAiMXN0IikKI2MxeDEgPC0gc2V0eCh6X3RpdCwgc2V4ID0gImZlbWFsZSIsIHBjbGFzcyA9ICIxc3QiKQojYzFzIDwtIHNpbSh6X3RpdCwgeCA9IGMxeCwgeDEgPSBjMXgxKQoKI1plbGlnIDU6Cno1LjEgPC0gemxvZ2l0JG5ldygpCno1LjEkemVsaWcoc3Vydml2YWwgfiBhZ2UgK3NleCpwY2xhc3MgKyBmYXJlLCBkYXRhPXRpdGFuaWMpCno1LjEkc2V0eChzZXg9Im1hbGUiLCBwY2xhc3M9IjFzdCIpCno1LjEkc2V0eDEoc2V4PSJmZW1hbGUiLCBwY2xhc3M9IjFzdCIpCno1LjEkc2ltKCkKejUuMSRncmFwaCgpCmBgYAoqKlNsaWRlIDUuMTI6KioKPGJyLz5Gb3IgZmlyc3QgY2xhc3MsIHRoZSBkaWZmZXJlbmNlIGluIGV4cGVjdGVkIHZhbHVlIG9mIHN1cnZpdmFsIGJldHdlZW4gZmVtYWxlcyBhbmQgbWFsZXMgaXMgYWJvdXQgLjUyLCBzdWdnZXN0aW5nIHRoYXQgZmlyc3QgY2xhc3MgZmVtYWxlcyBoYXZlIGEgLjUyIGhpZ2hlciBjaGFuY2Ugb2Ygc3Vydml2aW5nIHRoYW4gZmlyc3QgY2xhc3MgbWFsZXMuCgoKYGBge3J9CiNaZWxpZyA0OgojYzJ4IDwtIHNldHgoel90aXQsIHNleCA9ICJtYWxlIiwgcGNsYXNzID0gIjJuZCIpCiNjMngxIDwtIHNldHgoel90aXQsIHNleCA9ICJmZW1hbGUiLCBwY2xhc3MgPSAiMm5kIikKI2MycyA8LSBzaW0oel90aXQsIHggPSBjMngsIHgxID0gYzJ4MSkKCiNaZWxpZyA1Ogp6NS4yIDwtIHpsb2dpdCRuZXcoKQp6NS4yJHplbGlnKHN1cnZpdmFsIH4gYWdlICtzZXgqcGNsYXNzICsgZmFyZSwgZGF0YT10aXRhbmljKQp6NS4yJHNldHgoc2V4PSJtYWxlIiwgcGNsYXNzPSIybmQiKQp6NS4yJHNldHgxKHNleD0iZmVtYWxlIiwgcGNsYXNzPSIybmQiKQp6NS4yJHNpbSgpCno1LjIkZ3JhcGgoKQpgYGAKKipTbGlkZSA1LjEzOioqCjxici8+Rm9yIHNlY29uZCBjbGFzcywgdGhlIHNpbXVsYXRlZCBmaXJzdCBkaWZmZXJlbmNlIGJldHdlZW4gbWFsZSBhbmQgZmVtYWxlIHN1cnZpdmFsIGluY3JlYXNlcyB0byBhYm91dCAuNzUsIHN1Z2dlc3RpbmcgdGhhdCBzZWNvbmQgY2xhc3MgZmVtYWxlcyBoYXZlIGEgLjc1IGhpZ2hlciBjaGFuY2Ugb2Ygc3VydmlhbCB0aGFuIHNlY29uZCBjbGFzcyBtYWxlcy4KCmBgYHtyfQojWmVsaWcgNDoKI2MzeCA8LSBzZXR4KHpfdGl0LCBzZXggPSAibWFsZSIsIHBjbGFzcyA9ICIzcmQiKQojYzN4MSA8LSBzZXR4KHpfdGl0LCBzZXggPSAiZmVtYWxlIiwgcGNsYXNzID0gIjNyZCIpCiNjM3MgPC0gc2ltKHpfdGl0LCB4ID0gYzN4LCB4MSA9IGMzeDEpCgojWmVsaWcgNToKejUuMyA8LSB6bG9naXQkbmV3KCkKejUuMyR6ZWxpZyhzdXJ2aXZhbCB+IGFnZSArc2V4KnBjbGFzcyArIGZhcmUsIGRhdGE9dGl0YW5pYykKejUuMyRzZXR4KHNleD0ibWFsZSIsIHBjbGFzcz0iM3JkIikKejUuMyRzZXR4MShzZXg9ImZlbWFsZSIsIHBjbGFzcz0iM3JkIikKejUuMyRzaW0oKQp6NS4zJGdyYXBoKCkKYGBgCioqU2xpZGUgNS4xNDoqKgo8YnIvPkZvciB0aGlyZCBjbGFzcywgdGhlIHNpbXVsYXRlZCBmaXJzdCBkaWZmZXJlbmNlIGJldHdlZW4gZmVtYWxlIGFuZCBtYWxlIHN1cnZpdmFsIGRyb3BzIHRvIGFib3V0IC4yNiwgc3VnZ2VzdGluZyB0aGF0IHRoaXJkIGNsYXNzIHdvbWVuIGhhdmUgYSAuMjYgaGlnaGVyIGNoYW5jZSBvZiBzdXJ2aXZhbCB0aGFuIHRoaXJkIGNsYXNzIG1lbi4gKEFzIHdlIG1vdmUgZG93biB0aGUgY2xhc3MgcmFua3MsIHdvbWVuJ3MgZXhwZWN0ZWQgc3Vydml2YWwgZGVjcmVhc2VzLikKCiMjI1NsaWRlIDUuMTU6IFB1dHRpbmcgVGhlbSBpbiBPbmUgUGxhY2UKYGBge3J9CmQxIDwtIHo1LjEkZ2V0X3FpKHh2YWx1ZT0ieDEiLCBxaT0iZmQiKQpkMiA8LSB6NS4yJGdldF9xaSh4dmFsdWU9IngxIiwgcWk9ImZkIikKZDMgPC0gejUuMyRnZXRfcWkoeHZhbHVlPSJ4MSIsIHFpPSJmZCIpCiAgCmRmZCA8LSBhcy5kYXRhLmZyYW1lKGNiaW5kKGQxLCBkMiwgZDMpKQpoZWFkKGRmZCkKYGBgCiMjI1NsaWRlIDUuMTY6IENoYW5naW5nIGZyb20gV2lkZSB0byBMb25nIEZvcm1hdApgYGB7cn0KbGlicmFyeSh0aWR5cikKdGlkZCA8LSBkZmQgJT4lIAogIGdhdGhlcihjbGFzcywgc2ltdiwgMTozKQpoZWFkKHRpZGQpCmBgYAojIyNTbGlkZSA1LjE3OiBHcm91cCBieSBDbGFzcwpgYGB7cn0KbGlicmFyeShkcGx5cikKdGlkZCAlPiUgCiAgZ3JvdXBfYnkoY2xhc3MpICU+JSAKICBzdW1tYXJpc2UobWVhbiA9IG1lYW4oc2ltdiksIHNkID0gc2Qoc2ltdikpCmBgYAojIyNTbGlkZSA1LjE4OiBQbG90dGluZwpMb29raW5nIGF0IHRoZSBleHBlY3RlZCBmaXJzdCBkaWZmZXJlbmNlIGJldHdlZW4gZmVtYWxlIGFuZCBtYWxlIHBhc3NlbmdlcnMgYWNyb3NzIGFsbCAzIGNsYXNzZXMsIHdlIGNhbiBzZWUgdGhlIGZpcnN0IGRpZmZlcmVuY2UgaXMgaGlnaGVzdCBpbiBzZWNvbmQgY2xhc3MgYW5kIGxvd2VzdCBpbiB0aGlyZCBjbGFzcy4gTWFsZSBhbmQgZmVtYWxlIHBhc3NlbmdlcnMgaGF2ZSBjbG9zZXIgZXhwZWN0ZWQgc3Vydml2YWwgcmF0ZXMgaW4gdGhpcmQgY2xhc3MuCmBgYHtyIG1lc3NhZ2U9RkFMU0V9CmxpYnJhcnkoZ2dwbG90MikKZ2dwbG90KHRpZGQsIGFlcyhzaW12KSkgKyBnZW9tX2hpc3RvZ3JhbSgpICsgZmFjZXRfZ3JpZCh+Y2xhc3MpCmBgYAoKIyNQYXJ0IDI6IEV4cGxvcmluZyB0aGUgWmVsaWcgUGFja2FnZSBVc2luZyBNeSBPd24gRGF0YXNldCAoTWFydmVsIENoYXJhY3RlcnMgYXMgTGl2aW5nIG9yIERlY2Vhc2VkKQoKVXNpbmcgYSBGaXZlVGhpcnR5RWlnaHQgQ29taWMgQ2hhcmFjdGVycyBEYXRhc2V0IGZvdW5kIG9uIEthZ2dsZSwgdGhpcyB3ZWVrJ3MgaG9tZXdvcmsgc2Vla3MgdG8gZGV0ZXJtaW5lIGhvdyB2YXJpYWJsZXMgc3VjaCBhcyBhbGlnbm1lbnQgKGdvb2QsIGJhZCwgb3IgbmV1dHJhbCksIGdlbmRlciAobWFsZSBvciBmZW1hbGUpLCBpZGVudGl0eSAocHVibGljIG9yIHNlY3JldCksIGFuZCBudW1iZXIgb2YgYXBwZWFyYW5jZXMgKGFzIG9mIDIwMTQpIGV4cGxhaW4gdGhlIGxpa2VsaWhvb2Qgb2Ygd2hldGhlciBhIE1hcnZlbCBjaGFyYWN0ZXIgd291bGQgYmUgYWxpdmUgaW4gdGhlIGNvbWljcyBvciBub3QuIFNpbmNlIG15IGRlcGVuZGVudCB2YXJpYWJsZSBpcyBkaWNob3RvbW91cywgSSBjb25kdWN0ZWQgYSBsb2dpdCByZWdyZXNzaW9uIGFuYWx5c2lzLiAKCiMjI1ByZXBhcmluZyB0aGUgRGF0YTogUmVjb2RpbmcgYW5kIFNlbGVjdGluZyBWYXJpYWJsZXMKTXkgZGVwZW5kZW50IHZhcmlhYmxlIHdhcyByZWNvZGVkIGFzIGJpbmFyeSAoKmFsaXZlX2JpbmFyeSopLCB3aGVyZSAxPWxpdmluZyBhbmQgMD1kZWNlYXNlZC4gTXkgKmlkZW50aXR5KiB2YXJpYWJsZSB3YXMgYWxzbyByZWNvZGVkIHNvIHRoYXQgIlB1YmxpYyBJZGVudGl0eSIiIGluY2x1ZGVkICJObyBEdWFsIElkZW50aXR5IiBhbmQgIktub3duIHRvIEF1dGhvcml0aWVzLiIgRm9yIG15ICpnZW5kZXIqIHZhcmlhYmxlLCAiQWdlbmRlciIgYW5kICJHZW5kZXJmbHVpZCIgY2hhcmFjdGVycyB3ZXJlIHJlY29kZWQgYXMgIk90aGVyLiIKYGBge3IgbWVzc2FnZT1GQUxTRX0KbGlicmFyeShyZWFkcikKbGlicmFyeShkcGx5cikKbGlicmFyeShtYWdyaXR0cikKTWFydmVsPC1yZWFkX2NzdigiL1VzZXJzL2plbm5pZmVyZ2FuZWxlcy9Eb3dubG9hZHMvbWFydmVsLXdpa2lhLWRhdGEuY3N2IikKbWFydmVsX2hlcm9lczwtCiAgbXV0YXRlIChNYXJ2ZWwsIGFsaXZlX2JpbmFyeT0KICAgICAgICAgICByZWNvZGUoQUxJVkUsICJMaXZpbmcgQ2hhcmFjdGVycyI9MSwiRGVjZWFzZWQgQ2hhcmFjdGVycyI9MCksCiAgICAgICAgICBHZW5kZXI9CiAgICAgICAgICAgIHJlY29kZShTRVgsICJBZ2VuZGVyIENoYXJhY3RlcnMiPSJPdGhlciIsICJHZW5kZXJmbHVpZCBDaGFyYWN0ZXJzIj0iT3RoZXIiKSwKICAgICAgICAgIElkZW50aXR5PQogICAgICAgICAgICByZWNvZGUoSUQsICJObyBEdWFsIElkZW50aXR5Ij0iUHVibGljIElkZW50aXR5IiwgIktub3duIHRvIEF1dGhvcml0aWVzIElkZW50aXR5Ij0iUHVibGljIElkZW50aXR5IiksCiAgICAgICAgICBhbGlnbm1lbnQgPSBmYWN0b3IoQUxJR04pLAogICAgICAgICAgZ2VuZGVyID0gZmFjdG9yKEdlbmRlciksCiAgICAgICAgICBpZGVudGl0eT1mYWN0b3IoSWRlbnRpdHkpKSU+JQogICAgZmlsdGVyKCFpcy5uYShBUFBFQVJBTkNFUyksCiAgICAgICAgICAgIWlzLm5hKGFsaWdubWVudCkpJT4lCiAgCiAgc2VsZWN0KEFMSVZFLCBhbGl2ZV9iaW5hcnksIGFsaWdubWVudCwgZ2VuZGVyLCBpZGVudGl0eSwgQVBQRUFSQU5DRVMpCmhlYWQobWFydmVsX2hlcm9lcykKCmBgYAoKIyMjUnVubmluZyBUaHJlZSBSZWdyZXNzaW9uIE1vZGVscyBhbmQgRGV0ZXJtaW5pbmcgdGhlIEJlc3QgTW9kZWwgRml0CkJvdGggQUlDIGFuZCBCSUMgYWdyZWUgdGhhdCBNb2RlbCAyIGlzIHRoZSBiZXN0IG1vZGVsLCB3aGljaCBjb250YWlucyBhbGwgc2VsZWN0ZWQgdmFyaWFibGVzIGJ1dCB3aXRob3V0IGFuIGludGVyYWN0aW9uIHRlcm0uCmBgYHtyIHJlc3VsdHM9J2FzaXMnfQpNMTwtemxvZ2l0JG5ldygpCk0xJHplbGlnKGFsaXZlX2JpbmFyeX4gaWRlbnRpdHkrZ2VuZGVyLCBkYXRhPW1hcnZlbF9oZXJvZXMpCk0yPC16bG9naXQkbmV3KCkKTTIkemVsaWcoYWxpdmVfYmluYXJ5fiBpZGVudGl0eStnZW5kZXIrYWxpZ25tZW50K0FQUEVBUkFOQ0VTLCBkYXRhPW1hcnZlbF9oZXJvZXMpCk0zPC16bG9naXQkbmV3KCkKTTMkemVsaWcoYWxpdmVfYmluYXJ5fiBpZGVudGl0eStnZW5kZXIqQVBQRUFSQU5DRVMrYWxpZ25tZW50LCBkYXRhPW1hcnZlbF9oZXJvZXMpCnRleHJlZzo6aHRtbHJlZyhsaXN0KE0xLCBNMiwgTTMpLGRvY3R5cGUgPSBGQUxTRSkKYGBgCioqKlRoZSBhYm92ZSB0YWJsZSBkaXNwbGF5cyB0aGUgcmVncmVzc2lvbiByZXN1bHRzIGluIHRlcm1zIG9mIGxvZyBvZGRzLCBidXQgSSB3YW50IHRvIHByb2R1Y2UgbW9yZSB1bmRlcnN0YW5kYWJsZSBjb2VmZmljaWVudHMgdXNpbmcgc2ltdWxhdGlvbi4uLioqCgojIyNCYWQgdnMuIEdvb2QgQ2hhcmFjdGVyczoKTG9va2luZyBhdCB0aGUgc2ltdWxhdGVkIGZpcnN0IGRpZmZlcmVuY2UgYmV0d2VlbiBiYWQgYW5kIGdvb2QgY2hhcmFjdGVycywgbXkgYW5hbHlzaXMgc2hvd3MgdGhhdCBvbiBhdmVyYWdlLCBnb29kIGNoYXJhY3RlcnMgaGF2ZSBhIC4xMiBoaWdoZXIgY2hhbmNlIG9mIGJlaW5nIGFsaXZlIHRoYW4gYmFkIGNoYXJhY3RlcnMgKGZpcnN0IGRpZmZlcmVuY2UgY2FuIGJlIGFzIGxvdyBhcyAuMDkgYW5kIGFzIGhpZ2ggYXMgLjE1KS4KYGBge3J9Ck0yJHNldHgoYWxpZ25tZW50PSJCYWQgQ2hhcmFjdGVycyIpCk0yJHNldHgxKGFsaWdubWVudD0iR29vZCBDaGFyYWN0ZXJzIikKTTIkc2ltKCkKZmQgPC0gTTIkZ2V0X3FpKHh2YWx1ZT0ieDEiLCBxaT0iZmQiKQpzdW1tYXJ5KGZkKQpNMiRncmFwaCgpCmBgYAoKCiMjI0JhZCB2cy4gTmV1dHJhbCBDaGFyYWN0ZXJzOgpMb29raW5nIGF0IHRoZSBzaW11bGF0ZWQgZmlyc3QgZGlmZmVyZW5jZSBiZXR3ZWVuIGJhZCBhbmQgbmV1dHJhbCBjaGFyYWN0ZXJzLCBteSBhbmFseXNpcyBzaG93cyB0aGF0IG9uIGF2ZXJhZ2UsIG5ldXRyYWwgY2hhcmFjdGVycyBoYXZlIGEgLjA2IGhpZ2hlciBjaGFuY2Ugb2YgYmVpbmcgYWxpdmUgdGhhbiBiYWQgY2hhcmFjdGVycyAoZmlyc3QgZGlmZmVyZW5jZSBjYW4gYmUgYXMgbG93IGFzIC4wMiBhbmQgYXMgaGlnaCBhcyAuMTApLgpgYGB7cn0KTTIkc2V0eChhbGlnbm1lbnQ9IkJhZCBDaGFyYWN0ZXJzIikKTTIkc2V0eDEoYWxpZ25tZW50PSJOZXV0cmFsIENoYXJhY3RlcnMiKQpNMiRzaW0oKQpmZCA8LSBNMiRnZXRfcWkoeHZhbHVlPSJ4MSIsIHFpPSJmZCIpCnN1bW1hcnkoZmQpCk0yJGdyYXBoKCkKYGBgCiMjI01hbGUgdnMuIEZlbWFsZSBDaGFyYWN0ZXJzOgpMb29raW5nIGF0IHRoZSBmaXJzdCBkaWZmZXJlbmNlIGJldHdlZW4gbWFsZSBhbmQgZmVtYWxlIGNoYXJhY3RlcnMsIG15IGFuYWx5c2lzIHNob3dzIHRoYXQgb24gYXZlcmFnZSwgZmVtYWxlIGNoYXJhY3RlcnMgaGF2ZSBhIC4wNSBoaWdoZXIgY2hhbmNlIG9mIGJlaW5nIGFsaXZlIHRoYW4gbWFsZSBjaGFyYWN0ZXJzIChmaXJzdCBkaWZmZXJlbmNlIGNhbiBiZSBhcyBsb3cgYXMgLjAxIGFuZCBhcyBoaWdoIGFzIC4wOSkuCgpgYGB7cn0KTTIkc2V0eChnZW5kZXI9Ik1hbGUgQ2hhcmFjdGVycyIpCk0yJHNldHgxKGdlbmRlcj0iRmVtYWxlIENoYXJhY3RlcnMiKQpNMiRzaW0oKQpmZCA8LSBNMiRnZXRfcWkoeHZhbHVlPSJ4MSIsIHFpPSJmZCIpCnN1bW1hcnkoZmQpCk0yJGdyYXBoKCkKYGBgCiMjI1NlY3JldCB2cy4gUHVibGljIElkZW50aXR5OgpIZXJlLCB0aGUgYW5hbHlzaXMgc2hvd3MgdGhhdCBvbiBhdmVyYWdlLCBjaGFyYWN0ZXJzIHdpdGggcHVibGljIGlkZW50aXRpZXMgaGF2ZSBhIC4wMDQgaGlnaGVyIGNoYW5jZSBvZiBiZWluZyBhbGl2ZSB0aGFuIGNoYXJhY3RlcnMgd2l0aCBzZWNyZXQgaWRlbnRpdGllcy4gSG93ZXZlciwgdGhpcyBkaWZmZXJlbmNlIGlzIG5vdCBzaWduaWZpY2FudCAoYXMgdGhlIEFJQy9CSUMgdGFibGUgc2hvd2VkIGFib3ZlKSBhbmQgdGhlIGZpcnN0IGRpZmZlcmVuY2UgY2FuIGJlIGFzIGhpZ2ggYXMgLjAzNiBhbmQgYXMgbG93IGFzIC0uMDI5IChtZWFuaW5nLCBjaGFyYWN0ZXJzIHdpdGggcHVibGljIGlkZW50aXRpZXMgY2FuIGFsc28gaGF2ZSBhIGxvd2VyIHBlcmNlbnRhZ2Ugb2YgYmVpbmcgYWxpdmUpLiBUaGVyZWZvcmUsIHdoZXRoZXIgYSBjaGFyYWN0ZXIncyBpZGVudGl0eSBpcyBzZWNyZXQgb3IgcHVibGljIGRvZXMgbm90IHNlZW0gdG8gaGF2ZSBtdWNoIGluZmx1ZW5jZSBvbiB0aGVpciBjaGFuY2VzIG9mIGJlaW5nIGFsaXZlLiAKYGBge3J9Ck0yJHNldHgoaWRlbnRpdHk9IlNlY3JldCBJZGVudGl0eSIpCk0yJHNldHgxKGlkZW50aXR5PSJQdWJsaWMgSWRlbnRpdHkiKQpNMiRzaW0oKQpmZCA8LSBNMiRnZXRfcWkoeHZhbHVlPSJ4MSIsIHFpPSJmZCIpCnN1bW1hcnkoZmQpCk0yJGdyYXBoKCkKYGBgCiMjI051bWJlciBvZiBBcHBlYXJhbmNlcyBFZmZlY3Q6Ckxvb2tpbmcgYXQgYSByYW5nZSBiZXR3ZWVuIDAgYW5kIDEwMDAgYXBwZWFyYW5jZXMsIEkgZm91bmQgdGhhdCB0aGUgZXhwZWN0ZWQgdmFsdWUgb2YgYmVpbmcgYWxpdmUgaW5jcmVhc2VzIGFzIHRoZSBudW1iZXIgb2YgYXBwZWFyYW5jZXMgaW4gdGhlIGNvbWljIGluY3JlYXNlcy4gVGhpcyBtYWtlcyBzZW5zZSBzaW5jZSBjaGFyYWN0ZXJzIHdvdWxkIGxpa2VseSBhcHBlYXIgaW4gdGhlIGNvbWljcyBhcyBsaXZpbmcgKHJhdGhlciB0aGFuIGFzIGRlY2Vhc2VkKS4gSG93ZXZlciwgdGhlIHVuY2VydGFpbnR5IG9mIGJlaW5nIGFsaXZlIGFsc28gaW5jcmVhc2VzIGFzIG51bWJlciBvZiBhcHBlYXJhbmNlcyBpbmNyZWFzZS4KYGBge3J9Ck0yJHNldHJhbmdlKEFQUEVBUkFOQ0VTPTA6MTAwMCkKTTIkc2ltKCkKTTIkZ3JhcGgoKQpgYGAKIyNDb25jbHVzaW9uOgpBZnRlciBydW5uaW5nIGEgbG9naXN0aWMgcmVncmVzc2lvbiB1c2luZyBaZWxpZywgSSB3YXMgYWJsZSB0byBkZXRlcm1pbmUgdGhlIGNoYW5jZXMgb2YgYSBNYXJ2ZWwgY2hhcmFjdGVyIGJlaW5nIGFsaXZlIG9yIG5vdCBieSBleHBsb3JpbmcgaW5kZXBlbmRlbnQgdmFyaWFibGVzIHN1Y2ggYXMgYWxpZ25lbW50LCBnZW5kZXIsIGlkZW50aXR5LCBhbmQgYXBwZWFyYW5jZSBudW1iZXIuIEkgZm91bmQgdGhhdCBjaGFyYWN0ZXJzIHdobyBhcmUgZ29vZCBvciBuZXV0cmFsIGFyZSBtb3JlIGxpa2VseSB0byBiZSBhbGl2ZSBpbiB0aGUgY29taWNzIHRoYW4gdGhvc2Ugd2hvIGFyZSBiYWQsIGFuZCBjaGFyYWN0ZXJzIHdobyBhcmUgZmVtYWxlIGFyZSBtb3JlIGxpa2VseSB0byBiZSBhbGl2ZSB0aGFuIHRob3NlIHdobyBhcmUgbWFsZS4gV2hldGhlciBhIGNoYXJhY3RlcidzIGlkZW50aXR5IGlzIHNlY3JldCBvciBwdWJsaWMgZG9lcyBub3QgaGF2ZSBtdWNoIGluZmx1ZW5jZSBvbiB3aGV0aGVyIGhlL3NoZSBpcyBhbGl2ZSBpbiB0aGUgY29taWNzLiBMYXN0bHksIGNoYXJhY3RlcnMgaGF2ZSBhIGhpZ2hlciBjaGFuY2Ugb2YgYmVpbmcgYWxpdmUgYXMgdGhleSBhcHBlYXIgbW9yZSBvZnRlbiBpbiB0aGUgY29taWNzOyBob3dldmVyLCBhcyBudW1iZXIgb2YgYXBwZWFyYW5jZXMgaW5jcmVhc2VzLCB0aGUgdW5jZXJ0YWludHkgb2YgYmVpbmcgYWxpdmUgaW5jcmVhc2VzIGFzIHdlbGwuCgo=