1. Introduction

Watauga Location
Watauga Location

1.1 Problem Statement / Use Case

Watauga County, North Carolina, is currently experiencing a housing shortage that is expected to intensify in the near future. The shortage is exacerbated by vacation rentals and student housing, which has significantly reduced the available residential housing options. The Watauga Housing Solutions Committee is partnering with other community and local government organizations looking to develop affordable and workforce housing in order to mitigate the severe decreases in housing affordability. The housing council is currently working with developers to prioritize the most feasible sites to pursue for purchase and development. Because of the extreme physical conditions of the landscape (slope, soils, etc.), there is currently no streamlined system in place to help identify suitable parcels for development. In response to this issue, we have been contracted to develop an application-based data framework that is designed to identify land parcels based on their likelihood to be developed for affordable workforce housing. This data framework has been designed to function as an interactive application interface that will allow users to input criteria related to land supply and combine it with likelihood estimates to rank each parcel in the county in terms of development suitability.

1.2 Project Client

The Watauga Housing Council
The Watauga Housing Council

The main project client is the Watauga Housing Council and its Housing Solutions Committee. This organization is tasked with responding to the economic, environmental, and social aspects of the county to provide adequate housing options for all residents. Our main points of contacts within the housing council are Dr. Kellie Reed Ashcraft (Facilitator/Organizer, Watauga Housing Council), Dr. Chris Quattro (Assistant Professor, Appalachian State University/Member, Watauga Housing Council), Laura Beach (Member, Watauga Housing Council).

1.3 Dependent Variable

The key indicator for development that will be used is the administrative record associated with septic system permits. This permit is exclusively granted when a property satisfies the requirements for both land supply and developer demand at that specific site. Due to the rural nature of the project area, there is relatively low wastewater sewer coverage. Subsequently, a septic system is critical for new development, and a site cannot be developed without one. Our approach will involve identifying the site suitability characteristics (e.g., slope, soil type) most closely related to the probability of a parcel receiving a septic permit. Using this information, we will forecast the likelihood that a given parcel will receive a new septic permit, which is the dependent variable.

To conduct this analysis, we used permit data gathered online from 2017 & 2022. Being able to observe how permitting has changed over those 5 years will help us predict which parcels are most likely to be suitable for development in our future target year of 2025. Watauga County approved 300 new septic permits in 2017, The number increased to 472 in 2022. The data indicates a 57.33% increase in the number of septic permits over the five-year period. The increase in septic permits suggests a significant increase in new development and land use change in Watauga County over the past five years.

2. Exploratory Data Analysis

2.1 Demographics

Watauga County has undergone notable demographic shifts over the last five years. In 2017, the county’s population was 53,421, which rose to 54,540 by 2022, indicating a steady increase in residents. This growth underscores the importance for the Housing Council to proactively address future housing demands as more people continue to make Watauga their home. Alongside population growth, the median age in Watauga has also increased, from 30.6 in 2017 to 32.1 in 2022. Despite this rise, the county maintains a youthful demographic compared to surrounding areas, which typically see median ages in the mid to upper 40s, likely influenced by Watauga’s substantial student population.

Additionally, the average household size has shown a slight decrease, moving from 2.35 in 2017 to 2.30 in 2022. This change mirrors trends in neighboring counties, where the average household size ranges between 2 and 3 people, suggesting a predominance of family units over single individuals or couples. In terms of economic metrics, the median household income in 2022 was $50,034, aligning closely with nearby counties like Ashe, Avery, Caldwell, and Wilkes, which have median incomes within $3,000 of Watauga’s. However, these figures also highlight the county’s relatively lower income levels compared to the national median of $74,580, emphasizing the need for targeted economic and housing policies to support the community’s growing and diversifying population.

Population Size

Median Age

Average Household Size

In 2017, the median household size in Watauga County was 2.35. Decreasing slightly in 2022 at 2.30, household size largely mirrors those of surrounding counties, which all experience households of approximately 2-3 people. This suggests that many homes in the area are families, rather than just individuals or couples living together.

Median Income

In 2022, Watauga County saw a median household income of $50,034. This is on par with the surrounding counties of Ashe, Avery, Caldwell, and Wilkes, which fell within $3,000 of this range. ($49,176-$53,313). The county experiences relatively low incomes, compared to the national median of $74,580.

2.2 Current State of Housing

In 2022, Watauga County’s housing landscape demonstrated a complex mix of ownership and rental challenges amid demographic shifts due to the local university population. Approximately 61% of homes in the county are owner-occupied, which juxtaposes interestingly with the demographic influx from Appalachian State University, indicating that a majority of adults not associated with the university are likely homeowners. This figure highlights a relatively stable ownership rate but also masks underlying issues in the rental market.

Despite a regional downtrend, Watauga County has experienced an increase in rent burden since 2017, with more than two-thirds of residents now spending over 30% of their income on rent, signaling a growing instability in the local housing market. This rise in rent burden suggests that despite the high rate of home ownership, affordability remains a pressing concern, particularly for renters.

On the ownership side, the median house value in Watauga stands at $283,000, aligning with the national average property value. There has been some improvement in housing affordability among owners over the past five years, with the percentage of unaffordable owner-occupied houses decreasing from 15.6% in 2017 to 14.4% in 2022. This rate of unaffordable housing is slightly better than the national average of 16.8%, indicating a positive trend towards greater affordability for homeowners.

The county’s demographic profile is significantly shaped by the presence of Appalachian State University, which hosts over 18,000 students. Approximately 30% of the county’s population comprises college students, impacting the local economy and the housing market. The influence of the student population necessitates careful planning from the Housing Council to accommodate both the current and future housing needs of students and the broader community as students transition into the workforce within the county.

Lastly, vehicle ownership is notably high in Watauga, with nearly every household owning at least one car, and about 14,000 households owning two or more. This prevalence of vehicle ownership indicates that mobility within the county is largely car-dependent, influencing daily travel patterns and potentially impacting housing location preferences related to accessibility and commute distances.

Housing by Occupancy Type (Own vs. Rent)

Rent Burden

Number of Households by Vehicles Owned

2.4 Physical Features

Land Cover Changes Over 10 Years

Watauga County has experienced significant land cover changes from 2011 to 2021, reflecting a notable shift towards development at the expense of natural landscapes. The data indicates a 13.89% increase in developed areas encompassing low, medium, and high-intensity developments, with medium intensity seeing the most significant growth at 17.22% by 2021. Concurrently, there has been a dramatic reduction in natural land covers, with a 56.5% decrease in Grassland/Herbaceous areas and a 50% reduction in Shrub/Scrub land. These changes are likely due to the conversion of open fields and grasslands into developed land or agricultural use, though the majority of the land remains natural or semi-natural with a small rise in developed open spaces.

The 2021 land cover data further underscores Watauga County’s rich natural resources against its moderate urban development. The area is predominantly forested, with 74.56% of the land covered by forests, including 54.16% deciduous, 19.2% mixed, and 1.2% evergreen forests. Developed areas constitute only 13.89% of the total land cover, with 11.23% as developed open space, 1.48% low intensity, 0.9% medium density, and 0.28% high intensity. The preponderance of development is classified as open space, such as parks, golf courses, or agricultural land that maintains the rural character of the county. The smaller percentages of more intensive developments reflect concentrated urbanization around cities and transportation corridors, indicating strategic land use planning that balances natural landscape preservation with residential and commercial growth. This careful balance suggests a mindful approach to development, prioritizing the maintenance of natural covers while accommodating necessary growth over the past decade.

2011-2021

2011

2013

2016

2019

2021

Slope & Soil

In Watauga County, where the landscape is predominantly mountainous, development is highly dependent on the terrain’s topography. Slope is a critical factor in assessing the feasibility of construction projects, with steeper slopes presenting significant challenges. Utilizing slope data, we’ve identified areas where the gradient exceeds 25°—well below the maximum development-friendly slope of 65% (approximately 33.02°)—as unsuitable for development. The reclassified slope degrees within the county are visually represented in a plot where green areas indicate slopes suitable for development, and white areas represent unsuitable zones.

Additionally, the county’s diverse soil composition includes over 80 types of soil, crucial for determining the appropriate design and installation of septic systems. Soil types affect the water absorption rate and the necessary depth for septic systems. An analysis of the USDA’s soil database reveals that these soils are categorized by their Map Unit Symbol (MUSYM) into three main groups based on their drainage capabilities and permeability: A-Moderately Rapid Infiltration Rate, B-Moderate Infiltration Rate, and C-Low Infiltration Rate. Type C soil, characterized by low infiltration rates and good drainage, is identified as optimal for septic system installation, contrasting sharply with the less desirable, poorly drained soils.

Slope

Soil

Distance to Calculations

In Watauga County, landslide risk predominantly dictates parcel safety, with proximity to landslide-prone areas being a critical factor. The northeastern region, characterized by its gentler slopes, is identified as the safest area, as depicted in the provided figure where white lines, often indicative of streams or roads, demarcate parcel boundaries.

Water management is also vital in the county’s planning strategy, especially concerning the placement of septic systems relative to watersheds. The central region of Watauga County lies close to essential water supply zones, necessitating stringent measures to prevent pollution and safeguard the water supply during septic system installation. This careful management ensures that environmental impacts are minimized.

Furthermore, the accessibility of parcels to transportation infrastructure is crucial for their development potential. The analysis shows that while some parcels are well-connected, areas in the southwest and northeast of Watauga lack sufficient road access, potentially limiting their development. Despite Watauga’s extensive network of water bodies, which influence septic system design due to their impact on the water table, our evaluations focus on the distance from the parcel’s center of mass to the nearest river, finding minimal variance in proximity across the county. This comprehensive approach to analyzing geographical and environmental factors ensures informed decision-making in land development and resource management.

Note: The white lines in the plots represent gaps between the parcels. They often correlate with streams or roads.

Distance to Landslide

Distance to Watershed

Distance to the nearest Road

Road is one of the most important infrastructures for housing development.We filtered out the roads with traffic equal to or higher than 2000.

Distance to Nearest Water Body

Natural Areas, Spatial Lag, Economic Features

Watauga County hosts a range of sites recognized as natural heritage areas or significant natural areas at various levels, from national to county. These protected areas, whether under federal, state, or private ownership, are vital for maintaining biodiversity, preserving cultural heritage sites, and conserving natural resources. Precisely identifying the locations of these protected sites is crucial for pinpointing development-suitable parcels while upholding conservation efforts.

property value plays a pivotal role in assessing the development potential of a parcel. It reflects market demand and potential return on investment, being primarily determined by the property’s sale price. Parcels with higher property values indicate greater development potential, guiding developers and planners in decision-making processes focused on maximizing economic benefits while considering environmental and cultural preservation.

Additionally, an analysis of the spatial lag of previous building permits issued between 2017 and 2022 provides insights into development trends and patterns in Watauga County. This analysis helps to identify areas with significant concentrations of recent development activities as well as regions that have seen fewer investments. Understanding these patterns is essential for forecasting future development hotspots and potential areas of growth. This spatial data not only reflects the historical demand for development but also assists planners and developers in making informed decisions about where to direct development efforts next, ensuring balanced growth across the county.

Natural Areas

Spatial Lag

Economic Features: Property Value

Property value is a critical factor in determining the development potential of a parcel. It is a direct reflection of the market demand and the potential return on investment. The property value is calculated based on the sale price of the property. The higher the property value, the higher the development potential.

3. Modeling

For our modeling process, we attempted three different models: the logistic model (to calculate probabilities), Random Forest, and Poisson regression (permit number). We’ve encountered various issues, including overfitting and misleadingly high accuracy rates, which we attribute to our imbalanced dataset—only 0.05 percent of parcels have permits. To address this, we’ve tried removing parcels with slopes too steep for development and resampling by oversampling the instances with permits (randomly duplicating the 1’s), yet we still end up with similar challenges. Below, you will find the results of these three models to assist in deciding which model type is best to proceed with.

3.1 Loading Data

Here we load the dataset filtered out the developed and unable to develop (steep slope) parcels as our dataset used for model training. In order to tackle the imbalanced problem of our dataset (1% of ‘1’ and 99% of ‘0’), we randomly duplicate the ‘1’ in our datset and reach the ratio of 10% of ‘1’ and 90% ‘0’.

3.2 Random Forest Model

Firstly, we prepare the training dataset by dropping the ‘GlobalID’ and ‘n_permit_22’ columns. And set the ‘permit_22’ column as our target variable. Then we standarize all the independent variables in the dataset.

To determine the variables with the greatest significance, that could be used for model training, we plot out the correlation matrix and a bar chart to show the p-value of the independent variables. Then we choose 13 most significant variables to include in our training.

Correlation Matrix

The correlation matrix shows that the ‘Slope_Ave’, ‘Slope_Max’, ‘permit_17.nn_3’, ‘permit_17.nn_4’, ‘permit_17.nn_5’, ‘Pasture_Hay’, ‘Developed_Medium_Intensity’, ‘permit_17’, ‘YRBUILT’ and ‘Dist_Flowline’ are the most correlated variables.

P-value Bar Chart

Similar to the result of the correlation matrix, the p-value bar chart shows that the ‘permit_17’, ‘Slope_Ave’, ‘Slope_Max’, ‘permit_17.nn_3’, ‘permit_17.nn_4’, ‘permit_17.nn_5’, ‘Pasture_Hay’, ‘Developed_Medium_Intensity’, ‘permit_17’, ‘YRBUILT’, ‘Dist_Flowline’, ‘Dist_Road’, ‘Developed_High_Intensity’, ‘Developed_Low_Intensity’, ‘Developed_Open_Space’, ‘Soil_A’ and ‘infaltion_17’ are the most correlated variables.

Choosing Features

So we include the target variabl ‘permit_22’ and 15 features into the model. The features are ‘permit_17’, ‘Slope_Ave’, ‘Slope_Max’, ‘permit_17.nn_3’, ‘permit_17.nn_4’, ‘permit_17.nn_5’, ‘Pasture_Hay’, ‘Developed_Medium_Intensity’, ‘permit_17’, ‘Dist_Flowline’, ‘Dist_Road’, ‘Developed_High_Intensity’, ‘Developed_Low_Intensity’, ‘Developed_Open_Space’, and ‘infaltion_17’

Data split

We split our dataset into training and testing sets using the initial_split() function from the rsample package. We use 80% of the data for training and 20% for testing. The set.seed() function is used to ensure reproducibility.

Hyperparameter Tuning & Cross Validation

Next, set up the hyperparameter grid for tuning:

Hyperparameter tuning and cross-validation are performed using the tune_grid() function from the tune package. We specify the metrics to optimize for, including ROC AUC, accuracy, sensitivity, precision, and F1 score.

Finally, finalize the model with the best parameters and evaluate it on the test set.

3.3 Spatial Cross-Validation

Once the model is created, it is important to test how accurately it performs across different areas of the County. In the map below, the random forest model’s accuracy is mapped across zip codes in Watauga, showing that while the model is very accurate across the County, it performs especially well towards the center regions. This is an important consideration when acknowledging that the center region is also more likely to be an early target for development due to its proximity to Boone and other amenity hubs.

4. Predicting for 2027

After getting the best model, we should start our prediction. Based on the data in 2022, we could predict the septic permits for 2027.

Below are the prediction results. There is a higher density of development in Boone, the largest city in Watauga County, which aligns with its future urban expansion.

Overlapping with the 2017 and 2022 Permit Data

After overlapping the existing predictions between years, we can know in the future, the urban expansion seems to be more concentrated in the center of Watauga County.

5. Application Development

App Link: https://seuha.github.io/watauga-app/

5.1 Users’ Workflow

5.2 App Manual

Left Panel

The left panel contains a search bar where users can search for a specific parcel by entering the parcel ID. The search bar will automatically zoom to the selected parcel on the map.

And the 3 filters below the search bar allow users to filter parcels based on the following criteria:

  • Size of Parcel: Filter parcels based on the size of the parcel, which will infect the housing type could be built on the parcel.

  • Slope Threshold: Filter parcels based on the maximum slope degree.

  • Value of Parcel: Filter parcels based on the property value of the parcel.

When entering the value in the filter, the map will automatically update and show the parcels that meet the criteria.

The bottom left list shows the top 10 parcels with the highest development probability. And if the user clicks on the parcel listed in the box, the map will automatically zoom to the selected parcel.

Layers Panel

The layers panel provides 3 options for the users to choose from:

  • Parcel View: A preview to show all parcels in the map.

  • Development Probability: Showing the development probability by color gradient, the deeper color means a higher probability of development.

  • Distance to Roads: Showing the distance to the nearest main roads by color scheme.

Pop-up Info Box

When clicking on a parcel, a pop-up info box will show up and provide the following information: Parcel ID, Area(Acre), Slope Average (°), Slope Maximum (°), Distance to Road (ft), Development Probability, Undevelopable (<35°) [Yes/No], Already Developed [Yes/No].

LS0tDQp0aXRsZTogIkEgUGxhbm5pbmcgU3VwcG9ydCBUb29sIGZvciBBZmZvcmRhYmxlIGFuZCBXb3JrZm9yY2UgSG91c2luZyBTaXRlIElkZW50aWZpY2F0aW9uIg0KYXV0aG9yOiAiSmluZ3lpIENhaSwgQWxpY2UgSGFuLCBZaW5hbiBMaSwgSmFycmVkIFJhbmRhbGwsIEthdGhsZWVuIFNjb3BpcyINCmRhdGU6ICIwNS8xMC8yMDI0Ig0Kb3V0cHV0Og0KICBybWRmb3JtYXRzOjptYXRlcmlhbDoNCiAgICBjb2RlX2Rvd25sb2FkOiB0cnVlDQogICAgdG9jX2Zsb2F0OiB0cnVlDQotLS0NCg0KYGBge3Igc2V0dXAsIGluY2x1ZGU9RkFMU0V9DQprbml0cjo6b3B0c19jaHVuayRzZXQoZWNobyA9IEZBTFNFLCBtZXNzYWdlID0gRkFMU0UsIHdhcm5pbmcgPSBGQUxTRSwgcmVzdWx0cz0naGlkZScsIGNhY2hlID0gVFJVRSkNCmBgYA0KDQpgYGB7ciBMaWJyYXJ5LCBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KIyBpbnN0YWxsLnBhY2thZ2VzKCJzcGF0c3RhdCIsIHJlcG9zPSJodHRwOi8vY3Jhbi5yLXByb2plY3Qub3JnIikNCiMgaW5zdGFsbC5wYWNrYWdlcygic3BhdHN0YXQuZXhwbG9yZSIsIHJlcG9zPSJodHRwOi8vY3Jhbi5yLXByb2plY3Qub3JnIikNCiMgaW5zdGFsbC5wYWNrYWdlcygiRmVkRGF0YSIsIHJlcG9zPSJodHRwOi8vY3Jhbi5yLXByb2plY3Qub3JnIikNCiMgaW5zdGFsbC5wYWNrYWdlcygiYW5pbWF0aW9uIiwgcmVwb3M9Imh0dHA6Ly9jcmFuLnItcHJvamVjdC5vcmciKQ0KIyBpbnN0YWxsLnBhY2thZ2VzKCJyYXN0ZXJWaXMiLCByZXBvcz0iaHR0cDovL2NyYW4uci1wcm9qZWN0Lm9yZyIpDQojIGluc3RhbGwucGFja2FnZXMoInJhc3RlciIsIHJlcG9zPSJodHRwOi8vY3Jhbi5yLXByb2plY3Qub3JnIikNCiMgaW5zdGFsbC5wYWNrYWdlcygidGlkeXZlcnNlIiwgcmVwb3M9Imh0dHA6Ly9jcmFuLnItcHJvamVjdC5vcmciKQ0KIyBpbnN0YWxsLnBhY2thZ2VzKCJyZ2RhbCIsIHJlcG9zID0gImh0dHA6Ly9jcmFuLnItcHJvamVjdC5vcmciLCB0eXBlID0gInNvdXJjZSIpDQojIGluc3RhbGwucGFja2FnZXMoInRpZHljZW5zdXMiKQ0KIyBpbnN0YWxsLnBhY2thZ2VzKCJzdHJpbmdpIikNCiMgaW5zdGFsbC5wYWNrYWdlcygic3AiLCByZXBvcz0iaHR0cDovL2NyYW4uci1wcm9qZWN0Lm9yZyIpDQojIGluc3RhbGwucGFja2FnZXMoImthYmxlRXh0cmEiLCByZXBvcz0iaHR0cDovL2NyYW4uci1wcm9qZWN0Lm9yZyIpDQojIGluc3RhbGwucGFja2FnZXMoInN5c3RlbWZvbnRzIiwgcmVwb3M9Imh0dHA6Ly9jcmFuLnItcHJvamVjdC5vcmciKQ0KIyBpbnN0YWxsLnBhY2thZ2VzKCJoaWdociIsIHJlcG9zPSJodHRwOi8vY3Jhbi5yLXByb2plY3Qub3JnIikNCiMgaW5zdGFsbC5wYWNrYWdlcygianF1ZXJ5bGliIiwgcmVwb3M9Imh0dHA6Ly9jcmFuLnItcHJvamVjdC5vcmciKQ0KIyBpbnN0YWxsLnBhY2thZ2VzKCJzYXNzIiwgcmVwb3M9Imh0dHA6Ly9jcmFuLnItcHJvamVjdC5vcmciKQ0KIyBpbnN0YWxsLnBhY2thZ2VzKCJjYWNoZW0iLCByZXBvcz0iaHR0cDovL2NyYW4uci1wcm9qZWN0Lm9yZyIpDQojIGluc3RhbGwucGFja2FnZXMoIlJTb2NyYXRhIiwgcmVwb3M9Imh0dHA6Ly9jcmFuLnItcHJvamVjdC5vcmciKQ0KIyBpbnN0YWxsLnBhY2thZ2VzKCJncmlkRXh0cmEiLCByZXBvcz0iaHR0cDovL2NyYW4uci1wcm9qZWN0Lm9yZyIpDQojIGluc3RhbGwucGFja2FnZXMoInNwZGVwIiwgcmVwb3M9Imh0dHA6Ly9jcmFuLnItcHJvamVjdC5vcmciKQ0KIyBpbnN0YWxsLnBhY2thZ2VzKCJGTk4iLCByZXBvcz0iaHR0cDovL2NyYW4uci1wcm9qZWN0Lm9yZyIpDQojIGluc3RhbGwucGFja2FnZXMoImdyaWQiLCByZXBvcz0iaHR0cDovL2NyYW4uci1wcm9qZWN0Lm9yZyIpDQojIGluc3RhbGwucGFja2FnZXMoImthYmxlRXh0cmEiLCByZXBvcz0iaHR0cDovL2NyYW4uci1wcm9qZWN0Lm9yZyIpDQojIGluc3RhbGwucGFja2FnZXMoImNsYXNzSW50IiwgcmVwb3M9Imh0dHA6Ly9jcmFuLnItcHJvamVjdC5vcmciKQ0KIyBpbnN0YWxsLnBhY2thZ2VzKCJtYXB2aWV3IiwgcmVwb3M9Imh0dHA6Ly9jcmFuLnItcHJvamVjdC5vcmciKQ0KIyBpbnN0YWxsLnBhY2thZ2VzKCJjcm9zc3RhbGsiLCByZXBvcz0iaHR0cDovL2NyYW4uci1wcm9qZWN0Lm9yZyIpDQojIGluc3RhbGwucGFja2FnZXMoImdncGxvdDIiLCByZXBvcz0iaHR0cDovL2NyYW4uci1wcm9qZWN0Lm9yZyIpDQojIGluc3RhbGwucGFja2FnZXMoInJlc2hhcGUyIiwgcmVwb3M9Imh0dHA6Ly9jcmFuLnItcHJvamVjdC5vcmciKQ0KIyBpbnN0YWxsLnBhY2thZ2VzKCJyZ2RhbCIpDQojaW5zdGFsbC5wYWNrYWdlcygncHJldHR5ZG9jJykNCiNpbnN0YWxsLnBhY2thZ2VzKCJybWRmb3JtYXRzIikNCmxpYnJhcnkocHJldHR5ZG9jKQ0KbGlicmFyeShjbGkpDQpsaWJyYXJ5KHJsYW5nKQ0KbGlicmFyeShSU29jcmF0YSkNCmxpYnJhcnkodmlyaWRpcykgDQpsaWJyYXJ5KHNwYXRzdGF0KQ0KbGlicmFyeShzcGRlcCkNCmxpYnJhcnkoRk5OKQ0KbGlicmFyeShncmlkKQ0KbGlicmFyeShncmlkRXh0cmEpDQpsaWJyYXJ5KGthYmxlRXh0cmEpDQpsaWJyYXJ5KGNsYXNzSW50KSAgICMgZm9yIEtERSBhbmQgTUwgcmlzayBjbGFzcyBpbnRlcnZhbHMNCmxpYnJhcnkobWFwdmlldykNCmxpYnJhcnkoRmVkRGF0YSkNCmxpYnJhcnkodGlkeXZlcnNlKQ0KbGlicmFyeSh0aWR5Y2Vuc3VzKQ0KbGlicmFyeShzZikNCmxpYnJhcnkoc3ApDQpsaWJyYXJ5KGRwbHlyKQ0KbGlicmFyeShyYXN0ZXIpDQpsaWJyYXJ5KGFuaW1hdGlvbikNCmxpYnJhcnkocmFzdGVyVmlzKQ0KbGlicmFyeShSQ29sb3JCcmV3ZXIpDQpsaWJyYXJ5KGdncGxvdDIpDQpsaWJyYXJ5KGNvbG9yc3BhY2UpDQpsaWJyYXJ5KHRpZHlyKQ0KbGlicmFyeShyZWFkcikNCmxpYnJhcnkodGVycmEpDQpsaWJyYXJ5KHJlc2hhcGUyKQ0KbGlicmFyeSh5YXJkc3RpY2spDQpsaWJyYXJ5KHJhbmRvbUZvcmVzdCkNCmxpYnJhcnkoY2FyZXQpDQpsaWJyYXJ5KHNjYWxlcykNCmxpYnJhcnkodGlkeW1vZGVscykNCmxpYnJhcnkoa25pdHIpDQpsaWJyYXJ5KGdnY29ycnBsb3QpDQoNCiMgZnVuY3Rpb25zDQpyb290LmRpciA9ICJodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vdXJiYW5TcGF0aWFsL1B1YmxpYy1Qb2xpY3ktQW5hbHl0aWNzLUxhbmRpbmcvbWFzdGVyL0RBVEEvIg0KDQpzb3VyY2UoImh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS91cmJhblNwYXRpYWwvUHVibGljLVBvbGljeS1BbmFseXRpY3MtTGFuZGluZy9tYXN0ZXIvZnVuY3Rpb25zLnIiKQ0KY29sb3JfcGFsZXR0ZSA8LSBjKCIjZTJhMzM0IiwgIiNmOWJmM2UiLCAiI2ZjZDk3NyIsICIjOWFkN2QyIiwgIiM3NGMxYjkiKQ0KYGBgDQoNCiMgMS4gSW50cm9kdWN0aW9uDQoNCiFbV2F0YXVnYSBMb2NhdGlvbl0oaHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tL0phcnJlZEVSYW5kYWxsL011c2FfODAxX1dhdGF1Z2EvbWFpbi9EZWxpdmVyYWJsZS9GSU5BTC93YXRhdWdhX2xvY2F0aW9uLmpwZykNCg0KIyMgMS4xIFByb2JsZW0gU3RhdGVtZW50IC8gVXNlIENhc2UNCg0KV2F0YXVnYSBDb3VudHksIE5vcnRoIENhcm9saW5hLCBpcyBjdXJyZW50bHkgZXhwZXJpZW5jaW5nIGEgaG91c2luZyBzaG9ydGFnZSB0aGF0IGlzIGV4cGVjdGVkIHRvIGludGVuc2lmeSBpbiB0aGUgbmVhciBmdXR1cmUuIFRoZSBzaG9ydGFnZSBpcyBleGFjZXJiYXRlZCBieSB2YWNhdGlvbiByZW50YWxzIGFuZCBzdHVkZW50IGhvdXNpbmcsIHdoaWNoIGhhcyBzaWduaWZpY2FudGx5IHJlZHVjZWQgdGhlIGF2YWlsYWJsZSByZXNpZGVudGlhbCBob3VzaW5nIG9wdGlvbnMuIFRoZSBXYXRhdWdhIEhvdXNpbmcgU29sdXRpb25zIENvbW1pdHRlZSBpcyBwYXJ0bmVyaW5nIHdpdGggb3RoZXIgY29tbXVuaXR5IGFuZCBsb2NhbCBnb3Zlcm5tZW50IG9yZ2FuaXphdGlvbnMgbG9va2luZyB0byBkZXZlbG9wIGFmZm9yZGFibGUgYW5kIHdvcmtmb3JjZSBob3VzaW5nIGluIG9yZGVyIHRvIG1pdGlnYXRlIHRoZSBzZXZlcmUgZGVjcmVhc2VzIGluIGhvdXNpbmcgYWZmb3JkYWJpbGl0eS4gVGhlIGhvdXNpbmcgY291bmNpbCBpcyBjdXJyZW50bHkgd29ya2luZyB3aXRoIGRldmVsb3BlcnMgdG8gcHJpb3JpdGl6ZSB0aGUgbW9zdCBmZWFzaWJsZSBzaXRlcyB0byBwdXJzdWUgZm9yIHB1cmNoYXNlIGFuZCBkZXZlbG9wbWVudC4gQmVjYXVzZSBvZiB0aGUgZXh0cmVtZSBwaHlzaWNhbCBjb25kaXRpb25zIG9mIHRoZSBsYW5kc2NhcGUgKHNsb3BlLCBzb2lscywgZXRjLiksIHRoZXJlIGlzIGN1cnJlbnRseSBubyBzdHJlYW1saW5lZCBzeXN0ZW0gaW4gcGxhY2UgdG8gaGVscCBpZGVudGlmeSBzdWl0YWJsZSBwYXJjZWxzIGZvciBkZXZlbG9wbWVudC4gSW4gcmVzcG9uc2UgdG8gdGhpcyBpc3N1ZSwgd2UgaGF2ZSBiZWVuIGNvbnRyYWN0ZWQgdG8gZGV2ZWxvcCBhbiBhcHBsaWNhdGlvbi1iYXNlZCBkYXRhIGZyYW1ld29yayB0aGF0IGlzIGRlc2lnbmVkIHRvIGlkZW50aWZ5IGxhbmQgcGFyY2VscyBiYXNlZCBvbiB0aGVpciBsaWtlbGlob29kIHRvIGJlIGRldmVsb3BlZCBmb3IgYWZmb3JkYWJsZSB3b3JrZm9yY2UgaG91c2luZy4gVGhpcyBkYXRhIGZyYW1ld29yayBoYXMgYmVlbiBkZXNpZ25lZCB0byBmdW5jdGlvbiBhcyBhbiBpbnRlcmFjdGl2ZSBhcHBsaWNhdGlvbiBpbnRlcmZhY2UgdGhhdCB3aWxsIGFsbG93IHVzZXJzIHRvIGlucHV0IGNyaXRlcmlhIHJlbGF0ZWQgdG8gbGFuZCBzdXBwbHkgYW5kIGNvbWJpbmUgaXQgd2l0aCBsaWtlbGlob29kIGVzdGltYXRlcyB0byByYW5rIGVhY2ggcGFyY2VsIGluIHRoZSBjb3VudHkgaW4gdGVybXMgb2YgZGV2ZWxvcG1lbnQgc3VpdGFiaWxpdHkuDQoNCiMjIDEuMiBQcm9qZWN0IENsaWVudA0KDQohW1RoZSBXYXRhdWdhIEhvdXNpbmcgQ291bmNpbF0oQzovVXNlcnMvZmF0Ym8vT25lRHJpdmUvRG9jdW1lbnRzL0dpdEh1Yi9NdXNhXzgwMV9XYXRhdWdhL0RhdGEvcGhvdG9zL2xvZ28ucG5nKQ0KDQpUaGUgbWFpbiBwcm9qZWN0IGNsaWVudCBpcyB0aGUgV2F0YXVnYSBIb3VzaW5nIENvdW5jaWwgYW5kIGl0cyBIb3VzaW5nIFNvbHV0aW9ucyBDb21taXR0ZWUuIFRoaXMgb3JnYW5pemF0aW9uIGlzIHRhc2tlZCB3aXRoIHJlc3BvbmRpbmcgdG8gdGhlIGVjb25vbWljLCBlbnZpcm9ubWVudGFsLCBhbmQgc29jaWFsIGFzcGVjdHMgb2YgdGhlIGNvdW50eSB0byBwcm92aWRlIGFkZXF1YXRlIGhvdXNpbmcgb3B0aW9ucyBmb3IgYWxsIHJlc2lkZW50cy4gT3VyIG1haW4gcG9pbnRzIG9mIGNvbnRhY3RzIHdpdGhpbiB0aGUgaG91c2luZyBjb3VuY2lsIGFyZSBEci4gS2VsbGllIFJlZWQgQXNoY3JhZnQgKEZhY2lsaXRhdG9yL09yZ2FuaXplciwgV2F0YXVnYSBIb3VzaW5nIENvdW5jaWwpLCBEci4gQ2hyaXMgUXVhdHRybyAoQXNzaXN0YW50IFByb2Zlc3NvciwgQXBwYWxhY2hpYW4gU3RhdGUgVW5pdmVyc2l0eS9NZW1iZXIsIFdhdGF1Z2EgSG91c2luZyBDb3VuY2lsKSwgTGF1cmEgQmVhY2ggKE1lbWJlciwgV2F0YXVnYSBIb3VzaW5nIENvdW5jaWwpLg0KDQojIyAxLjMgRGVwZW5kZW50IFZhcmlhYmxlDQoNCiFbXShDOi9Vc2Vycy9mYXRiby9PbmVEcml2ZS9Eb2N1bWVudHMvR2l0SHViL011c2FfODAxX1dhdGF1Z2EvRGF0YS9waG90b3Mvc2VwdGljX3Byb2Nlc3MuanBnKQ0KDQpUaGUga2V5IGluZGljYXRvciBmb3IgZGV2ZWxvcG1lbnQgdGhhdCB3aWxsIGJlIHVzZWQgaXMgdGhlIGFkbWluaXN0cmF0aXZlIHJlY29yZCBhc3NvY2lhdGVkIHdpdGggc2VwdGljIHN5c3RlbSBwZXJtaXRzLiBUaGlzIHBlcm1pdCBpcyBleGNsdXNpdmVseSBncmFudGVkIHdoZW4gYSBwcm9wZXJ0eSBzYXRpc2ZpZXMgdGhlIHJlcXVpcmVtZW50cyBmb3IgYm90aCBsYW5kIHN1cHBseSBhbmQgZGV2ZWxvcGVyIGRlbWFuZCBhdCB0aGF0IHNwZWNpZmljIHNpdGUuIER1ZSB0byB0aGUgcnVyYWwgbmF0dXJlIG9mIHRoZSBwcm9qZWN0IGFyZWEsIHRoZXJlIGlzIHJlbGF0aXZlbHkgbG93IHdhc3Rld2F0ZXIgc2V3ZXIgY292ZXJhZ2UuIFN1YnNlcXVlbnRseSwgYSBzZXB0aWMgc3lzdGVtIGlzIGNyaXRpY2FsIGZvciBuZXcgZGV2ZWxvcG1lbnQsIGFuZCBhIHNpdGUgY2Fubm90IGJlIGRldmVsb3BlZCB3aXRob3V0IG9uZS4gT3VyIGFwcHJvYWNoIHdpbGwgaW52b2x2ZSBpZGVudGlmeWluZyB0aGUgc2l0ZSBzdWl0YWJpbGl0eSBjaGFyYWN0ZXJpc3RpY3MgKGUuZy4sIHNsb3BlLCBzb2lsIHR5cGUpIG1vc3QgY2xvc2VseSByZWxhdGVkIHRvIHRoZSBwcm9iYWJpbGl0eSBvZiBhIHBhcmNlbCByZWNlaXZpbmcgYSBzZXB0aWMgcGVybWl0LiBVc2luZyB0aGlzIGluZm9ybWF0aW9uLCB3ZSB3aWxsIGZvcmVjYXN0IHRoZSBsaWtlbGlob29kIHRoYXQgYSBnaXZlbiBwYXJjZWwgd2lsbCByZWNlaXZlIGEgbmV3IHNlcHRpYyBwZXJtaXQsIHdoaWNoIGlzIHRoZSBkZXBlbmRlbnQgdmFyaWFibGUuDQoNClRvIGNvbmR1Y3QgdGhpcyBhbmFseXNpcywgd2UgdXNlZCBwZXJtaXQgZGF0YSBnYXRoZXJlZCBvbmxpbmUgZnJvbSAyMDE3ICYgMjAyMi4gQmVpbmcgYWJsZSB0byBvYnNlcnZlIGhvdyBwZXJtaXR0aW5nIGhhcyBjaGFuZ2VkIG92ZXIgdGhvc2UgNSB5ZWFycyB3aWxsIGhlbHAgdXMgcHJlZGljdCB3aGljaCBwYXJjZWxzIGFyZSBtb3N0IGxpa2VseSB0byBiZSBzdWl0YWJsZSBmb3IgZGV2ZWxvcG1lbnQgaW4gb3VyIGZ1dHVyZSB0YXJnZXQgeWVhciBvZiAyMDI1LiBXYXRhdWdhIENvdW50eSBhcHByb3ZlZCAzMDAgbmV3IHNlcHRpYyBwZXJtaXRzIGluIDIwMTcsIFRoZSBudW1iZXIgaW5jcmVhc2VkIHRvIDQ3MiBpbiAyMDIyLiBUaGUgZGF0YSBpbmRpY2F0ZXMgYSA1Ny4zMyUgaW5jcmVhc2UgaW4gdGhlIG51bWJlciBvZiBzZXB0aWMgcGVybWl0cyBvdmVyIHRoZSBmaXZlLXllYXIgcGVyaW9kLiBUaGUgaW5jcmVhc2UgaW4gc2VwdGljIHBlcm1pdHMgc3VnZ2VzdHMgYSBzaWduaWZpY2FudCBpbmNyZWFzZSBpbiBuZXcgZGV2ZWxvcG1lbnQgYW5kIGxhbmQgdXNlIGNoYW5nZSBpbiBXYXRhdWdhIENvdW50eSBvdmVyIHRoZSBwYXN0IGZpdmUgeWVhcnMuDQoNCmBgYHtyIHJlYWRfcGVybWl0X2RhdGEsIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQpib3VuZGFyeSA8LSBzdF9yZWFkKCJodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vSmFycmVkRVJhbmRhbGwvTXVzYV84MDFfV2F0YXVnYS9tYWluL0dlb0pTT04vQm91bmRhcnkuZ2VvanNvbiIpDQpwYXJjZWwgPC0gc3RfcmVhZCgiaHR0cHM6Ly9kcml2ZS5nb29nbGUuY29tL3VjP2V4cG9ydD1kb3dubG9hZCZpZD0xejRIRDBGMkdITEJrNktLWWJuOEFCWVhlWnhFRksyQUoiKQ0KcGVybWl0XzE3IDwtIHN0X3JlYWQoImh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9KYXJyZWRFUmFuZGFsbC9NdXNhXzgwMV9XYXRhdWdhL21haW4vR2VvSlNPTi9jbGlwcGVkX3Blcm1pdDE3Lmdlb2pzb24iKQ0KcGVybWl0XzIyIDwtIHN0X3JlYWQoImh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9KYXJyZWRFUmFuZGFsbC9NdXNhXzgwMV9XYXRhdWdhL21haW4vR2VvSlNPTi9jbGlwcGVkX3Blcm1pdDIyLmdlb2pzb24iKQ0KYGBgDQoNCmBgYHtyIHRyYW5zZmVyX2NyczIsIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQojIHRyYW5zZmVyIHRoZSBjcnMgb2YgcGVybWl0XzE3IGFuZCBwZXJtaXRfMjIgdG8gdGhlIHNhbWUgY29vcmRpbmF0ZSBzeXN0ZW0gYXMgYm91bmRhcnkgYW5kIHBhcmNlbA0KcGVybWl0XzE3IDwtIHN0X3RyYW5zZm9ybShwZXJtaXRfMTcsIHN0X2NycyhwYXJjZWwpKQ0KcGVybWl0XzIyIDwtIHN0X3RyYW5zZm9ybShwZXJtaXRfMjIsIHN0X2NycyhwYXJjZWwpKQ0KYGBgDQoNCmBgYHtyIHBsb3RfcGVybWl0cywgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSwgZmlnLnNob3c9J2hvbGQnfQ0KcGxvdF9wZXJtaXQgPC0gZ2dwbG90KCkgKw0KICBnZW9tX3NmKGRhdGEgPSBwYXJjZWwsIGNvbG9yID0gImdyZXk5MCIsIGZpbGwgPSAidHJhbnNwYXJlbnQiLCBzaXplID0gMC4yKSArDQogIGdlb21fc2YoZGF0YSA9IGJvdW5kYXJ5LCBjb2xvciA9ICIjY2Y4OTBlIiwgZmlsbCA9ICJ0cmFuc3BhcmVudCIsIHNob3cubGVnZW5kID0gRkFMU0UpICsNCiAgZ2VvbV9zZihkYXRhID0gcGVybWl0XzE3LCBhZXMoY29sb3IgPSAiUGVybWl0IDE3IiksIHNpemUgPSAxLCBhbHBoYSA9IDAuNywgc2hvdy5sZWdlbmQgPSAicG9pbnQiKSArDQogIGdlb21fc2YoZGF0YSA9IHBlcm1pdF8yMiwgYWVzKGNvbG9yID0gIlBlcm1pdCAyMiIpLCBzaXplID0gMSwgYWxwaGEgPSAwLjcsIHNob3cubGVnZW5kID0gInBvaW50IikgKw0KICBzY2FsZV9jb2xvcl9tYW51YWwobmFtZSA9ICJQZXJtaXRzIiwgDQogICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgPSBjKCJQZXJtaXQgMTciID0gIiNlMmEzMzQiLCAiUGVybWl0IDIyIiA9ICIjNzRjMWI5IiksDQogICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBjKCIyMDE3IiwgIjIwMjIiKSkgKw0KICB0aGVtZV92b2lkKCkgKw0KICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAicmlnaHQiKSArDQogIGxhYnModGl0bGUgPSAiV2F0YXVnYSBTZXB0aWMgUGVybWl0cyIsDQogICAgICAgc3VidGl0bGUgPSAiWWVhcnM6IDIwMTcgYW5kIDIwMjIiKSArDQogIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoZmFjZSA9ICJib2xkIiwgc2l6ZSA9IDE3KSwgDQogICAgICAgIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfdGV4dChmYWNlID0gImJvbGQiKSwgDQogICAgICAgIGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMCkpIA0KDQpwbG90X3Blcm1pdA0KDQojIFNhdmUgdGhlIHBsb3QgYXMgYSBoaWdoLXJlc29sdXRpb24gaW1hZ2UNCiNnZ3NhdmUoInBsb3RfcGVybWl0XzIyLnBuZyIsIHBsb3RfMjIsIHdpZHRoID0gMTAsIGhlaWdodCA9IDgsIGRwaSA9IDMwMCkNCmBgYA0KDQojIDIuIEV4cGxvcmF0b3J5IERhdGEgQW5hbHlzaXMNCg0KIyMjIDIuMSBEZW1vZ3JhcGhpY3Mgey50YWJzZXR9DQoNCldhdGF1Z2EgQ291bnR5IGhhcyB1bmRlcmdvbmUgbm90YWJsZSBkZW1vZ3JhcGhpYyBzaGlmdHMgb3ZlciB0aGUgbGFzdCBmaXZlIHllYXJzLiBJbiAyMDE3LCB0aGUgY291bnR5J3MgcG9wdWxhdGlvbiB3YXMgNTMsNDIxLCB3aGljaCByb3NlIHRvIDU0LDU0MCBieSAyMDIyLCBpbmRpY2F0aW5nIGEgc3RlYWR5IGluY3JlYXNlIGluIHJlc2lkZW50cy4gVGhpcyBncm93dGggdW5kZXJzY29yZXMgdGhlIGltcG9ydGFuY2UgZm9yIHRoZSBIb3VzaW5nIENvdW5jaWwgdG8gcHJvYWN0aXZlbHkgYWRkcmVzcyBmdXR1cmUgaG91c2luZyBkZW1hbmRzIGFzIG1vcmUgcGVvcGxlIGNvbnRpbnVlIHRvIG1ha2UgV2F0YXVnYSB0aGVpciBob21lLiBBbG9uZ3NpZGUgcG9wdWxhdGlvbiBncm93dGgsIHRoZSBtZWRpYW4gYWdlIGluIFdhdGF1Z2EgaGFzIGFsc28gaW5jcmVhc2VkLCBmcm9tIDMwLjYgaW4gMjAxNyB0byAzMi4xIGluIDIwMjIuIERlc3BpdGUgdGhpcyByaXNlLCB0aGUgY291bnR5IG1haW50YWlucyBhIHlvdXRoZnVsIGRlbW9ncmFwaGljIGNvbXBhcmVkIHRvIHN1cnJvdW5kaW5nIGFyZWFzLCB3aGljaCB0eXBpY2FsbHkgc2VlIG1lZGlhbiBhZ2VzIGluIHRoZSBtaWQgdG8gdXBwZXIgNDBzLCBsaWtlbHkgaW5mbHVlbmNlZCBieSBXYXRhdWdhJ3Mgc3Vic3RhbnRpYWwgc3R1ZGVudCBwb3B1bGF0aW9uLg0KDQpBZGRpdGlvbmFsbHksIHRoZSBhdmVyYWdlIGhvdXNlaG9sZCBzaXplIGhhcyBzaG93biBhIHNsaWdodCBkZWNyZWFzZSwgbW92aW5nIGZyb20gMi4zNSBpbiAyMDE3IHRvIDIuMzAgaW4gMjAyMi4gVGhpcyBjaGFuZ2UgbWlycm9ycyB0cmVuZHMgaW4gbmVpZ2hib3JpbmcgY291bnRpZXMsIHdoZXJlIHRoZSBhdmVyYWdlIGhvdXNlaG9sZCBzaXplIHJhbmdlcyBiZXR3ZWVuIDIgYW5kIDMgcGVvcGxlLCBzdWdnZXN0aW5nIGEgcHJlZG9taW5hbmNlIG9mIGZhbWlseSB1bml0cyBvdmVyIHNpbmdsZSBpbmRpdmlkdWFscyBvciBjb3VwbGVzLiBJbiB0ZXJtcyBvZiBlY29ub21pYyBtZXRyaWNzLCB0aGUgbWVkaWFuIGhvdXNlaG9sZCBpbmNvbWUgaW4gMjAyMiB3YXMgXCQ1MCwwMzQsIGFsaWduaW5nIGNsb3NlbHkgd2l0aCBuZWFyYnkgY291bnRpZXMgbGlrZSBBc2hlLCBBdmVyeSwgQ2FsZHdlbGwsIGFuZCBXaWxrZXMsIHdoaWNoIGhhdmUgbWVkaWFuIGluY29tZXMgd2l0aGluIFwkMywwMDAgb2YgV2F0YXVnYSdzLiBIb3dldmVyLCB0aGVzZSBmaWd1cmVzIGFsc28gaGlnaGxpZ2h0IHRoZSBjb3VudHkncyByZWxhdGl2ZWx5IGxvd2VyIGluY29tZSBsZXZlbHMgY29tcGFyZWQgdG8gdGhlIG5hdGlvbmFsIG1lZGlhbiBvZiBcJDc0LDU4MCwgZW1waGFzaXppbmcgdGhlIG5lZWQgZm9yIHRhcmdldGVkIGVjb25vbWljIGFuZCBob3VzaW5nIHBvbGljaWVzIHRvIHN1cHBvcnQgdGhlIGNvbW11bml0eSdzIGdyb3dpbmcgYW5kIGRpdmVyc2lmeWluZyBwb3B1bGF0aW9uLg0KDQojIyMjIFBvcHVsYXRpb24gU2l6ZSB7LnVubnVtYmVyZWR9DQoNCmBgYHtyIHBvcHVsYXRpb25fc2l6ZSwgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSwgcmVzdWx0cz0naGlkZScsIGZpZy5rZWVwPSdhbGwnfQ0KY291bnR5MTdwb3AgPC0gDQogIGdldF9hY3MoZ2VvZ3JhcGh5ID0gImNvdW50eSIsIA0KICAgICAgICAgIHZhcmlhYmxlcyA9IGMoIlMwMTAxX0MwMV8wMDEiKSwgDQogICAgICAgICAgeWVhcj0yMDE3LCBzdGF0ZT0iTkMiLCANCiAgICAgICAgICBnZW9tZXRyeT1UUlVFLCBvdXRwdXQ9IndpZGUiKSAlPiUNCiAgc3RfdHJhbnNmb3JtKCdFUFNHOjQzMjYnKSAlPiUNCiAgcmVuYW1lKFBvcHVsYXRpb24gPSBTMDEwMV9DMDFfMDAxRSkgJT4lDQogIGRwbHlyOjpzZWxlY3QoLXN0YXJ0c193aXRoKCJCIikpICU+JQ0KICBtdXRhdGUoDQogICAgICAgICBOQU1FID0gc3RyX3JlcGxhY2UoTkFNRSwgIiwgTm9ydGggQ2Fyb2xpbmEiLCAiIikpICU+JQ0KICBkcGx5cjo6ZmlsdGVyKE5BTUUgJWluJSBjKCJBdmVyeSBDb3VudHkiLCAiV2lsa2VzIENvdW50eSIsICJBc2hlIENvdW50eSIsICJXYXRhdWdhIENvdW50eSIsICJDYWxkd2VsbCBDb3VudHkiKSkgJT4lDQogIGRwbHlyOjpzZWxlY3QoR0VPSUQsIE5BTUUsIFBvcHVsYXRpb24pDQoNCmNvdW50eTIycG9wIDwtIA0KICBnZXRfYWNzKGdlb2dyYXBoeSA9ICJjb3VudHkiLCANCiAgICAgICAgICB2YXJpYWJsZXMgPSBjKCJTMDEwMV9DMDFfMDAxIiksIA0KICAgICAgICAgIHllYXI9MjAyMiwgc3RhdGU9Ik5DIiwgDQogICAgICAgICAgZ2VvbWV0cnk9VFJVRSwgb3V0cHV0PSJ3aWRlIikgJT4lDQogIHN0X3RyYW5zZm9ybSgnRVBTRzo0MzI2JykgJT4lDQogIHJlbmFtZShQb3B1bGF0aW9uID0gUzAxMDFfQzAxXzAwMUUpICU+JQ0KICBkcGx5cjo6c2VsZWN0KC1zdGFydHNfd2l0aCgiQiIpKSAlPiUNCiAgbXV0YXRlKA0KICAgICAgICAgTkFNRSA9IHN0cl9yZXBsYWNlKE5BTUUsICIsIE5vcnRoIENhcm9saW5hIiwgIiIpKSAlPiUNCiAgZHBseXI6OmZpbHRlcihOQU1FICVpbiUgYygiQXZlcnkgQ291bnR5IiwgIldpbGtlcyBDb3VudHkiLCAiQXNoZSBDb3VudHkiLCAiV2F0YXVnYSBDb3VudHkiLCAiQ2FsZHdlbGwgQ291bnR5IikpICU+JQ0KICBkcGx5cjo6c2VsZWN0KEdFT0lELCBOQU1FLCBQb3B1bGF0aW9uKQ0KDQpjb3VudHkxN3BvcCA8LSBjb3VudHkxN3BvcCAlPiUgbXV0YXRlKHllYXIgPSAyMDE3KQ0KY291bnR5MjJwb3AgPC0gY291bnR5MjJwb3AgJT4lIG11dGF0ZSh5ZWFyID0gMjAyMikNCg0KY29tYmluZWRfeWVhcnNwb3AgPC0gYmluZF9yb3dzKGNvdW50eTE3cG9wLCBjb3VudHkyMnBvcCkNCg0KDQojIHBsb3QNCmdncGxvdChjb21iaW5lZF95ZWFyc3BvcCwgYWVzKHggPSBOQU1FLCB5ID0gUG9wdWxhdGlvbiwgZmlsbCA9IGZhY3Rvcih5ZWFyKSkpICsNCiAgZ2VvbV9iYXIoc3RhdCA9ICJpZGVudGl0eSIsIHBvc2l0aW9uID0gImRvZGdlIikgKw0KICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBjKCIjZjliZjNlIiwgIiM3NGMxYjkiKSkgKw0KICBsYWJzKHRpdGxlID0gIlBvcHVsYXRpb24iLA0KICAgICAgIHN1YnRpdGxlID0gImJ5IGNvdW50eSIsDQogICAgICAgeCA9ICIgIiwNCiAgICAgICB5ID0gIk51bWJlciBvZiBQZW9wbGUiLA0KICAgICAgIGZpbGwgPSAiWWVhciIpICsNCiAgdGhlbWVfbWluaW1hbCgpICsNCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA0NSwgaGp1c3QgPSAxKSkNCmBgYA0KDQojIyMjIE1lZGlhbiBBZ2Ugey51bm51bWJlcmVkfQ0KDQpgYGB7ciBtZWRpYW5fYWdlLCBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBmaWcuc2hvdz0naG9sZCd9DQpjb3VudHkxN2FnZSA8LSANCiAgZ2V0X2FjcyhnZW9ncmFwaHkgPSAiY291bnR5IiwgDQogICAgICAgICAgdmFyaWFibGVzID0gYygiUzAxMDFfQzAxXzAzMiIpLCANCiAgICAgICAgICB5ZWFyPTIwMTcsIHN0YXRlPSJOQyIsIA0KICAgICAgICAgIGdlb21ldHJ5PVRSVUUsIG91dHB1dD0id2lkZSIpICU+JQ0KICBzdF90cmFuc2Zvcm0oJ0VQU0c6NDMyNicpICU+JQ0KICByZW5hbWUoQWdlID0gUzAxMDFfQzAxXzAzMkUpICU+JQ0KICBkcGx5cjo6c2VsZWN0KC1zdGFydHNfd2l0aCgiQiIpKSAlPiUNCiAgbXV0YXRlKA0KICAgICAgICAgTkFNRSA9IHN0cl9yZXBsYWNlKE5BTUUsICIsIE5vcnRoIENhcm9saW5hIiwgIiIpKSAlPiUNCiAgZHBseXI6OmZpbHRlcihOQU1FICVpbiUgYygiQXZlcnkgQ291bnR5IiwgIldpbGtlcyBDb3VudHkiLCAiQXNoZSBDb3VudHkiLCAiV2F0YXVnYSBDb3VudHkiLCAiQ2FsZHdlbGwgQ291bnR5IikpICU+JQ0KICBkcGx5cjo6c2VsZWN0KEdFT0lELCBOQU1FLCBBZ2UpDQoNCmNvdW50eTIyYWdlIDwtIA0KICBnZXRfYWNzKGdlb2dyYXBoeSA9ICJjb3VudHkiLCANCiAgICAgICAgICB2YXJpYWJsZXMgPSBjKCJTMDEwMV9DMDFfMDMyIiksIA0KICAgICAgICAgIHllYXI9MjAyMiwgc3RhdGU9Ik5DIiwgDQogICAgICAgICAgZ2VvbWV0cnk9VFJVRSwgb3V0cHV0PSJ3aWRlIikgJT4lDQogIHN0X3RyYW5zZm9ybSgnRVBTRzo0MzI2JykgJT4lDQogIHJlbmFtZShBZ2UgPSBTMDEwMV9DMDFfMDMyRSkgJT4lDQogIGRwbHlyOjpzZWxlY3QoLXN0YXJ0c193aXRoKCJCIikpICU+JQ0KICBtdXRhdGUoDQogICAgICAgICBOQU1FID0gc3RyX3JlcGxhY2UoTkFNRSwgIiwgTm9ydGggQ2Fyb2xpbmEiLCAiIikpICU+JQ0KICBkcGx5cjo6ZmlsdGVyKE5BTUUgJWluJSBjKCJBdmVyeSBDb3VudHkiLCAiV2lsa2VzIENvdW50eSIsICJBc2hlIENvdW50eSIsICJXYXRhdWdhIENvdW50eSIsICJDYWxkd2VsbCBDb3VudHkiKSkgJT4lDQogIGRwbHlyOjpzZWxlY3QoR0VPSUQsIE5BTUUsIEFnZSkNCg0KY291bnR5MTdhZ2UgPC0gY291bnR5MTdhZ2UgJT4lIG11dGF0ZSh5ZWFyID0gMjAxNykNCmNvdW50eTIyYWdlIDwtIGNvdW50eTIyYWdlICU+JSBtdXRhdGUoeWVhciA9IDIwMjIpDQoNCmNvbWJpbmVkX3llYXJzYWdlIDwtIGJpbmRfcm93cyhjb3VudHkxN2FnZSwgY291bnR5MjJhZ2UpDQoNCiMgcGxvdA0KZ2dwbG90KGNvbWJpbmVkX3llYXJzYWdlLCBhZXMoeCA9IE5BTUUsIHkgPSBBZ2UsIGZpbGwgPSBmYWN0b3IoeWVhcikpKSArDQogIGdlb21fYmFyKHN0YXQgPSAiaWRlbnRpdHkiLCBwb3NpdGlvbiA9ICJkb2RnZSIpICsNCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gYygiI2Y5YmYzZSIsICIjNzRjMWI5IikpICsNCiAgbGFicyh0aXRsZSA9ICJNZWRpYW4gQWdlIiwNCiAgICAgICBzdWJ0aXRsZSA9ICJieSBjb3VudHkiLA0KICAgICAgIHggPSAiICIsDQogICAgICAgeSA9ICJBZ2UgKGluIHllYXJzKSIsDQogICAgICAgZmlsbCA9ICJZZWFyIikgKw0KICB0aGVtZV9taW5pbWFsKCkgKw0KICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LCBoanVzdCA9IDEpLA0KICAgICAgICBheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dChjb2xvciA9ICJncmV5NTAiKSkNCmBgYA0KDQojIyMjIEF2ZXJhZ2UgSG91c2Vob2xkIFNpemUgey51bm51bWJlcmVkfQ0KDQpJbiAyMDE3LCB0aGUgbWVkaWFuIGhvdXNlaG9sZCBzaXplIGluIFdhdGF1Z2EgQ291bnR5IHdhcyAyLjM1LiBEZWNyZWFzaW5nIHNsaWdodGx5IGluIDIwMjIgYXQgMi4zMCwgaG91c2Vob2xkIHNpemUgbGFyZ2VseSBtaXJyb3JzIHRob3NlIG9mIHN1cnJvdW5kaW5nIGNvdW50aWVzLCB3aGljaCBhbGwgZXhwZXJpZW5jZSBob3VzZWhvbGRzIG9mIGFwcHJveGltYXRlbHkgMi0zIHBlb3BsZS4gVGhpcyBzdWdnZXN0cyB0aGF0IG1hbnkgaG9tZXMgaW4gdGhlIGFyZWEgYXJlIGZhbWlsaWVzLCByYXRoZXIgdGhhbiBqdXN0IGluZGl2aWR1YWxzIG9yIGNvdXBsZXMgbGl2aW5nIHRvZ2V0aGVyLg0KDQpgYGB7ciBob3VzZWhvbGRfc2l6ZSwgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSwgZmlnLnNob3c9J2hvbGQnfQ0KY291bnR5SEgxNyA8LSANCiAgZ2V0X2FjcyhnZW9ncmFwaHkgPSAiY291bnR5IiwgDQogICAgICAgICAgdmFyaWFibGVzID0gYygiUzExMDFfQzAxXzAwMiIpLCANCiAgICAgICAgICB5ZWFyPTIwMTcsIHN0YXRlPSJOQyIsIA0KICAgICAgICAgIGdlb21ldHJ5PVRSVUUsIG91dHB1dD0id2lkZSIpICU+JQ0KICBzdF90cmFuc2Zvcm0oJ0VQU0c6NDMyNicpICU+JQ0KICByZW5hbWUoIkhvdXNlaG9sZF9TaXplIiA9IFMxMTAxX0MwMV8wMDJFKSAlPiUNCiAgZHBseXI6OnNlbGVjdCgtc3RhcnRzX3dpdGgoIkIiKSkgJT4lDQogIG11dGF0ZSgNCiAgICAgICAgIE5BTUUgPSBzdHJfcmVwbGFjZShOQU1FLCAiLCBOb3J0aCBDYXJvbGluYSIsICIiKSkgJT4lDQogIGRwbHlyOjpmaWx0ZXIoTkFNRSAlaW4lIGMoIkF2ZXJ5IENvdW50eSIsICJXaWxrZXMgQ291bnR5IiwgIkFzaGUgQ291bnR5IiwgIldhdGF1Z2EgQ291bnR5IiwgIkNhbGR3ZWxsIENvdW50eSIpKSAlPiUNCiAgZHBseXI6OnNlbGVjdChHRU9JRCwgTkFNRSwgIkhvdXNlaG9sZF9TaXplIikNCg0KY291bnR5SEgyMiA8LSANCiAgZ2V0X2FjcyhnZW9ncmFwaHkgPSAiY291bnR5IiwgDQogICAgICAgICAgdmFyaWFibGVzID0gYygiUzExMDFfQzAxXzAwMiIpLCANCiAgICAgICAgICB5ZWFyPTIwMjIsIHN0YXRlPSJOQyIsIA0KICAgICAgICAgIGdlb21ldHJ5PVRSVUUsIG91dHB1dD0id2lkZSIpICU+JQ0KICBzdF90cmFuc2Zvcm0oJ0VQU0c6NDMyNicpICU+JQ0KICByZW5hbWUoIkhvdXNlaG9sZF9TaXplIiA9IFMxMTAxX0MwMV8wMDJFKSAlPiUNCiAgZHBseXI6OnNlbGVjdCgtc3RhcnRzX3dpdGgoIkIiKSkgJT4lDQogIG11dGF0ZSgNCiAgICAgICAgIE5BTUUgPSBzdHJfcmVwbGFjZShOQU1FLCAiLCBOb3J0aCBDYXJvbGluYSIsICIiKSkgJT4lDQogIGRwbHlyOjpmaWx0ZXIoTkFNRSAlaW4lIGMoIkF2ZXJ5IENvdW50eSIsICJXaWxrZXMgQ291bnR5IiwgIkFzaGUgQ291bnR5IiwgIldhdGF1Z2EgQ291bnR5IiwgIkNhbGR3ZWxsIENvdW50eSIpKSAlPiUNCiAgZHBseXI6OnNlbGVjdChHRU9JRCwgTkFNRSwgIkhvdXNlaG9sZF9TaXplIikNCg0KY291bnR5SEgxNyA8LSBjb3VudHlISDE3ICU+JSBtdXRhdGUoeWVhciA9IDIwMTcpDQpjb3VudHlISDIyIDwtIGNvdW50eUhIMjIgJT4lIG11dGF0ZSh5ZWFyID0gMjAyMikNCg0KY29tYmluZWRfeWVhcnNISCA8LSBiaW5kX3Jvd3MoY291bnR5SEgxNywgY291bnR5SEgyMikNCg0KIyBwbG90DQpnZ3Bsb3QoY29tYmluZWRfeWVhcnNISCwgYWVzKHggPSBOQU1FLCB5ID0gSG91c2Vob2xkX1NpemUsIGZpbGwgPSBmYWN0b3IoeWVhcikpKSArDQogIGdlb21fYmFyKHN0YXQgPSAiaWRlbnRpdHkiLCBwb3NpdGlvbiA9ICJkb2RnZSIpICsNCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gYygiI2Y5YmYzZSIsICIjNzRjMWI5IikpICsNCiAgbGFicyh0aXRsZSA9ICJBdmVyYWdlIEhvdXNlaG9sZCBTaXplIiwNCiAgICAgICBzdWJ0aXRsZSA9ICJieSBjb3VudHkiLA0KICAgICAgIHggPSAiICIsDQogICAgICAgeSA9ICIjIG9mIHBlb3BsZSIsDQogICAgICAgZmlsbCA9ICJZZWFyIikgKw0KICB0aGVtZV9taW5pbWFsKCkgKw0KICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LCBoanVzdCA9IDEpLA0KICAgICAgICBheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dChjb2xvciA9ICJncmV5NTAiKSkNCmBgYA0KDQojIyMjIE1lZGlhbiBJbmNvbWUgey51bm51bWJlcmVkfQ0KDQpJbiAyMDIyLCBXYXRhdWdhIENvdW50eSBzYXcgYSBtZWRpYW4gaG91c2Vob2xkIGluY29tZSBvZiBcJDUwLDAzNC4gVGhpcyBpcyBvbiBwYXIgd2l0aCB0aGUgc3Vycm91bmRpbmcgY291bnRpZXMgb2YgQXNoZSwgQXZlcnksIENhbGR3ZWxsLCBhbmQgV2lsa2VzLCB3aGljaCBmZWxsIHdpdGhpbiBcJDMsMDAwIG9mIHRoaXMgcmFuZ2UuIChcJDQ5LDE3Ni1cJDUzLDMxMykuIFRoZSBjb3VudHkgZXhwZXJpZW5jZXMgcmVsYXRpdmVseSBsb3cgaW5jb21lcywgY29tcGFyZWQgdG8gdGhlIG5hdGlvbmFsIG1lZGlhbiBvZiBcJDc0LDU4MC4NCg0KYGBge3IgbWVkaWFuX2luY29tZSwgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSwgZmlnLnNob3c9J2hvbGQnfQ0KY291bnR5MTdpbmMgPC0gDQogIGdldF9hY3MoZ2VvZ3JhcGh5ID0gImNvdW50eSIsIA0KICAgICAgICAgIHZhcmlhYmxlcyA9IGMoIlMxOTAxX0MwMV8wMTIiKSwgDQogICAgICAgICAgeWVhcj0yMDE3LCBzdGF0ZT0iTkMiLCANCiAgICAgICAgICBnZW9tZXRyeT1UUlVFLCBvdXRwdXQ9IndpZGUiKSAlPiUNCiAgc3RfdHJhbnNmb3JtKCdFUFNHOjQzMjYnKSAlPiUNCiAgcmVuYW1lKEluY29tZSA9IFMxOTAxX0MwMV8wMTJFKSAlPiUNCiAgZHBseXI6OnNlbGVjdCgtc3RhcnRzX3dpdGgoIkIiKSkgJT4lDQogIG11dGF0ZSgNCiAgICAgICAgIE5BTUUgPSBzdHJfcmVwbGFjZShOQU1FLCAiLCBOb3J0aCBDYXJvbGluYSIsICIiKSkgJT4lDQogIGRwbHlyOjpmaWx0ZXIoTkFNRSAlaW4lIGMoIkF2ZXJ5IENvdW50eSIsICJXaWxrZXMgQ291bnR5IiwgIkFzaGUgQ291bnR5IiwgIldhdGF1Z2EgQ291bnR5IiwgIkNhbGR3ZWxsIENvdW50eSIpKSAlPiUNCiAgZHBseXI6OnNlbGVjdChHRU9JRCwgTkFNRSwgSW5jb21lKQ0KDQpjb3VudHkyMmluYyA8LSANCiAgZ2V0X2FjcyhnZW9ncmFwaHkgPSAiY291bnR5IiwgDQogICAgICAgICAgdmFyaWFibGVzID0gYygiUzE5MDFfQzAxXzAxMiIpLCANCiAgICAgICAgICB5ZWFyPTIwMjIsIHN0YXRlPSJOQyIsIA0KICAgICAgICAgIGdlb21ldHJ5PVRSVUUsIG91dHB1dD0id2lkZSIpICU+JQ0KICBzdF90cmFuc2Zvcm0oJ0VQU0c6NDMyNicpICU+JQ0KICByZW5hbWUoSW5jb21lID0gUzE5MDFfQzAxXzAxMkUpICU+JQ0KICBkcGx5cjo6c2VsZWN0KC1zdGFydHNfd2l0aCgiQiIpKSAlPiUNCiAgbXV0YXRlKA0KICAgICAgICAgTkFNRSA9IHN0cl9yZXBsYWNlKE5BTUUsICIsIE5vcnRoIENhcm9saW5hIiwgIiIpKSAlPiUNCiAgZHBseXI6OmZpbHRlcihOQU1FICVpbiUgYygiQXZlcnkgQ291bnR5IiwgIldpbGtlcyBDb3VudHkiLCAiQXNoZSBDb3VudHkiLCAiV2F0YXVnYSBDb3VudHkiLCAiQ2FsZHdlbGwgQ291bnR5IikpICU+JQ0KICBkcGx5cjo6c2VsZWN0KEdFT0lELCBOQU1FLCBJbmNvbWUpDQoNCmNvdW50eTE3aW5jIDwtIGNvdW50eTE3aW5jICU+JSBtdXRhdGUoeWVhciA9IDIwMTcpDQpjb3VudHkyMmluYyA8LSBjb3VudHkyMmluYyAlPiUgbXV0YXRlKHllYXIgPSAyMDIyKQ0KDQpjb21iaW5lZF95ZWFyc2luYyA8LSBiaW5kX3Jvd3MoY291bnR5MTdpbmMsIGNvdW50eTIyaW5jKQ0KDQojIHBsb3QNCmdncGxvdChjb21iaW5lZF95ZWFyc2luYywgYWVzKHggPSBOQU1FLCB5ID0gSW5jb21lLCBmaWxsID0gZmFjdG9yKHllYXIpKSkgKw0KICBnZW9tX2JhcihzdGF0ID0gImlkZW50aXR5IiwgcG9zaXRpb24gPSAiZG9kZ2UiKSArDQogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IGMoIiNmOWJmM2UiLCAiIzc0YzFiOSIpKSArDQogIGxhYnModGl0bGUgPSAiTWVkaWFuIEluY29tZSIsDQogICAgICAgc3VidGl0bGUgPSAiYnkgY291bnR5IiwNCiAgICAgICB4ID0gIiAiLA0KICAgICAgIHkgPSAiSW5jb21lIChpbiAkKSIsDQogICAgICAgZmlsbCA9ICJZZWFyIikgKw0KICB0aGVtZV9taW5pbWFsKCkgKw0KICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LCBoanVzdCA9IDEpLA0KICAgICAgICBheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dChjb2xvciA9ICJncmV5NTAiKSkNCmBgYA0KDQojIyMgMi4yIEN1cnJlbnQgU3RhdGUgb2YgSG91c2luZyB7LnRhYnNldH0NCg0KSW4gMjAyMiwgV2F0YXVnYSBDb3VudHkncyBob3VzaW5nIGxhbmRzY2FwZSBkZW1vbnN0cmF0ZWQgYSBjb21wbGV4IG1peCBvZiBvd25lcnNoaXAgYW5kIHJlbnRhbCBjaGFsbGVuZ2VzIGFtaWQgZGVtb2dyYXBoaWMgc2hpZnRzIGR1ZSB0byB0aGUgbG9jYWwgdW5pdmVyc2l0eSBwb3B1bGF0aW9uLiBBcHByb3hpbWF0ZWx5IDYxJSBvZiBob21lcyBpbiB0aGUgY291bnR5IGFyZSBvd25lci1vY2N1cGllZCwgd2hpY2gganV4dGFwb3NlcyBpbnRlcmVzdGluZ2x5IHdpdGggdGhlIGRlbW9ncmFwaGljIGluZmx1eCBmcm9tIEFwcGFsYWNoaWFuIFN0YXRlIFVuaXZlcnNpdHksIGluZGljYXRpbmcgdGhhdCBhIG1ham9yaXR5IG9mIGFkdWx0cyBub3QgYXNzb2NpYXRlZCB3aXRoIHRoZSB1bml2ZXJzaXR5IGFyZSBsaWtlbHkgaG9tZW93bmVycy4gVGhpcyBmaWd1cmUgaGlnaGxpZ2h0cyBhIHJlbGF0aXZlbHkgc3RhYmxlIG93bmVyc2hpcCByYXRlIGJ1dCBhbHNvIG1hc2tzIHVuZGVybHlpbmcgaXNzdWVzIGluIHRoZSByZW50YWwgbWFya2V0Lg0KDQpEZXNwaXRlIGEgcmVnaW9uYWwgZG93bnRyZW5kLCBXYXRhdWdhIENvdW50eSBoYXMgZXhwZXJpZW5jZWQgYW4gaW5jcmVhc2UgaW4gcmVudCBidXJkZW4gc2luY2UgMjAxNywgd2l0aCBtb3JlIHRoYW4gdHdvLXRoaXJkcyBvZiByZXNpZGVudHMgbm93IHNwZW5kaW5nIG92ZXIgMzAlIG9mIHRoZWlyIGluY29tZSBvbiByZW50LCBzaWduYWxpbmcgYSBncm93aW5nIGluc3RhYmlsaXR5IGluIHRoZSBsb2NhbCBob3VzaW5nIG1hcmtldC4gVGhpcyByaXNlIGluIHJlbnQgYnVyZGVuIHN1Z2dlc3RzIHRoYXQgZGVzcGl0ZSB0aGUgaGlnaCByYXRlIG9mIGhvbWUgb3duZXJzaGlwLCBhZmZvcmRhYmlsaXR5IHJlbWFpbnMgYSBwcmVzc2luZyBjb25jZXJuLCBwYXJ0aWN1bGFybHkgZm9yIHJlbnRlcnMuDQoNCk9uIHRoZSBvd25lcnNoaXAgc2lkZSwgdGhlIG1lZGlhbiBob3VzZSB2YWx1ZSBpbiBXYXRhdWdhIHN0YW5kcyBhdCBcJDI4MywwMDAsIGFsaWduaW5nIHdpdGggdGhlIG5hdGlvbmFsIGF2ZXJhZ2UgcHJvcGVydHkgdmFsdWUuIFRoZXJlIGhhcyBiZWVuIHNvbWUgaW1wcm92ZW1lbnQgaW4gaG91c2luZyBhZmZvcmRhYmlsaXR5IGFtb25nIG93bmVycyBvdmVyIHRoZSBwYXN0IGZpdmUgeWVhcnMsIHdpdGggdGhlIHBlcmNlbnRhZ2Ugb2YgdW5hZmZvcmRhYmxlIG93bmVyLW9jY3VwaWVkIGhvdXNlcyBkZWNyZWFzaW5nIGZyb20gMTUuNiUgaW4gMjAxNyB0byAxNC40JSBpbiAyMDIyLiBUaGlzIHJhdGUgb2YgdW5hZmZvcmRhYmxlIGhvdXNpbmcgaXMgc2xpZ2h0bHkgYmV0dGVyIHRoYW4gdGhlIG5hdGlvbmFsIGF2ZXJhZ2Ugb2YgMTYuOCUsIGluZGljYXRpbmcgYSBwb3NpdGl2ZSB0cmVuZCB0b3dhcmRzIGdyZWF0ZXIgYWZmb3JkYWJpbGl0eSBmb3IgaG9tZW93bmVycy4NCg0KVGhlIGNvdW50eeKAmXMgZGVtb2dyYXBoaWMgcHJvZmlsZSBpcyBzaWduaWZpY2FudGx5IHNoYXBlZCBieSB0aGUgcHJlc2VuY2Ugb2YgQXBwYWxhY2hpYW4gU3RhdGUgVW5pdmVyc2l0eSwgd2hpY2ggaG9zdHMgb3ZlciAxOCwwMDAgc3R1ZGVudHMuIEFwcHJveGltYXRlbHkgMzAlIG9mIHRoZSBjb3VudHnigJlzIHBvcHVsYXRpb24gY29tcHJpc2VzIGNvbGxlZ2Ugc3R1ZGVudHMsIGltcGFjdGluZyB0aGUgbG9jYWwgZWNvbm9teSBhbmQgdGhlIGhvdXNpbmcgbWFya2V0LiBUaGUgaW5mbHVlbmNlIG9mIHRoZSBzdHVkZW50IHBvcHVsYXRpb24gbmVjZXNzaXRhdGVzIGNhcmVmdWwgcGxhbm5pbmcgZnJvbSB0aGUgSG91c2luZyBDb3VuY2lsIHRvIGFjY29tbW9kYXRlIGJvdGggdGhlIGN1cnJlbnQgYW5kIGZ1dHVyZSBob3VzaW5nIG5lZWRzIG9mIHN0dWRlbnRzIGFuZCB0aGUgYnJvYWRlciBjb21tdW5pdHkgYXMgc3R1ZGVudHMgdHJhbnNpdGlvbiBpbnRvIHRoZSB3b3JrZm9yY2Ugd2l0aGluIHRoZSBjb3VudHkuDQoNCkxhc3RseSwgdmVoaWNsZSBvd25lcnNoaXAgaXMgbm90YWJseSBoaWdoIGluIFdhdGF1Z2EsIHdpdGggbmVhcmx5IGV2ZXJ5IGhvdXNlaG9sZCBvd25pbmcgYXQgbGVhc3Qgb25lIGNhciwgYW5kIGFib3V0IDE0LDAwMCBob3VzZWhvbGRzIG93bmluZyB0d28gb3IgbW9yZS4gVGhpcyBwcmV2YWxlbmNlIG9mIHZlaGljbGUgb3duZXJzaGlwIGluZGljYXRlcyB0aGF0IG1vYmlsaXR5IHdpdGhpbiB0aGUgY291bnR5IGlzIGxhcmdlbHkgY2FyLWRlcGVuZGVudCwgaW5mbHVlbmNpbmcgZGFpbHkgdHJhdmVsIHBhdHRlcm5zIGFuZCBwb3RlbnRpYWxseSBpbXBhY3RpbmcgaG91c2luZyBsb2NhdGlvbiBwcmVmZXJlbmNlcyByZWxhdGVkIHRvIGFjY2Vzc2liaWxpdHkgYW5kIGNvbW11dGUgZGlzdGFuY2VzLg0KDQojIyMjIEhvdXNpbmcgYnkgT2NjdXBhbmN5IFR5cGUgKE93biB2cy4gUmVudCkgey51bm51bWJlcmVkfQ0KDQpgYGB7ciBob3VzaW5nX29jY3VwYW5jeSwgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSwgZmlnLnNob3c9J2hvbGQnfQ0KY291bnR5MTdvY3VwIDwtIA0KICBnZXRfYWNzKGdlb2dyYXBoeSA9ICJjb3VudHkiLCANCiAgICAgICAgICB2YXJpYWJsZXMgPSBjKCJTMjUwMV9DMDFfMDAxIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICJTMjUwMV9DMDNfMDAxIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICJTMjUwMV9DMDVfMDAxIg0KICAgICAgICAgICAgICAgICAgICAgICAgKSwgDQogICAgICAgICAgeWVhcj0yMDE3LCBzdGF0ZT0iTkMiLCANCiAgICAgICAgICBnZW9tZXRyeT1UUlVFLCBvdXRwdXQ9IndpZGUiKSAlPiUNCiAgc3RfdHJhbnNmb3JtKCdFUFNHOjQzMjYnKSAlPiUNCiAgcmVuYW1lKFRvdGFsID0gUzI1MDFfQzAxXzAwMUUsDQogICAgICAgIE93bmVyID0gUzI1MDFfQzAzXzAwMUUsDQogICAgICAgIFJlbnRlciA9IFMyNTAxX0MwNV8wMDFFKSAlPiUNCiAgZHBseXI6OnNlbGVjdCgtc3RhcnRzX3dpdGgoIkIiKSkgJT4lDQogIG11dGF0ZSgNCiAgICAgICAgIE5BTUUgPSBzdHJfcmVwbGFjZShOQU1FLCAiLCBOb3J0aCBDYXJvbGluYSIsICIiKSkgJT4lDQogIGRwbHlyOjpmaWx0ZXIoTkFNRSAlaW4lIGMoIkF2ZXJ5IENvdW50eSIsICJXaWxrZXMgQ291bnR5IiwgIkFzaGUgQ291bnR5IiwgIldhdGF1Z2EgQ291bnR5IiwgIkNhbGR3ZWxsIENvdW50eSIpKSAlPiUNCiAgZHBseXI6OnNlbGVjdChHRU9JRCwgTkFNRSwgVG90YWwsIE93bmVyLCBSZW50ZXIpDQoNCmNvdW50eTIyb2N1cCA8LSANCiAgZ2V0X2FjcyhnZW9ncmFwaHkgPSAiY291bnR5IiwgDQogICAgICAgICAgdmFyaWFibGVzID0gYygiUzI1MDFfQzAxXzAwMSIsDQogICAgICAgICAgICAgICAgICAgICAgICAiUzI1MDFfQzAzXzAwMSIsDQogICAgICAgICAgICAgICAgICAgICAgICAiUzI1MDFfQzA1XzAwMSINCiAgICAgICAgICAgICAgICAgICAgICAgICksIA0KICAgICAgICAgIHllYXI9MjAyMiwgc3RhdGU9Ik5DIiwgDQogICAgICAgICAgZ2VvbWV0cnk9VFJVRSwgb3V0cHV0PSJ3aWRlIikgJT4lDQogIHN0X3RyYW5zZm9ybSgnRVBTRzo0MzI2JykgJT4lDQogIHJlbmFtZShUb3RhbCA9IFMyNTAxX0MwMV8wMDFFLA0KICAgICAgICBPd25lciA9IFMyNTAxX0MwM18wMDFFLA0KICAgICAgICBSZW50ZXIgPSBTMjUwMV9DMDVfMDAxRSkgJT4lDQogIGRwbHlyOjpzZWxlY3QoLXN0YXJ0c193aXRoKCJCIikpICU+JQ0KICBtdXRhdGUoDQogICAgICAgICBOQU1FID0gc3RyX3JlcGxhY2UoTkFNRSwgIiwgTm9ydGggQ2Fyb2xpbmEiLCAiIikpICU+JQ0KICBkcGx5cjo6ZmlsdGVyKE5BTUUgJWluJSBjKCJBdmVyeSBDb3VudHkiLCAiV2lsa2VzIENvdW50eSIsICJBc2hlIENvdW50eSIsICJXYXRhdWdhIENvdW50eSIsICJDYWxkd2VsbCBDb3VudHkiKSkgJT4lDQogIGRwbHlyOjpzZWxlY3QoR0VPSUQsIE5BTUUsIFRvdGFsLCBPd25lciwgUmVudGVyKQ0KDQpjb3VudHkxN29jdXAgPC0gY291bnR5MTdvY3VwICU+JSBtdXRhdGUoeWVhciA9IDIwMTcpDQpjb3VudHkyMm9jdXAgPC0gY291bnR5MjJvY3VwICU+JSBtdXRhdGUoeWVhciA9IDIwMjIpDQoNCmNvbWJpbmVkX3llYXJzb2N1cCA8LSBiaW5kX3Jvd3MoY291bnR5MTdvY3VwLCBjb3VudHkyMm9jdXApDQoNCiMgcGxvdA0KIyBsb25nIGZvcm1hdA0KY29tYmluZWRfeWVhcnNvY3VwX2xvbmcgPC0gcGl2b3RfbG9uZ2VyKGNvbWJpbmVkX3llYXJzb2N1cCwgY29scyA9IGMoUmVudGVyLCBPd25lciksIG5hbWVzX3RvID0gIk9jY3VwYW5jeSIsIHZhbHVlc190byA9ICJVbml0cyIpDQoNCmdncGxvdChjb21iaW5lZF95ZWFyc29jdXBfbG9uZywgYWVzKHggPSBOQU1FLCB5ID0gVW5pdHMsIGZpbGwgPSBPY2N1cGFuY3kpKSArDQogIGdlb21fYmFyKHN0YXQgPSAiaWRlbnRpdHkiLCBwb3NpdGlvbiA9ICJkb2RnZSIpICsNCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gYygiI2Y5YmYzZSIsICIjNzRjMWI5IikpICsNCiAgbGFicyh0aXRsZSA9ICJIb3VzaW5nIFVuaXRzIiwNCiAgICAgICBzdWJ0aXRsZSA9ICJieSBvY2N1cGFuY3kgdHlwZSIsDQogICAgICAgeCA9ICIgIiwNCiAgICAgICB5ID0gIiMgb2YgSG91c2luZyBVbml0cyIsDQogICAgICAgZmlsbCA9ICJPY2N1cGFuY3kiKSArDQogIHRoZW1lX21pbmltYWwoKSArDQogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNDUsIGhqdXN0ID0gMSksDQogICAgICAgIGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KGNvbG9yID0gImdyZXk1MCIpKQ0KYGBgDQoNCiMjIyMgUmVudCBCdXJkZW4gey51bm51bWJlcmVkfQ0KDQpgYGB7ciByZW50X2J1cmRlbiwgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSwgZmlnLnNob3c9J2hvbGQnfQ0KY291bnR5MTdyZW50IDwtIA0KICBnZXRfYWNzKGdlb2dyYXBoeSA9ICJjb3VudHkiLCANCiAgICAgICAgICB2YXJpYWJsZXMgPSBjKCJCMjUwNzBfMDA3RSIsDQogICAgICAgICAgICAgICAgICAgICAgICAiQjI1MDcwXzAwOEUiLA0KICAgICAgICAgICAgICAgICAgICAgICAgIkIyNTA3MF8wMDlFIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICJCMjUwNzBfMDEwRSIsDQogICAgICAgICAgICAgICAgICAgICAgICAiQjI1MDcwXzAxMUUiLA0KICAgICAgICAgICAgICAgICAgICAgICAgIkIyNTAwM18wMDNFIiksIA0KICAgICAgICAgIHllYXI9MjAxNywgc3RhdGU9Ik5DIiwgDQogICAgICAgICAgZ2VvbWV0cnk9VFJVRSwgb3V0cHV0PSJ3aWRlIikgJT4lDQogIHN0X3RyYW5zZm9ybSgnRVBTRzo0MzI2JykgJT4lDQogIHJlbmFtZShSZW50QnVyZGVuXzMwXzM1ID0gQjI1MDcwXzAwN0UsDQogICAgICAgICBSZW50QnVyZGVuXzM1XzM5ID0gQjI1MDcwXzAwOEUsDQogICAgICAgICBSZW50QnVyZGVuXzQwXzQ5ID0gQjI1MDcwXzAwOUUsDQogICAgICAgICBSZW50QnVyZGVuXzUwXzk5ID0gQjI1MDcwXzAxMEUsDQogICAgICAgICBSZW50QnVyZGVuXzYwX21vcmUgPSBCMjUwNzBfMDExRSwNCiAgICAgICAgIHRvdGFsX3JlbnRlcl9vY2N1cGllZCA9IEIyNTAwM18wMDNFKSAlPiUNCiAgZHBseXI6OnNlbGVjdCgtc3RhcnRzX3dpdGgoIkIiKSkgJT4lDQogIG11dGF0ZShyZW50X2J1cmRlbmVkX2hvdXNlaG9sZHMgPSBSZW50QnVyZGVuXzMwXzM1ICsgUmVudEJ1cmRlbl8zNV8zOSArIFJlbnRCdXJkZW5fNDBfNDkgKyBSZW50QnVyZGVuXzUwXzk5ICsgUmVudEJ1cmRlbl82MF9tb3JlLA0KICAgICAgICAgUGVyY2VudF9CdXJkZW5lZCA9IHJvdW5kKChyZW50X2J1cmRlbmVkX2hvdXNlaG9sZHMgLyB0b3RhbF9yZW50ZXJfb2NjdXBpZWQpICogMTAwLCAwKSwNCiAgICAgICAgIE5BTUUgPSBzdHJfcmVwbGFjZShOQU1FLCAiLCBOb3J0aCBDYXJvbGluYSIsICIiKSkgJT4lDQogIGRwbHlyOjpmaWx0ZXIoTkFNRSAlaW4lIGMoIkF2ZXJ5IENvdW50eSIsICJXaWxrZXMgQ291bnR5IiwgIkFzaGUgQ291bnR5IiwgIldhdGF1Z2EgQ291bnR5IiwiQ2FsZHdlbGwgQ291bnR5IikpICU+JQ0KICBkcGx5cjo6c2VsZWN0KEdFT0lELCBOQU1FLCByZW50X2J1cmRlbmVkX2hvdXNlaG9sZHMsIHRvdGFsX3JlbnRlcl9vY2N1cGllZCwgUGVyY2VudF9CdXJkZW5lZCkNCg0KY291bnR5MjJyZW50IDwtIA0KICBnZXRfYWNzKGdlb2dyYXBoeSA9ICJjb3VudHkiLCANCiAgICAgICAgICB2YXJpYWJsZXMgPSBjKCJCMjUwNzBfMDA3RSIsDQogICAgICAgICAgICAgICAgICAgICAgICAiQjI1MDcwXzAwOEUiLA0KICAgICAgICAgICAgICAgICAgICAgICAgIkIyNTA3MF8wMDlFIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICJCMjUwNzBfMDEwRSIsDQogICAgICAgICAgICAgICAgICAgICAgICAiQjI1MDcwXzAxMUUiLA0KICAgICAgICAgICAgICAgICAgICAgICAgIkIyNTAwM18wMDNFIiksIA0KICAgICAgICAgIHllYXI9MjAyMiwgc3RhdGU9Ik5DIiwgDQogICAgICAgICAgZ2VvbWV0cnk9VFJVRSwgb3V0cHV0PSJ3aWRlIikgJT4lDQogIHN0X3RyYW5zZm9ybSgnRVBTRzo0MzI2JykgJT4lDQogIHJlbmFtZShSZW50QnVyZGVuXzMwXzM1ID0gQjI1MDcwXzAwN0UsDQogICAgICAgICBSZW50QnVyZGVuXzM1XzM5ID0gQjI1MDcwXzAwOEUsDQogICAgICAgICBSZW50QnVyZGVuXzQwXzQ5ID0gQjI1MDcwXzAwOUUsDQogICAgICAgICBSZW50QnVyZGVuXzUwXzk5ID0gQjI1MDcwXzAxMEUsDQogICAgICAgICBSZW50QnVyZGVuXzYwX21vcmUgPSBCMjUwNzBfMDExRSwNCiAgICAgICAgIHRvdGFsX3JlbnRlcl9vY2N1cGllZCA9IEIyNTAwM18wMDNFKSAlPiUNCiAgZHBseXI6OnNlbGVjdCgtc3RhcnRzX3dpdGgoIkIiKSkgJT4lDQogIG11dGF0ZShyZW50X2J1cmRlbmVkX2hvdXNlaG9sZHMgPSBSZW50QnVyZGVuXzMwXzM1ICsgUmVudEJ1cmRlbl8zNV8zOSArIFJlbnRCdXJkZW5fNDBfNDkgKyBSZW50QnVyZGVuXzUwXzk5ICsgUmVudEJ1cmRlbl82MF9tb3JlLA0KICAgICAgICAgUGVyY2VudF9CdXJkZW5lZCA9IHJvdW5kKChyZW50X2J1cmRlbmVkX2hvdXNlaG9sZHMgLyB0b3RhbF9yZW50ZXJfb2NjdXBpZWQpICogMTAwLCAwKSwNCiAgICAgICAgIE5BTUUgPSBzdHJfcmVwbGFjZShOQU1FLCAiLCBOb3J0aCBDYXJvbGluYSIsICIiKSkgJT4lDQogIGRwbHlyOjpmaWx0ZXIoTkFNRSAlaW4lIGMoIkF2ZXJ5IENvdW50eSIsICJXaWxrZXMgQ291bnR5IiwgIkFzaGUgQ291bnR5IiwgIldhdGF1Z2EgQ291bnR5IiwgIkNhbGR3ZWxsIENvdW50eSIpKSAlPiUNCiAgZHBseXI6OnNlbGVjdChHRU9JRCwgTkFNRSwgcmVudF9idXJkZW5lZF9ob3VzZWhvbGRzLCB0b3RhbF9yZW50ZXJfb2NjdXBpZWQsIFBlcmNlbnRfQnVyZGVuZWQpDQoNCmNvdW50eTE3cmVudCA8LSBjb3VudHkxN3JlbnQgJT4lIG11dGF0ZSh5ZWFyID0gMjAxNykNCmNvdW50eTIycmVudCA8LSBjb3VudHkyMnJlbnQgJT4lIG11dGF0ZSh5ZWFyID0gMjAyMikNCg0KY29tYmluZWRfeWVhcnNyZW50IDwtIGJpbmRfcm93cyhjb3VudHkxN3JlbnQsIGNvdW50eTIycmVudCkNCg0KDQojIFJlc2hhcGUgdGhlIGRhdGEgaW50byBsb25nZXIgZm9ybWF0DQpjb21iaW5lZF95ZWFyc3JlbnRfbG9uZyA8LSBwaXZvdF9sb25nZXIoY29tYmluZWRfeWVhcnNyZW50LCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xzID0gYyhQZXJjZW50X0J1cmRlbmVkKSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZXNfdG8gPSAiWWVhciIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlc190byA9ICJQZXJjZW50YWdlIikNCg0KIyBQbG90dGluZyB0aGUgZGF0YQ0KZ2dwbG90KGNvbWJpbmVkX3llYXJzcmVudF9sb25nLCBhZXMoeCA9IHJlb3JkZXIoTkFNRSwgLVBlcmNlbnRhZ2UpLCB5ID0gUGVyY2VudGFnZSwgZmlsbCA9IFllYXIpKSArDQogIGdlb21fYmFyKHN0YXQgPSAiaWRlbnRpdHkiLCBwb3NpdGlvbiA9ICJkb2RnZSIpICsNCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gYygiI2Y5YmYzZSIpLCBndWlkZSA9IEZBTFNFKSArICAjIEhpZGUgbGVnZW5kDQogIGxhYnModGl0bGUgPSAiUGVyY2VudGFnZSBvZiBSZW50LUJ1cmRlbmVkIEhvdXNlaG9sZHMiLA0KICAgICAgIHN1YnRpdGxlID0gImJ5IGNvdW50eSIsDQogICAgICAgeCA9ICIgIiwNCiAgICAgICB5ID0gIlBlcmNlbnRhZ2UgKCUpIikgKw0KICB0aGVtZV9taW5pbWFsKCkgKw0KICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LCBoanVzdCA9IDEsIHZqdXN0ID0gMSksDQogICAgICAgIGF4aXMudGl0bGUueCA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgYXhpcy50ZXh0LnkgPSBlbGVtZW50X3RleHQoY29sb3IgPSAiZ3JleTUwIikpICAjIEhpZGluZyB4LWF4aXMgbGFiZWwNCmBgYA0KDQpgYGB7ciByZW50X2J1cmRlbl9tYXAxNywgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSwgZmlnLnNob3c9J2hvbGQnfQ0KZ2dwbG90KGRhdGEgPSBjb3VudHkxN3JlbnQpICsNCiAgZ2VvbV9zZihhZXMoZmlsbCA9IFBlcmNlbnRfQnVyZGVuZWQpKSArICMgUmVtb3ZlZCBjb2xvciA9IGNvbG9yX3BhbGV0dGUgaGVyZQ0KICBzY2FsZV9maWxsX2dyYWRpZW50bihjb2xvcnMgPSBjb2xvcl9wYWxldHRlKSArICMgVXNlIHRoaXMgdG8gYXBwbHkgeW91ciBjb2xvciBwYWxldHRlDQogIGdlb21fc2ZfdGV4dChhZXMobGFiZWwgPSBOQU1FKSwgDQogICAgICAgICAgICAgICBzaXplID0gNCwgIyBBZGp1c3RlZCBzaXplDQogICAgICAgICAgICAgICBjb2xvdXIgPSAiYmxhY2siLCANCiAgICAgICAgICAgICAgIGNoZWNrX292ZXJsYXAgPSBUUlVFLA0KICAgICAgICAgICAgICAgZm9udGZhY2UgPSAiYm9sZCIpICsgIyBNYWtlIHRleHQgYm9sZA0KICBnZW9tX3NmX3RleHQoYWVzKGxhYmVsID0gcGFzdGUwKFBlcmNlbnRfQnVyZGVuZWQsICIlIikpLCANCiAgICAgICAgICAgICAgIHNpemUgPSAzLjUsICMgQWRqdXN0ZWQgc2l6ZQ0KICAgICAgICAgICAgICAgY29sb3VyID0gImJsYWNrIiwgDQogICAgICAgICAgICAgICBjaGVja19vdmVybGFwID0gVFJVRSwgDQogICAgICAgICAgICAgICBudWRnZV95ID0gLTAuMDUsDQogICAgICAgICAgICAgICBmb250ZmFjZSA9ICJib2xkIikgKyAjIE1ha2UgdGV4dCBib2xkDQogIGxhYnModGl0bGUgPSAiUmVudCBCdXJkZW5lZCBIb3VzZWhvbGRzIGJ5IENvdW50eSIsDQogICAgICAgc3VidGl0bGUgPSAiWWVhcjogMjAxNyIsDQogICAgICAgZmlsbCA9ICJQZXJjZW50IEJ1cmRlbmVkIikgKw0KICB0aGVtZV92b2lkKCkgKw0KICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAicmlnaHQiKQ0KYGBgDQoNCmBgYHtyIHJlbnRfYnVyZGVuX21hcDIyLCBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBmaWcuc2hvdz0naG9sZCd9DQpnZ3Bsb3QoZGF0YSA9IGNvdW50eTIycmVudCkgKw0KICBnZW9tX3NmKGFlcyhmaWxsID0gUGVyY2VudF9CdXJkZW5lZCkpICsgIyBSZW1vdmVkIGNvbG9yID0gY29sb3JfcGFsZXR0ZSBoZXJlDQogIHNjYWxlX2ZpbGxfZ3JhZGllbnRuKGNvbG9ycyA9IGNvbG9yX3BhbGV0dGUpICsgIyBVc2UgdGhpcyB0byBhcHBseSB5b3VyIGNvbG9yIHBhbGV0dGUNCiAgZ2VvbV9zZl90ZXh0KGFlcyhsYWJlbCA9IE5BTUUpLCANCiAgICAgICAgICAgICAgIHNpemUgPSA0LCAjIEFkanVzdGVkIHNpemUNCiAgICAgICAgICAgICAgIGNvbG91ciA9ICJibGFjayIsIA0KICAgICAgICAgICAgICAgY2hlY2tfb3ZlcmxhcCA9IFRSVUUsDQogICAgICAgICAgICAgICBmb250ZmFjZSA9ICJib2xkIikgKyAjIE1ha2UgdGV4dCBib2xkDQogIGdlb21fc2ZfdGV4dChhZXMobGFiZWwgPSBwYXN0ZTAoUGVyY2VudF9CdXJkZW5lZCwgIiUiKSksIA0KICAgICAgICAgICAgICAgc2l6ZSA9IDMuNSwgIyBBZGp1c3RlZCBzaXplDQogICAgICAgICAgICAgICBjb2xvdXIgPSAiYmxhY2siLCANCiAgICAgICAgICAgICAgIGNoZWNrX292ZXJsYXAgPSBUUlVFLCANCiAgICAgICAgICAgICAgIG51ZGdlX3kgPSAtMC4wNSwNCiAgICAgICAgICAgICAgIGZvbnRmYWNlID0gImJvbGQiKSArICMgTWFrZSB0ZXh0IGJvbGQNCiAgbGFicyh0aXRsZSA9ICJSZW50IEJ1cmRlbmVkIEhvdXNlaG9sZHMgYnkgQ291bnR5IiwNCiAgICAgICBzdWJ0aXRsZSA9ICJZZWFyOiAyMDIyIiwNCiAgICAgICBmaWxsID0gIlBlcmNlbnQgQnVyZGVuZWQiKSArDQogIHRoZW1lX3ZvaWQoKSArDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJyaWdodCIpDQpgYGANCg0KIyMjIyBOdW1iZXIgb2YgSG91c2Vob2xkcyBieSBWZWhpY2xlcyBPd25lZCB7LnVubnVtYmVyZWR9DQoNCmBgYHtyIHZlaGljbGVzX293bmVkLCBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBmaWcuc2hvdz0naG9sZCd9DQpjb3VudHkxNyA8LSANCiAgZ2V0X2FjcyhnZW9ncmFwaHkgPSAiY291bnR5IiwgDQogICAgICAgICAgdmFyaWFibGVzID0gYygiQjA4MjAxXzAwMiIsDQogICAgICAgICAgICAgICAgICAgICAgICAiQjA4MjAxXzAwMyIsDQogICAgICAgICAgICAgICAgICAgICAgICAiQjA4MjAxXzAwNCIsDQogICAgICAgICAgICAgICAgICAgICAgICAiQjA4MjAxXzAwNSIsDQogICAgICAgICAgICAgICAgICAgICAgICAiQjA4MjAxXzAwNiIpLCANCiAgICAgICAgICB5ZWFyPTIwMTcsIHN0YXRlPSJOQyIsIA0KICAgICAgICAgIGdlb21ldHJ5PVRSVUUsIG91dHB1dD0id2lkZSIpICU+JQ0KICBzdF90cmFuc2Zvcm0oJ0VQU0c6NDMyNicpICU+JQ0KICByZW5hbWUoIk5vIFZlaGljbGUiID0gQjA4MjAxXzAwMkUsDQogICAgICAgICAiMSBWZWhpY2xlIiA9IEIwODIwMV8wMDNFLA0KICAgICAgICAgIjIgVmVoaWNsZXMiID0gQjA4MjAxXzAwNEUsDQogICAgICAgICAiMyBWZWhpY2xlcyIgPSBCMDgyMDFfMDA1RSwNCiAgICAgICAgICI0KyBWZWhpY2xlcyIgPSBCMDgyMDFfMDA2RSkgJT4lDQogIGRwbHlyOjpzZWxlY3QoLXN0YXJ0c193aXRoKCJCIikpICU+JQ0KICBtdXRhdGUoDQogICAgICAgICBOQU1FID0gc3RyX3JlcGxhY2UoTkFNRSwgIiwgTm9ydGggQ2Fyb2xpbmEiLCAiIikpICU+JQ0KICBkcGx5cjo6ZmlsdGVyKE5BTUUgJWluJSBjKCJBdmVyeSBDb3VudHkiLCAiV2lsa2VzIENvdW50eSIsICJBc2hlIENvdW50eSIsICJXYXRhdWdhIENvdW50eSIsICJDYWxkd2VsbCBDb3VudHkiKSkgJT4lDQogIGRwbHlyOjpzZWxlY3QoR0VPSUQsIE5BTUUsICJObyBWZWhpY2xlIiwgIjEgVmVoaWNsZSIsICIyIFZlaGljbGVzIiwgIjMgVmVoaWNsZXMiLCAiNCsgVmVoaWNsZXMiKQ0KDQpjb3VudHkyMiA8LSANCiAgZ2V0X2FjcyhnZW9ncmFwaHkgPSAiY291bnR5IiwgDQogICAgICAgICAgdmFyaWFibGVzID0gYygiQjA4MjAxXzAwMiIsDQogICAgICAgICAgICAgICAgICAgICAgICAiQjA4MjAxXzAwMyIsDQogICAgICAgICAgICAgICAgICAgICAgICAiQjA4MjAxXzAwNCIsDQogICAgICAgICAgICAgICAgICAgICAgICAiQjA4MjAxXzAwNSIsDQogICAgICAgICAgICAgICAgICAgICAgICAiQjA4MjAxXzAwNiIpLCANCiAgICAgICAgICB5ZWFyPTIwMjIsIHN0YXRlPSJOQyIsIA0KICAgICAgICAgIGdlb21ldHJ5PVRSVUUsIG91dHB1dD0id2lkZSIpICU+JQ0KICBzdF90cmFuc2Zvcm0oJ0VQU0c6NDMyNicpICU+JQ0KICByZW5hbWUoIk5vIFZlaGljbGUiID0gQjA4MjAxXzAwMkUsDQogICAgICAgICAiMSBWZWhpY2xlIiA9IEIwODIwMV8wMDNFLA0KICAgICAgICAgIjIgVmVoaWNsZXMiID0gQjA4MjAxXzAwNEUsDQogICAgICAgICAiMyBWZWhpY2xlcyIgPSBCMDgyMDFfMDA1RSwNCiAgICAgICAgICI0KyBWZWhpY2xlcyIgPSBCMDgyMDFfMDA2RSkgJT4lDQogIGRwbHlyOjpzZWxlY3QoLXN0YXJ0c193aXRoKCJCIikpICU+JQ0KICBtdXRhdGUoDQogICAgICAgICBOQU1FID0gc3RyX3JlcGxhY2UoTkFNRSwgIiwgTm9ydGggQ2Fyb2xpbmEiLCAiIikpICU+JQ0KICBkcGx5cjo6ZmlsdGVyKE5BTUUgJWluJSBjKCJBdmVyeSBDb3VudHkiLCAiV2lsa2VzIENvdW50eSIsICJBc2hlIENvdW50eSIsICJXYXRhdWdhIENvdW50eSIsICJDYWxkd2VsbCBDb3VudHkiKSkgJT4lDQogIGRwbHlyOjpzZWxlY3QoR0VPSUQsIE5BTUUsICJObyBWZWhpY2xlIiwgIjEgVmVoaWNsZSIsICIyIFZlaGljbGVzIiwgIjMgVmVoaWNsZXMiLCAiNCsgVmVoaWNsZXMiKQ0KDQpjb3VudHkxNyA8LSBjb3VudHkxNyAlPiUgbXV0YXRlKHllYXIgPSAyMDE3KQ0KY291bnR5MjIgPC0gY291bnR5MjIgJT4lIG11dGF0ZSh5ZWFyID0gMjAyMikNCg0KY29tYmluZWRfeWVhcnMgPC0gYmluZF9yb3dzKGNvdW50eTE3LCBjb3VudHkyMikNCg0KIyBTdWJzZXQgZGF0YSBmb3IgV2F0YXVnYSBDb3VudHkNCndhdGF1Z2FfZGF0YSA8LSBjb21iaW5lZF95ZWFycyAlPiUNCiAgZmlsdGVyKE5BTUUgPT0gIldhdGF1Z2EgQ291bnR5IikNCg0KIyBNZWx0IHRoZSBkYXRhc2V0IHRvIGxvbmcgZm9ybWF0DQp3YXRhdWdhX2RhdGFfbG9uZyA8LSBtZWx0KHdhdGF1Z2FfZGF0YSwgaWQudmFycyA9IGMoInllYXIiLCAiTkFNRSIsICJHRU9JRCIpLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgbWVhc3VyZS52YXJzID0gYygiTm8gVmVoaWNsZSIsICIxIFZlaGljbGUiLCAiMiBWZWhpY2xlcyIsICIzIFZlaGljbGVzIiwgIjQrIFZlaGljbGVzIiksDQogICAgICAgICAgICAgICAgICAgICAgICAgIHZhcmlhYmxlLm5hbWUgPSAiVmVoaWNsZV9DYXRlZ29yeSIsIHZhbHVlLm5hbWUgPSAiSG91c2Vob2xkcyIpDQoNCiMgUGxvdCBoaXN0b2dyYW0NCmdncGxvdCh3YXRhdWdhX2RhdGFfbG9uZywgYWVzKHggPSBWZWhpY2xlX0NhdGVnb3J5LCB5ID0gSG91c2Vob2xkcywgZmlsbCA9IGZhY3Rvcih5ZWFyKSkpICsNCiAgZ2VvbV9iYXIoc3RhdCA9ICJpZGVudGl0eSIsIHBvc2l0aW9uID0gImRvZGdlIikgKw0KICBsYWJzKHRpdGxlID0gIk51bWJlciBvZiBIb3VzZWhvbGRzIGJ5IFZlaGljbGVzIE93bmVkIiwNCiAgICAgICBzdWJ0aXRsZSA9ICJZZWFyczogMjAxNyBhbmQgMjAyMiIgLA0KICAgICAgIHggPSAiICIsDQogICAgICAgeSA9ICJOdW1iZXIgb2YgSG91c2Vob2xkcyIsDQogICAgICAgZmlsbCA9ICJZZWFyIikgKw0KICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBjKCIjZjliZjNlIiwgIiM3NGMxYjkiKSwgbGFiZWxzID0gYygiMjAxNyIsICIyMDIyIikpICsNCiAgdGhlbWVfbWluaW1hbCgpICsNCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA0NSwgaGp1c3QgPSAxKSkNCmBgYA0KDQojIyAyLjQgUGh5c2ljYWwgRmVhdHVyZXMNCg0KIyMjIExhbmQgQ292ZXIgQ2hhbmdlcyBPdmVyIDEwIFllYXJzIHsudGFic2V0fQ0KDQpXYXRhdWdhIENvdW50eSBoYXMgZXhwZXJpZW5jZWQgc2lnbmlmaWNhbnQgbGFuZCBjb3ZlciBjaGFuZ2VzIGZyb20gMjAxMSB0byAyMDIxLCByZWZsZWN0aW5nIGEgbm90YWJsZSBzaGlmdCB0b3dhcmRzIGRldmVsb3BtZW50IGF0IHRoZSBleHBlbnNlIG9mIG5hdHVyYWwgbGFuZHNjYXBlcy4gVGhlIGRhdGEgaW5kaWNhdGVzIGEgMTMuODklIGluY3JlYXNlIGluIGRldmVsb3BlZCBhcmVhcyBlbmNvbXBhc3NpbmcgbG93LCBtZWRpdW0sIGFuZCBoaWdoLWludGVuc2l0eSBkZXZlbG9wbWVudHMsIHdpdGggbWVkaXVtIGludGVuc2l0eSBzZWVpbmcgdGhlIG1vc3Qgc2lnbmlmaWNhbnQgZ3Jvd3RoIGF0IDE3LjIyJSBieSAyMDIxLiBDb25jdXJyZW50bHksIHRoZXJlIGhhcyBiZWVuIGEgZHJhbWF0aWMgcmVkdWN0aW9uIGluIG5hdHVyYWwgbGFuZCBjb3ZlcnMsIHdpdGggYSA1Ni41JSBkZWNyZWFzZSBpbiBHcmFzc2xhbmQvSGVyYmFjZW91cyBhcmVhcyBhbmQgYSA1MCUgcmVkdWN0aW9uIGluIFNocnViL1NjcnViIGxhbmQuIFRoZXNlIGNoYW5nZXMgYXJlIGxpa2VseSBkdWUgdG8gdGhlIGNvbnZlcnNpb24gb2Ygb3BlbiBmaWVsZHMgYW5kIGdyYXNzbGFuZHMgaW50byBkZXZlbG9wZWQgbGFuZCBvciBhZ3JpY3VsdHVyYWwgdXNlLCB0aG91Z2ggdGhlIG1ham9yaXR5IG9mIHRoZSBsYW5kIHJlbWFpbnMgbmF0dXJhbCBvciBzZW1pLW5hdHVyYWwgd2l0aCBhIHNtYWxsIHJpc2UgaW4gZGV2ZWxvcGVkIG9wZW4gc3BhY2VzLg0KDQpUaGUgMjAyMSBsYW5kIGNvdmVyIGRhdGEgZnVydGhlciB1bmRlcnNjb3JlcyBXYXRhdWdhIENvdW50eSdzIHJpY2ggbmF0dXJhbCByZXNvdXJjZXMgYWdhaW5zdCBpdHMgbW9kZXJhdGUgdXJiYW4gZGV2ZWxvcG1lbnQuIFRoZSBhcmVhIGlzIHByZWRvbWluYW50bHkgZm9yZXN0ZWQsIHdpdGggNzQuNTYlIG9mIHRoZSBsYW5kIGNvdmVyZWQgYnkgZm9yZXN0cywgaW5jbHVkaW5nIDU0LjE2JSBkZWNpZHVvdXMsIDE5LjIlIG1peGVkLCBhbmQgMS4yJSBldmVyZ3JlZW4gZm9yZXN0cy4gRGV2ZWxvcGVkIGFyZWFzIGNvbnN0aXR1dGUgb25seSAxMy44OSUgb2YgdGhlIHRvdGFsIGxhbmQgY292ZXIsIHdpdGggMTEuMjMlIGFzIGRldmVsb3BlZCBvcGVuIHNwYWNlLCAxLjQ4JSBsb3cgaW50ZW5zaXR5LCAwLjklIG1lZGl1bSBkZW5zaXR5LCBhbmQgMC4yOCUgaGlnaCBpbnRlbnNpdHkuIFRoZSBwcmVwb25kZXJhbmNlIG9mIGRldmVsb3BtZW50IGlzIGNsYXNzaWZpZWQgYXMgb3BlbiBzcGFjZSwgc3VjaCBhcyBwYXJrcywgZ29sZiBjb3Vyc2VzLCBvciBhZ3JpY3VsdHVyYWwgbGFuZCB0aGF0IG1haW50YWlucyB0aGUgcnVyYWwgY2hhcmFjdGVyIG9mIHRoZSBjb3VudHkuIFRoZSBzbWFsbGVyIHBlcmNlbnRhZ2VzIG9mIG1vcmUgaW50ZW5zaXZlIGRldmVsb3BtZW50cyByZWZsZWN0IGNvbmNlbnRyYXRlZCB1cmJhbml6YXRpb24gYXJvdW5kIGNpdGllcyBhbmQgdHJhbnNwb3J0YXRpb24gY29ycmlkb3JzLCBpbmRpY2F0aW5nIHN0cmF0ZWdpYyBsYW5kIHVzZSBwbGFubmluZyB0aGF0IGJhbGFuY2VzIG5hdHVyYWwgbGFuZHNjYXBlIHByZXNlcnZhdGlvbiB3aXRoIHJlc2lkZW50aWFsIGFuZCBjb21tZXJjaWFsIGdyb3d0aC4gVGhpcyBjYXJlZnVsIGJhbGFuY2Ugc3VnZ2VzdHMgYSBtaW5kZnVsIGFwcHJvYWNoIHRvIGRldmVsb3BtZW50LCBwcmlvcml0aXppbmcgdGhlIG1haW50ZW5hbmNlIG9mIG5hdHVyYWwgY292ZXJzIHdoaWxlIGFjY29tbW9kYXRpbmcgbmVjZXNzYXJ5IGdyb3d0aCBvdmVyIHRoZSBwYXN0IGRlY2FkZS4NCg0KYGBge3IgcmVhZF9sdWxjX2RhdGEsIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQpzZXR3ZA0KZmlyZV9kaXN0cmljdHMgPC0gc3RfcmVhZCgiaHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tL0phcnJlZEVSYW5kYWxsL011c2FfODAxX1dhdGF1Z2EvbWFpbi9HZW9KU09OL0ZpcmVEaXN0cmljdHNfRmVhdHVyZXNUb0pTT04uZ2VvanNvbiIpDQptYW5hZ2VkX2FyZWFzIDwtIHN0X3JlYWQoImh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9KYXJyZWRFUmFuZGFsbC9NdXNhXzgwMV9XYXRhdWdhL21haW4vR2VvSlNPTi9tYW5hZ2VkX2FyZWFzVG9KU09OLmdlb2pzb24iKQ0KbmF0dXJhbF9hcmVhcyA8LSBzdF9yZWFkKCJodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vSmFycmVkRVJhbmRhbGwvTXVzYV84MDFfV2F0YXVnYS9tYWluL0dlb0pTT04vTmF0dXJhbF9hcmVhX0pTT04uZ2VvanNvbiIpDQp6b25lZF9hcmVhcyA8LSBzdF9yZWFkKCJodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vSmFycmVkRVJhbmRhbGwvTXVzYV84MDFfV2F0YXVnYS9tYWluL0dlb0pTT04vem9uZWRhcmVhc19GZWF0dXJlc1RvSlNPTi5nZW9qc29uIikNCm11bmljaXBhbF9ib3VuZCA8LSBzdF9yZWFkKCJodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vSmFycmVkRVJhbmRhbGwvTXVzYV84MDFfV2F0YXVnYS9tYWluL0dlb0pTT04vTkNET1RfTXVuaWNpcGFsX0JvdW5kYXJpZXMuZ2VvanNvbiIpDQpjb3VudHlfYm91bmQgPC0gc3RfcmVhZCgiaHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tL0phcnJlZEVSYW5kYWxsL011c2FfODAxX1dhdGF1Z2EvbWFpbi9HZW9KU09OL05DRE9UX0NvdW50eV9Cb3VuZGFyaWVzLmdlb2pzb24iKQ0KDQpsZWdlbmQgPC0gcGFsX25sY2QoKQ0KbGVnZW5kPC1wYWxfbmxjZCgpDQoNCmxjXzIwMjEgPC0gcmFzdGVyKCJDOi9Vc2Vycy9mYXRiby9PbmVEcml2ZS9Eb2N1bWVudHMvR2l0SHViL011c2FfODAxX1dhdGF1Z2EvRGF0YS9MYW5kdXNlX1Jhc3Rlci9sdWxjXzIwMjEiKQ0KbGNfMjAxOSA8LSByYXN0ZXIoIkM6L1VzZXJzL2ZhdGJvL09uZURyaXZlL0RvY3VtZW50cy9HaXRIdWIvTXVzYV84MDFfV2F0YXVnYS9EYXRhL0xhbmR1c2VfUmFzdGVyL2x1bGNfMjAxOSIpDQpsY18yMDE2IDwtIHJhc3RlcigiQzovVXNlcnMvZmF0Ym8vT25lRHJpdmUvRG9jdW1lbnRzL0dpdEh1Yi9NdXNhXzgwMV9XYXRhdWdhL0RhdGEvTGFuZHVzZV9SYXN0ZXIvbHVsY18yMDE2IikNCmxjXzIwMTMgPC0gcmFzdGVyKCJDOi9Vc2Vycy9mYXRiby9PbmVEcml2ZS9Eb2N1bWVudHMvR2l0SHViL011c2FfODAxX1dhdGF1Z2EvRGF0YS9MYW5kdXNlX1Jhc3Rlci9sdWxjXzIwMTMiKQ0KbGNfMjAxMSA8LSByYXN0ZXIoIkM6L1VzZXJzL2ZhdGJvL09uZURyaXZlL0RvY3VtZW50cy9HaXRIdWIvTXVzYV84MDFfV2F0YXVnYS9EYXRhL0xhbmR1c2VfUmFzdGVyL2x1bGNfMjAxMSIpDQpgYGANCg0KYGBge3IgbGNfMjAyMSwgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSwgZmlnLmFsaWduPSdsZWZ0J30NCnMgPC0gc3RhY2sobGNfMjAxMSwgbGNfMjAxMywgbGNfMjAxNixsY18yMDE5LCBsY18yMDIxICkNCg0KdmFscyA8LXVuaXF1ZShzW1s1XV0pICAjIEdldCB1bmlxdWUgdmFsdWVzIGZyb20gbGNfMjAyMQ0KZGYgPC0gbGVnZW5kW2xlZ2VuZCRJRCAlaW4lIHZhbHMsXSAgIyBGaWx0ZXIgbGVnZW5kIGluZm9ybWF0aW9uIGJhc2VkIG9uIGxjXzIwMjEgdmFsdWVzDQpyYXQ1IDwtIHJhdGlmeShsY18yMDIxKQ0KDQpteUtleSA8LSBsaXN0KA0KICByZWN0YW5nbGVzID0gbGlzdChjb2wgPSBkZiRDb2xvciksDQogIHRleHQgPSBsaXN0KGxhYiA9IGRmJENsYXNzKSwNCiAgc3BhY2UgPSAncmlnaHQnLA0KICBjb2x1bW5zID0gMSwNCiAgc2l6ZSA9IDIsDQogIGNleCA9IC42DQopDQpgYGANCg0KIyMjIyAyMDExLTIwMjEgey51bm51bWJlcmVkfQ0KDQpgYGB7ciBsY190aW1lX3NlcmllcywgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCnllYXJzLmxpc3QgPC0gbGlzdCgiMjAxMSIsICIyMDEzIiwgIjIwMTYiLCAiMjAxOSIsICIyMDIxIikNCg0Kc2F2ZUdJRih7DQogIGZvcihpIGluIDE6bmxheWVycyhzKSl7DQogICAgcmF0IDwtIHJhdGlmeShzW1tpXV0pDQogICAgcGxvdCA8LSBsZXZlbHBsb3QocmF0LCBhdHQ9J0lEJywNCiAgICAgICAgICAgICAgICAgICAgICBtYXhwaXhlbHM9bmNlbGwocmF0KSwNCiAgICAgICAgICAgICAgICAgICAgICBjb2wucmVnaW9ucz1kZiRDb2xvciwNCiAgICAgICAgICAgICAgICAgICAgICBwYXIuc2V0dGluZ3MgPSBsaXN0KGF4aXMubGluZSA9IGxpc3QoY29sID0gInRyYW5zcGFyZW50IiksIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaXAuYmFja2dyb3VuZCA9IGxpc3QoY29sID0gJ3RyYW5zcGFyZW50JyksIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaXAuYm9yZGVyID0gbGlzdChjb2wgPSAndHJhbnNwYXJlbnQnKSksIA0KICAgICAgICAgICAgICAgICAgICAgIHNjYWxlcyA9IGxpc3QoY29sID0gInRyYW5zcGFyZW50IiksDQogICAgICAgICAgICAgICAgICAgICAgbWFpbj1wYXN0ZTAoIldhdGF1Z2EgQ291bnR5IGxhbmQgY292ZXIgIiwgeWVhcnMubGlzdFtbaV1dKSwNCiAgICAgICAgICAgICAgICAgICAgICBjb2xvcmtleT1GQUxTRSwNCiAgICAgICAgICAgICAgICAgICAgICBrZXkgPSBteUtleSkgIyBJbmNsdWRlIHRoZSBrZXkgaW4geW91ciBwbG90DQogICAgcHJpbnQocGxvdCkNCiAgfQ0KfSwgaW50ZXJ2YWw9MSwgbW92aWUubmFtZT0ibGNfdGltZV9zZXJpZXMuZ2lmIiwgYW5pLndpZHRoPTkwMCwgYW5pLmhlaWdodD02MDApDQpgYGANCg0KIVtdKEM6L1VzZXJzL2ZhdGJvL09uZURyaXZlL0RvY3VtZW50cy9HaXRIdWIvTXVzYV84MDFfV2F0YXVnYS9EYXRhL2xjX3RpbWVfc2VyaWVzLmdpZikNCg0KIyMjIyAyMDExIHsudW5udW1iZXJlZH0NCg0KYGBge3IgbGNfMjAxMSwgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSwgZmlnLndpZHRoPSA4LCBmaWcuaGVpZ2h0PTh9DQpyYXQgPC0gcmF0aWZ5KGxjXzIwMTEpDQoNCm15S2V5IDwtIGxpc3QoDQogIHJlY3RhbmdsZXMgPSBsaXN0KGNvbCA9IGRmJENvbG9yKSwNCiAgdGV4dCA9IGxpc3QobGFiID0gZGYkQ2xhc3MpLA0KICBzcGFjZSA9ICdyaWdodCcsDQogIGNvbHVtbnMgPSAxLA0KICBzaXplID0gMiwNCiAgY2V4ID0gLjYNCikNCmxldmVscGxvdChyYXQsIGF0dD0nSUQnLCANCiAgICAgICAgICBjb2wucmVnaW9ucz1kZiRDb2xvciwNCiAgICAgICAgICBtYXhwaXhlbHM9bmNlbGwocmF0KSwgIyBUcnkgc2V0dGluZyBtYXhwaXhlbHMgdG8gdGhlIG51bWJlciBvZiBjZWxscyBpbiB0aGUgcmFzdGVyDQogICAgICAgICAgcGFyLnNldHRpbmdzID0gbGlzdCgNCiAgICAgICAgICAgIGF4aXMubGluZSA9IGxpc3QoY29sID0gInRyYW5zcGFyZW50IiksIA0KICAgICAgICAgICAgc3RyaXAuYmFja2dyb3VuZCA9IGxpc3QoY29sID0gJ3RyYW5zcGFyZW50JyksIA0KICAgICAgICAgICAgc3RyaXAuYm9yZGVyID0gbGlzdChjb2wgPSAndHJhbnNwYXJlbnQnKQ0KICAgICAgICAgICksIA0KICAgICAgICAgIHNjYWxlcyA9IGxpc3QoY29sID0gInRyYW5zcGFyZW50IiksDQogICAgICAgICAgY29sb3JrZXkgPSBGQUxTRSwNCiAgICAgICAgICBrZXkgPSBteUtleSwNCiAgICAgICAgICBtYWluID0gIldhdGF1Z2EgMjAxMSBMYW5kIENvdmVyIikgIyBUaXRsZSBhZGRlZCBoZXJlDQpgYGANCg0KIyMjIyAyMDEzIHsudW5udW1iZXJlZH0NCg0KYGBge3IgbGNfMjAxMywgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSwgZmlnLndpZHRoPSA4LCBmaWcuaGVpZ2h0PTh9DQpyYXQyIDwtIHJhdGlmeShsY18yMDEzKQ0KDQpsZXZlbHBsb3QocmF0MiwgYXR0PSdJRCcsIA0KICAgICAgICAgIGNvbC5yZWdpb25zPWRmJENvbG9yLA0KICAgICAgICAgIG1heHBpeGVscz1uY2VsbChyYXQyKSwgIyBUcnkgc2V0dGluZyBtYXhwaXhlbHMgdG8gdGhlIG51bWJlciBvZiBjZWxscyBpbiB0aGUgcmFzdGVyDQogICAgICAgICAgcGFyLnNldHRpbmdzID0gbGlzdCgNCiAgICAgICAgICAgIGF4aXMubGluZSA9IGxpc3QoY29sID0gInRyYW5zcGFyZW50IiksIA0KICAgICAgICAgICAgc3RyaXAuYmFja2dyb3VuZCA9IGxpc3QoY29sID0gJ3RyYW5zcGFyZW50JyksIA0KICAgICAgICAgICAgc3RyaXAuYm9yZGVyID0gbGlzdChjb2wgPSAndHJhbnNwYXJlbnQnKQ0KICAgICAgICAgICksIA0KICAgICAgICAgIHNjYWxlcyA9IGxpc3QoY29sID0gInRyYW5zcGFyZW50IiksDQogICAgICAgICAgY29sb3JrZXkgPSBGQUxTRSwNCiAgICAgICAgICBrZXkgPSBteUtleSwNCiAgICAgICAgICBtYWluID0gIldhdGF1Z2EgMjAxMyBMYW5kIENvdmVyIikgIyBUaXRsZSBhZGRlZCBoZXJlDQpgYGANCg0KIyMjIyAyMDE2IHsudW5udW1iZXJlZH0NCg0KYGBge3IgbGNfMjAxNiwgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSwgZmlnLndpZHRoPSA4LCBmaWcuaGVpZ2h0PTh9DQpyYXQzIDwtIHJhdGlmeShsY18yMDE2KQ0KDQpsZXZlbHBsb3QocmF0MywgYXR0PSdJRCcsIA0KICAgICAgICAgIGNvbC5yZWdpb25zPWRmJENvbG9yLA0KICAgICAgICAgIG1heHBpeGVscz1uY2VsbChyYXQzKSwgIyBUcnkgc2V0dGluZyBtYXhwaXhlbHMgdG8gdGhlIG51bWJlciBvZiBjZWxscyBpbiB0aGUgcmFzdGVyDQogICAgICAgICAgcGFyLnNldHRpbmdzID0gbGlzdCgNCiAgICAgICAgICAgIGF4aXMubGluZSA9IGxpc3QoY29sID0gInRyYW5zcGFyZW50IiksIA0KICAgICAgICAgICAgc3RyaXAuYmFja2dyb3VuZCA9IGxpc3QoY29sID0gJ3RyYW5zcGFyZW50JyksIA0KICAgICAgICAgICAgc3RyaXAuYm9yZGVyID0gbGlzdChjb2wgPSAndHJhbnNwYXJlbnQnKQ0KICAgICAgICAgICksIA0KICAgICAgICAgIHNjYWxlcyA9IGxpc3QoY29sID0gInRyYW5zcGFyZW50IiksDQogICAgICAgICAgY29sb3JrZXkgPSBGQUxTRSwNCiAgICAgICAgICBrZXkgPSBteUtleSwNCiAgICAgICAgICBtYWluID0gIldhdGF1Z2EgMjAxNiBMYW5kIENvdmVyIikgIyBUaXRsZSBhZGRlZCBoZXJlDQpgYGANCg0KIyMjIyAyMDE5IHsudW5udW1iZXJlZH0NCg0KYGBge3IgbGNfMjAxOSwgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSwgZmlnLndpZHRoPSA4LCBmaWcuaGVpZ2h0PTh9DQpyYXQ0IDwtIHJhdGlmeShsY18yMDE5KQ0KDQpsZXZlbHBsb3QocmF0NCwgYXR0PSdJRCcsIA0KICAgICAgICAgIGNvbC5yZWdpb25zPWRmJENvbG9yLA0KICAgICAgICAgIG1heHBpeGVscz1uY2VsbChyYXQ0KSwgIyBUcnkgc2V0dGluZyBtYXhwaXhlbHMgdG8gdGhlIG51bWJlciBvZiBjZWxscyBpbiB0aGUgcmFzdGVyDQogICAgICAgICAgcGFyLnNldHRpbmdzID0gbGlzdCgNCiAgICAgICAgICAgIGF4aXMubGluZSA9IGxpc3QoY29sID0gInRyYW5zcGFyZW50IiksIA0KICAgICAgICAgICAgc3RyaXAuYmFja2dyb3VuZCA9IGxpc3QoY29sID0gJ3RyYW5zcGFyZW50JyksIA0KICAgICAgICAgICAgc3RyaXAuYm9yZGVyID0gbGlzdChjb2wgPSAndHJhbnNwYXJlbnQnKQ0KICAgICAgICAgICksIA0KICAgICAgICAgIHNjYWxlcyA9IGxpc3QoY29sID0gInRyYW5zcGFyZW50IiksDQogICAgICAgICAgY29sb3JrZXkgPSBGQUxTRSwNCiAgICAgICAgICBrZXkgPSBteUtleSwNCiAgICAgICAgICBtYWluID0gIldhdGF1Z2EgMjAxOSBMYW5kIENvdmVyIikgIyBUaXRsZSBhZGRlZCBoZXJlDQpgYGANCg0KIyMjIyAyMDIxIHsudW5udW1iZXJlZH0NCg0KYGBge3IgbGNfMjAyMV8yLCBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBmaWcud2lkdGg9IDgsIGZpZy5oZWlnaHQ9OH0NCnZhbHMgPC11bmlxdWUoc1tbNV1dKSAgIyBHZXQgdW5pcXVlIHZhbHVlcyBmcm9tIGxjXzIwMjENCmRmIDwtIGxlZ2VuZFtsZWdlbmQkSUQgJWluJSB2YWxzLF0gICMgRmlsdGVyIGxlZ2VuZCBpbmZvcm1hdGlvbiBiYXNlZCBvbiBsY18yMDIxIHZhbHVlcw0KcmF0NSA8LSByYXRpZnkobGNfMjAyMSkNCg0KbGV2ZWxwbG90KHJhdDUsIGF0dD0nSUQnLCANCiAgICAgICAgICBjb2wucmVnaW9ucz1kZiRDb2xvciwNCiAgICAgICAgICBtYXhwaXhlbHM9bmNlbGwocmF0NSksICMgVHJ5IHNldHRpbmcgbWF4cGl4ZWxzIHRvIHRoZSBudW1iZXIgb2YgY2VsbHMgaW4gdGhlIHJhc3Rlcg0KICAgICAgICAgIHBhci5zZXR0aW5ncyA9IGxpc3QoDQogICAgICAgICAgICBheGlzLmxpbmUgPSBsaXN0KGNvbCA9ICJ0cmFuc3BhcmVudCIpLCANCiAgICAgICAgICAgIHN0cmlwLmJhY2tncm91bmQgPSBsaXN0KGNvbCA9ICd0cmFuc3BhcmVudCcpLCANCiAgICAgICAgICAgIHN0cmlwLmJvcmRlciA9IGxpc3QoY29sID0gJ3RyYW5zcGFyZW50JykNCiAgICAgICAgICApLCANCiAgICAgICAgICBzY2FsZXMgPSBsaXN0KGNvbCA9ICJ0cmFuc3BhcmVudCIpLA0KICAgICAgICAgIGNvbG9ya2V5ID0gRkFMU0UsDQogICAgICAgICAga2V5ID0gbXlLZXksDQogICAgICAgICAgbWFpbiA9ICJXYXRhdWdhIDIwMjEgTGFuZCBDb3ZlciIpICMgVGl0bGUgYWRkZWQgaGVyZQ0KDQpgYGANCg0KYGBge3IgbGNfdG9fdGFibGUsIGNhY2hlPVRSVUUsIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQpvcHRpb25zKGthYmxlRXh0cmEuYXV0b19mb3JtYXQgPSBGQUxTRSkNCnllYXJzPC1jKDIwMTEsIDIwMTMsIDIwMTYsIDIwMTksIDIwMjEpDQoNCmQ8LWRmDQpmb3IgKGkgaW4gMTpsZW5ndGgoeWVhcnMpKSB7DQogIGQ8LW1lcmdlKGQsIGZyZXEoc1tbaV1dKSwgYnkueD0iSUQiICxieS55PSJ2YWx1ZSIsIGFsbC55PUYsIGFsbC54PVQpDQogIG5hbWVzKGQpW25jb2woZCldPC1wYXN0ZTAoInBpeF8iLCB5ZWFyc1tbaV1dKQ0KICB9DQoNCg0KZCRzcXVhcmUubWlsZS5jaGFuZ2U8LShkJHBpeF8yMDIxIC0gZCRwaXhfMjAxMSkgKiAzMCAqIDMwICogMC4wMDAwMDAzODYxMA0KZCRwZXJjZW50Y2hhbmdlPC0oZCRwaXhfMjAyMSAtIGQkcGl4XzIwMTEpL2QkcGl4XzIwMTENCmQkcHJvcDIwMjE8LWQkcGl4XzIwMjEvc3VtKGQkcGl4XzIwMjEpDQoNCmQkcGVyY2VudGNoYW5nZS4yMDExLjIwMjE8LXBhc3RlKHJvdW5kKDEwMCpkJHBlcmNlbnRjaGFuZ2UsIDIpLCAiJSIsIHNlcD0iIikNCmQkcGVyY2VudC5hcmVhLjIwMjE8LXBhc3RlKHJvdW5kKDEwMCpkJHByb3AyMDIxLCAyKSwgIiUiLCBzZXA9IiIpDQoNCmthYmxlKGRbLGMoMiwxMCwxMywxNCldKSAgJT4lDQogIGthYmxlX3N0eWxpbmcoYm9vdHN0cmFwX29wdGlvbnMgPSBjKCJzdHJpcGVkIiwgImhvdmVyIiksIGZ1bGxfd2lkdGggPSBGKQ0KYGBgDQoNCiMjIyBTbG9wZSAmIFNvaWwgey50YWJzZXR9DQoNCkluIFdhdGF1Z2EgQ291bnR5LCB3aGVyZSB0aGUgbGFuZHNjYXBlIGlzIHByZWRvbWluYW50bHkgbW91bnRhaW5vdXMsIGRldmVsb3BtZW50IGlzIGhpZ2hseSBkZXBlbmRlbnQgb24gdGhlIHRlcnJhaW4ncyB0b3BvZ3JhcGh5LiBTbG9wZSBpcyBhIGNyaXRpY2FsIGZhY3RvciBpbiBhc3Nlc3NpbmcgdGhlIGZlYXNpYmlsaXR5IG9mIGNvbnN0cnVjdGlvbiBwcm9qZWN0cywgd2l0aCBzdGVlcGVyIHNsb3BlcyBwcmVzZW50aW5nIHNpZ25pZmljYW50IGNoYWxsZW5nZXMuIFV0aWxpemluZyBzbG9wZSBkYXRhLCB3ZSd2ZSBpZGVudGlmaWVkIGFyZWFzIHdoZXJlIHRoZSBncmFkaWVudCBleGNlZWRzIDI1wrDigJR3ZWxsIGJlbG93IHRoZSBtYXhpbXVtIGRldmVsb3BtZW50LWZyaWVuZGx5IHNsb3BlIG9mIDY1JSAoYXBwcm94aW1hdGVseSAzMy4wMsKwKeKAlGFzIHVuc3VpdGFibGUgZm9yIGRldmVsb3BtZW50LiBUaGUgcmVjbGFzc2lmaWVkIHNsb3BlIGRlZ3JlZXMgd2l0aGluIHRoZSBjb3VudHkgYXJlIHZpc3VhbGx5IHJlcHJlc2VudGVkIGluIGEgcGxvdCB3aGVyZSBncmVlbiBhcmVhcyBpbmRpY2F0ZSBzbG9wZXMgc3VpdGFibGUgZm9yIGRldmVsb3BtZW50LCBhbmQgd2hpdGUgYXJlYXMgcmVwcmVzZW50IHVuc3VpdGFibGUgem9uZXMuDQoNCkFkZGl0aW9uYWxseSwgdGhlIGNvdW50eSdzIGRpdmVyc2Ugc29pbCBjb21wb3NpdGlvbiBpbmNsdWRlcyBvdmVyIDgwIHR5cGVzIG9mIHNvaWwsIGNydWNpYWwgZm9yIGRldGVybWluaW5nIHRoZSBhcHByb3ByaWF0ZSBkZXNpZ24gYW5kIGluc3RhbGxhdGlvbiBvZiBzZXB0aWMgc3lzdGVtcy4gU29pbCB0eXBlcyBhZmZlY3QgdGhlIHdhdGVyIGFic29ycHRpb24gcmF0ZSBhbmQgdGhlIG5lY2Vzc2FyeSBkZXB0aCBmb3Igc2VwdGljIHN5c3RlbXMuIEFuIGFuYWx5c2lzIG9mIHRoZSBVU0RBJ3Mgc29pbCBkYXRhYmFzZSByZXZlYWxzIHRoYXQgdGhlc2Ugc29pbHMgYXJlIGNhdGVnb3JpemVkIGJ5IHRoZWlyIE1hcCBVbml0IFN5bWJvbCAoTVVTWU0pIGludG8gdGhyZWUgbWFpbiBncm91cHMgYmFzZWQgb24gdGhlaXIgZHJhaW5hZ2UgY2FwYWJpbGl0aWVzIGFuZCBwZXJtZWFiaWxpdHk6IEEtTW9kZXJhdGVseSBSYXBpZCBJbmZpbHRyYXRpb24gUmF0ZSwgQi1Nb2RlcmF0ZSBJbmZpbHRyYXRpb24gUmF0ZSwgYW5kIEMtTG93IEluZmlsdHJhdGlvbiBSYXRlLiBUeXBlIEMgc29pbCwgY2hhcmFjdGVyaXplZCBieSBsb3cgaW5maWx0cmF0aW9uIHJhdGVzIGFuZCBnb29kIGRyYWluYWdlLCBpcyBpZGVudGlmaWVkIGFzIG9wdGltYWwgZm9yIHNlcHRpYyBzeXN0ZW0gaW5zdGFsbGF0aW9uLCBjb250cmFzdGluZyBzaGFycGx5IHdpdGggdGhlIGxlc3MgZGVzaXJhYmxlLCBwb29ybHkgZHJhaW5lZCBzb2lscy4NCg0KIyMjIyBTbG9wZSB7LnVubnVtYmVyZWR9DQoNCmBgYHtyIHJlYWRfc2xvcGUsIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIGZpZy5hbGlnbj0nbGVmdCd9DQpzbG9wZSA8LSByYXN0ZXIoIkM6L1VzZXJzL2ZhdGJvL09uZURyaXZlL0RvY3VtZW50cy9HaXRIdWIvTXVzYV84MDFfV2F0YXVnYS9EYXRhL3Nsb3BlXzIvc2xvcGUudGlmIikNCg0KIyBTZXQgdXAgcGFyIHNldHRpbmdzIGZvciBubyBiYWNrZ3JvdW5kIG9yIG1hcmdpbnMNCg0KcGxvdChzbG9wZSwgYXhlcyA9IEZBTFNFLCBib3ggPSBGQUxTRSwgbWFpbiA9ICJTbG9wZSBBbmdsZSIpDQoNCiMgU2F2ZSB0aGUgcGxvdCB0byBhIFBORyBmaWxlIHdpdGggaGlnaCByZXNvbHV0aW9uDQpzdXBwcmVzc01lc3NhZ2VzKHtkZXYuY29weShwbmcsIGZpbGVuYW1lID0gInNsb3BlX3Bsb3QucG5nIikNCmRldi5vZmYoKX0pDQpgYGANCg0KIVtdKEM6L1VzZXJzL2ZhdGJvL09uZURyaXZlL0RvY3VtZW50cy9HaXRIdWIvTXVzYV84MDFfV2F0YXVnYS9EYXRhL3Nsb3BlXzIvc2xvcGUuanBnKQ0KDQojIyMjIFNvaWwgey51bm51bWJlcmVkfQ0KDQpgYGB7ciByZWFkX3NvaWwsIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQpzb2lsIDwtIHN0X3JlYWQoJ2h0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9KYXJyZWRFUmFuZGFsbC9NdXNhXzgwMV9XYXRhdWdhL21haW4vRGF0YS9uYXR1cmFsL3NvaWxfdHlwZS5nZW9qc29uJykNCnNvaWwgPC0gc3RfdHJhbnNmb3JtKHNvaWwsIHN0X2NycyhwYXJjZWwpKQ0KYGBgDQoNCmBgYHtyfQ0KY29sb3JfcGFsZXR0ZTIgPC0gYygiI2UyYTMzNCIsIiNmMWVjOTlmZiIsICIjOWFkN2QyZmYiLCAiIzNlNzA2N2ZmIiwgIiNjZmQ5ZTBmZiIpDQpgYGANCg0KYGBge3IgcGxvdF9zb2lsLCBlY2hvPUZBTFNFLCBmaWcuc2hvdz0naG9sZCcsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQojIFNob3cgYSBtYXAgYmFzZWQgb24gY29sdW1uIE1VU1lNLCBzaG93IHVuaXF1ZSB2YWx1ZQ0KcGxvdF9zb2lsIDwtIGdncGxvdCgpICsNCiAgZ2VvbV9zZihkYXRhID0gc29pbCwgYWVzKGZpbGwgPSBDYXRlZ29yeSksIGNvbG9yID0gInRyYW5zcGFyZW50IikgKw0KICBzY2FsZV9maWxsX21hbnVhbChuYW1lID0gIlNvaWwgVHlwZSIsIHZhbHVlcyA9IGNvbG9yX3BhbGV0dGUyLCBuYS52YWx1ZSA9ICJ3aGl0ZSIpICsgIyBVc2UgY3VzdG9tIGNvbG9yIHBhbGV0dGUNCiAgbGFicyh0aXRsZT0iU29pbCBJbmZpbHRyYXRpb24gTGV2ZWwiKSArDQogIHRoZW1lX3ZvaWQoKQ0KDQpwbG90X3NvaWwNCg0KIyBTYXZlIHRoZSBwbG90IGFzIGEgaGlnaC1yZXNvbHV0aW9uIGltYWdlDQojZ2dzYXZlKCJwbG90X3NvaWwucG5nIiwgcGxvdF9zb2lsLCB3aWR0aCA9IDEwLCBoZWlnaHQgPSA4LCBkcGkgPSAzMDApDQpgYGANCg0KIyMjIERpc3RhbmNlIHRvIENhbGN1bGF0aW9ucyB7LnRhYnNldH0NCg0KSW4gV2F0YXVnYSBDb3VudHksIGxhbmRzbGlkZSByaXNrIHByZWRvbWluYW50bHkgZGljdGF0ZXMgcGFyY2VsIHNhZmV0eSwgd2l0aCBwcm94aW1pdHkgdG8gbGFuZHNsaWRlLXByb25lIGFyZWFzIGJlaW5nIGEgY3JpdGljYWwgZmFjdG9yLiBUaGUgbm9ydGhlYXN0ZXJuIHJlZ2lvbiwgY2hhcmFjdGVyaXplZCBieSBpdHMgZ2VudGxlciBzbG9wZXMsIGlzIGlkZW50aWZpZWQgYXMgdGhlIHNhZmVzdCBhcmVhLCBhcyBkZXBpY3RlZCBpbiB0aGUgcHJvdmlkZWQgZmlndXJlIHdoZXJlIHdoaXRlIGxpbmVzLCBvZnRlbiBpbmRpY2F0aXZlIG9mIHN0cmVhbXMgb3Igcm9hZHMsIGRlbWFyY2F0ZSBwYXJjZWwgYm91bmRhcmllcy4NCg0KV2F0ZXIgbWFuYWdlbWVudCBpcyBhbHNvIHZpdGFsIGluIHRoZSBjb3VudHkncyBwbGFubmluZyBzdHJhdGVneSwgZXNwZWNpYWxseSBjb25jZXJuaW5nIHRoZSBwbGFjZW1lbnQgb2Ygc2VwdGljIHN5c3RlbXMgcmVsYXRpdmUgdG8gd2F0ZXJzaGVkcy4gVGhlIGNlbnRyYWwgcmVnaW9uIG9mIFdhdGF1Z2EgQ291bnR5IGxpZXMgY2xvc2UgdG8gZXNzZW50aWFsIHdhdGVyIHN1cHBseSB6b25lcywgbmVjZXNzaXRhdGluZyBzdHJpbmdlbnQgbWVhc3VyZXMgdG8gcHJldmVudCBwb2xsdXRpb24gYW5kIHNhZmVndWFyZCB0aGUgd2F0ZXIgc3VwcGx5IGR1cmluZyBzZXB0aWMgc3lzdGVtIGluc3RhbGxhdGlvbi4gVGhpcyBjYXJlZnVsIG1hbmFnZW1lbnQgZW5zdXJlcyB0aGF0IGVudmlyb25tZW50YWwgaW1wYWN0cyBhcmUgbWluaW1pemVkLg0KDQpGdXJ0aGVybW9yZSwgdGhlIGFjY2Vzc2liaWxpdHkgb2YgcGFyY2VscyB0byB0cmFuc3BvcnRhdGlvbiBpbmZyYXN0cnVjdHVyZSBpcyBjcnVjaWFsIGZvciB0aGVpciBkZXZlbG9wbWVudCBwb3RlbnRpYWwuIFRoZSBhbmFseXNpcyBzaG93cyB0aGF0IHdoaWxlIHNvbWUgcGFyY2VscyBhcmUgd2VsbC1jb25uZWN0ZWQsIGFyZWFzIGluIHRoZSBzb3V0aHdlc3QgYW5kIG5vcnRoZWFzdCBvZiBXYXRhdWdhIGxhY2sgc3VmZmljaWVudCByb2FkIGFjY2VzcywgcG90ZW50aWFsbHkgbGltaXRpbmcgdGhlaXIgZGV2ZWxvcG1lbnQuIERlc3BpdGUgV2F0YXVnYSdzIGV4dGVuc2l2ZSBuZXR3b3JrIG9mIHdhdGVyIGJvZGllcywgd2hpY2ggaW5mbHVlbmNlIHNlcHRpYyBzeXN0ZW0gZGVzaWduIGR1ZSB0byB0aGVpciBpbXBhY3Qgb24gdGhlIHdhdGVyIHRhYmxlLCBvdXIgZXZhbHVhdGlvbnMgZm9jdXMgb24gdGhlIGRpc3RhbmNlIGZyb20gdGhlIHBhcmNlbCdzIGNlbnRlciBvZiBtYXNzIHRvIHRoZSBuZWFyZXN0IHJpdmVyLCBmaW5kaW5nIG1pbmltYWwgdmFyaWFuY2UgaW4gcHJveGltaXR5IGFjcm9zcyB0aGUgY291bnR5LiBUaGlzIGNvbXByZWhlbnNpdmUgYXBwcm9hY2ggdG8gYW5hbHl6aW5nIGdlb2dyYXBoaWNhbCBhbmQgZW52aXJvbm1lbnRhbCBmYWN0b3JzIGVuc3VyZXMgaW5mb3JtZWQgZGVjaXNpb24tbWFraW5nIGluIGxhbmQgZGV2ZWxvcG1lbnQgYW5kIHJlc291cmNlIG1hbmFnZW1lbnQuDQoNCk5vdGU6IFRoZSB3aGl0ZSBsaW5lcyBpbiB0aGUgcGxvdHMgcmVwcmVzZW50IGdhcHMgYmV0d2VlbiB0aGUgcGFyY2Vscy4gVGhleSBvZnRlbiBjb3JyZWxhdGUgd2l0aCBzdHJlYW1zIG9yIHJvYWRzLg0KDQojIyMjIERpc3RhbmNlIHRvIExhbmRzbGlkZSB7LnVubnVtYmVyZWR9DQoNCmBgYHtyIGxvYWRfbmF0dXJhbF9kYXRhLCBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KbGFuZHNsaWRlID0gc3RfcmVhZCgiaHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tL0phcnJlZEVSYW5kYWxsL011c2FfODAxX1dhdGF1Z2EvbWFpbi9EYXRhL25hdHVyYWwvbGFuZHNsaWRlLmdlb2pzb24iKQ0KDQp3YXRlcnN1cHBseSA9IHN0X3JlYWQoJ2h0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9KYXJyZWRFUmFuZGFsbC9NdXNhXzgwMV9XYXRhdWdhL21haW4vRGF0YS9uYXR1cmFsL3dhdGVyX3N1cHBseS5nZW9qc29uJykNCg0KbGluZSA9IHN0X3JlYWQoJ2h0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9KYXJyZWRFUmFuZGFsbC9NdXNhXzgwMV9XYXRhdWdhL21haW4vRGF0YS9uYXR1cmFsL2xpbmUuZ2VvanNvbicpDQpgYGANCg0KYGBge3IgcGFyY2VsX2NlbnRyb2lkLCBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KIyBDYWxjdWxhdGUgdGhlIGNlbnRyb2lkIG9mIGVhY2ggcGFyY2VsDQpwYXJjZWxfY2VudHJvaWRzIDwtIHN0X2NlbnRyb2lkKHBhcmNlbCkNCmBgYA0KDQpgYGB7ciBwYXJjZWxfZGlzdGFuY2UsIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQpkaXN0YW5jZSA9IHBhcmNlbA0KDQojIEFkZCBhIGNvbHVtbiBuYW1lZCAnY2VudHJvaWRfZ2VvbWV0cnknIHRvIHRoZSBwYXJjZWwgZGF0YXNldA0KZGlzdGFuY2UkY2VudHJvaWRfZ2VvbWV0cnkgPC0gcGFyY2VsX2NlbnRyb2lkcw0KYGBgDQoNCmBgYHtyIGxhbmRzbGlkZV9nZW9tZXRyeSwgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCmxhbmRzbGlkZV9nZW9tZXRyeSA8LSBzdF9nZW9tZXRyeShsYW5kc2xpZGUpDQoNCiMgQ29udmVydCB0aGUgZ2VvbWV0cnkgdG8gYSBkYXRhIGZyYW1lDQpsYW5kc2xpZGVfZGYgPC0gYXMuZGF0YS5mcmFtZShsYW5kc2xpZGVfZ2VvbWV0cnkpDQpgYGANCg0KYGBge3IgZGlzdGFuY2VfdGVzdCwgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCnN0X2MgPC0gc3RfY29vcmRpbmF0ZXMNCnN0X2NvaWQgPC0gc3RfY2VudHJvaWQNCg0KdGVzdDE8LXN0X2Moc3RfY29pZChwYXJjZWwpKQ0KdGVzdDI8LSBzdF9jKHN0X2NvaWQobGFuZHNsaWRlKSkNCnRlc3QzIDwtIHN0X2Moc3RfY29pZCh3YXRlcnN1cHBseSkpDQoNCmZpbmFsIDwtIHBhcmNlbCAlPiUNCiAgICBtdXRhdGUoDQogICAgICBsYW5kc2xpZGUubm4gPQ0KICAgICAgICBubl9mdW5jdGlvbih0ZXN0MSwgdGVzdDIsaz0yKSwNCiAgICAgIHdhdGVyc2hlZC5ubiA9IA0KICAgICAgICBubl9mdW5jdGlvbih0ZXN0MSwgdGVzdDMsIGsgPSAxKSkNCmBgYA0KDQpgYGB7ciBzYXZlX2xhbmRzbGlkZSwgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCnBsb3RfbGFuZHNsaWRlIDwtZ2dwbG90KCkgKw0KICAgICAgZ2VvbV9zZihkYXRhID0gZmluYWwsIGFlcyhmaWxsPWxhbmRzbGlkZS5ubiksIGNvbG91cj1OQSkgKw0KICAjZ2VvbV9zZihkYXRhID0gcGFyY2VsLCBmaWxsID0gInRyYW5zcGFyZW50IiwgY29sb3VyID0gInJlZCIsIHNpemUgPSAwLjAwNSkgKyAgIyBBZGp1c3QgdGhlIHNpemUgaGVyZQ0KICAgICAgc2NhbGVfZmlsbF92aXJpZGlzKG5hbWU9IkRpc3RhbmNlIikgKw0KICAgICAgbGFicyh0aXRsZT0iRGlzdGFuY2UgdG8gdGhlIFR3byBOZWFyZXN0IExhbmRzbGlkZSBQb2ludHMiKSArDQogICAgICB0aGVtZV92b2lkKCkgDQoNCnBsb3RfbGFuZHNsaWRlDQoNCiNnZ3NhdmUoImxhbmRzbGlkZS5qcGciLCBwbG90X2xhbmRzbGlkZSwgZHBpID0gMzAwKQ0KYGBgDQoNCiMjIyMgRGlzdGFuY2UgdG8gV2F0ZXJzaGVkIHsudW5udW1iZXJlZH0NCg0KYGBge3IgcGxvdF9kaXN0YW5jZV93YXRlcnNoZWQsIGVjaG89RkFMU0UsIGZpZy5zaG93PSdob2xkJywgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCnBsb3Rfd2F0ZXJzaGVkIDwtZ2dwbG90KCkgKw0KICAgICAgZ2VvbV9zZihkYXRhID0gZmluYWwsIGFlcyhmaWxsPXdhdGVyc2hlZC5ubiksIGNvbG91cj1OQSkgKw0KICAjZ2VvbV9zZihkYXRhID0gcGFyY2VsLCBmaWxsID0gInRyYW5zcGFyZW50IiwgY29sb3VyID0gInJlZCIsIHNpemUgPSAwLjAwNSkgKyAgIyBBZGp1c3QgdGhlIHNpemUgaGVyZQ0KICAgICAgc2NhbGVfZmlsbF92aXJpZGlzKG5hbWU9IkRpc3RhbmNlIikgKw0KICAgICAgbGFicyh0aXRsZT0iRGlzdGFuY2UgdG8gdGhlIE5lYXJlc3QgV2F0ZXJzaGVkIikgKw0KICAgICAgdGhlbWVfdm9pZCgpIA0KDQpwbG90X3dhdGVyc2hlZA0KDQojZ2dzYXZlKCJ3YXRlcnN1cHBseS5qcGciLCBwbG90X3dhdGVyc2hlZCwgZHBpID0gMzAwKQ0KYGBgDQoNCiMjIyMgRGlzdGFuY2UgdG8gdGhlIG5lYXJlc3QgUm9hZCB7LnVubnVtYmVyZWR9DQoNClJvYWQgaXMgb25lIG9mIHRoZSBtb3N0IGltcG9ydGFudCBpbmZyYXN0cnVjdHVyZXMgZm9yIGhvdXNpbmcgZGV2ZWxvcG1lbnQuV2UgZmlsdGVyZWQgb3V0IHRoZSByb2FkcyB3aXRoIHRyYWZmaWMgZXF1YWwgdG8gb3IgaGlnaGVyIHRoYW4gMjAwMC4NCg0KYGBge3J9DQpwYXJjZWwgPSBzdF9yZWFkKCdodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vSmFycmVkRVJhbmRhbGwvTXVzYV84MDFfV2F0YXVnYS9tYWluL0RhdGEvbmF0dXJhbC9wYXJjZWwuZ2VvanNvbicpDQoNCmRpc3RhbmNlIDwtc3RfcmVhZCgiaHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tL0phcnJlZEVSYW5kYWxsL011c2FfODAxX1dhdGF1Z2EvbWFpbi9EYXRhL3BhcmNlbF9kaXN0YW5jZS5jc3YiKQ0KYGBgDQoNCmBgYHtyfQ0KbWVyZ2VkX2RhdGEgPC0gbWVyZ2UocGFyY2VsLCBkaXN0YW5jZSwgYnkgPSAiR2xvYmFsSUQiLCBhbGwueCA9IFRSVUUpDQpgYGANCg0KYGBge3J9DQptZXJnZWRfZGF0YSRuZWFyZXN0X2Rpc3RhbmNlcyA8LSBhcy5udW1lcmljKG1lcmdlZF9kYXRhJG5lYXJlc3RfZGlzdGFuY2VzKQ0KDQpnZ3Bsb3QoKSArDQogICAgICBnZW9tX3NmKGRhdGEgPSBtZXJnZWRfZGF0YSwgYWVzKGZpbGw9bmVhcmVzdF9kaXN0YW5jZXMpLCBjb2xvdXI9TkEpICsNCiAgI2dlb21fc2YoZGF0YSA9IHBhcmNlbCwgZmlsbCA9ICJ0cmFuc3BhcmVudCIsIGNvbG91ciA9ICJyZWQiLCBzaXplID0gMC4wMDUpICsgICMgQWRqdXN0IHRoZSBzaXplIGhlcmUNCiAgICAgIHNjYWxlX2ZpbGxfdmlyaWRpcyhuYW1lPSJSb2FkIERpc3RhbmNlIikgKw0KICAgICAgbGFicyh0aXRsZT0iRGlzdGFuY2UgdG8gdGhlIE5lYXJlc3QgUm9hZCIpICsNCiAgICAgIHRoZW1lX3ZvaWQoKQ0KDQpgYGANCg0KIyMjIyBEaXN0YW5jZSB0byBOZWFyZXN0IFdhdGVyIEJvZHkgey51bm51bWJlcmVkfQ0KDQpgYGB7ciBwbG90X2Rpc3RhbmNlX3dhdGVyYm9keSwgZWNobz1GQUxTRSwgZmlnLnNob3c9J2hvbGQnLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KcGxvdF93YXRlcmJvZHkgPC1nZ3Bsb3QoKSArDQogICAgICBnZW9tX3NmKGRhdGEgPSBjb21iaW5lZF9kZiwgYWVzKGZpbGw9RGlzdF9GbG93bGluZSksIGNvbG91cj1OQSkgKw0KICAjZ2VvbV9zZihkYXRhID0gcGFyY2VsLCBmaWxsID0gInRyYW5zcGFyZW50IiwgY29sb3VyID0gInJlZCIsIHNpemUgPSAwLjAwNSkgKyAgIyBBZGp1c3QgdGhlIHNpemUgaGVyZQ0KICAgICAgc2NhbGVfZmlsbF92aXJpZGlzKG5hbWU9IldhdGVyIERpc3RhbmNlIikgKw0KICAgICAgbGFicyh0aXRsZT0iRGlzdGFuY2UgdG8gdGhlIE5lYXJlc3QgV2F0ZXJib2R5IikgKw0KICAgICAgdGhlbWVfdm9pZCgpDQoNCnBsb3Rfd2F0ZXJib2R5DQoNCiNnZ3NhdmUoIndhdGVyYm9keS5qcGciLCBwbG90X3dhdGVyYm9keSwgZHBpID0gMzAwKQ0KYGBgDQoNCiMjIyBOYXR1cmFsIEFyZWFzLCBTcGF0aWFsIExhZywgRWNvbm9taWMgRmVhdHVyZXMgey50YWJzZXR9DQoNCldhdGF1Z2EgQ291bnR5IGhvc3RzIGEgcmFuZ2Ugb2Ygc2l0ZXMgcmVjb2duaXplZCBhcyBuYXR1cmFsIGhlcml0YWdlIGFyZWFzIG9yIHNpZ25pZmljYW50IG5hdHVyYWwgYXJlYXMgYXQgdmFyaW91cyBsZXZlbHMsIGZyb20gbmF0aW9uYWwgdG8gY291bnR5LiBUaGVzZSBwcm90ZWN0ZWQgYXJlYXMsIHdoZXRoZXIgdW5kZXIgZmVkZXJhbCwgc3RhdGUsIG9yIHByaXZhdGUgb3duZXJzaGlwLCBhcmUgdml0YWwgZm9yIG1haW50YWluaW5nIGJpb2RpdmVyc2l0eSwgcHJlc2VydmluZyBjdWx0dXJhbCBoZXJpdGFnZSBzaXRlcywgYW5kIGNvbnNlcnZpbmcgbmF0dXJhbCByZXNvdXJjZXMuIFByZWNpc2VseSBpZGVudGlmeWluZyB0aGUgbG9jYXRpb25zIG9mIHRoZXNlIHByb3RlY3RlZCBzaXRlcyBpcyBjcnVjaWFsIGZvciBwaW5wb2ludGluZyBkZXZlbG9wbWVudC1zdWl0YWJsZSBwYXJjZWxzIHdoaWxlIHVwaG9sZGluZyBjb25zZXJ2YXRpb24gZWZmb3J0cy4NCg0KcHJvcGVydHkgdmFsdWUgcGxheXMgYSBwaXZvdGFsIHJvbGUgaW4gYXNzZXNzaW5nIHRoZSBkZXZlbG9wbWVudCBwb3RlbnRpYWwgb2YgYSBwYXJjZWwuIEl0IHJlZmxlY3RzIG1hcmtldCBkZW1hbmQgYW5kIHBvdGVudGlhbCByZXR1cm4gb24gaW52ZXN0bWVudCwgYmVpbmcgcHJpbWFyaWx5IGRldGVybWluZWQgYnkgdGhlIHByb3BlcnR5J3Mgc2FsZSBwcmljZS4gUGFyY2VscyB3aXRoIGhpZ2hlciBwcm9wZXJ0eSB2YWx1ZXMgaW5kaWNhdGUgZ3JlYXRlciBkZXZlbG9wbWVudCBwb3RlbnRpYWwsIGd1aWRpbmcgZGV2ZWxvcGVycyBhbmQgcGxhbm5lcnMgaW4gZGVjaXNpb24tbWFraW5nIHByb2Nlc3NlcyBmb2N1c2VkIG9uIG1heGltaXppbmcgZWNvbm9taWMgYmVuZWZpdHMgd2hpbGUgY29uc2lkZXJpbmcgZW52aXJvbm1lbnRhbCBhbmQgY3VsdHVyYWwgcHJlc2VydmF0aW9uLg0KDQpBZGRpdGlvbmFsbHksIGFuIGFuYWx5c2lzIG9mIHRoZSBzcGF0aWFsIGxhZyBvZiBwcmV2aW91cyBidWlsZGluZyBwZXJtaXRzIGlzc3VlZCBiZXR3ZWVuIDIwMTcgYW5kIDIwMjIgcHJvdmlkZXMgaW5zaWdodHMgaW50byBkZXZlbG9wbWVudCB0cmVuZHMgYW5kIHBhdHRlcm5zIGluIFdhdGF1Z2EgQ291bnR5LiBUaGlzIGFuYWx5c2lzIGhlbHBzIHRvIGlkZW50aWZ5IGFyZWFzIHdpdGggc2lnbmlmaWNhbnQgY29uY2VudHJhdGlvbnMgb2YgcmVjZW50IGRldmVsb3BtZW50IGFjdGl2aXRpZXMgYXMgd2VsbCBhcyByZWdpb25zIHRoYXQgaGF2ZSBzZWVuIGZld2VyIGludmVzdG1lbnRzLiBVbmRlcnN0YW5kaW5nIHRoZXNlIHBhdHRlcm5zIGlzIGVzc2VudGlhbCBmb3IgZm9yZWNhc3RpbmcgZnV0dXJlIGRldmVsb3BtZW50IGhvdHNwb3RzIGFuZCBwb3RlbnRpYWwgYXJlYXMgb2YgZ3Jvd3RoLiBUaGlzIHNwYXRpYWwgZGF0YSBub3Qgb25seSByZWZsZWN0cyB0aGUgaGlzdG9yaWNhbCBkZW1hbmQgZm9yIGRldmVsb3BtZW50IGJ1dCBhbHNvIGFzc2lzdHMgcGxhbm5lcnMgYW5kIGRldmVsb3BlcnMgaW4gbWFraW5nIGluZm9ybWVkIGRlY2lzaW9ucyBhYm91dCB3aGVyZSB0byBkaXJlY3QgZGV2ZWxvcG1lbnQgZWZmb3J0cyBuZXh0LCBlbnN1cmluZyBiYWxhbmNlZCBncm93dGggYWNyb3NzIHRoZSBjb3VudHkuDQoNCiMjIyMgTmF0dXJhbCBBcmVhcyB7LnVubnVtYmVyZWR9DQoNCmBgYHtyIHBsb3RfbmF0dXJhbF9hcmVhX293bmVyLCBlY2hvPUZBTFNFLCBmaWcuc2hvdz0naG9sZCd9DQpnZ3Bsb3QoKSArDQogIGdlb21fc2YoZGF0YSA9IGJvdW5kYXJ5LCBmaWxsID0gTkEsIGNvbG9yID0gImJsYWNrIikgKyANCiAgZ2VvbV9zZihkYXRhID0gbWFuYWdlZF9hcmVhcywgYWVzKGZpbGwgPSBPV05FUl9UWVBFKSkgKyANCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gY29sb3JfcGFsZXR0ZSkgKyANCiAgbGFicyh0aXRsZSA9ICJXYXRhdWdhIE1hbmFnZWQgQXJlYXMgYnkgT3duZXIgVHlwZSIsDQogICAgICAgc3VidGl0bGUgPSAiWWVhcjogMjAyMiIsDQogICAgICAgY29sb3IgPSAiT3duZXIgVHlwZSIpICsNCiAgdGhlbWVfdm9pZCgpDQpgYGANCg0KIyMjIyBTcGF0aWFsIExhZyB7LnVubnVtYmVyZWR9DQoNCmBgYHtyfQ0KIyBpbXBvcnQgc3BhdGlhbCBsYWcgZGF0YXNldA0KcGFyY2VsX3NwYXRpYWxfbGFnIDwtIHJlYWQuY3N2KCJDOi9Vc2Vycy9mYXRiby9PbmVEcml2ZS9Eb2N1bWVudHMvR2l0SHViL011c2FfODAxX1dhdGF1Z2EvRGF0YS9QRVJNSVRfU1BBVElBTF9MQUcvcGFyY2VsX3NwYXRpYWxfbGFnLmNzdiIpDQoNCnBhcmNlbF9zcGF0X2xhZ19tZXJnZWQgPC0gbWVyZ2UocGFyY2VsLCBwYXJjZWxfc3BhdGlhbF9sYWcsIGJ5ID0gIkdsb2JhbElEIikNCnBhcmNlbF9zcGF0X2xhZ19tYXAgPC0gc3Vic2V0KHBhcmNlbF9zcGF0X2xhZ19tZXJnZWQsIHNlbGVjdCA9IGMoR2xvYmFsSUQsIHBlcm1pdF8xNy5ubl8zLCBwZXJtaXRfMTcubm5fNSkpDQoNCiMgbGV0J3MgbWFwIQ0KDQpwbG90X3NwYXRpYWxfbGFnXzMgPC0gZ2dwbG90KCkgKw0KICBnZW9tX3NmKGRhdGEgPSBwYXJjZWxfc3BhdF9sYWdfbWFwLCBhZXMoZmlsbCA9IHBlcm1pdF8xNy5ubl8zKSwgY29sb3IgPSBOQSwgc2l6ZSA9IDApICsNCiAgc2NhbGVfZmlsbF9ncmFkaWVudChoaWdoID0gIiNlMmEzMzQiLCBsb3cgPSAiIzc0YzFiOSIsIGJyZWFrcyA9IGMoNTAwMCwgMTAwMDAsIDE1MDAwLCAyMDAwMCwgMjUwMDApKSArDQogIGxhYnModGl0bGUgPSAiU3BhdGlhbCBMYWcgKDMpIiwNCiAgICAgICBzdWJ0aXRsZSA9ICJZZWFyOiAyMDE3IiwNCiAgICAgICBmaWxsID0gIlNwYXRpYWwgTGFnIikgKw0KICB0aGVtZV92b2lkKCkNCg0KcGxvdF9zcGF0aWFsX2xhZ181IDwtIGdncGxvdCgpICsNCiAgZ2VvbV9zZihkYXRhID0gcGFyY2VsX3NwYXRfbGFnX21hcCwgYWVzKGZpbGwgPSBwZXJtaXRfMTcubm5fNSksIGNvbG9yID0gTkEsIHNpemUgPSAwKSArDQogIHNjYWxlX2ZpbGxfZ3JhZGllbnQoaGlnaCA9ICIjZTJhMzM0IiwgbG93ID0gIiM3NGMxYjkiLA0KICAgICAgICAgICAgICAgICAgICAgIGJyZWFrcyA9IGMoNTAwMCwgMTAwMDAsIDE1MDAwLCAyMDAwMCwgMjUwMDApKSArDQogIGxhYnModGl0bGUgPSAiU3BhdGlhbCBMYWcgKDUpIiwNCiAgICAgICBzdWJ0aXRsZSA9ICJZZWFyOiAyMDE3IiwNCiAgICAgICBmaWxsID0gIlNwYXRpYWwgTGFnIikgKw0KICB0aGVtZV92b2lkKCkNCiAgDQpwbG90X3NwYXRpYWxfbGFnXzMgIA0KcGxvdF9zcGF0aWFsX2xhZ181DQpgYGANCg0KIyMjIyBFY29ub21pYyBGZWF0dXJlczogUHJvcGVydHkgVmFsdWUgey51bm51bWJlcmVkfQ0KDQpQcm9wZXJ0eSB2YWx1ZSBpcyBhIGNyaXRpY2FsIGZhY3RvciBpbiBkZXRlcm1pbmluZyB0aGUgZGV2ZWxvcG1lbnQgcG90ZW50aWFsIG9mIGEgcGFyY2VsLiBJdCBpcyBhIGRpcmVjdCByZWZsZWN0aW9uIG9mIHRoZSBtYXJrZXQgZGVtYW5kIGFuZCB0aGUgcG90ZW50aWFsIHJldHVybiBvbiBpbnZlc3RtZW50LiBUaGUgcHJvcGVydHkgdmFsdWUgaXMgY2FsY3VsYXRlZCBiYXNlZCBvbiB0aGUgc2FsZSBwcmljZSBvZiB0aGUgcHJvcGVydHkuIFRoZSBoaWdoZXIgdGhlIHByb3BlcnR5IHZhbHVlLCB0aGUgaGlnaGVyIHRoZSBkZXZlbG9wbWVudCBwb3RlbnRpYWwuDQoNCmBgYHtyIHJlYWRfcHJvcGVydHlfdmFsdWUsIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQpwcm9wZXJ0eV92YWx1ZSA8LSBzdF9yZWFkKCJodHRwczovL2RyaXZlLmdvb2dsZS5jb20vdWM/ZXhwb3J0PWRvd25sb2FkJmlkPTE2V0ljRGtOd1hUNWFQcjkybVNZOE5hZmZEMms2bTBlNyIpDQpwcm9wZXJ0eV92YWx1ZSA8LSBzdF90cmFuc2Zvcm0ocHJvcGVydHlfdmFsdWUsIHN0X2NycyhwYXJjZWwpKQ0KYGBgDQoNCmBgYHtyIHBsb3RfcHJvcGVydHlfdmFsdWUsIGVjaG89RkFMU0UsIGZpZy5zaG93PSdob2xkJywgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCnBhcmNlbF93X2luZmxhdGlvbiA8LSByZWFkLmNzdigiQzovVXNlcnMvZmF0Ym8vT25lRHJpdmUvRG9jdW1lbnRzL0dpdEh1Yi9NdXNhXzgwMV9XYXRhdWdhL0RhdGEvcGFyY2VsX3dfaW5mbGF0aW9uLmNzdiIpDQoNCnBhcmNlbF9pbmZsYXRpb25fbWVyZ2VkIDwtIG1lcmdlKHBhcmNlbCwgcGFyY2VsX3dfaW5mbGF0aW9uLCBieSA9ICJHbG9iYWxJRCIpDQpwYXJjZWxfaW5mbGF0aW9uX21hcCA8LSBzdWJzZXQocGFyY2VsX2luZmxhdGlvbl9tZXJnZWQsIHNlbGVjdCA9IGMoR2xvYmFsSUQsIGluZmxhdGlvbjE3LCBpbmZsYXRpb24yMikpDQoNCnBhcmNlbF9pbmZsYXRpb25fbWFwJGluZmxhdGlvbjE3IDwtIGFzLm51bWVyaWMocGFyY2VsX2luZmxhdGlvbl9tYXAkaW5mbGF0aW9uMTcpDQoNCmJyZWFrcyA8LSBjKDAsIDUwMDAsIDI1MDAwLCAxMDAwMDAsIDQwMDAwMCwgSW5mKQ0KbGFiZWxzIDwtIGMoIjAtNTAwMCIsICI1MDAxLTI1MDAwIiwgIjI1MDAxLTEwMDAwMCIsICIxMDAwMDEtNDAwMDAwIiwgImdyZWF0ZXIgdGhhbiA0MDAsMDAwIikNCnBhcmNlbF9pbmZsYXRpb25fbWFwJGJpbnMgPC0gY3V0KHBhcmNlbF9pbmZsYXRpb25fbWFwJGluZmxhdGlvbjE3LCBicmVha3MgPSBicmVha3MsIGxhYmVscyA9IGxhYmVscywgaW5jbHVkZS5sb3dlc3QgPSBUUlVFKQ0KDQpwYXJjZWxfaW5mbGF0aW9uX21hcCRiaW5zIDwtIGZhY3RvcihwYXJjZWxfaW5mbGF0aW9uX21hcCRiaW5zLCBsZXZlbHMgPSBsYWJlbHMpDQoNCmdncGxvdCgpICsNCiAgZ2VvbV9zZihkYXRhID0gcGFyY2VsX2luZmxhdGlvbl9tYXAsIGFlcyhmaWxsID0gYmlucyksIGNvbG9yID0gTkEpICsNCiAgc2NhbGVfZmlsbF9tYW51YWwoDQogICAgdmFsdWVzID0gYygiMC01MDAwIiA9ICIjZWVmN2Y2IiwgDQogICAgICAgICAgICAgICAiNTAwMS0yNTAwMCIgPSAiI2RjZWZlZCIsIA0KICAgICAgICAgICAgICAgIjI1MDAxLTEwMDAwMCIgPSAiI2I5ZGZkYiIsIA0KICAgICAgICAgICAgICAgIjEwMDAwMS00MDAwMDAiID0gIiM3NGMxYjkiLCANCiAgICAgICAgICAgICAgICJncmVhdGVyIHRoYW4gNDAwLDAwMCIgPSAiIzUwYWZhNSIpLA0KICAgIGxhYmVscyA9IGMoImxlc3MgdGhhbiAkNSwwMDAiLCAiJDUsMDAxLSQyNSwwMDAiLCAiJDI1LDAwMS0kMTAwLDAwMCIsICIkMTAwLDAwMS0kNDAwLDAwMCIsICJncmVhdGVyIHRoYW4gJDQwMCwwMDAiKSwNCiAgICBkcm9wID0gRkFMU0UNCiAgKSArDQogIGxhYnMoDQogICAgdGl0bGUgPSAiUGFyY2VsIFZhbHVlcyAoYWRqdXN0ZWQgZm9yIGluZmxhdGlvbikiLA0KICAgIHN1YnRpdGxlID0gIlllYXI6IDIwMTciLA0KICAgIGZpbGwgPSAiUGFyY2VsIFZhbHVlICgkKSINCiAgKSArDQogIHRoZW1lX3ZvaWQoKQ0KYGBgDQoNCiMgMy4gTW9kZWxpbmcNCg0KIVtdKEM6L1VzZXJzL2ZhdGJvL09uZURyaXZlL0RvY3VtZW50cy9HaXRIdWIvTXVzYV84MDFfV2F0YXVnYS9EYXRhL3Bob3Rvcy9tb2RlbDEucG5nKQ0KDQpGb3Igb3VyIG1vZGVsaW5nIHByb2Nlc3MsIHdlIGF0dGVtcHRlZCB0aHJlZSBkaWZmZXJlbnQgbW9kZWxzOiB0aGUgbG9naXN0aWMgbW9kZWwgKHRvIGNhbGN1bGF0ZSBwcm9iYWJpbGl0aWVzKSwgUmFuZG9tIEZvcmVzdCwgYW5kIFBvaXNzb24gcmVncmVzc2lvbiAocGVybWl0IG51bWJlcikuIFdlJ3ZlIGVuY291bnRlcmVkIHZhcmlvdXMgaXNzdWVzLCBpbmNsdWRpbmcgb3ZlcmZpdHRpbmcgYW5kIG1pc2xlYWRpbmdseSBoaWdoIGFjY3VyYWN5IHJhdGVzLCB3aGljaCB3ZSBhdHRyaWJ1dGUgdG8gb3VyIGltYmFsYW5jZWQgZGF0YXNldOKAlG9ubHkgMC4wNSBwZXJjZW50IG9mIHBhcmNlbHMgaGF2ZSBwZXJtaXRzLiBUbyBhZGRyZXNzIHRoaXMsIHdlJ3ZlIHRyaWVkIHJlbW92aW5nIHBhcmNlbHMgd2l0aCBzbG9wZXMgdG9vIHN0ZWVwIGZvciBkZXZlbG9wbWVudCBhbmQgcmVzYW1wbGluZyBieSBvdmVyc2FtcGxpbmcgdGhlIGluc3RhbmNlcyB3aXRoIHBlcm1pdHMgKHJhbmRvbWx5IGR1cGxpY2F0aW5nIHRoZSAx4oCZcyksIHlldCB3ZSBzdGlsbCBlbmQgdXAgd2l0aCBzaW1pbGFyIGNoYWxsZW5nZXMuIEJlbG93LCB5b3Ugd2lsbCBmaW5kIHRoZSByZXN1bHRzIG9mIHRoZXNlIHRocmVlIG1vZGVscyB0byBhc3Npc3QgaW4gZGVjaWRpbmcgd2hpY2ggbW9kZWwgdHlwZSBpcyBiZXN0IHRvIHByb2NlZWQgd2l0aC4NCg0KIVtdKEM6L1VzZXJzL2ZhdGJvL09uZURyaXZlL0RvY3VtZW50cy9HaXRIdWIvTXVzYV84MDFfV2F0YXVnYS9EYXRhL3Bob3Rvcy9tb2RlbDIucG5nKQ0KDQojIyAzLjEgTG9hZGluZyBEYXRhDQoNCkhlcmUgd2UgbG9hZCB0aGUgZGF0YXNldCBmaWx0ZXJlZCBvdXQgdGhlIGRldmVsb3BlZCBhbmQgdW5hYmxlIHRvIGRldmVsb3AgKHN0ZWVwIHNsb3BlKSBwYXJjZWxzIGFzIG91ciBkYXRhc2V0IHVzZWQgZm9yIG1vZGVsIHRyYWluaW5nLiBJbiBvcmRlciB0byB0YWNrbGUgdGhlIGltYmFsYW5jZWQgcHJvYmxlbSBvZiBvdXIgZGF0YXNldCAoMSUgb2YgJzEnIGFuZCA5OSUgb2YgJzAnKSwgd2UgcmFuZG9tbHkgZHVwbGljYXRlIHRoZSAnMScgaW4gb3VyIGRhdHNldCBhbmQgcmVhY2ggdGhlIHJhdGlvIG9mIDEwJSBvZiAnMScgYW5kIDkwJSAnMCcuDQoNCmBgYHtyIGxvYWRfZGF0YTMsIGVjaG89RkFMU0UsIGZpZy5zaG93PSdob2xkJywgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCiMgVGhlIGRhdGFzZXQgZmlsdGVyZWQgb3V0IHRoZSBkZXZlbG9wZWQgYW5kIHVuYWJsZSB0byBkZXZlbG9wIChzdGVlcCBzbG9wZSkgcGFyY2Vscw0KZmlsdGVyX25vX3Jlc2FtcGxlIDwtIHN0X3JlYWQoImh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9KYXJyZWRFUmFuZGFsbC9NdXNhXzgwMV9XYXRhdWdhL21haW4vUmVzYW1wbGUvMDQyMl9kYXRhL2RhdGFfZmlsdGVyZWQuY3N2IikNCg0KIyBKb2luIGJhY2sgYWxsIHRoZSBjb2x1bW5zIG5lZWRlZCB0byB0aGUgZmlsdGVyZWQgZGF0YXNldCAoc3VjaCBhcyBEaXN0X1dhdGVyYm9keSwgRGlzdF9Sb2FkLCBldGMuKQ0Kam9pbmVkX2ZpbHRlcmVkX2RmIDwtIHN0X3JlYWQoImh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9KYXJyZWRFUmFuZGFsbC9NdXNhXzgwMV9XYXRhdWdhL21haW4vUmVzYW1wbGUvMDQyMl9kYXRhL2pvaW5lZF9maWx0ZXJlZF9kZi5jc3YiKQ0KDQojIFRoZSBvcmlnaW5hbCBkYXRhc2V0IHdpdGggYWxsIHBhcmNlbHMgYW5kIGNvbHVtbnMNCmRmX29yaWdpbmFsIDwtIHN0X3JlYWQoImh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9KYXJyZWRFUmFuZGFsbC9NdXNhXzgwMV9XYXRhdWdhL21haW4vUmVzYW1wbGUvMDQyMl9kYXRhL29yaWdpbmFsX2RhdGFzZXRfNDcyNjUuY3N2IikNCg0KIyBUaGUgcmVzYW1wbGVkIGZpbHRlcmVkIGpvaW5lZCBkYXRhc2V0IChyYW5kb21seSBkdXBsaWNhdGUgMSB0byBvdmVyc2FtcGxlIHRoZSByYXRpbyBvZiAxIHRvIDEwJSBvZiB0aGUgdG90YWwgbnVtYmVycyBvZiBwYXJjZWxzKQ0KcmVzYW1wbGUgPC0gc3RfcmVhZCgiaHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tL0phcnJlZEVSYW5kYWxsL011c2FfODAxX1dhdGF1Z2EvbWFpbi9SZXNhbXBsZS8wNDIyX2RhdGEvcmVzYW1wbGUuY3N2IikNCg0KIyBUaGUgcGFyY2VsIGdlb2pzb24NCnBhcmNlbCA9IHN0X3JlYWQoJ2h0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9KYXJyZWRFUmFuZGFsbC9NdXNhXzgwMV9XYXRhdWdhL21haW4vRGF0YS9uYXR1cmFsL3BhcmNlbC5nZW9qc29uJykNCg0KIyBUaGUgcHJvcGVydHkgdmFsdWUgYWRqdXN0ZWQgd2l0aCBpbmZsYXRpb24NCmluZmxhdGlvbiA8LSBzdF9yZWFkKCJodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vSmFycmVkRVJhbmRhbGwvTXVzYV84MDFfV2F0YXVnYS9tYWluL0RhdGEvcGFyY2VsX3dfaW5mbGF0aW9uLmNzdiIpDQoNCiMgU3BhdGlhbCBsYWcgb2YgMjAxNyBhbmQgMjAyMiBzZXB0aWMgcGVybWl0cyBrbm49MywgNCwgNQ0KcGVybWl0X25uIDwtIHN0X3JlYWQoImh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9KYXJyZWRFUmFuZGFsbC9NdXNhXzgwMV9XYXRhdWdhL21haW4vRGF0YS9QRVJNSVRfU1BBVElBTF9MQUcvcGFyY2VsX3NwYXRpYWxfbGFnLmNzdiIpDQoNCiMgUmVhZCB0aGUgMjAxNyBhbmQgMjAyMiBwZXJtaXQgZGF0YQ0KcGVybWl0XzE3IDwtIHN0X3JlYWQoImh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9KYXJyZWRFUmFuZGFsbC9NdXNhXzgwMV9XYXRhdWdhL21haW4vR2VvSlNPTi9jbGlwcGVkX3Blcm1pdDE3Lmdlb2pzb24iKQ0KDQpwZXJtaXRfMjIgPC0gc3RfcmVhZCgiaHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tL0phcnJlZEVSYW5kYWxsL011c2FfODAxX1dhdGF1Z2EvbWFpbi9HZW9KU09OL2NsaXBwZWRfcGVybWl0MjIuZ2VvanNvbiIpDQpgYGANCg0KYGBge3IgY29udmVydF9udW1lcmljLCBlY2hvPUZBTFNFLCBmaWcuc2hvdz0naG9sZCcsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQojIENvbnZlcnQgdGhlIGRhdGFmcmFtZSBjb2x1bW5zIHRvIG51bWVyaWMNCnJlc2FtcGxlIDwtIHJlc2FtcGxlICU+JQ0KICBtdXRhdGVfaWYofiAhaWRlbnRpY2FsKC4sIHJlc2FtcGxlJEdsb2JhbElEKSwgYXMubnVtZXJpYykNCg0KcmVzYW1wbGUgPC0gbmEub21pdChyZXNhbXBsZSkNCmBgYA0KDQojIyAzLjIgUmFuZG9tIEZvcmVzdCBNb2RlbA0KDQpGaXJzdGx5LCB3ZSBwcmVwYXJlIHRoZSB0cmFpbmluZyBkYXRhc2V0IGJ5IGRyb3BwaW5nIHRoZSAnR2xvYmFsSUQnIGFuZCAnbl9wZXJtaXRfMjInIGNvbHVtbnMuIEFuZCBzZXQgdGhlICdwZXJtaXRfMjInIGNvbHVtbiBhcyBvdXIgdGFyZ2V0IHZhcmlhYmxlLiBUaGVuIHdlIHN0YW5kYXJpemUgYWxsIHRoZSBpbmRlcGVuZGVudCB2YXJpYWJsZXMgaW4gdGhlIGRhdGFzZXQuDQoNCmBgYHtyIHJlZmluZV9kYXRhLCBlY2hvPUZBTFNFLCBmaWcuc2hvdz0naG9sZCcsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQojIERyb3AgdGhlICdHbG9iYWxJRCcgYW5kICduX3Blcm1pdF8yMicgY29sdW1ucyB0byB0cmFpbiB0aGUgbW9kZWwNCnJlZmluZWRfZGF0YSA8LSByZXNhbXBsZSU+JWRwbHlyOjpzZWxlY3QoLUdsb2JhbElELC1uX3Blcm1pdF8yMikNCmBgYA0KDQpgYGB7ciBkYXRhX3NjYWxlLCBlY2hvPUZBTFNFLCBmaWcuc2hvdz0naG9sZCcsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQpkYXRhX3NjYWxlZCA8LSByZWZpbmVkX2RhdGENCg0KIyBTdGFuZGFyZGl6ZSBhbGwgY29sdW1ucyBleGNlcHQgJ3Blcm1pdF8yMicgKHRhcmdldCB2YXJpYWJsZSkNCmRhdGFfc2NhbGVkWywgbmFtZXMoZGF0YV9zY2FsZWQpICE9ICJwZXJtaXRfMjIiXSA8LSBzY2FsZShkYXRhX3NjYWxlZFssIG5hbWVzKGRhdGFfc2NhbGVkKSAhPSAicGVybWl0XzIyIl0pDQpgYGANCg0KYGBge3IgaW5kZXhfZGF0YSwgZWNobz1GQUxTRSwgZmlnLnNob3c9J2hvbGQnLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KIyBJZGVudGlmeSB0aGUgaW5kZXggb2YgdGhlICdwZXJtaXRfMjInIGNvbHVtbg0KcGVybWl0XzIyX2luZGV4IDwtIHdoaWNoKG5hbWVzKGRhdGFfc2NhbGVkKSA9PSAicGVybWl0XzIyIikNCg0KIyBSZW9yZGVyIHRoZSBjb2x1bW5zIHdpdGggJ3Blcm1pdF8yMicgYXMgdGhlIGZpcnN0IGNvbHVtbg0KZGF0YV9zY2FsZWQgPC0gZGF0YV9zY2FsZWRbLCBjKHBlcm1pdF8yMl9pbmRleCwgc2V0ZGlmZigxOm5jb2woZGF0YV9zY2FsZWQpLCBwZXJtaXRfMjJfaW5kZXgpKV0NCmBgYA0KDQpUbyBkZXRlcm1pbmUgdGhlIHZhcmlhYmxlcyB3aXRoIHRoZSBncmVhdGVzdCBzaWduaWZpY2FuY2UsIHRoYXQgY291bGQgYmUgdXNlZCBmb3IgbW9kZWwgdHJhaW5pbmcsIHdlIHBsb3Qgb3V0IHRoZSBjb3JyZWxhdGlvbiBtYXRyaXggYW5kIGEgYmFyIGNoYXJ0IHRvIHNob3cgdGhlIHAtdmFsdWUgb2YgdGhlIGluZGVwZW5kZW50IHZhcmlhYmxlcy4gVGhlbiB3ZSBjaG9vc2UgMTMgbW9zdCBzaWduaWZpY2FudCB2YXJpYWJsZXMgdG8gaW5jbHVkZSBpbiBvdXIgdHJhaW5pbmcuDQoNCiMjIyBDb3JyZWxhdGlvbiBNYXRyaXgNCg0KVGhlIGNvcnJlbGF0aW9uIG1hdHJpeCBzaG93cyB0aGF0IHRoZSAnU2xvcGVfQXZlJywgJ1Nsb3BlX01heCcsICdwZXJtaXRfMTcubm5fMycsICdwZXJtaXRfMTcubm5fNCcsICdwZXJtaXRfMTcubm5fNScsICdQYXN0dXJlX0hheScsICdEZXZlbG9wZWRfTWVkaXVtX0ludGVuc2l0eScsICdwZXJtaXRfMTcnLCAnWVJCVUlMVCcgYW5kICdEaXN0X0Zsb3dsaW5lJyBhcmUgdGhlIG1vc3QgY29ycmVsYXRlZCB2YXJpYWJsZXMuDQoNCmBgYHtyIGNvcnJfbWF0cml4LCBlY2hvPUZBTFNFLCBmaWcuc2hvdz0naG9sZCcsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQojIENvbXB1dGUgdGhlIGNvcnJlbGF0aW9uIG1hdHJpeA0KY29yX21hdHJpeCA8LSByb3VuZChjb3IoZGF0YV9zY2FsZWQpLCAxKQ0KDQojIFBsb3QgdGhlIGNvcnJlbGF0aW9uIG1hdHJpeA0KcGxvdCA8LSBnZ2NvcnJwbG90KA0KICBjb3JfbWF0cml4LCANCiAgcC5tYXQgPSBjb3JfcG1hdChkYXRhX3NjYWxlZCksDQogIGNvbG9ycyA9IGMoIiMyNUNCMTAiLCAid2hpdGUiLCAiI0ZBNzgwMCIpLA0KICB0eXBlID0gImxvd2VyIiwNCiAgaW5zaWcgPSAiYmxhbmsiDQopICsgIA0KICBsYWJzKHRpdGxlID0gIkNvcnJlbGF0aW9uIGFjcm9zcyBudW1lcmljIHZhcmlhYmxlcyIpKw0KICAgdGhlbWUoDQogICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IDUpLCAgIyBBZGp1c3QgeC1heGlzIGxhYmVsIHNpemUNCiAgICBheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dChzaXplID0gNSkgICAjIEFkanVzdCB5LWF4aXMgbGFiZWwgc2l6ZQ0KICApDQoNCnBsb3QNCg0KIyBFeHBvcnQgdGhlIHBsb3QgdG8gYSBmaWxlDQpnZ3NhdmUoImNvcnJlbGF0aW9uX21hdHJpeC5qcGciLCBwbG90LCB3aWR0aCA9IDEwLCBoZWlnaHQgPSA4LCBkcGkgPSAzMDApDQpgYGANCg0KIyMjIFAtdmFsdWUgQmFyIENoYXJ0DQoNClNpbWlsYXIgdG8gdGhlIHJlc3VsdCBvZiB0aGUgY29ycmVsYXRpb24gbWF0cml4LCB0aGUgcC12YWx1ZSBiYXIgY2hhcnQgc2hvd3MgdGhhdCB0aGUgJ3Blcm1pdF8xNycsICdTbG9wZV9BdmUnLCAnU2xvcGVfTWF4JywgJ3Blcm1pdF8xNy5ubl8zJywgJ3Blcm1pdF8xNy5ubl80JywgJ3Blcm1pdF8xNy5ubl81JywgJ1Bhc3R1cmVfSGF5JywgJ0RldmVsb3BlZF9NZWRpdW1fSW50ZW5zaXR5JywgJ3Blcm1pdF8xNycsICdZUkJVSUxUJywgJ0Rpc3RfRmxvd2xpbmUnLCAnRGlzdF9Sb2FkJywgJ0RldmVsb3BlZF9IaWdoX0ludGVuc2l0eScsICdEZXZlbG9wZWRfTG93X0ludGVuc2l0eScsICdEZXZlbG9wZWRfT3Blbl9TcGFjZScsICdTb2lsX0EnIGFuZCAnaW5mYWx0aW9uXzE3JyBhcmUgdGhlIG1vc3QgY29ycmVsYXRlZCB2YXJpYWJsZXMuDQoNCmBgYHtyIHZhcmlhYmxlX3NpZ25pZmljYW5jZSwgZWNobz1GQUxTRSwgZmlnLnNob3c9J2hvbGQnLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KIyBQbG90IGEgYmFyIGNoYXJ0IHRvIHNlZSB0aGUgdmFyaWFibGVzJyBjb3JyZWxhdGlvbiB0byB0aGUgdGFyZ2V0IHZhcmlhYmxlDQojIEluaXRpYWxpemUgdmVjdG9ycyB0byBzdG9yZSByZXN1bHRzDQpjb3JyZWxhdGlvbnMgPC0gbnVtZXJpYygpDQpwX3ZhbHVlcyA8LSBudW1lcmljKCkNCiMgRXhjbHVkZSBib3RoICdwZXJtaXRfMjInIGFuZCAnWVJCVUlMVCcgZnJvbSB0aGUgbGlzdCBvZiB2YXJpYWJsZXMNCnZhcmlhYmxlcyA8LSBuYW1lcyhkYXRhX3NjYWxlZClbIW5hbWVzKGRhdGFfc2NhbGVkKSAlaW4lIGMoInBlcm1pdF8yMiIsICJZUkJVSUxUIildDQoNCiMgTG9vcCB0aHJvdWdoIGNvbHVtbnMgYW5kIGNvbXB1dGUgY29ycmVsYXRpb24gdGVzdCB3aXRoICdwZXJtaXRfMjInDQpmb3IgKHZhciBpbiB2YXJpYWJsZXMpIHsNCiAgdGVzdF9yZXN1bHQgPC0gY29yLnRlc3QoZGF0YV9zY2FsZWRbW3Zhcl1dLCBkYXRhX3NjYWxlZCRwZXJtaXRfMjIsIG1ldGhvZCA9ICJwZWFyc29uIiwgdXNlID0gImNvbXBsZXRlLm9icyIpDQogIGNvcnJlbGF0aW9ucyA8LSBjKGNvcnJlbGF0aW9ucywgdGVzdF9yZXN1bHQkZXN0aW1hdGUpDQogIHBfdmFsdWVzIDwtIGMocF92YWx1ZXMsIHRlc3RfcmVzdWx0JHAudmFsdWUpDQp9DQoNCiMgQ29tYmluZSByZXN1bHRzIGludG8gYSBkYXRhZnJhbWUNCnJlc3VsdHNfZGYgPC0gZGF0YS5mcmFtZSgNCiAgVmFyaWFibGUgPSB2YXJpYWJsZXMsDQogIENvcnJlbGF0aW9uID0gY29ycmVsYXRpb25zLA0KICBQX1ZhbHVlID0gcF92YWx1ZXMNCikNCg0KIyBPcmRlciBkYXRhZnJhbWUgYnkgcC12YWx1ZSwgbGFyZ2VzdCB0byBzbWFsbGVzdCBmb3IgcGxvdHRpbmcNCnJlc3VsdHNfZGYgPC0gcmVzdWx0c19kZiAlPiUNCiAgYXJyYW5nZShkZXNjKFBfVmFsdWUpKQ0KDQojIFBsb3QgdXNpbmcgZ2dwbG90Mg0KcGxvdF9jb3JyIDwtIGdncGxvdChyZXN1bHRzX2RmLCBhZXMoeCA9IHJlb3JkZXIoVmFyaWFibGUsIC1QX1ZhbHVlKSwgeSA9IENvcnJlbGF0aW9uLCBmaWxsID0gLWxvZzEwKFBfVmFsdWUpKSkgKw0KICBnZW9tX2JhcihzdGF0ID0gImlkZW50aXR5IikgKw0KICBjb29yZF9mbGlwKCkgKyAgIyBNYWtlIHRoZSBiYXIgcGxvdCBob3Jpem9udGFsDQogIHNjYWxlX2ZpbGxfY29udGludW91cyhuYW1lID0gIi1sb2cxMChQLXZhbHVlKSIsIGxvdyA9ICJyZWQiLCBoaWdoID0gImJsdWUiKSArDQogIHRoZW1lX21pbmltYWwoKSArDQogIHhsYWIoIlZhcmlhYmxlIikgKw0KICB5bGFiKCJDb3JyZWxhdGlvbiB3aXRoIHBlcm1pdF8yMiIpICsNCiAgZ2d0aXRsZSgiQ29ycmVsYXRpb24gb2YgVmFyaWFibGVzIHdpdGggcGVybWl0XzIyIGJ5IFNpZ25pZmljYW5jZSIpDQoNCiMgUHJpbnQgdGhlIHBsb3QNCnBsb3RfY29ycg0KDQojIEV4cG9ydCB0aGUgcGxvdCB0byBhIGZpbGUNCmdnc2F2ZSgicC12YWx1ZS5qcGciLCBwbG90X2NvcnIsIHdpZHRoID0gMTAsIGhlaWdodCA9IDgsIGRwaSA9IDMwMCkNCmBgYA0KDQojIyMgQ2hvb3NpbmcgRmVhdHVyZXMNCg0KU28gd2UgaW5jbHVkZSB0aGUgdGFyZ2V0IHZhcmlhYmwgJ3Blcm1pdF8yMicgYW5kIDE1IGZlYXR1cmVzIGludG8gdGhlIG1vZGVsLiBUaGUgZmVhdHVyZXMgYXJlICdwZXJtaXRfMTcnLCAnU2xvcGVfQXZlJywgJ1Nsb3BlX01heCcsICdwZXJtaXRfMTcubm5fMycsICdwZXJtaXRfMTcubm5fNCcsICdwZXJtaXRfMTcubm5fNScsICdQYXN0dXJlX0hheScsICdEZXZlbG9wZWRfTWVkaXVtX0ludGVuc2l0eScsICdwZXJtaXRfMTcnLCAnRGlzdF9GbG93bGluZScsICdEaXN0X1JvYWQnLCAnRGV2ZWxvcGVkX0hpZ2hfSW50ZW5zaXR5JywgJ0RldmVsb3BlZF9Mb3dfSW50ZW5zaXR5JywgJ0RldmVsb3BlZF9PcGVuX1NwYWNlJywgYW5kICdpbmZhbHRpb25fMTcnDQoNCmBgYHtyIGNob29zZV9mZWF0dXJlcywgZWNobz1GQUxTRSwgZmlnLnNob3c9J2hvbGQnLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KIyBJbmNsdWRlIDE2IGZlYXR1cmVzIGludG8gdGhlIG1vZGVsDQptb2RlbF9kYXRhIDwtIHJlc2FtcGxlICU+JQ0KICBkcGx5cjo6c2VsZWN0KHBlcm1pdF8yMiwgcGVybWl0XzE3LCBwZXJtaXRfMTcubm5fMywgcGVybWl0XzE3Lm5uXzQsIHBlcm1pdF8xNy5ubl81LCBTbG9wZV9BdmUsIFNsb3BlX01heCwgRGlzdF9GbG93bGluZSwgRGV2ZWxvcGVkX01lZGl1bV9JbnRlbnNpdHksIFBhc3R1cmVfSGF5LCBEaXN0X1JvYWQsIERldmVsb3BlZF9IaWdoX0ludGVuc2l0eSwgRGV2ZWxvcGVkX0xvd19JbnRlbnNpdHksIERldmVsb3BlZF9PcGVuX1NwYWNlLCBpbmZsYXRpb24xNywgYXJlYSkgJT4lDQogIGRwbHlyOjpyZW5hbWUoDQogICAgcGVybWl0ID0gcGVybWl0XzIyLA0KICAgIHBlcm1pdF9sYWcgPSBwZXJtaXRfMTcsDQogICAgcGVybWl0X2xhZy5ubl8zID0gcGVybWl0XzE3Lm5uXzMsDQogICAgcGVybWl0X2xhZy5ubl80ID0gcGVybWl0XzE3Lm5uXzQsDQogICAgcGVybWl0X2xhZy5ubl81ID0gcGVybWl0XzE3Lm5uXzUsDQogICAgcHJvcGVydHlfdmFsdWUgPSBpbmZsYXRpb24xNw0KICApDQpgYGANCg0KYGBge3IgZXhwb3J0X2Nzdl9mb3Jfc3BhdGlhbF9jdiwgZWNobz1GQUxTRSwgZmlnLnNob3c9J2hvbGQnLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0Kd3JpdGUuY3N2KG1vZGVsX2RhdGEsICJtb2RlbF9kYXRhLmNzdiIsIHJvdy5uYW1lcyA9IEZBTFNFKQ0KYGBgDQoNCmBgYHtyIHN0YW5kYXJpemVfbW9kZWxfZGF0YSwgZWNobz1GQUxTRSwgZmlnLnNob3c9J2hvbGQnLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KbW9kZWxfZGF0YV9zY2FsZWQgPC0gbW9kZWxfZGF0YQ0KDQojIFN0YW5kYXJkaXplIGFsbCBjb2x1bW5zIGV4Y2VwdCAncGVybWl0JyAodGFyZ2V0IHZhcmlhYmxlKQ0KbW9kZWxfZGF0YV9zY2FsZWRbLCBuYW1lcyhtb2RlbF9kYXRhX3NjYWxlZCkgIT0gInBlcm1pdCJdIDwtIHNjYWxlKG1vZGVsX2RhdGFfc2NhbGVkWywgbmFtZXMobW9kZWxfZGF0YV9zY2FsZWQpICE9ICJwZXJtaXQiXSkNCmBgYA0KDQojIyMgRGF0YSBzcGxpdA0KDQpXZSBzcGxpdCBvdXIgZGF0YXNldCBpbnRvIHRyYWluaW5nIGFuZCB0ZXN0aW5nIHNldHMgdXNpbmcgdGhlIGBpbml0aWFsX3NwbGl0KClgIGZ1bmN0aW9uIGZyb20gdGhlIGByc2FtcGxlYCBwYWNrYWdlLiBXZSB1c2UgODAlIG9mIHRoZSBkYXRhIGZvciB0cmFpbmluZyBhbmQgMjAlIGZvciB0ZXN0aW5nLiBUaGUgYHNldC5zZWVkKClgIGZ1bmN0aW9uIGlzIHVzZWQgdG8gZW5zdXJlIHJlcHJvZHVjaWJpbGl0eS4NCg0KYGBge3IgZGF0YV9zcGxpdCwgZWNobz1GQUxTRSwgZmlnLnNob3c9J2hvbGQnLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KIyBFbnN1cmUgdGhlIHBlcm1pdCB2YXJpYWJsZSBpcyBjb252ZXJ0ZWQgdG8gYSBmYWN0b3INCm1vZGVsX2RhdGFfc2NhbGVkJHBlcm1pdCA8LSBhcy5mYWN0b3IobW9kZWxfZGF0YV9zY2FsZWQkcGVybWl0KQ0KDQojIFNwbGl0IHRoZSBkYXRhIGludG8gdHJhaW5pbmcgYW5kIHRlc3Rpbmcgc2V0cw0Kc2V0LnNlZWQoMTIzKSAjIGZvciByZXByb2R1Y2liaWxpdHkNCnNwbGl0IDwtIGluaXRpYWxfc3BsaXQobW9kZWxfZGF0YV9zY2FsZWQsIHByb3AgPSAwLjgpDQp0cmFpbl9kYXRhIDwtIHRyYWluaW5nKHNwbGl0KQ0KdGVzdF9kYXRhIDwtIHRlc3Rpbmcoc3BsaXQpDQoNCiMgRGVmaW5lIHJlY2lwZSBmb3IgZGF0YSBwcmVwcm9jZXNzaW5nDQpyZWNpcGUgPC0gcmVjaXBlKHBlcm1pdCB+IC4sIGRhdGEgPSB0cmFpbl9kYXRhKSAlPiUNCiAgc3RlcF9zY2FsZShhbGxfcHJlZGljdG9ycygpKSAlPiUNCiAgc3RlcF9jZW50ZXIoYWxsX3ByZWRpY3RvcnMoKSkNCmBgYA0KDQojIyMgSHlwZXJwYXJhbWV0ZXIgVHVuaW5nICYgQ3Jvc3MgVmFsaWRhdGlvbg0KDQpOZXh0LCBzZXQgdXAgdGhlIGh5cGVycGFyYW1ldGVyIGdyaWQgZm9yIHR1bmluZzoNCg0KYGBge3IgaHlwZXJwYXJhbWV0ZXJfZ3JpZCwgZWNobz1GQUxTRSwgZmlnLnNob3c9J2hvbGQnLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KIyBEZWZpbmUgdGhlIG1vZGVsIHNwZWNpZmljYXRpb24NCnJmX3NwZWMgPC0gcmFuZF9mb3Jlc3QoDQogIHRyZWVzID0gMTUwMCwNCiAgbXRyeSA9IHR1bmUoKSwNCiAgbWluX24gPSB0dW5lKCkNCikgJT4lDQogIHNldF9lbmdpbmUoInJhbmRvbUZvcmVzdCIpICU+JQ0KICBzZXRfbW9kZSgiY2xhc3NpZmljYXRpb24iKQ0KDQojIERlZmluZSB0aGUgZ3JpZCBvZiBoeXBlcnBhcmFtZXRlcnMNCmdyaWQgPC0gZ3JpZF9yZWd1bGFyKA0KICBtdHJ5KHJhbmdlID0gYygzLCAxNSkpLA0KICBtaW5fbihyYW5nZSA9IGMoMTAwMCwgMjAwMCkpLA0KICBsZXZlbHMgPSAzDQopDQpgYGANCg0KSHlwZXJwYXJhbWV0ZXIgdHVuaW5nIGFuZCBjcm9zcy12YWxpZGF0aW9uIGFyZSBwZXJmb3JtZWQgdXNpbmcgdGhlIGB0dW5lX2dyaWQoKWAgZnVuY3Rpb24gZnJvbSB0aGUgYHR1bmVgIHBhY2thZ2UuIFdlIHNwZWNpZnkgdGhlIG1ldHJpY3MgdG8gb3B0aW1pemUgZm9yLCBpbmNsdWRpbmcgUk9DIEFVQywgYWNjdXJhY3ksIHNlbnNpdGl2aXR5LCBwcmVjaXNpb24sIGFuZCBGMSBzY29yZS4NCg0KYGBge3IgdHVuaW5nLCBlY2hvPUZBTFNFLCBmaWcuc2hvdz0naG9sZCcsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQojIERlZmluZSBhIG1ldHJpYyBzZXQgaW5jbHVkaW5nIHRoZSBuZXcgbWV0cmljcw0KY3VzdG9tX21ldHJpY3MgPC0gbWV0cmljX3NldChyb2NfYXVjLCBhY2N1cmFjeSwgc2VucywgcHB2LCBmX21lYXMpDQoNCiMgUGVyZm9ybSB0dW5pbmcgd2l0aCB0aGVzZSBtZXRyaWNzDQp0dW5lX3Jlc3VsdHMgPC0gdHVuZV9ncmlkKA0KICByZl9zcGVjLA0KICByZWNpcGUsDQogIHJlc2FtcGxlcyA9IHZmb2xkX2N2KHRyYWluX2RhdGEsIHYgPSA1KSwNCiAgZ3JpZCA9IGdyaWQsDQogIG1ldHJpY3MgPSBjdXN0b21fbWV0cmljcw0KKQ0KYGBgDQoNCmBgYHtyIHR1bmluZ19yZXN1bHRzLCBlY2hvPUZBTFNFLCBmaWcuc2hvdz0naG9sZCcsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQojIFZpZXcgYmVzdCBwYXJhbWV0ZXJzDQpiZXN0X3BhcmFtcyA8LSBzZWxlY3RfYmVzdCh0dW5lX3Jlc3VsdHMsIG1ldHJpYyA9ICJhY2N1cmFjeSIpDQpwcmludChiZXN0X3BhcmFtcykNCmBgYA0KDQpGaW5hbGx5LCBmaW5hbGl6ZSB0aGUgbW9kZWwgd2l0aCB0aGUgYmVzdCBwYXJhbWV0ZXJzIGFuZCBldmFsdWF0ZSBpdCBvbiB0aGUgdGVzdCBzZXQuDQoNCmBgYHtyIGZpbmFsX21vZGVsLCBlY2hvPUZBTFNFLCBmaWcuc2hvdz0naG9sZCcsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQojIFJlZml0IHRoZSBtb2RlbCB1c2luZyB0aGUgYmVzdCBwYXJhbWV0ZXJzDQpmaW5hbF9yZl9zcGVjIDwtIHJhbmRfZm9yZXN0KA0KICB0cmVlcyA9IDE1MDAsDQogIG10cnkgPSBiZXN0X3BhcmFtcyRtdHJ5LA0KICBtaW5fbiA9IGJlc3RfcGFyYW1zJG1pbl9uDQopICU+JQ0KICBzZXRfZW5naW5lKCJyYW5kb21Gb3Jlc3QiKSAlPiUNCiAgc2V0X21vZGUoImNsYXNzaWZpY2F0aW9uIikNCg0KIyBCdW5kbGUgdGhlIHByZS1wcm9jZXNzaW5nIHJlY2lwZSBhbmQgbW9kZWwgaW50byBhIHdvcmtmbG93DQpmaW5hbF93b3JrZmxvdyA8LSB3b3JrZmxvdygpICU+JQ0KICBhZGRfcmVjaXBlKHJlY2lwZSkgJT4lDQogIGFkZF9tb2RlbChmaW5hbF9yZl9zcGVjKQ0KDQojIEZpdCB0aGUgZmluYWwgbW9kZWwgb24gdGhlIGVudGlyZSB0cmFpbmluZyBkYXRhDQpmaW5hbF9maXQgPC0gZml0KGZpbmFsX3dvcmtmbG93LCBkYXRhID0gdHJhaW5fZGF0YSkNCg0KIyBVc2UgdGhlIHByZWRpY3QgZnVuY3Rpb24gdG8gZ2V0IHRoZSBjbGFzcyBwcmVkaWN0aW9ucw0KdGVzdF9wcmVkaWN0aW9ucyA8LSBwcmVkaWN0KGZpbmFsX2ZpdCwgdGVzdF9kYXRhLCB0eXBlID0gImNsYXNzIikNCg0KIyBFbnN1cmUgYm90aCBhcmUgZmFjdG9ycyB3aXRoIHRoZSBzYW1lIGxldmVscw0KdGVzdF9kYXRhJHBlcm1pdCA8LSBmYWN0b3IodGVzdF9kYXRhJHBlcm1pdCwgbGV2ZWxzID0gYygiMCIsICIxIikpDQp0ZXN0X3ByZWRpY3Rpb25zJC5wcmVkX2NsYXNzIDwtIGZhY3Rvcih0ZXN0X3ByZWRpY3Rpb25zJC5wcmVkX2NsYXNzLCBsZXZlbHMgPSBjKCIwIiwgIjEiKSkNCg0KIyBDcmVhdGUgdGhlIGNvbmZ1c2lvbiBtYXRyaXgNCmNvbmZfbWF0cml4IDwtIGNvbmZ1c2lvbk1hdHJpeChkYXRhID0gdGVzdF9wcmVkaWN0aW9ucyQucHJlZF9jbGFzcywgcmVmZXJlbmNlID0gdGVzdF9kYXRhJHBlcm1pdCkNCg0KIyBWaWV3IHRoZSBjb25mdXNpb24gbWF0cml4DQpwcmludChjb25mX21hdHJpeCkNCmBgYA0KDQojIyAzLjMgU3BhdGlhbCBDcm9zcy1WYWxpZGF0aW9uDQoNCk9uY2UgdGhlIG1vZGVsIGlzIGNyZWF0ZWQsIGl0IGlzIGltcG9ydGFudCB0byB0ZXN0IGhvdyBhY2N1cmF0ZWx5IGl0IHBlcmZvcm1zIGFjcm9zcyBkaWZmZXJlbnQgYXJlYXMgb2YgdGhlIENvdW50eS4gSW4gdGhlIG1hcCBiZWxvdywgdGhlIHJhbmRvbSBmb3Jlc3QgbW9kZWwncyBhY2N1cmFjeSBpcyBtYXBwZWQgYWNyb3NzIHppcCBjb2RlcyBpbiBXYXRhdWdhLCBzaG93aW5nIHRoYXQgd2hpbGUgdGhlIG1vZGVsIGlzIHZlcnkgYWNjdXJhdGUgYWNyb3NzIHRoZSBDb3VudHksIGl0IHBlcmZvcm1zIGVzcGVjaWFsbHkgd2VsbCB0b3dhcmRzIHRoZSBjZW50ZXIgcmVnaW9ucy4gVGhpcyBpcyBhbiBpbXBvcnRhbnQgY29uc2lkZXJhdGlvbiB3aGVuIGFja25vd2xlZGdpbmcgdGhhdCB0aGUgY2VudGVyIHJlZ2lvbiBpcyBhbHNvIG1vcmUgbGlrZWx5IHRvIGJlIGFuIGVhcmx5IHRhcmdldCBmb3IgZGV2ZWxvcG1lbnQgZHVlIHRvIGl0cyBwcm94aW1pdHkgdG8gQm9vbmUgYW5kIG90aGVyIGFtZW5pdHkgaHVicy4NCg0KYGBge3J9DQojIHJlYWQgaW4gZGF0YQ0KcHJlZGljdGlvbl8wNDI3IDwtIHN0X3JlYWQoImh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9KYXJyZWRFUmFuZGFsbC9NdXNhXzgwMV9XYXRhdWdhL21haW4vTW9kZWxpbmcvMDQyNy9wcmVkaWN0aW9uXzA0MjcuZ2VvanNvbiIpDQpwcmVkaWN0aW9uX2ZpbmFsIDwtIHN0X3JlYWQoImh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9KYXJyZWRFUmFuZGFsbC9NdXNhXzgwMV9XYXRhdWdhL21haW4vTW9kZWxpbmcvMDQyNy9wcmVkaWN0aW9uX2ZpbmFsLmdlb2pzb24iKQ0KWmlwQ29kZXMgPC0gc3RfcmVhZCgiaHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tL0phcnJlZEVSYW5kYWxsL011c2FfODAxX1dhdGF1Z2EvbWFpbi9HZW9KU09OL1ppcENvZGVzLmdlb2pzb24iKQ0KWmlwQ29kZXMgPC0gc3RfdHJhbnNmb3JtKFppcENvZGVzLCBzdF9jcnMocHJlZGljdGlvbl9maW5hbCkpDQoNCiMgYmVnaW4gYW5hbHlzaXMNCnppcF9qb2luZWQgPC0gc3Rfam9pbihwcmVkaWN0aW9uX2ZpbmFsLCBaaXBDb2Rlcywgam9pbiA9IHN0X2ludGVyc2VjdHMpDQp6aXBfam9pbmVkIDwtIHppcF9qb2luZWQgJT4lDQogICAgICAgICAgICAgIGZpbHRlciAoZGV2ZWxvcGVkID09IDAgJiB1bmRldmVsb3BhYmxlID09IDApDQpjb2x1bW5zIDwtIGMoIkdsb2JhbElEIiwgIkR2cHRfUHJvYiIsICJwZXJtaXRfbGFnIiwgIkdFT0lEMjAiKQ0KcHJlZGljdGlvbl96aXBzIDwtIHppcF9qb2luZWRbLCBjb2x1bW5zXQ0KDQpwcmVkaWN0aW9uX3ppcHMgPC0gcHJlZGljdGlvbl96aXBzICU+JQ0KICAgICAgICAgICAgICAgICAgICAgICAgICBtdXRhdGUocHJlZGljdGVkID0gaWZlbHNlKER2cHRfUHJvYiA+IDAuNSwgMSwgMCkpDQpwcmVkaWN0aW9uX3ppcHMgPC0gcHJlZGljdGlvbl96aXBzICU+JQ0KICAgICAgICAgICAgICAgICAgICAgICAgICBtdXRhdGUoc3VjY2VzcyA9IGlmZWxzZShwcmVkaWN0ZWQgPT0gcGVybWl0X2xhZywgMSwwKSkNCg0KcHJlZGljdGlvbl96aXBzX2dyb3VwZWQgPC0gcHJlZGljdGlvbl96aXBzICU+JQ0KICBncm91cF9ieShHRU9JRDIwKSAlPiUNCiAgc3VtbWFyaXplKHN1Y2Nlc3NSYXRlID0gc3VtKHN1Y2Nlc3MgPT0gMSkgLyBuKCkpDQoNCiMgbGV0J3MgbWFwIQ0KbWFwcGluZ19kYXRhIDwtIHN0X2pvaW4oWmlwQ29kZXMsIHByZWRpY3Rpb25femlwc19ncm91cGVkLCBieSA9ICJHRU9JRDIwIiwgYWxsLnggPSBUUlVFKQ0KDQpnZ3Bsb3QobWFwcGluZ19kYXRhKSArDQogIGdlb21fc2YoYWVzKGZpbGwgPSBzdWNjZXNzUmF0ZSksIGNvbG9yID0gIndoaXRlIikgKw0KICBnZW9tX3NmX3RleHQoYWVzKGxhYmVsID0gR0VPSUQyMC54KSwgY29sb3IgPSAiYmxhY2siLCBzaXplID0gMykgKyANCiAgc2NhbGVfZmlsbF9ncmFkaWVudChsb3cgPSAid2hpdGUiLCBoaWdoID0gIiNlMmEzMzQiLCBuYW1lID0gIkFjY3VyYWN5IikgKw0KICB4bGFiKE5VTEwpICsNCiAgeWxhYihOVUxMKSArDQogIHRoZW1lX3ZvaWQoKQ0KYGBgDQoNCiMgNC4gUHJlZGljdGluZyBmb3IgMjAyNw0KDQpBZnRlciBnZXR0aW5nIHRoZSBiZXN0IG1vZGVsLCB3ZSBzaG91bGQgc3RhcnQgb3VyIHByZWRpY3Rpb24uIEJhc2VkIG9uIHRoZSBkYXRhIGluIDIwMjIsIHdlIGNvdWxkIHByZWRpY3QgdGhlIHNlcHRpYyBwZXJtaXRzIGZvciAyMDI3Lg0KDQpgYGB7ciBtZXJnZV8yMl9kYXRhLCBlY2hvPUZBTFNFLCBmaWcuc2hvdz0naG9sZCcsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQojIEpvaW4gdGhlIGluZmxhdGlvbiAyMDIyIGRhdGEgdG8gdGhlIHJlc2FtcGxlZCBkYXRhc2V0DQpkZl8yMiA8LSBqb2luZWRfZmlsdGVyZWRfZGYgJT4lDQogIGxlZnRfam9pbihkcGx5cjo6c2VsZWN0KGluZmxhdGlvbiwgYygiR2xvYmFsSUQiLCBpbmZsYXRpb24yMikpLCBieSA9ICJHbG9iYWxJRCIpDQoNCiMgSm9pbiB0aGUgMjAyMiBzZXB0aWMgcGVybWl0IHNwYXRpYWwgbGFnIGRhdGEgdG8gdGhlIHJlc2FtcGxlZCBkYXRhc2V0DQpkZl8yMiA8LSBkZl8yMiAlPiUNCiAgbGVmdF9qb2luKGRwbHlyOjpzZWxlY3QocGVybWl0X25uLCBHbG9iYWxJRCwgcGVybWl0XzIyLm5uXzMsIHBlcm1pdF8yMi5ubl80LCBwZXJtaXRfMjIubm5fNSksIGJ5ID0gIkdsb2JhbElEIikNCmBgYA0KDQpgYGB7ciBjb252ZXJ0X251bV9kZl8yMl9kYXRhLCBlY2hvPUZBTFNFLCBmaWcuc2hvdz0naG9sZCcsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQpkZl8yMiA8LSBkZl8yMiAlPiUNCiAgbXV0YXRlX2lmKH4gIWlkZW50aWNhbCguLCBkZl8yMiRHbG9iYWxJRCksIGFzLm51bWVyaWMpDQoNCmRmXzIyIDwtIG5hLm9taXQoZGZfMjIpDQpgYGANCg0KYGBge3IgcHJlZGljdF9kYXRhMiwgZWNobz1GQUxTRSwgZmlnLnNob3c9J2hvbGQnLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KcHJlZGljdF9kYXRhIDwtIGRmXzIyICU+JQ0KICBkcGx5cjo6c2VsZWN0KEdsb2JhbElELCBwZXJtaXRfMjIsIHBlcm1pdF8yMi5ubl8zLCBwZXJtaXRfMjIubm5fNCwgcGVybWl0XzIyLm5uXzUsIFNsb3BlX0F2ZSwgU2xvcGVfTWF4LCBEaXN0X0Zsb3dsaW5lLCBEZXZlbG9wZWRfTWVkaXVtX0ludGVuc2l0eSwgUGFzdHVyZV9IYXksIERpc3RfUm9hZCwgRGV2ZWxvcGVkX0hpZ2hfSW50ZW5zaXR5LCBEZXZlbG9wZWRfTG93X0ludGVuc2l0eSwgRGV2ZWxvcGVkX09wZW5fU3BhY2UsIGluZmxhdGlvbjIyLCBhcmVhKSAlPiUNCiAgZHBseXI6OnJlbmFtZSgNCiAgICBwZXJtaXRfbGFnID0gcGVybWl0XzIyLA0KICAgIHBlcm1pdF9sYWcubm5fMyA9IHBlcm1pdF8yMi5ubl8zLA0KICAgIHBlcm1pdF9sYWcubm5fNCA9IHBlcm1pdF8yMi5ubl80LA0KICAgIHBlcm1pdF9sYWcubm5fNSA9IHBlcm1pdF8yMi5ubl81LA0KICAgIHByb3BlcnR5X3ZhbHVlID0gaW5mbGF0aW9uMjINCiAgKQ0KDQojd3JpdGUuY3N2KHByZWRpY3RfZGF0YSwgInByZWRpY3RfZGF0YS5jc3YiKQ0KYGBgDQoNCmBgYHtyIGRmX25vX2lkLCBlY2hvPUZBTFNFLCBmaWcuc2hvdz0naG9sZCcsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQpkZl9ub19pZCA8LSBkcGx5cjo6c2VsZWN0KHByZWRpY3RfZGF0YSwgLUdsb2JhbElEKQ0KDQojIFN0YW5kYXJkaXplIGFsbCBjb2x1bW5zIGluIHRoZSBwcmVkaWN0IGRhdGENCnNjYWxlZF9wcmVkX2RmIDwtIHNjYWxlKGRmX25vX2lkKQ0KYGBgDQoNCmBgYHtyIHByZWRpY3QsIGVjaG89RkFMU0UsIGZpZy5zaG93PSdob2xkJywgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCnJmX3ByZWRpY3Rpb25zIDwtIHByZWRpY3QoZmluYWxfZml0LCBuZXdfZGF0YSA9IHNjYWxlZF9wcmVkX2RmLCB0eXBlID0gInByb2IiKQ0KcHJlZGljdGlvbnNfcmVzdWx0IDwtIGFzLmRhdGEuZnJhbWUocmZfcHJlZGljdGlvbnMpDQpgYGANCg0KYGBge3IgcHJlZGljdF9kYXRhfQ0KcmVzdWx0X2RhdGEgPC0gcHJlZGljdF9kYXRhDQpyZXN1bHRfZGF0YSQiRHZwdF9Qcm9iIiA8LSBwcmVkaWN0aW9uc19yZXN1bHQkYDFgDQpgYGANCg0KYGBge3IgcGFyY2VsaWQsIGVjaG89RkFMU0UsIGZpZy5zaG93PSdob2xkJywgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCnBhcmNlbGlkIDwtIHBhcmNlbCU+JWRwbHlyOjpzZWxlY3QoIkdsb2JhbElEIiwgIlBBUkNFTElEIiwiZ2VvbWV0cnkiKQ0KYGBgDQoNCmBgYHtyIGNvbnZlcnRfYWNyZSwgZWNobz1GQUxTRSwgZmlnLnNob3c9J2hvbGQnLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KIyBDb252ZXJ0IHRoZSAnYXJlYScgY29sdW1uIHVuaXQgdG8gYWNyZQ0KcmVzdWx0X2RhdGEkYXJlYV9hY3JlIDwtIHJlc3VsdF9kYXRhJGFyZWEgLyA0MzU2MA0KYGBgDQoNCmBgYHtyIG1lcmdlLCBlY2hvPUZBTFNFLCBmaWcuc2hvdz0naG9sZCcsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQptZXJnZWQgPC0gbWVyZ2UocmVzdWx0X2RhdGEsIHBhcmNlbGlkLCBieSA9ICJHbG9iYWxJRCIsIGFsbC54ID0gVFJVRSkNCmBgYA0KDQpgYGB7ciBnZW9qc29uX3dyaXRlLCBlY2hvPUZBTFNFLCBmaWcuc2hvdz0naG9sZCcsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQojIHN0X3dyaXRlKG1lcmdlZCwgInByZWRpY3Rpb25fMDQyMi5nZW9qc29uIiwgZHJpdmVyID0gIkdlb0pTT04iKQ0KYGBgDQoNCmBgYHtyIG1lcmdlX2xvYWQsIGVjaG89RkFMU0UsIGZpZy5zaG93PSdob2xkJywgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCiMgQ29udmVydCAnbWVyZ2VkX2RhdGEnIHRvIGFuIHNmIG9iamVjdA0KbWVyZ2VkX2RhdGFfc2YgPC0gc3RfcmVhZCgiaHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tL0phcnJlZEVSYW5kYWxsL011c2FfODAxX1dhdGF1Z2EvbWFpbi9Nb2RlbGluZy8wNDIyTW9kZWxpbmcvcHJlZGljdGlvbl8wNDIyLmdlb2pzb24iKQ0KYGBgDQoNCmBgYHtyIHBsb3RfcHJlZGljdGlvbiwgZWNobz1GQUxTRSwgZmlnLnNob3c9J2hvbGQnLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KI2luc3RhbGwucGFja2FnZXMoInNjYWxlcyIpDQpsaWJyYXJ5KHNjYWxlcykNCg0KcGxvdF9kdnB0X3Byb2IgPC0gZ2dwbG90KCkgKw0KICBnZW9tX3NmKGRhdGEgPSBtZXJnZWRfZGF0YV9zZiwgYWVzKGZpbGw9RHZwdF9Qcm9iKSwgY29sb3VyPU5BKSArDQogIHNjYWxlX2ZpbGxfZ3JhZGllbnRuKGNvbG9ycz1jKCJncmV5IiwgImxpZ2h0Z3JleSIsICJvcmFuZ2UiLCAicmVkIiksDQogICAgICAgICAgICAgICAgICAgICAgIHZhbHVlcz1yZXNjYWxlKGMoMCwgMC40LCAwLjYsIDEpKSwNCiAgICAgICAgICAgICAgICAgICAgICAgbmFtZT0iRGV2ZWxvcG1lbnQgUHJvYmFiaWxpdHkiKSArDQogIGxhYnModGl0bGU9IkRldmVsb3BtZW50IFByb2JhYmlsaXR5IG9mIFBhcmNlbHMiKSArDQogIHRoZW1lKA0KICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUsIGZhY2UgPSAiYm9sZCIsIHNpemUgPSAxMikgICMgQ2VudGVyIGFuZCBib2xkIHRoZSB0aXRsZQ0KICApDQpwbG90X2R2cHRfcHJvYg0KDQpnZ3NhdmUoInBsb3RfZHZwdF9wcm9iLmpwZyIsIHBsb3QgPSBwbG90X2R2cHRfcHJvYiwgd2lkdGggPSAyMCwgaGVpZ2h0ID0gMTYsIHVuaXRzID0gImluIiwgZHBpID0gMzAwKQ0KDQpuYW1lcyhtZXJnZWRfZGF0YV9zZikNCmBgYA0KDQpgYGB7ciBwbG90X2FzX3BvaW50LCBlY2hvPUZBTFNFLCBmaWcuc2hvdz0naG9sZCcsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQojIEFzc3VtaW5nIHlvdXIgc2Ygb2JqZWN0IGlzIG5hbWVkICdwYXJjZWxfZGF0YScNCnBhcmNlbF9jZW50cm9pZCA8LSBtZXJnZWRfZGF0YV9zZg0KcGFyY2VsX2NlbnRyb2lkJGdlb21ldHJ5IDwtIHN0X2NlbnRyb2lkKHBhcmNlbF9jZW50cm9pZCRnZW9tZXRyeSkNCmBgYA0KDQpgYGB7ciBoaWdoX3Byb2JfcGFyY2VsLCAsIGVjaG89RkFMU0UsIGZpZy5zaG93PSdob2xkJywgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCiMgRmlsdGVyIFBhcmNlbHMgV2l0aCBEdnB0X1Byb2IgR3JlYXRlciBUaGFuIDAuNQ0KaGlnaF9wcm9iX3BhcmNlbHMgPC0gcGFyY2VsX2NlbnRyb2lkICU+JQ0KICBmaWx0ZXIoRHZwdF9Qcm9iID4gMC42KQ0KYGBgDQoNCkJlbG93IGFyZSB0aGUgcHJlZGljdGlvbiByZXN1bHRzLiBUaGVyZSBpcyBhIGhpZ2hlciBkZW5zaXR5IG9mIGRldmVsb3BtZW50IGluIEJvb25lLCB0aGUgbGFyZ2VzdCBjaXR5IGluIFdhdGF1Z2EgQ291bnR5LCB3aGljaCBhbGlnbnMgd2l0aCBpdHMgZnV0dXJlIHVyYmFuIGV4cGFuc2lvbi4NCg0KYGBge3IgcGxvdF9wcmVkaWN0LCBlY2hvPUZBTFNFLCBmaWcuc2hvdz0naG9sZCcsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQpwbG90X3ByZWRpY3QgPC0gZ2dwbG90KGRhdGEgPSBwYXJjZWwpICsNCiAgZ2VvbV9zZihhZXMoZ2VvbWV0cnkgPSBnZW9tZXRyeSksIGNvbG9yID0gImxpZ2h0Z3JleSIsIHNpemUgPSAwLjEsIGZpbGwgPSBOQSkgKyAgDQogIGdlb21fc2YoZGF0YSA9IGhpZ2hfcHJvYl9wYXJjZWxzLCBhZXMoZ2VvbWV0cnkgPSBnZW9tZXRyeSwgY29sb3IgPSBEdnB0X1Byb2IpLCBzaXplID0gMikgKyAgDQogIHNjYWxlX2NvbG9yX2dyYWRpZW50bihjb2xvcnMgPSBjKCIjNzRjMWI5IiwgIiM5YWQ3ZDIiLCAiI2ZjZDk3NyIsICIjZjliZjNlIiwgIiNlMmEzMzQiKSkgKyAgDQogIGxhYnModGl0bGUgPSAiU3VpdGFibGUgUGxhY2VzIGZvciBEZXZlbG9wbWVudCBpbiAyMDI3IChQPjYwJSkiLA0KICAgICAgIGNvbG9yID0gIkRldmVsb3BtZW50IFByb2JhYmlsaXR5IikgKw0KICB0aGVtZV92b2lkKCkgKw0KICB0aGVtZSgNCiAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41LCBmYWNlID0gImJvbGQiLCBzaXplID0gMTIpICAjIENlbnRlciBhbmQgYm9sZCB0aGUgdGl0bGUNCiAgKQ0KDQpwcmludChwbG90X3ByZWRpY3QpDQoNCmdnc2F2ZSgicGxvdF9kdnB0X3Byb2JfcG9pbnQuanBnIiwgcGxvdCA9IHBsb3RfcHJlZGljdCwgd2lkdGggPSAxMCwgaGVpZ2h0ID0gOCwgdW5pdHMgPSAiaW4iLCBkcGkgPSAzMDApDQpgYGANCg0KIyMjIE92ZXJsYXBwaW5nIHdpdGggdGhlIDIwMTcgYW5kIDIwMjIgUGVybWl0IERhdGENCg0KQWZ0ZXIgb3ZlcmxhcHBpbmcgdGhlIGV4aXN0aW5nIHByZWRpY3Rpb25zIGJldHdlZW4geWVhcnMsIHdlIGNhbiBrbm93IGluIHRoZSBmdXR1cmUsIHRoZSB1cmJhbiBleHBhbnNpb24gc2VlbXMgdG8gYmUgbW9yZSBjb25jZW50cmF0ZWQgaW4gdGhlIGNlbnRlciBvZiBXYXRhdWdhIENvdW50eS4NCg0KYGBge3IgdHJhbnNmZXJfY3JzLCBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KIyB0cmFuc2ZlciB0aGUgY3JzIG9mIHBlcm1pdF8xNyBhbmQgcGVybWl0XzIyIHRvIHRoZSBzYW1lIGNvb3JkaW5hdGUgc3lzdGVtIGFzIGJvdW5kYXJ5IGFuZCBwYXJjZWwNCnBlcm1pdF8xNyA8LSBzdF90cmFuc2Zvcm0ocGVybWl0XzE3LCBzdF9jcnMocGFyY2VsKSkNCnBlcm1pdF8yMiA8LSBzdF90cmFuc2Zvcm0ocGVybWl0XzIyLCBzdF9jcnMocGFyY2VsKSkNCmBgYA0KDQpgYGB7ciBwbG90X292ZXJsYXAsIGVjaG89RkFMU0UsIGZpZy5zaG93PSdob2xkJywgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCnBsb3Rfb3ZlcmxhcCA8LSBnZ3Bsb3QoZGF0YSA9IHBhcmNlbCkgKw0KICBnZW9tX3NmKGFlcyhnZW9tZXRyeSA9IGdlb21ldHJ5KSwgY29sb3IgPSAibGlnaHRncmV5Iiwgc2l6ZSA9IDAuMSwgZmlsbCA9IE5BKSArICANCiAgZ2VvbV9zZihkYXRhID0gcGVybWl0XzE3LCBjb2xvciA9ICJkYXJrYmx1ZSIsIHNpemUgPSAxLCBhbHBoYSA9IDAuNCkgKw0KICBnZW9tX3NmKGRhdGEgPSBwZXJtaXRfMjIsIGNvbG9yID0gImRhcmtyZWQiLCBzaXplID0gMSwgYWxwaGEgPSAwLjQpICsNCiAgZ2VvbV9zZihkYXRhID0gaGlnaF9wcm9iX3BhcmNlbHMsIGFlcyhnZW9tZXRyeSA9IGdlb21ldHJ5LCBjb2xvciA9IER2cHRfUHJvYiksIHNpemUgPSAyLCBhbHBoYT0wLjgpICsgIA0KICBzY2FsZV9jb2xvcl9ncmFkaWVudG4oY29sb3JzID0gYygiIzc0YzFiOSIsICIjOWFkN2QyIiwgIiNmY2Q5NzciLCAiI2Y5YmYzZSIsICIjZTJhMzM0IikpICsgIA0KICBsYWJzKHRpdGxlID0gIlN1aXRhYmxlIFBsYWNlcyBmb3IgRGV2ZWxvcG1lbnQgaW4gMjAyNyAoUD42MCUpIiwNCiAgICAgICBjb2xvciA9ICJEZXZlbG9wbWVudCBQcm9iYWJpbGl0eSIpICsNCiAgdGhlbWVfdm9pZCgpICsNCiAgdGhlbWUoDQogICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSwgZmFjZSA9ICJib2xkIiwgc2l6ZSA9IDEyKSAgIyBDZW50ZXIgYW5kIGJvbGQgdGhlIHRpdGxlDQogICkNCg0KcHJpbnQocGxvdF9vdmVybGFwKQ0KDQojZ2dzYXZlKCJwbG90X292ZXJsYXAuanBnIiwgcGxvdCA9IHBsb3Rfb3ZlcmxhcCwgd2lkdGggPSAxMCwgaGVpZ2h0ID0gOCwgdW5pdHMgPSAiaW4iLCBkcGkgPSAzMDApDQpgYGANCg0KYGBge3IgZmlsdGVyLCBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KIyBDb252ZXJ0ICdtZXJnZWRfZGF0YV9zZicgZnJvbSBhbiBzZiBvYmplY3QgdG8gYSByZWd1bGFyIGRhdGFmcmFtZSBmb3Igam9pbmluZw0KZmlsdGVyX2RmIDwtIGFzLmRhdGEuZnJhbWUobWVyZ2VkX2RhdGFfc2YpDQoNCiMgQXNzdW1pbmcgJ2ZpbHRlcl9kZicgY29udGFpbnMgc29tZSBvZiB0aGUgc2FtZSBjb2x1bW5zIGFzICdwYXJjZWwnIHBsdXMgc29tZSBuZXcgb25lcw0KIyBJZGVudGlmeSBjb2x1bW5zIGluICdmaWx0ZXJfZGYnIG5vdCBwcmVzZW50IGluICdwYXJjZWwnDQpuZXdfY29sdW1ucyA8LSBzZXRkaWZmKG5hbWVzKGZpbHRlcl9kZiksIG5hbWVzKHBhcmNlbCkpDQoNCiMgQ29sdW1ucyB0byBrZWVwIGZyb20gJ2ZpbHRlcl9kZicgKG5ldyBjb2x1bW5zIHBsdXMgJ0dsb2JhbElEJykNCmNvbHVtbnNfdG9fa2VlcCA8LSBjKCJHbG9iYWxJRCIsIG5ld19jb2x1bW5zKQ0KDQojIFNlbGVjdGluZyBvbmx5IHRoZSBuZWNlc3NhcnkgY29sdW1ucyBmcm9tICdmaWx0ZXJfZGYnIGJlZm9yZSB0aGUgam9pbg0KZmlsdGVyX2RmX3NlbGVjdGVkIDwtIGRwbHlyOjpzZWxlY3QoZmlsdGVyX2RmLCBhbGxfb2YoY29sdW1uc190b19rZWVwKSkNCg0KIyBKb2luaW5nICdwYXJjZWwnIHdpdGggdGhlIHNlbGVjdGVkIGNvbHVtbnMgZnJvbSAnZmlsdGVyX2RmJw0KZnVsbF9kZiA8LSBsZWZ0X2pvaW4ocGFyY2VsLCBmaWx0ZXJfZGZfc2VsZWN0ZWQsIGJ5ID0gIkdsb2JhbElEIikNCg0KI3dyaXRlLmNzdihmdWxsX2RmLCAiZnVsbF9kZi5jc3YiKQ0KYGBgDQoNCmBgYHtyIGZ1bGxfZGZfYWRkMmNvbCwgZWNobz1GQUxTRSwgZmlnLnNob3c9J2hvbGQnLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KIyBBZGQgJ3VuZGV2ZWxvcGFibGUnIGFuZCAnZGV2ZWxvcGVkJyBjb2x1bW5zIHRvICdmdWxsX2RmJw0KZnVsbF9kZl9hZGRfMl9jb2wgPC0gZnVsbF9kZiAlPiUNCiAgbXV0YXRlKA0KICAgICMgQ3JlYXRpbmcgJ3VuZGV2ZWxvcGFibGUnIGNvbHVtbg0KICAgIHVuZGV2ZWxvcGFibGUgPSBjYXNlX3doZW4oDQogICAgICAhaXMubmEoRHZwdF9Qcm9iKSB+IDAsICAgICAgICAgICAgIyBJZiAnRHZwdF9Qcm9iJyBpcyBub3QgTkEsIHNldCB2YWx1ZSB0byAwDQogICAgICBpcy5uYShEdnB0X1Byb2IpICYgU2xvcGVfQXZlIDw9IDE5IH4gMCwgICMgSWYgJ0R2cHRfUHJvYicgaXMgTkEgYW5kICdTbG9wZV9BdmUnIDw9IDE5LCBzZXQgdmFsdWUgdG8gMA0KICAgICAgVFJVRSB+IDEgICAgICAgICAgICAgICAgICAgICAgICAgICMgT3RoZXJ3aXNlLCBzZXQgdmFsdWUgdG8gMQ0KICAgICksDQoNCiAgICAjIENyZWF0aW5nICdkZXZlbG9wZWQnIGNvbHVtbg0KICAgIGRldmVsb3BlZCA9IGNhc2Vfd2hlbigNCiAgICAgICFpcy5uYShEdnB0X1Byb2IpIH4gMCwgICAgICAgICAgICAjIElmICdEdnB0X1Byb2InIGlzIG5vdCBOQSwgc2V0IHZhbHVlIHRvIDANCiAgICAgIGlzLm5hKER2cHRfUHJvYikgJiBZUkJVSUxUIDw9IDAgfiAwLCAgIyBJZiAnRHZwdF9Qcm9iJyBpcyBOQSBhbmQgJ1lSQlVJTFQnIDw9IDAsIHNldCB2YWx1ZSB0byAwDQogICAgICBUUlVFIH4gMSAgICAgICAgICAgICAgICAgICAgICAgICAgIyBPdGhlcndpc2UsIHNldCB2YWx1ZSB0byAxDQogICAgKQ0KICApDQoNCiN3cml0ZS5jc3YoZnVsbF9kZl9hZGRfMl9jb2wsICJmdWxsX2RmX2FkZF8yX2NvbC5jc3YiKQ0KYGBgDQoNCmBgYHtyIGRmX3NlbGVjdGlvbiwgZWNobz1GQUxTRSwgZmlnLnNob3c9J2hvbGQnLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KIyBPbmx5IGtlZXAgY29sdW1ucyAnRHZwdF9Qcm9iJywgJ3Blcm1pdF9sYWcnLCAnU2xvcGVfQXZlJywgJ1Nsb3BlX01heCcsICdEaXN0X1JvYWQnLCAncHJvcGVydHlfdmFsdWUnLCAnYXJlYV9hY3JlJywgJ1BBUkNFTElEJywgJ2dlb21ldHJ5JywgJ3VuZGV2ZWxvcGFibGUnLCAnZGV2ZWxvcGVkJw0KZnVsbF9kZl9zZWxlY3RlZCA8LSBmdWxsX2RmX2FkZF8yX2NvbCAlPiUNCiAgZHBseXI6OnNlbGVjdChHbG9iYWxJRCwgRHZwdF9Qcm9iLCBQQVJDRUxJRCwgdW5kZXZlbG9wYWJsZSwgZGV2ZWxvcGVkLCBnZW9tZXRyeSkNCmBgYA0KDQpgYGB7ciBmaWxsbmEsIGVjaG89RkFMU0UsIGZpZy5zaG93PSdob2xkJywgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCiMgRmlsbCB0aGUgTkEgdmFsdWVzIGluICdEdnB0X1Byb2InIHdpdGggMA0KZnVsbF9kZl9zZWxlY3RlZCREdnB0X1Byb2JbaXMubmEoZnVsbF9kZl9zZWxlY3RlZCREdnB0X1Byb2IpXSA8LSAwDQpgYGANCg0KYGBge3Igb3JpZ2luYWxfc2VsZWN0LCBlY2hvPUZBTFNFLCBmaWcuc2hvdz0naG9sZCcsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQojIEkgd2FudCB0aGUgY29sdW1uczogcGVybWl0XzIyKG5hbWUgaXQgYXMgJ3Blcm1pdF9sYWcnIGFmdGVyIGpvaW4pLCBTbG9wZV9BdmUsIFNsb3BlX01heCwgRGlzdF9Sb2FkLCBhcmVhIGZyb20gdGhlICdkZl9vcmlnaW5hbCcgdG8gam9pbiBpdCBiYWNrIHRvICdmdWxsX2RmX3NlbGVjdGVkJyBieSAnR2xvYmFsSUQnDQoNCiMgU2VsZWN0IGFuZCByZW5hbWUgdGhlIGNvbHVtbnMgaW4gJ2RmX29yaWdpbmFsJw0KZGZfb3JpZ2luYWxfc2VsZWN0ZWQgPC0gZGZfb3JpZ2luYWwgJT4lDQogIGRwbHlyOjpzZWxlY3QoR2xvYmFsSUQsIHBlcm1pdF8yMiwgU2xvcGVfQXZlLCBTbG9wZV9NYXgsIERpc3RfUm9hZCwgYXJlYSkgJT4lDQogIHJlbmFtZShwZXJtaXRfbGFnID0gcGVybWl0XzIyKQ0KDQojIEpvaW5pbmcgJ2Z1bGxfZGZfc2VsZWN0ZWQnIHdpdGggdGhlIG1vZGlmaWVkICdkZl9vcmlnaW5hbCcNCmZ1bGxfZGZfZmluYWxfMSA8LSBsZWZ0X2pvaW4oZnVsbF9kZl9zZWxlY3RlZCwgZGZfb3JpZ2luYWxfc2VsZWN0ZWQsIGJ5ID0gIkdsb2JhbElEIikNCmBgYA0KDQpgYGB7ciBjb252ZXJ0X2FyZWFfdG9udW1lcmNpLCBlY2hvPUZBTFNFLCBmaWcuc2hvdz0naG9sZCcsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQojIENvbnZlcnQgdGhlICdhcmVhJyBjb2x1bW4gdG8gbnVtZXJpYw0KZnVsbF9kZl9maW5hbF8xJGFyZWEgPC0gYXMubnVtZXJpYyhmdWxsX2RmX2ZpbmFsXzEkYXJlYSkNCg0KIyBDb252ZXJ0IHRoZSAnYXJlYScgY29sdW1uIHVuaXQgdG8gYWNyZQ0KZnVsbF9kZl9maW5hbF8xJGFyZWFfYWNyZSA8LSBmdWxsX2RmX2ZpbmFsXzEkYXJlYSAvIDQzNTYwDQoNCiMgVGhlbiBkcm9wIHRoZSBjb2x1bW4gJ2FyZWEnDQpmdWxsX2RmX2ZpbmFsXzIgPC0gZnVsbF9kZl9maW5hbF8xICU+JQ0KICBkcGx5cjo6c2VsZWN0KC1hcmVhKQ0KYGBgDQoNCmBgYHtyIGpvaW5faW5mYWxhdGlvbiwgZWNobz1GQUxTRSwgZmlnLnNob3c9J2hvbGQnLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KIyBKb2luIHRoZSAnaW5mbGF0aW9uMjInIGNvbHVtbiBmcm9tIGRhdGFmcmFtZSAnaW5mbGF0aW9uJyBhcyAncHJvcGVydHlfdmFsdWUnIHRvICdmdWxsX2RmX2ZpbmFsXzInIGJ5IEdsb2JhbElEDQojIFNlbGVjdGluZyBhbmQgcmVuYW1pbmcgdGhlIGNvbHVtbiBpbiAnaW5mbGF0aW9uJw0KaW5mbGF0aW9uX3NlbGVjdGVkIDwtIGluZmxhdGlvbiAlPiUNCiAgZHBseXI6OnNlbGVjdChHbG9iYWxJRCwgaW5mbGF0aW9uMjIpICU+JQ0KICByZW5hbWUocHJvcGVydHlfdmFsdWUgPSBpbmZsYXRpb24yMikNCg0KIyBKb2luaW5nICdmdWxsX2RmX2ZpbmFsXzInIHdpdGggdGhlIG1vZGlmaWVkICdpbmZsYXRpb24nIGRhdGFmcmFtZQ0KZnVsbF9kZl9maW5hbF8zIDwtIGxlZnRfam9pbihmdWxsX2RmX2ZpbmFsXzIsIGluZmxhdGlvbl9zZWxlY3RlZCwgYnkgPSAiR2xvYmFsSUQiKQ0KYGBgDQoNCmBgYHtyIGZpbmFsX2RmX3dyaXRlLCBlY2hvPUZBTFNFLCBmaWcuc2hvdz0naG9sZCcsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQojIFdyaXRlIHRoZSBmaW5hbCBkYXRhZnJhbWUgdG8gYSBnZW9qc29uIGZpbGUNCiNzZjo6c3Rfd3JpdGUoZnVsbF9kZl9maW5hbF8zLCAicHJlZGljdGlvbl9maW5hbC5nZW9qc29uIikNCmBgYA0KDQojIDUuIEFwcGxpY2F0aW9uIERldmVsb3BtZW50DQoNCioqQXBwIExpbms6IDxodHRwczovL3NldWhhLmdpdGh1Yi5pby93YXRhdWdhLWFwcC8+KioNCg0KIyMgNS4xIFVzZXJzJyBXb3JrZmxvdw0KDQohW10oaHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tL0phcnJlZEVSYW5kYWxsL011c2FfODAxX1dhdGF1Z2EvbWFpbi9EZWxpdmVyYWJsZS9GSU5BTC93b3JrZmxvdy5qcGcpDQoNCiMjIDUuMiBBcHAgTWFudWFsDQoNCiFbXShodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vSmFycmVkRVJhbmRhbGwvTXVzYV84MDFfV2F0YXVnYS9tYWluL0RlbGl2ZXJhYmxlL0ZJTkFML2FwcF9zY3JlZW5zaG90LnBuZykNCg0KIyMjIExlZnQgUGFuZWwNCg0KVGhlIGxlZnQgcGFuZWwgY29udGFpbnMgYSBzZWFyY2ggYmFyIHdoZXJlIHVzZXJzIGNhbiBzZWFyY2ggZm9yIGEgc3BlY2lmaWMgcGFyY2VsIGJ5IGVudGVyaW5nIHRoZSBwYXJjZWwgSUQuIFRoZSBzZWFyY2ggYmFyIHdpbGwgYXV0b21hdGljYWxseSB6b29tIHRvIHRoZSBzZWxlY3RlZCBwYXJjZWwgb24gdGhlIG1hcC4NCg0KQW5kIHRoZSAzIGZpbHRlcnMgYmVsb3cgdGhlIHNlYXJjaCBiYXIgYWxsb3cgdXNlcnMgdG8gZmlsdGVyIHBhcmNlbHMgYmFzZWQgb24gdGhlIGZvbGxvd2luZyBjcml0ZXJpYToNCg0KLSAgICoqU2l6ZSBvZiBQYXJjZWwqKjogRmlsdGVyIHBhcmNlbHMgYmFzZWQgb24gdGhlIHNpemUgb2YgdGhlIHBhcmNlbCwgd2hpY2ggd2lsbCBpbmZlY3QgdGhlIGhvdXNpbmcgdHlwZSBjb3VsZCBiZSBidWlsdCBvbiB0aGUgcGFyY2VsLg0KDQotICAgKipTbG9wZSBUaHJlc2hvbGQqKjogRmlsdGVyIHBhcmNlbHMgYmFzZWQgb24gdGhlIG1heGltdW0gc2xvcGUgZGVncmVlLg0KDQotICAgKipWYWx1ZSBvZiBQYXJjZWwqKjogRmlsdGVyIHBhcmNlbHMgYmFzZWQgb24gdGhlIHByb3BlcnR5IHZhbHVlIG9mIHRoZSBwYXJjZWwuDQoNCldoZW4gZW50ZXJpbmcgdGhlIHZhbHVlIGluIHRoZSBmaWx0ZXIsIHRoZSBtYXAgd2lsbCBhdXRvbWF0aWNhbGx5IHVwZGF0ZSBhbmQgc2hvdyB0aGUgcGFyY2VscyB0aGF0IG1lZXQgdGhlIGNyaXRlcmlhLg0KDQpUaGUgYm90dG9tIGxlZnQgbGlzdCBzaG93cyB0aGUgdG9wIDEwIHBhcmNlbHMgd2l0aCB0aGUgaGlnaGVzdCBkZXZlbG9wbWVudCBwcm9iYWJpbGl0eS4gQW5kIGlmIHRoZSB1c2VyIGNsaWNrcyBvbiB0aGUgcGFyY2VsIGxpc3RlZCBpbiB0aGUgYm94LCB0aGUgbWFwIHdpbGwgYXV0b21hdGljYWxseSB6b29tIHRvIHRoZSBzZWxlY3RlZCBwYXJjZWwuDQoNCiMjIyBMYXllcnMgUGFuZWwNCg0KVGhlIGxheWVycyBwYW5lbCBwcm92aWRlcyAzIG9wdGlvbnMgZm9yIHRoZSB1c2VycyB0byBjaG9vc2UgZnJvbToNCg0KLSAgICoqUGFyY2VsIFZpZXcqKjogQSBwcmV2aWV3IHRvIHNob3cgYWxsIHBhcmNlbHMgaW4gdGhlIG1hcC4NCg0KLSAgICoqRGV2ZWxvcG1lbnQgUHJvYmFiaWxpdHkqKjogU2hvd2luZyB0aGUgZGV2ZWxvcG1lbnQgcHJvYmFiaWxpdHkgYnkgY29sb3IgZ3JhZGllbnQsIHRoZSBkZWVwZXIgY29sb3IgbWVhbnMgYSBoaWdoZXIgcHJvYmFiaWxpdHkgb2YgZGV2ZWxvcG1lbnQuDQoNCi0gICAqKkRpc3RhbmNlIHRvIFJvYWRzKio6IFNob3dpbmcgdGhlIGRpc3RhbmNlIHRvIHRoZSBuZWFyZXN0IG1haW4gcm9hZHMgYnkgY29sb3Igc2NoZW1lLg0KDQojIyMgUG9wLXVwIEluZm8gQm94DQoNCldoZW4gY2xpY2tpbmcgb24gYSBwYXJjZWwsIGEgcG9wLXVwIGluZm8gYm94IHdpbGwgc2hvdyB1cCBhbmQgcHJvdmlkZSB0aGUgZm9sbG93aW5nIGluZm9ybWF0aW9uOiBQYXJjZWwgSUQsIEFyZWEoQWNyZSksIFNsb3BlIEF2ZXJhZ2UgKMKwKSwgU2xvcGUgTWF4aW11bSAowrApLCBEaXN0YW5jZSB0byBSb2FkIChmdCksIERldmVsb3BtZW50IFByb2JhYmlsaXR5LCBVbmRldmVsb3BhYmxlIChcPDM1wrApIFtZZXMvTm9dLCBBbHJlYWR5IERldmVsb3BlZCBbWWVzL05vXS4NCg==