1 Introduction
In this assignment, we are tasked with creating different multiple
regression models so we can incorporate more variables into the model. I
want to take a look and see which variables are most predictive, and
which model is the best.
2 Description of Data Set
The data set I chose was Railroad Accidents in the U.S. in 2010. The
data was collected via safetydata.fra.dot.gov. In last week’s project, I
used this data set to determine if the number of Cars Derailed
positively correlated with Equipment Damage (in dollars). This week, I
want to add Track Damage (in dollars) to my model because it had the
second strongest correlation coefficient r from last week’s correlation
matrix. I’m going to see how accurately Cars Derailed and Track Damage
can predict Equipment Damage.
2.1 Variables
- Railroad (categorical) - name of railroad
- Month (categorical)
- Day (categorical) - days of the week labeled 1 through 7
- State (categorical)
- County (categorical)
- Track Type (categorical)
- Track Management (categorical)
- Accident Type (categorical)
- Accident Cause (categorical)
- Equipment Damage (numerical) - amount of money spent on damages
- Track Damage (numerical) - amount of money spent on track
repair
- Killed (numerical) - number of people killed from accident
- Injured (numerical) - number of people injured from accident
- RREquip (categorical) - type of train
- Speed (numerical) - mph the train was going at during impact
- Locomotives Derailed (numerical) - the number of locomotives
derailed
- Cars Derailed (numerical) - the number of Cars Derailed
3 Methodology and Analysis
I am going to create two multiple linear regression models: one with
Cars Derailed and Track Damage being added together, and one with the
two variables being multiplied (interacted) together. There is a
possibility that a single derailed car causes more damage if the track
is already badly damaged. If that’s the case, then the interaction model
would be more appropriate to use. We will be dropping all of the other
variables mentioned in #2.
4 Model 1: Main Effects Model
We are going to start with the MLR model without the interaction
term.
4.1 Inferential Statistics
# Multiple Linear Regression
model1 <- lm(EqpDamg ~ CarsDer + TrkDamg, data = myData)
# Summary of the model
summary(model1)
Call:
lm(formula = EqpDamg ~ CarsDer + TrkDamg, data = myData)
Residuals:
Min 1Q Median 3Q Max
-1019731 -48772 9400 32944 3143734
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) -1.988e+04 4.001e+03 -4.968 7.19e-07 ***
CarsDer 2.538e+04 7.260e+02 34.961 < 2e-16 ***
TrkDamg 5.387e-01 3.819e-02 14.108 < 2e-16 ***
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Residual standard error: 180500 on 2618 degrees of freedom
Multiple R-squared: 0.4733, Adjusted R-squared: 0.4729
F-statistic: 1176 on 2 and 2618 DF, p-value: < 2.2e-16
Looking at the inferential statistics, Cars Derailed and Track Damage
are both highly significant. The intercept is not statistically
significant. For each additional car derailed (25,380, p < 2e-16),
Equipment Damage increases by about $25,380, holding Track Damage
constant. For each additional dollar spent on Track Damage (0.54, p <
2e-16), Equipment Damage increases by about $0.54, holding Cars Derailed
constant. This model explains 47.29% of the variation in Equipment
Damage. The model is highly significant (F = 1176, p = 0)
4.2 Residual Analysis
# Fit model without interaction
model1 <- lm(EqpDamg ~ CarsDer + TrkDamg, data = myData)
# Plot residuals vs fitted to check assumptions
par(mfrow = c(2,2))
plot(model1)

The Residuals vs Fitted plot shows there is no constant variance in
the residuals. The Q-Q Residuals shows multiple outliers and two strong
tails, indicating non-normality. The Scale Location plot shows a lack of
constant variance and the Residuals vs Leverage plot shows an outlier at
390. The assumptions for normality are not met.
5 Model 2: Interaction Term
Now, I am going to incorporate the interaction term, CarsDer:TrkDamg,
exclude the main effects, and see if the R-squared value increased and
if the interaction term is statistically significant. I’ll also be
looking to see if the model as a whole is significant. If it’s not, then
I’ll be removing the term and go forward with the MLR model.
5.1 Inferential Statistics
# Multiple Linear Regression with Interaction
model2 <- lm(EqpDamg ~ CarsDer:TrkDamg, data = myData)
# Summary of the model
summary(model2)
Call:
lm(formula = EqpDamg ~ CarsDer:TrkDamg, data = myData)
Residuals:
Min 1Q Median 3Q Max
-1799092 -44483 -33634 -15771 3153755
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 4.624e+04 3.635e+03 12.72 <2e-16 ***
CarsDer:TrkDamg 7.002e-02 1.508e-03 46.42 <2e-16 ***
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Residual standard error: 184200 on 2619 degrees of freedom
Multiple R-squared: 0.4514, Adjusted R-squared: 0.4512
F-statistic: 2155 on 1 and 2619 DF, p-value: < 2.2e-16
For each additional unit increase in CarsDer:TrkDamg, Equipment
Damage increases by $0.07. The interaction term is highly significant (F
= 2155, p = 0). This model explains 45.12% of the variation in Equipment
Damage.
5.2 Residual Analysis
# Fit the interaction model
model2 <- lm(EqpDamg ~ CarsDer:TrkDamg, data = myData)
# Residual diagnostics
par(mfrow = c(2,2)) # show 4 plots together
plot(model2)

par(mfrow = c(1,1)) # reset layout
The Residuals vs Fitted plot shows there is no constant variance in
the residuals. The Q-Q Residuals shows multiple outliers and one strong
tail, showing non-normality. The Scale Location plot shows a lack of
constant variance and the Residuals vs Leverage plot shows an outlier at
1414. All in all, the assumptions for normality are not met.
6 Model 3: Interaction Term with Main Effects
Finally, I will be using both main effects and their interaction term
to create Model 3.
6.1 Inferential Statistics
# Model 3: CarsDer + TrkDamg + CarsDer:TrkDamg
model3 <- lm(EqpDamg ~ CarsDer + TrkDamg + CarsDer:TrkDamg, data = myData)
# Summary of the model
summary(model3)
Call:
lm(formula = EqpDamg ~ CarsDer + TrkDamg + CarsDer:TrkDamg, data = myData)
Residuals:
Min 1Q Median 3Q Max
-1084820 -37763 -3774 11799 3144550
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 3.401e+03 3.974e+03 0.856 0.392
CarsDer 1.735e+04 8.114e+02 21.382 <2e-16 ***
TrkDamg 7.346e-02 4.398e-02 1.670 0.095 .
CarsDer:TrkDamg 4.165e-02 2.268e-03 18.363 <2e-16 ***
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Residual standard error: 169900 on 2617 degrees of freedom
Multiple R-squared: 0.5334, Adjusted R-squared: 0.5329
F-statistic: 997.3 on 3 and 2617 DF, p-value: < 2.2e-16
Cars Derailed (17,350, p < 2e-16), Track Damage (0.073, p =
0.095), and their interaction term (p = 0) are all statistically
significant. Since the interaction term is significant, this means that
the variables depend on each other. The effect of Cars Derailed on
Equipment Damage grows as Track Damage grows. When both Cars Derailed
and Track Damage are zero, the expected Equipment Damage is $3400. The
intercept is not statistically significant. For each additional car
derailed, Equipment Damage increases by about $17,350 on average,
holding Track Damage constant at zero. Each additional dollar of Track
Damage is associated with about $0.07 of additional Equipment Damage.
This model explains 53.39% of the variation in Equipment Damage. The
model is highly significant (F = 997.3, p = 0).
6.2 Residual Analysis
# Residual diagnostic plots
par(mfrow = c(2,2))
plot(model3)

par(mfrow = c(1,1)) # reset
The assumptions of normality are not met. There is no constant
variance in the Residuals vs Fitted plot, there is a strong right tail
in the Q-Q Residuals plot, the Scale Location plot does not show
constant variance, and there is one outlier, 1414, in the Residuals vs
Leverage plot.
7 ANOVA
anova(model1, model2, model3)
Analysis of Variance Table
Model 1: EqpDamg ~ CarsDer + TrkDamg
Model 2: EqpDamg ~ CarsDer:TrkDamg
Model 3: EqpDamg ~ CarsDer + TrkDamg + CarsDer:TrkDamg
Res.Df RSS Df Sum of Sq F Pr(>F)
1 2618 8.5269e+13
2 2619 8.8817e+13 -1 -3.5477e+12 122.91 < 2.2e-16 ***
3 2617 7.5536e+13 2 1.3281e+13 230.06 < 2.2e-16 ***
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
The ANOVA table shows that adding the interaction term to the main
effects significantly improves the model. As a result, Model 3 is the
best model because it reduces residual variation the most. Model 2 is
the worst of the three models because it doesn’t take into account the
influence that the independent main effects have on the model. Model 2
also has the highest residual sum of squares, meaning there is more
unexplained variation in this model compared to the other two.
8 Nonparametric Tests
We are going to move forward with Model 3 because we established it
as the best of the three. I will be conducting a Box-Cox transformation
and Bootstrap confidence intervals because the assumptions for normality
were not met.
8.2 Bootstrap Confidence Intervals
library(boot)
# Define function to extract coefficients
boot_coef <- function(data, indices) {
d <- data[indices, ] # resample rows
fit <- lm(EqpDamg ~ CarsDer + TrkDamg + CarsDer:TrkDamg, data = d)
return(coef(fit))
}
# Run bootstrap
set.seed(123) # for reproducibility
boot_results <- boot(data = myData, statistic = boot_coef, R = 1000) # 1000 resamples
# Create a tidy table of 95% percentile CIs for all coefficients
coef_names <- names(coef(model3))
ci_list <- lapply(1:length(coef_names), function(i) {
ci <- boot.ci(boot_results, type = "perc", index = i)$percent[4:5]
data.frame(Coefficient = coef_names[i],
Lower95 = ci[1],
Upper95 = ci[2])
})
ci_table <- do.call(rbind, ci_list)
print(ci_table)
Coefficient Lower95 Upper95
1 (Intercept) -5542.0358228 1.329135e+04
2 CarsDer 12827.1587568 2.172305e+04
3 TrkDamg -0.1240326 3.215833e-01
4 CarsDer:TrkDamg 0.0289688 6.334345e-02
The Cars Derailed interval is entirely positive. This indicates
strong evidence of a positive effect. We are 95% confident that the
slope of Cars Derailed is between 12,800 and 21,700. The interval for
Track Damage includes 0, which means the effect alone may not have a
consistent effect on Equipment Damage. We are 95% confident that the
slope of Track Damage is between -0.124 and 0.322. The interval for the
interaction term is entirely positive, meaning the interaction is
meaningful. We are 95% confident that the slope of the interaction term
is between 0.03 and 0.06.
9 Conclusion
In conclusion, the model with the interaction term and both main
effects, Model 3, was the best model of the three. It explained the
highest variation in Equipment Damage (53.29%). We are certain that the
main effect of Cars Derailed is significant, but are unsure if Track
Damage alone is significant because its 95% bootstrap interval contains
0. The interaction term is statistically significant, meaning that the
effect of Cars Derailed depends on Track Damage and vice versa.
10 References
safetydata.fra.dot.gov
LS0tDQp0aXRsZTogIk11bHRpcGxlIExpbmVhciBSZWdyZXNzaW9uIE1vZGVscyINCmF1dGhvcjogIkx1a2UgVm9sbSINCmRhdGU6ICIyMDI1LTA5LTIxIg0Kb3V0cHV0Og0KICBodG1sX2RvY3VtZW50OiAgICAgICAgICAgIyBvdXRwdXQgZG9jdW1lbnQgZm9ybWF0DQogICAgdG9jOiB5ZXMgICAgICAgICAgICAgICAjIGFkZCB0YWJsZSBjb250ZW50cw0KICAgIHRvY19mbG9hdDogeWVzICAgICAgICAgIyB0b2NfcHJvcGVydHk6IGZsb2F0aW5nDQogICAgdG9jX2RlcHRoOiA0ICAgICAgICAgICAjIGRlcHRoIG9mIFRPQyBoZWFkaW5ncw0KICAgIGZpZ193aWR0aDogNiAgICAgICAgICAgIyBnbG9iYWwgZmlndXJlIHdpZHRoDQogICAgZmlnX2hlaWdodDogNCAgICAgICAgICAjIGdsb2JhbCBmaWd1cmUgaGVpZ2h0DQogICAgZmlnX2NhcHRpb246IHllcyAgICAgICAjIGFkZCBmaWd1cmUgY2FwdGlvbg0KICAgIG51bWJlcl9zZWN0aW9uczogbm8gICAjIG51bWJlcmluZyBzZWN0aW9uIGhlYWRpbmdzDQogICAgdG9jX2NvbGxhcHNlZDogeWVzICAgICAjIFRPQyBzdWJoZWFkaW5nIGNvbGxhcHNpbmcNCiAgICBjb2RlX2ZvbGRpbmc6IGhpZGUgICAgICMgZm9sZGluZy9zaG93aW5nIGNvZGUgDQogICAgY29kZV9kb3dubG9hZDogeWVzICAgICAjIGFsbG93IHRvIGRvd25sb2FkIGNvbXBsZXRlIFJNYXJrZG93biBzb3VyY2UgY29kZQ0KICAgIHNtb290aF9zY3JvbGw6IHllcyAgICAgIyBzY3JvbGxpbmcgdGV4dCBvZiB0aGUgZG9jdW1lbnQNCiAgICB0aGVtZTogbHVtZW4gICAgICAgICAgICMgdmlzdWFsIHRoZW1lIGZvciBIVE1MIGRvY3VtZW50IG9ubHkNCiAgICBoaWdobGlnaHQ6IHRhbmdvICAgICAgICMgY29kZSBzeW50YXggaGlnaGxpZ2h0aW5nIHN0eWxlcw0KICBwZGZfZG9jdW1lbnQ6IA0KICAgIHRvYzogeWVzDQogICAgdG9jX2RlcHRoOiA0DQogICAgZmlnX2NhcHRpb246IHllcw0KICAgIG51bWJlcl9zZWN0aW9uczogeWVzDQogIHdvcmRfZG9jdW1lbnQ6DQogICAgdG9jOiB5ZXMNCiAgICB0b2NfZGVwdGg6ICc0Jw0KLS0tDQpgYGB7Y3NzLCBlY2hvID0gRkFMU0V9DQpkaXYjVE9DIGxpIHsgICAgIC8qIHRhYmxlIG9mIGNvbnRlbnQgICovDQogICAgbGlzdC1zdHlsZTp1cHBlci1yb21hbjsNCiAgICBiYWNrZ3JvdW5kLWltYWdlOm5vbmU7DQogICAgYmFja2dyb3VuZC1yZXBlYXQ6bm9uZTsNCiAgICBiYWNrZ3JvdW5kLXBvc2l0aW9uOjA7DQp9DQoNCmgxLnRpdGxlIHsgICAgLyogbGV2ZWwgMSBoZWFkZXIgb2YgdGl0bGUgICovDQogIGZvbnQtc2l6ZTogMjRweDsNCiAgZm9udC13ZWlnaHQ6IGJvbGQ7DQogIGNvbG9yOiBEYXJrUmVkOw0KICB0ZXh0LWFsaWduOiBjZW50ZXI7DQp9DQoNCmg0LmF1dGhvciB7IC8qIEhlYWRlciA0IC0gYW5kIHRoZSBhdXRob3IgYW5kIGRhdGEgaGVhZGVycyB1c2UgdGhpcyB0b28gICovDQogIGZvbnQtc2l6ZTogMThweDsNCiAgZm9udC13ZWlnaHQ6IGJvbGQ7DQogIGZvbnQtZmFtaWx5OiAiVGltZXMgTmV3IFJvbWFuIiwgVGltZXMsIHNlcmlmOw0KICBjb2xvcjogRGFya1JlZDsNCiAgdGV4dC1hbGlnbjogY2VudGVyOw0KfQ0KDQpoNC5kYXRlIHsgLyogSGVhZGVyIDQgLSBhbmQgdGhlIGF1dGhvciBhbmQgZGF0YSBoZWFkZXJzIHVzZSB0aGlzIHRvbyAgKi8NCiAgZm9udC1zaXplOiAxOHB4Ow0KICBmb250LXdlaWdodDogYm9sZDsNCiAgZm9udC1mYW1pbHk6ICJUaW1lcyBOZXcgUm9tYW4iLCBUaW1lcywgc2VyaWY7DQogIGNvbG9yOiBEYXJrQmx1ZTsNCiAgdGV4dC1hbGlnbjogY2VudGVyOw0KfQ0KDQpoMSB7IC8qIEhlYWRlciAxIC0gYW5kIHRoZSBhdXRob3IgYW5kIGRhdGEgaGVhZGVycyB1c2UgdGhpcyB0b28gICovDQogICAgZm9udC1zaXplOiAyMHB4Ow0KICAgIGZvbnQtd2VpZ2h0OiBib2xkOw0KICAgIGZvbnQtZmFtaWx5OiAiVGltZXMgTmV3IFJvbWFuIiwgVGltZXMsIHNlcmlmOw0KICAgIGNvbG9yOiBkYXJrcmVkOw0KICAgIHRleHQtYWxpZ246IGNlbnRlcjsNCn0NCg0KaDIgeyAvKiBIZWFkZXIgMiAtIGFuZCB0aGUgYXV0aG9yIGFuZCBkYXRhIGhlYWRlcnMgdXNlIHRoaXMgdG9vICAqLw0KICAgIGZvbnQtc2l6ZTogMThweDsNCiAgICBmb250LXdlaWdodDogYm9sZDsNCiAgICBmb250LWZhbWlseTogIlRpbWVzIE5ldyBSb21hbiIsIFRpbWVzLCBzZXJpZjsNCiAgICBjb2xvcjogbmF2eTsNCiAgICB0ZXh0LWFsaWduOiBsZWZ0Ow0KfQ0KDQpoMyB7IC8qIEhlYWRlciAzIC0gYW5kIHRoZSBhdXRob3IgYW5kIGRhdGEgaGVhZGVycyB1c2UgdGhpcyB0b28gICovDQogICAgZm9udC1zaXplOiAxNnB4Ow0KICAgIGZvbnQtd2VpZ2h0OiBib2xkOw0KICAgIGZvbnQtZmFtaWx5OiAiVGltZXMgTmV3IFJvbWFuIiwgVGltZXMsIHNlcmlmOw0KICAgIGNvbG9yOiBuYXZ5Ow0KICAgIHRleHQtYWxpZ246IGxlZnQ7DQp9DQoNCmg0IHsgLyogSGVhZGVyIDQgLSBhbmQgdGhlIGF1dGhvciBhbmQgZGF0YSBoZWFkZXJzIHVzZSB0aGlzIHRvbyAgKi8NCiAgICBmb250LXNpemU6IDE0cHg7DQogIGZvbnQtd2VpZ2h0OiBib2xkOw0KICAgIGZvbnQtZmFtaWx5OiAiVGltZXMgTmV3IFJvbWFuIiwgVGltZXMsIHNlcmlmOw0KICAgIGNvbG9yOiBkYXJrcmVkOw0KICAgIHRleHQtYWxpZ246IGxlZnQ7DQp9DQoNCi8qIEFkZCBkb3RzIGFmdGVyIG51bWJlcmVkIGhlYWRlcnMgKi8NCi5oZWFkZXItc2VjdGlvbi1udW1iZXI6OmFmdGVyIHsNCiAgY29udGVudDogIi4iOw0KfQ0KYGBgDQoNCg0KYGBge3Igc2V0dXAsIGluY2x1ZGU9RkFMU0V9DQojIGNvZGUgY2h1bmsgc3BlY2lmaWVzIHdoZXRoZXIgdGhlIFIgY29kZSwgd2FybmluZ3MsIGFuZCBvdXRwdXQgDQojIHdpbGwgYmUgaW5jbHVkZWQgaW4gdGhlIG91dHB1dCBmaWxlcy4NCnNldHdkKCJDOi9Vc2Vycy92b2xtMS9PbmVEcml2ZS9Eb2N1bWVudHMiKQ0KbGlicmFyeShyZWFkeGwpDQpteURhdGEgPC0gcmVhZF9leGNlbCgidHJhaW5fYWNjXzIwMTAgKDEpLnhscyIpDQpteWRhdGEgPC0gbXlEYXRhWywgLTFdDQppZiAoIXJlcXVpcmUoImtuaXRyIikpIHsgICAgICAgICAgICAgICAgICAgICAgIyB1c2UgY29uZGl0aW9uYWwgc3RhdGVtZW50IHRvIGRldGVjdA0KICAgaW5zdGFsbC5wYWNrYWdlcygia25pdHIiKSAgICAgICAgICAgICAgICAgICMgd2hldGhlciBhIHBhY2thZ2Ugd2FzIGluc3RhbGxlZCBpbg0KICAgbGlicmFyeShrbml0cikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgeW91ciBtYWNoaW5lLiBJZiBub3QsIGluc3RhbGwgaXQgYW5kDQp9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBsb2FkIGl0IHRvIHRoZSB3b3JraW5nIGRpcmVjdG9yeS4NCiMNCmtuaXRyOjpvcHRzX2NodW5rJHNldChlY2hvID0gVFJVRSwgICAgICAgICAgICAjIGluY2x1ZGUgY29kZSBjaHVuayBpbiB0aGUgb3V0cHV0IGZpbGUNCiAgICAgICAgICAgICAgICAgICAgICB3YXJuaW5nID0gRkFMU0UsICAgICAgICAjIHNvbWV0aW1lcywgeW91IGNvZGUgbWF5IHByb2R1Y2Ugd2FybmluZyBtZXNzYWdlcywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIHlvdSBjYW4gY2hvb3NlIHRvIGluY2x1ZGUgdGhlIHdhcm5pbmcgbWVzc2FnZXMgaW4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIHRoZSBvdXRwdXQgZmlsZS4gDQogICAgICAgICAgICAgICAgICAgICAgcmVzdWx0cyA9IFRSVUUsICAgICAgICAgIyB5b3UgY2FuIGFsc28gZGVjaWRlIHdoZXRoZXIgdG8gaW5jbHVkZSB0aGUgb3V0cHV0DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBpbiB0aGUgb3V0cHV0IGZpbGUuDQogICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZSA9IEZBTFNFLCAgICAgICAgIyBzdXBwcmVzcyBtZXNzYWdlcyANCiAgICAgICAgICAgICAgICAgICAgICBjb21tZW50ID0gTkEgICAgICAgICAgICAjIHJlbW92ZSB0aGUgZGVmYXVsdCBsZWFkaW5nIGhhc2ggdGFncyBpbiB0aGUgb3V0cHV0DQogICAgICAgICAgICAgICAgICAgICAgKSAgIA0KYGBgDQoNCg0KIyAxIEludHJvZHVjdGlvbg0KDQpJbiB0aGlzIGFzc2lnbm1lbnQsIHdlIGFyZSB0YXNrZWQgd2l0aCBjcmVhdGluZyBkaWZmZXJlbnQgbXVsdGlwbGUgcmVncmVzc2lvbiBtb2RlbHMgc28gd2UgY2FuIGluY29ycG9yYXRlIG1vcmUgdmFyaWFibGVzIGludG8gdGhlIG1vZGVsLiBJIHdhbnQgdG8gdGFrZSBhIGxvb2sgYW5kIHNlZSB3aGljaCB2YXJpYWJsZXMgYXJlIG1vc3QgcHJlZGljdGl2ZSwgYW5kIHdoaWNoIG1vZGVsIGlzIHRoZSBiZXN0Lg0KDQojIDIgRGVzY3JpcHRpb24gb2YgRGF0YSBTZXQNCg0KICBUaGUgZGF0YSBzZXQgSSBjaG9zZSB3YXMgUmFpbHJvYWQgQWNjaWRlbnRzIGluIHRoZSBVLlMuIGluIDIwMTAuIFRoZSBkYXRhIHdhcyBjb2xsZWN0ZWQgdmlhIHNhZmV0eWRhdGEuZnJhLmRvdC5nb3YuIEluIGxhc3Qgd2VlaydzIHByb2plY3QsIEkgdXNlZCB0aGlzIGRhdGEgc2V0IHRvIGRldGVybWluZSBpZiB0aGUgbnVtYmVyIG9mIENhcnMgRGVyYWlsZWQgcG9zaXRpdmVseSBjb3JyZWxhdGVkIHdpdGggRXF1aXBtZW50IERhbWFnZSAoaW4gZG9sbGFycykuIFRoaXMgd2VlaywgSSB3YW50IHRvIGFkZCBUcmFjayBEYW1hZ2UgKGluIGRvbGxhcnMpIHRvIG15IG1vZGVsIGJlY2F1c2UgaXQgaGFkIHRoZSBzZWNvbmQgc3Ryb25nZXN0IGNvcnJlbGF0aW9uIGNvZWZmaWNpZW50IHIgZnJvbSBsYXN0IHdlZWsncyBjb3JyZWxhdGlvbiBtYXRyaXguIEknbSBnb2luZyB0byBzZWUgaG93IGFjY3VyYXRlbHkgQ2FycyBEZXJhaWxlZCBhbmQgVHJhY2sgRGFtYWdlIGNhbiBwcmVkaWN0IEVxdWlwbWVudCBEYW1hZ2UuDQogIA0KIyMgMi4xIFZhcmlhYmxlcw0KDQogICogUmFpbHJvYWQgKGNhdGVnb3JpY2FsKSAtIG5hbWUgb2YgcmFpbHJvYWQNCiAgKiBNb250aCAoY2F0ZWdvcmljYWwpDQogICogRGF5IChjYXRlZ29yaWNhbCkgLSBkYXlzIG9mIHRoZSB3ZWVrIGxhYmVsZWQgMSB0aHJvdWdoIDcNCiAgKiBTdGF0ZSAoY2F0ZWdvcmljYWwpDQogICogQ291bnR5IChjYXRlZ29yaWNhbCkNCiAgKiBUcmFjayBUeXBlIChjYXRlZ29yaWNhbCkNCiAgKiBUcmFjayBNYW5hZ2VtZW50IChjYXRlZ29yaWNhbCkNCiAgKiBBY2NpZGVudCBUeXBlIChjYXRlZ29yaWNhbCkNCiAgKiBBY2NpZGVudCBDYXVzZSAoY2F0ZWdvcmljYWwpDQogICogRXF1aXBtZW50IERhbWFnZSAobnVtZXJpY2FsKSAtIGFtb3VudCBvZiBtb25leSBzcGVudCBvbiBkYW1hZ2VzDQogICogVHJhY2sgRGFtYWdlIChudW1lcmljYWwpIC0gYW1vdW50IG9mIG1vbmV5IHNwZW50IG9uIHRyYWNrIHJlcGFpcg0KICAqIEtpbGxlZCAobnVtZXJpY2FsKSAtIG51bWJlciBvZiBwZW9wbGUga2lsbGVkIGZyb20gYWNjaWRlbnQNCiAgKiBJbmp1cmVkIChudW1lcmljYWwpIC0gbnVtYmVyIG9mIHBlb3BsZSBpbmp1cmVkIGZyb20gYWNjaWRlbnQNCiAgKiBSUkVxdWlwIChjYXRlZ29yaWNhbCkgLSB0eXBlIG9mIHRyYWluDQogICogU3BlZWQgKG51bWVyaWNhbCkgLSBtcGggdGhlIHRyYWluIHdhcyBnb2luZyBhdCBkdXJpbmcgaW1wYWN0DQogICogTG9jb21vdGl2ZXMgRGVyYWlsZWQgKG51bWVyaWNhbCkgLSB0aGUgbnVtYmVyIG9mIGxvY29tb3RpdmVzIGRlcmFpbGVkDQogICogQ2FycyBEZXJhaWxlZCAobnVtZXJpY2FsKSAtIHRoZSBudW1iZXIgb2YgQ2FycyBEZXJhaWxlZA0KDQojIDMgTWV0aG9kb2xvZ3kgYW5kIEFuYWx5c2lzDQoNCiAgSSBhbSBnb2luZyB0byBjcmVhdGUgdHdvIG11bHRpcGxlIGxpbmVhciByZWdyZXNzaW9uIG1vZGVsczogb25lIHdpdGggQ2FycyBEZXJhaWxlZCBhbmQgVHJhY2sgRGFtYWdlIGJlaW5nIGFkZGVkIHRvZ2V0aGVyLCBhbmQgb25lIHdpdGggdGhlIHR3byB2YXJpYWJsZXMgYmVpbmcgbXVsdGlwbGllZCAoaW50ZXJhY3RlZCkgdG9nZXRoZXIuIFRoZXJlIGlzIGEgcG9zc2liaWxpdHkgdGhhdCBhIHNpbmdsZSBkZXJhaWxlZCBjYXIgY2F1c2VzIG1vcmUgZGFtYWdlIGlmIHRoZSB0cmFjayBpcyBhbHJlYWR5IGJhZGx5IGRhbWFnZWQuIElmIHRoYXQncyB0aGUgY2FzZSwgdGhlbiB0aGUgaW50ZXJhY3Rpb24gbW9kZWwgd291bGQgYmUgbW9yZSBhcHByb3ByaWF0ZSB0byB1c2UuIFdlIHdpbGwgYmUgZHJvcHBpbmcgYWxsIG9mIHRoZSBvdGhlciB2YXJpYWJsZXMgbWVudGlvbmVkIGluICMyLiANCiAgDQojIDQgTW9kZWwgMTogTWFpbiBFZmZlY3RzIE1vZGVsDQoNCiAgV2UgYXJlIGdvaW5nIHRvIHN0YXJ0IHdpdGggdGhlIE1MUiBtb2RlbCB3aXRob3V0IHRoZSBpbnRlcmFjdGlvbiB0ZXJtLiANCiAgDQojIyA0LjEgSW5mZXJlbnRpYWwgU3RhdGlzdGljcw0KDQpgYGB7cn0NCiMgTXVsdGlwbGUgTGluZWFyIFJlZ3Jlc3Npb24NCm1vZGVsMSA8LSBsbShFcXBEYW1nIH4gQ2Fyc0RlciArIFRya0RhbWcsIGRhdGEgPSBteURhdGEpDQoNCiMgU3VtbWFyeSBvZiB0aGUgbW9kZWwNCnN1bW1hcnkobW9kZWwxKQ0KYGBgDQoNCkxvb2tpbmcgYXQgdGhlIGluZmVyZW50aWFsIHN0YXRpc3RpY3MsIENhcnMgRGVyYWlsZWQgYW5kIFRyYWNrIERhbWFnZSBhcmUgYm90aCBoaWdobHkgc2lnbmlmaWNhbnQuIFRoZSBpbnRlcmNlcHQgaXMgbm90IHN0YXRpc3RpY2FsbHkgc2lnbmlmaWNhbnQuIEZvciBlYWNoIGFkZGl0aW9uYWwgY2FyIGRlcmFpbGVkICgyNSwzODAsIHAgPCAyZS0xNiksIEVxdWlwbWVudCBEYW1hZ2UgaW5jcmVhc2VzIGJ5IGFib3V0IFwkMjUsMzgwLCBob2xkaW5nIFRyYWNrIERhbWFnZSBjb25zdGFudC4gRm9yIGVhY2ggYWRkaXRpb25hbCBkb2xsYXIgc3BlbnQgb24gVHJhY2sgRGFtYWdlICgwLjU0LCBwIDwgMmUtMTYpLCBFcXVpcG1lbnQgRGFtYWdlIGluY3JlYXNlcyBieSBhYm91dCBcJDAuNTQsIGhvbGRpbmcgQ2FycyBEZXJhaWxlZCBjb25zdGFudC4gVGhpcyBtb2RlbCBleHBsYWlucyA0Ny4yOSUgb2YgdGhlIHZhcmlhdGlvbiBpbiBFcXVpcG1lbnQgRGFtYWdlLiBUaGUgbW9kZWwgaXMgaGlnaGx5IHNpZ25pZmljYW50IChGID0gMTE3NiwgcCA9IDApDQoNCiMjIDQuMiBSZXNpZHVhbCBBbmFseXNpcw0KDQpgYGB7ciwgZmlnLndpZHRoPTgsIGZpZy5oZWlnaHQ9Nn0NCiMgRml0IG1vZGVsIHdpdGhvdXQgaW50ZXJhY3Rpb24NCm1vZGVsMSA8LSBsbShFcXBEYW1nIH4gQ2Fyc0RlciArIFRya0RhbWcsIGRhdGEgPSBteURhdGEpDQojIFBsb3QgcmVzaWR1YWxzIHZzIGZpdHRlZCB0byBjaGVjayBhc3N1bXB0aW9ucw0KcGFyKG1mcm93ID0gYygyLDIpKQ0KcGxvdChtb2RlbDEpDQpwYXIobWZyb3cgPSBjKDEsMSkpDQpgYGAgDQogIA0KVGhlIFJlc2lkdWFscyB2cyBGaXR0ZWQgcGxvdCBzaG93cyB0aGVyZSBpcyBubyBjb25zdGFudCB2YXJpYW5jZSBpbiB0aGUgcmVzaWR1YWxzLiBUaGUgUS1RIFJlc2lkdWFscyBzaG93cyBtdWx0aXBsZSBvdXRsaWVycyBhbmQgdHdvIHN0cm9uZyB0YWlscywgaW5kaWNhdGluZyBub24tbm9ybWFsaXR5LiBUaGUgU2NhbGUgTG9jYXRpb24gcGxvdCBzaG93cyBhIGxhY2sgb2YgY29uc3RhbnQgdmFyaWFuY2UgYW5kIHRoZSBSZXNpZHVhbHMgdnMgTGV2ZXJhZ2UgcGxvdCBzaG93cyBhbiBvdXRsaWVyIGF0IDM5MC4gVGhlIGFzc3VtcHRpb25zIGZvciBub3JtYWxpdHkgYXJlIG5vdCBtZXQuIA0KDQojIDUgTW9kZWwgMjogSW50ZXJhY3Rpb24gVGVybSANCg0KICBOb3csIEkgYW0gZ29pbmcgdG8gaW5jb3Jwb3JhdGUgdGhlIGludGVyYWN0aW9uIHRlcm0sIENhcnNEZXI6VHJrRGFtZywgZXhjbHVkZSB0aGUgbWFpbiBlZmZlY3RzLCBhbmQgc2VlIGlmIHRoZSBSLXNxdWFyZWQgdmFsdWUgaW5jcmVhc2VkIGFuZCBpZiB0aGUgaW50ZXJhY3Rpb24gdGVybSBpcyBzdGF0aXN0aWNhbGx5IHNpZ25pZmljYW50LiBJJ2xsIGFsc28gYmUgbG9va2luZyB0byBzZWUgaWYgdGhlIG1vZGVsIGFzIGEgd2hvbGUgaXMgc2lnbmlmaWNhbnQuIElmIGl0J3Mgbm90LCB0aGVuIEknbGwgYmUgcmVtb3ZpbmcgdGhlIHRlcm0gYW5kIGdvIGZvcndhcmQgd2l0aCB0aGUgTUxSIG1vZGVsLiANCg0KIyA1LjEgSW5mZXJlbnRpYWwgU3RhdGlzdGljcw0KDQpgYGB7cn0NCiMgTXVsdGlwbGUgTGluZWFyIFJlZ3Jlc3Npb24gd2l0aCBJbnRlcmFjdGlvbg0KbW9kZWwyIDwtIGxtKEVxcERhbWcgfiBDYXJzRGVyOlRya0RhbWcsIGRhdGEgPSBteURhdGEpDQoNCiMgU3VtbWFyeSBvZiB0aGUgbW9kZWwNCnN1bW1hcnkobW9kZWwyKQ0KYGBgDQoNCkZvciBlYWNoIGFkZGl0aW9uYWwgdW5pdCBpbmNyZWFzZSBpbiBDYXJzRGVyOlRya0RhbWcsIEVxdWlwbWVudCBEYW1hZ2UgaW5jcmVhc2VzIGJ5ICQwLjA3LiBUaGUgaW50ZXJhY3Rpb24gdGVybSBpcyBoaWdobHkgc2lnbmlmaWNhbnQgKEYgPSAyMTU1LCBwID0gMCkuIFRoaXMgbW9kZWwgZXhwbGFpbnMgNDUuMTIlIG9mIHRoZSB2YXJpYXRpb24gaW4gRXF1aXBtZW50IERhbWFnZS4gDQoNCiMjIDUuMiBSZXNpZHVhbCBBbmFseXNpcw0KDQpgYGB7cn0NCiMgRml0IHRoZSBpbnRlcmFjdGlvbiBtb2RlbA0KbW9kZWwyIDwtIGxtKEVxcERhbWcgfiBDYXJzRGVyOlRya0RhbWcsIGRhdGEgPSBteURhdGEpDQoNCiMgUmVzaWR1YWwgZGlhZ25vc3RpY3MNCnBhcihtZnJvdyA9IGMoMiwyKSkgICMgc2hvdyA0IHBsb3RzIHRvZ2V0aGVyDQpwbG90KG1vZGVsMikNCnBhcihtZnJvdyA9IGMoMSwxKSkgICMgcmVzZXQgbGF5b3V0DQpgYGANCg0KVGhlIFJlc2lkdWFscyB2cyBGaXR0ZWQgcGxvdCBzaG93cyB0aGVyZSBpcyBubyBjb25zdGFudCB2YXJpYW5jZSBpbiB0aGUgcmVzaWR1YWxzLiBUaGUgUS1RIFJlc2lkdWFscyBzaG93cyBtdWx0aXBsZSBvdXRsaWVycyBhbmQgb25lIHN0cm9uZyB0YWlsLCBzaG93aW5nIG5vbi1ub3JtYWxpdHkuIFRoZSBTY2FsZSBMb2NhdGlvbiBwbG90IHNob3dzIGEgbGFjayBvZiBjb25zdGFudCB2YXJpYW5jZSBhbmQgdGhlIFJlc2lkdWFscyB2cyBMZXZlcmFnZSBwbG90IHNob3dzIGFuIG91dGxpZXIgYXQgMTQxNC4gQWxsIGluIGFsbCwgdGhlIGFzc3VtcHRpb25zIGZvciBub3JtYWxpdHkgYXJlIG5vdCBtZXQuDQoNCiMgNiBNb2RlbCAzOiBJbnRlcmFjdGlvbiBUZXJtIHdpdGggTWFpbiBFZmZlY3RzDQoNCkZpbmFsbHksIEkgd2lsbCBiZSB1c2luZyBib3RoIG1haW4gZWZmZWN0cyBhbmQgdGhlaXIgaW50ZXJhY3Rpb24gdGVybSB0byBjcmVhdGUgTW9kZWwgMy4NCg0KIyMgNi4xIEluZmVyZW50aWFsIFN0YXRpc3RpY3MNCg0KYGBge3J9DQojIE1vZGVsIDM6IENhcnNEZXIgKyBUcmtEYW1nICsgQ2Fyc0RlcjpUcmtEYW1nDQptb2RlbDMgPC0gbG0oRXFwRGFtZyB+IENhcnNEZXIgKyBUcmtEYW1nICsgQ2Fyc0RlcjpUcmtEYW1nLCBkYXRhID0gbXlEYXRhKQ0KDQojIFN1bW1hcnkgb2YgdGhlIG1vZGVsDQpzdW1tYXJ5KG1vZGVsMykNCmBgYA0KQ2FycyBEZXJhaWxlZCAoMTcsMzUwLCBwIDwgMmUtMTYpLCBUcmFjayBEYW1hZ2UgKDAuMDczLCBwID0gMC4wOTUpLCBhbmQgdGhlaXIgaW50ZXJhY3Rpb24gdGVybSAocCA9IDApIGFyZSBhbGwgc3RhdGlzdGljYWxseSBzaWduaWZpY2FudC4gU2luY2UgdGhlIGludGVyYWN0aW9uIHRlcm0gaXMgc2lnbmlmaWNhbnQsIHRoaXMgbWVhbnMgdGhhdCB0aGUgdmFyaWFibGVzIGRlcGVuZCBvbiBlYWNoIG90aGVyLiBUaGUgZWZmZWN0IG9mIENhcnMgRGVyYWlsZWQgb24gRXF1aXBtZW50IERhbWFnZSBncm93cyBhcyBUcmFjayBEYW1hZ2UgZ3Jvd3MuIFdoZW4gYm90aCBDYXJzIERlcmFpbGVkIGFuZCBUcmFjayBEYW1hZ2UgYXJlIHplcm8sIHRoZSBleHBlY3RlZCBFcXVpcG1lbnQgRGFtYWdlIGlzIFwkMzQwMC4gVGhlIGludGVyY2VwdCBpcyBub3Qgc3RhdGlzdGljYWxseSBzaWduaWZpY2FudC4gRm9yIGVhY2ggYWRkaXRpb25hbCBjYXIgZGVyYWlsZWQsIEVxdWlwbWVudCBEYW1hZ2UgaW5jcmVhc2VzIGJ5IGFib3V0IFwkMTcsMzUwIG9uIGF2ZXJhZ2UsIGhvbGRpbmcgVHJhY2sgRGFtYWdlIGNvbnN0YW50IGF0IHplcm8uIEVhY2ggYWRkaXRpb25hbCBkb2xsYXIgb2YgVHJhY2sgRGFtYWdlIGlzIGFzc29jaWF0ZWQgd2l0aCBhYm91dCBcJDAuMDcgb2YgYWRkaXRpb25hbCBFcXVpcG1lbnQgRGFtYWdlLiBUaGlzIG1vZGVsIGV4cGxhaW5zIDUzLjM5JSBvZiB0aGUgdmFyaWF0aW9uIGluIEVxdWlwbWVudCBEYW1hZ2UuIFRoZSBtb2RlbCBpcyBoaWdobHkgc2lnbmlmaWNhbnQgKEYgPSA5OTcuMywgcCA9IDApLg0KDQojIyA2LjIgUmVzaWR1YWwgQW5hbHlzaXMNCg0KYGBge3J9DQojIFJlc2lkdWFsIGRpYWdub3N0aWMgcGxvdHMNCnBhcihtZnJvdyA9IGMoMiwyKSkNCnBsb3QobW9kZWwzKQ0KcGFyKG1mcm93ID0gYygxLDEpKSAgIyByZXNldA0KYGBgDQoNClRoZSBhc3N1bXB0aW9ucyBvZiBub3JtYWxpdHkgYXJlIG5vdCBtZXQuIFRoZXJlIGlzIG5vIGNvbnN0YW50IHZhcmlhbmNlIGluIHRoZSBSZXNpZHVhbHMgdnMgRml0dGVkIHBsb3QsIHRoZXJlIGlzIGEgc3Ryb25nIHJpZ2h0IHRhaWwgaW4gdGhlIFEtUSBSZXNpZHVhbHMgcGxvdCwgdGhlIFNjYWxlIExvY2F0aW9uIHBsb3QgZG9lcyBub3Qgc2hvdyBjb25zdGFudCB2YXJpYW5jZSwgYW5kIHRoZXJlIGlzIG9uZSBvdXRsaWVyLCAxNDE0LCBpbiB0aGUgUmVzaWR1YWxzIHZzIExldmVyYWdlIHBsb3QuIA0KDQojIDcgQU5PVkENCg0KYGBge3J9DQphbm92YShtb2RlbDEsIG1vZGVsMiwgbW9kZWwzKQ0KYGBgDQoNClRoZSBBTk9WQSB0YWJsZSBzaG93cyB0aGF0IGFkZGluZyB0aGUgaW50ZXJhY3Rpb24gdGVybSB0byB0aGUgbWFpbiBlZmZlY3RzIHNpZ25pZmljYW50bHkgaW1wcm92ZXMgdGhlIG1vZGVsLiBBcyBhIHJlc3VsdCwgTW9kZWwgMyBpcyB0aGUgYmVzdCBtb2RlbCBiZWNhdXNlIGl0IHJlZHVjZXMgcmVzaWR1YWwgdmFyaWF0aW9uIHRoZSBtb3N0LiBNb2RlbCAyIGlzIHRoZSB3b3JzdCBvZiB0aGUgdGhyZWUgbW9kZWxzIGJlY2F1c2UgaXQgZG9lc24ndCB0YWtlIGludG8gYWNjb3VudCB0aGUgaW5mbHVlbmNlIHRoYXQgdGhlIGluZGVwZW5kZW50IG1haW4gZWZmZWN0cyBoYXZlIG9uIHRoZSBtb2RlbC4gTW9kZWwgMiBhbHNvIGhhcyB0aGUgaGlnaGVzdCByZXNpZHVhbCBzdW0gb2Ygc3F1YXJlcywgbWVhbmluZyB0aGVyZSBpcyBtb3JlIHVuZXhwbGFpbmVkIHZhcmlhdGlvbiBpbiB0aGlzIG1vZGVsIGNvbXBhcmVkIHRvIHRoZSBvdGhlciB0d28uDQoNCiMgOCBOb25wYXJhbWV0cmljIFRlc3RzDQoNCldlIGFyZSBnb2luZyB0byBtb3ZlIGZvcndhcmQgd2l0aCBNb2RlbCAzIGJlY2F1c2Ugd2UgZXN0YWJsaXNoZWQgaXQgYXMgdGhlIGJlc3Qgb2YgdGhlIHRocmVlLiBJIHdpbGwgYmUgY29uZHVjdGluZyBhIEJveC1Db3ggdHJhbnNmb3JtYXRpb24gYW5kIEJvb3RzdHJhcCBjb25maWRlbmNlIGludGVydmFscyBiZWNhdXNlIHRoZSBhc3N1bXB0aW9ucyBmb3Igbm9ybWFsaXR5IHdlcmUgbm90IG1ldC4NCg0KIyMgOC4xIEJveC1Db3ggVHJhbnNmb3JtYXRpb24NCg0KYGBge3J9DQoNCmxpYnJhcnkoTUFTUykNCg0KIyBTaGlmdCB0aGUgcmVzcG9uc2UgdG8gbWFrZSBhbGwgdmFsdWVzIHBvc2l0aXZlDQpteURhdGEkRXFwRGFtZ19wb3MgPC0gbXlEYXRhJEVxcERhbWcgKyBhYnMobWluKG15RGF0YSRFcXBEYW1nKSkgKyAxDQoNCiMgRml0IE1vZGVsIDM6IENhcnNEZXIgKyBUcmtEYW1nICsgaW50ZXJhY3Rpb24NCm1vZGVsM19wb3MgPC0gbG0oRXFwRGFtZ19wb3MgfiBDYXJzRGVyICsgVHJrRGFtZyArIENhcnNEZXI6VHJrRGFtZywgZGF0YSA9IG15RGF0YSkNCg0KIyBCb3gtQ294IHRyYW5zZm9ybWF0aW9uDQpiYyA8LSBib3hjb3gobW9kZWwzX3BvcywNCiAgICAgICAgICAgICBsYW1iZGEgPSBzZXEoLTIsIDIsIDAuMSksDQogICAgICAgICAgICAgbGFtYmRhLmxhYiA9ICJMYW1iZGEiLA0KICAgICAgICAgICAgIHlsYWIgPSAiTG9nLUxpa2VsaWhvb2QiLA0KICAgICAgICAgICAgIG1haW4gPSAiQm94LUNveCBUcmFuc2Zvcm1hdGlvbiBmb3IgTW9kZWwgMyIpDQoNCiMgSWRlbnRpZnkgbGFtYmRhIHRoYXQgbWF4aW1pemVzIGxvZy1saWtlbGlob29kDQpsYW1iZGFfb3B0IDwtIGJjJHhbd2hpY2gubWF4KGJjJHkpXQ0KbGFtYmRhX29wdA0KYGBgDQoNCkkgY29uZHVjdGVkIGEgQm94LUNveCB0cmFuc2Zvcm1hdGlvbiB0byBhc3Nlc3Mgd2hldGhlciB0cmFuc2Zvcm1pbmcgRXF1aXBtZW50IERhbWFnZSB3b3VsZCBpbXByb3ZlIHRoZSBtb2RlbCBhc3N1bXB0aW9ucy4gU2luY2UgzrsgPSAxIGlzIHdpdGhpbiB0aGUgY29uZmlkZW5jZSBpbnRlcnZhbCwgbm8gdHJhbnNmb3JtYXRpb24gaXMgbmVlZGVkLg0KDQojIyA4LjIgQm9vdHN0cmFwIENvbmZpZGVuY2UgSW50ZXJ2YWxzDQoNCmBgYHtyIGJvb3RzdHJhcCBzZXR1cH0NCmxpYnJhcnkoYm9vdCkNCg0KIyBEZWZpbmUgZnVuY3Rpb24gdG8gZXh0cmFjdCBjb2VmZmljaWVudHMNCmJvb3RfY29lZiA8LSBmdW5jdGlvbihkYXRhLCBpbmRpY2VzKSB7DQogIGQgPC0gZGF0YVtpbmRpY2VzLCBdICAjIHJlc2FtcGxlIHJvd3MNCiAgZml0IDwtIGxtKEVxcERhbWcgfiBDYXJzRGVyICsgVHJrRGFtZyArIENhcnNEZXI6VHJrRGFtZywgZGF0YSA9IGQpDQogIHJldHVybihjb2VmKGZpdCkpDQp9DQoNCiMgUnVuIGJvb3RzdHJhcA0Kc2V0LnNlZWQoMTIzKSAgIyBmb3IgcmVwcm9kdWNpYmlsaXR5DQpib290X3Jlc3VsdHMgPC0gYm9vdChkYXRhID0gbXlEYXRhLCBzdGF0aXN0aWMgPSBib290X2NvZWYsIFIgPSAxMDAwKSAgIyAxMDAwIHJlc2FtcGxlcw0KDQojIENyZWF0ZSBhIHRpZHkgdGFibGUgb2YgOTUlIHBlcmNlbnRpbGUgQ0lzIGZvciBhbGwgY29lZmZpY2llbnRzDQpjb2VmX25hbWVzIDwtIG5hbWVzKGNvZWYobW9kZWwzKSkNCmNpX2xpc3QgPC0gbGFwcGx5KDE6bGVuZ3RoKGNvZWZfbmFtZXMpLCBmdW5jdGlvbihpKSB7DQogIGNpIDwtIGJvb3QuY2koYm9vdF9yZXN1bHRzLCB0eXBlID0gInBlcmMiLCBpbmRleCA9IGkpJHBlcmNlbnRbNDo1XQ0KICBkYXRhLmZyYW1lKENvZWZmaWNpZW50ID0gY29lZl9uYW1lc1tpXSwNCiAgICAgICAgICAgICBMb3dlcjk1ID0gY2lbMV0sDQogICAgICAgICAgICAgVXBwZXI5NSA9IGNpWzJdKQ0KfSkNCg0KY2lfdGFibGUgPC0gZG8uY2FsbChyYmluZCwgY2lfbGlzdCkNCnByaW50KGNpX3RhYmxlKQ0KYGBgDQoNClRoZSBDYXJzIERlcmFpbGVkIGludGVydmFsIGlzIGVudGlyZWx5IHBvc2l0aXZlLiBUaGlzIGluZGljYXRlcyBzdHJvbmcgZXZpZGVuY2Ugb2YgYSBwb3NpdGl2ZSBlZmZlY3QuIFdlIGFyZSA5NSUgY29uZmlkZW50IHRoYXQgdGhlIHNsb3BlIG9mIENhcnMgRGVyYWlsZWQgaXMgYmV0d2VlbiAxMiw4MDAgYW5kIDIxLDcwMC4gVGhlIGludGVydmFsIGZvciBUcmFjayBEYW1hZ2UgaW5jbHVkZXMgMCwgd2hpY2ggbWVhbnMgdGhlIGVmZmVjdCBhbG9uZSBtYXkgbm90IGhhdmUgYSBjb25zaXN0ZW50IGVmZmVjdCBvbiBFcXVpcG1lbnQgRGFtYWdlLiBXZSBhcmUgOTUlIGNvbmZpZGVudCB0aGF0IHRoZSBzbG9wZSBvZiBUcmFjayBEYW1hZ2UgaXMgYmV0d2VlbiAtMC4xMjQgYW5kIDAuMzIyLiBUaGUgaW50ZXJ2YWwgZm9yIHRoZSBpbnRlcmFjdGlvbiB0ZXJtIGlzIGVudGlyZWx5IHBvc2l0aXZlLCBtZWFuaW5nIHRoZSBpbnRlcmFjdGlvbiBpcyBtZWFuaW5nZnVsLiBXZSBhcmUgOTUlIGNvbmZpZGVudCB0aGF0IHRoZSBzbG9wZSBvZiB0aGUgaW50ZXJhY3Rpb24gdGVybSBpcyBiZXR3ZWVuIDAuMDMgYW5kIDAuMDYuDQoNCiMgOSBDb25jbHVzaW9uDQoNCiAgSW4gY29uY2x1c2lvbiwgdGhlIG1vZGVsIHdpdGggdGhlIGludGVyYWN0aW9uIHRlcm0gYW5kIGJvdGggbWFpbiBlZmZlY3RzLCBNb2RlbCAzLCB3YXMgdGhlIGJlc3QgbW9kZWwgb2YgdGhlIHRocmVlLiBJdCBleHBsYWluZWQgdGhlIGhpZ2hlc3QgdmFyaWF0aW9uIGluIEVxdWlwbWVudCBEYW1hZ2UgKDUzLjI5JSkuIFdlIGFyZSBjZXJ0YWluIHRoYXQgdGhlIG1haW4gZWZmZWN0IG9mIENhcnMgRGVyYWlsZWQgaXMgc2lnbmlmaWNhbnQsIGJ1dCBhcmUgdW5zdXJlIGlmIFRyYWNrIERhbWFnZSBhbG9uZSBpcyBzaWduaWZpY2FudCBiZWNhdXNlIGl0cyA5NSUgYm9vdHN0cmFwIGludGVydmFsIGNvbnRhaW5zIDAuIFRoZSBpbnRlcmFjdGlvbiB0ZXJtIGlzIHN0YXRpc3RpY2FsbHkgc2lnbmlmaWNhbnQsIG1lYW5pbmcgdGhhdCB0aGUgZWZmZWN0IG9mIENhcnMgRGVyYWlsZWQgZGVwZW5kcyBvbiBUcmFjayBEYW1hZ2UgYW5kIHZpY2UgdmVyc2EuIA0KICANCiMgMTAgUmVmZXJlbmNlcw0KDQpzYWZldHlkYXRhLmZyYS5kb3QuZ292DQoNCg0KDQo=