Introduction

Codebook

Variable name Description
year Year
state State Name
county_name County Name
region Region of county (Midwest, Northeast, South, West)
urbanicity Location category of county (rural, small/mid, suburban, urban)
total_pop Population Count, All Ages
black_pop_16to64 Black Population Count, Ages 15 to 64
white_pop_15to64 White Population Count, Ages 15 to 64
black_jail_pop Jail Population Count, Black
white_jail_pop Jail Population Count, White
black_prison_pop Prison Population Count, Black
white_prison_pop Prison Population Count, White
urbanicity_binary Location category of county (rural, urban)
race Proportion of black to white
Race Black and white jail populations
rvb Red and Blue states (2006)

Note: This data set was used in Info201, in that class this data set was used for DYLPR and ggplot practice. In this project we are using completely different methods, such as linear regression and hypothesis testing, to analyze the data.

Relevance: The United States has the highest incarceration rate in the world. Since 1970, the incarcerated population in the United States has increased by 700%. Furthermore, there are wide spread racial disparities in mass incarceration in the United States, with black and latinx individuals at the epicenter of the issue.

Where the data came from: This data set measures various statistics about incarceration in the United States of America, it includes 153811 rows and 121 columns. The data set came from the Vera Institute of Justice and it was recently updated in 2020 using the the Census of Jails, which records statistics about all jails in the United States in America and is conducted every 5 years since 1970, and the Annual Survey of Jails, which contains data about one-third of jails in America conducted since 1982.

Research Questions: We broadly wanted to explore whether race and incarceration are related in the United States of America. Furthermore, we wanted to explore the regional incarceration dynamics of the United States. First, we tested whether the South has a higher jail population. Next, we tested whether or not red states have a higher proportion of black incarcerated individuals. Next, we predicted Black jail population based on various numerical and categorical predictors. Lastly, wanted to see if the relationship between incarceration and race is affected by urbanicity.

Analysis

Is it True that the South Region has the Highest Jail Population?

Region variable contains the part of the geography of the United States. Under Region there was Midwest, Northeast, South, and West. According to the Prison Policy Initiative, states in the South have a higher jail population than the rest of the United States. Therefore, we were curious if we could find evidence to support this statement.

The first step is to find the proportion of the jail population in the South region. Since the Region contained four different levels, and we are only interested in making inferences about the South. So, it is critical to decoding Region as a binary variable called South, that takes the values of yes or no. Now we have the following summary for the percentage of people who are in jail in the South region.

## # A tibble: 2 × 3
##   South     n  prop
##   <chr> <int> <dbl>
## 1 no    84133 0.547
## 2 yes   69678 0.453

Not only that, but we are also interested to find out if our data will provide evidence in the population represented by the sample, in which the proportion of jail population in the South region is greater than 40%.

And the null hypothesis is the claim that the jail population in the South region is in fact 40% or less than 40%.

And the alternative hypothesis is the claim of the jail population in the South region is greater than 40%.

Below is a histogram of the simulation-based distribution of the proportion we should expect to see when the null hypothesis is true. By using the option draw from infer that allows us to simulate the null. It is worth noting that, the observed sample proportion of people who were in jail in the South region is 45%, which is shown in a red vertical line.

## # A tibble: 1 × 1
##   p_value
##     <dbl>
## 1       0

Since our p-value is super small. Therefore, we can conclude that our data is provided resounding evidence against the null hypothesis. And in favor of the alternative hypothesis. And the data is being sampled from is supporting the statement that there is more than 40% of the jail population of the United States is in the South region.

Predicting Black Jail Population from Ubanicity, region, and total Black Population

We wanted to see which variables in this data set the Black jail population was closely correlated with. In order to do so, we first visualized the relationship between the black jail population and two other numerical predictor variables.

Pairwise plot 1

This pairwise plot visualizes relationship between the numerical variables: black_jail_pop and total_pop.

Pairwise plot 2

This pairwise plot visualizes relationship between the numerical variables: black_jail_pop and black_pop_15to64. Due to outlines, we filtered the data to only include the total_pop variable and the black_jail_pop values under 300,000 in the plots. Each model showed a relationship, so we formulated and compared two main effects models using a numerical predictor in each one.

The first main effects model used black_jail_pop as the response variable, and division, total_pop, and urbanicity_binary as predictor variables. The variable urbancity_binary divides the urbanicity variable into two categories: urban and rural. From testing the data, we received a value of 0.649 for the adjusted r^2 value and 215.412 for the root mean square error(Rmse).

The second main effects model also used black_jail_pop as the response variable, and the variables black_pop_15to64,urbanicity_binary, andregionas predictors. From testing the data, we got0.839as the adjusted r^2 value and167.161` as the Rmse.

We selected second main effects model to proceed with as it had a higher value for adjusted r^2 and a lower Rmse. Next, we compared the second main effects model with an interaction effects model with the same variables. Testing the interaction effects model returned 0.866 for the adjusted r^2 value and 155.22 for the Rmse. We decided to fit the linear model to the main effects model because the small differences in the adjusted r^2 and Rmse values was not enough to justify the added complexity of an interaction effects model.

## # A tibble: 6 × 2
##   term                   estimate
##   <chr>                     <dbl>
## 1 (Intercept)             1.21   
## 2 black_pop_15to64        0.00788
## 3 urbanicity_binaryUrban 73.2    
## 4 regionNortheast        48.2    
## 5 regionSouth            33.0    
## 6 regionWest             17.6

^black_jail_pop = 1.212 + 0.008 * black_pop_15to64 + 73.178 * urbanicity_binaryUrban + 48.173 * regionNortheast + 32.959 * regionSouth + 17.577*regionWest

The intercept of the model is 1.212, meaning that if a county has a black population (15-64) of 0, is in a rural area, and is located in the Midwest; then the black prison population will be 1.212. 0.008 is the slope of black_pop_15to64; so holding every thing else constant, increasing the black_pop_15to64 by 1, increases the black_jail_pop by 0.008. The slope of urbanicity_binaryUrban is 73.178; holding everything else constant, when a county is in an Urban location, the black_jail_pop increases by 73.178. 48.173 is the slope of regionNortheast; holding everything else constant, if a county is in the NorthEast region of the United States, the black_jail_pop increases by 48.173. The slope of regionSouth is 32.959, meaning that if all other variables are held constant, if a county is in the Southern region of the United States, the black_jail_pop increases by 32.959. The slope of regionWest is 17.577; holding everything else constant, if a county is in the West, the black_jail_pop increases by 17.577.

Does urbanicity affect incarceration rate?

In answering our general research question, whether race and incarceration are independent of each other, we wanted to see if this relationship between incarceration and race is affected by urbanicity. In order to test the relationship, we created a hypothesis that asks whether urbanicity and incarceration by race are dependent variables. With our hypothesis, we tested the null hypothesis, created a visualization for our hypothesis, and calculated the confidence intervals for each race in urban counties.

Null Hypothesis

In order to determine whether or not we can reject the null hypothesis, we calculated and visualized the null distribution and calculated the p-value. This null hypothesis test required creating two new variables from urbanicity, whtie_jail_pop, and black_jail_pop in the dataset. The first new variable, urban, determined whether the county was urban or not (rural, small/mid, or suburban). The second variable, bgw, determined whether black_jail_pop was greater than white_jail_pop or not in a given county. black indicated that the black_jail_pop was greater than the white_jail_pop in that county, and white indicated that the white_jail_pop was greater than the black_jail_pop in that county. Overall these two new variables made it possible to separate the data among two categories within urban counties and other counties. The difference in proportions was calculated from the prop of black (greater black jail population than white jail population) in urban counties and other counties. Based on the null distribution, there is a p-value of 0 which indicates that urbanicity and incarceration by race are dependent variables.

Visualization

After rejecting the null hypothesis, we visualized the connection between urbanicity and rate of incarceration by race. We combined small/mid and rural into rural, and urban/suburban in urban, by doing so, we were able to create a visualization with average jail populations separated by urbanicity and race. Our visualization is concurrent with the proportions we calculated in our null hypothesis test because it is apparent that the average black jail population in urban counties are significantly higher than the white jail population. The opposite is true for rural counties. This difference in rate of incarceration separated by race in urban and rural counties indicates that urbanicity and race are dependent variables.

Confidence Level

By calculating the confidence intervals for black_jail_pop and white_jail_pop in urban counties, we were able to find that 1315.186 to 2328.748 incarcerated individuals in urban counties are black and 811.4496 to 1381.816 incarcerated individuals are white which is lower than rate of black incarceration. We calculated the confidence intervals for both black_jail_pop and white_jail_pop at a 99% confidence interval. While these two confidence intervals are large ranges, they are reasonable since population varies among counties. The confidence intervals are also conclusive with our hypothesis that incarceration by race and urbanicity are related.

Do red states have a higher proportion of black jail population?

Null Hypothesis

Based on one of our other research questions, “Does urbanicity affect incarceration rate?” we discovered that the variables urbanicity and incarceration by race are dependent to each other. As well as there is higher proportion of black jail population than white jail population in urban countries. Which led us to wonder if the political party of state would affect the proportion of jail population.

In order to further research our question, we decided to test the null hypothesis. We created a null hypothesis that asked whether both state politcal party and incarcerated population by state were independent. To test our null hypothesis, we decided create two new variables race, when black_jail_pop is greater than white_jail_pop it would known as black , and if it was black_jail_pop is less than white_jail_pop it would be known as white, similar to what we had used in our urbanicity research analysis. We also created a variable that determined whether the state was a red state or a blue state based on the 2006 election stats.

## # A tibble: 1 × 1
##   p_value
##     <dbl>
## 1    0.74

Based on our null distribution and visualization, it is apparent that the p-value of 0.74 is too high to reject the null hypothesis. Our conclusion at a 5% level of significance is that the two variables, race(incarceration proportions by race) and rvb (red vs blue state), are not dependent of each other. This prompted the end of our research because the variables used to determine the states political party are not significant enough to be related to incarceration rates.

Conclusion

Since person did our own separate analysis of the data we decided to write a separate summary for each section

Hypothesis Testing for the South Region Jail Population

There was a variable called Region in the data set. Which contains Midwest, Northeast, South, and West. After seeing this variable, it eager us to find out which region has the highest jail population in the entire country. To be more specific, we are interested to know more about the South region of the United States due to its complex history and what has happened in the past that might contribute to its jail population. And we wanted to test whether or not the jail population in the South region is accounting for 40% of the whole country’s jail population.

Our null hypothesis suggested that the jail population in the South is exactly 40%. And our alternative hypothesis claimed that the jail population in the South region is greater than 40%. We found that 69.678 is the total jail population in the South, while the jail population of the others 3 regions combined was 84.133 people. And the proportion of the jail population in the South region was ~45%. By using the hypothesis testing method, we were able to visualize the null distribution. And our p-value turned out to be 0. Which means that the data set is supporting the alternative hypothesis, and confirmed the jail population in the South region is accounting for more than 40% of the jail population in the United States.

Linear Model Summary

In our exploration of the variable black_jail_pop through a linear model, we were able to gleam some insight into contributing factors to the black incarcerated population in the United States. Out of the predictor variables that we included in our model, the top two contributing predictor variables were urbanicity_binaryUrban, with a coefficient of 73.178 and regionNortheast, with a coefficient of 48.173. So, this means that the black jail population in a country in the United States is most increased if the county is urban and in the Northeast. Alleviating the root causes of these main contributing predictors to the black jail population in the United States could be a pivotal step in combating racial inequality in the justice system. In the future, I would like to obtain a similar data set with more categorical variables to compare and test more linear models and hopefully obtain a more accurate model.

Urbanicity vs Incarceration by Race

From our research, we found that urbanicity does in fact explain incarceration rates by race. In the two tests and one visualization we created, each resulted in a trend that describes our reserach question. The null hypothesis test gave us a p-value of 0 which allowed us to reject the null hypothesis. Running the null hypothesis test also gave us the proportion of black vs white in urban counties. Roughly 72% of urban counties had a higher black incarceration rate compared to the white incarceration rate. We then created a visualization using the average black_jail_pop and the average white_jail_pop which was also conclusive with the proportions calculated in the null hypothesis test. Even though our dodged bar chart was enough to show that urbanicity and incarceration by race are related, we still wanted to calculate how many individuals, on average, are incarcerated to see how many more black individuals are incarcerated. By finding the confidence interval for each race in urban counties, we found that there is a trend of up to 1000 more black individuals incarcerated in urban counties compared to white individuals. Overall, we were able to answer our question that both urbanicity and incarceration by race are dependent variables.

Political Party vs Incarceration

Generating two different variables using the case_when function, we were able to separate the states by their political party and the races by the proportion of black to white incarceration. With using these variables in our research, we found that there is in fact no connection between these variables. We ran the hypothesis test and receive a p-value of 0.74 which meant that there is a likelihood of 74% of the data could have occurred under the null hypothesis. We also created a visualization of the null distribution and shaded in the p-value from both sides. Since a majority of the distribution was shaded in from both sides, it was conclusive that the two variables were independent of each other. In conclusion, we found that proportion of incarceration by race and state political party are not related to one another.

Data Summary

We feel that the dataset we used is relatively reliable as it was compiled using the government datasets compiled by the Bureau of Justice Statistics (BJS). The two data sets compiled in this data set are The Census of Jails and the Annual Survey of Jails. However, a non-governmental non-profit called, Vera Institute of Justice, compiled the data and they made have made small mistakes doing so.

LS0tCnRpdGxlOiAiSW5jYXJjZXJhdGlvbiBUcmVuZHMgaW4gdGhlIFUuUy4iCmF1dGhvcjogIkRvYW4gVHJhbiwgSXNoYSBOYXJheWFuYW4sIEplbm5pZSBOZ3V5ZW4sIEtheWxlZSBIYSIKZGF0ZTogImByIFN5cy5EYXRlKClgIgpvdXRwdXQ6IG9wZW5pbnRybzo6bGFiX3JlcG9ydAotLS0KCmBgYHtyIGxvYWQtcGFja2FnZXMsIG1lc3NhZ2U9RkFMU0UsIGluY2x1ZGU9RkFMU0V9CmxpYnJhcnkodGlkeXZlcnNlKQpsaWJyYXJ5KG9wZW5pbnRybykKbGlicmFyeShpbmZlcikKbGlicmFyeShicm9vbSkKbGlicmFyeShsdWJyaWRhdGUpCmxpYnJhcnkodGlkeW1vZGVscykKCgppbmNhcmNlcmF0aW9ucyA8LSByZWFkX2NzdihmaWxlPSJpbmNhcmNlcmF0aW9uX3RyZW5kcy5jc3YiLCBzaG93X2NvbF90eXBlcyA9IEYpCmBgYAoKYGBge3IgZmlsdGVyIGRhdGEsIGluY2x1ZGU9RkFMU0UsIG1lc3NhZ2U9RkFMU0V9CiNGT1IgTElORUFSIE1PREVMIApjbGVhbl9pbmNhcmNlcmF0aW9ucyA8LSBpbmNhcmNlcmF0aW9ucyAlPiUKICBzZWxlY3QoeWVhciwgc3RhdGUsIGNvdW50eV9uYW1lLCByZWdpb24sIHVyYmFuaWNpdHksIHRvdGFsX3BvcCwgYmxhY2tfcG9wXzE1dG82NCwgd2hpdGVfcG9wXzE1dG82NCwgZGl2aXNpb24sIHRvdGFsX3BvcCwgYmxhY2tfamFpbF9wb3AsIHdoaXRlX2phaWxfcG9wLCAgYmxhY2tfcHJpc29uX3BvcCwgd2hpdGVfcHJpc29uX3BvcCkgJT4lCiAgZmlsdGVyKHllYXIgPT0gIjIwMDYiKSAlPiUKICBtdXRhdGUodXJiYW5pY2l0eV9iaW5hcnkgPSBjYXNlX3doZW4oICAgCiAgICAgICAgICAgdXJiYW5pY2l0eSA9PSAicnVyYWwiIHwgdXJiYW5pY2l0eSA9PSAic21hbGwvbWlkIiB+ICJSdXJhbCIsCiAgICAgICAgICAgdXJiYW5pY2l0eSA9PSAic3VidXJiYW4iIHwgdXJiYW5pY2l0eSA9PSAidXJiYW4iIH4gIlVyYmFuIikpCmBgYAoKIyMgSW50cm9kdWN0aW9uCgoqKkNvZGVib29rKioKClZhcmlhYmxlIG5hbWUgICAgIHwgRGVzY3JpcHRpb24KLS0tLS0tLS0tLS0tLS0tLS0gfCAtLS0tLS0tLS0tLS0KeWVhciAgICAgICAgICAgICAgfCBZZWFyCnN0YXRlICAgICAgICAgICAgIHwgU3RhdGUgTmFtZQpjb3VudHlfbmFtZSAgICAgICB8IENvdW50eSBOYW1lCnJlZ2lvbiAgICAgICAgICAgIHwgUmVnaW9uIG9mIGNvdW50eSAoTWlkd2VzdCwgTm9ydGhlYXN0LCBTb3V0aCwgV2VzdCkKdXJiYW5pY2l0eSAgICAgICAgfCBMb2NhdGlvbiBjYXRlZ29yeSBvZiBjb3VudHkgKHJ1cmFsLCBzbWFsbC9taWQsIHN1YnVyYmFuLCB1cmJhbikKdG90YWxfcG9wICAgICAgICAgfCBQb3B1bGF0aW9uIENvdW50LCBBbGwgQWdlcwpibGFja19wb3BfMTZ0bzY0ICB8IEJsYWNrIFBvcHVsYXRpb24gQ291bnQsIEFnZXMgMTUgdG8gNjQKd2hpdGVfcG9wXzE1dG82NCAgfCBXaGl0ZSBQb3B1bGF0aW9uIENvdW50LCBBZ2VzIDE1IHRvIDY0CmJsYWNrX2phaWxfcG9wICAgIHwgSmFpbCBQb3B1bGF0aW9uIENvdW50LCBCbGFjawp3aGl0ZV9qYWlsX3BvcCAgICB8IEphaWwgUG9wdWxhdGlvbiBDb3VudCwgV2hpdGUKYmxhY2tfcHJpc29uX3BvcCAgfCBQcmlzb24gUG9wdWxhdGlvbiBDb3VudCwgQmxhY2sKd2hpdGVfcHJpc29uX3BvcCAgfCBQcmlzb24gUG9wdWxhdGlvbiBDb3VudCwgV2hpdGUKdXJiYW5pY2l0eV9iaW5hcnkgfCBMb2NhdGlvbiBjYXRlZ29yeSBvZiBjb3VudHkgKHJ1cmFsLCB1cmJhbikKcmFjZSAgICAgICAgICAgICAgfCBQcm9wb3J0aW9uIG9mIGJsYWNrIHRvIHdoaXRlClJhY2UgICAgICAgICAgICAgIHwgQmxhY2sgYW5kIHdoaXRlIGphaWwgcG9wdWxhdGlvbnMKcnZiICAgICAgICAgICAgICAgfCBSZWQgYW5kIEJsdWUgc3RhdGVzICgyMDA2KQoKCioqTm90ZSoqOgpUaGlzIGRhdGEgc2V0IHdhcyB1c2VkIGluIEluZm8yMDEsIGluIHRoYXQgY2xhc3MgdGhpcyBkYXRhIHNldCB3YXMgdXNlZCBmb3IgRFlMUFIgYW5kIGdncGxvdCBwcmFjdGljZS4gSW4gdGhpcyBwcm9qZWN0IHdlIGFyZSB1c2luZyBjb21wbGV0ZWx5IGRpZmZlcmVudCBtZXRob2RzLCBzdWNoIGFzIGxpbmVhciByZWdyZXNzaW9uIGFuZCBoeXBvdGhlc2lzIHRlc3RpbmcsIHRvIGFuYWx5emUgdGhlIGRhdGEuIAoKKipSZWxldmFuY2UqKjoKVGhlIFVuaXRlZCBTdGF0ZXMgaGFzIHRoZSBoaWdoZXN0IGluY2FyY2VyYXRpb24gcmF0ZSBpbiB0aGUgd29ybGQuIFNpbmNlIDE5NzAsIHRoZSBpbmNhcmNlcmF0ZWQgcG9wdWxhdGlvbiBpbiB0aGUgVW5pdGVkIFN0YXRlcyBoYXMgaW5jcmVhc2VkIGJ5IDcwMCUuIEZ1cnRoZXJtb3JlLCB0aGVyZSBhcmUgd2lkZSBzcHJlYWQgcmFjaWFsIGRpc3Bhcml0aWVzIGluIG1hc3MgaW5jYXJjZXJhdGlvbiBpbiB0aGUgVW5pdGVkIFN0YXRlcywgd2l0aCBibGFjayBhbmQgbGF0aW54IGluZGl2aWR1YWxzIGF0IHRoZSBlcGljZW50ZXIgb2YgdGhlIGlzc3VlLiAKCioqV2hlcmUgdGhlIGRhdGEgY2FtZSBmcm9tKio6ClRoaXMgZGF0YSBzZXQgbWVhc3VyZXMgdmFyaW91cyBzdGF0aXN0aWNzIGFib3V0IGluY2FyY2VyYXRpb24gaW4gdGhlIFVuaXRlZCBTdGF0ZXMgb2YgQW1lcmljYSwgaXQgaW5jbHVkZXMgMTUzODExIHJvd3MgYW5kIDEyMSBjb2x1bW5zLiBUaGUgZGF0YSBzZXQgY2FtZSBmcm9tIHRoZSBWZXJhIEluc3RpdHV0ZSBvZiBKdXN0aWNlIGFuZCBpdCB3YXMgcmVjZW50bHkgdXBkYXRlZCBpbiAyMDIwIHVzaW5nIHRoZSB0aGUgQ2Vuc3VzIG9mIEphaWxzLCB3aGljaCByZWNvcmRzIHN0YXRpc3RpY3MgYWJvdXQgYWxsIGphaWxzIGluIHRoZSBVbml0ZWQgU3RhdGVzIGluIEFtZXJpY2EgYW5kIGlzIGNvbmR1Y3RlZCBldmVyeSA1IHllYXJzIHNpbmNlIDE5NzAsIGFuZCB0aGUgQW5udWFsIFN1cnZleSBvZiBKYWlscywgd2hpY2ggY29udGFpbnMgZGF0YSBhYm91dCBvbmUtdGhpcmQgb2YgamFpbHMgaW4gQW1lcmljYSBjb25kdWN0ZWQgc2luY2UgMTk4Mi4gCgoqKlJlc2VhcmNoIFF1ZXN0aW9ucyoqOgpXZSBicm9hZGx5IHdhbnRlZCB0byBleHBsb3JlIHdoZXRoZXIgcmFjZSBhbmQgaW5jYXJjZXJhdGlvbiBhcmUgcmVsYXRlZCBpbiB0aGUgVW5pdGVkIFN0YXRlcyBvZiBBbWVyaWNhLiBGdXJ0aGVybW9yZSwgd2Ugd2FudGVkIHRvIGV4cGxvcmUgdGhlIHJlZ2lvbmFsIGluY2FyY2VyYXRpb24gZHluYW1pY3Mgb2YgdGhlIFVuaXRlZCBTdGF0ZXMuIEZpcnN0LCB3ZSB0ZXN0ZWQgd2hldGhlciB0aGUgU291dGggaGFzIGEgaGlnaGVyIGphaWwgcG9wdWxhdGlvbi4gTmV4dCwgd2UgdGVzdGVkIHdoZXRoZXIgb3Igbm90IHJlZCBzdGF0ZXMgaGF2ZSBhIGhpZ2hlciBwcm9wb3J0aW9uIG9mIGJsYWNrIGluY2FyY2VyYXRlZCBpbmRpdmlkdWFscy4gTmV4dCwgd2UgcHJlZGljdGVkIEJsYWNrIGphaWwgcG9wdWxhdGlvbiBiYXNlZCBvbiB2YXJpb3VzIG51bWVyaWNhbCBhbmQgY2F0ZWdvcmljYWwgcHJlZGljdG9ycy4gTGFzdGx5LCB3YW50ZWQgdG8gc2VlIGlmIHRoZSByZWxhdGlvbnNoaXAgYmV0d2VlbiBpbmNhcmNlcmF0aW9uIGFuZCByYWNlIGlzIGFmZmVjdGVkIGJ5IHVyYmFuaWNpdHkuCgoKYGBge3IsIGluY2x1ZGUgPSBGQUxTRSwgbWVzc2FnZSA9IEZBTFNFfQppbmNhcmNlcmF0aW9ucyAlPiUgbmNvbCgpCgppbmNhcmNlcmF0aW9ucyAlPiUgbnJvdygpCmBgYAoKIyMgQW5hbHlzaXMKCiMjIyBJcyBpdCBUcnVlIHRoYXQgdGhlIFNvdXRoIFJlZ2lvbiBoYXMgdGhlIEhpZ2hlc3QgSmFpbCBQb3B1bGF0aW9uPwoKYGBge3IsIGluY2x1ZGUgPSBGQUxTRX0KaW5jYXJjZXJhdGlvbnMgJT4lCiAgY291bnQocmVnaW9uKSAlPiUKICBtdXRhdGUocHJvcD1uL3N1bShuKSkKYGBgCgpgUmVnaW9uYCB2YXJpYWJsZSBjb250YWlucyB0aGUgcGFydCBvZiB0aGUgZ2VvZ3JhcGh5IG9mIHRoZSBVbml0ZWQgU3RhdGVzLiBVbmRlciBgUmVnaW9uYCB0aGVyZSB3YXMgTWlkd2VzdCwgTm9ydGhlYXN0LCBTb3V0aCwgYW5kIFdlc3QuIEFjY29yZGluZyB0byB0aGUgW1ByaXNvbiBQb2xpY3kgSW5pdGlhdGl2ZV0oaHR0cHM6Ly93d3cucHJpc29ucG9saWN5Lm9yZy9nbG9iYWwvMjAyMS5odG1sKSwgc3RhdGVzIGluIHRoZSBTb3V0aCBoYXZlIGEgaGlnaGVyIGphaWwgcG9wdWxhdGlvbiB0aGFuIHRoZSByZXN0IG9mIHRoZSBVbml0ZWQgU3RhdGVzLiBUaGVyZWZvcmUsIHdlIHdlcmUgY3VyaW91cyBpZiB3ZSBjb3VsZCBmaW5kIGV2aWRlbmNlIHRvIHN1cHBvcnQgdGhpcyBzdGF0ZW1lbnQuCgpUaGUgZmlyc3Qgc3RlcCBpcyB0byBmaW5kIHRoZSBwcm9wb3J0aW9uIG9mIHRoZSBqYWlsIHBvcHVsYXRpb24gaW4gdGhlIFNvdXRoIHJlZ2lvbi4gU2luY2UgdGhlIGBSZWdpb25gIGNvbnRhaW5lZCBmb3VyIGRpZmZlcmVudCBsZXZlbHMsIGFuZCB3ZSBhcmUgb25seSBpbnRlcmVzdGVkIGluIG1ha2luZyBpbmZlcmVuY2VzIGFib3V0IHRoZSBTb3V0aC4gU28sIGl0IGlzIGNyaXRpY2FsIHRvIGRlY29kaW5nIGBSZWdpb25gIGFzIGEgYmluYXJ5IHZhcmlhYmxlIGNhbGxlZCBTb3V0aCwgdGhhdCB0YWtlcyB0aGUgdmFsdWVzIG9mIHllcyBvciBuby4gTm93IHdlIGhhdmUgdGhlIGZvbGxvd2luZyBzdW1tYXJ5IGZvciB0aGUgcGVyY2VudGFnZSBvZiBwZW9wbGUgd2hvIGFyZSBpbiBqYWlsIGluIHRoZSBTb3V0aCByZWdpb24uCgoKYGBge3IsIGVjaG8gPSBGQUxTRSwgbWVzc2FnZSA9IEZBTFNFfQojIENhbGN1bGF0aW5nIHRoZSBwcm9wb3J0aW9uIG9mIGphaWwgcG9wdWxhdGlvbiBpbiB0aGUgU291dGggcmVnaW9uLgppbmNhcmNlcmF0aW9ucyA8LSBpbmNhcmNlcmF0aW9ucyAlPiUgCiAgICAgICAgbXV0YXRlKCBTb3V0aCA9IGlmZWxzZShyZWdpb24gPT0gIlNvdXRoIiwgInllcyIsICJubyIpICkKCmluY2FyY2VyYXRpb25zICU+JSAKICBjb3VudChTb3V0aCkgJT4lIAogIG11dGF0ZShwcm9wPW4vc3VtKG4pKQpgYGAKCk5vdCBvbmx5IHRoYXQsIGJ1dCB3ZSBhcmUgYWxzbyBpbnRlcmVzdGVkIHRvIGZpbmQgb3V0IGlmIG91ciBkYXRhIHdpbGwgcHJvdmlkZSBldmlkZW5jZSBpbiB0aGUgcG9wdWxhdGlvbiByZXByZXNlbnRlZCBieSB0aGUgc2FtcGxlLCBpbiB3aGljaCB0aGUgcHJvcG9ydGlvbiBvZiAgamFpbCBwb3B1bGF0aW9uIGluIHRoZSBTb3V0aCByZWdpb24gaXMgZ3JlYXRlciB0aGFuIDQwJS4KCkFuZCB0aGUgbnVsbCBoeXBvdGhlc2lzIGlzIHRoZSBjbGFpbSB0aGF0IHRoZSBqYWlsIHBvcHVsYXRpb24gaW4gdGhlIFNvdXRoIHJlZ2lvbiBpcyBpbiBmYWN0IDQwJSBvciBsZXNzIHRoYW4gNDAlLiAKCkFuZCB0aGUgYWx0ZXJuYXRpdmUgaHlwb3RoZXNpcyBpcyB0aGUgY2xhaW0gb2YgdGhlIGphaWwgcG9wdWxhdGlvbiBpbiB0aGUgU291dGggcmVnaW9uIGlzIGdyZWF0ZXIgdGhhbiA0MCUuCgpCZWxvdyBpcyBhIGhpc3RvZ3JhbSBvZiB0aGUgc2ltdWxhdGlvbi1iYXNlZCBkaXN0cmlidXRpb24gb2YgdGhlIHByb3BvcnRpb24gd2Ugc2hvdWxkIGV4cGVjdCB0byBzZWUgd2hlbiB0aGUgbnVsbCBoeXBvdGhlc2lzIGlzIHRydWUuIEJ5IHVzaW5nIHRoZSBvcHRpb24gZHJhdyBmcm9tIGluZmVyIHRoYXQgYWxsb3dzIHVzIHRvIHNpbXVsYXRlIHRoZSBudWxsLiBJdCBpcyB3b3J0aCBub3RpbmcgdGhhdCwgdGhlIG9ic2VydmVkIHNhbXBsZSBwcm9wb3J0aW9uIG9mIHBlb3BsZSB3aG8gd2VyZSBpbiBqYWlsIGluIHRoZSBTb3V0aCByZWdpb24gaXMgNDUlLCB3aGljaCBpcyBzaG93biBpbiBhIHJlZCB2ZXJ0aWNhbCBsaW5lLiAKCgpgYGB7ciwgZWNobyA9IEZBTFNFLCBtZXNzYWdlID0gRkFMU0V9CiMgVGhlIGRpc3RyaWJ1dGlvbiBzaG93aW5nIHRoZSB2YWx1ZXMgaW4gdGhlIG51bGwgaHlwb3RoZXNpcyBhbmQgYWx0ZXJuYXRpdmUgaHlwb3RoZXNpcy4Kc2V0LnNlZWQoMTU2KQoKbnVsbF9kaXN0IDwtIGluY2FyY2VyYXRpb25zICU+JQogIHNwZWNpZnkocmVzcG9uc2UgPSBTb3V0aCwgc3VjY2VzcyA9ICJ5ZXMiKSAlPiUKICBoeXBvdGhlc2l6ZShudWxsID0gInBvaW50IiwgcCA9IDAuNDApICU+JQogIGdlbmVyYXRlKHJlcHMgPSAxMDAwLCB0eXBlID0gImRyYXciKSAlPiUKICBjYWxjdWxhdGUoc3RhdCA9ICJwcm9wIikKCgpvYnNfcHJvcCA9IDAuNDUKCm51bGxfZGlzdCAlPiUgdmlzdWFsaXNlKGJpbnMgPSAxMCkrIAogIHNoYWRlX3BfdmFsdWUob2JzX3N0YXQgPSAwLjQ1LCBkaXJlY3Rpb24gPSAiZ3JlYXRlciIpCmBgYAoKCgpgYGB7ciwgZWNobyA9IEZBTFNFLHdhcm5pbmcgPSBGQUxTRX0KIyBDYWxjdWxhdGluZyB0aGUgcC12YWx1ZToKbnVsbF9kaXN0ICU+JSAKICBnZXRfcF92YWx1ZShvYnNfc3RhdCA9IDAuNDUsIGRpcmVjdGlvbiA9ICJncmVhdGVyIikKYGBgCgpTaW5jZSBvdXIgcC12YWx1ZSBpcyBzdXBlciBzbWFsbC4gVGhlcmVmb3JlLCB3ZSBjYW4gY29uY2x1ZGUgdGhhdCBvdXIgZGF0YSBpcyBwcm92aWRlZCByZXNvdW5kaW5nIGV2aWRlbmNlIGFnYWluc3QgdGhlIG51bGwgaHlwb3RoZXNpcy4gQW5kIGluIGZhdm9yIG9mIHRoZSBhbHRlcm5hdGl2ZSBoeXBvdGhlc2lzLiBBbmQgdGhlIGRhdGEgaXMgYmVpbmcgc2FtcGxlZCBmcm9tIGlzIHN1cHBvcnRpbmcgdGhlIHN0YXRlbWVudCB0aGF0IHRoZXJlIGlzIG1vcmUgdGhhbiA0MCUgb2YgdGhlIGphaWwgcG9wdWxhdGlvbiBvZiB0aGUgVW5pdGVkIFN0YXRlcyBpcyBpbiB0aGUgU291dGggcmVnaW9uLgoKIyMjIFByZWRpY3RpbmcgQmxhY2sgSmFpbCBQb3B1bGF0aW9uIGZyb20gVWJhbmljaXR5LCByZWdpb24sIGFuZCB0b3RhbCBCbGFjayBQb3B1bGF0aW9uCgpXZSB3YW50ZWQgdG8gc2VlIHdoaWNoIHZhcmlhYmxlcyBpbiB0aGlzIGRhdGEgc2V0IHRoZSBCbGFjayBqYWlsIHBvcHVsYXRpb24gd2FzIGNsb3NlbHkgY29ycmVsYXRlZCB3aXRoLiBJbiBvcmRlciB0byBkbyBzbywgd2UgZmlyc3QgdmlzdWFsaXplZCB0aGUgcmVsYXRpb25zaGlwIGJldHdlZW4gdGhlIGJsYWNrIGphaWwgcG9wdWxhdGlvbiBhbmQgdHdvIG90aGVyIG51bWVyaWNhbCBwcmVkaWN0b3IgdmFyaWFibGVzLiAKCioqUGFpcndpc2UgcGxvdCAxKioKYGBge3IsIGVjaG89RkFMU0UsIG1lc3NhZ2UgPSBGQUxTRX0KY2xlYW5faW5jYXJjZXJhdGlvbnMgJT4lIHNlbGVjdChibGFja19qYWlsX3BvcCwgdG90YWxfcG9wKSAlPiUKICBmaWx0ZXIodG90YWxfcG9wIDwzMDAwMDApICU+JQogIHBhaXJzKCkKYGBgCgoKVGhpcyBwYWlyd2lzZSBwbG90IHZpc3VhbGl6ZXMgcmVsYXRpb25zaGlwIGJldHdlZW4gdGhlIG51bWVyaWNhbCB2YXJpYWJsZXM6IGBibGFja19qYWlsX3BvcGAgYW5kIGB0b3RhbF9wb3BgLiAKCioqUGFpcndpc2UgcGxvdCAyKioKYGBge3IsIGVjaG89RkFMU0UsIG1lc3NhZ2UgPSBGQUxTRX0KY2xlYW5faW5jYXJjZXJhdGlvbnMgJT4lIHNlbGVjdChibGFja19qYWlsX3BvcCwgYmxhY2tfcG9wXzE1dG82NCkgJT4lCiAgZmlsdGVyKGJsYWNrX3BvcF8xNXRvNjQgPDMwMDAwMCkgJT4lCiAgcGFpcnMoKQpgYGAKCgpUaGlzIHBhaXJ3aXNlIHBsb3QgdmlzdWFsaXplcyByZWxhdGlvbnNoaXAgYmV0d2VlbiB0aGUgbnVtZXJpY2FsIHZhcmlhYmxlczogYGJsYWNrX2phaWxfcG9wYCBhbmQgYCBibGFja19wb3BfMTV0bzY0YC4gRHVlIHRvIG91dGxpbmVzLCB3ZSBmaWx0ZXJlZCB0aGUgZGF0YSB0byBvbmx5IGluY2x1ZGUgdGhlIGB0b3RhbF9wb3BgIHZhcmlhYmxlIGFuZCB0aGUgYGJsYWNrX2phaWxfcG9wYCB2YWx1ZXMgdW5kZXIgMzAwLDAwMCBpbiB0aGUgcGxvdHMuIEVhY2ggbW9kZWwgc2hvd2VkIGEgcmVsYXRpb25zaGlwLCBzbyB3ZSBmb3JtdWxhdGVkIGFuZCBjb21wYXJlZCB0d28gbWFpbiBlZmZlY3RzIG1vZGVscyB1c2luZyBhIG51bWVyaWNhbCBwcmVkaWN0b3IgaW4gZWFjaCBvbmUuIAoKCmBgYHtyLCBlY2hvPUZBTFNFLCBtZXNzYWdlID0gRkFMU0UsIGluY2x1ZGUgPSBGQUxTRX0KY2xlYW5faW5jYXJjZXJhdGlvbnMgJT4lIAogIHNlbGVjdChibGFja19qYWlsX3BvcCklPiUKICBuYS5vbWl0KCkgJT4lCiAgc3VtbWFyaXNlKFNEID0gc2QoYmxhY2tfamFpbF9wb3ApLCAKICAgICAgICAgICAgbWVhbl9pbmMgPSBtZWFuKGJsYWNrX2phaWxfcG9wKSkKYGBgCgoKYGBge3IsIGVjaG8gPSBGQUxTRSwgbWVzc2FnZSA9IEZBTFNFLCBpbmNsdWRlID0gRkFMU0V9CiMgVGVzdGluZyAxIChtYWluIGVmZmVjdHMpCnNldC5zZWVkKDIzNTUpCmluY2FyY2VyYXRpb25zX3NwbGl0IDwtIGluaXRpYWxfc3BsaXQoY2xlYW5faW5jYXJjZXJhdGlvbnMsIHByb3AgPSAwLjgpCgppbmNhcmNlcmF0aW9uc190cmFpbiA8LSB0cmFpbmluZyhpbmNhcmNlcmF0aW9uc19zcGxpdCkKaW5jYXJjZXJhdGlvbnNfdGVzdCA8LSB0ZXN0aW5nKGluY2FyY2VyYXRpb25zX3NwbGl0KQoKCmluY2FyY2VyYXRpb25zX21vZGVsIDwtIGxtKGJsYWNrX2phaWxfcG9wIH4gdG90YWxfcG9wICsgdXJiYW5pY2l0eV9iaW5hcnkgKyBkaXZpc2lvbiwgZGF0YSA9IGluY2FyY2VyYXRpb25zX3RyYWluKSAKCnRpZHkoaW5jYXJjZXJhdGlvbnNfbW9kZWwpICU+JSBzZWxlY3QodGVybSwgZXN0aW1hdGUpCgpnbGFuY2UoaW5jYXJjZXJhdGlvbnNfbW9kZWwpICU+JSBzZWxlY3Qoci5zcXVhcmVkLCBhZGouci5zcXVhcmVkKQoKaW5jYXJjZXJhdGlvbnNfcHJlZCA8LSBwcmVkaWN0KGluY2FyY2VyYXRpb25zX21vZGVsLCBuZXdkYXRhID0gaW5jYXJjZXJhdGlvbnNfdGVzdCkgJT4lCiAgYmluZF9jb2xzKGluY2FyY2VyYXRpb25zX3Rlc3QgJT4lIHNlbGVjdChibGFja19qYWlsX3BvcCkpICU+JQogIHJlbmFtZShwcmVkID0gLi4uMSkKcm1zZShpbmNhcmNlcmF0aW9uc19wcmVkLCB0cnV0aCA9IGJsYWNrX2phaWxfcG9wLCBlc3RpbWF0ZSA9IHByZWQpCmBgYAoKCmBgYHtyLCBpbmNsdWRlID0gRkFMU0UsIG1lc3NhZ2UgPSBGQUxTRSwgZWNobyA9IEZBTFNFfQojIFRlc3RpbmcgMiBtYWluIGVmZmVjdHMgCnNldC5zZWVkKDIzNTUpCmluY2FyY2VyYXRpb25zX3NwbGl0IDwtIGluaXRpYWxfc3BsaXQoY2xlYW5faW5jYXJjZXJhdGlvbnMsIHByb3AgPSAwLjgpCgppbmNhcmNlcmF0aW9uc190cmFpbiA8LSB0cmFpbmluZyhpbmNhcmNlcmF0aW9uc19zcGxpdCkKaW5jYXJjZXJhdGlvbnNfdGVzdCA8LSB0ZXN0aW5nKGluY2FyY2VyYXRpb25zX3NwbGl0KQoKCmluY2FyY2VyYXRpb25zX21vZGVsIDwtIGxtKGJsYWNrX2phaWxfcG9wIH4gYmxhY2tfcG9wXzE1dG82NCArIHVyYmFuaWNpdHlfYmluYXJ5ICsgcmVnaW9uLCBkYXRhID0gaW5jYXJjZXJhdGlvbnNfdHJhaW4pIAp0aWR5KGluY2FyY2VyYXRpb25zX21vZGVsKSAlPiUgc2VsZWN0KHRlcm0sIGVzdGltYXRlKQoKZ2xhbmNlKGluY2FyY2VyYXRpb25zX21vZGVsKSAlPiUgc2VsZWN0KHIuc3F1YXJlZCwgYWRqLnIuc3F1YXJlZCkKCmluY2FyY2VyYXRpb25zX3ByZWQgPC0gcHJlZGljdChpbmNhcmNlcmF0aW9uc19tb2RlbCwgbmV3ZGF0YSA9IGluY2FyY2VyYXRpb25zX3Rlc3QpICU+JQogIGJpbmRfY29scyhpbmNhcmNlcmF0aW9uc190ZXN0ICU+JSBzZWxlY3QoYmxhY2tfamFpbF9wb3ApKSAlPiUKICByZW5hbWUocHJlZCA9IC4uLjEpCnJtc2UoaW5jYXJjZXJhdGlvbnNfcHJlZCwgdHJ1dGggPSBibGFja19qYWlsX3BvcCwgZXN0aW1hdGUgPSBwcmVkKQpgYGAKCgpgYGB7ciwgaW5jbHVkZSA9IEZBTFNFLCBlY2hvID0gRkFMU0V9CiMgVGVzdGluZyAyKGludGVyYWN0aW9uIGVmZmVjdHMpCnNldC5zZWVkKDIzNTUpCmluY2FyY2VyYXRpb25zX3NwbGl0IDwtIGluaXRpYWxfc3BsaXQoY2xlYW5faW5jYXJjZXJhdGlvbnMsIHByb3AgPSAwLjgpCgppbmNhcmNlcmF0aW9uc190cmFpbiA8LSB0cmFpbmluZyhpbmNhcmNlcmF0aW9uc19zcGxpdCkKaW5jYXJjZXJhdGlvbnNfdGVzdCA8LSB0ZXN0aW5nKGluY2FyY2VyYXRpb25zX3NwbGl0KQoKCmluY2FyY2VyYXRpb25zX21vZGVsIDwtIGxtKGJsYWNrX2phaWxfcG9wIH4gYmxhY2tfcG9wXzE1dG82NCAqIHVyYmFuaWNpdHlfYmluYXJ5ICogcmVnaW9uLCBkYXRhID0gaW5jYXJjZXJhdGlvbnNfdHJhaW4pIAp0aWR5KGluY2FyY2VyYXRpb25zX21vZGVsKSAlPiUgc2VsZWN0KHRlcm0sIGVzdGltYXRlKQoKZ2xhbmNlKGluY2FyY2VyYXRpb25zX21vZGVsKSAlPiUgc2VsZWN0KHIuc3F1YXJlZCwgYWRqLnIuc3F1YXJlZCkKCmluY2FyY2VyYXRpb25zX3ByZWQgPC0gcHJlZGljdChpbmNhcmNlcmF0aW9uc19tb2RlbCwgbmV3ZGF0YSA9IGluY2FyY2VyYXRpb25zX3Rlc3QpICU+JQogIGJpbmRfY29scyhpbmNhcmNlcmF0aW9uc190ZXN0ICU+JSBzZWxlY3QoYmxhY2tfamFpbF9wb3ApKSAlPiUKICByZW5hbWUocHJlZCA9IC4uLjEpCnJtc2UoaW5jYXJjZXJhdGlvbnNfcHJlZCwgdHJ1dGggPSBibGFja19qYWlsX3BvcCwgZXN0aW1hdGUgPSBwcmVkKQpgYGAKClRoZSBmaXJzdCBtYWluIGVmZmVjdHMgbW9kZWwgdXNlZCBgYmxhY2tfamFpbF9wb3BgIGFzIHRoZSByZXNwb25zZSB2YXJpYWJsZSwgYW5kIGBkaXZpc2lvbmAsIGB0b3RhbF9wb3BgLCBhbmQgYHVyYmFuaWNpdHlfYmluYXJ5YCBhcyBwcmVkaWN0b3IgdmFyaWFibGVzLiBUaGUgdmFyaWFibGUgYHVyYmFuY2l0eV9iaW5hcnlgIGRpdmlkZXMgdGhlIGB1cmJhbmljaXR5YCB2YXJpYWJsZSBpbnRvIHR3byBjYXRlZ29yaWVzOiB1cmJhbiBhbmQgcnVyYWwuIEZyb20gdGVzdGluZyB0aGUgZGF0YSwgd2UgcmVjZWl2ZWQgYSB2YWx1ZSBvZiBgMC42NDlgIGZvciB0aGUgYWRqdXN0ZWQgcl4yIHZhbHVlIGFuZCBgMjE1LjQxMmAgZm9yIHRoZSByb290IG1lYW4gc3F1YXJlIGVycm9yKFJtc2UpLiAKClRoZSBzZWNvbmQgbWFpbiBlZmZlY3RzIG1vZGVsIGFsc28gdXNlZCBgYmxhY2tfamFpbF9wb3BgIGFzIHRoZSByZXNwb25zZSB2YXJpYWJsZSwgYW5kIHRoZSB2YXJpYWJsZXMgYGJsYWNrX3BvcF8xNXRvNjQsIGB1cmJhbmljaXR5X2JpbmFyeWAsIGFuZCBgcmVnaW9uYCBhcyBwcmVkaWN0b3JzLiBGcm9tIHRlc3RpbmcgdGhlIGRhdGEsIHdlIGdvdCBgMC44MzlgIGFzIHRoZSBhZGp1c3RlZCByXjIgdmFsdWUgYW5kIGAxNjcuMTYxYCBhcyB0aGUgUm1zZS4KCldlIHNlbGVjdGVkIHNlY29uZCBtYWluIGVmZmVjdHMgbW9kZWwgdG8gcHJvY2VlZCB3aXRoIGFzIGl0IGhhZCBhIGhpZ2hlciB2YWx1ZSBmb3IgYWRqdXN0ZWQgcl4yIGFuZCBhIGxvd2VyIFJtc2UuICBOZXh0LCB3ZSBjb21wYXJlZCB0aGUgc2Vjb25kIG1haW4gZWZmZWN0cyBtb2RlbCB3aXRoIGFuIGludGVyYWN0aW9uIGVmZmVjdHMgbW9kZWwgd2l0aCB0aGUgc2FtZSB2YXJpYWJsZXMuICBUZXN0aW5nIHRoZSBpbnRlcmFjdGlvbiBlZmZlY3RzIG1vZGVsIHJldHVybmVkIDAuODY2IGZvciB0aGUgYWRqdXN0ZWQgcl4yIHZhbHVlIGFuZCAxNTUuMjIgZm9yIHRoZSBSbXNlLiBXZSBkZWNpZGVkIHRvIGZpdCB0aGUgbGluZWFyIG1vZGVsIHRvIHRoZSBtYWluIGVmZmVjdHMgbW9kZWwgYmVjYXVzZSB0aGUgc21hbGwgZGlmZmVyZW5jZXMgaW4gdGhlIGFkanVzdGVkIHJeMiBhbmQgUm1zZSB2YWx1ZXMgd2FzIG5vdCBlbm91Z2ggdG8ganVzdGlmeSB0aGUgYWRkZWQgY29tcGxleGl0eSBvZiBhbiBpbnRlcmFjdGlvbiBlZmZlY3RzIG1vZGVsLiAKCmBgYHtyLCBlY2hvID0gRkFMU0UsIG1lc3NhZ2UgPSBGQUxTRX0KaW5jYXJjZXJhdGlvbnNfZml0IDwtIGxtKGJsYWNrX2phaWxfcG9wIH4gIGJsYWNrX3BvcF8xNXRvNjQgKyB1cmJhbmljaXR5X2JpbmFyeSArIHJlZ2lvbiwgZGF0YSA9ICBjbGVhbl9pbmNhcmNlcmF0aW9ucykKdGlkeShpbmNhcmNlcmF0aW9uc19maXQpICU+JQogIHNlbGVjdCh0ZXJtLCBlc3RpbWF0ZSkKYGBgCgpgXmJsYWNrX2phaWxfcG9wYCA9IDEuMjEyICsgMC4wMDggKiBgYmxhY2tfcG9wXzE1dG82NGAgKyA3My4xNzggKiBgdXJiYW5pY2l0eV9iaW5hcnlVcmJhbmAgKyA0OC4xNzMgKiBgcmVnaW9uTm9ydGhlYXN0YCArIDMyLjk1OSAqIGByZWdpb25Tb3V0aGAgKyAxNy41NzcqYHJlZ2lvbldlc3RgCgoKVGhlIGludGVyY2VwdCBvZiB0aGUgbW9kZWwgaXMgMS4yMTIsIG1lYW5pbmcgdGhhdCBpZiBhIGNvdW50eSBoYXMgYSBibGFjayBwb3B1bGF0aW9uICgxNS02NCkgb2YgMCwgaXMgaW4gYSBydXJhbCBhcmVhLCBhbmQgaXMgbG9jYXRlZCBpbiB0aGUgTWlkd2VzdDsgdGhlbiB0aGUgYmxhY2sgcHJpc29uIHBvcHVsYXRpb24gd2lsbCBiZSAxLjIxMi4gMC4wMDggaXMgdGhlIHNsb3BlIG9mIGBibGFja19wb3BfMTV0bzY0YDsgc28gaG9sZGluZyBldmVyeSB0aGluZyBlbHNlIGNvbnN0YW50LCBpbmNyZWFzaW5nIHRoZSBgYmxhY2tfcG9wXzE1dG82NGAgYnkgMSwgaW5jcmVhc2VzIHRoZSBgYmxhY2tfamFpbF9wb3BgICBieSAwLjAwOC4gVGhlIHNsb3BlIG9mIGAgdXJiYW5pY2l0eV9iaW5hcnlVcmJhbmAgaXMgNzMuMTc4OyBob2xkaW5nIGV2ZXJ5dGhpbmcgZWxzZSBjb25zdGFudCwgd2hlbiBhIGNvdW50eSBpcyBpbiBhbiBVcmJhbiBsb2NhdGlvbiwgdGhlIGBibGFja19qYWlsX3BvcGAgaW5jcmVhc2VzIGJ5IDczLjE3OC4gNDguMTczIGlzIHRoZSBzbG9wZSBvZiBgIHJlZ2lvbk5vcnRoZWFzdGA7IGhvbGRpbmcgZXZlcnl0aGluZyBlbHNlIGNvbnN0YW50LCBpZiBhIGNvdW50eSBpcyBpbiB0aGUgTm9ydGhFYXN0IHJlZ2lvbiBvZiB0aGUgVW5pdGVkIFN0YXRlcywgdGhlIGBibGFja19qYWlsX3BvcGAgaW5jcmVhc2VzIGJ5IDQ4LjE3My4gVGhlIHNsb3BlIG9mIGAgcmVnaW9uU291dGhgIGlzIDMyLjk1OSwgbWVhbmluZyB0aGF0IGlmIGFsbCBvdGhlciB2YXJpYWJsZXMgYXJlIGhlbGQgY29uc3RhbnQsIGlmIGEgY291bnR5IGlzIGluIHRoZSBTb3V0aGVybiByZWdpb24gb2YgdGhlIFVuaXRlZCBTdGF0ZXMsIHRoZSBgIGJsYWNrX2phaWxfcG9wYCBpbmNyZWFzZXMgYnkgMzIuOTU5LiBUaGUgc2xvcGUgb2YgYCByZWdpb25XZXN0YCBpcyAxNy41Nzc7IGhvbGRpbmcgZXZlcnl0aGluZyBlbHNlIGNvbnN0YW50LCBpZiBhIGNvdW50eSBpcyBpbiB0aGUgV2VzdCwgdGhlIGAgYmxhY2tfamFpbF9wb3BgIGluY3JlYXNlcyBieSAxNy41NzcuIAoKCiMjIyBEb2VzIHVyYmFuaWNpdHkgYWZmZWN0IGluY2FyY2VyYXRpb24gcmF0ZT8KSW4gYW5zd2VyaW5nIG91ciBnZW5lcmFsIHJlc2VhcmNoIHF1ZXN0aW9uLCB3aGV0aGVyIHJhY2UgYW5kIGluY2FyY2VyYXRpb24gYXJlIGluZGVwZW5kZW50IG9mIGVhY2ggb3RoZXIsIHdlIHdhbnRlZCB0byBzZWUgaWYgdGhpcyByZWxhdGlvbnNoaXAgYmV0d2VlbiBpbmNhcmNlcmF0aW9uIGFuZCByYWNlIGlzIGFmZmVjdGVkIGJ5IHVyYmFuaWNpdHkuIEluIG9yZGVyIHRvIHRlc3QgdGhlIHJlbGF0aW9uc2hpcCwgd2UgY3JlYXRlZCBhIGh5cG90aGVzaXMgdGhhdCBhc2tzIHdoZXRoZXIgdXJiYW5pY2l0eSBhbmQgaW5jYXJjZXJhdGlvbiBieSByYWNlIGFyZSBkZXBlbmRlbnQgdmFyaWFibGVzLiBXaXRoIG91ciBoeXBvdGhlc2lzLCB3ZSB0ZXN0ZWQgdGhlIG51bGwgaHlwb3RoZXNpcywgY3JlYXRlZCBhIHZpc3VhbGl6YXRpb24gZm9yIG91ciBoeXBvdGhlc2lzLCBhbmQgY2FsY3VsYXRlZCB0aGUgY29uZmlkZW5jZSBpbnRlcnZhbHMgZm9yIGVhY2ggcmFjZSBpbiB1cmJhbiBjb3VudGllcy4gCgoqKk51bGwgSHlwb3RoZXNpcyoqCmBgYHtyIHVyYmFuIHByb3AsIGluY2x1ZGU9RkFMU0UsIG1lc3NhZ2U9RkFMU0V9CiMgY2FsY3VsYXRpbmcgdXJiYW5pY2l0eSBwcm9wb3J0aW9ucwp1cmJhbl9wcm9wIDwtIGluY2FyY2VyYXRpb25zICU+JQogIGNvdW50KHVyYmFuaWNpdHkpICU+JQogIG11dGF0ZShwcm9wPW4vc3VtKG4pKQpgYGAKCmBgYHtyIHRlc3RpbmcgbnVsbCBoeXBvdGhlc2lzLCBpbmNsdWRlPUZBTFNFLCBtZXNzYWdlPUZBTFNFfQojIGZpbHRlcmluZyBkZiAKZmlsdGVyX2luY2FyYyA8LSBjbGVhbl9pbmNhcmNlcmF0aW9ucyAlPiUgCiAgbXV0YXRlKHVyYmFuID0gaWZlbHNlKHVyYmFuaWNpdHkgPT0gInVyYmFuIiwgInllcyIsICJubyIpICkgJT4lCiAgbXV0YXRlKHJhY2UgPSBjYXNlX3doZW4oYmxhY2tfamFpbF9wb3AgPiB3aGl0ZV9qYWlsX3BvcCB+ICJibGFjayIsCiAgICAgICAgICAgICAgICAgICAgICAgICBibGFja19qYWlsX3BvcCA8IHdoaXRlX2phaWxfcG9wIH4gIndoaXRlIikpCgojIGNhbGN1bGF0aW5nIG51bGwgcHJvcG9ydGlvbnMKbnVsbF9wcm9wIDwtIGZpbHRlcl9pbmNhcmMgJT4lCiAgZmlsdGVyKCFpcy5uYSh1cmJhbiksICFpcy5uYShyYWNlKSkgJT4lCiAgIGNvdW50KHVyYmFuLCByYWNlKSAlPiUKICBncm91cF9ieSh1cmJhbikgJT4lCiAgIG11dGF0ZShwcm9wPW4vc3VtKG4pKQoKIyBjYWxjdWxhdGluZyBkaWZmZXJlbmNlIGluIHByb3BvcnRpb25zCm9ic18xIDwtIG51bGxfcHJvcCAlPiUKICBmaWx0ZXIodXJiYW4gPT0gIm5vIiwgcmFjZSA9PSAiYmxhY2siKSAlPiUKICBwdWxsKHByb3ApCgpvYnNfMiA8LSBudWxsX3Byb3AgJT4lCiAgZmlsdGVyKHVyYmFuID09ICJ5ZXMiLCByYWNlID09ICJibGFjayIpICU+JQogIHB1bGwocHJvcCkKCm9ic19kaWZmIDwtIG9ic18xIC8gb2JzXzIKCiMgY2FsY3VsYXRpbmcgbnVsbCBkaXN0cmlidXRpb24Kc2V0LnNlZWQoMjYzODY3OCkKCm51bGxfZGlzdCA8LSBmaWx0ZXJfaW5jYXJjICU+JQogIHNwZWNpZnkocmFjZSB+IHVyYmFuLCBzdWNjZXNzID0gImJsYWNrIikgJT4lCiAgaHlwb3RoZXNpemUobnVsbCA9ICJpbmRlcGVuZGVuY2UiKSAlPiUKICBnZW5lcmF0ZShyZXBzID0gMTAwLCB0eXBlID0gInBlcm11dGUiKSAlPiUKICBjYWxjdWxhdGUoc3RhdCA9ICJkaWZmIGluIHByb3BzIiwKICAgICAgICAgICAgb3JkZXIgPSBjKCJ5ZXMiLCAibm8iKSkKCiMgY2FsY3VsYXRpbmcgcC12YWx1ZQpudWxsX2Rpc3QgJT4lCiAgZ2V0X3BfdmFsdWUob2JzX3N0YXQgPSBvYnNfZGlmZiwgZGlyZWN0aW9uID0gImdyZWF0ZXIiKQoKYGBgCgpgYGB7ciBudWxsIHZpc3VhbGl6YXRpb24sIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0V9CiMgdmlzdWFsaXphdGlvbgpudWxsX2Rpc3QgJT4lIHZpc3VhbGlzZSgpICsKICBzaGFkZV9wX3ZhbHVlKG9ic19zdGF0ID0gb2JzX2RpZmYsIGRpcmVjdGlvbiA9ICJncmVhdGVyIikgKwogIGxhYnModGl0bGU9IlNpbXVsYXRpb24tQmFzZWQgTnVsbCBEaXN0cmlidXRpb24iLAogICAgICAgeD0iRGlmZmVyZW5jZSBpbiBQcm9wb3J0aW9ucyIpCmBgYAoKSW4gb3JkZXIgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgb3Igbm90IHdlIGNhbiByZWplY3QgdGhlIG51bGwgaHlwb3RoZXNpcywgd2UgY2FsY3VsYXRlZCBhbmQgdmlzdWFsaXplZCB0aGUgbnVsbCBkaXN0cmlidXRpb24gYW5kIGNhbGN1bGF0ZWQgdGhlIHAtdmFsdWUuIFRoaXMgbnVsbCBoeXBvdGhlc2lzIHRlc3QgcmVxdWlyZWQgY3JlYXRpbmcgdHdvIG5ldyB2YXJpYWJsZXMgZnJvbSBgdXJiYW5pY2l0eWAsIGB3aHRpZV9qYWlsX3BvcGAsIGFuZCBgYmxhY2tfamFpbF9wb3BgIGluIHRoZSBkYXRhc2V0LiBUaGUgZmlyc3QgbmV3IHZhcmlhYmxlLCBgdXJiYW5gLCBkZXRlcm1pbmVkIHdoZXRoZXIgdGhlIGNvdW50eSB3YXMgdXJiYW4gb3Igbm90IChydXJhbCwgc21hbGwvbWlkLCBvciBzdWJ1cmJhbikuIFRoZSBzZWNvbmQgdmFyaWFibGUsIGBiZ3dgLCBkZXRlcm1pbmVkIHdoZXRoZXIgYGJsYWNrX2phaWxfcG9wYCB3YXMgZ3JlYXRlciB0aGFuIGB3aGl0ZV9qYWlsX3BvcGAgb3Igbm90IGluIGEgZ2l2ZW4gY291bnR5LiBgYmxhY2tgIGluZGljYXRlZCB0aGF0IHRoZSBgYmxhY2tfamFpbF9wb3BgIHdhcyBncmVhdGVyIHRoYW4gdGhlIGB3aGl0ZV9qYWlsX3BvcGAgaW4gdGhhdCBjb3VudHksIGFuZCBgd2hpdGVgIGluZGljYXRlZCB0aGF0IHRoZSBgd2hpdGVfamFpbF9wb3BgIHdhcyBncmVhdGVyIHRoYW4gdGhlIGBibGFja19qYWlsX3BvcGAgaW4gdGhhdCBjb3VudHkuIE92ZXJhbGwgdGhlc2UgdHdvIG5ldyB2YXJpYWJsZXMgbWFkZSBpdCBwb3NzaWJsZSB0byBzZXBhcmF0ZSB0aGUgZGF0YSBhbW9uZyB0d28gY2F0ZWdvcmllcyB3aXRoaW4gdXJiYW4gY291bnRpZXMgYW5kIG90aGVyIGNvdW50aWVzLiBUaGUgZGlmZmVyZW5jZSBpbiBwcm9wb3J0aW9ucyB3YXMgY2FsY3VsYXRlZCBmcm9tIHRoZSBwcm9wIG9mIGBibGFja2AgKGdyZWF0ZXIgYmxhY2sgamFpbCBwb3B1bGF0aW9uIHRoYW4gd2hpdGUgamFpbCBwb3B1bGF0aW9uKSBpbiB1cmJhbiBjb3VudGllcyBhbmQgb3RoZXIgY291bnRpZXMuIEJhc2VkIG9uIHRoZSBudWxsIGRpc3RyaWJ1dGlvbiwgdGhlcmUgaXMgYSBwLXZhbHVlIG9mIDAgd2hpY2ggaW5kaWNhdGVzIHRoYXQgdXJiYW5pY2l0eSBhbmQgaW5jYXJjZXJhdGlvbiBieSByYWNlIGFyZSBkZXBlbmRlbnQgdmFyaWFibGVzLiAKCioqVmlzdWFsaXphdGlvbioqCmBgYHtyIHZpc3VhbGl6YXRpb24sIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0V9CiMgZmlsdGVyaW5nIGRmCnVyYmFuIDwtIGMoInJ1cmFsIiwgInVyYmFuIiwgInNtYWxsL21pZCIsICJzdWJ1cmJhbiIpCgpmaWx0ZXJfaW5jYXJjX2RmIDwtIGluY2FyY2VyYXRpb25zICU+JQogIGZpbHRlcih1cmJhbmljaXR5ICVpbiUgdXJiYW4sIHllYXIgPj0gIjE5ODUiKSAlPiUKICBtdXRhdGUodXJiYW4gPSBjYXNlX3doZW4oICAgCiAgICAgICAgICAgdXJiYW5pY2l0eSA9PSAicnVyYWwiIHwgdXJiYW5pY2l0eSA9PSAic21hbGwvbWlkIiB+ICJSdXJhbCIsCiAgICAgICAgICAgdXJiYW5pY2l0eSA9PSAic3VidXJiYW4iIHwgdXJiYW5pY2l0eSA9PSAidXJiYW4iIH4gIlVyYmFuIikpICU+JQogIGdyb3VwX2J5KHVyYmFuKSAlPiUKICBzdW1tYXJpemUod2hpdGUgPSBtZWFuKHdoaXRlX2phaWxfcG9wLCBuYS5ybT1UKSwKICAgICAgICAgICAgYmxhY2sgPSBtZWFuKGJsYWNrX2phaWxfcG9wLCBuYS5ybT1UKSkgJT4lCiAgcGl2b3RfbG9uZ2VyKGNvbHMgPSAyOjMsIG5hbWVzX3RvID0gIlJhY2UiLCB2YWx1ZXNfdG8gPSAicG9wdWxhdGlvbiIpCiAgCgojIGdncGxvdCB2aXN1YWxpemF0aW9uCmdncGxvdChkYXRhPWZpbHRlcl9pbmNhcmNfZGYsCiAgICAgICBtYXBwaW5nID0gYWVzKHg9dXJiYW4sIHk9cG9wdWxhdGlvbiwgZmlsbD1SYWNlKSkgKwogICAgICAgICBnZW9tX2JhcihzdGF0PSJpZGVudGl0eSIsIHBvc2l0aW9uPSJkb2RnZSIpICsKICBzY2FsZV9maWxsX21hbnVhbChicmVha3MgPSBjKCJibGFjayIsICJ3aGl0ZSIpLAogICAgICAgICAgICAgICAgICAgIHZhbHVlcz1jKCIjMDQ5MkMyIiwgIiM1MkIyQkYiKSkgKwogIGxhYnModGl0bGU9IkJsYWNrIHZzIFdoaXRlIEluY2FyY2VyYXRlZCBQb3B1bGF0aW9uIGluIDIwMDYiLAogICAgICAgc3VidGl0bGU9IkRpdmlkZWQgYnkgVXJiYW5pY2l0eSIsCiAgICAgICB4PSJVcmJhbmljaXR5IiwKICAgICAgIHk9IkluY2FyY2VyYXRlZCBQb3B1bGF0aW9uIiwKICAgICAgIGZpbGw9IlJhY2UiKQpgYGAKCkFmdGVyIHJlamVjdGluZyB0aGUgbnVsbCBoeXBvdGhlc2lzLCB3ZSB2aXN1YWxpemVkIHRoZSBjb25uZWN0aW9uIGJldHdlZW4gdXJiYW5pY2l0eSBhbmQgcmF0ZSBvZiBpbmNhcmNlcmF0aW9uIGJ5IHJhY2UuIFdlIGNvbWJpbmVkIHNtYWxsL21pZCBhbmQgcnVyYWwgaW50byBgcnVyYWxgLCBhbmQgdXJiYW4vc3VidXJiYW4gaW4gYHVyYmFuYCwgYnkgZG9pbmcgc28sIHdlIHdlcmUgYWJsZSB0byBjcmVhdGUgYSB2aXN1YWxpemF0aW9uIHdpdGggYXZlcmFnZSBqYWlsIHBvcHVsYXRpb25zIHNlcGFyYXRlZCBieSB1cmJhbmljaXR5IGFuZCByYWNlLiBPdXIgdmlzdWFsaXphdGlvbiBpcyBjb25jdXJyZW50IHdpdGggdGhlIHByb3BvcnRpb25zIHdlIGNhbGN1bGF0ZWQgaW4gb3VyIG51bGwgaHlwb3RoZXNpcyB0ZXN0IGJlY2F1c2UgaXQgaXMgYXBwYXJlbnQgdGhhdCB0aGUgYXZlcmFnZSBibGFjayBqYWlsIHBvcHVsYXRpb24gaW4gdXJiYW4gY291bnRpZXMgYXJlIHNpZ25pZmljYW50bHkgaGlnaGVyIHRoYW4gdGhlIHdoaXRlIGphaWwgcG9wdWxhdGlvbi4gVGhlIG9wcG9zaXRlIGlzIHRydWUgZm9yIHJ1cmFsIGNvdW50aWVzLiBUaGlzIGRpZmZlcmVuY2UgaW4gcmF0ZSBvZiBpbmNhcmNlcmF0aW9uIHNlcGFyYXRlZCBieSByYWNlIGluIHVyYmFuIGFuZCBydXJhbCBjb3VudGllcyBpbmRpY2F0ZXMgdGhhdCBgdXJiYW5pY2l0eWAgYW5kIGByYWNlYCBhcmUgZGVwZW5kZW50IHZhcmlhYmxlcy4gCgoqKkNvbmZpZGVuY2UgTGV2ZWwqKgpgYGB7ciBkYXRhIGZpbHRlciwgaW5jbHVkZT1GQUxTRSwgbWVzc2FnZT1GQUxTRX0KdXJiYW5fZmlsdGVyIDwtIGNsZWFuX2luY2FyY2VyYXRpb25zICU+JQogIGZpbHRlcih1cmJhbmljaXR5ID09ICJ1cmJhbiIpCmBgYAoKYGBge3IgYmxhY2sgY29uZmlkZW5jZSBsZXZlbCwgaW5jbHVkZT1GQUxTRSwgbWVzc2FnZT1GQUxTRX0Kc2V0LnNlZWQoMjc2KQoKIyBib290c3RyYXBwaW5nIGJsYWNrIGphaWwgcG9wdWxhdGlvbgpib290X21lYW5fYmxhY2sgPC0gdXJiYW5fZmlsdGVyICU+JSAKICBzcGVjaWZ5KHJlc3BvbnNlID0gYmxhY2tfamFpbF9wb3ApICU+JSAKICBnZW5lcmF0ZShyZXBzPTEwMDAsIHR5cGU9ImJvb3RzdHJhcCIpICU+JQogIGNhbGN1bGF0ZShzdGF0PSJtZWFuIikKCiMgY2FsY3VsYXRpbmcgY29uZmlkZW5jZSBpbnRlcnZhbApib290X21lYW5fYmxhY2sgJT4lCiAgZ2V0X2NvbmZpZGVuY2VfaW50ZXJ2YWwobGV2ZWw9MC45OSkKYGBgCgpgYGB7ciBibGFjaywgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRX0KIyB2aXN1YWxpemF0aW9uCmJvb3RfbWVhbl9ibGFjayAlPiUgdmlzdWFsaXplKCkgKwogIGxhYnModGl0bGU9IlNpbXVsYXRpb24tQmFzZWQgQm9vdHN0cmFwIERpc3RyYnV0aW9uIGZvciBCbGFjayBJbmNhcmNlcmF0aW9uIikKYGBgCgpgYGB7ciB3aGl0ZSBjb25maWRlbmNlIGxldmVsLCBpbmNsdWRlPUZBTFNFLCBtZXNzYWdlPUZBTFNFfQpzZXQuc2VlZCgyNzYpCgojIGJvb3RzdHJhcHBpbmcgd2hpdGUgamFpbCBwb3B1bGF0aW9uCmJvb3RfbWVhbl93aGl0ZSA8LSB1cmJhbl9maWx0ZXIgJT4lIAogIHNwZWNpZnkocmVzcG9uc2UgPSB3aGl0ZV9qYWlsX3BvcCkgJT4lIAogIGdlbmVyYXRlKHJlcHM9MTAwMCwgdHlwZT0iYm9vdHN0cmFwIikgJT4lCiAgY2FsY3VsYXRlKHN0YXQ9Im1lYW4iKQoKIyBjYWxjdWxhdGluZyBjb25maWRlbmNlIGludGVydmFsCmJvb3RfbWVhbl93aGl0ZSAlPiUKICBnZXRfY29uZmlkZW5jZV9pbnRlcnZhbChsZXZlbD0wLjk5KQpgYGAKCmBgYHtyIHdoaXRlLCBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFfQojIHZpc3VhbGl6YXRpb24KYm9vdF9tZWFuX3doaXRlICU+JSB2aXN1YWxpemUoKSArCiAgbGFicyh0aXRsZT0iU2ltdWxhdGlvbi1CYXNlZCBCb290c3RyYXAgRGlzdHJidXRpb24gZm9yIFdoaXRlIEluY2FyY2VyYXRpb24iKQpgYGAKCkJ5IGNhbGN1bGF0aW5nIHRoZSBjb25maWRlbmNlIGludGVydmFscyBmb3IgYGJsYWNrX2phaWxfcG9wYCBhbmQgYHdoaXRlX2phaWxfcG9wYCBpbiB1cmJhbiBjb3VudGllcywgd2Ugd2VyZSBhYmxlIHRvIGZpbmQgdGhhdCAxMzE1LjE4NiB0byAyMzI4Ljc0OCBpbmNhcmNlcmF0ZWQgaW5kaXZpZHVhbHMgaW4gdXJiYW4gY291bnRpZXMgYXJlIGJsYWNrIGFuZCA4MTEuNDQ5NiB0byAxMzgxLjgxNiBpbmNhcmNlcmF0ZWQgaW5kaXZpZHVhbHMgYXJlIHdoaXRlIHdoaWNoIGlzIGxvd2VyIHRoYW4gcmF0ZSBvZiBibGFjayBpbmNhcmNlcmF0aW9uLiBXZSBjYWxjdWxhdGVkIHRoZSBjb25maWRlbmNlIGludGVydmFscyBmb3IgYm90aCBgYmxhY2tfamFpbF9wb3BgIGFuZCBgd2hpdGVfamFpbF9wb3BgIGF0IGEgOTklIGNvbmZpZGVuY2UgaW50ZXJ2YWwuIFdoaWxlIHRoZXNlIHR3byBjb25maWRlbmNlIGludGVydmFscyBhcmUgbGFyZ2UgcmFuZ2VzLCB0aGV5IGFyZSByZWFzb25hYmxlIHNpbmNlIHBvcHVsYXRpb24gdmFyaWVzIGFtb25nIGNvdW50aWVzLiBUaGUgY29uZmlkZW5jZSBpbnRlcnZhbHMgYXJlIGFsc28gY29uY2x1c2l2ZSB3aXRoIG91ciBoeXBvdGhlc2lzIHRoYXQgaW5jYXJjZXJhdGlvbiBieSByYWNlIGFuZCB1cmJhbmljaXR5IGFyZSByZWxhdGVkLgoKIyMjIERvIHJlZCBzdGF0ZXMgaGF2ZSBhIGhpZ2hlciBwcm9wb3J0aW9uIG9mIGJsYWNrIGphaWwgcG9wdWxhdGlvbj8KCioqTnVsbCBIeXBvdGhlc2lzKioKCkJhc2VkIG9uIG9uZSBvZiBvdXIgb3RoZXIgcmVzZWFyY2ggcXVlc3Rpb25zLCAiRG9lcyB1cmJhbmljaXR5IGFmZmVjdCBpbmNhcmNlcmF0aW9uIHJhdGU/IiB3ZSBkaXNjb3ZlcmVkIHRoYXQgdGhlIHZhcmlhYmxlcyB1cmJhbmljaXR5IGFuZCBpbmNhcmNlcmF0aW9uIGJ5IHJhY2UgYXJlIGRlcGVuZGVudCB0byBlYWNoIG90aGVyLiBBcyB3ZWxsIGFzIHRoZXJlIGlzIGhpZ2hlciBwcm9wb3J0aW9uIG9mIGJsYWNrIGphaWwgcG9wdWxhdGlvbiB0aGFuIHdoaXRlIGphaWwgcG9wdWxhdGlvbiBpbiB1cmJhbiBjb3VudHJpZXMuIFdoaWNoIGxlZCB1cyB0byB3b25kZXIgaWYgdGhlIHBvbGl0aWNhbCBwYXJ0eSBvZiBzdGF0ZSB3b3VsZCBhZmZlY3QgdGhlIHByb3BvcnRpb24gb2YgamFpbCBwb3B1bGF0aW9uLgoKSW4gb3JkZXIgdG8gZnVydGhlciByZXNlYXJjaCBvdXIgcXVlc3Rpb24sIHdlIGRlY2lkZWQgdG8gdGVzdCB0aGUgbnVsbCBoeXBvdGhlc2lzLiBXZSBjcmVhdGVkIGEgbnVsbCBoeXBvdGhlc2lzIHRoYXQgYXNrZWQgd2hldGhlciBib3RoIHN0YXRlIHBvbGl0Y2FsIHBhcnR5IGFuZCBpbmNhcmNlcmF0ZWQgcG9wdWxhdGlvbiBieSBzdGF0ZSB3ZXJlIGluZGVwZW5kZW50LiBUbyB0ZXN0IG91ciBudWxsIGh5cG90aGVzaXMsIHdlIGRlY2lkZWQgY3JlYXRlIHR3byBuZXcgdmFyaWFibGVzIGByYWNlYCwgd2hlbiBgYmxhY2tfamFpbF9wb3BgIGlzIGdyZWF0ZXIgdGhhbiBgd2hpdGVfamFpbF9wb3BgIGl0IHdvdWxkIGtub3duIGFzIGBibGFja2AgLCBhbmQgaWYgaXQgd2FzIGBibGFja19qYWlsX3BvcGAgaXMgbGVzcyB0aGFuIGB3aGl0ZV9qYWlsX3BvcGAgaXQgd291bGQgYmUga25vd24gYXMgYHdoaXRlYCwgc2ltaWxhciB0byB3aGF0IHdlIGhhZCB1c2VkIGluIG91ciB1cmJhbmljaXR5IHJlc2VhcmNoIGFuYWx5c2lzLiBXZSBhbHNvIGNyZWF0ZWQgYSB2YXJpYWJsZSB0aGF0IGRldGVybWluZWQgd2hldGhlciB0aGUgc3RhdGUgd2FzIGEgcmVkIHN0YXRlIG9yIGEgYmx1ZSBzdGF0ZSBiYXNlZCBvbiB0aGUgMjAwNiBlbGVjdGlvbiBzdGF0cy4gCgpgYGB7ciwgaW5jbHVkZT1GQUxTRSwgbWVzc2FnZT1GQUxTRX0KbmNsZWFuX2luY2FyY2VyYXRpb25zIDwtIGNsZWFuX2luY2FyY2VyYXRpb25zICU+JSAKICAgIG11dGF0ZShyYWNlID0gY2FzZV93aGVuKGJsYWNrX2phaWxfcG9wID4gd2hpdGVfamFpbF9wb3AgfiAiYmxhY2siLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgYmxhY2tfamFpbF9wb3AgPCB3aGl0ZV9qYWlsX3BvcCB+ICJ3aGl0ZSIpKSAlPiUKICAgIG11dGF0ZShydmIgPSBjYXNlX3doZW4oICAgCiAgICAgICAgICAgc3RhdGUgPT0gIkFMIiB8IHN0YXRlID09ICJBSyIgfCBzdGF0ZSA9PSAiQVoiIHwgc3RhdGUgPT0gIkFSIiB8IAogICAgICAgICAgICAgc3RhdGUgPT0gIkNPIiB8IHN0YXRlID09ICJGTCIgfCBzdGF0ZSA9PSAiR0EiIHwgc3RhdGUgPT0gIklEIiB8IAogICAgICAgICAgICAgc3RhdGUgPT0gIklOIiB8IHN0YXRlID09ICJJQSIgfCBzdGF0ZSA9PSAiS1MiIHwgc3RhdGUgPT0gIktZIiB8CiAgICAgICAgICAgICBzdGF0ZSA9PSAiTVMiIHwgc3RhdGUgPT0gIk1PIiB8IHN0YXRlID09ICJORSIgfCBzdGF0ZSA9PSAiTlYiIHwgCiAgICAgICAgICAgICBzdGF0ZSA9PSAiTk0iIHwgc3RhdGUgPT0gIk5DIiB8IHN0YXRlID09ICJORCIgfCBzdGF0ZSA9PSAiT0giIHwKICAgICAgICAgICAgIHN0YXRlID09ICJPSyIgfCBzdGF0ZSA9PSAiU0MiIHwgc3RhdGUgPT0gIlNEIiB8IHN0YXRlID09ICJUTiIgfAogICAgICAgICAgICAgc3RhdGUgPT0gIlRYIiB8IHN0YXRlID09ICJVVCIgfCBzdGF0ZSA9PSAiVkEiIHwgc3RhdGUgPT0gIldWIiB8CiAgICAgICAgICAgICBzdGF0ZSA9PSAiV1kiIH4gInJlZCIsCiAgICAgICAgICAgc3RhdGUgPT0gIkNBIiB8IHN0YXRlID09ICJDVCIgfCBzdGF0ZSA9PSAiREUiIHwgc3RhdGUgPT0gIkRDIiB8IAogICAgICAgICAgICAgc3RhdGUgPT0gIkhJIiB8IHN0YXRlID09ICJJTCIgfCBzdGF0ZSA9PSAiTUUiIHwgc3RhdGUgPT0gIk1EIiB8CiAgICAgICAgICAgICBzdGF0ZSA9PSAiTUEiIHwgc3RhdGUgPT0gIk1JIiB8IHN0YXRlID09ICJNTiIgfCBzdGF0ZSA9PSAiTkgiIHwgCiAgICAgICAgICAgICBzdGF0ZSA9PSAiTkoiIHwgc3RhdGUgPT0gIk5ZIiB8IHN0YXRlID09ICJPUiIgfCBzdGF0ZSA9PSAiUEEiIHwgCiAgICAgICAgICAgICBzdGF0ZSA9PSAiSVIiIHwgc3RhdGUgPT0gIlZUIiB8IHN0YXRlID09ICJXQSIgfCBzdGF0ZSA9PSAiV0kiICB+ICJibHVlIikpCgpgYGAKCgpgYGB7ciwgbWVzc2FnZT1GQUxTRSwgZWNobz1GQUxTRSwgd2FybmluZyA9IEZBTFNFfQpuMiA8LSBuY2xlYW5faW5jYXJjZXJhdGlvbnMgJT4lCiAgZmlsdGVyKHJ2YiA9PSAicmVkIikKCm51bGxfcHJvcF9kaWZmIDwtIG4yICU+JSAKICBjb3VudChyYWNlKSAlPiUKICBtdXRhdGUocHJvcCA9IG4vc3VtKG4pKSAlPiUKICBmaWx0ZXIocmFjZSA9PSAiYmxhY2siKSAlPiUKICBwdWxsKHByb3ApCgpzZXQuc2VlZCgyNTMzKQpudWxsX2Rpc3QgPC0gbmNsZWFuX2luY2FyY2VyYXRpb25zICU+JQogIHNwZWNpZnkocmVzcG9uc2UgPSByYWNlLCBzdWNjZXNzID0gImJsYWNrIikgJT4lCiAgaHlwb3RoZXNpemUobnVsbCA9ICJwb2ludCIsIHAgPSAwLjIwNjg4MTUpICU+JQogIGdlbmVyYXRlKHJlcHMgPSAxMDAsIHR5cGUgPSAiZHJhdyIpICU+JQogIGNhbGN1bGF0ZShzdGF0ID0gInByb3AiKQoKbnVsbF9kaXN0ICU+JSB2aXN1YWxpemUoKSArCiAgc2hhZGVfcF92YWx1ZShvYnNfc3RhdCA9IG51bGxfcHJvcF9kaWZmLCBkaXJlY3Rpb24gPSAiYm90aCIpCmBgYAoKYGBge3IsIG1lc3NhZ2U9RkFMU0UsIGVjaG89RkFMU0V9Cm51bGxfZGlzdCAlPiUKICBnZXRfcF92YWx1ZShvYnNfc3RhdCA9IG51bGxfcHJvcF9kaWZmLCBkaXJlY3Rpb24gPSAiYm90aCIpCmBgYAoKQmFzZWQgb24gb3VyIG51bGwgZGlzdHJpYnV0aW9uIGFuZCB2aXN1YWxpemF0aW9uLCBpdCBpcyBhcHBhcmVudCB0aGF0IHRoZSBwLXZhbHVlIG9mIDAuNzQgaXMgdG9vIGhpZ2ggdG8gcmVqZWN0IHRoZSBudWxsIGh5cG90aGVzaXMuIE91ciBjb25jbHVzaW9uIGF0IGEgNSUgbGV2ZWwgb2Ygc2lnbmlmaWNhbmNlIGlzIHRoYXQgdGhlIHR3byB2YXJpYWJsZXMsIGByYWNlYChpbmNhcmNlcmF0aW9uIHByb3BvcnRpb25zIGJ5IHJhY2UpIGFuZCBgcnZiYCAocmVkIHZzIGJsdWUgc3RhdGUpLCBhcmUgbm90IGRlcGVuZGVudCBvZiBlYWNoIG90aGVyLiBUaGlzIHByb21wdGVkIHRoZSBlbmQgb2Ygb3VyIHJlc2VhcmNoIGJlY2F1c2UgdGhlIHZhcmlhYmxlcyB1c2VkIHRvIGRldGVybWluZSB0aGUgc3RhdGVzIHBvbGl0aWNhbCBwYXJ0eSBhcmUgbm90IHNpZ25pZmljYW50IGVub3VnaCB0byBiZSByZWxhdGVkIHRvIGluY2FyY2VyYXRpb24gcmF0ZXMuCgojIyBDb25jbHVzaW9uCioqU2luY2UgcGVyc29uIGRpZCBvdXIgb3duIHNlcGFyYXRlIGFuYWx5c2lzIG9mIHRoZSBkYXRhIHdlIGRlY2lkZWQgdG8gd3JpdGUgYSBzZXBhcmF0ZSBzdW1tYXJ5IGZvciBlYWNoIHNlY3Rpb24qKgoKKipIeXBvdGhlc2lzIFRlc3RpbmcgZm9yIHRoZSBTb3V0aCBSZWdpb24gSmFpbCBQb3B1bGF0aW9uKioKClRoZXJlIHdhcyBhIHZhcmlhYmxlIGNhbGxlZCBSZWdpb24gaW4gdGhlIGRhdGEgc2V0LiBXaGljaCBjb250YWlucyBNaWR3ZXN0LCBOb3J0aGVhc3QsIFNvdXRoLCBhbmQgV2VzdC4gQWZ0ZXIgc2VlaW5nIHRoaXMgdmFyaWFibGUsIGl0IGVhZ2VyIHVzIHRvIGZpbmQgb3V0IHdoaWNoIHJlZ2lvbiBoYXMgdGhlIGhpZ2hlc3QgamFpbCBwb3B1bGF0aW9uIGluIHRoZSBlbnRpcmUgY291bnRyeS4gVG8gYmUgbW9yZSBzcGVjaWZpYywgd2UgYXJlIGludGVyZXN0ZWQgdG8ga25vdyBtb3JlIGFib3V0IHRoZSBTb3V0aCByZWdpb24gb2YgdGhlIFVuaXRlZCBTdGF0ZXMgZHVlIHRvIGl0cyBjb21wbGV4IGhpc3RvcnkgYW5kIHdoYXQgaGFzIGhhcHBlbmVkIGluIHRoZSBwYXN0IHRoYXQgbWlnaHQgY29udHJpYnV0ZSB0byBpdHMgamFpbCBwb3B1bGF0aW9uLiBBbmQgd2Ugd2FudGVkIHRvIHRlc3Qgd2hldGhlciBvciBub3QgdGhlIGphaWwgcG9wdWxhdGlvbiBpbiB0aGUgU291dGggcmVnaW9uIGlzIGFjY291bnRpbmcgZm9yIDQwJSBvZiB0aGUgd2hvbGUgY291bnRyeSdzIGphaWwgcG9wdWxhdGlvbi4KCk91ciBudWxsIGh5cG90aGVzaXMgc3VnZ2VzdGVkIHRoYXQgdGhlIGphaWwgcG9wdWxhdGlvbiBpbiB0aGUgU291dGggaXMgZXhhY3RseSA0MCUuIEFuZCBvdXIgYWx0ZXJuYXRpdmUgaHlwb3RoZXNpcyBjbGFpbWVkIHRoYXQgdGhlIGphaWwgcG9wdWxhdGlvbiBpbiB0aGUgU291dGggcmVnaW9uIGlzIGdyZWF0ZXIgdGhhbiA0MCUuIFdlIGZvdW5kIHRoYXQgNjkuNjc4IGlzIHRoZSB0b3RhbCBqYWlsIHBvcHVsYXRpb24gaW4gdGhlIFNvdXRoLCB3aGlsZSB0aGUgamFpbCBwb3B1bGF0aW9uIG9mIHRoZSBvdGhlcnMgMyByZWdpb25zIGNvbWJpbmVkIHdhcyA4NC4xMzMgcGVvcGxlLiBBbmQgdGhlIHByb3BvcnRpb24gb2YgdGhlIGphaWwgcG9wdWxhdGlvbiBpbiB0aGUgU291dGggcmVnaW9uIHdhcyB+NDUlLiBCeSB1c2luZyB0aGUgaHlwb3RoZXNpcyB0ZXN0aW5nIG1ldGhvZCwgd2Ugd2VyZSBhYmxlIHRvIHZpc3VhbGl6ZSB0aGUgbnVsbCBkaXN0cmlidXRpb24uIEFuZCBvdXIgcC12YWx1ZSB0dXJuZWQgb3V0IHRvIGJlIDAuIFdoaWNoIG1lYW5zIHRoYXQgdGhlIGRhdGEgc2V0IGlzIHN1cHBvcnRpbmcgdGhlIGFsdGVybmF0aXZlIGh5cG90aGVzaXMsIGFuZCBjb25maXJtZWQgdGhlIGphaWwgcG9wdWxhdGlvbiBpbiB0aGUgU291dGggcmVnaW9uIGlzIGFjY291bnRpbmcgZm9yIG1vcmUgdGhhbiA0MCUgb2YgdGhlIGphaWwgcG9wdWxhdGlvbiBpbiB0aGUgVW5pdGVkIFN0YXRlcy4KCioqTGluZWFyIE1vZGVsIFN1bW1hcnkqKgoKSW4gb3VyIGV4cGxvcmF0aW9uIG9mIHRoZSB2YXJpYWJsZSBgYmxhY2tfamFpbF9wb3BgIHRocm91Z2ggYSBsaW5lYXIgbW9kZWwsIHdlIHdlcmUgYWJsZSB0byBnbGVhbSBzb21lIGluc2lnaHQgaW50byBjb250cmlidXRpbmcgZmFjdG9ycyB0byB0aGUgYmxhY2sgaW5jYXJjZXJhdGVkIHBvcHVsYXRpb24gaW4gdGhlIFVuaXRlZCBTdGF0ZXMuIE91dCBvZiB0aGUgcHJlZGljdG9yIHZhcmlhYmxlcyB0aGF0IHdlIGluY2x1ZGVkIGluIG91ciBtb2RlbCwgdGhlIHRvcCB0d28gY29udHJpYnV0aW5nIHByZWRpY3RvciB2YXJpYWJsZXMgd2VyZSBgdXJiYW5pY2l0eV9iaW5hcnlVcmJhbmAsIHdpdGggYSBjb2VmZmljaWVudCBvZiA3My4xNzggYW5kIGByZWdpb25Ob3J0aGVhc3RgLCB3aXRoIGEgY29lZmZpY2llbnQgb2YgNDguMTczLiBTbywgdGhpcyBtZWFucyB0aGF0IHRoZSBibGFjayBqYWlsIHBvcHVsYXRpb24gaW4gYSBjb3VudHJ5IGluIHRoZSBVbml0ZWQgU3RhdGVzIGlzIG1vc3QgaW5jcmVhc2VkIGlmIHRoZSBjb3VudHkgaXMgdXJiYW4gYW5kIGluIHRoZSBOb3J0aGVhc3QuIEFsbGV2aWF0aW5nIHRoZSByb290IGNhdXNlcyBvZiB0aGVzZSBtYWluIGNvbnRyaWJ1dGluZyBwcmVkaWN0b3JzIHRvIHRoZSBibGFjayBqYWlsIHBvcHVsYXRpb24gaW4gdGhlIFVuaXRlZCBTdGF0ZXMgY291bGQgYmUgYSBwaXZvdGFsIHN0ZXAgaW4gY29tYmF0aW5nIHJhY2lhbCBpbmVxdWFsaXR5IGluIHRoZSBqdXN0aWNlIHN5c3RlbS4gSW4gdGhlIGZ1dHVyZSwgSSB3b3VsZCBsaWtlIHRvIG9idGFpbiBhIHNpbWlsYXIgZGF0YSBzZXQgd2l0aCBtb3JlIGNhdGVnb3JpY2FsIHZhcmlhYmxlcyB0byBjb21wYXJlIGFuZCB0ZXN0IG1vcmUgbGluZWFyIG1vZGVscyBhbmQgaG9wZWZ1bGx5IG9idGFpbiBhIG1vcmUgYWNjdXJhdGUgbW9kZWwuIAoKKipVcmJhbmljaXR5IHZzIEluY2FyY2VyYXRpb24gYnkgUmFjZSoqCgpGcm9tIG91ciByZXNlYXJjaCwgd2UgZm91bmQgdGhhdCB1cmJhbmljaXR5IGRvZXMgaW4gZmFjdCBleHBsYWluIGluY2FyY2VyYXRpb24gcmF0ZXMgYnkgcmFjZS4gSW4gdGhlIHR3byB0ZXN0cyBhbmQgb25lIHZpc3VhbGl6YXRpb24gd2UgY3JlYXRlZCwgZWFjaCByZXN1bHRlZCBpbiBhIHRyZW5kIHRoYXQgZGVzY3JpYmVzIG91ciByZXNlcmFjaCBxdWVzdGlvbi4gVGhlIG51bGwgaHlwb3RoZXNpcyB0ZXN0IGdhdmUgdXMgYSBwLXZhbHVlIG9mIDAgd2hpY2ggYWxsb3dlZCB1cyB0byByZWplY3QgdGhlIG51bGwgaHlwb3RoZXNpcy4gUnVubmluZyB0aGUgbnVsbCBoeXBvdGhlc2lzIHRlc3QgYWxzbyBnYXZlIHVzIHRoZSBwcm9wb3J0aW9uIG9mIGJsYWNrIHZzIHdoaXRlIGluIHVyYmFuIGNvdW50aWVzLiBSb3VnaGx5IDcyJSBvZiB1cmJhbiBjb3VudGllcyBoYWQgYSBoaWdoZXIgYmxhY2sgaW5jYXJjZXJhdGlvbiByYXRlIGNvbXBhcmVkIHRvIHRoZSB3aGl0ZSBpbmNhcmNlcmF0aW9uIHJhdGUuIFdlIHRoZW4gY3JlYXRlZCBhIHZpc3VhbGl6YXRpb24gdXNpbmcgdGhlIGF2ZXJhZ2UgYGJsYWNrX2phaWxfcG9wIGAgYW5kIHRoZSBhdmVyYWdlIGB3aGl0ZV9qYWlsX3BvcGAgd2hpY2ggd2FzIGFsc28gY29uY2x1c2l2ZSB3aXRoIHRoZSBwcm9wb3J0aW9ucyBjYWxjdWxhdGVkIGluIHRoZSBudWxsIGh5cG90aGVzaXMgdGVzdC4gRXZlbiB0aG91Z2ggb3VyIGRvZGdlZCBiYXIgY2hhcnQgd2FzIGVub3VnaCB0byBzaG93IHRoYXQgdXJiYW5pY2l0eSBhbmQgaW5jYXJjZXJhdGlvbiBieSByYWNlIGFyZSByZWxhdGVkLCB3ZSBzdGlsbCB3YW50ZWQgdG8gY2FsY3VsYXRlIGhvdyBtYW55IGluZGl2aWR1YWxzLCBvbiBhdmVyYWdlLCBhcmUgaW5jYXJjZXJhdGVkIHRvIHNlZSBob3cgbWFueSBtb3JlIGJsYWNrIGluZGl2aWR1YWxzIGFyZSBpbmNhcmNlcmF0ZWQuIEJ5IGZpbmRpbmcgdGhlIGNvbmZpZGVuY2UgaW50ZXJ2YWwgZm9yIGVhY2ggcmFjZSBpbiB1cmJhbiBjb3VudGllcywgd2UgZm91bmQgdGhhdCB0aGVyZSBpcyBhIHRyZW5kIG9mIHVwIHRvIDEwMDAgbW9yZSBibGFjayBpbmRpdmlkdWFscyBpbmNhcmNlcmF0ZWQgaW4gdXJiYW4gY291bnRpZXMgY29tcGFyZWQgdG8gd2hpdGUgaW5kaXZpZHVhbHMuIE92ZXJhbGwsIHdlIHdlcmUgYWJsZSB0byBhbnN3ZXIgb3VyIHF1ZXN0aW9uIHRoYXQgYm90aCB1cmJhbmljaXR5IGFuZCBpbmNhcmNlcmF0aW9uIGJ5IHJhY2UgYXJlIGRlcGVuZGVudCB2YXJpYWJsZXMuCgoqKlBvbGl0aWNhbCBQYXJ0eSB2cyBJbmNhcmNlcmF0aW9uKioKCkdlbmVyYXRpbmcgdHdvIGRpZmZlcmVudCB2YXJpYWJsZXMgdXNpbmcgdGhlIGBjYXNlX3doZW5gIGZ1bmN0aW9uLCB3ZSB3ZXJlIGFibGUgdG8gc2VwYXJhdGUgdGhlIHN0YXRlcyBieSB0aGVpciBwb2xpdGljYWwgcGFydHkgYW5kIHRoZSByYWNlcyBieSB0aGUgcHJvcG9ydGlvbiBvZiBibGFjayB0byB3aGl0ZSBpbmNhcmNlcmF0aW9uLiBXaXRoIHVzaW5nIHRoZXNlIHZhcmlhYmxlcyBpbiBvdXIgcmVzZWFyY2gsIHdlIGZvdW5kIHRoYXQgdGhlcmUgaXMgaW4gZmFjdCBubyBjb25uZWN0aW9uIGJldHdlZW4gdGhlc2UgdmFyaWFibGVzLiBXZSByYW4gdGhlIGh5cG90aGVzaXMgdGVzdCBhbmQgcmVjZWl2ZSBhIHAtdmFsdWUgb2YgMC43NCB3aGljaCBtZWFudCB0aGF0IHRoZXJlIGlzIGEgbGlrZWxpaG9vZCBvZiA3NCUgb2YgdGhlIGRhdGEgY291bGQgaGF2ZSBvY2N1cnJlZCB1bmRlciB0aGUgbnVsbCBoeXBvdGhlc2lzLiBXZSBhbHNvIGNyZWF0ZWQgYSB2aXN1YWxpemF0aW9uIG9mIHRoZSBudWxsIGRpc3RyaWJ1dGlvbiBhbmQgc2hhZGVkIGluIHRoZSBwLXZhbHVlIGZyb20gYm90aCBzaWRlcy4gU2luY2UgYSBtYWpvcml0eSBvZiB0aGUgZGlzdHJpYnV0aW9uIHdhcyBzaGFkZWQgaW4gZnJvbSBib3RoIHNpZGVzLCBpdCB3YXMgY29uY2x1c2l2ZSB0aGF0IHRoZSB0d28gdmFyaWFibGVzIHdlcmUgaW5kZXBlbmRlbnQgb2YgZWFjaCBvdGhlci4gSW4gY29uY2x1c2lvbiwgd2UgZm91bmQgdGhhdCBwcm9wb3J0aW9uIG9mIGluY2FyY2VyYXRpb24gYnkgcmFjZSBhbmQgc3RhdGUgcG9saXRpY2FsIHBhcnR5IGFyZSBub3QgcmVsYXRlZCB0byBvbmUgYW5vdGhlci4gCgoqKkRhdGEgU3VtbWFyeSoqCgpXZSBmZWVsIHRoYXQgdGhlIGRhdGFzZXQgd2UgdXNlZCBpcyByZWxhdGl2ZWx5IHJlbGlhYmxlIGFzIGl0IHdhcyBjb21waWxlZCB1c2luZyB0aGUgZ292ZXJubWVudCBkYXRhc2V0cyBjb21waWxlZCBieSB0aGUgQnVyZWF1IG9mIEp1c3RpY2UgU3RhdGlzdGljcyAoQkpTKS4gVGhlIHR3byBkYXRhIHNldHMgY29tcGlsZWQgaW4gdGhpcyBkYXRhIHNldCBhcmUgVGhlIENlbnN1cyBvZiBKYWlscyBhbmQgdGhlIEFubnVhbCBTdXJ2ZXkgb2YgSmFpbHMuIEhvd2V2ZXIsIGEgbm9uLWdvdmVybm1lbnRhbCBub24tcHJvZml0IGNhbGxlZCwgVmVyYSBJbnN0aXR1dGUgb2YgSnVzdGljZSwgY29tcGlsZWQgdGhlIGRhdGEgYW5kIHRoZXkgbWFkZSBoYXZlIG1hZGUgc21hbGwgbWlzdGFrZXMgZG9pbmcgc28uIAoKCg==