1 Introduction

In this assignment we will be looking at a data set about the LPGA which is the woman’s golf league. With this data set we will be seeing if our initial model will need any transformations. We will also being using greens in regulation as our response variable. We want to look at how all these different predictor variables in golf correlate to greens in regulation. We will perform necessary tests to find a good model for this.

1.1 Data Description

The data in this project was taken from (https://users.stat.ufl.edu/~winner/datasets.html). My variables are

  • Golfer- Name of the Golfer
  • Nation- Where the golfer is from
  • Region- What region the golfer is from
  • fairways- How many fairways the golfer hit in regulation
  • fairAtt- How many attempts the golfer took to get to the fairway
  • fairPct- The percent of fairways hit in regulation
  • totPutts- Total amount of putts the golfer had
  • totRounds- Total amouint of rounds played by the golfer
  • avePutts- Average amount of putts when you reached the green per hole
  • greenReg- How many greens were hit in regulation
  • totPrize- Amount of money won
  • events- How many events the golfer went to
  • driveDist- The average distance that the golfer hit with their drive
  • sandSaves- The amount of sand saves the golfer had
  • sandAtt- The amount of shots taken from the sand
  • sandPct- The percentage of shots that made it out of the sand

1.2 Practical Question

The point of this study is to figure out the association between greens in regulation and the predictor values available in this data set.

2 Exploratory Data Analysis

We first want to look at how the predictor variables affect our response variable in greens hit in regulation.

Looking at the first scatter plot with the variable fairway we can see that it has a positive linear trend. This means that the more fairways you hit in regulation, the more greens you will hit in regulation.

The scatter plot with fairway percentage seems left skewed. This shows that most of the golfers in this data set were mostly hitting higher percentages into the fairways.

The scatter plot for drive distance seems to have a more positive linear trend.

The scatter plot for sand attempts seems to be slightly right skewed with two possible outliers past the 120 sand attempts.

The scatter plot for sand percentage also has a positive linear trend.

2.1 Full model and diagnostics

We need to make a linear model with the predictor values. Based on previous experiences, we have taken out Golfer, Nation, Region, totPrize, and totRounds. The number of events, number of rounds, and total prize will not be able to influence getting on the green in regulation. We also need to drop the variables totPutts, avePutts, sandSaves, and fairAtt because they are also not variables that can affect a persons ability to get on the green in regulation. This is due to them either not directly correlated or happen after you get onto the green.

Regression Coefficients
Estimate Std. Error t value Pr(>|t|)
(Intercept) -9.9257920 8.8445752 -1.122246 0.2635273
fairway 0.0191607 0.0018383 10.423042 0.0000000
fairPct 0.1406976 0.0467571 3.009119 0.0030680
driveDist 0.2407452 0.0253429 9.499498 0.0000000
sandAtt -0.1105811 0.0172524 -6.409602 0.0000000
sandPct 0.0525978 0.0249874 2.104974 0.0369384

Now we should look at our residual diagnostic analysis to check how reliable our model is.

In these residual plots we can see that Q-Q residual has a normal distribution which happens when. you have . The residuals vs fitted shows the points not in a cone shape throughout and this means the variance is constant.

2.2 Goodness-of-fit Measures

Now, we look at the goodness of fit measures for the models.

Goodness-of-fit Measures of Full Model
SSE R.sq R.adj Cp AIC SBC PRESS
full.model 787.5965 0.6780546 0.6674643 6 265.8098 284.1853 862.4798

We have a sample size of 158 which is large. We can see from the above table that the goodness-of-fit measures of the first model are significant. This shows that the model has a 67% predictive ability to predict greens in regulation.

3 Final Model

This is the statistics of the chosen model.

Stats of Final Model
Estimate Std. Error t value Pr(>|t|)
(Intercept) -9.9257920 8.8445752 -1.122246 0.2635273
fairway 0.0191607 0.0018383 10.423042 0.0000000
fairPct 0.1406976 0.0467571 3.009119 0.0030680
driveDist 0.2407452 0.0253429 9.499498 0.0000000
sandAtt -0.1105811 0.0172524 -6.409602 0.0000000
sandPct 0.0525978 0.0249874 2.104974 0.0369384

Since the sample size of 158 is large, the argument for validating p-values is the Central Limit Theorem. All the p-values are close to 0 meaning that all coefficients are significant

In this case, due to the p-values there is no need to perform variable selection to determine the final model.

4 Conclusion/Discussion

We didn’t have to use many different techniques such as Box-Cox to transform the response variables. This was due to the assumption of constant variance being met. We got rid of all the variables that would not be significant or have any association in evaluating getting on the green in regulation due to my past experience.

We looked at the residual plots and the goodness of fit measures to access the model. In doing this we came to the conclusion that the model we had didn’t need any transformations and our model was significant.

LS0tCnRpdGxlOiAiV2hhdCBoZWxwcyBhIGdvbGZlciBnZXQgdG8gZ3JlZW5zIGluIHJlZ3VsYXRpb24/IgphdXRob3I6ICJSeWFuIExlYm8iCmRhdGU6ICIyMDI0LTEwLTIyIgpvdXRwdXQ6IAogIGh0bWxfZG9jdW1lbnQ6CiAgICB0b2M6IHllcwogICAgdG9jX2RlcHRoOiA0CiAgICB0b2NfZmxvYXQ6IHllcwogICAgZmlnX3dpZHRoOiA0CiAgICBmaWdfY2FwdGlvbjogeWVzCiAgICBudW1iZXJfc2VjdGlvbnM6IHllcwogICAgdG9jX2NvbGxhcHNlZDogeWVzCiAgICBjb2RlX2ZvbGRpbmc6IGhpZGUKICAgIGNvZGVfZG93bmxvYWQ6IHllcwogICAgc21vb3RoX3Njcm9sbDogeWVzCiAgICB0aGVtZTogbHVtZW4KICB3b3JkX2RvY3VtZW50OgogICAgdG9jOiB5ZXMKICAgIHRvY19kZXB0aDogNAogICAgZmlnX2NhcHRpb246IHllcwogICAga2VlcF9tZDogeWVzCiAgcGRmX2RvY3VtZW50OgogICAgdG9jOiB5ZXMKICAgIHRvY19kZXB0aDogNAogICAgZmlnX2NhcHRpb246IHllcwogICAgbnVtYmVyX3NlY3Rpb25zOiB5ZXMKICAgIGZpZ193aWR0aDogMwogICAgZmlnX2hlaWdodDogMwplZGl0b3Jfb3B0aW9uczoKICBjaHVua19vdXRwdXRfdHlwZTogaW5saW5lCnNsd2F5c19hbGxvd19odG1sOiB0cnVlCi0tLQoKYGBgez1odG1sfQoKPHN0eWxlIHR5cGU9InRleHQvY3NzIj4KCi8qIENhc2NhZGluZyBTdHlsZSBTaGVldHMgKENTUykgaXMgYSBzdHlsZXNoZWV0IGxhbmd1YWdlIHVzZWQgdG8gZGVzY3JpYmUgdGhlIHByZXNlbnRhdGlvbiBvZiBhIGRvY3VtZW50IHdyaXR0ZW4gaW4gSFRNTCBvciBYTUwuIGl0IGlzIGEgc2ltcGxlIG1lY2hhbmlzbSBmb3IgYWRkaW5nIHN0eWxlIChlLmcuLCBmb250cywgY29sb3JzLCBzcGFjaW5nKSB0byBXZWIgZG9jdW1lbnRzLiAqLwoKaDEudGl0bGUgeyAgLyogVGl0bGUgLSBmb250IHNwZWNpZmljYXRpb25zIG9mIHRoZSByZXBvcnQgdGl0bGUgKi8KICBmb250LXNpemU6IDI0cHg7CiAgY29sb3I6IERhcmtSZWQ7CiAgdGV4dC1hbGlnbjogY2VudGVyOwogIGZvbnQtZmFtaWx5OiAiR2lsbCBTYW5zIiwgc2Fucy1zZXJpZjsKfQpoNC5hdXRob3IgeyAvKiBIZWFkZXIgNCAtIGZvbnQgc3BlY2lmaWNhdGlvbnMgZm9yIGF1dGhvcnMgICovCiAgZm9udC1zaXplOiAyMHB4OwogIGZvbnQtZmFtaWx5OiBzeXN0ZW0tdWk7CiAgY29sb3I6IERhcmtSZWQ7CiAgdGV4dC1hbGlnbjogY2VudGVyOwp9Cmg0LmRhdGUgeyAvKiBIZWFkZXIgNCAtIGZvbnQgc3BlY2lmaWNhdGlvbnMgZm9yIHRoZSBkYXRlICAqLwogIGZvbnQtc2l6ZTogMThweDsKICBmb250LWZhbWlseTogc3lzdGVtLXVpOwogIGNvbG9yOiBEYXJrQmx1ZTsKICB0ZXh0LWFsaWduOiBjZW50ZXI7Cn0KaDEgeyAvKiBIZWFkZXIgMSAtIGZvbnQgc3BlY2lmaWNhdGlvbnMgZm9yIGxldmVsIDEgc2VjdGlvbiB0aXRsZSAgKi8KICAgIGZvbnQtc2l6ZTogMjJweDsKICAgIGZvbnQtZmFtaWx5OiAiVGltZXMgTmV3IFJvbWFuIiwgVGltZXMsIHNlcmlmOwogICAgY29sb3I6IG5hdnk7CiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7Cn0KaDIgeyAvKiBIZWFkZXIgMiAtIGZvbnQgc3BlY2lmaWNhdGlvbnMgZm9yIGxldmVsIDIgc2VjdGlvbiB0aXRsZSAqLwogICAgZm9udC1zaXplOiAyMHB4OwogICAgZm9udC1mYW1pbHk6ICJUaW1lcyBOZXcgUm9tYW4iLCBUaW1lcywgc2VyaWY7CiAgICBjb2xvcjogbmF2eTsKICAgIHRleHQtYWxpZ246IGxlZnQ7Cn0KCmgzIHsgLyogSGVhZGVyIDMgLSBmb250IHNwZWNpZmljYXRpb25zIG9mIGxldmVsIDMgc2VjdGlvbiB0aXRsZSAgKi8KICAgIGZvbnQtc2l6ZTogMThweDsKICAgIGZvbnQtZmFtaWx5OiAiVGltZXMgTmV3IFJvbWFuIiwgVGltZXMsIHNlcmlmOwogICAgY29sb3I6IG5hdnk7CiAgICB0ZXh0LWFsaWduOiBsZWZ0Owp9CgpoNCB7IC8qIEhlYWRlciA0IC0gZm9udCBzcGVjaWZpY2F0aW9ucyBvZiBsZXZlbCA0IHNlY3Rpb24gdGl0bGUgICovCiAgICBmb250LXNpemU6IDE4cHg7CiAgICBmb250LWZhbWlseTogIlRpbWVzIE5ldyBSb21hbiIsIFRpbWVzLCBzZXJpZjsKICAgIGNvbG9yOiBkYXJrcmVkOwogICAgdGV4dC1hbGlnbjogbGVmdDsKfQoKYm9keSB7IGJhY2tncm91bmQtY29sb3I6d2hpdGU7IH0KCi5oaWdobGlnaHRtZSB7IGJhY2tncm91bmQtY29sb3I6eWVsbG93OyB9CgpwIHsgYmFja2dyb3VuZC1jb2xvcjp3aGl0ZTsgfQoKPC9zdHlsZT4KYGBgCmBgYHtyIHNldHVwLCBpbmNsdWRlPUZBTFNFfQojIERldGVjdCwgaW5zdGFsbCwgYW5kIGxvYWQgcGFja2FnZXMgaWYgbmVlZGVkLgppZiAoIXJlcXVpcmUoImtuaXRyIikpIHsKICAgaW5zdGFsbC5wYWNrYWdlcygia25pdHIiKQogICBsaWJyYXJ5KGtuaXRyKQp9CmlmICghcmVxdWlyZSgibGVhZmxldCIpKSB7CiAgIGluc3RhbGwucGFja2FnZXMoImxlYWZsZXQiKQogICBsaWJyYXJ5KGxlYWZsZXQpCn0KaWYgKCFyZXF1aXJlKCJFbnZTdGF0cyIpKSB7CiAgIGluc3RhbGwucGFja2FnZXMoIkVudlN0YXRzIikKICAgbGlicmFyeShFbnZTdGF0cykKfQppZiAoIXJlcXVpcmUoIk1BU1MiKSkgewogICBpbnN0YWxsLnBhY2thZ2VzKCJNQVNTIikKICAgbGlicmFyeShNQVNTKQp9CmlmICghcmVxdWlyZSgicGh5dG9vbHMiKSkgewogICBpbnN0YWxsLnBhY2thZ2VzKCJwaHl0b29scyIpCiAgIGxpYnJhcnkocGh5dG9vbHMpCn0KIwojIFNwZWNpZmljYXRpb25zIG9mIG91dHB1dHMgb2YgY29kZSBpbiBjb2RlIGNodW5rcwprbml0cjo6b3B0c19jaHVuayRzZXQoZWNobyA9IEZBTFNFLCAgIyBpbmNsdWRlIGNvZGUgY2h1bmsgaW4gdGhlIG91dHB1dCBmaWxlCiAgICAgICAgICAgICAgICAgICB3YXJuaW5nID0gRkFMU0UsICAjIFNvbWV0aW1lcywgeW91ciBjb2RlIG1heSBwcm9kdWNlIGEgd2FybmluZwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBtZXNzYWdlcywgeW91IGNhbiBjaG9vc2UgdG8gaW5jbHVkZSB0aGUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgd2FybmluZyBtZXNzYWdlcyBpbiB0aGUgb3V0cHV0IGZpbGUuIAogICAgICAgICAgICAgICAgICAgbWVzc2FnZSA9IEZBTFNFLCAgCiAgICAgICAgICAgICAgICAgICByZXN1bHRzID0gVFJVRSwgICAjIHlvdSBjYW4gYWxzbyBkZWNpZGUgd2hldGhlciB0byBpbmNsdWRlIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyB0aGUgb3V0cHV0IGluIHRoZSBvdXRwdXQgZmlsZS4KICAgICAgICAgICAgICAgICAgIGNvbW1lbnQgPSBGQUxTRSAgICMgU3VwcHJlc3MgaGFzaC10YWdzIGluIHRoZSBvdXRwdXQgcmVzdWx0cy4KICAgICAgICAgICAgICAgICAgICAgICkgICAKYGBgCgojIEludHJvZHVjdGlvbgpJbiB0aGlzIGFzc2lnbm1lbnQgd2Ugd2lsbCBiZSBsb29raW5nIGF0IGEgZGF0YSBzZXQgYWJvdXQgdGhlIExQR0Egd2hpY2ggaXMgdGhlIHdvbWFuJ3MgZ29sZiBsZWFndWUuIFdpdGggdGhpcyBkYXRhIHNldCB3ZSB3aWxsIGJlIHNlZWluZyBpZiBvdXIgaW5pdGlhbCBtb2RlbCB3aWxsIG5lZWQgYW55IHRyYW5zZm9ybWF0aW9ucy4gV2Ugd2lsbCBhbHNvIGJlaW5nIHVzaW5nIGdyZWVucyBpbiByZWd1bGF0aW9uIGFzIG91ciByZXNwb25zZSB2YXJpYWJsZS4gV2Ugd2FudCB0byBsb29rIGF0IGhvdyBhbGwgdGhlc2UgZGlmZmVyZW50IHByZWRpY3RvciB2YXJpYWJsZXMgaW4gZ29sZiBjb3JyZWxhdGUgdG8gZ3JlZW5zIGluIHJlZ3VsYXRpb24uIFdlIHdpbGwgcGVyZm9ybSBuZWNlc3NhcnkgdGVzdHMgdG8gZmluZCBhIGdvb2QgbW9kZWwgZm9yIHRoaXMuCgoKCiMjIERhdGEgRGVzY3JpcHRpb24KVGhlIGRhdGEgaW4gdGhpcyBwcm9qZWN0IHdhcyB0YWtlbiBmcm9tIChodHRwczovL3VzZXJzLnN0YXQudWZsLmVkdS9+d2lubmVyL2RhdGFzZXRzLmh0bWwpLiBNeSB2YXJpYWJsZXMgYXJlCgoqIEdvbGZlci0gTmFtZSBvZiB0aGUgR29sZmVyCiogTmF0aW9uLSBXaGVyZSB0aGUgZ29sZmVyIGlzIGZyb20KKiBSZWdpb24tIFdoYXQgcmVnaW9uIHRoZSBnb2xmZXIgaXMgZnJvbQoqIGZhaXJ3YXlzLSBIb3cgbWFueSBmYWlyd2F5cyB0aGUgZ29sZmVyIGhpdCBpbiByZWd1bGF0aW9uCiogZmFpckF0dC0gSG93IG1hbnkgYXR0ZW1wdHMgdGhlIGdvbGZlciB0b29rIHRvIGdldCB0byB0aGUgZmFpcndheQoqIGZhaXJQY3QtIFRoZSBwZXJjZW50IG9mIGZhaXJ3YXlzIGhpdCBpbiByZWd1bGF0aW9uCiogdG90UHV0dHMtIFRvdGFsIGFtb3VudCBvZiBwdXR0cyB0aGUgZ29sZmVyIGhhZCAKKiB0b3RSb3VuZHMtIFRvdGFsIGFtb3VpbnQgb2Ygcm91bmRzIHBsYXllZCBieSB0aGUgZ29sZmVyCiogYXZlUHV0dHMtIEF2ZXJhZ2UgYW1vdW50IG9mIHB1dHRzIHdoZW4geW91IHJlYWNoZWQgdGhlIGdyZWVuIHBlciBob2xlCiogZ3JlZW5SZWctIEhvdyBtYW55IGdyZWVucyB3ZXJlIGhpdCBpbiByZWd1bGF0aW9uCiogdG90UHJpemUtIEFtb3VudCBvZiBtb25leSB3b24KKiBldmVudHMtIEhvdyBtYW55IGV2ZW50cyB0aGUgZ29sZmVyIHdlbnQgdG8KKiBkcml2ZURpc3QtIFRoZSBhdmVyYWdlIGRpc3RhbmNlIHRoYXQgdGhlIGdvbGZlciBoaXQgd2l0aCB0aGVpciBkcml2ZQoqIHNhbmRTYXZlcy0gVGhlIGFtb3VudCBvZiBzYW5kIHNhdmVzIHRoZSBnb2xmZXIgaGFkCiogc2FuZEF0dC0gVGhlIGFtb3VudCBvZiBzaG90cyB0YWtlbiBmcm9tIHRoZSBzYW5kCiogc2FuZFBjdC0gVGhlIHBlcmNlbnRhZ2Ugb2Ygc2hvdHMgdGhhdCBtYWRlIGl0IG91dCBvZiB0aGUgc2FuZAoKIyMgUHJhY3RpY2FsIFF1ZXN0aW9uClRoZSBwb2ludCBvZiB0aGlzIHN0dWR5IGlzIHRvIGZpZ3VyZSBvdXQgdGhlIGFzc29jaWF0aW9uIGJldHdlZW4gZ3JlZW5zIGluIHJlZ3VsYXRpb24gYW5kIHRoZSBwcmVkaWN0b3IgdmFsdWVzIGF2YWlsYWJsZSBpbiB0aGlzIGRhdGEgc2V0LiAKCiMgRXhwbG9yYXRvcnkgRGF0YSBBbmFseXNpcwoKV2UgZmlyc3Qgd2FudCB0byBsb29rIGF0IGhvdyB0aGUgcHJlZGljdG9yIHZhcmlhYmxlcyBhZmZlY3Qgb3VyIHJlc3BvbnNlIHZhcmlhYmxlIGluIGdyZWVucyBoaXQgaW4gcmVndWxhdGlvbi4KCmBgYHtyIGZpZy5hbGlnbj0nY2VudGVyJ30KbHBnYTAgPC0gcmVhZC5jc3YoImh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9SeWFuTGViby9TVEEtMzIxL3JlZnMvaGVhZHMvbWFpbi9scGdhMjAyMi5jc3YiLCBoZWFkZXIgPSBUUlVFKQpscGdhIDwtIGxwZ2EwWywgLTFdCgpmYWlyd2F5PC0gbHBnYSRmYWlyd2F5cwpncmVlbnMgPC0gbHBnYSRncmVlblJlZyAKZnBjdDwtbHBnYSRmYWlyUGN0CmRyaXZlcl9kaXN0YW5jZTwtIGxwZ2EkZHJpdmVEaXN0CnNfQVRUPC0gbHBnYSRzYW5kQXR0CnNfUENUPC0gbHBnYSRzYW5kUGN0CgpwbG90KGZhaXJ3YXksIGdyZWVucywgbWFpbiA9ICJHcmVlbnMgaW4gcmVndWxhdGlvbiB2cyBGYWlyd2F5cyBoaXQiKQphYmxpbmUodj0xMjEuNTI5LCBoPTI0Ljk2LCBjb2w9InJlZCIsIGx0eT0yKQoKcGxvdChmcGN0LCBncmVlbnMsIG1haW4gPSAiR3JlZW5zIGluIHJlZ3VsYXRpb24gdnMgRmFpcndheSBwZXJjZW50YWdlIikKYWJsaW5lKHY9MTIxLjUyOSwgaD0yNC45NiwgY29sPSJyZWQiLCBsdHk9MikKCnBsb3QoZHJpdmVyX2Rpc3RhbmNlLCBncmVlbnMsIG1haW4gPSAiR3JlZW5zIGluIHJlZ3VsYXRpb24gdnMgRHJpdmUgZGlzdGFuY2UiKQphYmxpbmUodj0xMjEuNTI5LCBoPTI0Ljk2LCBjb2w9InJlZCIsIGx0eT0yKQoKcGxvdChzX0FUVCwgZ3JlZW5zLCBtYWluID0gIkdyZWVucyBpbiByZWd1bGF0aW9uIHZzIFNhbmQgYXR0ZW1wdHMiKQphYmxpbmUodj0xMjEuNTI5LCBoPTI0Ljk2LCBjb2w9InJlZCIsIGx0eT0yKQoKcGxvdChzX1BDVCwgZ3JlZW5zLCBtYWluID0gIkdyZWVucyBpbiByZWd1bGF0aW9uIHZzIFNhbmQgcGVyY2VudGFnZSIpCmFibGluZSh2PTEyMS41MjksIGg9MjQuOTYsIGNvbD0icmVkIiwgbHR5PTIpCmBgYAoKTG9va2luZyBhdCB0aGUgZmlyc3Qgc2NhdHRlciBwbG90IHdpdGggdGhlIHZhcmlhYmxlIGZhaXJ3YXkgd2UgY2FuIHNlZSB0aGF0IGl0IGhhcyBhIHBvc2l0aXZlIGxpbmVhciB0cmVuZC4gVGhpcyBtZWFucyB0aGF0IHRoZSBtb3JlIGZhaXJ3YXlzIHlvdSBoaXQgaW4gcmVndWxhdGlvbiwgdGhlIG1vcmUgZ3JlZW5zIHlvdSB3aWxsIGhpdCBpbiByZWd1bGF0aW9uLiAKClRoZSBzY2F0dGVyIHBsb3Qgd2l0aCBmYWlyd2F5IHBlcmNlbnRhZ2Ugc2VlbXMgbGVmdCBza2V3ZWQuIFRoaXMgc2hvd3MgdGhhdCBtb3N0IG9mIHRoZSBnb2xmZXJzIGluIHRoaXMgZGF0YSBzZXQgd2VyZSBtb3N0bHkgaGl0dGluZyBoaWdoZXIgcGVyY2VudGFnZXMgaW50byB0aGUgZmFpcndheXMuCgpUaGUgc2NhdHRlciBwbG90IGZvciBkcml2ZSBkaXN0YW5jZSBzZWVtcyB0byBoYXZlIGEgbW9yZSBwb3NpdGl2ZSBsaW5lYXIgdHJlbmQuCgpUaGUgc2NhdHRlciBwbG90IGZvciBzYW5kIGF0dGVtcHRzIHNlZW1zIHRvIGJlIHNsaWdodGx5IHJpZ2h0IHNrZXdlZCB3aXRoIHR3byBwb3NzaWJsZSBvdXRsaWVycyBwYXN0IHRoZSAxMjAgc2FuZCBhdHRlbXB0cy4gCgpUaGUgc2NhdHRlciBwbG90IGZvciBzYW5kIHBlcmNlbnRhZ2UgYWxzbyBoYXMgYSBwb3NpdGl2ZSBsaW5lYXIgdHJlbmQuIAoKCgojIyBGdWxsIG1vZGVsIGFuZCBkaWFnbm9zdGljcwpXZSBuZWVkIHRvIG1ha2UgYSBsaW5lYXIgbW9kZWwgd2l0aCB0aGUgcHJlZGljdG9yIHZhbHVlcy4gQmFzZWQgb24gcHJldmlvdXMgZXhwZXJpZW5jZXMsIHdlIGhhdmUgdGFrZW4gb3V0IEdvbGZlciwgTmF0aW9uLCBSZWdpb24sIHRvdFByaXplLCBhbmQgdG90Um91bmRzLiBUaGUgbnVtYmVyIG9mIGV2ZW50cywgbnVtYmVyIG9mIHJvdW5kcywgYW5kIHRvdGFsIHByaXplIHdpbGwgbm90IGJlIGFibGUgdG8gaW5mbHVlbmNlIGdldHRpbmcgb24gdGhlIGdyZWVuIGluIHJlZ3VsYXRpb24uIFdlIGFsc28gbmVlZCB0byBkcm9wIHRoZSB2YXJpYWJsZXMgdG90UHV0dHMsIGF2ZVB1dHRzLCBzYW5kU2F2ZXMsIGFuZCBmYWlyQXR0IGJlY2F1c2UgdGhleSBhcmUgYWxzbyBub3QgdmFyaWFibGVzIHRoYXQgY2FuIGFmZmVjdCBhIHBlcnNvbnMgYWJpbGl0eSB0byBnZXQgb24gdGhlIGdyZWVuIGluIHJlZ3VsYXRpb24uIFRoaXMgaXMgZHVlIHRvIHRoZW0gZWl0aGVyIG5vdCBkaXJlY3RseSBjb3JyZWxhdGVkIG9yIGhhcHBlbiBhZnRlciB5b3UgZ2V0IG9udG8gdGhlIGdyZWVuLgoKYGBge3J9CmZ1bGwubW9kZWwgPSBsbShncmVlbnMgfiBmYWlyd2F5KyBmYWlyUGN0KyBkcml2ZURpc3QrIHNhbmRBdHQrIHNhbmRQY3QsIGRhdGEgPSBscGdhKQprYWJsZShzdW1tYXJ5KGZ1bGwubW9kZWwpJGNvZWYsIGNhcHRpb24gPSJSZWdyZXNzaW9uIENvZWZmaWNpZW50cyIpCgpgYGAKCgoKCk5vdyB3ZSBzaG91bGQgbG9vayBhdCBvdXIgcmVzaWR1YWwgZGlhZ25vc3RpYyBhbmFseXNpcyB0byBjaGVjayBob3cgcmVsaWFibGUgb3VyIG1vZGVsIGlzLgoKYGBge3J9CnBhcihtZnJvdz1jKDIsMikpCnBsb3QoZnVsbC5tb2RlbCkKCmBgYAoKSW4gdGhlc2UgcmVzaWR1YWwgcGxvdHMgd2UgY2FuIHNlZSB0aGF0IFEtUSByZXNpZHVhbCBoYXMgYSBub3JtYWwgZGlzdHJpYnV0aW9uIHdoaWNoIGhhcHBlbnMgd2hlbi4geW91IGhhdmUgLiBUaGUgcmVzaWR1YWxzIHZzIGZpdHRlZCBzaG93cyB0aGUgcG9pbnRzIG5vdCBpbiBhIGNvbmUgc2hhcGUgdGhyb3VnaG91dCBhbmQgdGhpcyBtZWFucyB0aGUgdmFyaWFuY2UgaXMgY29uc3RhbnQuCgoKIyMgR29vZG5lc3Mtb2YtZml0IE1lYXN1cmVzCgpOb3csIHdlIGxvb2sgYXQgdGhlIGdvb2RuZXNzIG9mIGZpdCBtZWFzdXJlcyBmb3IgdGhlIG1vZGVscy4KCmBgYHtyfQpzZWxlY3Q9ZnVuY3Rpb24obSl7IAogZSA9IG0kcmVzaWQgICAgICAgICAgICAgICAgICAgICAgICAgCiBuMCA9IGxlbmd0aChlKSAgICAgICAgICAgICAgICAgICAgICAgIAogU1NFPShtJGRmKSooc3VtbWFyeShtKSRzaWdtYSleMiAgICAgIAogUi5zcT1zdW1tYXJ5KG0pJHIuc3F1YXJlZCAgICAgICAgICAgICAKIFIuYWRqPXN1bW1hcnkobSkkYWRqLnIgICAgICAgICAgICAgICAgCiBNU0U9KHN1bW1hcnkobSkkc2lnbWEpXjIgICAgICAgICAgICAgIAogQ3A9KFNTRS9NU0UpLShuMC0yKihuMC1tJGRmKSkgICAgICAgIAogQUlDPW4wKmxvZyhTU0UpLW4wKmxvZyhuMCkrMioobjAtbSRkZikgICAgICAgICAKIFNCQz1uMCpsb2coU1NFKS1uMCpsb2cobjApKyhsb2cobjApKSoobjAtbSRkZikgIAogWD1tb2RlbC5tYXRyaXgobSkgICAgICAgICAgICAgICAgICAgICAKIEg9WCUqJXNvbHZlKHQoWCklKiVYKSUqJXQoWCkgICAgICAgICAKIGQ9ZS8oMS1kaWFnKEgpKSAgICAgICAgICAgICAgICAgICAgICAgCiBQUkVTUz10KGQpJSolZCAgIAogdGJsID0gYXMuZGF0YS5mcmFtZShjYmluZChTU0U9U1NFLCBSLnNxPVIuc3EsIFIuYWRqID0gUi5hZGosIENwID0gQ3AsIEFJQyA9IEFJQywgU0JDID0gU0JDLCBQUkQgPSBQUkVTUykpCiBuYW1lcyh0YmwpPWMoIlNTRSIsICJSLnNxIiwgIlIuYWRqIiwgIkNwIiwgIkFJQyIsICJTQkMiLCAiUFJFU1MiKQogdGJsCiB9CgpgYGAKCmBgYHtyfQpvdXRwdXQuc3VtID0gcmJpbmQoc2VsZWN0KGZ1bGwubW9kZWwpKQpyb3cubmFtZXMob3V0cHV0LnN1bSkgPSBjKCJmdWxsLm1vZGVsIikKa2FibGUob3V0cHV0LnN1bSwgY2FwdGlvbiA9ICJHb29kbmVzcy1vZi1maXQgTWVhc3VyZXMgb2YgRnVsbCBNb2RlbCIpCmBgYAoKV2UgaGF2ZSBhIHNhbXBsZSBzaXplIG9mIDE1OCB3aGljaCBpcyBsYXJnZS4gV2UgY2FuIHNlZSBmcm9tIHRoZSBhYm92ZSB0YWJsZSB0aGF0IHRoZSBnb29kbmVzcy1vZi1maXQgbWVhc3VyZXMgb2YgdGhlIGZpcnN0IG1vZGVsIGFyZSBzaWduaWZpY2FudC4gVGhpcyBzaG93cyB0aGF0IHRoZSBtb2RlbCBoYXMgYSA2NyUgcHJlZGljdGl2ZSBhYmlsaXR5IHRvIHByZWRpY3QgZ3JlZW5zIGluIHJlZ3VsYXRpb24uCgoKCiMgRmluYWwgTW9kZWwKClRoaXMgaXMgdGhlIHN0YXRpc3RpY3Mgb2YgdGhlIGNob3NlbiBtb2RlbC4KCmBgYHtyfQprYWJsZShzdW1tYXJ5KGZ1bGwubW9kZWwpJGNvZWYsIGNhcHRpb24gPSAiU3RhdHMgb2YgRmluYWwgTW9kZWwiKQpgYGAKClNpbmNlIHRoZSBzYW1wbGUgc2l6ZSBvZiAxNTggaXMgbGFyZ2UsIHRoZSBhcmd1bWVudCBmb3IgdmFsaWRhdGluZyBwLXZhbHVlcyBpcyB0aGUgQ2VudHJhbCBMaW1pdCBUaGVvcmVtLiBBbGwgdGhlIHAtdmFsdWVzIGFyZSBjbG9zZSB0byAwIG1lYW5pbmcgdGhhdCBhbGwgY29lZmZpY2llbnRzIGFyZSBzaWduaWZpY2FudAoKSW4gdGhpcyBjYXNlLCBkdWUgdG8gdGhlIHAtdmFsdWVzIHRoZXJlIGlzIG5vIG5lZWQgdG8gcGVyZm9ybSB2YXJpYWJsZSBzZWxlY3Rpb24gdG8gZGV0ZXJtaW5lIHRoZSBmaW5hbCBtb2RlbC4KCgojIENvbmNsdXNpb24vRGlzY3Vzc2lvbgoKV2UgZGlkbid0IGhhdmUgdG8gdXNlIG1hbnkgZGlmZmVyZW50IHRlY2huaXF1ZXMgc3VjaCBhcyBCb3gtQ294IHRvIHRyYW5zZm9ybSB0aGUgcmVzcG9uc2UgdmFyaWFibGVzLiBUaGlzIHdhcyBkdWUgdG8gdGhlIGFzc3VtcHRpb24gb2YgY29uc3RhbnQgdmFyaWFuY2UgYmVpbmcgbWV0LiBXZSBnb3QgcmlkIG9mIGFsbCB0aGUgdmFyaWFibGVzIHRoYXQgd291bGQgbm90IGJlIHNpZ25pZmljYW50IG9yIGhhdmUgYW55IGFzc29jaWF0aW9uIGluIGV2YWx1YXRpbmcgZ2V0dGluZyBvbiB0aGUgZ3JlZW4gaW4gcmVndWxhdGlvbiBkdWUgdG8gbXkgcGFzdCBleHBlcmllbmNlLgoKV2UgbG9va2VkIGF0IHRoZSByZXNpZHVhbCBwbG90cyBhbmQgdGhlIGdvb2RuZXNzIG9mIGZpdCBtZWFzdXJlcyB0byBhY2Nlc3MgdGhlIG1vZGVsLiBJbiBkb2luZyB0aGlzIHdlIGNhbWUgdG8gdGhlIGNvbmNsdXNpb24gdGhhdCB0aGUgbW9kZWwgd2UgaGFkIGRpZG4ndCBuZWVkIGFueSB0cmFuc2Zvcm1hdGlvbnMgYW5kIG91ciBtb2RlbCB3YXMgc2lnbmlmaWNhbnQuCgoKCgoKCgo=