1 Introduction

This data set contains the statistics played for every game in the 2024 WNBA season, excluding the all star game. My goal for this data set is to build the best model possible to predict the number of points scored in a median game.

This report focuses on the Los Angeles Sparks, who had a record of 8-32 and did not make the playoffs in the 2024 season.

2 Tables

Table 1 shows the mean and standard deviation for every team in the categories of points scored, field goal percentage, 3 point field goal percentage, steals and rebounds per game. The Aces led in points per game. The Fever led in field goal percentage. The Lynx led in 3 point field goal percentage. The storm led in steals per game. The Liberty, who won the league, led in rebounds per game.

Table 2 shows the mean and standard deviation of the Los Angeles Sparks in a win versus a loss. In a win, they scored almost 10 more points than they did in a loss, on average.

#making table to show mean and SD for all teams in points, steals, rebounds, FGP and 3 PT FGP
summary %>% 
  kbl(digits=2, caption = "2025 League Stats") %>%
  kable_classic_2(full_width=F)
2025 League Stats
team_name mean_score sd_score mean_fgp sd_fgp mean_rebounds sd_rebounds mean_3ptpct sd_3ptpct mean_steals sd_steals
Aces 85.52 9.56 45.27 5.82 33.78 5.88 35.27 7.08 6.80 2.67
Dream 76.93 10.59 41.28 6.78 35.95 4.41 30.83 9.32 7.14 2.82
Fever 84.50 10.17 45.56 5.38 35.10 5.49 35.00 8.99 5.88 2.29
Liberty 84.98 9.92 44.53 5.61 36.90 5.77 35.38 10.06 7.75 2.19
Lynx 82.36 11.39 45.21 6.34 33.15 5.06 37.80 9.43 8.36 3.17
Mercury 81.93 12.60 44.28 7.34 32.26 5.39 32.97 10.34 6.55 2.12
Mystics 79.30 8.69 43.36 4.82 31.85 4.66 36.64 8.69 7.28 2.24
Sky 77.40 9.62 42.44 5.22 36.60 5.57 31.74 11.62 7.00 3.30
Sparks 78.40 10.57 42.63 6.15 32.67 5.52 32.09 11.00 7.30 2.78
Storm 82.67 9.65 43.43 5.39 34.67 6.02 28.35 9.03 9.24 3.27
Sun 80.36 9.89 44.30 5.28 33.43 4.62 32.84 11.67 7.89 3.29
Wings 84.20 11.47 44.47 5.24 34.75 4.65 32.06 11.75 7.12 2.95
#making a table to show average score in a win versus average score in a loss
my_team_means %>%
  kbl(digits=2, caption = "2025 Los Angeles Sparks") %>%
  kable_classic(full_width = F, html_font = "Cambria")
2025 Los Angeles Sparks
result mean sd
Loss 76.69 9.79
Win 85.25 11.42

3 Histograms and Box Plots

The side-by-side box plots show the minimum, maximum and median points scored in a win versus a loss for the Sparks. In a win, the median amount of points scored is 78.5. In a loss, the median points scored was 87.5. The most points scored was a 110 point victory, while the least amount was a loss where they scored 62 points.

#creating histogram 
p <- my_team %>%
  ggplot( aes(x=team_score, fill=result)) + 
    geom_histogram(color = "purple", alpha = 0.6, position = 'identity') + 
    scale_fill_manual(values=c("purple", "yellow"))
p
## `stat_bin()` using `bins = 30`. Pick better value `binwidth`.

#making side by side box plots to compare points scored in a win versus a loss
 boxplot(team_score ~ result, data = my_team, notch = TRUE, 
        col = c("purple", "yellow"),
        main = "Points scored by game result",
        xlab = "Result", ylab = "Points")
## Warning in (function (z, notch = FALSE, width = NULL, varwidth = FALSE, : some
## notches went outside hinges ('box'): maybe set notch=FALSE

4 Models

After all models were run and model reduction was completed, my final model is team_score = -50.4334385 + 4.044072 * field_goal_pct + -1.6678826 * total_rebounds + 2.5656832 * three_point_field_goal_pct + -0.0989813 * field_goal_pct:total_rebounds + 0.0609006 * three_point_field_goal_pct:total_rebounds

This model significantly predicts team score, F(5, 34) = 6.868528, p = 0.0001587, adjusted R^2= 0.429346

See table below for results.

Dependent variable:
team_score
field_goal_pct 4.044***
(1.221)
three_point_field_goal_pct -1.668*
(0.925)
total_rebounds 2.566**
(1.097)
field_goal_pct:total_rebounds -0.099**
(0.037)
three_point_field_goal_pct:total_rebounds 0.061**
(0.028)
Constant -50.433
(38.164)
Observations 40
R2 0.503
Adjusted R2 0.429
Residual Std. Error 7.983 (df = 34)
F Statistic 6.869*** (df = 5; 34)
Note: p<0.1; p<0.05; p<0.01

5 Residual Analysis

The histogram of the residuals is approximately normal. We have no extreme outliers because no residuals are outside of our threshold of |3|. The outlier plot shows that games 2, 11,13 and 32 are all high leverage. The Cook’s Distance Plot shows that game 11, 32, 21 and 26 are all above the threshold of 0.1. Games 11 and 32 are the most influential.In game 11, the Sparks scored 110 points and in game 32 they only scored 62 points.

#creating histogram of residuals
ols_plot_resid_hist(model4)

#creating versus fit plot
ols_plot_resid_fit(model4)

#creating studentized residuals plot
ols_plot_resid_stud(model4)

#creating leverage plot
ols_plot_resid_lev(model4, threshold = 3)

#creating cooks distance plot
ols_plot_cooksd_chart(model4)

6 Final Prediction

I built the model to predict my team’s points for a game where they achieved the median value for every variable. The predicted team score is rpredict[1]. With 95% confidence interval, (rpredict[2],rpredict[3])

LS0tDQp0aXRsZTogIkFzc2lnbm1lbnQgNjogTG9zIEFuZ2VsZXMgU3BhcmtzIg0KYXV0aG9yOiAiQ2VhcmEgTydOZWFsIg0KZGF0ZTogImByIFN5cy5EYXRlKClgIg0Kb3V0cHV0Og0KICBodG1sX2RvY3VtZW50OiANCiAgICB0b2M6IHllcw0KICAgIHRvY19kZXB0aDogNA0KICAgIHRvY19mbG9hdDogeWVzDQogICAgbnVtYmVyX3NlY3Rpb25zOiB5ZXMNCiAgICB0b2NfY29sbGFwc2VkOiB5ZXMNCiAgICBjb2RlX2ZvbGRpbmc6IGhpZGUNCiAgICBjb2RlX2Rvd25sb2FkOiB5ZXMNCiAgICBzbW9vdGhfc2Nyb2xsOiB5ZXMNCiAgICB0aGVtZTogbHVtZW4NCiAgcGRmX2RvY3VtZW50OiANCiAgICB0b2M6IHllcw0KICAgIHRvY19kZXB0aDogNA0KICAgIGZpZ19jYXB0aW9uOiB5ZXMNCiAgICBudW1iZXJfc2VjdGlvbnM6IHllcw0KICAgIGZpZ193aWR0aDogMw0KICAgIGZpZ19oZWlnaHQ6IDMNCiAgd29yZF9kb2N1bWVudDogDQogICAgdG9jOiB5ZXMNCiAgICB0b2NfZGVwdGg6IDQNCiAgICBmaWdfY2FwdGlvbjogeWVzDQogICAga2VlcF9tZDogeWVzDQplZGl0b3Jfb3B0aW9uczogDQogIGNodW5rX291dHB1dF90eXBlOiBpbmxpbmUNCi0tLQ0KDQpgYGB7Y3NzLCBlY2hvID0gRkFMU0V9DQojVE9DOjpiZWZvcmUgew0KICBjb250ZW50OiAiVGFibGUgb2YgQ29udGVudHMiOw0KICBmb250LXdlaWdodDogYm9sZDsNCiAgZm9udC1zaXplOiAxLjJlbTsNCiAgZGlzcGxheTogYmxvY2s7DQogIGNvbG9yOiBuYXZ5Ow0KICBtYXJnaW4tYm90dG9tOiAxMHB4Ow0KfQ0KDQoNCmRpdiNUT0MgbGkgeyAgICAgLyogdGFibGUgb2YgY29udGVudCAgKi8NCiAgICBsaXN0LXN0eWxlOnVwcGVyLXJvbWFuOw0KICAgIGJhY2tncm91bmQtaW1hZ2U6bm9uZTsNCiAgICBiYWNrZ3JvdW5kLXJlcGVhdDpub25lOw0KICAgIGJhY2tncm91bmQtcG9zaXRpb246MDsNCn0NCg0KaDEudGl0bGUgeyAgICAvKiBsZXZlbCAxIGhlYWRlciBvZiB0aXRsZSAgKi8NCiAgZm9udC1zaXplOiAyMnB4Ow0KICBmb250LXdlaWdodDogYm9sZDsNCiAgY29sb3I6IERhcmtSZWQ7DQogIHRleHQtYWxpZ246IGNlbnRlcjsNCiAgZm9udC1mYW1pbHk6ICJHaWxsIFNhbnMiLCBzYW5zLXNlcmlmOw0KfQ0KDQpoNC5hdXRob3IgeyAvKiBIZWFkZXIgNCAtIGFuZCB0aGUgYXV0aG9yIGFuZCBkYXRhIGhlYWRlcnMgdXNlIHRoaXMgdG9vICAqLw0KICBmb250LXNpemU6IDE1cHg7DQogIGZvbnQtd2VpZ2h0OiBib2xkOw0KICBmb250LWZhbWlseTogc3lzdGVtLXVpOw0KICBjb2xvcjogbmF2eTsNCiAgdGV4dC1hbGlnbjogY2VudGVyOw0KfQ0KDQpoNC5kYXRlIHsgLyogSGVhZGVyIDQgLSBhbmQgdGhlIGF1dGhvciBhbmQgZGF0YSBoZWFkZXJzIHVzZSB0aGlzIHRvbyAgKi8NCiAgZm9udC1zaXplOiAxOHB4Ow0KICBmb250LXdlaWdodDogYm9sZDsNCiAgZm9udC1mYW1pbHk6ICJHaWxsIFNhbnMiLCBzYW5zLXNlcmlmOw0KICBjb2xvcjogRGFya0JsdWU7DQogIHRleHQtYWxpZ246IGNlbnRlcjsNCn0NCg0KaDEgeyAvKiBIZWFkZXIgMSAtIGFuZCB0aGUgYXV0aG9yIGFuZCBkYXRhIGhlYWRlcnMgdXNlIHRoaXMgdG9vICAqLw0KICAgIGZvbnQtc2l6ZTogMjBweDsNCiAgICBmb250LXdlaWdodDogYm9sZDsNCiAgICBmb250LWZhbWlseTogIlRpbWVzIE5ldyBSb21hbiIsIFRpbWVzLCBzZXJpZjsNCiAgICBjb2xvcjogZGFya3JlZDsNCiAgICB0ZXh0LWFsaWduOiBsZWZ0Ow0KfQ0KDQpoMiB7IC8qIEhlYWRlciAyIC0gYW5kIHRoZSBhdXRob3IgYW5kIGRhdGEgaGVhZGVycyB1c2UgdGhpcyB0b28gICovDQogICAgZm9udC1zaXplOiAxOHB4Ow0KICAgIGZvbnQtd2VpZ2h0OiBib2xkOw0KICAgIGZvbnQtZmFtaWx5OiAiVGltZXMgTmV3IFJvbWFuIiwgVGltZXMsIHNlcmlmOw0KICAgIGNvbG9yOiBuYXZ5Ow0KICAgIHRleHQtYWxpZ246IGxlZnQ7DQp9DQoNCmgzIHsgLyogSGVhZGVyIDMgLSBhbmQgdGhlIGF1dGhvciBhbmQgZGF0YSBoZWFkZXJzIHVzZSB0aGlzIHRvbyAgKi8NCiAgICBmb250LXNpemU6IDE2cHg7DQogICAgZm9udC13ZWlnaHQ6IGJvbGQ7DQogICAgZm9udC1mYW1pbHk6ICJUaW1lcyBOZXcgUm9tYW4iLCBUaW1lcywgc2VyaWY7DQogICAgY29sb3I6IG5hdnk7DQogICAgdGV4dC1hbGlnbjogbGVmdDsNCn0NCg0KaDQgeyAvKiBIZWFkZXIgNCAtIGFuZCB0aGUgYXV0aG9yIGFuZCBkYXRhIGhlYWRlcnMgdXNlIHRoaXMgdG9vICAqLw0KICAgIGZvbnQtc2l6ZTogMTRweDsNCiAgZm9udC13ZWlnaHQ6IGJvbGQ7DQogICAgZm9udC1mYW1pbHk6ICJUaW1lcyBOZXcgUm9tYW4iLCBUaW1lcywgc2VyaWY7DQogICAgY29sb3I6IGRhcmtyZWQ7DQogICAgdGV4dC1hbGlnbjogbGVmdDsNCn0NCg0KLyogQWRkIGRvdHMgYWZ0ZXIgbnVtYmVyZWQgaGVhZGVycyAqLw0KLmhlYWRlci1zZWN0aW9uLW51bWJlcjo6YWZ0ZXIgew0KICBjb250ZW50OiAiLiI7DQoNCmJvZHkgeyBiYWNrZ3JvdW5kLWNvbG9yOndoaXRlOyB9DQoNCi5oaWdobGlnaHRtZSB7IGJhY2tncm91bmQtY29sb3I6eWVsbG93OyB9DQoNCnAgeyBiYWNrZ3JvdW5kLWNvbG9yOndoaXRlOyB9DQoNCn0NCmBgYA0KDQoNCmBgYCB7ciBzZXR1cCwgaW5jbHVkZT1GfQ0Kc2V0d2QoIkM6L1VzZXJzL2NlYXJhL09uZURyaXZlIC0gRWxvbiBVbml2ZXJzaXR5L0Rlc2t0b3AvOXN0YTMxOCIpDQoNCiNyZWFkcyBpbiB0aGUgZGF0YSBzZXQNCmRhdGEgPSByZWFkLmNzdigiV05CQV8yMDI1X2JveC1zY29yZXMuY3N2IiwgaGVhZGVyID0gVCkNCg0KbGlicmFyeShnZ3Bsb3QyKQ0KbGlicmFyeShkcGx5cikNCmxpYnJhcnkoY2FyKQ0KbGlicmFyeShvbHNycikNCmxpYnJhcnkoa2FibGVFeHRyYSkNCg0KYGBgDQoNCmBgYCB7ciB3cmFuZ2xpbmcsIGluY2x1ZGU9Rn0NCiNzdW1tYXJ5KGRhdGEpDQoNCiNBbGwgV05CQSB0ZWFtcyBpbmNsdWRlZCwgcmVtb3ZlIGFsbCBzdGFyIGdhbWUgc2NvcmUNCmRhdGEgPSBkYXRhICU+JQ0KICBmaWx0ZXIodGVhbV9uYW1lICE9ICJUZWFtIFdOQkEiICYgdGVhbV9uYW1lICE9ICJUZWFtIFVTQSIpDQoNCiMyQywgZ3JvdXAgZGF0YSBieSB0ZWFtLCBmaW5kIG1lYW4gYW5kIFNEIG9mIGFsbCB2YXJpYWJsZXMNCnN1bW1hcnkgPSBkYXRhICU+JQ0KICBncm91cF9ieSh0ZWFtX25hbWUpICU+JQ0KICBzdW1tYXJpc2UobWVhbl9zY29yZT1tZWFuKHRlYW1fc2NvcmUpLCBzZF9zY29yZT1zZCh0ZWFtX3Njb3JlKSwNCiAgICAgICAgICAgIG1lYW5fZmdwID0gbWVhbihmaWVsZF9nb2FsX3BjdCksIHNkX2ZncCA9IHNkKGZpZWxkX2dvYWxfcGN0KSwgDQogICAgICAgICAgICBtZWFuX3JlYm91bmRzID0gbWVhbih0b3RhbF9yZWJvdW5kcyksIHNkX3JlYm91bmRzID0gc2QodG90YWxfcmVib3VuZHMpLA0KICAgICAgICAgICAgbWVhbl8zcHRwY3QgPSBtZWFuKHRocmVlX3BvaW50X2ZpZWxkX2dvYWxfcGN0KSwgc2RfM3B0cGN0ID0gc2QodGhyZWVfcG9pbnRfZmllbGRfZ29hbF9wY3QpLCANCiAgICAgICAgICAgIG1lYW5fc3RlYWxzID0gbWVhbihzdGVhbHMpLCBzZF9zdGVhbHMgPSBzZChzdGVhbHMpKQ0KICANCiNzZWxlY3Qgb25seSB2YXJpYWJsZXMgd2UgbmVlZCBhbmQgZmlsdGVyIG9uIG15IHRlYW0gIA0KbXlfdGVhbSA9IGRhdGEgJT4lDQogIHNlbGVjdCh0ZWFtX3Njb3JlLCBmaWVsZF9nb2FsX3BjdCwgdG90YWxfcmVib3VuZHMsIHRocmVlX3BvaW50X2ZpZWxkX2dvYWxfcGN0LCBzdGVhbHMsIHRlYW1fbmFtZSwgdGVhbV93aW5uZXIpICU+JQ0KICBmaWx0ZXIodGVhbV9uYW1lID09ICJTcGFya3MiKSAlPiUNCiAgbXV0YXRlKHJlc3VsdD0gY2FzZV93aGVuKHRlYW1fd2lubmVyPT1UUlVFfiJXaW4iLCB0ZWFtX3dpbm5lcj09RkFMU0V+Ikxvc3MiKSkNCiNncm91cHMgY2FzZXMgYnkgd2luIG9yIGxvc3MNCg0KI3N1bW1hcml6ZSBhbGwgdmFyaWFibGVzIHdpdGggbWVhbiBhbmQgU0QsIG5ldyBkYXRhIHNldCBjYWxsZWQgbXlfdGVhbV9tZWFucw0KbXlfdGVhbV9tZWFucyA9IG15X3RlYW0gJT4lDQogIGdyb3VwX2J5KHJlc3VsdCkgJT4lDQogIHN1bW1hcml6ZShtZWFuPW1lYW4odGVhbV9zY29yZSksIHNkPSBzZCh0ZWFtX3Njb3JlKSkNCg0KYGBgDQoNCiMgSW50cm9kdWN0aW9uIA0KVGhpcyBkYXRhIHNldCBjb250YWlucyB0aGUgc3RhdGlzdGljcyBwbGF5ZWQgZm9yIGV2ZXJ5IGdhbWUgaW4gdGhlIDIwMjQgV05CQSBzZWFzb24sIGV4Y2x1ZGluZyB0aGUgYWxsIHN0YXIgZ2FtZS4gIE15IGdvYWwgZm9yIHRoaXMgZGF0YSBzZXQgaXMgdG8gYnVpbGQgdGhlIGJlc3QgbW9kZWwgcG9zc2libGUgdG8gcHJlZGljdCB0aGUgbnVtYmVyIG9mIHBvaW50cyBzY29yZWQgaW4gYSBtZWRpYW4gZ2FtZS4gDQoNClRoaXMgcmVwb3J0IGZvY3VzZXMgb24gdGhlIExvcyBBbmdlbGVzIFNwYXJrcywgd2hvIGhhZCBhIHJlY29yZCBvZiA4LTMyIGFuZCBkaWQgbm90IG1ha2UgdGhlIHBsYXlvZmZzIGluIHRoZSAyMDI0IHNlYXNvbi4gDQoNCiMgVGFibGVzDQpUYWJsZSAxIHNob3dzIHRoZSBtZWFuIGFuZCBzdGFuZGFyZCBkZXZpYXRpb24gZm9yIGV2ZXJ5IHRlYW0gaW4gdGhlIGNhdGVnb3JpZXMgb2YgcG9pbnRzIHNjb3JlZCwgZmllbGQgZ29hbCBwZXJjZW50YWdlLCAzIHBvaW50IGZpZWxkIGdvYWwgcGVyY2VudGFnZSwgc3RlYWxzIGFuZCByZWJvdW5kcyBwZXIgZ2FtZS4gVGhlIEFjZXMgbGVkIGluIHBvaW50cyBwZXIgZ2FtZS4gVGhlIEZldmVyIGxlZCBpbiBmaWVsZCBnb2FsIHBlcmNlbnRhZ2UuIFRoZSBMeW54IGxlZCBpbiAzIHBvaW50IGZpZWxkIGdvYWwgcGVyY2VudGFnZS4gVGhlIHN0b3JtIGxlZCBpbiBzdGVhbHMgcGVyIGdhbWUuIFRoZSBMaWJlcnR5LCB3aG8gd29uIHRoZSBsZWFndWUsIGxlZCBpbiByZWJvdW5kcyBwZXIgZ2FtZS4NCg0KVGFibGUgMiBzaG93cyB0aGUgbWVhbiBhbmQgc3RhbmRhcmQgZGV2aWF0aW9uIG9mIHRoZSBMb3MgQW5nZWxlcyBTcGFya3MgaW4gYSB3aW4gdmVyc3VzIGEgbG9zcy4gSW4gYSB3aW4sIHRoZXkgc2NvcmVkIGFsbW9zdCAxMCBtb3JlIHBvaW50cyB0aGFuIHRoZXkgZGlkIGluIGEgbG9zcywgb24gYXZlcmFnZS4gDQoNCmBgYHtyIHRhYmxlcywgaW5jbHVkZT1UfQ0KI21ha2luZyB0YWJsZSB0byBzaG93IG1lYW4gYW5kIFNEIGZvciBhbGwgdGVhbXMgaW4gcG9pbnRzLCBzdGVhbHMsIHJlYm91bmRzLCBGR1AgYW5kIDMgUFQgRkdQDQpzdW1tYXJ5ICU+JSANCiAga2JsKGRpZ2l0cz0yLCBjYXB0aW9uID0gIjIwMjUgTGVhZ3VlIFN0YXRzIikgJT4lDQogIGthYmxlX2NsYXNzaWNfMihmdWxsX3dpZHRoPUYpDQoNCiNtYWtpbmcgYSB0YWJsZSB0byBzaG93IGF2ZXJhZ2Ugc2NvcmUgaW4gYSB3aW4gdmVyc3VzIGF2ZXJhZ2Ugc2NvcmUgaW4gYSBsb3NzDQpteV90ZWFtX21lYW5zICU+JQ0KICBrYmwoZGlnaXRzPTIsIGNhcHRpb24gPSAiMjAyNSBMb3MgQW5nZWxlcyBTcGFya3MiKSAlPiUNCiAga2FibGVfY2xhc3NpYyhmdWxsX3dpZHRoID0gRiwgaHRtbF9mb250ID0gIkNhbWJyaWEiKQ0KYGBgDQoNCiMgSGlzdG9ncmFtcyBhbmQgQm94IFBsb3RzDQpUaGUgc2lkZS1ieS1zaWRlIGJveCBwbG90cyBzaG93IHRoZSBtaW5pbXVtLCBtYXhpbXVtIGFuZCBtZWRpYW4gcG9pbnRzIHNjb3JlZCBpbiBhIHdpbiB2ZXJzdXMgYSBsb3NzIGZvciB0aGUgU3BhcmtzLiBJbiBhIHdpbiwgdGhlIG1lZGlhbiBhbW91bnQgb2YgcG9pbnRzIHNjb3JlZCBpcyA3OC41LiBJbiBhIGxvc3MsIHRoZSBtZWRpYW4gcG9pbnRzIHNjb3JlZCB3YXMgODcuNS4gVGhlIG1vc3QgcG9pbnRzIHNjb3JlZCB3YXMgYSAxMTAgcG9pbnQgdmljdG9yeSwgd2hpbGUgdGhlIGxlYXN0IGFtb3VudCB3YXMgYSBsb3NzIHdoZXJlIHRoZXkgc2NvcmVkIDYyIHBvaW50cy4gDQoNCmBgYHtyIGdyYXBocywgaW5jbHVkZT1ULCBmaWcud2lkdGg9IDUsIGZpZC5oZWlnaHQ9NH0NCiNjcmVhdGluZyBoaXN0b2dyYW0gDQpwIDwtIG15X3RlYW0gJT4lDQogIGdncGxvdCggYWVzKHg9dGVhbV9zY29yZSwgZmlsbD1yZXN1bHQpKSArIA0KICAgIGdlb21faGlzdG9ncmFtKGNvbG9yID0gInB1cnBsZSIsIGFscGhhID0gMC42LCBwb3NpdGlvbiA9ICdpZGVudGl0eScpICsgDQogICAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzPWMoInB1cnBsZSIsICJ5ZWxsb3ciKSkNCnANCg0KI21ha2luZyBzaWRlIGJ5IHNpZGUgYm94IHBsb3RzIHRvIGNvbXBhcmUgcG9pbnRzIHNjb3JlZCBpbiBhIHdpbiB2ZXJzdXMgYSBsb3NzDQogYm94cGxvdCh0ZWFtX3Njb3JlIH4gcmVzdWx0LCBkYXRhID0gbXlfdGVhbSwgbm90Y2ggPSBUUlVFLCANCiAgICAgICAgY29sID0gYygicHVycGxlIiwgInllbGxvdyIpLA0KICAgICAgICBtYWluID0gIlBvaW50cyBzY29yZWQgYnkgZ2FtZSByZXN1bHQiLA0KICAgICAgICB4bGFiID0gIlJlc3VsdCIsIHlsYWIgPSAiUG9pbnRzIikNCmBgYA0KDQoNCiMgTW9kZWxzDQpgYGB7ciBmaXJzdCBvcmRlciBtb2RlbCwgaW5jbHVkZT1GfQ0KI2NyZWF0ZSBhbmQgc3VtbWFyaXplIG1vZGVsIDENCm1vZGVsMSA9IGxtKHRlYW1fc2NvcmV+ZmllbGRfZ29hbF9wY3QgKyB0aHJlZV9wb2ludF9maWVsZF9nb2FsX3BjdCArIHN0ZWFscyArIHRvdGFsX3JlYm91bmRzLCBkYXRhID0gbXlfdGVhbSkgIA0Kc3VtbWFyeShtb2RlbDEpDQoNCiN2YXJpYW5jZSBpbmZsYXRpb24gZmFjdG9ycw0KdmlmKG1vZGVsMSkNCg0KI2NyZWF0ZSBuZXcgZGF0YSBmcmFtZSB0byB1c2UgQ09SIGZ1bmN0aW9uDQpjb3JfZGF0YSA9IG15X3RlYW0gJT4lDQogIHNlbGVjdChmaWVsZF9nb2FsX3BjdCwgdG90YWxfcmVib3VuZHMsIHRocmVlX3BvaW50X2ZpZWxkX2dvYWxfcGN0LCBzdGVhbHMpDQoNCiN0byBnZXQgY29ycmVsYXRpb24gbWF0cml4IA0KY29yKGNvcl9kYXRhKQ0KYGBgDQoNCg0KYGBge3IgaW50ZXJhY3Rpb24gbW9kZWwsIHJlc3VsdHMgPSAnYXNpcycsIGluY2x1ZGUgPSBGLCBjb21tZW50ID0gTkF9DQojbW9kZWwzIGlzIG91ciBpbnRlcmFjdGlvbiBtb2RlbA0KbW9kZWwzPSBsbSh0ZWFtX3Njb3JlfiBmaWVsZF9nb2FsX3BjdCp0aHJlZV9wb2ludF9maWVsZF9nb2FsX3BjdCArIHN0ZWFscypmaWVsZF9nb2FsX3BjdCArIGZpZWxkX2dvYWxfcGN0KnRvdGFsX3JlYm91bmRzICsgdGhyZWVfcG9pbnRfZmllbGRfZ29hbF9wY3QqdG90YWxfcmVib3VuZHMgKyBzdGVhbHMqdG90YWxfcmVib3VuZHMgKyB0aHJlZV9wb2ludF9maWVsZF9nb2FsX3BjdCpzdGVhbHMgK2ZpZWxkX2dvYWxfcGN0ICsgdGhyZWVfcG9pbnRfZmllbGRfZ29hbF9wY3QrIHRvdGFsX3JlYm91bmRzICsgc3RlYWxzLCBkYXRhID0gbXlfdGVhbSkNCnN1bW1hcnkobW9kZWwzKQ0KDQojY3JlYXRpbmcgbW9kZWwgNCB3aXRoIG5vbi1zaWduaWZpY2FudCB0ZXJtcyByZW1vdmVkDQptb2RlbDQ9IGxtKHRlYW1fc2NvcmV+ZmllbGRfZ29hbF9wY3QgKyB0aHJlZV9wb2ludF9maWVsZF9nb2FsX3BjdCArIHRvdGFsX3JlYm91bmRzICsgZmllbGRfZ29hbF9wY3QqdG90YWxfcmVib3VuZHMgKyB0aHJlZV9wb2ludF9maWVsZF9nb2FsX3BjdCp0b3RhbF9yZWJvdW5kcywgZGF0YSA9IG15X3RlYW0pIA0KDQpzdW1tYXJ5KG1vZGVsNCkNCm1vZGVsNHN1bT0gc3VtbWFyeShtb2RlbDQpDQpgYGANCg0KQWZ0ZXIgYWxsIG1vZGVscyB3ZXJlIHJ1biBhbmQgbW9kZWwgcmVkdWN0aW9uIHdhcyBjb21wbGV0ZWQsIG15IGZpbmFsIG1vZGVsIGlzIA0KdGVhbV9zY29yZSA9IGByIG1vZGVsNCRjb2VmZmljaWVudHNbMV1gICsgYHIgbW9kZWw0JGNvZWZmaWNpZW50c1syXWAgKiBmaWVsZF9nb2FsX3BjdCArIA0KYHIgbW9kZWw0JGNvZWZmaWNpZW50c1szXWAgKiB0b3RhbF9yZWJvdW5kcyArIGByIG1vZGVsNCRjb2VmZmljaWVudHNbNF1gICogdGhyZWVfcG9pbnRfZmllbGRfZ29hbF9wY3QgKyBgciBtb2RlbDQkY29lZmZpY2llbnRzWzVdYCAqIGZpZWxkX2dvYWxfcGN0OnRvdGFsX3JlYm91bmRzICsgYHIgbW9kZWw0JGNvZWZmaWNpZW50c1s2XWAgKiB0aHJlZV9wb2ludF9maWVsZF9nb2FsX3BjdDp0b3RhbF9yZWJvdW5kcw0KDQpUaGlzIG1vZGVsIHNpZ25pZmljYW50bHkgcHJlZGljdHMgdGVhbSBzY29yZSwgRihgciBtb2RlbDRzdW0kZnN0YXRpc3RpY1syXWAsIGByIG1vZGVsNHN1bSRmc3RhdGlzdGljWzNdYCkgPSBgciBtb2RlbDRzdW0kZnN0YXRpc3RpY1sxXWAsIHAgPSAwLjAwMDE1ODcsIGFkanVzdGVkIFJeMj0gYHIgbW9kZWw0c3VtJGFkai5yLnNxdWFyZWRgDQoNClNlZSB0YWJsZSBiZWxvdyBmb3IgcmVzdWx0cy4gDQoNCmBgYCB7ciwgaW5jbHVkZSA9IFQsIGVjaG89RiwgcmVzdWx0cz0gJ2FzaXMnLCBjb21tZW50PSBOQSwgbWVzc2FnZSA9IEZ9DQojaW5jbHVkaW5nIHBhY2thZ2UgZm9yIEFQQSBzdHlsZSB0YWJsZQ0KbGlicmFyeShzdGFyZ2F6ZXIpDQojY3JlYXRpbmcgQVBBIHN0eWxlIHRhYmxlDQpzdGFyZ2F6ZXIobW9kZWw0LCB0eXBlID0gImh0bWwiKQ0KYGBgDQojIFJlc2lkdWFsIEFuYWx5c2lzDQpUaGUgaGlzdG9ncmFtIG9mIHRoZSByZXNpZHVhbHMgaXMgYXBwcm94aW1hdGVseSBub3JtYWwuIFdlIGhhdmUgbm8gZXh0cmVtZSBvdXRsaWVycyBiZWNhdXNlIG5vIHJlc2lkdWFscyBhcmUgb3V0c2lkZSBvZiBvdXIgdGhyZXNob2xkIG9mIHwzfC4gVGhlIG91dGxpZXIgcGxvdCBzaG93cyB0aGF0IGdhbWVzIDIsIDExLDEzIGFuZCAzMiBhcmUgYWxsIGhpZ2ggbGV2ZXJhZ2UuIFRoZSBDb29rJ3MgRGlzdGFuY2UgUGxvdCBzaG93cyB0aGF0IGdhbWUgMTEsIDMyLCAyMSBhbmQgMjYgYXJlIGFsbCBhYm92ZSB0aGUgdGhyZXNob2xkIG9mIDAuMS4gR2FtZXMgMTEgYW5kIDMyIGFyZSB0aGUgbW9zdCBpbmZsdWVudGlhbC5JbiBnYW1lIDExLCB0aGUgU3BhcmtzIHNjb3JlZCAxMTAgcG9pbnRzIGFuZCBpbiBnYW1lIDMyIHRoZXkgb25seSBzY29yZWQgNjIgcG9pbnRzLiANCg0KYGBge3IgcmVzaWR1YWxzfQ0KDQojY3JlYXRpbmcgaGlzdG9ncmFtIG9mIHJlc2lkdWFscw0Kb2xzX3Bsb3RfcmVzaWRfaGlzdChtb2RlbDQpDQoNCiNjcmVhdGluZyB2ZXJzdXMgZml0IHBsb3QNCm9sc19wbG90X3Jlc2lkX2ZpdChtb2RlbDQpDQoNCiNjcmVhdGluZyBzdHVkZW50aXplZCByZXNpZHVhbHMgcGxvdA0Kb2xzX3Bsb3RfcmVzaWRfc3R1ZChtb2RlbDQpDQoNCiNjcmVhdGluZyBsZXZlcmFnZSBwbG90DQpvbHNfcGxvdF9yZXNpZF9sZXYobW9kZWw0LCB0aHJlc2hvbGQgPSAzKQ0KDQojY3JlYXRpbmcgY29va3MgZGlzdGFuY2UgcGxvdA0Kb2xzX3Bsb3RfY29va3NkX2NoYXJ0KG1vZGVsNCkNCg0KYGBgDQoNCmBgYHtyIHByZWRpY3Rpb24sIGluY2x1ZGU9Rn0NCiN0byBmaW5kIHRoZSBtZWRpYW4gdmFsdWVzDQpzdW1tYXJ5KGNvcl9kYXRhKQ0KDQojY3JlYXRpbmcgbmV3IGRhdGEgZnJhbWUgZm9yIHRoZSBtZWRpYW4gZ2FtZQ0KbmV3ZGF0YT1kYXRhLmZyYW1lKGZpZWxkX2dvYWxfcGN0PTQwLjkwLCB0b3RhbF9yZWJvdW5kcyA9IDMzLCB0aHJlZV9wb2ludF9maWVsZF9nb2FsX3BjdCA9IDMyLjgwLCBzdGVhbHMgPSA2LjUpDQoNCiNwcmVkaWN0aW5nIHRlYW0gc2NvcmUgd2l0aCBtZWRpYW5zDQpwcmVkaWN0KG1vZGVsNCwgbmV3ZGF0YSwgaW50ZXJ2YWwgPSAiY29uZmlkZW5jZSIsIGxldmVsID0gMC45NSkNCmBgYA0KIyBGaW5hbCBQcmVkaWN0aW9uIA0KDQpJIGJ1aWx0IHRoZSBtb2RlbCB0byBwcmVkaWN0IG15IHRlYW0ncyBwb2ludHMgZm9yIGEgZ2FtZSB3aGVyZSB0aGV5IGFjaGlldmVkIHRoZSBtZWRpYW4gdmFsdWUgZm9yIGV2ZXJ5IHZhcmlhYmxlLiBUaGUgcHJlZGljdGVkIHRlYW0gc2NvcmUgaXMgYHJwcmVkaWN0WzFdYC4gV2l0aCA5NSUgY29uZmlkZW5jZSBpbnRlcnZhbCwgKGBycHJlZGljdFsyXWAsYHJwcmVkaWN0WzNdYCkNCg==