1 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.

1.1 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

1.2 Analytical Question

The objective for this study is to find if there is an association between team points and getting a win.

2 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
Estimate Std. Error z value Pr(>|z|) 2.5 % 97.5 %
(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
Estimate Std. Error z value Pr(>|z|) odds_ratio
(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.

Deviance.residual Null.Deviance.Residual AIC
1394 1678 1398

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.

3 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