Methods 1 | December 2023

SORAYA GRACE BARAR

Purpose

This research has been conducted with the goal of exploring how the impacts of redlining are seen through the demographic characteristics of the Bronx, and more specifically the South Bronx in comparison to the rest of New York City.

Introduction & Background

The Bronx is the northmost borough of NYC. It is a peninsula that borders the Hudson, Harlem, and East Rivers. Residents are cut off to their waterfront due to highway routes along the Bronx’s borders. More specifically, The South Bronx is a neighborhood that includes communities south of the Cross-Bronx Expressway and west of the Bronx River. Mott Haven and Port Morris are the two main neighborhoods of the South Bronx, with the former also being known by the alias “Asthma Alley.” This research includes the neighborhoods, Hunts Point, Longwood, Melrose, Morrisania, and Mott Haven-Port Morris in the analysis of the South Bronx. Many studies have been conducted to analyze the immense impact of environmental injustices on these communities. These injustices include, but are not limited to, excessive pollution by industrial sites and peaker power plants, car exhaust pollution from the highways and major trucking routes that cut through these neighborhoods as well as an unprotected and undeveloped waterfront. 

Today, the Bronx is one of the poorest counties in the United States and asthma is the leading cause of hospitalization and of school absence for children. Children in the Bronx are twice as likely to be hospitalized for asthma and are more likely to die of asthma than other US children. The health of a community is inextricably linked to other demographic variables such as educational attainment, and income, as no issue can or should be viewed in isolation. Out of all five boroughs in New York city, the Bronx also has the highest percentage of people of color (BIPOC).  These statistics are without a question linked to the systemic disinvestment of the Bronx, specifically the South Bronx. 

This research seeks to begin to understand the effect that redlining continues to have on communities in the Bronx. As well as to better understand who are the people that are carrying the burden of environmental injustice in the South Bronx to support ongoing research and activism work by local organizations working to promote and protect the health, safety, culture, and wellbeing of Bronx residents. 

This study utilizes data from the 2020 American Decennial Census as well as the 2020 American Community Survey (ACS). It is important to note that ACS data is collected via 1 and 5 year surveys and unlike census data, it is an estimate not an exact count. Both the census and acs data are connected to historical redlining data using a geospatial join. The redlining data was accessed and downloaded from Mapping Inequality, a collaborative effort across three teams to digitize redlining maps and make them accessible to the public.

Redlining & Disinvestment

One of the main pollutants in the Bronx is the air and noise pollution that comes from traffic on the Cross Bronx Expressway. The Cross Bronx Expressway was built by Robert Moses, with construction starting in 1948. More than 60,000 residents were displaced from their homes due to its construction. This is the largest displacement of communities out of any American infrastructure project. This project resulted in the loss of property value for communities surrounding the new Expressway as well as white flight to the suburbs. 

The residents that remained in the Bronx after the construction of the expressway were largely black and brown and their mobility was further constrained by the implementation of racist housing policies and redlining. Redlining was a racist government practice in which the government created maps determining and assigning grades to a neighborhood’s investment worthiness based on race in the late 1930s. The grades were color coded: A was green and “Best”, B was blue and “Still Desirable”, C was yellow and “Declining”, and D was red and “Hazardous”. For example the Morrisania neighborhood was given a D rating and the following remarks were made about the area, “There is a steady infiltration of negro Spanish and Puerto Rican into the area. Population is very unstable and the relief load is heavy. Section is very congested with considerable small business scattered everywhere. One of the poorest areas in the Bronx.” These gradings and remarks about specific neighborhoods and census tracts based off of racist assumptions and stereotypes still impact the area today. 

FIGURE 1. Robert K. Nelson, LaDale Winling, Richard Marciano, Nathan Connolly, et al., “Mapping Inequality,” American Panorama, ed. Robert K. Nelson and Edward L. Ayers
FIGURE 1. Robert K. Nelson, LaDale Winling, Richard Marciano, Nathan Connolly, et al., “Mapping Inequality,” American Panorama, ed. Robert K. Nelson and Edward L. Ayers

Redlining was created to segregate communities and allowed for white people to access subsidized housing loans, while restricting people of color to the “less desirable” areas of the city. These maps were created by the Home Owners Loan Corporation (HOLC) and set a precedent allowing white communities and families to access generational wealth through homeownership. The process of redlining only fueled white flight and formalized the conflation of proximity to people of color (largely black and hispanic in the Bronx) with declining home values. The HOLC’s redlining maps formalized and justified systemic disinvestment in neighborhoods with high percentages of people of color.

Results

Race

The table below displays New York City’s five boroughs and the racial demographic break down for each census defined racial category. Out of the five boroughs, the Bronx has the highest percentage of BIPOC residents. The Bronx is 89% BIPOC, with 52% of its residents identifying as Latinx (Hispanic or Latino as defined by the census).

Figure 2. New York City Boroughs, by Race

Examining the Bronx itself more closely it is easily discerned that the highest concentrations of residents that identify as Black or as Latinx reside in the South Bronx, as well as a predominate concentration of residents identifying as Black in the North East Bronx. This is evidenced by the maps below.

Educational Attainment

The table below displays the percentage of residents across all five New York City boroughs who have completed their education at least up to a bachelors degree. In the context of this study educational attainment is used as a variable to mark the amount of investment into a neighborhood or community and the priority of some individual’s education over others. As evidenced, by the map of the Bronx below neighborhoods and census tracks with higher populations of white residents and fewer BIPOC residents have higher percentages of residents with at least a bachelor’s degree. The table shows that the Bronx has the lowest percentage of residents with bachelors degrees out of all NYC boroughs. Only 22% of Bronx residents have bachelors degrees compared to 64% of Manhattan residents with bachelors degrees, this is a clear indicator of investment and prioritization of some NYC residents over others, specifically white residents over BIPOC residents.

Figure 7. New York City Boroughs, by Educational Attainment

Median Household Income (MHI)

The table below displays the median household income across all 5 New York City boroughs. The city wide average median household income is $79,157.08. The Bronx has the lowest median household income at $50,977.41 and Manhattan has the highest, with a median household income of $109,008. Upon examining the Bronx more closely by median household income it becomes clear that census tracts with higher percentages of white residents have higher median household incomes as a whole. Additionally the areas where median household income is highest in the Bronx are areas in Northern Bronx father away from the polluting facilities and expressways in the South Bronx.

Figure 9. New York City Boroughs, by Median Household Income

Demographics Statistics and HOLC Grades (redlining grades)

The two tables below allow you to sort Bronx neighborhoods based on various demographic statistics such as, race, educational attainment, population size, language, and job occupation while viewing the HOLC grades associated with each neighborhood. These tables offer an exploratory analysis of Bronx neighborhoods and would be useful to organizations or individuals looking to find quick information regarding redlining and its effect on a particular neighborhood.

Figure 12. Bronx Demographics & HOLC Grade Statistics by Neighborhood
Figure 12. South Bronx Demographic & HOLC Grade Statistics by Neighborhood

The table below displays the Bronx broken up by HOLC grades. This table allows viewers to quickly make connections between HOLC grade and demographic statistics. It becomes evident from this table that 82% of Bronx residents live in neighborhoods that have been assigned either a C or D rating meaning that 82% of Bronx residents live in neighborhoods that have been classified as “Definitely Declining” or “Hazardous”.

Figure 13. Bronx Demographics by HOLC Grade
Bronx Census Tracts & The Effect of Redlining on Educational Attainment & Median Household Income (MHI)

The scatter plot below compares the estimated median household income of every census tract in the Bronx with the percent of that census tract that has completed their education at least up until a bachelor’s degree. The points on the chart are colored by HOLC grade with green representing an A grade (best), blue representing a B grade (still desirable), yellow representing a C grade (definitely declining), and red representing a D grade (hazardous). The size of each point represents the size of the population of each tract. The graph below has a clear positive correlation between median household income and the percent of the population that has at least a bachelors degree. Meaning that as the median household income (MHI) increases so does the percentage of the population that has at least completed a bachelors degree. From the chart is it also easily discernible that the HOLC grade increase in desireablity with the increase in MHI and increase in educational attainment.

Bronx Census Tracts & The Effect of Redlining on Race and Median Household Income (MHI)

The scatter plot below compares MHI in Bronx census tracts with the percent of the population that identifies as non-white or BIPOC. Similar to the plot above, the points are colored by HOLC grades and their size is determined by the size of the population in that particular tract. This graph clearly illustrates the correlation between HOLC grades and race. The majority of the red points on the plot (tracts that received a D grade) are in the lower right quadrant. This illustrates that people of color who are the overwhelming majority in formally red-lined neighborhoods are making significantly less money than their white neighbors. Even today almost 100 years after these racist policies were put into practice the HOLC grades racially segregate neighborhoods and the lasting effects of systemic disinvestment are still deeply felt within these formally red-lined neighborhoods. For example, the Riverdale-Spuyten Duyvil neighborhood in North-Eastern Bronx has an HOLC grade of A and only 31% of its residents are BIPOC (the Bronx as a whole is 89.9% BIPOC) and the median household income is $128,919. The neighborhood of Melrose in the South Bronx has a HOLC grade of D and is comprised of a population that is 98% BIPOC and a MHI of $15,957.

Map of the Bronx, by HOLC Grades

The map below is a clear visual depiction of HOLC grades in the Bronx. Same as the graphs above the areas colored green are areas that received a grade of A, the areas colors blue are areas that received a grade of B, the areas that are colored yellow are areas that received a grade of C, and the areas that are colored red are areas that received a grade of D. Upon hover, the tool tip will display the neighborhood that that specific census tract is located in the HOLC grade it received the population of that area, the percent of residents that identify as non-white or BIPOC, the median household income, the percent of the population with at least a bachelor’s degree, the most prevalent language spoken in that area as well as the most prevalent occupation in that area. It becomes visually clear from the map below that the majority of the Bronx received a rating either of C or D and that the most D grades were granted to tracts in the South Bronx.

Discussion

The racist grading system created by the Home Owners Loan Corporation (HOLC) not only perpetuated racial segregation but also established a foundation for systemic disinvestment. The correlation between HOLC grades, race, educational attainment, and income levels remains pronounced 100 years later, demonstrating the lasting impact of redlining on community development. Residents that live in neighborhoods that recived a D rating from the HOLC have an average MHI of $36,122 while residents that live in neighborhoods that received an A rating from the HOLC have an average MHI of $106,896. In our economic system, generational wealth is inextricably linked to ownership of property and land. Thus residents in neighborhoods that received a D rating have been systemically excluded from the prospect of generational wealth largely due to race. 100 years later it is still people of color that are being most impacted by these policies. Neighborhoods that received either a C or D rating are comprised of residents that are over 90% BIPOC. The systemic disinvestment in these neighborhoods extends far past homeownership and the opportunity to build generational wealth. The disinvestment applies also to the creation of schools, the placement of polluting facilities, and the protection of resident’s safety from climate disasters. 

These results become even more pertainent upon examining the intersection between the disproportionately high rates of asthma in the South Bronx and the systemic disinvestment through HOLC redlining practices. In conclusion, this research sheds light on the persistent consequences of redlining, emphasizing the need for comprehensive, community-centered approaches to break the cycle of systemic disinvestment and promote equitable development in the Bronx.

Further Work & Next Steps

To continue to expand this research it would be interesting to look at how these demographics and characteristics of the neighborhoods have changed over time and to pull in more variables to show the effects of systemic race-based disinvestment. I would be interested in looking into the proportion of schools built in formally red-lined neighborhoods versus the building or implementation of industrial facilities such as last mile warehouses, powerplants, and sanitation facilities. I would also like to examine access to food, specifically groceries and produce between formally red-lined neighborhoods and neighborhoods that were granted A ratings. Additionally, I think it would be revealing to examine green space disparities between redlined neighborhoods and neighborhoods granted A ratings. A further look into education particularly All of these intersections would potentially help build a data based case for areas like the South Bronx advocating more city-backed investment in the health, safety, prosperities of these communities.

Methods Appendix

This study utilizes data from the 2020 American Decennial Census as well as the 2020 American Community Survey (ACS). It is important to note that ACS data is collected via 1 and 5 year surveys and unlike census data, it is an estimate not an exact count.

For the analysis of racial demographics in New York city this study uses the PN table from the decennial census, all racial categories were accessed through the census api and then calculations were done to obtain percentages of each race in each census tract. For example, the percentage of hispanic/latino or Latinx residents was calculated by dividing the variable P2_002N (hispanic or latino) by P1_001N (total population).

The analysis of educational attainment was done using data from the 2020 American Community Survey. The calculation for the percent of residents with at least a bachelors degree was done by taking the sum of the numer of residents with a bachelors degree, masters degree, professional degree and doctoral degree and dividing it by the total population over 25 years old.

The primary occupation for each census tract was identified by pulling all the census defined occupations from the 2020 American Community Survey and performing a mutate of the data to find the most prevalent occupation for each census tract. The same calculations were done for the language variables form the American Community Survey’s API. Both the decennial census and American Community Survey data are connected to historical redlining data using a geospatial join. The redlining data was accessed and downloaded from Mapping Inequality, a collaborative effort across three teams to digitize redlining maps and make them accessible to the public.

This research does cannot claim that redlining is the sole reason for the demographic disparities that is observed between Bronx neighborhoods or the disparities that are made noticeable between the Bronx and the other four New York City boroughs. There are many variables that could potentially influence these characteristics and due to time, and my personal ability to analyze and interpret data I used my best judgement to determine the variables to include in this study.

LS0tCnRpdGxlOiAiU291dGggQnJvbnggQXJlYSBQcm9maWxlIGFuZCBUaGUgSGlzdG9yeSBhbmQgSW1wYWN0IG9mIFJlZGxpbmluZyBpbiB0aGUgQnJvbngiCm91dHB1dDoKICBodG1sX2RvY3VtZW50OgogICAgZGZfcHJpbnQ6IHBhZ2VkCiAgICB0b2M6IHRydWUKICAgIHRvY19kZXB0aDogMgogICAgdG9jX2Zsb2F0OiB0cnVlCiAgICBjb2RlX2Rvd25sb2FkOiB0cnVlCiAgICB0aGVtZTogc2FuZHN0b25lCi0tLQoKYGBge3IgbWVzc2FnZT1GQUxTRSwgcmVzdWx0cz0naGlkZScsIGluY2x1ZGU9RkFMU0V9CmtuaXRyOjpvcHRzX2NodW5rJHNldCh3YXJuaW5nPUZBTFNFLCBtZXNzYWdlPUYsIGVjaG89RkFMU0UsIHF1aWV0bHk9VCkKbGlicmFyeSh0aWR5dmVyc2UpCmxpYnJhcnkodGlkeWNlbnN1cykKbGlicmFyeShzZikKbGlicmFyeShzY2FsZXMpCmxpYnJhcnkodmlyaWRpcykKbGlicmFyeShrbml0cikKbGlicmFyeShSQ29sb3JCcmV3ZXIpCmxpYnJhcnkoa25pdHIpCmxpYnJhcnkocGxvdGx5KQpsaWJyYXJ5KFJTb2NyYXRhKQpsaWJyYXJ5KGdnYmxhbmtldCkgIyBmb3IgZWFzeSB2aXN1YWxpemF0aW9ucyBiYXNlZCBvbiBnZ3Bsb3QyCmxpYnJhcnkoRFQpCmxpYnJhcnkoZ2djaGFydHMpCmxpYnJhcnkoc2YpCmxpYnJhcnkoZ2VvanNvblIpCmxpYnJhcnkoZGJwbHlyKQpgYGAKCmBgYHtyIG1lc3NhZ2U9RkFMU0UsIHJlc3VsdHM9J2hpZGUnLCBxdWlldGx5PVRSVUV9CiMgbG9hZCBhIGxpc3Qgb2YgYWxsIGRlY2VubmlhbCBjZW5zdXMgZGF0YSBmcm9tIHRoZSBSZWRpc3RyaWN0aW5nIEZpbGUKcGxfdmFyc18yMDIwIDwtIGxvYWRfdmFyaWFibGVzKDIwMjAsICJwbCIsIGNhY2hlID0gVCkgCgojIGxvYWQgYSBsaXN0IG9mIGFsbCBhY3MgdmFyaWFibGVzCmFjc192YXJzXzIwMjAgPC0gbG9hZF92YXJpYWJsZXMoMjAyMCwgImFjczUiLCBjYWNoZSA9IFQpCgojIyBpbXBvcnQgYm9yb3VnaCBzaGFwZWZpbGVzIGZyb20gTllDIE9wZW4gRGF0YQpib3JvcyA8LSBzdF9yZWFkKCJkYXRhL3Jhdy9nZW8vQm9yb3VnaCBCb3VuZGFyaWVzLmdlb2pzb24iKQoKIyMgaW1wb3J0IE5laWdoYm9yaG9vZCBUYWJ1bGF0aW9uIEFyZWFzIGZvciBOWUMKbmFiZXMgPC0gc3RfcmVhZCgiZGF0YS9yYXcvZ2VvL255bnRhMjAyMC5zaHAiKQoKI2ltcG9ydCByZWRsaW5pbmcgRGF0YSAKIyBTb3VyY2UgUm9iZXJ0IEsuIE5lbHNvbiwgTGFEYWxlIFdpbmxpbmcsIFJpY2hhcmQgTWFyY2lhbm8sIE5hdGhhbiBDb25ub2xseSwgZXQgYWwuLCDigJxNYXBwaW5nIEluZXF1YWxpdHks4oCdIEFtZXJpY2FuIFBhbm9yYW1hLCBlZC4KcmVkbGluaW5nIDwtIHN0X3JlYWQoIk5ZQnJvbngxOTM4Lmdlb2pzb24iKQoKIyBUb3RhbCBQb3B1bGF0aW9uIC0gUDFfMDAxTgojIEhpc3BhbmljIG9yIExhdGlubyAtIFAyXzAwMk4KIyBXaGl0ZSBhbG9uZSwgbm90IEhpc3BhbmljIG9yIExhdGlubyAtIFAyXzAwNU4KIyBCbGFjayBhbG9uZSwgbm90IEhpc3BhbmljIG9yIExhdGlubyAtIFAyXzAwNk4KIyBBbWVyaWNhbiBJbmRpYW4gYW5kIEFsYXNrYSBOYXRpdmUgYWxvbmUsIG5vdCBIaXNwYW5pYyBvciBMYXRpbm8gLSBQMl8wMDcKIyBBc2lhbiBhbG9uZSwgbm90IEhpc3BhbmljIG9yIExhdGlubyAtIFAyXzAwOE4KIyBOYXRpdmUgSGF3YWlpYW4gYW5kIE90aGVyIFBhY2lmaWMgSXNsYW5kZXIgYWxvbmUsIG5vdCBIaXNwYW5pYyBvciBMYXRpbm8gLSBQMl8wMDlOCiMgU29tZSBvdGhlciByYWNlIGFsb25lLCBub3QgSGlzcGFuaWMgb3IgTGF0aW5vIC0gUDJfMDEwTgojIGltcG9ydCBwb3B1bGF0aW9uIGJ5IHJhY2UgZm9yIGVhY2ggY2Vuc3VzIHRyYWN0IGluIE5ldyBZb3JrIApyYXdfcmFjZV8yMDIwID0gZ2V0X2RlY2VubmlhbChnZW9ncmFwaHkgPSAidHJhY3QiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZXM9YygiUDFfMDAxTiIsICJQMl8wMDJOIiwgIlAyXzAwNU4iLCAiUDJfMDA2TiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJQMl8wMDdOIiwgIlAyXzAwOE4iLCAiUDJfMDA5TiIsICJQMl8wMTBOIiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlPSdOWScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdlb21ldHJ5ID0gVCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeWVhciA9IDIwMjAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dCA9ICJ3aWRlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvd19jYWxsID0gVFJVRSkKCgojIyMjIyMjIyMgIENyZWF0ZSBUaWR5IERhdGEgIyMjIyMjIyMjIyMjCiNyYWNlIGRhdGEKcG9wMjAgPC0gcmF3X3JhY2VfMjAyMCB8PgogIHJlbmFtZSh0b3RhbF9wb3AgPSBQMV8wMDFOLCAjICAhIVRvdGFsOiwgdW5pdmVyc2UgPSAgIFJBQ0UKICAgICAgICAgaGlzcF9wb3AgPSBQMl8wMDJOLCAjICBIaXNwYW5pYyBvciBMYXRpbm8KICAgICAgICAgYmxhY2tfcG9wID0gUDJfMDA2TiwgIyAgTm90IEhpc3BhbmljIG9yIExhdGlubzohIVBvcHVsYXRpb24gb2Ygb25lIHJhY2U6ISFCbGFjayBvciBBZnJpY2FuIEFtZXJpY2FuIGFsb25lCiAgICAgICAgIGFzaWFuX3BvcCA9IFAyXzAwOE4sICMgIE5vdCBIaXNwYW5pYyBvciBMYXRpbm86ISFQb3B1bGF0aW9uIG9mIG9uZSByYWNlOiEhQXNpYW4gYWxvbmUKICAgICAgICAgd2hpdGVfcG9wID0gUDJfMDA1TiwgIyBOb3QgSGlzcGFuaWMgb3IgTGF0aW5vOiEhUG9wdWxhdGlvbiBvZiBvbmUgcmFjZTohIVdoaXRlIGFsb25lCiAgICAgICAgIG5hdGl2ZV9wb3AgPSBQMl8wMDdOLCAjICBOb3QgSGlzcGFuaWMgb3IgTGF0aW5vOiEhUG9wdWxhdGlvbiBvZiBvbmUgcmFjZTohIUFtZXJpY2FuIEluZGlhbiBhbmQgQWxhc2thIE5hdGl2ZSBhbG9uZQogICAgICAgICBoYXdfcGlfcG9wID0gUDJfMDA5TiwgIyAgTm90IEhpc3BhbmljIG9yIExhdGlubzohIVBvcHVsYXRpb24gb2Ygb25lIHJhY2U6ISFOYXRpdmUgSGF3YWlpYW4gYW5kIE90aGVyIFBhY2lmaWMgSXNsYW5kZXIgYWxvbmUKICAgICAgICAgb3RoZXJfcG9wID0gUDJfMDEwTikgfD4gIyAgTm90IEhpc3BhbmljIG9yIExhdGlubzohIVBvcHVsYXRpb24gb2Ygb25lIHJhY2U6ISFTb21lIE90aGVyIFJhY2UgYWxvbmUKICBtdXRhdGUoYmlwb2NfcG9wID0gdG90YWxfcG9wIC0gd2hpdGVfcG9wLAogICAgICAgICBwY3RfaGlzcD0gcm91bmQoaGlzcF9wb3AvdG90YWxfcG9wLCAzKSwgCiAgICAgICAgIHBjdF93aGl0ZV9hbG9uZV9ub3RfaGlzcCA9IHJvdW5kKHdoaXRlX3BvcC90b3RhbF9wb3AsIDMpLCAKICAgICAgICAgcGN0X2JsYWNrX2Fsb25lX25vdF9oaXNwID0gcm91bmQoYmxhY2tfcG9wL3RvdGFsX3BvcCwgMyksIAogICAgICAgICBwY3RfYXNpYW5fYWxvbmVfbm90X2hpc3AgPSByb3VuZChhc2lhbl9wb3AvdG90YWxfcG9wLCAzKSwgCiAgICAgICAgIHBjdF9pbmRpZ2lub3VzX2Fsb25lX25vdF9oaXNwID0gcm91bmQobmF0aXZlX3BvcC90b3RhbF9wb3AsIDMpLCAKICAgICAgICAgcGN0X2hhd19waV9hbG9uZV9ub3RfaGlzcCA9IHJvdW5kKGhhd19waV9wb3AvdG90YWxfcG9wLCAzKSwgCiAgICAgICAgIHBjdF9vdGhlcl9hbG9uZV9ub3RfaGlzcCA9IHJvdW5kKG90aGVyX3BvcC90b3RhbF9wb3AsIDMpLCAKICAgICAgICAgcGN0X2JpcG9jID0gcm91bmQoYmlwb2NfcG9wL3RvdGFsX3BvcCwgMykpCgoKIyBlZHVjYXRpb25hbCBhdHRhaW5tZW50IGRhdGEKcmF3X2VkdWNhdGlvbmFsX2F0dGFpbm1lbnQgPC0gZ2V0X2FjcyhnZW9ncmFwaHkgPSAidHJhY3QiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZXMgPSBjKHBvcF9vdmVyXzI1ID0gIkIxNTAwM18wMDEiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFjaGVsb3IgPSAiQjE1MDAzXzAyMiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXN0ZXJzID0gIkIxNTAwM18wMjMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvZmVzc2lvbmFsID0gIkIxNTAwM18wMjQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9jdG9yYWwgPSAiQjE1MDAzXzAyNSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoaWdoc2Nob29sID0gIkIxNTAwM18wMTciKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUgPSAiTlkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHllYXIgPSAyMDIxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dCA9ICJ3aWRlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaG93X2NhbGwgPSBUUlVFKQoKCmVkdWNhdGlvbmFsX2F0dGFpbm1lbnQgPC0gcmF3X2VkdWNhdGlvbmFsX2F0dGFpbm1lbnQgfD4KICBtdXRhdGUoYmFjaGVsb3JfYW5kX2Fib3ZlID0gYmFjaGVsb3JFICsgbWFzdGVyc0UgKyBwcm9mZXNzaW9uYWxFICsgZG9jdG9yYWxFLAogICAgICAgICBwY3RfYmFjaGVsb3IgPSByb3VuZChiYWNoZWxvckUvcG9wX292ZXJfMjVFLDMpLAogICAgICAgICBwY3RfbWFzdGVycyA9IHJvdW5kKG1hc3RlcnNFL3BvcF9vdmVyXzI1RSwzKSwKICAgICAgICAgcGN0X3Byb2Zlc3Npb25hbCA9IHJvdW5kKHByb2Zlc3Npb25hbEUvcG9wX292ZXJfMjVFLDMpLAogICAgICAgICBwY3RfZG9jdG9yYWwgPSByb3VuZChkb2N0b3JhbEUvcG9wX292ZXJfMjVFLDMpLAogICAgICAgICBwY3RfYmFjaGVsb3JfYW5kX2Fib3ZlID0gcm91bmQoYmFjaGVsb3JfYW5kX2Fib3ZlL3BvcF9vdmVyXzI1RSwzKSwKICAgICAgICAgcGN0X2hpZ2hzY2hvb2wgPSByb3VuZChoaWdoc2Nob29sRS9wb3Bfb3Zlcl8yNUUsMykpIHw+CiAgc2VsZWN0KEdFT0lELCBOQU1FLCBwb3Bfb3Zlcl8yNUUsIHBjdF9iYWNoZWxvcl9hbmRfYWJvdmUsIHBjdF9oaWdoc2Nob29sLCBiYWNoZWxvcl9hbmRfYWJvdmUsaGlnaHNjaG9vbEUpCgphbGxfdmFycyA8LSBwb3AyMCB8PiAKICAgIGxlZnRfam9pbihlZHVjYXRpb25hbF9hdHRhaW5tZW50LCBieSA9IGMoIkdFT0lEIiwiTkFNRSIpKQoKCiMgcHJpbWFyeSB3b3JrIG9jY3VwYXRpb25zIGRhdGEKcmF3X29jY3VwYXRpb24gPC0gZ2V0X2FjcyhnZW9ncmFwaHkgPSAidHJhY3QiLAogICAgICAgICAgICAgICAgICAgICAgICAgIHZhcmlhYmxlcz1jKCJDMjQwMTBfMDAxIiwiQzI0MDEwXzAwNSIsIkMyNDAxMF8wNDEiLCJDMjQwMTBfMDA2IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQzI0MDEwXzA0MiIsIkMyNDAxMF8wMDgiLCJDMjQwMTBfMDQ0IiwiQzI0MDEwXzAwOSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkMyNDAxMF8wNDUiLCJDMjQwMTBfMDEwIiwiQzI0MDEwXzA0NiIsIkMyNDAxMF8wMTIiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDMjQwMTBfMDQ4IiwiQzI0MDEwXzAxMyIsIkMyNDAxMF8wNDkiLCJDMjQwMTBfMDE0IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQzI0MDEwXzA1MCIsIkMyNDAxMF8wMTUiLCJDMjQwMTBfMDUxIiwiQzI0MDEwXzAxNiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkMyNDAxMF8wNTIiLCJDMjQwMTBfMDIwIiwiQzI0MDEwXzA1NiIsIkMyNDAxMF8wMjEiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDMjQwMTBfMDU3IiwiQzI0MDEwXzAyNCIsIkMyNDAxMF8wNjAiLCJDMjQwMTBfMDIxIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQzI0MDEwXzA1NyIsIkMyNDAxMF8wMjUiLCJDMjQwMTBfMDYxIiwiQzI0MDEwXzAyNiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkMyNDAxMF8wNjIiLCJDMjQwMTBfMDI4IiwiQzI0MDEwXzAyOSIsIkMyNDAxMF8wNjUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDMjQwMTBfMDMxIiwiQzI0MDEwXzA2NyIsIkMyNDAxMF8wMzIiLCJDMjQwMTBfMDY4IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQzI0MDEwXzAzMyIsIkMyNDAxMF8wNjkiLCJDMjQwMTBfMDM1IiwiQzI0MDEwXzA3MSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkMyNDAxMF8wNjQiKSwKICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZSA9ICJOWSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgeWVhciA9IDIwMjEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgZ2VvbWV0cnkgPSBGLAogICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dCA9ICJ3aWRlIikKCgoKb2NjdXBhdGlvbl9kYXRhIDwtIHJhd19vY2N1cGF0aW9uIHw+CiAgcmVuYW1lKHBvcF9lbXBsb3llZCA9IEMyNDAxMF8wMDFFKSB8PgogIG11dGF0ZShtYW5hZ2VtZW50MSA9IEMyNDAxMF8wMDVFICsgQzI0MDEwXzA0MUUsCiAgICAgICAgIG1hbmFnZW1lbnQgPSByb3VuZChtYW5hZ2VtZW50MS9wb3BfZW1wbG95ZWQsIDMpLAogICAgICAgICBidXNpbmVzc19maW5hbmNpYWwxID0gQzI0MDEwXzAwNkUgKyBDMjQwMTBfMDQyRSwKICAgICAgICAgYGJ1c2luZXNzIGZpbmFuY2lhbGAgPSByb3VuZChidXNpbmVzc19maW5hbmNpYWwxL3BvcF9lbXBsb3llZCwgMyksCiAgICAgICAgIGNvbXB1dGVyX21hdGhlbWF0aWNhbDEgPSBDMjQwMTBfMDA4RSArIEMyNDAxMF8wNDRFLAogICAgICAgICBgY29tcHV0ZXIgbWF0aGVtYXRpY2FsYCA9IHJvdW5kKGNvbXB1dGVyX21hdGhlbWF0aWNhbDEvcG9wX2VtcGxveWVkLCAzKSwKICAgICAgICAgYXJjaGl0ZWN0dXJlX2VuZ2luZWVyaW5nMSA9IEMyNDAxMF8wMDlFICsgQzI0MDEwXzA0NUUsCiAgICAgICAgIGBhcmNoaXRlY3R1cmUgZW5naW5lZXJpbmdgID0gcm91bmQoYXJjaGl0ZWN0dXJlX2VuZ2luZWVyaW5nMS9wb3BfZW1wbG95ZWQsIDMpLAogICAgICAgICBsaWZlX3BoeXNpY2FsX3NvY2lhbF9zY2llbmNlMSA9IEMyNDAxMF8wMTBFICsgQzI0MDEwXzA0NkUsCiAgICAgICAgIGBsaWZlIHBoeXNpY2FsIHNvY2lhbCBzY2llbmNlYCA9IHJvdW5kKGxpZmVfcGh5c2ljYWxfc29jaWFsX3NjaWVuY2UxL3BvcF9lbXBsb3llZCwgMyksCiAgICAgICAgIGNvbW11bml0eV9zb2NpYWxfc2VydmljZXMxID0gQzI0MDEwXzA0OEUgKyBDMjQwMTBfMDEyRSwKICAgICAgICAgYGNvbW11bml0eSBzb2NpYWwgc2VydmljZXNgID0gcm91bmQoY29tbXVuaXR5X3NvY2lhbF9zZXJ2aWNlczEvcG9wX2VtcGxveWVkLCAzKSwKICAgICAgICAgbGVnYWwxID0gQzI0MDEwXzAxM0UgKyBDMjQwMTBfMDQ5RSwKICAgICAgICAgbGVnYWwgPSByb3VuZChsZWdhbDEvcG9wX2VtcGxveWVkLCAzKSwKICAgICAgICAgZWR1Y2F0aW9uX3RyYWluaW5nX2xpYnJhcnkxID0gQzI0MDEwXzAxNEUgKyBDMjQwMTBfMDUwRSwKICAgICAgICAgYGVkdWNhdGlvbiB0cmFpbmluZyBsaWJyYXJ5YCA9IHJvdW5kKGVkdWNhdGlvbl90cmFpbmluZ19saWJyYXJ5MS9wb3BfZW1wbG95ZWQsIDMpLAogICAgICAgICBhcnRzX2VudGVydGFpbm1lbnRfbWVkaWExID0gQzI0MDEwXzAxNUUgKyBDMjQwMTBfMDUxRSwKICAgICAgICAgYGFydHMgZW50ZXJ0YWlubWVudCBtZWRpYWAgPSByb3VuZChhcnRzX2VudGVydGFpbm1lbnRfbWVkaWExL3BvcF9lbXBsb3llZCwgMyksCiAgICAgICAgIGhlYWx0aGNhcmVfcHJhY3RpdGlvbmVyMSA9IEMyNDAxMF8wMTZFICsgQzI0MDEwXzA1MkUsCiAgICAgICAgIGBoZWFsdGhjYXJlIHByYWN0aXRpb25lcmAgPSByb3VuZChoZWFsdGhjYXJlX3ByYWN0aXRpb25lcjEvcG9wX2VtcGxveWVkLCAzKSwKICAgICAgICAgaGVhbHRoY2FyZV9zdXBwb3J0MSA9IEMyNDAxMF8wMjBFICsgQzI0MDEwXzA1NkUsCiAgICAgICAgIGBoZWFsdGhjYXJlIHN1cHBvcnRgID0gcm91bmQoaGVhbHRoY2FyZV9zdXBwb3J0MS9wb3BfZW1wbG95ZWQsIDMpLAogICAgICAgICBwcm90ZWN0aXZlX3NlcnZpY2VzMSA9IEMyNDAxMF8wMjFFICsgQzI0MDEwXzA1N0UsCiAgICAgICAgIGBwcm90ZWN0aXZlIHNlcnZpY2VzYCA9IHJvdW5kKHByb3RlY3RpdmVfc2VydmljZXMxL3BvcF9lbXBsb3llZCwgMyksCiAgICAgICAgIGZvb2RfcHJlcDEgPSBDMjQwMTBfMDI0RSArIEMyNDAxMF8wNjBFLAogICAgICAgICBgZm9vZCBwcmVwYCA9IHJvdW5kKGZvb2RfcHJlcDEvcG9wX2VtcGxveWVkLCAzKSwKICAgICAgICAgY2xlYW5pbmdfbWFpbnRlbmFuY2UxID0gQzI0MDEwXzAyNUUgKyBDMjQwMTBfMDYxRSwKICAgICAgICAgYGNsZWFuaW5nIG1haW50ZW5hbmNlYCA9IHJvdW5kKGNsZWFuaW5nX21haW50ZW5hbmNlMS9wb3BfZW1wbG95ZWQsIDMpLAogICAgICAgICBwZXJzb25hbGNhcmVfc2VydmljZXMxID0gQzI0MDEwXzAyNkUgKyBDMjQwMTBfMDYyRSwKICAgICAgICAgYHBlcnNvbmFsY2FyZSBzZXJ2aWNlc2AgPSByb3VuZChwZXJzb25hbGNhcmVfc2VydmljZXMxL3BvcF9lbXBsb3llZCwgMyksCiAgICAgICAgIHNhbGVzMSA9IEMyNDAxMF8wMjhFICsgQzI0MDEwXzA2NEUsCiAgICAgICAgIHNhbGVzID0gcm91bmQoc2FsZXMxL3BvcF9lbXBsb3llZCwgMyksCiAgICAgICAgIG9mZmljZV9hZG1pbl9zdXBwb3J0MSA9IEMyNDAxMF8wMjlFICsgQzI0MDEwXzA2NUUsCiAgICAgICAgIGBvZmZpY2UgYWRtaW4gc3VwcG9ydGAgPSByb3VuZChvZmZpY2VfYWRtaW5fc3VwcG9ydDEvcG9wX2VtcGxveWVkLCAzKSwKICAgICAgICAgZmFybWluZzEgPSBDMjQwMTBfMDMxRSArIEMyNDAxMF8wNjdFLAogICAgICAgICBmYXJtaW5nID0gcm91bmQoZmFybWluZzEvcG9wX2VtcGxveWVkLCAzKSwKICAgICAgICAgY29uc3RydWN0aW9uMSA9IEMyNDAxMF8wMzJFICsgQzI0MDEwXzA2OEUsCiAgICAgICAgIGNvbnN0cnVjdGlvbiA9IHJvdW5kKGNvbnN0cnVjdGlvbjEvcG9wX2VtcGxveWVkLCAzKSwKICAgICAgICAgbWFpbnRlbmFuY2VfcmVwYWlyMSA9IEMyNDAxMF8wMzNFICsgQzI0MDEwXzA2OUUsCiAgICAgICAgIGBtYWludGVuYW5jZSByZXBhaXJgID0gcm91bmQobWFpbnRlbmFuY2VfcmVwYWlyMS9wb3BfZW1wbG95ZWQsIDMpLAogICAgICAgICBwcm9kdWN0aW9uMSA9IEMyNDAxMF8wMzVFICsgQzI0MDEwXzA3MUUsCiAgICAgICAgIHByb2R1Y3Rpb24gPSByb3VuZChwcm9kdWN0aW9uMS9wb3BfZW1wbG95ZWQsIDMpCiAgICAgICAgICkgfD4KICBzZWxlY3QoR0VPSUQsIE5BTUUsIHBvcF9lbXBsb3llZCwgbWFuYWdlbWVudCwgYGJ1c2luZXNzIGZpbmFuY2lhbGAsYGNvbXB1dGVyIG1hdGhlbWF0aWNhbGAsIGBhcmNoaXRlY3R1cmUgZW5naW5lZXJpbmdgLGBsaWZlIHBoeXNpY2FsIHNvY2lhbCBzY2llbmNlYCwgYGNvbW11bml0eSBzb2NpYWwgc2VydmljZXNgLGxlZ2FsLCBgZWR1Y2F0aW9uIHRyYWluaW5nIGxpYnJhcnlgLCBgYXJ0cyBlbnRlcnRhaW5tZW50IG1lZGlhYCwgYGhlYWx0aGNhcmUgcHJhY3RpdGlvbmVyYCwgYHByb3RlY3RpdmUgc2VydmljZXNgLCBgZm9vZCBwcmVwYCwgYGNsZWFuaW5nIG1haW50ZW5hbmNlYCwgYHBlcnNvbmFsY2FyZSBzZXJ2aWNlc2AsIHNhbGVzLCBgb2ZmaWNlIGFkbWluIHN1cHBvcnRgLCBmYXJtaW5nLCBjb25zdHJ1Y3Rpb24sIGBtYWludGVuYW5jZSByZXBhaXJgLCBwcm9kdWN0aW9uKQoKYWxsX3ZhcnMgPC0gYWxsX3ZhcnMgfD4gCiAgbGVmdF9qb2luKG9jY3VwYXRpb25fZGF0YSwgYnkgPSBjKCJHRU9JRCIsIk5BTUUiKSkKCiMgbGFuZ3VhZ2UgZGF0YQpyYXdfbGFuZ3VhZ2UgPC0gZ2V0X2FjcyhnZW9ncmFwaHkgPSAidHJhY3QiLAogICAgICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZXMgPSBjKCJDMTYwMDFfMDAxIiwiQzE2MDAxXzAwMiIsIkMxNjAwMV8wMDMiLCJDMTYwMDFfMDA2IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQzE2MDAxXzAwOSIsIkMxNjAwMV8wMTIiLCJDMTYwMDFfMDE4IiwiQzE2MDAxXzAyMSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkMxNjAwMV8wMjQiLCJDMTYwMDFfMDI3IiwiQzE2MDAxXzAzMyIsIkMxNjAwMV8wMzYiKSwKICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUgPSAiTlkiLAogICAgICAgICAgICAgICAgICAgICAgICB5ZWFyID0gMjAyMSwKICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0ID0gIndpZGUiLAogICAgICAgICAgICAgICAgICAgICAgICBzaG93X2NhbGwgPSBUUlVFKQoKCmxhbmd1YWdlIDwtIHJhd19sYW5ndWFnZSB8PgogIHJlbmFtZShwb3Bfc3BlYWtpbmcgPSBDMTYwMDFfMDAxRSwKICAgICAgICAgZW5nbGlzaCA9IEMxNjAwMV8wMDJFLAogICAgICAgICBzcGFuaXNoID0gQzE2MDAxXzAwM0UsCiAgICAgICAgIGZyZW5jaF9oYWl0aWFuX2NhanVuID0gQzE2MDAxXzAwNkUsCiAgICAgICAgIGdlcm1hbiA9IEMxNjAwMV8wMDlFLAogICAgICAgICBzbGF2aWMgPSBDMTYwMDFfMDEyRSwKICAgICAgICAga29yZWFuID0gQzE2MDAxXzAxOEUsCiAgICAgICAgIGNoaW5lc2UgPSBDMTYwMDFfMDIxRSwKICAgICAgICAgdmlldG5hbWVzZSA9IEMxNjAwMV8wMjRFLAogICAgICAgICB0YWdhbG9nID0gQzE2MDAxXzAyN0UsCiAgICAgICAgIGFyYWJpYyA9IEMxNjAwMV8wMzNFLAogICAgICAgICBvdGhlciA9IEMxNjAwMV8wMzZFKSB8PgogIG11dGF0ZShwY3RfZW5nbGlzaCA9IHJvdW5kKGVuZ2xpc2gvcG9wX3NwZWFraW5nLCAzKSwKICAgICAgICAgcGN0X3NwYW5pc2ggPSByb3VuZChzcGFuaXNoL3BvcF9zcGVha2luZywgMyksCiAgICAgICAgIHBjdF9mcmVuY2hfaGFpdGlhbl9jYWp1biA9IHJvdW5kKGZyZW5jaF9oYWl0aWFuX2NhanVuL3BvcF9zcGVha2luZywgMyksCiAgICAgICAgIHBjdF9nZXJtYW4gPSByb3VuZChnZXJtYW4vcG9wX3NwZWFraW5nLCAzKSwKICAgICAgICAgcGN0X3NsYXZpYyA9IHJvdW5kKHNsYXZpYy9wb3Bfc3BlYWtpbmcsIDMpLAogICAgICAgICBwY3Rfa29yZWFuID0gcm91bmQoa29yZWFuL3BvcF9zcGVha2luZywgMyksCiAgICAgICAgIHBjdF9jaGluZXNlID0gcm91bmQoY2hpbmVzZS9wb3Bfc3BlYWtpbmcsIDMpLAogICAgICAgICBwY3RfdmlldG5hbWVzZSA9IHJvdW5kKHZpZXRuYW1lc2UvcG9wX3NwZWFraW5nLCAzKSwKICAgICAgICAgcGN0X3RhZ2Fsb2cgPSByb3VuZCh0YWdhbG9nL3BvcF9zcGVha2luZywgMyksCiAgICAgICAgIHBjdF9hcmFiaWMgPSByb3VuZChhcmFiaWMvcG9wX3NwZWFraW5nLDMpLAogICAgICAgICBwY3Rfb3RoZXIgPSByb3VuZChvdGhlci9wb3Bfc3BlYWtpbmcsIDMpKSB8PgogIHNlbGVjdChHRU9JRCxOQU1FLCBwY3RfZW5nbGlzaCwgcGN0X3NwYW5pc2gscGN0X2ZyZW5jaF9oYWl0aWFuX2NhanVuLCBwY3RfZ2VybWFuLCBwY3Rfc2xhdmljLCBwY3Rfa29yZWFuLCBwY3RfY2hpbmVzZSwgcGN0X3ZpZXRuYW1lc2UsIHBjdF90YWdhbG9nLCBwY3RfYXJhYmljLCBwY3Rfb3RoZXIpIHw+CiAgcmVuYW1lKEVuZ2xpc2g9cGN0X2VuZ2xpc2gsCiAgICAgICAgIFNwYW5pc2ggPSBwY3Rfc3BhbmlzaCwKICAgICAgICAgYEZyZW5jaCBIYWl0aWFuIENhanVuYCA9IHBjdF9mcmVuY2hfaGFpdGlhbl9jYWp1biwKICAgICAgICAgR2VybWFuID0gcGN0X2dlcm1hbiwKICAgICAgICAgU2xhdmljID0gcGN0X3NsYXZpYywKICAgICAgICAgS29yZWFuID0gcGN0X2tvcmVhbiwKICAgICAgICAgQ2hpbmVzZSA9IHBjdF9jaGluZXNlLAogICAgICAgICBWaWV0bmFtZXNlID0gcGN0X3ZpZXRuYW1lc2UsCiAgICAgICAgIFRhZ2Fsb2cgPSBwY3RfdGFnYWxvZywKICAgICAgICAgQXJhYmljID0gcGN0X2FyYWJpYywKICAgICAgICAgYE90aGVyIExhbmd1YWdlYCA9IHBjdF9vdGhlcgogICAgICAgICApCgogICAgICAgICAgICAgICAgICAgICAgCmFsbF92YXJzIDwtIGFsbF92YXJzIHw+IAogIGxlZnRfam9pbihsYW5ndWFnZSwgYnkgPSBjKCJHRU9JRCIsIk5BTUUiKSkKCiNtZWRpYW4gaG91c2Vob2xkIGluY29tZSBkYXRhCnJhd19taGkgPC0gZ2V0X2FjcyhnZW9ncmFwaHkgPSAidHJhY3QiLAogICAgICAgICAgICAgICAgICAgdmFyaWFibGVzID0gYyhNSEkgPSAiQjE5MDE5XzAwMSIpLAogICAgICAgICAgICAgICAgICAgc3RhdGUgPSAiTlkiLAogICAgICAgICAgICAgICAgICAgeWVhciA9IDIwMjEsCiAgICAgICAgICAgICAgICAgICBvdXRwdXQgPSAid2lkZSIsCiAgICAgICAgICAgICAgICAgICBzaG93X2NhbGwgPSBUUlVFKQptaGkgPC0gcmF3X21oaSB8PgogIHJlbmFtZShNZWRpYW5fSG91c2Vob2xkX0luY29tZSA9IE1ISUUpIHw+CiAgc2VsZWN0KEdFT0lELCBOQU1FLCBNZWRpYW5fSG91c2Vob2xkX0luY29tZSkKCmFsbF92YXJzIDwtIGFsbF92YXJzIHw+IAogICBsZWZ0X2pvaW4obWhpLCBieSA9IGMoIkdFT0lEIiwiTkFNRSIpKQoKIyBjaGFuZ2UgcHJvamVjdGlvbiBvZiBjZW5zdXMgdHJhY3QgZGF0YQpzdF9jcnMoYWxsX3ZhcnMpCiMgc3RfY3JzKG5hYmVzKQphbGxfdmFyc18yMjYzIDwtIHN0X3RyYW5zZm9ybShhbGxfdmFycywgMjI2MykKc3RfY3JzKGFsbF92YXJzXzIyNjMpCgojcmVtb3ZlIHVubmVjZXNzYXJ5IGZpZWxkcyBpbiB0aGUgbmVpZ2hib3Job29kIHNoYXBlZmlsZQpuYWJlc19zZWxlY3RlZCA8LSBuYWJlcyB8PgogIHNlbGVjdChCb3JvQ29kZSwgQm9yb05hbWUsIE5UQTIwMjAsIE5UQU5hbWUpCgphbGxfdmFyc19uYWJlcyA8LSBhbGxfdmFyc18yMjYzIHw+CiAgc3Rfam9pbihuYWJlc19zZWxlY3RlZCwgCiAgICAgICAgICBsZWZ0ID0gVFJVRSwKICAgICAgICAgIGpvaW4gPSBzdF9pbnRlcnNlY3RzLAogICAgICAgICAgbGFyZ2VzdCA9IFRSVUUpIAoKCgojIGFsbF92YXJzX25hYmVzIDwtIG5hLm9taXQoYWxsX3ZhcnNfbmFiZXMpCgojU291dGggQnJvbnggbmVpZ2hib3Job29kcwojIE1vdHQgSGF2ZW4tUG9ydCBNb3JyaXMsIE1lbHJvc2UsIEh1bnRzIFBvaW50LCBMb25nd29vZCwgYW5kIE1vcnJpc2FuaWEKICBzYl9uYWJlcyA8LSBhbGxfdmFyc19uYWJlcyAlPiUgZmlsdGVyKCAKICBOVEFOYW1lID09ICJNb3R0IEhhdmVuLVBvcnQgTW9ycmlzIiB8IE5UQU5hbWUgPT0gIk1lbHJvc2UiIHwgTlRBTmFtZSA9PSAiSHVudHMgUG9pbnQiIHwgTlRBTmFtZSA9PSAiTG9uZ3dvb2QiIHxOVEFOYW1lID09ICJNb3JyaXNhbmlhIgogICkKICAKICAKICAjQnJvbnggUmVkbGluaW5nIG5laWdoYm9yaG9vZHMKICBicm9ueF9uYWJlcyA8LSBhbGxfdmFyc19uYWJlcyAlPiUgZmlsdGVyKCAKICAgIEJvcm9OYW1lID09ICJCcm9ueCIpCiAgCnN0X2NycyhyZWRsaW5pbmcpCnJlZGxpbmluZ18yMjYzIDwtIHN0X3RyYW5zZm9ybShyZWRsaW5pbmcsIDIyNjMpCgpicm9ueF9yZWRsaW5pbmcgPC0gYnJvbnhfbmFiZXMgfD4KICBzdF9qb2luKHJlZGxpbmluZ18yMjYzLCAKICAgICAgICAgIGxlZnQgPSBUUlVFLAogICAgICAgICAgam9pbiA9IHN0X2ludGVyc2VjdHMsCiAgICAgICAgICBsYXJnZXN0ID0gVFJVRSkKCmJyb254X3JlZGxpbmluZ19jbGVhbiA8LSBicm9ueF9yZWRsaW5pbmcgfD4KICBtdXRhdGUoaG9sY19ncmFkZSA9IGlmZWxzZShob2xjX2dyYWRlID09ICJFIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5BLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaG9sY19ncmFkZSkpIHw+CiAgIyByZW5hbWUoIkhPTEMgR3JhZGUiID0gaG9sY19ncmFkZSkgfD4KICBmaWx0ZXIodG90YWxfcG9wPjApCgpwcmV2YWxlbmNlX2xhbmd1YWdlX2RmIDwtIHN0X2Ryb3BfZ2VvbWV0cnkoYnJvbnhfcmVkbGluaW5nX2NsZWFuKSB8PiAKICBzZWxlY3QoRW5nbGlzaDpgT3RoZXIgTGFuZ3VhZ2VgKSAKCnByZXZhbGVuY2VfbGFuZ3VhZ2UgPC0gcHJldmFsZW5jZV9sYW5ndWFnZV9kZiB8PgogIG11dGF0ZShtb3N0X3ByZXZhbGVudF9sYW5ndWFnZSA9IG5hbWVzKHByZXZhbGVuY2VfbGFuZ3VhZ2VfZGYpW21heC5jb2wocHJldmFsZW5jZV9sYW5ndWFnZV9kZildKQoKYnJvbnhfcmVkbGluaW5nX2NsZWFuJHByZXZhbGVuY2VfbGFuZ3VhZ2UgPSBuYW1lcyhwcmV2YWxlbmNlX2xhbmd1YWdlX2RmKVttYXguY29sKHByZXZhbGVuY2VfbGFuZ3VhZ2VfZGYpXQoKcHJldmFsZW5jZV9qb2JfZGYgPC0gc3RfZHJvcF9nZW9tZXRyeShicm9ueF9yZWRsaW5pbmdfY2xlYW4pIHw+IAogIHNlbGVjdChtYW5hZ2VtZW50OnByb2R1Y3Rpb24pIAoKcHJldmFsZW5jZV9qb2IgPC0gcHJldmFsZW5jZV9qb2JfZGYgfD4KICBtdXRhdGUobW9zdF9wcmV2YWxlbnRfam9iID0gbmFtZXMocHJldmFsZW5jZV9qb2JfZGYpW21heC5jb2wocHJldmFsZW5jZV9qb2JfZGYpXSkKCmJyb254X3JlZGxpbmluZ19jbGVhbiRwcmV2YWxlbmNlX2pvYiA9IG5hbWVzKHByZXZhbGVuY2Vfam9iX2RmKVttYXguY29sKHByZXZhbGVuY2Vfam9iX2RmKV0KCmBgYAoKIyMjIyBNZXRob2RzIDEgXHwgRGVjZW1iZXIgMjAyMwoKIyMjIyBTT1JBWUEgR1JBQ0UgQkFSQVIKCiMjIFB1cnBvc2UKClRoaXMgcmVzZWFyY2ggaGFzIGJlZW4gY29uZHVjdGVkIHdpdGggdGhlIGdvYWwgb2YgZXhwbG9yaW5nIGhvdyB0aGUgaW1wYWN0cyBvZiByZWRsaW5pbmcgYXJlIHNlZW4gdGhyb3VnaCB0aGUgZGVtb2dyYXBoaWMgY2hhcmFjdGVyaXN0aWNzIG9mIHRoZSBCcm9ueCwgYW5kIG1vcmUgc3BlY2lmaWNhbGx5IHRoZSBTb3V0aCBCcm9ueCBpbiBjb21wYXJpc29uIHRvIHRoZSByZXN0IG9mIE5ldyBZb3JrIENpdHkuCgojIyBJbnRyb2R1Y3Rpb24gJiBCYWNrZ3JvdW5kCgpUaGUgQnJvbnggaXMgdGhlIG5vcnRobW9zdCBib3JvdWdoIG9mIE5ZQy4gSXQgaXMgYSBwZW5pbnN1bGEgdGhhdCBib3JkZXJzIHRoZSBIdWRzb24sIEhhcmxlbSwgYW5kIEVhc3QgUml2ZXJzLiBSZXNpZGVudHMgYXJlIGN1dCBvZmYgdG8gdGhlaXIgd2F0ZXJmcm9udCBkdWUgdG8gaGlnaHdheSByb3V0ZXMgYWxvbmcgdGhlIEJyb254J3MgYm9yZGVycy4gTW9yZSBzcGVjaWZpY2FsbHksIFRoZSBTb3V0aCBCcm9ueCBpcyBhIG5laWdoYm9yaG9vZCB0aGF0IGluY2x1ZGVzIGNvbW11bml0aWVzIHNvdXRoIG9mIHRoZSBDcm9zcy1Ccm9ueCBFeHByZXNzd2F5IGFuZCB3ZXN0IG9mIHRoZSBCcm9ueCBSaXZlci4gTW90dCBIYXZlbiBhbmQgUG9ydCBNb3JyaXMgYXJlIHRoZSB0d28gbWFpbiBuZWlnaGJvcmhvb2RzIG9mIHRoZSBTb3V0aCBCcm9ueCwgd2l0aCB0aGUgZm9ybWVyIGFsc28gYmVpbmcga25vd24gYnkgdGhlIGFsaWFzICJBc3RobWEgQWxsZXkuIiBUaGlzIHJlc2VhcmNoIGluY2x1ZGVzIHRoZSBuZWlnaGJvcmhvb2RzLCBIdW50cyBQb2ludCwgTG9uZ3dvb2QsIE1lbHJvc2UsIE1vcnJpc2FuaWEsIGFuZCBNb3R0IEhhdmVuLVBvcnQgTW9ycmlzIGluIHRoZSBhbmFseXNpcyBvZiB0aGUgU291dGggQnJvbnguIE1hbnkgc3R1ZGllcyBoYXZlIGJlZW4gY29uZHVjdGVkIHRvIGFuYWx5emUgdGhlIGltbWVuc2UgaW1wYWN0IG9mIGVudmlyb25tZW50YWwgaW5qdXN0aWNlcyBvbiB0aGVzZSBjb21tdW5pdGllcy4gVGhlc2UgaW5qdXN0aWNlcyBpbmNsdWRlLCBidXQgYXJlIG5vdCBsaW1pdGVkIHRvLCBleGNlc3NpdmUgcG9sbHV0aW9uIGJ5IGluZHVzdHJpYWwgc2l0ZXMgYW5kIHBlYWtlciBwb3dlciBwbGFudHMsIGNhciBleGhhdXN0IHBvbGx1dGlvbiBmcm9tIHRoZSBoaWdod2F5cyBhbmQgbWFqb3IgdHJ1Y2tpbmcgcm91dGVzIHRoYXQgY3V0IHRocm91Z2ggdGhlc2UgbmVpZ2hib3Job29kcyBhcyB3ZWxsIGFzIGFuIHVucHJvdGVjdGVkIGFuZCB1bmRldmVsb3BlZCB3YXRlcmZyb250LsKgCgpUb2RheSwgdGhlIEJyb254IGlzIG9uZSBvZiB0aGUgcG9vcmVzdCBjb3VudGllcyBpbiB0aGUgVW5pdGVkIFN0YXRlcyBhbmQgYXN0aG1hIGlzIHRoZSBsZWFkaW5nIGNhdXNlIG9mIGhvc3BpdGFsaXphdGlvbiBhbmQgb2Ygc2Nob29sIGFic2VuY2UgZm9yIGNoaWxkcmVuLiBDaGlsZHJlbiBpbiB0aGUgQnJvbnggYXJlIHR3aWNlIGFzIGxpa2VseSB0byBiZSBob3NwaXRhbGl6ZWQgZm9yIGFzdGhtYSBhbmQgYXJlIG1vcmUgbGlrZWx5IHRvIGRpZSBvZiBhc3RobWEgdGhhbiBvdGhlciBVUyBjaGlsZHJlbi4gVGhlIGhlYWx0aCBvZiBhIGNvbW11bml0eSBpcyBpbmV4dHJpY2FibHkgbGlua2VkIHRvIG90aGVyIGRlbW9ncmFwaGljIHZhcmlhYmxlcyBzdWNoIGFzIGVkdWNhdGlvbmFsIGF0dGFpbm1lbnQsIGFuZCBpbmNvbWUsIGFzIG5vIGlzc3VlIGNhbiBvciBzaG91bGQgYmUgdmlld2VkIGluIGlzb2xhdGlvbi4gT3V0IG9mIGFsbCBmaXZlIGJvcm91Z2hzIGluIE5ldyBZb3JrIGNpdHksIHRoZSBCcm9ueCBhbHNvIGhhcyB0aGUgaGlnaGVzdCBwZXJjZW50YWdlIG9mIHBlb3BsZSBvZiBjb2xvciAoQklQT0MpLsKgIFRoZXNlIHN0YXRpc3RpY3MgYXJlIHdpdGhvdXQgYSBxdWVzdGlvbiBsaW5rZWQgdG8gdGhlIHN5c3RlbWljIGRpc2ludmVzdG1lbnQgb2YgdGhlIEJyb254LCBzcGVjaWZpY2FsbHkgdGhlIFNvdXRoIEJyb254LsKgCgpUaGlzIHJlc2VhcmNoIHNlZWtzIHRvIGJlZ2luIHRvIHVuZGVyc3RhbmQgdGhlIGVmZmVjdCB0aGF0IHJlZGxpbmluZyBjb250aW51ZXMgdG8gaGF2ZSBvbiBjb21tdW5pdGllcyBpbiB0aGUgQnJvbnguIEFzIHdlbGwgYXMgdG8gYmV0dGVyIHVuZGVyc3RhbmQgd2hvIGFyZSB0aGUgcGVvcGxlIHRoYXQgYXJlIGNhcnJ5aW5nIHRoZSBidXJkZW4gb2YgZW52aXJvbm1lbnRhbCBpbmp1c3RpY2UgaW4gdGhlIFNvdXRoIEJyb254IHRvIHN1cHBvcnQgb25nb2luZyByZXNlYXJjaCBhbmQgYWN0aXZpc20gd29yayBieSBsb2NhbCBvcmdhbml6YXRpb25zIHdvcmtpbmcgdG8gcHJvbW90ZSBhbmQgcHJvdGVjdCB0aGUgaGVhbHRoLCBzYWZldHksIGN1bHR1cmUsIGFuZCB3ZWxsYmVpbmcgb2YgQnJvbnggcmVzaWRlbnRzLsKgCgpUaGlzIHN0dWR5IHV0aWxpemVzIGRhdGEgZnJvbSB0aGUgMjAyMCBBbWVyaWNhbiBEZWNlbm5pYWwgQ2Vuc3VzIGFzIHdlbGwgYXMgdGhlIDIwMjAgQW1lcmljYW4gQ29tbXVuaXR5IFN1cnZleSAoQUNTKS4gSXQgaXMgaW1wb3J0YW50IHRvIG5vdGUgdGhhdCBBQ1MgZGF0YSBpcyBjb2xsZWN0ZWQgdmlhIDEgYW5kIDUgeWVhciBzdXJ2ZXlzIGFuZCB1bmxpa2UgY2Vuc3VzIGRhdGEsIGl0IGlzIGFuIGVzdGltYXRlIG5vdCBhbiBleGFjdCBjb3VudC4gQm90aCB0aGUgY2Vuc3VzIGFuZCBhY3MgZGF0YSBhcmUgY29ubmVjdGVkIHRvIGhpc3RvcmljYWwgcmVkbGluaW5nIGRhdGEgdXNpbmcgYSBnZW9zcGF0aWFsIGpvaW4uIFRoZSByZWRsaW5pbmcgZGF0YSB3YXMgYWNjZXNzZWQgYW5kIGRvd25sb2FkZWQgZnJvbSBbTWFwcGluZyBJbmVxdWFsaXR5XShodHRwczovL2RzbC5yaWNobW9uZC5lZHUvcGFub3JhbWEvcmVkbGluaW5nLyNsb2M9MTAvNDAuNTQ3Ly03NC4yNDcmY2l0eT1icm9va2x5bi1ueSksIGEgY29sbGFib3JhdGl2ZSBlZmZvcnQgYWNyb3NzIHRocmVlIHRlYW1zIHRvIGRpZ2l0aXplIHJlZGxpbmluZyBtYXBzIGFuZCBtYWtlIHRoZW0gYWNjZXNzaWJsZSB0byB0aGUgcHVibGljLgoKIyMjIFJlZGxpbmluZyAmIERpc2ludmVzdG1lbnQKCk9uZSBvZiB0aGUgbWFpbiBwb2xsdXRhbnRzIGluIHRoZSBCcm9ueCBpcyB0aGUgYWlyIGFuZCBub2lzZSBwb2xsdXRpb24gdGhhdCBjb21lcyBmcm9tIHRyYWZmaWMgb24gdGhlIENyb3NzIEJyb254IEV4cHJlc3N3YXkuIFRoZSBDcm9zcyBCcm9ueCBFeHByZXNzd2F5IHdhcyBidWlsdCBieSBSb2JlcnQgTW9zZXMsIHdpdGggY29uc3RydWN0aW9uIHN0YXJ0aW5nIGluIDE5NDguIE1vcmUgdGhhbiA2MCwwMDAgcmVzaWRlbnRzIHdlcmUgZGlzcGxhY2VkIGZyb20gdGhlaXIgaG9tZXMgZHVlIHRvIGl0cyBjb25zdHJ1Y3Rpb24uIFRoaXMgaXMgdGhlIGxhcmdlc3QgZGlzcGxhY2VtZW50IG9mIGNvbW11bml0aWVzIG91dCBvZiBhbnkgQW1lcmljYW4gaW5mcmFzdHJ1Y3R1cmUgcHJvamVjdC4gVGhpcyBwcm9qZWN0IHJlc3VsdGVkIGluIHRoZSBsb3NzIG9mIHByb3BlcnR5IHZhbHVlIGZvciBjb21tdW5pdGllcyBzdXJyb3VuZGluZyB0aGUgbmV3IEV4cHJlc3N3YXkgYXMgd2VsbCBhcyB3aGl0ZSBmbGlnaHQgdG8gdGhlIHN1YnVyYnMuwqAKClRoZSByZXNpZGVudHMgdGhhdCByZW1haW5lZCBpbiB0aGUgQnJvbnggYWZ0ZXIgdGhlIGNvbnN0cnVjdGlvbiBvZiB0aGUgZXhwcmVzc3dheSB3ZXJlIGxhcmdlbHkgYmxhY2sgYW5kIGJyb3duIGFuZCB0aGVpciBtb2JpbGl0eSB3YXMgZnVydGhlciBjb25zdHJhaW5lZCBieSB0aGUgaW1wbGVtZW50YXRpb24gb2YgcmFjaXN0IGhvdXNpbmcgcG9saWNpZXMgYW5kIHJlZGxpbmluZy4gUmVkbGluaW5nIHdhcyBhIHJhY2lzdCBnb3Zlcm5tZW50IHByYWN0aWNlIGluIHdoaWNoIHRoZSBnb3Zlcm5tZW50IGNyZWF0ZWQgbWFwcyBkZXRlcm1pbmluZyBhbmQgYXNzaWduaW5nIGdyYWRlcyB0byBhIG5laWdoYm9yaG9vZCdzIGludmVzdG1lbnQgd29ydGhpbmVzcyBiYXNlZCBvbiByYWNlIGluIHRoZSBsYXRlIDE5MzBzLiBUaGUgZ3JhZGVzIHdlcmUgY29sb3IgY29kZWQ6IEEgd2FzIGdyZWVuIGFuZCAiQmVzdCIsIEIgd2FzIGJsdWUgYW5kICJTdGlsbCBEZXNpcmFibGUiLCBDIHdhcyB5ZWxsb3cgYW5kICJEZWNsaW5pbmciLCBhbmQgRCB3YXMgcmVkIGFuZCAiSGF6YXJkb3VzIi4gRm9yIGV4YW1wbGUgdGhlIE1vcnJpc2FuaWEgbmVpZ2hib3Job29kIHdhcyBnaXZlbiBhIEQgcmF0aW5nIGFuZCB0aGUgZm9sbG93aW5nIHJlbWFya3Mgd2VyZSBtYWRlIGFib3V0IHRoZSBhcmVhLCAiVGhlcmUgaXMgYSBzdGVhZHkgaW5maWx0cmF0aW9uIG9mIG5lZ3JvIFNwYW5pc2ggYW5kIFB1ZXJ0byBSaWNhbiBpbnRvIHRoZSBhcmVhLiBQb3B1bGF0aW9uIGlzIHZlcnkgdW5zdGFibGUgYW5kIHRoZSByZWxpZWYgbG9hZCBpcyBoZWF2eS4gU2VjdGlvbiBpcyB2ZXJ5IGNvbmdlc3RlZCB3aXRoIGNvbnNpZGVyYWJsZSBzbWFsbCBidXNpbmVzcyBzY2F0dGVyZWQgZXZlcnl3aGVyZS4gT25lIG9mIHRoZSBwb29yZXN0IGFyZWFzIGluIHRoZSBCcm9ueC4iIFRoZXNlIGdyYWRpbmdzIGFuZCByZW1hcmtzIGFib3V0IHNwZWNpZmljIG5laWdoYm9yaG9vZHMgYW5kIGNlbnN1cyB0cmFjdHMgYmFzZWQgb2ZmIG9mIHJhY2lzdCBhc3N1bXB0aW9ucyBhbmQgc3RlcmVvdHlwZXMgc3RpbGwgaW1wYWN0IHRoZSBhcmVhIHRvZGF5LsKgCgohW0ZJR1VSRSAxLiBSb2JlcnQgSy4gTmVsc29uLCBMYURhbGUgV2lubGluZywgUmljaGFyZCBNYXJjaWFubywgTmF0aGFuIENvbm5vbGx5LCBldCBhbC4sICJNYXBwaW5nIEluZXF1YWxpdHksIiBBbWVyaWNhbiBQYW5vcmFtYSwgZWQuIFJvYmVydCBLLiBOZWxzb24gYW5kIEVkd2FyZCBMLiBBeWVyc10oaW1hZ2VzL2hvbGMtc2Nhbi5qcGcpe3dpZHRoPSIzOTUifQoKUmVkbGluaW5nIHdhcyBjcmVhdGVkIHRvIHNlZ3JlZ2F0ZSBjb21tdW5pdGllcyBhbmQgYWxsb3dlZCBmb3Igd2hpdGUgcGVvcGxlIHRvIGFjY2VzcyBzdWJzaWRpemVkIGhvdXNpbmcgbG9hbnMsIHdoaWxlIHJlc3RyaWN0aW5nIHBlb3BsZSBvZiBjb2xvciB0byB0aGUgImxlc3MgZGVzaXJhYmxlIiBhcmVhcyBvZiB0aGUgY2l0eS4gVGhlc2UgbWFwcyB3ZXJlIGNyZWF0ZWQgYnkgdGhlIEhvbWUgT3duZXJzIExvYW4gQ29ycG9yYXRpb24gKEhPTEMpIGFuZCBzZXQgYSBwcmVjZWRlbnQgYWxsb3dpbmcgd2hpdGUgY29tbXVuaXRpZXMgYW5kIGZhbWlsaWVzIHRvIGFjY2VzcyBnZW5lcmF0aW9uYWwgd2VhbHRoIHRocm91Z2ggaG9tZW93bmVyc2hpcC4gVGhlIHByb2Nlc3Mgb2YgcmVkbGluaW5nIG9ubHkgZnVlbGVkIHdoaXRlIGZsaWdodCBhbmQgZm9ybWFsaXplZCB0aGUgY29uZmxhdGlvbiBvZiBwcm94aW1pdHkgdG8gcGVvcGxlIG9mIGNvbG9yIChsYXJnZWx5IGJsYWNrIGFuZCBoaXNwYW5pYyBpbiB0aGUgQnJvbngpIHdpdGggZGVjbGluaW5nIGhvbWUgdmFsdWVzLiBUaGUgSE9MQydzIHJlZGxpbmluZyBtYXBzIGZvcm1hbGl6ZWQgYW5kIGp1c3RpZmllZCBzeXN0ZW1pYyBkaXNpbnZlc3RtZW50IGluIG5laWdoYm9yaG9vZHMgd2l0aCBoaWdoIHBlcmNlbnRhZ2VzIG9mIHBlb3BsZSBvZiBjb2xvci4KCiMjIFJlc3VsdHMKCiMjIyMgUmFjZQoKVGhlIHRhYmxlIGJlbG93IGRpc3BsYXlzIE5ldyBZb3JrIENpdHkncyBmaXZlIGJvcm91Z2hzIGFuZCB0aGUgcmFjaWFsIGRlbW9ncmFwaGljIGJyZWFrIGRvd24gZm9yIGVhY2ggY2Vuc3VzIGRlZmluZWQgcmFjaWFsIGNhdGVnb3J5LiBPdXQgb2YgdGhlIGZpdmUgYm9yb3VnaHMsIHRoZSBCcm9ueCBoYXMgdGhlIGhpZ2hlc3QgcGVyY2VudGFnZSBvZiBCSVBPQyByZXNpZGVudHMuIFRoZSBCcm9ueCBpcyA4OSUgQklQT0MsIHdpdGggNTIlIG9mIGl0cyByZXNpZGVudHMgaWRlbnRpZnlpbmcgYXMgTGF0aW54IChIaXNwYW5pYyBvciBMYXRpbm8gYXMgZGVmaW5lZCBieSB0aGUgY2Vuc3VzKS4KCiMjIyMjICpGaWd1cmUgMi4gTmV3IFlvcmsgQ2l0eSBCb3JvdWdocywgYnkgUmFjZSoKCmBgYHtyfQoKIyMjIyAqUmFjZSBTdGF0cywgYnkgQm9yb3VnaCBDZW5zdXMgVHJhY3QqCiMjIyMjIyMjIyBDcmVhdGUgc3VtbWFyeSBzdGF0cyAjIyMjIyMjIyMgCgojIGFsbF92YXJzX25hYmVzIDwtIG5hLm9taXQoYWxsX3ZhcnNfbmFiZXMpCmJvcm91Z2hfcmFjZV9zdGF0cyA8LSBzdF9kcm9wX2dlb21ldHJ5KG5hLm9taXQoYWxsX3ZhcnNfbmFiZXMpKSB8PgogIHJlbmFtZShCb3JvdWdoID0gQm9yb05hbWUpfD4KICBncm91cF9ieShCb3JvdWdoKSB8PgogICAgc3VtbWFyaXNlKApgUGVyY2VudCBCSVBPQ2AgPSBwZXJjZW50KG1lYW4ocm91bmQoYmlwb2NfcG9wL3RvdGFsX3BvcCwzKSkpLApgUGVyY2VudCBMYXRpbnhgID0gcGVyY2VudChtZWFuKHJvdW5kKGhpc3BfcG9wL3RvdGFsX3BvcCwzKSkpLApgUGVyY2VudCBCbGFja2AgPSBwZXJjZW50KG1lYW4ocm91bmQoYmxhY2tfcG9wL3RvdGFsX3BvcCwzKSkpLApgUGVyY2VudCBBc2lhbmAgPSBwZXJjZW50KG1lYW4ocm91bmQoYXNpYW5fcG9wL3RvdGFsX3BvcCwzKSkpLApgUGVyY2VudCBXaGl0ZWAgPSBwZXJjZW50KG1lYW4ocm91bmQod2hpdGVfcG9wL3RvdGFsX3BvcCwzKSkpCgopCgpib3JvdWdoX3JhY2Vfc3RhdHMgfD4gZGF0YXRhYmxlKCkKYGBgCgpgYGB7cn0KcmFjZV9wbG90X2RhdGEgPC0gc3RfZHJvcF9nZW9tZXRyeShuYS5vbWl0KGFsbF92YXJzX25hYmVzKSkgfD4KICByZW5hbWUoQm9yb3VnaCA9IEJvcm9OYW1lKSB8PgogIGdyb3VwX2J5KEJvcm91Z2gpIHw+CiAgc3VtbWFyaXNlKAogICAgcGN0X2JpcG9jID0gbWVhbihiaXBvY19wb3AgLyB0b3RhbF9wb3ApLAogICAgYFBlcmNlbnQgTGF0aW54YCA9IG1lYW4ocm91bmQoaGlzcF9wb3AgLyB0b3RhbF9wb3AsIDMpKSwKICAgIGBQZXJjZW50IEJsYWNrYCA9IG1lYW4ocm91bmQoYmxhY2tfcG9wIC8gdG90YWxfcG9wLCAzKSksCiAgICBgUGVyY2VudCBBc2lhbmAgPSBtZWFuKHJvdW5kKGFzaWFuX3BvcCAvIHRvdGFsX3BvcCwgMykpLAogICAgYFBlcmNlbnQgV2hpdGVgID0gbWVhbihyb3VuZCh3aGl0ZV9wb3AgLyB0b3RhbF9wb3AsIDMpKQogICkKCnJhY2VfcGxvdCA8LSBnZ3Bsb3QoZGF0YSA9IHJhY2VfcGxvdF9kYXRhLCBhZXMoeCA9IHJlb3JkZXIoQm9yb3VnaCwgcGN0X2JpcG9jKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeSA9IHBjdF9iaXBvYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0ID0gcGFzdGUwKEJvcm91Z2gsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLCBwZXJjZW50IEJJUE9DIHBvcHVsYXRpb246ICIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZXJjZW50KHBjdF9iaXBvYykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkpLCBzb3VyY2UgPSAiU291cmNlOiBBbWVyaWNhbiBEZWNlbm5pYWwgQ2Vuc3VzLCAyMDIwIikgKwogIGdlb21fY29sKGZpbGwgPSAiI2M1YzZkMCIpICsKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDI1LCBoanVzdCA9IDEpLAogICAgICAgIGF4aXMudGl0bGUgPSBlbGVtZW50X2JsYW5rKCkpICsKc2NhbGVfeV9jb250aW51b3VzKGxhYmVscyA9IHBlcmNlbnRfZm9ybWF0KCkpICsKICB0aGVtZShwYW5lbC5ib3JkZXIgPSBlbGVtZW50X2JsYW5rKCksIAogICAgICAgIHBhbmVsLmdyaWQubWFqb3IgPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgcGFuZWwuZ3JpZC5taW5vciA9IGVsZW1lbnRfYmxhbmsoKSwgCiAgICAgICAgcGFuZWwuYmFja2dyb3VuZCA9IGVsZW1lbnRfYmxhbmsoKSwgCiAgICAgICAgYXhpcy5saW5lID0gZWxlbWVudF9saW5lKGNvbG91ciA9ICJibGFjayIpKSArCiAgbGFicygKICAgIHRpdGxlID0gIkZpZ3VyZSAzLiBOWUMgUGVyY2VudCBCSVBPQywgYnkgQm9yb3VnaCIsCiAgICBjYXB0aW9uID0gIlNvdXJjZTogQW1lcmljYW4gRGVjZW5uaWFsIENlbnN1cywgMjAyMCIKICApIAoKZ2dwbG90bHkocmFjZV9wbG90LCB0b29sdGlwID0gInRleHQiLCBzb3VyY2UgPSAieCIpCgoKCmBgYAoKRXhhbWluaW5nIHRoZSBCcm9ueCBpdHNlbGYgbW9yZSBjbG9zZWx5IGl0IGlzIGVhc2lseSBkaXNjZXJuZWQgdGhhdCB0aGUgaGlnaGVzdCBjb25jZW50cmF0aW9ucyBvZiByZXNpZGVudHMgdGhhdCBpZGVudGlmeSBhcyBCbGFjayBvciBhcyBMYXRpbnggcmVzaWRlIGluIHRoZSBTb3V0aCBCcm9ueCwgYXMgd2VsbCBhcyBhIHByZWRvbWluYXRlIGNvbmNlbnRyYXRpb24gb2YgcmVzaWRlbnRzIGlkZW50aWZ5aW5nIGFzIEJsYWNrIGluIHRoZSBOb3J0aCBFYXN0IEJyb254LiBUaGlzIGlzIGV2aWRlbmNlZCBieSB0aGUgbWFwcyBiZWxvdy4KCmBgYHtyfQphbGxfdmFyc19icm9ueCA8LSBhbGxfdmFyc19uYWJlcyAlPiUgZmlsdGVyKAogIEJvcm9OYW1lID09ICJCcm9ueCIpCgpyYWNlX21hcCA8LSBnZ3Bsb3QoKSAgKwogICAgc3VwcHJlc3NXYXJuaW5ncyhnZW9tX3NmKGx3ZCA9IDAsCiAgICAgICAgICBkYXRhID0gYWxsX3ZhcnNfYnJvbngsCiAgICAgICAgICBtYXBwaW5nID0gYWVzKGZpbGwgPSBwY3RfYmlwb2MsCiAgICAgICAgICAgICAgICAgICAgICAgIHRleHQgPSBwYXN0ZTAoTlRBTmFtZSwiOiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBQZXJjZW50IEJJUE9DICIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBlcmNlbnQocGN0X2JpcG9jLCBhY2N1cmFjeT0xKSwiPGJyPiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUGVyY2VudCBCbGFjayAiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBlcmNlbnQocGN0X2JsYWNrX2Fsb25lX25vdF9oaXNwLCBhY2N1cmFjeSA9IDEpLCI8YnI+IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJQZXJjZW50IExhdGlueCAiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBlcmNlbnQocGN0X2hpc3AsIGFjY3VyYWN5ID0gMSksIjxicj4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlBlcmNlbnQgQXNpYW4gIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZXJjZW50KHBjdF9hc2lhbl9hbG9uZV9ub3RfaGlzcCwgYWNjdXJhY3kgPSAxKSkpKSkgKwogIHRoZW1lX3ZvaWQoKSArCiAgc2NhbGVfZmlsbF9mZXJtZW50ZXIoYnJlYWtzPWMoMCwgLjEsIC4yLCAuMywgLjQsLjUsIC42LCAuNywgLjgsIC45LCAxKSwKICAgICAgICAgICAgICAgICAgICAgICBwYWxldHRlID0gIkdyZWVucyIsCiAgICAgICAgICAgICAgICAgICAgICAgZGlyZWN0aW9uID0gMSwKICAgICAgICAgICAgICAgICAgICAgICBuYS52YWx1ZSA9ICJ0cmFuc3BhcmVudCIsCiAgICAgICAgICAgICAgICAgICAgICAgbmFtZT0iUGVyY2VudCBCSVBPQyAoJSkiLAogICAgICAgICAgICAgICAgICAgICAgIGxhYmVscz1wZXJjZW50X2Zvcm1hdChhY2N1cmFjeSA9IDFMKSkgKwogIGxhYnMoCiAgICB0aXRsZSA9ICJGaWd1cmUgNC4gQnJvbngsIFBlcmNlbnQgQklQT0MgYnkgQ2Vuc3VzIFRyYWN0IiwKICAgIGNhcHRpb24gPSAiU291cmNlOiBBbWVyaWNhbiBEZWNlbm5pYWwgQ2Vuc3VzLCAyMDIwIgogICkgKwogIGdlb21fc2YoZGF0YSA9IG5hYmVzIHw+IGZpbHRlcihCb3JvTmFtZSA9PSAiQnJvbngiKSwKICAgICAgICAgIGNvbG9yID0gImdyYXkiLCBmaWxsID0gTkEsIGx3ZCA9IDAuMjUpICsKICBnZW9tX3NmKGRhdGEgPSBib3JvcyB8PiBmaWx0ZXIoYm9yb19uYW1lPT0iQnJvbngiKSwgY29sb3IgPSAiYmxhY2siLCBmaWxsID0gTkEsIGx3ZCA9IC41KQoKZ2dwbG90bHkocmFjZV9tYXAsdG9vbHRpcCA9ICJ0ZXh0IikKYGBgCgpgYGB7cn0KIyBhbGxfdmFyc19icm9ueCA8LSBhbGxfdmFyc19uYWJlcyAlPiUgZmlsdGVyKCAKIyAgIEJvcm9OYW1lID09ICJCcm9ueCIpCiMgIAojIHJhY2VfbWFwIDwtIGdncGxvdCgpICArIAojICAgICBzdXBwcmVzc1dhcm5pbmdzKGdlb21fc2YobHdkID0gMCwKIyAgICAgICAgICAgZGF0YSA9IGFsbF92YXJzX2Jyb254LAojICAgICAgICAgICBtYXBwaW5nID0gYWVzKGZpbGwgPSBwY3Rfd2hpdGVfYWxvbmVfbm90X2hpc3AsCiMgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dCA9IHBhc3RlMChOVEFOYW1lLCI6IiwKIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgUGVyY2VudCBCSVBPQyAiLAojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBlcmNlbnQocGN0X2JpcG9jLCBhY2N1cmFjeT0xKSwiPGJyPiIsCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJQZXJjZW50IEJsYWNrICIsCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZXJjZW50KHBjdF9ibGFja19hbG9uZV9ub3RfaGlzcCwgYWNjdXJhY3kgPSAxKSwiPGJyPiIsCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJQZXJjZW50IExhdGlueCAiLAojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVyY2VudChwY3RfaGlzcCwgYWNjdXJhY3kgPSAxKSwiPGJyPiIsCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJQZXJjZW50IEFzaWFuICIsCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZXJjZW50KHBjdF9hc2lhbl9hbG9uZV9ub3RfaGlzcCwgYWNjdXJhY3kgPSAxKSkpKSkgKwojICAgdGhlbWVfdm9pZCgpICsKIyAgIHNjYWxlX2ZpbGxfZmVybWVudGVyKGJyZWFrcz1jKDAsIC4xLCAuMiwgLjMsIC40LC41LCAuNiwgLjcsIC44LCAuOSwgMSksCiMgICAgICAgICAgICAgICAgICAgICAgICBwYWxldHRlID0gIkdyZWVucyIsCiMgICAgICAgICAgICAgICAgICAgICAgICBkaXJlY3Rpb24gPSAxLAojICAgICAgICAgICAgICAgICAgICAgICAgbmEudmFsdWUgPSAidHJhbnNwYXJlbnQiLAojICAgICAgICAgICAgICAgICAgICAgICAgbmFtZT0iUGVyY2VudCBXaGl0ZSAoJSkiLAojICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxzPXBlcmNlbnRfZm9ybWF0KGFjY3VyYWN5ID0gMUwpKSArCiMgICBsYWJzKAojICAgICB0aXRsZSA9ICJCcm9ueCwgUGVyY2VudCBXaGl0ZSwgTm90IEhpc3BhbmljIG9yIExhdGlubyBieSBDZW5zdXMgVHJhY3QiLAojICAgICBjYXB0aW9uID0gIlNvdXJjZTogQW1lcmljYW4gRGVjZW5uaWFsIENlbnN1cywgMjAyMCIKIyAgICkgKyAKIyAgIGdlb21fc2YoZGF0YSA9IG5hYmVzIHw+IGZpbHRlcihCb3JvTmFtZSA9PSAiQnJvbngiKSwgCiMgICAgICAgICAgIGNvbG9yID0gImdyYXkiLCBmaWxsID0gTkEsIGx3ZCA9IDAuMjUpICsgCiMgICBnZW9tX3NmKGRhdGEgPSBib3JvcyB8PiBmaWx0ZXIoYm9yb19uYW1lPT0iQnJvbngiKSwgY29sb3IgPSAiYmxhY2siLCBmaWxsID0gTkEsIGx3ZCA9IC41KQojIAojIGdncGxvdGx5KHJhY2VfbWFwLHRvb2x0aXAgPSAidGV4dCIpCmBgYAoKYGBge3J9CmFsbF92YXJzX2Jyb254IDwtIGFsbF92YXJzX25hYmVzICU+JSBmaWx0ZXIoCiAgQm9yb05hbWUgPT0gIkJyb254IikKCnJhY2VfbWFwIDwtIGdncGxvdCgpICArCiAgICBzdXBwcmVzc1dhcm5pbmdzKGdlb21fc2YobHdkID0gMCwKICAgICAgICAgIGRhdGEgPSBhbGxfdmFyc19icm9ueCwKICAgICAgICAgIG1hcHBpbmcgPSBhZXMoZmlsbCA9IHBjdF9ibGFja19hbG9uZV9ub3RfaGlzcCwKICAgICAgICAgICAgICAgICAgICAgICAgdGV4dCA9IHBhc3RlMChOVEFOYW1lLCI6IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIFBlcmNlbnQgQklQT0MgIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVyY2VudChwY3RfYmlwb2MsIGFjY3VyYWN5PTEpLCI8YnI+IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJQZXJjZW50IEJsYWNrICIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVyY2VudChwY3RfYmxhY2tfYWxvbmVfbm90X2hpc3AsIGFjY3VyYWN5ID0gMSksIjxicj4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlBlcmNlbnQgTGF0aW54ICIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVyY2VudChwY3RfaGlzcCwgYWNjdXJhY3kgPSAxKSwiPGJyPiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUGVyY2VudCBBc2lhbiAiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBlcmNlbnQocGN0X2FzaWFuX2Fsb25lX25vdF9oaXNwLCBhY2N1cmFjeSA9IDEpKSkpKSArCiAgdGhlbWVfdm9pZCgpICsKICBzY2FsZV9maWxsX2Zlcm1lbnRlcihicmVha3M9YygwLCAuMSwgLjIsIC4zLCAuNCwuNSwgLjYsIC43LCAuOCwgLjksIDEpLAogICAgICAgICAgICAgICAgICAgICAgIHBhbGV0dGUgPSAiR3JlZW5zIiwKICAgICAgICAgICAgICAgICAgICAgICBkaXJlY3Rpb24gPSAxLAogICAgICAgICAgICAgICAgICAgICAgIG5hLnZhbHVlID0gInRyYW5zcGFyZW50IiwKICAgICAgICAgICAgICAgICAgICAgICBuYW1lPSJQZXJjZW50IEJsYWNrICglKSIsCiAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxzPXBlcmNlbnRfZm9ybWF0KGFjY3VyYWN5ID0gMUwpKSArCiAgbGFicygKICAgIHRpdGxlID0gIkZpZ3VyZSA1LiBCcm9ueCwgUGVyY2VudCBCbGFjayBieSBDZW5zdXMgVHJhY3QiLAogICAgY2FwdGlvbiA9ICJTb3VyY2U6IEFtZXJpY2FuIERlY2VubmlhbCBDZW5zdXMsIDIwMjAiCiAgKSArCiAgZ2VvbV9zZihkYXRhID0gbmFiZXMgfD4gZmlsdGVyKEJvcm9OYW1lID09ICJCcm9ueCIpLAogICAgICAgICAgY29sb3IgPSAiZ3JheSIsIGZpbGwgPSBOQSwgbHdkID0gMC4yNSkgKwogIGdlb21fc2YoZGF0YSA9IGJvcm9zIHw+IGZpbHRlcihib3JvX25hbWU9PSJCcm9ueCIpLCBjb2xvciA9ICJibGFjayIsIGZpbGwgPSBOQSwgbHdkID0gLjUpCgpnZ3Bsb3RseShyYWNlX21hcCx0b29sdGlwID0gInRleHQiKQpgYGAKCmBgYHtyfQphbGxfdmFyc19icm9ueCA8LSBhbGxfdmFyc19uYWJlcyAlPiUgZmlsdGVyKAogIEJvcm9OYW1lID09ICJCcm9ueCIpCgojIGhpc3QoYWxsX3ZhcnNfYnJvbngkcGN0X2hpc3ApCgpyYWNlX21hcCA8LSBnZ3Bsb3QoKSAgKwogICAgc3VwcHJlc3NXYXJuaW5ncyhnZW9tX3NmKGx3ZCA9IDAsCiAgICAgICAgICBkYXRhID0gYWxsX3ZhcnNfYnJvbngsCiAgICAgICAgICBtYXBwaW5nID0gYWVzKGZpbGwgPSBwY3RfaGlzcCwKICAgICAgICAgICAgICAgICAgICAgICAgdGV4dCA9IHBhc3RlMChOVEFOYW1lLCI6IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIFBlcmNlbnQgQklQT0MgIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVyY2VudChwY3RfYmlwb2MsIGFjY3VyYWN5PTEpLCI8YnI+IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJQZXJjZW50IEJsYWNrICIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVyY2VudChwY3RfYmxhY2tfYWxvbmVfbm90X2hpc3AsIGFjY3VyYWN5ID0gMSksIjxicj4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlBlcmNlbnQgTGF0aW54ICIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVyY2VudChwY3RfaGlzcCwgYWNjdXJhY3kgPSAxKSwiPGJyPiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUGVyY2VudCBBc2lhbiAiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBlcmNlbnQocGN0X2FzaWFuX2Fsb25lX25vdF9oaXNwLCBhY2N1cmFjeSA9IDEpKSkpKSArCiAgdGhlbWVfdm9pZCgpICsKICBzY2FsZV9maWxsX2Zlcm1lbnRlcihicmVha3M9YygwLCAuMiwgLjQsIC42LCAuOCwgMSksCiAgICAgICAgICAgICAgICAgICAgICAgcGFsZXR0ZSA9ICJHcmVlbnMiLAogICAgICAgICAgICAgICAgICAgICAgIGRpcmVjdGlvbiA9IDEsCiAgICAgICAgICAgICAgICAgICAgICAgbmEudmFsdWUgPSAidHJhbnNwYXJlbnQiLAogICAgICAgICAgICAgICAgICAgICAgIG5hbWU9IlBlcmNlbnQgSGlzcGFuaWMgKCUpIiwKICAgICAgICAgICAgICAgICAgICAgICBsYWJlbHM9cGVyY2VudF9mb3JtYXQoYWNjdXJhY3kgPSAxTCkpICsKICBsYWJzKAogICAgdGl0bGUgPSAiRmlndXJlIDYuIEJyb254LCBQZXJjZW50IEhpc3BhbmljIGJ5IENlbnN1cyBUcmFjdCIsCiAgICBjYXB0aW9uID0gIlNvdXJjZTogQW1lcmljYW4gRGVjZW5uaWFsIENlbnN1cywgMjAyMCIKICApICsKICBnZW9tX3NmKGRhdGEgPSBuYWJlcyB8PiBmaWx0ZXIoQm9yb05hbWUgPT0gIkJyb254IiksCiAgICAgICAgICBjb2xvciA9ICJncmF5IiwgZmlsbCA9IE5BLCBsd2QgPSAwLjI1KSArCiAgZ2VvbV9zZihkYXRhID0gYm9yb3MgfD4gZmlsdGVyKGJvcm9fbmFtZT09IkJyb254IiksIGNvbG9yID0gImJsYWNrIiwgZmlsbCA9IE5BLCBsd2QgPSAuNSkKCmdncGxvdGx5KHJhY2VfbWFwLHRvb2x0aXAgPSAidGV4dCIpCmBgYAoKIyMjIyBFZHVjYXRpb25hbCBBdHRhaW5tZW50CgpUaGUgdGFibGUgYmVsb3cgZGlzcGxheXMgdGhlIHBlcmNlbnRhZ2Ugb2YgcmVzaWRlbnRzIGFjcm9zcyBhbGwgZml2ZSBOZXcgWW9yayBDaXR5IGJvcm91Z2hzIHdobyBoYXZlIGNvbXBsZXRlZCB0aGVpciBlZHVjYXRpb24gYXQgbGVhc3QgdXAgdG8gYSBiYWNoZWxvcnMgZGVncmVlLiBJbiB0aGUgY29udGV4dCBvZiB0aGlzIHN0dWR5IGVkdWNhdGlvbmFsIGF0dGFpbm1lbnQgaXMgdXNlZCBhcyBhIHZhcmlhYmxlIHRvIG1hcmsgdGhlIGFtb3VudCBvZiBpbnZlc3RtZW50IGludG8gYSBuZWlnaGJvcmhvb2Qgb3IgY29tbXVuaXR5IGFuZCB0aGUgcHJpb3JpdHkgb2Ygc29tZSBpbmRpdmlkdWFsJ3MgZWR1Y2F0aW9uIG92ZXIgb3RoZXJzLiBBcyBldmlkZW5jZWQsIGJ5IHRoZSBtYXAgb2YgdGhlIEJyb254IGJlbG93IG5laWdoYm9yaG9vZHMgYW5kIGNlbnN1cyB0cmFja3Mgd2l0aCBoaWdoZXIgcG9wdWxhdGlvbnMgb2Ygd2hpdGUgcmVzaWRlbnRzIGFuZCBmZXdlciBCSVBPQyByZXNpZGVudHMgaGF2ZSBoaWdoZXIgcGVyY2VudGFnZXMgb2YgcmVzaWRlbnRzIHdpdGggYXQgbGVhc3QgYSBiYWNoZWxvcidzIGRlZ3JlZS4gVGhlIHRhYmxlIHNob3dzIHRoYXQgdGhlIEJyb254IGhhcyB0aGUgbG93ZXN0IHBlcmNlbnRhZ2Ugb2YgcmVzaWRlbnRzIHdpdGggYmFjaGVsb3JzIGRlZ3JlZXMgb3V0IG9mIGFsbCBOWUMgYm9yb3VnaHMuIE9ubHkgMjIlIG9mIEJyb254IHJlc2lkZW50cyBoYXZlIGJhY2hlbG9ycyBkZWdyZWVzIGNvbXBhcmVkIHRvIDY0JSBvZiBNYW5oYXR0YW4gcmVzaWRlbnRzIHdpdGggYmFjaGVsb3JzIGRlZ3JlZXMsIHRoaXMgaXMgYSBjbGVhciBpbmRpY2F0b3Igb2YgaW52ZXN0bWVudCBhbmQgcHJpb3JpdGl6YXRpb24gb2Ygc29tZSBOWUMgcmVzaWRlbnRzIG92ZXIgb3RoZXJzLCBzcGVjaWZpY2FsbHkgd2hpdGUgcmVzaWRlbnRzIG92ZXIgQklQT0MgcmVzaWRlbnRzLgoKIyMjIyMgKkZpZ3VyZSA3LiBOZXcgWW9yayBDaXR5IEJvcm91Z2hzLCBieSBFZHVjYXRpb25hbCBBdHRhaW5tZW50KgoKYGBge3J9CgojIyMjICpFZHVjYXRpb25hbCBBdHRhaW5tZW50LCBieSBCb3JvdWdoIENlbnN1cyBUcmFjdCoKIyMjIyMjIyMjIENyZWF0ZSBzdW1tYXJ5IHN0YXRzICMjIyMjIyMjIyAKYm9yb3VnaF9lZHVjYXRpb25fc3RhdHMgPC0gc3RfZHJvcF9nZW9tZXRyeShuYS5vbWl0KGFsbF92YXJzX25hYmVzKSkgfD4KICByZW5hbWUoQm9yb3VnaCA9IEJvcm9OYW1lKXw+CiAgZ3JvdXBfYnkoQm9yb3VnaCkgfD4KICAgIHN1bW1hcmlzZSgKICAgICAgYFBlcmNlbnQgd2l0aCBhdCBsZWFzdCBhIGJhY2hlbG9ycyBkZWdyZWVgID0gcGVyY2VudChtZWFuKHJvdW5kKGJhY2hlbG9yX2FuZF9hYm92ZS9wb3Bfb3Zlcl8yNUUsMykpKQopCmJvcm91Z2hfZWR1Y2F0aW9uX3N0YXRzIHw+IGRhdGF0YWJsZSgpCgoKYGBgCgpgYGB7cn0KYWxsX3ZhcnNfYnJvbnggPC0gYWxsX3ZhcnNfbmFiZXMgJT4lIGZpbHRlciggCiAgQm9yb05hbWUgPT0gIkJyb254IikKIApwY3RfZWR1Y2F0aW9uX21hcCA8LSBnZ3Bsb3QoKSAgKyAKICAgIHN1cHByZXNzV2FybmluZ3MoZ2VvbV9zZihsd2QgPSAwLAogICAgICAgICAgZGF0YSA9IGFsbF92YXJzX2Jyb254LAogICAgICAgICAgbWFwcGluZyA9IGFlcyhmaWxsID0gcGN0X2JhY2hlbG9yX2FuZF9hYm92ZSwKICAgICAgICAgICAgICAgICAgICAgICAgdGV4dCA9IHBhc3RlMChOVEFOYW1lLCI6IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIFBlcmNlbnQgd2l0aCBhdCBsZWFzdCBhIGJhY2hlbG9ycyBkZWdyZWUgIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVyY2VudChwY3RfYmFjaGVsb3JfYW5kX2Fib3ZlLCBhY2N1cmFjeT0xKSkpKSkgKwogIHRoZW1lX3ZvaWQoKSArCiAgc2NhbGVfZmlsbF9mZXJtZW50ZXIoYnJlYWtzPWMoMCwgLjIsIC40LCAuNiwgLjgsIDEpLAogICAgICAgICAgICAgICAgICAgICAgIHBhbGV0dGUgPSAiR3JlZW5zIiwKICAgICAgICAgICAgICAgICAgICAgICBkaXJlY3Rpb24gPSAxLAogICAgICAgICAgICAgICAgICAgICAgIG5hLnZhbHVlID0gInRyYW5zcGFyZW50IiwKICAgICAgICAgICAgICAgICAgICAgICBuYW1lPSJQZXJjZW50IHdpdGggYXQgTGVhc3QgYSBCYWNoZWxvcnMgRGVncmVlICglKSIsCiAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxzPXBlcmNlbnRfZm9ybWF0KGFjY3VyYWN5ID0gMUwpKSArCiAgbGFicygKICAgIHRpdGxlID0gIkZpZ3VyZSA4LiBCcm9ueCwgUGVyY2VudCB3aXRoIGF0IExlYXN0IGEgQmFjaGVsb3JzIERlZ3JlZSBieSBDZW5zdXMgVHJhY3QiLAogICAgY2FwdGlvbiA9ICJTb3VyY2U6IEFtZXJpY2FuIERlY2VubmlhbCBDZW5zdXMsIDIwMjAiCiAgKSArIAogIGdlb21fc2YoZGF0YSA9IG5hYmVzIHw+IGZpbHRlcihCb3JvTmFtZSA9PSAiQnJvbngiKSwgCiAgICAgICAgICBjb2xvciA9ICJncmF5IiwgZmlsbCA9IE5BLCBsd2QgPSAwLjI1KSArIAogIGdlb21fc2YoZGF0YSA9IGJvcm9zIHw+IGZpbHRlcihib3JvX25hbWU9PSJCcm9ueCIpLCBjb2xvciA9ICJibGFjayIsIGZpbGwgPSBOQSwgbHdkID0gLjUpCgpnZ3Bsb3RseShwY3RfZWR1Y2F0aW9uX21hcCx0b29sdGlwID0gInRleHQiKQoKCmBgYAoKIyMjIyBNZWRpYW4gSG91c2Vob2xkIEluY29tZSAoTUhJKQoKVGhlIHRhYmxlIGJlbG93IGRpc3BsYXlzIHRoZSBtZWRpYW4gaG91c2Vob2xkIGluY29tZSBhY3Jvc3MgYWxsIDUgTmV3IFlvcmsgQ2l0eSBib3JvdWdocy4gVGhlIGNpdHkgd2lkZSBhdmVyYWdlIG1lZGlhbiBob3VzZWhvbGQgaW5jb21lIGlzIFwkNzksMTU3LjA4LiBUaGUgQnJvbnggaGFzIHRoZSBsb3dlc3QgbWVkaWFuIGhvdXNlaG9sZCBpbmNvbWUgYXQgXCQ1MCw5NzcuNDEgYW5kIE1hbmhhdHRhbiBoYXMgdGhlIGhpZ2hlc3QsIHdpdGggYSBtZWRpYW4gaG91c2Vob2xkIGluY29tZSBvZiBcJDEwOSwwMDguIFVwb24gZXhhbWluaW5nIHRoZSBCcm9ueCBtb3JlIGNsb3NlbHkgYnkgbWVkaWFuIGhvdXNlaG9sZCBpbmNvbWUgaXQgYmVjb21lcyBjbGVhciB0aGF0IGNlbnN1cyB0cmFjdHMgd2l0aCBoaWdoZXIgcGVyY2VudGFnZXMgb2Ygd2hpdGUgcmVzaWRlbnRzIGhhdmUgaGlnaGVyIG1lZGlhbiBob3VzZWhvbGQgaW5jb21lcyBhcyBhIHdob2xlLiBBZGRpdGlvbmFsbHkgdGhlIGFyZWFzIHdoZXJlIG1lZGlhbiBob3VzZWhvbGQgaW5jb21lIGlzIGhpZ2hlc3QgaW4gdGhlIEJyb254IGFyZSBhcmVhcyBpbiBOb3J0aGVybiBCcm9ueCBmYXRoZXIgYXdheSBmcm9tIHRoZSBwb2xsdXRpbmcgZmFjaWxpdGllcyBhbmQgZXhwcmVzc3dheXMgaW4gdGhlIFNvdXRoIEJyb254LgoKIyMjIyMgKkZpZ3VyZSA5LiBOZXcgWW9yayBDaXR5IEJvcm91Z2hzLCBieSBNZWRpYW4gSG91c2Vob2xkIEluY29tZSoKCmBgYHtyfQoKIyMjIyAqTWVkaWFuIEhvdXNlaG9sZCBJbmNvbWUsIGJ5IEJvcm91Z2ggQ2Vuc3VzIFRyYWN0KgojIyMjIyMjIyMgQ3JlYXRlIHN1bW1hcnkgc3RhdHMgIyMjIyMjIyMjIApib3JvdWdoX01ISV9zdGF0cyA8LSBzdF9kcm9wX2dlb21ldHJ5KG5hLm9taXQoYWxsX3ZhcnNfbmFiZXMpKSB8PgogIHJlbmFtZShCb3JvdWdoID0gQm9yb05hbWUpfD4KICBncm91cF9ieShCb3JvdWdoKSB8PgogICAgc3VtbWFyaXNlKAogICAgICBgQXZlcmFnZSBNSElgID0gZG9sbGFyKG1lYW4oTWVkaWFuX0hvdXNlaG9sZF9JbmNvbWUpKSkKCmJvcm91Z2hfTUhJX3N0YXRzIHw+IGRhdGF0YWJsZSgpCgojIG1lYW4obmEub21pdChhbGxfdmFyc19uYWJlcykkTWVkaWFuX0hvdXNlaG9sZF9JbmNvbWUpCmBgYAoKYGBge3J9CmJvcm91Z2hfTUhJIDwtIHN0X2Ryb3BfZ2VvbWV0cnkobmEub21pdChhbGxfdmFyc19uYWJlcykpIHw+CiAgcmVuYW1lKEJvcm91Z2ggPSBCb3JvTmFtZSl8PgogIGdyb3VwX2J5KEJvcm91Z2gpIHw+CiAgICBzdW1tYXJpc2UoCiAgICAgIGBBdmVyYWdlIE1ISWAgPSBtZWFuKE1lZGlhbl9Ib3VzZWhvbGRfSW5jb21lKSkKCm1oaV9wbG90IDwtIGdncGxvdChkYXRhPWJvcm91Z2hfTUhJLCBhZXMoeD1yZW9yZGVyKEJvcm91Z2gsYEF2ZXJhZ2UgTUhJYCksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5PWBBdmVyYWdlIE1ISWAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHQgPSBwYXN0ZTAoIlRoZSBhdmVyYWdlIG1lZGlhbiBob3VzZWhvbGQgaW5jb21lIGluICIsIEJvcm91Z2gsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgaXMgIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2FsZXM6OmRvbGxhcihgQXZlcmFnZSBNSElgLCBhY2N1cmFjeT0xKSkpKSArCiAgZ2VvbV9jb2woZmlsbCA9ICIjYzVjNmQwIikgKwogIGdlb21faGxpbmUoYWVzKHlpbnRlcmNlcHQgPSA3OTE1Ny4wOCksc2l6ZSA9IDEsIGNvbG91ciA9ICIjMzJhOTkxIiwgbGluZXR5cGU9ImRvdHRlZCIpICsgCiAgdGhlbWUoYXhpcy50ZXh0Lng9ZWxlbWVudF90ZXh0KGFuZ2xlPTI1LGhqdXN0PTEpLAogICAgICAgIGF4aXMudGl0bGUgPSBlbGVtZW50X2JsYW5rKCkpICsKICBzY2FsZV95X2NvbnRpbnVvdXMoKSArCiAgYW5ub3RhdGUoInRleHQiLCB4PTEuNzUsIHk9ODIwMDAsIGxhYmVsPSAiQ2l0eS13aWRlIEF2ZXJhZ2UgTUhJOiAkNzksMTU3LjA4IiwgY29sb3IgPSAiIzMyYTk5MSIpICsKICB0aGVtZShwYW5lbC5ib3JkZXIgPSBlbGVtZW50X2JsYW5rKCksIAogICAgICAgIHBhbmVsLmdyaWQubWFqb3IgPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgcGFuZWwuZ3JpZC5taW5vciA9IGVsZW1lbnRfYmxhbmsoKSwgCiAgICAgICAgcGFuZWwuYmFja2dyb3VuZCA9IGVsZW1lbnRfYmxhbmsoKSwgCiAgICAgICAgYXhpcy5saW5lID0gZWxlbWVudF9saW5lKGNvbG91ciA9ICJibGFjayIpKSArCiAgbGFicygKICAgIHRpdGxlID0gIkZpZ3VyZSAxMC4gTllDIE1lZGlhbiBIb3VzZWhvbGQgSW5jb21lLCBieSBCb3JvdWdoIiwKICAgIGNhcHRpb24gPSAiU291cmNlOiBBbWVyaWNhbiBEZWNlbm5pYWwgQ2Vuc3VzLCAyMDIwIgogICkgCgpnZ3Bsb3RseShtaGlfcGxvdCwgdG9vbHRpcCA9ICJ0ZXh0IikgfD4KICBsYXlvdXQobWFyZ2luID0gbGlzdCh0ID0gMjUpKQoKCgpgYGAKCmBgYHtyfQoKIyBoaXN0KGFsbF92YXJzX2Jyb254JE1lZGlhbl9Ib3VzZWhvbGRfSW5jb21lKQoKYWxsX3ZhcnNfYnJvbnggPC0gYWxsX3ZhcnNfbmFiZXMgJT4lIGZpbHRlciggCiAgQm9yb05hbWUgPT0gIkJyb254IikKIAptaGlfbWFwIDwtIGdncGxvdCgpICArIAogICAgc3VwcHJlc3NXYXJuaW5ncyhnZW9tX3NmKGx3ZCA9IDAsCiAgICAgICAgICBkYXRhID0gYWxsX3ZhcnNfYnJvbngsCiAgICAgICAgICBtYXBwaW5nID0gYWVzKGZpbGwgPSBNZWRpYW5fSG91c2Vob2xkX0luY29tZSwKICAgICAgICAgICAgICAgICAgICAgICAgdGV4dCA9IHBhc3RlMChOVEFOYW1lLCI6IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIE1lZGlhbiBIb3VzZWhvbGQgSW5jb21lOiAiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2xsYXIoTWVkaWFuX0hvdXNlaG9sZF9JbmNvbWUpKSkpKSArCiAgdGhlbWVfdm9pZCgpICsKICBzY2FsZV9maWxsX2Zlcm1lbnRlcihicmVha3M9YygwLCAyNTAwMCwgNTAwMDAsIDc1MDAwLCAxMDAwMDAsIDEyNTAwMCwgMTUwMDAwKSwKICAgICAgICAgICAgICAgICAgICAgICBwYWxldHRlID0gIkdyZWVucyIsCiAgICAgICAgICAgICAgICAgICAgICAgZGlyZWN0aW9uID0gMSwKICAgICAgICAgICAgICAgICAgICAgICBuYS52YWx1ZSA9ICJ0cmFuc3BhcmVudCIsCiAgICAgICAgICAgICAgICAgICAgICAgbmFtZT0iTWVkaWFuIEhvdXNlaG9sZCBJbmNvbWUiLAogICAgICAgICAgICAgICAgICAgICAgIGxhYmVscz1kb2xsYXJfZm9ybWF0KGFjY3VyYWN5ID0gTlVMTCkpICsKICBsYWJzKAogICAgdGl0bGUgPSAiRmlndXJlIDExLiBCcm9ueCwgTWVkaWFuIEhvdXNlaG9sZCBJbmNvbWUgYnkgQ2Vuc3VzIFRyYWN0IiwKICAgIGNhcHRpb24gPSAiU291cmNlOiBBbWVyaWNhbiBEZWNlbm5pYWwgQ2Vuc3VzLCAyMDIwIgogICkgKyAKICBnZW9tX3NmKGRhdGEgPSBuYWJlcyB8PiBmaWx0ZXIoQm9yb05hbWUgPT0gIkJyb254IiksIAogICAgICAgICAgY29sb3IgPSAiZ3JheSIsIGZpbGwgPSBOQSwgbHdkID0gMC4yNSkgKyAKICBnZW9tX3NmKGRhdGEgPSBib3JvcyB8PiBmaWx0ZXIoYm9yb19uYW1lPT0iQnJvbngiKSwgY29sb3IgPSAiYmxhY2siLCBmaWxsID0gTkEsIGx3ZCA9IC41KQoKZ2dwbG90bHkobWhpX21hcCx0b29sdGlwID0gInRleHQiKQoKYGBgCgojIyMjIERlbW9ncmFwaGljcyBTdGF0aXN0aWNzIGFuZCBIT0xDIEdyYWRlcyAocmVkbGluaW5nIGdyYWRlcykKClRoZSB0d28gdGFibGVzIGJlbG93IGFsbG93IHlvdSB0byBzb3J0IEJyb254IG5laWdoYm9yaG9vZHMgYmFzZWQgb24gdmFyaW91cyBkZW1vZ3JhcGhpYyBzdGF0aXN0aWNzIHN1Y2ggYXMsIHJhY2UsIGVkdWNhdGlvbmFsIGF0dGFpbm1lbnQsIHBvcHVsYXRpb24gc2l6ZSwgbGFuZ3VhZ2UsIGFuZCBqb2Igb2NjdXBhdGlvbiB3aGlsZSB2aWV3aW5nIHRoZSBIT0xDIGdyYWRlcyBhc3NvY2lhdGVkIHdpdGggZWFjaCBuZWlnaGJvcmhvb2QuIFRoZXNlIHRhYmxlcyBvZmZlciBhbiBleHBsb3JhdG9yeSBhbmFseXNpcyBvZiBCcm9ueCBuZWlnaGJvcmhvb2RzIGFuZCB3b3VsZCBiZSB1c2VmdWwgdG8gb3JnYW5pemF0aW9ucyBvciBpbmRpdmlkdWFscyBsb29raW5nIHRvIGZpbmQgcXVpY2sgaW5mb3JtYXRpb24gcmVnYXJkaW5nIHJlZGxpbmluZyBhbmQgaXRzIGVmZmVjdCBvbiBhIHBhcnRpY3VsYXIgbmVpZ2hib3Job29kLgoKIyMjIyMgKkZpZ3VyZSAxMi4gQnJvbnggRGVtb2dyYXBoaWNzICYgSE9MQyBHcmFkZSBTdGF0aXN0aWNzIGJ5IE5laWdoYm9yaG9vZCoKCmBgYHtyfQpicm9ueF9yZWRsaW5pbmdfZGYgPC0gc3RfZHJvcF9nZW9tZXRyeShicm9ueF9yZWRsaW5pbmdfY2xlYW4pIHw+CiAgICByZW5hbWUoTmVpZ2hib3Job29kID0gTlRBTmFtZSkgfD4KICAgc2VwYXJhdGUoTkFNRSwgaW50byA9IGMoIlRyYWN0IiwgIkNvdW50eSIpLCBzZXAgPSAiLCIpIAoKYnJvbnhfc3RhdHNfMSA8LSBicm9ueF9yZWRsaW5pbmdfZGYgfD4KICBncm91cF9ieShOZWlnaGJvcmhvb2QsIGhvbGNfZ3JhZGUpIHw+CiAgc3VtbWFyaXNlKAogICAgY291bnQgPSBuKCkKICApCgojYWRkIG1vc3QgcHJldmFsZW50IApicm9ueF9zdGF0c193aWRlIDwtIHBpdm90X3dpZGVyKGJyb254X3N0YXRzXzEsIG5hbWVzX2Zyb20gPSBob2xjX2dyYWRlLCB2YWx1ZXNfZnJvbSA9IGNvdW50KQpicm9ueF9zdGF0c193aWRlW2lzLm5hKGJyb254X3N0YXRzX3dpZGUpXSA8LSAwCmJyb254X3N0YXRzX3dpZGVfY2xlYW4gPC0gYnJvbnhfc3RhdHNfd2lkZSB8PgogIHNlbGVjdChOZWlnaGJvcmhvb2QsIEEsIEIsIEMsIEQpIAoKCkhPTENfcHJldmFsZW5jZV9kZiA8LXN1YnNldChicm9ueF9zdGF0c193aWRlX2NsZWFuLCBzZWxlY3QgPSAtTmVpZ2hib3Job29kKQoKSE9MQ19wcmV2YWxlbmNlIDwtIEhPTENfcHJldmFsZW5jZV9kZiB8PiAKICBzZWxlY3QoQTpEKSAKdG9wX0hPTEMgPC0gSE9MQ19wcmV2YWxlbmNlX2RmfD4KICBtdXRhdGUodG9wX0hPTENfZ3JhZGUgPSBuYW1lcyhIT0xDX3ByZXZhbGVuY2VfZGYpW21heC5jb2woSE9MQ19wcmV2YWxlbmNlX2RmKV0pCgpicm9ueF9zdGF0c193aWRlX2NsZWFuJHRvcF9IT0xDID0gbmFtZXMoSE9MQ19wcmV2YWxlbmNlX2RmKVttYXguY29sKEhPTENfcHJldmFsZW5jZV9kZildIAoKYnJvbnhfc3RhdHNfd2lkZV9jbGVhbiA8LSBicm9ueF9zdGF0c193aWRlX2NsZWFuIHw+CiAgbXV0YXRlKAogICAgcGN0X2EgPSByb3VuZChBLyhBK0IrQytEKSwzKSwKICAgIHBjdF9iID0gcm91bmQoQi8oQStCK0MrRCksMyksCiAgICBwY3RfYyA9IHJvdW5kKEMvKEErQitDK0QpLDMpLAogICAgcGN0X2QgPSByb3VuZChELyhBK0IrQytEKSwzKQogICkKCmJyb254X3N0YXRzX2J5X25laWdoYm9yaG9vZCA8LSBicm9ueF9zdGF0c193aWRlX2NsZWFuIHw+CiAgICBncm91cF9ieShOZWlnaGJvcmhvb2QpIHw+CiAgICBzdW1tYXJpc2UoCiAgICAgIGBOZWlnaGJvcmhvb2RgID0gTmVpZ2hib3Job29kLAogICAgICBgTW9zdCBQcmV2YWxlbnQgSE9MQyBHcmFkZWAgPSB0b3BfSE9MQywKICAgICAgYFBlcmNlbnQgb2YgQSBHcmFjZWAgPSBwZXJjZW50KHBjdF9hKSwKICAgICAgYFBlcmNlbnQgb2YgQiBHcmFjZWAgPSBwZXJjZW50KHBjdF9iKSwKICAgICAgYFBlcmNlbnQgb2YgQyBHcmFjZWAgPSBwZXJjZW50KHBjdF9jKSwKICAgICAgYFBlcmNlbnQgb2YgRCBHcmFjZWAgPSBwZXJjZW50KHBjdF9kKSwKCikKCgogIHNvdXRoX2Jyb254X3N0YXRzX2J5X25laWdoYm9yaG9vZCA8LSBicm9ueF9zdGF0c19ieV9uZWlnaGJvcmhvb2QgJT4lIGZpbHRlciggCiAgTmVpZ2hib3Job29kID09ICJNb3R0IEhhdmVuLVBvcnQgTW9ycmlzIiB8IE5laWdoYm9yaG9vZCA9PSAiTWVscm9zZSIgfCBOZWlnaGJvcmhvb2QgPT0gIkh1bnRzIFBvaW50IiB8IE5laWdoYm9yaG9vZCA9PSAiTG9uZ3dvb2QiIHxOZWlnaGJvcmhvb2QgPT0gIk1vcnJpc2FuaWEiCiAgKQogIAoKYnJvbnhfc3RhdHNfMiA8LSBicm9ueF9yZWRsaW5pbmdfZGYgfD4KICBncm91cF9ieShOZWlnaGJvcmhvb2QpIHw+CiAgc3VtbWFyaXNlKAogICAgYE5laWdoYm9yaG9vZCBQb3B1bGF0aW9uYD0gc3VtKHRvdGFsX3BvcCksCiAgICBgSGlzcGFuaWMgUG9wdWxhdGlvbmAgPSBzdW0oaGlzcF9wb3ApLAogICAgYFdoaXRlIFBvcHVsYXRpb25gID0gc3VtKHdoaXRlX3BvcCksCiAgICBgQmxhY2sgUG9wdWxhdGlvbmAgPSBzdW0oYmxhY2tfcG9wKSwKICAgIGBCSVBPQyBQb3B1bGF0aW9uYCA9IHN1bShiaXBvY19wb3ApLAogICAgYFBvcCBvdmVyIDI1YCA9IHN1bShwb3Bfb3Zlcl8yNUUpLAogICAgYEJhY2hlbG9ycyBhbmQgQWJvdmVgID0gc3VtKGJhY2hlbG9yX2FuZF9hYm92ZSksCiAgICBgTW9zdCBQcmV2YWxlbnQgTGFuZ3VhZ2VgID0gY29sbGFwc2U6OmZtb2RlKHByZXZhbGVuY2VfbGFuZ3VhZ2UpLAogICAgYE1vc3QgUHJldmFsZW50IE9jY3VwYXRpb25gID0gY29sbGFwc2U6OmZtb2RlKHByZXZhbGVuY2Vfam9iKSwKICAgIGBBdmVyYWdlIE1ISWAgPSBjb21tYShtZWFuKHJvdW5kKE1lZGlhbl9Ib3VzZWhvbGRfSW5jb21lLDMpLG5hLnJtID0gVFJVRSkpLAogICkgfD4KICBtdXRhdGUoCiAgICBgUGVyY2VudCBMYXRpbnggUG9wdWxhdGlvbmAgPSByb3VuZChgSGlzcGFuaWMgUG9wdWxhdGlvbmAvYE5laWdoYm9yaG9vZCBQb3B1bGF0aW9uYCwgMyksCiAgICBgUGVyY2VudCBCbGFjayBQb3B1bGF0aW9uYCA9IHJvdW5kKGBCbGFjayBQb3B1bGF0aW9uYC9gTmVpZ2hib3Job29kIFBvcHVsYXRpb25gLCAzKSwKICAgIGBQZXJjZW50IFdoaXRlIFBvcHVsYXRpb25gID0gcm91bmQoYFdoaXRlIFBvcHVsYXRpb25gL2BOZWlnaGJvcmhvb2QgUG9wdWxhdGlvbmAsIDMpLAogICAgYFBlcmNlbnQgQklQT0MgUG9wdWxhdGlvbmAgPSByb3VuZChgQklQT0MgUG9wdWxhdGlvbmAvYE5laWdoYm9yaG9vZCBQb3B1bGF0aW9uYCwgMyksCiAgICBgUGVyY2VudCB3aXRoIGF0IGxlYXN0IGEgQmFjaGVsb3JzIERlZ3JlZWA9IHBlcmNlbnQocm91bmQoYEJhY2hlbG9ycyBhbmQgQWJvdmVgL2BQb3Agb3ZlciAyNWAsIDMpKQogICkgfD4KICBzZWxlY3QoCiAgICBOZWlnaGJvcmhvb2QsYE5laWdoYm9yaG9vZCBQb3B1bGF0aW9uYCxgUGVyY2VudCBMYXRpbnggUG9wdWxhdGlvbmAsYFBlcmNlbnQgQmxhY2sgUG9wdWxhdGlvbmAsCiAgICBgUGVyY2VudCBXaGl0ZSBQb3B1bGF0aW9uYCxgUGVyY2VudCBCSVBPQyBQb3B1bGF0aW9uYCxgQXZlcmFnZSBNSElgLGBQZXJjZW50IHdpdGggYXQgbGVhc3QgYSBCYWNoZWxvcnMgRGVncmVlYCxgTW9zdCBQcmV2YWxlbnQgTGFuZ3VhZ2VgLGBNb3N0IFByZXZhbGVudCBPY2N1cGF0aW9uYAogICkKCgpicm9ueF9yZWRpbmluZ19uZWlnaGJvcmhvb2RzIDwtIGJyb254X3N0YXRzXzIgfD4gCiAgbGVmdF9qb2luKGJyb254X3N0YXRzX2J5X25laWdoYm9yaG9vZCwgYnkgPSBjKCJOZWlnaGJvcmhvb2QiKSkgfD4KICAgIG11dGF0ZShgUGVyY2VudCB3aXRoIGF0IGxlYXN0IGEgQmFjaGVsb3JzIERlZ3JlZWAgPSAKICAgICAgICAgICAgIGlmZWxzZShgUGVyY2VudCB3aXRoIGF0IGxlYXN0IGEgQmFjaGVsb3JzIERlZ3JlZWAgPT0gIk5hTiIsCiAgICAgICAgICAgICAgICAgICAgTkEsCiAgICAgICAgICAgICAgICAgICAgYFBlcmNlbnQgd2l0aCBhdCBsZWFzdCBhIEJhY2hlbG9ycyBEZWdyZWVgKSkKCgoKCm5hYmVzX2Jyb254X2dlb20gPC0gbmFiZXNfc2VsZWN0ZWQgJT4lIGZpbHRlciggCiAgQm9yb05hbWUgPT0gIkJyb254IgogICkKCm5hYmVzX2Jyb254X2dlb20gPC0gbmFiZXNfYnJvbnhfZ2VvbSB8PgogIHJlbmFtZShOZWlnaGJvcmhvb2QgPSBOVEFOYW1lKSAKCgpicm9ueF9yZWRpbmluZ19uZWlnaGJvcmhvb2RzX2dlb20gPC0gYnJvbnhfcmVkaW5pbmdfbmVpZ2hib3Job29kcyB8PiAKICBsZWZ0X2pvaW4obmFiZXNfYnJvbnhfZ2VvbSwgYnkgPSBjKCJOZWlnaGJvcmhvb2QiKSkKCgpicm9ueF9yZWRpbmluZ19uZWlnaGJvcmhvb2RzX3RhYmxlIDwtIG5hLm9taXQoYnJvbnhfcmVkaW5pbmdfbmVpZ2hib3Job29kcykgfD4KICBkYXRhdGFibGUoKQoKYnJvbnhfcmVkaW5pbmdfbmVpZ2hib3Job29kc190YWJsZQpgYGAKCiMjIyMjICpGaWd1cmUgMTIuIFNvdXRoIEJyb254IERlbW9ncmFwaGljICYgSE9MQyBHcmFkZSBTdGF0aXN0aWNzIGJ5IE5laWdoYm9yaG9vZCoKCmBgYHtyfQoKICBzb3V0aF9icm9ueF9yZWRpbmluZ19uZWlnaGJvcmhvb2RzX3RhYmxlIDwtIGJyb254X3JlZGluaW5nX25laWdoYm9yaG9vZHMgJT4lIGZpbHRlciggCiAgTmVpZ2hib3Job29kID09ICJNb3R0IEhhdmVuLVBvcnQgTW9ycmlzIiB8IE5laWdoYm9yaG9vZCA9PSAiTWVscm9zZSIgfCBOZWlnaGJvcmhvb2QgPT0gIkh1bnRzIFBvaW50IiB8IE5laWdoYm9yaG9vZCA9PSAiTG9uZ3dvb2QiIHxOZWlnaGJvcmhvb2QgPT0gIk1vcnJpc2FuaWEiCiAgKQoKCgpzb3V0aF9icm9ueF9yZWRpbmluZ19uZWlnaGJvcmhvb2RzX3RhYmxlIHw+IGRhdGF0YWJsZSgpCiAgCgpgYGAKClRoZSB0YWJsZSBiZWxvdyBkaXNwbGF5cyB0aGUgQnJvbnggYnJva2VuIHVwIGJ5IEhPTEMgZ3JhZGVzLiBUaGlzIHRhYmxlIGFsbG93cyB2aWV3ZXJzIHRvIHF1aWNrbHkgbWFrZSBjb25uZWN0aW9ucyBiZXR3ZWVuIEhPTEMgZ3JhZGUgYW5kIGRlbW9ncmFwaGljIHN0YXRpc3RpY3MuIEl0IGJlY29tZXMgZXZpZGVudCBmcm9tIHRoaXMgdGFibGUgdGhhdCA4MiUgb2YgQnJvbnggcmVzaWRlbnRzIGxpdmUgaW4gbmVpZ2hib3Job29kcyB0aGF0IGhhdmUgYmVlbiBhc3NpZ25lZCBlaXRoZXIgYSBDIG9yIEQgcmF0aW5nIG1lYW5pbmcgdGhhdCA4MiUgb2YgQnJvbnggcmVzaWRlbnRzIGxpdmUgaW4gbmVpZ2hib3Job29kcyB0aGF0IGhhdmUgYmVlbiBjbGFzc2lmaWVkIGFzICJEZWZpbml0ZWx5IERlY2xpbmluZyIgb3IgIkhhemFyZG91cyIuCgojIyMjIyAqRmlndXJlIDEzLiBCcm9ueCBEZW1vZ3JhcGhpY3MgYnkgSE9MQyBHcmFkZSoKCmBgYHtyfQoKCgpicm9ueF9yZWRsaW5pbmdfZGZfY2xlYW4yIDwtIGJyb254X3JlZGxpbmluZ19kZiAlPiUgZmlsdGVyKCAKIGhvbGNfZ3JhZGUgPT0gIkEiIHwgaG9sY19ncmFkZSA9PSAiQiIgfCBob2xjX2dyYWRlID09ICJDIiB8IGhvbGNfZ3JhZGUgPT0gIkQiCiAgKQoKYnJvbnhfc3RhdHNfMyA8LSBicm9ueF9yZWRsaW5pbmdfZGZfY2xlYW4yIHw+CiAgZ3JvdXBfYnkoaG9sY19ncmFkZSkgfD4KICByZW5hbWUoCiAgICBgSE9MQyBHcmFkZWAgPSBob2xjX2dyYWRlCiAgKXw+CiAgc3VtbWFyaXNlKAogICAgYFBvcHVsYXRpb25gPSBzdW0odG90YWxfcG9wKSwKICAgIGBIaXNwYW5pYyBQb3B1bGF0aW9uYCA9IHN1bShoaXNwX3BvcCksCiAgICBgV2hpdGUgUG9wdWxhdGlvbmAgPSBzdW0od2hpdGVfcG9wKSwKICAgIGBCbGFjayBQb3B1bGF0aW9uYCA9IHN1bShibGFja19wb3ApLAogICAgYEJJUE9DIFBvcHVsYXRpb25gID0gc3VtKGJpcG9jX3BvcCksCiAgICBgUG9wIG92ZXIgMjVgID0gc3VtKHBvcF9vdmVyXzI1RSksCiAgICBgQmFjaGVsb3JzIGFuZCBBYm92ZWAgPSBzdW0oYmFjaGVsb3JfYW5kX2Fib3ZlKSwKICAgIGBNb3N0IFByZXZhbGVudCBMYW5ndWFnZWAgPSBjb2xsYXBzZTo6Zm1vZGUocHJldmFsZW5jZV9sYW5ndWFnZSksCiAgICBgTW9zdCBQcmV2YWxlbnQgT2NjdXBhdGlvbmAgPSBjb2xsYXBzZTo6Zm1vZGUocHJldmFsZW5jZV9qb2IpLAogICAgYEF2ZXJhZ2UgTUhJYCA9IGNvbW1hKHJvdW5kKG1lYW4obmEub21pdChNZWRpYW5fSG91c2Vob2xkX0luY29tZSkpLDIpKSwKICApIHw+CiAgbXV0YXRlKAogICAgYFBlcmNlbnQgb2YgUG9wdWxhdGlvbmAgPSBwZXJjZW50KHJvdW5kKChgUG9wdWxhdGlvbmAvMTQ2NDM2MyksMykpLAogICAgYFBlcmNlbnQgTGF0aW54IFBvcHVsYXRpb25gID0gcGVyY2VudCgocm91bmQoYEhpc3BhbmljIFBvcHVsYXRpb25gL2BQb3B1bGF0aW9uYCwgMykpKSwKICAgIGBQZXJjZW50IEJsYWNrIFBvcHVsYXRpb25gID0gcGVyY2VudCgocm91bmQoYEJsYWNrIFBvcHVsYXRpb25gL2BQb3B1bGF0aW9uYCwgMykpKSwKICAgIGBQZXJjZW50IFdoaXRlIFBvcHVsYXRpb25gID0gcGVyY2VudCgocm91bmQoYFdoaXRlIFBvcHVsYXRpb25gL2BQb3B1bGF0aW9uYCwgMykpKSwKICAgIGBQZXJjZW50IEJJUE9DIFBvcHVsYXRpb25gID0gcGVyY2VudCgocm91bmQoYEJJUE9DIFBvcHVsYXRpb25gL2BQb3B1bGF0aW9uYCwgMykpKSwKICAgIGBQZXJjZW50IHdpdGggYXQgbGVhc3QgYSBCYWNoZWxvcnMgRGVncmVlYD0gcGVyY2VudCgocm91bmQoYEJhY2hlbG9ycyBhbmQgQWJvdmVgL2BQb3Agb3ZlciAyNWAsIDMpKSkKICApIHw+CiAgc2VsZWN0KAogICAgYEhPTEMgR3JhZGVgLGBQZXJjZW50IG9mIFBvcHVsYXRpb25gLGBQZXJjZW50IExhdGlueCBQb3B1bGF0aW9uYCxgUGVyY2VudCBCbGFjayBQb3B1bGF0aW9uYCwKICAgIGBQZXJjZW50IFdoaXRlIFBvcHVsYXRpb25gLGBQZXJjZW50IEJJUE9DIFBvcHVsYXRpb25gLGBBdmVyYWdlIE1ISWAsYFBlcmNlbnQgd2l0aCBhdCBsZWFzdCBhIEJhY2hlbG9ycyBEZWdyZWVgLGBNb3N0IFByZXZhbGVudCBMYW5ndWFnZWAsYE1vc3QgUHJldmFsZW50IE9jY3VwYXRpb25gKSAKCmJyb254X3N0YXRzXzMgfD4gZGF0YXRhYmxlKCkKCgoKCgoKCgpgYGAKCgpgYGB7cn0KCiMjIyMjICpGaWd1cmUgMTQuIEJyb254IERlbW9ncmFwaGljcyBieSBPY2N1cGF0aW9uKiAtIHRoaXMgaXMgcmVhbGx5IG5vdCB3b3JraW5nIGFuZCBJIHdvdWxkIGxvdmUgdG8gd29yayBvbiBpdCBhbm90aGVyIHRpbWUgYnV0IHRoZXJlIGFyZSB0b28gbWFueSBvdGhlciBwcm9qZWN0cyB0byBmaW5pc2ggdXAgYXQgdGhlIG1vbWVudAojIGJyb254X3N0YXRzXzQgPC0gYnJvbnhfcmVkbGluaW5nX2RmX2NsZWFuMiB8PgojICAgZ3JvdXBfYnkocHJldmFsZW5jZV9qb2IpIHw+CiMgICByZW5hbWUoCiMgICAgIGBIT0xDIEdyYWRlYCA9IGhvbGNfZ3JhZGUKIyAgICl8PgojICAgc3VtbWFyaXNlKAojICAgICBgUG9wdWxhdGlvbmA9IHN1bSh0b3RhbF9wb3ApLAojICAgICBgSGlzcGFuaWMgUG9wdWxhdGlvbmAgPSBzdW0oaGlzcF9wb3ApLAojICAgICBgV2hpdGUgUG9wdWxhdGlvbmAgPSBzdW0od2hpdGVfcG9wKSwKIyAgICAgYEJsYWNrIFBvcHVsYXRpb25gID0gc3VtKGJsYWNrX3BvcCksCiMgICAgIGBCSVBPQyBQb3B1bGF0aW9uYCA9IHN1bShiaXBvY19wb3ApLAojICAgICBgUG9wIG92ZXIgMjVgID0gc3VtKHBvcF9vdmVyXzI1RSksCiMgICAgIGBCYWNoZWxvcnMgYW5kIEFib3ZlYCA9IHN1bShiYWNoZWxvcl9hbmRfYWJvdmUpLAojICAgICBgTW9zdCBQcmV2YWxlbnQgTGFuZ3VhZ2VgID0gY29sbGFwc2U6OmZtb2RlKHByZXZhbGVuY2VfbGFuZ3VhZ2UpLAojICAgICBgTW9zdCBQcmV2YWxlbnQgT2NjdXBhdGlvbmAgPSBjb2xsYXBzZTo6Zm1vZGUocHJldmFsZW5jZV9qb2IpLAojICAgICBgQXZlcmFnZSBNSElgID0gbWVhbihuYS5vbWl0KE1lZGlhbl9Ib3VzZWhvbGRfSW5jb21lKSksCiMgICAgIGBNb3N0IFByZXZhbGVudCBIT0xDIEdyYWRlYCA9IGNvbGxhcHNlOjpmbW9kZShgSE9MQyBHcmFkZWApCiMgICApIHw+CiMgICBtdXRhdGUoCiMgICAgIGBQZXJjZW50IG9mIFBvcHVsYXRpb25gID0gcm91bmQoKGBQb3B1bGF0aW9uYC8xNDY0MzYzKSwzKSwKIyAgICAgYFBlcmNlbnQgTGF0aW54IFBvcHVsYXRpb25gID0gcGVyY2VudCgocm91bmQoYEhpc3BhbmljIFBvcHVsYXRpb25gL2BQb3B1bGF0aW9uYCwgMykpKSwKIyAgICAgYFBlcmNlbnQgQmxhY2sgUG9wdWxhdGlvbmAgPSBwZXJjZW50KChyb3VuZChgQmxhY2sgUG9wdWxhdGlvbmAvYFBvcHVsYXRpb25gLCAzKSkpLAojICAgICBgUGVyY2VudCBXaGl0ZSBQb3B1bGF0aW9uYCA9IHBlcmNlbnQoKHJvdW5kKGBXaGl0ZSBQb3B1bGF0aW9uYC9gUG9wdWxhdGlvbmAsIDMpKSksCiMgICAgIGBQZXJjZW50IEJJUE9DIFBvcHVsYXRpb25gID0gcGVyY2VudCgocm91bmQoYEJJUE9DIFBvcHVsYXRpb25gL2BQb3B1bGF0aW9uYCwgMykpKSwKIyAgICAgYFBlcmNlbnQgd2l0aCBhdCBsZWFzdCBhIEJhY2hlbG9ycyBEZWdyZWVgPSBwZXJjZW50KChyb3VuZChgQmFjaGVsb3JzIGFuZCBBYm92ZWAvYFBvcCBvdmVyIDI1YCwgMykpKQojICAgKSB8PgojICAgc2VsZWN0KAojICAgICBgTW9zdCBQcmV2YWxlbnQgT2NjdXBhdGlvbmAsYE1vc3QgUHJldmFsZW50IEhPTEMgR3JhZGVgLGBQZXJjZW50IG9mIFBvcHVsYXRpb25gLGBQZXJjZW50IExhdGlueCBQb3B1bGF0aW9uYCxgUGVyY2VudCBCbGFjayBQb3B1bGF0aW9uYCwKIyAgICAgYFBlcmNlbnQgV2hpdGUgUG9wdWxhdGlvbmAsYFBlcmNlbnQgQklQT0MgUG9wdWxhdGlvbmAsYEF2ZXJhZ2UgTUhJYCxgUGVyY2VudCB3aXRoIGF0IGxlYXN0IGEgQmFjaGVsb3JzIERlZ3JlZWAsYE1vc3QgUHJldmFsZW50IExhbmd1YWdlYCkgCiMgCiMgYnJvbnhfc3RhdHNfNCB8PiBkYXRhdGFibGUoKQojIAojIAojIGJyb254X2pvYnMgPC0gc3RfZHJvcF9nZW9tZXRyeShuYS5vbWl0KGJyb254X3N0YXRzXzMpKQojIAojIGJyb254X2pvYnNfcGxvdCA8LSBnZ3Bsb3QoZGF0YT1icm9ueF9qb2JzLCBhZXMoeD1gTW9zdCBQcmV2YWxlbnQgT2NjdXBhdGlvbmAsIAojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHk9YFBlcmNlbnQgb2YgUG9wdWxhdGlvbmAsCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dCA9IHBhc3RlMCgiVGhlIHBlcmNlbnQgb2YgcmVzaWRlbnRzIGluIHRoZSBCcm9ueCB0aGF0IHdvcmsgaW4gIiwgYE1vc3QgUHJldmFsZW50IE9jY3VwYXRpb25gLAojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBpcyAiLAojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYFBlcmNlbnQgb2YgUG9wdWxhdGlvbmApCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSkgKwojICAgZ2VvbV9jb2woZmlsbCA9ICIjYzVjNmQwIikgKwojICAgdGhlbWUoYXhpcy50ZXh0Lng9ZWxlbWVudF90ZXh0KGFuZ2xlPTI1LGhqdXN0PTEpLAojICAgICAgICAgYXhpcy50aXRsZSA9IGVsZW1lbnRfYmxhbmsoKSkgKwojICAgc2NhbGVfeV9jb250aW51b3VzKCkgKwojICAgdGhlbWUocGFuZWwuYm9yZGVyID0gZWxlbWVudF9ibGFuaygpLAojICAgICAgICAgcGFuZWwuZ3JpZC5tYWpvciA9IGVsZW1lbnRfYmxhbmsoKSwKIyAgICAgICAgIHBhbmVsLmdyaWQubWlub3IgPSBlbGVtZW50X2JsYW5rKCksCiMgICAgICAgICBwYW5lbC5iYWNrZ3JvdW5kID0gZWxlbWVudF9ibGFuaygpLAojICAgICAgICAgYXhpcy5saW5lID0gZWxlbWVudF9saW5lKGNvbG91ciA9ICJibGFjayIpKSArCiMgICBsYWJzKAojICAgICB0aXRsZSA9ICJGaWd1cmUgMTQuIE5ZQyBNZWRpYW4gSG91c2Vob2xkIEluY29tZSwgYnkgQm9yb3VnaCIsCiMgICAgIGNhcHRpb24gPSAiU291cmNlOiBBbWVyaWNhbiBEZWNlbm5pYWwgQ2Vuc3VzLCAyMDIwIgojICAgKSAKIyAKIyBnZ3Bsb3RseShicm9ueF9qb2JzX3Bsb3QsIHRvb2x0aXAgPSAidGV4dCIpIAoKYGBgCgoKCiMjIyMjICpCcm9ueCBDZW5zdXMgVHJhY3RzICYgVGhlIEVmZmVjdCBvZiBSZWRsaW5pbmcgb24gRWR1Y2F0aW9uYWwgQXR0YWlubWVudCAmIE1lZGlhbiBIb3VzZWhvbGQgSW5jb21lIChNSEkpKgoKVGhlIHNjYXR0ZXIgcGxvdCBiZWxvdyBjb21wYXJlcyB0aGUgZXN0aW1hdGVkIG1lZGlhbiBob3VzZWhvbGQgaW5jb21lIG9mIGV2ZXJ5IGNlbnN1cyB0cmFjdCBpbiB0aGUgQnJvbnggd2l0aCB0aGUgcGVyY2VudCBvZiB0aGF0IGNlbnN1cyB0cmFjdCB0aGF0IGhhcyBjb21wbGV0ZWQgdGhlaXIgZWR1Y2F0aW9uIGF0IGxlYXN0IHVwIHVudGlsIGEgYmFjaGVsb3IncyBkZWdyZWUuIFRoZSBwb2ludHMgb24gdGhlIGNoYXJ0IGFyZSBjb2xvcmVkIGJ5IEhPTEMgZ3JhZGUgd2l0aCBncmVlbiByZXByZXNlbnRpbmcgYW4gQSBncmFkZSAoYmVzdCksIGJsdWUgcmVwcmVzZW50aW5nIGEgQiBncmFkZSAoc3RpbGwgZGVzaXJhYmxlKSwgeWVsbG93IHJlcHJlc2VudGluZyBhIEMgZ3JhZGUgKGRlZmluaXRlbHkgZGVjbGluaW5nKSwgYW5kIHJlZCByZXByZXNlbnRpbmcgYSBEIGdyYWRlIChoYXphcmRvdXMpLiBUaGUgc2l6ZSBvZiBlYWNoIHBvaW50IHJlcHJlc2VudHMgdGhlIHNpemUgb2YgdGhlIHBvcHVsYXRpb24gb2YgZWFjaCB0cmFjdC4gVGhlIGdyYXBoIGJlbG93IGhhcyBhIGNsZWFyIHBvc2l0aXZlIGNvcnJlbGF0aW9uIGJldHdlZW4gbWVkaWFuIGhvdXNlaG9sZCBpbmNvbWUgYW5kIHRoZSBwZXJjZW50IG9mIHRoZSBwb3B1bGF0aW9uIHRoYXQgaGFzIGF0IGxlYXN0IGEgYmFjaGVsb3JzIGRlZ3JlZS4gTWVhbmluZyB0aGF0IGFzIHRoZSBtZWRpYW4gaG91c2Vob2xkIGluY29tZSAoTUhJKSBpbmNyZWFzZXMgc28gZG9lcyB0aGUgcGVyY2VudGFnZSBvZiB0aGUgcG9wdWxhdGlvbiB0aGF0IGhhcyBhdCBsZWFzdCBjb21wbGV0ZWQgYSBiYWNoZWxvcnMgZGVncmVlLiBGcm9tIHRoZSBjaGFydCBpcyBpdCBhbHNvIGVhc2lseSBkaXNjZXJuaWJsZSB0aGF0IHRoZSBIT0xDIGdyYWRlIGluY3JlYXNlIGluIGRlc2lyZWFibGl0eSB3aXRoIHRoZSBpbmNyZWFzZSBpbiBNSEkgYW5kIGluY3JlYXNlIGluIGVkdWNhdGlvbmFsIGF0dGFpbm1lbnQuCgpgYGB7cn0KCmNvbG9ycyA8LSBjKCIjMkZCNTZBIiwiIzI1NTNGNSIsIiNGNkVBNEQiLCIjRUEzRTI4IiwgIndoaXRlIikKcmVkbGluaW5nX3NjYXR0ZXIgPC0gZ2dwbG90KGRhdGEgPSBicm9ueF9yZWRsaW5pbmdfZGZfY2xlYW4yLAogICAgICAgYWVzKHggPSBwY3RfYmFjaGVsb3JfYW5kX2Fib3ZlLCB5ID0gTWVkaWFuX0hvdXNlaG9sZF9JbmNvbWUsIAogICAgICAgICBjb2xvciA9IGhvbGNfZ3JhZGUsIAogICAgICAgICBzaXplID0gdG90YWxfcG9wLAogICAgICAgICB0ZXh0ID0gcGFzdGUwKCJOZWlnaGJvcmhvb2Q6ICIsIE5laWdoYm9yaG9vZCwiPGJyPiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlRyYWN0IFBvcHVsYXRpb246ICIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWEodG90YWxfcG9wKSwgIjxicj4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSE9MQyBHcmFkZTogIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBob2xjX2dyYWRlLCI8YnI+IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUGVyY2VudCBCSVBPQzogIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVyY2VudChwY3RfYmlwb2MsIGFjY3VyYWN5PTEpLCI8YnI+IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTWVkaWFuIEhvdXNlaG9sZCBJbmNvbWU6ICIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9sbGFyKE1lZGlhbl9Ib3VzZWhvbGRfSW5jb21lKSwiPGJyPiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlBlcmNlbnQgd2l0aCBhdCBsZWFzdCBhIGJhY2hlbG9ycyBkZWdyZWU6ICIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBlcmNlbnQocGN0X2JhY2hlbG9yX2FuZF9hYm92ZSwgYWNjdXJhY3k9MSksIjxicj4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNb3N0IHByZXZhbGVudCBsYW5ndWFnZSBzcG9rZW4gYXQgaG9tZTogIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJldmFsZW5jZV9sYW5ndWFnZSwiPGJyPiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk1vc3QgcHJldmFsZW50IG9jY3VwYXRpb246ICIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJldmFsZW5jZV9qb2IpKSkgKwogIGdlb21fcG9pbnQoYWxwaGEgPSAuODUpICsKICBzY2FsZV95X2NvbnRpbnVvdXMobGFiZWxzID0gZG9sbGFyX2Zvcm1hdChhY2N1cmFjeSA9IDEpKSArCiAgc2NhbGVfeF9jb250aW51b3VzKGxhYmVscyA9IHBlcmNlbnRfZm9ybWF0KGFjY3VyYWN5ID0gMSkpICsKICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gY29sb3JzLAogICAgICAgICAgICAgICAgICAgIG5hLnZhbHVlID0gInRyYW5zcGFyZW50IiwKICAgICAgICAgICAgICAgICAgICBuYW1lID0gIkhPTEMgR3JhZGUiKSArCiAgIyBjaGFuZ2UgbGVnZW5kIGxhYmVsIGZvcm1hdHRpbmcKICBzY2FsZV9zaXplX2FyZWEobGFiZWxzID0gY29tbWEsIG1heF9zaXplID01KSArCiAgbGFicyh4ID0gIlBlcmNlbnQgb2YgUG9wdWxhdGlvbiB3aXRoIGF0IGxlYXN0IGEgQmFjaGVsb3JzIERlZ3JlZSIsIHkgPSAiRXN0aW1hdGVkIE1lZGlhbiBIb3VzZWhvbGQgSW5jb21lIiwKICAgICAgIHRpdGxlID0gIkZpZ3VyZSAxNC4gQnJvbnggQ2Vuc3VzIFRyYWN0cyBhbmQgdGhlIEVmZmVjdCBvZiBSZWRsaW5pbmciLAogICAgICAgY2FwdGlvbiA9ICJTb3VyY2VzOiBVUyBDZW5zdXMsIDIwMjA7IEFtZXJpY2FuIENvbW11bml0eSBTdXJ2ZXkiLAogICAgICAgc2l6ZSA9ICJQb3B1bGF0aW9uIiwKICAgICAgIGNvbG9yID0gIkhPTEMgR3JhZGUiCiAgICAgICApICsKICB0aGVtZV9idygpCgoKZ2dwbG90bHkocmVkbGluaW5nX3NjYXR0ZXIsdG9vbHRpcCA9ICJ0ZXh0IikKCgpgYGAKCiMjIyMjICpCcm9ueCBDZW5zdXMgVHJhY3RzICYgVGhlIEVmZmVjdCBvZiBSZWRsaW5pbmcgb24gUmFjZSBhbmQgTWVkaWFuIEhvdXNlaG9sZCBJbmNvbWUgKE1ISSkqCgpUaGUgc2NhdHRlciBwbG90IGJlbG93IGNvbXBhcmVzIE1ISSBpbiBCcm9ueCBjZW5zdXMgdHJhY3RzIHdpdGggdGhlIHBlcmNlbnQgb2YgdGhlIHBvcHVsYXRpb24gdGhhdCBpZGVudGlmaWVzIGFzIG5vbi13aGl0ZSBvciBCSVBPQy4gU2ltaWxhciB0byB0aGUgcGxvdCBhYm92ZSwgdGhlIHBvaW50cyBhcmUgY29sb3JlZCBieSBIT0xDIGdyYWRlcyBhbmQgdGhlaXIgc2l6ZSBpcyBkZXRlcm1pbmVkIGJ5IHRoZSBzaXplIG9mIHRoZSBwb3B1bGF0aW9uIGluIHRoYXQgcGFydGljdWxhciB0cmFjdC4gVGhpcyBncmFwaCBjbGVhcmx5IGlsbHVzdHJhdGVzIHRoZSBjb3JyZWxhdGlvbiBiZXR3ZWVuIEhPTEMgZ3JhZGVzIGFuZCByYWNlLiBUaGUgbWFqb3JpdHkgb2YgdGhlIHJlZCBwb2ludHMgb24gdGhlIHBsb3QgKHRyYWN0cyB0aGF0IHJlY2VpdmVkIGEgRCBncmFkZSkgYXJlIGluIHRoZSBsb3dlciByaWdodCBxdWFkcmFudC4gVGhpcyBpbGx1c3RyYXRlcyB0aGF0IHBlb3BsZSBvZiBjb2xvciB3aG8gYXJlIHRoZSBvdmVyd2hlbG1pbmcgbWFqb3JpdHkgaW4gZm9ybWFsbHkgcmVkLWxpbmVkIG5laWdoYm9yaG9vZHMgYXJlIG1ha2luZyBzaWduaWZpY2FudGx5IGxlc3MgbW9uZXkgdGhhbiB0aGVpciB3aGl0ZSBuZWlnaGJvcnMuIEV2ZW4gdG9kYXkgYWxtb3N0IDEwMCB5ZWFycyBhZnRlciB0aGVzZSByYWNpc3QgcG9saWNpZXMgd2VyZSBwdXQgaW50byBwcmFjdGljZSB0aGUgSE9MQyBncmFkZXMgcmFjaWFsbHkgc2VncmVnYXRlIG5laWdoYm9yaG9vZHMgYW5kIHRoZSBsYXN0aW5nIGVmZmVjdHMgb2Ygc3lzdGVtaWMgZGlzaW52ZXN0bWVudCBhcmUgc3RpbGwgZGVlcGx5IGZlbHQgd2l0aGluIHRoZXNlIGZvcm1hbGx5IHJlZC1saW5lZCBuZWlnaGJvcmhvb2RzLiBGb3IgZXhhbXBsZSwgdGhlIFJpdmVyZGFsZS1TcHV5dGVuIER1eXZpbCBuZWlnaGJvcmhvb2QgaW4gTm9ydGgtRWFzdGVybiBCcm9ueCBoYXMgYW4gSE9MQyBncmFkZSBvZiBBIGFuZCBvbmx5IDMxJSBvZiBpdHMgcmVzaWRlbnRzIGFyZSBCSVBPQyAodGhlIEJyb254IGFzIGEgd2hvbGUgaXMgODkuOSUgQklQT0MpIGFuZCB0aGUgbWVkaWFuIGhvdXNlaG9sZCBpbmNvbWUgaXMgXCQxMjgsOTE5LiBUaGUgbmVpZ2hib3Job29kIG9mIE1lbHJvc2UgaW4gdGhlIFNvdXRoIEJyb254IGhhcyBhIEhPTEMgZ3JhZGUgb2YgRCBhbmQgaXMgY29tcHJpc2VkIG9mIGEgcG9wdWxhdGlvbiB0aGF0IGlzIDk4JSBCSVBPQyBhbmQgYSBNSEkgb2YgXCQxNSw5NTcuCgpgYGB7cn0KCgpjb2xvcnMgPC0gYygiIzJGQjU2QSIsIiMyNTUzRjUiLCIjRjZFQTREIiwiI0VBM0UyOCIsICJ3aGl0ZSIpCnJlZGxpbmluZ19zY2F0dGVyMiA8LSBnZ3Bsb3QoZGF0YSA9IGJyb254X3JlZGxpbmluZ19kZl9jbGVhbjIsCiAgICAgICBhZXMoeCA9IHBjdF9iaXBvYywgeSA9IE1lZGlhbl9Ib3VzZWhvbGRfSW5jb21lLCAKICAgICAgICAgY29sb3IgPSBob2xjX2dyYWRlLCAKICAgICAgICAgc2l6ZSA9IHRvdGFsX3BvcCwKICAgICAgICAgdGV4dCA9IHBhc3RlMCgiTmVpZ2hib3Job29kOiAiLCBOZWlnaGJvcmhvb2QsIjxicj4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJUcmFjdCBQb3B1bGF0aW9uOiAiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hKHRvdGFsX3BvcCksICI8YnI+IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkhPTEMgR3JhZGU6ICIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaG9sY19ncmFkZSwiPGJyPiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlBlcmNlbnQgQklQT0M6ICIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBlcmNlbnQocGN0X2JpcG9jLCBhY2N1cmFjeT0xKSwiPGJyPiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk1lZGlhbiBIb3VzZWhvbGQgSW5jb21lOiAiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvbGxhcihNZWRpYW5fSG91c2Vob2xkX0luY29tZSksIjxicj4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJQZXJjZW50IHdpdGggYXQgbGVhc3QgYSBiYWNoZWxvcnMgZGVncmVlOiAiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZXJjZW50KHBjdF9iYWNoZWxvcl9hbmRfYWJvdmUsIGFjY3VyYWN5PTEpLCI8YnI+IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTW9zdCBwcmV2YWxlbnQgbGFuZ3VhZ2Ugc3Bva2VuIGF0IGhvbWU6ICIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZXZhbGVuY2VfbGFuZ3VhZ2UsIjxicj4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNb3N0IHByZXZhbGVudCBvY2N1cGF0aW9uOiAiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZXZhbGVuY2Vfam9iKSkpICsKICBnZW9tX3BvaW50KGFscGhhID0gLjg1KSArCiAgc2NhbGVfeV9jb250aW51b3VzKGxhYmVscyA9IGRvbGxhcl9mb3JtYXQoYWNjdXJhY3kgPSAxKSkgKwogIHNjYWxlX3hfY29udGludW91cyhsYWJlbHMgPSBwZXJjZW50X2Zvcm1hdChhY2N1cmFjeSA9IDEpKSArCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IGNvbG9ycywKICAgICAgICAgICAgICAgICAgICBuYS52YWx1ZSA9ICJ0cmFuc3BhcmVudCIsCiAgICAgICAgICAgICAgICAgICAgbmFtZSA9ICJIT0xDIEdyYWRlIikgKwogICMgY2hhbmdlIGxlZ2VuZCBsYWJlbCBmb3JtYXR0aW5nCiAgc2NhbGVfc2l6ZV9hcmVhKGxhYmVscyA9IGNvbW1hLCBtYXhfc2l6ZSA9NSkgKwogIGxhYnMoeCA9ICJQZXJjZW50IG9mIFBvcHVsYXRpb24gdGhhdCBpZGV0aWZpZXMgYXMgbm9uLXdoaXRlIChCSVBPQykiLCB5ID0gIkVzdGltYXRlZCBNZWRpYW4gSG91c2Vob2xkIEluY29tZSIsCiAgICAgICB0aXRsZSA9ICJGaWd1cmUgMTUuIEJyb254IENlbnN1cyBUcmFjdHMgYW5kIHRoZSBFZmZlY3Qgb2YgUmVkbGluaW5nIiwKICAgICAgIGNhcHRpb24gPSAiU291cmNlczogVVMgQ2Vuc3VzLCAyMDIwOyBBbWVyaWNhbiBDb21tdW5pdHkgU3VydmV5IiwKICAgICAgIHNpemUgPSAiUG9wdWxhdGlvbiIsCiAgICAgICBjb2xvciA9ICJIT0xDIEdyYWRlIgogICAgICAgKSArCiAgdGhlbWVfYncoKQoKCiAgZ2dwbG90bHkocmVkbGluaW5nX3NjYXR0ZXIyLHRvb2x0aXAgPSAidGV4dCIpCgpgYGAKCiMjIyMjICpNYXAgb2YgdGhlIEJyb254LCBieSBIT0xDIEdyYWRlcyoKClRoZSBtYXAgYmVsb3cgaXMgYSBjbGVhciB2aXN1YWwgZGVwaWN0aW9uIG9mIEhPTEMgZ3JhZGVzIGluIHRoZSBCcm9ueC4gU2FtZSBhcyB0aGUgZ3JhcGhzIGFib3ZlIHRoZSBhcmVhcyBjb2xvcmVkIGdyZWVuIGFyZSBhcmVhcyB0aGF0IHJlY2VpdmVkIGEgZ3JhZGUgb2YgQSwgdGhlIGFyZWFzIGNvbG9ycyBibHVlIGFyZSBhcmVhcyB0aGF0IHJlY2VpdmVkIGEgZ3JhZGUgb2YgQiwgdGhlIGFyZWFzIHRoYXQgYXJlIGNvbG9yZWQgeWVsbG93IGFyZSBhcmVhcyB0aGF0IHJlY2VpdmVkIGEgZ3JhZGUgb2YgQywgYW5kIHRoZSBhcmVhcyB0aGF0IGFyZSBjb2xvcmVkIHJlZCBhcmUgYXJlYXMgdGhhdCByZWNlaXZlZCBhIGdyYWRlIG9mIEQuIFVwb24gaG92ZXIsIHRoZSB0b29sIHRpcCB3aWxsIGRpc3BsYXkgdGhlIG5laWdoYm9yaG9vZCB0aGF0IHRoYXQgc3BlY2lmaWMgY2Vuc3VzIHRyYWN0IGlzIGxvY2F0ZWQgaW4gdGhlIEhPTEMgZ3JhZGUgaXQgcmVjZWl2ZWQgdGhlIHBvcHVsYXRpb24gb2YgdGhhdCBhcmVhLCB0aGUgcGVyY2VudCBvZiByZXNpZGVudHMgdGhhdCBpZGVudGlmeSBhcyBub24td2hpdGUgb3IgQklQT0MsIHRoZSBtZWRpYW4gaG91c2Vob2xkIGluY29tZSwgdGhlIHBlcmNlbnQgb2YgdGhlIHBvcHVsYXRpb24gd2l0aCBhdCBsZWFzdCBhIGJhY2hlbG9yJ3MgZGVncmVlLCB0aGUgbW9zdCBwcmV2YWxlbnQgbGFuZ3VhZ2Ugc3Bva2VuIGluIHRoYXQgYXJlYSBhcyB3ZWxsIGFzIHRoZSBtb3N0IHByZXZhbGVudCBvY2N1cGF0aW9uIGluIHRoYXQgYXJlYS4gSXQgYmVjb21lcyB2aXN1YWxseSBjbGVhciBmcm9tIHRoZSBtYXAgYmVsb3cgdGhhdCB0aGUgbWFqb3JpdHkgb2YgdGhlIEJyb254IHJlY2VpdmVkIGEgcmF0aW5nIGVpdGhlciBvZiBDIG9yIEQgYW5kIHRoYXQgdGhlIG1vc3QgRCBncmFkZXMgd2VyZSBncmFudGVkIHRvIHRyYWN0cyBpbiB0aGUgU291dGggQnJvbnguCgpgYGB7cn0KCgpjb2xvcnMgPC0gYygiIzJGQjU2QSIsIiMyNTUzRjUiLCIjRjZFQTREIiwiI0VBM0UyOCIsICJ3aGl0ZSIpCgoKcmVkbGluaW5nX21hcCA8LSBnZ3Bsb3QoKSAgKwogICAgc3VwcHJlc3NXYXJuaW5ncyhnZW9tX3NmKGx3ZCA9IDAsCiAgICAgICAgICBkYXRhID0gYnJvbnhfcmVkbGluaW5nX2NsZWFuLAogICAgICAgICAgbWFwcGluZyA9IGFlcyhmaWxsID0gaG9sY19ncmFkZSwKICAgICAgICAgICAgICAgICAgICAgICAgdGV4dCA9IHBhc3RlMChOVEFOYW1lLCI8YnI+IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTmVpZ2hib3Job29kIFBvcHVsYXRpb246ICIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWEodG90YWxfcG9wKSwgIjxicj4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSE9MQyBHcmFkZTogIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBob2xjX2dyYWRlLCI8YnI+IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUGVyY2VudCBCSVBPQzogIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVyY2VudChwY3RfYmlwb2MsIGFjY3VyYWN5PTEpLCI8YnI+IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTWVkaWFuIEhvdXNlaG9sZCBJbmNvbWU6ICIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9sbGFyKE1lZGlhbl9Ib3VzZWhvbGRfSW5jb21lKSwiPGJyPiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlBlcmNlbnQgd2l0aCBhdCBsZWFzdCBhIGJhY2hlbG9ycyBkZWdyZWU6ICIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBlcmNlbnQocGN0X2JhY2hlbG9yX2FuZF9hYm92ZSwgYWNjdXJhY3k9MSksIjxicj4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNb3N0IHByZXZhbGVudCBsYW5ndWFnZSBzcG9rZW4gYXQgaG9tZTogIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJldmFsZW5jZV9sYW5ndWFnZSwiPGJyPiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk1vc3QgcHJldmFsZW50IG9jY3VwYXRpb246ICIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJldmFsZW5jZV9qb2IKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSkpKSArCiB0aGVtZV92b2lkKCkgKwogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IGNvbG9ycywKICAgICAgICAgICAgICAgICAgICBuYS52YWx1ZSA9ICJ0cmFuc3BhcmVudCIsCiAgICAgICAgICAgICAgICAgICAgbmFtZSA9ICJIT0xDIEdyYWRlIikgKwpsYWJzKHRpdGxlID0gIkZpZ3VyZSAxNi4gQnJvbngsIEhPTEMgR3JhZGVzIGJ5IENlbnN1cyBUcmFjdCIsCiAgICBjYXB0aW9uID0gIlNvdXJjZTogQW1lcmljYW4gRGVjZW5uaWFsIENlbnN1cywgMjAyMCAmIAogICAgUm9iZXJ0IEsuIE5lbHNvbiwgTGFEYWxlIFdpbmxpbmcsIFJpY2hhcmQgTWFyY2lhbm8sIE5hdGhhbiBDb25ub2xseSwgZXQgYWwuLCDigJxNYXBwaW5nCiAgICBJbmVxdWFsaXR5LOKAnSBBbWVyaWNhbiBQYW5vcmFtYSwgZWQiKSArIAogIGdlb21fc2YoZGF0YSA9IG5hYmVzIHw+IGZpbHRlcihCb3JvTmFtZSA9PSAiQnJvbngiKSwgCiAgICAgICAgICBjb2xvciA9ICJncmF5IiwgZmlsbCA9IE5BLCBsd2QgPSAwLjI1KSArIAogIGdlb21fc2YoZGF0YSA9IGJvcm9zIHw+IGZpbHRlcihib3JvX25hbWU9PSJCcm9ueCIpLCBjb2xvciA9ICJibGFjayIsIGZpbGwgPSBOQSwgbHdkID0gLjUpCgpnZ3Bsb3RseShyZWRsaW5pbmdfbWFwLHRvb2x0aXAgPSAidGV4dCIpCmBgYAoKIyMgRGlzY3Vzc2lvbgoKVGhlIHJhY2lzdCBncmFkaW5nIHN5c3RlbSBjcmVhdGVkIGJ5IHRoZSBIb21lIE93bmVycyBMb2FuIENvcnBvcmF0aW9uIChIT0xDKSBub3Qgb25seSBwZXJwZXR1YXRlZCByYWNpYWwgc2VncmVnYXRpb24gYnV0IGFsc28gZXN0YWJsaXNoZWQgYSBmb3VuZGF0aW9uIGZvciBzeXN0ZW1pYyBkaXNpbnZlc3RtZW50LiBUaGUgY29ycmVsYXRpb24gYmV0d2VlbiBIT0xDIGdyYWRlcywgcmFjZSwgZWR1Y2F0aW9uYWwgYXR0YWlubWVudCwgYW5kIGluY29tZSBsZXZlbHMgcmVtYWlucyBwcm9ub3VuY2VkIDEwMCB5ZWFycyBsYXRlciwgZGVtb25zdHJhdGluZyB0aGUgbGFzdGluZyBpbXBhY3Qgb2YgcmVkbGluaW5nIG9uIGNvbW11bml0eSBkZXZlbG9wbWVudC4gUmVzaWRlbnRzIHRoYXQgbGl2ZSBpbiBuZWlnaGJvcmhvb2RzIHRoYXQgcmVjaXZlZCBhIEQgcmF0aW5nIGZyb20gdGhlIEhPTEMgaGF2ZSBhbiBhdmVyYWdlIE1ISSBvZiBcJDM2LDEyMiB3aGlsZSByZXNpZGVudHMgdGhhdCBsaXZlIGluIG5laWdoYm9yaG9vZHMgdGhhdCByZWNlaXZlZCBhbiBBIHJhdGluZyBmcm9tIHRoZSBIT0xDIGhhdmUgYW4gYXZlcmFnZSBNSEkgb2YgXCQxMDYsODk2LiBJbiBvdXIgZWNvbm9taWMgc3lzdGVtLCBnZW5lcmF0aW9uYWwgd2VhbHRoIGlzIGluZXh0cmljYWJseSBsaW5rZWQgdG8gb3duZXJzaGlwIG9mIHByb3BlcnR5IGFuZCBsYW5kLiBUaHVzIHJlc2lkZW50cyBpbiBuZWlnaGJvcmhvb2RzIHRoYXQgcmVjZWl2ZWQgYSBEIHJhdGluZyBoYXZlIGJlZW4gc3lzdGVtaWNhbGx5IGV4Y2x1ZGVkIGZyb20gdGhlIHByb3NwZWN0IG9mIGdlbmVyYXRpb25hbCB3ZWFsdGggbGFyZ2VseSBkdWUgdG8gcmFjZS4gMTAwIHllYXJzIGxhdGVyIGl0IGlzIHN0aWxsIHBlb3BsZSBvZiBjb2xvciB0aGF0IGFyZSBiZWluZyBtb3N0IGltcGFjdGVkIGJ5IHRoZXNlIHBvbGljaWVzLiBOZWlnaGJvcmhvb2RzIHRoYXQgcmVjZWl2ZWQgZWl0aGVyIGEgQyBvciBEIHJhdGluZyBhcmUgY29tcHJpc2VkIG9mIHJlc2lkZW50cyB0aGF0IGFyZSBvdmVyIDkwJSBCSVBPQy4gVGhlIHN5c3RlbWljIGRpc2ludmVzdG1lbnQgaW4gdGhlc2UgbmVpZ2hib3Job29kcyBleHRlbmRzIGZhciBwYXN0IGhvbWVvd25lcnNoaXAgYW5kIHRoZSBvcHBvcnR1bml0eSB0byBidWlsZCBnZW5lcmF0aW9uYWwgd2VhbHRoLiBUaGUgZGlzaW52ZXN0bWVudCBhcHBsaWVzIGFsc28gdG8gdGhlIGNyZWF0aW9uIG9mIHNjaG9vbHMsIHRoZSBwbGFjZW1lbnQgb2YgcG9sbHV0aW5nIGZhY2lsaXRpZXMsIGFuZCB0aGUgcHJvdGVjdGlvbiBvZiByZXNpZGVudCdzIHNhZmV0eSBmcm9tIGNsaW1hdGUgZGlzYXN0ZXJzLsKgCgpUaGVzZSByZXN1bHRzIGJlY29tZSBldmVuIG1vcmUgcGVydGFpbmVudCB1cG9uIGV4YW1pbmluZyB0aGUgaW50ZXJzZWN0aW9uIGJldHdlZW4gdGhlIGRpc3Byb3BvcnRpb25hdGVseSBoaWdoIHJhdGVzIG9mIGFzdGhtYSBpbiB0aGUgU291dGggQnJvbnggYW5kIHRoZSBzeXN0ZW1pYyBkaXNpbnZlc3RtZW50IHRocm91Z2ggSE9MQyByZWRsaW5pbmcgcHJhY3RpY2VzLiBJbiBjb25jbHVzaW9uLCB0aGlzIHJlc2VhcmNoIHNoZWRzIGxpZ2h0IG9uIHRoZSBwZXJzaXN0ZW50IGNvbnNlcXVlbmNlcyBvZiByZWRsaW5pbmcsIGVtcGhhc2l6aW5nIHRoZSBuZWVkIGZvciBjb21wcmVoZW5zaXZlLCBjb21tdW5pdHktY2VudGVyZWQgYXBwcm9hY2hlcyB0byBicmVhayB0aGUgY3ljbGUgb2Ygc3lzdGVtaWMgZGlzaW52ZXN0bWVudCBhbmQgcHJvbW90ZSBlcXVpdGFibGUgZGV2ZWxvcG1lbnQgaW4gdGhlIEJyb254LgoKIyMgRnVydGhlciBXb3JrICYgTmV4dCBTdGVwcwoKVG8gY29udGludWUgdG8gZXhwYW5kIHRoaXMgcmVzZWFyY2ggaXQgd291bGQgYmUgaW50ZXJlc3RpbmcgdG8gbG9vayBhdCBob3cgdGhlc2UgZGVtb2dyYXBoaWNzIGFuZCBjaGFyYWN0ZXJpc3RpY3Mgb2YgdGhlIG5laWdoYm9yaG9vZHMgaGF2ZSBjaGFuZ2VkIG92ZXIgdGltZSBhbmQgdG8gcHVsbCBpbiBtb3JlIHZhcmlhYmxlcyB0byBzaG93IHRoZSBlZmZlY3RzIG9mIHN5c3RlbWljIHJhY2UtYmFzZWQgZGlzaW52ZXN0bWVudC4gSSB3b3VsZCBiZSBpbnRlcmVzdGVkIGluIGxvb2tpbmcgaW50byB0aGUgcHJvcG9ydGlvbiBvZiBzY2hvb2xzIGJ1aWx0IGluIGZvcm1hbGx5IHJlZC1saW5lZCBuZWlnaGJvcmhvb2RzIHZlcnN1cyB0aGUgYnVpbGRpbmcgb3IgaW1wbGVtZW50YXRpb24gb2YgaW5kdXN0cmlhbCBmYWNpbGl0aWVzIHN1Y2ggYXMgbGFzdCBtaWxlIHdhcmVob3VzZXMsIHBvd2VycGxhbnRzLCBhbmQgc2FuaXRhdGlvbiBmYWNpbGl0aWVzLiBJIHdvdWxkIGFsc28gbGlrZSB0byBleGFtaW5lIGFjY2VzcyB0byBmb29kLCBzcGVjaWZpY2FsbHkgZ3JvY2VyaWVzIGFuZCBwcm9kdWNlIGJldHdlZW4gZm9ybWFsbHkgcmVkLWxpbmVkIG5laWdoYm9yaG9vZHMgYW5kIG5laWdoYm9yaG9vZHMgdGhhdCB3ZXJlIGdyYW50ZWQgQSByYXRpbmdzLiBBZGRpdGlvbmFsbHksIEkgdGhpbmsgaXQgd291bGQgYmUgcmV2ZWFsaW5nIHRvIGV4YW1pbmUgZ3JlZW4gc3BhY2UgZGlzcGFyaXRpZXMgYmV0d2VlbiByZWRsaW5lZCBuZWlnaGJvcmhvb2RzIGFuZCBuZWlnaGJvcmhvb2RzIGdyYW50ZWQgQSByYXRpbmdzLiBBIGZ1cnRoZXIgbG9vayBpbnRvIGVkdWNhdGlvbiBwYXJ0aWN1bGFybHkgQWxsIG9mIHRoZXNlIGludGVyc2VjdGlvbnMgd291bGQgcG90ZW50aWFsbHkgaGVscCBidWlsZCBhIGRhdGEgYmFzZWQgY2FzZSBmb3IgYXJlYXMgbGlrZSB0aGUgU291dGggQnJvbnggYWR2b2NhdGluZyBtb3JlIGNpdHktYmFja2VkIGludmVzdG1lbnQgaW4gdGhlIGhlYWx0aCwgc2FmZXR5LCBwcm9zcGVyaXRpZXMgb2YgdGhlc2UgY29tbXVuaXRpZXMuCgojIyBNZXRob2RzIEFwcGVuZGl4CgpUaGlzIHN0dWR5IHV0aWxpemVzIGRhdGEgZnJvbSB0aGUgMjAyMCBBbWVyaWNhbiBEZWNlbm5pYWwgQ2Vuc3VzIGFzIHdlbGwgYXMgdGhlIDIwMjAgQW1lcmljYW4gQ29tbXVuaXR5IFN1cnZleSAoQUNTKS4gSXQgaXMgaW1wb3J0YW50IHRvIG5vdGUgdGhhdCBBQ1MgZGF0YSBpcyBjb2xsZWN0ZWQgdmlhIDEgYW5kIDUgeWVhciBzdXJ2ZXlzIGFuZCB1bmxpa2UgY2Vuc3VzIGRhdGEsIGl0IGlzIGFuIGVzdGltYXRlIG5vdCBhbiBleGFjdCBjb3VudC4KCkZvciB0aGUgYW5hbHlzaXMgb2YgcmFjaWFsIGRlbW9ncmFwaGljcyBpbiBOZXcgWW9yayBjaXR5IHRoaXMgc3R1ZHkgdXNlcyB0aGUgUE4gdGFibGUgZnJvbSB0aGUgZGVjZW5uaWFsIGNlbnN1cywgYWxsIHJhY2lhbCBjYXRlZ29yaWVzIHdlcmUgYWNjZXNzZWQgdGhyb3VnaCB0aGUgY2Vuc3VzIGFwaSBhbmQgdGhlbiBjYWxjdWxhdGlvbnMgd2VyZSBkb25lIHRvIG9idGFpbiBwZXJjZW50YWdlcyBvZiBlYWNoIHJhY2UgaW4gZWFjaCBjZW5zdXMgdHJhY3QuIEZvciBleGFtcGxlLCB0aGUgcGVyY2VudGFnZSBvZiBoaXNwYW5pYy9sYXRpbm8gb3IgTGF0aW54IHJlc2lkZW50cyB3YXMgY2FsY3VsYXRlZCBieSBkaXZpZGluZyB0aGUgdmFyaWFibGUgUDJfMDAyTiAoaGlzcGFuaWMgb3IgbGF0aW5vKSBieSBQMV8wMDFOICh0b3RhbCBwb3B1bGF0aW9uKS4KClRoZSBhbmFseXNpcyBvZiBlZHVjYXRpb25hbCBhdHRhaW5tZW50IHdhcyBkb25lIHVzaW5nIGRhdGEgZnJvbSB0aGUgMjAyMCBBbWVyaWNhbiBDb21tdW5pdHkgU3VydmV5LiBUaGUgY2FsY3VsYXRpb24gZm9yIHRoZSBwZXJjZW50IG9mIHJlc2lkZW50cyB3aXRoIGF0IGxlYXN0IGEgYmFjaGVsb3JzIGRlZ3JlZSB3YXMgZG9uZSBieSB0YWtpbmcgdGhlIHN1bSBvZiB0aGUgbnVtZXIgb2YgcmVzaWRlbnRzIHdpdGggYSBiYWNoZWxvcnMgZGVncmVlLCBtYXN0ZXJzIGRlZ3JlZSwgcHJvZmVzc2lvbmFsIGRlZ3JlZSBhbmQgZG9jdG9yYWwgZGVncmVlIGFuZCBkaXZpZGluZyBpdCBieSB0aGUgdG90YWwgcG9wdWxhdGlvbiBvdmVyIDI1IHllYXJzIG9sZC4KClRoZSBwcmltYXJ5IG9jY3VwYXRpb24gZm9yIGVhY2ggY2Vuc3VzIHRyYWN0IHdhcyBpZGVudGlmaWVkIGJ5IHB1bGxpbmcgYWxsIHRoZSBjZW5zdXMgZGVmaW5lZCBvY2N1cGF0aW9ucyBmcm9tIHRoZSAyMDIwIEFtZXJpY2FuIENvbW11bml0eSBTdXJ2ZXkgYW5kIHBlcmZvcm1pbmcgYSBtdXRhdGUgb2YgdGhlIGRhdGEgdG8gZmluZCB0aGUgbW9zdCBwcmV2YWxlbnQgb2NjdXBhdGlvbiBmb3IgZWFjaCBjZW5zdXMgdHJhY3QuIFRoZSBzYW1lIGNhbGN1bGF0aW9ucyB3ZXJlIGRvbmUgZm9yIHRoZSBsYW5ndWFnZSB2YXJpYWJsZXMgZm9ybSB0aGUgQW1lcmljYW4gQ29tbXVuaXR5IFN1cnZleSdzIEFQSS4gQm90aCB0aGUgZGVjZW5uaWFsIGNlbnN1cyBhbmQgQW1lcmljYW4gQ29tbXVuaXR5IFN1cnZleSBkYXRhIGFyZSBjb25uZWN0ZWQgdG8gaGlzdG9yaWNhbCByZWRsaW5pbmcgZGF0YSB1c2luZyBhIGdlb3NwYXRpYWwgam9pbi4gVGhlIHJlZGxpbmluZyBkYXRhIHdhcyBhY2Nlc3NlZCBhbmQgZG93bmxvYWRlZCBmcm9tIE1hcHBpbmcgSW5lcXVhbGl0eSwgYSBjb2xsYWJvcmF0aXZlIGVmZm9ydCBhY3Jvc3MgdGhyZWUgdGVhbXMgdG8gZGlnaXRpemUgcmVkbGluaW5nIG1hcHMgYW5kIG1ha2UgdGhlbSBhY2Nlc3NpYmxlIHRvIHRoZSBwdWJsaWMuCgpUaGlzIHJlc2VhcmNoIGRvZXMgY2Fubm90IGNsYWltIHRoYXQgcmVkbGluaW5nIGlzIHRoZSBzb2xlIHJlYXNvbiBmb3IgdGhlIGRlbW9ncmFwaGljIGRpc3Bhcml0aWVzIHRoYXQgaXMgb2JzZXJ2ZWQgYmV0d2VlbiBCcm9ueCBuZWlnaGJvcmhvb2RzIG9yIHRoZSBkaXNwYXJpdGllcyB0aGF0IGFyZSBtYWRlIG5vdGljZWFibGUgYmV0d2VlbiB0aGUgQnJvbnggYW5kIHRoZSBvdGhlciBmb3VyIE5ldyBZb3JrIENpdHkgYm9yb3VnaHMuIFRoZXJlIGFyZSBtYW55IHZhcmlhYmxlcyB0aGF0IGNvdWxkIHBvdGVudGlhbGx5IGluZmx1ZW5jZSB0aGVzZSBjaGFyYWN0ZXJpc3RpY3MgYW5kIGR1ZSB0byB0aW1lLCBhbmQgbXkgcGVyc29uYWwgYWJpbGl0eSB0byBhbmFseXplIGFuZCBpbnRlcnByZXQgZGF0YSBJIHVzZWQgbXkgYmVzdCBqdWRnZW1lbnQgdG8gZGV0ZXJtaW5lIHRoZSB2YXJpYWJsZXMgdG8gaW5jbHVkZSBpbiB0aGlzIHN0dWR5Lgo=