Introduction

Sports betting markets offer an interesting way to examine how public behavior relates to game outcomes. In this project, I study whether betting distribution data, specifically the percentage of bets and the percentage of money placed on each team, help explain whether a team covers the point spread in NFL regular season games. The betting percentages used in this analysis were manually scraped from Vegas Insider’s website because they are not available in a format that can be directly imported into R. As a result, each game required individual data collection and preprocessing. The final dataset includes betting distribution information for 197 regular season games. Using this data, logistic regression models are applied to compare the predictive value of public betting volume and betting handle, both individually and jointly. Because each game contributes two team-level observations (entered side and reciprocal side), results should be interpreted as team-level associations rather than fully independent game outcomes.

Public Money Model

A logistic regression model was fit to examine whether the percentage of public money (Money %), also known as the betting handle percentage, placed on a team predicts whether that team covers the spread (1 = covered, 0 = did not cover).

## 
## Call:
## glm(formula = covered ~ `Money %`, family = binomial(), data = public_df)
## 
## Coefficients:
##             Estimate Std. Error z value Pr(>|z|)
## (Intercept)  -0.1080     0.3076  -0.351    0.725
## `Money %`     0.2161     0.5812   0.372    0.710
## 
## (Dispersion parameter for binomial family taken to be 1)
## 
##     Null deviance: 546.20  on 393  degrees of freedom
## Residual deviance: 546.06  on 392  degrees of freedom
## AIC: 550.06
## 
## Number of Fisher Scoring iterations: 3
## (Intercept)   `Money %` 
##   0.8975957   1.2411905

The estimated coefficient for Money % was 0.216 (SE = 0.581, z = 0.372, p = 0.710). This coefficient is not statistically significant, indicating no evidence that the percentage of public money is associated with covering the spread.

Exponentiating the coefficient yields an odds ratio of 1.24. This suggests that a one-unit increase in Money % is associated with a 24% increase in the odds of covering, holding everything else constant. However, because the effect is not statistically significant, this apparent increase is likely due to random variation rather than a real betting edge.

Model fit statistics further support the lack of predictive power. The residual deviance (546.06) is nearly identical to the null deviance (546.20), indicating that adding Money % does not meaningfully improve the model over an intercept-only model. The AIC of 550.06 similarly suggests no improvement in fit.

Public Bets Model

A logistic regression model was fit to evaluate whether the percentage of bets (Bets %), placed on a team is associated with the likelihood that the team covers the spread.

## 
## Call:
## glm(formula = covered ~ `Bets %`, family = binomial(), data = public_df)
## 
## Coefficients:
##             Estimate Std. Error z value Pr(>|z|)  
## (Intercept)   0.6363     0.3195   1.991   0.0464 *
## `Bets %`     -1.2726     0.6061  -2.100   0.0358 *
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for binomial family taken to be 1)
## 
##     Null deviance: 546.20  on 393  degrees of freedom
## Residual deviance: 541.74  on 392  degrees of freedom
## AIC: 545.74
## 
## Number of Fisher Scoring iterations: 4
## (Intercept)    `Bets %` 
##   1.8894810   0.2801012

The coefficient for Bets % is −1.273 (SE = 0.606, z = −2.10, p = 0.036), which is statistically significant at the 5% level. This indicates a meaningful negative relationship between the share of bets and covering the spread.

Exponentiating the coefficient gives an odds ratio of approximately 0.28. This means that, holding everything else constant, a one-unit increase in Bets % is associated with a 72% decrease in the odds of covering the spread. In practical terms, teams receiving a higher share of public bets are significantly less likely to cover.

Model fit statistics suggest modest improvement over the null model. The residual deviance (541.74) is lower than the null deviance (546.20), and the AIC decreases to 545.74, indicating that Bets % provides additional explanatory power compared to an intercept-only model.

Multiple Logistic Regression Model

While Bets % showed a statistically significant negative association with covering, Money % was not statistically significant when modeled on its own, suggesting that handle alone may not fully explain spread outcomes. However, these two variables capture different aspects of betting behavior. Bets % reflects public betting volume, while Money % reflects where larger wagers are placed. These are likely correlated. Typically, the “sharp” bettors place larger wagers on games with a low Bets %, which could make the two variables go in opposite directions.

To better understand their combined influence, a multiple logistic regression model including both Bets % and Money % was fit. This approach allows each variable’s effect to be evaluated while controlling for the other, providing a clearer picture of how public sentiment and betting capital jointly relate to covering the spread

## 
## Call:
## glm(formula = covered ~ `Money %` + `Bets %`, family = binomial(), 
##     data = public_df)
## 
## Coefficients:
##             Estimate Std. Error z value Pr(>|z|)   
## (Intercept)   0.3416     0.3396   1.006  0.31444   
## `Money %`     2.1767     0.8509   2.558  0.01053 * 
## `Bets %`     -2.8600     0.8768  -3.262  0.00111 **
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for binomial family taken to be 1)
## 
##     Null deviance: 546.20  on 393  degrees of freedom
## Residual deviance: 534.93  on 391  degrees of freedom
## AIC: 540.93
## 
## Number of Fisher Scoring iterations: 4
## (Intercept)   `Money %`    `Bets %` 
##  1.40725509  8.81712411  0.05727003

A multiple logistic regression model including both Money % and Bets % was fit to predict whether a team covers the spread. When both variables are included, each becomes statistically significant, but with effects in opposite directions (as predicted).

Holding Bets % constant, Money % has a positive and statistically significant effect (p = 0.011). The estimated odds ratio of 8.82 suggests that teams receiving a larger share of the betting handle are much more likely to cover the spread. This result is notable given that Money % was not statistically significant when modeled on its own, indicating that its effect becomes clear only after controlling for public betting volume.

In contrast, Bets % has a strong negative and statistically significant effect (p = 0.001). The odds ratio of 0.057 implies that teams attracting a higher share of public bets are substantially less likely to cover, consistent with a fade-the-public effect.

Overall, the combined model improves fit relative to the null model, with the AIC decreasing to 540.93. These results highlight the importance of separating public betting behavior from where betting capital is concentrated when evaluating spread outcomes.

Final Model

We chose the multiple logistic regression model because it controls for the strong relationship between Bets % and Money %, improves model fit, and provides clearer interpretation of public versus sharp betting behavior. The combined model captures effects that were not visible in the single-predictor models.

Low Bets and High Money Subset

To explore situations where public exposure is low but betting confidence is relatively high, a low-exposure indicator was created for games with low Bets % (< 35%) and higher Money % (> 35%). This group represents teams receiving relatively few bets but a disproportionate share of the betting handle.

## # A tibble: 2 × 3
##   low_exposure cover_rate     n
##   <lgl>             <dbl> <int>
## 1 FALSE             0.482   363
## 2 TRUE              0.710    31

Teams in the low-exposure group covered the spread at a rate of 70.97% (22 of 31 games), compared to a 48.21% cover rate for all other games. This difference is substantial and aligns closely with the multiple logistic regression results, where Money % had a positive effect and Bets % had a negative effect.

Although the low-exposure sample size is small (n = 31), the elevated cover rate suggests that teams with low public attention but meaningful money support tend to outperform the spread. This pattern is consistent with a sharp-money or contrarian betting signal and provides an intuitive, group-based confirmation of the model-based findings.

Visualization

To visualize the combined effects of public betting volume and betting handle, predicted probabilities from the multiple logistic regression model are plotted across values of Bets % and Money %. The heatmap illustrates how the likelihood of covering the spread changes jointly with these two variables, providing an intuitive representation of the model’s estimated relationships.

Red indicates lower predicted probability of covering and green indicates higher predicted probability of covering.

ONLY Low Bets Exposure Rate

This analysis focuses solely on Bets % to isolate the effect of public betting volume without conditioning on Money %.

## # A tibble: 2 × 3
##   low_exposure cover_rate     n
##   <lgl>             <dbl> <int>
## 1 FALSE             0.469   307
## 2 TRUE              0.609    87

In the 2025 NFL regular season, about 61% of teams with a Bets % of less than 35% covered the spread. In sample, this subset shows a large edge over the books. But, with a sample size of only 87, variance is still a very real issue.

Conclusion and Recommendations

The multiple logistic regression model was determined to be the strongest of the three models considered; however, several important limitations remain. First, betting distribution data were only available for 197 of the 272 regular season games, which restricts the completeness of the analysis. In future seasons, scraping betting data on a weekly basis would ensure full coverage and improve the reliability of the results.

Additionally, the timing of data collection was not fully consistent. In some cases, betting percentages were recorded prior to kickoff, while in others they were collected after games had concluded. Because thousands of live bets are placed during games, pregame percentages may not fully reflect total market activity, introducing additional noise into the analysis.

Finally, there are unavoidable sources of variance that cannot be captured by the model. In-game injuries, unexpected performance changes, coaching decisions, and other random shocks can significantly affect outcomes but are inherently unpredictable at betting time. These factors help explain why even well-performing models are unlikely to sustain extremely high win rates over time.

Despite these limitations, the results suggest that separating public betting volume from betting handle provides meaningful insight into spread outcomes. Future work incorporating more complete data and consistent collection methods could further refine the model and better evaluate the persistence of any observed betting edge.

LS0tDQp0aXRsZTogIkhvdyBQdWJsaWMgQmV0dGluZyBhbmQgTW9uZXkgRGlzdHJpYnV0aW9uIFJlbGF0ZSB0byBDb3ZlcmluZyB0aGUgU3ByZWFkIGluIHRoZSBORkwiDQphdXRob3I6ICJMdWtlIFZvbG0iDQpkYXRlOiAiMjAyNi0wMS0wNSINCm91dHB1dDoNCiAgaHRtbF9kb2N1bWVudDogICAgICAgICAgICMgb3V0cHV0IGRvY3VtZW50IGZvcm1hdA0KICAgIHRvYzogeWVzICAgICAgICAgICAgICAgIyBhZGQgdGFibGUgY29udGVudHMNCiAgICB0b2NfZmxvYXQ6IHllcyAgICAgICAgICMgdG9jX3Byb3BlcnR5OiBmbG9hdGluZw0KICAgIHRvY19kZXB0aDogNCAgICAgICAgICAgIyBkZXB0aCBvZiBUT0MgaGVhZGluZ3MNCiAgICBmaWdfd2lkdGg6IDYgICAgICAgICAgICMgZ2xvYmFsIGZpZ3VyZSB3aWR0aA0KICAgIGZpZ19oZWlnaHQ6IDQgICAgICAgICAgIyBnbG9iYWwgZmlndXJlIGhlaWdodA0KICAgIGZpZ19jYXB0aW9uOiB5ZXMgICAgICAgIyBhZGQgZmlndXJlIGNhcHRpb24NCiAgICBudW1iZXJfc2VjdGlvbnM6IG5vICAgIyBudW1iZXJpbmcgc2VjdGlvbiBoZWFkaW5ncw0KICAgIHRvY19jb2xsYXBzZWQ6IHllcyAgICAgIyBUT0Mgc3ViaGVhZGluZyBjb2xsYXBzaW5nDQogICAgY29kZV9mb2xkaW5nOiBoaWRlICAgICAjIGZvbGRpbmcvc2hvd2luZyBjb2RlIA0KICAgIGNvZGVfZG93bmxvYWQ6IHllcyAgICAgIyBhbGxvdyB0byBkb3dubG9hZCBjb21wbGV0ZSBSTWFya2Rvd24gc291cmNlIGNvZGUNCiAgICBzbW9vdGhfc2Nyb2xsOiB5ZXMgICAgICMgc2Nyb2xsaW5nIHRleHQgb2YgdGhlIGRvY3VtZW50DQogICAgdGhlbWU6IGx1bWVuICAgICAgICAgICAjIHZpc3VhbCB0aGVtZSBmb3IgSFRNTCBkb2N1bWVudCBvbmx5DQogICAgaGlnaGxpZ2h0OiB0YW5nbyAgICAgICAjIGNvZGUgc3ludGF4IGhpZ2hsaWdodGluZyBzdHlsZXMNCiAgcGRmX2RvY3VtZW50OiANCiAgICB0b2M6IHllcw0KICAgIHRvY19kZXB0aDogNA0KICAgIGZpZ19jYXB0aW9uOiB5ZXMNCiAgICBudW1iZXJfc2VjdGlvbnM6IHllcw0KICB3b3JkX2RvY3VtZW50Og0KICAgIHRvYzogeWVzDQogICAgdG9jX2RlcHRoOiAnNCcNCi0tLQ0KDQpgYGB7Y3NzLCBlY2hvID0gRkFMU0V9DQpkaXYjVE9DIHsNCiAgbGlzdC1zdHlsZTogdXBwZXItcm9tYW47DQogIGJhY2tncm91bmQtaW1hZ2U6IG5vbmU7DQogIGJhY2tncm91bmQtcmVwZWF0OiBuby1yZXBlYXQ7DQogIGJhY2tncm91bmQtcG9zaXRpb246IDA7DQp9DQoNCmgxLnRpdGxlIHsgICAgLyogbGV2ZWwgMSBoZWFkZXIgb2YgdGl0bGUgICovDQogIGZvbnQtc2l6ZTogMjRweDsNCiAgZm9udC13ZWlnaHQ6IGJvbGQ7DQogIGNvbG9yOiBEYXJrUmVkOw0KICB0ZXh0LWFsaWduOiBjZW50ZXI7DQp9DQoNCmg0LmF1dGhvciB7IC8qIEhlYWRlciA0IC0gYW5kIHRoZSBhdXRob3IgYW5kIGRhdGEgaGVhZGVycyB1c2UgdGhpcyB0b28gICovDQogIGZvbnQtc2l6ZTogMThweDsNCiAgZm9udC13ZWlnaHQ6IGJvbGQ7DQogIGZvbnQtZmFtaWx5OiAiVGltZXMgTmV3IFJvbWFuIiwgVGltZXMsIHNlcmlmOw0KICBjb2xvcjogRGFya1JlZDsNCiAgdGV4dC1hbGlnbjogY2VudGVyOw0KfQ0KDQpoNC5kYXRlIHsgLyogSGVhZGVyIDQgLSBhbmQgdGhlIGF1dGhvciBhbmQgZGF0YSBoZWFkZXJzIHVzZSB0aGlzIHRvbyAgKi8NCiAgZm9udC1zaXplOiAxOHB4Ow0KICBmb250LXdlaWdodDogYm9sZDsNCiAgZm9udC1mYW1pbHk6ICJUaW1lcyBOZXcgUm9tYW4iLCBUaW1lcywgc2VyaWY7DQogIGNvbG9yOiBEYXJrQmx1ZTsNCiAgdGV4dC1hbGlnbjogY2VudGVyOw0KfQ0KDQpoMSB7IC8qIEhlYWRlciAxIC0gYW5kIHRoZSBhdXRob3IgYW5kIGRhdGEgaGVhZGVycyB1c2UgdGhpcyB0b28gICovDQogICAgZm9udC1zaXplOiAyMHB4Ow0KICAgIGZvbnQtd2VpZ2h0OiBib2xkOw0KICAgIGZvbnQtZmFtaWx5OiAiVGltZXMgTmV3IFJvbWFuIiwgVGltZXMsIHNlcmlmOw0KICAgIGNvbG9yOiBkYXJrcmVkOw0KICAgIHRleHQtYWxpZ246IGNlbnRlcjsNCn0NCg0KaDIgeyAvKiBIZWFkZXIgMiAtIGFuZCB0aGUgYXV0aG9yIGFuZCBkYXRhIGhlYWRlcnMgdXNlIHRoaXMgdG9vICAqLw0KICAgIGZvbnQtc2l6ZTogMThweDsNCiAgICBmb250LXdlaWdodDogYm9sZDsNCiAgICBmb250LWZhbWlseTogIlRpbWVzIE5ldyBSb21hbiIsIFRpbWVzLCBzZXJpZjsNCiAgICBjb2xvcjogbmF2eTsNCiAgICB0ZXh0LWFsaWduOiBsZWZ0Ow0KfQ0KDQpoMyB7IC8qIEhlYWRlciAzIC0gYW5kIHRoZSBhdXRob3IgYW5kIGRhdGEgaGVhZGVycyB1c2UgdGhpcyB0b28gICovDQogICAgZm9udC1zaXplOiAxNnB4Ow0KICAgIGZvbnQtd2VpZ2h0OiBib2xkOw0KICAgIGZvbnQtZmFtaWx5OiAiVGltZXMgTmV3IFJvbWFuIiwgVGltZXMsIHNlcmlmOw0KICAgIGNvbG9yOiBuYXZ5Ow0KICAgIHRleHQtYWxpZ246IGxlZnQ7DQp9DQoNCmg0IHsgLyogSGVhZGVyIDQgLSBhbmQgdGhlIGF1dGhvciBhbmQgZGF0YSBoZWFkZXJzIHVzZSB0aGlzIHRvbyAgKi8NCiAgICBmb250LXNpemU6IDE0cHg7DQogIGZvbnQtd2VpZ2h0OiBib2xkOw0KICAgIGZvbnQtZmFtaWx5OiAiVGltZXMgTmV3IFJvbWFuIiwgVGltZXMsIHNlcmlmOw0KICAgIGNvbG9yOiBkYXJrcmVkOw0KICAgIHRleHQtYWxpZ246IGxlZnQ7DQp9DQoNCi8qIEFkZCBkb3RzIGFmdGVyIG51bWJlcmVkIGhlYWRlcnMgKi8NCi5oZWFkZXItc2VjdGlvbi1udW1iZXI6OmFmdGVyIHsNCiAgY29udGVudDogIi4iOw0KfQ0KYGBgDQotLS0NCg0KYGBge3Igc2V0dXAsIGluY2x1ZGU9RkFMU0V9DQprbml0cjo6b3B0c19jaHVuayRzZXQoZWNobyA9IEZBTFNFKQ0KbGlicmFyeShyZWFkeGwpDQpsaWJyYXJ5KGJvb3QpDQpsaWJyYXJ5KGRwbHlyKQ0KbGlicmFyeShrbml0cikNCmxpYnJhcnkocHN5Y2gpDQpsaWJyYXJ5KE1BU1MpDQpsaWJyYXJ5KHRpZHlyKQ0KbGlicmFyeShnZ3Bsb3QyKQ0KbGlicmFyeShjYXIpDQpsaWJyYXJ5KHBhbmRlcikNCmxpYnJhcnkoZ2dwbG90MikNCmxpYnJhcnkoY2FyZXQpDQpsaWJyYXJ5KHNjYWxlcykNCmxpYnJhcnkodGlkeXZlcnNlKQ0KcHVibGljIDwtIHJlYWRfZXhjZWwoIkM6L1VzZXJzL3ZvbG0xL09uZURyaXZlL0Rlc2t0b3AvRm9vdGJhbGwvMjAyNS5wdWJsaWMubW9uZXkueGxzeCIpDQpgYGANCg0KYGBge3IsIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIHJlc3VsdHM9ImhpZGUifQ0KdG9fcHJvcCA8LSBmdW5jdGlvbih4KXsNCnggPC0gYXMuY2hhcmFjdGVyKHgpDQp4IDwtIHN0cl9yZXBsYWNlX2FsbCh4LCAiJSIsICIiKQ0KeCA8LSBzdHJfdHJpbSh4KQ0KeCA8LSBzdXBwcmVzc1dhcm5pbmdzKGFzLm51bWVyaWMoeCkpDQppZmVsc2UoIWlzLm5hKHgpICYgeCA+IDEsIHgvMTAwLCB4KQ0KfQ0KDQpwdWJsaWNfaGFsZiA8LSBwdWJsaWMgJT4lDQogIG11dGF0ZSgNCiAgICBnYW1lX2lkID0gcm93X251bWJlcigpLA0KICAgIGNvdmVyZWQgPSBpZl9lbHNlKA0KICAgICAgdG9sb3dlcih0cmltd3MoYFdvbj9gKSkgPT0gInllcyIsDQogICAgICAxTCwNCiAgICAgIDBMDQogICAgKSwNCiAgICBgQmV0cyAlYCAgPSB0b19wcm9wKGBCZXRzICVgKSwNCiAgICBgTW9uZXkgJWAgPSB0b19wcm9wKGBNb25leSAlYCkNCiAgKQ0KDQpwdWJsaWNfcmVjaXAgPC0gcHVibGljX2hhbGYgJT4lDQptdXRhdGUoDQpgQmV0cyAlYCA9IDEgLSBgQmV0cyAlYCwNCmBNb25leSAlYCA9IDEgLSBgTW9uZXkgJWAsDQpjb3ZlcmVkID0gMUwgLSBjb3ZlcmVkDQopDQoNCnB1YmxpY19oYWxmIDwtIHB1YmxpY19oYWxmICU+JSBtdXRhdGUoc2lkZSA9ICJlbnRlcmVkIikNCnB1YmxpY19yZWNpcCA8LSBwdWJsaWNfcmVjaXAgJT4lIG11dGF0ZShzaWRlID0gInJlY2lwcm9jYWwiKQ0KDQpwdWJsaWNfZGYgPC0gYmluZF9yb3dzKHB1YmxpY19oYWxmLCBwdWJsaWNfcmVjaXApDQoNCnB1YmxpY19kZiAlPiUgY291bnQoZ2FtZV9pZCkgJT4lIGNvdW50KG4pDQoNCmBgYA0KDQojIEludHJvZHVjdGlvbg0KDQpTcG9ydHMgYmV0dGluZyBtYXJrZXRzIG9mZmVyIGFuIGludGVyZXN0aW5nIHdheSB0byBleGFtaW5lIGhvdyBwdWJsaWMgYmVoYXZpb3IgcmVsYXRlcyB0byBnYW1lIG91dGNvbWVzLiBJbiB0aGlzIHByb2plY3QsIEkgc3R1ZHkgd2hldGhlciBiZXR0aW5nIGRpc3RyaWJ1dGlvbiBkYXRhLCBzcGVjaWZpY2FsbHkgdGhlIHBlcmNlbnRhZ2Ugb2YgYmV0cyBhbmQgdGhlIHBlcmNlbnRhZ2Ugb2YgbW9uZXkgcGxhY2VkIG9uIGVhY2ggdGVhbSwgaGVscCBleHBsYWluIHdoZXRoZXIgYSB0ZWFtIGNvdmVycyB0aGUgcG9pbnQgc3ByZWFkIGluIE5GTCByZWd1bGFyIHNlYXNvbiBnYW1lcy4gVGhlIGJldHRpbmcgcGVyY2VudGFnZXMgdXNlZCBpbiB0aGlzIGFuYWx5c2lzIHdlcmUgbWFudWFsbHkgc2NyYXBlZCBmcm9tIFZlZ2FzIEluc2lkZXLigJlzIHdlYnNpdGUgYmVjYXVzZSB0aGV5IGFyZSBub3QgYXZhaWxhYmxlIGluIGEgZm9ybWF0IHRoYXQgY2FuIGJlIGRpcmVjdGx5IGltcG9ydGVkIGludG8gUi4gQXMgYSByZXN1bHQsIGVhY2ggZ2FtZSByZXF1aXJlZCBpbmRpdmlkdWFsIGRhdGEgY29sbGVjdGlvbiBhbmQgcHJlcHJvY2Vzc2luZy4gVGhlIGZpbmFsIGRhdGFzZXQgaW5jbHVkZXMgYmV0dGluZyBkaXN0cmlidXRpb24gaW5mb3JtYXRpb24gZm9yIDE5NyByZWd1bGFyIHNlYXNvbiBnYW1lcy4gVXNpbmcgdGhpcyBkYXRhLCBsb2dpc3RpYyByZWdyZXNzaW9uIG1vZGVscyBhcmUgYXBwbGllZCB0byBjb21wYXJlIHRoZSBwcmVkaWN0aXZlIHZhbHVlIG9mIHB1YmxpYyBiZXR0aW5nIHZvbHVtZSBhbmQgYmV0dGluZyBoYW5kbGUsIGJvdGggaW5kaXZpZHVhbGx5IGFuZCBqb2ludGx5LiBCZWNhdXNlIGVhY2ggZ2FtZSBjb250cmlidXRlcyB0d28gdGVhbS1sZXZlbCBvYnNlcnZhdGlvbnMgKGVudGVyZWQgc2lkZSBhbmQgcmVjaXByb2NhbCBzaWRlKSwgcmVzdWx0cyBzaG91bGQgYmUgaW50ZXJwcmV0ZWQgYXMgdGVhbS1sZXZlbCBhc3NvY2lhdGlvbnMgcmF0aGVyIHRoYW4gZnVsbHkgaW5kZXBlbmRlbnQgZ2FtZSBvdXRjb21lcy4NCg0KIyBQdWJsaWMgTW9uZXkgTW9kZWwNCg0KQSBsb2dpc3RpYyByZWdyZXNzaW9uIG1vZGVsIHdhcyBmaXQgdG8gZXhhbWluZSB3aGV0aGVyIHRoZSBwZXJjZW50YWdlIG9mIHB1YmxpYyBtb25leSAoTW9uZXkgJSksIGFsc28ga25vd24gYXMgdGhlIGJldHRpbmcgaGFuZGxlIHBlcmNlbnRhZ2UsIHBsYWNlZCBvbiBhIHRlYW0gcHJlZGljdHMgd2hldGhlciB0aGF0IHRlYW0gY292ZXJzIHRoZSBzcHJlYWQgKDEgPSBjb3ZlcmVkLCAwID0gZGlkIG5vdCBjb3ZlcikuDQoNCmBgYHtyfQ0KDQpmaXRfbW9uZXkgPC0gZ2xtKGNvdmVyZWQgfiBgTW9uZXkgJWAsIGRhdGEgPSBwdWJsaWNfZGYsIGZhbWlseSA9IGJpbm9taWFsKCkpDQpzdW1tYXJ5KGZpdF9tb25leSkNCg0KIyBPZGRzIHJhdGlvIGZvciBhICsxLjAwIGNoYW5nZSBpbiBNb25leSUgKGkuZS4sICsxMDAgcGVyY2VudGFnZSBwb2ludHMpDQpleHAoY29lZihmaXRfbW9uZXkpKQ0KYGBgDQoNClRoZSBlc3RpbWF0ZWQgY29lZmZpY2llbnQgZm9yIE1vbmV5ICUgd2FzIDAuMjE2IChTRSA9IDAuNTgxLCB6ID0gMC4zNzIsIHAgPSAwLjcxMCkuIFRoaXMgY29lZmZpY2llbnQgaXMgbm90IHN0YXRpc3RpY2FsbHkgc2lnbmlmaWNhbnQsIGluZGljYXRpbmcgbm8gZXZpZGVuY2UgdGhhdCB0aGUgcGVyY2VudGFnZSBvZiBwdWJsaWMgbW9uZXkgaXMgYXNzb2NpYXRlZCB3aXRoIGNvdmVyaW5nIHRoZSBzcHJlYWQuDQoNCkV4cG9uZW50aWF0aW5nIHRoZSBjb2VmZmljaWVudCB5aWVsZHMgYW4gb2RkcyByYXRpbyBvZiAxLjI0LiBUaGlzIHN1Z2dlc3RzIHRoYXQgYSBvbmUtdW5pdCBpbmNyZWFzZSBpbiBNb25leSAlIGlzIGFzc29jaWF0ZWQgd2l0aCBhIDI0JSBpbmNyZWFzZSBpbiB0aGUgb2RkcyBvZiBjb3ZlcmluZywgaG9sZGluZyBldmVyeXRoaW5nIGVsc2UgY29uc3RhbnQuIEhvd2V2ZXIsIGJlY2F1c2UgdGhlIGVmZmVjdCBpcyBub3Qgc3RhdGlzdGljYWxseSBzaWduaWZpY2FudCwgdGhpcyBhcHBhcmVudCBpbmNyZWFzZSBpcyBsaWtlbHkgZHVlIHRvIHJhbmRvbSB2YXJpYXRpb24gcmF0aGVyIHRoYW4gYSByZWFsIGJldHRpbmcgZWRnZS4NCg0KTW9kZWwgZml0IHN0YXRpc3RpY3MgZnVydGhlciBzdXBwb3J0IHRoZSBsYWNrIG9mIHByZWRpY3RpdmUgcG93ZXIuIFRoZSByZXNpZHVhbCBkZXZpYW5jZSAoNTQ2LjA2KSBpcyBuZWFybHkgaWRlbnRpY2FsIHRvIHRoZSBudWxsIGRldmlhbmNlICg1NDYuMjApLCBpbmRpY2F0aW5nIHRoYXQgYWRkaW5nIE1vbmV5ICUgZG9lcyBub3QgbWVhbmluZ2Z1bGx5IGltcHJvdmUgdGhlIG1vZGVsIG92ZXIgYW4gaW50ZXJjZXB0LW9ubHkgbW9kZWwuIFRoZSBBSUMgb2YgNTUwLjA2IHNpbWlsYXJseSBzdWdnZXN0cyBubyBpbXByb3ZlbWVudCBpbiBmaXQuDQoNCiMgUHVibGljIEJldHMgTW9kZWwNCg0KQSBsb2dpc3RpYyByZWdyZXNzaW9uIG1vZGVsIHdhcyBmaXQgdG8gZXZhbHVhdGUgd2hldGhlciB0aGUgcGVyY2VudGFnZSBvZiBiZXRzIChCZXRzICUpLCBwbGFjZWQgb24gYSB0ZWFtIGlzIGFzc29jaWF0ZWQgd2l0aCB0aGUgbGlrZWxpaG9vZCB0aGF0IHRoZSB0ZWFtIGNvdmVycyB0aGUgc3ByZWFkLiANCg0KYGBge3J9DQoNCmZpdF9iZXRzIDwtIGdsbShjb3ZlcmVkIH4gYEJldHMgJWAsIGRhdGEgPSBwdWJsaWNfZGYsIGZhbWlseSA9IGJpbm9taWFsKCkpDQpzdW1tYXJ5KGZpdF9iZXRzKQ0KZXhwKGNvZWYoZml0X2JldHMpKSAjIG9kZHMgcmF0aW9zDQpgYGANCg0KVGhlIGNvZWZmaWNpZW50IGZvciBCZXRzICUgaXMg4oiSMS4yNzMgKFNFID0gMC42MDYsIHogPSDiiJIyLjEwLCBwID0gMC4wMzYpLCB3aGljaCBpcyBzdGF0aXN0aWNhbGx5IHNpZ25pZmljYW50IGF0IHRoZSA1JSBsZXZlbC4gVGhpcyBpbmRpY2F0ZXMgYSBtZWFuaW5nZnVsIG5lZ2F0aXZlIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIHRoZSBzaGFyZSBvZiBiZXRzIGFuZCBjb3ZlcmluZyB0aGUgc3ByZWFkLg0KDQpFeHBvbmVudGlhdGluZyB0aGUgY29lZmZpY2llbnQgZ2l2ZXMgYW4gb2RkcyByYXRpbyBvZiBhcHByb3hpbWF0ZWx5IDAuMjguIFRoaXMgbWVhbnMgdGhhdCwgaG9sZGluZyBldmVyeXRoaW5nIGVsc2UgY29uc3RhbnQsIGEgb25lLXVuaXQgaW5jcmVhc2UgaW4gQmV0cyAlIGlzIGFzc29jaWF0ZWQgd2l0aCBhIDcyJSBkZWNyZWFzZSBpbiB0aGUgb2RkcyBvZiBjb3ZlcmluZyB0aGUgc3ByZWFkLiBJbiBwcmFjdGljYWwgdGVybXMsIHRlYW1zIHJlY2VpdmluZyBhIGhpZ2hlciBzaGFyZSBvZiBwdWJsaWMgYmV0cyBhcmUgc2lnbmlmaWNhbnRseSBsZXNzIGxpa2VseSB0byBjb3Zlci4NCg0KTW9kZWwgZml0IHN0YXRpc3RpY3Mgc3VnZ2VzdCBtb2Rlc3QgaW1wcm92ZW1lbnQgb3ZlciB0aGUgbnVsbCBtb2RlbC4gVGhlIHJlc2lkdWFsIGRldmlhbmNlICg1NDEuNzQpIGlzIGxvd2VyIHRoYW4gdGhlIG51bGwgZGV2aWFuY2UgKDU0Ni4yMCksIGFuZCB0aGUgQUlDIGRlY3JlYXNlcyB0byA1NDUuNzQsIGluZGljYXRpbmcgdGhhdCBCZXRzICUgcHJvdmlkZXMgYWRkaXRpb25hbCBleHBsYW5hdG9yeSBwb3dlciBjb21wYXJlZCB0byBhbiBpbnRlcmNlcHQtb25seSBtb2RlbC4NCg0KIyBNdWx0aXBsZSBMb2dpc3RpYyBSZWdyZXNzaW9uIE1vZGVsDQoNCldoaWxlIEJldHMgJSBzaG93ZWQgYSBzdGF0aXN0aWNhbGx5IHNpZ25pZmljYW50IG5lZ2F0aXZlIGFzc29jaWF0aW9uIHdpdGggY292ZXJpbmcsIE1vbmV5ICUgd2FzIG5vdCBzdGF0aXN0aWNhbGx5IHNpZ25pZmljYW50IHdoZW4gbW9kZWxlZCBvbiBpdHMgb3duLCBzdWdnZXN0aW5nIHRoYXQgaGFuZGxlIGFsb25lIG1heSBub3QgZnVsbHkgZXhwbGFpbiBzcHJlYWQgb3V0Y29tZXMuIEhvd2V2ZXIsIHRoZXNlIHR3byB2YXJpYWJsZXMgY2FwdHVyZSBkaWZmZXJlbnQgYXNwZWN0cyBvZiBiZXR0aW5nIGJlaGF2aW9yLiBCZXRzICUgcmVmbGVjdHMgcHVibGljIGJldHRpbmcgdm9sdW1lLCB3aGlsZSBNb25leSAlIHJlZmxlY3RzIHdoZXJlIGxhcmdlciB3YWdlcnMgYXJlIHBsYWNlZC4gVGhlc2UgYXJlIGxpa2VseSBjb3JyZWxhdGVkLiBUeXBpY2FsbHksIHRoZSAic2hhcnAiIGJldHRvcnMgcGxhY2UgbGFyZ2VyIHdhZ2VycyBvbiBnYW1lcyB3aXRoIGEgbG93IEJldHMgJSwgd2hpY2ggY291bGQgbWFrZSB0aGUgdHdvIHZhcmlhYmxlcyBnbyBpbiBvcHBvc2l0ZSBkaXJlY3Rpb25zLg0KDQpUbyBiZXR0ZXIgdW5kZXJzdGFuZCB0aGVpciBjb21iaW5lZCBpbmZsdWVuY2UsIGEgbXVsdGlwbGUgbG9naXN0aWMgcmVncmVzc2lvbiBtb2RlbCBpbmNsdWRpbmcgYm90aCBCZXRzICUgYW5kIE1vbmV5ICUgd2FzIGZpdC4gVGhpcyBhcHByb2FjaCBhbGxvd3MgZWFjaCB2YXJpYWJsZeKAmXMgZWZmZWN0IHRvIGJlIGV2YWx1YXRlZCB3aGlsZSBjb250cm9sbGluZyBmb3IgdGhlIG90aGVyLCBwcm92aWRpbmcgYSBjbGVhcmVyIHBpY3R1cmUgb2YgaG93IHB1YmxpYyBzZW50aW1lbnQgYW5kIGJldHRpbmcgY2FwaXRhbCBqb2ludGx5IHJlbGF0ZSB0byBjb3ZlcmluZyB0aGUgc3ByZWFkDQoNCmBgYHtyfQ0KDQpmaXRfYm90aCA8LSBnbG0oY292ZXJlZCB+IGBNb25leSAlYCArIGBCZXRzICVgLCBkYXRhID0gcHVibGljX2RmLCBmYW1pbHkgPSBiaW5vbWlhbCgpKQ0Kc3VtbWFyeShmaXRfYm90aCkNCmV4cChjb2VmKGZpdF9ib3RoKSkNCg0KYGBgDQoNCkEgbXVsdGlwbGUgbG9naXN0aWMgcmVncmVzc2lvbiBtb2RlbCBpbmNsdWRpbmcgYm90aCBNb25leSAlIGFuZCBCZXRzICUgd2FzIGZpdCB0byBwcmVkaWN0IHdoZXRoZXIgYSB0ZWFtIGNvdmVycyB0aGUgc3ByZWFkLiBXaGVuIGJvdGggdmFyaWFibGVzIGFyZSBpbmNsdWRlZCwgZWFjaCBiZWNvbWVzIHN0YXRpc3RpY2FsbHkgc2lnbmlmaWNhbnQsIGJ1dCB3aXRoIGVmZmVjdHMgaW4gb3Bwb3NpdGUgZGlyZWN0aW9ucyAoYXMgcHJlZGljdGVkKS4NCg0KSG9sZGluZyBCZXRzICUgY29uc3RhbnQsIE1vbmV5ICUgaGFzIGEgcG9zaXRpdmUgYW5kIHN0YXRpc3RpY2FsbHkgc2lnbmlmaWNhbnQgZWZmZWN0IChwID0gMC4wMTEpLiBUaGUgZXN0aW1hdGVkIG9kZHMgcmF0aW8gb2YgOC44MiBzdWdnZXN0cyB0aGF0IHRlYW1zIHJlY2VpdmluZyBhIGxhcmdlciBzaGFyZSBvZiB0aGUgYmV0dGluZyBoYW5kbGUgYXJlIG11Y2ggbW9yZSBsaWtlbHkgdG8gY292ZXIgdGhlIHNwcmVhZC4gVGhpcyByZXN1bHQgaXMgbm90YWJsZSBnaXZlbiB0aGF0IE1vbmV5ICUgd2FzIG5vdCBzdGF0aXN0aWNhbGx5IHNpZ25pZmljYW50IHdoZW4gbW9kZWxlZCBvbiBpdHMgb3duLCBpbmRpY2F0aW5nIHRoYXQgaXRzIGVmZmVjdCBiZWNvbWVzIGNsZWFyIG9ubHkgYWZ0ZXIgY29udHJvbGxpbmcgZm9yIHB1YmxpYyBiZXR0aW5nIHZvbHVtZS4NCg0KSW4gY29udHJhc3QsIEJldHMgJSBoYXMgYSBzdHJvbmcgbmVnYXRpdmUgYW5kIHN0YXRpc3RpY2FsbHkgc2lnbmlmaWNhbnQgZWZmZWN0IChwID0gMC4wMDEpLiBUaGUgb2RkcyByYXRpbyBvZiAwLjA1NyBpbXBsaWVzIHRoYXQgdGVhbXMgYXR0cmFjdGluZyBhIGhpZ2hlciBzaGFyZSBvZiBwdWJsaWMgYmV0cyBhcmUgc3Vic3RhbnRpYWxseSBsZXNzIGxpa2VseSB0byBjb3ZlciwgY29uc2lzdGVudCB3aXRoIGEgZmFkZS10aGUtcHVibGljIGVmZmVjdC4NCg0KT3ZlcmFsbCwgdGhlIGNvbWJpbmVkIG1vZGVsIGltcHJvdmVzIGZpdCByZWxhdGl2ZSB0byB0aGUgbnVsbCBtb2RlbCwgd2l0aCB0aGUgQUlDIGRlY3JlYXNpbmcgdG8gNTQwLjkzLiBUaGVzZSByZXN1bHRzIGhpZ2hsaWdodCB0aGUgaW1wb3J0YW5jZSBvZiBzZXBhcmF0aW5nIHB1YmxpYyBiZXR0aW5nIGJlaGF2aW9yIGZyb20gd2hlcmUgYmV0dGluZyBjYXBpdGFsIGlzIGNvbmNlbnRyYXRlZCB3aGVuIGV2YWx1YXRpbmcgc3ByZWFkIG91dGNvbWVzLg0KDQojIEZpbmFsIE1vZGVsDQoNCldlIGNob3NlIHRoZSBtdWx0aXBsZSBsb2dpc3RpYyByZWdyZXNzaW9uIG1vZGVsIGJlY2F1c2UgaXQgY29udHJvbHMgZm9yIHRoZSBzdHJvbmcgcmVsYXRpb25zaGlwIGJldHdlZW4gQmV0cyAlIGFuZCBNb25leSAlLCBpbXByb3ZlcyBtb2RlbCBmaXQsIGFuZCBwcm92aWRlcyBjbGVhcmVyIGludGVycHJldGF0aW9uIG9mIHB1YmxpYyB2ZXJzdXMgc2hhcnAgYmV0dGluZyBiZWhhdmlvci4gVGhlIGNvbWJpbmVkIG1vZGVsIGNhcHR1cmVzIGVmZmVjdHMgdGhhdCB3ZXJlIG5vdCB2aXNpYmxlIGluIHRoZSBzaW5nbGUtcHJlZGljdG9yIG1vZGVscy4NCg0KIyBMb3cgQmV0cyBhbmQgSGlnaCBNb25leSBTdWJzZXQNCg0KVG8gZXhwbG9yZSBzaXR1YXRpb25zIHdoZXJlIHB1YmxpYyBleHBvc3VyZSBpcyBsb3cgYnV0IGJldHRpbmcgY29uZmlkZW5jZSBpcyByZWxhdGl2ZWx5IGhpZ2gsIGEgbG93LWV4cG9zdXJlIGluZGljYXRvciB3YXMgY3JlYXRlZCBmb3IgZ2FtZXMgd2l0aCBsb3cgQmV0cyAlICg8IDM1JSkgYW5kIGhpZ2hlciBNb25leSAlICg+IDM1JSkuIFRoaXMgZ3JvdXAgcmVwcmVzZW50cyB0ZWFtcyByZWNlaXZpbmcgcmVsYXRpdmVseSBmZXcgYmV0cyBidXQgYSBkaXNwcm9wb3J0aW9uYXRlIHNoYXJlIG9mIHRoZSBiZXR0aW5nIGhhbmRsZS4NCg0KYGBge3J9DQoNCnB1YmxpY19kZiA8LSBwdWJsaWNfZGYgJT4lDQptdXRhdGUoDQpsb3dfYmV0cyA9IGBCZXRzICVgIDwgMC4zNSwNCmxvd19tb25leSA9IGBNb25leSAlYCA+IDAuMzUsDQpsb3dfZXhwb3N1cmUgPSBsb3dfYmV0cyAmIGxvd19tb25leQ0KKQ0KDQpwdWJsaWNfZGYgJT4lDQpncm91cF9ieShsb3dfZXhwb3N1cmUpICU+JQ0Kc3VtbWFyaXNlKGNvdmVyX3JhdGUgPSBtZWFuKGNvdmVyZWQpLCBuID0gbigpLCAuZ3JvdXBzID0gImRyb3AiKQ0KDQpgYGANCg0KVGVhbXMgaW4gdGhlIGxvdy1leHBvc3VyZSBncm91cCBjb3ZlcmVkIHRoZSBzcHJlYWQgYXQgYSByYXRlIG9mIDcwLjk3JSAoMjIgb2YgMzEgZ2FtZXMpLCBjb21wYXJlZCB0byBhIDQ4LjIxJSBjb3ZlciByYXRlIGZvciBhbGwgb3RoZXIgZ2FtZXMuIFRoaXMgZGlmZmVyZW5jZSBpcyBzdWJzdGFudGlhbCBhbmQgYWxpZ25zIGNsb3NlbHkgd2l0aCB0aGUgbXVsdGlwbGUgbG9naXN0aWMgcmVncmVzc2lvbiByZXN1bHRzLCB3aGVyZSBNb25leSAlIGhhZCBhIHBvc2l0aXZlIGVmZmVjdCBhbmQgQmV0cyAlIGhhZCBhIG5lZ2F0aXZlIGVmZmVjdC4NCg0KQWx0aG91Z2ggdGhlIGxvdy1leHBvc3VyZSBzYW1wbGUgc2l6ZSBpcyBzbWFsbCAobiA9IDMxKSwgdGhlIGVsZXZhdGVkIGNvdmVyIHJhdGUgc3VnZ2VzdHMgdGhhdCB0ZWFtcyB3aXRoIGxvdyBwdWJsaWMgYXR0ZW50aW9uIGJ1dCBtZWFuaW5nZnVsIG1vbmV5IHN1cHBvcnQgdGVuZCB0byBvdXRwZXJmb3JtIHRoZSBzcHJlYWQuIFRoaXMgcGF0dGVybiBpcyBjb25zaXN0ZW50IHdpdGggYSBzaGFycC1tb25leSBvciBjb250cmFyaWFuIGJldHRpbmcgc2lnbmFsIGFuZCBwcm92aWRlcyBhbiBpbnR1aXRpdmUsIGdyb3VwLWJhc2VkIGNvbmZpcm1hdGlvbiBvZiB0aGUgbW9kZWwtYmFzZWQgZmluZGluZ3MuDQoNCiMgVmlzdWFsaXphdGlvbg0KDQpUbyB2aXN1YWxpemUgdGhlIGNvbWJpbmVkIGVmZmVjdHMgb2YgcHVibGljIGJldHRpbmcgdm9sdW1lIGFuZCBiZXR0aW5nIGhhbmRsZSwgcHJlZGljdGVkIHByb2JhYmlsaXRpZXMgZnJvbSB0aGUgbXVsdGlwbGUgbG9naXN0aWMgcmVncmVzc2lvbiBtb2RlbCBhcmUgcGxvdHRlZCBhY3Jvc3MgdmFsdWVzIG9mIEJldHMgJSBhbmQgTW9uZXkgJS4gVGhlIGhlYXRtYXAgaWxsdXN0cmF0ZXMgaG93IHRoZSBsaWtlbGlob29kIG9mIGNvdmVyaW5nIHRoZSBzcHJlYWQgY2hhbmdlcyBqb2ludGx5IHdpdGggdGhlc2UgdHdvIHZhcmlhYmxlcywgcHJvdmlkaW5nIGFuIGludHVpdGl2ZSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWzigJlzIGVzdGltYXRlZCByZWxhdGlvbnNoaXBzLg0KDQpSZWQgaW5kaWNhdGVzIGxvd2VyIHByZWRpY3RlZCBwcm9iYWJpbGl0eSBvZiBjb3ZlcmluZyBhbmQgZ3JlZW4gaW5kaWNhdGVzIGhpZ2hlciBwcmVkaWN0ZWQgcHJvYmFiaWxpdHkgb2YgY292ZXJpbmcuDQoNCmBgYHtyIGZpZy53aWR0aD03LCBmaWcuaGVpZ2h0PTUsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQoNCiMgQ3JlYXRlIHByZWRpY3Rpb24gZ3JpZCBmcm9tIHRoZSBtdWx0aXBsZSBsb2dpc3RpYyBtb2RlbA0KZ3JpZDIgPC0gZXhwYW5kLmdyaWQoDQogICJCZXRzICUiICA9IHNlcShtaW4ocHVibGljX2RmJGBCZXRzICVgLCBuYS5ybSA9IFRSVUUpLA0KICAgICAgICAgICAgICAgICBtYXgocHVibGljX2RmJGBCZXRzICVgLCBuYS5ybSA9IFRSVUUpLA0KICAgICAgICAgICAgICAgICBsZW5ndGgub3V0ID0gMTUwKSwNCiAgIk1vbmV5ICUiID0gc2VxKG1pbihwdWJsaWNfZGYkYE1vbmV5ICVgLCBuYS5ybSA9IFRSVUUpLA0KICAgICAgICAgICAgICAgICBtYXgocHVibGljX2RmJGBNb25leSAlYCwgbmEucm0gPSBUUlVFKSwNCiAgICAgICAgICAgICAgICAgbGVuZ3RoLm91dCA9IDE1MCksDQogIGNoZWNrLm5hbWVzID0gRkFMU0UNCikNCg0KIyBQcmVkaWN0ZWQgcHJvYmFiaWxpdGllcw0KZ3JpZDIkcHJlZCA8LSBwcmVkaWN0KGZpdF9ib3RoLCBuZXdkYXRhID0gZ3JpZDIsIHR5cGUgPSAicmVzcG9uc2UiKQ0KDQojIFBsb3Qgc21vb3RoZWQgaGVhdG1hcA0KZ2dwbG90KGdyaWQyLCBhZXMoeCA9IGBCZXRzICVgLCB5ID0gYE1vbmV5ICVgLCBmaWxsID0gcHJlZCkpICsNCiAgZ2VvbV90aWxlKCkgKw0KICBzY2FsZV94X2NvbnRpbnVvdXMobGFiZWxzID0gc2NhbGVzOjpwZXJjZW50X2Zvcm1hdCgpKSArDQogIHNjYWxlX3lfY29udGludW91cyhsYWJlbHMgPSBzY2FsZXM6OnBlcmNlbnRfZm9ybWF0KCkpICsNCiAgc2NhbGVfZmlsbF9ncmFkaWVudG4oDQogICAgY29sb3JzID0gYygiI2MwMzkyYiIsICIjZjRkMDNmIiwgIiMxZTg0NDkiKSwNCiAgICB2YWx1ZXMgPSBzY2FsZXM6OnJlc2NhbGUoYygwLjQwLCAwLjUwLCAwLjYwKSksDQogICAgbGFiZWxzID0gc2NhbGVzOjpwZXJjZW50X2Zvcm1hdCgpLA0KICAgIG5hbWUgPSAiUChDb3ZlcikiDQogICkgKw0KICBsYWJzKA0KICAgIHRpdGxlID0gIlByZWRpY3RlZCBQcm9iYWJpbGl0eSBvZiBDb3ZlcmluZyIsDQogICAgeCA9ICJCZXRzICUiLA0KICAgIHkgPSAiTW9uZXkgJSINCiAgKSArDQogIHRoZW1lX21pbmltYWwoKSArDQogIHRoZW1lKA0KICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUpLA0KICAgIGxlZ2VuZC5wb3NpdGlvbiA9ICJyaWdodCINCiAgKQ0KYGBgDQoNCiMgT05MWSBMb3cgQmV0cyBFeHBvc3VyZSBSYXRlDQoNClRoaXMgYW5hbHlzaXMgZm9jdXNlcyBzb2xlbHkgb24gQmV0cyAlIHRvIGlzb2xhdGUgdGhlIGVmZmVjdCBvZiBwdWJsaWMgYmV0dGluZyB2b2x1bWUgd2l0aG91dCBjb25kaXRpb25pbmcgb24gTW9uZXkgJS4NCg0KYGBge3J9DQoNCnB1YmxpY19kZiA8LSBwdWJsaWNfZGYgJT4lDQptdXRhdGUoDQpsb3dfYmV0cyA9IGBCZXRzICVgIDwgMC4zNSwNCmxvd19leHBvc3VyZSA9IGxvd19iZXRzDQopDQoNCnB1YmxpY19kZiAlPiUNCmdyb3VwX2J5KGxvd19leHBvc3VyZSkgJT4lDQpzdW1tYXJpc2UoY292ZXJfcmF0ZSA9IG1lYW4oY292ZXJlZCksIG4gPSBuKCksIC5ncm91cHMgPSAiZHJvcCIpDQoNCmBgYA0KDQpJbiB0aGUgMjAyNSBORkwgcmVndWxhciBzZWFzb24sIGFib3V0IDYxJSBvZiB0ZWFtcyB3aXRoIGEgQmV0cyAlIG9mIGxlc3MgdGhhbiAzNSUgY292ZXJlZCB0aGUgc3ByZWFkLiBJbiBzYW1wbGUsIHRoaXMgc3Vic2V0IHNob3dzIGEgbGFyZ2UgZWRnZSBvdmVyIHRoZSBib29rcy4gQnV0LCB3aXRoIGEgc2FtcGxlIHNpemUgb2Ygb25seSA4NywgdmFyaWFuY2UgaXMgc3RpbGwgYSB2ZXJ5IHJlYWwgaXNzdWUuIA0KDQojIENvbmNsdXNpb24gYW5kIFJlY29tbWVuZGF0aW9ucw0KDQpUaGUgbXVsdGlwbGUgbG9naXN0aWMgcmVncmVzc2lvbiBtb2RlbCB3YXMgZGV0ZXJtaW5lZCB0byBiZSB0aGUgc3Ryb25nZXN0IG9mIHRoZSB0aHJlZSBtb2RlbHMgY29uc2lkZXJlZDsgaG93ZXZlciwgc2V2ZXJhbCBpbXBvcnRhbnQgbGltaXRhdGlvbnMgcmVtYWluLiBGaXJzdCwgYmV0dGluZyBkaXN0cmlidXRpb24gZGF0YSB3ZXJlIG9ubHkgYXZhaWxhYmxlIGZvciAxOTcgb2YgdGhlIDI3MiByZWd1bGFyIHNlYXNvbiBnYW1lcywgd2hpY2ggcmVzdHJpY3RzIHRoZSBjb21wbGV0ZW5lc3Mgb2YgdGhlIGFuYWx5c2lzLiBJbiBmdXR1cmUgc2Vhc29ucywgc2NyYXBpbmcgYmV0dGluZyBkYXRhIG9uIGEgd2Vla2x5IGJhc2lzIHdvdWxkIGVuc3VyZSBmdWxsIGNvdmVyYWdlIGFuZCBpbXByb3ZlIHRoZSByZWxpYWJpbGl0eSBvZiB0aGUgcmVzdWx0cy4NCg0KQWRkaXRpb25hbGx5LCB0aGUgdGltaW5nIG9mIGRhdGEgY29sbGVjdGlvbiB3YXMgbm90IGZ1bGx5IGNvbnNpc3RlbnQuIEluIHNvbWUgY2FzZXMsIGJldHRpbmcgcGVyY2VudGFnZXMgd2VyZSByZWNvcmRlZCBwcmlvciB0byBraWNrb2ZmLCB3aGlsZSBpbiBvdGhlcnMgdGhleSB3ZXJlIGNvbGxlY3RlZCBhZnRlciBnYW1lcyBoYWQgY29uY2x1ZGVkLiBCZWNhdXNlIHRob3VzYW5kcyBvZiBsaXZlIGJldHMgYXJlIHBsYWNlZCBkdXJpbmcgZ2FtZXMsIHByZWdhbWUgcGVyY2VudGFnZXMgbWF5IG5vdCBmdWxseSByZWZsZWN0IHRvdGFsIG1hcmtldCBhY3Rpdml0eSwgaW50cm9kdWNpbmcgYWRkaXRpb25hbCBub2lzZSBpbnRvIHRoZSBhbmFseXNpcy4NCg0KRmluYWxseSwgdGhlcmUgYXJlIHVuYXZvaWRhYmxlIHNvdXJjZXMgb2YgdmFyaWFuY2UgdGhhdCBjYW5ub3QgYmUgY2FwdHVyZWQgYnkgdGhlIG1vZGVsLiBJbi1nYW1lIGluanVyaWVzLCB1bmV4cGVjdGVkIHBlcmZvcm1hbmNlIGNoYW5nZXMsIGNvYWNoaW5nIGRlY2lzaW9ucywgYW5kIG90aGVyIHJhbmRvbSBzaG9ja3MgY2FuIHNpZ25pZmljYW50bHkgYWZmZWN0IG91dGNvbWVzIGJ1dCBhcmUgaW5oZXJlbnRseSB1bnByZWRpY3RhYmxlIGF0IGJldHRpbmcgdGltZS4gVGhlc2UgZmFjdG9ycyBoZWxwIGV4cGxhaW4gd2h5IGV2ZW4gd2VsbC1wZXJmb3JtaW5nIG1vZGVscyBhcmUgdW5saWtlbHkgdG8gc3VzdGFpbiBleHRyZW1lbHkgaGlnaCB3aW4gcmF0ZXMgb3ZlciB0aW1lLg0KDQpEZXNwaXRlIHRoZXNlIGxpbWl0YXRpb25zLCB0aGUgcmVzdWx0cyBzdWdnZXN0IHRoYXQgc2VwYXJhdGluZyBwdWJsaWMgYmV0dGluZyB2b2x1bWUgZnJvbSBiZXR0aW5nIGhhbmRsZSBwcm92aWRlcyBtZWFuaW5nZnVsIGluc2lnaHQgaW50byBzcHJlYWQgb3V0Y29tZXMuIEZ1dHVyZSB3b3JrIGluY29ycG9yYXRpbmcgbW9yZSBjb21wbGV0ZSBkYXRhIGFuZCBjb25zaXN0ZW50IGNvbGxlY3Rpb24gbWV0aG9kcyBjb3VsZCBmdXJ0aGVyIHJlZmluZSB0aGUgbW9kZWwgYW5kIGJldHRlciBldmFsdWF0ZSB0aGUgcGVyc2lzdGVuY2Ugb2YgYW55IG9ic2VydmVkIGJldHRpbmcgZWRnZS4=