R Markdown
Introduction
Below are tables one and two that describe the overall summary for
the 2024 season as well as my team, the NY Liberty. The goal of this
project is to build the best model to predict points scored in a
“median” game. This season, the NY Liberty made it to the playoffs,
hence the greater number of observations for this team than others.
Table 1 – an overview of the observed variables’
means(including score, field goal percentage, rebounds, three point
percentage, and steals) along with the standard deviations, for all
teams.
Table 2 – a comparison of the overall wins and
losses for the New York Liberty in the 2024 season.
#table for Team Summaries
summary %>%
kbl(digits = 2, caption = "Team Summaries") %>%
kable_paper( full_width = F, html_font = "Cambria")
Team Summaries
|
team_name
|
mean_score
|
sd_score
|
mean_fgp
|
sd_fgp
|
mean_rebounds
|
sd_rebounds
|
mean_three
|
sd_three
|
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
|
#table for My Team
my_team_results %>%
kbl(digits = 1, caption = "My Team Wins/Losses") %>%
kable_paper( full_width = F, html_font = "Cambria")
My Team Wins/Losses
|
team_winner
|
mean
|
|
FALSE
|
80.0
|
|
TRUE
|
86.5
|
Plots
The box plot below displays how many points the NY Liberty scored in
games they won versus games they lost during the 2024 season. The
Liberty scored notably more points in their wins than in their losses,
with a mean of 86.475 in wins compared to 80 in losses. The distribution
for wins is also more narrow and skewed higher overall, while the loss
distribution shows greater spread and a lower tail.
library(ggplot2)
#create box plot for points scored by wins vs losses
boxplot(team_score ~ result, data = df_hist,
col = c('lightblue', 'lightgreen'),
main = "Points Scored by Game Result",
xlab = "Result", ylab = "Points")

Models
When assessing for model utility, no interactions were found between
the variables in the first model, so there was not a need for a reduced
model.
Interaction
Model
Model 2 is the interaction model. This model includes 4 first order
terms and 6 interaction terms. All interaction terms were found to be
non-significant as well as the first order term “steals”. These terms
were removed in the final model.
Final Model
After all models were run and model reduction was completed, my final
model is team_score= 3.2455521+ 1.1788679 * field_goal_pct + 0.5183829 *
total_rebounds + 0.285623 * three_point_field_goal_pct .
This model significantly predicts team score, f(3, 48) = 32.2409164,
p,.00001, adjusted R^2= 0.6476021 .
|
|
|
|
Dependent variable:
|
|
|
|
|
|
team_score
|
|
|
|
field_goal_pct
|
1.179***
|
|
|
(0.181)
|
|
|
|
|
total_rebounds
|
0.518***
|
|
|
(0.151)
|
|
|
|
|
three_point_field_goal_pct
|
0.286***
|
|
|
(0.101)
|
|
|
|
|
Constant
|
3.246
|
|
|
(10.049)
|
|
|
|
|
|
|
Observations
|
52
|
|
R2
|
0.668
|
|
Adjusted R2
|
0.648
|
|
Residual Std. Error
|
5.887 (df = 48)
|
|
F Statistic
|
32.241*** (df = 3; 48)
|
|
|
|
Note:
|
p<0.1; p<0.05;
p<0.01
|
Residual Analysis
Histogram: The residual histogram demonstrates a
normal distribution of the residuals.
Versus Fits Plot: The residuals appear to be
randomly scattered, following no curve or pattern, satisfying the
linearity assumption. There is no apparent heteroscedasticity as the
spread of the residuals stays roughly the same across all fitted
values.
Cook’s D Plot: Five outliers are detected by this
plot, with the most significant being observations 12 and 30.
Observation 12 (NY Liberty vs ATL Dream, 9-19-24) was a particularly low
scoring game, with a lower number of rebounds, and a high three point
percentage, compared to the mean values. Observation 30 (NY Liberty vs
CT Sun, 7-10-24) was also a relatively low scoring game, with a lower
three point percentage and low amount of steals, compared to the mean
values.
Studentized Residual Plot: The studentized residual
plot identifies two leverage points: observation 12(NY Liberty vs ATL
Dream, 9-19-24) and 1 (NY Liberty vs MN Lynx, 10-20-24).
#residual plots for final model
hist(model3$residuals)

plot(model3$fitted.values, model3$residuals)

ols_plot_cooksd_bar(model3)

ols_plot_resid_lev(model3, threshold = 3)

Prediction and
Estimation
I built this model to predict my team’s points for a game in which
they achieve the median value for each variable. The experimental region
is (-13.8325, 15.1010). The predicted team score is 84.6709881, with 95%
confidence interval (83.0084105, 86.3335656)
LS0tCnRpdGxlOiAiUiBBc3NpZ25tZW50IDYiCmF1dGhvcjogIkxlYWggWnVyZmx1ZWgiCmRhdGU6ICJNYXkgNCwgMjAyNiIKb3V0cHV0OgogIGh0bWxfZG9jdW1lbnQ6IAogICAgY3NzOiBzdHlsZXMuY3NzCiAgICB0b2M6IHllcwogICAgdG9jX2RlcHRoOiA0CiAgICB0b2NfZmxvYXQ6IHllcwogICAgbnVtYmVyX3NlY3Rpb25zOiB5ZXMKICAgIHRvY19jb2xsYXBzZWQ6IHllcwogICAgY29kZV9mb2xkaW5nOiBoaWRlCiAgICBjb2RlX2Rvd25sb2FkOiB5ZXMKICAgIHNtb290aF9zY3JvbGw6IHllcwogICAgdGhlbWU6IGx1bWVuCiAgcGRmX2RvY3VtZW50OiAKICAgIHRvYzogeWVzCiAgICB0b2NfZGVwdGg6IDQKICAgIGZpZ19jYXB0aW9uOiB5ZXMKICAgIG51bWJlcl9zZWN0aW9uczogeWVzCiAgICBmaWdfd2lkdGg6IDMKICAgIGZpZ19oZWlnaHQ6IDMKICB3b3JkX2RvY3VtZW50OiAKICAgIHRvYzogeWVzCiAgICB0b2NfZGVwdGg6IDQKICAgIGZpZ19jYXB0aW9uOiB5ZXMKICAgIGtlZXBfbWQ6IHllcwplZGl0b3Jfb3B0aW9uczogCiAgY2h1bmtfb3V0cHV0X3R5cGU6IGlubGluZQotLS0KCmBgYHtjc3MsIGVjaG8gPSBGQUxTRX0KI1RPQzo6YmVmb3JlIHsKICBjb250ZW50OiAiVGFibGUgb2YgQ29udGVudHMiOwogIGZvbnQtd2VpZ2h0OiBib2xkOwogIGZvbnQtc2l6ZTogMS4yZW07CiAgZGlzcGxheTogYmxvY2s7CiAgY29sb3I6IG5hdnk7CiAgbWFyZ2luLWJvdHRvbTogMTBweDsKfQoKCmRpdiNUT0MgbGkgeyAgICAgLyogdGFibGUgb2YgY29udGVudCAgKi8KICAgIGxpc3Qtc3R5bGU6dXBwZXItcm9tYW47CiAgICBiYWNrZ3JvdW5kLWltYWdlOm5vbmU7CiAgICBiYWNrZ3JvdW5kLXJlcGVhdDpub25lOwogICAgYmFja2dyb3VuZC1wb3NpdGlvbjowOwp9CgpoMS50aXRsZSB7ICAgIC8qIGxldmVsIDEgaGVhZGVyIG9mIHRpdGxlICAqLwogIGZvbnQtc2l6ZTogMjJweDsKICBmb250LXdlaWdodDogYm9sZDsKICBjb2xvcjogRGFya1JlZDsKICB0ZXh0LWFsaWduOiBjZW50ZXI7CiAgZm9udC1mYW1pbHk6ICJHaWxsIFNhbnMiLCBzYW5zLXNlcmlmOwp9CgpoNC5hdXRob3IgeyAvKiBIZWFkZXIgNCAtIGFuZCB0aGUgYXV0aG9yIGFuZCBkYXRhIGhlYWRlcnMgdXNlIHRoaXMgdG9vICAqLwogIGZvbnQtc2l6ZTogMTVweDsKICBmb250LXdlaWdodDogYm9sZDsKICBmb250LWZhbWlseTogc3lzdGVtLXVpOwogIGNvbG9yOiBuYXZ5OwogIHRleHQtYWxpZ246IGNlbnRlcjsKfQoKaDQuZGF0ZSB7IC8qIEhlYWRlciA0IC0gYW5kIHRoZSBhdXRob3IgYW5kIGRhdGEgaGVhZGVycyB1c2UgdGhpcyB0b28gICovCiAgZm9udC1zaXplOiAxOHB4OwogIGZvbnQtd2VpZ2h0OiBib2xkOwogIGZvbnQtZmFtaWx5OiAiR2lsbCBTYW5zIiwgc2Fucy1zZXJpZjsKICBjb2xvcjogRGFya0JsdWU7CiAgdGV4dC1hbGlnbjogY2VudGVyOwp9CgpoMSB7IC8qIEhlYWRlciAxIC0gYW5kIHRoZSBhdXRob3IgYW5kIGRhdGEgaGVhZGVycyB1c2UgdGhpcyB0b28gICovCiAgICBmb250LXNpemU6IDIwcHg7CiAgICBmb250LXdlaWdodDogYm9sZDsKICAgIGZvbnQtZmFtaWx5OiAiVGltZXMgTmV3IFJvbWFuIiwgVGltZXMsIHNlcmlmOwogICAgY29sb3I6IGRhcmtyZWQ7CiAgICB0ZXh0LWFsaWduOiBsZWZ0Owp9CgpoMiB7IC8qIEhlYWRlciAyIC0gYW5kIHRoZSBhdXRob3IgYW5kIGRhdGEgaGVhZGVycyB1c2UgdGhpcyB0b28gICovCiAgICBmb250LXNpemU6IDE4cHg7CiAgICBmb250LXdlaWdodDogYm9sZDsKICAgIGZvbnQtZmFtaWx5OiAiVGltZXMgTmV3IFJvbWFuIiwgVGltZXMsIHNlcmlmOwogICAgY29sb3I6IG5hdnk7CiAgICB0ZXh0LWFsaWduOiBsZWZ0Owp9CgpoMyB7IC8qIEhlYWRlciAzIC0gYW5kIHRoZSBhdXRob3IgYW5kIGRhdGEgaGVhZGVycyB1c2UgdGhpcyB0b28gICovCiAgICBmb250LXNpemU6IDE2cHg7CiAgICBmb250LXdlaWdodDogYm9sZDsKICAgIGZvbnQtZmFtaWx5OiAiVGltZXMgTmV3IFJvbWFuIiwgVGltZXMsIHNlcmlmOwogICAgY29sb3I6IG5hdnk7CiAgICB0ZXh0LWFsaWduOiBsZWZ0Owp9CgpoNCB7IC8qIEhlYWRlciA0IC0gYW5kIHRoZSBhdXRob3IgYW5kIGRhdGEgaGVhZGVycyB1c2UgdGhpcyB0b28gICovCiAgICBmb250LXNpemU6IDE0cHg7CiAgZm9udC13ZWlnaHQ6IGJvbGQ7CiAgICBmb250LWZhbWlseTogIlRpbWVzIE5ldyBSb21hbiIsIFRpbWVzLCBzZXJpZjsKICAgIGNvbG9yOiBkYXJrcmVkOwogICAgdGV4dC1hbGlnbjogbGVmdDsKfQoKLyogQWRkIGRvdHMgYWZ0ZXIgbnVtYmVyZWQgaGVhZGVycyAqLwouaGVhZGVyLXNlY3Rpb24tbnVtYmVyOjphZnRlciB7CiAgY29udGVudDogIi4iOwoKYm9keSB7IGJhY2tncm91bmQtY29sb3I6d2hpdGU7IH0KCi5oaWdobGlnaHRtZSB7IGJhY2tncm91bmQtY29sb3I6eWVsbG93OyB9CgpwIHsgYmFja2dyb3VuZC1jb2xvcjp3aGl0ZTsgfQoKfQpgYGAKCgpgYGB7ciBzZXR1cCwgaW5jbHVkZT1GQUxTRX0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KGVjaG8gPSBUUlVFKQoKc2V0d2QoIn4vTGlicmFyeS9DbG91ZFN0b3JhZ2UvT25lRHJpdmUtV2VzdENoZXN0ZXJVbml2ZXJzaXR5b2ZQQS9TVEEgMzE5IHNwcmluZyAyMDI2IikKCmRhdGE9cmVhZC5jc3YoIldOQkFfMjAyNV9ib3gtc2NvcmVzLmNzdiIsIGhlYWRlciA9IFQpCgpsaWJyYXJ5KGdncGxvdDIpCmxpYnJhcnkoZHBseXIpCmxpYnJhcnkoY2FyKQpsaWJyYXJ5KG9sc3JyKQpsaWJyYXJ5KGthYmxlRXh0cmEpCgpgYGAKCiMjIFIgTWFya2Rvd24KCgpgYGB7ciB3cmFuZ2xpbmcsIGluY2x1ZGU9RkFMU0V9CgpzdW1tYXJ5KGRhdGEpCmxpYnJhcnkoZHBseXIpCgojQWxsIFdCTkEgdGVhbXMgaW5jbHVkZWQsIHJlbW92ZSBzY29yZXMgZnJvbSBBbGwgc3RhciBnYW1lIApkYXRhID0gZGF0YSAlPiUKICBmaWx0ZXIodGVhbV9uYW1lICE9ICJUZWFtIFdOQkEiICYgdGVhbV9uYW1lICE9ICJUZWFtIFVTQSIpCgojIGdyb3VwIGRhdGEgYnkgdGVhbSwgZmluZCBtZWFuL3NkIG9mIGFsbCB2YXJpYWJsZXMKc3VtbWFyeSA9IGRhdGEgJT4lCiAgZ3JvdXBfYnkodGVhbV9uYW1lKSAlPiUgCiAgc3VtbWFyaXNlKG1lYW5fc2NvcmU9bWVhbih0ZWFtX3Njb3JlKSwgc2Rfc2NvcmU9c2QodGVhbV9zY29yZSksIAogICAgICAgICAgICBtZWFuX2ZncD1tZWFuKGZpZWxkX2dvYWxfcGN0KSwgc2RfZmdwPXNkKGZpZWxkX2dvYWxfcGN0KSwgCiAgICAgICAgICAgbWVhbl9yZWJvdW5kcz1tZWFuKHRvdGFsX3JlYm91bmRzKSwgc2RfcmVib3VuZHM9c2QodG90YWxfcmVib3VuZHMpLAogICAgICAgICAgIG1lYW5fdGhyZWU9bWVhbih0aHJlZV9wb2ludF9maWVsZF9nb2FsX3BjdCksIHNkX3RocmVlPXNkKHRocmVlX3BvaW50X2ZpZWxkX2dvYWxfcGN0KSwKICAgICAgICAgICBtZWFuX3N0ZWFscz1tZWFuKHN0ZWFscyksIHNkX3N0ZWFscz1zZChzdGVhbHMpKSAKCiAgCiNzZWxlY3Qgb25seSB2YXJpYWJsZXMgd2UgbmVlZCBhbmQgZmlsdGVyIG9uIG15IHRlYW0KbXlfdGVhbSA9IGRhdGEgJT4lCiAgc2VsZWN0KHRlYW1fc2NvcmUsIGZpZWxkX2dvYWxfcGN0LCB0b3RhbF9yZWJvdW5kcywgCiAgICAgICAgIHRocmVlX3BvaW50X2ZpZWxkX2dvYWxfcGN0LCBzdGVhbHMsIHRlYW1fbmFtZSwgdGVhbV93aW5uZXIpICU+JQogIGZpbHRlcih0ZWFtX25hbWUgPT0gIkxpYmVydHkiKQoKI2dyb3VwcyBjYXNlcyBieSB3aW4gdnMuIGxvc3MKI3N1bW1hcml6ZSBhbGwgdmFyaWFibGVzIHdpdGggbWVhbiBhbmQgc2QKbXlfdGVhbV9yZXN1bHRzID0gbXlfdGVhbSAlPiUgCiAgZ3JvdXBfYnkodGVhbV93aW5uZXIpICU+JQogIHN1bW1hcmlzZShtZWFuPW1lYW4odGVhbV9zY29yZSkpCiNjcmVhdGUgbmV3IGRhdGEgZnJhbWUgZm9yIG15IHRlYW0ncyB3aW5zIGFuZCBsb3NzZXMgCmRmX2hpc3QgPSBkYXRhICU+JSAKICAgIGZpbHRlcih0ZWFtX25hbWUgPT0gIkxpYmVydHkiKSAlPiUKICAgIG11dGF0ZSAocmVzdWx0PSBjYXNlX3doZW4odGVhbV93aW5uZXIgPT0gVFJVRSB+ICJ3aW4iLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVhbV93aW5uZXIgPT0gRkFMU0UgfiAibG9zcyIpKQoKYGBgCgojIEludHJvZHVjdGlvbgoKCkJlbG93IGFyZSB0YWJsZXMgb25lIGFuZCB0d28gdGhhdCBkZXNjcmliZSB0aGUgb3ZlcmFsbCBzdW1tYXJ5IGZvciB0aGUgMjAyNCBzZWFzb24gYXMgd2VsbCBhcyBteSB0ZWFtLCB0aGUgTlkgTGliZXJ0eS4gVGhlIGdvYWwgb2YgdGhpcyBwcm9qZWN0IGlzIHRvIGJ1aWxkIHRoZSBiZXN0IG1vZGVsIHRvIHByZWRpY3QgcG9pbnRzIHNjb3JlZCBpbiBhICJtZWRpYW4iIGdhbWUuIFRoaXMgc2Vhc29uLCB0aGUgTlkgTGliZXJ0eSBtYWRlIGl0IHRvIHRoZSBwbGF5b2ZmcywgaGVuY2UgdGhlIGdyZWF0ZXIgbnVtYmVyIG9mIG9ic2VydmF0aW9ucyBmb3IgdGhpcyB0ZWFtIHRoYW4gb3RoZXJzLiAKCioqVGFibGUgMSoqIC0tIGFuIG92ZXJ2aWV3IG9mIHRoZSBvYnNlcnZlZCB2YXJpYWJsZXMnIG1lYW5zKGluY2x1ZGluZyBzY29yZSwgZmllbGQgZ29hbCBwZXJjZW50YWdlLCByZWJvdW5kcywgdGhyZWUgcG9pbnQgcGVyY2VudGFnZSwgYW5kIHN0ZWFscykgYWxvbmcgd2l0aCB0aGUgc3RhbmRhcmQgZGV2aWF0aW9ucywgZm9yIGFsbCB0ZWFtcy4gCgoqKlRhYmxlIDIqKiAtLSBhIGNvbXBhcmlzb24gb2YgdGhlIG92ZXJhbGwgd2lucyBhbmQgbG9zc2VzIGZvciB0aGUgTmV3IFlvcmsgTGliZXJ0eSBpbiB0aGUgMjAyNCBzZWFzb24uIAoKYGBge3IgdGFibGVzLCBpbmNsdWRlPVRSVUV9CiN0YWJsZSBmb3IgVGVhbSBTdW1tYXJpZXMgCnN1bW1hcnkgJT4lCiAga2JsKGRpZ2l0cyA9IDIsIGNhcHRpb24gPSAiVGVhbSBTdW1tYXJpZXMiKSAlPiUKICBrYWJsZV9wYXBlciggZnVsbF93aWR0aCA9IEYsIGh0bWxfZm9udCA9ICJDYW1icmlhIikgCiAgCiN0YWJsZSBmb3IgTXkgVGVhbSAKbXlfdGVhbV9yZXN1bHRzICU+JQogIGtibChkaWdpdHMgPSAxLCBjYXB0aW9uID0gIk15IFRlYW0gV2lucy9Mb3NzZXMiKSAlPiUKICBrYWJsZV9wYXBlciggZnVsbF93aWR0aCA9IEYsIGh0bWxfZm9udCA9ICJDYW1icmlhIikKCmBgYAoKIyBQbG90cwoKVGhlIGJveCBwbG90IGJlbG93IGRpc3BsYXlzIGhvdyBtYW55IHBvaW50cyB0aGUgTlkgTGliZXJ0eSBzY29yZWQgaW4gZ2FtZXMgdGhleSB3b24gdmVyc3VzIGdhbWVzIHRoZXkgbG9zdCBkdXJpbmcgdGhlIDIwMjQgc2Vhc29uLiBUaGUgTGliZXJ0eSBzY29yZWQgbm90YWJseSBtb3JlIHBvaW50cyBpbiB0aGVpciB3aW5zIHRoYW4gaW4gdGhlaXIgbG9zc2VzLCB3aXRoIGEgbWVhbiBvZiA4Ni40NzUgaW4gd2lucyBjb21wYXJlZCB0byA4MCBpbiBsb3NzZXMuIFRoZSBkaXN0cmlidXRpb24gZm9yIHdpbnMgaXMgYWxzbyBtb3JlIG5hcnJvdyBhbmQgc2tld2VkIGhpZ2hlciBvdmVyYWxsLCB3aGlsZSB0aGUgbG9zcyBkaXN0cmlidXRpb24gc2hvd3MgZ3JlYXRlciBzcHJlYWQgYW5kIGEgbG93ZXIgdGFpbC4gCgoKYGBge3IgZ3JhcGhzLCBpbmNsdWRlPVRSVUUsIGZpZy53aWR0aD00LCBmaWcuaGVpZ2h0PTQsIGZpZy5hbGlnbj0nY2VudGVyJ30KCmxpYnJhcnkoZ2dwbG90MikKI2NyZWF0ZSBib3ggcGxvdCBmb3IgcG9pbnRzIHNjb3JlZCBieSB3aW5zIHZzIGxvc3Nlcwpib3hwbG90KHRlYW1fc2NvcmUgfiByZXN1bHQsIGRhdGEgPSBkZl9oaXN0LCAKICAgICAgICBjb2wgPSBjKCdsaWdodGJsdWUnLCAnbGlnaHRncmVlbicpLAogICAgICAgIG1haW4gPSAiUG9pbnRzIFNjb3JlZCBieSBHYW1lIFJlc3VsdCIsIAogICAgICAgIHhsYWIgPSAiUmVzdWx0IiwgeWxhYiA9ICJQb2ludHMiKSAgCgpgYGAKCiMgTW9kZWxzCgpXaGVuIGFzc2Vzc2luZyBmb3IgbW9kZWwgdXRpbGl0eSwgbm8gaW50ZXJhY3Rpb25zIHdlcmUgZm91bmQgYmV0d2VlbiB0aGUgdmFyaWFibGVzIGluIHRoZSBmaXJzdCBtb2RlbCwgc28gdGhlcmUgd2FzIG5vdCBhIG5lZWQgZm9yIGEgcmVkdWNlZCBtb2RlbC4gCgoKYGBge3IgZmlyc3Qgb3JkZXIgbW9kZWwsIGluY2x1ZGU9RkFMU0V9CiNtb2RlbCAxIGlzIGEgZmlyc3Qgb3JkZXIgbW9kZWwgd2l0aCA0IHRlcm1zIAptb2RlbCA9IGxtKHRlYW1fc2NvcmV+IGZpZWxkX2dvYWxfcGN0ICsgdG90YWxfcmVib3VuZHMgKyB0aHJlZV9wb2ludF9maWVsZF9nb2FsX3BjdCsgc3RlYWxzLCBkYXRhPW15X3RlYW0pCnN1bW1hcnkgKG1vZGVsKQoKI2NvcnJlbGF0aW9uIG1hdHJpeCByZXF1aXJlcyBhbGwgcXVhbnRpdGF0aXZlIHZhcmlhYmxlcyBzbyBrZWVwIG9ubHkgdGhvc2UgdmFyaWFibGVzCmNvcl9kYXRhPSBteV90ZWFtICU+JQogIHNlbGVjdCh0ZWFtX3Njb3JlLCBmaWVsZF9nb2FsX3BjdCwgdG90YWxfcmVib3VuZHMsIAogICAgICAgICB0aHJlZV9wb2ludF9maWVsZF9nb2FsX3BjdCwgc3RlYWxzKQojY29ycmVsYXRpb24gbWF0cml4CmNvcihjb3JfZGF0YSkKCiNubyB2YXJpYWJsZSBpbnRlcmFjdGlvbnMsIHNvIG5vIG5lZWQgZm9yIGEgcmVkdWNlZCBtb2RlbAoKYGBgCgojIyBJbnRlcmFjdGlvbiBNb2RlbApNb2RlbCAyIGlzIHRoZSBpbnRlcmFjdGlvbiBtb2RlbC4gVGhpcyBtb2RlbCBpbmNsdWRlcyA0IGZpcnN0IG9yZGVyIHRlcm1zIGFuZCA2IGludGVyYWN0aW9uIHRlcm1zLiBBbGwgaW50ZXJhY3Rpb24gdGVybXMgd2VyZSBmb3VuZCB0byBiZSBub24tc2lnbmlmaWNhbnQgYXMgd2VsbCBhcyB0aGUgZmlyc3Qgb3JkZXIgdGVybSAic3RlYWxzIi4gVGhlc2UgdGVybXMgd2VyZSByZW1vdmVkIGluIHRoZSBmaW5hbCBtb2RlbC4gCgpgYGB7ciBpbnRlcmFjdGlvbiBtb2RlbCxyZXN1bHRzPSdhc2lzJywgaW5jbHVkZT1GfQojbW9kZWwgMiBpcyBhbiBpbnRlcmFjdGlvbiBtb2RlbCAKbW9kZWwyPWxtKHRlYW1fc2NvcmV+IGZpZWxkX2dvYWxfcGN0K3RvdGFsX3JlYm91bmRzKwogICAgICAgICAgICB0aHJlZV9wb2ludF9maWVsZF9nb2FsX3BjdCtzdGVhbHMrCiAgICAgICAgICBmaWVsZF9nb2FsX3BjdCp0b3RhbF9yZWJvdW5kcysgCiAgICAgICAgICAgIGZpZWxkX2dvYWxfcGN0KnRocmVlX3BvaW50X2ZpZWxkX2dvYWxfcGN0KwogICAgICAgICAgICBmaWVsZF9nb2FsX3BjdCpzdGVhbHMrCiAgICAgICAgICAgIHRvdGFsX3JlYm91bmRzKnRocmVlX3BvaW50X2ZpZWxkX2dvYWxfcGN0KwogICAgICAgICAgICB0b3RhbF9yZWJvdW5kcypzdGVhbHMrCiAgICAgICAgICAgIHRocmVlX3BvaW50X2ZpZWxkX2dvYWxfcGN0KnN0ZWFscywgZGF0YT1teV90ZWFtKQpzdW1tYXJ5KG1vZGVsMikKCiNtb2RlbCAzIGlzIHRoZSBmaW5hbCBtb2RlbCwgcmVkdWNlZCB3aXRoIG5vbi1zaWduaWZpY2FudCB0ZXJtcyByZW1vdmVkCm1vZGVsMyA9IGxtKHRlYW1fc2NvcmV+IGZpZWxkX2dvYWxfcGN0ICsgdG90YWxfcmVib3VuZHMgKyB0aHJlZV9wb2ludF9maWVsZF9nb2FsX3BjdCwgZGF0YT1teV90ZWFtKQptb2RlbDNzdW09c3VtbWFyeSAobW9kZWwzKQoKYGBgCgojIyMgRmluYWwgTW9kZWwKCkFmdGVyIGFsbCBtb2RlbHMgd2VyZSBydW4gYW5kIG1vZGVsIHJlZHVjdGlvbiB3YXMgY29tcGxldGVkLCBteSBmaW5hbCBtb2RlbCBpcyB0ZWFtX3Njb3JlPSBgciBtb2RlbDMkY29lZmZpY2llbnRzWzFdYCsgYHIgbW9kZWwzJGNvZWZmaWNpZW50c1syXWAgKiBmaWVsZF9nb2FsX3BjdCArIGByIG1vZGVsMyRjb2VmZmljaWVudHNbM11gICogdG90YWxfcmVib3VuZHMgKyBgciBtb2RlbDMkY29lZmZpY2llbnRzWzRdYCAqIHRocmVlX3BvaW50X2ZpZWxkX2dvYWxfcGN0IC4gCgpUaGlzIG1vZGVsIHNpZ25pZmljYW50bHkgcHJlZGljdHMgdGVhbSBzY29yZSwgZihgciBtb2RlbDNzdW0kZnN0YXRpc3RpY1syXWAsIGByIG1vZGVsM3N1bSRmc3RhdGlzdGljWzNdYCkgPSBgciBtb2RlbDNzdW0kZnN0YXRpc3RpY1sxXWAsIHAsLjAwMDAxLCBhZGp1c3RlZCBSXjI9IGByIG1vZGVsM3N1bSRhZGouci5zcXVhcmVkYCAuCgpgYGAge3IgZmluYWwgdGFibGUsIHJlc3VsdHM9J2FzaXMnLCBlY2hvPUYsIGluY2x1ZGU9IFQsIG1lc3NhZ2U9Rn0KCiN0YWJsZSB0byBzdW1tYXJpemUgZmluYWwgbW9kZWwKbGlicmFyeShzdGFyZ2F6ZXIpCnN0YXJnYXplcihtb2RlbDMsIHR5cGUgPSAiaHRtbCIpCiAKYGBgCgojIFJlc2lkdWFsIEFuYWx5c2lzCgoqKkhpc3RvZ3JhbSoqOiBUaGUgcmVzaWR1YWwgaGlzdG9ncmFtIGRlbW9uc3RyYXRlcyBhIG5vcm1hbCBkaXN0cmlidXRpb24gb2YgdGhlIHJlc2lkdWFscy4gCgoqKlZlcnN1cyBGaXRzIFBsb3QqKjogVGhlIHJlc2lkdWFscyBhcHBlYXIgdG8gYmUgcmFuZG9tbHkgc2NhdHRlcmVkLCBmb2xsb3dpbmcgbm8gY3VydmUgb3IgcGF0dGVybiwgc2F0aXNmeWluZyB0aGUgbGluZWFyaXR5IGFzc3VtcHRpb24uIFRoZXJlIGlzIG5vIGFwcGFyZW50IGhldGVyb3NjZWRhc3RpY2l0eSBhcyB0aGUgc3ByZWFkIG9mIHRoZSByZXNpZHVhbHMgc3RheXMgcm91Z2hseSB0aGUgc2FtZSBhY3Jvc3MgYWxsIGZpdHRlZCB2YWx1ZXMuIAoKKipDb29rJ3MgRCBQbG90Kio6IEZpdmUgb3V0bGllcnMgYXJlIGRldGVjdGVkIGJ5IHRoaXMgcGxvdCwgd2l0aCB0aGUgbW9zdCBzaWduaWZpY2FudCBiZWluZyBvYnNlcnZhdGlvbnMgMTIgYW5kIDMwLiBPYnNlcnZhdGlvbiAxMiAoTlkgTGliZXJ0eSB2cyBBVEwgRHJlYW0sIDktMTktMjQpIHdhcyBhIHBhcnRpY3VsYXJseSBsb3cgc2NvcmluZyBnYW1lLCB3aXRoIGEgbG93ZXIgbnVtYmVyIG9mIHJlYm91bmRzLCBhbmQgYSBoaWdoIHRocmVlIHBvaW50IHBlcmNlbnRhZ2UsIGNvbXBhcmVkIHRvIHRoZSBtZWFuIHZhbHVlcy4gT2JzZXJ2YXRpb24gMzAgKE5ZIExpYmVydHkgdnMgQ1QgU3VuLCA3LTEwLTI0KSB3YXMgYWxzbyBhIHJlbGF0aXZlbHkgbG93IHNjb3JpbmcgZ2FtZSwgd2l0aCBhIGxvd2VyIHRocmVlIHBvaW50IHBlcmNlbnRhZ2UgYW5kIGxvdyBhbW91bnQgb2Ygc3RlYWxzLCBjb21wYXJlZCB0byB0aGUgbWVhbiB2YWx1ZXMuIAoKKipTdHVkZW50aXplZCBSZXNpZHVhbCBQbG90Kio6IFRoZSBzdHVkZW50aXplZCByZXNpZHVhbCBwbG90IGlkZW50aWZpZXMgdHdvIGxldmVyYWdlIHBvaW50czogb2JzZXJ2YXRpb24gMTIoTlkgTGliZXJ0eSB2cyBBVEwgRHJlYW0sIDktMTktMjQpIGFuZCAxIChOWSBMaWJlcnR5IHZzIE1OIEx5bngsIDEwLTIwLTI0KS4gCgoKYGBge3IgcmVzaWR1YWxzfQojcmVzaWR1YWwgcGxvdHMgZm9yIGZpbmFsIG1vZGVsIApoaXN0KG1vZGVsMyRyZXNpZHVhbHMpCnBsb3QobW9kZWwzJGZpdHRlZC52YWx1ZXMsIG1vZGVsMyRyZXNpZHVhbHMpCm9sc19wbG90X2Nvb2tzZF9iYXIobW9kZWwzKQpvbHNfcGxvdF9yZXNpZF9sZXYobW9kZWwzLCB0aHJlc2hvbGQgPSAzKQpgYGAKCiMgUHJlZGljdGlvbiBhbmQgRXN0aW1hdGlvbiAKCmBgYHtyIHByZWRpY3Rpb24sIGluY2x1ZGU9RkFMU0V9CiN0aGlzIHN1bW1hcnkgaXMgZm9yIGZpbmRpbmcgdGhlIG1lZGlhbiB2YWx1ZXMKc3VtbWFyeShjb3JfZGF0YSkKI3RoaXMgaXMgYSBuZXcgZGF0YSBmcmFtZSBmb3IgdGhlIG1lZGlhbiBnYW1lCm5ld2RhdGE9ZGF0YS5mcmFtZShmaWVsZF9nb2FsX3BjdD0gNDQuMjUgLCB0b3RhbF9yZWJvdW5kcz0gMzYuNSwgdGhyZWVfcG9pbnRfZmllbGRfZ29hbF9wY3Q9IDM2LjIwKQojcHJlZGljdGluZyB0aGUgbWVkaWFuIGdhbWUKcHJlZGljdGlvbj1wcmVkaWN0KG1vZGVsMywgbmV3ZGF0YSwgaW50ZXJ2YWw9ICJjb25maWRlbmNlIiwgbGV2ZWw9Ljk1KQoKYGBgCkkgYnVpbHQgdGhpcyBtb2RlbCB0byBwcmVkaWN0IG15IHRlYW0ncyBwb2ludHMgZm9yIGEgZ2FtZSBpbiB3aGljaCB0aGV5IGFjaGlldmUgdGhlIG1lZGlhbiB2YWx1ZSBmb3IgZWFjaCB2YXJpYWJsZS4gVGhlIGV4cGVyaW1lbnRhbCByZWdpb24gaXMgKC0xMy44MzI1LCAxNS4xMDEwKS4gVGhlIHByZWRpY3RlZCB0ZWFtIHNjb3JlIGlzIGByIHByZWRpY3Rpb25bMV1gLCB3aXRoIDk1JSBjb25maWRlbmNlIGludGVydmFsIChgciBwcmVkaWN0aW9uWzJdYCwgYHIgcHJlZGljdGlvblszXWApCgo=