Introduction
In this assignment we will be looking at logistic regression models,
odds ratio, and success probability curves. We will specifically be
looking at team wins and team total points in this assignment. We want
to see how much your team scores affects the outcome of the game.
Data Description
This data set is on the NBA game betting odds and outcomes of the
2014-2015 Season. There is 1230 observations and 17 variables. The
variables in this data set are
- Datenum (categorical)- This is the amount of days since January 1,
1960
- Team (categorical)- Where the home team is from
- Dateslash (numerical)- MM/DD/YYYY
- OppTeam (categorical)- Where the away team is from
- Home (binary reponse)- If the “Team” is the home team (always
is)
- TeamPts (numerical)- Home team points scored
- OppPts (numerical)- Away team points scored
- OT (binary reponse)- If the game went to OT (1 means OT happened, 0
means OT didn’t happen)
- Wins (binary response)- If the home team won (1 means they won, 0
means they lost)
- TeamCov (binary response) - If the home team covered the spread (1
means they covered, 0 means a “push”, and -1 means they didn’t
cover)
- TeamSprd (numerical)- The Vegas point spread for the home team
- OvrUndr (numerical)- The over/under Vegas line for the total points
in the game
- OUCov (binary response)- If the game went over or under the Vegas
line (1 means it went over, 0 means it was exactly the line, and -1
means it went under)
- Team_id (numerical)- Numeric ID for Home Team
- OppTeam_id (numerical)- Numeric ID for Away Team
- TeamDiff(numerical)- Home Points minus Away Points
- TotalPts (numerical)- Home Points plus Away Points
Analytical
Question
The objective for this study is to find if there is an association
between team points and getting a win.
Building the Simple
Logistic Regression
We need to build a model and check the predictor variable. We will
then need to look at odds ratios, success probability curves, and
goodness of fit measurements.
In order to build the simple logistic regression we need to check and
make sure the predictor variable is not extremely skewed.

Looking at this, I can tell that there is no issue of potential
imbalance due to this having a normal distribution. So, I will not
transform TeamPts and will fit a logistic regression directly to the
data.
Call:
glm(formula = wins ~ TeamPts, family = binomial(link = "logit"),
data = bets)
Coefficients:
Estimate Std. Error z value Pr(>|z|)
(Intercept) -9.884391 0.714528 -13.83 <2e-16 ***
TeamPts 0.101593 0.007148 14.21 <2e-16 ***
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
(Dispersion parameter for binomial family taken to be 1)
Null deviance: 1677.5 on 1229 degrees of freedom
Residual deviance: 1394.3 on 1228 degrees of freedom
AIC: 1398.3
Number of Fisher Scoring iterations: 4
The response variable is a binary factor variable. In this case,
“loss” = 0 and “win” = 1. Looking at this table we can see how the
p-value (p<0.001) is significant in this model.
The summary of major statistics is below.
Summary of regression coefficients
| (Intercept) |
-9.8843908 |
0.7145284 |
-13.83345 |
0 |
-11.317928 |
-8.5152896 |
| TeamPts |
0.1015934 |
0.0071481 |
14.21262 |
0 |
0.087907 |
0.1159441 |
Looking at the table above we can see that Team Points is closely
associated with winning due to the p-value being close to zero. Also it
is significant that 0 is not found in the 95% confidence interval. This
shows that there is a significant connection so far between winning and
how many points your team scores.
Now we convert the estimated regression coefficients to the odds
ratio.
Summary Stats with Odds Ratios
| (Intercept) |
-9.8843908 |
0.7145284 |
-13.83345 |
0 |
0.000051 |
| TeamPts |
0.1015934 |
0.0071481 |
14.21262 |
0 |
1.106933 |
Looking at the table above, we can see that the odds ratio for team
points is 1.1. This means that team points increases by one unit, the
odds of winning increase by about 10%. This is a practically significant
factor for winning.
The global goodness-of-fit measures are summarized below.
We do not have enough evidence to interpret these measures since the
global goodness-of-fit is based on the likelihood function and we do not
have anything to compare it to. We would need other candidate models in
order to compare.
Now we will make the success probability curve below.

Looking at these curves we can see that on the left it shows that as
team points go up, the probability of winning goes up. Looking at the
curve on the right we can see that the rate of change in the probability
of winning increases when Team Points is less than 100 and decreases
when Team Points is greater than 100. The turning point is about
100.
Conclusion
This assignment has gone through and shown the simple logistic
regression model, odds ratio of the estimated regression coefficients,
the goodness-of-fit measures, the success probability curve, and the
rate of change curve.
From this assignment we can see that team points is highly correlated
with winning games. With my past experience that makes sense due to how
better offenses have been a more prevelent thing in the NBA
nowadays.
LS0tCnRpdGxlOiAiVGVhbSBQb2ludHMgdnMgV2lucyIKYXV0aG9yOiAiUnlhbiBMZWJvIgpkYXRlOiAiMjAyNC0xMC0yMiIKb3V0cHV0OiAKICBodG1sX2RvY3VtZW50OgogICAgdG9jOiB5ZXMKICAgIHRvY19kZXB0aDogNAogICAgdG9jX2Zsb2F0OiB5ZXMKICAgIGZpZ193aWR0aDogNAogICAgZmlnX2NhcHRpb246IHllcwogICAgbnVtYmVyX3NlY3Rpb25zOiB5ZXMKICAgIHRvY19jb2xsYXBzZWQ6IHllcwogICAgY29kZV9mb2xkaW5nOiBoaWRlCiAgICBjb2RlX2Rvd25sb2FkOiB5ZXMKICAgIHNtb290aF9zY3JvbGw6IHllcwogICAgdGhlbWU6IGx1bWVuCiAgd29yZF9kb2N1bWVudDoKICAgIHRvYzogeWVzCiAgICB0b2NfZGVwdGg6IDQKICAgIGZpZ19jYXB0aW9uOiB5ZXMKICAgIGtlZXBfbWQ6IHllcwogIHBkZl9kb2N1bWVudDoKICAgIHRvYzogeWVzCiAgICB0b2NfZGVwdGg6IDQKICAgIGZpZ19jYXB0aW9uOiB5ZXMKICAgIG51bWJlcl9zZWN0aW9uczogeWVzCiAgICBmaWdfd2lkdGg6IDMKICAgIGZpZ19oZWlnaHQ6IDMKZWRpdG9yX29wdGlvbnM6CiAgY2h1bmtfb3V0cHV0X3R5cGU6IGlubGluZQpzbHdheXNfYWxsb3dfaHRtbDogdHJ1ZQotLS0KCmBgYHs9aHRtbH0KCjxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+CgovKiBDYXNjYWRpbmcgU3R5bGUgU2hlZXRzIChDU1MpIGlzIGEgc3R5bGVzaGVldCBsYW5ndWFnZSB1c2VkIHRvIGRlc2NyaWJlIHRoZSBwcmVzZW50YXRpb24gb2YgYSBkb2N1bWVudCB3cml0dGVuIGluIEhUTUwgb3IgWE1MLiBpdCBpcyBhIHNpbXBsZSBtZWNoYW5pc20gZm9yIGFkZGluZyBzdHlsZSAoZS5nLiwgZm9udHMsIGNvbG9ycywgc3BhY2luZykgdG8gV2ViIGRvY3VtZW50cy4gKi8KCmgxLnRpdGxlIHsgIC8qIFRpdGxlIC0gZm9udCBzcGVjaWZpY2F0aW9ucyBvZiB0aGUgcmVwb3J0IHRpdGxlICovCiAgZm9udC1zaXplOiAyNHB4OwogIGNvbG9yOiBEYXJrUmVkOwogIHRleHQtYWxpZ246IGNlbnRlcjsKICBmb250LWZhbWlseTogIkdpbGwgU2FucyIsIHNhbnMtc2VyaWY7Cn0KaDQuYXV0aG9yIHsgLyogSGVhZGVyIDQgLSBmb250IHNwZWNpZmljYXRpb25zIGZvciBhdXRob3JzICAqLwogIGZvbnQtc2l6ZTogMjBweDsKICBmb250LWZhbWlseTogc3lzdGVtLXVpOwogIGNvbG9yOiBEYXJrUmVkOwogIHRleHQtYWxpZ246IGNlbnRlcjsKfQpoNC5kYXRlIHsgLyogSGVhZGVyIDQgLSBmb250IHNwZWNpZmljYXRpb25zIGZvciB0aGUgZGF0ZSAgKi8KICBmb250LXNpemU6IDE4cHg7CiAgZm9udC1mYW1pbHk6IHN5c3RlbS11aTsKICBjb2xvcjogRGFya0JsdWU7CiAgdGV4dC1hbGlnbjogY2VudGVyOwp9CmgxIHsgLyogSGVhZGVyIDEgLSBmb250IHNwZWNpZmljYXRpb25zIGZvciBsZXZlbCAxIHNlY3Rpb24gdGl0bGUgICovCiAgICBmb250LXNpemU6IDIycHg7CiAgICBmb250LWZhbWlseTogIlRpbWVzIE5ldyBSb21hbiIsIFRpbWVzLCBzZXJpZjsKICAgIGNvbG9yOiBuYXZ5OwogICAgdGV4dC1hbGlnbjogY2VudGVyOwp9CmgyIHsgLyogSGVhZGVyIDIgLSBmb250IHNwZWNpZmljYXRpb25zIGZvciBsZXZlbCAyIHNlY3Rpb24gdGl0bGUgKi8KICAgIGZvbnQtc2l6ZTogMjBweDsKICAgIGZvbnQtZmFtaWx5OiAiVGltZXMgTmV3IFJvbWFuIiwgVGltZXMsIHNlcmlmOwogICAgY29sb3I6IG5hdnk7CiAgICB0ZXh0LWFsaWduOiBsZWZ0Owp9CgpoMyB7IC8qIEhlYWRlciAzIC0gZm9udCBzcGVjaWZpY2F0aW9ucyBvZiBsZXZlbCAzIHNlY3Rpb24gdGl0bGUgICovCiAgICBmb250LXNpemU6IDE4cHg7CiAgICBmb250LWZhbWlseTogIlRpbWVzIE5ldyBSb21hbiIsIFRpbWVzLCBzZXJpZjsKICAgIGNvbG9yOiBuYXZ5OwogICAgdGV4dC1hbGlnbjogbGVmdDsKfQoKaDQgeyAvKiBIZWFkZXIgNCAtIGZvbnQgc3BlY2lmaWNhdGlvbnMgb2YgbGV2ZWwgNCBzZWN0aW9uIHRpdGxlICAqLwogICAgZm9udC1zaXplOiAxOHB4OwogICAgZm9udC1mYW1pbHk6ICJUaW1lcyBOZXcgUm9tYW4iLCBUaW1lcywgc2VyaWY7CiAgICBjb2xvcjogZGFya3JlZDsKICAgIHRleHQtYWxpZ246IGxlZnQ7Cn0KCmJvZHkgeyBiYWNrZ3JvdW5kLWNvbG9yOndoaXRlOyB9CgouaGlnaGxpZ2h0bWUgeyBiYWNrZ3JvdW5kLWNvbG9yOnllbGxvdzsgfQoKcCB7IGJhY2tncm91bmQtY29sb3I6d2hpdGU7IH0KCjwvc3R5bGU+CmBgYApgYGB7ciBzZXR1cCwgaW5jbHVkZT1GQUxTRX0KIyBEZXRlY3QsIGluc3RhbGwsIGFuZCBsb2FkIHBhY2thZ2VzIGlmIG5lZWRlZC4KaWYgKCFyZXF1aXJlKCJrbml0ciIpKSB7CiAgIGluc3RhbGwucGFja2FnZXMoImtuaXRyIikKICAgbGlicmFyeShrbml0cikKfQppZiAoIXJlcXVpcmUoImxlYWZsZXQiKSkgewogICBpbnN0YWxsLnBhY2thZ2VzKCJsZWFmbGV0IikKICAgbGlicmFyeShsZWFmbGV0KQp9CmlmICghcmVxdWlyZSgiRW52U3RhdHMiKSkgewogICBpbnN0YWxsLnBhY2thZ2VzKCJFbnZTdGF0cyIpCiAgIGxpYnJhcnkoRW52U3RhdHMpCn0KaWYgKCFyZXF1aXJlKCJNQVNTIikpIHsKICAgaW5zdGFsbC5wYWNrYWdlcygiTUFTUyIpCiAgIGxpYnJhcnkoTUFTUykKfQppZiAoIXJlcXVpcmUoInBoeXRvb2xzIikpIHsKICAgaW5zdGFsbC5wYWNrYWdlcygicGh5dG9vbHMiKQogICBsaWJyYXJ5KHBoeXRvb2xzKQp9CmlmICghcmVxdWlyZSgibWxiZW5jaCIpKSB7CiAgIGluc3RhbGwucGFja2FnZXMoIm1sYmVuY2giKQogICBsaWJyYXJ5KG1sYmVuY2gpCn0KaWYgKCFyZXF1aXJlKCJwYW5kZXIiKSkgewogICBpbnN0YWxsLnBhY2thZ2VzKCJwYW5kZXIiKQogICBsaWJyYXJ5KHBhbmRlcikKfQojCiMgU3BlY2lmaWNhdGlvbnMgb2Ygb3V0cHV0cyBvZiBjb2RlIGluIGNvZGUgY2h1bmtzCmtuaXRyOjpvcHRzX2NodW5rJHNldChlY2hvID0gRkFMU0UsICAjIGluY2x1ZGUgY29kZSBjaHVuayBpbiB0aGUgb3V0cHV0IGZpbGUKICAgICAgICAgICAgICAgICAgIHdhcm5pbmcgPSBGQUxTRSwgICMgU29tZXRpbWVzLCB5b3VyIGNvZGUgbWF5IHByb2R1Y2UgYSB3YXJuaW5nCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIG1lc3NhZ2VzLCB5b3UgY2FuIGNob29zZSB0byBpbmNsdWRlIHRoZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyB3YXJuaW5nIG1lc3NhZ2VzIGluIHRoZSBvdXRwdXQgZmlsZS4gCiAgICAgICAgICAgICAgICAgICBtZXNzYWdlID0gRkFMU0UsICAKICAgICAgICAgICAgICAgICAgIHJlc3VsdHMgPSBUUlVFLCAgICMgeW91IGNhbiBhbHNvIGRlY2lkZSB3aGV0aGVyIHRvIGluY2x1ZGUgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIHRoZSBvdXRwdXQgaW4gdGhlIG91dHB1dCBmaWxlLgogICAgICAgICAgICAgICAgICAgY29tbWVudCA9IEZBTFNFICAgIyBTdXBwcmVzcyBoYXNoLXRhZ3MgaW4gdGhlIG91dHB1dCByZXN1bHRzLgogICAgICAgICAgICAgICAgICAgICAgKSAgIApgYGAKCiMgSW50cm9kdWN0aW9uCkluIHRoaXMgYXNzaWdubWVudCB3ZSB3aWxsIGJlIGxvb2tpbmcgYXQgbG9naXN0aWMgcmVncmVzc2lvbiBtb2RlbHMsIG9kZHMgcmF0aW8sIGFuZCBzdWNjZXNzIHByb2JhYmlsaXR5IGN1cnZlcy4gV2Ugd2lsbCBzcGVjaWZpY2FsbHkgYmUgbG9va2luZyBhdCB0ZWFtIHdpbnMgYW5kIHRlYW0gdG90YWwgcG9pbnRzIGluIHRoaXMgYXNzaWdubWVudC4gV2Ugd2FudCB0byBzZWUgaG93IG11Y2ggeW91ciB0ZWFtIHNjb3JlcyBhZmZlY3RzIHRoZSBvdXRjb21lIG9mIHRoZSBnYW1lLgoKCiMjIERhdGEgRGVzY3JpcHRpb24KClRoaXMgZGF0YSBzZXQgaXMgb24gdGhlIE5CQSBnYW1lIGJldHRpbmcgb2RkcyBhbmQgb3V0Y29tZXMgb2YgdGhlIDIwMTQtMjAxNSBTZWFzb24uIFRoZXJlIGlzIDEyMzAgb2JzZXJ2YXRpb25zIGFuZCAxNyB2YXJpYWJsZXMuIFRoZSB2YXJpYWJsZXMgaW4gdGhpcyBkYXRhIHNldCBhcmUgCgoqIERhdGVudW0gKGNhdGVnb3JpY2FsKS0gVGhpcyBpcyB0aGUgYW1vdW50IG9mIGRheXMgc2luY2UgSmFudWFyeSAxLCAxOTYwCiogVGVhbSAoY2F0ZWdvcmljYWwpLSBXaGVyZSB0aGUgaG9tZSB0ZWFtIGlzIGZyb20KKiBEYXRlc2xhc2ggKG51bWVyaWNhbCktIE1NL0REL1lZWVkKKiBPcHBUZWFtIChjYXRlZ29yaWNhbCktIFdoZXJlIHRoZSBhd2F5IHRlYW0gaXMgZnJvbQoqIEhvbWUgKGJpbmFyeSByZXBvbnNlKS0gSWYgdGhlICJUZWFtIiBpcyB0aGUgaG9tZSB0ZWFtIChhbHdheXMgaXMpCiogVGVhbVB0cyAobnVtZXJpY2FsKS0gSG9tZSB0ZWFtIHBvaW50cyBzY29yZWQKKiBPcHBQdHMgKG51bWVyaWNhbCktIEF3YXkgdGVhbSBwb2ludHMgc2NvcmVkCiogT1QgKGJpbmFyeSByZXBvbnNlKS0gSWYgdGhlIGdhbWUgd2VudCB0byBPVCAoMSBtZWFucyBPVCBoYXBwZW5lZCwgMCBtZWFucyBPVCBkaWRuJ3QgaGFwcGVuKQoqIFdpbnMgKGJpbmFyeSByZXNwb25zZSktIElmIHRoZSBob21lIHRlYW0gd29uICgxIG1lYW5zIHRoZXkgd29uLCAwIG1lYW5zIHRoZXkgbG9zdCkKKiBUZWFtQ292IChiaW5hcnkgcmVzcG9uc2UpIC0gSWYgdGhlIGhvbWUgdGVhbSBjb3ZlcmVkIHRoZSBzcHJlYWQgKDEgbWVhbnMgdGhleSBjb3ZlcmVkLCAwIG1lYW5zIGEgInB1c2giLCBhbmQgLTEgbWVhbnMgdGhleSBkaWRuJ3QgY292ZXIpCiogVGVhbVNwcmQgKG51bWVyaWNhbCktIFRoZSBWZWdhcyBwb2ludCBzcHJlYWQgZm9yIHRoZSBob21lIHRlYW0KKiBPdnJVbmRyIChudW1lcmljYWwpLSBUaGUgb3Zlci91bmRlciBWZWdhcyBsaW5lIGZvciB0aGUgdG90YWwgcG9pbnRzIGluIHRoZSBnYW1lCiogT1VDb3YgKGJpbmFyeSByZXNwb25zZSktIElmIHRoZSBnYW1lIHdlbnQgb3ZlciBvciB1bmRlciB0aGUgVmVnYXMgbGluZSAoMSBtZWFucyBpdCB3ZW50IG92ZXIsIDAgbWVhbnMgaXQgd2FzIGV4YWN0bHkgdGhlIGxpbmUsIGFuZCAtMSBtZWFucyBpdCB3ZW50IHVuZGVyKQoqIFRlYW1faWQgKG51bWVyaWNhbCktIE51bWVyaWMgSUQgZm9yIEhvbWUgVGVhbQoqIE9wcFRlYW1faWQgKG51bWVyaWNhbCktIE51bWVyaWMgSUQgZm9yIEF3YXkgVGVhbQoqIFRlYW1EaWZmKG51bWVyaWNhbCktIEhvbWUgUG9pbnRzIG1pbnVzIEF3YXkgUG9pbnRzCiogVG90YWxQdHMgKG51bWVyaWNhbCktIEhvbWUgUG9pbnRzIHBsdXMgQXdheSBQb2ludHMKCgojIyBBbmFseXRpY2FsIFF1ZXN0aW9uClRoZSBvYmplY3RpdmUgZm9yIHRoaXMgc3R1ZHkgaXMgdG8gZmluZCBpZiB0aGVyZSBpcyBhbiBhc3NvY2lhdGlvbiBiZXR3ZWVuIHRlYW0gcG9pbnRzIGFuZCBnZXR0aW5nIGEgd2luLiAKCmBgYHtyfQpiZXRzIDwtIHJlYWQuY3N2KCJodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vUnlhbkxlYm8vU1RBLTMyMS9yZWZzL2hlYWRzL21haW4vUHJvamVjdCUyMDIlMjBEYXRhIiwgaGVhZGVyID0gVFJVRSkKd2luczwtIGJldHMkVGVhbVdpbgpgYGAKCiMgQnVpbGRpbmcgdGhlIFNpbXBsZSBMb2dpc3RpYyBSZWdyZXNzaW9uCgpXZSBuZWVkIHRvIGJ1aWxkIGEgbW9kZWwgYW5kIGNoZWNrIHRoZSBwcmVkaWN0b3IgdmFyaWFibGUuIFdlIHdpbGwgdGhlbiBuZWVkIHRvIGxvb2sgYXQgb2RkcyByYXRpb3MsIHN1Y2Nlc3MgcHJvYmFiaWxpdHkgY3VydmVzLCBhbmQgZ29vZG5lc3Mgb2YgZml0IG1lYXN1cmVtZW50cy4KCkluIG9yZGVyIHRvIGJ1aWxkIHRoZSBzaW1wbGUgbG9naXN0aWMgcmVncmVzc2lvbiB3ZSBuZWVkIHRvIGNoZWNrIGFuZCBtYWtlIHN1cmUgdGhlIHByZWRpY3RvciB2YXJpYWJsZSBpcyBub3QgZXh0cmVtZWx5IHNrZXdlZC4KCmBgYHtyfQp5bGltaXQgPSBtYXgoZGVuc2l0eShiZXRzJFRlYW1QdHMpJHkpCmhpc3QoYmV0cyRUZWFtUHRzLCBwcm9iYWJpbGl0eSA9IFRSVUUsIG1haW4gPSAiUG9pbnRzIERpc3RyaWJ1dGlvbiIsIHhsYWI9IlBvaW50cyIsIAogICAgICAgY29sID0gImF6dXJlMSIsIGJvcmRlcj0ibGlnaHRzZWFncmVlbiIpCiAgbGluZXMoZGVuc2l0eShiZXRzJFRlYW1QdHMsIGFkanVzdD0yKSwgY29sPSJibHVlIikgCgpgYGAKCkxvb2tpbmcgYXQgdGhpcywgSSBjYW4gdGVsbCB0aGF0IHRoZXJlIGlzIG5vIGlzc3VlIG9mIHBvdGVudGlhbCBpbWJhbGFuY2UgZHVlIHRvIHRoaXMgaGF2aW5nIGEgbm9ybWFsIGRpc3RyaWJ1dGlvbi4gU28sIEkgd2lsbCBub3QgdHJhbnNmb3JtIFRlYW1QdHMgYW5kIHdpbGwgZml0IGEgbG9naXN0aWMgcmVncmVzc2lvbiBkaXJlY3RseSB0byB0aGUgZGF0YS4KCgpgYGB7ciBjb21tZW50ID0gTkF9CnMubG9naXQgPSBnbG0od2lucyB+IFRlYW1QdHMsIAogICAgICAgICAgZmFtaWx5ID0gYmlub21pYWwobGluayA9ICJsb2dpdCIpLCAKICAgICAgICAgIGRhdGEgPSBiZXRzKSAgICAgICAgICAgICAgICAgICAgCnJlc3VsdCA9IHN1bW1hcnkocy5sb2dpdCkKcmVzdWx0CmBgYAoKVGhlIHJlc3BvbnNlIHZhcmlhYmxlIGlzIGEgYmluYXJ5IGZhY3RvciB2YXJpYWJsZS4gSW4gdGhpcyBjYXNlLCAibG9zcyIgPSAwIGFuZCAid2luIiA9IDEuIExvb2tpbmcgYXQgdGhpcyB0YWJsZSB3ZSBjYW4gc2VlIGhvdyB0aGUgcC12YWx1ZSAocDwwLjAwMSkgaXMgc2lnbmlmaWNhbnQgaW4gdGhpcyBtb2RlbC4KClRoZSBzdW1tYXJ5IG9mIG1ham9yIHN0YXRpc3RpY3MgaXMgYmVsb3cuCgpgYGB7ciBjb21tZW50ID0gTkEsIG1lc3NhZ2UgPSBGQUxTRX0KbW9kZWwuY29lZi5zdGF0cyA9IHN1bW1hcnkocy5sb2dpdCkkY29lZiAgICAgIApjb25mLmNpID0gY29uZmludChzLmxvZ2l0KSAgICAgICAgICAgICAgICAgICAgIApzdW0uc3RhdHMgPSBjYmluZChtb2RlbC5jb2VmLnN0YXRzLCBjb25mLmNpLjk1PWNvbmYuY2kpICAgCmthYmxlKHN1bS5zdGF0cyxjYXB0aW9uID0gIlN1bW1hcnkgb2YgcmVncmVzc2lvbiBjb2VmZmljaWVudHMiKSAgCmBgYAoKTG9va2luZyBhdCB0aGUgdGFibGUgYWJvdmUgd2UgY2FuIHNlZSB0aGF0IFRlYW0gUG9pbnRzIGlzIGNsb3NlbHkgYXNzb2NpYXRlZCB3aXRoIHdpbm5pbmcgZHVlIHRvIHRoZSBwLXZhbHVlIGJlaW5nIGNsb3NlIHRvIHplcm8uIEFsc28gaXQgaXMgc2lnbmlmaWNhbnQgdGhhdCAwIGlzIG5vdCBmb3VuZCBpbiB0aGUgOTUlIGNvbmZpZGVuY2UgaW50ZXJ2YWwuIFRoaXMgc2hvd3MgdGhhdCB0aGVyZSBpcyBhIHNpZ25pZmljYW50IGNvbm5lY3Rpb24gc28gZmFyIGJldHdlZW4gd2lubmluZyBhbmQgaG93IG1hbnkgcG9pbnRzIHlvdXIgdGVhbSBzY29yZXMuIAoKTm93IHdlIGNvbnZlcnQgdGhlIGVzdGltYXRlZCByZWdyZXNzaW9uIGNvZWZmaWNpZW50cyB0byB0aGUgb2RkcyByYXRpby4KCmBgYHtyfQptb2RlbC5jb2VmLnN0YXRzID0gc3VtbWFyeShzLmxvZ2l0KSRjb2VmCm9kZHNfcmF0aW8gPSBleHAoY29lZihzLmxvZ2l0KSkKb3V0X3N0YXRzID0gY2JpbmQobW9kZWwuY29lZi5zdGF0cywgb2Rkc19yYXRpbyA9IG9kZHNfcmF0aW8pICAgICAgICAgICAgICAgICAKa2FibGUob3V0X3N0YXRzLGNhcHRpb24gPSAiU3VtbWFyeSBTdGF0cyB3aXRoIE9kZHMgUmF0aW9zIikKYGBgCgpMb29raW5nIGF0IHRoZSB0YWJsZSBhYm92ZSwgd2UgY2FuIHNlZSB0aGF0IHRoZSBvZGRzIHJhdGlvIGZvciB0ZWFtIHBvaW50cyBpcyAxLjEuIFRoaXMgbWVhbnMgdGhhdCB0ZWFtIHBvaW50cyBpbmNyZWFzZXMgYnkgb25lIHVuaXQsIHRoZSBvZGRzIG9mIHdpbm5pbmcgaW5jcmVhc2UgYnkgYWJvdXQgMTAlLiBUaGlzIGlzIGEgcHJhY3RpY2FsbHkgc2lnbmlmaWNhbnQgZmFjdG9yIGZvciB3aW5uaW5nLgoKVGhlIGdsb2JhbCBnb29kbmVzcy1vZi1maXQgbWVhc3VyZXMgYXJlIHN1bW1hcml6ZWQgYmVsb3cuCgpgYGB7cn0KZGV2X3Jlc2kgPSBzLmxvZ2l0JGRldmlhbmNlCmRldi4wLnJlc2lkID0gcy5sb2dpdCRudWxsLmRldmlhbmNlCmFpYyA9IHMubG9naXQkYWljCmdvb2RuZXNzID0gY2JpbmQoRGV2aWFuY2UucmVzaWR1YWwgPWRldl9yZXNpLCBOdWxsLkRldmlhbmNlLlJlc2lkdWFsID0gZGV2LjAucmVzaWQsCiAgICAgIEFJQyA9IGFpYykKcGFuZGVyKGdvb2RuZXNzKQoKCmBgYAogCldlIGRvIG5vdCBoYXZlIGVub3VnaCBldmlkZW5jZSB0byBpbnRlcnByZXQgdGhlc2UgbWVhc3VyZXMgc2luY2UgdGhlIGdsb2JhbCBnb29kbmVzcy1vZi1maXQgaXMgYmFzZWQgb24gdGhlIGxpa2VsaWhvb2QgZnVuY3Rpb24gYW5kIHdlIGRvIG5vdCBoYXZlIGFueXRoaW5nIHRvIGNvbXBhcmUgaXQgdG8uIFdlIHdvdWxkIG5lZWQgb3RoZXIgY2FuZGlkYXRlIG1vZGVscyBpbiBvcmRlciB0byBjb21wYXJlLgoKTm93IHdlIHdpbGwgbWFrZSB0aGUgc3VjY2VzcyBwcm9iYWJpbGl0eSBjdXJ2ZSBiZWxvdy4KCgpgYGB7ciBmaWcuYWxpZ249J2NlbnRlcicsIGZpZy5oZWlnaHQ9NCwgZmlnLndpZHRoPTd9CmJtaS5yYW5nZSA9IHJhbmdlKGJldHMkVGVhbVB0cykKeCA9IHNlcShibWkucmFuZ2VbMV0sIGJtaS5yYW5nZVsyXSwgbGVuZ3RoID0gMjAwKQpiZXRhLnggPSBjb2VmKHMubG9naXQpWzFdICsgY29lZihzLmxvZ2l0KVsyXSp4CnN1Y2Nlc3MucHJvYiA9IGV4cChiZXRhLngpLygxK2V4cChiZXRhLngpKQpmYWlsdXJlLnByb2IgPSAxLygxK2V4cChiZXRhLngpKQp5bGltaXQgPSBtYXgoc3VjY2Vzcy5wcm9iLCBmYWlsdXJlLnByb2IpCiMjCmJldGExID0gY29lZihzLmxvZ2l0KVsyXQpzdWNjZXNzLnByb2IucmF0ZSA9IGJldGExKmV4cChiZXRhLngpLygxK2V4cChiZXRhLngpKV4yCgpwYXIobWZyb3cgPSBjKDEsMikpCnBsb3QoeCwgc3VjY2Vzcy5wcm9iLCB0eXBlID0gImwiLCBsd2QgPSAyLCBjb2wgPSAibmF2eSIsCiAgICAgbWFpbiA9ICJUaGUgcHJvYmFiaWxpdHkgb2Ygd2lubmluZyIsIAogICAgIHlsaW09YygwLCAxLjEqeWxpbWl0KSwKICAgICB4bGFiID0gIlRlYW0gUG9pbnRzIiwKICAgICB5bGFiID0gInByb2JhYmlsaXR5IiwKICAgICBheGVzID0gRkFMU0UsCiAgICAgY29sLm1haW4gPSAibmF2eSIsCiAgICAgY2V4Lm1haW4gPSAwLjgpCgpheGlzKDEsIHBvcyA9IDApCmF4aXMoMikKCnkucmF0ZSA9IG1heChzdWNjZXNzLnByb2IucmF0ZSkKcGxvdCh4LCBzdWNjZXNzLnByb2IucmF0ZSwgdHlwZSA9ICJsIiwgbHdkID0gMiwgY29sID0gIm5hdnkiLAogICAgIG1haW4gPSAiVGhlIHJhdGUgb2YgY2hhbmdlIGluIHRoZSBwcm9iYWJpbGl0eSBvZiB3aW5uaW5nIiwgCiAgICAgeGxhYiA9ICJUZWFtIFBvaW50cyIsCiAgICAgeWxhYiA9ICJSYXRlIG9mIENoYW5nZSIsCiAgICAgeWxpbT1jKDAsMS4xKnkucmF0ZSksCiAgICAgYXhlcyA9IEZBTFNFLAogICAgIGNvbC5tYWluID0gIm5hdnkiLAogICAgIGNleC5tYWluID0gMC44CiAgICAgKQpheGlzKDEsIHBvcyA9IDApCmF4aXMoMikKYGBgCgpMb29raW5nIGF0IHRoZXNlIGN1cnZlcyB3ZSBjYW4gc2VlIHRoYXQgb24gdGhlIGxlZnQgaXQgc2hvd3MgdGhhdCBhcyB0ZWFtIHBvaW50cyBnbyB1cCwgdGhlIHByb2JhYmlsaXR5IG9mIHdpbm5pbmcgZ29lcyB1cC4gTG9va2luZyBhdCB0aGUgY3VydmUgb24gdGhlIHJpZ2h0IHdlIGNhbiBzZWUgdGhhdCB0aGUgcmF0ZSBvZiBjaGFuZ2UgaW4gdGhlIHByb2JhYmlsaXR5IG9mIHdpbm5pbmcgaW5jcmVhc2VzIHdoZW4gVGVhbSBQb2ludHMgaXMgbGVzcyB0aGFuIDEwMCBhbmQgZGVjcmVhc2VzIHdoZW4gVGVhbSBQb2ludHMgaXMgZ3JlYXRlciB0aGFuIDEwMC4gVGhlIHR1cm5pbmcgcG9pbnQgaXMgYWJvdXQgMTAwLgoKCiMgQ29uY2x1c2lvbgoKVGhpcyBhc3NpZ25tZW50IGhhcyBnb25lIHRocm91Z2ggYW5kIHNob3duIHRoZSBzaW1wbGUgbG9naXN0aWMgcmVncmVzc2lvbiBtb2RlbCwgb2RkcyByYXRpbyBvZiB0aGUgZXN0aW1hdGVkIHJlZ3Jlc3Npb24gY29lZmZpY2llbnRzLCB0aGUgZ29vZG5lc3Mtb2YtZml0IG1lYXN1cmVzLCB0aGUgc3VjY2VzcyBwcm9iYWJpbGl0eSBjdXJ2ZSwgYW5kIHRoZSByYXRlIG9mIGNoYW5nZSBjdXJ2ZS4KCkZyb20gdGhpcyBhc3NpZ25tZW50IHdlIGNhbiBzZWUgdGhhdCB0ZWFtIHBvaW50cyBpcyBoaWdobHkgY29ycmVsYXRlZCB3aXRoIHdpbm5pbmcgZ2FtZXMuIFdpdGggbXkgcGFzdCBleHBlcmllbmNlIHRoYXQgbWFrZXMgc2Vuc2UgZHVlIHRvIGhvdyBiZXR0ZXIgb2ZmZW5zZXMgaGF2ZSBiZWVuIGEgbW9yZSBwcmV2ZWxlbnQgdGhpbmcgaW4gdGhlIE5CQSBub3dhZGF5cy4K