Introduction
The field of digital epigraphy has seen significant development in
recent years: not only are traditional epigraphic corpora increasingly
being digitised and made accessible via their websites for anyone to
browse and search but several resources are already born digital without
any printed edition, e.g. Inscriptions of Greek Cyrenaica (Roueche et al., 2020),
Inscriptions of Roman Tripolitania (Roueche,
2022); for more see (Elliott,
2015). Most inscriptions contain references to places, people
or events, or contain data related to the place and time of their
creation and provide an ideal resource to study past communities as a
whole. However, in order to be able to harness their full potential and
for example access all inscriptions from a place of interest or
of a given type, we need to link the existing datasets together. The
concept of Linked Open Data (LOD) provides a means of
connecting various digital datasets while enriching the text with,
e.g. broader spatio-temporal context or prosopographic data, leading to
the creation of new connections between individual inscriptions as well
as archaeological sites or potential re-evaluation of historical
narratives (Bagnall et al., 2006; Geser, 2016; Tupman,
2021). Although many epigraphic datasets have been using LOD,
especially to record the spatial component by using services such as
Pleiades or Trismegistos, there is still a considerable gap in the LOD
implementation across the discipline and thus in the accessibility of
the data.
An individual dataset that is not more widely accessible or
interoperable is of considerable value to groups sharing similar
interests (e.g. geographic area, chronological period, linguistic
environment), but of much more limited value to the epigraphic
discipline as a whole. The value of LOD lies in being able to build on
the efforts and investment of numerous generations of epigraphers who
over many years have produced multiple high-quality editions in first
analogue and more recently also digital form. Whether there is one
master database connecting all the inscriptions together, or not, once
the data is FAIR (Findable,
Accessible, Interoperable, Reusable (Wilkinson et al., 2016)) and
linked to other LOD, new avenues of research open - either to large
scale, comparative studies such as (Assael et
al., 2022; Glomb et al., 2022; Heřmánková
et al., 2021) or projects working on the same
material but with different emphases (Mullen & Bowman,
2021; Willi,
2021). Once the data is linked, there is no need to build one
central repository, which is often costly and unsustainable in the long
run as documented by the recent experience of the EAGLE Portal (Orlandi, 2021), but instead one can
empower individual users and provide them with clear guidelines and
skills on how to work with LOD in epigraphy.
The FAIR Epigraphy Project (https://www.csad.ox.ac.uk/fair-epigraphy) aims to fill
in the gap between the digitisation of inscriptions and the realisation
of being able to use their full potential as a digital resource. The
FAIR Epigraphy project has been established as a collaboration between
Johannes Gutenberg University in Mainz (Prof. Marietta Horster) and the
University of Oxford (Prof. Jonathan Prag), funded by the Arts and
Humanities Research Council (AHRC) and Deutsche Forschungemeinschaft
(DFG) and will run for 36 months, from 2022 to 2025. FAIR
Epigraphy aims to create an interactive platform for all
epigraphic projects, aligning their digital needs with the principles of
FAIR science. The overall desirability of FAIR -
Findable, Accessible, Interoperable,
Reusable (Wilkinson et
al., 2016) - data is fundamental for advancing research
into the epigraphic, linguistic, and material culture of the ancient
world.
“The principles emphasise machine-actionability (i.e. the
capacity of computational systems to find, access, interoperate, and
reuse data with none or minimal human intervention) because humans
increasingly rely on computational support to deal with data as a result
of the increase in volume, complexity, and creation speed of data.”
(FAIR Principles website, https://www.go-fair.org/fair-principles/)
With the increase in Linked Open Data and novel interface
technologies and standards, the FAIR Epigraphy Project will be able to
create the tools and the community needed to transform epigraphic
research in the digital age. However, FAIR Epigraphy does not wish to
replicate any current efforts, but rather to align existing initiatives
and bring them together to create a hub of high-quality tools and FAIR
compliant standards and resources for the modern epigraphic discipline.
Our internationally collaborative approach will enable and support
innovative research across epigraphic data and the wider linked web of
data (especially archaeological data), such that all epigraphic data is
increasingly FAIR for both the research community and the wider public.
To this end, we aim to:
- consolidate community-wide standards (vocabularies and
ontology);
- host and make fully accessible the resulting linked open data
published by individual projects (RDF/XML data publication);
- develop the tools for community implementation of those standards
(vocabulary and ontology hosting and publication);
- provide support to members of the community in implementing the
standards within existing and new projects.
In order to map the existing field of digital epigraphy including
current practices and standards, as well as to clarify the (digital)
needs of the discipline, we circulated two scoping surveys between
February and April 2022 (FAIR
Epigraphy: Scoping survey for partners and collaborators
and Digital
epigraphy in 2022: scoping survey for all digital epigraphy
projects). The results of the surveys presented in the current report
will be used to plan the activities and efficiently allocate the
resources of the FAIR Epigraphy Project in the following three years.
The report contains only the answers where participants gave consent to
publish the anonymised responses. In cases where the consent was not
given, the data is used to inform the FAIR Epigraphy decision but is
excluded from the report.
The survey answers are anonymised so that individual projects cannot
be identified on the basis of their replies and the data is stored as a
TSV (tab-separated value) file within the project’s GitHub repository
(https://github.com/FAIR-epigraphy/scoping_survey_report/)
as a supplement to the text of this report and can be accessed under the
CC-BY-SA 4.0 International License. The report is produced in two
formats: a traditional PDF (available at https://github.com/FAIR-epigraphy/scoping_survey_report/blob/main/scripts/01_FAIR_epi_report.pdf)
and an interactive HTML page where the reader can browse through the
responses (available at https://fair-epigraphy.github.io/scoping_survey_report/scripts/01_FAIR_epi_report.html).
If you are viewing this report in the HTML format, to browse the
data click on the arrow in the top right corner of the data tables in
each section (where the arrow is available).
Disclaimer: The views and opinions expressed within
the survey (presented in tables) do not necessarily reflect the views or
positions of the FAIR Epigraphy Project itself.
FAIR Epigraphy partner
projects
This section summarises the results of the online survey FAIR
Epigraphy: Scoping survey for partners and collaborators aimed
at those established digital projects which are already official
partners and collaborators of the FAIR Epigraphy Project. We sent the
survey to 14 partner projects. We received 13 responses to the survey, a
response rate of 93% with some participants responding on behalf of two
projects combined into one response (and thus skewing the response
rate). 100% of participating partner projects gave consent to publish
their anonymised responses as part of this report.
The partner projects represent successful projects with the average
duration of a project being 6 years. The shortest participating project
reported their duration as 3 years and the longest as 207 years.
Language
coverage
Question: What is the predominant language of
epigraphic data in your project (for mixed collections or collections
where other languages are predominant provide details in Other)
Commentary: The language coverage of the
participating projects consists predominantly of Latin and Greek either
alone or in combination (representing 53% of the answers). 8
participating projects record inscriptions in one language only, while 5
contain inscriptions in two or more languages (7 being the maximum
number of listed languages in one project.)
The Other
(i.e. other than Greek and Latin) category
encompassed a substantial part of the surveyed projects (47%),
documenting the need to expand beyond the traditional Latin and Greek
focus of the classical epigraphic discipline. The languages listed as
Other
consisted of Other, Ancient Celtic, Elymian,
Etruscan, Gaulish, Oscan, other epichoric languages from the west
provinces of Rome (excl. Africa), Phoenician-Punic, Punic, Raetic,
Sikel. It is, however, worth noting that the majority of
participating projects record languages from the wider
Mediterranean/European linguistic space.
Unique combinations of languages as retrieved from the
survey:
IT
infrastructure
Question: Does the project have a
website?
Commentary: All of the participating projects
currently maintain an online presence (as of February-April 2022).
Question: Does your project have an IT
specialist(s)?
Commentary: The majority of the digital partner
projects have an IT specialist, yet only 2 projects have an equivalent
of 1.0 FTE or more at their disposal. 54 % of projects have access to
part-time IT support for their projects, which in some instances may be
only a few hours per week per project. 4 projects reported no
availability of IT support, even on a part-time basis (representing 31%
of participating partner projects).
Question: Does your project store epigraphic
data in the following formats…?
Commentary: The majority of projects use
Epidoc XML
as their main output data format (77% of
participating projects), either in combination with other formats or as
the sole data format. Other data formats are represented less
frequently: JSON (15%), RDF (15%), SQL (31%) and CSV (15%). 31% of
projects use only one type of data format, while 46% use two or more
data format types within their project.
Data sharing
Question: Do you share your data outside of your
project?
Commentary: All partner projects reported their
willingness to share the data, even if they are not currently doing so,
or if they provide the data only on demand. 54% of partner projects
share the data under a Creative Commons license (https://creativecommons.org/), which is the preferred
mode according to the FAIR data principles. The majority of partners
which are currently not using Creative Commons licenses are considering
their use in the future.
Question: How do you share your data with users
outside your project?
Commentary: All partner projects provide at least
one way of sharing the data (whether it is currently accessible to the
public or not, or it is intended to be accessible in the future). The
average (median) number of sharing methods per project is 2.
As seen in Figure 1, direct download of the Epidoc
XML is by far the most popular format for data sharing (implemented by 6
projects), however other Open Science services are starting to make
their way into established digital epigraphy projects, such as sharing
via a public repository, implemented by 4 (GitHub) and 4 (Zenodo)
projects respectively, as well as providing raw data in the CSV
(comma-separated value) format (4 projects), or as JSON (JavaScript
Object Notation) files (2 projects). A minority of participating partner
projects shares the data on an on-demand basis or have a non-public API
access point to their data.
Institutional
policies
Question: Does your institution or funding body
require your project to comply with any data policies (e.g. FAIR
principles, data storage, data sharing, Open Science)?
Commentary: The majority of projects (represented by
54%) are required to comply with data-related policy introduced either
by their institution or a funding body. 47% of partner projects are not
required to follow any data policy, but some follow one on a voluntary
basis.
Question: If you have answered YES in the
previous question, please specify what are the policies, or provide a
link.
Commentary: Several of the partner projects follow
the ERC data and open access policies. More information on ERC Open
Research Data and Data Management Plans can be found at https://erc.europa.eu/sites/default/files/document/file/ERC_info_document-Open_Research_Data_and_Data_Management_Plans.pdf
or at ERC Open Science policies page https://erc.europa.eu/managing-your-project/open-science.
Open Science
practice
Question: Standardized terminologies: The
project uses the following systems:
Commentary: Internal authority lists are the most
widely used method to record epigraphic terminologies (62 % of
projects). The vocabularies for the epigraphic discipline created by the
EAGLE project (https://www.eagle-network.eu/resources/vocabularies/)
are used either in their original form (38% of participating projects)
or in a form modified for the individual needs of the project (54% of
participating projects). The use of non-standardized internal authority
lists and the need for modifications suggests that the EAGLE
vocabularies do not in fact offer sufficiently a community-wide standard
and need to be improved before becoming one. This process has been
already started by the Epigraphy.info Vocabularies working group of
which Hermankova, Horster, and Prag are all members. For more details
see https://epigraphy.info/vocabularies_wg/. If you would
like to join the working group, please get in touch with the
authors.
Question: Standardized terminologies: data on
combination of vocabularies systems
Commentary: The majority of projects (46%) use only
one method to record their standard terminologies, while 54% of projects
use a combination of two or more methods. Internal authority lists are
used in combination with the EAGLE vocabularies both in their original
and modified form. Sharing or publication of internal authority lists
would therefore be highly beneficial for improving the existing EAGLE
vocabularies.
Question: Linked Open Datasets: The project uses
the following systems:
Commentary: From the listed Linked Open Datasets
(LOD), Trismegistos and Pleiades are by far the most popular, being used
in 77% and in 69% of all participating projects. The EAGLE vocabularies
are used in 54% of all participating projects.
The group of LOD resources focusing on geographic
data (e.g. Pleiades, Adriatlas, Cartapulia, Trismegistos) seems
to be strongly represented amongst participating projects (92 % use at
least one of them), suggesting that geographic LOD are well established
for the study of the ancient world.
Prosopographic data, as represented by EDH People,
PIR, and LGPN are used by 46% of all participating projects. The survey
responses suggest there is a great space for improvement and potentially
great benefit in creating and further improving prosopographic LOD.
Non-partnered epigraphy
projects
This section summarises the results of the online survey Digital
epigraphy in 2022: scoping survey targeted at digital projects
currently listed under Digital Epigraphy Projects on the Digital
Classicist Wiki page (https://wiki.digitalclassicist.org/Category:Projects)
and which was possible to trace in February 2022. The survey was sent to
83 projects and the link circulated until mid-April 2022. We have
received 27 responses to the survey, a response rate of 31%. Some
participants contributed on behalf of multiple projects in one response,
which we were unable to disentangle and thus the response rate is
slightly skewed. 96% (26) of non-partnered projects gave consent to
publish their anonymised responses as part of the current report. The
remaining responses are excluded from the report but will be used to
inform the FAIR Epigraphy planning and decision making.
The respondents represent a wide range of projects from well
established projects to short-term PhD projects, with the average
duration of a project being 5.5 years. The shortest participating
project reported their duration as 1 year and the longest 117 years.
Question: Is the project still active?
Commentary: 73% of responding projects are still
active, while 12% of projects are permanently closed and do not consider
restarting in the future. 15% of projects are currently not active, but
might be reactivated in the future.
Language
coverage
Question: What is the predominant language of
epigraphic data in your project (for mixed collections or collections
where other languages are predominant provide details in Other)
Commentary: The language coverage of the
participating projects consisted predominantly of Latin and Greek
projects, representing 64% of projects combined. Greek is the most
frequent language, either as the sole/predominant language (11 projects)
or in combination with other languages (5 projects). Latin is the
sole/predominant language in 6 projects or in combination with other
languages (5 projects). 18 participating projects record inscriptions in
one language only, while 8 contain inscriptions in two or more languages
(5 being the maximum number of listed languages.).
The languages listed as Other
consisted of languages
such as Phoenician, Akkadian, Ancient Languages of the Mediterranean
area, Arabic, Aramaic, Hattian u.a., Hittite, Hurrian, Luwian, Neopunic,
Other, Palaeo-European, Palaeo-Hispanic, Punic. All languages come from
the wider Mediterranean/European linguistic space.
Unique combinations of languages as retrieved from the
survey:
IT
infrastructure
Question: Does the project have a
website?
Commentary: Almost all participating projects
maintain an online presence (as of February-April 2022).
Question: Does your project have an IT
specialist(s)?
Commentary: Only 8% of projects have an equivalent
of 1.0 FTE or more IT support at their disposal. 35% of digital projects
have an IT specialist available for at least several hours per week or
share them with other digital projects within their institution. Several
projects report difficulty with finding financial resources to support
further development and long-term sustainability of the project or even
day-to-day support. 23% of the participating projects report that they
currently do not have any access to IT support. An additional 27% of
projects did not indicate whether they have access to IT support because
they are no longer active. In order to understand the precise
significance of this data, it would be necessary in future surveys to
clarify the current funding status of individual projects. However, the
general trend of limited access to IT support amongst non-partnered
project stands out.
Question: Does your project store epigraphic
data in the following formats…?
Commentary: The majority of projects use
Epidoc XML
as their main output data format (42% of
participating projects), either in combination with other formats or as
the sole data format. SQL and similar database formats are relatively
common, in 31% of projects. Other data formats are represented less
frequently by a small number of projects and mostly as complementary
data formats to more popular formats such as Epidoc XML or SQL: JSON
(8%), RDF (8%), and CSV (12%). 4% of projects indicated the use of a
combination of analogue data and 3D data format. 4% of projects
indicated using their own version of Epidoc XML, adapted to their
specific needs.
19% of projects use only one type of data format, while 23% use two
or more data format types. The data format of the projects that are no
longer active is recorded in the following Data sharing
section, under Closed Projects.
Data sharing
Active
projects
This section summarised only the ‘active’ projects. For
‘closed/non-active’ projects, see the section below.
Question: Do you share your data outside of your
project?
Commentary: As of February 2022, 19 projects
participated in the survey as active projects. The majority of active
projects are willing to share their data, representing 82% of
participating projects. 57% of active projects share data under a
Creative Commons license, which is the preferred mode according to the
FAIR data principles. 10% of active projects share data without any
specific license, while 5% provide data only on demand.
Question: How do you share your data with users
outside your project?
Commentary: As of February 2022, all but one of the
active projects provide at least one way of sharing data (whether it is
currently accessible to the public or not, or it is intended to be
accessible in the future). The average (median) number of sharing
methods per project is 2, while the maximum number is 6.
There is no discipline-wide standard data repository as is common in
other disciplines (e.g. TDAR, https://core.tdar.org/, or AriadnePlus, https://ariadne-infrastructure.eu/ for archaeological
data). Thus all projects use either their institutional or national
resources that may or may not be ideal for epigraphic data. Among those
who share data, the Epidoc XML format is the most popular format for
data sharing (14 projects), alongside providing data output upon search
on the project’s website (in whichever format). Open Science practices
do not seem to be a popular choice in digital epigraphy, such as sharing
via public repository, e.g. GitHub (2 projects) or Zenodo (2 projects),
as well as providing raw data in the CSV (comma-separated value) format,
or as JSON (JavaScript Object Notation) files. Computer-automated access
to data is rare and manual human interaction, such as manual selection
and/or manual download of files prevails, potentially hindering any
quantitative and reproducible studies, or the linking of datasets via
automated processes. For example, an API access point is currently
available only for a very limited number of projects.
Closed
projects
This section summarised only the ‘closed/non-active’ projects. For
‘active’ projects, see the section above.
Question: Is the data created by your project
accessible?
Commentary: As of February 2022, 7 of the
participating projects are closed. 71% of them provide access to their
data under a Creative Commons license even though the project is no
longer active, 14% of closed projects provide access without any license
and 14% do not currently provide access to the data they have created
during the live phase of their project, but they are considering making
the data available.
Question: Is the data created by your project
accessible?
Commentary: As of February 2022, 7 of the
participating projects are closed. Out of these closed projects, 57%
provide their data in the Epidoc XML format on their website, 43%
provide their data via public repository on GitHub, 29% via other
publicly accessible repositories. 14% of closed projects dot currently
share data outside the project (=1 project).
The fact that even the closed projects share their data in some form
even after the project is no longer active/does not have funding for
further development or maintenance is positive. However, most of the
data sit on private or institutional websites that can easily disappear,
along with access to the data. The best practice for the longevity of
these created datasets would be archiving them to a publicly accessible
repository, such as GitHub, Zenodo, HAL, Open Science Framework or any
similar archival infrastructure.
Institutional
policies
Question: Does your institution or funding body require
your project to comply with any data policies (e.g. FAIR principles,
data storage, data sharing, Open Science)?
Commentary: 58% of projects do not explicitly have
to follow any policy. 16% of projects are required to comply with data
related policies, while an additional 20% of projects are encouraged to
comply with FAIR data principles but no rules are enforced.
However, some of the projects are already closed and may have been
closed for some time. Data policy requirements have undergone major
changes in the last 5 years, and it is more than likely that such
policies were not previously required, which may be reflected in the
relatively low compliance with FAIR and Open Science data policies.
Question: If you have answered YES in the
previous question, please specify what are the policies, or provide a
link.
Commentary: Data policies in the field of digital
epigraphy are still being implemented and so are not yet reflected in
past and current projects. There is a variation between national
policies amongst our responses, with France and Norway providing
examples in the implementation of Open Science in digital epigraphy.
Additional investigation:
The main factor influencing the need to comply with institutional
principles seems to be the age of the project - for projects created in
recent years (e.g. since 2015), we would expect FAIR data policies to be
one of conditions for securing funding. In order to verify this
hypothesis, we collected additional information manually from project
websites and published materials, such as the official project
start-date, the country of origin of a given project, indications of
existing funding and primary focus of a given project (text publication
or metadata collection). The anonymised data is saved as a TSV in the
same GitHub repository as
/data/02_scoping_survey_anonymised_PostSurvey.tsv
.
Our expectations on data policies being progressively implemented
over the last seven years were confirmed only partially. As
Figure 1 above demonstrates, the number of projects
that indicated an existing institutional data policy grows steadily from
2015 (indicated by brown dashed vertical line). On the contrary, the
number of projects that indicated no existing data policy decreases, but
only relatively slowly. The projects responded N/A
are
those which consider themselves in February 2022 as
closed
.
Figure 2 above shows clear geographic differences in
implementation of data policies based on the main country where the
project is based. France, Germany, and Italy are listed as countries
where data policies are required, yet some projects in Germany and Italy
answered that no data policies are required. Thus the practical
implementation of data policies may depend on the particular funding
agency or institution, rather than on nation-wide policies. We are well
aware that data policies might be different for projects funded from
other sources than national or European research council schemes, where
such requirements may not be compulsory. Our results are only
preliminary and based on a very small sample and need to be confirmed by
further and more detailed investigation.
Open Science
Practice
Question: Are you familiar with the FAIR data
principles?
Commentary: The majority of projects (73%) is
familiar with FAIR data policy, however, 23% of participating projects
are only vaguely familiar and would benefit from clear guidelines
customised for the epigraphic community. Only 4% of projects are not
familiar with FAIR data principles.
Question: Standardized terminologies: The
project uses the following systems:
Commentary: 9% of projects do not use any
standardized lists or vocabularies. Those projects are most likely those
who focus on 3D visualisation of inscriptions or publication of
metadata, rather than publication of text editions. 37% of projects use
their own internal authority lists. EAGLE vocabularies in their original
form are used by 20% of projects, and in an edited version by 17% of
projects. Several projects that focus on languages other than Greek and
Latin have created their own systems, sometimes working from existing
vocabularies, but also building thesauri, e.g. the creation of a
thesaurus such as the OpenTheso tool (EpiVoc) https://thesaurus.mom.fr/opentheso/?idt=th61 aligned
with existing vocabularies or using terms of the community.
Question: Are you willing to share the
standardized terminologies used in your project with us (e.g. type of
inscription vocabularies, type of material etc.)
Commentary: The vast majority of participating
projects (88%) is willing to share any standardized terminologies used
in their project, such as terminologies covering the type of
inscription, the type of material etc.
Question: Linked Open Datasets: The project uses
the following systems:
Commentary: Pleiades is the most popular LOD
dataset, being used in 50% of all participating projects, alongside
Trismegistos also in 50%. EAGLE vocabularies are represented in 35% of
participating projects, while combined prosopographic datasets
(LGPN+PIR) feature in 39% of projects. Only 12% of participating
projects do not use any LOD.
The group of LOD resources focusing on geographic
data (e.g. Pleiades, iDai Gazetteer, Geonames, Trismegistos)
seems to be strongly represented amongst participating non-partnered
projects (77 % use at least one of them), suggesting that geographic LOD
are well established for the study of the ancient world.
Prosopographic data, represented by LGPN, PIR, and
PLRE are used by 35% of all participating non-partnered projects.
Chronological data, represented by Period.O and
GODOT are used by 8 % of all participating non-partnered projects.
It is worth noting that not every category listed amongst the
responses is a true linked open dataset. The survey responses suggest
there is a considerable room for improvement and potentially great
benefit in creating and further improving LOD for the study of the
ancient world.
Future needs of digital
epigraphy
This section covers the wishes of all participating digital epigraphy
projects. The responses were anonymised so no individual or project can
be identified but are otherwise presented as submitted in the
survey.
Partner projects
Question: Our project would like to be able to
use within the next three years:
Commentary: The most popular is the option
Bibliographical references to all epigraphic publications with stable URI (e.g. Zenon)
,
representing the wishes of 85% of all partner projects.
The great interest in prosopographic LOD for epigraphy is supported
by 77% of partner projects for the Roman world and 54% of projects for
the Greek world respectively.
The improved EAGLE vocabularies
are wished for by 77% of
partner projects.
The domain-specific repository for epigraphic data
(discussed also under Other
responses) or the
open and accessible RDF Triplestore
do not seem to be the
highest priority of participating projects, but are still relatively
popular as 38% of respondants wishes for one of the two. One
participating project wishes specifically for the following: Other:
standardised terminologies for instrumentum domesticum and
palaeography.
Question: Potential ideas that our project would
benefit from:
Commentary: 92% of all projects consider that they
would benefit from
A set of guidelines for FAIR and Linked Open Data in epigraphy
.
There is a general interest in practical examples and workshop(s) on how
to use LOD and FAIR Principles in epigraphy, as well as resources for
quantitative analysis of data in epigraphy.
Question: Additional digital needs
## [1] "Further development of a single research portal to interrogate multiple
epigraphic databases; development of a specific API to use the standardized common
vocabularies"
## [2] "- Further collaboration and development of concepts for vocabularies. - Getty
vocabularies crosswalks where they apply - In doing all this work, we hope that FAIR
Epigraphy will use as many different applications of the EpiDoc schema as possible, so as
to accommodate the ways different projects mark up documents and metadata."
## [3] "Sustainable common platform of all digital epigraphic editions (a Vision)"
## [4] "Advisory Board for new Digital Epigraphy projects, guidelines for FAIR epigraphy"
## [5] "Standards for palaeography, prosopography, bibliograpy, instrumentum domesticum
and linguistic analysis"
## [6] "1) Provide us support in switching to Epidoc XML encoding 2) Help us clarify how
our data are accessible to the public (CC-BY 4.0) 3) Promote the sustainability of
projects whose funds have ended 4) Foster interoperability between digital resources 5)
Improve the standardization of projects in digital epigraphy"
Commentary: This section covers the additional needs
of partner projects. Partner projects would like to see a platform
linking epigraphic data from multiple sources, including a stable
reference point or an API for improved epigraphic vocabularies (in other
words, the sort of resource which agreed vocabularies and an RDF
triplestore might facilitate). Partner projects would also like to be
able to use guidelines for FAIR practices in epigraphy, which currently
do not exist.
Non-partnered
projects
Question: Our project would like to be able to
use within the next three years:
Commentary: The most popular is the option
Bibliographical references to all epigraphic publications with stable URI (e.g. Zenon)
representing the wishes of 65% of all participating projects. The great
interest in onomastic and prosopographic LOD for both the Greek and
Roman world is supported by 92% of non-partnered projects. The
improved EAGLE vocabularies
are wished for by 65% of
non-partnered projects. The
domain-specific repository for epigraphic data
(23%) or the
open and accessible RDF Triplestore
(42%) do not seem to be
the highest priority of participating projects, but still a relatively
popular response. One participating project wishes specifically for the
following: Other: Geolocation of inscriptions and searches related to
geography, which other existing projects, such as Pleiades or
Trismegistos, might be better equipped to provide. The differences
between the wishes and answers of the non-partnered projects is
inter alia related to the fact that several partner projects
come from a world beyond Greek and Latin epigraphy.
Question: Potential ideas that our project would
benefit from:
Commentary: 85% of all non-partnered projects
consider that they would benefit from
A set of guidelines for FAIR and Linked Open Data in epigraphy
.
There is a general interest in practical examples (65%) and workshop(s)
on how to use LOD in epigraphy (62%), as well as resources for
quantitative analysis of data in epigraphy (42%).
Question: Additional digital needs
## [1] "Digitalization of Roman Inscriptions for dissemination and research"
## [2] "A workshop on integrating Mycenaean data into epigraphy?"
## [3] "Data retrieval also on spatial base: for example: from maps of the single
archaeological sites and single complexes (as plans or 3d scans of catacombs and
churches...). Links with the existing geographical and georeferenced resources.
Controlled and shared vocabulary about palaeographical features; Storage, search and
analysis of the 'aberrant forms' (not to be 'corrected') for Late Latin and
Late/Byzantine Greek words (and names)."
## [4] "The most important for me would be 1/ to have a more complete view of real FAIR
epigraphic projects and 2/a sustainable \"common place\" where to find resources + tools
and help + let's call it an improved EAGLE + and more \"international\""
## [5] "It would be very nice (but I might be a bit biased!) if FAIR Epigrahy would like
to help develop EFES (EpiDoc Front-End Services). For example by helping to make the
existing RDF data export functionality really usable even by less experienced people."
## [6] "I would love to see it revitalized and improved with FAIR and Linked Open Data
guidelines and other resources."
## [7] "Unicode for Punic"
## [8] "help to act in a shared dedicated academical environment and help in spreading
our results"
## [9] "FAIR Epigraphy's team can help us by providing advice on specifical topics"
## [10] "It would be useful to have an Open Access database of images of inscriptions
that are free from Copyright limits."
Commentary: This section covers additional needs of
participating digital projects. Some of the wishes might be beyond the
scope of the FAIR Epigraphy project but the responses provide valuable
guidance and hint at some of the challenges the epigraphic discipline
will be facing in the near future. The responses may inspire other
projects with similar needs to join forces and potentially develop
solutions together. The FAIR Epigraphy project may offer one channel to
explore and collaborate on the meeting of these needs in future.
Summary
The present report demonstrates a great variation in the epigraphic
discipline in 2022. We received answers from 13 partner projects and 27
non-partnered projects. Although it may seem that a relatively small
number of projects participated in the survey, nontheless, we consider
that responses provide a representative sample of the current state of
the discipline. The response rate of non-partnered projects was lower
than the response rate of partner projects (100 % vs 31 %). This may
reflect the overall lower rate of compliance with FAIR principles, or
the fact that non-partnered projects may have ceased active operation
before FAIR principles were established and implemented by their
institutions and funding bodies.
The responses represent a diverse selection of projects, based mostly
in Europe and the USA. The majority of projects focus predominantly on
publication of textual editions of inscriptions (where Epidoc XML is the
main data format), while some focus on publication of related metadata
without producing new editions of text (and thus use different data
formats than Epidoc XML).
Although the majority of participating projects record inscriptions
in Latin and Greek, we see a diverse array of projects expanding beyond
the traditional focus of the discipline the way as it was established in
the 19th century. The projects participating in the survey include
well-established projects that have existed over several decades,
regional or thematic corpora, and more specialised, short-term PhD
projects. We have observed a clear distinction between, on the one hand,
projects with a long tradition and most importantly with relatively
stable institutional support, which have access to institutional
repositories, policies and at least basic IT services; and on the other,
small-scale projects with limited support and access to resources and
training, typified by short-term projects on a specific topic that may
lack access to long-term institutional support. One of the missions of
the FAIR Epigraphy Project is to support projects with limited access to
resources, as well as established projects, by providing accessible and
comprehensible training and guidelines for FAIR and Linked Open Data
principles in epigraphy.
The established projects mostly follow the FAIR principles, although
to a variable extent. The majority of established projects share their
data under a Creative Commons license in one or more widely accepted
formats (with Epidoc XML being the most popular format for all types of
projects irrespective of their status and longevity). In general, the
more established projects provide more access points to their data as
well as more data formats than the projects with less institutional
support. The use of standardized terminologies is still limited and
project-specific, mostly due to the lack of uniformly accepted
standards. On contrary, the adoption of Linked Open Datasets (LOD) and
creation of links within the epigraphic datasets with stable identifiers
to those LOD sources seems to be fairly advanced, especially in the case
of well-established LOD domains such as Pleiades or Trismegistos for
Graeco-Roman projects, and to a lesser extent the EAGLE
vocabularies.
The non-partnered projects follow the FAIR principles, but to a
lesser degree than the established projects. There are, however, some
short-term projects that fulfill or exceed the requirements for Open
Science, but as a general rule the compliance is lower than in the case
of established projects. The reason for lower compliance in some
projects is most likely a combination of short-term institutional
support, limited access to IT support and poor accessibility of
guidelines and discipline-specific training.
As to the current and future needs of digital epigraphy, there is a
clear demand for more and better LOD. The requests concerned especially
bibliographical references to standard epigraphic corpora,
standardisation of discipline-specific vocabularies, and prosopographic
LOD for the ancient world. In addition, there is a wish for support by
training and the provision of accessible resources and guidelines for
FAIR and Open epigraphy.
In the near future, we plan to undertake several in-depth interviews
with our partners to confirm some of our assumptions and to draft a
concrete plan for the following three years. However, it is clear from
the survey responses, that we should direct our attention to three main
tasks:
- implementing and hosting standards for epigraphic vocabularies
(e.g. inscription type, material, object etc.)
- implementing and hosting standards for bibliographical records
(e.g. stable and unique records for all major epigraphic editions)
- building a platform for FAIR and Open Epigraphy on the
infrastructure provided by the University of Oxford (CSAD), that will
function as an information hub, providing not only training and good
practice examples, but also hosting the resources and tools.
We hope to run a similar survey annually to track any progress within
the discipline and closely monitor changing needs of individual projects
in digital epigraphy.
Bibliography
Assael Y., Sommerschield T., Shillingford B., Bordbar M., Pavlopoulos
J., Chatzipanagiotou M., Androutsopoulos I., Prag J. & Freitas N. de
(2022). Restoring and attributing ancient texts using deep neural
networks. Nature 603 (7900): 280–283.
https://doi.org/10.1038/s41586-022-04448-z.
Bagnall R., Talbert R.J.A., Bond S., Becker J., Elliott T., Gillies S.,
Horne R., McCormick M., Rabinowitz A., Turner B. & Twele R. (2006).
Pleiades:
A community-built gazetteer and graph of ancient
places.
http://pleiades.stoa.org.
Elliott T. (2015). Epigraphy and
Digital
Resources. Vol. 1. Oxford University Press.
https://doi.org/10.1093/oxfordhb/9780195336467.013.005.
Glomb T., Kaše V. & Heřmánková P. (2022). Popularity of the cult of
Asclepius in the times of the
Antonine
Plague:
Temporal modeling of epigraphic
evidence. Journal of Archaeological Science: Reports 43: 103466.
https://doi.org/doi.org/10.1016/j.jasrep.2022.103466.
Heřmánková P., Kaše V. & Sobotkova A. (2021). Inscriptions as data:
Digital epigraphy in macro-historical perspective. Journal of Digital
History 1.
https://journalofdigitalhistory.org/en/issue/jdh001.
Orlandi S. (2021). Digital Projects in
Epigraphy: Research Needs,
Technical Possibilities, and
Funding Problems. In: Velasquéz Soriano I.
& Espinosa Espinosa D. (eds.). Epigraphy in the Digital
Age : Opportunities and challenges in the
Recording, Analysis and
Dissemination of Inscriptions. Archaeopress,
Oxford, p. 1–8.
Roueche C. (2022). Inscriptions of Roman
Tripolitania 2021. The Society for Libyan Studies.
Roueche C., Reynolds J. & Bodard G. (2020). Inscriptions of
Roman Cyrenaica (2020). The Society for Libyan
Studies.
Tupman C. (2021). Where Can Our
Inscriptions Take Us?
Harnessing the Potential of
Linked Open Data for
Epigraphy. In: Velasquéz Soriano I. & Espinosa Espinosa
D. (eds.). Epigraphy in the Digital Age :
Opportunities and Challenges in the
Recording, Analysis and
Dissemination of Inscriptions. Archaeopress,
Oxford, p. 115–128.
Wilkinson M.D., Dumontier M., Aalbersberg Ij.J., Appleton G., Axton M.,
Baak A., Blomberg N., Boiten J.-W., Silva Santos L.B. da, Bourne P.E.,
Bouwman J., Brookes A.J., Clark T., Crosas M., Dillo I., Dumon O.,
Edmunds S., Evelo C.T., Finkers R., Gonzalez-Beltran A., Gray A.J.G.,
Groth P., Goble C., Grethe J.S., Heringa J., Hoen P.A.C. ’t, Hooft R.,
Kuhn T., Kok R., Kok J., Lusher S.J., Martone M.E., Mons A., Packer
A.L., Persson B., Rocca-Serra P., Roos M., Schaik R. van, Sansone S.-A.,
Schultes E., Sengstag T., Slater T., Strawn G., Swertz M.A., Thompson
M., Lei J. van der, Mulligen E. van, Velterop J., Waagmeester A.,
Wittenburg P., Wolstencroft K., Zhao J. & Mons B. (2016). The
FAIR Guiding Principles for
scientific data management and stewardship. Scientific Data 3 (1):
160018.
https://doi.org/10.1038/sdata.2016.18.
LS0tCnRpdGxlOiB8CiAgIVtdKC4uL2Fzc2V0cy9iYW5uZXIucG5nKXt3aWR0aD0zaW59ICAKICBEaWdpdGFsIEVwaWdyYXBoeSBpbiAyMDIyXltUaGlzIHdvcmsgd2FzIHN1cHBvcnRlZCBieSB0aGUgQXJ0cyBhbmQgSHVtYW5pdGllcyBSZXNlYXJjaCBDb3VuY2lsIChBSFJDKSBbZ3JhbnQgbnVtYmVyIEFIL1cwMTA2ODIvMV07IGFuZCB0aGUgRGV1dHNjaGUgRm9yc2NodW5nc2dlbWVpbnNjaGFmdCAoREZHKSBbZ3JhbnQgbnVtYmVyIDQ2ODQ1NTk3MV0uIFRoZSByZXBvcnQgaXMgcHVibGlzaGVkIHZpYSBaZW5vZG8sIGh0dHBzOi8vZG9pLm9yZy8xMC41MjgxL3plbm9kby42NjEwNjk2XSAKc3VidGl0bGU6ICdBIFJlcG9ydCBmcm9tIHRoZSBTY29waW5nIFN1cnZleSBvZiB0aGUgRkFJUiBFcGlncmFwaHkgUHJvamVjdCcKYXV0aG9yOgotIFBldHJhIEhlxZltw6Fua292w6FeW0pvaGFubmVzIEd1dGVuYmVyZyBVbml2ZXJzaXR5IGluIE1haW56LCBwZXRyYS5oZXJtYW5rb3ZhQHVuaS5tYWluei5kZSwgaHR0cHM6Ly9vcmNpZC5vcmcvMDAwMC0wMDAyLTYzNDktMDU0MF0KLSBNYXJpZXR0YSBIb3JzdGVyXltKb2hhbm5lcyBHdXRlbmJlcmcgVW5pdmVyc2l0eSBpbiBNYWlueiwgQ29ycHVzIEluc2NyaXB0aW9udW0gTGF0aW5hcnVtL0JCQVcsIGhvcnN0ZXJAdW5pLm1haW56LmRlLCBodHRwczovL29yY2lkLm9yZy8wMDAwLTAwMDMtMTQzNC0yMjRYXQotIEpvbmF0aGFuIFByYWdeW1VuaXZlcnNpdHkgb2YgT3hmb3JkLCBqb25hdGhhbi5wcmFnQG1lcnRvbi5veC5hYy51aywgaHR0cHM6Ly9vcmNpZC5vcmcvMDAwMC0wMDAzLTM4MTktODUzN10KZGF0ZTogImByIGZvcm1hdChTeXMudGltZSgpLCAnJWQgJUIsICVZJylgIgpvdXRwdXQ6CiAgaHRtbF9kb2N1bWVudDoKICAgIGNzczogLi4vInN0eWxlLmNzcyIKICAgIGRmX3ByaW50OiBwYWdlZAogICAgI2ZvbnRzaXplOiAxMnB0CiAgICBoaWdobGlnaHQ6IG1vbm9jaHJvbWUKICAgIG51bWJlcl9zZWN0aW9uczogeWVzCiAgICBzbW9vdGhfc2Nyb2xsOiB5ZXMKICAgIHRoZW1lOiBwYXBlcgogICAgdG9jOiB5ZXMKICAgIHRvY19kZXB0aDogNAogICAgdG9jX2Zsb2F0OiB5ZXMKICAgIGNvZGVfZG93bmxvYWQ6IHllcwogICAgZmlnX2NhcHRpb246IHllcwogIHBkZl9kb2N1bWVudDoKICAgIHRvYzogdHJ1ZQogICAgdG9jX2RlcHRoOiAnMycKICAgIGRmX3ByaW50OiBrYWJsZQogICAgaGlnaGxpZ2h0OiB0YW5nbwogICAga2VlcF90ZXg6IHRydWUKICAgICNsYXRleF9lbmdpbmU6IHBkZmxhdGV4CiAgICBsYXRleF9lbmdpbmU6IHhlbGF0ZXgKICAgIGZpZ19jYXB0aW9uOiB5ZXMKICAgIGluY2x1ZGVzOgogICAgICBpbl9oZWFkZXI6ICIuLi9wcmVhbWJsZS50ZXgiCiAgd29yZF9kb2N1bWVudDoKICAgIHRvYzogeWVzCiAgICB0b2NfZGVwdGg6ICc0Jwpjc2w6IGh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9jaXRhdGlvbi1zdHlsZS1sYW5ndWFnZS9zdHlsZXMvbWFzdGVyL3Jlc2VhcmNoLWluc3RpdHV0ZS1mb3ItbmF0dXJlLWFuZC1mb3Jlc3QuY3NsCmxpbmstY2l0YXRpb25zOiB5ZXMKem90ZXJvOiB5ZXMKYmlibGlvZ3JhcGh5OiAuLi9kYXRhL2JpYmxpb2dyYXBoeS5iaWIKZGVzY3JpcHRpb246IG51bGwKZm9udHNpemU6IDEycHQKdXJsY29sb3I6IGJsdWUKY2l0ZWNvbG9yOiBjeWFuCmRvY3VtZW50Y2xhc3M6IHNjcnJlcHJ0Cmdlb21ldHJ5OiBtYXJnaW49MWluCiN0aGFua3M6ICJUaGlzIHdvcmsgd2FzIHN1cHBvcnRlZCBieSB0aGUgQXJ0cyBhbmQgSHVtYW5pdGllcyBSZXNlYXJjaCBDb3VuY2lsIChBSFJDKSBbZ3JhbnQgbnVtYmVyIEFIL1cwMTA2ODIvMV07IGFuZCB0aGUgRGV1dHNjaGUgRm9yc2NodW5nc2dlbWVpbnNjaGFmdCAoREZHKSBbZ3JhbnQgbnVtYmVyIDQ2ODQ1NTk3MV0uIgphYnN0cmFjdDogIlRoaXMgZG9jdW1lbnQgbWFwcyB0aGUgc3RhdGUgb2YgZGlnaXRhbCBlcGlncmFwaHkgaW4gMjAyMiwgd2l0aCBhIGZvY3VzIG9uIE9wZW4gU2NpZW5jZSBwcmFjdGljZXMgYW5kIGFjY2Vzc2liaWxpdHkgb2YgcmVzb3VyY2VzLiBUaGUgcmVwb3J0IGlzIGJhc2VkIG9uIGFub255bWlzZWQgcmVzcG9uc2VzIHJlY2VpdmVkIGR1cmluZyB0aGUgZGlnaXRhbCBzdXJ2ZXkgY2lyY3VsYXRpbmcgYmV0d2VlbiBGZWJydWFyeSBhbmQgQXByaWwgMjAyMiwgb3JnYW5pc2VkIGJ5IHRoZSBGQUlSIEVwaWdyYXBoeSBQcm9qZWN0LiBUaGUgcmVzcG9uc2VzIGNvdmVyIGEgYnJvYWQgc3BlY3RydW0gb2YgcHJvamVjdHMgZnJvbSBFdXJvcGUgYW5kIHRoZSBVU0EsIHJhbmdpbmcgZnJvbSB3ZWxsIGVzdGFibGlzaGVkIHByb2plY3RzIHdpdGggIHJlbGF0aXZlbHkgc3RhYmxlIGluc3RpdHV0aW9uYWwgc3VwcG9ydCB0byBzaG9ydC10ZXJtIHByb2plY3RzIHdpdGggbW9yZSBuYXJyb3cgZm9jdXMgYW5kIGxpbWl0ZWQgYWNjZXNzIHRvIElUIHN1cHBvcnQgYW5kIGZ1bmRpbmcuIFRoZSByZXN1bHRzIG9mIHRoZSBzdXJ2ZXkgd2lsbCBiZSB1c2VkIHRvIGluZm9ybSB0aGUgcGxhbm5pbmcgb2YgdGhlIEZBSVIgRXBpZ3JhcGh5IHByb2plY3QgaW4gdGhlIGZvbGxvd2luZyB0aHJlZSB5ZWFycy4gVGhlIHJlcG9ydCBpcyBmdWxseSByZXByb2R1Y2libGUgKHdyaXR0ZW4gaW4gUiBwcm9ncmFtbWluZyBsYW5ndWFnZSkgYW5kIGFsb25nIHdpdGggdGhlIGFub255bWlzZWQgZGF0YSBpcyBhY2Nlc3NpYmxlIHZpYSBpdHMgb3duIEdpdEh1YiByZXBvc2l0b3J5IChodHRwczovL2dpdGh1Yi5jb20vRkFJUi1lcGlncmFwaHkvc2NvcGluZ19zdXJ2ZXlfcmVwb3J0KSwgYW5kIHB1Ymxpc2hlZCB0aHJvdWdoIFplbm9kbyAoaHR0cHM6Ly9kb2kub3JnLzEwLjUyODEvemVub2RvLjY2MTA2OTYpLiIKa2V5d29yZHM6ICJpbnNjcmlwdGlvbnMsIGRpZ2l0YWwtZXBpZ3JhcGh5LCBGQUlSIGRhdGEgcHJpbmNpcGxlcywgTGlua2VkIE9wZW4gRGF0YSwgc3VydmV5IgotLS0KCmBgYHtjc3Mgc3R5bGUgc2V0dGluZ3MsIGVjaG8gPSBGQUxTRX0KYmxvY2txdW90ZSB7CiAgICBwYWRkaW5nOiAxMHB4IDIwcHg7CiAgICBtYXJnaW46IDAgMCAyMHB4OwogICAgZm9udC1zaXplOiAxMnB4OwogICAgYm9yZGVyLWxlZnQ6IDVweCBzb2xpZCAjZWVlOwp9CmBgYAoKYGBge3Igc2V0dXAsIGluY2x1ZGU9RkFMU0V9CmtuaXRyOjpvcHRzX2NodW5rJHNldChlY2hvID0gRkFMU0UpCmtuaXRyOjpvcHRzX2NodW5rJHNldChtZXNzYWdlPUZBTFNFLCB0aWR5Lm9wdHM9bGlzdCh3aWR0aC5jdXRvZmY9NjApLCB0aWR5PVRSVUUpIApsaWJyYXJ5KHRpZHl2ZXJzZSkKbGlicmFyeShrbml0cikKCmhvb2tfb3V0cHV0ID0ga25pdF9ob29rcyRnZXQoJ291dHB1dCcpCmtuaXRfaG9va3Mkc2V0KG91dHB1dCA9IGZ1bmN0aW9uKHgsIG9wdGlvbnMpIHsKICAjIHRoaXMgaG9vayBpcyB1c2VkIG9ubHkgd2hlbiB0aGUgbGluZXdpZHRoIG9wdGlvbiBpcyBub3QgTlVMTAogIGlmICghaXMubnVsbChuIDwtIG9wdGlvbnMkbGluZXdpZHRoKSkgewogICAgeCA9IGtuaXRyOjo6c3BsaXRfbGluZXMoeCkKICAgICMgYW55IGxpbmVzIHdpZGVyIHRoYW4gbiBzaG91bGQgYmUgd3JhcHBlZAogICAgaWYgKGFueShuY2hhcih4KSA+IG4pKSB4ID0gc3Ryd3JhcCh4LCB3aWR0aCA9IG4pCiAgICB4ID0gcGFzdGUoeCwgY29sbGFwc2UgPSAnXG4nKQogIH0KICBob29rX291dHB1dCh4LCBvcHRpb25zKQp9KQoKZGVmLmNodW5rLmhvb2sgIDwtIGtuaXRyOjprbml0X2hvb2tzJGdldCgiY2h1bmsiKQprbml0cjo6a25pdF9ob29rcyRzZXQoY2h1bmsgPSBmdW5jdGlvbih4LCBvcHRpb25zKSB7CiAgeCA8LSBkZWYuY2h1bmsuaG9vayh4LCBvcHRpb25zKQogIHBhc3RlMCgiXG4gXFwiLCAiZm9vdG5vdGVzaXplIiwiXG5cbiIsIHgsICJcblxuIFxcbm9ybWFsc2l6ZSIpCn0pCgpgYGAKCiMgSW50cm9kdWN0aW9uCgpUaGUgZmllbGQgb2YgZGlnaXRhbCBlcGlncmFwaHkgaGFzIHNlZW4gc2lnbmlmaWNhbnQgZGV2ZWxvcG1lbnQgaW4gcmVjZW50IHllYXJzOiBub3Qgb25seSBhcmUgdHJhZGl0aW9uYWwgZXBpZ3JhcGhpYyBjb3Jwb3JhIGluY3JlYXNpbmdseSBiZWluZyBkaWdpdGlzZWQgYW5kIG1hZGUgYWNjZXNzaWJsZSB2aWEgdGhlaXIgd2Vic2l0ZXMgZm9yIGFueW9uZSB0byBicm93c2UgYW5kIHNlYXJjaCBidXQgc2V2ZXJhbCByZXNvdXJjZXMgYXJlIGFscmVhZHkgYm9ybiBkaWdpdGFsIHdpdGhvdXQgYW55IHByaW50ZWQgZWRpdGlvbiwgZS5nLiAqSW5zY3JpcHRpb25zIG9mIEdyZWVrIEN5cmVuYWljYSogW0Byb3VlY2hlX2luc2NyaXB0aW9uc18yMDIwXSwgKkluc2NyaXB0aW9ucyBvZiBSb21hbiBUcmlwb2xpdGFuaWEqIFtAcm91ZWNoZV9pbnNjcmlwdGlvbnNfMjAyMl07IGZvciBtb3JlIHNlZSBbQGJydXVuX2VwaWdyYXBoeV8yMDE1XS4gTW9zdCBpbnNjcmlwdGlvbnMgY29udGFpbiByZWZlcmVuY2VzIHRvIHBsYWNlcywgcGVvcGxlIG9yIGV2ZW50cywgb3IgY29udGFpbiBkYXRhIHJlbGF0ZWQgdG8gdGhlIHBsYWNlIGFuZCB0aW1lIG9mIHRoZWlyIGNyZWF0aW9uIGFuZCBwcm92aWRlIGFuIGlkZWFsIHJlc291cmNlIHRvIHN0dWR5IHBhc3QgY29tbXVuaXRpZXMgYXMgYSB3aG9sZS4gSG93ZXZlciwgaW4gb3JkZXIgdG8gYmUgYWJsZSB0byBoYXJuZXNzIHRoZWlyIGZ1bGwgcG90ZW50aWFsIGFuZCBmb3IgZXhhbXBsZSBhY2Nlc3MgKmFsbCogaW5zY3JpcHRpb25zIGZyb20gYSBwbGFjZSBvZiBpbnRlcmVzdCBvciBvZiBhIGdpdmVuIHR5cGUsIHdlIG5lZWQgdG8gbGluayB0aGUgZXhpc3RpbmcgZGF0YXNldHMgdG9nZXRoZXIuIFRoZSBjb25jZXB0IG9mICpMaW5rZWQgT3BlbiBEYXRhKiAoTE9EKSBwcm92aWRlcyBhIG1lYW5zIG9mIGNvbm5lY3RpbmcgdmFyaW91cyBkaWdpdGFsIGRhdGFzZXRzIHdoaWxlIGVucmljaGluZyB0aGUgdGV4dCB3aXRoLCBlLmcuIGJyb2FkZXIgc3BhdGlvLXRlbXBvcmFsIGNvbnRleHQgb3IgcHJvc29wb2dyYXBoaWMgZGF0YSwgbGVhZGluZyB0byB0aGUgY3JlYXRpb24gb2YgbmV3IGNvbm5lY3Rpb25zIGJldHdlZW4gaW5kaXZpZHVhbCBpbnNjcmlwdGlvbnMgYXMgd2VsbCBhcyBhcmNoYWVvbG9naWNhbCBzaXRlcyBvciBwb3RlbnRpYWwgcmUtZXZhbHVhdGlvbiBvZiBoaXN0b3JpY2FsIG5hcnJhdGl2ZXMgW0BiYWduYWxsX3BsZWlhZGVzXzIwMDY7IEB0dXBtYW5fd2hlcmVfMjAyMTsgQGdlc2VyX3dwMTVfMjAxNl0uIEFsdGhvdWdoIG1hbnkgZXBpZ3JhcGhpYyBkYXRhc2V0cyBoYXZlIGJlZW4gdXNpbmcgTE9ELCBlc3BlY2lhbGx5IHRvIHJlY29yZCB0aGUgc3BhdGlhbCBjb21wb25lbnQgYnkgdXNpbmcgc2VydmljZXMgc3VjaCBhcyBQbGVpYWRlcyBvciBUcmlzbWVnaXN0b3MsIHRoZXJlIGlzIHN0aWxsIGEgY29uc2lkZXJhYmxlIGdhcCBpbiB0aGUgTE9EIGltcGxlbWVudGF0aW9uIGFjcm9zcyB0aGUgZGlzY2lwbGluZSBhbmQgdGh1cyBpbiB0aGUgYWNjZXNzaWJpbGl0eSBvZiB0aGUgZGF0YS4KCkFuIGluZGl2aWR1YWwgZGF0YXNldCB0aGF0IGlzIG5vdCBtb3JlIHdpZGVseSBhY2Nlc3NpYmxlIG9yIGludGVyb3BlcmFibGUgaXMgb2YgY29uc2lkZXJhYmxlIHZhbHVlIHRvIGdyb3VwcyBzaGFyaW5nIHNpbWlsYXIgaW50ZXJlc3RzIChlLmcuIGdlb2dyYXBoaWMgYXJlYSwgY2hyb25vbG9naWNhbCBwZXJpb2QsIGxpbmd1aXN0aWMgZW52aXJvbm1lbnQpLCBidXQgb2YgbXVjaCBtb3JlIGxpbWl0ZWQgdmFsdWUgdG8gdGhlIGVwaWdyYXBoaWMgZGlzY2lwbGluZSBhcyBhIHdob2xlLiBUaGUgdmFsdWUgb2YgTE9EIGxpZXMgaW4gYmVpbmcgYWJsZSB0byBidWlsZCBvbiB0aGUgZWZmb3J0cyBhbmQgaW52ZXN0bWVudCBvZiBudW1lcm91cyBnZW5lcmF0aW9ucyBvZiBlcGlncmFwaGVycyB3aG8gb3ZlciBtYW55IHllYXJzIGhhdmUgcHJvZHVjZWQgbXVsdGlwbGUgaGlnaC1xdWFsaXR5IGVkaXRpb25zIGluIGZpcnN0IGFuYWxvZ3VlIGFuZCBtb3JlIHJlY2VudGx5IGFsc28gZGlnaXRhbCBmb3JtLiBXaGV0aGVyIHRoZXJlIGlzIG9uZSBtYXN0ZXIgZGF0YWJhc2UgY29ubmVjdGluZyBhbGwgdGhlIGluc2NyaXB0aW9ucyB0b2dldGhlciwgb3Igbm90LCBvbmNlIHRoZSBkYXRhIGlzICoqRkFJUioqICgqRmluZGFibGUqLCAqQWNjZXNzaWJsZSosICpJbnRlcm9wZXJhYmxlKiwgKlJldXNhYmxlKiBbQHdpbGtpbnNvbl9mYWlyXzIwMTZdKSBhbmQgbGlua2VkIHRvIG90aGVyIExPRCwgbmV3IGF2ZW51ZXMgb2YgcmVzZWFyY2ggb3BlbiAtIGVpdGhlciB0byBsYXJnZSBzY2FsZSwgY29tcGFyYXRpdmUgc3R1ZGllcyBzdWNoIGFzIFtAaGVybWFua292YV9pbnNjcmlwdGlvbnNfMjAyMTsgQGFzc2FlbF9yZXN0b3JpbmdfMjAyMjsgQGdsb21iX3BvcHVsYXJpdHlfMjAyMl0gb3IgcHJvamVjdHMgd29ya2luZyBvbiB0aGUgc2FtZSBtYXRlcmlhbCBidXQgd2l0aCBkaWZmZXJlbnQgZW1waGFzZXMgW0B3aWxsaV9tYW51YWxfMjAyMTsgQG11bGxlbl9tYW51YWxfMjAyMV0uIE9uY2UgdGhlIGRhdGEgaXMgbGlua2VkLCB0aGVyZSBpcyBubyBuZWVkIHRvIGJ1aWxkIG9uZSBjZW50cmFsIHJlcG9zaXRvcnksIHdoaWNoIGlzIG9mdGVuIGNvc3RseSBhbmQgdW5zdXN0YWluYWJsZSBpbiB0aGUgbG9uZyBydW4gYXMgZG9jdW1lbnRlZCBieSB0aGUgcmVjZW50IGV4cGVyaWVuY2Ugb2YgdGhlIEVBR0xFIFBvcnRhbCBbQG9ybGFuZGlfZGlnaXRhbF8yMDIxXSwgYnV0IGluc3RlYWQgb25lIGNhbiBlbXBvd2VyIGluZGl2aWR1YWwgdXNlcnMgYW5kIHByb3ZpZGUgdGhlbSB3aXRoIGNsZWFyIGd1aWRlbGluZXMgYW5kIHNraWxscyBvbiBob3cgdG8gd29yayB3aXRoIExPRCBpbiBlcGlncmFwaHkuCgpUaGUgKipGQUlSIEVwaWdyYXBoeSoqIFByb2plY3QgKDxodHRwczovL3d3dy5jc2FkLm94LmFjLnVrL2ZhaXItZXBpZ3JhcGh5PikgYWltcyB0byBmaWxsIGluIHRoZSBnYXAgYmV0d2VlbiB0aGUgZGlnaXRpc2F0aW9uIG9mIGluc2NyaXB0aW9ucyBhbmQgdGhlIHJlYWxpc2F0aW9uIG9mIGJlaW5nIGFibGUgdG8gdXNlIHRoZWlyIGZ1bGwgcG90ZW50aWFsIGFzIGEgZGlnaXRhbCByZXNvdXJjZS4gVGhlIEZBSVIgRXBpZ3JhcGh5IHByb2plY3QgaGFzIGJlZW4gZXN0YWJsaXNoZWQgYXMgYSBjb2xsYWJvcmF0aW9uIGJldHdlZW4gSm9oYW5uZXMgR3V0ZW5iZXJnIFVuaXZlcnNpdHkgaW4gTWFpbnogKFByb2YuIE1hcmlldHRhIEhvcnN0ZXIpIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBPeGZvcmQgKFByb2YuIEpvbmF0aGFuIFByYWcpLCBmdW5kZWQgYnkgdGhlIEFydHMgYW5kIEh1bWFuaXRpZXMgUmVzZWFyY2ggQ291bmNpbCAoQUhSQykgYW5kIERldXRzY2hlIEZvcnNjaHVuZ2VtZWluc2NoYWZ0IChERkcpIGFuZCB3aWxsIHJ1biBmb3IgMzYgbW9udGhzLCBmcm9tIDIwMjIgdG8gMjAyNS4gKipGQUlSIEVwaWdyYXBoeSoqIGFpbXMgdG8gY3JlYXRlIGFuIGludGVyYWN0aXZlIHBsYXRmb3JtIGZvciBhbGwgZXBpZ3JhcGhpYyBwcm9qZWN0cywgYWxpZ25pbmcgdGhlaXIgZGlnaXRhbCBuZWVkcyB3aXRoIHRoZSBwcmluY2lwbGVzIG9mIEZBSVIgc2NpZW5jZS4gVGhlIG92ZXJhbGwgZGVzaXJhYmlsaXR5IG9mICoqRkFJUioqIC0gKkZpbmRhYmxlKiwgKkFjY2Vzc2libGUqLCAqSW50ZXJvcGVyYWJsZSosICpSZXVzYWJsZSogW0B3aWxraW5zb25fZmFpcl8yMDE2XSAtIGRhdGEgaXMgZnVuZGFtZW50YWwgZm9yIGFkdmFuY2luZyByZXNlYXJjaCBpbnRvIHRoZSBlcGlncmFwaGljLCBsaW5ndWlzdGljLCBhbmQgbWF0ZXJpYWwgY3VsdHVyZSBvZiB0aGUgYW5jaWVudCB3b3JsZC4KCj4gKiJUaGUgcHJpbmNpcGxlcyBlbXBoYXNpc2UgbWFjaGluZS1hY3Rpb25hYmlsaXR5IChpLmUuIHRoZSBjYXBhY2l0eSBvZiBjb21wdXRhdGlvbmFsIHN5c3RlbXMgdG8gZmluZCwgYWNjZXNzLCBpbnRlcm9wZXJhdGUsIGFuZCByZXVzZSBkYXRhIHdpdGggbm9uZSBvciBtaW5pbWFsIGh1bWFuIGludGVydmVudGlvbikgYmVjYXVzZSBodW1hbnMgaW5jcmVhc2luZ2x5IHJlbHkgb24gY29tcHV0YXRpb25hbCBzdXBwb3J0IHRvIGRlYWwgd2l0aCBkYXRhIGFzIGEgcmVzdWx0IG9mIHRoZSBpbmNyZWFzZSBpbiB2b2x1bWUsIGNvbXBsZXhpdHksIGFuZCBjcmVhdGlvbiBzcGVlZCBvZiBkYXRhLiIqIChGQUlSIFByaW5jaXBsZXMgd2Vic2l0ZSwgPGh0dHBzOi8vd3d3LmdvLWZhaXIub3JnL2ZhaXItcHJpbmNpcGxlcy8+KQoKV2l0aCB0aGUgaW5jcmVhc2UgaW4gTGlua2VkIE9wZW4gRGF0YSBhbmQgbm92ZWwgaW50ZXJmYWNlIHRlY2hub2xvZ2llcyBhbmQgc3RhbmRhcmRzLCB0aGUgRkFJUiBFcGlncmFwaHkgUHJvamVjdCB3aWxsIGJlIGFibGUgdG8gY3JlYXRlIHRoZSB0b29scyBhbmQgdGhlIGNvbW11bml0eSBuZWVkZWQgdG8gdHJhbnNmb3JtIGVwaWdyYXBoaWMgcmVzZWFyY2ggaW4gdGhlIGRpZ2l0YWwgYWdlLiBIb3dldmVyLCBGQUlSIEVwaWdyYXBoeSBkb2VzIG5vdCB3aXNoIHRvIHJlcGxpY2F0ZSBhbnkgY3VycmVudCBlZmZvcnRzLCBidXQgcmF0aGVyIHRvIGFsaWduIGV4aXN0aW5nIGluaXRpYXRpdmVzIGFuZCBicmluZyB0aGVtIHRvZ2V0aGVyIHRvIGNyZWF0ZSBhIGh1YiBvZiBoaWdoLXF1YWxpdHkgdG9vbHMgYW5kIEZBSVIgY29tcGxpYW50IHN0YW5kYXJkcyBhbmQgcmVzb3VyY2VzIGZvciB0aGUgbW9kZXJuIGVwaWdyYXBoaWMgZGlzY2lwbGluZS4gT3VyIGludGVybmF0aW9uYWxseSBjb2xsYWJvcmF0aXZlIGFwcHJvYWNoIHdpbGwgZW5hYmxlIGFuZCBzdXBwb3J0IGlubm92YXRpdmUgcmVzZWFyY2ggYWNyb3NzIGVwaWdyYXBoaWMgZGF0YSBhbmQgdGhlIHdpZGVyIGxpbmtlZCB3ZWIgb2YgZGF0YSAoZXNwZWNpYWxseSBhcmNoYWVvbG9naWNhbCBkYXRhKSwgc3VjaCB0aGF0IGFsbCBlcGlncmFwaGljIGRhdGEgaXMgaW5jcmVhc2luZ2x5IEZBSVIgZm9yIGJvdGggdGhlIHJlc2VhcmNoIGNvbW11bml0eSBhbmQgdGhlIHdpZGVyIHB1YmxpYy4gVG8gdGhpcyBlbmQsIHdlIGFpbSB0bzoKCjEuICBjb25zb2xpZGF0ZSBjb21tdW5pdHktd2lkZSBzdGFuZGFyZHMgKHZvY2FidWxhcmllcyBhbmQgb250b2xvZ3kpOwoyLiAgaG9zdCBhbmQgbWFrZSBmdWxseSBhY2Nlc3NpYmxlIHRoZSByZXN1bHRpbmcgbGlua2VkIG9wZW4gZGF0YSBwdWJsaXNoZWQgYnkgaW5kaXZpZHVhbCBwcm9qZWN0cyAoUkRGL1hNTCBkYXRhIHB1YmxpY2F0aW9uKTsKMy4gIGRldmVsb3AgdGhlIHRvb2xzIGZvciBjb21tdW5pdHkgaW1wbGVtZW50YXRpb24gb2YgdGhvc2Ugc3RhbmRhcmRzICh2b2NhYnVsYXJ5IGFuZCBvbnRvbG9neSBob3N0aW5nIGFuZCBwdWJsaWNhdGlvbik7CjQuICBwcm92aWRlIHN1cHBvcnQgdG8gbWVtYmVycyBvZiB0aGUgY29tbXVuaXR5IGluIGltcGxlbWVudGluZyB0aGUgc3RhbmRhcmRzIHdpdGhpbiBleGlzdGluZyBhbmQgbmV3IHByb2plY3RzLgoKSW4gb3JkZXIgdG8gbWFwIHRoZSBleGlzdGluZyBmaWVsZCBvZiBkaWdpdGFsIGVwaWdyYXBoeSBpbmNsdWRpbmcgY3VycmVudCBwcmFjdGljZXMgYW5kIHN0YW5kYXJkcywgYXMgd2VsbCBhcyB0byBjbGFyaWZ5IHRoZSAoZGlnaXRhbCkgbmVlZHMgb2YgdGhlIGRpc2NpcGxpbmUsIHdlIGNpcmN1bGF0ZWQgdHdvIHNjb3Bpbmcgc3VydmV5cyBiZXR3ZWVuIEZlYnJ1YXJ5IGFuZCBBcHJpbCAyMDIyIChbKipGQUlSIEVwaWdyYXBoeTogU2NvcGluZyBzdXJ2ZXkgZm9yIHBhcnRuZXJzIGFuZCBjb2xsYWJvcmF0b3JzKipdKGh0dHBzOi8vZ2l0aHViLmNvbS9GQUlSLWVwaWdyYXBoeS9zY29waW5nX3N1cnZleV9yZXBvcnQvZGF0YS8wMV9TdXJ2ZXlfcGFydG5lcnNfcXVlc3Rpb25zLnBkZikgYW5kIFsqKkRpZ2l0YWwgZXBpZ3JhcGh5IGluIDIwMjI6IHNjb3Bpbmcgc3VydmV5KipdKGh0dHBzOi8vZ2l0aHViLmNvbS9GQUlSLWVwaWdyYXBoeS9zY29waW5nX3N1cnZleV9yZXBvcnQvZGF0YS8wMl9TdXJ2ZXlfcHJvamVjdHNfcXVlc3Rpb25zLnBkZikgZm9yIGFsbCBkaWdpdGFsIGVwaWdyYXBoeSBwcm9qZWN0cykuIFRoZSByZXN1bHRzIG9mIHRoZSBzdXJ2ZXlzIHByZXNlbnRlZCBpbiB0aGUgY3VycmVudCByZXBvcnQgd2lsbCBiZSB1c2VkIHRvIHBsYW4gdGhlIGFjdGl2aXRpZXMgYW5kIGVmZmljaWVudGx5IGFsbG9jYXRlIHRoZSByZXNvdXJjZXMgb2YgdGhlIEZBSVIgRXBpZ3JhcGh5IFByb2plY3QgaW4gdGhlIGZvbGxvd2luZyB0aHJlZSB5ZWFycy4gVGhlIHJlcG9ydCBjb250YWlucyBvbmx5IHRoZSBhbnN3ZXJzIHdoZXJlIHBhcnRpY2lwYW50cyBnYXZlIGNvbnNlbnQgdG8gcHVibGlzaCB0aGUgYW5vbnltaXNlZCByZXNwb25zZXMuIEluIGNhc2VzIHdoZXJlIHRoZSBjb25zZW50IHdhcyBub3QgZ2l2ZW4sIHRoZSBkYXRhIGlzIHVzZWQgdG8gaW5mb3JtIHRoZSBGQUlSIEVwaWdyYXBoeSBkZWNpc2lvbiBidXQgaXMgZXhjbHVkZWQgZnJvbSB0aGUgcmVwb3J0LgoKVGhlIHN1cnZleSBhbnN3ZXJzIGFyZSBhbm9ueW1pc2VkIHNvIHRoYXQgaW5kaXZpZHVhbCBwcm9qZWN0cyBjYW5ub3QgYmUgaWRlbnRpZmllZCBvbiB0aGUgYmFzaXMgb2YgdGhlaXIgcmVwbGllcyBhbmQgdGhlIGRhdGEgaXMgc3RvcmVkIGFzIGEgVFNWICh0YWItc2VwYXJhdGVkIHZhbHVlKSBmaWxlIHdpdGhpbiB0aGUgcHJvamVjdCdzIEdpdEh1YiByZXBvc2l0b3J5ICg8aHR0cHM6Ly9naXRodWIuY29tL0ZBSVItZXBpZ3JhcGh5L3Njb3Bpbmdfc3VydmV5X3JlcG9ydC8+KSBhcyBhIHN1cHBsZW1lbnQgdG8gdGhlIHRleHQgb2YgdGhpcyByZXBvcnQgYW5kIGNhbiBiZSBhY2Nlc3NlZCB1bmRlciB0aGUgQ0MtQlktU0EgNC4wIEludGVybmF0aW9uYWwgTGljZW5zZS4gVGhlIHJlcG9ydCBpcyBwcm9kdWNlZCBpbiB0d28gZm9ybWF0czogYSB0cmFkaXRpb25hbCBQREYgKGF2YWlsYWJsZSBhdCA8aHR0cHM6Ly9naXRodWIuY29tL0ZBSVItZXBpZ3JhcGh5L3Njb3Bpbmdfc3VydmV5X3JlcG9ydC9ibG9iL21haW4vc2NyaXB0cy8wMV9GQUlSX2VwaV9yZXBvcnQucGRmPikgYW5kIGFuIGludGVyYWN0aXZlIEhUTUwgcGFnZSB3aGVyZSB0aGUgcmVhZGVyIGNhbiBicm93c2UgdGhyb3VnaCB0aGUgcmVzcG9uc2VzIChhdmFpbGFibGUgYXQgPGh0dHBzOi8vZmFpci1lcGlncmFwaHkuZ2l0aHViLmlvL3Njb3Bpbmdfc3VydmV5X3JlcG9ydC9zY3JpcHRzLzAxX0ZBSVJfZXBpX3JlcG9ydC5odG1sPikuICpJZiB5b3UgYXJlIHZpZXdpbmcgdGhpcyByZXBvcnQgaW4gdGhlIEhUTUwgZm9ybWF0LCB0byBicm93c2UgdGhlIGRhdGEgY2xpY2sgb24gdGhlIGFycm93IGluIHRoZSB0b3AgcmlnaHQgY29ybmVyIG9mIHRoZSBkYXRhIHRhYmxlcyBpbiBlYWNoIHNlY3Rpb24gKHdoZXJlIHRoZSBhcnJvdyBpcyBhdmFpbGFibGUpLioKCioqRGlzY2xhaW1lcioqOiBUaGUgdmlld3MgYW5kIG9waW5pb25zIGV4cHJlc3NlZCB3aXRoaW4gdGhlIHN1cnZleSAocHJlc2VudGVkIGluIHRhYmxlcykgZG8gbm90IG5lY2Vzc2FyaWx5IHJlZmxlY3QgdGhlIHZpZXdzIG9yIHBvc2l0aW9ucyBvZiB0aGUgRkFJUiBFcGlncmFwaHkgUHJvamVjdCBpdHNlbGYuCgojIEZBSVIgRXBpZ3JhcGh5IHBhcnRuZXIgcHJvamVjdHMKCmBgYHtyIGRhdGFfcGFydG5lcnMsIGluY2x1ZGU9RkFMU0V9CiMgbG9hZGluZyBkYXRhIGZyb20gVFNWIGZpbGUKcGFydG5lcnNfYWxsPC0gcmVhZF90c3YoIi4uL2RhdGEvMDFfc2NvcGluZ19zdXJ2ZXlfYW5vbnltaXNlZC50c3YiKQpgYGAKCmBgYHtyLCBpbmx1ZGU9RkFMU0V9CiNmaWx0ZXJpbmcgb3V0IHBhcnRuZXJzIHdobyBkaWQgbm90IGdpdmUgY29uc2VudCB0byBwdWJsaXNoIHRoZSBhbm9ueW1pc2VkIGRhdGEKCnBhcnRuZXJzIDwtIHBhcnRuZXJzX2FsbCAlPiUgCiAgZmlsdGVyKGBEbyB5b3UgY29uc2VudCBvbiBwdWJsaXNoaW5nIHRoZSBhbm9ueW1pc2VkIGRhdGEgaW4gdGhlIGZvcm0gb2Ygd3JpdHRlbiBzaG9ydCByZXBvcnQgb3BlbiB0byBwdWJsaWMgYW5kIGFjY2Vzc2libGUgdmlhIHRoZSBGQUlSIEVwaWdyYXBoeSBpbmZyYXN0cnVjdHVyZSAod2Vic2l0ZSwgR2l0SHViLCBUd2l0dGVyKT8gWW91IGNhbiBhbHdheXMgcmV2b2tlIHlvdXIgY29uc2VudCBieSBzZW5kaW5nIGFuIGVtYWlsIHRvIHBldHJhLmhlcm1hbmtvdmFAdW5pLW1haW56LmRlYCA9PSAiWWVzLCBJIGdpdmUgbXkgY29uc2VudCIgfCBgRG8geW91IGNvbnNlbnQgb24gcHVibGlzaGluZyB0aGUgYW5vbnltaXNlZCBkYXRhIGluIHRoZSBmb3JtIG9mIHdyaXR0ZW4gc2hvcnQgcmVwb3J0IG9wZW4gdG8gcHVibGljIGFuZCBhY2Nlc3NpYmxlIHZpYSB0aGUgRkFJUiBFcGlncmFwaHkgaW5mcmFzdHJ1Y3R1cmUgKHdlYnNpdGUsIEdpdEh1YiwgVHdpdHRlcik/IFlvdSBjYW4gYWx3YXlzIHJldm9rZSB5b3VyIGNvbnNlbnQgYnkgc2VuZGluZyBhbiBlbWFpbCB0byBwZXRyYS5oZXJtYW5rb3ZhQHVuaS1tYWluei5kZWAgPT0gIlllcywgSSBnaXZlIG15IGNvbnNlbnQ7IE5vIHB1Ymxpc2hpbmcgb24gc29jaWFsIG1lZGlhIikKYGBgCgpUaGlzIHNlY3Rpb24gc3VtbWFyaXNlcyB0aGUgcmVzdWx0cyBvZiB0aGUgb25saW5lIHN1cnZleSBbKkZBSVIgRXBpZ3JhcGh5OiBTY29waW5nIHN1cnZleSBmb3IgcGFydG5lcnMgYW5kIGNvbGxhYm9yYXRvcnMqXShodHRwczovL2dpdGh1Yi5jb20vRkFJUi1lcGlncmFwaHkvc2NvcGluZ19zdXJ2ZXlfcmVwb3J0L2RhdGEvMDFfU3VydmV5X3BhcnRuZXJzX3F1ZXN0aW9ucy5wZGYpIGFpbWVkIGF0IHRob3NlIGVzdGFibGlzaGVkIGRpZ2l0YWwgcHJvamVjdHMgd2hpY2ggYXJlIGFscmVhZHkgb2ZmaWNpYWwgcGFydG5lcnMgYW5kIGNvbGxhYm9yYXRvcnMgb2YgdGhlIEZBSVIgRXBpZ3JhcGh5IFByb2plY3QuIFdlIHNlbnQgdGhlIHN1cnZleSB0byAxNCBwYXJ0bmVyIHByb2plY3RzLiBXZSByZWNlaXZlZCBgciBucm93KHBhcnRuZXJzX2FsbClgIHJlc3BvbnNlcyB0byB0aGUgc3VydmV5LCBhIHJlc3BvbnNlIHJhdGUgb2YgYHIgcm91bmQoKG5yb3cocGFydG5lcnMpKS8wLjE0KWAlIHdpdGggc29tZSBwYXJ0aWNpcGFudHMgcmVzcG9uZGluZyBvbiBiZWhhbGYgb2YgdHdvIHByb2plY3RzIGNvbWJpbmVkIGludG8gb25lIHJlc3BvbnNlIChhbmQgdGh1cyBza2V3aW5nIHRoZSByZXNwb25zZSByYXRlKS4gYHIgcm91bmQobnJvdyhwYXJ0bmVycykvKG5yb3cocGFydG5lcnNfYWxsKS8xMDApKWAlIG9mIHBhcnRpY2lwYXRpbmcgcGFydG5lciBwcm9qZWN0cyBnYXZlIGNvbnNlbnQgdG8gcHVibGlzaCB0aGVpciBhbm9ueW1pc2VkIHJlc3BvbnNlcyBhcyBwYXJ0IG9mIHRoaXMgcmVwb3J0LgoKVGhlIHBhcnRuZXIgcHJvamVjdHMgcmVwcmVzZW50IHN1Y2Nlc3NmdWwgcHJvamVjdHMgd2l0aCB0aGUgYXZlcmFnZSBkdXJhdGlvbiBvZiBhIHByb2plY3QgYmVpbmcgYHIgbWVkaWFuKGFzLm51bWVyaWMocGFydG5lcnMkTGVuZ3RoX251bWVyaWNfeWVhcnMpKWAgeWVhcnMuIFRoZSBzaG9ydGVzdCBwYXJ0aWNpcGF0aW5nIHByb2plY3QgcmVwb3J0ZWQgdGhlaXIgZHVyYXRpb24gYXMgYHIgbWluKGFzLm51bWVyaWMocGFydG5lcnMkTGVuZ3RoX251bWVyaWNfeWVhcnMpKWAgeWVhcnMgYW5kIHRoZSBsb25nZXN0IGFzIGByIG1heChhcy5udW1lcmljKHBhcnRuZXJzJExlbmd0aF9udW1lcmljX3llYXJzKSlgIHllYXJzLl5bT2J2aW91c2x5IG5vdCBkaWdpdGFsIGZvciB0aGUgd2hvbGUgb2YgdGhhdCBwZXJpb2QuXQoKIyMgTGFuZ3VhZ2UgY292ZXJhZ2UKCioqUXVlc3Rpb246KiogKldoYXQgaXMgdGhlIHByZWRvbWluYW50IGxhbmd1YWdlIG9mIGVwaWdyYXBoaWMgZGF0YSBpbiB5b3VyIHByb2plY3QgKGZvciBtaXhlZCBjb2xsZWN0aW9ucyBvciBjb2xsZWN0aW9ucyB3aGVyZSBvdGhlciBsYW5ndWFnZXMgYXJlIHByZWRvbWluYW50IHByb3ZpZGUgZGV0YWlscyBpbiBPdGhlcikqW14xXQoKW14xXTogSWYgeW91IGFyZSB2aWV3aW5nIHRoaXMgcmVwb3J0IGluIHRoZSBIVE1MIGZvcm1hdCwgeW91IGNhbiBjbGljayBvbiB0aGUgYXJyb3cgaW4gdGhlIHRvcCByaWdodCBjb3JuZXIgb2YgdGhlIHRhYmxlIHRvIHNlZSBtb3JlIGRhdGEgKHdoZXJlIGF2YWlsYWJsZSkuIFRoaXMgZnVuY3Rpb25hbGl0eSBpcyBub3QgYXZhaWxhYmxlIGluIHRoZSBQREYgZm9ybWF0LgoKYGBge3J9CnBhcnRuZXJzX2xhbmd1YWdlIDwtIGFzLmRhdGEuZnJhbWUodW5saXN0KHN0cl9zcGxpdChwYXJ0bmVycyRMYW5ndWFnZV9jbGVhbiwgIjsgIikpKQpjb2xuYW1lcyhwYXJ0bmVyc19sYW5ndWFnZSkgPC0gYygibGFuZ3VhZ2UiKQoKcGFydG5lcnNfbGFuZ3VhZ2VfcmF0aW8gPC0gcGFydG5lcnNfbGFuZ3VhZ2UgJT4lIAogIGNvdW50KGxhbmd1YWdlLCBzb3J0PVQpICU+JSAKICBtdXRhdGUocmF0aW8gPSByb3VuZChuLyhzdW0obikvMTAwKSkpCnBhcnRuZXJzX2xhbmd1YWdlX3JhdGlvCmBgYAoKYGBge3IsfQpwYXJ0bmVyX2xhbmd1YWdlX2NvdW50PC0gc3RyX2NvdW50KHBhcnRuZXJzJExhbmd1YWdlX2NsZWFuLCAiOyIpKzEKYGBgCgoqKkNvbW1lbnRhcnk6KiogVGhlIGxhbmd1YWdlIGNvdmVyYWdlIG9mIHRoZSBwYXJ0aWNpcGF0aW5nIHByb2plY3RzIGNvbnNpc3RzIHByZWRvbWluYW50bHkgb2YgTGF0aW4gYW5kIEdyZWVrIGVpdGhlciBhbG9uZSBvciBpbiBjb21iaW5hdGlvbiAocmVwcmVzZW50aW5nIGByIHN1bShwYXJ0bmVyc19sYW5ndWFnZV9yYXRpbyRyYXRpb1twYXJ0bmVyc19sYW5ndWFnZV9yYXRpbyRsYW5ndWFnZSAlaW4lIGMoIkdyZWVrIiwgIkxhdGluIildKWAlIG9mIHRoZSBhbnN3ZXJzKS4gYHIgbGVuZ3RoKHBhcnRuZXJfbGFuZ3VhZ2VfY291bnRbcGFydG5lcl9sYW5ndWFnZV9jb3VudD09MV0pYCBwYXJ0aWNpcGF0aW5nIHByb2plY3RzIHJlY29yZCBpbnNjcmlwdGlvbnMgaW4gb25lIGxhbmd1YWdlIG9ubHksIHdoaWxlIGByIGxlbmd0aChwYXJ0bmVyX2xhbmd1YWdlX2NvdW50W3BhcnRuZXJfbGFuZ3VhZ2VfY291bnQ+MV0pYCBjb250YWluIGluc2NyaXB0aW9ucyBpbiB0d28gb3IgbW9yZSBsYW5ndWFnZXMgKGByIG1heChwYXJ0bmVyX2xhbmd1YWdlX2NvdW50KWAgYmVpbmcgdGhlIG1heGltdW0gbnVtYmVyIG9mIGxpc3RlZCBsYW5ndWFnZXMgaW4gb25lIHByb2plY3QuKQoKVGhlIGBPdGhlcmAgKGkuZS4gb3RoZXIgdGhhbiBHcmVlayBhbmQgTGF0aW4pIGNhdGVnb3J5IGVuY29tcGFzc2VkIGEgc3Vic3RhbnRpYWwgcGFydCBvZiB0aGUgc3VydmV5ZWQgcHJvamVjdHMgKGByIDEwMC1zdW0ocGFydG5lcnNfbGFuZ3VhZ2VfcmF0aW8kcmF0aW9bcGFydG5lcnNfbGFuZ3VhZ2VfcmF0aW8kbGFuZ3VhZ2UgJWluJSBjKCJHcmVlayIsICJMYXRpbiIpXSlgJSksIGRvY3VtZW50aW5nIHRoZSBuZWVkIHRvIGV4cGFuZCBiZXlvbmQgdGhlIHRyYWRpdGlvbmFsIExhdGluIGFuZCBHcmVlayBmb2N1cyBvZiB0aGUgY2xhc3NpY2FsIGVwaWdyYXBoaWMgZGlzY2lwbGluZS4gVGhlIGxhbmd1YWdlcyBsaXN0ZWQgYXMgYE90aGVyYCBjb25zaXN0ZWQgb2YgKmByIHBhcnRuZXJzX2xhbmd1YWdlX3JhdGlvJGxhbmd1YWdlWzQ6MTRdYCouIEl0IGlzLCBob3dldmVyLCB3b3J0aCBub3RpbmcgdGhhdCB0aGUgbWFqb3JpdHkgb2YgcGFydGljaXBhdGluZyBwcm9qZWN0cyByZWNvcmQgbGFuZ3VhZ2VzIGZyb20gdGhlIHdpZGVyIE1lZGl0ZXJyYW5lYW4vRXVyb3BlYW4gbGluZ3Vpc3RpYyBzcGFjZS4KCioqVW5pcXVlIGNvbWJpbmF0aW9ucyBvZiBsYW5ndWFnZXMgYXMgcmV0cmlldmVkIGZyb20gdGhlIHN1cnZleToqKgoKYGBge3J9CmFzLmRhdGEuZnJhbWUodW5pcXVlKHBhcnRuZXJzJExhbmd1YWdlX2NsZWFuKSkKYGBgCgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiMjIElUIGluZnJhc3RydWN0dXJlCgoqKlF1ZXN0aW9uKio6ICpEb2VzIHRoZSBwcm9qZWN0IGhhdmUgYSB3ZWJzaXRlPyoKCmBgYHtyfQpwYXJ0bmVycyAlPiUgCiAgY291bnQoV2Vic2l0ZSkKYGBgCgoqKkNvbW1lbnRhcnkqKjogQWxsIG9mIHRoZSBwYXJ0aWNpcGF0aW5nIHByb2plY3RzIGN1cnJlbnRseSBtYWludGFpbiBhbiBvbmxpbmUgcHJlc2VuY2UgKGFzIG9mIEZlYnJ1YXJ5LUFwcmlsIDIwMjIpLgoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgoqKlF1ZXN0aW9uKio6ICpEb2VzIHlvdXIgcHJvamVjdCBoYXZlIGFuIElUIHNwZWNpYWxpc3Qocyk/KgoKYGBge3J9CklUIDwtIHBhcnRuZXJzICU+JSAKICBjb3VudChgRG9lcyB5b3UgcHJvamVjdCBoYXZlIGFuIElUIHNwZWNpYWxpc3Qocyk/YCwgc29ydD1UKSAlPiUgCiAgcmVuYW1lKElUX3NwZWMgPSBgRG9lcyB5b3UgcHJvamVjdCBoYXZlIGFuIElUIHNwZWNpYWxpc3Qocyk/YCkgJT4lIAogIG11dGF0ZShyYXRpbyA9IHJvdW5kKG4vKHN1bShuKS8xMDApKSkKSVQKYGBgCgoqKkNvbW1lbnRhcnkqKjogVGhlIG1ham9yaXR5IG9mIHRoZSBkaWdpdGFsIHBhcnRuZXIgcHJvamVjdHMgaGF2ZSBhbiBJVCBzcGVjaWFsaXN0LCB5ZXQgb25seSBgciBzdW0oSVQkbltJVCRJVF9zcGVjICVpbiUgYygiWWVzLCBlcXVpdmFsZW50IG9mIGZ1bGwtdGltZSAoMS4wIEZURSkgcG9zaXRpb24iLCJZZXMsIGVxdWl2YWxlbnQgb2YgbW9yZSB0aGFuIGZ1bGwtdGltZSAoPjEuMCBGVEUpIHBvc2l0aW9uIildKWAgcHJvamVjdHMgaGF2ZSBhbiBlcXVpdmFsZW50IG9mIDEuMCBGVEUgb3IgbW9yZSBhdCB0aGVpciBkaXNwb3NhbC4gYHIgcm91bmQoSVQkcmF0aW9bSVQkSVRfc3BlYyA9PSAiWWVzLCBlcXVpdmFsZW50IG9mIHBhcnQtdGltZSAoPDEuMCBGVEUpIHBvc2l0aW9uIl0pYCAlIG9mIHByb2plY3RzIGhhdmUgYWNjZXNzIHRvIHBhcnQtdGltZSBJVCBzdXBwb3J0IGZvciB0aGVpciBwcm9qZWN0cywgd2hpY2ggaW4gc29tZSBpbnN0YW5jZXMgbWF5IGJlIG9ubHkgYSBmZXcgaG91cnMgcGVyIHdlZWsgcGVyIHByb2plY3QuIGByIHN1bShJVCRuW0lUJElUX3NwZWMgJWluJSBjKCJObyIsIldlIHBhaWQgc29tZSBzcGVjaWFsaXN0cywgYnV0IGN1cnJlbnRseSB3ZSBoYXZlIG5vIGJ1ZGdldCBmb3IgdGhlbSAoYW5kIHRoaXMgaXMgYSBwcm9ibGVtLCBldmVuIGZvciB0aGUgc3VzdGFpbmFiaWxpdHkgYW5kIG9yZGluYXJ5IG1haW50YWluYW5jZSBvZiBvdXIgZGlnaXRhbCBhc3NldHMpIildKWAgcHJvamVjdHMgcmVwb3J0ZWQgbm8gYXZhaWxhYmlsaXR5IG9mIElUIHN1cHBvcnQsIGV2ZW4gb24gYSBwYXJ0LXRpbWUgYmFzaXMgKHJlcHJlc2VudGluZyBgciByb3VuZChzdW0oSVQkbltJVCRJVF9zcGVjICVpbiUgYygiTm8iLCJXZSBwYWlkIHNvbWUgc3BlY2lhbGlzdHMsIGJ1dCBjdXJyZW50bHkgd2UgaGF2ZSBubyBidWRnZXQgZm9yIHRoZW0gKGFuZCB0aGlzIGlzIGEgcHJvYmxlbSwgZXZlbiBmb3IgdGhlIHN1c3RhaW5hYmlsaXR5IGFuZCBvcmRpbmFyeSBtYWludGFpbmFuY2Ugb2Ygb3VyIGRpZ2l0YWwgYXNzZXRzKSIpXSkvKG5yb3cocGFydG5lcnMpLzEwMCkpYCUgb2YgcGFydGljaXBhdGluZyBwYXJ0bmVyIHByb2plY3RzKS4KCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKKipRdWVzdGlvbioqOiAqRG9lcyB5b3VyIHByb2plY3Qgc3RvcmUgZXBpZ3JhcGhpYyBkYXRhIGluIHRoZSBmb2xsb3dpbmcgZm9ybWF0cy4uLj8qCgpgYGB7cn0KZm9ybWF0IDwtIHBhcnRuZXJzICU+JSAKICBjb3VudChgT3VyIHByb2plY3RzIHN0b3JlcyBlcGlncmFwaGljIGRhdGEgaW4gdGhlIGZvbGxvd2luZyBmb3JtYXRzYCwgc29ydD1UKSAlPiUgCiAgcmVuYW1lKGZvcm1hdCA9IGBPdXIgcHJvamVjdHMgc3RvcmVzIGVwaWdyYXBoaWMgZGF0YSBpbiB0aGUgZm9sbG93aW5nIGZvcm1hdHNgKSAlPiUgCiAgbXV0YXRlKG5vX2Zvcm1hdCA9IHN0cl9jb3VudChmb3JtYXQsICIsIikgKyAxKQpmb3JtYXQKYGBgCgpgYGB7cn0KZXBpZG9jIDwtIHN1bShzdHJfZGV0ZWN0KHBhcnRuZXJzJGBPdXIgcHJvamVjdHMgc3RvcmVzIGVwaWdyYXBoaWMgZGF0YSBpbiB0aGUgZm9sbG93aW5nIGZvcm1hdHNgLCAiRXBpZG9jIFhNTCIpKQpqc29uIDwtIHN1bShzdHJfZGV0ZWN0KHBhcnRuZXJzJGBPdXIgcHJvamVjdHMgc3RvcmVzIGVwaWdyYXBoaWMgZGF0YSBpbiB0aGUgZm9sbG93aW5nIGZvcm1hdHNgLCAiSlNPTiIpKQpyZGYgPC0gc3VtKHN0cl9kZXRlY3QocGFydG5lcnMkYE91ciBwcm9qZWN0cyBzdG9yZXMgZXBpZ3JhcGhpYyBkYXRhIGluIHRoZSBmb2xsb3dpbmcgZm9ybWF0c2AsICJSREYiKSkKY3N2IDwtIHN1bShzdHJfZGV0ZWN0KHBhcnRuZXJzJGBPdXIgcHJvamVjdHMgc3RvcmVzIGVwaWdyYXBoaWMgZGF0YSBpbiB0aGUgZm9sbG93aW5nIGZvcm1hdHNgLCAiQ1NWIikpCnNxbCA8LSBzdW0oc3RyX2RldGVjdChwYXJ0bmVycyRgT3VyIHByb2plY3RzIHN0b3JlcyBlcGlncmFwaGljIGRhdGEgaW4gdGhlIGZvbGxvd2luZyBmb3JtYXRzYCwgIlNRTCIpKQpgYGAKCioqQ29tbWVudGFyeSoqOiBUaGUgbWFqb3JpdHkgb2YgcHJvamVjdHMgdXNlIGBFcGlkb2MgWE1MYCBhcyB0aGVpciBtYWluIG91dHB1dCBkYXRhIGZvcm1hdCAoYHIgcm91bmQoZXBpZG9jLyhucm93KHBhcnRuZXJzKS8xMDApKWAlIG9mIHBhcnRpY2lwYXRpbmcgcHJvamVjdHMpLCBlaXRoZXIgaW4gY29tYmluYXRpb24gd2l0aCBvdGhlciBmb3JtYXRzIG9yIGFzIHRoZSBzb2xlIGRhdGEgZm9ybWF0LiBPdGhlciBkYXRhIGZvcm1hdHMgYXJlIHJlcHJlc2VudGVkIGxlc3MgZnJlcXVlbnRseTogSlNPTiAoYHIgcm91bmQoanNvbi8obnJvdyhwYXJ0bmVycykvMTAwKSlgJSksIFJERiAoYHIgcm91bmQocmRmLyhucm93KHBhcnRuZXJzKS8xMDApKWAlKSwgU1FMIChgciByb3VuZChzcWwvKG5yb3cocGFydG5lcnMpLzEwMCkpYCUpIGFuZCBDU1YgKGByIHJvdW5kKGNzdi8obnJvdyhwYXJ0bmVycykvMTAwKSlgJSkuIGByIHJvdW5kKChzdW0oZm9ybWF0JG5vX2Zvcm1hdCA9PSAxKSkvKG5yb3cocGFydG5lcnMpLzEwMCkpYCUgb2YgcHJvamVjdHMgdXNlIG9ubHkgb25lIHR5cGUgb2YgZGF0YSBmb3JtYXQsIHdoaWxlIGByIHJvdW5kKChzdW0oZm9ybWF0JG5vX2Zvcm1hdCA+IDEpKS8obnJvdyhwYXJ0bmVycykvMTAwKSlgJSB1c2UgdHdvIG9yIG1vcmUgZGF0YSBmb3JtYXQgdHlwZXMgd2l0aGluIHRoZWlyIHByb2plY3QuCgojIyBEYXRhIHNoYXJpbmcKCioqUXVlc3Rpb24qKjogKkRvIHlvdSBzaGFyZSB5b3VyIGRhdGEgb3V0c2lkZSBvZiB5b3VyIHByb2plY3Q/KgoKYGBge3J9CnNoYXJlPC0gcGFydG5lcnMgJT4lIAogIGNvdW50KGBEbyB5b3Ugc2hhcmUgeW91ciBkYXRhIG91dHNpZGUgb2YgeW91ciBwcm9qZWN0YCwgc29ydD1UKSAlPiUgCiAgcmVuYW1lKHNoYXJlID0gYERvIHlvdSBzaGFyZSB5b3VyIGRhdGEgb3V0c2lkZSBvZiB5b3VyIHByb2plY3RgKSAlPiUgCiAgbXV0YXRlKHJhdGlvID0gcm91bmQoKG4vKHN1bShuKS8xMDApKSkpCnNoYXJlCmBgYAoKKipDb21tZW50YXJ5Kio6IEFsbCBwYXJ0bmVyIHByb2plY3RzIHJlcG9ydGVkIHRoZWlyIHdpbGxpbmduZXNzIHRvIHNoYXJlIHRoZSBkYXRhLCBldmVuIGlmIHRoZXkgYXJlIG5vdCBjdXJyZW50bHkgZG9pbmcgc28sIG9yIGlmIHRoZXkgcHJvdmlkZSB0aGUgZGF0YSBvbmx5IG9uIGRlbWFuZC4gYHIgc2hhcmUkcmF0aW9bc2hhcmUkc2hhcmUgPT0iWWVzLCB1bmRlciBhIENyZWF0aXZlIENvbW1vbnMgbGljZW5zZSJdYCUgb2YgcGFydG5lciBwcm9qZWN0cyBzaGFyZSB0aGUgZGF0YSB1bmRlciBhIENyZWF0aXZlIENvbW1vbnMgbGljZW5zZSAoPGh0dHBzOi8vY3JlYXRpdmVjb21tb25zLm9yZy8+KSwgd2hpY2ggaXMgdGhlIHByZWZlcnJlZCBtb2RlIGFjY29yZGluZyB0byB0aGUgRkFJUiBkYXRhIHByaW5jaXBsZXMuIFRoZSBtYWpvcml0eSBvZiBwYXJ0bmVycyB3aGljaCBhcmUgY3VycmVudGx5IG5vdCB1c2luZyBDcmVhdGl2ZSBDb21tb25zIGxpY2Vuc2VzIGFyZSBjb25zaWRlcmluZyB0aGVpciB1c2UgaW4gdGhlIGZ1dHVyZS4KCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKKipRdWVzdGlvbioqOiAqSG93IGRvIHlvdSBzaGFyZSB5b3VyIGRhdGEgd2l0aCB1c2VycyBvdXRzaWRlIHlvdXIgcHJvamVjdD8qCgpgYGB7cn0Kb3V0c2hhcmU8LSBwYXJ0bmVycyAlPiUgCiAgY291bnQoYEhvdyBkbyBzaGFyZSB5b3VyIGRhdGEgd2l0aCB1c2VycyBvdXRzaWRlIHlvdXIgcHJvamVjdGAsIHNvcnQ9VCkgJT4lIAogIHJlbmFtZShzaGFyZV9hbGwgPSBgSG93IGRvIHNoYXJlIHlvdXIgZGF0YSB3aXRoIHVzZXJzIG91dHNpZGUgeW91ciBwcm9qZWN0YCkgJT4lIAogIG11dGF0ZShzaGFyZV9tZXRob2QgPSBzdHJfY291bnQoc2hhcmVfYWxsLCAiOyAiKSArIDEpIAoKb3V0c2hhcmUKYGBgCgoqKkNvbW1lbnRhcnkqKjogQWxsIHBhcnRuZXIgcHJvamVjdHMgcHJvdmlkZSBhdCBsZWFzdCBvbmUgd2F5IG9mIHNoYXJpbmcgdGhlIGRhdGEgKHdoZXRoZXIgaXQgaXMgY3VycmVudGx5IGFjY2Vzc2libGUgdG8gdGhlIHB1YmxpYyBvciBub3QsIG9yIGl0IGlzIGludGVuZGVkIHRvIGJlIGFjY2Vzc2libGUgaW4gdGhlIGZ1dHVyZSkuIFRoZSBhdmVyYWdlIChtZWRpYW4pIG51bWJlciBvZiBzaGFyaW5nIG1ldGhvZHMgcGVyIHByb2plY3QgaXMgYHIgbWVkaWFuKG91dHNoYXJlJHNoYXJlX21ldGhvZClgLgoKYGBge3IgZmlnMSwgZmlnLndpZHRoPTEwLCBmaWcuYWxpZ249ImNlbnRlciIsIGZpZy5jYXA9IkZpZ3VyZSBzaG93aW5nIHRoZSBwb3B1bGFyaXR5IG9mIGluZGl2aWR1YWwgc2hhcmluZyBtZXRob2RzIGFuZCBmb3JtYXRzIGFjcm9zcyBwYXJ0bmVyIHByb2plY3RzLiJ9CgpzaGFyaW5nc2VydiA8LSBhcy5kYXRhLmZyYW1lKHVubGlzdChzdHJfc3BsaXQocGFydG5lcnMkYEhvdyBkbyBzaGFyZSB5b3VyIGRhdGEgd2l0aCB1c2VycyBvdXRzaWRlIHlvdXIgcHJvamVjdGAsICI7ICIpKSkKY29sbmFtZXMoc2hhcmluZ3NlcnYpIDwtIGMoInNlcnZpY2UiKQoKCnNoYXJpbmdfc2VydmljZSA8LSBzaGFyaW5nc2VydiAlPiUgCiAgY291bnQoc2VydmljZSwgc29ydD0gVCkgCgpzaGFyaW5ncGxvdDwtIHNoYXJpbmdfc2VydmljZSAlPiUgCiAgZ2dwbG90KCkgKyAKICBnZW9tX2NvbChhZXMoeT0gcmVvcmRlcihzZXJ2aWNlLCAtbiksIHg9IG4sIGZpbGwgPSBuKSwgd2lkdGggPSAwLjkpICsgCiAgc2NhbGVfeV9kaXNjcmV0ZShsYWJlbHMgPSBmdW5jdGlvbih4KSBzdHJfd3JhcCh4LCB3aWR0aCA9IDc1KSkgICsKICBnZ3RpdGxlKCJOdW1iZXIgb2Ygc2hhcmluZyBtZXRob2RzIHBlciBwcm9qZWN0IikgKwogIHhsYWIoIlNoYXJpbmcgbWV0aG9kIikgKyB5bGFiKCJOdW1iZXIgb2YgcHJvamVjdHMiKSArCiAgI2Nvb3JkX2ZsaXAoKSArCiAgdGhlbWVfYncoKSArCiAgI2Nvb3JkX2NhcnRlc2lhbih4bGltID0gYygwLCA1KSkgKwogIHRoZW1lKGF4aXMudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gOSkpICsKICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMykpCnNoYXJpbmdwbG90CmBgYAoKQXMgc2VlbiBpbiAqKkZpZ3VyZSAxKiosIGRpcmVjdCBkb3dubG9hZCBvZiB0aGUgRXBpZG9jIFhNTCBpcyBieSBmYXIgdGhlIG1vc3QgcG9wdWxhciBmb3JtYXQgZm9yIGRhdGEgc2hhcmluZyAoaW1wbGVtZW50ZWQgYnkgYHIgc3VtKHN0cl9jb3VudChvdXRzaGFyZSRzaGFyZV9hbGwsIkluZGl2aWR1YWwgRXBpZG9jIFhNTHMgb3IgRXBpZG9jIFhNTCBkdW1wcyBvbiB0aGUgd2Vic2l0ZSIpKWAgcHJvamVjdHMpLCBob3dldmVyIG90aGVyIE9wZW4gU2NpZW5jZSBzZXJ2aWNlcyBhcmUgc3RhcnRpbmcgdG8gbWFrZSB0aGVpciB3YXkgaW50byBlc3RhYmxpc2hlZCBkaWdpdGFsIGVwaWdyYXBoeSBwcm9qZWN0cywgc3VjaCBhcyBzaGFyaW5nIHZpYSBhIHB1YmxpYyByZXBvc2l0b3J5LCBpbXBsZW1lbnRlZCBieSBgciBzdW0oc3RyX2NvdW50KG91dHNoYXJlJHNoYXJlX2FsbCwiR2l0SHViIikpYCAoR2l0SHViKSBhbmQgYHIgc3VtKHN0cl9jb3VudChvdXRzaGFyZSRzaGFyZV9hbGwsIlplbm9kbyIpKWAgKFplbm9kbykgcHJvamVjdHMgcmVzcGVjdGl2ZWx5LCBhcyB3ZWxsIGFzIHByb3ZpZGluZyByYXcgZGF0YSBpbiB0aGUgQ1NWIChjb21tYS1zZXBhcmF0ZWQgdmFsdWUpIGZvcm1hdCAoYHIgc3VtKHN0cl9jb3VudChvdXRzaGFyZSRzaGFyZV9hbGwsIkNTViIpKS8yYCBwcm9qZWN0cyksIG9yIGFzIEpTT04gKEphdmFTY3JpcHQgT2JqZWN0IE5vdGF0aW9uKSBmaWxlcyAoYHIgc3VtKHN0cl9jb3VudChvdXRzaGFyZSRzaGFyZV9hbGwsIkpTT04iKSkvMmAgcHJvamVjdHMpLiBBIG1pbm9yaXR5IG9mIHBhcnRpY2lwYXRpbmcgcGFydG5lciBwcm9qZWN0cyBzaGFyZXMgdGhlIGRhdGEgb24gYW4gb24tZGVtYW5kIGJhc2lzIG9yIGhhdmUgYSBub24tcHVibGljIEFQSSBhY2Nlc3MgcG9pbnQgdG8gdGhlaXIgZGF0YS4KCiMjIEluc3RpdHV0aW9uYWwgcG9saWNpZXMKCioqUXVlc3Rpb246KiogKkRvZXMgeW91ciBpbnN0aXR1dGlvbiBvciBmdW5kaW5nIGJvZHkgcmVxdWlyZSB5b3VyIHByb2plY3QgdG8gY29tcGx5IHdpdGggYW55IGRhdGEgcG9saWNpZXMgKGUuZy4gRkFJUiBwcmluY2lwbGVzLCBkYXRhIHN0b3JhZ2UsIGRhdGEgc2hhcmluZywgT3BlbiBTY2llbmNlKT8qCgpgYGB7cn0KcG9saWNpZXMgPC0gcGFydG5lcnMgJT4lIAogIG11dGF0ZShwb2xpY2llcyA9IGBEb2VzIHlvdXIgaW5zdGl0dXRpb24gb2YgZnVuZGluZyBib2R5IHJlcXVpcmUgeW91ciBwcm9qZWN0IHRvIGNvbXBseSB3aXRoIGFueSBkYXRhIHBvbGljaWVzIChlLmcuLCBGQUlSIHByaW5jaXBsZXMsIGRhdGEgc3RvcmFnZSwgZGF0YSBzaGFyaW5nLCBPcGVuIFNjaWVuY2UpP2ApICU+JSAKICBjb3VudChwb2xpY2llcywgc29ydD1UKSAlPiUgCiAgbXV0YXRlKHJhdGlvID0gcm91bmQoKG4vKHN1bShuKS8xMDApKSkpCnBvbGljaWVzCmBgYAoKKipDb21tZW50YXJ5Kio6IFRoZSBtYWpvcml0eSBvZiBwcm9qZWN0cyAocmVwcmVzZW50ZWQgYnkgYHIgcG9saWNpZXMkcmF0aW9bcG9saWNpZXMkcG9saWNpZXMgPT0gIlllcyJdYCUpIGFyZSByZXF1aXJlZCB0byBjb21wbHkgd2l0aCBkYXRhLXJlbGF0ZWQgcG9saWN5IGludHJvZHVjZWQgZWl0aGVyIGJ5IHRoZWlyIGluc3RpdHV0aW9uIG9yIGEgZnVuZGluZyBib2R5LiBgciBzdW0ocG9saWNpZXMkcmF0aW9bcG9saWNpZXMkcG9saWNpZXMgJWluJSBjKCJObyIsICJOb3QgeWV0IiwgIlRoZSBFUkMgb3BlbiBkYXRhIHBvbGljaWVzIGRvbid0IGFwcGx5IHRvIHRoaXMgcHJvamVjdCwgYnV0IHdlIGFyZSBmb2xsb3dpbmcgdGhlbSBhbnl3YXkuIiwgIlRoaXMgaXMgYW4gb2JqZWN0aXZlLCBidXQgbm90IGN1cnJlbnRseSBhIHJlcXVpcmVtZW50IG9mIHRoZSBwcm9qZWN0LiIpXSlgJSBvZiBwYXJ0bmVyIHByb2plY3RzIGFyZSBub3QgcmVxdWlyZWQgdG8gZm9sbG93IGFueSBkYXRhIHBvbGljeSwgYnV0IHNvbWUgZm9sbG93IG9uZSBvbiBhIHZvbHVudGFyeSBiYXNpcy4KCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKKipRdWVzdGlvbioqOiAqSWYgeW91IGhhdmUgYW5zd2VyZWQgWUVTIGluIHRoZSBwcmV2aW91cyBxdWVzdGlvbiwgcGxlYXNlIHNwZWNpZnkgd2hhdCBhcmUgdGhlIHBvbGljaWVzLCBvciBwcm92aWRlIGEgbGluay4qCgpgYGB7ciwgbGluZXdpZHRoPTkwfQpwb2xpY3lfc3BlY2lmaWVkIDwtIHVuaXF1ZShuYS5vbWl0KHBhcnRuZXJzJGBJZiB5b3UgaGF2ZSBhbnN3ZXJlZCBZRVMgaW4gdGhlIHByZXZpb3VzIHF1ZXN0aW9uLCBwbGVhc2Ugc3BlY2lmeSB3aGF0IGFyZSB0aGUgcG9saWNpZXMsIG9yIHByb3ZpZGUgbGluay5gKSkKCmFzLmRhdGEuZnJhbWUocG9saWN5X3NwZWNpZmllZCkKYGBgCgoqKkNvbW1lbnRhcnkqKjogU2V2ZXJhbCBvZiB0aGUgcGFydG5lciBwcm9qZWN0cyBmb2xsb3cgdGhlIEVSQyBkYXRhIGFuZCBvcGVuIGFjY2VzcyBwb2xpY2llcy4gTW9yZSBpbmZvcm1hdGlvbiBvbiBFUkMgT3BlbiBSZXNlYXJjaCBEYXRhIGFuZCBEYXRhIE1hbmFnZW1lbnQgUGxhbnMgY2FuIGJlIGZvdW5kIGF0IDxodHRwczovL2VyYy5ldXJvcGEuZXUvc2l0ZXMvZGVmYXVsdC9maWxlcy9kb2N1bWVudC9maWxlL0VSQ19pbmZvX2RvY3VtZW50LU9wZW5fUmVzZWFyY2hfRGF0YV9hbmRfRGF0YV9NYW5hZ2VtZW50X1BsYW5zLnBkZj4gb3IgYXQgRVJDIE9wZW4gU2NpZW5jZSBwb2xpY2llcyBwYWdlIDxodHRwczovL2VyYy5ldXJvcGEuZXUvbWFuYWdpbmcteW91ci1wcm9qZWN0L29wZW4tc2NpZW5jZT4uCgojIyBPcGVuIFNjaWVuY2UgcHJhY3RpY2UKCioqUXVlc3Rpb24qKjogKlN0YW5kYXJkaXplZCB0ZXJtaW5vbG9naWVzOiBUaGUgcHJvamVjdCB1c2VzIHRoZSBmb2xsb3dpbmcgc3lzdGVtczoqCgpgYGB7cn0Kc3RhbmRfdGVybSA8LSBhcy5kYXRhLmZyYW1lKHVubGlzdChzdHJfc3BsaXQocGFydG5lcnMkYFN0YW5kYXJkaXplZCB0ZXJtaW5vbG9naWVzOiBUaGUgcHJvamVjdCB1c2VzIHRoZSBmb2xsb3dpbmcgc3lzdGVtcyAoY2hlY2sgYWxsIHRoYXQgYXBwbHkpYCwgIiwgIikpKQpjb2xuYW1lcyhzdGFuZF90ZXJtKSA8LSBjKCJzdGFuZGFyZF90ZXJtaW5vbG9naWVzIikKCnN0YW5kX3Rlcm1fcmF0aW88LSBzdGFuZF90ZXJtICU+JSAKICBjb3VudChzdGFuZGFyZF90ZXJtaW5vbG9naWVzLCBzb3J0PSBUKSAlPiUgCiAgbXV0YXRlKHJhdGlvID0gcm91bmQobi8obnJvdyhwYXJ0bmVycykvMTAwKSkpICAKCnN0YW5kX3Rlcm1fcmF0aW8KYGBgCgoqKkNvbW1lbnRhcnkqKjogSW50ZXJuYWwgYXV0aG9yaXR5IGxpc3RzIGFyZSB0aGUgbW9zdCB3aWRlbHkgdXNlZCBtZXRob2QgdG8gcmVjb3JkIGVwaWdyYXBoaWMgdGVybWlub2xvZ2llcyAoYHIgc3RhbmRfdGVybV9yYXRpbyRyYXRpb1tzdGFuZF90ZXJtX3JhdGlvJHN0YW5kYXJkX3Rlcm1pbm9sb2dpZXMgPT0gIkludGVybmFsIGF1dGhvcml0eSBsaXN0cyJdYCAlIG9mIHByb2plY3RzKS4gVGhlIHZvY2FidWxhcmllcyBmb3IgdGhlIGVwaWdyYXBoaWMgZGlzY2lwbGluZSBjcmVhdGVkIGJ5IHRoZSBFQUdMRSBwcm9qZWN0ICg8aHR0cHM6Ly93d3cuZWFnbGUtbmV0d29yay5ldS9yZXNvdXJjZXMvdm9jYWJ1bGFyaWVzLz4pIGFyZSB1c2VkIGVpdGhlciBpbiB0aGVpciBvcmlnaW5hbCBmb3JtIChgciBzdW0obmEub21pdChzdGFuZF90ZXJtX3JhdGlvJHJhdGlvW3N0YW5kX3Rlcm1fcmF0aW8kc3RhbmRhcmRfdGVybWlub2xvZ2llcyA9PSAiRUFHTEUgdm9jYWJ1bGFyaWVzIGFzIHByb3ZpZGVkIGF0IGh0dHBzOi8vd3d3LmVhZ2xlLW5ldHdvcmsuZXUvcmVzb3VyY2VzL3ZvY2FidWxhcmllcy8iXSkpYCUgb2YgcGFydGljaXBhdGluZyBwcm9qZWN0cykgb3IgaW4gYSBmb3JtIG1vZGlmaWVkIGZvciB0aGUgaW5kaXZpZHVhbCBuZWVkcyBvZiB0aGUgcHJvamVjdCAoYHIgc3VtKG5hLm9taXQoc3RhbmRfdGVybV9yYXRpbyRyYXRpb1tzdGFuZF90ZXJtX3JhdGlvJHN0YW5kYXJkX3Rlcm1pbm9sb2dpZXMgPT0gIk93biB2ZXJzaW9uIG9mIEVBR0xFIHZvY2FidWxhcmllcyAoZWRpdGVkIGZvciBvdXIgcHJvamVjdCkiXSkpYCUgb2YgcGFydGljaXBhdGluZyBwcm9qZWN0cykuIFRoZSB1c2Ugb2Ygbm9uLXN0YW5kYXJkaXplZCBpbnRlcm5hbCBhdXRob3JpdHkgbGlzdHMgYW5kIHRoZSBuZWVkIGZvciBtb2RpZmljYXRpb25zIHN1Z2dlc3RzIHRoYXQgdGhlIEVBR0xFIHZvY2FidWxhcmllcyBkbyBub3QgaW4gZmFjdCBvZmZlciBzdWZmaWNpZW50bHkgYSBjb21tdW5pdHktd2lkZSBzdGFuZGFyZCBhbmQgbmVlZCB0byBiZSBpbXByb3ZlZCBiZWZvcmUgYmVjb21pbmcgb25lLiBUaGlzIHByb2Nlc3MgaGFzIGJlZW4gYWxyZWFkeSBzdGFydGVkIGJ5IHRoZSBFcGlncmFwaHkuaW5mbyBWb2NhYnVsYXJpZXMgd29ya2luZyBncm91cCBvZiB3aGljaCBIZXJtYW5rb3ZhLCBIb3JzdGVyLCBhbmQgUHJhZyBhcmUgYWxsIG1lbWJlcnMuIEZvciBtb3JlIGRldGFpbHMgc2VlIDxodHRwczovL2VwaWdyYXBoeS5pbmZvL3ZvY2FidWxhcmllc193Zy8+LiBJZiB5b3Ugd291bGQgbGlrZSB0byBqb2luIHRoZSB3b3JraW5nIGdyb3VwLCBwbGVhc2UgZ2V0IGluIHRvdWNoIHdpdGggdGhlIGF1dGhvcnMuCgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCioqUXVlc3Rpb24qKjogKlN0YW5kYXJkaXplZCB0ZXJtaW5vbG9naWVzOiBkYXRhIG9uIGNvbWJpbmF0aW9uIG9mIHZvY2FidWxhcmllcyBzeXN0ZW1zKgoKYGBge3J9CnN0YW5kX21ldGhvZDwtIHBhcnRuZXJzICU+JSAKICAjY291bnQoYFN0YW5kYXJkaXplZCB0ZXJtaW5vbG9naWVzOiBUaGUgcHJvamVjdCB1c2VzIHRoZSBmb2xsb3dpbmcgc3lzdGVtcyAoY2hlY2sgYWxsIHRoYXQgYXBwbHkpYCwgc29ydD1UKSAlPiUgCiAgcmVuYW1lKHN0YW5kX2FsbCA9IGBTdGFuZGFyZGl6ZWQgdGVybWlub2xvZ2llczogVGhlIHByb2plY3QgdXNlcyB0aGUgZm9sbG93aW5nIHN5c3RlbXMgKGNoZWNrIGFsbCB0aGF0IGFwcGx5KWApICU+JSAKICBtdXRhdGUoc3RhbmRhcmRfbWV0aG9kX25vID0gc3RyX2NvdW50KHN0YW5kX2FsbCwgIiwgIikgKyAxKSAgJT4lIAogIHNlbGVjdChzdGFuZGFyZF9tZXRob2Rfbm8pICU+JSAKICBjb3VudChzdGFuZGFyZF9tZXRob2Rfbm8pICU+JSAKICBtdXRhdGUocmF0aW8gPSByb3VuZChuLyhucm93KHBhcnRuZXJzKS8xMDApKSkKc3RhbmRfbWV0aG9kCmBgYAoKKipDb21tZW50YXJ5Kio6IFRoZSBtYWpvcml0eSBvZiBwcm9qZWN0cyAoYHIgc3RhbmRfbWV0aG9kJHJhdGlvW3N0YW5kX21ldGhvZCRzdGFuZGFyZF9tZXRob2Rfbm8gPT0gMV1gJSkgdXNlIG9ubHkgb25lIG1ldGhvZCB0byByZWNvcmQgdGhlaXIgc3RhbmRhcmQgdGVybWlub2xvZ2llcywgd2hpbGUgYHIgc3VtKHN0YW5kX21ldGhvZCRyYXRpb1tzdGFuZF9tZXRob2Qkc3RhbmRhcmRfbWV0aG9kX25vID4gMV0pYCUgb2YgcHJvamVjdHMgdXNlIGEgY29tYmluYXRpb24gb2YgdHdvIG9yIG1vcmUgbWV0aG9kcy4gSW50ZXJuYWwgYXV0aG9yaXR5IGxpc3RzIGFyZSB1c2VkIGluIGNvbWJpbmF0aW9uIHdpdGggdGhlIEVBR0xFIHZvY2FidWxhcmllcyBib3RoIGluIHRoZWlyIG9yaWdpbmFsIGFuZCBtb2RpZmllZCBmb3JtLiBTaGFyaW5nIG9yIHB1YmxpY2F0aW9uIG9mIGludGVybmFsIGF1dGhvcml0eSBsaXN0cyB3b3VsZCB0aGVyZWZvcmUgYmUgaGlnaGx5IGJlbmVmaWNpYWwgZm9yIGltcHJvdmluZyB0aGUgZXhpc3RpbmcgRUFHTEUgdm9jYWJ1bGFyaWVzLgoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgoqKlF1ZXN0aW9uKio6ICpMaW5rZWQgT3BlbiBEYXRhc2V0czogVGhlIHByb2plY3QgdXNlcyB0aGUgZm9sbG93aW5nIHN5c3RlbXM6KgoKYGBge3J9CmxvZCA8LSBhcy5kYXRhLmZyYW1lKHVubGlzdChzdHJfc3BsaXQocGFydG5lcnMkYExpbmtlZCBPcGVuIERhdGE6IFRoZSBwcm9qZWN0IHVzZXMgdGhlIGZvbGxvd2luZyBzeXN0ZW1zIChjaGVjayBhbGwgdGhhdCBhcHBseSlgLCAiLCAiKSkpCmNvbG5hbWVzKGxvZCkgPC0gYygibGlua2VkX2RhdGEiKQoKbG9kX3JhdGlvPC0gbG9kICU+JSAKICBjb3VudChsaW5rZWRfZGF0YSwgc29ydD0gVCkgJT4lIAogIG11dGF0ZShyYXRpb19hbGxfcHJvaiA9IHJvdW5kKG4vKG5yb3cocGFydG5lcnMpLzEwMCkpKQpsb2RfcmF0aW8KCmBgYAoKKipDb21tZW50YXJ5Kio6IEZyb20gdGhlIGxpc3RlZCBMaW5rZWQgT3BlbiBEYXRhc2V0cyAoTE9EKSwgVHJpc21lZ2lzdG9zIGFuZCBQbGVpYWRlcyBhcmUgYnkgZmFyIHRoZSBtb3N0IHBvcHVsYXIsIGJlaW5nIHVzZWQgaW4gYHIgbG9kX3JhdGlvJHJhdGlvX2FsbF9wcm9qW2xvZF9yYXRpbyRsaW5rZWRfZGF0YT09IlRyaXNtZWdpc3RvcyJdYCUgYW5kIGluIGByIGxvZF9yYXRpbyRyYXRpb19hbGxfcHJvaltsb2RfcmF0aW8kbGlua2VkX2RhdGE9PSJQbGVpYWRlcyJdYCUgb2YgYWxsIHBhcnRpY2lwYXRpbmcgcHJvamVjdHMuIFRoZSBFQUdMRSB2b2NhYnVsYXJpZXMgYXJlIHVzZWQgaW4gYHIgbG9kX3JhdGlvJHJhdGlvX2FsbF9wcm9qW2xvZF9yYXRpbyRsaW5rZWRfZGF0YT09IkVBR0xFIHZvY2FidWxhcmllcyJdYCUgb2YgYWxsIHBhcnRpY2lwYXRpbmcgcHJvamVjdHMuCgpgYGB7cn0KCmxvZHA8LSBwYXJ0bmVycyRgTGlua2VkIE9wZW4gRGF0YTogVGhlIHByb2plY3QgdXNlcyB0aGUgZm9sbG93aW5nIHN5c3RlbXMgKGNoZWNrIGFsbCB0aGF0IGFwcGx5KWAKCmdlb2dyYXBoaWM8LSByb3VuZChucm93KGFzLmRhdGEuZnJhbWUobG9kcCkgJT4lCiAgZmlsdGVyKHN0cl9kZXRlY3QobG9kcCwgIlRyaXNtZWdpc3Rvc3xQbGVpYWRlc3xPdGhlcjogQWRyaWF0bGFzfE90aGVyOiBDYXJ0YXB1bGlhIikpKS8obnJvdyhwYXJ0bmVycykvMTAwKSkKCnByb3NvcG9ncmFwaGljPC0gcm91bmQobnJvdyhhcy5kYXRhLmZyYW1lKGxvZHApICU+JQogIGZpbHRlcihzdHJfZGV0ZWN0KGxvZHAsICJFREggUGVvcGxlfFBJUnxMR1BOIikpKS8obnJvdyhwYXJ0bmVycykvMTAwKSkKYGBgCgpUaGUgZ3JvdXAgb2YgTE9EIHJlc291cmNlcyBmb2N1c2luZyBvbiAqKmdlb2dyYXBoaWMgZGF0YSoqIChlLmcuIFBsZWlhZGVzLCBBZHJpYXRsYXMsIENhcnRhcHVsaWEsIFRyaXNtZWdpc3Rvcykgc2VlbXMgdG8gYmUgc3Ryb25nbHkgcmVwcmVzZW50ZWQgYW1vbmdzdCBwYXJ0aWNpcGF0aW5nIHByb2plY3RzIChgciBnZW9ncmFwaGljYCAlIHVzZSBhdCBsZWFzdCBvbmUgb2YgdGhlbSksIHN1Z2dlc3RpbmcgdGhhdCBnZW9ncmFwaGljIExPRCBhcmUgd2VsbCBlc3RhYmxpc2hlZCBmb3IgdGhlIHN0dWR5IG9mIHRoZSBhbmNpZW50IHdvcmxkLgoKKipQcm9zb3BvZ3JhcGhpYyBkYXRhKiosIGFzIHJlcHJlc2VudGVkIGJ5IEVESCBQZW9wbGUsIFBJUiwgYW5kIExHUE4gYXJlIHVzZWQgYnkgYHIgcHJvc29wb2dyYXBoaWNgJSBvZiBhbGwgcGFydGljaXBhdGluZyBwcm9qZWN0cy4gVGhlIHN1cnZleSByZXNwb25zZXMgc3VnZ2VzdCB0aGVyZSBpcyBhIGdyZWF0IHNwYWNlIGZvciBpbXByb3ZlbWVudCBhbmQgcG90ZW50aWFsbHkgZ3JlYXQgYmVuZWZpdCBpbiBjcmVhdGluZyBhbmQgZnVydGhlciBpbXByb3ZpbmcgcHJvc29wb2dyYXBoaWMgTE9ELgoKIyBOb24tcGFydG5lcmVkIGVwaWdyYXBoeSBwcm9qZWN0cwoKYGBge3IgZGF0YV9wcm9qZWN0cywgaW5jbHVkZT1GQUxTRX0KIyBsb2FkaW5nIGRhdGEgZnJvbSBUU1YgZmlsZQpwcm9qZWN0c19hbGw8LSByZWFkX3RzdigiLi4vZGF0YS8wMl9zY29waW5nX3N1cnZleV9hbm9ueW1pc2VkLnRzdiIpCgpwcm9qZWN0cyA8LSBwcm9qZWN0c19hbGwgJT4lIAogIGZpbHRlcihgRG8geW91IGNvbnNlbnQgb24gcHVibGlzaGluZyB0aGUgYW5vbnltaXNlZCBkYXRhIGluIHRoZSBmb3JtIG9mIHdyaXR0ZW4gc2hvcnQgcmVwb3J0IG9wZW4gdG8gcHVibGljIGFuZCBhY2Nlc3NpYmxlIHZpYSB0aGUgRkFJUiBFcGlncmFwaHkgaW5mcmFzdHJ1Y3R1cmUgKHdlYnNpdGUsIEdpdEh1YiwgVHdpdHRlcik/YCA9PSAiWWVzIikKYGBgCgpUaGlzIHNlY3Rpb24gc3VtbWFyaXNlcyB0aGUgcmVzdWx0cyBvZiB0aGUgb25saW5lIHN1cnZleSBbKkRpZ2l0YWwgZXBpZ3JhcGh5IGluIDIwMjI6IHNjb3Bpbmcgc3VydmV5Kl0oaHR0cHM6Ly9naXRodWIuY29tL0ZBSVItZXBpZ3JhcGh5L3Njb3Bpbmdfc3VydmV5X3JlcG9ydC9kYXRhLzAyX1N1cnZleV9wcm9qZWN0c19xdWVzdGlvbnMucGRmKSB0YXJnZXRlZCBhdCBkaWdpdGFsIHByb2plY3RzIGN1cnJlbnRseSBsaXN0ZWQgdW5kZXIgRGlnaXRhbCBFcGlncmFwaHkgUHJvamVjdHMgb24gdGhlIERpZ2l0YWwgQ2xhc3NpY2lzdCBXaWtpIHBhZ2UgKDxodHRwczovL3dpa2kuZGlnaXRhbGNsYXNzaWNpc3Qub3JnL0NhdGVnb3J5OlByb2plY3RzPikgYW5kIHdoaWNoIHdhcyBwb3NzaWJsZSB0byB0cmFjZSBpbiBGZWJydWFyeSAyMDIyLiBUaGUgc3VydmV5IHdhcyBzZW50IHRvIDgzIHByb2plY3RzIGFuZCB0aGUgbGluayBjaXJjdWxhdGVkIHVudGlsIG1pZC1BcHJpbCAyMDIyLiBXZSBoYXZlIHJlY2VpdmVkIGByIG5yb3cocHJvamVjdHNfYWxsKWAgcmVzcG9uc2VzIHRvIHRoZSBzdXJ2ZXksIGEgcmVzcG9uc2UgcmF0ZSBvZiBgciByb3VuZChucm93KHByb2plY3RzKS8wLjgzKWAlLiBTb21lIHBhcnRpY2lwYW50cyBjb250cmlidXRlZCBvbiBiZWhhbGYgb2YgbXVsdGlwbGUgcHJvamVjdHMgaW4gb25lIHJlc3BvbnNlLCB3aGljaCB3ZSB3ZXJlIHVuYWJsZSB0byBkaXNlbnRhbmdsZSBhbmQgdGh1cyB0aGUgcmVzcG9uc2UgcmF0ZSBpcyBzbGlnaHRseSBza2V3ZWQuIGByIHJvdW5kKG5yb3cocHJvamVjdHMpLyhucm93KHByb2plY3RzX2FsbCkvMTAwKSlgJSAoYHIgbnJvdyhwcm9qZWN0cylgKSBvZiBub24tcGFydG5lcmVkIHByb2plY3RzIGdhdmUgY29uc2VudCB0byBwdWJsaXNoIHRoZWlyIGFub255bWlzZWQgcmVzcG9uc2VzIGFzIHBhcnQgb2YgdGhlIGN1cnJlbnQgcmVwb3J0LiBUaGUgcmVtYWluaW5nIHJlc3BvbnNlcyBhcmUgZXhjbHVkZWQgZnJvbSB0aGUgcmVwb3J0IGJ1dCB3aWxsIGJlIHVzZWQgdG8gaW5mb3JtIHRoZSBGQUlSIEVwaWdyYXBoeSBwbGFubmluZyBhbmQgZGVjaXNpb24gbWFraW5nLgoKVGhlIHJlc3BvbmRlbnRzIHJlcHJlc2VudCBhIHdpZGUgcmFuZ2Ugb2YgcHJvamVjdHMgZnJvbSB3ZWxsIGVzdGFibGlzaGVkIHByb2plY3RzIHRvIHNob3J0LXRlcm0gUGhEIHByb2plY3RzLCB3aXRoIHRoZSBhdmVyYWdlIGR1cmF0aW9uIG9mIGEgcHJvamVjdCBiZWluZyBgciBtZWRpYW4oYXMubnVtZXJpYyhwcm9qZWN0cyRMZW5ndGhfbnVtZXJpY195ZWFycykpYCB5ZWFycy4gVGhlIHNob3J0ZXN0IHBhcnRpY2lwYXRpbmcgcHJvamVjdCByZXBvcnRlZCB0aGVpciBkdXJhdGlvbiBhcyBgciBtaW4oYXMubnVtZXJpYyhwcm9qZWN0cyRMZW5ndGhfbnVtZXJpY195ZWFycykpYCB5ZWFyIGFuZCB0aGUgbG9uZ2VzdCBgciBtYXgoYXMubnVtZXJpYyhwcm9qZWN0cyRMZW5ndGhfbnVtZXJpY195ZWFycykpYCB5ZWFycy4KCioqUXVlc3Rpb24qKjogKklzIHRoZSBwcm9qZWN0IHN0aWxsIGFjdGl2ZT8qCgpgYGB7cn0KcHJval9hY3Q8LSBwcm9qZWN0cyAlPiUgCiAgY291bnQoYElzIHRoZSBwcm9qZWN0IHN0aWxsIGFjdGl2ZT9gLCBzb3J0PVQpICU+JSAKICByZW5hbWUoc3RhdHVzID0gYElzIHRoZSBwcm9qZWN0IHN0aWxsIGFjdGl2ZT9gKSAlPiUgCiAgbXV0YXRlKHJhdGlvID0gcm91bmQobi8oc3VtKG4pLzEwMCkpKQpwcm9qX2FjdApgYGAKCioqQ29tbWVudGFyeSoqOiBgciBwcm9qX2FjdCRyYXRpb1twcm9qX2FjdCRzdGF0dXMgPT0gIlllcyJdYCUgb2YgcmVzcG9uZGluZyBwcm9qZWN0cyBhcmUgc3RpbGwgYWN0aXZlLCB3aGlsZSBgciBwcm9qX2FjdCRyYXRpb1twcm9qX2FjdCRzdGF0dXMgPT0gIk5vLCB0aGUgcHJvamVjdCBpcyBjbG9zZWQiXWAlIG9mIHByb2plY3RzIGFyZSBwZXJtYW5lbnRseSBjbG9zZWQgYW5kIGRvIG5vdCBjb25zaWRlciByZXN0YXJ0aW5nIGluIHRoZSBmdXR1cmUuIGByIHByb2pfYWN0JHJhdGlvW3Byb2pfYWN0JHN0YXR1cyA9PSAiQ3VycmVudGx5IG5vdCwgYnV0IHdlIGFyZSBjb25zaWRlcmluZyBhIHJlLXN0YXJ0Il1gJSBvZiBwcm9qZWN0cyBhcmUgY3VycmVudGx5IG5vdCBhY3RpdmUsIGJ1dCBtaWdodCBiZSByZWFjdGl2YXRlZCBpbiB0aGUgZnV0dXJlLgoKIyMgTGFuZ3VhZ2UgY292ZXJhZ2UKCioqUXVlc3Rpb246KiogKldoYXQgaXMgdGhlIHByZWRvbWluYW50IGxhbmd1YWdlIG9mIGVwaWdyYXBoaWMgZGF0YSBpbiB5b3VyIHByb2plY3QgKGZvciBtaXhlZCBjb2xsZWN0aW9ucyBvciBjb2xsZWN0aW9ucyB3aGVyZSBvdGhlciBsYW5ndWFnZXMgYXJlIHByZWRvbWluYW50IHByb3ZpZGUgZGV0YWlscyBpbiBPdGhlcikqCgpgYGB7cn0KcHJvamVjdHNfbGFuZ3VhZ2UgPC0gYXMuZGF0YS5mcmFtZSh1bmxpc3Qoc3RyX3NwbGl0KHByb2plY3RzJExhbmd1YWdlX2NsZWFuLCAiOyAiKSkpCmNvbG5hbWVzKHByb2plY3RzX2xhbmd1YWdlKSA8LSBjKCJsYW5ndWFnZSIpCgpwcm9qZWN0c19sYW5ndWFnZV9yYXRpbyA8LSBwcm9qZWN0c19sYW5ndWFnZSAlPiUgCiAgY291bnQobGFuZ3VhZ2UsIHNvcnQ9VCkgJT4lIAogIG11dGF0ZShyYXRpbyA9IHJvdW5kKG4vKHN1bShuKS8xMDApKSkKcHJvamVjdHNfbGFuZ3VhZ2VfcmF0aW8KYGBgCgpgYGB7cn0KcHJvamVjdF9sYW5ndWFnZV9jb3VudDwtIHN0cl9jb3VudChwcm9qZWN0cyRMYW5ndWFnZV9jbGVhbiwgIjsiKSsxCmBgYAoKKipDb21tZW50YXJ5OioqIFRoZSBsYW5ndWFnZSBjb3ZlcmFnZSBvZiB0aGUgcGFydGljaXBhdGluZyBwcm9qZWN0cyBjb25zaXN0ZWQgcHJlZG9taW5hbnRseSBvZiBMYXRpbiBhbmQgR3JlZWsgcHJvamVjdHMsIHJlcHJlc2VudGluZyBgciBzdW0ocHJvamVjdHNfbGFuZ3VhZ2VfcmF0aW8kcmF0aW9bcHJvamVjdHNfbGFuZ3VhZ2VfcmF0aW8kbGFuZ3VhZ2UgJWluJSBjKCJHcmVlayIsICJMYXRpbiIpXSlgJSBvZiBwcm9qZWN0cyBjb21iaW5lZC4gR3JlZWsgaXMgdGhlIG1vc3QgZnJlcXVlbnQgbGFuZ3VhZ2UsIGVpdGhlciBhcyB0aGUgc29sZS9wcmVkb21pbmFudCBsYW5ndWFnZSAoYHIgc3VtKHByb2plY3RzJExhbmd1YWdlX2NsZWFuID09ICJHcmVlayIpYCBwcm9qZWN0cykgb3IgaW4gY29tYmluYXRpb24gd2l0aCBvdGhlciBsYW5ndWFnZXMgKGByIHN1bShzdHJfY291bnQocHJvamVjdHMkTGFuZ3VhZ2VfY2xlYW4sIkdyZWVrIikpLXN1bShwcm9qZWN0cyRMYW5ndWFnZV9jbGVhbiA9PSAiR3JlZWsiKWAgcHJvamVjdHMpLiBMYXRpbiBpcyB0aGUgc29sZS9wcmVkb21pbmFudCBsYW5ndWFnZSBpbiBgciBzdW0ocHJvamVjdHMkTGFuZ3VhZ2VfY2xlYW4gPT0gIkxhdGluIilgIHByb2plY3RzIG9yIGluIGNvbWJpbmF0aW9uIHdpdGggb3RoZXIgbGFuZ3VhZ2VzIChgciBzdW0oc3RyX2NvdW50KHByb2plY3RzJExhbmd1YWdlX2NsZWFuLCJMYXRpbiIpKS1zdW0ocHJvamVjdHMkTGFuZ3VhZ2VfY2xlYW4gPT0gIkxhdGluIilgIHByb2plY3RzKS4gYHIgbGVuZ3RoKHByb2plY3RfbGFuZ3VhZ2VfY291bnRbcHJvamVjdF9sYW5ndWFnZV9jb3VudD09MV0pYCBwYXJ0aWNpcGF0aW5nIHByb2plY3RzIHJlY29yZCBpbnNjcmlwdGlvbnMgaW4gb25lIGxhbmd1YWdlIG9ubHksIHdoaWxlIGByIGxlbmd0aChwcm9qZWN0X2xhbmd1YWdlX2NvdW50W3Byb2plY3RfbGFuZ3VhZ2VfY291bnQ+MV0pYCBjb250YWluIGluc2NyaXB0aW9ucyBpbiB0d28gb3IgbW9yZSBsYW5ndWFnZXMgKGByIG1heChwcm9qZWN0X2xhbmd1YWdlX2NvdW50KWAgYmVpbmcgdGhlIG1heGltdW0gbnVtYmVyIG9mIGxpc3RlZCBsYW5ndWFnZXMuKS4KClRoZSBsYW5ndWFnZXMgbGlzdGVkIGFzIGBPdGhlcmAgY29uc2lzdGVkIG9mIGxhbmd1YWdlcyBzdWNoIGFzIGByIHByb2plY3RzX2xhbmd1YWdlX3JhdGlvJGxhbmd1YWdlWzM6MTZdYC4gQWxsIGxhbmd1YWdlcyBjb21lIGZyb20gdGhlIHdpZGVyIE1lZGl0ZXJyYW5lYW4vRXVyb3BlYW4gbGluZ3Vpc3RpYyBzcGFjZS4KCioqVW5pcXVlIGNvbWJpbmF0aW9ucyBvZiBsYW5ndWFnZXMgYXMgcmV0cmlldmVkIGZyb20gdGhlIHN1cnZleToqKgoKYGBge3J9CmFzLmRhdGEuZnJhbWUodW5pcXVlKHByb2plY3RzJExhbmd1YWdlX2NsZWFuKSkKYGBgCgojIyBJVCBpbmZyYXN0cnVjdHVyZQoKKipRdWVzdGlvbioqOiAqRG9lcyB0aGUgcHJvamVjdCBoYXZlIGEgd2Vic2l0ZT8qCgpgYGB7cn0KcHJvamVjdHMgJT4lIAogIGNvdW50KFdlYnNpdGUsIHNvcnQ9VCkKYGBgCgoqKkNvbW1lbnRhcnkqKjogQWxtb3N0IGFsbCBwYXJ0aWNpcGF0aW5nIHByb2plY3RzIG1haW50YWluIGFuIG9ubGluZSBwcmVzZW5jZSAoYXMgb2YgRmVicnVhcnktQXByaWwgMjAyMikuCgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCioqUXVlc3Rpb24qKjogKkRvZXMgeW91ciBwcm9qZWN0IGhhdmUgYW4gSVQgc3BlY2lhbGlzdChzKT8qCgpgYGB7cn0KSVQyIDwtIHByb2plY3RzICU+JSAKICBjb3VudChgRG9lcyB5b3UgcHJvamVjdCBoYXZlIGFuIElUIHNwZWNpYWxpc3Qocyk/YCwgc29ydD1UKSAlPiUgCiAgcmVuYW1lKElUX3NwZWMgPSBgRG9lcyB5b3UgcHJvamVjdCBoYXZlIGFuIElUIHNwZWNpYWxpc3Qocyk/YCkgJT4lIAogICNuYS5vbWl0KElUX3NwZWMpICU+JSAKICBtdXRhdGUocmF0aW8gPSByb3VuZChuLyhucm93KHByb2plY3RzKS8xMDApKSkKSVQyCmBgYAoKKipDb21tZW50YXJ5Kio6IE9ubHkgYHIgSVQyJHJhdGlvW25hLm9taXQoSVQyJElUX3NwZWMpID09ICJZZXMsIGVxdWl2YWxlbnQgb2YgZnVsbC10aW1lICgxLjAgRlRFKSBwb3NpdGlvbiJdYCUgb2YgcHJvamVjdHMgaGF2ZSBhbiBlcXVpdmFsZW50IG9mIDEuMCBGVEUgb3IgbW9yZSBJVCBzdXBwb3J0IGF0IHRoZWlyIGRpc3Bvc2FsLiBgciBzdW0oSVQyJHJhdGlvW2MoNiw3LDkpXSkgKyBzdW0oSVQyJHJhdGlvW25hLm9taXQoSVQyJElUX3NwZWMpID09ICJZZXMsIGVxdWl2YWxlbnQgb2YgcGFydC10aW1lICg8MS4wIEZURSkgcG9zaXRpb24iXSlgJSBvZiBkaWdpdGFsIHByb2plY3RzIGhhdmUgYW4gSVQgc3BlY2lhbGlzdCBhdmFpbGFibGUgZm9yIGF0IGxlYXN0IHNldmVyYWwgaG91cnMgcGVyIHdlZWsgb3Igc2hhcmUgdGhlbSB3aXRoIG90aGVyIGRpZ2l0YWwgcHJvamVjdHMgd2l0aGluIHRoZWlyIGluc3RpdHV0aW9uLiBTZXZlcmFsIHByb2plY3RzIHJlcG9ydCBkaWZmaWN1bHR5IHdpdGggZmluZGluZyBmaW5hbmNpYWwgcmVzb3VyY2VzIHRvIHN1cHBvcnQgZnVydGhlciBkZXZlbG9wbWVudCBhbmQgbG9uZy10ZXJtIHN1c3RhaW5hYmlsaXR5IG9mIHRoZSBwcm9qZWN0IG9yIGV2ZW4gZGF5LXRvLWRheSBzdXBwb3J0LiBgciBzdW0oSVQyJHJhdGlvW25hLm9taXQoSVQyJElUX3NwZWMpICVpbiUgYygiTm8iLCAiV2UgaGFkIildKWAlIG9mIHRoZSBwYXJ0aWNpcGF0aW5nIHByb2plY3RzIHJlcG9ydCB0aGF0IHRoZXkgY3VycmVudGx5IGRvIG5vdCBoYXZlIGFueSBhY2Nlc3MgdG8gSVQgc3VwcG9ydC4gQW4gYWRkaXRpb25hbCBgciBJVDIkcmF0aW9bbmEub21pdChJVDIkSVRfc3BlYykgPT0gIk4vQSJdYCUgb2YgcHJvamVjdHMgZGlkIG5vdCBpbmRpY2F0ZSB3aGV0aGVyIHRoZXkgaGF2ZSBhY2Nlc3MgdG8gSVQgc3VwcG9ydCBiZWNhdXNlIHRoZXkgYXJlIG5vIGxvbmdlciBhY3RpdmUuIEluIG9yZGVyIHRvIHVuZGVyc3RhbmQgdGhlIHByZWNpc2Ugc2lnbmlmaWNhbmNlIG9mIHRoaXMgZGF0YSwgaXQgd291bGQgYmUgbmVjZXNzYXJ5IGluIGZ1dHVyZSBzdXJ2ZXlzIHRvIGNsYXJpZnkgdGhlIGN1cnJlbnQgZnVuZGluZyBzdGF0dXMgb2YgaW5kaXZpZHVhbCBwcm9qZWN0cy4gSG93ZXZlciwgdGhlIGdlbmVyYWwgdHJlbmQgb2YgbGltaXRlZCBhY2Nlc3MgdG8gSVQgc3VwcG9ydCBhbW9uZ3N0IG5vbi1wYXJ0bmVyZWQgcHJvamVjdCBzdGFuZHMgb3V0LgoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgoqKlF1ZXN0aW9uKio6ICpEb2VzIHlvdXIgcHJvamVjdCBzdG9yZSBlcGlncmFwaGljIGRhdGEgaW4gdGhlIGZvbGxvd2luZyBmb3JtYXRzLi4uPyoKCmBgYHtyfQpmb3JtYXQyIDwtIHByb2plY3RzICU+JSAKICBjb3VudChgT3VyIHByb2plY3RzIHN0b3JlcyBlcGlncmFwaGljIGRhdGEgaW4gdGhlIGZvbGxvd2luZyBmb3JtYXRzYCwgc29ydD1UKSAlPiUgCiAgcmVuYW1lKGZvcm1hdCA9IGBPdXIgcHJvamVjdHMgc3RvcmVzIGVwaWdyYXBoaWMgZGF0YSBpbiB0aGUgZm9sbG93aW5nIGZvcm1hdHNgKSAlPiUgCiAgZmlsdGVyKGZvcm1hdCAhPSAiTi9BIikgJT4lIAogIG11dGF0ZShub19mb3JtYXQgPSBzdHJfY291bnQoZm9ybWF0LCAiLCIpICsgMSkKZm9ybWF0MgpgYGAKCmBgYHtyfQplcGlkb2MyIDwtIHN1bShzdHJfZGV0ZWN0KHByb2plY3RzJGBPdXIgcHJvamVjdHMgc3RvcmVzIGVwaWdyYXBoaWMgZGF0YSBpbiB0aGUgZm9sbG93aW5nIGZvcm1hdHNgLCAiRXBpZG9jIFhNTCIpKQpqc29uMiA8LSBzdW0oc3RyX2RldGVjdChwcm9qZWN0cyRgT3VyIHByb2plY3RzIHN0b3JlcyBlcGlncmFwaGljIGRhdGEgaW4gdGhlIGZvbGxvd2luZyBmb3JtYXRzYCwgIkpTT04iKSkKcmRmMiA8LSBzdW0oc3RyX2RldGVjdChwcm9qZWN0cyRgT3VyIHByb2plY3RzIHN0b3JlcyBlcGlncmFwaGljIGRhdGEgaW4gdGhlIGZvbGxvd2luZyBmb3JtYXRzYCwgIlJERiIpKQpjc3YyIDwtIHN1bShzdHJfZGV0ZWN0KHByb2plY3RzJGBPdXIgcHJvamVjdHMgc3RvcmVzIGVwaWdyYXBoaWMgZGF0YSBpbiB0aGUgZm9sbG93aW5nIGZvcm1hdHNgLCAiQ1NWIikpCnNxbDIgPC0gc3VtKHN0cl9kZXRlY3QocHJvamVjdHMkYE91ciBwcm9qZWN0cyBzdG9yZXMgZXBpZ3JhcGhpYyBkYXRhIGluIHRoZSBmb2xsb3dpbmcgZm9ybWF0c2AsICJTUUwiKSkKYGBgCgoqKkNvbW1lbnRhcnkqKjogVGhlIG1ham9yaXR5IG9mIHByb2plY3RzIHVzZSBgRXBpZG9jIFhNTGAgYXMgdGhlaXIgbWFpbiBvdXRwdXQgZGF0YSBmb3JtYXQgKGByIHJvdW5kKGVwaWRvYzIvKG5yb3cocHJvamVjdHMpLzEwMCkpYCUgb2YgcGFydGljaXBhdGluZyBwcm9qZWN0cyksIGVpdGhlciBpbiBjb21iaW5hdGlvbiB3aXRoIG90aGVyIGZvcm1hdHMgb3IgYXMgdGhlIHNvbGUgZGF0YSBmb3JtYXQuIFNRTCBhbmQgc2ltaWxhciBkYXRhYmFzZSBmb3JtYXRzIGFyZSByZWxhdGl2ZWx5IGNvbW1vbiwgaW4gYHIgcm91bmQoc3FsMi8obnJvdyhwcm9qZWN0cykvMTAwKSlgJSBvZiBwcm9qZWN0cy4gT3RoZXIgZGF0YSBmb3JtYXRzIGFyZSByZXByZXNlbnRlZCBsZXNzIGZyZXF1ZW50bHkgYnkgYSBzbWFsbCBudW1iZXIgb2YgcHJvamVjdHMgYW5kIG1vc3RseSBhcyBjb21wbGVtZW50YXJ5IGRhdGEgZm9ybWF0cyB0byBtb3JlIHBvcHVsYXIgZm9ybWF0cyBzdWNoIGFzIEVwaWRvYyBYTUwgb3IgU1FMOiBKU09OIChgciByb3VuZChqc29uMi8obnJvdyhwcm9qZWN0cykvMTAwKSlgJSksIFJERiAoYHIgcm91bmQocmRmMi8obnJvdyhwcm9qZWN0cykvMTAwKSlgJSksIGFuZCBDU1YgKGByIHJvdW5kKGNzdjIvKG5yb3cocHJvamVjdHMpLzEwMCkpYCUpLiBgciByb3VuZChmb3JtYXQyJG5bOV0vKG5yb3cocHJvamVjdHMpLzEwMCkpYCUgb2YgcHJvamVjdHMgaW5kaWNhdGVkIHRoZSB1c2Ugb2YgYSBjb21iaW5hdGlvbiBvZiBhbmFsb2d1ZSBkYXRhIGFuZCAzRCBkYXRhIGZvcm1hdC4gYHIgcm91bmQoZm9ybWF0MiRuW2Zvcm1hdDIkZm9ybWF0PT0iWE1MIGFkYXB0ZWQgZnJvbSBFcGlkb2MgWE1MIl0vKG5yb3cocHJvamVjdHMpLzEwMCkpYCUgb2YgcHJvamVjdHMgaW5kaWNhdGVkIHVzaW5nIHRoZWlyIG93biB2ZXJzaW9uIG9mIEVwaWRvYyBYTUwsIGFkYXB0ZWQgdG8gdGhlaXIgc3BlY2lmaWMgbmVlZHMuCgpgciByb3VuZCgoc3VtKGZvcm1hdDIkbm9fZm9ybWF0ID09IDEpKS8obnJvdyhwcm9qZWN0cykvMTAwKSlgJSBvZiBwcm9qZWN0cyB1c2Ugb25seSBvbmUgdHlwZSBvZiBkYXRhIGZvcm1hdCwgd2hpbGUgYHIgcm91bmQoKHN1bShmb3JtYXQyJG5vX2Zvcm1hdCA+IDEpKS8obnJvdyhwcm9qZWN0cykvMTAwKSlgJSB1c2UgdHdvIG9yIG1vcmUgZGF0YSBmb3JtYXQgdHlwZXMuIFRoZSBkYXRhIGZvcm1hdCBvZiB0aGUgcHJvamVjdHMgdGhhdCBhcmUgbm8gbG9uZ2VyIGFjdGl2ZSBpcyByZWNvcmRlZCBpbiB0aGUgZm9sbG93aW5nICpEYXRhIHNoYXJpbmcqIHNlY3Rpb24sIHVuZGVyICpDbG9zZWQgUHJvamVjdHMqLgoKIyMgRGF0YSBzaGFyaW5nCgojIyMgQWN0aXZlIHByb2plY3RzCgpUaGlzIHNlY3Rpb24gc3VtbWFyaXNlZCBvbmx5IHRoZSAnYWN0aXZlJyBwcm9qZWN0cy4gRm9yICdjbG9zZWQvbm9uLWFjdGl2ZScgcHJvamVjdHMsIHNlZSB0aGUgc2VjdGlvbiBiZWxvdy4KCmBgYHtyfQphY3RpdmVfcHJvaiA8LSBucm93KGZpbHRlcihwcm9qZWN0cywgYElzIHRoZSBwcm9qZWN0IHN0aWxsIGFjdGl2ZT9gJWluJSBjKCJZZXMiKSkpCmBgYAoKKipRdWVzdGlvbioqOiAqRG8geW91IHNoYXJlIHlvdXIgZGF0YSBvdXRzaWRlIG9mIHlvdXIgcHJvamVjdD8qCgpgYGB7cn0Kc2hhcmUyPC0gcHJvamVjdHMgJT4lIAogIGNvdW50KGBEbyB5b3Ugc2hhcmUgeW91ciBkYXRhIG91dHNpZGUgb2YgeW91ciBwcm9qZWN0YCwgc29ydD1UKSAlPiUgCiAgcmVuYW1lKHNoYXJlID0gYERvIHlvdSBzaGFyZSB5b3VyIGRhdGEgb3V0c2lkZSBvZiB5b3VyIHByb2plY3RgKSAlPiUgCiAgZmlsdGVyKHNoYXJlICE9ICJOL0EiKSAlPiUgCiAgbXV0YXRlKHJhdGlvID0gcm91bmQoKG4vKHN1bShuKS8xMDApKSkpCnNoYXJlMgpgYGAKCioqQ29tbWVudGFyeSoqOiBBcyBvZiBGZWJydWFyeSAyMDIyLCBgciBzdW0oYWN0aXZlX3Byb2opYCBwcm9qZWN0cyBwYXJ0aWNpcGF0ZWQgaW4gdGhlIHN1cnZleSBhcyBhY3RpdmUgcHJvamVjdHMuIFRoZSBtYWpvcml0eSBvZiBhY3RpdmUgcHJvamVjdHMgYXJlIHdpbGxpbmcgdG8gc2hhcmUgdGhlaXIgZGF0YSwgcmVwcmVzZW50aW5nIGByIHN1bShzaGFyZTIkcmF0aW9bYygxLDMsNCw1LDYsNyw4LDksMTApXSlgJSBvZiBwYXJ0aWNpcGF0aW5nIHByb2plY3RzLiBgciBzdW0oc2hhcmUyJHJhdGlvW2MoMSw3LDgsOSldKWAlIG9mIGFjdGl2ZSBwcm9qZWN0cyBzaGFyZSBkYXRhIHVuZGVyIGEgQ3JlYXRpdmUgQ29tbW9ucyBsaWNlbnNlLCB3aGljaCBpcyB0aGUgcHJlZmVycmVkIG1vZGUgYWNjb3JkaW5nIHRvIHRoZSBGQUlSIGRhdGEgcHJpbmNpcGxlcy4gYHIgc3VtKHNoYXJlMiRyYXRpb1tjKDMsMTApXSlgJSBvZiBhY3RpdmUgcHJvamVjdHMgc2hhcmUgZGF0YSB3aXRob3V0IGFueSBzcGVjaWZpYyBsaWNlbnNlLCB3aGlsZSBgciBzaGFyZTIkcmF0aW9bNF1gJSBwcm92aWRlIGRhdGEgb25seSBvbiBkZW1hbmQuCgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCioqUXVlc3Rpb24qKjogKkhvdyBkbyB5b3Ugc2hhcmUgeW91ciBkYXRhIHdpdGggdXNlcnMgb3V0c2lkZSB5b3VyIHByb2plY3Q/KgoKYGBge3J9Cm91dHNoYXJlMjwtIHByb2plY3RzICU+JSAKICBjb3VudChgSG93IGRvIHNoYXJlIHlvdXIgZGF0YSB3aXRoIHVzZXJzIG91dHNpZGUgeW91ciBwcm9qZWN0YCwgc29ydD1UKSAlPiUgCiAgcmVuYW1lKHNoYXJlX2FsbCA9IGBIb3cgZG8gc2hhcmUgeW91ciBkYXRhIHdpdGggdXNlcnMgb3V0c2lkZSB5b3VyIHByb2plY3RgKSAlPiUKICBmaWx0ZXIoc2hhcmVfYWxsICE9ICJOL0EiKSAlPiUgCiAgbXV0YXRlKHNoYXJlX21ldGhvZCA9IHN0cl9jb3VudChzaGFyZV9hbGwsICJbLHw7XSAiKSArIDEpIAoKb3V0c2hhcmUyCmBgYAoKKipDb21tZW50YXJ5Kio6IEFzIG9mIEZlYnJ1YXJ5IDIwMjIsIGFsbCBidXQgb25lIG9mIHRoZSBhY3RpdmUgcHJvamVjdHMgcHJvdmlkZSBhdCBsZWFzdCBvbmUgd2F5IG9mIHNoYXJpbmcgZGF0YSAod2hldGhlciBpdCBpcyBjdXJyZW50bHkgYWNjZXNzaWJsZSB0byB0aGUgcHVibGljIG9yIG5vdCwgb3IgaXQgaXMgaW50ZW5kZWQgdG8gYmUgYWNjZXNzaWJsZSBpbiB0aGUgZnV0dXJlKS4gVGhlIGF2ZXJhZ2UgKG1lZGlhbikgbnVtYmVyIG9mIHNoYXJpbmcgbWV0aG9kcyBwZXIgcHJvamVjdCBpcyBgciByb3VuZChtZWRpYW4obmEub21pdChvdXRzaGFyZTIkc2hhcmVfbWV0aG9kKSkpYCwgd2hpbGUgdGhlIG1heGltdW0gbnVtYmVyIGlzIGByIG1heChuYS5vbWl0KG91dHNoYXJlMiRzaGFyZV9tZXRob2QpKWAuCgpUaGVyZSBpcyBubyBkaXNjaXBsaW5lLXdpZGUgc3RhbmRhcmQgZGF0YSByZXBvc2l0b3J5IGFzIGlzIGNvbW1vbiBpbiBvdGhlciBkaXNjaXBsaW5lcyAoZS5nLiBUREFSLCA8aHR0cHM6Ly9jb3JlLnRkYXIub3JnLz4sIG9yIEFyaWFkbmVQbHVzLCA8aHR0cHM6Ly9hcmlhZG5lLWluZnJhc3RydWN0dXJlLmV1Lz4gZm9yIGFyY2hhZW9sb2dpY2FsIGRhdGEpLiBUaHVzIGFsbCBwcm9qZWN0cyB1c2UgZWl0aGVyIHRoZWlyIGluc3RpdHV0aW9uYWwgb3IgbmF0aW9uYWwgcmVzb3VyY2VzIHRoYXQgbWF5IG9yIG1heSBub3QgYmUgaWRlYWwgZm9yIGVwaWdyYXBoaWMgZGF0YS4gQW1vbmcgdGhvc2Ugd2hvIHNoYXJlIGRhdGEsIHRoZSBFcGlkb2MgWE1MIGZvcm1hdCBpcyB0aGUgbW9zdCBwb3B1bGFyIGZvcm1hdCBmb3IgZGF0YSBzaGFyaW5nIChgciBzdW0oc3RyX2NvdW50KG91dHNoYXJlMiRzaGFyZV9hbGwsICJFcGlkb2MgWE1MIikpYCBwcm9qZWN0cyksIGFsb25nc2lkZSBwcm92aWRpbmcgZGF0YSBvdXRwdXQgdXBvbiBzZWFyY2ggb24gdGhlIHByb2plY3QncyB3ZWJzaXRlIChpbiB3aGljaGV2ZXIgZm9ybWF0KS4gT3BlbiBTY2llbmNlIHByYWN0aWNlcyBkbyBub3Qgc2VlbSB0byBiZSBhIHBvcHVsYXIgY2hvaWNlIGluIGRpZ2l0YWwgZXBpZ3JhcGh5LCBzdWNoIGFzIHNoYXJpbmcgdmlhIHB1YmxpYyByZXBvc2l0b3J5LCBlLmcuIEdpdEh1YiAoYHIgc3VtKHN0cl9jb3VudChvdXRzaGFyZTIkc2hhcmVfYWxsLCAiR2l0SHViIikpYCBwcm9qZWN0cykgb3IgWmVub2RvIChgciBzdW0oc3RyX2NvdW50KG91dHNoYXJlMiRzaGFyZV9hbGwsICJaZW5vZG8iKSlgIHByb2plY3RzKSwgYXMgd2VsbCBhcyBwcm92aWRpbmcgcmF3IGRhdGEgaW4gdGhlIENTViAoY29tbWEtc2VwYXJhdGVkIHZhbHVlKSBmb3JtYXQsIG9yIGFzIEpTT04gKEphdmFTY3JpcHQgT2JqZWN0IE5vdGF0aW9uKSBmaWxlcy4gQ29tcHV0ZXItYXV0b21hdGVkIGFjY2VzcyB0byBkYXRhIGlzIHJhcmUgYW5kIG1hbnVhbCBodW1hbiBpbnRlcmFjdGlvbiwgc3VjaCBhcyBtYW51YWwgc2VsZWN0aW9uIGFuZC9vciBtYW51YWwgZG93bmxvYWQgb2YgZmlsZXMgcHJldmFpbHMsIHBvdGVudGlhbGx5IGhpbmRlcmluZyBhbnkgcXVhbnRpdGF0aXZlIGFuZCByZXByb2R1Y2libGUgc3R1ZGllcywgb3IgdGhlIGxpbmtpbmcgb2YgZGF0YXNldHMgdmlhIGF1dG9tYXRlZCBwcm9jZXNzZXMuIEZvciBleGFtcGxlLCBhbiBBUEkgYWNjZXNzIHBvaW50IGlzIGN1cnJlbnRseSBhdmFpbGFibGUgb25seSBmb3IgYSB2ZXJ5IGxpbWl0ZWQgbnVtYmVyIG9mIHByb2plY3RzLgoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgojIyMgQ2xvc2VkIHByb2plY3RzCgpUaGlzIHNlY3Rpb24gc3VtbWFyaXNlZCBvbmx5IHRoZSAnY2xvc2VkL25vbi1hY3RpdmUnIHByb2plY3RzLiBGb3IgJ2FjdGl2ZScgcHJvamVjdHMsIHNlZSB0aGUgc2VjdGlvbiBhYm92ZS4KCioqUXVlc3Rpb24qKjogKklzIHRoZSBkYXRhIGNyZWF0ZWQgYnkgeW91ciBwcm9qZWN0IGFjY2Vzc2libGU/KgoKYGBge3J9CmNsb3NlZF9wcm9qIDwtIG5yb3coZmlsdGVyKHByb2plY3RzLCBgSXMgdGhlIHByb2plY3Qgc3RpbGwgYWN0aXZlP2AlaW4lIGMoIk5vLCB0aGUgcHJvamVjdCBpcyBjbG9zZWQiLCAiQ3VycmVudGx5IG5vdCwgYnV0IHdlIGFyZSBjb25zaWRlcmluZyBhIHJlLXN0YXJ0IikpKQpgYGAKCmBgYHtyfQpzaGFyZV9jbDwtIHByb2plY3RzICU+JSAKICByZW5hbWUoc2hhcmUgPSBgSXMgdGhlIGRhdGEgY3JlYXRlZCBieSB5b3VyIHByb2plY3QgYWNjZXNzaWJsZT9gKSAlPiUKICBmaWx0ZXIoc2hhcmUgIT0iTi9BIikgJT4lIAogIGNvdW50KHNoYXJlLCBzb3J0PVQpICU+JSAKICBtdXRhdGUocmF0aW8gPSByb3VuZCgobi8oc3VtKGNsb3NlZF9wcm9qKS8xMDApKSkpCnNoYXJlX2NsCmBgYAoKKipDb21tZW50YXJ5Kio6IEFzIG9mIEZlYnJ1YXJ5IDIwMjIsIGByIGNsb3NlZF9wcm9qYCBvZiB0aGUgcGFydGljaXBhdGluZyBwcm9qZWN0cyBhcmUgY2xvc2VkLiBgciBzaGFyZV9jbCRyYXRpb1tzaGFyZV9jbCRzaGFyZSA9PSAiWWVzLCB1bmRlciBhIENyZWF0aXZlIENvbW1vbnMgbGljZW5zZSJdYCUgb2YgdGhlbSBwcm92aWRlIGFjY2VzcyB0byB0aGVpciBkYXRhIHVuZGVyIGEgQ3JlYXRpdmUgQ29tbW9ucyBsaWNlbnNlIGV2ZW4gdGhvdWdoIHRoZSBwcm9qZWN0IGlzIG5vIGxvbmdlciBhY3RpdmUsIGByIHNoYXJlX2NsJHJhdGlvW3NoYXJlX2NsJHNoYXJlID09ICJZZXMsIHdpdGhvdXQgYW55IGxpY2Vuc2UiXWAlIG9mIGNsb3NlZCBwcm9qZWN0cyBwcm92aWRlIGFjY2VzcyB3aXRob3V0IGFueSBsaWNlbnNlIGFuZCBgciBzaGFyZV9jbCRyYXRpb1tzaGFyZV9jbCRzaGFyZSA9PSAiTm90IGN1cnJlbnRseSwgYnV0IHdlIGFyZSB0aGlua2luZyBhYm91dCBtYWtpbmcgaXQgYXZhaWxhYmxlIl1gJSBkbyBub3QgY3VycmVudGx5IHByb3ZpZGUgYWNjZXNzIHRvIHRoZSBkYXRhIHRoZXkgaGF2ZSBjcmVhdGVkIGR1cmluZyB0aGUgbGl2ZSBwaGFzZSBvZiB0aGVpciBwcm9qZWN0LCBidXQgdGhleSBhcmUgY29uc2lkZXJpbmcgbWFraW5nIHRoZSBkYXRhIGF2YWlsYWJsZS4KCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKKipRdWVzdGlvbioqOiAqSXMgdGhlIGRhdGEgY3JlYXRlZCBieSB5b3VyIHByb2plY3QgYWNjZXNzaWJsZT8qCgpgYGB7cn0Kc2hhcmluZ19jbGFjIDwtIGFzX3RpYmJsZSh1bmxpc3Qoc3RyX3NwbGl0KHByb2plY3RzJGBPdXIgcHJvamVjdCBkYXRhIGFyZSBhY2Nlc3NpYmxlIHZpYSAoY2hlY2sgYWxsIHRoYXQgYXBwbHkpOmAsICIsICIpKSkKY29sbmFtZXMoc2hhcmluZ19jbGFjKSA8LSBjKCJzZXJ2aWNlIikKCgpzaGFyaW5nX2NsYWNjZXNzIDwtIHNoYXJpbmdfY2xhYyAlPiUgCiAgZmlsdGVyKHNlcnZpY2UgIT0gIk4vQSIpICU+JSAKICBjb3VudChzZXJ2aWNlLCBzb3J0PSBUKSAlPiUgCiAgbXV0YXRlKHJhdGlvID0gcm91bmQoKG4vKHN1bShjbG9zZWRfcHJvaikvMTAwKSkpKQpzaGFyaW5nX2NsYWNjZXNzCmBgYAoKKipDb21tZW50YXJ5Kio6IEFzIG9mIEZlYnJ1YXJ5IDIwMjIsIGByIGNsb3NlZF9wcm9qYCBvZiB0aGUgcGFydGljaXBhdGluZyBwcm9qZWN0cyBhcmUgY2xvc2VkLiBPdXQgb2YgdGhlc2UgY2xvc2VkIHByb2plY3RzLCBgciBzaGFyaW5nX2NsYWNjZXNzJHJhdGlvW3NoYXJpbmdfY2xhY2Nlc3Mkc2VydmljZSA9PSAiSW5kaXZpZHVhbCBFcGlkb2MgWE1McyBvciBFcGlkb2MgWE1MIGR1bXBzIG9uIHRoZSB3ZWJzaXRlIl1gJSBwcm92aWRlIHRoZWlyIGRhdGEgaW4gdGhlIEVwaWRvYyBYTUwgZm9ybWF0IG9uIHRoZWlyIHdlYnNpdGUsIGByIHNoYXJpbmdfY2xhY2Nlc3MkcmF0aW9bc2hhcmluZ19jbGFjY2VzcyRzZXJ2aWNlID09ICJQdWJsaWMgcmVwb3NpdG9yeSBvbiBHaXRIdWIiXWAlIHByb3ZpZGUgdGhlaXIgZGF0YSB2aWEgcHVibGljIHJlcG9zaXRvcnkgb24gR2l0SHViLCBgciBzaGFyaW5nX2NsYWNjZXNzJHJhdGlvW3NoYXJpbmdfY2xhY2Nlc3Mkc2VydmljZSA9PSAiT3RoZXIgcHVibGljbHkgYWNjZXNzaWJsZSByZXBvc2l0b3J5IChzcGVjaWZ5IGluIE90aGVyKSJdYCUgdmlhIG90aGVyIHB1YmxpY2x5IGFjY2Vzc2libGUgcmVwb3NpdG9yaWVzLiBgciBzaGFyaW5nX2NsYWNjZXNzJHJhdGlvW3NoYXJpbmdfY2xhY2Nlc3Mkc2VydmljZSA9PSAiV2UgZG9uJ3QgY3VycmVudGx5IHNoYXJlIGRhdGEgb3V0c2lkZSBvdXIgcHJvamVjdCJdYCUgb2YgY2xvc2VkIHByb2plY3RzIGRvdCBjdXJyZW50bHkgc2hhcmUgZGF0YSBvdXRzaWRlIHRoZSBwcm9qZWN0ICg9YHIgbGVuZ3RoKHNoYXJpbmdfY2xhY2Nlc3MkcmF0aW9bc2hhcmluZ19jbGFjY2VzcyRzZXJ2aWNlID09ICJXZSBkb24ndCBjdXJyZW50bHkgc2hhcmUgZGF0YSBvdXRzaWRlIG91ciBwcm9qZWN0Il0pYCBwcm9qZWN0KS4KClRoZSBmYWN0IHRoYXQgZXZlbiB0aGUgY2xvc2VkIHByb2plY3RzIHNoYXJlIHRoZWlyIGRhdGEgaW4gc29tZSBmb3JtIGV2ZW4gYWZ0ZXIgdGhlIHByb2plY3QgaXMgbm8gbG9uZ2VyIGFjdGl2ZS9kb2VzIG5vdCBoYXZlIGZ1bmRpbmcgZm9yIGZ1cnRoZXIgZGV2ZWxvcG1lbnQgb3IgbWFpbnRlbmFuY2UgaXMgcG9zaXRpdmUuIEhvd2V2ZXIsIG1vc3Qgb2YgdGhlIGRhdGEgc2l0IG9uIHByaXZhdGUgb3IgaW5zdGl0dXRpb25hbCB3ZWJzaXRlcyB0aGF0IGNhbiBlYXNpbHkgZGlzYXBwZWFyLCBhbG9uZyB3aXRoIGFjY2VzcyB0byB0aGUgZGF0YS4gVGhlIGJlc3QgcHJhY3RpY2UgZm9yIHRoZSBsb25nZXZpdHkgb2YgdGhlc2UgY3JlYXRlZCBkYXRhc2V0cyB3b3VsZCBiZSBhcmNoaXZpbmcgdGhlbSB0byBhIHB1YmxpY2x5IGFjY2Vzc2libGUgcmVwb3NpdG9yeSwgc3VjaCBhcyBHaXRIdWIsIFplbm9kbywgSEFMLCBPcGVuIFNjaWVuY2UgRnJhbWV3b3JrIG9yIGFueSBzaW1pbGFyIGFyY2hpdmFsIGluZnJhc3RydWN0dXJlLgoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgojIyBJbnN0aXR1dGlvbmFsIHBvbGljaWVzCgoqUXVlc3Rpb246KiAqRG9lcyB5b3VyIGluc3RpdHV0aW9uIG9yIGZ1bmRpbmcgYm9keSByZXF1aXJlIHlvdXIgcHJvamVjdCB0byBjb21wbHkgd2l0aCBhbnkgZGF0YSBwb2xpY2llcyAoZS5nLiBGQUlSIHByaW5jaXBsZXMsIGRhdGEgc3RvcmFnZSwgZGF0YSBzaGFyaW5nLCBPcGVuIFNjaWVuY2UpPyoKCmBgYHtyfQpwb2xpY2llczIgPC0gcHJvamVjdHMgJT4lIAogIG11dGF0ZShwb2xpY2llcyA9IGBEb2VzIHlvdXIgaW5zdGl0dXRpb24gb2YgZnVuZGluZyBib2R5IHJlcXVpcmUgeW91ciBwcm9qZWN0IHRvIGNvbXBseSB3aXRoIGFueSBkYXRhIHBvbGljaWVzIChlLmcuLCBGQUlSIHByaW5jaXBsZXMsIGRhdGEgc3RvcmFnZSwgZGF0YSBzaGFyaW5nLCBPcGVuIFNjaWVuY2UpP2ApICU+JSAKICBmaWx0ZXIocG9saWNpZXMgIT0gIk4vQSIpICU+JSAKICBjb3VudChwb2xpY2llcywgc29ydD1UKSAlPiUgCiAgbXV0YXRlKHJhdGlvID0gcm91bmQoKG4vKHN1bShuKS8xMDApKSkpCiAgCnBvbGljaWVzMgpgYGAKCioqQ29tbWVudGFyeSoqOiBgciBwb2xpY2llczIkcmF0aW9bcG9saWNpZXMyJHBvbGljaWVzID09ICJObyJdYCUgb2YgcHJvamVjdHMgZG8gbm90IGV4cGxpY2l0bHkgaGF2ZSB0byBmb2xsb3cgYW55IHBvbGljeS4gYHIgcG9saWNpZXMyJHJhdGlvW3BvbGljaWVzMiRwb2xpY2llcyA9PSAiWWVzIl1gJSBvZiBwcm9qZWN0cyBhcmUgcmVxdWlyZWQgdG8gY29tcGx5IHdpdGggZGF0YSByZWxhdGVkIHBvbGljaWVzLCB3aGlsZSBhbiBhZGRpdGlvbmFsIGByIHN1bShwb2xpY2llczIkcmF0aW9bYygzLDQsNSw2KV0pYCUgb2YgcHJvamVjdHMgYXJlIGVuY291cmFnZWQgdG8gY29tcGx5IHdpdGggRkFJUiBkYXRhIHByaW5jaXBsZXMgYnV0IG5vIHJ1bGVzIGFyZSBlbmZvcmNlZC4KCkhvd2V2ZXIsIHNvbWUgb2YgdGhlIHByb2plY3RzIGFyZSBhbHJlYWR5IGNsb3NlZCBhbmQgbWF5IGhhdmUgYmVlbiBjbG9zZWQgZm9yIHNvbWUgdGltZS4gRGF0YSBwb2xpY3kgcmVxdWlyZW1lbnRzIGhhdmUgdW5kZXJnb25lIG1ham9yIGNoYW5nZXMgaW4gdGhlIGxhc3QgNSB5ZWFycywgYW5kIGl0IGlzIG1vcmUgdGhhbiBsaWtlbHkgdGhhdCBzdWNoIHBvbGljaWVzIHdlcmUgbm90IHByZXZpb3VzbHkgcmVxdWlyZWQsIHdoaWNoIG1heSBiZSByZWZsZWN0ZWQgaW4gdGhlIHJlbGF0aXZlbHkgbG93IGNvbXBsaWFuY2Ugd2l0aCBGQUlSIGFuZCBPcGVuIFNjaWVuY2UgZGF0YSBwb2xpY2llcy4KCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKKipRdWVzdGlvbioqOiAqSWYgeW91IGhhdmUgYW5zd2VyZWQgWUVTIGluIHRoZSBwcmV2aW91cyBxdWVzdGlvbiwgcGxlYXNlIHNwZWNpZnkgd2hhdCBhcmUgdGhlIHBvbGljaWVzLCBvciBwcm92aWRlIGEgbGluay4qCgpgYGB7ciwgbGluZXdpZHRoPTkwfQpwb2xpY2llc19leGFtcGxlPC0gYXMuZGF0YS5mcmFtZShwcm9qZWN0cyRgSWYgeW91IGhhdmUgYW5zd2VyZWQgWUVTIGluIHRoZSBwcmV2aW91cyBxdWVzdGlvbiwgcGxlYXNlIHNwZWNpZnkgd2hhdCBhcmUgdGhlIHBvbGljaWVzLCBvciBwcm92aWRlIGxpbmsuYCkKY29sbmFtZXMocG9saWNpZXNfZXhhbXBsZSkgPC0gInBvbGljeV9leGFtcGxlIgpwb2xpY2llc19leGFtcGxlICU+JSAKICBuYS5vbWl0KCkgLT4gcG9saWNpZXNfZXhhbXBsZQoKcG9saWNpZXNfZXhhbXBsZQpgYGAKCioqQ29tbWVudGFyeSoqOiBEYXRhIHBvbGljaWVzIGluIHRoZSBmaWVsZCBvZiBkaWdpdGFsIGVwaWdyYXBoeSBhcmUgc3RpbGwgYmVpbmcgaW1wbGVtZW50ZWQgYW5kIHNvIGFyZSBub3QgeWV0IHJlZmxlY3RlZCBpbiBwYXN0IGFuZCBjdXJyZW50IHByb2plY3RzLiBUaGVyZSBpcyBhIHZhcmlhdGlvbiBiZXR3ZWVuIG5hdGlvbmFsIHBvbGljaWVzIGFtb25nc3Qgb3VyIHJlc3BvbnNlcywgd2l0aCBGcmFuY2UgYW5kIE5vcndheSBwcm92aWRpbmcgZXhhbXBsZXMgaW4gdGhlIGltcGxlbWVudGF0aW9uIG9mIE9wZW4gU2NpZW5jZSBpbiBkaWdpdGFsIGVwaWdyYXBoeS4KCmBgYHtyLCBlY2hvPUZBTFNFfQpwb2xpY2llczJfbGVuZ3RoPC0gcHJvamVjdHMgJT4lIAogIHNlbGVjdChMZW5ndGhfbnVtZXJpY195ZWFycywgYERvZXMgeW91ciBpbnN0aXR1dGlvbiBvZiBmdW5kaW5nIGJvZHkgcmVxdWlyZSB5b3VyIHByb2plY3QgdG8gY29tcGx5IHdpdGggYW55IGRhdGEgcG9saWNpZXMgKGUuZy4sIEZBSVIgcHJpbmNpcGxlcywgZGF0YSBzdG9yYWdlLCBkYXRhIHNoYXJpbmcsIE9wZW4gU2NpZW5jZSk/YCkgJT4lIAogIG11dGF0ZShwb2xpY3kgPSBgRG9lcyB5b3VyIGluc3RpdHV0aW9uIG9mIGZ1bmRpbmcgYm9keSByZXF1aXJlIHlvdXIgcHJvamVjdCB0byBjb21wbHkgd2l0aCBhbnkgZGF0YSBwb2xpY2llcyAoZS5nLiwgRkFJUiBwcmluY2lwbGVzLCBkYXRhIHN0b3JhZ2UsIGRhdGEgc2hhcmluZywgT3BlbiBTY2llbmNlKT9gKQogIApwb2xpY2llczJfbGVuZ3RoJHBvbGljeV9zaW1wbGUgPC0gaWZlbHNlKGdyZXBsKCJOZWl0aGVyIG91ciBncmFudCBmdW5kaW5nKiIsIHBvbGljaWVzMl9sZW5ndGgkcG9saWN5KSwgIlZvbHVudGFyeSIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGdyZXBsKCJQb2xpY2llcyBhcmUgb24gdGhlIHdheSp8Tm90IHdpdGggYW4gb2ZmaWNpYWwgcmVxdWVzdCp8V2UgZG9uJ3Qgd29yayBmb3IgYW55IGluc3RpdHV0aW9uKiIsIHBvbGljaWVzMl9sZW5ndGgkcG9saWN5KSwgIk5vIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGdyZXBsKCJUaGUgRnJlbmNoIE5hdGlvbmFsIENlbnRyZSBmb3IgU2NpZW50aWZpYyBSZXNlYXJjaCBzdHJvbmdseSBlbmNvdXJhZ2VzIGl0cyBtZW1iZXJzIHRvIGNvbXBseSp8Tm90IHdpdGggYW4gb2ZmaWNpYWwgcmVxdWVzdCoiLCBwb2xpY2llczJfbGVuZ3RoJHBvbGljeSksICJZZXMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvbGljaWVzMl9sZW5ndGgkcG9saWN5KSkpCgpwb2xpY2llczJfbGVuZ3RoJExlbmd0aF9udW1lcmljX3llYXJzIDwtIGFzLm51bWVyaWMocG9saWNpZXMyX2xlbmd0aCRMZW5ndGhfbnVtZXJpY195ZWFycykKCnBvbGljaWVzMl9sZW5ndGhfbWVhbjwtIHBvbGljaWVzMl9sZW5ndGggJT4lIGdyb3VwX2J5KHBvbGljeV9zaW1wbGUpICU+JSAKICBzdW1tYXJpc2VfYXQodmFycyhMZW5ndGhfbnVtZXJpY195ZWFycyksIGxpc3QoYXZlcmFnZV9kdXJhdGlvbl95ZWFycyA9IG1lYW4pKQpgYGAKCmBgYHtyfQpwb2xpY2llczJfbGVuZ3RoX21lYW4KYGBgCgoqKkFkZGl0aW9uYWwgaW52ZXN0aWdhdGlvbioqOgoKVGhlIG1haW4gZmFjdG9yIGluZmx1ZW5jaW5nIHRoZSBuZWVkIHRvIGNvbXBseSB3aXRoIGluc3RpdHV0aW9uYWwgcHJpbmNpcGxlcyBzZWVtcyB0byBiZSB0aGUgYWdlIG9mIHRoZSBwcm9qZWN0IC0gZm9yIHByb2plY3RzIGNyZWF0ZWQgaW4gcmVjZW50IHllYXJzIChlLmcuIHNpbmNlIDIwMTUpLCB3ZSB3b3VsZCBleHBlY3QgRkFJUiBkYXRhIHBvbGljaWVzIHRvIGJlIG9uZSBvZiBjb25kaXRpb25zIGZvciBzZWN1cmluZyBmdW5kaW5nLiBJbiBvcmRlciB0byB2ZXJpZnkgdGhpcyBoeXBvdGhlc2lzLCB3ZSBjb2xsZWN0ZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBtYW51YWxseSBmcm9tIHByb2plY3Qgd2Vic2l0ZXMgYW5kIHB1Ymxpc2hlZCBtYXRlcmlhbHMsIHN1Y2ggYXMgdGhlIG9mZmljaWFsIHByb2plY3Qgc3RhcnQtZGF0ZSwgdGhlIGNvdW50cnkgb2Ygb3JpZ2luIG9mIGEgZ2l2ZW4gcHJvamVjdCwgaW5kaWNhdGlvbnMgb2YgZXhpc3RpbmcgZnVuZGluZyBhbmQgcHJpbWFyeSBmb2N1cyBvZiBhIGdpdmVuIHByb2plY3QgKHRleHQgcHVibGljYXRpb24gb3IgbWV0YWRhdGEgY29sbGVjdGlvbikuIFRoZSBhbm9ueW1pc2VkIGRhdGEgaXMgc2F2ZWQgYXMgYSBUU1YgaW4gdGhlIHNhbWUgR2l0SHViIHJlcG9zaXRvcnkgYXMgYC9kYXRhLzAyX3Njb3Bpbmdfc3VydmV5X2Fub255bWlzZWRfUG9zdFN1cnZleS50c3ZgLgoKYGBge3IgZGF0YV9wb3N0c3VydmV5LCBpbmNsdWRlPUZBTFNFLCBlY2hvPUZBTFNFfQojIGxvYWRpbmcgZGF0YSBmcm9tIFRTViBmaWxlCnByb2plY3RzX3Bvc3Q8LSByZWFkX3RzdigiLi4vZGF0YS8wMl9zY29waW5nX3N1cnZleV9hbm9ueW1pc2VkX1Bvc3RTdXJ2ZXkudHN2IikKYGBgCgpgYGB7ciwgZWNobz1GQUxTRSwgd2FybmluZz1GQUxTRX0KIyBtZXJnaW5nIHdpdGggdGhlIG9yaWdpbmFsIGRhdGFzZXQKcHJvamVjdHNfY29tYiA8LSBtZXJnZSh4PXByb2plY3RzLCB5PXByb2plY3RzX3Bvc3QsIGJ5PSJJRF9hbm9uIikKCnByb2plY3RzX2NvbWIkWWVhclN0YXJ0ZWQgPC0gYXMubnVtZXJpYyhwcm9qZWN0c19jb21iJFllYXJTdGFydGVkKQoKI3Byb2Nlc3NpbmcKcG9saWN5X3llYXJfc3RhcnRlZDwtIHByb2plY3RzX2NvbWIgJT4lIAogIHNlbGVjdChZZWFyU3RhcnRlZCwgYERvZXMgeW91ciBpbnN0aXR1dGlvbiBvZiBmdW5kaW5nIGJvZHkgcmVxdWlyZSB5b3VyIHByb2plY3QgdG8gY29tcGx5IHdpdGggYW55IGRhdGEgcG9saWNpZXMgKGUuZy4sIEZBSVIgcHJpbmNpcGxlcywgZGF0YSBzdG9yYWdlLCBkYXRhIHNoYXJpbmcsIE9wZW4gU2NpZW5jZSk/YCkgJT4lIAogIG11dGF0ZShwb2xpY3kgPSBgRG9lcyB5b3VyIGluc3RpdHV0aW9uIG9mIGZ1bmRpbmcgYm9keSByZXF1aXJlIHlvdXIgcHJvamVjdCB0byBjb21wbHkgd2l0aCBhbnkgZGF0YSBwb2xpY2llcyAoZS5nLiwgRkFJUiBwcmluY2lwbGVzLCBkYXRhIHN0b3JhZ2UsIGRhdGEgc2hhcmluZywgT3BlbiBTY2llbmNlKT9gKQogIApwb2xpY3lfeWVhcl9zdGFydGVkJHBvbGljeV9zaW1wbGUgPC0gaWZlbHNlKGdyZXBsKCJOZWl0aGVyIG91ciBncmFudCBmdW5kaW5nKiIsIHBvbGljeV95ZWFyX3N0YXJ0ZWQkcG9saWN5KSwgIlZvbHVudGFyeSIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGdyZXBsKCJQb2xpY2llcyBhcmUgb24gdGhlIHdheSp8Tm90IHdpdGggYW4gb2ZmaWNpYWwgcmVxdWVzdCp8V2UgZG9uJ3Qgd29yayBmb3IgYW55IGluc3RpdHV0aW9uKiIsIHBvbGljeV95ZWFyX3N0YXJ0ZWQkcG9saWN5KSwgIk5vIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGdyZXBsKCJUaGUgRnJlbmNoIE5hdGlvbmFsIENlbnRyZSBmb3IgU2NpZW50aWZpYyBSZXNlYXJjaCBzdHJvbmdseSBlbmNvdXJhZ2VzIGl0cyBtZW1iZXJzIHRvIGNvbXBseSp8Tm90IHdpdGggYW4gb2ZmaWNpYWwgcmVxdWVzdCoiLCBwb2xpY3lfeWVhcl9zdGFydGVkJHBvbGljeSksICJZZXMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvbGljeV95ZWFyX3N0YXJ0ZWQkcG9saWN5KSkpCgpgYGAKCmBgYHtyIGZpZzIsIGZpZy5hbGlnbj0iY2VudGVyIiwgd2FybmluZz1GQUxTRSwgZmlnLndpZHRoPTEwLCBmaWcuY2FwPSJUaGUgY2hhcnQgc2hvd3MgdGhlIGV4aXN0ZW5jZSBvZiBpbnN0aXR1dGlvbmFsIGRhdGEgcG9saWN5IG9mIG5vbi1wYXJ0bmVyZWQgcHJvamVjdHMgYW5kIGl0cyBkZXZlbG9wbWVudCBvdmVyIHRpbWUuIn0KIyMgZ2dwbG90IHBvbGljeSBieSB5ZWFycyBzdGFydGVkCnBvbGljeV95ZWFyX3N0YXJ0ZWQgJT4lIAogIGZpbHRlcihZZWFyU3RhcnRlZD4xOTUwKSAlPiUgCiAgZ2dwbG90KGFlcyh4PVllYXJTdGFydGVkLCB5PXBvbGljeV9zaW1wbGUsIGNvbG9yPXBvbGljeV9zaW1wbGUpKSsKICBnZW9tX3Zpb2xpbigpICsKICAjZ2VvbV9wb2ludChhZXMoeD1ZZWFyU3RhcnRlZCwgeT1wb2xpY3lfc2ltcGxlKSkKICBnZW9tX2RlbnNpdHkoKSsKICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQ9MjAxNSwgbGluZXR5cGU9MiwgY29sb3VyPSJicm93biIpICsKICBnZ3RpdGxlKCJSZXF1aXJlbWVudCBvZiBpbnN0aXR1dGlvbmFsIGRhdGEgcG9saWN5IG9mIG5vbi1wYXJ0bmVyZWQgcHJvamVjdHMgc2luY2UgMTk5MCIpICsKICB4bGFiKCJTdGFydCB5ZWFyIG9mIGEgcHJvamVjdCIpICsgeWxhYigiRXhpc3RlbmNlIG9mIGluc3RpdHV0aW9uYWwgZGF0YSBwb2xpY3kiKSArCiAgI2Nvb3JkX2ZsaXAoKSArCiAgdGhlbWVfYncoKSArCiAgI2Nvb3JkX2NhcnRlc2lhbih4bGltID0gYygwLCA1KSkgKwogIHRoZW1lKGF4aXMudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gOSkpICsKICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMykpCmBgYAoKT3VyIGV4cGVjdGF0aW9ucyBvbiBkYXRhIHBvbGljaWVzIGJlaW5nIHByb2dyZXNzaXZlbHkgaW1wbGVtZW50ZWQgb3ZlciB0aGUgbGFzdCBzZXZlbiB5ZWFycyB3ZXJlIGNvbmZpcm1lZCBvbmx5IHBhcnRpYWxseS4gQXMgKipGaWd1cmUgMSoqIGFib3ZlIGRlbW9uc3RyYXRlcywgdGhlIG51bWJlciBvZiBwcm9qZWN0cyB0aGF0IGluZGljYXRlZCBhbiBleGlzdGluZyBpbnN0aXR1dGlvbmFsIGRhdGEgcG9saWN5IGdyb3dzIHN0ZWFkaWx5IGZyb20gMjAxNSAoaW5kaWNhdGVkIGJ5IGJyb3duIGRhc2hlZCB2ZXJ0aWNhbCBsaW5lKS4gT24gdGhlIGNvbnRyYXJ5LCB0aGUgbnVtYmVyIG9mIHByb2plY3RzIHRoYXQgaW5kaWNhdGVkIG5vIGV4aXN0aW5nIGRhdGEgcG9saWN5IGRlY3JlYXNlcywgYnV0IG9ubHkgcmVsYXRpdmVseSBzbG93bHkuIFRoZSBwcm9qZWN0cyByZXNwb25kZWQgYE4vQWAgYXJlIHRob3NlIHdoaWNoIGNvbnNpZGVyIHRoZW1zZWx2ZXMgaW4gRmVicnVhcnkgMjAyMiBhcyBgY2xvc2VkYC4KCmBgYHtyLCBlY2hvPUZBTFNFfQojcHJvY2Vzc2luZwpwb2xpY3lfY291bnRyeTwtIHByb2plY3RzX2NvbWIgJT4lIAogIHNlbGVjdChZZWFyU3RhcnRlZCwgYERvZXMgeW91ciBpbnN0aXR1dGlvbiBvZiBmdW5kaW5nIGJvZHkgcmVxdWlyZSB5b3VyIHByb2plY3QgdG8gY29tcGx5IHdpdGggYW55IGRhdGEgcG9saWNpZXMgKGUuZy4sIEZBSVIgcHJpbmNpcGxlcywgZGF0YSBzdG9yYWdlLCBkYXRhIHNoYXJpbmcsIE9wZW4gU2NpZW5jZSk/YCwgQ291bnRyeSkgJT4lIAogIG11dGF0ZShwb2xpY3kgPSBgRG9lcyB5b3VyIGluc3RpdHV0aW9uIG9mIGZ1bmRpbmcgYm9keSByZXF1aXJlIHlvdXIgcHJvamVjdCB0byBjb21wbHkgd2l0aCBhbnkgZGF0YSBwb2xpY2llcyAoZS5nLiwgRkFJUiBwcmluY2lwbGVzLCBkYXRhIHN0b3JhZ2UsIGRhdGEgc2hhcmluZywgT3BlbiBTY2llbmNlKT9gKQogIApwb2xpY3lfY291bnRyeSRwb2xpY3lfc2ltcGxlIDwtIGlmZWxzZShncmVwbCgiTmVpdGhlciBvdXIgZ3JhbnQgZnVuZGluZyoiLCBwb2xpY3lfeWVhcl9zdGFydGVkJHBvbGljeSksICJWb2x1bnRhcnkiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShncmVwbCgiUG9saWNpZXMgYXJlIG9uIHRoZSB3YXkqfE5vdCB3aXRoIGFuIG9mZmljaWFsIHJlcXVlc3QqfFdlIGRvbid0IHdvcmsgZm9yIGFueSBpbnN0aXR1dGlvbioiLCBwb2xpY3lfeWVhcl9zdGFydGVkJHBvbGljeSksICJObyIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShncmVwbCgiVGhlIEZyZW5jaCBOYXRpb25hbCBDZW50cmUgZm9yIFNjaWVudGlmaWMgUmVzZWFyY2ggc3Ryb25nbHkgZW5jb3VyYWdlcyBpdHMgbWVtYmVycyB0byBjb21wbHkqfE5vdCB3aXRoIGFuIG9mZmljaWFsIHJlcXVlc3QqIiwgcG9saWN5X3llYXJfc3RhcnRlZCRwb2xpY3kpLCAiWWVzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9saWN5X3llYXJfc3RhcnRlZCRwb2xpY3kpKSkKYGBgCgpgYGB7ciwgZmlnLmFsaWduPSJjZW50ZXIiLCB3YXJuaW5nPUZBTFNFLCBmaWcud2lkdGg9MTAsIGZpZy5jYXA9IlRoZSBjaGFydCBzaG93cyB0aGUgcmVxdWlyZW1lbnQgb2YgaW5zdGl0dXRpb25hbCBkYXRhIHBvbGljeSBvZiBub24tcGFydG5lcmVkIHByb2plY3RzIGJ5IGNvdW50cnkuIn0KIyMgZ2dwbG90IHBvbGljeSBieSBjb3VudHJpZXMKcG9saWN5X2NvdW50cnkgJT4lIAogIGZpbHRlcihZZWFyU3RhcnRlZD4xOTUwKSAlPiUgCiAgZ2dwbG90KGFlcyh4PUNvdW50cnksIHk9cG9saWN5X3NpbXBsZSwgY29sb3I9cG9saWN5X3NpbXBsZSkpKwogIGdlb21fcG9pbnQoYWVzKHg9Q291bnRyeSwgeT1wb2xpY3lfc2ltcGxlKSwgc2l6ZT00KSArCiAgZ2d0aXRsZSgiUmVxdWlyZW1lbnQgb2YgaW5zdGl0dXRpb25hbCBkYXRhIHBvbGljeSBvZiBub24tcGFydG5lcmVkIHByb2plY3RzIGJ5IGNvdW50cnkiKSArCiAgeGxhYigiQ291bnRyeSIpICsgeWxhYigiRXhpc3RlbmNlIG9mIGluc3RpdHV0aW9uYWwgZGF0YSBwb2xpY3kiKSArCiAgI2Nvb3JkX2NhcnRlc2lhbih4bGltID0gYygwLCA1KSkgKwogIHRoZW1lX2J3KCkgKwogIHRoZW1lKGF4aXMudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gOSkpICsKICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMykpCmBgYAoKXG5ld3BhZ2UKCioqRmlndXJlIDIqKiBhYm92ZSBzaG93cyBjbGVhciBnZW9ncmFwaGljIGRpZmZlcmVuY2VzIGluIGltcGxlbWVudGF0aW9uIG9mIGRhdGEgcG9saWNpZXMgYmFzZWQgb24gdGhlIG1haW4gY291bnRyeSB3aGVyZSB0aGUgcHJvamVjdCBpcyBiYXNlZC4gRnJhbmNlLCBHZXJtYW55LCBhbmQgSXRhbHkgYXJlIGxpc3RlZCBhcyBjb3VudHJpZXMgd2hlcmUgZGF0YSBwb2xpY2llcyBhcmUgcmVxdWlyZWQsIHlldCBzb21lIHByb2plY3RzIGluIEdlcm1hbnkgYW5kIEl0YWx5IGFuc3dlcmVkIHRoYXQgbm8gZGF0YSBwb2xpY2llcyBhcmUgcmVxdWlyZWQuIFRodXMgdGhlIHByYWN0aWNhbCBpbXBsZW1lbnRhdGlvbiBvZiBkYXRhIHBvbGljaWVzIG1heSBkZXBlbmQgb24gdGhlIHBhcnRpY3VsYXIgZnVuZGluZyBhZ2VuY3kgb3IgaW5zdGl0dXRpb24sIHJhdGhlciB0aGFuIG9uIG5hdGlvbi13aWRlIHBvbGljaWVzLiBXZSBhcmUgd2VsbCBhd2FyZSB0aGF0IGRhdGEgcG9saWNpZXMgbWlnaHQgYmUgZGlmZmVyZW50IGZvciBwcm9qZWN0cyBmdW5kZWQgZnJvbSBvdGhlciBzb3VyY2VzIHRoYW4gbmF0aW9uYWwgb3IgRXVyb3BlYW4gcmVzZWFyY2ggY291bmNpbCBzY2hlbWVzLCB3aGVyZSBzdWNoIHJlcXVpcmVtZW50cyBtYXkgbm90IGJlIGNvbXB1bHNvcnkuIE91ciByZXN1bHRzIGFyZSBvbmx5IHByZWxpbWluYXJ5IGFuZCBiYXNlZCBvbiBhIHZlcnkgc21hbGwgc2FtcGxlIGFuZCBuZWVkIHRvIGJlIGNvbmZpcm1lZCBieSBmdXJ0aGVyIGFuZCBtb3JlIGRldGFpbGVkIGludmVzdGlnYXRpb24uIAoKIyMgT3BlbiBTY2llbmNlIFByYWN0aWNlCgoqKlF1ZXN0aW9uKio6ICpBcmUgeW91IGZhbWlsaWFyIHdpdGggdGhlIEZBSVIgZGF0YSBwcmluY2lwbGVzPyoKCmBgYHtyfQpmYWlyPC0gcHJvamVjdHMgJT4lIAogIG11dGF0ZShwb2xpY3kgPSBgQXJlIHlvdSBmYW1pbGlhciB3aXRoIHRoZSBGQUlSIGRhdGEgcHJpbmNpcGxlcz9gKSAlPiUKICBjb3VudChwb2xpY3ksIHNvcnQ9VCkgJT4lIAogIG11dGF0ZShyYXRpbyA9IHJvdW5kKG4vKHN1bShuKS8xMDApKSkKZmFpcgpgYGAKCioqQ29tbWVudGFyeSoqOiBUaGUgbWFqb3JpdHkgb2YgcHJvamVjdHMgKGByIGZhaXIkcmF0aW9bZmFpciRwb2xpY3kgPT0gIlllcyJdYCUpIGlzIGZhbWlsaWFyIHdpdGggRkFJUiBkYXRhIHBvbGljeSwgaG93ZXZlciwgYHIgZmFpciRyYXRpb1tmYWlyJHBvbGljeSA9PSAiVmFndWVseSJdYCUgb2YgcGFydGljaXBhdGluZyBwcm9qZWN0cyBhcmUgb25seSB2YWd1ZWx5IGZhbWlsaWFyIGFuZCB3b3VsZCBiZW5lZml0IGZyb20gY2xlYXIgZ3VpZGVsaW5lcyBjdXN0b21pc2VkIGZvciB0aGUgZXBpZ3JhcGhpYyBjb21tdW5pdHkuIE9ubHkgYHIgZmFpciRyYXRpb1tmYWlyJHBvbGljeSA9PSAiTm8iXWAlIG9mIHByb2plY3RzIGFyZSBub3QgZmFtaWxpYXIgd2l0aCBGQUlSIGRhdGEgcHJpbmNpcGxlcy4KCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKKipRdWVzdGlvbioqOiAqU3RhbmRhcmRpemVkIHRlcm1pbm9sb2dpZXM6IFRoZSBwcm9qZWN0IHVzZXMgdGhlIGZvbGxvd2luZyBzeXN0ZW1zOioKCmBgYHtyfQpzdGFuZF90ZXJtMiA8LSBhcy5kYXRhLmZyYW1lKHVubGlzdChzdHJfc3BsaXQocHJvamVjdHMkYFN0YW5kYXJkaXplZCB0ZXJtaW5vbG9naWVzOiBUaGUgcHJvamVjdCB1c2VzIHRoZSBmb2xsb3dpbmcgc3lzdGVtcyAoY2hlY2sgYWxsIHRoYXQgYXBwbHkpYCwgIiwgIikpKQpjb2xuYW1lcyhzdGFuZF90ZXJtMikgPC0gYygic3RhbmRhcmRfdGVybWlub2xvZ2llcyIpCgoKc3RhbmRfdGVybV9yYXRpbzI8LSBzdGFuZF90ZXJtMiAlPiUgCiAgY291bnQoc3RhbmRhcmRfdGVybWlub2xvZ2llcywgc29ydD0gVCkgJT4lIAogIG11dGF0ZShyYXRpbyA9IHJvdW5kKG4vKHN1bShuKS8xMDApKSkKCnN0YW5kX3Rlcm1fcmF0aW8yCmBgYAoKKipDb21tZW50YXJ5Kio6IGByIHN0YW5kX3Rlcm1fcmF0aW8yJHJhdGlvW3N0YW5kX3Rlcm1fcmF0aW8yJHN0YW5kYXJkX3Rlcm1pbm9sb2dpZXMgPT0iV2UgZG9uJ3QgdXNlIGFueSBzdGFuZGFyZGl6ZWQgbGlzdHMiXWAlIG9mIHByb2plY3RzIGRvIG5vdCB1c2UgYW55IHN0YW5kYXJkaXplZCBsaXN0cyBvciB2b2NhYnVsYXJpZXMuIFRob3NlIHByb2plY3RzIGFyZSBtb3N0IGxpa2VseSB0aG9zZSB3aG8gZm9jdXMgb24gM0QgdmlzdWFsaXNhdGlvbiBvZiBpbnNjcmlwdGlvbnMgb3IgcHVibGljYXRpb24gb2YgbWV0YWRhdGEsIHJhdGhlciB0aGFuIHB1YmxpY2F0aW9uIG9mIHRleHQgZWRpdGlvbnMuIGByIHN0YW5kX3Rlcm1fcmF0aW8yJHJhdGlvW3N0YW5kX3Rlcm1fcmF0aW8yJHN0YW5kYXJkX3Rlcm1pbm9sb2dpZXMgPT0iSW50ZXJuYWwgYXV0aG9yaXR5IGxpc3RzIl1gJSBvZiBwcm9qZWN0cyB1c2UgdGhlaXIgb3duIGludGVybmFsIGF1dGhvcml0eSBsaXN0cy4gRUFHTEUgdm9jYWJ1bGFyaWVzIGluIHRoZWlyIG9yaWdpbmFsIGZvcm0gYXJlIHVzZWQgYnkgYHIgc3RhbmRfdGVybV9yYXRpbzIkcmF0aW9bc3RhbmRfdGVybV9yYXRpbzIkc3RhbmRhcmRfdGVybWlub2xvZ2llcyA9PSJFQUdMRSB2b2NhYnVsYXJpZXMgYXMgcHJvdmlkZWQgYXQgaHR0cHM6Ly93d3cuZWFnbGUtbmV0d29yay5ldS9yZXNvdXJjZXMvdm9jYWJ1bGFyaWVzLyJdYCUgb2YgcHJvamVjdHMsIGFuZCBpbiBhbiBlZGl0ZWQgdmVyc2lvbiBieSBgciBzdGFuZF90ZXJtX3JhdGlvMiRyYXRpb1tzdGFuZF90ZXJtX3JhdGlvMiRzdGFuZGFyZF90ZXJtaW5vbG9naWVzID09Ik93biB2ZXJzaW9uIG9mIEVBR0xFIHZvY2FidWxhcmllcyAoZWRpdGVkIGZvciBvdXIgcHJvamVjdCkiXWAlIG9mIHByb2plY3RzLiBTZXZlcmFsIHByb2plY3RzIHRoYXQgZm9jdXMgb24gbGFuZ3VhZ2VzIG90aGVyIHRoYW4gR3JlZWsgYW5kIExhdGluIGhhdmUgY3JlYXRlZCB0aGVpciBvd24gc3lzdGVtcywgc29tZXRpbWVzIHdvcmtpbmcgZnJvbSBleGlzdGluZyB2b2NhYnVsYXJpZXMsIGJ1dCBhbHNvIGJ1aWxkaW5nIHRoZXNhdXJpLCBlLmcuIHRoZSBjcmVhdGlvbiBvZiBhIHRoZXNhdXJ1cyBzdWNoIGFzIHRoZSBPcGVuVGhlc28gdG9vbCAoRXBpVm9jKSA8aHR0cHM6Ly90aGVzYXVydXMubW9tLmZyL29wZW50aGVzby8/aWR0PXRoNjE+IGFsaWduZWQgd2l0aCBleGlzdGluZyB2b2NhYnVsYXJpZXMgb3IgdXNpbmcgdGVybXMgb2YgdGhlIGNvbW11bml0eS4KCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKKipRdWVzdGlvbioqOiAqQXJlIHlvdSB3aWxsaW5nIHRvIHNoYXJlIHRoZSBzdGFuZGFyZGl6ZWQgdGVybWlub2xvZ2llcyB1c2VkIGluIHlvdXIgcHJvamVjdCB3aXRoIHVzIChlLmcuIHR5cGUgb2YgaW5zY3JpcHRpb24gdm9jYWJ1bGFyaWVzLCB0eXBlIG9mIG1hdGVyaWFsIGV0Yy4pKgoKYGBge3J9CnBvbGljeV9zaGFyZTwtIHByb2plY3RzICU+JSAKICBtdXRhdGUocG9saWN5X3NoYXJlID0gYEFyZSB5b3Ugd2lsbGluZyB0byBzaGFyZSB0aGUgc3RhbmRhcmRpemVkIHRlcm1pbm9sb2dpZXMgdXNlZCBpbiB5b3VyIHByb2plY3Qgd2l0aCB1cyAoZS5nLiB0eXBlIG9mIGluc2NyaXB0aW9uIHZvY2FidWxhcmllcywgdHlwZSBvZiBtYXRlcmlhbCBldGMuKWApICU+JSAKICBjb3VudChwb2xpY3lfc2hhcmUsIHNvcnQ9VCkgJT4lIAogIG11dGF0ZShyYXRpbyA9IHJvdW5kKG4vKHN1bShuKS8xMDApKSkKICAKcG9saWN5X3NoYXJlCmBgYAoKKipDb21tZW50YXJ5Kio6IFRoZSB2YXN0IG1ham9yaXR5IG9mIHBhcnRpY2lwYXRpbmcgcHJvamVjdHMgKGByIHBvbGljeV9zaGFyZSRyYXRpb1twb2xpY3lfc2hhcmUkcG9saWN5X3NoYXJlID09ICJZZXMiXWAlKSBpcyB3aWxsaW5nIHRvIHNoYXJlIGFueSBzdGFuZGFyZGl6ZWQgdGVybWlub2xvZ2llcyB1c2VkIGluIHRoZWlyIHByb2plY3QsIHN1Y2ggYXMgdGVybWlub2xvZ2llcyBjb3ZlcmluZyB0aGUgdHlwZSBvZiBpbnNjcmlwdGlvbiwgdGhlIHR5cGUgb2YgbWF0ZXJpYWwgZXRjLgoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgoqKlF1ZXN0aW9uKio6ICpMaW5rZWQgT3BlbiBEYXRhc2V0czogVGhlIHByb2plY3QgdXNlcyB0aGUgZm9sbG93aW5nIHN5c3RlbXM6KgoKYGBge3J9CmxvZDIgPC0gYXMuZGF0YS5mcmFtZSh1bmxpc3Qoc3RyX3NwbGl0KHByb2plY3RzJGBMaW5rZWQgT3BlbiBEYXRhOiBUaGUgcHJvamVjdCB1c2VzIHRoZSBmb2xsb3dpbmcgc3lzdGVtcyAoY2hlY2sgYWxsIHRoYXQgYXBwbHkpYCwgIiwgIikpKQpjb2xuYW1lcyhsb2QyKSA8LSBjKCJsaW5rZWRfZGF0YSIpCgoKbG9kX3JhdGlvMjwtIGxvZDIgJT4lIAogIGNvdW50KGxpbmtlZF9kYXRhLCBzb3J0PSBUKSAlPiUgCiAgbXV0YXRlKHJhdGlvID0gcm91bmQobi8obnJvdyhwcm9qZWN0cykvMTAwKSkpCgpsb2RfcmF0aW8yCmBgYAoKKipDb21tZW50YXJ5Kio6IFBsZWlhZGVzIGlzIHRoZSBtb3N0IHBvcHVsYXIgTE9EIGRhdGFzZXQsIGJlaW5nIHVzZWQgaW4gYHIgbG9kX3JhdGlvMiRyYXRpb1tsb2RfcmF0aW8yJGxpbmtlZF9kYXRhID09ICJQbGVpYWRlcyJdYCUgb2YgYWxsIHBhcnRpY2lwYXRpbmcgcHJvamVjdHMsIGFsb25nc2lkZSBUcmlzbWVnaXN0b3MgYWxzbyBpbiBgciBsb2RfcmF0aW8yJHJhdGlvW2xvZF9yYXRpbzIkbGlua2VkX2RhdGEgPT0gIlRyaXNtZWdpc3RvcyJdYCUuIEVBR0xFIHZvY2FidWxhcmllcyBhcmUgcmVwcmVzZW50ZWQgaW4gYHIgbG9kX3JhdGlvMiRyYXRpb1tsb2RfcmF0aW8yJGxpbmtlZF9kYXRhID09ICJFQUdMRSB2b2NhYnVsYXJpZXMiXWAlIG9mIHBhcnRpY2lwYXRpbmcgcHJvamVjdHMsIHdoaWxlIGNvbWJpbmVkIHByb3NvcG9ncmFwaGljIGRhdGFzZXRzIChMR1BOK1BJUikgZmVhdHVyZSBpbiBgciBzdW0obG9kX3JhdGlvMiRyYXRpb1tsb2RfcmF0aW8yJGxpbmtlZF9kYXRhID09ICJMR1BOIl0rbG9kX3JhdGlvMiRyYXRpb1tsb2RfcmF0aW8yJGxpbmtlZF9kYXRhID09ICJQSVIiXSlgJSBvZiBwcm9qZWN0cy4gT25seSBgciBsb2RfcmF0aW8yJHJhdGlvW2xvZF9yYXRpbzIkbGlua2VkX2RhdGEgPT0gIk90aGVyOiBOb25lIl1gJSBvZiBwYXJ0aWNpcGF0aW5nIHByb2plY3RzIGRvIG5vdCB1c2UgYW55IExPRC4KCmBgYHtyfQoKbG9kcDI8LSBwcm9qZWN0cyRgTGlua2VkIE9wZW4gRGF0YTogVGhlIHByb2plY3QgdXNlcyB0aGUgZm9sbG93aW5nIHN5c3RlbXMgKGNoZWNrIGFsbCB0aGF0IGFwcGx5KWAKCmdlb2dyYXBoaWMyPC0gcm91bmQobnJvdyhhcy5kYXRhLmZyYW1lKGxvZHAyKSAlPiUKICBmaWx0ZXIoc3RyX2RldGVjdChsb2RwMiwgIlRyaXNtZWdpc3Rvc3xQbGVpYWRlc3xPdGhlcjogaURhaUdhemV0dGVlcnxPdGhlcjogR2VvbmFtZXMiKSkpLyhucm93KHByb2plY3RzKS8xMDApKQoKcHJvc29wb2dyYXBoaWMyPC0gcm91bmQobnJvdyhhcy5kYXRhLmZyYW1lKGxvZHAyKSAlPiUKICBmaWx0ZXIoc3RyX2RldGVjdChsb2RwMiwgIkxHUE58UElSfE90aGVyOiBQTFJFIikpKS8obnJvdyhwcm9qZWN0cykvMTAwKSkKCmNocm9ub2xvZ2ljMjwtIHJvdW5kKG5yb3coYXMuZGF0YS5mcmFtZShsb2RwMikgJT4lCiAgZmlsdGVyKHN0cl9kZXRlY3QobG9kcDIsICJQZXJpb2QuT3xPdGhlcjogR09ET1Q6IGh0dHBzOi8vZ29kb3QuZGF0ZS9ob21lIikpKS8obnJvdyhwcm9qZWN0cykvMTAwKSkKYGBgCgpUaGUgZ3JvdXAgb2YgTE9EIHJlc291cmNlcyBmb2N1c2luZyBvbiAqKmdlb2dyYXBoaWMgZGF0YSoqIChlLmcuIFBsZWlhZGVzLCBpRGFpIEdhemV0dGVlciwgR2VvbmFtZXMsIFRyaXNtZWdpc3Rvcykgc2VlbXMgdG8gYmUgc3Ryb25nbHkgcmVwcmVzZW50ZWQgYW1vbmdzdCBwYXJ0aWNpcGF0aW5nIG5vbi1wYXJ0bmVyZWQgcHJvamVjdHMgKGByIGdlb2dyYXBoaWMyYCAlIHVzZSBhdCBsZWFzdCBvbmUgb2YgdGhlbSksIHN1Z2dlc3RpbmcgdGhhdCBnZW9ncmFwaGljIExPRCBhcmUgd2VsbCBlc3RhYmxpc2hlZCBmb3IgdGhlIHN0dWR5IG9mIHRoZSBhbmNpZW50IHdvcmxkLgoKKipQcm9zb3BvZ3JhcGhpYyBkYXRhKiosIHJlcHJlc2VudGVkIGJ5IExHUE4sIFBJUiwgYW5kIFBMUkUgYXJlIHVzZWQgYnkgYHIgcHJvc29wb2dyYXBoaWMyYCUgb2YgYWxsIHBhcnRpY2lwYXRpbmcgbm9uLXBhcnRuZXJlZCBwcm9qZWN0cy4KCioqQ2hyb25vbG9naWNhbCBkYXRhKiosIHJlcHJlc2VudGVkIGJ5IFBlcmlvZC5PIGFuZCBHT0RPVCBhcmUgdXNlZCBieSBgciBjaHJvbm9sb2dpYzJgICUgb2YgYWxsIHBhcnRpY2lwYXRpbmcgbm9uLXBhcnRuZXJlZCBwcm9qZWN0cy4KCkl0IGlzIHdvcnRoIG5vdGluZyB0aGF0IG5vdCBldmVyeSBjYXRlZ29yeSBsaXN0ZWQgYW1vbmdzdCB0aGUgcmVzcG9uc2VzIGlzIGEgdHJ1ZSBsaW5rZWQgb3BlbiBkYXRhc2V0LiBUaGUgc3VydmV5IHJlc3BvbnNlcyBzdWdnZXN0IHRoZXJlIGlzIGEgY29uc2lkZXJhYmxlIHJvb20gZm9yIGltcHJvdmVtZW50IGFuZCBwb3RlbnRpYWxseSBncmVhdCBiZW5lZml0IGluIGNyZWF0aW5nIGFuZCBmdXJ0aGVyIGltcHJvdmluZyBMT0QgZm9yIHRoZSBzdHVkeSBvZiB0aGUgYW5jaWVudCB3b3JsZC4KCiMgRnV0dXJlIG5lZWRzIG9mIGRpZ2l0YWwgZXBpZ3JhcGh5CgpUaGlzIHNlY3Rpb24gY292ZXJzIHRoZSB3aXNoZXMgb2YgYWxsIHBhcnRpY2lwYXRpbmcgZGlnaXRhbCBlcGlncmFwaHkgcHJvamVjdHMuIFRoZSByZXNwb25zZXMgd2VyZSBhbm9ueW1pc2VkIHNvIG5vIGluZGl2aWR1YWwgb3IgcHJvamVjdCBjYW4gYmUgaWRlbnRpZmllZCBidXQgYXJlIG90aGVyd2lzZSBwcmVzZW50ZWQgYXMgc3VibWl0dGVkIGluIHRoZSBzdXJ2ZXkuCgojIyBQYXJ0bmVyIHByb2plY3RzCgoqKlF1ZXN0aW9uKio6ICpPdXIgcHJvamVjdCB3b3VsZCBsaWtlIHRvIGJlIGFibGUgdG8gdXNlIHdpdGhpbiB0aGUgbmV4dCB0aHJlZSB5ZWFyczoqCgpgYGB7cn0KbG9kX2Z1dHVyZSA8LSBhcy5kYXRhLmZyYW1lKHVubGlzdChzdHJfc3BsaXQocGFydG5lcnMkYFNlbGVjdCBhbGwgb3B0aW9ucyB5b3VyIHByb2plY3QgbGlrZSB0byBiZSBhYmxlIHRvIHVzZSB3aXRoaW4gdGhlIG5leHQgdGhyZWUgeWVhcnM6YCwgIiwgIikpKQpjb2xuYW1lcyhsb2RfZnV0dXJlKSA8LSBjKCJsb2RfZiIpCgoKbG9kX2ZfcmF0aW88LSBsb2RfZnV0dXJlICU+JSAKICBjb3VudChsb2RfZiwgc29ydD0gVCkgJT4lIAogIG11dGF0ZShyYXRpbyA9IHJvdW5kKG4vKG5yb3cocGFydG5lcnMpLzEwMCkpKQpsb2RfZl9yYXRpbwpgYGAKCioqQ29tbWVudGFyeSoqOiBUaGUgbW9zdCBwb3B1bGFyIGlzIHRoZSBvcHRpb24gYEJpYmxpb2dyYXBoaWNhbCByZWZlcmVuY2VzIHRvIGFsbCBlcGlncmFwaGljIHB1YmxpY2F0aW9ucyB3aXRoIHN0YWJsZSBVUkkgKGUuZy4gWmVub24pYCwgcmVwcmVzZW50aW5nIHRoZSB3aXNoZXMgb2YgYHIgbG9kX2ZfcmF0aW8kcmF0aW9bbG9kX2ZfcmF0aW8kbG9kX2Y9PSJCaWJsaW9ncmFwaGljYWwgcmVmZXJlbmNlcyB0byBhbGwgZXBpZ3JhcGhpYyBwdWJsaWNhdGlvbnMgd2l0aCBzdGFibGUgVVJJIChlLmcuIFplbm9uKSJdYCUgb2YgYWxsIHBhcnRuZXIgcHJvamVjdHMuCgpUaGUgZ3JlYXQgaW50ZXJlc3QgaW4gcHJvc29wb2dyYXBoaWMgTE9EIGZvciBlcGlncmFwaHkgaXMgc3VwcG9ydGVkIGJ5IGByIGxvZF9mX3JhdGlvJHJhdGlvW2xvZF9mX3JhdGlvJGxvZF9mPT0iUm9tYW4gUHJvc29wb2dyYXBoaWNhbCBkYXRhIHdpdGggc3RhYmxlIFVSSXMiXWAlIG9mIHBhcnRuZXIgcHJvamVjdHMgZm9yIHRoZSBSb21hbiB3b3JsZCBhbmQgYHIgbG9kX2ZfcmF0aW8kcmF0aW9bbG9kX2ZfcmF0aW8kbG9kX2Y9PSJHcmVlayBPbm9tYXN0aWMgZGF0YSB3aXRoIHN0YWJsZSBVUklzIChlLmcuIExHUE4gd2l0aCBzdGFibGUgaWRlbnRpZmllcnMpIl1gJSBvZiBwcm9qZWN0cyBmb3IgdGhlIEdyZWVrIHdvcmxkIHJlc3BlY3RpdmVseS4KClRoZSBgaW1wcm92ZWQgRUFHTEUgdm9jYWJ1bGFyaWVzYCBhcmUgd2lzaGVkIGZvciBieSBgciBsb2RfZl9yYXRpbyRyYXRpb1tsb2RfZl9yYXRpbyRsb2RfZj09IkVBR0xFIHZvY2FidWxhcmllcyAocmV2aXNlZCBhbmQgZXh0ZW5kZWQgd2l0aCBjbGVhciBzdHJ1Y3R1cmUgKyBlbGltaW5hdGVkIGR1cGxpY2F0ZXMgKyBtdWx0aS1sYW5ndWFnZSBzdXBwb3J0KSJdYCUgb2YgcGFydG5lciBwcm9qZWN0cy4KClRoZSBgZG9tYWluLXNwZWNpZmljIHJlcG9zaXRvcnkgZm9yIGVwaWdyYXBoaWMgZGF0YWAgKGRpc2N1c3NlZCBhbHNvIHVuZGVyIGBPdGhlcmAgcmVzcG9uc2VzKSBvciB0aGUgYG9wZW4gYW5kIGFjY2Vzc2libGUgUkRGIFRyaXBsZXN0b3JlYCBkbyBub3Qgc2VlbSB0byBiZSB0aGUgaGlnaGVzdCBwcmlvcml0eSBvZiBwYXJ0aWNpcGF0aW5nIHByb2plY3RzLCBidXQgYXJlIHN0aWxsIHJlbGF0aXZlbHkgcG9wdWxhciBhcyBgciBsb2RfZl9yYXRpbyRyYXRpb1tsb2RfZl9yYXRpbyRsb2RfZj09Ik9uZSBkb21haW4gc3BlY2lmaWMgcmVwb3NpdG9yeSBmb3IgZXBpZ3JhcGhpYyBkYXRhIl1gJSBvZiByZXNwb25kYW50cyB3aXNoZXMgZm9yIG9uZSBvZiB0aGUgdHdvLiBPbmUgcGFydGljaXBhdGluZyBwcm9qZWN0IHdpc2hlcyBzcGVjaWZpY2FsbHkgZm9yIHRoZSBmb2xsb3dpbmc6IGByIGxvZF9mX3JhdGlvJGxvZF9mWzddYC4KCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKKipRdWVzdGlvbioqOiAqUG90ZW50aWFsIGlkZWFzIHRoYXQgb3VyIHByb2plY3Qgd291bGQgYmVuZWZpdCBmcm9tOioKCmBgYHtyLCBsaW5ld2lkdGg9OTB9CmxvZF9pZGVhcyA8LSBhcy5kYXRhLmZyYW1lKHVubGlzdChzdHJfc3BsaXQocGFydG5lcnMkYFNlbGVjdCBhbGwgaXRlbXMgeW91ciBwcm9qZWN0IHdvdWxkIGJlbmVmaXQgZnJvbSBpbiB0aGUgbmV4dCB0aHJlZSB5ZWFyczpgLCAiLCAiKSkpCmNvbG5hbWVzKGxvZF9pZGVhcykgPC0gYygibG9kX2kiKQoKCmxvZF9pX3JhdGlvPC0gbG9kX2lkZWFzICU+JSAKICBjb3VudChsb2RfaSwgc29ydD0gVCkgJT4lIAogIG11dGF0ZShyYXRpb19hbGxfcHJvaiA9IHJvdW5kKG4vKG5yb3cocGFydG5lcnMpLzEwMCkpKQoKbG9kX2lfcmF0aW8KYGBgCgoqKkNvbW1lbnRhcnkqKjogYHIgbG9kX2lfcmF0aW8kcmF0aW9fYWxsX3Byb2pbbG9kX2lfcmF0aW8kbG9kX2kgPT0gIlNldCBvZiBndWlkZWxpbmVzIGZvciBGQUlSIGFuZCBMaW5rZWQgT3BlbiBEYXRhIGluIGVwaWdyYXBoeSJdWzFdYCUgb2YgYWxsIHByb2plY3RzIGNvbnNpZGVyIHRoYXQgdGhleSB3b3VsZCBiZW5lZml0IGZyb20gYEEgc2V0IG9mIGd1aWRlbGluZXMgZm9yIEZBSVIgYW5kIExpbmtlZCBPcGVuIERhdGEgaW4gZXBpZ3JhcGh5YC4gVGhlcmUgaXMgYSBnZW5lcmFsIGludGVyZXN0IGluIHByYWN0aWNhbCBleGFtcGxlcyBhbmQgd29ya3Nob3Aocykgb24gaG93IHRvIHVzZSBMT0QgYW5kIEZBSVIgUHJpbmNpcGxlcyBpbiBlcGlncmFwaHksIGFzIHdlbGwgYXMgcmVzb3VyY2VzIGZvciBxdWFudGl0YXRpdmUgYW5hbHlzaXMgb2YgZGF0YSBpbiBlcGlncmFwaHkuCgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCioqUXVlc3Rpb24qKjogKkFkZGl0aW9uYWwgZGlnaXRhbCBuZWVkcyoKCmBgYHtyLCBsaW5ld2lkdGg9OTB9CnVuaXF1ZShuYS5vbWl0KHBhcnRuZXJzJGBZb3VyIHBlcnNvbmFsIHdpc2ggbGlzdC4gUHJvdmlkZSBhIGRlc2NyaXB0aW9uIG9mIHBvdGVudGlhbCB0YXNrcyBhbmQgaXNzdWVzIHRoZSBGQUlSIEVwaWdyYXBoeSBjYW4gaGVscCB5b3VyIHByb2plY3Qgd2l0aGluIHRoZSBuZXh0IHRocmVlIHllYXJzIChhbmQgYmV5b25kKWApKQpgYGAKCioqQ29tbWVudGFyeSoqOiBUaGlzIHNlY3Rpb24gY292ZXJzIHRoZSBhZGRpdGlvbmFsIG5lZWRzIG9mIHBhcnRuZXIgcHJvamVjdHMuIFBhcnRuZXIgcHJvamVjdHMgd291bGQgbGlrZSB0byBzZWUgYSBwbGF0Zm9ybSBsaW5raW5nIGVwaWdyYXBoaWMgZGF0YSBmcm9tIG11bHRpcGxlIHNvdXJjZXMsIGluY2x1ZGluZyBhIHN0YWJsZSByZWZlcmVuY2UgcG9pbnQgb3IgYW4gQVBJIGZvciBpbXByb3ZlZCBlcGlncmFwaGljIHZvY2FidWxhcmllcyAoaW4gb3RoZXIgd29yZHMsIHRoZSBzb3J0IG9mIHJlc291cmNlIHdoaWNoIGFncmVlZCB2b2NhYnVsYXJpZXMgYW5kIGFuIFJERiB0cmlwbGVzdG9yZSBtaWdodCBmYWNpbGl0YXRlKS4gUGFydG5lciBwcm9qZWN0cyB3b3VsZCBhbHNvIGxpa2UgdG8gYmUgYWJsZSB0byB1c2UgZ3VpZGVsaW5lcyBmb3IgRkFJUiBwcmFjdGljZXMgaW4gZXBpZ3JhcGh5LCB3aGljaCBjdXJyZW50bHkgZG8gbm90IGV4aXN0LgoKIyMgTm9uLXBhcnRuZXJlZCBwcm9qZWN0cwoKKipRdWVzdGlvbioqOiAqT3VyIHByb2plY3Qgd291bGQgbGlrZSB0byBiZSBhYmxlIHRvIHVzZSB3aXRoaW4gdGhlIG5leHQgdGhyZWUgeWVhcnM6KgoKYGBge3J9CmxvZF9mdXR1cmUyIDwtIGFzLmRhdGEuZnJhbWUodW5saXN0KHN0cl9zcGxpdChwcm9qZWN0cyRgU2VsZWN0IGFsbCBvcHRpb25zIHlvdXIgcHJvamVjdCBsaWtlIHRvIGJlIGFibGUgdG8gdXNlIHdpdGhpbiB0aGUgbmV4dCB0aHJlZSB5ZWFyczpgLCAiLCAiKSkpCmNvbG5hbWVzKGxvZF9mdXR1cmUyKSA8LSBjKCJsb2RfZiIpCgoKbG9kX2ZfcmF0aW8yPC0gbG9kX2Z1dHVyZTIgJT4lIAogIGNvdW50KGxvZF9mLCBzb3J0PSBUKSAlPiUgCiAgbXV0YXRlKHJhdGlvX2FsbF9wcm9qID0gcm91bmQobi8obnJvdyhwcm9qZWN0cykvMTAwKSkpCmxvZF9mX3JhdGlvMgpgYGAKCioqQ29tbWVudGFyeSoqOiBUaGUgbW9zdCBwb3B1bGFyIGlzIHRoZSBvcHRpb24gYEJpYmxpb2dyYXBoaWNhbCByZWZlcmVuY2VzIHRvIGFsbCBlcGlncmFwaGljIHB1YmxpY2F0aW9ucyB3aXRoIHN0YWJsZSBVUkkgKGUuZy4gWmVub24pYCByZXByZXNlbnRpbmcgdGhlIHdpc2hlcyBvZiBgciBsb2RfZl9yYXRpbzIkcmF0aW9fYWxsX3Byb2pbbG9kX2ZfcmF0aW8yJGxvZF9mID09IkJpYmxpb2dyYXBoaWNhbCByZWZlcmVuY2VzIHRvIGFsbCBlcGlncmFwaGljIHB1YmxpY2F0aW9ucyB3aXRoIHN0YWJsZSBVUkkgKGUuZy4gWmVub24pIl1gJSBvZiBhbGwgcGFydGljaXBhdGluZyBwcm9qZWN0cy4gVGhlIGdyZWF0IGludGVyZXN0IGluIG9ub21hc3RpYyBhbmQgcHJvc29wb2dyYXBoaWMgTE9EIGZvciBib3RoIHRoZSBHcmVlayBhbmQgUm9tYW4gd29ybGQgaXMgc3VwcG9ydGVkIGJ5IGByIGxvZF9mX3JhdGlvMiRyYXRpb19hbGxfcHJvaltsb2RfZl9yYXRpbzIkbG9kX2YgPT0gIkdyZWVrIE9ub21hc3RpYyBkYXRhIHdpdGggc3RhYmxlIFVSSXMgKGUuZy4gTEdQTiB3aXRoIHN0YWJsZSBpZGVudGlmaWVycykiXStsb2RfZl9yYXRpbzIkcmF0aW9fYWxsX3Byb2pbbG9kX2ZfcmF0aW8yJGxvZF9mID09ICJSb21hbiBQcm9zb3BvZ3JhcGhpY2FsIGRhdGEgd2l0aCBzdGFibGUgVVJJcyJdYCUgb2Ygbm9uLXBhcnRuZXJlZCBwcm9qZWN0cy4gVGhlIGBpbXByb3ZlZCBFQUdMRSB2b2NhYnVsYXJpZXNgIGFyZSB3aXNoZWQgZm9yIGJ5IGByIGxvZF9mX3JhdGlvMiRyYXRpb19hbGxfcHJvaltsb2RfZl9yYXRpbzIkbG9kX2Y9PSJFQUdMRSB2b2NhYnVsYXJpZXMgKHJldmlzZWQgYW5kIGV4dGVuZGVkIHdpdGggY2xlYXIgc3RydWN0dXJlICsgZWxpbWluYXRlZCBkdXBsaWNhdGVzICsgbXVsdGktbGFuZ3VhZ2Ugc3VwcG9ydCkiXWAlIG9mIG5vbi1wYXJ0bmVyZWQgcHJvamVjdHMuIFRoZSBgZG9tYWluLXNwZWNpZmljIHJlcG9zaXRvcnkgZm9yIGVwaWdyYXBoaWMgZGF0YWAgKGByIGxvZF9mX3JhdGlvMiRyYXRpb19hbGxfcHJvaltsb2RfZl9yYXRpbyRsb2RfZj09Ik9uZSBkb21haW4gc3BlY2lmaWMgcmVwb3NpdG9yeSBmb3IgZXBpZ3JhcGhpYyBkYXRhIl1gJSkgb3IgdGhlIGBvcGVuIGFuZCBhY2Nlc3NpYmxlIFJERiBUcmlwbGVzdG9yZWAgKGByIGxvZF9mX3JhdGlvMiRyYXRpb19hbGxfcHJvaltsb2RfZl9yYXRpbyRsb2RfZj09Ik9wZW4gYW5kIGFjY2Vzc2libGUgUkRGIFRyaXBsZXN0b3JlIl1gJSkgZG8gbm90IHNlZW0gdG8gYmUgdGhlIGhpZ2hlc3QgcHJpb3JpdHkgb2YgcGFydGljaXBhdGluZyBwcm9qZWN0cywgYnV0IHN0aWxsIGEgcmVsYXRpdmVseSBwb3B1bGFyIHJlc3BvbnNlLiBPbmUgcGFydGljaXBhdGluZyBwcm9qZWN0IHdpc2hlcyBzcGVjaWZpY2FsbHkgZm9yIHRoZSBmb2xsb3dpbmc6IGByIGxvZF9mX3JhdGlvMiRsb2RfZls4XWAsIHdoaWNoIG90aGVyIGV4aXN0aW5nIHByb2plY3RzLCBzdWNoIGFzIFBsZWlhZGVzIG9yIFRyaXNtZWdpc3RvcywgbWlnaHQgYmUgYmV0dGVyIGVxdWlwcGVkIHRvIHByb3ZpZGUuIFRoZSBkaWZmZXJlbmNlcyBiZXR3ZWVuIHRoZSB3aXNoZXMgYW5kIGFuc3dlcnMgb2YgdGhlIG5vbi1wYXJ0bmVyZWQgcHJvamVjdHMgaXMgKmludGVyIGFsaWEqIHJlbGF0ZWQgdG8gdGhlIGZhY3QgdGhhdCBzZXZlcmFsIHBhcnRuZXIgcHJvamVjdHMgY29tZSBmcm9tIGEgd29ybGQgYmV5b25kIEdyZWVrIGFuZCBMYXRpbiBlcGlncmFwaHkuCgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCioqUXVlc3Rpb24qKjogKlBvdGVudGlhbCBpZGVhcyB0aGF0IG91ciBwcm9qZWN0IHdvdWxkIGJlbmVmaXQgZnJvbToqCgpgYGB7cn0KbG9kX2lkZWFzMiA8LSBhcy5kYXRhLmZyYW1lKHVubGlzdChzdHJfc3BsaXQocHJvamVjdHMkYFNlbGVjdCBhbGwgaXRlbXMgeW91ciBwcm9qZWN0IHdvdWxkIGJlbmVmaXQgZnJvbSBpbiB0aGUgbmV4dCB0aHJlZSB5ZWFyczpgLCAiLCAiKSkpCmNvbG5hbWVzKGxvZF9pZGVhczIpIDwtIGMoImxvZF9pIikKCgpsb2RfaV9yYXRpbzI8LSBsb2RfaWRlYXMyICU+JSAKICBjb3VudChsb2RfaSwgc29ydD0gVCkgJT4lIAogIG11dGF0ZShyYXRpb19hbGxfcHJvaiA9IHJvdW5kKG4vKG5yb3cocHJvamVjdHMpLzEwMCkpKQoKbG9kX2lfcmF0aW8yCmBgYAoKKipDb21tZW50YXJ5Kio6IGByIGxvZF9pX3JhdGlvMiRyYXRpb19hbGxfcHJvaltsb2RfaV9yYXRpbzIkbG9kX2kgPT0gIlNldCBvZiBndWlkZWxpbmVzIGZvciBGQUlSIGFuZCBMaW5rZWQgT3BlbiBEYXRhIGluIGVwaWdyYXBoeSJdYCUgb2YgYWxsIG5vbi1wYXJ0bmVyZWQgcHJvamVjdHMgY29uc2lkZXIgdGhhdCB0aGV5IHdvdWxkIGJlbmVmaXQgZnJvbSBgQSBzZXQgb2YgZ3VpZGVsaW5lcyBmb3IgRkFJUiBhbmQgTGlua2VkIE9wZW4gRGF0YSBpbiBlcGlncmFwaHlgLiBUaGVyZSBpcyBhIGdlbmVyYWwgaW50ZXJlc3QgaW4gcHJhY3RpY2FsIGV4YW1wbGVzIChgciBsb2RfaV9yYXRpbzIkcmF0aW9fYWxsX3Byb2pbbG9kX2lfcmF0aW8yJGxvZF9pID09IlByYWN0aWNhbCBzY3JpcHRlZCBleGFtcGxlcyBvbiBob3cgdG8gdXNlIExPRCBpbiBlcGlncmFwaHkiXWAlKSBhbmQgd29ya3Nob3Aocykgb24gaG93IHRvIHVzZSBMT0QgaW4gZXBpZ3JhcGh5IChgciBsb2RfaV9yYXRpbzIkcmF0aW9fYWxsX3Byb2pbbG9kX2lfcmF0aW8yJGxvZF9pID09IldvcmtzaG9wIG9uIGhvdyB0byB1c2UgTE9EIGluIGVwaWdyYXBoeSJdYCUpLCBhcyB3ZWxsIGFzIHJlc291cmNlcyBmb3IgcXVhbnRpdGF0aXZlIGFuYWx5c2lzIG9mIGRhdGEgaW4gZXBpZ3JhcGh5IChgciBsb2RfaV9yYXRpbzIkcmF0aW9fYWxsX3Byb2pbbG9kX2lfcmF0aW8kbG9kX2kgPT0iU2V0IG9mIGd1aWRlbGluZXMvcmVzb3VyY2VzIGZvciBxdWFudGl0YXRpdmUgYW5hbHlzaXMgb2YgZXBpZ3JhcGhpYyBkYXRhIl1bMV1gJSkuCgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCioqUXVlc3Rpb24qKjogKkFkZGl0aW9uYWwgZGlnaXRhbCBuZWVkcyoKCmBgYHtyLCBsaW5ld2lkdGg9OTB9CnVuaXF1ZShuYS5vbWl0KHByb2plY3RzJGBZb3VyIHBlcnNvbmFsIHdpc2ggbGlzdC4gUHJvdmlkZSBhIGRlc2NyaXB0aW9uIG9mIHBvdGVudGlhbCB0YXNrcyBhbmQgaXNzdWVzIHRoZSBGQUlSIEVwaWdyYXBoeSBjYW4gaGVscCB5b3VyIHByb2plY3Qgd2l0aGluIHRoZSBuZXh0IHRocmVlIHllYXJzIChhbmQgYmV5b25kKWApKQpgYGAKCioqQ29tbWVudGFyeSoqOiBUaGlzIHNlY3Rpb24gY292ZXJzIGFkZGl0aW9uYWwgbmVlZHMgb2YgcGFydGljaXBhdGluZyBkaWdpdGFsIHByb2plY3RzLiBTb21lIG9mIHRoZSB3aXNoZXMgbWlnaHQgYmUgYmV5b25kIHRoZSBzY29wZSBvZiB0aGUgRkFJUiBFcGlncmFwaHkgcHJvamVjdCBidXQgdGhlIHJlc3BvbnNlcyBwcm92aWRlIHZhbHVhYmxlIGd1aWRhbmNlIGFuZCBoaW50IGF0IHNvbWUgb2YgdGhlIGNoYWxsZW5nZXMgdGhlIGVwaWdyYXBoaWMgZGlzY2lwbGluZSB3aWxsIGJlIGZhY2luZyBpbiB0aGUgbmVhciBmdXR1cmUuIFRoZSByZXNwb25zZXMgbWF5IGluc3BpcmUgb3RoZXIgcHJvamVjdHMgd2l0aCBzaW1pbGFyIG5lZWRzIHRvIGpvaW4gZm9yY2VzIGFuZCBwb3RlbnRpYWxseSBkZXZlbG9wIHNvbHV0aW9ucyB0b2dldGhlci4gVGhlIEZBSVIgRXBpZ3JhcGh5IHByb2plY3QgbWF5IG9mZmVyIG9uZSBjaGFubmVsIHRvIGV4cGxvcmUgYW5kIGNvbGxhYm9yYXRlIG9uIHRoZSBtZWV0aW5nIG9mIHRoZXNlIG5lZWRzIGluIGZ1dHVyZS4KCiMgU3VtbWFyeQoKVGhlIHByZXNlbnQgcmVwb3J0IGRlbW9uc3RyYXRlcyBhIGdyZWF0IHZhcmlhdGlvbiBpbiB0aGUgZXBpZ3JhcGhpYyBkaXNjaXBsaW5lIGluIDIwMjIuIFdlIHJlY2VpdmVkIGFuc3dlcnMgZnJvbSAxMyBwYXJ0bmVyIHByb2plY3RzIGFuZCAyNyBub24tcGFydG5lcmVkIHByb2plY3RzLiBBbHRob3VnaCBpdCBtYXkgc2VlbSB0aGF0IGEgcmVsYXRpdmVseSBzbWFsbCBudW1iZXIgb2YgcHJvamVjdHMgcGFydGljaXBhdGVkIGluIHRoZSBzdXJ2ZXksIG5vbnRoZWxlc3MsIHdlIGNvbnNpZGVyIHRoYXQgcmVzcG9uc2VzIHByb3ZpZGUgYSByZXByZXNlbnRhdGl2ZSBzYW1wbGUgb2YgdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIGRpc2NpcGxpbmUuIFRoZSByZXNwb25zZSByYXRlIG9mIG5vbi1wYXJ0bmVyZWQgcHJvamVjdHMgd2FzIGxvd2VyIHRoYW4gdGhlIHJlc3BvbnNlIHJhdGUgb2YgcGFydG5lciBwcm9qZWN0cyAoMTAwICUgdnMgMzEgJSkuIFRoaXMgbWF5IHJlZmxlY3QgdGhlIG92ZXJhbGwgbG93ZXIgcmF0ZSBvZiBjb21wbGlhbmNlIHdpdGggRkFJUiBwcmluY2lwbGVzLCBvciB0aGUgZmFjdCB0aGF0IG5vbi1wYXJ0bmVyZWQgcHJvamVjdHMgbWF5IGhhdmUgY2Vhc2VkIGFjdGl2ZSBvcGVyYXRpb24gYmVmb3JlIEZBSVIgcHJpbmNpcGxlcyB3ZXJlIGVzdGFibGlzaGVkIGFuZCBpbXBsZW1lbnRlZCBieSB0aGVpciBpbnN0aXR1dGlvbnMgYW5kIGZ1bmRpbmcgYm9kaWVzLgoKVGhlIHJlc3BvbnNlcyByZXByZXNlbnQgYSBkaXZlcnNlIHNlbGVjdGlvbiBvZiBwcm9qZWN0cywgYmFzZWQgbW9zdGx5IGluIEV1cm9wZSBhbmQgdGhlIFVTQS4gVGhlIG1ham9yaXR5IG9mIHByb2plY3RzIGZvY3VzIHByZWRvbWluYW50bHkgb24gcHVibGljYXRpb24gb2YgdGV4dHVhbCBlZGl0aW9ucyBvZiBpbnNjcmlwdGlvbnMgKHdoZXJlIEVwaWRvYyBYTUwgaXMgdGhlIG1haW4gZGF0YSBmb3JtYXQpLCB3aGlsZSBzb21lIGZvY3VzIG9uIHB1YmxpY2F0aW9uIG9mIHJlbGF0ZWQgbWV0YWRhdGEgd2l0aG91dCBwcm9kdWNpbmcgbmV3IGVkaXRpb25zIG9mIHRleHQgKGFuZCB0aHVzIHVzZSBkaWZmZXJlbnQgZGF0YSBmb3JtYXRzIHRoYW4gRXBpZG9jIFhNTCkuCgpBbHRob3VnaCB0aGUgbWFqb3JpdHkgb2YgcGFydGljaXBhdGluZyBwcm9qZWN0cyByZWNvcmQgaW5zY3JpcHRpb25zIGluIExhdGluIGFuZCBHcmVlaywgd2Ugc2VlIGEgZGl2ZXJzZSBhcnJheSBvZiBwcm9qZWN0cyBleHBhbmRpbmcgYmV5b25kIHRoZSB0cmFkaXRpb25hbCBmb2N1cyBvZiB0aGUgZGlzY2lwbGluZSB0aGUgd2F5IGFzIGl0IHdhcyBlc3RhYmxpc2hlZCBpbiB0aGUgMTl0aCBjZW50dXJ5LiBUaGUgcHJvamVjdHMgcGFydGljaXBhdGluZyBpbiB0aGUgc3VydmV5IGluY2x1ZGUgd2VsbC1lc3RhYmxpc2hlZCBwcm9qZWN0cyB0aGF0IGhhdmUgZXhpc3RlZCBvdmVyIHNldmVyYWwgZGVjYWRlcywgcmVnaW9uYWwgb3IgdGhlbWF0aWMgY29ycG9yYSwgYW5kIG1vcmUgc3BlY2lhbGlzZWQsIHNob3J0LXRlcm0gUGhEIHByb2plY3RzLiBXZSBoYXZlIG9ic2VydmVkIGEgY2xlYXIgZGlzdGluY3Rpb24gYmV0d2Vlbiwgb24gdGhlIG9uZSBoYW5kLCBwcm9qZWN0cyB3aXRoIGEgbG9uZyB0cmFkaXRpb24gYW5kIG1vc3QgaW1wb3J0YW50bHkgd2l0aCByZWxhdGl2ZWx5IHN0YWJsZSBpbnN0aXR1dGlvbmFsIHN1cHBvcnQsIHdoaWNoIGhhdmUgYWNjZXNzIHRvIGluc3RpdHV0aW9uYWwgcmVwb3NpdG9yaWVzLCBwb2xpY2llcyBhbmQgYXQgbGVhc3QgYmFzaWMgSVQgc2VydmljZXM7IGFuZCBvbiB0aGUgb3RoZXIsIHNtYWxsLXNjYWxlIHByb2plY3RzIHdpdGggbGltaXRlZCBzdXBwb3J0IGFuZCBhY2Nlc3MgdG8gcmVzb3VyY2VzIGFuZCB0cmFpbmluZywgdHlwaWZpZWQgYnkgc2hvcnQtdGVybSBwcm9qZWN0cyBvbiBhIHNwZWNpZmljIHRvcGljIHRoYXQgbWF5IGxhY2sgYWNjZXNzIHRvIGxvbmctdGVybSBpbnN0aXR1dGlvbmFsIHN1cHBvcnQuIE9uZSBvZiB0aGUgbWlzc2lvbnMgb2YgdGhlIEZBSVIgRXBpZ3JhcGh5IFByb2plY3QgaXMgdG8gc3VwcG9ydCBwcm9qZWN0cyB3aXRoIGxpbWl0ZWQgYWNjZXNzIHRvIHJlc291cmNlcywgYXMgd2VsbCBhcyBlc3RhYmxpc2hlZCBwcm9qZWN0cywgYnkgcHJvdmlkaW5nIGFjY2Vzc2libGUgYW5kIGNvbXByZWhlbnNpYmxlIHRyYWluaW5nIGFuZCBndWlkZWxpbmVzIGZvciBGQUlSIGFuZCBMaW5rZWQgT3BlbiBEYXRhIHByaW5jaXBsZXMgaW4gZXBpZ3JhcGh5LgoKVGhlIGVzdGFibGlzaGVkIHByb2plY3RzIG1vc3RseSBmb2xsb3cgdGhlIEZBSVIgcHJpbmNpcGxlcywgYWx0aG91Z2ggdG8gYSB2YXJpYWJsZSBleHRlbnQuIFRoZSBtYWpvcml0eSBvZiBlc3RhYmxpc2hlZCBwcm9qZWN0cyBzaGFyZSB0aGVpciBkYXRhIHVuZGVyIGEgQ3JlYXRpdmUgQ29tbW9ucyBsaWNlbnNlIGluIG9uZSBvciBtb3JlIHdpZGVseSBhY2NlcHRlZCBmb3JtYXRzICh3aXRoIEVwaWRvYyBYTUwgYmVpbmcgdGhlIG1vc3QgcG9wdWxhciBmb3JtYXQgZm9yIGFsbCB0eXBlcyBvZiBwcm9qZWN0cyBpcnJlc3BlY3RpdmUgb2YgdGhlaXIgc3RhdHVzIGFuZCBsb25nZXZpdHkpLiBJbiBnZW5lcmFsLCB0aGUgbW9yZSBlc3RhYmxpc2hlZCBwcm9qZWN0cyBwcm92aWRlIG1vcmUgYWNjZXNzIHBvaW50cyB0byB0aGVpciBkYXRhIGFzIHdlbGwgYXMgbW9yZSBkYXRhIGZvcm1hdHMgdGhhbiB0aGUgcHJvamVjdHMgd2l0aCBsZXNzIGluc3RpdHV0aW9uYWwgc3VwcG9ydC4gVGhlIHVzZSBvZiBzdGFuZGFyZGl6ZWQgdGVybWlub2xvZ2llcyBpcyBzdGlsbCBsaW1pdGVkIGFuZCBwcm9qZWN0LXNwZWNpZmljLCBtb3N0bHkgZHVlIHRvIHRoZSBsYWNrIG9mIHVuaWZvcm1seSBhY2NlcHRlZCBzdGFuZGFyZHMuIE9uIGNvbnRyYXJ5LCB0aGUgYWRvcHRpb24gb2YgTGlua2VkIE9wZW4gRGF0YXNldHMgKExPRCkgYW5kIGNyZWF0aW9uIG9mIGxpbmtzIHdpdGhpbiB0aGUgZXBpZ3JhcGhpYyBkYXRhc2V0cyB3aXRoIHN0YWJsZSBpZGVudGlmaWVycyB0byB0aG9zZSBMT0Qgc291cmNlcyBzZWVtcyB0byBiZSBmYWlybHkgYWR2YW5jZWQsIGVzcGVjaWFsbHkgaW4gdGhlIGNhc2Ugb2Ygd2VsbC1lc3RhYmxpc2hlZCBMT0QgZG9tYWlucyBzdWNoIGFzIFBsZWlhZGVzIG9yIFRyaXNtZWdpc3RvcyBmb3IgR3JhZWNvLVJvbWFuIHByb2plY3RzLCBhbmQgdG8gYSBsZXNzZXIgZXh0ZW50IHRoZSBFQUdMRSB2b2NhYnVsYXJpZXMuCgpUaGUgbm9uLXBhcnRuZXJlZCBwcm9qZWN0cyBmb2xsb3cgdGhlIEZBSVIgcHJpbmNpcGxlcywgYnV0IHRvIGEgbGVzc2VyIGRlZ3JlZSB0aGFuIHRoZSBlc3RhYmxpc2hlZCBwcm9qZWN0cy4gVGhlcmUgYXJlLCBob3dldmVyLCBzb21lIHNob3J0LXRlcm0gcHJvamVjdHMgdGhhdCBmdWxmaWxsIG9yIGV4Y2VlZCB0aGUgcmVxdWlyZW1lbnRzIGZvciBPcGVuIFNjaWVuY2UsIGJ1dCBhcyBhIGdlbmVyYWwgcnVsZSB0aGUgY29tcGxpYW5jZSBpcyBsb3dlciB0aGFuIGluIHRoZSBjYXNlIG9mIGVzdGFibGlzaGVkIHByb2plY3RzLiBUaGUgcmVhc29uIGZvciBsb3dlciBjb21wbGlhbmNlIGluIHNvbWUgcHJvamVjdHMgaXMgbW9zdCBsaWtlbHkgYSBjb21iaW5hdGlvbiBvZiBzaG9ydC10ZXJtIGluc3RpdHV0aW9uYWwgc3VwcG9ydCwgbGltaXRlZCBhY2Nlc3MgdG8gSVQgc3VwcG9ydCBhbmQgcG9vciBhY2Nlc3NpYmlsaXR5IG9mIGd1aWRlbGluZXMgYW5kIGRpc2NpcGxpbmUtc3BlY2lmaWMgdHJhaW5pbmcuCgpBcyB0byB0aGUgY3VycmVudCBhbmQgZnV0dXJlIG5lZWRzIG9mIGRpZ2l0YWwgZXBpZ3JhcGh5LCB0aGVyZSBpcyBhIGNsZWFyIGRlbWFuZCBmb3IgbW9yZSBhbmQgYmV0dGVyIExPRC4gVGhlIHJlcXVlc3RzIGNvbmNlcm5lZCBlc3BlY2lhbGx5IGJpYmxpb2dyYXBoaWNhbCByZWZlcmVuY2VzIHRvIHN0YW5kYXJkIGVwaWdyYXBoaWMgY29ycG9yYSwgc3RhbmRhcmRpc2F0aW9uIG9mIGRpc2NpcGxpbmUtc3BlY2lmaWMgdm9jYWJ1bGFyaWVzLCBhbmQgcHJvc29wb2dyYXBoaWMgTE9EIGZvciB0aGUgYW5jaWVudCB3b3JsZC4gSW4gYWRkaXRpb24sIHRoZXJlIGlzIGEgd2lzaCBmb3Igc3VwcG9ydCBieSB0cmFpbmluZyBhbmQgdGhlIHByb3Zpc2lvbiBvZiBhY2Nlc3NpYmxlIHJlc291cmNlcyBhbmQgZ3VpZGVsaW5lcyBmb3IgRkFJUiBhbmQgT3BlbiBlcGlncmFwaHkuCgpJbiB0aGUgbmVhciBmdXR1cmUsIHdlIHBsYW4gdG8gdW5kZXJ0YWtlIHNldmVyYWwgaW4tZGVwdGggaW50ZXJ2aWV3cyB3aXRoIG91ciBwYXJ0bmVycyB0byBjb25maXJtIHNvbWUgb2Ygb3VyIGFzc3VtcHRpb25zIGFuZCB0byBkcmFmdCBhIGNvbmNyZXRlIHBsYW4gZm9yIHRoZSBmb2xsb3dpbmcgdGhyZWUgeWVhcnMuIEhvd2V2ZXIsIGl0IGlzIGNsZWFyIGZyb20gdGhlIHN1cnZleSByZXNwb25zZXMsIHRoYXQgd2Ugc2hvdWxkIGRpcmVjdCBvdXIgYXR0ZW50aW9uIHRvIHRocmVlIG1haW4gdGFza3M6CgoxLiAgaW1wbGVtZW50aW5nIGFuZCBob3N0aW5nIHN0YW5kYXJkcyBmb3IgZXBpZ3JhcGhpYyB2b2NhYnVsYXJpZXMgKGUuZy4gaW5zY3JpcHRpb24gdHlwZSwgbWF0ZXJpYWwsIG9iamVjdCBldGMuKQoyLiAgaW1wbGVtZW50aW5nIGFuZCBob3N0aW5nIHN0YW5kYXJkcyBmb3IgYmlibGlvZ3JhcGhpY2FsIHJlY29yZHMgKGUuZy4gc3RhYmxlIGFuZCB1bmlxdWUgcmVjb3JkcyBmb3IgYWxsIG1ham9yIGVwaWdyYXBoaWMgZWRpdGlvbnMpCjMuICBidWlsZGluZyBhIHBsYXRmb3JtIGZvciBGQUlSIGFuZCBPcGVuIEVwaWdyYXBoeSBvbiB0aGUgaW5mcmFzdHJ1Y3R1cmUgcHJvdmlkZWQgYnkgdGhlIFVuaXZlcnNpdHkgb2YgT3hmb3JkIChDU0FEKSwgdGhhdCB3aWxsIGZ1bmN0aW9uIGFzIGFuIGluZm9ybWF0aW9uIGh1YiwgcHJvdmlkaW5nIG5vdCBvbmx5IHRyYWluaW5nIGFuZCBnb29kIHByYWN0aWNlIGV4YW1wbGVzLCBidXQgYWxzbyBob3N0aW5nIHRoZSByZXNvdXJjZXMgYW5kIHRvb2xzLgoKV2UgaG9wZSB0byBydW4gYSBzaW1pbGFyIHN1cnZleSBhbm51YWxseSB0byB0cmFjayBhbnkgcHJvZ3Jlc3Mgd2l0aGluIHRoZSBkaXNjaXBsaW5lIGFuZCBjbG9zZWx5IG1vbml0b3IgY2hhbmdpbmcgbmVlZHMgb2YgaW5kaXZpZHVhbCBwcm9qZWN0cyBpbiBkaWdpdGFsIGVwaWdyYXBoeS4KCiMgQmlibGlvZ3JhcGh5Cgo6OjogeyNyZWZzfQo6OjoK