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. We will also create a Quassi-Poisson regression model and analyze the dispersion of our model.

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, I will find the data set which will be used for this assignment. I ran the code which was given in the assignment description, and the data set I received was for the Williamsburg Bridge, so that is what we will use for this Poisson regression modeling project. When opening the downloaded data set, I noticed some issues with the data set not being properly stored. The Date and Day variable had the exact same values, and these values did not make sense within the context of this situation. I went through and fixed these values with how the appeared in the original data set, which was given under the tab data2 in the w09-AssignDataSet.xlsx file. I replaced the improper values in the Date and Day variable with what was in the original data set. Now, the Date variable is an identification of the date on which the observation occurred. And, the Day variable represents the day of the week on which the observation occurred. I also checked all of the other variables to ensure their values were not also messed up in the formatting of the excel file, but they all appeared to be all good without anything having gotten changed during the downloading process.

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':   30 obs. of  7 variables:
 $ Date              : chr  "4/1" "4/2" "4/3" "4/4" ...
 $ Day               : chr  "Saturday" "Sunday" "Monday" "Tuesday" ...
 $ HighTemp          : num  46 62.1 63 51.1 63 48.9 48 55.9 66 73.9 ...
 $ LowTemp           : num  37 41 50 46 46 41 43 39.9 45 55 ...
 $ Precipitation     : num  0 0 0.03 1.18 0 0.73 0.21 0 0 0 ...
 $ WilliamsburgBridge: int  1915 4207 5178 2279 5711 1739 3399 4082 4886 6881 ...
 $ Total             : int  5397 13033 16325 6581 17991 4896 10341 11610 14899 21295 ...

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 7 total variables in the cycling data set. These variables include:

  • Date: This represents the date on which a given observation was collected. This is the observation ID number. This variable is just for identification purposes of the observations, not for actual prediction. The date is given in the format of month/day.

  • Day: This is a character predictor variable which represents the day of the week on which a given observation was collected. For instance, Monday, Tuesday, etc.

  • HighTemp: A quantitative predictor variable representing the high temperature on the given day, given in degrees Fahrenheit.

  • LowTemp: A quantitative predictor variable representing the low temperature on the given day, given in degrees Fahrenheit.

  • Precipitation: A quantitative predictor variable representing the amount of precipitation, rain, which occurred on the given day, given in inches.

  • WilliamsburgBridge: A quantitative variable representing the total number of cyclists on the Williamsburg Bridge on a given observation. This will be our response variable for the Poisson regression models.

  • Total: The total number of cyclists on all bridges on a given observation. This will be the variable which is offset for our Poisson regression model of the rates and for the Quassi-Poisson regression model.

We also will create two new variables within our analysis later on to use for the Poisson regression model building process. These two variables include:

  • AvgTemp: A quantitative predictor variable representing the average temperature for a given observation, given in degrees Fahrenheit. This variable will be the average of HighTemp and LowTemp, found by calculating (HighTemp + LowTemp)/2.

  • NewPrecip: A discretized version of the Precipitation variable. This will be a binary predictor variable, where 0 represents a precipitation value equal to 0 inches, and where 1 represents a precipitation value greater than 0 inches.

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?

  • Is the Quasi-Poisson regression model a better choice than the either of the standard Poisson regression models for frequency counts and for rates? How dispersed is this Quasi-Poisson regression model?

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. We will also create a Quasi-Poisson regression model and we will find how dispered it is. We will determine which of these models is the ideal choice for our final regression model.

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
Date Day HighTemp LowTemp Precipitation WilliamsburgBridge Total
4/1 Saturday 46.0 37 0.00 1915 5397
4/2 Sunday 62.1 41 0.00 4207 13033
4/3 Monday 63.0 50 0.03 5178 16325
4/4 Tuesday 51.1 46 1.18 2279 6581
4/5 Wednesday 63.0 46 0.00 5711 17991
4/6 Thursday 48.9 41 0.73 1739 4896

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.

First, let’s check if there are any missing variables in our data set.

colSums(is.na(cycling))
              Date                Day           HighTemp            LowTemp 
                 0                  0                  0                  0 
     Precipitation WilliamsburgBridge              Total 
                 0                  0                  0 

It turns out that all of the variables in the data set have exactly zero missing values. So, there are no missing values in our data set. This is very good and means we can move on with further analyzing the data set and the variables within it.

2.1 Variable Transformations

We will transform some of our predictor variables before beginning with our analysis and building the Poisson regression models.

First, we will create a new variable for the temperature which is an average of the high temperature and the low temperature for that given observation. We will call our new variable AvgTemp and this will serve as the average of the HighTemp and the LowTemp variables.

# Creating the new AvgTemp variable.
cycling$AvgTemp <- (cycling$HighTemp + cycling$LowTemp)/2

Now, we have a new variable, AvgTemp, representing the average of the high temperature and the low temperature for a given observation.

Next, we will discretize the Precipitation variable. We will create a variable called NewPrecip which will be a discretized version of the original Precipitation variable. For this discretized variable, NewPrecip will equal 0 if Precipitation equals 0 for that observation, and NewPrecip will equal 1 if Precipitation is greater than 0 for that observation.

We will make the NewPrecip variable a binary variable with 0 representing precipitation of 0 inches, and 1 representing precipitation greater than 0 inches. We will also convert this binary NewPrecip variable into an integer variable instead of a numeric variable.

# Creating the NewPrecip variable.
cycling$NewPrecip <- ifelse(cycling$Precipitation == 0, 0, 1)

# Making the binary variable an int.
cycling$NewPrecip <- as.integer(cycling$NewPrecip)

Now, we have a discretized NewPrecip variable in our data set which represents a binary predictor variable where 0 is for a precipitation of 0 inches and 1 is for a precipitation greater than 0 inches.

2.2 Checking the Variable Distributions

We have three predictor variables which we want to use in our final model, Day, AvgTemp, and NewPrecip. Out of these variables, Day is a categorical character variable, AvgTemp is a quantitative variable, and NewPrecip is a binary variable. We will check that the distributions of all of these variables appear to be random, without any noticeable patterns or concerns which could cause issues with the model building process.

First, let’s look at our Day variable. This is a categorical character variable. In order to check that this variable is properly distributed without any major concerns, we will look for if there are any potential imbalances within this variable. An imbalance would occur if there were a significantly greater number of observations occuring on one day as opposed to another day. We will check that there are not any substantial imbalances within the Day variable.

table(cycling$Day)

   Friday    Monday  Saturday    Sunday  Thursday   Tuesday Wednesday 
        4         4         5         5         4         4         4 

It appears that all days of the week from Monday to Friday have exactly four observations in our data set. The weekend days of Saturday and Sunday both have exactly five observations in our data set. As we can see, the observations appear to be distributed very evenly amongst the days of the week, with the weekend days only having one more observation each than the weekdays. Overall, this variable appears to be overall evenly distributed, and so there are not any imbalances to be concerned about for our Day predictor variable.

Next, let’s check the distribution of our AvgTemp variable. This is a quantitative predictor variable and so we can check its distribution by using a histogram. We will check to see if this variable has an overall normal distribution without any notable skew or outliers.

ylimit = max(density(cycling$AvgTemp)$y)
hist(cycling$AvgTemp, probability = TRUE, main = "AvgTemp Distribution", xlab="AvgTemp", 
       col = "aliceblue", border="cornflowerblue")
  lines(density(cycling$AvgTemp, adjust=2), col="darkorchid")

It appears that our distribution histogram of the AvgTemp variable is unimodal with majority of the data being centered at an average temperature between 55 and 60 degrees Fahrenheit. The distribution appears to follow an approximately normal distribution without any noteable skew or outliers. It does appear like perhaps there is slightly more entries on the left side of the histogram, but it is only by a very slight amount and is not significant enough to cause a noticeable skew in the distribution. Overall, it appears safe to say that our AvgTemp variable follows an approximately normal distribution, and so this variable will be all good to use in our model building process.

Lastly, let’s check our NewPrecip variable. This is a binary predictor variable, and so we can expect it to have values of only 0 and 1. In order to check the reliability of this variable in its use for prediction, we will make sure it appears to meet this criteria of a binary variable. We can take a look at a table to ensure that there are only two possible entries for this NewPrecip variable, 0 and 1, because these are the only two values which a binary variable can be.

table(cycling$NewPrecip)

 0  1 
18 12 

As we can see, this NewPrecip variable has only two entries, 0 and 1. This is exactly what we wanted to see because these are the only two variables which a binary variable can be. We can see that there are slightly more days with no precipitation, a value of 0, with 18 total observations, than days with precipitation, a value of 1, with 12 total observations. However, this difference is not large enough to be a cause for concern. And so, we can conclude that everything is alright with with our binary predictor variable of NewPrecip, and that we can continue with the model building process.

Now, we have checked the distributions of all three of our predictor variables, Day, AvgTemp, and NewPrecip, and ensured that there are not any apparent issues with any of these variables or their distributions. So, we can continue with using these predictor variables in our model building process.

2.3 Asumptions and Conditions

Before we begin with building our model, we must check the assumptions and conditions which are required for a Poisson regression model.

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 necessary conditions required for a Poisson Regression Model.

2.3.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.3.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.3.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] 4942.267

The mean of the WilliamsburgBridge variable is 4,942.267. 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 4,943 people. We round this value up because the number of individuals is a whole number and so the decimal must be rounded up to the next whole number to represent that part as an individual.

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

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

The variance of the WilliamsburgBridge variable is 3,005,665. 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.3.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.

Since our first predictor variable is Day, and this a categorical, character variable, it would not create a linear function because it is made up of categorical inputs. So, instead, we will look at the numerical predictor variable instead to check this condition.

Let’s look at the predictor variable of average temperature vs our response variable of WilliamsburgBridge. AvgTemp is a quantitative, numeric variable so we can use it to check this condition.

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

The scatterplot of the two variables of AvgTemp and WilliamsburgBridge shows what does appear to be a linear relationship of these two variables. We can see a positive relationship between the two variables, as average temperature increases, so does the number of cyclists on the Williamsburg Bridge. This seems logical as it makes sense that more people would want to go outside and go cycling on a day that is warmer outside rather than a day that is colder outside. The relationship of the two variables does appear to have a moderate strength, but the linear pattern can definitely be seen. So, it does appear that WilliamsburgBridge is a linear function of AvgTemp, which verifies this necessary condition for a Poisson regression model.

Lastly, we have our predictor variable of NewPrecip. This is a binary predictor variable, so we will only see points at x = 0 and x = 1 if we were to create a scatterplot of this binary predictor variable of NewPrecip. So, we can not expect to see a linear relationship between NewPrecip and WilliamsburgBridge, because NewPrecip can only have values of 0 and 1, not anything in between due to it being a binary predictor variable.

Overall, we can consider this condition satisfied since our numerical predictor variable of AvgTemp showed that it does indeed have a linear relationship with our response variable.

2.3.5 Summary of Violations

Overall, it seems that we do have one notable violation of the conditions of a Poisson regression model within our data set. We found that the response variable, WilliamsburgBridge, does not meet the necessary criteria of a Poisson random variable, because its mean is not equal to its variance. This is a major concern, because it points to a major violation of the conditions required for a Poisson regression model.

This violation of the conditions for a Poisson regression model suggests a major concern with our data set, as it fails to meet a major condition which is required for a Poisson regression model. This suggest that perhaps a Poisson regression model may not be the best model choice for this data set after all.

We will still continue with building the Poisson regression models for this project, but it is important to keep in mind that this violation may mean that the Poisson regression model is not the best model choice for this data set due to the necessary condition of the mean of the response variable equaling the variance of the response variable having been failed to have been met.

3 Poisson Regression Models on the Original Variables

First, we will look at the Poisson regression models which were created in the previous week’s assignment and look at the corrected versions of these models. We will use the original predictor variables first, and then in later steps of this project we will use the new predictor variables of AvgTemp and NewPrecip.

In the previous week’s assignment, we created two Poisson regression models, one on frequency counts and one of the rates. We will create these again to see the proper, corrected models. Since in the previous week’s assingment, we did not alter any of the predictor variables for these two models, we will use the original variables for now and then create models using the new predictor variables of AvgTemp and NewPrecip.

For now, we will use the old predictor variables of Day, HighTemp, LowTemp, and Precipitation. These were the predictor variables used in the previous week’s assignment, so we will first begin by correcting the models which were created in that assignment before we been creating the new models for this project.

3.1 Poisson Regression Model on Frequency Counts

We will begin with creating a Poisson regression model of the frequency counts. 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 ~ Day + 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) 7.6535762 0.0220219 347.544093 0.0000000
DayMonday 0.0545822 0.0099489 5.486232 0.0000000
DaySaturday -0.2743978 0.0101644 -26.996022 0.0000000
DaySunday -0.2345666 0.0097363 -24.091886 0.0000000
DayThursday 0.0319064 0.0102933 3.099730 0.0019370
DayTuesday 0.1988133 0.0103531 19.203340 0.0000000
DayWednesday 0.0511286 0.0100775 5.073556 0.0000004
HighTemp 0.0170556 0.0005874 29.037387 0.0000000
LowTemp -0.0023861 0.0007830 -3.047372 0.0023085
Precipitation -1.0320675 0.0165996 -62.174240 0.0000000

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

log(μ) = 7.6538 + 0.0546 * DayMonday - 0.2744 * DaySaturday - 0.2346 * DaySunday + 0.0319 * DayThursday + 0.1988 * DayTuesday + 0.0511 * DayWednesday + 0.0171 * HighTemp - 0.0024 * LowTemp - 1.0321 * Precipitation

All of the predictor variables, DayMonday, DaySaturday, DaySunday, DayThursday, DayTuesday, DayWednesday, 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 significance in its prediction of the expected log counts for the number of cyclists on the Williamsburg Bridge for a given observation.

For our categorical predictor variable of Day, Friday was chosen as the base line level, which can be seen by how there is not a “DayFriday” variable in the regression equation output. This is because of the seven days, Friday is the one which comes first alphabetically and R chooses the level which comes first alphabetically as the base line level. Therefore, for our regression coefficient interpretations for the different levels of the Day variable, these values will be compared against the base line level of Friday.

3.1.1 Regression Coefficients Interpretation

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 7.6536. This represents 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.

  • DayMonday (p < .001): The regression coefficient for the variable DayMonday was found to be 0.0546. This means that the mean log count of cyclists on the Williamsburgs Bridge was 0.0546 greater on Monday than on Friday. We can also say this means that the count of cyclists is 1.0561 times greater on Monday than on Friday, holding all other variables constant.

  • DaySaturday (p < .001): The regression coefficient for the variable DaySaturday was found to be -0.2744. This means that the mean log count of cyclists on the Williamsburgs Bridge was 0.2744 less on Saturday than on Friday. We can also say this means that the count of cyclists is 0.7600 times greater on Saturday than on Friday, holding all other variables constant.

  • DaySunday (p < .001): The regression coefficient for the variable DaySunday was found to be -0.2346. This means that the mean log count of cyclists on the Williamsburgs Bridge was 0.2346 less on Sunday than on Friday. We can also say this means that the count of cyclists is 0.7909 times greater on Sunday than on Friday, holding all other variables constant.

  • DayThursday (p = 0.0019): The regression coefficient for the variable DayThursday was found to be 0.0319. This means that the mean log count of cyclists on the Williamsburgs Bridge was 0.0319 greater on Thursday than on Friday. We can also say this means that the count of cyclists is 1.0324 times greater on Thursday than on Friday, holding all other variables constant.

  • DayTuesday (p < .001): The regression coefficient for the variable DayTuesday was found to be 0.1988. This means that the mean log count of cyclists on the Williamsburgs Bridge was 0.1988 greater on Tuesday than on Friday. We can also say this means that the count of cyclists is 1.2199 times greater on Tuesday than on Friday, holding all other variables constant.

  • DayWednesday (p <.001): The regression coefficient for the variable DayWednesday was found to be 0.0511. This means that the mean log count of cyclists on the Williamsburgs Bridge was 0.0511 greater on Wednesday than on Friday. We can also say this means that the count of cyclists is 1.0524 times greater on Wednesday than on Friday, holding all other variables constant.

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

  • LowTemp (p = 0.0023): The regression coefficient of the LowTemp variable in this model is -0.0024. This means that the mean log of the counts decreases by 0.0024 units for every 1 degree Fahrenheit increase in the low temperature for the given observation, holding all other variables constant.

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

3.2 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 ~ Day + 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) -1.0682224 0.0223058 -47.8899346 0.0000000
DayMonday 0.0003873 0.0099397 0.0389685 0.9689155
DaySaturday 0.0375055 0.0100984 3.7140004 0.0002040
DaySunday 0.0051455 0.0097487 0.5278112 0.5976304
DayThursday 0.0205573 0.0102839 1.9989823 0.0456103
DayTuesday 0.0138077 0.0103909 1.3288272 0.1839050
DayWednesday 0.0233018 0.0100672 2.3146274 0.0206333
HighTemp -0.0011895 0.0005867 -2.0272588 0.0426359
LowTemp 0.0003500 0.0007846 0.4460900 0.6555322
Precipitation 0.0505341 0.0161127 3.1362935 0.0017110

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

log(μ/t) = -1.0682 + 0.0004 * DayMonday + 0.0375 * DaySaturday + 0.0051 * DaySunday + 0.0206 * DayThursday + 0.0138 * DayTuesday + 0.0233 * DayWednesday - 0.0012 * HighTemp + 0.0004 * LowTemp + 0.0505 * Precipitation

All 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.

Like was stated for the Poisson regression model on frequency counts, Friday was chosen by R to be the base line level of the Day variable, and so we will compare the regression coefficients against this base line level.

3.2.1 Regression Coefficients Interpretation

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

  • The value of the y-intercept is given as -1.0682. 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.

  • DayMonday (p = 0.9689): The regression coefficient for the variable DayMonday was found to be 0.0004. This means that the mean log count of cyclists on the Williamsburgs Bridge was 0.0004 greater on Monday than on Friday. We can also say this means that the count of cyclists is 1.0056 times greater on Monday than on Friday, holding all other variables constant.

  • DaySaturday (p < .001): The regression coefficient for the variable DaySaturday was found to be 0.0375. This means that the mean log count of cyclists on the Williamsburgs Bridge was 0.0375 greater on Saturday than on Friday. We can also say this means that the count of cyclists is 1.0382 times greater on Saturday than on Friday, holding all other variables constant.

  • DaySunday (p = 0.5976): The regression coefficient for the variable DaySunday was found to be 0.0051. This means that the mean log count of cyclists on the Williamsburgs Bridge was 0.0051 greater on Sunday than on Friday. We can also say this means that the count of cyclists on Sunday is 1.005 times greater on Sunday than on Friday, holding all other variables constant.

  • DayThursday (p = 0.0456): The regression coefficient for the variable DayThursday was found to be 0.0206. This means that the mean log count of cyclists on the Williamsburgs Bridge was 0.0206 greater on Thursday than on Friday. We can also say this means that the count of cyclists is 1.0208 times greater on Thursday than on Friday, holding all other variables constant.

  • DayTuesday (p = 0.1839): The regression coefficient for the variable DayTuesday was found to be 0.0138. This means that the mean log count of cyclists on the Williamsburgs Bridge was 0.0138 greater on Tuesday than on Friday. We can also say this means that the count of cyclists is 1.0139 times greater on Tuesday than on Friday, holding all other variables constant.

  • DayWednesday (p 0.0206): The regression coefficient for the variable DayThursday was found to be 0.0233. This means that the mean log count of cyclists on the Williamsburgs Bridge was 0.0233 greater on Wednesday than on Friday. We can also say this means that the count of cyclists is 1.0236 times greater on Wednesday than on Friday, holding all other variables constant.

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

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

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

3.3 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.

4 Poisson Regression Model on Frequency Counts

We will begin with creating a Poisson regression model of the frequency counts using the new variables we created for this project. 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 ~ Day + AvgTemp + NewPrecip, 
                    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) 7.2024973 0.0209663 343.527497 0.0000000
DayMonday 0.0301551 0.0095684 3.151542 0.0016241
DaySaturday -0.1944899 0.0100224 -19.405597 0.0000000
DaySunday -0.2450724 0.0097649 -25.097317 0.0000000
DayThursday -0.0298802 0.0101579 -2.941565 0.0032656
DayTuesday -0.0604242 0.0100400 -6.018322 0.0000000
DayWednesday 0.1714460 0.0101413 16.905694 0.0000000
AvgTemp 0.0253493 0.0003233 78.418600 0.0000000
NewPrecip -0.3407990 0.0063666 -53.528941 0.0000000

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

log(μ) = 7.2025 + 0.0302 * DayMonday - 0.1945 * DaySaturday - 0.2451 * DaySunday - 0.0299 * DayThursday - 0.0604 * DayTuesday + 0.1714 * DayWednesday + 0.0253 * AvgTemp - 0.3408 * NewPrecip

All of the predictor variables, Day, AvgTemp, and NewPrecip, 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.

For our categorical predictor variable of Day, Friday was chosen as the base line level, which can be seen by how there is not a “DayFriday” variable in the regression equation output. This is because of the seven days, Friday is the one which comes first alphabetically and R chooses the level which comes first alphabetically as the base line level. Therefore, for our regression coefficient interpretations for the different levels of the Day variable, these values will be compared against the base line level of Friday.

4.1 Regression Coefficients Interpretation

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 7.2025 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.

  • DayMonday (p < .001): The regression coefficient of the DayMonday variable in this model is 0.0302. This means that the mean log count of cyclists on the Williamsburgs Bridge was 0.0302 greater on Monday than on Friday. We can also say this means that the count of cyclists is 1.0307 times greater on Monday than on Friday, holding all other variables constant.

  • DaySaturday (p < .001): The regression coefficient of the DaySaturday variable in this model is -0.1945. This means that the mean log count of cyclists on the Williamsburgs Bridge was 0.1945 less on Monday than on Friday. We can also say this means that the count of cyclists is 0.8232 times greater on Monday than on Friday, holding all other variables constant.

  • DaySunday (p < .001): The regression coefficient of the DaySunday variable in this model is -0.2451. This means that the mean log count of cyclists on the Williamsburgs Bridge was 0.2451 less on Sunday than on Friday. We can also say this means that the count of cyclists is 0.7826 times greater on Sunday than on Friday, holding all other variables constant.

  • DayThursday (p < .001): The regression coefficient of the DayThursday variable in this model is -0.0299. This means that the mean log count of cyclists on the Williamsburgs Bridge was 0.0299 less on Thursday than on Friday. We can also say this means that the count of cyclists is 0.9705 times greater on Thursday than on Friday, holding all other variables constant.

  • DayTuesday (p < .001): The regression coefficient of the DayTuesday variable in this model is -0.0604. This means that the mean log count of cyclists on the Williamsburgs Bridge was 0.0604 less on Tuesday than on Friday. We can also say this means that the count of cyclists is 0.9414 times greater on Tuesday than on Friday, holding all other variables constant.

  • DayWednesday (p < .001): The regression coefficient of the DayWednesday variable in this model is 0.1714. This means that the mean log count of cyclists on the Williamsburgs Bridge was 0.1714 greater on Monday than on Friday. We can also say this means that the count of cyclists is 1.1870 times greater on Monday than on Friday, holding all other variables constant.

  • AvgTemp (p < .001): The regression coefficient of the AvgTemp variable in this model is 0.0253. This means that the mean log of the counts increases by 0.0253 units for every 1 degree Fahrenheit increase in the average temperature for the given observation, holding all other variables constant.

  • NewPrecip (p < .001): The regression coefficient of the NewPrecip variable in this model is -0.3408. This means that the mean log of the count of cyclists on the Williamsburg Bridge is 0.3408 less on days where there is precipitation than on days where there is no precipitation. We can also say that the count of cyclists is 0.7112 greater on days with precipitation than on days with no precipitation.

All of the predictor variables in this Poisson regression model on frequency counts were statistically significant with all of their p-values being equal to p < .001.

5 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, using the new variables we created in this project.

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 ~ Day + AvgTemp + NewPrecip, 
                   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) -1.0435841 0.0210730 -49.5222689 0.0000000
DayMonday 0.0018152 0.0095668 0.1897380 0.8495145
DaySaturday 0.0345382 0.0100162 3.4482277 0.0005643
DaySunday 0.0034566 0.0098102 0.3523466 0.7245783
DayThursday 0.0236982 0.0101422 2.3365925 0.0194604
DayTuesday 0.0252916 0.0101088 2.5019260 0.0123520
DayWednesday 0.0183518 0.0101291 1.8117867 0.0700192
AvgTemp -0.0014673 0.0003301 -4.4449423 0.0000088
NewPrecip 0.0136632 0.0063769 2.1426111 0.0321443

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

log(μ/t) = -1.0436 + 0.0018 * DayMonday + 0.0345 * DaySaturday + 0.0035 * DaySunday + 0.0237 * DayThursday + 0.0253 * DayTuesday + 0.0184 * DayWednesday - 0.0015 * AvgTemp + 0.0137 * NewPrecip

The variables DaySaturday, DayThursday, DayTuesday, AvgTemp, and NewPrecip all had p-values less than the alpha value of 0.05, meaning that these are the variables which are statistically significant in this model.

Like was stated for the Poisson regression model on frequency counts, Friday was chosen by R to be the base line level of the Day variable, and so we will compare the regression coefficients against this base line level.

5.1 Regression Coefficients Interpretation

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 -1.0436. 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.

  • DayMonday (p = .8495): The regression coefficient of the DayMonday variable in this model is 0.0018. This means that the mean log count of cyclists on the Williamsburgs Bridge was 0.0018 greater on Monday than on Friday. We can also say this means that the count of cyclists is 1.0018 times greater on Monday than on Friday, holding all other variables constant.

  • DaySaturday (p < .001): The regression coefficient of the DaySaturday variable in this model is 0.0345. This means that the mean log count of cyclists on the Williamsburgs Bridge was 0.0345 greater on Saturday than on Friday. We can also say this means that the count of cyclists is 1.0351 times greater on Saturday than on Friday, holding all other variables constant.

  • DaySunday (p = 0.7246): The regression coefficient of the DaySunday variable in this model is 0.0035. This means that the mean log count of cyclists on the Williamsburgs Bridge was 0.0035 greater on Sunday than on Friday. We can also say this means that the count of cyclists is 1.0035 times greater on Sunday than on Friday, holding all other variables constant.

  • DayThursday (p = 0.0195): The regression coefficient of the DayThursday variable in this model is 0.0237. This means that the mean log count of cyclists on the Williamsburgs Bridge was 0.0237 greater on Thursday than on Friday. We can also say this means that the count of cyclists is 1.0240 times greater on Thursday than on Friday, holding all other variables constant.

  • DayTuesday (p = 0.0124): The regression coefficient of the DayTuesday variable in this model is 0.0253. This means that the mean log count of cyclists on the Williamsburgs Bridge was 0.0253 greater on Tuesday than on Friday. We can also say this means that the count of cyclists is 1.0256 times greater on Tuesday than on Friday, holding all other variables constant.

  • DayWednesday (p = 0.0700): The regression coefficient of the DayWednesday variable in this model is 0.0184. This means that the mean log count of cyclists on the Williamsburgs Bridge was 0.0184 greater on Wednesday than on Friday. We can also say this means that the count of cyclists is 1.0186 times greater on Wednesday than on Friday, holding all other variables constant.

  • AvgTemp (p < .001): The regression coefficient of the AvgTemp variable in this model is -0.0015. This means that the mean log of the counts decreases by 0.0015 units for every 1 degree Fahrenheit increase in the average temperature for the given observation, holding all other variables constant.

  • NewPrecip (p = .0321): The regression coefficient of the NewPrecip variable in this model is 0.0137. This means that the mean log of the count of cyclists on the Williamsburg Bridge is 0.0137 greater on days where there is precipitation than on days where there is no precipitation. We can also say that the count of cyclists is 1.0138 greater on days with precipitation than on days with no precipitation.

Out of all of the predictor variables, the ones which showed statistical significance were DaySaturday (p < .001), DayThursday (p = 0.019), DayTuesday (p = 0.0124), AvgTemp (p < .001), and NewPrecip (p = .0321). All of the predictor variables have p-values less than the alpha value of 0.05, indicating they are statistically significant to the model.

The variables of DayMonday (p = .8495), DaySunday (p = 0.7246), and DayWednesday (p = 0.0700) did not show statistical significance as they have p-values greater than the alpha value of 0.05, indicating they are not statistically significant to the model.

6 Quassi-Poisson Regression Model

Next, we will create a Quasi-Poisson regression model. This Quassi-Poisson regression model will be done on the rates, and so it will be offset by the Total variable, while still using WilliamsburgBridge as its response variable for this model.

# Quasi-Poisson Regression Model
quasimodel.rates <- glm(WilliamsburgBridge ~ Day + AvgTemp + NewPrecip, 
                        offset = log(Total), 
                        family = quasipoisson, data = cycling)
summary(quasimodel.rates)

Call:
glm(formula = WilliamsburgBridge ~ Day + AvgTemp + NewPrecip, 
    family = quasipoisson, data = cycling, offset = log(Total))

Coefficients:
              Estimate Std. Error t value Pr(>|t|)    
(Intercept)  -1.043584   0.043411 -24.040   <2e-16 ***
DayMonday     0.001815   0.019708   0.092   0.9275    
DaySaturday   0.034538   0.020633   1.674   0.1090    
DaySunday     0.003457   0.020209   0.171   0.8658    
DayThursday   0.023698   0.020893   1.134   0.2695    
DayTuesday    0.025292   0.020824   1.215   0.2380    
DayWednesday  0.018352   0.020866   0.880   0.3891    
AvgTemp      -0.001467   0.000680  -2.158   0.0427 *  
NewPrecip     0.013663   0.013137   1.040   0.3101    
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

(Dispersion parameter for quasipoisson family taken to be 4.243634)

    Null deviance: 151.051  on 29  degrees of freedom
Residual deviance:  89.094  on 21  degrees of freedom
AIC: NA

Number of Fisher Scoring iterations: 3
pander(summary(quasimodel.rates)$coef, caption = "Quasi-Poisson Regression Model")
Quasi-Poisson Regression Model
  Estimate Std. Error t value Pr(>|t|)
(Intercept) -1.044 0.04341 -24.04 9.198e-17
DayMonday 0.001815 0.01971 0.09211 0.9275
DaySaturday 0.03454 0.02063 1.674 0.109
DaySunday 0.003457 0.02021 0.171 0.8658
DayThursday 0.0237 0.02089 1.134 0.2695
DayTuesday 0.02529 0.02082 1.215 0.238
DayWednesday 0.01835 0.02087 0.8795 0.3891
AvgTemp -0.001467 0.00068 -2.158 0.04268
NewPrecip 0.01366 0.01314 1.04 0.3101

The regression equation of the Quasi-Poisson Regression Model is given as follows:

log(μ/t) = -1.0436 + 0.0018 * DayMonday + 0.0345 * DaySaturday + 0.0035 * DaySunday + 0.0237 * DayThursday + 0.0253 * DayTuesday + 0.0184 * DayWednesday - 0.0015 * AvgTemp + 0.0137 * NewPrecip

As we can see, the Quassi-Poisson regression model has the same coefficient estimates as the standard Poisson regression model on rates, however, the p-values for these regression coefficients are different between these two models.

So, the regression coefficients for this Quassi-Poisson regression model would be the exact same as they were for the previous model we just found on the Poisson regression model of rates for the new predictor variables of Day, AvgTemp, and NewPrecip.

Out of all of the predictor variables in our Quassi-Poisson regression model on rates, only the variable of AvgTemp (p = 0.043) was statistically significant, as it was the only predictor variable with a p-value less than the alpha value of 0.05. This means, AvgTemp is the only statistically significant predictor variable in predicting the cyclists on the Williamsburg Bridge.

All of the other predictor variables, DayMonday, DaySaturday, DaySunday, DayThursday, DayTuesday, DayWednesday, and NewPrecip, were not statistically significant in the Quassi-Poisson regression model, because they all had p-values greater than the alpha value of 0.05.

6.1 Dispersion

Now, we will look at the dispersion parameter for the Quassi-Poisson regression model in order to see how dispersed it is.

In this output of the model summary, we were given that the dispersion parameter for the Quasi-Poisson model is 4.2436. This dispersion parameter given in the model summary is the Pearson dispersion parameter.

We can also calculate the Deviance dispersion parameter to compare these two dispersion parameters for our Quassi-Poisson regression model on rates.

# Dispersion Parameters
yhat = quasimodel.rates$fitted.values
pearson.resid = (cycling$WilliamsburgBridge - yhat)/sqrt(yhat)
Pearson.dispersion = sum(pearson.resid^2)/quasimodel.rates$df.residual
Deviance.dispersion = (quasimodel.rates$deviance)/quasimodel.rates$df.residual
disp = cbind(Pearson.dispersion = Pearson.dispersion, 
             Deviance.dispersion = Deviance.dispersion)
kable(disp, caption="Dispersion parameter", align = 'c')
Dispersion parameter
Pearson.dispersion Deviance.dispersion
4.243633 4.242561

As we can see, the value of the Pearson dispersion parameter for our Quassi-Poisson regression model is 4.2436. The value of the Deviance dispersion parameter for our Quassi-Poisson regression model is 4.2426.

These dispersion parameters show that our model is indeed fairly dispersed, as these dispersion indexes do differ from the value of 1 by quite a fair amount. We can conclude that our model is signficantly dispered and therefore, using the standard Poisson regression model would likely not be an ideal choice due to the potential of over-dispersion leading to innaccurate results for prediction. The dispersion in our model significantly differing from a value of 1 indicates that the Quassi-Poisson model likely is the better choice as we do have some significant dispersion.

7 Final Model

Now, for our final model we must choose between the standard Poisson regression model on rates and the Quassi-Poisson regression model.

One important thing to note when making this choice, is that the regular Poisson model assumes that the mean of the response variable is equal to its variance while the Quassi-Poisson model does not. When we checked the conditions of the standard Poisson regression model earlier, we found that the mean of the response variable does not equal its variance, indicating a major violation. This violation would cause some concern for the regular Poisson regression model as it suggest that the response variable is, in fact, not a Poisson random variable, and therefore a standard Poisson regression model may not be the best choice for this data set.

Here, the Quassi-Poisson model has the advantage as it does not assume that the mean of the response variable is equal to its variance, which is good for our data set since it failed to meet this required condition for a standard Poisson regression model.

Both models have advantages in disadvantages which must be considered when making the choice of a final model. The standard Poisson regression model on rates showed strong statistical significance for the majority of its predictor variables. However, the data set failed to meet the condition of the mean of the predictor variable equaling its variance which raises concern for the fit of this model. On the other hand, the Quassi-Poisson regression model does not require this condition of the mean of the response variable equaling its variance. However, in the Quassi-Poisson model, only one single predictor variable showed any statistical significance, indicating that this model may not be significant in its predictions after all.

Additionally, we found that our data is significantly dispersed, with a dispersion parameter of 4.2436, which is significantly different from 1. Since our data is signficantly dispersed, it is likely that a standard Poisson regression model is not the ideal choice as this over-dispersion can lead to inaccruate results from this standard Poisson regression model. When the data is signficantly dispersed, the Quassi-Poisson regression model should be used. So, even though the Quassi-Poisson regression model in this case did not show very good statistical signficance within the variables for prediction, it is likely the better choice as our data is significantly dispersed.

In the end, it seems to be a choice between the standard Poisson regression model which is more statistically significant, but likely has poorer accuracy in its predictions due to over-dispersion, and the Quassi-Poisson regression model, which shows worse statistical significance, but accounts for dispersion and is not affected by our data set failing to meet all of the conditions required for Poisson regression.

Overall, I would say that the Quassi-Poisson regression model is the safer choice of the two, as it does not require the condition of the mean of the response variable to equal its variance, as this was something our data set failed. Additionally, using a standard Poisson regression model on over-dispersed data can lead to inaccuracy in the results of its predictions. However, this Quassi-Poisson regression model shows much poorer significance which means that the results it provides may not be significant after all. But, the Quassi-Poisson regression model reamins the better choice in this situation as our data fails the required condition for the response variable to be a Poisson random variable, and we did see significant dispersion as well.

8 Visual Comparisons

Now, let’s look at some visual comparisons of the data within our models.

I chose to create a graph which illustrated the predicted rates of the cyclists on the Williamsburg Bridge based upon the day of the week and whether or not it rained for that given day. This graph will create two lines, one for precipitation (blue), and one for no precipitation (red).

graph <- expand.grid(
  Day = cycling$Day, 
  NewPrecip = cycling$NewPrecip, 
  AvgTemp = mean(cycling$AvgTemp, na.rm = TRUE),  
  Total = mean(cycling$Total, na.rm = TRUE)      
)
graph$predicted_rate <- predict(quasimodel.rates, newdata = graph, type = "response")

graph$NewPrecip <- factor(graph$NewPrecip, levels = c(0, 1), labels = c("No Precipitation", "Precipitation"))

ggplot(graph, aes(x = Day, y = predicted_rate, color = NewPrecip, group = NewPrecip)) +
  geom_line(size = 1) +   
  geom_point(size = 2) +   
  labs(title = "Predicted Rates of the Cyclists \n on the Williamsburg Bridge by the \n Day of the Week and the Precipitation \n Conditions",
       x = "Day", 
       y = "Rate of Cyclists",
       color = "Precipitation Conditions") +
  theme_minimal() + theme(axis.text.x = element_text(angle = 45, hjust = 1))

As we can see, this graph illustrates the predicts the rate of the cyclists on the Williamsburg Bridge out of all four of the total major New York bridges. This graph predicts this rate of the cyclists on the Williamsburg Bridge based on the day of the week and whether there was precipitation or not. This graph creates two lines, one for precipitation (blue), and one for no precipitation (red). This graph creates points for each of the seven days of the week and for whether there was precipiation or not on those days.

As we can see by looking at our graph, it is predicted that the highest rate of cyclists on the Williamsburg Bridge occurs on Saturdays with precipitation, and the lowest rate of cyclists on the Williamsburg Bridge occurs on Fridays with no precipitation.

9 Conclusion

Overall, we looked at various Poisson regression models in this project to predict the frequency counts and the rates of the cyclists on the Williamsburg Bridge. We also looked at a Quassi-Poisson regression model to account for the dispersion of the data along with the violations that were seen which indicated that a standard Poisson regression model may not be the ideal fit for our data.

It was found that our standard Poisson regression model on rates had several variables which showed statistical significance, indicating that these predictor variables were statistically significant in predicting the rates of cyclists on the Williamsburg Bridge. In our Quassi-Poisson regression model, only one of the predictor variables showed statistical significance in predicting the rates of cyclists on the Williamsburg Bridge. This made it seem like the standard Poisson regression model provided better significance for prediction.

However, we looked at the dispersion parameter of the Quassi-Poisson regression model and found that our data is in fact significantly dispersed. This indicates that a standard Poisson regression model is likely not an ideal choice due to it not accounting for this over-dispersion which can lead to innacury in the results of its prediction. This over-dispersion along with the fact that our data set violated the condition of the mean of the response variable equaling its variance, showed that the standard Poisson regression model is not an ideal choice after all. Due to this significant dispersion, the Quassi-Poisson regression model would be the better and safer choice than the standard regression model, despite it having less statistically significant variables. Even though the Quassi-Poisson regression model was less statistically significant, it provides better accuracy due to the data being dispersed, even though it shows that the majority of the predictor variables were not statistcially significant in their prediction of the rates of cyclists on the Williamsburg Bridge.

9.1 Recommendations

Some recommendations I would make for future projects include:

  • Look further into the violation that was found within this data set and look into possible explanations for why this violation occurred. It was found that the mean of the response variable is not equal to its variance, which violates one of the necessities of a Poisson regression model. It should be further considered whether a 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. For instance, maybe a variable looking at whether there are any holidays or other notable events occurring on the day of a given observation could be useful. This could be a binary predictor variable with a value of 1 if there are any events or holidays, and a value of 0 if there are not. This could perhaps be useful as there may tend to be less cyclists out if there is a major holiday or an event occurring in the city on that given observation.

  • Further expand the data set to ensure the accuracy of the predictions and to further strengthen the Poisson regression models. By collecting more observations over a longer period of time, this could help to further strenghten the Poisson regression models are provide better accuracy and reliability in the results found by the model building process. This would help strengthen the conclusions and findings found in the process of bulding the Poisson regression models of this data set.

LS0tDQp0aXRsZTogIlF1YXNzaSBQb2lzc29uIFJlZ3Jlc3Npb24gTW9kZWwgb2YgdGhlIEN5Y2xpc3RzIG9uIHRoZSBXaWxsaWFtc2J1cmcgQnJpZGdlIg0KYXV0aG9yOiAiSm9zaWUgR2FsbG9wIg0KZGF0ZTogIjIwMjQtMTEtMDgiDQpvdXRwdXQ6DQogIGh0bWxfZG9jdW1lbnQ6IA0KICAgIHRvYzogeWVzDQogICAgdG9jX2RlcHRoOiA0DQogICAgdG9jX2Zsb2F0OiB5ZXMNCiAgICBmaWdfd2lkdGg6IDYNCiAgICBmaWdfY2FwdGlvbjogeWVzDQogICAgbnVtYmVyX3NlY3Rpb25zOiB5ZXMNCiAgICB0b2NfY29sbGFwc2VkOiB5ZXMNCiAgICBjb2RlX2ZvbGRpbmc6IGhpZGUNCiAgICBjb2RlX2Rvd25sb2FkOiB5ZXMNCiAgICBzbW9vdGhfc2Nyb2xsOiB5ZXMNCiAgICB0aGVtZTogbHVtZW4NCiAgd29yZF9kb2N1bWVudDogDQogICAgdG9jOiB5ZXMNCiAgICB0b2NfZGVwdGg6IDQNCiAgICBmaWdfY2FwdGlvbjogeWVzDQogICAga2VlcF9tZDogeWVzDQogIHBkZl9kb2N1bWVudDogDQogICAgdG9jOiB5ZXMNCiAgICB0b2NfZGVwdGg6IDQNCiAgICBmaWdfY2FwdGlvbjogeWVzDQogICAgbnVtYmVyX3NlY3Rpb25zOiB5ZXMNCmVkaXRvcl9vcHRpb25zOiANCiAgY2h1bmtfb3V0cHV0X3R5cGU6IGNvbnNvbGUNCi0tLQ0KDQpgYGB7PWh0bWx9DQoNCjxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+DQoNCi8qIENhc2NhZGluZyBTdHlsZSBTaGVldHMgKENTUykgaXMgYSBzdHlsZXNoZWV0IGxhbmd1YWdlIHVzZWQgdG8gZGVzY3JpYmUgdGhlIHByZXNlbnRhdGlvbiBvZiBhIGRvY3VtZW50IHdyaXR0ZW4gaW4gSFRNTCBvciBYTUwuIGl0IGlzIGEgc2ltcGxlIG1lY2hhbmlzbSBmb3IgYWRkaW5nIHN0eWxlIChlLmcuLCBmb250cywgY29sb3JzLCBzcGFjaW5nKSB0byBXZWIgZG9jdW1lbnRzLiAqLw0KDQpoMS50aXRsZSB7ICAvKiBUaXRsZSAtIGZvbnQgc3BlY2lmaWNhdGlvbnMgb2YgdGhlIHJlcG9ydCB0aXRsZSAqLw0KICBmb250LXNpemU6IDI0cHg7DQogIGNvbG9yOiBEYXJrUmVkOw0KICB0ZXh0LWFsaWduOiBjZW50ZXI7DQogIGZvbnQtZmFtaWx5OiAiR2lsbCBTYW5zIiwgc2Fucy1zZXJpZjsNCn0NCmg0LmF1dGhvciB7IC8qIEhlYWRlciA0IC0gZm9udCBzcGVjaWZpY2F0aW9ucyBmb3IgYXV0aG9ycyAgKi8NCiAgZm9udC1zaXplOiAyMHB4Ow0KICBmb250LWZhbWlseTogc3lzdGVtLXVpOw0KICBjb2xvcjogRGFya1JlZDsNCiAgdGV4dC1hbGlnbjogY2VudGVyOw0KfQ0KaDQuZGF0ZSB7IC8qIEhlYWRlciA0IC0gZm9udCBzcGVjaWZpY2F0aW9ucyBmb3IgdGhlIGRhdGUgICovDQogIGZvbnQtc2l6ZTogMThweDsNCiAgZm9udC1mYW1pbHk6IHN5c3RlbS11aTsNCiAgY29sb3I6IERhcmtCbHVlOw0KICB0ZXh0LWFsaWduOiBjZW50ZXI7DQp9DQpoMSB7IC8qIEhlYWRlciAxIC0gZm9udCBzcGVjaWZpY2F0aW9ucyBmb3IgbGV2ZWwgMSBzZWN0aW9uIHRpdGxlICAqLw0KICAgIGZvbnQtc2l6ZTogMjJweDsNCiAgICBmb250LWZhbWlseTogIlRpbWVzIE5ldyBSb21hbiIsIFRpbWVzLCBzZXJpZjsNCiAgICBjb2xvcjogbmF2eTsNCiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7DQp9DQpoMiB7IC8qIEhlYWRlciAyIC0gZm9udCBzcGVjaWZpY2F0aW9ucyBmb3IgbGV2ZWwgMiBzZWN0aW9uIHRpdGxlICovDQogICAgZm9udC1zaXplOiAyMHB4Ow0KICAgIGZvbnQtZmFtaWx5OiAiVGltZXMgTmV3IFJvbWFuIiwgVGltZXMsIHNlcmlmOw0KICAgIGNvbG9yOiBuYXZ5Ow0KICAgIHRleHQtYWxpZ246IGxlZnQ7DQp9DQoNCmgzIHsgLyogSGVhZGVyIDMgLSBmb250IHNwZWNpZmljYXRpb25zIG9mIGxldmVsIDMgc2VjdGlvbiB0aXRsZSAgKi8NCiAgICBmb250LXNpemU6IDE4cHg7DQogICAgZm9udC1mYW1pbHk6ICJUaW1lcyBOZXcgUm9tYW4iLCBUaW1lcywgc2VyaWY7DQogICAgY29sb3I6IG5hdnk7DQogICAgdGV4dC1hbGlnbjogbGVmdDsNCn0NCg0KaDQgeyAvKiBIZWFkZXIgNCAtIGZvbnQgc3BlY2lmaWNhdGlvbnMgb2YgbGV2ZWwgNCBzZWN0aW9uIHRpdGxlICAqLw0KICAgIGZvbnQtc2l6ZTogMThweDsNCiAgICBmb250LWZhbWlseTogIlRpbWVzIE5ldyBSb21hbiIsIFRpbWVzLCBzZXJpZjsNCiAgICBjb2xvcjogZGFya3JlZDsNCiAgICB0ZXh0LWFsaWduOiBsZWZ0Ow0KfQ0KDQpib2R5IHsgYmFja2dyb3VuZC1jb2xvcjp3aGl0ZTsgfQ0KDQouaGlnaGxpZ2h0bWUgeyBiYWNrZ3JvdW5kLWNvbG9yOnllbGxvdzsgfQ0KDQpwIHsgYmFja2dyb3VuZC1jb2xvcjp3aGl0ZTsgfQ0KDQo8L3N0eWxlPg0KYGBgDQpgYGB7ciBzZXR1cCwgaW5jbHVkZT1GQUxTRX0NCiMgRGV0ZWN0LCBpbnN0YWxsLCBhbmQgbG9hZCBwYWNrYWdlcyBpZiBuZWVkZWQuDQppZiAoIXJlcXVpcmUoImtuaXRyIikpIHsNCiAgIGluc3RhbGwucGFja2FnZXMoImtuaXRyIikNCiAgIGxpYnJhcnkoa25pdHIpDQp9DQppZiAoIXJlcXVpcmUoImxlYWZsZXQiKSkgew0KICAgaW5zdGFsbC5wYWNrYWdlcygibGVhZmxldCIpDQogICBsaWJyYXJ5KGxlYWZsZXQpDQp9DQppZiAoIXJlcXVpcmUoIkVudlN0YXRzIikpIHsNCiAgIGluc3RhbGwucGFja2FnZXMoIkVudlN0YXRzIikNCiAgIGxpYnJhcnkoRW52U3RhdHMpDQp9DQppZiAoIXJlcXVpcmUoIk1BU1MiKSkgew0KICAgaW5zdGFsbC5wYWNrYWdlcygiTUFTUyIpDQogICBsaWJyYXJ5KE1BU1MpDQp9DQppZiAoIXJlcXVpcmUoInBoeXRvb2xzIikpIHsNCiAgIGluc3RhbGwucGFja2FnZXMoInBoeXRvb2xzIikNCiAgIGxpYnJhcnkocGh5dG9vbHMpDQp9DQppZighcmVxdWlyZSgiZHBseXIiKSkgew0KICAgaW5zdGFsbC5wYWNrYWdlcygiZHBseXIiKQ0KICAgbGlicmFyeShkcGx5cikNCn0NCmlmKCFyZXF1aXJlKCJ0aWR5dmVyc2UiKSkgew0KICAgaW5zdGFsbC5wYWNrYWdlcygidGlkeXZlcnNlIikNCiAgIGxpYnJhcnkodGlkeXZlcnNlKQ0KfQ0KaWYoIXJlcXVpcmUoIkdHYWxseSIpKSB7DQogICBpbnN0YWxsLnBhY2thZ2VzKCJHR2FsbHkiKQ0KICAgbGlicmFyeShHR2FsbHkpDQp9DQppZiAoIXJlcXVpcmUoImJvb3QiKSkgew0KICAgaW5zdGFsbC5wYWNrYWdlcygiYm9vdCIpDQogICBsaWJyYXJ5KGJvb3QpDQp9DQppZighcmVxdWlyZSgicGFuZGVyIikpIHsNCiAgIGluc3RhbGwucGFja2FnZXMoInBhbmRlciIpDQogICBsaWJyYXJ5KHBhbmRlcikNCn0NCmlmKCFyZXF1aXJlKCJtbGJlbmNoIikpIHsNCiAgIGluc3RhbGwucGFja2FnZXMoIm1sYmVuY2giKQ0KICAgbGlicmFyeShtbGJlbmNoKQ0KfQ0KaWYoIXJlcXVpcmUoInBzeWNoIikpIHsNCiAgIGluc3RhbGwucGFja2FnZXMoInBzeWNoIikNCiAgIGxpYnJhcnkocHN5Y2gpDQp9DQppZighcmVxdWlyZSgiYnJvb20ubWl4ZWQiKSkgew0KICAgaW5zdGFsbC5wYWNrYWdlcygiYnJvb20ubWl4ZWQiKQ0KICAgbGlicmFyeShicm9vbS5taXhlZCkNCn0NCmlmKCFyZXF1aXJlKCJHR2FsbHkiKSkgew0KICAgaW5zdGFsbC5wYWNrYWdlcygiR0dhbGx5IikNCiAgIGxpYnJhcnkoR0dhbGx5KQ0KfQ0KaWYgKCFyZXF1aXJlKCJwUk9DIikpIHsNCiAgIGluc3RhbGwucGFja2FnZXMoInBST0MiKQ0KICAgbGlicmFyeShwUk9DKQ0KfQ0KaWYgKCFyZXF1aXJlKCJvcGVueGxzeCIpKSB7DQogICBpbnN0YWxsLnBhY2thZ2VzKCJvcGVueGxzeCIpDQogICBsaWJyYXJ5KG9wZW54bHN4KQ0KfQ0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KGVjaG8gPSBUUlVFLCAgDQogICAgICAgICAgICAgICAgICAgd2FybmluZyA9IEZBTFNFLCAgIA0KICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSBGQUxTRSwgIA0KICAgICAgICAgICAgICAgICAgIHJlc3VsdHMgPSBUUlVFLCAgDQogICAgICAgICAgICAgICAgICAgY29tbWVudCA9IE5BICAgDQogICAgICAgICAgICAgICAgICAgICAgKSAgIA0KYGBgDQoNCg0KIyBJbnRyb2R1Y3Rpb24NCg0KRm9yIHRoaXMgcHJvamVjdCwgd2Ugd2lsbCBiZSBjcmVhdGluZyBhIFBvaXNzb24gcmVncmVzc2lvbiBtb2RlbC4gVGhlIGRhdGEgc2V0IGZvciB0aGlzIHByb2plY3QgbG9va3MgYXQgdGhlIGRhaWx5IHRvdGFsIG9mIGN5Y2xpc3RzIG9uIHRoZSBXaWxsaWFtc2J1cmcgQnJpZGdlIG9uIGEgZ2l2ZW4gZGF5LiBUaGlzIGRhdGEgc2V0IGxvb2tzIGF0IHRoZSB0b3RhbCBudW1iZXIgb2YgY3ljbGlzdHMgb24gdGhlIFdpbGxpYW1zYnVyZyBCcmlkZ2UgaW4gQnJvb2tseW4sIE5ldyBZb3JrLCBpbiBvcmRlciB0byBrZWVwIHRyYWNrIG9mIHRoZSB0b3RhbCBudW1iZXIgb2YgY3ljbGlzdHMgZW50ZXJpbmcgYW5kIGxlYXZpbmcgdGhpcyBjeWNsaW5nIHJvdXRlIG9uIGEgc3BlY2lmaWMgZGF5LiBXZSB3aWxsIGxvb2sgYXQgdGhlIHZhcmlvdXMgZmFjdG9ycyBhZmZlY3RpbmcgdGhlIG51bWJlciBvZiBjeWNsaXN0cyBvbiBlYWNoIGRheSwgd2l0aCBmYWN0b3JzIHN1Y2ggYXMgdGhlIHdlYXRoZXIgY29uZGl0aW9ucyBvbiB0aGF0IHBhcnRpY3VsYXIgZGF5LiBXZSB3aWxsIGFsc28gY3JlYXRlIGEgUXVhc3NpLVBvaXNzb24gcmVncmVzc2lvbiBtb2RlbCBhbmQgYW5hbHl6ZSB0aGUgZGlzcGVyc2lvbiBvZiBvdXIgbW9kZWwuIA0KDQoNCg0KIyMgRGF0YSBEZXNjcmlwdGlvbg0KDQpUaGUgZGF0YSBzZXQgaW4gdGhpcyBwcm9qZWN0IGxvb2tzIGF0IHRoZSB0b3RhbCBudW1iZXIgb2YgY3ljbGlzdHMgb24gdGhlIFdpbGxpYW1zYnVyZyBCcmlkZ2Ugb24gYSBnaXZlbiBkYXkgYWxvbmcgd2l0aCB0aGUgd2VhdGhlciBjb25kaXRpb25zIG9mIHRoYXQgZGF5IHN1Y2ggYXMgdGVtcGVyYXR1cmUgYW5kIHByZWNpcGl0YXRpb24uIFRoaXMgZGF0YSBzZXQgYWxzbyBpbmNsdWRlcyB0aGUgdG90YWwgbnVtYmVyIG9mIGN5Y2xpc3RzIG9uIGFsbCBmb3VyIG9mIHRoZSBtYWpvciBOZXcgWW9yayBicmlkZ2VzIHRoZSBCcm9va2x5biBCcmlkZ2UsIHRoZSBNYW5oYXR0YW4gQnJpZGdlLCB0aGUgV2lsbGlhbXNidXJnIEJyaWRnZSwgYW5kIHRoZSBRdWVlbnNib3JvIEJyaWRnZS4NCg0KRmlyc3QsIEkgd2lsbCBmaW5kIHRoZSBkYXRhIHNldCB3aGljaCB3aWxsIGJlIHVzZWQgZm9yIHRoaXMgYXNzaWdubWVudC4gSSByYW4gdGhlIGNvZGUgd2hpY2ggd2FzIGdpdmVuIGluIHRoZSBhc3NpZ25tZW50IGRlc2NyaXB0aW9uLCBhbmQgdGhlIGRhdGEgc2V0IEkgcmVjZWl2ZWQgd2FzIGZvciB0aGUgV2lsbGlhbXNidXJnIEJyaWRnZSwgc28gdGhhdCBpcyB3aGF0IHdlIHdpbGwgdXNlIGZvciB0aGlzIFBvaXNzb24gcmVncmVzc2lvbiBtb2RlbGluZyBwcm9qZWN0LiBXaGVuIG9wZW5pbmcgdGhlIGRvd25sb2FkZWQgZGF0YSBzZXQsIEkgbm90aWNlZCBzb21lIGlzc3VlcyB3aXRoIHRoZSBkYXRhIHNldCBub3QgYmVpbmcgcHJvcGVybHkgc3RvcmVkLiBUaGUgRGF0ZSBhbmQgRGF5IHZhcmlhYmxlIGhhZCB0aGUgZXhhY3Qgc2FtZSB2YWx1ZXMsIGFuZCB0aGVzZSB2YWx1ZXMgZGlkIG5vdCBtYWtlIHNlbnNlIHdpdGhpbiB0aGUgY29udGV4dCBvZiB0aGlzIHNpdHVhdGlvbi4gSSB3ZW50IHRocm91Z2ggYW5kIGZpeGVkIHRoZXNlIHZhbHVlcyB3aXRoIGhvdyB0aGUgYXBwZWFyZWQgaW4gdGhlIG9yaWdpbmFsIGRhdGEgc2V0LCB3aGljaCB3YXMgZ2l2ZW4gdW5kZXIgdGhlIHRhYiBkYXRhMiBpbiB0aGUgdzA5LUFzc2lnbkRhdGFTZXQueGxzeCBmaWxlLiBJIHJlcGxhY2VkIHRoZSBpbXByb3BlciB2YWx1ZXMgaW4gdGhlIERhdGUgYW5kIERheSB2YXJpYWJsZSB3aXRoIHdoYXQgd2FzIGluIHRoZSBvcmlnaW5hbCBkYXRhIHNldC4gTm93LCB0aGUgRGF0ZSB2YXJpYWJsZSBpcyBhbiBpZGVudGlmaWNhdGlvbiBvZiB0aGUgZGF0ZSBvbiB3aGljaCB0aGUgb2JzZXJ2YXRpb24gb2NjdXJyZWQuIEFuZCwgdGhlIERheSB2YXJpYWJsZSByZXByZXNlbnRzIHRoZSBkYXkgb2YgdGhlIHdlZWsgb24gd2hpY2ggdGhlIG9ic2VydmF0aW9uIG9jY3VycmVkLiBJIGFsc28gY2hlY2tlZCBhbGwgb2YgdGhlIG90aGVyIHZhcmlhYmxlcyB0byBlbnN1cmUgdGhlaXIgdmFsdWVzIHdlcmUgbm90IGFsc28gbWVzc2VkIHVwIGluIHRoZSBmb3JtYXR0aW5nIG9mIHRoZSBleGNlbCBmaWxlLCBidXQgdGhleSBhbGwgYXBwZWFyZWQgdG8gYmUgYWxsIGdvb2Qgd2l0aG91dCBhbnl0aGluZyBoYXZpbmcgZ290dGVuIGNoYW5nZWQgZHVyaW5nIHRoZSBkb3dubG9hZGluZyBwcm9jZXNzLiANCg0KVGhlIGRhdGEgc2V0IGhhcyBiZWVuIHVwbG9hZGVkIHRvIEdpdGh1YiBhbmQgbm93IGNhbiBiZSByZWFkIGluIGRpcmVjdGx5IGZyb20gdGhlIEdpdGh1YiByZXBvc2l0b3J5LiANCg0KV2Ugd2lsbCByZWFkIGluIHRoZSBkYXRhIHNldCBmcm9tIEdpdGh1YiBhbmQgd2Ugd2lsbCBjYWxsIGl0ICJjeWNsaW5nIi4NCg0KYGBge3J9DQpjeWNsaW5nIDwtIHJlYWQuY3N2KCJodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vSm9zaWVHYWxsb3AvU1RBMzIxL3JlZnMvaGVhZHMvbWFpbi9kYXRhc2V0L1dpbGxpYW1zYnVyZ0JyaWRnZS5jc3YiLCBoZWFkZXIgPSBUUlVFKQ0KDQpzdHIoY3ljbGluZykNCmBgYA0KDQpXZSB3aWxsIHVzZSB0aGlzIGN5Y2xpbmcgZGF0YSBzZXQgdG8gY3JlYXRlIHR3byBQb2lzc29uIHJlZ3Jlc3Npb24gbW9kZWxzLCBvbmUgZm9yIHRoZSBmcmVxdWVuY3kgY291bnRzIG9mIGN5Y2xpc3RzIG9uIHRoZSBXaWxsaWFtc2J1cmcgQnJpZGdlIG9uIGEgZ2l2ZW4gb2JzZXJ2YXRpb24sIGFuZCBhbm90aGVyIGZvciB0aGUgcmF0ZXMgb2YgY3ljbGlzdHMgZW50ZXJpbmcgYW5kIGxlYXZpbmcgdmlhIHRoZSBXaWxsaWFtc2J1cmcgQnJpZGdlIG9mZnNldCBieSB0aGUgdG90YWwgbnVtYmVyIG9mIGN5Y2xpc3RzIG9uIGFsbCBvZiB0aGUgbWFqb3IgTmV3IFlvcmsgYnJpZGdlcy4gDQoNCg0KIyMgVmFyaWFibGVzDQoNCg0KVGhlcmUgYXJlIDcgdG90YWwgdmFyaWFibGVzIGluIHRoZSBjeWNsaW5nIGRhdGEgc2V0LiBUaGVzZSB2YXJpYWJsZXMgaW5jbHVkZToNCg0KKiBEYXRlOiBUaGlzIHJlcHJlc2VudHMgdGhlIGRhdGUgb24gd2hpY2ggYSBnaXZlbiBvYnNlcnZhdGlvbiB3YXMgY29sbGVjdGVkLiBUaGlzIGlzIHRoZSBvYnNlcnZhdGlvbiBJRCBudW1iZXIuIFRoaXMgdmFyaWFibGUgaXMganVzdCBmb3IgaWRlbnRpZmljYXRpb24gcHVycG9zZXMgb2YgdGhlIG9ic2VydmF0aW9ucywgbm90IGZvciBhY3R1YWwgcHJlZGljdGlvbi4gVGhlIGRhdGUgaXMgZ2l2ZW4gaW4gdGhlIGZvcm1hdCBvZiBtb250aC9kYXkuIA0KDQoqIERheTogVGhpcyBpcyBhIGNoYXJhY3RlciBwcmVkaWN0b3IgdmFyaWFibGUgd2hpY2ggcmVwcmVzZW50cyB0aGUgZGF5IG9mIHRoZSB3ZWVrIG9uIHdoaWNoIGEgZ2l2ZW4gb2JzZXJ2YXRpb24gd2FzIGNvbGxlY3RlZC4gRm9yIGluc3RhbmNlLCBNb25kYXksIFR1ZXNkYXksIGV0Yy4gDQoNCiogSGlnaFRlbXA6IEEgcXVhbnRpdGF0aXZlIHByZWRpY3RvciB2YXJpYWJsZSByZXByZXNlbnRpbmcgdGhlIGhpZ2ggdGVtcGVyYXR1cmUgb24gdGhlIGdpdmVuIGRheSwgZ2l2ZW4gaW4gZGVncmVlcyBGYWhyZW5oZWl0LiANCg0KKiBMb3dUZW1wOiBBIHF1YW50aXRhdGl2ZSBwcmVkaWN0b3IgdmFyaWFibGUgcmVwcmVzZW50aW5nIHRoZSBsb3cgdGVtcGVyYXR1cmUgb24gdGhlIGdpdmVuIGRheSwgZ2l2ZW4gaW4gZGVncmVlcyBGYWhyZW5oZWl0Lg0KDQoqIFByZWNpcGl0YXRpb246IEEgcXVhbnRpdGF0aXZlIHByZWRpY3RvciB2YXJpYWJsZSByZXByZXNlbnRpbmcgdGhlIGFtb3VudCBvZiBwcmVjaXBpdGF0aW9uLCByYWluLCB3aGljaCBvY2N1cnJlZCBvbiB0aGUgZ2l2ZW4gZGF5LCBnaXZlbiBpbiBpbmNoZXMuIA0KDQoqIFdpbGxpYW1zYnVyZ0JyaWRnZTogQSBxdWFudGl0YXRpdmUgdmFyaWFibGUgcmVwcmVzZW50aW5nIHRoZSB0b3RhbCBudW1iZXIgb2YgY3ljbGlzdHMgb24gdGhlIFdpbGxpYW1zYnVyZyBCcmlkZ2Ugb24gYSBnaXZlbiBvYnNlcnZhdGlvbi4gVGhpcyB3aWxsIGJlIG91ciByZXNwb25zZSB2YXJpYWJsZSBmb3IgdGhlIFBvaXNzb24gcmVncmVzc2lvbiBtb2RlbHMuIA0KDQoqIFRvdGFsOiBUaGUgdG90YWwgbnVtYmVyIG9mIGN5Y2xpc3RzIG9uIGFsbCBicmlkZ2VzIG9uIGEgZ2l2ZW4gb2JzZXJ2YXRpb24uIFRoaXMgd2lsbCBiZSB0aGUgdmFyaWFibGUgd2hpY2ggaXMgb2Zmc2V0IGZvciBvdXIgUG9pc3NvbiByZWdyZXNzaW9uIG1vZGVsIG9mIHRoZSByYXRlcyBhbmQgZm9yIHRoZSBRdWFzc2ktUG9pc3NvbiByZWdyZXNzaW9uIG1vZGVsLg0KDQoNCldlIGFsc28gd2lsbCBjcmVhdGUgdHdvIG5ldyB2YXJpYWJsZXMgd2l0aGluIG91ciBhbmFseXNpcyBsYXRlciBvbiB0byB1c2UgZm9yIHRoZSBQb2lzc29uIHJlZ3Jlc3Npb24gbW9kZWwgYnVpbGRpbmcgcHJvY2Vzcy4gVGhlc2UgdHdvIHZhcmlhYmxlcyBpbmNsdWRlOg0KDQoqIEF2Z1RlbXA6IEEgcXVhbnRpdGF0aXZlIHByZWRpY3RvciB2YXJpYWJsZSByZXByZXNlbnRpbmcgdGhlIGF2ZXJhZ2UgdGVtcGVyYXR1cmUgZm9yIGEgZ2l2ZW4gb2JzZXJ2YXRpb24sIGdpdmVuIGluIGRlZ3JlZXMgRmFocmVuaGVpdC4gVGhpcyB2YXJpYWJsZSB3aWxsIGJlIHRoZSBhdmVyYWdlIG9mIEhpZ2hUZW1wIGFuZCBMb3dUZW1wLCBmb3VuZCBieSBjYWxjdWxhdGluZyAoSGlnaFRlbXAgKyBMb3dUZW1wKS8yLiANCg0KKiBOZXdQcmVjaXA6IEEgZGlzY3JldGl6ZWQgdmVyc2lvbiBvZiB0aGUgUHJlY2lwaXRhdGlvbiB2YXJpYWJsZS4gVGhpcyB3aWxsIGJlIGEgYmluYXJ5IHByZWRpY3RvciB2YXJpYWJsZSwgd2hlcmUgMCByZXByZXNlbnRzIGEgcHJlY2lwaXRhdGlvbiB2YWx1ZSBlcXVhbCB0byAwIGluY2hlcywgYW5kIHdoZXJlIDEgcmVwcmVzZW50cyBhIHByZWNpcGl0YXRpb24gdmFsdWUgZ3JlYXRlciB0aGFuIDAgaW5jaGVzLiANCg0KDQpGb3IgdGhlIFBvaXNzb24gcmVncmVzc2lvbiBtb2RlbCBmb3IgdGhlIGZyZXF1ZW5jeSBjb3VudHMsIHRoZSBXaWxsaWFtc2J1cmcgQnJpZGdlIHZhcmlhYmxlIHdpbGwgc2VydmUgYXMgdGhlIHJlc3BvbnNlIHZhcmlhYmxlLiBGb3IgdGhlIFBvaXNzb24gcmVncmVzc2lvbiBtb2RlbCBmb3IgdGhlIHJhdGVzLCB0aGUgV2lsbGlhbXNidXJnIEJyaWRnZSB2YXJpYWJsZSB3aWxsIGFnYWluIHNlcnZlIGFzIHRoZSByZXNwb25zZSB2YXJpYWJsZSwgYW5kIGl0IHdpbGwgYmUgb2Zmc2V0IGJ5IHRoZSBUb3RhbCB2YXJpYWJsZSBmb3IgdGhpcyBtb2RlbC4gDQoNCg0KIyMgUmVzZWFyY2ggUXVlc3Rpb25zDQoNClRoZSBtYWluIGdvYWwgZm9yIHRoaXMgcHJvamVjdCBpcyB0byBjcmVhdGUgYSBQb2lzc29uIHJlZ3Jlc3Npb24gbW9kZWwgZm9yIGJvdGggdGhlIGZyZXF1ZW5jeSBjb3VudHMgYW5kIHRoZSByYXRlcyBvZiB0aGUgY3ljbGlzdHMgZW50ZXJpbmcgYW5kIGxlYXZpbmcgQnJvb2tseW4sIE5ldyBZb3JrIHRocm91Z2ggdGhlIFdpbGxpYW1zYnVyZyBCcmlkZ2UuIFNvLCB0aGUgZm9jdXMgZm9yIHRoaXMgcHJvamVjdCB3aWxsIGJlIG9uIGNyZWF0aW5nIHR3byBQb2lzc29uIHJlZ3Jlc3Npb24gbW9kZWxzIHdoaWNoIGNhbiBzdWNjZXNzZnVsbHkgcHJlZGljdCB0aGUgZnJlcXVlbmN5IGNvdW50cyBhbmQgdGhlIHJhdGVzIG9mIHRoZSBjeWNsaXN0cyBvbiB0aGUgV2lsbGlhbXNidXJnIEJyaWRnZS4gDQoNClNvbWUga2V5IHF1ZXN0aW9ucyBmb3IgdGhpcyBwcm9qZWN0IGluY2x1ZGU6DQoNCiogRG9lcyB0aGUgZGF0YSBzZXQgbWVldCBhbGwgb2YgdGhlIG5lY2Vzc2FyeSBjb25kaXRpb25zIHJlcXVpcmVkIGZvciBhIFBvaXNzb24gcmVncmVzc2lvbiBtb2RlbD8gSWYgbm90LCBpcyB0aGVyZSBhbnkgcG90ZW50aWFsIGV4cGxhbmF0aW9uIGZvciB0aGlzIGRpc2NyZXBhbmN5PyANCg0KKiBDYW4gd2UgY3JlYXRlIFBvaXNzb24gcmVncmVzc2lvbiBtb2RlbHMgd2hpY2ggcHJvdmlkZSBzdGF0aXN0aWNhbCBzaWduaWZpY2FuY2UgZm9yIHByZWRpY3RpbmcgYm90aCB0aGUgZnJlcXVlbmN5IGNvdW50cyBhbmQgZm9yIHRoZSByYXRlcyBvZiBjeWNsaXN0cyBvbiB0aGUgV2lsbGlhbXNidXJnIEJyaWRnZSBvbiBhIGdpdmVuIGRheT8NCg0KKiBJcyB0aGUgUXVhc2ktUG9pc3NvbiByZWdyZXNzaW9uIG1vZGVsIGEgYmV0dGVyIGNob2ljZSB0aGFuIHRoZSBlaXRoZXIgb2YgdGhlIHN0YW5kYXJkIFBvaXNzb24gcmVncmVzc2lvbiBtb2RlbHMgZm9yIGZyZXF1ZW5jeSBjb3VudHMgYW5kIGZvciByYXRlcz8gSG93IGRpc3BlcnNlZCBpcyB0aGlzIFF1YXNpLVBvaXNzb24gcmVncmVzc2lvbiBtb2RlbD8NCg0KDQpXZSB3aWxsIHdvcmsgb24gY3JlYXRpbmcgb3VyIFBvaXNzb24gcmVncmVzc2lvbiBtb2RlbHMgZm9yIGJvdGggdGhlIGZyZXF1ZW5jeSBjb3VudHMgYW5kIHJhdGVzIGluIG9yZGVyIHRvIHNlZSBpZiB3ZSBjYW4gaW4gZmFjdCBjcmVhdGUgbW9kZWxzIHdoaWNoIHByb3ZpZGUgc3RhdGlzdGljYWwgc2lnbmlmaWNhbmNlIGluIHRoZWlyIHByZWRpY3RpdmUgYWJpbGl0eS4gV2Ugd2lsbCBhbHNvIGNyZWF0ZSBhIFF1YXNpLVBvaXNzb24gcmVncmVzc2lvbiBtb2RlbCBhbmQgd2Ugd2lsbCBmaW5kIGhvdyBkaXNwZXJlZCBpdCBpcy4gV2Ugd2lsbCBkZXRlcm1pbmUgd2hpY2ggb2YgdGhlc2UgbW9kZWxzIGlzIHRoZSBpZGVhbCBjaG9pY2UgZm9yIG91ciBmaW5hbCByZWdyZXNzaW9uIG1vZGVsLiANCg0KDQoNCiMgRXhwbG9yYXRvcnkgRGF0YSBBbmFseXNpcw0KDQpMZXQncyB0YWtlIGEgbG9vayBhdCB0aGUgZmlyc3QgZmV3IGVudHJpZXMgd2l0aGluIHRoaXMgY3ljbGluZyBkYXRhIHNldCBmb3IgdGhlIFdpbGxpYW1zYnVyZyBCcmlkZ2UuDQoNCmBgYHtyfQ0Ka2FibGUoaGVhZChjeWNsaW5nKSwgY2FwdGlvbiA9ICJGaXJzdCBGZXcgT2JzZXJ2YXRpb25zIGluIHRoZSBEYXRhIFNldCIpIA0KYGBgDQoNClRoaXMgZGF0YSBzZXQgaW5jbHVkZXMgdmFyaW91cyBmYWN0b3JzIHdoaWNoIG1heSBoYXZlIGFuIGluZmx1ZW5jZSBvbiB0aGUgbnVtYmVyIG9mIGluZGl2aWR1YWxzIGN5Y2xpbmcsIGFsb25nIHdpdGggdGhlIGRhdGUgb24gd2hpY2ggdGhpcyBkYXRhIHdhcyBjb2xsZWN0ZWQuIEFkZGl0aW9uYWxseSwgdGhpcyBkYXRhIHNldCBpbmNsdWRlcyB2YXJpYWJsZXMgZm9yIGJvdGggdGhlIG51bWJlciBvZiBjeWNsaXN0cyBvbiB0aGUgV2lsbGlhbXNidXJnIEJyaWRnZSBvbiB0aGF0IGdpdmVuIGRheSwgYWxvbmcgd2l0aCB0aGUgdG90YWwgbnVtYmVyIG9mIGN5Y2xpc3RzIG9uIGFsbCBicmlkZ2VzIG9uIHRoYXQgZ2l2ZW4gZGF5LiAgDQoNCg0KRmlyc3QsIGxldCdzIGNoZWNrIGlmIHRoZXJlIGFyZSBhbnkgbWlzc2luZyB2YXJpYWJsZXMgaW4gb3VyIGRhdGEgc2V0Lg0KDQpgYGB7cn0NCmNvbFN1bXMoaXMubmEoY3ljbGluZykpDQpgYGANCg0KSXQgdHVybnMgb3V0IHRoYXQgYWxsIG9mIHRoZSB2YXJpYWJsZXMgaW4gdGhlIGRhdGEgc2V0IGhhdmUgZXhhY3RseSB6ZXJvIG1pc3NpbmcgdmFsdWVzLiBTbywgdGhlcmUgYXJlIG5vIG1pc3NpbmcgdmFsdWVzIGluIG91ciBkYXRhIHNldC4gVGhpcyBpcyB2ZXJ5IGdvb2QgYW5kIG1lYW5zIHdlIGNhbiBtb3ZlIG9uIHdpdGggZnVydGhlciBhbmFseXppbmcgdGhlIGRhdGEgc2V0IGFuZCB0aGUgdmFyaWFibGVzIHdpdGhpbiBpdC4NCg0KDQojIyBWYXJpYWJsZSBUcmFuc2Zvcm1hdGlvbnMNCg0KV2Ugd2lsbCB0cmFuc2Zvcm0gc29tZSBvZiBvdXIgcHJlZGljdG9yIHZhcmlhYmxlcyBiZWZvcmUgYmVnaW5uaW5nIHdpdGggb3VyIGFuYWx5c2lzIGFuZCBidWlsZGluZyB0aGUgUG9pc3NvbiByZWdyZXNzaW9uIG1vZGVscy4NCg0KRmlyc3QsIHdlIHdpbGwgY3JlYXRlIGEgbmV3IHZhcmlhYmxlIGZvciB0aGUgdGVtcGVyYXR1cmUgd2hpY2ggaXMgYW4gYXZlcmFnZSBvZiB0aGUgaGlnaCB0ZW1wZXJhdHVyZSBhbmQgdGhlIGxvdyB0ZW1wZXJhdHVyZSBmb3IgdGhhdCBnaXZlbiBvYnNlcnZhdGlvbi4gV2Ugd2lsbCBjYWxsIG91ciBuZXcgdmFyaWFibGUgQXZnVGVtcCBhbmQgdGhpcyB3aWxsIHNlcnZlIGFzIHRoZSBhdmVyYWdlIG9mIHRoZSBIaWdoVGVtcCBhbmQgdGhlIExvd1RlbXAgdmFyaWFibGVzLiANCg0KYGBge3J9DQojIENyZWF0aW5nIHRoZSBuZXcgQXZnVGVtcCB2YXJpYWJsZS4NCmN5Y2xpbmckQXZnVGVtcCA8LSAoY3ljbGluZyRIaWdoVGVtcCArIGN5Y2xpbmckTG93VGVtcCkvMg0KYGBgDQoNCk5vdywgd2UgaGF2ZSBhIG5ldyB2YXJpYWJsZSwgQXZnVGVtcCwgcmVwcmVzZW50aW5nIHRoZSBhdmVyYWdlIG9mIHRoZSBoaWdoIHRlbXBlcmF0dXJlIGFuZCB0aGUgbG93IHRlbXBlcmF0dXJlIGZvciBhIGdpdmVuIG9ic2VydmF0aW9uLg0KDQoNCk5leHQsIHdlIHdpbGwgZGlzY3JldGl6ZSB0aGUgUHJlY2lwaXRhdGlvbiB2YXJpYWJsZS4gV2Ugd2lsbCBjcmVhdGUgYSB2YXJpYWJsZSBjYWxsZWQgTmV3UHJlY2lwIHdoaWNoIHdpbGwgYmUgYSBkaXNjcmV0aXplZCB2ZXJzaW9uIG9mIHRoZSBvcmlnaW5hbCBQcmVjaXBpdGF0aW9uIHZhcmlhYmxlLiBGb3IgdGhpcyBkaXNjcmV0aXplZCB2YXJpYWJsZSwgTmV3UHJlY2lwIHdpbGwgZXF1YWwgMCBpZiBQcmVjaXBpdGF0aW9uIGVxdWFscyAwIGZvciB0aGF0IG9ic2VydmF0aW9uLCBhbmQgTmV3UHJlY2lwIHdpbGwgZXF1YWwgMSBpZiBQcmVjaXBpdGF0aW9uIGlzIGdyZWF0ZXIgdGhhbiAwIGZvciB0aGF0IG9ic2VydmF0aW9uLiANCg0KV2Ugd2lsbCBtYWtlIHRoZSBOZXdQcmVjaXAgdmFyaWFibGUgYSBiaW5hcnkgdmFyaWFibGUgd2l0aCAwIHJlcHJlc2VudGluZyBwcmVjaXBpdGF0aW9uIG9mIDAgaW5jaGVzLCBhbmQgMSByZXByZXNlbnRpbmcgcHJlY2lwaXRhdGlvbiBncmVhdGVyIHRoYW4gMCBpbmNoZXMuIFdlIHdpbGwgYWxzbyBjb252ZXJ0IHRoaXMgYmluYXJ5IE5ld1ByZWNpcCB2YXJpYWJsZSBpbnRvIGFuIGludGVnZXIgdmFyaWFibGUgaW5zdGVhZCBvZiBhIG51bWVyaWMgdmFyaWFibGUuIA0KDQpgYGB7cn0NCiMgQ3JlYXRpbmcgdGhlIE5ld1ByZWNpcCB2YXJpYWJsZS4NCmN5Y2xpbmckTmV3UHJlY2lwIDwtIGlmZWxzZShjeWNsaW5nJFByZWNpcGl0YXRpb24gPT0gMCwgMCwgMSkNCg0KIyBNYWtpbmcgdGhlIGJpbmFyeSB2YXJpYWJsZSBhbiBpbnQuDQpjeWNsaW5nJE5ld1ByZWNpcCA8LSBhcy5pbnRlZ2VyKGN5Y2xpbmckTmV3UHJlY2lwKQ0KYGBgDQoNCk5vdywgd2UgaGF2ZSBhIGRpc2NyZXRpemVkIE5ld1ByZWNpcCB2YXJpYWJsZSBpbiBvdXIgZGF0YSBzZXQgd2hpY2ggcmVwcmVzZW50cyBhIGJpbmFyeSBwcmVkaWN0b3IgdmFyaWFibGUgd2hlcmUgMCBpcyBmb3IgYSBwcmVjaXBpdGF0aW9uIG9mIDAgaW5jaGVzIGFuZCAxIGlzIGZvciBhIHByZWNpcGl0YXRpb24gZ3JlYXRlciB0aGFuIDAgaW5jaGVzLiANCg0KDQoNCiMjIENoZWNraW5nIHRoZSBWYXJpYWJsZSBEaXN0cmlidXRpb25zDQoNCldlIGhhdmUgdGhyZWUgcHJlZGljdG9yIHZhcmlhYmxlcyB3aGljaCB3ZSB3YW50IHRvIHVzZSBpbiBvdXIgZmluYWwgbW9kZWwsIERheSwgQXZnVGVtcCwgYW5kIE5ld1ByZWNpcC4gT3V0IG9mIHRoZXNlIHZhcmlhYmxlcywgRGF5IGlzIGEgY2F0ZWdvcmljYWwgY2hhcmFjdGVyIHZhcmlhYmxlLCBBdmdUZW1wIGlzIGEgcXVhbnRpdGF0aXZlIHZhcmlhYmxlLCBhbmQgTmV3UHJlY2lwIGlzIGEgYmluYXJ5IHZhcmlhYmxlLiBXZSB3aWxsIGNoZWNrIHRoYXQgdGhlIGRpc3RyaWJ1dGlvbnMgb2YgYWxsIG9mIHRoZXNlIHZhcmlhYmxlcyBhcHBlYXIgdG8gYmUgcmFuZG9tLCB3aXRob3V0IGFueSBub3RpY2VhYmxlIHBhdHRlcm5zIG9yIGNvbmNlcm5zIHdoaWNoIGNvdWxkIGNhdXNlIGlzc3VlcyB3aXRoIHRoZSBtb2RlbCBidWlsZGluZyBwcm9jZXNzLiANCg0KRmlyc3QsIGxldCdzIGxvb2sgYXQgb3VyIERheSB2YXJpYWJsZS4gVGhpcyBpcyBhIGNhdGVnb3JpY2FsIGNoYXJhY3RlciB2YXJpYWJsZS4gSW4gb3JkZXIgdG8gY2hlY2sgdGhhdCB0aGlzIHZhcmlhYmxlIGlzIHByb3Blcmx5IGRpc3RyaWJ1dGVkIHdpdGhvdXQgYW55IG1ham9yIGNvbmNlcm5zLCB3ZSB3aWxsIGxvb2sgZm9yIGlmIHRoZXJlIGFyZSBhbnkgcG90ZW50aWFsIGltYmFsYW5jZXMgd2l0aGluIHRoaXMgdmFyaWFibGUuIEFuIGltYmFsYW5jZSB3b3VsZCBvY2N1ciBpZiB0aGVyZSB3ZXJlIGEgc2lnbmlmaWNhbnRseSBncmVhdGVyIG51bWJlciBvZiBvYnNlcnZhdGlvbnMgb2NjdXJpbmcgb24gb25lIGRheSBhcyBvcHBvc2VkIHRvIGFub3RoZXIgZGF5LiBXZSB3aWxsIGNoZWNrIHRoYXQgdGhlcmUgYXJlIG5vdCBhbnkgc3Vic3RhbnRpYWwgaW1iYWxhbmNlcyB3aXRoaW4gdGhlIERheSB2YXJpYWJsZS4NCg0KYGBge3J9DQp0YWJsZShjeWNsaW5nJERheSkNCmBgYA0KDQpJdCBhcHBlYXJzIHRoYXQgYWxsIGRheXMgb2YgdGhlIHdlZWsgZnJvbSBNb25kYXkgdG8gRnJpZGF5IGhhdmUgZXhhY3RseSBmb3VyIG9ic2VydmF0aW9ucyBpbiBvdXIgZGF0YSBzZXQuIFRoZSB3ZWVrZW5kIGRheXMgb2YgU2F0dXJkYXkgYW5kIFN1bmRheSBib3RoIGhhdmUgZXhhY3RseSBmaXZlIG9ic2VydmF0aW9ucyBpbiBvdXIgZGF0YSBzZXQuIEFzIHdlIGNhbiBzZWUsIHRoZSBvYnNlcnZhdGlvbnMgYXBwZWFyIHRvIGJlIGRpc3RyaWJ1dGVkIHZlcnkgZXZlbmx5IGFtb25nc3QgdGhlIGRheXMgb2YgdGhlIHdlZWssIHdpdGggdGhlIHdlZWtlbmQgZGF5cyBvbmx5IGhhdmluZyBvbmUgbW9yZSBvYnNlcnZhdGlvbiBlYWNoIHRoYW4gdGhlIHdlZWtkYXlzLiBPdmVyYWxsLCB0aGlzIHZhcmlhYmxlIGFwcGVhcnMgdG8gYmUgb3ZlcmFsbCBldmVubHkgZGlzdHJpYnV0ZWQsIGFuZCBzbyB0aGVyZSBhcmUgbm90IGFueSBpbWJhbGFuY2VzIHRvIGJlIGNvbmNlcm5lZCBhYm91dCBmb3Igb3VyIERheSBwcmVkaWN0b3IgdmFyaWFibGUuDQoNCk5leHQsIGxldCdzIGNoZWNrIHRoZSBkaXN0cmlidXRpb24gb2Ygb3VyIEF2Z1RlbXAgdmFyaWFibGUuIFRoaXMgaXMgYSBxdWFudGl0YXRpdmUgcHJlZGljdG9yIHZhcmlhYmxlIGFuZCBzbyB3ZSBjYW4gY2hlY2sgaXRzIGRpc3RyaWJ1dGlvbiBieSB1c2luZyBhIGhpc3RvZ3JhbS4gV2Ugd2lsbCBjaGVjayB0byBzZWUgaWYgdGhpcyB2YXJpYWJsZSBoYXMgYW4gb3ZlcmFsbCBub3JtYWwgZGlzdHJpYnV0aW9uIHdpdGhvdXQgYW55IG5vdGFibGUgc2tldyBvciBvdXRsaWVycy4gDQoNCmBgYHtyfQ0KeWxpbWl0ID0gbWF4KGRlbnNpdHkoY3ljbGluZyRBdmdUZW1wKSR5KQ0KaGlzdChjeWNsaW5nJEF2Z1RlbXAsIHByb2JhYmlsaXR5ID0gVFJVRSwgbWFpbiA9ICJBdmdUZW1wIERpc3RyaWJ1dGlvbiIsIHhsYWI9IkF2Z1RlbXAiLCANCiAgICAgICBjb2wgPSAiYWxpY2VibHVlIiwgYm9yZGVyPSJjb3JuZmxvd2VyYmx1ZSIpDQogIGxpbmVzKGRlbnNpdHkoY3ljbGluZyRBdmdUZW1wLCBhZGp1c3Q9MiksIGNvbD0iZGFya29yY2hpZCIpDQpgYGANCg0KSXQgYXBwZWFycyB0aGF0IG91ciBkaXN0cmlidXRpb24gaGlzdG9ncmFtIG9mIHRoZSBBdmdUZW1wIHZhcmlhYmxlIGlzIHVuaW1vZGFsIHdpdGggbWFqb3JpdHkgb2YgdGhlIGRhdGEgYmVpbmcgY2VudGVyZWQgYXQgYW4gYXZlcmFnZSB0ZW1wZXJhdHVyZSBiZXR3ZWVuIDU1IGFuZCA2MCBkZWdyZWVzIEZhaHJlbmhlaXQuIFRoZSBkaXN0cmlidXRpb24gYXBwZWFycyB0byBmb2xsb3cgYW4gYXBwcm94aW1hdGVseSBub3JtYWwgZGlzdHJpYnV0aW9uIHdpdGhvdXQgYW55IG5vdGVhYmxlIHNrZXcgb3Igb3V0bGllcnMuIEl0IGRvZXMgYXBwZWFyIGxpa2UgcGVyaGFwcyB0aGVyZSBpcyBzbGlnaHRseSBtb3JlIGVudHJpZXMgb24gdGhlIGxlZnQgc2lkZSBvZiB0aGUgaGlzdG9ncmFtLCBidXQgaXQgaXMgb25seSBieSBhIHZlcnkgc2xpZ2h0IGFtb3VudCBhbmQgaXMgbm90IHNpZ25pZmljYW50IGVub3VnaCB0byBjYXVzZSBhIG5vdGljZWFibGUgc2tldyBpbiB0aGUgZGlzdHJpYnV0aW9uLiBPdmVyYWxsLCBpdCBhcHBlYXJzIHNhZmUgdG8gc2F5IHRoYXQgb3VyIEF2Z1RlbXAgdmFyaWFibGUgZm9sbG93cyBhbiBhcHByb3hpbWF0ZWx5IG5vcm1hbCBkaXN0cmlidXRpb24sIGFuZCBzbyB0aGlzIHZhcmlhYmxlIHdpbGwgYmUgYWxsIGdvb2QgdG8gdXNlIGluIG91ciBtb2RlbCBidWlsZGluZyBwcm9jZXNzLiAgDQoNCkxhc3RseSwgbGV0J3MgY2hlY2sgb3VyIE5ld1ByZWNpcCB2YXJpYWJsZS4gVGhpcyBpcyBhIGJpbmFyeSBwcmVkaWN0b3IgdmFyaWFibGUsIGFuZCBzbyB3ZSBjYW4gZXhwZWN0IGl0IHRvIGhhdmUgdmFsdWVzIG9mIG9ubHkgMCBhbmQgMS4gSW4gb3JkZXIgdG8gY2hlY2sgdGhlIHJlbGlhYmlsaXR5IG9mIHRoaXMgdmFyaWFibGUgaW4gaXRzIHVzZSBmb3IgcHJlZGljdGlvbiwgd2Ugd2lsbCBtYWtlIHN1cmUgaXQgYXBwZWFycyB0byBtZWV0IHRoaXMgY3JpdGVyaWEgb2YgYSBiaW5hcnkgdmFyaWFibGUuIFdlIGNhbiB0YWtlIGEgbG9vayBhdCBhIHRhYmxlIHRvIGVuc3VyZSB0aGF0IHRoZXJlIGFyZSBvbmx5IHR3byBwb3NzaWJsZSBlbnRyaWVzIGZvciB0aGlzIE5ld1ByZWNpcCB2YXJpYWJsZSwgMCBhbmQgMSwgYmVjYXVzZSB0aGVzZSBhcmUgdGhlIG9ubHkgdHdvIHZhbHVlcyB3aGljaCBhIGJpbmFyeSB2YXJpYWJsZSBjYW4gYmUuDQoNCmBgYHtyfQ0KdGFibGUoY3ljbGluZyROZXdQcmVjaXApDQpgYGANCg0KQXMgd2UgY2FuIHNlZSwgdGhpcyBOZXdQcmVjaXAgdmFyaWFibGUgaGFzIG9ubHkgdHdvIGVudHJpZXMsIDAgYW5kIDEuIFRoaXMgaXMgZXhhY3RseSB3aGF0IHdlIHdhbnRlZCB0byBzZWUgYmVjYXVzZSB0aGVzZSBhcmUgdGhlIG9ubHkgdHdvIHZhcmlhYmxlcyB3aGljaCBhIGJpbmFyeSB2YXJpYWJsZSBjYW4gYmUuIFdlIGNhbiBzZWUgdGhhdCB0aGVyZSBhcmUgc2xpZ2h0bHkgbW9yZSBkYXlzIHdpdGggbm8gcHJlY2lwaXRhdGlvbiwgYSB2YWx1ZSBvZiAwLCB3aXRoIDE4IHRvdGFsIG9ic2VydmF0aW9ucywgdGhhbiBkYXlzIHdpdGggcHJlY2lwaXRhdGlvbiwgYSB2YWx1ZSBvZiAxLCB3aXRoIDEyIHRvdGFsIG9ic2VydmF0aW9ucy4gSG93ZXZlciwgdGhpcyBkaWZmZXJlbmNlIGlzIG5vdCBsYXJnZSBlbm91Z2ggdG8gYmUgYSBjYXVzZSBmb3IgY29uY2Vybi4gQW5kIHNvLCB3ZSBjYW4gY29uY2x1ZGUgdGhhdCBldmVyeXRoaW5nIGlzIGFscmlnaHQgd2l0aCB3aXRoIG91ciBiaW5hcnkgcHJlZGljdG9yIHZhcmlhYmxlIG9mIE5ld1ByZWNpcCwgYW5kIHRoYXQgd2UgY2FuIGNvbnRpbnVlIHdpdGggdGhlIG1vZGVsIGJ1aWxkaW5nIHByb2Nlc3MuDQoNCk5vdywgd2UgaGF2ZSBjaGVja2VkIHRoZSBkaXN0cmlidXRpb25zIG9mIGFsbCB0aHJlZSBvZiBvdXIgcHJlZGljdG9yIHZhcmlhYmxlcywgRGF5LCBBdmdUZW1wLCBhbmQgTmV3UHJlY2lwLCBhbmQgZW5zdXJlZCB0aGF0IHRoZXJlIGFyZSBub3QgYW55IGFwcGFyZW50IGlzc3VlcyB3aXRoIGFueSBvZiB0aGVzZSB2YXJpYWJsZXMgb3IgdGhlaXIgZGlzdHJpYnV0aW9ucy4gU28sIHdlIGNhbiBjb250aW51ZSB3aXRoIHVzaW5nIHRoZXNlIHByZWRpY3RvciB2YXJpYWJsZXMgaW4gb3VyIG1vZGVsIGJ1aWxkaW5nIHByb2Nlc3MuDQoNCg0KIyMgQXN1bXB0aW9ucyBhbmQgQ29uZGl0aW9ucw0KDQpCZWZvcmUgd2UgYmVnaW4gd2l0aCBidWlsZGluZyBvdXIgbW9kZWwsIHdlIG11c3QgY2hlY2sgdGhlIGFzc3VtcHRpb25zIGFuZCBjb25kaXRpb25zIHdoaWNoIGFyZSByZXF1aXJlZCBmb3IgYSBQb2lzc29uIHJlZ3Jlc3Npb24gbW9kZWwuDQoNClRoZXJlIGFyZSBmb3VyIGFzc3VtcHRpb25zIHdoaWNoIG11c3QgYmUgbWV0IGluIG9yZGVyIHRvIGNyZWF0ZSBhIFBvaXNzb24gcmVncmVzc2lvbiBtb2RlbC4gVGhlc2UgYXNzdW1wdGlvbnMgaW5jbHVkZToNCg0KMS4gVGhlIHJlc3BvbnNlIHZhcmlhYmxlIGlzIGEgY291bnQgZGVzY3JpYmVkIGJ5IGEgUG9pc3NvbiBkaXN0cmlidXRpb24uDQoNCjIuIE9ic2VydmF0aW9ucyBhcmUgaW5kZXBlbmRlbnQgb2Ygb25lIGFub3RoZXIuDQoNCjMuIFRoZSBtZWFuIG9mIHRoZSBQb2lzc29uIHJhbmRvbSB2YXJpYWJsZSBpcyBlcXVhbCB0byB0aGUgdmFyaWFuY2Ugb2Ygc2FpZCBQb2lzc29uIHJhbmRvbSB2YXJpYWJsZS4NCg0KNC4gVGhlIGxvZyBvZiB0aGUgbWVhbiByYXRlLCBsb2cgKM67KSwgbXVzdCBiZSBhIGxpbmVhciBmdW5jdGlvbiBvZiB4Lg0KDQoNCldlIHdpbGwgY2hlY2sgd2hldGhlciBhbGwgb2YgdGhlc2UgZm91ciBjb25kaXRpb25zIGhhdmUgYmVlbiBzdWNjZXNzZnVsbHkgbWV0IGJ5IG91ciBjeWNsaW5nIGRhdGEgc2V0IGJlZm9yZSBiZWdpbm5pbmcgd2l0aCB0aGUgbW9kZWwgYnVpbGRpbmcgcHJvY2VzcyBmb3Igb3VyIFBvaXNzb24gcmVncmVzc2lvbiBtb2RlbC4NCg0KV2Ugd2lsbCBnbyB0aHJvdWdoIGFuZCBjaGVjayBhbGwgZm91ciBvZiB0aGUgbmVjZXNzYXJ5IGNvbmRpdGlvbnMgcmVxdWlyZWQgZm9yIGEgUG9pc3NvbiBSZWdyZXNzaW9uIE1vZGVsLg0KDQoNCiMjIyBDb25kaXRpb24gMTogVGhlIHJlc3BvbnNlIHZhcmlhYmxlIGlzIGEgY291bnQgZGVzY3JpYmVkIGJ5IGEgUG9pc3NvbiBkaXN0cmlidXRpb24uDQoNClRoZSByZXNwb25zZSB2YXJpYWJsZSBpbiB0aGlzIGRhdGEgc2V0IHdhcyBzdGF0ZWQgdG8gYmUgdGhlIFdpbGxpYW1zYnVyZ0JyaWRnZSB2YXJpYWJsZSwgcmVwcmVzZW50aW5nIHRoZSB0b3RhbCBudW1iZXIgb2YgY3ljbGlzdHMgb24gdGhlIFdpbGxpYW1zYnVyZyBCcmlkZ2Ugb24gYSBnaXZlbiBvYnNlcnZhdGlvbi4gVGhpcyB2YXJpYWJsZSBpcyBkZXNjcmliZWQgYXMgYSBjb3VudCwgcmVwcmVzZW50aW5nIHRoZSBudW1iZXIgb2YgY3ljbGlzdHMgb24gYSBnaXZlbiBvYnNlcnZhdGlvbi4gVGhpcyBmaXRzIHRoZSBjcml0ZXJpYSBmb3IgdGhpcyBhc3N1bXB0aW9uLCBiZWNhdXNlIHdlIGNhbiBjb25jbHVkZSB0aGF0IHdlIGhhdmUgYSByZXNwb25zZSB2YXJpYWJsZSB0aGF0IGlzIGEgY291bnQuDQoNCg0KIyMjIENvbmRpdGlvbiAyOiBPYnNlcnZhdGlvbnMgYXJlIGluZGVwZW5kZW50IG9mIG9uZSBhbm90aGVyLg0KDQpFYWNoIG9ic2VydmF0aW9uIHdhcyBjb2xsZWN0ZWQgb24gYSBnaXZlbiBkYXRlLCBhbmQgd2UgY2FuIHNhZmVseSBhc3N1bWUgdGhhdCB0aGUgY29uZGl0aW9ucyBvZiBvbmUgZGF5IGRpZCBub3QgYWZmZWN0IHRoZSBjb25kaXRpb25zIG9mIGFub3RoZXIgZGF5LiBUaGUgbnVtYmVyIG9mIGN5Y2xpc3RzIG9uIHRoZSBXaWxsaWFtc2J1cmcgQnJpZGdlIGZvciBhIGdpdmVuIG9ic2VydmF0aW9uIGlzIGluZGVwZW5kZW50IG9uIHRoaXMgbnVtYmVyIG9mIGEgZGlmZmVyZW50IG9ic2VydmF0aW9uLiBTbywgd2UgY2FuIHNhZmVseSBjb25jbHVkZSB0aGF0IHRoYXQgb2JzZXJ2YXRpb25zIGFyZSBhbGwgaW5kZXBlbmRlbnQgYW5kIHNlcGFyYXRlIGZyb20gb25lIGFub3RoZXIuIA0KDQoNCiMjIyBDb25kaXRpb24gMzogVGhlIG1lYW4gb2YgdGhlIFBvaXNzb24gcmFuZG9tIHZhcmlhYmxlIGlzIGVxdWFsIHRvIHRoZSB2YXJpYW5jZSBvZiBzYWlkIFBvaXNzb24gcmFuZG9tIHZhcmlhYmxlLg0KDQpJbiBvcmRlciBmb3IgYSB2YXJpYWJsZSB0byBiZSBhIFBvaXNzb24gcmFuZG9tIHZhcmlhYmxlLCBpdHMgbWVhbiBtdXN0IGJlIGVxdWFsIHRvIGl0cyB2YXJpYW5jZS4gV2UgcHJldmlvdXNseSBzdGF0ZWQgdGhhdCB0aGUgV2lsbGlhbXNidXJnQnJpZGdlIHZhcmlhYmxlIHdpbGwgYmUgb3VyIHJlc3BvbnNlIHZhcmlhYmxlLiBUaGVyZWZvcmUsIHdlIG11c3QgY2hlY2sgdGhhdCB0aGlzIHZhcmlhYmxlIG1lZXRzIHRoZSBjcml0ZXJpYSBmb3IgYSBQb2lzc29uIHJhbmRvbSB2YXJpYWJsZSwgaGF2aW5nIGEgbWVhbiB3aGljaCBpcyBlcXVhbCB0byBpdHMgdmFyaWFuY2UuDQoNCmBgYHtyfQ0KIyBGaW5kaW5nIHRoZSBtZWFuLg0KbWVhbiA8LSBtZWFuKGN5Y2xpbmckV2lsbGlhbXNidXJnQnJpZGdlKQ0KcHJpbnQobWVhbikNCmBgYA0KDQpUaGUgbWVhbiBvZiB0aGUgV2lsbGlhbXNidXJnQnJpZGdlIHZhcmlhYmxlIGlzIDQsOTQyLjI2Ny4gVGhpcyByZXByZXNlbnRzIHRoZSBtZWFuIG51bWJlciBvZiBpbmRpdmlkdWFscyBvbiB0aGUgV2lsbGlhbXNidXJnIEJyaWRnZSBvbiBhIGdpdmVuIG9ic2VydmF0aW9uLiBUaGlzIG1lYW5zIHRoYXQgdGhlIG1lYW4gbnVtYmVyIG9mIGluZGl2aWR1YWxzIG9uIHRoZSBXaWxsaWFtc2J1cmcgQnJpZGdlIG9uIGFueSBnaXZlbiBkYXRlIGlzIGFyb3VuZCA0LDk0MyBwZW9wbGUuIFdlIHJvdW5kIHRoaXMgdmFsdWUgdXAgYmVjYXVzZSB0aGUgbnVtYmVyIG9mIGluZGl2aWR1YWxzIGlzIGEgd2hvbGUgbnVtYmVyIGFuZCBzbyB0aGUgZGVjaW1hbCBtdXN0IGJlIHJvdW5kZWQgdXAgdG8gdGhlIG5leHQgd2hvbGUgbnVtYmVyIHRvIHJlcHJlc2VudCB0aGF0IHBhcnQgYXMgYW4gaW5kaXZpZHVhbC4gDQoNCk5leHQsIGxldCdzIGZpbmQgdGhlIHZhcmlhbmNlIG9mIG91ciByZXNwb25zZSB2YXJpYWJsZS4NCg0KYGBge3J9DQojIEZpbmRpbmcgdGhlIHZhcmlhbmNlLg0KdmFyaWFuY2UgPC0gdmFyKGN5Y2xpbmckV2lsbGlhbXNidXJnQnJpZGdlKQ0KcHJpbnQodmFyaWFuY2UpDQpgYGANCg0KVGhlIHZhcmlhbmNlIG9mIHRoZSBXaWxsaWFtc2J1cmdCcmlkZ2UgdmFyaWFibGUgaXMgMywwMDUsNjY1LiBUaGlzIGRvZXMgbm90IG1hdGNoIHVwIHdpdGggdGhlIHZhbHVlIG9mIHRoZSBtZWFuLCBhbmQgaW5kaWNhdGVzIGEgdmlvbGF0aW9uIG9mIG9uZSB0aGUgbmVjY2Vzc2FyeSBjb25kaXRpb25zIGZvciBhIFBvaXNzb24gcmVncmVzc2lvbiBtb2RlbC4gVGhpcyBpbXBsaWVzIHRoYXQgb3VyIHJlc3BvbnNlIHZhcmlhYmxlIGlzIGluIGZhY3Qgbm90IGEgUG9pc3NvbiByYW5kb20gdmFyaWFibGUgYmVjYXVzZSB0aGUgdmFsdWUgb2YgaXRzIG1lYW4gaXMgbm90IGVxdWl2YWxlbnQgdG8gdGhlIHZhbHVlIG9mIGl0cyB2YXJpYW5jZS4gDQoNCg0KIyMjIENvbmRpdGlvbiA0OiBUaGUgbG9nIG9mIHRoZSBtZWFuIHJhdGUsIGxvZyAozrspLCBtdXN0IGJlIGEgbGluZWFyIGZ1bmN0aW9uIG9mIHguDQoNCldlIHdpbGwgdGFrZSBhIGxvb2sgYXQgdGhlIHBsb3Qgb2YgdGhlIG1lYW4gcmF0ZSBhZ2FpbnN0IHRoZSBwcmVkaWN0b3IgdmFyaWFibGVzIHRvIGNoZWNrIHRoaXMgY29uZGl0aW9uLiANCg0KU2luY2Ugb3VyIGZpcnN0IHByZWRpY3RvciB2YXJpYWJsZSBpcyBEYXksIGFuZCB0aGlzIGEgY2F0ZWdvcmljYWwsIGNoYXJhY3RlciB2YXJpYWJsZSwgaXQgd291bGQgbm90IGNyZWF0ZSBhIGxpbmVhciBmdW5jdGlvbiBiZWNhdXNlIGl0IGlzIG1hZGUgdXAgb2YgY2F0ZWdvcmljYWwgaW5wdXRzLiBTbywgaW5zdGVhZCwgd2Ugd2lsbCBsb29rIGF0IHRoZSBudW1lcmljYWwgcHJlZGljdG9yIHZhcmlhYmxlIGluc3RlYWQgdG8gY2hlY2sgdGhpcyBjb25kaXRpb24uDQoNCkxldCdzIGxvb2sgYXQgdGhlIHByZWRpY3RvciB2YXJpYWJsZSBvZiBhdmVyYWdlIHRlbXBlcmF0dXJlIHZzIG91ciByZXNwb25zZSB2YXJpYWJsZSBvZiBXaWxsaWFtc2J1cmdCcmlkZ2UuIEF2Z1RlbXAgaXMgYSBxdWFudGl0YXRpdmUsIG51bWVyaWMgdmFyaWFibGUgc28gd2UgY2FuIHVzZSBpdCB0byBjaGVjayB0aGlzIGNvbmRpdGlvbi4NCg0KYGBge3J9DQpwbG90KGN5Y2xpbmckQXZnVGVtcCwgY3ljbGluZyRXaWxsaWFtc2J1cmdCcmlkZ2UsIG1haW4gPSAiQXZnVGVtcCB2cy4gV2lsbGlhbXNidXJnIEJyaWRnZSIsIHhsYWIgPSAiQXZnVGVtcCIsIHlsYWIgPSAiV2lsbGlhbXNidXJnQnJpZGdlIikNCmBgYA0KDQpUaGUgc2NhdHRlcnBsb3Qgb2YgdGhlIHR3byB2YXJpYWJsZXMgb2YgQXZnVGVtcCBhbmQgV2lsbGlhbXNidXJnQnJpZGdlIHNob3dzIHdoYXQgZG9lcyBhcHBlYXIgdG8gYmUgYSBsaW5lYXIgcmVsYXRpb25zaGlwIG9mIHRoZXNlIHR3byB2YXJpYWJsZXMuIFdlIGNhbiBzZWUgYSBwb3NpdGl2ZSByZWxhdGlvbnNoaXAgYmV0d2VlbiB0aGUgdHdvIHZhcmlhYmxlcywgYXMgYXZlcmFnZSB0ZW1wZXJhdHVyZSBpbmNyZWFzZXMsIHNvIGRvZXMgdGhlIG51bWJlciBvZiBjeWNsaXN0cyBvbiB0aGUgV2lsbGlhbXNidXJnIEJyaWRnZS4gVGhpcyBzZWVtcyBsb2dpY2FsIGFzIGl0IG1ha2VzIHNlbnNlIHRoYXQgbW9yZSBwZW9wbGUgd291bGQgd2FudCB0byBnbyBvdXRzaWRlIGFuZCBnbyBjeWNsaW5nIG9uIGEgZGF5IHRoYXQgaXMgd2FybWVyIG91dHNpZGUgcmF0aGVyIHRoYW4gYSBkYXkgdGhhdCBpcyBjb2xkZXIgb3V0c2lkZS4gVGhlIHJlbGF0aW9uc2hpcCBvZiB0aGUgdHdvIHZhcmlhYmxlcyBkb2VzIGFwcGVhciB0byBoYXZlIGEgbW9kZXJhdGUgc3RyZW5ndGgsIGJ1dCB0aGUgbGluZWFyIHBhdHRlcm4gY2FuIGRlZmluaXRlbHkgYmUgc2Vlbi4gU28sIGl0IGRvZXMgYXBwZWFyIHRoYXQgV2lsbGlhbXNidXJnQnJpZGdlIGlzIGEgbGluZWFyIGZ1bmN0aW9uIG9mIEF2Z1RlbXAsIHdoaWNoIHZlcmlmaWVzIHRoaXMgbmVjZXNzYXJ5IGNvbmRpdGlvbiBmb3IgYSBQb2lzc29uIHJlZ3Jlc3Npb24gbW9kZWwuDQoNCg0KTGFzdGx5LCB3ZSBoYXZlIG91ciBwcmVkaWN0b3IgdmFyaWFibGUgb2YgTmV3UHJlY2lwLiBUaGlzIGlzIGEgYmluYXJ5IHByZWRpY3RvciB2YXJpYWJsZSwgc28gd2Ugd2lsbCBvbmx5IHNlZSBwb2ludHMgYXQgeCA9IDAgYW5kIHggPSAxIGlmIHdlIHdlcmUgdG8gY3JlYXRlIGEgc2NhdHRlcnBsb3Qgb2YgdGhpcyBiaW5hcnkgcHJlZGljdG9yIHZhcmlhYmxlIG9mIE5ld1ByZWNpcC4gU28sIHdlIGNhbiBub3QgZXhwZWN0IHRvIHNlZSBhIGxpbmVhciByZWxhdGlvbnNoaXAgYmV0d2VlbiBOZXdQcmVjaXAgYW5kIFdpbGxpYW1zYnVyZ0JyaWRnZSwgYmVjYXVzZSBOZXdQcmVjaXAgY2FuIG9ubHkgaGF2ZSB2YWx1ZXMgb2YgMCBhbmQgMSwgbm90IGFueXRoaW5nIGluIGJldHdlZW4gZHVlIHRvIGl0IGJlaW5nIGEgYmluYXJ5IHByZWRpY3RvciB2YXJpYWJsZS4NCg0KT3ZlcmFsbCwgd2UgY2FuIGNvbnNpZGVyIHRoaXMgY29uZGl0aW9uIHNhdGlzZmllZCBzaW5jZSBvdXIgbnVtZXJpY2FsIHByZWRpY3RvciB2YXJpYWJsZSBvZiBBdmdUZW1wIHNob3dlZCB0aGF0IGl0IGRvZXMgaW5kZWVkIGhhdmUgYSBsaW5lYXIgcmVsYXRpb25zaGlwIHdpdGggb3VyIHJlc3BvbnNlIHZhcmlhYmxlLiANCg0KDQoNCiMjIyBTdW1tYXJ5IG9mIFZpb2xhdGlvbnMNCg0KT3ZlcmFsbCwgaXQgc2VlbXMgdGhhdCB3ZSBkbyBoYXZlIG9uZSBub3RhYmxlIHZpb2xhdGlvbiBvZiB0aGUgY29uZGl0aW9ucyBvZiBhIFBvaXNzb24gcmVncmVzc2lvbiBtb2RlbCB3aXRoaW4gb3VyIGRhdGEgc2V0LiBXZSBmb3VuZCB0aGF0IHRoZSByZXNwb25zZSB2YXJpYWJsZSwgV2lsbGlhbXNidXJnQnJpZGdlLCBkb2VzIG5vdCBtZWV0IHRoZSBuZWNlc3NhcnkgY3JpdGVyaWEgb2YgYSBQb2lzc29uIHJhbmRvbSB2YXJpYWJsZSwgYmVjYXVzZSBpdHMgbWVhbiBpcyBub3QgZXF1YWwgdG8gaXRzIHZhcmlhbmNlLiBUaGlzIGlzIGEgbWFqb3IgY29uY2VybiwgYmVjYXVzZSBpdCBwb2ludHMgdG8gYSBtYWpvciB2aW9sYXRpb24gb2YgdGhlIGNvbmRpdGlvbnMgcmVxdWlyZWQgZm9yIGEgUG9pc3NvbiByZWdyZXNzaW9uIG1vZGVsLiANCg0KVGhpcyB2aW9sYXRpb24gb2YgdGhlIGNvbmRpdGlvbnMgZm9yIGEgUG9pc3NvbiByZWdyZXNzaW9uIG1vZGVsIHN1Z2dlc3RzIGEgbWFqb3IgY29uY2VybiB3aXRoIG91ciBkYXRhIHNldCwgYXMgaXQgZmFpbHMgdG8gbWVldCBhIG1ham9yIGNvbmRpdGlvbiB3aGljaCBpcyByZXF1aXJlZCBmb3IgYSBQb2lzc29uIHJlZ3Jlc3Npb24gbW9kZWwuIFRoaXMgc3VnZ2VzdCB0aGF0IHBlcmhhcHMgYSBQb2lzc29uIHJlZ3Jlc3Npb24gbW9kZWwgbWF5IG5vdCBiZSB0aGUgYmVzdCBtb2RlbCBjaG9pY2UgZm9yIHRoaXMgZGF0YSBzZXQgYWZ0ZXIgYWxsLiAgDQoNCldlIHdpbGwgc3RpbGwgY29udGludWUgd2l0aCBidWlsZGluZyB0aGUgUG9pc3NvbiByZWdyZXNzaW9uIG1vZGVscyBmb3IgdGhpcyBwcm9qZWN0LCBidXQgaXQgaXMgaW1wb3J0YW50IHRvIGtlZXAgaW4gbWluZCB0aGF0IHRoaXMgdmlvbGF0aW9uIG1heSBtZWFuIHRoYXQgdGhlIFBvaXNzb24gcmVncmVzc2lvbiBtb2RlbCBpcyBub3QgdGhlIGJlc3QgbW9kZWwgY2hvaWNlIGZvciB0aGlzIGRhdGEgc2V0IGR1ZSB0byB0aGUgbmVjZXNzYXJ5IGNvbmRpdGlvbiBvZiB0aGUgbWVhbiBvZiB0aGUgcmVzcG9uc2UgdmFyaWFibGUgZXF1YWxpbmcgdGhlIHZhcmlhbmNlIG9mIHRoZSByZXNwb25zZSB2YXJpYWJsZSBoYXZpbmcgYmVlbiBmYWlsZWQgdG8gaGF2ZSBiZWVuIG1ldC4gDQoNCg0KDQoNCiMgUG9pc3NvbiBSZWdyZXNzaW9uIE1vZGVscyBvbiB0aGUgT3JpZ2luYWwgVmFyaWFibGVzDQoNCkZpcnN0LCB3ZSB3aWxsIGxvb2sgYXQgdGhlIFBvaXNzb24gcmVncmVzc2lvbiBtb2RlbHMgd2hpY2ggd2VyZSBjcmVhdGVkIGluIHRoZSBwcmV2aW91cyB3ZWVrJ3MgYXNzaWdubWVudCBhbmQgbG9vayBhdCB0aGUgY29ycmVjdGVkIHZlcnNpb25zIG9mIHRoZXNlIG1vZGVscy4gV2Ugd2lsbCB1c2UgdGhlIG9yaWdpbmFsIHByZWRpY3RvciB2YXJpYWJsZXMgZmlyc3QsIGFuZCB0aGVuIGluIGxhdGVyIHN0ZXBzIG9mIHRoaXMgcHJvamVjdCB3ZSB3aWxsIHVzZSB0aGUgbmV3IHByZWRpY3RvciB2YXJpYWJsZXMgb2YgQXZnVGVtcCBhbmQgTmV3UHJlY2lwLg0KDQpJbiB0aGUgcHJldmlvdXMgd2VlaydzIGFzc2lnbm1lbnQsIHdlIGNyZWF0ZWQgdHdvIFBvaXNzb24gcmVncmVzc2lvbiBtb2RlbHMsIG9uZSBvbiBmcmVxdWVuY3kgY291bnRzIGFuZCBvbmUgb2YgdGhlIHJhdGVzLiBXZSB3aWxsIGNyZWF0ZSB0aGVzZSBhZ2FpbiB0byBzZWUgdGhlIHByb3BlciwgY29ycmVjdGVkIG1vZGVscy4gU2luY2UgaW4gdGhlIHByZXZpb3VzIHdlZWsncyBhc3NpbmdtZW50LCB3ZSBkaWQgbm90IGFsdGVyIGFueSBvZiB0aGUgcHJlZGljdG9yIHZhcmlhYmxlcyBmb3IgdGhlc2UgdHdvIG1vZGVscywgd2Ugd2lsbCB1c2UgdGhlIG9yaWdpbmFsIHZhcmlhYmxlcyBmb3Igbm93IGFuZCB0aGVuIGNyZWF0ZSBtb2RlbHMgdXNpbmcgdGhlIG5ldyBwcmVkaWN0b3IgdmFyaWFibGVzIG9mIEF2Z1RlbXAgYW5kIE5ld1ByZWNpcC4NCg0KRm9yIG5vdywgd2Ugd2lsbCB1c2UgdGhlIG9sZCBwcmVkaWN0b3IgdmFyaWFibGVzIG9mIERheSwgSGlnaFRlbXAsIExvd1RlbXAsIGFuZCBQcmVjaXBpdGF0aW9uLiBUaGVzZSB3ZXJlIHRoZSBwcmVkaWN0b3IgdmFyaWFibGVzIHVzZWQgaW4gdGhlIHByZXZpb3VzIHdlZWsncyBhc3NpZ25tZW50LCBzbyB3ZSB3aWxsIGZpcnN0IGJlZ2luIGJ5IGNvcnJlY3RpbmcgdGhlIG1vZGVscyB3aGljaCB3ZXJlIGNyZWF0ZWQgaW4gdGhhdCBhc3NpZ25tZW50IGJlZm9yZSB3ZSBiZWVuIGNyZWF0aW5nIHRoZSBuZXcgbW9kZWxzIGZvciB0aGlzIHByb2plY3QuDQoNCiMjIFBvaXNzb24gUmVncmVzc2lvbiBNb2RlbCBvbiBGcmVxdWVuY3kgQ291bnRzIA0KDQpXZSB3aWxsIGJlZ2luIHdpdGggY3JlYXRpbmcgYSBQb2lzc29uIHJlZ3Jlc3Npb24gbW9kZWwgb2YgdGhlIGZyZXF1ZW5jeSBjb3VudHMuIFRoaXMgbW9kZWwgd2lsbCBiZSBvbiB0aGUgZnJlcXVlbmN5IGNvdW50cyBvZiBpbmRpdmlkdWFscyBvbiB0aGUgV2lsbGlhbXNidXJnIEJyaWRnZSBmb3IgYSBnaXZlbiBvYnNlcnZhdGlvbnMuIE91ciBnb2FsIGlzIHRvIGNyZWF0ZSBhIFBvaXNzb24gcmVncmVzc2lvbiBtb2RlbCB3aGljaCBjYW4gc3RhdGlzdGljYWxseSBzaWduaWZpY2FudGx5IHByZWRpY3QgdGhlIGNvdW50IG9mIHRoZSBudW1iZXIgb2YgaW5kaXZpZHVhbHMgb24gdGhlIFdpbGxpYW1zYnVyZyBCcmlkZ2UgZm9yIGEgZ2l2ZW4gb2JzZXJ2YXRpb24sIGJhc2VkIHVwb24gdGhlIHZhcmlvdXMgZmFjdG9ycyBpbiB0aGlzIGRhdGEgc2V0LiANCg0KV2Ugd2lsbCBjcmVhdGUgb3VyIFBvaXNzb24gcmVncmVzc2lvbiBtb2RlbCBvbiB0aGUgZnJlcXVlbmN5IGNvdW50cy4NCg0KYGBge3J9DQojIFBvaXNzb24gUmVncmVzc2lvbiBNb2RlbCBvZiBDb3VudHMNCm1vZGVsLmNvdW50cyA8LSBnbG0oV2lsbGlhbXNidXJnQnJpZGdlIH4gRGF5ICsgSGlnaFRlbXAgKyBMb3dUZW1wICsgUHJlY2lwaXRhdGlvbiwgZmFtaWx5ID0gcG9pc3NvbihsaW5rID0gImxvZyIpLCBkYXRhID0gY3ljbGluZykNCnBvaXMuY291bnQuY29lZiA9IHN1bW1hcnkobW9kZWwuY291bnRzKSRjb2VmDQprYWJsZShwb2lzLmNvdW50LmNvZWYsIGNhcHRpb24gPSAiUG9pc3NvbiBSZWdyZXNzaW9uIE1vZGVsIGZvciB0aGUgQ291bnRzIG9mIEN5Y2xpc3RzIFxuIG9uIHRoZSBXaWxsaWFtc2J1cmcgQnJpZGdlIikNCmBgYA0KDQpUaGUgcmVncmVzc2lvbiBlcXVhdGlvbiBmb3IgdGhlIFBvaXNzb24gcmVncmVzc2lvbiBtb2RlbCBvbiB0aGUgZnJlcXVlbmN5IGNvdW50cyBpcyBnaXZlbiBhczoNCg0KbG9nKM68KSA9IDcuNjUzOCArIDAuMDU0NiAqIERheU1vbmRheSAtIDAuMjc0NCAqIERheVNhdHVyZGF5IC0gMC4yMzQ2ICogRGF5U3VuZGF5ICsgMC4wMzE5ICogRGF5VGh1cnNkYXkgKyAwLjE5ODggKiBEYXlUdWVzZGF5ICsgMC4wNTExICogRGF5V2VkbmVzZGF5ICsgMC4wMTcxICogSGlnaFRlbXAgLSAwLjAwMjQgKiBMb3dUZW1wIC0gMS4wMzIxICogUHJlY2lwaXRhdGlvbg0KDQoNCkFsbCBvZiB0aGUgcHJlZGljdG9yIHZhcmlhYmxlcywgRGF5TW9uZGF5LCBEYXlTYXR1cmRheSwgRGF5U3VuZGF5LCBEYXlUaHVyc2RheSwgRGF5VHVlc2RheSwgRGF5V2VkbmVzZGF5LCBIaWdoVGVtcCwgTG93VGVtcCwgYW5kIFByZWNpcGl0YXRpb24sIGFsbCBoYXZlIHAtdmFsdWVzIG9mIHAgPCAuMDAxLiBUaGlzIGluZGljYXRlcyB0aGF0IGFsbCBvZiB0aGUgcHJlZGljdG9yIGluIG91ciBtb2RlbCB2YXJpYWJsZXMgYXJlIHN0YXRpc3RpY2FsbHkgc2lnbmlmaWNhbnQgaW4gcHJlZGljdGluZyB0aGUgdG90YWwgZXhwZWN0ZWQgY291bnRzIG9mIGN5Y2xpc3RzIG9uIHRoZSBXaWxsaWFtc2J1cmcgQnJpZGdlIG9uIGEgZ2l2ZW4gZGF5LiANCg0KVGhlIHNpZ25pZmljYW5jZSBvZiB0aGVzZSB2YXJpYWJsZXMgaW4gcmVnYXJkcyB0byBwcmVkaWN0aW5nIHRoZSBleHBlY3RlZCBjb3VudHMgY2FuIGxpa2VseSBiZSBhdHRyaWJ1dGVkIHRvIHBvdGVudGlhbCBhZHZlcnNlIHdlYXRoZXIgY29uZGl0aW9ucywgc3VjaCBhcyBleGNlc3NpdmUgaGVhdCBvciBjb2xkLCBhbG9uZyB3aXRoIGludGVuc2UgcHJlY2lwaXRhdGlvbiBhbmQgc3Rvcm1zIG1ha2luZyBjeWNsaW5nIG5vbiBpZGVhbCBvbiB0aG9zZSBkYXlzIHdpdGggcG9vciBjb25kaXRpb25zIGZvciBvdXRkb29ycyBhY3Rpdml0aWVzIHN1Y2ggYXMgY3ljbGluZy4gVGhlc2UgcHJlZGljdG9yIHZhcmlhYmxlcyBhbGwgYmVpbmcgc3RhdGlzdGljYWxseSBzaWduaWZpY2FudCBzaG93cyB0aGF0IHRoZSB3ZWF0aGVyIGFuZCB0ZW1wZXJhdHVyZSBjb25kaXRpb25zIGRvIHN1Z2dlc3QgYSBkaXNjcmVwYW5jeSBpbiB0aGUgbnVtYmVyIG9mIGN5Y2xpc3RzIG9uIHRoZSBXaWxsaWFtc2J1cmcgQnJpZGdlIGZyb20gZGF5IHRvIGRheSBkdWUgdG8gdGhlc2UgY2hhbmdlcyBpbiB0ZW1wZXJhdHVyZSBhbmQgcHJlY2lwaXRhdGlvbi4gDQoNCk92ZXJhbGwsIHRoaXMgUG9pc3NvbiBtb2RlbCBvZiB0aGUgZnJlcXVlbmN5IGNvdW50cyBvZiB0aGUgY3ljbGlzdHMgb24gdGhlIFdpbGxpYW1zYnVyZyBCcmlkZ2Ugc2hvd2VkIHN0YXRpc3RpY2FsIHNpZ25pZmljYW5jZSBpbiBpdHMgcHJlZGljdGlvbiBvZiB0aGUgZXhwZWN0ZWQgbG9nIGNvdW50cyBmb3IgdGhlIG51bWJlciBvZiBjeWNsaXN0cyBvbiB0aGUgV2lsbGlhbXNidXJnIEJyaWRnZSBmb3IgYSBnaXZlbiBvYnNlcnZhdGlvbi4NCg0KRm9yIG91ciBjYXRlZ29yaWNhbCBwcmVkaWN0b3IgdmFyaWFibGUgb2YgRGF5LCBGcmlkYXkgd2FzIGNob3NlbiBhcyB0aGUgYmFzZSBsaW5lIGxldmVsLCB3aGljaCBjYW4gYmUgc2VlbiBieSBob3cgdGhlcmUgaXMgbm90IGEgIkRheUZyaWRheSIgdmFyaWFibGUgaW4gdGhlIHJlZ3Jlc3Npb24gZXF1YXRpb24gb3V0cHV0LiBUaGlzIGlzIGJlY2F1c2Ugb2YgdGhlIHNldmVuIGRheXMsIEZyaWRheSBpcyB0aGUgb25lIHdoaWNoIGNvbWVzIGZpcnN0IGFscGhhYmV0aWNhbGx5IGFuZCBSIGNob29zZXMgdGhlIGxldmVsIHdoaWNoIGNvbWVzIGZpcnN0IGFscGhhYmV0aWNhbGx5IGFzIHRoZSBiYXNlIGxpbmUgbGV2ZWwuIFRoZXJlZm9yZSwgZm9yIG91ciByZWdyZXNzaW9uIGNvZWZmaWNpZW50IGludGVycHJldGF0aW9ucyBmb3IgdGhlIGRpZmZlcmVudCBsZXZlbHMgb2YgdGhlIERheSB2YXJpYWJsZSwgdGhlc2UgdmFsdWVzIHdpbGwgYmUgY29tcGFyZWQgYWdhaW5zdCB0aGUgYmFzZSBsaW5lIGxldmVsIG9mIEZyaWRheS4NCg0KDQojIyMgUmVncmVzc2lvbiBDb2VmZmljaWVudHMgSW50ZXJwcmV0YXRpb24NCg0KV2Ugd2lsbCBhbmFseXNpcyB0aGUgcmVncmVzc2lvbiBjb2VmZmljaWVudHMgZm9yIHRoZSB2YXJpYWJsZXMgaW4gdGhpcyBQb2lzc29uIHJlZ3Jlc3Npb24gbW9kZWwgb24gZnJlcXVlbmN5IGNvdW50cy4NCg0KKiBUaGUgdmFsdWUgb2YgdGhlIHktaW50ZXJjZXB0IGlzIGdpdmVuIGFzIDcuNjUzNi4gVGhpcyByZXByZXNlbnRzIHRoZSBiYXNlbGluZSBvZiB0aGUgbWVhbiBvZiBsb2cozrwpIHdoZW4gYWxsIHByZWRpY3RvciB2YXJpYWJsZXMgYXJlIGVxdWFsIHRvIDAuIEhvd2V2ZXIsIHRoZSB5LWludGVyY2VwdCBkb2VzIG5vdCBoYXZlIGEgcHJhY3RpY2FsIGludGVycHJldGF0aW9uIG9yIG1lYW5pbmcgaW4gdGhpcyBzY2VuYXJpbyBzbyB3ZSBhcmUgbm90IGludGVyZXN0ZWQgaW4gaXRzIG1lYW5pbmcgZm9yIHRoZSBQb2lzc29uIHJlZ3Jlc3Npb24gbW9kZWwuDQoNCiogRGF5TW9uZGF5IChwIDwgLjAwMSk6IFRoZSByZWdyZXNzaW9uIGNvZWZmaWNpZW50IGZvciB0aGUgdmFyaWFibGUgRGF5TW9uZGF5IHdhcyBmb3VuZCB0byBiZSAwLjA1NDYuIFRoaXMgbWVhbnMgdGhhdCB0aGUgbWVhbiBsb2cgY291bnQgb2YgY3ljbGlzdHMgb24gdGhlIFdpbGxpYW1zYnVyZ3MgQnJpZGdlIHdhcyAwLjA1NDYgZ3JlYXRlciBvbiBNb25kYXkgdGhhbiBvbiBGcmlkYXkuIFdlIGNhbiBhbHNvIHNheSB0aGlzIG1lYW5zIHRoYXQgdGhlIGNvdW50IG9mIGN5Y2xpc3RzIGlzIDEuMDU2MSB0aW1lcyBncmVhdGVyIG9uIE1vbmRheSB0aGFuIG9uIEZyaWRheSwgaG9sZGluZyBhbGwgb3RoZXIgdmFyaWFibGVzIGNvbnN0YW50Lg0KDQoqIERheVNhdHVyZGF5IChwIDwgLjAwMSk6IFRoZSByZWdyZXNzaW9uIGNvZWZmaWNpZW50IGZvciB0aGUgdmFyaWFibGUgRGF5U2F0dXJkYXkgd2FzIGZvdW5kIHRvIGJlIC0wLjI3NDQuIFRoaXMgbWVhbnMgdGhhdCB0aGUgbWVhbiBsb2cgY291bnQgb2YgY3ljbGlzdHMgb24gdGhlIFdpbGxpYW1zYnVyZ3MgQnJpZGdlIHdhcyAwLjI3NDQgbGVzcyBvbiBTYXR1cmRheSB0aGFuIG9uIEZyaWRheS4gV2UgY2FuIGFsc28gc2F5IHRoaXMgbWVhbnMgdGhhdCB0aGUgY291bnQgb2YgY3ljbGlzdHMgaXMgMC43NjAwIHRpbWVzIGdyZWF0ZXIgb24gU2F0dXJkYXkgdGhhbiBvbiBGcmlkYXksIGhvbGRpbmcgYWxsIG90aGVyIHZhcmlhYmxlcyBjb25zdGFudC4NCg0KKiBEYXlTdW5kYXkgKHAgPCAuMDAxKTogVGhlIHJlZ3Jlc3Npb24gY29lZmZpY2llbnQgZm9yIHRoZSB2YXJpYWJsZSBEYXlTdW5kYXkgd2FzIGZvdW5kIHRvIGJlIC0wLjIzNDYuIFRoaXMgbWVhbnMgdGhhdCB0aGUgbWVhbiBsb2cgY291bnQgb2YgY3ljbGlzdHMgb24gdGhlIFdpbGxpYW1zYnVyZ3MgQnJpZGdlIHdhcyAwLjIzNDYgbGVzcyBvbiBTdW5kYXkgdGhhbiBvbiBGcmlkYXkuIFdlIGNhbiBhbHNvIHNheSB0aGlzIG1lYW5zIHRoYXQgdGhlIGNvdW50IG9mIGN5Y2xpc3RzIGlzIDAuNzkwOSB0aW1lcyBncmVhdGVyIG9uIFN1bmRheSB0aGFuIG9uIEZyaWRheSwgaG9sZGluZyBhbGwgb3RoZXIgdmFyaWFibGVzIGNvbnN0YW50Lg0KDQoqIERheVRodXJzZGF5IChwID0gMC4wMDE5KTogVGhlIHJlZ3Jlc3Npb24gY29lZmZpY2llbnQgZm9yIHRoZSB2YXJpYWJsZSBEYXlUaHVyc2RheSB3YXMgZm91bmQgdG8gYmUgMC4wMzE5LiBUaGlzIG1lYW5zIHRoYXQgdGhlIG1lYW4gbG9nIGNvdW50IG9mIGN5Y2xpc3RzIG9uIHRoZSBXaWxsaWFtc2J1cmdzIEJyaWRnZSB3YXMgMC4wMzE5IGdyZWF0ZXIgb24gVGh1cnNkYXkgdGhhbiBvbiBGcmlkYXkuIFdlIGNhbiBhbHNvIHNheSB0aGlzIG1lYW5zIHRoYXQgdGhlIGNvdW50IG9mIGN5Y2xpc3RzIGlzIDEuMDMyNCB0aW1lcyBncmVhdGVyIG9uIFRodXJzZGF5IHRoYW4gb24gRnJpZGF5LCBob2xkaW5nIGFsbCBvdGhlciB2YXJpYWJsZXMgY29uc3RhbnQuDQoNCiogRGF5VHVlc2RheSAocCA8IC4wMDEpOiBUaGUgcmVncmVzc2lvbiBjb2VmZmljaWVudCBmb3IgdGhlIHZhcmlhYmxlIERheVR1ZXNkYXkgd2FzIGZvdW5kIHRvIGJlIDAuMTk4OC4gVGhpcyBtZWFucyB0aGF0IHRoZSBtZWFuIGxvZyBjb3VudCBvZiBjeWNsaXN0cyBvbiB0aGUgV2lsbGlhbXNidXJncyBCcmlkZ2Ugd2FzIDAuMTk4OCBncmVhdGVyIG9uIFR1ZXNkYXkgdGhhbiBvbiBGcmlkYXkuIFdlIGNhbiBhbHNvIHNheSB0aGlzIG1lYW5zIHRoYXQgdGhlIGNvdW50IG9mIGN5Y2xpc3RzIGlzIDEuMjE5OSB0aW1lcyBncmVhdGVyIG9uIFR1ZXNkYXkgdGhhbiBvbiBGcmlkYXksIGhvbGRpbmcgYWxsIG90aGVyIHZhcmlhYmxlcyBjb25zdGFudC4NCg0KKiBEYXlXZWRuZXNkYXkgKHAgPC4wMDEpOiBUaGUgcmVncmVzc2lvbiBjb2VmZmljaWVudCBmb3IgdGhlIHZhcmlhYmxlIERheVdlZG5lc2RheSB3YXMgZm91bmQgdG8gYmUgMC4wNTExLiBUaGlzIG1lYW5zIHRoYXQgdGhlIG1lYW4gbG9nIGNvdW50IG9mIGN5Y2xpc3RzIG9uIHRoZSBXaWxsaWFtc2J1cmdzIEJyaWRnZSB3YXMgMC4wNTExIGdyZWF0ZXIgb24gV2VkbmVzZGF5IHRoYW4gb24gRnJpZGF5LiBXZSBjYW4gYWxzbyBzYXkgdGhpcyBtZWFucyB0aGF0IHRoZSBjb3VudCBvZiBjeWNsaXN0cyBpcyAxLjA1MjQgdGltZXMgZ3JlYXRlciBvbiBXZWRuZXNkYXkgdGhhbiBvbiBGcmlkYXksIGhvbGRpbmcgYWxsIG90aGVyIHZhcmlhYmxlcyBjb25zdGFudC4NCg0KKiBIaWdoVGVtcCAocCA8LjAwMSk6IFRoZSByZWdyZXNzaW9uIGNvZWZmaWNpZW50IG9mIHRoZSBIaWdoVGVtcCB2YXJpYWJsZSBpbiB0aGlzIG1vZGVsIGlzIDAuMDE3MS4gVGhpcyBtZWFucyB0aGF0IHRoZSBtZWFuIGxvZyBvZiB0aGUgY291bnRzIGluY3JlYXNlcyBieSAwLjAxNzEgdW5pdHMgZm9yIGV2ZXJ5IDEgZGVncmVlIEZhaHJlbmhlaXQgaW5jcmVhc2UgaW4gdGhlIGhpZ2ggdGVtcGVyYXR1cmUgZm9yIHRoZSBnaXZlbiBvYnNlcnZhdGlvbiwgaG9sZGluZyBhbGwgb3RoZXIgdmFyaWFibGVzIGNvbnN0YW50LiANCg0KKiBMb3dUZW1wIChwID0gMC4wMDIzKTogVGhlIHJlZ3Jlc3Npb24gY29lZmZpY2llbnQgb2YgdGhlIExvd1RlbXAgdmFyaWFibGUgaW4gdGhpcyBtb2RlbCBpcyAtMC4wMDI0LiBUaGlzIG1lYW5zIHRoYXQgdGhlIG1lYW4gbG9nIG9mIHRoZSBjb3VudHMgZGVjcmVhc2VzIGJ5IDAuMDAyNCB1bml0cyBmb3IgZXZlcnkgMSBkZWdyZWUgRmFocmVuaGVpdCBpbmNyZWFzZSBpbiB0aGUgbG93IHRlbXBlcmF0dXJlIGZvciB0aGUgZ2l2ZW4gb2JzZXJ2YXRpb24sIGhvbGRpbmcgYWxsIG90aGVyIHZhcmlhYmxlcyBjb25zdGFudC4gDQoNCiogUHJlY2lwaXRhdGlvbiAocCA8IC4wMDEpOiBUaGUgcmVncmVzc2lvbiBjb2VmZmljaWVudCBvZiB0aGUgUHJlY2lwaXRhdGlvbiB2YXJpYWJsZSBpbiB0aGlzIG1vZGVsIGlzIC0xLjAzMjEuIFRoaXMgbWVhbnMgdGhhdCB0aGUgbWVhbiBsb2cgb2YgdGhlIGNvdW50cyBkZWNyZWFzZXMgYnkgMS4wMzIxIHVuaXRzIGZvciBldmVyeSAxIGluY2ggaW5jcmVhc2UgaW4gdGhlIGFtb3VudCBvZiBwcmVjaXBpdGF0aW9uIGZvciB0aGUgZ2l2ZW4gb2JzZXJ2YXRpb24sIGhvbGRpbmcgYWxsIG90aGVyIHZhcmlhYmxlcyBjb25zdGFudC4gDQoNCg0KIyMgUG9pc3NvbiBSZWdyZXNzaW9uIE1vZGVsIG9uIFJhdGVzDQoNCk5vdywgd2Ugd2lsbCBjcmVhdGUgYSBQb2lzc29uIHJlZ3Jlc3Npb24gbW9kZWwgb2YgdGhlIHJhdGVzIGF0IHdoaWNoIGN5Y2xpc3RzIGVudGVyIGFuZCBsZWF2ZSB2aWEgdGhlIFdpbGxpYW1zYnVyZyBCcmlkZ2Ugb2Zmc2V0IGJ5IHRoZSB0b3RhbCBudW1iZXIgb2YgY3ljbGlzdHMgb24gYWxsIGZvdXIgb2YgdGhlIG1ham9yIE5ldyBZb3JrIGJyaWRnZXMuIFRoaXMgbW9kZWwsIHVubGlrZSB0aGUgcHJldmlvdXMgbW9kZWwgd2hpY2gganVzdCBmb2N1c2VkIG9uIHRoZSBmcmVxdWVuY3kgY291bnRzIG9mIGN5Y2xpc3RzIG9uIHRoZSBXaWxsaWFtc2J1cmcgQnJpZGdlLCB3aWxsIGFsc28gYWNjb3VudCBmb3IgdGhlIHRvdGFsIG51bWJlciBvZiBjeWNsaXN0cyBvbiBhbGwgZm91ciBvZiB0aGUgbWFqb3IgTmV3IFlvcmsgYnJpZGdlcywgdGhlIEJyb29rbHluIEJyaWRnZSwgdGhlIE1hbmhhdHRhbiBCcmlkZ2UsIHRoZSBXaWxsaWFtc2J1cmcgQnJpZGdlLCBhbmQgdGhlIFF1ZWVuc2Jvcm8gQnJpZGdlLiBUaGlzIFBvaXNzb24gbW9kZWwgd2lsbCBsb29rIGF0IHRoZSByYXRlcyBvZiB0aGUgbnVtYmVyIG9mIGN5Y2xpc3RzIG9uIHRoZSBXaWxsaWFtc2J1cmcgQnJpZGdlIGZvciBhIGdpdmVuIG9ic2VydmF0aW9uIGFzIGEgcmF0ZSBvdXQgb2YgdGhlIHRvdGFsIG51bWJlciBvZiBjeWNsaXN0cyBvbiBhbGwgZm91ciBvZiB0aGVzZSBtYWpvciBicmlkZ2VzIGZvciB0aGF0IHNwZWNpZmljIG9ic2VydmF0aW9uLg0KDQpXZSB3aWxsIGJ1aWxkIG91ciBQb2lzc29uIHJlZ3Jlc3Npb24gbW9kZWwgZm9yIHRoZSByYXRlcy4gVGhpcyB0aW1lLCB3ZSB3aWxsIHN0aWxsIHVzZSB0aGUgV2lsbGlhbXNidXJnQnJpZGdlIHZhcmlhYmxlIGFzIG91ciByZXNwb25zZSB2YXJpYWJsZSwgYnV0IHdlIHdpbGwgb2Zmc2V0IHRoZSBtb2RlbCBieSB0aGUgVG90YWwgdmFyaWFibGUgdG8gbWFrZSBvdXIgUG9pc3NvbiBtb2RlbCBmb3IgdGhlIHJhdGVzIG9mIGN5Y2xpc3RzIG9uIHRoZSBXaWxsaWFtc2J1cmcgQnJpZGdlIG91dCBvZiB0aGUgdG90YWwgbnVtYmVyIG9mIGN5Y2xpc3RzIG9uIGFsbCBmb3VyIG9mIHRoZSBicmlkZ2VzLiANCg0KDQpgYGB7cn0NCiMgUG9pc3NvbiBNb2RlbCBvZiBSYXRlcw0KbW9kZWwucmF0ZXMgPC0gZ2xtKFdpbGxpYW1zYnVyZ0JyaWRnZSB+IERheSArIEhpZ2hUZW1wICsgTG93VGVtcCArIFByZWNpcGl0YXRpb24sIG9mZnNldCA9IGxvZyhUb3RhbCksIA0KICAgICAgICAgICAgICAgICAgIGZhbWlseSA9IHBvaXNzb24obGluayA9ICJsb2ciKSwgZGF0YSA9IGN5Y2xpbmcpDQprYWJsZShzdW1tYXJ5KG1vZGVsLnJhdGVzKSRjb2VmLCBjYXB0aW9uID0gIlBvaXNzb24gUmVncmVzc2lvbiBNb2RlbCBvZiB0aGUgUmF0ZXMgb2YgQ3ljbGlzdHMgXG4gb24gdGhlIFdpbGxpYW1zYnVyZyBCcmlkZ2Ugb3V0IG9mIGFsbCBGb3VyIEJyaWRnZXMiKQ0KYGBgDQoNClRoZSByZWdyZXNzaW9uIGVxdWF0aW9uIGZvciB0aGUgUG9pc3NvbiByZWdyZXNzaW9uIG1vZGVsIG9uIHRoZSByYXRlcyBpcyBnaXZlbiBhczoNCg0KbG9nKM68L3QpID0gLTEuMDY4MiArIDAuMDAwNCAqIERheU1vbmRheSArIDAuMDM3NSAqIERheVNhdHVyZGF5ICsgMC4wMDUxICogRGF5U3VuZGF5ICsgMC4wMjA2ICogRGF5VGh1cnNkYXkgKyAwLjAxMzggKiBEYXlUdWVzZGF5ICsgMC4wMjMzICogRGF5V2VkbmVzZGF5IC0gMC4wMDEyICogSGlnaFRlbXAgKyAwLjAwMDQgKiBMb3dUZW1wICsgMC4wNTA1ICogUHJlY2lwaXRhdGlvbg0KDQpBbGwgb2YgdGhlIHByZWRpY3RvciB2YXJpYWJsZXMgaW4gdGhpcyBQb2lzc29uIG1vZGVsLCBEYXRlLCBIaWdoVGVtcCwgTG93VGVtcCwgYW5kIFByZWNpcGl0YXRpb24sIGFsbCBoYXZlIHAtdmFsdWVzIG9mIHAgPCAuMDAxLiBUaGlzIGluZGljYXRlcyB0aGF0IGFsbCBvZiB0aGUgcHJlZGljdG9yIGluIG91ciBtb2RlbCB2YXJpYWJsZXMgYXJlIHN0YXRpc3RpY2FsbHkgc2lnbmlmaWNhbnQgaW4gcHJlZGljdGluZyB0aGUgdG90YWwgZXhwZWN0ZWQgY291bnRzIG9mIGN5Y2xpc3RzIG9uIHRoZSBXaWxsaWFtc2J1cmcgQnJpZGdlIG9uIGEgZ2l2ZW4gZGF5LCBvZmZzZXQgYnkgdGhlIHRvdGFsIG51bWJlciBvZiBjeWNsaXN0cyBvbiBhbGwgZm91ciBvZiB0aGUgbWFqb3IgTmV3IFlvcmsgYnJpZGdlcy4gDQoNClRoaXMgbW9kZWwgc2hvd3Mgc3RhdGlzdGljYWwgc2lnbmlmaWNhbmNlIGluIHByZWRpY3RpbmcgdGhlIGV4cGVjdGVkIGNvdW50cyBvZiB0aGUgY3ljbGlzdHMgb24gdGhlIFdpbGxpYW1zYnVyZyBCcmlkZ2UgYnkgdXNpbmcgdGhlIHJhdGVzIGZvciB0aGUgcHJlZGljdGlvbi4gVGhpcyBpbmRpY2F0ZXMgdGhhdCB0aGlzIG1vZGVsIGZvciB0aGUgcmF0ZXMgc2hvd3Mgc3RhdGlzdGljYWwgc2lnbmlmaWNhbmNlIGluIGl0cyBwcmVkaWN0aXZlIHBvd2VyIGFuZCBwcm92aWRlcyBnb29kIHV0aWxpdHkgZm9yIHByZWRpY3Rpb24gYW5kIGVzdGltYXRpb24uIA0KDQpMaWtlIHdhcyBzdGF0ZWQgZm9yIHRoZSBQb2lzc29uIHJlZ3Jlc3Npb24gbW9kZWwgb24gZnJlcXVlbmN5IGNvdW50cywgRnJpZGF5IHdhcyBjaG9zZW4gYnkgUiB0byBiZSB0aGUgYmFzZSBsaW5lIGxldmVsIG9mIHRoZSBEYXkgdmFyaWFibGUsIGFuZCBzbyB3ZSB3aWxsIGNvbXBhcmUgdGhlIHJlZ3Jlc3Npb24gY29lZmZpY2llbnRzIGFnYWluc3QgdGhpcyBiYXNlIGxpbmUgbGV2ZWwuDQoNCg0KDQojIyMgUmVncmVzc2lvbiBDb2VmZmljaWVudHMgSW50ZXJwcmV0YXRpb24NCg0KV2Ugd2lsbCBhbmFseXNpcyB0aGUgcmVncmVzc2lvbiBjb2VmZmljaWVudHMgZm9yIHRoZSB2YXJpYWJsZXMgaW4gdGhpcyBQb2lzc29uIHJlZ3Jlc3Npb24gbW9kZWwgb24gcmF0ZXMuDQoNCiogVGhlIHZhbHVlIG9mIHRoZSB5LWludGVyY2VwdCBpcyBnaXZlbiBhcyAtMS4wNjgyLiBUaGlzIHJlcHJlc2VudHMgdGhlIGJhc2VsaW5lIG9mIHRoZSBtZWFuIG9mIHRoZSBsb2cgY291bnRzIG11bHRpcGxpZWQgYnkgdCwgd2hlbiBhbGwgcHJlZGljdG9yIHZhcmlhYmxlcyBhcmUgZXF1YWwgdG8gMC4gSG93ZXZlciwgdGhlIHktaW50ZXJjZXB0IGRvZXMgbm90IGhhdmUgYSBwcmFjdGljYWwgaW50ZXJwcmV0YXRpb24gb3IgbWVhbmluZyBpbiB0aGlzIHNjZW5hcmlvIHNvIHdlIGFyZSBub3QgaW50ZXJlc3RlZCBpbiBpdHMgbWVhbmluZyBmb3IgdGhlIFBvaXNzb24gcmVncmVzc2lvbiBtb2RlbC4NCg0KKiBEYXlNb25kYXkgKHAgPSAwLjk2ODkpOiBUaGUgcmVncmVzc2lvbiBjb2VmZmljaWVudCBmb3IgdGhlIHZhcmlhYmxlIERheU1vbmRheSB3YXMgZm91bmQgdG8gYmUgMC4wMDA0LiBUaGlzIG1lYW5zIHRoYXQgdGhlIG1lYW4gbG9nIGNvdW50IG9mIGN5Y2xpc3RzIG9uIHRoZSBXaWxsaWFtc2J1cmdzIEJyaWRnZSB3YXMgMC4wMDA0IGdyZWF0ZXIgb24gTW9uZGF5IHRoYW4gb24gRnJpZGF5LiBXZSBjYW4gYWxzbyBzYXkgdGhpcyBtZWFucyB0aGF0IHRoZSBjb3VudCBvZiBjeWNsaXN0cyBpcyAxLjAwNTYgdGltZXMgZ3JlYXRlciBvbiBNb25kYXkgdGhhbiBvbiBGcmlkYXksIGhvbGRpbmcgYWxsIG90aGVyIHZhcmlhYmxlcyBjb25zdGFudC4gDQoNCiogRGF5U2F0dXJkYXkgKHAgPCAuMDAxKTogVGhlIHJlZ3Jlc3Npb24gY29lZmZpY2llbnQgZm9yIHRoZSB2YXJpYWJsZSBEYXlTYXR1cmRheSB3YXMgZm91bmQgdG8gYmUgMC4wMzc1LiBUaGlzIG1lYW5zIHRoYXQgdGhlIG1lYW4gbG9nIGNvdW50IG9mIGN5Y2xpc3RzIG9uIHRoZSBXaWxsaWFtc2J1cmdzIEJyaWRnZSB3YXMgMC4wMzc1IGdyZWF0ZXIgb24gU2F0dXJkYXkgdGhhbiBvbiBGcmlkYXkuIFdlIGNhbiBhbHNvIHNheSB0aGlzIG1lYW5zIHRoYXQgdGhlIGNvdW50IG9mIGN5Y2xpc3RzIGlzIDEuMDM4MiB0aW1lcyBncmVhdGVyIG9uIFNhdHVyZGF5IHRoYW4gb24gRnJpZGF5LCBob2xkaW5nIGFsbCBvdGhlciB2YXJpYWJsZXMgY29uc3RhbnQuIA0KDQoqIERheVN1bmRheSAocCA9IDAuNTk3Nik6IFRoZSByZWdyZXNzaW9uIGNvZWZmaWNpZW50IGZvciB0aGUgdmFyaWFibGUgRGF5U3VuZGF5IHdhcyBmb3VuZCB0byBiZSAwLjAwNTEuIFRoaXMgbWVhbnMgdGhhdCB0aGUgbWVhbiBsb2cgY291bnQgb2YgY3ljbGlzdHMgb24gdGhlIFdpbGxpYW1zYnVyZ3MgQnJpZGdlIHdhcyAwLjAwNTEgZ3JlYXRlciBvbiBTdW5kYXkgdGhhbiBvbiBGcmlkYXkuIFdlIGNhbiBhbHNvIHNheSB0aGlzIG1lYW5zIHRoYXQgdGhlIGNvdW50IG9mIGN5Y2xpc3RzIG9uIFN1bmRheSBpcyAxLjAwNSB0aW1lcyBncmVhdGVyIG9uIFN1bmRheSB0aGFuIG9uIEZyaWRheSwgaG9sZGluZyBhbGwgb3RoZXIgdmFyaWFibGVzIGNvbnN0YW50LiANCg0KKiBEYXlUaHVyc2RheSAocCA9IDAuMDQ1Nik6IFRoZSByZWdyZXNzaW9uIGNvZWZmaWNpZW50IGZvciB0aGUgdmFyaWFibGUgRGF5VGh1cnNkYXkgd2FzIGZvdW5kIHRvIGJlIDAuMDIwNi4gVGhpcyBtZWFucyB0aGF0IHRoZSBtZWFuIGxvZyBjb3VudCBvZiBjeWNsaXN0cyBvbiB0aGUgV2lsbGlhbXNidXJncyBCcmlkZ2Ugd2FzIDAuMDIwNiBncmVhdGVyIG9uIFRodXJzZGF5IHRoYW4gb24gRnJpZGF5LiBXZSBjYW4gYWxzbyBzYXkgdGhpcyBtZWFucyB0aGF0IHRoZSBjb3VudCBvZiBjeWNsaXN0cyBpcyAxLjAyMDggdGltZXMgZ3JlYXRlciBvbiBUaHVyc2RheSB0aGFuIG9uIEZyaWRheSwgaG9sZGluZyBhbGwgb3RoZXIgdmFyaWFibGVzIGNvbnN0YW50LiANCg0KKiBEYXlUdWVzZGF5IChwID0gMC4xODM5KTogVGhlIHJlZ3Jlc3Npb24gY29lZmZpY2llbnQgZm9yIHRoZSB2YXJpYWJsZSBEYXlUdWVzZGF5IHdhcyBmb3VuZCB0byBiZSAwLjAxMzguIFRoaXMgbWVhbnMgdGhhdCB0aGUgbWVhbiBsb2cgY291bnQgb2YgY3ljbGlzdHMgb24gdGhlIFdpbGxpYW1zYnVyZ3MgQnJpZGdlIHdhcyAwLjAxMzggZ3JlYXRlciBvbiBUdWVzZGF5IHRoYW4gb24gRnJpZGF5LiBXZSBjYW4gYWxzbyBzYXkgdGhpcyBtZWFucyB0aGF0IHRoZSBjb3VudCBvZiBjeWNsaXN0cyBpcyAxLjAxMzkgdGltZXMgZ3JlYXRlciBvbiBUdWVzZGF5IHRoYW4gb24gRnJpZGF5LCBob2xkaW5nIGFsbCBvdGhlciB2YXJpYWJsZXMgY29uc3RhbnQuIA0KDQoqIERheVdlZG5lc2RheSAocCAwLjAyMDYpOiBUaGUgcmVncmVzc2lvbiBjb2VmZmljaWVudCBmb3IgdGhlIHZhcmlhYmxlIERheVRodXJzZGF5IHdhcyBmb3VuZCB0byBiZSAwLjAyMzMuIFRoaXMgbWVhbnMgdGhhdCB0aGUgbWVhbiBsb2cgY291bnQgb2YgY3ljbGlzdHMgb24gdGhlIFdpbGxpYW1zYnVyZ3MgQnJpZGdlIHdhcyAwLjAyMzMgZ3JlYXRlciBvbiBXZWRuZXNkYXkgdGhhbiBvbiBGcmlkYXkuIFdlIGNhbiBhbHNvIHNheSB0aGlzIG1lYW5zIHRoYXQgdGhlIGNvdW50IG9mIGN5Y2xpc3RzIGlzIDEuMDIzNiB0aW1lcyBncmVhdGVyIG9uIFdlZG5lc2RheSB0aGFuIG9uIEZyaWRheSwgaG9sZGluZyBhbGwgb3RoZXIgdmFyaWFibGVzIGNvbnN0YW50LiANCg0KKiBIaWdoVGVtcCAocCA9IDAuMDQyNik6IFRoZSByZWdyZXNzaW9uIGNvZWZmaWNpZW50IG9mIHRoZSBIaWdoVGVtcCB2YXJpYWJsZSBpbiB0aGlzIG1vZGVsIGlzIC0wLjAwMTIuIFRoaXMgbWVhbnMgdGhhdCB0aGUgbWVhbiBvZiB0aGUgbG9nIGNvdW50cyBtdWx0aXBsaWVkIGJ5IHQgZGVjcmVhc2VzIGJ5IDAuMDAxMiB1bml0cyBmb3IgZXZlcnkgMSBkZWdyZWUgRmFocmVuaGVpdCBpbmNyZWFzZSBpbiB0aGUgaGlnaCB0ZW1wZXJhdHVyZSBmb3IgdGhlIGdpdmVuIG9ic2VydmF0aW9uLCBob2xkaW5nIGFsbCBvdGhlciB2YXJpYWJsZXMgY29uc3RhbnQuIA0KDQoqIExvd1RlbXAgKHAgPSAwLjY1NTUpOiBUaGUgcmVncmVzc2lvbiBjb2VmZmljaWVudCBvZiB0aGUgTG93VGVtcCB2YXJpYWJsZSBpbiB0aGlzIG1vZGVsIGlzIDAuMDAwNC4gVGhpcyBtZWFucyB0aGF0IHRoZSBsb2cgY291bnRzIG11bHRpcGxlZCBieSB0IGluY3JlYXNlcyBieSAwLjAwMDQgdW5pdHMgZm9yIGV2ZXJ5IDEgZGVncmVlIEZhaHJlbmhlaXQgaW5jcmVhc2UgaW4gdGhlIGxvdyB0ZW1wZXJhdHVyZSBmb3IgdGhlIGdpdmVuIG9ic2VydmF0aW9uLCBob2xkaW5nIGFsbCBvdGhlciB2YXJpYWJsZXMgY29uc3RhbnQuIA0KDQoqIFByZWNpcGl0YXRpb24gKHAgPSAwLjAwMTcpOiBUaGUgcmVncmVzc2lvbiBjb2VmZmljaWVudCBvZiB0aGUgUHJlY2lwaXRhdGlvbiB2YXJpYWJsZSBpbiB0aGlzIG1vZGVsIGlzIDAuMDUwNS4gVGhpcyBtZWFucyB0aGF0IHRoZSBsb2cgY291bnRzIG11bHRpcGxpZWQgYnkgdCBpbmNyZWFzZXMgYnkgMC4wNTA1IHVuaXRzIGZvciBldmVyeSAxIGluY2ggaW5jcmVhc2UgaW4gdGhlIGFtb3VudCBvZiBwcmVjaXBpdGF0aW9uIGZvciB0aGUgZ2l2ZW4gb2JzZXJ2YXRpb24sIGhvbGRpbmcgYWxsIG90aGVyIHZhcmlhYmxlcyBjb25zdGFudC4NCg0KDQojIyBTdW1tYXJ5IGFuZCBDb21wYXJpc29ucyBvZiB0aGUgVHdvIE1vZGVscw0KDQpCb3RoIG9mIHRoZSB0d28gUG9pc3NvbiByZWdyZXNzaW9uIG1vZGVsIHdlIGNyZWF0ZWQsIHRoZSBtb2RlbCBmb3IgdGhlIGZyZXF1ZW5jeSBjb3VudHMgYW5kIHRoZSBtb2RlbCBmb3IgdGhlIHJhdGVzLCBwcm92aWRlZCBzdGF0aXN0aWNhbCBzaWduaWZpY2FuY2UgZm9yIHByZWRpY3Rpb24gYW5kIHNob3dlZCBnb29kIHV0aWxpdHkgb3ZlcmFsbC4gSW4gYm90aCBvZiB0aGVzZSBtb2RlbHMsIHdlIGxvb2tlZCBpbnRvIHRoZSB0b3RhbCBudW1iZXIgb2YgY3ljbGlzdHMgb24gdGhlIFdpbGxpYW1zYnVyZyBCcmlkZ2UgaW4gTmV3IFlvcmsgZm9yIGEgc3BlY2lmaWMgb2JzZXJ2YXRpb24sIGFuZCB3ZSBsb29rZWQgaW50byB0aGUgdmFyaW91cyBmYWN0b3JzIG9mIHRoYXQgc3BlY2lmaWMgZGF0ZS4gV2UgbG9va2VkIGF0IHRoZSBkYXRlIG9mIHRoZSBvYnNlcnZhdGlvbiBhbG9uZyB3aXRoIHNvbWUgZmFjdG9ycyB3aGljaCBtYXkgYWZmZWN0IHRoZSB0b3RhbCBudW1iZXIgb2YgY3ljbGlzdHMgb3V0IG9uIHRoYXQgc3BlY2lmaWMgZGF0ZS4gVGhlc2UgZmFjdG9ycyBpbmNsdWRlZCB0aGUgaGlnaCB0ZW1wZXJhdHVyZSwgdGhlIGxvdyB0ZW1wZXJhdHVyZSwgYW5kIHRoZSBhbW91bnQgb2YgcHJlY2lwaXRhdGlvbiBmb3IgdGhhdCBnaXZlbiBkYXRlLiBJdCB0dXJuZWQgb3V0IHRoYXQgYWxsIG9mIHRoZXNlIGZhY3RvcnMgd2VyZSBpbmRlZWQgc3RhdGlzdGljYWxseSBzaWduaWZpY2FudCBmb3IgYm90aCBvZiB0aGUgdHdvIFBvaXNzb24gcmVncmVzc2lvbiBtb2RlbHMsIGluZGljYXRpbmcgdGhhdCB0aGVzZSB3ZWF0aGVyIHJlbGF0ZWQgY29uZGl0aW9ucyBoYXZlIGEgc3RhdGlzdGljYWxseSBzaWduaWZpY2FudCBpbXBhY3Qgb24gYm90aCB0aGUgY291bnRzIGFuZCB0aGUgcmF0ZXMgb2YgY3ljbGlzdHMgb3V0IG9uIHRoZSBXaWxsaWFtc2J1cmcgQnJpZGdlIGZvciBhIGdpdmVuIG9ic2VydmF0aW9uLiBUaGlzIGNhbiBiZSBhdHRyaWJ1dGVkIHRvIGNlcnRhaW4gd2VhdGhlciBjb25kaXRpb25zIG1ha2luZyBpdCBtb3JlIG9yIGxlc3MgaWRlYWwgZm9yIGluZGl2aWR1YWxzIHRvIGJlIGN5Y2xpbmcgb3V0ZG9vcnMuIEZvciBpbnN0YW5jZSwgYSBkYXkgd2l0aCBpbmNyZWRpYmx5IGhpZ2ggdGVtcGVyYXR1cmVzLCBpbmNyZWRpYmx5IGNvbGQgdGVtcGVyYXR1cmVzLCBvciBzZXZlcmUgc3Rvcm1zIHdpdGggaGVhdnkgcHJlY2lwaXRhdGlvbiB3b3VsZCBiZSBsZXNzIGlkZWFsIGFuZCBsaWtlbHkgbGVhZCB0byBsZXNzIGN5Y2xpc3RzIGJlaW5nIG91dCBvbiB0aGF0IGdpdmVuIGRheSBhcyBvcHBvc2VkIHRvIGEgZGF5IHdpdGggcGxlYXNhbnQgd2VhdGhlci4gDQoNCk92ZXJhbGwsIGJvdGggb2YgdGhlIFBvaXNzb24gcmVncmVzc2lvbiBtb2RlbHMgc2hvd2VkIHN0YXRpc3RpY2FsIHNpZ25pZmljYW5jZSBhbmQgZ29vZCB1dGlsaXR5IGluIHRoZWlyIHByZWRpY3Rpb24uIEhvd2V2ZXIsIGFzIHdhcyBwcmV2aW91c2x5IHN0YXRlZCwgdGhlcmUgd2VyZSBzb21lIHZpb2xhdGlvbnMgb2YgdGhpcyBjb25kaXRpb25zIGZvciBhIFBvaXNzb24gcmVncmVzc2lvbiBtb2RlbCB3aXRoaW4gb3VyIGRhdGEgc2V0LiBGaXJzdCwgaXQgd2FzIGZvdW5kIHRoYXQgdGhlIG1lYW4gb2YgdGhlIHJlc3BvbnNlIHZhcmlhYmxlLCBXaWxsaWFtc2J1cmdCcmlkZ2UsIHdhcyBub3QgZXF1YWwgdG8gaXRzIHZhcmlhbmNlLiBUaGlzIHN1Z2dlc3RzIHRoYXQgdGhpcyByZXNwb25zZSB2YXJpYWJsZSBpbiBmYWN0IGlzIG5vdCBQb2lzc29uIGRpc3RyaWJ1dGVkLCBkdWUgdG8gaXQgZmFpbGluZyB0byBtZWV0IHRoZSBjb25kaXRpb24gZm9yIGEgUG9pc3NvbiByYW5kb20gdmFyaWFibGUgb2YgaXRzIG1lYW4gYmVpbmcgZXF1YWwgdG8gaXRzIHZhcmlhbmNlLiBBZGRpdGlvbmFsbHksIGFsbCBmb3VyIHByZWRpY3RvciB2YXJpYWJsZXMgd2VyZSBjaGVja2VkLCBhbmQgaXQgd2FzIGZvdW5kIHRoYXQgdGhlIHJlc3BvbnNlIHZhcmlhYmxlIGluIGZhY3Qgd2FzIG5vdCBhIGxpbmVhciBmdW5jdGlvbiBvZiBhbnkgb2YgdGhlc2UgcHJlZGljdG9yIHZhcmlhYmxlcy4gVGhpcyBpbmRpY2F0ZXMgYW5vdGhlciBtYWpvciB2aW9sYXRpb24gb2YgdGhpcyBkYXRhIHNldC4gVGhlc2UgdmlvbGF0aW9ucyBzdWdnZXN0IHRoYXQgcGVyaGFwcyBhIFBvaXNzb24gbW9kZWwgd2FzIG5vdCB0aGUgYmVzdCBtb2RlbCBjaG9pY2UgZm9yIHRoaXMgZGF0YSBzZXQsIGFuZCB0aGF0IGl0IGlzIGltcG9ydGFudCB0byBiZSBtaW5kZnVsIG9mIHRoZXNlIHZpb2xhdGlvbnMgd2hlbiB1c2luZyBlaXRoZXIgb2YgdGhlIFBvaXNzb24gcmVncmVzc2lvbiBtb2RlbHMgd2UgY3JlYXRlZCBmb3IgcHJlZGljdGlvbi4gDQoNCg0KDQoNCg0KIyBQb2lzc29uIFJlZ3Jlc3Npb24gTW9kZWwgb24gRnJlcXVlbmN5IENvdW50cw0KDQoNCldlIHdpbGwgYmVnaW4gd2l0aCBjcmVhdGluZyBhIFBvaXNzb24gcmVncmVzc2lvbiBtb2RlbCBvZiB0aGUgZnJlcXVlbmN5IGNvdW50cyB1c2luZyB0aGUgbmV3IHZhcmlhYmxlcyB3ZSBjcmVhdGVkIGZvciB0aGlzIHByb2plY3QuIFNwZWNpZmljYWxseSwgdGhpcyBtb2RlbCB3aWxsIGJlIG9uIHRoZSBmcmVxdWVuY3kgY291bnRzIG9mIGluZGl2aWR1YWxzIG9uIHRoZSBXaWxsaWFtc2J1cmcgQnJpZGdlIGZvciBhIGdpdmVuIG9ic2VydmF0aW9ucy4gT3VyIGdvYWwgaXMgdG8gY3JlYXRlIGEgUG9pc3NvbiByZWdyZXNzaW9uIG1vZGVsIHdoaWNoIGNhbiBzdGF0aXN0aWNhbGx5IHNpZ25pZmljYW50bHkgcHJlZGljdCB0aGUgY291bnQgb2YgdGhlIG51bWJlciBvZiBpbmRpdmlkdWFscyBvbiB0aGUgV2lsbGlhbXNidXJnIEJyaWRnZSBmb3IgYSBnaXZlbiBvYnNlcnZhdGlvbiwgYmFzZWQgdXBvbiB0aGUgdmFyaW91cyBmYWN0b3JzIGluIHRoaXMgZGF0YSBzZXQuIA0KDQpXZSB3aWxsIGNyZWF0ZSBvdXIgUG9pc3NvbiByZWdyZXNzaW9uIG1vZGVsIG9uIHRoZSBmcmVxdWVuY3kgY291bnRzLg0KDQpgYGB7cn0NCiMgUG9pc3NvbiBSZWdyZXNzaW9uIE1vZGVsIG9mIENvdW50cw0KbW9kZWwuY291bnRzIDwtIGdsbShXaWxsaWFtc2J1cmdCcmlkZ2UgfiBEYXkgKyBBdmdUZW1wICsgTmV3UHJlY2lwLCANCiAgICAgICAgICAgICAgICAgICAgZmFtaWx5ID0gcG9pc3NvbihsaW5rID0gImxvZyIpLCBkYXRhID0gY3ljbGluZykNCnBvaXMuY291bnQuY29lZiA9IHN1bW1hcnkobW9kZWwuY291bnRzKSRjb2VmDQprYWJsZShwb2lzLmNvdW50LmNvZWYsIGNhcHRpb24gPSAiUG9pc3NvbiBSZWdyZXNzaW9uIE1vZGVsIGZvciB0aGUgQ291bnRzIG9mIEN5Y2xpc3RzIFxuIG9uIHRoZSBXaWxsaWFtc2J1cmcgQnJpZGdlIikNCmBgYA0KDQpUaGUgcmVncmVzc2lvbiBlcXVhdGlvbiBmb3IgdGhlIFBvaXNzb24gcmVncmVzc2lvbiBtb2RlbCBvbiB0aGUgZnJlcXVlbmN5IGNvdW50cyBpcyBnaXZlbiBhczoNCg0KbG9nKM68KSA9IDcuMjAyNSArIDAuMDMwMiAqIERheU1vbmRheSAtIDAuMTk0NSAqIERheVNhdHVyZGF5IC0gMC4yNDUxICogRGF5U3VuZGF5IC0gMC4wMjk5ICogRGF5VGh1cnNkYXkgLSAwLjA2MDQgKiBEYXlUdWVzZGF5ICsgMC4xNzE0ICogRGF5V2VkbmVzZGF5ICsgMC4wMjUzICogQXZnVGVtcCAtIDAuMzQwOCAqIE5ld1ByZWNpcA0KDQpBbGwgb2YgdGhlIHByZWRpY3RvciB2YXJpYWJsZXMsIERheSwgQXZnVGVtcCwgYW5kIE5ld1ByZWNpcCwgYWxsIGhhdmUgcC12YWx1ZXMgb2YgcCA8IC4wMDEuIFRoaXMgaW5kaWNhdGVzIHRoYXQgYWxsIG9mIHRoZSBwcmVkaWN0b3IgaW4gb3VyIG1vZGVsIHZhcmlhYmxlcyBhcmUgc3RhdGlzdGljYWxseSBzaWduaWZpY2FudCBpbiBwcmVkaWN0aW5nIHRoZSB0b3RhbCBleHBlY3RlZCBjb3VudHMgb2YgY3ljbGlzdHMgb24gdGhlIFdpbGxpYW1zYnVyZyBCcmlkZ2Ugb24gYSBnaXZlbiBkYXkuIA0KDQpGb3Igb3VyIGNhdGVnb3JpY2FsIHByZWRpY3RvciB2YXJpYWJsZSBvZiBEYXksIEZyaWRheSB3YXMgY2hvc2VuIGFzIHRoZSBiYXNlIGxpbmUgbGV2ZWwsIHdoaWNoIGNhbiBiZSBzZWVuIGJ5IGhvdyB0aGVyZSBpcyBub3QgYSAiRGF5RnJpZGF5IiB2YXJpYWJsZSBpbiB0aGUgcmVncmVzc2lvbiBlcXVhdGlvbiBvdXRwdXQuIFRoaXMgaXMgYmVjYXVzZSBvZiB0aGUgc2V2ZW4gZGF5cywgRnJpZGF5IGlzIHRoZSBvbmUgd2hpY2ggY29tZXMgZmlyc3QgYWxwaGFiZXRpY2FsbHkgYW5kIFIgY2hvb3NlcyB0aGUgbGV2ZWwgd2hpY2ggY29tZXMgZmlyc3QgYWxwaGFiZXRpY2FsbHkgYXMgdGhlIGJhc2UgbGluZSBsZXZlbC4gVGhlcmVmb3JlLCBmb3Igb3VyIHJlZ3Jlc3Npb24gY29lZmZpY2llbnQgaW50ZXJwcmV0YXRpb25zIGZvciB0aGUgZGlmZmVyZW50IGxldmVscyBvZiB0aGUgRGF5IHZhcmlhYmxlLCB0aGVzZSB2YWx1ZXMgd2lsbCBiZSBjb21wYXJlZCBhZ2FpbnN0IHRoZSBiYXNlIGxpbmUgbGV2ZWwgb2YgRnJpZGF5Lg0KDQoNCiMjIFJlZ3Jlc3Npb24gQ29lZmZpY2llbnRzIEludGVycHJldGF0aW9uDQoNCldlIHdpbGwgYW5hbHlzaXMgdGhlIHJlZ3Jlc3Npb24gY29lZmZpY2llbnRzIGZvciB0aGUgdmFyaWFibGVzIGluIHRoaXMgUG9pc3NvbiByZWdyZXNzaW9uIG1vZGVsIG9uIGZyZXF1ZW5jeSBjb3VudHMuDQoNCiogVGhlIHZhbHVlIG9mIHRoZSB5LWludGVyY2VwdCBpcyBnaXZlbiBhcyA3LjIwMjUgVGhpcyByZXByZXNudHMgdGhlIGJhc2VsaW5lIG9mIHRoZSBtZWFuIG9mIGxvZyjOvCkgd2hlbiBhbGwgcHJlZGljdG9yIHZhcmlhYmxlcyBhcmUgZXF1YWwgdG8gMC4gSG93ZXZlciwgdGhlIHktaW50ZXJjZXB0IGRvZXMgbm90IGhhdmUgYSBwcmFjdGljYWwgaW50ZXJwcmV0YXRpb24gb3IgbWVhbmluZyBpbiB0aGlzIHNjZW5hcmlvIHNvIHdlIGFyZSBub3QgaW50ZXJlc3RlZCBpbiBpdHMgbWVhbmluZyBmb3IgdGhlIFBvaXNzb24gcmVncmVzc2lvbiBtb2RlbC4NCg0KKiBEYXlNb25kYXkgKHAgPCAuMDAxKTogVGhlIHJlZ3Jlc3Npb24gY29lZmZpY2llbnQgb2YgdGhlIERheU1vbmRheSB2YXJpYWJsZSBpbiB0aGlzIG1vZGVsIGlzIDAuMDMwMi4gVGhpcyBtZWFucyB0aGF0IHRoZSBtZWFuIGxvZyBjb3VudCBvZiBjeWNsaXN0cyBvbiB0aGUgV2lsbGlhbXNidXJncyBCcmlkZ2Ugd2FzIDAuMDMwMiBncmVhdGVyIG9uIE1vbmRheSB0aGFuIG9uIEZyaWRheS4gV2UgY2FuIGFsc28gc2F5IHRoaXMgbWVhbnMgdGhhdCB0aGUgY291bnQgb2YgY3ljbGlzdHMgaXMgMS4wMzA3IHRpbWVzIGdyZWF0ZXIgb24gTW9uZGF5IHRoYW4gb24gRnJpZGF5LCBob2xkaW5nIGFsbCBvdGhlciB2YXJpYWJsZXMgY29uc3RhbnQuIA0KDQoqIERheVNhdHVyZGF5IChwIDwgLjAwMSk6IFRoZSByZWdyZXNzaW9uIGNvZWZmaWNpZW50IG9mIHRoZSBEYXlTYXR1cmRheSB2YXJpYWJsZSBpbiB0aGlzIG1vZGVsIGlzIC0wLjE5NDUuIFRoaXMgbWVhbnMgdGhhdCB0aGUgbWVhbiBsb2cgY291bnQgb2YgY3ljbGlzdHMgb24gdGhlIFdpbGxpYW1zYnVyZ3MgQnJpZGdlIHdhcyAwLjE5NDUgbGVzcyBvbiBNb25kYXkgdGhhbiBvbiBGcmlkYXkuIFdlIGNhbiBhbHNvIHNheSB0aGlzIG1lYW5zIHRoYXQgdGhlIGNvdW50IG9mIGN5Y2xpc3RzIGlzIDAuODIzMiB0aW1lcyBncmVhdGVyIG9uIE1vbmRheSB0aGFuIG9uIEZyaWRheSwgaG9sZGluZyBhbGwgb3RoZXIgdmFyaWFibGVzIGNvbnN0YW50LiANCg0KKiBEYXlTdW5kYXkgKHAgPCAuMDAxKTogVGhlIHJlZ3Jlc3Npb24gY29lZmZpY2llbnQgb2YgdGhlIERheVN1bmRheSB2YXJpYWJsZSBpbiB0aGlzIG1vZGVsIGlzIC0wLjI0NTEuIFRoaXMgbWVhbnMgdGhhdCB0aGUgbWVhbiBsb2cgY291bnQgb2YgY3ljbGlzdHMgb24gdGhlIFdpbGxpYW1zYnVyZ3MgQnJpZGdlIHdhcyAwLjI0NTEgbGVzcyBvbiBTdW5kYXkgdGhhbiBvbiBGcmlkYXkuIFdlIGNhbiBhbHNvIHNheSB0aGlzIG1lYW5zIHRoYXQgdGhlIGNvdW50IG9mIGN5Y2xpc3RzIGlzIDAuNzgyNiB0aW1lcyBncmVhdGVyIG9uIFN1bmRheSB0aGFuIG9uIEZyaWRheSwgaG9sZGluZyBhbGwgb3RoZXIgdmFyaWFibGVzIGNvbnN0YW50LiANCg0KKiBEYXlUaHVyc2RheSAocCA8IC4wMDEpOiBUaGUgcmVncmVzc2lvbiBjb2VmZmljaWVudCBvZiB0aGUgRGF5VGh1cnNkYXkgdmFyaWFibGUgaW4gdGhpcyBtb2RlbCBpcyAtMC4wMjk5LiBUaGlzIG1lYW5zIHRoYXQgdGhlIG1lYW4gbG9nIGNvdW50IG9mIGN5Y2xpc3RzIG9uIHRoZSBXaWxsaWFtc2J1cmdzIEJyaWRnZSB3YXMgMC4wMjk5IGxlc3Mgb24gVGh1cnNkYXkgdGhhbiBvbiBGcmlkYXkuIFdlIGNhbiBhbHNvIHNheSB0aGlzIG1lYW5zIHRoYXQgdGhlIGNvdW50IG9mIGN5Y2xpc3RzIGlzIDAuOTcwNSB0aW1lcyBncmVhdGVyIG9uIFRodXJzZGF5IHRoYW4gb24gRnJpZGF5LCBob2xkaW5nIGFsbCBvdGhlciB2YXJpYWJsZXMgY29uc3RhbnQuIA0KDQoqIERheVR1ZXNkYXkgKHAgPCAuMDAxKTogVGhlIHJlZ3Jlc3Npb24gY29lZmZpY2llbnQgb2YgdGhlIERheVR1ZXNkYXkgdmFyaWFibGUgaW4gdGhpcyBtb2RlbCBpcyAtMC4wNjA0LiBUaGlzIG1lYW5zIHRoYXQgdGhlIG1lYW4gbG9nIGNvdW50IG9mIGN5Y2xpc3RzIG9uIHRoZSBXaWxsaWFtc2J1cmdzIEJyaWRnZSB3YXMgMC4wNjA0IGxlc3Mgb24gVHVlc2RheSB0aGFuIG9uIEZyaWRheS4gV2UgY2FuIGFsc28gc2F5IHRoaXMgbWVhbnMgdGhhdCB0aGUgY291bnQgb2YgY3ljbGlzdHMgaXMgMC45NDE0IHRpbWVzIGdyZWF0ZXIgb24gVHVlc2RheSB0aGFuIG9uIEZyaWRheSwgaG9sZGluZyBhbGwgb3RoZXIgdmFyaWFibGVzIGNvbnN0YW50LiANCg0KKiBEYXlXZWRuZXNkYXkgKHAgPCAuMDAxKTogVGhlIHJlZ3Jlc3Npb24gY29lZmZpY2llbnQgb2YgdGhlIERheVdlZG5lc2RheSB2YXJpYWJsZSBpbiB0aGlzIG1vZGVsIGlzIDAuMTcxNC4gVGhpcyBtZWFucyB0aGF0IHRoZSBtZWFuIGxvZyBjb3VudCBvZiBjeWNsaXN0cyBvbiB0aGUgV2lsbGlhbXNidXJncyBCcmlkZ2Ugd2FzIDAuMTcxNCBncmVhdGVyIG9uIE1vbmRheSB0aGFuIG9uIEZyaWRheS4gV2UgY2FuIGFsc28gc2F5IHRoaXMgbWVhbnMgdGhhdCB0aGUgY291bnQgb2YgY3ljbGlzdHMgaXMgMS4xODcwIHRpbWVzIGdyZWF0ZXIgb24gTW9uZGF5IHRoYW4gb24gRnJpZGF5LCBob2xkaW5nIGFsbCBvdGhlciB2YXJpYWJsZXMgY29uc3RhbnQuIA0KDQoqIEF2Z1RlbXAgKHAgPCAuMDAxKTogVGhlIHJlZ3Jlc3Npb24gY29lZmZpY2llbnQgb2YgdGhlIEF2Z1RlbXAgdmFyaWFibGUgaW4gdGhpcyBtb2RlbCBpcyAwLjAyNTMuIFRoaXMgbWVhbnMgdGhhdCB0aGUgbWVhbiBsb2cgb2YgdGhlIGNvdW50cyBpbmNyZWFzZXMgYnkgMC4wMjUzIHVuaXRzIGZvciBldmVyeSAxIGRlZ3JlZSBGYWhyZW5oZWl0IGluY3JlYXNlIGluIHRoZSBhdmVyYWdlIHRlbXBlcmF0dXJlIGZvciB0aGUgZ2l2ZW4gb2JzZXJ2YXRpb24sIGhvbGRpbmcgYWxsIG90aGVyIHZhcmlhYmxlcyBjb25zdGFudC4gDQoNCiogTmV3UHJlY2lwIChwIDwgLjAwMSk6IFRoZSByZWdyZXNzaW9uIGNvZWZmaWNpZW50IG9mIHRoZSBOZXdQcmVjaXAgdmFyaWFibGUgaW4gdGhpcyBtb2RlbCBpcyAtMC4zNDA4LiBUaGlzIG1lYW5zIHRoYXQgdGhlIG1lYW4gbG9nIG9mIHRoZSBjb3VudCBvZiBjeWNsaXN0cyBvbiB0aGUgV2lsbGlhbXNidXJnIEJyaWRnZSBpcyAwLjM0MDggbGVzcyBvbiBkYXlzIHdoZXJlIHRoZXJlIGlzIHByZWNpcGl0YXRpb24gdGhhbiBvbiBkYXlzIHdoZXJlIHRoZXJlIGlzIG5vIHByZWNpcGl0YXRpb24uIFdlIGNhbiBhbHNvIHNheSB0aGF0IHRoZSBjb3VudCBvZiBjeWNsaXN0cyBpcyAwLjcxMTIgZ3JlYXRlciBvbiBkYXlzIHdpdGggcHJlY2lwaXRhdGlvbiB0aGFuIG9uIGRheXMgd2l0aCBubyBwcmVjaXBpdGF0aW9uLg0KDQoNCkFsbCBvZiB0aGUgcHJlZGljdG9yIHZhcmlhYmxlcyBpbiB0aGlzIFBvaXNzb24gcmVncmVzc2lvbiBtb2RlbCBvbiBmcmVxdWVuY3kgY291bnRzIHdlcmUgc3RhdGlzdGljYWxseSBzaWduaWZpY2FudCB3aXRoIGFsbCBvZiB0aGVpciBwLXZhbHVlcyBiZWluZyBlcXVhbCB0byBwIDwgLjAwMS4gDQoNCg0KDQoNCiMgUG9pc3NvbiBSZWdyZXNzaW9uIE1vZGVsIG9uIFJhdGVzDQoNCg0KTm93LCB3ZSB3aWxsIGNyZWF0ZSBhIFBvaXNzb24gcmVncmVzc2lvbiBtb2RlbCBvZiB0aGUgcmF0ZXMgYXQgd2hpY2ggY3ljbGlzdHMgZW50ZXIgYW5kIGxlYXZlIHZpYSB0aGUgV2lsbGlhbXNidXJnIEJyaWRnZSBvZmZzZXQgYnkgdGhlIHRvdGFsIG51bWJlciBvZiBjeWNsaXN0cyBvbiBhbGwgZm91ciBvZiB0aGUgbWFqb3IgTmV3IFlvcmsgYnJpZGdlcywgdXNpbmcgdGhlIG5ldyB2YXJpYWJsZXMgd2UgY3JlYXRlZCBpbiB0aGlzIHByb2plY3QuIA0KDQpUaGlzIG1vZGVsLCB1bmxpa2UgdGhlIHByZXZpb3VzIG1vZGVsIHdoaWNoIGp1c3QgZm9jdXNlZCBvbiB0aGUgZnJlcXVlbmN5IGNvdW50cyBvZiBjeWNsaXN0cyBvbiB0aGUgV2lsbGlhbXNidXJnIEJyaWRnZSwgd2lsbCBhbHNvIGFjY291bnQgZm9yIHRoZSB0b3RhbCBudW1iZXIgb2YgY3ljbGlzdHMgb24gYWxsIGZvdXIgb2YgdGhlIG1ham9yIE5ldyBZb3JrIGJyaWRnZXMsIHRoZSBCcm9va2x5biBCcmlkZ2UsIHRoZSBNYW5oYXR0YW4gQnJpZGdlLCB0aGUgV2lsbGlhbXNidXJnIEJyaWRnZSwgYW5kIHRoZSBRdWVlbnNib3JvIEJyaWRnZS4gVGhpcyBQb2lzc29uIG1vZGVsIHdpbGwgbG9vayBhdCB0aGUgcmF0ZXMgb2YgdGhlIG51bWJlciBvZiBjeWNsaXN0cyBvbiB0aGUgV2lsbGlhbXNidXJnIEJyaWRnZSBmb3IgYSBnaXZlbiBvYnNlcnZhdGlvbiBhcyBhIHJhdGUgb3V0IG9mIHRoZSB0b3RhbCBudW1iZXIgb2YgY3ljbGlzdHMgb24gYWxsIGZvdXIgb2YgdGhlc2UgbWFqb3IgYnJpZGdlcyBmb3IgdGhhdCBzcGVjaWZpYyBvYnNlcnZhdGlvbi4NCg0KV2Ugd2lsbCBidWlsZCBvdXIgUG9pc3NvbiByZWdyZXNzaW9uIG1vZGVsIGZvciB0aGUgcmF0ZXMuIFRoaXMgdGltZSwgd2Ugd2lsbCBzdGlsbCB1c2UgdGhlIFdpbGxpYW1zYnVyZ0JyaWRnZSB2YXJpYWJsZSBhcyBvdXIgcmVzcG9uc2UgdmFyaWFibGUsIGJ1dCB3ZSB3aWxsIG9mZnNldCB0aGUgbW9kZWwgYnkgdGhlIFRvdGFsIHZhcmlhYmxlIHRvIG1ha2Ugb3VyIFBvaXNzb24gbW9kZWwgZm9yIHRoZSByYXRlcyBvZiBjeWNsaXN0cyBvbiB0aGUgV2lsbGlhbXNidXJnIEJyaWRnZSBvdXQgb2YgdGhlIHRvdGFsIG51bWJlciBvZiBjeWNsaXN0cyBvbiBhbGwgZm91ciBvZiB0aGUgYnJpZGdlcy4gDQoNCg0KYGBge3J9DQojIFBvaXNzb24gTW9kZWwgb2YgUmF0ZXMNCm1vZGVsLnJhdGVzIDwtIGdsbShXaWxsaWFtc2J1cmdCcmlkZ2UgfiBEYXkgKyBBdmdUZW1wICsgTmV3UHJlY2lwLCANCiAgICAgICAgICAgICAgICAgICBvZmZzZXQgPSBsb2coVG90YWwpLCANCiAgICAgICAgICAgICAgICAgICBmYW1pbHkgPSBwb2lzc29uKGxpbmsgPSAibG9nIiksIGRhdGEgPSBjeWNsaW5nKQ0Ka2FibGUoc3VtbWFyeShtb2RlbC5yYXRlcykkY29lZiwgY2FwdGlvbiA9ICJQb2lzc29uIFJlZ3Jlc3Npb24gTW9kZWwgb2YgdGhlIFJhdGVzIG9mIEN5Y2xpc3RzIFxuIG9uIHRoZSBXaWxsaWFtc2J1cmcgQnJpZGdlIG91dCBvZiBhbGwgRm91ciBCcmlkZ2VzIikNCmBgYA0KDQpUaGUgcmVncmVzc2lvbiBlcXVhdGlvbiBmb3IgdGhlIFBvaXNzb24gcmVncmVzc2lvbiBtb2RlbCBvbiB0aGUgcmF0ZXMgaXMgZ2l2ZW4gYXM6DQoNCmxvZyjOvC90KSA9IC0xLjA0MzYgKyAwLjAwMTggKiBEYXlNb25kYXkgKyAwLjAzNDUgKiBEYXlTYXR1cmRheSArIDAuMDAzNSAqIERheVN1bmRheSArIDAuMDIzNyAqIERheVRodXJzZGF5ICsgMC4wMjUzICogRGF5VHVlc2RheSArIDAuMDE4NCAqIERheVdlZG5lc2RheSAtIDAuMDAxNSAqIEF2Z1RlbXAgKyAwLjAxMzcgKiBOZXdQcmVjaXANCg0KDQpUaGUgdmFyaWFibGVzIERheVNhdHVyZGF5LCBEYXlUaHVyc2RheSwgRGF5VHVlc2RheSwgQXZnVGVtcCwgYW5kIE5ld1ByZWNpcCBhbGwgaGFkIHAtdmFsdWVzIGxlc3MgdGhhbiB0aGUgYWxwaGEgdmFsdWUgb2YgMC4wNSwgbWVhbmluZyB0aGF0IHRoZXNlIGFyZSB0aGUgdmFyaWFibGVzIHdoaWNoIGFyZSBzdGF0aXN0aWNhbGx5IHNpZ25pZmljYW50IGluIHRoaXMgbW9kZWwuIA0KDQpMaWtlIHdhcyBzdGF0ZWQgZm9yIHRoZSBQb2lzc29uIHJlZ3Jlc3Npb24gbW9kZWwgb24gZnJlcXVlbmN5IGNvdW50cywgRnJpZGF5IHdhcyBjaG9zZW4gYnkgUiB0byBiZSB0aGUgYmFzZSBsaW5lIGxldmVsIG9mIHRoZSBEYXkgdmFyaWFibGUsIGFuZCBzbyB3ZSB3aWxsIGNvbXBhcmUgdGhlIHJlZ3Jlc3Npb24gY29lZmZpY2llbnRzIGFnYWluc3QgdGhpcyBiYXNlIGxpbmUgbGV2ZWwuDQoNCg0KDQojIyBSZWdyZXNzaW9uIENvZWZmaWNpZW50cyBJbnRlcnByZXRhdGlvbg0KDQpXZSB3aWxsIGFuYWx5c2lzIHRoZSByZWdyZXNzaW9uIGNvZWZmaWNpZW50cyBmb3IgdGhlIHZhcmlhYmxlcyBpbiB0aGlzIFBvaXNzb24gcmVncmVzc2lvbiBtb2RlbCBvbiBmcmVxdWVuY3kgY291bnRzLg0KDQoqIFRoZSB2YWx1ZSBvZiB0aGUgeS1pbnRlcmNlcHQgaXMgZ2l2ZW4gYXMgLTEuMDQzNi4gVGhpcyByZXByZXNlbnRzIHRoZSBiYXNlbGluZSBvZiB0aGUgbWVhbiBvZiB0aGUgbG9nIGNvdW50cyBtdWx0aXBsaWVkIGJ5IHQsIHdoZW4gYWxsIHByZWRpY3RvciB2YXJpYWJsZXMgYXJlIGVxdWFsIHRvIDAuIEhvd2V2ZXIsIHRoZSB5LWludGVyY2VwdCBkb2VzIG5vdCBoYXZlIGEgcHJhY3RpY2FsIGludGVycHJldGF0aW9uIG9yIG1lYW5pbmcgaW4gdGhpcyBzY2VuYXJpbyBzbyB3ZSBhcmUgbm90IGludGVyZXN0ZWQgaW4gaXRzIG1lYW5pbmcgZm9yIHRoZSBQb2lzc29uIHJlZ3Jlc3Npb24gbW9kZWwuDQoNCiogRGF5TW9uZGF5IChwID0gLjg0OTUpOiBUaGUgcmVncmVzc2lvbiBjb2VmZmljaWVudCBvZiB0aGUgRGF5TW9uZGF5IHZhcmlhYmxlIGluIHRoaXMgbW9kZWwgaXMgMC4wMDE4LiBUaGlzIG1lYW5zIHRoYXQgdGhlIG1lYW4gbG9nIGNvdW50IG9mIGN5Y2xpc3RzIG9uIHRoZSBXaWxsaWFtc2J1cmdzIEJyaWRnZSB3YXMgMC4wMDE4IGdyZWF0ZXIgb24gTW9uZGF5IHRoYW4gb24gRnJpZGF5LiBXZSBjYW4gYWxzbyBzYXkgdGhpcyBtZWFucyB0aGF0IHRoZSBjb3VudCBvZiBjeWNsaXN0cyBpcyAxLjAwMTggdGltZXMgZ3JlYXRlciBvbiBNb25kYXkgdGhhbiBvbiBGcmlkYXksIGhvbGRpbmcgYWxsIG90aGVyIHZhcmlhYmxlcyBjb25zdGFudC4gDQoNCiogRGF5U2F0dXJkYXkgKHAgPCAuMDAxKTogVGhlIHJlZ3Jlc3Npb24gY29lZmZpY2llbnQgb2YgdGhlIERheVNhdHVyZGF5IHZhcmlhYmxlIGluIHRoaXMgbW9kZWwgaXMgMC4wMzQ1LiBUaGlzIG1lYW5zIHRoYXQgdGhlIG1lYW4gbG9nIGNvdW50IG9mIGN5Y2xpc3RzIG9uIHRoZSBXaWxsaWFtc2J1cmdzIEJyaWRnZSB3YXMgMC4wMzQ1IGdyZWF0ZXIgb24gU2F0dXJkYXkgdGhhbiBvbiBGcmlkYXkuIFdlIGNhbiBhbHNvIHNheSB0aGlzIG1lYW5zIHRoYXQgdGhlIGNvdW50IG9mIGN5Y2xpc3RzIGlzIDEuMDM1MSB0aW1lcyBncmVhdGVyIG9uIFNhdHVyZGF5IHRoYW4gb24gRnJpZGF5LCBob2xkaW5nIGFsbCBvdGhlciB2YXJpYWJsZXMgY29uc3RhbnQuICANCg0KKiBEYXlTdW5kYXkgKHAgPSAwLjcyNDYpOiBUaGUgcmVncmVzc2lvbiBjb2VmZmljaWVudCBvZiB0aGUgRGF5U3VuZGF5IHZhcmlhYmxlIGluIHRoaXMgbW9kZWwgaXMgMC4wMDM1LiBUaGlzIG1lYW5zIHRoYXQgdGhlIG1lYW4gbG9nIGNvdW50IG9mIGN5Y2xpc3RzIG9uIHRoZSBXaWxsaWFtc2J1cmdzIEJyaWRnZSB3YXMgMC4wMDM1IGdyZWF0ZXIgb24gU3VuZGF5IHRoYW4gb24gRnJpZGF5LiBXZSBjYW4gYWxzbyBzYXkgdGhpcyBtZWFucyB0aGF0IHRoZSBjb3VudCBvZiBjeWNsaXN0cyBpcyAxLjAwMzUgdGltZXMgZ3JlYXRlciBvbiBTdW5kYXkgdGhhbiBvbiBGcmlkYXksIGhvbGRpbmcgYWxsIG90aGVyIHZhcmlhYmxlcyBjb25zdGFudC4gDQoNCiogRGF5VGh1cnNkYXkgKHAgPSAwLjAxOTUpOiBUaGUgcmVncmVzc2lvbiBjb2VmZmljaWVudCBvZiB0aGUgRGF5VGh1cnNkYXkgdmFyaWFibGUgaW4gdGhpcyBtb2RlbCBpcyAwLjAyMzcuIFRoaXMgbWVhbnMgdGhhdCB0aGUgbWVhbiBsb2cgY291bnQgb2YgY3ljbGlzdHMgb24gdGhlIFdpbGxpYW1zYnVyZ3MgQnJpZGdlIHdhcyAwLjAyMzcgZ3JlYXRlciBvbiBUaHVyc2RheSB0aGFuIG9uIEZyaWRheS4gV2UgY2FuIGFsc28gc2F5IHRoaXMgbWVhbnMgdGhhdCB0aGUgY291bnQgb2YgY3ljbGlzdHMgaXMgMS4wMjQwIHRpbWVzIGdyZWF0ZXIgb24gVGh1cnNkYXkgdGhhbiBvbiBGcmlkYXksIGhvbGRpbmcgYWxsIG90aGVyIHZhcmlhYmxlcyBjb25zdGFudC4gDQoNCiogRGF5VHVlc2RheSAocCA9IDAuMDEyNCk6IFRoZSByZWdyZXNzaW9uIGNvZWZmaWNpZW50IG9mIHRoZSBEYXlUdWVzZGF5IHZhcmlhYmxlIGluIHRoaXMgbW9kZWwgaXMgMC4wMjUzLiBUaGlzIG1lYW5zIHRoYXQgdGhlIG1lYW4gbG9nIGNvdW50IG9mIGN5Y2xpc3RzIG9uIHRoZSBXaWxsaWFtc2J1cmdzIEJyaWRnZSB3YXMgMC4wMjUzIGdyZWF0ZXIgb24gVHVlc2RheSB0aGFuIG9uIEZyaWRheS4gV2UgY2FuIGFsc28gc2F5IHRoaXMgbWVhbnMgdGhhdCB0aGUgY291bnQgb2YgY3ljbGlzdHMgaXMgMS4wMjU2IHRpbWVzIGdyZWF0ZXIgb24gVHVlc2RheSB0aGFuIG9uIEZyaWRheSwgaG9sZGluZyBhbGwgb3RoZXIgdmFyaWFibGVzIGNvbnN0YW50LiANCg0KKiBEYXlXZWRuZXNkYXkgKHAgPSAwLjA3MDApOiBUaGUgcmVncmVzc2lvbiBjb2VmZmljaWVudCBvZiB0aGUgRGF5V2VkbmVzZGF5IHZhcmlhYmxlIGluIHRoaXMgbW9kZWwgaXMgMC4wMTg0LiBUaGlzIG1lYW5zIHRoYXQgdGhlIG1lYW4gbG9nIGNvdW50IG9mIGN5Y2xpc3RzIG9uIHRoZSBXaWxsaWFtc2J1cmdzIEJyaWRnZSB3YXMgMC4wMTg0IGdyZWF0ZXIgb24gV2VkbmVzZGF5IHRoYW4gb24gRnJpZGF5LiBXZSBjYW4gYWxzbyBzYXkgdGhpcyBtZWFucyB0aGF0IHRoZSBjb3VudCBvZiBjeWNsaXN0cyBpcyAxLjAxODYgdGltZXMgZ3JlYXRlciBvbiBXZWRuZXNkYXkgdGhhbiBvbiBGcmlkYXksIGhvbGRpbmcgYWxsIG90aGVyIHZhcmlhYmxlcyBjb25zdGFudC4gDQoNCiogQXZnVGVtcCAocCA8IC4wMDEpOiBUaGUgcmVncmVzc2lvbiBjb2VmZmljaWVudCBvZiB0aGUgQXZnVGVtcCB2YXJpYWJsZSBpbiB0aGlzIG1vZGVsIGlzIC0wLjAwMTUuIFRoaXMgbWVhbnMgdGhhdCB0aGUgbWVhbiBsb2cgb2YgdGhlIGNvdW50cyBkZWNyZWFzZXMgYnkgMC4wMDE1IHVuaXRzIGZvciBldmVyeSAxIGRlZ3JlZSBGYWhyZW5oZWl0IGluY3JlYXNlIGluIHRoZSBhdmVyYWdlIHRlbXBlcmF0dXJlIGZvciB0aGUgZ2l2ZW4gb2JzZXJ2YXRpb24sIGhvbGRpbmcgYWxsIG90aGVyIHZhcmlhYmxlcyBjb25zdGFudC4NCg0KKiBOZXdQcmVjaXAgKHAgPSAuMDMyMSk6IFRoZSByZWdyZXNzaW9uIGNvZWZmaWNpZW50IG9mIHRoZSBOZXdQcmVjaXAgdmFyaWFibGUgaW4gdGhpcyBtb2RlbCBpcyAwLjAxMzcuIFRoaXMgbWVhbnMgdGhhdCB0aGUgbWVhbiBsb2cgb2YgdGhlIGNvdW50IG9mIGN5Y2xpc3RzIG9uIHRoZSBXaWxsaWFtc2J1cmcgQnJpZGdlIGlzIDAuMDEzNyBncmVhdGVyIG9uIGRheXMgd2hlcmUgdGhlcmUgaXMgcHJlY2lwaXRhdGlvbiB0aGFuIG9uIGRheXMgd2hlcmUgdGhlcmUgaXMgbm8gcHJlY2lwaXRhdGlvbi4gV2UgY2FuIGFsc28gc2F5IHRoYXQgdGhlIGNvdW50IG9mIGN5Y2xpc3RzIGlzIDEuMDEzOCBncmVhdGVyIG9uIGRheXMgd2l0aCBwcmVjaXBpdGF0aW9uIHRoYW4gb24gZGF5cyB3aXRoIG5vIHByZWNpcGl0YXRpb24uDQoNCg0KDQpPdXQgb2YgYWxsIG9mIHRoZSBwcmVkaWN0b3IgdmFyaWFibGVzLCB0aGUgb25lcyB3aGljaCBzaG93ZWQgc3RhdGlzdGljYWwgc2lnbmlmaWNhbmNlIHdlcmUgRGF5U2F0dXJkYXkgKHAgPCAuMDAxKSwgRGF5VGh1cnNkYXkgKHAgPSAwLjAxOSksIERheVR1ZXNkYXkgKHAgPSAwLjAxMjQpLCBBdmdUZW1wIChwIDwgLjAwMSksIGFuZCBOZXdQcmVjaXAgKHAgPSAuMDMyMSkuIEFsbCBvZiB0aGUgcHJlZGljdG9yIHZhcmlhYmxlcyBoYXZlIHAtdmFsdWVzIGxlc3MgdGhhbiB0aGUgYWxwaGEgdmFsdWUgb2YgMC4wNSwgaW5kaWNhdGluZyB0aGV5IGFyZSBzdGF0aXN0aWNhbGx5IHNpZ25pZmljYW50IHRvIHRoZSBtb2RlbC4gDQoNClRoZSB2YXJpYWJsZXMgb2YgRGF5TW9uZGF5IChwID0gLjg0OTUpLCBEYXlTdW5kYXkgKHAgPSAwLjcyNDYpLCBhbmQgRGF5V2VkbmVzZGF5IChwID0gMC4wNzAwKSBkaWQgbm90IHNob3cgc3RhdGlzdGljYWwgc2lnbmlmaWNhbmNlIGFzIHRoZXkgaGF2ZSBwLXZhbHVlcyBncmVhdGVyIHRoYW4gdGhlIGFscGhhIHZhbHVlIG9mIDAuMDUsIGluZGljYXRpbmcgdGhleSBhcmUgbm90IHN0YXRpc3RpY2FsbHkgc2lnbmlmaWNhbnQgdG8gdGhlIG1vZGVsLg0KDQoNCg0KIyBRdWFzc2ktUG9pc3NvbiBSZWdyZXNzaW9uIE1vZGVsIA0KDQoNCk5leHQsIHdlIHdpbGwgY3JlYXRlIGEgUXVhc2ktUG9pc3NvbiByZWdyZXNzaW9uIG1vZGVsLiBUaGlzIFF1YXNzaS1Qb2lzc29uIHJlZ3Jlc3Npb24gbW9kZWwgd2lsbCBiZSBkb25lIG9uIHRoZSByYXRlcywgYW5kIHNvIGl0IHdpbGwgYmUgb2Zmc2V0IGJ5IHRoZSBUb3RhbCB2YXJpYWJsZSwgd2hpbGUgc3RpbGwgdXNpbmcgV2lsbGlhbXNidXJnQnJpZGdlIGFzIGl0cyByZXNwb25zZSB2YXJpYWJsZSBmb3IgdGhpcyBtb2RlbC4NCg0KYGBge3J9DQojIFF1YXNpLVBvaXNzb24gUmVncmVzc2lvbiBNb2RlbA0KcXVhc2ltb2RlbC5yYXRlcyA8LSBnbG0oV2lsbGlhbXNidXJnQnJpZGdlIH4gRGF5ICsgQXZnVGVtcCArIE5ld1ByZWNpcCwgDQogICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQgPSBsb2coVG90YWwpLCANCiAgICAgICAgICAgICAgICAgICAgICAgIGZhbWlseSA9IHF1YXNpcG9pc3NvbiwgZGF0YSA9IGN5Y2xpbmcpDQpzdW1tYXJ5KHF1YXNpbW9kZWwucmF0ZXMpDQoNCnBhbmRlcihzdW1tYXJ5KHF1YXNpbW9kZWwucmF0ZXMpJGNvZWYsIGNhcHRpb24gPSAiUXVhc2ktUG9pc3NvbiBSZWdyZXNzaW9uIE1vZGVsIikNCmBgYA0KDQoNClRoZSByZWdyZXNzaW9uIGVxdWF0aW9uIG9mIHRoZSBRdWFzaS1Qb2lzc29uIFJlZ3Jlc3Npb24gTW9kZWwgaXMgZ2l2ZW4gYXMgZm9sbG93czoNCg0KbG9nKM68L3QpID0gLTEuMDQzNiArIDAuMDAxOCAqIERheU1vbmRheSArIDAuMDM0NSAqIERheVNhdHVyZGF5ICsgMC4wMDM1ICogRGF5U3VuZGF5ICsgMC4wMjM3ICogRGF5VGh1cnNkYXkgKyAwLjAyNTMgKiBEYXlUdWVzZGF5ICsgMC4wMTg0ICogRGF5V2VkbmVzZGF5IC0gMC4wMDE1ICogQXZnVGVtcCArIDAuMDEzNyAqIE5ld1ByZWNpcA0KIA0KIA0KQXMgd2UgY2FuIHNlZSwgdGhlIFF1YXNzaS1Qb2lzc29uIHJlZ3Jlc3Npb24gbW9kZWwgaGFzIHRoZSBzYW1lIGNvZWZmaWNpZW50IGVzdGltYXRlcyBhcyB0aGUgc3RhbmRhcmQgUG9pc3NvbiByZWdyZXNzaW9uIG1vZGVsIG9uIHJhdGVzLCBob3dldmVyLCB0aGUgcC12YWx1ZXMgZm9yIHRoZXNlIHJlZ3Jlc3Npb24gY29lZmZpY2llbnRzIGFyZSBkaWZmZXJlbnQgYmV0d2VlbiB0aGVzZSB0d28gbW9kZWxzLiANCg0KU28sIHRoZSByZWdyZXNzaW9uIGNvZWZmaWNpZW50cyBmb3IgdGhpcyBRdWFzc2ktUG9pc3NvbiByZWdyZXNzaW9uIG1vZGVsIHdvdWxkIGJlIHRoZSBleGFjdCBzYW1lIGFzIHRoZXkgd2VyZSBmb3IgdGhlIHByZXZpb3VzIG1vZGVsIHdlIGp1c3QgZm91bmQgb24gdGhlIFBvaXNzb24gcmVncmVzc2lvbiBtb2RlbCBvZiByYXRlcyBmb3IgdGhlIG5ldyBwcmVkaWN0b3IgdmFyaWFibGVzIG9mIERheSwgQXZnVGVtcCwgYW5kIE5ld1ByZWNpcC4NCg0KT3V0IG9mIGFsbCBvZiB0aGUgcHJlZGljdG9yIHZhcmlhYmxlcyBpbiBvdXIgUXVhc3NpLVBvaXNzb24gcmVncmVzc2lvbiBtb2RlbCBvbiByYXRlcywgb25seSB0aGUgdmFyaWFibGUgb2YgQXZnVGVtcCAocCA9IDAuMDQzKSB3YXMgc3RhdGlzdGljYWxseSBzaWduaWZpY2FudCwgYXMgaXQgd2FzIHRoZSBvbmx5IHByZWRpY3RvciB2YXJpYWJsZSB3aXRoIGEgcC12YWx1ZSBsZXNzIHRoYW4gdGhlIGFscGhhIHZhbHVlIG9mIDAuMDUuIFRoaXMgbWVhbnMsIEF2Z1RlbXAgaXMgdGhlIG9ubHkgc3RhdGlzdGljYWxseSBzaWduaWZpY2FudCBwcmVkaWN0b3IgdmFyaWFibGUgaW4gcHJlZGljdGluZyB0aGUgY3ljbGlzdHMgb24gdGhlIFdpbGxpYW1zYnVyZyBCcmlkZ2UuIA0KDQpBbGwgb2YgdGhlIG90aGVyIHByZWRpY3RvciB2YXJpYWJsZXMsIERheU1vbmRheSwgRGF5U2F0dXJkYXksIERheVN1bmRheSwgRGF5VGh1cnNkYXksIERheVR1ZXNkYXksIERheVdlZG5lc2RheSwgYW5kIE5ld1ByZWNpcCwgd2VyZSBub3Qgc3RhdGlzdGljYWxseSBzaWduaWZpY2FudCBpbiB0aGUgUXVhc3NpLVBvaXNzb24gcmVncmVzc2lvbiBtb2RlbCwgYmVjYXVzZSB0aGV5IGFsbCBoYWQgcC12YWx1ZXMgZ3JlYXRlciB0aGFuIHRoZSBhbHBoYSB2YWx1ZSBvZiAwLjA1Lg0KDQoNCg0KIyMgRGlzcGVyc2lvbg0KDQpOb3csIHdlIHdpbGwgbG9vayBhdCB0aGUgZGlzcGVyc2lvbiBwYXJhbWV0ZXIgZm9yIHRoZSBRdWFzc2ktUG9pc3NvbiByZWdyZXNzaW9uIG1vZGVsIGluIG9yZGVyIHRvIHNlZSBob3cgZGlzcGVyc2VkIGl0IGlzLiANCg0KSW4gdGhpcyBvdXRwdXQgb2YgdGhlIG1vZGVsIHN1bW1hcnksIHdlIHdlcmUgZ2l2ZW4gdGhhdCB0aGUgZGlzcGVyc2lvbiBwYXJhbWV0ZXIgZm9yIHRoZSBRdWFzaS1Qb2lzc29uIG1vZGVsIGlzIDQuMjQzNi4gVGhpcyBkaXNwZXJzaW9uIHBhcmFtZXRlciBnaXZlbiBpbiB0aGUgbW9kZWwgc3VtbWFyeSBpcyB0aGUgUGVhcnNvbiBkaXNwZXJzaW9uIHBhcmFtZXRlci4gDQoNCldlIGNhbiBhbHNvIGNhbGN1bGF0ZSB0aGUgRGV2aWFuY2UgZGlzcGVyc2lvbiBwYXJhbWV0ZXIgdG8gY29tcGFyZSB0aGVzZSB0d28gZGlzcGVyc2lvbiBwYXJhbWV0ZXJzIGZvciBvdXIgUXVhc3NpLVBvaXNzb24gcmVncmVzc2lvbiBtb2RlbCBvbiByYXRlcy4gDQoNCmBgYHtyfQ0KIyBEaXNwZXJzaW9uIFBhcmFtZXRlcnMNCnloYXQgPSBxdWFzaW1vZGVsLnJhdGVzJGZpdHRlZC52YWx1ZXMNCnBlYXJzb24ucmVzaWQgPSAoY3ljbGluZyRXaWxsaWFtc2J1cmdCcmlkZ2UgLSB5aGF0KS9zcXJ0KHloYXQpDQpQZWFyc29uLmRpc3BlcnNpb24gPSBzdW0ocGVhcnNvbi5yZXNpZF4yKS9xdWFzaW1vZGVsLnJhdGVzJGRmLnJlc2lkdWFsDQpEZXZpYW5jZS5kaXNwZXJzaW9uID0gKHF1YXNpbW9kZWwucmF0ZXMkZGV2aWFuY2UpL3F1YXNpbW9kZWwucmF0ZXMkZGYucmVzaWR1YWwNCmRpc3AgPSBjYmluZChQZWFyc29uLmRpc3BlcnNpb24gPSBQZWFyc29uLmRpc3BlcnNpb24sIA0KICAgICAgICAgICAgIERldmlhbmNlLmRpc3BlcnNpb24gPSBEZXZpYW5jZS5kaXNwZXJzaW9uKQ0Ka2FibGUoZGlzcCwgY2FwdGlvbj0iRGlzcGVyc2lvbiBwYXJhbWV0ZXIiLCBhbGlnbiA9ICdjJykNCmBgYA0KDQpBcyB3ZSBjYW4gc2VlLCB0aGUgdmFsdWUgb2YgdGhlIFBlYXJzb24gZGlzcGVyc2lvbiBwYXJhbWV0ZXIgZm9yIG91ciBRdWFzc2ktUG9pc3NvbiByZWdyZXNzaW9uIG1vZGVsIGlzIDQuMjQzNi4gVGhlIHZhbHVlIG9mIHRoZSBEZXZpYW5jZSBkaXNwZXJzaW9uIHBhcmFtZXRlciBmb3Igb3VyIFF1YXNzaS1Qb2lzc29uIHJlZ3Jlc3Npb24gbW9kZWwgaXMgNC4yNDI2LiANCg0KVGhlc2UgZGlzcGVyc2lvbiBwYXJhbWV0ZXJzIHNob3cgdGhhdCBvdXIgbW9kZWwgaXMgaW5kZWVkIGZhaXJseSBkaXNwZXJzZWQsIGFzIHRoZXNlIGRpc3BlcnNpb24gaW5kZXhlcyBkbyBkaWZmZXIgZnJvbSB0aGUgdmFsdWUgb2YgMSBieSBxdWl0ZSBhIGZhaXIgYW1vdW50LiBXZSBjYW4gY29uY2x1ZGUgdGhhdCBvdXIgbW9kZWwgaXMgc2lnbmZpY2FudGx5IGRpc3BlcmVkIGFuZCB0aGVyZWZvcmUsIHVzaW5nIHRoZSBzdGFuZGFyZCBQb2lzc29uIHJlZ3Jlc3Npb24gbW9kZWwgd291bGQgbGlrZWx5IG5vdCBiZSBhbiBpZGVhbCBjaG9pY2UgZHVlIHRvIHRoZSBwb3RlbnRpYWwgb2Ygb3Zlci1kaXNwZXJzaW9uIGxlYWRpbmcgdG8gaW5uYWNjdXJhdGUgcmVzdWx0cyBmb3IgcHJlZGljdGlvbi4gVGhlIGRpc3BlcnNpb24gaW4gb3VyIG1vZGVsIHNpZ25pZmljYW50bHkgZGlmZmVyaW5nIGZyb20gYSB2YWx1ZSBvZiAxIGluZGljYXRlcyB0aGF0IHRoZSBRdWFzc2ktUG9pc3NvbiBtb2RlbCBsaWtlbHkgaXMgdGhlIGJldHRlciBjaG9pY2UgYXMgd2UgZG8gaGF2ZSBzb21lIHNpZ25pZmljYW50IGRpc3BlcnNpb24uIA0KDQoNCg0KIyBGaW5hbCBNb2RlbCANCg0KTm93LCBmb3Igb3VyIGZpbmFsIG1vZGVsIHdlIG11c3QgY2hvb3NlIGJldHdlZW4gdGhlIHN0YW5kYXJkIFBvaXNzb24gcmVncmVzc2lvbiBtb2RlbCBvbiByYXRlcyBhbmQgdGhlIFF1YXNzaS1Qb2lzc29uIHJlZ3Jlc3Npb24gbW9kZWwuIA0KDQpPbmUgaW1wb3J0YW50IHRoaW5nIHRvIG5vdGUgd2hlbiBtYWtpbmcgdGhpcyBjaG9pY2UsIGlzIHRoYXQgdGhlIHJlZ3VsYXIgUG9pc3NvbiBtb2RlbCBhc3N1bWVzIHRoYXQgdGhlIG1lYW4gb2YgdGhlIHJlc3BvbnNlIHZhcmlhYmxlIGlzIGVxdWFsIHRvIGl0cyB2YXJpYW5jZSB3aGlsZSB0aGUgUXVhc3NpLVBvaXNzb24gbW9kZWwgZG9lcyBub3QuIFdoZW4gd2UgY2hlY2tlZCB0aGUgY29uZGl0aW9ucyBvZiB0aGUgc3RhbmRhcmQgUG9pc3NvbiByZWdyZXNzaW9uIG1vZGVsIGVhcmxpZXIsIHdlIGZvdW5kIHRoYXQgdGhlIG1lYW4gb2YgdGhlIHJlc3BvbnNlIHZhcmlhYmxlIGRvZXMgbm90IGVxdWFsIGl0cyB2YXJpYW5jZSwgaW5kaWNhdGluZyBhIG1ham9yIHZpb2xhdGlvbi4gVGhpcyB2aW9sYXRpb24gd291bGQgY2F1c2Ugc29tZSBjb25jZXJuIGZvciB0aGUgcmVndWxhciBQb2lzc29uIHJlZ3Jlc3Npb24gbW9kZWwgYXMgaXQgc3VnZ2VzdCB0aGF0IHRoZSByZXNwb25zZSB2YXJpYWJsZSBpcywgaW4gZmFjdCwgbm90IGEgUG9pc3NvbiByYW5kb20gdmFyaWFibGUsIGFuZCB0aGVyZWZvcmUgYSBzdGFuZGFyZCBQb2lzc29uIHJlZ3Jlc3Npb24gbW9kZWwgbWF5IG5vdCBiZSB0aGUgYmVzdCBjaG9pY2UgZm9yIHRoaXMgZGF0YSBzZXQuIA0KDQpIZXJlLCB0aGUgUXVhc3NpLVBvaXNzb24gbW9kZWwgaGFzIHRoZSBhZHZhbnRhZ2UgYXMgaXQgZG9lcyBub3QgYXNzdW1lIHRoYXQgdGhlIG1lYW4gb2YgdGhlIHJlc3BvbnNlIHZhcmlhYmxlIGlzIGVxdWFsIHRvIGl0cyB2YXJpYW5jZSwgd2hpY2ggaXMgZ29vZCBmb3Igb3VyIGRhdGEgc2V0IHNpbmNlIGl0IGZhaWxlZCB0byBtZWV0IHRoaXMgcmVxdWlyZWQgY29uZGl0aW9uIGZvciBhIHN0YW5kYXJkIFBvaXNzb24gcmVncmVzc2lvbiBtb2RlbC4gDQoNCkJvdGggbW9kZWxzIGhhdmUgYWR2YW50YWdlcyBpbiBkaXNhZHZhbnRhZ2VzIHdoaWNoIG11c3QgYmUgY29uc2lkZXJlZCB3aGVuIG1ha2luZyB0aGUgY2hvaWNlIG9mIGEgZmluYWwgbW9kZWwuIFRoZSBzdGFuZGFyZCBQb2lzc29uIHJlZ3Jlc3Npb24gbW9kZWwgb24gcmF0ZXMgc2hvd2VkIHN0cm9uZyBzdGF0aXN0aWNhbCBzaWduaWZpY2FuY2UgZm9yIHRoZSBtYWpvcml0eSBvZiBpdHMgcHJlZGljdG9yIHZhcmlhYmxlcy4gSG93ZXZlciwgdGhlIGRhdGEgc2V0IGZhaWxlZCB0byBtZWV0IHRoZSBjb25kaXRpb24gb2YgdGhlIG1lYW4gb2YgdGhlIHByZWRpY3RvciB2YXJpYWJsZSBlcXVhbGluZyBpdHMgdmFyaWFuY2Ugd2hpY2ggcmFpc2VzIGNvbmNlcm4gZm9yIHRoZSBmaXQgb2YgdGhpcyBtb2RlbC4gT24gdGhlIG90aGVyIGhhbmQsIHRoZSBRdWFzc2ktUG9pc3NvbiByZWdyZXNzaW9uIG1vZGVsIGRvZXMgbm90IHJlcXVpcmUgdGhpcyBjb25kaXRpb24gb2YgdGhlIG1lYW4gb2YgdGhlIHJlc3BvbnNlIHZhcmlhYmxlIGVxdWFsaW5nIGl0cyB2YXJpYW5jZS4gSG93ZXZlciwgaW4gdGhlIFF1YXNzaS1Qb2lzc29uIG1vZGVsLCBvbmx5IG9uZSBzaW5nbGUgcHJlZGljdG9yIHZhcmlhYmxlIHNob3dlZCBhbnkgc3RhdGlzdGljYWwgc2lnbmlmaWNhbmNlLCBpbmRpY2F0aW5nIHRoYXQgdGhpcyBtb2RlbCBtYXkgbm90IGJlIHNpZ25pZmljYW50IGluIGl0cyBwcmVkaWN0aW9ucyBhZnRlciBhbGwuIA0KDQpBZGRpdGlvbmFsbHksIHdlIGZvdW5kIHRoYXQgb3VyIGRhdGEgaXMgc2lnbmlmaWNhbnRseSBkaXNwZXJzZWQsIHdpdGggYSBkaXNwZXJzaW9uIHBhcmFtZXRlciBvZiA0LjI0MzYsIHdoaWNoIGlzIHNpZ25pZmljYW50bHkgZGlmZmVyZW50IGZyb20gMS4gU2luY2Ugb3VyIGRhdGEgaXMgc2lnbmZpY2FudGx5IGRpc3BlcnNlZCwgaXQgaXMgbGlrZWx5IHRoYXQgYSBzdGFuZGFyZCBQb2lzc29uIHJlZ3Jlc3Npb24gbW9kZWwgaXMgbm90IHRoZSBpZGVhbCBjaG9pY2UgYXMgdGhpcyBvdmVyLWRpc3BlcnNpb24gY2FuIGxlYWQgdG8gaW5hY2NydWF0ZSByZXN1bHRzIGZyb20gdGhpcyBzdGFuZGFyZCBQb2lzc29uIHJlZ3Jlc3Npb24gbW9kZWwuIFdoZW4gdGhlIGRhdGEgaXMgc2lnbmZpY2FudGx5IGRpc3BlcnNlZCwgdGhlIFF1YXNzaS1Qb2lzc29uIHJlZ3Jlc3Npb24gbW9kZWwgc2hvdWxkIGJlIHVzZWQuIFNvLCBldmVuIHRob3VnaCB0aGUgUXVhc3NpLVBvaXNzb24gcmVncmVzc2lvbiBtb2RlbCBpbiB0aGlzIGNhc2UgZGlkIG5vdCBzaG93IHZlcnkgZ29vZCBzdGF0aXN0aWNhbCBzaWduZmljYW5jZSB3aXRoaW4gdGhlIHZhcmlhYmxlcyBmb3IgcHJlZGljdGlvbiwgaXQgaXMgbGlrZWx5IHRoZSBiZXR0ZXIgY2hvaWNlIGFzIG91ciBkYXRhIGlzIHNpZ25pZmljYW50bHkgZGlzcGVyc2VkLiANCg0KSW4gdGhlIGVuZCwgaXQgc2VlbXMgdG8gYmUgYSBjaG9pY2UgYmV0d2VlbiB0aGUgc3RhbmRhcmQgUG9pc3NvbiByZWdyZXNzaW9uIG1vZGVsIHdoaWNoIGlzIG1vcmUgc3RhdGlzdGljYWxseSBzaWduaWZpY2FudCwgYnV0IGxpa2VseSBoYXMgcG9vcmVyIGFjY3VyYWN5IGluIGl0cyBwcmVkaWN0aW9ucyBkdWUgdG8gb3Zlci1kaXNwZXJzaW9uLCBhbmQgdGhlIFF1YXNzaS1Qb2lzc29uIHJlZ3Jlc3Npb24gbW9kZWwsIHdoaWNoIHNob3dzIHdvcnNlIHN0YXRpc3RpY2FsIHNpZ25pZmljYW5jZSwgYnV0IGFjY291bnRzIGZvciBkaXNwZXJzaW9uIGFuZCBpcyBub3QgYWZmZWN0ZWQgYnkgb3VyIGRhdGEgc2V0IGZhaWxpbmcgdG8gbWVldCBhbGwgb2YgdGhlIGNvbmRpdGlvbnMgcmVxdWlyZWQgZm9yIFBvaXNzb24gcmVncmVzc2lvbi4NCg0KT3ZlcmFsbCwgSSB3b3VsZCBzYXkgdGhhdCB0aGUgUXVhc3NpLVBvaXNzb24gcmVncmVzc2lvbiBtb2RlbCBpcyB0aGUgc2FmZXIgY2hvaWNlIG9mIHRoZSB0d28sIGFzIGl0IGRvZXMgbm90IHJlcXVpcmUgdGhlIGNvbmRpdGlvbiBvZiB0aGUgbWVhbiBvZiB0aGUgcmVzcG9uc2UgdmFyaWFibGUgdG8gZXF1YWwgaXRzIHZhcmlhbmNlLCBhcyB0aGlzIHdhcyBzb21ldGhpbmcgb3VyIGRhdGEgc2V0IGZhaWxlZC4gQWRkaXRpb25hbGx5LCB1c2luZyBhIHN0YW5kYXJkIFBvaXNzb24gcmVncmVzc2lvbiBtb2RlbCBvbiBvdmVyLWRpc3BlcnNlZCBkYXRhIGNhbiBsZWFkIHRvIGluYWNjdXJhY3kgaW4gdGhlIHJlc3VsdHMgb2YgaXRzIHByZWRpY3Rpb25zLiBIb3dldmVyLCB0aGlzIFF1YXNzaS1Qb2lzc29uIHJlZ3Jlc3Npb24gbW9kZWwgc2hvd3MgbXVjaCBwb29yZXIgc2lnbmlmaWNhbmNlIHdoaWNoIG1lYW5zIHRoYXQgdGhlIHJlc3VsdHMgaXQgcHJvdmlkZXMgbWF5IG5vdCBiZSBzaWduaWZpY2FudCBhZnRlciBhbGwuIEJ1dCwgdGhlIFF1YXNzaS1Qb2lzc29uIHJlZ3Jlc3Npb24gbW9kZWwgcmVhbWlucyB0aGUgYmV0dGVyIGNob2ljZSBpbiB0aGlzIHNpdHVhdGlvbiBhcyBvdXIgZGF0YSBmYWlscyB0aGUgcmVxdWlyZWQgY29uZGl0aW9uIGZvciB0aGUgcmVzcG9uc2UgdmFyaWFibGUgdG8gYmUgYSBQb2lzc29uIHJhbmRvbSB2YXJpYWJsZSwgYW5kIHdlIGRpZCBzZWUgc2lnbmlmaWNhbnQgZGlzcGVyc2lvbiBhcyB3ZWxsLiANCg0KDQoNCiMgVmlzdWFsIENvbXBhcmlzb25zDQoNCk5vdywgbGV0J3MgbG9vayBhdCBzb21lIHZpc3VhbCBjb21wYXJpc29ucyBvZiB0aGUgZGF0YSB3aXRoaW4gb3VyIG1vZGVscy4gDQoNCkkgY2hvc2UgdG8gY3JlYXRlIGEgZ3JhcGggd2hpY2ggaWxsdXN0cmF0ZWQgdGhlIHByZWRpY3RlZCByYXRlcyBvZiB0aGUgY3ljbGlzdHMgb24gdGhlIFdpbGxpYW1zYnVyZyBCcmlkZ2UgYmFzZWQgdXBvbiB0aGUgZGF5IG9mIHRoZSB3ZWVrIGFuZCB3aGV0aGVyIG9yIG5vdCBpdCByYWluZWQgZm9yIHRoYXQgZ2l2ZW4gZGF5LiBUaGlzIGdyYXBoIHdpbGwgY3JlYXRlIHR3byBsaW5lcywgb25lIGZvciBwcmVjaXBpdGF0aW9uIChibHVlKSwgYW5kIG9uZSBmb3Igbm8gcHJlY2lwaXRhdGlvbiAocmVkKS4gDQoNCmBgYHtyfQ0KZ3JhcGggPC0gZXhwYW5kLmdyaWQoDQogIERheSA9IGN5Y2xpbmckRGF5LCANCiAgTmV3UHJlY2lwID0gY3ljbGluZyROZXdQcmVjaXAsIA0KICBBdmdUZW1wID0gbWVhbihjeWNsaW5nJEF2Z1RlbXAsIG5hLnJtID0gVFJVRSksICANCiAgVG90YWwgPSBtZWFuKGN5Y2xpbmckVG90YWwsIG5hLnJtID0gVFJVRSkgICAgICANCikNCmdyYXBoJHByZWRpY3RlZF9yYXRlIDwtIHByZWRpY3QocXVhc2ltb2RlbC5yYXRlcywgbmV3ZGF0YSA9IGdyYXBoLCB0eXBlID0gInJlc3BvbnNlIikNCg0KZ3JhcGgkTmV3UHJlY2lwIDwtIGZhY3RvcihncmFwaCROZXdQcmVjaXAsIGxldmVscyA9IGMoMCwgMSksIGxhYmVscyA9IGMoIk5vIFByZWNpcGl0YXRpb24iLCAiUHJlY2lwaXRhdGlvbiIpKQ0KDQpnZ3Bsb3QoZ3JhcGgsIGFlcyh4ID0gRGF5LCB5ID0gcHJlZGljdGVkX3JhdGUsIGNvbG9yID0gTmV3UHJlY2lwLCBncm91cCA9IE5ld1ByZWNpcCkpICsNCiAgZ2VvbV9saW5lKHNpemUgPSAxKSArICAgDQogIGdlb21fcG9pbnQoc2l6ZSA9IDIpICsgICANCiAgbGFicyh0aXRsZSA9ICJQcmVkaWN0ZWQgUmF0ZXMgb2YgdGhlIEN5Y2xpc3RzIFxuIG9uIHRoZSBXaWxsaWFtc2J1cmcgQnJpZGdlIGJ5IHRoZSBcbiBEYXkgb2YgdGhlIFdlZWsgYW5kIHRoZSBQcmVjaXBpdGF0aW9uIFxuIENvbmRpdGlvbnMiLA0KICAgICAgIHggPSAiRGF5IiwgDQogICAgICAgeSA9ICJSYXRlIG9mIEN5Y2xpc3RzIiwNCiAgICAgICBjb2xvciA9ICJQcmVjaXBpdGF0aW9uIENvbmRpdGlvbnMiKSArDQogIHRoZW1lX21pbmltYWwoKSArIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNDUsIGhqdXN0ID0gMSkpDQpgYGANCg0KQXMgd2UgY2FuIHNlZSwgdGhpcyBncmFwaCBpbGx1c3RyYXRlcyB0aGUgcHJlZGljdHMgdGhlIHJhdGUgb2YgdGhlIGN5Y2xpc3RzIG9uIHRoZSBXaWxsaWFtc2J1cmcgQnJpZGdlIG91dCBvZiBhbGwgZm91ciBvZiB0aGUgdG90YWwgbWFqb3IgTmV3IFlvcmsgYnJpZGdlcy4gVGhpcyBncmFwaCBwcmVkaWN0cyB0aGlzIHJhdGUgb2YgdGhlIGN5Y2xpc3RzIG9uIHRoZSBXaWxsaWFtc2J1cmcgQnJpZGdlIGJhc2VkIG9uIHRoZSBkYXkgb2YgdGhlIHdlZWsgYW5kIHdoZXRoZXIgdGhlcmUgd2FzIHByZWNpcGl0YXRpb24gb3Igbm90LiBUaGlzIGdyYXBoIGNyZWF0ZXMgdHdvIGxpbmVzLCBvbmUgZm9yIHByZWNpcGl0YXRpb24gKGJsdWUpLCBhbmQgb25lIGZvciBubyBwcmVjaXBpdGF0aW9uIChyZWQpLiBUaGlzIGdyYXBoIGNyZWF0ZXMgcG9pbnRzIGZvciBlYWNoIG9mIHRoZSBzZXZlbiBkYXlzIG9mIHRoZSB3ZWVrIGFuZCBmb3Igd2hldGhlciB0aGVyZSB3YXMgcHJlY2lwaWF0aW9uIG9yIG5vdCBvbiB0aG9zZSBkYXlzLg0KDQpBcyB3ZSBjYW4gc2VlIGJ5IGxvb2tpbmcgYXQgb3VyIGdyYXBoLCBpdCBpcyBwcmVkaWN0ZWQgdGhhdCB0aGUgaGlnaGVzdCByYXRlIG9mIGN5Y2xpc3RzIG9uIHRoZSBXaWxsaWFtc2J1cmcgQnJpZGdlIG9jY3VycyBvbiBTYXR1cmRheXMgd2l0aCBwcmVjaXBpdGF0aW9uLCBhbmQgdGhlIGxvd2VzdCByYXRlIG9mIGN5Y2xpc3RzIG9uIHRoZSBXaWxsaWFtc2J1cmcgQnJpZGdlIG9jY3VycyBvbiBGcmlkYXlzIHdpdGggbm8gcHJlY2lwaXRhdGlvbi4gDQoNCg0KDQoNCg0KIyBDb25jbHVzaW9uDQoNCk92ZXJhbGwsIHdlIGxvb2tlZCBhdCB2YXJpb3VzIFBvaXNzb24gcmVncmVzc2lvbiBtb2RlbHMgaW4gdGhpcyBwcm9qZWN0IHRvIHByZWRpY3QgdGhlIGZyZXF1ZW5jeSBjb3VudHMgYW5kIHRoZSByYXRlcyBvZiB0aGUgY3ljbGlzdHMgb24gdGhlIFdpbGxpYW1zYnVyZyBCcmlkZ2UuIFdlIGFsc28gbG9va2VkIGF0IGEgUXVhc3NpLVBvaXNzb24gcmVncmVzc2lvbiBtb2RlbCB0byBhY2NvdW50IGZvciB0aGUgZGlzcGVyc2lvbiBvZiB0aGUgZGF0YSBhbG9uZyB3aXRoIHRoZSB2aW9sYXRpb25zIHRoYXQgd2VyZSBzZWVuIHdoaWNoIGluZGljYXRlZCB0aGF0IGEgc3RhbmRhcmQgUG9pc3NvbiByZWdyZXNzaW9uIG1vZGVsIG1heSBub3QgYmUgdGhlIGlkZWFsIGZpdCBmb3Igb3VyIGRhdGEuDQoNCkl0IHdhcyBmb3VuZCB0aGF0IG91ciBzdGFuZGFyZCBQb2lzc29uIHJlZ3Jlc3Npb24gbW9kZWwgb24gcmF0ZXMgaGFkIHNldmVyYWwgdmFyaWFibGVzIHdoaWNoIHNob3dlZCBzdGF0aXN0aWNhbCBzaWduaWZpY2FuY2UsIGluZGljYXRpbmcgdGhhdCB0aGVzZSBwcmVkaWN0b3IgdmFyaWFibGVzIHdlcmUgc3RhdGlzdGljYWxseSBzaWduaWZpY2FudCBpbiBwcmVkaWN0aW5nIHRoZSByYXRlcyBvZiBjeWNsaXN0cyBvbiB0aGUgV2lsbGlhbXNidXJnIEJyaWRnZS4gSW4gb3VyIFF1YXNzaS1Qb2lzc29uIHJlZ3Jlc3Npb24gbW9kZWwsIG9ubHkgb25lIG9mIHRoZSBwcmVkaWN0b3IgdmFyaWFibGVzIHNob3dlZCBzdGF0aXN0aWNhbCBzaWduaWZpY2FuY2UgaW4gcHJlZGljdGluZyB0aGUgcmF0ZXMgb2YgY3ljbGlzdHMgb24gdGhlIFdpbGxpYW1zYnVyZyBCcmlkZ2UuIFRoaXMgbWFkZSBpdCBzZWVtIGxpa2UgdGhlIHN0YW5kYXJkIFBvaXNzb24gcmVncmVzc2lvbiBtb2RlbCBwcm92aWRlZCBiZXR0ZXIgc2lnbmlmaWNhbmNlIGZvciBwcmVkaWN0aW9uLg0KDQpIb3dldmVyLCB3ZSBsb29rZWQgYXQgdGhlIGRpc3BlcnNpb24gcGFyYW1ldGVyIG9mIHRoZSBRdWFzc2ktUG9pc3NvbiByZWdyZXNzaW9uIG1vZGVsIGFuZCBmb3VuZCB0aGF0IG91ciBkYXRhIGlzIGluIGZhY3Qgc2lnbmlmaWNhbnRseSBkaXNwZXJzZWQuIFRoaXMgaW5kaWNhdGVzIHRoYXQgYSBzdGFuZGFyZCBQb2lzc29uIHJlZ3Jlc3Npb24gbW9kZWwgaXMgbGlrZWx5IG5vdCBhbiBpZGVhbCBjaG9pY2UgZHVlIHRvIGl0IG5vdCBhY2NvdW50aW5nIGZvciB0aGlzIG92ZXItZGlzcGVyc2lvbiB3aGljaCBjYW4gbGVhZCB0byBpbm5hY3VyeSBpbiB0aGUgcmVzdWx0cyBvZiBpdHMgcHJlZGljdGlvbi4gVGhpcyBvdmVyLWRpc3BlcnNpb24gYWxvbmcgd2l0aCB0aGUgZmFjdCB0aGF0IG91ciBkYXRhIHNldCB2aW9sYXRlZCB0aGUgY29uZGl0aW9uIG9mIHRoZSBtZWFuIG9mIHRoZSByZXNwb25zZSB2YXJpYWJsZSBlcXVhbGluZyBpdHMgdmFyaWFuY2UsIHNob3dlZCB0aGF0IHRoZSBzdGFuZGFyZCBQb2lzc29uIHJlZ3Jlc3Npb24gbW9kZWwgaXMgbm90IGFuIGlkZWFsIGNob2ljZSBhZnRlciBhbGwuIER1ZSB0byB0aGlzIHNpZ25pZmljYW50IGRpc3BlcnNpb24sIHRoZSBRdWFzc2ktUG9pc3NvbiByZWdyZXNzaW9uIG1vZGVsIHdvdWxkIGJlIHRoZSBiZXR0ZXIgYW5kIHNhZmVyIGNob2ljZSB0aGFuIHRoZSBzdGFuZGFyZCByZWdyZXNzaW9uIG1vZGVsLCBkZXNwaXRlIGl0IGhhdmluZyBsZXNzIHN0YXRpc3RpY2FsbHkgc2lnbmlmaWNhbnQgdmFyaWFibGVzLiBFdmVuIHRob3VnaCB0aGUgUXVhc3NpLVBvaXNzb24gcmVncmVzc2lvbiBtb2RlbCB3YXMgbGVzcyBzdGF0aXN0aWNhbGx5IHNpZ25pZmljYW50LCBpdCBwcm92aWRlcyBiZXR0ZXIgYWNjdXJhY3kgZHVlIHRvIHRoZSBkYXRhIGJlaW5nIGRpc3BlcnNlZCwgZXZlbiB0aG91Z2ggaXQgc2hvd3MgdGhhdCB0aGUgbWFqb3JpdHkgb2YgdGhlIHByZWRpY3RvciB2YXJpYWJsZXMgd2VyZSBub3Qgc3RhdGlzdGNpYWxseSBzaWduaWZpY2FudCBpbiB0aGVpciBwcmVkaWN0aW9uIG9mIHRoZSByYXRlcyBvZiBjeWNsaXN0cyBvbiB0aGUgV2lsbGlhbXNidXJnIEJyaWRnZS4gDQoNCg0KIyMgUmVjb21tZW5kYXRpb25zIA0KDQoNClNvbWUgcmVjb21tZW5kYXRpb25zIEkgd291bGQgbWFrZSBmb3IgZnV0dXJlIHByb2plY3RzIGluY2x1ZGU6DQoNCiogTG9vayBmdXJ0aGVyIGludG8gdGhlIHZpb2xhdGlvbiB0aGF0IHdhcyBmb3VuZCB3aXRoaW4gdGhpcyBkYXRhIHNldCBhbmQgbG9vayBpbnRvIHBvc3NpYmxlIGV4cGxhbmF0aW9ucyBmb3Igd2h5IHRoaXMgdmlvbGF0aW9uIG9jY3VycmVkLiBJdCB3YXMgZm91bmQgdGhhdCB0aGUgbWVhbiBvZiB0aGUgcmVzcG9uc2UgdmFyaWFibGUgaXMgbm90IGVxdWFsIHRvIGl0cyB2YXJpYW5jZSwgd2hpY2ggdmlvbGF0ZXMgb25lIG9mIHRoZSBuZWNlc3NpdGllcyBvZiBhIFBvaXNzb24gcmVncmVzc2lvbiBtb2RlbC4gSXQgc2hvdWxkIGJlIGZ1cnRoZXIgY29uc2lkZXJlZCB3aGV0aGVyIGEgUG9pc3NvbiByZWdyZXNzaW9uIG1vZGVsIGluIGZhY3QgaXMgdGhlIGJlc3QgY2hvaWNlIGZvciB0aGlzIGRhdGEgc2V0IGFuZCBpZiBpdCBpcyBzdWZmaWNpZW50IHRvIHVzZSB0aGlzIG1vZGVsIGZvciBwcmVkaWN0aW9uIGRlc3BpdGUgdGhlc2UgdmlvbGF0aW9ucy4NCg0KKiBDb25zaWRlciBvdGhlciB2YXJpYWJsZXMgd2hpY2ggbWF5IGFmZmVjdCB0aGUgbnVtYmVyIG9mIGN5Y2xpc3RzIG91dCBvbiBhIGdpdmVuIG9ic2VydmF0aW9uLiBQZXJoYXBzIHRoZXJlIGFyZSBvdGhlciBmYWN0b3JzIHdoaWNoIG1heSBwcm92aWRlIGZ1cnRoZXIgc2lnbmlmaWNhbmNlIGZvciBtb2RlbCBidWlsZGluZyB3aGljaCBtYXkgc3RyZW5ndGhlbiB0aGUgcmVncmVzc2lvbiBtb2RlbC4gRm9yIGluc3RhbmNlLCBtYXliZSBhIHZhcmlhYmxlIGxvb2tpbmcgYXQgd2hldGhlciB0aGVyZSBhcmUgYW55IGhvbGlkYXlzIG9yIG90aGVyIG5vdGFibGUgZXZlbnRzIG9jY3VycmluZyBvbiB0aGUgZGF5IG9mIGEgZ2l2ZW4gb2JzZXJ2YXRpb24gY291bGQgYmUgdXNlZnVsLiBUaGlzIGNvdWxkIGJlIGEgYmluYXJ5IHByZWRpY3RvciB2YXJpYWJsZSB3aXRoIGEgdmFsdWUgb2YgMSBpZiB0aGVyZSBhcmUgYW55IGV2ZW50cyBvciBob2xpZGF5cywgYW5kIGEgdmFsdWUgb2YgMCBpZiB0aGVyZSBhcmUgbm90LiBUaGlzIGNvdWxkIHBlcmhhcHMgYmUgdXNlZnVsIGFzIHRoZXJlIG1heSB0ZW5kIHRvIGJlIGxlc3MgY3ljbGlzdHMgb3V0IGlmIHRoZXJlIGlzIGEgbWFqb3IgaG9saWRheSBvciBhbiBldmVudCBvY2N1cnJpbmcgaW4gdGhlIGNpdHkgb24gdGhhdCBnaXZlbiBvYnNlcnZhdGlvbi4NCg0KKiBGdXJ0aGVyIGV4cGFuZCB0aGUgZGF0YSBzZXQgdG8gZW5zdXJlIHRoZSBhY2N1cmFjeSBvZiB0aGUgcHJlZGljdGlvbnMgYW5kIHRvIGZ1cnRoZXIgc3RyZW5ndGhlbiB0aGUgUG9pc3NvbiByZWdyZXNzaW9uIG1vZGVscy4gQnkgY29sbGVjdGluZyBtb3JlIG9ic2VydmF0aW9ucyBvdmVyIGEgbG9uZ2VyIHBlcmlvZCBvZiB0aW1lLCB0aGlzIGNvdWxkIGhlbHAgdG8gZnVydGhlciBzdHJlbmdodGVuIHRoZSBQb2lzc29uIHJlZ3Jlc3Npb24gbW9kZWxzIGFyZSBwcm92aWRlIGJldHRlciBhY2N1cmFjeSBhbmQgcmVsaWFiaWxpdHkgaW4gdGhlIHJlc3VsdHMgZm91bmQgYnkgdGhlIG1vZGVsIGJ1aWxkaW5nIHByb2Nlc3MuIFRoaXMgd291bGQgaGVscCBzdHJlbmd0aGVuIHRoZSBjb25jbHVzaW9ucyBhbmQgZmluZGluZ3MgZm91bmQgaW4gdGhlIHByb2Nlc3Mgb2YgYnVsZGluZyB0aGUgUG9pc3NvbiByZWdyZXNzaW9uIG1vZGVscyBvZiB0aGlzIGRhdGEgc2V0LiAgDQo=