Question 1: (Name of Data file: Liver)

An experiment was conducted to investigate the amount of drug retained in the liver of a rat. Nineteen rats were chosen for the experiment and each rat was administered a dose of the drug. After a fixed length of time, the rat was sacrificed, the liver weighed and the percentage of the dose in the liver determined. The questions can be attempted using whatever is most convenient, a computer package or hand calculations. When computer software is used you need to include the output and code you used (or details on the steps you followed) to generate the output. The variables are: X1 = body weight of rat X2 = weight of liver X3 = dose given Y = percentage of dose in liver.


library(readr)
library(dplyr)
library(tidyverse)
library(car)

We have imported the necessary packages into R which will come handy in our further assignment.


#import the data
liver <- read.csv("liver.csv")
liver

Here we have imported the data into R and have a glimpse at our “Liver” dataset.

#convert into matrix
livermatrix <- data.matrix(liver)
livermatrix
      BdyWt LvrWt Dose    Y
 [1,]   176   6.5 0.88 0.42
 [2,]   176   9.5 0.88 0.25
 [3,]   190   9.0 1.00 0.56
 [4,]   176   8.9 0.88 0.23
 [5,]   200   7.2 1.00 0.23
 [6,]   167   8.9 0.83 0.32
 [7,]   188   8.0 0.94 0.37
 [8,]   195  10.0 0.98 0.41
 [9,]   176   8.0 0.88 0.33
[10,]   165   7.9 0.84 0.38
[11,]   158   6.9 0.80 0.27
[12,]   148   7.3 0.74 0.36
[13,]   149   5.2 0.75 0.21
[14,]   163   8.4 0.81 0.28
[15,]   170   7.2 0.85 0.34
[16,]   186   6.8 0.94 0.28
[17,]   146   7.3 0.73 0.30
[18,]   181   9.0 0.90 0.37
[19,]   149   6.4 0.75 0.46
#check class
class(livermatrix)
[1] "matrix" "array" 

We have converted the Liver data frame into matrix and confirmed it by checking the class of the matrix.


#convert x and y matrix
x_matrix <- liver %>% select(1,2,3)
x <- data.matrix(x_matrix)
x <- cbind(c(1),x)
x
        BdyWt LvrWt Dose
 [1,] 1   176   6.5 0.88
 [2,] 1   176   9.5 0.88
 [3,] 1   190   9.0 1.00
 [4,] 1   176   8.9 0.88
 [5,] 1   200   7.2 1.00
 [6,] 1   167   8.9 0.83
 [7,] 1   188   8.0 0.94
 [8,] 1   195  10.0 0.98
 [9,] 1   176   8.0 0.88
[10,] 1   165   7.9 0.84
[11,] 1   158   6.9 0.80
[12,] 1   148   7.3 0.74
[13,] 1   149   5.2 0.75
[14,] 1   163   8.4 0.81
[15,] 1   170   7.2 0.85
[16,] 1   186   6.8 0.94
[17,] 1   146   7.3 0.73
[18,] 1   181   9.0 0.90
[19,] 1   149   6.4 0.75
y_matrix <- liver %>% select(4)



y <- data.matrix(y_matrix)
y
         Y
 [1,] 0.42
 [2,] 0.25
 [3,] 0.56
 [4,] 0.23
 [5,] 0.23
 [6,] 0.32
 [7,] 0.37
 [8,] 0.41
 [9,] 0.33
[10,] 0.38
[11,] 0.27
[12,] 0.36
[13,] 0.21
[14,] 0.28
[15,] 0.34
[16,] 0.28
[17,] 0.30
[18,] 0.37
[19,] 0.46

In above step, we have created two different matrix and named as “X” and “Y” matrix. For solving Question 1a, we need to add a dummy variable in matrix “X” with values “1”. Now we will solve Question 1a.

(a) Find the matrix (X′X)−1 where X is the design matrix.


#Q1a
# X'
Tx <- t(x)
Tx
        [,1]   [,2] [,3]   [,4]  [,5]   [,6]   [,7]   [,8]   [,9]  [,10] [,11]  [,12]  [,13]  [,14]
        1.00   1.00    1   1.00   1.0   1.00   1.00   1.00   1.00   1.00   1.0   1.00   1.00   1.00
BdyWt 176.00 176.00  190 176.00 200.0 167.00 188.00 195.00 176.00 165.00 158.0 148.00 149.00 163.00
LvrWt   6.50   9.50    9   8.90   7.2   8.90   8.00  10.00   8.00   7.90   6.9   7.30   5.20   8.40
Dose    0.88   0.88    1   0.88   1.0   0.83   0.94   0.98   0.88   0.84   0.8   0.74   0.75   0.81
       [,15]  [,16]  [,17] [,18]  [,19]
        1.00   1.00   1.00   1.0   1.00
BdyWt 170.00 186.00 146.00 181.0 149.00
LvrWt   7.20   6.80   7.30   9.0   6.40
Dose    0.85   0.94   0.73   0.9   0.75
#x'x
xx <- Tx%*%x
xx
                  BdyWt     LvrWt      Dose
        19.00   3259.00   148.400   16.3800
BdyWt 3259.00 563899.00 25636.000 2834.8200
LvrWt  148.40  25636.00  1186.000  128.8620
Dose    16.38   2834.82   128.862   14.2538
#(x'x)-1....inverse
inverse_x <- solve(xx)
inverse_x
                         BdyWt        LvrWt       Dose
       6.33809378 -0.074426957 -0.068005387   8.133435
BdyWt -0.07442696  0.010644476 -0.002783671  -2.006297
LvrWt -0.06800539 -0.002783671  0.049620475   0.183175
Dose   8.13343533 -2.006296702  0.183175008 388.083181

In the Above step, we have done transpose of matrix X and named as “Tx”. After the transpose, we have multiplied that with X matrix and named that matrix as XX. At the end to find the inverse, “Solve” function was used and named as inverse_x.

b) Determine the equation of best fit relating the response Y to the three predictors

q2 <- lm(Y~BdyWt+LvrWt+Dose, liver)
summary(q2)

Call:
lm(formula = Y ~ BdyWt + LvrWt + Dose, data = liver)

Residuals:
      Min        1Q    Median        3Q       Max 
-0.100557 -0.063233  0.007131  0.045971  0.134691 

Coefficients:
             Estimate Std. Error t value Pr(>|t|)  
(Intercept)  0.265922   0.194585   1.367   0.1919  
BdyWt       -0.021246   0.007974  -2.664   0.0177 *
LvrWt        0.014298   0.017217   0.830   0.4193  
Dose         4.178111   1.522625   2.744   0.0151 *
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 0.07729 on 15 degrees of freedom
Multiple R-squared:  0.3639,    Adjusted R-squared:  0.2367 
F-statistic:  2.86 on 3 and 15 DF,  p-value: 0.07197

In the above step, we have calculated the equation of best fit by using lm function. We have used all the 3 variables of X as resposnse to Y variable. Through above step, we found the equation of best fit as:

Y^ = 0.26 - 0.21X1 + 0.01X2 + 4.17X3.

We can also see that the P-value is smaller then 0.05, therefore we can say that the model is significant and we can reject H0. Multiple R square is 0.36 and Adjusted R- square is observed as 0.23.

c) Perform ANOVA to assess the adequacy of the model and also individual T tests on the coefficients. Which predictors can be left out of the model? Explain.

# Anova
anova(q2)
Analysis of Variance Table

Response: Y
          Df   Sum Sq  Mean Sq F value  Pr(>F)  
BdyWt      1 0.003216 0.003216  0.5383 0.47446  
LvrWt      1 0.003067 0.003067  0.5134 0.48467  
Dose       1 0.044982 0.044982  7.5296 0.01507 *
Residuals 15 0.089609 0.005974                  
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

In the above we can the values of Sum square of residuals (0.089) and the X1 (0.003), X2(0.003), X3(0.44) and the mean squares as well of both the values. ANOVA table also highlights the F value and the PR value as respective to F. In this case the F values are X1(o.538), X2(0.513) and X3(7.529).

Now, we will perform individual t test on the Co-efficients.

Individual T-test for the co-efficients:


#x1 ttest
t.test(liver$BdyWt)

    One Sample t-test

data:  liver$BdyWt
t = 45.34, df = 18, p-value < 2.2e-16
alternative hypothesis: true mean is not equal to 0
95 percent confidence interval:
 163.5782 179.4744
sample estimates:
mean of x 
 171.5263 

In the result above :

t is the t-test statistic value (t = 45.34), df is the degrees of freedom (df= 18), p-value is the significance level of the t-test (p-value <0.05). conf.int is the confidence interval of the mean at 95% (conf.int = [163.57, 179.47]); sample estimates is he mean value of the sample (mean = 171.5263).

The p-value of the test is smaller then 0.05.

#x2 ttest
t.test(liver$LvrWt)

    One Sample t-test

data:  liver$LvrWt
t = 27.84, df = 18, p-value = 2.995e-16
alternative hypothesis: true mean is not equal to 0
95 percent confidence interval:
 7.221116 8.399936
sample estimates:
mean of x 
 7.810526 

In the result above :

t is the t-test statistic value (t = 27.84), df is the degrees of freedom (df= 18), p-value is the significance level of the t-test (p-value <0.05). conf.int is the confidence interval of the mean at 95% (conf.int = [7.221, 8.399]); sample estimates is he mean value of the sample (mean = 7.810).

The p-value of the test is smaller then 0.05.

#x3 ttest
t.test(liver$Dose)

    One Sample t-test

data:  liver$Dose
t = 43.797, df = 18, p-value < 2.2e-16
alternative hypothesis: true mean is not equal to 0
95 percent confidence interval:
 0.8207500 0.9034605
sample estimates:
mean of x 
0.8621053 

In the result above :

t is the t-test statistic value (t = 43.797), df is the degrees of freedom (df= 18), p-value is the significance level of the t-test (p-value <0.05). conf.int is the confidence interval of the mean at 95% (conf.int = [0.820, 0.903]); sample estimates is he mean value of the sample (mean = 0.862).

The p-value of the test is smaller then 0.05.

After careful evaluation and performing one ttest on all perdictors, we can say that Liver weight has the lowest t value, therefore this one can be left out of the model.

d) Check for multicollinearity between the predictors using either the correlation matrix or the VIF values. Which pair(s) of predictors are strongly correlated?


#1d
vif(q2)
    BdyWt     LvrWt      Dose 
52.101911  1.335679 51.427147 

To check the multi collinearity between the predictors, we have used VIF Function. After analyzing the VIF values, we can say that predictors Body weight and Dose are strongly correlated with values of 52.10 and 51.42 respectively. While Liver weight has value of 1.33.

Here, we can see Multicollinearity in Both Body weight and Dose Variables as their values are greater then 10, while The value of Liver weight is less then 10, we can say that it doesn’t have multicollinearity.

e) Use Backward Elimination starting with all three predictors X1, X2 and X3 to come up with a smaller parsimonious model. (Use Fstay = 4).

#1e
step(q2, data=liver, direction = "backward")
Start:  AIC=-93.78
Y ~ BdyWt + LvrWt + Dose

        Df Sum of Sq      RSS     AIC
- LvrWt  1  0.004120 0.093729 -94.924
<none>               0.089609 -93.778
- BdyWt  1  0.042408 0.132017 -88.416
- Dose   1  0.044982 0.134591 -88.049

Step:  AIC=-94.92
Y ~ BdyWt + Dose

        Df Sum of Sq      RSS     AIC
<none>               0.093729 -94.924
- BdyWt  1  0.039851 0.133580 -90.192
- Dose   1  0.043929 0.137658 -89.621

Call:
lm(formula = Y ~ BdyWt + Dose, data = liver)

Coefficients:
(Intercept)        BdyWt         Dose  
    0.28552     -0.02044      4.12533  

Here we have performed Backward elimination method to check the best small parsimonious model Using AIC approach.

We can see in the beginning AIC was 93.78 with all the three variables. After the next step, AIC increased to 94.42 and Liver Weight variable was removed. Therefore, After backward elimination, our Final model contains *body weight and Dose variables. The co-efficient of the final model is 0.285 for the intercept, -0.020 for Body weight and 4.125 for Dose variables.

Question 2: This question uses the Crest Toothpaste Sales Data file. The questions can be attempted using whatever is most convenient, a computer package or hand calculations. When computer software is used you need to include the output and code you used (or details on the steps you followed) to generate the output. Write a comprehensive report (including the outputs and discussion) based on your findings concerning the following items:

crest <- read.csv("crest.csv")
crest

In the above step, we have imported Crest data frame and now we will perform our evaluation on it.

a) Is the model using all the predictors significant?

To check that, we have to make a model using lm function.


# lm model

crestlm <- lm(Crest.Sales.Y~Crest.Budget.X1+Ratio.X2+Us.Personal.disposable.income.x3, data=crest)
summary(crestlm)

Call:
lm(formula = Crest.Sales.Y ~ Crest.Budget.X1 + Ratio.X2 + Us.Personal.disposable.income.x3, 
    data = crest)

Residuals:
   Min     1Q Median     3Q    Max 
-24088  -2568   1021   3836  10100 

Coefficients:
                                   Estimate Std. Error t value Pr(>|t|)    
(Intercept)                       34104.559  17654.144   1.932 0.082187 .  
Crest.Budget.X1                       3.746      1.976   1.896 0.087243 .  
Ratio.X2                         -30046.343  22859.674  -1.314 0.218066    
Us.Personal.disposable.income.x3     85.926     17.911   4.797 0.000727 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 9574 on 10 degrees of freedom
Multiple R-squared:  0.9691,    Adjusted R-squared:  0.9598 
F-statistic: 104.5 on 3 and 10 DF,  p-value: 7.537e-08

From the above model, We can see the predictors values of every variable. From this we can say that, crest Budget X1, ratio X2 and Ratio X2 has P value of 0.082, 0.087 and 0.218 respectively. Therefore, we can say that these variables are insignificant as their P value is greater then 0.05. Whereas US personal disposable income X3 has p value of 0.0007 which is smaller then 0.05. Therefore, we can say that this is significant.

b) From the output, which variables are important?

.

#anova
anova(crestlm)
Analysis of Variance Table

Response: Crest.Sales.Y
                                 Df     Sum Sq    Mean Sq F value    Pr(>F)    
Crest.Budget.X1                   1 2.5611e+10 2.5611e+10 279.392  1.23e-08 ***
Ratio.X2                          1 1.0202e+09 1.0202e+09  11.130 0.0075401 ** 
Us.Personal.disposable.income.x3  1 2.1097e+09 2.1097e+09  23.015 0.0007265 ***
Residuals                        10 9.1667e+08 9.1667e+07                      
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

From the above Anova test, we can see that the P values of Crest Budget X1,ratio X2, and US personal Disposable incomes are smaller then 0.05. So we can say that all the values are significant and thus, all variables are important.

c) Are the assumptions governing the residuals satisfied? Which of these assumptions have been violated?

To check if any assumption is violated or not, we have to make visualize following plots and on the basis of them we will make our statement.

#assumptions
par(mfrow = c(2,2))
plot(crestlm)

In the above plot we can see 4 Diagnostic plots known as Residuals plot, QQ plots, Scale-location plot and leverage plots.

In the 1st graph we can see that on X axis has predicted value known as Y^(y hat) and on y axis there are residuals and errors. Here we can the line is not exactly flat but points are kind of falling near the line only and the red line is nearby the line only. Therefore, we can say that that linearity assumption is not violated here.

In the next Graph (QQ plot), here y axis is ordered, observed and Standardized residuals and on X axis it has ordered theoretical residuals. In the graph we can see that residuals are truly normally distributed as all the points are falling on a straight line.

The next two shows that the regression is non-linear, non-constant variance.

To test further, if any assumptions are violated or not. We will perform some tests.


 durbinWatsonTest(crestlm)
 lag Autocorrelation D-W Statistic p-value
   1      -0.1129573      2.211283   0.926
 Alternative hypothesis: rho != 0

From the Durbin Waston test, we found out that p value is 0.834. This indictes positive autocorrelation in the model. P value is grater then 0.05, we can say that the model is insignificant and we fail to reject the null hypothesis(Ha).

  shapiro.test(crestlm$residuals)

    Shapiro-Wilk normality test

data:  crestlm$residuals
W = 0.83777, p-value = 0.01522

From the Shapiro-wilk normality test, after observing the P value of 0.015. We can say that the normality is not violated here as p vale is smaller then 0.05. Hence, we can assume the normality as the distribution of data are not significantly different from normal distribution.

  ncvTest(crestlm)
Non-constant Variance Score Test 
Variance formula: ~ fitted.values 
Chisquare = 0.07424735, Df = 1, p = 0.78525

Here, we can see that p value is greater then 0.05. therefore, we can say that the constant variance assumptions is violated here as we fail to reject the null hypothesis.

d) Highlight and check possible problems (such as multicollinearity, …).

Here, we will use VIF function to check for multi collinearity.


#vif
vif(crestlm)
                 Crest.Budget.X1                         Ratio.X2 Us.Personal.disposable.income.x3 
                       11.421674                         2.865841                         7.443232 

From the above VIF Functions, we can say that Crest Budget X1 shows Multi collinearity as it has a value of 11.42 which is greater then 10. For Ratio X2 we can say that there is no Multi collinearity as 2.86 is less then 10. For US Personal Disposable Income X3 shows value of 7.44 which is less than 10 but greater then 5. So, we can say that there maybe a issue of collinearity.

e) Model building comparing forward, backward and stepwise regression procedures.

Now in this step, we will build and compare diffrent models.

#full model shoul contains all the variables 
full=lm(Crest.Sales.Y ~., data=crest)

To create a backward step model, we have created a variable Full which contain all the variables. In Backward step, we will use Full variable, which will eliminate predictors one by one.


# null model contains no variable
null=lm(Crest.Sales.Y ~1, data=crest)

To create a Forward variable, we have created a null variable which doesn’t contain any variable. We will use this null variable in every step and we will add on one by one predictors in Forward step model.


#Backward elimination using AIC values
step(crestlm, data=crest, direction="backward")
Start:  AIC=259.96
Crest.Sales.Y ~ Crest.Budget.X1 + Ratio.X2 + Us.Personal.disposable.income.x3

                                   Df  Sum of Sq        RSS    AIC
<none>                                            916674966 259.96
- Ratio.X2                          1  158364757 1075039723 260.19
- Crest.Budget.X1                   1  329414202 1246089168 262.26
- Us.Personal.disposable.income.x3  1 2109684588 3026359554 274.68

Call:
lm(formula = Crest.Sales.Y ~ Crest.Budget.X1 + Ratio.X2 + Us.Personal.disposable.income.x3, 
    data = crest)

Coefficients:
                     (Intercept)                   Crest.Budget.X1                          Ratio.X2  
                       34104.559                             3.746                        -30046.343  
Us.Personal.disposable.income.x3  
                          85.926  

Here we have performed Backward elimination method to check the best small parsimonious model Using AIC approach.

Here, we can see that the AIC was 259.96 with ll the three varibles present. In this step, we found our best model in the first step only with the lowest AIC.

The co-efficient of the final model is 34104.559 for the intercept, 3.746 for crest Budget X1, -30046.343 for Ratio X2 and 85.926 for US personal disposable income X3 variables.

Now, We will build a model using forward step.


#forward selection using AIC values
step(null, scope=list(lower=null, upper=crestlm), direction="forward")
Start:  AIC=302.64
Crest.Sales.Y ~ 1

                                   Df  Sum of Sq        RSS    AIC
+ Us.Personal.disposable.income.x3  1 2.8411e+10 1.2467e+09 260.27
+ Crest.Budget.X1                   1 2.5611e+10 4.0466e+09 276.75
+ Ratio.X2                          1 1.0637e+10 1.9020e+10 298.42
<none>                                           2.9658e+10 302.63

Step:  AIC=260.27
Crest.Sales.Y ~ Us.Personal.disposable.income.x3

                  Df Sum of Sq        RSS    AIC
+ Crest.Budget.X1  1 171624035 1075039723 260.19
<none>                         1246663758 260.27
+ Ratio.X2         1    574590 1246089168 262.26

Step:  AIC=260.19
Crest.Sales.Y ~ Us.Personal.disposable.income.x3 + Crest.Budget.X1

           Df Sum of Sq        RSS    AIC
+ Ratio.X2  1 158364757  916674966 259.96
<none>                  1075039723 260.19

Step:  AIC=259.96
Crest.Sales.Y ~ Us.Personal.disposable.income.x3 + Crest.Budget.X1 + 
    Ratio.X2


Call:
lm(formula = Crest.Sales.Y ~ Us.Personal.disposable.income.x3 + 
    Crest.Budget.X1 + Ratio.X2, data = crest)

Coefficients:
                     (Intercept)  Us.Personal.disposable.income.x3                   Crest.Budget.X1  
                       34104.559                            85.926                             3.746  
                        Ratio.X2  
                      -30046.343  

In this Forward step model building, we will start with AIC of 302.64 and we will add Us Disposable income X3 at first and after adding our AIC becomes 260.27. In the second step, we will add Crest Budget X1 and after adding that out AIC becomes 260.19. At the last, we will add our 3rd and last predictor i.e. Ratio X2 and after that AIC becomes 259.96

So our Final Model has AIC of 259.96. The Co-efficients of our final model is: * Intercept: 34104.559 * Us Personal Disposable Income X3: 85.926 * Crest Budget X1: 3.746 Ratio X2: -30046.343

Now, we will build a model using Step wise regression


#stepwise regression using AIC values
step(null, scope = list(upper=crestlm), data=Housing, direction="both")
Start:  AIC=302.64
Crest.Sales.Y ~ 1

                                   Df  Sum of Sq        RSS    AIC
+ Us.Personal.disposable.income.x3  1 2.8411e+10 1.2467e+09 260.27
+ Crest.Budget.X1                   1 2.5611e+10 4.0466e+09 276.75
+ Ratio.X2                          1 1.0637e+10 1.9020e+10 298.42
<none>                                           2.9658e+10 302.63

Step:  AIC=260.27
Crest.Sales.Y ~ Us.Personal.disposable.income.x3

                                   Df  Sum of Sq        RSS    AIC
+ Crest.Budget.X1                   1 1.7162e+08 1.0750e+09 260.19
<none>                                           1.2467e+09 260.27
+ Ratio.X2                          1 5.7459e+05 1.2461e+09 262.26
- Us.Personal.disposable.income.x3  1 2.8411e+10 2.9658e+10 302.63

Step:  AIC=260.19
Crest.Sales.Y ~ Us.Personal.disposable.income.x3 + Crest.Budget.X1

                                   Df  Sum of Sq        RSS    AIC
+ Ratio.X2                          1  158364757  916674966 259.96
<none>                                           1075039723 260.19
- Crest.Budget.X1                   1  171624035 1246663758 260.27
- Us.Personal.disposable.income.x3  1 2971530267 4046569990 276.75

Step:  AIC=259.96
Crest.Sales.Y ~ Us.Personal.disposable.income.x3 + Crest.Budget.X1 + 
    Ratio.X2

                                   Df  Sum of Sq        RSS    AIC
<none>                                            916674966 259.96
- Ratio.X2                          1  158364757 1075039723 260.19
- Crest.Budget.X1                   1  329414202 1246089168 262.26
- Us.Personal.disposable.income.x3  1 2109684588 3026359554 274.68

Call:
lm(formula = Crest.Sales.Y ~ Us.Personal.disposable.income.x3 + 
    Crest.Budget.X1 + Ratio.X2, data = crest)

Coefficients:
                     (Intercept)  Us.Personal.disposable.income.x3                   Crest.Budget.X1  
                       34104.559                            85.926                             3.746  
                        Ratio.X2  
                      -30046.343  

In this Step-wise regression model, we will start with AIC of 302.64 and then add Crest sales Y in our model. After that, we will add US personal disposable income X3 and our AIC becomes 260.27. Similarly we will keep on adding and subtracting variables, until at the end we found we found our AIC at lowest. In the last step, our AIC is 259.96 .

The Co_efficient are: * Intercept: 34104.559 * US Personal Income X3: 85.926 * Crest Budget X1: 3.746 * Ratio X2: -30046.343

LS0tDQp0aXRsZTogIk1BVEgxMzEyIFJlZ3Jlc3Npb24gQW5hbHlzaXMgU2VtZXN0ZXIgMSwgMjAyMSINCmF1dGhvcjogIlN1bm55IEt1bWFyIFZhaXNobm92KHMzODIyMjk1KSINClN0dWRlbnQgbm8uOiBTMzgyMjI5NQ0Kb3V0cHV0Og0KICBodG1sX25vdGVib29rOiBkZWZhdWx0DQogIGh0bWxfZG9jdW1lbnQ6DQogICAgZGZfcHJpbnQ6IHBhZ2VkDQogIHdvcmRfZG9jdW1lbnQ6IGRlZmF1bHQNCiAgcGRmX2RvY3VtZW50OiBkZWZhdWx0DQpzdWJ0aXRsZTogQXNzaWdubWVudCAyDQotLS0NCg0KIyMgUXVlc3Rpb24gMTogKE5hbWUgb2YgRGF0YSBmaWxlOiBMaXZlcikNCkFuIGV4cGVyaW1lbnQgd2FzIGNvbmR1Y3RlZCB0byBpbnZlc3RpZ2F0ZSB0aGUgYW1vdW50IG9mIGRydWcgcmV0YWluZWQgaW4gdGhlIGxpdmVyIG9mIGEgcmF0LiBOaW5ldGVlbiByYXRzIHdlcmUgY2hvc2VuIGZvciB0aGUgZXhwZXJpbWVudCBhbmQgZWFjaCByYXQgd2FzIGFkbWluaXN0ZXJlZCBhIGRvc2Ugb2YgdGhlIGRydWcuIEFmdGVyIGEgZml4ZWQgbGVuZ3RoIG9mIHRpbWUsIHRoZSByYXQgd2FzIHNhY3JpZmljZWQsIHRoZSBsaXZlciB3ZWlnaGVkIGFuZCB0aGUgcGVyY2VudGFnZSBvZiB0aGUgZG9zZSBpbiB0aGUgbGl2ZXIgZGV0ZXJtaW5lZC4gVGhlIHF1ZXN0aW9ucyBjYW4gYmUgYXR0ZW1wdGVkIHVzaW5nIHdoYXRldmVyIGlzIG1vc3QgY29udmVuaWVudCwgYSBjb21wdXRlciBwYWNrYWdlIG9yIGhhbmQgY2FsY3VsYXRpb25zLiBXaGVuIGNvbXB1dGVyIHNvZnR3YXJlIGlzIHVzZWQgeW91IG5lZWQgdG8gaW5jbHVkZSB0aGUgb3V0cHV0IGFuZCBjb2RlIHlvdSB1c2VkIChvciBkZXRhaWxzIG9uIHRoZSBzdGVwcyB5b3UgZm9sbG93ZWQpIHRvIGdlbmVyYXRlIHRoZSBvdXRwdXQuDQpUaGUgdmFyaWFibGVzIGFyZToNClgxID0gYm9keSB3ZWlnaHQgb2YgcmF0DQpYMiA9IHdlaWdodCBvZiBsaXZlcg0KWDMgPSBkb3NlIGdpdmVuDQpZID0gcGVyY2VudGFnZSBvZiBkb3NlIGluIGxpdmVyLg0KDQoNCmBgYHtyLCBlY2hvID0gVFJVRSwgd2FybmluZ3MgPSBGQUxTRX0NCg0KbGlicmFyeShyZWFkcikNCmxpYnJhcnkoZHBseXIpDQpsaWJyYXJ5KHRpZHl2ZXJzZSkNCmxpYnJhcnkoY2FyKQ0KYGBgDQoNCldlIGhhdmUgaW1wb3J0ZWQgdGhlIG5lY2Vzc2FyeSBwYWNrYWdlcyBpbnRvIFIgd2hpY2ggd2lsbCBjb21lIGhhbmR5IGluIG91ciBmdXJ0aGVyIGFzc2lnbm1lbnQuDQoNCg0KYGBge3IsIGVjaG8gPSBUUlVFLCB3YXJuaW5ncyA9IEZBTFNFfQ0KDQojaW1wb3J0IHRoZSBkYXRhDQpsaXZlciA8LSByZWFkLmNzdigibGl2ZXIuY3N2IikNCmxpdmVyDQpgYGANCkhlcmUgd2UgaGF2ZSBpbXBvcnRlZCB0aGUgZGF0YSBpbnRvIFIgYW5kIGhhdmUgYSBnbGltcHNlIGF0IG91ciAiTGl2ZXIiIGRhdGFzZXQuDQoNCmBgYHtyLCBlY2hvID0gVFJVRSwgd2FybmluZ3MgPSBGQUxTRX0NCiNjb252ZXJ0IGludG8gbWF0cml4DQpsaXZlcm1hdHJpeCA8LSBkYXRhLm1hdHJpeChsaXZlcikNCmxpdmVybWF0cml4DQoNCiNjaGVjayBjbGFzcw0KY2xhc3MobGl2ZXJtYXRyaXgpDQpgYGANCg0KV2UgaGF2ZSBjb252ZXJ0ZWQgdGhlIExpdmVyIGRhdGEgZnJhbWUgaW50byBtYXRyaXggYW5kIGNvbmZpcm1lZCBpdCBieSBjaGVja2luZyB0aGUgY2xhc3Mgb2YgdGhlIG1hdHJpeC4NCg0KYGBge3IsIGVjaG8gPSBUUlVFLCB3YXJuaW5ncyA9IEZBTFNFfQ0KDQojY29udmVydCB4IGFuZCB5IG1hdHJpeA0KeF9tYXRyaXggPC0gbGl2ZXIgJT4lIHNlbGVjdCgxLDIsMykNCnggPC0gZGF0YS5tYXRyaXgoeF9tYXRyaXgpDQp4IDwtIGNiaW5kKGMoMSkseCkNCngNCg0KeV9tYXRyaXggPC0gbGl2ZXIgJT4lIHNlbGVjdCg0KQ0KDQoNCg0KeSA8LSBkYXRhLm1hdHJpeCh5X21hdHJpeCkNCnkNCmBgYA0KSW4gYWJvdmUgc3RlcCwgd2UgaGF2ZSBjcmVhdGVkIHR3byBkaWZmZXJlbnQgbWF0cml4IGFuZCBuYW1lZCBhcyAiWCIgYW5kICJZIiBtYXRyaXguIA0KRm9yIHNvbHZpbmcgUXVlc3Rpb24gMWEsIHdlIG5lZWQgdG8gYWRkIGEgZHVtbXkgdmFyaWFibGUgaW4gbWF0cml4ICJYIiB3aXRoIHZhbHVlcyAiMSIuIA0KTm93IHdlIHdpbGwgc29sdmUgUXVlc3Rpb24gMWEuDQoNCiMjIChhKSBGaW5kIHRoZSBtYXRyaXggKFjigLJYKeKIkjEgd2hlcmUgWCBpcyB0aGUgZGVzaWduIG1hdHJpeC4NCmBgYHtyLCBlY2hvID0gVFJVRSwgd2FybmluZ3MgPSBGQUxTRX0NCg0KI1ExYQ0KIyBYJw0KVHggPC0gdCh4KQ0KVHgNCiN4J3gNCnh4IDwtIFR4JSoleA0KeHgNCiMoeCd4KS0xLi4uLmludmVyc2UNCmludmVyc2VfeCA8LSBzb2x2ZSh4eCkNCmludmVyc2VfeA0KDQpgYGANCg0KSW4gdGhlIEFib3ZlIHN0ZXAsIHdlIGhhdmUgZG9uZSB0cmFuc3Bvc2Ugb2YgbWF0cml4IFggYW5kIG5hbWVkIGFzICJUeCIuIEFmdGVyIHRoZSB0cmFuc3Bvc2UsIHdlIGhhdmUgbXVsdGlwbGllZCB0aGF0IHdpdGggKipYKiogbWF0cml4IGFuZCBuYW1lZCB0aGF0IG1hdHJpeCBhcyAqKlhYKiouIEF0IHRoZSBlbmQgdG8gZmluZCB0aGUgaW52ZXJzZSwgKioiU29sdmUiKiogZnVuY3Rpb24gd2FzIHVzZWQgYW5kIG5hbWVkIGFzICoqaW52ZXJzZV94KiouDQoNCiMjIGIpIERldGVybWluZSB0aGUgZXF1YXRpb24gb2YgYmVzdCBmaXQgcmVsYXRpbmcgdGhlIHJlc3BvbnNlIFkgdG8gdGhlIHRocmVlIHByZWRpY3RvcnMNCg0KYGBge3IsIGVjaG8gPSBUUlVFLCB3YXJuaW5ncyA9IEZBTFNFfQ0KcTIgPC0gbG0oWX5CZHlXdCtMdnJXdCtEb3NlLCBsaXZlcikNCnN1bW1hcnkocTIpDQoNCmBgYA0KSW4gdGhlIGFib3ZlIHN0ZXAsIHdlIGhhdmUgY2FsY3VsYXRlZCB0aGUgZXF1YXRpb24gb2YgYmVzdCBmaXQgYnkgdXNpbmcgKipsbSoqIGZ1bmN0aW9uLg0KV2UgaGF2ZSB1c2VkIGFsbCB0aGUgMyB2YXJpYWJsZXMgb2YgWCBhcyByZXNwb3Nuc2UgdG8gWSB2YXJpYWJsZS4NClRocm91Z2ggYWJvdmUgc3RlcCwgd2UgZm91bmQgdGhlIGVxdWF0aW9uIG9mIGJlc3QgZml0IGFzOg0KDQoqKlleID0gMC4yNiAtIDAuMjFYMSArIDAuMDFYMiArIDQuMTdYMy4qKg0KDQpXZSBjYW4gYWxzbyBzZWUgdGhhdCB0aGUgUC12YWx1ZSBpcyBzbWFsbGVyIHRoZW4gMC4wNSwgdGhlcmVmb3JlIHdlIGNhbiBzYXkgdGhhdCB0aGUgbW9kZWwgaXMgc2lnbmlmaWNhbnQgYW5kIHdlIGNhbiByZWplY3QgSDAuIE11bHRpcGxlIFIgc3F1YXJlIGlzIDAuMzYgYW5kIEFkanVzdGVkIFItIHNxdWFyZSBpcyBvYnNlcnZlZCBhcyAwLjIzLg0KDQojIyBjKSBQZXJmb3JtIEFOT1ZBIHRvIGFzc2VzcyB0aGUgYWRlcXVhY3kgb2YgdGhlIG1vZGVsIGFuZCBhbHNvIGluZGl2aWR1YWwgVCB0ZXN0cyBvbiB0aGUgY29lZmZpY2llbnRzLiBXaGljaCBwcmVkaWN0b3JzIGNhbiBiZSBsZWZ0IG91dCBvZiB0aGUgbW9kZWw/IEV4cGxhaW4uDQpgYGB7ciwgZWNobyA9IFRSVUUsIHdhcm5pbmdzID0gRkFMU0V9DQojIEFub3ZhDQphbm92YShxMikNCmBgYA0KSW4gdGhlIGFib3ZlIHdlIGNhbiB0aGUgdmFsdWVzIG9mIFN1bSBzcXVhcmUgb2YgcmVzaWR1YWxzICgwLjA4OSkgYW5kIHRoZSBYMSAoMC4wMDMpLCBYMigwLjAwMyksIFgzKDAuNDQpIGFuZCB0aGUgbWVhbiBzcXVhcmVzIGFzIHdlbGwgb2YgYm90aCB0aGUgdmFsdWVzLiBBTk9WQSB0YWJsZSBhbHNvIGhpZ2hsaWdodHMgdGhlIEYgdmFsdWUgYW5kIHRoZSBQUiB2YWx1ZSBhcyByZXNwZWN0aXZlIHRvIEYuIEluIHRoaXMgY2FzZSB0aGUgRiB2YWx1ZXMgYXJlIFgxKG8uNTM4KSwgWDIoMC41MTMpIGFuZCBYMyg3LjUyOSkuICANCg0KTm93LCB3ZSB3aWxsIHBlcmZvcm0gaW5kaXZpZHVhbCB0IHRlc3Qgb24gdGhlIENvLWVmZmljaWVudHMuDQoNCiMgSW5kaXZpZHVhbCBULXRlc3QgZm9yIHRoZSBjby1lZmZpY2llbnRzOg0KDQpgYGB7ciwgZWNobyA9IFRSVUUsIHdhcm5pbmdzID0gRkFMU0V9DQoNCiN4MSB0dGVzdA0KdC50ZXN0KGxpdmVyJEJkeVd0KQ0KYGBgDQpJbiB0aGUgcmVzdWx0IGFib3ZlIDoNCg0KdCBpcyB0aGUgdC10ZXN0IHN0YXRpc3RpYyB2YWx1ZSAodCA9IDQ1LjM0KSwNCmRmIGlzIHRoZSBkZWdyZWVzIG9mIGZyZWVkb20gKGRmPSAxOCksDQpwLXZhbHVlIGlzIHRoZSBzaWduaWZpY2FuY2UgbGV2ZWwgb2YgdGhlIHQtdGVzdCAocC12YWx1ZSA8MC4wNSkuDQpjb25mLmludCBpcyB0aGUgY29uZmlkZW5jZSBpbnRlcnZhbCBvZiB0aGUgbWVhbiBhdCA5NSUgKGNvbmYuaW50ID0gWzE2My41NywgMTc5LjQ3XSk7DQpzYW1wbGUgZXN0aW1hdGVzIGlzIGhlIG1lYW4gdmFsdWUgb2YgdGhlIHNhbXBsZSAobWVhbiA9IDE3MS41MjYzKS4NCg0KVGhlIHAtdmFsdWUgb2YgdGhlIHRlc3QgaXMgc21hbGxlciB0aGVuIDAuMDUuIA0KYGBge3IsIGVjaG8gPSBUUlVFLCB3YXJuaW5ncyA9IEZBTFNFfQ0KI3gyIHR0ZXN0DQp0LnRlc3QobGl2ZXIkTHZyV3QpDQpgYGANCg0KSW4gdGhlIHJlc3VsdCBhYm92ZSA6DQoNCnQgaXMgdGhlIHQtdGVzdCBzdGF0aXN0aWMgdmFsdWUgKHQgPSAyNy44NCksDQpkZiBpcyB0aGUgZGVncmVlcyBvZiBmcmVlZG9tIChkZj0gMTgpLA0KcC12YWx1ZSBpcyB0aGUgc2lnbmlmaWNhbmNlIGxldmVsIG9mIHRoZSB0LXRlc3QgKHAtdmFsdWUgPDAuMDUpLg0KY29uZi5pbnQgaXMgdGhlIGNvbmZpZGVuY2UgaW50ZXJ2YWwgb2YgdGhlIG1lYW4gYXQgOTUlIChjb25mLmludCA9IFs3LjIyMSwgOC4zOTldKTsNCnNhbXBsZSBlc3RpbWF0ZXMgaXMgaGUgbWVhbiB2YWx1ZSBvZiB0aGUgc2FtcGxlIChtZWFuID0gNy44MTApLg0KDQpUaGUgcC12YWx1ZSBvZiB0aGUgdGVzdCBpcyBzbWFsbGVyIHRoZW4gMC4wNS4gDQoNCmBgYHtyLCBlY2hvID0gVFJVRSwgd2FybmluZ3MgPSBGQUxTRX0NCiN4MyB0dGVzdA0KdC50ZXN0KGxpdmVyJERvc2UpDQpgYGANCg0KDQpJbiB0aGUgcmVzdWx0IGFib3ZlIDoNCg0KdCBpcyB0aGUgdC10ZXN0IHN0YXRpc3RpYyB2YWx1ZSAodCA9IDQzLjc5NyksDQpkZiBpcyB0aGUgZGVncmVlcyBvZiBmcmVlZG9tIChkZj0gMTgpLA0KcC12YWx1ZSBpcyB0aGUgc2lnbmlmaWNhbmNlIGxldmVsIG9mIHRoZSB0LXRlc3QgKHAtdmFsdWUgPDAuMDUpLg0KY29uZi5pbnQgaXMgdGhlIGNvbmZpZGVuY2UgaW50ZXJ2YWwgb2YgdGhlIG1lYW4gYXQgOTUlIChjb25mLmludCA9IFswLjgyMCwgMC45MDNdKTsNCnNhbXBsZSBlc3RpbWF0ZXMgaXMgaGUgbWVhbiB2YWx1ZSBvZiB0aGUgc2FtcGxlIChtZWFuID0gMC44NjIpLg0KDQpUaGUgcC12YWx1ZSBvZiB0aGUgdGVzdCBpcyBzbWFsbGVyIHRoZW4gMC4wNS4gDQoNCg0KKipBZnRlciBjYXJlZnVsIGV2YWx1YXRpb24gYW5kIHBlcmZvcm1pbmcgb25lIHR0ZXN0IG9uIGFsbCBwZXJkaWN0b3JzLCB3ZSBjYW4gc2F5IHRoYXQgTGl2ZXIgd2VpZ2h0IGhhcyB0aGUgbG93ZXN0IHQgdmFsdWUsIHRoZXJlZm9yZSB0aGlzIG9uZSBjYW4gYmUgbGVmdCBvdXQgb2YgdGhlIG1vZGVsLioqDQoNCiMjIGQpIENoZWNrIGZvciBtdWx0aWNvbGxpbmVhcml0eSBiZXR3ZWVuIHRoZSBwcmVkaWN0b3JzIHVzaW5nIGVpdGhlciB0aGUgY29ycmVsYXRpb24gbWF0cml4IG9yIHRoZSBWSUYgdmFsdWVzLiBXaGljaCBwYWlyKHMpIG9mIHByZWRpY3RvcnMgYXJlIHN0cm9uZ2x5IGNvcnJlbGF0ZWQ/DQpgYGB7ciwgZWNobyA9IFRSVUUsIHdhcm5pbmdzID0gRkFMU0V9DQoNCiMxZA0KdmlmKHEyKQ0KYGBgDQogDQpUbyBjaGVjayB0aGUgbXVsdGkgY29sbGluZWFyaXR5IGJldHdlZW4gdGhlIHByZWRpY3RvcnMsIHdlIGhhdmUgdXNlZCAqKlZJRioqIEZ1bmN0aW9uLiANCkFmdGVyIGFuYWx5emluZyB0aGUgVklGIHZhbHVlcywgd2UgY2FuIHNheSB0aGF0IHByZWRpY3RvcnMgKipCb2R5IHdlaWdodCoqIGFuZCAqKkRvc2UqKiBhcmUgc3Ryb25nbHkgY29ycmVsYXRlZCB3aXRoIHZhbHVlcyBvZiA1Mi4xMCBhbmQgNTEuNDIgcmVzcGVjdGl2ZWx5LiBXaGlsZSAqKkxpdmVyIHdlaWdodCoqIGhhcyB2YWx1ZSBvZiAxLjMzLg0KDQpIZXJlLCB3ZSBjYW4gc2VlIE11bHRpY29sbGluZWFyaXR5IGluIEJvdGggKipCb2R5IHdlaWdodCoqICBhbmQgKipEb3NlKiogVmFyaWFibGVzIGFzIHRoZWlyIHZhbHVlcyBhcmUgZ3JlYXRlciB0aGVuIDEwLCB3aGlsZSBUaGUgdmFsdWUgb2YgKipMaXZlciB3ZWlnaHQqKiBpcyBsZXNzIHRoZW4gMTAsIHdlIGNhbiBzYXkgdGhhdCBpdCBkb2Vzbid0IGhhdmUgbXVsdGljb2xsaW5lYXJpdHkuDQoNCiMjIGUpIFVzZSBCYWNrd2FyZCBFbGltaW5hdGlvbiBzdGFydGluZyB3aXRoIGFsbCB0aHJlZSBwcmVkaWN0b3JzIFgxLCBYMiBhbmQgWDMgdG8gY29tZSB1cCB3aXRoIGEgc21hbGxlciBwYXJzaW1vbmlvdXMgbW9kZWwuIChVc2UgRnN0YXkgPSA0KS4NCg0KYGBge3IsIGVjaG8gPSBUUlVFLCB3YXJuaW5ncyA9IEZBTFNFfQ0KIzFlDQpzdGVwKHEyLCBkYXRhPWxpdmVyLCBkaXJlY3Rpb24gPSAiYmFja3dhcmQiKQ0KDQpgYGANCkhlcmUgd2UgaGF2ZSBwZXJmb3JtZWQgQmFja3dhcmQgZWxpbWluYXRpb24gbWV0aG9kIHRvIGNoZWNrIHRoZSBiZXN0IHNtYWxsIHBhcnNpbW9uaW91cyBtb2RlbCBVc2luZyBBSUMgYXBwcm9hY2guDQoNCldlIGNhbiBzZWUgaW4gdGhlIGJlZ2lubmluZyBBSUMgd2FzIDkzLjc4IHdpdGggYWxsIHRoZSB0aHJlZSB2YXJpYWJsZXMuIEFmdGVyIHRoZSBuZXh0IHN0ZXAsIEFJQyBpbmNyZWFzZWQgdG8gOTQuNDIgYW5kICoqTGl2ZXIgV2VpZ2h0KiogdmFyaWFibGUgd2FzIHJlbW92ZWQuIA0KVGhlcmVmb3JlLCBBZnRlciBiYWNrd2FyZCBlbGltaW5hdGlvbiwgb3VyIEZpbmFsIG1vZGVsIGNvbnRhaW5zICoqKmJvZHkgd2VpZ2h0KiogYW5kICoqRG9zZSoqIHZhcmlhYmxlcy4gVGhlIGNvLWVmZmljaWVudCBvZiB0aGUgZmluYWwgbW9kZWwgaXMgMC4yODUgZm9yIHRoZSBpbnRlcmNlcHQsIC0wLjAyMCBmb3IgKipCb2R5IHdlaWdodCoqIGFuZCA0LjEyNSBmb3IgKipEb3NlKiogdmFyaWFibGVzLg0KDQoNCg0KDQojIyBRdWVzdGlvbiAyOiBUaGlzIHF1ZXN0aW9uIHVzZXMgdGhlIENyZXN0IFRvb3RocGFzdGUgU2FsZXMgRGF0YSBmaWxlLiBUaGUgcXVlc3Rpb25zIGNhbiBiZSBhdHRlbXB0ZWQgdXNpbmcgd2hhdGV2ZXIgaXMgbW9zdCBjb252ZW5pZW50LCBhIGNvbXB1dGVyIHBhY2thZ2Ugb3IgaGFuZCBjYWxjdWxhdGlvbnMuIFdoZW4gY29tcHV0ZXIgc29mdHdhcmUgaXMgdXNlZCB5b3UgbmVlZCB0byBpbmNsdWRlIHRoZSBvdXRwdXQgYW5kIGNvZGUgeW91IHVzZWQgKG9yIGRldGFpbHMgb24gdGhlIHN0ZXBzIHlvdSBmb2xsb3dlZCkgdG8gZ2VuZXJhdGUgdGhlIG91dHB1dC4gV3JpdGUgYSBjb21wcmVoZW5zaXZlIHJlcG9ydCAoaW5jbHVkaW5nIHRoZSBvdXRwdXRzIGFuZCBkaXNjdXNzaW9uKSBiYXNlZCBvbiB5b3VyIGZpbmRpbmdzIGNvbmNlcm5pbmcgdGhlIGZvbGxvd2luZyBpdGVtczoNCg0KYGBge3IsIGVjaG8gPSBUUlVFLCB3YXJuaW5ncyA9IEZBTFNFfQ0KY3Jlc3QgPC0gcmVhZC5jc3YoImNyZXN0LmNzdiIpDQpjcmVzdA0KYGBgDQpJbiB0aGUgYWJvdmUgc3RlcCwgd2UgaGF2ZSBpbXBvcnRlZCBDcmVzdCBkYXRhIGZyYW1lIGFuZCBub3cgd2Ugd2lsbCBwZXJmb3JtIG91ciBldmFsdWF0aW9uIG9uIGl0Lg0KDQojIyBhKSBJcyB0aGUgbW9kZWwgdXNpbmcgYWxsIHRoZSBwcmVkaWN0b3JzIHNpZ25pZmljYW50Pw0KDQpUbyBjaGVjayB0aGF0LCB3ZSBoYXZlIHRvIG1ha2UgYSBtb2RlbCB1c2luZyAqKmxtKiogZnVuY3Rpb24uDQoNCmBgYHtyLCBlY2hvID0gVFJVRSwgd2FybmluZ3MgPSBGQUxTRX0NCg0KIyBsbSBtb2RlbA0KDQpjcmVzdGxtIDwtIGxtKENyZXN0LlNhbGVzLll+Q3Jlc3QuQnVkZ2V0LlgxK1JhdGlvLlgyK1VzLlBlcnNvbmFsLmRpc3Bvc2FibGUuaW5jb21lLngzLCBkYXRhPWNyZXN0KQ0Kc3VtbWFyeShjcmVzdGxtKQ0KYGBgDQoNCkZyb20gdGhlIGFib3ZlIG1vZGVsLCBXZSBjYW4gc2VlIHRoZSBwcmVkaWN0b3JzIHZhbHVlcyBvZiBldmVyeSB2YXJpYWJsZS4gDQpGcm9tIHRoaXMgd2UgY2FuIHNheSB0aGF0LCAqKmNyZXN0IEJ1ZGdldCBYMSoqLCAqKnJhdGlvIFgyKiogYW5kICoqUmF0aW8gWDIqKiBoYXMgUCB2YWx1ZSBvZiAwLjA4MiwgMC4wODcgYW5kIDAuMjE4IHJlc3BlY3RpdmVseS4gVGhlcmVmb3JlLCB3ZSBjYW4gc2F5IHRoYXQgdGhlc2UgdmFyaWFibGVzIGFyZSBpbnNpZ25pZmljYW50IGFzIHRoZWlyIFAgdmFsdWUgaXMgZ3JlYXRlciB0aGVuIDAuMDUuIFdoZXJlYXMgKipVUyBwZXJzb25hbCBkaXNwb3NhYmxlIGluY29tZSBYMyoqIGhhcyBwIHZhbHVlIG9mIDAuMDAwNyB3aGljaCBpcyBzbWFsbGVyIHRoZW4gMC4wNS4gVGhlcmVmb3JlLCB3ZSBjYW4gc2F5IHRoYXQgdGhpcyBpcyBzaWduaWZpY2FudC4gDQoNCiMjIGIpIEZyb20gdGhlIG91dHB1dCwgd2hpY2ggdmFyaWFibGVzIGFyZSBpbXBvcnRhbnQ/DQouDQpgYGB7ciwgZWNobyA9IFRSVUUsIHdhcm5pbmdzID0gRkFMU0V9DQojYW5vdmENCmFub3ZhKGNyZXN0bG0pDQpgYGANCkZyb20gdGhlIGFib3ZlIEFub3ZhIHRlc3QsIHdlIGNhbiBzZWUgdGhhdCB0aGUgUCB2YWx1ZXMgb2YgKipDcmVzdCBCdWRnZXQgWDEqKiwqKnJhdGlvIFgyKiosIGFuZCAqKlVTIHBlcnNvbmFsIERpc3Bvc2FibGUgaW5jb21lcyoqIGFyZSBzbWFsbGVyIHRoZW4gMC4wNS4gU28gd2UgY2FuIHNheSB0aGF0IGFsbCB0aGUgdmFsdWVzIGFyZSBzaWduaWZpY2FudCBhbmQgdGh1cywgYWxsIHZhcmlhYmxlcyBhcmUgaW1wb3J0YW50Lg0KDQoNCiMjIGMpIEFyZSB0aGUgYXNzdW1wdGlvbnMgZ292ZXJuaW5nIHRoZSByZXNpZHVhbHMgc2F0aXNmaWVkPyBXaGljaCBvZiB0aGVzZSBhc3N1bXB0aW9ucyBoYXZlIGJlZW4gdmlvbGF0ZWQ/DQoNClRvIGNoZWNrIGlmIGFueSBhc3N1bXB0aW9uIGlzIHZpb2xhdGVkIG9yIG5vdCwgd2UgaGF2ZSB0byBtYWtlIHZpc3VhbGl6ZSBmb2xsb3dpbmcgcGxvdHMgYW5kIG9uIHRoZSBiYXNpcyBvZiB0aGVtIHdlIHdpbGwgbWFrZSBvdXIgc3RhdGVtZW50Lg0KDQpgYGB7ciwgZWNobyA9IFRSVUUsIHdhcm5pbmdzID0gRkFMU0V9DQojYXNzdW1wdGlvbnMNCnBhcihtZnJvdyA9IGMoMiwyKSkNCnBsb3QoY3Jlc3RsbSkNCg0KYGBgDQpJbiB0aGUgYWJvdmUgcGxvdCB3ZSBjYW4gc2VlIDQgRGlhZ25vc3RpYyBwbG90cyBrbm93biBhcyBSZXNpZHVhbHMgcGxvdCwgUVEgcGxvdHMsIFNjYWxlLWxvY2F0aW9uIHBsb3QgYW5kIGxldmVyYWdlIHBsb3RzLg0KDQpJbiB0aGUgMXN0IGdyYXBoIHdlIGNhbiBzZWUgdGhhdCBvbiBYIGF4aXMgaGFzIHByZWRpY3RlZCB2YWx1ZSBrbm93biBhcyBZXih5IGhhdCkgYW5kIG9uIHkgYXhpcyB0aGVyZSBhcmUgcmVzaWR1YWxzIGFuZCBlcnJvcnMuIEhlcmUgd2UgY2FuIHRoZSBsaW5lIGlzIG5vdCBleGFjdGx5IGZsYXQgYnV0IHBvaW50cyBhcmUga2luZCBvZiBmYWxsaW5nIG5lYXIgdGhlIGxpbmUgb25seSBhbmQgdGhlIHJlZCBsaW5lIGlzIG5lYXJieSB0aGUgbGluZSBvbmx5LiBUaGVyZWZvcmUsIHdlIGNhbiBzYXkgdGhhdCB0aGF0IGxpbmVhcml0eSBhc3N1bXB0aW9uIGlzIG5vdCB2aW9sYXRlZCBoZXJlLg0KDQpJbiB0aGUgbmV4dCBHcmFwaCAoUVEgcGxvdCksIGhlcmUgeSBheGlzIGlzIG9yZGVyZWQsIG9ic2VydmVkIGFuZCBTdGFuZGFyZGl6ZWQgcmVzaWR1YWxzIGFuZCBvbiBYIGF4aXMgaXQgaGFzIG9yZGVyZWQgdGhlb3JldGljYWwgcmVzaWR1YWxzLiBJbiB0aGUgZ3JhcGggd2UgY2FuIHNlZSB0aGF0IHJlc2lkdWFscyBhcmUgdHJ1bHkgbm9ybWFsbHkgZGlzdHJpYnV0ZWQgYXMgYWxsIHRoZSBwb2ludHMgYXJlIGZhbGxpbmcgb24gYSBzdHJhaWdodCBsaW5lLg0KDQpUaGUgbmV4dCB0d28gc2hvd3MgdGhhdCB0aGUgcmVncmVzc2lvbiBpcyBub24tbGluZWFyLCBub24tY29uc3RhbnQgdmFyaWFuY2UuDQoNClRvIHRlc3QgZnVydGhlciwgaWYgYW55IGFzc3VtcHRpb25zIGFyZSB2aW9sYXRlZCBvciBub3QuIFdlIHdpbGwgcGVyZm9ybSBzb21lIHRlc3RzLg0KDQoNCmBgYHtyLCBlY2hvID0gVFJVRSwgd2FybmluZ3MgPSBGQUxTRX0NCg0KIGR1cmJpbldhdHNvblRlc3QoY3Jlc3RsbSkNCmBgYA0KRnJvbSB0aGUgRHVyYmluIFdhc3RvbiB0ZXN0LCB3ZSBmb3VuZCBvdXQgdGhhdCBwIHZhbHVlIGlzIDAuODM0LiBUaGlzIGluZGljdGVzIHBvc2l0aXZlIGF1dG9jb3JyZWxhdGlvbiBpbiB0aGUgbW9kZWwuIFAgdmFsdWUgaXMgZ3JhdGVyIHRoZW4gMC4wNSwgd2UgY2FuIHNheSB0aGF0IHRoZSBtb2RlbCBpcyBpbnNpZ25pZmljYW50IGFuZCB3ZSBmYWlsIHRvIHJlamVjdCB0aGUgbnVsbCBoeXBvdGhlc2lzKEhhKS4NCg0KYGBge3IsIGVjaG8gPSBUUlVFLCB3YXJuaW5ncyA9IEZBTFNFfQ0KICBzaGFwaXJvLnRlc3QoY3Jlc3RsbSRyZXNpZHVhbHMpDQpgYGANCkZyb20gdGhlIFNoYXBpcm8td2lsayBub3JtYWxpdHkgdGVzdCwgYWZ0ZXIgb2JzZXJ2aW5nIHRoZSBQIHZhbHVlIG9mIDAuMDE1LiBXZSBjYW4gc2F5IHRoYXQgdGhlIG5vcm1hbGl0eSBpcyBub3QgdmlvbGF0ZWQgaGVyZSBhcyBwIHZhbGUgaXMgc21hbGxlciB0aGVuIDAuMDUuIEhlbmNlLCB3ZSBjYW4gYXNzdW1lIHRoZSBub3JtYWxpdHkgYXMgdGhlIGRpc3RyaWJ1dGlvbiBvZiBkYXRhIGFyZSBub3Qgc2lnbmlmaWNhbnRseSBkaWZmZXJlbnQgZnJvbSBub3JtYWwgZGlzdHJpYnV0aW9uLg0KDQoNCmBgYHtyLCBlY2hvID0gVFJVRSwgd2FybmluZ3MgPSBGQUxTRX0NCiAgbmN2VGVzdChjcmVzdGxtKQ0KYGBgDQpIZXJlLCB3ZSBjYW4gc2VlIHRoYXQgcCB2YWx1ZSBpcyBncmVhdGVyIHRoZW4gMC4wNS4gdGhlcmVmb3JlLCB3ZSBjYW4gc2F5IHRoYXQgdGhlIGNvbnN0YW50IHZhcmlhbmNlIGFzc3VtcHRpb25zIGlzIHZpb2xhdGVkIGhlcmUgYXMgd2UgZmFpbCB0byByZWplY3QgdGhlIG51bGwgaHlwb3RoZXNpcy4NCg0KIyMgZCkgSGlnaGxpZ2h0IGFuZCBjaGVjayBwb3NzaWJsZSBwcm9ibGVtcyAoc3VjaCBhcyBtdWx0aWNvbGxpbmVhcml0eSwg4oCmKS4NCkhlcmUsIHdlIHdpbGwgdXNlICoqVklGKiogZnVuY3Rpb24gdG8gY2hlY2sgZm9yIG11bHRpIGNvbGxpbmVhcml0eS4NCg0KYGBge3IsIGVjaG8gPSBUUlVFLCB3YXJuaW5ncyA9IEZBTFNFfQ0KDQojdmlmDQp2aWYoY3Jlc3RsbSkNCg0KYGBgDQpGcm9tIHRoZSBhYm92ZSAqKlZJRioqIEZ1bmN0aW9ucywgd2UgY2FuIHNheSB0aGF0ICoqQ3Jlc3QgQnVkZ2V0IFgxKiogc2hvd3MgTXVsdGkgY29sbGluZWFyaXR5IGFzIGl0IGhhcyBhIHZhbHVlIG9mIDExLjQyIHdoaWNoIGlzIGdyZWF0ZXIgdGhlbiAxMC4gRm9yICoqUmF0aW8gWDIqKiB3ZSBjYW4gc2F5IHRoYXQgdGhlcmUgaXMgbm8gTXVsdGkgY29sbGluZWFyaXR5IGFzIDIuODYgaXMgbGVzcyB0aGVuIDEwLiBGb3IgKipVUyBQZXJzb25hbCBEaXNwb3NhYmxlIEluY29tZSBYMyoqIHNob3dzIHZhbHVlIG9mIDcuNDQgd2hpY2ggaXMgbGVzcyB0aGFuIDEwIGJ1dCBncmVhdGVyIHRoZW4gNS4gU28sIHdlIGNhbiBzYXkgdGhhdCB0aGVyZSBtYXliZSBhIGlzc3VlIG9mIGNvbGxpbmVhcml0eS4NCg0KIyMgZSkgTW9kZWwgYnVpbGRpbmcgY29tcGFyaW5nIGZvcndhcmQsIGJhY2t3YXJkIGFuZCBzdGVwd2lzZSByZWdyZXNzaW9uIHByb2NlZHVyZXMuDQoNCk5vdyBpbiB0aGlzIHN0ZXAsIHdlIHdpbGwgYnVpbGQgYW5kIGNvbXBhcmUgZGlmZnJlbnQgbW9kZWxzLiANCg0KYGBge3IsIGVjaG8gPSBUUlVFLCB3YXJuaW5ncyA9IEZBTFNFfQ0KI2Z1bGwgbW9kZWwgc2hvdWwgY29udGFpbnMgYWxsIHRoZSB2YXJpYWJsZXMgDQpmdWxsPWxtKENyZXN0LlNhbGVzLlkgfi4sIGRhdGE9Y3Jlc3QpDQpgYGANCg0KVG8gY3JlYXRlIGEgYmFja3dhcmQgc3RlcCBtb2RlbCwgd2UgaGF2ZSBjcmVhdGVkIGEgdmFyaWFibGUgKipGdWxsKiogd2hpY2ggY29udGFpbiBhbGwgdGhlIHZhcmlhYmxlcy4gSW4gQmFja3dhcmQgc3RlcCwgd2Ugd2lsbCB1c2UgKipGdWxsKiogdmFyaWFibGUsIHdoaWNoIHdpbGwgZWxpbWluYXRlIHByZWRpY3RvcnMgb25lIGJ5IG9uZS4NCg0KYGBge3IsIGVjaG8gPSBUUlVFLCB3YXJuaW5ncyA9IEZBTFNFfQ0KDQojIG51bGwgbW9kZWwgY29udGFpbnMgbm8gdmFyaWFibGUNCm51bGw9bG0oQ3Jlc3QuU2FsZXMuWSB+MSwgZGF0YT1jcmVzdCkNCmBgYA0KDQpUbyBjcmVhdGUgYSBGb3J3YXJkIHZhcmlhYmxlLCB3ZSBoYXZlIGNyZWF0ZWQgYSAqKm51bGwqKiB2YXJpYWJsZSB3aGljaCBkb2Vzbid0IGNvbnRhaW4gYW55IHZhcmlhYmxlLiBXZSB3aWxsIHVzZSB0aGlzICoqbnVsbCoqIHZhcmlhYmxlIGluIGV2ZXJ5IHN0ZXAgYW5kIHdlIHdpbGwgYWRkIG9uIG9uZSBieSBvbmUgcHJlZGljdG9ycyBpbiBGb3J3YXJkIHN0ZXAgbW9kZWwuDQoNCmBgYHtyLCBlY2hvID0gVFJVRSwgd2FybmluZ3MgPSBGQUxTRX0NCg0KI0JhY2t3YXJkIGVsaW1pbmF0aW9uIHVzaW5nIEFJQyB2YWx1ZXMNCnN0ZXAoY3Jlc3RsbSwgZGF0YT1jcmVzdCwgZGlyZWN0aW9uPSJiYWNrd2FyZCIpDQpgYGANCg0KSGVyZSB3ZSBoYXZlIHBlcmZvcm1lZCBCYWNrd2FyZCBlbGltaW5hdGlvbiBtZXRob2QgdG8gY2hlY2sgdGhlIGJlc3Qgc21hbGwgcGFyc2ltb25pb3VzIG1vZGVsIFVzaW5nIEFJQyBhcHByb2FjaC4NCg0KSGVyZSwgd2UgY2FuIHNlZSB0aGF0IHRoZSBBSUMgd2FzIDI1OS45NiB3aXRoIGxsIHRoZSB0aHJlZSB2YXJpYmxlcyBwcmVzZW50LiBJbiB0aGlzIHN0ZXAsIHdlIGZvdW5kIG91ciBiZXN0IG1vZGVsIGluIHRoZSBmaXJzdCBzdGVwIG9ubHkgd2l0aCB0aGUgbG93ZXN0IEFJQy4NCg0KVGhlIGNvLWVmZmljaWVudCBvZiB0aGUgZmluYWwgbW9kZWwgaXMgMzQxMDQuNTU5IGZvciB0aGUgaW50ZXJjZXB0LCAzLjc0NiBmb3IgKipjcmVzdCBCdWRnZXQgWDEqKiwgLTMwMDQ2LjM0MyBmb3IgKipSYXRpbyBYMioqIGFuZCA4NS45MjYgZm9yICoqVVMgcGVyc29uYWwgZGlzcG9zYWJsZSBpbmNvbWUgWDMqKiB2YXJpYWJsZXMuDQoNCg0KTm93LCBXZSB3aWxsIGJ1aWxkIGEgbW9kZWwgdXNpbmcgZm9yd2FyZCBzdGVwLg0KDQpgYGB7ciwgZWNobyA9IFRSVUUsIHdhcm5pbmdzID0gRkFMU0V9DQoNCiNmb3J3YXJkIHNlbGVjdGlvbiB1c2luZyBBSUMgdmFsdWVzDQpzdGVwKG51bGwsIHNjb3BlPWxpc3QobG93ZXI9bnVsbCwgdXBwZXI9Y3Jlc3RsbSksIGRpcmVjdGlvbj0iZm9yd2FyZCIpDQpgYGANCg0KSW4gdGhpcyBGb3J3YXJkIHN0ZXAgbW9kZWwgYnVpbGRpbmcsIHdlIHdpbGwgc3RhcnQgd2l0aCBBSUMgb2YgMzAyLjY0IGFuZCB3ZSB3aWxsIGFkZCAqKlVzIERpc3Bvc2FibGUgaW5jb21lIFgzKiogYXQgZmlyc3QgYW5kIGFmdGVyIGFkZGluZyBvdXIgQUlDIGJlY29tZXMgMjYwLjI3LiBJbiB0aGUgc2Vjb25kIHN0ZXAsIHdlIHdpbGwgYWRkICoqQ3Jlc3QgQnVkZ2V0IFgxKiogYW5kIGFmdGVyIGFkZGluZyB0aGF0IG91dCBBSUMgYmVjb21lcyAyNjAuMTkuIEF0IHRoZSBsYXN0LCB3ZSB3aWxsIGFkZCBvdXIgM3JkIGFuZCBsYXN0IHByZWRpY3RvciBpLmUuICoqUmF0aW8gWDIqKiBhbmQgYWZ0ZXIgdGhhdCBBSUMgYmVjb21lcyAyNTkuOTYNCg0KU28gb3VyIEZpbmFsIE1vZGVsIGhhcyBBSUMgb2YgMjU5Ljk2LiANClRoZSBDby1lZmZpY2llbnRzIG9mIG91ciBmaW5hbCBtb2RlbCBpczoNCiogSW50ZXJjZXB0OiAzNDEwNC41NTkNCiogVXMgUGVyc29uYWwgRGlzcG9zYWJsZSBJbmNvbWUgWDM6IDg1LjkyNg0KKiBDcmVzdCBCdWRnZXQgWDE6IDMuNzQ2DQpSYXRpbyBYMjogLTMwMDQ2LjM0Mw0KDQoNCk5vdywgd2Ugd2lsbCBidWlsZCBhIG1vZGVsIHVzaW5nICoqU3RlcCB3aXNlIHJlZ3Jlc3Npb24qKg0KDQoNCmBgYHtyLCBlY2hvID0gVFJVRSwgd2FybmluZ3MgPSBGQUxTRX0NCg0KI3N0ZXB3aXNlIHJlZ3Jlc3Npb24gdXNpbmcgQUlDIHZhbHVlcw0Kc3RlcChudWxsLCBzY29wZSA9IGxpc3QodXBwZXI9Y3Jlc3RsbSksIGRhdGE9SG91c2luZywgZGlyZWN0aW9uPSJib3RoIikNCmBgYA0KSW4gdGhpcyAqKlN0ZXAtd2lzZSByZWdyZXNzaW9uKiogbW9kZWwsIHdlIHdpbGwgc3RhcnQgd2l0aCBBSUMgb2YgMzAyLjY0IGFuZCB0aGVuIGFkZCAqKkNyZXN0IHNhbGVzIFkqKiBpbiBvdXIgbW9kZWwuIEFmdGVyIHRoYXQsIHdlIHdpbGwgYWRkICoqVVMgcGVyc29uYWwgZGlzcG9zYWJsZSBpbmNvbWUgWDMqKiBhbmQgb3VyIEFJQyBiZWNvbWVzIDI2MC4yNy4gU2ltaWxhcmx5IHdlIHdpbGwga2VlcCBvbiBhZGRpbmcgYW5kIHN1YnRyYWN0aW5nIHZhcmlhYmxlcywgdW50aWwgYXQgdGhlIGVuZCB3ZSBmb3VuZCB3ZSBmb3VuZCBvdXIgQUlDIGF0IGxvd2VzdC4gSW4gdGhlIGxhc3Qgc3RlcCwgb3VyIEFJQyBpcyAyNTkuOTYgLg0KDQpUaGUgQ29fZWZmaWNpZW50IGFyZToNCiogSW50ZXJjZXB0OiAzNDEwNC41NTkNCiogVVMgUGVyc29uYWwgSW5jb21lIFgzOiA4NS45MjYNCiogQ3Jlc3QgQnVkZ2V0IFgxOiAzLjc0Ng0KKiBSYXRpbyBYMjogLTMwMDQ2LjM0Mw==