Research Question:
Is there a relationship between Sex and Survival?
- Because we have a binary outcome, we can use logistic regression.
- When we are interested in the relationship between a single X variable and Y it is referred to as a comparative, or effect size, model.
- We want to include other explanatory variables in the model in order to get the least biased estimate of the relationship between Y (Survived) and X (Sex).
Simple model:
model1 <- glm(Survived ~ Sex, family=binomial(link='logit'), data=data)
model1$coefficients
- The log-odds of Survival is -2.514 times higher for men compared to women.
- Odds-ratio: Men have 0.081 times the odds of survival (i.e. -92%) than women.
- 95% Confidence Interval for OR is
exp(b1 +/- (St.Error of b1 * 1.96)): ( 0.058 , 0.112 )
Detecting Confounding Variables
- Same principles as with linear regression.
- Does variable meet the definition of a confounder?
- Does it make sense that the variable is associated with \(x_1\) and is a predictor of \(y\) and is not on the causal pathway?
- How are these variables associated when we look at their bivariate associations?
- Is there a greater than 10% change in \(b_1\)?
Example: Is Age a confounder of Sex?
- Age is likely a predictor of Survived: children and elderly evacuated first.
- BUT Age could be on the causal pathway between Sex and Survival: e.g. young woman evacuated first?
Example: Is Pclass a confounder of Sex?
- Pclass is likely a predictor of Survived: Social status and wealth may give some advantage during evacuation.
- It wouldn’t make sense that Pclass is on the causal pathway between Sex and Survived.
- But could there be any form of association between Sex and Pclass? Working class men travelling 3rd class to emigrate to the USA for a new life?
Let’s settle on considering Pclass a confounding variable and include it in the model alongside Sex.
More analysis is needed though…
Bivariate Association Analysis
Let’s check the bivariate associations between Pclass and Sex and between Pclass and Survived to see if the theory is supported by the data.
Given that both are categorical variables we must use a Chi-square test. This test allows us to determine whether there is a statistically significant difference between the expected frequencies and the observed frequencies of the relevant contingency tables:
table(Pclass, Sex)
chisq.test(Pclass, Sex)
table(Pclass, Survived)
chisq.test(Pclass, Survived)
Interpretation of the above outputs: Given that in both cases p<0.5, Pclass is significantly associated with both Sex and Survived, thus the variable seems to meet the definition of a confounding variable.
Greater than 10% change in x1 coefficient?
- Recall that in the simple model
Survived ~ Sex, the coefficient of Sexmale was equal to -2.514.
Now let’[s addd Pclass to the model:
model2 <- glm(Survived ~ Sex + Pclass, family=binomial(link='logit'), data=data)
model2$coefficients
The coefficient of Sexmale does not change much (only 5%) which suggests that Pclass is not confounder. This contradicts the previous finding.
Is the model better when we include the confounding variable?
AIC
- AIC for model 1: 921.804
AIC for model 2: 965.929
The residual deviance of the model that includes Pclass is lower. Based on this we can reject \(H_0\) that there is no difference betwwen full and reduced model i.e. that the full model is not significantly better than the reduced model. Thus we conclude that we have evidence to support \(H_a\) that the model that includes Pclass is significantly better. This is confirmed by the ‘lrtest()’ function below:
lrtest(model1, model2)
#??lr.test
So, keep it or not? It depends…Keep Pclass for now….
Assessing Collinearity
Let’s look at adding collinear variables AgeGroup and AgeGroup2029.
We will assess which one is better by looking at AIC. Not that we don’t simply model say Survived and AgeGroup but rather look at how their respective additions to the existing model impact the results.
model3 <- glm(Survived ~ Sex + Pclass + AgeGroup, family=binomial(link='logit'), data=data)
model4 <- glm(Survived ~ Sex + Pclass + AgeGroup2029, family=binomial(link='logit'), data=data)
AIC for model with AgeGroup: 965.929 AIC for model with AgeGroup2029: 965.929
AIC is slightly lower for the model with *AgeGroup** so moving forward the model will include Sex, Pclass, AgeGroup explanatory variables.
careful, this only temporary, AgeGroup results in missing data.
Assess Interaction via Likelihood Ratio Test
If some variable does not meet the criteria of a confounder, it could still be an effect modifier! Does the effect that \(x1\) has on the odds of \(y\) depend on some other variable \(x2\)? If so then we call the variable \(x2\) an effect modifier
Thus now we try to answer the question:
Does the effect that Sex has on Survived depend on Pclass?
An interaction terms is the multiplication of two variable with each other e.g. Sex * Pclass.
We can use a Likelihood Ratio Test to compare models with and without a \(Sex \times Pclass\) interaction term.
To compare two models we use the anova() function.
model3bis <- glm(Survived ~ Sex + Pclass + AgeGroup + Sex * Pclass, family=binomial(link='logit'), data=data)
anova(model3, model3bis, test='Chisq')
We can see that the p-value is < 0.5 and we reject the null hypothesis that the residual deviance is the same for models that do and do not include the interaction term. The model that includes the interaction term IS significantly better.
This suggests that Pclass is an effect modifier. The effect of Sex on the odds of Survived varies, or differs, depending on Pclass.
There is significant interaction between Sex and Pclass.
This means that we want to report on the effect of Pclass for different Sex categories: anything we say about the effect of Sex on Survived needs to be Pclass-specific.
Can a class be both a confounder and an effect modifier??
model3bis <- glm(Survived ~ Sex + Pclass + AgeGroup + Sex * Pclass, family=binomial(link='logit'), data=data)
summary(model3)
#summary(model3bis)
Note that if the effect modifier was continuous e.g. Age we need to do the calculations for the Pclass-specific odds ratios by hand and assign possible values to compare groups e.g. Age=50, Age=60, etc. Example: \(b_1 + 50 \times (age \times survived interaction term)\) (see video 17:44).
Extra step (comparfed to LR) to make log-odds more interpretable is to compute the odd-ratios by exponentiating the log-odds ratios.
LS0tDQp0aXRsZTogIkludGVycHJldGluZyB0aGUgT3V0cHV0IG9mIGEgTG9naXN0aWMgUmVncmVzc2lvbiBNb2RlbCAoUGFydCAyKSINCm91dHB1dDogaHRtbF9ub3RlYm9vaw0KLS0tDQoNCmBgYHtyIHNldHVwLCBpbmNsdWRlPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCBlcnJvcj1UUlVFfQ0KbGlicmFyeShlcGlEaXNwbGF5KSAjIGxpa2VsaWhvb2QgcmF0aW8gdGVzdA0Kb3B0aW9ucyhkaWdpdHM9MykNCmF0dGFjaChkYXRhKSAjIHJ1biB0aXRhbmljX3RyYWluLlIgZmlyc3QNCmBgYA0KDQo8YnI+DQoNCiMjIyBSZXNlYXJjaCBRdWVzdGlvbjogDQoNCj4gIElzIHRoZXJlIGEgcmVsYXRpb25zaGlwIGJldHdlZW4gU2V4IGFuZCBTdXJ2aXZhbD8NCg0KKiBCZWNhdXNlIHdlIGhhdmUgYSBiaW5hcnkgb3V0Y29tZSwgd2UgY2FuIHVzZSBsb2dpc3RpYyByZWdyZXNzaW9uLg0KKiBXaGVuIHdlIGFyZSBpbnRlcmVzdGVkIGluIHRoZSByZWxhdGlvbnNoaXAgYmV0d2VlbiBhIHNpbmdsZSBYIHZhcmlhYmxlIGFuZCBZIGl0IGlzIHJlZmVycmVkIHRvIGFzIGEgY29tcGFyYXRpdmUsIG9yICplZmZlY3Qgc2l6ZSosIG1vZGVsLiANCiogV2Ugd2FudCB0byBpbmNsdWRlIG90aGVyIGV4cGxhbmF0b3J5IHZhcmlhYmxlcyBpbiB0aGUgbW9kZWwgaW4gb3JkZXIgdG8gZ2V0IHRoZSBsZWFzdCBiaWFzZWQgZXN0aW1hdGUgb2YgdGhlIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIFkgKFN1cnZpdmVkKSBhbmQgWCAoU2V4KS4NCg0KPGJyPg0KDQojIyMgU2ltcGxlIG1vZGVsOg0KDQpgYGB7cn0NCm1vZGVsMSA8LSBnbG0oU3Vydml2ZWQgfiBTZXgsIGZhbWlseT1iaW5vbWlhbChsaW5rPSdsb2dpdCcpLCBkYXRhPWRhdGEpDQptb2RlbDEkY29lZmZpY2llbnRzDQpgYGANCg0KKiBUaGUgbG9nLW9kZHMgb2YgU3Vydml2YWwgaXMgYHIgbW9kZWwxJGNvZWZmaWNpZW50c1syXWAgdGltZXMgaGlnaGVyIGZvciBtZW4gY29tcGFyZWQgdG8gd29tZW4uIA0KKiBPZGRzLXJhdGlvOiBNZW4gaGF2ZSBgciBleHAobW9kZWwxJGNvZWZmaWNpZW50c1syXSlgIHRpbWVzIHRoZSBvZGRzIG9mIHN1cnZpdmFsIChpLmUuIGByIHJvdW5kKChleHAobW9kZWwxJGNvZWZmaWNpZW50c1syXSkgLSAxKSAqMTAwLDApYCUpICB0aGFuIHdvbWVuLg0KKiA5NSUgQ29uZmlkZW5jZSBJbnRlcnZhbCBmb3IgT1IgaXMgYGV4cChiMSArLy0gKFN0LkVycm9yIG9mIGIxICogMS45NikpYDogDQooDQpgciBleHAobW9kZWwxJGNvZWZmaWNpZW50WzJdIC0gKHN1bW1hcnkobW9kZWwxKSRjb2VmZmljaWVudHNbLCAyXVsyXSAqIDEuOTYpKWANCiwgYHIgZXhwKG1vZGVsMSRjb2VmZmljaWVudFsyXSArIChzdW1tYXJ5KG1vZGVsMSkkY29lZmZpY2llbnRzWywgMl1bMl0gKiAxLjk2KSlgDQopICANCg0KPGJyPg0KDQojIyMgRGV0ZWN0aW5nIENvbmZvdW5kaW5nIFZhcmlhYmxlcw0KDQoqIFNhbWUgcHJpbmNpcGxlcyBhcyB3aXRoIGxpbmVhciByZWdyZXNzaW9uLg0KKiBEb2VzIHZhcmlhYmxlIG1lZXQgdGhlIGRlZmluaXRpb24gb2YgYSBjb25mb3VuZGVyPw0KICAqIERvZXMgaXQgbWFrZSBzZW5zZSB0aGF0IHRoZSB2YXJpYWJsZSBpcyBhc3NvY2lhdGVkIHdpdGggJHhfMSQgYW5kIGlzIGEgcHJlZGljdG9yIG9mICR5JCBhbmQgaXMgbm90IG9uIHRoZSBjYXVzYWwgcGF0aHdheT8NCiAgKiBIb3cgYXJlIHRoZXNlIHZhcmlhYmxlcyBhc3NvY2lhdGVkIHdoZW4gd2UgbG9vayBhdCB0aGVpciAqKmJpdmFyaWF0ZSBhc3NvY2lhdGlvbnMqKj8NCiAgKiBJcyB0aGVyZSBhIGdyZWF0ZXIgdGhhbiAxMCUgY2hhbmdlIGluICRiXzEkPw0KICANCioqRXhhbXBsZSoqOiBJcyAqQWdlKiBhIGNvbmZvdW5kZXIgb2YgKlNleCo/DQoNCiogKkFnZSogaXMgbGlrZWx5IGEgcHJlZGljdG9yIG9mICpTdXJ2aXZlZCo6IGNoaWxkcmVuIGFuZCBlbGRlcmx5IGV2YWN1YXRlZCBmaXJzdC4NCiogQlVUICpBZ2UqIGNvdWxkIGJlIG9uIHRoZSBjYXVzYWwgcGF0aHdheSBiZXR3ZWVuIFNleCBhbmQgU3Vydml2YWw6IGUuZy4geW91bmcgd29tYW4gZXZhY3VhdGVkIGZpcnN0Pw0KDQoqKkV4YW1wbGUqKjogSXMgKlBjbGFzcyogYSBjb25mb3VuZGVyIG9mICpTZXgqPw0KDQoqICpQY2xhc3MqIGlzIGxpa2VseSBhIHByZWRpY3RvciBvZiAqU3Vydml2ZWQqOiBTb2NpYWwgc3RhdHVzIGFuZCB3ZWFsdGggbWF5IGdpdmUgc29tZSBhZHZhbnRhZ2UgZHVyaW5nIGV2YWN1YXRpb24uDQoqIEl0IHdvdWxkbid0IG1ha2Ugc2Vuc2UgdGhhdCAqUGNsYXNzKiBpcyBvbiB0aGUgY2F1c2FsIHBhdGh3YXkgYmV0d2VlbiAqU2V4KiBhbmQgKlN1cnZpdmVkKi4NCiogQnV0IGNvdWxkIHRoZXJlIGJlIGFueSBmb3JtIG9mIGFzc29jaWF0aW9uIGJldHdlZW4gKlNleCogYW5kICpQY2xhc3MqPyBXb3JraW5nIGNsYXNzIG1lbiB0cmF2ZWxsaW5nIDNyZCBjbGFzcyB0byBlbWlncmF0ZSB0byB0aGUgVVNBIGZvciBhIG5ldyBsaWZlPw0KDQpMZXQncyBzZXR0bGUgb24gY29uc2lkZXJpbmcgKlBjbGFzcyogYSBjb25mb3VuZGluZyB2YXJpYWJsZSBhbmQgaW5jbHVkZSBpdCBpbiB0aGUgbW9kZWwgYWxvbmdzaWRlICpTZXgqLg0KDQpNb3JlIGFuYWx5c2lzIGlzIG5lZWRlZCB0aG91Z2guLi4NCg0KPGJyPg0KDQoqKkJpdmFyaWF0ZSBBc3NvY2lhdGlvbiBBbmFseXNpcyoqDQoNCkxldCdzIGNoZWNrIHRoZSBiaXZhcmlhdGUgYXNzb2NpYXRpb25zIGJldHdlZW4gKlBjbGFzcyogYW5kICpTZXgqIGFuZCBiZXR3ZWVuICpQY2xhc3MqIGFuZCAqU3Vydml2ZWQqIHRvIHNlZSBpZiB0aGUgdGhlb3J5IGlzIHN1cHBvcnRlZCBieSB0aGUgZGF0YS4NCg0KR2l2ZW4gdGhhdCBib3RoIGFyZSBjYXRlZ29yaWNhbCB2YXJpYWJsZXMgd2UgbXVzdCB1c2UgYSBDaGktc3F1YXJlIHRlc3QuIFRoaXMgdGVzdCBhbGxvd3MgdXMgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgdGhlcmUgaXMgYSBzdGF0aXN0aWNhbGx5IHNpZ25pZmljYW50IGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgZXhwZWN0ZWQgZnJlcXVlbmNpZXMgYW5kIHRoZSBvYnNlcnZlZCBmcmVxdWVuY2llcyBvZiB0aGUgcmVsZXZhbnQgY29udGluZ2VuY3kgdGFibGVzOg0KDQoqICpQY2xhc3MqIHZzLiAqU2V4Kg0KYGBge3J9DQp0YWJsZShQY2xhc3MsIFNleCkNCmNoaXNxLnRlc3QoUGNsYXNzLCBTZXgpDQpgYGANCiogKlBjbGFzcyogdnMuICpTdXJ2aXZlZCoNCg0KYGBge3J9DQp0YWJsZShQY2xhc3MsIFN1cnZpdmVkKQ0KY2hpc3EudGVzdChQY2xhc3MsIFN1cnZpdmVkKQ0KYGBgDQoNCkludGVycHJldGF0aW9uIG9mIHRoZSBhYm92ZSBvdXRwdXRzOiBHaXZlbiB0aGF0IGluIGJvdGggY2FzZXMgcDwwLjUsICpQY2xhc3MqIGlzIHNpZ25pZmljYW50bHkgYXNzb2NpYXRlZCB3aXRoIGJvdGggKlNleCogYW5kICpTdXJ2aXZlZCosIHRodXMgdGhlIHZhcmlhYmxlIHNlZW1zIHRvIG1lZXQgdGhlIGRlZmluaXRpb24gb2YgYSBjb25mb3VuZGluZyB2YXJpYWJsZS4NCg0KPGJyPg0KDQoqKkdyZWF0ZXIgdGhhbiAxMCUgY2hhbmdlIGluIHgxIGNvZWZmaWNpZW50PyoqDQoNCiogUmVjYWxsIHRoYXQgaW4gdGhlIHNpbXBsZSBtb2RlbCBgU3Vydml2ZWQgfiBTZXhgLCB0aGUgY29lZmZpY2llbnQgb2YgKlNleG1hbGUqIHdhcyBlcXVhbCB0byBgciBtb2RlbDEkY29lZmZpY2llbnRzWzJdYC4NCg0KTm93IGxldCdbcyBhZGRkICpQY2xhc3MqIHRvIHRoZSBtb2RlbDoNCg0KYGBge3J9DQptb2RlbDIgPC0gZ2xtKFN1cnZpdmVkIH4gU2V4ICsgUGNsYXNzLCBmYW1pbHk9Ymlub21pYWwobGluaz0nbG9naXQnKSwgZGF0YT1kYXRhKQ0KbW9kZWwyJGNvZWZmaWNpZW50cw0KYGBgDQoNClRoZSBjb2VmZmljaWVudCBvZiAqU2V4bWFsZSogZG9lcyBub3QgY2hhbmdlIG11Y2ggKG9ubHkgNSUpIHdoaWNoIHN1Z2dlc3RzIHRoYXQgKlBjbGFzcyogaXMgbm90IGNvbmZvdW5kZXIuIFRoaXMgY29udHJhZGljdHMgdGhlIHByZXZpb3VzIGZpbmRpbmcuIA0KDQo8YnI+DQoNCioqSXMgdGhlIG1vZGVsIGJldHRlciB3aGVuIHdlIGluY2x1ZGUgdGhlIGNvbmZvdW5kaW5nIHZhcmlhYmxlPyoqDQoNCiogQUlDDQoNCiAgKiBBSUMgZm9yIG1vZGVsIDE6IGByIEFJQyhtb2RlbDEpYCANCiAgKiBBSUMgZm9yIG1vZGVsIDI6IGByIEFJQyhtb2RlbDIpYA0KDQo8YnI+DQoNCiogTGlrZWxpaG9vZCBSYXRpbyBUZXN0DQoNCiAgKiBTU1Jlc2lkIHJlZHVjZWQgbW9kZWwgPSAgYHIgbW9kZWwxJGRldmlhbmNlYA0KICAqIFNTUmVzaWQgZnVsbCBtb2RlbCA9IGByIG1vZGVsMiRkZXZpYW5jZWANCg0KDQogICBUaGUgcmVzaWR1YWwgZGV2aWFuY2Ugb2YgdGhlIG1vZGVsIHRoYXQgaW5jbHVkZXMgKlBjbGFzcyogaXMgbG93ZXIuIEJhc2VkIG9uIHRoaXMgd2UgY2FuIHJlamVjdCAkSF8wJCB0aGF0IHRoZXJlIGlzIG5vIGRpZmZlcmVuY2UgYmV0d3dlbiBmdWxsIGFuZCByZWR1Y2VkIG1vZGVsIGkuZS4gdGhhdCB0aGUgZnVsbCBtb2RlbCBpcyBub3Qgc2lnbmlmaWNhbnRseSBiZXR0ZXIgdGhhbiB0aGUgcmVkdWNlZCBtb2RlbC4gVGh1cyB3ZSBjb25jbHVkZSB0aGF0IHdlIGhhdmUgZXZpZGVuY2UgdG8gc3VwcG9ydCAkSF9hJCB0aGF0IHRoZSBtb2RlbCB0aGF0IGluY2x1ZGVzICpQY2xhc3MqIGlzIHNpZ25pZmljYW50bHkgYmV0dGVyLiBUaGlzIGlzIGNvbmZpcm1lZCBieSB0aGUgJ2xydGVzdCgpJyBmdW5jdGlvbiBiZWxvdzoNCg0KYGBge3J9DQpscnRlc3QobW9kZWwxLCBtb2RlbDIpDQojPz9sci50ZXN0DQpgYGANCg0KU28sIGtlZXAgaXQgb3Igbm90PyBJdCBkZXBlbmRzLi4uS2VlcCAqUGNsYXNzKiBmb3Igbm93Li4uLg0KDQo8YnI+DQoNCioqQXNzZXNzaW5nIENvbGxpbmVhcml0eSoqDQoNCkxldCdzIGxvb2sgYXQgYWRkaW5nIGNvbGxpbmVhciB2YXJpYWJsZXMgQWdlR3JvdXAgYW5kIEFnZUdyb3VwMjAyOS4NCg0KV2Ugd2lsbCBhc3Nlc3Mgd2hpY2ggb25lIGlzIGJldHRlciBieSBsb29raW5nIGF0IEFJQy4gTm90IHRoYXQgd2UgZG9uJ3Qgc2ltcGx5IG1vZGVsIHNheSBTdXJ2aXZlZCBhbmQgQWdlR3JvdXAgYnV0IHJhdGhlciBsb29rIGF0IGhvdyB0aGVpciByZXNwZWN0aXZlIGFkZGl0aW9ucyB0byB0aGUgZXhpc3RpbmcgbW9kZWwgaW1wYWN0IHRoZSByZXN1bHRzLg0KDQpgYGB7cn0NCm1vZGVsMyA8LSBnbG0oU3Vydml2ZWQgfiBTZXggKyBQY2xhc3MgKyBBZ2VHcm91cCwgZmFtaWx5PWJpbm9taWFsKGxpbms9J2xvZ2l0JyksIGRhdGE9ZGF0YSkNCg0KbW9kZWw0IDwtIGdsbShTdXJ2aXZlZCB+IFNleCArIFBjbGFzcyArIEFnZUdyb3VwMjAyOSwgZmFtaWx5PWJpbm9taWFsKGxpbms9J2xvZ2l0JyksIGRhdGE9ZGF0YSkNCmBgYA0KQUlDIGZvciBtb2RlbCB3aXRoIEFnZUdyb3VwOiBgciBBSUMobW9kZWwzKWANCkFJQyBmb3IgbW9kZWwgd2l0aCBBZ2VHcm91cDIwMjk6IGByIEFJQyhtb2RlbDMpYA0KDQpBSUMgaXMgc2xpZ2h0bHkgbG93ZXIgZm9yIHRoZSBtb2RlbCB3aXRoICpBZ2VHcm91cCoqIHNvIG1vdmluZyBmb3J3YXJkIHRoZSBtb2RlbCB3aWxsIGluY2x1ZGUgU2V4LCBQY2xhc3MsIEFnZUdyb3VwIGV4cGxhbmF0b3J5IHZhcmlhYmxlcy4NCg0KPiBjYXJlZnVsLCB0aGlzIG9ubHkgdGVtcG9yYXJ5LCBBZ2VHcm91cCByZXN1bHRzIGluIG1pc3NpbmcgZGF0YS4NCg0KPGJyPg0KDQojIyMgQXNzZXNzIEludGVyYWN0aW9uIHZpYSBMaWtlbGlob29kIFJhdGlvIFRlc3QNCg0KKipJZiBzb21lIHZhcmlhYmxlIGRvZXMgbm90IG1lZXQgdGhlIGNyaXRlcmlhIG9mIGEgY29uZm91bmRlciwgaXQgY291bGQgc3RpbGwgYmUgYW4gZWZmZWN0IG1vZGlmaWVyISoqIERvZXMgdGhlIGVmZmVjdCB0aGF0ICR4MSQgaGFzIG9uIHRoZSBvZGRzIG9mICR5JCBkZXBlbmQgb24gc29tZSBvdGhlciB2YXJpYWJsZSAkeDIkPyBJZiBzbyB0aGVuIHdlIGNhbGwgdGhlIHZhcmlhYmxlICR4MiQgYW4gKiplZmZlY3QgbW9kaWZpZXIqKiANCg0KVGh1cyBub3cgd2UgdHJ5IHRvIGFuc3dlciB0aGUgcXVlc3Rpb246DQoNCj4gRG9lcyB0aGUgZWZmZWN0IHRoYXQgKlNleCogaGFzIG9uICpTdXJ2aXZlZCogKipkZXBlbmQgb24qKiAqUGNsYXNzKj8gDQoNCkFuIGludGVyYWN0aW9uIHRlcm1zIGlzIHRoZSBtdWx0aXBsaWNhdGlvbiBvZiB0d28gdmFyaWFibGUgd2l0aCBlYWNoIG90aGVyIGUuZy4gYFNleCAqIFBjbGFzc2AuDQoNCldlIGNhbiB1c2UgYSBMaWtlbGlob29kIFJhdGlvIFRlc3QgdG8gY29tcGFyZSBtb2RlbHMgd2l0aCBhbmQgd2l0aG91dCBhICRTZXggXHRpbWVzIFBjbGFzcyQgW2ludGVyYWN0aW9uIHRlcm1dKGh0dHBzOi8vc3RhdHMuc3RhY2tleGNoYW5nZS5jb20vcXVlc3Rpb25zLzEyNzU0OS9jcmVhdGluZy1pbnRlcmFjdGlvbi10ZXJtLWZvci1kdW1teS12YXJpYWJsZXMtYW5kLWNhdGVnb3JpY2FsLXZhcmlhYmxlcykuDQoNClRvIGNvbXBhcmUgdHdvIG1vZGVscyB3ZSB1c2UgdGhlIGBhbm92YSgpYCBmdW5jdGlvbi4NCg0KYGBge3J9DQptb2RlbDNiaXMgPC0gZ2xtKFN1cnZpdmVkIH4gU2V4ICsgUGNsYXNzICsgQWdlR3JvdXAgKyBTZXggKiBQY2xhc3MsIGZhbWlseT1iaW5vbWlhbChsaW5rPSdsb2dpdCcpLCBkYXRhPWRhdGEpDQphbm92YShtb2RlbDMsIG1vZGVsM2JpcywgdGVzdD0nQ2hpc3EnKQ0KYGBgDQoNCldlIGNhbiBzZWUgdGhhdCB0aGUgcC12YWx1ZSBpcyA8IDAuNSBhbmQgd2UgcmVqZWN0IHRoZSBudWxsIGh5cG90aGVzaXMgdGhhdCB0aGUgcmVzaWR1YWwgZGV2aWFuY2UgaXMgdGhlIHNhbWUgZm9yIG1vZGVscyB0aGF0IGRvIGFuZCBkbyBub3QgaW5jbHVkZSB0aGUgaW50ZXJhY3Rpb24gdGVybS4gVGhlIG1vZGVsIHRoYXQgaW5jbHVkZXMgdGhlIGludGVyYWN0aW9uIHRlcm0gSVMgc2lnbmlmaWNhbnRseSBiZXR0ZXIuDQoNClRoaXMgc3VnZ2VzdHMgdGhhdCAqUGNsYXNzKiBpcyBhbiBlZmZlY3QgbW9kaWZpZXIuIFRoZSBlZmZlY3Qgb2YgU2V4IG9uIHRoZSBvZGRzIG9mIFN1cnZpdmVkIHZhcmllcywgb3IgZGlmZmVycywgZGVwZW5kaW5nIG9uIFBjbGFzcy4NCg0KVGhlcmUgaXMgc2lnbmlmaWNhbnQgaW50ZXJhY3Rpb24gYmV0d2VlbiBTZXggYW5kIFBjbGFzcy4gDQoNClRoaXMgbWVhbnMgdGhhdCB3ZSB3YW50IHRvIHJlcG9ydCBvbiB0aGUgZWZmZWN0IG9mIFBjbGFzcyBmb3IgZGlmZmVyZW50IFNleCBjYXRlZ29yaWVzOiBhbnl0aGluZyB3ZSBzYXkgYWJvdXQgdGhlIGVmZmVjdCBvZiBTZXggb24gU3Vydml2ZWQgbmVlZHMgdG8gYmUgUGNsYXNzLXNwZWNpZmljLg0KDQo+IENhbiBhIGNsYXNzIGJlIGJvdGggYSBjb25mb3VuZGVyIGFuZCBhbiBlZmZlY3QgbW9kaWZpZXI/Pw0KDQpgYGB7cn0NCm1vZGVsM2JpcyA8LSBnbG0oU3Vydml2ZWQgfiBTZXggKyBQY2xhc3MgKyBBZ2VHcm91cCArIFNleCAqIFBjbGFzcywgZmFtaWx5PWJpbm9taWFsKGxpbms9J2xvZ2l0JyksIGRhdGE9ZGF0YSkNCnN1bW1hcnkobW9kZWwzKQ0KYGBgDQoNCiogUGNsYXNzID0gMTogQW1vbmcgcGFzc2VuZ2VycyB0aGF0IHRyYXZlbGxlZCAxc3QgY2xhc3MsIHRoZSBsb2ctb2RkcyBvZiBzdXJ2aXZhbCBhcmUgeCB0aW1lcyBoaWdoZXIvbG93ZXIgZm9yIG1lbiBjb21wYXJlZCB0byB3b21lbiwgYWRqdXN0aW5nIGZvciBBZ2VHcm91cC4NCg0KDQoqIFBjbGFzcyA9IDI6DQoqIFBjbGFzcyA9IDM6DQoNCmBgYHtyfQ0KI3N1bW1hcnkobW9kZWwzYmlzKQ0KYGBgDQoNCk5vdGUgdGhhdCBpZiB0aGUgZWZmZWN0IG1vZGlmaWVyIHdhcyBjb250aW51b3VzIGUuZy4gQWdlIHdlIG5lZWQgdG8gZG8gdGhlIGNhbGN1bGF0aW9ucyBmb3IgdGhlIFBjbGFzcy1zcGVjaWZpYyBvZGRzIHJhdGlvcyBieSBoYW5kIGFuZCBhc3NpZ24gcG9zc2libGUgdmFsdWVzIHRvIGNvbXBhcmUgZ3JvdXBzIGUuZy4gQWdlPTUwLCBBZ2U9NjAsIGV0Yy4gRXhhbXBsZTogJGJfMSArIDUwIFx0aW1lcyAoYWdlIFx0aW1lcyBzdXJ2aXZlZCBpbnRlcmFjdGlvbiB0ZXJtKSQgKHNlZSB2aWRlbyAxNzo0NCkuDQoNCkV4dHJhIHN0ZXAgKGNvbXBhcmZlZCB0byBMUikgdG8gbWFrZSBsb2ctb2RkcyBtb3JlIGludGVycHJldGFibGUgaXMgdG8gY29tcHV0ZSB0aGUgb2RkLXJhdGlvcyBieSBleHBvbmVudGlhdGluZyB0aGUgbG9nLW9kZHMgcmF0aW9zLiAgDQoNCg==