By Althea Erickson
Purpose
The goal of this research is to understand overall financial security
among the self-employed, compared with those working within traditional
employment models. I hope this research will help identify challenges
that are unique to self-employed workers, and inform the development of
policy interventions to address those challenges.
Introduction
Data about the self-employed is notoriously inconsistent and incomplete, resulting
in wildly different estimates of the size and characteristics
of the workforce, ranging from 16.4 million to 72.7 million workers.
These discrepancies arise from differences in research methodologies,
particularly differences in definitions of self-employment and the
wording of questions used to collect data about individual work
arrangements. The result of these methodological discrepancies is broad
disagreement about the nature of independent work. Is it mostly
low-wage, misclassified gig workers? Highly educated and highly paid
professionals? The data is inconclusive.
Data challenges have thwarted many efforts to understand the
circumstances of independent workers. In part due to this lack of data,
they are often overlooked in policy debates about social protections,
and frequently excluded from the programs themselves. In order to bring
self-employed individuals back into the public debate about financial
security and social protections, we need better data on their overall
financial security compared to other populations.
I hypothesize that given independent workers operate largely outside
the employer-based benefit system, and are required to pay a greater
share of taxes (they pay both the employee and employee portions of FICA
taxes), they experience greater financial insecurity than similarly
situated workers who are traditionally employed. While a traditional
economist might argue that the self-employed price the additional costs
they face into their fees, I believe the self-employed lack sufficient
market information and bargaining power to do so, and take home less
income than similarly situated employees.
To test this hypothesis, I compare the self-employed and
traditionally employed within a single data set (the Annual
Social and Economic Supplement of the Current
Population Survey), which collects more granular information about
work and supplementary income than most other public data sets, as well
as detailed information about income sources, health expenditures, and
tax expenditures.
First, I compare the self-employed and employed at the national
level. Then, I compare the self-employed and employed who hold
occupations in Arts & Design, because this occupation category
includes the largest portion of self-employed workers. Looking at
differences among self-employed and employed workers in the same
occupation will help us begin to understand whether worker
classification can help explain differences in overall financial
security.
Demographics
Researchers categorize the self-employed in two ways, incorporated
self-employed and unincorporated self-employed. Incorporated
self-employed individuals are those who have organized themselves as a
business, perhaps as a limited liability corporation (LLC).
Unincorporated self-employed individuals earn income via 1099 contract
work, for example as a sole proprietorship, but are not organized into a
formal business entity.
The two groups of self-employed individuals differ meaningfully from
each other, both in underlying demographics and overall financial
security. By and large, the incorporated self-employed are more
financially secure than the average worker, while the unincorporated
self-employed are meaningfully less secure.
Overall, the self-employed are are slightly older than average
(median age of 49 and 48, compared to 42), slightly less likely to be
native to the United States, and less likely to be a member of a union
(0% vs. 1-6%).
Gender
While the total workforce is slightly more male than female (52%
vs. 48%), both the incorporated and unincorporated self-employed are
more heavily male than other worker types. 66% of incorporated
self-employed workers are men, while 59% of unincorporated self-employed
workers are men.
Education
The incorporated self-employed differ meaningfully from the
unincorporated self-employed when it comes to education level. 50% of
the incorporated self-employed graduated from college, compared to 40%
of the total workforce. On the other hand, 35% percent of the
unincorporated self-employed are college graduates.
Race and Ethnicity
When it comes to race and ethnicity, the self-employed (both
incorporated and unincorporated) are much more likely to be white (83%
and 82% respectively) than the total workforce (77%). They are also less
likely to be Black (8% and 6% vs. 11%). While the unincorporated
self-employed are Hispanic at about the same rates as all workers (22%),
incorporated self-employed workers are less likely to be Hispanic
(15%).
Financial Security
The differences between the incorporated self-employed and
unincorporated self-employed become even more apparent when examining
indicators of financial security, such as household income, personal
income, poverty rates, and access to social protections.
Income
Median personal and household income for unincorporated self-employed
workers are both significantly lower than median incomes for the
workforce as a whole, with unincorporated self-employed workers earning
an average of $41,350/year, compared with the national average of
$52,340.
Meanwhile, the incorporated self-employed earn much more than the
average worker, with a median personal income of $75,336, higher than
any other worker class.
It’s perhaps unsurprising, then, that the unincorporated
self-employed would be twice as likely as the total workforce to live
below the poverty line (10% vs. 5%), while fewer incorporated
self-employed workers (3%) have personal income below the poverty
line.
Social Protections
Financial security extends beyond income, including access to social
protections. While the incorporated self-employed have health insurance
at nearly the same rates as the total workforce (90% vs. 91%), the
unincorporated self-employed experience lower levels of health insurance
coverage than any other worker group, at 84% coverage. It’s unsurprising
that the self-employed are less likely to have health insurance
coverage, given the employer-based health insurance system that
dominates the United States.
The unincorporated self-employed are also far less likely to
contribute to a retirement savings account. Only 12% of unincorporated
self-employed workers contributed to a retirement savings account last
year, compared to 35% of the total workforce. The incorporated
self-employed also contributed at lower rates (28%), but not nearly as
low as the unincorporated self-employed. Again, given that
employment-based benefits are the norm in the United States, and that
the self-employed lack access to infrastructure of automatic enrollment
and contributions through payroll, this difference in retirement savings
activity between self-employed and employed workers is
understandable.
Health Coverage
Among the self-employed who do have health insurance, the source of
that coverage differs meaningfully from employed workers. Unincorporated
and incorporated self-employed workers are more likely than employees to
have public coverage (32% and 23% vs. 18%) or private coverage (38% and
24% vs. 22%), and much less likely to have employer-provided coverage
(39% and 51% vs. 69%).
The unincorporated self-employed are far more likely to rely on
public or private coverage than incorporated self-employed workers, who
access employer-provided coverage at higher rates, potentially through a
partner or other family member. Unincorporated self-employed workers
also receive Medicaid at higher rates of 16%, compared to 11% of total
workers and 9% of the incorporated self-employed.
Arts & Design Workers
Overall, the data demonstrates that unincorporated self-employed
workers have less financial security, as measured by both income and
access to social protections, than employed workers. However, these
differences might be the result of differences in occupations and
industries where these individuals tend to work, and not their
classification.
To better understand the extent to which worker classification drives
financial insecurity, we took a closer look at all workers in Arts &
Design occupations, which is the occupation category with the highest
proportion of unincorporated self-employed workers.
Within Arts and Design occupations, some demographic differences
among worker classes, for example gender and age, became less
pronounced. Other differences, such as education level and unionization
rates, persisted within Arts and Design occupations.
Demographics in the Arts
Within Arts and Design occupations, the unincorporated self-employed
are still slightly more male than all Arts Workers (50% vs. 47%), but
the differences are not nearly as large among worker classifications.
Overall, Arts Workers are slightly less male than all workers, of whom
52% are male.
Within Arts and Design occupations, the education gap between
unincorporated self-employed individuals and employed individuals
persists. While 56.4% of unincorporated self-employed individuals have a
college degree, 62.5% of all Arts and Design Workers completed college.
Overall, Arts and Design workers are more likely to have a college
degree than all workers, of whom 39.7% have a college degree.
Racial and ethnic differences among worker classifications are much
smaller within Arts and Design occupations, though they persist to a
lesser degree. For example, the self employed are slightly more white
(81% and 80% compared to 78%). Unlike among all occupations, the
incorporated self-employed are slightly more Black (11% vs. 8%).
However, given the relatively small differences between the
self-employed and employed workers, as well as a relatively small sample
size, it’s difficult to make any strong assertions about racial or
ethnic differences between worker classifications within Arts and Design
occupations.
Financial Security in the Arts
The personal and household income differentials among worker
classifications persist within Arts and Design Occupations. For example,
the unincorporated self-employed earn less in personal and household
income than employees in Arts and Design occupations, and are much more
likely to live below the poverty line (11% vs. 6%). More unincorporated
self-employed arts workers are on public assistance (0.28% vs. 0.07%),
and neither type of self-employed arts worker received any form of
unemployment compensation.
Differences in income persist and even widen within Arts and Design
occupations, compared to all occupations. Among Arts and Design workers,
the median personal income of unincorporated self-employed is $38,899,
compared to $55,996 among all Arts workers. In this, the unincorporated
self-employed actually earn less than unincorporated self-employed
workers in all occupations ($41,351), despite the fact that total Arts
and Design workers earn slightly more, on average, than all workers in
all occupations ($52,340).
Looking at social protections, arts and design workers are insured at
relatively high rates (92.8% of all Arts & Design workers vs.90.5%
of all workers), and the differentials are not as stark among worker
classifications. However, the differences in retirement contributions
persisted withing Arts and Design occupations, as considerably fewer
unincorporated self-employed arts workers contributed to a retirement
account last year (14% vs. 31% of all Arts workers and 34.8% of all
workers).
Many of the health coverage trends observed among all occupations
persisted within Arts and Design occupations. Though the self-employed
hold similar coverage levels, the source of that coverage differs among
worker classes.
Among arts workers, the incorporated self-employed are slightly less
likely to have public coverage (17%) than all arts workers (20%),
reflecting the relatively higher income levels. However, fully 39% of
unincorporated self-employed workers have public coverage, and 20% are
on Medicaid, double the portion of all Arts workers on Medicaid (10%).
Meanwhile, more incorporated self-employed workers purchase health
insurance directly (30%) or through the ACA marketplace (14%), than
either all Arts workers (14% direct, 7% marketplace) or unincorporated
self-employed (20% direct, 11% marketplace).
These differences can largely be explained by differential access to
employer sponsored health insurance, which 75% of private sector arts
workers have, and the differences in income levels between incorporated
and unincorporated self-employed arts workers. Lower income
unincorporated arts workers seem to rely more on public coverage and
Medicaid, while higher income incorporated self-employed arts workers
are more likely to purchase coverage directly or obtain employment
coverage through a spouse or family member.
Conclusion
The self-employed are not a monolith - the experiences of
incorporated and unincorporated self-employed workers differ greatly.
Based on this analysis, incorporated self-employed workers seem to fit
one narrative of independent work - that of highly educated,
well-compensated professionals, who have more means to purchase health
insurance and manage the challenges of operating outside the
employer-based benefit system.
Meanwhile, unincorporated self-employed workers fit into a different
narrative - that of the relatively insecure gig worker who experiences
greater precarity. Unincorporated self-employed workers earn less
income, rely more on public assistance and benefits, and have lower
levels of social protection, even relative to others who share their
occupation. When considering new programs and benefits, policymakers
should focus their efforts on building a social safety net that improves
financial security for the unincorporated self-employed.
Methods
All analysis based on the 2024
Annual Social and Economic Supplement to the Current
Population Survey, both person and household records.
Worker classification based on the primary job of all persons.
Analysis excludes those working without pay and those outside the
civilian workforce such as children and individuals in the armed
services. Government classification category combines federal, state,
and local government workers. Private classification category combines
for-profit and non-profit private workers.
CPS questionnaire only allows respondents to choose Male or Female,
so gender analysis excludes other gender identities. College graduates
includes all persons with a bachelors degree or above. Hispanic includes
any person of any race who identified as Hispanic. All other racial
groups include only individuals who identified as that race alone. All
individuals who identified as more than one race included in “Other”. US
Citizen includes individuals who are native and born in US, born in PR
or US outlying area, and born abroad of US parent(s).
While all reported data was based on at least 100 observations, the
total sample size was relatively small (70,857 observations for the
total workforce, 1,454 observations for those with Arts and Design
occupations). Figures presented have not been subjected to tests for
statistical significance or correlation.
Next Steps
Ascertain whether this analysis aligns with that derived from
other common measures of the US economy and workforce, such as the
American Communities Survey. Conducting parallel analysis, for example
of health insurance coverage by worker classification, will demonstrate
the extent to which this analysis is reliable.
Expand this analysis with complementary data from other sources
that capture additional information about the financial security of
unincorporated and incorporated self-employed workers. Additional data
sources will help test these findings as well as supplement them with
other indicators of financial security not included in this data set,
such as access to childcare, cost of childcare, access to paid leave,
and other social protections. Much of this data is available in the Survey of
Income and Program Participation (SIPP) data set. I also intend to
explore the Gig Economy Data
Hub for additional sources of information.
Extend this analysis back in time, to explore longer-term trends
and the extent to which the conditions identified in this study have
changed.
LS0tCnRpdGxlOiAiRmluYW5jaWFsIFNlY3VyaXR5IEFtb25nIHRoZSBTZWxmLUVtcGxveWVkIgpvdXRwdXQ6CiAgaHRtbF9kb2N1bWVudDoKICAgIHRoZW1lOiB5ZXRpCiAgICB0b2M6IHRydWUKICAgIHRvY19kZXB0aDogMwogICAgdG9jX2Zsb2F0OiB0cnVlCiAgICBjb2RlX2Rvd25sb2FkOiB0cnVlCi0tLQoKYGBge3IgcGFja2FnZXMsIGluY2x1ZGU9RkFMU0V9CgpsaWJyYXJ5KHRpZHl2ZXJzZSkKbGlicmFyeShzZikKbGlicmFyeShzY2FsZXMpCmxpYnJhcnkoUkNvbG9yQnJld2VyKQpsaWJyYXJ5KGdncGxvdDIpCmxpYnJhcnkocGxvdGx5KQpsaWJyYXJ5KGdnY2hhcnRzKQpsaWJyYXJ5KGdnYmxhbmtldCkgCmxpYnJhcnkoa25pdHIpCmxpYnJhcnkoRFQpIApsaWJyYXJ5KHRpZHlyKQoKcmF3X2Nwc19oaHB1YiA8LSByZWFkX2NzdigiZGF0YS9yYXcvYXNlY3B1YjI0Y3N2L2hocHViMjQuY3N2IikgCnJhd19jcHNfcHBwdWIgPC0gcmVhZF9jc3YoImRhdGEvcmF3L2FzZWNwdWIyNGNzdi9wcHB1YjI0LmNzdiIpCgpzZWxmX2VtcGxveWVkX2NwcyA8LSByYXdfY3BzX3BwcHViICU+JSAKICBsZWZ0X2pvaW4oCiAgICByYXdfY3BzX2hocHViICU+JSBzZWxlY3QoSF9TRVEsIEhUT1RWQUwsIEhISU5DLCBIUENUQ1VUKSwKICAgIGJ5ID0gYygiUEhfU0VRIiA9ICJIX1NFUSIpKSAlPiUKICBzZWxlY3QoUEVSSUROVU0sIFBIX1NFUSwKICAgICAgICAgQV9DSVZMRiwgUEVJTzFDT1csCiAgICAgICAgIEhISU5DLCBIUENUQ1VULCBIVE9UVkFMLCBQVE9UVkFMLCBQRUFSTlZBTCwgUFRPVF9SLAogICAgICAgICBBX0RUSU5ELCBBX0RUT0NDLAogICAgICAgICBDT1YsIFBVQiwgUFJJVl9DWVIsIEdSUCwgSElQQUlELCBESVIsIE1SSywgTUNBSUQsIE1PT1AsCiAgICAgICAgIFJFVENCX1ZBTCwgU1VCVUMsIFBBV19ZTiwgRklDQSwgUEVSTElTLAogICAgICAgICBBX1VOTUVNLCBBX0FHRSwgQV9FTlJMVywgQV9IR0EsIEFfTUFSSVRMLCBBX1NFWCwgUEVIU1BOT04sIFBSQ0lUU0hQLCBQUkRUUkFDRSkgJT4lCiAgZmlsdGVyKEFfQ0lWTEYgIT0gMCwKICAgICAgICAgUEVJTzFDT1cgIT0gMCkgJT4lCiAgcmVuYW1lKGxhYm9yX2ZvcmNlID0gQV9DSVZMRiwKICAgICAgICAgd3Jrcl9jbGFzcyA9IFBFSU8xQ09XLAogICAgICAgICBoaGkgPSBIVE9UVkFMLAogICAgICAgICBoaGlfcGN0ID0gSFBDVENVVCwKICAgICAgICAgaGhpX2JpbnMgPSBISElOQywKICAgICAgICAgaW5kdXN0cnkgPSBBX0RUSU5ELAogICAgICAgICBvY2N1cGF0aW9uID0gQV9EVE9DQywKICAgICAgICAgdG90X2luY29tZSA9IFBUT1RWQUwsCiAgICAgICAgIHRvdF9pbmNvbWVfY2F0ID0gUFRPVF9SLAogICAgICAgICB0b3RfZWFybmluZ3MgPSBQRUFSTlZBTCwKICAgICAgICAgaGlfY292ID0gQ09WLAogICAgICAgICBwdWJfY292ID0gUFVCLCAKICAgICAgICAgcHJpX2NvdiA9IFBSSVZfQ1lSLAogICAgICAgICBlbXBsX2NvdiA9IEdSUCwKICAgICAgICAgZGlyX2NvdiA9IERJUiwKICAgICAgICAgbXRrcF9jb3YgPSBNUkssCiAgICAgICAgIG1lZGljYWlkID0gTUNBSUQsCiAgICAgICAgIHJldF9jb250ID0gUkVUQ0JfVkFMLAogICAgICAgICB1bmVtcCA9IFNVQlVDLAogICAgICAgICBwdWJsaWNfYXNzaXN0ID0gUEFXX1lOLAogICAgICAgICBwb3ZlcnR5ID0gUEVSTElTLAogICAgICAgICBmaWNhX3RheCA9IEZJQ0EsCiAgICAgICAgIHVuaW9uID0gQV9VTk1FTSwKICAgICAgICAgYWdlID0gQV9BR0UsCiAgICAgICAgIGVkdV9hdHRhaW4gPSBBX0hHQSwKICAgICAgICAgbWFyaXRhbCA9IEFfTUFSSVRMLAogICAgICAgICBzZXggPSBBX1NFWCwKICAgICAgICAgaGlzcGFuaWMgPSBQRUhTUE5PTiwKICAgICAgICAgbmF0aXZlX2Jvcm4gPSBQUkNJVFNIUCwKICAgICAgICAgcmFjZSA9IFBSRFRSQUNFKSAgJT4lIAogIG11dGF0ZSgKICAgIHdya3JfY2xhc3NfbGFiZWwgPSBjYXNlX3doZW4oCiAgICAgIHdya3JfY2xhc3MgPT0gMCB+ICJOSVUiLAogICAgICB3cmtyX2NsYXNzICVpbiUgYygxLCAyLCAzKSB+ICJHb3Zlcm5tZW50IiwKICAgICAgd3Jrcl9jbGFzcyAlaW4lIGMoNCwgNSkgfiAiUHJpdmF0ZSIsCiAgICAgIHdya3JfY2xhc3MgPT0gNiB+ICJTZWxmLUVtcGxveWVkIChJbmNvcnBvcmF0ZWQpIiwKICAgICAgd3Jrcl9jbGFzcyA9PSA3IH4gIlNlbGYtRW1wbG95ZWQgKFVuaW5jb3Jwb3JhdGVkKSIsCiAgICAgIHdya3JfY2xhc3MgPT0gOCB+ICJXaXRob3V0LXBheSIsCiAgICAgIFRSVUUgfiAiVW5rbm93biIpLAogICAgZ292ZXJubWVudF9zZWN0b3IgPSBjYXNlX3doZW4oCiAgICAgIHdya3JfY2xhc3MgPT0gMSB+ICJHb3Zlcm5tZW50LWZlZGVyYWwiLAogICAgICB3cmtyX2NsYXNzID09IDIgfiAiR292ZXJubWVudC1zdGF0ZSIsCiAgICAgIHdya3JfY2xhc3MgPT0gMyB+ICJHb3Zlcm5tZW50LWxvY2FsIiwKICAgICAgVFJVRSB+IE5BX2NoYXJhY3Rlcl8pLAogICAgcHJpdmF0ZV9zZWN0b3IgPSBjYXNlX3doZW4oCiAgICAgIHdya3JfY2xhc3MgPT0gNCB+ICJQcml2YXRlLWZvci1wcm9maXQiLAogICAgICB3cmtyX2NsYXNzID09IDUgfiAiUHJpdmF0ZS1ub25wcm9maXQiLAogICAgICBUUlVFIH4gTkFfY2hhcmFjdGVyXyksCiAgICBjb2xsZWdlID0gaWZlbHNlKGVkdV9hdHRhaW4gJWluJSBjKDQzLCA0NCwgNDUsIDQ2KSwgMSwgMCksCiAgICB1c19ib3JuID0gaWZlbHNlKG5hdGl2ZV9ib3JuICVpbiUgYygxLCAyLCAzKSwgMSwgMCksCiAgICB3aGl0ZV9hbG9uZSA9IGlmZWxzZShyYWNlID09IDEsIDEsIDApLAogICAgYmxhY2tfYWxvbmUgPSBpZmVsc2UocmFjZSA9PSAyLCAxLCAwKSwKICAgIGFzaWFuX2Fsb25lID0gaWZlbHNlKHJhY2UgPT0gNCwgMSwgMCksCiAgICBhbWVyaWNhbl9pbmRpYW5fYWxvbmUgPSBpZmVsc2UocmFjZSA9PSAzLCAxLCAwKSwKICAgIGhhd2FpaWFuX3BhY2lmaWNfaXNsYW5kZXJfYWxvbmUgPSBpZmVsc2UocmFjZSA9PSA1LCAxLCAwKSwKICAgIG90aGVyX3JhY2UgPSBpZmVsc2UocmFjZSA+PSA2LCAxLCAwKSwKICAgIHRvdGFsX2hlYWx0aF9jb3N0cyA9IGlmZWxzZShpcy5uYShNT09QKSwgMCwgTU9PUCksCiAgICBwY3RfaGVhbHRoX2Nvc3RzID0gdG90YWxfaGVhbHRoX2Nvc3RzIC90b3RfaW5jb21lLAogICAgcGN0X2ZpY2EgPSBmaWNhX3RheCAvIHRvdF9pbmNvbWUpICU+JSAKICBmaWx0ZXIod3Jrcl9jbGFzcyE9OCkKYGBgCjxicj4KQnkgQWx0aGVhIEVyaWNrc29uCjwvYnI+CjwvYnI+CgojIyBQdXJwb3NlCgpUaGUgZ29hbCBvZiB0aGlzIHJlc2VhcmNoIGlzICB0byB1bmRlcnN0YW5kIG92ZXJhbGwgZmluYW5jaWFsIHNlY3VyaXR5IGFtb25nIHRoZSBzZWxmLWVtcGxveWVkLCBjb21wYXJlZCB3aXRoIHRob3NlIHdvcmtpbmcgd2l0aGluIHRyYWRpdGlvbmFsIGVtcGxveW1lbnQgbW9kZWxzLiBJIGhvcGUgdGhpcyByZXNlYXJjaCB3aWxsIGhlbHAgaWRlbnRpZnkgY2hhbGxlbmdlcyB0aGF0IGFyZSB1bmlxdWUgdG8gc2VsZi1lbXBsb3llZCB3b3JrZXJzLCBhbmQgaW5mb3JtIHRoZSBkZXZlbG9wbWVudCBvZiBwb2xpY3kgaW50ZXJ2ZW50aW9ucyB0byBhZGRyZXNzIHRob3NlIGNoYWxsZW5nZXMuCgo8L2JyPgoKIyMgSW50cm9kdWN0aW9uIAoKRGF0YSBhYm91dCB0aGUgc2VsZi1lbXBsb3llZCBpcyBbbm90b3Jpb3VzbHkgaW5jb25zaXN0ZW50IGFuZCBpbmNvbXBsZXRlXShodHRwczovL3d3dy5naWdlY29ub215ZGF0YS5vcmcvYmFzaWNzL2hvdy1tYW55LWdpZy13b3JrZXJzLWFyZS10aGVyZSl7dGFyZ2V0PSJfYmxhbmsifSwgcmVzdWx0aW5nIGluIHdpbGRseSBbZGlmZmVyZW50IGVzdGltYXRlc10oaHR0cHM6Ly93d3cuYW1lcmljYW5wcm9ncmVzcy5vcmcvYXJ0aWNsZS91bmRlcnN0YW5kaW5nLXRoZS1zZWxmLWVtcGxveWVkLWluLXRoZS11bml0ZWQtc3RhdGVzLyl7dGFyZ2V0PSJfYmxhbmsifSBvZiB0aGUgc2l6ZSBhbmQgY2hhcmFjdGVyaXN0aWNzIG9mIHRoZSB3b3JrZm9yY2UsICByYW5naW5nIGZyb20gMTYuNCBtaWxsaW9uIHRvIDcyLjcgbWlsbGlvbiB3b3JrZXJzLiBUaGVzZSBkaXNjcmVwYW5jaWVzIGFyaXNlIGZyb20gZGlmZmVyZW5jZXMgaW4gcmVzZWFyY2ggbWV0aG9kb2xvZ2llcywgcGFydGljdWxhcmx5IGRpZmZlcmVuY2VzIGluIGRlZmluaXRpb25zIG9mIHNlbGYtZW1wbG95bWVudCBhbmQgdGhlIHdvcmRpbmcgb2YgcXVlc3Rpb25zIHVzZWQgdG8gY29sbGVjdCBkYXRhIGFib3V0IGluZGl2aWR1YWwgd29yayBhcnJhbmdlbWVudHMuIFRoZSByZXN1bHQgb2YgdGhlc2UgbWV0aG9kb2xvZ2ljYWwgZGlzY3JlcGFuY2llcyBpcyBicm9hZCBkaXNhZ3JlZW1lbnQgYWJvdXQgdGhlIG5hdHVyZSBvZiBpbmRlcGVuZGVudCB3b3JrLiBJcyBpdCBtb3N0bHkgbG93LXdhZ2UsIG1pc2NsYXNzaWZpZWQgZ2lnIHdvcmtlcnM/IEhpZ2hseSBlZHVjYXRlZCBhbmQgaGlnaGx5IHBhaWQgcHJvZmVzc2lvbmFscz8gVGhlIGRhdGEgaXMgaW5jb25jbHVzaXZlLiAKCkRhdGEgY2hhbGxlbmdlcyBoYXZlIHRod2FydGVkIG1hbnkgZWZmb3J0cyB0byB1bmRlcnN0YW5kIHRoZSBjaXJjdW1zdGFuY2VzIG9mIGluZGVwZW5kZW50IHdvcmtlcnMuIEluIHBhcnQgZHVlIHRvIHRoaXMgbGFjayBvZiBkYXRhLCB0aGV5IGFyZSBvZnRlbiBvdmVybG9va2VkIGluIHBvbGljeSBkZWJhdGVzIGFib3V0IHNvY2lhbCBwcm90ZWN0aW9ucywgYW5kIGZyZXF1ZW50bHkgZXhjbHVkZWQgZnJvbSB0aGUgcHJvZ3JhbXMgdGhlbXNlbHZlcy4gSW4gb3JkZXIgdG8gYnJpbmcgc2VsZi1lbXBsb3llZCBpbmRpdmlkdWFscyBiYWNrIGludG8gdGhlIHB1YmxpYyBkZWJhdGUgYWJvdXQgZmluYW5jaWFsIHNlY3VyaXR5IGFuZCBzb2NpYWwgcHJvdGVjdGlvbnMsIHdlIG5lZWQgYmV0dGVyIGRhdGEgb24gdGhlaXIgb3ZlcmFsbCBmaW5hbmNpYWwgc2VjdXJpdHkgY29tcGFyZWQgdG8gb3RoZXIgcG9wdWxhdGlvbnMuIAoKSSBoeXBvdGhlc2l6ZSB0aGF0IGdpdmVuIGluZGVwZW5kZW50IHdvcmtlcnMgb3BlcmF0ZSBsYXJnZWx5IG91dHNpZGUgdGhlIGVtcGxveWVyLWJhc2VkIGJlbmVmaXQgc3lzdGVtLCBhbmQgYXJlIHJlcXVpcmVkIHRvIHBheSBhIGdyZWF0ZXIgc2hhcmUgb2YgdGF4ZXMgKHRoZXkgcGF5IGJvdGggdGhlIGVtcGxveWVlIGFuZCBlbXBsb3llZSBwb3J0aW9ucyBvZiBGSUNBIHRheGVzKSwgdGhleSBleHBlcmllbmNlIGdyZWF0ZXIgZmluYW5jaWFsIGluc2VjdXJpdHkgdGhhbiBzaW1pbGFybHkgc2l0dWF0ZWQgd29ya2VycyB3aG8gYXJlIHRyYWRpdGlvbmFsbHkgZW1wbG95ZWQuIFdoaWxlIGEgdHJhZGl0aW9uYWwgZWNvbm9taXN0IG1pZ2h0IGFyZ3VlIHRoYXQgdGhlIHNlbGYtZW1wbG95ZWQgcHJpY2UgdGhlIGFkZGl0aW9uYWwgY29zdHMgdGhleSBmYWNlIGludG8gdGhlaXIgZmVlcywgSSBiZWxpZXZlIHRoZSBzZWxmLWVtcGxveWVkIGxhY2sgc3VmZmljaWVudCBtYXJrZXQgaW5mb3JtYXRpb24gYW5kIGJhcmdhaW5pbmcgcG93ZXIgdG8gZG8gc28sIGFuZCB0YWtlIGhvbWUgbGVzcyBpbmNvbWUgdGhhbiBzaW1pbGFybHkgc2l0dWF0ZWQgZW1wbG95ZWVzLiAKClRvIHRlc3QgdGhpcyBoeXBvdGhlc2lzLCBJIGNvbXBhcmUgdGhlIHNlbGYtZW1wbG95ZWQgYW5kIHRyYWRpdGlvbmFsbHkgZW1wbG95ZWQgd2l0aGluIGEgc2luZ2xlIGRhdGEgc2V0ICh0aGUgW0FubnVhbCBTb2NpYWwgYW5kIEVjb25vbWljIFN1cHBsZW1lbnRdKGh0dHBzOi8vd3d3LmNlbnN1cy5nb3YvZGF0YS9kYXRhc2V0cy90aW1lLXNlcmllcy9kZW1vL2Nwcy9jcHMtYXNlYy5odG1sKSBvZiB0aGUgW0N1cnJlbnQgUG9wdWxhdGlvbiBTdXJ2ZXldKGh0dHBzOi8vd3d3LmNlbnN1cy5nb3YvcHJvZ3JhbXMtc3VydmV5cy9jcHMuaHRtbCkpLCB3aGljaCBjb2xsZWN0cyBtb3JlIGdyYW51bGFyIGluZm9ybWF0aW9uIGFib3V0IHdvcmsgYW5kIHN1cHBsZW1lbnRhcnkgaW5jb21lIHRoYW4gbW9zdCBvdGhlciBwdWJsaWMgZGF0YSBzZXRzLCBhcyB3ZWxsIGFzIGRldGFpbGVkIGluZm9ybWF0aW9uIGFib3V0IGluY29tZSBzb3VyY2VzLCBoZWFsdGggZXhwZW5kaXR1cmVzLCBhbmQgdGF4IGV4cGVuZGl0dXJlcy4gCgpGaXJzdCwgSSBjb21wYXJlIHRoZSBzZWxmLWVtcGxveWVkIGFuZCBlbXBsb3llZCBhdCB0aGUgbmF0aW9uYWwgbGV2ZWwuIFRoZW4sIEkgY29tcGFyZSB0aGUgc2VsZi1lbXBsb3llZCBhbmQgZW1wbG95ZWQgd2hvIGhvbGQgb2NjdXBhdGlvbnMgaW4gQXJ0cyAmIERlc2lnbiwgYmVjYXVzZSB0aGlzIG9jY3VwYXRpb24gY2F0ZWdvcnkgaW5jbHVkZXMgdGhlIGxhcmdlc3QgcG9ydGlvbiBvZiBzZWxmLWVtcGxveWVkIHdvcmtlcnMuIExvb2tpbmcgYXQgZGlmZmVyZW5jZXMgYW1vbmcgc2VsZi1lbXBsb3llZCBhbmQgZW1wbG95ZWQgd29ya2VycyBpbiB0aGUgc2FtZSBvY2N1cGF0aW9uIHdpbGwgaGVscCB1cyBiZWdpbiB0byB1bmRlcnN0YW5kIHdoZXRoZXIgd29ya2VyIGNsYXNzaWZpY2F0aW9uIGNhbiBoZWxwIGV4cGxhaW4gZGlmZmVyZW5jZXMgaW4gb3ZlcmFsbCBmaW5hbmNpYWwgc2VjdXJpdHkuIAoKPC9icj4KCiMjIERlbW9ncmFwaGljcwoKPGJyPgoKUmVzZWFyY2hlcnMgY2F0ZWdvcml6ZSB0aGUgc2VsZi1lbXBsb3llZCBpbiB0d28gd2F5cywgaW5jb3Jwb3JhdGVkIHNlbGYtZW1wbG95ZWQgYW5kIHVuaW5jb3Jwb3JhdGVkIHNlbGYtZW1wbG95ZWQuIEluY29ycG9yYXRlZCBzZWxmLWVtcGxveWVkIGluZGl2aWR1YWxzIGFyZSB0aG9zZSB3aG8gaGF2ZSBvcmdhbml6ZWQgdGhlbXNlbHZlcyBhcyBhIGJ1c2luZXNzLCBwZXJoYXBzIGFzIGEgbGltaXRlZCBsaWFiaWxpdHkgY29ycG9yYXRpb24gKExMQykuIFVuaW5jb3Jwb3JhdGVkIHNlbGYtZW1wbG95ZWQgaW5kaXZpZHVhbHMgZWFybiBpbmNvbWUgdmlhIDEwOTkgY29udHJhY3Qgd29yaywgZm9yIGV4YW1wbGUgYXMgYSBzb2xlIHByb3ByaWV0b3JzaGlwLCBidXQgYXJlIG5vdCBvcmdhbml6ZWQgaW50byBhIGZvcm1hbCBidXNpbmVzcyBlbnRpdHkuIAoKVGhlIHR3byBncm91cHMgb2Ygc2VsZi1lbXBsb3llZCBpbmRpdmlkdWFscyBkaWZmZXIgbWVhbmluZ2Z1bGx5IGZyb20gZWFjaCBvdGhlciwgYm90aCBpbiB1bmRlcmx5aW5nIGRlbW9ncmFwaGljcyBhbmQgb3ZlcmFsbCBmaW5hbmNpYWwgc2VjdXJpdHkuIEJ5IGFuZCBsYXJnZSwgdGhlIGluY29ycG9yYXRlZCBzZWxmLWVtcGxveWVkIGFyZSBtb3JlIGZpbmFuY2lhbGx5IHNlY3VyZSB0aGFuIHRoZSBhdmVyYWdlIHdvcmtlciwgd2hpbGUgdGhlIHVuaW5jb3Jwb3JhdGVkIHNlbGYtZW1wbG95ZWQgYXJlIG1lYW5pbmdmdWxseSBsZXNzIHNlY3VyZS4gCgpPdmVyYWxsLCB0aGUgc2VsZi1lbXBsb3llZCBhcmUgYXJlIHNsaWdodGx5IG9sZGVyIHRoYW4gYXZlcmFnZSAobWVkaWFuIGFnZSBvZiA0OSBhbmQgNDgsIGNvbXBhcmVkIHRvIDQyKSwgc2xpZ2h0bHkgbGVzcyBsaWtlbHkgdG8gYmUgbmF0aXZlIHRvIHRoZSBVbml0ZWQgU3RhdGVzLCBhbmQgbGVzcyBsaWtlbHkgdG8gYmUgYSBtZW1iZXIgb2YgYSB1bmlvbiAoMCUgdnMuIDEtNiUpLiAKCjxicj4KCmBgYHtyIERlbW9ncmFwaGljIHRhYmxlLCBlY2hvPUZBTFNFfQoKdG90YWxfZGVtb3MgPC0gc2VsZl9lbXBsb3llZF9jcHMgJT4lCiAgc3VtbWFyaXplKAogICAgd3Jrcl9jbGFzc19sYWJlbCA9ICJUb3RhbCIsCiAgICBwY3RfbWFsZSA9IHBhc3RlMChyb3VuZChtZWFuKHNleCA9PSAxLCBuYS5ybSA9IFRSVUUpICogMTAwKSwgIiUiKSwKICAgIG1lZGlhbl9hZ2UgPSBtZWRpYW4oYWdlLCBuYS5ybSA9IFRSVUUpLAogICAgcGN0X2NvbGxlZ2UgPSBwYXN0ZTAocm91bmQobWVhbihjb2xsZWdlID09IDEsIG5hLnJtID0gVFJVRSkgKiAxMDApLCAiJSIpLAogICAgdW5pb25fbWVtID0gcGFzdGUwKHJvdW5kKG1lYW4odW5pb24gPT0gMSwgbmEucm0gPSBUUlVFKSAqIDEwMCksICIlIiksCiAgICB1c19ib3JuX3JhdGUgPSBwYXN0ZTAocm91bmQobWVhbih1c19ib3JuID09IDEsIG5hLnJtID0gVFJVRSkgKiAxMDApLCAiJSIpKQoKc2VfZGVtb3MgPC0gc2VsZl9lbXBsb3llZF9jcHMgJT4lICAKICBncm91cF9ieSh3cmtyX2NsYXNzX2xhYmVsKSAlPiUgIAogIHN1bW1hcml6ZSgKICAgIHBjdF9tYWxlID0gcGFzdGUwKHJvdW5kKG1lYW4oc2V4ID09IDEsIG5hLnJtID0gVFJVRSkgKiAxMDApLCAiJSIpLCAgICAKICAgIG1lZGlhbl9hZ2UgPSBtZWRpYW4oYWdlLCBuYS5ybSA9IFRSVUUpLAogICAgcGN0X2NvbGxlZ2UgPSBwYXN0ZTAocm91bmQobWVhbihjb2xsZWdlID09IDEsIG5hLnJtID0gVFJVRSkgKiAxMDApLCAiJSIpLAogICAgdW5pb25fbWVtID0gcGFzdGUwKHJvdW5kKG1lYW4odW5pb24gPT0gMSwgbmEucm0gPSBUUlVFKSAqIDEwMCksICIlIiksCiAgICB1c19ib3JuX3JhdGUgPSBwYXN0ZTAocm91bmQobWVhbih1c19ib3JuID09IDEsIG5hLnJtID0gVFJVRSkgKiAxMDApLCAiJSIpKQoKc2VfZGVtb3MgPC0gYmluZF9yb3dzKHRvdGFsX2RlbW9zLCBzZV9kZW1vcykKCmRhdGF0YWJsZSgKICBzZV9kZW1vcywKICBjb2xuYW1lcyA9IGMoIldvcmtlciBDbGFzc2lmaWNhdGlvbiIsICJNYWxlIiwgIk1lZGlhbiBBZ2UiLCAiQ29sbGVnZSBHcmFkIiwgIlVuaW9uIE1lbWJlciIsICJVUyBDaXRpemVuIiksCiAgb3B0aW9ucyA9IGxpc3QoCiAgICBwYWdpbmcgPSBGQUxTRSwKICAgIHNlYXJjaGluZyA9IEZBTFNFLCAKICAgIGluZm8gPSBGQUxTRSwgCiAgICBsZW5ndGhDaGFuZ2UgPSBGQUxTRSwgCiAgICBkb20gPSAndCcpLAogIGVzY2FwZSA9IEZBTFNFLCAKICByb3duYW1lcyA9IEZBTFNFKQoKYGBgCjwvYnI+CgoKIyMjIEdlbmRlcgo8YnI+CldoaWxlIHRoZSB0b3RhbCB3b3JrZm9yY2UgaXMgc2xpZ2h0bHkgbW9yZSBtYWxlIHRoYW4gZmVtYWxlICg1MiUgdnMuIDQ4JSksIGJvdGggdGhlIGluY29ycG9yYXRlZCBhbmQgdW5pbmNvcnBvcmF0ZWQgc2VsZi1lbXBsb3llZCBhcmUgbW9yZSBoZWF2aWx5IG1hbGUgdGhhbiBvdGhlciB3b3JrZXIgdHlwZXMuIDY2JSBvZiBpbmNvcnBvcmF0ZWQgc2VsZi1lbXBsb3llZCB3b3JrZXJzIGFyZSBtZW4sIHdoaWxlIDU5JSBvZiB1bmluY29ycG9yYXRlZCBzZWxmLWVtcGxveWVkIHdvcmtlcnMgYXJlIG1lbi4gCgo8L2JyPgoKYGBge3IgR2VuZGVyIHZpc3VhbGl6YXRpb24sIGVjaG89RkFMU0V9Cgp0b3RhbF9kZW1vcyA8LSBzZWxmX2VtcGxveWVkX2NwcyAlPiUKICBzdW1tYXJpemUoCiAgICB3cmtyX2NsYXNzX2xhYmVsID0gIlRvdGFsIiwKICAgIHBjdF9tYWxlID0gbWVhbihzZXggPT0gMSwgbmEucm0gPSBUUlVFKSAqIDEwMCwKICAgIHBjdF9mZW1hbGUgPSBtZWFuKHNleCA9PSAyLCBuYS5ybSA9IFRSVUUpICogMTAwKQoKc2VfZGVtb3MgPC0gc2VsZl9lbXBsb3llZF9jcHMgJT4lCiAgZ3JvdXBfYnkod3Jrcl9jbGFzc19sYWJlbCkgJT4lCiAgc3VtbWFyaXplKAogICAgcGN0X21hbGUgPSBtZWFuKHNleCA9PSAxLCBuYS5ybSA9IFRSVUUpICogMTAwLAogICAgcGN0X2ZlbWFsZSA9IG1lYW4oc2V4ID09IDIsIG5hLnJtID0gVFJVRSkgKiAxMDApCgpzZV9kZW1vcyA8LSBiaW5kX3Jvd3ModG90YWxfZGVtb3MsIHNlX2RlbW9zKQoKc2VfZGVtb3NfbG9uZyA8LSBzZV9kZW1vcyAlPiUKICBwaXZvdF9sb25nZXIoCiAgICBjb2xzID0gYyhwY3RfbWFsZSwgcGN0X2ZlbWFsZSksCiAgICBuYW1lc190byA9ICJnZW5kZXIiLAogICAgdmFsdWVzX3RvID0gInBlcmNlbnRhZ2UiKSAlPiUKICBtdXRhdGUoCiAgICBnZW5kZXIgPSByZWNvZGUoZ2VuZGVyLCBwY3RfbWFsZSA9ICJNYWxlIiwgcGN0X2ZlbWFsZSA9ICJGZW1hbGUiKSwKICAgIHdya3JfY2xhc3NfbGFiZWwgPSBmYWN0b3IoCiAgICAgIHdya3JfY2xhc3NfbGFiZWwsCiAgICAgIGxldmVscyA9IGMoCiAgICAgICAgIlRvdGFsIiwKICAgICAgICB1bmlxdWUoc2VfZGVtb3Mkd3Jrcl9jbGFzc19sYWJlbFtzZV9kZW1vcyR3cmtyX2NsYXNzX2xhYmVsICE9ICJUb3RhbCJdKSkpKQoKZ2VuZGVyX3Bsb3QgPC0gZ2dwbG90KHNlX2RlbW9zX2xvbmcsIGFlcygKICB4ID0gd3Jrcl9jbGFzc19sYWJlbCwKICB5ID0gcGVyY2VudGFnZSwKICBmaWxsID0gZ2VuZGVyLAogIHRleHQgPSBwYXN0ZTAoCiAgICAiV29ya2VyIENsYXNzaWZpY2F0aW9uOiAiLCB3cmtyX2NsYXNzX2xhYmVsLCAiPGJyPiIsCiAgICAiR2VuZGVyOiAiLCBnZW5kZXIsICI8YnI+IiwKICAgICJQZXJjZW50YWdlOiAiLCByb3VuZChwZXJjZW50YWdlKSwgIiUiICMgRml4ZWQgdG9vbHRpcCBmb3JtYXR0aW5nCiAgKSkpICsKICBnZW9tX2JhcihzdGF0ID0gImlkZW50aXR5IiwgcG9zaXRpb24gPSAiZG9kZ2UiKSArCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gYygiTWFsZSIgPSAiI2RkYzA1NyIsICJGZW1hbGUiID0gIiM0NDg1YWYiKSkgKwogIGxhYnMoCiAgICB0aXRsZSA9ICJHZW5kZXIgYnkgV29ya2VyIENsYXNzaWZpY2F0aW9uIiwKICAgIHggPSAiIiwKICAgIHkgPSAiIiwKICAgIGZpbGwgPSAiR2VuZGVyIikgKwogIHNjYWxlX3lfY29udGludW91cyhsYWJlbHMgPSBzY2FsZXM6OnBlcmNlbnRfZm9ybWF0KHNjYWxlID0gMSkpICsKICB0aGVtZV9taW5pbWFsKCkgKwogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNDUsIGhqdXN0ID0gMSkpCgppbnRlcmFjdGl2ZV9nZW5kZXJfcGxvdCA8LSBnZ3Bsb3RseShnZW5kZXJfcGxvdCwgdG9vbHRpcCA9ICJ0ZXh0IikgJT4lCiAgbGF5b3V0KAogICAgbGVnZW5kID0gbGlzdCgKICAgICAgdGl0bGUgPSBsaXN0KHRleHQgPSAiR2VuZGVyIiksCiAgICAgIHRyYWNlb3JkZXIgPSAibm9ybWFsIikpCgppbnRlcmFjdGl2ZV9nZW5kZXJfcGxvdAoKYGBgCjwvYnI+CgojIyMgRWR1Y2F0aW9uCgo8YnI+CgpUaGUgaW5jb3Jwb3JhdGVkIHNlbGYtZW1wbG95ZWQgZGlmZmVyIG1lYW5pbmdmdWxseSBmcm9tIHRoZSB1bmluY29ycG9yYXRlZCBzZWxmLWVtcGxveWVkIHdoZW4gaXQgY29tZXMgdG8gZWR1Y2F0aW9uIGxldmVsLiA1MCUgb2YgdGhlIGluY29ycG9yYXRlZCBzZWxmLWVtcGxveWVkIGdyYWR1YXRlZCBmcm9tIGNvbGxlZ2UsIGNvbXBhcmVkIHRvIDQwJSBvZiB0aGUgdG90YWwgd29ya2ZvcmNlLiBPbiB0aGUgb3RoZXIgaGFuZCwgMzUlIHBlcmNlbnQgb2YgdGhlIHVuaW5jb3Jwb3JhdGVkIHNlbGYtZW1wbG95ZWQgYXJlIGNvbGxlZ2UgZ3JhZHVhdGVzLgoKPGJyPgoKYGBge3IgY29sbGVnZSBncmFkcywgZWNobz1GQUxTRX0KCnRvdGFsX2NvbGxlZ2UgPC0gc2VsZl9lbXBsb3llZF9jcHMgJT4lCiAgc3VtbWFyaXplKAogICAgd3Jrcl9jbGFzc19sYWJlbCA9ICJUb3RhbCIsCiAgICBwY3RfY29sbGVnZSA9IG1lYW4oY29sbGVnZSA9PSAxLCBuYS5ybSA9IFRSVUUpICogMTAwKQoKc2VfY29sbGVnZSA8LSBzZWxmX2VtcGxveWVkX2NwcyAlPiUKICBncm91cF9ieSh3cmtyX2NsYXNzX2xhYmVsKSAlPiUKICBzdW1tYXJpemUoCiAgICBwY3RfY29sbGVnZSA9IG1lYW4oY29sbGVnZSA9PSAxLCBuYS5ybSA9IFRSVUUpICogMTAwKQoKY29sbGVnZV9kYXRhIDwtIGJpbmRfcm93cyh0b3RhbF9jb2xsZWdlLCBzZV9jb2xsZWdlKQoKY29sbGVnZV9kYXRhIDwtIGNvbGxlZ2VfZGF0YSAlPiUKICBtdXRhdGUoCiAgICB3cmtyX2NsYXNzX2xhYmVsID0gZmFjdG9yKHdya3JfY2xhc3NfbGFiZWwsIGxldmVscyA9IGMoIlRvdGFsIiwgdW5pcXVlKHdya3JfY2xhc3NfbGFiZWxbd3Jrcl9jbGFzc19sYWJlbCAhPSAiVG90YWwiXSkpKSwKICAgIGdyb3VwID0gaWZlbHNlKHdya3JfY2xhc3NfbGFiZWwgPT0gIlRvdGFsIiwgIlRvdGFsIiwgIldvcmtlciBDbGFzcyIpLAogICAgdG9vbHRpcCA9IHBhc3RlMCgiUGVyY2VudCBDb2xsZWdlIEdyYWRzOiAiLCByb3VuZChwY3RfY29sbGVnZSwgMCksICIlIikpCgp0b3RhbF9wY3RfY29sbGVnZSA8LSB0b3RhbF9jb2xsZWdlJHBjdF9jb2xsZWdlCgpjb2xsZWdlX3Bsb3QgPC0gZ2dwbG90KGNvbGxlZ2VfZGF0YSwgYWVzKHggPSB3cmtyX2NsYXNzX2xhYmVsLCB5ID0gcGN0X2NvbGxlZ2UsIGZpbGwgPSBncm91cCwgdGV4dCA9IHRvb2x0aXApKSArCiAgZ2VvbV9iYXIoc3RhdCA9ICJpZGVudGl0eSIpICsKICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSB0b3RhbF9wY3RfY29sbGVnZSwgbGluZXR5cGUgPSAiZG90dGVkIiwgY29sb3IgPSAiZ3JleSIsIGxpbmV3aWR0aCA9IDAuNSkgKyAKICBsYWJzKAogICAgdGl0bGUgPSAiQ29sbGVnZSBHcmFkdWF0ZXMgYnkgV29ya2VyIENsYXNzaWZpY2F0aW9uIiwKICAgIHggPSAiIiwKICAgIHkgPSAiIgogICkgKwogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IGMoIlRvdGFsIiA9ICIjYWIxZDc5IiwgIldvcmtlciBDbGFzcyIgPSAiI2RkODEyYiIpLAogICAgICAgICAgICAgICAgICAgIG5hbWUgPSAiR3JvdXAiKSArCiAgc2NhbGVfeV9jb250aW51b3VzKGxhYmVscyA9IHNjYWxlczo6cGVyY2VudF9mb3JtYXQoc2NhbGUgPSAxKSkgKwogIHRoZW1lX21pbmltYWwoKSArCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA0NSwgaGp1c3QgPSAxKSwgbGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKQoKaW50ZXJhY3RpdmVfY29sbGVnZV9wbG90IDwtIGdncGxvdGx5KGNvbGxlZ2VfcGxvdCwgdG9vbHRpcCA9ICJ0ZXh0IikKCmludGVyYWN0aXZlX2NvbGxlZ2VfcGxvdAoKYGBgCgo8L2JyPgoKIyMjIFJhY2UgYW5kIEV0aG5pY2l0eQoKPGJyPgoKV2hlbiBpdCBjb21lcyB0byByYWNlIGFuZCBldGhuaWNpdHksIHRoZSBzZWxmLWVtcGxveWVkIChib3RoIGluY29ycG9yYXRlZCBhbmQgdW5pbmNvcnBvcmF0ZWQpIGFyZSBtdWNoIG1vcmUgbGlrZWx5IHRvIGJlIHdoaXRlICg4MyUgYW5kIDgyJSByZXNwZWN0aXZlbHkpIHRoYW4gdGhlIHRvdGFsIHdvcmtmb3JjZSAoNzclKS4gVGhleSBhcmUgYWxzbyBsZXNzIGxpa2VseSB0byBiZSBCbGFjayAoOCUgYW5kIDYlIHZzLiAxMSUpLiBXaGlsZSB0aGUgdW5pbmNvcnBvcmF0ZWQgc2VsZi1lbXBsb3llZCBhcmUgSGlzcGFuaWMgYXQgYWJvdXQgdGhlIHNhbWUgcmF0ZXMgYXMgYWxsIHdvcmtlcnMgKDIyJSksIGluY29ycG9yYXRlZCBzZWxmLWVtcGxveWVkIHdvcmtlcnMgYXJlIGxlc3MgbGlrZWx5IHRvIGJlIEhpc3BhbmljICgxNSUpLiAKCjxicj4KCmBgYHtyIFJhY2UgdGFibGUsIGVjaG89RkFMU0V9Cgp0b3RhbF9yYWNlIDwtIHNlbGZfZW1wbG95ZWRfY3BzICU+JSAgCiAgc3VtbWFyaXplKAogICAgd3Jrcl9jbGFzc19sYWJlbCA9ICJUb3RhbCIsIAogICAgcGN0X3doaXRlID0gcGFzdGUwKHJvdW5kKG1lYW4od2hpdGVfYWxvbmUgPT0gMSwgbmEucm0gPSBUUlVFKSAqIDEwMCksICIlIiksCiAgICBwY3RfYmxhY2sgPSBwYXN0ZTAocm91bmQobWVhbihibGFja19hbG9uZSA9PSAxLCBuYS5ybSA9IFRSVUUpICogMTAwKSwgIiUiKSwKICAgIHBjdF9hc2lhbiA9IHBhc3RlMChyb3VuZChtZWFuKGFzaWFuX2Fsb25lID09IDEsIG5hLnJtID0gVFJVRSkgKiAxMDApLCAiJSIpLAogICAgcGN0X2hpc3BhbmljID0gcGFzdGUwKHJvdW5kKG1lYW4oaGlzcGFuaWMgPT0gMSwgbmEucm0gPSBUUlVFKSAqIDEwMCksICIlIiksCiAgICBwY3RfaGF3YWlpYW5fcGkgPSBwYXN0ZTAocm91bmQobWVhbihoYXdhaWlhbl9wYWNpZmljX2lzbGFuZGVyX2Fsb25lID09IDEsIG5hLnJtID0gVFJVRSkgKiAxMDApLCAiJSIpLAogICAgcGN0X25hdGl2ZV9hbSA9IHBhc3RlMChyb3VuZChtZWFuKGFtZXJpY2FuX2luZGlhbl9hbG9uZSA9PSAxLCBuYS5ybSA9IFRSVUUpICogMTAwKSwgIiUiKSwKICAgIHBjdF9vdGhlciA9IHBhc3RlMChyb3VuZChtZWFuKG90aGVyX3JhY2UgPT0gMSwgbmEucm0gPSBUUlVFKSAqIDEwMCksICIlIikpCgpzZV9yYWNlIDwtIHNlbGZfZW1wbG95ZWRfY3BzICU+JSAgCiAgZ3JvdXBfYnkod3Jrcl9jbGFzc19sYWJlbCkgJT4lICAKICBzdW1tYXJpemUoCiAgICBwY3Rfd2hpdGUgPSBwYXN0ZTAocm91bmQobWVhbih3aGl0ZV9hbG9uZSA9PSAxLCBuYS5ybSA9IFRSVUUpICogMTAwKSwgIiUiKSwKICAgIHBjdF9ibGFjayA9IHBhc3RlMChyb3VuZChtZWFuKGJsYWNrX2Fsb25lID09IDEsIG5hLnJtID0gVFJVRSkgKiAxMDApLCAiJSIpLAogICAgcGN0X2FzaWFuID0gcGFzdGUwKHJvdW5kKG1lYW4oYXNpYW5fYWxvbmUgPT0gMSwgbmEucm0gPSBUUlVFKSAqIDEwMCksICIlIiksCiAgICBwY3RfaGlzcGFuaWMgPSBwYXN0ZTAocm91bmQobWVhbihoaXNwYW5pYyA9PSAxLCBuYS5ybSA9IFRSVUUpICogMTAwKSwgIiUiKSwKICAgIHBjdF9oYXdhaWlhbl9waSA9IHBhc3RlMChyb3VuZChtZWFuKGhhd2FpaWFuX3BhY2lmaWNfaXNsYW5kZXJfYWxvbmUgPT0gMSwgbmEucm0gPSBUUlVFKSAqIDEwMCksICIlIiksCiAgICBwY3RfbmF0aXZlX2FtID0gcGFzdGUwKHJvdW5kKG1lYW4oYW1lcmljYW5faW5kaWFuX2Fsb25lID09IDEsIG5hLnJtID0gVFJVRSkgKiAxMDApLCAiJSIpLAogICAgcGN0X290aGVyID0gcGFzdGUwKHJvdW5kKG1lYW4ob3RoZXJfcmFjZSA9PSAxLCBuYS5ybSA9IFRSVUUpICogMTAwKSwgIiUiKSkKCnNlX3JhY2UgPC0gYmluZF9yb3dzKHRvdGFsX3JhY2UsIHNlX3JhY2UpCgpkYXRhdGFibGUoCiAgc2VfcmFjZSwKICBjb2xuYW1lcyA9IGMoCiAgICAiV29ya2VyIENsYXNzaWZpY2F0aW9uIiwgIldoaXRlIiwgIkJsYWNrIiwgIkFzaWFuIiwgIkhpc3BhbmljIiwKICAgICJIYXdhaWlhbi9QSSIsICJOYXRpdmUgQW1lcmljYW4iLCAiT3RoZXIiKSwKICBvcHRpb25zID0gbGlzdCgKICAgIHBhZ2luZyA9IEZBTFNFLCAgICAgICAgIAogICAgc2VhcmNoaW5nID0gRkFMU0UsICAgICAgCiAgICBpbmZvID0gRkFMU0UsICAgICAgICAgICAKICAgIGxlbmd0aENoYW5nZSA9IEZBTFNFLCAgIAogICAgZG9tID0gJ3QnKSwKICBlc2NhcGUgPSBGQUxTRSwgCiAgcm93bmFtZXMgPSBGQUxTRSkKCmBgYAo8YnI+Cjxicj4KCiMjIEZpbmFuY2lhbCBTZWN1cml0eQoKPGJyPgoKVGhlIGRpZmZlcmVuY2VzIGJldHdlZW4gdGhlIGluY29ycG9yYXRlZCBzZWxmLWVtcGxveWVkIGFuZCB1bmluY29ycG9yYXRlZCBzZWxmLWVtcGxveWVkIGJlY29tZSBldmVuIG1vcmUgYXBwYXJlbnQgd2hlbiBleGFtaW5pbmcgaW5kaWNhdG9ycyBvZiBmaW5hbmNpYWwgc2VjdXJpdHksIHN1Y2ggYXMgaG91c2Vob2xkIGluY29tZSwgcGVyc29uYWwgaW5jb21lLCBwb3ZlcnR5IHJhdGVzLCBhbmQgYWNjZXNzIHRvIHNvY2lhbCBwcm90ZWN0aW9ucy4gCgo8YnI+CgpgYGB7ciBmaW5hbmNpYWwgc2VjdXJpdHksIGVjaG89RkFMU0V9Cgp0b3RhbF9maW5hbmNpYWxfc2VjdXJpdHkgPC0gc2VsZl9lbXBsb3llZF9jcHMgJT4lCiAgc3VtbWFyaXplKAogICAgd3Jrcl9jbGFzc19sYWJlbCA9ICJUb3RhbCIsICAKICAgIG1lZF9oaGkgPSBkb2xsYXIobWVkaWFuKGhoaSwgbmEucm0gPSBUUlVFKSksCiAgICBtZWRfaW5jb21lID0gZG9sbGFyKG1lZGlhbih0b3RfaW5jb21lLCBuYS5ybSA9IFRSVUUpKSwKICAgIGNvdW50ID0gbigpLAogICAgcGN0X2JlbG93X3BvdmVydHkgPSBwZXJjZW50KHN1bShwb3ZlcnR5ID09IDEsIG5hLnJtID0gVFJVRSkgLyBjb3VudCwgYWNjdXJhY3kgPSAxKSwKICAgIHBjdF9oaV9jb3YgPSBwZXJjZW50KHN1bShoaV9jb3YgPT0gMSwgbmEucm0gPSBUUlVFKSAvIGNvdW50LCBhY2N1cmFjeSA9IDEpLAogICAgcGN0X3JldF9jb250ID0gcGVyY2VudChzdW0ocmV0X2NvbnQgPiAwLCBuYS5ybSA9IFRSVUUpIC8gY291bnQsIGFjY3VyYWN5ID0gMSksCiAgICBwY3RfdW5lbXAgPSBwZXJjZW50KHN1bSh1bmVtcCA9PSAxLCBuYS5ybSA9IFRSVUUpIC8gY291bnQsIGFjY3VyYWN5ID0gLjAxKSwKICAgIHBjdF9wdWJfYXNzaXN0ID0gcGVyY2VudChzdW0ocHVibGljX2Fzc2lzdCA9PSAxLCBuYS5ybSA9IFRSVUUpIC8gY291bnQsIGFjY3VyYWN5ID0gLjAxKSkgJT4lCiAgc2VsZWN0KC1jb3VudCkKCnNlX2ZpbmFuY2lhbF9zZWN1cml0eSA8LSBzZWxmX2VtcGxveWVkX2NwcyAlPiUKICBncm91cF9ieSh3cmtyX2NsYXNzX2xhYmVsKSAlPiUKICBzdW1tYXJpemUoCiAgICBjb3VudCA9IG4oKSwKICAgIG1lZF9oaGkgPSBkb2xsYXIobWVkaWFuKGhoaSwgbmEucm0gPSBUUlVFKSksCiAgICBtZWRfaW5jb21lID0gZG9sbGFyKG1lZGlhbih0b3RfaW5jb21lLCBuYS5ybSA9IFRSVUUpKSwKICAgIHBjdF9iZWxvd19wb3ZlcnR5ID0gcGVyY2VudChzdW0ocG92ZXJ0eSA9PSAxLCBuYS5ybSA9IFRSVUUpIC8gY291bnQsIGFjY3VyYWN5ID0gMSksCiAgICBwY3RfaGlfY292ID0gcGVyY2VudChzdW0oaGlfY292ID09IDEsIG5hLnJtID0gVFJVRSkgLyBjb3VudCwgYWNjdXJhY3kgPSAxKSwKICAgIHBjdF9yZXRfY29udCA9IHBlcmNlbnQoc3VtKHJldF9jb250ID4gMCwgbmEucm0gPSBUUlVFKSAvIGNvdW50LCBhY2N1cmFjeSA9IDEpLAogICAgcGN0X3VuZW1wID0gcGVyY2VudChzdW0odW5lbXAgPT0gMSwgbmEucm0gPSBUUlVFKSAvIGNvdW50LCBhY2N1cmFjeSA9IC4wMSksCiAgICBwY3RfcHViX2Fzc2lzdCA9IHBlcmNlbnQoc3VtKHB1YmxpY19hc3Npc3QgPT0gMSwgbmEucm0gPSBUUlVFKSAvIGNvdW50LCBhY2N1cmFjeSA9IC4wMSksCiAgICAuZ3JvdXBzID0gImRyb3AiKSAlPiUKICBzZWxlY3QoLWNvdW50KQoKc2VfZmluYW5jaWFsX3NlY3VyaXR5IDwtIGJpbmRfcm93cyh0b3RhbF9maW5hbmNpYWxfc2VjdXJpdHksIHNlX2ZpbmFuY2lhbF9zZWN1cml0eSkKCmRhdGF0YWJsZSgKICBzZV9maW5hbmNpYWxfc2VjdXJpdHksCiAgY29sbmFtZXMgPSBjKAogICAgIldvcmtlciBDbGFzc2lmaWNhdGlvbiIsICJNZWRpYW4gSEggSW5jb21lIiwgIk1lZGlhbiBQZXJzb25hbCBJbmNvbWUiLCAiQmVsb3cgUG92ZXJ0eSIsCiAgICAiSGVhbHRoIEluc3VyYW5jZSBDb3ZlcmFnZSIsICJSZXRpcmVtZW50IENvbnRyaWJ1dGlvbiBMYXN0IFllYXIiLCAiVW5lbXBsb3ltZW50IENvbXAiLCAiT24gUHVibGljIEFzc2lzdGFuY2UiKSwKICBvcHRpb25zID0gbGlzdCgKICAgIHBhZ2luZyA9IEZBTFNFLAogICAgc2VhcmNoaW5nID0gRkFMU0UsCiAgICBpbmZvID0gRkFMU0UsCiAgICBsZW5ndGhDaGFuZ2UgPSBGQUxTRSwKICAgIGRvbSA9ICd0JyksCiAgZXNjYXBlID0gRkFMU0UsCiAgcm93bmFtZXMgPSBGQUxTRSkKCmBgYAoKPGJyPgoKIyMjIEluY29tZQoKPGJyPgoKTWVkaWFuIHBlcnNvbmFsIGFuZCBob3VzZWhvbGQgaW5jb21lIGZvciB1bmluY29ycG9yYXRlZCBzZWxmLWVtcGxveWVkIHdvcmtlcnMgYXJlIGJvdGggc2lnbmlmaWNhbnRseSBsb3dlciB0aGFuIG1lZGlhbiBpbmNvbWVzIGZvciB0aGUgd29ya2ZvcmNlIGFzIGEgd2hvbGUsIHdpdGggdW5pbmNvcnBvcmF0ZWQgc2VsZi1lbXBsb3llZCB3b3JrZXJzIGVhcm5pbmcgYW4gYXZlcmFnZSBvZiAkNDEsMzUwL3llYXIsIGNvbXBhcmVkIHdpdGggdGhlIG5hdGlvbmFsIGF2ZXJhZ2Ugb2YgJDUyLDM0MC4gCgpNZWFud2hpbGUsIHRoZSBpbmNvcnBvcmF0ZWQgc2VsZi1lbXBsb3llZCBlYXJuIG11Y2ggbW9yZSB0aGFuIHRoZSBhdmVyYWdlIHdvcmtlciwgd2l0aCBhIG1lZGlhbiBwZXJzb25hbCBpbmNvbWUgb2YgJDc1LDMzNiwgaGlnaGVyIHRoYW4gYW55IG90aGVyIHdvcmtlciBjbGFzcy4gCgpJdCdzIHBlcmhhcHMgdW5zdXJwcmlzaW5nLCB0aGVuLCB0aGF0IHRoZSB1bmluY29ycG9yYXRlZCBzZWxmLWVtcGxveWVkIHdvdWxkIGJlIHR3aWNlIGFzIGxpa2VseSBhcyB0aGUgdG90YWwgd29ya2ZvcmNlIHRvIGxpdmUgYmVsb3cgdGhlIHBvdmVydHkgbGluZSAoMTAlIHZzLiA1JSksIHdoaWxlIGZld2VyIGluY29ycG9yYXRlZCBzZWxmLWVtcGxveWVkIHdvcmtlcnMgKDMlKSBoYXZlIHBlcnNvbmFsIGluY29tZSBiZWxvdyB0aGUgcG92ZXJ0eSBsaW5lLgoKPGJyPgoKYGBge3IgcGVyc29uYWwgaW5jb21lLCBlY2hvPUZBTFNFfQoKdG90YWxfaW5jb21lX2RhdGEgPC0gc2VsZl9lbXBsb3llZF9jcHMgJT4lCiAgc3VtbWFyaXplKAogICAgd3Jrcl9jbGFzc19sYWJlbCA9ICJUb3RhbCIsCiAgICBtZWRpYW5faW5jb21lID0gbWVkaWFuKHRvdF9pbmNvbWUsIG5hLnJtID0gVFJVRSkpCgppbmNvbWVfYnlfY2xhc3MgPC0gc2VsZl9lbXBsb3llZF9jcHMgJT4lCiAgZ3JvdXBfYnkod3Jrcl9jbGFzc19sYWJlbCkgJT4lCiAgc3VtbWFyaXplKAogICAgbWVkaWFuX2luY29tZSA9IG1lZGlhbih0b3RfaW5jb21lLCBuYS5ybSA9IFRSVUUpLAogICAgLmdyb3VwcyA9ICJkcm9wIikKCmluY29tZV9ieV9jbGFzcyA8LSBiaW5kX3Jvd3ModG90YWxfaW5jb21lX2RhdGEsIGluY29tZV9ieV9jbGFzcykKCmluY29tZV9ieV9jbGFzcyR3cmtyX2NsYXNzX2xhYmVsIDwtIGZhY3RvcihpbmNvbWVfYnlfY2xhc3Mkd3Jrcl9jbGFzc19sYWJlbCwgbGV2ZWxzID0gYygiVG90YWwiLCB1bmlxdWUoaW5jb21lX2J5X2NsYXNzJHdya3JfY2xhc3NfbGFiZWwpW3VuaXF1ZShpbmNvbWVfYnlfY2xhc3Mkd3Jrcl9jbGFzc19sYWJlbCkgIT0gIlRvdGFsIl0pKQoKaW5jb21lX3Bsb3QgPC0gZ2dwbG90KGluY29tZV9ieV9jbGFzcywgYWVzKHggPSB3cmtyX2NsYXNzX2xhYmVsLCB5ID0gbWVkaWFuX2luY29tZSwgdGV4dCA9IHBhc3RlMCgiTWVkaWFuIEluY29tZTogIiwgc2NhbGVzOjpkb2xsYXJfZm9ybWF0KGFjY3VyYWN5ID0gMSkobWVkaWFuX2luY29tZSkpKSkgKwogIGdlb21fYmFyKHN0YXQgPSAiaWRlbnRpdHkiLCBhZXMoZmlsbCA9IGlmZWxzZSh3cmtyX2NsYXNzX2xhYmVsID09ICJUb3RhbCIsICJUb3RhbCIsICJXb3JrZXIgQ2xhc3MiKSkpICsKICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSB0b3RhbF9pbmNvbWVfZGF0YSRtZWRpYW5faW5jb21lLCBsaW5ldHlwZSA9ICJkb3R0ZWQiLCBjb2xvciA9ICJncmV5IiwgbGluZXdpZHRoID0gMC41KSArCiAgbGFicygKICAgIHRpdGxlID0gIk1lZGlhbiBQZXJzb25hbCBJbmNvbWUgYnkgV29ya2VyIENsYXNzaWZpY2F0aW9uIiwKICAgIHggPSAiIiwKICAgIHkgPSAiIgogICkgKwogIHNjYWxlX3lfY29udGludW91cyhsYWJlbHMgPSBzY2FsZXM6OmRvbGxhcl9mb3JtYXQoYWNjdXJhY3kgPSAxKSkgKwogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IGMoIlRvdGFsIiA9ICIjZGRjMDU3IiwgIldvcmtlciBDbGFzcyIgPSAiI2FiMWQ3OSIpKSArCiAgdGhlbWVfbWluaW1hbCgpICsKICB0aGVtZSgKICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNDUsIGhqdXN0ID0gMSksCiAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNiwgZmFjZSA9ICJwbGFpbiIpLAogICAgbGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKQoKaW50ZXJhY3RpdmVfaW5jb21lX3Bsb3QgPC0gZ2dwbG90bHkoaW5jb21lX3Bsb3QsIHRvb2x0aXAgPSAidGV4dCIpCgppbnRlcmFjdGl2ZV9pbmNvbWVfcGxvdAoKYGBgCgo8YnI+CgojIyMgU29jaWFsIFByb3RlY3Rpb25zCgo8YnI+CgpGaW5hbmNpYWwgc2VjdXJpdHkgZXh0ZW5kcyBiZXlvbmQgaW5jb21lLCBpbmNsdWRpbmcgYWNjZXNzIHRvIHNvY2lhbCBwcm90ZWN0aW9ucy4gV2hpbGUgdGhlIGluY29ycG9yYXRlZCBzZWxmLWVtcGxveWVkIGhhdmUgaGVhbHRoIGluc3VyYW5jZSBhdCBuZWFybHkgdGhlIHNhbWUgcmF0ZXMgYXMgdGhlIHRvdGFsIHdvcmtmb3JjZSAoOTAlIHZzLiA5MSUpLCB0aGUgdW5pbmNvcnBvcmF0ZWQgc2VsZi1lbXBsb3llZCBleHBlcmllbmNlIGxvd2VyIGxldmVscyBvZiBoZWFsdGggaW5zdXJhbmNlIGNvdmVyYWdlIHRoYW4gYW55IG90aGVyIHdvcmtlciBncm91cCwgYXQgODQlIGNvdmVyYWdlLiBJdCdzIHVuc3VycHJpc2luZyB0aGF0IHRoZSBzZWxmLWVtcGxveWVkIGFyZSBsZXNzIGxpa2VseSB0byBoYXZlIGhlYWx0aCBpbnN1cmFuY2UgY292ZXJhZ2UsIGdpdmVuIHRoZSBlbXBsb3llci1iYXNlZCBoZWFsdGggaW5zdXJhbmNlIHN5c3RlbSB0aGF0IGRvbWluYXRlcyB0aGUgVW5pdGVkIFN0YXRlcy4gIAoKVGhlIHVuaW5jb3Jwb3JhdGVkIHNlbGYtZW1wbG95ZWQgYXJlIGFsc28gZmFyIGxlc3MgbGlrZWx5IHRvIGNvbnRyaWJ1dGUgdG8gYSByZXRpcmVtZW50IHNhdmluZ3MgYWNjb3VudC4gT25seSAxMiUgb2YgdW5pbmNvcnBvcmF0ZWQgc2VsZi1lbXBsb3llZCB3b3JrZXJzIGNvbnRyaWJ1dGVkIHRvIGEgcmV0aXJlbWVudCBzYXZpbmdzIGFjY291bnQgbGFzdCB5ZWFyLCBjb21wYXJlZCB0byAzNSUgb2YgdGhlIHRvdGFsIHdvcmtmb3JjZS4gVGhlIGluY29ycG9yYXRlZCBzZWxmLWVtcGxveWVkIGFsc28gY29udHJpYnV0ZWQgYXQgbG93ZXIgcmF0ZXMgKDI4JSksIGJ1dCBub3QgbmVhcmx5IGFzIGxvdyBhcyB0aGUgdW5pbmNvcnBvcmF0ZWQgc2VsZi1lbXBsb3llZC4gQWdhaW4sIGdpdmVuIHRoYXQgZW1wbG95bWVudC1iYXNlZCBiZW5lZml0cyBhcmUgdGhlIG5vcm0gaW4gdGhlIFVuaXRlZCBTdGF0ZXMsIGFuZCB0aGF0IHRoZSBzZWxmLWVtcGxveWVkIGxhY2sgYWNjZXNzIHRvIGluZnJhc3RydWN0dXJlIG9mIGF1dG9tYXRpYyBlbnJvbGxtZW50IGFuZCBjb250cmlidXRpb25zIHRocm91Z2ggcGF5cm9sbCwgdGhpcyBkaWZmZXJlbmNlIGluIHJldGlyZW1lbnQgc2F2aW5ncyBhY3Rpdml0eSBiZXR3ZWVuIHNlbGYtZW1wbG95ZWQgYW5kIGVtcGxveWVkIHdvcmtlcnMgaXMgdW5kZXJzdGFuZGFibGUuCgo8YnI+CgpgYGB7ciBoZWFsdGggYW5kIHJldGlyZW1lbnQsIGVjaG89RkFMU0V9CgpzZV9oZWFsdGhfcmV0aXJlbWVudCA8LSBzZWxmX2VtcGxveWVkX2NwcyAlPiUKICBncm91cF9ieSh3cmtyX2NsYXNzX2xhYmVsKSAlPiUKICBzdW1tYXJpemUoCiAgICBwY3RfaGlfY292ID0gbWVhbihoaV9jb3YgPT0gMSwgbmEucm0gPSBUUlVFKSwKICAgIHBjdF9yZXRfY29udCA9IG1lYW4ocmV0X2NvbnQgPiAwLCBuYS5ybSA9IFRSVUUpKSAlPiUKICBwaXZvdF9sb25nZXIoY29scyA9IGMocGN0X2hpX2NvdiwgcGN0X3JldF9jb250KSwKICAgICAgICAgICAgICAgbmFtZXNfdG8gPSAiY292ZXJhZ2VfdHlwZSIsCiAgICAgICAgICAgICAgIHZhbHVlc190byA9ICJwZXJjZW50YWdlIikgJT4lCiAgYmluZF9yb3dzKAogICAgc2VsZl9lbXBsb3llZF9jcHMgJT4lCiAgICAgIHN1bW1hcml6ZSgKICAgICAgICB3cmtyX2NsYXNzX2xhYmVsID0gIlRvdGFsIiwKICAgICAgICBwY3RfaGlfY292ID0gbWVhbihoaV9jb3YgPT0gMSwgbmEucm0gPSBUUlVFKSwKICAgICAgICBwY3RfcmV0X2NvbnQgPSBtZWFuKHJldF9jb250ID4gMCwgbmEucm0gPSBUUlVFKSkgJT4lCiAgICAgIHBpdm90X2xvbmdlcihjb2xzID0gYyhwY3RfaGlfY292LCBwY3RfcmV0X2NvbnQpLAogICAgICAgICAgICAgICAgICAgbmFtZXNfdG8gPSAiY292ZXJhZ2VfdHlwZSIsCiAgICAgICAgICAgICAgICAgICB2YWx1ZXNfdG8gPSAicGVyY2VudGFnZSIpKQoKc2VfaGVhbHRoX3JldGlyZW1lbnQgPC0gc2VfaGVhbHRoX3JldGlyZW1lbnQgJT4lCiAgbXV0YXRlKAogICAgY292ZXJhZ2VfdHlwZSA9IHJlY29kZShjb3ZlcmFnZV90eXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAicGN0X2hpX2NvdiIgPSAiSGVhbHRoIENvdmVyYWdlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgInBjdF9yZXRfY29udCIgPSAiUmV0aXJlbWVudCBDb250cmlidXRpb24iKSwKICAgIHRvb2x0aXAgPSBwYXN0ZShjb3ZlcmFnZV90eXBlLCAiOiAiLCByb3VuZChwZXJjZW50YWdlICogMTAwLCAxKSwgIiUiKSkKCnNlX2hlYWx0aF9yZXRpcmVtZW50JHdya3JfY2xhc3NfbGFiZWwgPC0gZmFjdG9yKAogIHNlX2hlYWx0aF9yZXRpcmVtZW50JHdya3JfY2xhc3NfbGFiZWwsCiAgbGV2ZWxzID0gYygiVG90YWwiLCBzZXRkaWZmKHVuaXF1ZShzZV9oZWFsdGhfcmV0aXJlbWVudCR3cmtyX2NsYXNzX2xhYmVsKSwgIlRvdGFsIikpKQoKdG90YWxfaGVhbHRoX2NvdmVyYWdlIDwtIHNlbGZfZW1wbG95ZWRfY3BzICU+JQogIHN1bW1hcml6ZSgKICAgIHBjdF9oaV9jb3YgPSBtZWFuKGhpX2NvdiA9PSAxLCBuYS5ybSA9IFRSVUUpLAogICAgcGN0X3JldF9jb250ID0gbWVhbihyZXRfY29udCA+IDAsIG5hLnJtID0gVFJVRSkpCgpwIDwtIGdncGxvdChzZV9oZWFsdGhfcmV0aXJlbWVudCwgYWVzKHggPSB3cmtyX2NsYXNzX2xhYmVsLCB5ID0gcGVyY2VudGFnZSAqIDEwMCwgZmlsbCA9IGNvdmVyYWdlX3R5cGUsIHRleHQgPSB0b29sdGlwKSkgKwogIGdlb21fYmFyKHN0YXQgPSAiaWRlbnRpdHkiLCBwb3NpdGlvbiA9ICJkb2RnZSIpICsKICBnZW9tX2hsaW5lKGRhdGEgPSB0b3RhbF9oZWFsdGhfY292ZXJhZ2UsIGFlcyh5aW50ZXJjZXB0ID0gcGN0X2hpX2NvdiAqIDEwMCksIGxpbmV0eXBlID0gImRvdHRlZCIsIGNvbG9yID0gImdyZXkiLCBsaW5ld2lkdGggPSAwLjUpICsKICBnZW9tX2hsaW5lKGRhdGEgPSB0b3RhbF9oZWFsdGhfY292ZXJhZ2UsIGFlcyh5aW50ZXJjZXB0ID0gcGN0X3JldF9jb250ICogMTAwKSwgbGluZXR5cGUgPSAiZG90dGVkIiwgY29sb3IgPSAiZ3JleSIsIGxpbmV3aWR0aCA9IDAuNSkgKwogIGxhYnMoCiAgICB0aXRsZSA9ICJTb2NpYWwgUHJvdGVjdGlvbnMgYnkgV29ya2VyIENsYXNzaWZpY2F0aW9uIiwKICAgIHggPSAiIiwKICAgIHkgPSAiIiwKICAgIGZpbGwgPSAiIgogICkgKwogIHNjYWxlX3lfY29udGludW91cyhsYWJlbHMgPSBzY2FsZXM6OnBlcmNlbnRfZm9ybWF0KHNjYWxlID0gMSkpICsKICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBjKCJIZWFsdGggQ292ZXJhZ2UiID0gIiM0NDg1YWYiLCAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJSZXRpcmVtZW50IENvbnRyaWJ1dGlvbiIgPSAiI2RkODEyYiIpLCAKICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBjKCJIZWFsdGggQ292ZXJhZ2UiLCAiUmV0aXJlbWVudCBDb250cmlidXRpb24iKSkgKyAgCiAgdGhlbWVfbWluaW1hbCgpICsKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LCBoanVzdCA9IDEpLCBsZWdlbmQucG9zaXRpb24gPSAicmlnaHQiKSAgCgpnZ3Bsb3RseShwLCB0b29sdGlwID0gInRleHQiKQoKYGBgCgo8YnI+CgojIyMgSGVhbHRoIENvdmVyYWdlCgo8YnI+CgpBbW9uZyB0aGUgc2VsZi1lbXBsb3llZCB3aG8gZG8gaGF2ZSBoZWFsdGggaW5zdXJhbmNlLCB0aGUgc291cmNlIG9mIHRoYXQgY292ZXJhZ2UgZGlmZmVycyBtZWFuaW5nZnVsbHkgZnJvbSBlbXBsb3llZCB3b3JrZXJzLiBVbmluY29ycG9yYXRlZCAgYW5kIGluY29ycG9yYXRlZCBzZWxmLWVtcGxveWVkIHdvcmtlcnMgYXJlIG1vcmUgbGlrZWx5IHRoYW4gZW1wbG95ZWVzIHRvIGhhdmUgcHVibGljIGNvdmVyYWdlICgzMiUgYW5kIDIzJSB2cy4gMTglKSBvciBwcml2YXRlIGNvdmVyYWdlICgzOCUgYW5kIDI0JSB2cy4gMjIlKSwgYW5kIG11Y2ggbGVzcyBsaWtlbHkgdG8gaGF2ZSBlbXBsb3llci1wcm92aWRlZCBjb3ZlcmFnZSAoMzklIGFuZCA1MSUgdnMuIDY5JSkuIAoKVGhlIHVuaW5jb3Jwb3JhdGVkIHNlbGYtZW1wbG95ZWQgYXJlIGZhciBtb3JlIGxpa2VseSB0byByZWx5IG9uIHB1YmxpYyBvciBwcml2YXRlIGNvdmVyYWdlIHRoYW4gaW5jb3Jwb3JhdGVkIHNlbGYtZW1wbG95ZWQgd29ya2Vycywgd2hvIGFjY2VzcyBlbXBsb3llci1wcm92aWRlZCBjb3ZlcmFnZSBhdCBoaWdoZXIgcmF0ZXMsIHBvdGVudGlhbGx5IHRocm91Z2ggYSBwYXJ0bmVyIG9yIG90aGVyIGZhbWlseSBtZW1iZXIuIFVuaW5jb3Jwb3JhdGVkIHNlbGYtZW1wbG95ZWQgd29ya2VycyBhbHNvIHJlY2VpdmUgTWVkaWNhaWQgYXQgaGlnaGVyIHJhdGVzIG9mIDE2JSwgY29tcGFyZWQgdG8gMTElIG9mIHRvdGFsIHdvcmtlcnMgYW5kIDklIG9mIHRoZSBpbmNvcnBvcmF0ZWQgc2VsZi1lbXBsb3llZC4gIAoKPGJyPgoKYGBge3IgaGVhbHRoIGluc3VyYW5jZSwgZWNobz1GQUxTRX0KCnRvdGFsX2hlYWx0aF9pbnN1cmFuY2UgPC0gc2VsZl9lbXBsb3llZF9jcHMgJT4lCiAgc3VtbWFyaXplKAogICAgd3Jrcl9jbGFzc19sYWJlbCA9ICJUb3RhbCIsCiAgICBjb3VudCA9IG4oKSwKICAgIHBjdF9oaV9jb3YgPSBwYXN0ZTAocm91bmQobWVhbihoaV9jb3YgPT0gMSwgbmEucm0gPSBUUlVFKSAqIDEwMCksICIlIiksCiAgICBwY3RfcHViX2NvdiA9IHBhc3RlMChyb3VuZChtZWFuKHB1Yl9jb3YgPT0gMSwgbmEucm0gPSBUUlVFKSAqIDEwMCksICIlIiksCiAgICBwY3RfcHJpX2NvdiA9IHBhc3RlMChyb3VuZChtZWFuKHByaV9jb3YgPT0gMSwgbmEucm0gPSBUUlVFKSAqIDEwMCksICIlIiksCiAgICBwY3RfZW1wbF9jb3YgPSBwYXN0ZTAocm91bmQobWVhbihlbXBsX2NvdiA9PSAxLCBuYS5ybSA9IFRSVUUpICogMTAwKSwgIiUiKSwKICAgIHBjdF9kaXJfY292ID0gcGFzdGUwKHJvdW5kKG1lYW4oZGlyX2NvdiA9PSAxLCBuYS5ybSA9IFRSVUUpICogMTAwKSwgIiUiKSwKICAgIHBjdF9tdGtwX2NvdiA9IHBhc3RlMChyb3VuZChtZWFuKG10a3BfY292ID09IDEsIG5hLnJtID0gVFJVRSkgKiAxMDApLCAiJSIpLAogICAgcGN0X21lZGljYWlkX2NvdiA9IHBhc3RlMChyb3VuZChtZWFuKG1lZGljYWlkID09IDEsIG5hLnJtID0gVFJVRSkgKiAxMDApLCAiJSIpKQoKc2VfaGVhbHRoX2luc3VyYW5jZSA8LSBzZWxmX2VtcGxveWVkX2NwcyAlPiUKICBncm91cF9ieSh3cmtyX2NsYXNzX2xhYmVsKSAlPiUKICBzdW1tYXJpemUoCiAgICBjb3VudCA9IG4oKSwKICAgIHBjdF9oaV9jb3YgPSBwYXN0ZTAocm91bmQobWVhbihoaV9jb3YgPT0gMSwgbmEucm0gPSBUUlVFKSAqIDEwMCksICIlIiksCiAgICBwY3RfcHViX2NvdiA9IHBhc3RlMChyb3VuZChtZWFuKHB1Yl9jb3YgPT0gMSwgbmEucm0gPSBUUlVFKSAqIDEwMCksICIlIiksCiAgICBwY3RfcHJpX2NvdiA9IHBhc3RlMChyb3VuZChtZWFuKHByaV9jb3YgPT0gMSwgbmEucm0gPSBUUlVFKSAqIDEwMCksICIlIiksCiAgICBwY3RfZW1wbF9jb3YgPSBwYXN0ZTAocm91bmQobWVhbihlbXBsX2NvdiA9PSAxLCBuYS5ybSA9IFRSVUUpICogMTAwKSwgIiUiKSwKICAgIHBjdF9kaXJfY292ID0gcGFzdGUwKHJvdW5kKG1lYW4oZGlyX2NvdiA9PSAxLCBuYS5ybSA9IFRSVUUpICogMTAwKSwgIiUiKSwKICAgIHBjdF9tdGtwX2NvdiA9IHBhc3RlMChyb3VuZChtZWFuKG10a3BfY292ID09IDEsIG5hLnJtID0gVFJVRSkgKiAxMDApLCAiJSIpLAogICAgcGN0X21lZGljYWlkX2NvdiA9IHBhc3RlMChyb3VuZChtZWFuKG1lZGljYWlkID09IDEsIG5hLnJtID0gVFJVRSkgKiAxMDApLCAiJSIpKQoKc2VfaGVhbHRoX2luc3VyYW5jZSA8LSBiaW5kX3Jvd3ModG90YWxfaGVhbHRoX2luc3VyYW5jZSwgc2VfaGVhbHRoX2luc3VyYW5jZSkKCnNlX2hlYWx0aF9pbnN1cmFuY2UgPC0gc2VfaGVhbHRoX2luc3VyYW5jZSAlPiUKICBzZWxlY3QoLWNvdW50KQoKZGF0YXRhYmxlKAogIHNlX2hlYWx0aF9pbnN1cmFuY2UsCiAgY29sbmFtZXMgPSBjKAogICAgIldvcmtlciBDbGFzc2lmaWNhdGlvbiIsICJIZWFsdGggSW5zdXJhbmNlIiwgIlB1YmxpYyIsICJQcml2YXRlIiwKICAgICJFbXBsb3llciIsICJEaXJlY3QiLCAiTWFya2V0cGxhY2UiLCAiTWVkaWNhaWQiKSwKICBvcHRpb25zID0gbGlzdCgKICAgIHBhZ2luZyA9IEZBTFNFLAogICAgc2VhcmNoaW5nID0gRkFMU0UsCiAgICBpbmZvID0gRkFMU0UsCiAgICBsZW5ndGhDaGFuZ2UgPSBGQUxTRSwKICAgIGRvbSA9ICd0JyksCiAgZXNjYXBlID0gRkFMU0UsCiAgcm93bmFtZXMgPSBGQUxTRSkKCmBgYAoKPGJyPgoKIyMgQXJ0cyAmIERlc2lnbiBXb3JrZXJzCgo8YnI+CgpPdmVyYWxsLCB0aGUgZGF0YSBkZW1vbnN0cmF0ZXMgdGhhdCB1bmluY29ycG9yYXRlZCBzZWxmLWVtcGxveWVkIHdvcmtlcnMgaGF2ZSBsZXNzIGZpbmFuY2lhbCBzZWN1cml0eSwgYXMgbWVhc3VyZWQgYnkgYm90aCBpbmNvbWUgYW5kIGFjY2VzcyB0byBzb2NpYWwgcHJvdGVjdGlvbnMsIHRoYW4gZW1wbG95ZWQgd29ya2Vycy4gSG93ZXZlciwgdGhlc2UgZGlmZmVyZW5jZXMgbWlnaHQgYmUgdGhlIHJlc3VsdCBvZiBkaWZmZXJlbmNlcyBpbiBvY2N1cGF0aW9ucyBhbmQgaW5kdXN0cmllcyB3aGVyZSB0aGVzZSBpbmRpdmlkdWFscyB0ZW5kIHRvIHdvcmssIGFuZCBub3QgdGhlaXIgY2xhc3NpZmljYXRpb24uIAoKVG8gYmV0dGVyIHVuZGVyc3RhbmQgdGhlIGV4dGVudCB0byB3aGljaCB3b3JrZXIgY2xhc3NpZmljYXRpb24gZHJpdmVzIGZpbmFuY2lhbCBpbnNlY3VyaXR5LCB3ZSB0b29rIGEgY2xvc2VyIGxvb2sgYXQgYWxsIHdvcmtlcnMgaW4gQXJ0cyAmIERlc2lnbiBvY2N1cGF0aW9ucywgd2hpY2ggaXMgdGhlIG9jY3VwYXRpb24gY2F0ZWdvcnkgd2l0aCB0aGUgaGlnaGVzdCBwcm9wb3J0aW9uIG9mIHVuaW5jb3Jwb3JhdGVkIHNlbGYtZW1wbG95ZWQgd29ya2Vycy4KCldpdGhpbiBBcnRzIGFuZCBEZXNpZ24gb2NjdXBhdGlvbnMsIHNvbWUgZGVtb2dyYXBoaWMgZGlmZmVyZW5jZXMgYW1vbmcgd29ya2VyIGNsYXNzZXMsIGZvciBleGFtcGxlIGdlbmRlciBhbmQgYWdlLCBiZWNhbWUgbGVzcyBwcm9ub3VuY2VkLiBPdGhlciBkaWZmZXJlbmNlcywgc3VjaCBhcyBlZHVjYXRpb24gbGV2ZWwgYW5kIHVuaW9uaXphdGlvbiByYXRlcywgcGVyc2lzdGVkIHdpdGhpbiBBcnRzIGFuZCBEZXNpZ24gb2NjdXBhdGlvbnMuICAKCjxicj4KCiMjIyBEZW1vZ3JhcGhpY3MgaW4gdGhlIEFydHMKCmBgYHtyIERlbW9ncmFwaGljIGFydHMgdGFibGUsIGVjaG89RkFMU0V9Cgp0b3RhbF9hcnRzX2RlbW9zIDwtIHNlbGZfZW1wbG95ZWRfY3BzICU+JQogIGZpbHRlcihvY2N1cGF0aW9uID09IDkpICU+JSAKICBzdW1tYXJpemUoCiAgICB3cmtyX2NsYXNzX2xhYmVsID0gIlRvdGFsIEFydHMiLAogICAgcGN0X21hbGUgPSBwYXN0ZTAocm91bmQobWVhbihzZXggPT0gMSwgbmEucm0gPSBUUlVFKSAqIDEwMCksICIlIiksCiAgICBtZWRpYW5fYWdlID0gbWVkaWFuKGFnZSwgbmEucm0gPSBUUlVFKSwKICAgIHBjdF9jb2xsZWdlID0gcGFzdGUwKHJvdW5kKG1lYW4oY29sbGVnZSA9PSAxLCBuYS5ybSA9IFRSVUUpICogMTAwKSwgIiUiKSwKICAgIHVuaW9uX21lbSA9IHBhc3RlMChyb3VuZChtZWFuKHVuaW9uID09IDEsIG5hLnJtID0gVFJVRSkgKiAxMDApLCAiJSIpLAogICAgdXNfYm9ybl9yYXRlID0gcGFzdGUwKHJvdW5kKG1lYW4odXNfYm9ybiA9PSAxLCBuYS5ybSA9IFRSVUUpICogMTAwKSwgIiUiKSkKCnNlX2FydHNfZGVtb3MgPC0gc2VsZl9lbXBsb3llZF9jcHMgJT4lICAKICBmaWx0ZXIob2NjdXBhdGlvbiA9PSA5KSAlPiUKICBncm91cF9ieSh3cmtyX2NsYXNzX2xhYmVsKSAlPiUgIAogIHN1bW1hcml6ZSgKICAgIHBjdF9tYWxlID0gcGFzdGUwKHJvdW5kKG1lYW4oc2V4ID09IDEsIG5hLnJtID0gVFJVRSkgKiAxMDApLCAiJSIpLCAgICAKICAgIG1lZGlhbl9hZ2UgPSBtZWRpYW4oYWdlLCBuYS5ybSA9IFRSVUUpLAogICAgcGN0X2NvbGxlZ2UgPSBwYXN0ZTAocm91bmQobWVhbihjb2xsZWdlID09IDEsIG5hLnJtID0gVFJVRSkgKiAxMDApLCAiJSIpLAogICAgdW5pb25fbWVtID0gcGFzdGUwKHJvdW5kKG1lYW4odW5pb24gPT0gMSwgbmEucm0gPSBUUlVFKSAqIDEwMCksICIlIiksCiAgICB1c19ib3JuX3JhdGUgPSBwYXN0ZTAocm91bmQobWVhbih1c19ib3JuID09IDEsIG5hLnJtID0gVFJVRSkgKiAxMDApLCAiJSIpKQoKc2VfYXJ0c19kZW1vcyA8LSBiaW5kX3Jvd3ModG90YWxfYXJ0c19kZW1vcywgc2VfYXJ0c19kZW1vcykKCmRhdGF0YWJsZSgKICBzZV9hcnRzX2RlbW9zLAogIGNvbG5hbWVzID0gYygiV29ya2VyIENsYXNzaWZpY2F0aW9uIiwgIk1hbGUiLCAiTWVkaWFuIEFnZSIsICJDb2xsZWdlIEdyYWQiLCAiVW5pb24gTWVtYmVyIiwgIlVTIENpdGl6ZW4iKSwKICBvcHRpb25zID0gbGlzdCgKICAgIHBhZ2luZyA9IEZBTFNFLCAgICAgICAgIAogICAgc2VhcmNoaW5nID0gRkFMU0UsICAgICAgCiAgICBpbmZvID0gRkFMU0UsICAgICAgICAgICAKICAgIGxlbmd0aENoYW5nZSA9IEZBTFNFLCAgICAKICAgIGRvbSA9ICd0JyApLAogIGVzY2FwZSA9IEZBTFNFLCAKICByb3duYW1lcyA9IEZBTFNFKQoKYGBgCgo8YnI+CgpXaXRoaW4gQXJ0cyBhbmQgRGVzaWduIG9jY3VwYXRpb25zLCB0aGUgdW5pbmNvcnBvcmF0ZWQgc2VsZi1lbXBsb3llZCBhcmUgc3RpbGwgc2xpZ2h0bHkgbW9yZSBtYWxlIHRoYW4gYWxsIEFydHMgV29ya2VycyAoNTAlIHZzLiA0NyUpLCBidXQgdGhlIGRpZmZlcmVuY2VzIGFyZSBub3QgbmVhcmx5IGFzIGxhcmdlIGFtb25nIHdvcmtlciBjbGFzc2lmaWNhdGlvbnMuIE92ZXJhbGwsIEFydHMgV29ya2VycyBhcmUgc2xpZ2h0bHkgbGVzcyBtYWxlIHRoYW4gYWxsIHdvcmtlcnMsIG9mIHdob20gNTIlIGFyZSBtYWxlLiAKCjxicj4KCmBgYHtyIEFydHMgR2VuZGVyLCBlY2hvPUZBTFNFfQoKdG90YWxfYXJ0c19kZW1vcyA8LSBzZWxmX2VtcGxveWVkX2NwcyAlPiUKICBmaWx0ZXIob2NjdXBhdGlvbiA9PSA5KSAlPiUgCiAgc3VtbWFyaXplKAogICAgd3Jrcl9jbGFzc19sYWJlbCA9ICJUb3RhbCBBcnRzIiwKICAgIHBjdF9tYWxlID0gbWVhbihzZXggPT0gMSwgbmEucm0gPSBUUlVFKSAqIDEwMCwKICAgIHBjdF9mZW1hbGUgPSBtZWFuKHNleCA9PSAyLCBuYS5ybSA9IFRSVUUpICogMTAwKQoKc2VfYXJ0c19kZW1vcyA8LSBzZWxmX2VtcGxveWVkX2NwcyAlPiUgIAogIGZpbHRlcihvY2N1cGF0aW9uID09IDkpICU+JQogIGdyb3VwX2J5KHdya3JfY2xhc3NfbGFiZWwpICU+JSAgCiAgc3VtbWFyaXplKAogICAgcGN0X21hbGUgPSBtZWFuKHNleCA9PSAxLCBuYS5ybSA9IFRSVUUpICogMTAwLAogICAgcGN0X2ZlbWFsZSA9IG1lYW4oc2V4ID09IDIsIG5hLnJtID0gVFJVRSkgKiAxMDApCgpzZV9hcnRzX2RlbW9zIDwtIGJpbmRfcm93cyh0b3RhbF9hcnRzX2RlbW9zLCBzZV9hcnRzX2RlbW9zKQoKc2VfYXJ0c19kZW1vc19sb25nIDwtIHNlX2FydHNfZGVtb3MgJT4lCiAgcGl2b3RfbG9uZ2VyKAogICAgY29scyA9IGMocGN0X21hbGUsIHBjdF9mZW1hbGUpLAogICAgbmFtZXNfdG8gPSAiZ2VuZGVyIiwKICAgIHZhbHVlc190byA9ICJwZXJjZW50YWdlIikgJT4lCiAgbXV0YXRlKAogICAgZ2VuZGVyID0gcmVjb2RlKGdlbmRlciwgcGN0X21hbGUgPSAiTWFsZSIsIHBjdF9mZW1hbGUgPSAiRmVtYWxlIiksCiAgICB3cmtyX2NsYXNzX2xhYmVsID0gZmFjdG9yKAogICAgICB3cmtyX2NsYXNzX2xhYmVsLCAKICAgICAgbGV2ZWxzID0gYygKICAgICAgICAiVG90YWwgQXJ0cyIsIAogICAgICAgIHVuaXF1ZShzZV9hcnRzX2RlbW9zJHdya3JfY2xhc3NfbGFiZWxbc2VfYXJ0c19kZW1vcyR3cmtyX2NsYXNzX2xhYmVsICE9ICJUb3RhbCBBcnRzIl0pKSkpCgpnZW5kZXJfYXJ0c19wbG90IDwtIGdncGxvdChzZV9hcnRzX2RlbW9zX2xvbmcsIGFlcygKICB4ID0gd3Jrcl9jbGFzc19sYWJlbCwgCiAgeSA9IHBlcmNlbnRhZ2UsIAogIGZpbGwgPSBnZW5kZXIsIAogIHRleHQgPSBwYXN0ZTAoCiAgICAiV29ya2VyIENsYXNzaWZpY2F0aW9uOiAiLCB3cmtyX2NsYXNzX2xhYmVsLCAiPGJyPiIsCiAgICAiR2VuZGVyOiAiLCBnZW5kZXIsICI8YnI+IiwKICAgICJQZXJjZW50YWdlOiAiLCByb3VuZChwZXJjZW50YWdlLCAwKSwgIiUiKSkpICsKICBnZW9tX2JhcihzdGF0ID0gImlkZW50aXR5IiwgcG9zaXRpb24gPSAiZG9kZ2UiKSArCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gYygiTWFsZSIgPSAiI2RkYzA1NyIsICJGZW1hbGUiID0gIiM0NDg1YWYiKSkgKwogIGxhYnMoCiAgICB0aXRsZSA9ICJBcnRzIFdvcmtlcnM6IEdlbmRlciBieSBXb3JrZXIgQ2xhc3NpZmljYXRpb24iLAogICAgeCA9ICIiLAogICAgeSA9ICIiLAogICAgZmlsbCA9ICJHZW5kZXIiKSArCiAgc2NhbGVfeV9jb250aW51b3VzKGxhYmVscyA9IHNjYWxlczo6cGVyY2VudF9mb3JtYXQoc2NhbGUgPSAxKSkgKwogIHRoZW1lX21pbmltYWwoKSArCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA0NSwgaGp1c3QgPSAxKSkKCmludGVyYWN0aXZlX2dlbmRlcl9hcnRzX3Bsb3QgPC0gZ2dwbG90bHkoZ2VuZGVyX2FydHNfcGxvdCwgdG9vbHRpcCA9ICJ0ZXh0IikKCmludGVyYWN0aXZlX2dlbmRlcl9hcnRzX3Bsb3QKCmBgYAoKPGJyPgoKV2l0aGluIEFydHMgYW5kIERlc2lnbiBvY2N1cGF0aW9ucywgdGhlIGVkdWNhdGlvbiBnYXAgYmV0d2VlbiB1bmluY29ycG9yYXRlZCBzZWxmLWVtcGxveWVkIGluZGl2aWR1YWxzIGFuZCBlbXBsb3llZCBpbmRpdmlkdWFscyBwZXJzaXN0cy4gV2hpbGUgNTYuNCUgb2YgdW5pbmNvcnBvcmF0ZWQgc2VsZi1lbXBsb3llZCBpbmRpdmlkdWFscyBoYXZlIGEgY29sbGVnZSBkZWdyZWUsIDYyLjUlIG9mIGFsbCBBcnRzIGFuZCBEZXNpZ24gV29ya2VycyBjb21wbGV0ZWQgY29sbGVnZS4gT3ZlcmFsbCwgQXJ0cyBhbmQgRGVzaWduIHdvcmtlcnMgYXJlIG1vcmUgbGlrZWx5IHRvIGhhdmUgYSBjb2xsZWdlIGRlZ3JlZSB0aGFuIGFsbCB3b3JrZXJzLCBvZiB3aG9tIDM5LjclIGhhdmUgYSBjb2xsZWdlIGRlZ3JlZS4gCgo8YnI+CgpgYGB7ciBBcnRzIGNvbGxlZ2UsIGVjaG89RkFMU0V9Cgp0b3RhbF9hcnRzX2NvbGxlZ2UgPC0gc2VsZl9lbXBsb3llZF9jcHMgJT4lCiAgZmlsdGVyKG9jY3VwYXRpb24gPT0gOSkgJT4lIAogIHN1bW1hcml6ZSgKICAgIHdya3JfY2xhc3NfbGFiZWwgPSAiVG90YWwgQXJ0cyIsCiAgICBwY3RfY29sbGVnZSA9IG1lYW4oY29sbGVnZSA9PSAxLCBuYS5ybSA9IFRSVUUpICogMTAwKQoKc2VfYXJ0c19jb2xsZWdlIDwtIHNlbGZfZW1wbG95ZWRfY3BzICU+JQogIGZpbHRlcihvY2N1cGF0aW9uID09IDkpICU+JSAKICBncm91cF9ieSh3cmtyX2NsYXNzX2xhYmVsKSAlPiUKICBzdW1tYXJpemUoCiAgICBwY3RfY29sbGVnZSA9IG1lYW4oY29sbGVnZSA9PSAxLCBuYS5ybSA9IFRSVUUpICogMTAwKQoKY29sbGVnZV9hcnRzX2RhdGEgPC0gYmluZF9yb3dzKHRvdGFsX2FydHNfY29sbGVnZSwgc2VfYXJ0c19jb2xsZWdlKQoKY29sbGVnZV9hcnRzX2RhdGEgPC0gY29sbGVnZV9hcnRzX2RhdGEgJT4lCiAgbXV0YXRlKAogICAgd3Jrcl9jbGFzc19sYWJlbCA9IGZhY3Rvcih3cmtyX2NsYXNzX2xhYmVsLCBsZXZlbHMgPSBjKCJUb3RhbCBBcnRzIiwgdW5pcXVlKHdya3JfY2xhc3NfbGFiZWxbd3Jrcl9jbGFzc19sYWJlbCAhPSAiVG90YWwgQXJ0cyJdKSkpKQoKY29sbGVnZV9hcnRzX2RhdGEgPC0gY29sbGVnZV9hcnRzX2RhdGEgJT4lCiAgbXV0YXRlKAogICAgZ3JvdXAgPSBpZmVsc2Uod3Jrcl9jbGFzc19sYWJlbCA9PSAiVG90YWwgQXJ0cyIsICJUb3RhbCBBcnRzIiwgIldvcmtlciBDbGFzcyIpLAogICAgdG9vbHRpcCA9IHBhc3RlMCgiQ29sbGVnZSBHcmFkdWF0ZXM6ICIsIHJvdW5kKHBjdF9jb2xsZWdlLCAxKSwgIiUiKSkKCnRvdGFsX3BjdF9hcnRzX2NvbGxlZ2UgPC0gdG90YWxfYXJ0c19jb2xsZWdlJHBjdF9jb2xsZWdlICAKCmNvbGxlZ2VfYXJ0c19wbG90IDwtIGdncGxvdChjb2xsZWdlX2FydHNfZGF0YSwgYWVzKHggPSB3cmtyX2NsYXNzX2xhYmVsLCB5ID0gcGN0X2NvbGxlZ2UsIGZpbGwgPSBncm91cCwgdGV4dCA9IHRvb2x0aXApKSArCiAgZ2VvbV9iYXIoc3RhdCA9ICJpZGVudGl0eSIpICsKICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSB0b3RhbF9wY3RfYXJ0c19jb2xsZWdlLCBsaW5ldHlwZSA9ICJkb3R0ZWQiLCBjb2xvciA9ICJncmV5IiwgbGluZXdpZHRoID0gMC41KSArICAjIERvdHRlZCBsaW5lLCBncmV5IGFuZCB0aGlubmVyCiAgbGFicygKICAgIHRpdGxlID0gIkFydHMgV29ya2VyczogQ29sbGVnZSBHcmFkdWF0ZXMgYnkgV29ya2VyIENsYXNzaWZpY2F0aW9uIiwKICAgIHggPSAiIiwKICAgIHkgPSAiIgogICkgKwogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IGMoIlRvdGFsIEFydHMiID0gIiNhYjFkNzkiLCAiV29ya2VyIENsYXNzIiA9ICIjZGQ4MTJiIiksCiAgICAgICAgICAgICAgICAgICAgbmFtZSA9ICJHcm91cCIpICsKICBzY2FsZV95X2NvbnRpbnVvdXMobGFiZWxzID0gc2NhbGVzOjpwZXJjZW50X2Zvcm1hdChzY2FsZSA9IDEpKSArCiAgdGhlbWVfbWluaW1hbCgpICsKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LCBoanVzdCA9IDEpLCBsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpCgppbnRlcmFjdGl2ZV9jb2xsZWdlX2FydHNfcGxvdCA8LSBnZ3Bsb3RseShjb2xsZWdlX2FydHNfcGxvdCwgdG9vbHRpcCA9ICJ0ZXh0IikKCmludGVyYWN0aXZlX2NvbGxlZ2VfYXJ0c19wbG90CgpgYGAKCjxicj4KClJhY2lhbCBhbmQgZXRobmljIGRpZmZlcmVuY2VzIGFtb25nIHdvcmtlciBjbGFzc2lmaWNhdGlvbnMgYXJlIG11Y2ggc21hbGxlciB3aXRoaW4gQXJ0cyBhbmQgRGVzaWduIG9jY3VwYXRpb25zLCB0aG91Z2ggdGhleSBwZXJzaXN0IHRvIGEgbGVzc2VyIGRlZ3JlZS4gRm9yIGV4YW1wbGUsIHRoZSBzZWxmIGVtcGxveWVkIGFyZSBzbGlnaHRseSBtb3JlIHdoaXRlICg4MSUgYW5kIDgwJSBjb21wYXJlZCB0byA3OCUpLiBVbmxpa2UgYW1vbmcgYWxsIG9jY3VwYXRpb25zLCB0aGUgaW5jb3Jwb3JhdGVkIHNlbGYtZW1wbG95ZWQgYXJlIHNsaWdodGx5IG1vcmUgQmxhY2sgKDExJSB2cy4gOCUpLiBIb3dldmVyLCBnaXZlbiB0aGUgcmVsYXRpdmVseSBzbWFsbCBkaWZmZXJlbmNlcyBiZXR3ZWVuIHRoZSBzZWxmLWVtcGxveWVkIGFuZCBlbXBsb3llZCB3b3JrZXJzLCBhcyB3ZWxsIGFzIGEgcmVsYXRpdmVseSBzbWFsbCBzYW1wbGUgc2l6ZSwgaXQncyBkaWZmaWN1bHQgdG8gbWFrZSBhbnkgc3Ryb25nIGFzc2VydGlvbnMgYWJvdXQgcmFjaWFsIG9yIGV0aG5pYyBkaWZmZXJlbmNlcyBiZXR3ZWVuIHdvcmtlciBjbGFzc2lmaWNhdGlvbnMgd2l0aGluIEFydHMgYW5kIERlc2lnbiBvY2N1cGF0aW9ucy4gCgo8YnI+CgpgYGB7ciBhcnRzIHJhY2UsIGVjaG89RkFMU0V9CnRvdGFsX2FydHNfcmFjZSA8LSBzZWxmX2VtcGxveWVkX2NwcyAlPiUgIAogIGZpbHRlcihvY2N1cGF0aW9uID09IDkpICU+JSAKICBzdW1tYXJpemUoCiAgICB3cmtyX2NsYXNzX2xhYmVsID0gIlRvdGFsIEFydHMiLCAKICAgIHBjdF93aGl0ZSA9IHBhc3RlMChyb3VuZChtZWFuKHdoaXRlX2Fsb25lID09IDEsIG5hLnJtID0gVFJVRSkgKiAxMDApLCAiJSIpLAogICAgcGN0X2JsYWNrID0gcGFzdGUwKHJvdW5kKG1lYW4oYmxhY2tfYWxvbmUgPT0gMSwgbmEucm0gPSBUUlVFKSAqIDEwMCksICIlIiksCiAgICBwY3RfYXNpYW4gPSBwYXN0ZTAocm91bmQobWVhbihhc2lhbl9hbG9uZSA9PSAxLCBuYS5ybSA9IFRSVUUpICogMTAwKSwgIiUiKSwKICAgIHBjdF9oaXNwYW5pYyA9IHBhc3RlMChyb3VuZChtZWFuKGhpc3BhbmljID09IDEsIG5hLnJtID0gVFJVRSkgKiAxMDApLCAiJSIpLAogICAgcGN0X2hhd2FpaWFuX3BpID0gcGFzdGUwKHJvdW5kKG1lYW4oaGF3YWlpYW5fcGFjaWZpY19pc2xhbmRlcl9hbG9uZSA9PSAxLCBuYS5ybSA9IFRSVUUpICogMTAwKSwgIiUiKSwKICAgIHBjdF9uYXRpdmVfYW0gPSBwYXN0ZTAocm91bmQobWVhbihhbWVyaWNhbl9pbmRpYW5fYWxvbmUgPT0gMSwgbmEucm0gPSBUUlVFKSAqIDEwMCksICIlIiksCiAgICBwY3Rfb3RoZXIgPSBwYXN0ZTAocm91bmQobWVhbihvdGhlcl9yYWNlID09IDEsIG5hLnJtID0gVFJVRSkgKiAxMDApLCAiJSIpKQoKc2VfYXJ0c19yYWNlIDwtIHNlbGZfZW1wbG95ZWRfY3BzICU+JSAgCiAgZmlsdGVyKG9jY3VwYXRpb24gPT0gOSkgJT4lIAogIGdyb3VwX2J5KHdya3JfY2xhc3NfbGFiZWwpICU+JSAgCiAgc3VtbWFyaXplKAogICAgcGN0X3doaXRlID0gcGFzdGUwKHJvdW5kKG1lYW4od2hpdGVfYWxvbmUgPT0gMSwgbmEucm0gPSBUUlVFKSAqIDEwMCksICIlIiksCiAgICBwY3RfYmxhY2sgPSBwYXN0ZTAocm91bmQobWVhbihibGFja19hbG9uZSA9PSAxLCBuYS5ybSA9IFRSVUUpICogMTAwKSwgIiUiKSwKICAgIHBjdF9hc2lhbiA9IHBhc3RlMChyb3VuZChtZWFuKGFzaWFuX2Fsb25lID09IDEsIG5hLnJtID0gVFJVRSkgKiAxMDApLCAiJSIpLAogICAgcGN0X2hpc3BhbmljID0gcGFzdGUwKHJvdW5kKG1lYW4oaGlzcGFuaWMgPT0gMSwgbmEucm0gPSBUUlVFKSAqIDEwMCksICIlIiksCiAgICBwY3RfaGF3YWlpYW5fcGkgPSBwYXN0ZTAocm91bmQobWVhbihoYXdhaWlhbl9wYWNpZmljX2lzbGFuZGVyX2Fsb25lID09IDEsIG5hLnJtID0gVFJVRSkgKiAxMDApLCAiJSIpLAogICAgcGN0X25hdGl2ZV9hbSA9IHBhc3RlMChyb3VuZChtZWFuKGFtZXJpY2FuX2luZGlhbl9hbG9uZSA9PSAxLCBuYS5ybSA9IFRSVUUpICogMTAwKSwgIiUiKSwKICAgIHBjdF9vdGhlciA9IHBhc3RlMChyb3VuZChtZWFuKG90aGVyX3JhY2UgPT0gMSwgbmEucm0gPSBUUlVFKSAqIDEwMCksICIlIikpCgpzZV9hcnRzX3JhY2UgPC0gYmluZF9yb3dzKHRvdGFsX2FydHNfcmFjZSwgc2VfYXJ0c19yYWNlKQoKZGF0YXRhYmxlKAogIHNlX2FydHNfcmFjZSwKICBjb2xuYW1lcyA9IGMoCiAgICAiV29ya2VyIENsYXNzaWZpY2F0aW9uIiwgIldoaXRlIiwgIkJsYWNrIiwgIkFzaWFuIiwgIkhpc3BhbmljIiwKICAgICJIYXdhaWlhbi9QSSIsICJOYXRpdmUgQW1lcmljYW4iLCAiT3RoZXIiKSwKICBvcHRpb25zID0gbGlzdCgKICAgIHBhZ2luZyA9IEZBTFNFLAogICAgc2VhcmNoaW5nID0gRkFMU0UsCiAgICBpbmZvID0gRkFMU0UsIAogICAgbGVuZ3RoQ2hhbmdlID0gRkFMU0UsIAogICAgZG9tID0gJ3QnKSwKICBlc2NhcGUgPSBGQUxTRSwKICByb3duYW1lcyA9IEZBTFNFKSAKCmBgYAo8YnI+CgojIyMgRmluYW5jaWFsIFNlY3VyaXR5IGluIHRoZSBBcnRzCgo8YnI+ClRoZSBwZXJzb25hbCBhbmQgaG91c2Vob2xkIGluY29tZSBkaWZmZXJlbnRpYWxzIGFtb25nIHdvcmtlciBjbGFzc2lmaWNhdGlvbnMgcGVyc2lzdCB3aXRoaW4gQXJ0cyBhbmQgRGVzaWduIE9jY3VwYXRpb25zLiBGb3IgZXhhbXBsZSwgdGhlIHVuaW5jb3Jwb3JhdGVkIHNlbGYtZW1wbG95ZWQgZWFybiBsZXNzIGluIHBlcnNvbmFsIGFuZCBob3VzZWhvbGQgaW5jb21lIHRoYW4gZW1wbG95ZWVzIGluIEFydHMgYW5kIERlc2lnbiBvY2N1cGF0aW9ucywgYW5kIGFyZSBtdWNoIG1vcmUgbGlrZWx5IHRvIGxpdmUgYmVsb3cgdGhlIHBvdmVydHkgbGluZSAoMTElIHZzLiA2JSkuIE1vcmUgdW5pbmNvcnBvcmF0ZWQgc2VsZi1lbXBsb3llZCBhcnRzIHdvcmtlcnMgYXJlIG9uIHB1YmxpYyBhc3Npc3RhbmNlICgwLjI4JSB2cy4gMC4wNyUpLCBhbmQgbmVpdGhlciB0eXBlIG9mIHNlbGYtZW1wbG95ZWQgYXJ0cyB3b3JrZXIgcmVjZWl2ZWQgYW55IGZvcm0gb2YgdW5lbXBsb3ltZW50IGNvbXBlbnNhdGlvbi4KCjxicj4KCmBgYHtyIEFydHMgZmluYW5jaWFsIHNlY3VyaXR5LCBlY2hvPUZBTFNFfQoKdG90YWxfYXJ0c19maW5hbmNpYWxfc2VjdXJpdHkgPC0gc2VsZl9lbXBsb3llZF9jcHMgJT4lCiAgZmlsdGVyKG9jY3VwYXRpb24gPT0gOSkgJT4lCiAgc3VtbWFyaXplKAogICAgd3Jrcl9jbGFzc19sYWJlbCA9ICJUb3RhbCBBcnRzIiwgIAogICAgbWVkX2hoaSA9IGRvbGxhcihtZWRpYW4oaGhpLCBuYS5ybSA9IFRSVUUpKSwKICAgIG1lZF9pbmNvbWUgPSBkb2xsYXIobWVkaWFuKHRvdF9pbmNvbWUsIG5hLnJtID0gVFJVRSkpLAogICAgY291bnQgPSBuKCksCiAgICBwY3RfYmVsb3dfcG92ZXJ0eSA9IHBlcmNlbnQoc3VtKHBvdmVydHkgPT0gMSwgbmEucm0gPSBUUlVFKSAvIGNvdW50LCBhY2N1cmFjeSA9IDEpLAogICAgcGN0X2hpX2NvdiA9IHBlcmNlbnQoc3VtKGhpX2NvdiA9PSAxLCBuYS5ybSA9IFRSVUUpIC8gY291bnQsIGFjY3VyYWN5ID0gMSksCiAgICBwY3RfcmV0X2NvbnQgPSBwZXJjZW50KHN1bShyZXRfY29udCA+IDAsIG5hLnJtID0gVFJVRSkgLyBjb3VudCwgYWNjdXJhY3kgPSAxKSwKICAgIHBjdF91bmVtcCA9IHBlcmNlbnQoc3VtKHVuZW1wID09IDEsIG5hLnJtID0gVFJVRSkgLyBjb3VudCwgYWNjdXJhY3kgPSAuMDEpLAogICAgcGN0X3B1Yl9hc3Npc3QgPSBwZXJjZW50KHN1bShwdWJsaWNfYXNzaXN0ID09IDEsIG5hLnJtID0gVFJVRSkgLyBjb3VudCwgYWNjdXJhY3kgPSAuMDEpKSAlPiUKICBzZWxlY3QoLWNvdW50KQoKc2VfYXJ0c19maW5hbmNpYWxfc2VjdXJpdHkgPC0gc2VsZl9lbXBsb3llZF9jcHMgJT4lCiAgZmlsdGVyKG9jY3VwYXRpb24gPT0gOSkgJT4lCiAgZ3JvdXBfYnkod3Jrcl9jbGFzc19sYWJlbCkgJT4lCiAgc3VtbWFyaXplKAogICAgY291bnQgPSBuKCksCiAgICBtZWRfaGhpID0gZG9sbGFyKG1lZGlhbihoaGksIG5hLnJtID0gVFJVRSkpLAogICAgbWVkX2luY29tZSA9IGRvbGxhcihtZWRpYW4odG90X2luY29tZSwgbmEucm0gPSBUUlVFKSksCiAgICBwY3RfYmVsb3dfcG92ZXJ0eSA9IHBlcmNlbnQoc3VtKHBvdmVydHkgPT0gMSwgbmEucm0gPSBUUlVFKSAvIGNvdW50LCBhY2N1cmFjeSA9IDEpLAogICAgcGN0X2hpX2NvdiA9IHBlcmNlbnQoc3VtKGhpX2NvdiA9PSAxLCBuYS5ybSA9IFRSVUUpIC8gY291bnQsIGFjY3VyYWN5ID0gMSksCiAgICBwY3RfcmV0X2NvbnQgPSBwZXJjZW50KHN1bShyZXRfY29udCA+IDAsIG5hLnJtID0gVFJVRSkgLyBjb3VudCwgYWNjdXJhY3kgPSAxKSwKICAgIHBjdF91bmVtcCA9IHBlcmNlbnQoc3VtKHVuZW1wID09IDEsIG5hLnJtID0gVFJVRSkgLyBjb3VudCwgYWNjdXJhY3kgPSAuMDEpLAogICAgcGN0X3B1Yl9hc3Npc3QgPSBwZXJjZW50KHN1bShwdWJsaWNfYXNzaXN0ID09IDEsIG5hLnJtID0gVFJVRSkgLyBjb3VudCwgYWNjdXJhY3kgPSAuMDEpLAogICAgLmdyb3VwcyA9ICJkcm9wIikgJT4lCiAgc2VsZWN0KC1jb3VudCkKCnNlX2FydHNfZmluYW5jaWFsX3NlY3VyaXR5IDwtIGJpbmRfcm93cyh0b3RhbF9hcnRzX2ZpbmFuY2lhbF9zZWN1cml0eSwgc2VfYXJ0c19maW5hbmNpYWxfc2VjdXJpdHkpCgpkYXRhdGFibGUoCiAgc2VfYXJ0c19maW5hbmNpYWxfc2VjdXJpdHksCiAgY29sbmFtZXMgPSBjKAogICAgIldvcmtlciBDbGFzc2lmaWNhdGlvbiIsICJNZWRpYW4gSEggSW5jb21lIiwgIk1lZGlhbiBQZXJzb25hbCBJbmNvbWUiLCAiQmVsb3cgUG92ZXJ0eSIsCiAgICAiSGVhbHRoIEluc3VyYW5jZSBDb3ZlcmFnZSIsICJSZXRpcmVtZW50IENvbnRyaWJ1dGlvbiBMYXN0IFllYXIiLCAiVW5lbXBsb3ltZW50IENvbXAiLCAiT24gUHVibGljIEFzc2lzdGFuY2UiKSwKICBvcHRpb25zID0gbGlzdCgKICAgIHBhZ2luZyA9IEZBTFNFLAogICAgc2VhcmNoaW5nID0gRkFMU0UsCiAgICBpbmZvID0gRkFMU0UsCiAgICBsZW5ndGhDaGFuZ2UgPSBGQUxTRSwKICAgIGRvbSA9ICd0JyksCiAgZXNjYXBlID0gRkFMU0UsCiAgcm93bmFtZXMgPSBGQUxTRSkKCmBgYAoKPGJyPgoKRGlmZmVyZW5jZXMgaW4gaW5jb21lIHBlcnNpc3QgYW5kIGV2ZW4gd2lkZW4gd2l0aGluIEFydHMgYW5kIERlc2lnbiBvY2N1cGF0aW9ucywgY29tcGFyZWQgdG8gYWxsIG9jY3VwYXRpb25zLiBBbW9uZyBBcnRzIGFuZCBEZXNpZ24gd29ya2VycywgdGhlIG1lZGlhbiBwZXJzb25hbCBpbmNvbWUgb2YgdW5pbmNvcnBvcmF0ZWQgc2VsZi1lbXBsb3llZCBpcyAkMzgsODk5LCBjb21wYXJlZCB0byAkNTUsOTk2IGFtb25nIGFsbCBBcnRzIHdvcmtlcnMuIEluIHRoaXMsIHRoZSB1bmluY29ycG9yYXRlZCBzZWxmLWVtcGxveWVkIGFjdHVhbGx5IGVhcm4gbGVzcyB0aGFuIHVuaW5jb3Jwb3JhdGVkIHNlbGYtZW1wbG95ZWQgd29ya2VycyBpbiBhbGwgb2NjdXBhdGlvbnMgKCQ0MSwzNTEpLCBkZXNwaXRlIHRoZSBmYWN0IHRoYXQgdG90YWwgQXJ0cyBhbmQgRGVzaWduIHdvcmtlcnMgZWFybiBzbGlnaHRseSBtb3JlLCBvbiBhdmVyYWdlLCB0aGFuIGFsbCB3b3JrZXJzIGluIGFsbCBvY2N1cGF0aW9ucyAoJDUyLDM0MCkuCgo8YnI+CgpgYGB7ciBhcnRzIHBlcnNvbmFsIGluY29tZSwgZWNobz1GQUxTRX0KCnRvdGFsX2FydHNfaW5jb21lX2RhdGEgPC0gc2VsZl9lbXBsb3llZF9jcHMgJT4lCiAgZmlsdGVyKG9jY3VwYXRpb24gPT0gOSkgJT4lCiAgc3VtbWFyaXplKAogICAgd3Jrcl9jbGFzc19sYWJlbCA9ICJUb3RhbCBBcnRzIiwKICAgIG1lZGlhbl9pbmNvbWUgPSBtZWRpYW4odG90X2luY29tZSwgbmEucm0gPSBUUlVFKSkKCmFydHNfaW5jb21lX2J5X2NsYXNzIDwtIHNlbGZfZW1wbG95ZWRfY3BzICU+JQogIGZpbHRlcihvY2N1cGF0aW9uID09IDkpICU+JQogIGdyb3VwX2J5KHdya3JfY2xhc3NfbGFiZWwpICU+JQogIHN1bW1hcml6ZSgKICAgIG1lZGlhbl9pbmNvbWUgPSBtZWRpYW4odG90X2luY29tZSwgbmEucm0gPSBUUlVFKSwKICAgIC5ncm91cHMgPSAiZHJvcCIpCgphcnRzX2luY29tZV9ieV9jbGFzcyA8LSBiaW5kX3Jvd3ModG90YWxfYXJ0c19pbmNvbWVfZGF0YSwgYXJ0c19pbmNvbWVfYnlfY2xhc3MpCgphcnRzX2luY29tZV9ieV9jbGFzcyR3cmtyX2NsYXNzX2xhYmVsIDwtIGZhY3RvcihhcnRzX2luY29tZV9ieV9jbGFzcyR3cmtyX2NsYXNzX2xhYmVsLCBsZXZlbHMgPSBjKCJUb3RhbCBBcnRzIiwgdW5pcXVlKGFydHNfaW5jb21lX2J5X2NsYXNzJHdya3JfY2xhc3NfbGFiZWwpW3VuaXF1ZShhcnRzX2luY29tZV9ieV9jbGFzcyR3cmtyX2NsYXNzX2xhYmVsKSAhPSAiVG90YWwgQXJ0cyJdKSkKCmFydHNfaW5jb21lX3Bsb3QgPC0gZ2dwbG90KGFydHNfaW5jb21lX2J5X2NsYXNzLCBhZXMoeCA9IHdya3JfY2xhc3NfbGFiZWwsIHkgPSBtZWRpYW5faW5jb21lLCB0ZXh0ID0gcGFzdGUoIk1lZGlhbiBJbmNvbWU6ICIsIHNjYWxlczo6ZG9sbGFyX2Zvcm1hdChhY2N1cmFjeSA9IDEpKG1lZGlhbl9pbmNvbWUpKSkpICsKICBnZW9tX2JhcihzdGF0ID0gImlkZW50aXR5IiwgYWVzKGZpbGwgPSBpZmVsc2Uod3Jrcl9jbGFzc19sYWJlbCA9PSAiVG90YWwgQXJ0cyIsICJUb3RhbCBBcnRzIiwgIkFydHMgV29ya2VyIENsYXNzIikpKSArCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gdG90YWxfYXJ0c19pbmNvbWVfZGF0YSRtZWRpYW5faW5jb21lLCBsaW5ldHlwZSA9ICJkb3R0ZWQiLCBjb2xvciA9ICJncmV5IiwgbGluZXdpZHRoID0gMC41KSArCiAgbGFicygKICAgIHRpdGxlID0gIkFydHMgV29ya2VyczogTWVkaWFuIFBlcnNvbmFsIEluY29tZSBieSBXb3JrZXIgQ2xhc3NpZmljYXRpb24iLAogICAgeCA9ICIiLAogICAgeSA9ICIiKSArCiAgc2NhbGVfeV9jb250aW51b3VzKGxhYmVscyA9IHNjYWxlczo6ZG9sbGFyX2Zvcm1hdChhY2N1cmFjeSA9IDEpKSArCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gYygiVG90YWwgQXJ0cyIgPSAiI2RkYzA1NyIsICJBcnRzIFdvcmtlciBDbGFzcyIgPSAiI2FiMWQ3OSIpKSArCiAgdGhlbWVfbWluaW1hbCgpICsKICB0aGVtZSgKICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNDUsIGhqdXN0ID0gMSksCiAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNiwgZmFjZSA9ICJwbGFpbiIpLAogICAgbGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKQoKaW50ZXJhY3RpdmVfYXJ0c19pbmNvbWVfcGxvdCA8LSBnZ3Bsb3RseShhcnRzX2luY29tZV9wbG90LCB0b29sdGlwID0gInRleHQiKQoKaW50ZXJhY3RpdmVfYXJ0c19pbmNvbWVfcGxvdAoKYGBgCgo8YnI+CgpMb29raW5nIGF0IHNvY2lhbCBwcm90ZWN0aW9ucywgYXJ0cyBhbmQgZGVzaWduIHdvcmtlcnMgYXJlIGluc3VyZWQgYXQgcmVsYXRpdmVseSBoaWdoIHJhdGVzICg5Mi44JSBvZiBhbGwgQXJ0cyAmIERlc2lnbiB3b3JrZXJzIHZzLjkwLjUlIG9mIGFsbCB3b3JrZXJzKSwgYW5kIHRoZSBkaWZmZXJlbnRpYWxzIGFyZSBub3QgYXMgc3RhcmsgYW1vbmcgd29ya2VyIGNsYXNzaWZpY2F0aW9ucy4gSG93ZXZlciwgdGhlIGRpZmZlcmVuY2VzIGluIHJldGlyZW1lbnQgY29udHJpYnV0aW9ucyBwZXJzaXN0ZWQgd2l0aGluZyBBcnRzIGFuZCBEZXNpZ24gb2NjdXBhdGlvbnMsIGFzIGNvbnNpZGVyYWJseSBmZXdlciB1bmluY29ycG9yYXRlZCBzZWxmLWVtcGxveWVkIGFydHMgd29ya2VycyBjb250cmlidXRlZCB0byBhIHJldGlyZW1lbnQgYWNjb3VudCBsYXN0IHllYXIgKDE0JSB2cy4gMzElIG9mIGFsbCBBcnRzIHdvcmtlcnMgYW5kIDM0LjglIG9mIGFsbCB3b3JrZXJzKS4KCjxicj4KCmBgYHtyIGFydHMgaGVhbHRoIGFuZCByZXRpcmVtZW50LCBlY2hvPUZBTFNFfQoKYXJ0c19oZWFsdGhfcmV0aXJlbWVudCA8LSBzZWxmX2VtcGxveWVkX2NwcyAlPiUKICBmaWx0ZXIob2NjdXBhdGlvbiA9PSA5KSAlPiUKICBncm91cF9ieSh3cmtyX2NsYXNzX2xhYmVsKSAlPiUKICBzdW1tYXJpemUoCiAgICBwY3RfaGlfY292ID0gbWVhbihoaV9jb3YgPT0gMSwgbmEucm0gPSBUUlVFKSwKICAgIHBjdF9yZXRfY29udCA9IG1lYW4ocmV0X2NvbnQgPiAwLCBuYS5ybSA9IFRSVUUpCiAgKSAlPiUKICBwaXZvdF9sb25nZXIoCiAgICBjb2xzID0gYyhwY3RfaGlfY292LCBwY3RfcmV0X2NvbnQpLAogICAgbmFtZXNfdG8gPSAiY292ZXJhZ2VfdHlwZSIsCiAgICB2YWx1ZXNfdG8gPSAicGVyY2VudGFnZSIpICU+JQogIGJpbmRfcm93cygKICAgIHNlbGZfZW1wbG95ZWRfY3BzICU+JQogICAgICBmaWx0ZXIob2NjdXBhdGlvbiA9PSA5KSAlPiUKICAgICAgc3VtbWFyaXplKAogICAgICAgIHdya3JfY2xhc3NfbGFiZWwgPSAiVG90YWwgQXJ0cyIsCiAgICAgICAgcGN0X2hpX2NvdiA9IG1lYW4oaGlfY292ID09IDEsIG5hLnJtID0gVFJVRSksCiAgICAgICAgcGN0X3JldF9jb250ID0gbWVhbihyZXRfY29udCA+IDAsIG5hLnJtID0gVFJVRSkpICU+JQogICAgICBwaXZvdF9sb25nZXIoCiAgICAgICAgY29scyA9IGMocGN0X2hpX2NvdiwgcGN0X3JldF9jb250KSwKICAgICAgICBuYW1lc190byA9ICJjb3ZlcmFnZV90eXBlIiwKICAgICAgICB2YWx1ZXNfdG8gPSAicGVyY2VudGFnZSIpKQoKYXJ0c19oZWFsdGhfcmV0aXJlbWVudCA8LSBhcnRzX2hlYWx0aF9yZXRpcmVtZW50ICU+JQogIG11dGF0ZSgKICAgIGNvdmVyYWdlX3R5cGUgPSByZWNvZGUoCiAgICAgIGNvdmVyYWdlX3R5cGUsCiAgICAgICJwY3RfaGlfY292IiA9ICJIZWFsdGggQ292ZXJhZ2UiLAogICAgICAicGN0X3JldF9jb250IiA9ICJSZXRpcmVtZW50IENvbnRyaWJ1dGlvbiIpLAogICAgd3Jrcl9jbGFzc19sYWJlbCA9IGZhY3RvcigKICAgICAgd3Jrcl9jbGFzc19sYWJlbCwKICAgICAgbGV2ZWxzID0gYygiVG90YWwgQXJ0cyIsIHVuaXF1ZShhcnRzX2hlYWx0aF9yZXRpcmVtZW50JHdya3JfY2xhc3NfbGFiZWwpW3VuaXF1ZShhcnRzX2hlYWx0aF9yZXRpcmVtZW50JHdya3JfY2xhc3NfbGFiZWwpICE9ICJUb3RhbCBBcnRzIl0pKSwKICAgIHRvb2x0aXAgPSBwYXN0ZShjb3ZlcmFnZV90eXBlLCAiOiAiLCByb3VuZChwZXJjZW50YWdlICogMTAwLCAxKSwgIiUiKSkKCnAgPC0gZ2dwbG90KGFydHNfaGVhbHRoX3JldGlyZW1lbnQsIGFlcyh4ID0gd3Jrcl9jbGFzc19sYWJlbCwgeSA9IHBlcmNlbnRhZ2UgKiAxMDAsIGZpbGwgPSBjb3ZlcmFnZV90eXBlLCB0ZXh0ID0gdG9vbHRpcCkpICsKICBnZW9tX2JhcihzdGF0ID0gImlkZW50aXR5IiwgcG9zaXRpb24gPSAiZG9kZ2UiKSArCiAgbGFicygKICAgIHRpdGxlID0gIkFydHMgV29ya2VyczogU29jaWFsIFByb3RlY3Rpb25zIGJ5IENsYXNzaWZpY2F0aW9uIiwKICAgIHggPSAiIiwKICAgIHkgPSAiIiwKICAgIGZpbGwgPSAiIgogICkgKwogIHNjYWxlX3lfY29udGludW91cyhsYWJlbHMgPSBzY2FsZXM6OnBlcmNlbnRfZm9ybWF0KHNjYWxlID0gMSkpICsKICBzY2FsZV9maWxsX21hbnVhbCgKICAgIHZhbHVlcyA9IGMoIkhlYWx0aCBDb3ZlcmFnZSIgPSAiIzQ0ODVhZiIsICJSZXRpcmVtZW50IENvbnRyaWJ1dGlvbiIgPSAiI2RkODEyYiIpLAogICAgbGFiZWxzID0gYygiSGVhbHRoIENvdmVyYWdlIiwgIlJldGlyZW1lbnQgQ29udHJpYnV0aW9uIikpICsKICB0aGVtZV9taW5pbWFsKCkgKwogIHRoZW1lKAogICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA0NSwgaGp1c3QgPSAxKSwKICAgIGxlZ2VuZC5wb3NpdGlvbiA9ICJyaWdodCIpCgppbnRlcmFjdGl2ZV9wbG90IDwtIGdncGxvdGx5KHAsIHRvb2x0aXAgPSAidGV4dCIpCmludGVyYWN0aXZlX3Bsb3QKCmBgYAoKPGJyPgoKTWFueSBvZiB0aGUgaGVhbHRoIGNvdmVyYWdlIHRyZW5kcyBvYnNlcnZlZCBhbW9uZyBhbGwgb2NjdXBhdGlvbnMgcGVyc2lzdGVkIHdpdGhpbiBBcnRzIGFuZCBEZXNpZ24gb2NjdXBhdGlvbnMuIFRob3VnaCB0aGUgc2VsZi1lbXBsb3llZCBob2xkIHNpbWlsYXIgY292ZXJhZ2UgbGV2ZWxzLCB0aGUgc291cmNlIG9mIHRoYXQgY292ZXJhZ2UgZGlmZmVycyBhbW9uZyB3b3JrZXIgY2xhc3Nlcy4KCjxicj4KCmBgYHtyIGhlYWx0aCBjb3ZlcmFnZSBhcnRzLCBlY2hvPUZBTFNFfQoKdG90YWxfYXJ0c19oZWFsdGhfaW5zdXJhbmNlIDwtIHNlbGZfZW1wbG95ZWRfY3BzICU+JQogIGZpbHRlcihvY2N1cGF0aW9uID09IDkpICU+JQogIHN1bW1hcml6ZSgKICAgIHdya3JfY2xhc3NfbGFiZWwgPSAiVG90YWwiLAogICAgY291bnQgPSBuKCksCiAgICBwY3RfaGlfY292ID0gcGFzdGUwKHJvdW5kKG1lYW4oaGlfY292ID09IDEsIG5hLnJtID0gVFJVRSkgKiAxMDApLCAiJSIpLAogICAgcGN0X3B1Yl9jb3YgPSBwYXN0ZTAocm91bmQobWVhbihwdWJfY292ID09IDEsIG5hLnJtID0gVFJVRSkgKiAxMDApLCAiJSIpLAogICAgcGN0X3ByaV9jb3YgPSBwYXN0ZTAocm91bmQobWVhbihwcmlfY292ID09IDEsIG5hLnJtID0gVFJVRSkgKiAxMDApLCAiJSIpLAogICAgcGN0X2VtcGxfY292ID0gcGFzdGUwKHJvdW5kKG1lYW4oZW1wbF9jb3YgPT0gMSwgbmEucm0gPSBUUlVFKSAqIDEwMCksICIlIiksCiAgICBwY3RfZGlyX2NvdiA9IHBhc3RlMChyb3VuZChtZWFuKGRpcl9jb3YgPT0gMSwgbmEucm0gPSBUUlVFKSAqIDEwMCksICIlIiksCiAgICBwY3RfbXRrcF9jb3YgPSBwYXN0ZTAocm91bmQobWVhbihtdGtwX2NvdiA9PSAxLCBuYS5ybSA9IFRSVUUpICogMTAwKSwgIiUiKSwKICAgIHBjdF9tZWRpY2FpZF9jb3YgPSBwYXN0ZTAocm91bmQobWVhbihtZWRpY2FpZCA9PSAxLCBuYS5ybSA9IFRSVUUpICogMTAwKSwgIiUiKSkKCnNlX2FydHNfaGVhbHRoX2luc3VyYW5jZSA8LSBzZWxmX2VtcGxveWVkX2NwcyAlPiUKICBmaWx0ZXIob2NjdXBhdGlvbiA9PSA5KSAlPiUKICBncm91cF9ieSh3cmtyX2NsYXNzX2xhYmVsKSAlPiUKICBzdW1tYXJpemUoCiAgICBjb3VudCA9IG4oKSwKICAgIHBjdF9oaV9jb3YgPSBwYXN0ZTAocm91bmQobWVhbihoaV9jb3YgPT0gMSwgbmEucm0gPSBUUlVFKSAqIDEwMCksICIlIiksCiAgICBwY3RfcHViX2NvdiA9IHBhc3RlMChyb3VuZChtZWFuKHB1Yl9jb3YgPT0gMSwgbmEucm0gPSBUUlVFKSAqIDEwMCksICIlIiksCiAgICBwY3RfcHJpX2NvdiA9IHBhc3RlMChyb3VuZChtZWFuKHByaV9jb3YgPT0gMSwgbmEucm0gPSBUUlVFKSAqIDEwMCksICIlIiksCiAgICBwY3RfZW1wbF9jb3YgPSBwYXN0ZTAocm91bmQobWVhbihlbXBsX2NvdiA9PSAxLCBuYS5ybSA9IFRSVUUpICogMTAwKSwgIiUiKSwKICAgIHBjdF9kaXJfY292ID0gcGFzdGUwKHJvdW5kKG1lYW4oZGlyX2NvdiA9PSAxLCBuYS5ybSA9IFRSVUUpICogMTAwKSwgIiUiKSwKICAgIHBjdF9tdGtwX2NvdiA9IHBhc3RlMChyb3VuZChtZWFuKG10a3BfY292ID09IDEsIG5hLnJtID0gVFJVRSkgKiAxMDApLCAiJSIpLAogICAgcGN0X21lZGljYWlkX2NvdiA9IHBhc3RlMChyb3VuZChtZWFuKG1lZGljYWlkID09IDEsIG5hLnJtID0gVFJVRSkgKiAxMDApLCAiJSIpKQoKc2VfYXJ0c19oZWFsdGhfaW5zdXJhbmNlIDwtIGJpbmRfcm93cyh0b3RhbF9hcnRzX2hlYWx0aF9pbnN1cmFuY2UsIHNlX2FydHNfaGVhbHRoX2luc3VyYW5jZSkKCmRhdGF0YWJsZSgKICBzZV9hcnRzX2hlYWx0aF9pbnN1cmFuY2UsCiAgY29sbmFtZXMgPSBjKAogICAgIldvcmtlciBDbGFzc2lmaWNhdGlvbiIsICJUb3RhbCBDb3VudCIsICJIZWFsdGggSW5zdXJhbmNlIiwgIlB1YmxpYyIsICJQcml2YXRlIiwKICAgICJFbXBsb3llciIsICJEaXJlY3QiLCAiTWFya2V0cGxhY2UiLCAiTWVkaWNhaWQiKSwKICBvcHRpb25zID0gbGlzdCgKICAgIHBhZ2luZyA9IEZBTFNFLAogICAgc2VhcmNoaW5nID0gRkFMU0UsCiAgICBpbmZvID0gRkFMU0UsCiAgICBsZW5ndGhDaGFuZ2UgPSBGQUxTRSwKICAgIGRvbSA9ICd0JyksCiAgZXNjYXBlID0gRkFMU0UsCiAgcm93bmFtZXMgPSBGQUxTRSkKCmBgYAo8YnI+CgpBbW9uZyBhcnRzIHdvcmtlcnMsIHRoZSBpbmNvcnBvcmF0ZWQgc2VsZi1lbXBsb3llZCBhcmUgc2xpZ2h0bHkgbGVzcyBsaWtlbHkgdG8gaGF2ZSBwdWJsaWMgY292ZXJhZ2UgKDE3JSkgdGhhbiBhbGwgYXJ0cyB3b3JrZXJzICgyMCUpLCByZWZsZWN0aW5nIHRoZSByZWxhdGl2ZWx5IGhpZ2hlciBpbmNvbWUgbGV2ZWxzLiBIb3dldmVyLCBmdWxseSAzOSUgb2YgdW5pbmNvcnBvcmF0ZWQgc2VsZi1lbXBsb3llZCB3b3JrZXJzIGhhdmUgcHVibGljIGNvdmVyYWdlLCBhbmQgMjAlIGFyZSBvbiBNZWRpY2FpZCwgZG91YmxlIHRoZSBwb3J0aW9uIG9mIGFsbCBBcnRzIHdvcmtlcnMgb24gTWVkaWNhaWQgKDEwJSkuIE1lYW53aGlsZSwgbW9yZSBpbmNvcnBvcmF0ZWQgc2VsZi1lbXBsb3llZCB3b3JrZXJzIHB1cmNoYXNlIGhlYWx0aCBpbnN1cmFuY2UgZGlyZWN0bHkgKDMwJSkgb3IgdGhyb3VnaCB0aGUgQUNBIG1hcmtldHBsYWNlICgxNCUpLCB0aGFuIGVpdGhlciBhbGwgQXJ0cyB3b3JrZXJzICgxNCUgZGlyZWN0LCA3JSBtYXJrZXRwbGFjZSkgb3IgdW5pbmNvcnBvcmF0ZWQgc2VsZi1lbXBsb3llZCAoMjAlIGRpcmVjdCwgMTElIG1hcmtldHBsYWNlKS4gCgpUaGVzZSBkaWZmZXJlbmNlcyBjYW4gbGFyZ2VseSBiZSBleHBsYWluZWQgYnkgZGlmZmVyZW50aWFsIGFjY2VzcyB0byBlbXBsb3llciBzcG9uc29yZWQgaGVhbHRoIGluc3VyYW5jZSwgd2hpY2ggNzUlIG9mIHByaXZhdGUgc2VjdG9yIGFydHMgd29ya2VycyBoYXZlLCBhbmQgdGhlIGRpZmZlcmVuY2VzIGluIGluY29tZSBsZXZlbHMgYmV0d2VlbiBpbmNvcnBvcmF0ZWQgYW5kIHVuaW5jb3Jwb3JhdGVkIHNlbGYtZW1wbG95ZWQgYXJ0cyB3b3JrZXJzLiBMb3dlciBpbmNvbWUgdW5pbmNvcnBvcmF0ZWQgYXJ0cyB3b3JrZXJzIHNlZW0gdG8gcmVseSBtb3JlIG9uIHB1YmxpYyBjb3ZlcmFnZSBhbmQgTWVkaWNhaWQsIHdoaWxlIGhpZ2hlciBpbmNvbWUgaW5jb3Jwb3JhdGVkIHNlbGYtZW1wbG95ZWQgYXJ0cyB3b3JrZXJzIGFyZSBtb3JlIGxpa2VseSB0byBwdXJjaGFzZSBjb3ZlcmFnZSBkaXJlY3RseSBvciBvYnRhaW4gZW1wbG95bWVudCBjb3ZlcmFnZSB0aHJvdWdoIGEgc3BvdXNlIG9yIGZhbWlseSBtZW1iZXIuIAoKPGJyPgoKIyMgQ29uY2x1c2lvbgoKPGJyPgoKVGhlIHNlbGYtZW1wbG95ZWQgYXJlIG5vdCBhIG1vbm9saXRoIC0gdGhlIGV4cGVyaWVuY2VzIG9mIGluY29ycG9yYXRlZCBhbmQgdW5pbmNvcnBvcmF0ZWQgc2VsZi1lbXBsb3llZCB3b3JrZXJzIGRpZmZlciBncmVhdGx5LiBCYXNlZCBvbiB0aGlzIGFuYWx5c2lzLCBpbmNvcnBvcmF0ZWQgc2VsZi1lbXBsb3llZCB3b3JrZXJzIHNlZW0gdG8gZml0IG9uZSBuYXJyYXRpdmUgb2YgaW5kZXBlbmRlbnQgd29yayAtIHRoYXQgb2YgaGlnaGx5IGVkdWNhdGVkLCB3ZWxsLWNvbXBlbnNhdGVkIHByb2Zlc3Npb25hbHMsIHdobyBoYXZlIG1vcmUgbWVhbnMgdG8gcHVyY2hhc2UgaGVhbHRoIGluc3VyYW5jZSBhbmQgbWFuYWdlIHRoZSBjaGFsbGVuZ2VzIG9mIG9wZXJhdGluZyBvdXRzaWRlIHRoZSBlbXBsb3llci1iYXNlZCBiZW5lZml0IHN5c3RlbS4gCgpNZWFud2hpbGUsIHVuaW5jb3Jwb3JhdGVkIHNlbGYtZW1wbG95ZWQgd29ya2VycyBmaXQgaW50byBhIGRpZmZlcmVudCBuYXJyYXRpdmUgLSB0aGF0IG9mIHRoZSByZWxhdGl2ZWx5IGluc2VjdXJlIGdpZyB3b3JrZXIgd2hvIGV4cGVyaWVuY2VzIGdyZWF0ZXIgcHJlY2FyaXR5LiBVbmluY29ycG9yYXRlZCBzZWxmLWVtcGxveWVkIHdvcmtlcnMgZWFybiBsZXNzIGluY29tZSwgcmVseSBtb3JlIG9uIHB1YmxpYyBhc3Npc3RhbmNlIGFuZCBiZW5lZml0cywgYW5kIGhhdmUgbG93ZXIgbGV2ZWxzIG9mIHNvY2lhbCBwcm90ZWN0aW9uLCBldmVuIHJlbGF0aXZlIHRvIG90aGVycyB3aG8gc2hhcmUgdGhlaXIgb2NjdXBhdGlvbi4gV2hlbiBjb25zaWRlcmluZyBuZXcgcHJvZ3JhbXMgYW5kIGJlbmVmaXRzLCBwb2xpY3ltYWtlcnMgc2hvdWxkIGZvY3VzIHRoZWlyIGVmZm9ydHMgb24gYnVpbGRpbmcgYSBzb2NpYWwgc2FmZXR5IG5ldCB0aGF0IGltcHJvdmVzIGZpbmFuY2lhbCBzZWN1cml0eSBmb3IgdGhlIHVuaW5jb3Jwb3JhdGVkIHNlbGYtZW1wbG95ZWQuIAoKPGJyPgoKIyMgTWV0aG9kcwoKPGJyPgoKQWxsIGFuYWx5c2lzIGJhc2VkIG9uIHRoZSBbMjAyNCBBbm51YWwgU29jaWFsIGFuZCBFY29ub21pYyBTdXBwbGVtZW50XShodHRwczovL3d3dy5jZW5zdXMuZ292L2RhdGEvZGF0YXNldHMvdGltZS1zZXJpZXMvZGVtby9jcHMvY3BzLWFzZWMuaHRtbCkgdG8gdGhlIFtDdXJyZW50IFBvcHVsYXRpb24gU3VydmV5XShodHRwczovL3d3dy5jZW5zdXMuZ292L3Byb2dyYW1zLXN1cnZleXMvY3BzLmh0bWwpLCBib3RoIHBlcnNvbiBhbmQgaG91c2Vob2xkIHJlY29yZHMuICAKCldvcmtlciBjbGFzc2lmaWNhdGlvbiBiYXNlZCBvbiB0aGUgcHJpbWFyeSBqb2Igb2YgYWxsIHBlcnNvbnMuIEFuYWx5c2lzIGV4Y2x1ZGVzIHRob3NlIHdvcmtpbmcgd2l0aG91dCBwYXkgYW5kIHRob3NlIG91dHNpZGUgdGhlIGNpdmlsaWFuIHdvcmtmb3JjZSBzdWNoIGFzIGNoaWxkcmVuIGFuZCBpbmRpdmlkdWFscyBpbiB0aGUgYXJtZWQgc2VydmljZXMuIEdvdmVybm1lbnQgY2xhc3NpZmljYXRpb24gY2F0ZWdvcnkgY29tYmluZXMgZmVkZXJhbCwgc3RhdGUsIGFuZCBsb2NhbCBnb3Zlcm5tZW50IHdvcmtlcnMuIFByaXZhdGUgY2xhc3NpZmljYXRpb24gY2F0ZWdvcnkgY29tYmluZXMgZm9yLXByb2ZpdCBhbmQgbm9uLXByb2ZpdCBwcml2YXRlIHdvcmtlcnMuIAoKQ1BTIHF1ZXN0aW9ubmFpcmUgb25seSBhbGxvd3MgcmVzcG9uZGVudHMgdG8gY2hvb3NlIE1hbGUgb3IgRmVtYWxlLCBzbyBnZW5kZXIgYW5hbHlzaXMgZXhjbHVkZXMgb3RoZXIgZ2VuZGVyIGlkZW50aXRpZXMuIENvbGxlZ2UgZ3JhZHVhdGVzIGluY2x1ZGVzIGFsbCBwZXJzb25zIHdpdGggYSBiYWNoZWxvcnMgZGVncmVlIG9yIGFib3ZlLiBIaXNwYW5pYyBpbmNsdWRlcyBhbnkgcGVyc29uIG9mIGFueSByYWNlIHdobyBpZGVudGlmaWVkIGFzIEhpc3BhbmljLiBBbGwgb3RoZXIgcmFjaWFsIGdyb3VwcyBpbmNsdWRlIG9ubHkgaW5kaXZpZHVhbHMgd2hvIGlkZW50aWZpZWQgYXMgdGhhdCByYWNlIGFsb25lLiBBbGwgaW5kaXZpZHVhbHMgd2hvIGlkZW50aWZpZWQgYXMgbW9yZSB0aGFuIG9uZSByYWNlIGluY2x1ZGVkIGluICJPdGhlciIuIFVTIENpdGl6ZW4gaW5jbHVkZXMgaW5kaXZpZHVhbHMgd2hvIGFyZSBuYXRpdmUgYW5kIGJvcm4gaW4gVVMsIGJvcm4gaW4gUFIgb3IgVVMgb3V0bHlpbmcgYXJlYSwgYW5kIGJvcm4gYWJyb2FkIG9mIFVTIHBhcmVudChzKS4KCldoaWxlIGFsbCByZXBvcnRlZCBkYXRhIHdhcyBiYXNlZCBvbiBhdCBsZWFzdCAxMDAgb2JzZXJ2YXRpb25zLCB0aGUgdG90YWwgc2FtcGxlIHNpemUgd2FzIHJlbGF0aXZlbHkgc21hbGwgKDcwLDg1NyBvYnNlcnZhdGlvbnMgZm9yIHRoZSB0b3RhbCB3b3JrZm9yY2UsIDEsNDU0IG9ic2VydmF0aW9ucyBmb3IgdGhvc2Ugd2l0aCBBcnRzIGFuZCBEZXNpZ24gb2NjdXBhdGlvbnMpLiBGaWd1cmVzIHByZXNlbnRlZCBoYXZlIG5vdCBiZWVuIHN1YmplY3RlZCB0byB0ZXN0cyBmb3Igc3RhdGlzdGljYWwgc2lnbmlmaWNhbmNlIG9yIGNvcnJlbGF0aW9uLiAgICAKCjxicj4KCiMjIE5leHQgU3RlcHMKCjxicj4KCiogQXNjZXJ0YWluIHdoZXRoZXIgdGhpcyBhbmFseXNpcyBhbGlnbnMgd2l0aCB0aGF0IGRlcml2ZWQgZnJvbSBvdGhlciBjb21tb24gbWVhc3VyZXMgb2YgdGhlIFVTIGVjb25vbXkgYW5kIHdvcmtmb3JjZSwgc3VjaCBhcyB0aGUgQW1lcmljYW4gQ29tbXVuaXRpZXMgU3VydmV5LiBDb25kdWN0aW5nIHBhcmFsbGVsIGFuYWx5c2lzLCBmb3IgZXhhbXBsZSBvZiBoZWFsdGggaW5zdXJhbmNlIGNvdmVyYWdlIGJ5IHdvcmtlciBjbGFzc2lmaWNhdGlvbiwgd2lsbCBkZW1vbnN0cmF0ZSB0aGUgZXh0ZW50IHRvIHdoaWNoIHRoaXMgYW5hbHlzaXMgaXMgcmVsaWFibGUuIAoKKiBFeHBhbmQgdGhpcyBhbmFseXNpcyB3aXRoIGNvbXBsZW1lbnRhcnkgZGF0YSBmcm9tIG90aGVyIHNvdXJjZXMgdGhhdCBjYXB0dXJlIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGZpbmFuY2lhbCBzZWN1cml0eSBvZiB1bmluY29ycG9yYXRlZCBhbmQgaW5jb3Jwb3JhdGVkIHNlbGYtZW1wbG95ZWQgd29ya2Vycy4gQWRkaXRpb25hbCBkYXRhIHNvdXJjZXMgd2lsbCBoZWxwIHRlc3QgdGhlc2UgZmluZGluZ3MgYXMgd2VsbCBhcyBzdXBwbGVtZW50IHRoZW0gd2l0aCBvdGhlciBpbmRpY2F0b3JzIG9mIGZpbmFuY2lhbCBzZWN1cml0eSBub3QgaW5jbHVkZWQgaW4gdGhpcyBkYXRhIHNldCwgc3VjaCBhcyBhY2Nlc3MgdG8gY2hpbGRjYXJlLCBjb3N0IG9mIGNoaWxkY2FyZSwgYWNjZXNzIHRvIHBhaWQgbGVhdmUsIGFuZCBvdGhlciBzb2NpYWwgcHJvdGVjdGlvbnMuIE11Y2ggb2YgdGhpcyBkYXRhIGlzIGF2YWlsYWJsZSBpbiB0aGUgW1N1cnZleSBvZiBJbmNvbWUgYW5kIFByb2dyYW0gUGFydGljaXBhdGlvbiAoU0lQUCldKGh0dHBzOi8vd3d3LmNlbnN1cy5nb3YvcHJvZ3JhbXMtc3VydmV5cy9zaXBwLmh0bWwpIGRhdGEgc2V0LiBJIGFsc28gaW50ZW5kIHRvIGV4cGxvcmUgdGhlIFtHaWcgRWNvbm9teSBEYXRhIEh1Yl0oaHR0cHM6Ly93d3cuZ2lnZWNvbm9teWRhdGEub3JnLykgZm9yIGFkZGl0aW9uYWwgc291cmNlcyBvZiBpbmZvcm1hdGlvbi4gCgoqIEV4dGVuZCB0aGlzIGFuYWx5c2lzIGJhY2sgaW4gdGltZSwgdG8gZXhwbG9yZSBsb25nZXItdGVybSB0cmVuZHMgYW5kIHRoZSBleHRlbnQgdG8gd2hpY2ggdGhlIGNvbmRpdGlvbnMgaWRlbnRpZmllZCBpbiB0aGlzIHN0dWR5IGhhdmUgY2hhbmdlZC4gCg==
Social Protections
Financial security extends beyond income, including access to social protections. While the incorporated self-employed have health insurance at nearly the same rates as the total workforce (90% vs. 91%), the unincorporated self-employed experience lower levels of health insurance coverage than any other worker group, at 84% coverage. It’s unsurprising that the self-employed are less likely to have health insurance coverage, given the employer-based health insurance system that dominates the United States.
The unincorporated self-employed are also far less likely to contribute to a retirement savings account. Only 12% of unincorporated self-employed workers contributed to a retirement savings account last year, compared to 35% of the total workforce. The incorporated self-employed also contributed at lower rates (28%), but not nearly as low as the unincorporated self-employed. Again, given that employment-based benefits are the norm in the United States, and that the self-employed lack access to infrastructure of automatic enrollment and contributions through payroll, this difference in retirement savings activity between self-employed and employed workers is understandable.