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

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
|
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)

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==