Food Security Cluster Myanmar homepage



Introduction

This document is the first of two on prioritisation and is focused on geographic prioritisation. The second will focus on establishing a beneficiary profile. This first document makes use of data from the Armed Conflict Location and Event Dataset (ACLED) and the Myanmar Information Management Unit (MIMU) to develop a conflict score, examine pre-existing vulnerability and map flood risk at the township level. This document is closed with a section of technical notes.


References for this report




1. Conflict and pre-existing vulnerability

Myanmar had the most conflict events out of any country in 2021, exceeding Syria, Yemen and Afghanistan.

The table below highlights the fourteenfold increase in conflict events and thirteenfold increase in conflict fatalities in Myanmar in 2021 compared to the average for the prior decade.


Increase in conflict events and fatalities compared to previous decade
years total_events avg_events_per_year total_fatalities avg_fatalities_per_year
2010-2020 8,510 774 9,451 859
2021 10,961 10,961 11,012 11,012
2022 5,873 5,873 9,383 9,383
Data source: ACLED; accleddata.com. Data for 2022 is until 2022-05-31.


Given the more than fourteenfold increase in conflict events and thirteenfold increase in conflict fatalities in Myanmar in 2021 (compared to the average for the preceding 10 years), conflict will be major part of determining which areas have the greatest humanitarian needs. However, scoring townships based only on one variable would lead to a very uni-dimensional understanding of the crisis.

Similar to how a beneficiary profile was established in order to inform beneficiary selection, this section, will focus on what variables should be considered when prioritising amongst the various geographic areas in Myanmar and how the results of such a prioritisation should be applied. As with earlier sections, the analysis here is meant to describe and inform programmatic and operational decision making, as opposed to dictating it, as each partner will have their own considerations and limitations.

The plot below shows the cumulative number of conflict events, broken down by the 9 most common sub-event types.



This plot below breaks down fatalities over time by sub-event type.



And the ratio of peaceful protests versus non-peaceful incidents over time. Whilst peaceful protests are far from their peak in Februrary 2021 of 1582 events or 85% of the monthly total, as of May 2022, they still remained at 12% of all conflict events or 149 events.



For a more comprehensive review of conflict in Myanmar, please refer to the Food Security Cluster’s report Understanding Conflict Dynamics in Myanmar through Conflict and Incident Data: A Food Security Perspective. And for a more comprehensive review of multidimensional vulnerabilty in Myanmar, please refer to MIMU-HARP’s Vulnerability Study.



1.1 Conflict events and fatalities by state/region


Starting at the state/region level, Sagaing saw the highest number of conflict events as well as conflict as well as conflict-related fatalities in 2012. It experienced more than three times as many conflict-related fatalities than the next-highest state/region – Magway. This is a significant shift in the pattern of conflict in Myanmar, which has traditionally revolved around Kachin, Rakhine and Shan.

Kayah, Chin and Sagaing had the highest number of conflict fatalities per capita in 2021.




1.2 Conflict score by township

As can be seem from the state/region barplots in the previous section, the distribution of conflict events and fatalities is not even, and is skewed towards a few states/regions. This is also evident at township level. In the scatter plot below, the averages of the number of conflict events and the number of fatalities at the township level have been marked by the dotted red lines, dividing the plot into four quadrants.

To better discriminate amongst the numerous townships, a conflict score has been developed. A requisite for any prioritisation score or index for conflict should be the ability to distinguish, first and foremost, the townships in the upper right quadrant of the plot, which have the heaviest concentrations of conflict events and fatalities. These areas are also where, as we have established in the section on beneficiary selection, where the highest concentrations of households in the priority group will be found. For reference, 58 townships have both above-average numbers of conflict events and fatalities (upper-right quadrant) and 196 townships have both below-average numbers of conflict events and fatalities (bottom-left quadrant).



At its most basic, the conflict score is just the average of battles, explosions, remote violence, violence against civilians, strategic developments, non-peaceful protests and riots, conflict-related fatalities and IDPs (refer to section 4.5 for more details). Additional information can also be found in the FSC’s report Understanding Conflict Dynamics in Myanmar through Conflict and Incident Data: A Food Security Perspective. This score will be now be used as a shorthand for conflict incidence in Myanmar going forward.



1.3 Comparison with multidimensional vulnerability

Conflict, in spite of its out-sized role in the crisis in Myanmar, cannot serve as the only determinant of geographic prioritisation. In order to consider other factors, this document will make use of the MIMU-HARP Vulnerability Index, which is comprised of 8 indicators, selected for their ability to predict the rest of the variables in the 2014 Census dataset. Several of these variables were also collected at district-level and were used to create an updated 2019 Vulnerability index.

The specific indicators chosen were:

  • % of population without formal identification documents
  • % of population without a middle school education
  • % of females who were illiterate
  • % of households with bamboo or thatched roofs
  • % of households with safe sanitation
  • % of households with access to electricity
  • % of workers who are unpaid family workers
  • The child dependency ratio
  • The conflict score (refer to previous section)

These indicators were combined to construct a township-level vulnerability index. Of the indicators above, only the percentage of the population without a middle-school education and percentage of the population without formal identification documents were not collected in the 2019 Inter-Censal survey.

For the remaining indicators, they were bootstrapped using their 2014 township values and the 2019 district-level data. Going forward, the first seven components of the index will be extracted and treated separately as a shorthand for pre-existing multidimensional vulnerability in Myanmar.

However, the eighth component of the vulnerability index, the conflict index, first constructed in 2014 from ACLED data, can and has been updated with more recent data – this was done in the previous section. The specific indicators used in the construction of the conflict score were:

  • Number of IDPs
  • Number of conflict fatalities
  • Number of Battles
  • Number of incidents of explosions and remote violence
  • Number of incidents of violence against civilians
  • Number of strategic developments (includes arrests)
  • Number of non-peaceful protests and riots

For more information, please refer the technical notes at the end of the document.

This next few sections will examine the relationship between underdevelopment and the updated 2021 conflict score and the resulting implications on geographic prioritisation for the Food Security Cluster.

From the scatter plot below, underdevelopment and pre-existing vulnerability and conflict are not good predictors of each other. The points in the plot below, each representing a township, split largely across two arcs – with townships with high conflict scores largely falling around the median for multidimensional vulnerability and townships with very high multidimensional vulnerability tending to have lower conflict scores.



This is a reflection of the shift in conflict away from frontier areas to cities and towns that have more strategic targets. The broader involvement of the Bamar majority in the conflict has likely also contributed to this shift – prior to the February 2021 coup, the conflict was largely between Ethnic Armed Organisations and the Myanmar Armed Forces. However, combatants are now spread throughout the populations, especially with the proliferation of the People’s Defence Forces.

It has been observed that Ethnic Armed Organisations, such as the Kachin Independence Army, are working closely with the People’s Defence Forces, and are training and arming them. This has contributed to the front being moved further forward, outside of the areas that had been traditionally most affected by conflict.



1.4 2014 vulnerability bands

This shift in conflict patterns can be further examined by considering the vulnerability bands developed by MIMU-HARP alongside its vulnerability index. In addition to an overall vulnerability score per township, 8 main typologies of vulnerability were also constructed to illustrate the wide variation of contexts and needs in the different parts of the country as well as to group together similar townships so that they may be considered as separate programming blocs. Please refer to the MIMU-HARP Vulnerability Study for more details.

According to MIMU-HARP, the result of this grouping is a “lens allowing the most vulnerable to be considered more methodically in policy and programme planning”. By using these 8 typologies as a reference, it is possible to understand how the pattern of conflict has changed between 2014 and 2021.


Changes in conflict patterns between 2015 and 2021, by vulnerabilty band
conflict score
townships above avg conflict score
vulnerability_band 2019_vulnerability 2015_score 2022_score tsp_count %_>avg_2015 %_>avg_2021
  1. Extreme outliers, underdevelopment and conflict
0.549 0.055 0.045 36 38.89 11.11
  1. Conflict-affected, poor human development
0.449 0.053 0.081 25 44.00 16.00
  1. Hubs in conflict-affected areas
0.370 0.033 0.215 21 19.05 47.62
  1. Very low access to services and infrastructure
0.403 0.003 0.112 74 4.05 25.68
  1. Agricultural areas with high profits
0.356 0.003 0.108 64 1.56 25.00
  1. Secondary cities/towns in agricultural areas
0.300 0.008 0.127 65 12.31 38.46
  1. Up-and-coming peri-urban and urban areas
0.228 0.000 0.120 11 0.00 27.27
  1. Affluent, urban core
0.123 0.001 0.156 34 2.94 58.82
Data source: ACLED (accleddata.com) and MIMU; higher scores indicate more vulnerability/conflict


Conflict, once much more concentrated in underdeveloped frontier areas in the operational areas of Ethnic Armed Organisations, is now much more pronounced in bands 3, 6 and 8, which contain major population centres and secondary cities and towns. Hubs in conflict-affected areas have the highest average 2021 conflict scores.

Although conflict has persisted or even increased in many of the frontier and remote areas such as Laukkaing, Mongyai and Tangyan (all from band 1), the relative rankings of these areas have changed and they now form a much smaller share of unionwide conflict than they did in 2015. These townships tend to have much lower conflict scores in spite of their high vulnerability, indicating that whilst they remain development priorities, they should fall outside the caseload for humanitarian action. It is recommended that new vulnerability bands be re-developed, as they have proved very useful; but that is outside the scope of this document.



1.5 Clustering townships

In recognition of the different contexts present in Myanmar (and the consequent need for different programming options), a simple K-means clustering was conducted on the townships to split them into prioritisation groups based on their 2021 conflict score, their 2019 vulnerability score and their population density.

This clustering separates all 330 townships into five groups. The plots below show the spread of townships by prioritisation group across the 2021 conflict score, 2019 vulnerability score and population density.



It can be seen that groups A1 and A2, which have the highest conflict scores, are quite distinct from group D (where the majority of the development caseload resides). Group C has neither high vulnerability nor high conflict incidence. And group B consists of solely urban centres. The table below provides more detail on each of the groups.

Groups A1 and A2 contained 60% of all conflict events and 83% of all conflict fatalities in 2021. Groups A1 and A2 can be distinguished from each other by the intensity of conflict, with A1 being where the concentrations of conflict events and fatalities are the heaviest.

An interactive version of the plot on the left can be found below.


Summary statistics by prioritisation group
group %_conflict_events %_fatalities avg_conflict_score vulnerability_2019 ppl_km2 townships %_total_population
A1 27.22 45.21 0.289 0.358 107 20 6.32
A2 33.22 37.79 0.138 0.349 133 49 17.76
B 11.95 3.39 0.087 0.122 19,326 33 12.12
C 23.90 11.51 0.024 0.340 213 172 51.65
D 3.70 2.09 0.016 0.551 64 56 12.15
Groups A1 and A2 have the highest conflict scores and should be prioritised over the others. Higher scores indicate more vulnerability/conflict.


Groups A1 and A2 both have middling vulnerability scores, but have much higher average conflict scores. Group A1, in particular, has a very high concentration of conflict incidents and fatalities, in addition to having the second-highest vulnerability scores of the groups. These 69 townships (containing about 24% of the population) are clear priorities for humanitarian action.




1.6 Villages affected by conflict

Townships are quite large – on average, each has a population of 161,913 persons.

As mentioned earlier, rural households were found to be less resilient and more asset-poor in IFPRI’s household welfare survey. These findings align well with the process the Food Security Cluster has developed here to identify priority households (where rural households are significantly more likely to fall into the priority group). It would be extremely fruitful to explore whether this alignment extends to conflict and some of the other environmental and socioeconomic variables that have been employed in this document.

It should also be noted that townships themselves are quite large – on average, each has a population of 161,913 persons. In areas where partners are not yet present, this might necessitate an intermediate step to help partners identify specific areas where they could begin working.

In the ACLED dataset, of the 10,961 events in 2021, 38% of them were recorded with specific village locations.


Conflict events with and without villages
mentions_vilage events %_events fatalities %_fatalities locations
yes 7,138 42.4 11,110 54.47 2,973
no 9,696 57.6 9,285 45.53 310
Data source: ACLED; accleddata.com


Below is an interactive reference table of the 1,917 villages identified in the ACLED dataset, complete with coordinates. While this list does provide an excellent start, by working in these areas, partners should also endeavour to identify the specific locations of the remaining 62% of conflict events.




1.7 5W results from the first half of 2022

As of the second quarter of 2022, Food Security Cluster partners have reached a total of 2,747,001 persons or 74% of the 2022 target. Below is an examination of the extent to which partners have targeted the townships most affected by conflict.

In the plot below, the number of beneficiaries reached, as of the second quarter of 2022, is plotted against the targeted population. Each point is a township and the red line down the middle represents reaching 100% of the target. How far above or below a township is indicates how far above or below the target it is. Additionally, the township prioritisation group each township belongs to is marked by the colour.

The townships on the far left of the plot have beneficiaries despite not having targets for 2022 (their targets have been nominally coded as 1 so they appear on the plot).



With reference to the table below, 7.2% of beneficiaries came from group A1 and 12% of beneficiaries came from group A2. On the surface, this seems like partners have made effort to reach conflict-affected townships. However, this reach has largely been due to oversubscription in Sittwe, where the number of beneficiaries reached in 191% of the target.

The development of the prioritisation groups also brings up the broader point of whether or not cluster targets are in line with needs and if they should be reformulated based on the information now available, as the targets in groups B and C are noticeably higher than those in group A. Nevertheless, it is hoped that partners will be able to afford townships in groups A1 and A2 greater coverage as the year progresses.


2022 Q1 beneficiaries and percent reached by prioritisation group
group beneficiaries %_ben target gap %_gap tsp_reached tsp_total
A1 219,564 7.24 178,541 72,930 40.85 8 20
A2 361,254 11.91 465,799 294,584 63.24 23 49
B 1,589,934 52.42 1,432,480 983,876 68.68 4 33
C 515,733 17.00 1,588,334 1,415,764 89.14 59 172
D 346,671 11.43 434,862 303,506 69.79 27 56
Any reach above 100% is counted as 100%; exceeding the target in one township does not affect other townships


Notably, only 8,150 beneficiaries being reached in the whole of Sagaing, where the fighting has been heaviest. It is recommended that targets and plans for the Food Security Cluster be reviewed, and partners be reminded to reallocate resources away from oversubscribed areas and away from groups B and C, which are neither humanitarian nor development priorities, with B consisting of urban centres.



1.8 Maps of conflict scores and prioritisation group



1.9 Reference table for conflict variables

Below is an interactive reference table for the various types of conflict events by township. It also includes the overall conflict score and prioritisation groups. The search bar can be used to find specific townships, or any of the columns may be sorted according to ascending or descending values. The table currently shows townships in descending order of conflict score.





2. Distribution of flood risk in Myanmar

2.1 Historical flood data

In light of the impending monsoon season, the probability that a township will be affected by a major flood or cylconic event has been calculated. Major floods since 2008 have been factored into this calculation.

For the moment, conflict incidence and flood and cyclone risk will be evaluated separately. Flood and storm surge risk exist as probabilities for the moment and are intended to support prepositioning and Disaster Risk Reduction. This might change were severe flooding to occur in 2022.



Based on this data, a score was calculated for each township based on how many times it had been affected by floods since 2008. The table below also summarises the number of people in need (2022). 2,210,725 people live in townships that have flooded more than 5 times since 2008.

Summary statistics by number of floods (2008-2021)
flood_count townships people_in_need
9 1 55,490
8 4 333,874
7 7 292,124
6 15 565,632
5 23 963,605
4 33 1,769,108
3 54 2,735,536
2 70 2,994,977
1 73 2,213,089
0 50 1,299,033
Data source: MIMU and UNDP



2.2 Map of flood risk

The map below shows the probability of each township being affected by floods. The areas with the greatest risk of flooding are in Mon, near the mouth of the Sittaung River and the Gulf of Mottama and those along the Ayeyarwady River, and to a lesser extent, along the Chindwin River.




2.3 Reference table for flood risk

Below is an interactive reference table for flood risk by township. It includes the number of times since 2008 a township has been affected by flooding (flood_count) and the probability of flooding (flood_risk). Similar to the interactive table in the previous chapter, the search bar can be used to find specific townships and any of the columns may be sorted according to ascending or descending values. The table currently shows townships sorted in descending order of flood risk.





3. Technical notes

These annexes contain additional technical information that informed the decisions in the earlier sections.

3.1 Limitations and next steps


3.1.a FAO-WFP food security survey

The most important limitation of the FAO-WFP survey was the exclusion of several key states and regions from the survey. Of particular interest are Sagaing, Magway and Mandalay where the conflict has been particularly intense.

Furthermore, the dry zone was not surveyed. From an agricultural perspective, this is a major omission as the diversity of crops and, consequently, diets are much higher in the dry zone than in the other parts of the country, which are predominantly focused on paddy.

Additionally, the targeting process proposed in this document has not yet been trialled in the field. The Food Security Cluster does not have the resources to undertake a field test of this scale. However, every attempt has been made to corroborate the data presented in it.

In spite of these major limitations and the numerous assumptions that have had to made, the FAO-WFP survey is most comprehensive dataset on food security that has been collected so far. Additional efforts will be made to cross-reference these data from those of other surveys. These models will be updated once the third round of the FAO-WFP survey is ready. As a final point in this section, the FAO-WFP survey, in spite of its limitations forms the basis of the People in Need calculations, which underpins a lot of the response.

This paper serves a proposal on how vulnerable households (such as those in the priority group) may be identified and targeted. Should this methodology prove sound and viable, it is suggested that it be applied to either IFPRI’s Household Welfare Survey as well as data collected in the third round of the FAO-WFP food security survey.



3.1.b MIMU-HARP vulnerability analysis

The results of the 2015 MIMU-HARP Vulnerability Analysis (used to inform scores for multidimensional vulnerability), have been updated using the 2019 Inter-Censal Survey results using the following formula:

\[ 2019TspValue = 2015TspValue / 2015DistrictValue \cdot 2019DistrictValue \]

This allows the new township values to tally with the 2019 district-level inter-censal survey results as well as to preserve the order and relationships of townships within each district. For the two indicators in the 2015 dataset but not covered in the 2019 inter-censal survey, they were forward filled, using their 2015 values. To further improve these estimations, multiple imputation should be employed. But that will be left for any subsequent revisions to this document.



3.1.c Conflict data and ACLED

Perhaps the most key limitation has also been the lack of field access and detailed assessment data from many parts of the country. With the conflict ongoing, and the footprints of humanitarian agencies largely skewed towards Yangon and Rakhine, which have been comparatively less affected by the current crisis, there is a demonstrable dearth of first-hand information in key areas. This document has intended to circumvent this through the use of ACLED data, which is the most complete set of conflict incident data in Myanmar.

However, the ACLED dataset is not without its limitations – the majority of its information, about 85 percent, comes from subnational, national and international media sources. The remainder comes from ACLED’s partner, the Myanmar Peace Monitor, and reports from UN agencies, international monitoring groups, and local human rights organisations. The completeness of the conflict data and how representative it is of the situation on the ground is not something that is easily verifiable. Though it should be noted that ACLED still has the largest and most comprehensive dataset of conflict incidents in Myanmar.



3.2 Calculating the conflict score

The conflict score here originally appeared in the Food Security Cluster’s report Understanding Conflict Dynamics in Myanmar through Conflict and Incident Data: A Food Security Perspective. It was calculated using ACLED data and yields a score for each township.

The conflict score is an update of the conflict index in the MIMU-HARP Vulnerability Analysis, using 2021 data. The specific conflict variables that included in the score were battles, explosions and remote violence, non-peaceful protests and riots, conflict-related fatalities, strategic developments and number of IDPs. Only the version of the conflict score within this document takes IDPs into account; in the Food Security Cluster’s earlier report on conflict (linked in the previous paragraph), the Cluster did not yet have access to detailed IDP data.

The conflict score is an average of the normalised values of key conflict indicators. Its main use it to aid decisions about geographic prioritisation. These normalised values have been re-weighted with Betti-Verma method, which penalises redundancy and rewards variation; this is the only notable divergence from the MIMU-HARP methodology. The Betti-Verma method was employed through the mdepriv package developed by Attilio and Aldo Benini.

Unlike the Food Insecurity Score, the component variables of the conflict index were not binary, meaning that it was possible to take advantage of the Betti-Verma method’s double-weighting rule which is sensitive to both the relative frequency of the variables and the correlation amongst variables:

\[ w_j \propto (w_j^a \cdot w_j^b) \]

However, it must be noted that whilst the scores themselves can be shared and used, replicating all the calculations will necessitate obtaining permission from UNHCR as their township-level breakdown of IDP populations have not been shared publicly. The specific code for calculating the conflict score can be found below.


# Betti-Verma calculations and the construction of the conflict score
index_shares2 <- conflict_df2 %>%   
  mutate_at(vars(c(battles, explosions_remote_violence, violence_against_civilians, 
                   fatalities, strategic_developments, 
                   protests_and_riots, total_idps)), 
           scale) %>%  
  mutate_at(vars(c(battles, explosions_remote_violence, violence_against_civilians, 
                   fatalities, strategic_developments, 
                   protests_and_riots, total_idps)), 
           funs((. - min(., na.rm = T))/(max(., na.rm = T) - min(., na.rm = T)))) %>% 
  mdepriv(c("battles", "explosions_remote_violence", 
            "violence_against_civilians", "fatalities", 
            "strategic_developments", "protests_and_riots", "total_idps"),
          # IDP counts have been used in the score, but will not be read 
          # into this report
          method = "bv", output = "all")


For reference, below is the code use to cluster townships according to the conflict and multidimensional vulnerability.

# k-means clustering and output
set.seed(123)

km_res2 <- fs_pin %>% 
  replace_na(list(fatalities = 0)) %>% 
  select(population_density, 
         conflict_score, 
         vulnerability_score, 
         fatalities) %>%
  mutate_at(vars(population_density, 
                 conflict_score, 
                 vulnerability_score, 
                 fatalities), 
            ~ (.x - min(.x)) / (max(.x) - min(.x))) %>% 
  kmeans(5, nstart = 25)
LS0tDQp0aXRsZTogIlRvd25zaGlwIFByaW9yaXRpc2F0aW9uIg0KYXV0aG9yOiAiTXlhbm1hciBGb29kIFNlY3VyaXR5IENsdXN0ZXIiDQpkYXRlOiAiMjUvMDUvMjAyMiINCm91dHB1dDogDQogIGh0bWxfZG9jdW1lbnQ6DQogICAgY29kZV9kb3dubG9hZDogdHJ1ZQ0KICAgIHRoZW1lOiByZWFkYWJsZQ0KICAgIHRvYzogdHJ1ZQ0KICAgIHRvY19kZXB0aDogNA0KICAgIHRvY19mbG9hdDogdHJ1ZQ0KICAgIG51bWJlcl9zZWN0aW9uczogZmFsc2UNCiAgICBjb2xsYXBzZWQ6IGZhbHNlDQphbHdheXNfYWxsb3dfaHRtbDogdHJ1ZSAgIA0KZ29vZ2xlX2FuYWx5dGljczogRy1ETjlKV0pCN1BYDQotLS0NCg0KPCEtLSBHbG9iYWwgc2l0ZSB0YWcgKGd0YWcuanMpIC0gR29vZ2xlIEFuYWx5dGljcyAtLT4NCjxzY3JpcHQgYXN5bmMgc3JjPSJodHRwczovL3d3dy5nb29nbGV0YWdtYW5hZ2VyLmNvbS9ndGFnL2pzP2lkPUctRE45SldKQjdQWCI+PC9zY3JpcHQ+DQo8c2NyaXB0Pg0KICB3aW5kb3cuZGF0YUxheWVyID0gd2luZG93LmRhdGFMYXllciB8fCBbXTsNCiAgZnVuY3Rpb24gZ3RhZygpe2RhdGFMYXllci5wdXNoKGFyZ3VtZW50cyk7fQ0KICBndGFnKCdqcycsIG5ldyBEYXRlKCkpOw0KDQogIGd0YWcoJ2NvbmZpZycsICdHLUROOUpXSkI3UFgnKTsNCjwvc2NyaXB0Pg0KDQpgYGB7Y3NzLCBlY2hvPUZBTFNFfQ0KDQojVE9DOjpiZWZvcmUgew0KICBjb250ZW50OiAiIjsNCiAgZGlzcGxheTogYmxvY2s7DQogIGhlaWdodDogNzBweDsNCiAgbWFyZ2luOiAyZW0gMjBweCA0MHB4IDIwcHg7DQogIGJhY2tncm91bmQtaW1hZ2U6IHVybCgiTXlhbm1hcl9jbHVzdGVyX2JsdWUucG5nIik7DQogIGJhY2tncm91bmQtc2l6ZTogY29udGFpbjsNCiAgYmFja2dyb3VuZC1wb3NpdGlvbjogY2VudGVyIGNlbnRlcjsNCiAgYmFja2dyb3VuZC1yZXBlYXQ6IG5vLXJlcGVhdDsNCn0NCmBgYA0KDQpgYGB7PWh0bWx9DQo8c3R5bGU+DQogICAgYm9keSAubWFpbi1jb250YWluZXIgew0KICAgICAgICBtYXgtd2lkdGg6IDEyODBweDsNCiAgICB9DQo8L3N0eWxlPg0KYGBgDQoNCmBgYHtyIHNldHVwLCBpbmNsdWRlPUZBTFNFfQ0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KGVjaG8gPSBGQUxTRSwgZmlnLndpZHRoPTksIG1lc3NhZ2UgPSBGQUxTRSwgd2FybmluZz1GQUxTRSkNCmxpYnJhcnkodGlkeXZlcnNlKQ0KbGlicmFyeShyZWFkeGwpDQpsaWJyYXJ5KGhhdmVuKQ0KbGlicmFyeShsdWJyaWRhdGUpDQpsaWJyYXJ5KHN0cmluZ2kpDQpsaWJyYXJ5KHBhbmRlcikNCmxpYnJhcnkoamFuaXRvcikNCmxpYnJhcnkoc2NhbGVzKQ0KbGlicmFyeShtYWdyaXR0cikNCmxpYnJhcnkoc2YpDQpsaWJyYXJ5KGJvb2tkb3duKQ0KbGlicmFyeShwYXRjaHdvcmspDQpsaWJyYXJ5KGthYmxlRXh0cmEpDQpsaWJyYXJ5KERUKQ0KbGlicmFyeSh2aXJpZGlzKQ0KbGlicmFyeShtZGVwcml2KQ0KbGlicmFyeShwc3ljaCkNCmxpYnJhcnkod2lkeXIpDQpsaWJyYXJ5KHJwYXJ0KQ0KbGlicmFyeShycGFydC51dGlscykNCmxpYnJhcnkocmF0dGxlKQ0KbGlicmFyeShicm9vbXN0aWNrKQ0KbGlicmFyeShjb3JycGxvdCkNCmxpYnJhcnkoYnJvb20pDQpsaWJyYXJ5KHRpZHl0ZXh0KQ0KbGlicmFyeShwbG90bHkpDQpsaWJyYXJ5KGdncmlkZ2VzKQ0KbGlicmFyeShSQ29sb3JCcmV3ZXIpDQpsaWJyYXJ5KGdnZm9yY2UpDQpsaWJyYXJ5KGhlcmUpDQoNCiMgaWYgdGhpcyBpcyBqdXN0IHRvd25zaGlwcywgeW91IGNhbiBqdXN0IHRha2Ugb3V0IGhhdmVuIGFuZCBtYXliZSB0aWR5dGV4dD8gDQoNCnRoZW1lX3NldCh0aGVtZV9taW5pbWFsKCkpDQoNCiMgZGlzYWJsaW5nIHNjaWVudGlmaWMgbm90YXRpb24NCm9wdGlvbnMoc2NpcGVuID0gOTk5KQ0KDQojIHBhbmRlciB0YWJsZXMgYWxsIGluIG9uZSByb3cNCnBhbmRlck9wdGlvbnMoJ3RhYmxlLnNwbGl0LnRhYmxlJywgSW5mKQ0KDQojIHBhbmRlciB0aG91c2FuZHMgc2VwYXJhdG9yDQpwYW5kZXJPcHRpb25zKCJiaWcubWFyayIsICIsIikNCg0KIyByZXBsYWNlIA0Kb3B0cyA8LSBvcHRpb25zKGtuaXRyLmthYmxlLk5BID0gIiIpDQoNCmAlb3V0JWAgPC0gTmVnYXRlKGAlaW4lYCkNCg0KIyBmdW5jdGlvbiBiZW5lZmljaWFyeSBzdW1tYXJpZXMNCnN1bV9iZW4gPC0gZnVuY3Rpb24oZGYsIGNvbHVtbl92YXIpew0KICANCiAgY29sdW1uX3ZhciA8LSBlbnF1byhjb2x1bW5fdmFyKQ0KICANCiAgZGYgJT4lDQogICAgZ3JvdXBfYnkoISFjb2x1bW5fdmFyKSAlPiUgIyBtdXN0IGFkZCBiYW5nLWJhbmcNCiAgICBzdW1tYXJpc2UoYmVuZWZpY2lhcmllcyA9IHN1bShiZW5lZmljaWFyaWVzKSkgJT4lIA0KICAgIGFycmFuZ2UoZGVzYyhiZW5lZmljaWFyaWVzKSkNCiAgICANCn0NCg0KIyBmdW5jdGlvbiBiZW5lZmljaWFyeSBzdW1tYXJpZXMsIDIgZ3JvdXBlZCB2YXJpYWJsZXMNCnN1bV9iZW4yIDwtIGZ1bmN0aW9uKGRmLCBjb2x1bW5fdmFyMSwgY29sdW1uX3ZhcjIpew0KICANCiAgY29sdW1uX3ZhcjEgPC0gZW5xdW8oY29sdW1uX3ZhcjEpDQogIGNvbHVtbl92YXIyIDwtIGVucXVvKGNvbHVtbl92YXIyKQ0KICANCiAgZGYgJT4lDQogICAgZ3JvdXBfYnkoISFjb2x1bW5fdmFyMSwgISFjb2x1bW5fdmFyMikgJT4lICMgbXVzdCBhZGQgYmFuZy1iYW5nDQogICAgc3VtbWFyaXNlKGJlbmVmaWNpYXJpZXMgPSBzdW0oYmVuZWZpY2lhcmllcykpICU+JSANCiAgICBhcnJhbmdlKGRlc2MoYmVuZWZpY2lhcmllcykpDQogICAgDQp9DQoNCiMgc2NhbGluZyBmdW5jdGlvbnMgDQpyYW5nZTAxIDwtIGZ1bmN0aW9uKHgpeyh4LW1pbih4KSkvKG1heCh4KS1taW4oeCkpfQ0KcmFuZ2Vfd25hIDwtIGZ1bmN0aW9uKHgpeyh4LW1pbih4LCBuYS5ybSA9IFRSVUUpKS8obWF4KHgsIG5hLnJtID0gVFJVRSktbWluKHgsIG5hLnJtID0gVFJVRSkpfQ0KDQojbW9kZSBmdW5jdGlvbiANCm1vZGUgPC0gZnVuY3Rpb24oeCkgew0KICB1eCA8LSB1bmlxdWUoeCkNCiAgdXhbd2hpY2gubWF4KHRhYnVsYXRlKG1hdGNoKHgsIHV4KSkpXQ0KfQ0KDQojIGhlcmUNCmhlcmU6OmhlcmUoKQ0KDQojIHNob3dfY29sKHZpcmlkaXNfcGFsKG9wdGlvbiA9ICJjaXZpZGlzIikoNSkpDQpgYGANCg0KYGBge3IgZGF0YXNldHN9DQojIGxvb2sgYXQgZGF0YXNldHMucm1kIGZvciBtb3JlIGluZm8gb24gY2xlYW5pbmcNCg0KIyBwY29kZXMNCnBjb2RlcyA8LSByZWFkX2V4Y2VsKGhlcmUoIi4vZGF0YS9NeWFubWFyIFBDb2RlcyBSZWxlYXNlXzkuM19KYW4yMDIxXyhTdFJnbl9EaXN0X1RzcF9Ub3duX1dhcmRfVlQpLnhsc3giKSwNCiAgICAgICAgICAgICAgICAgICAgIHNoZWV0ID0gIjAzX1Rvd25zaGlwIikgJT4lDQogIHJlbmFtZShhZG1pbjFfcGNvZGUgPSBTUl9QY29kZSwNCiAgICAgICAgIHN0YXRlID0gU1JfTmFtZV9FbmcsDQogICAgICAgICBhZG1pbjNfcGNvZGUgPSBUc3BfUGNvZGUsDQogICAgICAgICB0b3duc2hpcCA9IFRvd25zaGlwX05hbWVfRW5nLA0KICAgICAgICAgYWRtaW4yX3Bjb2RlID0gYERpc3RyaWN0L1NBWl9QY29kZWAsIA0KICAgICAgICAgZGlzdHJpY3QgPSBgRGlzdHJpY3QvU0FaX05hbWVfRW5nYCkNCg0KIyBzaGFwZWZpbGVzDQpwY29kZTNfc2hhcGUgPC0gc3RfcmVhZChoZXJlKCIuL21tcl9wb2xibmRhX2FkbTNfbWltdV8yNTBrL21tcl9wb2xibmRhX2FkbTNfbWltdV8yNTBrLnNocCIpLCANCiAgICAgICAgICAgICAgICAgICAgICAgIHF1aWV0ID0gVFJVRSkgJT4lIA0KIHJlbmFtZShzdGF0ZSA9IFNULCANCiAgICAgICAgYWRtaW4xX3Bjb2RlID0gU1RfUENPREUsDQogICAgICAgIHRvd25zaGlwID0gVFMsDQogICAgICAgIGFkbWluM19wY29kZSA9IFRTX1BDT0RFKSAlPiUgDQogbXV0YXRlKGFkbWluM19wY29kZSA9IGlmZWxzZShzdHJfZGV0ZWN0KHRvd25zaGlwLCAiSGxhaW5ndGhhcnlhIiksICJNTVIwMTMwMDgiLCBhZG1pbjNfcGNvZGUpKQ0KDQpwY29kZTFfc2hhcGUgPC0gc3RfcmVhZChoZXJlKCIuL21tcl9wb2xibmRhMl9hZG0xX21pbXVfMjUway9tbXJfcG9sYm5kYTJfYWRtMV9taW11XzI1MGsuc2hwIiksIA0KICAgICAgICAgICAgICAgICAgICAgICAgcXVpZXQgPSBUUlVFKSAlPiUgDQogcmVuYW1lKHN0YXRlID0gU1QsIA0KICAgICAgICBhZG1pbjFfcGNvZGUgPSBTVF9QQ09ERSkgJT4lIHN0X2FzX3NmKCkNCg0KIyByZWFkaW5nIGluIDVXcyAyMDIxDQpmc2NfMjAyMSA8LSByZWFkX2NzdihoZXJlKCIuL2RhdGEvZnNjNXdfMjAyMS5jc3YiKSkNCg0KIyAyMDIyIFEyIDVXcw0KZnNjIDwtIHJlYWRfY3N2KGhlcmUoIi4vZGF0YS9mc2MuY3N2IikpDQoNCiMgcmVhZGluZyBpbiB2dWxuZXJhYmlsaXR5IGRhdGFzZXQNCnZ1bG1tciA8LSByZWFkX2NzdihoZXJlKCIuL2RhdGEvdnVsbW1yLmNzdiIpKQ0KDQojIEFDTEVEIGRhdGFzZXQNCmFjbGVkIDwtIHJlYWRfY3N2KGhlcmUoIi4vZGF0YS9hY2xlZF9uZXcuY3N2IikpICU+JSANCiAgbXV0YXRlKGhhc192aWxsYWdlID0gaWZfZWxzZShsb2NhdGlvbiAhPSBhZG1pbjMsICJ5ZXMiLCAibm8iKSkNCg0KIyByZWFkaW5nIGluIGNvbmZsaWN0IHNjb3JlDQpjb25mbGljdF9zY29yZSA8LSByZWFkX2NzdihoZXJlKCIuL2RhdGEvY29uZmxpY3Rfc2NvcmUyLmNzdiIpKQ0KDQojIHNob3dfY29sKHZpcmlkaXNfcGFsKCkoMTApKQ0KDQpmbG9vZHNfc3Rvcm1fc3VyZ2UgPC0gcmVhZF9jc3YoaGVyZSgiLi9kYXRhL2Zsb29kc19zdG9ybV9zdXJnZS5jc3YiKSkNCg0KZnNfcGluIDwtIHJlYWRfY3N2KGhlcmUoIi4vZGF0YS9mc19waW4uY3N2IikpDQoNCmBgYA0KDQpgYGB7ciB3cml0ZV9tZHBfZGF0YXNldCwgZXZhbD1GQUxTRX0NCmZzX3BpbiAlPiUgDQogIG11dGF0ZShtdWx0aWRpbWVuc2lvbmFsX3Z1bG5lcmFiaWxpdHkgPSBtZHBfYWRqdXN0KSAlPiUgDQogIHdyaXRlX2NzdigiLi9kYXRhL2dlbmVyYWxfdG93bnNoaXAuY3N2IikNCmBgYA0KDQpbRm9vZCBTZWN1cml0eSBDbHVzdGVyIE15YW5tYXIgaG9tZXBhZ2VdKGh0dHBzOi8vZm9vZC1zZWN1cml0eS1jbHVzdGVyLW15YW5tYXIuZ2l0aHViLmlvLykNCg0KDQoNCg0KPGJyPjxicj4NCg0KIyMgSW50cm9kdWN0aW9uIA0KDQpUaGlzIGRvY3VtZW50IGlzIHRoZSBmaXJzdCBvZiB0d28gb24gcHJpb3JpdGlzYXRpb24gYW5kIGlzIGZvY3VzZWQgb24gZ2VvZ3JhcGhpYyBwcmlvcml0aXNhdGlvbi4gVGhlIHNlY29uZCB3aWxsIGZvY3VzIG9uIGVzdGFibGlzaGluZyBhIGJlbmVmaWNpYXJ5IHByb2ZpbGUuIFRoaXMgZmlyc3QgZG9jdW1lbnQgbWFrZXMgdXNlIG9mIGRhdGEgZnJvbSB0aGUgQXJtZWQgQ29uZmxpY3QgTG9jYXRpb24gYW5kIEV2ZW50IERhdGFzZXQgKEFDTEVEKSBhbmQgdGhlIE15YW5tYXIgSW5mb3JtYXRpb24gTWFuYWdlbWVudCBVbml0IChNSU1VKSB0byBkZXZlbG9wIGEgY29uZmxpY3Qgc2NvcmUsIGV4YW1pbmUgcHJlLWV4aXN0aW5nIHZ1bG5lcmFiaWxpdHkgYW5kIG1hcCBmbG9vZCByaXNrIGF0IHRoZSB0b3duc2hpcCBsZXZlbC4gVGhpcyBkb2N1bWVudCBpcyBjbG9zZWQgd2l0aCBhIHNlY3Rpb24gb2YgdGVjaG5pY2FsIG5vdGVzLiANCg0KPGJyPg0KDQoNCiMjIyBSZWZlcmVuY2VzIGZvciB0aGlzIHJlcG9ydA0KKiBBQ0xFRCAoMjAyMikuIEFDTEVEIGRhdGEgZm9yIE15YW5tYXIgKDIwMTAtMjAyMikuIGh0dHBzOi8vYWNsZWRkYXRhLmNvbS4NCiogTWFyaWEgTm9lbCBQaSBBbHBlcmluLCBQaGlsaXBwZSBWYW4gS2VybSAoMjAwOSkuIG1kZXByaXY6IFN5bnRoZXRpYyBpbmRpY2F0b3JzIG9mIG11bHRpcGxlIGRlcHJpdmF0aW9uLiBTdGF0YSBjb21tYW5kLiBodHRwOi8vbWVkaW0uY2Vwcy5sdS9zdGF0YS9tZGVwcml2X3YzLnBkZg0KKiBBdGlsbGlvIEJlbmluaSwgQWxkbyBCZW5pbmkgKDIwMjEpLiBtZGVwcml2OiBTeW50aGV0aWMgc2NvcmVzIG9mIG11bHRpcGxlIGRlcHJpdmF0aW9uLiBSIHBhY2thZ2UgdmVyc2lvbiAwLjAuMy4gIGh0dHBzOi8vZ2l0aHViLmNvbS9hLWJlbmluaS9tZGVwcml2Ly4NCiogR2lhbm5pIEJldHRpLCBWaWpheSBWZXJtYSAoMjAwNCkuIEEgbWV0aG9kb2xvZ3kgZm9yIHRoZSBzdHVkeSBvZiBtdWx0aS1kaW1lbnNpb25hbCBhbmQgbG9uZ2l0dWRpbmFsIGFzcGVjdHMgb2YgcG92ZXJ0eSBhbmQgZGVwcml2YXRpb24uIERpcGFydGFtZW50byBkaSBNZXRvZGkgUXVhbnRpdGF0aXZpLCBVbml2ZXJzaXRhIGRpIFNpZW5hLiBodHRwOi8vcmVwZWMuZGVwcy51bmlzaS5pdC9xdWFkZXJuaS80OURNUS5wZGYuIA0KKiBGb29kIFNlY3VyaXR5IENsdXN0ZXIsIE15YW5tYXIgKDIwMjEpLiA1V3MgcmVwb3J0aW5nIHRvb2wuDQoqIEZvb2QgU2VjdXJpdHkgQ2x1c3RlciwgTXlhbm1hciAoMjAyMikuIFVuZGVyc3RhbmRpbmcgQ29uZmxpY3QgRHluYW1pY3MgaW4gTXlhbm1hciB0aHJvdWdoIENvbmZsaWN0IGFuZCBJbmNpZGVudCBEYXRhOiBBIEZvb2QgU2VjdXJpdHkgUGVyc3BlY3RpdmUuIGh0dHBzOi8vZm9vZC1zZWN1cml0eS1jbHVzdGVyLW15YW5tYXIuZ2l0aHViLmlvL2V4cGxvcmF0b3J5LWRhdGEtYW5hbHlzaXMtYWNsZWQtZnNjLy4NCiogSEFSUC1GIGFuZCBNSU1VICgyMDE4KS4gVnVsbmVyYWJpbGl0eSBpbiBNeWFubWFyOiBBIFNlY29uZGFyeSBEYXRhIFJldmlldyBvZiBOZWVkcywgQ292ZXJhZ2UgYW5kIEdhcHMuIGh0dHA6Ly90aGVtaW11LmluZm8vdnVsbmVyYWJpbGl0eS1pbi1teWFubWFyLg0KKiBJRlBSSSAoMjAyMikuIEhvdXNlaG9sZCBXZWxmYXJlIGluIE15YW5tYXI6IFJlc3VsdHMgZnJvbSB0aGUgTXlhbm1hciBIb3VzZWhvbGQgV2VsZmFyZSBTdXJ2ZXkuIA0KKiBNSU1VICgyMDIyKS4gQ2xpbWF0ZSwgRW52aXJvbm1lbnRhbCBEZWdyYWRhdGlvbiBhbmQgRGlzYXN0ZXIgUmlzayBpbiBNeWFubWFyIC0tIGEgTUlNVSBBbmFseXRpY2FsIEJyaWVmLiBodHRwOi8vdGhlbWltdS5pbmZvL2Vudmlyb25tZW50YWwtYW5hbHlzaXMuDQoqIFVOSENSICgyMDIyKS4gUHJlIGFuZCBQb3N0IDEgRmViIDIwMjEgSURQcyBQb3B1bGF0aW9uIGJ5IFRvd25zaGlwIGxldmVsLiANCg0KPGJyPjxicj48YnI+DQoNCiMjIDEuIENvbmZsaWN0IGFuZCBwcmUtZXhpc3RpbmcgdnVsbmVyYWJpbGl0eQ0KDQpNeWFubWFyIGhhZCB0aGUgbW9zdCBjb25mbGljdCBldmVudHMgb3V0IG9mIGFueSBjb3VudHJ5IGluIDIwMjEsIGV4Y2VlZGluZyBTeXJpYSwgWWVtZW4gYW5kIEFmZ2hhbmlzdGFuLiANCg0KVGhlIHRhYmxlIGJlbG93IGhpZ2hsaWdodHMgdGhlIGZvdXJ0ZWVuZm9sZCBpbmNyZWFzZSBpbiBjb25mbGljdCBldmVudHMgYW5kIHRoaXJ0ZWVuZm9sZCBpbmNyZWFzZSBpbiBjb25mbGljdCBmYXRhbGl0aWVzIGluIE15YW5tYXIgaW4gMjAyMSBjb21wYXJlZCB0byB0aGUgYXZlcmFnZSBmb3IgdGhlIHByaW9yIGRlY2FkZS4gDQoNCjxicj4NCg0KYGBge3IgdGFibGUtY29uZmxpY3QteWVhcnMtY29tcGFyZX0NCmFjbGVkICU+JSANCiAgZmlsdGVyKHN1Yl9ldmVudF90eXBlICE9ICJQZWFjZWZ1bCBwcm90ZXN0IikgJT4lIA0KICBtdXRhdGUoeWVhcnMgPSBpZmVsc2UoeWVhciAlb3V0JSBjKDIwMjEsIDIwMjIpLCAiMjAxMC0yMDIwIiwgeWVhcikpICU+JQ0KICBncm91cF9ieSh5ZWFycykgJT4lDQogIHN1bW1hcmlzZSh0b3RhbF9ldmVudHMgPSBuKCkpICU+JSANCiAgbXV0YXRlKGF2Z19ldmVudHNfcGVyX3llYXIgPSBpZmVsc2UoeWVhcnMgJWluJSBjKDIwMjEsIDIwMjIpLCB0b3RhbF9ldmVudHMsIHRvdGFsX2V2ZW50cyAvIDExKSkgJT4lIA0KICBsZWZ0X2pvaW4oYWNsZWQgJT4lDQogICAgICAgICAgICAgIGZpbHRlcihzdWJfZXZlbnRfdHlwZSAhPSAiUGVhY2VmdWwgcHJvdGVzdCIpICU+JSANCiAgICAgICAgICAgICAgbXV0YXRlKHllYXJzID0gaWZlbHNlKHllYXIgJW91dCUgYygyMDIxLCAyMDIyKSwgIjIwMTAtMjAyMCIsIHllYXIpKSAlPiUNCiAgICAgICAgICAgICAgZ3JvdXBfYnkoeWVhcnMpICU+JQ0KICAgICAgICAgICAgICBzdW1tYXJpc2UodG90YWxfZmF0YWxpdGllcyA9IHN1bShmYXRhbGl0aWVzKSkgJT4lIA0KICAgICAgICAgICAgICBtdXRhdGUoYXZnX2ZhdGFsaXRpZXNfcGVyX3llYXIgPSBpZmVsc2UoeWVhcnMgJWluJSBjKDIwMjEsIDIwMjIpLCB0b3RhbF9mYXRhbGl0aWVzLCB0b3RhbF9mYXRhbGl0aWVzIC8gMTEpKSwgDQogICAgICAgICAgICBieSA9ICJ5ZWFycyIpICU+JQ0KICBtdXRhdGVfYXQodmFycyhhdmdfZXZlbnRzX3Blcl95ZWFyLCBhdmdfZmF0YWxpdGllc19wZXJfeWVhciksIH5yb3VuZCgueCwgZGlnaXRzID0gMCkpICU+JSANCiAga2FibGUoY2FwdGlvbiA9ICJJbmNyZWFzZSBpbiBjb25mbGljdCBldmVudHMgYW5kIGZhdGFsaXRpZXMgY29tcGFyZWQgdG8gcHJldmlvdXMgZGVjYWRlIiwgDQogICAgICAgIGZvcm1hdC5hcmdzID0gbGlzdChiaWcubWFyayA9ICIsIikpICU+JSANCiAga2FibGVfY2xhc3NpY18yKCJzdHJpcGVkIikgJT4lIA0KICBmb290bm90ZSgiRGF0YSBzb3VyY2U6IEFDTEVEOyBhY2NsZWRkYXRhLmNvbS4gRGF0YSBmb3IgMjAyMiBpcyB1bnRpbCAyMDIyLTA1LTMxLiIsIGdlbmVyYWxfdGl0bGUgPSAiIikNCg0KYGBgDQoNCjxicj4NCg0KR2l2ZW4gdGhlIG1vcmUgdGhhbiBmb3VydGVlbmZvbGQgaW5jcmVhc2UgaW4gY29uZmxpY3QgZXZlbnRzIGFuZCB0aGlydGVlbmZvbGQgaW5jcmVhc2UgaW4gY29uZmxpY3QgZmF0YWxpdGllcyBpbiBNeWFubWFyIGluIDIwMjEgKGNvbXBhcmVkIHRvIHRoZSBhdmVyYWdlIGZvciB0aGUgcHJlY2VkaW5nIDEwIHllYXJzKSwgY29uZmxpY3Qgd2lsbCBiZSBtYWpvciBwYXJ0IG9mIGRldGVybWluaW5nIHdoaWNoIGFyZWFzIGhhdmUgdGhlIGdyZWF0ZXN0IGh1bWFuaXRhcmlhbiBuZWVkcy4gSG93ZXZlciwgc2NvcmluZyB0b3duc2hpcHMgYmFzZWQgb25seSBvbiBvbmUgdmFyaWFibGUgd291bGQgbGVhZCB0byBhIHZlcnkgdW5pLWRpbWVuc2lvbmFsIHVuZGVyc3RhbmRpbmcgb2YgdGhlIGNyaXNpcy4gDQoNClNpbWlsYXIgdG8gaG93IGEgYmVuZWZpY2lhcnkgcHJvZmlsZSB3YXMgZXN0YWJsaXNoZWQgaW4gb3JkZXIgdG8gaW5mb3JtIGJlbmVmaWNpYXJ5IHNlbGVjdGlvbiwgdGhpcyBzZWN0aW9uLCB3aWxsIGZvY3VzIG9uIHdoYXQgdmFyaWFibGVzIHNob3VsZCBiZSBjb25zaWRlcmVkIHdoZW4gcHJpb3JpdGlzaW5nIGFtb25nc3QgdGhlIHZhcmlvdXMgZ2VvZ3JhcGhpYyBhcmVhcyBpbiBNeWFubWFyIGFuZCBob3cgdGhlIHJlc3VsdHMgb2Ygc3VjaCBhIHByaW9yaXRpc2F0aW9uIHNob3VsZCBiZSBhcHBsaWVkLiBBcyB3aXRoIGVhcmxpZXIgc2VjdGlvbnMsIHRoZSBhbmFseXNpcyBoZXJlIGlzIG1lYW50IHRvIGRlc2NyaWJlIGFuZCBpbmZvcm0gcHJvZ3JhbW1hdGljIGFuZCBvcGVyYXRpb25hbCBkZWNpc2lvbiBtYWtpbmcsIGFzIG9wcG9zZWQgdG8gZGljdGF0aW5nIGl0LCBhcyBlYWNoIHBhcnRuZXIgd2lsbCBoYXZlIHRoZWlyIG93biBjb25zaWRlcmF0aW9ucyBhbmQgbGltaXRhdGlvbnMuIA0KDQpUaGUgcGxvdCBiZWxvdyBzaG93cyB0aGUgY3VtdWxhdGl2ZSBudW1iZXIgb2YgY29uZmxpY3QgZXZlbnRzLCBicm9rZW4gZG93biBieSB0aGUgOSBtb3N0IGNvbW1vbiBzdWItZXZlbnQgdHlwZXMuIA0KDQo8YnI+DQoNCmBgYHtyIHN1Yi1ldmVudC10eXBlLCBmaWcuaGVpZ2h0ID0gNn0NCmFjbGVkICU+JQ0KICBmaWx0ZXIoeWVhciA+PSAyMDIxKSAlPiUgDQogIG11dGF0ZShzdWJfZXZlbnRfdHlwZSA9IGZjdF9sdW1wKHN1Yl9ldmVudF90eXBlLCA5KSkgJT4lIA0KICBtdXRhdGUobW9udGggPSBmbG9vcl9kYXRlKGV2ZW50X2RhdGUsICJtb250aCIpKSAlPiUgDQogIG11dGF0ZShtb250aCA9IG1hcChtb250aCwgfiBzZXEuRGF0ZShhcy5EYXRlKC4pLCBhcy5EYXRlKCIyMDIyLzA1LzAxIiksIGJ5ID0gIm1vbnRoIikpKSAlPiUgDQogIHVubmVzdChtb250aCkgJT4lIA0KICBncm91cF9ieShtb250aCwgc3ViX2V2ZW50X3R5cGUpICU+JQ0KICBzdW1tYXJpc2UoZXZlbnRzID0gbigpKSAlPiUgDQogIGdncGxvdChhZXMoeCA9IG1vbnRoLCB5ID0gZXZlbnRzLCBncm91cCA9IHN1Yl9ldmVudF90eXBlLCBmaWxsID0gc3ViX2V2ZW50X3R5cGUpKSArIA0KICBnZW9tX2FyZWEoKSArIA0KICBzY2FsZV94X2RhdGUoZGF0ZV9icmVha3MgPSAiMSBtb250aCIsIGxhYmVscyA9IGRhdGVfZm9ybWF0KGZvcm1hdCA9ICIlWS0lYiIpKSArIA0KICBzY2FsZV95X2NvbnRpbnVvdXMoYnJlYWtzID0gc2VxKDAsIDIyMDAwLCBieSA9IDIwMDApLCBsYWJlbHMgPSBjb21tYSkgKw0KICBzY2FsZV9maWxsX3ZpcmlkaXNfZChvcHRpb24gPSAidHVyYm8iKSArIA0KICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAidG9wIiwNCiAgICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSAzMCwgaGp1c3QgPSAxLCB2anVzdCA9IDEpLCANCiAgICAgICAgcGxvdC5jYXB0aW9uID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gLjUpKSArIA0KICBsYWJzKHggPSAiIiwgDQogICAgICAgeSA9ICJDdW11bGF0aXZlIGNvbmZsaWN0IGV2ZW50cyIsIA0KICAgICAgIGZpbGwgPSAiIiwgDQogICAgICAgdGl0bGUgPSAiQ3VtdWFsdGl2ZSAyMDIxLTIwMjIgY29uZmxpY3QgZXZlbnRzIHBlciBtb250aCwgYnkgc3ViLWV2ZW50IHR5cGUiLCANCiAgICAgICBjYXB0aW9uID0gIkRhdGEgc291cmNlOiBBcm1lZCBDb25mbGljdCBMb2NhdGlvbiAmIEV2ZW50IERhdGEgUHJvamVjdCAoQUNMRUQpOyBhY2xlZGRhdGEuY29tIikgDQogIA0KYGBgDQoNCjxicj4NCg0KVGhpcyBwbG90IGJlbG93IGJyZWFrcyBkb3duIGZhdGFsaXRpZXMgb3ZlciB0aW1lIGJ5IHN1Yi1ldmVudCB0eXBlLiANCg0KPGJyPg0KDQoNCmBgYHtyIGZhdGFsaXRpZXMsIGZpZy5oZWlnaHQgPSA2fQ0KYWNsZWQgJT4lDQogIGZpbHRlcih5ZWFyID49IDIwMjEpICU+JSANCiAgbXV0YXRlKHN1Yl9ldmVudF90eXBlID0gaWZlbHNlKA0KICAgIHN1Yl9ldmVudF90eXBlICVvdXQlIGMoIkFybWVkIGNsYXNoIiwgIlJlbW90ZSBleHBsb3NpdmUvbGFuZG1pbmUvSUVEIiwgIkF0dGFjayIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIkV4Y2Vzc2l2ZSBmb3JjZSBhZ2FpbnN0IHByb3Rlc3RlcnMiLCAiU2hlbGxpbmcvYXJ0aWxsZXJ5L21pc3NpbGUgYXR0YWNrIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAiVmlvbGVudCBkZW1vbnN0cmF0aW9uIiwgIkFpci9kcm9uZSBzdHJpa2UJIiksICJPdGhlciIsIHN1Yl9ldmVudF90eXBlDQogICkpICU+JSANCiAgbXV0YXRlKG1vbnRoID0gZmxvb3JfZGF0ZShldmVudF9kYXRlLCAibW9udGgiKSkgJT4lIA0KICBtdXRhdGUobW9udGggPSBtYXAobW9udGgsIH4gc2VxLkRhdGUoYXMuRGF0ZSguKSwgYXMuRGF0ZSgiMjAyMi8wNS8wMSIpLCBieSA9ICJtb250aCIpKSkgJT4lIA0KICB1bm5lc3QobW9udGgpICU+JSANCiAgZ3JvdXBfYnkobW9udGgsIHN1Yl9ldmVudF90eXBlKSAlPiUNCiAgc3VtbWFyaXNlX2F0KCJmYXRhbGl0aWVzIiwgc3VtKSAlPiUgDQogIGdncGxvdChhZXMoeCA9IG1vbnRoLCB5ID0gZmF0YWxpdGllcywgZ3JvdXAgPSBzdWJfZXZlbnRfdHlwZSwgZmlsbCA9IHN1Yl9ldmVudF90eXBlKSkgKyANCiAgZ2VvbV9hcmVhKCkgKyANCiAgc2NhbGVfeF9kYXRlKGRhdGVfYnJlYWtzID0gIjEgbW9udGgiLCBsYWJlbHMgPSBkYXRlX2Zvcm1hdChmb3JtYXQgPSAiJVktJWIiKSkgKyANCiAgc2NhbGVfeV9jb250aW51b3VzKGJyZWFrcyA9IHNlcSgwLCAyMjAwMCwgYnkgPSAyMDAwKSwgbGFiZWxzID0gY29tbWEpICsNCiAgc2NhbGVfZmlsbF92aXJpZGlzX2Qob3B0aW9uID0gImluZmVybm8iKSArIA0KICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAidG9wIiwNCiAgICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSAzMCwgaGp1c3QgPSAxLCB2anVzdCA9IDEpLCANCiAgICAgICAgcGxvdC5jYXB0aW9uID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gLjUpKSArIA0KICBsYWJzKHggPSAiIiwgDQogICAgICAgeSA9ICJDdW11bGF0aXZlIGZhdGFsaXRpZXMiLCANCiAgICAgICBmaWxsID0gIiIsIA0KICAgICAgIHRpdGxlID0gIkN1bXVhbHRpdmUgMjAyMS0yMDIyIGNvbmZsaWN0LWZhdGFsaXRpZXMgcGVyIG1vbnRoLCBieSBzdWItZXZlbnQgdHlwZSIsIA0KICAgICAgIGNhcHRpb24gPSAiRGF0YSBzb3VyY2U6IEFybWVkIENvbmZsaWN0IExvY2F0aW9uICYgRXZlbnQgRGF0YSBQcm9qZWN0IChBQ0xFRCk7IGFjbGVkZGF0YS5jb20iKQ0KYGBgDQoNCjxicj4NCg0KQW5kIHRoZSByYXRpbyBvZiBwZWFjZWZ1bCBwcm90ZXN0cyB2ZXJzdXMgbm9uLXBlYWNlZnVsIGluY2lkZW50cyBvdmVyIHRpbWUuIFdoaWxzdCBwZWFjZWZ1bCBwcm90ZXN0cyBhcmUgZmFyIGZyb20gdGhlaXIgcGVhayBpbiBGZWJydXJhcnkgMjAyMSBvZiAxNTgyIGV2ZW50cyBvciA4NSUgb2YgdGhlIG1vbnRobHkgdG90YWwsIGFzIG9mIE1heSAyMDIyLCB0aGV5IHN0aWxsIHJlbWFpbmVkIGF0IDEyJSBvZiBhbGwgY29uZmxpY3QgZXZlbnRzIG9yIDE0OSBldmVudHMuIA0KDQo8YnI+DQoNCmBgYHtyIHBlYWNlZnVsLXByb3Rlc3RzLCBmaWcuaGVpZ2h0ID0gNn0NCmFjbGVkICU+JQ0KICBmaWx0ZXIoeWVhciA+PSAyMDIxKSAlPiUNCiAgbXV0YXRlKHBlYWNlZnVsX3Byb3Rlc3QgPSBpZmVsc2Uoc3ViX2V2ZW50X3R5cGUgPT0gIlBlYWNlZnVsIHByb3Rlc3QiLCAieWVzIiwgIm5vIikpICU+JSANCiAgZ3JvdXBfYnkoZXZlbnRfZGF0ZSwgcGVhY2VmdWxfcHJvdGVzdCkgJT4lIA0KICBzdW1tYXJpc2UoZXZlbnRzID0gbigpKSAlPiUgDQogIGdncGxvdChhZXMoeCA9IGV2ZW50X2RhdGUsIHkgPSBldmVudHMsIGZpbGwgPSBwZWFjZWZ1bF9wcm90ZXN0LCBncm91cCA9IHBlYWNlZnVsX3Byb3Rlc3QpKSArDQogIGdlb21fYXJlYShzaXplID0gMSkgKw0KICBzY2FsZV94X2RhdGUoZGF0ZV9icmVha3MgPSAiMSBtb250aCIsIGxhYmVscyA9IGRhdGVfZm9ybWF0KGZvcm1hdCA9ICIlWS0lYiIpKSArDQogIGxhYnMoeCA9ICIiLCANCiAgICAgICB5ID0gIk51bWJlciBvZiBjb25mbGljdCBldmVudHMiLCANCiAgICAgICB0aXRsZSA9ICJSYXRpbyBvZiBwZWFjZWZ1bCBwcm90ZXN0cyB0byBub24tcGVhY2VmdWwgaW5jaWRlbnRzIiwgDQogICAgICAgc3VidGl0bGUgPSAiMSBKYW4gMjAyMSAtIDMxIE1heSAyMDIyIiwgDQogICAgICAgY2FwdGlvbiA9ICJEYXRhIHNvdXJjZTogQXJtZWQgQ29uZmxpY3QgTG9jYXRpb24gJiBFdmVudCBEYXRhIFByb2plY3QgKEFDTEVEKTsgYWNsZWRkYXRhLmNvbSIpICsgDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJ0b3AiLA0KICAgICAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDMwLCBoanVzdCA9IDEsIHZqdXN0ID0gMSksIA0KICAgICAgICBwbG90LmNhcHRpb24gPSBlbGVtZW50X3RleHQoaGp1c3QgPSAuNSkpDQogIA0KYGBgDQoNCjxicj4gDQoNCkZvciBhIG1vcmUgY29tcHJlaGVuc2l2ZSByZXZpZXcgb2YgY29uZmxpY3QgaW4gTXlhbm1hciwgcGxlYXNlIHJlZmVyIHRvIHRoZSBGb29kIFNlY3VyaXR5IENsdXN0ZXIncyByZXBvcnQgW1VuZGVyc3RhbmRpbmcgQ29uZmxpY3QgRHluYW1pY3MgaW4gTXlhbm1hciB0aHJvdWdoIENvbmZsaWN0IGFuZCBJbmNpZGVudCBEYXRhOiBBIEZvb2QgU2VjdXJpdHkgUGVyc3BlY3RpdmVdKGh0dHBzOi8vZm9vZC1zZWN1cml0eS1jbHVzdGVyLW15YW5tYXIuZ2l0aHViLmlvL2V4cGxvcmF0b3J5LWRhdGEtYW5hbHlzaXMtYWNsZWQtZnNjLykuIEFuZCBmb3IgYSBtb3JlIGNvbXByZWhlbnNpdmUgcmV2aWV3IG9mIG11bHRpZGltZW5zaW9uYWwgdnVsbmVyYWJpbHR5IGluIE15YW5tYXIsIHBsZWFzZSByZWZlciB0byBNSU1VLUhBUlAncyBbVnVsbmVyYWJpbGl0eSBTdHVkeV0oaHR0cDovL3RoZW1pbXUuaW5mby9zaXRlcy90aGVtaW11LmluZm8vZmlsZXMvZG9jdW1lbnRzL1JlcG9ydF9WdWxuZXJhYmlsaXR5X2luX015YW5tYXJfSEFSUC1NSU1VX0p1bjIwMThfRU5HX1ByaW50X3ZlcnNpb24ucGRmKS4gIA0KDQo8YnI+PGJyPg0KDQojIyMgMS4xIENvbmZsaWN0IGV2ZW50cyBhbmQgZmF0YWxpdGllcyBieSBzdGF0ZS9yZWdpb24NCg0KYGBge3IgY29uZmljdC1zdGF0ZS1iYXJwbG90fQ0KY29uZmxpY3Rfc2NvcmUgJT4lIA0KICBzZWxlY3QoYWRtaW4zX3Bjb2RlLCBiYXR0bGVzLCBleHBsb3Npb25zX3JlbW90ZV92aW9sZW5jZSwgcHJvdGVzdHNfYW5kX3Jpb3RzLCANCiAgICAgICAgIHN0cmF0ZWdpY19kZXZlbG9wbWVudHMsIHZpb2xlbmNlX2FnYWluc3RfY2l2aWxpYW5zKSAlPiUgDQogIHBpdm90X2xvbmdlcihjb2xzID0gYyhiYXR0bGVzOnZpb2xlbmNlX2FnYWluc3RfY2l2aWxpYW5zKSwgbmFtZXNfdG8gPSAiZXZlbnRfdHlwZSIsIHZhbHVlc190byA9ICJ2YWx1ZSIpICU+JSANCiAgbGVmdF9qb2luKGZzX3BpbiAlPiUgc2VsZWN0KGFkbWluM19wY29kZSwgc3RhdGUpLCBieSA9ICJhZG1pbjNfcGNvZGUiKSAlPiUgDQogIHJlcGxhY2VfbmEobGlzdCh2YWx1ZSA9IDApKSAlPiUgDQogIGdncGxvdChhZXMoeCA9IGZjdF9yZW9yZGVyKHN0YXRlLCAtdmFsdWUsIC5mdW4gPSBzdW0pLCANCiAgICAgICAgICAgICB5ID0gdmFsdWUsIGZpbGwgPSBldmVudF90eXBlKSkgKyANCiAgZ2VvbV9jb2woKSArDQogIHNjYWxlX3lfY29udGludW91cyhsYWJlbHMgPSBjb21tYSkgKw0KICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDMwLCB2anVzdCA9IDAuNywgaGp1c3QgPSAwLjcpLCANCiAgICAgICAgcGxvdC5jYXB0aW9uID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41KSkgKw0KICBsYWJzKHggPSAiIiwgDQogICAgICAgeSA9ICJDb25mbGljdCBldmVudHMiLA0KICAgICAgIHRpdGxlID0gIkNvbmZsaWN0IGV2ZW50cyBieSBzdGF0ZSAoSmFuIDIwMjEgLSBNYXkgMjAyMikiLA0KICAgICAgIGNhcHRpb24gPSAiRGF0YSBzb3VyY2U6IEFDTEVEOyBhY2xlZGRhdGEuY29tIikNCg0KI2dnc2F2ZSgiZXZlbnRfdHlwZV9zdGF0ZS5wbmciLCBkcGkgPSAzMDAsIGhlaWdodCA9IDUsIHdpZHRoID0gOCwgdW5pdHMgPSAiaW4iKQ0KYGBgDQoNCjxicj4NCg0KU3RhcnRpbmcgYXQgdGhlIHN0YXRlL3JlZ2lvbiBsZXZlbCwgU2FnYWluZyBzYXcgdGhlIGhpZ2hlc3QgbnVtYmVyIG9mIGNvbmZsaWN0IGV2ZW50cyBhcyB3ZWxsIGFzIGNvbmZsaWN0IGFzIHdlbGwgYXMgY29uZmxpY3QtcmVsYXRlZCBmYXRhbGl0aWVzIGluIDIwMTIuIEl0IGV4cGVyaWVuY2VkIG1vcmUgdGhhbiB0aHJlZSB0aW1lcyBhcyBtYW55IGNvbmZsaWN0LXJlbGF0ZWQgZmF0YWxpdGllcyB0aGFuIHRoZSBuZXh0LWhpZ2hlc3Qgc3RhdGUvcmVnaW9uIC0tIE1hZ3dheS4gVGhpcyBpcyBhIHNpZ25pZmljYW50IHNoaWZ0IGluIHRoZSBwYXR0ZXJuIG9mIGNvbmZsaWN0IGluIE15YW5tYXIsIHdoaWNoIGhhcyB0cmFkaXRpb25hbGx5IHJldm9sdmVkIGFyb3VuZCBLYWNoaW4sIFJha2hpbmUgYW5kIFNoYW4uIA0KDQpLYXlhaCwgQ2hpbiBhbmQgU2FnYWluZyBoYWQgdGhlIGhpZ2hlc3QgbnVtYmVyIG9mIGNvbmZsaWN0IGZhdGFsaXRpZXMgcGVyIGNhcGl0YSBpbiAyMDIxLiANCg0KPGJyPg0KDQpgYGB7ciBjb25mbGljdC1mYXRhbGl0aWVzLWJhcnBsb3R9DQoNCmNvbmZsaWN0X3Njb3JlICU+JSANCiAgc2VsZWN0KGFkbWluM19wY29kZSwgZmF0YWxpdGllcykgJT4lIA0KICBsZWZ0X2pvaW4oZnNfcGluICU+JSBzZWxlY3QoYWRtaW4zX3Bjb2RlLCBzdGF0ZSwgcG9wdWxhdGlvbl8yMDIxX3Byb2opLCBieSA9ICJhZG1pbjNfcGNvZGUiKSAlPiUgDQogIGdyb3VwX2J5KHN0YXRlKSAlPiUgDQogIHN1bW1hcmlzZShmYXRhbGl0aWVzID0gc3VtKGZhdGFsaXRpZXMsIG5hLnJtID0gVFJVRSksIA0KICAgICAgICAgICAgcG9wID0gc3VtKHBvcHVsYXRpb25fMjAyMV9wcm9qKSkgJT4lIA0KICBtdXRhdGUoZmF0YWxpdGllc19wYyA9IGZhdGFsaXRpZXMgLyBwb3ApICU+JSANCiAgbXV0YXRlKHN0YXRlID0gZmN0X3Jlb3JkZXIoc3RhdGUsIC1mYXRhbGl0aWVzKSkgJT4lIA0KICBnZ3Bsb3QoYWVzKHggPSBzdGF0ZSwgeSA9IGZhdGFsaXRpZXMsIGZpbGwgPSBmYXRhbGl0aWVzX3BjKSkgKw0KICBnZW9tX2NvbCgpICsgDQogIHNjYWxlX2ZpbGxfdmlyaWRpcyhvcHRpb24gPSAibWFnbWEiLCBkaXJlY3Rpb24gPSAtMSkgKw0KICBzY2FsZV95X2NvbnRpbnVvdXMobGFiZWxzID0gY29tbWEpICsNCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSAzMCwgdmp1c3QgPSAwLjcsIGhqdXN0ID0gMC43KSwNCiAgICAgICAgcGxvdC5jYXB0aW9uID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41KSkgKw0KICBsYWJzKHggPSAiIiwNCiAgICAgICB5ID0gIk51bWJlciBvZiBmYXRhbGl0aWVzIiwgDQogICAgICAgdGl0bGUgPSAiQ29uZmxpY3QgZmF0YWxpdGllcyBieSBzdGF0ZSAoSmFuIDIwMjEgLSBNYXkgMjAyMikiLA0KICAgICAgIHN1YnRpdGxlID0iYW5kIGZhdGFsaXRpZXMgcGVyIGNhcGl0YSIsIA0KICAgICAgIGZpbGwgPSAiZmF0YWxpdGllc1xucGVyIGNhcGl0YSIsDQogICAgICAgY2FwdGlvbiA9ICJEYXRhIHNvdXJjZTogQUNMRUQ7IGFjbGVkZGF0YS5jb20iKQ0KDQojIGdnc2F2ZSgiZmF0YWxpdGllc19zdGF0ZS5wbmciLCBkcGkgPSAzMDAsIGhlaWdodCA9IDUsIHdpZHRoID0gOCwgdW5pdHMgPSAiaW4iKQ0KICANCmBgYA0KDQoNCjxicj48YnI+DQoNCiMjIyAxLjIgQ29uZmxpY3Qgc2NvcmUgYnkgdG93bnNoaXANCg0KQXMgY2FuIGJlIHNlZW0gZnJvbSB0aGUgc3RhdGUvcmVnaW9uIGJhcnBsb3RzIGluIHRoZSBwcmV2aW91cyBzZWN0aW9uLCB0aGUgZGlzdHJpYnV0aW9uIG9mIGNvbmZsaWN0IGV2ZW50cyBhbmQgZmF0YWxpdGllcyBpcyBub3QgZXZlbiwgYW5kIGlzIHNrZXdlZCB0b3dhcmRzIGEgZmV3IHN0YXRlcy9yZWdpb25zLiBUaGlzIGlzIGFsc28gZXZpZGVudCBhdCB0b3duc2hpcCBsZXZlbC4gSW4gdGhlIHNjYXR0ZXIgcGxvdCBiZWxvdywgdGhlIGF2ZXJhZ2VzIG9mIHRoZSBudW1iZXIgb2YgY29uZmxpY3QgZXZlbnRzIGFuZCB0aGUgbnVtYmVyIG9mIGZhdGFsaXRpZXMgYXQgdGhlIHRvd25zaGlwIGxldmVsIGhhdmUgYmVlbiBtYXJrZWQgYnkgdGhlIGRvdHRlZCByZWQgbGluZXMsIGRpdmlkaW5nIHRoZSBwbG90IGludG8gZm91ciBxdWFkcmFudHMuIA0KDQpUbyBiZXR0ZXIgZGlzY3JpbWluYXRlIGFtb25nc3QgdGhlIG51bWVyb3VzIHRvd25zaGlwcywgYSBjb25mbGljdCBzY29yZSBoYXMgYmVlbiBkZXZlbG9wZWQuIEEgcmVxdWlzaXRlIGZvciBhbnkgcHJpb3JpdGlzYXRpb24gc2NvcmUgb3IgaW5kZXggZm9yIGNvbmZsaWN0IHNob3VsZCBiZSB0aGUgYWJpbGl0eSB0byBkaXN0aW5ndWlzaCwgZmlyc3QgYW5kIGZvcmVtb3N0LCB0aGUgdG93bnNoaXBzIGluIHRoZSB1cHBlciByaWdodCBxdWFkcmFudCBvZiB0aGUgcGxvdCwgd2hpY2ggaGF2ZSB0aGUgaGVhdmllc3QgY29uY2VudHJhdGlvbnMgb2YgY29uZmxpY3QgZXZlbnRzIGFuZCBmYXRhbGl0aWVzLiBUaGVzZSBhcmVhcyBhcmUgYWxzbyB3aGVyZSwgYXMgd2UgaGF2ZSBlc3RhYmxpc2hlZCBpbiB0aGUgc2VjdGlvbiBvbiBiZW5lZmljaWFyeSBzZWxlY3Rpb24sIHdoZXJlIHRoZSBoaWdoZXN0IGNvbmNlbnRyYXRpb25zIG9mIGhvdXNlaG9sZHMgaW4gdGhlIHByaW9yaXR5IGdyb3VwIHdpbGwgYmUgZm91bmQuIEZvciByZWZlcmVuY2UsIDU4IHRvd25zaGlwcyBoYXZlIGJvdGggYWJvdmUtYXZlcmFnZSBudW1iZXJzIG9mIGNvbmZsaWN0IGV2ZW50cyBhbmQgZmF0YWxpdGllcyAodXBwZXItcmlnaHQgcXVhZHJhbnQpIGFuZCAxOTYgdG93bnNoaXBzIGhhdmUgYm90aCBiZWxvdy1hdmVyYWdlIG51bWJlcnMgb2YgY29uZmxpY3QgZXZlbnRzIGFuZCBmYXRhbGl0aWVzIChib3R0b20tbGVmdCBxdWFkcmFudCkuIA0KDQoNCjxicj4NCg0KYGBge3IgcGxvdGx5LWNvbmZsaWN0LXNjYXR0ZXJwbG90fQ0KY29uZmxpY3Rfc2NhdHRlciA8LSBjb25mbGljdF9zY29yZSAlPiUgDQogIG11dGF0ZSh0b3RhbF9ldmVudHMgPSBiYXR0bGVzICsgZXhwbG9zaW9uc19yZW1vdGVfdmlvbGVuY2UgKyBwcm90ZXN0c19hbmRfcmlvdHMgKyBzdHJhdGVnaWNfZGV2ZWxvcG1lbnRzICsNCiAgICAgICAgICAgdmlvbGVuY2VfYWdhaW5zdF9jaXZpbGlhbnMpICU+JSANCiAgbGVmdF9qb2luKGZzX3BpbiAlPiUgc2VsZWN0KHN0YXRlLCB0b3duc2hpcCwgYWRtaW4zX3Bjb2RlLCBwb3B1bGF0aW9uX2RlbnNpdHkpLCBieSA9ICJhZG1pbjNfcGNvZGUiKSAlPiUgDQogIG11dGF0ZShjb25mbGljdF9zY29yZSA9IHJvdW5kKGNvbmZsaWN0X3Njb3JlLCBkaWdpdHMgPSAzKSkgJT4lIA0KICBnZ3Bsb3QoYWVzKHkgPSBmYXRhbGl0aWVzLCB4ID0gdG90YWxfZXZlbnRzLCBjb2xvdXIgPSBjb25mbGljdF9zY29yZSwgDQogICAgICAgICAgICAgdGV4dCA9IHBhc3RlMCh0b3duc2hpcCwgIiwiLCAiXG4iLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUsICIsIiwgIlxuIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJjb25mbGljdF9zY29yZTogIiwgY29uZmxpY3Rfc2NvcmUsICIsIiwgIlxuIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAiZXZlbnRzOiAiLCB0b3RhbF9ldmVudHMsICIsIiwgIlxuIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJmYXRhbGl0aWVzOiAiLCBmYXRhbGl0aWVzKSkpICsNCiAgZ2VvbV9wb2ludChhZXMoc2l6ZSA9IGZhdGFsaXRpZXMpLCBhbHBoYSA9IDAuODUpICsNCiAgc2NhbGVfeV9jb250aW51b3VzKHRyYW5zID0gImxvZzEwIiwgYnJlYWtzID0gYygwLCAxLCAxMCwgMzAsIDEwMCwgMzAwLCAxMDAwKSkgKw0KICBzY2FsZV94X2NvbnRpbnVvdXModHJhbnMgPSAibG9nMTAiLCBicmVha3MgPSBjKDAsIDEsIDEwLCAzMCwgMTAwLCAzMDApKSArDQogIHNjYWxlX2NvbG91cl92aXJpZGlzKG9wdGlvbiA9ICJtYWdtYSIsIGRpcmVjdGlvbiA9IC0xKSArDQogIGdlb21faGxpbmUoYWVzKHlpbnRlcmNlcHQgPSBtZWFuKGZhdGFsaXRpZXMpKSwgY29sb3VyID0gInJlZCIsIGx0eSA9IDIpICsNCiAgZ2VvbV92bGluZShhZXMoeGludGVyY2VwdCA9IG1lYW4odG90YWxfZXZlbnRzKSksIGNvbG91ciA9ICJyZWQiLCBsdHkgPSAyKSArDQogIGxhYnMoeCA9ICJDb25mbGljdCBldmVudHMiLCANCiAgICAgICB5ID0gIkZhdGFsaXRpZXMiLA0KICAgICAgIHRpdGxlID0gIkNvbmZsaWN0IGV2ZW50cyBhbmQgZmF0YWxpdGllcyBieSB0b3duc2hpcCIsIA0KICAgICAgIHN1YnRpdGxlID0gIk1lYW5zIG9mIGJvdGggYXhlcyBhcmUgbWFya2VkIGJ5IHRoZSBkb3R0ZWQgcmVkIGxpbmUiLA0KICAgICAgIGNvbG91ciA9ICJjb25mbGljdFxuc2NvcmUiLCANCiAgICAgICBzaXplID0gImZhdGFsaXRpZXMiLA0KICAgICAgIGNhcHRpb24gPSAiRGF0YSBzb3VyY2U6IEFDTEVEOyBhY2xlZGRhdGEuY29tIikgDQoNCmdncGxvdGx5KGNvbmZsaWN0X3NjYXR0ZXIsIHRvb2x0aXAgPSBjKCJ0ZXh0IiksIHdpZHRoID0gODIwKSAlPiUgDQogICMgbGF5b3V0KHNob3dsZWdlbmQgPSBGQUxTRSwgbGVnZW5kID0gbGlzdChmb250ID0gbGlzdChzaXplID0gNikpKSAlPiUgDQogIGNvbmZpZyhkaXNwbGF5TW9kZUJhciA9IEZBTFNFKSAlPiUgDQogIGxheW91dCh0aXRsZSA9IGxpc3QodGV4dCA9IHBhc3RlMCgiQ29uZmxpY3QgZXZlbnRzIGFuZCBmYXRhbGl0aWVzIGJ5IHRvd25zaGlwIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI8YnI+IiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI8c3VwPiIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibW91c2Ugb3ZlciBmb3IgZGV0YWlsczsgbWVhbnMgbWFya2VkIGJ5IHJlZCBsaW5lczsgZmF0YWxpdGllcyBtYXJrZWQgYnkgc2l6ZSIsIjwvc3VwPiIpKSkNCg0KIyBnZ3NhdmUoInRzcF9zY2F0dGVyX2NvbmZsaWN0LnBuZyIsIGRwaSA9IDMwMCwgaGVpZ2h0ID0gNSwgd2lkdGggPSA4LCB1bml0cyA9ICJpbiIpDQoNCmBgYA0KDQo8YnI+DQoNCkF0IGl0cyBtb3N0IGJhc2ljLCB0aGUgY29uZmxpY3Qgc2NvcmUgaXMganVzdCB0aGUgYXZlcmFnZSBvZiBiYXR0bGVzLCBleHBsb3Npb25zLCByZW1vdGUgdmlvbGVuY2UsIHZpb2xlbmNlIGFnYWluc3QgY2l2aWxpYW5zLCBzdHJhdGVnaWMgZGV2ZWxvcG1lbnRzLCBub24tcGVhY2VmdWwgcHJvdGVzdHMgYW5kIHJpb3RzLCBjb25mbGljdC1yZWxhdGVkIGZhdGFsaXRpZXMgYW5kIElEUHMgKHJlZmVyIHRvIHNlY3Rpb24gNC41IGZvciBtb3JlIGRldGFpbHMpLiBBZGRpdGlvbmFsIGluZm9ybWF0aW9uIGNhbiBhbHNvIGJlIGZvdW5kIGluIHRoZSBGU0MncyByZXBvcnQgW1VuZGVyc3RhbmRpbmcgQ29uZmxpY3QgRHluYW1pY3MgaW4gTXlhbm1hciB0aHJvdWdoIENvbmZsaWN0IGFuZCBJbmNpZGVudCBEYXRhOiBBIEZvb2QgU2VjdXJpdHkgUGVyc3BlY3RpdmVdKGh0dHBzOi8vZm9vZC1zZWN1cml0eS1jbHVzdGVyLW15YW5tYXIuZ2l0aHViLmlvL2V4cGxvcmF0b3J5LWRhdGEtYW5hbHlzaXMtYWNsZWQtZnNjLykuIFRoaXMgc2NvcmUgd2lsbCBiZSBub3cgYmUgdXNlZCBhcyBhIHNob3J0aGFuZCBmb3IgY29uZmxpY3QgaW5jaWRlbmNlIGluIE15YW5tYXIgZ29pbmcgZm9yd2FyZC4gDQoNCjxicj48YnI+DQoNCiMjIyAxLjMgQ29tcGFyaXNvbiB3aXRoIG11bHRpZGltZW5zaW9uYWwgdnVsbmVyYWJpbGl0eQ0KDQpDb25mbGljdCwgaW4gc3BpdGUgb2YgaXRzIG91dC1zaXplZCByb2xlIGluIHRoZSBjcmlzaXMgaW4gTXlhbm1hciwgY2Fubm90IHNlcnZlIGFzIHRoZSBvbmx5IGRldGVybWluYW50IG9mIGdlb2dyYXBoaWMgcHJpb3JpdGlzYXRpb24uIEluIG9yZGVyIHRvIGNvbnNpZGVyIG90aGVyIGZhY3RvcnMsIHRoaXMgZG9jdW1lbnQgd2lsbCBtYWtlIHVzZSBvZiB0aGUgTUlNVS1IQVJQIFZ1bG5lcmFiaWxpdHkgSW5kZXgsIHdoaWNoIGlzIGNvbXByaXNlZCBvZiA4IGluZGljYXRvcnMsIHNlbGVjdGVkIGZvciB0aGVpciBhYmlsaXR5IHRvIHByZWRpY3QgdGhlIHJlc3Qgb2YgdGhlIHZhcmlhYmxlcyBpbiB0aGUgMjAxNCBDZW5zdXMgZGF0YXNldC4gU2V2ZXJhbCBvZiB0aGVzZSB2YXJpYWJsZXMgd2VyZSBhbHNvIGNvbGxlY3RlZCBhdCBkaXN0cmljdC1sZXZlbCBhbmQgd2VyZSB1c2VkIHRvIGNyZWF0ZSBhbiB1cGRhdGVkIDIwMTkgVnVsbmVyYWJpbGl0eSBpbmRleC4gDQoNClRoZSBzcGVjaWZpYyBpbmRpY2F0b3JzIGNob3NlbiB3ZXJlOiANCg0KKiAlIG9mIHBvcHVsYXRpb24gd2l0aG91dCBmb3JtYWwgaWRlbnRpZmljYXRpb24gZG9jdW1lbnRzDQoqICUgb2YgcG9wdWxhdGlvbiB3aXRob3V0IGEgbWlkZGxlIHNjaG9vbCBlZHVjYXRpb24NCiogJSBvZiBmZW1hbGVzIHdobyB3ZXJlIGlsbGl0ZXJhdGUNCiogJSBvZiBob3VzZWhvbGRzIHdpdGggYmFtYm9vIG9yIHRoYXRjaGVkIHJvb2ZzDQoqICUgb2YgaG91c2Vob2xkcyB3aXRoIHNhZmUgc2FuaXRhdGlvbg0KKiAlIG9mIGhvdXNlaG9sZHMgd2l0aCBhY2Nlc3MgdG8gZWxlY3RyaWNpdHkNCiogJSBvZiB3b3JrZXJzIHdobyBhcmUgdW5wYWlkIGZhbWlseSB3b3JrZXJzDQoqIFRoZSBjaGlsZCBkZXBlbmRlbmN5IHJhdGlvDQoqIFRoZSBjb25mbGljdCBzY29yZSAocmVmZXIgdG8gcHJldmlvdXMgc2VjdGlvbikNCg0KVGhlc2UgaW5kaWNhdG9ycyB3ZXJlIGNvbWJpbmVkIHRvIGNvbnN0cnVjdCBhIHRvd25zaGlwLWxldmVsIHZ1bG5lcmFiaWxpdHkgaW5kZXguIE9mIHRoZSBpbmRpY2F0b3JzIGFib3ZlLCBvbmx5IHRoZSBwZXJjZW50YWdlIG9mIHRoZSBwb3B1bGF0aW9uIHdpdGhvdXQgYSBtaWRkbGUtc2Nob29sIGVkdWNhdGlvbiBhbmQgcGVyY2VudGFnZSBvZiB0aGUgcG9wdWxhdGlvbiB3aXRob3V0IGZvcm1hbCBpZGVudGlmaWNhdGlvbiBkb2N1bWVudHMgd2VyZSBub3QgY29sbGVjdGVkIGluIHRoZSAyMDE5IEludGVyLUNlbnNhbCBzdXJ2ZXkuIA0KDQpGb3IgdGhlIHJlbWFpbmluZyBpbmRpY2F0b3JzLCB0aGV5IHdlcmUgYm9vdHN0cmFwcGVkIHVzaW5nIHRoZWlyIDIwMTQgdG93bnNoaXAgdmFsdWVzIGFuZCB0aGUgMjAxOSBkaXN0cmljdC1sZXZlbCBkYXRhLiBHb2luZyBmb3J3YXJkLCB0aGUgZmlyc3Qgc2V2ZW4gY29tcG9uZW50cyBvZiB0aGUgaW5kZXggd2lsbCBiZSBleHRyYWN0ZWQgYW5kIHRyZWF0ZWQgc2VwYXJhdGVseSBhcyBhIHNob3J0aGFuZCBmb3IgcHJlLWV4aXN0aW5nIG11bHRpZGltZW5zaW9uYWwgdnVsbmVyYWJpbGl0eSBpbiBNeWFubWFyLiANCg0KSG93ZXZlciwgdGhlIGVpZ2h0aCBjb21wb25lbnQgb2YgdGhlIHZ1bG5lcmFiaWxpdHkgaW5kZXgsIHRoZSBjb25mbGljdCBpbmRleCwgZmlyc3QgY29uc3RydWN0ZWQgaW4gMjAxNCBmcm9tIEFDTEVEIGRhdGEsIGNhbiBhbmQgaGFzIGJlZW4gdXBkYXRlZCB3aXRoIG1vcmUgcmVjZW50IGRhdGEgLS0gdGhpcyB3YXMgZG9uZSBpbiB0aGUgcHJldmlvdXMgc2VjdGlvbi4gVGhlIHNwZWNpZmljIGluZGljYXRvcnMgdXNlZCBpbiB0aGUgY29uc3RydWN0aW9uIG9mIHRoZSBjb25mbGljdCBzY29yZSB3ZXJlOg0KDQoqIE51bWJlciBvZiBJRFBzDQoqIE51bWJlciBvZiBjb25mbGljdCBmYXRhbGl0aWVzDQoqIE51bWJlciBvZiBCYXR0bGVzDQoqIE51bWJlciBvZiBpbmNpZGVudHMgb2YgZXhwbG9zaW9ucyBhbmQgcmVtb3RlIHZpb2xlbmNlDQoqIE51bWJlciBvZiBpbmNpZGVudHMgb2YgdmlvbGVuY2UgYWdhaW5zdCBjaXZpbGlhbnMNCiogTnVtYmVyIG9mIHN0cmF0ZWdpYyBkZXZlbG9wbWVudHMgKGluY2x1ZGVzIGFycmVzdHMpIA0KKiBOdW1iZXIgb2Ygbm9uLXBlYWNlZnVsIHByb3Rlc3RzIGFuZCByaW90cw0KDQpGb3IgbW9yZSBpbmZvcm1hdGlvbiwgcGxlYXNlIHJlZmVyIHRoZSB0ZWNobmljYWwgbm90ZXMgYXQgdGhlIGVuZCBvZiB0aGUgZG9jdW1lbnQuIA0KDQpUaGlzIG5leHQgZmV3IHNlY3Rpb25zIHdpbGwgZXhhbWluZSB0aGUgcmVsYXRpb25zaGlwIGJldHdlZW4gdW5kZXJkZXZlbG9wbWVudCBhbmQgdGhlIHVwZGF0ZWQgMjAyMSBjb25mbGljdCBzY29yZSBhbmQgdGhlIHJlc3VsdGluZyBpbXBsaWNhdGlvbnMgb24gZ2VvZ3JhcGhpYyBwcmlvcml0aXNhdGlvbiBmb3IgdGhlIEZvb2QgU2VjdXJpdHkgQ2x1c3Rlci4gDQoNCkZyb20gdGhlIHNjYXR0ZXIgcGxvdCBiZWxvdywgdW5kZXJkZXZlbG9wbWVudCBhbmQgcHJlLWV4aXN0aW5nIHZ1bG5lcmFiaWxpdHkgYW5kIGNvbmZsaWN0IGFyZSBub3QgZ29vZCBwcmVkaWN0b3JzIG9mIGVhY2ggb3RoZXIuIFRoZSBwb2ludHMgaW4gdGhlIHBsb3QgYmVsb3csIGVhY2ggcmVwcmVzZW50aW5nIGEgdG93bnNoaXAsIHNwbGl0IGxhcmdlbHkgYWNyb3NzIHR3byBhcmNzIC0tIHdpdGggdG93bnNoaXBzIHdpdGggaGlnaCBjb25mbGljdCBzY29yZXMgbGFyZ2VseSBmYWxsaW5nIGFyb3VuZCB0aGUgbWVkaWFuIGZvciBtdWx0aWRpbWVuc2lvbmFsIHZ1bG5lcmFiaWxpdHkgYW5kIHRvd25zaGlwcyB3aXRoIHZlcnkgaGlnaCBtdWx0aWRpbWVuc2lvbmFsIHZ1bG5lcmFiaWxpdHkgdGVuZGluZyB0byBoYXZlIGxvd2VyIGNvbmZsaWN0IHNjb3Jlcy4gDQoNCjxicj4NCg0KYGBge3IgcGxvdGx5LW1kcC1zY2F0dGVyfQ0KbWRwX3NjYXR0ZXIgPC0gZnNfcGluICU+JSAgDQogIG11dGF0ZSh0b3RhbF9ldmVudHMgPSBiYXR0bGVzICsgZXhwbG9zaW9uc19yZW1vdGVfdmlvbGVuY2UgKyBwcm90ZXN0c19hbmRfcmlvdHMgKyBzdHJhdGVnaWNfZGV2ZWxvcG1lbnRzICsNCiAgICAgICAgICAgdmlvbGVuY2VfYWdhaW5zdF9jaXZpbGlhbnMpICU+JQ0KICBmaWx0ZXIoY29uZmxpY3Rfc2NvcmUgIT0gMCkgJT4lDQogIGdncGxvdChhZXMoeCA9IG1kcF9hZGp1c3QsIHkgPSBjb25mbGljdF9zY29yZSwgY29sb3VyID0gY29uZmxpY3Rfc2NvcmUpKSArIA0KICBnZW9tX2hsaW5lKGFlcyh5aW50ZXJjZXB0ID0gbWVkaWFuKGNvbmZsaWN0X3Njb3JlKSksIGNvbG91ciA9ICJyZWQiLCBsdHkgPSAyKSArIA0KICBnZW9tX3ZsaW5lKGFlcyh4aW50ZXJjZXB0ID0gbWVkaWFuKG1kcF9hZGp1c3QpKSwgY29sb3VyID0gInJlZCIsIGx0eSA9IDIpICsNCiAgZ2VvbV9zbW9vdGgoc2UgPSBGQUxTRSwgc2l6ZSA9IC41KSArDQogIGdlb21fcG9pbnQoYWVzKHNpemUgPSBwb3B1bGF0aW9uXzIwMjFfcHJvaiwgDQogICAgICAgICAgICAgICAgIHRleHQgPSBwYXN0ZTAodG93bnNoaXAsICIsIiwgIlxuIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLCAiLCIsICJcbiIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAiZXZlbnRzOiAiLCB0b3RhbF9ldmVudHMsICIsIiwgIlxuIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJmYXRhbGl0aWVzOiAiLCBmYXRhbGl0aWVzLCAiLCIsICJcbiIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAiY29uZmxpY3Rfc2NvcmU6ICIsIHJvdW5kKGNvbmZsaWN0X3Njb3JlLCBkaWdpdHMgPSAzKSwgIiwiLCAiXG4iLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJtZF92dWxuZXJhYmlsaXR5OiAiLCByb3VuZChtZHBfYWRqdXN0LCBkaWdpdHMgPSAzKSkpLA0KICAgICAgICAgICAgIGFscGhhID0gLjcpICsNCiAgc2NhbGVfY29sb3VyX3ZpcmlkaXMoZGlyZWN0aW9uID0gLTEsIGVuZCA9IC45NSkgKyANCiAgc2NhbGVfeF9jb250aW51b3VzKHRyYW5zID0gImxvZzEwIikgKyANCiAgc2NhbGVfeV9jb250aW51b3VzKHRyYW5zID0gImxvZzEwIikgKyANCiAgbGFicyh4ID0gIk11bHRpZGltZW5zaW9uYWwgdnVsbmVyYWJpbGl0eSAoMjAxOSkiLCB5ID0gIkNvbmZsaWN0IHNjb3JlICgyMDIyKSIsIGNvbG91ciA9ICJjb25mbGljdFxuc2NvcmUiLCANCiAgICAgICB0aXRsZSA9ICJNdWx0aWRpbWVuc2lvbmFsIHZ1bG5lcmFiaWxpdHkgYW5kIGNvbmZsaWN0IGJ5IHRvd25zaGlwIiwgDQogICAgICAgc3VidGl0bGUgPSAiQXZlcmFnZXMgbWFya2VkIGJ5IHJlZCBsaW5lczsgcG9wdWxhdGlvbiBtYXJrZWQgYnkgc2l6ZSIpDQoNCmdncGxvdGx5KG1kcF9zY2F0dGVyLCB0b29sdGlwID0gYygidGV4dCIpLCB3aWR0aCA9IDgyMCwgaGVpZ2h0ID0gNTUwKSAlPiUgDQogICMgbGF5b3V0KHNob3dsZWdlbmQgPSBGQUxTRSwgbGVnZW5kID0gbGlzdChmb250ID0gbGlzdChzaXplID0gNikpKSAlPiUgDQogIGNvbmZpZyhkaXNwbGF5TW9kZUJhciA9IEZBTFNFKSAlPiUgDQogIGxheW91dCh0aXRsZSA9IGxpc3QodGV4dCA9IHBhc3RlMCgiTXVsdGlkaW1lbnNpb25hbCB2dWxuZXJhYmlsaXR5IGFuZCBjb25mbGljdCBieSB0b3duc2hpcCIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPGJyPiIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPHN1cD4iLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkF2ZXJhZ2VzIG1hcmtlZCBieSByZWQgbGluZXM7IHBvcHVsYXRpb24gbWFya2VkIGJ5IHNpemUiLCI8L3N1cD4iKSkpDQpgYGANCg0KPGJyPg0KDQpUaGlzIGlzIGEgcmVmbGVjdGlvbiBvZiB0aGUgc2hpZnQgaW4gY29uZmxpY3QgYXdheSBmcm9tIGZyb250aWVyIGFyZWFzIHRvIGNpdGllcyBhbmQgdG93bnMgdGhhdCBoYXZlIG1vcmUgc3RyYXRlZ2ljIHRhcmdldHMuIFRoZSBicm9hZGVyIGludm9sdmVtZW50IG9mIHRoZSBCYW1hciBtYWpvcml0eSBpbiB0aGUgY29uZmxpY3QgaGFzIGxpa2VseSBhbHNvIGNvbnRyaWJ1dGVkIHRvIHRoaXMgc2hpZnQgLS0gcHJpb3IgdG8gdGhlIEZlYnJ1YXJ5IDIwMjEgY291cCwgdGhlIGNvbmZsaWN0IHdhcyBsYXJnZWx5IGJldHdlZW4gRXRobmljIEFybWVkIE9yZ2FuaXNhdGlvbnMgYW5kIHRoZSBNeWFubWFyIEFybWVkIEZvcmNlcy4gSG93ZXZlciwgY29tYmF0YW50cyBhcmUgbm93IHNwcmVhZCB0aHJvdWdob3V0IHRoZSBwb3B1bGF0aW9ucywgZXNwZWNpYWxseSB3aXRoIHRoZSBwcm9saWZlcmF0aW9uIG9mIHRoZSBQZW9wbGUncyBEZWZlbmNlIEZvcmNlcy4gDQoNCkl0IGhhcyBiZWVuIFtvYnNlcnZlZF0oaHR0cHM6Ly93d3cuaXJyYXdhZGR5LmNvbS9uZXdzL2J1cm1hL2thY2hpbi1pbmRlcGVuZGVuY2UtYXJteS1wZGZzLWF0dGFjay1teWFubWFyLWp1bnRhLWJhc2VzLWluLWthY2hpbi1zdGF0ZS5odG1sKSB0aGF0IEV0aG5pYyBBcm1lZCBPcmdhbmlzYXRpb25zLCBzdWNoIGFzIHRoZSBLYWNoaW4gSW5kZXBlbmRlbmNlIEFybXksIGFyZSB3b3JraW5nIGNsb3NlbHkgd2l0aCB0aGUgUGVvcGxlJ3MgRGVmZW5jZSBGb3JjZXMsIGFuZCBhcmUgdHJhaW5pbmcgYW5kIGFybWluZyB0aGVtLiBUaGlzIGhhcyBjb250cmlidXRlZCB0byB0aGUgZnJvbnQgYmVpbmcgbW92ZWQgZnVydGhlciBmb3J3YXJkLCBvdXRzaWRlIG9mIHRoZSBhcmVhcyB0aGF0IGhhZCBiZWVuIHRyYWRpdGlvbmFsbHkgbW9zdCBhZmZlY3RlZCBieSBjb25mbGljdC4NCg0KPGJyPjxicj4NCg0KIyMjIDEuNCAyMDE0IHZ1bG5lcmFiaWxpdHkgYmFuZHMNCg0KVGhpcyBzaGlmdCBpbiBjb25mbGljdCBwYXR0ZXJucyBjYW4gYmUgZnVydGhlciBleGFtaW5lZCBieSBjb25zaWRlcmluZyB0aGUgdnVsbmVyYWJpbGl0eSBiYW5kcyBkZXZlbG9wZWQgYnkgTUlNVS1IQVJQIGFsb25nc2lkZSBpdHMgdnVsbmVyYWJpbGl0eSBpbmRleC4gSW4gYWRkaXRpb24gdG8gYW4gb3ZlcmFsbCB2dWxuZXJhYmlsaXR5IHNjb3JlIHBlciB0b3duc2hpcCwgOCBtYWluIHR5cG9sb2dpZXMgb2YgdnVsbmVyYWJpbGl0eSB3ZXJlIGFsc28gY29uc3RydWN0ZWQgdG8gaWxsdXN0cmF0ZSB0aGUgd2lkZSB2YXJpYXRpb24gb2YgY29udGV4dHMgYW5kIG5lZWRzIGluIHRoZSBkaWZmZXJlbnQgcGFydHMgb2YgdGhlIGNvdW50cnkgYXMgd2VsbCBhcyB0byBncm91cCB0b2dldGhlciBzaW1pbGFyIHRvd25zaGlwcyBzbyB0aGF0IHRoZXkgbWF5IGJlIGNvbnNpZGVyZWQgYXMgc2VwYXJhdGUgcHJvZ3JhbW1pbmcgYmxvY3MuIFBsZWFzZSByZWZlciB0byB0aGUgW01JTVUtSEFSUCBWdWxuZXJhYmlsaXR5IFN0dWR5XShodHRwOi8vdGhlbWltdS5pbmZvL3NpdGVzL3RoZW1pbXUuaW5mby9maWxlcy9kb2N1bWVudHMvUmVwb3J0X1Z1bG5lcmFiaWxpdHlfaW5fTXlhbm1hcl9IQVJQLU1JTVVfSnVuMjAxOF9FTkdfUHJpbnRfdmVyc2lvbi5wZGYpIGZvciBtb3JlIGRldGFpbHMuIA0KDQpBY2NvcmRpbmcgdG8gTUlNVS1IQVJQLCB0aGUgcmVzdWx0IG9mIHRoaXMgZ3JvdXBpbmcgaXMgYSAibGVucyBhbGxvd2luZyB0aGUgbW9zdCB2dWxuZXJhYmxlIHRvIGJlIGNvbnNpZGVyZWQgbW9yZSBtZXRob2RpY2FsbHkgaW4gcG9saWN5IGFuZCBwcm9ncmFtbWUgcGxhbm5pbmciLiBCeSB1c2luZyB0aGVzZSA4IHR5cG9sb2dpZXMgYXMgYSByZWZlcmVuY2UsIGl0IGlzIHBvc3NpYmxlIHRvIHVuZGVyc3RhbmQgaG93IHRoZSBwYXR0ZXJuIG9mIGNvbmZsaWN0IGhhcyBjaGFuZ2VkIGJldHdlZW4gMjAxNCBhbmQgMjAyMS4gDQoNCjxicj4NCg0KYGBge3IgdGFibGUtYmFuZHMtY29tcGFyaXNvbn0NCmZzX3BpbiAlPiUgIA0KICBtdXRhdGUob2xkX2NvbmZsaWN0X3Njb3JlID0gMSAtIG9sZF9jb25mbGljdF9zY29yZSwgDQogICAgICAgICBjb3VudCA9IDEsIA0KICAgICAgICAgYWJvdmVfY29uZmxpY3RfbWVhbiA9IGlmZWxzZShjb25mbGljdF9lbnYgPj0gMC4xMjYxMDg0LCAxLCAwKSwNCiAgICAgICAgIGFib3ZlX2NvbmZsaWN0X21lYW5fb2xkID0gaWZlbHNlKG9sZF9jb25mbGljdF9lbnYgPj0gMC4wMTUwNDg3MiwgMSwgMCkpICU+JQ0KICBncm91cF9ieShiYW5kX3RleHQpICU+JSANCiAgc3VtbWFyaXNlKGAyMDE5X3Z1bG5lcmFiaWxpdHlgID0gbWVhbihtZHBfYWRqdXN0KSwgICAgICAgICANCiAgICAgICAgICAgIG9sZF9jb25mbGljdF9zY29yZSA9IG1lYW4ob2xkX2NvbmZsaWN0X2VudiksIA0KICAgICAgICAgICAgY29uZmxpY3Rfc2NvcmUgPSBtZWFuKGNvbmZsaWN0X2VudiksDQogICAgICAgICAgICB0c3BfY291bnQgPSBuKCksDQogICAgICAgICAgICB0c3BfYWJvdmVfbWVhbl8yMDE1ID0gc3VtKGFib3ZlX2NvbmZsaWN0X21lYW5fb2xkID09IDEpLCANCiAgICAgICAgICAgIHRzcF9hYm92ZV9tZWFuXzIwMjEgPSBzdW0oYWJvdmVfY29uZmxpY3RfbWVhbiA9PSAxKSkgJT4lDQogIG11dGF0ZShwY19hYm92ZV9tZWFuXzIwMTUgPSByb3VuZCh0c3BfYWJvdmVfbWVhbl8yMDE1IC8gdHNwX2NvdW50ICogMTAwLCBkaWdpdHMgPSAyKSwgDQogICAgICAgICBwY19hYm92ZV9tZWFuXzIwMjEgPSByb3VuZCh0c3BfYWJvdmVfbWVhbl8yMDIxIC8gdHNwX2NvdW50ICogMTAwLCBkaWdpdHMgPSAyKSkgJT4lIA0KICBzZWxlY3QoLXRzcF9hYm92ZV9tZWFuXzIwMTUsIC10c3BfYWJvdmVfbWVhbl8yMDIxKSAlPiUgDQogIG11dGF0ZV9hdCh2YXJzKGNvbmZsaWN0X3Njb3JlLCBvbGRfY29uZmxpY3Rfc2NvcmUsIGAyMDE5X3Z1bG5lcmFiaWxpdHlgKSwgfiByb3VuZCgueCwgZGlnaXRzID0gMykpICU+JQ0KICByZW5hbWUodnVsbmVyYWJpbGl0eV9iYW5kID0gYmFuZF90ZXh0LCANCiAgICAgICAgIGAyMDE1X3Njb3JlYCA9IG9sZF9jb25mbGljdF9zY29yZSwgDQogICAgICAgICBgMjAyMl9zY29yZWAgPSBjb25mbGljdF9zY29yZSwgDQogICAgICAgICBgJV8+YXZnXzIwMTVgID0gcGNfYWJvdmVfbWVhbl8yMDE1LCANCiAgICAgICAgIGAlXz5hdmdfMjAyMWAgPSBwY19hYm92ZV9tZWFuXzIwMjEpICU+JSANCiAga2FibGUoY2FwdGlvbiA9ICJDaGFuZ2VzIGluIGNvbmZsaWN0IHBhdHRlcm5zIGJldHdlZW4gMjAxNSBhbmQgMjAyMSwgYnkgdnVsbmVyYWJpbHR5IGJhbmQiKSAlPiUgDQogIGthYmxlX2NsYXNzaWNfMigic3RyaXBlZCIpICU+JSANCiAgZm9vdG5vdGUoIkRhdGEgc291cmNlOiBBQ0xFRCAoYWNjbGVkZGF0YS5jb20pIGFuZCBNSU1VOyBoaWdoZXIgc2NvcmVzIGluZGljYXRlIG1vcmUgdnVsbmVyYWJpbGl0eS9jb25mbGljdCIsIGdlbmVyYWxfdGl0bGUgPSAiIikgJT4lIA0KICBhZGRfaGVhZGVyX2Fib3ZlKGMoIiAiID0gMiwgImNvbmZsaWN0IHNjb3JlIiA9IDIsICJ0b3duc2hpcHMgYWJvdmUgYXZnIGNvbmZsaWN0IHNjb3JlIiA9IDMpKQ0KDQpgYGANCg0KPGJyPg0KDQoNCkNvbmZsaWN0LCBvbmNlIG11Y2ggbW9yZSBjb25jZW50cmF0ZWQgaW4gdW5kZXJkZXZlbG9wZWQgZnJvbnRpZXIgYXJlYXMgaW4gdGhlIG9wZXJhdGlvbmFsIGFyZWFzIG9mIEV0aG5pYyBBcm1lZCBPcmdhbmlzYXRpb25zLCBpcyBub3cgbXVjaCBtb3JlIHByb25vdW5jZWQgaW4gYmFuZHMgMywgNiBhbmQgOCwgd2hpY2ggY29udGFpbiBtYWpvciBwb3B1bGF0aW9uIGNlbnRyZXMgYW5kIHNlY29uZGFyeSBjaXRpZXMgYW5kIHRvd25zLiBIdWJzIGluIGNvbmZsaWN0LWFmZmVjdGVkIGFyZWFzIGhhdmUgdGhlIGhpZ2hlc3QgYXZlcmFnZSAyMDIxIGNvbmZsaWN0IHNjb3Jlcy4gDQoNCkFsdGhvdWdoIGNvbmZsaWN0IGhhcyBwZXJzaXN0ZWQgb3IgZXZlbiBpbmNyZWFzZWQgaW4gbWFueSBvZiB0aGUgZnJvbnRpZXIgYW5kIHJlbW90ZSBhcmVhcyBzdWNoIGFzIExhdWtrYWluZywgTW9uZ3lhaSBhbmQgVGFuZ3lhbiAoYWxsIGZyb20gYmFuZCAxKSwgdGhlIHJlbGF0aXZlIHJhbmtpbmdzIG9mIHRoZXNlIGFyZWFzIGhhdmUgY2hhbmdlZCBhbmQgdGhleSBub3cgZm9ybSBhIG11Y2ggc21hbGxlciBzaGFyZSBvZiB1bmlvbndpZGUgY29uZmxpY3QgdGhhbiB0aGV5IGRpZCBpbiAyMDE1LiBUaGVzZSB0b3duc2hpcHMgdGVuZCB0byBoYXZlIG11Y2ggbG93ZXIgY29uZmxpY3Qgc2NvcmVzIGluIHNwaXRlIG9mIHRoZWlyIGhpZ2ggdnVsbmVyYWJpbGl0eSwgaW5kaWNhdGluZyB0aGF0IHdoaWxzdCB0aGV5IHJlbWFpbiBkZXZlbG9wbWVudCBwcmlvcml0aWVzLCB0aGV5IHNob3VsZCBmYWxsIG91dHNpZGUgdGhlIGNhc2Vsb2FkIGZvciBodW1hbml0YXJpYW4gYWN0aW9uLiBJdCBpcyByZWNvbW1lbmRlZCB0aGF0IG5ldyB2dWxuZXJhYmlsaXR5IGJhbmRzIGJlIHJlLWRldmVsb3BlZCwgYXMgdGhleSBoYXZlIHByb3ZlZCB2ZXJ5IHVzZWZ1bDsgYnV0IHRoYXQgaXMgb3V0c2lkZSB0aGUgc2NvcGUgb2YgdGhpcyBkb2N1bWVudC4gIA0KDQo8YnI+PGJyPg0KDQojIyMgMS41IENsdXN0ZXJpbmcgdG93bnNoaXBzDQoNCkluIHJlY29nbml0aW9uIG9mIHRoZSBkaWZmZXJlbnQgY29udGV4dHMgcHJlc2VudCBpbiBNeWFubWFyIChhbmQgdGhlIGNvbnNlcXVlbnQgbmVlZCBmb3IgZGlmZmVyZW50IHByb2dyYW1taW5nIG9wdGlvbnMpLCBhIHNpbXBsZSBLLW1lYW5zIGNsdXN0ZXJpbmcgd2FzIGNvbmR1Y3RlZCBvbiB0aGUgdG93bnNoaXBzIHRvIHNwbGl0IHRoZW0gaW50byBwcmlvcml0aXNhdGlvbiBncm91cHMgYmFzZWQgb24gdGhlaXIgMjAyMSBjb25mbGljdCBzY29yZSwgdGhlaXIgMjAxOSB2dWxuZXJhYmlsaXR5IHNjb3JlIGFuZCB0aGVpciBwb3B1bGF0aW9uIGRlbnNpdHkuIA0KDQpUaGlzIGNsdXN0ZXJpbmcgc2VwYXJhdGVzIGFsbCAzMzAgdG93bnNoaXBzIGludG8gZml2ZSBncm91cHMuIFRoZSBwbG90cyBiZWxvdyBzaG93IHRoZSBzcHJlYWQgb2YgdG93bnNoaXBzIGJ5IHByaW9yaXRpc2F0aW9uIGdyb3VwIGFjcm9zcyB0aGUgMjAyMSBjb25mbGljdCBzY29yZSwgMjAxOSB2dWxuZXJhYmlsaXR5IHNjb3JlIGFuZCBwb3B1bGF0aW9uIGRlbnNpdHkuIA0KDQo8YnI+DQoNCmBgYHtyIHBhdGNod29yay1jbHVzdGVyc30NCg0KcmV2ZXJzZWxvZ190cmFucyA8LSBmdW5jdGlvbihiYXNlID0gZXhwKDEpKSB7DQogICAgdHJhbnMgPC0gZnVuY3Rpb24oeCkgLWxvZyh4LCBiYXNlKQ0KICAgIGludiA8LSBmdW5jdGlvbih4KSBiYXNlXigteCkNCiAgICB0cmFuc19uZXcocGFzdGUwKCJyZXZlcnNlbG9nLSIsIGZvcm1hdChiYXNlKSksIHRyYW5zLCBpbnYsIA0KICAgICAgICAgICAgICBsb2dfYnJlYWtzKGJhc2UgPSBiYXNlKSwgDQogICAgICAgICAgICAgIGRvbWFpbiA9IGMoMWUtMTAwLCBJbmYpKQ0KfQ0KDQpmc19waW4gJT4lICANCiAgZ2dwbG90KGFlcyh4ID0gbWRwX2FkanVzdCwgeSA9IGNvbmZsaWN0X3Njb3JlKSkgKyANCiAgZ2VvbV9wb2ludChhZXMoY29sb3VyID0gY2x1c3Rlciwgc2l6ZSA9IHBvcHVsYXRpb25fMjAyMV9wcm9qKSwgYWxwaGEgPSAuOCkgKyANCiAgZ3VpZGVzKGNvbG91ciA9ICJub25lIiwgc2l6ZSA9ICJub25lIikgKw0KICBsYWJzKHggPSAiTXVsdGlkaW1lbnNpb25hbCB2dWxuZXJhYmlsaXR5ICgyMDE5KSIsIHkgPSAiQ29uZmxpY3Qgc2NvcmUgKDIwMjIpIikgKyANCiAgc2NhbGVfc2l6ZV9jb250aW51b3VzKHJhbmdlID0gYyguNSwgMykpICsgDQogIHNjYWxlX2NvbG91cl92aXJpZGlzX2Qob3B0aW9uID0gImNpdmlkaXMiKSArIA0KICBzY2FsZV94X2NvbnRpbnVvdXModHJhbnMgPSAibG9nMTAiKSArIA0KICBzY2FsZV95X2NvbnRpbnVvdXModHJhbnMgPSAibG9nMTAiKSArIA0KICANCmZzX3BpbiAlPiUgDQogIGdncGxvdChhZXMoeCA9IHBvcHVsYXRpb25fZGVuc2l0eSwgeSA9IGNvbmZsaWN0X3Njb3JlKSkgKyANCiAgZ2VvbV9wb2ludChhZXMoY29sb3VyID0gY2x1c3Rlciwgc2l6ZSA9IHBvcHVsYXRpb25fMjAyMV9wcm9qKSwgYWxwaGEgPSAuOCkgKyANCiAgc2NhbGVfeF9jb250aW51b3VzKHRyYW5zID0gcmV2ZXJzZWxvZ190cmFucygxMCksIGJyZWFrcyA9IGMoMCwgMSwgMTAsIDEwMCwgMTAwMCwgMTAwMDApLCANCiAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGNvbW1hX2Zvcm1hdChhY2N1cmFjeSA9IDEpKSArIA0KICBzY2FsZV9zaXplX2NvbnRpbnVvdXMocmFuZ2UgPSBjKC41LCAzKSkgKyANCiAgbGFicyhzaXplID0gInBvcHVsYXRpb24iLCBjb2xvdXIgPSAiIiwgDQogICAgICAgeCA9ICJQZXJzb25zIHBlciBrbTIgKHJldmVyc2VkKSIsIHkgPSAiIikgKyANCiAgZ3VpZGVzKHNpemUgPSAibm9uZSIpICsNCiAgc2NhbGVfY29sb3VyX3ZpcmlkaXNfZChvcHRpb24gPSAiY2l2aWRpcyIpICsgDQogIHNjYWxlX3lfY29udGludW91cyh0cmFucyA9ICJsb2cxMCIpICsgDQoNCiAgcGxvdF9sYXlvdXQod2lkdGhzID0gMSkgKyANCiAgcGxvdF9hbm5vdGF0aW9uKHRpdGxlID0gIkNvbXBhcmlzb24gYmV0d2VlbiB2dWxuZXJhYmlsaXR5LCBwb3B1bGF0aW9uIGRlbnNpdHkgYW5kIGNvbmZsaWN0IHNjb3JlIiwgDQogICAgICAgICAgICAgICAgICBzdWJ0aXRsZSA9ICJIaWdoZXIgdnVsbmVyYWJpbHR5IGFuZCBjb25mbGljdCBzY29yZXMgaW5kaWNhdGUgbW9yZSB2dWxuZXJhYmlsaXR5IGFuZCBjb25mbGljdCIsIA0KICAgICAgICAgICAgICAgICAgY2FwdGlvbiA9ICJEYXRhIHNvdXJjZTogQUNMRUQgKGFjbGVkZGF0YS5jb20pIGFuZCBNSU1VIiwgDQogICAgICAgICAgICAgICAgICB0aGVtZSA9IHRoZW1lKHBsb3QuY2FwdGlvbiA9IGVsZW1lbnRfdGV4dChoanVzdCA9IC41KSkpDQoNCg0KYGBgDQoNCjxicj4NCg0KSXQgY2FuIGJlIHNlZW4gdGhhdCBncm91cHMgQTEgYW5kIEEyLCB3aGljaCBoYXZlIHRoZSBoaWdoZXN0IGNvbmZsaWN0IHNjb3JlcywgYXJlIHF1aXRlIGRpc3RpbmN0IGZyb20gZ3JvdXAgRCAod2hlcmUgdGhlIG1ham9yaXR5IG9mIHRoZSBkZXZlbG9wbWVudCBjYXNlbG9hZCByZXNpZGVzKS4gR3JvdXAgQyBoYXMgbmVpdGhlciBoaWdoIHZ1bG5lcmFiaWxpdHkgbm9yIGhpZ2ggY29uZmxpY3QgaW5jaWRlbmNlLiBBbmQgZ3JvdXAgQiBjb25zaXN0cyBvZiBzb2xlbHkgdXJiYW4gY2VudHJlcy4gVGhlIHRhYmxlIGJlbG93IHByb3ZpZGVzIG1vcmUgZGV0YWlsIG9uIGVhY2ggb2YgdGhlIGdyb3Vwcy4gDQoNCkdyb3VwcyBBMSBhbmQgQTIgY29udGFpbmVkIDYwJSBvZiBhbGwgY29uZmxpY3QgZXZlbnRzIGFuZCA4MyUgb2YgYWxsIGNvbmZsaWN0IGZhdGFsaXRpZXMgaW4gMjAyMS4gR3JvdXBzIEExIGFuZCBBMiBjYW4gYmUgZGlzdGluZ3Vpc2hlZCBmcm9tIGVhY2ggb3RoZXIgYnkgdGhlIGludGVuc2l0eSBvZiBjb25mbGljdCwgd2l0aCBBMSBiZWluZyB3aGVyZSB0aGUgY29uY2VudHJhdGlvbnMgb2YgY29uZmxpY3QgZXZlbnRzIGFuZCBmYXRhbGl0aWVzIGFyZSB0aGUgaGVhdmllc3QuIA0KDQpBbiBpbnRlcmFjdGl2ZSB2ZXJzaW9uIG9mIHRoZSBwbG90IG9uIHRoZSBsZWZ0IGNhbiBiZSBmb3VuZCBiZWxvdy4gDQoNCjxicj4gDQoNCmBgYHtyIHRhYmxlLWdyb3VwLXN1bW1hcmllc30NCmZzX3BpbiAlPiUgICANCiAgbXV0YXRlKHRvdGFsX2V2ZW50cyA9IGJhdHRsZXMgKyBleHBsb3Npb25zX3JlbW90ZV92aW9sZW5jZSArIHByb3Rlc3RzX2FuZF9yaW90cyArIHN0cmF0ZWdpY19kZXZlbG9wbWVudHMgKw0KICAgICAgICAgICB2aW9sZW5jZV9hZ2FpbnN0X2NpdmlsaWFucykgJT4lDQogIHJlcGxhY2VfbmEobGlzdChmYXRhbGl0aWVzID0gMCkpICU+JSANCiAgZ3JvdXBfYnkoZ3JvdXAgPSBjbHVzdGVyKSAlPiUgDQogIHN1bW1hcmlzZShjb25mbGljdF9ldmVudHMgPSBzdW0odG90YWxfZXZlbnRzLCBuYS5ybSA9IFRSVUUpLA0KICAgICAgICAgICAgZmF0YWxpdGllcyA9IHN1bShmYXRhbGl0aWVzKSwgDQogICAgICAgICAgICB2dWxuZXJhYmlsaXR5XzIwMTkgPSBtZWFuKG1kcF9hZGp1c3QpLA0KICAgICAgICAgICAgYXZnX2NvbmZsaWN0X3Njb3JlID0gbWVhbihjb25mbGljdF9zY29yZSwgbmEucm0gPSBUUlVFKSwgDQogICAgICAgICAgICBwcGxfa20yID0gcm91bmQobWVhbihwb3B1bGF0aW9uX2RlbnNpdHkpLCBkaWdpdHMgPSAwKSwgDQogICAgICAgICAgICBwb3B1bGF0aW9uID0gc3VtKHBvcHVsYXRpb25fMjAyMV9wcm9qKSwgDQogICAgICAgICAgICB0b3duc2hpcHMgPSBuKCkpICU+JSANCiAgbXV0YXRlKGAlX3RvdGFsX3BvcHVsYXRpb25gID0gcm91bmQocG9wdWxhdGlvbiAvIHN1bShwb3B1bGF0aW9uKSAqIDEwMCwgZGlnaXRzID0gMiksDQogICAgICAgICBgJV9mYXRhbGl0aWVzYCA9IHJvdW5kKGZhdGFsaXRpZXMgLyBzdW0oZmF0YWxpdGllcykgKiAxMDAsIGRpZ2l0cyA9IDIpLCANCiAgICAgICAgIGAlX2NvbmZsaWN0X2V2ZW50c2AgPSByb3VuZChjb25mbGljdF9ldmVudHMgLyBzdW0oY29uZmxpY3RfZXZlbnRzKSAqIDEwMCwgZGlnaXRzID0gMikpICU+JSANCiAgc2VsZWN0KGdyb3VwLCBgJV9jb25mbGljdF9ldmVudHNgLCBgJV9mYXRhbGl0aWVzYCwgYXZnX2NvbmZsaWN0X3Njb3JlLCB2dWxuZXJhYmlsaXR5XzIwMTksIHBwbF9rbTIsIA0KICAgICAgICAgdG93bnNoaXBzLCBgJV90b3RhbF9wb3B1bGF0aW9uYCkgJT4lIA0KICBtdXRhdGVfYXQodmFycyhhdmdfY29uZmxpY3Rfc2NvcmUsIHZ1bG5lcmFiaWxpdHlfMjAxOSksIH5yb3VuZCgueCwgZGlnaXRzID0gMykpICU+JQ0KICBrYWJsZShjYXB0aW9uID0gIlN1bW1hcnkgc3RhdGlzdGljcyBieSBwcmlvcml0aXNhdGlvbiBncm91cCIsIGZvcm1hdC5hcmdzID0gbGlzdChiaWcubWFyayA9ICIsIikpICU+JSANCiAga2FibGVfY2xhc3NpY18yKCJzdHJpcGVkIikgJT4lIA0KICBmb290bm90ZShmb290bm90ZV9hc19jaHVuayA9IFRSVUUsIHRocmVlcGFydHRhYmxlID0gVFJVRSwgDQogICAgICAgICAgIGdlbmVyYWwgPSAiR3JvdXBzIEExIGFuZCBBMiBoYXZlIHRoZSBoaWdoZXN0IGNvbmZsaWN0IHNjb3JlcyBhbmQgc2hvdWxkIGJlIHByaW9yaXRpc2VkIG92ZXIgdGhlIG90aGVycy4gSGlnaGVyIHNjb3JlcyBpbmRpY2F0ZSBtb3JlIHZ1bG5lcmFiaWxpdHkvY29uZmxpY3QuIiwgZ2VuZXJhbF90aXRsZSA9ICIiKSANCg0KIyAlPiUNCiMgIHNhdmVfa2FibGUoZmlsZSA9ICJzdW1tYXJ5X3N0YXRzX2dyb3Vwcy5wbmciLCB6b29tID0gMikNCmBgYA0KDQo8YnI+DQoNCkdyb3VwcyBBMSBhbmQgQTIgYm90aCBoYXZlIG1pZGRsaW5nIHZ1bG5lcmFiaWxpdHkgc2NvcmVzLCBidXQgaGF2ZSBtdWNoIGhpZ2hlciBhdmVyYWdlIGNvbmZsaWN0IHNjb3Jlcy4gR3JvdXAgQTEsIGluIHBhcnRpY3VsYXIsIGhhcyBhIHZlcnkgaGlnaCBjb25jZW50cmF0aW9uIG9mIGNvbmZsaWN0IGluY2lkZW50cyBhbmQgZmF0YWxpdGllcywgaW4gYWRkaXRpb24gdG8gaGF2aW5nIHRoZSBzZWNvbmQtaGlnaGVzdCB2dWxuZXJhYmlsaXR5IHNjb3JlcyBvZiB0aGUgZ3JvdXBzLiBUaGVzZSA2OSB0b3duc2hpcHMgKGNvbnRhaW5pbmcgYWJvdXQgMjQlIG9mIHRoZSBwb3B1bGF0aW9uKSBhcmUgY2xlYXIgcHJpb3JpdGllcyBmb3IgaHVtYW5pdGFyaWFuIGFjdGlvbi4gDQoNCjxicj4NCg0KYGBge3IgcGxvdGx5LWdyb3VwLXNjYXR0ZXJ9DQpncm91cF9zY2F0dGVyIDwtIGZzX3BpbiAlPiUgIA0KICBtdXRhdGUodG90YWxfZXZlbnRzID0gYmF0dGxlcyArIGV4cGxvc2lvbnNfcmVtb3RlX3Zpb2xlbmNlICsgcHJvdGVzdHNfYW5kX3Jpb3RzICsgc3RyYXRlZ2ljX2RldmVsb3BtZW50cyArDQogICAgICAgICAgIHZpb2xlbmNlX2FnYWluc3RfY2l2aWxpYW5zKSAlPiUNCiAgZmlsdGVyKGNvbmZsaWN0X3Njb3JlICE9IDApICU+JQ0KICBnZ3Bsb3QoYWVzKHggPSBtZHBfYWRqdXN0LCB5ID0gY29uZmxpY3Rfc2NvcmUsIGNvbG91ciA9IGNsdXN0ZXIsIA0KICAgICAgICAgICAgIHRleHQgPSBwYXN0ZTAodG93bnNoaXAsICIsICIsICJcbiIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZSwgIlxuIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJncm91cDogIiwgY2x1c3RlciwgIlxuIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJmYXRhbGl0aWVzOiAiLCBmYXRhbGl0aWVzLCAiXG4iLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvbmZsaWN0X3Njb3JlOiAiLCByb3VuZChjb25mbGljdF9zY29yZSwgZGlnaXRzID0gMyksICJcbiIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgInZ1bF9zY29yZTogIiwgcm91bmQobWRwX2FkanVzdCwgZGlnaXRzID0gMyksICJcbiIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgInBvcHVsYXRpb246ICIsIHJvdW5kKHBvcHVsYXRpb25fMjAyMV9wcm9qLCBkaWdpdHMgPSAwKSkpKSArIA0KICBnZW9tX2hsaW5lKGFlcyh5aW50ZXJjZXB0ID0gbWVkaWFuKGNvbmZsaWN0X3Njb3JlKSksIGNvbG91ciA9ICJyZWQiLCBsdHkgPSAyKSArIA0KICBnZW9tX3ZsaW5lKGFlcyh4aW50ZXJjZXB0ID0gbWVkaWFuKG1kcF9hZGp1c3QpKSwgY29sb3VyID0gInJlZCIsIGx0eSA9IDIpICsNCiAgZ2VvbV9wb2ludChhZXMoc2l6ZSA9IHBvcHVsYXRpb25fMjAyMV9wcm9qKSwgYWxwaGEgPSAuNykgKw0KICBzY2FsZV9jb2xvdXJfdmlyaWRpc19kKG9wdGlvbiA9ICJjaXZpZGlzIikgKyANCiAgc2NhbGVfeF9jb250aW51b3VzKHRyYW5zID0gImxvZzEwIikgKyANCiAgc2NhbGVfeV9jb250aW51b3VzKHRyYW5zID0gImxvZzEwIikgKyANCiAgbGFicyh4ID0gIk11bHRpZGltZW5zaW9uYWwgdnVsbmVyYWJpbGl0eSAoMjAxOSkiLCB5ID0gIkNvbmZsaWN0IHNjb3JlICgyMDIyKSIsIA0KICAgICAgIGNvbG91ciA9ICJncm91cCIsIHNpemUgPSAiIiwgDQogICAgICAgdGl0bGUgPSAiTXVsdGlkaW1lbnNpb25hbCB2dWxuZXJhYmlsaXR5IGFuZCBjb25mbGljdCBieSB0b3duc2hpcCIsIA0KICAgICAgIHN1YnRpdGxlID0gIkF2ZXJhZ2VzIG1hcmtlZCBieSByZWQgbGluZXM7IHBvcHVsYXRpb24gbWFya2VkIGJ5IHNpemUiKQ0KDQpnZ3Bsb3RseShncm91cF9zY2F0dGVyLCB0b29sdGlwID0gYygidGV4dCIpLCB3aWR0aCA9IDgyMCwgaGVpZ2h0ID0gNTUwKSAlPiUgDQogICMgbGF5b3V0KHNob3dsZWdlbmQgPSBGQUxTRSwgbGVnZW5kID0gbGlzdChmb250ID0gbGlzdChzaXplID0gNikpKSAlPiUgDQogIGNvbmZpZyhkaXNwbGF5TW9kZUJhciA9IEZBTFNFKSAlPiUgDQogIGxheW91dCh0aXRsZSA9IGxpc3QodGV4dCA9IHBhc3RlMCgiTXVsdGlkaW1lbnNpb25hbCB2dWxuZXJhYmlsaXR5IGFuZCBjb25mbGljdCBieSBwcmlvcml0aXNhdGlvbiBncm91cCIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPGJyPiIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPHN1cD4iLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkF2ZXJhZ2VzIG1hcmtlZCBieSByZWQgbGluZXM7IHBvcHVsYXRpb24gbWFya2VkIGJ5IHNpemUiLCI8L3N1cD4iKSkpDQoNCg0KYGBgDQoNCjxicj48YnI+DQoNCiMjIyAxLjYgVmlsbGFnZXMgYWZmZWN0ZWQgYnkgY29uZmxpY3QNCg0KVG93bnNoaXBzIGFyZSBxdWl0ZSBsYXJnZSAtLSBvbiBhdmVyYWdlLCBlYWNoIGhhcyBhIHBvcHVsYXRpb24gb2YgYHIgc3VtbWFyaXNlKGZzX3BpbiwgbWVhbiA9IHJvdW5kKG1lYW4ocG9wdWxhdGlvbl8yMDIxX3Byb2opLCBkaWdpdHMgPSAwKSkgJT4lICBwdWxsKCkgJT4lIGZvcm1hdChiaWcubWFyayA9ICIsIilgIHBlcnNvbnMuIA0KDQpBcyBtZW50aW9uZWQgZWFybGllciwgcnVyYWwgaG91c2Vob2xkcyB3ZXJlIGZvdW5kIHRvIGJlIGxlc3MgcmVzaWxpZW50IGFuZCBtb3JlIGFzc2V0LXBvb3IgaW4gSUZQUkkncyBob3VzZWhvbGQgd2VsZmFyZSBzdXJ2ZXkuIFRoZXNlIGZpbmRpbmdzIGFsaWduIHdlbGwgd2l0aCB0aGUgcHJvY2VzcyB0aGUgRm9vZCBTZWN1cml0eSBDbHVzdGVyIGhhcyBkZXZlbG9wZWQgaGVyZSB0byBpZGVudGlmeSBwcmlvcml0eSBob3VzZWhvbGRzICh3aGVyZSBydXJhbCBob3VzZWhvbGRzIGFyZSBzaWduaWZpY2FudGx5IG1vcmUgbGlrZWx5IHRvIGZhbGwgaW50byB0aGUgcHJpb3JpdHkgZ3JvdXApLiBJdCB3b3VsZCBiZSBleHRyZW1lbHkgZnJ1aXRmdWwgdG8gZXhwbG9yZSB3aGV0aGVyIHRoaXMgYWxpZ25tZW50IGV4dGVuZHMgdG8gY29uZmxpY3QgYW5kIHNvbWUgb2YgdGhlIG90aGVyIGVudmlyb25tZW50YWwgYW5kIHNvY2lvZWNvbm9taWMgdmFyaWFibGVzIHRoYXQgaGF2ZSBiZWVuIGVtcGxveWVkIGluIHRoaXMgZG9jdW1lbnQuIA0KDQpJdCBzaG91bGQgYWxzbyBiZSBub3RlZCB0aGF0IHRvd25zaGlwcyB0aGVtc2VsdmVzIGFyZSBxdWl0ZSBsYXJnZSAtLSBvbiBhdmVyYWdlLCBlYWNoIGhhcyBhIHBvcHVsYXRpb24gb2YgYHIgc3VtbWFyaXNlKGZzX3BpbiwgbWVhbiA9IHJvdW5kKG1lYW4ocG9wdWxhdGlvbl8yMDIxX3Byb2opLCBkaWdpdHMgPSAwKSkgJT4lICBwdWxsKCkgJT4lIGZvcm1hdChiaWcubWFyayA9ICIsIilgIHBlcnNvbnMuIEluIGFyZWFzIHdoZXJlIHBhcnRuZXJzIGFyZSBub3QgeWV0IHByZXNlbnQsIHRoaXMgbWlnaHQgbmVjZXNzaXRhdGUgYW4gaW50ZXJtZWRpYXRlIHN0ZXAgdG8gaGVscCBwYXJ0bmVycyBpZGVudGlmeSBzcGVjaWZpYyBhcmVhcyB3aGVyZSB0aGV5IGNvdWxkIGJlZ2luIHdvcmtpbmcuIA0KDQpJbiB0aGUgQUNMRUQgZGF0YXNldCwgb2YgdGhlIGByIGZpbHRlcihhY2xlZCwgeWVhciA9PSAyMDIxICYgc3ViX2V2ZW50X3R5cGUgIT0gIlBlYWNlZnVsIHByb3Rlc3QiKSAlPiUgIG5yb3coKSAlPiUgIGZvcm1hdChiaWcubWFyayA9ICIsIilgIGV2ZW50cyBpbiAyMDIxLCAzOCUgb2YgdGhlbSB3ZXJlIHJlY29yZGVkIHdpdGggc3BlY2lmaWMgdmlsbGFnZSBsb2NhdGlvbnMuIA0KDQo8YnI+DQoNCmBgYHtyIHRhYmxlLXZpbGxhZ2VzfQ0KYWNsZWQgJT4lIA0KICBmaWx0ZXIoeWVhciA+PSAyMDIxICYgc3ViX2V2ZW50X3R5cGUgIT0gIlBlYWNlZnVsIHByb3Rlc3QiKSAlPiUNCiAgbXV0YXRlKGhhc192aWxsYWdlID0gZmN0X3JlbGV2ZWwoaGFzX3ZpbGxhZ2UsIGMoInllcyIsICJubyIpKSkgJT4lIA0KICBncm91cF9ieShoYXNfdmlsbGFnZSkgJT4lIA0KICBzdW1tYXJpc2UoZXZlbnRzID0gbigpLCANCiAgICAgICAgICAgIGZhdGFsaXRpZXMgPSBzdW0oZmF0YWxpdGllcyksDQogICAgICAgICAgICBsb2NhdGlvbnMgPSBuX2Rpc3RpbmN0KGludGVyYWN0aW9uKGFkbWluMywgbG9jYXRpb24pKSwgLmdyb3VwcyA9ICJkcm9wIikgJT4lDQogIG11dGF0ZShgJV9ldmVudHNgID0gcm91bmQoZXZlbnRzIC8gc3VtKGV2ZW50cykgKiAxMDAsIGRpZ2l0cyA9IDIpLCANCiAgICAgICAgIGAlX2ZhdGFsaXRpZXNgID0gcm91bmQoZmF0YWxpdGllcyAvIHN1bShmYXRhbGl0aWVzKSAqIDEwMCwgZGlnaXRzID0gMikpICU+JSANCiAgc2VsZWN0KG1lbnRpb25zX3ZpbGFnZSA9IGhhc192aWxsYWdlLCBldmVudHMsIGAlX2V2ZW50c2AsIGZhdGFsaXRpZXMsIGAlX2ZhdGFsaXRpZXNgLCBsb2NhdGlvbnMpICU+JSANCiAga2FibGUoY2FwdGlvbiA9ICJDb25mbGljdCBldmVudHMgd2l0aCBhbmQgd2l0aG91dCB2aWxsYWdlcyIsIGZvcm1hdC5hcmdzID0gbGlzdChiaWcubWFyayA9ICIsIiksIA0KICAgICAgICB0YWJsZS5hdHRyID0gInN0eWxlID0gJ3dpZHRoOjYwJTsnIikgJT4lIA0KICBrYWJsZV9jbGFzc2ljXzIoKSAlPiUgDQogIGZvb3Rub3RlKCJEYXRhIHNvdXJjZTogQUNMRUQ7IGFjY2xlZGRhdGEuY29tIiwgZ2VuZXJhbF90aXRsZSA9ICIiKQ0KDQoNCmBgYA0KDQo8YnI+DQoNCkJlbG93IGlzIGFuIGludGVyYWN0aXZlIHJlZmVyZW5jZSB0YWJsZSBvZiB0aGUgMSw5MTcgdmlsbGFnZXMgaWRlbnRpZmllZCBpbiB0aGUgQUNMRUQgZGF0YXNldCwgY29tcGxldGUgd2l0aCBjb29yZGluYXRlcy4gV2hpbGUgdGhpcyBsaXN0IGRvZXMgcHJvdmlkZSBhbiBleGNlbGxlbnQgc3RhcnQsIGJ5IHdvcmtpbmcgaW4gdGhlc2UgYXJlYXMsIHBhcnRuZXJzIHNob3VsZCBhbHNvIGVuZGVhdm91ciB0byBpZGVudGlmeSB0aGUgc3BlY2lmaWMgbG9jYXRpb25zIG9mIHRoZSByZW1haW5pbmcgNjIlIG9mIGNvbmZsaWN0IGV2ZW50cy4gDQoNCjxicj4NCg0KYGBge3IgZHQtY29uZmxpY3QtdmlsbGFnZXN9DQphY2xlZCAlPiUNCiAgbXV0YXRlKGhhc192aWxsYWdlID0gZmN0X3JlbGV2ZWwoaGFzX3ZpbGxhZ2UsIGMoInllcyIsICJubyIpKSkgJT4lDQogIGZpbHRlcih5ZWFyID49IDIwMjEgJiBzdWJfZXZlbnRfdHlwZSAhPSAiUGVhY2VmdWwgcHJvdGVzdCIgJiBoYXNfdmlsbGFnZSA9PSAieWVzIikgJT4lDQogIGdyb3VwX2J5KHN0YXRlID0gYWRtaW4xLCB0b3duc2hpcCA9IGFkbWluMywgdmlsbGFnZSA9IGxvY2F0aW9uKSAlPiUgDQogIG11dGF0ZShldmVudF9jb3VudCA9IDEpICU+JSANCiAgc3VtbWFyaXNlKGV2ZW50cyA9IG4oKSwgDQogICAgICAgICAgICBmYXRhbGl0aWVzID0gc3VtKGZhdGFsaXRpZXMpLCANCiAgICAgICAgICAgIGJhdHRsZXMgPSBzdW0oZXZlbnRfY291bnRbZXZlbnRfdHlwZSA9PSAiQmF0dGxlcyJdKSwgDQogICAgICAgICAgICByZW1vdGVfdmlvbGVuY2UgPSBzdW0oZXZlbnRfY291bnRbZXZlbnRfdHlwZSA9PSAiRXhwbG9zaW9ucy9SZW1vdGUgdmlvbGVuY2UiXSksIA0KICAgICAgICAgICAgdmlvbGVuY2Vfdi5fY2l2aWxpYW5zID0gc3VtKGV2ZW50X2NvdW50W2V2ZW50X3R5cGUgPT0gIlZpb2xlbmNlIGFnYWluc3QgY2l2aWxpYW5zIl0pLA0KICAgICAgICAgICAgbGF0aXR1ZGUgPSBtYXgobGF0aXR1ZGUpLA0KICAgICAgICAgICAgbG9uZ2l0dWRlID0gbWF4KGxvbmdpdHVkZSkpICU+JQ0KICBmaWx0ZXIodmlsbGFnZSAlb3V0JSBjKCJNYW5kYWxheSIsICJZYW5nb24iKSkgJT4lIA0KICBhcnJhbmdlKGRlc2MoZmF0YWxpdGllcykpICU+JSANCiAgZGF0YXRhYmxlKGZpbHRlciA9IGxpc3QocG9zaXRpb24gPSAidG9wIiwgY2xlYXIgPSBGQUxTRSksIA0KICAgICAgICAgICAgb3B0aW9ucyA9IGxpc3QocGFnZUxlbmd0aCA9IDEwLCBzY3JvbGxYID0gVFJVRSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXJDYWxsYmFjayA9IERUOjpKUygiZnVuY3Rpb24odGhlYWQpIHsiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgJCh0aGVhZCkuY3NzKCdmb250LXNpemUnLCAnLjhlbScpOyIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICJ9IikpLCANCiAgICAgICAgICAgIGNhcHRpb24gPSBodG1sdG9vbHM6OnRhZ3MkY2FwdGlvbihzdHlsZSA9ICdjYXB0aW9uLXNpZGU6IHRvcDsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0LWFsaWduOiBjZW50ZXI7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3I6IGJsYWNrOyBmb250LXNpemU6IDEyMCU7JywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUmVmZXJlbmNlIHRhYmxlIC0tIGNvbmZsaWN0LWFmZmVjdGVkIHZpbGxhZ2VzIikpICU+JSANCiAgZm9ybWF0U3R5bGUoMCwgdGFyZ2V0ID0gInJvdyIsIGxpbmVIZWlnaHQgPSAiODAlIiwgZm9udFNpemUgPSAiODAlIikNCg0KYGBgDQoNCg0KPGJyPjxicj4NCg0KIyMjIDEuNyA1VyByZXN1bHRzIGZyb20gdGhlIGZpcnN0IGhhbGYgb2YgMjAyMg0KDQoNCkFzIG9mIHRoZSBzZWNvbmQgcXVhcnRlciBvZiAyMDIyLCBGb29kIFNlY3VyaXR5IENsdXN0ZXIgcGFydG5lcnMgaGF2ZSByZWFjaGVkIGEgdG90YWwgb2YgYHIgZmlsdGVyKGZzYywgaHVtYW5pdGFyaWFuX29yX2RldmVsb3BtZW50ID09ICJIdW1hbml0YXJpYW4iKSAlPiUge3N1bSguJG5ld19iZW5lZmljaWFyaWVzKX0gJT4lIGZvcm1hdChiaWcubWFyayA9ICIsIilgIHBlcnNvbnMgb3IgYHIgcm91bmQoc3VtKGZzYyRuZXdfYmVuZWZpY2lhcmllcykgLyBzdW0oZnNfcGluJGZzX3RhcmdldGVkKSAqIDEwMCwgZGlnaXRzID0gMClgJSBvZiB0aGUgMjAyMiB0YXJnZXQuIEJlbG93IGlzIGFuIGV4YW1pbmF0aW9uIG9mIHRoZSBleHRlbnQgdG8gd2hpY2ggcGFydG5lcnMgaGF2ZSB0YXJnZXRlZCB0aGUgdG93bnNoaXBzIG1vc3QgYWZmZWN0ZWQgYnkgY29uZmxpY3QuIA0KDQpJbiB0aGUgcGxvdCAgYmVsb3csIHRoZSBudW1iZXIgb2YgYmVuZWZpY2lhcmllcyByZWFjaGVkLCBhcyBvZiB0aGUgc2Vjb25kIHF1YXJ0ZXIgb2YgMjAyMiwgaXMgcGxvdHRlZCBhZ2FpbnN0IHRoZSB0YXJnZXRlZCBwb3B1bGF0aW9uLiBFYWNoIHBvaW50IGlzIGEgdG93bnNoaXAgYW5kIHRoZSByZWQgbGluZSBkb3duIHRoZSBtaWRkbGUgcmVwcmVzZW50cyByZWFjaGluZyAxMDAlIG9mIHRoZSB0YXJnZXQuIEhvdyBmYXIgYWJvdmUgb3IgYmVsb3cgYSB0b3duc2hpcCBpcyBpbmRpY2F0ZXMgaG93IGZhciBhYm92ZSBvciBiZWxvdyB0aGUgdGFyZ2V0IGl0IGlzLiBBZGRpdGlvbmFsbHksIHRoZSB0b3duc2hpcCBwcmlvcml0aXNhdGlvbiBncm91cCBlYWNoIHRvd25zaGlwIGJlbG9uZ3MgdG8gaXMgbWFya2VkIGJ5IHRoZSBjb2xvdXIuIA0KDQpUaGUgdG93bnNoaXBzIG9uIHRoZSBmYXIgbGVmdCBvZiB0aGUgcGxvdCBoYXZlIGJlbmVmaWNpYXJpZXMgZGVzcGl0ZSBub3QgaGF2aW5nIHRhcmdldHMgZm9yIDIwMjIgKHRoZWlyIHRhcmdldHMgaGF2ZSBiZWVuIG5vbWluYWxseSBjb2RlZCBhcyAqMSogc28gdGhleSBhcHBlYXIgb24gdGhlIHBsb3QpLiANCg0KPGJyPg0KDQpgYGB7ciBwbG90bHktdHNwLXJlYWNoZWQtZ3JvdXBzfQ0KYmVuX3RhcmdldCA8LSBmc2MgJT4lIA0KICBncm91cF9ieShhZG1pbjNfcGNvZGVfb2xkKSAlPiUgDQogIHN1bW1hcmlzZShiZW5lZmljaWFyaWVzID0gc3VtKG5ld19iZW5lZmljaWFyaWVzKSwNCiAgICAgICAgICAgIHBhcnRuZXJzID0gbl9kaXN0aW5jdChvcmdfY29kZSkpICU+JSANCiAgcmlnaHRfam9pbihmc19waW4sIA0KICAgICAgICAgICAgIGJ5ID0gYygiYWRtaW4zX3Bjb2RlX29sZCIgPSAiYWRtaW4zX3Bjb2RlIikpICU+JSANCiAgcmVwbGFjZV9uYShsaXN0KGJlbmVmaWNpYXJpZXMgPSAwKSkgJT4lIA0KICBtdXRhdGUocmVhY2hlZF9wYyA9IGJlbmVmaWNpYXJpZXMgLyBmc190YXJnZXRlZCwNCiAgICAgICAgIHJlYWNoZWRfcGMgPSBpZmVsc2UoaXMuaW5maW5pdGUocmVhY2hlZF9wYyksIDEsIHJlYWNoZWRfcGMpLA0KICAgICAgICAgZnNfdGFyZ2V0ZWQgPSBpZmVsc2UoZnNfdGFyZ2V0ZWQgPT0gMCAmIGJlbmVmaWNpYXJpZXMgPiAwLCAxLCBmc190YXJnZXRlZCksDQogICAgICAgICBmc190YXJnZXRlZCA9IHJvdW5kKGZzX3RhcmdldGVkLCBkaWdpdHMgPSAwKSkgJT4lIA0KICBhcnJhbmdlKGRlc2MocmVhY2hlZF9wYykpICU+JSANCiAgc2VsZWN0KHN0YXRlLCB0b3duc2hpcCwgZnNfcGluLCBmc190YXJnZXRlZCwgYmVuZWZpY2lhcmllcywgcmVhY2hlZF9wYywgcGFydG5lcnMsIGNsdXN0ZXIpICU+JQ0KICBtdXRhdGUocGNfdGFyZ2V0ID0gcm91bmQoYmVuZWZpY2lhcmllcyAvIGZzX3RhcmdldGVkICogMTAwLCBkaWdpdHMgPSAyKSkgJT4lIA0KICBnZ3Bsb3QoYWVzKHggPSBmc190YXJnZXRlZCwgeSA9IGJlbmVmaWNpYXJpZXMsIGNvbG91ciA9IGNsdXN0ZXIsIA0KICAgICAgICAgICAgIHRleHQgPSBwYXN0ZTAodG93bnNoaXAsICIsIiwgIlxuIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLCAiLCIsICJcbiIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAiYmVuZWZpY2lhcmllc18yMDIyOiAiLCBiZW5lZmljaWFyaWVzLCAiXG4iLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgInRhcmdldF8yMDIyOiAiLCBmc190YXJnZXRlZCwgIlxuIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICIlX3JlYWNoZWQ6ICIsIHBjX3RhcmdldCwgIlxuIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAicGFydG5lcnNfMjAyMjogIiwgcGFydG5lcnMsICJcbiIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAiZ3JvdXA6ICIsIGNsdXN0ZXIpKSkgKyANCiAgZ2VvbV9hYmxpbmUoaW50ZXJjZXB0ID0gMCwgc2xvcGUgPSAxLCBsdHkgPSAyLCBjb2xvdXIgPSAicmVkIikgKyANCiAgZ2VvbV9wb2ludChhZXMoc2l6ZSA9IGJlbmVmaWNpYXJpZXMpLCBhbHBoYSA9IDAuOCkgKw0KICBzY2FsZV9zaXplX2NvbnRpbnVvdXMoZ3VpZGUgPSAibm9uZSIpICsgDQogIHNjYWxlX3hfY29udGludW91cyh0cmFucyA9ICJsb2cxMCIsIGxhYmVscyA9IGNvbW1hKSArIA0KICBzY2FsZV95X2NvbnRpbnVvdXModHJhbnMgPSAibG9nMTAiLCBsYWJlbHMgPSBjb21tYSkgKw0KICBzY2FsZV9jb2xvdXJfdmlyaWRpc19kKG9wdGlvbiA9ICJjaXZpZGlzIikgKw0KICAjIHNjYWxlX2NvbG91cl9tYW51YWwodmFsdWVzID0gYygiIzU3NUM2REZGIiwgIiMwMDIwNERGRiIsICIjQzRCNTZDRkYiLCAiI0ZGRUE0NkZGIikpICsNCiAgbGFicyh5ID0gIkJlbmVmaWNpYXJpZXMiLCB4ID0gIlRhcmdldGVkIHBvcHVsYXRpb24iLCBjb2xvdXIgPSAiR3JvdXAiLCANCiAgICAgICB0aXRsZSA9ICJUYXJnZXRlZCBwb3B1bGF0aW9uIHBlciB0b3duc2hpcCB2cyBiZW5lZmljaWFyaWVzIHJlYWNoZWQgYXMgb2YgMjAyMiwgYnkgcHJpb3JpdGlzYXRpb24gZ3JvdXAiLA0KICAgICAgIHN1YnRpdGxlID0gIlRoZSByZWQgbGluZSBpcyAxMDAlIG9mIHRhcmdldCIpDQoNCmdncGxvdGx5KGJlbl90YXJnZXQsIHRvb2x0aXAgPSBjKCJ0ZXh0IiksIHdpZHRoID0gODIwKSAlPiUgDQogIGNvbmZpZyhkaXNwbGF5TW9kZUJhciA9IEZBTFNFKSAlPiUgDQogIGxheW91dCh0aXRsZSA9IGxpc3QodGV4dCA9IA0KICAgICAgICAgICAgICAgICAgICAgICAgcGFzdGUwKCJUYXJnZXRlZCBwb3B1bGF0aW9uIHBlciB0b3duc2hpcCB2cyBiZW5lZmljaWFyaWVzIHJlYWNoZWQgYXMgb2YgUTIgMjAyMiIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPGJyPiIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPHN1cD4iLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkJ5IHByaW9yaXRpc2F0aW9uIGdyb3VwOyB0aGUgcmVkIGxpbmUgaXMgMTAwJSBvZiB0YXJnZXQ7IHNpemUgaXMgYmVuZWZpY2lhcmllcyByZWFjaGVkIiwiPC9zdXA+IikpKQ0KYGBgDQoNCjxicj4NCg0KV2l0aCByZWZlcmVuY2UgdG8gdGhlIHRhYmxlIGJlbG93LCA3LjIlIG9mIGJlbmVmaWNpYXJpZXMgY2FtZSBmcm9tIGdyb3VwIEExIGFuZCAxMiUgb2YgYmVuZWZpY2lhcmllcyBjYW1lIGZyb20gZ3JvdXAgQTIuIE9uIHRoZSBzdXJmYWNlLCB0aGlzIHNlZW1zIGxpa2UgcGFydG5lcnMgaGF2ZSBtYWRlIGVmZm9ydCB0byByZWFjaCBjb25mbGljdC1hZmZlY3RlZCB0b3duc2hpcHMuIEhvd2V2ZXIsIHRoaXMgcmVhY2ggaGFzIGxhcmdlbHkgYmVlbiBkdWUgdG8gb3ZlcnN1YnNjcmlwdGlvbiBpbiBTaXR0d2UsIHdoZXJlIHRoZSBudW1iZXIgb2YgYmVuZWZpY2lhcmllcyByZWFjaGVkIGluIDE5MSUgb2YgdGhlIHRhcmdldC4gDQoNClRoZSBkZXZlbG9wbWVudCBvZiB0aGUgcHJpb3JpdGlzYXRpb24gZ3JvdXBzIGFsc28gYnJpbmdzIHVwIHRoZSBicm9hZGVyIHBvaW50IG9mIHdoZXRoZXIgb3Igbm90IGNsdXN0ZXIgdGFyZ2V0cyBhcmUgaW4gbGluZSB3aXRoIG5lZWRzIGFuZCBpZiB0aGV5IHNob3VsZCBiZSByZWZvcm11bGF0ZWQgYmFzZWQgb24gdGhlIGluZm9ybWF0aW9uIG5vdyBhdmFpbGFibGUsIGFzIHRoZSB0YXJnZXRzIGluIGdyb3VwcyBCIGFuZCBDIGFyZSBub3RpY2VhYmx5IGhpZ2hlciB0aGFuIHRob3NlIGluIGdyb3VwIEEuIE5ldmVydGhlbGVzcywgaXQgaXMgaG9wZWQgdGhhdCBwYXJ0bmVycyB3aWxsIGJlIGFibGUgdG8gYWZmb3JkIHRvd25zaGlwcyBpbiBncm91cHMgQTEgYW5kIEEyIGdyZWF0ZXIgY292ZXJhZ2UgYXMgdGhlIHllYXIgcHJvZ3Jlc3Nlcy4gDQoNCjxicj4NCg0KYGBge3IgdGFibGUtcmVhY2hlZC1ncm91cH0NCmZzYyAlPiUgDQogIGdyb3VwX2J5KGFkbWluM19wY29kZV9vbGQpICU+JSANCiAgc3VtbWFyaXNlKGJlbmVmaWNpYXJpZXMgPSBzdW0obmV3X2JlbmVmaWNpYXJpZXMpLA0KICAgICAgICAgICAgcGFydG5lcnMgPSBuX2Rpc3RpbmN0KG9yZ19jb2RlKSkgJT4lIA0KICByaWdodF9qb2luKGZzX3BpbiwgDQogICAgICAgICAgICAgYnkgPSBjKCJhZG1pbjNfcGNvZGVfb2xkIiA9ICJhZG1pbjNfcGNvZGUiKSkgJT4lIA0KICByZXBsYWNlX25hKGxpc3QoYmVuZWZpY2lhcmllcyA9IDApKSAlPiUNCiAgbXV0YXRlKGdhcCA9IGlmZWxzZShmc190YXJnZXRlZCAtIGJlbmVmaWNpYXJpZXMgPD0gMCwgMCwgZnNfdGFyZ2V0ZWQgLSBiZW5lZmljaWFyaWVzKSwNCiAgICAgICAgIHJlYWNoZWRfcGMgPSAxIC0gZ2FwIC8gZnNfdGFyZ2V0ZWQsIA0KICAgICAgICAgZnNfdGFyZ2V0ZWQgPSBpZmVsc2UoZnNfdGFyZ2V0ZWQgPT0gMCAmIGJlbmVmaWNpYXJpZXMgPiAwLCAxLCBmc190YXJnZXRlZCksDQogICAgICAgICBoYXNfYmVuZWZpY2lhcmllcyA9IGlmZWxzZShiZW5lZmljaWFyaWVzID4gMCwgMSwgMCkpICU+JSANCiAgZ3JvdXBfYnkoY2x1c3RlcikgJT4lIA0KICBzdW1tYXJpc2UoYmVuZWZpY2lhcmllcyA9IHN1bShiZW5lZmljaWFyaWVzLCBuYS5ybSA9IFRSVUUpLCANCiAgICAgICAgICAgIGZzX3RhcmdldGVkID0gc3VtKGZzX3RhcmdldGVkLCBuYS5ybSA9IFRSVUUpLCANCiAgICAgICAgICAgIGdhcCA9IHN1bShnYXAsIG5hLnJtID0gVFJVRSksIA0KICAgICAgICAgICAgdHNwX3JlYWNoZWQgPSBzdW0oaGFzX2JlbmVmaWNpYXJpZXMpLCANCiAgICAgICAgICAgIHRzcF90b3RhbCA9IG4oKSkgJT4lIA0KICBtdXRhdGUocGNfZ2FwID0gcm91bmQoZ2FwIC8gZnNfdGFyZ2V0ZWQgKiAxMDAsIGRpZ2l0cyA9IDIpLCANCiAgICAgICAgIHBjX2JlbiA9IHJvdW5kKGJlbmVmaWNpYXJpZXMgLyBzdW0oYmVuZWZpY2lhcmllcykgKiAxMDAsIGRpZ2l0cyA9IDIpKSAlPiUgDQogIG11dGF0ZV9hdCh2YXJzKGZzX3RhcmdldGVkLCBnYXApLCB+IHJvdW5kKC4pKSAlPiUgDQogIHNlbGVjdChncm91cCA9IGNsdXN0ZXIsIGJlbmVmaWNpYXJpZXMsIGAlX2JlbmAgPSBwY19iZW4sIHRhcmdldCA9IGZzX3RhcmdldGVkLCANCiAgICAgICAgIGdhcCwgYCVfZ2FwYCA9IHBjX2dhcCwgdHNwX3JlYWNoZWQsIHRzcF90b3RhbCkgJT4lIA0KICBrYWJsZShjYXB0aW9uID0gIjIwMjIgUTEgYmVuZWZpY2lhcmllcyBhbmQgcGVyY2VudCByZWFjaGVkIGJ5IHByaW9yaXRpc2F0aW9uIGdyb3VwIiwgDQogICAgICAgIGZvcm1hdC5hcmdzID0gbGlzdChiaWcubWFyayA9ICIsIikpICU+JSANCiAga2FibGVfY2xhc3NpY18yKCJzdHJpcGVkIikgJT4lIA0KICBmb290bm90ZSgiQW55IHJlYWNoIGFib3ZlIDEwMCUgaXMgY291bnRlZCBhcyAxMDAlOyBleGNlZWRpbmcgdGhlIHRhcmdldCBpbiBvbmUgdG93bnNoaXAgZG9lcyBub3QgYWZmZWN0IG90aGVyIHRvd25zaGlwcyIsIA0KICAgICAgICAgICBnZW5lcmFsX3RpdGxlID0gIiIpDQoNCmBgYA0KDQo8YnI+DQoNCg0KTm90YWJseSwgb25seSBgciBmaWx0ZXIoZnNjLCBzdGF0ZSA9PSAiU2FnYWluZyIpICU+JSB7c3VtKC4kbmV3X2JlbmVmaWNpYXJpZXMpfSAlPiUgZm9ybWF0KGJpZy5tYXJrID0gIiwiKWAgYmVuZWZpY2lhcmllcyBiZWluZyByZWFjaGVkIGluIHRoZSB3aG9sZSBvZiBTYWdhaW5nLCB3aGVyZSB0aGUgZmlnaHRpbmcgaGFzIGJlZW4gaGVhdmllc3QuIEl0IGlzIHJlY29tbWVuZGVkIHRoYXQgdGFyZ2V0cyBhbmQgcGxhbnMgZm9yIHRoZSBGb29kIFNlY3VyaXR5IENsdXN0ZXIgYmUgcmV2aWV3ZWQsIGFuZCBwYXJ0bmVycyBiZSByZW1pbmRlZCB0byByZWFsbG9jYXRlIHJlc291cmNlcyBhd2F5IGZyb20gb3ZlcnN1YnNjcmliZWQgYXJlYXMgYW5kIGF3YXkgZnJvbSBncm91cHMgQiBhbmQgQywgd2hpY2ggYXJlIG5laXRoZXIgaHVtYW5pdGFyaWFuIG5vciBkZXZlbG9wbWVudCBwcmlvcml0aWVzLCB3aXRoIEIgY29uc2lzdGluZyBvZiB1cmJhbiBjZW50cmVzLg0KDQo8YnI+PGJyPg0KDQojIyMgMS44IE1hcHMgb2YgY29uZmxpY3Qgc2NvcmVzIGFuZCBwcmlvcml0aXNhdGlvbiBncm91cA0KDQpgYGB7ciBtYXAtY29uZmxpY3Qtc2NvcmUsIGZpZy5oZWlnaHQ9OX0NCg0KZnNfcGluICU+JSANCiAgcmlnaHRfam9pbihwY29kZTNfc2hhcGUsIGJ5ID0gImFkbWluM19wY29kZSIpICU+JSANCiAgc3RfYXNfc2YoKSAlPiUgDQogIGdncGxvdCgpICsNCiAgZ2VvbV9zZihhZXMoZmlsbCA9IGNvbmZsaWN0X3Njb3JlKSwgc2l6ZSA9IDAuMSkgKyANCiAgZ2VvbV9zZihkYXRhID0gcGNvZGUxX3NoYXBlLCBhbHBoYSA9IDAsIGNvbG91ciA9ICJibGFjayIsIHNpemUgPSAwLjUpICsgDQogIHNjYWxlX2ZpbGxfdmlyaWRpc19jKG9wdGlvbiA9ICJtYWdtYSIsIGRpcmVjdGlvbiA9IC0xKSArDQogIHRoZW1lX3ZvaWQoKSArIA0KICBsYWJzKHRpdGxlID0gIkNvbmZsaWN0IHNjb3JlIGJ5IHRvd25zaGlwIChhcyBvZiAxIEp1bmUgMjAyMikiLA0KICAgICAgIGNhcHRpb24gPSAiRGF0YSBzb3VyY2U6IEFDTEVEOyBhY2xlZGRhdGEuY29tIiwNCiAgICAgICBmaWxsID0gIkNvbmZsaWN0XG5zY29yZSIpICsNCiAgdGhlbWUocGxvdC5jYXB0aW9uPWVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSksIA0KICAgICAgICBwbG90LmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9ICJ3aGl0ZSIsIGNvbG91ciA9IE5BKSkgKw0KDQpmc19waW4gJT4lIA0KICBsZWZ0X2pvaW4ocGNvZGUzX3NoYXBlLCBieSA9ICJhZG1pbjNfcGNvZGUiKSAlPiUgDQogIHN0X2FzX3NmKCkgJT4lIA0KICBnZ3Bsb3QoKSArIA0KICBnZW9tX3NmKGFlcyhmaWxsID0gY2x1c3RlciksIHNpemUgPSAwLjEsIGNvbG91ciA9ICJncmF5MjAiKSArIA0KICBnZW9tX3NmKGRhdGEgPSBwY29kZTFfc2hhcGUsIGFscGhhID0gMCwgY29sb3VyID0gImJsYWNrIiwgc2l6ZSA9IDAuNSkgKw0KICAjIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IGMoIiM1NzVDNkRGRiIsICIjMDAyMDRERkYiLCAiI0M0QjU2Q0ZGIiwgIiNGRkVBNDZGRiIpKSArDQogIHNjYWxlX2ZpbGxfdmlyaWRpc19kKG9wdGlvbiA9ICJjaXZpZGlzIikgKw0KICB0aGVtZV92b2lkKCkgKw0KICBsYWJzKHRpdGxlID0gIlRvd25zaGlwcyBieSBwcmlvcml0aXNhdGlvbiBncm91cCIsIA0KICAgICAgIGZpbGwgPSAiUHJpb3JpLVxudGlzYXRpb25cbmdyb3VwIiwNCiAgICAgICBjYXB0aW9uID0gIkRhdGEgc291cmNlOiBBQ0xFRDsgYWNsZWRkYXRhLmNvbSBhbmQgRlNDIGNhbGN1bGF0aW9ucyIpICsNCiAgdGhlbWUocGxvdC5jYXB0aW9uPWVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSksIA0KICAgICAgICBwbG90LmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9ICJ3aGl0ZSIsIGNvbG91ciA9IE5BKSkgIA0KICANCiMgZ2dzYXZlKCJjb25mbGljdF9zY29yZV9tYXAucG5nIiwgZHBpID0gMzAwLCBoZWlnaHQgPSAxMiwgd2lkdGggPSA3LCB1bml0cyA9ICJpbiIpDQpgYGANCg0KPGJyPjxicj4NCg0KIyMjIDEuOSBSZWZlcmVuY2UgdGFibGUgZm9yIGNvbmZsaWN0IHZhcmlhYmxlcw0KDQpCZWxvdyBpcyBhbiBpbnRlcmFjdGl2ZSByZWZlcmVuY2UgdGFibGUgZm9yIHRoZSB2YXJpb3VzIHR5cGVzIG9mIGNvbmZsaWN0IGV2ZW50cyBieSB0b3duc2hpcC4gSXQgYWxzbyBpbmNsdWRlcyB0aGUgb3ZlcmFsbCBjb25mbGljdCBzY29yZSBhbmQgcHJpb3JpdGlzYXRpb24gZ3JvdXBzLiBUaGUgc2VhcmNoIGJhciBjYW4gYmUgdXNlZCB0byBmaW5kIHNwZWNpZmljIHRvd25zaGlwcywgb3IgYW55IG9mIHRoZSBjb2x1bW5zIG1heSBiZSBzb3J0ZWQgYWNjb3JkaW5nIHRvIGFzY2VuZGluZyBvciBkZXNjZW5kaW5nIHZhbHVlcy4gVGhlIHRhYmxlIGN1cnJlbnRseSBzaG93cyB0b3duc2hpcHMgaW4gZGVzY2VuZGluZyBvcmRlciBvZiBjb25mbGljdCBzY29yZS4gDQoNCjxicj4NCg0KYGBge3IgZHQtcmVmZXJlbmNlLXRhYmxlfQ0KZnNfcGluICU+JSANCiAgc2VsZWN0KHN0YXRlLCB0b3duc2hpcCwgcG9wXzIwMjEgPSBwb3B1bGF0aW9uXzIwMjFfcHJvaiwgcHBsX2ttMiA9IHBvcHVsYXRpb25fZGVuc2l0eSwgDQogICAgICAgICBQSU4gPSBmc19waW4sIHRhcmdldCA9IGZzX3RhcmdldGVkLA0KICAgICAgICAgZ3JvdXAgPSBjbHVzdGVyLCB2dWxuZXJhYmlsaXR5ID0gbWRwX2FkanVzdCwgY29uZmxpY3Rfc2NvcmUsIGZhdGFsaXRpZXMsDQogICAgICAgICBiYXR0bGVzLCBleHBsb3Npb25zX3JlbW90ZV92aW9sZW5jZSwgcHJvdGVzdHNfYW5kX3Jpb3RzLCBzdHJhdGVnaWNfZGV2ZWxvcG1lbnRzLCANCiAgICAgICAgIHZpb2xlbmNlX3YuX2NpdmlsaWFucyA9IHZpb2xlbmNlX2FnYWluc3RfY2l2aWxpYW5zLA0KICAgICAgICAgYWRtaW4zX3Bjb2RlKSAlPiUgDQogIGFycmFuZ2UoZGVzYyhjb25mbGljdF9zY29yZSkpICU+JSANCiAgZGF0YXRhYmxlKGZpbHRlciA9IGxpc3QocG9zaXRpb24gPSAidG9wIiwgY2xlYXIgPSBGQUxTRSksDQogICAgICAgICAgICBvcHRpb25zID0gbGlzdChwYWdlTGVuZ3RoID0gMTAsIHNjcm9sbFggPSBUUlVFLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlckNhbGxiYWNrID0gRFQ6OkpTKCJmdW5jdGlvbih0aGVhZCkgeyIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAiICAkKHRoZWFkKS5jc3MoJ2ZvbnQtc2l6ZScsICcuOGVtJyk7IiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIn0iKSksDQogICAgICAgICAgICBjYXB0aW9uID0gaHRtbHRvb2xzOjp0YWdzJGNhcHRpb24oc3R5bGUgPSAiY2FwdGlvbi1zaWRlOiB0b3A7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dC1hbGlnbjogY2VudGVyOyBmb250LXNpemU6IDE0MCU7IiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiMjAyMSBjb25mbGljdCBpbmRpY2F0b3JzIGJ5IHRvd25zaGlwIikpICU+JSANCiAgZm9ybWF0Um91bmQoYygicG9wXzIwMjEiLCAicHBsX2ttMiIsICJ0YXJnZXQiLCAiUElOIiksIGRpZ2l0cyA9IDApICU+JSANCiAgZm9ybWF0Um91bmQoYygiY29uZmxpY3Rfc2NvcmUiLCAidnVsbmVyYWJpbGl0eSIpLCBkaWdpdHMgPSAzKSAlPiUgDQogIGZvcm1hdFN0eWxlKDAsIHRhcmdldCA9ICJyb3ciLCBsaW5lSGVpZ2h0ID0gIjgwJSIsIGZvbnRTaXplID0gIjgwJSIpDQogDQpgYGANCg0KPGJyPjxicj48YnI+DQoNCiMjIDIuIERpc3RyaWJ1dGlvbiBvZiBmbG9vZCByaXNrIGluIE15YW5tYXINCg0KDQojIyMgMi4xIEhpc3RvcmljYWwgZmxvb2QgZGF0YSANCg0KSW4gbGlnaHQgb2YgdGhlIGltcGVuZGluZyBtb25zb29uIHNlYXNvbiwgdGhlIHByb2JhYmlsaXR5IHRoYXQgYSB0b3duc2hpcCB3aWxsIGJlIGFmZmVjdGVkIGJ5IGEgbWFqb3IgZmxvb2Qgb3IgY3lsY29uaWMgZXZlbnQgaGFzIGJlZW4gY2FsY3VsYXRlZC4gTWFqb3IgZmxvb2RzIHNpbmNlIDIwMDggaGF2ZSBiZWVuIGZhY3RvcmVkIGludG8gdGhpcyBjYWxjdWxhdGlvbi4gDQoNCkZvciB0aGUgbW9tZW50LCBjb25mbGljdCBpbmNpZGVuY2UgYW5kIGZsb29kIGFuZCBjeWNsb25lIHJpc2sgd2lsbCBiZSBldmFsdWF0ZWQgc2VwYXJhdGVseS4gRmxvb2QgYW5kIHN0b3JtIHN1cmdlIHJpc2sgZXhpc3QgYXMgcHJvYmFiaWxpdGllcyBmb3IgdGhlIG1vbWVudCBhbmQgYXJlIGludGVuZGVkIHRvIHN1cHBvcnQgcHJlcG9zaXRpb25pbmcgYW5kIERpc2FzdGVyIFJpc2sgUmVkdWN0aW9uLiBUaGlzIG1pZ2h0IGNoYW5nZSB3ZXJlIHNldmVyZSBmbG9vZGluZyB0byBvY2N1ciBpbiAyMDIyLiANCg0KPGJyPg0KDQpgYGB7ciBiYXJwbG90LWZsb29kLXJpc2t9DQpmbG9vZHNfc3Rvcm1fc3VyZ2UgJT4lIA0KICBzZWxlY3Qoc3RhcnRzX3dpdGgoInllYXJfIiksIGFkbWluM19wY29kZSkgJT4lIA0KICBwaXZvdF9sb25nZXIoY29scyA9IGMoLWFkbWluM19wY29kZSksIG5hbWVzX3RvID0gImZsb29kcyIsIHZhbHVlc190byA9ICJ2YWx1ZSIpICU+JSANCiAgbXV0YXRlKGZsb29kcyA9IHN0cl9yZW1vdmVfYWxsKGZsb29kcywgInllYXJfIikpICU+JSANCiAgZ3JvdXBfYnkoZmxvb2RzKSAlPiUgDQogIGZpbHRlcih2YWx1ZSA9PSBUUlVFKSAlPiUgDQogIHN1bW1hcmlzZSh0b3duc2hpcHNfYWZmZWN0ZWQgPSBuKCkpICU+JSANCiAgbXV0YXRlKGZsb29kcyA9IGZjdF9yZXYoZmxvb2RzKSkgJT4lIA0KICBnZ3Bsb3QoYWVzKHggPSB0b3duc2hpcHNfYWZmZWN0ZWQsIHkgPSBmbG9vZHMsIGZpbGwgPSBmbG9vZHMpKSArIA0KICBnZW9tX2NvbCgpICsgIA0KICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIsIA0KICAgICAgICBwbG90LmNhcHRpb24gPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUpKSArDQogIGxhYnMoeSA9ICIiLCANCiAgICAgICB4ID0gIk51bWJlciBvZiB0b3duc2hpcHMgYWZmZWN0ZWQiLCANCiAgICAgICB0aXRsZSA9ICJUb3duc2hpcHMgYWZmZWN0ZWQgYnkgZmxvb2RzIGFuZCBzdG9ybSBzdXJnZXMgKDIwMDgtMjAyMSkiLA0KICAgICAgIGNhcHRpb24gPSAiRGF0YSBzb3VyY2U6IE1JTVUgYW5kIFVORFAiKQ0KDQogIyBnZ3NhdmUoImJ5X2Zsb29kcy5wbmciLCBkcGkgPSAzMDAsIGhlaWdodCA9IDUsIHdpZHRoID0gOCwgdW5pdHMgPSAiaW4iKQ0KYGBgDQoNCjxicj4NCg0KQmFzZWQgb24gdGhpcyBkYXRhLCBhIHNjb3JlIHdhcyBjYWxjdWxhdGVkIGZvciBlYWNoIHRvd25zaGlwIGJhc2VkIG9uIGhvdyBtYW55IHRpbWVzIGl0IGhhZCBiZWVuIGFmZmVjdGVkIGJ5IGZsb29kcyBzaW5jZSAyMDA4LiBUaGUgdGFibGUgYmVsb3cgYWxzbyBzdW1tYXJpc2VzIHRoZSBudW1iZXIgb2YgcGVvcGxlIGluIG5lZWQgKDIwMjIpLiBgciBmc19waW4gJT4lIGZpbHRlcihmbG9vZF9jb3VudCA+IDQpICU+JSB7c3VtKC4kZnNfcGluKX0gJT4lIHJvdW5kKCkgJT4lIGZvcm1hdChiaWcubWFyayA9ICIsIilgIHBlb3BsZSBsaXZlIGluIHRvd25zaGlwcyB0aGF0IGhhdmUgZmxvb2RlZCBtb3JlIHRoYW4gNSB0aW1lcyBzaW5jZSAyMDA4LiANCg0KYGBge3J9DQpmc19waW4gJT4lIA0KICByZXBsYWNlX25hKGxpc3QoZmxvb2RfY291bnQgPSAwKSkgJT4lIA0KICAjIG11dGF0ZShmbG9vZF9jb3VudCA9IGlmZWxzZShmbG9vZF9jb3VudCA+IDQsICI1LTkiLCBmbG9vZF9jb3VudCkpICU+JSANCiAgZ3JvdXBfYnkoZmxvb2RfY291bnQpICU+JSANCiAgc3VtbWFyaXNlKHRvd25zaGlwcyA9IG4oKSwNCiAgICAgICAgICAgIHBlb3BsZV9pbl9uZWVkID0gcm91bmQoc3VtKGZzX3BpbiksIGRpZ2l0cyA9IDApKSAlPiUgDQogIGFycmFuZ2UoZGVzYyhmbG9vZF9jb3VudCkpICU+JSANCiAga2FibGUoY2FwdGlvbiA9ICJTdW1tYXJ5IHN0YXRpc3RpY3MgYnkgbnVtYmVyIG9mIGZsb29kcyAoMjAwOC0yMDIxKSIsIGZvcm1hdC5hcmdzID0gbGlzdChiaWcubWFyayA9ICIsIikpICU+JSANCiAga2FibGVfY2xhc3NpY18yKCJzdHJpcGVkIiwgZnVsbF93aWR0aCA9IEZBTFNFKSAlPiUgDQogIGNvbHVtbl9zcGVjKDE6Mywgd2lkdGggPSAiOGVtIikgJT4lIA0KICBmb290bm90ZSgiRGF0YSBzb3VyY2U6IE1JTVUgYW5kIFVORFAiLCBnZW5lcmFsX3RpdGxlID0gIiIpDQoNCmBgYA0KDQo8YnI+PGJyPg0KDQojIyMgMi4yIE1hcCBvZiBmbG9vZCByaXNrIA0KDQpUaGUgbWFwIGJlbG93IHNob3dzIHRoZSBwcm9iYWJpbGl0eSBvZiBlYWNoIHRvd25zaGlwIGJlaW5nIGFmZmVjdGVkIGJ5IGZsb29kcy4gVGhlIGFyZWFzIHdpdGggdGhlIGdyZWF0ZXN0IHJpc2sgb2YgZmxvb2RpbmcgYXJlIGluIE1vbiwgbmVhciB0aGUgbW91dGggb2YgdGhlIFNpdHRhdW5nIFJpdmVyIGFuZCB0aGUgR3VsZiBvZiBNb3R0YW1hIGFuZCB0aG9zZSBhbG9uZyB0aGUgQXlleWFyd2FkeSBSaXZlciwgYW5kIHRvIGEgbGVzc2VyIGV4dGVudCwgYWxvbmcgdGhlIENoaW5kd2luIFJpdmVyLiANCg0KPGJyPg0KDQpgYGB7ciBtYXAtZmxvb2RzLCBmaWcuaGVpZ2h0ID0gMTJ9DQoNCmZzX3BpbiAlPiUgDQogIGxlZnRfam9pbihwY29kZTNfc2hhcGUsIGJ5ID0gImFkbWluM19wY29kZSIpICU+JSANCiAgc3RfYXNfc2YoKSAlPiUgDQogIGdncGxvdCgpICsNCiAgZ2VvbV9zZihzaXplID0gMC4xLCBhZXMoZmlsbCA9IGZsb29kX3Byb2IpKSArDQogIGdlb21fc2YoZGF0YSA9IHBjb2RlMV9zaGFwZSwgc2l6ZSA9IDAuNSwgYWxwaGEgPSAwLCBjb2xvdXIgPSAiZ3JheTIwIikgKw0KICBzY2FsZV9maWxsX3ZpcmlkaXMob3B0aW9uID0gInBsYXNtYSIsIGRpcmVjdGlvbiA9IC0xLCBsYWJlbCA9IHBlcmNlbnRfZm9ybWF0KGFjY3VyYWN5ID0gMSkpICsNCiAgdGhlbWVfdm9pZCgpICsNCiAgdGhlbWUocGxvdC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSAid2hpdGUiLCBjb2xvdXIgPSBOQSksDQogICAgICAgIHBsb3QuY2FwdGlvbiA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSkpICsNCiAgbGFicyh0aXRsZSA9ICJGbG9vZCByaXNrIGluIE15YW5tYXIgKDIwMDgtMjAyMSkiLCANCiAgICAgICBmaWxsID0gImZsb29kXG5yaXNrIiwgDQogICAgICAgY2FwdGlvbiA9ICAiRGF0YSBzb3VyY2U6IE1JTVUgYW5kIFVORFAiKQ0KDQojIGdnc2F2ZSgiZmxvb2Rfcmlzay5wbmciLCBkcGkgPSAzMDAsIGhlaWdodCA9IDEyLCB3aWR0aCA9IDcsIHVuaXRzID0gImluIikNCmBgYA0KDQo8YnI+PGJyPg0KDQojIyMgMi4zIFJlZmVyZW5jZSB0YWJsZSBmb3IgZmxvb2QgcmlzayANCg0KQmVsb3cgaXMgYW4gaW50ZXJhY3RpdmUgcmVmZXJlbmNlIHRhYmxlIGZvciBmbG9vZCByaXNrIGJ5IHRvd25zaGlwLiBJdCBpbmNsdWRlcyB0aGUgbnVtYmVyIG9mIHRpbWVzIHNpbmNlIDIwMDggYSB0b3duc2hpcCBoYXMgYmVlbiBhZmZlY3RlZCBieSBmbG9vZGluZyAoZmxvb2RfY291bnQpIGFuZCB0aGUgcHJvYmFiaWxpdHkgb2YgZmxvb2RpbmcgKGZsb29kX3Jpc2spLiBTaW1pbGFyIHRvIHRoZSBpbnRlcmFjdGl2ZSB0YWJsZSBpbiB0aGUgcHJldmlvdXMgY2hhcHRlciwgdGhlIHNlYXJjaCBiYXIgY2FuIGJlIHVzZWQgdG8gZmluZCBzcGVjaWZpYyB0b3duc2hpcHMgYW5kIGFueSBvZiB0aGUgY29sdW1ucyBtYXkgYmUgc29ydGVkIGFjY29yZGluZyB0byBhc2NlbmRpbmcgb3IgZGVzY2VuZGluZyB2YWx1ZXMuIFRoZSB0YWJsZSBjdXJyZW50bHkgc2hvd3MgdG93bnNoaXBzIHNvcnRlZCBpbiBkZXNjZW5kaW5nIG9yZGVyIG9mIGZsb29kIHJpc2suDQoNCjxicj4NCg0KDQpgYGB7cn0NCmZzX3BpbiAlPiUgDQogIHNlbGVjdChzdGF0ZSwgdG93bnNoaXAsIHBvcF8yMDIxID0gcG9wdWxhdGlvbl8yMDIxX3Byb2osIHBwbF9rbTIgPSBwb3B1bGF0aW9uX2RlbnNpdHksIA0KICAgICAgICAgUElOID0gZnNfcGluLCB0YXJnZXQgPSBmc190YXJnZXRlZCwNCiAgICAgICAgIGZsb29kX3Jpc2sgPSBmbG9vZF9wcm9iLCBmbG9vZF9jb3VudCwNCiAgICAgICAgIGFkbWluM19wY29kZSkgJT4lIA0KICBhcnJhbmdlKGRlc2MoZmxvb2RfcmlzaykpICU+JSANCiAgZGF0YXRhYmxlKGZpbHRlciA9IGxpc3QocG9zaXRpb24gPSAidG9wIiwgY2xlYXIgPSBGQUxTRSksDQogICAgICAgICAgICBvcHRpb25zID0gbGlzdChwYWdlTGVuZ3RoID0gMTAsIHNjcm9sbFggPSBUUlVFKSwNCiAgICAgICAgICAgIGNhcHRpb24gPSBodG1sdG9vbHM6OnRhZ3MkY2FwdGlvbihzdHlsZSA9ICJjYXB0aW9uLXNpZGU6IHRvcDsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0LWFsaWduOiBjZW50ZXI7IGZvbnQtc2l6ZTogMTQwJTsiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJGbG9vZCByaXNrIGJ5IHRvd25zaGlwIikpICU+JSANCiAgZm9ybWF0Um91bmQoYygicG9wXzIwMjEiLCAicHBsX2ttMiIsICJ0YXJnZXQiLCAiUElOIiksIGRpZ2l0cyA9IDApICU+JSANCiAgZm9ybWF0Um91bmQoYygiZmxvb2RfcmlzayIpLCBkaWdpdHMgPSAyKQ0KIA0KYGBgDQoNCjxicj48YnI+PGJyPg0KDQojIyAzLiBUZWNobmljYWwgbm90ZXMNCg0KVGhlc2UgYW5uZXhlcyBjb250YWluIGFkZGl0aW9uYWwgdGVjaG5pY2FsIGluZm9ybWF0aW9uIHRoYXQgaW5mb3JtZWQgdGhlIGRlY2lzaW9ucyBpbiB0aGUgZWFybGllciBzZWN0aW9ucy4gDQoNCg0KIyMjIDMuMSBMaW1pdGF0aW9ucyBhbmQgbmV4dCBzdGVwcyANCg0KPGJyPg0KDQojIyMjIDMuMS5hIEZBTy1XRlAgZm9vZCBzZWN1cml0eSBzdXJ2ZXkgDQoNClRoZSBtb3N0IGltcG9ydGFudCBsaW1pdGF0aW9uIG9mIHRoZSBGQU8tV0ZQIHN1cnZleSB3YXMgdGhlIGV4Y2x1c2lvbiBvZiBzZXZlcmFsIGtleSBzdGF0ZXMgYW5kIHJlZ2lvbnMgZnJvbSB0aGUgc3VydmV5LiBPZiBwYXJ0aWN1bGFyIGludGVyZXN0IGFyZSBTYWdhaW5nLCBNYWd3YXkgYW5kIE1hbmRhbGF5IHdoZXJlIHRoZSBjb25mbGljdCBoYXMgYmVlbiBwYXJ0aWN1bGFybHkgaW50ZW5zZS4gDQoNCkZ1cnRoZXJtb3JlLCB0aGUgZHJ5IHpvbmUgd2FzIG5vdCBzdXJ2ZXllZC4gRnJvbSBhbiBhZ3JpY3VsdHVyYWwgcGVyc3BlY3RpdmUsIHRoaXMgaXMgYSBtYWpvciBvbWlzc2lvbiBhcyB0aGUgZGl2ZXJzaXR5IG9mIGNyb3BzIGFuZCwgY29uc2VxdWVudGx5LCBkaWV0cyBhcmUgbXVjaCBoaWdoZXIgaW4gdGhlIGRyeSB6b25lIHRoYW4gaW4gdGhlIG90aGVyIHBhcnRzIG9mIHRoZSBjb3VudHJ5LCB3aGljaCBhcmUgcHJlZG9taW5hbnRseSBmb2N1c2VkIG9uIHBhZGR5Lg0KDQpBZGRpdGlvbmFsbHksIHRoZSB0YXJnZXRpbmcgcHJvY2VzcyBwcm9wb3NlZCBpbiB0aGlzIGRvY3VtZW50IGhhcyBub3QgeWV0IGJlZW4gdHJpYWxsZWQgaW4gdGhlIGZpZWxkLiBUaGUgRm9vZCBTZWN1cml0eSBDbHVzdGVyIGRvZXMgbm90IGhhdmUgdGhlIHJlc291cmNlcyB0byB1bmRlcnRha2UgYSBmaWVsZCB0ZXN0IG9mIHRoaXMgc2NhbGUuIEhvd2V2ZXIsIGV2ZXJ5IGF0dGVtcHQgaGFzIGJlZW4gbWFkZSB0byBjb3Jyb2JvcmF0ZSB0aGUgZGF0YSBwcmVzZW50ZWQgaW4gaXQuIA0KDQpJbiBzcGl0ZSBvZiB0aGVzZSBtYWpvciBsaW1pdGF0aW9ucyBhbmQgdGhlIG51bWVyb3VzIGFzc3VtcHRpb25zIHRoYXQgaGF2ZSBoYWQgdG8gbWFkZSwgdGhlIEZBTy1XRlAgc3VydmV5IGlzIG1vc3QgY29tcHJlaGVuc2l2ZSBkYXRhc2V0IG9uIGZvb2Qgc2VjdXJpdHkgdGhhdCBoYXMgYmVlbiBjb2xsZWN0ZWQgc28gZmFyLiBBZGRpdGlvbmFsIGVmZm9ydHMgd2lsbCBiZSBtYWRlIHRvIGNyb3NzLXJlZmVyZW5jZSB0aGVzZSBkYXRhIGZyb20gdGhvc2Ugb2Ygb3RoZXIgc3VydmV5cy4gVGhlc2UgbW9kZWxzIHdpbGwgYmUgdXBkYXRlZCBvbmNlIHRoZSB0aGlyZCByb3VuZCBvZiB0aGUgRkFPLVdGUCBzdXJ2ZXkgaXMgcmVhZHkuIEFzIGEgZmluYWwgcG9pbnQgaW4gdGhpcyBzZWN0aW9uLCB0aGUgRkFPLVdGUCBzdXJ2ZXksIGluIHNwaXRlIG9mIGl0cyBsaW1pdGF0aW9ucyBmb3JtcyB0aGUgYmFzaXMgb2YgdGhlIFBlb3BsZSBpbiBOZWVkIGNhbGN1bGF0aW9ucywgd2hpY2ggdW5kZXJwaW5zIGEgbG90IG9mIHRoZSByZXNwb25zZS4gDQoNClRoaXMgcGFwZXIgc2VydmVzIGEgcHJvcG9zYWwgb24gaG93IHZ1bG5lcmFibGUgaG91c2Vob2xkcyAoc3VjaCBhcyB0aG9zZSBpbiB0aGUgcHJpb3JpdHkgZ3JvdXApIG1heSBiZSBpZGVudGlmaWVkIGFuZCB0YXJnZXRlZC4gU2hvdWxkIHRoaXMgbWV0aG9kb2xvZ3kgcHJvdmUgc291bmQgYW5kIHZpYWJsZSwgaXQgaXMgc3VnZ2VzdGVkIHRoYXQgaXQgYmUgYXBwbGllZCB0byBlaXRoZXIgSUZQUkkncyBIb3VzZWhvbGQgV2VsZmFyZSBTdXJ2ZXkgYXMgd2VsbCBhcyBkYXRhIGNvbGxlY3RlZCBpbiB0aGUgdGhpcmQgcm91bmQgb2YgdGhlIEZBTy1XRlAgZm9vZCBzZWN1cml0eSBzdXJ2ZXkuIA0KDQo8YnI+PGJyPg0KDQojIyMjIDMuMS5iIE1JTVUtSEFSUCB2dWxuZXJhYmlsaXR5IGFuYWx5c2lzIA0KDQpUaGUgcmVzdWx0cyBvZiB0aGUgMjAxNSBbTUlNVS1IQVJQIFZ1bG5lcmFiaWxpdHkgQW5hbHlzaXNdKGh0dHA6Ly90aGVtaW11LmluZm8vdnVsbmVyYWJpbGl0eS1pbi1teWFubWFyKSAodXNlZCB0byBpbmZvcm0gc2NvcmVzIGZvciBtdWx0aWRpbWVuc2lvbmFsIHZ1bG5lcmFiaWxpdHkpLCBoYXZlIGJlZW4gdXBkYXRlZCB1c2luZyB0aGUgMjAxOSBJbnRlci1DZW5zYWwgU3VydmV5IHJlc3VsdHMgdXNpbmcgdGhlIGZvbGxvd2luZyBmb3JtdWxhOiAgDQoNCiQkDQoyMDE5VHNwVmFsdWUgPSAyMDE1VHNwVmFsdWUgLyAyMDE1RGlzdHJpY3RWYWx1ZSBcY2RvdCAyMDE5RGlzdHJpY3RWYWx1ZQ0KJCQNCg0KVGhpcyBhbGxvd3MgdGhlIG5ldyB0b3duc2hpcCB2YWx1ZXMgdG8gdGFsbHkgd2l0aCB0aGUgMjAxOSBkaXN0cmljdC1sZXZlbCBpbnRlci1jZW5zYWwgc3VydmV5IHJlc3VsdHMgYXMgd2VsbCBhcyB0byBwcmVzZXJ2ZSB0aGUgb3JkZXIgYW5kIHJlbGF0aW9uc2hpcHMgb2YgdG93bnNoaXBzIHdpdGhpbiBlYWNoIGRpc3RyaWN0LiBGb3IgdGhlIHR3byBpbmRpY2F0b3JzIGluIHRoZSAyMDE1IGRhdGFzZXQgYnV0IG5vdCBjb3ZlcmVkIGluIHRoZSAyMDE5IGludGVyLWNlbnNhbCBzdXJ2ZXksIHRoZXkgd2VyZSBmb3J3YXJkIGZpbGxlZCwgdXNpbmcgdGhlaXIgMjAxNSB2YWx1ZXMuIFRvIGZ1cnRoZXIgaW1wcm92ZSB0aGVzZSBlc3RpbWF0aW9ucywgbXVsdGlwbGUgaW1wdXRhdGlvbiBzaG91bGQgYmUgZW1wbG95ZWQuIEJ1dCB0aGF0IHdpbGwgYmUgbGVmdCBmb3IgYW55IHN1YnNlcXVlbnQgcmV2aXNpb25zIHRvIHRoaXMgZG9jdW1lbnQuIA0KDQo8YnI+PGJyPg0KDQojIyMjIDMuMS5jIENvbmZsaWN0IGRhdGEgYW5kIEFDTEVEDQoNClBlcmhhcHMgdGhlIG1vc3Qga2V5IGxpbWl0YXRpb24gaGFzIGFsc28gYmVlbiB0aGUgbGFjayBvZiBmaWVsZCBhY2Nlc3MgYW5kIGRldGFpbGVkIGFzc2Vzc21lbnQgZGF0YSBmcm9tIG1hbnkgcGFydHMgb2YgdGhlIGNvdW50cnkuIFdpdGggdGhlIGNvbmZsaWN0IG9uZ29pbmcsIGFuZCB0aGUgZm9vdHByaW50cyBvZiBodW1hbml0YXJpYW4gYWdlbmNpZXMgbGFyZ2VseSBza2V3ZWQgdG93YXJkcyBZYW5nb24gYW5kIFJha2hpbmUsIHdoaWNoIGhhdmUgYmVlbiBjb21wYXJhdGl2ZWx5IGxlc3MgYWZmZWN0ZWQgYnkgdGhlIGN1cnJlbnQgY3Jpc2lzLCB0aGVyZSBpcyBhIGRlbW9uc3RyYWJsZSBkZWFydGggb2YgZmlyc3QtaGFuZCBpbmZvcm1hdGlvbiBpbiBrZXkgYXJlYXMuIFRoaXMgZG9jdW1lbnQgaGFzIGludGVuZGVkIHRvIGNpcmN1bXZlbnQgdGhpcyB0aHJvdWdoIHRoZSB1c2Ugb2YgQUNMRUQgZGF0YSwgd2hpY2ggaXMgdGhlIG1vc3QgY29tcGxldGUgc2V0IG9mIGNvbmZsaWN0IGluY2lkZW50IGRhdGEgaW4gTXlhbm1hci4gDQoNCkhvd2V2ZXIsIHRoZSBBQ0xFRCBkYXRhc2V0IGlzIG5vdCB3aXRob3V0IGl0cyBsaW1pdGF0aW9ucyAtLSB0aGUgbWFqb3JpdHkgb2YgaXRzIGluZm9ybWF0aW9uLCBhYm91dCA4NSBwZXJjZW50LCBjb21lcyBmcm9tIHN1Ym5hdGlvbmFsLCBuYXRpb25hbCBhbmQgaW50ZXJuYXRpb25hbCBtZWRpYSBzb3VyY2VzLiBUaGUgcmVtYWluZGVyIGNvbWVzIGZyb20gQUNMRUTigJlzIHBhcnRuZXIsIHRoZSBNeWFubWFyIFBlYWNlIE1vbml0b3IsIGFuZCByZXBvcnRzIGZyb20gVU4gYWdlbmNpZXMsIGludGVybmF0aW9uYWwgbW9uaXRvcmluZyBncm91cHMsIGFuZCBsb2NhbCBodW1hbiByaWdodHMgb3JnYW5pc2F0aW9ucy4gVGhlIGNvbXBsZXRlbmVzcyBvZiB0aGUgY29uZmxpY3QgZGF0YSBhbmQgaG93IHJlcHJlc2VudGF0aXZlIGl0IGlzIG9mIHRoZSBzaXR1YXRpb24gb24gdGhlIGdyb3VuZCBpcyBub3Qgc29tZXRoaW5nIHRoYXQgaXMgZWFzaWx5IHZlcmlmaWFibGUuIFRob3VnaCBpdCBzaG91bGQgYmUgbm90ZWQgdGhhdCBBQ0xFRCBzdGlsbCBoYXMgdGhlIGxhcmdlc3QgYW5kIG1vc3QgY29tcHJlaGVuc2l2ZSBkYXRhc2V0IG9mIGNvbmZsaWN0IGluY2lkZW50cyBpbiBNeWFubWFyLiANCg0KPGJyPjxicj4NCg0KIyMjIDMuMiBDYWxjdWxhdGluZyB0aGUgY29uZmxpY3Qgc2NvcmUNCg0KVGhlIGNvbmZsaWN0IHNjb3JlIGhlcmUgb3JpZ2luYWxseSBhcHBlYXJlZCBpbiB0aGUgRm9vZCBTZWN1cml0eSBDbHVzdGVyJ3MgcmVwb3J0IFtVbmRlcnN0YW5kaW5nIENvbmZsaWN0IER5bmFtaWNzIGluIE15YW5tYXIgdGhyb3VnaCBDb25mbGljdCBhbmQgSW5jaWRlbnQgRGF0YTogQSBGb29kIFNlY3VyaXR5IFBlcnNwZWN0aXZlXShodHRwczovL2Zvb2Qtc2VjdXJpdHktY2x1c3Rlci1teWFubWFyLmdpdGh1Yi5pby9leHBsb3JhdG9yeS1kYXRhLWFuYWx5c2lzLWFjbGVkLWZzYy8pLiBJdCB3YXMgY2FsY3VsYXRlZCB1c2luZyBBQ0xFRCBkYXRhIGFuZCB5aWVsZHMgYSBzY29yZSBmb3IgZWFjaCB0b3duc2hpcC4gDQoNClRoZSBjb25mbGljdCBzY29yZSBpcyBhbiB1cGRhdGUgb2YgdGhlIGNvbmZsaWN0IGluZGV4IGluIHRoZSBbTUlNVS1IQVJQIFZ1bG5lcmFiaWxpdHkgQW5hbHlzaXNdKGh0dHA6Ly90aGVtaW11LmluZm8vdnVsbmVyYWJpbGl0eS1pbi1teWFubWFyKSwgdXNpbmcgMjAyMSBkYXRhLiBUaGUgc3BlY2lmaWMgY29uZmxpY3QgdmFyaWFibGVzIHRoYXQgaW5jbHVkZWQgaW4gdGhlIHNjb3JlIHdlcmUgYmF0dGxlcywgZXhwbG9zaW9ucyBhbmQgcmVtb3RlIHZpb2xlbmNlLCBub24tcGVhY2VmdWwgcHJvdGVzdHMgYW5kIHJpb3RzLCBjb25mbGljdC1yZWxhdGVkIGZhdGFsaXRpZXMsIHN0cmF0ZWdpYyBkZXZlbG9wbWVudHMgYW5kIG51bWJlciBvZiBJRFBzLiBPbmx5IHRoZSB2ZXJzaW9uIG9mIHRoZSBjb25mbGljdCBzY29yZSB3aXRoaW4gdGhpcyBkb2N1bWVudCB0YWtlcyBJRFBzIGludG8gYWNjb3VudDsgaW4gdGhlIEZvb2QgU2VjdXJpdHkgQ2x1c3RlcidzIGVhcmxpZXIgcmVwb3J0IG9uIGNvbmZsaWN0IChsaW5rZWQgaW4gdGhlIHByZXZpb3VzIHBhcmFncmFwaCksIHRoZSBDbHVzdGVyIGRpZCBub3QgeWV0IGhhdmUgYWNjZXNzIHRvIGRldGFpbGVkIElEUCBkYXRhLiANCg0KVGhlIGNvbmZsaWN0IHNjb3JlIGlzIGFuIGF2ZXJhZ2Ugb2YgdGhlIG5vcm1hbGlzZWQgdmFsdWVzIG9mIGtleSBjb25mbGljdCBpbmRpY2F0b3JzLiBJdHMgbWFpbiB1c2UgaXQgdG8gYWlkIGRlY2lzaW9ucyBhYm91dCBnZW9ncmFwaGljIHByaW9yaXRpc2F0aW9uLiBUaGVzZSBub3JtYWxpc2VkIHZhbHVlcyBoYXZlIGJlZW4gcmUtd2VpZ2h0ZWQgd2l0aCBCZXR0aS1WZXJtYSBtZXRob2QsIHdoaWNoIHBlbmFsaXNlcyByZWR1bmRhbmN5IGFuZCByZXdhcmRzIHZhcmlhdGlvbjsgdGhpcyBpcyB0aGUgb25seSBub3RhYmxlIGRpdmVyZ2VuY2UgZnJvbSB0aGUgTUlNVS1IQVJQIG1ldGhvZG9sb2d5LiBUaGUgQmV0dGktVmVybWEgbWV0aG9kIHdhcyBlbXBsb3llZCB0aHJvdWdoIHRoZSAqKmBtZGVwcml2YCoqIHBhY2thZ2UgZGV2ZWxvcGVkIGJ5IEF0dGlsaW8gYW5kIEFsZG8gQmVuaW5pLg0KDQpVbmxpa2UgdGhlIEZvb2QgSW5zZWN1cml0eSBTY29yZSwgdGhlIGNvbXBvbmVudCB2YXJpYWJsZXMgb2YgdGhlIGNvbmZsaWN0IGluZGV4IHdlcmUgbm90IGJpbmFyeSwgbWVhbmluZyB0aGF0IGl0IHdhcyBwb3NzaWJsZSB0byB0YWtlIGFkdmFudGFnZSBvZiB0aGUgQmV0dGktVmVybWEgbWV0aG9kJ3MgZG91YmxlLXdlaWdodGluZyBydWxlIHdoaWNoIGlzIHNlbnNpdGl2ZSB0byBib3RoIHRoZSByZWxhdGl2ZSBmcmVxdWVuY3kgb2YgdGhlIHZhcmlhYmxlcyBhbmQgdGhlIGNvcnJlbGF0aW9uIGFtb25nc3QgdmFyaWFibGVzOiANCg0KJCQNCndfaiBccHJvcHRvICh3X2peYSBcY2RvdCB3X2peYikNCiQkDQoNCkhvd2V2ZXIsIGl0IG11c3QgYmUgbm90ZWQgdGhhdCB3aGlsc3QgdGhlIHNjb3JlcyB0aGVtc2VsdmVzIGNhbiBiZSBzaGFyZWQgYW5kIHVzZWQsIHJlcGxpY2F0aW5nIGFsbCB0aGUgY2FsY3VsYXRpb25zIHdpbGwgbmVjZXNzaXRhdGUgb2J0YWluaW5nIHBlcm1pc3Npb24gZnJvbSBbVU5IQ1JdKG1haWx0bzo8TmlpIEFrbyBTb3dhPnNvd2FuaWlAdW5oY3Iub3JnP2NjPW15YXlhaW1AdW5oY3Iub3JnJnN1YmplY3Q9TXlhbm1hciUyMElEUCUyMGRhdGEpIGFzIHRoZWlyIHRvd25zaGlwLWxldmVsIGJyZWFrZG93biBvZiBJRFAgcG9wdWxhdGlvbnMgaGF2ZSBub3QgYmVlbiBzaGFyZWQgcHVibGljbHkuIFRoZSBzcGVjaWZpYyBjb2RlIGZvciBjYWxjdWxhdGluZyB0aGUgY29uZmxpY3Qgc2NvcmUgY2FuIGJlIGZvdW5kIGJlbG93LiANCg0KPGJyPg0KDQpgYGB7ciBldmFsPUZBTFNFLCBlY2hvPVRSVUV9DQoNCiMgQmV0dGktVmVybWEgY2FsY3VsYXRpb25zIGFuZCB0aGUgY29uc3RydWN0aW9uIG9mIHRoZSBjb25mbGljdCBzY29yZQ0KaW5kZXhfc2hhcmVzMiA8LSBjb25mbGljdF9kZjIgJT4lICAgDQogIG11dGF0ZV9hdCh2YXJzKGMoYmF0dGxlcywgZXhwbG9zaW9uc19yZW1vdGVfdmlvbGVuY2UsIHZpb2xlbmNlX2FnYWluc3RfY2l2aWxpYW5zLCANCiAgICAgICAgICAgICAgICAgICBmYXRhbGl0aWVzLCBzdHJhdGVnaWNfZGV2ZWxvcG1lbnRzLCANCiAgICAgICAgICAgICAgICAgICBwcm90ZXN0c19hbmRfcmlvdHMsIHRvdGFsX2lkcHMpKSwgDQogICAgICAgICAgIHNjYWxlKSAlPiUgIA0KICBtdXRhdGVfYXQodmFycyhjKGJhdHRsZXMsIGV4cGxvc2lvbnNfcmVtb3RlX3Zpb2xlbmNlLCB2aW9sZW5jZV9hZ2FpbnN0X2NpdmlsaWFucywgDQogICAgICAgICAgICAgICAgICAgZmF0YWxpdGllcywgc3RyYXRlZ2ljX2RldmVsb3BtZW50cywgDQogICAgICAgICAgICAgICAgICAgcHJvdGVzdHNfYW5kX3Jpb3RzLCB0b3RhbF9pZHBzKSksIA0KICAgICAgICAgICBmdW5zKCguIC0gbWluKC4sIG5hLnJtID0gVCkpLyhtYXgoLiwgbmEucm0gPSBUKSAtIG1pbiguLCBuYS5ybSA9IFQpKSkpICU+JSANCiAgbWRlcHJpdihjKCJiYXR0bGVzIiwgImV4cGxvc2lvbnNfcmVtb3RlX3Zpb2xlbmNlIiwgDQogICAgICAgICAgICAidmlvbGVuY2VfYWdhaW5zdF9jaXZpbGlhbnMiLCAiZmF0YWxpdGllcyIsIA0KICAgICAgICAgICAgInN0cmF0ZWdpY19kZXZlbG9wbWVudHMiLCAicHJvdGVzdHNfYW5kX3Jpb3RzIiwgInRvdGFsX2lkcHMiKSwNCiAgICAgICAgICAjIElEUCBjb3VudHMgaGF2ZSBiZWVuIHVzZWQgaW4gdGhlIHNjb3JlLCBidXQgd2lsbCBub3QgYmUgcmVhZCANCiAgICAgICAgICAjIGludG8gdGhpcyByZXBvcnQNCiAgICAgICAgICBtZXRob2QgPSAiYnYiLCBvdXRwdXQgPSAiYWxsIikNCg0KDQpgYGANCg0KPGJyPg0KDQpGb3IgcmVmZXJlbmNlLCBiZWxvdyBpcyB0aGUgY29kZSB1c2UgdG8gY2x1c3RlciB0b3duc2hpcHMgYWNjb3JkaW5nIHRvIHRoZSBjb25mbGljdCBhbmQgbXVsdGlkaW1lbnNpb25hbCB2dWxuZXJhYmlsaXR5LiANCg0KYGBge3IgZWNobyA9IFRSVUUsIGV2YWwgPSBGQUxTRX0NCiMgay1tZWFucyBjbHVzdGVyaW5nIGFuZCBvdXRwdXQNCnNldC5zZWVkKDEyMykNCg0Ka21fcmVzMiA8LSBmc19waW4gJT4lIA0KICByZXBsYWNlX25hKGxpc3QoZmF0YWxpdGllcyA9IDApKSAlPiUgDQogIHNlbGVjdChwb3B1bGF0aW9uX2RlbnNpdHksIA0KICAgICAgICAgY29uZmxpY3Rfc2NvcmUsIA0KICAgICAgICAgdnVsbmVyYWJpbGl0eV9zY29yZSwgDQogICAgICAgICBmYXRhbGl0aWVzKSAlPiUNCiAgbXV0YXRlX2F0KHZhcnMocG9wdWxhdGlvbl9kZW5zaXR5LCANCiAgICAgICAgICAgICAgICAgY29uZmxpY3Rfc2NvcmUsIA0KICAgICAgICAgICAgICAgICB2dWxuZXJhYmlsaXR5X3Njb3JlLCANCiAgICAgICAgICAgICAgICAgZmF0YWxpdGllcyksIA0KICAgICAgICAgICAgfiAoLnggLSBtaW4oLngpKSAvIChtYXgoLngpIC0gbWluKC54KSkpICU+JSANCiAga21lYW5zKDUsIG5zdGFydCA9IDI1KQ0KDQpgYGANCg0K