LOW POH SWEAN

SD23018- 02G

  1. Extract data from the following excel file: gmp.txt.
file.choose()
library(readxl)
data<- read_excel("C:\\Users\\joone\\OneDrive\\Desktop\\Y3 SMS\\gmp.xlsx")
data

library(Hmisc)

# Check for missing values
summary(data$x3)
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max.    NA's 
   81.0   171.2   243.0   217.9   258.8   366.0       2 
# Impute and convert to numeric
data$x3 <- as.numeric(impute(data$x3, mean))

# Confirm no missing values remain
summary(data$x3)
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
   81.0   173.8   231.5   217.9   256.2   366.0 
data
  1. Develop a multiple linear regression model by considering all variables.

Part A

  1. Construct a normal probability plot of the residuals. Does there seem to be any problems with the normality assumption?
# Fit the multiple linear regression model
model2 <- lm(y~., data =data)

# Model summary
summary_model2 <- summary(model2)
print(summary_model2)

Call:
lm(formula = y ~ ., data = data)

Residuals:
    Min      1Q  Median      3Q     Max 
-4.9134 -1.8769 -0.2887  1.7538  4.7129 

Coefficients:
             Estimate Std. Error t value Pr(>|t|)  
(Intercept)  9.755693  28.797397   0.339   0.7383  
x1          -0.026803   0.034760  -0.771   0.4497  
x2          -0.003633   0.056401  -0.064   0.9493  
x3           0.026598   0.029589   0.899   0.3794  
x4           1.620045   2.356393   0.688   0.4997  
x5           5.003852   2.998637   1.669   0.1108  
x6          -0.136788   1.182675  -0.116   0.9091  
x7          -2.612686   2.881391  -0.907   0.3753  
x8           0.210631   0.109101   1.931   0.0678 .
x9          -0.318245   0.303778  -1.048   0.3073  
x10         -0.006969   0.004370  -1.595   0.1265  
x11          0.617416   2.940955   0.210   0.8358  
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 3.169 on 20 degrees of freedom
Multiple R-squared:  0.8377,    Adjusted R-squared:  0.7484 
F-statistic: 9.382 on 11 and 20 DF,  p-value: 1.094e-05
residuals <- residuals(model2)
qqnorm(residuals)
qqline(residuals)

Interpret:

The points mostly follow the straight line in the middle section.

However, there is some deviation at both tails such as the extreme left and right.

There is no serious violation of the normality assumption.

The residuals are approximately normally distributed, though there is slight deviation in the tails, which suggests the presence of minor outliers or mild non-normality.

Conclusion, the Q-Q plot shows that the residuals generally lie along the straight line, indicating that the normality assumption is reasonably satisfied. Minor deviations at the tails suggest a few outliers or slight non-normality, but not enough to be a major concern.

plot(model2,which=2)  # Q-Q plot

residuals2 <- resid(model2)
hist(residuals2, main = "Histogram of Residuals", col = "skyblue")

Interpret:

The histogram is roughly bell-shaped, centered around zero.

There is some slight skewness, the right tail seems a bit longer than the left.

However, the overall pattern looks reasonably symmetric, which supports the normality assumption.

Conclusion, the histogram of residuals appears approximately symmetric and bell-shaped, with most residuals clustering around zero. This suggests that the residuals are roughly normally distributed. Although there is slight skewness in the right tail, the deviation from normality is not severe. Therefore, the normality assumption for the multiple linear regression model is reasonably satisfied.

  1. Support your answer in (i) by using appropriate normality test.
#Two-Sample K–S Test
ks.test(residuals2, "pnorm", mean(residuals2), sd(residuals2))

    Exact one-sample Kolmogorov-Smirnov test

data:  residuals2
D = 0.095955, p-value = 0.9027
alternative hypothesis: two-sided

Interpret:

\(H_{0}\): Residuals are normally distributed.

\(H_{1}\): Residuals are not normally distributed.

\(p-value=0.9027\)

Since \((p-value=0.9027)\) >\((\alpha=0.05)\), do not reject \(H_{0}\).

At \(\alpha=0.05\), normality assumption holds.

library(nortest)
#Anderson-Darling Test to test for normality
ad.test(residuals2)

    Anderson-Darling normality test

data:  residuals2
A = 0.37293, p-value = 0.3982

Interpret:

\(H_{0}\): Residuals are normally distributed.

\(H_{1}\): Residuals are not normally distributed.

\(p-value=0.3982\)

Since \((p-value=0.3982)\) >\((\alpha=0.05)\), do not reject \(H_{0}\).

At \(\alpha=0.05\), normality assumption holds.

#conduct shapirowilk Test to test for normality
shapiro.test(residuals2)

    Shapiro-Wilk normality test

data:  residuals2
W = 0.96269, p-value = 0.3249

Interpretation:

\(H_{0}\): Residuals are normally distributed.

\(H_{1}\): Residuals are not normally distributed.

\(p-value=0.3249\)

Since \((p-value=0.3249)\) >\((\alpha=0.05)\), do not reject \(H_{0}\).

At \(\alpha=0.05\), normality assumption holds.

Based on the Shapiro–Wilk, Anderson–Darling, and Kolmogorov–Smirnov tests, the p-values are greater than 0.05, indicating that the residuals are not significantly different from a normal distribution. Therefore, the normality assumption of the multiple linear regression model is supported.

  1. Construct and interpret a plot of residuals versus the predicted response.
residuals <- resid(model2)
predicted_response <- fitted(model2)
plot(predicted_response, residuals,
         xlab = "Predicted Response",
         ylab = "Residuals",
         main = "Residuals vs. Predicted Response Plot")
abline(h = 0, col = "red", lty = 2) # Add a horizontal line at 0

Interpret:

The residuals are randomly scattered around the horizontal line at zero.

There is no clear pattern or systematic curvature, meaning the linearity assumption is satisfied.

The spread which is variance of residuals appears roughly constant across predicted values, so it is no obvious funnel or cone shape.

A few points deviate slightly from zero, but there are no extreme outliers.

Conclusion, the residuals vs. predicted response plot shows that the residuals are randomly distributed around zero with no clear trend or pattern. This indicates that the assumptions of linearity and constant variance (homoscedasticity) are reasonably met. Therefore, the model appears appropriate, and there is no evidence of heteroscedasticity or non-linearity.

Part B

Then, detect any outliers occurs using Cook’s Distance method.

  1. Plot the influential observation by Cook’s Distance and comments.
#Cook distance
model2 <- lm(y ~., data =data)
cooksd<-cooks.distance(model2)
plot(cooksd, pch="*", cex=2, main="Influential Obsby Cooks distance") # plot cook's distance
abline(h = 4*mean(cooksd, na.rm=T), col="red") # add cutoffline
text(x=1:length(cooksd)+1, y=cooksd, labels=ifelse(cooksd>4*mean(cooksd, na.rm=T),names(cooksd),""), col="red") # add labels

Interpret:

The red horizontal line represents the cutoff value (4 * mean(Cook’s distance)).

Most points are below this line, meaning they are not influential.

Observations 14 and 17 are above the red line, indicating that they are potentially influential observations.

This means these two data points have a disproportionate effect on the regression coefficients and may influence the model’s fit.

Conclusion, the Cook’s Distance plot shows that most observations have small Cook’s distance values, indicating they do not have an undue influence on the regression model. However, observations 14 and 17 exceed the cutoff line (4 × mean Cook’s Distance), suggesting that they are potentially influential. These points should be further investigated to determine whether they are valid data points or outliers that may distort the regression results.

  1. Examine and list the point observation(s) which consider as outlier(s). Justify your answer.
# influential row numbers
influential <-as.numeric(names(cooksd)[(cooksd> 4*mean(cooksd, na.rm=T))])
influential 
[1] 14 17
head(data[influential,]) # influential observations.
NA

Interpret:

In these 2 row have very high weight(x10), and the type of transmission both is automatic.

Based on the Cook’s Distance analysis, observations 14 and 17 exceed the threshold value (4 × mean Cook’s Distance). These observations are considered influential outliers, meaning they have a significant effect on the regression model’s coefficients. Their presence could distort the model fit and influence parameter estimates. It is advisable to examine these data points further to determine whether they are valid measurements or data entry errors. If they are genuine, they should be retained; if not, they may be removed or analyzed separately.

Part C

  1. By considering only x1, x2, x3, x8, x9 and x10, construct the lack of fit test. Interpret and justify your answer.
#Develop model and consider the significant variables
model1 <-lm(y~x1+x2+x3+x8+x9+x10, data = data)
summary(model1)

Call:
lm(formula = y ~ x1 + x2 + x3 + x8 + x9 + x10, data = data)

Residuals:
    Min      1Q  Median      3Q     Max 
-4.8683 -1.8362 -0.2086  1.7344  6.2344 

Coefficients:
             Estimate Std. Error t value Pr(>|t|)  
(Intercept) 29.551590  16.249704   1.819    0.081 .
x1          -0.035411   0.025308  -1.399    0.174  
x2           0.019203   0.040693   0.472    0.641  
x3           0.001668   0.024560   0.068    0.946  
x8           0.140948   0.098906   1.425    0.167  
x9          -0.187418   0.251940  -0.744    0.464  
x10         -0.004439   0.003718  -1.194    0.244  
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 3.089 on 25 degrees of freedom
Multiple R-squared:  0.8072,    Adjusted R-squared:  0.7609 
F-statistic: 17.44 on 6 and 25 DF,  p-value: 7.662e-08
model2 <-lm(y~., data = data)
summary(model2)

Call:
lm(formula = y ~ ., data = data)

Residuals:
    Min      1Q  Median      3Q     Max 
-4.9134 -1.8769 -0.2887  1.7538  4.7129 

Coefficients:
             Estimate Std. Error t value Pr(>|t|)  
(Intercept)  9.755693  28.797397   0.339   0.7383  
x1          -0.026803   0.034760  -0.771   0.4497  
x2          -0.003633   0.056401  -0.064   0.9493  
x3           0.026598   0.029589   0.899   0.3794  
x4           1.620045   2.356393   0.688   0.4997  
x5           5.003852   2.998637   1.669   0.1108  
x6          -0.136788   1.182675  -0.116   0.9091  
x7          -2.612686   2.881391  -0.907   0.3753  
x8           0.210631   0.109101   1.931   0.0678 .
x9          -0.318245   0.303778  -1.048   0.3073  
x10         -0.006969   0.004370  -1.595   0.1265  
x11          0.617416   2.940955   0.210   0.8358  
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 3.169 on 20 degrees of freedom
Multiple R-squared:  0.8377,    Adjusted R-squared:  0.7484 
F-statistic: 9.382 on 11 and 20 DF,  p-value: 1.094e-05
#lack of fit test
anova(model1, model2)
Analysis of Variance Table

Model 1: y ~ x1 + x2 + x3 + x8 + x9 + x10
Model 2: y ~ x1 + x2 + x3 + x4 + x5 + x6 + x7 + x8 + x9 + x10 + x11
  Res.Df    RSS Df Sum of Sq      F Pr(>F)
1     25 238.62                           
2     20 200.90  5    37.723 0.7511  0.595

Interpretation:

From the table, we can see the table show the p-value is 0.5950, which is greater than 0.05.

\(H_{0}\):The reduced model (Model 1) fits the data adequately, there is no significant lack of fit.

\(H_{1}\):The reduced model does not fit adequately, the full model fits significantly better.

\(p-value=0.5950\)

Since \((p-value=0.5950)\) >\((\alpha=0.05)\), do not reject \(H_{0}\).

At \(\alpha=0.05\), the reduced model (Model 1) fits the data adequately; there is no significant lack of fit.

The simpler model (with x1, x2, x3, x8, x9, and x10) is adequate.

The additional predictors (x4, x5, x6, x7, x11) in the full model do not significantly improve the fit.

The lack of fit test was conducted by comparing the reduced model using variables x1, x2, x3, x8, x9, and x10 with the full model containing all predictors. The ANOVA result gives a p-value of 0.5950, which is greater than 0.05. Therefore, we fail to reject the null hypothesis, indicating that the reduced model provides an adequate fit to the data. The additional variables in the full model do not significantly improve the model performance. Hence, the simpler model is sufficient to explain the relationship between the response variable y and the selected predictors.

LS0tDQp0aXRsZTogIkxBQiBSRVBPUlQgMSINCm91dHB1dDogaHRtbF9ub3RlYm9vaw0KLS0tDQoNCkxPVyBQT0ggU1dFQU4NCg0KU0QyMzAxOC0gMDJHDQoNCjEuIEV4dHJhY3QgZGF0YSBmcm9tIHRoZSBmb2xsb3dpbmcgZXhjZWwgZmlsZTogZ21wLnR4dC4NCg0KYGBge3J9DQpmaWxlLmNob29zZSgpDQpgYGANCg0KYGBge3J9DQpsaWJyYXJ5KHJlYWR4bCkNCmRhdGE8LSByZWFkX2V4Y2VsKCJDOlxcVXNlcnNcXGpvb25lXFxPbmVEcml2ZVxcRGVza3RvcFxcWTMgU01TXFxnbXAueGxzeCIpDQpkYXRhDQpgYGANCg0KYGBge3J9DQoNCmxpYnJhcnkoSG1pc2MpDQoNCiMgQ2hlY2sgZm9yIG1pc3NpbmcgdmFsdWVzDQpzdW1tYXJ5KGRhdGEkeDMpDQoNCiMgSW1wdXRlIGFuZCBjb252ZXJ0IHRvIG51bWVyaWMNCmRhdGEkeDMgPC0gYXMubnVtZXJpYyhpbXB1dGUoZGF0YSR4MywgbWVhbikpDQoNCiMgQ29uZmlybSBubyBtaXNzaW5nIHZhbHVlcyByZW1haW4NCnN1bW1hcnkoZGF0YSR4MykNCg0KZGF0YQ0KYGBgDQoNCg0KMi4gRGV2ZWxvcCBhIG11bHRpcGxlIGxpbmVhciByZWdyZXNzaW9uIG1vZGVsIGJ5IGNvbnNpZGVyaW5nIGFsbCB2YXJpYWJsZXMuDQoNClBhcnQgQQ0KDQppKSBDb25zdHJ1Y3QgYSBub3JtYWwgcHJvYmFiaWxpdHkgcGxvdCBvZiB0aGUgcmVzaWR1YWxzLiBEb2VzIHRoZXJlIHNlZW0gdG8gYmUgYW55IHByb2JsZW1zIHdpdGggdGhlIG5vcm1hbGl0eSBhc3N1bXB0aW9uPw0KDQpgYGB7cn0NCiMgRml0IHRoZSBtdWx0aXBsZSBsaW5lYXIgcmVncmVzc2lvbiBtb2RlbA0KbW9kZWwyIDwtIGxtKHl+LiwgZGF0YSA9ZGF0YSkNCg0KIyBNb2RlbCBzdW1tYXJ5DQpzdW1tYXJ5X21vZGVsMiA8LSBzdW1tYXJ5KG1vZGVsMikNCnByaW50KHN1bW1hcnlfbW9kZWwyKQ0KYGBgDQoNCg0KYGBge3J9DQpyZXNpZHVhbHMgPC0gcmVzaWR1YWxzKG1vZGVsMikNCnFxbm9ybShyZXNpZHVhbHMpDQpxcWxpbmUocmVzaWR1YWxzKQ0KYGBgDQpJbnRlcnByZXQ6DQoNClRoZSBwb2ludHMgbW9zdGx5IGZvbGxvdyB0aGUgc3RyYWlnaHQgbGluZSBpbiB0aGUgbWlkZGxlIHNlY3Rpb24uDQoNCkhvd2V2ZXIsIHRoZXJlIGlzIHNvbWUgZGV2aWF0aW9uIGF0IGJvdGggdGFpbHMgc3VjaCBhcyB0aGUgZXh0cmVtZSBsZWZ0IGFuZCByaWdodC4NCg0KVGhlcmUgaXMgbm8gc2VyaW91cyB2aW9sYXRpb24gb2YgdGhlIG5vcm1hbGl0eSBhc3N1bXB0aW9uLg0KDQpUaGUgcmVzaWR1YWxzIGFyZSBhcHByb3hpbWF0ZWx5IG5vcm1hbGx5IGRpc3RyaWJ1dGVkLCB0aG91Z2ggdGhlcmUgaXMgc2xpZ2h0IGRldmlhdGlvbiBpbiB0aGUgdGFpbHMsIHdoaWNoIHN1Z2dlc3RzIHRoZSBwcmVzZW5jZSBvZiBtaW5vciBvdXRsaWVycyBvciBtaWxkIG5vbi1ub3JtYWxpdHkuDQoNCkNvbmNsdXNpb24sIHRoZSBRLVEgcGxvdCBzaG93cyB0aGF0IHRoZSByZXNpZHVhbHMgZ2VuZXJhbGx5IGxpZSBhbG9uZyB0aGUgc3RyYWlnaHQgbGluZSwgaW5kaWNhdGluZyB0aGF0IHRoZSBub3JtYWxpdHkgYXNzdW1wdGlvbiBpcyByZWFzb25hYmx5IHNhdGlzZmllZC4gTWlub3IgZGV2aWF0aW9ucyBhdCB0aGUgdGFpbHMgc3VnZ2VzdCBhIGZldyBvdXRsaWVycyBvciBzbGlnaHQgbm9uLW5vcm1hbGl0eSwgYnV0IG5vdCBlbm91Z2ggdG8gYmUgYSBtYWpvciBjb25jZXJuLg0KDQpgYGB7cn0NCnBsb3QobW9kZWwyLHdoaWNoPTIpICAjIFEtUSBwbG90DQpgYGANCg0KDQpgYGB7cn0NCnJlc2lkdWFsczIgPC0gcmVzaWQobW9kZWwyKQ0KaGlzdChyZXNpZHVhbHMyLCBtYWluID0gIkhpc3RvZ3JhbSBvZiBSZXNpZHVhbHMiLCBjb2wgPSAic2t5Ymx1ZSIpDQpgYGANCg0KSW50ZXJwcmV0Og0KDQpUaGUgaGlzdG9ncmFtIGlzIHJvdWdobHkgYmVsbC1zaGFwZWQsIGNlbnRlcmVkIGFyb3VuZCB6ZXJvLg0KDQpUaGVyZSBpcyBzb21lIHNsaWdodCBza2V3bmVzcywgdGhlIHJpZ2h0IHRhaWwgc2VlbXMgYSBiaXQgbG9uZ2VyIHRoYW4gdGhlIGxlZnQuDQoNCkhvd2V2ZXIsIHRoZSBvdmVyYWxsIHBhdHRlcm4gbG9va3MgcmVhc29uYWJseSBzeW1tZXRyaWMsIHdoaWNoIHN1cHBvcnRzIHRoZSBub3JtYWxpdHkgYXNzdW1wdGlvbi4NCg0KQ29uY2x1c2lvbiwgdGhlIGhpc3RvZ3JhbSBvZiByZXNpZHVhbHMgYXBwZWFycyBhcHByb3hpbWF0ZWx5IHN5bW1ldHJpYyBhbmQgYmVsbC1zaGFwZWQsIHdpdGggbW9zdCByZXNpZHVhbHMgY2x1c3RlcmluZyBhcm91bmQgemVyby4gVGhpcyBzdWdnZXN0cyB0aGF0IHRoZSByZXNpZHVhbHMgYXJlIHJvdWdobHkgbm9ybWFsbHkgZGlzdHJpYnV0ZWQuIEFsdGhvdWdoIHRoZXJlIGlzIHNsaWdodCBza2V3bmVzcyBpbiB0aGUgcmlnaHQgdGFpbCwgdGhlIGRldmlhdGlvbiBmcm9tIG5vcm1hbGl0eSBpcyBub3Qgc2V2ZXJlLiBUaGVyZWZvcmUsIHRoZSBub3JtYWxpdHkgYXNzdW1wdGlvbiBmb3IgdGhlIG11bHRpcGxlIGxpbmVhciByZWdyZXNzaW9uIG1vZGVsIGlzIHJlYXNvbmFibHkgc2F0aXNmaWVkLg0KDQoNCg0KDQppaSkgU3VwcG9ydCB5b3VyIGFuc3dlciBpbiAoaSkgYnkgdXNpbmcgYXBwcm9wcmlhdGUgbm9ybWFsaXR5IHRlc3QuDQoNCmBgYHtyfQ0KI1R3by1TYW1wbGUgS+KAk1MgVGVzdA0Ka3MudGVzdChyZXNpZHVhbHMyLCAicG5vcm0iLCBtZWFuKHJlc2lkdWFsczIpLCBzZChyZXNpZHVhbHMyKSkNCmBgYA0KSW50ZXJwcmV0Og0KDQokSF97MH0kOiBSZXNpZHVhbHMgYXJlIG5vcm1hbGx5IGRpc3RyaWJ1dGVkLg0KDQokSF97MX0kOiBSZXNpZHVhbHMgYXJlIG5vdCBub3JtYWxseSBkaXN0cmlidXRlZC4NCg0KJHAtdmFsdWU9MC45MDI3JA0KDQpTaW5jZSAkKHAtdmFsdWU9MC45MDI3KSQgPiQoXGFscGhhPTAuMDUpJCwgZG8gbm90IHJlamVjdCAkSF97MH0kLg0KDQpBdCAkXGFscGhhPTAuMDUkLCBub3JtYWxpdHkgYXNzdW1wdGlvbiBob2xkcy4NCg0KDQoNCg0KYGBge3J9DQpsaWJyYXJ5KG5vcnRlc3QpDQojQW5kZXJzb24tRGFybGluZyBUZXN0IHRvIHRlc3QgZm9yIG5vcm1hbGl0eQ0KYWQudGVzdChyZXNpZHVhbHMyKQ0KYGBgDQpJbnRlcnByZXQ6DQoNCiRIX3swfSQ6IFJlc2lkdWFscyBhcmUgbm9ybWFsbHkgZGlzdHJpYnV0ZWQuDQoNCiRIX3sxfSQ6IFJlc2lkdWFscyBhcmUgbm90IG5vcm1hbGx5IGRpc3RyaWJ1dGVkLg0KDQokcC12YWx1ZT0wLjM5ODIkDQoNClNpbmNlICQocC12YWx1ZT0wLjM5ODIpJCA+JChcYWxwaGE9MC4wNSkkLCBkbyBub3QgcmVqZWN0ICRIX3swfSQuDQoNCkF0ICRcYWxwaGE9MC4wNSQsIG5vcm1hbGl0eSBhc3N1bXB0aW9uIGhvbGRzLg0KDQoNCmBgYHtyfQ0KI2NvbmR1Y3Qgc2hhcGlyb3dpbGsgVGVzdCB0byB0ZXN0IGZvciBub3JtYWxpdHkNCnNoYXBpcm8udGVzdChyZXNpZHVhbHMyKQ0KYGBgDQoNCkludGVycHJldGF0aW9uOg0KDQoNCg0KJEhfezB9JDogUmVzaWR1YWxzIGFyZSBub3JtYWxseSBkaXN0cmlidXRlZC4NCg0KJEhfezF9JDogUmVzaWR1YWxzIGFyZSBub3Qgbm9ybWFsbHkgZGlzdHJpYnV0ZWQuDQoNCiRwLXZhbHVlPTAuMzI0OSQNCg0KU2luY2UgJChwLXZhbHVlPTAuMzI0OSkkID4kKFxhbHBoYT0wLjA1KSQsIGRvIG5vdCByZWplY3QgJEhfezB9JC4NCg0KQXQgJFxhbHBoYT0wLjA1JCwgbm9ybWFsaXR5IGFzc3VtcHRpb24gaG9sZHMuDQoNCkJhc2VkIG9uIHRoZSBTaGFwaXJv4oCTV2lsaywgQW5kZXJzb27igJNEYXJsaW5nLCBhbmQgS29sbW9nb3JvduKAk1NtaXJub3YgdGVzdHMsIHRoZSBwLXZhbHVlcyBhcmUgZ3JlYXRlciB0aGFuIDAuMDUsIGluZGljYXRpbmcgdGhhdCB0aGUgcmVzaWR1YWxzIGFyZSBub3Qgc2lnbmlmaWNhbnRseSBkaWZmZXJlbnQgZnJvbSBhIG5vcm1hbCBkaXN0cmlidXRpb24uIFRoZXJlZm9yZSwgdGhlIG5vcm1hbGl0eSBhc3N1bXB0aW9uIG9mIHRoZSBtdWx0aXBsZSBsaW5lYXIgcmVncmVzc2lvbiBtb2RlbCBpcyBzdXBwb3J0ZWQuDQoNCmlpaSkgQ29uc3RydWN0IGFuZCBpbnRlcnByZXQgYSBwbG90IG9mIHJlc2lkdWFscyB2ZXJzdXMgdGhlIHByZWRpY3RlZCByZXNwb25zZS4NCg0KYGBge3J9DQpyZXNpZHVhbHMgPC0gcmVzaWQobW9kZWwyKQ0KcHJlZGljdGVkX3Jlc3BvbnNlIDwtIGZpdHRlZChtb2RlbDIpDQpwbG90KHByZWRpY3RlZF9yZXNwb25zZSwgcmVzaWR1YWxzLA0KICAgICAgICAgeGxhYiA9ICJQcmVkaWN0ZWQgUmVzcG9uc2UiLA0KICAgICAgICAgeWxhYiA9ICJSZXNpZHVhbHMiLA0KICAgICAgICAgbWFpbiA9ICJSZXNpZHVhbHMgdnMuIFByZWRpY3RlZCBSZXNwb25zZSBQbG90IikNCmFibGluZShoID0gMCwgY29sID0gInJlZCIsIGx0eSA9IDIpICMgQWRkIGEgaG9yaXpvbnRhbCBsaW5lIGF0IDANCmBgYA0KSW50ZXJwcmV0Og0KDQpUaGUgcmVzaWR1YWxzIGFyZSByYW5kb21seSBzY2F0dGVyZWQgYXJvdW5kIHRoZSBob3Jpem9udGFsIGxpbmUgYXQgemVyby4NCg0KVGhlcmUgaXMgbm8gY2xlYXIgcGF0dGVybiBvciBzeXN0ZW1hdGljIGN1cnZhdHVyZSwgbWVhbmluZyB0aGUgbGluZWFyaXR5IGFzc3VtcHRpb24gaXMgc2F0aXNmaWVkLg0KDQpUaGUgc3ByZWFkIHdoaWNoIGlzIHZhcmlhbmNlIG9mIHJlc2lkdWFscyBhcHBlYXJzIHJvdWdobHkgY29uc3RhbnQgYWNyb3NzIHByZWRpY3RlZCB2YWx1ZXMsIHNvIGl0IGlzIG5vIG9idmlvdXMgZnVubmVsIG9yIGNvbmUgc2hhcGUuDQoNCkEgZmV3IHBvaW50cyBkZXZpYXRlIHNsaWdodGx5IGZyb20gemVybywgYnV0IHRoZXJlIGFyZSBubyBleHRyZW1lIG91dGxpZXJzLg0KDQpDb25jbHVzaW9uLCB0aGUgcmVzaWR1YWxzIHZzLiBwcmVkaWN0ZWQgcmVzcG9uc2UgcGxvdCBzaG93cyB0aGF0IHRoZSByZXNpZHVhbHMgYXJlIHJhbmRvbWx5IGRpc3RyaWJ1dGVkIGFyb3VuZCB6ZXJvIHdpdGggbm8gY2xlYXIgdHJlbmQgb3IgcGF0dGVybi4gVGhpcyBpbmRpY2F0ZXMgdGhhdCB0aGUgYXNzdW1wdGlvbnMgb2YgbGluZWFyaXR5IGFuZCBjb25zdGFudCB2YXJpYW5jZSAoaG9tb3NjZWRhc3RpY2l0eSkgYXJlIHJlYXNvbmFibHkgbWV0LiBUaGVyZWZvcmUsIHRoZSBtb2RlbCBhcHBlYXJzIGFwcHJvcHJpYXRlLCBhbmQgdGhlcmUgaXMgbm8gZXZpZGVuY2Ugb2YgaGV0ZXJvc2NlZGFzdGljaXR5IG9yIG5vbi1saW5lYXJpdHkuDQoNClBhcnQgQg0KDQpUaGVuLCBkZXRlY3QgYW55IG91dGxpZXJzIG9jY3VycyB1c2luZyBDb29r4oCZcyBEaXN0YW5jZSBtZXRob2QuDQoNCmkpIFBsb3QgdGhlIGluZmx1ZW50aWFsIG9ic2VydmF0aW9uIGJ5IENvb2vigJlzIERpc3RhbmNlIGFuZCBjb21tZW50cy4NCg0KYGBge3J9DQojQ29vayBkaXN0YW5jZQ0KbW9kZWwyIDwtIGxtKHkgfi4sIGRhdGEgPWRhdGEpDQpjb29rc2Q8LWNvb2tzLmRpc3RhbmNlKG1vZGVsMikNCnBsb3QoY29va3NkLCBwY2g9IioiLCBjZXg9MiwgbWFpbj0iSW5mbHVlbnRpYWwgT2JzYnkgQ29va3MgZGlzdGFuY2UiKSAjIHBsb3QgY29vaydzIGRpc3RhbmNlDQphYmxpbmUoaCA9IDQqbWVhbihjb29rc2QsIG5hLnJtPVQpLCBjb2w9InJlZCIpICMgYWRkIGN1dG9mZmxpbmUNCnRleHQoeD0xOmxlbmd0aChjb29rc2QpKzEsIHk9Y29va3NkLCBsYWJlbHM9aWZlbHNlKGNvb2tzZD40Km1lYW4oY29va3NkLCBuYS5ybT1UKSxuYW1lcyhjb29rc2QpLCIiKSwgY29sPSJyZWQiKSAjIGFkZCBsYWJlbHMNCmBgYA0KSW50ZXJwcmV0Og0KDQpUaGUgcmVkIGhvcml6b250YWwgbGluZSByZXByZXNlbnRzIHRoZSBjdXRvZmYgdmFsdWUgKDQgKiBtZWFuKENvb2vigJlzIGRpc3RhbmNlKSkuDQoNCk1vc3QgcG9pbnRzIGFyZSBiZWxvdyB0aGlzIGxpbmUsIG1lYW5pbmcgdGhleSBhcmUgbm90IGluZmx1ZW50aWFsLg0KDQpPYnNlcnZhdGlvbnMgMTQgYW5kIDE3IGFyZSBhYm92ZSB0aGUgcmVkIGxpbmUsIGluZGljYXRpbmcgdGhhdCB0aGV5IGFyZSBwb3RlbnRpYWxseSBpbmZsdWVudGlhbCBvYnNlcnZhdGlvbnMuDQoNClRoaXMgbWVhbnMgdGhlc2UgdHdvIGRhdGEgcG9pbnRzIGhhdmUgYSBkaXNwcm9wb3J0aW9uYXRlIGVmZmVjdCBvbiB0aGUgcmVncmVzc2lvbiBjb2VmZmljaWVudHMgYW5kIG1heSBpbmZsdWVuY2UgdGhlIG1vZGVs4oCZcyBmaXQuDQoNCkNvbmNsdXNpb24sIHRoZSBDb29r4oCZcyBEaXN0YW5jZSBwbG90IHNob3dzIHRoYXQgbW9zdCBvYnNlcnZhdGlvbnMgaGF2ZSBzbWFsbCBDb29r4oCZcyBkaXN0YW5jZSB2YWx1ZXMsIGluZGljYXRpbmcgdGhleSBkbyBub3QgaGF2ZSBhbiB1bmR1ZSBpbmZsdWVuY2Ugb24gdGhlIHJlZ3Jlc3Npb24gbW9kZWwuIEhvd2V2ZXIsIG9ic2VydmF0aW9ucyAxNCBhbmQgMTcgZXhjZWVkIHRoZSBjdXRvZmYgbGluZSAoNCDDlyBtZWFuIENvb2vigJlzIERpc3RhbmNlKSwgc3VnZ2VzdGluZyB0aGF0IHRoZXkgYXJlIHBvdGVudGlhbGx5IGluZmx1ZW50aWFsLiBUaGVzZSBwb2ludHMgc2hvdWxkIGJlIGZ1cnRoZXIgaW52ZXN0aWdhdGVkIHRvIGRldGVybWluZSB3aGV0aGVyIHRoZXkgYXJlIHZhbGlkIGRhdGEgcG9pbnRzIG9yIG91dGxpZXJzIHRoYXQgbWF5IGRpc3RvcnQgdGhlIHJlZ3Jlc3Npb24gcmVzdWx0cy4NCg0KaWkpIEV4YW1pbmUgYW5kIGxpc3QgdGhlIHBvaW50IG9ic2VydmF0aW9uKHMpIHdoaWNoIGNvbnNpZGVyIGFzIG91dGxpZXIocykuIEp1c3RpZnkgeW91ciBhbnN3ZXIuDQoNCmBgYHtyfQ0KIyBpbmZsdWVudGlhbCByb3cgbnVtYmVycw0KaW5mbHVlbnRpYWwgPC1hcy5udW1lcmljKG5hbWVzKGNvb2tzZClbKGNvb2tzZD4gNCptZWFuKGNvb2tzZCwgbmEucm09VCkpXSkNCmluZmx1ZW50aWFsIA0KDQpoZWFkKGRhdGFbaW5mbHVlbnRpYWwsXSkgIyBpbmZsdWVudGlhbCBvYnNlcnZhdGlvbnMuDQoNCmBgYA0KDQpJbnRlcnByZXQ6DQoNCkluIHRoZXNlIDIgcm93IGhhdmUgdmVyeSBoaWdoIHdlaWdodCh4MTApLCBhbmQgdGhlIHR5cGUgb2YgdHJhbnNtaXNzaW9uIGJvdGggaXMgYXV0b21hdGljLg0KDQpCYXNlZCBvbiB0aGUgQ29va+KAmXMgRGlzdGFuY2UgYW5hbHlzaXMsIG9ic2VydmF0aW9ucyAxNCBhbmQgMTcgZXhjZWVkIHRoZSB0aHJlc2hvbGQgdmFsdWUgKDQgw5cgbWVhbiBDb29r4oCZcyBEaXN0YW5jZSkuIFRoZXNlIG9ic2VydmF0aW9ucyBhcmUgY29uc2lkZXJlZCBpbmZsdWVudGlhbCBvdXRsaWVycywgbWVhbmluZyB0aGV5IGhhdmUgYSBzaWduaWZpY2FudCBlZmZlY3Qgb24gdGhlIHJlZ3Jlc3Npb24gbW9kZWzigJlzIGNvZWZmaWNpZW50cy4gVGhlaXIgcHJlc2VuY2UgY291bGQgZGlzdG9ydCB0aGUgbW9kZWwgZml0IGFuZCBpbmZsdWVuY2UgcGFyYW1ldGVyIGVzdGltYXRlcy4gSXQgaXMgYWR2aXNhYmxlIHRvIGV4YW1pbmUgdGhlc2UgZGF0YSBwb2ludHMgZnVydGhlciB0byBkZXRlcm1pbmUgd2hldGhlciB0aGV5IGFyZSB2YWxpZCBtZWFzdXJlbWVudHMgb3IgZGF0YSBlbnRyeSBlcnJvcnMuIElmIHRoZXkgYXJlIGdlbnVpbmUsIHRoZXkgc2hvdWxkIGJlIHJldGFpbmVkOyBpZiBub3QsIHRoZXkgbWF5IGJlIHJlbW92ZWQgb3IgYW5hbHl6ZWQgc2VwYXJhdGVseS4NCg0KUGFydCBDDQoNCmkpIEJ5IGNvbnNpZGVyaW5nIG9ubHkgeDEsIHgyLCB4MywgeDgsIHg5IGFuZCB4MTAsIGNvbnN0cnVjdCB0aGUgbGFjayBvZiBmaXQgdGVzdC4gSW50ZXJwcmV0IGFuZCBqdXN0aWZ5IHlvdXIgYW5zd2VyLg0KDQpgYGB7cn0NCiNEZXZlbG9wIG1vZGVsIGFuZCBjb25zaWRlciB0aGUgc2lnbmlmaWNhbnQgdmFyaWFibGVzDQptb2RlbDEgPC1sbSh5fngxK3gyK3gzK3g4K3g5K3gxMCwgZGF0YSA9IGRhdGEpDQpzdW1tYXJ5KG1vZGVsMSkNCm1vZGVsMiA8LWxtKHl+LiwgZGF0YSA9IGRhdGEpDQpzdW1tYXJ5KG1vZGVsMikNCiNsYWNrIG9mIGZpdCB0ZXN0DQphbm92YShtb2RlbDEsIG1vZGVsMikNCmBgYA0KDQpJbnRlcnByZXRhdGlvbjoNCg0KRnJvbSB0aGUgdGFibGUsIHdlIGNhbiBzZWUgdGhlIHRhYmxlIHNob3cgdGhlIHAtdmFsdWUgaXMgMC41OTUwLCB3aGljaCBpcyBncmVhdGVyIHRoYW4gMC4wNS4NCg0KDQokSF97MH0kOlRoZSByZWR1Y2VkIG1vZGVsIChNb2RlbCAxKSBmaXRzIHRoZSBkYXRhIGFkZXF1YXRlbHksIHRoZXJlIGlzIG5vIHNpZ25pZmljYW50IGxhY2sgb2YgZml0Lg0KDQokSF97MX0kOlRoZSByZWR1Y2VkIG1vZGVsIGRvZXMgbm90IGZpdCBhZGVxdWF0ZWx5LCB0aGUgZnVsbCBtb2RlbCBmaXRzIHNpZ25pZmljYW50bHkgYmV0dGVyLg0KDQokcC12YWx1ZT0wLjU5NTAkDQoNClNpbmNlICQocC12YWx1ZT0wLjU5NTApJCA+JChcYWxwaGE9MC4wNSkkLCBkbyBub3QgcmVqZWN0ICRIX3swfSQuDQoNCkF0ICRcYWxwaGE9MC4wNSQsIHRoZSByZWR1Y2VkIG1vZGVsIChNb2RlbCAxKSBmaXRzIHRoZSBkYXRhIGFkZXF1YXRlbHk7IHRoZXJlIGlzIG5vIHNpZ25pZmljYW50IGxhY2sgb2YgZml0Lg0KDQpUaGUgc2ltcGxlciBtb2RlbCAod2l0aCB4MSwgeDIsIHgzLCB4OCwgeDksIGFuZCB4MTApIGlzIGFkZXF1YXRlLg0KDQpUaGUgYWRkaXRpb25hbCBwcmVkaWN0b3JzICh4NCwgeDUsIHg2LCB4NywgeDExKSBpbiB0aGUgZnVsbCBtb2RlbCBkbyBub3Qgc2lnbmlmaWNhbnRseSBpbXByb3ZlIHRoZSBmaXQuDQoNClRoZSBsYWNrIG9mIGZpdCB0ZXN0IHdhcyBjb25kdWN0ZWQgYnkgY29tcGFyaW5nIHRoZSByZWR1Y2VkIG1vZGVsIHVzaW5nIHZhcmlhYmxlcyB4MSwgeDIsIHgzLCB4OCwgeDksIGFuZCB4MTAgd2l0aCB0aGUgZnVsbCBtb2RlbCBjb250YWluaW5nIGFsbCBwcmVkaWN0b3JzLiBUaGUgQU5PVkEgcmVzdWx0IGdpdmVzIGEgcC12YWx1ZSBvZiAwLjU5NTAsIHdoaWNoIGlzIGdyZWF0ZXIgdGhhbiAwLjA1LiBUaGVyZWZvcmUsIHdlIGZhaWwgdG8gcmVqZWN0IHRoZSBudWxsIGh5cG90aGVzaXMsIGluZGljYXRpbmcgdGhhdCB0aGUgcmVkdWNlZCBtb2RlbCBwcm92aWRlcyBhbiBhZGVxdWF0ZSBmaXQgdG8gdGhlIGRhdGEuIFRoZSBhZGRpdGlvbmFsIHZhcmlhYmxlcyBpbiB0aGUgZnVsbCBtb2RlbCBkbyBub3Qgc2lnbmlmaWNhbnRseSBpbXByb3ZlIHRoZSBtb2RlbCBwZXJmb3JtYW5jZS4gSGVuY2UsIHRoZSBzaW1wbGVyIG1vZGVsIGlzIHN1ZmZpY2llbnQgdG8gZXhwbGFpbiB0aGUgcmVsYXRpb25zaGlwIGJldHdlZW4gdGhlIHJlc3BvbnNlIHZhcmlhYmxlIHkgYW5kIHRoZSBzZWxlY3RlZCBwcmVkaWN0b3JzLg0KDQoNCg0KDQoNCg0KDQo=