library(ggplot2)
library(dplyr)
library(knitr)
library(kableExtra)
#library(broom)
# Load the data into a dataframe
country_stats <- read.csv('who.csv')
Week 12, Regression Analysis in R part 2: 11-15 Apr
About the data
The attached who.csv dataset contains real-world data from 2008. The variables included follow.
| Country |
name of the country |
| LifeExp |
average life expectancy for the country in years |
| InfantSurvival |
proportion of those surviving to one year or more |
| Under5Survival |
proportion of those surviving to five years or more |
| TBFree |
proportion of the population without TB. |
| PropMD |
proportion of the population who are MDs |
| PropRN |
proportion of the population who are RNs |
| PersExp |
mean personal expenditures on healthcare in US dollars at average exchange rate |
| GovtExp |
mean government expenditures per capita on healthcare, US dollars at average exchange rate |
| TotExp |
sum of personal and government expenditures. |
Exercise 1
Provide a scatterplot of LifeExp ~ TotExp, and run simple linear regression. Do not transform the variables. Provide and interpret the F statistics, \(R^2\), standard error, and p-values only. Discuss whether the assumptions of simple linear regression met.
Generate a scatter plot
plot(x = country_stats$TotExp, y = country_stats$LifeExp)
The plot above does not resemble a roughly linear correlation between TotExp and LifeExp.
This figure shows that the life expentancy tends to fluctuate (large spread) between 40 and 75 for values of Total Expense under 70,000. However, The life expectancy tends to remain above 75 for Total Expense values above 70,000.
Fit a simple linear regression model
ex1_lm <- lm(formula = LifeExp ~ TotExp, data = country_stats)
ex1_lm_summary <- summary(ex1_lm)
#[1] "call" "terms" "residuals" "coefficients" "aliased" "sigma"
#[7] "df" "r.squared" "adj.r.squared" "fstatistic" "cov.unscaled"
ex1_fstat <- ex1_lm_summary$fstatistic
ex1_rsquared <- ex1_lm_summary$r.squared
ex1_res_std_err <- ex1_lm_summary$sigma
ex1_pVal <- anova(ex1_lm)$'Pr(>F)'[1]
Show model’s quality measurement statistics
| F-Statistic |
65.2641982, 1, 188 |
| Multiple R-squared |
0.2576922 |
| Residual standard error |
9.3710333 |
| p-value |
7.7139931^{-14} |
Evaluate model’s quality measurement statistics
Evaluate F-Statistic
The F-statistic value compares the current model to a model that has one fewer parameters. Because the one-factor model already has only a single parameter, this test is not particularly useful in this case.
Evaluate Multiple R-squared
The Multiple R-squared value is a number between 0 and 1. It is a statistical measure of how well the model describes the measured data. The reported \(R^2\) of 0.2576922 for this model means that the model explains 25.77 percent of the data’s variation.
Evaluate Residual standard error
In a good linear model the, if the residuals are distributed normally, the first and third quantiles of the previous residuals should be about 1.5 times this standard error.
Show the Q1 and Q3 for the model’s residuals
summary(ex1_lm_summary$residuals)
#> Min. 1st Qu. Median Mean 3rd Qu. Max.
#> -24.764 -4.778 3.154 0.000 7.116 13.292
From the summary above we see that,
Therefore, the residuals do not seem to be distributed normally.
Evaluate p-value
The Pr(>|t|) shows the probability that the corresponding coefficient is not relevant in the model. This value is also known as the significance or p-value of the coefficient.
In this model,
- the probability that “TotExp” is not relevant in this model is \(7.7139931\times 10^{-14}\) - a tiny value less than 0.05. This means that “TotExp” (sum of personal and government expenditures) is relevant in the model.
- the probability that the intercept is not relevant in this model is \(7.8070708\times 10^{-153}\) - a tiny value far less than 0.05. This means that the intercept is relevant in the model.
Exercise 2
Raise life expectancy to the 4.6 power (i.e., \(LifeExp^{4.6}\)). Raise total expenditures to the 0.06 power (nearly a log transform, \(TotExp^{.06}\)). Plot \(LifeExp^{4.6}\) as a function of \(TotExp^{.06}\), and r re-run the simple regression model using the transformed variables. Provide and interpret the F statistics, \(R^2\), standard error, and p-values. Which model is “better?”
Generate a scatter plot
plot(x = I(country_stats$TotExp ^ 0.06), y = I(country_stats$LifeExp ^ 4.6))

The plot above does resemble a roughly positive linear correlation between TotExp and LifeExp. The life expentancy tends to increase as the values of Total Expense increase.
Fit a simple linear regression model
ex2_lm <- lm(formula = I(LifeExp ^ 4.6) ~ I(TotExp ^ 0.06), data = country_stats)
ex2_lm_summary <- summary(ex2_lm)
#[1] "call" "terms" "residuals" "coefficients" "aliased" "sigma"
#[7] "df" "r.squared" "adj.r.squared" "fstatistic" "cov.unscaled"
ex2_fstat <- ex2_lm_summary$fstatistic
ex2_rsquared <- ex2_lm_summary$r.squared
ex2_res_std_err <- ex2_lm_summary$sigma
ex2_pVal <- anova(ex2_lm)$'Pr(>F)'[1]
Show model’s quality measurement statistics
| F-Statistic |
507.6967054, 1, 188 |
| Multiple R-squared |
0.7297673 |
| Residual standard error |
9.0492393^{7} |
| p-value |
2.6014284^{-55} |
Evaluate model’s quality measurement statistics
Evaluate F-Statistic
The F-statistic value compares the current model to a model that has one fewer parameters. Because the one-factor model already has only a single parameter, this test is not particularly useful in this case.
Evaluate Multiple R-squared
The Multiple R-squared value is a number between 0 and 1. It is a statistical measure of how well the model describes the measured data. The reported \(R^2\) of 0.7297673 for this model means that the model explains 72.98 percent of the data’s variation. This is a big improvement over the 25.77 percent reported in Exercise 1.
Evaluate Residual standard error
In a good linear model the, if the residuals are distributed normally, the first and third quantiles of the previous residuals should be about 1.5 times this standard error.
Show the Q1 and Q3 for the model’s residuals
summary(ex2_lm_summary$residuals)
#> Min. 1st Qu. Median Mean 3rd Qu. Max.
#> -308616089 -53978977 13697187 0 59139231 211951764
From the summary above we see that,
Therefore, the residuals do not seem to be distributed normally.
Evaluate p-value
The Pr(>|t|) shows the probability that the corresponding coefficient is not relevant in the model. This value is also known as the significance or p-value of the coefficient.
In this model,
- the probability that \(TotExp ^ {0.06}\) is not relevant in this model is \(2.6014284\times 10^{-55}\) - a tiny value less than 0.05. This means that \(TotExp ^ {0.06}\) (sum of personal and government expenditures) is relevant in the model.
- the probability that the intercept is not relevant in this model is \(3.9117741\times 10^{-36}\) - a tiny value far less than 0.05. This means that the intercept is relevant in the model.
Exercise 3
Using the results from Exercise 2, forecast life expectancy when \(TotExp^{.06} = 1.5\). Then forecast life expectancy when \(TotExp{^.06} = 2.5\).
From exercise 2, the y-intercept is \(a_0 = -736527910\) and the slope is \(a_1 = 620060216\). Thus, the final regression model is:
\(LifeExp^{4.6} = -736527910 + 620060216 * TotExp^{0.06}\)
Using the above equation we can calculate life expectancy as:
If \(TotExp^{.06} = 1.5\), then \(LifeExp^{4.6} = -736527910 + 620060216 * 1.5 = 1.9356241\times 10^{8}\)
If \(TotExp^{.06} = 2.5\), then \(LifeExp^{4.6} = -736527910 + 620060216 * 2.5 = 8.1362263\times 10^{8}\)
Exercise 4
Build the following multiple regression model and interpret the F Statistics, \(R^2\), standard error, and p-values. How good is the model?
\(LifeExp = b0 + b1 * PropMd + b2 * TotExp + b3 * PropMD * TotExp\)
Fit a simple linear regression model
ex4_lm <- lm(formula = LifeExp ~ PropMD + TotExp + I(PropMD * TotExp), data = country_stats)
ex4_lm_summary <- summary(ex4_lm)
#[1] "call" "terms" "residuals" "coefficients" "aliased" "sigma"
#[7] "df" "r.squared" "adj.r.squared" "fstatistic" "cov.unscaled"
ex4_fstat <- ex4_lm_summary$fstatistic
ex4_rsquared <- ex4_lm_summary$r.squared
ex4_res_std_err <- ex4_lm_summary$sigma
ex4_pVal <- anova(ex4_lm)$'Pr(>F)'[1]
Show model’s quality measurement statistics
| F-Statistic |
34.4883268, 3, 186 |
| Multiple R-squared |
0.3574352 |
| Residual standard error |
8.7654934 |
| p-value |
3.3134579^{-9} |
Evaluate model’s quality measurement statistics
Evaluate F-Statistic
The F-statistic value compares the current model to a model that has one fewer parameters. Because the one-factor model already has only a single parameter, this test is not particularly useful in this case.
Evaluate Multiple R-squared
The Multiple R-squared value is a number between 0 and 1. It is a statistical measure of how well the model describes the measured data. The reported \(R^2\) of 0.3574352 for this model means that the model explains 35.74 percent of the data’s variation.
Evaluate Residual standard error
In a good linear model the, if the residuals are distributed normally, the first and third quantiles of the previous residuals should be about 1.5 times this standard error.
Show the Q1 and Q3 for the model’s residuals
summary(ex4_lm_summary$residuals)
#> Min. 1st Qu. Median Mean 3rd Qu. Max.
#> -27.320 -4.132 2.098 0.000 6.540 13.074
From the summary above we see that,
Therefore, the residuals do not seem to be distributed normally.
Evaluate p-value
The Pr(>|t|) shows the probability that the corresponding coefficient is not relevant in the model. This value is also known as the significance or p-value of the coefficient.
In this model,
- the probability that “TotExp” is not relevant in this model is \(3.3134579\times 10^{-9}\) - a tiny value less than 0.05. This means that “TotExp” (sum of personal and government expenditures) is relevant in the model.
- the probability that the intercept is not relevant in this model is \(6.2071874\times 10^{-145}\) - a tiny value far less than 0.05. This means that the intercept is relevant in the model.
Exercise 5
Forecast LifeExp when \(PropMD = .03\) and \(TotExp = 14\). Does this forecast seem realistic? Why or why not?
Based on the results from Exercise 4, the below model
\(LifeExp = b0 + b1 * PropMd + 7.233^{-5} * TotExp + b3 * PropMD * TotExp\)
can be re-written as
\(LifeExp = 62.77 + 1497 * PropMd + 0.00007233 * TotExp - 0.006026 * PropMD * TotExp\)
Using the above equation we can calculate Life Expectancy as:
- If \(PropMD = .03\) and \(TotExp = 14\), then \(LifeExp = 62.77 + 1497 * .03 + 0.00007233 * 14 - 0.006026 * .03 * 14 = 107.68\)
The life expectancy forecast of 107.68 does not seem realistic because
- the actual life expectance values in the original source data range only from 40 to 83.
- if TotExp (sum of personal and government expenditures) is 14, then it does not make sense that such a small expenditure could help increase a person’s life expectancy to the point of exceeding that of all the rest of the life expectancy values for the reported countries.
LS0tDQp0aXRsZTogIkRBVEE2MDUgLSBIb21ld29yayAxMiINCmF1dGhvcjogIkVzdGViYW4gQXJhbWF5byINCmRhdGU6ICIyMDIyLTA0LTE1Ig0Kb3V0cHV0OiBvcGVuaW50cm86OmxhYl9yZXBvcnQNCi0tLQ0KDQpgYGB7ciBnbG9iYWwtb3B0aW9ucywgaW5jbHVkZT1GQUxTRX0NCmtuaXRyOjpvcHRzX2NodW5rJHNldChlY2hvPVRSVUUsIHdhcm5pbmc9RkFMU0UsIG1lc3NhZ2U9RkFMU0UsDQogICAgICAgICAgICAgICAgICAgICAgY29sbGFwc2UgPSBGQUxTRSwNCiAgICAgICAgICAgICAgICAgICAgICBjb21tZW50ID0gIiM+IiApDQpgYGANCg0KDQpgYGB7cn0NCmxpYnJhcnkoZ2dwbG90MikNCmxpYnJhcnkoZHBseXIpDQpsaWJyYXJ5KGtuaXRyKQ0KbGlicmFyeShrYWJsZUV4dHJhKQ0KI2xpYnJhcnkoYnJvb20pDQpgYGANCg0KIA0KYGBge3J9DQojIExvYWQgdGhlIGRhdGEgaW50byBhIGRhdGFmcmFtZQ0KY291bnRyeV9zdGF0cyA8LSByZWFkLmNzdignd2hvLmNzdicpDQpgYGANCg0KDQoNCiMgV2VlayAxMiwgUmVncmVzc2lvbiBBbmFseXNpcyBpbiBSIHBhcnQgMjogMTEtMTUgQXByDQoNCg0KIyMgQWJvdXQgdGhlIGRhdGENCg0KVGhlIGF0dGFjaGVkICp3aG8uY3N2KiBkYXRhc2V0IGNvbnRhaW5zIHJlYWwtd29ybGQgZGF0YSBmcm9tIDIwMDguIFRoZSB2YXJpYWJsZXMgaW5jbHVkZWQgZm9sbG93Lg0KDQpWYXJpYWJsZSB8IERlc2NyaXB0aW9uDQotLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KQ291bnRyeSAgfCBuYW1lIG9mIHRoZSBjb3VudHJ5DQpMaWZlRXhwICB8IGF2ZXJhZ2UgbGlmZSBleHBlY3RhbmN5IGZvciB0aGUgY291bnRyeSBpbiB5ZWFycw0KSW5mYW50U3Vydml2YWwgfCBwcm9wb3J0aW9uIG9mIHRob3NlIHN1cnZpdmluZyB0byBvbmUgeWVhciBvciBtb3JlDQpVbmRlcjVTdXJ2aXZhbCB8IHByb3BvcnRpb24gb2YgdGhvc2Ugc3Vydml2aW5nIHRvIGZpdmUgeWVhcnMgb3IgbW9yZQ0KVEJGcmVlIHwgIHByb3BvcnRpb24gb2YgdGhlIHBvcHVsYXRpb24gd2l0aG91dCBUQi4NClByb3BNRCB8IHByb3BvcnRpb24gb2YgdGhlIHBvcHVsYXRpb24gd2hvIGFyZSBNRHMNClByb3BSTiB8IHByb3BvcnRpb24gb2YgdGhlIHBvcHVsYXRpb24gd2hvIGFyZSBSTnMNClBlcnNFeHB8IG1lYW4gcGVyc29uYWwgZXhwZW5kaXR1cmVzIG9uIGhlYWx0aGNhcmUgaW4gVVMgZG9sbGFycyBhdCBhdmVyYWdlIGV4Y2hhbmdlIHJhdGUNCkdvdnRFeHB8IG1lYW4gZ292ZXJubWVudCBleHBlbmRpdHVyZXMgcGVyIGNhcGl0YSBvbiBoZWFsdGhjYXJlLCBVUyBkb2xsYXJzIGF0IGF2ZXJhZ2UgZXhjaGFuZ2UgcmF0ZQ0KVG90RXhwIHwgc3VtIG9mIHBlcnNvbmFsIGFuZCBnb3Zlcm5tZW50IGV4cGVuZGl0dXJlcy4NCg0KPGJyPg0KDQojIyBFeGVyY2lzZSAxDQoNClByb3ZpZGUgYSBzY2F0dGVycGxvdCBvZiAqKkxpZmVFeHAgfiBUb3RFeHAqKiwgYW5kIHJ1biBzaW1wbGUgbGluZWFyIHJlZ3Jlc3Npb24uIERvIG5vdCB0cmFuc2Zvcm0gdGhlIHZhcmlhYmxlcy4gUHJvdmlkZSBhbmQgaW50ZXJwcmV0IHRoZSBGIHN0YXRpc3RpY3MsICRSXjIkLCBzdGFuZGFyZCBlcnJvciwgYW5kIHAtdmFsdWVzIG9ubHkuIERpc2N1c3Mgd2hldGhlciB0aGUgYXNzdW1wdGlvbnMgb2Ygc2ltcGxlIGxpbmVhciByZWdyZXNzaW9uIG1ldC4NCg0KIyMjIEdlbmVyYXRlIGEgc2NhdHRlciBwbG90DQoNCmBgYHtyfQ0KcGxvdCh4ID0gY291bnRyeV9zdGF0cyRUb3RFeHAsIHkgPSBjb3VudHJ5X3N0YXRzJExpZmVFeHApDQpgYGANClRoZSBwbG90IGFib3ZlIGRvZXMgbm90IHJlc2VtYmxlIGEgcm91Z2hseSBsaW5lYXIgY29ycmVsYXRpb24gYmV0d2VlbiBUb3RFeHAgYW5kIExpZmVFeHAuDQoNClRoaXMgZmlndXJlIHNob3dzIHRoYXQgdGhlIGxpZmUgZXhwZW50YW5jeSB0ZW5kcyB0byBmbHVjdHVhdGUgKGxhcmdlIHNwcmVhZCkgYmV0d2VlbiA0MCBhbmQgNzUgZm9yIHZhbHVlcyBvZiBUb3RhbCBFeHBlbnNlIHVuZGVyIDcwLDAwMC4gSG93ZXZlciwgVGhlIGxpZmUgZXhwZWN0YW5jeSB0ZW5kcyB0byByZW1haW4gYWJvdmUgNzUgZm9yIFRvdGFsIEV4cGVuc2UgdmFsdWVzIGFib3ZlIDcwLDAwMC4gDQoNCg0KYGBge3IgaW5jbHVkZT1GQUxTRSwgcmVuZGVyPUZBTFNFfQ0KI2FibGluZShleDFfbG0pDQpgYGANCg0KDQojIyMgRml0IGEgc2ltcGxlIGxpbmVhciByZWdyZXNzaW9uIG1vZGVsDQoNCmBgYHtyfQ0KZXgxX2xtIDwtIGxtKGZvcm11bGEgPSBMaWZlRXhwIH4gVG90RXhwLCBkYXRhID0gY291bnRyeV9zdGF0cykNCmV4MV9sbV9zdW1tYXJ5IDwtIHN1bW1hcnkoZXgxX2xtKQ0KDQojWzFdICJjYWxsIiAgICAgICAgICAidGVybXMiICAgICAgICAgInJlc2lkdWFscyIgICAgICJjb2VmZmljaWVudHMiICAiYWxpYXNlZCIgICAgICAgInNpZ21hIiAgICAgDQojWzddICJkZiIgICAgICAgICAgICAici5zcXVhcmVkIiAgICAgImFkai5yLnNxdWFyZWQiICJmc3RhdGlzdGljIiAgICAiY292LnVuc2NhbGVkIiANCg0KZXgxX2ZzdGF0ICAgICAgIDwtIGV4MV9sbV9zdW1tYXJ5JGZzdGF0aXN0aWMNCmV4MV9yc3F1YXJlZCAgICA8LSBleDFfbG1fc3VtbWFyeSRyLnNxdWFyZWQNCmV4MV9yZXNfc3RkX2VyciA8LSBleDFfbG1fc3VtbWFyeSRzaWdtYQ0KZXgxX3BWYWwgICAgICAgIDwtIGFub3ZhKGV4MV9sbSkkJ1ByKD5GKSdbMV0NCg0KYGBgDQoNCiMjIyBTaG93IG1vZGVsJ3MgcXVhbGl0eSBtZWFzdXJlbWVudCBzdGF0aXN0aWNzDQoNCkl0ZW0gICAgICAgICAgICAgICAgICAgIHwgVmFsdWUNCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KRi1TdGF0aXN0aWMgICAgICAgICAgICAgfCBgciBleDFfZnN0YXRgDQpNdWx0aXBsZSBSLXNxdWFyZWQgICAgICB8IGByIGV4MV9yc3F1YXJlZGANClJlc2lkdWFsIHN0YW5kYXJkIGVycm9yIHwgYHIgZXgxX3Jlc19zdGRfZXJyYA0KcC12YWx1ZSAgICAgICAgICAgICAgICAgfCBgciBleDFfcFZhbGANCg0KDQpgYGB7ciBpbmNsdWRlPUZBTFNFLCByZW5kZXI9RkFMU0V9DQojZ2xhbmNlKGV4MV9sbSkNCmBgYA0KDQojIyMgRXZhbHVhdGUgbW9kZWwncyBxdWFsaXR5IG1lYXN1cmVtZW50IHN0YXRpc3RpY3MNCg0KDQojIyMjIEV2YWx1YXRlIEYtU3RhdGlzdGljDQoNClRoZSBGLXN0YXRpc3RpYyB2YWx1ZSBjb21wYXJlcyB0aGUgY3VycmVudCBtb2RlbCB0byBhIG1vZGVsIHRoYXQgaGFzIG9uZSBmZXdlciBwYXJhbWV0ZXJzLiBCZWNhdXNlIHRoZSBvbmUtZmFjdG9yIG1vZGVsIGFscmVhZHkgaGFzIG9ubHkgYSBzaW5nbGUgcGFyYW1ldGVyLCB0aGlzIHRlc3QgaXMgbm90IHBhcnRpY3VsYXJseSB1c2VmdWwgaW4gdGhpcyBjYXNlLg0KPGJyPg0KDQojIyMjIEV2YWx1YXRlIE11bHRpcGxlIFItc3F1YXJlZA0KDQpUaGUgTXVsdGlwbGUgUi1zcXVhcmVkIHZhbHVlIGlzIGEgbnVtYmVyIGJldHdlZW4gMCBhbmQgMS4gSXQgaXMgYSBzdGF0aXN0aWNhbCBtZWFzdXJlIG9mIGhvdyB3ZWxsIHRoZSBtb2RlbCBkZXNjcmliZXMgdGhlIG1lYXN1cmVkIGRhdGEuIFRoZSByZXBvcnRlZCAkUl4yJCBvZiAqKmByIGV4MV9yc3F1YXJlZGAqKiBmb3IgdGhpcyBtb2RlbCBtZWFucyB0aGF0IHRoZSBtb2RlbCBleHBsYWlucyAqKmByIHJvdW5kKGV4MV9yc3F1YXJlZCAqIDEwMCwgMilgKiogcGVyY2VudCBvZiB0aGUgZGF0YeKAmXMgdmFyaWF0aW9uLg0KPGJyPg0KDQoNCiMjIyMgRXZhbHVhdGUgUmVzaWR1YWwgc3RhbmRhcmQgZXJyb3INCg0KSW4gYSBnb29kIGxpbmVhciBtb2RlbCB0aGUsIGlmIHRoZSByZXNpZHVhbHMgYXJlIGRpc3RyaWJ1dGVkIG5vcm1hbGx5LCB0aGUgZmlyc3QgYW5kIHRoaXJkIHF1YW50aWxlcyBvZiB0aGUgcHJldmlvdXMgcmVzaWR1YWxzIHNob3VsZCBiZSBhYm91dCAxLjUgdGltZXMgdGhpcyBzdGFuZGFyZCBlcnJvci4NCg0KU2hvdyB0aGUgUTEgYW5kIFEzIGZvciB0aGUgbW9kZWwncyByZXNpZHVhbHMNCg0KYGBge3J9DQpzdW1tYXJ5KGV4MV9sbV9zdW1tYXJ5JHJlc2lkdWFscykNCmBgYA0KDQoNCkZyb20gdGhlIHN1bW1hcnkgYWJvdmUgd2Ugc2VlIHRoYXQsDQoNCi0gKipRMSoqIG9mICoqYHIgcm91bmQocXVhbnRpbGUoZXgxX2xtX3N1bW1hcnkkcmVzaWR1YWxzLCAuMjUpLCAzKWAqKiBpcyBvbmx5ICoqYHIgcm91bmQocXVhbnRpbGUoZXgxX2xtX3N1bW1hcnkkcmVzaWR1YWxzLCAuMjUpIC8gZXgxX3Jlc19zdGRfZXJyLCAyKWAqKiB0aW1lcyBvZiB0aGUgKipSZXNpZHVhbCBzdGFuZGFyZCBlcnJvcioqIChgciByb3VuZChleDFfcmVzX3N0ZF9lcnIsIDMpYCkuDQoNCi0gKipRMyoqIG9mICoqYHIgcm91bmQocXVhbnRpbGUoZXgxX2xtX3N1bW1hcnkkcmVzaWR1YWxzLCAuNzUpLCAzKWAqKiBpcyBvbmx5ICoqYHIgcm91bmQocXVhbnRpbGUoZXgxX2xtX3N1bW1hcnkkcmVzaWR1YWxzLCAuNzUpIC8gZXgxX3Jlc19zdGRfZXJyLCAyKWAqKiB0aW1lcyBvZiB0aGUgKipSZXNpZHVhbCBzdGFuZGFyZCBlcnJvcioqIChgciByb3VuZChleDFfcmVzX3N0ZF9lcnIsIDMpYCkuDQoNClRoZXJlZm9yZSwgdGhlIHJlc2lkdWFscyBkbyBub3Qgc2VlbSB0byBiZSBkaXN0cmlidXRlZCBub3JtYWxseS4NCjxicj4NCg0KIyMjIyBFdmFsdWF0ZSBwLXZhbHVlDQoNClRoZSBQcig+fHR8KSBzaG93cyB0aGUgcHJvYmFiaWxpdHkgdGhhdCB0aGUgY29ycmVzcG9uZGluZyBjb2VmZmljaWVudCBpcyBub3QgcmVsZXZhbnQgaW4gdGhlIG1vZGVsLiBUaGlzIHZhbHVlIGlzIGFsc28ga25vd24gYXMgdGhlIHNpZ25pZmljYW5jZSBvciBwLXZhbHVlIG9mIHRoZSBjb2VmZmljaWVudC4NCg0KSW4gdGhpcyBtb2RlbCwgDQoNCi0gdGhlIHByb2JhYmlsaXR5IHRoYXQgKioiVG90RXhwIioqIGlzIG5vdCByZWxldmFudCBpbiB0aGlzIG1vZGVsIGlzICoqJGByIGV4MV9wVmFsYCQqKiAtIGEgdGlueSB2YWx1ZSBsZXNzIHRoYW4gMC4wNS4gVGhpcyBtZWFucyB0aGF0ICoqIlRvdEV4cCIqKiAoc3VtIG9mIHBlcnNvbmFsIGFuZCBnb3Zlcm5tZW50IGV4cGVuZGl0dXJlcykgaXMgcmVsZXZhbnQgaW4gdGhlIG1vZGVsLg0KLSB0aGUgcHJvYmFiaWxpdHkgdGhhdCB0aGUgKippbnRlcmNlcHQqKiBpcyBub3QgcmVsZXZhbnQgaW4gdGhpcyBtb2RlbCBpcyAqKiRgciBleDFfbG1fc3VtbWFyeSRjb2VmZmljaWVudHNbMSw0XWAkKiogLSBhIHRpbnkgdmFsdWUgZmFyIGxlc3MgdGhhbiAwLjA1LiBUaGlzIG1lYW5zIHRoYXQgdGhlIGludGVyY2VwdCBpcyByZWxldmFudCBpbiB0aGUgbW9kZWwuDQoNCg0KPGJyPg0KDQoNCg0KDQoNCiMjIEV4ZXJjaXNlIDINCg0KUmFpc2UgbGlmZSBleHBlY3RhbmN5IHRvIHRoZSA0LjYgcG93ZXIgKGkuZS4sICRMaWZlRXhwXns0LjZ9JCkuIFJhaXNlIHRvdGFsIGV4cGVuZGl0dXJlcyB0byB0aGUgMC4wNiBwb3dlciAobmVhcmx5IGEgbG9nIHRyYW5zZm9ybSwgJFRvdEV4cF57LjA2fSQpLiBQbG90ICRMaWZlRXhwXns0LjZ9JCBhcyBhIGZ1bmN0aW9uIG9mICRUb3RFeHBeey4wNn0kLCBhbmQgciByZS1ydW4gdGhlIHNpbXBsZSByZWdyZXNzaW9uIG1vZGVsIHVzaW5nIHRoZSB0cmFuc2Zvcm1lZCB2YXJpYWJsZXMuIFByb3ZpZGUgYW5kIGludGVycHJldCB0aGUgRiBzdGF0aXN0aWNzLCAkUl4yJCwgc3RhbmRhcmQgZXJyb3IsIGFuZCBwLXZhbHVlcy4gV2hpY2ggbW9kZWwgaXMgImJldHRlcj8iDQoNCjxicj4NCg0KIyMjIEdlbmVyYXRlIGEgc2NhdHRlciBwbG90DQoNCmBgYHtyfQ0KcGxvdCh4ID0gSShjb3VudHJ5X3N0YXRzJFRvdEV4cCBeIDAuMDYpLCB5ID0gSShjb3VudHJ5X3N0YXRzJExpZmVFeHAgXiA0LjYpKQ0KYGBgDQoNClRoZSBwbG90IGFib3ZlIGRvZXMgcmVzZW1ibGUgYSByb3VnaGx5IHBvc2l0aXZlIGxpbmVhciBjb3JyZWxhdGlvbiBiZXR3ZWVuIFRvdEV4cCBhbmQgTGlmZUV4cC4gVGhlIGxpZmUgZXhwZW50YW5jeSB0ZW5kcyB0byBpbmNyZWFzZSBhcyB0aGUgdmFsdWVzIG9mIFRvdGFsIEV4cGVuc2UgaW5jcmVhc2UuIA0KDQoNCg0KYGBge3IgaW5jbHVkZT1GQUxTRSwgcmVuZGVyPUZBTFNFfQ0KI2FibGluZShleDFfbG0pDQpgYGANCg0KDQojIyMgRml0IGEgc2ltcGxlIGxpbmVhciByZWdyZXNzaW9uIG1vZGVsDQoNCmBgYHtyfQ0KZXgyX2xtIDwtIGxtKGZvcm11bGEgPSBJKExpZmVFeHAgXiA0LjYpIH4gSShUb3RFeHAgXiAwLjA2KSwgZGF0YSA9IGNvdW50cnlfc3RhdHMpDQpleDJfbG1fc3VtbWFyeSA8LSBzdW1tYXJ5KGV4Ml9sbSkNCg0KI1sxXSAiY2FsbCIgICAgICAgICAgInRlcm1zIiAgICAgICAgICJyZXNpZHVhbHMiICAgICAiY29lZmZpY2llbnRzIiAgImFsaWFzZWQiICAgICAgICJzaWdtYSIgICAgIA0KI1s3XSAiZGYiICAgICAgICAgICAgInIuc3F1YXJlZCIgICAgICJhZGouci5zcXVhcmVkIiAiZnN0YXRpc3RpYyIgICAgImNvdi51bnNjYWxlZCIgDQoNCmV4Ml9mc3RhdCAgICAgICA8LSBleDJfbG1fc3VtbWFyeSRmc3RhdGlzdGljDQpleDJfcnNxdWFyZWQgICAgPC0gZXgyX2xtX3N1bW1hcnkkci5zcXVhcmVkDQpleDJfcmVzX3N0ZF9lcnIgPC0gZXgyX2xtX3N1bW1hcnkkc2lnbWENCmV4Ml9wVmFsICAgICAgICA8LSBhbm92YShleDJfbG0pJCdQcig+RiknWzFdDQoNCmBgYA0KDQojIyMgU2hvdyBtb2RlbCdzIHF1YWxpdHkgbWVhc3VyZW1lbnQgc3RhdGlzdGljcw0KDQpJdGVtICAgICAgICAgICAgICAgICAgICB8IFZhbHVlDQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCkYtU3RhdGlzdGljICAgICAgICAgICAgIHwgYHIgZXgyX2ZzdGF0YA0KTXVsdGlwbGUgUi1zcXVhcmVkICAgICAgfCBgciBleDJfcnNxdWFyZWRgDQpSZXNpZHVhbCBzdGFuZGFyZCBlcnJvciB8IGByIGV4Ml9yZXNfc3RkX2VycmANCnAtdmFsdWUgICAgICAgICAgICAgICAgIHwgYHIgZXgyX3BWYWxgDQoNCg0KYGBge3IgaW5jbHVkZT1GQUxTRSwgcmVuZGVyPUZBTFNFfQ0KI2dsYW5jZShleDJfbG0pDQpgYGANCg0KIyMjIEV2YWx1YXRlIG1vZGVsJ3MgcXVhbGl0eSBtZWFzdXJlbWVudCBzdGF0aXN0aWNzDQoNCg0KIyMjIyBFdmFsdWF0ZSBGLVN0YXRpc3RpYw0KDQpUaGUgRi1zdGF0aXN0aWMgdmFsdWUgY29tcGFyZXMgdGhlIGN1cnJlbnQgbW9kZWwgdG8gYSBtb2RlbCB0aGF0IGhhcyBvbmUgZmV3ZXIgcGFyYW1ldGVycy4gQmVjYXVzZSB0aGUgb25lLWZhY3RvciBtb2RlbCBhbHJlYWR5IGhhcyBvbmx5IGEgc2luZ2xlIHBhcmFtZXRlciwgdGhpcyB0ZXN0IGlzIG5vdCBwYXJ0aWN1bGFybHkgdXNlZnVsIGluIHRoaXMgY2FzZS4NCjxicj4NCg0KIyMjIyBFdmFsdWF0ZSBNdWx0aXBsZSBSLXNxdWFyZWQNCg0KVGhlIE11bHRpcGxlIFItc3F1YXJlZCB2YWx1ZSBpcyBhIG51bWJlciBiZXR3ZWVuIDAgYW5kIDEuIEl0IGlzIGEgc3RhdGlzdGljYWwgbWVhc3VyZSBvZiBob3cgd2VsbCB0aGUgbW9kZWwgZGVzY3JpYmVzIHRoZSBtZWFzdXJlZCBkYXRhLiBUaGUgcmVwb3J0ZWQgJFJeMiQgb2YgKipgciBleDJfcnNxdWFyZWRgKiogZm9yIHRoaXMgbW9kZWwgbWVhbnMgdGhhdCB0aGUgbW9kZWwgZXhwbGFpbnMgKipgciByb3VuZChleDJfcnNxdWFyZWQgKiAxMDAsIDIpYCoqIHBlcmNlbnQgb2YgdGhlIGRhdGHigJlzIHZhcmlhdGlvbi4gVGhpcyBpcyBhIGJpZyBpbXByb3ZlbWVudCBvdmVyIHRoZSAqKmByIHJvdW5kKGV4MV9yc3F1YXJlZCAqIDEwMCwgMilgKiogcGVyY2VudCByZXBvcnRlZCBpbiBFeGVyY2lzZSAxLg0KDQo8YnI+DQoNCg0KIyMjIyBFdmFsdWF0ZSBSZXNpZHVhbCBzdGFuZGFyZCBlcnJvcg0KDQpJbiBhIGdvb2QgbGluZWFyIG1vZGVsIHRoZSwgaWYgdGhlIHJlc2lkdWFscyBhcmUgZGlzdHJpYnV0ZWQgbm9ybWFsbHksIHRoZSBmaXJzdCBhbmQgdGhpcmQgcXVhbnRpbGVzIG9mIHRoZSBwcmV2aW91cyByZXNpZHVhbHMgc2hvdWxkIGJlIGFib3V0IDEuNSB0aW1lcyB0aGlzIHN0YW5kYXJkIGVycm9yLg0KDQpTaG93IHRoZSBRMSBhbmQgUTMgZm9yIHRoZSBtb2RlbCdzIHJlc2lkdWFscw0KDQpgYGB7cn0NCnN1bW1hcnkoZXgyX2xtX3N1bW1hcnkkcmVzaWR1YWxzKQ0KYGBgDQoNCg0KRnJvbSB0aGUgc3VtbWFyeSBhYm92ZSB3ZSBzZWUgdGhhdCwNCg0KLSAqKlExKiogb2YgKipgciByb3VuZChxdWFudGlsZShleDJfbG1fc3VtbWFyeSRyZXNpZHVhbHMsIC4yNSksIDMpYCoqIGlzIG9ubHkgKipgciByb3VuZChxdWFudGlsZShleDJfbG1fc3VtbWFyeSRyZXNpZHVhbHMsIC4yNSkgLyBleDJfcmVzX3N0ZF9lcnIsIDIpYCoqIHRpbWVzIG9mIHRoZSAqKlJlc2lkdWFsIHN0YW5kYXJkIGVycm9yKiogKGByIHJvdW5kKGV4Ml9yZXNfc3RkX2VyciwgMylgKS4NCg0KLSAqKlEzKiogb2YgKipgciByb3VuZChxdWFudGlsZShleDJfbG1fc3VtbWFyeSRyZXNpZHVhbHMsIC43NSksIDMpYCoqIGlzIG9ubHkgKipgciByb3VuZChxdWFudGlsZShleDJfbG1fc3VtbWFyeSRyZXNpZHVhbHMsIC43NSkgLyBleDJfcmVzX3N0ZF9lcnIsIDIpYCoqIHRpbWVzIG9mIHRoZSAqKlJlc2lkdWFsIHN0YW5kYXJkIGVycm9yKiogKGByIHJvdW5kKGV4Ml9yZXNfc3RkX2VyciwgMylgKS4NCg0KVGhlcmVmb3JlLCB0aGUgcmVzaWR1YWxzIGRvIG5vdCBzZWVtIHRvIGJlIGRpc3RyaWJ1dGVkIG5vcm1hbGx5Lg0KPGJyPg0KDQojIyMjIEV2YWx1YXRlIHAtdmFsdWUNCg0KVGhlIFByKD58dHwpIHNob3dzIHRoZSBwcm9iYWJpbGl0eSB0aGF0IHRoZSBjb3JyZXNwb25kaW5nIGNvZWZmaWNpZW50IGlzIG5vdCByZWxldmFudCBpbiB0aGUgbW9kZWwuIFRoaXMgdmFsdWUgaXMgYWxzbyBrbm93biBhcyB0aGUgc2lnbmlmaWNhbmNlIG9yIHAtdmFsdWUgb2YgdGhlIGNvZWZmaWNpZW50Lg0KDQpJbiB0aGlzIG1vZGVsLCANCg0KLSB0aGUgcHJvYmFiaWxpdHkgdGhhdCAqKiRUb3RFeHAgXiB7MC4wNn0kKiogaXMgbm90IHJlbGV2YW50IGluIHRoaXMgbW9kZWwgaXMgKiokYHIgZXgyX3BWYWxgJCoqIC0gYSB0aW55IHZhbHVlIGxlc3MgdGhhbiAwLjA1LiBUaGlzIG1lYW5zIHRoYXQgKiokVG90RXhwIF4gezAuMDZ9JCoqIChzdW0gb2YgcGVyc29uYWwgYW5kIGdvdmVybm1lbnQgZXhwZW5kaXR1cmVzKSBpcyByZWxldmFudCBpbiB0aGUgbW9kZWwuDQotIHRoZSBwcm9iYWJpbGl0eSB0aGF0IHRoZSAqKmludGVyY2VwdCoqIGlzIG5vdCByZWxldmFudCBpbiB0aGlzIG1vZGVsIGlzICoqJGByIGV4Ml9sbV9zdW1tYXJ5JGNvZWZmaWNpZW50c1sxLDRdYCQqKiAtIGEgdGlueSB2YWx1ZSBmYXIgbGVzcyB0aGFuIDAuMDUuIFRoaXMgbWVhbnMgdGhhdCB0aGUgaW50ZXJjZXB0IGlzIHJlbGV2YW50IGluIHRoZSBtb2RlbC4NCg0KDQoNCg0KDQoNCg0KIyMgRXhlcmNpc2UgMw0KDQpVc2luZyB0aGUgcmVzdWx0cyBmcm9tIEV4ZXJjaXNlIDIsIGZvcmVjYXN0IGxpZmUgZXhwZWN0YW5jeSB3aGVuICRUb3RFeHBeey4wNn0gPSAxLjUkLiBUaGVuIGZvcmVjYXN0IGxpZmUgZXhwZWN0YW5jeSB3aGVuICRUb3RFeHB7Xi4wNn0gPSAyLjUkLg0KDQoNCkZyb20gZXhlcmNpc2UgMiwgdGhlIHktaW50ZXJjZXB0IGlzICRhXzAgPSAtNzM2NTI3OTEwJCBhbmQgdGhlIHNsb3BlIGlzICRhXzEgPSA2MjAwNjAyMTYkLiBUaHVzLCB0aGUgZmluYWwgcmVncmVzc2lvbiBtb2RlbCBpczoNCg0KJExpZmVFeHBeezQuNn0gPSAtNzM2NTI3OTEwICsgNjIwMDYwMjE2ICogVG90RXhwXnswLjA2fSQNCg0KVXNpbmcgdGhlIGFib3ZlIGVxdWF0aW9uIHdlIGNhbiBjYWxjdWxhdGUgbGlmZSBleHBlY3RhbmN5IGFzOg0KDQotIElmICRUb3RFeHBeey4wNn0gPSAxLjUkLCB0aGVuICRMaWZlRXhwXns0LjZ9ID0gLTczNjUyNzkxMCArIDYyMDA2MDIxNiAqIDEuNSA9IGByIC03MzY1Mjc5MTAgKyA2MjAwNjAyMTYgKiAxLjVgJA0KDQotIElmICRUb3RFeHBeey4wNn0gPSAyLjUkLCB0aGVuICRMaWZlRXhwXns0LjZ9ID0gLTczNjUyNzkxMCArIDYyMDA2MDIxNiAqIDIuNSA9IGByIC03MzY1Mjc5MTAgKyA2MjAwNjAyMTYgKiAyLjVgJA0KDQoNCjxicj4NCg0KDQoNCg0KDQojIyBFeGVyY2lzZSA0DQoNCkJ1aWxkIHRoZSBmb2xsb3dpbmcgbXVsdGlwbGUgcmVncmVzc2lvbiBtb2RlbCBhbmQgaW50ZXJwcmV0IHRoZSBGIFN0YXRpc3RpY3MsICRSXjIkLCBzdGFuZGFyZCBlcnJvciwgYW5kIHAtdmFsdWVzLiBIb3cgZ29vZCBpcyB0aGUgbW9kZWw/DQoNCiRMaWZlRXhwID0gYjAgKyBiMSAqICBQcm9wTWQgKyBiMiAqIFRvdEV4cCArIGIzICogUHJvcE1EICogVG90RXhwJA0KDQoNCg0KIyMjIEZpdCBhIHNpbXBsZSBsaW5lYXIgcmVncmVzc2lvbiBtb2RlbA0KDQpgYGB7cn0NCmV4NF9sbSA8LSBsbShmb3JtdWxhID0gTGlmZUV4cCB+IFByb3BNRCArIFRvdEV4cCArIEkoUHJvcE1EICogVG90RXhwKSwgZGF0YSA9IGNvdW50cnlfc3RhdHMpDQpleDRfbG1fc3VtbWFyeSA8LSBzdW1tYXJ5KGV4NF9sbSkNCg0KI1sxXSAiY2FsbCIgICAgICAgICAgInRlcm1zIiAgICAgICAgICJyZXNpZHVhbHMiICAgICAiY29lZmZpY2llbnRzIiAgImFsaWFzZWQiICAgICAgICJzaWdtYSIgICAgIA0KI1s3XSAiZGYiICAgICAgICAgICAgInIuc3F1YXJlZCIgICAgICJhZGouci5zcXVhcmVkIiAiZnN0YXRpc3RpYyIgICAgImNvdi51bnNjYWxlZCIgDQoNCmV4NF9mc3RhdCAgICAgICA8LSBleDRfbG1fc3VtbWFyeSRmc3RhdGlzdGljDQpleDRfcnNxdWFyZWQgICAgPC0gZXg0X2xtX3N1bW1hcnkkci5zcXVhcmVkDQpleDRfcmVzX3N0ZF9lcnIgPC0gZXg0X2xtX3N1bW1hcnkkc2lnbWENCmV4NF9wVmFsICAgICAgICA8LSBhbm92YShleDRfbG0pJCdQcig+RiknWzFdDQoNCmBgYA0KDQojIyMgU2hvdyBtb2RlbCdzIHF1YWxpdHkgbWVhc3VyZW1lbnQgc3RhdGlzdGljcw0KDQpJdGVtICAgICAgICAgICAgICAgICAgICB8IFZhbHVlDQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCkYtU3RhdGlzdGljICAgICAgICAgICAgIHwgYHIgZXg0X2ZzdGF0YA0KTXVsdGlwbGUgUi1zcXVhcmVkICAgICAgfCBgciBleDRfcnNxdWFyZWRgDQpSZXNpZHVhbCBzdGFuZGFyZCBlcnJvciB8IGByIGV4NF9yZXNfc3RkX2VycmANCnAtdmFsdWUgICAgICAgICAgICAgICAgIHwgYHIgZXg0X3BWYWxgDQoNCg0KYGBge3IgaW5jbHVkZT1GQUxTRSwgcmVuZGVyPUZBTFNFfQ0KI2dsYW5jZShleDRfbG0pDQpgYGANCg0KIyMjIEV2YWx1YXRlIG1vZGVsJ3MgcXVhbGl0eSBtZWFzdXJlbWVudCBzdGF0aXN0aWNzDQoNCg0KIyMjIyBFdmFsdWF0ZSBGLVN0YXRpc3RpYw0KDQpUaGUgRi1zdGF0aXN0aWMgdmFsdWUgY29tcGFyZXMgdGhlIGN1cnJlbnQgbW9kZWwgdG8gYSBtb2RlbCB0aGF0IGhhcyBvbmUgZmV3ZXIgcGFyYW1ldGVycy4gQmVjYXVzZSB0aGUgb25lLWZhY3RvciBtb2RlbCBhbHJlYWR5IGhhcyBvbmx5IGEgc2luZ2xlIHBhcmFtZXRlciwgdGhpcyB0ZXN0IGlzIG5vdCBwYXJ0aWN1bGFybHkgdXNlZnVsIGluIHRoaXMgY2FzZS4NCjxicj4NCg0KIyMjIyBFdmFsdWF0ZSBNdWx0aXBsZSBSLXNxdWFyZWQNCg0KVGhlIE11bHRpcGxlIFItc3F1YXJlZCB2YWx1ZSBpcyBhIG51bWJlciBiZXR3ZWVuIDAgYW5kIDEuIEl0IGlzIGEgc3RhdGlzdGljYWwgbWVhc3VyZSBvZiBob3cgd2VsbCB0aGUgbW9kZWwgZGVzY3JpYmVzIHRoZSBtZWFzdXJlZCBkYXRhLiBUaGUgcmVwb3J0ZWQgJFJeMiQgb2YgKipgciBleDRfcnNxdWFyZWRgKiogZm9yIHRoaXMgbW9kZWwgbWVhbnMgdGhhdCB0aGUgbW9kZWwgZXhwbGFpbnMgKipgciByb3VuZChleDRfcnNxdWFyZWQgKiAxMDAsIDIpYCoqIHBlcmNlbnQgb2YgdGhlIGRhdGHigJlzIHZhcmlhdGlvbi4NCjxicj4NCg0KDQojIyMjIEV2YWx1YXRlIFJlc2lkdWFsIHN0YW5kYXJkIGVycm9yDQoNCkluIGEgZ29vZCBsaW5lYXIgbW9kZWwgdGhlLCBpZiB0aGUgcmVzaWR1YWxzIGFyZSBkaXN0cmlidXRlZCBub3JtYWxseSwgdGhlIGZpcnN0IGFuZCB0aGlyZCBxdWFudGlsZXMgb2YgdGhlIHByZXZpb3VzIHJlc2lkdWFscyBzaG91bGQgYmUgYWJvdXQgMS41IHRpbWVzIHRoaXMgc3RhbmRhcmQgZXJyb3IuDQoNClNob3cgdGhlIFExIGFuZCBRMyBmb3IgdGhlIG1vZGVsJ3MgcmVzaWR1YWxzDQoNCmBgYHtyfQ0Kc3VtbWFyeShleDRfbG1fc3VtbWFyeSRyZXNpZHVhbHMpDQpgYGANCg0KDQpGcm9tIHRoZSBzdW1tYXJ5IGFib3ZlIHdlIHNlZSB0aGF0LA0KDQotICoqUTEqKiBvZiAqKmByIHJvdW5kKHF1YW50aWxlKGV4NF9sbV9zdW1tYXJ5JHJlc2lkdWFscywgLjI1KSwgMylgKiogaXMgb25seSAqKmByIHJvdW5kKHF1YW50aWxlKGV4NF9sbV9zdW1tYXJ5JHJlc2lkdWFscywgLjI1KSAvIGV4NF9yZXNfc3RkX2VyciwgMilgKiogdGltZXMgb2YgdGhlICoqUmVzaWR1YWwgc3RhbmRhcmQgZXJyb3IqKiAoYHIgcm91bmQoZXg0X3Jlc19zdGRfZXJyLCAzKWApLg0KDQotICoqUTMqKiBvZiAqKmByIHJvdW5kKHF1YW50aWxlKGV4NF9sbV9zdW1tYXJ5JHJlc2lkdWFscywgLjc1KSwgMylgKiogaXMgb25seSAqKmByIHJvdW5kKHF1YW50aWxlKGV4NF9sbV9zdW1tYXJ5JHJlc2lkdWFscywgLjc1KSAvIGV4NF9yZXNfc3RkX2VyciwgMilgKiogdGltZXMgb2YgdGhlICoqUmVzaWR1YWwgc3RhbmRhcmQgZXJyb3IqKiAoYHIgcm91bmQoZXg0X3Jlc19zdGRfZXJyLCAzKWApLg0KDQpUaGVyZWZvcmUsIHRoZSByZXNpZHVhbHMgZG8gbm90IHNlZW0gdG8gYmUgZGlzdHJpYnV0ZWQgbm9ybWFsbHkuDQo8YnI+DQoNCiMjIyMgRXZhbHVhdGUgcC12YWx1ZQ0KDQpUaGUgUHIoPnx0fCkgc2hvd3MgdGhlIHByb2JhYmlsaXR5IHRoYXQgdGhlIGNvcnJlc3BvbmRpbmcgY29lZmZpY2llbnQgaXMgbm90IHJlbGV2YW50IGluIHRoZSBtb2RlbC4gVGhpcyB2YWx1ZSBpcyBhbHNvIGtub3duIGFzIHRoZSBzaWduaWZpY2FuY2Ugb3IgcC12YWx1ZSBvZiB0aGUgY29lZmZpY2llbnQuDQoNCkluIHRoaXMgbW9kZWwsIA0KDQotIHRoZSBwcm9iYWJpbGl0eSB0aGF0ICoqIlRvdEV4cCIqKiBpcyBub3QgcmVsZXZhbnQgaW4gdGhpcyBtb2RlbCBpcyAqKiRgciBleDRfcFZhbGAkKiogLSBhIHRpbnkgdmFsdWUgbGVzcyB0aGFuIDAuMDUuIFRoaXMgbWVhbnMgdGhhdCAqKiJUb3RFeHAiKiogKHN1bSBvZiBwZXJzb25hbCBhbmQgZ292ZXJubWVudCBleHBlbmRpdHVyZXMpIGlzIHJlbGV2YW50IGluIHRoZSBtb2RlbC4NCi0gdGhlIHByb2JhYmlsaXR5IHRoYXQgdGhlICoqaW50ZXJjZXB0KiogaXMgbm90IHJlbGV2YW50IGluIHRoaXMgbW9kZWwgaXMgKiokYHIgZXg0X2xtX3N1bW1hcnkkY29lZmZpY2llbnRzWzEsNF1gJCoqIC0gYSB0aW55IHZhbHVlIGZhciBsZXNzIHRoYW4gMC4wNS4gVGhpcyBtZWFucyB0aGF0IHRoZSBpbnRlcmNlcHQgaXMgcmVsZXZhbnQgaW4gdGhlIG1vZGVsLg0KDQoNCjxicj4NCg0KDQoNCg0KDQojIyBFeGVyY2lzZSA1DQoNCkZvcmVjYXN0IExpZmVFeHAgd2hlbiAkUHJvcE1EID0gLjAzJCBhbmQgJFRvdEV4cCA9IDE0JC4gRG9lcyB0aGlzIGZvcmVjYXN0IHNlZW0gcmVhbGlzdGljPyBXaHkgb3Igd2h5IG5vdD8NCg0KQmFzZWQgb24gdGhlIHJlc3VsdHMgZnJvbSBFeGVyY2lzZSA0LCB0aGUgYmVsb3cgbW9kZWwgDQoNCiRMaWZlRXhwID0gYjAgKyBiMSAqICBQcm9wTWQgKyA3LjIzM157LTV9ICogVG90RXhwICsgYjMgKiBQcm9wTUQgKiBUb3RFeHAkDQoNCmNhbiBiZSByZS13cml0dGVuIGFzDQoNCiRMaWZlRXhwID0gNjIuNzcgKyAxNDk3ICogUHJvcE1kICsgMC4wMDAwNzIzMyAqIFRvdEV4cCAtIDAuMDA2MDI2ICogUHJvcE1EICogVG90RXhwJA0KDQoNClVzaW5nIHRoZSBhYm92ZSBlcXVhdGlvbiB3ZSBjYW4gY2FsY3VsYXRlIExpZmUgRXhwZWN0YW5jeSBhczoNCg0KLSBJZiAkUHJvcE1EID0gLjAzJCBhbmQgJFRvdEV4cCA9IDE0JCwgdGhlbiAkTGlmZUV4cCA9IDYyLjc3ICsgMTQ5NyAqIC4wMyArIDAuMDAwMDcyMzMgKiAxNCAtIDAuMDA2MDI2ICogLjAzICogMTQgPSBgciByb3VuZCg2Mi43NyArIDE0OTcgKiAuMDMgKyAwLjAwMDA3MjMzICogMTQgLSAwLjAwNjAyNiAqIC4wMyAqIDE0LCAyKWAkDQoNClRoZSBsaWZlIGV4cGVjdGFuY3kgZm9yZWNhc3Qgb2YgYHIgcm91bmQoNjIuNzcgKyAxNDk3ICogLjAzICsgMC4wMDAwNzIzMyAqIDE0IC0gMC4wMDYwMjYgKiAuMDMgKiAxNCwgMilgIGRvZXMgbm90IHNlZW0gcmVhbGlzdGljIGJlY2F1c2UNCg0KLSB0aGUgYWN0dWFsIGxpZmUgZXhwZWN0YW5jZSB2YWx1ZXMgaW4gdGhlIG9yaWdpbmFsIHNvdXJjZSBkYXRhIHJhbmdlIG9ubHkgZnJvbSA0MCB0byA4My4NCi0gaWYgVG90RXhwIChzdW0gb2YgcGVyc29uYWwgYW5kIGdvdmVybm1lbnQgZXhwZW5kaXR1cmVzKSBpcyAxNCwgdGhlbiBpdCBkb2VzIG5vdCBtYWtlIHNlbnNlIHRoYXQgc3VjaCBhIHNtYWxsIGV4cGVuZGl0dXJlIGNvdWxkIGhlbHAgaW5jcmVhc2UgYSBwZXJzb24ncyBsaWZlIGV4cGVjdGFuY3kgdG8gdGhlIHBvaW50IG9mIGV4Y2VlZGluZyB0aGF0IG9mIGFsbCB0aGUgcmVzdCBvZiB0aGUgbGlmZSBleHBlY3RhbmN5IHZhbHVlcyBmb3IgdGhlIHJlcG9ydGVkIGNvdW50cmllcy4NCg0KDQo8YnI+DQoNCg0KDQo=