Part 1: Using Zelig 5 from slides 5.2 to 5.18

I will be redoing the classwork from slides 5.2 to 5.18 as Zelig 5 below:

Intiating Zelig 5 with Titanic data and radiant.data, recoding survived as a binary variable:

library(radiant.data)
library(Zelig)
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)

Interaction model using Zelig (5.2):

z5 <- zlogit$new()
z5$zelig(survival ~ age + sex*pclass+fare, data = titanic)
summary(z5)
Model: 

Call:
z5$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

Age effect (5.3-5.4):

As age goes up (from infant to elder), the chances of surviving the Titanic goes down, where the median survival rate is around .35 for infants. There is a negative correlation. However, the uncertainty to survive for infants/young people is much higher than certainty of survival when you’re 80 (a higher gap is more uncertainty).

z5 <- zlogit$new()
z5$zelig(survival ~ age + sex*pclass+fare, data = titanic)
a.range = min(titanic$age):max(titanic$age)
z5$setrange(age=a.range)
z5$sim()
z5$graph()

Fare Effect (5.5-5.6):

As fare goes up, chances of surviving the Titanic pretty much stays the same. The expected value of survival remains pretty constant with respect to fare. Fare price did not have much too much influence on one’s chances of surviving the Titanic.

z5 <- zlogit$new()
z5$zelig(survival ~ age + sex*pclass+fare, data = titanic)
f.range = min(titanic$fare):max(titanic$fare)
z5$setrange(fare=f.range)
z5$sim()
z5$graph()

Sex Difference (5.7-5.9):

The first difference shows that females’ expected value is about .26 higher than males, on average. Females can have an expected value of about .39 and males can have an expected value of about .13. This shows that females have a better chance of surviving the Titanic than males.

z5 <- zlogit$new()
z5$zelig(survival ~ age + sex*pclass+fare, data = titanic)
z5$setx(sex = "male")
z5$setx1(sex = "female")
z5$sim()
z5$graph()

fd <- z5$get_qi(xvalue="x1", qi="fd")
summary(fd)
       V1         
 Min.   :0.09055  
 1st Qu.:0.22784  
 Median :0.25590  
 Mean   :0.25601  
 3rd Qu.:0.28558  
 Max.   :0.42242  

How to test the class variations in sex difference using Zelig?(5.11-5.14):

1st class: The difference in expected value of survival is about .52 higher for females than males. 2nd class: The difference in expected value of survival is about .77 higher for females than males. The male survival rate decreased by a lot (from around .45 in 1st class to around .13 in 2nd class). 3rd class: 3rd class had the lowest survival rate out of all the classes. The difference in expected value of survival is about .25 higher for females than males.

#First class
z5fc <- zlogit$new()
z5fc$zelig(survival ~ age +sex*pclass + fare, data=titanic)
z5fc$setx(sex="male", pclass="1st")
z5fc$setx1(sex="female", pclass="1st")
z5fc$sim()
z5fc$graph()

#Second class
z5sc <- zlogit$new()
z5sc$zelig(survival ~ age +sex*pclass + fare, data=titanic)
z5sc$setx(sex="male", pclass="2nd")
z5sc$setx1(sex="female", pclass="2nd")
z5sc$sim()
z5sc$graph()

#Third class
z5tc <- zlogit$new()
z5tc$zelig(survival ~ age +sex*pclass + fare, data=titanic)
z5tc$setx(sex="male", pclass="3rd")
z5tc$setx1(sex="female", pclass="3rd")
z5tc$sim()
z5tc$graph()

Putting them in one place - gender differences in survival among 3 classes (5.15):

V1=Gender difference survival rate in 1st class V2=Gender difference survival rate in 2nd class V3=Gender difference survival rate in 3rd class

d1 <- z5fc$get_qi(xvalue="x1", qi="fd")
d2 <- z5sc$get_qi(xvalue="x1", qi="fd")
d3 <- z5tc$get_qi(xvalue="x1", qi="fd")
dfd <- as.data.frame(cbind(d1, d2, d3))
head(dfd)

5.16:

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

Using group_by (5.17):

Among 1st class, women have .52 chance higher than men to survive. 3rd class (V3) is .25(lowest), 2nd class (V2) is largest difference (about .75).

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

5.18

Visualization of the gender first differences by class. As expected, the smallest first difference expected value between females and males is in 3rd class and the largest is in 2nd class.

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

Part 2: Zelig with New dataset

I found the dataset I will be using from kaggle about mental health in the workplace https://www.kaggle.com/osmi/mental-health-in-tech-survey. Taking care of one’s mental health is becoming socially normalized. I want to look at variables such as knowledge of family history of mental illness(family_history), if the mental condition would interfere with work(work_interfere), gender, age, working remotely (remote_work) and healthcare benefits from a job, to see if they are factors for those who sought out mental health treatments(treatment - binary dependent vairable).

library(texreg)
library(tidyr)
library(list)
library(corpcor)
library(tidyverse)
library(knitr)
library (Zelig)
library(readr)
library(readr)
library(dplyr)
library(sjmisc)
survey <- read_csv("C:/Users/abbys/Downloads/survey.csv")
Parsed with column specification:
cols(
  .default = col_character(),
  Timestamp = col_datetime(format = ""),
  Age = col_double()
)
See spec(...) for full column specifications.
head(survey)

Cleaning up the data:

new_survey<-survey %>%
    filter(!is.na(benefits),
         !is.na(treatment),
         !is.na(work_interfere),
         !is.na(family_history),
         !is.na(Age),
         !is.na(remote_work)
        )%>%
  mutate(treatment=rec(treatment,rec="No=0;Yes=1"),work_interfere=rec(work_interfere,rec="Never,Rarely=No;Sometimes,Often=Yes"),Gender=rec(Gender,rec="M,Male,male,m,Male-ish,Cis Male,Mal,Make,Guy (-ish) ^_^,male leaning androgynous,msle,Mail,Malr,Cis Man,ostensibly male, unsure what that really means=0;Female,female,Trans-female,Cis Female,F,f,queer/she/they,woman,cis-female/femme,Trans woman,Female (trans),Female (cis),Woman,femail=1"))%>%
  filter(!is.na(Gender),
         Age<100, Age>0)%>%
  mutate(work_interfere=factor(work_interfere),family_history = factor(family_history), benefits = factor(benefits), Gender=factor(Gender))
head(new_survey)
dim(new_survey)
[1] 969  27

Chosing the best model for zelig

The best model is model 2, since model 2 has the lowest aic and bic.

glm1=glm(treatment~benefits+Gender,family="binomial",data=new_survey)
glm2=glm(treatment~family_history+Gender+work_interfere+benefits+Age,family="binomial",data=new_survey)
glm3=glm(treatment~family_history*Gender+work_interfere+benefits+Age+remote_work,family="binomial",data=new_survey)
texreg::screenreg(list(glm1,glm2,glm3))

================================================================
                           Model 1      Model 2      Model 3    
----------------------------------------------------------------
(Intercept)                  -0.15        -2.26 ***    -2.28 ***
                             (0.12)       (0.39)       (0.39)   
benefitsNo                    0.43 *       0.42 *       0.43 *  
                             (0.17)       (0.20)       (0.20)   
benefitsYes                   0.99 ***     1.04 ***     1.05 ***
                             (0.17)       (0.19)       (0.20)   
Gender1                       0.95 ***     0.81 ***     1.01 ***
                             (0.19)       (0.21)       (0.28)   
family_historyYes                          1.19 ***     1.27 ***
                                          (0.16)       (0.18)   
work_interfereYes                          1.66 ***     1.65 ***
                                          (0.16)       (0.16)   
Age                                        0.02 *       0.02 *  
                                          (0.01)       (0.01)   
remote_workYes                                          0.05    
                                                       (0.17)   
family_historyYes:Gender1                              -0.47    
                                                       (0.42)   
----------------------------------------------------------------
AIC                        1212.30      1005.30      1007.99    
BIC                        1231.81      1039.43      1051.88    
Log Likelihood             -602.15      -495.65      -495.00    
Deviance                   1204.30       991.30       989.99    
Num. obs.                   969          969          969       
================================================================
*** p < 0.001, ** p < 0.01, * p < 0.05

To clarify, here are some brief explanations of the variables I chose: family_history-Do you have a family history of mental illness? (yes/no) treatment-Have you sought treatment for a mental health condition? (yes=1/no=0) work_interfere-If you have a mental health condition, do you feel that it interferes with your work? (yes/no) benefits-Does your employer provide mental health benefits?(yes/no/don’t know)

Zelig with model 2:

z.mental_health <- zelig(treatment ~ family_history+Gender+work_interfere+benefits+Age, model = "logit", data = new_survey, cite = FALSE)
summary(z.mental_health)
Model: 

Call:
z5$zelig(formula = treatment ~ family_history + Gender + work_interfere + 
    benefits + Age, data = new_survey)

Deviance Residuals: 
    Min       1Q   Median       3Q      Max  
-2.4653  -0.7623   0.4436   0.7586   1.9641  

Coefficients:
                  Estimate Std. Error z value Pr(>|z|)
(Intercept)       -2.26273    0.38933  -5.812 6.18e-09
family_historyYes  1.18541    0.16474   7.196 6.21e-13
Gender1            0.80972    0.21248   3.811 0.000138
work_interfereYes  1.66258    0.16045  10.362  < 2e-16
benefitsNo         0.41689    0.19546   2.133 0.032932
benefitsYes        1.03698    0.19455   5.330 9.82e-08
Age                0.02231    0.01069   2.088 0.036795

(Dispersion parameter for binomial family taken to be 1)

    Null deviance: 1276.5  on 968  degrees of freedom
Residual deviance:  991.3  on 962  degrees of freedom
AIC: 1005.3

Number of Fisher Scoring iterations: 4

Next step: Use 'setx' method

Family history effect:

Those with a family history of mental illness have about a .15 higher chance of having sought out mental health treatment than those who do not have a family history of mental illness, on average.

z.mental_health <- zelig(treatment ~ family_history+Gender+work_interfere+benefits+Age, model = "logit", data = new_survey, cite = FALSE)
z.mental_health$setx(family_history="No")
z.mental_health$setx1(family_history="Yes")
z.mental_health$sim()
fd1 <- z.mental_health$get_qi(xvalue="x1", qi="fd")
summary(fd1)
       V1         
 Min.   :0.07629  
 1st Qu.:0.13266  
 Median :0.15052  
 Mean   :0.15168  
 3rd Qu.:0.17077  
 Max.   :0.24441  
z.mental_health$sim()
z.mental_health$graph()

Work Interference Effect:

Those who believe that their mental illness interferes with their work have about a .38 higher chance of having sought out mental health treatment than those who do not believe their mental illness interferes with their work, on average.

z.mental_health <- zelig(treatment ~ family_history+Gender+work_interfere+benefits+Age, model = "logit", data = new_survey, cite = FALSE)
z.mental_health$setx(work_interfere="No")
z.mental_health$setx1(work_interfere="Yes")
z.mental_health$sim()
fd2 <- z.mental_health$get_qi(xvalue="x1", qi="fd")
summary(fd2)
       V1        
 Min.   :0.2894  
 1st Qu.:0.3609  
 Median :0.3846  
 Mean   :0.3831  
 3rd Qu.:0.4055  
 Max.   :0.5044  
z.mental_health$sim()
z.mental_health$graph()

Gender effect:

Females(1) have about a .11 higher chance of having sought out mental health treatment than males(0), on average.

z.mental_health <- zelig(treatment ~ family_history+Gender+work_interfere+benefits+Age, model = "logit", data = new_survey, cite = FALSE)
z.mental_health$setx(Gender=0)
z.mental_health$setx1(Gender=1)
z.mental_health$sim()
fd3 <- z.mental_health$get_qi(xvalue="x1", qi="fd")
summary(fd3)
       V1           
 Min.   :-0.008041  
 1st Qu.: 0.095241  
 Median : 0.115085  
 Mean   : 0.114757  
 3rd Qu.: 0.134881  
 Max.   : 0.213362  
z.mental_health$sim()
z.mental_health$graph()

Benefits Effect: Yes Vs No

Those who have mental healthcare coverage through their employer have about a .13 higher chance than those with no healthcare coverage through their employer for having sought out mental health treatment.

z.mental_health <- zelig(treatment ~ family_history+Gender+work_interfere+benefits+Age, model = "logit", data = new_survey, cite = FALSE)
z.mental_health$setx(benefits="No")
z.mental_health$setx1(benefits="Yes")
z.mental_health$sim()
fd4 <- z.mental_health$get_qi(xvalue="x1", qi="fd")
summary(fd4)
       V1           
 Min.   :-0.002983  
 1st Qu.: 0.100418  
 Median : 0.128722  
 Mean   : 0.128130  
 3rd Qu.: 0.154615  
 Max.   : 0.278853  
z.mental_health$sim()
z.mental_health$graph()

Benefits Effect: No Vs Don’t know:

Those who do not have healthcare coverage have about a .10 higher chance than those who don’t know if they have mental healthcare coverage through their employer for having sought out mental health treatment.

z.mental_health <- zelig(treatment ~ family_history+Gender+work_interfere+benefits+Age, model = "logit", data = new_survey, cite = FALSE)
z.mental_health$setx(benefits="Don't know")
z.mental_health$setx1(benefits="No")
z.mental_health$sim()
fd5 <- z.mental_health$get_qi(xvalue="x1", qi="fd")
summary(fd5)
       V1          
 Min.   :-0.04287  
 1st Qu.: 0.06867  
 Median : 0.09935  
 Mean   : 0.10032  
 3rd Qu.: 0.12936  
 Max.   : 0.26553  
z.mental_health$sim()
z.mental_health$graph()

Age Effect:

The expected value of having sought out mental health treatment increases as age increases.

z.mental_health <- zelig(treatment ~ family_history+Gender+work_interfere+benefits+Age, model = "logit", data = new_survey, cite = FALSE)
z.age_range <- min(new_survey$Age):max(new_survey$Age)
z.mental_health$setrange(Age=z.age_range)
z.mental_health$sim()
z.mental_health$graph()

Summary/Conclusion:

To conclude, I found the following from my analysis: Family history - People are more likely to seek out mental health treatment if there’s a family history of mental illness than if there’s no family history of mental illness. Work Interference - People are more likely to seek out mental health treatment if the mental health condition interferes with their work than if it doesn’t interfere with their work. Gender - Females are more likely to seek out mental health treatment than males. Benefits: Yes Vs No - People are more likely to seek out mental health treatment if they have mental health coverage through their employer than if they don’t have coverage. Benefits: No Vs Don’t know - People are more likely to seek out mental health treatment if they do not have mental health coverage through their employer than if they do not know if they have mental health coverage through their employer. This susprised me the most but it makes sense, since if someone knows they are not covered for mental health they are probably looking for treatment. If someone does not know if they have mental health coverage, they are probably not going to seek treatment. Age - Older people are more likely to seek out mental health treatment than younger people.

LS0tDQp0aXRsZTogIkhXIDYiDQphdXRob3I6ICJBYmlnYWlsIFN0cmljayINCm91dHB1dDogaHRtbF9ub3RlYm9vaw0KLS0tDQoNCiNQYXJ0IDE6IFVzaW5nIFplbGlnIDUgZnJvbSBzbGlkZXMgNS4yIHRvIDUuMTgNCkkgd2lsbCBiZSByZWRvaW5nIHRoZSBjbGFzc3dvcmsgZnJvbSBzbGlkZXMgNS4yIHRvIDUuMTggYXMgWmVsaWcgNSBiZWxvdzoNCg0KIyMjSW50aWF0aW5nIFplbGlnIDUgd2l0aCBUaXRhbmljIGRhdGEgYW5kIHJhZGlhbnQuZGF0YSwgcmVjb2Rpbmcgc3Vydml2ZWQgYXMgYSBiaW5hcnkgdmFyaWFibGU6ICANCmBgYHtyfQ0KbGlicmFyeShyYWRpYW50LmRhdGEpDQpsaWJyYXJ5KFplbGlnKQ0KZGF0YSh0aXRhbmljKQ0KdGl0YW5pYyA8LSB0aXRhbmljICU+JQ0KICBtdXRhdGUoc3VydiA9IGFzLmludGVnZXIoc3Vydml2ZWQpKSAlPiUgDQogIG11dGF0ZShzdXJ2aXZhbCA9IHNqbWlzYzo6cmVjKHN1cnYsIHJlYyA9ICIyPTA7IDE9MSIpKSAlPiUgDQogIHNlbGVjdChwY2xhc3MsIHN1cnZpdmVkLCBzdXJ2aXZhbCwgZXZlcnl0aGluZygpKQ0KaGVhZCh0aXRhbmljKQ0KYGBgDQoNCiMjI0ludGVyYWN0aW9uIG1vZGVsIHVzaW5nIFplbGlnICg1LjIpOg0KYGBge3J9DQp6NSA8LSB6bG9naXQkbmV3KCkNCno1JHplbGlnKHN1cnZpdmFsIH4gYWdlICsgc2V4KnBjbGFzcytmYXJlLCBkYXRhID0gdGl0YW5pYykNCnN1bW1hcnkoejUpDQpgYGANCg0KIyMjQWdlIGVmZmVjdCAoNS4zLTUuNCk6DQpBcyBhZ2UgZ29lcyB1cCAoZnJvbSBpbmZhbnQgdG8gZWxkZXIpLCB0aGUgY2hhbmNlcyBvZiBzdXJ2aXZpbmcgdGhlIFRpdGFuaWMgZ29lcyBkb3duLCB3aGVyZSB0aGUgbWVkaWFuIHN1cnZpdmFsIHJhdGUgaXMgYXJvdW5kIC4zNSBmb3IgaW5mYW50cy4gVGhlcmUgaXMgYSBuZWdhdGl2ZSBjb3JyZWxhdGlvbi4gSG93ZXZlciwgdGhlIHVuY2VydGFpbnR5IHRvIHN1cnZpdmUgZm9yIGluZmFudHMveW91bmcgcGVvcGxlIGlzIG11Y2ggaGlnaGVyIHRoYW4gY2VydGFpbnR5IG9mIHN1cnZpdmFsIHdoZW4geW91J3JlIDgwIChhIGhpZ2hlciBnYXAgaXMgbW9yZSB1bmNlcnRhaW50eSkuIA0KYGBge3J9DQp6NSA8LSB6bG9naXQkbmV3KCkNCno1JHplbGlnKHN1cnZpdmFsIH4gYWdlICsgc2V4KnBjbGFzcytmYXJlLCBkYXRhID0gdGl0YW5pYykNCmEucmFuZ2UgPSBtaW4odGl0YW5pYyRhZ2UpOm1heCh0aXRhbmljJGFnZSkNCno1JHNldHJhbmdlKGFnZT1hLnJhbmdlKQ0KejUkc2ltKCkNCno1JGdyYXBoKCkNCmBgYA0KDQoNCiMjI0ZhcmUgRWZmZWN0ICg1LjUtNS42KToNCkFzIGZhcmUgZ29lcyB1cCwgY2hhbmNlcyBvZiBzdXJ2aXZpbmcgdGhlIFRpdGFuaWMgcHJldHR5IG11Y2ggc3RheXMgdGhlIHNhbWUuIFRoZSBleHBlY3RlZCB2YWx1ZSBvZiBzdXJ2aXZhbCByZW1haW5zIHByZXR0eSBjb25zdGFudCB3aXRoIHJlc3BlY3QgdG8gZmFyZS4gRmFyZSBwcmljZSBkaWQgbm90IGhhdmUgbXVjaCB0b28gbXVjaCBpbmZsdWVuY2Ugb24gb25lJ3MgY2hhbmNlcyBvZiBzdXJ2aXZpbmcgdGhlIFRpdGFuaWMuDQoNCmBgYHtyfQ0KejUgPC0gemxvZ2l0JG5ldygpDQp6NSR6ZWxpZyhzdXJ2aXZhbCB+IGFnZSArIHNleCpwY2xhc3MrZmFyZSwgZGF0YSA9IHRpdGFuaWMpDQpmLnJhbmdlID0gbWluKHRpdGFuaWMkZmFyZSk6bWF4KHRpdGFuaWMkZmFyZSkNCno1JHNldHJhbmdlKGZhcmU9Zi5yYW5nZSkNCno1JHNpbSgpDQp6NSRncmFwaCgpDQpgYGANCg0KDQojIyMgU2V4IERpZmZlcmVuY2UgKDUuNy01LjkpOg0KVGhlIGZpcnN0IGRpZmZlcmVuY2Ugc2hvd3MgdGhhdCBmZW1hbGVzJyBleHBlY3RlZCB2YWx1ZSBpcyBhYm91dCAuMjYgaGlnaGVyIHRoYW4gbWFsZXMsIG9uIGF2ZXJhZ2UuIEZlbWFsZXMgY2FuIGhhdmUgYW4gZXhwZWN0ZWQgdmFsdWUgb2YgYWJvdXQgLjM5IGFuZCBtYWxlcyBjYW4gaGF2ZSBhbiBleHBlY3RlZCB2YWx1ZSBvZiBhYm91dCAuMTMuIFRoaXMgc2hvd3MgdGhhdCBmZW1hbGVzIGhhdmUgYSBiZXR0ZXIgY2hhbmNlIG9mIHN1cnZpdmluZyB0aGUgVGl0YW5pYyB0aGFuIG1hbGVzLiANCmBgYHtyfQ0KejUgPC0gemxvZ2l0JG5ldygpDQp6NSR6ZWxpZyhzdXJ2aXZhbCB+IGFnZSArIHNleCpwY2xhc3MrZmFyZSwgZGF0YSA9IHRpdGFuaWMpDQp6NSRzZXR4KHNleCA9ICJtYWxlIikNCno1JHNldHgxKHNleCA9ICJmZW1hbGUiKQ0KejUkc2ltKCkNCno1JGdyYXBoKCkNCmZkIDwtIHo1JGdldF9xaSh4dmFsdWU9IngxIiwgcWk9ImZkIikNCnN1bW1hcnkoZmQpDQpgYGANCg0KIyMjSG93IHRvIHRlc3QgdGhlIGNsYXNzIHZhcmlhdGlvbnMgaW4gc2V4IGRpZmZlcmVuY2UgdXNpbmcgWmVsaWc/KDUuMTEtNS4xNCk6DQoxc3QgY2xhc3M6IFRoZSBkaWZmZXJlbmNlIGluIGV4cGVjdGVkIHZhbHVlIG9mIHN1cnZpdmFsIGlzIGFib3V0IC41MiBoaWdoZXIgZm9yIGZlbWFsZXMgdGhhbiBtYWxlcy4NCjJuZCBjbGFzczogVGhlIGRpZmZlcmVuY2UgaW4gZXhwZWN0ZWQgdmFsdWUgb2Ygc3Vydml2YWwgaXMgYWJvdXQgLjc3IGhpZ2hlciBmb3IgZmVtYWxlcyB0aGFuIG1hbGVzLiBUaGUgbWFsZSBzdXJ2aXZhbCByYXRlIGRlY3JlYXNlZCBieSBhIGxvdCAoZnJvbSBhcm91bmQgLjQ1IGluIDFzdCBjbGFzcyB0byBhcm91bmQgLjEzIGluIDJuZCBjbGFzcykuDQozcmQgY2xhc3M6IDNyZCBjbGFzcyBoYWQgdGhlIGxvd2VzdCBzdXJ2aXZhbCByYXRlIG91dCBvZiBhbGwgdGhlIGNsYXNzZXMuIFRoZSBkaWZmZXJlbmNlIGluIGV4cGVjdGVkIHZhbHVlIG9mIHN1cnZpdmFsIGlzIGFib3V0IC4yNSBoaWdoZXIgZm9yIGZlbWFsZXMgdGhhbiBtYWxlcy4NCmBgYHtyfQ0KI0ZpcnN0IGNsYXNzDQp6NWZjIDwtIHpsb2dpdCRuZXcoKQ0KejVmYyR6ZWxpZyhzdXJ2aXZhbCB+IGFnZSArc2V4KnBjbGFzcyArIGZhcmUsIGRhdGE9dGl0YW5pYykNCno1ZmMkc2V0eChzZXg9Im1hbGUiLCBwY2xhc3M9IjFzdCIpDQp6NWZjJHNldHgxKHNleD0iZmVtYWxlIiwgcGNsYXNzPSIxc3QiKQ0KejVmYyRzaW0oKQ0KejVmYyRncmFwaCgpDQojU2Vjb25kIGNsYXNzDQp6NXNjIDwtIHpsb2dpdCRuZXcoKQ0KejVzYyR6ZWxpZyhzdXJ2aXZhbCB+IGFnZSArc2V4KnBjbGFzcyArIGZhcmUsIGRhdGE9dGl0YW5pYykNCno1c2Mkc2V0eChzZXg9Im1hbGUiLCBwY2xhc3M9IjJuZCIpDQp6NXNjJHNldHgxKHNleD0iZmVtYWxlIiwgcGNsYXNzPSIybmQiKQ0KejVzYyRzaW0oKQ0KejVzYyRncmFwaCgpDQojVGhpcmQgY2xhc3MNCno1dGMgPC0gemxvZ2l0JG5ldygpDQp6NXRjJHplbGlnKHN1cnZpdmFsIH4gYWdlICtzZXgqcGNsYXNzICsgZmFyZSwgZGF0YT10aXRhbmljKQ0KejV0YyRzZXR4KHNleD0ibWFsZSIsIHBjbGFzcz0iM3JkIikNCno1dGMkc2V0eDEoc2V4PSJmZW1hbGUiLCBwY2xhc3M9IjNyZCIpDQp6NXRjJHNpbSgpDQp6NXRjJGdyYXBoKCkNCmBgYA0KDQojIyNQdXR0aW5nIHRoZW0gaW4gb25lIHBsYWNlIC0gZ2VuZGVyIGRpZmZlcmVuY2VzIGluIHN1cnZpdmFsIGFtb25nIDMgY2xhc3NlcyAoNS4xNSk6DQpWMT1HZW5kZXIgZGlmZmVyZW5jZSBzdXJ2aXZhbCByYXRlIGluIDFzdCBjbGFzcw0KVjI9R2VuZGVyIGRpZmZlcmVuY2Ugc3Vydml2YWwgcmF0ZSBpbiAybmQgY2xhc3MNClYzPUdlbmRlciBkaWZmZXJlbmNlIHN1cnZpdmFsIHJhdGUgaW4gM3JkIGNsYXNzDQpgYGB7cn0NCmQxIDwtIHo1ZmMkZ2V0X3FpKHh2YWx1ZT0ieDEiLCBxaT0iZmQiKQ0KZDIgPC0gejVzYyRnZXRfcWkoeHZhbHVlPSJ4MSIsIHFpPSJmZCIpDQpkMyA8LSB6NXRjJGdldF9xaSh4dmFsdWU9IngxIiwgcWk9ImZkIikNCg0KZGZkIDwtIGFzLmRhdGEuZnJhbWUoY2JpbmQoZDEsIGQyLCBkMykpDQpoZWFkKGRmZCkNCmBgYA0KIyMjNS4xNjoNCmBgYHtyfQ0KbGlicmFyeSh0aWR5cikNCg0KdGlkZCA8LSBkZmQgJT4lIA0KICBnYXRoZXIoY2xhc3MsIHNpbXYsIDE6MykNCmhlYWQodGlkZCkNCmBgYA0KIyMjVXNpbmcgZ3JvdXBfYnkgKDUuMTcpOg0KQW1vbmcgMXN0IGNsYXNzLCB3b21lbiBoYXZlIC41MiBjaGFuY2UgaGlnaGVyIHRoYW4gbWVuIHRvIHN1cnZpdmUuIDNyZCBjbGFzcyAoVjMpIGlzIC4yNShsb3dlc3QpLCAybmQgY2xhc3MgKFYyKSBpcyBsYXJnZXN0IGRpZmZlcmVuY2UgKGFib3V0IC43NSkuDQpgYGB7cn0NCmxpYnJhcnkoZHBseXIpDQoNCnRpZGQgJT4lIA0KICBncm91cF9ieShjbGFzcykgJT4lIA0KICBzdW1tYXJpc2UobWVhbiA9IG1lYW4oc2ltdiksIHNkID0gc2Qoc2ltdikpDQpgYGANCg0KIyMjNS4xOA0KVmlzdWFsaXphdGlvbiBvZiB0aGUgZ2VuZGVyIGZpcnN0IGRpZmZlcmVuY2VzIGJ5IGNsYXNzLiBBcyBleHBlY3RlZCwgdGhlIHNtYWxsZXN0IGZpcnN0IGRpZmZlcmVuY2UgZXhwZWN0ZWQgdmFsdWUgYmV0d2VlbiBmZW1hbGVzIGFuZCBtYWxlcyBpcyBpbiAzcmQgY2xhc3MgYW5kIHRoZSBsYXJnZXN0IGlzIGluIDJuZCBjbGFzcy4NCmBgYHtyfQ0KbGlicmFyeShnZ3Bsb3QyKQ0KDQpnZ3Bsb3QodGlkZCwgYWVzKHNpbXYpKSArIGdlb21faGlzdG9ncmFtKCkgKyBmYWNldF9ncmlkKH5jbGFzcykNCmBgYA0KDQojUGFydCAyOiBaZWxpZyB3aXRoIE5ldyBkYXRhc2V0DQpJIGZvdW5kIHRoZSBkYXRhc2V0IEkgd2lsbCBiZSB1c2luZyBmcm9tIGthZ2dsZSBhYm91dCBtZW50YWwgaGVhbHRoIGluIHRoZSB3b3JrcGxhY2UgaHR0cHM6Ly93d3cua2FnZ2xlLmNvbS9vc21pL21lbnRhbC1oZWFsdGgtaW4tdGVjaC1zdXJ2ZXkuIA0KVGFraW5nIGNhcmUgb2Ygb25lJ3MgbWVudGFsIGhlYWx0aCBpcyBiZWNvbWluZyBzb2NpYWxseSBub3JtYWxpemVkLiBJIHdhbnQgdG8gbG9vayBhdCB2YXJpYWJsZXMgc3VjaCBhcyBrbm93bGVkZ2Ugb2YgZmFtaWx5IGhpc3Rvcnkgb2YgbWVudGFsIGlsbG5lc3MoZmFtaWx5X2hpc3RvcnkpLCBpZiB0aGUgbWVudGFsIGNvbmRpdGlvbiB3b3VsZCBpbnRlcmZlcmUgd2l0aCB3b3JrKHdvcmtfaW50ZXJmZXJlKSwgZ2VuZGVyLCBhZ2UsIHdvcmtpbmcgcmVtb3RlbHkgKHJlbW90ZV93b3JrKSBhbmQgaGVhbHRoY2FyZSBiZW5lZml0cyBmcm9tIGEgam9iLCB0byBzZWUgaWYgdGhleSBhcmUgZmFjdG9ycyBmb3IgdGhvc2Ugd2hvIHNvdWdodCBvdXQgbWVudGFsIGhlYWx0aCB0cmVhdG1lbnRzKHRyZWF0bWVudCAtIGJpbmFyeSBkZXBlbmRlbnQgdmFpcmFibGUpLiANCmBgYHtyfQ0KbGlicmFyeSh0ZXhyZWcpDQpsaWJyYXJ5KHRpZHlyKQ0KbGlicmFyeShsaXN0KQ0KbGlicmFyeShjb3JwY29yKQ0KbGlicmFyeSh0aWR5dmVyc2UpDQpsaWJyYXJ5KGtuaXRyKQ0KbGlicmFyeSAoWmVsaWcpDQpsaWJyYXJ5KHJlYWRyKQ0KbGlicmFyeShyZWFkcikNCmxpYnJhcnkoZHBseXIpDQpsaWJyYXJ5KHNqbWlzYykNCnN1cnZleSA8LSByZWFkX2NzdigiQzovVXNlcnMvYWJieXMvRG93bmxvYWRzL3N1cnZleS5jc3YiKQ0KaGVhZChzdXJ2ZXkpDQpgYGANCg0KIyMjQ2xlYW5pbmcgdXAgdGhlIGRhdGE6DQpgYGB7cn0NCm5ld19zdXJ2ZXk8LXN1cnZleSAlPiUNCiAgICBmaWx0ZXIoIWlzLm5hKGJlbmVmaXRzKSwNCiAgICAgICAgICFpcy5uYSh0cmVhdG1lbnQpLA0KICAgICAgICAgIWlzLm5hKHdvcmtfaW50ZXJmZXJlKSwNCiAgICAgICAgICFpcy5uYShmYW1pbHlfaGlzdG9yeSksDQogICAgICAgICAhaXMubmEoQWdlKSwNCiAgICAgICAgICFpcy5uYShyZW1vdGVfd29yaykNCiAgICAgICAgKSU+JQ0KDQogIG11dGF0ZSh0cmVhdG1lbnQ9cmVjKHRyZWF0bWVudCxyZWM9Ik5vPTA7WWVzPTEiKSx3b3JrX2ludGVyZmVyZT1yZWMod29ya19pbnRlcmZlcmUscmVjPSJOZXZlcixSYXJlbHk9Tm87U29tZXRpbWVzLE9mdGVuPVllcyIpLEdlbmRlcj1yZWMoR2VuZGVyLHJlYz0iTSxNYWxlLG1hbGUsbSxNYWxlLWlzaCxDaXMgTWFsZSxNYWwsTWFrZSxHdXkgKC1pc2gpIF5fXixtYWxlIGxlYW5pbmcgYW5kcm9neW5vdXMsbXNsZSxNYWlsLE1hbHIsQ2lzIE1hbixvc3RlbnNpYmx5IG1hbGUsIHVuc3VyZSB3aGF0IHRoYXQgcmVhbGx5IG1lYW5zPTA7RmVtYWxlLGZlbWFsZSxUcmFucy1mZW1hbGUsQ2lzIEZlbWFsZSxGLGYscXVlZXIvc2hlL3RoZXksd29tYW4sY2lzLWZlbWFsZS9mZW1tZSxUcmFucyB3b21hbixGZW1hbGUgKHRyYW5zKSxGZW1hbGUgKGNpcyksV29tYW4sZmVtYWlsPTEiKSklPiUNCiAgZmlsdGVyKCFpcy5uYShHZW5kZXIpLA0KICAgICAgICAgQWdlPDEwMCwgQWdlPjApJT4lDQogIG11dGF0ZSh3b3JrX2ludGVyZmVyZT1mYWN0b3Iod29ya19pbnRlcmZlcmUpLGZhbWlseV9oaXN0b3J5ID0gZmFjdG9yKGZhbWlseV9oaXN0b3J5KSwgYmVuZWZpdHMgPSBmYWN0b3IoYmVuZWZpdHMpLCBHZW5kZXI9ZmFjdG9yKEdlbmRlcikpDQoNCmhlYWQobmV3X3N1cnZleSkNCmRpbShuZXdfc3VydmV5KQ0KYGBgDQoNCiMjI0Nob3NpbmcgdGhlIGJlc3QgbW9kZWwgZm9yIHplbGlnDQpUaGUgYmVzdCBtb2RlbCBpcyBtb2RlbCAyLCBzaW5jZSBtb2RlbCAyIGhhcyB0aGUgbG93ZXN0IGFpYyBhbmQgYmljLiANCmBgYHtyfQ0KZ2xtMT1nbG0odHJlYXRtZW50fmJlbmVmaXRzK0dlbmRlcixmYW1pbHk9ImJpbm9taWFsIixkYXRhPW5ld19zdXJ2ZXkpDQpnbG0yPWdsbSh0cmVhdG1lbnR+ZmFtaWx5X2hpc3RvcnkrR2VuZGVyK3dvcmtfaW50ZXJmZXJlK2JlbmVmaXRzK0FnZSxmYW1pbHk9ImJpbm9taWFsIixkYXRhPW5ld19zdXJ2ZXkpDQpnbG0zPWdsbSh0cmVhdG1lbnR+ZmFtaWx5X2hpc3RvcnkqR2VuZGVyK3dvcmtfaW50ZXJmZXJlK2JlbmVmaXRzK0FnZStyZW1vdGVfd29yayxmYW1pbHk9ImJpbm9taWFsIixkYXRhPW5ld19zdXJ2ZXkpDQp0ZXhyZWc6OnNjcmVlbnJlZyhsaXN0KGdsbTEsZ2xtMixnbG0zKSkNCmBgYA0KVG8gY2xhcmlmeSwgaGVyZSBhcmUgc29tZSBicmllZiBleHBsYW5hdGlvbnMgb2YgdGhlIHZhcmlhYmxlcyBJIGNob3NlOg0KZmFtaWx5X2hpc3RvcnktRG8geW91IGhhdmUgYSBmYW1pbHkgaGlzdG9yeSBvZiBtZW50YWwgaWxsbmVzcz8gKHllcy9ubykNCnRyZWF0bWVudC1IYXZlIHlvdSBzb3VnaHQgdHJlYXRtZW50IGZvciBhIG1lbnRhbCBoZWFsdGggY29uZGl0aW9uPyAoeWVzPTEvbm89MCkNCndvcmtfaW50ZXJmZXJlLUlmIHlvdSBoYXZlIGEgbWVudGFsIGhlYWx0aCBjb25kaXRpb24sIGRvIHlvdSBmZWVsIHRoYXQgaXQgaW50ZXJmZXJlcyB3aXRoIHlvdXIgd29yaz8gKHllcy9ubykNCmJlbmVmaXRzLURvZXMgeW91ciBlbXBsb3llciBwcm92aWRlIG1lbnRhbCBoZWFsdGggYmVuZWZpdHM/KHllcy9uby9kb24ndCBrbm93KQ0KDQojIyNaZWxpZyB3aXRoIG1vZGVsIDI6DQpgYGB7cn0NCnoubWVudGFsX2hlYWx0aCA8LSB6ZWxpZyh0cmVhdG1lbnQgfiBmYW1pbHlfaGlzdG9yeStHZW5kZXIrd29ya19pbnRlcmZlcmUrYmVuZWZpdHMrQWdlLCBtb2RlbCA9ICJsb2dpdCIsIGRhdGEgPSBuZXdfc3VydmV5LCBjaXRlID0gRkFMU0UpDQpzdW1tYXJ5KHoubWVudGFsX2hlYWx0aCkNCmBgYA0KIyMjRmFtaWx5IGhpc3RvcnkgZWZmZWN0Og0KVGhvc2Ugd2l0aCBhIGZhbWlseSBoaXN0b3J5IG9mIG1lbnRhbCBpbGxuZXNzIGhhdmUgYWJvdXQgYSAuMTUgaGlnaGVyIGNoYW5jZSBvZiBoYXZpbmcgc291Z2h0IG91dCBtZW50YWwgaGVhbHRoIHRyZWF0bWVudCB0aGFuIHRob3NlIHdobyBkbyBub3QgaGF2ZSBhIGZhbWlseSBoaXN0b3J5IG9mIG1lbnRhbCBpbGxuZXNzLCBvbiBhdmVyYWdlLg0KYGBge3J9DQp6Lm1lbnRhbF9oZWFsdGggPC0gemVsaWcodHJlYXRtZW50IH4gZmFtaWx5X2hpc3RvcnkrR2VuZGVyK3dvcmtfaW50ZXJmZXJlK2JlbmVmaXRzK0FnZSwgbW9kZWwgPSAibG9naXQiLCBkYXRhID0gbmV3X3N1cnZleSwgY2l0ZSA9IEZBTFNFKQ0Kei5tZW50YWxfaGVhbHRoJHNldHgoZmFtaWx5X2hpc3Rvcnk9Ik5vIikNCnoubWVudGFsX2hlYWx0aCRzZXR4MShmYW1pbHlfaGlzdG9yeT0iWWVzIikNCnoubWVudGFsX2hlYWx0aCRzaW0oKQ0KZmQxIDwtIHoubWVudGFsX2hlYWx0aCRnZXRfcWkoeHZhbHVlPSJ4MSIsIHFpPSJmZCIpDQpzdW1tYXJ5KGZkMSkNCnoubWVudGFsX2hlYWx0aCRzaW0oKQ0Kei5tZW50YWxfaGVhbHRoJGdyYXBoKCkNCmBgYA0KIyMjV29yayBJbnRlcmZlcmVuY2UgRWZmZWN0Og0KVGhvc2Ugd2hvIGJlbGlldmUgdGhhdCB0aGVpciBtZW50YWwgaWxsbmVzcyBpbnRlcmZlcmVzIHdpdGggdGhlaXIgd29yayBoYXZlIGFib3V0IGEgLjM4IGhpZ2hlciBjaGFuY2Ugb2YgaGF2aW5nIHNvdWdodCBvdXQgbWVudGFsIGhlYWx0aCB0cmVhdG1lbnQgdGhhbiB0aG9zZSB3aG8gZG8gbm90IGJlbGlldmUgdGhlaXIgbWVudGFsIGlsbG5lc3MgaW50ZXJmZXJlcyB3aXRoIHRoZWlyIHdvcmssIG9uIGF2ZXJhZ2UuDQoNCmBgYHtyfQ0Kei5tZW50YWxfaGVhbHRoIDwtIHplbGlnKHRyZWF0bWVudCB+IGZhbWlseV9oaXN0b3J5K0dlbmRlcit3b3JrX2ludGVyZmVyZStiZW5lZml0cytBZ2UsIG1vZGVsID0gImxvZ2l0IiwgZGF0YSA9IG5ld19zdXJ2ZXksIGNpdGUgPSBGQUxTRSkNCnoubWVudGFsX2hlYWx0aCRzZXR4KHdvcmtfaW50ZXJmZXJlPSJObyIpDQp6Lm1lbnRhbF9oZWFsdGgkc2V0eDEod29ya19pbnRlcmZlcmU9IlllcyIpDQp6Lm1lbnRhbF9oZWFsdGgkc2ltKCkNCmZkMiA8LSB6Lm1lbnRhbF9oZWFsdGgkZ2V0X3FpKHh2YWx1ZT0ieDEiLCBxaT0iZmQiKQ0Kc3VtbWFyeShmZDIpDQp6Lm1lbnRhbF9oZWFsdGgkc2ltKCkNCnoubWVudGFsX2hlYWx0aCRncmFwaCgpDQpgYGANCg0KIyMjR2VuZGVyIGVmZmVjdDoNCkZlbWFsZXMoMSkgaGF2ZSBhYm91dCBhIC4xMSBoaWdoZXIgY2hhbmNlIG9mIGhhdmluZyBzb3VnaHQgb3V0IG1lbnRhbCBoZWFsdGggdHJlYXRtZW50IHRoYW4gbWFsZXMoMCksIG9uIGF2ZXJhZ2UuDQpgYGB7cn0NCnoubWVudGFsX2hlYWx0aCA8LSB6ZWxpZyh0cmVhdG1lbnQgfiBmYW1pbHlfaGlzdG9yeStHZW5kZXIrd29ya19pbnRlcmZlcmUrYmVuZWZpdHMrQWdlLCBtb2RlbCA9ICJsb2dpdCIsIGRhdGEgPSBuZXdfc3VydmV5LCBjaXRlID0gRkFMU0UpDQp6Lm1lbnRhbF9oZWFsdGgkc2V0eChHZW5kZXI9MCkNCnoubWVudGFsX2hlYWx0aCRzZXR4MShHZW5kZXI9MSkNCnoubWVudGFsX2hlYWx0aCRzaW0oKQ0KZmQzIDwtIHoubWVudGFsX2hlYWx0aCRnZXRfcWkoeHZhbHVlPSJ4MSIsIHFpPSJmZCIpDQpzdW1tYXJ5KGZkMykNCnoubWVudGFsX2hlYWx0aCRzaW0oKQ0Kei5tZW50YWxfaGVhbHRoJGdyYXBoKCkNCmBgYA0KIyMjQmVuZWZpdHMgRWZmZWN0OiBZZXMgVnMgTm8NClRob3NlIHdobyBoYXZlIG1lbnRhbCBoZWFsdGhjYXJlIGNvdmVyYWdlIHRocm91Z2ggdGhlaXIgZW1wbG95ZXIgaGF2ZSBhYm91dCBhIC4xMyBoaWdoZXIgY2hhbmNlIHRoYW4gdGhvc2Ugd2l0aCBubyBoZWFsdGhjYXJlIGNvdmVyYWdlIHRocm91Z2ggdGhlaXIgZW1wbG95ZXIgZm9yIGhhdmluZyBzb3VnaHQgb3V0IG1lbnRhbCBoZWFsdGggdHJlYXRtZW50LiANCmBgYHtyfQ0Kei5tZW50YWxfaGVhbHRoIDwtIHplbGlnKHRyZWF0bWVudCB+IGZhbWlseV9oaXN0b3J5K0dlbmRlcit3b3JrX2ludGVyZmVyZStiZW5lZml0cytBZ2UsIG1vZGVsID0gImxvZ2l0IiwgZGF0YSA9IG5ld19zdXJ2ZXksIGNpdGUgPSBGQUxTRSkNCnoubWVudGFsX2hlYWx0aCRzZXR4KGJlbmVmaXRzPSJObyIpDQp6Lm1lbnRhbF9oZWFsdGgkc2V0eDEoYmVuZWZpdHM9IlllcyIpDQp6Lm1lbnRhbF9oZWFsdGgkc2ltKCkNCmZkNCA8LSB6Lm1lbnRhbF9oZWFsdGgkZ2V0X3FpKHh2YWx1ZT0ieDEiLCBxaT0iZmQiKQ0Kc3VtbWFyeShmZDQpDQp6Lm1lbnRhbF9oZWFsdGgkc2ltKCkNCnoubWVudGFsX2hlYWx0aCRncmFwaCgpDQpgYGANCiMjI0JlbmVmaXRzIEVmZmVjdDogTm8gVnMgRG9uJ3Qga25vdzoNClRob3NlIHdobyBkbyBub3QgaGF2ZSBoZWFsdGhjYXJlIGNvdmVyYWdlIGhhdmUgYWJvdXQgYSAuMTAgaGlnaGVyIGNoYW5jZSB0aGFuIHRob3NlIHdobyBkb24ndCBrbm93IGlmIHRoZXkgaGF2ZSBtZW50YWwgaGVhbHRoY2FyZSBjb3ZlcmFnZSB0aHJvdWdoIHRoZWlyIGVtcGxveWVyIGZvciBoYXZpbmcgc291Z2h0IG91dCBtZW50YWwgaGVhbHRoIHRyZWF0bWVudC4gDQpgYGB7cn0NCnoubWVudGFsX2hlYWx0aCA8LSB6ZWxpZyh0cmVhdG1lbnQgfiBmYW1pbHlfaGlzdG9yeStHZW5kZXIrd29ya19pbnRlcmZlcmUrYmVuZWZpdHMrQWdlLCBtb2RlbCA9ICJsb2dpdCIsIGRhdGEgPSBuZXdfc3VydmV5LCBjaXRlID0gRkFMU0UpDQp6Lm1lbnRhbF9oZWFsdGgkc2V0eChiZW5lZml0cz0iRG9uJ3Qga25vdyIpDQp6Lm1lbnRhbF9oZWFsdGgkc2V0eDEoYmVuZWZpdHM9Ik5vIikNCnoubWVudGFsX2hlYWx0aCRzaW0oKQ0KZmQ1IDwtIHoubWVudGFsX2hlYWx0aCRnZXRfcWkoeHZhbHVlPSJ4MSIsIHFpPSJmZCIpDQpzdW1tYXJ5KGZkNSkNCnoubWVudGFsX2hlYWx0aCRzaW0oKQ0Kei5tZW50YWxfaGVhbHRoJGdyYXBoKCkNCmBgYA0KIyMjQWdlIEVmZmVjdDoNClRoZSBleHBlY3RlZCB2YWx1ZSBvZiBoYXZpbmcgc291Z2h0IG91dCBtZW50YWwgaGVhbHRoIHRyZWF0bWVudCBpbmNyZWFzZXMgYXMgYWdlIGluY3JlYXNlcy4NCmBgYHtyfQ0Kei5tZW50YWxfaGVhbHRoIDwtIHplbGlnKHRyZWF0bWVudCB+IGZhbWlseV9oaXN0b3J5K0dlbmRlcit3b3JrX2ludGVyZmVyZStiZW5lZml0cytBZ2UsIG1vZGVsID0gImxvZ2l0IiwgZGF0YSA9IG5ld19zdXJ2ZXksIGNpdGUgPSBGQUxTRSkNCnouYWdlX3JhbmdlIDwtIG1pbihuZXdfc3VydmV5JEFnZSk6bWF4KG5ld19zdXJ2ZXkkQWdlKQ0Kei5tZW50YWxfaGVhbHRoJHNldHJhbmdlKEFnZT16LmFnZV9yYW5nZSkNCnoubWVudGFsX2hlYWx0aCRzaW0oKQ0Kei5tZW50YWxfaGVhbHRoJGdyYXBoKCkNCmBgYA0KIyNTdW1tYXJ5L0NvbmNsdXNpb246IA0KVG8gY29uY2x1ZGUsIEkgZm91bmQgdGhlIGZvbGxvd2luZyBmcm9tIG15IGFuYWx5c2lzOg0KRmFtaWx5IGhpc3RvcnkgLSBQZW9wbGUgYXJlIG1vcmUgbGlrZWx5IHRvIHNlZWsgb3V0IG1lbnRhbCBoZWFsdGggdHJlYXRtZW50IGlmIHRoZXJlJ3MgYSBmYW1pbHkgaGlzdG9yeSBvZiBtZW50YWwgaWxsbmVzcyB0aGFuIGlmIHRoZXJlJ3Mgbm8gZmFtaWx5IGhpc3Rvcnkgb2YgbWVudGFsIGlsbG5lc3MuDQpXb3JrIEludGVyZmVyZW5jZSAtIFBlb3BsZSBhcmUgbW9yZSBsaWtlbHkgdG8gc2VlayBvdXQgbWVudGFsIGhlYWx0aCB0cmVhdG1lbnQgaWYgdGhlIG1lbnRhbCBoZWFsdGggY29uZGl0aW9uIGludGVyZmVyZXMgd2l0aCB0aGVpciB3b3JrIHRoYW4gaWYgaXQgZG9lc24ndCBpbnRlcmZlcmUgd2l0aCB0aGVpciB3b3JrLg0KR2VuZGVyIC0gRmVtYWxlcyBhcmUgbW9yZSBsaWtlbHkgdG8gc2VlayBvdXQgbWVudGFsIGhlYWx0aCB0cmVhdG1lbnQgdGhhbiBtYWxlcy4NCkJlbmVmaXRzOiBZZXMgVnMgTm8gLSBQZW9wbGUgYXJlIG1vcmUgbGlrZWx5IHRvIHNlZWsgb3V0IG1lbnRhbCBoZWFsdGggdHJlYXRtZW50IGlmIHRoZXkgaGF2ZSBtZW50YWwgaGVhbHRoIGNvdmVyYWdlIHRocm91Z2ggdGhlaXIgZW1wbG95ZXIgdGhhbiBpZiB0aGV5IGRvbid0IGhhdmUgY292ZXJhZ2UuDQpCZW5lZml0czogTm8gVnMgRG9uJ3Qga25vdyAtIFBlb3BsZSBhcmUgbW9yZSBsaWtlbHkgdG8gc2VlayBvdXQgbWVudGFsIGhlYWx0aCB0cmVhdG1lbnQgaWYgdGhleSBkbyBub3QgaGF2ZSBtZW50YWwgaGVhbHRoIGNvdmVyYWdlIHRocm91Z2ggdGhlaXIgZW1wbG95ZXIgdGhhbiBpZiB0aGV5IGRvIG5vdCBrbm93IGlmIHRoZXkgaGF2ZSBtZW50YWwgaGVhbHRoIGNvdmVyYWdlIHRocm91Z2ggdGhlaXIgZW1wbG95ZXIuIFRoaXMgc3VzcHJpc2VkIG1lIHRoZSBtb3N0IGJ1dCBpdCBtYWtlcyBzZW5zZSwgc2luY2UgaWYgc29tZW9uZSBrbm93cyB0aGV5IGFyZSBub3QgY292ZXJlZCBmb3IgbWVudGFsIGhlYWx0aCB0aGV5IGFyZSBwcm9iYWJseSBsb29raW5nIGZvciB0cmVhdG1lbnQuIElmIHNvbWVvbmUgZG9lcyBub3Qga25vdyBpZiB0aGV5IGhhdmUgbWVudGFsIGhlYWx0aCBjb3ZlcmFnZSwgdGhleSBhcmUgcHJvYmFibHkgbm90IGdvaW5nIHRvIHNlZWsgdHJlYXRtZW50Lg0KQWdlIC0gT2xkZXIgcGVvcGxlIGFyZSBtb3JlIGxpa2VseSB0byBzZWVrIG91dCBtZW50YWwgaGVhbHRoIHRyZWF0bWVudCB0aGFuIHlvdW5nZXIgcGVvcGxlLg==