1 Introduction

For this project, we will be creating a Poisson regression model. The data set for this project looks at the daily total of cyclists on the Williamsburg Bridge on a given day. This data set looks at the total number of cyclists on the Williamsburg Bridge in Brooklyn, New York, in order to keep track of the total number of cyclists entering and leaving this cycling route on a specific day. We will look at the various factors affecting the number of cyclists on each day, with factors such as the weather conditions on that particular day.

1.1 Data Description

The data set in this project looks at the total number of cyclists on the Williamsburg Bridge on a given day along with the weather conditions of that day such as temperature and precipitation. This data set also includes the total number of cyclists on all four of the major New York bridges the Brooklyn Bridge, the Manhattan Bridge, the Williamsburg Bridge, and the Queensboro Bridge.

First, let’s find the data set which will be used for this assignment.

id=sample(1:10, 1)
dat <- read.xlsx("https://pengdsci.github.io/STA321/ww09/w09-AssignDataSet.xlsx", sheet = paste("data",id, sep = ""))
write.csv(dat, paste("C:\\Users\\josie\\Downloads\\",names(dat[6]), ".csv", sep=""))

When running this code, the data set I recieved was for the Williamsburg Bridge, so that is what we will use for this Poisson regression modeling project. The data set has been uploaded to Github and now can be read in directly from the Github repository.

We will read in the data set from Github and we will call it “cycling”.

cycling <- read.csv("https://raw.githubusercontent.com/JosieGallop/STA321/refs/heads/main/dataset/WilliamsburgBridge.csv", header = TRUE)

str(cycling)
'data.frame':   31 obs. of  8 variables:
 $ X                 : int  1 2 3 4 5 6 7 8 9 10 ...
 $ Date              : int  42917 42918 42919 42920 42921 42922 42923 42924 42925 42926 ...
 $ Day               : int  42917 42918 42919 42920 42921 42922 42923 42924 42925 42926 ...
 $ HighTemp          : num  84.9 87.1 87.1 82.9 84.9 75 79 82.9 81 82.9 ...
 $ LowTemp           : num  72 73 71.1 70 71.1 71.1 68 70 69.1 71.1 ...
 $ Precipitation     : num  0.23 0 0.45 0 0 0 1.78 0 0 0 ...
 $ WilliamsburgBridge: int  3845 4173 4924 3684 7308 7302 4421 5781 5782 8106 ...
 $ Total             : int  11867 13995 16067 13925 23110 21861 12805 17258 18320 24827 ...

We will use this cycling data set to create two Poisson regression models, one for the frequency counts of cyclists on the Williamsburg Bridge on a given observation, and another for the rates of cyclists entering and leaving via the Williamsburg Bridge offset by the total number of cyclists on all of the major New York bridges.

1.2 Variables

There are 8 total variables in the cycling data set. These variables include:

  • X: The number of each observation. This is not a variable that is useful for analysis, but rather is for listing each of the 31 observations in order, from observation 1 to observation 31. This ordering was added when creating the .csv file, so it is not an essential part of the dataset for our analysis.

  • Date: This represents the date on which a given observation was collected. This is the observation ID number.

  • Day: This represents the day on which a given observation was collected.

  • HighTemp: The high temperature on the given day, given in degrees Fahrenheit.

  • LowTemp: The low temperature on the given day, given in degrees Fahrenheit.

  • Precipitation: The amount of rain which occurred on the given day, given in inches.

  • WilliamsburgBridge: The total number of cyclists on the Williamsburg Bridge on a given observation.

  • Total: The total number of cyclists on all bridges on a given observation.

For the Poisson regression model for the frequency counts, the Williamsburg Bridge variable will serve as the response variable. For the Poisson regression model for the rates, the Williamsburg Bridge variable will again serve as the response variable, and it will be offset by the Total variable for this model.

1.3 Research Questions

The main goal for this project is to create a Poisson regression model for both the frequency counts and the rates of the cyclists entering and leaving Brooklyn, New York through the Williamsburg Bridge. So, the focus for this project will be on creating two Poisson regression models which can successfully predict the frequency counts and the rates of the cyclists on the Williamsburg Bridge.

Some key questions for this project include:

  • Does the data set meet all of the necessary conditions required for a Poisson regression model? If not, is there any potential explanation for this discrepancy?

  • Can we create Poisson regression models which provide statistical significance for predicting both the frequency counts and for the rates of cyclists on the Williamsburg Bridge on a given day?

We will work on creating our Poisson regression models for both the frequency counts and rates in order to see if we can in fact create models which provide statistical significance in their predictive ability.

2 Exploratory Data Analysis

Let’s take a look at the first few entries within this cycling data set for the Williamsburg Bridge.

kable(head(cycling), caption = "First Few Observations in the Data Set") 
First Few Observations in the Data Set
X Date Day HighTemp LowTemp Precipitation WilliamsburgBridge Total
1 42917 42917 84.9 72.0 0.23 3845 11867
2 42918 42918 87.1 73.0 0.00 4173 13995
3 42919 42919 87.1 71.1 0.45 4924 16067
4 42920 42920 82.9 70.0 0.00 3684 13925
5 42921 42921 84.9 71.1 0.00 7308 23110
6 42922 42922 75.0 71.1 0.00 7302 21861

This data set includes various factors which may have an influence on the number of individuals cycling, along with the date on which this data was collected. Additionally, this data set includes variables for both the number of cyclists on the Williamsburg Bridge on that given day, along with the total number of cyclists on all bridges on that given day.

An observation I made while looking at the data set is that the entries for the Date and the Day variables are in fact identical. This means that both of these variables are representative of the observation IDs and so, it would be redundant to include both variables in our models as the entries for these two variables are identical for all 31 of the observations in the data set. We will just include the Date variable in our Poisson regression models due to this observation that was made while observing the data set.

2.1 Asumptions and Conditions

There are four assumptions which must be met in order to create a Poisson regression model. These assumptions include:

  1. The response variable is a count described by a Poisson distribution.

  2. Observations are independent of one another.

  3. The mean of the Poisson random variable is equal to the variance of said Poisson random variable.

  4. The log of the mean rate, log (λ), must be a linear function of x.

We will check whether all of these four conditions have been successfully met by our cycling data set before beginning with the model building process for our Poisson regression model.

We will go through and check all four of the neccessary conditions required for a Poisson Regression Model.

2.1.1 Condition 1: The response variable is a count described by a Poisson distribution.

The response variable in this data set was stated to be the WilliamsburgBridge variable, representing the total number of cyclists on the Williamsburg Bridge on a given observation. This variable is described as a count, representing the number of cyclists on a given observation. This fits the criteria for this assumption, because we can conclude that we have a response variable that is a count.

2.1.2 Condition 2: Observations are independent of one another.

Each observation was collected on a given date, and we can safely assume that the conditions of one day did not affect the conditions of another day. The number of cyclists on the Williamsburg Bridge for a given observation is independent on this number of a different observation. So, we can safely conclude that that observations are all independent and separate from one another.

2.1.3 Condition 3: The mean of the Poisson random variable is equal to the variance of said Poisson random variable.

In order for a variable to be a Poisson random variable, its mean must be equal to its variance. We previously stated that the WilliamsburgBridge variable will be our response variable. Therefore, we must check that this variable meets the criteria for a Poisson random variable, having a mean which is equal to its variance.

# Finding the mean.
mean <- mean(cycling$WilliamsburgBridge)
print(mean)
[1] 6073.677

The mean of the WilliamsburgBridge variable is 6,073.677. This represents the mean number of individuals on the Williamsburg Bridge on a given observation. This means that the mean number of individuals on the Williamsburg Bridge on any given date is around 6,074 people. We round this value because the number of individuals is a whole number.

Next, let’s find the variance of our response variable.

# Finding the variance.
variance <- var(cycling$WilliamsburgBridge)
print(variance)
[1] 2482822

The variance of the WilliamsburgBridge variable is 2,482,822. This does not match up with the value of the mean, and indicates a violation of one the neccessary conditions for a Poisson regression model. This implies that our response variable is in fact not a Poisson random variable because the value of its mean is not equivalent to the value of its variance.

2.1.4 Condition 4: The log of the mean rate, log (λ), must be a linear function of x.

We will take a look at the plot of the mean rate against the predictor variables to check this condition.

First, let’s look at the predictor variable of date vs our response variable of WilliamsburgBridge.

plot(cycling$Date, cycling$WilliamsburgBridge, main = "Date vs. Williamsburg Bridge", xlab = "Date", ylab = "WilliamsburgBridge")

The scatterplot of these two variables shows a random distribution, but it does not appear to follow a linear pattern. This could suggest a possible violation of this condition due to the WilliamsburgBridge variable not being a linear function of the Date predictor variable.

Next, let’s look at the predictor variable of high temperature vs our response variable of WilliamsburgBridge.

plot(cycling$HighTemp, cycling$WilliamsburgBridge, main = "HighTemp vs. Williamsburg Bridge", xlab = "HighTemp", ylab = "WilliamsburgBridge")

The scatterplot of these two variables again shows a random distribution, which it does not appear to follow a distinctly linear pattern. This could suggest a possible violation of this condition due to the WilliamsburgBridge variable not being a linear function of the HighTemp predictor variable.

Next, let’s look at the predictor variable of low temperature vs our response variable of WilliamsburgBridge.

plot(cycling$LowTemp, cycling$WilliamsburgBridge, main = "LowTemp vs. Williamsburg Bridge", xlab = "LowTemp", ylab = "WilliamsburgBridge")

The scatterplot of these two variables again shows a random distribution, which it does not appear to follow a distinctly linear pattern. This could suggest a possible violation of this condition due to the WilliamsburgBridge variable not being a linear function of the LowTemp predictor variable.

Lastly, let’s look at the predictor variable of precipitation vs our response variable of WilliamsburgBridge.

plot(cycling$Precipitation, cycling$WilliamsburgBridge, main = "Precipitation vs. Williamsburg Bridge", xlab = "Precipitation", ylab = "WilliamsburgBridge")

The scatterplot of these two variables again shows a distribution which does not appear to follow a distinctly linear pattern, it appears the points are mostly centered around x = 0, with some outliers to the right. This could suggest a possible violation of this condition due to the WilliamsburgBridge variable not being a linear function of the Precipitation predictor variable.

Overall, it seems that we do have some violations of the conditions of a Poisson regression model, with the response variable not following a linear function of the predictor variables in our model.

We will still continue with building the Poisson regression models, but it is important to keep in mind that these violations may mean that the Poisson regression model is not the best model choice for this data set due to some of the neccessary conditions having been failed to have been met.

3 Poisson Regression Model on Frequency Counts

We will begin with creating a Poisson regression model of the frequency counts. Specifically, this model will be on the frequency counts of individuals on the Williamsburg Bridge for a given observations. Our goal is to create a Poisson regression model which can statistically significantly predict the count of the number of individuals on the Williamsburg Bridge for a given observation, based upon the various factors in this data set.

We will create our Poisson regression model on the frequency counts.

# Poisson Regression Model of Counts
model.counts <- glm(WilliamsburgBridge ~ Date + HighTemp + LowTemp + Precipitation, family = poisson(link = "log"), data = cycling)
pois.count.coef = summary(model.counts)$coef
kable(pois.count.coef, caption = "Poisson Regression Model for the Counts of Cyclists \n on the Williamsburg Bridge")
Poisson Regression Model for the Counts of Cyclists on the Williamsburg Bridge
Estimate Std. Error z value Pr(>|z|)
(Intercept) -329.7412813 11.7142108 -28.148826 0
Date 0.0078648 0.0002726 28.850990 0
HighTemp 0.0035901 0.0006334 5.667892 0
LowTemp 0.0075718 0.0009046 8.370178 0
Precipitation -0.3516535 0.0086431 -40.685836 0

The regression equation for the Poisson regression model on the frequency counts is given as:

log(μ) = -329.7413 + 0.0079 * Date + 0.0036 * HighTemp + 0.0076 * LowTemp - 0.3517 * Precipitation

All four of the predictor variables, Date, HighTemp, LowTemp, and Precipitation, all have p-values of p < .001. This indicates that all of the predictor in our model variables are statistically significant in predicting the total expected counts of cyclists on the Williamsburg Bridge on a given day.

The significance of these variables in regards to predicting the expected counts can likely be attributed to potential adverse weather conditions, such as excessive heat or cold, along with intense precipitation and storms making cycling non ideal on those days with poor conditions for outdoors activities such as cycling. These predictor variables all being statistically significant shows that the weather and temperature conditions do suggest a discrepancy in the number of cyclists on the Williamsburg Bridge from day to day due to these changes in temperature and precipitation.

Overall, this Poisson model of the frequency counts of the cyclists on the Williamsburg Bridge showed statistical signficance in its prediction of the expected log counts for the number of cyclists on the Williamsburg Bridge for a given observation.

3.1 Regression Coefficients Interpretation

The Poisson regression model on frequency counts was found to have the following regression equation:

log(μ) = -329.7413 + 0.0079 * Date + 0.0036 * HighTemp + 0.0076 * LowTemp - 0.3517 * Precipitation

We will analysis the regression coefficients for the variables in this Poisson regression model on frequency counts.

  • The value of the y-intercept is given as -329.7413. This represnts the baseline of the mean of log(μ) when all predictor variables are equal to 0. However, the y-intercept does not have a practical interpretation or meaning in this scenario so we are not interested in its meaning for the Poisson regression model.

  • Date: The regression coefficient of the Date variable in this model is 0.0079. This means that the mean log of the counts increases by 0.0079 units for every 1 day increase in the date on which the observation was collected, holding all other variables constant.

  • HighTemp: The regression coefficient of the HighTemp variable in this model is 0.0036. This means that the mean log of the counts increases by 0.0036 units for every 1 degree Fahrenheit increase in the high temperature for the given observation, holding all other variables constant.

  • LowTemp: The regression coefficient of the LowTemp variable in this model is 0.0076. This means that the mean log of the counts increases by 0.0076 units for every 1 degree Fahrenheit increase in the low temperature for the given observation, holding all other variables constant.

  • Precipitation: The regression coefficient of the Precipitation variable in this model is -0.3517. This means that the mean log of the counts decreases by 0.3517 units for every 1 inch increase in the amount of precipitation for the given observation, holding all other variables constant.

4 Poisson Regression Model on Rates

Now, we will create a Poisson regression model of the rates at which cyclists enter and leave via the Williamsburg Bridge offset by the total number of cyclists on all four of the major New York bridges. This model, unlike the previous model which just focused on the frequency counts of cyclists on the Williamsburg Bridge, will also account for the total number of cyclists on all four of the major New York bridges, the Brooklyn Bridge, the Manhattan Bridge, the Williamsburg Bridge, and the Queensboro Bridge. This Poisson model will look at the rates of the number of cyclists on the Williamsburg Bridge for a given observation as a rate out of the total number of cyclists on all four of these major bridges for that specific observation.

We will build our Poisson regression model for the rates. This time, we will still use the WilliamsburgBridge variable as our response variable, but we will offset the model by the Total variable to make our Poisson model for the rates of cyclists on the Williamsburg Bridge out of the total number of cyclists on all four of the bridges.

# Poisson Model of Rates
model.rates <- glm(WilliamsburgBridge ~ Date + HighTemp + LowTemp + Precipitation, offset = log(Total), 
                   family = poisson(link = "log"), data = cycling)
kable(summary(model.rates)$coef, caption = "Poisson Regression Model of the Rates of Cyclists \n on the Williamsburg Bridge out of all Four Bridges")
Poisson Regression Model of the Rates of Cyclists on the Williamsburg Bridge out of all Four Bridges
Estimate Std. Error z value Pr(>|z|)
(Intercept) -50.4101583 12.0801410 -4.172978 3.01e-05
Date 0.0011422 0.0002811 4.063496 4.83e-05
HighTemp -0.0050794 0.0006460 -7.862790 0.00e+00
LowTemp 0.0092517 0.0009198 10.057847 0.00e+00
Precipitation 0.0356817 0.0078863 4.524499 6.10e-06

The regression equation for the Poisson regression model on the rates is given as:

log(μ/t) = -50.4102 + 0.0011 * Date - 0.0051 * HighTemp + 0.0093 * LowTemp - 0.0357 * Precipitation

All four of the predictor variables in this Poisson model, Date, HighTemp, LowTemp, and Precipitation, all have p-values of p < .001. This indicates that all of the predictor in our model variables are statistically significant in predicting the total expected counts of cyclists on the Williamsburg Bridge on a given day, offset by the total number of cyclists on all four of the major New York bridges.

This model shows statistical significance in predicting the expected counts of the cyclists on the Williamsburg Bridge by using the rates for the prediction. This indicates that this model for the rates shows statistical significance in its predictive power and provides good utility for prediction and estimation.

4.1 Regression Coefficients Interpretation

  • The value of the y-intercept is given as -50.4102 This represents the baseline of the mean of the log counts multiplied by t, when all predictor variables are equal to 0. However, the y-intercept does not have a practical interpretation or meaning in this scenario so we are not interested in its meaning for the Poisson regression model.

  • Date: The regression coefficient of the Date variable in this model is 0.0011. This means that the mean of the log counts multipled by t increases by 0.0011. units for every 1 day increase in the date on which the observation was collected, holding all other variables constant.

  • HighTemp: The regression coefficient of the HighTemp variable in this model is -0.0051 This means that the mean of the log counts multipled by t decreases by 0.0051 units for every 1 degree Fahrenheit increase in the high temperature for the given observation, holding all other variables constant.

  • LowTemp: The regression coefficient of the LowTemp variable in this model is 0.0093. This means that the log counts multipled by t increases by 0.0093 units for every 1 degree Fahrenheit increase in the low temperature for the given observation, holding all other variables constant.

  • Precipitation: The regression coefficient of the Precipitation variable in this model is 0.0357. This means that the log counts multipled by t increases by 0.0357 units for every 1 inch increase in the amount of precipitation for the given observation, holding all other variables constant.

5 Summary and Comparisons of the Two Models

Both of the two Poisson regression model we created, the model for the frequency counts and the model for the rates, provided statistical significance for prediction and showed good utility overall. In both of these models, we looked into the total number of cyclists on the Williamsburg Bridge in New York for a specific observation, and we looked into the various factors of that specific date. We looked at the date of the observation along with some factors which may affect the total number of cyclists out on that specific date. These factors included the high temperature, the low temperature, and the amount of precipitation for that given date. It turned out that all of these factors were indeed statistically significant for both of the two Poisson regression models, indicating that these weather related conditions have a statistically significant impact on both the counts and the rates of cyclists out on the Williamsburg Bridge for a given observation. This can be attributed to certain weather conditions making it more or less ideal for individuals to be cycling outdoors. For instance, a day with incredibly high temperatures, incredibly cold temperatures, or severe storms with heavy precipitation would be less ideal and likely lead to less cyclists being out on that given day as opposed to a day with pleasant weather.

Overall, both of the Poisson regression models showed statistical significance and good utility in their prediction. However, as was previously stated, there were some violations of this conditions for a Poisson regression model within our data set. First, it was found that the mean of the response variable, WilliamsburgBridge, was not equal to its variance. This suggests that this response variable in fact is not Poisson distributed, due to it failing to meet the condition for a Poisson random variable of its mean being equal to its variance. Additionally, all four predictor variables were checked, and it was found that the response variable in fact was not a linear function of any of these predictor variables. This indicates another major violation of this data set. These violations suggest that perhaps a Poisson model was not the best model choice for this data set, and that it is important to be mindful of these violations when using either of the Poisson regression models we created for prediction.

6 Conclusion

Overall, two Poisson regression models were created in this project. Both of these models looked at the total number of cyclists on the Williamsburg Bridge for a given day. The first model looked at the counts of cyclists that were on the Williamsburg Bridge, and the second model looked at the rates of the cyclists that were on the Williamsburg Bridge offset by the total number of cyclists on all four of the major New York bridges.

Both of these two Poisson regression models showed statistical signicifance in their predictions, with all of the predictor variables in both of these two models have p-values of p < .001. This indicates that the factors in the data set of Date, HighTemp, LowTemp, and Precipitation are statistically significnace in predicting the frequency counts or the rates of the cyclists on the Williamsburg Bridge for a given observation.

However, our data set failed to meet some of the neccessary conditions for a Poisson regression model. The mean of the response variable, WilliamsburgBridge, was not equal to its variance. This suggests that this response variable in fact is not Poisson distributed. Also, all four predictor variables were checked, and it was found that the response variable in fact was not a linear function of any of these predictor variables. These are two violations of the assumptions for a Poisson regression model. These violations mean that perhaps a Poisson regression model was not the best choice for this data set, and that these violations should be kept in mind when using either of these models for prediction.

6.1 Recommendations

Some recommendations I would suggest for further projects include:

  • Look further into the violations that were found within this data set and look into possible explanations for these violations of the necessities of a Poisson regression model. Further consider whether the Poisson regression model in fact is the best choice for this data set and if it is sufficient to use this model for prediction despite these violations.

  • Consider other variables which may affect the number of cyclists out on a given observation. Perhaps there are other factors which may provide further significance for model building which may strengthen the regression model.

  • Further expand the data set to ensure the accuracy of the predictions and to further strengthen the Poisson regression models.

LS0tDQp0aXRsZTogIlBvaXNzb24gUmVncmVzc2lvbiBvZiB0aGUgQ291bnRzIGFuZCBSYXRlcyBvZiBDeWNsaXN0cyBvbiB0aGUgV2lsbGlhbXNidXJnIEJyaWRnZSINCmF1dGhvcjogIkpvc2llIEdhbGxvcCINCmRhdGU6ICIyMDI0LTEwLTI5Ig0Kb3V0cHV0Og0KICBodG1sX2RvY3VtZW50OiANCiAgICB0b2M6IHllcw0KICAgIHRvY19kZXB0aDogNA0KICAgIHRvY19mbG9hdDogeWVzDQogICAgZmlnX3dpZHRoOiA2DQogICAgZmlnX2NhcHRpb246IHllcw0KICAgIG51bWJlcl9zZWN0aW9uczogeWVzDQogICAgdG9jX2NvbGxhcHNlZDogeWVzDQogICAgY29kZV9mb2xkaW5nOiBoaWRlDQogICAgY29kZV9kb3dubG9hZDogeWVzDQogICAgc21vb3RoX3Njcm9sbDogeWVzDQogICAgdGhlbWU6IGx1bWVuDQogIHdvcmRfZG9jdW1lbnQ6IA0KICAgIHRvYzogeWVzDQogICAgdG9jX2RlcHRoOiA0DQogICAgZmlnX2NhcHRpb246IHllcw0KICAgIGtlZXBfbWQ6IHllcw0KICBwZGZfZG9jdW1lbnQ6IA0KICAgIHRvYzogeWVzDQogICAgdG9jX2RlcHRoOiA0DQogICAgZmlnX2NhcHRpb246IHllcw0KICAgIG51bWJlcl9zZWN0aW9uczogeWVzDQplZGl0b3Jfb3B0aW9uczogDQogIGNodW5rX291dHB1dF90eXBlOiBjb25zb2xlDQotLS0NCg0KYGBgez1odG1sfQ0KDQo8c3R5bGUgdHlwZT0idGV4dC9jc3MiPg0KDQovKiBDYXNjYWRpbmcgU3R5bGUgU2hlZXRzIChDU1MpIGlzIGEgc3R5bGVzaGVldCBsYW5ndWFnZSB1c2VkIHRvIGRlc2NyaWJlIHRoZSBwcmVzZW50YXRpb24gb2YgYSBkb2N1bWVudCB3cml0dGVuIGluIEhUTUwgb3IgWE1MLiBpdCBpcyBhIHNpbXBsZSBtZWNoYW5pc20gZm9yIGFkZGluZyBzdHlsZSAoZS5nLiwgZm9udHMsIGNvbG9ycywgc3BhY2luZykgdG8gV2ViIGRvY3VtZW50cy4gKi8NCg0KaDEudGl0bGUgeyAgLyogVGl0bGUgLSBmb250IHNwZWNpZmljYXRpb25zIG9mIHRoZSByZXBvcnQgdGl0bGUgKi8NCiAgZm9udC1zaXplOiAyNHB4Ow0KICBjb2xvcjogRGFya1JlZDsNCiAgdGV4dC1hbGlnbjogY2VudGVyOw0KICBmb250LWZhbWlseTogIkdpbGwgU2FucyIsIHNhbnMtc2VyaWY7DQp9DQpoNC5hdXRob3IgeyAvKiBIZWFkZXIgNCAtIGZvbnQgc3BlY2lmaWNhdGlvbnMgZm9yIGF1dGhvcnMgICovDQogIGZvbnQtc2l6ZTogMjBweDsNCiAgZm9udC1mYW1pbHk6IHN5c3RlbS11aTsNCiAgY29sb3I6IERhcmtSZWQ7DQogIHRleHQtYWxpZ246IGNlbnRlcjsNCn0NCmg0LmRhdGUgeyAvKiBIZWFkZXIgNCAtIGZvbnQgc3BlY2lmaWNhdGlvbnMgZm9yIHRoZSBkYXRlICAqLw0KICBmb250LXNpemU6IDE4cHg7DQogIGZvbnQtZmFtaWx5OiBzeXN0ZW0tdWk7DQogIGNvbG9yOiBEYXJrQmx1ZTsNCiAgdGV4dC1hbGlnbjogY2VudGVyOw0KfQ0KaDEgeyAvKiBIZWFkZXIgMSAtIGZvbnQgc3BlY2lmaWNhdGlvbnMgZm9yIGxldmVsIDEgc2VjdGlvbiB0aXRsZSAgKi8NCiAgICBmb250LXNpemU6IDIycHg7DQogICAgZm9udC1mYW1pbHk6ICJUaW1lcyBOZXcgUm9tYW4iLCBUaW1lcywgc2VyaWY7DQogICAgY29sb3I6IG5hdnk7DQogICAgdGV4dC1hbGlnbjogY2VudGVyOw0KfQ0KaDIgeyAvKiBIZWFkZXIgMiAtIGZvbnQgc3BlY2lmaWNhdGlvbnMgZm9yIGxldmVsIDIgc2VjdGlvbiB0aXRsZSAqLw0KICAgIGZvbnQtc2l6ZTogMjBweDsNCiAgICBmb250LWZhbWlseTogIlRpbWVzIE5ldyBSb21hbiIsIFRpbWVzLCBzZXJpZjsNCiAgICBjb2xvcjogbmF2eTsNCiAgICB0ZXh0LWFsaWduOiBsZWZ0Ow0KfQ0KDQpoMyB7IC8qIEhlYWRlciAzIC0gZm9udCBzcGVjaWZpY2F0aW9ucyBvZiBsZXZlbCAzIHNlY3Rpb24gdGl0bGUgICovDQogICAgZm9udC1zaXplOiAxOHB4Ow0KICAgIGZvbnQtZmFtaWx5OiAiVGltZXMgTmV3IFJvbWFuIiwgVGltZXMsIHNlcmlmOw0KICAgIGNvbG9yOiBuYXZ5Ow0KICAgIHRleHQtYWxpZ246IGxlZnQ7DQp9DQoNCmg0IHsgLyogSGVhZGVyIDQgLSBmb250IHNwZWNpZmljYXRpb25zIG9mIGxldmVsIDQgc2VjdGlvbiB0aXRsZSAgKi8NCiAgICBmb250LXNpemU6IDE4cHg7DQogICAgZm9udC1mYW1pbHk6ICJUaW1lcyBOZXcgUm9tYW4iLCBUaW1lcywgc2VyaWY7DQogICAgY29sb3I6IGRhcmtyZWQ7DQogICAgdGV4dC1hbGlnbjogbGVmdDsNCn0NCg0KYm9keSB7IGJhY2tncm91bmQtY29sb3I6d2hpdGU7IH0NCg0KLmhpZ2hsaWdodG1lIHsgYmFja2dyb3VuZC1jb2xvcjp5ZWxsb3c7IH0NCg0KcCB7IGJhY2tncm91bmQtY29sb3I6d2hpdGU7IH0NCg0KPC9zdHlsZT4NCmBgYA0KYGBge3Igc2V0dXAsIGluY2x1ZGU9RkFMU0V9DQojIERldGVjdCwgaW5zdGFsbCwgYW5kIGxvYWQgcGFja2FnZXMgaWYgbmVlZGVkLg0KaWYgKCFyZXF1aXJlKCJrbml0ciIpKSB7DQogICBpbnN0YWxsLnBhY2thZ2VzKCJrbml0ciIpDQogICBsaWJyYXJ5KGtuaXRyKQ0KfQ0KaWYgKCFyZXF1aXJlKCJsZWFmbGV0IikpIHsNCiAgIGluc3RhbGwucGFja2FnZXMoImxlYWZsZXQiKQ0KICAgbGlicmFyeShsZWFmbGV0KQ0KfQ0KaWYgKCFyZXF1aXJlKCJFbnZTdGF0cyIpKSB7DQogICBpbnN0YWxsLnBhY2thZ2VzKCJFbnZTdGF0cyIpDQogICBsaWJyYXJ5KEVudlN0YXRzKQ0KfQ0KaWYgKCFyZXF1aXJlKCJNQVNTIikpIHsNCiAgIGluc3RhbGwucGFja2FnZXMoIk1BU1MiKQ0KICAgbGlicmFyeShNQVNTKQ0KfQ0KaWYgKCFyZXF1aXJlKCJwaHl0b29scyIpKSB7DQogICBpbnN0YWxsLnBhY2thZ2VzKCJwaHl0b29scyIpDQogICBsaWJyYXJ5KHBoeXRvb2xzKQ0KfQ0KaWYoIXJlcXVpcmUoImRwbHlyIikpIHsNCiAgIGluc3RhbGwucGFja2FnZXMoImRwbHlyIikNCiAgIGxpYnJhcnkoZHBseXIpDQp9DQppZighcmVxdWlyZSgidGlkeXZlcnNlIikpIHsNCiAgIGluc3RhbGwucGFja2FnZXMoInRpZHl2ZXJzZSIpDQogICBsaWJyYXJ5KHRpZHl2ZXJzZSkNCn0NCmlmKCFyZXF1aXJlKCJHR2FsbHkiKSkgew0KICAgaW5zdGFsbC5wYWNrYWdlcygiR0dhbGx5IikNCiAgIGxpYnJhcnkoR0dhbGx5KQ0KfQ0KaWYgKCFyZXF1aXJlKCJib290IikpIHsNCiAgIGluc3RhbGwucGFja2FnZXMoImJvb3QiKQ0KICAgbGlicmFyeShib290KQ0KfQ0KaWYoIXJlcXVpcmUoInBhbmRlciIpKSB7DQogICBpbnN0YWxsLnBhY2thZ2VzKCJwYW5kZXIiKQ0KICAgbGlicmFyeShwYW5kZXIpDQp9DQppZighcmVxdWlyZSgibWxiZW5jaCIpKSB7DQogICBpbnN0YWxsLnBhY2thZ2VzKCJtbGJlbmNoIikNCiAgIGxpYnJhcnkobWxiZW5jaCkNCn0NCmlmKCFyZXF1aXJlKCJwc3ljaCIpKSB7DQogICBpbnN0YWxsLnBhY2thZ2VzKCJwc3ljaCIpDQogICBsaWJyYXJ5KHBzeWNoKQ0KfQ0KaWYoIXJlcXVpcmUoImJyb29tLm1peGVkIikpIHsNCiAgIGluc3RhbGwucGFja2FnZXMoImJyb29tLm1peGVkIikNCiAgIGxpYnJhcnkoYnJvb20ubWl4ZWQpDQp9DQppZighcmVxdWlyZSgiR0dhbGx5IikpIHsNCiAgIGluc3RhbGwucGFja2FnZXMoIkdHYWxseSIpDQogICBsaWJyYXJ5KEdHYWxseSkNCn0NCmlmICghcmVxdWlyZSgicFJPQyIpKSB7DQogICBpbnN0YWxsLnBhY2thZ2VzKCJwUk9DIikNCiAgIGxpYnJhcnkocFJPQykNCn0NCmlmICghcmVxdWlyZSgib3Blbnhsc3giKSkgew0KICAgaW5zdGFsbC5wYWNrYWdlcygib3Blbnhsc3giKQ0KICAgbGlicmFyeShvcGVueGxzeCkNCn0NCmtuaXRyOjpvcHRzX2NodW5rJHNldChlY2hvID0gVFJVRSwgIA0KICAgICAgICAgICAgICAgICAgIHdhcm5pbmcgPSBGQUxTRSwgICANCiAgICAgICAgICAgICAgICAgICBtZXNzYWdlID0gRkFMU0UsICANCiAgICAgICAgICAgICAgICAgICByZXN1bHRzID0gVFJVRSwgIA0KICAgICAgICAgICAgICAgICAgIGNvbW1lbnQgPSBOQSAgIA0KICAgICAgICAgICAgICAgICAgICAgICkgICANCmBgYA0KDQoNCiMgSW50cm9kdWN0aW9uDQoNCkZvciB0aGlzIHByb2plY3QsIHdlIHdpbGwgYmUgY3JlYXRpbmcgYSBQb2lzc29uIHJlZ3Jlc3Npb24gbW9kZWwuIFRoZSBkYXRhIHNldCBmb3IgdGhpcyBwcm9qZWN0IGxvb2tzIGF0IHRoZSBkYWlseSB0b3RhbCBvZiBjeWNsaXN0cyBvbiB0aGUgV2lsbGlhbXNidXJnIEJyaWRnZSBvbiBhIGdpdmVuIGRheS4gVGhpcyBkYXRhIHNldCBsb29rcyBhdCB0aGUgdG90YWwgbnVtYmVyIG9mIGN5Y2xpc3RzIG9uIHRoZSBXaWxsaWFtc2J1cmcgQnJpZGdlIGluIEJyb29rbHluLCBOZXcgWW9yaywgaW4gb3JkZXIgdG8ga2VlcCB0cmFjayBvZiB0aGUgdG90YWwgbnVtYmVyIG9mIGN5Y2xpc3RzIGVudGVyaW5nIGFuZCBsZWF2aW5nIHRoaXMgY3ljbGluZyByb3V0ZSBvbiBhIHNwZWNpZmljIGRheS4gV2Ugd2lsbCBsb29rIGF0IHRoZSB2YXJpb3VzIGZhY3RvcnMgYWZmZWN0aW5nIHRoZSBudW1iZXIgb2YgY3ljbGlzdHMgb24gZWFjaCBkYXksIHdpdGggZmFjdG9ycyBzdWNoIGFzIHRoZSB3ZWF0aGVyIGNvbmRpdGlvbnMgb24gdGhhdCBwYXJ0aWN1bGFyIGRheS4gDQoNCg0KIyMgRGF0YSBEZXNjcmlwdGlvbg0KDQpUaGUgZGF0YSBzZXQgaW4gdGhpcyBwcm9qZWN0IGxvb2tzIGF0IHRoZSB0b3RhbCBudW1iZXIgb2YgY3ljbGlzdHMgb24gdGhlIFdpbGxpYW1zYnVyZyBCcmlkZ2Ugb24gYSBnaXZlbiBkYXkgYWxvbmcgd2l0aCB0aGUgd2VhdGhlciBjb25kaXRpb25zIG9mIHRoYXQgZGF5IHN1Y2ggYXMgdGVtcGVyYXR1cmUgYW5kIHByZWNpcGl0YXRpb24uIFRoaXMgZGF0YSBzZXQgYWxzbyBpbmNsdWRlcyB0aGUgdG90YWwgbnVtYmVyIG9mIGN5Y2xpc3RzIG9uIGFsbCBmb3VyIG9mIHRoZSBtYWpvciBOZXcgWW9yayBicmlkZ2VzIHRoZSBCcm9va2x5biBCcmlkZ2UsIHRoZSBNYW5oYXR0YW4gQnJpZGdlLCB0aGUgV2lsbGlhbXNidXJnIEJyaWRnZSwgYW5kIHRoZSBRdWVlbnNib3JvIEJyaWRnZS4NCg0KRmlyc3QsIGxldCdzIGZpbmQgdGhlIGRhdGEgc2V0IHdoaWNoIHdpbGwgYmUgdXNlZCBmb3IgdGhpcyBhc3NpZ25tZW50LiANCg0KYGBge3J9DQppZD1zYW1wbGUoMToxMCwgMSkNCmRhdCA8LSByZWFkLnhsc3goImh0dHBzOi8vcGVuZ2RzY2kuZ2l0aHViLmlvL1NUQTMyMS93dzA5L3cwOS1Bc3NpZ25EYXRhU2V0Lnhsc3giLCBzaGVldCA9IHBhc3RlKCJkYXRhIixpZCwgc2VwID0gIiIpKQ0Kd3JpdGUuY3N2KGRhdCwgcGFzdGUoIkM6XFxVc2Vyc1xcam9zaWVcXERvd25sb2Fkc1xcIixuYW1lcyhkYXRbNl0pLCAiLmNzdiIsIHNlcD0iIikpDQpgYGANCg0KV2hlbiBydW5uaW5nIHRoaXMgY29kZSwgdGhlIGRhdGEgc2V0IEkgcmVjaWV2ZWQgd2FzIGZvciB0aGUgV2lsbGlhbXNidXJnIEJyaWRnZSwgc28gdGhhdCBpcyB3aGF0IHdlIHdpbGwgdXNlIGZvciB0aGlzIFBvaXNzb24gcmVncmVzc2lvbiBtb2RlbGluZyBwcm9qZWN0LiBUaGUgZGF0YSBzZXQgaGFzIGJlZW4gdXBsb2FkZWQgdG8gR2l0aHViIGFuZCBub3cgY2FuIGJlIHJlYWQgaW4gZGlyZWN0bHkgZnJvbSB0aGUgR2l0aHViIHJlcG9zaXRvcnkuIA0KDQpXZSB3aWxsIHJlYWQgaW4gdGhlIGRhdGEgc2V0IGZyb20gR2l0aHViIGFuZCB3ZSB3aWxsIGNhbGwgaXQgImN5Y2xpbmciLg0KDQpgYGB7cn0NCmN5Y2xpbmcgPC0gcmVhZC5jc3YoImh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9Kb3NpZUdhbGxvcC9TVEEzMjEvcmVmcy9oZWFkcy9tYWluL2RhdGFzZXQvV2lsbGlhbXNidXJnQnJpZGdlLmNzdiIsIGhlYWRlciA9IFRSVUUpDQoNCnN0cihjeWNsaW5nKQ0KYGBgDQoNCldlIHdpbGwgdXNlIHRoaXMgY3ljbGluZyBkYXRhIHNldCB0byBjcmVhdGUgdHdvIFBvaXNzb24gcmVncmVzc2lvbiBtb2RlbHMsIG9uZSBmb3IgdGhlIGZyZXF1ZW5jeSBjb3VudHMgb2YgY3ljbGlzdHMgb24gdGhlIFdpbGxpYW1zYnVyZyBCcmlkZ2Ugb24gYSBnaXZlbiBvYnNlcnZhdGlvbiwgYW5kIGFub3RoZXIgZm9yIHRoZSByYXRlcyBvZiBjeWNsaXN0cyBlbnRlcmluZyBhbmQgbGVhdmluZyB2aWEgdGhlIFdpbGxpYW1zYnVyZyBCcmlkZ2Ugb2Zmc2V0IGJ5IHRoZSB0b3RhbCBudW1iZXIgb2YgY3ljbGlzdHMgb24gYWxsIG9mIHRoZSBtYWpvciBOZXcgWW9yayBicmlkZ2VzLiANCg0KDQojIyBWYXJpYWJsZXMNCg0KDQpUaGVyZSBhcmUgOCB0b3RhbCB2YXJpYWJsZXMgaW4gdGhlIGN5Y2xpbmcgZGF0YSBzZXQuIFRoZXNlIHZhcmlhYmxlcyBpbmNsdWRlOg0KDQoqIFg6IFRoZSBudW1iZXIgb2YgZWFjaCBvYnNlcnZhdGlvbi4gVGhpcyBpcyBub3QgYSB2YXJpYWJsZSB0aGF0IGlzIHVzZWZ1bCBmb3IgYW5hbHlzaXMsIGJ1dCByYXRoZXIgaXMgZm9yIGxpc3RpbmcgZWFjaCBvZiB0aGUgMzEgb2JzZXJ2YXRpb25zIGluIG9yZGVyLCBmcm9tIG9ic2VydmF0aW9uIDEgdG8gb2JzZXJ2YXRpb24gMzEuIFRoaXMgb3JkZXJpbmcgd2FzIGFkZGVkIHdoZW4gY3JlYXRpbmcgdGhlIC5jc3YgZmlsZSwgc28gaXQgaXMgbm90IGFuIGVzc2VudGlhbCBwYXJ0IG9mIHRoZSBkYXRhc2V0IGZvciBvdXIgYW5hbHlzaXMuDQoNCiogRGF0ZTogVGhpcyByZXByZXNlbnRzIHRoZSBkYXRlIG9uIHdoaWNoIGEgZ2l2ZW4gb2JzZXJ2YXRpb24gd2FzIGNvbGxlY3RlZC4gVGhpcyBpcyB0aGUgb2JzZXJ2YXRpb24gSUQgbnVtYmVyLiANCg0KKiBEYXk6IFRoaXMgcmVwcmVzZW50cyB0aGUgZGF5IG9uIHdoaWNoIGEgZ2l2ZW4gb2JzZXJ2YXRpb24gd2FzIGNvbGxlY3RlZC4gDQoNCiogSGlnaFRlbXA6IFRoZSBoaWdoIHRlbXBlcmF0dXJlIG9uIHRoZSBnaXZlbiBkYXksIGdpdmVuIGluIGRlZ3JlZXMgRmFocmVuaGVpdC4gDQoNCiogTG93VGVtcDogVGhlIGxvdyB0ZW1wZXJhdHVyZSBvbiB0aGUgZ2l2ZW4gZGF5LCBnaXZlbiBpbiBkZWdyZWVzIEZhaHJlbmhlaXQuDQoNCiogUHJlY2lwaXRhdGlvbjogVGhlIGFtb3VudCBvZiByYWluIHdoaWNoIG9jY3VycmVkIG9uIHRoZSBnaXZlbiBkYXksIGdpdmVuIGluIGluY2hlcy4gDQoNCiogV2lsbGlhbXNidXJnQnJpZGdlOiBUaGUgdG90YWwgbnVtYmVyIG9mIGN5Y2xpc3RzIG9uIHRoZSBXaWxsaWFtc2J1cmcgQnJpZGdlIG9uIGEgZ2l2ZW4gb2JzZXJ2YXRpb24uDQoNCiogVG90YWw6IFRoZSB0b3RhbCBudW1iZXIgb2YgY3ljbGlzdHMgb24gYWxsIGJyaWRnZXMgb24gYSBnaXZlbiBvYnNlcnZhdGlvbi4gDQoNCg0KRm9yIHRoZSBQb2lzc29uIHJlZ3Jlc3Npb24gbW9kZWwgZm9yIHRoZSBmcmVxdWVuY3kgY291bnRzLCB0aGUgV2lsbGlhbXNidXJnIEJyaWRnZSB2YXJpYWJsZSB3aWxsIHNlcnZlIGFzIHRoZSByZXNwb25zZSB2YXJpYWJsZS4gRm9yIHRoZSBQb2lzc29uIHJlZ3Jlc3Npb24gbW9kZWwgZm9yIHRoZSByYXRlcywgdGhlIFdpbGxpYW1zYnVyZyBCcmlkZ2UgdmFyaWFibGUgd2lsbCBhZ2FpbiBzZXJ2ZSBhcyB0aGUgcmVzcG9uc2UgdmFyaWFibGUsIGFuZCBpdCB3aWxsIGJlIG9mZnNldCBieSB0aGUgVG90YWwgdmFyaWFibGUgZm9yIHRoaXMgbW9kZWwuIA0KDQoNCiMjIFJlc2VhcmNoIFF1ZXN0aW9ucw0KDQpUaGUgbWFpbiBnb2FsIGZvciB0aGlzIHByb2plY3QgaXMgdG8gY3JlYXRlIGEgUG9pc3NvbiByZWdyZXNzaW9uIG1vZGVsIGZvciBib3RoIHRoZSBmcmVxdWVuY3kgY291bnRzIGFuZCB0aGUgcmF0ZXMgb2YgdGhlIGN5Y2xpc3RzIGVudGVyaW5nIGFuZCBsZWF2aW5nIEJyb29rbHluLCBOZXcgWW9yayB0aHJvdWdoIHRoZSBXaWxsaWFtc2J1cmcgQnJpZGdlLiBTbywgdGhlIGZvY3VzIGZvciB0aGlzIHByb2plY3Qgd2lsbCBiZSBvbiBjcmVhdGluZyB0d28gUG9pc3NvbiByZWdyZXNzaW9uIG1vZGVscyB3aGljaCBjYW4gc3VjY2Vzc2Z1bGx5IHByZWRpY3QgdGhlIGZyZXF1ZW5jeSBjb3VudHMgYW5kIHRoZSByYXRlcyBvZiB0aGUgY3ljbGlzdHMgb24gdGhlIFdpbGxpYW1zYnVyZyBCcmlkZ2UuIA0KDQpTb21lIGtleSBxdWVzdGlvbnMgZm9yIHRoaXMgcHJvamVjdCBpbmNsdWRlOg0KDQoqIERvZXMgdGhlIGRhdGEgc2V0IG1lZXQgYWxsIG9mIHRoZSBuZWNlc3NhcnkgY29uZGl0aW9ucyByZXF1aXJlZCBmb3IgYSBQb2lzc29uIHJlZ3Jlc3Npb24gbW9kZWw/IElmIG5vdCwgaXMgdGhlcmUgYW55IHBvdGVudGlhbCBleHBsYW5hdGlvbiBmb3IgdGhpcyBkaXNjcmVwYW5jeT8gDQoNCiogQ2FuIHdlIGNyZWF0ZSBQb2lzc29uIHJlZ3Jlc3Npb24gbW9kZWxzIHdoaWNoIHByb3ZpZGUgc3RhdGlzdGljYWwgc2lnbmlmaWNhbmNlIGZvciBwcmVkaWN0aW5nIGJvdGggdGhlIGZyZXF1ZW5jeSBjb3VudHMgYW5kIGZvciB0aGUgcmF0ZXMgb2YgY3ljbGlzdHMgb24gdGhlIFdpbGxpYW1zYnVyZyBCcmlkZ2Ugb24gYSBnaXZlbiBkYXk/DQoNCldlIHdpbGwgd29yayBvbiBjcmVhdGluZyBvdXIgUG9pc3NvbiByZWdyZXNzaW9uIG1vZGVscyBmb3IgYm90aCB0aGUgZnJlcXVlbmN5IGNvdW50cyBhbmQgcmF0ZXMgaW4gb3JkZXIgdG8gc2VlIGlmIHdlIGNhbiBpbiBmYWN0IGNyZWF0ZSBtb2RlbHMgd2hpY2ggcHJvdmlkZSBzdGF0aXN0aWNhbCBzaWduaWZpY2FuY2UgaW4gdGhlaXIgcHJlZGljdGl2ZSBhYmlsaXR5LiANCg0KDQoNCg0KIyBFeHBsb3JhdG9yeSBEYXRhIEFuYWx5c2lzDQoNCkxldCdzIHRha2UgYSBsb29rIGF0IHRoZSBmaXJzdCBmZXcgZW50cmllcyB3aXRoaW4gdGhpcyBjeWNsaW5nIGRhdGEgc2V0IGZvciB0aGUgV2lsbGlhbXNidXJnIEJyaWRnZS4NCg0KYGBge3J9DQprYWJsZShoZWFkKGN5Y2xpbmcpLCBjYXB0aW9uID0gIkZpcnN0IEZldyBPYnNlcnZhdGlvbnMgaW4gdGhlIERhdGEgU2V0IikgDQpgYGANCg0KVGhpcyBkYXRhIHNldCBpbmNsdWRlcyB2YXJpb3VzIGZhY3RvcnMgd2hpY2ggbWF5IGhhdmUgYW4gaW5mbHVlbmNlIG9uIHRoZSBudW1iZXIgb2YgaW5kaXZpZHVhbHMgY3ljbGluZywgYWxvbmcgd2l0aCB0aGUgZGF0ZSBvbiB3aGljaCB0aGlzIGRhdGEgd2FzIGNvbGxlY3RlZC4gQWRkaXRpb25hbGx5LCB0aGlzIGRhdGEgc2V0IGluY2x1ZGVzIHZhcmlhYmxlcyBmb3IgYm90aCB0aGUgbnVtYmVyIG9mIGN5Y2xpc3RzIG9uIHRoZSBXaWxsaWFtc2J1cmcgQnJpZGdlIG9uIHRoYXQgZ2l2ZW4gZGF5LCBhbG9uZyB3aXRoIHRoZSB0b3RhbCBudW1iZXIgb2YgY3ljbGlzdHMgb24gYWxsIGJyaWRnZXMgb24gdGhhdCBnaXZlbiBkYXkuICANCg0KQW4gb2JzZXJ2YXRpb24gSSBtYWRlIHdoaWxlIGxvb2tpbmcgYXQgdGhlIGRhdGEgc2V0IGlzIHRoYXQgdGhlIGVudHJpZXMgZm9yIHRoZSBEYXRlIGFuZCB0aGUgRGF5IHZhcmlhYmxlcyBhcmUgaW4gZmFjdCBpZGVudGljYWwuIFRoaXMgbWVhbnMgdGhhdCBib3RoIG9mIHRoZXNlIHZhcmlhYmxlcyBhcmUgcmVwcmVzZW50YXRpdmUgb2YgdGhlIG9ic2VydmF0aW9uIElEcyBhbmQgc28sIGl0IHdvdWxkIGJlIHJlZHVuZGFudCB0byBpbmNsdWRlIGJvdGggdmFyaWFibGVzIGluIG91ciBtb2RlbHMgYXMgdGhlIGVudHJpZXMgZm9yIHRoZXNlIHR3byB2YXJpYWJsZXMgYXJlIGlkZW50aWNhbCBmb3IgYWxsIDMxIG9mIHRoZSBvYnNlcnZhdGlvbnMgaW4gdGhlIGRhdGEgc2V0LiBXZSB3aWxsIGp1c3QgaW5jbHVkZSB0aGUgRGF0ZSB2YXJpYWJsZSBpbiBvdXIgUG9pc3NvbiByZWdyZXNzaW9uIG1vZGVscyBkdWUgdG8gdGhpcyBvYnNlcnZhdGlvbiB0aGF0IHdhcyBtYWRlIHdoaWxlIG9ic2VydmluZyB0aGUgZGF0YSBzZXQuIA0KDQoNCg0KIyMgQXN1bXB0aW9ucyBhbmQgQ29uZGl0aW9ucw0KDQpUaGVyZSBhcmUgZm91ciBhc3N1bXB0aW9ucyB3aGljaCBtdXN0IGJlIG1ldCBpbiBvcmRlciB0byBjcmVhdGUgYSBQb2lzc29uIHJlZ3Jlc3Npb24gbW9kZWwuIFRoZXNlIGFzc3VtcHRpb25zIGluY2x1ZGU6DQoNCjEuIFRoZSByZXNwb25zZSB2YXJpYWJsZSBpcyBhIGNvdW50IGRlc2NyaWJlZCBieSBhIFBvaXNzb24gZGlzdHJpYnV0aW9uLg0KDQoyLiBPYnNlcnZhdGlvbnMgYXJlIGluZGVwZW5kZW50IG9mIG9uZSBhbm90aGVyLg0KDQozLiBUaGUgbWVhbiBvZiB0aGUgUG9pc3NvbiByYW5kb20gdmFyaWFibGUgaXMgZXF1YWwgdG8gdGhlIHZhcmlhbmNlIG9mIHNhaWQgUG9pc3NvbiByYW5kb20gdmFyaWFibGUuDQoNCjQuIFRoZSBsb2cgb2YgdGhlIG1lYW4gcmF0ZSwgbG9nICjOuyksIG11c3QgYmUgYSBsaW5lYXIgZnVuY3Rpb24gb2YgeC4NCg0KDQpXZSB3aWxsIGNoZWNrIHdoZXRoZXIgYWxsIG9mIHRoZXNlIGZvdXIgY29uZGl0aW9ucyBoYXZlIGJlZW4gc3VjY2Vzc2Z1bGx5IG1ldCBieSBvdXIgY3ljbGluZyBkYXRhIHNldCBiZWZvcmUgYmVnaW5uaW5nIHdpdGggdGhlIG1vZGVsIGJ1aWxkaW5nIHByb2Nlc3MgZm9yIG91ciBQb2lzc29uIHJlZ3Jlc3Npb24gbW9kZWwuDQoNCldlIHdpbGwgZ28gdGhyb3VnaCBhbmQgY2hlY2sgYWxsIGZvdXIgb2YgdGhlIG5lY2Nlc3NhcnkgY29uZGl0aW9ucyByZXF1aXJlZCBmb3IgYSBQb2lzc29uIFJlZ3Jlc3Npb24gTW9kZWwuDQoNCg0KIyMjIENvbmRpdGlvbiAxOiBUaGUgcmVzcG9uc2UgdmFyaWFibGUgaXMgYSBjb3VudCBkZXNjcmliZWQgYnkgYSBQb2lzc29uIGRpc3RyaWJ1dGlvbi4NCg0KVGhlIHJlc3BvbnNlIHZhcmlhYmxlIGluIHRoaXMgZGF0YSBzZXQgd2FzIHN0YXRlZCB0byBiZSB0aGUgV2lsbGlhbXNidXJnQnJpZGdlIHZhcmlhYmxlLCByZXByZXNlbnRpbmcgdGhlIHRvdGFsIG51bWJlciBvZiBjeWNsaXN0cyBvbiB0aGUgV2lsbGlhbXNidXJnIEJyaWRnZSBvbiBhIGdpdmVuIG9ic2VydmF0aW9uLiBUaGlzIHZhcmlhYmxlIGlzIGRlc2NyaWJlZCBhcyBhIGNvdW50LCByZXByZXNlbnRpbmcgdGhlIG51bWJlciBvZiBjeWNsaXN0cyBvbiBhIGdpdmVuIG9ic2VydmF0aW9uLiBUaGlzIGZpdHMgdGhlIGNyaXRlcmlhIGZvciB0aGlzIGFzc3VtcHRpb24sIGJlY2F1c2Ugd2UgY2FuIGNvbmNsdWRlIHRoYXQgd2UgaGF2ZSBhIHJlc3BvbnNlIHZhcmlhYmxlIHRoYXQgaXMgYSBjb3VudC4NCg0KDQojIyMgQ29uZGl0aW9uIDI6IE9ic2VydmF0aW9ucyBhcmUgaW5kZXBlbmRlbnQgb2Ygb25lIGFub3RoZXIuDQoNCkVhY2ggb2JzZXJ2YXRpb24gd2FzIGNvbGxlY3RlZCBvbiBhIGdpdmVuIGRhdGUsIGFuZCB3ZSBjYW4gc2FmZWx5IGFzc3VtZSB0aGF0IHRoZSBjb25kaXRpb25zIG9mIG9uZSBkYXkgZGlkIG5vdCBhZmZlY3QgdGhlIGNvbmRpdGlvbnMgb2YgYW5vdGhlciBkYXkuIFRoZSBudW1iZXIgb2YgY3ljbGlzdHMgb24gdGhlIFdpbGxpYW1zYnVyZyBCcmlkZ2UgZm9yIGEgZ2l2ZW4gb2JzZXJ2YXRpb24gaXMgaW5kZXBlbmRlbnQgb24gdGhpcyBudW1iZXIgb2YgYSBkaWZmZXJlbnQgb2JzZXJ2YXRpb24uIFNvLCB3ZSBjYW4gc2FmZWx5IGNvbmNsdWRlIHRoYXQgdGhhdCBvYnNlcnZhdGlvbnMgYXJlIGFsbCBpbmRlcGVuZGVudCBhbmQgc2VwYXJhdGUgZnJvbSBvbmUgYW5vdGhlci4gDQoNCg0KIyMjIENvbmRpdGlvbiAzOiBUaGUgbWVhbiBvZiB0aGUgUG9pc3NvbiByYW5kb20gdmFyaWFibGUgaXMgZXF1YWwgdG8gdGhlIHZhcmlhbmNlIG9mIHNhaWQgUG9pc3NvbiByYW5kb20gdmFyaWFibGUuDQoNCkluIG9yZGVyIGZvciBhIHZhcmlhYmxlIHRvIGJlIGEgUG9pc3NvbiByYW5kb20gdmFyaWFibGUsIGl0cyBtZWFuIG11c3QgYmUgZXF1YWwgdG8gaXRzIHZhcmlhbmNlLiBXZSBwcmV2aW91c2x5IHN0YXRlZCB0aGF0IHRoZSBXaWxsaWFtc2J1cmdCcmlkZ2UgdmFyaWFibGUgd2lsbCBiZSBvdXIgcmVzcG9uc2UgdmFyaWFibGUuIFRoZXJlZm9yZSwgd2UgbXVzdCBjaGVjayB0aGF0IHRoaXMgdmFyaWFibGUgbWVldHMgdGhlIGNyaXRlcmlhIGZvciBhIFBvaXNzb24gcmFuZG9tIHZhcmlhYmxlLCBoYXZpbmcgYSBtZWFuIHdoaWNoIGlzIGVxdWFsIHRvIGl0cyB2YXJpYW5jZS4NCg0KYGBge3J9DQojIEZpbmRpbmcgdGhlIG1lYW4uDQptZWFuIDwtIG1lYW4oY3ljbGluZyRXaWxsaWFtc2J1cmdCcmlkZ2UpDQpwcmludChtZWFuKQ0KYGBgDQoNClRoZSBtZWFuIG9mIHRoZSBXaWxsaWFtc2J1cmdCcmlkZ2UgdmFyaWFibGUgaXMgNiwwNzMuNjc3LiBUaGlzIHJlcHJlc2VudHMgdGhlIG1lYW4gbnVtYmVyIG9mIGluZGl2aWR1YWxzIG9uIHRoZSBXaWxsaWFtc2J1cmcgQnJpZGdlIG9uIGEgZ2l2ZW4gb2JzZXJ2YXRpb24uIFRoaXMgbWVhbnMgdGhhdCB0aGUgbWVhbiBudW1iZXIgb2YgaW5kaXZpZHVhbHMgb24gdGhlIFdpbGxpYW1zYnVyZyBCcmlkZ2Ugb24gYW55IGdpdmVuIGRhdGUgaXMgYXJvdW5kIDYsMDc0IHBlb3BsZS4gV2Ugcm91bmQgdGhpcyB2YWx1ZSBiZWNhdXNlIHRoZSBudW1iZXIgb2YgaW5kaXZpZHVhbHMgaXMgYSB3aG9sZSBudW1iZXIuIA0KDQpOZXh0LCBsZXQncyBmaW5kIHRoZSB2YXJpYW5jZSBvZiBvdXIgcmVzcG9uc2UgdmFyaWFibGUuDQoNCmBgYHtyfQ0KIyBGaW5kaW5nIHRoZSB2YXJpYW5jZS4NCnZhcmlhbmNlIDwtIHZhcihjeWNsaW5nJFdpbGxpYW1zYnVyZ0JyaWRnZSkNCnByaW50KHZhcmlhbmNlKQ0KYGBgDQoNClRoZSB2YXJpYW5jZSBvZiB0aGUgV2lsbGlhbXNidXJnQnJpZGdlIHZhcmlhYmxlIGlzIDIsNDgyLDgyMi4gVGhpcyBkb2VzIG5vdCBtYXRjaCB1cCB3aXRoIHRoZSB2YWx1ZSBvZiB0aGUgbWVhbiwgYW5kIGluZGljYXRlcyBhIHZpb2xhdGlvbiBvZiBvbmUgdGhlIG5lY2Nlc3NhcnkgY29uZGl0aW9ucyBmb3IgYSBQb2lzc29uIHJlZ3Jlc3Npb24gbW9kZWwuIFRoaXMgaW1wbGllcyB0aGF0IG91ciByZXNwb25zZSB2YXJpYWJsZSBpcyBpbiBmYWN0IG5vdCBhIFBvaXNzb24gcmFuZG9tIHZhcmlhYmxlIGJlY2F1c2UgdGhlIHZhbHVlIG9mIGl0cyBtZWFuIGlzIG5vdCBlcXVpdmFsZW50IHRvIHRoZSB2YWx1ZSBvZiBpdHMgdmFyaWFuY2UuIA0KDQoNCiMjIyBDb25kaXRpb24gNDogVGhlIGxvZyBvZiB0aGUgbWVhbiByYXRlLCBsb2cgKM67KSwgbXVzdCBiZSBhIGxpbmVhciBmdW5jdGlvbiBvZiB4Lg0KDQpXZSB3aWxsIHRha2UgYSBsb29rIGF0IHRoZSBwbG90IG9mIHRoZSBtZWFuIHJhdGUgYWdhaW5zdCB0aGUgcHJlZGljdG9yIHZhcmlhYmxlcyB0byBjaGVjayB0aGlzIGNvbmRpdGlvbi4gDQoNCkZpcnN0LCBsZXQncyBsb29rIGF0IHRoZSBwcmVkaWN0b3IgdmFyaWFibGUgb2YgZGF0ZSB2cyBvdXIgcmVzcG9uc2UgdmFyaWFibGUgb2YgV2lsbGlhbXNidXJnQnJpZGdlLiANCg0KYGBge3J9DQpwbG90KGN5Y2xpbmckRGF0ZSwgY3ljbGluZyRXaWxsaWFtc2J1cmdCcmlkZ2UsIG1haW4gPSAiRGF0ZSB2cy4gV2lsbGlhbXNidXJnIEJyaWRnZSIsIHhsYWIgPSAiRGF0ZSIsIHlsYWIgPSAiV2lsbGlhbXNidXJnQnJpZGdlIikNCmBgYA0KDQpUaGUgc2NhdHRlcnBsb3Qgb2YgdGhlc2UgdHdvIHZhcmlhYmxlcyBzaG93cyBhIHJhbmRvbSBkaXN0cmlidXRpb24sIGJ1dCBpdCBkb2VzIG5vdCBhcHBlYXIgdG8gZm9sbG93IGEgbGluZWFyIHBhdHRlcm4uIFRoaXMgY291bGQgc3VnZ2VzdCBhIHBvc3NpYmxlIHZpb2xhdGlvbiBvZiB0aGlzIGNvbmRpdGlvbiBkdWUgdG8gdGhlIFdpbGxpYW1zYnVyZ0JyaWRnZSB2YXJpYWJsZSBub3QgYmVpbmcgYSBsaW5lYXIgZnVuY3Rpb24gb2YgdGhlIERhdGUgcHJlZGljdG9yIHZhcmlhYmxlLiANCg0KTmV4dCwgbGV0J3MgbG9vayBhdCB0aGUgcHJlZGljdG9yIHZhcmlhYmxlIG9mIGhpZ2ggdGVtcGVyYXR1cmUgdnMgb3VyIHJlc3BvbnNlIHZhcmlhYmxlIG9mIFdpbGxpYW1zYnVyZ0JyaWRnZS4gDQoNCmBgYHtyfQ0KcGxvdChjeWNsaW5nJEhpZ2hUZW1wLCBjeWNsaW5nJFdpbGxpYW1zYnVyZ0JyaWRnZSwgbWFpbiA9ICJIaWdoVGVtcCB2cy4gV2lsbGlhbXNidXJnIEJyaWRnZSIsIHhsYWIgPSAiSGlnaFRlbXAiLCB5bGFiID0gIldpbGxpYW1zYnVyZ0JyaWRnZSIpDQpgYGANCg0KVGhlIHNjYXR0ZXJwbG90IG9mIHRoZXNlIHR3byB2YXJpYWJsZXMgYWdhaW4gc2hvd3MgYSByYW5kb20gZGlzdHJpYnV0aW9uLCB3aGljaCBpdCBkb2VzIG5vdCBhcHBlYXIgdG8gZm9sbG93IGEgZGlzdGluY3RseSBsaW5lYXIgcGF0dGVybi4gVGhpcyBjb3VsZCBzdWdnZXN0IGEgcG9zc2libGUgdmlvbGF0aW9uIG9mIHRoaXMgY29uZGl0aW9uIGR1ZSB0byB0aGUgV2lsbGlhbXNidXJnQnJpZGdlIHZhcmlhYmxlIG5vdCBiZWluZyBhIGxpbmVhciBmdW5jdGlvbiBvZiB0aGUgSGlnaFRlbXAgcHJlZGljdG9yIHZhcmlhYmxlLiANCg0KTmV4dCwgbGV0J3MgbG9vayBhdCB0aGUgcHJlZGljdG9yIHZhcmlhYmxlIG9mIGxvdyB0ZW1wZXJhdHVyZSB2cyBvdXIgcmVzcG9uc2UgdmFyaWFibGUgb2YgV2lsbGlhbXNidXJnQnJpZGdlLiANCg0KYGBge3J9DQpwbG90KGN5Y2xpbmckTG93VGVtcCwgY3ljbGluZyRXaWxsaWFtc2J1cmdCcmlkZ2UsIG1haW4gPSAiTG93VGVtcCB2cy4gV2lsbGlhbXNidXJnIEJyaWRnZSIsIHhsYWIgPSAiTG93VGVtcCIsIHlsYWIgPSAiV2lsbGlhbXNidXJnQnJpZGdlIikNCmBgYA0KDQpUaGUgc2NhdHRlcnBsb3Qgb2YgdGhlc2UgdHdvIHZhcmlhYmxlcyBhZ2FpbiBzaG93cyBhIHJhbmRvbSBkaXN0cmlidXRpb24sIHdoaWNoIGl0IGRvZXMgbm90IGFwcGVhciB0byBmb2xsb3cgYSBkaXN0aW5jdGx5IGxpbmVhciBwYXR0ZXJuLiBUaGlzIGNvdWxkIHN1Z2dlc3QgYSBwb3NzaWJsZSB2aW9sYXRpb24gb2YgdGhpcyBjb25kaXRpb24gZHVlIHRvIHRoZSBXaWxsaWFtc2J1cmdCcmlkZ2UgdmFyaWFibGUgbm90IGJlaW5nIGEgbGluZWFyIGZ1bmN0aW9uIG9mIHRoZSBMb3dUZW1wIHByZWRpY3RvciB2YXJpYWJsZS4gDQoNCkxhc3RseSwgbGV0J3MgbG9vayBhdCB0aGUgcHJlZGljdG9yIHZhcmlhYmxlIG9mIHByZWNpcGl0YXRpb24gdnMgb3VyIHJlc3BvbnNlIHZhcmlhYmxlIG9mIFdpbGxpYW1zYnVyZ0JyaWRnZS4gDQoNCmBgYHtyfQ0KcGxvdChjeWNsaW5nJFByZWNpcGl0YXRpb24sIGN5Y2xpbmckV2lsbGlhbXNidXJnQnJpZGdlLCBtYWluID0gIlByZWNpcGl0YXRpb24gdnMuIFdpbGxpYW1zYnVyZyBCcmlkZ2UiLCB4bGFiID0gIlByZWNpcGl0YXRpb24iLCB5bGFiID0gIldpbGxpYW1zYnVyZ0JyaWRnZSIpDQpgYGANCg0KVGhlIHNjYXR0ZXJwbG90IG9mIHRoZXNlIHR3byB2YXJpYWJsZXMgYWdhaW4gc2hvd3MgYSBkaXN0cmlidXRpb24gd2hpY2ggZG9lcyBub3QgYXBwZWFyIHRvIGZvbGxvdyBhIGRpc3RpbmN0bHkgbGluZWFyIHBhdHRlcm4sIGl0IGFwcGVhcnMgdGhlIHBvaW50cyBhcmUgbW9zdGx5IGNlbnRlcmVkIGFyb3VuZCB4ID0gMCwgd2l0aCBzb21lIG91dGxpZXJzIHRvIHRoZSByaWdodC4gVGhpcyBjb3VsZCBzdWdnZXN0IGEgcG9zc2libGUgdmlvbGF0aW9uIG9mIHRoaXMgY29uZGl0aW9uIGR1ZSB0byB0aGUgV2lsbGlhbXNidXJnQnJpZGdlIHZhcmlhYmxlIG5vdCBiZWluZyBhIGxpbmVhciBmdW5jdGlvbiBvZiB0aGUgUHJlY2lwaXRhdGlvbiBwcmVkaWN0b3IgdmFyaWFibGUuIA0KDQoNCk92ZXJhbGwsIGl0IHNlZW1zIHRoYXQgd2UgZG8gaGF2ZSBzb21lIHZpb2xhdGlvbnMgb2YgdGhlIGNvbmRpdGlvbnMgb2YgYSBQb2lzc29uIHJlZ3Jlc3Npb24gbW9kZWwsIHdpdGggdGhlIHJlc3BvbnNlIHZhcmlhYmxlIG5vdCBmb2xsb3dpbmcgYSBsaW5lYXIgZnVuY3Rpb24gb2YgdGhlIHByZWRpY3RvciB2YXJpYWJsZXMgaW4gb3VyIG1vZGVsLiANCg0KV2Ugd2lsbCBzdGlsbCBjb250aW51ZSB3aXRoIGJ1aWxkaW5nIHRoZSBQb2lzc29uIHJlZ3Jlc3Npb24gbW9kZWxzLCBidXQgaXQgaXMgaW1wb3J0YW50IHRvIGtlZXAgaW4gbWluZCB0aGF0IHRoZXNlIHZpb2xhdGlvbnMgbWF5IG1lYW4gdGhhdCB0aGUgUG9pc3NvbiByZWdyZXNzaW9uIG1vZGVsIGlzIG5vdCB0aGUgYmVzdCBtb2RlbCBjaG9pY2UgZm9yIHRoaXMgZGF0YSBzZXQgZHVlIHRvIHNvbWUgb2YgdGhlIG5lY2Nlc3NhcnkgY29uZGl0aW9ucyBoYXZpbmcgYmVlbiBmYWlsZWQgdG8gaGF2ZSBiZWVuIG1ldC4gDQoNCg0KDQojIFBvaXNzb24gUmVncmVzc2lvbiBNb2RlbCBvbiBGcmVxdWVuY3kgQ291bnRzIA0KDQpXZSB3aWxsIGJlZ2luIHdpdGggY3JlYXRpbmcgYSBQb2lzc29uIHJlZ3Jlc3Npb24gbW9kZWwgb2YgdGhlIGZyZXF1ZW5jeSBjb3VudHMuIFNwZWNpZmljYWxseSwgdGhpcyBtb2RlbCB3aWxsIGJlIG9uIHRoZSBmcmVxdWVuY3kgY291bnRzIG9mIGluZGl2aWR1YWxzIG9uIHRoZSBXaWxsaWFtc2J1cmcgQnJpZGdlIGZvciBhIGdpdmVuIG9ic2VydmF0aW9ucy4gT3VyIGdvYWwgaXMgdG8gY3JlYXRlIGEgUG9pc3NvbiByZWdyZXNzaW9uIG1vZGVsIHdoaWNoIGNhbiBzdGF0aXN0aWNhbGx5IHNpZ25pZmljYW50bHkgcHJlZGljdCB0aGUgY291bnQgb2YgdGhlIG51bWJlciBvZiBpbmRpdmlkdWFscyBvbiB0aGUgV2lsbGlhbXNidXJnIEJyaWRnZSBmb3IgYSBnaXZlbiBvYnNlcnZhdGlvbiwgYmFzZWQgdXBvbiB0aGUgdmFyaW91cyBmYWN0b3JzIGluIHRoaXMgZGF0YSBzZXQuIA0KDQpXZSB3aWxsIGNyZWF0ZSBvdXIgUG9pc3NvbiByZWdyZXNzaW9uIG1vZGVsIG9uIHRoZSBmcmVxdWVuY3kgY291bnRzLg0KDQpgYGB7cn0NCiMgUG9pc3NvbiBSZWdyZXNzaW9uIE1vZGVsIG9mIENvdW50cw0KbW9kZWwuY291bnRzIDwtIGdsbShXaWxsaWFtc2J1cmdCcmlkZ2UgfiBEYXRlICsgSGlnaFRlbXAgKyBMb3dUZW1wICsgUHJlY2lwaXRhdGlvbiwgZmFtaWx5ID0gcG9pc3NvbihsaW5rID0gImxvZyIpLCBkYXRhID0gY3ljbGluZykNCnBvaXMuY291bnQuY29lZiA9IHN1bW1hcnkobW9kZWwuY291bnRzKSRjb2VmDQprYWJsZShwb2lzLmNvdW50LmNvZWYsIGNhcHRpb24gPSAiUG9pc3NvbiBSZWdyZXNzaW9uIE1vZGVsIGZvciB0aGUgQ291bnRzIG9mIEN5Y2xpc3RzIFxuIG9uIHRoZSBXaWxsaWFtc2J1cmcgQnJpZGdlIikNCmBgYA0KDQpUaGUgcmVncmVzc2lvbiBlcXVhdGlvbiBmb3IgdGhlIFBvaXNzb24gcmVncmVzc2lvbiBtb2RlbCBvbiB0aGUgZnJlcXVlbmN5IGNvdW50cyBpcyBnaXZlbiBhczoNCg0KbG9nKM68KSA9IC0zMjkuNzQxMyArIDAuMDA3OSAqIERhdGUgKyAwLjAwMzYgKiBIaWdoVGVtcCArIDAuMDA3NiAqIExvd1RlbXAgLSAwLjM1MTcgKiBQcmVjaXBpdGF0aW9uDQoNCg0KQWxsIGZvdXIgb2YgdGhlIHByZWRpY3RvciB2YXJpYWJsZXMsIERhdGUsIEhpZ2hUZW1wLCBMb3dUZW1wLCBhbmQgUHJlY2lwaXRhdGlvbiwgYWxsIGhhdmUgcC12YWx1ZXMgb2YgcCA8IC4wMDEuIFRoaXMgaW5kaWNhdGVzIHRoYXQgYWxsIG9mIHRoZSBwcmVkaWN0b3IgaW4gb3VyIG1vZGVsIHZhcmlhYmxlcyBhcmUgc3RhdGlzdGljYWxseSBzaWduaWZpY2FudCBpbiBwcmVkaWN0aW5nIHRoZSB0b3RhbCBleHBlY3RlZCBjb3VudHMgb2YgY3ljbGlzdHMgb24gdGhlIFdpbGxpYW1zYnVyZyBCcmlkZ2Ugb24gYSBnaXZlbiBkYXkuIA0KDQpUaGUgc2lnbmlmaWNhbmNlIG9mIHRoZXNlIHZhcmlhYmxlcyBpbiByZWdhcmRzIHRvIHByZWRpY3RpbmcgdGhlIGV4cGVjdGVkIGNvdW50cyBjYW4gbGlrZWx5IGJlIGF0dHJpYnV0ZWQgdG8gcG90ZW50aWFsIGFkdmVyc2Ugd2VhdGhlciBjb25kaXRpb25zLCBzdWNoIGFzIGV4Y2Vzc2l2ZSBoZWF0IG9yIGNvbGQsIGFsb25nIHdpdGggaW50ZW5zZSBwcmVjaXBpdGF0aW9uIGFuZCBzdG9ybXMgbWFraW5nIGN5Y2xpbmcgbm9uIGlkZWFsIG9uIHRob3NlIGRheXMgd2l0aCBwb29yIGNvbmRpdGlvbnMgZm9yIG91dGRvb3JzIGFjdGl2aXRpZXMgc3VjaCBhcyBjeWNsaW5nLiBUaGVzZSBwcmVkaWN0b3IgdmFyaWFibGVzIGFsbCBiZWluZyBzdGF0aXN0aWNhbGx5IHNpZ25pZmljYW50IHNob3dzIHRoYXQgdGhlIHdlYXRoZXIgYW5kIHRlbXBlcmF0dXJlIGNvbmRpdGlvbnMgZG8gc3VnZ2VzdCBhIGRpc2NyZXBhbmN5IGluIHRoZSBudW1iZXIgb2YgY3ljbGlzdHMgb24gdGhlIFdpbGxpYW1zYnVyZyBCcmlkZ2UgZnJvbSBkYXkgdG8gZGF5IGR1ZSB0byB0aGVzZSBjaGFuZ2VzIGluIHRlbXBlcmF0dXJlIGFuZCBwcmVjaXBpdGF0aW9uLiANCg0KT3ZlcmFsbCwgdGhpcyBQb2lzc29uIG1vZGVsIG9mIHRoZSBmcmVxdWVuY3kgY291bnRzIG9mIHRoZSBjeWNsaXN0cyBvbiB0aGUgV2lsbGlhbXNidXJnIEJyaWRnZSBzaG93ZWQgc3RhdGlzdGljYWwgc2lnbmZpY2FuY2UgaW4gaXRzIHByZWRpY3Rpb24gb2YgdGhlIGV4cGVjdGVkIGxvZyBjb3VudHMgZm9yIHRoZSBudW1iZXIgb2YgY3ljbGlzdHMgb24gdGhlIFdpbGxpYW1zYnVyZyBCcmlkZ2UgZm9yIGEgZ2l2ZW4gb2JzZXJ2YXRpb24uDQoNCg0KDQojIyBSZWdyZXNzaW9uIENvZWZmaWNpZW50cyBJbnRlcnByZXRhdGlvbg0KDQoNClRoZSBQb2lzc29uIHJlZ3Jlc3Npb24gbW9kZWwgb24gZnJlcXVlbmN5IGNvdW50cyB3YXMgZm91bmQgdG8gaGF2ZSB0aGUgZm9sbG93aW5nIHJlZ3Jlc3Npb24gZXF1YXRpb246DQoNCmxvZyjOvCkgPSAtMzI5Ljc0MTMgKyAwLjAwNzkgKiBEYXRlICsgMC4wMDM2ICogSGlnaFRlbXAgKyAwLjAwNzYgKiBMb3dUZW1wIC0gMC4zNTE3ICogUHJlY2lwaXRhdGlvbg0KDQpXZSB3aWxsIGFuYWx5c2lzIHRoZSByZWdyZXNzaW9uIGNvZWZmaWNpZW50cyBmb3IgdGhlIHZhcmlhYmxlcyBpbiB0aGlzIFBvaXNzb24gcmVncmVzc2lvbiBtb2RlbCBvbiBmcmVxdWVuY3kgY291bnRzLg0KDQoqIFRoZSB2YWx1ZSBvZiB0aGUgeS1pbnRlcmNlcHQgaXMgZ2l2ZW4gYXMgLTMyOS43NDEzLiBUaGlzIHJlcHJlc250cyB0aGUgYmFzZWxpbmUgb2YgdGhlIG1lYW4gb2YgbG9nKM68KSB3aGVuIGFsbCBwcmVkaWN0b3IgdmFyaWFibGVzIGFyZSBlcXVhbCB0byAwLiBIb3dldmVyLCB0aGUgeS1pbnRlcmNlcHQgZG9lcyBub3QgaGF2ZSBhIHByYWN0aWNhbCBpbnRlcnByZXRhdGlvbiBvciBtZWFuaW5nIGluIHRoaXMgc2NlbmFyaW8gc28gd2UgYXJlIG5vdCBpbnRlcmVzdGVkIGluIGl0cyBtZWFuaW5nIGZvciB0aGUgUG9pc3NvbiByZWdyZXNzaW9uIG1vZGVsLg0KDQoqIERhdGU6IFRoZSByZWdyZXNzaW9uIGNvZWZmaWNpZW50IG9mIHRoZSBEYXRlIHZhcmlhYmxlIGluIHRoaXMgbW9kZWwgaXMgMC4wMDc5LiBUaGlzIG1lYW5zIHRoYXQgdGhlIG1lYW4gbG9nIG9mIHRoZSBjb3VudHMgaW5jcmVhc2VzIGJ5IDAuMDA3OSB1bml0cyBmb3IgZXZlcnkgMSBkYXkgaW5jcmVhc2UgaW4gdGhlIGRhdGUgb24gd2hpY2ggdGhlIG9ic2VydmF0aW9uIHdhcyBjb2xsZWN0ZWQsIGhvbGRpbmcgYWxsIG90aGVyIHZhcmlhYmxlcyBjb25zdGFudC4NCg0KKiBIaWdoVGVtcDogVGhlIHJlZ3Jlc3Npb24gY29lZmZpY2llbnQgb2YgdGhlIEhpZ2hUZW1wIHZhcmlhYmxlIGluIHRoaXMgbW9kZWwgaXMgMC4wMDM2LiBUaGlzIG1lYW5zIHRoYXQgdGhlIG1lYW4gbG9nIG9mIHRoZSBjb3VudHMgaW5jcmVhc2VzIGJ5IDAuMDAzNiB1bml0cyBmb3IgZXZlcnkgMSBkZWdyZWUgRmFocmVuaGVpdCBpbmNyZWFzZSBpbiB0aGUgaGlnaCB0ZW1wZXJhdHVyZSBmb3IgdGhlIGdpdmVuIG9ic2VydmF0aW9uLCBob2xkaW5nIGFsbCBvdGhlciB2YXJpYWJsZXMgY29uc3RhbnQuIA0KDQoqIExvd1RlbXA6IFRoZSByZWdyZXNzaW9uIGNvZWZmaWNpZW50IG9mIHRoZSBMb3dUZW1wIHZhcmlhYmxlIGluIHRoaXMgbW9kZWwgaXMgMC4wMDc2LiBUaGlzIG1lYW5zIHRoYXQgdGhlIG1lYW4gbG9nIG9mIHRoZSBjb3VudHMgaW5jcmVhc2VzIGJ5IDAuMDA3NiB1bml0cyBmb3IgZXZlcnkgMSBkZWdyZWUgRmFocmVuaGVpdCBpbmNyZWFzZSBpbiB0aGUgbG93IHRlbXBlcmF0dXJlIGZvciB0aGUgZ2l2ZW4gb2JzZXJ2YXRpb24sIGhvbGRpbmcgYWxsIG90aGVyIHZhcmlhYmxlcyBjb25zdGFudC4gDQoNCiogUHJlY2lwaXRhdGlvbjogVGhlIHJlZ3Jlc3Npb24gY29lZmZpY2llbnQgb2YgdGhlIFByZWNpcGl0YXRpb24gdmFyaWFibGUgaW4gdGhpcyBtb2RlbCBpcyAtMC4zNTE3LiBUaGlzIG1lYW5zIHRoYXQgdGhlIG1lYW4gbG9nIG9mIHRoZSBjb3VudHMgZGVjcmVhc2VzIGJ5IDAuMzUxNyB1bml0cyBmb3IgZXZlcnkgMSBpbmNoIGluY3JlYXNlIGluIHRoZSBhbW91bnQgb2YgcHJlY2lwaXRhdGlvbiBmb3IgdGhlIGdpdmVuIG9ic2VydmF0aW9uLCBob2xkaW5nIGFsbCBvdGhlciB2YXJpYWJsZXMgY29uc3RhbnQuIA0KDQoNCg0KDQoNCiMgUG9pc3NvbiBSZWdyZXNzaW9uIE1vZGVsIG9uIFJhdGVzDQoNCk5vdywgd2Ugd2lsbCBjcmVhdGUgYSBQb2lzc29uIHJlZ3Jlc3Npb24gbW9kZWwgb2YgdGhlIHJhdGVzIGF0IHdoaWNoIGN5Y2xpc3RzIGVudGVyIGFuZCBsZWF2ZSB2aWEgdGhlIFdpbGxpYW1zYnVyZyBCcmlkZ2Ugb2Zmc2V0IGJ5IHRoZSB0b3RhbCBudW1iZXIgb2YgY3ljbGlzdHMgb24gYWxsIGZvdXIgb2YgdGhlIG1ham9yIE5ldyBZb3JrIGJyaWRnZXMuIFRoaXMgbW9kZWwsIHVubGlrZSB0aGUgcHJldmlvdXMgbW9kZWwgd2hpY2gganVzdCBmb2N1c2VkIG9uIHRoZSBmcmVxdWVuY3kgY291bnRzIG9mIGN5Y2xpc3RzIG9uIHRoZSBXaWxsaWFtc2J1cmcgQnJpZGdlLCB3aWxsIGFsc28gYWNjb3VudCBmb3IgdGhlIHRvdGFsIG51bWJlciBvZiBjeWNsaXN0cyBvbiBhbGwgZm91ciBvZiB0aGUgbWFqb3IgTmV3IFlvcmsgYnJpZGdlcywgdGhlIEJyb29rbHluIEJyaWRnZSwgdGhlIE1hbmhhdHRhbiBCcmlkZ2UsIHRoZSBXaWxsaWFtc2J1cmcgQnJpZGdlLCBhbmQgdGhlIFF1ZWVuc2Jvcm8gQnJpZGdlLiBUaGlzIFBvaXNzb24gbW9kZWwgd2lsbCBsb29rIGF0IHRoZSByYXRlcyBvZiB0aGUgbnVtYmVyIG9mIGN5Y2xpc3RzIG9uIHRoZSBXaWxsaWFtc2J1cmcgQnJpZGdlIGZvciBhIGdpdmVuIG9ic2VydmF0aW9uIGFzIGEgcmF0ZSBvdXQgb2YgdGhlIHRvdGFsIG51bWJlciBvZiBjeWNsaXN0cyBvbiBhbGwgZm91ciBvZiB0aGVzZSBtYWpvciBicmlkZ2VzIGZvciB0aGF0IHNwZWNpZmljIG9ic2VydmF0aW9uLg0KDQpXZSB3aWxsIGJ1aWxkIG91ciBQb2lzc29uIHJlZ3Jlc3Npb24gbW9kZWwgZm9yIHRoZSByYXRlcy4gVGhpcyB0aW1lLCB3ZSB3aWxsIHN0aWxsIHVzZSB0aGUgV2lsbGlhbXNidXJnQnJpZGdlIHZhcmlhYmxlIGFzIG91ciByZXNwb25zZSB2YXJpYWJsZSwgYnV0IHdlIHdpbGwgb2Zmc2V0IHRoZSBtb2RlbCBieSB0aGUgVG90YWwgdmFyaWFibGUgdG8gbWFrZSBvdXIgUG9pc3NvbiBtb2RlbCBmb3IgdGhlIHJhdGVzIG9mIGN5Y2xpc3RzIG9uIHRoZSBXaWxsaWFtc2J1cmcgQnJpZGdlIG91dCBvZiB0aGUgdG90YWwgbnVtYmVyIG9mIGN5Y2xpc3RzIG9uIGFsbCBmb3VyIG9mIHRoZSBicmlkZ2VzLiANCg0KDQpgYGB7cn0NCiMgUG9pc3NvbiBNb2RlbCBvZiBSYXRlcw0KbW9kZWwucmF0ZXMgPC0gZ2xtKFdpbGxpYW1zYnVyZ0JyaWRnZSB+IERhdGUgKyBIaWdoVGVtcCArIExvd1RlbXAgKyBQcmVjaXBpdGF0aW9uLCBvZmZzZXQgPSBsb2coVG90YWwpLCANCiAgICAgICAgICAgICAgICAgICBmYW1pbHkgPSBwb2lzc29uKGxpbmsgPSAibG9nIiksIGRhdGEgPSBjeWNsaW5nKQ0Ka2FibGUoc3VtbWFyeShtb2RlbC5yYXRlcykkY29lZiwgY2FwdGlvbiA9ICJQb2lzc29uIFJlZ3Jlc3Npb24gTW9kZWwgb2YgdGhlIFJhdGVzIG9mIEN5Y2xpc3RzIFxuIG9uIHRoZSBXaWxsaWFtc2J1cmcgQnJpZGdlIG91dCBvZiBhbGwgRm91ciBCcmlkZ2VzIikNCmBgYA0KDQpUaGUgcmVncmVzc2lvbiBlcXVhdGlvbiBmb3IgdGhlIFBvaXNzb24gcmVncmVzc2lvbiBtb2RlbCBvbiB0aGUgcmF0ZXMgaXMgZ2l2ZW4gYXM6DQoNCmxvZyjOvC90KSA9IC01MC40MTAyICsgMC4wMDExICogRGF0ZSAtIDAuMDA1MSAqIEhpZ2hUZW1wICsgMC4wMDkzICogTG93VGVtcCAtIDAuMDM1NyAqIFByZWNpcGl0YXRpb24NCg0KDQpBbGwgZm91ciBvZiB0aGUgcHJlZGljdG9yIHZhcmlhYmxlcyBpbiB0aGlzIFBvaXNzb24gbW9kZWwsIERhdGUsIEhpZ2hUZW1wLCBMb3dUZW1wLCBhbmQgUHJlY2lwaXRhdGlvbiwgYWxsIGhhdmUgcC12YWx1ZXMgb2YgcCA8IC4wMDEuIFRoaXMgaW5kaWNhdGVzIHRoYXQgYWxsIG9mIHRoZSBwcmVkaWN0b3IgaW4gb3VyIG1vZGVsIHZhcmlhYmxlcyBhcmUgc3RhdGlzdGljYWxseSBzaWduaWZpY2FudCBpbiBwcmVkaWN0aW5nIHRoZSB0b3RhbCBleHBlY3RlZCBjb3VudHMgb2YgY3ljbGlzdHMgb24gdGhlIFdpbGxpYW1zYnVyZyBCcmlkZ2Ugb24gYSBnaXZlbiBkYXksIG9mZnNldCBieSB0aGUgdG90YWwgbnVtYmVyIG9mIGN5Y2xpc3RzIG9uIGFsbCBmb3VyIG9mIHRoZSBtYWpvciBOZXcgWW9yayBicmlkZ2VzLiANCg0KVGhpcyBtb2RlbCBzaG93cyBzdGF0aXN0aWNhbCBzaWduaWZpY2FuY2UgaW4gcHJlZGljdGluZyB0aGUgZXhwZWN0ZWQgY291bnRzIG9mIHRoZSBjeWNsaXN0cyBvbiB0aGUgV2lsbGlhbXNidXJnIEJyaWRnZSBieSB1c2luZyB0aGUgcmF0ZXMgZm9yIHRoZSBwcmVkaWN0aW9uLiBUaGlzIGluZGljYXRlcyB0aGF0IHRoaXMgbW9kZWwgZm9yIHRoZSByYXRlcyBzaG93cyBzdGF0aXN0aWNhbCBzaWduaWZpY2FuY2UgaW4gaXRzIHByZWRpY3RpdmUgcG93ZXIgYW5kIHByb3ZpZGVzIGdvb2QgdXRpbGl0eSBmb3IgcHJlZGljdGlvbiBhbmQgZXN0aW1hdGlvbi4gDQoNCg0KIyMgUmVncmVzc2lvbiBDb2VmZmljaWVudHMgSW50ZXJwcmV0YXRpb24NCg0KDQoqIFRoZSB2YWx1ZSBvZiB0aGUgeS1pbnRlcmNlcHQgaXMgZ2l2ZW4gYXMgLTUwLjQxMDIgVGhpcyByZXByZXNlbnRzIHRoZSBiYXNlbGluZSBvZiB0aGUgbWVhbiBvZiB0aGUgbG9nIGNvdW50cyBtdWx0aXBsaWVkIGJ5IHQsIHdoZW4gYWxsIHByZWRpY3RvciB2YXJpYWJsZXMgYXJlIGVxdWFsIHRvIDAuIEhvd2V2ZXIsIHRoZSB5LWludGVyY2VwdCBkb2VzIG5vdCBoYXZlIGEgcHJhY3RpY2FsIGludGVycHJldGF0aW9uIG9yIG1lYW5pbmcgaW4gdGhpcyBzY2VuYXJpbyBzbyB3ZSBhcmUgbm90IGludGVyZXN0ZWQgaW4gaXRzIG1lYW5pbmcgZm9yIHRoZSBQb2lzc29uIHJlZ3Jlc3Npb24gbW9kZWwuDQoNCiogRGF0ZTogVGhlIHJlZ3Jlc3Npb24gY29lZmZpY2llbnQgb2YgdGhlIERhdGUgdmFyaWFibGUgaW4gdGhpcyBtb2RlbCBpcyAwLjAwMTEuIFRoaXMgbWVhbnMgdGhhdCB0aGUgbWVhbiBvZiB0aGUgbG9nIGNvdW50cyBtdWx0aXBsZWQgYnkgdCBpbmNyZWFzZXMgYnkgMC4wMDExLiB1bml0cyBmb3IgZXZlcnkgMSBkYXkgaW5jcmVhc2UgaW4gdGhlIGRhdGUgb24gd2hpY2ggdGhlIG9ic2VydmF0aW9uIHdhcyBjb2xsZWN0ZWQsIGhvbGRpbmcgYWxsIG90aGVyIHZhcmlhYmxlcyBjb25zdGFudC4NCg0KKiBIaWdoVGVtcDogVGhlIHJlZ3Jlc3Npb24gY29lZmZpY2llbnQgb2YgdGhlIEhpZ2hUZW1wIHZhcmlhYmxlIGluIHRoaXMgbW9kZWwgaXMgLTAuMDA1MSBUaGlzIG1lYW5zIHRoYXQgdGhlIG1lYW4gb2YgdGhlIGxvZyBjb3VudHMgbXVsdGlwbGVkIGJ5IHQgZGVjcmVhc2VzIGJ5IDAuMDA1MSB1bml0cyBmb3IgZXZlcnkgMSBkZWdyZWUgRmFocmVuaGVpdCBpbmNyZWFzZSBpbiB0aGUgaGlnaCB0ZW1wZXJhdHVyZSBmb3IgdGhlIGdpdmVuIG9ic2VydmF0aW9uLCBob2xkaW5nIGFsbCBvdGhlciB2YXJpYWJsZXMgY29uc3RhbnQuIA0KDQoqIExvd1RlbXA6IFRoZSByZWdyZXNzaW9uIGNvZWZmaWNpZW50IG9mIHRoZSBMb3dUZW1wIHZhcmlhYmxlIGluIHRoaXMgbW9kZWwgaXMgMC4wMDkzLiBUaGlzIG1lYW5zIHRoYXQgdGhlIGxvZyBjb3VudHMgbXVsdGlwbGVkIGJ5IHQgaW5jcmVhc2VzIGJ5IDAuMDA5MyB1bml0cyBmb3IgZXZlcnkgMSBkZWdyZWUgRmFocmVuaGVpdCBpbmNyZWFzZSBpbiB0aGUgbG93IHRlbXBlcmF0dXJlIGZvciB0aGUgZ2l2ZW4gb2JzZXJ2YXRpb24sIGhvbGRpbmcgYWxsIG90aGVyIHZhcmlhYmxlcyBjb25zdGFudC4gDQoNCiogUHJlY2lwaXRhdGlvbjogVGhlIHJlZ3Jlc3Npb24gY29lZmZpY2llbnQgb2YgdGhlIFByZWNpcGl0YXRpb24gdmFyaWFibGUgaW4gdGhpcyBtb2RlbCBpcyAwLjAzNTcuIFRoaXMgbWVhbnMgdGhhdCB0aGUgbG9nIGNvdW50cyBtdWx0aXBsZWQgYnkgdCBpbmNyZWFzZXMgYnkgMC4wMzU3IHVuaXRzIGZvciBldmVyeSAxIGluY2ggaW5jcmVhc2UgaW4gdGhlIGFtb3VudCBvZiBwcmVjaXBpdGF0aW9uIGZvciB0aGUgZ2l2ZW4gb2JzZXJ2YXRpb24sIGhvbGRpbmcgYWxsIG90aGVyIHZhcmlhYmxlcyBjb25zdGFudC4NCg0KDQoNCg0KIyBTdW1tYXJ5IGFuZCBDb21wYXJpc29ucyBvZiB0aGUgVHdvIE1vZGVscw0KDQpCb3RoIG9mIHRoZSB0d28gUG9pc3NvbiByZWdyZXNzaW9uIG1vZGVsIHdlIGNyZWF0ZWQsIHRoZSBtb2RlbCBmb3IgdGhlIGZyZXF1ZW5jeSBjb3VudHMgYW5kIHRoZSBtb2RlbCBmb3IgdGhlIHJhdGVzLCBwcm92aWRlZCBzdGF0aXN0aWNhbCBzaWduaWZpY2FuY2UgZm9yIHByZWRpY3Rpb24gYW5kIHNob3dlZCBnb29kIHV0aWxpdHkgb3ZlcmFsbC4gSW4gYm90aCBvZiB0aGVzZSBtb2RlbHMsIHdlIGxvb2tlZCBpbnRvIHRoZSB0b3RhbCBudW1iZXIgb2YgY3ljbGlzdHMgb24gdGhlIFdpbGxpYW1zYnVyZyBCcmlkZ2UgaW4gTmV3IFlvcmsgZm9yIGEgc3BlY2lmaWMgb2JzZXJ2YXRpb24sIGFuZCB3ZSBsb29rZWQgaW50byB0aGUgdmFyaW91cyBmYWN0b3JzIG9mIHRoYXQgc3BlY2lmaWMgZGF0ZS4gV2UgbG9va2VkIGF0IHRoZSBkYXRlIG9mIHRoZSBvYnNlcnZhdGlvbiBhbG9uZyB3aXRoIHNvbWUgZmFjdG9ycyB3aGljaCBtYXkgYWZmZWN0IHRoZSB0b3RhbCBudW1iZXIgb2YgY3ljbGlzdHMgb3V0IG9uIHRoYXQgc3BlY2lmaWMgZGF0ZS4gVGhlc2UgZmFjdG9ycyBpbmNsdWRlZCB0aGUgaGlnaCB0ZW1wZXJhdHVyZSwgdGhlIGxvdyB0ZW1wZXJhdHVyZSwgYW5kIHRoZSBhbW91bnQgb2YgcHJlY2lwaXRhdGlvbiBmb3IgdGhhdCBnaXZlbiBkYXRlLiBJdCB0dXJuZWQgb3V0IHRoYXQgYWxsIG9mIHRoZXNlIGZhY3RvcnMgd2VyZSBpbmRlZWQgc3RhdGlzdGljYWxseSBzaWduaWZpY2FudCBmb3IgYm90aCBvZiB0aGUgdHdvIFBvaXNzb24gcmVncmVzc2lvbiBtb2RlbHMsIGluZGljYXRpbmcgdGhhdCB0aGVzZSB3ZWF0aGVyIHJlbGF0ZWQgY29uZGl0aW9ucyBoYXZlIGEgc3RhdGlzdGljYWxseSBzaWduaWZpY2FudCBpbXBhY3Qgb24gYm90aCB0aGUgY291bnRzIGFuZCB0aGUgcmF0ZXMgb2YgY3ljbGlzdHMgb3V0IG9uIHRoZSBXaWxsaWFtc2J1cmcgQnJpZGdlIGZvciBhIGdpdmVuIG9ic2VydmF0aW9uLiBUaGlzIGNhbiBiZSBhdHRyaWJ1dGVkIHRvIGNlcnRhaW4gd2VhdGhlciBjb25kaXRpb25zIG1ha2luZyBpdCBtb3JlIG9yIGxlc3MgaWRlYWwgZm9yIGluZGl2aWR1YWxzIHRvIGJlIGN5Y2xpbmcgb3V0ZG9vcnMuIEZvciBpbnN0YW5jZSwgYSBkYXkgd2l0aCBpbmNyZWRpYmx5IGhpZ2ggdGVtcGVyYXR1cmVzLCBpbmNyZWRpYmx5IGNvbGQgdGVtcGVyYXR1cmVzLCBvciBzZXZlcmUgc3Rvcm1zIHdpdGggaGVhdnkgcHJlY2lwaXRhdGlvbiB3b3VsZCBiZSBsZXNzIGlkZWFsIGFuZCBsaWtlbHkgbGVhZCB0byBsZXNzIGN5Y2xpc3RzIGJlaW5nIG91dCBvbiB0aGF0IGdpdmVuIGRheSBhcyBvcHBvc2VkIHRvIGEgZGF5IHdpdGggcGxlYXNhbnQgd2VhdGhlci4gDQoNCk92ZXJhbGwsIGJvdGggb2YgdGhlIFBvaXNzb24gcmVncmVzc2lvbiBtb2RlbHMgc2hvd2VkIHN0YXRpc3RpY2FsIHNpZ25pZmljYW5jZSBhbmQgZ29vZCB1dGlsaXR5IGluIHRoZWlyIHByZWRpY3Rpb24uIEhvd2V2ZXIsIGFzIHdhcyBwcmV2aW91c2x5IHN0YXRlZCwgdGhlcmUgd2VyZSBzb21lIHZpb2xhdGlvbnMgb2YgdGhpcyBjb25kaXRpb25zIGZvciBhIFBvaXNzb24gcmVncmVzc2lvbiBtb2RlbCB3aXRoaW4gb3VyIGRhdGEgc2V0LiBGaXJzdCwgaXQgd2FzIGZvdW5kIHRoYXQgdGhlIG1lYW4gb2YgdGhlIHJlc3BvbnNlIHZhcmlhYmxlLCBXaWxsaWFtc2J1cmdCcmlkZ2UsIHdhcyBub3QgZXF1YWwgdG8gaXRzIHZhcmlhbmNlLiBUaGlzIHN1Z2dlc3RzIHRoYXQgdGhpcyByZXNwb25zZSB2YXJpYWJsZSBpbiBmYWN0IGlzIG5vdCBQb2lzc29uIGRpc3RyaWJ1dGVkLCBkdWUgdG8gaXQgZmFpbGluZyB0byBtZWV0IHRoZSBjb25kaXRpb24gZm9yIGEgUG9pc3NvbiByYW5kb20gdmFyaWFibGUgb2YgaXRzIG1lYW4gYmVpbmcgZXF1YWwgdG8gaXRzIHZhcmlhbmNlLiBBZGRpdGlvbmFsbHksIGFsbCBmb3VyIHByZWRpY3RvciB2YXJpYWJsZXMgd2VyZSBjaGVja2VkLCBhbmQgaXQgd2FzIGZvdW5kIHRoYXQgdGhlIHJlc3BvbnNlIHZhcmlhYmxlIGluIGZhY3Qgd2FzIG5vdCBhIGxpbmVhciBmdW5jdGlvbiBvZiBhbnkgb2YgdGhlc2UgcHJlZGljdG9yIHZhcmlhYmxlcy4gVGhpcyBpbmRpY2F0ZXMgYW5vdGhlciBtYWpvciB2aW9sYXRpb24gb2YgdGhpcyBkYXRhIHNldC4gVGhlc2UgdmlvbGF0aW9ucyBzdWdnZXN0IHRoYXQgcGVyaGFwcyBhIFBvaXNzb24gbW9kZWwgd2FzIG5vdCB0aGUgYmVzdCBtb2RlbCBjaG9pY2UgZm9yIHRoaXMgZGF0YSBzZXQsIGFuZCB0aGF0IGl0IGlzIGltcG9ydGFudCB0byBiZSBtaW5kZnVsIG9mIHRoZXNlIHZpb2xhdGlvbnMgd2hlbiB1c2luZyBlaXRoZXIgb2YgdGhlIFBvaXNzb24gcmVncmVzc2lvbiBtb2RlbHMgd2UgY3JlYXRlZCBmb3IgcHJlZGljdGlvbi4gDQoNCg0KDQoNCiMgQ29uY2x1c2lvbg0KDQpPdmVyYWxsLCB0d28gUG9pc3NvbiByZWdyZXNzaW9uIG1vZGVscyB3ZXJlIGNyZWF0ZWQgaW4gdGhpcyBwcm9qZWN0LiBCb3RoIG9mIHRoZXNlIG1vZGVscyBsb29rZWQgYXQgdGhlIHRvdGFsIG51bWJlciBvZiBjeWNsaXN0cyBvbiB0aGUgV2lsbGlhbXNidXJnIEJyaWRnZSBmb3IgYSBnaXZlbiBkYXkuIFRoZSBmaXJzdCBtb2RlbCBsb29rZWQgYXQgdGhlIGNvdW50cyBvZiBjeWNsaXN0cyB0aGF0IHdlcmUgb24gdGhlIFdpbGxpYW1zYnVyZyBCcmlkZ2UsIGFuZCB0aGUgc2Vjb25kIG1vZGVsIGxvb2tlZCBhdCB0aGUgcmF0ZXMgb2YgdGhlIGN5Y2xpc3RzIHRoYXQgd2VyZSBvbiB0aGUgV2lsbGlhbXNidXJnIEJyaWRnZSBvZmZzZXQgYnkgdGhlIHRvdGFsIG51bWJlciBvZiBjeWNsaXN0cyBvbiBhbGwgZm91ciBvZiB0aGUgbWFqb3IgTmV3IFlvcmsgYnJpZGdlcy4gDQoNCkJvdGggb2YgdGhlc2UgdHdvIFBvaXNzb24gcmVncmVzc2lvbiBtb2RlbHMgc2hvd2VkIHN0YXRpc3RpY2FsIHNpZ25pY2lmYW5jZSBpbiB0aGVpciBwcmVkaWN0aW9ucywgd2l0aCBhbGwgb2YgdGhlIHByZWRpY3RvciB2YXJpYWJsZXMgaW4gYm90aCBvZiB0aGVzZSB0d28gbW9kZWxzIGhhdmUgcC12YWx1ZXMgb2YgcCA8IC4wMDEuIFRoaXMgaW5kaWNhdGVzIHRoYXQgdGhlIGZhY3RvcnMgaW4gdGhlIGRhdGEgc2V0IG9mIERhdGUsIEhpZ2hUZW1wLCBMb3dUZW1wLCBhbmQgUHJlY2lwaXRhdGlvbiBhcmUgc3RhdGlzdGljYWxseSBzaWduaWZpY25hY2UgaW4gcHJlZGljdGluZyB0aGUgZnJlcXVlbmN5IGNvdW50cyBvciB0aGUgcmF0ZXMgb2YgdGhlIGN5Y2xpc3RzIG9uIHRoZSBXaWxsaWFtc2J1cmcgQnJpZGdlIGZvciBhIGdpdmVuIG9ic2VydmF0aW9uLiANCg0KSG93ZXZlciwgb3VyIGRhdGEgc2V0IGZhaWxlZCB0byBtZWV0IHNvbWUgb2YgdGhlIG5lY2Nlc3NhcnkgY29uZGl0aW9ucyBmb3IgYSBQb2lzc29uIHJlZ3Jlc3Npb24gbW9kZWwuIFRoZSBtZWFuIG9mIHRoZSByZXNwb25zZSB2YXJpYWJsZSwgV2lsbGlhbXNidXJnQnJpZGdlLCB3YXMgbm90IGVxdWFsIHRvIGl0cyB2YXJpYW5jZS4gVGhpcyBzdWdnZXN0cyB0aGF0IHRoaXMgcmVzcG9uc2UgdmFyaWFibGUgaW4gZmFjdCBpcyBub3QgUG9pc3NvbiBkaXN0cmlidXRlZC4gQWxzbywgYWxsIGZvdXIgcHJlZGljdG9yIHZhcmlhYmxlcyB3ZXJlIGNoZWNrZWQsIGFuZCBpdCB3YXMgZm91bmQgdGhhdCB0aGUgcmVzcG9uc2UgdmFyaWFibGUgaW4gZmFjdCB3YXMgbm90IGEgbGluZWFyIGZ1bmN0aW9uIG9mIGFueSBvZiB0aGVzZSBwcmVkaWN0b3IgdmFyaWFibGVzLiBUaGVzZSBhcmUgdHdvIHZpb2xhdGlvbnMgb2YgdGhlIGFzc3VtcHRpb25zIGZvciBhIFBvaXNzb24gcmVncmVzc2lvbiBtb2RlbC4gVGhlc2UgdmlvbGF0aW9ucyBtZWFuIHRoYXQgcGVyaGFwcyBhIFBvaXNzb24gcmVncmVzc2lvbiBtb2RlbCB3YXMgbm90IHRoZSBiZXN0IGNob2ljZSBmb3IgdGhpcyBkYXRhIHNldCwgYW5kIHRoYXQgdGhlc2UgdmlvbGF0aW9ucyBzaG91bGQgYmUga2VwdCBpbiBtaW5kIHdoZW4gdXNpbmcgZWl0aGVyIG9mIHRoZXNlIG1vZGVscyBmb3IgcHJlZGljdGlvbi4NCg0KDQoNCg0KDQojIyBSZWNvbW1lbmRhdGlvbnMNCg0KU29tZSByZWNvbW1lbmRhdGlvbnMgSSB3b3VsZCBzdWdnZXN0IGZvciBmdXJ0aGVyIHByb2plY3RzIGluY2x1ZGU6DQoNCiogTG9vayBmdXJ0aGVyIGludG8gdGhlIHZpb2xhdGlvbnMgdGhhdCB3ZXJlIGZvdW5kIHdpdGhpbiB0aGlzIGRhdGEgc2V0IGFuZCBsb29rIGludG8gcG9zc2libGUgZXhwbGFuYXRpb25zIGZvciB0aGVzZSB2aW9sYXRpb25zIG9mIHRoZSBuZWNlc3NpdGllcyBvZiBhIFBvaXNzb24gcmVncmVzc2lvbiBtb2RlbC4gRnVydGhlciBjb25zaWRlciB3aGV0aGVyIHRoZSBQb2lzc29uIHJlZ3Jlc3Npb24gbW9kZWwgaW4gZmFjdCBpcyB0aGUgYmVzdCBjaG9pY2UgZm9yIHRoaXMgZGF0YSBzZXQgYW5kIGlmIGl0IGlzIHN1ZmZpY2llbnQgdG8gdXNlIHRoaXMgbW9kZWwgZm9yIHByZWRpY3Rpb24gZGVzcGl0ZSB0aGVzZSB2aW9sYXRpb25zLg0KDQoqIENvbnNpZGVyIG90aGVyIHZhcmlhYmxlcyB3aGljaCBtYXkgYWZmZWN0IHRoZSBudW1iZXIgb2YgY3ljbGlzdHMgb3V0IG9uIGEgZ2l2ZW4gb2JzZXJ2YXRpb24uIFBlcmhhcHMgdGhlcmUgYXJlIG90aGVyIGZhY3RvcnMgd2hpY2ggbWF5IHByb3ZpZGUgZnVydGhlciBzaWduaWZpY2FuY2UgZm9yIG1vZGVsIGJ1aWxkaW5nIHdoaWNoIG1heSBzdHJlbmd0aGVuIHRoZSByZWdyZXNzaW9uIG1vZGVsLg0KDQoqIEZ1cnRoZXIgZXhwYW5kIHRoZSBkYXRhIHNldCB0byBlbnN1cmUgdGhlIGFjY3VyYWN5IG9mIHRoZSBwcmVkaWN0aW9ucyBhbmQgdG8gZnVydGhlciBzdHJlbmd0aGVuIHRoZSBQb2lzc29uIHJlZ3Jlc3Npb24gbW9kZWxzLiANCg0KDQoNCg0K